diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/battle/battle_2.c (renamed from src/battle_2.c) | 102 | ||||
-rw-r--r-- | src/battle/battle_3.c (renamed from src/battle_3.c) | 3432 | ||||
-rw-r--r-- | src/battle/battle_4.c (renamed from src/battle_4.c) | 1773 | ||||
-rw-r--r-- | src/battle/battle_7.c (renamed from src/battle_7.c) | 52 | ||||
-rw-r--r-- | src/battle/battle_ai.c (renamed from src/battle_ai.c) | 199 | ||||
-rw-r--r-- | src/battle/battle_anim.c (renamed from src/battle_anim.c) | 360 | ||||
-rw-r--r-- | src/battle/battle_anim_807B69C.c (renamed from src/battle_anim_807B69C.c) | 16 | ||||
-rw-r--r-- | src/battle/battle_anim_80A7E7C.c (renamed from src/battle_anim_80A7E7C.c) | 96 | ||||
-rw-r--r-- | src/battle/battle_anim_80CA710.c | 18 | ||||
-rw-r--r-- | src/battle/battle_controller_linkopponent.c (renamed from src/battle_controller_linkopponent.c) | 95 | ||||
-rw-r--r-- | src/battle/battle_controller_linkpartner.c (renamed from src/battle_controller_linkpartner.c) | 94 | ||||
-rw-r--r-- | src/battle/battle_controller_opponent.c (renamed from src/battle_controller_opponent.c) | 107 | ||||
-rw-r--r-- | src/battle/battle_controller_player.c (renamed from src/battle_controller_player.c) | 116 | ||||
-rw-r--r-- | src/battle/battle_controller_safari.c (renamed from src/battle_controller_safari.c) | 2 | ||||
-rw-r--r-- | src/battle/battle_controller_wally.c (renamed from src/battle_controller_wally.c) | 82 | ||||
-rw-r--r-- | src/battle/battle_interface.c (renamed from src/battle_interface.c) | 48 | ||||
-rw-r--r-- | src/battle/battle_message.c (renamed from src/battle_message.c) | 8 | ||||
-rw-r--r-- | src/battle/battle_party_menu.c (renamed from src/battle_party_menu.c) | 144 | ||||
-rw-r--r-- | src/battle/battle_records.c (renamed from src/battle_records.c) | 19 | ||||
-rw-r--r-- | src/battle/battle_setup.c (renamed from src/battle_setup.c) | 27 | ||||
-rw-r--r-- | src/battle/battle_transition.c (renamed from src/battle_transition.c) | 0 | ||||
-rw-r--r-- | src/battle/calculate_base_damage.c (renamed from src/calculate_base_damage.c) | 0 | ||||
-rw-r--r-- | src/battle/contest_link_80C857C.c (renamed from src/contest_link_80C857C.c) | 0 | ||||
-rw-r--r-- | src/battle/pokeball.c (renamed from src/pokeball.c) | 0 | ||||
-rw-r--r-- | src/battle/post_battle_event_funcs.c (renamed from src/post_battle_event_funcs.c) | 0 | ||||
-rw-r--r-- | src/battle/reshow_battle_screen.c (renamed from src/reshow_battle_screen.c) | 0 | ||||
-rw-r--r-- | src/battle/smokescreen.c (renamed from src/smokescreen.c) | 0 | ||||
-rw-r--r-- | src/bike.c | 1013 | ||||
-rw-r--r-- | src/data/battle_tower/level_100_mons.h | 3903 | ||||
-rw-r--r-- | src/data/battle_tower/level_50_mons.h | 3903 | ||||
-rw-r--r-- | src/data/battle_tower/trainers.h | 1503 | ||||
-rw-r--r-- | src/data/battle_tower/trainers_de.h | 1503 | ||||
-rw-r--r-- | src/data/field_map_obj/anim_func_ptrs.h | 1519 | ||||
-rw-r--r-- | src/data/field_map_obj/base_oam.h | 56 | ||||
-rw-r--r-- | src/data/field_map_obj/berry_tree_graphics_tables.h | 573 | ||||
-rw-r--r-- | src/data/field_map_obj/callback_subroutine_pointers.h | 442 | ||||
-rw-r--r-- | src/data/field_map_obj/field_effect_object_template_pointers.h | 84 | ||||
-rw-r--r-- | src/data/field_map_obj/field_effect_objects.h | 897 | ||||
-rw-r--r-- | src/data/field_map_obj/map_object_anims.h | 886 | ||||
-rw-r--r-- | src/data/field_map_obj/map_object_graphics_info.h | 227 | ||||
-rw-r--r-- | src/data/field_map_obj/map_object_graphics_info_pointers.h | 448 | ||||
-rw-r--r-- | src/data/field_map_obj/map_object_pic_tables.h | 1879 | ||||
-rw-r--r-- | src/data/field_map_obj/map_object_subsprites.h | 345 | ||||
-rw-r--r-- | src/data/pokemon/base_stats.h | 7823 | ||||
-rw-r--r-- | src/data/pokemon/cry_ids.h | 146 | ||||
-rw-r--r-- | src/data/pokemon/dex_order.h | 15 | ||||
-rw-r--r-- | src/data/pokemon/egg_moves.h | 1318 | ||||
-rw-r--r-- | src/data/pokemon/evolution.h | 608 | ||||
-rw-r--r-- | src/data/pokemon/experience_tables.h | 828 | ||||
-rw-r--r-- | src/data/pokemon/item_effects.h | 824 | ||||
-rw-r--r-- | src/data/pokemon/level_up_learnset_pointers.h | 423 | ||||
-rw-r--r-- | src/data/pokemon/level_up_learnsets.h | 5627 | ||||
-rw-r--r-- | src/data/pokemon/nature_stats.h | 37 | ||||
-rw-r--r-- | src/data/pokemon/spinda_spots.h | 15 | ||||
-rw-r--r-- | src/data/pokemon/tmhm_learnsets.h | 431 | ||||
-rw-r--r-- | src/data/pokemon/trainer_class_lookups.h | 168 | ||||
-rw-r--r-- | src/daycare.c | 350 | ||||
-rw-r--r-- | src/de_rom_8040FE0.c | 6 | ||||
-rw-r--r-- | src/debug/matsuda_debug_menu.c (renamed from src/matsuda_debug_menu.c) | 8 | ||||
-rw-r--r-- | src/debug/mori_debug_menu.c (renamed from src/mori_debug_menu.c) | 8 | ||||
-rw-r--r-- | src/debug/sound_check_menu.c | 1300 | ||||
-rw-r--r-- | src/debug/unknown_debug_menu.c (renamed from src/unknown_debug_menu.c) | 13 | ||||
-rw-r--r-- | src/engine/blend_palette.c (renamed from src/blend_palette.c) | 0 | ||||
-rw-r--r-- | src/engine/cable_club.c (renamed from src/cable_club.c) | 4 | ||||
-rw-r--r-- | src/engine/clear_save_data_menu.c (renamed from src/clear_save_data_menu.c) | 0 | ||||
-rw-r--r-- | src/engine/clock.c (renamed from src/clock.c) | 17 | ||||
-rw-r--r-- | src/engine/decompress.c (renamed from src/decompress.c) | 2 | ||||
-rw-r--r-- | src/engine/link.c (renamed from src/link.c) | 2 | ||||
-rw-r--r-- | src/engine/load_save.c (renamed from src/load_save.c) | 0 | ||||
-rw-r--r-- | src/engine/main.c (renamed from src/main.c) | 0 | ||||
-rw-r--r-- | src/engine/main_menu.c (renamed from src/main_menu.c) | 0 | ||||
-rw-r--r-- | src/engine/menu.c (renamed from src/menu.c) | 0 | ||||
-rw-r--r-- | src/engine/menu_cursor.c (renamed from src/menu_cursor.c) | 0 | ||||
-rw-r--r-- | src/engine/mystery_event_menu.c (renamed from src/mystery_event_menu.c) | 0 | ||||
-rw-r--r-- | src/engine/mystery_event_script.c (renamed from src/mystery_event_script.c) | 10 | ||||
-rw-r--r-- | src/engine/name_string_util.c (renamed from src/name_string_util.c) | 0 | ||||
-rw-r--r-- | src/engine/naming_screen.c (renamed from src/naming_screen.c) | 2 | ||||
-rw-r--r-- | src/engine/option_menu.c (renamed from src/option_menu.c) | 0 | ||||
-rw-r--r-- | src/engine/palette.c (renamed from src/palette.c) | 2 | ||||
-rw-r--r-- | src/engine/play_time.c (renamed from src/play_time.c) | 0 | ||||
-rw-r--r-- | src/engine/record_mixing.c (renamed from src/record_mixing.c) | 46 | ||||
-rw-r--r-- | src/engine/reset_rtc_screen.c (renamed from src/reset_rtc_screen.c) | 0 | ||||
-rw-r--r-- | src/engine/rng.c (renamed from src/rng.c) | 0 | ||||
-rw-r--r-- | src/engine/rtc.c (renamed from src/rtc.c) | 0 | ||||
-rw-r--r-- | src/engine/save.c (renamed from src/save.c) | 6 | ||||
-rw-r--r-- | src/engine/save_failed_screen.c (renamed from src/save_failed_screen.c) | 4 | ||||
-rw-r--r-- | src/engine/save_menu_util.c (renamed from src/save_menu_util.c) | 0 | ||||
-rw-r--r-- | src/engine/script.c (renamed from src/script.c) | 68 | ||||
-rw-r--r-- | src/engine/sound.c (renamed from src/sound.c) | 2 | ||||
-rw-r--r-- | src/engine/sprite.c (renamed from src/sprite.c) | 18 | ||||
-rw-r--r-- | src/engine/string_util.c (renamed from src/string_util.c) | 34 | ||||
-rw-r--r-- | src/engine/task.c (renamed from src/task.c) | 0 | ||||
-rw-r--r-- | src/engine/text.c (renamed from src/text.c) | 250 | ||||
-rw-r--r-- | src/engine/text_window.c (renamed from src/text_window.c) | 0 | ||||
-rw-r--r-- | src/engine/tileset_anim.c (renamed from src/tileset_anim.c) | 46 | ||||
-rw-r--r-- | src/engine/time_events.c (renamed from src/time_events.c) | 0 | ||||
-rw-r--r-- | src/engine/trade.c | 5715 | ||||
-rw-r--r-- | src/engine/trainer_card.c (renamed from src/trainer_card.c) | 56 | ||||
-rw-r--r-- | src/engine/trig.c (renamed from src/trig.c) | 0 | ||||
-rw-r--r-- | src/engine/util.c (renamed from src/util.c) | 0 | ||||
-rw-r--r-- | src/field/bard_music.c (renamed from src/bard_music.c) | 0 | ||||
-rw-r--r-- | src/field/battle_tower.c | 2375 | ||||
-rw-r--r-- | src/field/berry.c (renamed from src/berry.c) | 529 | ||||
-rw-r--r-- | src/field/berry_tag_screen.c (renamed from src/berry_tag_screen.c) | 0 | ||||
-rw-r--r-- | src/field/bike.c | 1051 | ||||
-rw-r--r-- | src/field/birch_pc.c (renamed from src/birch_pc.c) | 8 | ||||
-rw-r--r-- | src/field/braille_puzzles.c (renamed from src/braille_puzzles.c) | 0 | ||||
-rw-r--r-- | src/field/choose_party.c (renamed from src/choose_party.c) | 240 | ||||
-rw-r--r-- | src/field/coins.c (renamed from src/coins.c) | 26 | ||||
-rw-r--r-- | src/field/coord_event_weather.c (renamed from src/coord_event_weather.c) | 0 | ||||
-rw-r--r-- | src/field/daycare.c | 1691 | ||||
-rw-r--r-- | src/field/decoration.c (renamed from src/decoration.c) | 8 | ||||
-rw-r--r-- | src/field/decoration_inventory.c (renamed from src/decoration_inventory.c) | 4 | ||||
-rw-r--r-- | src/field/dewford_trend.c (renamed from src/dewford_trend.c) | 0 | ||||
-rw-r--r-- | src/field/diploma.c (renamed from src/diploma.c) | 0 | ||||
-rw-r--r-- | src/field/easy_chat.c (renamed from src/easy_chat.c) | 16 | ||||
-rw-r--r-- | src/field/event_data.c (renamed from src/event_data.c) | 4 | ||||
-rw-r--r-- | src/field/field_camera.c (renamed from src/field_camera.c) | 7 | ||||
-rw-r--r-- | src/field/field_control_avatar.c (renamed from src/field_control_avatar.c) | 6 | ||||
-rw-r--r-- | src/field/field_door.c (renamed from src/field_door.c) | 0 | ||||
-rw-r--r-- | src/field/field_effect.c (renamed from src/field_effect.c) | 53 | ||||
-rw-r--r-- | src/field/field_effect_helpers.c | 1632 | ||||
-rw-r--r-- | src/field/field_fadetransition.c (renamed from src/field_fadetransition.c) | 14 | ||||
-rw-r--r-- | src/field/field_ground_effect.c (renamed from src/field_ground_effect.c) | 51 | ||||
-rw-r--r-- | src/field/field_map_obj.c (renamed from src/field_map_obj.c) | 529 | ||||
-rw-r--r-- | src/field/field_map_obj_helpers.c (renamed from src/field_map_obj_helpers.c) | 4 | ||||
-rw-r--r-- | src/field/field_message_box.c (renamed from src/field_message_box.c) | 0 | ||||
-rw-r--r-- | src/field/field_player_avatar.c (renamed from src/field_player_avatar.c) | 212 | ||||
-rw-r--r-- | src/field/field_poison.c (renamed from src/field_poison.c) | 2 | ||||
-rw-r--r-- | src/field/field_region_map.c (renamed from src/field_region_map.c) | 0 | ||||
-rw-r--r-- | src/field/field_screen_effect.c (renamed from src/field_screen_effect.c) | 2 | ||||
-rw-r--r-- | src/field/field_special_scene.c (renamed from src/field_special_scene.c) | 85 | ||||
-rw-r--r-- | src/field/field_specials.c (renamed from src/field_specials.c) | 42 | ||||
-rw-r--r-- | src/field/field_tasks.c (renamed from src/field_tasks.c) | 8 | ||||
-rw-r--r-- | src/field/field_weather.c (renamed from src/field_weather.c) | 4 | ||||
-rw-r--r-- | src/field/fieldmap.c (renamed from src/fieldmap.c) | 12 | ||||
-rw-r--r-- | src/field/fldeff_cut.c (renamed from src/fldeff_cut.c) | 0 | ||||
-rw-r--r-- | src/field/fldeff_flash.c (renamed from src/fldeff_flash.c) | 0 | ||||
-rw-r--r-- | src/field/fldeff_softboiled.c (renamed from src/fldeff_softboiled.c) | 8 | ||||
-rw-r--r-- | src/field/fldeff_strength.c (renamed from src/fldeff_strength.c) | 0 | ||||
-rw-r--r-- | src/field/fldeff_sweetscent.c (renamed from src/fldeff_sweetscent.c) | 0 | ||||
-rw-r--r-- | src/field/fldeff_teleport.c (renamed from src/fldeff_teleport.c) | 0 | ||||
-rw-r--r-- | src/field/heal_location.c (renamed from src/heal_location.c) | 0 | ||||
-rw-r--r-- | src/field/hof_pc.c (renamed from src/hof_pc.c) | 2 | ||||
-rw-r--r-- | src/field/item.c (renamed from src/item.c) | 8 | ||||
-rw-r--r-- | src/field/item_menu.c (renamed from src/item_menu.c) | 6 | ||||
-rw-r--r-- | src/field/item_use.c (renamed from src/item_use.c) | 36 | ||||
-rw-r--r-- | src/field/landmark.c (renamed from src/landmark.c) | 0 | ||||
-rw-r--r-- | src/field/lottery_corner.c (renamed from src/lottery_corner.c) | 0 | ||||
-rw-r--r-- | src/field/map_name_popup.c (renamed from src/map_name_popup.c) | 0 | ||||
-rw-r--r-- | src/field/map_obj_lock.c (renamed from src/map_obj_lock.c) | 2 | ||||
-rw-r--r-- | src/field/mauville_man.c (renamed from src/mauville_man.c) | 0 | ||||
-rw-r--r-- | src/field/menu_helpers.c (renamed from src/menu_helpers.c) | 0 | ||||
-rw-r--r-- | src/field/metatile_behavior.c (renamed from src/metatile_behavior.c) | 0 | ||||
-rw-r--r-- | src/field/money.c (renamed from src/money.c) | 0 | ||||
-rw-r--r-- | src/field/overworld.c (renamed from src/overworld.c) | 178 | ||||
-rw-r--r-- | src/field/party_menu.c | 5651 | ||||
-rw-r--r-- | src/field/player_pc.c (renamed from src/player_pc.c) | 8 | ||||
-rw-r--r-- | src/field/pokeblock.c (renamed from src/pokeblock.c) | 6 | ||||
-rw-r--r-- | src/field/pokenav.c (renamed from src/pokenav.c) | 2 | ||||
-rw-r--r-- | src/field/region_map.c (renamed from src/region_map.c) | 6 | ||||
-rw-r--r-- | src/field/roamer.c (renamed from src/roamer.c) | 14 | ||||
-rw-r--r-- | src/field/rotating_gate.c (renamed from src/rotating_gate.c) | 0 | ||||
-rw-r--r-- | src/field/safari_zone.c (renamed from src/safari_zone.c) | 0 | ||||
-rw-r--r-- | src/field/scrcmd.c (renamed from src/scrcmd.c) | 650 | ||||
-rw-r--r-- | src/field/script_menu.c (renamed from src/script_menu.c) | 0 | ||||
-rw-r--r-- | src/field/script_movement.c (renamed from src/script_movement.c) | 20 | ||||
-rw-r--r-- | src/field/secret_base.c | 1711 | ||||
-rw-r--r-- | src/field/shop.c (renamed from src/shop.c) | 2 | ||||
-rw-r--r-- | src/field/slot_machine.c (renamed from src/slot_machine.c) | 12 | ||||
-rw-r--r-- | src/field/start_menu.c (renamed from src/start_menu.c) | 0 | ||||
-rw-r--r-- | src/field/starter_choose.c (renamed from src/starter_choose.c) | 0 | ||||
-rw-r--r-- | src/field/trader.c (renamed from src/trader.c) | 0 | ||||
-rw-r--r-- | src/field/trainer_see.c (renamed from src/trainer_see.c) | 2 | ||||
-rw-r--r-- | src/field/tv.c (renamed from src/tv.c) | 17 | ||||
-rw-r--r-- | src/field/use_pokeblock.c (renamed from src/use_pokeblock.c) | 8 | ||||
-rw-r--r-- | src/field/wallclock.c (renamed from src/wallclock.c) | 0 | ||||
-rw-r--r-- | src/field/wild_encounter.c (renamed from src/wild_encounter.c) | 0 | ||||
-rw-r--r-- | src/libs/agb_flash.c (renamed from src/agb_flash.c) | 12 | ||||
-rw-r--r-- | src/libs/agb_flash_1m.c (renamed from src/agb_flash_1m.c) | 0 | ||||
-rw-r--r-- | src/libs/agb_flash_le.c (renamed from src/agb_flash_le.c) | 0 | ||||
-rw-r--r-- | src/libs/agb_flash_mx.c (renamed from src/agb_flash_mx.c) | 2 | ||||
-rw-r--r-- | src/libs/libc.c (renamed from src/libc.c) | 0 | ||||
-rw-r--r-- | src/libs/m4a_2.c (renamed from src/m4a_2.c) | 0 | ||||
-rw-r--r-- | src/libs/m4a_4.c (renamed from src/m4a_4.c) | 0 | ||||
-rw-r--r-- | src/libs/m4a_tables.c (renamed from src/m4a_tables.c) | 0 | ||||
-rw-r--r-- | src/libs/siirtc.c (renamed from src/siirtc.c) | 0 | ||||
-rw-r--r-- | src/party_menu.c | 1494 | ||||
-rw-r--r-- | src/pokemon/learn_move.c (renamed from src/learn_move.c) | 0 | ||||
-rw-r--r-- | src/pokemon/mail.c (renamed from src/mail.c) | 0 | ||||
-rw-r--r-- | src/pokemon/mail_data.c (renamed from src/mail_data.c) | 0 | ||||
-rw-r--r-- | src/pokemon/mon_markings.c (renamed from src/mon_markings.c) | 0 | ||||
-rw-r--r-- | src/pokemon/pokeblock_feed.c (renamed from src/pokeblock_feed.c) | 6 | ||||
-rw-r--r-- | src/pokemon/pokedex.c (renamed from src/pokedex.c) | 106 | ||||
-rw-r--r-- | src/pokemon/pokedex_cry_screen.c (renamed from src/pokedex_cry_screen.c) | 2 | ||||
-rw-r--r-- | src/pokemon/pokemon_1.c (renamed from src/pokemon_1.c) | 116 | ||||
-rw-r--r-- | src/pokemon/pokemon_2.c (renamed from src/pokemon_2.c) | 17 | ||||
-rw-r--r-- | src/pokemon/pokemon_3.c (renamed from src/pokemon_3.c) | 48 | ||||
-rw-r--r-- | src/pokemon/pokemon_data.c (renamed from src/pokemon_data.c) | 26 | ||||
-rw-r--r-- | src/pokemon/pokemon_icon.c (renamed from src/pokemon_icon.c) | 7 | ||||
-rw-r--r-- | src/pokemon/pokemon_menu.c (renamed from src/pokemon_menu.c) | 159 | ||||
-rw-r--r-- | src/pokemon/pokemon_size_record.c (renamed from src/pokemon_size_record.c) | 2 | ||||
-rw-r--r-- | src/pokemon/pokemon_storage_system.c (renamed from src/pokemon_storage_system.c) | 0 | ||||
-rw-r--r-- | src/pokemon/pokemon_summary_screen.c (renamed from src/pokemon_summary_screen.c) | 0 | ||||
-rw-r--r-- | src/rom3.c | 14 | ||||
-rw-r--r-- | src/rom6.c | 6 | ||||
-rw-r--r-- | src/rom_8077ABC.c | 258 | ||||
-rw-r--r-- | src/scene/berry_blender.c (renamed from src/berry_blender.c) | 6 | ||||
-rw-r--r-- | src/scene/contest_painting.c (renamed from src/contest_painting.c) | 4 | ||||
-rw-r--r-- | src/scene/credits.c (renamed from src/credits.c) | 4 | ||||
-rw-r--r-- | src/scene/cute_sketch.c (renamed from src/cute_sketch.c) | 0 | ||||
-rw-r--r-- | src/scene/egg_hatch.c (renamed from src/egg_hatch.c) | 18 | ||||
-rw-r--r-- | src/scene/evolution_graphics.c (renamed from src/evolution_graphics.c) | 0 | ||||
-rw-r--r-- | src/scene/evolution_scene.c (renamed from src/evolution_scene.c) | 100 | ||||
-rw-r--r-- | src/scene/hall_of_fame.c (renamed from src/hall_of_fame.c) | 2 | ||||
-rw-r--r-- | src/scene/intro.c (renamed from src/intro.c) | 6 | ||||
-rwxr-xr-x | src/scene/intro_credits_graphics.c (renamed from src/intro_credits_graphics.c) | 0 | ||||
-rw-r--r-- | src/scene/new_game.c (renamed from src/new_game.c) | 8 | ||||
-rw-r--r-- | src/scene/title_screen.c (renamed from src/title_screen.c) | 0 | ||||
-rw-r--r-- | src/script_pokemon_util_80C4BF0.c | 6 | ||||
-rw-r--r-- | src/script_pokemon_util_80F99CC.c | 119 | ||||
-rw-r--r-- | src/secret_base.c | 1075 | ||||
-rw-r--r-- | src/sound_check_menu.c | 2199 | ||||
-rw-r--r-- | src/trade.c | 88 | ||||
-rw-r--r-- | src/unused_8124F94.c | 6 |
225 files changed, 61283 insertions, 13800 deletions
diff --git a/src/battle_2.c b/src/battle/battle_2.c index 3cdea07be..1aec075db 100644 --- a/src/battle_2.c +++ b/src/battle/battle_2.c @@ -53,20 +53,6 @@ struct UnknownStruct8 u8 unk1A; }; -struct UnknownPokemonStruct2 -{ - /*0x00*/ u16 species; - /*0x02*/ u16 heldItem; - /*0x04*/ u8 nickname[11]; - /*0x0F*/ u8 level; - /*0x10*/ u16 hp; - /*0x12*/ u16 maxhp; - /*0x14*/ u32 status; - /*0x18*/ u32 personality; - /*0x1C*/ u8 gender; - /*0x1D*/ u8 language; -}; - struct UnknownStruct12 { u32 unk0; @@ -612,7 +598,7 @@ void sub_800F104(void) *pSavedCallback = gMain.savedCallback; *pSavedBattleTypeFlags = gBattleTypeFlags; gMain.savedCallback = sub_800F104; - OpenPartyMenu(5, 0); + OpenPartyMenu(PARTY_MENU_TYPE_LINK_MULTI_BATTLE, 0); } break; case 2: @@ -1013,7 +999,7 @@ u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum) for (j = 0; j < 4; j++) { - SetMonData(&party[i], MON_DATA_MOVE1 + j, (u8 *)&partyData[i].moves[j]); + SetMonData(&party[i], MON_DATA_MOVE1 + j, &partyData[i].moves[j]); SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp); } break; @@ -1028,7 +1014,7 @@ u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum) fixedIV = partyData[i].iv * 31 / 255; CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0); - SetMonData(&party[i], MON_DATA_HELD_ITEM, (u8 *)&partyData[i].heldItem); + SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem); break; } case 3: @@ -1041,10 +1027,10 @@ u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum) fixedIV = partyData[i].iv * 31 / 255; CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0); - SetMonData(&party[i], MON_DATA_HELD_ITEM, (u8 *)&partyData[i].heldItem); + SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem); for (j = 0; j < 4; j++) { - SetMonData(&party[i], MON_DATA_MOVE1 + j, (u8 *)&partyData[i].moves[j]); + SetMonData(&party[i], MON_DATA_MOVE1 + j, &partyData[i].moves[j]); SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp); } break; @@ -1389,6 +1375,7 @@ void sub_8010384(struct Sprite *sprite) void sub_8010494(struct Sprite *sprite) { s32 i; + u8 *dst; sprite->data4--; if (sprite->data4 == 0) @@ -1403,8 +1390,8 @@ void sub_8010494(struct Sprite *sprite) } else { - u8 *dst = (u8 *)gUnknown_081FAF4C[GetBankIdentity(sprite->data0)] + (gBattleMonForms[sprite->data0] << 11) + (sprite->data3 << 8); - + // this should use a MEMSET_ALT, but *(dst++) wont match with it. + dst = (u8 *)gUnknown_081FAF4C[GetBankIdentity(sprite->data0)] + (gBattleMonForms[sprite->data0] << 11) + (sprite->data3 << 8); for (i = 0; i < 0x100; i++) *(dst++) = 0; StartSpriteAnim(sprite, gBattleMonForms[sprite->data0]); @@ -1581,10 +1568,7 @@ void sub_8010874(void) { gStatuses3[i] = 0; - r4 = (u8 *)&gDisableStructs[i]; - for (j = 0; j < (u32)0x1C; j++) - r4[j] = 0; - + MEMSET_ALT(&gDisableStructs[i], 0, 0x1C, j, r4); gDisableStructs[i].isFirstTurn= 2; gUnknown_02024C70[i] = 0; gLastUsedMove[i] = 0; @@ -1600,19 +1584,14 @@ void sub_8010874(void) for (i = 0; i < 2; i++) { gSideAffecting[i] = 0; - - r4 = (u8 *)&gSideTimer[i]; - for (j = 0; j < 12; j++) - r4[j] = 0; + MEMSET_ALT(&gSideTimer[i], 0, 12, j, r4); } gBankAttacker = 0; gBankTarget = 0; gBattleWeather = 0; - r4 = (u8 *)&gWishFutureKnock; - for (i = 0; i < (u32)0x2C; i++) - r4[i] = 0; + MEMSET_ALT(&gWishFutureKnock, 0, 0x2C, i, r4); gHitMarker = 0; if ((gBattleTypeFlags & BATTLE_TYPE_LINK) == 0 && gSaveBlock2.optionsBattleSceneOff == TRUE) @@ -1735,9 +1714,7 @@ void SwitchInClearStructs(void) gActionSelectionCursor[gActiveBank] = 0; gMoveSelectionCursor[gActiveBank] = 0; - ptr = (u8 *)&gDisableStructs[gActiveBank]; - for (i = 0; i < (u32)0x1C; i++) - ptr[i] = 0; + MEMSET_ALT(&gDisableStructs[gActiveBank], 0, 0x1C, i, ptr); if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS) { @@ -1792,9 +1769,7 @@ void UndoEffectsAfterFainting(void) gActionSelectionCursor[gActiveBank] = 0; gMoveSelectionCursor[gActiveBank] = 0; - ptr = (u8 *)&gDisableStructs[gActiveBank]; - for (i = 0; i < (u32)0x1C; i++) - ptr[i] = 0; + MEMSET_ALT(&gDisableStructs[gActiveBank], 0, 0x1C, i, ptr); gProtectStructs[gActiveBank].protected = 0; gProtectStructs[gActiveBank].endured = 0; gProtectStructs[gActiveBank].onlyStruggle = 0; @@ -1887,18 +1862,13 @@ void sub_8011384(void) if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI) && GetBankSide(gActiveBank) == 0) { - ptr = (u8 *)&gBattleMons[gActiveBank]; - for (i = 0; i < (u32)0x58; i++) - ptr[i] = 0; + MEMSET_ALT(&gBattleMons[gActiveBank], 0, 0x58, i, ptr); } else { u8 r0; - ptr = (u8 *)&gBattleMons[gActiveBank]; - for (i = 0; i < (u32)0x58; i++) - ptr[i] = gBattleBufferB[gActiveBank][4 + i]; - + MEMSET_ALT(&gBattleMons[gActiveBank], gBattleBufferB[gActiveBank][4 + i], 0x58, i, ptr); gBattleMons[gActiveBank].type1 = gBaseStats[gBattleMons[gActiveBank].species].type1; gBattleMons[gActiveBank].type2 = gBaseStats[gBattleMons[gActiveBank].species].type2; gBattleMons[gActiveBank].ability = GetAbilityBySpecies(gBattleMons[gActiveBank].species, gBattleMons[gActiveBank].altAbility); @@ -1924,14 +1894,14 @@ void sub_8011384(void) } if (GetBankSide(gActiveBank) == 1 && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) - GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), 2); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), 2); } else { if (GetBankSide(gActiveBank) == 1 && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) { - GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), 2); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), 2); EmitLoadPokeSprite(0); MarkBufferBankForExecution(gActiveBank); } @@ -1957,11 +1927,7 @@ void bc_801333C(void) if (gBattleExecBuffer == 0) { - struct - { - u16 hp; - u32 status; - } sp0[6]; + struct HpAndStatus hpStatus[6]; if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { @@ -1970,17 +1936,17 @@ void bc_801333C(void) if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == 0 || GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) { - sp0[i].hp = 0xFFFF; - sp0[i].status = 0; + hpStatus[i].hp = 0xFFFF; + hpStatus[i].status = 0; } else { - sp0[i].hp = GetMonData(&gEnemyParty[i], MON_DATA_HP); - sp0[i].status = GetMonData(&gEnemyParty[i], MON_DATA_STATUS); + hpStatus[i].hp = GetMonData(&gEnemyParty[i], MON_DATA_HP); + hpStatus[i].status = GetMonData(&gEnemyParty[i], MON_DATA_STATUS); } } gActiveBank = GetBankByPlayerAI(1); - Emitcmd48(0, (u8 *)sp0, 0x80); + EmitDrawPartyStatusSummary(0, hpStatus, 0x80); MarkBufferBankForExecution(gActiveBank); for (i = 0; i < 6; i++) @@ -1988,17 +1954,17 @@ void bc_801333C(void) if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == 0 || GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) { - sp0[i].hp = 0xFFFF; - sp0[i].status = 0; + hpStatus[i].hp = 0xFFFF; + hpStatus[i].status = 0; } else { - sp0[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); - sp0[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); + hpStatus[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); + hpStatus[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); } } gActiveBank = GetBankByPlayerAI(0); - Emitcmd48(0, (u8 *)sp0, 0x80); + EmitDrawPartyStatusSummary(0, hpStatus, 0x80); MarkBufferBankForExecution(gActiveBank); gBattleMainFunc = bc_battle_begin_message; @@ -2013,13 +1979,13 @@ void bc_801333C(void) if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == 0 || GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) { - sp0[i].hp = 0xFFFF; - sp0[i].status = 0; + hpStatus[i].hp = 0xFFFF; + hpStatus[i].status = 0; } else { - sp0[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); - sp0[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); + hpStatus[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); + hpStatus[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); } } @@ -2086,7 +2052,7 @@ void bc_801362C(void) { if (GetBankSide(gActiveBank) == 1 && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) - GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), 2); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), 2); } gBattleMainFunc = sub_8011970; } @@ -2168,7 +2134,7 @@ void BattleBeginFirstTurn(void) { for (j = i + 1; j < gNoOfAllBanks; j++) { - if (b_first_side(gTurnOrder[i], gTurnOrder[j], 1) != 0) + if (GetWhoStrikesFirst(gTurnOrder[i], gTurnOrder[j], 1) != 0) sub_8012FBC(i, j); } } diff --git a/src/battle_3.c b/src/battle/battle_3.c index f04e722c4..346ca6d79 100644 --- a/src/battle_3.c +++ b/src/battle/battle_3.c @@ -378,7 +378,7 @@ u8 UpdateTurnCounters(void) s32 j; for (j = i + 1; j < gNoOfAllBanks; j++) { - if (b_first_side(gTurnOrder[i], gTurnOrder[j], 0)) + if (GetWhoStrikesFirst(gTurnOrder[i], gTurnOrder[j], 0)) sub_8012FBC(i, j); } } @@ -1434,8 +1434,6 @@ u8 CastformDataTypeChange(u8 bank) return formChange; } -#ifdef NONMATCHING - struct Struct2017100 { u32 arr[4]; @@ -1475,13 +1473,11 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) // why isn't that check done at the beginning? { - //_08018436 - int i; // r4 + u8 moveType; + s32 i; u16 move; - // Hmm... - #define moveType moveArg - //u16 moveType; u8 side; + u8 target1; if (special) gLastUsedAbility = special; @@ -1607,17 +1603,14 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) case ABILITY_AIR_LOCK: //_080187DC { - u8 i; - - for (i = 0; i < gNoOfAllBanks; i++) + // that's a weird choice for a variable, why not use i or bank? + for (target1 = 0; target1 < gNoOfAllBanks; target1++) { - // TODO: i should be in r6 here - //asm("":::"r4","r5"); - effect = CastformDataTypeChange(i); + effect = CastformDataTypeChange(target1); if (effect != 0) { b_push_move_exec(BattleScript_CastformChange); - BATTLE_STRUCT->scriptingActive = i; + BATTLE_STRUCT->scriptingActive = target1; BATTLE_STRUCT->castformToChangeInto = effect - 1; break; } @@ -1637,7 +1630,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) if (WEATHER_HAS_EFFECT && (gBattleWeather & WEATHER_RAIN_ANY) && gBattleMons[bank].maxHP > gBattleMons[bank].hp) { - gLastUsedAbility = ABILITY_RAIN_DISH; //why + gLastUsedAbility = ABILITY_RAIN_DISH; // why b_push_move_exec(BattleScript_RainDishActivates); gBattleMoveDamage = gBattleMons[bank].maxHP / 16; if (gBattleMoveDamage == 0) @@ -1660,7 +1653,8 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) if (gBattleMons[bank].status1 & STATUS_FREEZE) StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); gBattleMons[bank].status1 = 0; - //gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE); fixed in Emerald + // BUG: The nightmare status does not get cleared here. This was fixed in Emerald. + //gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE); BATTLE_STRUCT->scriptingActive = gActiveBank = bank; b_push_move_exec(BattleScript_ShedSkinActivates); EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[bank].status1); @@ -1759,9 +1753,9 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) if (gBattleMons[bank].maxHP == gBattleMons[bank].hp) { if ((gProtectStructs[gBankAttacker].notFirstStrike)) - gBattlescriptCurrInstr = BattleScript_MoveHPDrain; + gBattlescriptCurrInstr = BattleScript_MoveHPDrain_FullHP; else - gBattlescriptCurrInstr = BattleScript_MoveHPDrain_PPLoss; + gBattlescriptCurrInstr = BattleScript_MoveHPDrain_FullHP_PPLoss; } else { @@ -1910,27 +1904,26 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) case ABILITYEFFECT_IMMUNITY: // 5 //_08019448 { - #define i bank - for (i = 0; i < gNoOfAllBanks; i++) + for (bank = 0; bank < gNoOfAllBanks; bank++) { - switch (gBattleMons[i].ability) + switch (gBattleMons[bank].ability) { case ABILITY_IMMUNITY: - if (gBattleMons[i].status1 & (STATUS_POISON | STATUS_TOXIC_POISON | 0xF00)) // TODO: what is 0xF00? + if (gBattleMons[bank].status1 & (STATUS_POISON | STATUS_TOXIC_POISON | 0xF00)) // TODO: what is 0xF00? { StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); effect = 1; } break; case ABILITY_OWN_TEMPO: - if (gBattleMons[i].status2 & STATUS2_CONFUSION) + if (gBattleMons[bank].status2 & STATUS2_CONFUSION) { StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); effect = 2; } break; case ABILITY_LIMBER: - if (gBattleMons[i].status1 & STATUS_PARALYSIS) + if (gBattleMons[bank].status1 & STATUS_PARALYSIS) { StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); effect = 1; @@ -1938,29 +1931,29 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) break; case ABILITY_INSOMNIA: case ABILITY_VITAL_SPIRIT: - if (gBattleMons[i].status1 & STATUS_SLEEP) + if (gBattleMons[bank].status1 & STATUS_SLEEP) { - gBattleMons[i].status2 &= ~(STATUS2_NIGHTMARE); + gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE); StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); effect = 1; } break; case ABILITY_WATER_VEIL: - if (gBattleMons[i].status1 & STATUS_BURN) + if (gBattleMons[bank].status1 & STATUS_BURN) { StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); effect = 1; } break; case ABILITY_MAGMA_ARMOR: - if (gBattleMons[i].status1 & STATUS_FREEZE) + if (gBattleMons[bank].status1 & STATUS_FREEZE) { StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); effect = 1; } break; case ABILITY_OBLIVIOUS: - if (gBattleMons[i].status2 & STATUS2_INFATUATION) + if (gBattleMons[bank].status2 & STATUS2_INFATUATION) { StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); effect = 3; @@ -1972,46 +1965,43 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) switch (effect) { case 1: // status cleared - gBattleMons[i].status1 = 0; + gBattleMons[bank].status1 = 0; break; case 2: // get rid of confusion - gBattleMons[i].status2 &= ~(STATUS2_CONFUSION); + gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION); break; case 3: // get rid of infatuation - gBattleMons[i].status2 &= ~(STATUS2_INFATUATION); + gBattleMons[bank].status2 &= ~(STATUS2_INFATUATION); break; } b_movescr_stack_push_cursor(); gBattlescriptCurrInstr = gUnknown_081D9956; - BATTLE_STRUCT->scriptingActive = i; - gActiveBank = i; + BATTLE_STRUCT->scriptingActive = bank; + gActiveBank = bank; EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1); MarkBufferBankForExecution(gActiveBank); return effect; } } - #undef i } break; case ABILITYEFFECT_FORECAST: // 6 //_080197B4 { - #define i bank - for (i = 0; i < gNoOfAllBanks; i++) + for (bank = 0; bank < gNoOfAllBanks; bank++) { - if (gBattleMons[i].ability == ABILITY_FORECAST) + if (gBattleMons[bank].ability == ABILITY_FORECAST) { - effect = CastformDataTypeChange(i); + effect = CastformDataTypeChange(bank); if (effect) { b_push_move_exec(BattleScript_CastformChange); - BATTLE_STRUCT->scriptingActive = i; + BATTLE_STRUCT->scriptingActive = bank; BATTLE_STRUCT->castformToChangeInto = effect - 1; return effect; } } } - #undef i } break; case ABILITYEFFECT_SYNCHRONIZE: // 7 @@ -2067,16 +2057,17 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) { if (gBattleMons[i].ability == ABILITY_TRACE && (gStatuses3[i] & STATUS3_TRACE)) { - u8 opposite = (GetBankIdentity(i) ^ 1) & 1; - u8 target1 = GetBankByPlayerAI(opposite); - u8 target2 = GetBankByPlayerAI(opposite + 2); + u8 target2; + side = (GetBankIdentity(i) ^ 1) & 1; + target1 = GetBankByPlayerAI(side); + target2 = GetBankByPlayerAI(side + 2); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { if (gBattleMons[target1].ability != 0 && gBattleMons[target1].hp != 0 && gBattleMons[target2].ability != 0 && gBattleMons[target2].hp != 0) { //_080199AE - gActiveBank = GetBankByPlayerAI(((Random() & 1) * 2) | opposite); + gActiveBank = GetBankByPlayerAI(((Random() & 1) * 2) | side); gBattleMons[i].ability = gBattleMons[gActiveBank].ability; gLastUsedAbility = gBattleMons[gActiveBank].ability; effect++; @@ -2266,3355 +2257,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) return effect; } -#else -__attribute__((naked)) -u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x28\n\ - ldr r4, [sp, 0x48]\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - str r0, [sp, 0x4]\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - mov r10, r1\n\ - lsls r2, 24\n\ - lsrs r6, r2, 24\n\ - lsls r3, 24\n\ - lsrs r3, 24\n\ - mov r8, r3\n\ - lsls r4, 16\n\ - lsrs r4, 16\n\ - movs r0, 0\n\ - mov r9, r0\n\ - ldr r5, _08018380 @ =gBankAttacker\n\ - ldr r1, _08018384 @ =gNoOfAllBanks\n\ - ldrb r0, [r5]\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bcc _08018360\n\ - mov r1, r10\n\ - strb r1, [r5]\n\ -_08018360:\n\ - ldrb r0, [r5]\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _08018390\n\ - ldr r1, _08018388 @ =gBattlePartyID\n\ - ldrb r0, [r5]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - ldrh r1, [r0]\n\ - movs r0, 0x64\n\ - muls r1, r0\n\ - ldr r0, _0801838C @ =gPlayerParty\n\ - b _080183A0\n\ - .align 2, 0\n\ -_08018380: .4byte gBankAttacker\n\ -_08018384: .4byte gNoOfAllBanks\n\ -_08018388: .4byte gBattlePartyID\n\ -_0801838C: .4byte gPlayerParty\n\ -_08018390:\n\ - ldr r1, _080183D0 @ =gBattlePartyID\n\ - ldrb r0, [r5]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - ldrh r1, [r0]\n\ - movs r0, 0x64\n\ - muls r1, r0\n\ - ldr r0, _080183D4 @ =gEnemyParty\n\ -_080183A0:\n\ - adds r7, r1, r0\n\ - ldr r5, _080183D8 @ =gBankTarget\n\ - ldr r1, _080183DC @ =gNoOfAllBanks\n\ - ldrb r0, [r5]\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - bcc _080183B2\n\ - mov r2, r10\n\ - strb r2, [r5]\n\ -_080183B2:\n\ - ldrb r0, [r5]\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _080183E4\n\ - ldr r1, _080183D0 @ =gBattlePartyID\n\ - ldrb r0, [r5]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - ldrh r1, [r0]\n\ - movs r0, 0x64\n\ - muls r1, r0\n\ - ldr r0, _080183E0 @ =gPlayerParty\n\ - b _080183F4\n\ - .align 2, 0\n\ -_080183D0: .4byte gBattlePartyID\n\ -_080183D4: .4byte gEnemyParty\n\ -_080183D8: .4byte gBankTarget\n\ -_080183DC: .4byte gNoOfAllBanks\n\ -_080183E0: .4byte gPlayerParty\n\ -_080183E4:\n\ - ldr r1, _08018444 @ =gBattlePartyID\n\ - ldrb r0, [r5]\n\ - lsls r0, 1\n\ - adds r0, r1\n\ - ldrh r1, [r0]\n\ - movs r0, 0x64\n\ - muls r1, r0\n\ - ldr r0, _08018448 @ =gEnemyParty\n\ -_080183F4:\n\ - adds r5, r1, r0\n\ - adds r0, r7, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - str r0, [sp, 0x8]\n\ - adds r0, r7, 0\n\ - movs r1, 0\n\ - bl GetMonData\n\ - str r0, [sp, 0x10]\n\ - adds r0, r5, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - str r0, [sp, 0xC]\n\ - adds r0, r5, 0\n\ - movs r1, 0\n\ - bl GetMonData\n\ - str r0, [sp, 0x14]\n\ - ldr r0, _0801844C @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - movs r0, 0x80\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08018436\n\ - bl _08019F92\n\ -_08018436:\n\ - mov r3, r8\n\ - cmp r3, 0\n\ - beq _08018454\n\ - ldr r0, _08018450 @ =gLastUsedAbility\n\ - strb r3, [r0]\n\ - mov r8, r0\n\ - b _0801846A\n\ - .align 2, 0\n\ -_08018444: .4byte gBattlePartyID\n\ -_08018448: .4byte gEnemyParty\n\ -_0801844C: .4byte gBattleTypeFlags\n\ -_08018450: .4byte gLastUsedAbility\n\ -_08018454:\n\ - ldr r2, _08018474 @ =gLastUsedAbility\n\ - ldr r1, _08018478 @ =gBattleMons\n\ - movs r0, 0x58\n\ - mov r5, r10\n\ - muls r5, r0\n\ - adds r0, r5, 0\n\ - adds r0, r1\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - strb r0, [r2]\n\ - mov r8, r2\n\ -_0801846A:\n\ - cmp r4, 0\n\ - beq _0801847C\n\ - adds r3, r4, 0\n\ - b _08018480\n\ - .align 2, 0\n\ -_08018474: .4byte gLastUsedAbility\n\ -_08018478: .4byte gBattleMons\n\ -_0801847C:\n\ - ldr r0, _08018494 @ =gCurrentMove\n\ - ldrh r3, [r0]\n\ -_08018480:\n\ - ldr r1, _08018498 @ =0x02000000\n\ - ldr r2, _0801849C @ =0x0001601c\n\ - adds r0, r1, r2\n\ - ldrb r0, [r0]\n\ - adds r7, r1, 0\n\ - cmp r0, 0\n\ - beq _080184A0\n\ - movs r4, 0x3F\n\ - ands r4, r0\n\ - b _080184AC\n\ - .align 2, 0\n\ -_08018494: .4byte gCurrentMove\n\ -_08018498: .4byte 0x02000000\n\ -_0801849C: .4byte 0x0001601c\n\ -_080184A0:\n\ - ldr r1, _080184C0 @ =gBattleMoves\n\ - lsls r0, r3, 1\n\ - adds r0, r3\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r4, [r0, 0x2]\n\ -_080184AC:\n\ - ldr r5, [sp, 0x4]\n\ - cmp r5, 0x13\n\ - bls _080184B6\n\ - bl _08019F76\n\ -_080184B6:\n\ - lsls r0, r5, 2\n\ - ldr r1, _080184C4 @ =_080184C8\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .align 2, 0\n\ -_080184C0: .4byte gBattleMoves\n\ -_080184C4: .4byte _080184C8\n\ - .align 2, 0\n\ -_080184C8:\n\ - .4byte _08018518\n\ - .4byte _08018814\n\ - .4byte _08018A40\n\ - .4byte _08018AD8\n\ - .4byte _08018CF0\n\ - .4byte _08019448\n\ - .4byte _080197B4\n\ - .4byte _08019804\n\ - .4byte _08019880\n\ - .4byte _080198FC\n\ - .4byte _08019B1C\n\ - .4byte _08019940\n\ - .4byte _08019B60\n\ - .4byte _08019BBC\n\ - .4byte _08019C18\n\ - .4byte _08019D18\n\ - .4byte _08019D5C\n\ - .4byte _08019DB8\n\ - .4byte _08019F44\n\ - .4byte _08019CD4\n\ -_08018518:\n\ - ldr r2, _0801854C @ =gBankAttacker\n\ - ldr r0, _08018550 @ =gNoOfAllBanks\n\ - ldrb r1, [r2]\n\ - adds r5, r0, 0\n\ - ldrb r0, [r5]\n\ - cmp r1, r0\n\ - bcc _0801852A\n\ - mov r1, r10\n\ - strb r1, [r2]\n\ -_0801852A:\n\ - mov r2, r8\n\ - ldrb r0, [r2]\n\ - cmp r0, 0x2D\n\ - bne _08018534\n\ - b _080186B8\n\ -_08018534:\n\ - cmp r0, 0x2D\n\ - bgt _08018564\n\ - cmp r0, 0xD\n\ - bne _0801853E\n\ - b _080187DC\n\ -_0801853E:\n\ - cmp r0, 0xD\n\ - bgt _08018554\n\ - cmp r0, 0x2\n\ - bne _08018548\n\ - b _08018680\n\ -_08018548:\n\ - bl _08019F76\n\ - .align 2, 0\n\ -_0801854C: .4byte gBankAttacker\n\ -_08018550: .4byte gNoOfAllBanks\n\ -_08018554:\n\ - cmp r0, 0x16\n\ - bne _0801855A\n\ - b _08018728\n\ -_0801855A:\n\ - cmp r0, 0x24\n\ - bne _08018560\n\ - b _080187A0\n\ -_08018560:\n\ - bl _08019F76\n\ -_08018564:\n\ - cmp r0, 0x46\n\ - bne _0801856A\n\ - b _080186F0\n\ -_0801856A:\n\ - cmp r0, 0x46\n\ - bgt _08018578\n\ - cmp r0, 0x3B\n\ - bne _08018574\n\ - b _0801875C\n\ -_08018574:\n\ - bl _08019F76\n\ -_08018578:\n\ - cmp r0, 0x4D\n\ - bne _0801857E\n\ - b _080187DC\n\ -_0801857E:\n\ - cmp r0, 0xFF\n\ - beq _08018586\n\ - bl _08019F76\n\ -_08018586:\n\ - bl weather_get_current\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - subs r0, 0x3\n\ - cmp r0, 0xA\n\ - bhi _0801864C\n\ - lsls r0, 2\n\ - ldr r1, _080185A0 @ =_080185A4\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .align 2, 0\n\ -_080185A0: .4byte _080185A4\n\ - .align 2, 0\n\ -_080185A4:\n\ - .4byte _080185D0\n\ - .4byte _0801864C\n\ - .4byte _080185D0\n\ - .4byte _0801864C\n\ - .4byte _0801864C\n\ - .4byte _080185F8\n\ - .4byte _0801864C\n\ - .4byte _0801864C\n\ - .4byte _0801864C\n\ - .4byte _08018620\n\ - .4byte _080185D0\n\ -_080185D0:\n\ - ldr r2, _080185EC @ =gBattleWeather\n\ - ldrh r1, [r2]\n\ - movs r0, 0x7\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801864C\n\ - movs r0, 0x5\n\ - strh r0, [r2]\n\ - ldr r0, _080185F0 @ =0x02000000\n\ - ldr r3, _080185F4 @ =0x000160a4\n\ - adds r2, r0, r3\n\ - movs r1, 0xA\n\ - b _08018638\n\ - .align 2, 0\n\ -_080185EC: .4byte gBattleWeather\n\ -_080185F0: .4byte 0x02000000\n\ -_080185F4: .4byte 0x000160a4\n\ -_080185F8:\n\ - ldr r3, _08018614 @ =gBattleWeather\n\ - ldrh r1, [r3]\n\ - movs r2, 0x18\n\ - adds r0, r2, 0\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801864C\n\ - strh r2, [r3]\n\ - ldr r0, _08018618 @ =0x02000000\n\ - ldr r3, _0801861C @ =0x000160a4\n\ - adds r2, r0, r3\n\ - movs r1, 0xC\n\ - b _08018638\n\ - .align 2, 0\n\ -_08018614: .4byte gBattleWeather\n\ -_08018618: .4byte 0x02000000\n\ -_0801861C: .4byte 0x000160a4\n\ -_08018620:\n\ - ldr r3, _08018668 @ =gBattleWeather\n\ - ldrh r1, [r3]\n\ - movs r2, 0x60\n\ - adds r0, r2, 0\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801864C\n\ - strh r2, [r3]\n\ - ldr r0, _0801866C @ =0x02000000\n\ - ldr r3, _08018670 @ =0x000160a4\n\ - adds r2, r0, r3\n\ - movs r1, 0xB\n\ -_08018638:\n\ - strb r1, [r2]\n\ - ldr r5, _08018674 @ =0x00016003\n\ - adds r0, r5\n\ - mov r1, r10\n\ - strb r1, [r0]\n\ - mov r0, r9\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r9, r0\n\ -_0801864C:\n\ - mov r2, r9\n\ - cmp r2, 0\n\ - bne _08018656\n\ - bl _08019F92\n\ -_08018656:\n\ - bl weather_get_current\n\ - ldr r1, _08018678 @ =gBattleCommunication\n\ - strb r0, [r1, 0x5]\n\ - ldr r0, _0801867C @ =gUnknown_081D901D\n\ - bl b_push_move_exec\n\ - bl _08019F76\n\ - .align 2, 0\n\ -_08018668: .4byte gBattleWeather\n\ -_0801866C: .4byte 0x02000000\n\ -_08018670: .4byte 0x000160a4\n\ -_08018674: .4byte 0x00016003\n\ -_08018678: .4byte gBattleCommunication\n\ -_0801867C: .4byte gUnknown_081D901D\n\ -_08018680:\n\ - ldr r2, _080186A8 @ =gBattleWeather\n\ - ldrh r1, [r2]\n\ - movs r0, 0x4\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08018690\n\ - bl _08019F76\n\ -_08018690:\n\ - movs r0, 0x5\n\ - strh r0, [r2]\n\ - ldr r0, _080186AC @ =BattleScript_DrizzleActivates\n\ - bl b_push_move_exec\n\ - ldr r0, _080186B0 @ =0x02000000\n\ - ldr r3, _080186B4 @ =0x00016003\n\ - adds r0, r3\n\ - mov r5, r10\n\ - strb r5, [r0]\n\ - bl _08019F22\n\ - .align 2, 0\n\ -_080186A8: .4byte gBattleWeather\n\ -_080186AC: .4byte BattleScript_DrizzleActivates\n\ -_080186B0: .4byte 0x02000000\n\ -_080186B4: .4byte 0x00016003\n\ -_080186B8:\n\ - ldr r2, _080186E0 @ =gBattleWeather\n\ - ldrh r1, [r2]\n\ - movs r0, 0x10\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080186C8\n\ - bl _08019F76\n\ -_080186C8:\n\ - movs r0, 0x18\n\ - strh r0, [r2]\n\ - ldr r0, _080186E4 @ =BattleScript_SandstreamActivates\n\ - bl b_push_move_exec\n\ - ldr r0, _080186E8 @ =0x02000000\n\ - ldr r1, _080186EC @ =0x00016003\n\ - adds r0, r1\n\ - mov r2, r10\n\ - strb r2, [r0]\n\ - bl _08019F22\n\ - .align 2, 0\n\ -_080186E0: .4byte gBattleWeather\n\ -_080186E4: .4byte BattleScript_SandstreamActivates\n\ -_080186E8: .4byte 0x02000000\n\ -_080186EC: .4byte 0x00016003\n\ -_080186F0:\n\ - ldr r2, _08018718 @ =gBattleWeather\n\ - ldrh r1, [r2]\n\ - movs r0, 0x40\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08018700\n\ - bl _08019F76\n\ -_08018700:\n\ - movs r0, 0x60\n\ - strh r0, [r2]\n\ - ldr r0, _0801871C @ =BattleScript_DroughtActivates\n\ - bl b_push_move_exec\n\ - ldr r0, _08018720 @ =0x02000000\n\ - ldr r3, _08018724 @ =0x00016003\n\ - adds r0, r3\n\ - mov r5, r10\n\ - strb r5, [r0]\n\ - bl _08019F22\n\ - .align 2, 0\n\ -_08018718: .4byte gBattleWeather\n\ -_0801871C: .4byte BattleScript_DroughtActivates\n\ -_08018720: .4byte 0x02000000\n\ -_08018724: .4byte 0x00016003\n\ -_08018728:\n\ - ldr r0, _08018754 @ =gSpecialStatuses\n\ - mov r1, r10\n\ - lsls r2, r1, 2\n\ - adds r1, r2, r1\n\ - lsls r1, 2\n\ - adds r3, r1, r0\n\ - ldrb r0, [r3]\n\ - lsls r0, 28\n\ - cmp r0, 0\n\ - bge _08018740\n\ - bl _08019F76\n\ -_08018740:\n\ - ldr r1, _08018758 @ =gStatuses3\n\ - adds r1, r2, r1\n\ - ldr r0, [r1]\n\ - movs r2, 0x80\n\ - lsls r2, 12\n\ - orrs r0, r2\n\ - str r0, [r1]\n\ - ldrb r0, [r3]\n\ - movs r1, 0x8\n\ - b _080187CA\n\ - .align 2, 0\n\ -_08018754: .4byte gSpecialStatuses\n\ -_08018758: .4byte gStatuses3\n\ -_0801875C:\n\ - mov r0, r10\n\ - bl CastformDataTypeChange\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r9, r0\n\ - cmp r0, 0\n\ - bne _08018770\n\ - bl _08019F92\n\ -_08018770:\n\ - ldr r0, _08018790 @ =BattleScript_CastformChange\n\ - bl b_push_move_exec\n\ - ldr r0, _08018794 @ =0x02000000\n\ - ldr r2, _08018798 @ =0x00016003\n\ - adds r1, r0, r2\n\ - mov r3, r10\n\ - strb r3, [r1]\n\ - mov r1, r9\n\ - subs r1, 0x1\n\ - ldr r5, _0801879C @ =0x0001609b\n\ - adds r0, r5\n\ - strb r1, [r0]\n\ - bl _08019F76\n\ - .align 2, 0\n\ -_08018790: .4byte BattleScript_CastformChange\n\ -_08018794: .4byte 0x02000000\n\ -_08018798: .4byte 0x00016003\n\ -_0801879C: .4byte 0x0001609b\n\ -_080187A0:\n\ - ldr r0, _080187D4 @ =gSpecialStatuses\n\ - mov r1, r10\n\ - lsls r2, r1, 2\n\ - adds r1, r2, r1\n\ - lsls r1, 2\n\ - adds r3, r1, r0\n\ - ldrb r0, [r3]\n\ - lsls r0, 27\n\ - cmp r0, 0\n\ - bge _080187B8\n\ - bl _08019F76\n\ -_080187B8:\n\ - ldr r1, _080187D8 @ =gStatuses3\n\ - adds r1, r2, r1\n\ - ldr r0, [r1]\n\ - movs r2, 0x80\n\ - lsls r2, 13\n\ - orrs r0, r2\n\ - str r0, [r1]\n\ - ldrb r0, [r3]\n\ - movs r1, 0x10\n\ -_080187CA:\n\ - orrs r0, r1\n\ - strb r0, [r3]\n\ - bl _08019F76\n\ - .align 2, 0\n\ -_080187D4: .4byte gSpecialStatuses\n\ -_080187D8: .4byte gStatuses3\n\ -_080187DC:\n\ - movs r6, 0\n\ - ldrb r5, [r5]\n\ - cmp r6, r5\n\ - bcc _080187E8\n\ - bl _08019F76\n\ -_080187E8:\n\ - adds r0, r6, 0\n\ - bl CastformDataTypeChange\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r9, r0\n\ - cmp r0, 0\n\ - beq _080187FC\n\ - bl _08019E14\n\ -_080187FC:\n\ - adds r0, r6, 0x1\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - ldr r0, _08018810 @ =gNoOfAllBanks\n\ - ldrb r0, [r0]\n\ - cmp r6, r0\n\ - bcc _080187E8\n\ - bl _08019F76\n\ - .align 2, 0\n\ -_08018810: .4byte gNoOfAllBanks\n\ -_08018814:\n\ - ldr r2, _08018844 @ =gBattleMons\n\ - movs r0, 0x58\n\ - mov r1, r10\n\ - muls r1, r0\n\ - adds r4, r1, r2\n\ - ldrh r0, [r4, 0x28]\n\ - cmp r0, 0\n\ - bne _08018828\n\ - bl _08019F76\n\ -_08018828:\n\ - ldr r0, _08018848 @ =gBankAttacker\n\ - mov r3, r10\n\ - strb r3, [r0]\n\ - mov r3, r8\n\ - ldrb r5, [r3]\n\ - cmp r5, 0x2C\n\ - beq _0801885A\n\ - cmp r5, 0x2C\n\ - bgt _0801884C\n\ - cmp r5, 0x3\n\ - bne _08018840\n\ - b _080189B8\n\ -_08018840:\n\ - bl _08019F76\n\ - .align 2, 0\n\ -_08018844: .4byte gBattleMons\n\ -_08018848: .4byte gBankAttacker\n\ -_0801884C:\n\ - cmp r5, 0x36\n\ - bne _08018852\n\ - b _08018A18\n\ -_08018852:\n\ - cmp r5, 0x3D\n\ - beq _080188DC\n\ - bl _08019F76\n\ -_0801885A:\n\ - movs r0, 0\n\ - str r0, [sp]\n\ - movs r0, 0x13\n\ - movs r1, 0\n\ - movs r2, 0xD\n\ - movs r3, 0\n\ - bl AbilityBattleEffects\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0\n\ - beq _08018876\n\ - bl _08019F76\n\ -_08018876:\n\ - str r0, [sp]\n\ - movs r0, 0x13\n\ - movs r1, 0\n\ - movs r2, 0x4D\n\ - movs r3, 0\n\ - bl AbilityBattleEffects\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _0801888E\n\ - bl _08019F76\n\ -_0801888E:\n\ - ldr r0, _080188D0 @ =gBattleWeather\n\ - ldrh r1, [r0]\n\ - movs r0, 0x7\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801889E\n\ - bl _08019F76\n\ -_0801889E:\n\ - ldrh r0, [r4, 0x2C]\n\ - ldrh r1, [r4, 0x28]\n\ - cmp r0, r1\n\ - bhi _080188AA\n\ - bl _08019F76\n\ -_080188AA:\n\ - mov r2, r8\n\ - strb r5, [r2]\n\ - ldr r0, _080188D4 @ =BattleScript_RainDishActivates\n\ - bl b_push_move_exec\n\ - ldr r1, _080188D8 @ =gBattleMoveDamage\n\ - ldrh r0, [r4, 0x2C]\n\ - lsrs r0, 4\n\ - str r0, [r1]\n\ - cmp r0, 0\n\ - bne _080188C4\n\ - movs r0, 0x1\n\ - str r0, [r1]\n\ -_080188C4:\n\ - ldr r0, [r1]\n\ - negs r0, r0\n\ - str r0, [r1]\n\ - bl _08019F22\n\ - .align 2, 0\n\ -_080188D0: .4byte gBattleWeather\n\ -_080188D4: .4byte BattleScript_RainDishActivates\n\ -_080188D8: .4byte gBattleMoveDamage\n\ -_080188DC:\n\ - adds r0, r2, 0\n\ - adds r0, 0x4C\n\ - adds r5, r1, r0\n\ - ldrb r0, [r5]\n\ - cmp r0, 0\n\ - bne _080188EC\n\ - bl _08019F76\n\ -_080188EC:\n\ - bl Random\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0x3\n\ - bl __umodsi3\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - cmp r4, 0\n\ - beq _08018906\n\ - bl _08019F76\n\ -_08018906:\n\ - ldr r0, [r5]\n\ - movs r1, 0x88\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08018918\n\ - ldr r0, _08018990 @ =gBattleTextBuff1\n\ - ldr r1, _08018994 @ =gStatusConditionString_PoisonJpn\n\ - bl StringCopy\n\ -_08018918:\n\ - ldr r0, [r5]\n\ - movs r1, 0x7\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801892A\n\ - ldr r0, _08018990 @ =gBattleTextBuff1\n\ - ldr r1, _08018998 @ =gStatusConditionString_SleepJpn\n\ - bl StringCopy\n\ -_0801892A:\n\ - ldr r0, [r5]\n\ - movs r1, 0x40\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801893C\n\ - ldr r0, _08018990 @ =gBattleTextBuff1\n\ - ldr r1, _0801899C @ =gStatusConditionString_ParalysisJpn\n\ - bl StringCopy\n\ -_0801893C:\n\ - ldr r0, [r5]\n\ - movs r1, 0x10\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801894E\n\ - ldr r0, _08018990 @ =gBattleTextBuff1\n\ - ldr r1, _080189A0 @ =gStatusConditionString_BurnJpn\n\ - bl StringCopy\n\ -_0801894E:\n\ - ldr r0, [r5]\n\ - movs r1, 0x20\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08018960\n\ - ldr r0, _08018990 @ =gBattleTextBuff1\n\ - ldr r1, _080189A4 @ =gStatusConditionString_IceJpn\n\ - bl StringCopy\n\ -_08018960:\n\ - str r4, [r5]\n\ - ldr r0, _080189A8 @ =0x02000000\n\ - ldr r4, _080189AC @ =gActiveBank\n\ - mov r3, r10\n\ - strb r3, [r4]\n\ - ldr r1, _080189B0 @ =0x00016003\n\ - adds r0, r1\n\ - strb r3, [r0]\n\ - ldr r0, _080189B4 @ =BattleScript_ShedSkinActivates\n\ - bl b_push_move_exec\n\ - str r5, [sp]\n\ - movs r0, 0\n\ - movs r1, 0x28\n\ - movs r2, 0\n\ - movs r3, 0x4\n\ - bl EmitSetAttributes\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - bl _08019F22\n\ - .align 2, 0\n\ -_08018990: .4byte gBattleTextBuff1\n\ -_08018994: .4byte gStatusConditionString_PoisonJpn\n\ -_08018998: .4byte gStatusConditionString_SleepJpn\n\ -_0801899C: .4byte gStatusConditionString_ParalysisJpn\n\ -_080189A0: .4byte gStatusConditionString_BurnJpn\n\ -_080189A4: .4byte gStatusConditionString_IceJpn\n\ -_080189A8: .4byte 0x02000000\n\ -_080189AC: .4byte gActiveBank\n\ -_080189B0: .4byte 0x00016003\n\ -_080189B4: .4byte BattleScript_ShedSkinActivates\n\ -_080189B8:\n\ - ldrb r2, [r4, 0x1B]\n\ - movs r0, 0x1B\n\ - ldrsb r0, [r4, r0]\n\ - cmp r0, 0xB\n\ - ble _080189C6\n\ - bl _08019F76\n\ -_080189C6:\n\ - ldr r0, _08018A04 @ =gDisableStructs\n\ - mov r3, r10\n\ - lsls r1, r3, 3\n\ - subs r1, r3\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x16]\n\ - cmp r0, 0x2\n\ - bne _080189DC\n\ - bl _08019F76\n\ -_080189DC:\n\ - adds r0, r2, 0x1\n\ - movs r2, 0\n\ - strb r0, [r4, 0x1B]\n\ - ldr r5, _08018A08 @ =0x000160a4\n\ - adds r1, r7, r5\n\ - movs r0, 0x11\n\ - strb r0, [r1]\n\ - ldr r1, _08018A0C @ =0x000160a5\n\ - adds r0, r7, r1\n\ - strb r2, [r0]\n\ - ldr r0, _08018A10 @ =BattleScript_SpeedBoostActivates\n\ - bl b_push_move_exec\n\ - ldr r2, _08018A14 @ =0x00016003\n\ - adds r0, r7, r2\n\ - mov r3, r10\n\ - strb r3, [r0]\n\ - bl _08019F22\n\ - .align 2, 0\n\ -_08018A04: .4byte gDisableStructs\n\ -_08018A08: .4byte 0x000160a4\n\ -_08018A0C: .4byte 0x000160a5\n\ -_08018A10: .4byte BattleScript_SpeedBoostActivates\n\ -_08018A14: .4byte 0x00016003\n\ -_08018A18:\n\ - ldr r2, _08018A3C @ =gDisableStructs\n\ - ldrb r0, [r0]\n\ - lsls r1, r0, 3\n\ - subs r1, r0\n\ - lsls r1, 2\n\ - adds r1, r2\n\ - ldrb r3, [r1, 0x18]\n\ - lsls r0, r3, 31\n\ - lsrs r0, 31\n\ - movs r2, 0x1\n\ - eors r2, r0\n\ - movs r0, 0x2\n\ - negs r0, r0\n\ - ands r0, r3\n\ - orrs r0, r2\n\ - strb r0, [r1, 0x18]\n\ - bl _08019F76\n\ - .align 2, 0\n\ -_08018A3C: .4byte gDisableStructs\n\ -_08018A40:\n\ - mov r5, r8\n\ - ldrb r0, [r5]\n\ - cmp r0, 0x2B\n\ - beq _08018A4C\n\ - bl _08019F76\n\ -_08018A4C:\n\ - movs r4, 0\n\ - ldr r0, _08018ABC @ =gSoundMovesTable\n\ - ldrh r2, [r0]\n\ - ldr r5, _08018AC0 @ =0x0000ffff\n\ - adds r1, r0, 0\n\ - cmp r2, r5\n\ - bne _08018A5E\n\ - bl _08019F76\n\ -_08018A5E:\n\ - cmp r2, r3\n\ - beq _08018A76\n\ - adds r2, r1, 0\n\ -_08018A64:\n\ - adds r2, 0x2\n\ - adds r4, 0x1\n\ - ldrh r0, [r2]\n\ - cmp r0, r5\n\ - bne _08018A72\n\ - bl _08019F76\n\ -_08018A72:\n\ - cmp r0, r3\n\ - bne _08018A64\n\ -_08018A76:\n\ - lsls r0, r4, 1\n\ - adds r0, r1\n\ - ldrh r1, [r0]\n\ - ldr r0, _08018AC0 @ =0x0000ffff\n\ - cmp r1, r0\n\ - bne _08018A86\n\ - bl _08019F76\n\ -_08018A86:\n\ - ldr r1, _08018AC4 @ =gBattleMons\n\ - ldr r0, _08018AC8 @ =gBankAttacker\n\ - ldrb r2, [r0]\n\ - movs r0, 0x58\n\ - muls r0, r2\n\ - adds r1, 0x50\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 5\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08018AAC\n\ - ldr r0, _08018ACC @ =gHitMarker\n\ - ldr r1, [r0]\n\ - movs r2, 0x80\n\ - lsls r2, 4\n\ - orrs r1, r2\n\ - str r1, [r0]\n\ -_08018AAC:\n\ - ldr r1, _08018AD0 @ =gBattlescriptCurrInstr\n\ - ldr r0, _08018AD4 @ =BattleScript_SoundproofProtected\n\ - str r0, [r1]\n\ - movs r0, 0x1\n\ - mov r9, r0\n\ - bl _08019F7C\n\ - .align 2, 0\n\ -_08018ABC: .4byte gSoundMovesTable\n\ -_08018AC0: .4byte 0x0000ffff\n\ -_08018AC4: .4byte gBattleMons\n\ -_08018AC8: .4byte gBankAttacker\n\ -_08018ACC: .4byte gHitMarker\n\ -_08018AD0: .4byte gBattlescriptCurrInstr\n\ -_08018AD4: .4byte BattleScript_SoundproofProtected\n\ -_08018AD8:\n\ - cmp r3, 0\n\ - bne _08018AE0\n\ - bl _08019F76\n\ -_08018AE0:\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - cmp r0, 0xB\n\ - beq _08018B50\n\ - cmp r0, 0xB\n\ - bgt _08018AF2\n\ - cmp r0, 0xA\n\ - beq _08018AF8\n\ - b _08018C6A\n\ -_08018AF2:\n\ - cmp r0, 0x12\n\ - beq _08018BA8\n\ - b _08018C6A\n\ -_08018AF8:\n\ - cmp r4, 0xD\n\ - beq _08018AFE\n\ - b _08018C6A\n\ -_08018AFE:\n\ - ldr r0, _08018B28 @ =gBattleMoves\n\ - lsls r1, r3, 1\n\ - adds r1, r3\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x1]\n\ - cmp r0, 0\n\ - bne _08018B10\n\ - b _08018C6A\n\ -_08018B10:\n\ - ldr r1, _08018B2C @ =gProtectStructs\n\ - ldr r0, _08018B30 @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - lsls r0, 4\n\ - adds r0, r1\n\ - ldrb r0, [r0, 0x2]\n\ - lsls r0, 28\n\ - cmp r0, 0\n\ - bge _08018B3C\n\ - ldr r1, _08018B34 @ =gBattlescriptCurrInstr\n\ - ldr r0, _08018B38 @ =BattleScript_MoveHPDrain\n\ - b _08018B40\n\ - .align 2, 0\n\ -_08018B28: .4byte gBattleMoves\n\ -_08018B2C: .4byte gProtectStructs\n\ -_08018B30: .4byte gBankAttacker\n\ -_08018B34: .4byte gBattlescriptCurrInstr\n\ -_08018B38: .4byte BattleScript_MoveHPDrain\n\ -_08018B3C:\n\ - ldr r1, _08018B48 @ =gBattlescriptCurrInstr\n\ - ldr r0, _08018B4C @ =BattleScript_MoveHPDrain_PPLoss\n\ -_08018B40:\n\ - str r0, [r1]\n\ - movs r2, 0x1\n\ - b _08018C68\n\ - .align 2, 0\n\ -_08018B48: .4byte gBattlescriptCurrInstr\n\ -_08018B4C: .4byte BattleScript_MoveHPDrain_PPLoss\n\ -_08018B50:\n\ - cmp r4, 0xB\n\ - beq _08018B56\n\ - b _08018C6A\n\ -_08018B56:\n\ - ldr r0, _08018B80 @ =gBattleMoves\n\ - lsls r1, r3, 1\n\ - adds r1, r3\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x1]\n\ - cmp r0, 0\n\ - bne _08018B68\n\ - b _08018C6A\n\ -_08018B68:\n\ - ldr r1, _08018B84 @ =gProtectStructs\n\ - ldr r0, _08018B88 @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - lsls r0, 4\n\ - adds r0, r1\n\ - ldrb r0, [r0, 0x2]\n\ - lsls r0, 28\n\ - cmp r0, 0\n\ - bge _08018B94\n\ - ldr r1, _08018B8C @ =gBattlescriptCurrInstr\n\ - ldr r0, _08018B90 @ =BattleScript_MoveHPDrain\n\ - b _08018B98\n\ - .align 2, 0\n\ -_08018B80: .4byte gBattleMoves\n\ -_08018B84: .4byte gProtectStructs\n\ -_08018B88: .4byte gBankAttacker\n\ -_08018B8C: .4byte gBattlescriptCurrInstr\n\ -_08018B90: .4byte BattleScript_MoveHPDrain\n\ -_08018B94:\n\ - ldr r1, _08018BA0 @ =gBattlescriptCurrInstr\n\ - ldr r0, _08018BA4 @ =BattleScript_MoveHPDrain_PPLoss\n\ -_08018B98:\n\ - str r0, [r1]\n\ - movs r3, 0x1\n\ - mov r9, r3\n\ - b _08018C6A\n\ - .align 2, 0\n\ -_08018BA0: .4byte gBattlescriptCurrInstr\n\ -_08018BA4: .4byte BattleScript_MoveHPDrain_PPLoss\n\ -_08018BA8:\n\ - cmp r4, 0xA\n\ - bne _08018C6A\n\ - ldr r1, _08018BF4 @ =gBattleMons\n\ - movs r0, 0x58\n\ - mov r5, r10\n\ - muls r5, r0\n\ - adds r0, r5, 0\n\ - adds r1, 0x4C\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - movs r1, 0x20\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _08018C6A\n\ - ldr r2, _08018BF8 @ =0x02017100\n\ - mov r0, r10\n\ - lsls r1, r0, 2\n\ - adds r0, r1, r2\n\ - ldr r3, [r0]\n\ - movs r4, 0x1\n\ - ands r3, r4\n\ - adds r5, r1, 0\n\ - cmp r3, 0\n\ - bne _08018C30\n\ - ldr r0, _08018BFC @ =gBattleCommunication\n\ - strb r3, [r0, 0x5]\n\ - ldr r1, _08018C00 @ =gProtectStructs\n\ - ldr r0, _08018C04 @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - lsls r0, 4\n\ - adds r0, r1\n\ - ldrb r0, [r0, 0x2]\n\ - lsls r0, 28\n\ - cmp r0, 0\n\ - bge _08018C10\n\ - ldr r1, _08018C08 @ =gBattlescriptCurrInstr\n\ - ldr r0, _08018C0C @ =BattleScript_FlashFireBoost\n\ - b _08018C14\n\ - .align 2, 0\n\ -_08018BF4: .4byte gBattleMons\n\ -_08018BF8: .4byte 0x02017100\n\ -_08018BFC: .4byte gBattleCommunication\n\ -_08018C00: .4byte gProtectStructs\n\ -_08018C04: .4byte gBankAttacker\n\ -_08018C08: .4byte gBattlescriptCurrInstr\n\ -_08018C0C: .4byte BattleScript_FlashFireBoost\n\ -_08018C10:\n\ - ldr r1, _08018C28 @ =gBattlescriptCurrInstr\n\ - ldr r0, _08018C2C @ =BattleScript_FlashFireBoost_PPLoss\n\ -_08018C14:\n\ - str r0, [r1]\n\ - adds r0, r5, r2\n\ - ldr r1, [r0]\n\ - movs r2, 0x1\n\ - orrs r1, r2\n\ - str r1, [r0]\n\ - movs r1, 0x2\n\ - mov r9, r1\n\ - b _08018C6A\n\ - .align 2, 0\n\ -_08018C28: .4byte gBattlescriptCurrInstr\n\ -_08018C2C: .4byte BattleScript_FlashFireBoost_PPLoss\n\ -_08018C30:\n\ - ldr r0, _08018C4C @ =gBattleCommunication\n\ - strb r4, [r0, 0x5]\n\ - ldr r1, _08018C50 @ =gProtectStructs\n\ - ldr r0, _08018C54 @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - lsls r0, 4\n\ - adds r0, r1\n\ - ldrb r0, [r0, 0x2]\n\ - lsls r0, 28\n\ - cmp r0, 0\n\ - bge _08018C60\n\ - ldr r1, _08018C58 @ =gBattlescriptCurrInstr\n\ - ldr r0, _08018C5C @ =BattleScript_FlashFireBoost\n\ - b _08018C64\n\ - .align 2, 0\n\ -_08018C4C: .4byte gBattleCommunication\n\ -_08018C50: .4byte gProtectStructs\n\ -_08018C54: .4byte gBankAttacker\n\ -_08018C58: .4byte gBattlescriptCurrInstr\n\ -_08018C5C: .4byte BattleScript_FlashFireBoost\n\ -_08018C60:\n\ - ldr r1, _08018CA4 @ =gBattlescriptCurrInstr\n\ - ldr r0, _08018CA8 @ =BattleScript_FlashFireBoost_PPLoss\n\ -_08018C64:\n\ - str r0, [r1]\n\ - movs r2, 0x2\n\ -_08018C68:\n\ - mov r9, r2\n\ -_08018C6A:\n\ - mov r3, r9\n\ - cmp r3, 0x1\n\ - beq _08018C74\n\ - bl _08019F76\n\ -_08018C74:\n\ - ldr r1, _08018CAC @ =gBattleMons\n\ - movs r0, 0x58\n\ - mov r5, r10\n\ - muls r5, r0\n\ - adds r0, r5, 0\n\ - adds r1, r0, r1\n\ - ldrh r0, [r1, 0x2C]\n\ - ldrh r2, [r1, 0x28]\n\ - cmp r0, r2\n\ - bne _08018CD0\n\ - ldr r1, _08018CB0 @ =gProtectStructs\n\ - ldr r0, _08018CB4 @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - lsls r0, 4\n\ - adds r0, r1\n\ - ldrb r0, [r0, 0x2]\n\ - lsls r0, 28\n\ - cmp r0, 0\n\ - bge _08018CBC\n\ - ldr r1, _08018CA4 @ =gBattlescriptCurrInstr\n\ - ldr r0, _08018CB8 @ =BattleScript_MoveHPDrain_FullHP\n\ - str r0, [r1]\n\ - bl _08019F76\n\ - .align 2, 0\n\ -_08018CA4: .4byte gBattlescriptCurrInstr\n\ -_08018CA8: .4byte BattleScript_FlashFireBoost_PPLoss\n\ -_08018CAC: .4byte gBattleMons\n\ -_08018CB0: .4byte gProtectStructs\n\ -_08018CB4: .4byte gBankAttacker\n\ -_08018CB8: .4byte BattleScript_MoveHPDrain_FullHP\n\ -_08018CBC:\n\ - ldr r1, _08018CC8 @ =gBattlescriptCurrInstr\n\ - ldr r0, _08018CCC @ =BattleScript_MoveHPDrain_FullHP_PPLoss\n\ - str r0, [r1]\n\ - bl _08019F76\n\ - .align 2, 0\n\ -_08018CC8: .4byte gBattlescriptCurrInstr\n\ -_08018CCC: .4byte BattleScript_MoveHPDrain_FullHP_PPLoss\n\ -_08018CD0:\n\ - ldr r2, _08018CEC @ =gBattleMoveDamage\n\ - ldrh r0, [r1, 0x2C]\n\ - lsrs r0, 2\n\ - str r0, [r2]\n\ - cmp r0, 0\n\ - bne _08018CE0\n\ - mov r3, r9\n\ - str r3, [r2]\n\ -_08018CE0:\n\ - ldr r0, [r2]\n\ - negs r0, r0\n\ - str r0, [r2]\n\ - bl _08019F76\n\ - .align 2, 0\n\ -_08018CEC: .4byte gBattleMoveDamage\n\ -_08018CF0:\n\ - mov r5, r8\n\ - ldrb r0, [r5]\n\ - subs r0, 0x9\n\ - cmp r0, 0x2F\n\ - bls _08018CFE\n\ - bl _08019F76\n\ -_08018CFE:\n\ - lsls r0, 2\n\ - ldr r1, _08018D08 @ =_08018D0C\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .align 2, 0\n\ -_08018D08: .4byte _08018D0C\n\ - .align 2, 0\n\ -_08018D0C:\n\ - .4byte _08019128\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08018DCC\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08018E94\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08018F54\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _0801904C\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019204\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _08019F76\n\ - .4byte _080192E0\n\ -_08018DCC:\n\ - ldr r0, _08018E74 @ =gBattleMoveFlags\n\ - ldrb r1, [r0]\n\ - movs r0, 0x29\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08018DDC\n\ - bl _08019F76\n\ -_08018DDC:\n\ - cmp r3, 0xA5\n\ - bne _08018DE4\n\ - bl _08019F76\n\ -_08018DE4:\n\ - ldr r0, _08018E78 @ =gBattleMoves\n\ - lsls r1, r3, 1\n\ - adds r1, r3\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x1]\n\ - cmp r0, 0\n\ - bne _08018DF8\n\ - bl _08019F76\n\ -_08018DF8:\n\ - ldr r2, _08018E7C @ =gSpecialStatuses\n\ - ldr r0, _08018E80 @ =gBankTarget\n\ - ldrb r1, [r0]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r1, r0, 2\n\ - adds r0, r2, 0\n\ - adds r0, 0x8\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - bne _08018E20\n\ - adds r0, r2, 0\n\ - adds r0, 0xC\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - bne _08018E20\n\ - bl _08019F76\n\ -_08018E20:\n\ - ldr r1, _08018E84 @ =gBattleMons\n\ - movs r0, 0x58\n\ - mov r2, r10\n\ - muls r2, r0\n\ - adds r0, r2, 0\n\ - adds r1, r0, r1\n\ - adds r3, r1, 0\n\ - adds r3, 0x21\n\ - ldrb r0, [r3]\n\ - cmp r0, r4\n\ - bne _08018E3A\n\ - bl _08019F76\n\ -_08018E3A:\n\ - adds r2, r1, 0\n\ - adds r2, 0x22\n\ - ldrb r0, [r2]\n\ - cmp r0, r4\n\ - bne _08018E48\n\ - bl _08019F76\n\ -_08018E48:\n\ - ldrh r0, [r1, 0x28]\n\ - cmp r0, 0\n\ - bne _08018E52\n\ - bl _08019F76\n\ -_08018E52:\n\ - strb r4, [r3]\n\ - strb r4, [r2]\n\ - ldr r1, _08018E88 @ =gBattleTextBuff1\n\ - movs r0, 0xFD\n\ - strb r0, [r1]\n\ - movs r0, 0x3\n\ - strb r0, [r1, 0x1]\n\ - strb r4, [r1, 0x2]\n\ - movs r0, 0xFF\n\ - strb r0, [r1, 0x3]\n\ - bl b_movescr_stack_push_cursor\n\ - ldr r1, _08018E8C @ =gBattlescriptCurrInstr\n\ - ldr r0, _08018E90 @ =BattleScript_ColorChangeActivates\n\ - str r0, [r1]\n\ - bl _08019F22\n\ - .align 2, 0\n\ -_08018E74: .4byte gBattleMoveFlags\n\ -_08018E78: .4byte gBattleMoves\n\ -_08018E7C: .4byte gSpecialStatuses\n\ -_08018E80: .4byte gBankTarget\n\ -_08018E84: .4byte gBattleMons\n\ -_08018E88: .4byte gBattleTextBuff1\n\ -_08018E8C: .4byte gBattlescriptCurrInstr\n\ -_08018E90: .4byte BattleScript_ColorChangeActivates\n\ -_08018E94:\n\ - ldr r0, _08018F2C @ =gBattleMoveFlags\n\ - ldrb r1, [r0]\n\ - movs r0, 0x29\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08018EA4\n\ - bl _08019F76\n\ -_08018EA4:\n\ - ldr r1, _08018F30 @ =gBattleMons\n\ - ldr r0, _08018F34 @ =gBankAttacker\n\ - ldrb r2, [r0]\n\ - movs r0, 0x58\n\ - muls r0, r2\n\ - adds r4, r0, r1\n\ - ldrh r0, [r4, 0x28]\n\ - cmp r0, 0\n\ - bne _08018EBA\n\ - bl _08019F76\n\ -_08018EBA:\n\ - ldr r0, _08018F38 @ =gProtectStructs\n\ - lsls r1, r2, 4\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x1]\n\ - lsls r0, 31\n\ - cmp r0, 0\n\ - beq _08018ECC\n\ - bl _08019F76\n\ -_08018ECC:\n\ - ldr r2, _08018F3C @ =gSpecialStatuses\n\ - ldr r0, _08018F40 @ =gBankTarget\n\ - ldrb r1, [r0]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r1, r0, 2\n\ - adds r0, r2, 0\n\ - adds r0, 0x8\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - bne _08018EF4\n\ - adds r0, r2, 0\n\ - adds r0, 0xC\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - bne _08018EF4\n\ - bl _08019F76\n\ -_08018EF4:\n\ - ldr r1, _08018F44 @ =gBattleMoves\n\ - lsls r0, r3, 1\n\ - adds r0, r3\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r1, [r0, 0x8]\n\ - movs r2, 0x1\n\ - adds r0, r2, 0\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _08018F0E\n\ - bl _08019F76\n\ -_08018F0E:\n\ - ldr r1, _08018F48 @ =gBattleMoveDamage\n\ - ldrh r0, [r4, 0x2C]\n\ - lsrs r0, 4\n\ - str r0, [r1]\n\ - cmp r0, 0\n\ - bne _08018F1C\n\ - str r2, [r1]\n\ -_08018F1C:\n\ - bl b_movescr_stack_push_cursor\n\ - ldr r1, _08018F4C @ =gBattlescriptCurrInstr\n\ - ldr r0, _08018F50 @ =BattleScript_RoughSkinActivates\n\ - str r0, [r1]\n\ - bl _08019F22\n\ - .align 2, 0\n\ -_08018F2C: .4byte gBattleMoveFlags\n\ -_08018F30: .4byte gBattleMons\n\ -_08018F34: .4byte gBankAttacker\n\ -_08018F38: .4byte gProtectStructs\n\ -_08018F3C: .4byte gSpecialStatuses\n\ -_08018F40: .4byte gBankTarget\n\ -_08018F44: .4byte gBattleMoves\n\ -_08018F48: .4byte gBattleMoveDamage\n\ -_08018F4C: .4byte gBattlescriptCurrInstr\n\ -_08018F50: .4byte BattleScript_RoughSkinActivates\n\ -_08018F54:\n\ - ldr r0, _08019020 @ =gBattleMoveFlags\n\ - ldrb r1, [r0]\n\ - movs r0, 0x29\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08018F64\n\ - bl _08019F76\n\ -_08018F64:\n\ - ldr r1, _08019024 @ =gBattleMons\n\ - ldr r0, _08019028 @ =gBankAttacker\n\ - ldrb r2, [r0]\n\ - movs r0, 0x58\n\ - muls r0, r2\n\ - adds r0, r1\n\ - ldrh r0, [r0, 0x28]\n\ - cmp r0, 0\n\ - bne _08018F7A\n\ - bl _08019F76\n\ -_08018F7A:\n\ - ldr r0, _0801902C @ =gProtectStructs\n\ - lsls r1, r2, 4\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x1]\n\ - lsls r0, 31\n\ - cmp r0, 0\n\ - beq _08018F8C\n\ - bl _08019F76\n\ -_08018F8C:\n\ - ldr r2, _08019030 @ =gSpecialStatuses\n\ - ldr r0, _08019034 @ =gBankTarget\n\ - ldrb r1, [r0]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r1, r0, 2\n\ - adds r0, r2, 0\n\ - adds r0, 0x8\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - bne _08018FB4\n\ - adds r0, r2, 0\n\ - adds r0, 0xC\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - bne _08018FB4\n\ - bl _08019F76\n\ -_08018FB4:\n\ - ldr r1, _08019038 @ =gBattleMoves\n\ - lsls r0, r3, 1\n\ - adds r0, r3\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r1, [r0, 0x8]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _08018FCC\n\ - bl _08019F76\n\ -_08018FCC:\n\ - bl Random\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0xA\n\ - bl __umodsi3\n\ - lsls r0, 16\n\ - cmp r0, 0\n\ - beq _08018FE4\n\ - bl _08019F76\n\ -_08018FE4:\n\ - ldr r5, _0801903C @ =gBattleCommunication\n\ - movs r4, 0x3\n\ -_08018FE8:\n\ - bl Random\n\ - ands r0, r4\n\ - strb r0, [r5, 0x3]\n\ - cmp r0, 0\n\ - beq _08018FE8\n\ - ldr r1, _0801903C @ =gBattleCommunication\n\ - ldrb r0, [r1, 0x3]\n\ - cmp r0, 0x3\n\ - bne _08019000\n\ - adds r0, 0x2\n\ - strb r0, [r1, 0x3]\n\ -_08019000:\n\ - ldrb r0, [r1, 0x3]\n\ - adds r0, 0x40\n\ - strb r0, [r1, 0x3]\n\ - bl b_movescr_stack_push_cursor\n\ - ldr r1, _08019040 @ =gBattlescriptCurrInstr\n\ - ldr r0, _08019044 @ =BattleScript_ApplySecondaryEffect\n\ - str r0, [r1]\n\ - ldr r2, _08019048 @ =gHitMarker\n\ - ldr r0, [r2]\n\ - movs r1, 0x80\n\ - lsls r1, 6\n\ - orrs r0, r1\n\ - str r0, [r2]\n\ - bl _08019F22\n\ - .align 2, 0\n\ -_08019020: .4byte gBattleMoveFlags\n\ -_08019024: .4byte gBattleMons\n\ -_08019028: .4byte gBankAttacker\n\ -_0801902C: .4byte gProtectStructs\n\ -_08019030: .4byte gSpecialStatuses\n\ -_08019034: .4byte gBankTarget\n\ -_08019038: .4byte gBattleMoves\n\ -_0801903C: .4byte gBattleCommunication\n\ -_08019040: .4byte gBattlescriptCurrInstr\n\ -_08019044: .4byte BattleScript_ApplySecondaryEffect\n\ -_08019048: .4byte gHitMarker\n\ -_0801904C:\n\ - ldr r0, _080190FC @ =gBattleMoveFlags\n\ - ldrb r1, [r0]\n\ - movs r0, 0x29\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801905C\n\ - bl _08019F76\n\ -_0801905C:\n\ - ldr r1, _08019100 @ =gBattleMons\n\ - ldr r0, _08019104 @ =gBankAttacker\n\ - ldrb r2, [r0]\n\ - movs r0, 0x58\n\ - muls r0, r2\n\ - adds r0, r1\n\ - ldrh r0, [r0, 0x28]\n\ - cmp r0, 0\n\ - bne _08019072\n\ - bl _08019F76\n\ -_08019072:\n\ - ldr r0, _08019108 @ =gProtectStructs\n\ - lsls r1, r2, 4\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x1]\n\ - lsls r0, 31\n\ - cmp r0, 0\n\ - beq _08019084\n\ - bl _08019F76\n\ -_08019084:\n\ - ldr r2, _0801910C @ =gSpecialStatuses\n\ - ldr r0, _08019110 @ =gBankTarget\n\ - ldrb r1, [r0]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r1, r0, 2\n\ - adds r0, r2, 0\n\ - adds r0, 0x8\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - bne _080190AC\n\ - adds r0, r2, 0\n\ - adds r0, 0xC\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - bne _080190AC\n\ - bl _08019F76\n\ -_080190AC:\n\ - ldr r1, _08019114 @ =gBattleMoves\n\ - lsls r0, r3, 1\n\ - adds r0, r3\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r1, [r0, 0x8]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _080190C4\n\ - bl _08019F76\n\ -_080190C4:\n\ - bl Random\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0x3\n\ - bl __umodsi3\n\ - lsls r0, 16\n\ - cmp r0, 0\n\ - beq _080190DC\n\ - bl _08019F76\n\ -_080190DC:\n\ - ldr r1, _08019118 @ =gBattleCommunication\n\ - movs r0, 0x42\n\ - strb r0, [r1, 0x3]\n\ - bl b_movescr_stack_push_cursor\n\ - ldr r1, _0801911C @ =gBattlescriptCurrInstr\n\ - ldr r0, _08019120 @ =BattleScript_ApplySecondaryEffect\n\ - str r0, [r1]\n\ - ldr r2, _08019124 @ =gHitMarker\n\ - ldr r0, [r2]\n\ - movs r1, 0x80\n\ - lsls r1, 6\n\ - orrs r0, r1\n\ - str r0, [r2]\n\ - bl _08019F22\n\ - .align 2, 0\n\ -_080190FC: .4byte gBattleMoveFlags\n\ -_08019100: .4byte gBattleMons\n\ -_08019104: .4byte gBankAttacker\n\ -_08019108: .4byte gProtectStructs\n\ -_0801910C: .4byte gSpecialStatuses\n\ -_08019110: .4byte gBankTarget\n\ -_08019114: .4byte gBattleMoves\n\ -_08019118: .4byte gBattleCommunication\n\ -_0801911C: .4byte gBattlescriptCurrInstr\n\ -_08019120: .4byte BattleScript_ApplySecondaryEffect\n\ -_08019124: .4byte gHitMarker\n\ -_08019128:\n\ - ldr r0, _080191D8 @ =gBattleMoveFlags\n\ - ldrb r1, [r0]\n\ - movs r0, 0x29\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08019138\n\ - bl _08019F76\n\ -_08019138:\n\ - ldr r1, _080191DC @ =gBattleMons\n\ - ldr r0, _080191E0 @ =gBankAttacker\n\ - ldrb r2, [r0]\n\ - movs r0, 0x58\n\ - muls r0, r2\n\ - adds r0, r1\n\ - ldrh r0, [r0, 0x28]\n\ - cmp r0, 0\n\ - bne _0801914E\n\ - bl _08019F76\n\ -_0801914E:\n\ - ldr r0, _080191E4 @ =gProtectStructs\n\ - lsls r1, r2, 4\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x1]\n\ - lsls r0, 31\n\ - cmp r0, 0\n\ - beq _08019160\n\ - bl _08019F76\n\ -_08019160:\n\ - ldr r2, _080191E8 @ =gSpecialStatuses\n\ - ldr r0, _080191EC @ =gBankTarget\n\ - ldrb r1, [r0]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r1, r0, 2\n\ - adds r0, r2, 0\n\ - adds r0, 0x8\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - bne _08019188\n\ - adds r0, r2, 0\n\ - adds r0, 0xC\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - bne _08019188\n\ - bl _08019F76\n\ -_08019188:\n\ - ldr r1, _080191F0 @ =gBattleMoves\n\ - lsls r0, r3, 1\n\ - adds r0, r3\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r1, [r0, 0x8]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _080191A0\n\ - bl _08019F76\n\ -_080191A0:\n\ - bl Random\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0x3\n\ - bl __umodsi3\n\ - lsls r0, 16\n\ - cmp r0, 0\n\ - beq _080191B8\n\ - bl _08019F76\n\ -_080191B8:\n\ - ldr r1, _080191F4 @ =gBattleCommunication\n\ - movs r0, 0x45\n\ - strb r0, [r1, 0x3]\n\ - bl b_movescr_stack_push_cursor\n\ - ldr r1, _080191F8 @ =gBattlescriptCurrInstr\n\ - ldr r0, _080191FC @ =BattleScript_ApplySecondaryEffect\n\ - str r0, [r1]\n\ - ldr r2, _08019200 @ =gHitMarker\n\ - ldr r0, [r2]\n\ - movs r1, 0x80\n\ - lsls r1, 6\n\ - orrs r0, r1\n\ - str r0, [r2]\n\ - bl _08019F22\n\ - .align 2, 0\n\ -_080191D8: .4byte gBattleMoveFlags\n\ -_080191DC: .4byte gBattleMons\n\ -_080191E0: .4byte gBankAttacker\n\ -_080191E4: .4byte gProtectStructs\n\ -_080191E8: .4byte gSpecialStatuses\n\ -_080191EC: .4byte gBankTarget\n\ -_080191F0: .4byte gBattleMoves\n\ -_080191F4: .4byte gBattleCommunication\n\ -_080191F8: .4byte gBattlescriptCurrInstr\n\ -_080191FC: .4byte BattleScript_ApplySecondaryEffect\n\ -_08019200: .4byte gHitMarker\n\ -_08019204:\n\ - ldr r0, _080192B4 @ =gBattleMoveFlags\n\ - ldrb r1, [r0]\n\ - movs r0, 0x29\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08019214\n\ - bl _08019F76\n\ -_08019214:\n\ - ldr r1, _080192B8 @ =gBattleMons\n\ - ldr r0, _080192BC @ =gBankAttacker\n\ - ldrb r2, [r0]\n\ - movs r0, 0x58\n\ - muls r0, r2\n\ - adds r0, r1\n\ - ldrh r0, [r0, 0x28]\n\ - cmp r0, 0\n\ - bne _0801922A\n\ - bl _08019F76\n\ -_0801922A:\n\ - ldr r0, _080192C0 @ =gProtectStructs\n\ - lsls r1, r2, 4\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x1]\n\ - lsls r0, 31\n\ - cmp r0, 0\n\ - beq _0801923C\n\ - bl _08019F76\n\ -_0801923C:\n\ - ldr r1, _080192C4 @ =gBattleMoves\n\ - lsls r0, r3, 1\n\ - adds r0, r3\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r1, [r0, 0x8]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _08019254\n\ - bl _08019F76\n\ -_08019254:\n\ - ldr r2, _080192C8 @ =gSpecialStatuses\n\ - ldr r0, _080192CC @ =gBankTarget\n\ - ldrb r1, [r0]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r1, r0, 2\n\ - adds r0, r2, 0\n\ - adds r0, 0x8\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - bne _0801927C\n\ - adds r0, r2, 0\n\ - adds r0, 0xC\n\ - adds r0, r1, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - bne _0801927C\n\ - bl _08019F76\n\ -_0801927C:\n\ - bl Random\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0x3\n\ - bl __umodsi3\n\ - lsls r0, 16\n\ - cmp r0, 0\n\ - beq _08019294\n\ - bl _08019F76\n\ -_08019294:\n\ - ldr r1, _080192D0 @ =gBattleCommunication\n\ - movs r0, 0x43\n\ - strb r0, [r1, 0x3]\n\ - bl b_movescr_stack_push_cursor\n\ - ldr r1, _080192D4 @ =gBattlescriptCurrInstr\n\ - ldr r0, _080192D8 @ =BattleScript_ApplySecondaryEffect\n\ - str r0, [r1]\n\ - ldr r2, _080192DC @ =gHitMarker\n\ - ldr r0, [r2]\n\ - movs r1, 0x80\n\ - lsls r1, 6\n\ - orrs r0, r1\n\ - str r0, [r2]\n\ - bl _08019F22\n\ - .align 2, 0\n\ -_080192B4: .4byte gBattleMoveFlags\n\ -_080192B8: .4byte gBattleMons\n\ -_080192BC: .4byte gBankAttacker\n\ -_080192C0: .4byte gProtectStructs\n\ -_080192C4: .4byte gBattleMoves\n\ -_080192C8: .4byte gSpecialStatuses\n\ -_080192CC: .4byte gBankTarget\n\ -_080192D0: .4byte gBattleCommunication\n\ -_080192D4: .4byte gBattlescriptCurrInstr\n\ -_080192D8: .4byte BattleScript_ApplySecondaryEffect\n\ -_080192DC: .4byte gHitMarker\n\ -_080192E0:\n\ - ldr r0, _08019420 @ =gBattleMoveFlags\n\ - ldrb r1, [r0]\n\ - movs r0, 0x29\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080192F0\n\ - bl _08019F76\n\ -_080192F0:\n\ - ldr r5, _08019424 @ =gBattleMons\n\ - ldr r7, _08019428 @ =gBankAttacker\n\ - ldrb r1, [r7]\n\ - movs r6, 0x58\n\ - adds r0, r1, 0\n\ - muls r0, r6\n\ - adds r0, r5\n\ - ldrh r0, [r0, 0x28]\n\ - cmp r0, 0\n\ - bne _08019308\n\ - bl _08019F76\n\ -_08019308:\n\ - ldr r0, _0801942C @ =gProtectStructs\n\ - lsls r1, 4\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x1]\n\ - lsls r0, 31\n\ - cmp r0, 0\n\ - beq _0801931A\n\ - bl _08019F76\n\ -_0801931A:\n\ - ldr r1, _08019430 @ =gBattleMoves\n\ - lsls r0, r3, 1\n\ - adds r0, r3\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r1, [r0, 0x8]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _08019332\n\ - bl _08019F76\n\ -_08019332:\n\ - ldr r3, _08019434 @ =gSpecialStatuses\n\ - ldr r0, _08019438 @ =gBankTarget\n\ - mov r8, r0\n\ - ldrb r1, [r0]\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r2, r0, 2\n\ - adds r0, r3, 0\n\ - adds r0, 0x8\n\ - adds r0, r2, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - bne _0801935C\n\ - adds r0, r3, 0\n\ - adds r0, 0xC\n\ - adds r0, r2, r0\n\ - ldr r0, [r0]\n\ - cmp r0, 0\n\ - bne _0801935C\n\ - bl _08019F76\n\ -_0801935C:\n\ - adds r0, r1, 0\n\ - muls r0, r6\n\ - adds r0, r5\n\ - ldrh r0, [r0, 0x28]\n\ - cmp r0, 0\n\ - bne _0801936C\n\ - bl _08019F76\n\ -_0801936C:\n\ - bl Random\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0x3\n\ - bl __umodsi3\n\ - lsls r0, 16\n\ - cmp r0, 0\n\ - beq _08019384\n\ - bl _08019F76\n\ -_08019384:\n\ - ldrb r0, [r7]\n\ - muls r0, r6\n\ - adds r0, r5\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xC\n\ - bne _08019396\n\ - bl _08019F76\n\ -_08019396:\n\ - ldr r0, [sp, 0x8]\n\ - ldr r1, [sp, 0x10]\n\ - bl GetGenderFromSpeciesAndPersonality\n\ - adds r4, r0, 0\n\ - ldr r0, [sp, 0xC]\n\ - ldr r1, [sp, 0x14]\n\ - bl GetGenderFromSpeciesAndPersonality\n\ - lsls r4, 24\n\ - lsls r0, 24\n\ - cmp r4, r0\n\ - bne _080193B4\n\ - bl _08019F76\n\ -_080193B4:\n\ - ldrb r0, [r7]\n\ - muls r0, r6\n\ - adds r4, r5, 0\n\ - adds r4, 0x50\n\ - adds r0, r4\n\ - ldr r0, [r0]\n\ - movs r1, 0xF0\n\ - lsls r1, 12\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080193CE\n\ - bl _08019F76\n\ -_080193CE:\n\ - ldr r0, [sp, 0x8]\n\ - ldr r1, [sp, 0x10]\n\ - bl GetGenderFromSpeciesAndPersonality\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0xFF\n\ - bne _080193E2\n\ - bl _08019F76\n\ -_080193E2:\n\ - ldr r0, [sp, 0xC]\n\ - ldr r1, [sp, 0x14]\n\ - bl GetGenderFromSpeciesAndPersonality\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0xFF\n\ - bne _080193F6\n\ - bl _08019F76\n\ -_080193F6:\n\ - ldrb r0, [r7]\n\ - adds r2, r0, 0\n\ - muls r2, r6\n\ - adds r2, r4\n\ - ldr r1, _0801943C @ =gBitTable\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r1, [r0]\n\ - lsls r1, 16\n\ - ldr r0, [r2]\n\ - orrs r0, r1\n\ - str r0, [r2]\n\ - bl b_movescr_stack_push_cursor\n\ - ldr r1, _08019440 @ =gBattlescriptCurrInstr\n\ - ldr r0, _08019444 @ =BattleScript_CuteCharmActivates\n\ - str r0, [r1]\n\ - bl _08019F22\n\ - .align 2, 0\n\ -_08019420: .4byte gBattleMoveFlags\n\ -_08019424: .4byte gBattleMons\n\ -_08019428: .4byte gBankAttacker\n\ -_0801942C: .4byte gProtectStructs\n\ -_08019430: .4byte gBattleMoves\n\ -_08019434: .4byte gSpecialStatuses\n\ -_08019438: .4byte gBankTarget\n\ -_0801943C: .4byte gBitTable\n\ -_08019440: .4byte gBattlescriptCurrInstr\n\ -_08019444: .4byte BattleScript_CuteCharmActivates\n\ -_08019448:\n\ - movs r5, 0\n\ - mov r10, r5\n\ - ldr r0, _0801947C @ =gNoOfAllBanks\n\ - ldrb r0, [r0]\n\ - cmp r10, r0\n\ - bcc _08019458\n\ - bl _08019F76\n\ -_08019458:\n\ - ldr r1, _08019480 @ =gBattleMons\n\ - movs r0, 0x58\n\ - mov r2, r10\n\ - muls r2, r0\n\ - adds r0, r2, 0\n\ - adds r0, r1\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - subs r0, 0x7\n\ - adds r2, r1, 0\n\ - cmp r0, 0x41\n\ - bls _08019472\n\ - b _080196D6\n\ -_08019472:\n\ - lsls r0, 2\n\ - ldr r1, _08019484 @ =_08019488\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .align 2, 0\n\ -_0801947C: .4byte gNoOfAllBanks\n\ -_08019480: .4byte gBattleMons\n\ -_08019484: .4byte _08019488\n\ - .align 2, 0\n\ -_08019488:\n\ - .4byte _080195EC\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196B0\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _08019614\n\ - .4byte _080196D6\n\ - .4byte _08019590\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080195BC\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _08019680\n\ - .4byte _08019650\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _080196D6\n\ - .4byte _08019614\n\ -_08019590:\n\ - movs r0, 0x58\n\ - mov r3, r10\n\ - muls r3, r0\n\ - adds r0, r3, 0\n\ - adds r1, r2, 0\n\ - adds r1, 0x4C\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - ldr r1, _080195B0 @ =0x00000f88\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _080195AA\n\ - b _080196D6\n\ -_080195AA:\n\ - ldr r0, _080195B4 @ =gBattleTextBuff1\n\ - ldr r1, _080195B8 @ =gStatusConditionString_PoisonJpn\n\ - b _0801969C\n\ - .align 2, 0\n\ -_080195B0: .4byte 0x00000f88\n\ -_080195B4: .4byte gBattleTextBuff1\n\ -_080195B8: .4byte gStatusConditionString_PoisonJpn\n\ -_080195BC:\n\ - movs r0, 0x58\n\ - mov r1, r10\n\ - muls r1, r0\n\ - adds r0, r1, 0\n\ - adds r1, r2, 0\n\ - adds r1, 0x50\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - movs r1, 0x7\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _080195D6\n\ - b _080196D6\n\ -_080195D6:\n\ - ldr r0, _080195E4 @ =gBattleTextBuff1\n\ - ldr r1, _080195E8 @ =gStatusConditionString_ConfusionJpn\n\ - bl StringCopy\n\ - movs r2, 0x2\n\ - mov r9, r2\n\ - b _080196DC\n\ - .align 2, 0\n\ -_080195E4: .4byte gBattleTextBuff1\n\ -_080195E8: .4byte gStatusConditionString_ConfusionJpn\n\ -_080195EC:\n\ - movs r0, 0x58\n\ - mov r3, r10\n\ - muls r3, r0\n\ - adds r0, r3, 0\n\ - adds r1, r2, 0\n\ - adds r1, 0x4C\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - movs r1, 0x40\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080196D6\n\ - ldr r0, _0801960C @ =gBattleTextBuff1\n\ - ldr r1, _08019610 @ =gStatusConditionString_ParalysisJpn\n\ - b _0801969C\n\ - .align 2, 0\n\ -_0801960C: .4byte gBattleTextBuff1\n\ -_08019610: .4byte gStatusConditionString_ParalysisJpn\n\ -_08019614:\n\ - movs r0, 0x58\n\ - mov r3, r10\n\ - muls r3, r0\n\ - adds r0, r2, 0\n\ - adds r0, 0x4C\n\ - adds r0, r3, r0\n\ - ldr r0, [r0]\n\ - movs r1, 0x7\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080196D6\n\ - adds r2, 0x50\n\ - adds r2, r3, r2\n\ - ldr r0, [r2]\n\ - ldr r1, _08019644 @ =0xf7ffffff\n\ - ands r0, r1\n\ - str r0, [r2]\n\ - ldr r0, _08019648 @ =gBattleTextBuff1\n\ - ldr r1, _0801964C @ =gStatusConditionString_SleepJpn\n\ - bl StringCopy\n\ - movs r0, 0x1\n\ - mov r9, r0\n\ - b _080196DC\n\ - .align 2, 0\n\ -_08019644: .4byte 0xf7ffffff\n\ -_08019648: .4byte gBattleTextBuff1\n\ -_0801964C: .4byte gStatusConditionString_SleepJpn\n\ -_08019650:\n\ - movs r0, 0x58\n\ - mov r1, r10\n\ - muls r1, r0\n\ - adds r0, r1, 0\n\ - adds r1, r2, 0\n\ - adds r1, 0x4C\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - movs r1, 0x10\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080196D6\n\ - ldr r0, _08019678 @ =gBattleTextBuff1\n\ - ldr r1, _0801967C @ =gStatusConditionString_BurnJpn\n\ - bl StringCopy\n\ - movs r2, 0x1\n\ - mov r9, r2\n\ - b _080196DC\n\ - .align 2, 0\n\ -_08019678: .4byte gBattleTextBuff1\n\ -_0801967C: .4byte gStatusConditionString_BurnJpn\n\ -_08019680:\n\ - movs r0, 0x58\n\ - mov r3, r10\n\ - muls r3, r0\n\ - adds r0, r3, 0\n\ - adds r1, r2, 0\n\ - adds r1, 0x4C\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - movs r1, 0x20\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080196D6\n\ - ldr r0, _080196A8 @ =gBattleTextBuff1\n\ - ldr r1, _080196AC @ =gStatusConditionString_IceJpn\n\ -_0801969C:\n\ - bl StringCopy\n\ - movs r5, 0x1\n\ - mov r9, r5\n\ - b _080196DC\n\ - .align 2, 0\n\ -_080196A8: .4byte gBattleTextBuff1\n\ -_080196AC: .4byte gStatusConditionString_IceJpn\n\ -_080196B0:\n\ - movs r0, 0x58\n\ - mov r1, r10\n\ - muls r1, r0\n\ - adds r0, r1, 0\n\ - adds r1, r2, 0\n\ - adds r1, 0x50\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - movs r1, 0xF0\n\ - lsls r1, 12\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080196D6\n\ - ldr r0, _080196EC @ =gBattleTextBuff1\n\ - ldr r1, _080196F0 @ =gStatusConditionString_LoveJpn\n\ - bl StringCopy\n\ - movs r2, 0x3\n\ - mov r9, r2\n\ -_080196D6:\n\ - mov r3, r9\n\ - cmp r3, 0\n\ - beq _08019798\n\ -_080196DC:\n\ - mov r5, r9\n\ - cmp r5, 0x2\n\ - beq _08019710\n\ - cmp r5, 0x2\n\ - bgt _080196F4\n\ - cmp r5, 0x1\n\ - beq _080196FC\n\ - b _0801973C\n\ - .align 2, 0\n\ -_080196EC: .4byte gBattleTextBuff1\n\ -_080196F0: .4byte gStatusConditionString_LoveJpn\n\ -_080196F4:\n\ - mov r0, r9\n\ - cmp r0, 0x3\n\ - beq _08019728\n\ - b _0801973C\n\ -_080196FC:\n\ - ldr r1, _0801970C @ =gBattleMons\n\ - movs r0, 0x58\n\ - mov r2, r10\n\ - muls r2, r0\n\ - adds r1, 0x4C\n\ - adds r2, r1\n\ - movs r0, 0\n\ - b _0801973A\n\ - .align 2, 0\n\ -_0801970C: .4byte gBattleMons\n\ -_08019710:\n\ - ldr r1, _08019724 @ =gBattleMons\n\ - movs r0, 0x58\n\ - mov r2, r10\n\ - muls r2, r0\n\ - adds r1, 0x50\n\ - adds r2, r1\n\ - ldr r0, [r2]\n\ - movs r1, 0x8\n\ - negs r1, r1\n\ - b _08019738\n\ - .align 2, 0\n\ -_08019724: .4byte gBattleMons\n\ -_08019728:\n\ - ldr r1, _08019778 @ =gBattleMons\n\ - movs r0, 0x58\n\ - mov r2, r10\n\ - muls r2, r0\n\ - adds r1, 0x50\n\ - adds r2, r1\n\ - ldr r0, [r2]\n\ - ldr r1, _0801977C @ =0xfff0ffff\n\ -_08019738:\n\ - ands r0, r1\n\ -_0801973A:\n\ - str r0, [r2]\n\ -_0801973C:\n\ - bl b_movescr_stack_push_cursor\n\ - ldr r1, _08019780 @ =gBattlescriptCurrInstr\n\ - ldr r0, _08019784 @ =gUnknown_081D9956\n\ - str r0, [r1]\n\ - ldr r0, _08019788 @ =0x02000000\n\ - ldr r1, _0801978C @ =0x00016003\n\ - adds r0, r1\n\ - mov r2, r10\n\ - strb r2, [r0]\n\ - ldr r4, _08019790 @ =gActiveBank\n\ - strb r2, [r4]\n\ - ldrb r1, [r4]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - ldr r1, _08019794 @ =gUnknown_02024ACC\n\ - adds r0, r1\n\ - str r0, [sp]\n\ - movs r0, 0\n\ - movs r1, 0x28\n\ - movs r2, 0\n\ - movs r3, 0x4\n\ - bl EmitSetAttributes\n\ - ldrb r0, [r4]\n\ - bl MarkBufferBankForExecution\n\ - bl _08019F92\n\ - .align 2, 0\n\ -_08019778: .4byte gBattleMons\n\ -_0801977C: .4byte 0xfff0ffff\n\ -_08019780: .4byte gBattlescriptCurrInstr\n\ -_08019784: .4byte gUnknown_081D9956\n\ -_08019788: .4byte 0x02000000\n\ -_0801978C: .4byte 0x00016003\n\ -_08019790: .4byte gActiveBank\n\ -_08019794: .4byte gUnknown_02024ACC\n\ -_08019798:\n\ - mov r0, r10\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r10, r0\n\ - ldr r0, _080197B0 @ =gNoOfAllBanks\n\ - ldrb r0, [r0]\n\ - cmp r10, r0\n\ - bcs _080197AC\n\ - b _08019458\n\ -_080197AC:\n\ - bl _08019F76\n\ - .align 2, 0\n\ -_080197B0: .4byte gNoOfAllBanks\n\ -_080197B4:\n\ - movs r3, 0\n\ - mov r10, r3\n\ - ldr r0, _080197FC @ =gNoOfAllBanks\n\ - ldrb r0, [r0]\n\ - cmp r10, r0\n\ - bcc _080197C2\n\ - b _08019F76\n\ -_080197C2:\n\ - ldr r4, _08019800 @ =gBattleMons\n\ -_080197C4:\n\ - movs r0, 0x58\n\ - mov r5, r10\n\ - muls r5, r0\n\ - adds r0, r5, 0\n\ - adds r0, r4\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x3B\n\ - bne _080197E8\n\ - mov r0, r10\n\ - bl CastformDataTypeChange\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r9, r0\n\ - cmp r0, 0\n\ - beq _080197E8\n\ - b _08019E40\n\ -_080197E8:\n\ - mov r0, r10\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r10, r0\n\ - ldr r0, _080197FC @ =gNoOfAllBanks\n\ - ldrb r0, [r0]\n\ - cmp r10, r0\n\ - bcc _080197C4\n\ - b _08019F76\n\ - .align 2, 0\n\ -_080197FC: .4byte gNoOfAllBanks\n\ -_08019800: .4byte gBattleMons\n\ -_08019804:\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - cmp r0, 0x1C\n\ - beq _0801980E\n\ - b _08019F76\n\ -_0801980E:\n\ - ldr r4, _08019860 @ =gHitMarker\n\ - ldr r1, [r4]\n\ - movs r0, 0x80\n\ - lsls r0, 7\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801981E\n\ - b _08019F76\n\ -_0801981E:\n\ - ldr r0, _08019864 @ =0xffffbfff\n\ - ands r1, r0\n\ - str r1, [r4]\n\ - ldr r3, _08019868 @ =0x000160ca\n\ - adds r2, r7, r3\n\ - ldrb r1, [r2]\n\ - movs r0, 0x3F\n\ - ands r0, r1\n\ - strb r0, [r2]\n\ - cmp r0, 0x6\n\ - bne _08019838\n\ - movs r0, 0x2\n\ - strb r0, [r2]\n\ -_08019838:\n\ - ldr r1, _0801986C @ =gBattleCommunication\n\ - ldrb r0, [r2]\n\ - adds r0, 0x40\n\ - strb r0, [r1, 0x3]\n\ - ldr r0, _08019870 @ =gBankTarget\n\ - ldrb r1, [r0]\n\ - ldr r5, _08019874 @ =0x00016003\n\ - adds r0, r7, r5\n\ - strb r1, [r0]\n\ - bl b_movescr_stack_push_cursor\n\ - ldr r1, _08019878 @ =gBattlescriptCurrInstr\n\ - ldr r0, _0801987C @ =BattleScript_SynchronizeActivates\n\ - str r0, [r1]\n\ - ldr r0, [r4]\n\ - movs r1, 0x80\n\ - lsls r1, 6\n\ - orrs r0, r1\n\ - str r0, [r4]\n\ - b _08019F22\n\ - .align 2, 0\n\ -_08019860: .4byte gHitMarker\n\ -_08019864: .4byte 0xffffbfff\n\ -_08019868: .4byte 0x000160ca\n\ -_0801986C: .4byte gBattleCommunication\n\ -_08019870: .4byte gBankTarget\n\ -_08019874: .4byte 0x00016003\n\ -_08019878: .4byte gBattlescriptCurrInstr\n\ -_0801987C: .4byte BattleScript_SynchronizeActivates\n\ -_08019880:\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - cmp r0, 0x1C\n\ - beq _0801988A\n\ - b _08019F76\n\ -_0801988A:\n\ - ldr r4, _080198DC @ =gHitMarker\n\ - ldr r1, [r4]\n\ - movs r0, 0x80\n\ - lsls r0, 7\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801989A\n\ - b _08019F76\n\ -_0801989A:\n\ - ldr r0, _080198E0 @ =0xffffbfff\n\ - ands r1, r0\n\ - str r1, [r4]\n\ - ldr r3, _080198E4 @ =0x000160ca\n\ - adds r2, r7, r3\n\ - ldrb r1, [r2]\n\ - movs r0, 0x3F\n\ - ands r0, r1\n\ - strb r0, [r2]\n\ - cmp r0, 0x6\n\ - bne _080198B4\n\ - movs r0, 0x2\n\ - strb r0, [r2]\n\ -_080198B4:\n\ - ldr r1, _080198E8 @ =gBattleCommunication\n\ - ldrb r0, [r2]\n\ - strb r0, [r1, 0x3]\n\ - ldr r0, _080198EC @ =gBankAttacker\n\ - ldrb r1, [r0]\n\ - ldr r5, _080198F0 @ =0x00016003\n\ - adds r0, r7, r5\n\ - strb r1, [r0]\n\ - bl b_movescr_stack_push_cursor\n\ - ldr r1, _080198F4 @ =gBattlescriptCurrInstr\n\ - ldr r0, _080198F8 @ =BattleScript_SynchronizeActivates\n\ - str r0, [r1]\n\ - ldr r0, [r4]\n\ - movs r1, 0x80\n\ - lsls r1, 6\n\ - orrs r0, r1\n\ - str r0, [r4]\n\ - b _08019F22\n\ - .align 2, 0\n\ -_080198DC: .4byte gHitMarker\n\ -_080198E0: .4byte 0xffffbfff\n\ -_080198E4: .4byte 0x000160ca\n\ -_080198E8: .4byte gBattleCommunication\n\ -_080198EC: .4byte gBankAttacker\n\ -_080198F0: .4byte 0x00016003\n\ -_080198F4: .4byte gBattlescriptCurrInstr\n\ -_080198F8: .4byte BattleScript_SynchronizeActivates\n\ -_080198FC:\n\ - movs r4, 0\n\ - ldr r0, _08019934 @ =gNoOfAllBanks\n\ - ldrb r1, [r0]\n\ - cmp r4, r1\n\ - blt _08019908\n\ - b _08019F76\n\ -_08019908:\n\ - ldr r0, _08019938 @ =gBattleMons\n\ - adds r5, r1, 0\n\ - ldr r2, _0801993C @ =gStatuses3\n\ - adds r3, r0, 0\n\ - adds r3, 0x20\n\ - movs r6, 0x80\n\ - lsls r6, 12\n\ -_08019916:\n\ - ldrb r1, [r3]\n\ - cmp r1, 0x16\n\ - bne _08019926\n\ - ldr r0, [r2]\n\ - ands r0, r6\n\ - cmp r0, 0\n\ - beq _08019926\n\ - b _08019E6C\n\ -_08019926:\n\ - adds r2, 0x4\n\ - adds r3, 0x58\n\ - adds r4, 0x1\n\ - cmp r4, r5\n\ - blt _08019916\n\ - b _08019F76\n\ - .align 2, 0\n\ -_08019934: .4byte gNoOfAllBanks\n\ -_08019938: .4byte gBattleMons\n\ -_0801993C: .4byte gStatuses3\n\ -_08019940:\n\ - movs r4, 0\n\ - ldr r0, _08019A1C @ =gNoOfAllBanks\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - blt _0801994C\n\ - b _08019F76\n\ -_0801994C:\n\ - ldr r0, _08019A20 @ =gActiveBank\n\ - mov r8, r0\n\ - ldr r1, _08019A24 @ =gBattleMons\n\ - adds r1, 0x20\n\ - str r1, [sp, 0x1C]\n\ - movs r2, 0\n\ - str r2, [sp, 0x20]\n\ -_0801995A:\n\ - ldr r3, [sp, 0x1C]\n\ - ldrb r0, [r3]\n\ - cmp r0, 0x24\n\ - beq _08019964\n\ - b _08019AF6\n\ -_08019964:\n\ - ldr r0, _08019A28 @ =gStatuses3\n\ - ldr r5, [sp, 0x20]\n\ - adds r0, r5, r0\n\ - ldr r1, [r0]\n\ - movs r0, 0x80\n\ - lsls r0, 13\n\ - ands r1, r0\n\ - str r5, [sp, 0x18]\n\ - cmp r1, 0\n\ - bne _0801997A\n\ - b _08019AF6\n\ -_0801997A:\n\ - lsls r0, r4, 24\n\ - lsrs r0, 24\n\ - bl GetBankIdentity\n\ - movs r1, 0x1\n\ - adds r5, r0, 0\n\ - eors r5, r1\n\ - ands r5, r1\n\ - adds r0, r5, 0\n\ - bl GetBankByPlayerAI\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - adds r0, r5, 0x2\n\ - bl GetBankByPlayerAI\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - ldr r0, _08019A2C @ =gBattleTypeFlags\n\ - ldrh r1, [r0]\n\ - movs r2, 0x1\n\ - adds r0, r2, 0\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _080199AE\n\ - b _08019ABC\n\ -_080199AE:\n\ - movs r1, 0x58\n\ - adds r0, r6, 0\n\ - muls r0, r1\n\ - ldr r3, _08019A24 @ =gBattleMons\n\ - adds r1, r0, r3\n\ - adds r0, r1, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - beq _08019A78\n\ - ldrh r0, [r1, 0x28]\n\ - cmp r0, 0\n\ - beq _08019A34\n\ - movs r1, 0x58\n\ - adds r0, r7, 0\n\ - muls r0, r1\n\ - adds r1, r0, r3\n\ - adds r0, r1, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - beq _08019A34\n\ - ldrh r0, [r1, 0x28]\n\ - cmp r0, 0\n\ - beq _08019A34\n\ - str r2, [sp, 0x24]\n\ - bl Random\n\ - ldr r2, [sp, 0x24]\n\ - adds r1, r2, 0\n\ - ands r1, r0\n\ - lsls r1, 1\n\ - orrs r5, r1\n\ - adds r0, r5, 0\n\ - bl GetBankByPlayerAI\n\ - mov r2, r8\n\ - strb r0, [r2]\n\ - ldrb r0, [r2]\n\ - movs r3, 0x58\n\ - muls r0, r3\n\ - ldr r5, _08019A24 @ =gBattleMons\n\ - adds r0, r5\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - ldr r1, [sp, 0x1C]\n\ - strb r0, [r1]\n\ - ldrb r0, [r2]\n\ - muls r0, r3\n\ - adds r0, r5\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - ldr r2, _08019A30 @ =gLastUsedAbility\n\ - strb r0, [r2]\n\ - b _08019AE4\n\ - .align 2, 0\n\ -_08019A1C: .4byte gNoOfAllBanks\n\ -_08019A20: .4byte gActiveBank\n\ -_08019A24: .4byte gBattleMons\n\ -_08019A28: .4byte gStatuses3\n\ -_08019A2C: .4byte gBattleTypeFlags\n\ -_08019A30: .4byte gLastUsedAbility\n\ -_08019A34:\n\ - ldr r3, _08019A74 @ =gBattleMons\n\ - movs r2, 0x58\n\ - adds r0, r6, 0\n\ - muls r0, r2\n\ - adds r1, r0, r3\n\ - adds r0, r1, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - beq _08019A78\n\ - ldrh r0, [r1, 0x28]\n\ - cmp r0, 0\n\ - beq _08019A78\n\ - mov r5, r8\n\ - strb r6, [r5]\n\ - adds r1, r4, 0\n\ - muls r1, r2\n\ - adds r1, r3\n\ - ldrb r0, [r5]\n\ - muls r0, r2\n\ - adds r0, r3\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - adds r1, 0x20\n\ - strb r0, [r1]\n\ - ldrb r0, [r5]\n\ - muls r0, r2\n\ - adds r0, r3\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - b _08019AE0\n\ - .align 2, 0\n\ -_08019A74: .4byte gBattleMons\n\ -_08019A78:\n\ - ldr r3, _08019AB8 @ =gBattleMons\n\ - movs r2, 0x58\n\ - adds r0, r7, 0\n\ - muls r0, r2\n\ - adds r1, r0, r3\n\ - adds r0, r1, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - beq _08019AEE\n\ - ldrh r0, [r1, 0x28]\n\ - cmp r0, 0\n\ - beq _08019AEE\n\ - mov r5, r8\n\ - strb r7, [r5]\n\ - adds r1, r4, 0\n\ - muls r1, r2\n\ - adds r1, r3\n\ - ldrb r0, [r5]\n\ - muls r0, r2\n\ - adds r0, r3\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - adds r1, 0x20\n\ - strb r0, [r1]\n\ - ldrb r0, [r5]\n\ - muls r0, r2\n\ - adds r0, r3\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - b _08019AE0\n\ - .align 2, 0\n\ -_08019AB8: .4byte gBattleMons\n\ -_08019ABC:\n\ - mov r2, r8\n\ - strb r6, [r2]\n\ - movs r3, 0x58\n\ - adds r0, r6, 0\n\ - muls r0, r3\n\ - ldr r5, _08019B10 @ =gBattleMons\n\ - adds r0, r5\n\ - adds r2, r0, 0\n\ - adds r2, 0x20\n\ - ldrb r1, [r2]\n\ - cmp r1, 0\n\ - beq _08019AEE\n\ - ldrh r0, [r0, 0x28]\n\ - cmp r0, 0\n\ - beq _08019AEE\n\ - ldr r0, [sp, 0x1C]\n\ - strb r1, [r0]\n\ - ldrb r0, [r2]\n\ -_08019AE0:\n\ - ldr r1, _08019B14 @ =gLastUsedAbility\n\ - strb r0, [r1]\n\ -_08019AE4:\n\ - mov r0, r9\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r9, r0\n\ -_08019AEE:\n\ - mov r2, r9\n\ - cmp r2, 0\n\ - beq _08019AF6\n\ - b _08019E88\n\ -_08019AF6:\n\ - ldr r3, [sp, 0x1C]\n\ - adds r3, 0x58\n\ - str r3, [sp, 0x1C]\n\ - ldr r5, [sp, 0x20]\n\ - adds r5, 0x4\n\ - str r5, [sp, 0x20]\n\ - adds r4, 0x1\n\ - ldr r0, _08019B18 @ =gNoOfAllBanks\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - bge _08019B0E\n\ - b _0801995A\n\ -_08019B0E:\n\ - b _08019F76\n\ - .align 2, 0\n\ -_08019B10: .4byte gBattleMons\n\ -_08019B14: .4byte gLastUsedAbility\n\ -_08019B18: .4byte gNoOfAllBanks\n\ -_08019B1C:\n\ - movs r4, 0\n\ - ldr r0, _08019B54 @ =gNoOfAllBanks\n\ - ldrb r1, [r0]\n\ - cmp r4, r1\n\ - blt _08019B28\n\ - b _08019F76\n\ -_08019B28:\n\ - ldr r0, _08019B58 @ =gBattleMons\n\ - adds r5, r1, 0\n\ - ldr r2, _08019B5C @ =gStatuses3\n\ - adds r3, r0, 0\n\ - adds r3, 0x20\n\ - movs r6, 0x80\n\ - lsls r6, 12\n\ -_08019B36:\n\ - ldrb r1, [r3]\n\ - cmp r1, 0x16\n\ - bne _08019B46\n\ - ldr r0, [r2]\n\ - ands r0, r6\n\ - cmp r0, 0\n\ - beq _08019B46\n\ - b _08019F04\n\ -_08019B46:\n\ - adds r2, 0x4\n\ - adds r3, 0x58\n\ - adds r4, 0x1\n\ - cmp r4, r5\n\ - blt _08019B36\n\ - b _08019F76\n\ - .align 2, 0\n\ -_08019B54: .4byte gNoOfAllBanks\n\ -_08019B58: .4byte gBattleMons\n\ -_08019B5C: .4byte gStatuses3\n\ -_08019B60:\n\ - mov r0, r10\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - movs r4, 0\n\ - ldr r0, _08019BB0 @ =gNoOfAllBanks\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - blt _08019B76\n\ - b _08019F76\n\ -_08019B76:\n\ - ldr r7, _08019BB4 @ =gBattleMons\n\ -_08019B78:\n\ - lsls r0, r4, 24\n\ - lsrs r0, 24\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - adds r3, r4, 0x1\n\ - cmp r0, r5\n\ - beq _08019BA2\n\ - movs r0, 0x58\n\ - muls r0, r4\n\ - adds r0, r7\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, r6\n\ - bne _08019BA2\n\ - ldr r0, _08019BB8 @ =gLastUsedAbility\n\ - strb r6, [r0]\n\ - lsls r0, r3, 24\n\ - lsrs r0, 24\n\ - mov r9, r0\n\ -_08019BA2:\n\ - adds r4, r3, 0\n\ - ldr r0, _08019BB0 @ =gNoOfAllBanks\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - blt _08019B78\n\ - b _08019F76\n\ - .align 2, 0\n\ -_08019BB0: .4byte gNoOfAllBanks\n\ -_08019BB4: .4byte gBattleMons\n\ -_08019BB8: .4byte gLastUsedAbility\n\ -_08019BBC:\n\ - mov r0, r10\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - movs r4, 0\n\ - ldr r0, _08019C0C @ =gNoOfAllBanks\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - blt _08019BD2\n\ - b _08019F76\n\ -_08019BD2:\n\ - ldr r7, _08019C10 @ =gBattleMons\n\ -_08019BD4:\n\ - lsls r0, r4, 24\n\ - lsrs r0, 24\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - adds r3, r4, 0x1\n\ - cmp r0, r5\n\ - bne _08019BFE\n\ - movs r0, 0x58\n\ - muls r0, r4\n\ - adds r0, r7\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, r6\n\ - bne _08019BFE\n\ - ldr r0, _08019C14 @ =gLastUsedAbility\n\ - strb r6, [r0]\n\ - lsls r0, r3, 24\n\ - lsrs r0, 24\n\ - mov r9, r0\n\ -_08019BFE:\n\ - adds r4, r3, 0\n\ - ldr r0, _08019C0C @ =gNoOfAllBanks\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - blt _08019BD4\n\ - b _08019F76\n\ - .align 2, 0\n\ -_08019C0C: .4byte gNoOfAllBanks\n\ -_08019C10: .4byte gBattleMons\n\ -_08019C14: .4byte gLastUsedAbility\n\ -_08019C18:\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - cmp r0, 0xFD\n\ - beq _08019C40\n\ - cmp r0, 0xFE\n\ - beq _08019C78\n\ - movs r4, 0\n\ - ldr r0, _08019C38 @ =gNoOfAllBanks\n\ - adds r5, r0, 0\n\ - ldrb r2, [r5]\n\ - cmp r4, r2\n\ - blt _08019C32\n\ - b _08019F76\n\ -_08019C32:\n\ - ldr r2, _08019C3C @ =gBattleMons\n\ - b _08019CB0\n\ - .align 2, 0\n\ -_08019C38: .4byte gNoOfAllBanks\n\ -_08019C3C: .4byte gBattleMons\n\ -_08019C40:\n\ - movs r4, 0\n\ - ldr r0, _08019C70 @ =gNoOfAllBanks\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - blt _08019C4C\n\ - b _08019F76\n\ -_08019C4C:\n\ - ldr r5, _08019C74 @ =gStatuses3\n\ - movs r2, 0x80\n\ - lsls r2, 9\n\ - adds r1, r0, 0\n\ -_08019C54:\n\ - lsls r0, r4, 2\n\ - adds r0, r5\n\ - ldr r0, [r0]\n\ - ands r0, r2\n\ - adds r3, r4, 0x1\n\ - cmp r0, 0\n\ - beq _08019C68\n\ - lsls r0, r3, 24\n\ - lsrs r0, 24\n\ - mov r9, r0\n\ -_08019C68:\n\ - adds r4, r3, 0\n\ - cmp r4, r1\n\ - blt _08019C54\n\ - b _08019F76\n\ - .align 2, 0\n\ -_08019C70: .4byte gNoOfAllBanks\n\ -_08019C74: .4byte gStatuses3\n\ -_08019C78:\n\ - movs r4, 0\n\ - ldr r0, _08019CA8 @ =gNoOfAllBanks\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - blt _08019C84\n\ - b _08019F76\n\ -_08019C84:\n\ - ldr r5, _08019CAC @ =gStatuses3\n\ - movs r2, 0x80\n\ - lsls r2, 10\n\ - adds r1, r0, 0\n\ -_08019C8C:\n\ - lsls r0, r4, 2\n\ - adds r0, r5\n\ - ldr r0, [r0]\n\ - ands r0, r2\n\ - adds r3, r4, 0x1\n\ - cmp r0, 0\n\ - beq _08019CA0\n\ - lsls r0, r3, 24\n\ - lsrs r0, 24\n\ - mov r9, r0\n\ -_08019CA0:\n\ - adds r4, r3, 0\n\ - cmp r4, r1\n\ - blt _08019C8C\n\ - b _08019F76\n\ - .align 2, 0\n\ -_08019CA8: .4byte gNoOfAllBanks\n\ -_08019CAC: .4byte gStatuses3\n\ -_08019CB0:\n\ - movs r0, 0x58\n\ - muls r0, r4\n\ - adds r0, r2\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - adds r3, r4, 0x1\n\ - cmp r0, r6\n\ - bne _08019CCA\n\ - mov r0, r8\n\ - strb r6, [r0]\n\ - lsls r0, r3, 24\n\ - lsrs r0, 24\n\ - mov r9, r0\n\ -_08019CCA:\n\ - adds r4, r3, 0\n\ - ldrb r1, [r5]\n\ - cmp r4, r1\n\ - blt _08019CB0\n\ - b _08019F76\n\ -_08019CD4:\n\ - movs r4, 0\n\ - ldr r0, _08019D10 @ =gNoOfAllBanks\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - blt _08019CE0\n\ - b _08019F76\n\ -_08019CE0:\n\ - ldr r7, _08019D14 @ =gBattleMons\n\ - adds r2, r0, 0\n\ - movs r5, 0x58\n\ -_08019CE6:\n\ - adds r0, r4, 0\n\ - muls r0, r5\n\ - adds r1, r0, r7\n\ - adds r0, r1, 0\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - adds r3, r4, 0x1\n\ - cmp r0, r6\n\ - bne _08019D08\n\ - ldrh r0, [r1, 0x28]\n\ - cmp r0, 0\n\ - beq _08019D08\n\ - mov r0, r8\n\ - strb r6, [r0]\n\ - lsls r0, r3, 24\n\ - lsrs r0, 24\n\ - mov r9, r0\n\ -_08019D08:\n\ - adds r4, r3, 0\n\ - cmp r4, r2\n\ - blt _08019CE6\n\ - b _08019F76\n\ - .align 2, 0\n\ -_08019D10: .4byte gNoOfAllBanks\n\ -_08019D14: .4byte gBattleMons\n\ -_08019D18:\n\ - movs r4, 0\n\ - ldr r0, _08019D50 @ =gNoOfAllBanks\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - blt _08019D24\n\ - b _08019F76\n\ -_08019D24:\n\ - ldr r7, _08019D54 @ =gBattleMons\n\ - adds r1, r0, 0\n\ - movs r5, 0x58\n\ - ldr r2, _08019D58 @ =gLastUsedAbility\n\ -_08019D2C:\n\ - adds r0, r4, 0\n\ - muls r0, r5\n\ - adds r0, r7\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - adds r3, r4, 0x1\n\ - cmp r0, r6\n\ - bne _08019D48\n\ - cmp r4, r10\n\ - beq _08019D48\n\ - strb r6, [r2]\n\ - lsls r0, r3, 24\n\ - lsrs r0, 24\n\ - mov r9, r0\n\ -_08019D48:\n\ - adds r4, r3, 0\n\ - cmp r4, r1\n\ - blt _08019D2C\n\ - b _08019F76\n\ - .align 2, 0\n\ -_08019D50: .4byte gNoOfAllBanks\n\ -_08019D54: .4byte gBattleMons\n\ -_08019D58: .4byte gLastUsedAbility\n\ -_08019D5C:\n\ - mov r0, r10\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - movs r4, 0\n\ - ldr r0, _08019DAC @ =gNoOfAllBanks\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - blt _08019D72\n\ - b _08019F76\n\ -_08019D72:\n\ - ldr r7, _08019DB0 @ =gBattleMons\n\ -_08019D74:\n\ - lsls r0, r4, 24\n\ - lsrs r0, 24\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, r5\n\ - beq _08019DA0\n\ - movs r0, 0x58\n\ - muls r0, r4\n\ - adds r0, r7\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, r6\n\ - bne _08019DA0\n\ - ldr r0, _08019DB4 @ =gLastUsedAbility\n\ - strb r6, [r0]\n\ - mov r0, r9\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r9, r0\n\ -_08019DA0:\n\ - adds r4, 0x1\n\ - ldr r0, _08019DAC @ =gNoOfAllBanks\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - blt _08019D74\n\ - b _08019F76\n\ - .align 2, 0\n\ -_08019DAC: .4byte gNoOfAllBanks\n\ -_08019DB0: .4byte gBattleMons\n\ -_08019DB4: .4byte gLastUsedAbility\n\ -_08019DB8:\n\ - mov r0, r10\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - movs r4, 0\n\ - ldr r0, _08019E08 @ =gNoOfAllBanks\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - blt _08019DCE\n\ - b _08019F76\n\ -_08019DCE:\n\ - ldr r7, _08019E0C @ =gBattleMons\n\ -_08019DD0:\n\ - lsls r0, r4, 24\n\ - lsrs r0, 24\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, r5\n\ - bne _08019DFC\n\ - movs r0, 0x58\n\ - muls r0, r4\n\ - adds r0, r7\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, r6\n\ - bne _08019DFC\n\ - ldr r0, _08019E10 @ =gLastUsedAbility\n\ - strb r6, [r0]\n\ - mov r0, r9\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r9, r0\n\ -_08019DFC:\n\ - adds r4, 0x1\n\ - ldr r0, _08019E08 @ =gNoOfAllBanks\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - blt _08019DD0\n\ - b _08019F76\n\ - .align 2, 0\n\ -_08019E08: .4byte gNoOfAllBanks\n\ -_08019E0C: .4byte gBattleMons\n\ -_08019E10: .4byte gLastUsedAbility\n\ -_08019E14:\n\ - ldr r0, _08019E30 @ =BattleScript_CastformChange\n\ - bl b_push_move_exec\n\ - ldr r0, _08019E34 @ =0x02000000\n\ - ldr r2, _08019E38 @ =0x00016003\n\ - adds r1, r0, r2\n\ - strb r6, [r1]\n\ - mov r1, r9\n\ - subs r1, 0x1\n\ - ldr r3, _08019E3C @ =0x0001609b\n\ - adds r0, r3\n\ - strb r1, [r0]\n\ - b _08019F76\n\ - .align 2, 0\n\ -_08019E30: .4byte BattleScript_CastformChange\n\ -_08019E34: .4byte 0x02000000\n\ -_08019E38: .4byte 0x00016003\n\ -_08019E3C: .4byte 0x0001609b\n\ -_08019E40:\n\ - ldr r0, _08019E5C @ =BattleScript_CastformChange\n\ - bl b_push_move_exec\n\ - ldr r0, _08019E60 @ =0x02000000\n\ - ldr r5, _08019E64 @ =0x00016003\n\ - adds r1, r0, r5\n\ - mov r2, r10\n\ - strb r2, [r1]\n\ - mov r1, r9\n\ - subs r1, 0x1\n\ - ldr r3, _08019E68 @ =0x0001609b\n\ - adds r0, r3\n\ - strb r1, [r0]\n\ - b _08019F92\n\ - .align 2, 0\n\ -_08019E5C: .4byte BattleScript_CastformChange\n\ -_08019E60: .4byte 0x02000000\n\ -_08019E64: .4byte 0x00016003\n\ -_08019E68: .4byte 0x0001609b\n\ -_08019E6C:\n\ - mov r5, r8\n\ - strb r1, [r5]\n\ - ldr r0, [r2]\n\ - ldr r1, _08019E80 @ =0xfff7ffff\n\ - ands r0, r1\n\ - str r0, [r2]\n\ - ldr r0, _08019E84 @ =gUnknown_081D978C\n\ - bl b_push_move_exec\n\ - b _08019F1A\n\ - .align 2, 0\n\ -_08019E80: .4byte 0xfff7ffff\n\ -_08019E84: .4byte gUnknown_081D978C\n\ -_08019E88:\n\ - ldr r0, _08019EDC @ =BattleScript_TraceActivates\n\ - bl b_push_move_exec\n\ - ldr r1, _08019EE0 @ =gStatuses3\n\ - ldr r2, [sp, 0x18]\n\ - adds r1, r2, r1\n\ - ldr r0, [r1]\n\ - ldr r2, _08019EE4 @ =0xffefffff\n\ - ands r0, r2\n\ - str r0, [r1]\n\ - ldr r0, _08019EE8 @ =0x02000000\n\ - ldr r3, _08019EEC @ =0x00016003\n\ - adds r0, r3\n\ - strb r4, [r0]\n\ - ldr r1, _08019EF0 @ =gBattleTextBuff1\n\ - movs r4, 0xFD\n\ - strb r4, [r1]\n\ - movs r0, 0x4\n\ - strb r0, [r1, 0x1]\n\ - ldr r2, _08019EF4 @ =gActiveBank\n\ - ldrb r0, [r2]\n\ - strb r0, [r1, 0x2]\n\ - ldr r3, _08019EF8 @ =gBattlePartyID\n\ - ldrb r0, [r2]\n\ - lsls r0, 1\n\ - adds r0, r3\n\ - ldrh r0, [r0]\n\ - strb r0, [r1, 0x3]\n\ - movs r0, 0xFF\n\ - strb r0, [r1, 0x4]\n\ - ldr r1, _08019EFC @ =gBattleTextBuff2\n\ - strb r4, [r1]\n\ - movs r0, 0x9\n\ - strb r0, [r1, 0x1]\n\ - ldr r0, _08019F00 @ =gLastUsedAbility\n\ - ldrb r0, [r0]\n\ - strb r0, [r1, 0x2]\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - strb r0, [r1, 0x3]\n\ - b _08019F76\n\ - .align 2, 0\n\ -_08019EDC: .4byte BattleScript_TraceActivates\n\ -_08019EE0: .4byte gStatuses3\n\ -_08019EE4: .4byte 0xffefffff\n\ -_08019EE8: .4byte 0x02000000\n\ -_08019EEC: .4byte 0x00016003\n\ -_08019EF0: .4byte gBattleTextBuff1\n\ -_08019EF4: .4byte gActiveBank\n\ -_08019EF8: .4byte gBattlePartyID\n\ -_08019EFC: .4byte gBattleTextBuff2\n\ -_08019F00: .4byte gLastUsedAbility\n\ -_08019F04:\n\ - mov r5, r8\n\ - strb r1, [r5]\n\ - ldr r0, [r2]\n\ - ldr r1, _08019F30 @ =0xfff7ffff\n\ - ands r0, r1\n\ - str r0, [r2]\n\ - bl b_movescr_stack_push_cursor\n\ - ldr r1, _08019F34 @ =gBattlescriptCurrInstr\n\ - ldr r0, _08019F38 @ =gUnknown_081D9795\n\ - str r0, [r1]\n\ -_08019F1A:\n\ - ldr r0, _08019F3C @ =0x02000000\n\ - ldr r1, _08019F40 @ =0x000160dd\n\ - adds r0, r1\n\ - strb r4, [r0]\n\ -_08019F22:\n\ - mov r0, r9\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r9, r0\n\ - b _08019F76\n\ - .align 2, 0\n\ -_08019F30: .4byte 0xfff7ffff\n\ -_08019F34: .4byte gBattlescriptCurrInstr\n\ -_08019F38: .4byte gUnknown_081D9795\n\ -_08019F3C: .4byte 0x02000000\n\ -_08019F40: .4byte 0x000160dd\n\ -_08019F44:\n\ - movs r4, 0\n\ - ldr r0, _08019FA4 @ =gNoOfAllBanks\n\ - ldrb r1, [r0]\n\ - cmp r4, r1\n\ - bge _08019F76\n\ - ldr r0, _08019FA8 @ =gBattleMons\n\ - adds r2, r1, 0\n\ - adds r1, r0, 0\n\ - adds r1, 0x20\n\ - ldr r3, _08019FAC @ =gLastUsedAbility\n\ -_08019F58:\n\ - ldrb r0, [r1]\n\ - cmp r0, r6\n\ - bne _08019F6E\n\ - cmp r4, r10\n\ - beq _08019F6E\n\ - strb r6, [r3]\n\ - mov r0, r9\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r9, r0\n\ -_08019F6E:\n\ - adds r1, 0x58\n\ - adds r4, 0x1\n\ - cmp r4, r2\n\ - blt _08019F58\n\ -_08019F76:\n\ - mov r2, r9\n\ - cmp r2, 0\n\ - beq _08019F92\n\ -_08019F7C:\n\ - ldr r3, [sp, 0x4]\n\ - cmp r3, 0xB\n\ - bhi _08019F92\n\ - ldr r1, _08019FAC @ =gLastUsedAbility\n\ - ldrb r0, [r1]\n\ - cmp r0, 0xFF\n\ - beq _08019F92\n\ - adds r1, r0, 0\n\ - mov r0, r10\n\ - bl RecordAbilityBattle\n\ -_08019F92:\n\ - mov r0, r9\n\ - add sp, 0x28\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_08019FA4: .4byte gNoOfAllBanks\n\ -_08019FA8: .4byte gBattleMons\n\ -_08019FAC: .4byte gLastUsedAbility\n\ - .syntax divided"); -} - -#endif // NONMATCHING - void b_call_bc_move_exec(u8* BS_ptr) { gBattlescriptCurrInstr = BS_ptr; diff --git a/src/battle_4.c b/src/battle/battle_4.c index 65ea765cf..65e0458a2 100644 --- a/src/battle_4.c +++ b/src/battle/battle_4.c @@ -93,6 +93,7 @@ extern u16 gUnknown_02024C2C[4]; //last used moves 2, used by sketch extern u16 gUnknown_030041B0; extern u16 gUnknown_02024C4C[4]; //last used moves by banks, another one extern u8 gCurrentMoveTurn; +extern u16 gTrappingMoves[]; //extern functions u8 AtkCanceller_UnableToUseMove(void); @@ -122,7 +123,7 @@ bool8 IsTradedMon(struct Pokemon*); void b_movescr_stack_pop_cursor(void); void SwitchInClearStructs(void); u8* ConvertIntToDecimalStringN(u8*, s32, u8, u8); -u8 GetNationalPokedexFlag(u16 nationalNum, u8 caseID); +u8 GetSetPokedexFlag(u16 nationalNum, u8 caseID); u16 SpeciesToNationalPokedexNum(u16 species); u8 sub_803FC34(u8 bank); u16 sub_803FBFC(u8 a); @@ -199,6 +200,9 @@ extern u8 BattleScript_TrainerBallBlock[]; extern u8 BattleScript_WallyBallThrow[]; extern u8 BattleScript_SuccessBallThrow[]; extern u8 BattleScript_ShakeBallThrow[]; +extern u8 BattleScript_AllStatsUp[]; +extern u8 BattleScript_AtkDefDown[]; +extern u8 BattleScript_SAtkDown2[]; extern u8 gUnknown_081D919F[]; //spikes1 extern u8 gUnknown_081D9171[]; //spikes2 @@ -211,17 +215,10 @@ extern u8 BattleScript_CastformChange[]; extern u8 gUnknown_081D9834[]; extern u8 gUnknown_081D90FC[]; //bs random switchout extern u8 gUnknown_081D95DB[]; //bs payday money give - -//useful macros -//read via orr -#define BSScriptRead32(ptr) ((ptr)[0] | (ptr)[1] << 8 | (ptr)[2] << 16 | (ptr)[3] << 24) -#define BSScriptRead8(ptr) (((u8)((ptr)[0]))) -#define BSScriptReadPtr(ptr) ((void *)BSScriptRead32(ptr)) - -//read via add -#define BS2ScriptRead32(ptr) ((ptr)[0] + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24)) -#define BS2ScriptRead16(ptr) ((ptr)[0] + ((ptr)[1] << 8)) -#define BS2ScriptReadPtr(ptr) ((void *)BS2ScriptRead32(ptr)) +extern u8 gUnknown_081D8C58[]; +extern u8 gUnknown_081D8C65[]; +extern u8 gUnknown_081D9156[]; +extern u8 gUnknown_081D9468[]; #define TargetProtectAffected ((gProtectStructs[gBankTarget].protected && gBattleMoves[gCurrentMove].flags & FLAG_PROTECT_AFFECTED)) @@ -408,6 +405,7 @@ static void atk85_stockpile(void); static void atk86_stockpiletobasedamage(void); static void atk87_stockpiletohpheal(void); static void atk88_negativedamage(void); +static u8 ChangeStatBuffs(s8, u8, u8, u8*); static void atk89_statbuffchange(void); static void atk8A_normalisebuffs(void); static void atk8B_setbide(void); @@ -862,19 +860,19 @@ static const u32 gStatusFlagsForMoveEffects[] = 0x00000000 }; -extern const u8 BattleScript_1D963E[]; -extern const u8 BattleScript_1D965A[]; -extern const u8 BattleScript_1D9669[]; -extern const u8 BattleScript_1D9678[]; -extern const u8 BattleScript_1D9687[]; -extern const u8 BattleScript_1D969D[]; -extern const u8 BattleScript_1D96BA[]; -extern const u8 BattleScript_1D9696[]; -extern const u8 BattleScript_1D96B1[]; -extern const u8 BattleScript_1D96AA[]; -extern const u8 BattleScript_1D96C8[]; +extern u8 BattleScript_1D963E[]; +extern u8 BattleScript_1D965A[]; +extern u8 BattleScript_1D9669[]; +extern u8 BattleScript_1D9678[]; +extern u8 BattleScript_1D9687[]; +extern u8 BattleScript_1D969D[]; +extern u8 BattleScript_1D96BA[]; +extern u8 BattleScript_1D9696[]; +extern u8 BattleScript_1D96B1[]; +extern u8 BattleScript_1D96AA[]; +extern u8 BattleScript_1D96C8[]; -const u8* const gMoveEffectBS_Ptrs[] = +u8* const gMoveEffectBS_Ptrs[] = { BattleScript_1D963E, BattleScript_1D963E, @@ -919,7 +917,7 @@ const u8* const gMoveEffectBS_Ptrs[] = const u8 sUnreferencedBitMask1[] = {0, 1, 3, 7, 0xF, 0x1F, 0x3F}; -const u8 gLevelUpStatBoxStats[] = {MON_DATA_MAX_HP, MON_DATA_SPATK, MON_DATA_ATK, MON_DATA_SPDEF, MON_DATA_DEF, MON_DATA_SPD}; +const u8 gLevelUpStatBoxStats[] = {MON_DATA_MAX_HP, MON_DATA_SPATK, MON_DATA_ATK, MON_DATA_SPDEF, MON_DATA_DEF, MON_DATA_SPEED}; static const u16 sProtectSuccessRates[] = {0xFFFF, 0x7FFF, 0x3FFF, 0x1FFF}; @@ -947,7 +945,7 @@ static const u16 sUnknown_081FACFE[] = //banned moves to copy 0xFFFF }; -static const u8 sUnknown_081FAD26[] = +static const u8 sUnknown_081FAD26[] = //reversal+flail HP thresholds to power { 1, 200, 4, 150, @@ -1109,7 +1107,7 @@ static void JumpIfMoveFailed(u8 adder, u16 move) { gMoveHitWith[gBankTarget] = 0; gUnknown_02024C44[gBankTarget] = 0; - to_store = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + to_store = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { @@ -1190,13 +1188,13 @@ static bool8 AccuracyCalcHelper(u16 move) static void atk01_accuracycheck(void) { - u16 move = BS2ScriptRead16(gBattlescriptCurrInstr + 5); + u16 move = T2_READ_16(gBattlescriptCurrInstr + 5); if (move == 0xFFFE || move == 0xFFFF) { if (gStatuses3[gBankTarget] & STATUS3_ALWAYS_HITS && move == 0xFFFF && gDisableStructs[gBankTarget].bankWithSureHit == gBankAttacker) gBattlescriptCurrInstr += 7; else if (gStatuses3[gBankTarget] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else if (!JumpIfMoveAffectedByProtect(0)) gBattlescriptCurrInstr += 7; } @@ -1445,73 +1443,71 @@ static void atk06_typecalc(void) { int i = 0; u8 move_type; - if (gCurrentMove == MOVE_STRUGGLE) {goto END;} - - if (BATTLE_STRUCT->dynamicMoveType) - move_type = BATTLE_STRUCT->dynamicMoveType & 0x3F; - else - move_type = gBattleMoves[gCurrentMove].type; - - //check stab - if (gBattleMons[gBankAttacker].type1 == move_type || gBattleMons[gBankAttacker].type2 == move_type) + if (gCurrentMove != MOVE_STRUGGLE) { - gBattleMoveDamage = gBattleMoveDamage * 15; - gBattleMoveDamage = gBattleMoveDamage / 10; - } + if (BATTLE_STRUCT->dynamicMoveType) + move_type = BATTLE_STRUCT->dynamicMoveType & 0x3F; + else + move_type = gBattleMoves[gCurrentMove].type; - if (gBattleMons[gBankTarget].ability == ABILITY_LEVITATE && move_type == TYPE_GROUND) - { - gLastUsedAbility = gBattleMons[gBankTarget].ability; - gBattleMoveFlags |= (MOVESTATUS_MISSED | MOVESTATUS_NOTAFFECTED); - gMoveHitWith[gBankTarget] = 0; - gUnknown_02024C44[gBankTarget] = 0; - gBattleCommunication[6] = move_type; - RecordAbilityBattle(gBankTarget, gLastUsedAbility); - } - else - { - while (gTypeEffectiveness[i]!= TYPE_ENDTABLE) + //check stab + if (gBattleMons[gBankAttacker].type1 == move_type || gBattleMons[gBankAttacker].type2 == move_type) { - if (gTypeEffectiveness[i] == TYPE_FORESIGHT) - { - if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT) - break; - i += 3; - continue; - } + gBattleMoveDamage = gBattleMoveDamage * 15; + gBattleMoveDamage = gBattleMoveDamage / 10; + } - else if (gTypeEffectiveness[i] == move_type) + if (gBattleMons[gBankTarget].ability == ABILITY_LEVITATE && move_type == TYPE_GROUND) + { + gLastUsedAbility = gBattleMons[gBankTarget].ability; + gBattleMoveFlags |= (MOVESTATUS_MISSED | MOVESTATUS_NOTAFFECTED); + gMoveHitWith[gBankTarget] = 0; + gUnknown_02024C44[gBankTarget] = 0; + gBattleCommunication[6] = move_type; + RecordAbilityBattle(gBankTarget, gLastUsedAbility); + } + else + { + while (gTypeEffectiveness[i]!= TYPE_ENDTABLE) { - //check type1 - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1) - ModulateDmgByType(gTypeEffectiveness[i + 2]); - //check type2 - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 && - gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2) - ModulateDmgByType(gTypeEffectiveness[i + 2]); + if (gTypeEffectiveness[i] == TYPE_FORESIGHT) + { + if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT) + break; + i += 3; + continue; + } + + else if (gTypeEffectiveness[i] == move_type) + { + //check type1 + if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1) + ModulateDmgByType(gTypeEffectiveness[i + 2]); + //check type2 + if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 && + gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2) + ModulateDmgByType(gTypeEffectiveness[i + 2]); + } + i += 3; } - i += 3; } - } - if (gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD && AttacksThisTurn(gBankAttacker, gCurrentMove) == 2 - && (!(gBattleMoveFlags & MOVESTATUS_SUPEREFFECTIVE) || ((gBattleMoveFlags & (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE)) == (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE))) - && gBattleMoves[gCurrentMove].power) - { - gLastUsedAbility = ABILITY_WONDER_GUARD; - gBattleMoveFlags |= MOVESTATUS_MISSED; - gMoveHitWith[gBankTarget] = 0; - gUnknown_02024C44[gBankTarget] = 0; - gBattleCommunication[6] = 3; - RecordAbilityBattle(gBankTarget, gLastUsedAbility); + if (gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD && AttacksThisTurn(gBankAttacker, gCurrentMove) == 2 + && (!(gBattleMoveFlags & MOVESTATUS_SUPEREFFECTIVE) || ((gBattleMoveFlags & (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE)) == (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE))) + && gBattleMoves[gCurrentMove].power) + { + gLastUsedAbility = ABILITY_WONDER_GUARD; + gBattleMoveFlags |= MOVESTATUS_MISSED; + gMoveHitWith[gBankTarget] = 0; + gUnknown_02024C44[gBankTarget] = 0; + gBattleCommunication[6] = 3; + RecordAbilityBattle(gBankTarget, gLastUsedAbility); + } + if (gBattleMoveFlags & MOVESTATUS_NOTAFFECTED) + gProtectStructs[gBankAttacker].notEffective = 1; } - if (gBattleMoveFlags & MOVESTATUS_NOTAFFECTED) - gProtectStructs[gBankAttacker].notEffective = 1; - - END: - gBattlescriptCurrInstr++; + gBattlescriptCurrInstr++; } - static void b_wonderguard_and_levitate(void) { u8 flags = 0; @@ -1620,7 +1616,6 @@ static void ModulateDmgByType2(u8 multiplier, u16 move, u8* flags) //a literal c } } -#ifdef NONMATCHING u8 TypeCalc(u16 move, u8 bank_atk, u8 bank_def) { int i = 0; @@ -1662,7 +1657,7 @@ u8 TypeCalc(u16 move, u8 bank_atk, u8 bank_def) ModulateDmgByType2(gTypeEffectiveness[i + 2], move, &flags); //check type2 if (gTypeEffectiveness[i + 1] == gBattleMons[bank_def].type2 && - gBattleMons[bank_def].type1 != gBattleMons[bank_def].type2) + gBattleMons[gBankTarget /* what the christ */].type1 != gBattleMons[bank_def].type2) ModulateDmgByType2(gTypeEffectiveness[i + 2], move, &flags); } i += 3; @@ -1678,254 +1673,6 @@ u8 TypeCalc(u16 move, u8 bank_atk, u8 bank_def) } return flags; } -#else -__attribute__((naked)) -u8 TypeCalc(u16 move, u8 bank_atk, u8 bank_def) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x14\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - mov r10, r0\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - str r1, [sp, 0x4]\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - mov r9, r2\n\ - movs r7, 0\n\ - mov r0, sp\n\ - strb r7, [r0]\n\ - mov r0, r10\n\ - cmp r0, 0xA5\n\ - bne _0801D2AE\n\ - movs r0, 0\n\ - b _0801D43A\n\ - _0801D2AE:\n\ - ldr r1, _0801D31C @ =gBattleMoves\n\ - mov r3, r10\n\ - lsls r2, r3, 1\n\ - adds r0, r2, r3\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r0, [r0, 0x2]\n\ - str r0, [sp, 0x8]\n\ - ldr r1, _0801D320 @ =gBattleMons\n\ - movs r0, 0x58\n\ - ldr r3, [sp, 0x4]\n\ - muls r0, r3\n\ - adds r3, r0, r1\n\ - adds r0, r3, 0\n\ - adds r0, 0x21\n\ - ldrb r0, [r0]\n\ - str r2, [sp, 0xC]\n\ - adds r5, r1, 0\n\ - ldr r1, [sp, 0x8]\n\ - cmp r0, r1\n\ - beq _0801D2E2\n\ - adds r0, r3, 0\n\ - adds r0, 0x22\n\ - ldrb r0, [r0]\n\ - cmp r0, r1\n\ - bne _0801D2F4\n\ - _0801D2E2:\n\ - ldr r4, _0801D324 @ =gBattleMoveDamage\n\ - ldr r1, [r4]\n\ - lsls r0, r1, 4\n\ - subs r0, r1\n\ - str r0, [r4]\n\ - movs r1, 0xA\n\ - bl __divsi3\n\ - str r0, [r4]\n\ - _0801D2F4:\n\ - movs r0, 0x58\n\ - mov r2, r9\n\ - muls r2, r0\n\ - adds r0, r2, 0\n\ - adds r0, r5\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x1A\n\ - bne _0801D328\n\ - ldr r3, [sp, 0x8]\n\ - cmp r3, 0x4\n\ - bne _0801D328\n\ - movs r1, 0x9\n\ - mov r0, sp\n\ - ldrb r0, [r0]\n\ - orrs r0, r1\n\ - mov r1, sp\n\ - strb r0, [r1]\n\ - b _0801D3DC\n\ - .align 2, 0\n\ - _0801D31C: .4byte gBattleMoves\n\ - _0801D320: .4byte gBattleMons\n\ - _0801D324: .4byte gBattleMoveDamage\n\ - _0801D328:\n\ - ldr r1, _0801D344 @ =gTypeEffectiveness\n\ - adds r0, r7, r1\n\ - ldrb r0, [r0]\n\ - adds r2, r1, 0\n\ - cmp r0, 0xFF\n\ - beq _0801D3DC\n\ - cmp r0, 0xFE\n\ - bne _0801D34C\n\ - movs r0, 0x58\n\ - mov r1, r9\n\ - muls r1, r0\n\ - adds r0, r1, 0\n\ - b _0801D3CA\n\ - .align 2, 0\n\ - _0801D344: .4byte gTypeEffectiveness\n\ - _0801D348:\n\ - adds r7, 0x3\n\ - b _0801D3B6\n\ - _0801D34C:\n\ - ldr r6, _0801D44C @ =gTypeEffectiveness\n\ - adds r0, r7, r6\n\ - ldrb r0, [r0]\n\ - ldr r2, [sp, 0x8]\n\ - cmp r0, r2\n\ - bne _0801D3B0\n\ - adds r1, r7, 0x1\n\ - adds r1, r6\n\ - ldr r3, _0801D450 @ =gBattleMons\n\ - mov r8, r3\n\ - movs r3, 0x58\n\ - mov r0, r9\n\ - muls r0, r3\n\ - mov r2, r8\n\ - adds r5, r0, r2\n\ - adds r0, r5, 0\n\ - adds r0, 0x21\n\ - ldrb r4, [r1]\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - bne _0801D388\n\ - adds r0, r7, 0x2\n\ - adds r0, r6\n\ - ldrb r0, [r0]\n\ - mov r1, r10\n\ - mov r2, sp\n\ - str r3, [sp, 0x10]\n\ - bl ModulateDmgByType2\n\ - ldr r3, [sp, 0x10]\n\ - _0801D388:\n\ - adds r0, r5, 0\n\ - adds r0, 0x22\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - bne _0801D3B0\n\ - ldr r0, _0801D454 @ =gBankTarget\n\ - ldrb r0, [r0]\n\ - muls r0, r3\n\ - add r0, r8\n\ - adds r0, 0x21\n\ - ldrb r0, [r0]\n\ - cmp r0, r4\n\ - beq _0801D3B0\n\ - adds r0, r7, 0x2\n\ - adds r0, r6\n\ - ldrb r0, [r0]\n\ - mov r1, r10\n\ - mov r2, sp\n\ - bl ModulateDmgByType2\n\ - _0801D3B0:\n\ - adds r7, 0x3\n\ - ldr r5, _0801D450 @ =gBattleMons\n\ - ldr r2, _0801D44C @ =gTypeEffectiveness\n\ - _0801D3B6:\n\ - adds r0, r7, r2\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xFF\n\ - beq _0801D3DC\n\ - cmp r0, 0xFE\n\ - bne _0801D34C\n\ - movs r0, 0x58\n\ - mov r3, r9\n\ - muls r3, r0\n\ - adds r0, r3, 0\n\ - _0801D3CA:\n\ - adds r1, r5, 0\n\ - adds r1, 0x50\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 22\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801D348\n\ - _0801D3DC:\n\ - movs r0, 0x58\n\ - mov r1, r9\n\ - muls r1, r0\n\ - adds r0, r1, 0\n\ - adds r0, r5\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x19\n\ - bne _0801D436\n\ - mov r0, sp\n\ - ldrb r1, [r0]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801D436\n\ - ldr r0, [sp, 0x4]\n\ - mov r1, r10\n\ - bl AttacksThisTurn\n\ - lsls r0, 24\n\ - lsrs r1, r0, 24\n\ - cmp r1, 0x2\n\ - bne _0801D436\n\ - mov r0, sp\n\ - ldrb r3, [r0]\n\ - adds r0, r1, 0\n\ - ands r0, r3\n\ - cmp r0, 0\n\ - beq _0801D41E\n\ - movs r0, 0x6\n\ - ands r0, r3\n\ - cmp r0, 0x6\n\ - bne _0801D436\n\ - _0801D41E:\n\ - ldr r0, _0801D458 @ =gBattleMoves\n\ - ldr r1, [sp, 0xC]\n\ - add r1, r10\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x1]\n\ - cmp r0, 0\n\ - beq _0801D436\n\ - mov r0, sp\n\ - movs r1, 0x1\n\ - orrs r1, r3\n\ - strb r1, [r0]\n\ - _0801D436:\n\ - mov r0, sp\n\ - ldrb r0, [r0]\n\ - _0801D43A:\n\ - add sp, 0x14\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ - _0801D44C: .4byte gTypeEffectiveness\n\ - _0801D450: .4byte gBattleMons\n\ - _0801D454: .4byte gBankTarget\n\ - _0801D458: .4byte gBattleMoves\n\ - .syntax divided\n"); -} -#endif // NONMATCHING u8 AI_TypeCalc(u16 move, u16 species, u8 ability) { @@ -2132,7 +1879,7 @@ static void atk0B_healthbarupdate(void) if (gBattleMoveFlags & MOVESTATUS_NOEFFECT) goto END; - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); if (gBattleMons[gActiveBank].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBank].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) { @@ -2171,7 +1918,7 @@ static void atk0C_datahpupdate(void) if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)) { - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); if (gBattleMons[gActiveBank].status2 & STATUS2_SUBSTITUTE && gDisableStructs[gActiveBank].substituteHP && !(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE)) { if (gDisableStructs[gActiveBank].substituteHP >= gBattleMoveDamage) @@ -2216,7 +1963,7 @@ static void atk0C_datahpupdate(void) else { gTakenDmg[gActiveBank] += gBattleMoveDamage; - if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 0) + if (T2_READ_8(gBattlescriptCurrInstr + 1) == 0) gTakenDmgBanks[gActiveBank] = gBankAttacker; else gTakenDmgBanks[gActiveBank] = gBankTarget; @@ -2240,7 +1987,7 @@ static void atk0C_datahpupdate(void) { gProtectStructs[gActiveBank].physicalDmg = gHP_dealt; gSpecialStatuses[gActiveBank].moveturnLostHP_physical = gHP_dealt; - if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 0) + if (T2_READ_8(gBattlescriptCurrInstr + 1) == 0) { gProtectStructs[gActiveBank].physicalBank = gBankAttacker; gSpecialStatuses[gActiveBank].moveturnPhysicalBank = gBankAttacker; @@ -2255,7 +2002,7 @@ static void atk0C_datahpupdate(void) { gProtectStructs[gActiveBank].specialDmg = gHP_dealt; gSpecialStatuses[gActiveBank].moveturnLostHP_special = gHP_dealt; - if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 0) + if (T2_READ_8(gBattlescriptCurrInstr + 1) == 0) { gProtectStructs[gActiveBank].specialBank = gBankAttacker; gSpecialStatuses[gActiveBank].moveturnSpecialBank = gBankAttacker; @@ -2274,7 +2021,7 @@ static void atk0C_datahpupdate(void) } else { - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); if (gSpecialStatuses[gActiveBank].moveturnLostHP == 0) gSpecialStatuses[gActiveBank].moveturnLostHP = 0xFFFF; } @@ -2429,7 +2176,7 @@ static void atk10_printstring(void) { if (gBattleExecBuffer == 0) { - u16 var = BS2ScriptRead16(gBattlescriptCurrInstr + 1); + u16 var = T2_READ_16(gBattlescriptCurrInstr + 1); PrepareStringBattle(var, gBankAttacker); gBattlescriptCurrInstr += 3; gBattleCommunication[MSG_DISPLAY] = 1; @@ -2439,7 +2186,7 @@ static void atk10_printstring(void) static void atk11_printstring_playeronly(void) { gActiveBank = gBankAttacker; - EmitPrintStringPlayerOnly(0, BS2ScriptRead16(gBattlescriptCurrInstr + 1)); + EmitPrintStringPlayerOnly(0, T2_READ_16(gBattlescriptCurrInstr + 1)); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr += 3; gBattleCommunication[MSG_DISPLAY] = 1; @@ -2455,7 +2202,7 @@ static void atk12_waitmessage(void) } else { - u16 to_wait = BS2ScriptRead16(gBattlescriptCurrInstr + 1); + u16 to_wait = T2_READ_16(gBattlescriptCurrInstr + 1); if (++gPauseCounterBattle >= to_wait) { gPauseCounterBattle = 0; @@ -2470,7 +2217,7 @@ static void atk13_printfromtable(void) { if (gBattleExecBuffer == 0) { - u16 *ptr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + u16 *ptr = (u16 *)T1_READ_PTR(gBattlescriptCurrInstr + 1); ptr += gBattleCommunication[MULTISTRING_CHOOSER]; PrepareStringBattle(*(u16*)ptr, gBankAttacker); gBattlescriptCurrInstr += 5; @@ -2482,7 +2229,7 @@ static void atk14_printfromtable_playeronly(void) { if (gBattleExecBuffer == 0) { - u16 *ptr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + u16 *ptr = (u16 *)T1_READ_PTR(gBattlescriptCurrInstr + 1); // FIXME ptr += gBattleCommunication[MULTISTRING_CHOOSER]; gActiveBank = gBankAttacker; EmitPrintStringPlayerOnly(0, *(u16*)ptr); @@ -2510,7 +2257,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) #define EffectAffectsUser 0x40 register u8 certain asm("r5") = certainArg; register bool32 StatusChanged asm("r10") = 0; - register int AffectsUser asm("r6") = 0; //0x40 otherwise + register int AffectsUser asm("r6") = 0; //0x40 otherwise bool32 NoSunCanFreeze = 1; if (gBattleCommunication[MOVE_EFFECT_BYTE] & EffectAffectsUser) @@ -2526,16 +2273,16 @@ void SetMoveEffect(bool8 primary, u8 certainArg) BATTLE_STRUCT->scriptingActive = gBankAttacker; } - if (gBattleMons[gEffectBank].ability_id == ABILITY_SHIELD_DUST && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && + if (gBattleMons[gEffectBank].ability == ABILITY_SHIELD_DUST && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && !primary && gBattleCommunication[MOVE_EFFECT_BYTE] <= 9) {gBattlescriptCurrInstr++; return;} - if (gSideAffecting[get_bank_identity(gEffectBank) & 1] & SIDE_STATUS_SAFEGUARD && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && + if (gSideAffecting[GetBankIdentity(gEffectBank) & 1] & SIDE_STATUS_SAFEGUARD && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && !primary && gBattleCommunication[MOVE_EFFECT_BYTE] <= 7) {gBattlescriptCurrInstr++; return;} //make sure at least ONE HP except payday and thief - if (gBattleMons[gEffectBank].current_hp == 0 && gBattleCommunication[MOVE_EFFECT_BYTE] != 0xB && gBattleCommunication[MOVE_EFFECT_BYTE] != 0x1F) + if (gBattleMons[gEffectBank].hp == 0 && gBattleCommunication[MOVE_EFFECT_BYTE] != 0xB && gBattleCommunication[MOVE_EFFECT_BYTE] != 0x1F) {gBattlescriptCurrInstr++; return;} if (gBattleMons[gEffectBank].status2 & STATUS2_SUBSTITUTE && AffectsUser != EffectAffectsUser) @@ -2547,81 +2294,82 @@ void SetMoveEffect(bool8 primary, u8 certainArg) { case STATUS_SLEEP: //check active uproar - if (gBattleMons[gEffectBank].ability_id != ABILITY_SOUNDPROOF) + if (gBattleMons[gEffectBank].ability != ABILITY_SOUNDPROOF) { for (gActiveBank = 0; gActiveBank < gNoOfAllBanks && !(gBattleMons[gActiveBank].status2 & STATUS2_UPROAR); gActiveBank++) {} } else gActiveBank = gNoOfAllBanks; - if (gBattleMons[gEffectBank].status) {break;} + if (gBattleMons[gEffectBank].status1) {break;} if (gActiveBank != gNoOfAllBanks) {break;} //nice way of checking uproar... - if (gBattleMons[gEffectBank].ability_id == ABILITY_VITAL_SPIRIT) {break;} - if (gBattleMons[gEffectBank].ability_id == ABILITY_INSOMNIA) {break;} + if (gBattleMons[gEffectBank].ability == ABILITY_VITAL_SPIRIT) {break;} + if (gBattleMons[gEffectBank].ability == ABILITY_INSOMNIA) {break;} - b_cancel_multi_turn_move_maybe(gEffectBank); + CancelMultiTurnMoves(gEffectBank); StatusChanged = 1; break; case STATUS_POISON: - if (gBattleMons[gEffectBank].ability_id == ABILITY_IMMUNITY && (primary == 1 || certain == 0x80)) + if (gBattleMons[gEffectBank].ability == ABILITY_IMMUNITY && (primary == 1 || certain == 0x80)) { gLastUsedAbility = ABILITY_IMMUNITY; - RecordAbility(gEffectBank, ABILITY_IMMUNITY); + RecordAbilityBattle(gEffectBank, ABILITY_IMMUNITY); b_movescr_stack_push(gBattlescriptCurrInstr + 1); //_0801E664: - gBattlescriptCurrInstr = BS_PSN_PREVENTION; + gBattlescriptCurrInstr = BattleScript_PSNPrevention; if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) { - gBattleCommunication.multistring_chooser = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); return; } else - {gBattleCommunication.multistring_chooser = 0; return;} + {gBattleCommunication[MULTISTRING_CHOOSER] = 0; return;} } if ((gBattleMons[gEffectBank].type1 == TYPE_POISON || gBattleMons[gEffectBank].type2 == TYPE_POISON || gBattleMons[gEffectBank].type1 == TYPE_STEEL || gBattleMons[gEffectBank].type2 == TYPE_STEEL) && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80)) { b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_PSN_PREVENTION; - gBattleCommunication.multistring_chooser = 2; + gBattlescriptCurrInstr = BattleScript_PSNPrevention; + gBattleCommunication[MULTISTRING_CHOOSER] = 2; return; } if (gBattleMons[gEffectBank].type1 == TYPE_POISON) {break;} if (gBattleMons[gEffectBank].type2 == TYPE_POISON) {break;} if (gBattleMons[gEffectBank].type1 == TYPE_STEEL) {break;} if (gBattleMons[gEffectBank].type2 == TYPE_STEEL) {break;} - if (gBattleMons[gEffectBank].status) {break;} - if (gBattleMons[gEffectBank].ability_id == ABILITY_IMMUNITY) {break;} + if (gBattleMons[gEffectBank].status1) {break;} + if (gBattleMons[gEffectBank].ability == ABILITY_IMMUNITY) {break;} + StatusChanged = 1; break; case STATUS_BURN: - if (gBattleMons[gEffectBank].ability_id == ABILITY_WATER_VEIL && (primary == 1 || certain == 0x80)) + if (gBattleMons[gEffectBank].ability == ABILITY_WATER_VEIL && (primary == 1 || certain == 0x80)) { gLastUsedAbility = ABILITY_WATER_VEIL; - RecordAbility(gEffectBank, ABILITY_WATER_VEIL); + RecordAbilityBattle(gEffectBank, ABILITY_WATER_VEIL); b_movescr_stack_push(gBattlescriptCurrInstr + 1); //_0801E664: - gBattlescriptCurrInstr = BS_BRN_PREVENTION; + gBattlescriptCurrInstr = BattleScript_BRNPrevention; if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) { - gBattleCommunication.multistring_chooser = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); return; } else - {gBattleCommunication.multistring_chooser = 0; return;} + {gBattleCommunication[MULTISTRING_CHOOSER] = 0; return;} } if ((gBattleMons[gEffectBank].type1 == TYPE_FIRE || gBattleMons[gEffectBank].type2 == TYPE_FIRE) && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80)) { b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_BRN_PREVENTION; - gBattleCommunication.multistring_chooser = 2; + gBattlescriptCurrInstr = BattleScript_BRNPrevention; + gBattleCommunication[MULTISTRING_CHOOSER] = 2; return; } if (gBattleMons[gEffectBank].type1 == TYPE_FIRE) {break;} if (gBattleMons[gEffectBank].type2 == TYPE_FIRE) {break;} - if (gBattleMons[gEffectBank].ability_id == ABILITY_WATER_VEIL) {break;} + if (gBattleMons[gEffectBank].ability == ABILITY_WATER_VEIL) {break;} if (gBattleMons[gEffectBank].status1 == 0) {break;} StatusChanged = 1; break; @@ -2629,70 +2377,70 @@ void SetMoveEffect(bool8 primary, u8 certainArg) if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY) {NoSunCanFreeze = 0;} if (gBattleMons[gEffectBank].type1 == TYPE_ICE) {break;} if (gBattleMons[gEffectBank].type2 == TYPE_ICE) {break;} - if (gBattleMons[gEffectBank].status) {break;} + if (gBattleMons[gEffectBank].status1) {break;} if (NoSunCanFreeze == 0) {break;} - if (gBattleMons[gEffectBank].ability_id == ABILITY_MAGMA_ARMOR) {break;} + if (gBattleMons[gEffectBank].ability == ABILITY_MAGMA_ARMOR) {break;} - b_cancel_multi_turn_move_maybe(gEffectBank); + CancelMultiTurnMoves(gEffectBank); StatusChanged = 1; break; case STATUS_PARALYSIS: - if (gBattleMons[gEffectBank].ability_id == ABILITY_LIMBER) + if (gBattleMons[gEffectBank].ability == ABILITY_LIMBER) { if ((primary == 1 || certain == 0x80)) { gLastUsedAbility = ABILITY_LIMBER; - RecordAbility(gEffectBank, ABILITY_LIMBER); + RecordAbilityBattle(gEffectBank, ABILITY_LIMBER); b_movescr_stack_push(gBattlescriptCurrInstr + 1); //_0801E664: - gBattlescriptCurrInstr = BS_PRLZ_PREVENTION; + gBattlescriptCurrInstr = BattleScript_PRLZPrevention; if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) { - gBattleCommunication.multistring_chooser = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); return; } else - {gBattleCommunication.multistring_chooser = 0; return;} + {gBattleCommunication[MULTISTRING_CHOOSER] = 0; return;} } else {break;} } - if (gBattleMons[gEffectBank].status) {break;} + if (gBattleMons[gEffectBank].status1) {break;} StatusChanged = 1; break; case STATUS_TOXIC_POISON: - if (gBattleMons[gEffectBank].ability_id == ABILITY_IMMUNITY && (primary == 1 || certain == 0x80)) + if (gBattleMons[gEffectBank].ability == ABILITY_IMMUNITY && (primary == 1 || certain == 0x80)) { gLastUsedAbility = ABILITY_IMMUNITY; - RecordAbility(gEffectBank, ABILITY_IMMUNITY); + RecordAbilityBattle(gEffectBank, ABILITY_IMMUNITY); b_movescr_stack_push(gBattlescriptCurrInstr + 1); //_0801E664: - gBattlescriptCurrInstr = BS_PSN_PREVENTION; + gBattlescriptCurrInstr = BattleScript_PSNPrevention; if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) { - gBattleCommunication.multistring_chooser = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); return; } else - {gBattleCommunication.multistring_chooser = 0; return;} + {gBattleCommunication[MULTISTRING_CHOOSER] = 0; return;} } if ((gBattleMons[gEffectBank].type1 == TYPE_POISON || gBattleMons[gEffectBank].type2 == TYPE_POISON || gBattleMons[gEffectBank].type1 == TYPE_STEEL || gBattleMons[gEffectBank].type2 == TYPE_STEEL) && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80)) { b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_PSN_PREVENTION; - gBattleCommunication.multistring_chooser = 2; + gBattlescriptCurrInstr = BattleScript_PSNPrevention; + gBattleCommunication[MULTISTRING_CHOOSER] = 2; return; } - if (gBattleMons[gEffectBank].status) {break;} + if (gBattleMons[gEffectBank].status1) {break;} if (gBattleMons[gEffectBank].type1 != TYPE_POISON && gBattleMons[gEffectBank].type2 != TYPE_POISON && gBattleMons[gEffectBank].type1 != TYPE_STEEL && gBattleMons[gEffectBank].type2 != TYPE_STEEL) { - if (gBattleMons[gEffectBank].ability_id == ABILITY_IMMUNITY) {break;} - gBattleMons[gEffectBank].status1 |= ~(STATUS_POISON); //TODO: fix OR to AND + if (gBattleMons[gEffectBank].ability == ABILITY_IMMUNITY) {break;} + gBattleMons[gEffectBank].status1 &= ~(0x9); //This gets (correctly) optimized out... StatusChanged = 1; break; } @@ -2707,20 +2455,20 @@ void SetMoveEffect(bool8 primary, u8 certainArg) gBattleMons[gEffectBank].status1 |= ((Random() & 3) + 2); else gBattleMons[gEffectBank].status1 |= gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]; - gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; gActiveBank = gEffectBank; - bb2_setattributes_in_battle(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gEffectBank].status); - mark_buffer_bank_for_execution(gActiveBank); + EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gEffectBank].status1); + MarkBufferBankForExecution(gActiveBank); if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) { - gBattleCommunication.multistring_chooser = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); } else - gBattleCommunication.multistring_chooser = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; if (gBattleCommunication[MOVE_EFFECT_BYTE] == 2 || gBattleCommunication[MOVE_EFFECT_BYTE] == 6 || gBattleCommunication[MOVE_EFFECT_BYTE] == 5 || gBattleCommunication[MOVE_EFFECT_BYTE] == 3) { - BATTLE_STRUCT->SynchroniseEffect = gBattleCommunication[MOVE_EFFECT_BYTE]; + BATTLE_STRUCT->synchroniseEffect = gBattleCommunication[MOVE_EFFECT_BYTE]; gHitMarker |= HITMARKER_SYNCHRONISE_EFFECT; } return; @@ -2738,22 +2486,22 @@ void SetMoveEffect(bool8 primary, u8 certainArg) switch (gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]) { case 7: //confusion - if (gBattleMons[gEffectBank].ability_id == ABILITY_OWN_TEMPO) + if (gBattleMons[gEffectBank].ability == ABILITY_OWN_TEMPO) {gBattlescriptCurrInstr++; return;} if (gBattleMons[gEffectBank].status2 & STATUS2_CONFUSION) {gBattlescriptCurrInstr++; return;} gBattleMons[gEffectBank].status2 |= (((Random()) % 0x4)) + 2; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; case 8: //flinch - if (gBattleMons[gEffectBank].ability_id == ABILITY_INNER_FOCUS) + if (gBattleMons[gEffectBank].ability == ABILITY_INNER_FOCUS) { if (primary == 1 || certain == 0x80) { gLastUsedAbility = ABILITY_INNER_FOCUS; - RecordAbility(gEffectBank, ABILITY_INNER_FOCUS); - gBattlescriptCurrInstr = BS_FLINCH_PREVENTION; + RecordAbilityBattle(gEffectBank, ABILITY_INNER_FOCUS); + gBattlescriptCurrInstr = BattleScript_FlinchPrevention; return; } else @@ -2773,21 +2521,21 @@ void SetMoveEffect(bool8 primary, u8 certainArg) gLockedMove[gEffectBank] = gCurrentMove; gBattleMons[gEffectBank].status2 |= ((Random() & 3) + 2) << 4; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; case 11: //pay day - if (!(get_bank_identity(gEffectBank) & 1)) + if (!(GetBankIdentity(gBankAttacker) & 1)) { u16 PayDay = gPaydayMoney; - gPaydayMoney += (gBattleMons[gEffectBank].level * 5); + gPaydayMoney += (gBattleMons[gBankAttacker].level * 5); if (PayDay > gPaydayMoney) gPaydayMoney = 0xFFFF; } b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; case 9: //tri attack - if (gBattleMons[gEffectBank].status) + if (gBattleMons[gEffectBank].status1) {gBattlescriptCurrInstr++; return;} gBattleCommunication[MOVE_EFFECT_BYTE] = Random() % 3 + 3; SetMoveEffect(0, 0); @@ -2795,73 +2543,73 @@ void SetMoveEffect(bool8 primary, u8 certainArg) case 12: //charging move gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS; gLockedMove[gEffectBank] = gCurrentMove; - gProtectStructs[gEffectBank].flag1_chargingturn = 1; + gProtectStructs[gEffectBank].chargingTurn = 1; gBattlescriptCurrInstr++; break; case 13: //wrap if (gBattleMons[gEffectBank].status2 & STATUS2_WRAPPED) {gBattlescriptCurrInstr++; return;} gBattleMons[gEffectBank].status2 |= ((Random() & 3) + 2) << 0xD; - BATTLE_STRUCT->WrappedMove1[gEffectBank] = gCurrentMove; - BATTLE_STRUCT->WrappedMove2[gEffectBank] = gCurrentMove >> 8; - BATTLE_STRUCT->WrappedBy[gEffectBank] = gBankAttacker; + BATTLE_STRUCT->wrappedMove[gEffectBank*2] = (u8)gCurrentMove; + (1 + BATTLE_STRUCT->wrappedMove)[gEffectBank*2] = gCurrentMove >> 8; //don't ask. + BATTLE_STRUCT->wrappedBy[gEffectBank] = gBankAttacker; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; - gBattleCommunication.multistring_chooser = 0; - while (gBattleCommunication.multistring_chooser <= 4 - && gCurrentMove != gTrappingMoves[gBattleCommunication.multistring_chooser]) - gBattleCommunication.multistring_chooser++; + gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + while (gBattleCommunication[MULTISTRING_CHOOSER] <= 4 + && gCurrentMove != gTrappingMoves[gBattleCommunication[MULTISTRING_CHOOSER]]) + gBattleCommunication[MULTISTRING_CHOOSER]++; break; - case 14: //recoil + case 14: //25% recoil gBattleMoveDamage = (gHP_dealt) / 4; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; case 15 ... 21: //stat + 1 - if (ChangeStats(0x10, gBattleCommunication[MOVE_EFFECT_BYTE] + 0xF2, certain, 0)) {gBattlescriptCurrInstr++;} + if (ChangeStatBuffs(0x10, gBattleCommunication[MOVE_EFFECT_BYTE] + 0xF2, certain, 0)) {gBattlescriptCurrInstr++;} else { BATTLE_STRUCT->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; //TODO: the arg ptr is wrong by one BATTLE_STRUCT->animArg2 = 0; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_STAT_UP; + gBattlescriptCurrInstr = BattleScript_StatUp; } break; case 22 ... 28: //stat - 1 - if (ChangeStats(~(0x6f), gBattleCommunication[MOVE_EFFECT_BYTE] + 0xEB, certain, 0)) {gBattlescriptCurrInstr++;} //TODO: negation doesnt work correctly + if (ChangeStatBuffs(~(0x6f), gBattleCommunication[MOVE_EFFECT_BYTE] + 0xEB, certain, 0)) {gBattlescriptCurrInstr++;} //TODO: negation doesnt work correctly else { BATTLE_STRUCT->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; BATTLE_STRUCT->animArg2 = 0; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_STAT_DOWN; + gBattlescriptCurrInstr = BattleScript_StatDown; } break; case 39 ... 45: //stat + 2 - if (ChangeStats(0x20, gBattleCommunication[MOVE_EFFECT_BYTE] + 0xDA, certain, 0)) {gBattlescriptCurrInstr++;} + if (ChangeStatBuffs(0x20, gBattleCommunication[MOVE_EFFECT_BYTE] + 0xDA, certain, 0)) {gBattlescriptCurrInstr++;} else { BATTLE_STRUCT->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; BATTLE_STRUCT->animArg2 = 0; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_STAT_UP; + gBattlescriptCurrInstr = BattleScript_StatUp; } break; case 46 ... 52: //stat - 2 - if (ChangeStats(~(0x5f), gBattleCommunication[MOVE_EFFECT_BYTE] + 0xD3, certain, 0)) {gBattlescriptCurrInstr++;} + if (ChangeStatBuffs(~(0x5f), gBattleCommunication[MOVE_EFFECT_BYTE] + 0xD3, certain, 0)) {gBattlescriptCurrInstr++;} else { BATTLE_STRUCT->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; BATTLE_STRUCT->animArg2 = 0; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_STAT_DOWN; + gBattlescriptCurrInstr = BattleScript_StatDown; } break; case 29: //recharge gBattleMons[gEffectBank].status2 |= STATUS2_RECHARGE; - gDisableStructs[gEffectBank].recharge_counter = 2; + gDisableStructs[gEffectBank].rechargeCounter = 2; gLockedMove[gEffectBank] = gCurrentMove; gBattlescriptCurrInstr++; break; @@ -2871,83 +2619,85 @@ void SetMoveEffect(bool8 primary, u8 certainArg) break; case 31: //item steal { - u8 side = battle_side_get_owner(gBankAttacker); - if (battle_side_get_owner(gBankAttacker) == 1 && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) && gTrainerBattleOpponent != 0x400) + u8 side = GetBankSide(gBankAttacker); + if (GetBankSide(gBankAttacker) == 1 && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) && gTrainerBattleOpponent != 0x400) {gBattlescriptCurrInstr++; return;} - if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) && gTrainerBattleOpponent != 0x400 && (gWishFutureKnock.KnockedOff[side] & gBitTable[gBattlePartyID[gBankAttacker]])) + if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) && gTrainerBattleOpponent != 0x400 && (gWishFutureKnock.knockedOffPokes[side] & gBitTable[gBattlePartyID[gBankAttacker]])) {gBattlescriptCurrInstr++; return;} - if (gBattleMons[gBankTarget].held_item && gBattleMons[gBankTarget].ability_id == ABILITY_STICKY_HOLD) + if (gBattleMons[gBankTarget].item && gBattleMons[gBankTarget].ability == ABILITY_STICKY_HOLD) { b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BS_NO_ITEMSTEAL; - gLastUsedAbility = gBattleMons[gBankTarget].ability_id; - RecordAbility(gBankTarget, gLastUsedAbility); + gBattlescriptCurrInstr = BattleScript_NoItemSteal; + gLastUsedAbility = gBattleMons[gBankTarget].ability; + RecordAbilityBattle(gBankTarget, gLastUsedAbility); return; } - if (gBattleMons[gBankAttacker].held_item) + if (gBattleMons[gBankAttacker].item) {gBattlescriptCurrInstr++; return;} - if (gBattleMons[gBankTarget].held_item == ITEM_ENIGMA_BERRY) + if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) {gBattlescriptCurrInstr++; return;} - if (gBattleMons[gBankTarget].held_item == 0) + if (gBattleMons[gBankTarget].item == 0) {gBattlescriptCurrInstr++; return;} - CHANGED_HELDITEMS[gBankAttacker] = gLastUsedItem = gBattleMons[gBankTarget].held_item; - gBattleMons[gBankTarget].held_item = 0; + gLastUsedItem = gBattleMons[gBankTarget].item; + unk_2000000[gBankAttacker * 2 + 0x160cc] = gLastUsedItem; + gBattleMons[gBankTarget].item = 0; gActiveBank = gBankAttacker; - bb2_setattributes_in_battle(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gLastUsedItem); - mark_buffer_bank_for_execution(gBankAttacker); + EmitSetAttributes(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gLastUsedItem); + MarkBufferBankForExecution(gBankAttacker); gActiveBank = gBankTarget; - bb2_setattributes_in_battle(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gBankTarget].held_item); - mark_buffer_bank_for_execution(gBankTarget); + EmitSetAttributes(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gBankTarget].item); + MarkBufferBankForExecution(gBankTarget); b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_ITEMSTEAL; + gBattlescriptCurrInstr = BattleScript_ItemSteal; - STORE_CHOICEMOVE(gBankTarget, 0); + ewram[gBankTarget * 2 + 0x160e8] = 0; + //STORE_CHOICEMOVE(gBankTarget, 0); } break; case 32: //escape prevention gBattleMons[gBankTarget].status2 |= STATUS2_RECHARGE; - gDisableStructs[gBankTarget].BankPreventingEscape = gBankAttacker; + gDisableStructs[gBankTarget].bankPreventingEscape = gBankAttacker; gBattlescriptCurrInstr++; break; case 33: //nightmare gBattleMons[gBankTarget].status2 |= STATUS2_NIGHTMARE; gBattlescriptCurrInstr++; break; - case 34: + case 34: //ancientpower b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = gUnknown_081D9224; + gBattlescriptCurrInstr = BattleScript_AllStatsUp; return; case 35: //break free rapidspin b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_RAPIDSPINAWAY; + gBattlescriptCurrInstr = BattleScript_RapidSpinAway; return; case 36: //paralysis removal if (gBattleMons[gBankTarget].status1 & STATUS_PARALYSIS) { gBattleMons[gBankTarget].status1 &= ~(STATUS_PARALYSIS); gActiveBank = gBankTarget; - bb2_setattributes_in_battle(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status); - mark_buffer_bank_for_execution(gActiveBank); + EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status1); + MarkBufferBankForExecution(gActiveBank); b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_PARALYSISHEALED; + gBattlescriptCurrInstr = BattleScript_TargetPRLZHeal; } else {gBattlescriptCurrInstr++; return;} break; - case 37: // + case 37: //superpower b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = gUnknown_081D93FA; + gBattlescriptCurrInstr = BattleScript_AtkDefDown; return; - case 38: //recoil plus paralysis + case 38: //33% recoil gBattleMoveDamage = gHP_dealt / 3; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; case 53: //thrash if (!(gBattleMons[gEffectBank].status2 & STATUS2_LOCK_CONFUSE)) @@ -2960,32 +2710,33 @@ void SetMoveEffect(bool8 primary, u8 certainArg) {gBattlescriptCurrInstr++; return;} break; case 54: //knock off - if (gBattleMons[gEffectBank].ability_id == ABILITY_STICKY_HOLD) + if (gBattleMons[gEffectBank].ability == ABILITY_STICKY_HOLD) { - if (gBattleMons[gEffectBank].held_item == 0) + if (gBattleMons[gEffectBank].item == 0) {gBattlescriptCurrInstr++; return;} gLastUsedAbility = ABILITY_STICKY_HOLD; - gBattlescriptCurrInstr = BS_STICKYHOLD_ACTIVATES; - RecordAbility(gEffectBank, ABILITY_STICKY_HOLD); + gBattlescriptCurrInstr = BattleScript_NoItemSteal; + RecordAbilityBattle(gEffectBank, ABILITY_STICKY_HOLD); return; } - if (gBattleMons[gEffectBank].held_item == 0) + if (gBattleMons[gEffectBank].item == 0) {gBattlescriptCurrInstr++; return;} else { - u8 side = battle_side_get_owner(gEffectBank); - gLastUsedItem = gBattleMons[gEffectBank].held_item; - gBattleMons[gEffectBank].held_item = 0; - gWishFutureKnock.KnockedOff[side] |= gBitTable[gBattlePartyID[gEffectBank]]; + u8 side = GetBankSide(gEffectBank); + gLastUsedItem = gBattleMons[gEffectBank].item; + gBattleMons[gEffectBank].item = 0; + gWishFutureKnock.knockedOffPokes[side] |= gBitTable[gBattlePartyID[gEffectBank]]; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_KNOCKEDOFF; + gBattlescriptCurrInstr = BattleScript_KnockedOff; - STORE_CHOICEMOVE(gEffectBank, 0); + ewram[gEffectBank * 2 + 0x160e8] = 0; + //STORE_CHOICEMOVE(gEffectBank, 0); } break; - case 59: //overheat I guess, dont remember + case 59: //overheat b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = gUnknown_081D94B0; + gBattlescriptCurrInstr = BattleScript_SAtkDown2; return; } } @@ -4888,11 +4639,11 @@ _0801F3BC:\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ bl b_movescr_stack_push\n\ - ldr r0, _0801F3D0 @ =gUnknown_081D9224\n\ + ldr r0, _0801F3D0 @ =BattleScript_AllStatsUp\n\ b _0801F5F8\n\ .align 2, 0\n\ _0801F3CC: .4byte gBattlescriptCurrInstr\n\ -_0801F3D0: .4byte gUnknown_081D9224\n\ +_0801F3D0: .4byte BattleScript_AllStatsUp\n\ _0801F3D4:\n\ ldr r4, _0801F3E4 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ @@ -4952,11 +4703,11 @@ _0801F44C:\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ bl b_movescr_stack_push\n\ - ldr r0, _0801F460 @ =gUnknown_081D93FA\n\ + ldr r0, _0801F460 @ =BattleScript_AtkDefDown\n\ b _0801F5F8\n\ .align 2, 0\n\ _0801F45C: .4byte gBattlescriptCurrInstr\n\ -_0801F460: .4byte gUnknown_081D93FA\n\ +_0801F460: .4byte BattleScript_AtkDefDown\n\ _0801F464:\n\ ldr r4, _0801F494 @ =gBattleMoveDamage\n\ ldr r0, _0801F498 @ =gHP_dealt\n\ @@ -5141,7 +4892,7 @@ _0801F5EC:\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ bl b_movescr_stack_push\n\ - ldr r0, _0801F610 @ =gUnknown_081D94B0\n\ + ldr r0, _0801F610 @ =BattleScript_SAtkDown2\n\ _0801F5F8:\n\ str r0, [r4]\n\ _0801F5FA:\n\ @@ -5155,11 +4906,12 @@ _0801F5FA:\n\ bx r0\n\ .align 2, 0\n\ _0801F60C: .4byte gBattlescriptCurrInstr\n\ -_0801F610: .4byte gUnknown_081D94B0\n\ +_0801F610: .4byte BattleScript_SAtkDown2\n\ .syntax divided\n"); } #endif // NONMATCHING + static void atk15_seteffectwithchancetarget(void) { u32 PercentChance; @@ -5197,7 +4949,7 @@ static void atk17_seteffectsecondary(void) static void atk18_status_effect_clear(void) { - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); if (gBattleCommunication[MOVE_EFFECT_BYTE] <= 6) gBattleMons[gActiveBank].status1 &= (~gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]); else @@ -5208,432 +4960,114 @@ static void atk18_status_effect_clear(void) BATTLE_STRUCT->unk16112 = 0; } -//Fuck this, Maybe later -__attribute__((naked)) static void atk19_faint_pokemon(void) { - asm(".syntax unified\n\ -push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x4\n\ - ldr r0, _0801F81C @ =gBattlescriptCurrInstr\n\ - ldr r2, [r0]\n\ - ldrb r1, [r2, 0x2]\n\ - adds r6, r0, 0\n\ - cmp r1, 0\n\ - beq _0801F834\n\ - ldrb r0, [r2, 0x1]\n\ - bl GetBattleBank\n\ - ldr r5, _0801F820 @ =gActiveBank\n\ - strb r0, [r5]\n\ - ldr r2, _0801F824 @ =gHitMarker\n\ - ldr r1, _0801F828 @ =gBitTable\n\ - ldrb r0, [r5]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r2]\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801F7E6\n\ - b _0801FB1C\n\ -_0801F7E6:\n\ - ldr r1, [r6]\n\ - ldrb r4, [r1, 0x3]\n\ - ldrb r0, [r1, 0x4]\n\ - lsls r0, 8\n\ - orrs r4, r0\n\ - ldrb r0, [r1, 0x5]\n\ - lsls r0, 16\n\ - orrs r4, r0\n\ - ldrb r0, [r1, 0x6]\n\ - lsls r0, 24\n\ - orrs r4, r0\n\ - bl b_movescr_stack_pop_cursor\n\ - str r4, [r6]\n\ - ldrb r0, [r5]\n\ - bl GetBankSide\n\ - ldr r1, _0801F82C @ =gSideAffecting\n\ - lsls r0, 24\n\ - lsrs r0, 23\n\ - adds r0, r1\n\ - ldrh r2, [r0]\n\ - ldr r1, _0801F830 @ =0x0000fdff\n\ - ands r1, r2\n\ - strh r1, [r0]\n\ - b _0801FB22\n\ - .align 2, 0\n\ -_0801F81C: .4byte gBattlescriptCurrInstr\n\ -_0801F820: .4byte gActiveBank\n\ -_0801F824: .4byte gHitMarker\n\ -_0801F828: .4byte gBitTable\n\ -_0801F82C: .4byte gSideAffecting\n\ -_0801F830: .4byte 0x0000fdff\n\ -_0801F834:\n\ - ldrb r0, [r2, 0x1]\n\ - cmp r0, 0x1\n\ - bne _0801F85C\n\ - ldr r1, _0801F84C @ =gActiveBank\n\ - ldr r0, _0801F850 @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - ldr r0, _0801F854 @ =gBankTarget\n\ - ldrb r7, [r0]\n\ - ldr r4, _0801F858 @ =gUnknown_081D8C58\n\ - b _0801F86A\n\ - .align 2, 0\n\ -_0801F84C: .4byte gActiveBank\n\ -_0801F850: .4byte gBankAttacker\n\ -_0801F854: .4byte gBankTarget\n\ -_0801F858: .4byte gUnknown_081D8C58\n\ -_0801F85C:\n\ - ldr r1, _0801F954 @ =gActiveBank\n\ - ldr r0, _0801F958 @ =gBankTarget\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - ldr r0, _0801F95C @ =gBankAttacker\n\ - ldrb r7, [r0]\n\ - ldr r4, _0801F960 @ =gUnknown_081D8C65\n\ -_0801F86A:\n\ - ldr r0, _0801F964 @ =gAbsentBankFlags\n\ - ldrb r1, [r0]\n\ - ldr r0, _0801F968 @ =gBitTable\n\ - mov r12, r0\n\ - ldr r2, _0801F954 @ =gActiveBank\n\ - mov r8, r2\n\ - ldrb r2, [r2]\n\ - lsls r0, r2, 2\n\ - add r0, r12\n\ - ldr r0, [r0]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - beq _0801F886\n\ - b _0801FB1C\n\ -_0801F886:\n\ - ldr r3, _0801F96C @ =gBattleMons\n\ - mov r10, r3\n\ - movs r5, 0x58\n\ - mov r9, r5\n\ - mov r0, r9\n\ - muls r0, r2\n\ - add r0, r10\n\ - ldrh r3, [r0, 0x28]\n\ - cmp r3, 0\n\ - beq _0801F89C\n\ - b _0801FB1C\n\ -_0801F89C:\n\ - ldr r2, _0801F970 @ =0x02000000\n\ - lsls r1, r7, 1\n\ - ldr r5, _0801F974 @ =0x000160ac\n\ - adds r0, r1, r5\n\ - adds r0, r2\n\ - strb r3, [r0]\n\ - ldr r0, _0801F978 @ =0x000160ad\n\ - adds r1, r0\n\ - adds r1, r2\n\ - strb r3, [r1]\n\ - lsls r1, r7, 2\n\ - adds r5, 0x54\n\ - adds r0, r1, r5\n\ - adds r0, r2\n\ - strb r3, [r0]\n\ - adds r5, 0x1\n\ - adds r0, r1, r5\n\ - adds r0, r2\n\ - strb r3, [r0]\n\ - adds r5, 0x1\n\ - adds r0, r1, r5\n\ - adds r0, r2\n\ - strb r3, [r0]\n\ - ldr r0, _0801F97C @ =0x00016103\n\ - adds r1, r0\n\ - adds r1, r2\n\ - strb r3, [r1]\n\ - ldr r5, _0801F980 @ =gHitMarker\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - lsls r0, 2\n\ - add r0, r12\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r5]\n\ - orrs r0, r1\n\ - str r0, [r5]\n\ - ldr r0, [r6]\n\ - adds r0, 0x7\n\ - bl b_movescr_stack_push\n\ - str r4, [r6]\n\ - mov r2, r8\n\ - ldrb r0, [r2]\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _0801F9B0\n\ - ldr r0, [r5]\n\ - movs r1, 0x80\n\ - lsls r1, 15\n\ - orrs r0, r1\n\ - str r0, [r5]\n\ - ldr r1, _0801F984 @ =gBattleResults\n\ - ldrb r0, [r1]\n\ - cmp r0, 0xFE\n\ - bhi _0801F914\n\ - adds r0, 0x1\n\ - strb r0, [r1]\n\ -_0801F914:\n\ - mov r0, r9\n\ - muls r0, r7\n\ - add r0, r10\n\ - adds r3, r0, 0\n\ - adds r3, 0x2A\n\ - mov r4, r8\n\ - ldrb r2, [r4]\n\ - mov r0, r9\n\ - muls r0, r2\n\ - add r0, r10\n\ - adds r1, r0, 0\n\ - adds r1, 0x2A\n\ - ldrb r0, [r3]\n\ - ldrb r5, [r1]\n\ - cmp r0, r5\n\ - bls _0801F9CC\n\ - ldrb r1, [r1]\n\ - subs r0, r1\n\ - cmp r0, 0x1D\n\ - ble _0801F990\n\ - ldr r1, _0801F988 @ =gBattlePartyID\n\ - lsls r0, r2, 1\n\ - adds r0, r1\n\ - ldrh r1, [r0]\n\ - movs r0, 0x64\n\ - muls r0, r1\n\ - ldr r1, _0801F98C @ =gPlayerParty\n\ - adds r0, r1\n\ - movs r1, 0x8\n\ - bl AdjustFriendship\n\ - b _0801F9CC\n\ - .align 2, 0\n\ -_0801F954: .4byte gActiveBank\n\ -_0801F958: .4byte gBankTarget\n\ -_0801F95C: .4byte gBankAttacker\n\ -_0801F960: .4byte gUnknown_081D8C65\n\ -_0801F964: .4byte gAbsentBankFlags\n\ -_0801F968: .4byte gBitTable\n\ -_0801F96C: .4byte gBattleMons\n\ -_0801F970: .4byte 0x02000000\n\ -_0801F974: .4byte 0x000160ac\n\ -_0801F978: .4byte 0x000160ad\n\ -_0801F97C: .4byte 0x00016103\n\ -_0801F980: .4byte gHitMarker\n\ -_0801F984: .4byte gBattleResults\n\ -_0801F988: .4byte gBattlePartyID\n\ -_0801F98C: .4byte gPlayerParty\n\ -_0801F990:\n\ - ldr r1, _0801F9A8 @ =gBattlePartyID\n\ - lsls r0, r2, 1\n\ - adds r0, r1\n\ - ldrh r1, [r0]\n\ - movs r0, 0x64\n\ - muls r0, r1\n\ - ldr r1, _0801F9AC @ =gPlayerParty\n\ - adds r0, r1\n\ - movs r1, 0x6\n\ - bl AdjustFriendship\n\ - b _0801F9CC\n\ - .align 2, 0\n\ -_0801F9A8: .4byte gBattlePartyID\n\ -_0801F9AC: .4byte gPlayerParty\n\ -_0801F9B0:\n\ - ldr r1, _0801FAE0 @ =gBattleResults\n\ - ldrb r0, [r1, 0x1]\n\ - cmp r0, 0xFE\n\ - bhi _0801F9BC\n\ - adds r0, 0x1\n\ - strb r0, [r1, 0x1]\n\ -_0801F9BC:\n\ - ldr r2, _0801FAE4 @ =gActiveBank\n\ - ldrb r0, [r2]\n\ - mov r3, r9\n\ - muls r3, r0\n\ - adds r0, r3, 0\n\ - add r0, r10\n\ - ldrh r0, [r0]\n\ - strh r0, [r1, 0x20]\n\ -_0801F9CC:\n\ - ldr r0, _0801FAE8 @ =gHitMarker\n\ - ldr r0, [r0]\n\ - movs r1, 0x40\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801FA02\n\ - ldr r6, _0801FAEC @ =gBattleMons\n\ - ldr r0, _0801FAF0 @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - movs r5, 0x58\n\ - muls r0, r5\n\ - adds r0, r6\n\ - ldrh r0, [r0, 0x28]\n\ - cmp r0, 0\n\ - beq _0801FA02\n\ - ldr r4, _0801FAF4 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - bl b_movescr_stack_push\n\ - ldr r1, _0801FAF8 @ =gBattleMoveDamage\n\ - adds r0, r7, 0\n\ - muls r0, r5\n\ - adds r0, r6\n\ - ldrh r0, [r0, 0x28]\n\ - str r0, [r1]\n\ - ldr r0, _0801FAFC @ =gUnknown_081D9156\n\ - str r0, [r4]\n\ -_0801FA02:\n\ - ldr r1, _0801FB00 @ =gStatuses3\n\ - ldr r6, _0801FB04 @ =gBankTarget\n\ - ldrb r0, [r6]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 7\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801FA1A\n\ - b _0801FB22\n\ -_0801FA1A:\n\ - ldr r0, _0801FAE8 @ =gHitMarker\n\ - ldr r5, [r0]\n\ - movs r0, 0x80\n\ - lsls r0, 17\n\ - ands r5, r0\n\ - cmp r5, 0\n\ - bne _0801FB22\n\ - ldr r4, _0801FAF0 @ =gBankAttacker\n\ - mov r8, r4\n\ - ldrb r0, [r4]\n\ - bl GetBankSide\n\ - adds r4, r0, 0\n\ - ldrb r0, [r6]\n\ - bl GetBankSide\n\ - lsls r4, 24\n\ - lsls r0, 24\n\ - cmp r4, r0\n\ - beq _0801FB22\n\ - ldr r0, _0801FAEC @ =gBattleMons\n\ - mov r9, r0\n\ - mov r1, r8\n\ - ldrb r2, [r1]\n\ - movs r7, 0x58\n\ - adds r3, r2, 0\n\ - muls r3, r7\n\ - adds r0, r3, r0\n\ - ldrh r0, [r0, 0x28]\n\ - cmp r0, 0\n\ - beq _0801FB22\n\ - ldr r0, _0801FB08 @ =gCurrentMove\n\ - ldrh r0, [r0]\n\ - cmp r0, 0xA5\n\ - beq _0801FB22\n\ - ldr r1, _0801FB0C @ =0x02000000\n\ - ldr r4, _0801FB10 @ =0x0001608c\n\ - adds r0, r2, r4\n\ - adds r0, r1\n\ - ldrb r4, [r0]\n\ - adds r0, r4, r3\n\ - mov r6, r9\n\ - adds r6, 0x24\n\ - adds r0, r6\n\ - strb r5, [r0]\n\ - ldr r5, _0801FAF4 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r5]\n\ - bl b_movescr_stack_push\n\ - ldr r0, _0801FB14 @ =gUnknown_081D9468\n\ - str r0, [r5]\n\ - ldr r5, _0801FAE4 @ =gActiveBank\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - strb r0, [r5]\n\ - adds r1, r4, 0\n\ - adds r1, 0x9\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - ldrb r0, [r5]\n\ - muls r0, r7\n\ - adds r0, r6\n\ - adds r0, r4\n\ - str r0, [sp]\n\ - movs r0, 0\n\ - movs r2, 0\n\ - movs r3, 0x1\n\ - bl EmitSetAttributes\n\ - ldrb r0, [r5]\n\ - bl MarkBufferBankForExecution\n\ - ldr r1, _0801FB18 @ =gBattleTextBuff1\n\ - movs r0, 0xFD\n\ - strb r0, [r1]\n\ - movs r0, 0x2\n\ - strb r0, [r1, 0x1]\n\ - lsls r4, 1\n\ - mov r2, r8\n\ - ldrb r0, [r2]\n\ - muls r0, r7\n\ - adds r0, r4, r0\n\ - mov r2, r9\n\ - adds r2, 0xC\n\ - adds r0, r2\n\ - ldrh r0, [r0]\n\ - strb r0, [r1, 0x2]\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - muls r0, r7\n\ - adds r4, r0\n\ - adds r4, r2\n\ - ldrh r0, [r4]\n\ - lsrs r0, 8\n\ - strb r0, [r1, 0x3]\n\ - movs r0, 0xFF\n\ - strb r0, [r1, 0x4]\n\ - b _0801FB22\n\ - .align 2, 0\n\ -_0801FAE0: .4byte gBattleResults\n\ -_0801FAE4: .4byte gActiveBank\n\ -_0801FAE8: .4byte gHitMarker\n\ -_0801FAEC: .4byte gBattleMons\n\ -_0801FAF0: .4byte gBankAttacker\n\ -_0801FAF4: .4byte gBattlescriptCurrInstr\n\ -_0801FAF8: .4byte gBattleMoveDamage\n\ -_0801FAFC: .4byte gUnknown_081D9156\n\ -_0801FB00: .4byte gStatuses3\n\ -_0801FB04: .4byte gBankTarget\n\ -_0801FB08: .4byte gCurrentMove\n\ -_0801FB0C: .4byte 0x02000000\n\ -_0801FB10: .4byte 0x0001608c\n\ -_0801FB14: .4byte gUnknown_081D9468\n\ -_0801FB18: .4byte gBattleTextBuff1\n\ -_0801FB1C:\n\ - ldr r0, [r6]\n\ - adds r0, 0x7\n\ - str r0, [r6]\n\ -_0801FB22:\n\ - add sp, 0x4\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided\n"); + u8 *r4; + + if (gBattlescriptCurrInstr[2] != 0) + { + gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]); + if (gHitMarker & HITMARKER_FAINTED(gActiveBank)) + { + r4 = T1_READ_PTR(gBattlescriptCurrInstr + 3); + + b_movescr_stack_pop_cursor(); + gBattlescriptCurrInstr = r4; + gSideAffecting[GetBankSide(gActiveBank)] &= ~SIDE_STATUS_SPIKES_DAMAGED; + } + else + { + gBattlescriptCurrInstr += 7; + } + } + else + { + u8 bank; + + if (gBattlescriptCurrInstr[1] == 1) + { + gActiveBank = gBankAttacker; + bank = gBankTarget; + r4 = gUnknown_081D8C58; + } + else + { + gActiveBank = gBankTarget; + bank = gBankAttacker; + r4 = gUnknown_081D8C65; + } + if (!(gAbsentBankFlags & gBitTable[gActiveBank]) + && gBattleMons[gActiveBank].hp == 0) + { + ewram[0x160AC + bank * 2 + 0] = 0; + ewram[0x160AC + bank * 2 + 1] = 0; + ewram[0x16100 + bank * 4 + 0] = 0; + ewram[0x16100 + bank * 4 + 1] = 0; + ewram[0x16100 + bank * 4 + 2] = 0; + ewram[0x16100 + bank * 4 + 3] = 0; + + gHitMarker |= HITMARKER_FAINTED(gActiveBank); + b_movescr_stack_push(gBattlescriptCurrInstr + 7); + gBattlescriptCurrInstr = r4; + if (GetBankSide(gActiveBank) == 0) + { + gHitMarker |= HITMARKER_x400000; + if (gBattleResults.playerFaintCounter < 0xFF) + gBattleResults.playerFaintCounter++; + if (gBattleMons[bank].level > gBattleMons[gActiveBank].level) + { + if (gBattleMons[bank].level - gBattleMons[gActiveBank].level > 0x1D) + AdjustFriendship(&gPlayerParty[gBattlePartyID[gActiveBank]], 8); + else + AdjustFriendship(&gPlayerParty[gBattlePartyID[gActiveBank]], 6); + } + } + else + { + if (gBattleResults.opponentFaintCounter < 0xFF) + gBattleResults.opponentFaintCounter++; + gBattleResults.lastOpponentSpecies = gBattleMons[gActiveBank].species; + } + if ((gHitMarker & HITMARKER_DESTINYBOND) && gBattleMons[gBankAttacker].hp != 0) + { + b_movescr_stack_push(gBattlescriptCurrInstr); + gBattleMoveDamage = gBattleMons[bank].hp; + gBattlescriptCurrInstr = gUnknown_081D9156; + } + if ((gStatuses3[gBankTarget] & STATUS3_GRUDGE) + && !(gHitMarker & HITMARKER_GRUDGE) + && GetBankSide(gBankAttacker) != GetBankSide(gBankTarget) + && gBattleMons[gBankAttacker].hp != 0 + && gCurrentMove != MOVE_STRUGGLE) + { + u8 moveIndex = ewram[0x1608C + gBankAttacker]; + + gBattleMons[gBankAttacker].pp[moveIndex] = 0; + b_movescr_stack_push(gBattlescriptCurrInstr); + gBattlescriptCurrInstr = gUnknown_081D9468; + gActiveBank = gBankAttacker; + EmitSetAttributes(0, moveIndex + 9, 0, 1, &gBattleMons[gActiveBank].pp[moveIndex]); + MarkBufferBankForExecution(gActiveBank); + + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 2; + gBattleTextBuff1[2] = gBattleMons[gBankAttacker].moves[moveIndex]; + gBattleTextBuff1[3] = gBattleMons[gBankAttacker].moves[moveIndex] >> 8; + gBattleTextBuff1[4] = EOS; + } + } + else + { + gBattlescriptCurrInstr += 7; + } + } } static void atk1A_faint_animation(void) { if (gBattleExecBuffer == 0) { - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); Emitcmd10(0); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr += 2; @@ -5645,7 +5079,7 @@ static void atk1B_faint_effects_clear(void) //Clears things like attraction or trapping to other banks if (gBattleExecBuffer == 0) { - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); gBattleMons[gActiveBank].status1 = 0; EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 0x4, &gBattleMons[gActiveBank].status1); MarkBufferBankForExecution(gActiveBank); @@ -5656,9 +5090,9 @@ static void atk1B_faint_effects_clear(void) static void atk1C_jumpifstatus(void) { - u8 bank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - u32 flags = BS2ScriptRead32(gBattlescriptCurrInstr + 2); - void* jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 6); + u8 bank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); + u32 flags = T2_READ_32(gBattlescriptCurrInstr + 2); + void* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 6); if (gBattleMons[bank].status1 & flags && gBattleMons[bank].hp) gBattlescriptCurrInstr = jump_loc; else @@ -5667,9 +5101,9 @@ static void atk1C_jumpifstatus(void) static void atk1D_jumpifstatus2(void) { - u8 bank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - u32 flags = BS2ScriptRead32(gBattlescriptCurrInstr + 2); - void* jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 6); + u8 bank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); + u32 flags = T2_READ_32(gBattlescriptCurrInstr + 2); + void* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 6); if (gBattleMons[bank].status2 & flags && gBattleMons[bank].hp) gBattlescriptCurrInstr = jump_loc; else @@ -5679,9 +5113,9 @@ static void atk1D_jumpifstatus2(void) static void atk1E_jumpifability(void) { u8 bank; - u8 ability = BSScriptRead8(gBattlescriptCurrInstr + 2); - void* jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 3); - if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 8) + u8 ability = T2_READ_8(gBattlescriptCurrInstr + 2); + void* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 3); + if (T2_READ_8(gBattlescriptCurrInstr + 1) == 8) { bank = AbilityBattleEffects(ABILITYEFFECT_CHECK_BANK_SIDE, gBankAttacker, ability, 0, 0); if (bank) @@ -5694,7 +5128,7 @@ static void atk1E_jumpifability(void) else gBattlescriptCurrInstr += 7; } - else if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 9) + else if (T2_READ_8(gBattlescriptCurrInstr + 1) == 9) { bank = AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gBankAttacker, ability, 0, 0); if (bank) @@ -5709,7 +5143,7 @@ static void atk1E_jumpifability(void) } else { - bank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + bank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); if (gBattleMons[bank].ability == ability) { gLastUsedAbility = ability; @@ -5727,13 +5161,13 @@ static void atk1F_jumpifsideaffecting(void) u8 side; u16 flags; void* jump_loc; - if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 1) + if (T2_READ_8(gBattlescriptCurrInstr + 1) == 1) side = GetBankIdentity(gBankAttacker) & 1; else side = GetBankIdentity(gBankTarget) & 1; - flags = BS2ScriptRead16(gBattlescriptCurrInstr + 2); - jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 4); + flags = T2_READ_16(gBattlescriptCurrInstr + 2); + jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 4); if (gSideAffecting[side] & flags) gBattlescriptCurrInstr = jump_loc; @@ -5744,37 +5178,37 @@ static void atk1F_jumpifsideaffecting(void) static void atk20_jumpifstat(void) { u8 ret = 0; - u8 bank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - u8 value = gBattleMons[bank].statStages[BSScriptRead8(gBattlescriptCurrInstr + 3)]; - switch (BSScriptRead8(gBattlescriptCurrInstr + 2)) + u8 bank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); + u8 value = gBattleMons[bank].statStages[T2_READ_8(gBattlescriptCurrInstr + 3)]; + switch (T2_READ_8(gBattlescriptCurrInstr + 2)) { case CMP_EQUAL: - if (value == BSScriptRead8(gBattlescriptCurrInstr + 4)) + if (value == T2_READ_8(gBattlescriptCurrInstr + 4)) ret++; break; case CMP_NOT_EQUAL: - if (value != BSScriptRead8(gBattlescriptCurrInstr + 4)) + if (value != T2_READ_8(gBattlescriptCurrInstr + 4)) ret++; break; case CMP_GREATER_THAN: - if (value > BSScriptRead8(gBattlescriptCurrInstr + 4)) + if (value > T2_READ_8(gBattlescriptCurrInstr + 4)) ret++; break; case CMP_LESS_THAN: - if (value < BSScriptRead8(gBattlescriptCurrInstr + 4)) + if (value < T2_READ_8(gBattlescriptCurrInstr + 4)) ret++; break; case CMP_COMMON_BITS: - if (value & BSScriptRead8(gBattlescriptCurrInstr + 4)) + if (value & T2_READ_8(gBattlescriptCurrInstr + 4)) ret++; break; case CMP_NO_COMMON_BITS: - if (!(value & BSScriptRead8(gBattlescriptCurrInstr + 4))) + if (!(value & T2_READ_8(gBattlescriptCurrInstr + 4))) ret++; break; } if (ret) - gBattlescriptCurrInstr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 5); + gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 5); else gBattlescriptCurrInstr += 9; } @@ -5784,10 +5218,10 @@ static void atk21_jumpifstatus3(void) u32 flags; void* jump_loc; - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - flags = BS2ScriptRead32(gBattlescriptCurrInstr + 2); - jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 7); - if (BSScriptRead8(gBattlescriptCurrInstr + 6)) + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); + flags = T2_READ_32(gBattlescriptCurrInstr + 2); + jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 7); + if (T2_READ_8(gBattlescriptCurrInstr + 6)) { if ((gStatuses3[gActiveBank] & flags) != 0) gBattlescriptCurrInstr += 11; @@ -5805,9 +5239,9 @@ static void atk21_jumpifstatus3(void) static void atk22_jumpiftype(void) //u8 bank, u8 type, *ptr { - u8 bank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - u8 type = BSScriptRead8(gBattlescriptCurrInstr + 2); - void* jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 3); + u8 bank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); + u8 type = T2_READ_8(gBattlescriptCurrInstr + 2); + void* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 3); if (gBattleMons[bank].type1 == type || gBattleMons[bank].type2 == type) gBattlescriptCurrInstr = jump_loc; @@ -5822,7 +5256,7 @@ static void atk23_getexp(void) u8 hold_effect; int via_expshare = 0, sent_in; u16* exp = &BATTLE_STRUCT->exp; - gBank1 = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + gBank1 = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); sent_in = gSentPokesToOpponent[(gBank1 & 2) >> 1]; switch (BATTLE_STRUCT->atk23StateTracker) { @@ -5832,13 +5266,14 @@ static void atk23_getexp(void) else { BATTLE_STRUCT->atk23StateTracker++; - unk_2000000[0x16113] |= gBitTable[gBattlePartyID[gBank1]]; + ((u8*)ewram)[0x16113] |= gBitTable[gBattlePartyID[gBank1]]; } break; case 1: //calculate experience points to redistribute { - int via_sent_in = 0, i; + int via_sent_in = 0; u16 calculatedExp; + int i; for (i = 0; i < 6; i++) { u16 item; @@ -5894,15 +5329,14 @@ static void atk23_getexp(void) BATTLE_STRUCT->sentInPokes >>= 1; tracker = &BATTLE_STRUCT->atk23StateTracker; zero = 0; - goto LABEL; + *tracker = 5; //increment looper + gBattleMoveDamage = zero; //used for exp } else if (GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL) == 100) { - BATTLE_STRUCT->sentInPokes >>= 1; tracker = &BATTLE_STRUCT->atk23StateTracker; zero = 0; - LABEL: *tracker = 5; //increment looper gBattleMoveDamage = zero; //used for exp } @@ -5937,7 +5371,9 @@ static void atk23_getexp(void) stringID = 0x14A; } else - stringID = 0x149; + { + stringID = 0x149; + } //get exp getter bank if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) @@ -5962,12 +5398,13 @@ static void atk23_getexp(void) gBattleTextBuff1[3] = BATTLE_STRUCT->expGetterID; gBattleTextBuff1[4] = 0xFF; - //buffer 'gained' or 'gained a boosted' - gBattleTextBuff2[0] = 0xFD; - gBattleTextBuff2[1] = 0; - gBattleTextBuff2[2] = sBYTE0_32(stringID); - gBattleTextBuff2[3] = sBYTE1_32(stringID); - gBattleTextBuff2[4] = 0xFF; + //buffer 'gained' or 'gained a boosted' + gBattleTextBuff2[0] = 0xFD; + gBattleTextBuff2[1] = 0; + gBattleTextBuff2[2] = stringID; + stringID = (stringID >> 8) & (0xFF); //this does not want to cooperate + gBattleTextBuff2[3] = stringID; + gBattleTextBuff2[4] = 0xFF; //buffer exp number gBattleTextBuff3[0] = 0xFD; @@ -5994,10 +5431,11 @@ static void atk23_getexp(void) gBattleBufferB[BATTLE_STRUCT->expGetterBank][0] = 0; if (GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HP) && GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL) != 100) { - BATTLE_STRUCT->beforeLvlUp[0] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_MAX_HP); //doesnt match + // Doesn't match. + BATTLE_STRUCT->beforeLvlUp[0] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_MAX_HP); BATTLE_STRUCT->beforeLvlUp[1] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_ATK); BATTLE_STRUCT->beforeLvlUp[2] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_DEF); - BATTLE_STRUCT->beforeLvlUp[3] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPD); + BATTLE_STRUCT->beforeLvlUp[3] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPEED); BATTLE_STRUCT->beforeLvlUp[4] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPATK); BATTLE_STRUCT->beforeLvlUp[5] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPDEF); @@ -6046,7 +5484,7 @@ static void atk23_getexp(void) gBattleMons[0].maxHP = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_MAX_HP); gBattleMons[0].attack = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_ATK); gBattleMons[0].defense = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_DEF); - gBattleMons[0].speed = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPD); + gBattleMons[0].speed = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPEED); gBattleMons[0].spAttack = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPATK); gBattleMons[0].spDefense = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPDEF); } @@ -6059,8 +5497,8 @@ static void atk23_getexp(void) gBattleMons[2].attack = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_ATK); gBattleMons[2].defense = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_DEF); //There are no words...GF can't even copy&paste code properly - gBattleMons[2].speed = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPD); - gBattleMons[2].spAttack = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPD /*RIP*/); + gBattleMons[2].speed = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPEED); + gBattleMons[2].spAttack = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPEED /*RIP*/); gBattleMons[2].spDefense = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPATK); } BATTLE_STRUCT->atk23StateTracker = 5; @@ -7274,14 +6712,14 @@ static void atk24(void) if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { if (found2 + found1 > 1) - gBattlescriptCurrInstr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1); else gBattlescriptCurrInstr += 5; } else { if (found2 != 0 && found1 != 0) - gBattlescriptCurrInstr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1); else gBattlescriptCurrInstr += 5; } @@ -7529,7 +6967,7 @@ static void atk25_move_values_cleanup(void) static void atk26_set_multihit(void) { - gMultiHitCounter = BSScriptRead8(gBattlescriptCurrInstr + 1); + gMultiHitCounter = T2_READ_8(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr += 2; } @@ -7538,20 +6976,20 @@ static void atk27_decrement_multihit(void) if (--gMultiHitCounter == 0) gBattlescriptCurrInstr += 5; else - gBattlescriptCurrInstr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1); } static void atk28_goto(void) { - gBattlescriptCurrInstr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T2_READ_PTR(gBattlescriptCurrInstr + 1); } static void atk29_jumpifbyte(void) { - u8 caseID = BSScriptRead8(gBattlescriptCurrInstr + 1); - u8* ptr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 2); - u8 value = BSScriptRead8(gBattlescriptCurrInstr + 6); - u8* jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 7); + u8 caseID = T2_READ_8(gBattlescriptCurrInstr + 1); + u8* ptr = T2_READ_PTR(gBattlescriptCurrInstr + 2); + u8 value = T2_READ_8(gBattlescriptCurrInstr + 6); + u8* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 7); gBattlescriptCurrInstr += 11; switch (caseID) { @@ -7584,10 +7022,10 @@ static void atk29_jumpifbyte(void) static void atk2A_jumpifhalfword(void) { - u8 caseID = BSScriptRead8(gBattlescriptCurrInstr + 1); - u16* ptr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 2); - u16 value = BS2ScriptRead16(gBattlescriptCurrInstr + 6); - u8* jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 8); + u8 caseID = T2_READ_8(gBattlescriptCurrInstr + 1); + u16* ptr = T2_READ_PTR(gBattlescriptCurrInstr + 2); + u16 value = T2_READ_16(gBattlescriptCurrInstr + 6); + u8* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 8); gBattlescriptCurrInstr += 12; switch (caseID) { @@ -7618,12 +7056,13 @@ static void atk2A_jumpifhalfword(void) } } +// Strange that there's an instance of T1_READ_32 in what seems to be a T2 function. see global.h for the distinction. static void atk2B_jumpifword(void) { - u8 caseID = BSScriptRead8(gBattlescriptCurrInstr + 1); - u32* ptr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 2); - u32 value = BSScriptRead32(gBattlescriptCurrInstr + 6); - u8* jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 10); + u8 caseID = T2_READ_8(gBattlescriptCurrInstr + 1); + u32* ptr = T2_READ_PTR(gBattlescriptCurrInstr + 2); + u32 value = T1_READ_32(gBattlescriptCurrInstr + 6); + u8* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 10); gBattlescriptCurrInstr += 14; switch (caseID) { @@ -7657,10 +7096,10 @@ static void atk2B_jumpifword(void) static void atk2C_jumpifarrayequal(void) { //Mem1, Mem2, Size, Jump Loc - u8* mem1 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); - u8* mem2 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 5); - u32 size = BSScriptRead8(gBattlescriptCurrInstr + 9); - u8* jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 10); + u8* mem1 = T2_READ_PTR(gBattlescriptCurrInstr + 1); + u8* mem2 = T2_READ_PTR(gBattlescriptCurrInstr + 5); + u32 size = T2_READ_8(gBattlescriptCurrInstr + 9); + u8* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 10); u8 i; for (i = 0; i < size; i++) @@ -7681,10 +7120,10 @@ static void atk2D_jumpifarraynotequal(void) { //Mem1, Mem2, Size, Jump Loc u8 equal_bytes = 0; - u8* mem1 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); - u8* mem2 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 5); - u32 size = BSScriptRead8(gBattlescriptCurrInstr + 9); - u8* jump_loc = BS2ScriptReadPtr(gBattlescriptCurrInstr + 10); + u8* mem1 = T2_READ_PTR(gBattlescriptCurrInstr + 1); + u8* mem2 = T2_READ_PTR(gBattlescriptCurrInstr + 5); + u32 size = T2_READ_8(gBattlescriptCurrInstr + 9); + u8* jump_loc = T2_READ_PTR(gBattlescriptCurrInstr + 10); u8 i; for (i = 0; i < size; i++) @@ -7704,30 +7143,30 @@ static void atk2D_jumpifarraynotequal(void) static void atk2E_setbyte(void) { - u8* mem = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); - *mem = BSScriptRead8(gBattlescriptCurrInstr + 5); + u8* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1); + *mem = T2_READ_8(gBattlescriptCurrInstr + 5); gBattlescriptCurrInstr += 6; } static void atk2F_addbyte(void) { - u8* mem = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); - *mem += BSScriptRead8(gBattlescriptCurrInstr + 5); + u8* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1); + *mem += T2_READ_8(gBattlescriptCurrInstr + 5); gBattlescriptCurrInstr += 6; } static void atk30_subbyte(void) { - u8* mem = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); - *mem -= BSScriptRead8(gBattlescriptCurrInstr + 5); + u8* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1); + *mem -= T2_READ_8(gBattlescriptCurrInstr + 5); gBattlescriptCurrInstr += 6; } static void atk31_copyarray(void) { - u8* mem1 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); - u8* mem2 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 5); - s32 size = BSScriptRead8(gBattlescriptCurrInstr + 9); + u8* mem1 = T2_READ_PTR(gBattlescriptCurrInstr + 1); + u8* mem2 = T2_READ_PTR(gBattlescriptCurrInstr + 5); + s32 size = T2_READ_8(gBattlescriptCurrInstr + 9); s32 i; for (i = 0; i < size; i++) @@ -7740,10 +7179,10 @@ static void atk31_copyarray(void) static void atk32_copyarray_withindex(void) { - u8* mem1 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); - u8* mem2 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 5); - u8* index = BS2ScriptReadPtr(gBattlescriptCurrInstr + 9); - s32 size = BSScriptRead8(gBattlescriptCurrInstr + 13); + u8* mem1 = T2_READ_PTR(gBattlescriptCurrInstr + 1); + u8* mem2 = T2_READ_PTR(gBattlescriptCurrInstr + 5); + u8* index = T2_READ_PTR(gBattlescriptCurrInstr + 9); + s32 size = T2_READ_8(gBattlescriptCurrInstr + 13); s32 i; for (i = 0; i < size; i++) @@ -7756,15 +7195,15 @@ static void atk32_copyarray_withindex(void) static void atk33_orbyte(void) { - u8* mem = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); - *mem |= BSScriptRead8(gBattlescriptCurrInstr + 5); + u8* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1); + *mem |= T2_READ_8(gBattlescriptCurrInstr + 5); gBattlescriptCurrInstr += 6; } static void atk34_orhalfword(void) { - u16* mem = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); - u16 val = BS2ScriptRead16(gBattlescriptCurrInstr + 5); + u16* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1); + u16 val = T2_READ_16(gBattlescriptCurrInstr + 5); *mem |= val; gBattlescriptCurrInstr += 7; @@ -7772,8 +7211,8 @@ static void atk34_orhalfword(void) static void atk35_orword(void) { - u32* mem = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); - u32 val = BS2ScriptRead32(gBattlescriptCurrInstr + 5); + u32* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1); + u32 val = T2_READ_32(gBattlescriptCurrInstr + 5); *mem |= val; gBattlescriptCurrInstr += 9; @@ -7781,15 +7220,15 @@ static void atk35_orword(void) static void atk36_bicbyte(void) { - u8* mem = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); - *mem &= ~(BSScriptRead8(gBattlescriptCurrInstr + 5)); + u8* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1); + *mem &= ~(T2_READ_8(gBattlescriptCurrInstr + 5)); gBattlescriptCurrInstr += 6; } static void atk37_bichalfword(void) { - u16* mem = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); - u16 val = BS2ScriptRead16(gBattlescriptCurrInstr + 5); + u16* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1); + u16 val = T2_READ_16(gBattlescriptCurrInstr + 5); *mem &= ~val; gBattlescriptCurrInstr += 7; @@ -7797,8 +7236,8 @@ static void atk37_bichalfword(void) static void atk38_bicword(void) { - u32* mem = BS2ScriptReadPtr(gBattlescriptCurrInstr + 1); - u32 val = BS2ScriptRead32(gBattlescriptCurrInstr + 5); + u32* mem = T2_READ_PTR(gBattlescriptCurrInstr + 1); + u32 val = T2_READ_32(gBattlescriptCurrInstr + 5); *mem &= ~val; gBattlescriptCurrInstr += 9; @@ -7808,7 +7247,7 @@ static void atk39_pause(void) { if (gBattleExecBuffer == 0) { - u16 value = BS2ScriptRead16(gBattlescriptCurrInstr + 1); + u16 value = T2_READ_16(gBattlescriptCurrInstr + 1); if (++gPauseCounterBattle >= value) { gPauseCounterBattle = 0; @@ -7825,7 +7264,7 @@ static void atk3A_waitstate(void) static void atk3B_healthbar_update(void) { - if (!BSScriptRead8(gBattlescriptCurrInstr + 1)) + if (!T2_READ_8(gBattlescriptCurrInstr + 1)) gActiveBank = gBankTarget; else gActiveBank = gBankAttacker; @@ -7865,23 +7304,23 @@ static void atk3F_end3(void) //pops the main function stack static void atk41_call(void) { b_movescr_stack_push(gBattlescriptCurrInstr + 5); - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } static void atk42_jumpiftype2(void) //u8 bank, u8 type, *ptr { - u8 bank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + u8 bank = GetBattleBank(T1_READ_8(gBattlescriptCurrInstr + 1)); - if (BSScriptRead8(gBattlescriptCurrInstr + 2) == gBattleMons[bank].type1 || BSScriptRead8(gBattlescriptCurrInstr + 2) == gBattleMons[bank].type2) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 3); + if (T1_READ_8(gBattlescriptCurrInstr + 2) == gBattleMons[bank].type1 || T1_READ_8(gBattlescriptCurrInstr + 2) == gBattleMons[bank].type2) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); else gBattlescriptCurrInstr += 7; } static void atk43_jumpifabilitypresent(void) { - if (AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, BSScriptRead8(gBattlescriptCurrInstr + 1), 0, 0)) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2); + if (AbilityBattleEffects(ABILITYEFFECT_CHECK_ON_FIELD, 0, T2_READ_8(gBattlescriptCurrInstr + 1), 0, 0)) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); else gBattlescriptCurrInstr += 6; } @@ -7895,9 +7334,9 @@ static void atk44(void) static void atk45_playanimation(void) { - #define ANIMATION_ID BSScriptRead8(gBattlescriptCurrInstr + 2) - #define ARGUMENT (u16*) BS2ScriptReadPtr(gBattlescriptCurrInstr + 3) - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + #define ANIMATION_ID T2_READ_8(gBattlescriptCurrInstr + 2) + #define ARGUMENT (u16*) T2_READ_PTR(gBattlescriptCurrInstr + 3) + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); if ( ANIMATION_ID == 1 || ANIMATION_ID == 0x11 || ANIMATION_ID == 2) { EmitBattleAnimation(0, ANIMATION_ID, *argument); @@ -8022,9 +7461,39 @@ _080214AE:\n\ #ifdef NONMATCHING static void atk46_playanimation2(void) { - + u8 arg1; + u8* arg2; + u16* arg3; + u32 something; + + arg1 = T2_READ_8(gBattlescriptCurrInstr + 1); + gActiveBank = GetBattleBank(arg1); + arg2 = T2_READ_PTR(gBattlescriptCurrInstr + 2); + arg3 = T2_READ_PTR(gBattlescriptCurrInstr + 6); + + if (*arg2 == 1 || *arg2 == 0x11 || *arg2 == 2) + { + EmitBattleAnimation(0, *arg2, *arg3); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr += 10; + return; + } + if ((gHitMarker & 0x80)) + { + something = (u32)(gBattlescriptCurrInstr + 10); + } + else + { + u8 yeah = *arg2 - 10; + if (yeah < 4 || (gStatuses3[gActiveBank] & 0x000400C0) == 0) + { + EmitBattleAnimation(0, *arg2, *arg3); + MarkBufferBankForExecution(gActiveBank); + } + something = (u32)(gBattlescriptCurrInstr + 10); + } + gBattlescriptCurrInstr = (u8*)something; } - #else __attribute__((naked)) static void atk46_playanimation2(void) @@ -8165,9 +7634,9 @@ static void atk48_playstatchangeanimation(void) u32 stats_to_check; u8 arg3; - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - stats_to_check = BSScriptRead8(gBattlescriptCurrInstr + 2); - arg3 = BSScriptRead8(gBattlescriptCurrInstr + 3); + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); + stats_to_check = T2_READ_8(gBattlescriptCurrInstr + 2); + arg3 = T2_READ_8(gBattlescriptCurrInstr + 3); if (arg3 & 1) { u16 r1 = 0x15; @@ -8177,7 +7646,7 @@ static void atk48_playstatchangeanimation(void) { if (!(stats_to_check & 1)) continue; - if (!(BSScriptRead8(gBattlescriptCurrInstr + 3))) + if (!(T2_READ_8(gBattlescriptCurrInstr + 3))) { u8 ability; if (gSideTimer[GetBankIdentity(gActiveBank) & 1].mistTimer) @@ -8196,7 +7665,7 @@ static void atk48_playstatchangeanimation(void) r1 += 1; curr_stat++; } - if (changeable_stats > 1 && BSScriptRead8(gBattlescriptCurrInstr + 3) & 2) + if (changeable_stats > 1 && T2_READ_8(gBattlescriptCurrInstr + 3) & 2) stat_animID = 0x39; else stat_animID = 0x3A; @@ -8220,19 +7689,19 @@ static void atk48_playstatchangeanimation(void) r1 += 1; curr_stat++; } - if (changeable_stats > 1 && BSScriptRead8(gBattlescriptCurrInstr + 3) & 2) + if (changeable_stats > 1 && T2_READ_8(gBattlescriptCurrInstr + 3) & 2) stat_animID = 0x37; else stat_animID = 0x38; } - if ((BSScriptRead8(gBattlescriptCurrInstr + 3) & 2 && changeable_stats <= 1) + if ((T2_READ_8(gBattlescriptCurrInstr + 3) & 2 && changeable_stats <= 1) || changeable_stats == 0 || BATTLE_STRUCT->filler2[0] != 0) gBattlescriptCurrInstr += 4; else { EmitBattleAnimation(0, 1, stat_animID); MarkBufferBankForExecution(gActiveBank); - if ((BSScriptRead8(gBattlescriptCurrInstr + 3) & 4) && changeable_stats > 1) + if ((T2_READ_8(gBattlescriptCurrInstr + 3) & 4) && changeable_stats > 1) BATTLE_STRUCT->filler2[0] = 1; gBattlescriptCurrInstr += 4; } @@ -8518,8 +7987,8 @@ static void atk49_moveendturn(void) if (gLastUsedMove != 0xFFFF) last_move = gLastUsedMove; - arg1 = BSScriptRead8(gBattlescriptCurrInstr + 1); - arg2 = BSScriptRead8(gBattlescriptCurrInstr + 2); + arg1 = T2_READ_8(gBattlescriptCurrInstr + 1); + arg2 = T2_READ_8(gBattlescriptCurrInstr + 2); if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) hold_effect_atk = gEnigmaBerries[gBankAttacker].holdEffect; else @@ -10051,7 +9520,7 @@ static void atk4C_copy_poke_data(void) if (gBattleExecBuffer) return; - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); gBattlePartyID[gActiveBank] = unk_2000000[0x16068 + gActiveBank]; @@ -10078,7 +9547,7 @@ static void atk4D_switch_data_update(void) if (gBattleExecBuffer) return; - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); OldData = gBattleMons[gActiveBank]; monData = (u8*)(&gBattleMons[gActiveBank]); for (i = 0; i < sizeof(struct BattlePokemon); i++) @@ -10119,13 +9588,13 @@ static void atk4E_switchin_anim(void) if (gBattleExecBuffer) return; - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); if (GetBankSide(gActiveBank) == 1 && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER))) { - GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), 2); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), 2); } gAbsentBankFlags &= ~(gBitTable[gActiveBank]); - EmitSendOutPoke(0, gBattlePartyID[gActiveBank], BSScriptRead8(gBattlescriptCurrInstr + 2)); + EmitSendOutPoke(0, gBattlePartyID[gActiveBank], T2_READ_8(gBattlescriptCurrInstr + 2)); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr += 3; } @@ -10136,12 +9605,12 @@ static void atk4F_jump_if_cannot_switch(void) register struct Pokemon *party; u8 r7; //0x80 byte is used as a way of telling the function whether to not check status2/status3 - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1) & 0x7F); - if (!(BSScriptRead8(gBattlescriptCurrInstr + 1) & 0x80) + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1) & 0x7F); + if (!(T2_READ_8(gBattlescriptCurrInstr + 1) & 0x80) && ((gBattleMons[gActiveBank].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) || (gStatuses3[gActiveBank] & STATUS3_ROOTED))) { - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); return; } if (gBattleTypeFlags & BATTLE_TYPE_MULTI) @@ -10162,7 +9631,7 @@ static void atk4F_jump_if_cannot_switch(void) break; } if (val == to_cmp) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); else gBattlescriptCurrInstr += 6; } @@ -10195,7 +9664,7 @@ static void atk4F_jump_if_cannot_switch(void) break; } if (val == 6) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); else gBattlescriptCurrInstr += 6; } @@ -10214,9 +9683,9 @@ static void atk50_openpartyscreen(void) { int i = 0; int r9 = 0; - u8* fail_loc = BSScriptReadPtr(gBattlescriptCurrInstr + 2); + u8* fail_loc = T1_READ_PTR(gBattlescriptCurrInstr + 2); - if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 5) + if (T2_READ_8(gBattlescriptCurrInstr + 1) == 5) { if ((gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI)) != BATTLE_TYPE_DOUBLE) { @@ -11285,8 +10754,8 @@ static void atk51_switch_handle_order(void) if (gBattleExecBuffer) return; - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - switch (BSScriptRead8(gBattlescriptCurrInstr + 2)) + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); + switch (T2_READ_8(gBattlescriptCurrInstr + 2)) { case 0: for (i = 0; i < gNoOfAllBanks; i++) @@ -11336,7 +10805,7 @@ static void atk52_switch_in_effects(void) { int i; - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); sub_80157C4(gActiveBank); gHitMarker &= ~(HITMARKER_FAINTED(gActiveBank)); gSpecialStatuses[gActiveBank].flag40 = 0; @@ -11356,9 +10825,9 @@ static void atk52_switch_in_effects(void) BATTLE_STRUCT->scriptingActive = gActiveBank; b_movescr_stack_push_cursor(); - if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 0) + if (T2_READ_8(gBattlescriptCurrInstr + 1) == 0) gBattlescriptCurrInstr = gUnknown_081D919F; - else if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 1) + else if (T2_READ_8(gBattlescriptCurrInstr + 1) == 1) gBattlescriptCurrInstr = gUnknown_081D9171; else gBattlescriptCurrInstr = gUnknown_081D91CD; @@ -11385,7 +10854,7 @@ static void atk52_switch_in_effects(void) *(HP_ON_SWITCHOUT + GetBankSide(i)) = gBattleMons[i].hp; } - if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 5) + if (T2_READ_8(gBattlescriptCurrInstr + 1) == 5) { u32 hitmark = gHitMarker >> 0x1C; gBank1++; @@ -11405,7 +10874,7 @@ static void atk52_switch_in_effects(void) static void atk53_trainer_slide(void) { - if (!BSScriptRead8(gBattlescriptCurrInstr + 1)) + if (!T2_READ_8(gBattlescriptCurrInstr + 1)) gActiveBank = GetBankByPlayerAI(0); else gActiveBank = GetBankByPlayerAI(1); @@ -11418,7 +10887,7 @@ static void atk53_trainer_slide(void) static void atk54_effectiveness_sound(void) { gActiveBank = gBankAttacker; - EmitEffectivenessSound(0, BS2ScriptRead16(gBattlescriptCurrInstr + 1)); + EmitEffectivenessSound(0, T2_READ_16(gBattlescriptCurrInstr + 1)); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr += 3; } @@ -11426,14 +10895,14 @@ static void atk54_effectiveness_sound(void) static void atk55_play_sound(void) { gActiveBank = gBankAttacker; - Emitcmd44(0, BS2ScriptRead16(gBattlescriptCurrInstr + 1)); + Emitcmd44(0, T2_READ_16(gBattlescriptCurrInstr + 1)); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr += 3; } static void atk56_fainting_cry(void) { - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); EmitFaintingCry(0); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr += 2; @@ -11449,7 +10918,7 @@ static void atk57(void) static void atk58_return_to_ball(void) { - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); EmitReturnPokeToBall(0, 1); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr += 2; @@ -11457,10 +10926,10 @@ static void atk58_return_to_ball(void) void atk59_learnmove_inbattle(void) { - u8* loc1 = BSScriptReadPtr(gBattlescriptCurrInstr + 1); - u8* loc2 = BSScriptReadPtr(gBattlescriptCurrInstr + 5); + u8* loc1 = T1_READ_PTR(gBattlescriptCurrInstr + 1); + u8* loc2 = T1_READ_PTR(gBattlescriptCurrInstr + 5); - u16 ret = MonTryLearningNewMove(&gPlayerParty[BATTLE_STRUCT->expGetterID], BSScriptRead8(gBattlescriptCurrInstr + 9)); + u16 ret = MonTryLearningNewMove(&gPlayerParty[BATTLE_STRUCT->expGetterID], T2_READ_8(gBattlescriptCurrInstr + 9)); while (ret == 0xFFFE) ret = MonTryLearningNewMove(&gPlayerParty[BATTLE_STRUCT->expGetterID], 0); @@ -11573,7 +11042,7 @@ static void atk5A(void) { u8 *ptr; - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); ptr = gBattleTextBuff2; { ptr[0] = 0xFD; @@ -11643,7 +11112,7 @@ static void atk5B_80256E0(void) { PlaySE(SE_SELECT); if (gBattleCommunication[1] != 0) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else gBattlescriptCurrInstr += 5; sub_8023AD8(); @@ -11651,7 +11120,7 @@ static void atk5B_80256E0(void) else if (gMain.newKeys & B_BUTTON) { PlaySE(SE_SELECT); - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); sub_8023AD8(); } } @@ -11659,7 +11128,7 @@ static void atk5B_80256E0(void) static void atk5C_hitanimation(void) { - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); if (gBattleMoveFlags & MOVESTATUS_NOEFFECT) gBattlescriptCurrInstr += 2; else if (!(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE) || !(gBattleMons[gActiveBank].status2 & STATUS2_SUBSTITUTE) || gDisableStructs[gActiveBank].substituteHP == 0) @@ -11932,7 +11401,7 @@ _08024190: .4byte gBattlescriptCurrInstr\n\ static void atk5E_8025A70(void) { - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); switch (gBattleCommunication[0]) { case 0: @@ -11973,26 +11442,20 @@ static void atk60_increment_gamestat(void) { if (GetBankSide(gBankAttacker) == 0) { - IncrementGameStat(BSScriptRead8(gBattlescriptCurrInstr + 1)); + IncrementGameStat(T2_READ_8(gBattlescriptCurrInstr + 1)); } gBattlescriptCurrInstr += 2; } -struct hp_status -{ - u16 hp; - u32 status; -}; - static void atk61_8025BA4(void) { int i; struct Pokemon* party; - struct hp_status hpStatus[6]; + struct HpAndStatus hpStatus[6]; if (gBattleExecBuffer) return; - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); if (GetBankSide(gActiveBank) == 0) party = gPlayerParty; else @@ -12011,14 +11474,14 @@ static void atk61_8025BA4(void) hpStatus[i].status = GetMonData(&party[i], MON_DATA_STATUS); } } - Emitcmd48(0, (u8*)(hpStatus), 1); + EmitDrawPartyStatusSummary(0, hpStatus, 1); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr += 2; } static void atk62_08025C6C(void) { - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); Emitcmd49(0); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr += 2; @@ -12026,7 +11489,7 @@ static void atk62_08025C6C(void) static void atk63_jumptorandomattack(void) { - if (BSScriptRead8(gBattlescriptCurrInstr + 1)) + if (T2_READ_8(gBattlescriptCurrInstr + 1)) gCurrentMove = gRandomMove; else gUnknown_02024BE8 = gCurrentMove = gRandomMove; @@ -12037,7 +11500,7 @@ static void atk64_statusanimation(void) { if (gBattleExecBuffer == 0) { - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); if (!(gStatuses3[gActiveBank] & STATUS3_SEMI_INVULNERABLE) && gDisableStructs[gActiveBank].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) { EmitStatusAnimation(0, 0, gBattleMons[gActiveBank].status1); @@ -12052,8 +11515,8 @@ static void atk65_status2animation(void) if (gBattleExecBuffer == 0) { u32 possible_to_anim; - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - possible_to_anim = BSScriptRead32(gBattlescriptCurrInstr + 2); + gActiveBank = GetBattleBank(T1_READ_8(gBattlescriptCurrInstr + 1)); + possible_to_anim = T1_READ_32(gBattlescriptCurrInstr + 2); if (!(gStatuses3[gActiveBank] & STATUS3_SEMI_INVULNERABLE) && gDisableStructs[gActiveBank].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) { EmitStatusAnimation(0, 1, gBattleMons[gActiveBank].status2 & possible_to_anim); @@ -12068,11 +11531,11 @@ static void atk66_chosenstatusanimation(void) if (gBattleExecBuffer == 0) { u32 status; - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - status = BSScriptRead32(gBattlescriptCurrInstr + 3); + gActiveBank = GetBattleBank(T1_READ_8(gBattlescriptCurrInstr + 1)); + status = T1_READ_32(gBattlescriptCurrInstr + 3); if (!(gStatuses3[gActiveBank] & STATUS3_SEMI_INVULNERABLE) && gDisableStructs[gActiveBank].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) { - EmitStatusAnimation(0, BSScriptRead8(gBattlescriptCurrInstr + 2), status); + EmitStatusAnimation(0, T1_READ_8(gBattlescriptCurrInstr + 2), status); MarkBufferBankForExecution(gActiveBank); } gBattlescriptCurrInstr += 7; @@ -12176,7 +11639,7 @@ static void atk69_dmg_adjustment2(void) //literally a copy of atk07 except there void atk6A_removeitem(void) { - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); #define USED_HELD_ITEMS(bank) (*(u16 *)&ewram[0x160CC + 2 * (bank)]) USED_HELD_ITEMS(gActiveBank) = gBattleMons[gActiveBank].item; @@ -12636,7 +12099,7 @@ static void atk6E_set_atk_to_player0(void) static void atk6F_set_visible(void) { - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); EmitSpriteInvisibility(0, 0); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr += 2; @@ -12644,7 +12107,7 @@ static void atk6F_set_visible(void) static void atk70_record_ability(void) { - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); RecordAbilityBattle(gActiveBank, gLastUsedAbility); gBattlescriptCurrInstr += 1; //buggy, should be += 2, one byte for command, one byte for argument... } @@ -12667,7 +12130,7 @@ static void atk71_buffer_move_to_learn(void) static void atk72_jump_if_can_run_frombattle(void) { if (sub_8014AB8(gBank1)) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else gBattlescriptCurrInstr += 5; } @@ -12678,7 +12141,7 @@ static void atk73_hp_thresholds(void) s32 result; if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) { - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); opposing_bank = gActiveBank ^ 1; result = gBattleMons[opposing_bank].hp * 100 / gBattleMons[opposing_bank].maxHP; @@ -12705,7 +12168,7 @@ static void atk74_hp_thresholds2(void) s32 result; if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) { - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); opposing_bank = gActiveBank ^ 1; hp_switchout = ewram[2 * GetBankSide(opposing_bank) + 0x160bc]; //BATTLE_STRUCT->HP_OnSwitchout[GetBankSide(opposing_bank)]; result = (hp_switchout - gBattleMons[opposing_bank].hp) * 100 / hp_switchout; @@ -12732,8 +12195,8 @@ static void atk75_8026A58(void) static void atk76_various(void) { - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); - switch (BSScriptRead8(gBattlescriptCurrInstr + 2)) + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); + switch (T2_READ_8(gBattlescriptCurrInstr + 2)) { case 0: CancelMultiTurnMoves(gActiveBank); @@ -12880,7 +12343,7 @@ static void atk79_setatkhptozero(void) static void atk7A_jumpwhiletargetvalid(void) //used by intimidate to loop through all targets { - u8* jump_loc = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + u8* jump_loc = T1_READ_PTR(gBattlescriptCurrInstr + 1); if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { @@ -12903,9 +12366,9 @@ static void atk7A_jumpwhiletargetvalid(void) //used by intimidate to loop throug static void atk7B_healhalfHP_if_possible(void) { - u8* fail_loc = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + u8* fail_loc = T1_READ_PTR(gBattlescriptCurrInstr + 1); - if (BSScriptRead8(gBattlescriptCurrInstr + 5) == 1) + if (T2_READ_8(gBattlescriptCurrInstr + 5) == 1) gBankTarget = gBankAttacker; gBattleMoveDamage = gBattleMons[gBankTarget].maxHP / 2; @@ -13022,7 +12485,7 @@ static void atk7F_setseeded(void) static void atk80_manipulatedamage(void) { - switch (BSScriptRead8(gBattlescriptCurrInstr + 1)) + switch (T2_READ_8(gBattlescriptCurrInstr + 1)) { case 0: gBattleMoveDamage *= -1; @@ -13044,7 +12507,7 @@ static void atk80_manipulatedamage(void) static void atk81_setrest(void) { - u8* fail_loc = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + u8* fail_loc = T1_READ_PTR(gBattlescriptCurrInstr + 1); gActiveBank = gBankTarget = gBankAttacker; gBattleMoveDamage = gBattleMons[gBankTarget].maxHP * (-1); if (gBattleMons[gBankTarget].hp == gBattleMons[gBankTarget].maxHP) @@ -13065,7 +12528,7 @@ static void atk81_setrest(void) static void atk82_jumpifnotfirstturn(void) { - u8* jump_loc = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + u8* jump_loc = T1_READ_PTR(gBattlescriptCurrInstr + 1); if (gDisableStructs[gBankAttacker].isFirstTurn) gBattlescriptCurrInstr += 5; @@ -13102,7 +12565,7 @@ bool8 UproarWakeUpCheck(u8 bank) static void atk84_jump_if_cant_sleep(void) { - u8* jump_loc = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + u8* jump_loc = T1_READ_PTR(gBattlescriptCurrInstr + 1); if (UproarWakeUpCheck(gBankTarget)) gBattlescriptCurrInstr = jump_loc; else if (gBattleMons[gBankTarget].ability == ABILITY_INSOMNIA || gBattleMons[gBankTarget].ability == ABILITY_VITAL_SPIRIT) @@ -13141,7 +12604,7 @@ static void atk85_stockpile(void) static void atk86_stockpiletobasedamage(void) { - u8* jump_loc = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + u8* jump_loc = T1_READ_PTR(gBattlescriptCurrInstr + 1); if (gDisableStructs[gBankAttacker].stockpileCounter == 0) { gBattlescriptCurrInstr = jump_loc; @@ -13166,7 +12629,7 @@ static void atk86_stockpiletobasedamage(void) static void atk87_stockpiletohpheal(void) { - u8* jump_loc = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + u8* jump_loc = T1_READ_PTR(gBattlescriptCurrInstr + 1); if (gDisableStructs[gBankAttacker].stockpileCounter == 0) { gBattlescriptCurrInstr = jump_loc; @@ -13953,8 +13416,8 @@ _080262C0: .4byte gBattleMoveFlags\n\ static void atk89_statbuffchange(void) { - u8* jump_loc = BSScriptReadPtr(gBattlescriptCurrInstr + 2); - if (ChangeStatBuffs(BATTLE_STRUCT->statChanger & 0xF0, BATTLE_STRUCT->statChanger & 0xF, BSScriptRead8(gBattlescriptCurrInstr + 1), jump_loc) == 0) + u8* jump_loc = T1_READ_PTR(gBattlescriptCurrInstr + 2); + if (ChangeStatBuffs(BATTLE_STRUCT->statChanger & 0xF0, BATTLE_STRUCT->statChanger & 0xF, T2_READ_8(gBattlescriptCurrInstr + 1), jump_loc) == 0) gBattlescriptCurrInstr += 6; } @@ -13989,8 +13452,8 @@ static void atk8C_confuseifrepeatingattackends(void) static void atk8D_setmultihit_counter(void) { - if (BSScriptRead8(gBattlescriptCurrInstr + 1)) - gMultiHitCounter = BSScriptRead8(gBattlescriptCurrInstr + 1); + if (T2_READ_8(gBattlescriptCurrInstr + 1)) + gMultiHitCounter = T2_READ_8(gBattlescriptCurrInstr + 1); else { gMultiHitCounter = Random() & 3; @@ -14024,7 +13487,7 @@ static bool8 sub_80264C0(void) u16 random = Random() & 0xFF; if ((u32)((random * (gBattleMons[gBankAttacker].level + gBattleMons[gBankTarget].level) >> 8) + 1) <= (gBattleMons[gBankTarget].level / 4)) { - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); return 0; } ewram[gBankTarget + 0x16064] = gBattlePartyID[gBankTarget]; @@ -14075,7 +13538,7 @@ static void atk8F_forcerandomswitch(void) if ((valid < 2 && (gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI)) != BATTLE_TYPE_DOUBLE) || (valid < 3 && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && !(gBattleTypeFlags & BATTLE_TYPE_MULTI))) { - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else if (sub_80264C0()) { @@ -14151,7 +13614,7 @@ static void atk90_conversion_type_change(void) if (checked_move == valid_moves) { - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { @@ -14270,7 +13733,7 @@ MOVESTATUS_MISSED_LABEL: gBattleCommunication[MULTISTRING_CHOOSER] = 1; else gBattleCommunication[MULTISTRING_CHOOSER] = 0; - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } #else @@ -14725,7 +14188,7 @@ static void atk97_try_infatuation(void) || gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE || gBattleMons[gBankTarget].status2 & STATUS2_INFATUATION || GetGenderFromSpeciesAndPersonality(atk_species, atk_pid) == 0xFF || GetGenderFromSpeciesAndPersonality(def_species, def_pid) == 0xFF) { - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { @@ -14740,9 +14203,9 @@ static void atk98_status_icon_update(void) if (gBattleExecBuffer) return; - if (BSScriptRead8(gBattlescriptCurrInstr + 1) != 4) + if (T2_READ_8(gBattlescriptCurrInstr + 1) != 4) { - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); EmitStatusIconUpdate(0, gBattleMons[gActiveBank].status1, gBattleMons[gActiveBank].status2); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr += 2; @@ -14882,7 +14345,7 @@ static void atk9D_copyattack(void) if (IsMoveUncopyable(gLastUsedMove[gBankTarget]) || gBattleMons[gBankAttacker].status2 & STATUS2_TRANSFORMED || gLastUsedMove[gBankTarget] == 0 || gLastUsedMove[gBankTarget] == 0xFFFF) { - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { @@ -14910,7 +14373,7 @@ static void atk9D_copyattack(void) gBattlescriptCurrInstr += 5; } else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } @@ -15047,7 +14510,7 @@ static void atkA1_counterdamagecalculator(void) else { gSpecialStatuses[gBankAttacker].flag20 = 1; - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } @@ -15067,7 +14530,7 @@ static void atkA2_mirrorcoatdamagecalculator(void) //a copy of atkA1 with the ph else { gSpecialStatuses[gBankAttacker].flag20 = 1; - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } @@ -15094,7 +14557,7 @@ static void atkA3_disablelastusedattack(void) } else { - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } @@ -15118,7 +14581,7 @@ static void atkA4_setencore(void) } else { - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } @@ -15139,14 +14602,14 @@ static void atkA5_painsplitdmgcalc(void) gBattlescriptCurrInstr += 5; } else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } #ifdef NONMATCHING static void atkA6_settypetorandomresistance(void) { if (gMoveHitWith[gBankAttacker] == 0 || gMoveHitWith[gBankAttacker] == 0xFFFF || (IsTwoTurnsMove(gMoveHitWith[gBankAttacker]) && !gProtectStructs[gBankAttacker].physicalDmg && !gProtectStructs[gBankAttacker].specialDmg)) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else { int type = 0, rands = 0; @@ -15188,7 +14651,7 @@ static void atkA6_settypetorandomresistance(void) type += 3, rands += 3; } while (rands < 336); - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } @@ -15477,7 +14940,7 @@ static void atkA8_copymovepermanently(void) break; } if (i != 4) //sketch fail - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else //sketch worked { struct move_pp moves_data; @@ -15501,7 +14964,7 @@ static void atkA8_copymovepermanently(void) } } else //sketch fail - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } static bool8 IsTwoTurnsMove(u16 move) @@ -15562,7 +15025,7 @@ static void atkA9_sleeptalk_choose_move(void) gCurrMovePos = random_pos; gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); gBankTarget = GetMoveTarget(gRandomMove, 0); - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } @@ -15642,7 +15105,7 @@ static void atkAD_spite_ppreduce(void) return; } } - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } static void atkAE_heal_party_status(void) @@ -15726,7 +15189,7 @@ static void atkAF_cursetarget(void) { if (gBattleMons[gBankTarget].status2 & STATUS2_CURSED || gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE) { - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { @@ -15744,7 +15207,7 @@ static void atkB0_set_spikes(void) if (gSideTimer[side].spikesAmount == 3) { gSpecialStatuses[gBankAttacker].flag20 = 1; - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { @@ -15778,7 +15241,7 @@ static void atkB2_setperishsong(void) sub_80153D0(gBankAttacker); if (not_affected_pokes == gNoOfAllBanks) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else gBattlescriptCurrInstr += 5; } @@ -15816,8 +15279,8 @@ static void atkB3_rolloutdamagecalculation(void) static void atkB4_jumpifconfusedandstatmaxed(void) { - if (gBattleMons[gBankTarget].status2 & STATUS2_CONFUSION && gBattleMons[gBankTarget].statStages[BSScriptRead8(gBattlescriptCurrInstr + 1)] == 0xC) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2); + if (gBattleMons[gBankTarget].status2 & STATUS2_CONFUSION && gBattleMons[gBankTarget].statStages[T2_READ_8(gBattlescriptCurrInstr + 1)] == 0xC) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); else gBattlescriptCurrInstr += 6; } @@ -15984,7 +15447,7 @@ static void atkBA_jumpifnopursuitswitchdmg(void) gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED); } else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } static void atkBB_setsunny(void) @@ -16019,7 +15482,7 @@ static void atkBC_maxattackhalvehp(void) //belly drum } else { - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } @@ -16089,7 +15552,7 @@ static void atkC0_recoverbasedonsunlight(void) } else { - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } @@ -16258,7 +15721,7 @@ static void atkC3_setfutureattack(void) { if (gWishFutureKnock.futureSightCounter[gBankTarget] != 0) { - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { @@ -16291,7 +15754,7 @@ static void atkC4_beat_up(void) party = gEnemyParty; if (gBattleMons[gBankTarget].hp == 0) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else { while (gBattleCommunication[0] < 6) @@ -16321,9 +15784,9 @@ static void atkC4_beat_up(void) gBattleCommunication[0]++; } else if (gBattleCommunication[0] != 0) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 5); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 5); } } #else @@ -16645,7 +16108,7 @@ static void atkC9_jumpifattackandspecialattackcannotfall(void) //memento if (gBattleMons[gBankTarget].statStages[STAT_STAGE_ATK] == 0 && gBattleMons[gBankTarget].statStages[STAT_STAGE_SPATK] == 0 && gBattleCommunication[6] != 1) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else { gActiveBank = gBankAttacker; @@ -16691,13 +16154,13 @@ static void atkCD_cureifburnedparalysedorpoisoned(void) //refresh MarkBufferBankForExecution(gActiveBank); } else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } static void atkCE_settorment(void) { if (gBattleMons[gBankTarget].status2 & STATUS2_TORMENT) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else { gBattleMons[gBankTarget].status2 |= STATUS2_TORMENT; @@ -16710,7 +16173,7 @@ static void atkCF_jumpifnodamage(void) if (gProtectStructs[gBankAttacker].physicalDmg || gProtectStructs[gBankAttacker].specialDmg) gBattlescriptCurrInstr += 5; else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } static void atkD0_settaunt(void) @@ -16722,7 +16185,7 @@ static void atkD0_settaunt(void) gBattlescriptCurrInstr += 5; } else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } static void atkD1_set_helpinghand(void) @@ -16735,7 +16198,7 @@ static void atkD1_set_helpinghand(void) gBattlescriptCurrInstr += 5; } else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } #ifdef NONMATCHING @@ -16747,7 +16210,7 @@ static void atkD2_swap_items(void) if (gBattleTypeFlags) } - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } #else @@ -17080,12 +16543,12 @@ static void atkD3_copy_ability(void) //role play gBattlescriptCurrInstr += 5; } else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } static void atkD4_wish_effect(void) { - switch (BSScriptRead8(gBattlescriptCurrInstr + 1)) + switch (T2_READ_8(gBattlescriptCurrInstr + 1)) { case 0: //use wish if (gWishFutureKnock.wishCounter[gBankAttacker] == 0) @@ -17095,7 +16558,7 @@ static void atkD4_wish_effect(void) gBattlescriptCurrInstr += 6; } else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); break; case 1: //heal effect gBattleTextBuff1[0] = 0xFD; @@ -17108,7 +16571,7 @@ static void atkD4_wish_effect(void) gBattleMoveDamage = 1; gBattleMoveDamage *= -1; if (gBattleMons[gBankTarget].hp == gBattleMons[gBankTarget].maxHP) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); else gBattlescriptCurrInstr += 6; break; @@ -17118,7 +16581,7 @@ static void atkD4_wish_effect(void) static void atkD5_setroots(void) //ingrain { if (gStatuses3[gBankAttacker] & STATUS3_ROOTED) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else { gStatuses3[gBankAttacker] |= STATUS3_ROOTED; @@ -17137,7 +16600,7 @@ static void atkD6_doubledamagedealtifdamaged(void) static void atkD7_setyawn(void) { if (gStatuses3[gBankTarget] & STATUS3_YAWN || (u8) gBattleMons[gBankTarget].status1) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else { gStatuses3[gBankTarget] |= 0x1000; @@ -17149,7 +16612,7 @@ static void atkD8_setdamagetohealthdifference(void) { if (gBattleMons[gBankTarget].hp <= gBattleMons[gBankAttacker].hp) { - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { @@ -17175,7 +16638,7 @@ static void atkDA_abilityswap(void) if ((gBattleMons[gBankAttacker].ability == 0 && gBattleMons[gBankTarget].ability == 0) || gBattleMons[gBankAttacker].ability == ABILITY_WONDER_GUARD || gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD || gBattleMoveFlags & MOVESTATUS_NOEFFECT) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else { u8 atk_ability = gBattleMons[gBankAttacker].ability; @@ -17190,7 +16653,7 @@ static void atkDB_imprisoneffect(void) u8 r8 = 0; if ((gStatuses3[gBankAttacker] & STATUS3_IMPRISIONED)) { - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } else { @@ -17221,14 +16684,14 @@ static void atkDB_imprisoneffect(void) } } if (bank == gNoOfAllBanks) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } static void atkDC_setgrudge(void) { if (gStatuses3[gBankAttacker] & STATUS3_GRUDGE) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else { gStatuses3[gBankAttacker] |= STATUS3_GRUDGE; @@ -17302,7 +16765,7 @@ static void atkDE_asistattackselect(void) gBattlescriptCurrInstr += 5; } else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } #else @@ -17498,7 +16961,7 @@ static void atkDF_setmagiccoat(void) gBankTarget = gBankAttacker; gSpecialStatuses[gBankAttacker].flag20 = 1; if (gCurrentMoveTurn == gNoOfAllBanks - 1) //last turn - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else { gProtectStructs[gBankAttacker].bounceMove = 1; @@ -17510,7 +16973,7 @@ static void atkE0_setstealstatchange(void) { gSpecialStatuses[gBankAttacker].flag20 = 1; if (gCurrentMoveTurn == gNoOfAllBanks - 1) //last turn - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else { gProtectStructs[gBankAttacker].stealMove = 1; @@ -17538,14 +17001,14 @@ static void atkE1_intimidate_string_loader(void) } if (gBankTarget >= gNoOfAllBanks) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else gBattlescriptCurrInstr += 5; } static void atkE2_switchout_abilities(void) { - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); switch (gBattleMons[gActiveBank].ability) { case ABILITY_NATURAL_CURE: @@ -17559,9 +17022,9 @@ static void atkE2_switchout_abilities(void) static void atkE3_jumpiffainted(void) { - gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1)); + gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1)); if (gBattleMons[gActiveBank].hp == 0) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 2); else gBattlescriptCurrInstr += 6; } @@ -17675,7 +17138,7 @@ static void atkE8_settypebasedhalvers(void) //water/mud sport if (worked) gBattlescriptCurrInstr += 5; else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } static void atkE9_setweatherballtype(void) @@ -17713,7 +17176,7 @@ static void atkEA_recycleitem(void) gBattlescriptCurrInstr += 5; } else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } static void atkEB_settypetoterrain(void) @@ -17729,7 +17192,7 @@ static void atkEB_settypetoterrain(void) gBattlescriptCurrInstr += 5; } else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } static void atkEC_pursuit_sth(void) @@ -17745,7 +17208,7 @@ static void atkEC_pursuit_sth(void) gBankAttacker = gActiveBank; } else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } static void atkED_802B4B4(void) @@ -17834,7 +17297,7 @@ void atkEF_pokeball_catch_calculation(void) ball_multiplier = 10; break; case ITEM_REPEAT_BALL: - if (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 1)) + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 1)) ball_multiplier = 30; else ball_multiplier = 10; @@ -17920,11 +17383,11 @@ static void atkF0_copy_caught_poke(void) static void atkF1_setpoke_as_caught(void) { - if (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 1)) - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 1)) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); else { - GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 3); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gBankTarget].species), 3); if (gBattleMons[gBankTarget].species == SPECIES_UNOWN) gSaveBlock2.pokedex.unownPersonality = gBattleMons[gBankTarget].personality; if (gBattleMons[gBankTarget].species == SPECIES_SPINDA) //else if @@ -18125,14 +17588,14 @@ static void atkF3_nickname_caught_poke(void) if (gMain.callback2 == sub_800F808 && !gPaletteFade.active ) { SetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_NICKNAME, BATTLE_STRUCT->caughtNick); - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } break; case 4: if (CalculatePlayerPartyCount() == 6) gBattlescriptCurrInstr += 5; else - gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); break; } } diff --git a/src/battle_7.c b/src/battle/battle_7.c index cf3a3522e..1d68386aa 100644 --- a/src/battle_7.c +++ b/src/battle/battle_7.c @@ -48,8 +48,8 @@ extern struct MusicPlayerInfo gMPlay_BGM; extern u32 gBitTable[]; extern u16 gBattleTypeFlags; extern u8 gBattleMonForms[]; -extern u8 gBattleAnimPlayerMonIndex; -extern u8 gBattleAnimEnemyMonIndex; +extern u8 gBattleAnimBankAttacker; +extern u8 gBattleAnimBankTarget; extern void (*gAnimScriptCallback)(void); extern u8 gAnimScriptActive; extern const u8 *const gBattleAnims_Unknown1[]; @@ -78,7 +78,7 @@ extern void sub_80440EC(); extern void sub_804777C(); extern void sub_8141828(); extern u8 sub_8077ABC(); -extern u8 sub_8078874(u8); +extern u8 AnimBankSpriteExists(u8); extern u8 sub_8077F68(u8); extern u8 sub_8077F7C(u8); extern void sub_8094958(void); @@ -185,8 +185,8 @@ bool8 move_anim_start_t3(u8 a, u8 b, u8 c, u8 d, u16 e) sub_80324E0(a); return TRUE; } - gBattleAnimPlayerMonIndex = b; - gBattleAnimEnemyMonIndex = c; + gBattleAnimBankAttacker = b; + gBattleAnimBankTarget = c; ewram17840.unk0 = e; DoMoveAnim(gBattleAnims_Unknown1, d, 0); taskId = CreateTask(sub_80315E8, 10); @@ -225,8 +225,8 @@ void move_anim_start_t4(u8 a, u8 b, u8 c, u8 d) { u8 taskId; - gBattleAnimPlayerMonIndex = b; - gBattleAnimEnemyMonIndex = c; + gBattleAnimBankAttacker = b; + gBattleAnimBankTarget = c; DoMoveAnim(gBattleAnims_Unknown2, d, 0); taskId = CreateTask(sub_80316CC, 10); gTasks[taskId].data[0] = a; @@ -301,16 +301,16 @@ void BattleLoadOpponentMonSprite(struct Pokemon *pkmn, u8 b) r7); paletteOffset = 0x100 + b * 16; if (ewram17800[b].transformedSpecies == 0) - lzPaletteData = pokemon_get_pal(pkmn); + lzPaletteData = GetMonSpritePal(pkmn); else - lzPaletteData = species_and_otid_get_pal(species, otId, personalityValue); - sub_800D238(lzPaletteData, ewram); + lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, otId, personalityValue); + LZDecompressWram(lzPaletteData, ewram); LoadPalette(ewram, paletteOffset, 0x20); LoadPalette(ewram, 0x80 + b * 16, 0x20); if (species == SPECIES_CASTFORM) { paletteOffset = 0x100 + b * 16; - sub_800D238(lzPaletteData, ewram + 0x16400); + LZDecompressWram(lzPaletteData, ewram + 0x16400); LoadPalette(ewram + 0x16400 + gBattleMonForms[b] * 32, paletteOffset, 0x20); } if (ewram17800[b].transformedSpecies != 0) @@ -353,16 +353,16 @@ void BattleLoadPlayerMonSprite(struct Pokemon *pkmn, u8 b) r7); paletteOffset = 0x100 + b * 16; if (ewram17800[b].transformedSpecies == 0) - lzPaletteData = pokemon_get_pal(pkmn); + lzPaletteData = GetMonSpritePal(pkmn); else - lzPaletteData = species_and_otid_get_pal(species, otId, personalityValue); - sub_800D238(lzPaletteData, ewram); + lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, otId, personalityValue); + LZDecompressWram(lzPaletteData, ewram); LoadPalette(ewram, paletteOffset, 0x20); LoadPalette(ewram, 0x80 + b * 16, 0x20); if (species == SPECIES_CASTFORM) { paletteOffset = 0x100 + b * 16; - sub_800D238(lzPaletteData, ewram + 0x16400); + LZDecompressWram(lzPaletteData, ewram + 0x16400); LoadPalette(ewram + 0x16400 + gBattleMonForms[b] * 32, paletteOffset, 0x20); } if (ewram17800[b].transformedSpecies != 0) @@ -506,7 +506,7 @@ bool8 sub_8031C30(u8 a) void load_gfxc_health_bar(void) { - sub_800D238(gUnknown_08D09C48, (void *)0x02000000); + LZDecompressWram(gUnknown_08D09C48, (void *)0x02000000); } u8 battle_load_something(u8 *pState, u8 *b) @@ -637,7 +637,7 @@ void sub_8031FC4(u8 a, u8 b, bool8 c) const void *src; void *dst; - if (IsContest()) + if (NotInBattle()) { r10 = 0; species = ewram19348.unk2; @@ -690,19 +690,19 @@ void sub_8031FC4(u8 a, u8 b, bool8 c) dst = (void *)(VRAM + 0x10000 + gSprites[gObjectBankIDs[a]].oam.tileNum * 32); DmaCopy32(3, src, dst, 0x800); paletteOffset = 0x100 + a * 16; - lzPaletteData = species_and_otid_get_pal(species, otId, personalityValue); - sub_800D238(lzPaletteData, ewram); + lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, otId, personalityValue); + LZDecompressWram(lzPaletteData, ewram); LoadPalette(ewram, paletteOffset, 32); if (species == SPECIES_CASTFORM) { u16 *paletteSrc = (u16 *)(ewram + 0x16400); - sub_800D238(lzPaletteData, paletteSrc); + LZDecompressWram(lzPaletteData, paletteSrc); LoadPalette(paletteSrc + gBattleMonForms[b] * 16, paletteOffset, 32); } BlendPalette(paletteOffset, 16, 6, 0x7FFF); CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32); - if (!IsContest()) + if (!NotInBattle()) { ewram17800[a].transformedSpecies = species; gBattleMonForms[a] = gBattleMonForms[b]; @@ -722,11 +722,11 @@ void BattleLoadSubstituteSprite(u8 a, u8 b) if (b == 0) { - if (IsContest()) + if (NotInBattle()) r4 = 0; else r4 = GetBankIdentity(a); - if (IsContest()) + if (NotInBattle()) LZDecompressVram(gSubstituteDollTilemap, gUnknown_081FAF4C[r4]); else if (GetBankSide(a) != 0) LZDecompressVram(gSubstituteDollGfx, gUnknown_081FAF4C[r4]); @@ -742,7 +742,7 @@ void BattleLoadSubstituteSprite(u8 a, u8 b) } else { - if (!IsContest()) + if (!NotInBattle()) { if (GetBankSide(a) != 0) BattleLoadOpponentMonSprite(&gEnemyParty[gBattlePartyID[a]], a); @@ -846,7 +846,7 @@ void sub_80326EC(u8 a) for (i = 0; i < gNoOfAllBanks; i++) { - if (sub_8078874(i) != 0) + if (AnimBankSpriteExists(i) != 0) { gSprites[gObjectBankIDs[i]].oam.affineMode = a; if (a == 0) @@ -884,7 +884,7 @@ void sub_80328A4(struct Sprite *sprite) u8 r4 = sprite->data0; struct Sprite *r7 = &gSprites[gObjectBankIDs[r4]]; - if (!r7->inUse || sub_8078874(r4) == 0) + if (!r7->inUse || AnimBankSpriteExists(r4) == 0) { sprite->callback = sub_8032978; return; diff --git a/src/battle_ai.c b/src/battle/battle_ai.c index 0e20c6b05..9c6d2bec4 100644 --- a/src/battle_ai.c +++ b/src/battle/battle_ai.c @@ -267,10 +267,9 @@ const u16 sDiscouragedPowerfulMoveEffects[] = void BattleAI_HandleItemUseBeforeAISetup(void) { s32 i; - u8 *data = (u8 *)UNK_2016A00_STRUCT; + u8 *data; - for (i = 0; (u32)i < sizeof(struct UnkBattleStruct1); i++) - data[i] = 0; + MEMSET_ALT(UNK_2016A00_STRUCT, 0, sizeof(struct UnkBattleStruct1), i, data); if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) && gTrainerBattleOpponent != 0x400 @@ -292,21 +291,23 @@ void BattleAI_HandleItemUseBeforeAISetup(void) void BattleAI_SetupAIData(void) { s32 i; - u8 *data = (u8 *)AI_THINKING_STRUCT; - u8 r7; + u8 limitations; + u8 *data; // clear AI data and set default move score to 100. strange that they didn't use memset here. - for (i = 0; (u32)i < sizeof(struct AI_ThinkingStruct); i++) - data[i] = 0; + MEMSET_ALT(AI_THINKING_STRUCT, 0, sizeof(struct AI_ThinkingStruct), i, data); + for (i = 0; i < MAX_MON_MOVES; i++) AI_THINKING_STRUCT->score[i] = 100; - r7 = CheckMoveLimitations(gActiveBank, 0, 0xFF); + limitations = CheckMoveLimitations(gActiveBank, 0, 0xFF); - // probably sets up the moves to consider and ignores non-valid moves such as NO_MOVE or glitch moves. + // do not consider moves the AI cannot select + // also, roll simulated RNG for moves that have a degree of + // randomness. for (i = 0; i < MAX_MON_MOVES; i++) { - if (gBitTable[i] & r7) + if (gBitTable[i] & limitations) AI_THINKING_STRUCT->score[i] = 0; AI_THINKING_STRUCT->simulatedRNG[i] = 100 - (Random() % 16); @@ -411,7 +412,7 @@ void BattleAI_DoAIProcessing(void) break; case AIState_Processing: if (AI_THINKING_STRUCT->moveConsidered != MOVE_NONE) - sBattleAICmdTable[*(u8 *)gAIScriptPtr](); // run AI command. + sBattleAICmdTable[*gAIScriptPtr](); // run AI command. else { AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] = 0; // definitely do not consider any move that has 0 PP. @@ -469,7 +470,7 @@ void RecordItemBattle(u8 a, u8 b) static void BattleAICmd_if_random_less_than(void) { if (Random() % 256 < gAIScriptPtr[1]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); else gAIScriptPtr += 6; } @@ -477,7 +478,7 @@ static void BattleAICmd_if_random_less_than(void) static void BattleAICmd_if_random_greater_than(void) { if (Random() % 256 > gAIScriptPtr[1]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); else gAIScriptPtr += 6; } @@ -485,7 +486,7 @@ static void BattleAICmd_if_random_greater_than(void) static void BattleAICmd_if_random_equal(void) { if (Random() % 256 == gAIScriptPtr[1]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); else gAIScriptPtr += 6; } @@ -493,7 +494,7 @@ static void BattleAICmd_if_random_equal(void) static void BattleAICmd_if_random_not_equal(void) { if (Random() % 256 != gAIScriptPtr[1]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); else gAIScriptPtr += 6; } @@ -518,7 +519,7 @@ static void BattleAICmd_if_hp_less_than(void) index = gBankTarget; if ((u32)(100 * gBattleMons[index].hp / gBattleMons[index].maxHP) < gAIScriptPtr[2]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); else gAIScriptPtr += 7; } @@ -533,7 +534,7 @@ static void BattleAICmd_if_hp_more_than(void) index = gBankTarget; if ((u32)(100 * gBattleMons[index].hp / gBattleMons[index].maxHP) > gAIScriptPtr[2]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); else gAIScriptPtr += 7; } @@ -548,7 +549,7 @@ static void BattleAICmd_if_hp_equal(void) index = gBankTarget; if ((u32)(100 * gBattleMons[index].hp / gBattleMons[index].maxHP) == gAIScriptPtr[2]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); else gAIScriptPtr += 7; } @@ -563,7 +564,7 @@ static void BattleAICmd_if_hp_not_equal(void) index = gBankTarget; if ((u32)(100 * gBattleMons[index].hp / gBattleMons[index].maxHP) != gAIScriptPtr[2]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); else gAIScriptPtr += 7; } @@ -578,10 +579,10 @@ static void BattleAICmd_if_status(void) else index = gBankTarget; - arg = AIScriptRead32(gAIScriptPtr + 2); + arg = T1_READ_32(gAIScriptPtr + 2); if ((gBattleMons[index].status1 & arg) != 0) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); else gAIScriptPtr += 10; } @@ -596,10 +597,10 @@ static void BattleAICmd_if_not_status(void) else index = gBankTarget; - arg = AIScriptRead32(gAIScriptPtr + 2); + arg = T1_READ_32(gAIScriptPtr + 2); if ((gBattleMons[index].status1 & arg) == 0) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); else gAIScriptPtr += 10; } @@ -614,10 +615,10 @@ static void BattleAICmd_if_status2(void) else index = gBankTarget; - arg = AIScriptRead32(gAIScriptPtr + 2); + arg = T1_READ_32(gAIScriptPtr + 2); if ((gBattleMons[index].status2 & arg) != 0) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); else gAIScriptPtr += 10; } @@ -632,10 +633,10 @@ static void BattleAICmd_if_not_status2(void) else index = gBankTarget; - arg = AIScriptRead32(gAIScriptPtr + 2); + arg = T1_READ_32(gAIScriptPtr + 2); if ((gBattleMons[index].status2 & arg) == 0) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); else gAIScriptPtr += 10; } @@ -650,10 +651,10 @@ static void BattleAICmd_if_status3(void) else index = gBankTarget; - arg = AIScriptRead32(gAIScriptPtr + 2); + arg = T1_READ_32(gAIScriptPtr + 2); if ((gStatuses3[index] & arg) != 0) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); else gAIScriptPtr += 10; } @@ -668,10 +669,10 @@ static void BattleAICmd_if_not_status3(void) else index = gBankTarget; - arg = AIScriptRead32(gAIScriptPtr + 2); + arg = T1_READ_32(gAIScriptPtr + 2); if ((gStatuses3[index] & arg) == 0) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); else gAIScriptPtr += 10; } @@ -687,10 +688,10 @@ static void BattleAICmd_if_status4(void) index = gBankTarget; arg1 = GetBankIdentity(index) & 1; - arg2 = AIScriptRead32(gAIScriptPtr + 2); + arg2 = T1_READ_32(gAIScriptPtr + 2); if ((gSideAffecting[arg1] & arg2) != 0) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); else gAIScriptPtr += 10; } @@ -706,10 +707,10 @@ static void BattleAICmd_if_not_status4(void) index = gBankTarget; arg1 = GetBankIdentity(index) & 1; - arg2 = AIScriptRead32(gAIScriptPtr + 2); + arg2 = T1_READ_32(gAIScriptPtr + 2); if ((gSideAffecting[arg1] & arg2) == 0) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); else gAIScriptPtr += 10; } @@ -717,7 +718,7 @@ static void BattleAICmd_if_not_status4(void) static void BattleAICmd_if_less_than(void) { if (AI_THINKING_STRUCT->funcResult < gAIScriptPtr[1]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); else gAIScriptPtr += 6; } @@ -725,7 +726,7 @@ static void BattleAICmd_if_less_than(void) static void BattleAICmd_if_more_than(void) { if (AI_THINKING_STRUCT->funcResult > gAIScriptPtr[1]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); else gAIScriptPtr += 6; } @@ -733,7 +734,7 @@ static void BattleAICmd_if_more_than(void) static void BattleAICmd_if_equal(void) { if (AI_THINKING_STRUCT->funcResult == gAIScriptPtr[1]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); else gAIScriptPtr += 6; } @@ -741,80 +742,80 @@ static void BattleAICmd_if_equal(void) static void BattleAICmd_if_not_equal(void) { if (AI_THINKING_STRUCT->funcResult != gAIScriptPtr[1]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); else gAIScriptPtr += 6; } static void BattleAICmd_if_less_than_32(void) { - u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1); + u8 *temp = T1_READ_PTR(gAIScriptPtr + 1); if (AI_THINKING_STRUCT->funcResult < *temp) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5); else gAIScriptPtr += 9; } static void BattleAICmd_if_more_than_32(void) { - u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1); + u8 *temp = T1_READ_PTR(gAIScriptPtr + 1); if (AI_THINKING_STRUCT->funcResult > *temp) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5); else gAIScriptPtr += 9; } static void BattleAICmd_if_equal_32(void) { - u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1); + u8 *temp = T1_READ_PTR(gAIScriptPtr + 1); if (AI_THINKING_STRUCT->funcResult == *temp) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5); else gAIScriptPtr += 9; } static void BattleAICmd_if_not_equal_32(void) { - u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1); + u8 *temp = T1_READ_PTR(gAIScriptPtr + 1); if (AI_THINKING_STRUCT->funcResult != *temp) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5); else gAIScriptPtr += 9; } static void BattleAICmd_if_move(void) { - u16 move = AIScriptRead16(gAIScriptPtr + 1); + u16 move = T1_READ_16(gAIScriptPtr + 1); if (AI_THINKING_STRUCT->moveConsidered == move) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); else gAIScriptPtr += 7; } static void BattleAICmd_if_not_move(void) { - u16 move = AIScriptRead16(gAIScriptPtr + 1); + u16 move = T1_READ_16(gAIScriptPtr + 1); if (AI_THINKING_STRUCT->moveConsidered != move) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); else gAIScriptPtr += 7; } static void BattleAICmd_if_in_bytes(void) { - u8 *ptr = AIScriptReadPtr(gAIScriptPtr + 1); + u8 *ptr = T1_READ_PTR(gAIScriptPtr + 1); while (*ptr != 0xFF) { if (AI_THINKING_STRUCT->funcResult == *ptr) { - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5); return; } ptr++; @@ -824,7 +825,7 @@ static void BattleAICmd_if_in_bytes(void) static void BattleAICmd_if_not_in_bytes(void) { - u8 *ptr = AIScriptReadPtr(gAIScriptPtr + 1); + u8 *ptr = T1_READ_PTR(gAIScriptPtr + 1); while (*ptr != 0xFF) { @@ -835,18 +836,18 @@ static void BattleAICmd_if_not_in_bytes(void) } ptr++; } - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5); } static void BattleAICmd_if_in_words(void) { - u16 *ptr = (u16 *)AIScriptReadPtr(gAIScriptPtr + 1); + u16 *ptr = (u16 *)T1_READ_PTR(gAIScriptPtr + 1); while (*ptr != 0xFFFF) { if (AI_THINKING_STRUCT->funcResult == *ptr) { - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5); return; } ptr++; @@ -856,7 +857,7 @@ static void BattleAICmd_if_in_words(void) static void BattleAICmd_if_not_in_words(void) { - u16 *ptr = (u16 *)AIScriptReadPtr(gAIScriptPtr + 1); + u16 *ptr = (u16 *)T1_READ_PTR(gAIScriptPtr + 1); while (*ptr != 0xFFFF) { @@ -867,7 +868,7 @@ static void BattleAICmd_if_not_in_words(void) } ptr++; } - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 5); } static void BattleAICmd_if_user_can_damage(void) @@ -883,7 +884,7 @@ static void BattleAICmd_if_user_can_damage(void) if (i == MAX_MON_MOVES) gAIScriptPtr += 5; else - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); } static void BattleAICmd_if_user_cant_damage(void) @@ -899,7 +900,7 @@ static void BattleAICmd_if_user_cant_damage(void) if (i != MAX_MON_MOVES) gAIScriptPtr += 5; else - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); } static void BattleAICmd_get_turn_count(void) @@ -1258,7 +1259,7 @@ static void BattleAICmd_get_move(void) static void BattleAICmd_if_arg_equal(void) { if (gAIScriptPtr[1] == AI_THINKING_STRUCT->funcResult) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); else gAIScriptPtr += 6; } @@ -1266,23 +1267,23 @@ static void BattleAICmd_if_arg_equal(void) static void BattleAICmd_if_arg_not_equal(void) { if (gAIScriptPtr[1] != AI_THINKING_STRUCT->funcResult) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); else gAIScriptPtr += 6; } static void BattleAICmd_if_would_go_first(void) { - if (b_first_side(gBankAttacker, gBankTarget, 1) == gAIScriptPtr[1]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + if (GetWhoStrikesFirst(gBankAttacker, gBankTarget, 1) == gAIScriptPtr[1]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); else gAIScriptPtr += 6; } static void BattleAICmd_if_would_not_go_first(void) { - if (b_first_side(gBankAttacker, gBankTarget, 1) != gAIScriptPtr[1]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + if (GetWhoStrikesFirst(gBankAttacker, gBankTarget, 1) != gAIScriptPtr[1]) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); else gAIScriptPtr += 6; } @@ -1486,7 +1487,7 @@ static void BattleAICmd_if_damage_bonus(void) damageVar = gBattleMoveDamage; if (damageVar == gAIScriptPtr[1]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); else gAIScriptPtr += 6; } @@ -1517,7 +1518,7 @@ static void BattleAICmd_if_status_in_party(void) break; } - statusToCompareTo = AIScriptRead32(gAIScriptPtr + 2); + statusToCompareTo = T1_READ_32(gAIScriptPtr + 2); for (i = 0; i < 6; i++) { @@ -1527,7 +1528,7 @@ static void BattleAICmd_if_status_in_party(void) if (species != SPECIES_NONE && species != SPECIES_EGG && hp != 0 && status == statusToCompareTo) { - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); // WHAT. why is this being merged into the above switch + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); // WHAT. why is this being merged into the above switch return; } } @@ -1553,7 +1554,7 @@ static void BattleAICmd_if_status_not_in_party(void) break; } - statusToCompareTo = AIScriptRead32(gAIScriptPtr + 2); + statusToCompareTo = T1_READ_32(gAIScriptPtr + 2); for (i = 0; i < 6; i++) { @@ -1565,7 +1566,7 @@ static void BattleAICmd_if_status_not_in_party(void) if (species != SPECIES_NONE && species != SPECIES_EGG && hp != 0 && status == statusToCompareTo) gAIScriptPtr += 10; // doesnt return? } - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); } static void BattleAICmd_get_weather(void) @@ -1585,7 +1586,7 @@ static void BattleAICmd_get_weather(void) static void BattleAICmd_if_effect(void) { if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == gAIScriptPtr[1]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); else gAIScriptPtr += 6; } @@ -1593,7 +1594,7 @@ static void BattleAICmd_if_effect(void) static void BattleAICmd_if_not_effect(void) { if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect != gAIScriptPtr[1]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); else gAIScriptPtr += 6; } @@ -1608,7 +1609,7 @@ static void BattleAICmd_if_stat_level_less_than(void) party = gBankTarget; if (gBattleMons[party].statStages[gAIScriptPtr[2]] < gAIScriptPtr[3]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); else gAIScriptPtr += 8; } @@ -1623,7 +1624,7 @@ static void BattleAICmd_if_stat_level_more_than(void) party = gBankTarget; if (gBattleMons[party].statStages[gAIScriptPtr[2]] > gAIScriptPtr[3]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); else gAIScriptPtr += 8; } @@ -1638,7 +1639,7 @@ static void BattleAICmd_if_stat_level_equal(void) party = gBankTarget; if (gBattleMons[party].statStages[gAIScriptPtr[2]] == gAIScriptPtr[3]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); else gAIScriptPtr += 8; } @@ -1653,7 +1654,7 @@ static void BattleAICmd_if_stat_level_not_equal(void) party = gBankTarget; if (gBattleMons[party].statStages[gAIScriptPtr[2]] != gAIScriptPtr[3]) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); else gAIScriptPtr += 8; } @@ -1682,7 +1683,7 @@ static void BattleAICmd_if_can_faint(void) gBattleMoveDamage = 1; if (gBattleMons[gBankTarget].hp <= gBattleMoveDamage) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); else gAIScriptPtr += 5; } @@ -1709,7 +1710,7 @@ static void BattleAICmd_if_cant_faint(void) // this macro is missing the damage 0 = 1 assumption. if (gBattleMons[gBankTarget].hp > gBattleMoveDamage) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); else gAIScriptPtr += 5; } @@ -1731,7 +1732,7 @@ static void BattleAICmd_if_has_move(void) if (i == MAX_MON_MOVES) gAIScriptPtr += 8; else - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); break; case 0: case 2: @@ -1743,7 +1744,7 @@ static void BattleAICmd_if_has_move(void) if (i == 8) gAIScriptPtr += 8; else - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); break; } } @@ -1765,7 +1766,7 @@ static void BattleAICmd_if_dont_have_move(void) if (i != MAX_MON_MOVES) gAIScriptPtr += 8; else - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); break; case 0: case 2: @@ -1777,7 +1778,7 @@ static void BattleAICmd_if_dont_have_move(void) if (i != 8) gAIScriptPtr += 8; else - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); break; } } @@ -1796,7 +1797,7 @@ static void BattleAICmd_if_move_effect(void) break; } if (i != MAX_MON_MOVES) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); else gAIScriptPtr += 7; break; @@ -1807,7 +1808,7 @@ static void BattleAICmd_if_move_effect(void) if (gBattleMons[gBankAttacker].moves[i] != 0 && gBattleMoves[UNK_2016A00_STRUCT->movesUsed[gBankTarget >> 1][i]].effect == gAIScriptPtr[2]) break; } - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); } } @@ -1827,7 +1828,7 @@ static void BattleAICmd_if_not_move_effect(void) if (i != MAX_MON_MOVES) gAIScriptPtr += 7; else - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); break; case 0: case 2: @@ -1856,7 +1857,7 @@ static void BattleAICmd_if_last_move_did_damage(void) gAIScriptPtr += 7; return; } - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); return; } else if (gAIScriptPtr[2] != 1) // ignore the macro if its not 0 or 1. @@ -1866,7 +1867,7 @@ static void BattleAICmd_if_last_move_did_damage(void) } else if (gDisableStructs[index].encoredMove != 0) { - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); return; } gAIScriptPtr += 7; @@ -1879,7 +1880,7 @@ static void BattleAICmd_if_encored(void) case 0: // _08109348 if (gDisableStructs[gActiveBank].disabledMove == AI_THINKING_STRUCT->moveConsidered) { - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); return; } gAIScriptPtr += 6; @@ -1887,7 +1888,7 @@ static void BattleAICmd_if_encored(void) case 1: // _08109370 if (gDisableStructs[gActiveBank].encoredMove == AI_THINKING_STRUCT->moveConsidered) { - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); return; } gAIScriptPtr += 6; @@ -1908,7 +1909,7 @@ static void BattleAICmd_if_random_100(void) u8 safariFleeRate = BATTLE_STRUCT->safariFleeRate * 5; // safari flee rate, from 0-20 if ((u8)(Random() % 100) < safariFleeRate) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); else gAIScriptPtr += 5; } @@ -2065,12 +2066,12 @@ static void BattleAICmd_nullsub_57(void) static void BattleAICmd_call(void) { AIStackPushVar(gAIScriptPtr + 5); - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); } static void BattleAICmd_jump(void) { - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); } static void BattleAICmd_end(void) @@ -2086,7 +2087,7 @@ static void BattleAICmd_if_level_compare(void) case 0: // greater than if (gBattleMons[gBankAttacker].level > gBattleMons[gBankTarget].level) { - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); return; } gAIScriptPtr += 6; @@ -2094,7 +2095,7 @@ static void BattleAICmd_if_level_compare(void) case 1: // less than if (gBattleMons[gBankAttacker].level < gBattleMons[gBankTarget].level) { - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); return; } gAIScriptPtr += 6; @@ -2102,7 +2103,7 @@ static void BattleAICmd_if_level_compare(void) case 2: // equal if (gBattleMons[gBankAttacker].level == gBattleMons[gBankTarget].level) { - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); return; } gAIScriptPtr += 6; @@ -2113,7 +2114,7 @@ static void BattleAICmd_if_level_compare(void) static void BattleAICmd_if_taunted(void) { if (gDisableStructs[gBankTarget].tauntTimer1 != 0) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); else gAIScriptPtr += 5; } @@ -2121,7 +2122,7 @@ static void BattleAICmd_if_taunted(void) static void BattleAICmd_if_not_taunted(void) { if (gDisableStructs[gBankTarget].tauntTimer1 == 0) - gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); else gAIScriptPtr += 5; } diff --git a/src/battle_anim.c b/src/battle/battle_anim.c index 6bd98099a..eac16ee18 100644 --- a/src/battle_anim.c +++ b/src/battle/battle_anim.c @@ -37,8 +37,8 @@ EWRAM_DATA u8 gMonAnimTaskIdArray[2] = {0}; EWRAM_DATA u8 gUnknown_0202F7C4 = 0; EWRAM_DATA u8 gUnknown_0202F7C5 = 0; EWRAM_DATA u16 gAnimMoveIndex = 0; // set but unused. -EWRAM_DATA u8 gBattleAnimPlayerMonIndex = 0; -EWRAM_DATA u8 gBattleAnimEnemyMonIndex = 0; +EWRAM_DATA u8 gBattleAnimBankAttacker = 0; +EWRAM_DATA u8 gBattleAnimBankTarget = 0; EWRAM_DATA u16 gUnknown_0202F7CA[4] = {0}; EWRAM_DATA u8 gUnknown_0202F7D2 = 0; extern u16 gUnknown_030041B4; @@ -201,15 +201,15 @@ void battle_anim_clear_some_data(void) gUnknown_0202F7C4 = 0; gUnknown_0202F7C5 = 0; gAnimMoveIndex = 0; - gBattleAnimPlayerMonIndex = 0; - gBattleAnimEnemyMonIndex = 0; + gBattleAnimBankAttacker = 0; + gBattleAnimBankTarget = 0; gUnknown_0202F7D2 = 0; } void ExecuteMoveAnim(u16 move) { - gBattleAnimPlayerMonIndex = gBankAttacker; - gBattleAnimEnemyMonIndex = gBankTarget; + gBattleAnimBankAttacker = gBankAttacker; + gBattleAnimBankTarget = gBankTarget; DoMoveAnim(gBattleAnims_Moves, move, 1); } @@ -217,7 +217,7 @@ void DoMoveAnim(const u8 *const moveAnims[], u16 move, u8 c) { s32 i; - if (IsContest() == 0) + if (NotInBattle() == 0) { sub_8079E24(); sub_8043EB4(0); @@ -335,7 +335,7 @@ static void RunAnimScriptCommand(void) { do { - sScriptCmdTable[SCRIPT_READ_8(gBattleAnimScriptPtr)](); + sScriptCmdTable[T1_READ_8(gBattleAnimScriptPtr)](); } while (gAnimFramesToWait == 0 && gAnimScriptActive != FALSE); } @@ -344,7 +344,7 @@ static void ScriptCmd_loadsprite(void) u16 index; gBattleAnimScriptPtr++; - index = SCRIPT_READ_16(gBattleAnimScriptPtr); + index = T1_READ_16(gBattleAnimScriptPtr); LoadCompressedObjectPic(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)]); LoadCompressedObjectPalette(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(index)]); gBattleAnimScriptPtr += 2; @@ -358,7 +358,7 @@ static void ScriptCmd_unloadsprite(void) u16 index; gBattleAnimScriptPtr++; - index = SCRIPT_READ_16(gBattleAnimScriptPtr); + index = T1_READ_16(gBattleAnimScriptPtr); FreeSpriteTilesByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag); FreeSpritePaletteByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag); gBattleAnimScriptPtr += 2; @@ -378,15 +378,15 @@ static void ScriptCmd_sprite(void) s8 r1; gBattleAnimScriptPtr++; - r7 = (struct SpriteTemplate *)(SCRIPT_READ_32(gBattleAnimScriptPtr)); + r7 = (struct SpriteTemplate *)(T2_READ_32(gBattleAnimScriptPtr)); gBattleAnimScriptPtr += 4; - r4 = SCRIPT_READ_8(gBattleAnimScriptPtr); + r4 = T1_READ_8(gBattleAnimScriptPtr); gBattleAnimScriptPtr++; - r0 = SCRIPT_READ_8(gBattleAnimScriptPtr); + r0 = T1_READ_8(gBattleAnimScriptPtr); gBattleAnimScriptPtr++; for (i = 0; i < r0; i++) { - gBattleAnimArgs[i] = SCRIPT_READ_16(gBattleAnimScriptPtr); + gBattleAnimArgs[i] = T1_READ_16(gBattleAnimScriptPtr); gBattleAnimScriptPtr += 2; } if (r4 & 0x80) @@ -396,7 +396,7 @@ static void ScriptCmd_sprite(void) r4 -= 0x40; else r4 = -r4; - _r0 = sub_8079E90(gBattleAnimEnemyMonIndex); + _r0 = sub_8079E90(gBattleAnimBankTarget); r1 = r4; } @@ -407,15 +407,15 @@ static void ScriptCmd_sprite(void) r4 -= 0x40; else r4 = -r4; - _r0 = sub_8079E90(gBattleAnimPlayerMonIndex); + _r0 = sub_8079E90(gBattleAnimBankAttacker); r1 = r4; } r6 = _r0 + r1; if ((s16)r6 < 3) r6 = 3; - r4 = sub_8077ABC(gBattleAnimEnemyMonIndex, 2); - r2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 3); + r4 = sub_8077ABC(gBattleAnimBankTarget, 2); + r2 = sub_8077ABC(gBattleAnimBankTarget, 3); CreateSpriteAndAnimate(r7, r4, r2, r6); gAnimVisualTaskCount++; } @@ -485,10 +485,10 @@ _08075B34:\n\ _08075B36:\n\ lsls r0, 24\n\ lsrs r4, r0, 24\n\ - ldr r0, _08075B40 @ =gBattleAnimEnemyMonIndex\n\ + ldr r0, _08075B40 @ =gBattleAnimBankTarget\n\ b _08075B56\n\ .align 2, 0\n\ -_08075B40: .4byte gBattleAnimEnemyMonIndex\n\ +_08075B40: .4byte gBattleAnimBankTarget\n\ _08075B44:\n\ cmp r4, 0x3F\n\ bls _08075B4E\n\ @@ -500,7 +500,7 @@ _08075B4E:\n\ _08075B50:\n\ lsls r0, 24\n\ lsrs r4, r0, 24\n\ - ldr r0, _08075BAC @ =gBattleAnimPlayerMonIndex\n\ + ldr r0, _08075BAC @ =gBattleAnimBankAttacker\n\ _08075B56:\n\ ldrb r0, [r0]\n\ bl sub_8079E90\n\ @@ -517,7 +517,7 @@ _08075B56:\n\ bgt _08075B74\n\ movs r6, 0x3\n\ _08075B74:\n\ - ldr r5, _08075BB0 @ =gBattleAnimEnemyMonIndex\n\ + ldr r5, _08075BB0 @ =gBattleAnimBankTarget\n\ ldrb r0, [r5]\n\ movs r1, 0x2\n\ bl sub_8077ABC\n\ @@ -543,8 +543,8 @@ _08075B74:\n\ pop {r0}\n\ bx r0\n\ .align 2, 0\n\ -_08075BAC: .4byte gBattleAnimPlayerMonIndex\n\ -_08075BB0: .4byte gBattleAnimEnemyMonIndex\n\ +_08075BAC: .4byte gBattleAnimBankAttacker\n\ +_08075BB0: .4byte gBattleAnimBankTarget\n\ _08075BB4: .4byte gAnimVisualTaskCount\n\ .syntax divided\n"); } @@ -559,16 +559,16 @@ static void ScriptCmd_createtask(void) s32 i; gBattleAnimScriptPtr++; - taskFunc = (TaskFunc)SCRIPT_READ_32(gBattleAnimScriptPtr); + taskFunc = (TaskFunc)T2_READ_32(gBattleAnimScriptPtr); gBattleAnimScriptPtr += 4; - taskPriority = SCRIPT_READ_8(gBattleAnimScriptPtr); + taskPriority = T1_READ_8(gBattleAnimScriptPtr); gBattleAnimScriptPtr++; - numArgs = SCRIPT_READ_8(gBattleAnimScriptPtr); + numArgs = T1_READ_8(gBattleAnimScriptPtr); gBattleAnimScriptPtr++; for (i = 0; i < numArgs; i++) { - gBattleAnimArgs[i] = SCRIPT_READ_16(gBattleAnimScriptPtr); + gBattleAnimArgs[i] = T1_READ_16(gBattleAnimScriptPtr); gBattleAnimScriptPtr += 2; } @@ -580,7 +580,7 @@ static void ScriptCmd_createtask(void) static void ScriptCmd_delay(void) { gBattleAnimScriptPtr++; - gAnimFramesToWait = SCRIPT_READ_8(gBattleAnimScriptPtr); + gAnimFramesToWait = T1_READ_8(gBattleAnimScriptPtr); if (gAnimFramesToWait == 0) gAnimFramesToWait = -1; gBattleAnimScriptPtr++; @@ -654,7 +654,7 @@ static void ScriptCmd_end(void) if (continuousAnim == FALSE) // may have been used for debug? { m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 256); - if (IsContest() == 0) + if (NotInBattle() == 0) { sub_8079E24(); sub_8043EB4(1); @@ -666,7 +666,7 @@ static void ScriptCmd_end(void) static void ScriptCmd_playse(void) { gBattleAnimScriptPtr++; - PlaySE(SCRIPT_READ_16(gBattleAnimScriptPtr)); + PlaySE(T1_READ_16(gBattleAnimScriptPtr)); gBattleAnimScriptPtr += 2; } @@ -680,20 +680,20 @@ static void ScriptCmd_monbg(void) u8 taskId; gBattleAnimScriptPtr++; - r6 = SCRIPT_READ_8(gBattleAnimScriptPtr); + r6 = T1_READ_8(gBattleAnimScriptPtr); if (r6 == 0) r6 = 2; else if (r6 == 1) r6 = 3; if (r6 == 0 || r6 == 2) - r5 = gBattleAnimPlayerMonIndex; + r5 = gBattleAnimBankAttacker; else - r5 = gBattleAnimEnemyMonIndex; - if (b_side_obj__get_some_boolean(r5)) + r5 = gBattleAnimBankTarget; + if (IsAnimBankSpriteVisible(r5)) { r0 = GetBankIdentity(r5); r0 += 0xFF; - if (r0 <= 1 || IsContest() != 0) + if (r0 <= 1 || NotInBattle() != 0) r7 = 0; else r7 = 1; @@ -719,11 +719,11 @@ static void ScriptCmd_monbg(void) } r5 ^= 2; - if (r6 > 1 && b_side_obj__get_some_boolean(r5)) + if (r6 > 1 && IsAnimBankSpriteVisible(r5)) { r0 = GetBankIdentity(r5); r0 += 0xFF; - if (r0 <= 1 || IsContest() != 0) + if (r0 <= 1 || NotInBattle() != 0) r7 = 0; else r7 = 1; @@ -751,20 +751,20 @@ static void ScriptCmd_monbg(void) } #ifdef NONMATCHING -bool8 b_side_obj__get_some_boolean(u8 a) +bool8 IsAnimBankSpriteVisible(u8 a) { - if (IsContest() != 0) + if (NotInBattle()) { - if (a == gBattleAnimPlayerMonIndex) + if (a == gBattleAnimBankAttacker) return TRUE; else return FALSE; } - if (sub_8078874(a) == 0) + if (!AnimBankSpriteExists(a)) return FALSE; - if (IsContest() != 0) + if (NotInBattle()) return TRUE; // this line wont ever be reached. - if ((EWRAM_17800[a].unk0 & 1) == 0) + if (!(EWRAM_17800[a].unk0 & 1)) return TRUE; if (gSprites[gObjectBankIDs[a]].invisible) return FALSE; @@ -772,31 +772,31 @@ bool8 b_side_obj__get_some_boolean(u8 a) } #else __attribute__((naked)) -bool8 b_side_obj__get_some_boolean(u8 a) +bool8 IsAnimBankSpriteVisible(u8 a) { asm(".syntax unified\n\ push {r4,r5,lr}\n\ lsls r0, 24\n\ lsrs r4, r0, 24\n\ adds r5, r4, 0\n\ - bl IsContest\n\ + bl NotInBattle\n\ lsls r0, 24\n\ cmp r0, 0\n\ beq _08075FDC\n\ - ldr r0, _08075FD8 @ =gBattleAnimPlayerMonIndex\n\ + ldr r0, _08075FD8 @ =gBattleAnimBankAttacker\n\ ldrb r0, [r0]\n\ cmp r4, r0\n\ beq _0807601C\n\ b _0807602C\n\ .align 2, 0\n\ -_08075FD8: .4byte gBattleAnimPlayerMonIndex\n\ +_08075FD8: .4byte gBattleAnimBankAttacker\n\ _08075FDC:\n\ adds r0, r4, 0\n\ - bl sub_8078874\n\ + bl AnimBankSpriteExists\n\ lsls r0, 24\n\ cmp r0, 0\n\ beq _0807602C\n\ - bl IsContest\n\ + bl NotInBattle\n\ lsls r0, 24\n\ cmp r0, 0\n\ bne _0807601C\n\ @@ -877,7 +877,7 @@ void sub_8076034(u8 a, u8 b) spriteId = gObjectBankIDs[a]; gUnknown_030042C0 = -(gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x) + 32; - if (IsContest() != 0 && sub_80AEB1C(EWRAM_19348) != 0) + if (NotInBattle() != 0 && sub_80AEB1C(EWRAM_19348) != 0) gUnknown_030042C0--; gUnknown_030041B4 = -(gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y) + 32; gSprites[gObjectBankIDs[a]].invisible = TRUE; @@ -889,12 +889,12 @@ void sub_8076034(u8 a, u8 b) addr3 = (u16 *)PLTT + s.unk8 * 16; DmaCopy32(3, gPlttBufferUnfaded + 0x100 + a * 16, addr3, 32); - if (IsContest() != 0) + if (NotInBattle() != 0) r2 = 0; else r2 = GetBankIdentity(a); sub_80E4EF8(0, 0, r2, s.unk8, (u32)s.unk0, (((s32)s.unk4 - VRAM) / 2048), REG_BG1CNT_BITFIELD.charBaseBlock); - if (IsContest() != 0) + if (NotInBattle() != 0) sub_8076380(); } else @@ -996,7 +996,7 @@ void sub_8076464(u8 a) struct UnknownStruct2 s; sub_8078914(&s); - if (a == 0 || IsContest() != 0) + if (a == 0 || NotInBattle() != 0) { u16 *addr2; @@ -1090,15 +1090,15 @@ static void ScriptCmd_clearmonbg(void) u8 taskId; gBattleAnimScriptPtr++; - r4 = SCRIPT_READ_8(gBattleAnimScriptPtr); + r4 = T1_READ_8(gBattleAnimScriptPtr); if (r4 == 0) r4 = 2; else if (r4 == 1) r4 = 3; if (r4 == 0 || r4 == 2) - r5 = gBattleAnimPlayerMonIndex; + r5 = gBattleAnimBankAttacker; else - r5 = gBattleAnimEnemyMonIndex; + r5 = gBattleAnimBankTarget; if (gMonAnimTaskIdArray[0] != 0xFF) gSprites[gObjectBankIDs[r5]].invisible = FALSE; if (r4 > 1 && gMonAnimTaskIdArray[1] != 0xFF) @@ -1121,7 +1121,7 @@ static void sub_807672C(u8 taskId) { var = GetBankIdentity(gTasks[taskId].data[2]); var += 0xFF; - if (var <= 1 || IsContest() != 0) + if (var <= 1 || NotInBattle() != 0) r4 = 0; else r4 = 1; @@ -1149,20 +1149,20 @@ static void ScriptCmd_monbg_22(void) u8 r1; gBattleAnimScriptPtr++; - r5 = SCRIPT_READ_8(gBattleAnimScriptPtr); + r5 = T1_READ_8(gBattleAnimScriptPtr); if (r5 == 0) r5 = 2; else if (r5 == 1) r5 = 3; if (r5 == 0 || r5 == 2) - r4 = gBattleAnimPlayerMonIndex; + r4 = gBattleAnimBankAttacker; else - r4 = gBattleAnimEnemyMonIndex; - if (b_side_obj__get_some_boolean(r4)) + r4 = gBattleAnimBankTarget; + if (IsAnimBankSpriteVisible(r4)) { r0 = GetBankIdentity(r4); r0 += 0xFF; - if (r0 <= 1 || IsContest() != 0) + if (r0 <= 1 || NotInBattle() != 0) r1 = 0; else r1 = 1; @@ -1170,11 +1170,11 @@ static void ScriptCmd_monbg_22(void) gSprites[gObjectBankIDs[r4]].invisible = FALSE; } r4 ^= 2; - if (r5 > 1 && b_side_obj__get_some_boolean(r4)) + if (r5 > 1 && IsAnimBankSpriteVisible(r4)) { r0 = GetBankIdentity(r4); r0 += 0xFF; - if (r0 <= 1 || IsContest() != 0) + if (r0 <= 1 || NotInBattle() != 0) r1 = 0; else r1 = 1; @@ -1191,18 +1191,18 @@ static void ScriptCmd_clearmonbg_23(void) u8 taskId; gBattleAnimScriptPtr++; - r5 = SCRIPT_READ_8(gBattleAnimScriptPtr); + r5 = T1_READ_8(gBattleAnimScriptPtr); if (r5 == 0) r5 = 2; else if (r5 == 1) r5 = 3; if (r5 == 0 || r5 == 2) - r6 = gBattleAnimPlayerMonIndex; + r6 = gBattleAnimBankAttacker; else - r6 = gBattleAnimEnemyMonIndex; - if (b_side_obj__get_some_boolean(r6)) + r6 = gBattleAnimBankTarget; + if (IsAnimBankSpriteVisible(r6)) gSprites[gObjectBankIDs[r6]].invisible = FALSE; - if (r5 > 1 && b_side_obj__get_some_boolean(r6 ^ 2)) + if (r5 > 1 && IsAnimBankSpriteVisible(r6 ^ 2)) gSprites[gObjectBankIDs[r6 ^ 2]].invisible = FALSE; else r5 = 0; @@ -1224,13 +1224,13 @@ static void sub_80769A4(u8 taskId) r4 = gTasks[taskId].data[2]; r0 = GetBankIdentity(r4); r0 += 0xFF; - if (r0 <= 1 || IsContest() != 0) + if (r0 <= 1 || NotInBattle() != 0) r5 = 0; else r5 = 1; - if (b_side_obj__get_some_boolean(r4)) + if (IsAnimBankSpriteVisible(r4)) sub_8076464(r5); - if (gTasks[taskId].data[0] > 1 && b_side_obj__get_some_boolean(r4 ^ 2)) + if (gTasks[taskId].data[0] > 1 && IsAnimBankSpriteVisible(r4 ^ 2)) sub_8076464(r5 ^ 1); DestroyTask(taskId); } @@ -1268,12 +1268,9 @@ static void ScriptCmd_blendoff(void) static void ScriptCmd_call(void) { - u32 addr; - gBattleAnimScriptPtr++; gBattleAnimScriptRetAddr = gBattleAnimScriptPtr + 4; - addr = SCRIPT_READ_32(gBattleAnimScriptPtr); - gBattleAnimScriptPtr = (u8 *)addr; + gBattleAnimScriptPtr = T2_READ_PTR(gBattleAnimScriptPtr); } static void ScriptCmd_return(void) @@ -1288,36 +1285,31 @@ static void ScriptCmd_setvar(void) u8 r2; gBattleAnimScriptPtr++; - r2 = SCRIPT_READ_8(gBattleAnimScriptPtr); + r2 = T1_READ_8(gBattleAnimScriptPtr); gBattleAnimScriptPtr++; - r4 = SCRIPT_READ_16(gBattleAnimScriptPtr); + r4 = T1_READ_16(gBattleAnimScriptPtr); gBattleAnimScriptPtr = addr + 4; gBattleAnimArgs[r2] = r4; } static void ScriptCmd_ifelse(void) { - u32 addr; - gBattleAnimScriptPtr++; if (gUnknown_0202F7C4 & 1) gBattleAnimScriptPtr += 4; - addr = SCRIPT_READ_32(gBattleAnimScriptPtr); - gBattleAnimScriptPtr = (u8 *)addr; + gBattleAnimScriptPtr = T2_READ_PTR(gBattleAnimScriptPtr); } static void ScriptCmd_jumpif(void) { u8 r1; - u32 addr; gBattleAnimScriptPtr++; - r1 = SCRIPT_READ_8(gBattleAnimScriptPtr); + r1 = T1_READ_8(gBattleAnimScriptPtr); gBattleAnimScriptPtr++; if (r1 == gUnknown_0202F7C4) { - addr = SCRIPT_READ_32(gBattleAnimScriptPtr); - gBattleAnimScriptPtr = (u8 *)addr; + gBattleAnimScriptPtr = T2_READ_PTR(gBattleAnimScriptPtr); } else { @@ -1327,15 +1319,11 @@ static void ScriptCmd_jumpif(void) static void ScriptCmd_jump(void) { - u32 addr; - gBattleAnimScriptPtr++; - addr = SCRIPT_READ_32(gBattleAnimScriptPtr); - gBattleAnimScriptPtr = (u8 *)addr; + gBattleAnimScriptPtr = T2_READ_PTR(gBattleAnimScriptPtr); } -// Uses of this function that rely on a TRUE return are expecting inBattle to not be ticked as defined in contest behavior. As a result, if misused, this function cannot reliably discern between field and contest status and could result in undefined behavior. -bool8 IsContest(void) +bool8 NotInBattle(void) { if (!gMain.inBattle) return TRUE; @@ -1349,7 +1337,7 @@ static void ScriptCmd_fadetobg(void) u8 taskId; gBattleAnimScriptPtr++; - r4 = SCRIPT_READ_8(gBattleAnimScriptPtr); + r4 = T1_READ_8(gBattleAnimScriptPtr); gBattleAnimScriptPtr++; taskId = CreateTask(task_p5_load_battle_screen_elements, 5); gTasks[taskId].data[0] = r4; @@ -1369,9 +1357,9 @@ static void ScriptCmd_fadetobg_25(void) r6 = gBattleAnimScriptPtr[2]; gBattleAnimScriptPtr += 3; taskId = CreateTask(task_p5_load_battle_screen_elements, 5); - if (IsContest() != 0) + if (NotInBattle() != 0) gTasks[taskId].data[0] = r6; - else if (GetBankSide(gBattleAnimEnemyMonIndex) == 0) + else if (GetBankSide(gBattleAnimBankTarget) == 0) gTasks[taskId].data[0] = r7; else gTasks[taskId].data[0] = r8; @@ -1416,15 +1404,15 @@ static void task_p5_load_battle_screen_elements(u8 taskId) static void sub_8076DB8(u16 a) { - if (IsContest()) + if (NotInBattle()) { void *tilemap = gBattleAnimBackgroundTable[a].tilemap; void *dmaSrc; void *dmaDest; - sub_800D238(tilemap, IsContest() ? EWRAM_14800 : EWRAM_18000); - sub_80763FC(sub_80789BC(), IsContest() ? EWRAM_14800 : EWRAM_18000, 0x100, 0); - dmaSrc = IsContest() ? EWRAM_14800 : EWRAM_18000; + LZDecompressWram(tilemap, NotInBattle() ? EWRAM_14800 : EWRAM_18000); + sub_80763FC(sub_80789BC(), NotInBattle() ? EWRAM_14800 : EWRAM_18000, 0x100, 0); + dmaSrc = NotInBattle() ? EWRAM_14800 : EWRAM_18000; dmaDest = (void *)(VRAM + 0xD000); DmaCopy32(3, dmaSrc, dmaDest, 0x800); LZDecompressVram(gBattleAnimBackgroundTable[a].image, (void *)(VRAM + 0x2000)); @@ -1440,7 +1428,7 @@ static void sub_8076DB8(u16 a) static void dp01t_11_3_message_for_player_only(void) { - if (IsContest()) + if (NotInBattle()) sub_80AB2AC(); else sub_800D7B8(); @@ -1485,7 +1473,7 @@ static void ScriptCmd_waitbgfadein(void) static void ScriptCmd_changebg(void) { gBattleAnimScriptPtr++; - sub_8076DB8(SCRIPT_READ_8(gBattleAnimScriptPtr)); + sub_8076DB8(T1_READ_8(gBattleAnimScriptPtr)); gBattleAnimScriptPtr++; } @@ -1493,16 +1481,16 @@ static void ScriptCmd_changebg(void) /* s8 sub_8076F98(s8 a) { - if (!IsContest() && (EWRAM_17810[gBattleAnimPlayerMonIndex].unk0 & 0x10)) + if (!NotInBattle() && (EWRAM_17810[gBattleAnimBankAttacker].unk0 & 0x10)) { - a = GetBankSide(gBattleAnimPlayerMonIndex) ? 0xC0 : 0x3F; + a = GetBankSide(gBattleAnimBankAttacker) ? 0xC0 : 0x3F; } //_08076FDC else { - if (IsContest()) + if (NotInBattle()) { - if (gBattleAnimPlayerMonIndex == gBattleAnimEnemyMonIndex && gBattleAnimPlayerMonIndex == 2 + if (gBattleAnimBankAttacker == gBattleAnimBankTarget && gBattleAnimBankAttacker == 2 && a == 0x3F) { //jump to _0807707A @@ -1514,9 +1502,9 @@ s8 sub_8076F98(s8 a) //_08077004 else { - if (GetBankSide(gBattleAnimPlayerMonIndex) == 0) + if (GetBankSide(gBattleAnimBankAttacker) == 0) { - if (GetBankSide(gBattleAnimEnemyMonIndex) == 0) + if (GetBankSide(gBattleAnimBankTarget) == 0) } //_08077042 else @@ -1536,11 +1524,11 @@ s8 sub_8076F98(s8 a) push {r4,lr}\n\ lsls r0, 24\n\ lsrs r4, r0, 24\n\ - bl IsContest\n\ + bl NotInBattle\n\ lsls r0, 24\n\ cmp r0, 0\n\ bne _08076FDC\n\ - ldr r0, _08076FD4 @ =gBattleAnimPlayerMonIndex\n\ + ldr r0, _08076FD4 @ =gBattleAnimBankAttacker\n\ ldrb r2, [r0]\n\ lsls r0, r2, 1\n\ adds r0, r2\n\ @@ -1561,15 +1549,15 @@ s8 sub_8076F98(s8 a) movs r4, 0x3F\n\ b _0807706E\n\ .align 2, 0\n\ -_08076FD4: .4byte gBattleAnimPlayerMonIndex\n\ +_08076FD4: .4byte gBattleAnimBankAttacker\n\ _08076FD8: .4byte 0x02017810\n\ _08076FDC:\n\ - bl IsContest\n\ + bl NotInBattle\n\ lsls r0, 24\n\ cmp r0, 0\n\ beq _08077004\n\ - ldr r0, _08076FFC @ =gBattleAnimPlayerMonIndex\n\ - ldr r1, _08077000 @ =gBattleAnimEnemyMonIndex\n\ + ldr r0, _08076FFC @ =gBattleAnimBankAttacker\n\ + ldr r1, _08077000 @ =gBattleAnimBankTarget\n\ ldrb r0, [r0]\n\ ldrb r1, [r1]\n\ cmp r0, r1\n\ @@ -1580,16 +1568,16 @@ _08076FDC:\n\ beq _0807707A\n\ b _08077068\n\ .align 2, 0\n\ -_08076FFC: .4byte gBattleAnimPlayerMonIndex\n\ -_08077000: .4byte gBattleAnimEnemyMonIndex\n\ +_08076FFC: .4byte gBattleAnimBankAttacker\n\ +_08077000: .4byte gBattleAnimBankTarget\n\ _08077004:\n\ - ldr r0, _0807702C @ =gBattleAnimPlayerMonIndex\n\ + ldr r0, _0807702C @ =gBattleAnimBankAttacker\n\ ldrb r0, [r0]\n\ bl GetBankSide\n\ lsls r0, 24\n\ cmp r0, 0\n\ bne _08077042\n\ - ldr r0, _08077030 @ =gBattleAnimEnemyMonIndex\n\ + ldr r0, _08077030 @ =gBattleAnimBankTarget\n\ ldrb r0, [r0]\n\ bl GetBankSide\n\ lsls r0, 24\n\ @@ -1602,8 +1590,8 @@ _08077004:\n\ movs r4, 0xC0\n\ b _0807706E\n\ .align 2, 0\n\ -_0807702C: .4byte gBattleAnimPlayerMonIndex\n\ -_08077030: .4byte gBattleAnimEnemyMonIndex\n\ +_0807702C: .4byte gBattleAnimBankAttacker\n\ +_08077030: .4byte gBattleAnimBankTarget\n\ _08077034:\n\ movs r0, 0x40\n\ negs r0, r0\n\ @@ -1613,7 +1601,7 @@ _08077034:\n\ lsls r0, 24\n\ b _0807706C\n\ _08077042:\n\ - ldr r0, _08077064 @ =gBattleAnimEnemyMonIndex\n\ + ldr r0, _08077064 @ =gBattleAnimBankTarget\n\ ldrb r0, [r0]\n\ bl GetBankSide\n\ lsls r0, 24\n\ @@ -1629,7 +1617,7 @@ _08077042:\n\ movs r4, 0x3F\n\ b _0807706E\n\ .align 2, 0\n\ -_08077064: .4byte gBattleAnimEnemyMonIndex\n\ +_08077064: .4byte gBattleAnimBankTarget\n\ _08077068:\n\ lsls r0, r4, 24\n\ negs r0, r0\n\ @@ -1661,16 +1649,16 @@ _08077088:\n\ s8 sub_8077094(s8 a) { - if (!IsContest() && (EWRAM_17810[gBattleAnimPlayerMonIndex].unk0 & 0x10)) + if (!NotInBattle() && (EWRAM_17810[gBattleAnimBankAttacker].unk0 & 0x10)) { - if (GetBankSide(gBattleAnimPlayerMonIndex) != 0) + if (GetBankSide(gBattleAnimBankAttacker) != 0) a = 0x3F; else a = 0xC0; } else { - if (GetBankSide(gBattleAnimPlayerMonIndex) != 0 || IsContest() != 0) + if (GetBankSide(gBattleAnimBankAttacker) != 0 || NotInBattle() != 0) a = -a; } return a; @@ -1706,8 +1694,8 @@ static void ScriptCmd_panse_19(void) s8 r0; gBattleAnimScriptPtr++; - r4 = SCRIPT_READ_16(gBattleAnimScriptPtr); - r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2); + r4 = T1_READ_16(gBattleAnimScriptPtr); + r0 = T1_READ_8(gBattleAnimScriptPtr + 2); PlaySE12WithPanning(r4, sub_8076F98(r0)); gBattleAnimScriptPtr += 3; } @@ -1717,7 +1705,7 @@ static void ScriptCmd_setpan(void) s8 r0; gBattleAnimScriptPtr++; - r0 = SCRIPT_READ_8(gBattleAnimScriptPtr); + r0 = T1_READ_8(gBattleAnimScriptPtr); SE12PanpotControl(sub_8076F98(r0)); gBattleAnimScriptPtr++; } @@ -1734,11 +1722,11 @@ static void ScriptCmd_panse_1B(void) u8 taskId; gBattleAnimScriptPtr++; - songNum = SCRIPT_READ_16(gBattleAnimScriptPtr); - r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2); - r4 = SCRIPT_READ_8(gBattleAnimScriptPtr + 3); - r6 = SCRIPT_READ_8(gBattleAnimScriptPtr + 4); - r7 = SCRIPT_READ_8(gBattleAnimScriptPtr + 5); + songNum = T1_READ_16(gBattleAnimScriptPtr); + r0 = T1_READ_8(gBattleAnimScriptPtr + 2); + r4 = T1_READ_8(gBattleAnimScriptPtr + 3); + r6 = T1_READ_8(gBattleAnimScriptPtr + 4); + r7 = T1_READ_8(gBattleAnimScriptPtr + 5); panning = sub_8076F98(r0); r8 = sub_8076F98(r4); r4 = sub_807712C(panning, r8, r6); @@ -1899,11 +1887,11 @@ static void ScriptCmd_panse_26(void) u8 taskId; gBattleAnimScriptPtr++; - r8 = SCRIPT_READ_16(gBattleAnimScriptPtr); - r4 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2); - r5 = SCRIPT_READ_8(gBattleAnimScriptPtr + 3); - r6 = SCRIPT_READ_8(gBattleAnimScriptPtr + 4); - r10 = SCRIPT_READ_8(gBattleAnimScriptPtr + 5); + r8 = T1_READ_16(gBattleAnimScriptPtr); + r4 = T1_READ_8(gBattleAnimScriptPtr + 2); + r5 = T1_READ_8(gBattleAnimScriptPtr + 3); + r6 = T1_READ_8(gBattleAnimScriptPtr + 4); + r10 = T1_READ_8(gBattleAnimScriptPtr + 5); taskId = CreateTask(c3_08073CEC, 1); gTasks[taskId].data[0] = r4; gTasks[taskId].data[1] = r5; @@ -1928,11 +1916,11 @@ static void ScriptCmd_panse_27(void) u8 taskId; gBattleAnimScriptPtr++; - r9 = SCRIPT_READ_16(gBattleAnimScriptPtr); - r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2); - r4 = SCRIPT_READ_8(gBattleAnimScriptPtr + 3); - r8 = SCRIPT_READ_8(gBattleAnimScriptPtr + 4); - r7 = SCRIPT_READ_8(gBattleAnimScriptPtr + 5); + r9 = T1_READ_16(gBattleAnimScriptPtr); + r0 = T1_READ_8(gBattleAnimScriptPtr + 2); + r4 = T1_READ_8(gBattleAnimScriptPtr + 3); + r8 = T1_READ_8(gBattleAnimScriptPtr + 4); + r7 = T1_READ_8(gBattleAnimScriptPtr + 5); r6 = sub_8077094(r0); r5 = sub_8077094(r4); r4_2 = sub_8077094(r8); @@ -1957,10 +1945,10 @@ static void ScriptCmd_panse_1C(void) u8 taskId; gBattleAnimScriptPtr++; - r5 = SCRIPT_READ_16(gBattleAnimScriptPtr); - r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2); - r8 = SCRIPT_READ_8(gBattleAnimScriptPtr + 3); - r9 = SCRIPT_READ_8(gBattleAnimScriptPtr + 4); + r5 = T1_READ_16(gBattleAnimScriptPtr); + r0 = T1_READ_8(gBattleAnimScriptPtr + 2); + r8 = T1_READ_8(gBattleAnimScriptPtr + 3); + r9 = T1_READ_8(gBattleAnimScriptPtr + 4); r4 = sub_8076F98(r0); taskId = CreateTask(sub_80774FC, 1); gTasks[taskId].data[0] = r5; @@ -2007,9 +1995,9 @@ static void ScriptCmd_panse_1D(void) u8 taskId; gBattleAnimScriptPtr++; - r5 = SCRIPT_READ_16(gBattleAnimScriptPtr); - r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2); - r8 = SCRIPT_READ_8(gBattleAnimScriptPtr + 3); + r5 = T1_READ_16(gBattleAnimScriptPtr); + r0 = T1_READ_8(gBattleAnimScriptPtr + 2); + r8 = T1_READ_8(gBattleAnimScriptPtr + 3); r4 = sub_8076F98(r0); taskId = CreateTask(sub_80775CC, 1); gTasks[taskId].data[0] = r5; @@ -2041,13 +2029,13 @@ static void ScriptCmd_createtask_1F(void) u8 taskId; gBattleAnimScriptPtr++; - func = (TaskFunc)SCRIPT_READ_32(gBattleAnimScriptPtr); + func = (TaskFunc)T2_READ_32(gBattleAnimScriptPtr); gBattleAnimScriptPtr += 4; - numArgs = SCRIPT_READ_8(gBattleAnimScriptPtr); + numArgs = T1_READ_8(gBattleAnimScriptPtr); gBattleAnimScriptPtr++; for (i = 0; i < numArgs; i++) { - gBattleAnimArgs[i] = SCRIPT_READ_16(gBattleAnimScriptPtr); + gBattleAnimArgs[i] = T1_READ_16(gBattleAnimScriptPtr); gBattleAnimScriptPtr += 2; } taskId = CreateTask(func, 1); @@ -2090,11 +2078,11 @@ static void ScriptCmd_jumpvareq(void) u8 *addr; gBattleAnimScriptPtr++; - r2 = SCRIPT_READ_8(gBattleAnimScriptPtr); - r1 = SCRIPT_READ_16(gBattleAnimScriptPtr + 1); + r2 = T1_READ_8(gBattleAnimScriptPtr); + r1 = T1_READ_16(gBattleAnimScriptPtr + 1); if (r1 == gBattleAnimArgs[r2]) { - addr = (u8 *)SCRIPT_READ_32(gBattleAnimScriptPtr + 3); + addr = T2_READ_PTR(gBattleAnimScriptPtr + 3); gBattleAnimScriptPtr = addr; } else @@ -2108,9 +2096,9 @@ static void ScriptCmd_jumpunkcond(void) u8 *addr; gBattleAnimScriptPtr++; - if (IsContest()) + if (NotInBattle()) { - addr = (u8 *)SCRIPT_READ_32(gBattleAnimScriptPtr); + addr = T2_READ_PTR(gBattleAnimScriptPtr); gBattleAnimScriptPtr = addr; } else @@ -2125,14 +2113,14 @@ static void ScriptCmd_monbgprio_28(void) u8 r0; u8 r4; - r2 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1); + r2 = T1_READ_8(gBattleAnimScriptPtr + 1); gBattleAnimScriptPtr += 2; if (r2 != 0) - r0 = gBattleAnimEnemyMonIndex; + r0 = gBattleAnimBankTarget; else - r0 = gBattleAnimPlayerMonIndex; + r0 = gBattleAnimBankAttacker; r4 = GetBankIdentity(r0); - if (!IsContest() && (r4 == 0 || r4 == 3)) + if (!NotInBattle() && (r4 == 0 || r4 == 3)) { REG_BG1CNT_BITFIELD.priority = 1; REG_BG2CNT_BITFIELD.priority = 2; @@ -2142,7 +2130,7 @@ static void ScriptCmd_monbgprio_28(void) static void ScriptCmd_monbgprio_29(void) { gBattleAnimScriptPtr++; - if (!IsContest()) + if (!NotInBattle()) { REG_BG1CNT_BITFIELD.priority = 1; REG_BG2CNT_BITFIELD.priority = 2; @@ -2155,16 +2143,16 @@ static void ScriptCmd_monbgprio_2A(void) u8 r4; u8 r0; - r6 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1); + r6 = T1_READ_8(gBattleAnimScriptPtr + 1); gBattleAnimScriptPtr += 2; - if (GetBankSide(gBattleAnimPlayerMonIndex) != GetBankSide(gBattleAnimEnemyMonIndex)) + if (GetBankSide(gBattleAnimBankAttacker) != GetBankSide(gBattleAnimBankTarget)) { if (r6 != 0) - r0 = gBattleAnimEnemyMonIndex; + r0 = gBattleAnimBankTarget; else - r0 = gBattleAnimPlayerMonIndex; + r0 = gBattleAnimBankAttacker; r4 = GetBankIdentity(r0); - if (!IsContest() && (r4 == 0 || r4 == 3)) + if (!NotInBattle() && (r4 == 0 || r4 == 3)) { REG_BG1CNT_BITFIELD.priority = 1; REG_BG2CNT_BITFIELD.priority = 2; @@ -2177,8 +2165,8 @@ static void ScriptCmd_invisible(void) u8 r0; u8 spriteId; - r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1); - spriteId = obj_id_for_side_relative_to_move(r0); + r0 = T1_READ_8(gBattleAnimScriptPtr + 1); + spriteId = GetAnimBankSpriteId(r0); if (spriteId != 0xFF) { gSprites[spriteId].invisible = TRUE; @@ -2191,8 +2179,8 @@ static void ScriptCmd_visible(void) u8 r0; u8 spriteId; - r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1); - spriteId = obj_id_for_side_relative_to_move(r0); + r0 = T1_READ_8(gBattleAnimScriptPtr + 1); + spriteId = GetAnimBankSpriteId(r0); if (spriteId != 0xFF) { gSprites[spriteId].invisible = FALSE; @@ -2206,20 +2194,20 @@ static void ScriptCmd_doublebattle_2D(void) u8 r4; u8 spriteId; - r7 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1); + r7 = T1_READ_8(gBattleAnimScriptPtr + 1); gBattleAnimScriptPtr += 2; - if (!IsContest() && IsDoubleBattle() - && GetBankSide(gBattleAnimPlayerMonIndex) == GetBankSide(gBattleAnimEnemyMonIndex)) + if (!NotInBattle() && IsDoubleBattle() + && GetBankSide(gBattleAnimBankAttacker) == GetBankSide(gBattleAnimBankTarget)) { if (r7 == 0) { - r4 = GetBankIdentity_permutated(gBattleAnimPlayerMonIndex); - spriteId = obj_id_for_side_relative_to_move(0); + r4 = GetBankIdentity_permutated(gBattleAnimBankAttacker); + spriteId = GetAnimBankSpriteId(0); } else { - r4 = GetBankIdentity_permutated(gBattleAnimEnemyMonIndex); - spriteId = obj_id_for_side_relative_to_move(1); + r4 = GetBankIdentity_permutated(gBattleAnimBankTarget); + spriteId = GetAnimBankSpriteId(1); } if (spriteId != 0xFF) { @@ -2240,20 +2228,20 @@ static void ScriptCmd_doublebattle_2E(void) u8 r4; u8 spriteId; - r7 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1); + r7 = T1_READ_8(gBattleAnimScriptPtr + 1); gBattleAnimScriptPtr += 2; - if (!IsContest() && IsDoubleBattle() - && GetBankSide(gBattleAnimPlayerMonIndex) == GetBankSide(gBattleAnimEnemyMonIndex)) + if (!NotInBattle() && IsDoubleBattle() + && GetBankSide(gBattleAnimBankAttacker) == GetBankSide(gBattleAnimBankTarget)) { if (r7 == 0) { - r4 = GetBankIdentity_permutated(gBattleAnimPlayerMonIndex); - spriteId = obj_id_for_side_relative_to_move(0); + r4 = GetBankIdentity_permutated(gBattleAnimBankAttacker); + spriteId = GetAnimBankSpriteId(0); } else { - r4 = GetBankIdentity_permutated(gBattleAnimEnemyMonIndex); - spriteId = obj_id_for_side_relative_to_move(1); + r4 = GetBankIdentity_permutated(gBattleAnimBankTarget); + spriteId = GetAnimBankSpriteId(1); } if (spriteId != 0xFF && r4 == 2) { diff --git a/src/battle_anim_807B69C.c b/src/battle/battle_anim_807B69C.c index 42932877b..9acc7bd46 100644 --- a/src/battle_anim_807B69C.c +++ b/src/battle/battle_anim_807B69C.c @@ -8,12 +8,12 @@ #include "task.h" #include "trig.h" -extern u8 gBattleAnimPlayerMonIndex; -extern u8 gBattleAnimEnemyMonIndex; +extern u8 gBattleAnimBankAttacker; +extern u8 gBattleAnimBankTarget; extern bool8 gAnimScriptActive; extern void (*gAnimScriptCallback)(void); extern s16 gBattleAnimArgs[]; -extern u8 gBattleAnimEnemyMonIndex; +extern u8 gBattleAnimBankTarget; extern u8 gObjectBankIDs[]; extern const struct CompressedSpriteSheet gBattleAnimPicTable[]; extern const struct CompressedSpritePalette gBattleAnimPaletteTable[]; @@ -179,11 +179,11 @@ static void sub_807B8A4(struct Sprite *sprite) void sub_807B920(u8 taskId) { - s16 x = sub_8077ABC(gBattleAnimEnemyMonIndex, 2) - 32; - s16 y = sub_8077ABC(gBattleAnimEnemyMonIndex, 3) - 36; + s16 x = sub_8077ABC(gBattleAnimBankTarget, 2) - 32; + s16 y = sub_8077ABC(gBattleAnimBankTarget, 3) - 36; u8 spriteId; - if (IsContest()) + if (NotInBattle()) x -= 6; REG_BLDCNT = 0x3F40; REG_BLDALPHA = 0x1000; @@ -335,8 +335,8 @@ void move_anim_start_t2(u8 a, u8 b) { u8 taskId; - gBattleAnimPlayerMonIndex = a; - gBattleAnimEnemyMonIndex = a; + gBattleAnimBankAttacker = a; + gBattleAnimBankTarget = a; DoMoveAnim(gBattleAnims_StatusConditions, b, 0); taskId = CreateTask(sub_807BDAC, 10); gTasks[taskId].data[0] = a; diff --git a/src/battle_anim_80A7E7C.c b/src/battle/battle_anim_80A7E7C.c index 31984977f..19ac7143e 100644 --- a/src/battle_anim_80A7E7C.c +++ b/src/battle/battle_anim_80A7E7C.c @@ -12,8 +12,8 @@ extern s16 gBattleAnimArgs[8]; extern u8 gObjectBankIDs[]; extern s32 gMoveDmgMoveAnim; extern u16 gMovePowerMoveAnim; -extern u8 gBattleAnimPlayerMonIndex; -extern u8 gBattleAnimEnemyMonIndex; +extern u8 gBattleAnimBankAttacker; +extern u8 gBattleAnimBankTarget; static void sub_80A7EF0(u8 taskId); static void sub_80A808C(u8 taskId); @@ -34,7 +34,7 @@ static void sub_80A913C(u8 taskId); void sub_80A7E7C(u8 taskId) { u8 sprite; - sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); + sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]); if (sprite == 0xff) { DestroyAnimVisualTask(taskId); @@ -96,7 +96,7 @@ void sub_80A7FA0(u8 taskId) r6 = 0; if (gBattleAnimArgs[0] < 4) { - sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); + sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]); if (sprite == 0xff) { DestroyAnimVisualTask(taskId); @@ -121,7 +121,7 @@ void sub_80A7FA0(u8 taskId) side = GetBankByPlayerAI(3); break; } - if (b_side_obj__get_some_boolean(side) == FALSE) + if (IsAnimBankSpriteVisible(side) == FALSE) { r6 = 1; } @@ -129,7 +129,7 @@ void sub_80A7FA0(u8 taskId) } else { - sprite = gObjectBankIDs[gBattleAnimPlayerMonIndex]; + sprite = gObjectBankIDs[gBattleAnimBankAttacker]; } if (r6) { @@ -186,7 +186,7 @@ static void sub_80A808C(u8 taskId) void sub_80A8154(u8 taskId) { u8 sprite; - sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); + sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]); if (sprite == 0xff) { DestroyAnimVisualTask(taskId); @@ -244,7 +244,7 @@ static void sub_80A81D8(u8 taskId) void sub_80A8314(u8 taskId) { - u8 sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); + u8 sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]); gSprites[sprite].pos2.x = gBattleAnimArgs[1]; TASK.data[0] = sprite; TASK.data[1] = gBattleAnimArgs[1]; @@ -286,7 +286,7 @@ void sub_80A8408(u8 taskId) u8 sprite; u8 v1; v1 = 1; - sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); + sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]); if (gBattleAnimArgs[4] > 5) { gBattleAnimArgs[4] = 5; @@ -328,7 +328,7 @@ static void sub_80A8488(u8 taskId) void sub_80A8500(u8 taskId) { - if (GetBankSide(gBattleAnimPlayerMonIndex)) + if (GetBankSide(gBattleAnimBankAttacker)) { gBattleAnimArgs[1] = -gBattleAnimArgs[1]; } @@ -338,7 +338,7 @@ void sub_80A8500(u8 taskId) void sub_80A8530(struct Sprite *sprite) { sprite->invisible = TRUE; - if (GetBankSide(gBattleAnimPlayerMonIndex)) + if (GetBankSide(gBattleAnimBankAttacker)) { sprite->data1 = -gBattleAnimArgs[1]; } @@ -348,9 +348,9 @@ void sub_80A8530(struct Sprite *sprite) } sprite->data0 = gBattleAnimArgs[0]; sprite->data2 = 0; - sprite->data3 = gObjectBankIDs[gBattleAnimPlayerMonIndex]; + sprite->data3 = gObjectBankIDs[gBattleAnimBankAttacker]; sprite->data4 = gBattleAnimArgs[0]; - oamt_set_x3A_32(sprite, sub_80A85A4); + StoreSpriteCallbackInData6(sprite, sub_80A85A4); sprite->callback = sub_8078458; } @@ -359,20 +359,20 @@ static void sub_80A85A4(struct Sprite *sprite) sprite->data0 = sprite->data4; sprite->data1 = -sprite->data1; sprite->callback = sub_8078458; - oamt_set_x3A_32(sprite, move_anim_8072740); + StoreSpriteCallbackInData6(sprite, move_anim_8072740); } void sub_80A85C8(struct Sprite *sprite) { u8 spriteId; sprite->invisible = TRUE; - spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[2]); + spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]); sprite->data0 = gBattleAnimArgs[0]; sprite->data1 = 0; sprite->data2 = gBattleAnimArgs[1]; sprite->data3 = spriteId; sprite->data4 = gBattleAnimArgs[0]; - oamt_set_x3A_32(sprite, sub_80A8614); + StoreSpriteCallbackInData6(sprite, sub_80A8614); sprite->callback = sub_8078458; } @@ -381,7 +381,7 @@ void sub_80A8614(struct Sprite *sprite) sprite->data0 = sprite->data4; sprite->data2 = -sprite->data2; sprite->callback = sub_8078458; - oamt_set_x3A_32(sprite, move_anim_8072740); + StoreSpriteCallbackInData6(sprite, move_anim_8072740); } void sub_80A8638(struct Sprite *sprite) @@ -390,11 +390,11 @@ void sub_80A8638(struct Sprite *sprite) int spriteId; if (!gBattleAnimArgs[0]) { - spriteId = gObjectBankIDs[gBattleAnimPlayerMonIndex]; + spriteId = gObjectBankIDs[gBattleAnimBankAttacker]; } else { - spriteId = gObjectBankIDs[gBattleAnimEnemyMonIndex]; + spriteId = gObjectBankIDs[gBattleAnimBankTarget]; } sprite->data0 = gBattleAnimArgs[2]; sprite->data1 = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x; @@ -457,11 +457,11 @@ void sub_80A8764(struct Sprite *sprite) u8 spriteId; if (!gBattleAnimArgs[0]) { - v1 = gBattleAnimPlayerMonIndex; + v1 = gBattleAnimBankAttacker; } else { - v1 = gBattleAnimEnemyMonIndex; + v1 = gBattleAnimBankTarget; } spriteId = gObjectBankIDs[v1]; if (GetBankSide(v1)) @@ -482,7 +482,7 @@ void sub_80A8764(struct Sprite *sprite) sprite->data4 = 0; sprite->data5 = spriteId; sprite->invisible = TRUE; - oamt_set_x3A_32(sprite, move_anim_8072740); + StoreSpriteCallbackInData6(sprite, move_anim_8072740); sprite->callback = sub_80784A8; } @@ -493,11 +493,11 @@ void sub_80A8818(struct Sprite *sprite) sprite->invisible = TRUE; if (!gBattleAnimArgs[0]) { - v1 = gBattleAnimPlayerMonIndex; + v1 = gBattleAnimBankAttacker; } else { - v1 = gBattleAnimEnemyMonIndex; + v1 = gBattleAnimBankTarget; } spriteId = gObjectBankIDs[v1]; if (GetBankSide(v1)) @@ -520,11 +520,11 @@ void sub_80A8818(struct Sprite *sprite) sprite->data6 = gBattleAnimArgs[5]; if (!gBattleAnimArgs[5]) { - oamt_set_x3A_32(sprite, move_anim_8072740); + StoreSpriteCallbackInData6(sprite, move_anim_8072740); } else { - oamt_set_x3A_32(sprite, sub_80A88F0); + StoreSpriteCallbackInData6(sprite, sub_80A88F0); } sprite->callback = sub_80784A8; } @@ -541,12 +541,12 @@ void sub_80A8920(u8 taskId) { s16 r7; r7 = 0x8000 / gBattleAnimArgs[3]; - if (GetBankSide(gBattleAnimPlayerMonIndex)) + if (GetBankSide(gBattleAnimBankAttacker)) { gBattleAnimArgs[1] = -gBattleAnimArgs[1]; gBattleAnimArgs[5] = -gBattleAnimArgs[5]; } - TASK.data[0] = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); + TASK.data[0] = GetAnimBankSpriteId(gBattleAnimArgs[0]); TASK.data[1] = (gBattleAnimArgs[1] << 8) / gBattleAnimArgs[3]; TASK.data[2] = gBattleAnimArgs[2]; TASK.data[3] = gBattleAnimArgs[3]; @@ -600,30 +600,30 @@ void sub_80A8A80(u8 taskId) { case 0: case 1: - spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); + spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]); break; case 2: - if (!b_side_obj__get_some_boolean(gBattleAnimPlayerMonIndex ^ 2)) + if (!IsAnimBankSpriteVisible(gBattleAnimBankAttacker ^ 2)) { DestroyAnimVisualTask(taskId); return; } - spriteId = gObjectBankIDs[gBattleAnimPlayerMonIndex ^ 2]; + spriteId = gObjectBankIDs[gBattleAnimBankAttacker ^ 2]; break; case 3: - if (!b_side_obj__get_some_boolean(gBattleAnimEnemyMonIndex ^ 2)) + if (!IsAnimBankSpriteVisible(gBattleAnimBankTarget ^ 2)) { DestroyAnimVisualTask(taskId); return; } - spriteId = gObjectBankIDs[gBattleAnimEnemyMonIndex ^ 2]; + spriteId = gObjectBankIDs[gBattleAnimBankTarget ^ 2]; break; default: DestroyAnimVisualTask(taskId); return; } TASK.data[0] = spriteId; - if (GetBankSide(gBattleAnimEnemyMonIndex)) + if (GetBankSide(gBattleAnimBankTarget)) { TASK.data[1] = gBattleAnimArgs[1]; } @@ -648,11 +648,11 @@ static void sub_80A8B3C(u8 taskId) void sub_80A8B88(u8 taskId) { u8 spriteId; - if (GetBankSide(gBattleAnimPlayerMonIndex)) + if (GetBankSide(gBattleAnimBankAttacker)) { gBattleAnimArgs[1] = -gBattleAnimArgs[1]; } - spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[4]); + spriteId = GetAnimBankSpriteId(gBattleAnimArgs[4]); TASK.data[0] = gBattleAnimArgs[0]; TASK.data[1] = gBattleAnimArgs[1]; TASK.data[2] = gBattleAnimArgs[2]; @@ -660,11 +660,11 @@ void sub_80A8B88(u8 taskId) TASK.data[4] = spriteId; if (gBattleAnimArgs[4] == 0) { - TASK.data[5] = gBattleAnimPlayerMonIndex; + TASK.data[5] = gBattleAnimBankAttacker; } else { - TASK.data[5] = gBattleAnimEnemyMonIndex; + TASK.data[5] = gBattleAnimBankTarget; } TASK.data[12] = 1; TASK.func = sub_80A8C0C; @@ -714,7 +714,7 @@ static void sub_80A8C0C(u8 taskId) void sub_80A8D34(u8 taskId) { u8 spriteId; - spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[3]); + spriteId = GetAnimBankSpriteId(gBattleAnimArgs[3]); sub_8078E70(spriteId, gBattleAnimArgs[4]); TASK.data[0] = gBattleAnimArgs[0]; TASK.data[1] = gBattleAnimArgs[1]; @@ -754,7 +754,7 @@ static void sub_80A8D8C(u8 taskId) void sub_80A8E04(u8 taskId) { u8 spriteId; - spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[2]); + spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]); sub_8078E70(spriteId, 0); TASK.data[1] = 0; TASK.data[2] = gBattleAnimArgs[0]; @@ -769,7 +769,7 @@ void sub_80A8E04(u8 taskId) TASK.data[4] = gBattleAnimArgs[1]; TASK.data[5] = spriteId; TASK.data[6] = gBattleAnimArgs[3]; - if (IsContest()) + if (NotInBattle()) { TASK.data[7] = 1; } @@ -777,16 +777,16 @@ void sub_80A8E04(u8 taskId) { if (gBattleAnimArgs[2] == 0) { - TASK.data[7] = !GetBankSide(gBattleAnimPlayerMonIndex); + TASK.data[7] = !GetBankSide(gBattleAnimBankAttacker); } else { - TASK.data[7] = !GetBankSide(gBattleAnimEnemyMonIndex); + TASK.data[7] = !GetBankSide(gBattleAnimBankTarget); } } if (TASK.data[7]) { - if (!IsContest()) + if (!NotInBattle()) { TASK.data[3] *= -1; TASK.data[4] *= -1; @@ -798,20 +798,20 @@ void sub_80A8E04(u8 taskId) void sub_80A8EFC(u8 taskId) { u8 spriteId; - spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[2]); + spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]); sub_8078E70(spriteId, 0); TASK.data[1] = 0; TASK.data[2] = gBattleAnimArgs[0]; if (gBattleAnimArgs[2] == 0) { - if (GetBankSide(gBattleAnimPlayerMonIndex)) + if (GetBankSide(gBattleAnimBankAttacker)) { gBattleAnimArgs[1] = -gBattleAnimArgs[1]; } } else { - if (GetBankSide(gBattleAnimEnemyMonIndex)) + if (GetBankSide(gBattleAnimBankTarget)) { gBattleAnimArgs[1] = -gBattleAnimArgs[1]; } @@ -891,7 +891,7 @@ void sub_80A9058(u8 taskId) TASK.data[12] = 0; TASK.data[10] = gBattleAnimArgs[3]; TASK.data[11] = gBattleAnimArgs[4]; - TASK.data[7] = obj_id_for_side_relative_to_move(1); + TASK.data[7] = GetAnimBankSpriteId(1); TASK.data[8] = gSprites[TASK.data[7]].pos2.x; TASK.data[9] = gSprites[TASK.data[7]].pos2.y; TASK.data[0] = 0; diff --git a/src/battle/battle_anim_80CA710.c b/src/battle/battle_anim_80CA710.c new file mode 100644 index 000000000..65ccd7c21 --- /dev/null +++ b/src/battle/battle_anim_80CA710.c @@ -0,0 +1,18 @@ + +// Includes +#include "global.h" + +// Static type declarations + +// Static RAM declarations + +IWRAM_DATA u32 filler_03000724; +IWRAM_DATA u16 gUnknown_03000728[4]; +IWRAM_DATA u16 gUnknown_03000730[6]; +IWRAM_DATA u32 filler_0300073c; + +// Static ROM declarations + +// .rodata + +// .text diff --git a/src/battle_controller_linkopponent.c b/src/battle/battle_controller_linkopponent.c index 93c6671e5..ff4df81e4 100644 --- a/src/battle_controller_linkopponent.c +++ b/src/battle/battle_controller_linkopponent.c @@ -71,7 +71,7 @@ extern void sub_8031A6C(u16, u8); extern void sub_80313A0(struct Sprite *); extern void sub_803757C(void); extern void oamt_add_pos2_onto_pos1(); -extern void oamt_set_x3A_32(); +extern void StoreSpriteCallbackInData6(); extern void sub_8078B34(struct Sprite *); extern void sub_80375B4(void); extern void sub_8010384(struct Sprite *); @@ -99,7 +99,7 @@ extern void nullsub_47(void); extern bool8 IsDoubleBattle(void); extern void sub_8037840(void); extern void sub_8031B74(); -extern u8 sub_8078874(); +extern u8 AnimBankSpriteExists(); extern u8 move_anim_start_t3(); extern void sub_8037FD8(void); extern void sub_8037F34(void); @@ -618,7 +618,7 @@ u32 dp01_getattr_by_ch1_for_player_pokemon__(u8 a, u8 *buffer) battlePokemon.hpIV = GetMonData(&gEnemyParty[a], MON_DATA_HP_IV); battlePokemon.attackIV = GetMonData(&gEnemyParty[a], MON_DATA_ATK_IV); battlePokemon.defenseIV = GetMonData(&gEnemyParty[a], MON_DATA_DEF_IV); - battlePokemon.speedIV = GetMonData(&gEnemyParty[a], MON_DATA_SPD_IV); + battlePokemon.speedIV = GetMonData(&gEnemyParty[a], MON_DATA_SPEED_IV); battlePokemon.spAttackIV = GetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV); battlePokemon.spDefenseIV = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV); battlePokemon.personality = GetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY); @@ -628,7 +628,7 @@ u32 dp01_getattr_by_ch1_for_player_pokemon__(u8 a, u8 *buffer) battlePokemon.maxHP = GetMonData(&gEnemyParty[a], MON_DATA_MAX_HP); battlePokemon.attack = GetMonData(&gEnemyParty[a], MON_DATA_ATK); battlePokemon.defense = GetMonData(&gEnemyParty[a], MON_DATA_DEF); - battlePokemon.speed = GetMonData(&gEnemyParty[a], MON_DATA_SPD); + battlePokemon.speed = GetMonData(&gEnemyParty[a], MON_DATA_SPEED); battlePokemon.spAttack = GetMonData(&gEnemyParty[a], MON_DATA_SPATK); battlePokemon.spDefense = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF); battlePokemon.isEgg = GetMonData(&gEnemyParty[a], MON_DATA_IS_EGG); @@ -637,9 +637,8 @@ u32 dp01_getattr_by_ch1_for_player_pokemon__(u8 a, u8 *buffer) GetMonData(&gEnemyParty[a], MON_DATA_NICKNAME, nickname); StringCopy10(battlePokemon.nickname, nickname); GetMonData(&gEnemyParty[a], MON_DATA_OT_NAME, battlePokemon.otName); - src = (u8 *)&battlePokemon; - for (size = 0; size < sizeof(battlePokemon); size++) - buffer[size] = src[size]; + + MEMCPY_ALT(&battlePokemon, buffer, sizeof(battlePokemon), size, src); break; case 1: data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPECIES); @@ -660,9 +659,7 @@ u32 dp01_getattr_by_ch1_for_player_pokemon__(u8 a, u8 *buffer) moveData.pp[size] = GetMonData(&gEnemyParty[a], MON_DATA_PP1 + size); } moveData.ppBonuses = GetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES); - src = (u8 *)&moveData; - for (size = 0; size < sizeof(moveData); size++) - buffer[size] = src[size]; + MEMCPY_ALT(&moveData, buffer, sizeof(moveData), size, src); break; case 4: case 5: @@ -713,7 +710,7 @@ u32 dp01_getattr_by_ch1_for_player_pokemon__(u8 a, u8 *buffer) size = 1; break; case 22: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPD_EV); + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPEED_EV); size = 1; break; case 23: @@ -752,7 +749,7 @@ u32 dp01_getattr_by_ch1_for_player_pokemon__(u8 a, u8 *buffer) buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_HP_IV); buffer[1] = GetMonData(&gEnemyParty[a], MON_DATA_ATK_IV); buffer[2] = GetMonData(&gEnemyParty[a], MON_DATA_DEF_IV); - buffer[3] = GetMonData(&gEnemyParty[a], MON_DATA_SPD_IV); + buffer[3] = GetMonData(&gEnemyParty[a], MON_DATA_SPEED_IV); buffer[4] = GetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV); buffer[5] = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV); size = 6; @@ -770,7 +767,7 @@ u32 dp01_getattr_by_ch1_for_player_pokemon__(u8 a, u8 *buffer) size = 1; break; case 35: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPD_IV); + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPEED_IV); size = 1; break; case 36: @@ -832,7 +829,7 @@ u32 dp01_getattr_by_ch1_for_player_pokemon__(u8 a, u8 *buffer) size = 2; break; case 46: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPD); + data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPEED); buffer[0] = data16; buffer[1] = data16 >> 8; size = 2; @@ -936,38 +933,38 @@ void sub_8038900(u8 a) { u8 iv; - SetMonData(&gEnemyParty[a], MON_DATA_SPECIES, (u8 *)&battlePokemon->species); - SetMonData(&gEnemyParty[a], MON_DATA_HELD_ITEM, (u8 *)&battlePokemon->item); + SetMonData(&gEnemyParty[a], MON_DATA_SPECIES, &battlePokemon->species); + SetMonData(&gEnemyParty[a], MON_DATA_HELD_ITEM, &battlePokemon->item); for (i = 0; i < 4; i++) { - SetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + i, (u8 *)&battlePokemon->moves[i]); - SetMonData(&gEnemyParty[a], MON_DATA_PP1 + i, (u8 *)&battlePokemon->pp[i]); + SetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]); + SetMonData(&gEnemyParty[a], MON_DATA_PP1 + i, &battlePokemon->pp[i]); } - SetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES, (u8 *)&battlePokemon->ppBonuses); - SetMonData(&gEnemyParty[a], MON_DATA_FRIENDSHIP, (u8 *)&battlePokemon->friendship); - SetMonData(&gEnemyParty[a], MON_DATA_EXP, (u8 *)&battlePokemon->experience); + SetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES, &battlePokemon->ppBonuses); + SetMonData(&gEnemyParty[a], MON_DATA_FRIENDSHIP, &battlePokemon->friendship); + SetMonData(&gEnemyParty[a], MON_DATA_EXP, &battlePokemon->experience); iv = battlePokemon->hpIV; - SetMonData(&gEnemyParty[a], MON_DATA_HP_IV, (u8 *)&iv); + SetMonData(&gEnemyParty[a], MON_DATA_HP_IV, &iv); iv = battlePokemon->attackIV; - SetMonData(&gEnemyParty[a], MON_DATA_ATK_IV, (u8 *)&iv); + SetMonData(&gEnemyParty[a], MON_DATA_ATK_IV, &iv); iv = battlePokemon->defenseIV; - SetMonData(&gEnemyParty[a], MON_DATA_DEF_IV, (u8 *)&iv); + SetMonData(&gEnemyParty[a], MON_DATA_DEF_IV, &iv); iv = battlePokemon->speedIV; - SetMonData(&gEnemyParty[a], MON_DATA_SPD_IV, (u8 *)&iv); + SetMonData(&gEnemyParty[a], MON_DATA_SPEED_IV, &iv); iv = battlePokemon->spAttackIV; - SetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV, (u8 *)&iv); + SetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV, &iv); iv = battlePokemon->spDefenseIV; - SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV, (u8 *)&iv); - SetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY, (u8 *)&battlePokemon->personality); - SetMonData(&gEnemyParty[a], MON_DATA_STATUS, (u8 *)&battlePokemon->status1); - SetMonData(&gEnemyParty[a], MON_DATA_LEVEL, (u8 *)&battlePokemon->level); - SetMonData(&gEnemyParty[a], MON_DATA_HP, (u8 *)&battlePokemon->hp); - SetMonData(&gEnemyParty[a], MON_DATA_MAX_HP, (u8 *)&battlePokemon->maxHP); - SetMonData(&gEnemyParty[a], MON_DATA_ATK, (u8 *)&battlePokemon->attack); - SetMonData(&gEnemyParty[a], MON_DATA_DEF, (u8 *)&battlePokemon->defense); - SetMonData(&gEnemyParty[a], MON_DATA_SPD, (u8 *)&battlePokemon->speed); - SetMonData(&gEnemyParty[a], MON_DATA_SPATK, (u8 *)&battlePokemon->spAttack); - SetMonData(&gEnemyParty[a], MON_DATA_SPDEF, (u8 *)&battlePokemon->spDefense); + SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV, &iv); + SetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY, &battlePokemon->personality); + SetMonData(&gEnemyParty[a], MON_DATA_STATUS, &battlePokemon->status1); + SetMonData(&gEnemyParty[a], MON_DATA_LEVEL, &battlePokemon->level); + SetMonData(&gEnemyParty[a], MON_DATA_HP, &battlePokemon->hp); + SetMonData(&gEnemyParty[a], MON_DATA_MAX_HP, &battlePokemon->maxHP); + SetMonData(&gEnemyParty[a], MON_DATA_ATK, &battlePokemon->attack); + SetMonData(&gEnemyParty[a], MON_DATA_DEF, &battlePokemon->defense); + SetMonData(&gEnemyParty[a], MON_DATA_SPEED, &battlePokemon->speed); + SetMonData(&gEnemyParty[a], MON_DATA_SPATK, &battlePokemon->spAttack); + SetMonData(&gEnemyParty[a], MON_DATA_SPDEF, &battlePokemon->spDefense); } break; case 1: @@ -979,8 +976,8 @@ void sub_8038900(u8 a) case 3: for (i = 0; i < 4; i++) { - SetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + i, (u8 *)&moveData->moves[i]); - SetMonData(&gEnemyParty[a], MON_DATA_PP1 + i, (u8 *)&moveData->pp[i]); + SetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + i, &moveData->moves[i]); + SetMonData(&gEnemyParty[a], MON_DATA_PP1 + i, &moveData->pp[i]); } SetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES, &moveData->ppBonuses); break; @@ -1019,7 +1016,7 @@ void sub_8038900(u8 a) SetMonData(&gEnemyParty[a], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBank][3]); break; case 22: - SetMonData(&gEnemyParty[a], MON_DATA_SPD_EV, &gBattleBufferA[gActiveBank][3]); + SetMonData(&gEnemyParty[a], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBank][3]); break; case 23: SetMonData(&gEnemyParty[a], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBank][3]); @@ -1049,7 +1046,7 @@ void sub_8038900(u8 a) SetMonData(&gEnemyParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); SetMonData(&gEnemyParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][4]); SetMonData(&gEnemyParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][5]); - SetMonData(&gEnemyParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][6]); + SetMonData(&gEnemyParty[a], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBank][6]); SetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][7]); SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][8]); break; @@ -1063,7 +1060,7 @@ void sub_8038900(u8 a) SetMonData(&gEnemyParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][3]); break; case 35: - SetMonData(&gEnemyParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][3]); + SetMonData(&gEnemyParty[a], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBank][3]); break; case 36: SetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][3]); @@ -1096,7 +1093,7 @@ void sub_8038900(u8 a) SetMonData(&gEnemyParty[a], MON_DATA_DEF, &gBattleBufferA[gActiveBank][3]); break; case 46: - SetMonData(&gEnemyParty[a], MON_DATA_SPD, &gBattleBufferA[gActiveBank][3]); + SetMonData(&gEnemyParty[a], MON_DATA_SPEED, &gBattleBufferA[gActiveBank][3]); break; case 47: SetMonData(&gEnemyParty[a], MON_DATA_SPATK, &gBattleBufferA[gActiveBank][3]); @@ -1145,9 +1142,9 @@ void LinkOpponentHandlecmd3(void) u8 *dst; u8 i; - dst = (u8 *)&gEnemyParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1]; - for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++) - dst[i] = gBattleBufferA[gActiveBank][3 + i]; + MEMSET_ALT(&gEnemyParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1], + gBattleBufferA[gActiveBank][3 + i], gBattleBufferA[gActiveBank][2], i, dst); + LinkOpponentBufferExecCompleted(); } @@ -1285,7 +1282,7 @@ void LinkOpponentHandleTrainerSlideBack(void) gSprites[gObjectBankIDs[gActiveBank]].data2 = 280; gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); + StoreSpriteCallbackInData6(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); gBattleBankFunc[gActiveBank] = sub_80375B4; } @@ -1636,7 +1633,7 @@ void LinkOpponentHandleTrainerBallThrow(void) gSprites[gObjectBankIDs[gActiveBank]].data2 = 280; gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], sub_803A3A8); + StoreSpriteCallbackInData6(&gSprites[gObjectBankIDs[gActiveBank]], sub_803A3A8); taskId = CreateTask(sub_803A2C4, 5); gTasks[taskId].data[0] = gActiveBank; if (ewram17810[gActiveBank].unk0_0) @@ -1733,7 +1730,7 @@ void LinkOpponentHandlecmd50(void) void LinkOpponentHandleSpriteInvisibility(void) { - if (sub_8078874(gActiveBank) != 0) + if (AnimBankSpriteExists(gActiveBank) != 0) { gSprites[gObjectBankIDs[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1]; sub_8031F88(gActiveBank); diff --git a/src/battle_controller_linkpartner.c b/src/battle/battle_controller_linkpartner.c index 95022eaaf..a874190aa 100644 --- a/src/battle_controller_linkpartner.c +++ b/src/battle/battle_controller_linkpartner.c @@ -66,7 +66,7 @@ extern u8 gAnimScriptActive; extern void (*gAnimScriptCallback)(void); extern u8 move_anim_start_t3(); -extern u8 sub_8078874(); +extern u8 AnimBankSpriteExists(); extern void sub_8044CA0(u8); extern void sub_8030E38(struct Sprite *); extern void sub_80E43C0(); @@ -82,7 +82,7 @@ extern void sub_80324BC(); extern u8 sub_8031720(); extern u8 mplay_80342A4(); extern void oamt_add_pos2_onto_pos1(); -extern void oamt_set_x3A_32(); +extern void StoreSpriteCallbackInData6(); extern void sub_8078B34(struct Sprite *); extern void sub_80105EC(struct Sprite *); extern s32 sub_803FC34(u16); @@ -574,7 +574,7 @@ u32 dp01_getattr_by_ch1_for_player_pokemon(u8 a, u8 *buffer) battlePokemon.hpIV = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); battlePokemon.attackIV = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); battlePokemon.defenseIV = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); - battlePokemon.speedIV = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); + battlePokemon.speedIV = GetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV); battlePokemon.spAttackIV = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); battlePokemon.spDefenseIV = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); battlePokemon.personality = GetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY); @@ -584,7 +584,7 @@ u32 dp01_getattr_by_ch1_for_player_pokemon(u8 a, u8 *buffer) battlePokemon.maxHP = GetMonData(&gPlayerParty[a], MON_DATA_MAX_HP); battlePokemon.attack = GetMonData(&gPlayerParty[a], MON_DATA_ATK); battlePokemon.defense = GetMonData(&gPlayerParty[a], MON_DATA_DEF); - battlePokemon.speed = GetMonData(&gPlayerParty[a], MON_DATA_SPD); + battlePokemon.speed = GetMonData(&gPlayerParty[a], MON_DATA_SPEED); battlePokemon.spAttack = GetMonData(&gPlayerParty[a], MON_DATA_SPATK); battlePokemon.spDefense = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF); battlePokemon.isEgg = GetMonData(&gPlayerParty[a], MON_DATA_IS_EGG); @@ -593,9 +593,7 @@ u32 dp01_getattr_by_ch1_for_player_pokemon(u8 a, u8 *buffer) GetMonData(&gPlayerParty[a], MON_DATA_NICKNAME, nickname); StringCopy10(battlePokemon.nickname, nickname); GetMonData(&gPlayerParty[a], MON_DATA_OT_NAME, battlePokemon.otName); - src = (u8 *)&battlePokemon; - for (size = 0; size < sizeof(battlePokemon); size++) - buffer[size] = src[size]; + MEMCPY_ALT(&battlePokemon, buffer, sizeof(battlePokemon), size, src); break; case 1: data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPECIES); @@ -616,9 +614,7 @@ u32 dp01_getattr_by_ch1_for_player_pokemon(u8 a, u8 *buffer) moveData.pp[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); } moveData.ppBonuses = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); - src = (u8 *)&moveData; - for (size = 0; size < sizeof(moveData); size++) - buffer[size] = src[size]; + MEMCPY_ALT(&moveData, buffer, sizeof(moveData), size, src); break; case 4: case 5: @@ -669,7 +665,7 @@ u32 dp01_getattr_by_ch1_for_player_pokemon(u8 a, u8 *buffer) size = 1; break; case 22: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_EV); + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPEED_EV); size = 1; break; case 23: @@ -708,7 +704,7 @@ u32 dp01_getattr_by_ch1_for_player_pokemon(u8 a, u8 *buffer) buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); buffer[1] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); buffer[2] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); - buffer[3] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); + buffer[3] = GetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV); buffer[4] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); buffer[5] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); size = 6; @@ -726,7 +722,7 @@ u32 dp01_getattr_by_ch1_for_player_pokemon(u8 a, u8 *buffer) size = 1; break; case 35: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV); size = 1; break; case 36: @@ -788,7 +784,7 @@ u32 dp01_getattr_by_ch1_for_player_pokemon(u8 a, u8 *buffer) size = 2; break; case 46: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPD); + data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPEED); buffer[0] = data16; buffer[1] = data16 >> 8; size = 2; @@ -893,38 +889,38 @@ void sub_811EC68(u8 a) { u8 iv; - SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, (u8 *)&battlePokemon->species); - SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, (u8 *)&battlePokemon->item); + SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, &battlePokemon->species); + SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, &battlePokemon->item); for (i = 0; i < 4; i++) { - SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, (u8 *)&battlePokemon->moves[i]); - SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, (u8 *)&battlePokemon->pp[i]); + SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]); + SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, &battlePokemon->pp[i]); } - SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, (u8 *)&battlePokemon->ppBonuses); - SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, (u8 *)&battlePokemon->friendship); - SetMonData(&gPlayerParty[a], MON_DATA_EXP, (u8 *)&battlePokemon->experience); + SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &battlePokemon->ppBonuses); + SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, &battlePokemon->friendship); + SetMonData(&gPlayerParty[a], MON_DATA_EXP, &battlePokemon->experience); iv = battlePokemon->hpIV; - SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, (u8 *)&iv); + SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &iv); iv = battlePokemon->attackIV; - SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, (u8 *)&iv); + SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &iv); iv = battlePokemon->defenseIV; - SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, (u8 *)&iv); + SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &iv); iv = battlePokemon->speedIV; - SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, (u8 *)&iv); + SetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV, &iv); iv = battlePokemon->spAttackIV; - SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, (u8 *)&iv); + SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &iv); iv = battlePokemon->spDefenseIV; - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, (u8 *)&iv); - SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, (u8 *)&battlePokemon->personality); - SetMonData(&gPlayerParty[a], MON_DATA_STATUS, (u8 *)&battlePokemon->status1); - SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, (u8 *)&battlePokemon->level); - SetMonData(&gPlayerParty[a], MON_DATA_HP, (u8 *)&battlePokemon->hp); - SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, (u8 *)&battlePokemon->maxHP); - SetMonData(&gPlayerParty[a], MON_DATA_ATK, (u8 *)&battlePokemon->attack); - SetMonData(&gPlayerParty[a], MON_DATA_DEF, (u8 *)&battlePokemon->defense); - SetMonData(&gPlayerParty[a], MON_DATA_SPD, (u8 *)&battlePokemon->speed); - SetMonData(&gPlayerParty[a], MON_DATA_SPATK, (u8 *)&battlePokemon->spAttack); - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, (u8 *)&battlePokemon->spDefense); + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &iv); + SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, &battlePokemon->personality); + SetMonData(&gPlayerParty[a], MON_DATA_STATUS, &battlePokemon->status1); + SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, &battlePokemon->level); + SetMonData(&gPlayerParty[a], MON_DATA_HP, &battlePokemon->hp); + SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, &battlePokemon->maxHP); + SetMonData(&gPlayerParty[a], MON_DATA_ATK, &battlePokemon->attack); + SetMonData(&gPlayerParty[a], MON_DATA_DEF, &battlePokemon->defense); + SetMonData(&gPlayerParty[a], MON_DATA_SPEED, &battlePokemon->speed); + SetMonData(&gPlayerParty[a], MON_DATA_SPATK, &battlePokemon->spAttack); + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, &battlePokemon->spDefense); } break; case 1: @@ -936,8 +932,8 @@ void sub_811EC68(u8 a) case 3: for (i = 0; i < 4; i++) { - SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, (u8 *)&moveData->moves[i]); - SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, (u8 *)&moveData->pp[i]); + SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, &moveData->moves[i]); + SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, &moveData->pp[i]); } SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &moveData->ppBonuses); break; @@ -976,7 +972,7 @@ void sub_811EC68(u8 a) SetMonData(&gPlayerParty[a], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBank][3]); break; case 22: - SetMonData(&gPlayerParty[a], MON_DATA_SPD_EV, &gBattleBufferA[gActiveBank][3]); + SetMonData(&gPlayerParty[a], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBank][3]); break; case 23: SetMonData(&gPlayerParty[a], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBank][3]); @@ -1006,7 +1002,7 @@ void sub_811EC68(u8 a) SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][4]); SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][5]); - SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][6]); + SetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBank][6]); SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][7]); SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][8]); break; @@ -1020,7 +1016,7 @@ void sub_811EC68(u8 a) SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][3]); break; case 35: - SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][3]); + SetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBank][3]); break; case 36: SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][3]); @@ -1053,7 +1049,7 @@ void sub_811EC68(u8 a) SetMonData(&gPlayerParty[a], MON_DATA_DEF, &gBattleBufferA[gActiveBank][3]); break; case 46: - SetMonData(&gPlayerParty[a], MON_DATA_SPD, &gBattleBufferA[gActiveBank][3]); + SetMonData(&gPlayerParty[a], MON_DATA_SPEED, &gBattleBufferA[gActiveBank][3]); break; case 47: SetMonData(&gPlayerParty[a], MON_DATA_SPATK, &gBattleBufferA[gActiveBank][3]); @@ -1103,9 +1099,9 @@ void LinkPartnerHandlecmd3(void) u8 *dst; u8 i; - dst = (u8 *)&gPlayerParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1]; - for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++) - dst[i] = gBattleBufferA[gActiveBank][3 + i]; + MEMSET_ALT(&gPlayerParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1], + gBattleBufferA[gActiveBank][3 + i], gBattleBufferA[gActiveBank][2], i, dst); + LinkPartnerBufferExecCompleted(); } @@ -1239,7 +1235,7 @@ void LinkPartnerHandleTrainerSlideBack(void) gSprites[gObjectBankIDs[gActiveBank]].data2 = -40; gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); + StoreSpriteCallbackInData6(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); gBattleBankFunc[gActiveBank] = sub_811DB1C; } @@ -1592,7 +1588,7 @@ void LinkPartnerHandleTrainerBallThrow(void) gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; gSprites[gObjectBankIDs[gActiveBank]].data5 = gActiveBank; - oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38); + StoreSpriteCallbackInData6(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38); StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1); r4 = AllocSpritePalette(0xD6F9); LoadCompressedPalette( @@ -1682,7 +1678,7 @@ void LinkPartnerHandlecmd50(void) void LinkPartnerHandleSpriteInvisibility(void) { - if (sub_8078874(gActiveBank) != 0) + if (AnimBankSpriteExists(gActiveBank) != 0) { gSprites[gObjectBankIDs[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1]; sub_8031F88(gActiveBank); diff --git a/src/battle_controller_opponent.c b/src/battle/battle_controller_opponent.c index dd8c62cce..392e80f08 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle/battle_controller_opponent.c @@ -4,6 +4,7 @@ #include "data2.h" #include "battle_811DA74.h" #include "battle_anim_813F0F4.h" +#include "battle_tower.h" #include "link.h" #include "m4a.h" #include "main.h" @@ -76,7 +77,6 @@ extern u8 sub_8046400(); extern void sub_8032A08(); extern void sub_8043DB0(); extern void sub_8033160(void); -extern u8 sub_8135FBC(void); extern u8 get_trainer_class_pic_index(void); extern void sub_80313A0(struct Sprite *); extern void sub_8032B4C(void); @@ -85,7 +85,7 @@ extern void sub_8032B84(void); extern void sub_8078B34(struct Sprite *); extern void sub_8032BBC(void); extern void oamt_add_pos2_onto_pos1(); -extern void oamt_set_x3A_32(); +extern void StoreSpriteCallbackInData6(); extern void sub_803311C(void); extern void sub_8010384(struct Sprite *); extern bool8 mplay_80342A4(u8); @@ -113,7 +113,7 @@ extern void nullsub_45(void); extern void sub_8031B74(); extern bool8 IsDoubleBattle(void); extern void sub_8032E2C(void); -extern u8 sub_8078874(); +extern u8 AnimBankSpriteExists(); extern u8 move_anim_start_t3(); extern void sub_80334C0(void); @@ -582,7 +582,7 @@ u32 sub_8033598(u8 a, u8 *buffer) battlePokemon.hpIV = GetMonData(&gEnemyParty[a], MON_DATA_HP_IV); battlePokemon.attackIV = GetMonData(&gEnemyParty[a], MON_DATA_ATK_IV); battlePokemon.defenseIV = GetMonData(&gEnemyParty[a], MON_DATA_DEF_IV); - battlePokemon.speedIV = GetMonData(&gEnemyParty[a], MON_DATA_SPD_IV); + battlePokemon.speedIV = GetMonData(&gEnemyParty[a], MON_DATA_SPEED_IV); battlePokemon.spAttackIV = GetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV); battlePokemon.spDefenseIV = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV); battlePokemon.personality = GetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY); @@ -592,7 +592,7 @@ u32 sub_8033598(u8 a, u8 *buffer) battlePokemon.maxHP = GetMonData(&gEnemyParty[a], MON_DATA_MAX_HP); battlePokemon.attack = GetMonData(&gEnemyParty[a], MON_DATA_ATK); battlePokemon.defense = GetMonData(&gEnemyParty[a], MON_DATA_DEF); - battlePokemon.speed = GetMonData(&gEnemyParty[a], MON_DATA_SPD); + battlePokemon.speed = GetMonData(&gEnemyParty[a], MON_DATA_SPEED); battlePokemon.spAttack = GetMonData(&gEnemyParty[a], MON_DATA_SPATK); battlePokemon.spDefense = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF); battlePokemon.isEgg = GetMonData(&gEnemyParty[a], MON_DATA_IS_EGG); @@ -601,9 +601,7 @@ u32 sub_8033598(u8 a, u8 *buffer) GetMonData(&gEnemyParty[a], MON_DATA_NICKNAME, nickname); StringCopy10(battlePokemon.nickname, nickname); GetMonData(&gEnemyParty[a], MON_DATA_OT_NAME, battlePokemon.otName); - src = (u8 *)&battlePokemon; - for (size = 0; size < sizeof(battlePokemon); size++) - buffer[size] = src[size]; + MEMCPY_ALT(&battlePokemon, buffer, sizeof(battlePokemon), size, src); break; case 1: data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPECIES); @@ -624,9 +622,7 @@ u32 sub_8033598(u8 a, u8 *buffer) moveData.pp[size] = GetMonData(&gEnemyParty[a], MON_DATA_PP1 + size); } moveData.ppBonuses = GetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES); - src = (u8 *)&moveData; - for (size = 0; size < sizeof(moveData); size++) - buffer[size] = src[size]; + MEMCPY_ALT(&moveData, buffer, sizeof(moveData), size, src); break; case 4: case 5: @@ -677,7 +673,7 @@ u32 sub_8033598(u8 a, u8 *buffer) size = 1; break; case 22: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPD_EV); + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPEED_EV); size = 1; break; case 23: @@ -716,7 +712,7 @@ u32 sub_8033598(u8 a, u8 *buffer) buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_HP_IV); buffer[1] = GetMonData(&gEnemyParty[a], MON_DATA_ATK_IV); buffer[2] = GetMonData(&gEnemyParty[a], MON_DATA_DEF_IV); - buffer[3] = GetMonData(&gEnemyParty[a], MON_DATA_SPD_IV); + buffer[3] = GetMonData(&gEnemyParty[a], MON_DATA_SPEED_IV); buffer[4] = GetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV); buffer[5] = GetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV); size = 6; @@ -734,7 +730,7 @@ u32 sub_8033598(u8 a, u8 *buffer) size = 1; break; case 35: - buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPD_IV); + buffer[0] = GetMonData(&gEnemyParty[a], MON_DATA_SPEED_IV); size = 1; break; case 36: @@ -796,7 +792,7 @@ u32 sub_8033598(u8 a, u8 *buffer) size = 2; break; case 46: - data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPD); + data16 = GetMonData(&gEnemyParty[a], MON_DATA_SPEED); buffer[0] = data16; buffer[1] = data16 >> 8; size = 2; @@ -864,12 +860,12 @@ u32 sub_8033598(u8 a, u8 *buffer) void OpponentHandlecmd1(void) { struct BattlePokemon buffer; - u8 *src = (u8 *)&gEnemyParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1]; - u8 *dst = (u8 *)&buffer + gBattleBufferA[gActiveBank][1]; u8 i; + // TODO: Maybe fix this. Integrating this into MEMSET_ALT is too hard. + u8 *src = (u8 *)&gEnemyParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1]; + u8 *dst; - for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++) - dst[i] = src[i]; + MEMSET_ALT(&buffer + gBattleBufferA[gActiveBank][1], src[i], gBattleBufferA[gActiveBank][2], i, dst); Emitcmd29(1, gBattleBufferA[gActiveBank][2], dst); OpponentBufferExecCompleted(); } @@ -908,38 +904,38 @@ void sub_8033E24(u8 a) { u8 iv; - SetMonData(&gEnemyParty[a], MON_DATA_SPECIES, (u8 *)&battlePokemon->species); - SetMonData(&gEnemyParty[a], MON_DATA_HELD_ITEM, (u8 *)&battlePokemon->item); + SetMonData(&gEnemyParty[a], MON_DATA_SPECIES, &battlePokemon->species); + SetMonData(&gEnemyParty[a], MON_DATA_HELD_ITEM, &battlePokemon->item); for (i = 0; i < 4; i++) { - SetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + i, (u8 *)&battlePokemon->moves[i]); - SetMonData(&gEnemyParty[a], MON_DATA_PP1 + i, (u8 *)&battlePokemon->pp[i]); + SetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]); + SetMonData(&gEnemyParty[a], MON_DATA_PP1 + i, &battlePokemon->pp[i]); } - SetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES, (u8 *)&battlePokemon->ppBonuses); - SetMonData(&gEnemyParty[a], MON_DATA_FRIENDSHIP, (u8 *)&battlePokemon->friendship); - SetMonData(&gEnemyParty[a], MON_DATA_EXP, (u8 *)&battlePokemon->experience); + SetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES, &battlePokemon->ppBonuses); + SetMonData(&gEnemyParty[a], MON_DATA_FRIENDSHIP, &battlePokemon->friendship); + SetMonData(&gEnemyParty[a], MON_DATA_EXP, &battlePokemon->experience); iv = battlePokemon->hpIV; - SetMonData(&gEnemyParty[a], MON_DATA_HP_IV, (u8 *)&iv); + SetMonData(&gEnemyParty[a], MON_DATA_HP_IV, &iv); iv = battlePokemon->attackIV; - SetMonData(&gEnemyParty[a], MON_DATA_ATK_IV, (u8 *)&iv); + SetMonData(&gEnemyParty[a], MON_DATA_ATK_IV, &iv); iv = battlePokemon->defenseIV; - SetMonData(&gEnemyParty[a], MON_DATA_DEF_IV, (u8 *)&iv); + SetMonData(&gEnemyParty[a], MON_DATA_DEF_IV, &iv); iv = battlePokemon->speedIV; - SetMonData(&gEnemyParty[a], MON_DATA_SPD_IV, (u8 *)&iv); + SetMonData(&gEnemyParty[a], MON_DATA_SPEED_IV, &iv); iv = battlePokemon->spAttackIV; - SetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV, (u8 *)&iv); + SetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV, &iv); iv = battlePokemon->spDefenseIV; - SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV, (u8 *)&iv); - SetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY, (u8 *)&battlePokemon->personality); - SetMonData(&gEnemyParty[a], MON_DATA_STATUS, (u8 *)&battlePokemon->status1); - SetMonData(&gEnemyParty[a], MON_DATA_LEVEL, (u8 *)&battlePokemon->level); - SetMonData(&gEnemyParty[a], MON_DATA_HP, (u8 *)&battlePokemon->hp); - SetMonData(&gEnemyParty[a], MON_DATA_MAX_HP, (u8 *)&battlePokemon->maxHP); - SetMonData(&gEnemyParty[a], MON_DATA_ATK, (u8 *)&battlePokemon->attack); - SetMonData(&gEnemyParty[a], MON_DATA_DEF, (u8 *)&battlePokemon->defense); - SetMonData(&gEnemyParty[a], MON_DATA_SPD, (u8 *)&battlePokemon->speed); - SetMonData(&gEnemyParty[a], MON_DATA_SPATK, (u8 *)&battlePokemon->spAttack); - SetMonData(&gEnemyParty[a], MON_DATA_SPDEF, (u8 *)&battlePokemon->spDefense); + SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV, &iv); + SetMonData(&gEnemyParty[a], MON_DATA_PERSONALITY, &battlePokemon->personality); + SetMonData(&gEnemyParty[a], MON_DATA_STATUS, &battlePokemon->status1); + SetMonData(&gEnemyParty[a], MON_DATA_LEVEL, &battlePokemon->level); + SetMonData(&gEnemyParty[a], MON_DATA_HP, &battlePokemon->hp); + SetMonData(&gEnemyParty[a], MON_DATA_MAX_HP, &battlePokemon->maxHP); + SetMonData(&gEnemyParty[a], MON_DATA_ATK, &battlePokemon->attack); + SetMonData(&gEnemyParty[a], MON_DATA_DEF, &battlePokemon->defense); + SetMonData(&gEnemyParty[a], MON_DATA_SPEED, &battlePokemon->speed); + SetMonData(&gEnemyParty[a], MON_DATA_SPATK, &battlePokemon->spAttack); + SetMonData(&gEnemyParty[a], MON_DATA_SPDEF, &battlePokemon->spDefense); } break; case 1: @@ -951,8 +947,8 @@ void sub_8033E24(u8 a) case 3: for (i = 0; i < 4; i++) { - SetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + i, (u8 *)&moveData->moves[i]); - SetMonData(&gEnemyParty[a], MON_DATA_PP1 + i, (u8 *)&moveData->pp[i]); + SetMonData(&gEnemyParty[a], MON_DATA_MOVE1 + i, &moveData->moves[i]); + SetMonData(&gEnemyParty[a], MON_DATA_PP1 + i, &moveData->pp[i]); } SetMonData(&gEnemyParty[a], MON_DATA_PP_BONUSES, &moveData->ppBonuses); break; @@ -991,7 +987,7 @@ void sub_8033E24(u8 a) SetMonData(&gEnemyParty[a], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBank][3]); break; case 22: - SetMonData(&gEnemyParty[a], MON_DATA_SPD_EV, &gBattleBufferA[gActiveBank][3]); + SetMonData(&gEnemyParty[a], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBank][3]); break; case 23: SetMonData(&gEnemyParty[a], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBank][3]); @@ -1021,7 +1017,7 @@ void sub_8033E24(u8 a) SetMonData(&gEnemyParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); SetMonData(&gEnemyParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][4]); SetMonData(&gEnemyParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][5]); - SetMonData(&gEnemyParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][6]); + SetMonData(&gEnemyParty[a], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBank][6]); SetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][7]); SetMonData(&gEnemyParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][8]); break; @@ -1035,7 +1031,7 @@ void sub_8033E24(u8 a) SetMonData(&gEnemyParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][3]); break; case 35: - SetMonData(&gEnemyParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][3]); + SetMonData(&gEnemyParty[a], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBank][3]); break; case 36: SetMonData(&gEnemyParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][3]); @@ -1068,7 +1064,7 @@ void sub_8033E24(u8 a) SetMonData(&gEnemyParty[a], MON_DATA_DEF, &gBattleBufferA[gActiveBank][3]); break; case 46: - SetMonData(&gEnemyParty[a], MON_DATA_SPD, &gBattleBufferA[gActiveBank][3]); + SetMonData(&gEnemyParty[a], MON_DATA_SPEED, &gBattleBufferA[gActiveBank][3]); break; case 47: SetMonData(&gEnemyParty[a], MON_DATA_SPATK, &gBattleBufferA[gActiveBank][3]); @@ -1117,9 +1113,8 @@ void OpponentHandlecmd3(void) u8 *dst; u8 i; - dst = (u8 *)&gEnemyParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1]; - for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++) - dst[i] = gBattleBufferA[gActiveBank][3 + i]; + MEMSET_ALT(&gEnemyParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1], gBattleBufferA[gActiveBank][3 + i], + gBattleBufferA[gActiveBank][2], i, dst); OpponentBufferExecCompleted(); } @@ -1222,7 +1217,7 @@ void OpponentHandleTrainerThrow(void) else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) trainerPicIndex = get_trainer_class_pic_index(); else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) - trainerPicIndex = sub_8135FBC(); + trainerPicIndex = GetEReaderTrainerPicIndex(); else trainerPicIndex = gTrainers[gTrainerBattleOpponent].trainerPic; @@ -1252,7 +1247,7 @@ void OpponentHandleTrainerSlide(void) else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) trainerPicIndex = get_trainer_class_pic_index(); else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) - trainerPicIndex = sub_8135FBC(); + trainerPicIndex = GetEReaderTrainerPicIndex(); else trainerPicIndex = gTrainers[gTrainerBattleOpponent].trainerPic; @@ -1281,7 +1276,7 @@ void OpponentHandleTrainerSlideBack(void) gSprites[gObjectBankIDs[gActiveBank]].data2 = 280; gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); + StoreSpriteCallbackInData6(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); gBattleBankFunc[gActiveBank] = sub_8032BBC; } @@ -1910,7 +1905,7 @@ void OpponentHandleTrainerBallThrow(void) gSprites[gObjectBankIDs[gActiveBank]].data2 = 280; gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], sub_8035C10); + StoreSpriteCallbackInData6(&gSprites[gObjectBankIDs[gActiveBank]], sub_8035C10); taskId = CreateTask(sub_8035C44, 5); gTasks[taskId].data[0] = gActiveBank; if (ewram17810[gActiveBank].unk0_0) @@ -2007,7 +2002,7 @@ void OpponentHandlecmd50(void) void OpponentHandleSpriteInvisibility(void) { - if (sub_8078874(gActiveBank) != 0) + if (AnimBankSpriteExists(gActiveBank) != 0) { gSprites[gObjectBankIDs[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1]; sub_8031F88(gActiveBank); diff --git a/src/battle_controller_player.c b/src/battle/battle_controller_player.c index 5cfdeefbe..136c31841 100644 --- a/src/battle_controller_player.c +++ b/src/battle/battle_controller_player.c @@ -101,11 +101,11 @@ extern u8 GetBankSide(u8); extern void sub_80E43C0(); extern void oamt_add_pos2_onto_pos1(); extern void sub_8078B34(struct Sprite *); -extern void oamt_set_x3A_32(); +extern void StoreSpriteCallbackInData6(); extern void BattleLoadPlayerMonSprite(); extern bool8 IsDoubleBattle(void); extern void sub_802D500(void); -extern bool8 sub_8078874(u8); +extern bool8 AnimBankSpriteExists(u8); extern bool8 move_anim_start_t3(); extern void sub_802E460(void); extern void b_link_standby_message(void); @@ -841,7 +841,7 @@ void sub_802CA60(void) for (i = 0; i < 4; i++) { - SetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1 + i, (u8 *)&sp0.moves[i]); + SetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1 + i, &sp0.moves[i]); SetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_PP1 + i, &sp0.pp[i]); } SetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_PP_BONUSES, &totalPPBonuses); @@ -1149,7 +1149,7 @@ void sub_802D924(u8 taskId) { u8 savedActiveBank; - SetMonData(pkmn, MON_DATA_EXP, (u8 *)&nextLvlExp); + SetMonData(pkmn, MON_DATA_EXP, &nextLvlExp); CalculateMonStats(pkmn); gainedExp -= nextLvlExp - currExp; savedActiveBank = gActiveBank; @@ -1166,7 +1166,7 @@ void sub_802D924(u8 taskId) else { currExp += gainedExp; - SetMonData(pkmn, MON_DATA_EXP, (u8 *)&currExp); + SetMonData(pkmn, MON_DATA_EXP, &currExp); gBattleBankFunc[bank] = sub_802D90C; DestroyTask(taskId); } @@ -1231,7 +1231,7 @@ void sub_802DB6C(u8 taskId) u8 r5; u32 asdf; - SetMonData(pkmn, MON_DATA_EXP, (u8 *)&sp0); + SetMonData(pkmn, MON_DATA_EXP, &sp0); CalculateMonStats(pkmn); //r10 -= sp0 - sp4; asdf = sp0 - sp4; @@ -1247,7 +1247,7 @@ void sub_802DB6C(u8 taskId) { //u32 asdf = sp4 + r10; sp4 += r10; - SetMonData(pkmn, MON_DATA_EXP, (u8 *)&sp4); + SetMonData(pkmn, MON_DATA_EXP, &sp4); gBattleBankFunc[r7] = sub_802D90C; DestroyTask(taskId); } @@ -1754,7 +1754,7 @@ u32 dp01_getattr_by_ch1_for_player_pokemon_(u8 a, u8 *buffer) battlePokemon.hpIV = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); battlePokemon.attackIV = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); battlePokemon.defenseIV = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); - battlePokemon.speedIV = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); + battlePokemon.speedIV = GetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV); battlePokemon.spAttackIV = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); battlePokemon.spDefenseIV = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); battlePokemon.personality = GetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY); @@ -1764,7 +1764,7 @@ u32 dp01_getattr_by_ch1_for_player_pokemon_(u8 a, u8 *buffer) battlePokemon.maxHP = GetMonData(&gPlayerParty[a], MON_DATA_MAX_HP); battlePokemon.attack = GetMonData(&gPlayerParty[a], MON_DATA_ATK); battlePokemon.defense = GetMonData(&gPlayerParty[a], MON_DATA_DEF); - battlePokemon.speed = GetMonData(&gPlayerParty[a], MON_DATA_SPD); + battlePokemon.speed = GetMonData(&gPlayerParty[a], MON_DATA_SPEED); battlePokemon.spAttack = GetMonData(&gPlayerParty[a], MON_DATA_SPATK); battlePokemon.spDefense = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF); battlePokemon.isEgg = GetMonData(&gPlayerParty[a], MON_DATA_IS_EGG); @@ -1773,9 +1773,7 @@ u32 dp01_getattr_by_ch1_for_player_pokemon_(u8 a, u8 *buffer) GetMonData(&gPlayerParty[a], MON_DATA_NICKNAME, nickname); StringCopy10(battlePokemon.nickname, nickname); GetMonData(&gPlayerParty[a], MON_DATA_OT_NAME, battlePokemon.otName); - src = (u8 *)&battlePokemon; - for (size = 0; size < sizeof(battlePokemon); size++) - buffer[size] = src[size]; + MEMCPY_ALT(&battlePokemon, buffer, sizeof(battlePokemon), size, src); break; case 1: data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPECIES); @@ -1796,9 +1794,7 @@ u32 dp01_getattr_by_ch1_for_player_pokemon_(u8 a, u8 *buffer) moveData.pp[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); } moveData.ppBonuses = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); - src = (u8 *)&moveData; - for (size = 0; size < sizeof(moveData); size++) - buffer[size] = src[size]; + MEMCPY_ALT(&moveData, buffer, sizeof(moveData), size, src); break; case 4: case 5: @@ -1849,7 +1845,7 @@ u32 dp01_getattr_by_ch1_for_player_pokemon_(u8 a, u8 *buffer) size = 1; break; case 22: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_EV); + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPEED_EV); size = 1; break; case 23: @@ -1888,7 +1884,7 @@ u32 dp01_getattr_by_ch1_for_player_pokemon_(u8 a, u8 *buffer) buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); buffer[1] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); buffer[2] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); - buffer[3] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); + buffer[3] = GetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV); buffer[4] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); buffer[5] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); size = 6; @@ -1906,7 +1902,7 @@ u32 dp01_getattr_by_ch1_for_player_pokemon_(u8 a, u8 *buffer) size = 1; break; case 35: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV); size = 1; break; case 36: @@ -1968,7 +1964,7 @@ u32 dp01_getattr_by_ch1_for_player_pokemon_(u8 a, u8 *buffer) size = 2; break; case 46: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPD); + data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPEED); buffer[0] = data16; buffer[1] = data16 >> 8; size = 2; @@ -2035,13 +2031,13 @@ u32 dp01_getattr_by_ch1_for_player_pokemon_(u8 a, u8 *buffer) void PlayerHandlecmd1(void) { - struct BattlePokemon battleMon; // I think this is a BattlePokemon - u8 *src = (u8 *)&gPlayerParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1]; - u8 *dst = (u8 *)&battleMon + gBattleBufferA[gActiveBank][1]; + struct BattlePokemon battleMon; u8 i; + // TODO: Maybe fix this. Integrating this into MEMSET_ALT is too hard. + u8 *src = (u8 *)&gPlayerParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1]; + u8 *dst; - for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++) - dst[i] = src[i]; + MEMSET_ALT(&battleMon + gBattleBufferA[gActiveBank][1], src[i], gBattleBufferA[gActiveBank][2], i, dst); Emitcmd29(1, gBattleBufferA[gActiveBank][2], dst); PlayerBufferExecCompleted(); } @@ -2081,38 +2077,38 @@ void dp01_setattr_by_ch1_for_player_pokemon(u8 a) { u8 iv; - SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, (u8 *)&battlePokemon->species); - SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, (u8 *)&battlePokemon->item); + SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, &battlePokemon->species); + SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, &battlePokemon->item); for (i = 0; i < 4; i++) { - SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, (u8 *)&battlePokemon->moves[i]); - SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, (u8 *)&battlePokemon->pp[i]); + SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]); + SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, &battlePokemon->pp[i]); } - SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, (u8 *)&battlePokemon->ppBonuses); - SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, (u8 *)&battlePokemon->friendship); - SetMonData(&gPlayerParty[a], MON_DATA_EXP, (u8 *)&battlePokemon->experience); + SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &battlePokemon->ppBonuses); + SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, &battlePokemon->friendship); + SetMonData(&gPlayerParty[a], MON_DATA_EXP, &battlePokemon->experience); iv = battlePokemon->hpIV; - SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, (u8 *)&iv); + SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &iv); iv = battlePokemon->attackIV; - SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, (u8 *)&iv); + SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &iv); iv = battlePokemon->defenseIV; - SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, (u8 *)&iv); + SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &iv); iv = battlePokemon->speedIV; - SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, (u8 *)&iv); + SetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV, &iv); iv = battlePokemon->spAttackIV; - SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, (u8 *)&iv); + SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &iv); iv = battlePokemon->spDefenseIV; - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, (u8 *)&iv); - SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, (u8 *)&battlePokemon->personality); - SetMonData(&gPlayerParty[a], MON_DATA_STATUS, (u8 *)&battlePokemon->status1); - SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, (u8 *)&battlePokemon->level); - SetMonData(&gPlayerParty[a], MON_DATA_HP, (u8 *)&battlePokemon->hp); - SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, (u8 *)&battlePokemon->maxHP); - SetMonData(&gPlayerParty[a], MON_DATA_ATK, (u8 *)&battlePokemon->attack); - SetMonData(&gPlayerParty[a], MON_DATA_DEF, (u8 *)&battlePokemon->defense); - SetMonData(&gPlayerParty[a], MON_DATA_SPD, (u8 *)&battlePokemon->speed); - SetMonData(&gPlayerParty[a], MON_DATA_SPATK, (u8 *)&battlePokemon->spAttack); - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, (u8 *)&battlePokemon->spDefense); + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &iv); + SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, &battlePokemon->personality); + SetMonData(&gPlayerParty[a], MON_DATA_STATUS, &battlePokemon->status1); + SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, &battlePokemon->level); + SetMonData(&gPlayerParty[a], MON_DATA_HP, &battlePokemon->hp); + SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, &battlePokemon->maxHP); + SetMonData(&gPlayerParty[a], MON_DATA_ATK, &battlePokemon->attack); + SetMonData(&gPlayerParty[a], MON_DATA_DEF, &battlePokemon->defense); + SetMonData(&gPlayerParty[a], MON_DATA_SPEED, &battlePokemon->speed); + SetMonData(&gPlayerParty[a], MON_DATA_SPATK, &battlePokemon->spAttack); + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, &battlePokemon->spDefense); } break; case 1: @@ -2124,8 +2120,8 @@ void dp01_setattr_by_ch1_for_player_pokemon(u8 a) case 3: for (i = 0; i < 4; i++) { - SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, (u8 *)&moveData->moves[i]); - SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, (u8 *)&moveData->pp[i]); + SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, &moveData->moves[i]); + SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, &moveData->pp[i]); } SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &moveData->ppBonuses); break; @@ -2164,7 +2160,7 @@ void dp01_setattr_by_ch1_for_player_pokemon(u8 a) SetMonData(&gPlayerParty[a], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBank][3]); break; case 22: - SetMonData(&gPlayerParty[a], MON_DATA_SPD_EV, &gBattleBufferA[gActiveBank][3]); + SetMonData(&gPlayerParty[a], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBank][3]); break; case 23: SetMonData(&gPlayerParty[a], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBank][3]); @@ -2194,7 +2190,7 @@ void dp01_setattr_by_ch1_for_player_pokemon(u8 a) SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][4]); SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][5]); - SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][6]); + SetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBank][6]); SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][7]); SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][8]); break; @@ -2208,7 +2204,7 @@ void dp01_setattr_by_ch1_for_player_pokemon(u8 a) SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][3]); break; case 35: - SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][3]); + SetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBank][3]); break; case 36: SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][3]); @@ -2241,7 +2237,7 @@ void dp01_setattr_by_ch1_for_player_pokemon(u8 a) SetMonData(&gPlayerParty[a], MON_DATA_DEF, &gBattleBufferA[gActiveBank][3]); break; case 46: - SetMonData(&gPlayerParty[a], MON_DATA_SPD, &gBattleBufferA[gActiveBank][3]); + SetMonData(&gPlayerParty[a], MON_DATA_SPEED, &gBattleBufferA[gActiveBank][3]); break; case 47: SetMonData(&gPlayerParty[a], MON_DATA_SPATK, &gBattleBufferA[gActiveBank][3]); @@ -2288,11 +2284,11 @@ void dp01_setattr_by_ch1_for_player_pokemon(u8 a) void PlayerHandlecmd3(void) { - u8 *dst = (u8 *)&gPlayerParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1]; u8 i; + u8 *dst; - for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++) - dst[i] = gBattleBufferA[gActiveBank][3 + i]; + MEMSET_ALT(&gPlayerParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1], gBattleBufferA[gActiveBank][3 + i], + gBattleBufferA[gActiveBank][2], i, dst); PlayerBufferExecCompleted(); } @@ -2425,7 +2421,7 @@ void PlayerHandleTrainerSlideBack(void) gSprites[gObjectBankIDs[gActiveBank]].data2 = -40; gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; - oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); + StoreSpriteCallbackInData6(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1); gBattleBankFunc[gActiveBank] = sub_802D274; } @@ -2599,7 +2595,7 @@ void PlayerHandlecmd18(void) sub_802E3E4(gActionSelectionCursor[gActiveBank], 0); - StrCpyDecodeToDisplayedStringBattle((u8 *) gUnknown_08400CA8); + StrCpyDecodeToDisplayedStringBattle(gUnknown_08400CA8); InitWindow(&gUnknown_03004210, gDisplayedStringBattle, SUB_803037C_TILE_DATA_OFFSET, 2, 35); sub_8002F44(&gUnknown_03004210); } @@ -2896,7 +2892,7 @@ void PlayerHandleTrainerBallThrow(void) gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; gSprites[gObjectBankIDs[gActiveBank]].data5 = gActiveBank; - oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38); + StoreSpriteCallbackInData6(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38); StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1); paletteNum = AllocSpritePalette(0xD6F8); LoadCompressedPalette(gTrainerBackPicPaletteTable[gSaveBlock2.playerGender].data, 0x100 + paletteNum * 16, 32); @@ -2994,7 +2990,7 @@ void PlayerHandlecmd50(void) void PlayerHandleSpriteInvisibility(void) { - if (sub_8078874(gActiveBank)) + if (AnimBankSpriteExists(gActiveBank)) { gSprites[gObjectBankIDs[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1]; sub_8031F88(gActiveBank); diff --git a/src/battle_controller_safari.c b/src/battle/battle_controller_safari.c index e05578c31..2fcdf7548 100644 --- a/src/battle_controller_safari.c +++ b/src/battle/battle_controller_safari.c @@ -483,7 +483,7 @@ void SafariHandlecmd18(void) nullsub_8(i); sub_802E3E4(gActionSelectionCursor[gActiveBank], 0); - StrCpyDecodeToDisplayedStringBattle((u8 *) gUnknown_08400CBB); + StrCpyDecodeToDisplayedStringBattle(gUnknown_08400CBB); InitWindow(&gUnknown_03004210, gDisplayedStringBattle, SUB_812BB10_TILE_DATA_OFFSET, 2, 35); sub_8002F44(&gUnknown_03004210); diff --git a/src/battle_controller_wally.c b/src/battle/battle_controller_wally.c index f2cf5bbb4..9d70ca557 100644 --- a/src/battle_controller_wally.c +++ b/src/battle/battle_controller_wally.c @@ -89,7 +89,7 @@ extern void sub_80E43C0(); extern void oamt_add_pos2_onto_pos1(); extern void sub_8078B34(struct Sprite *); extern void sub_8030E38(struct Sprite *); -extern void oamt_set_x3A_32(); +extern void StoreSpriteCallbackInData6(); extern u8 sub_8046400(); extern u8 sub_8077ABC(); extern u8 sub_8077F68(); @@ -550,7 +550,7 @@ u32 sub_8137A84(u8 a, u8 *buffer) battlePokemon.hpIV = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); battlePokemon.attackIV = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); battlePokemon.defenseIV = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); - battlePokemon.speedIV = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); + battlePokemon.speedIV = GetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV); battlePokemon.spAttackIV = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); battlePokemon.spDefenseIV = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); battlePokemon.personality = GetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY); @@ -560,7 +560,7 @@ u32 sub_8137A84(u8 a, u8 *buffer) battlePokemon.maxHP = GetMonData(&gPlayerParty[a], MON_DATA_MAX_HP); battlePokemon.attack = GetMonData(&gPlayerParty[a], MON_DATA_ATK); battlePokemon.defense = GetMonData(&gPlayerParty[a], MON_DATA_DEF); - battlePokemon.speed = GetMonData(&gPlayerParty[a], MON_DATA_SPD); + battlePokemon.speed = GetMonData(&gPlayerParty[a], MON_DATA_SPEED); battlePokemon.spAttack = GetMonData(&gPlayerParty[a], MON_DATA_SPATK); battlePokemon.spDefense = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF); battlePokemon.isEgg = GetMonData(&gPlayerParty[a], MON_DATA_IS_EGG); @@ -569,9 +569,7 @@ u32 sub_8137A84(u8 a, u8 *buffer) GetMonData(&gPlayerParty[a], MON_DATA_NICKNAME, nickname); StringCopy10(battlePokemon.nickname, nickname); GetMonData(&gPlayerParty[a], MON_DATA_OT_NAME, battlePokemon.otName); - src = (u8 *)&battlePokemon; - for (size = 0; size < sizeof(battlePokemon); size++) - buffer[size] = src[size]; + MEMCPY_ALT(&battlePokemon, buffer, sizeof(battlePokemon), size, src); break; case 1: data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPECIES); @@ -592,9 +590,7 @@ u32 sub_8137A84(u8 a, u8 *buffer) moveData.pp[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); } moveData.ppBonuses = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); - src = (u8 *)&moveData; - for (size = 0; size < sizeof(moveData); size++) - buffer[size] = src[size]; + MEMCPY_ALT(&moveData, buffer, sizeof(moveData), size, src); break; case 4: case 5: @@ -645,7 +641,7 @@ u32 sub_8137A84(u8 a, u8 *buffer) size = 1; break; case 22: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_EV); + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPEED_EV); size = 1; break; case 23: @@ -684,7 +680,7 @@ u32 sub_8137A84(u8 a, u8 *buffer) buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); buffer[1] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); buffer[2] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); - buffer[3] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); + buffer[3] = GetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV); buffer[4] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); buffer[5] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); size = 6; @@ -702,7 +698,7 @@ u32 sub_8137A84(u8 a, u8 *buffer) size = 1; break; case 35: - buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV); size = 1; break; case 36: @@ -764,7 +760,7 @@ u32 sub_8137A84(u8 a, u8 *buffer) size = 2; break; case 46: - data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPD); + data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPEED); buffer[0] = data16; buffer[1] = data16 >> 8; size = 2; @@ -868,38 +864,38 @@ void sub_8138294(u8 a) { u8 iv; - SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, (u8 *)&battlePokemon->species); - SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, (u8 *)&battlePokemon->item); + SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, &battlePokemon->species); + SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, &battlePokemon->item); for (i = 0; i < 4; i++) { - SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, (u8 *)&battlePokemon->moves[i]); - SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, (u8 *)&battlePokemon->pp[i]); + SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, &battlePokemon->moves[i]); + SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, &battlePokemon->pp[i]); } - SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, (u8 *)&battlePokemon->ppBonuses); - SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, (u8 *)&battlePokemon->friendship); - SetMonData(&gPlayerParty[a], MON_DATA_EXP, (u8 *)&battlePokemon->experience); + SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &battlePokemon->ppBonuses); + SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, &battlePokemon->friendship); + SetMonData(&gPlayerParty[a], MON_DATA_EXP, &battlePokemon->experience); iv = battlePokemon->hpIV; - SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, (u8 *)&iv); + SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &iv); iv = battlePokemon->attackIV; - SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, (u8 *)&iv); + SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &iv); iv = battlePokemon->defenseIV; - SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, (u8 *)&iv); + SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &iv); iv = battlePokemon->speedIV; - SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, (u8 *)&iv); + SetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV, &iv); iv = battlePokemon->spAttackIV; - SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, (u8 *)&iv); + SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &iv); iv = battlePokemon->spDefenseIV; - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, (u8 *)&iv); - SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, (u8 *)&battlePokemon->personality); - SetMonData(&gPlayerParty[a], MON_DATA_STATUS, (u8 *)&battlePokemon->status1); - SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, (u8 *)&battlePokemon->level); - SetMonData(&gPlayerParty[a], MON_DATA_HP, (u8 *)&battlePokemon->hp); - SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, (u8 *)&battlePokemon->maxHP); - SetMonData(&gPlayerParty[a], MON_DATA_ATK, (u8 *)&battlePokemon->attack); - SetMonData(&gPlayerParty[a], MON_DATA_DEF, (u8 *)&battlePokemon->defense); - SetMonData(&gPlayerParty[a], MON_DATA_SPD, (u8 *)&battlePokemon->speed); - SetMonData(&gPlayerParty[a], MON_DATA_SPATK, (u8 *)&battlePokemon->spAttack); - SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, (u8 *)&battlePokemon->spDefense); + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &iv); + SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, &battlePokemon->personality); + SetMonData(&gPlayerParty[a], MON_DATA_STATUS, &battlePokemon->status1); + SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, &battlePokemon->level); + SetMonData(&gPlayerParty[a], MON_DATA_HP, &battlePokemon->hp); + SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, &battlePokemon->maxHP); + SetMonData(&gPlayerParty[a], MON_DATA_ATK, &battlePokemon->attack); + SetMonData(&gPlayerParty[a], MON_DATA_DEF, &battlePokemon->defense); + SetMonData(&gPlayerParty[a], MON_DATA_SPEED, &battlePokemon->speed); + SetMonData(&gPlayerParty[a], MON_DATA_SPATK, &battlePokemon->spAttack); + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, &battlePokemon->spDefense); } break; case 1: @@ -911,8 +907,8 @@ void sub_8138294(u8 a) case 3: for (i = 0; i < 4; i++) { - SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, (u8 *)&moveData->moves[i]); - SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, (u8 *)&moveData->pp[i]); + SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, &moveData->moves[i]); + SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, &moveData->pp[i]); } SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &moveData->ppBonuses); break; @@ -951,7 +947,7 @@ void sub_8138294(u8 a) SetMonData(&gPlayerParty[a], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBank][3]); break; case 22: - SetMonData(&gPlayerParty[a], MON_DATA_SPD_EV, &gBattleBufferA[gActiveBank][3]); + SetMonData(&gPlayerParty[a], MON_DATA_SPEED_EV, &gBattleBufferA[gActiveBank][3]); break; case 23: SetMonData(&gPlayerParty[a], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBank][3]); @@ -981,7 +977,7 @@ void sub_8138294(u8 a) SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][4]); SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][5]); - SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][6]); + SetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBank][6]); SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][7]); SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][8]); break; @@ -995,7 +991,7 @@ void sub_8138294(u8 a) SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][3]); break; case 35: - SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][3]); + SetMonData(&gPlayerParty[a], MON_DATA_SPEED_IV, &gBattleBufferA[gActiveBank][3]); break; case 36: SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][3]); @@ -1028,7 +1024,7 @@ void sub_8138294(u8 a) SetMonData(&gPlayerParty[a], MON_DATA_DEF, &gBattleBufferA[gActiveBank][3]); break; case 46: - SetMonData(&gPlayerParty[a], MON_DATA_SPD, &gBattleBufferA[gActiveBank][3]); + SetMonData(&gPlayerParty[a], MON_DATA_SPEED, &gBattleBufferA[gActiveBank][3]); break; case 47: SetMonData(&gPlayerParty[a], MON_DATA_SPATK, &gBattleBufferA[gActiveBank][3]); @@ -1490,7 +1486,7 @@ void WallyHandleTrainerBallThrow(void) gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; gSprites[gObjectBankIDs[gActiveBank]].data5 = gActiveBank; - oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38); + StoreSpriteCallbackInData6(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38); StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1); paletteNum = AllocSpritePalette(0xD6F8); LoadCompressedPalette(gTrainerBackPicPaletteTable[2].data, 0x100 + paletteNum * 16, 32); diff --git a/src/battle_interface.c b/src/battle/battle_interface.c index 246bda62b..10962c025 100644 --- a/src/battle_interface.c +++ b/src/battle/battle_interface.c @@ -97,7 +97,7 @@ static int sub_8045F58(s32, s32, int, int *, u8, u16); static u8 GetScaledExpFraction(int, int, int, u8); static void sub_8045D58(u8, u8); static u8 sub_804602C(int, int, int, int *, u8 *, u8); -static void sub_8046128(struct BattleInterfaceStruct1 *a, int *b, void *c); +static void sub_8046128(struct BattleInterfaceStruct1 *a, int *b, u16 *c); static int do_nothing(s16 unused1, s16 unused2, int unused3) { @@ -482,7 +482,7 @@ u8 battle_make_oam_normal_battle(u8 a) SetSubspriteTables(sprite, &gSubspriteTables_820A684[GetBankSide(a)]); sprite->subspriteMode = 2; sprite->oam.priority = 1; - CpuCopy32(sub_8043CDC(1), (void *)(OBJ_VRAM0 + sprite->oam.tileNum * 32), 64); + CpuCopy32(sub_8043CDC(1), OBJ_VRAM0 + sprite->oam.tileNum * 32, 64); gSprites[spriteId1].data5 = spriteId3; gSprites[spriteId1].data6 = a; @@ -940,7 +940,7 @@ static void sub_8044210(u8 a, s16 b, u8 c) sub_8003504(ptr, b, 0xF, 1); if (GetBankSide(r4) == 0) { - CpuCopy32(sub_8043CDC(0x74), (void *)(OBJ_VRAM0 + (gSprites[a].oam.tileNum + 0x34) * 32), 32); + CpuCopy32(sub_8043CDC(0x74), OBJ_VRAM0 + (gSprites[a].oam.tileNum + 0x34) * 32, 32); } } r4 = gSprites[a].data5; @@ -1309,7 +1309,7 @@ void sub_804454C(void) { spriteId = gSprites[gHealthboxIDs[i]].data5; - CpuFill32(0, (void *)(OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * 32), 0x100); + CpuFill32(0, OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * 32, 0x100); sub_8044210(gHealthboxIDs[i], GetMonData(&gPlayerParty[gBattlePartyID[i]], MON_DATA_HP), 0); sub_8044210(gHealthboxIDs[i], GetMonData(&gPlayerParty[gBattlePartyID[i]], MON_DATA_MAX_HP), 1); } @@ -1317,7 +1317,7 @@ void sub_804454C(void) { draw_status_ailment_maybe(gHealthboxIDs[i]); sub_8045A5C(gHealthboxIDs[i], &gPlayerParty[gBattlePartyID[i]], 5); - CpuCopy32(sub_8043CDC(0x75), (void *)(OBJ_VRAM0 + 0x680 + gSprites[gHealthboxIDs[i]].oam.tileNum * 32), 32); + CpuCopy32(sub_8043CDC(0x75), OBJ_VRAM0 + 0x680 + gSprites[gHealthboxIDs[i]].oam.tileNum * 32, 32); } } else @@ -1332,7 +1332,7 @@ void sub_804454C(void) { spriteId = gSprites[gHealthboxIDs[i]].data5; - CpuFill32(0, (void *)(OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * 32), 0x100); + CpuFill32(0, OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * 32, 0x100); sub_8044210(gHealthboxIDs[i], GetMonData(&gEnemyParty[gBattlePartyID[i]], MON_DATA_HP), 0); sub_8044210(gHealthboxIDs[i], GetMonData(&gEnemyParty[gBattlePartyID[i]], MON_DATA_MAX_HP), 1); } @@ -2388,7 +2388,7 @@ static void sub_80451A0(u8 a, struct Pokemon *pkmn) gender = GetMonGender(pkmn); species = GetMonData(pkmn, MON_DATA_SPECIES); language = GetMonData(pkmn, MON_DATA_LANGUAGE); - if (sub_8040D3C(species, nickname, language)) + if (ShouldHideGenderIconForLanguage(species, nickname, language)) gender = 100; switch (gender) { @@ -2501,13 +2501,13 @@ static void sub_8045458(u8 a, u8 b) if (GetBankSide(r4) != 0) { u16 species = GetMonData(&gEnemyParty[gBattlePartyID[r4]], MON_DATA_SPECIES); - if (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(species), 1) != 0) + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), 1) != 0) { r4 = gSprites[a].data5; if (b != 0) - CpuCopy32(sub_8043CDC(0x46), (void *)(OBJ_VRAM0 + (gSprites[r4].oam.tileNum + 8) * 32), 32); + CpuCopy32(sub_8043CDC(0x46), OBJ_VRAM0 + (gSprites[r4].oam.tileNum + 8) * 32, 32); else - CpuFill32(0, (void *)(OBJ_VRAM0 + (gSprites[r4].oam.tileNum + 8) * 32), 32); + CpuFill32(0, OBJ_VRAM0 + (gSprites[r4].oam.tileNum + 8) * 32, 32); } } } @@ -2568,10 +2568,10 @@ static void draw_status_ailment_maybe(u8 a) r6 = sub_8043CDC(0x27); for (i = 0; i < 3; i++) - CpuCopy32(r6, (void *)(OBJ_VRAM0 + (gSprites[a].oam.tileNum + r8 + i) * 32), 32); + CpuCopy32(r6, OBJ_VRAM0 + (gSprites[a].oam.tileNum + r8 + i) * 32, 32); if (!ewram17800[r7].unk0_4) - CpuCopy32(sub_8043CDC(1), (void *)(OBJ_VRAM0 + gSprites[r10].oam.tileNum * 32), 64); + CpuCopy32(sub_8043CDC(1), OBJ_VRAM0 + gSprites[r10].oam.tileNum * 32, 64); sub_8045458(a, 1); return; @@ -2582,13 +2582,13 @@ static void draw_status_ailment_maybe(u8 a) // I don't like writing the array index like this, but I can't get it to match otherwise. FillPalette(r0[gBattleInterfaceStatusIcons_DynPal], r4_2 + 0x100, 2); CpuCopy16(gPlttBufferUnfaded + 0x100 + r4_2, (void *)(OBJ_PLTT + r4_2 * 2), 2); - CpuCopy32(r6, (void *)(OBJ_VRAM0 + (gSprites[a].oam.tileNum + r8) * 32), 96); + CpuCopy32(r6, OBJ_VRAM0 + (gSprites[a].oam.tileNum + r8) * 32, 96); if (IsDoubleBattle() == TRUE || GetBankSide(r7) == TRUE) { if (!ewram17800[r7].unk0_4) { - CpuCopy32(sub_8043CDC(0), (void *)(OBJ_VRAM0 + gSprites[r10].oam.tileNum * 32), 32); - CpuCopy32(sub_8043CDC(0x41), (void *)(OBJ_VRAM0 + (gSprites[r10].oam.tileNum + 1) * 32), 32); + CpuCopy32(sub_8043CDC(0), OBJ_VRAM0 + gSprites[r10].oam.tileNum * 32, 32); + CpuCopy32(sub_8043CDC(0x41), OBJ_VRAM0 + (gSprites[r10].oam.tileNum + 1) * 32, 32); } } sub_8045458(a, 0); @@ -2669,11 +2669,11 @@ static void sub_80458B0(u8 a) CpuCopy32(sub_8043CDC(0x2B), r6 + i * 64, 32); for (r7 = 3; r7 < 3 + r8; r7++) { - addr = (void *)(OBJ_VRAM0 + (gSprites[a].oam.tileNum + MACRO1(r7)) * 32); + addr = OBJ_VRAM0 + (gSprites[a].oam.tileNum + MACRO1(r7)) * 32; CpuCopy32(r6, addr, 32); r6 += 32; - addr = (void *)(OBJ_VRAM0 + (8 + gSprites[a].oam.tileNum + MACRO1(r7)) * 32); + addr = OBJ_VRAM0 + (8 + gSprites[a].oam.tileNum + MACRO1(r7)) * 32; CpuCopy32(r6, addr, 32); r6 += 32; } @@ -2697,7 +2697,7 @@ static void sub_8045998(u8 a) r7 = (u8 *)0x02000520 + status * 0x180 + 32; for (i = 6; i < 6 + r6; i++) { - CpuCopy32(r7, (void *)(OBJ_VRAM0 + (gSprites[a].oam.tileNum + 0x18 + MACRO1(i)) * 32), 32); + CpuCopy32(r7, OBJ_VRAM0 + (gSprites[a].oam.tileNum + 0x18 + MACRO1(i)) * 32, 32); r7 += 64; } } @@ -2821,9 +2821,9 @@ static void sub_8045D58(u8 a, u8 b) { u8 r4 = gSprites[ewram17850[a].unk0].data5; if (i < 2) - CpuCopy32(sub_8043CDC(r8) + sp8[i] * 32, (void *)(OBJ_VRAM0 + (gSprites[r4].oam.tileNum + 2 + i) * 32), 32); + CpuCopy32(sub_8043CDC(r8) + sp8[i] * 32, OBJ_VRAM0 + (gSprites[r4].oam.tileNum + 2 + i) * 32, 32); else - CpuCopy32(sub_8043CDC(r8) + sp8[i] * 32, (void *)(OBJ_VRAM0 + 64 + (i + gSprites[r4].oam.tileNum) * 32), 32); + CpuCopy32(sub_8043CDC(r8) + sp8[i] * 32, OBJ_VRAM0 + 64 + (i + gSprites[r4].oam.tileNum) * 32, 32); } break; case 1: @@ -2837,9 +2837,9 @@ static void sub_8045D58(u8 a, u8 b) for (i = 0; i < 8; i++) { if (i < 4) - CpuCopy32(sub_8043CDC(0xC) + sp8[i] * 32, (void *)(OBJ_VRAM0 + (gSprites[ewram17850[a].unk0].oam.tileNum + 0x24 + i) * 32), 32); + CpuCopy32(sub_8043CDC(0xC) + sp8[i] * 32, OBJ_VRAM0 + (gSprites[ewram17850[a].unk0].oam.tileNum + 0x24 + i) * 32, 32); else - CpuCopy32(sub_8043CDC(0xC) + sp8[i] * 32, (void *)(OBJ_VRAM0 + 0xB80 + (i + gSprites[ewram17850[a].unk0].oam.tileNum) * 32), 32); + CpuCopy32(sub_8043CDC(0xC) + sp8[i] * 32, OBJ_VRAM0 + 0xB80 + (i + gSprites[ewram17850[a].unk0].oam.tileNum) * 32, 32); } break; } @@ -2972,7 +2972,7 @@ static u8 sub_804602C(int a, int b, int c, int *d, u8 *e, u8 f) return r3; } -s16 sub_80460C8(struct BattleInterfaceStruct1 *a, int *b, void *c, int d) +s16 sub_80460C8(struct BattleInterfaceStruct1 *a, int *b, u16 *c, int d) { u16 r7; s16 r1; @@ -2987,7 +2987,7 @@ s16 sub_80460C8(struct BattleInterfaceStruct1 *a, int *b, void *c, int d) return r7; } -static void sub_8046128(struct BattleInterfaceStruct1 *a, int *b, void *c) +static void sub_8046128(struct BattleInterfaceStruct1 *a, int *b, u16 *c) { u8 sp8[6]; u16 sp10[6]; diff --git a/src/battle_message.c b/src/battle/battle_message.c index a3cc320ad..79855a614 100644 --- a/src/battle_message.c +++ b/src/battle/battle_message.c @@ -1,6 +1,7 @@ #include "global.h" -#include "battle_message.h" #include "battle.h" +#include "battle_message.h" +#include "battle_tower.h" #include "item.h" #include "items.h" #include "pokemon.h" @@ -127,7 +128,6 @@ u8 GetBankSide(u8 bank); s32 sub_803FC34(u16); void get_trainer_name(u8* dst); u8 get_trainer_class_name_index(void); -u8 sub_8135FD8(void); u8 GetMultiplayerId(void); u8 GetBankByPlayerAI(u8 ID); u8 GetBankSide(u8 bank); @@ -632,7 +632,7 @@ u32 StrCpyDecodeBattle(const u8* src, u8* dst) else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) toCpy = gTrainerClassNames[get_trainer_class_name_index()]; else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) - toCpy = gTrainerClassNames[sub_8135FD8()]; + toCpy = gTrainerClassNames[GetEReaderTrainerClassNameIndex()]; else toCpy = gTrainerClassNames[gTrainers[gTrainerBattleOpponent].trainerClass]; break; @@ -661,7 +661,7 @@ u32 StrCpyDecodeBattle(const u8* src, u8* dst) } else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER) { - sub_8135FF4(text); + SetEReaderTrainerName(text); toCpy = text; } else diff --git a/src/battle_party_menu.c b/src/battle/battle_party_menu.c index 49e0b8432..2f6dc6816 100644 --- a/src/battle_party_menu.c +++ b/src/battle/battle_party_menu.c @@ -22,31 +22,14 @@ extern u8 ewram[]; #define UNK_201606C_ARRAY (ewram + 0x1606C) // lazy define but whatever. -extern u8 IsLinkDoubleBattle(void); -extern void TryCreatePartyMenuMonIcon(u8, u8, struct Pokemon *); -extern void LoadHeldItemIconGraphics(void); -extern void CreateHeldItemIcons_806DC34(); extern u8 sub_806BD58(u8, u8); extern void PartyMenuPrintMonsLevelOrStatus(void); -extern void PrintPartyMenuMonNicknames(void); -extern void PartyMenuTryPrintMonsHP(void); extern void nullsub_13(void); -extern void PartyMenuDrawHPBars(void); -extern u8 sub_806B58C(u8); -extern u8 GetItemEffectType(); -extern void sub_806E750(u8, const struct PartyPopupMenu *, const struct PartyMenuItem *, int); -extern void sub_806D5A4(void); extern void sub_802E414(void); extern void sub_80A6DCC(void); -extern void sub_806AF4C(); -extern void sub_806AEDC(void); -extern TaskFunc PartyMenuGetPopupMenuFunc(u8, const struct PartyPopupMenu *, const struct PartyMenuItem *, u8); -extern void sub_806E7D0(u8, const struct PartyPopupMenu *); extern u8 *sub_8040D08(); extern void sub_8040B8C(void); -extern void sub_806E6F0(); extern void nullsub_14(); -extern void OpenPartyMenu(); extern u8 sub_803FBBC(void); extern u8 gPlayerPartyCount; @@ -79,7 +62,7 @@ static void Task_BattlePartyMenuSummary(u8 taskId); static void Task_BattlePartyMenuShift(u8 taskId); static void Task_BattlePartyMenuCancel(u8 taskId); -static const struct PartyMenuItem sBattlePartyMenuActions[] = +static const struct MenuAction2 sBattlePartyMenuActions[] = { {OtherText_Summary, Task_BattlePartyMenuSummary}, {gOtherText_CancelNoTerminator, Task_BattlePartyMenuCancel}, @@ -342,7 +325,7 @@ void unref_sub_8094DB0(void) { r4 = sub_8094C20(0); sub_8094C98(0, i); - sub_806E6F0(&gPlayerParty[r4], &gPlayerParty[n]); + SwapPokemon(&gPlayerParty[r4], &gPlayerParty[n]); break; } } @@ -354,7 +337,7 @@ void sub_8094E20(u8 a) gUnknown_02038473 = a; nullsub_14(); pokemon_change_order(); - OpenPartyMenu(1, 0xFF); + OpenPartyMenu(PARTY_MENU_TYPE_BATTLE, 0xFF); } void sub_8094E4C(void) @@ -362,93 +345,93 @@ void sub_8094E4C(void) sub_8094E20(3); } -int SetUpBattlePartyMenu(void) +bool8 SetUpBattlePartyMenu(void) { - switch (EWRAM_1B000.unk264) + switch (EWRAM_1B000.setupState) //switch (ewram1B000.unk264[0]) { case 0: //TODO: try to get rid of this duplicate code if (IsLinkDoubleBattle() == TRUE) { - if (EWRAM_1B000.unk266 != 6) + if (EWRAM_1B000.monIndex != 6) { - TryCreatePartyMenuMonIcon(EWRAM_1B000.unk260, EWRAM_1B000.unk266, &gPlayerParty[EWRAM_1B000.unk266]); - EWRAM_1B000.unk266++; + TryCreatePartyMenuMonIcon(EWRAM_1B000.menuHandlerTaskId, EWRAM_1B000.monIndex, &gPlayerParty[EWRAM_1B000.monIndex]); + EWRAM_1B000.monIndex++; } else { - EWRAM_1B000.unk266 = 0; - EWRAM_1B000.unk264++; + EWRAM_1B000.monIndex = 0; + EWRAM_1B000.setupState++; } } else { - if (EWRAM_1B000.unk266 < 6) + if (EWRAM_1B000.monIndex < 6) { - TryCreatePartyMenuMonIcon(EWRAM_1B000.unk260, EWRAM_1B000.unk266, &gPlayerParty[EWRAM_1B000.unk266]); - EWRAM_1B000.unk266++; + TryCreatePartyMenuMonIcon(EWRAM_1B000.menuHandlerTaskId, EWRAM_1B000.monIndex, &gPlayerParty[EWRAM_1B000.monIndex]); + EWRAM_1B000.monIndex++; } else { - EWRAM_1B000.unk266 = 0; - EWRAM_1B000.unk264++; + EWRAM_1B000.monIndex = 0; + EWRAM_1B000.setupState++; } } break; case 1: LoadHeldItemIconGraphics(); - EWRAM_1B000.unk264++; + EWRAM_1B000.setupState++; break; case 2: - CreateHeldItemIcons_806DC34(EWRAM_1B000.unk260); - EWRAM_1B000.unk264++; + CreateHeldItemIcons_806DC34(EWRAM_1B000.menuHandlerTaskId); + EWRAM_1B000.setupState++; break; case 3: - if (sub_806BD58(EWRAM_1B000.unk260, EWRAM_1B000.unk266) == 1) + if (sub_806BD58(EWRAM_1B000.menuHandlerTaskId, EWRAM_1B000.monIndex) == 1) { - EWRAM_1B000.unk266 = 0; - EWRAM_1B000.unk264++; + EWRAM_1B000.monIndex = 0; + EWRAM_1B000.setupState++; } else - EWRAM_1B000.unk266++; + EWRAM_1B000.monIndex++; break; case 4: PartyMenuPrintMonsLevelOrStatus(); - EWRAM_1B000.unk264++; + EWRAM_1B000.setupState++; break; case 5: PrintPartyMenuMonNicknames(); - EWRAM_1B000.unk264++; + EWRAM_1B000.setupState++; break; case 6: PartyMenuTryPrintMonsHP(); - EWRAM_1B000.unk264++; + EWRAM_1B000.setupState++; break; case 7: nullsub_13(); - EWRAM_1B000.unk264++; + EWRAM_1B000.setupState++; break; case 8: PartyMenuDrawHPBars(); - EWRAM_1B000.unk264++; + EWRAM_1B000.setupState++; break; case 9: - if (sub_806B58C(EWRAM_1B000.unk266) == 1) + if (DrawPartyMonBackground(EWRAM_1B000.monIndex) == 1) { - EWRAM_1B000.unk266 = 0; - EWRAM_1B000.unk264++; + EWRAM_1B000.monIndex = 0; + EWRAM_1B000.setupState++; } else - EWRAM_1B000.unk266++; + EWRAM_1B000.monIndex++; break; case 10: if (gUnknown_02038473 == 3) { if (GetItemEffectType(gScriptItemId) == 10) - ewram1B000.unk259 = 0xFF; + ewram1B000.promptTextId = 0xFF; else - ewram1B000.unk259 = 3; + ewram1B000.promptTextId = 3; } return TRUE; } @@ -461,55 +444,56 @@ static void sub_8095050(u8 a, u8 b) { if (gUnknown_02038473 == 1) { - gTasks[EWRAM_1B000.unk260].data[4] = 1; - gTasks[EWRAM_1B000.unk260].data[5] = 1; + gTasks[EWRAM_1B000.menuHandlerTaskId].data[4] = 1; + gTasks[EWRAM_1B000.menuHandlerTaskId].data[5] = 1; } else { - gTasks[EWRAM_1B000.unk260].data[4] = 0; - gTasks[EWRAM_1B000.unk260].data[5] = 0; + gTasks[EWRAM_1B000.menuHandlerTaskId].data[4] = 0; + gTasks[EWRAM_1B000.menuHandlerTaskId].data[5] = 0; } } else { - gTasks[EWRAM_1B000.unk260].data[4] = 2; - gTasks[EWRAM_1B000.unk260].data[5] = 2; + gTasks[EWRAM_1B000.menuHandlerTaskId].data[4] = 2; + gTasks[EWRAM_1B000.menuHandlerTaskId].data[5] = 2; } - sub_806E750(gTasks[a].data[4], sBattlePartyPopupMenus, sBattlePartyMenuActions, 0); + + ShowPartyPopupMenu(gTasks[a].data[4], sBattlePartyPopupMenus, sBattlePartyMenuActions, 0); } -void SetUpBattlePokemonMenu(u8 a) +void HandleBattlePartyMenu(u8 taskId) { if (!gPaletteFade.active) { if (gUnknown_02038473 == 3 && GetItemEffectType(gScriptItemId) == 10) { - gUnknown_03004AE4(a, gScriptItemId, Task_80952E4); + gUnknown_03004AE4(taskId, gScriptItemId, Task_80952E4); return; } - switch (sub_806BD80(a)) + switch (HandleDefaultPartyMenuInput(taskId)) { - case 1: + case A_BUTTON: if (gUnknown_02038473 == 3) { - if (GetMonData(&gPlayerParty[sub_806CA38(a)], MON_DATA_IS_EGG)) + if (GetMonData(&gPlayerParty[sub_806CA38(taskId)], MON_DATA_IS_EGG)) PlaySE(SE_HAZURE); else { sub_806D5A4(); - gUnknown_03004AE4(a, gScriptItemId, Task_80952E4); + gUnknown_03004AE4(taskId, gScriptItemId, Task_80952E4); } } else { PlaySE(SE_SELECT); - GetMonNickname(&gPlayerParty[sub_806CA38(a)], gStringVar1); - sub_8095050(a, sub_806CA38(a)); - SetTaskFuncWithFollowupFunc(a, Task_HandlePopupMenuInput, SetUpBattlePokemonMenu); + GetMonNickname(&gPlayerParty[sub_806CA38(taskId)], gStringVar1); + sub_8095050(taskId, sub_806CA38(taskId)); + SetTaskFuncWithFollowupFunc(taskId, Task_HandlePopupMenuInput, HandleBattlePartyMenu); } break; - case 2: + case B_BUTTON: if (gUnknown_02038473 == 1) PlaySE(SE_HAZURE); else @@ -518,12 +502,12 @@ void SetUpBattlePokemonMenu(u8 a) if (gUnknown_02038473 == 3) { gUnknown_0202E8F4 = 0; - gTasks[a].func = Task_80952E4; + gTasks[taskId].func = Task_80952E4; } else { gUnknown_0202E8F4 = 0; - gTasks[a].func = Task_809527C; + gTasks[taskId].func = Task_809527C; } } break; @@ -571,7 +555,7 @@ static void Task_8095330(u8 taskId) static void Task_809535C(void) { gPaletteFade.bufferTransferDisabled = TRUE; - sub_806AF4C(1, 0xFF, SetUpBattlePokemonMenu, 5); + SetPartyMenuSettings(PARTY_MENU_TYPE_BATTLE, 0xFF, HandleBattlePartyMenu, 5); SetMainCallback2(Task_809538C); } @@ -579,14 +563,14 @@ static void Task_809538C(void) { do { - if (sub_806B124() == TRUE) + if (InitPartyMenu() == TRUE) { - sub_806C994(EWRAM_1B000.unk260, gUnknown_020384F0); - sub_806BF74(EWRAM_1B000.unk260, 0); + sub_806C994(EWRAM_1B000.menuHandlerTaskId, gUnknown_020384F0); + ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0); GetMonNickname(&gPlayerParty[gUnknown_020384F0], gStringVar1); - sub_8095050(EWRAM_1B000.unk260, gUnknown_020384F0); - SetTaskFuncWithFollowupFunc(EWRAM_1B000.unk260, Task_HandlePopupMenuInput, SetUpBattlePokemonMenu); - SetMainCallback2(sub_806AEDC); + sub_8095050(EWRAM_1B000.menuHandlerTaskId, gUnknown_020384F0); + SetTaskFuncWithFollowupFunc(EWRAM_1B000.menuHandlerTaskId, Task_HandlePopupMenuInput, HandleBattlePartyMenu); + SetMainCallback2(CB2_PartyMenuMain); return; } } while (sub_80F9344() != 1); @@ -660,7 +644,7 @@ static void Task_BattlePartyMenuShift(u8 taskId) u8 i; u8 r4; - sub_806E7D0(gTasks[taskId].data[4], sBattlePartyPopupMenus); + ClosePartyPopupMenu(gTasks[taskId].data[4], sBattlePartyPopupMenus); partySelection = sub_806CA38(taskId); if (IsLinkDoubleBattle() == TRUE && (partySelection == 1 || partySelection == 4 || partySelection == 5)) { @@ -735,15 +719,15 @@ static void Task_BattlePartyMenuShift(u8 taskId) gUnknown_0202E8F4 = 1; r4 = pokemon_order_func(gBattlePartyID[gBankInMenu]); sub_8094C98(r4, partySelection); - sub_806E6F0(&gPlayerParty[r4], &gPlayerParty[partySelection]); + SwapPokemon(&gPlayerParty[r4], &gPlayerParty[partySelection]); gTasks[taskId].func = Task_809527C; } static void Task_BattlePartyMenuCancel(u8 taskId) { HandleDestroyMenuCursors(); - sub_806E7D0(gTasks[taskId].data[4], sBattlePartyPopupMenus); + ClosePartyPopupMenu(gTasks[taskId].data[4], sBattlePartyPopupMenus); gTasks[taskId].data[4] = gTasks[taskId].data[5]; - sub_806D538(0, 0); + PrintPartyMenuPromptText(0, 0); SwitchTaskToFollowupFunc(taskId); } diff --git a/src/battle_records.c b/src/battle/battle_records.c index d848a10b8..54697593b 100644 --- a/src/battle_records.c +++ b/src/battle/battle_records.c @@ -243,7 +243,7 @@ static void PrintLinkBattleRecord(struct LinkBattleRecord *record, u8 y) void ShowLinkBattleRecords(void) { s32 i; MenuDrawTextWindow(1, 0, 28, 18); - sub_8072BD8((u8 *) gOtherText_BattleResults, 0, 1, 240); + sub_8072BD8(gOtherText_BattleResults, 0, 1, 240); PrintLinkBattleWinsLossesDraws(gSaveBlock1.linkBattleRecords); #if ENGLISH @@ -260,9 +260,9 @@ void ShowLinkBattleRecords(void) { static bool32 sub_8110494(u8 level) { - struct SaveBlock2_Sub *sb2sub = &gSaveBlock2.filler_A8; + struct BattleTowerData *battleTower = &gSaveBlock2.battleTower; - switch (sb2sub->var_4AE[level]) + switch (battleTower->var_4AE[level]) { case 0: return FALSE; @@ -294,17 +294,18 @@ static void PrintWinStreak(const u8 *str, u16 streak, u8 left, u8 top) static void PrintRecordWinStreak(u8 level, u8 left, u8 top) { - struct SaveBlock2_Sub *sb2sub = &gSaveBlock2.filler_A8; - u16 winStreak = sb2sub->recordWinStreak[level]; + struct BattleTowerData *battleTower = &gSaveBlock2.battleTower; + u16 winStreak = battleTower->recordWinStreaks[level]; PrintWinStreak(gOtherText_Record, winStreak, left, top); } static u16 GetLastWinStreak(u8 level) { - u16 result = gSaveBlock2.filler_A8.winStreak[level]; - if (result > 9999) - result = 9999; - return result; + u16 winStreak = gSaveBlock2.battleTower.currentWinStreaks[level]; + if (winStreak > 9999) + winStreak = 9999; + + return winStreak; } static void PrintLastWinStreak(u8 level, u8 left, u8 top) diff --git a/src/battle_setup.c b/src/battle/battle_setup.c index 59e17e9eb..8327ed59d 100644 --- a/src/battle_setup.c +++ b/src/battle/battle_setup.c @@ -876,23 +876,24 @@ static void CB2_StartFirstBattle(void) static void CB2_EndFirstBattle(void) { - sav1_reset_battle_music_maybe(); + Overworld_ClearSavedMusic(); SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); } +// why not just use the macros? maybe its because they didnt want to uncast const every time? static u32 TrainerBattleLoadArg32(const u8 *ptr) { - return ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24); + return T1_READ_32(ptr); } static u16 TrainerBattleLoadArg16(const u8 *ptr) { - return ptr[0] | (ptr[1] << 8); + return T1_READ_16(ptr); } static u8 TrainerBattleLoadArg8(const u8 *ptr) { - return ptr[0]; + return T1_READ_8(ptr); } static u16 CurrentOpponentTrainerFlag(void) @@ -1123,8 +1124,8 @@ void ScrSpecial_StartTrainerEyeRematch(void) ScriptContext1_Stop(); } -static u8 *GetTrainerIntroSpeech(void); -static u8 *GetTrainerNonBattlingSpeech(void); +static const u8 *GetTrainerIntroSpeech(void); +static const u8 *GetTrainerNonBattlingSpeech(void); void ScrSpecial_ShowTrainerIntroSpeech(void) { @@ -1207,22 +1208,22 @@ void PlayTrainerEncounterMusic(void) } //Returns an empty string if a null pointer was passed, otherwise returns str -static u8 *SanitizeString(const u8 *str) +static const u8 *SanitizeString(const u8 *str) { if (str) - return (u8 *) str; + return str; else - return (u8 *) gOtherText_CancelWithTerminator; + return gOtherText_CancelWithTerminator; } -static u8 *GetTrainerIntroSpeech(void) +static const u8 *GetTrainerIntroSpeech(void) { return SanitizeString(sTrainerIntroSpeech); } u8 *sub_8082830(void) { - u8 *str; + const u8 *str; if (gTrainerBattleOpponent == 1024) str = sub_80BCCE8(); @@ -1233,12 +1234,12 @@ u8 *sub_8082830(void) return gStringVar4; } -u8 *unref_sub_808286C(void) +const u8 *unref_sub_808286C(void) { return SanitizeString(sTrainerVictorySpeech); } -static u8 *GetTrainerNonBattlingSpeech(void) +static const u8 *GetTrainerNonBattlingSpeech(void) { return SanitizeString(sTrainerCannotBattleSpeech); } diff --git a/src/battle_transition.c b/src/battle/battle_transition.c index 53d32d03a..53d32d03a 100644 --- a/src/battle_transition.c +++ b/src/battle/battle_transition.c diff --git a/src/calculate_base_damage.c b/src/battle/calculate_base_damage.c index f5c679876..f5c679876 100644 --- a/src/calculate_base_damage.c +++ b/src/battle/calculate_base_damage.c diff --git a/src/contest_link_80C857C.c b/src/battle/contest_link_80C857C.c index 0ae98af09..0ae98af09 100644 --- a/src/contest_link_80C857C.c +++ b/src/battle/contest_link_80C857C.c diff --git a/src/pokeball.c b/src/battle/pokeball.c index ee3b95678..ee3b95678 100644 --- a/src/pokeball.c +++ b/src/battle/pokeball.c diff --git a/src/post_battle_event_funcs.c b/src/battle/post_battle_event_funcs.c index 27d7022fe..27d7022fe 100644 --- a/src/post_battle_event_funcs.c +++ b/src/battle/post_battle_event_funcs.c diff --git a/src/reshow_battle_screen.c b/src/battle/reshow_battle_screen.c index 343c8f183..343c8f183 100644 --- a/src/reshow_battle_screen.c +++ b/src/battle/reshow_battle_screen.c diff --git a/src/smokescreen.c b/src/battle/smokescreen.c index 8345cb6ad..8345cb6ad 100644 --- a/src/smokescreen.c +++ b/src/battle/smokescreen.c diff --git a/src/bike.c b/src/bike.c deleted file mode 100644 index 80cab0850..000000000 --- a/src/bike.c +++ /dev/null @@ -1,1013 +0,0 @@ -#include "global.h" -#include "bike.h" -#include "field_map_obj.h" -#include "field_player_avatar.h" -#include "fieldmap.h" -#include "flags.h" -#include "global.fieldmap.h" -#include "metatile_behavior.h" -#include "overworld.h" -#include "songs.h" -#include "sound.h" - -extern u8 sub_80608A4(u8); - -extern u8 gUnknown_02039250; -extern u8 gUnknown_02039251; -extern u8 gUnknown_0202E854; - -static void MovePlayerOnMachBike(u8, u16, u16); -static u8 GetMachBikeTransition(u8 *); -static void MachBikeTransition_FaceDirection(u8); -static void MachBikeTransition_80E517C(u8); -static void MachBikeTransition_80E51C4(u8); -static void MachBikeTransition_80E5270(u8); -static void MovePlayerOnAcroBike(u8, u16, u16); -static u8 CheckMovementInputAcroBike(u8 *, u16, u16); -static u8 AcroBikeHandleInputNormal(u8 *, u16, u16); -static u8 AcroBikeHandleInputTurning(u8 *, u16, u16); -static u8 AcroBikeHandleInputWheelieStanding(u8 *, u16, u16); -static u8 AcroBikeHandleInputBunnyHop(u8 *, u16, u16); -static u8 AcroBikeHandleInputWheelieMoving(u8 *, u16, u16); -static u8 AcroBikeHandleInputState5(u8 *, u16, u16); -static u8 AcroBikeHandleInputState6(u8 *, u16, u16); -static void AcroBikeTransition_FaceDirection(u8); -static void AcroBikeTransition_80E5708(u8); -static void AcroBikeTransition_80E5744(u8); -static void AcroBikeTransition_NormalToWheelie(u8); -static void AcroBikeTransition_80E57F8(u8); -static void AcroBikeTransition_80E5834(u8); -static void AcroBikeTransition_80E5870(u8); -static void AcroBikeTransition_80E58AC(u8); -static void AcroBikeTransition_80E5920(u8); -static void AcroBikeTransition_80E5990(u8); -static void AcroBikeTransition_80E59A0(u8); -static void AcroBikeTransition_80E5A30(u8); -static void AcroBikeTransition_80E5AC0(u8); -static void sub_80E5B60(u16, u16); -static u8 sub_80E5C2C(void); -static void sub_80E5C7C(u8); -static void sub_80E5CB8(u8); -static u8 sub_80E5CF4(u16); -static u8 get_some_collision(u8); -static u8 sub_80E5DA0(struct MapObject *, s16, s16, u8, u8); -static bool8 IsRunningDisallowedByMetatile(u8); -static void sub_80E5E4C(); -static u8 CanBikeFaceDirOnMetatile(u8, u8); -static bool8 sub_80E5EC0(u8, u8); -static void sub_80E6024(void); - -static void (*const sMachBikeTransitions[])(u8) = -{ - MachBikeTransition_FaceDirection, - MachBikeTransition_80E517C, - MachBikeTransition_80E51C4, - MachBikeTransition_80E5270, -}; - -static void (*const gUnknown_083DB5A4[])(u8) = -{ - PlayerGoSpeed0, - sub_80593C4, - sub_80593F4, -}; - -static void (*const sAcroBikeTransitions[])(u8) = -{ - AcroBikeTransition_FaceDirection, - AcroBikeTransition_80E5708, - AcroBikeTransition_80E5744, - AcroBikeTransition_NormalToWheelie, - AcroBikeTransition_80E57F8, - AcroBikeTransition_80E5834, - AcroBikeTransition_80E5870, - AcroBikeTransition_80E58AC, - AcroBikeTransition_80E5920, - AcroBikeTransition_80E5990, - AcroBikeTransition_80E59A0, - AcroBikeTransition_80E5A30, - AcroBikeTransition_80E5AC0, -}; - -static u8 (*const sAcroBikeInputHandlers[])(u8 *, u16, u16) = -{ - AcroBikeHandleInputNormal, - AcroBikeHandleInputTurning, - AcroBikeHandleInputWheelieStanding, - AcroBikeHandleInputBunnyHop, - AcroBikeHandleInputWheelieMoving, - AcroBikeHandleInputState5, - AcroBikeHandleInputState6, -}; - -const u16 gMachBikeSpeeds[] = {SPEED_NORMAL, SPEED_FAST, SPEED_FASTEST}; -static const u8 Unknown_3DB606[] = {4, 0}; - -static const struct UnknownStruct1 gUnknown_083DB608[] = -{ - {1, 2, 15, 15, Unknown_3DB606, Unknown_3DB606, 1}, - {2, 2, 15, 15, Unknown_3DB606, Unknown_3DB606, 2}, - {3, 2, 15, 15, Unknown_3DB606, Unknown_3DB606, 3}, - {4, 2, 15, 15, Unknown_3DB606, Unknown_3DB606, 4}, -}; - -void MovePlayerOnBike(u8 direction, u16 newKeys, u16 heldKeys) -{ - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE) - MovePlayerOnMachBike(direction, newKeys, heldKeys); - else - MovePlayerOnAcroBike(direction, newKeys, heldKeys); -} - -static void MovePlayerOnMachBike(u8 direction, u16 newKeys, u16 heldKeys) -{ - sMachBikeTransitions[GetMachBikeTransition(&direction)](direction); -} - -static u8 GetMachBikeTransition(u8 *ptr) -{ - u8 direction = player_get_direction_upper_nybble(); - - if (*ptr == 0) - { - *ptr = direction; - if (gPlayerAvatar.unkB == 0) - { - gPlayerAvatar.running2 = 0; - return 0; - } - gPlayerAvatar.running2 = 2; - return 3; - } - - if (*ptr != direction && gPlayerAvatar.running2 != 2) - { - if (gPlayerAvatar.unkB != 0) - { - *ptr = direction; - gPlayerAvatar.running2 = 2; - return 3; - } - gPlayerAvatar.running2 = 1; - return 1; - } - else - { - gPlayerAvatar.running2 = 2; - return 2; - } -} - -static void MachBikeTransition_FaceDirection(u8 direction) -{ - PlayerFaceDirection(direction); - sub_80E6024(); -} - -static void MachBikeTransition_80E517C(u8 direction) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E)) - { - PlayerTurnInPlace(direction); - sub_80E6024(); - } - else - { - MachBikeTransition_FaceDirection(playerMapObj->mapobj_unk_18); - } -} - -static void MachBikeTransition_80E51C4(u8 direction) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - u8 collision; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - { - if (gPlayerAvatar.unkB) - MachBikeTransition_80E5270(playerMapObj->placeholder18); - else - MachBikeTransition_FaceDirection(playerMapObj->placeholder18); - } - else - { - collision = get_some_collision(direction); - if (collision > 0 && collision < 12) - { - if (collision == COLLISION_LEDGE_JUMP) - { - PlayerJumpLedge(direction); - } - else - { - sub_80E6024(); - if (collision < 5 || collision > 8) - PlayerOnBikeCollide(direction); - } - } - else - { - gUnknown_083DB5A4[gPlayerAvatar.bikeFrameCounter](direction); - gPlayerAvatar.unkB = gPlayerAvatar.bikeFrameCounter + (gPlayerAvatar.bikeFrameCounter >> 1); // same as dividing by 2, but compiler is insistent on >> 1 - if (gPlayerAvatar.bikeFrameCounter < 2) // do not go faster than the last element in the mach bike array - gPlayerAvatar.bikeFrameCounter++; - } - } -} - -static void MachBikeTransition_80E5270(u8 var) -{ - u8 collision; - - if (gPlayerAvatar.unkB != 0) - gPlayerAvatar.bikeFrameCounter = --gPlayerAvatar.unkB; - - collision = get_some_collision(var); - - if (collision > 0 && collision < 12) - { - if (collision == COLLISION_LEDGE_JUMP) - { - PlayerJumpLedge(var); - } - else - { - sub_80E6024(); - if (collision < 5 || collision > 8) - PlayerOnBikeCollide(var); - } - } - else - { - gUnknown_083DB5A4[gPlayerAvatar.bikeFrameCounter](var); - } -} - -static void MovePlayerOnAcroBike(u8 newDirection, u16 newKeys, u16 heldKeys) -{ - sAcroBikeTransitions[CheckMovementInputAcroBike(&newDirection, newKeys, heldKeys)](newDirection); -} - -static u8 CheckMovementInputAcroBike(u8 *newDirection, u16 newKeys, u16 heldKeys) -{ - return sAcroBikeInputHandlers[gPlayerAvatar.acroBikeState](newDirection, newKeys, heldKeys); -} - -static u8 AcroBikeHandleInputNormal(u8 *newDirection, u16 newKeys, u16 heldKeys) -{ - u8 direction = player_get_direction_upper_nybble(); - - gPlayerAvatar.bikeFrameCounter = 0; - if (*newDirection == DIR_NONE) - { - if (newKeys & B_BUTTON) - { - //We're standing still with the B button held. - //Do a wheelie. - *newDirection = direction; - gPlayerAvatar.running2 = 0; - gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; - return ACRO_TRANS_NORMAL_TO_WHEELIE; - } - else - { - *newDirection = direction; - gPlayerAvatar.running2 = 0; - return ACRO_TRANS_FACE_DIRECTION; - } - } - if (*newDirection == direction && (heldKeys & B_BUTTON) && gPlayerAvatar.unkB == 0) - { - gPlayerAvatar.unkB++; - gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_MOVING; - return 11; - } - if (*newDirection != direction && gPlayerAvatar.running2 != 2) - { - gPlayerAvatar.acroBikeState = ACRO_STATE_TURNING; - gPlayerAvatar.unk9 = *newDirection; - gPlayerAvatar.running2 = 0; - return CheckMovementInputAcroBike(newDirection, newKeys, heldKeys); - } - gPlayerAvatar.running2 = 2; - return 2; -} - -static u8 AcroBikeHandleInputTurning(u8 *newDirection, u16 newKeys, u16 heldKeys) -{ - u8 direction; - - *newDirection = gPlayerAvatar.unk9; - gPlayerAvatar.bikeFrameCounter++; - - //Wait 6 frames before actually changing direction - if (gPlayerAvatar.bikeFrameCounter > 6) - { - gPlayerAvatar.running2 = 1; - gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; - sub_80E6024(); - return 1; - } - direction = player_get_direction_upper_nybble(); - if (*newDirection == sub_80E5C2C()) - { - sub_80E6024(); - gPlayerAvatar.unkB = 1; - if (*newDirection == GetOppositeDirection(direction)) - { - gPlayerAvatar.acroBikeState = ACRO_STATE_6; - return 9; - } - else - { - gPlayerAvatar.running2 = 2; - gPlayerAvatar.acroBikeState = ACRO_STATE_5; - return 8; - } - } - *newDirection = direction; - return 0; -} - -static u8 AcroBikeHandleInputWheelieStanding(u8 *ptr, u16 newKeys, u16 heldKeys) -{ - u8 direction; - struct MapObject *playerMapObj; - - direction = player_get_direction_upper_nybble(); - playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - gPlayerAvatar.running2 = 0; - - if (heldKeys & B_BUTTON) - gPlayerAvatar.bikeFrameCounter++; - else - { - //B button was released. - gPlayerAvatar.bikeFrameCounter = 0; - if (!MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) - { - //Go back to normal on flat ground - *ptr = direction; - gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; - sub_80E6024(); - return 4; - } - } - if (gPlayerAvatar.bikeFrameCounter >= 40) - { - *ptr = direction; - gPlayerAvatar.acroBikeState = ACRO_STATE_BUNNY_HOP; - sub_80E6024(); - return 6; - } - if (*ptr == direction) - { - gPlayerAvatar.running2 = 2; - gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_MOVING; - sub_80E6024(); - return 10; - } - if (*ptr == 0) - { - *ptr = direction; - return 5; - } - gPlayerAvatar.running2 = 1; - return 5; -} - -static u8 AcroBikeHandleInputBunnyHop(u8 *ptr, u16 newKeys, u16 heldKeys) -{ - u8 direction; - struct MapObject *playerMapObj; - - direction = player_get_direction_upper_nybble(); - playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (!(heldKeys & B_BUTTON)) - { - //B button was released - sub_80E6024(); - if (MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) - { - //Do a standing wheelie on a bumpy slope - gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; - return CheckMovementInputAcroBike(ptr, newKeys, heldKeys); - } - else - { - //Go back to normal on flat ground - *ptr = direction; - gPlayerAvatar.running2 = 0; - gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; - return 4; - } - } - - //B Button is still held - - if (*ptr == DIR_NONE) - { - *ptr = direction; - gPlayerAvatar.running2 = 0; - return 6; - } - if (*ptr != direction && gPlayerAvatar.running2 != 2) - { - gPlayerAvatar.running2 = 1; - return 6; - } - gPlayerAvatar.running2 = 2; - return 7; -} - -static u8 AcroBikeHandleInputWheelieMoving(u8 *ptr, u16 newKeys, u16 heldKeys) -{ - u8 direction; - struct MapObject *playerMapObj; - - direction = player_get_direction_lower_nybble(); - playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (!(heldKeys & B_BUTTON)) - { - sub_80E6024(); - if (!MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) - { - gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; - if (*ptr == 0) - { - *ptr = direction; - gPlayerAvatar.running2 = 0; - return 4; - } - if (*ptr != direction && gPlayerAvatar.running2 != 2) - { - gPlayerAvatar.running2 = 0; - return 4; - } - gPlayerAvatar.running2 = 2; - return 12; - } - gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; - return CheckMovementInputAcroBike(ptr, newKeys, heldKeys); - } - if (*ptr == 0) - { - *ptr = direction; - gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; - gPlayerAvatar.running2 = 0; - sub_80E6024(); - return 5; - } - if (direction != *ptr && gPlayerAvatar.running2 != 2) - { - gPlayerAvatar.running2 = 0; - return 5; - } - gPlayerAvatar.running2 = 2; - return 10; -} - -static u8 AcroBikeHandleInputState5(u8 *ptr, u16 newKeys, u16 heldKeys) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - playerMapObj->mapobj_bit_9 = 0; - FieldObjectSetDirection(playerMapObj, playerMapObj->mapobj_unk_18); - gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; - return CheckMovementInputAcroBike(ptr, newKeys, heldKeys); -} - -static u8 AcroBikeHandleInputState6(u8 *ptr, u16 newKeys, u16 heldKeys) -{ - gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; - return CheckMovementInputAcroBike(ptr, newKeys, heldKeys); -} - -static void AcroBikeTransition_FaceDirection(u8 direction) -{ - PlayerFaceDirection(direction); -} - -static void AcroBikeTransition_80E5708(u8 direction) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - direction = playerMapObj->placeholder18; - PlayerFaceDirection(direction); -} - -static void AcroBikeTransition_80E5744(u8 direction) -{ - u8 collision; - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - { - AcroBikeTransition_FaceDirection(playerMapObj->placeholder18); - return; - } - collision = get_some_collision(direction); - if (collision > 0 && collision < 12) - { - if (collision == COLLISION_LEDGE_JUMP) - PlayerJumpLedge(direction); - else if (collision < 5 || collision > 8) - PlayerOnBikeCollide(direction); - } - else - { - npc_use_some_d2s(direction); - } -} - -static void AcroBikeTransition_NormalToWheelie(u8 direction) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - direction = playerMapObj->placeholder18; - PlayerStartWheelie(direction); -} - -static void AcroBikeTransition_80E57F8(u8 direction) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - direction = playerMapObj->placeholder18; - sub_8059534(direction); -} - -static void AcroBikeTransition_80E5834(u8 direction) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - direction = playerMapObj->placeholder18; - sub_8059504(direction); -} - -static void AcroBikeTransition_80E5870(u8 direction) -{ - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - direction = playerMapObj->placeholder18; - sub_805954C(direction); -} - -static void AcroBikeTransition_80E58AC(u8 direction) -{ - u8 var; - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - { - AcroBikeTransition_80E5870(playerMapObj->placeholder18); - return; - } - var = get_some_collision(direction); - //TODO: Try to get rid of this goto - if (var == 0 || var == 9) - { - goto derp; - } - else if (var == 6) - { - sub_8059594(direction); - } - else if (var < 5 || var > 8) - { - if (var <= 11) - { - AcroBikeTransition_80E5870(direction); - } - else - { - derp: - sub_8059570(direction); - } - } -} - -static void AcroBikeTransition_80E5920(u8 direction) -{ - u8 var; - struct MapObject *playerMapObj; - - var = get_some_collision(direction); - if (var != 0) - { - if (var == 7) - return; - if (var < 10) - { - AcroBikeTransition_80E5708(direction); - return; - } - if (sub_80E5EC0(var, direction) == 0) - { - AcroBikeTransition_80E5708(direction); - return; - } - } - playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - PlaySE(SE_JITE_PYOKO); - playerMapObj->mapobj_bit_9 = 1; - PlayerSetAnimId(sub_80608A4(direction), 2); -} - -static void AcroBikeTransition_80E5990(u8 direction) -{ - sub_80595B8(direction); -} - -static void AcroBikeTransition_80E59A0(u8 direction) -{ - u8 var; - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - { - sub_8059504(playerMapObj->placeholder18); - return; - } - var = get_some_collision(direction); - if (var > 0 && var < 12) - { - if (var == 6) - { - sub_8059594(direction); - } - else if (var == 9) - { - sub_8059504(direction); - } - else if (var <= 4) - { - if (MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) - sub_8059504(direction); - else - sub_80595DC(direction); //hit wall? - } - return; - } - sub_8059618(direction); - gPlayerAvatar.running2 = 2; -} - -static void AcroBikeTransition_80E5A30(u8 direction) -{ - u8 var; - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - { - PlayerStartWheelie(playerMapObj->placeholder18); - return; - } - var = get_some_collision(direction); - if (var > 0 && var < 12) - { - if (var == 6) - { - sub_8059594(direction); - } - else if (var == 9) - { - sub_8059504(direction); - } - else if (var <= 4) - { - if (MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) - sub_8059504(direction); - else - sub_80595DC(direction); //hit wall? - } - return; - } - sub_8059600(direction); - gPlayerAvatar.running2 = 2; -} - -static void AcroBikeTransition_80E5AC0(u8 direction) -{ - u8 var; - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - { - sub_8059534(playerMapObj->placeholder18); - return; - } - var = get_some_collision(direction); - if (var > 0 && var < 12) - { - if (var == 6) - PlayerJumpLedge(direction); - else if (var < 5 || var > 8) - sub_8059534(direction); - return; - } - sub_8059630(direction); -} - -void sub_80E5B38(u16 a, u16 b) -{ - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE) - sub_80E5B60(a, b); -} - -static void sub_80E5B60(u16 unused, u16 b) -{ - u8 var; - - var = sub_80E5CF4(b); - if (var == (gPlayerAvatar.unkC & 0xF)) - { - if (gPlayerAvatar.unk14[0] < 0xFF) - gPlayerAvatar.unk14[0]++; - } - else - { - sub_80E5C7C(var); - gPlayerAvatar.unkB = 0; - } - - var = b & 0xF; - if (var == (gPlayerAvatar.unk10 & 0xF)) - { - if (gPlayerAvatar.unk1C[0] < 0xFF) - gPlayerAvatar.unk1C[0]++; - } - else - { - sub_80E5CB8(var); - gPlayerAvatar.unkB = 0; - } -} - -static bool8 sub_80E5BC8(const u8 *a, const u8 *b) -{ - u8 i; - - for (i = 0; a[i] != 0; i++) - { - if (gPlayerAvatar.unk14[i] > a[i]) - return FALSE; - } - for (i = 0; b[i] != 0; i++) - { - if (gPlayerAvatar.unk1C[i] > b[i]) - return FALSE; - } - return TRUE; -} - -static u8 sub_80E5C2C(void) -{ - u32 i; - - for (i = 0; i < 4; i++) - { - const struct UnknownStruct1 *s = &gUnknown_083DB608[i]; - u32 r1 = gPlayerAvatar.unkC; - u32 r2 = gPlayerAvatar.unk10; - - r1 &= s->unk8; - r2 &= s->unkC; - if (r1 == s->unk0 && r2 == s->unk4 && sub_80E5BC8(s->unk10, s->unk14)) - return s->unk18; - } - return 0; -} - -static void sub_80E5C7C(u8 a) -{ - u8 i; - - gPlayerAvatar.unkC = (gPlayerAvatar.unkC << 4) | (a & 0xF); - - for (i = 7; i != 0; i--) - gPlayerAvatar.unk14[i] = gPlayerAvatar.unk14[i - 1]; - gPlayerAvatar.unk14[0] = 1; -} - -static void sub_80E5CB8(u8 a) -{ - u8 i; - - gPlayerAvatar.unk10 = (gPlayerAvatar.unk10 << 4) | (a & 0xF); - - for (i = 7; i != 0; i--) - gPlayerAvatar.unk1C[i] = gPlayerAvatar.unk1C[i - 1]; - gPlayerAvatar.unk1C[0] = 1; -} - -static u8 sub_80E5CF4(u16 a) -{ - if (a & 0x40) - return 2; - if (a & 0x80) - return 1; - if (a & 0x20) - return 3; - if (a & 0x10) - return 4; - return 0; -} - -static u8 get_some_collision(u8 direction) -{ - s16 x; - s16 y; - u8 metatitleBehavior; - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - - x = playerMapObj->coords2.x; - y = playerMapObj->coords2.y; - MoveCoords(direction, &x, &y); - metatitleBehavior = MapGridGetMetatileBehaviorAt(x, y); - return sub_80E5DA0(playerMapObj, x, y, direction, metatitleBehavior); -} - -static u8 sub_80E5DA0(struct MapObject *mapObject, s16 x, s16 y, u8 direction, u8 metatitleBehavior) -{ - u8 collision = CheckForFieldObjectCollision(mapObject, x, y, direction, metatitleBehavior); - - if (collision > 4) - return collision; - - if (collision == 0 && IsRunningDisallowedByMetatile(metatitleBehavior)) - collision = 2; - - if (collision) - sub_80E5E4C(); - - return collision; -} - -bool8 IsRunningDisallowed(u8 tile) -{ - if (IsRunningDisallowedByMetatile(tile) != FALSE || gMapHeader.mapType == MAP_TYPE_INDOOR) - return TRUE; - else - return FALSE; -} - -static bool8 IsRunningDisallowedByMetatile(u8 tile) -{ - if (MetatileBehavior_IsRunningDisallowed(tile)) - return TRUE; - if (MetatileBehavior_IsFortreeBridge(tile) && (PlayerGetZCoord() & 1) == 0) - return TRUE; - return FALSE; -} - -static void sub_80E5E4C(void) -{ - if (gUnknown_02039250 != 0 && gUnknown_02039251 < 100) - gUnknown_02039251++; -} - -static bool8 CanBikeFaceDirOnMetatile(u8 direction, u8 tile) -{ - if (direction == DIR_EAST || direction == DIR_WEST) - { - //Bike cannot face east or west on a vertical rail - if (MetatileBehavior_IsIsolatedVerticalRail(tile) - || MetatileBehavior_IsVerticalRail(tile)) - return FALSE; - } - else - { - //Bike cannot face north or south on a horizontal rail - if (MetatileBehavior_IsIsolatedHorizontalRail(tile) - || MetatileBehavior_IsHorizontalRail(tile)) - return FALSE; - } - return TRUE; -} - -static bool8 sub_80E5EC0(u8 var1, u8 direction) -{ - if (direction == DIR_NORTH || direction == DIR_SOUTH) - { - if (var1 == 10 || var1 == 12) - return FALSE; - } - else if (var1 == 11 || var1 == 13) - { - return FALSE; - } - - return TRUE; -} - -bool8 IsBikingDisallowedByPlayer(void) -{ - s16 x, y; - u8 tileBehavior; - - if (!(gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_4))) - { - PlayerGetDestCoords(&x, &y); - tileBehavior = MapGridGetMetatileBehaviorAt(x, y); - if (!IsRunningDisallowedByMetatile(tileBehavior)) - return FALSE; - } - return TRUE; -} - -bool8 player_should_look_direction_be_enforced_upon_movement(void) -{ - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE) != FALSE && MetatileBehavior_IsBumpySlope(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E) != FALSE) - return FALSE; - else - return TRUE; -} - -void GetOnOffBike(u8 var) -{ - gUnknown_0202E854 = 0; - - if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) - { - SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); - sav1_reset_battle_music_maybe(); - sub_8053E90(); - } - else - { - SetPlayerAvatarTransitionFlags(var); - sav1_set_battle_music_maybe(BGM_CYCLING); - Overworld_ChangeMusicTo(BGM_CYCLING); - } -} - -void BikeClearState(int var1, int var2) -{ - u8 i; - - gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; - gPlayerAvatar.unk9 = 0; - gPlayerAvatar.bikeFrameCounter = 0; - gPlayerAvatar.unkB = 0; - gPlayerAvatar.unkC = var1; - gPlayerAvatar.unk10 = var2; - - for (i = 0; i < 8; i++) - gPlayerAvatar.unk14[i] = 0; - - for (i = 0; i < 8; i++) - gPlayerAvatar.unk1C[i] = 0; -} - -void sub_80E6010(u8 var) -{ - gPlayerAvatar.bikeFrameCounter = var; - gPlayerAvatar.unkB = gPlayerAvatar.bikeFrameCounter + (gPlayerAvatar.bikeFrameCounter >> 1); // lazy way of multiplying by 1.5. -} - -static void sub_80E6024(void) -{ - gPlayerAvatar.bikeFrameCounter = 0; - gPlayerAvatar.unkB = 0; -} - -s16 GetPlayerSpeed(void) -{ - // because the player pressed a direction, it won't ever return a speed of 0 since this function returns the player's current speed. - s16 machSpeeds[3]; - - memcpy(machSpeeds, gMachBikeSpeeds, sizeof(machSpeeds)); - - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE) - return machSpeeds[gPlayerAvatar.bikeFrameCounter]; - else if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE) - return SPEED_FASTER; - else if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_DASH)) - return SPEED_FAST; - else - return SPEED_NORMAL; -} - -void sub_80E6084(void) -{ - s16 x, y; - u8 tileBehavior; - - if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE) - { - PlayerGetDestCoords(&x, &y); - tileBehavior = MapGridGetMetatileBehaviorAt(x, y); - if (MetatileBehavior_IsBumpySlope(tileBehavior)) - { - gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; - sub_8059C94(player_get_direction_upper_nybble()); - } - } -} diff --git a/src/data/battle_tower/level_100_mons.h b/src/data/battle_tower/level_100_mons.h new file mode 100644 index 000000000..4f2b711ee --- /dev/null +++ b/src/data/battle_tower/level_100_mons.h @@ -0,0 +1,3903 @@ +const struct BattleTowerPokemon gBattleTowerLevel100Mons[] = +{ + { + .species = SPECIES_LINOONE, + .heldItem = BATTLE_TOWER_ITEM_RAWST_BERRY, + .teamFlags = 0x42, + .moves = { + MOVE_SLASH, + MOVE_GROWL, + MOVE_TAIL_WHIP, + MOVE_SAND_ATTACK + }, + .evSpread = F_EV_SPREAD_SPEED, + .nature = NATURE_SERIOUS, + }, + { + .species = SPECIES_MIGHTYENA, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x41, + .moves = { + MOVE_BITE, + MOVE_HOWL, + MOVE_ODOR_SLEUTH, + MOVE_SCARY_FACE + }, + .evSpread = F_EV_SPREAD_ATTACK, + .nature = NATURE_NAIVE, + }, + { + .species = SPECIES_BEAUTIFLY, + .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, + .teamFlags = 0x41, + .moves = { + MOVE_GIGA_DRAIN, + MOVE_GUST, + MOVE_STUN_SPORE, + MOVE_PROTECT + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_CAREFUL, + }, + { + .species = SPECIES_DUSTOX, + .heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY, + .teamFlags = 0x41, + .moves = { + MOVE_PSYBEAM, + MOVE_GUST, + MOVE_DOUBLE_TEAM, + MOVE_SILVER_WIND + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_RELAXED, + }, + { + .species = SPECIES_LOMBRE, + .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, + .teamFlags = 0x03, + .moves = { + MOVE_ASTONISH, + MOVE_GROWL, + MOVE_MEGA_DRAIN, + MOVE_SURF + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_LONELY, + }, + { + .species = SPECIES_NUZLEAF, + .heldItem = BATTLE_TOWER_ITEM_WHITE_HERB, + .teamFlags = 0x01, + .moves = { + MOVE_BULLET_SEED, + MOVE_RAZOR_WIND, + MOVE_FAINT_ATTACK, + MOVE_GROWTH + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, + .nature = NATURE_DOCILE, + }, + { + .species = SPECIES_SWELLOW, + .heldItem = BATTLE_TOWER_ITEM_SHARP_BEAK, + .teamFlags = 0x42, + .moves = { + MOVE_AERIAL_ACE, + MOVE_GROWL, + MOVE_ENDEAVOR, + MOVE_FOCUS_ENERGY + }, + .evSpread = F_EV_SPREAD_ATTACK, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_PELIPPER, + .heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER, + .teamFlags = 0x02, + .moves = { + MOVE_SURF, + MOVE_WATER_SPORT, + MOVE_PROTECT, + MOVE_SUPERSONIC + }, + .evSpread = F_EV_SPREAD_SP_ATTACK, + .nature = NATURE_MILD, + }, + { + .species = SPECIES_BRELOOM, + .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, + .teamFlags = 0x42, + .moves = { + MOVE_MACH_PUNCH, + MOVE_MEGA_DRAIN, + MOVE_HEADBUTT, + MOVE_STUN_SPORE + }, + .evSpread = F_EV_SPREAD_ATTACK, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_NINJASK, + .heldItem = BATTLE_TOWER_ITEM_RAWST_BERRY, + .teamFlags = 0x41, + .moves = { + MOVE_SCRATCH, + MOVE_SCREECH, + MOVE_LEECH_LIFE, + MOVE_FLASH + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_SERIOUS, + }, + { + .species = SPECIES_CROBAT, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x01, + .moves = { + MOVE_BITE, + MOVE_FLY, + MOVE_SUPERSONIC, + MOVE_HAZE + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_IMPISH, + }, + { + .species = SPECIES_MAWILE, + .heldItem = BATTLE_TOWER_ITEM_METAL_COAT, + .teamFlags = 0x03, + .moves = { + MOVE_VICE_GRIP, + MOVE_SWEET_SCENT, + MOVE_ASTONISH, + MOVE_STRENGTH + }, + .evSpread = F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_NOSEPASS, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x01, + .moves = { + MOVE_ROCK_THROW, + MOVE_SANDSTORM, + MOVE_HARDEN, + MOVE_PROTECT + }, + .evSpread = F_EV_SPREAD_ATTACK, + .nature = NATURE_IMPISH, + }, + { + .species = SPECIES_DELCATTY, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x42, + .moves = { + MOVE_DOUBLE_SLAP, + MOVE_TAIL_WHIP, + MOVE_ATTRACT, + MOVE_CHARM + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, + .nature = NATURE_BOLD, + }, + { + .species = SPECIES_CAMERUPT, + .heldItem = BATTLE_TOWER_ITEM_CHARCOAL, + .teamFlags = 0x01, + .moves = { + MOVE_EMBER, + MOVE_TAKE_DOWN, + MOVE_GROWL, + MOVE_SANDSTORM + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE, + .nature = NATURE_RASH, + }, + { + .species = SPECIES_MUK, + .heldItem = BATTLE_TOWER_ITEM_ORAN_BERRY, + .teamFlags = 0x01, + .moves = { + MOVE_POISON_GAS, + MOVE_MINIMIZE, + MOVE_SLUDGE, + MOVE_SCREECH + }, + .evSpread = F_EV_SPREAD_HP, + .nature = NATURE_CALM, + }, + { + .species = SPECIES_SANDSLASH, + .heldItem = BATTLE_TOWER_ITEM_SOFT_SAND, + .teamFlags = 0x03, + .moves = { + MOVE_SLASH, + MOVE_SAND_ATTACK, + MOVE_DEFENSE_CURL, + MOVE_SWIFT + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_DOCILE, + }, + { + .species = SPECIES_SPINDA, + .heldItem = BATTLE_TOWER_ITEM_SILK_SCARF, + .teamFlags = 0x42, + .moves = { + MOVE_UPROAR, + MOVE_WATER_PULSE, + MOVE_THRASH, + MOVE_SAFEGUARD + }, + .evSpread = F_EV_SPREAD_SPEED, + .nature = NATURE_TIMID, + }, + { + .species = SPECIES_WHISCASH, + .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, + .teamFlags = 0x01, + .moves = { + MOVE_TICKLE, + MOVE_MUD_SPORT, + MOVE_WATER_GUN, + MOVE_WATER_SPORT + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_HASTY, + }, + { + .species = SPECIES_CACTURNE, + .heldItem = BATTLE_TOWER_ITEM_POISON_BARB, + .teamFlags = 0x01, + .moves = { + MOVE_POISON_STING, + MOVE_PIN_MISSILE, + MOVE_ABSORB, + MOVE_COTTON_SPORE + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, + .nature = NATURE_NAIVE, + }, + { + .species = SPECIES_JIGGLYPUFF, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x42, + .moves = { + MOVE_SING, + MOVE_ROLLOUT, + MOVE_POUND, + MOVE_LIGHT_SCREEN + }, + .evSpread = F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_MARILL, + .heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER, + .teamFlags = 0x42, + .moves = { + MOVE_BUBBLE_BEAM, + MOVE_DEFENSE_CURL, + MOVE_RAIN_DANCE, + MOVE_IRON_TAIL + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_MAGNETON, + .heldItem = BATTLE_TOWER_ITEM_RAWST_BERRY, + .teamFlags = 0x01, + .moves = { + MOVE_THUNDER_SHOCK, + MOVE_SUPERSONIC, + MOVE_FLASH, + MOVE_SCREECH + }, + .evSpread = F_EV_SPREAD_SPEED, + .nature = NATURE_CAREFUL, + }, + { + .species = SPECIES_CARVANHA, + .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, + .teamFlags = 0x01, + .moves = { + MOVE_BITE, + MOVE_RAGE, + MOVE_SCARY_FACE, + MOVE_LEER + }, + .evSpread = F_EV_SPREAD_ATTACK, + .nature = NATURE_QUIRKY, + }, + { + .species = SPECIES_KECLEON, + .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, + .teamFlags = 0x03, + .moves = { + MOVE_THIEF, + MOVE_LICK, + MOVE_BIND, + MOVE_FURY_SWIPES + }, + .evSpread = F_EV_SPREAD_DEFENSE, + .nature = NATURE_JOLLY, + }, + { + .species = SPECIES_NINETALES, + .heldItem = BATTLE_TOWER_ITEM_CHARCOAL, + .teamFlags = 0x02, + .moves = { + MOVE_EMBER, + MOVE_CONFUSE_RAY, + MOVE_FIRE_SPIN, + MOVE_SAFEGUARD + }, + .evSpread = F_EV_SPREAD_SP_ATTACK, + .nature = NATURE_LONELY, + }, + { + .species = SPECIES_RAICHU, + .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, + .teamFlags = 0x42, + .moves = { + MOVE_SHOCK_WAVE, + MOVE_GROWL, + MOVE_DOUBLE_TEAM, + MOVE_LIGHT_SCREEN + }, + .evSpread = F_EV_SPREAD_DEFENSE, + .nature = NATURE_NAIVE, + }, + { + .species = SPECIES_SEALEO, + .heldItem = BATTLE_TOWER_ITEM_NEVER_MELT_ICE, + .teamFlags = 0x01, + .moves = { + MOVE_ICE_BALL, + MOVE_WATER_GUN, + MOVE_ENCORE, + MOVE_HAIL + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, + .nature = NATURE_LAX, + }, + { + .species = SPECIES_GRAVELER, + .heldItem = BATTLE_TOWER_ITEM_HARD_STONE, + .teamFlags = 0x01, + .moves = { + MOVE_ROCK_THROW, + MOVE_MUD_SPORT, + MOVE_SANDSTORM, + MOVE_ROCK_TOMB + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_SHUPPET, + .heldItem = BATTLE_TOWER_ITEM_SPELL_TAG, + .teamFlags = 0x03, + .moves = { + MOVE_NIGHT_SHADE, + MOVE_WILL_O_WISP, + MOVE_SCREECH, + MOVE_KNOCK_OFF + }, + .evSpread = F_EV_SPREAD_SP_ATTACK, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_LUVDISC, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x0A, + .moves = { + MOVE_ATTRACT, + MOVE_FLAIL, + MOVE_SWEET_KISS, + MOVE_WATER_PULSE + }, + .evSpread = F_EV_SPREAD_SP_ATTACK, + .nature = NATURE_ADAMANT, + }, + { + .species = SPECIES_LANTURN, + .heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY, + .teamFlags = 0x0A, + .moves = { + MOVE_THUNDER_WAVE, + MOVE_SUPERSONIC, + MOVE_WATER_GUN, + MOVE_SPARK + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_BOLD, + }, + { + .species = SPECIES_CORSOLA, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x0A, + .moves = { + MOVE_MIRROR_COAT, + MOVE_BUBBLE, + MOVE_HARDEN, + MOVE_LIGHT_SCREEN + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, + .nature = NATURE_TIMID, + }, + { + .species = SPECIES_WAILMER, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x05, + .moves = { + MOVE_SURF, + MOVE_ROAR, + MOVE_GROWL, + MOVE_MIST + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_SASSY, + }, + { + .species = SPECIES_RHYDON, + .heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND, + .teamFlags = 0x05, + .moves = { + MOVE_TAKE_DOWN, + MOVE_SCARY_FACE, + MOVE_TAIL_WHIP, + MOVE_ROAR + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_DODRIO, + .heldItem = BATTLE_TOWER_ITEM_SHARP_BEAK, + .teamFlags = 0x05, + .moves = { + MOVE_FURY_ATTACK, + MOVE_PURSUIT, + MOVE_AERIAL_ACE, + MOVE_AGILITY + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_GOLDUCK, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0x05, + .moves = { + MOVE_FURY_SWIPES, + MOVE_TAIL_WHIP, + MOVE_DISABLE, + MOVE_PSYCH_UP + }, + .evSpread = F_EV_SPREAD_ATTACK, + .nature = NATURE_RELAXED, + }, + { + .species = SPECIES_BELLOSSOM, + .heldItem = BATTLE_TOWER_ITEM_MIRACLE_SEED, + .teamFlags = 0x0A, + .moves = { + MOVE_GIGA_DRAIN, + MOVE_POISON_POWDER, + MOVE_STUN_SPORE, + MOVE_ACID + }, + .evSpread = F_EV_SPREAD_SP_ATTACK, + .nature = NATURE_BOLD, + }, + { + .species = SPECIES_TROPIUS, + .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, + .teamFlags = 0x05, + .moves = { + MOVE_STOMP, + MOVE_RAZOR_LEAF, + MOVE_GUST, + MOVE_SYNTHESIS + }, + .evSpread = F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_SABLEYE, + .heldItem = BATTLE_TOWER_ITEM_SPELL_TAG, + .teamFlags = 0x0A, + .moves = { + MOVE_NIGHT_SHADE, + MOVE_FAKE_OUT, + MOVE_PSYCH_UP, + MOVE_DETECT + }, + .evSpread = F_EV_SPREAD_SPEED, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_ELECTRODE, + .heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND, + .teamFlags = 0x03, + .moves = { + MOVE_SONIC_BOOM, + MOVE_SCREECH, + MOVE_SPARK, + MOVE_SELF_DESTRUCT + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE, + .nature = NATURE_QUIRKY, + }, + { + .species = SPECIES_TENTACRUEL, + .heldItem = BATTLE_TOWER_ITEM_POISON_BARB, + .teamFlags = 0x01, + .moves = { + MOVE_ACID, + MOVE_WATER_PULSE, + MOVE_BARRIER, + MOVE_WRAP + }, + .evSpread = F_EV_SPREAD_SPEED, + .nature = NATURE_HASTY, + }, + { + .species = SPECIES_CLAYDOL, + .heldItem = BATTLE_TOWER_ITEM_SOFT_SAND, + .teamFlags = 0x05, + .moves = { + MOVE_ANCIENT_POWER, + MOVE_MUD_SLAP, + MOVE_RAPID_SPIN, + MOVE_CONFUSION + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_GRUMPIG, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x0A, + .moves = { + MOVE_PSYBEAM, + MOVE_PSYCH_UP, + MOVE_BOUNCE, + MOVE_MAGIC_COAT + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE, + .nature = NATURE_NAUGHTY, + }, + { + .species = SPECIES_CRAWDAUNT, + .heldItem = BATTLE_TOWER_ITEM_MENTAL_HERB, + .teamFlags = 0x05, + .moves = { + MOVE_CRABHAMMER, + MOVE_BUBBLE_BEAM, + MOVE_BRICK_BREAK, + MOVE_PROTECT + }, + .evSpread = F_EV_SPREAD_ATTACK, + .nature = NATURE_CALM, + }, + { + .species = SPECIES_SEVIPER, + .heldItem = BATTLE_TOWER_ITEM_POISON_BARB, + .teamFlags = 0x01, + .moves = { + MOVE_POISON_TAIL, + MOVE_GLARE, + MOVE_WRAP, + MOVE_THIEF + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, + .nature = NATURE_CAREFUL, + }, + { + .species = SPECIES_ZANGOOSE, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x05, + .moves = { + MOVE_FURY_CUTTER, + MOVE_LEER, + MOVE_QUICK_ATTACK, + MOVE_DETECT + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_ALTARIA, + .heldItem = BATTLE_TOWER_ITEM_DRAGON_FANG, + .teamFlags = 0x03, + .moves = { + MOVE_DRAGON_BREATH, + MOVE_SING, + MOVE_SAFEGUARD, + MOVE_TAKE_DOWN + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_ROSELIA, + .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, + .teamFlags = 0x0A, + .moves = { + MOVE_LEECH_SEED, + MOVE_MEGA_DRAIN, + MOVE_GROWTH, + MOVE_STUN_SPORE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, + .nature = NATURE_NAUGHTY, + }, + { + .species = SPECIES_VOLBEAT, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x09, + .moves = { + MOVE_SIGNAL_BEAM, + MOVE_CONFUSE_RAY, + MOVE_DOUBLE_TEAM, + MOVE_LIGHT_SCREEN + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_ILLUMISE, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x09, + .moves = { + MOVE_CHARM, + MOVE_ENCORE, + MOVE_SOLAR_BEAM, + MOVE_ATTRACT + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_MANECTRIC, + .heldItem = BATTLE_TOWER_ITEM_MAGNET, + .teamFlags = 0x03, + .moves = { + MOVE_BITE, + MOVE_HOWL, + MOVE_THUNDER_WAVE, + MOVE_SPARK + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_SERIOUS, + }, + { + .species = SPECIES_MAWILE, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x0A, + .moves = { + MOVE_CRUNCH, + MOVE_IRON_DEFENSE, + MOVE_TORMENT, + MOVE_SANDSTORM + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_RASH, + }, + { + .species = SPECIES_HARIYAMA, + .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, + .teamFlags = 0x05, + .moves = { + MOVE_ARM_THRUST, + MOVE_FAKE_OUT, + MOVE_WHIRLWIND, + MOVE_REVERSAL + }, + .evSpread = F_EV_SPREAD_ATTACK, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_SKARMORY, + .heldItem = BATTLE_TOWER_ITEM_METAL_COAT, + .teamFlags = 0x01, + .moves = { + MOVE_STEEL_WING, + MOVE_AGILITY, + MOVE_TAUNT, + MOVE_FLY + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_NAIVE, + }, + { + .species = SPECIES_TORKOAL, + .heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY, + .teamFlags = 0x03, + .moves = { + MOVE_FIRE_SPIN, + MOVE_SMOKESCREEN, + MOVE_BODY_SLAM, + MOVE_AMNESIA + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_MILD, + }, + { + .species = SPECIES_GYARADOS, + .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, + .teamFlags = 0x05, + .moves = { + MOVE_THRASH, + MOVE_DRAGON_RAGE, + MOVE_TWISTER, + MOVE_HYDRO_PUMP + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_QUIRKY, + }, + { + .species = SPECIES_MIGHTYENA, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x05, + .moves = { + MOVE_CRUNCH, + MOVE_HOWL, + MOVE_IRON_TAIL, + MOVE_TORMENT + }, + .evSpread = F_EV_SPREAD_SP_ATTACK, + .nature = NATURE_QUIRKY, + }, + { + .species = SPECIES_LINOONE, + .heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY, + .teamFlags = 0x06, + .moves = { + MOVE_SLASH, + MOVE_ATTRACT, + MOVE_SHOCK_WAVE, + MOVE_TOXIC + }, + .evSpread = F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_MASQUERAIN, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x0A, + .moves = { + MOVE_TOXIC, + MOVE_STUN_SPORE, + MOVE_SUNNY_DAY, + MOVE_SOLAR_BEAM + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_LAX, + }, + { + .species = SPECIES_SCEPTILE, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x06, + .moves = { + MOVE_BULLET_SEED, + MOVE_SLAM, + MOVE_SCREECH, + MOVE_DETECT + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_RELAXED, + }, + { + .species = SPECIES_BLAZIKEN, + .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, + .teamFlags = 0x06, + .moves = { + MOVE_DOUBLE_KICK, + MOVE_FLAMETHROWER, + MOVE_DOUBLE_TEAM, + MOVE_ROAR + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_SWAMPERT, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x49, + .moves = { + MOVE_SURF, + MOVE_MUD_SHOT, + MOVE_MUD_SPORT, + MOVE_RAIN_DANCE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_SALAMENCE, + .heldItem = BATTLE_TOWER_ITEM_DRAGON_FANG, + .teamFlags = 0x49, + .moves = { + MOVE_DRAGON_BREATH, + MOVE_FLY, + MOVE_TOXIC, + MOVE_FACADE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_CALM, + }, + { + .species = SPECIES_KINGDRA, + .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, + .teamFlags = 0x49, + .moves = { + MOVE_SURF, + MOVE_ICE_BEAM, + MOVE_SMOKESCREEN, + MOVE_RAIN_DANCE + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_SERIOUS, + }, + { + .species = SPECIES_CORSOLA, + .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, + .teamFlags = 0x03, + .moves = { + MOVE_ANCIENT_POWER, + MOVE_MIRROR_COAT, + MOVE_SAFEGUARD, + MOVE_REFLECT + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, + .nature = NATURE_BOLD, + }, + { + .species = SPECIES_RHYDON, + .heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND, + .teamFlags = 0x41, + .moves = { + MOVE_EARTHQUAKE, + MOVE_IRON_TAIL, + MOVE_ROAR, + MOVE_THUNDERBOLT + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HASTY, + }, + { + .species = SPECIES_HERACROSS, + .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, + .teamFlags = 0x06, + .moves = { + MOVE_MEGAHORN, + MOVE_COUNTER, + MOVE_PROTECT, + MOVE_LEER + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_GIRAFARIG, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x09, + .moves = { + MOVE_PSYCHIC, + MOVE_CRUNCH, + MOVE_BATON_PASS, + MOVE_AGILITY + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_ADAMANT, + }, + { + .species = SPECIES_XATU, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x09, + .moves = { + MOVE_PSYCHIC, + MOVE_FLY, + MOVE_CONFUSE_RAY, + MOVE_TOXIC + }, + .evSpread = F_EV_SPREAD_SPEED, + .nature = NATURE_BASHFUL, + }, + { + .species = SPECIES_DODRIO, + .heldItem = BATTLE_TOWER_ITEM_SHARP_BEAK, + .teamFlags = 0x03, + .moves = { + MOVE_DRILL_PECK, + MOVE_TRI_ATTACK, + MOVE_PURSUIT, + MOVE_TORMENT + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_SERIOUS, + }, + { + .species = SPECIES_VILEPLUME, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x89, + .moves = { + MOVE_POISON_POWDER, + MOVE_STUN_SPORE, + MOVE_SLEEP_POWDER, + MOVE_PETAL_DANCE + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_MODEST, + }, + { + .species = SPECIES_MEDICHAM, + .heldItem = BATTLE_TOWER_ITEM_TWISTED_SPOON, + .teamFlags = 0x06, + .moves = { + MOVE_FOCUS_PUNCH, + MOVE_LIGHT_SCREEN, + MOVE_BULK_UP, + MOVE_PSYCHIC + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_JOLLY, + }, + { + .species = SPECIES_ABSOL, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x06, + .moves = { + MOVE_SLASH, + MOVE_SWORDS_DANCE, + MOVE_DOUBLE_TEAM, + MOVE_ATTRACT + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_DUSCLOPS, + .heldItem = BATTLE_TOWER_ITEM_SPELL_TAG, + .teamFlags = 0x4B, + .moves = { + MOVE_CONFUSE_RAY, + MOVE_WILL_O_WISP, + MOVE_NIGHT_SHADE, + MOVE_DISABLE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, + .nature = NATURE_LAX, + }, + { + .species = SPECIES_SHUPPET, + .heldItem = BATTLE_TOWER_ITEM_SPELL_TAG, + .teamFlags = 0x43, + .moves = { + MOVE_GRUDGE, + MOVE_SHADOW_BALL, + MOVE_CURSE, + MOVE_KNOCK_OFF + }, + .evSpread = F_EV_SPREAD_SP_ATTACK, + .nature = NATURE_IMPISH, + }, + { + .species = SPECIES_CASTFORM, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x82, + .moves = { + MOVE_WEATHER_BALL, + MOVE_HAIL, + MOVE_SUNNY_DAY, + MOVE_RAIN_DANCE + }, + .evSpread = F_EV_SPREAD_SPEED, + .nature = NATURE_MODEST, + }, + { + .species = SPECIES_MILOTIC, + .heldItem = BATTLE_TOWER_ITEM_DRAGON_FANG, + .teamFlags = 0x02, + .moves = { + MOVE_SURF, + MOVE_REFRESH, + MOVE_RECOVER, + MOVE_RAIN_DANCE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, + .nature = NATURE_ADAMANT, + }, + { + .species = SPECIES_SHARPEDO, + .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, + .teamFlags = 0x01, + .moves = { + MOVE_CRUNCH, + MOVE_FOCUS_ENERGY, + MOVE_SCARY_FACE, + MOVE_SCREECH + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_LAX, + }, + { + .species = SPECIES_FLYGON, + .heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY, + .teamFlags = 0x06, + .moves = { + MOVE_EARTHQUAKE, + MOVE_SAND_ATTACK, + MOVE_DRAGON_BREATH, + MOVE_SAND_TOMB + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_NAUGHTY, + }, + { + .species = SPECIES_TRAPINCH, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x09, + .moves = { + MOVE_TOXIC, + MOVE_SAND_TOMB, + MOVE_CRUNCH, + MOVE_DOUBLE_TEAM + }, + .evSpread = F_EV_SPREAD_ATTACK, + .nature = NATURE_DOCILE, + }, + { + .species = SPECIES_LUNATONE, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x43, + .moves = { + MOVE_PSYCHIC, + MOVE_ROCK_THROW, + MOVE_HYPNOSIS, + MOVE_LIGHT_SCREEN + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_SOLROCK, + .heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY, + .teamFlags = 0x43, + .moves = { + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, + MOVE_COSMIC_POWER, + MOVE_CALM_MIND + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_BALTOY, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x43, + .moves = { + MOVE_PSYCHIC, + MOVE_EARTHQUAKE, + MOVE_REFLECT, + MOVE_SELF_DESTRUCT + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_BASHFUL, + }, + { + .species = SPECIES_CRAWDAUNT, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0x06, + .moves = { + MOVE_CRABHAMMER, + MOVE_SURF, + MOVE_PROTECT, + MOVE_BRICK_BREAK + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_RASH, + }, + { + .species = SPECIES_WHISCASH, + .heldItem = BATTLE_TOWER_ITEM_ASPEAR_BERRY, + .teamFlags = 0x06, + .moves = { + MOVE_EARTHQUAKE, + MOVE_TICKLE, + MOVE_AMNESIA, + MOVE_SURF + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_SEVIPER, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x09, + .moves = { + MOVE_POISON_TAIL, + MOVE_CRUNCH, + MOVE_GIGA_DRAIN, + MOVE_HAZE + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, + .nature = NATURE_RELAXED, + }, + { + .species = SPECIES_MAGCARGO, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x89, + .moves = { + MOVE_FLAMETHROWER, + MOVE_LIGHT_SCREEN, + MOVE_AMNESIA, + MOVE_ROCK_SLIDE + }, + .evSpread = F_EV_SPREAD_ATTACK, + .nature = NATURE_SASSY, + }, + { + .species = SPECIES_MACHAMP, + .heldItem = BATTLE_TOWER_ITEM_BLACK_BELT, + .teamFlags = 0x09, + .moves = { + MOVE_KARATE_CHOP, + MOVE_SEISMIC_TOSS, + MOVE_BRICK_BREAK, + MOVE_LOW_KICK + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_SWALOT, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x86, + .moves = { + MOVE_YAWN, + MOVE_WATER_PULSE, + MOVE_SHADOW_BALL, + MOVE_SLUDGE_BOMB + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_NAUGHTY, + }, + { + .species = SPECIES_SCEPTILE, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x0C, + .moves = { + MOVE_LEAF_BLADE, + MOVE_GIGA_DRAIN, + MOVE_FURY_CUTTER, + MOVE_DETECT + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_NAIVE, + }, + { + .species = SPECIES_BLAZIKEN, + .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, + .teamFlags = 0x0C, + .moves = { + MOVE_BLAZE_KICK, + MOVE_FLAMETHROWER, + MOVE_PROTECT, + MOVE_QUICK_ATTACK + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_DOCILE, + }, + { + .species = SPECIES_SWAMPERT, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x4C, + .moves = { + MOVE_SURF, + MOVE_MUD_SHOT, + MOVE_MUD_SLAP, + MOVE_DOUBLE_TEAM + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_MIGHTYENA, + .heldItem = BATTLE_TOWER_ITEM_BLACK_GLASSES, + .teamFlags = 0x04, + .moves = { + MOVE_CRUNCH, + MOVE_HOWL, + MOVE_SWAGGER, + MOVE_SHADOW_BALL + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_CALM, + }, + { + .species = SPECIES_LINOONE, + .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, + .teamFlags = 0x04, + .moves = { + MOVE_SLASH, + MOVE_REST, + MOVE_BELLY_DRUM, + MOVE_THUNDERBOLT + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_MILD, + }, + { + .species = SPECIES_BEAUTIFLY, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x08, + .moves = { + MOVE_GIGA_DRAIN, + MOVE_ATTRACT, + MOVE_MORNING_SUN, + MOVE_STUN_SPORE + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HASTY, + }, + { + .species = SPECIES_DUSTOX, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x08, + .moves = { + MOVE_PSYCHIC, + MOVE_SILVER_WIND, + MOVE_MOONLIGHT, + MOVE_TOXIC + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_CAREFUL, + }, + { + .species = SPECIES_LUDICOLO, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x0C, + .moves = { + MOVE_FAKE_OUT, + MOVE_HYDRO_PUMP, + MOVE_ICE_BEAM, + MOVE_UPROAR + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_SHIFTRY, + .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, + .teamFlags = 0x0C, + .moves = { + MOVE_FRUSTRATION, + MOVE_GIGA_DRAIN, + MOVE_TORMENT, + MOVE_SWAGGER + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_RELAXED, + }, + { + .species = SPECIES_SWELLOW, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x88, + .moves = { + MOVE_FLY, + MOVE_ENDEAVOR, + MOVE_AERIAL_ACE, + MOVE_TOXIC + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_GARDEVOIR, + .heldItem = BATTLE_TOWER_ITEM_BLACK_GLASSES, + .teamFlags = 0x4A, + .moves = { + MOVE_HYPNOSIS, + MOVE_DREAM_EATER, + MOVE_PSYCHIC, + MOVE_DOUBLE_TEAM + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_CAREFUL, + }, + { + .species = SPECIES_BRELOOM, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x0C, + .moves = { + MOVE_DYNAMIC_PUNCH, + MOVE_MIND_READER, + MOVE_SNATCH, + MOVE_MEGA_DRAIN + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_ADAMANT, + }, + { + .species = SPECIES_VIGOROTH, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0x04, + .moves = { + MOVE_SLASH, + MOVE_UPROAR, + MOVE_ENCORE, + MOVE_FACADE + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_CALM, + }, + { + .species = SPECIES_NINJASK, + .heldItem = BATTLE_TOWER_ITEM_SILVER_POWDER, + .teamFlags = 0x04, + .moves = { + MOVE_FURY_CUTTER, + MOVE_GIGA_DRAIN, + MOVE_SWORDS_DANCE, + MOVE_DOUBLE_TEAM + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_SASSY, + }, + { + .species = SPECIES_SHEDINJA, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0xCA, + .moves = { + MOVE_CONFUSE_RAY, + MOVE_SOLAR_BEAM, + MOVE_SUNNY_DAY, + MOVE_GRUDGE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_JOLLY, + }, + { + .species = SPECIES_LOUDRED, + .heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY, + .teamFlags = 0x04, + .moves = { + MOVE_HYPER_VOICE, + MOVE_HOWL, + MOVE_SHADOW_BALL, + MOVE_TORMENT + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_HARIYAMA, + .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, + .teamFlags = 0x04, + .moves = { + MOVE_ARM_THRUST, + MOVE_BULK_UP, + MOVE_BRICK_BREAK, + MOVE_HIDDEN_POWER + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_BASHFUL, + }, + { + .species = SPECIES_ALAKAZAM, + .heldItem = BATTLE_TOWER_ITEM_TWISTED_SPOON, + .teamFlags = 0x88, + .moves = { + MOVE_PSYCHIC, + MOVE_SHADOW_BALL, + MOVE_FUTURE_SIGHT, + MOVE_DISABLE + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_CROBAT, + .heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY, + .teamFlags = 0x88, + .moves = { + MOVE_CONFUSE_RAY, + MOVE_TOXIC, + MOVE_MEAN_LOOK, + MOVE_SNATCH + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_MAWILE, + .heldItem = BATTLE_TOWER_ITEM_METAL_COAT, + .teamFlags = 0x04, + .moves = { + MOVE_CRUNCH, + MOVE_IRON_DEFENSE, + MOVE_FAKE_TEARS, + MOVE_POISON_FANG + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, + .nature = NATURE_NAIVE, + }, + { + .species = SPECIES_AGGRON, + .heldItem = BATTLE_TOWER_ITEM_METAL_COAT, + .teamFlags = 0x45, + .moves = { + MOVE_METAL_CLAW, + MOVE_FLAMETHROWER, + MOVE_METAL_SOUND, + MOVE_ICE_BEAM + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_GOLEM, + .heldItem = BATTLE_TOWER_ITEM_SOFT_SAND, + .teamFlags = 0xC5, + .moves = { + MOVE_ROLLOUT, + MOVE_DEFENSE_CURL, + MOVE_DOUBLE_TEAM, + MOVE_SELF_DESTRUCT + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_MANECTRIC, + .heldItem = BATTLE_TOWER_ITEM_MAGNET, + .teamFlags = 0x04, + .moves = { + MOVE_THUNDER, + MOVE_RAIN_DANCE, + MOVE_THUNDER_WAVE, + MOVE_CHARGE + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_CAREFUL, + }, + { + .species = SPECIES_VOLBEAT, + .heldItem = BATTLE_TOWER_ITEM_SILVER_POWDER, + .teamFlags = 0x08, + .moves = { + MOVE_CONFUSE_RAY, + MOVE_SIGNAL_BEAM, + MOVE_MOONLIGHT, + MOVE_TAIL_GLOW + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_DOCILE, + }, + { + .species = SPECIES_ILLUMISE, + .heldItem = BATTLE_TOWER_ITEM_SILVER_POWDER, + .teamFlags = 0x08, + .moves = { + MOVE_THUNDERBOLT, + MOVE_FLATTER, + MOVE_WISH, + MOVE_ENCORE + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_MASQUERAIN, + .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, + .teamFlags = 0x88, + .moves = { + MOVE_GIGA_DRAIN, + MOVE_SILVER_WIND, + MOVE_STUN_SPORE, + MOVE_TOXIC + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, + .nature = NATURE_NAIVE, + }, + { + .species = SPECIES_ROSELIA, + .heldItem = BATTLE_TOWER_ITEM_MIRACLE_SEED, + .teamFlags = 0x08, + .moves = { + MOVE_PETAL_DANCE, + MOVE_GROWTH, + MOVE_SYNTHESIS, + MOVE_GRASS_WHISTLE + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_IMPISH, + }, + { + .species = SPECIES_DELCATTY, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x08, + .moves = { + MOVE_SING, + MOVE_ATTRACT, + MOVE_DOUBLE_SLAP, + MOVE_HEAL_BELL + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_TIMID, + }, + { + .species = SPECIES_SEAKING, + .heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER, + .teamFlags = 0x88, + .moves = { + MOVE_RAIN_DANCE, + MOVE_SURF, + MOVE_ATTRACT, + MOVE_ICE_BEAM + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_GYARADOS, + .heldItem = BATTLE_TOWER_ITEM_DRAGON_FANG, + .teamFlags = 0x8C, + .moves = { + MOVE_HYDRO_PUMP, + MOVE_EARTHQUAKE, + MOVE_DRAGON_RAGE, + MOVE_PROTECT + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_CALM, + }, + { + .species = SPECIES_SWALOT, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x42, + .moves = { + MOVE_STOCKPILE, + MOVE_SWALLOW, + MOVE_SPIT_UP, + MOVE_YAWN + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_NAUGHTY, + }, + { + .species = SPECIES_MAGCARGO, + .heldItem = BATTLE_TOWER_ITEM_ASPEAR_BERRY, + .teamFlags = 0x41, + .moves = { + MOVE_ROCK_SLIDE, + MOVE_FIRE_BLAST, + MOVE_BODY_SLAM, + MOVE_LIGHT_SCREEN + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_LONELY, + }, + { + .species = SPECIES_MUK, + .heldItem = BATTLE_TOWER_ITEM_POISON_BARB, + .teamFlags = 0xC3, + .moves = { + MOVE_SLUDGE_BOMB, + MOVE_FLAMETHROWER, + MOVE_ACID_ARMOR, + MOVE_DISABLE + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_NAIVE, + }, + { + .species = SPECIES_SPINDA, + .heldItem = BATTLE_TOWER_ITEM_SILK_SCARF, + .teamFlags = 0x42, + .moves = { + MOVE_DIZZY_PUNCH, + MOVE_TEETER_DANCE, + MOVE_PSYCH_UP, + MOVE_FACADE + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_MODEST, + }, + { + .species = SPECIES_ALTARIA, + .heldItem = BATTLE_TOWER_ITEM_DRAGON_FANG, + .teamFlags = 0x03, + .moves = { + MOVE_DRAGON_CLAW, + MOVE_DRAGON_BREATH, + MOVE_DRAGON_DANCE, + MOVE_REFRESH + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_RASH, + }, + { + .species = SPECIES_ZANGOOSE, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x03, + .moves = { + MOVE_CRUSH_CLAW, + MOVE_TAUNT, + MOVE_SWORDS_DANCE, + MOVE_DETECT + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_QUIRKY, + }, + { + .species = SPECIES_SEVIPER, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x41, + .moves = { + MOVE_SWAGGER, + MOVE_TAUNT, + MOVE_GLARE, + MOVE_POISON_TAIL + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_CAREFUL, + }, + { + .species = SPECIES_GRUMPIG, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x42, + .moves = { + MOVE_TOXIC, + MOVE_BOUNCE, + MOVE_CONFUSE_RAY, + MOVE_ATTRACT + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_CACTURNE, + .heldItem = BATTLE_TOWER_ITEM_MIRACLE_SEED, + .teamFlags = 0x41, + .moves = { + MOVE_NEEDLE_ARM, + MOVE_INGRAIN, + MOVE_SPIKES, + MOVE_COTTON_SPORE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_SASSY, + }, + { + .species = SPECIES_CLAYDOL, + .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, + .teamFlags = 0x03, + .moves = { + MOVE_EARTHQUAKE, + MOVE_SANDSTORM, + MOVE_COSMIC_POWER, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_LAX, + }, + { + .species = SPECIES_TENTACRUEL, + .heldItem = BATTLE_TOWER_ITEM_MENTAL_HERB, + .teamFlags = 0xC1, + .moves = { + MOVE_SLUDGE_BOMB, + MOVE_HYDRO_PUMP, + MOVE_BARRIER, + MOVE_SUPERSONIC + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_WIGGLYTUFF, + .heldItem = BATTLE_TOWER_ITEM_RAWST_BERRY, + .teamFlags = 0xC3, + .moves = { + MOVE_SING, + MOVE_FOCUS_PUNCH, + MOVE_DISABLE, + MOVE_FACADE + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_ADAMANT, + }, + { + .species = SPECIES_AZUMARILL, + .heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY, + .teamFlags = 0xC2, + .moves = { + MOVE_SURF, + MOVE_ATTRACT, + MOVE_DEFENSE_CURL, + MOVE_ROLLOUT + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_RASH, + }, + { + .species = SPECIES_ELECTRODE, + .heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY, + .teamFlags = 0xC3, + .moves = { + MOVE_THUNDERBOLT, + MOVE_MIRROR_COAT, + MOVE_LIGHT_SCREEN, + MOVE_SELF_DESTRUCT + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_MILOTIC, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x42, + .moves = { + MOVE_HYDRO_PUMP, + MOVE_ATTRACT, + MOVE_RECOVER, + MOVE_REFRESH + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_JOLLY, + }, + { + .species = SPECIES_KECLEON, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x43, + .moves = { + MOVE_SKILL_SWAP, + MOVE_ANCIENT_POWER, + MOVE_WATER_PULSE, + MOVE_THUNDERBOLT + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_NAUGHTY, + }, + { + .species = SPECIES_DUSCLOPS, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x43, + .moves = { + MOVE_CONFUSE_RAY, + MOVE_CURSE, + MOVE_REST, + MOVE_MEAN_LOOK + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_BASHFUL, + }, + { + .species = SPECIES_ABSOL, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x41, + .moves = { + MOVE_SLASH, + MOVE_SWORDS_DANCE, + MOVE_DOUBLE_TEAM, + MOVE_SNATCH + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_DOCILE, + }, + { + .species = SPECIES_NINETALES, + .heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY, + .teamFlags = 0xC2, + .moves = { + MOVE_FLAMETHROWER, + MOVE_CONFUSE_RAY, + MOVE_DOUBLE_TEAM, + MOVE_WILL_O_WISP + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_TIMID, + }, + { + .species = SPECIES_PIKACHU, + .heldItem = BATTLE_TOWER_ITEM_LIGHT_BALL, + .teamFlags = 0xC2, + .moves = { + MOVE_THUNDER_WAVE, + MOVE_THUNDER, + MOVE_RAIN_DANCE, + MOVE_ATTRACT + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_HASTY, + }, + { + .species = SPECIES_VILEPLUME, + .heldItem = BATTLE_TOWER_ITEM_ASPEAR_BERRY, + .teamFlags = 0xC3, + .moves = { + MOVE_GIGA_DRAIN, + MOVE_SLEEP_POWDER, + MOVE_MOONLIGHT, + MOVE_SLUDGE_BOMB + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_DONPHAN, + .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, + .teamFlags = 0x41, + .moves = { + MOVE_EARTHQUAKE, + MOVE_DOUBLE_EDGE, + MOVE_IRON_TAIL, + MOVE_FISSURE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_QUIRKY, + }, + { + .species = SPECIES_STARMIE, + .heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY, + .teamFlags = 0xC3, + .moves = { + MOVE_CONFUSE_RAY, + MOVE_ICE_BEAM, + MOVE_RECOVER, + MOVE_DOUBLE_TEAM + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_HASTY, + }, + { + .species = SPECIES_WALREIN, + .heldItem = BATTLE_TOWER_ITEM_NEVER_MELT_ICE, + .teamFlags = 0x43, + .moves = { + MOVE_ICE_BEAM, + MOVE_BODY_SLAM, + MOVE_ENCORE, + MOVE_HAIL + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_LAX, + }, + { + .species = SPECIES_RELICANTH, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x41, + .moves = { + MOVE_YAWN, + MOVE_MUD_SPORT, + MOVE_DOUBLE_EDGE, + MOVE_SANDSTORM + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_LONELY, + }, + { + .species = SPECIES_KINGDRA, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x43, + .moves = { + MOVE_RAIN_DANCE, + MOVE_ICE_BEAM, + MOVE_HYDRO_PUMP, + MOVE_AGILITY + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_CRADILY, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x43, + .moves = { + MOVE_CONFUSE_RAY, + MOVE_INGRAIN, + MOVE_ANCIENT_POWER, + MOVE_GIGA_DRAIN + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_MILD, + }, + { + .species = SPECIES_ARMALDO, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x43, + .moves = { + MOVE_SLASH, + MOVE_ROCK_SLIDE, + MOVE_EARTHQUAKE, + MOVE_WATER_PULSE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_NAIVE, + }, + { + .species = SPECIES_METAGROSS, + .heldItem = BATTLE_TOWER_ITEM_METAL_COAT, + .teamFlags = 0x41, + .moves = { + MOVE_METAL_CLAW, + MOVE_PSYCHIC, + MOVE_LIGHT_SCREEN, + MOVE_AGILITY + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_SALAMENCE, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x42, + .moves = { + MOVE_DRAGON_BREATH, + MOVE_CRUNCH, + MOVE_FLAMETHROWER, + MOVE_AERIAL_ACE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_HASTY, + }, + { + .species = SPECIES_MIGHTYENA, + .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, + .teamFlags = 0x01, + .moves = { + MOVE_CRUNCH, + MOVE_YAWN, + MOVE_FACADE, + MOVE_HOWL + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_LINOONE, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x02, + .moves = { + MOVE_HYPER_BEAM, + MOVE_FACADE, + MOVE_ATTRACT, + MOVE_TRICK + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_LUDICOLO, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x03, + .moves = { + MOVE_SURF, + MOVE_FOCUS_PUNCH, + MOVE_FAKE_OUT, + MOVE_SYNTHESIS + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_TIMID, + }, + { + .species = SPECIES_EXPLOUD, + .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, + .teamFlags = 0x01, + .moves = { + MOVE_UPROAR, + MOVE_EARTHQUAKE, + MOVE_ICE_BEAM, + MOVE_FLAMETHROWER + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, + .nature = NATURE_DOCILE, + }, + { + .species = SPECIES_SWELLOW, + .heldItem = BATTLE_TOWER_ITEM_LANSAT_BERRY, + .teamFlags = 0x02, + .moves = { + MOVE_FACADE, + MOVE_SUPERSONIC, + MOVE_WING_ATTACK, + MOVE_ENDEAVOR + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_NAIVE, + }, + { + .species = SPECIES_PELIPPER, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0x82, + .moves = { + MOVE_STOCKPILE, + MOVE_SWALLOW, + MOVE_SPIT_UP, + MOVE_ATTRACT + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_BRELOOM, + .heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND, + .teamFlags = 0x01, + .moves = { + MOVE_DYNAMIC_PUNCH, + MOVE_COUNTER, + MOVE_BULK_UP, + MOVE_MIND_READER + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_SHEDINJA, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x01, + .moves = { + MOVE_RETURN, + MOVE_DOUBLE_TEAM, + MOVE_TOXIC, + MOVE_SHADOW_BALL + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_EXPLOUD, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x01, + .moves = { + MOVE_HYPER_BEAM, + MOVE_SUPERSONIC, + MOVE_FLAMETHROWER, + MOVE_ICE_BEAM + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_HARIYAMA, + .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, + .teamFlags = 0x01, + .moves = { + MOVE_CROSS_CHOP, + MOVE_COUNTER, + MOVE_FACADE, + MOVE_FAKE_OUT + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_ALAKAZAM, + .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, + .teamFlags = 0x83, + .moves = { + MOVE_PSYCHIC, + MOVE_ENCORE, + MOVE_DISABLE, + MOVE_RECOVER + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_CROBAT, + .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, + .teamFlags = 0x81, + .moves = { + MOVE_CONFUSE_RAY, + MOVE_AIR_CUTTER, + MOVE_TORMENT, + MOVE_DOUBLE_TEAM + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_SABLEYE, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x83, + .moves = { + MOVE_TOXIC, + MOVE_DETECT, + MOVE_RECOVER, + MOVE_TORMENT + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_RELAXED, + }, + { + .species = SPECIES_MAWILE, + .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, + .teamFlags = 0x02, + .moves = { + MOVE_CRUNCH, + MOVE_SWORDS_DANCE, + MOVE_IRON_DEFENSE, + MOVE_REST + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_AGGRON, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x01, + .moves = { + MOVE_DOUBLE_EDGE, + MOVE_IRON_DEFENSE, + MOVE_ROAR, + MOVE_EARTHQUAKE + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_GOLEM, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x01, + .moves = { + MOVE_EARTHQUAKE, + MOVE_ROCK_SLIDE, + MOVE_FLAMETHROWER, + MOVE_FACADE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_NOSEPASS, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x81, + .moves = { + MOVE_THUNDER_WAVE, + MOVE_ROCK_SLIDE, + MOVE_TORMENT, + MOVE_ATTRACT + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_NAIVE, + }, + { + .species = SPECIES_MANECTRIC, + .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, + .teamFlags = 0x02, + .moves = { + MOVE_THUNDER, + MOVE_CRUNCH, + MOVE_THUNDER_WAVE, + MOVE_QUICK_ATTACK + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_JOLLY, + }, + { + .species = SPECIES_ROSELIA, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x82, + .moves = { + MOVE_GRASS_WHISTLE, + MOVE_LEECH_SEED, + MOVE_GIGA_DRAIN, + MOVE_GROWTH + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_DELCATTY, + .heldItem = BATTLE_TOWER_ITEM_STARF_BERRY, + .teamFlags = 0x02, + .moves = { + MOVE_ASSIST, + MOVE_SING, + MOVE_ATTRACT, + MOVE_SUBSTITUTE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_DOCILE, + }, + { + .species = SPECIES_TROPIUS, + .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, + .teamFlags = 0xC2, + .moves = { + MOVE_RAZOR_LEAF, + MOVE_EARTHQUAKE, + MOVE_ATTRACT, + MOVE_SYNTHESIS + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, + .nature = NATURE_JOLLY, + }, + { + .species = SPECIES_SWALOT, + .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, + .teamFlags = 0x03, + .moves = { + MOVE_YAWN, + MOVE_SLUDGE_BOMB, + MOVE_ATTRACT, + MOVE_ICE_BEAM + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_MACHAMP, + .heldItem = BATTLE_TOWER_ITEM_BLACK_BELT, + .teamFlags = 0x01, + .moves = { + MOVE_CROSS_CHOP, + MOVE_BULK_UP, + MOVE_LOW_KICK, + MOVE_BRICK_BREAK + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_BASHFUL, + }, + { + .species = SPECIES_CAMERUPT, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x40, + .moves = { + MOVE_ERUPTION, + MOVE_EARTHQUAKE, + MOVE_ROCK_SLIDE, + MOVE_OVERHEAT + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_NAIVE, + }, + { + .species = SPECIES_MAGCARGO, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x03, + .moves = { + MOVE_FLAMETHROWER, + MOVE_ROCK_SLIDE, + MOVE_EARTHQUAKE, + MOVE_REFLECT + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_WEEZING, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x81, + .moves = { + MOVE_WILL_O_WISP, + MOVE_HYPER_BEAM, + MOVE_THUNDERBOLT, + MOVE_DESTINY_BOND + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_LAX, + }, + { + .species = SPECIES_SPINDA, + .heldItem = BATTLE_TOWER_ITEM_CHOICE_BAND, + .teamFlags = 0x82, + .moves = { + MOVE_TRICK, + MOVE_TEETER_DANCE, + MOVE_FOCUS_PUNCH, + MOVE_FACADE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_TIMID, + }, + { + .species = SPECIES_SKARMORY, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x01, + .moves = { + MOVE_DRILL_PECK, + MOVE_STEEL_WING, + MOVE_TORMENT, + MOVE_PROTECT + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_ALTARIA, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0x02, + .moves = { + MOVE_SING, + MOVE_DRAGON_CLAW, + MOVE_ICE_BEAM, + MOVE_EARTHQUAKE + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_GRUMPIG, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x82, + .moves = { + MOVE_PSYCHIC, + MOVE_CONFUSE_RAY, + MOVE_CALM_MIND, + MOVE_REST + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_SHIFTRY, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0x20, + .moves = { + MOVE_SWAGGER, + MOVE_FRUSTRATION, + MOVE_ATTRACT, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_CLAYDOL, + .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, + .teamFlags = 0x20, + .moves = { + MOVE_COSMIC_POWER, + MOVE_PSYCHIC, + MOVE_EARTHQUAKE, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, + .nature = NATURE_RELAXED, + }, + { + .species = SPECIES_HARIYAMA, + .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, + .teamFlags = 0x33, + .moves = { + MOVE_EARTHQUAKE, + MOVE_COUNTER, + MOVE_BELLY_DRUM, + MOVE_REST + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_SASSY, + }, + { + .species = SPECIES_NOSEPASS, + .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, + .teamFlags = 0x20, + .moves = { + MOVE_ROCK_SLIDE, + MOVE_THUNDER_WAVE, + MOVE_EARTHQUAKE, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_LAX, + }, + { + .species = SPECIES_DUSCLOPS, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x33, + .moves = { + MOVE_SHADOW_PUNCH, + MOVE_WILL_O_WISP, + MOVE_CONFUSE_RAY, + MOVE_DESTINY_BOND + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_SASSY, + }, + { + .species = SPECIES_SEAKING, + .heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY, + .teamFlags = 0x20, + .moves = { + MOVE_HORN_DRILL, + MOVE_AGILITY, + MOVE_SLEEP_TALK, + MOVE_REST + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_CAMERUPT, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x73, + .moves = { + MOVE_EARTHQUAKE, + MOVE_ERUPTION, + MOVE_ROCK_SLIDE, + MOVE_FISSURE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_NAIVE, + }, + { + .species = SPECIES_LANTURN, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x13, + .moves = { + MOVE_THUNDERBOLT, + MOVE_SURF, + MOVE_THUNDER_WAVE, + MOVE_CONFUSE_RAY + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_WEEZING, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x33, + .moves = { + MOVE_SLUDGE_BOMB, + MOVE_THUNDERBOLT, + MOVE_FIRE_BLAST, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_WHISCASH, + .heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY, + .teamFlags = 0x20, + .moves = { + MOVE_EARTHQUAKE, + MOVE_SURF, + MOVE_SPARK, + MOVE_FISSURE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_RELAXED, + }, + { + .species = SPECIES_AGGRON, + .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, + .teamFlags = 0x51, + .moves = { + MOVE_DOUBLE_EDGE, + MOVE_EARTHQUAKE, + MOVE_SURF, + MOVE_DRAGON_CLAW + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_KECLEON, + .heldItem = BATTLE_TOWER_ITEM_CHOICE_BAND, + .teamFlags = 0x12, + .moves = { + MOVE_TRICK, + MOVE_FOCUS_PUNCH, + MOVE_ATTRACT, + MOVE_SNATCH + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_MILD, + }, + { + .species = SPECIES_SHARPEDO, + .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, + .teamFlags = 0x11, + .moves = { + MOVE_CRUNCH, + MOVE_DOUBLE_EDGE, + MOVE_SURF, + MOVE_SWAGGER + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_ABSOL, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x12, + .moves = { + MOVE_DOUBLE_EDGE, + MOVE_FACADE, + MOVE_SWORDS_DANCE, + MOVE_QUICK_ATTACK + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_WAILORD, + .heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY, + .teamFlags = 0x72, + .moves = { + MOVE_HYDRO_PUMP, + MOVE_EARTHQUAKE, + MOVE_ATTRACT, + MOVE_FISSURE + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_TIMID, + }, + { + .species = SPECIES_TENTACRUEL, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x20, + .moves = { + MOVE_HYDRO_PUMP, + MOVE_SLUDGE_BOMB, + MOVE_BARRIER, + MOVE_MIRROR_COAT + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_JOLLY, + }, + { + .species = SPECIES_SABLEYE, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x32, + .moves = { + MOVE_SHADOW_BALL, + MOVE_TOXIC, + MOVE_RECOVER, + MOVE_DOUBLE_TEAM + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_WOBBUFFET, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x20, + .moves = { + MOVE_ENCORE, + MOVE_COUNTER, + MOVE_MIRROR_COAT, + MOVE_DESTINY_BOND + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_MILD, + }, + { + .species = SPECIES_RHYDON, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0x71, + .moves = { + MOVE_EARTHQUAKE, + MOVE_MEGAHORN, + MOVE_BRICK_BREAK, + MOVE_HORN_DRILL + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_GLALIE, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x31, + .moves = { + MOVE_CRUNCH, + MOVE_BLIZZARD, + MOVE_HAIL, + MOVE_SHEER_COLD + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_BASHFUL, + }, + { + .species = SPECIES_SCEPTILE, + .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, + .teamFlags = 0x8C, + .moves = { + MOVE_LEAF_BLADE, + MOVE_EARTHQUAKE, + MOVE_DRAGON_CLAW, + MOVE_CRUNCH + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_BLAZIKEN, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x8C, + .moves = { + MOVE_BLAZE_KICK, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_REVERSAL + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_DOCILE, + }, + { + .species = SPECIES_SWAMPERT, + .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, + .teamFlags = 0x8C, + .moves = { + MOVE_SURF, + MOVE_EARTHQUAKE, + MOVE_MIRROR_COAT, + MOVE_BLIZZARD + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_CAREFUL, + }, + { + .species = SPECIES_GARDEVOIR, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x1A, + .moves = { + MOVE_PSYCHIC, + MOVE_THUNDERBOLT, + MOVE_DESTINY_BOND, + MOVE_SNATCH + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_BRELOOM, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x15, + .moves = { + MOVE_SPORE, + MOVE_FOCUS_PUNCH, + MOVE_MACH_PUNCH, + MOVE_ATTRACT + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_ALAKAZAM, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x58, + .moves = { + MOVE_PSYCHIC, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH, + MOVE_RECOVER + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_HASTY, + }, + { + .species = SPECIES_HARIYAMA, + .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, + .teamFlags = 0x15, + .moves = { + MOVE_CROSS_CHOP, + MOVE_EARTHQUAKE, + MOVE_FACADE, + MOVE_FAKE_OUT + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_GYARADOS, + .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, + .teamFlags = 0x55, + .moves = { + MOVE_HYPER_BEAM, + MOVE_EARTHQUAKE, + MOVE_SURF, + MOVE_ICE_BEAM + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_BOLD, + }, + { + .species = SPECIES_CROBAT, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x58, + .moves = { + MOVE_SLUDGE_BOMB, + MOVE_CONFUSE_RAY, + MOVE_AIR_CUTTER, + MOVE_DOUBLE_TEAM + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_MACHAMP, + .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, + .teamFlags = 0x5D, + .moves = { + MOVE_CROSS_CHOP, + MOVE_FLAMETHROWER, + MOVE_EARTHQUAKE, + MOVE_ROCK_SLIDE + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_MANECTRIC, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x1A, + .moves = { + MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, + MOVE_ROAR, + MOVE_CRUNCH + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_ELECTRODE, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x60, + .moves = { + MOVE_THUNDERBOLT, + MOVE_PROTECT, + MOVE_MIRROR_COAT, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_BASHFUL, + }, + { + .species = SPECIES_MUK, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0x64, + .moves = { + MOVE_SLUDGE_BOMB, + MOVE_FLAMETHROWER, + MOVE_THUNDERBOLT, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_FLYGON, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x1C, + .moves = { + MOVE_DRAGON_CLAW, + MOVE_EARTHQUAKE, + MOVE_FLAMETHROWER, + MOVE_CRUNCH + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_TIMID, + }, + { + .species = SPECIES_STARMIE, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x5C, + .moves = { + MOVE_SURF, + MOVE_THUNDERBOLT, + MOVE_RECOVER, + MOVE_CONFUSE_RAY + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_NINETALES, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x4A, + .moves = { + MOVE_CONFUSE_RAY, + MOVE_TOXIC, + MOVE_FIRE_SPIN, + MOVE_HEAT_WAVE + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_RAICHU, + .heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND, + .teamFlags = 0x5A, + .moves = { + MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, + MOVE_REVERSAL, + MOVE_IRON_TAIL + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_TIMID, + }, + { + .species = SPECIES_GOLDUCK, + .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, + .teamFlags = 0x55, + .moves = { + MOVE_SURF, + MOVE_CROSS_CHOP, + MOVE_ICE_BEAM, + MOVE_DIG + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, + .nature = NATURE_JOLLY, + }, + { + .species = SPECIES_HERACROSS, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x5D, + .moves = { + MOVE_MEGAHORN, + MOVE_EARTHQUAKE, + MOVE_ENDURE, + MOVE_REVERSAL + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_WALREIN, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0x26, + .moves = { + MOVE_SURF, + MOVE_ICE_BEAM, + MOVE_EARTHQUAKE, + MOVE_SHEER_COLD + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_CAREFUL, + }, + { + .species = SPECIES_KINGDRA, + .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, + .teamFlags = 0x5B, + .moves = { + MOVE_SURF, + MOVE_ICE_BEAM, + MOVE_DRAGON_BREATH, + MOVE_REST + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_SALAMENCE, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x0D, + .moves = { + MOVE_DRAGON_CLAW, + MOVE_EARTHQUAKE, + MOVE_CRUNCH, + MOVE_FIRE_BLAST + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_NAUGHTY, + }, + { + .species = SPECIES_METAGROSS, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x3D, + .moves = { + MOVE_METEOR_MASH, + MOVE_PSYCHIC, + MOVE_EARTHQUAKE, + MOVE_ROCK_TOMB + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_REGIROCK, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x3C, + .moves = { + MOVE_EARTHQUAKE, + MOVE_ANCIENT_POWER, + MOVE_THUNDERBOLT, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_REGICE, + .heldItem = BATTLE_TOWER_ITEM_LAX_INCENSE, + .teamFlags = 0x3C, + .moves = { + MOVE_ICE_BEAM, + MOVE_THUNDERBOLT, + MOVE_EARTHQUAKE, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_CAREFUL, + }, + { + .species = SPECIES_REGISTEEL, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0x3C, + .moves = { + MOVE_METAL_CLAW, + MOVE_EARTHQUAKE, + MOVE_THUNDERBOLT, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_LATIAS, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x0E, + .moves = { + MOVE_MIST_BALL, + MOVE_THUNDERBOLT, + MOVE_RECOVER, + MOVE_DRAGON_CLAW + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_LATIOS, + .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, + .teamFlags = 0x0D, + .moves = { + MOVE_LUSTER_PURGE, + MOVE_THUNDERBOLT, + MOVE_RECOVER, + MOVE_DRAGON_CLAW + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_MILOTIC, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x1A, + .moves = { + MOVE_SURF, + MOVE_TOXIC, + MOVE_RECOVER, + MOVE_MIRROR_COAT + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_SLAKING, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x15, + .moves = { + MOVE_YAWN, + MOVE_FOCUS_PUNCH, + MOVE_COUNTER, + MOVE_SLACK_OFF + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_DOCILE, + }, + { + .species = SPECIES_SCEPTILE, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x8C, + .moves = { + MOVE_GIGA_DRAIN, + MOVE_DOUBLE_TEAM, + MOVE_LEECH_SEED, + MOVE_ATTRACT + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_BLAZIKEN, + .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, + .teamFlags = 0x8C, + .moves = { + MOVE_BLAZE_KICK, + MOVE_EARTHQUAKE, + MOVE_ROCK_SLIDE, + MOVE_QUICK_ATTACK + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_DOCILE, + }, + { + .species = SPECIES_SWAMPERT, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x8C, + .moves = { + MOVE_MUDDY_WATER, + MOVE_MUD_SHOT, + MOVE_MIRROR_COAT, + MOVE_ICE_BEAM + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, + .nature = NATURE_CAREFUL, + }, + { + .species = SPECIES_GARDEVOIR, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x0A, + .moves = { + MOVE_PSYCHIC, + MOVE_THUNDERBOLT, + MOVE_HYPNOSIS, + MOVE_DREAM_EATER + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_RELAXED, + }, + { + .species = SPECIES_BRELOOM, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x05, + .moves = { + MOVE_SPORE, + MOVE_COUNTER, + MOVE_SKY_UPPERCUT, + MOVE_GIGA_DRAIN + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_DOCILE, + }, + { + .species = SPECIES_ALAKAZAM, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x58, + .moves = { + MOVE_PSYCHIC, + MOVE_THUNDER_PUNCH, + MOVE_FIRE_PUNCH, + MOVE_RECOVER + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE, + .nature = NATURE_HASTY, + }, + { + .species = SPECIES_HARIYAMA, + .heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND, + .teamFlags = 0x04, + .moves = { + MOVE_CROSS_CHOP, + MOVE_COUNTER, + MOVE_ENDURE, + MOVE_REVERSAL + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_GYARADOS, + .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, + .teamFlags = 0x44, + .moves = { + MOVE_HYPER_BEAM, + MOVE_THUNDERBOLT, + MOVE_EARTHQUAKE, + MOVE_ICE_BEAM + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_BOLD, + }, + { + .species = SPECIES_CROBAT, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x48, + .moves = { + MOVE_TOXIC, + MOVE_CONFUSE_RAY, + MOVE_ATTRACT, + MOVE_FLY + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_MACHAMP, + .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, + .teamFlags = 0x5D, + .moves = { + MOVE_CROSS_CHOP, + MOVE_COUNTER, + MOVE_EARTHQUAKE, + MOVE_FACADE + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_MANECTRIC, + .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, + .teamFlags = 0x0A, + .moves = { + MOVE_THUNDER, + MOVE_THUNDER_WAVE, + MOVE_QUICK_ATTACK, + MOVE_CRUNCH + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_ELECTRODE, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x60, + .moves = { + MOVE_THUNDERBOLT, + MOVE_LIGHT_SCREEN, + MOVE_MIRROR_COAT, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_BASHFUL, + }, + { + .species = SPECIES_MUK, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0x64, + .moves = { + MOVE_SLUDGE_BOMB, + MOVE_GIGA_DRAIN, + MOVE_FLAMETHROWER, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_FLYGON, + .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, + .teamFlags = 0x1C, + .moves = { + MOVE_DRAGON_CLAW, + MOVE_EARTHQUAKE, + MOVE_IRON_TAIL, + MOVE_CRUNCH + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_TIMID, + }, + { + .species = SPECIES_STARMIE, + .heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY, + .teamFlags = 0x5C, + .moves = { + MOVE_BLIZZARD, + MOVE_THUNDERBOLT, + MOVE_PSYCHIC, + MOVE_RECOVER + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_DODRIO, + .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, + .teamFlags = 0x5A, + .moves = { + MOVE_DRILL_PECK, + MOVE_TRI_ATTACK, + MOVE_AGILITY, + MOVE_FACADE + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_RAICHU, + .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, + .teamFlags = 0x4A, + .moves = { + MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, + MOVE_ATTRACT, + MOVE_FOCUS_PUNCH + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_TIMID, + }, + { + .species = SPECIES_GOLDUCK, + .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, + .teamFlags = 0x45, + .moves = { + MOVE_HYDRO_PUMP, + MOVE_CROSS_CHOP, + MOVE_BLIZZARD, + MOVE_ATTRACT + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_HERACROSS, + .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, + .teamFlags = 0x5D, + .moves = { + MOVE_MEGAHORN, + MOVE_EARTHQUAKE, + MOVE_COUNTER, + MOVE_REVERSAL + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_WALREIN, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x26, + .moves = { + MOVE_SURF, + MOVE_BLIZZARD, + MOVE_ROCK_SLIDE, + MOVE_SHEER_COLD + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_CAREFUL, + }, + { + .species = SPECIES_KINGDRA, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x5C, + .moves = { + MOVE_HYDRO_PUMP, + MOVE_ICE_BEAM, + MOVE_DRAGON_BREATH, + MOVE_ATTRACT + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_SALAMENCE, + .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, + .teamFlags = 0x1D, + .moves = { + MOVE_DRAGON_CLAW, + MOVE_EARTHQUAKE, + MOVE_CRUNCH, + MOVE_ROCK_TOMB + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_RELAXED, + }, + { + .species = SPECIES_METAGROSS, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0x3D, + .moves = { + MOVE_METEOR_MASH, + MOVE_PSYCHIC, + MOVE_EARTHQUAKE, + MOVE_SHADOW_BALL + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_REGIROCK, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0x3C, + .moves = { + MOVE_EARTHQUAKE, + MOVE_THUNDERBOLT, + MOVE_FOCUS_PUNCH, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_REGICE, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x3C, + .moves = { + MOVE_ICE_BEAM, + MOVE_THUNDERBOLT, + MOVE_HAIL, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE, + .nature = NATURE_CAREFUL, + }, + { + .species = SPECIES_REGISTEEL, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x3C, + .moves = { + MOVE_METAL_CLAW, + MOVE_EARTHQUAKE, + MOVE_ANCIENT_POWER, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_LATIAS, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x1E, + .moves = { + MOVE_MIST_BALL, + MOVE_ICE_BEAM, + MOVE_RECOVER, + MOVE_DRAGON_CLAW + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_LATIOS, + .heldItem = BATTLE_TOWER_ITEM_LAX_INCENSE, + .teamFlags = 0x1D, + .moves = { + MOVE_LUSTER_PURGE, + MOVE_ICE_BEAM, + MOVE_RECOVER, + MOVE_DRAGON_CLAW + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_MILOTIC, + .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, + .teamFlags = 0x1A, + .moves = { + MOVE_HYDRO_PUMP, + MOVE_ICE_BEAM, + MOVE_RECOVER, + MOVE_MIRROR_COAT + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_SLAKING, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x15, + .moves = { + MOVE_YAWN, + MOVE_FOCUS_PUNCH, + MOVE_COUNTER, + MOVE_PURSUIT + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_DOCILE, + }, + { + .species = SPECIES_SCEPTILE, + .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, + .teamFlags = 0x8C, + .moves = { + MOVE_LEAF_BLADE, + MOVE_ROCK_TOMB, + MOVE_DRAGON_CLAW, + MOVE_CRUNCH + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_BLAZIKEN, + .heldItem = BATTLE_TOWER_ITEM_GANLON_BERRY, + .teamFlags = 0x8C, + .moves = { + MOVE_FOCUS_PUNCH, + MOVE_COUNTER, + MOVE_SWAGGER, + MOVE_ROCK_TOMB + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_SWAMPERT, + .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, + .teamFlags = 0x8C, + .moves = { + MOVE_SURF, + MOVE_ICE_BEAM, + MOVE_ATTRACT, + MOVE_REST + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_CAREFUL, + }, + { + .species = SPECIES_GARDEVOIR, + .heldItem = BATTLE_TOWER_ITEM_LAX_INCENSE, + .teamFlags = 0x0A, + .moves = { + MOVE_PSYCHIC, + MOVE_THUNDERBOLT, + MOVE_ATTRACT, + MOVE_WILL_O_WISP + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_BRELOOM, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x05, + .moves = { + MOVE_SPORE, + MOVE_FOCUS_PUNCH, + MOVE_MACH_PUNCH, + MOVE_COUNTER + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_ALAKAZAM, + .heldItem = BATTLE_TOWER_ITEM_CHOICE_BAND, + .teamFlags = 0x58, + .moves = { + MOVE_PSYCHIC, + MOVE_TRICK, + MOVE_RECOVER, + MOVE_SNATCH + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_HASTY, + }, + { + .species = SPECIES_HARIYAMA, + .heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND, + .teamFlags = 0x05, + .moves = { + MOVE_REVENGE, + MOVE_COUNTER, + MOVE_FOCUS_PUNCH, + MOVE_REVERSAL + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_LUDICOLO, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x0A, + .moves = { + MOVE_RAIN_DANCE, + MOVE_LEECH_SEED, + MOVE_GIGA_DRAIN, + MOVE_DIVE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_CROBAT, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x48, + .moves = { + MOVE_SLUDGE_BOMB, + MOVE_CONFUSE_RAY, + MOVE_SHADOW_BALL, + MOVE_SNATCH + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_MACHAMP, + .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, + .teamFlags = 0x5D, + .moves = { + MOVE_CROSS_CHOP, + MOVE_FIRE_BLAST, + MOVE_LOW_KICK, + MOVE_ROCK_TOMB + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_MANECTRIC, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x08, + .moves = { + MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, + MOVE_ATTRACT, + MOVE_CRUNCH + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_ELECTRODE, + .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, + .teamFlags = 0x60, + .moves = { + MOVE_THUNDER, + MOVE_SWIFT, + MOVE_MIRROR_COAT, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_BASHFUL, + }, + { + .species = SPECIES_MUK, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x64, + .moves = { + MOVE_SLUDGE_BOMB, + MOVE_FLAMETHROWER, + MOVE_THUNDERBOLT, + MOVE_SHADOW_PUNCH + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_FLYGON, + .heldItem = BATTLE_TOWER_ITEM_LAX_INCENSE, + .teamFlags = 0x0C, + .moves = { + MOVE_DRAGON_CLAW, + MOVE_EARTHQUAKE, + MOVE_FIRE_BLAST, + MOVE_SANDSTORM + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_TIMID, + }, + { + .species = SPECIES_STARMIE, + .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, + .teamFlags = 0x4C, + .moves = { + MOVE_SURF, + MOVE_THUNDERBOLT, + MOVE_ICE_BEAM, + MOVE_PSYCHIC + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_LUDICOLO, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x4A, + .moves = { + MOVE_LEECH_SEED, + MOVE_ATTRACT, + MOVE_DOUBLE_TEAM, + MOVE_PROTECT + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_SKARMORY, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x4B, + .moves = { + MOVE_DRILL_PECK, + MOVE_STEEL_WING, + MOVE_ATTRACT, + MOVE_PURSUIT + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED, + .nature = NATURE_SASSY, + }, + { + .species = SPECIES_GOLDUCK, + .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, + .teamFlags = 0x49, + .moves = { + MOVE_SURF, + MOVE_PSYCHIC, + MOVE_ICE_BEAM, + MOVE_CROSS_CHOP + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_JOLLY, + }, + { + .species = SPECIES_HERACROSS, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0x5D, + .moves = { + MOVE_MEGAHORN, + MOVE_EARTHQUAKE, + MOVE_FOCUS_PUNCH, + MOVE_ROCK_TOMB + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_WALREIN, + .heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY, + .teamFlags = 0x26, + .moves = { + MOVE_SURF, + MOVE_ICE_BEAM, + MOVE_FISSURE, + MOVE_SHEER_COLD + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_KINGDRA, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x5C, + .moves = { + MOVE_SURF, + MOVE_BLIZZARD, + MOVE_HYPER_BEAM, + MOVE_FLAIL + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_SALAMENCE, + .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, + .teamFlags = 0x1D, + .moves = { + MOVE_DRAGON_CLAW, + MOVE_EARTHQUAKE, + MOVE_FIRE_BLAST, + MOVE_HYDRO_PUMP + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_NAUGHTY, + }, + { + .species = SPECIES_METAGROSS, + .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, + .teamFlags = 0x3D, + .moves = { + MOVE_METEOR_MASH, + MOVE_PSYCHIC, + MOVE_EARTHQUAKE, + MOVE_HYPER_BEAM + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_REGIROCK, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x3C, + .moves = { + MOVE_EARTHQUAKE, + MOVE_THUNDERBOLT, + MOVE_SUPERPOWER, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_REGICE, + .heldItem = BATTLE_TOWER_ITEM_LAX_INCENSE, + .teamFlags = 0x3C, + .moves = { + MOVE_ICE_BEAM, + MOVE_THUNDERBOLT, + MOVE_ANCIENT_POWER, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_CAREFUL, + }, + { + .species = SPECIES_REGISTEEL, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x3C, + .moves = { + MOVE_METAL_CLAW, + MOVE_THUNDERBOLT, + MOVE_HYPER_BEAM, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_LATIAS, + .heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY, + .teamFlags = 0x1E, + .moves = { + MOVE_MIST_BALL, + MOVE_THUNDERBOLT, + MOVE_EARTHQUAKE, + MOVE_ICE_BEAM + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_LATIOS, + .heldItem = BATTLE_TOWER_ITEM_GANLON_BERRY, + .teamFlags = 0x1D, + .moves = { + MOVE_LUSTER_PURGE, + MOVE_THUNDERBOLT, + MOVE_EARTHQUAKE, + MOVE_ICE_BEAM + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_MILOTIC, + .heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY, + .teamFlags = 0x1A, + .moves = { + MOVE_SURF, + MOVE_ICE_BEAM, + MOVE_RECOVER, + MOVE_ATTRACT + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_ALTARIA, + .heldItem = BATTLE_TOWER_ITEM_GANLON_BERRY, + .teamFlags = 0x0A, + .moves = { + MOVE_DRAGON_CLAW, + MOVE_ICE_BEAM, + MOVE_SING, + MOVE_FLAMETHROWER + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_SCEPTILE, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x9C, + .moves = { + MOVE_LEAF_BLADE, + MOVE_DETECT, + MOVE_DRAGON_CLAW, + MOVE_CRUNCH + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_BLAZIKEN, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x9C, + .moves = { + MOVE_BLAZE_KICK, + MOVE_SKY_UPPERCUT, + MOVE_EARTHQUAKE, + MOVE_ROCK_SLIDE + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, + .nature = NATURE_DOCILE, + }, + { + .species = SPECIES_SWAMPERT, + .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, + .teamFlags = 0x9C, + .moves = { + MOVE_SURF, + MOVE_EARTHQUAKE, + MOVE_ICE_BEAM, + MOVE_ROCK_TOMB + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_SHEDINJA, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x20, + .moves = { + MOVE_CONFUSE_RAY, + MOVE_SHADOW_BALL, + MOVE_TOXIC, + MOVE_GRUDGE + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_METAGROSS, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x1D, + .moves = { + MOVE_METEOR_MASH, + MOVE_EARTHQUAKE, + MOVE_DOUBLE_TEAM, + MOVE_PROTECT + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_NAIVE, + }, + { + .species = SPECIES_ALAKAZAM, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x58, + .moves = { + MOVE_PSYCHIC, + MOVE_THUNDER_PUNCH, + MOVE_ICE_PUNCH, + MOVE_FIRE_PUNCH + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_HASTY, + }, + { + .species = SPECIES_LATIAS, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x1E, + .moves = { + MOVE_MIST_BALL, + MOVE_THUNDERBOLT, + MOVE_ICE_BEAM, + MOVE_DRAGON_CLAW + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_LATIOS, + .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, + .teamFlags = 0x1D, + .moves = { + MOVE_LUSTER_PURGE, + MOVE_THUNDERBOLT, + MOVE_ICE_BEAM, + MOVE_DRAGON_CLAW + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_SALAMENCE, + .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, + .teamFlags = 0x1D, + .moves = { + MOVE_DRAGON_CLAW, + MOVE_FLAMETHROWER, + MOVE_EARTHQUAKE, + MOVE_AERIAL_ACE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE, + .nature = NATURE_RELAXED, + }, + { + .species = SPECIES_MACHAMP, + .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, + .teamFlags = 0x5D, + .moves = { + MOVE_CROSS_CHOP, + MOVE_EARTHQUAKE, + MOVE_LOW_KICK, + MOVE_ROCK_SLIDE + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, +};
\ No newline at end of file diff --git a/src/data/battle_tower/level_50_mons.h b/src/data/battle_tower/level_50_mons.h new file mode 100644 index 000000000..c61f840af --- /dev/null +++ b/src/data/battle_tower/level_50_mons.h @@ -0,0 +1,3903 @@ +const struct BattleTowerPokemon gBattleTowerLevel50Mons[] = +{ + { + .species = SPECIES_PIKACHU, + .heldItem = BATTLE_TOWER_ITEM_ORAN_BERRY, + .teamFlags = 0x42, + .moves = { + MOVE_QUICK_ATTACK, + MOVE_THUNDER_WAVE, + MOVE_THUNDER_SHOCK, + MOVE_GROWL + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_BEAUTIFLY, + .heldItem = BATTLE_TOWER_ITEM_MIRACLE_SEED, + .teamFlags = 0x41, + .moves = { + MOVE_ABSORB, + MOVE_STUN_SPORE, + MOVE_GUST, + MOVE_SAFEGUARD + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_SWELLOW, + .heldItem = BATTLE_TOWER_ITEM_SHARP_BEAK, + .teamFlags = 0x07, + .moves = { + MOVE_PECK, + MOVE_WING_ATTACK, + MOVE_AERIAL_ACE, + MOVE_AGILITY + }, + .evSpread = F_EV_SPREAD_ATTACK, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_WALREIN, + .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, + .teamFlags = 0x0B, + .moves = { + MOVE_HAIL, + MOVE_ENCORE, + MOVE_ICE_BALL, + MOVE_TOXIC + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_ADAMANT, + }, + { + .species = SPECIES_SEAKING, + .heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER, + .teamFlags = 0x07, + .moves = { + MOVE_PECK, + MOVE_FLAIL, + MOVE_FURY_ATTACK, + MOVE_SURF + }, + .evSpread = F_EV_SPREAD_SPEED, + .nature = NATURE_HASTY, + }, + { + .species = SPECIES_TORCHIC, + .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, + .teamFlags = 0x42, + .moves = { + MOVE_FIRE_SPIN, + MOVE_PROTECT, + MOVE_SAND_ATTACK, + MOVE_SLASH + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, + .nature = NATURE_RELAXED, + }, + { + .species = SPECIES_MASQUERAIN, + .heldItem = BATTLE_TOWER_ITEM_WHITE_HERB, + .teamFlags = 0x41, + .moves = { + MOVE_STUN_SPORE, + MOVE_WATER_SPORT, + MOVE_QUICK_ATTACK, + MOVE_GUST + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_IMPISH, + }, + { + .species = SPECIES_ILLUMISE, + .heldItem = BATTLE_TOWER_ITEM_NONE, + .teamFlags = 0x41, + .moves = { + MOVE_FLATTER, + MOVE_COVET, + MOVE_WISH, + MOVE_FACADE + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_DELCATTY, + .heldItem = BATTLE_TOWER_ITEM_SILK_SCARF, + .teamFlags = 0x42, + .moves = { + MOVE_ATTRACT, + MOVE_TAIL_WHIP, + MOVE_FAINT_ATTACK, + MOVE_DIG + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_LONELY, + }, + { + .species = SPECIES_KECLEON, + .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, + .teamFlags = 0x0B, + .moves = { + MOVE_TAIL_WHIP, + MOVE_SLASH, + MOVE_LICK, + MOVE_SCREECH + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_MIGHTYENA, + .heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY, + .teamFlags = 0x05, + .moves = { + MOVE_BITE, + MOVE_TAKE_DOWN, + MOVE_ROAR, + MOVE_HOWL + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, + .nature = NATURE_DOCILE, + }, + { + .species = SPECIES_SLAKING, + .heldItem = BATTLE_TOWER_ITEM_BLACK_GLASSES, + .teamFlags = 0x05, + .moves = { + MOVE_FAINT_ATTACK, + MOVE_COUNTER, + MOVE_SCRATCH, + MOVE_TAUNT + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_LAX, + }, + { + .species = SPECIES_MACHOKE, + .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, + .teamFlags = 0x05, + .moves = { + MOVE_LEER, + MOVE_DIG, + MOVE_LOW_KICK, + MOVE_FOCUS_PUNCH + }, + .evSpread = F_EV_SPREAD_SPEED, + .nature = NATURE_TIMID, + }, + { + .species = SPECIES_RHYDON, + .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, + .teamFlags = 0x05, + .moves = { + MOVE_STRENGTH, + MOVE_ROCK_TOMB, + MOVE_STOMP, + MOVE_ROCK_SMASH + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_QUIRKY, + }, + { + .species = SPECIES_CACTURNE, + .heldItem = BATTLE_TOWER_ITEM_POISON_BARB, + .teamFlags = 0x0B, + .moves = { + MOVE_POISON_STING, + MOVE_GROWTH, + MOVE_ABSORB, + MOVE_SOLAR_BEAM + }, + .evSpread = F_EV_SPREAD_SP_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_ZIGZAGOON, + .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, + .teamFlags = 0x0A, + .moves = { + MOVE_FLAIL, + MOVE_SAND_ATTACK, + MOVE_REST, + MOVE_SURF + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_SASSY, + }, + { + .species = SPECIES_DODRIO, + .heldItem = BATTLE_TOWER_ITEM_SHARP_BEAK, + .teamFlags = 0x03, + .moves = { + MOVE_PURSUIT, + MOVE_TRI_ATTACK, + MOVE_GROWL, + MOVE_AGILITY + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_SERIOUS, + }, + { + .species = SPECIES_WHISCASH, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0x0B, + .moves = { + MOVE_WATER_GUN, + MOVE_AMNESIA, + MOVE_MAGNITUDE, + MOVE_MUD_SLAP + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_LAX, + }, + { + .species = SPECIES_NINJASK, + .heldItem = BATTLE_TOWER_ITEM_SILVER_POWDER, + .teamFlags = 0x41, + .moves = { + MOVE_SAND_ATTACK, + MOVE_FURY_CUTTER, + MOVE_AGILITY, + MOVE_HARDEN + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_DUSCLOPS, + .heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY, + .teamFlags = 0x01, + .moves = { + MOVE_PROTECT, + MOVE_NIGHT_SHADE, + MOVE_ASTONISH, + MOVE_WILL_O_WISP + }, + .evSpread = F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_CAMERUPT, + .heldItem = BATTLE_TOWER_ITEM_CHARCOAL, + .teamFlags = 0x07, + .moves = { + MOVE_DIG, + MOVE_EMBER, + MOVE_GROWL, + MOVE_ROCK_SMASH + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, + .nature = NATURE_BOLD, + }, + { + .species = SPECIES_SPINDA, + .heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY, + .teamFlags = 0x4A, + .moves = { + MOVE_TEETER_DANCE, + MOVE_FLAIL, + MOVE_PSYCH_UP, + MOVE_DOUBLE_EDGE + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_CALM, + }, + { + .species = SPECIES_SEVIPER, + .heldItem = BATTLE_TOWER_ITEM_POISON_BARB, + .teamFlags = 0x09, + .moves = { + MOVE_SCREECH, + MOVE_GLARE, + MOVE_DIG, + MOVE_POISON_FANG + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_FLYGON, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0x49, + .moves = { + MOVE_SAND_ATTACK, + MOVE_SAND_TOMB, + MOVE_FACADE, + MOVE_TOXIC + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_AZUMARILL, + .heldItem = BATTLE_TOWER_ITEM_WHITE_HERB, + .teamFlags = 0x42, + .moves = { + MOVE_BUBBLE_BEAM, + MOVE_TAIL_WHIP, + MOVE_RAIN_DANCE, + MOVE_ROLLOUT + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_ZANGOOSE, + .heldItem = BATTLE_TOWER_ITEM_MENTAL_HERB, + .teamFlags = 0x07, + .moves = { + MOVE_STRENGTH, + MOVE_TAUNT, + MOVE_CRUSH_CLAW, + MOVE_DETECT + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_MEDICHAM, + .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, + .teamFlags = 0x07, + .moves = { + MOVE_REVERSAL, + MOVE_MEDITATE, + MOVE_CONFUSION, + MOVE_FACADE + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_HASTY, + }, + { + .species = SPECIES_ROSELIA, + .heldItem = BATTLE_TOWER_ITEM_MIRACLE_SEED, + .teamFlags = 0x0A, + .moves = { + MOVE_GROWTH, + MOVE_MEGA_DRAIN, + MOVE_TOXIC, + MOVE_CUT + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, + .nature = NATURE_NAUGHTY, + }, + { + .species = SPECIES_SWALOT, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x0B, + .moves = { + MOVE_STOCKPILE, + MOVE_SPIT_UP, + MOVE_SLUDGE, + MOVE_POISON_GAS + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_MAGNETON, + .heldItem = BATTLE_TOWER_ITEM_MAGNET, + .teamFlags = 0x0B, + .moves = { + MOVE_SUPERSONIC, + MOVE_THUNDER_WAVE, + MOVE_SCREECH, + MOVE_TRI_ATTACK + }, + .evSpread = F_EV_SPREAD_SPEED, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_GARDEVOIR, + .heldItem = BATTLE_TOWER_ITEM_TWISTED_SPOON, + .teamFlags = 0x09, + .moves = { + MOVE_CONFUSION, + MOVE_TOXIC, + MOVE_TORMENT, + MOVE_PROTECT + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_BOLD, + }, + { + .species = SPECIES_RELICANTH, + .heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER, + .teamFlags = 0x01, + .moves = { + MOVE_SURF, + MOVE_ANCIENT_POWER, + MOVE_ROCK_TOMB, + MOVE_HARDEN + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE, + .nature = NATURE_TIMID, + }, + { + .species = SPECIES_NINETALES, + .heldItem = BATTLE_TOWER_ITEM_RAWST_BERRY, + .teamFlags = 0x03, + .moves = { + MOVE_CONFUSE_RAY, + MOVE_FIRE_SPIN, + MOVE_QUICK_ATTACK, + MOVE_FLAMETHROWER + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_HASTY, + }, + { + .species = SPECIES_SHARPEDO, + .heldItem = BATTLE_TOWER_ITEM_BLACK_GLASSES, + .teamFlags = 0x05, + .moves = { + MOVE_BITE, + MOVE_SKULL_BASH, + MOVE_RAIN_DANCE, + MOVE_SURF + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_RELAXED, + }, + { + .species = SPECIES_GIRAFARIG, + .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, + .teamFlags = 0x03, + .moves = { + MOVE_STRENGTH, + MOVE_PSYBEAM, + MOVE_AGILITY, + MOVE_EARTHQUAKE + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_IMPISH, + }, + { + .species = SPECIES_PELIPPER, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x0B, + .moves = { + MOVE_MIST, + MOVE_STOCKPILE, + MOVE_SWALLOW, + MOVE_SPIT_UP + }, + .evSpread = F_EV_SPREAD_DEFENSE, + .nature = NATURE_QUIRKY, + }, + { + .species = SPECIES_SABLEYE, + .heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY, + .teamFlags = 0x09, + .moves = { + MOVE_SHADOW_BALL, + MOVE_NIGHT_SHADE, + MOVE_SNATCH, + MOVE_FAKE_OUT + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_LUNATONE, + .heldItem = BATTLE_TOWER_ITEM_HARD_STONE, + .teamFlags = 0x0B, + .moves = { + MOVE_COSMIC_POWER, + MOVE_SANDSTORM, + MOVE_PSYCHIC, + MOVE_ROCK_THROW + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_LUDICOLO, + .heldItem = BATTLE_TOWER_ITEM_NONE, + .teamFlags = 0x0B, + .moves = { + MOVE_THIEF, + MOVE_FAKE_OUT, + MOVE_SURF, + MOVE_RAIN_DANCE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_GRUMPIG, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x0B, + .moves = { + MOVE_ODOR_SLEUTH, + MOVE_CONFUSE_RAY, + MOVE_MAGIC_COAT, + MOVE_PSYCHIC + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_BRELOOM, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0x0B, + .moves = { + MOVE_CUT, + MOVE_LEECH_SEED, + MOVE_MEGA_DRAIN, + MOVE_STUN_SPORE + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_SASSY, + }, + { + .species = SPECIES_WAILORD, + .heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER, + .teamFlags = 0x03, + .moves = { + MOVE_WATER_SPOUT, + MOVE_ROLLOUT, + MOVE_MIST, + MOVE_RAIN_DANCE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_WEEZING, + .heldItem = BATTLE_TOWER_ITEM_POISON_BARB, + .teamFlags = 0x05, + .moves = { + MOVE_SMOG, + MOVE_SELF_DESTRUCT, + MOVE_TOXIC, + MOVE_SLUDGE_BOMB + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_BASHFUL, + }, + { + .species = SPECIES_KADABRA, + .heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY, + .teamFlags = 0x0B, + .moves = { + MOVE_FUTURE_SIGHT, + MOVE_FOCUS_PUNCH, + MOVE_SKILL_SWAP, + MOVE_SNATCH + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE, + .nature = NATURE_CAREFUL, + }, + { + .species = SPECIES_MANECTRIC, + .heldItem = BATTLE_TOWER_ITEM_MAGNET, + .teamFlags = 0x07, + .moves = { + MOVE_THUNDER_WAVE, + MOVE_BITE, + MOVE_SPARK, + MOVE_QUICK_ATTACK + }, + .evSpread = F_EV_SPREAD_SP_ATTACK, + .nature = NATURE_RASH, + }, + { + .species = SPECIES_RAICHU, + .heldItem = BATTLE_TOWER_ITEM_ASPEAR_BERRY, + .teamFlags = 0x03, + .moves = { + MOVE_QUICK_ATTACK, + MOVE_AGILITY, + MOVE_LIGHT_SCREEN, + MOVE_THUNDERBOLT + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_XATU, + .heldItem = BATTLE_TOWER_ITEM_TWISTED_SPOON, + .teamFlags = 0x03, + .moves = { + MOVE_NIGHT_SHADE, + MOVE_PECK, + MOVE_CONFUSE_RAY, + MOVE_FUTURE_SIGHT + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_LOUDRED, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x05, + .moves = { + MOVE_UPROAR, + MOVE_STOMP, + MOVE_SCREECH, + MOVE_EARTHQUAKE + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_MODEST, + }, + { + .species = SPECIES_SOLROCK, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x03, + .moves = { + MOVE_ROCK_THROW, + MOVE_SUNNY_DAY, + MOVE_SOLAR_BEAM, + MOVE_SANDSTORM + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_MILD, + }, + { + .species = SPECIES_CLAYDOL, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x03, + .moves = { + MOVE_SANDSTORM, + MOVE_REFLECT, + MOVE_ROCK_TOMB, + MOVE_STRENGTH + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_SERIOUS, + }, + { + .species = SPECIES_CRAWDAUNT, + .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, + .teamFlags = 0x03, + .moves = { + MOVE_WATER_PULSE, + MOVE_KNOCK_OFF, + MOVE_HARDEN, + MOVE_CUT + }, + .evSpread = F_EV_SPREAD_HP, + .nature = NATURE_JOLLY, + }, + { + .species = SPECIES_GOLBAT, + .heldItem = BATTLE_TOWER_ITEM_WHITE_HERB, + .teamFlags = 0x09, + .moves = { + MOVE_CONFUSE_RAY, + MOVE_WING_ATTACK, + MOVE_MEAN_LOOK, + MOVE_BITE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_BELLOSSOM, + .heldItem = BATTLE_TOWER_ITEM_MIRACLE_SEED, + .teamFlags = 0x0A, + .moves = { + MOVE_SOLAR_BEAM, + MOVE_PETAL_DANCE, + MOVE_SWEET_SCENT, + MOVE_BULLET_SEED + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_NAIVE, + }, + { + .species = SPECIES_DONPHAN, + .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, + .teamFlags = 0x05, + .moves = { + MOVE_ROCK_SMASH, + MOVE_RAPID_SPIN, + MOVE_FLAIL, + MOVE_HORN_ATTACK + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_IMPISH, + }, + { + .species = SPECIES_NOSEPASS, + .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, + .teamFlags = 0x0B, + .moves = { + MOVE_SANDSTORM, + MOVE_ROCK_SLIDE, + MOVE_BLOCK, + MOVE_THUNDER_WAVE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_JOLLY, + }, + { + .species = SPECIES_PINSIR, + .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, + .teamFlags = 0x05, + .moves = { + MOVE_SWORDS_DANCE, + MOVE_HARDEN, + MOVE_CUT, + MOVE_SEISMIC_TOSS + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_DOCILE, + }, + { + .species = SPECIES_GOLDUCK, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x0B, + .moves = { + MOVE_DISABLE, + MOVE_PSYCH_UP, + MOVE_WATER_PULSE, + MOVE_BRICK_BREAK + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_SHIFTRY, + .heldItem = BATTLE_TOWER_ITEM_MENTAL_HERB, + .teamFlags = 0x07, + .moves = { + MOVE_TORMENT, + MOVE_EXTRASENSORY, + MOVE_SOLAR_BEAM, + MOVE_AERIAL_ACE + }, + .evSpread = F_EV_SPREAD_DEFENSE, + .nature = NATURE_NAIVE, + }, + { + .species = SPECIES_DUSTOX, + .heldItem = BATTLE_TOWER_ITEM_SILVER_POWDER, + .teamFlags = 0x01, + .moves = { + MOVE_CONFUSION, + MOVE_SILVER_WIND, + MOVE_PSYBEAM, + MOVE_WHIRLWIND + }, + .evSpread = F_EV_SPREAD_SPEED, + .nature = NATURE_SERIOUS, + }, + { + .species = SPECIES_SHUPPET, + .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, + .teamFlags = 0x03, + .moves = { + MOVE_WILL_O_WISP, + MOVE_NIGHT_SHADE, + MOVE_FAINT_ATTACK, + MOVE_CURSE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_SEAKING, + .heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER, + .teamFlags = 0x07, + .moves = { + MOVE_RAIN_DANCE, + MOVE_SURF, + MOVE_HORN_ATTACK, + MOVE_HORN_DRILL + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE, + .nature = NATURE_LONELY, + }, + { + .species = SPECIES_SKARMORY, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x07, + .moves = { + MOVE_STEEL_WING, + MOVE_SAND_ATTACK, + MOVE_SWIFT, + MOVE_AGILITY + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_RELAXED, + }, + { + .species = SPECIES_TORKOAL, + .heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND, + .teamFlags = 0x43, + .moves = { + MOVE_FLAMETHROWER, + MOVE_IRON_DEFENSE, + MOVE_BODY_SLAM, + MOVE_PROTECT + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_NAUGHTY, + }, + { + .species = SPECIES_GOLEM, + .heldItem = BATTLE_TOWER_ITEM_SOFT_SAND, + .teamFlags = 0x05, + .moves = { + MOVE_MAGNITUDE, + MOVE_EXPLOSION, + MOVE_STRENGTH, + MOVE_SANDSTORM + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_DOCILE, + }, + { + .species = SPECIES_GARDEVOIR, + .heldItem = BATTLE_TOWER_ITEM_TWISTED_SPOON, + .teamFlags = 0x41, + .moves = { + MOVE_REFLECT, + MOVE_PSYCHIC, + MOVE_IMPRISON, + MOVE_TOXIC + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, + .nature = NATURE_HASTY, + }, + { + .species = SPECIES_SANDSLASH, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x07, + .moves = { + MOVE_SANDSTORM, + MOVE_SLASH, + MOVE_EARTHQUAKE, + MOVE_SWIFT + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, + .nature = NATURE_ADAMANT, + }, + { + .species = SPECIES_WOBBUFFET, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x0B, + .moves = { + MOVE_COUNTER, + MOVE_MIRROR_COAT, + MOVE_SAFEGUARD, + MOVE_DESTINY_BOND + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_CALM, + }, + { + .species = SPECIES_TENTACRUEL, + .heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY, + .teamFlags = 0x05, + .moves = { + MOVE_CONSTRICT, + MOVE_SURF, + MOVE_HYPER_BEAM, + MOVE_SCREECH + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_IMPISH, + }, + { + .species = SPECIES_TROPIUS, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x05, + .moves = { + MOVE_SUNNY_DAY, + MOVE_SOLAR_BEAM, + MOVE_SYNTHESIS, + MOVE_RAZOR_LEAF + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE, + .nature = NATURE_DOCILE, + }, + { + .species = SPECIES_MAWILE, + .heldItem = BATTLE_TOWER_ITEM_METAL_COAT, + .teamFlags = 0x43, + .moves = { + MOVE_IRON_DEFENSE, + MOVE_SLUDGE_BOMB, + MOVE_CRUNCH, + MOVE_STRENGTH + }, + .evSpread = F_EV_SPREAD_ATTACK, + .nature = NATURE_CALM, + }, + { + .species = SPECIES_MUK, + .heldItem = BATTLE_TOWER_ITEM_RAWST_BERRY, + .teamFlags = 0x09, + .moves = { + MOVE_SLUDGE, + MOVE_ACID_ARMOR, + MOVE_GIGA_DRAIN, + MOVE_DISABLE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_MAGCARGO, + .heldItem = BATTLE_TOWER_ITEM_CHARCOAL, + .teamFlags = 0x0D, + .moves = { + MOVE_FLAMETHROWER, + MOVE_ROCK_THROW, + MOVE_HARDEN, + MOVE_AMNESIA + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, + .nature = NATURE_NAUGHTY, + }, + { + .species = SPECIES_LINOONE, + .heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY, + .teamFlags = 0x07, + .moves = { + MOVE_HEADBUTT, + MOVE_TAIL_WHIP, + MOVE_SURF, + MOVE_DIG + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_QUIRKY, + }, + { + .species = SPECIES_ELECTRODE, + .heldItem = BATTLE_TOWER_ITEM_ASPEAR_BERRY, + .teamFlags = 0x05, + .moves = { + MOVE_LIGHT_SCREEN, + MOVE_THUNDERBOLT, + MOVE_SWIFT, + MOVE_ROLLOUT + }, + .evSpread = F_EV_SPREAD_SPEED, + .nature = NATURE_SERIOUS, + }, + { + .species = SPECIES_DUSCLOPS, + .heldItem = BATTLE_TOWER_ITEM_SPELL_TAG, + .teamFlags = 0x09, + .moves = { + MOVE_MEAN_LOOK, + MOVE_NIGHT_SHADE, + MOVE_SKILL_SWAP, + MOVE_SHADOW_BALL + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_NAIVE, + }, + { + .species = SPECIES_VILEPLUME, + .heldItem = BATTLE_TOWER_ITEM_MIRACLE_SEED, + .teamFlags = 0x0A, + .moves = { + MOVE_TOXIC, + MOVE_MOONLIGHT, + MOVE_GIGA_DRAIN, + MOVE_STUN_SPORE + }, + .evSpread = F_EV_SPREAD_HP, + .nature = NATURE_DOCILE, + }, + { + .species = SPECIES_CROBAT, + .heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY, + .teamFlags = 0x05, + .moves = { + MOVE_BITE, + MOVE_HAZE, + MOVE_WING_ATTACK, + MOVE_STEEL_WING + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_TIMID, + }, + { + .species = SPECIES_CORSOLA, + .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, + .teamFlags = 0x0A, + .moves = { + MOVE_RECOVER, + MOVE_MIRROR_COAT, + MOVE_HAIL, + MOVE_SURF + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_STARMIE, + .heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER, + .teamFlags = 0x0B, + .moves = { + MOVE_RAPID_SPIN, + MOVE_WATER_PULSE, + MOVE_REFLECT, + MOVE_SKILL_SWAP + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_EXPLOUD, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x41, + .moves = { + MOVE_HYPER_BEAM, + MOVE_HOWL, + MOVE_UPROAR, + MOVE_EARTHQUAKE + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_ALAKAZAM, + .heldItem = BATTLE_TOWER_ITEM_TWISTED_SPOON, + .teamFlags = 0x0B, + .moves = { + MOVE_PSYBEAM, + MOVE_SNATCH, + MOVE_REFLECT, + MOVE_HYPER_BEAM + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_RELAXED, + }, + { + .species = SPECIES_HERACROSS, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0x05, + .moves = { + MOVE_HORN_ATTACK, + MOVE_COUNTER, + MOVE_REVERSAL, + MOVE_LEER + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_BOLD, + }, + { + .species = SPECIES_CASTFORM, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x0B, + .moves = { + MOVE_WEATHER_BALL, + MOVE_SUNNY_DAY, + MOVE_RAIN_DANCE, + MOVE_HAIL + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_LAX, + }, + { + .species = SPECIES_VIGOROTH, + .heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND, + .teamFlags = 0x05, + .moves = { + MOVE_FOCUS_PUNCH, + MOVE_REVERSAL, + MOVE_COUNTER, + MOVE_TAUNT + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_DUSKULL, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x09, + .moves = { + MOVE_TOXIC, + MOVE_CONFUSE_RAY, + MOVE_SHADOW_BALL, + MOVE_WILL_O_WISP + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_LANTURN, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0x07, + .moves = { + MOVE_FLAIL, + MOVE_SURF, + MOVE_SPARK, + MOVE_TAKE_DOWN + }, + .evSpread = F_EV_SPREAD_SPEED, + .nature = NATURE_SASSY, + }, + { + .species = SPECIES_HARIYAMA, + .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, + .teamFlags = 0x05, + .moves = { + MOVE_STRENGTH, + MOVE_FAKE_OUT, + MOVE_FACADE, + MOVE_SAND_ATTACK + }, + .evSpread = F_EV_SPREAD_SPEED, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_KINGDRA, + .heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER, + .teamFlags = 0x43, + .moves = { + MOVE_AGILITY, + MOVE_DIVE, + MOVE_ICE_BEAM, + MOVE_PROTECT + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_GYARADOS, + .heldItem = BATTLE_TOWER_ITEM_DRAGON_FANG, + .teamFlags = 0x41, + .moves = { + MOVE_RAIN_DANCE, + MOVE_SURF, + MOVE_WATER_PULSE, + MOVE_HYPER_BEAM + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_IMPISH, + }, + { + .species = SPECIES_AGGRON, + .heldItem = BATTLE_TOWER_ITEM_METAL_COAT, + .teamFlags = 0x45, + .moves = { + MOVE_EARTHQUAKE, + MOVE_BRICK_BREAK, + MOVE_METAL_CLAW, + MOVE_ROAR + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_RELAXED, + }, + { + .species = SPECIES_ABSOL, + .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, + .teamFlags = 0xC7, + .moves = { + MOVE_SWORDS_DANCE, + MOVE_IRON_TAIL, + MOVE_SLASH, + MOVE_FACADE + }, + .evSpread = F_EV_SPREAD_ATTACK, + .nature = NATURE_LAX, + }, + { + .species = SPECIES_SWELLOW, + .heldItem = BATTLE_TOWER_ITEM_SHARP_BEAK, + .teamFlags = 0x0F, + .moves = { + MOVE_DOUBLE_TEAM, + MOVE_FLY, + MOVE_TOXIC, + MOVE_STEEL_WING + }, + .evSpread = 0, + .nature = NATURE_HASTY, + }, + { + .species = SPECIES_MACHAMP, + .heldItem = BATTLE_TOWER_ITEM_BLACK_BELT, + .teamFlags = 0x05, + .moves = { + MOVE_STRENGTH, + MOVE_CROSS_CHOP, + MOVE_EARTHQUAKE, + MOVE_FLAMETHROWER + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, + .nature = NATURE_HASTY, + }, + { + .species = SPECIES_SWAMPERT, + .heldItem = BATTLE_TOWER_ITEM_NEVER_MELT_ICE, + .teamFlags = 0x41, + .moves = { + MOVE_PROTECT, + MOVE_ICE_BEAM, + MOVE_HYPER_BEAM, + MOVE_SURF + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_DOCILE, + }, + { + .species = SPECIES_SCEPTILE, + .heldItem = BATTLE_TOWER_ITEM_MIRACLE_SEED, + .teamFlags = 0x41, + .moves = { + MOVE_LEAF_BLADE, + MOVE_DRAGON_CLAW, + MOVE_AGILITY, + MOVE_PROTECT + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_DOCILE, + }, + { + .species = SPECIES_BLAZIKEN, + .heldItem = BATTLE_TOWER_ITEM_CHARCOAL, + .teamFlags = 0x41, + .moves = { + MOVE_BLAZE_KICK, + MOVE_MIRROR_MOVE, + MOVE_EARTHQUAKE, + MOVE_PROTECT + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_DOCILE, + }, + { + .species = SPECIES_ALTARIA, + .heldItem = BATTLE_TOWER_ITEM_DRAGON_FANG, + .teamFlags = 0x43, + .moves = { + MOVE_DRAGON_CLAW, + MOVE_DRAGON_DANCE, + MOVE_TOXIC, + MOVE_DOUBLE_TEAM + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_DOCILE, + }, + { + .species = SPECIES_LUDICOLO, + .heldItem = BATTLE_TOWER_ITEM_BLACK_BELT, + .teamFlags = 0x43, + .moves = { + MOVE_BRICK_BREAK, + MOVE_WATER_PULSE, + MOVE_RAIN_DANCE, + MOVE_FOCUS_PUNCH + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HASTY, + }, + { + .species = SPECIES_SABLEYE, + .heldItem = BATTLE_TOWER_ITEM_SPELL_TAG, + .teamFlags = 0x49, + .moves = { + MOVE_SHADOW_BALL, + MOVE_SNATCH, + MOVE_DIG, + MOVE_CONFUSE_RAY + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_ZANGOOSE, + .heldItem = BATTLE_TOWER_ITEM_BLACK_GLASSES, + .teamFlags = 0x0F, + .moves = { + MOVE_FACADE, + MOVE_THUNDERBOLT, + MOVE_CRUSH_CLAW, + MOVE_DETECT + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_CALM, + }, + { + .species = SPECIES_LINOONE, + .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, + .teamFlags = 0x0F, + .moves = { + MOVE_IRON_TAIL, + MOVE_HEADBUTT, + MOVE_ATTRACT, + MOVE_ICE_BEAM + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_WHISCASH, + .heldItem = BATTLE_TOWER_ITEM_SOFT_SAND, + .teamFlags = 0x07, + .moves = { + MOVE_MUD_SLAP, + MOVE_EARTHQUAKE, + MOVE_SURF, + MOVE_AMNESIA + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_BOLD, + }, + { + .species = SPECIES_SOLROCK, + .heldItem = BATTLE_TOWER_ITEM_HARD_STONE, + .teamFlags = 0x43, + .moves = { + MOVE_EARTHQUAKE, + MOVE_LIGHT_SCREEN, + MOVE_ROCK_SLIDE, + MOVE_CONFUSION + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_BASHFUL, + }, + { + .species = SPECIES_STARMIE, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x03, + .moves = { + MOVE_RECOVER, + MOVE_RAIN_DANCE, + MOVE_SURF, + MOVE_CONFUSE_RAY + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_NAIVE, + }, + { + .species = SPECIES_CACTURNE, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x0F, + .moves = { + MOVE_INGRAIN, + MOVE_LEECH_SEED, + MOVE_PROTECT, + MOVE_FRUSTRATION + }, + .evSpread = 0, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_SHIFTRY, + .heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND, + .teamFlags = 0x05, + .moves = { + MOVE_FRUSTRATION, + MOVE_HYPER_BEAM, + MOVE_GIGA_DRAIN, + MOVE_TORMENT + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_ADAMANT, + }, + { + .species = SPECIES_MANECTRIC, + .heldItem = BATTLE_TOWER_ITEM_MAGNET, + .teamFlags = 0x0F, + .moves = { + MOVE_THUNDER, + MOVE_THUNDER_WAVE, + MOVE_IRON_TAIL, + MOVE_ROAR + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_ADAMANT, + }, + { + .species = SPECIES_KECLEON, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0xC3, + .moves = { + MOVE_THUNDERBOLT, + MOVE_FOCUS_PUNCH, + MOVE_IRON_TAIL, + MOVE_FLAMETHROWER + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_PINSIR, + .heldItem = BATTLE_TOWER_ITEM_SOFT_SAND, + .teamFlags = 0x8D, + .moves = { + MOVE_GUILLOTINE, + MOVE_SUBMISSION, + MOVE_EARTHQUAKE, + MOVE_ROCK_TOMB + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_METANG, + .heldItem = BATTLE_TOWER_ITEM_METAL_COAT, + .teamFlags = 0x05, + .moves = { + MOVE_EARTHQUAKE, + MOVE_SHADOW_BALL, + MOVE_PSYCHIC, + MOVE_METEOR_MASH + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_IMPISH, + }, + { + .species = SPECIES_CLAYDOL, + .heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY, + .teamFlags = 0x43, + .moves = { + MOVE_EARTHQUAKE, + MOVE_SELF_DESTRUCT, + MOVE_SANDSTORM, + MOVE_PROTECT + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_LAX, + }, + { + .species = SPECIES_MASQUERAIN, + .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, + .teamFlags = 0x0A, + .moves = { + MOVE_TOXIC, + MOVE_SILVER_WIND, + MOVE_ATTRACT, + MOVE_ICE_BEAM + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_RELICANTH, + .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, + .teamFlags = 0xC5, + .moves = { + MOVE_ROCK_TOMB, + MOVE_DOUBLE_EDGE, + MOVE_SURF, + MOVE_EARTHQUAKE + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_WALREIN, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x0D, + .moves = { + MOVE_SURF, + MOVE_ENCORE, + MOVE_BLIZZARD, + MOVE_HYPER_BEAM + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_WAILORD, + .heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY, + .teamFlags = 0x0B, + .moves = { + MOVE_WATER_SPOUT, + MOVE_REST, + MOVE_AMNESIA, + MOVE_HAIL + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, + .nature = NATURE_HASTY, + }, + { + .species = SPECIES_GIRAFARIG, + .heldItem = BATTLE_TOWER_ITEM_GANLON_BERRY, + .teamFlags = 0x4F, + .moves = { + MOVE_DOUBLE_TEAM, + MOVE_CRUNCH, + MOVE_PSYCHIC, + MOVE_EARTHQUAKE + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_MEDICHAM, + .heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY, + .teamFlags = 0x4B, + .moves = { + MOVE_CALM_MIND, + MOVE_REVERSAL, + MOVE_ROCK_TOMB, + MOVE_PSYCHIC + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_RELAXED, + }, + { + .species = SPECIES_TROPIUS, + .heldItem = BATTLE_TOWER_ITEM_MENTAL_HERB, + .teamFlags = 0xC7, + .moves = { + MOVE_EARTHQUAKE, + MOVE_SYNTHESIS, + MOVE_RAZOR_LEAF, + MOVE_HYPER_BEAM + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_BOLD, + }, + { + .species = SPECIES_NINJASK, + .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, + .teamFlags = 0x05, + .moves = { + MOVE_DOUBLE_TEAM, + MOVE_SLASH, + MOVE_SWORDS_DANCE, + MOVE_LEECH_LIFE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_LAX, + }, + { + .species = SPECIES_CAMERUPT, + .heldItem = BATTLE_TOWER_ITEM_CHARCOAL, + .teamFlags = 0x0D, + .moves = { + MOVE_EARTHQUAKE, + MOVE_OVERHEAT, + MOVE_SUNNY_DAY, + MOVE_ROCK_SLIDE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_CAREFUL, + }, + { + .species = SPECIES_SHARPEDO, + .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, + .teamFlags = 0x05, + .moves = { + MOVE_CRUNCH, + MOVE_SURF, + MOVE_EARTHQUAKE, + MOVE_PROTECT + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_WIGGLYTUFF, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x0E, + .moves = { + MOVE_PROTECT, + MOVE_TOXIC, + MOVE_DOUBLE_TEAM, + MOVE_DIG + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, + .nature = NATURE_LAX, + }, + { + .species = SPECIES_SEVIPER, + .heldItem = BATTLE_TOWER_ITEM_POISON_BARB, + .teamFlags = 0x05, + .moves = { + MOVE_SLUDGE_BOMB, + MOVE_HAZE, + MOVE_CRUNCH, + MOVE_FLAMETHROWER + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, + .nature = NATURE_NAIVE, + }, + { + .species = SPECIES_CRADILY, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0xC1, + .moves = { + MOVE_ROCK_TOMB, + MOVE_CONFUSE_RAY, + MOVE_INGRAIN, + MOVE_EARTHQUAKE + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_ARMALDO, + .heldItem = BATTLE_TOWER_ITEM_RAWST_BERRY, + .teamFlags = 0xC1, + .moves = { + MOVE_EARTHQUAKE, + MOVE_SANDSTORM, + MOVE_PROTECT, + MOVE_SLASH + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_MAGNETON, + .heldItem = BATTLE_TOWER_ITEM_PERSIM_BERRY, + .teamFlags = 0x0D, + .moves = { + MOVE_ZAP_CANNON, + MOVE_SUPERSONIC, + MOVE_TOXIC, + MOVE_PROTECT + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_ADAMANT, + }, + { + .species = SPECIES_LANTURN, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0x06, + .moves = { + MOVE_THUNDER, + MOVE_SURF, + MOVE_ICE_BEAM, + MOVE_RAIN_DANCE + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE, + .nature = NATURE_ADAMANT, + }, + { + .species = SPECIES_SWALOT, + .heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY, + .teamFlags = 0x8B, + .moves = { + MOVE_SLUDGE_BOMB, + MOVE_SNATCH, + MOVE_ENCORE, + MOVE_BODY_SLAM + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_SKARMORY, + .heldItem = BATTLE_TOWER_ITEM_METAL_COAT, + .teamFlags = 0x81, + .moves = { + MOVE_STEEL_WING, + MOVE_AGILITY, + MOVE_TORMENT, + MOVE_FACADE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_LAX, + }, + { + .species = SPECIES_DONPHAN, + .heldItem = BATTLE_TOWER_ITEM_WHITE_HERB, + .teamFlags = 0x0D, + .moves = { + MOVE_EARTHQUAKE, + MOVE_FLAIL, + MOVE_ROAR, + MOVE_IRON_TAIL + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_HERACROSS, + .heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND, + .teamFlags = 0x41, + .moves = { + MOVE_FACADE, + MOVE_REVERSAL, + MOVE_MEGAHORN, + MOVE_EARTHQUAKE + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_BANETTE, + .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, + .teamFlags = 0x83, + .moves = { + MOVE_SHADOW_BALL, + MOVE_HYPER_BEAM, + MOVE_THUNDERBOLT, + MOVE_SKILL_SWAP + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, + .nature = NATURE_CAREFUL, + }, + { + .species = SPECIES_SANDSLASH, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x0F, + .moves = { + MOVE_SANDSTORM, + MOVE_TOXIC, + MOVE_SLASH, + MOVE_EARTHQUAKE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_LAX, + }, + { + .species = SPECIES_CRAWDAUNT, + .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, + .teamFlags = 0x05, + .moves = { + MOVE_GUILLOTINE, + MOVE_CRABHAMMER, + MOVE_BLIZZARD, + MOVE_SLUDGE_BOMB + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_DOCILE, + }, + { + .species = SPECIES_GRUMPIG, + .heldItem = BATTLE_TOWER_ITEM_TWISTED_SPOON, + .teamFlags = 0x8B, + .moves = { + MOVE_MAGIC_COAT, + MOVE_PSYCHIC, + MOVE_REFLECT, + MOVE_CONFUSE_RAY + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_LONELY, + }, + { + .species = SPECIES_RHYDON, + .heldItem = BATTLE_TOWER_ITEM_CHOICE_BAND, + .teamFlags = 0x45, + .moves = { + MOVE_IRON_TAIL, + MOVE_EARTHQUAKE, + MOVE_SURF, + MOVE_FIRE_BLAST + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, + .nature = NATURE_RASH, + }, + { + .species = SPECIES_ALAKAZAM, + .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, + .teamFlags = 0x8B, + .moves = { + MOVE_PSYCHIC, + MOVE_REFLECT, + MOVE_RECOVER, + MOVE_SKILL_SWAP + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_HASTY, + }, + { + .species = SPECIES_DUSCLOPS, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x41, + .moves = { + MOVE_SHADOW_BALL, + MOVE_WILL_O_WISP, + MOVE_BLIZZARD, + MOVE_PSYCHIC + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, + .nature = NATURE_CAREFUL, + }, + { + .species = SPECIES_TORKOAL, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x09, + .moves = { + MOVE_FLAMETHROWER, + MOVE_AMNESIA, + MOVE_IRON_TAIL, + MOVE_REST + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, + .nature = NATURE_NAIVE, + }, + { + .species = SPECIES_ELECTRODE, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x09, + .moves = { + MOVE_SCREECH, + MOVE_EXPLOSION, + MOVE_MIRROR_COAT, + MOVE_PROTECT + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_RASH, + }, + { + .species = SPECIES_BRELOOM, + .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, + .teamFlags = 0x0B, + .moves = { + MOVE_IRON_TAIL, + MOVE_FOCUS_PUNCH, + MOVE_DOUBLE_TEAM, + MOVE_LEECH_SEED + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_LAX, + }, + { + .species = SPECIES_MUK, + .heldItem = BATTLE_TOWER_ITEM_POISON_BARB, + .teamFlags = 0x05, + .moves = { + MOVE_SLUDGE_BOMB, + MOVE_THUNDERBOLT, + MOVE_FLAMETHROWER, + MOVE_FOCUS_PUNCH + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_NAIVE, + }, + { + .species = SPECIES_WEEZING, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0x05, + .moves = { + MOVE_EXPLOSION, + MOVE_SLUDGE_BOMB, + MOVE_SHADOW_BALL, + MOVE_FLAMETHROWER + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_NAIVE, + }, + { + .species = SPECIES_RAICHU, + .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, + .teamFlags = 0x4E, + .moves = { + MOVE_THUNDERBOLT, + MOVE_DOUBLE_TEAM, + MOVE_FOCUS_PUNCH, + MOVE_ATTRACT + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_JOLLY, + }, + { + .species = SPECIES_TENTACRUEL, + .heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER, + .teamFlags = 0x09, + .moves = { + MOVE_DOUBLE_TEAM, + MOVE_TOXIC, + MOVE_SURF, + MOVE_SLUDGE_BOMB + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_BOLD, + }, + { + .species = SPECIES_EXPLOUD, + .heldItem = BATTLE_TOWER_ITEM_CHOICE_BAND, + .teamFlags = 0x05, + .moves = { + MOVE_BLIZZARD, + MOVE_FLAMETHROWER, + MOVE_EARTHQUAKE, + MOVE_RETURN + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_BASHFUL, + }, + { + .species = SPECIES_XATU, + .heldItem = BATTLE_TOWER_ITEM_WHITE_HERB, + .teamFlags = 0x43, + .moves = { + MOVE_PSYCHIC, + MOVE_REST, + MOVE_CONFUSE_RAY, + MOVE_TOXIC + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_GOLEM, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x05, + .moves = { + MOVE_EXPLOSION, + MOVE_EARTHQUAKE, + MOVE_ROCK_TOMB, + MOVE_FLAMETHROWER + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_IMPISH, + }, + { + .species = SPECIES_GOLDUCK, + .heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY, + .teamFlags = 0x83, + .moves = { + MOVE_SURF, + MOVE_ATTRACT, + MOVE_CALM_MIND, + MOVE_BLIZZARD + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_HASTY, + }, + { + .species = SPECIES_NINETALES, + .heldItem = BATTLE_TOWER_ITEM_CHARCOAL, + .teamFlags = 0x4A, + .moves = { + MOVE_FLAMETHROWER, + MOVE_ATTRACT, + MOVE_TOXIC, + MOVE_CONFUSE_RAY + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_KINGDRA, + .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, + .teamFlags = 0x13, + .moves = { + MOVE_DOUBLE_TEAM, + MOVE_REST, + MOVE_SURF, + MOVE_DRAGON_BREATH + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, + .nature = NATURE_ADAMANT, + }, + { + .species = SPECIES_SLAKING, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x03, + .moves = { + MOVE_CURSE, + MOVE_AMNESIA, + MOVE_YAWN, + MOVE_FOCUS_PUNCH + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, + .nature = NATURE_LAX, + }, + { + .species = SPECIES_GYARADOS, + .heldItem = BATTLE_TOWER_ITEM_CHERI_BERRY, + .teamFlags = 0x03, + .moves = { + MOVE_THUNDER, + MOVE_EARTHQUAKE, + MOVE_HYDRO_PUMP, + MOVE_RAIN_DANCE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK, + .nature = NATURE_NAUGHTY, + }, + { + .species = SPECIES_HARIYAMA, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x21, + .moves = { + MOVE_BELLY_DRUM, + MOVE_ENDURE, + MOVE_EARTHQUAKE, + MOVE_REVERSAL + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED, + .nature = NATURE_SASSY, + }, + { + .species = SPECIES_ABSOL, + .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, + .teamFlags = 0xC3, + .moves = { + MOVE_FAINT_ATTACK, + MOVE_DOUBLE_EDGE, + MOVE_SHADOW_BALL, + MOVE_FLAMETHROWER + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_RELAXED, + }, + { + .species = SPECIES_ALTARIA, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x83, + .moves = { + MOVE_DRAGON_DANCE, + MOVE_MIRROR_MOVE, + MOVE_DRAGON_CLAW, + MOVE_EARTHQUAKE + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_RASH, + }, + { + .species = SPECIES_MACHAMP, + .heldItem = BATTLE_TOWER_ITEM_BLACK_BELT, + .teamFlags = 0x11, + .moves = { + MOVE_CROSS_CHOP, + MOVE_FOCUS_PUNCH, + MOVE_ROCK_TOMB, + MOVE_ENCORE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED, + .nature = NATURE_SASSY, + }, + { + .species = SPECIES_FLYGON, + .heldItem = BATTLE_TOWER_ITEM_DRAGON_FANG, + .teamFlags = 0x43, + .moves = { + MOVE_CRUNCH, + MOVE_DRAGON_CLAW, + MOVE_EARTHQUAKE, + MOVE_FLAMETHROWER + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_NAIVE, + }, + { + .species = SPECIES_BLAZIKEN, + .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, + .teamFlags = 0x33, + .moves = { + MOVE_COUNTER, + MOVE_ROCK_SLIDE, + MOVE_FOCUS_PUNCH, + MOVE_FLAMETHROWER + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_GLALIE, + .heldItem = BATTLE_TOWER_ITEM_NEVER_MELT_ICE, + .teamFlags = 0x81, + .moves = { + MOVE_BLIZZARD, + MOVE_CRUNCH, + MOVE_ICY_WIND, + MOVE_DOUBLE_TEAM + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_JOLLY, + }, + { + .species = SPECIES_HUNTAIL, + .heldItem = BATTLE_TOWER_ITEM_MYSTIC_WATER, + .teamFlags = 0xA1, + .moves = { + MOVE_RAIN_DANCE, + MOVE_HYDRO_PUMP, + MOVE_CRUNCH, + MOVE_BLIZZARD + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_MILOTIC, + .heldItem = BATTLE_TOWER_ITEM_GANLON_BERRY, + .teamFlags = 0xD3, + .moves = { + MOVE_SURF, + MOVE_ATTRACT, + MOVE_RECOVER, + MOVE_TOXIC + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_HASTY, + }, + { + .species = SPECIES_GOREBYSS, + .heldItem = BATTLE_TOWER_ITEM_PECHA_BERRY, + .teamFlags = 0x83, + .moves = { + MOVE_PSYCHIC, + MOVE_SURF, + MOVE_BLIZZARD, + MOVE_SHADOW_BALL + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_ADAMANT, + }, + { + .species = SPECIES_SCEPTILE, + .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, + .teamFlags = 0x53, + .moves = { + MOVE_LEAF_BLADE, + MOVE_ENDEAVOR, + MOVE_EARTHQUAKE, + MOVE_ROCK_TOMB + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED, + .nature = NATURE_BASHFUL, + }, + { + .species = SPECIES_SWAMPERT, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x53, + .moves = { + MOVE_EARTHQUAKE, + MOVE_SURF, + MOVE_MUD_SHOT, + MOVE_BLIZZARD + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_NAIVE, + }, + { + .species = SPECIES_AGGRON, + .heldItem = BATTLE_TOWER_ITEM_MENTAL_HERB, + .teamFlags = 0x41, + .moves = { + MOVE_DOUBLE_EDGE, + MOVE_FLAMETHROWER, + MOVE_IRON_TAIL, + MOVE_BLIZZARD + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_BOLD, + }, + { + .species = SPECIES_CRADILY, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0xE1, + .moves = { + MOVE_STOCKPILE, + MOVE_SPIT_UP, + MOVE_SWALLOW, + MOVE_DOUBLE_TEAM + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_LAX, + }, + { + .species = SPECIES_ARMALDO, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0xC1, + .moves = { + MOVE_EARTHQUAKE, + MOVE_HYPER_BEAM, + MOVE_SLASH, + MOVE_SWORDS_DANCE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_LAX, + }, + { + .species = SPECIES_BRELOOM, + .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, + .teamFlags = 0x82, + .moves = { + MOVE_FOCUS_PUNCH, + MOVE_COUNTER, + MOVE_MACH_PUNCH, + MOVE_SNATCH + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_LAX, + }, + { + .species = SPECIES_LUDICOLO, + .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, + .teamFlags = 0x83, + .moves = { + MOVE_RAIN_DANCE, + MOVE_SURF, + MOVE_PROTECT, + MOVE_TOXIC + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_HASTY, + }, + { + .species = SPECIES_SHIFTRY, + .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, + .teamFlags = 0x03, + .moves = { + MOVE_TORMENT, + MOVE_FAINT_ATTACK, + MOVE_SHADOW_BALL, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_NAIVE, + }, + { + .species = SPECIES_TROPIUS, + .heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY, + .teamFlags = 0xC3, + .moves = { + MOVE_SUNNY_DAY, + MOVE_SYNTHESIS, + MOVE_SOLAR_BEAM, + MOVE_LEECH_SEED + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_GRUMPIG, + .heldItem = BATTLE_TOWER_ITEM_MACHO_BRACE, + .teamFlags = 0x23, + .moves = { + MOVE_TRICK, + MOVE_SKILL_SWAP, + MOVE_PSYCHIC, + MOVE_REST + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_TORKOAL, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x81, + .moves = { + MOVE_IRON_DEFENSE, + MOVE_TOXIC, + MOVE_REST, + MOVE_FLAMETHROWER + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_NAIVE, + }, + { + .species = SPECIES_MANECTRIC, + .heldItem = BATTLE_TOWER_ITEM_NONE, + .teamFlags = 0x03, + .moves = { + MOVE_THUNDERBOLT, + MOVE_CRUNCH, + MOVE_ROAR, + MOVE_THIEF + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_HASTY, + }, + { + .species = SPECIES_PINSIR, + .heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY, + .teamFlags = 0x61, + .moves = { + MOVE_GUILLOTINE, + MOVE_EARTHQUAKE, + MOVE_DOUBLE_TEAM, + MOVE_ROCK_TOMB + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_LAX, + }, + { + .species = SPECIES_STARMIE, + .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, + .teamFlags = 0x93, + .moves = { + MOVE_LIGHT_SCREEN, + MOVE_THUNDERBOLT, + MOVE_SURF, + MOVE_REST + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_ADAMANT, + }, + { + .species = SPECIES_HERACROSS, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x51, + .moves = { + MOVE_MEGAHORN, + MOVE_REVERSAL, + MOVE_EARTHQUAKE, + MOVE_COUNTER + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_WALREIN, + .heldItem = BATTLE_TOWER_ITEM_NEVER_MELT_ICE, + .teamFlags = 0x83, + .moves = { + MOVE_BLIZZARD, + MOVE_EARTHQUAKE, + MOVE_SURF, + MOVE_ROCK_SLIDE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_CAREFUL, + }, + { + .species = SPECIES_ALAKAZAM, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x13, + .moves = { + MOVE_PSYCHIC, + MOVE_RECOVER, + MOVE_ENCORE, + MOVE_SNATCH + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_HASTY, + }, + { + .species = SPECIES_MILOTIC, + .heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY, + .teamFlags = 0x93, + .moves = { + MOVE_SURF, + MOVE_BLIZZARD, + MOVE_RECOVER, + MOVE_DOUBLE_TEAM + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_REGICE, + .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, + .teamFlags = 0x11, + .moves = { + MOVE_REST, + MOVE_CURSE, + MOVE_BLIZZARD, + MOVE_EARTHQUAKE + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_MILD, + }, + { + .species = SPECIES_REGISTEEL, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x11, + .moves = { + MOVE_REST, + MOVE_IRON_DEFENSE, + MOVE_THUNDERBOLT, + MOVE_EARTHQUAKE + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, + .nature = NATURE_MILD, + }, + { + .species = SPECIES_REGIROCK, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0x91, + .moves = { + MOVE_ROCK_TOMB, + MOVE_EARTHQUAKE, + MOVE_THUNDERBOLT, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_SASSY, + }, + { + .species = SPECIES_DUSCLOPS, + .heldItem = BATTLE_TOWER_ITEM_SPELL_TAG, + .teamFlags = 0x20, + .moves = { + MOVE_SHADOW_BALL, + MOVE_EARTHQUAKE, + MOVE_BLIZZARD, + MOVE_DESTINY_BOND + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_NAUGHTY, + }, + { + .species = SPECIES_SEAKING, + .heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY, + .teamFlags = 0xB2, + .moves = { + MOVE_HORN_DRILL, + MOVE_AGILITY, + MOVE_SLEEP_TALK, + MOVE_REST + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_CAMERUPT, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x00, + .moves = { + MOVE_EARTHQUAKE, + MOVE_ERUPTION, + MOVE_ROCK_SLIDE, + MOVE_FLAMETHROWER + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_NAIVE, + }, + { + .species = SPECIES_LANTURN, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x82, + .moves = { + MOVE_THUNDERBOLT, + MOVE_SURF, + MOVE_THUNDER_WAVE, + MOVE_BLIZZARD + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_WEEZING, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x20, + .moves = { + MOVE_SLUDGE_BOMB, + MOVE_THUNDERBOLT, + MOVE_FIRE_BLAST, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_SERIOUS, + }, + { + .species = SPECIES_WHISCASH, + .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, + .teamFlags = 0x41, + .moves = { + MOVE_EARTHQUAKE, + MOVE_SURF, + MOVE_ROCK_TOMB, + MOVE_ATTRACT + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_RELAXED, + }, + { + .species = SPECIES_AGGRON, + .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, + .teamFlags = 0x11, + .moves = { + MOVE_DOUBLE_EDGE, + MOVE_EARTHQUAKE, + MOVE_SURF, + MOVE_DRAGON_CLAW + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_CACTURNE, + .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, + .teamFlags = 0x63, + .moves = { + MOVE_DYNAMIC_PUNCH, + MOVE_COUNTER, + MOVE_FAINT_ATTACK, + MOVE_GIGA_DRAIN + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, + .nature = NATURE_RELAXED, + }, + { + .species = SPECIES_SHARPEDO, + .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, + .teamFlags = 0x01, + .moves = { + MOVE_CRUNCH, + MOVE_DOUBLE_EDGE, + MOVE_SURF, + MOVE_SWAGGER + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_SASSY, + }, + { + .species = SPECIES_ABSOL, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x82, + .moves = { + MOVE_DOUBLE_EDGE, + MOVE_FACADE, + MOVE_SWORDS_DANCE, + MOVE_QUICK_ATTACK + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_WAILORD, + .heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY, + .teamFlags = 0x23, + .moves = { + MOVE_HYDRO_PUMP, + MOVE_EARTHQUAKE, + MOVE_ATTRACT, + MOVE_FISSURE + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_TIMID, + }, + { + .species = SPECIES_TENTACRUEL, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x21, + .moves = { + MOVE_HYDRO_PUMP, + MOVE_SLUDGE_BOMB, + MOVE_GIGA_DRAIN, + MOVE_MIRROR_COAT + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_RASH, + }, + { + .species = SPECIES_LUDICOLO, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0xA2, + .moves = { + MOVE_RAIN_DANCE, + MOVE_SURF, + MOVE_TOXIC, + MOVE_DOUBLE_TEAM + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_WOBBUFFET, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x23, + .moves = { + MOVE_ENCORE, + MOVE_COUNTER, + MOVE_MIRROR_COAT, + MOVE_DESTINY_BOND + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_SERIOUS, + }, + { + .species = SPECIES_RHYDON, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0x21, + .moves = { + MOVE_EARTHQUAKE, + MOVE_MEGAHORN, + MOVE_HORN_DRILL, + MOVE_ROCK_SLIDE + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_GLALIE, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x21, + .moves = { + MOVE_CRUNCH, + MOVE_BLIZZARD, + MOVE_HAIL, + MOVE_EARTHQUAKE + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_SERIOUS, + }, + { + .species = SPECIES_SCEPTILE, + .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, + .teamFlags = 0x13, + .moves = { + MOVE_LEAF_BLADE, + MOVE_EARTHQUAKE, + MOVE_DRAGON_CLAW, + MOVE_CRUNCH + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_BLAZIKEN, + .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, + .teamFlags = 0x17, + .moves = { + MOVE_BLAZE_KICK, + MOVE_ROCK_TOMB, + MOVE_ENDURE, + MOVE_REVERSAL + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_RASH, + }, + { + .species = SPECIES_SWAMPERT, + .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, + .teamFlags = 0x17, + .moves = { + MOVE_SURF, + MOVE_EARTHQUAKE, + MOVE_MUD_SHOT, + MOVE_BLIZZARD + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_SERIOUS, + }, + { + .species = SPECIES_GARDEVOIR, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x19, + .moves = { + MOVE_PSYCHIC, + MOVE_THUNDERBOLT, + MOVE_DESTINY_BOND, + MOVE_WILL_O_WISP + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_BRELOOM, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0xF6, + .moves = { + MOVE_SPORE, + MOVE_FOCUS_PUNCH, + MOVE_BRICK_BREAK, + MOVE_SLUDGE_BOMB + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_SASSY, + }, + { + .species = SPECIES_ALAKAZAM, + .heldItem = BATTLE_TOWER_ITEM_GANLON_BERRY, + .teamFlags = 0x1B, + .moves = { + MOVE_PSYCHIC, + MOVE_THUNDER_PUNCH, + MOVE_REFLECT, + MOVE_RECOVER + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_HASTY, + }, + { + .species = SPECIES_SHIFTRY, + .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, + .teamFlags = 0x89, + .moves = { + MOVE_FAINT_ATTACK, + MOVE_SHADOW_BALL, + MOVE_DOUBLE_TEAM, + MOVE_REST + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_SERIOUS, + }, + { + .species = SPECIES_HARIYAMA, + .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, + .teamFlags = 0x85, + .moves = { + MOVE_CROSS_CHOP, + MOVE_EARTHQUAKE, + MOVE_FACADE, + MOVE_FAKE_OUT + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_CROBAT, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x49, + .moves = { + MOVE_ATTRACT, + MOVE_CONFUSE_RAY, + MOVE_BITE, + MOVE_DOUBLE_TEAM + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_SASSY, + }, + { + .species = SPECIES_MACHAMP, + .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, + .teamFlags = 0x15, + .moves = { + MOVE_CROSS_CHOP, + MOVE_FLAMETHROWER, + MOVE_EARTHQUAKE, + MOVE_ROCK_SLIDE + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_MANECTRIC, + .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, + .teamFlags = 0x0B, + .moves = { + MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, + MOVE_ROAR, + MOVE_CRUNCH + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_ELECTRODE, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x27, + .moves = { + MOVE_THUNDERBOLT, + MOVE_PROTECT, + MOVE_MIRROR_COAT, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_BASHFUL, + }, + { + .species = SPECIES_MUK, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0x05, + .moves = { + MOVE_SLUDGE_BOMB, + MOVE_FLAMETHROWER, + MOVE_THUNDERBOLT, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_FLYGON, + .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, + .teamFlags = 0x4D, + .moves = { + MOVE_DRAGON_CLAW, + MOVE_EARTHQUAKE, + MOVE_FLAMETHROWER, + MOVE_CRUNCH + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_SERIOUS, + }, + { + .species = SPECIES_STARMIE, + .heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY, + .teamFlags = 0x1B, + .moves = { + MOVE_SURF, + MOVE_THUNDERBOLT, + MOVE_RECOVER, + MOVE_CONFUSE_RAY + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_DODRIO, + .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, + .teamFlags = 0x2B, + .moves = { + MOVE_DRILL_PECK, + MOVE_TRI_ATTACK, + MOVE_AGILITY, + MOVE_FACADE + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_RAICHU, + .heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND, + .teamFlags = 0x0A, + .moves = { + MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, + MOVE_REVERSAL, + MOVE_ATTRACT + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_SERIOUS, + }, + { + .species = SPECIES_GOLDUCK, + .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, + .teamFlags = 0x0A, + .moves = { + MOVE_SURF, + MOVE_CROSS_CHOP, + MOVE_ICE_BEAM, + MOVE_HYPER_BEAM + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_SERIOUS, + }, + { + .species = SPECIES_HERACROSS, + .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, + .teamFlags = 0x54, + .moves = { + MOVE_MEGAHORN, + MOVE_ROCK_TOMB, + MOVE_ENDURE, + MOVE_REVERSAL + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_SASSY, + }, + { + .species = SPECIES_WALREIN, + .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, + .teamFlags = 0x06, + .moves = { + MOVE_SURF, + MOVE_ICE_BEAM, + MOVE_EARTHQUAKE, + MOVE_REST + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_NAIVE, + }, + { + .species = SPECIES_KINGDRA, + .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, + .teamFlags = 0x1D, + .moves = { + MOVE_SURF, + MOVE_TOXIC, + MOVE_PROTECT, + MOVE_REST + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_ADAMANT, + }, + { + .species = SPECIES_SALAMENCE, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x9C, + .moves = { + MOVE_DRAGON_CLAW, + MOVE_EARTHQUAKE, + MOVE_CRUNCH, + MOVE_REST + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_ADAMANT, + }, + { + .species = SPECIES_METAGROSS, + .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, + .teamFlags = 0x15, + .moves = { + MOVE_METEOR_MASH, + MOVE_PSYCHIC, + MOVE_EARTHQUAKE, + MOVE_LIGHT_SCREEN + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_REGIROCK, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0xB5, + .moves = { + MOVE_EARTHQUAKE, + MOVE_ANCIENT_POWER, + MOVE_FOCUS_PUNCH, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_REGICE, + .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, + .teamFlags = 0x96, + .moves = { + MOVE_ICE_BEAM, + MOVE_THUNDERBOLT, + MOVE_DOUBLE_TEAM, + MOVE_REST + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_HASTY, + }, + { + .species = SPECIES_REGISTEEL, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0x94, + .moves = { + MOVE_METAL_CLAW, + MOVE_EARTHQUAKE, + MOVE_THUNDERBOLT, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_LATIAS, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x96, + .moves = { + MOVE_MIST_BALL, + MOVE_THUNDERBOLT, + MOVE_REST, + MOVE_DRAGON_CLAW + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_MILD, + }, + { + .species = SPECIES_LATIOS, + .heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY, + .teamFlags = 0x95, + .moves = { + MOVE_LUSTER_PURGE, + MOVE_REFLECT, + MOVE_RECOVER, + MOVE_DRAGON_CLAW + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_MILOTIC, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x96, + .moves = { + MOVE_SURF, + MOVE_TOXIC, + MOVE_RECOVER, + MOVE_MIRROR_COAT + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_SLAKING, + .heldItem = BATTLE_TOWER_ITEM_CHOICE_BAND, + .teamFlags = 0x05, + .moves = { + MOVE_HYPER_BEAM, + MOVE_EARTHQUAKE, + MOVE_NONE, + MOVE_NONE + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_SERIOUS, + }, + { + .species = SPECIES_SCEPTILE, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x1F, + .moves = { + MOVE_GIGA_DRAIN, + MOVE_DOUBLE_TEAM, + MOVE_LEECH_SEED, + MOVE_ATTRACT + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_BLAZIKEN, + .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, + .teamFlags = 0x17, + .moves = { + MOVE_BLAZE_KICK, + MOVE_EARTHQUAKE, + MOVE_ROCK_SLIDE, + MOVE_REST + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_SWAMPERT, + .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, + .teamFlags = 0x17, + .moves = { + MOVE_MUDDY_WATER, + MOVE_MUD_SHOT, + MOVE_MIRROR_COAT, + MOVE_ICE_BEAM + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_GARDEVOIR, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x7B, + .moves = { + MOVE_PSYCHIC, + MOVE_SHADOW_BALL, + MOVE_DESTINY_BOND, + MOVE_SNATCH + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_RELAXED, + }, + { + .species = SPECIES_BRELOOM, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x56, + .moves = { + MOVE_SPORE, + MOVE_COUNTER, + MOVE_IRON_TAIL, + MOVE_GIGA_DRAIN + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_SASSY, + }, + { + .species = SPECIES_ALAKAZAM, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x0A, + .moves = { + MOVE_PSYCHIC, + MOVE_THUNDER_PUNCH, + MOVE_FIRE_PUNCH, + MOVE_RECOVER + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_HASTY, + }, + { + .species = SPECIES_HARIYAMA, + .heldItem = BATTLE_TOWER_ITEM_FOCUS_BAND, + .teamFlags = 0x05, + .moves = { + MOVE_CROSS_CHOP, + MOVE_ROCK_TOMB, + MOVE_ENDURE, + MOVE_REVERSAL + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_SASSY, + }, + { + .species = SPECIES_GYARADOS, + .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, + .teamFlags = 0x0C, + .moves = { + MOVE_HYPER_BEAM, + MOVE_THUNDERBOLT, + MOVE_EARTHQUAKE, + MOVE_ICE_BEAM + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_BOLD, + }, + { + .species = SPECIES_CROBAT, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x49, + .moves = { + MOVE_TOXIC, + MOVE_CONFUSE_RAY, + MOVE_ATTRACT, + MOVE_PROTECT + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_MACHAMP, + .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, + .teamFlags = 0x15, + .moves = { + MOVE_CROSS_CHOP, + MOVE_COUNTER, + MOVE_EARTHQUAKE, + MOVE_FACADE + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_SERIOUS, + }, + { + .species = SPECIES_MANECTRIC, + .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, + .teamFlags = 0x63, + .moves = { + MOVE_THUNDER, + MOVE_THUNDER_WAVE, + MOVE_REST, + MOVE_CRUNCH + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_ELECTRODE, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x07, + .moves = { + MOVE_THUNDERBOLT, + MOVE_SCREECH, + MOVE_MIRROR_COAT, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_MODEST, + }, + { + .species = SPECIES_MUK, + .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, + .teamFlags = 0x45, + .moves = { + MOVE_SLUDGE_BOMB, + MOVE_GIGA_DRAIN, + MOVE_ROCK_TOMB, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_RASH, + }, + { + .species = SPECIES_FLYGON, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x4D, + .moves = { + MOVE_DRAGON_CLAW, + MOVE_EARTHQUAKE, + MOVE_IRON_TAIL, + MOVE_ROCK_TOMB + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_IMPISH, + }, + { + .species = SPECIES_STARMIE, + .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, + .teamFlags = 0x1B, + .moves = { + MOVE_LIGHT_SCREEN, + MOVE_THUNDERBOLT, + MOVE_SURF, + MOVE_REST + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_NINETALES, + .heldItem = BATTLE_TOWER_ITEM_SITRUS_BERRY, + .teamFlags = 0x0A, + .moves = { + MOVE_CONFUSE_RAY, + MOVE_OVERHEAT, + MOVE_FLAMETHROWER, + MOVE_IRON_TAIL + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_GOLEM, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x25, + .moves = { + MOVE_EARTHQUAKE, + MOVE_ROAR, + MOVE_FIRE_BLAST, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED, + .nature = NATURE_SERIOUS, + }, + { + .species = SPECIES_GOLDUCK, + .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, + .teamFlags = 0x27, + .moves = { + MOVE_HYDRO_PUMP, + MOVE_CROSS_CHOP, + MOVE_BLIZZARD, + MOVE_PSYCH_UP + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_HERACROSS, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x55, + .moves = { + MOVE_MEGAHORN, + MOVE_EARTHQUAKE, + MOVE_COUNTER, + MOVE_REVERSAL + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_WALREIN, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x36, + .moves = { + MOVE_SURF, + MOVE_BLIZZARD, + MOVE_ROCK_SLIDE, + MOVE_SHEER_COLD + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_SERIOUS, + }, + { + .species = SPECIES_KINGDRA, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x5C, + .moves = { + MOVE_HYDRO_PUMP, + MOVE_PROTECT, + MOVE_DRAGON_BREATH, + MOVE_DOUBLE_TEAM + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_ADAMANT, + }, + { + .species = SPECIES_SALAMENCE, + .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, + .teamFlags = 0x9D, + .moves = { + MOVE_DRAGON_CLAW, + MOVE_EARTHQUAKE, + MOVE_FLAMETHROWER, + MOVE_ROCK_TOMB + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_SERIOUS, + }, + { + .species = SPECIES_METAGROSS, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0x15, + .moves = { + MOVE_METEOR_MASH, + MOVE_PSYCHIC, + MOVE_EARTHQUAKE, + MOVE_HYPER_BEAM + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_REGIROCK, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0x95, + .moves = { + MOVE_EARTHQUAKE, + MOVE_ROCK_TOMB, + MOVE_FACADE, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_REGICE, + .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, + .teamFlags = 0x96, + .moves = { + MOVE_BLIZZARD, + MOVE_THUNDERBOLT, + MOVE_HAIL, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_DEFENSE, + .nature = NATURE_CAREFUL, + }, + { + .species = SPECIES_REGISTEEL, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0x94, + .moves = { + MOVE_METAL_CLAW, + MOVE_EARTHQUAKE, + MOVE_ANCIENT_POWER, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_LATIAS, + .heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY, + .teamFlags = 0x96, + .moves = { + MOVE_MIST_BALL, + MOVE_REFLECT, + MOVE_RECOVER, + MOVE_DRAGON_CLAW + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_LATIOS, + .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, + .teamFlags = 0x95, + .moves = { + MOVE_LUSTER_PURGE, + MOVE_ICE_BEAM, + MOVE_RECOVER, + MOVE_DRAGON_CLAW + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_MILOTIC, + .heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY, + .teamFlags = 0xD6, + .moves = { + MOVE_SURF, + MOVE_ICE_BEAM, + MOVE_RECOVER, + MOVE_DOUBLE_TEAM + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_ADAMANT, + }, + { + .species = SPECIES_KECLEON, + .heldItem = BATTLE_TOWER_ITEM_CHOICE_BAND, + .teamFlags = 0x69, + .moves = { + MOVE_TRICK, + MOVE_REST, + MOVE_IRON_TAIL, + MOVE_DISABLE + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_QUIRKY, + }, + { + .species = SPECIES_SCEPTILE, + .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, + .teamFlags = 0x5F, + .moves = { + MOVE_LEAF_BLADE, + MOVE_EARTHQUAKE, + MOVE_REST, + MOVE_CRUNCH + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_BLAZIKEN, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x7F, + .moves = { + MOVE_FOCUS_PUNCH, + MOVE_COUNTER, + MOVE_SWAGGER, + MOVE_ROCK_TOMB + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_SASSY, + }, + { + .species = SPECIES_SWAMPERT, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x57, + .moves = { + MOVE_IRON_TAIL, + MOVE_CURSE, + MOVE_DOUBLE_TEAM, + MOVE_REST + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_LAX, + }, + { + .species = SPECIES_GARDEVOIR, + .heldItem = BATTLE_TOWER_ITEM_CHESTO_BERRY, + .teamFlags = 0x3B, + .moves = { + MOVE_SHADOW_BALL, + MOVE_PSYCHIC, + MOVE_REST, + MOVE_IMPRISON + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_BRELOOM, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x56, + .moves = { + MOVE_SPORE, + MOVE_FOCUS_PUNCH, + MOVE_SLUDGE_BOMB, + MOVE_IRON_TAIL + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_SASSY, + }, + { + .species = SPECIES_ALAKAZAM, + .heldItem = BATTLE_TOWER_ITEM_CHOICE_BAND, + .teamFlags = 0x1A, + .moves = { + MOVE_PSYCHIC, + MOVE_TRICK, + MOVE_RECOVER, + MOVE_SNATCH + }, + .evSpread = F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_HASTY, + }, + { + .species = SPECIES_HARIYAMA, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x65, + .moves = { + MOVE_REVENGE, + MOVE_COUNTER, + MOVE_FOCUS_PUNCH, + MOVE_REVERSAL + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_SASSY, + }, + { + .species = SPECIES_LUDICOLO, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x54, + .moves = { + MOVE_RAIN_DANCE, + MOVE_PROTECT, + MOVE_TOXIC, + MOVE_SURF + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_CROBAT, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0x4B, + .moves = { + MOVE_SLUDGE_BOMB, + MOVE_BITE, + MOVE_AIR_CUTTER, + MOVE_SHADOW_BALL + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_MACHAMP, + .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, + .teamFlags = 0x75, + .moves = { + MOVE_CROSS_CHOP, + MOVE_ROCK_SLIDE, + MOVE_DYNAMIC_PUNCH, + MOVE_ROCK_TOMB + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_MANECTRIC, + .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, + .teamFlags = 0x0A, + .moves = { + MOVE_THUNDERBOLT, + MOVE_THUNDER_WAVE, + MOVE_ATTRACT, + MOVE_CRUNCH + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_ELECTRODE, + .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, + .teamFlags = 0x64, + .moves = { + MOVE_THUNDER, + MOVE_DOUBLE_TEAM, + MOVE_MIRROR_COAT, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_BASHFUL, + }, + { + .species = SPECIES_MUK, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x49, + .moves = { + MOVE_SLUDGE_BOMB, + MOVE_FLAMETHROWER, + MOVE_THUNDERBOLT, + MOVE_SHADOW_PUNCH + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_GENTLE, + }, + { + .species = SPECIES_FLYGON, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0xCD, + .moves = { + MOVE_PROTECT, + MOVE_DIG, + MOVE_TOXIC, + MOVE_SANDSTORM + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_LAX, + }, + { + .species = SPECIES_STARMIE, + .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, + .teamFlags = 0x5B, + .moves = { + MOVE_SURF, + MOVE_THUNDERBOLT, + MOVE_BLIZZARD, + MOVE_PSYCHIC + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_LUDICOLO, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0x1A, + .moves = { + MOVE_RAIN_DANCE, + MOVE_LEECH_SEED, + MOVE_DIVE, + MOVE_PROTECT + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_RAICHU, + .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, + .teamFlags = 0x4A, + .moves = { + MOVE_THUNDER, + MOVE_REVERSAL, + MOVE_FACADE, + MOVE_IRON_TAIL + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_TIMID, + }, + { + .species = SPECIES_GOLDUCK, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x0A, + .moves = { + MOVE_SURF, + MOVE_PSYCHIC, + MOVE_ICE_BEAM, + MOVE_IRON_TAIL + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_DOCILE, + }, + { + .species = SPECIES_HERACROSS, + .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, + .teamFlags = 0x15, + .moves = { + MOVE_MEGAHORN, + MOVE_EARTHQUAKE, + MOVE_FACADE, + MOVE_ROCK_TOMB + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_WALREIN, + .heldItem = BATTLE_TOWER_ITEM_LEPPA_BERRY, + .teamFlags = 0x26, + .moves = { + MOVE_SURF, + MOVE_ICE_BEAM, + MOVE_FISSURE, + MOVE_SHEER_COLD + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_KINGDRA, + .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, + .teamFlags = 0x4D, + .moves = { + MOVE_HYDRO_PUMP, + MOVE_BLIZZARD, + MOVE_HYPER_BEAM, + MOVE_DISABLE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_SALAMENCE, + .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, + .teamFlags = 0x9C, + .moves = { + MOVE_DRAGON_CLAW, + MOVE_EARTHQUAKE, + MOVE_FIRE_BLAST, + MOVE_HYDRO_PUMP + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_NAUGHTY, + }, + { + .species = SPECIES_METAGROSS, + .heldItem = BATTLE_TOWER_ITEM_LIECHI_BERRY, + .teamFlags = 0xB5, + .moves = { + MOVE_METEOR_MASH, + MOVE_PSYCHIC, + MOVE_PURSUIT, + MOVE_ROCK_TOMB + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_SPEED, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_REGIROCK, + .heldItem = BATTLE_TOWER_ITEM_APICOT_BERRY, + .teamFlags = 0x95, + .moves = { + MOVE_EARTHQUAKE, + MOVE_TOXIC, + MOVE_SUPERPOWER, + MOVE_REST + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_SERIOUS, + }, + { + .species = SPECIES_REGICE, + .heldItem = BATTLE_TOWER_ITEM_LAX_INCENSE, + .teamFlags = 0x96, + .moves = { + MOVE_ICE_BEAM, + MOVE_THUNDERBOLT, + MOVE_ANCIENT_POWER, + MOVE_EXPLOSION + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_DEFENSE, + .nature = NATURE_RASH, + }, + { + .species = SPECIES_REGISTEEL, + .heldItem = BATTLE_TOWER_ITEM_LEFTOVERS, + .teamFlags = 0xB4, + .moves = { + MOVE_CURSE, + MOVE_AMNESIA, + MOVE_RETURN, + MOVE_REST + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_LAX, + }, + { + .species = SPECIES_LATIAS, + .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, + .teamFlags = 0x92, + .moves = { + MOVE_MIST_BALL, + MOVE_THUNDERBOLT, + MOVE_EARTHQUAKE, + MOVE_ICE_BEAM + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_LATIOS, + .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, + .teamFlags = 0x91, + .moves = { + MOVE_LUSTER_PURGE, + MOVE_THUNDERBOLT, + MOVE_EARTHQUAKE, + MOVE_SURF + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_MILOTIC, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0xB2, + .moves = { + MOVE_SURF, + MOVE_ICE_BEAM, + MOVE_RECOVER, + MOVE_ATTRACT + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_BRAVE, + }, + { + .species = SPECIES_SLAKING, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0x65, + .moves = { + MOVE_YAWN, + MOVE_SLASH, + MOVE_COUNTER, + MOVE_HYPER_BEAM + }, + .evSpread = F_EV_SPREAD_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_DOCILE, + }, + { + .species = SPECIES_SCEPTILE, + .heldItem = BATTLE_TOWER_ITEM_SHELL_BELL, + .teamFlags = 0xDF, + .moves = { + MOVE_LEAF_BLADE, + MOVE_DETECT, + MOVE_DRAGON_CLAW, + MOVE_CRUNCH + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_BLAZIKEN, + .heldItem = BATTLE_TOWER_ITEM_SALAC_BERRY, + .teamFlags = 0xD7, + .moves = { + MOVE_BLAZE_KICK, + MOVE_SKY_UPPERCUT, + MOVE_EARTHQUAKE, + MOVE_ROCK_SLIDE + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_ATTACK, + .nature = NATURE_DOCILE, + }, + { + .species = SPECIES_SWAMPERT, + .heldItem = BATTLE_TOWER_ITEM_PETAYA_BERRY, + .teamFlags = 0x5F, + .moves = { + MOVE_SURF, + MOVE_EARTHQUAKE, + MOVE_ICE_BEAM, + MOVE_ROCK_TOMB + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED | F_EV_SPREAD_HP, + .nature = NATURE_SASSY, + }, + { + .species = SPECIES_SHEDINJA, + .heldItem = BATTLE_TOWER_ITEM_BRIGHT_POWDER, + .teamFlags = 0xDB, + .moves = { + MOVE_CONFUSE_RAY, + MOVE_SHADOW_BALL, + MOVE_TOXIC, + MOVE_HYPER_BEAM + }, + .evSpread = F_EV_SPREAD_SPEED | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_METAGROSS, + .heldItem = BATTLE_TOWER_ITEM_QUICK_CLAW, + .teamFlags = 0x94, + .moves = { + MOVE_METEOR_MASH, + MOVE_PSYCHIC, + MOVE_SHADOW_BALL, + MOVE_EARTHQUAKE + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_ATTACK, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_GRUMPIG, + .heldItem = BATTLE_TOWER_ITEM_MACHO_BRACE, + .teamFlags = 0x4B, + .moves = { + MOVE_PSYCHIC, + MOVE_CONFUSE_RAY, + MOVE_TRICK, + MOVE_REFLECT + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_HP, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_LATIAS, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x92, + .moves = { + MOVE_MIST_BALL, + MOVE_RECOVER, + MOVE_ATTRACT, + MOVE_DRAGON_CLAW + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_ADAMANT, + }, + { + .species = SPECIES_LATIOS, + .heldItem = BATTLE_TOWER_ITEM_KINGS_ROCK, + .teamFlags = 0x91, + .moves = { + MOVE_LUSTER_PURGE, + MOVE_THUNDERBOLT, + MOVE_ICE_BEAM, + MOVE_DRAGON_CLAW + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_HARDY, + }, + { + .species = SPECIES_STARMIE, + .heldItem = BATTLE_TOWER_ITEM_LUM_BERRY, + .teamFlags = 0x1A, + .moves = { + MOVE_SURF, + MOVE_THUNDERBOLT, + MOVE_PSYCHIC, + MOVE_ICE_BEAM + }, + .evSpread = F_EV_SPREAD_SP_ATTACK | F_EV_SPREAD_SPEED, + .nature = NATURE_QUIET, + }, + { + .species = SPECIES_MACHAMP, + .heldItem = BATTLE_TOWER_ITEM_SCOPE_LENS, + .teamFlags = 0x14, + .moves = { + MOVE_CROSS_CHOP, + MOVE_COUNTER, + MOVE_ROCK_TOMB, + MOVE_FLAMETHROWER + }, + .evSpread = F_EV_SPREAD_SP_DEFENSE | F_EV_SPREAD_HP, + .nature = NATURE_HARDY, + }, +}; diff --git a/src/data/battle_tower/trainers.h b/src/data/battle_tower/trainers.h new file mode 100644 index 000000000..b5eb3da7a --- /dev/null +++ b/src/data/battle_tower/trainers.h @@ -0,0 +1,1503 @@ +const struct BattleTowerTrainer gBattleTowerTrainers[] = +{ + { + .trainerClass = TRAINER_CLASS_YOUNGSTER, + .name = _("ALVIN"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_ARE, + EC_WORD_YOU, + EC_WORD_READY, + EC_WORD_QUES, + EC_WORD_HERE_I_COME, + EC_WORD_EXCL, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .name = _("DIRK"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_OKAY, + EC_WORD_I_AM, + EC_WORD_GOING, + EC_WORD_FOR, + EC_WORD_IT, + EC_WORD_EXCL, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_LADY, + .name = _("CYBIL"), + .teamFlags = 0x02, + .greeting = { + .easyChat = { + EC_WORD_YOU_RE, + EC_WORD_A, + EC_WORD_PUSHOVER, + EC_WORD_LET_S, + EC_WORD_GET, + EC_WORD_GOING, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_BLACK_BELT, + .name = _("CHEN"), + .teamFlags = 0x05, + .greeting = { + .easyChat = { + EC_WORD_MY, + EC_WORD_SPIRIT, + EC_WORD_IS, + EC_WORD_ENOUGH, + EC_WORD_SNORT, + EC_WORD_ARRGH, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_NINJA_BOY, + .name = _("YOSHI"), + .teamFlags = 0x05, + .greeting = { + .easyChat = { + EC_WORD_GO, + EC_WORD_MY, + EC_WORD_POKEMON, + EC_WORD_FIGHT, + EC_WORD_THE, + EC_WORD_BATTLE, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_SCHOOL_KID_F, + .name = _("TINA"), + .teamFlags = 0x0A, + .greeting = { + .easyChat = { + EC_WORD_STUDY, + EC_WORD_IS, + EC_WORD_BORING, + EC_WORD_LET_S, + EC_WORD_BATTLE, + EC_WORD_NOW, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_BUG_MANIAC, + .name = _("COREY"), + .teamFlags = 0x41, + .greeting = { + .easyChat = { + EC_WORD_HEY, + EC_WORD_I, + EC_WORD_WILL, + EC_MOVE2(TRANSFORM), + EC_WORD_FOR, + EC_MOVE(STRENGTH), + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_FISHERMAN, + .name = _("GORDON"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_I, + EC_WORD_NEED, + EC_WORD_A, + EC_WORD_VACATION, + EC_WORD_RIGHT, + EC_WORD_NOW, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_TUBER_F, + .name = _("ANN"), + .teamFlags = 0x02, + .greeting = { + .easyChat = { + EC_WORD_WE, + EC_WORD_ALL, + EC_WORD_ADORE, + EC_WORD_POKEMON, + EC_WORD_ABSOLUTELY, + EC_WORD_TRULY, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_POKEFAN_F, + .name = _("JULIA"), + .teamFlags = 0x42, + .greeting = { + .easyChat = { + EC_WORD_I_AM, + EC_WORD_A, + EC_WORD_CUTE, + EC_WORD_LADY, + EC_WORD_YES, + EC_WORD_I_AM, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_GENTLEMAN, + .name = _("GREGORY"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_I, + EC_WORD_THINK, + EC_WORD_WE, + EC_WORD_SHOULD, + EC_WORD_START, + EC_WORD_TODAY, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_CAMPER, + .name = _("KEITH"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_YOU_RE, + EC_WORD_MY, + EC_WORD_FRIEND, + EC_WORD_FROM, + EC_WORD_NOW, + EC_WORD_ON, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_RUNNING_TRIATHLETE_F, + .name = _("KENDRA"), + .teamFlags = 0x0A, + .greeting = { + .easyChat = { + EC_WORD_I_AM, + EC_MOVE(SWIFT), + EC_WORD_HOW, + EC_WORD_ABOUT, + EC_WORD_YOU, + EC_WORD_QUES, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_HIKER, + .name = _("DEV"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_WAHAHAHA, + EC_WORD_I_AM, + EC_WORD_FEELING, + EC_WORD_LIKE, + EC_WORD_IT_S, + EC_MOVE2(PAY_DAY), + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .name = _("CASSIE"), + .teamFlags = 0x0A, + .greeting = { + .easyChat = { + EC_WORD_YOU_RE, + EC_WORD_STRONG, + EC_WORD_AREN_T, + 0xFFFF, + EC_WORD_YOU, + EC_WORD_QUES, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_PSYCHIC_M, + .name = _("JULIAN"), + .teamFlags = 0x05, + .greeting = { + .easyChat = { + EC_WORD_FUFUFU, + 0xFFFF, + EC_WORD_YOU, + EC_WORD_CAN_T, + EC_WORD_WIN, + EC_WORD_KID, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_LASS, + .name = _("JOYCE"), + .teamFlags = 0x02, + .greeting = { + .easyChat = { + EC_WORD_BE, + EC_WORD_KIND, + EC_WORD_TO, + EC_WORD_THE, + EC_WORD_DIGITAL, + EC_WORD_IDOL, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_GUITARIST, + .name = _("LES"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_I_AM, + EC_WORD_GREAT, + EC_WORD_YOU_RE, + EC_WORD_JUST, + EC_WORD_RATHER, + EC_WORD_OKAY, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_RICH_BOY, + .name = _("CLINTON"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_I, + EC_WORD_HAVE, + EC_WORD_ROUGH_SKIN, + EC_WORD_I, + EC_WORD_NEED, + EC_WORD_NATURAL_CURE, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_BUG_CATCHER, + .name = _("LEWIS"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_THIS, + EC_WORD_IS, + EC_WORD_EXCITING, + EC_WORD_CAN, + EC_WORD_I, + EC_WORD_WIN, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_PICNICKER, + .name = _("RACHAEL"), + .teamFlags = 0x02, + .greeting = { + .easyChat = { + EC_WORD_I, + EC_WORD_LIKE, + EC_WORD_WALKING, + EC_WORD_WITH, + EC_WORD_MY, + EC_WORD_POKEMON, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_COLLECTOR, + .name = _("HAROLD"), + .teamFlags = 0x09, + .greeting = { + .easyChat = { + EC_WORD_HERE, + EC_WORD_THEY, + EC_WORD_COME, + EC_WORD_MY, + EC_MOVE2(SUPERPOWER), + EC_WORD_POKEMON, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_TUBER_M, + .name = _("KIPP"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_I_AM, + EC_WORD_A, + EC_WORD_GENIUS, + EC_WORD_I, + EC_WORD_SHOULD, + EC_WORD_WIN, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_KINDLER, + .name = _("IRWIN"), + .teamFlags = 0x05, + .greeting = { + .easyChat = { + EC_WORD_YOU, + EC_WORD_WILL, + EC_WORD_BE, + EC_WORD_FEELING, + EC_WORD_MY, + EC_WORD_FIRE, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_PSYCHIC_F, + .name = _("EILEEN"), + .teamFlags = 0x0A, + .greeting = { + .easyChat = { + EC_WORD_I, + EC_WORD_WILL, + EC_MOVE(ASTONISH), + EC_WORD_YOU, + EC_WORD_IN, + EC_WORD_BATTLE, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .name = _("ANNE"), + .teamFlags = 0x02, + .greeting = { + .easyChat = { + EC_WORD_SORRY, + EC_WORD_BUT, + EC_WORD_YOU, + EC_WORD_WILL, + EC_WORD_NOT, + EC_WORD_WIN, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_CYCLING_TRIATHLETE_F, + .name = _("RUTH"), + .teamFlags = 0x06, + .greeting = { + .easyChat = { + EC_WORD_A, + EC_WORD_STRONG, + EC_WORD_GIRL, + EC_WORD_WANTS, + EC_WORD_TOUGH, + EC_WORD_POKEMON, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_POKEMANIAC, + .name = _("JEREMY"), + .teamFlags = 0x40, + .greeting = { + .easyChat = { + EC_WORD_MY, + EC_WORD_POKEMON, + EC_WORD_ARE, + EC_WORD_COOL, + EC_WORD_YOURS, + EC_WORD_CAN_T_WIN, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_SAILOR, + .name = _("TREVOR"), + .teamFlags = 0x09, + .greeting = { + .easyChat = { + EC_WORD_MY, + EC_WORD_OPPONENT, + EC_WORD_IS, + EC_WORD_FINALLY, + EC_WORD_HERE, + EC_WORD_EXCELLENT, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_POKEMON_BREEDER_F, + .name = _("COLETTE"), + .teamFlags = 0x06, + .greeting = { + .easyChat = { + EC_WORD_I, + EC_WORD_AM, + EC_WORD_HUNGRY, + EC_MOVE2(POUND), + EC_WORD_MY, + EC_MOVE2(BELLY_DRUM), + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_HEX_MANIAC, + .name = _("PAULA"), + .teamFlags = 0x42, + .greeting = { + .easyChat = { + EC_WORD_IT_S, + EC_WORD_HARD, + EC_WORD_TO, + EC_WORD_TAKE, + EC_WORD_UGLY, + EC_MOVE(SPITE), + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_RUIN_MANIAC, + .name = _("STANLY"), + .teamFlags = 0x41, + .greeting = { + .easyChat = { + EC_WORD_ADVENTURE, + EC_WORD_AND, + EC_WORD_BATTLE, + EC_WORD_ARE, + EC_WORD_MY, + EC_WORD_LIKES, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_M, + .name = _("TROY"), + .teamFlags = 0x09, + .greeting = { + .easyChat = { + EC_WORD_YOU, + EC_WORD_CAN_T, + EC_WORD_LOSE, + EC_WORD_TO, + EC_WORD_A, + EC_WORD_KID, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_SCHOOL_KID_M, + .name = _("ED"), + .teamFlags = 0x08, + .greeting = { + .easyChat = { + EC_WORD_POKEMON, + EC_WORD_DAILY, + EC_WORD_AT, + EC_WORD_SCHOOL, + EC_WORD_IT_S, + EC_WORD_AWESOME, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_POKEMON_RANGER_F, + .name = _("ELLEN"), + .teamFlags = 0x04, + .greeting = { + .easyChat = { + EC_WORD_ARE, + EC_WORD_YOU, + EC_WORD_KIND, + EC_WORD_TO, + EC_WORD_YOUR, + EC_WORD_POKEMON, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .name = _("ARNIE"), + .teamFlags = 0x09, + .greeting = { + .easyChat = { + EC_WORD_I, + EC_WORD_BATTLE, + EC_WORD_SERIOUSLY, + EC_WORD_BEAUTIFUL, + EC_WORD_YOU, + EC_MOVE(DIG), + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_RUNNING_TRIATHLETE_M, + .name = _("HAL"), + .teamFlags = 0x09, + .greeting = { + .easyChat = { + EC_WORD_BOY, + EC_WORD_I_AM, + EC_WORD_TIRED, + EC_WORD_READY, + EC_WORD_FOR, + EC_WORD_SLEEP, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_BEAUTY, + .name = _("LAUREN"), + .teamFlags = 0x06, + .greeting = { + .easyChat = { + EC_WORD_A, + EC_WORD_TRAINER, + EC_WORD_LIKE, + EC_WORD_YOU, + EC_WORD_IS, + EC_WORD_EXCITING, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_AROMA_LADY, + .name = _("STACY"), + .teamFlags = 0x06, + .greeting = { + .easyChat = { + EC_WORD_HAVE, + EC_WORD_YOU, + EC_WORD_A, + EC_WORD_STENCH, + EC_WORD_OR, + EC_MOVE(SWEET_SCENT), + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_COLLECTOR, + .name = _("DARYL"), + .teamFlags = 0x81, + .greeting = { + .easyChat = { + EC_WORD_YOUR, + EC_WORD_POKEMON, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + EC_WORD_I, + EC_WORD_WANT, + EC_WORD_IT, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_F, + .name = _("KATHY"), + .teamFlags = 0x04, + .greeting = { + .easyChat = { + EC_WORD_I, + EC_WORD_WILL, + EC_WORD_TRY, + EC_WORD_MY, + EC_WORD_BEST, + EC_WORD_TODAY, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_POKEMON_RANGER_M, + .name = _("HARRIS"), + .teamFlags = 0x0C, + .greeting = { + .easyChat = { + EC_WORD_WAAAH, + EC_WORD_WAAAH, + EC_WORD_WAAAH, + EC_WORD_WAAAH, + EC_WORD_EHEHE, + EC_MOVE(FAKE_TEARS), + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_POKEFAN_M, + .name = _("GLENN"), + .teamFlags = 0x80, + .greeting = { + .easyChat = { + EC_WORD_LISTEN, + EC_WORD_TO, + EC_WORD_MY, + EC_WORD_LOUSY, + EC_WORD_ANIME, + EC_WORD_SONG, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_CYCLING_TRIATHLETE_M, + .name = _("NICO"), + .teamFlags = 0x04, + .greeting = { + .easyChat = { + EC_WORD_DON_T, + EC_WORD_JUST, + EC_WORD_BATTLE, + EC_WORD_DO, + EC_WORD_SOMETHING, + EC_WORD_ELSE, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_POKEMON_BREEDER_M, + .name = _("BAILEY"), + .teamFlags = 0x41, + .greeting = { + .easyChat = { + EC_WORD_ARE, + EC_WORD_YOU, + EC_WORD_BUSY, + EC_WORD_GET, + EC_WORD_WITH, + EC_WORD_IT, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_PARASOL_LADY, + .name = _("ABBIE"), + .teamFlags = 0x08, + .greeting = { + .easyChat = { + EC_WORD_THE, + EC_MOVE(MORNING_SUN), + EC_WORD_HAS, + EC_WORD_SO, + EC_WORD_MUCH, + EC_MOVE(COSMIC_POWER), + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_CAMPER, + .name = _("AL"), + .teamFlags = 0x0C, + .greeting = { + .easyChat = { + EC_WORD_LET_S, + EC_WORD_HAVE, + EC_WORD_AN, + EC_WORD_EXCITING, + EC_WORD_BATTLE, + EC_WORD_YEEHAW_EXCL, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_SCHOOL_KID_F, + .name = _("PEGGY"), + .teamFlags = 0x42, + .greeting = { + .easyChat = { + EC_WORD_I, + EC_WORD_WANT, + EC_WORD_TO, + EC_WORD_SEE, + EC_WORD_SOME, + EC_MOVE(GROWTH), + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_BEAUTY, + .name = _("NAOMI"), + .teamFlags = 0x04, + .greeting = { + .easyChat = { + EC_WORD_IT, + EC_WORD_WAS, + EC_WORD_GREAT, + EC_WORD_TO, + EC_WORD_BE, + EC_WORD_YOUNG, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_NINJA_BOY, + .name = _("KENJI"), + .teamFlags = 0x0C, + .greeting = { + .easyChat = { + EC_WORD_PLEASE, + 0xFFFF, + EC_WORD_DON_T, + EC_WORD_BE, + EC_WORD_MEAN, + EC_WORD_TO_ME, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_CYCLING_TRIATHLETE_M, + .name = _("ROSS"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_WAKE_UP, + EC_WORD_MY, + EC_MOVE2(HIDDEN_POWER), + EC_WORD_AND, + EC_MOVE(ASTONISH), + EC_WORD_ME, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_POKEMON_RANGER_F, + .name = _("EDNA"), + .teamFlags = 0x02, + .greeting = { + .easyChat = { + EC_WORD_BATTLE_TOWER, + EC_WORD_IS, + EC_WORD_SO, + EC_WORD_ENTERTAINING, + EC_WORD_IT_S, + EC_WORD_AWESOME, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_RUIN_MANIAC, + .name = _("ANTON"), + .teamFlags = 0x41, + .greeting = { + .easyChat = { + EC_WORD_BLEND, + EC_WORD_THICK_FAT, + EC_WORD_AND, + EC_WORD_CHLOROPHYLL, + EC_WORD_IT_S, + EC_WORD_TASTY, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .name = _("MITCH"), + .teamFlags = 0x81, + .greeting = { + .easyChat = { + EC_WORD_NEXT, + EC_WORD_A, + EC_WORD_GIRL, + EC_WORD_WITH, + EC_WORD_A, + EC_MOVE(SCARY_FACE), + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_HEX_MANIAC, + .name = _("ROD"), + .teamFlags = 0x42, + .greeting = { + .easyChat = { + EC_WORD_GIMME, + EC_WORD_A, + EC_WORD_TOUGH, + EC_WORD_BATTLE, + EC_WORD_NOT, + EC_WORD_WIMPY, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_RUNNING_TRIATHLETE_M, + .name = _("RICH"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_TASTY, + EC_WORD_WATER, + EC_WORD_IS, + EC_WORD_HIP_AND, + EC_WORD_HAPPENING, + EC_WORD_YES_SIR_EXCL, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_POKEFAN_M, + .name = _("DANIEL"), + .teamFlags = 0x80, + .greeting = { + .easyChat = { + EC_WORD_GO, + EC_WORD_FOR, + EC_WORD_IT, + EC_WORD_MY, + EC_WORD_LOVEY_DOVEY, + EC_WORD_POKEMON, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_PSYCHIC_F, + .name = _("GLORIA"), + .teamFlags = 0x82, + .greeting = { + .easyChat = { + EC_WORD_LET_S, + EC_WORD_GET, + EC_WORD_THIS, + EC_WORD_FIERY, + EC_WORD_BATTLE, + EC_WORD_HAPPENING, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_GUITARIST, + .name = _("NELSON"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_MUSIC, + EC_WORD_IS, + EC_WORD_MY, + EC_WORD_ALL, + EC_WORD_MY, + EC_WORD_DESTINY, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_KINDLER, + .name = _("FERRIS"), + .teamFlags = 0x41, + .greeting = { + .easyChat = { + EC_WORD_GOOD, + EC_WORD_IT, + EC_WORD_IS, + EC_WORD_SO, + EC_WORD_VERY, + EC_WORD_GOOD, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_AROMA_LADY, + .name = _("AMANDA"), + .teamFlags = 0x82, + .greeting = { + .easyChat = { + EC_WORD_WHAT, + EC_WORD_KIND, + EC_WORD_OF, + EC_WORD_TRAINER, + EC_WORD_ARE, + EC_WORD_YOU, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_M, + .name = _("MASON"), + .teamFlags = 0x10, + .greeting = { + .easyChat = { + EC_WORD_I, + EC_WORD_DON_T, + EC_WORD_KNOW, + EC_WORD_HOW, + EC_WORD_TO, + EC_WORD_LOSE, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_DRAGON_TAMER, + .name = _("NATE"), + .teamFlags = 0x10, + .greeting = { + .easyChat = { + EC_WORD_DRAGON, + EC_WORD_POKEMON, + EC_WORD_ARE, + EC_WORD_ALL, + EC_WORD_THE, + EC_MOVE(RAGE), + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_LASS, + .name = _("MIRIAM"), + .teamFlags = 0x82, + .greeting = { + .easyChat = { + EC_WORD_YOU_RE, + EC_WORD_TOO_STRONG, + EC_WORD_SERIOUSLY, + EC_WORD_IT_S, + EC_WORD_BAD, + EC_WORD_NEWS, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_POKEMANIAC, + .name = _("THEO"), + .teamFlags = 0x40, + .greeting = { + .easyChat = { + EC_WORD_I, + EC_WORD_ADORE, + EC_WORD_MY, + EC_WORD_MEGA, + EC_WORD_CUTE, + EC_WORD_PLUSH_DOLL, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_F, + .name = _("PAMELA"), + .teamFlags = 0x10, + .greeting = { + .easyChat = { + EC_WORD_HERE_I_COME, + EC_WORD_I_AM, + EC_WORD_THE, + EC_WORD_CUTE, + EC_MOVE2(WATER_SPORT), + EC_WORD_IDOL, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_POKEFAN_F, + .name = _("ALISSA"), + .teamFlags = 0x20, + .greeting = { + .easyChat = { + EC_WORD_IT_S, + EC_WORD_A, + EC_WORD_PREPOSTEROUS, + EC_WORD_MATCH, + EC_WORD_I_AM, + EC_WORD_SHOCKED, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_GENTLEMAN, + .name = _("ARTHUR"), + .teamFlags = 0x20, + .greeting = { + .easyChat = { + EC_WORD_PLEASE, + EC_WORD_GIVE, + EC_WORD_ME, + EC_WORD_A, + EC_WORD_GOOD, + EC_WORD_BATTLE, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .name = _("MARCY"), + .teamFlags = 0x82, + .greeting = { + .easyChat = { + EC_WORD_I_AM, + EC_WORD_BEAUTIFUL, + EC_WORD_YOU, + EC_WORD_CAN_T, + EC_WORD_BEAT, + EC_WORD_ME, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_COOL_TRAINER_M, + .name = _("MILLER"), + .teamFlags = 0x10, + .greeting = { + .easyChat = { + EC_WORD_I, + EC_WORD_BATTLE, + EC_WORD_DAILY, + EC_WORD_I, + EC_WORD_WON_T, + EC_WORD_LOSE, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .name = _("OLIVER"), + .teamFlags = 0x11, + .greeting = { + .easyChat = { + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + EC_WORD_GIGGLE, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + 0xFFFF, + 0xFFFF, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_CYCLING_TRIATHLETE_F, + .name = _("MOLLY"), + .teamFlags = 0x12, + .greeting = { + .easyChat = { + EC_WORD_HOW, + EC_WORD_ARE, + EC_WORD_YOU, + EC_WORD_ON, + EC_WORD_MONDAY, + EC_WORD_MORNING, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_BUG_MANIAC, + .name = _("JASON"), + .teamFlags = 0x40, + .greeting = { + .easyChat = { + EC_WORD_WATER, + EC_WORD_AND, + EC_WORD_BUG, + EC_WORD_POKEMON, + EC_WORD_ARE, + EC_WORD_GREAT, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .name = _("AVA"), + .teamFlags = 0x20, + .greeting = { + .easyChat = { + EC_WORD_WHAT, + EC_WORD_IS, + EC_WORD_THIS, + EC_WORD_PRESSURE, + EC_WORD_ELLIPSIS, + EC_WORD_STATIC, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_FISHERMAN, + .name = _("HANK"), + .teamFlags = 0x10, + .greeting = { + .easyChat = { + EC_WORD_YOU_RE, + EC_WORD_A, + EC_WORD_KID, + EC_WORD_YOU, + EC_WORD_CAN_T, + EC_WORD_WIN, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_SAILOR, + .name = _("PETER"), + .teamFlags = 0x20, + .greeting = { + .easyChat = { + EC_WORD_IT_S, + EC_WORD_SERIOUSLY, + EC_WORD_TERRIBLE, + EC_WORD_I, + EC_WORD_REALLY, + EC_WORD_THINK, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_EXPERT_F, + .name = _("MINDY"), + .teamFlags = 0x20, + .greeting = { + .easyChat = { + EC_WORD_YOU, + EC_WORD_APPEAR, + EC_WORD_TO, + EC_WORD_TRAIN, + EC_WORD_VERY, + EC_WORD_WELL, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_BUG_MANIAC, + .name = _("DWIGHT"), + .teamFlags = 0x11, + .greeting = { + .easyChat = { + EC_WORD_ARE, + EC_WORD_YOU, + EC_WORD_STRONG, + EC_WORD_YOU, + EC_WORD_ARE, + EC_WORD_SCARY, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_POKEMON_BREEDER_F, + .name = _("REENA"), + .teamFlags = 0x12, + .greeting = { + .easyChat = { + EC_WORD_I, + EC_WORD_ALWAYS, + EC_WORD_LOSE, + EC_WORD_MAYBE, + EC_WORD_TODAY, + EC_WORD_ELLIPSIS, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_PARASOL_LADY, + .name = _("MEGAN"), + .teamFlags = 0x10, + .greeting = { + .easyChat = { + EC_WORD_DON_T, + EC_WORD_MAKE, + EC_WORD_THAT, + EC_MOVE(SCARY_FACE), + EC_WORD_AT, + EC_WORD_ME, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_RUNNING_TRIATHLETE_F, + .name = _("SIERRA"), + .teamFlags = 0x04, + .greeting = { + .easyChat = { + EC_WORD_I_VE, + EC_WORD_RUN, + EC_WORD_A_LOT, + EC_WORD_SO, + EC_WORD_I_AM, + EC_WORD_HEALTHY, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_POKEMON_RANGER_M, + .name = _("ARNOLD"), + .teamFlags = 0x08, + .greeting = { + .easyChat = { + EC_WORD_I_AM, + EC_WORD_FEELING, + EC_WORD_AWESOME, + EC_WORD_MY, + EC_WORD_POKEMON, + EC_WORD_ROCK, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_BLACK_BELT, + .name = _("XIN"), + .teamFlags = 0x04, + .greeting = { + .easyChat = { + EC_WORD_HOO_HAH, + EC_WORD_ARE, + EC_WORD_YOU, + EC_WORD_READY, + EC_WORD_TO, + EC_WORD_ROCK, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_COOL_TRAINER_F, + .name = _("KELLY"), + .teamFlags = 0x02, + .greeting = { + .easyChat = { + EC_WORD_YOU, + EC_WORD_COULDN_T, + EC_WORD_BEAT, + EC_WORD_ME, + EC_WORD_EVER, + EC_WORD_KID, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_COLLECTOR, + .name = _("VANCE"), + .teamFlags = 0x80, + .greeting = { + .easyChat = { + EC_WORD_POKEMON, + EC_WORD_ALL, + EC_WORD_OVER, + EC_WORD_THE, + EC_WORD_PLACE, + EC_WORD_WOWEE, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_M, + .name = _("TOBY"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_THIS, + EC_WORD_ISN_T, + EC_WORD_SPORTS, + EC_WORD_IT_S, + EC_WORD_A, + EC_WORD_BATTLE, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_GENTLEMAN, + .name = _("NORTON"), + .teamFlags = 0x20, + .greeting = { + .easyChat = { + EC_WORD_I, + EC_WORD_HAVE, + EC_WORD_TO, + EC_WORD_WIN, + EC_WORD_PLEASE, + EC_WORD_LOSE, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .name = _("ZOE"), + .teamFlags = 0x02, + .greeting = { + .easyChat = { + EC_WORD_THIS, + EC_WORD_IS, + EC_WORD_SCARY, + EC_WORD_PLEASE, + EC_WORD_BE, + EC_WORD_NICE, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_BEAUTY, + .name = _("EMMA"), + .teamFlags = 0x20, + .greeting = { + .easyChat = { + EC_WORD_DON_T, + EC_WORD_YOU, + EC_MOVE(FLAIL), + EC_WORD_YOU, + EC_WORD_CAN_T, + EC_MOVE(WITHDRAW), + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_HIKER, + .name = _("VINCE"), + .teamFlags = 0x04, + .greeting = { + .easyChat = { + EC_WORD_YAHOO, + EC_WORD_YAHOO, + EC_WORD_ARE, + EC_WORD_YOU, + EC_WORD_LISTENING, + EC_WORD_QUES, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_EXPERT_M, + .name = _("MARV"), + .teamFlags = 0x10, + .greeting = { + .easyChat = { + EC_WORD_LEARN, + EC_WORD_TO, + EC_WORD_BATTLE, + EC_WORD_THE, + EC_WORD_CORRECT, + EC_WORD_WAY, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_POKEMON_BREEDER_M, + .name = _("TODD"), + .teamFlags = 0x40, + .greeting = { + .easyChat = { + EC_WORD_THE, + EC_WORD_WAY, + EC_WORD_YOU, + EC_WORD_BATTLE, + EC_WORD_IT_S, + EC_WORD_CHILD_S_PLAY, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_GUITARIST, + .name = _("GAVIN"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_BABY, + EC_WORD_BABY, + EC_WORD_BABY, + EC_WORD_ROCK, + EC_WORD_ME, + EC_WORD_HARD, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_PSYCHIC_M, + .name = _("QUINN"), + .teamFlags = 0x08, + .greeting = { + .easyChat = { + EC_WORD_I, + EC_WORD_HAVE, + EC_WORD_A, + EC_WORD_STICKY_HOLD, + EC_WORD_ON, + EC_WORD_YOU, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_COOL_TRAINER_F, + .name = _("JENN"), + .teamFlags = 0x02, + .greeting = { + .easyChat = { + EC_WORD_I_AM, + EC_WORD_ON, + EC_WORD_A, + EC_WORD_TOUGH, + EC_WORD_TRAINER, + EC_WORD_SEARCH, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_EXPERT_M, + .name = _("JOEL"), + .teamFlags = 0x10, + .greeting = { + .easyChat = { + EC_WORD_BELIEVE, + EC_WORD_IN, + EC_WORD_YOUR, + EC_WORD_POKEMON, + EC_WORD_AND, + EC_WORD_WIN, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_DRAGON_TAMER, + .name = _("KYLE"), + .teamFlags = 0x0C, + .greeting = { + .easyChat = { + EC_WORD_I, + EC_WORD_LIKE, + EC_WORD_A, + EC_WORD_GIRL, + EC_WORD_WITH, + EC_MOVE2(FORESIGHT), + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_COOL_TRAINER_M, + .name = _("BRET"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_TAKE, + EC_WORD_MY, + EC_WORD_OVERWHELMING, + EC_WORD_POWER, + EC_WORD_AND, + EC_WORD_DISAPPEAR, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_EXPERT_F, + .name = _("CARRIE"), + .teamFlags = 0x10, + .greeting = { + .easyChat = { + EC_WORD_TRAINER, + EC_WORD_I, + EC_WORD_SEE, + EC_WORD_YOU, + EC_WORD_ARE, + EC_WORD_CAPABLE, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_LADY, + .name = _("GILLIAN"), + .teamFlags = 0x02, + .greeting = { + .easyChat = { + EC_WORD_COME_ON, + EC_WORD_SHOW, + EC_WORD_ME, + EC_WORD_AN, + EC_WORD_EXCELLENT, + EC_WORD_TIME, + }, + }, + }, +}; diff --git a/src/data/battle_tower/trainers_de.h b/src/data/battle_tower/trainers_de.h new file mode 100644 index 000000000..86182da9d --- /dev/null +++ b/src/data/battle_tower/trainers_de.h @@ -0,0 +1,1503 @@ +const struct BattleTowerTrainer gBattleTowerTrainers[] = +{ + { + .trainerClass = TRAINER_CLASS_YOUNGSTER, + .name = _("ALWIN"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_ARE, + EC_WORD_YOU, + EC_WORD_READY, + EC_WORD_QUES, + EC_WORD_HERE_I_COME, + EC_WORD_EXCL, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .name = _("DIRK"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_OH_KAY, + EC_WORD_I_AM, + EC_WORD_READY, + EC_WORD_EXCL, + 0xFFFF, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_LADY, + .name = _("SIBILLE"), + .teamFlags = 0x02, + .greeting = { + .easyChat = { + EC_WORD_THAT, + EC_WORD_BECOMES, + EC_WORD_A, + EC_WORD_CHILD_S_PLAY, + EC_WORD_GO, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_BLACK_BELT, + .name = _("OLAF"), + .teamFlags = 0x05, + .greeting = { + .easyChat = { + EC_WORD_MY, + EC_WORD_GHOST, + EC_WORD_IS, + EC_WORD_FULL, + EC_WORD_TOUGHNESS, + EC_WORD_SNORT, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_NINJA_BOY, + .name = _("JOST"), + .teamFlags = 0x05, + .greeting = { + .easyChat = { + EC_WORD_GO, + EC_WORD_WHO_WAS, + EC_WORD_POKEMON, + EC_WORD_FIGHT, + EC_WORD_FIGHT, + EC_WORD_FIGHT, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_SCHOOL_KID_F, + .name = _("TINA"), + .teamFlags = 0x0A, + .greeting = { + .easyChat = { + EC_WORD_STUDY, + EC_WORD_IS, + EC_WORD_BORING, + EC_WORD_LET_S, + EC_WORD_BETTER, + EC_WORD_FIGHT, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_BUG_MANIAC, + .name = _("HAJO"), + .teamFlags = 0x41, + .greeting = { + .easyChat = { + EC_WORD_TOUGHNESS, + EC_WORD_AND, + EC_MOVE2(TRANSFORM), + EC_WORD_WILL, + EC_WORD_BABE, + EC_WORD_FAINT, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_FISHERMAN, + .name = _("GEORG"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_IT, + EC_WORD_GOES, + EC_WORD_NOTHING, + EC_WORD_OVER, + EC_WORD_FISHING, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_TUBER_F, + .name = _("ANNE"), + .teamFlags = 0x02, + .greeting = { + .easyChat = { + EC_WORD_POKEMON, + EC_WORD_MUST_BE, + EC_WORD_MAN, + EC_WORD_SIMPLE, + EC_WORD_ADORE, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_POKEFAN_F, + .name = _("JULIA"), + .teamFlags = 0x42, + .greeting = { + .easyChat = { + EC_WORD_I_AM, + EC_WORD_CUTE, + EC_WORD_I_AM, + EC_WORD_QUITE, + EC_WORD_AN, + EC_WORD_LADY, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_GENTLEMAN, + .name = _("JOHANN"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_THE, + EC_WORD_DAY, + EC_WORD_IS, + EC_WORD_PERFECT, + EC_WORD_FOR, + EC_WORD_BATTLE, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_CAMPER, + .name = _("KARL"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_NOW, + EC_WORD_ARE, + EC_WORD_YOU, + EC_WORD_MY, + EC_WORD_FRIEND, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_RUNNING_TRIATHLETE_F, + .name = _("KENDRA"), + .teamFlags = 0x0A, + .greeting = { + .easyChat = { + EC_WORD_I_AM, + EC_WORD_SMART, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + EC_WORD_AND, + EC_WORD_YOU, + EC_WORD_QUES, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_HIKER, + .name = _("DAVID"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_WAHAHAHA, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + EC_WORD_TODAY, + EC_WORD_IS, + EC_MOVE2(PAY_DAY), + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .name = _("KEA"), + .teamFlags = 0x0A, + .greeting = { + .easyChat = { + EC_WORD_YOU_RE, + EC_WORD_TOUGH, + EC_WORD_OR, + EC_WORD_QUES, + 0xFFFF, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_PSYCHIC_M, + .name = _("JULIAN"), + .teamFlags = 0x05, + .greeting = { + .easyChat = { + EC_WORD_FUFUFU, + EC_WORD_YOU, + EC_WORD_CAN_T, + EC_WORD_DON_T, + EC_WORD_WINS, + EC_WORD_KID, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_LASS, + .name = _("JOSI"), + .teamFlags = 0x02, + .greeting = { + .easyChat = { + EC_WORD_BE, + EC_WORD_KIND, + EC_WORD_TO, + EC_WORD_GIRL, + 0xFFFF, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_GUITARIST, + .name = _("LEIF"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_I_AM, + EC_WORD_GREAT, + EC_WORD_YOU_RE, + EC_WORD_RATHER, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + EC_WORD_OKAY, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_RICH_BOY, + .name = _("INGO"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_I, + EC_WORD_HAVE, + EC_WORD_ROUGH_SKIN, + EC_WORD_NATURAL_CURE, + EC_WORD_IS, + EC_WORD_ALL_RIGHT, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_BUG_CATCHER, + .name = _("LUDWIG"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_IF_I_WIN, + EC_WORD_IS, + EC_WORD_THAT, + EC_WORD_EXCITING, + 0xFFFF, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_PICNICKER, + .name = _("RAJA"), + .teamFlags = 0x02, + .greeting = { + .easyChat = { + EC_WORD_WITH, + EC_WORD_POKEMON, + EC_WORD_TO, + EC_WORD_WALKING, + EC_WORD_IS, + EC_WORD_GREAT, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_COLLECTOR, + .name = _("HARALD"), + .teamFlags = 0x09, + .greeting = { + .easyChat = { + EC_WORD_HERE_GOES, + EC_WORD_MY, + EC_WORD_HUGE_POWER, + 0xFFFF, + EC_WORD_POKEMON, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_TUBER_M, + .name = _("KIM"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_I_AM, + EC_WORD_A, + EC_WORD_GENIUS, + EC_WORD_WE, + EC_WORD_WILL, + EC_WORD_WINS, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_KINDLER, + .name = _("ERWIN"), + .teamFlags = 0x05, + .greeting = { + .easyChat = { + EC_WORD_MY, + EC_WORD_FIRE, + EC_WORD_IS, + EC_WORD_VERY, + EC_WORD_HOT, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_PSYCHIC_F, + .name = _("EIKA"), + .teamFlags = 0x0A, + .greeting = { + .easyChat = { + EC_WORD_FIGHTING, + EC_MOVE(ASTONISH), + EC_WORD_AND, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + 0xFFFF, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .name = _("ANNINA"), + .teamFlags = 0x02, + .greeting = { + .easyChat = { + EC_WORD_SORRY, + EC_WORD_YOURS, + EC_WORD_POKEMON, + EC_WORD_WILL, + EC_WORD_DON_T, + EC_WORD_WINS, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_CYCLING_TRIATHLETE_F, + .name = _("RUTH"), + .teamFlags = 0x06, + .greeting = { + .easyChat = { + EC_WORD_I_AM, + EC_WORD_TOUGH, + EC_WORD_WHO_WAS, + EC_WORD_POKEMON, + EC_WORD_TOO, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_POKEMANIAC, + .name = _("JENS"), + .teamFlags = 0x40, + .greeting = { + .easyChat = { + EC_WORD_WHO_WAS, + EC_WORD_POKEMON, + EC_WORD_THOSE, + EC_WORD_COOL, + EC_WORD_YOURS, + EC_WORD_LOSE, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_SAILOR, + .name = _("TITUS"), + .teamFlags = 0x09, + .greeting = { + .easyChat = { + EC_WORD_MY, + EC_WORD_FOE, + EC_WORD_IS, + EC_WORD_FINALLY, + EC_WORD_HERE, + EC_WORD_EXCELLENT, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_POKEMON_BREEDER_F, + .name = _("NICOLA"), + .teamFlags = 0x06, + .greeting = { + .easyChat = { + EC_WORD_I_AM, + EC_WORD_VORACIOUS, + EC_MOVE2(POUND), + EC_WORD_AND, + EC_MOVE2(BELLY_DRUM), + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_HEX_MANIAC, + .name = _("PAULA"), + .teamFlags = 0x42, + .greeting = { + .easyChat = { + EC_WORD_IS_IT_QUES, + EC_WORD_THOSE_ARE, + EC_WORD_UGLY, + EC_MOVE(SPITE), + EC_WORD_TO, + EC_WORD_TAKE, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_RUIN_MANIAC, + .name = _("SÖREN"), + .teamFlags = 0x41, + .greeting = { + .easyChat = { + EC_WORD_ADVENTURE, + EC_WORD_AND, + EC_WORD_BATTLE, + EC_WORD_THOSE, + EC_WORD_WHO_WAS, + EC_WORD_LIKES, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_M, + .name = _("RAINER"), + .teamFlags = 0x09, + .greeting = { + .easyChat = { + EC_WORD_WE, + EC_WORD_CAN, + EC_WORD_VERSUS, + EC_WORD_CHILDREN, + EC_WORD_DON_T, + EC_WORD_LOSE, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_SCHOOL_KID_M, + .name = _("FABIAN"), + .teamFlags = 0x08, + .greeting = { + .easyChat = { + EC_WORD_DAILY, + EC_WORD_POKEMON, + EC_WORD_IN, + EC_WORD_THE, + EC_WORD_SCHOOL, + EC_WORD_AWESOME, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_POKEMON_RANGER_F, + .name = _("ELLEN"), + .teamFlags = 0x04, + .greeting = { + .easyChat = { + EC_WORD_ARE, + EC_WORD_YOU, + EC_WORD_ALL_RIGHT, + EC_WORD_TO, + EC_WORD_POKEMON, + EC_WORD_QUES, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .name = _("ARNIE"), + .teamFlags = 0x09, + .greeting = { + .easyChat = { + EC_WORD_MY, + EC_WORD_FIGHTING, + EC_WORD_IS, + EC_WORD_PERFECTION, + EC_WORD_YOUR, + EC_WORD_USELESS, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_RUNNING_TRIATHLETE_M, + .name = _("HARDI"), + .teamFlags = 0x09, + .greeting = { + .easyChat = { + EC_WORD_BOY, + EC_WORD_I_AM, + EC_WORD_MAYBE, + EC_WORD_TIRED, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_BEAUTY, + .name = _("LINA"), + .teamFlags = 0x06, + .greeting = { + .easyChat = { + EC_WORD_A, + EC_WORD_TRAINER, + EC_WORD_HOW_DO, + EC_WORD_YOU, + EC_WORD_IS, + EC_WORD_EXCITING, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_AROMA_LADY, + .name = _("SELINA"), + .teamFlags = 0x06, + .greeting = { + .easyChat = { + EC_WORD_YOU_VE, + EC_WORD_STENCH, + EC_WORD_OR, + EC_MOVE(SWEET_SCENT), + EC_WORD_QUES, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_COLLECTOR, + .name = _("DANTE"), + .teamFlags = 0x81, + .greeting = { + .easyChat = { + EC_WORD_YOURS, + EC_WORD_POKEMON, + EC_WORD_I, + EC_WORD_WANTS, + EC_WORD_SHE, + EC_WORD_EXCL_EXCL, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_F, + .name = _("KATJA"), + .teamFlags = 0x04, + .greeting = { + .easyChat = { + EC_WORD_TODAY, + EC_WORD_WANTS, + EC_WORD_I, + EC_WORD_MY, + EC_WORD_BEST, + EC_WORD_GIVE, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_POKEMON_RANGER_M, + .name = _("HORST"), + .teamFlags = 0x0C, + .greeting = { + .easyChat = { + EC_WORD_WAAAH, + EC_WORD_WAAAH, + EC_WORD_WAAAH, + EC_WORD_WAAAH, + EC_WORD_EHEHE, + EC_MOVE(FAKE_TEARS), + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_POKEFAN_M, + .name = _("GERRIT"), + .teamFlags = 0x80, + .greeting = { + .easyChat = { + EC_WORD_MY, + EC_WORD_ANIME, + EC_WORD_SONG, + EC_WORD_IS, + EC_WORD_DON_T, + EC_WORD_LOUSY, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_CYCLING_TRIATHLETE_M, + .name = _("NIKO"), + .teamFlags = 0x04, + .greeting = { + .easyChat = { + EC_WORD_BATTLE, + EC_WORD_DON_T, + EC_WORD_JUST, + EC_WORD_DO, + EC_WORD_SOMETHING, + EC_WORD_ELSE, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_POKEMON_BREEDER_M, + .name = _("BALDO"), + .teamFlags = 0x41, + .greeting = { + .easyChat = { + EC_WORD_ARE, + EC_WORD_YOU, + EC_WORD_BUSY, + EC_WORD_HAS, + EC_WORD_THAT, + EC_WORD_TIME, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_PARASOL_LADY, + .name = _("ALMA"), + .teamFlags = 0x08, + .greeting = { + .easyChat = { + EC_WORD_THAT, + EC_MOVE(MORNING_SUN), + EC_WORD_HAS, + EC_WORD_SO, + EC_WORD_A_LOT, + EC_MOVE(COSMIC_POWER), + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_CAMPER, + .name = _("ADAM"), + .teamFlags = 0x0C, + .greeting = { + .easyChat = { + EC_WORD_EXCITING, + EC_WORD_BATTLE, + EC_WORD_THOSE, + EC_WORD_GREAT, + EC_WORD_YEEHAW_EXCL, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_SCHOOL_KID_F, + .name = _("GRETE"), + .teamFlags = 0x42, + .greeting = { + .easyChat = { + EC_WORD_I, + EC_WORD_WANTS, + EC_WORD_SOMETHING, + EC_MOVE(GROWTH), + EC_WORD_WORKS, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_BEAUTY, + .name = _("NAOMI"), + .teamFlags = 0x04, + .greeting = { + .easyChat = { + EC_WORD_IT, + EC_WORD_WAS, + EC_WORD_GREAT, + EC_WORD_YOUNG, + EC_WORD_TO, + EC_WORD_HIS, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_NINJA_BOY, + .name = _("KENO"), + .teamFlags = 0x0C, + .greeting = { + .easyChat = { + EC_WORD_PLEASE, + EC_WORD_BE, + EC_WORD_DON_T, + EC_WORD_SO, + EC_WORD_MEAN, + EC_WORD_TO_ME, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_CYCLING_TRIATHLETE_M, + .name = _("REMUS"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_WAKES_UP, + EC_MOVE2(HIDDEN_POWER), + EC_WORD_AND, + EC_MOVE(ASTONISH), + 0xFFFF, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_POKEMON_RANGER_F, + .name = _("EDITH"), + .teamFlags = 0x02, + .greeting = { + .easyChat = { + EC_WORD_THE, + EC_WORD_BATTLE_TOWER, + EC_WORD_IS, + EC_WORD_SO, + EC_WORD_ENTERTAINING, + EC_WORD_AWESOME, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_RUIN_MANIAC, + .name = _("ANTON"), + .teamFlags = 0x41, + .greeting = { + .easyChat = { + EC_WORD_THICK_FAT, + EC_WORD_AND, + EC_WORD_CHLOROPHYLL, + EC_WORD_BLEND, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + EC_WORD_TASTY, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .name = _("MALTE"), + .teamFlags = 0x81, + .greeting = { + .easyChat = { + EC_WORD_AN, + EC_MOVE(SCARY_FACE), + EC_WORD_IS, + EC_WORD_DON_T, + EC_WORD_QUITE, + EC_WORD_TERRIBLE, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_HEX_MANIAC, + .name = _("RAOUL"), + .teamFlags = 0x42, + .greeting = { + .easyChat = { + EC_WORD_RUN_AWAY, + EC_WORD_GIVE_ME, + EC_WORD_SON, + EC_WORD_BEST, + 0xFFFF, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_RUNNING_TRIATHLETE_M, + .name = _("RICK"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_WATER, + EC_WORD_IS, + EC_WORD_TASTY, + EC_WORD_HIP_AND, + EC_WORD_REFRESHING, + EC_WORD_YES_SIR_EXCL, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_POKEFAN_M, + .name = _("DENNIS"), + .teamFlags = 0x80, + .greeting = { + .easyChat = { + EC_WORD_GO, + EC_WORD_WHO_WAS, + EC_WORD_POKEMON, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + 0xFFFF, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_PSYCHIC_F, + .name = _("GLORIA"), + .teamFlags = 0x82, + .greeting = { + .easyChat = { + EC_WORD_THE, + EC_WORD_FIGHTING, + EC_WORD_MUST_BE, + EC_WORD_HOT, + EC_WORD_HIS, + EC_WORD_FIERY, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_GUITARIST, + .name = _("NINO"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_MUSIC, + EC_WORD_IS, + EC_WORD_MY, + EC_WORD_EVERY, + EC_WORD_MY, + EC_WORD_DESTINY, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_KINDLER, + .name = _("FIETE"), + .teamFlags = 0x41, + .greeting = { + .easyChat = { + EC_WORD_IT_S, + EC_WORD_ALL_RIGHT, + EC_WORD_VERY, + EC_WORD_ALL_RIGHT, + 0xFFFF, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_AROMA_LADY, + .name = _("AMANDA"), + .teamFlags = 0x82, + .greeting = { + .easyChat = { + EC_WORD_WHAT, + EC_WORD_FOR, + EC_WORD_A, + EC_WORD_TRAINER, + EC_WORD_ARE, + EC_WORD_YOU, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_M, + .name = _("MAREK"), + .teamFlags = 0x10, + .greeting = { + .easyChat = { + EC_WORD_WE_VE, + EC_WORD_UNTIL, + EC_WORD_NOW, + EC_WORD_TOTALLY, + EC_WORD_NEVER, + EC_WORD_LOST, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_DRAGON_TAMER, + .name = _("NATHAN"), + .teamFlags = 0x10, + .greeting = { + .easyChat = { + EC_WORD_DRAGON, + 0xFFFF, + EC_WORD_POKEMON, + EC_WORD_THOSE, + EC_WORD_FANTASTIC, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_LASS, + .name = _("MIRIAM"), + .teamFlags = 0x82, + .greeting = { + .easyChat = { + EC_WORD_YOU_RE, + EC_WORD_QUITE, + EC_WORD_TOO_STRONG, + EC_WORD_AM, + EC_WORD_BAD, + EC_WORD_NEWS, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_POKEMANIAC, + .name = _("THEO"), + .teamFlags = 0x40, + .greeting = { + .easyChat = { + EC_WORD_PLUSH_DOLL, + EC_WORD_MUST_BE, + EC_WORD_MAN, + EC_WORD_SIMPLE, + EC_WORD_ADORE, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_F, + .name = _("PIA"), + .teamFlags = 0x10, + .greeting = { + .easyChat = { + EC_WORD_HERE_I_COME, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + EC_WORD_CUTE, + EC_WORD_A, + EC_WORD_CHANNEL, + EC_WORD_IDOL, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_POKEFAN_F, + .name = _("ALISSA"), + .teamFlags = 0x20, + .greeting = { + .easyChat = { + EC_WORD_YOURS, + EC_WORD_POKEMON, + EC_WORD_THOSE, + EC_WORD_PREPOSTEROUS, + EC_WORD_I_AM, + EC_WORD_SHOCKED, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_GENTLEMAN, + .name = _("ARTUR"), + .teamFlags = 0x20, + .greeting = { + .easyChat = { + EC_WORD_PLEASE, + EC_WORD_ALL, + EC_WORD_BATTLE, + EC_WORD_WEREN_T, + EC_WORD_GREAT, + EC_WORD_HIS, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .name = _("MAJA"), + .teamFlags = 0x82, + .greeting = { + .easyChat = { + EC_WORD_I_AM, + EC_WORD_PRETTY, + EC_WORD_YOU, + EC_WORD_CAN_T, + EC_WORD_DON_T, + EC_WORD_WINS, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_COOL_TRAINER_M, + .name = _("MARIUS"), + .teamFlags = 0x10, + .greeting = { + .easyChat = { + EC_WORD_I, + EC_WORD_BATTLE, + EC_WORD_DAILY, + EC_WORD_I, + EC_WORD_WON_T, + EC_WORD_LOSE, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .name = _("OLIVER"), + .teamFlags = 0x11, + .greeting = { + .easyChat = { + EC_WORD_GIGGLE, + EC_WORD_GIGGLE, + EC_WORD_SNORT, + EC_WORD_HAPPILY, + EC_WORD_GIGGLE, + EC_WORD_MUFUFU, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_CYCLING_TRIATHLETE_F, + .name = _("MOLLY"), + .teamFlags = 0x12, + .greeting = { + .easyChat = { + EC_WORD_IS, + EC_WORD_TODAY, + EC_WORD_MONDAY, + EC_WORD_QUES, + 0xFFFF, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_BUG_MANIAC, + .name = _("JÖRG"), + .teamFlags = 0x40, + .greeting = { + .easyChat = { + EC_WORD_WATER, + 0xFFFF, + EC_WORD_AND, + EC_WORD_BUG, + 0xFFFF, + EC_WORD_POKEMON, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .name = _("ANKE"), + .teamFlags = 0x20, + .greeting = { + .easyChat = { + EC_WORD_WHAT, + EC_WORD_IS, + EC_WORD_PRESSURE, + EC_WORD_STATIC, + EC_WORD_IS, + EC_WORD_SUPER, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_FISHERMAN, + .name = _("HANS"), + .teamFlags = 0x10, + .greeting = { + .easyChat = { + EC_WORD_KID, + EC_WORD_YOU, + EC_WORD_CAN_T, + EC_WORD_DON_T, + EC_WORD_WINS, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_SAILOR, + .name = _("PETER"), + .teamFlags = 0x20, + .greeting = { + .easyChat = { + EC_WORD_IT_S, + EC_WORD_QUITE, + EC_WORD_TERRIBLE, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + EC_WORD_MODE, + EC_WORD_I, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_EXPERT_F, + .name = _("MARA"), + .teamFlags = 0x20, + .greeting = { + .easyChat = { + EC_WORD_YOU_RE, + EC_WORD_VERY, + EC_WORD_ALL_RIGHT, + EC_WORD_TRAINS, + EC_WORD_OR, + EC_WORD_QUES, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_BUG_MANIAC, + .name = _("DARIUS"), + .teamFlags = 0x11, + .greeting = { + .easyChat = { + EC_WORD_ARE, + EC_WORD_YOU, + EC_WORD_TOUGH, + EC_WORD_ARE, + EC_WORD_YOU, + EC_WORD_SCARY, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_POKEMON_BREEDER_F, + .name = _("REGINA"), + .teamFlags = 0x12, + .greeting = { + .easyChat = { + EC_WORD_TODAY, + EC_WORD_WIN, + EC_WORD_I, + EC_WORD_MAYBE, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_PARASOL_LADY, + .name = _("MAIKE"), + .teamFlags = 0x10, + .greeting = { + .easyChat = { + EC_WORD_SO, + EC_WORD_AN, + EC_MOVE(SCARY_FACE), + EC_WORD_IS, + EC_WORD_NOT_VERY, + EC_WORD_KIND, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_RUNNING_TRIATHLETE_F, + .name = _("SANDRA"), + .teamFlags = 0x04, + .greeting = { + .easyChat = { + EC_WORD_SPORTS, + EC_WORD_IS, + EC_WORD_HEALTHY, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + EC_WORD_SPIRALING, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_POKEMON_RANGER_M, + .name = _("ARNOLD"), + .teamFlags = 0x08, + .greeting = { + .easyChat = { + EC_WORD_AWESOME, + EC_WORD_WHO_WAS, + EC_WORD_POKEMON, + EC_WORD_THOSE, + EC_WORD_ROCK_SOLID, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_BLACK_BELT, + .name = _("XENO"), + .teamFlags = 0x04, + .greeting = { + .easyChat = { + EC_WORD_HOO_HAH, + EC_WORD_ARE, + EC_WORD_YOU, + EC_WORD_READY, + EC_WORD_FOR, + EC_WORD_SHADY, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_COOL_TRAINER_F, + .name = _("KARLA"), + .teamFlags = 0x02, + .greeting = { + .easyChat = { + EC_WORD_YOU, + EC_WORD_CAN_T, + EC_WORD_ME, + EC_WORD_NEVER, + EC_WORD_SMITE, + EC_WORD_KID, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_COLLECTOR, + .name = _("VOLKER"), + .teamFlags = 0x80, + .greeting = { + .easyChat = { + EC_WORD_FROM, + EC_WORD_PLACE, + EC_WORD_TO, + EC_WORD_PLACE, + EC_WORD_POKEMON, + EC_WORD_WOWEE, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_SWIMMING_TRIATHLETE_M, + .name = _("TOBIAS"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_THAT, + EC_WORD_ISN_T, + EC_WORD_SPORTS, + EC_WORD_IT_S, + EC_WORD_A, + EC_WORD_FIGHTING, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_GENTLEMAN, + .name = _("NORBERT"), + .teamFlags = 0x20, + .greeting = { + .easyChat = { + EC_WORD_I, + EC_WORD_MUST_BE, + EC_WORD_WINS, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + EC_WORD_PLEASE, + EC_WORD_PLEASE, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .name = _("ZITA"), + .teamFlags = 0x02, + .greeting = { + .easyChat = { + EC_WORD_THAT, + EC_WORD_IS, + EC_WORD_SCARY, + EC_WORD_PLEASE, + EC_WORD_BE, + EC_WORD_NICE, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_BEAUTY, + .name = _("ELKE"), + .teamFlags = 0x20, + .greeting = { + .easyChat = { + EC_WORD_WITHOUT, + EC_MOVE(FLAIL), + EC_WORD_NONE, + EC_MOVE(WITHDRAW), + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_HIKER, + .name = _("VITUS"), + .teamFlags = 0x04, + .greeting = { + .easyChat = { + EC_WORD_YAHOO, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + EC_WORD_LISTENS, + EC_WORD_HER, + EC_WORD_TO, + EC_WORD_QUES, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_EXPERT_M, + .name = _("MALTE"), + .teamFlags = 0x10, + .greeting = { + .easyChat = { + EC_WORD_LEARN, + EC_WORD_CORRECT, + EC_WORD_TO, + EC_WORD_FIGHT, + 0xFFFF, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_POKEMON_BREEDER_M, + .name = _("TIM"), + .teamFlags = 0x40, + .greeting = { + .easyChat = { + EC_WORD_IT_S, + EC_WORD_A, + EC_WORD_FIGHTING, + EC_WORD_NONE, + EC_WORD_CHILD_S_PLAY, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_GUITARIST, + .name = _("GAVIN"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_SHADY, + EC_WORD_BABY, + EC_WORD_BABY, + EC_WORD_BABY, + 0xFFFF, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_PSYCHIC_M, + .name = _("RALF"), + .teamFlags = 0x08, + .greeting = { + .easyChat = { + EC_WORD_STICKY_HOLD, + EC_WORD_THOSE, + EC_WORD_IMPORTANT, + EC_WORD_ISN_T_IT_QUES, + 0xFFFF, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_COOL_TRAINER_F, + .name = _("JENNY"), + .teamFlags = 0x02, + .greeting = { + .easyChat = { + EC_WORD_I, + EC_WORD_SEARCH, + EC_WORD_TRAINER, + EC_WORD_ABSOLUTELY, + EC_WORD_TOUGH, + EC_WORD_THOSE, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_EXPERT_M, + .name = _("JOEL"), + .teamFlags = 0x10, + .greeting = { + .easyChat = { + EC_WORD_BELIEVE, + EC_WORD_ON, + EC_WORD_YOURS, + EC_WORD_POKEMON, + EC_WORD_AND, + EC_WORD_WIN, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_DRAGON_TAMER, + .name = _("KOLJA"), + .teamFlags = 0x0C, + .greeting = { + .easyChat = { + EC_WORD_GIRL, + EC_WORD_WITH, + EC_MOVE2(FORESIGHT), + EC_WORD_THOSE, + EC_WORD_NICE, + 0xFFFF, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_COOL_TRAINER_M, + .name = _("BILL"), + .teamFlags = 0x01, + .greeting = { + .easyChat = { + EC_WORD_WHO_WAS, + EC_WORD_POWER, + EC_WORD_IS, + EC_WORD_OVERWHELMING, + EC_WORD_DISAPPEAR, + EC_WORD_BETTER, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_EXPERT_F, + .name = _("CALLA"), + .teamFlags = 0x10, + .greeting = { + .easyChat = { + EC_WORD_TRAINER, + EC_WORD_YOU, + EC_WORD_ARE, + EC_WORD_SEEMS, + EC_WORD_CAPABLE, + EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS, + }, + }, + }, + { + .trainerClass = TRAINER_CLASS_LADY, + .name = _("GESA"), + .teamFlags = 0x02, + .greeting = { + .easyChat = { + EC_WORD_COME_ON, + EC_WORD_ABSOLUTELY, + EC_WORD_TIME, + EC_WORD_BECOMES, + EC_WORD_EXCELLENT, + 0xFFFF, + }, + }, + }, +}; diff --git a/src/data/field_map_obj/anim_func_ptrs.h b/src/data/field_map_obj/anim_func_ptrs.h new file mode 100644 index 000000000..1d1fac71e --- /dev/null +++ b/src/data/field_map_obj/anim_func_ptrs.h @@ -0,0 +1,1519 @@ +// + +// + +#ifndef POKERUBY_ANIM_FUNC_PTRS_H +#define POKERUBY_ANIM_FUNC_PTRS_H + +u8 sub_8060CE0(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8060CF0(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8060D00(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8060D10(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8060F3C(struct MapObject *, struct Sprite *); +u8 sub_8060F5C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8060F7C(struct MapObject *, struct Sprite *); +u8 sub_8060F9C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8060FBC(struct MapObject *, struct Sprite *); +u8 sub_8060FDC(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8060FFC(struct MapObject *, struct Sprite *); +u8 sub_806101C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_806103C(struct MapObject *, struct Sprite *); +u8 sub_806105C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_806107C(struct MapObject *, struct Sprite *); +u8 sub_806109C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_80610BC(struct MapObject *, struct Sprite *); +u8 sub_80610DC(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_80610FC(struct MapObject *, struct Sprite *); +u8 sub_806111C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_80613A8(struct MapObject *, struct Sprite *); +u8 sub_80613D4(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8061400(struct MapObject *, struct Sprite *); +u8 sub_806142C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8061458(struct MapObject *, struct Sprite *); +u8 sub_8061484(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_80614B0(struct MapObject *, struct Sprite *); +u8 sub_80614DC(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_806152C(struct MapObject *, struct Sprite *); +u8 sub_8061510(struct MapObject *, struct Sprite *); +u8 sub_8063470(struct MapObject *, struct Sprite *); +u8 sub_806154C(struct MapObject *, struct Sprite *); +u8 sub_8061510(struct MapObject *, struct Sprite *); +u8 sub_8063470(struct MapObject *, struct Sprite *); +u8 sub_806156C(struct MapObject *, struct Sprite *); +u8 sub_8061510(struct MapObject *, struct Sprite *); +u8 sub_8063470(struct MapObject *, struct Sprite *); +u8 sub_806158C(struct MapObject *, struct Sprite *); +u8 sub_8061510(struct MapObject *, struct Sprite *); +u8 sub_8063470(struct MapObject *, struct Sprite *); +u8 sub_80615AC(struct MapObject *, struct Sprite *); +u8 sub_8061510(struct MapObject *, struct Sprite *); +u8 sub_8063470(struct MapObject *, struct Sprite *); +u8 sub_80615CC(struct MapObject *, struct Sprite *); +u8 sub_80615EC(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_806160C(struct MapObject *, struct Sprite *); +u8 sub_806162C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_806164C(struct MapObject *, struct Sprite *); +u8 sub_806166C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_806168C(struct MapObject *, struct Sprite *); +u8 sub_80616AC(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8061778(struct MapObject *, struct Sprite *); +u8 sub_806173C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_80617B0(struct MapObject *, struct Sprite *); +u8 sub_806173C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_80617E8(struct MapObject *, struct Sprite *); +u8 sub_806173C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8061820(struct MapObject *, struct Sprite *); +u8 sub_806173C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8061858(struct MapObject *, struct Sprite *); +u8 sub_8061714(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8061890(struct MapObject *, struct Sprite *); +u8 sub_8061714(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_80618C8(struct MapObject *, struct Sprite *); +u8 sub_8061714(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8061900(struct MapObject *, struct Sprite *); +u8 sub_8061714(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8061938(struct MapObject *, struct Sprite *); +u8 sub_8061714(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8061970(struct MapObject *, struct Sprite *); +u8 sub_8061714(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_80619A8(struct MapObject *, struct Sprite *); +u8 sub_8061714(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_80619E0(struct MapObject *, struct Sprite *); +u8 sub_8061714(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8061A18(struct MapObject *, struct Sprite *); +u8 sub_8061714(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8061A50(struct MapObject *, struct Sprite *); +u8 sub_8061714(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8061A88(struct MapObject *, struct Sprite *); +u8 sub_8061714(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8061AC0(struct MapObject *, struct Sprite *); +u8 sub_8061714(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8061AF8(struct MapObject *, struct Sprite *); +u8 sub_8061B18(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8061B38(struct MapObject *, struct Sprite *); +u8 sub_8061B58(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8061B78(struct MapObject *, struct Sprite *); +u8 sub_8061B98(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8061BB8(struct MapObject *, struct Sprite *); +u8 sub_8061BD8(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8061BF8(struct MapObject *, struct Sprite *); +u8 sub_8061C18(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8061C38(struct MapObject *, struct Sprite *); +u8 sub_8061C58(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8061C78(struct MapObject *, struct Sprite *); +u8 sub_8061C98(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8061CB8(struct MapObject *, struct Sprite *); +u8 sub_8061CD8(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8061CF8(struct MapObject *, struct Sprite *); +u8 sub_8061D18(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8061D38(struct MapObject *, struct Sprite *); +u8 sub_8061D58(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8061D78(struct MapObject *, struct Sprite *); +u8 sub_8061D98(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8061DB8(struct MapObject *, struct Sprite *); +u8 sub_8061DD8(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 do_run_south_anim(struct MapObject *, struct Sprite *); +u8 sub_8061E18(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 do_run_north_anim(struct MapObject *, struct Sprite *); +u8 sub_8061E58(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 do_run_west_anim(struct MapObject *, struct Sprite *); +u8 sub_8061E98(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 do_run_east_anim(struct MapObject *, struct Sprite *); +u8 sub_8061ED8(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8061F24(struct MapObject *, struct Sprite *); +u8 sub_8061F3C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8061F90(struct MapObject *, struct Sprite *); +u8 sub_8061FB0(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8061FD8(struct MapObject *, struct Sprite *); +u8 sub_8061FF8(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062020(struct MapObject *, struct Sprite *); +u8 sub_8062040(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062068(struct MapObject *, struct Sprite *); +u8 sub_8062088(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_80620B0(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_806210C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062170(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062180(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062190(struct MapObject *, struct Sprite *); +u8 sub_80621BC(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_80621E8(struct MapObject *, struct Sprite *); +u8 sub_8062214(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062240(struct MapObject *, struct Sprite *); +u8 sub_806226C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062298(struct MapObject *, struct Sprite *); +u8 sub_80622C4(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_80622F0(struct MapObject *, struct Sprite *); +u8 sub_806231C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062348(struct MapObject *, struct Sprite *); +u8 sub_8062374(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_80623A0(struct MapObject *, struct Sprite *); +u8 sub_80623CC(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_80623F8(struct MapObject *, struct Sprite *); +u8 sub_8062424(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062450(struct MapObject *, struct Sprite *); +u8 sub_806247C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_80624A8(struct MapObject *, struct Sprite *); +u8 sub_80624D4(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062500(struct MapObject *, struct Sprite *); +u8 sub_806252C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062558(struct MapObject *, struct Sprite *); +u8 sub_8062584(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_80625B0(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_80625C8(struct MapObject *, struct Sprite *); +u8 sub_8061F3C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_80625D8(struct MapObject *, struct Sprite *); +u8 sub_8063470(struct MapObject *, struct Sprite *); +u8 sub_80625E8(struct MapObject *, struct Sprite *); +u8 sub_8063470(struct MapObject *, struct Sprite *); +u8 sub_80625F8(struct MapObject *, struct Sprite *); +u8 sub_8063470(struct MapObject *, struct Sprite *); +u8 sub_8062608(struct MapObject *, struct Sprite *); +u8 sub_8063470(struct MapObject *, struct Sprite *); +u8 sub_8062634(struct MapObject *, struct Sprite *); +u8 sub_8063470(struct MapObject *, struct Sprite *); +u8 sub_8062644(struct MapObject *, struct Sprite *); +u8 sub_8063470(struct MapObject *, struct Sprite *); +u8 do_exclamation_mark_bubble_1(struct MapObject *, struct Sprite *); +u8 sub_8063470(struct MapObject *, struct Sprite *); +u8 do_exclamation_mark_bubble_2(struct MapObject *, struct Sprite *); +u8 sub_8063470(struct MapObject *, struct Sprite *); +u8 do_heart_bubble(struct MapObject *, struct Sprite *); +u8 sub_8063470(struct MapObject *, struct Sprite *); +u8 sub_80626C0(struct MapObject *, struct Sprite *); +u8 sub_8062704(struct MapObject *, struct Sprite *); +u8 sub_8063470(struct MapObject *, struct Sprite *); +u8 sub_8062724(struct MapObject *, struct Sprite *); +u8 sub_8062740(struct MapObject *, struct Sprite *); +u8 sub_8062764(struct MapObject *, struct Sprite *); +u8 sub_8063470(struct MapObject *, struct Sprite *); +u8 sub_80627A0(struct MapObject *, struct Sprite *); +u8 sub_80627BC(struct MapObject *, struct Sprite *); +u8 sub_80627E0(struct MapObject *, struct Sprite *); +u8 sub_8063470(struct MapObject *, struct Sprite *); +u8 sub_806281C(struct MapObject *, struct Sprite *); +u8 sub_8063470(struct MapObject *, struct Sprite *); +u8 sub_806282C(struct MapObject *, struct Sprite *); +u8 sub_8063470(struct MapObject *, struct Sprite *); +u8 sub_806283C(struct MapObject *, struct Sprite *); +u8 sub_8063470(struct MapObject *, struct Sprite *); +u8 sub_806286C(struct MapObject *, struct Sprite *); +u8 sub_8063470(struct MapObject *, struct Sprite *); +u8 sub_806289C(struct MapObject *, struct Sprite *); +u8 sub_80628D0(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_80628FC(struct MapObject *, struct Sprite *); +u8 sub_8062930(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_806299C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_80629AC(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_80629BC(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_80629CC(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_80629DC(struct MapObject *, struct Sprite *); +u8 sub_8061F3C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062A00(struct MapObject *, struct Sprite *); +u8 sub_8061F3C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062A24(struct MapObject *, struct Sprite *); +u8 sub_8061F3C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062A48(struct MapObject *, struct Sprite *); +u8 sub_8061F3C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062A6C(struct MapObject *, struct Sprite *); +u8 sub_8061F3C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062A90(struct MapObject *, struct Sprite *); +u8 sub_8061F3C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062AB4(struct MapObject *, struct Sprite *); +u8 sub_8061F3C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062AD8(struct MapObject *, struct Sprite *); +u8 sub_8061F3C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062AFC(struct MapObject *, struct Sprite *); +u8 sub_8061F3C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062B20(struct MapObject *, struct Sprite *); +u8 sub_8061F3C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062B44(struct MapObject *, struct Sprite *); +u8 sub_8061F3C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062B68(struct MapObject *, struct Sprite *); +u8 sub_8061F3C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062BD0(struct MapObject *, struct Sprite *); +u8 sub_8062BFC(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062C28(struct MapObject *, struct Sprite *); +u8 sub_8062C54(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062C80(struct MapObject *, struct Sprite *); +u8 sub_8062CAC(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062CD8(struct MapObject *, struct Sprite *); +u8 sub_8062D04(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062D30(struct MapObject *, struct Sprite *); +u8 sub_8062D5C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062D88(struct MapObject *, struct Sprite *); +u8 sub_8062DB4(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062DE0(struct MapObject *, struct Sprite *); +u8 sub_8062E0C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062E38(struct MapObject *, struct Sprite *); +u8 sub_8062E64(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062E90(struct MapObject *, struct Sprite *); +u8 sub_8062EBC(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062EE8(struct MapObject *, struct Sprite *); +u8 sub_8062F14(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062F40(struct MapObject *, struct Sprite *); +u8 sub_8062F6C(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062F98(struct MapObject *, struct Sprite *); +u8 sub_8062FC4(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8062FF0(struct MapObject *, struct Sprite *); +u8 sub_8061714(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8063028(struct MapObject *, struct Sprite *); +u8 sub_8061714(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8063060(struct MapObject *, struct Sprite *); +u8 sub_8061714(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8063098(struct MapObject *, struct Sprite *); +u8 sub_8061714(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8063108(struct MapObject *, struct Sprite *); +u8 sub_8063128(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8063148(struct MapObject *, struct Sprite *); +u8 sub_8063168(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8063188(struct MapObject *, struct Sprite *); +u8 sub_80631A8(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_80631C8(struct MapObject *, struct Sprite *); +u8 sub_80631E8(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8063238(struct MapObject *, struct Sprite *); +u8 sub_8063258(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8063278(struct MapObject *, struct Sprite *); +u8 sub_8063298(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_80632B8(struct MapObject *, struct Sprite *); +u8 sub_80632D8(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_80632F8(struct MapObject *, struct Sprite *); +u8 sub_8063318(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8063370(struct MapObject *, struct Sprite *); +u8 sub_8063390(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_80633B0(struct MapObject *, struct Sprite *); +u8 sub_80633D0(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_80633F0(struct MapObject *, struct Sprite *); +u8 sub_8063410(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); +u8 sub_8063430(struct MapObject *, struct Sprite *); +u8 sub_8063450(struct MapObject *, struct Sprite *); +u8 sub_8063474(struct MapObject *, struct Sprite *); + +u8 (*const Unknown_83759A0[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_83759A8[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_83759B0[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_83759B8[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_83759D4[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_83759E0[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_83759EC[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_83759F8[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375A04[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375A10[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375A1C[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375A28[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375A40[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375A4C[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375A58[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375A64[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375A70[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375A7C[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375A88[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375A94[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375AA0[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375AAC[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375AB8[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375AC4[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375AD0[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375ADC[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375AE8[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375AF4[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375B00[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375B0C[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375B18[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375B24[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375B30[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375B3C[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375B48[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375B54[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375B60[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375B6C[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375B78[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375B84[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375B90[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375B9C[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375BA8[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375BB4[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375BC0[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375BCC[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375BD8[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375BE4[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375BF0[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375BFC[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375C08[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375C14[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375C20[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375C2C[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375C38[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375C44[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375C50[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375C5C[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375C68[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375C74[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375C80[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375C8C[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375C98[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375CA0[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375CA8[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375CB0[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375CB8[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375CC4[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375CD0[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375CDC[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375CE8[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375CF4[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375D00[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375D0C[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375D18[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375D24[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375D30[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375D3C[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375D48[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375D50[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375D5C[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375D64[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375D6C[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375D74[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375D7C[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375D84[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375D8C[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375D94[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375D9C[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375DA4[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375DB0[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375DC0[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375DD0[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375DD8[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375DE0[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375DE8[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375DF0[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375DFC[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375E08[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375E10[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375E18[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375E20[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375E28[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375E34[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375E40[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375E4C[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375E58[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375E64[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375E70[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375E7C[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375EB8[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375EC4[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375ED0[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375EDC[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375EE8[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375EF4[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375F00[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375F0C[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375F18[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375F24[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375F30[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375F3C[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375F48[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375F54[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375F60[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375F6C[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375F78[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375F84[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375F90[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375F9C[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375FA8[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375FB4[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375FC0[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375FCC[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375FD8[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375FE4[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375FF0[])(struct MapObject *, struct Sprite *); +u8 (*const Unknown_8375FFC[])(struct MapObject *, struct Sprite *); + +u8 (*const *const gUnknown_08375778[])(struct MapObject *, struct Sprite *) = { + Unknown_83759A0, + Unknown_83759A8, + Unknown_83759B0, + Unknown_83759B8, + Unknown_83759D4, + Unknown_83759E0, + Unknown_83759EC, + Unknown_83759F8, + Unknown_8375A04, + Unknown_8375A10, + Unknown_8375A1C, + Unknown_8375A28, + Unknown_8375A40, + Unknown_8375A4C, + Unknown_8375A58, + Unknown_8375A64, + Unknown_8375A70, + Unknown_8375A7C, + Unknown_8375A88, + Unknown_8375A94, + Unknown_8375AA0, + Unknown_8375AAC, + Unknown_8375AB8, + Unknown_8375AC4, + Unknown_8375AD0, + Unknown_8375ADC, + Unknown_8375AE8, + Unknown_8375AF4, + Unknown_8375B00, + Unknown_8375B0C, + Unknown_8375B18, + Unknown_8375B24, + Unknown_8375B30, + Unknown_8375B3C, + Unknown_8375B48, + Unknown_8375B54, + Unknown_8375B60, + Unknown_8375B6C, + Unknown_8375B78, + Unknown_8375B84, + Unknown_8375B90, + Unknown_8375B9C, + Unknown_8375BA8, + Unknown_8375BB4, + Unknown_8375BC0, + Unknown_8375BCC, + Unknown_8375BD8, + Unknown_8375BE4, + Unknown_8375BF0, + Unknown_8375BFC, + Unknown_8375C08, + Unknown_8375C14, + Unknown_8375C20, + Unknown_8375C2C, + Unknown_8375C38, + Unknown_8375C44, + Unknown_8375C50, + Unknown_8375C5C, + Unknown_8375C68, + Unknown_8375C74, + Unknown_8375C80, + Unknown_8375C8C, + Unknown_8375C98, + Unknown_8375CA0, + Unknown_8375CA8, + Unknown_8375CB0, + Unknown_8375CB8, + Unknown_8375CC4, + Unknown_8375CD0, + Unknown_8375CDC, + Unknown_8375CE8, + Unknown_8375CF4, + Unknown_8375D00, + Unknown_8375D0C, + Unknown_8375D18, + Unknown_8375D24, + Unknown_8375D30, + Unknown_8375D3C, + Unknown_8375D48, + Unknown_8375D50, + Unknown_8375D5C, + Unknown_8375D64, + Unknown_8375D6C, + Unknown_8375D74, + Unknown_8375D7C, + Unknown_8375D84, + Unknown_8375D8C, + Unknown_8375D94, + Unknown_8375D9C, + Unknown_8375DA4, + Unknown_8375DB0, + Unknown_8375DC0, + Unknown_8375DD0, + Unknown_8375DD8, + Unknown_8375DE0, + Unknown_8375DE8, + Unknown_8375DF0, + Unknown_8375DFC, + Unknown_8375E08, + Unknown_8375E10, + Unknown_8375E18, + Unknown_8375E20, + Unknown_8375E28, + Unknown_8375E34, + Unknown_8375E40, + Unknown_8375E4C, + Unknown_8375E58, + Unknown_8375E64, + Unknown_8375E70, + Unknown_8375E7C, + Unknown_8375EB8, + Unknown_8375EC4, + Unknown_8375ED0, + Unknown_8375EDC, + Unknown_8375EE8, + Unknown_8375EF4, + Unknown_8375F00, + Unknown_8375F0C, + Unknown_8375F18, + Unknown_8375F24, + Unknown_8375F30, + Unknown_8375F3C, + Unknown_8375F48, + Unknown_8375F54, + Unknown_8375F60, + Unknown_8375F6C, + Unknown_8375F78, + Unknown_8375F84, + Unknown_8375F90, + Unknown_8375F9C, + Unknown_8375FA8, + Unknown_8375FB4, + Unknown_8375FC0, + Unknown_8375FCC, + Unknown_8375FD8, + Unknown_8375FE4, + Unknown_8375FF0, + Unknown_8375FFC +}; + + +u8 (*const Unknown_83759A0[])(struct MapObject *, struct Sprite *) = { + sub_8060CE0, + sub_8063474 +}; + +u8 (*const Unknown_83759A8[])(struct MapObject *, struct Sprite *) = { + sub_8060CF0, + sub_8063474 +}; + +u8 (*const Unknown_83759B0[])(struct MapObject *, struct Sprite *) = { + sub_8060D00, + sub_8063474 +}; + +u8 (*const Unknown_83759B8[])(struct MapObject *, struct Sprite *) = { + sub_8060D10, + sub_8063474 +}; + +u8 (*const gUnknown_083759C0[])(u8) = { + get_go_image_anim_num, + get_go_fast_image_anim_num, + get_go_fast_image_anim_num, + get_go_faster_image_anim_num, + sub_805FD78 +}; + +u8 (*const Unknown_83759D4[])(struct MapObject *, struct Sprite *) = { + sub_8060F3C, + sub_8060F5C, + sub_8063474 +}; + +u8 (*const Unknown_83759E0[])(struct MapObject *, struct Sprite *) = { + sub_8060F7C, + sub_8060F9C, + sub_8063474 +}; + +u8 (*const Unknown_83759EC[])(struct MapObject *, struct Sprite *) = { + sub_8060FBC, + sub_8060FDC, + sub_8063474 +}; + +u8 (*const Unknown_83759F8[])(struct MapObject *, struct Sprite *) = { + sub_8060FFC, + sub_806101C, + sub_8063474 +}; + +u8 (*const Unknown_8375A04[])(struct MapObject *, struct Sprite *) = { + sub_806103C, + sub_806105C, + sub_8063474 +}; + +u8 (*const Unknown_8375A10[])(struct MapObject *, struct Sprite *) = { + sub_806107C, + sub_806109C, + sub_8063474 +}; + +u8 (*const Unknown_8375A1C[])(struct MapObject *, struct Sprite *) = { + sub_80610BC, + sub_80610DC, + sub_8063474 +}; + +u8 (*const Unknown_8375A28[])(struct MapObject *, struct Sprite *) = { + sub_80610FC, + sub_806111C, + sub_8063474 +}; + +const s16 gUnknown_08375A34[] = {0, 1, 1}; +const s16 gUnknown_08375A3A[] = {0, 0, 1}; + +u8 (*const Unknown_8375A40[])(struct MapObject *, struct Sprite *) = { + sub_80613A8, + sub_80613D4, + sub_8063474 +}; + +u8 (*const Unknown_8375A4C[])(struct MapObject *, struct Sprite *) = { + sub_8061400, + sub_806142C, + sub_8063474 +}; + +u8 (*const Unknown_8375A58[])(struct MapObject *, struct Sprite *) = { + sub_8061458, + sub_8061484, + sub_8063474 +}; + +u8 (*const Unknown_8375A64[])(struct MapObject *, struct Sprite *) = { + sub_80614B0, + sub_80614DC, + sub_8063474 +}; + +u8 (*const Unknown_8375A70[])(struct MapObject *, struct Sprite *) = { + sub_806152C, + sub_8061510, + sub_8063470 +}; + +u8 (*const Unknown_8375A7C[])(struct MapObject *, struct Sprite *) = { + sub_806154C, + sub_8061510, + sub_8063470 +}; + +u8 (*const Unknown_8375A88[])(struct MapObject *, struct Sprite *) = { + sub_806156C, + sub_8061510, + sub_8063470 +}; + +u8 (*const Unknown_8375A94[])(struct MapObject *, struct Sprite *) = { + sub_806158C, + sub_8061510, + sub_8063470 +}; + +u8 (*const Unknown_8375AA0[])(struct MapObject *, struct Sprite *) = { + sub_80615AC, + sub_8061510, + sub_8063470 +}; + +u8 (*const Unknown_8375AAC[])(struct MapObject *, struct Sprite *) = { + sub_80615CC, + sub_80615EC, + sub_8063474 +}; + +u8 (*const Unknown_8375AB8[])(struct MapObject *, struct Sprite *) = { + sub_806160C, + sub_806162C, + sub_8063474 +}; + +u8 (*const Unknown_8375AC4[])(struct MapObject *, struct Sprite *) = { + sub_806164C, + sub_806166C, + sub_8063474 +}; + +u8 (*const Unknown_8375AD0[])(struct MapObject *, struct Sprite *) = { + sub_806168C, + sub_80616AC, + sub_8063474 +}; + +u8 (*const Unknown_8375ADC[])(struct MapObject *, struct Sprite *) = { + sub_8061778, + sub_806173C, + sub_8063474 +}; + +u8 (*const Unknown_8375AE8[])(struct MapObject *, struct Sprite *) = { + sub_80617B0, + sub_806173C, + sub_8063474 +}; + +u8 (*const Unknown_8375AF4[])(struct MapObject *, struct Sprite *) = { + sub_80617E8, + sub_806173C, + sub_8063474 +}; + +u8 (*const Unknown_8375B00[])(struct MapObject *, struct Sprite *) = { + sub_8061820, + sub_806173C, + sub_8063474 +}; + +u8 (*const Unknown_8375B0C[])(struct MapObject *, struct Sprite *) = { + sub_8061858, + sub_8061714, + sub_8063474 +}; + +u8 (*const Unknown_8375B18[])(struct MapObject *, struct Sprite *) = { + sub_8061890, + sub_8061714, + sub_8063474 +}; + +u8 (*const Unknown_8375B24[])(struct MapObject *, struct Sprite *) = { + sub_80618C8, + sub_8061714, + sub_8063474 +}; + +u8 (*const Unknown_8375B30[])(struct MapObject *, struct Sprite *) = { + sub_8061900, + sub_8061714, + sub_8063474 +}; + +u8 (*const Unknown_8375B3C[])(struct MapObject *, struct Sprite *) = { + sub_8061938, + sub_8061714, + sub_8063474 +}; + +u8 (*const Unknown_8375B48[])(struct MapObject *, struct Sprite *) = { + sub_8061970, + sub_8061714, + sub_8063474 +}; + +u8 (*const Unknown_8375B54[])(struct MapObject *, struct Sprite *) = { + sub_80619A8, + sub_8061714, + sub_8063474 +}; + +u8 (*const Unknown_8375B60[])(struct MapObject *, struct Sprite *) = { + sub_80619E0, + sub_8061714, + sub_8063474 +}; + +u8 (*const Unknown_8375B6C[])(struct MapObject *, struct Sprite *) = { + sub_8061A18, + sub_8061714, + sub_8063474 +}; + +u8 (*const Unknown_8375B78[])(struct MapObject *, struct Sprite *) = { + sub_8061A50, + sub_8061714, + sub_8063474 +}; + +u8 (*const Unknown_8375B84[])(struct MapObject *, struct Sprite *) = { + sub_8061A88, + sub_8061714, + sub_8063474 +}; + +u8 (*const Unknown_8375B90[])(struct MapObject *, struct Sprite *) = { + sub_8061AC0, + sub_8061714, + sub_8063474 +}; + +u8 (*const Unknown_8375B9C[])(struct MapObject *, struct Sprite *) = { + sub_8061AF8, + sub_8061B18, + sub_8063474 +}; + +u8 (*const Unknown_8375BA8[])(struct MapObject *, struct Sprite *) = { + sub_8061B38, + sub_8061B58, + sub_8063474 +}; + +u8 (*const Unknown_8375BB4[])(struct MapObject *, struct Sprite *) = { + sub_8061B78, + sub_8061B98, + sub_8063474 +}; + +u8 (*const Unknown_8375BC0[])(struct MapObject *, struct Sprite *) = { + sub_8061BB8, + sub_8061BD8, + sub_8063474 +}; + +u8 (*const Unknown_8375BCC[])(struct MapObject *, struct Sprite *) = { + sub_8061BF8, + sub_8061C18, + sub_8063474 +}; + +u8 (*const Unknown_8375BD8[])(struct MapObject *, struct Sprite *) = { + sub_8061C38, + sub_8061C58, + sub_8063474 +}; + +u8 (*const Unknown_8375BE4[])(struct MapObject *, struct Sprite *) = { + sub_8061C78, + sub_8061C98, + sub_8063474 +}; + +u8 (*const Unknown_8375BF0[])(struct MapObject *, struct Sprite *) = { + sub_8061CB8, + sub_8061CD8, + sub_8063474 +}; + +u8 (*const Unknown_8375BFC[])(struct MapObject *, struct Sprite *) = { + sub_8061CF8, + sub_8061D18, + sub_8063474 +}; + +u8 (*const Unknown_8375C08[])(struct MapObject *, struct Sprite *) = { + sub_8061D38, + sub_8061D58, + sub_8063474 +}; + +u8 (*const Unknown_8375C14[])(struct MapObject *, struct Sprite *) = { + sub_8061D78, + sub_8061D98, + sub_8063474 +}; + +u8 (*const Unknown_8375C20[])(struct MapObject *, struct Sprite *) = { + sub_8061DB8, + sub_8061DD8, + sub_8063474 +}; + +u8 (*const Unknown_8375C2C[])(struct MapObject *, struct Sprite *) = { + do_run_south_anim, + sub_8061E18, + sub_8063474 +}; + +u8 (*const Unknown_8375C38[])(struct MapObject *, struct Sprite *) = { + do_run_north_anim, + sub_8061E58, + sub_8063474 +}; + +u8 (*const Unknown_8375C44[])(struct MapObject *, struct Sprite *) = { + do_run_west_anim, + sub_8061E98, + sub_8063474 +}; + +u8 (*const Unknown_8375C50[])(struct MapObject *, struct Sprite *) = { + do_run_east_anim, + sub_8061ED8, + sub_8063474 +}; + +u8 (*const Unknown_8375C5C[])(struct MapObject *, struct Sprite *) = { + sub_8061F24, + sub_8061F3C, + sub_8063474 +}; + +u8 (*const Unknown_8375C68[])(struct MapObject *, struct Sprite *) = { + sub_8061F90, + sub_8061FB0, + sub_8063474 +}; + +u8 (*const Unknown_8375C74[])(struct MapObject *, struct Sprite *) = { + sub_8061FD8, + sub_8061FF8, + sub_8063474 +}; + +u8 (*const Unknown_8375C80[])(struct MapObject *, struct Sprite *) = { + sub_8062020, + sub_8062040, + sub_8063474 +}; + +u8 (*const Unknown_8375C8C[])(struct MapObject *, struct Sprite *) = { + sub_8062068, + sub_8062088, + sub_8063474 +}; + +u8 (*const Unknown_8375C98[])(struct MapObject *, struct Sprite *) = { + sub_80620B0, + sub_8063474 +}; + +u8 (*const Unknown_8375CA0[])(struct MapObject *, struct Sprite *) = { + sub_806210C, + sub_8063474 +}; + +u8 (*const Unknown_8375CA8[])(struct MapObject *, struct Sprite *) = { + sub_8062170, + sub_8063474 +}; + +u8 (*const Unknown_8375CB0[])(struct MapObject *, struct Sprite *) = { + sub_8062180, + sub_8063474 +}; + +u8 (*const Unknown_8375CB8[])(struct MapObject *, struct Sprite *) = { + sub_8062190, + sub_80621BC, + sub_8063474 +}; + +u8 (*const Unknown_8375CC4[])(struct MapObject *, struct Sprite *) = { + sub_80621E8, + sub_8062214, + sub_8063474 +}; + +u8 (*const Unknown_8375CD0[])(struct MapObject *, struct Sprite *) = { + sub_8062240, + sub_806226C, + sub_8063474 +}; + +u8 (*const Unknown_8375CDC[])(struct MapObject *, struct Sprite *) = { + sub_8062298, + sub_80622C4, + sub_8063474 +}; + +u8 (*const Unknown_8375CE8[])(struct MapObject *, struct Sprite *) = { + sub_80622F0, + sub_806231C, + sub_8063474 +}; + +u8 (*const Unknown_8375CF4[])(struct MapObject *, struct Sprite *) = { + sub_8062348, + sub_8062374, + sub_8063474 +}; + +u8 (*const Unknown_8375D00[])(struct MapObject *, struct Sprite *) = { + sub_80623A0, + sub_80623CC, + sub_8063474 +}; + +u8 (*const Unknown_8375D0C[])(struct MapObject *, struct Sprite *) = { + sub_80623F8, + sub_8062424, + sub_8063474 +}; + +u8 (*const Unknown_8375D18[])(struct MapObject *, struct Sprite *) = { + sub_8062450, + sub_806247C, + sub_8063474 +}; + +u8 (*const Unknown_8375D24[])(struct MapObject *, struct Sprite *) = { + sub_80624A8, + sub_80624D4, + sub_8063474 +}; + +u8 (*const Unknown_8375D30[])(struct MapObject *, struct Sprite *) = { + sub_8062500, + sub_806252C, + sub_8063474 +}; + +u8 (*const Unknown_8375D3C[])(struct MapObject *, struct Sprite *) = { + sub_8062558, + sub_8062584, + sub_8063474 +}; + +u8 (*const Unknown_8375D48[])(struct MapObject *, struct Sprite *) = { + sub_80625B0, + sub_8063474 +}; + +u8 (*const Unknown_8375D50[])(struct MapObject *, struct Sprite *) = { + sub_80625C8, + sub_8061F3C, + sub_8063474 +}; + +u8 (*const Unknown_8375D5C[])(struct MapObject *, struct Sprite *) = { + sub_80625D8, + sub_8063470 +}; + +u8 (*const Unknown_8375D64[])(struct MapObject *, struct Sprite *) = { + sub_80625E8, + sub_8063470 +}; + +u8 (*const Unknown_8375D6C[])(struct MapObject *, struct Sprite *) = { + sub_80625F8, + sub_8063470 +}; + +u8 (*const Unknown_8375D74[])(struct MapObject *, struct Sprite *) = { + sub_8062608, + sub_8063470 +}; + +u8 (*const Unknown_8375D7C[])(struct MapObject *, struct Sprite *) = { + sub_8062634, + sub_8063470 +}; + +u8 (*const Unknown_8375D84[])(struct MapObject *, struct Sprite *) = { + sub_8062644, + sub_8063470 +}; + +u8 (*const Unknown_8375D8C[])(struct MapObject *, struct Sprite *) = { + do_exclamation_mark_bubble_1, + sub_8063470 +}; + +u8 (*const Unknown_8375D94[])(struct MapObject *, struct Sprite *) = { + do_exclamation_mark_bubble_2, + sub_8063470 +}; + +u8 (*const Unknown_8375D9C[])(struct MapObject *, struct Sprite *) = { + do_heart_bubble, + sub_8063470 +}; + +u8 (*const Unknown_8375DA4[])(struct MapObject *, struct Sprite *) = { + sub_80626C0, + sub_8062704, + sub_8063470 +}; + +u8 (*const Unknown_8375DB0[])(struct MapObject *, struct Sprite *) = { + sub_8062724, + sub_8062740, + sub_8062764, + sub_8063470 +}; + +u8 (*const Unknown_8375DC0[])(struct MapObject *, struct Sprite *) = { + sub_80627A0, + sub_80627BC, + sub_80627E0, + sub_8063470 +}; + +u8 (*const Unknown_8375DD0[])(struct MapObject *, struct Sprite *) = { + sub_806281C, + sub_8063470 +}; + +u8 (*const Unknown_8375DD8[])(struct MapObject *, struct Sprite *) = { + sub_806282C, + sub_8063470 +}; + +u8 (*const Unknown_8375DE0[])(struct MapObject *, struct Sprite *) = { + sub_806283C, + sub_8063470 +}; + +u8 (*const Unknown_8375DE8[])(struct MapObject *, struct Sprite *) = { + sub_806286C, + sub_8063470 +}; + +u8 (*const Unknown_8375DF0[])(struct MapObject *, struct Sprite *) = { + sub_806289C, + sub_80628D0, + sub_8063474 +}; + +u8 (*const Unknown_8375DFC[])(struct MapObject *, struct Sprite *) = { + sub_80628FC, + sub_8062930, + sub_8063474 +}; + +u8 (*const Unknown_8375E08[])(struct MapObject *, struct Sprite *) = { + sub_806299C, + sub_8063474 +}; + +u8 (*const Unknown_8375E10[])(struct MapObject *, struct Sprite *) = { + sub_80629AC, + sub_8063474 +}; + +u8 (*const Unknown_8375E18[])(struct MapObject *, struct Sprite *) = { + sub_80629BC, + sub_8063474 +}; + +u8 (*const Unknown_8375E20[])(struct MapObject *, struct Sprite *) = { + sub_80629CC, + sub_8063474 +}; + +u8 (*const Unknown_8375E28[])(struct MapObject *, struct Sprite *) = { + sub_80629DC, + sub_8061F3C, + sub_8063474 +}; + +u8 (*const Unknown_8375E34[])(struct MapObject *, struct Sprite *) = { + sub_8062A00, + sub_8061F3C, + sub_8063474 +}; + +u8 (*const Unknown_8375E40[])(struct MapObject *, struct Sprite *) = { + sub_8062A24, + sub_8061F3C, + sub_8063474 +}; + +u8 (*const Unknown_8375E4C[])(struct MapObject *, struct Sprite *) = { + sub_8062A48, + sub_8061F3C, + sub_8063474 +}; + +u8 (*const Unknown_8375E58[])(struct MapObject *, struct Sprite *) = { + sub_8062A6C, + sub_8061F3C, + sub_8063474 +}; + +u8 (*const Unknown_8375E64[])(struct MapObject *, struct Sprite *) = { + sub_8062A90, + sub_8061F3C, + sub_8063474 +}; + +u8 (*const Unknown_8375E70[])(struct MapObject *, struct Sprite *) = { + sub_8062AB4, + sub_8061F3C, + sub_8063474 +}; + +u8 (*const Unknown_8375E7C[])(struct MapObject *, struct Sprite *) = { + sub_8062AD8, + sub_8061F3C, + sub_8063474, + sub_8062AFC, + sub_8061F3C, + sub_8063474, + sub_8062B20, + sub_8061F3C, + sub_8063474, + sub_8062B44, + sub_8061F3C, + sub_8063474, + sub_8062B68, + sub_8061F3C, + sub_8063474 +}; + +u8 (*const Unknown_8375EB8[])(struct MapObject *, struct Sprite *) = { + sub_8062BD0, + sub_8062BFC, + sub_8063474 +}; + +u8 (*const Unknown_8375EC4[])(struct MapObject *, struct Sprite *) = { + sub_8062C28, + sub_8062C54, + sub_8063474 +}; + +u8 (*const Unknown_8375ED0[])(struct MapObject *, struct Sprite *) = { + sub_8062C80, + sub_8062CAC, + sub_8063474 +}; + +u8 (*const Unknown_8375EDC[])(struct MapObject *, struct Sprite *) = { + sub_8062CD8, + sub_8062D04, + sub_8063474 +}; + +u8 (*const Unknown_8375EE8[])(struct MapObject *, struct Sprite *) = { + sub_8062D30, + sub_8062D5C, + sub_8063474 +}; + +u8 (*const Unknown_8375EF4[])(struct MapObject *, struct Sprite *) = { + sub_8062D88, + sub_8062DB4, + sub_8063474 +}; + +u8 (*const Unknown_8375F00[])(struct MapObject *, struct Sprite *) = { + sub_8062DE0, + sub_8062E0C, + sub_8063474 +}; + +u8 (*const Unknown_8375F0C[])(struct MapObject *, struct Sprite *) = { + sub_8062E38, + sub_8062E64, + sub_8063474 +}; + +u8 (*const Unknown_8375F18[])(struct MapObject *, struct Sprite *) = { + sub_8062E90, + sub_8062EBC, + sub_8063474 +}; + +u8 (*const Unknown_8375F24[])(struct MapObject *, struct Sprite *) = { + sub_8062EE8, + sub_8062F14, + sub_8063474 +}; + +u8 (*const Unknown_8375F30[])(struct MapObject *, struct Sprite *) = { + sub_8062F40, + sub_8062F6C, + sub_8063474 +}; + +u8 (*const Unknown_8375F3C[])(struct MapObject *, struct Sprite *) = { + sub_8062F98, + sub_8062FC4, + sub_8063474 +}; + +u8 (*const Unknown_8375F48[])(struct MapObject *, struct Sprite *) = { + sub_8062FF0, + sub_8061714, + sub_8063474 +}; + +u8 (*const Unknown_8375F54[])(struct MapObject *, struct Sprite *) = { + sub_8063028, + sub_8061714, + sub_8063474 +}; + +u8 (*const Unknown_8375F60[])(struct MapObject *, struct Sprite *) = { + sub_8063060, + sub_8061714, + sub_8063474 +}; + +u8 (*const Unknown_8375F6C[])(struct MapObject *, struct Sprite *) = { + sub_8063098, + sub_8061714, + sub_8063474 +}; + +u8 (*const Unknown_8375F78[])(struct MapObject *, struct Sprite *) = { + sub_8063108, + sub_8063128, + sub_8063474 +}; + +u8 (*const Unknown_8375F84[])(struct MapObject *, struct Sprite *) = { + sub_8063148, + sub_8063168, + sub_8063474 +}; + +u8 (*const Unknown_8375F90[])(struct MapObject *, struct Sprite *) = { + sub_8063188, + sub_80631A8, + sub_8063474 +}; + +u8 (*const Unknown_8375F9C[])(struct MapObject *, struct Sprite *) = { + sub_80631C8, + sub_80631E8, + sub_8063474 +}; + +u8 (*const Unknown_8375FA8[])(struct MapObject *, struct Sprite *) = { + sub_8063238, + sub_8063258, + sub_8063474 +}; + +u8 (*const Unknown_8375FB4[])(struct MapObject *, struct Sprite *) = { + sub_8063278, + sub_8063298, + sub_8063474 +}; + +u8 (*const Unknown_8375FC0[])(struct MapObject *, struct Sprite *) = { + sub_80632B8, + sub_80632D8, + sub_8063474 +}; + +u8 (*const Unknown_8375FCC[])(struct MapObject *, struct Sprite *) = { + sub_80632F8, + sub_8063318, + sub_8063474 +}; + +u8 (*const Unknown_8375FD8[])(struct MapObject *, struct Sprite *) = { + sub_8063370, + sub_8063390, + sub_8063474 +}; + +u8 (*const Unknown_8375FE4[])(struct MapObject *, struct Sprite *) = { + sub_80633B0, + sub_80633D0, + sub_8063474 +}; + +u8 (*const Unknown_8375FF0[])(struct MapObject *, struct Sprite *) = { + sub_80633F0, + sub_8063410, + sub_8063474 +}; + +u8 (*const Unknown_8375FFC[])(struct MapObject *, struct Sprite *) = { + sub_8063430, + sub_8063450, + sub_8063474 +}; + +#endif //POKERUBY_ANIM_FUNC_PTRS_H diff --git a/src/data/field_map_obj/base_oam.h b/src/data/field_map_obj/base_oam.h new file mode 100644 index 000000000..49c14e8c2 --- /dev/null +++ b/src/data/field_map_obj/base_oam.h @@ -0,0 +1,56 @@ +// + +// + +#ifndef POKERUBY_BASE_OAM_H +#define POKERUBY_BASE_OAM_H + +const struct OamData gFieldOamData_8x8 = { + .shape = 0, + .size = 0, + .priority = 2 +}; + +const struct OamData gFieldOamData_16x8 = { + .shape = 1, + .size = 0, + .priority = 2 +}; + +const struct OamData gFieldOamData_16x16 = { + .shape = 0, + .size = 1, + .priority = 2 +}; + +const struct OamData gFieldOamData_32x8 = { + .shape = 1, + .size = 1, + .priority = 2 +}; + +const struct OamData gFieldOamData_64x32 = { + .shape = 1, + .size = 3, + .priority = 2 +}; + +const struct OamData gFieldOamData_16x32 = { + .shape = 2, + .size = 2, + .priority = 2 +}; + +const struct OamData gFieldOamData_32x32 = { + .shape = 0, + .size = 2, + .priority = 2 +}; + +const struct OamData gFieldOamData_64x64 = { + .shape = 0, + .size = 3, + .priority = 2 +}; + +#endif //POKERUBY_BASE_OAM_H diff --git a/src/data/field_map_obj/berry_tree_graphics_tables.h b/src/data/field_map_obj/berry_tree_graphics_tables.h new file mode 100644 index 000000000..5b60fee6f --- /dev/null +++ b/src/data/field_map_obj/berry_tree_graphics_tables.h @@ -0,0 +1,573 @@ +// + +// + +#ifndef POKERUBY_BERRY_TREE_GRAPHICS_TABLES_H +#define POKERUBY_BERRY_TREE_GRAPHICS_TABLES_H + +const struct SpriteFrameImage gMapObjectPicTable_PechaBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_PechaBerryTree_0), + obj_frame_tiles(gMapObjectPic_PechaBerryTree_1), + obj_frame_tiles(gMapObjectPic_PechaBerryTree_2), + obj_frame_tiles(gMapObjectPic_PechaBerryTree_3), + obj_frame_tiles(gMapObjectPic_PechaBerryTree_4), + obj_frame_tiles(gMapObjectPic_PechaBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Pecha[] = {3, 4, 4, 4, 4}; + +const struct SpriteFrameImage gMapObjectPicTable_KelpsyBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_KelpsyBerryTree_0), + obj_frame_tiles(gMapObjectPic_KelpsyBerryTree_1), + obj_frame_tiles(gMapObjectPic_KelpsyBerryTree_2), + obj_frame_tiles(gMapObjectPic_KelpsyBerryTree_3), + obj_frame_tiles(gMapObjectPic_KelpsyBerryTree_4), + obj_frame_tiles(gMapObjectPic_KelpsyBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Kelpsy[] = {3, 4, 2, 2, 2}; + +const struct SpriteFrameImage gMapObjectPicTable_WepearBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_WepearBerryTree_0), + obj_frame_tiles(gMapObjectPic_WepearBerryTree_1), + obj_frame_tiles(gMapObjectPic_WepearBerryTree_2), + obj_frame_tiles(gMapObjectPic_WepearBerryTree_3), + obj_frame_tiles(gMapObjectPic_WepearBerryTree_4), + obj_frame_tiles(gMapObjectPic_WepearBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Wepear[] = {3, 4, 2, 2, 2}; + +const struct SpriteFrameImage gMapObjectPicTable_IapapaBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_IapapaBerryTree_0), + obj_frame_tiles(gMapObjectPic_IapapaBerryTree_1), + obj_frame_tiles(gMapObjectPic_IapapaBerryTree_2), + obj_frame_tiles(gMapObjectPic_IapapaBerryTree_3), + obj_frame_tiles(gMapObjectPic_IapapaBerryTree_4), + obj_frame_tiles(gMapObjectPic_IapapaBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Iapapa[] = {3, 4, 3, 3, 3}; + +const struct SpriteFrameImage gMapObjectPicTable_CheriBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_CheriBerryTree_0), + obj_frame_tiles(gMapObjectPic_CheriBerryTree_1), + obj_frame_tiles(gMapObjectPic_CheriBerryTree_2), + obj_frame_tiles(gMapObjectPic_CheriBerryTree_3), + obj_frame_tiles(gMapObjectPic_CheriBerryTree_4), + obj_frame_tiles(gMapObjectPic_CheriBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Cheri[] = {3, 4, 4, 4, 4}; + +const struct SpriteFrameImage gMapObjectPicTable_FigyBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_FigyBerryTree_0), + obj_frame_tiles(gMapObjectPic_FigyBerryTree_1), + obj_frame_tiles(gMapObjectPic_FigyBerryTree_2), + obj_frame_tiles(gMapObjectPic_FigyBerryTree_3), + obj_frame_tiles(gMapObjectPic_FigyBerryTree_4), + obj_frame_tiles(gMapObjectPic_FigyBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Figy[] = {3, 4, 3, 3, 3}; + +const struct SpriteFrameImage gMapObjectPicTable_MagoBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_MagoBerryTree_0), + obj_frame_tiles(gMapObjectPic_MagoBerryTree_1), + obj_frame_tiles(gMapObjectPic_MagoBerryTree_2), + obj_frame_tiles(gMapObjectPic_MagoBerryTree_3), + obj_frame_tiles(gMapObjectPic_MagoBerryTree_4), + obj_frame_tiles(gMapObjectPic_MagoBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Mago[] = {3, 4, 3, 3, 3}; + +const struct SpriteFrameImage gMapObjectPicTable_LumBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_LumBerryTree_0), + obj_frame_tiles(gMapObjectPic_LumBerryTree_1), + obj_frame_tiles(gMapObjectPic_LumBerryTree_2), + obj_frame_tiles(gMapObjectPic_LumBerryTree_3), + obj_frame_tiles(gMapObjectPic_LumBerryTree_4), + obj_frame_tiles(gMapObjectPic_LumBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Lum[] = {3, 4, 4, 4, 4}; + +const struct SpriteFrameImage gMapObjectPicTable_RazzBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_RazzBerryTree_0), + obj_frame_tiles(gMapObjectPic_RazzBerryTree_1), + obj_frame_tiles(gMapObjectPic_RazzBerryTree_2), + obj_frame_tiles(gMapObjectPic_RazzBerryTree_3), + obj_frame_tiles(gMapObjectPic_RazzBerryTree_4), + obj_frame_tiles(gMapObjectPic_RazzBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Razz[] = {3, 4, 4, 4, 4}; + +const struct SpriteFrameImage gMapObjectPicTable_GrepaBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_GrepaBerryTree_0), + obj_frame_tiles(gMapObjectPic_GrepaBerryTree_1), + obj_frame_tiles(gMapObjectPic_GrepaBerryTree_2), + obj_frame_tiles(gMapObjectPic_GrepaBerryTree_3), + obj_frame_tiles(gMapObjectPic_GrepaBerryTree_4), + obj_frame_tiles(gMapObjectPic_GrepaBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Grepa[] = {3, 4, 3, 3, 3}; + +const struct SpriteFrameImage gMapObjectPicTable_RabutaBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_RabutaBerryTree_0), + obj_frame_tiles(gMapObjectPic_RabutaBerryTree_1), + obj_frame_tiles(gMapObjectPic_RabutaBerryTree_2), + obj_frame_tiles(gMapObjectPic_RabutaBerryTree_3), + obj_frame_tiles(gMapObjectPic_RabutaBerryTree_4), + obj_frame_tiles(gMapObjectPic_RabutaBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Rabuta[] = {3, 4, 4, 4, 4}; + +const struct SpriteFrameImage gMapObjectPicTable_NomelBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_NomelBerryTree_0), + obj_frame_tiles(gMapObjectPic_NomelBerryTree_1), + obj_frame_tiles(gMapObjectPic_NomelBerryTree_2), + obj_frame_tiles(gMapObjectPic_NomelBerryTree_3), + obj_frame_tiles(gMapObjectPic_NomelBerryTree_4), + obj_frame_tiles(gMapObjectPic_NomelBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Nomel[] = {3, 4, 3, 3, 3}; + +const struct SpriteFrameImage gMapObjectPicTable_LeppaBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_LeppaBerryTree_0), + obj_frame_tiles(gMapObjectPic_LeppaBerryTree_1), + obj_frame_tiles(gMapObjectPic_LeppaBerryTree_2), + obj_frame_tiles(gMapObjectPic_LeppaBerryTree_3), + obj_frame_tiles(gMapObjectPic_LeppaBerryTree_4), + obj_frame_tiles(gMapObjectPic_LeppaBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Leppa[] = {3, 4, 3, 3, 3}; + +const struct SpriteFrameImage gMapObjectPicTable_LiechiBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_LiechiBerryTree_0), + obj_frame_tiles(gMapObjectPic_LiechiBerryTree_1), + obj_frame_tiles(gMapObjectPic_LiechiBerryTree_2), + obj_frame_tiles(gMapObjectPic_LiechiBerryTree_3), + obj_frame_tiles(gMapObjectPic_LiechiBerryTree_4), + obj_frame_tiles(gMapObjectPic_LiechiBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Liechi[] = {3, 4, 4, 4, 4}; + +const struct SpriteFrameImage gMapObjectPicTable_HondewBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_HondewBerryTree_0), + obj_frame_tiles(gMapObjectPic_HondewBerryTree_1), + obj_frame_tiles(gMapObjectPic_HondewBerryTree_2), + obj_frame_tiles(gMapObjectPic_HondewBerryTree_3), + obj_frame_tiles(gMapObjectPic_HondewBerryTree_4), + obj_frame_tiles(gMapObjectPic_HondewBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Hondew[] = {3, 4, 5, 5, 5}; + +const struct SpriteFrameImage gMapObjectPicTable_AguavBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_AguavBerryTree_0), + obj_frame_tiles(gMapObjectPic_AguavBerryTree_1), + obj_frame_tiles(gMapObjectPic_AguavBerryTree_2), + obj_frame_tiles(gMapObjectPic_AguavBerryTree_3), + obj_frame_tiles(gMapObjectPic_AguavBerryTree_4), + obj_frame_tiles(gMapObjectPic_AguavBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Aguav[] = {3, 4, 4, 4, 4}; + +const struct SpriteFrameImage gMapObjectPicTable_WikiBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_WikiBerryTree_0), + obj_frame_tiles(gMapObjectPic_WikiBerryTree_1), + obj_frame_tiles(gMapObjectPic_WikiBerryTree_2), + obj_frame_tiles(gMapObjectPic_WikiBerryTree_3), + obj_frame_tiles(gMapObjectPic_WikiBerryTree_4), + obj_frame_tiles(gMapObjectPic_WikiBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Wiki[] = {3, 4, 3, 3, 3}; + +const struct SpriteFrameImage gMapObjectPicTable_PomegBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_PomegBerryTree_0), + obj_frame_tiles(gMapObjectPic_PomegBerryTree_1), + obj_frame_tiles(gMapObjectPic_PomegBerryTree_2), + obj_frame_tiles(gMapObjectPic_PomegBerryTree_3), + obj_frame_tiles(gMapObjectPic_PomegBerryTree_4), + obj_frame_tiles(gMapObjectPic_PomegBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Pomeg[] = {3, 4, 3, 3, 3}; + +const struct SpriteFrameImage gMapObjectPicTable_RawstBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_RawstBerryTree_0), + obj_frame_tiles(gMapObjectPic_RawstBerryTree_1), + obj_frame_tiles(gMapObjectPic_RawstBerryTree_2), + obj_frame_tiles(gMapObjectPic_RawstBerryTree_3), + obj_frame_tiles(gMapObjectPic_RawstBerryTree_4), + obj_frame_tiles(gMapObjectPic_RawstBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Rawst[] = {3, 4, 4, 4, 4}; + +const struct SpriteFrameImage gMapObjectPicTable_SpelonBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_SpelonBerryTree_0), + obj_frame_tiles(gMapObjectPic_SpelonBerryTree_1), + obj_frame_tiles(gMapObjectPic_SpelonBerryTree_2), + obj_frame_tiles(gMapObjectPic_SpelonBerryTree_3), + obj_frame_tiles(gMapObjectPic_SpelonBerryTree_4), + obj_frame_tiles(gMapObjectPic_SpelonBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Spelon[] = {3, 4, 3, 3, 3}; + +const struct SpriteFrameImage gMapObjectPicTable_ChestoBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_ChestoBerryTree_0), + obj_frame_tiles(gMapObjectPic_ChestoBerryTree_1), + obj_frame_tiles(gMapObjectPic_ChestoBerryTree_2), + obj_frame_tiles(gMapObjectPic_ChestoBerryTree_3), + obj_frame_tiles(gMapObjectPic_ChestoBerryTree_4), + obj_frame_tiles(gMapObjectPic_ChestoBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Chesto[] = {3, 4, 2, 2, 2}; + +const struct SpriteFrameImage gMapObjectPicTable_OranBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_OranBerryTree_0), + obj_frame_tiles(gMapObjectPic_OranBerryTree_1), + obj_frame_tiles(gMapObjectPic_OranBerryTree_2), + obj_frame_tiles(gMapObjectPic_OranBerryTree_3), + obj_frame_tiles(gMapObjectPic_OranBerryTree_4), + obj_frame_tiles(gMapObjectPic_OranBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Oran[] = {3, 4, 2, 2, 2}; + +const struct SpriteFrameImage gMapObjectPicTable_PersimBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_PersimBerryTree_0), + obj_frame_tiles(gMapObjectPic_PersimBerryTree_1), + obj_frame_tiles(gMapObjectPic_PersimBerryTree_2), + obj_frame_tiles(gMapObjectPic_PersimBerryTree_3), + obj_frame_tiles(gMapObjectPic_PersimBerryTree_4), + obj_frame_tiles(gMapObjectPic_PersimBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Persim[] = {3, 4, 2, 2, 2}; + +const struct SpriteFrameImage gMapObjectPicTable_SitrusBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_SitrusBerryTree_0), + obj_frame_tiles(gMapObjectPic_SitrusBerryTree_1), + obj_frame_tiles(gMapObjectPic_SitrusBerryTree_2), + obj_frame_tiles(gMapObjectPic_SitrusBerryTree_3), + obj_frame_tiles(gMapObjectPic_SitrusBerryTree_4), + obj_frame_tiles(gMapObjectPic_SitrusBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Sitrus[] = {3, 4, 4, 4, 4}; + +const struct SpriteFrameImage gMapObjectPicTable_AspearBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_AspearBerryTree_0), + obj_frame_tiles(gMapObjectPic_AspearBerryTree_1), + obj_frame_tiles(gMapObjectPic_AspearBerryTree_2), + obj_frame_tiles(gMapObjectPic_AspearBerryTree_3), + obj_frame_tiles(gMapObjectPic_AspearBerryTree_4), + obj_frame_tiles(gMapObjectPic_AspearBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Aspear[] = {3, 4, 3, 3, 3}; + +const struct SpriteFrameImage gMapObjectPicTable_PamtreBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_PamtreBerryTree_0), + obj_frame_tiles(gMapObjectPic_PamtreBerryTree_1), + obj_frame_tiles(gMapObjectPic_PamtreBerryTree_2), + obj_frame_tiles(gMapObjectPic_PamtreBerryTree_3), + obj_frame_tiles(gMapObjectPic_PamtreBerryTree_4), + obj_frame_tiles(gMapObjectPic_PamtreBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Pamtre[] = {3, 4, 2, 2, 2}; + +const struct SpriteFrameImage gMapObjectPicTable_CornnBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_CornnBerryTree_0), + obj_frame_tiles(gMapObjectPic_CornnBerryTree_1), + obj_frame_tiles(gMapObjectPic_CornnBerryTree_2), + obj_frame_tiles(gMapObjectPic_CornnBerryTree_3), + obj_frame_tiles(gMapObjectPic_CornnBerryTree_4), + obj_frame_tiles(gMapObjectPic_CornnBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Cornn[] = {3, 4, 2, 2, 2}; + +const struct SpriteFrameImage gMapObjectPicTable_LansatBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_LansatBerryTree_0), + obj_frame_tiles(gMapObjectPic_LansatBerryTree_1), + obj_frame_tiles(gMapObjectPic_LansatBerryTree_2), + obj_frame_tiles(gMapObjectPic_LansatBerryTree_3), + obj_frame_tiles(gMapObjectPic_LansatBerryTree_4), + obj_frame_tiles(gMapObjectPic_LansatBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Lansat[] = {3, 4, 2, 2, 2}; + +const struct SpriteFrameImage gMapObjectPicTable_DurinBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_DurinBerryTree_0), + obj_frame_tiles(gMapObjectPic_DurinBerryTree_1), + obj_frame_tiles(gMapObjectPic_DurinBerryTree_2), + obj_frame_tiles(gMapObjectPic_DurinBerryTree_3), + obj_frame_tiles(gMapObjectPic_DurinBerryTree_4), + obj_frame_tiles(gMapObjectPic_DurinBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Durin[] = {3, 4, 4, 4, 4}; + +const struct SpriteFrameImage gMapObjectPicTable_TamatoBerryTree[] = { + obj_frame_tiles(gMapObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gMapObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gMapObjectPic_TamatoBerryTree_0), + obj_frame_tiles(gMapObjectPic_TamatoBerryTree_1), + obj_frame_tiles(gMapObjectPic_TamatoBerryTree_2), + obj_frame_tiles(gMapObjectPic_TamatoBerryTree_3), + obj_frame_tiles(gMapObjectPic_TamatoBerryTree_4), + obj_frame_tiles(gMapObjectPic_TamatoBerryTree_5) +}; + +const u8 gBerryTreePaletteSlotTable_Tamato[] = {3, 4, 2, 2, 2}; + +const u8 gDeadBerryTreeGraphicsIdTable[] = {MAP_OBJ_GFX_BERRY_TREE_EARLY_STAGES, MAP_OBJ_GFX_BERRY_TREE_EARLY_STAGES, MAP_OBJ_GFX_BERRY_TREE_EARLY_STAGES, MAP_OBJ_GFX_BERRY_TREE_EARLY_STAGES, MAP_OBJ_GFX_BERRY_TREE_EARLY_STAGES}; + +const u8 gBerryTreeGraphicsIdTable[] = {MAP_OBJ_GFX_BERRY_TREE_EARLY_STAGES, MAP_OBJ_GFX_BERRY_TREE_EARLY_STAGES, MAP_OBJ_GFX_BERRY_TREE_LATE_STAGES, MAP_OBJ_GFX_BERRY_TREE_LATE_STAGES, MAP_OBJ_GFX_BERRY_TREE_LATE_STAGES}; + +const struct SpriteFrameImage *const gBerryTreePicTablePointers[] = { + gMapObjectPicTable_CheriBerryTree, + gMapObjectPicTable_ChestoBerryTree, + gMapObjectPicTable_PechaBerryTree, + gMapObjectPicTable_RawstBerryTree, + gMapObjectPicTable_AspearBerryTree, + gMapObjectPicTable_LeppaBerryTree, + gMapObjectPicTable_OranBerryTree, + gMapObjectPicTable_PersimBerryTree, + gMapObjectPicTable_LumBerryTree, + gMapObjectPicTable_SitrusBerryTree, + gMapObjectPicTable_FigyBerryTree, + gMapObjectPicTable_WikiBerryTree, + gMapObjectPicTable_MagoBerryTree, + gMapObjectPicTable_AguavBerryTree, + gMapObjectPicTable_IapapaBerryTree, + gMapObjectPicTable_RazzBerryTree, + gMapObjectPicTable_RazzBerryTree, + gMapObjectPicTable_MagoBerryTree, + gMapObjectPicTable_WepearBerryTree, + gMapObjectPicTable_IapapaBerryTree, + gMapObjectPicTable_PomegBerryTree, + gMapObjectPicTable_KelpsyBerryTree, + gMapObjectPicTable_WepearBerryTree, + gMapObjectPicTable_HondewBerryTree, + gMapObjectPicTable_GrepaBerryTree, + gMapObjectPicTable_TamatoBerryTree, + gMapObjectPicTable_CornnBerryTree, + gMapObjectPicTable_PomegBerryTree, + gMapObjectPicTable_RabutaBerryTree, + gMapObjectPicTable_NomelBerryTree, + gMapObjectPicTable_SpelonBerryTree, + gMapObjectPicTable_PamtreBerryTree, + gMapObjectPicTable_RabutaBerryTree, + gMapObjectPicTable_DurinBerryTree, + gMapObjectPicTable_HondewBerryTree, + gMapObjectPicTable_LiechiBerryTree, + gMapObjectPicTable_HondewBerryTree, + gMapObjectPicTable_AguavBerryTree, + gMapObjectPicTable_PomegBerryTree, + gMapObjectPicTable_GrepaBerryTree, + gMapObjectPicTable_LansatBerryTree, + gMapObjectPicTable_CornnBerryTree, + gMapObjectPicTable_DurinBerryTree +}; + +const u8 *const gBerryTreePaletteSlotTablePointers[] = { + gBerryTreePaletteSlotTable_Cheri, + gBerryTreePaletteSlotTable_Chesto, + gBerryTreePaletteSlotTable_Pecha, + gBerryTreePaletteSlotTable_Rawst, + gBerryTreePaletteSlotTable_Aspear, + gBerryTreePaletteSlotTable_Leppa, + gBerryTreePaletteSlotTable_Oran, + gBerryTreePaletteSlotTable_Persim, + gBerryTreePaletteSlotTable_Lum, + gBerryTreePaletteSlotTable_Sitrus, + gBerryTreePaletteSlotTable_Figy, + gBerryTreePaletteSlotTable_Wiki, + gBerryTreePaletteSlotTable_Mago, + gBerryTreePaletteSlotTable_Aguav, + gBerryTreePaletteSlotTable_Iapapa, + gBerryTreePaletteSlotTable_Razz, + gBerryTreePaletteSlotTable_Razz, + gBerryTreePaletteSlotTable_Mago, + gBerryTreePaletteSlotTable_Wepear, + gBerryTreePaletteSlotTable_Iapapa, + gBerryTreePaletteSlotTable_Pomeg, + gBerryTreePaletteSlotTable_Kelpsy, + gBerryTreePaletteSlotTable_Wepear, + gBerryTreePaletteSlotTable_Hondew, + gBerryTreePaletteSlotTable_Grepa, + gBerryTreePaletteSlotTable_Tamato, + gBerryTreePaletteSlotTable_Cornn, + gBerryTreePaletteSlotTable_Pomeg, + gBerryTreePaletteSlotTable_Rabuta, + gBerryTreePaletteSlotTable_Nomel, + gBerryTreePaletteSlotTable_Spelon, + gBerryTreePaletteSlotTable_Pamtre, + gBerryTreePaletteSlotTable_Rabuta, + gBerryTreePaletteSlotTable_Durin, + gBerryTreePaletteSlotTable_Hondew, + gBerryTreePaletteSlotTable_Liechi, + gBerryTreePaletteSlotTable_Hondew, + gBerryTreePaletteSlotTable_Aguav, + gBerryTreePaletteSlotTable_Pomeg, + gBerryTreePaletteSlotTable_Grepa, + gBerryTreePaletteSlotTable_Lansat, + gBerryTreePaletteSlotTable_Cornn, + gBerryTreePaletteSlotTable_Durin +}; + +const u8 *const gBerryTreeGraphicsIdTablePointers[] = { + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable, + gBerryTreeGraphicsIdTable +}; + +#endif //POKERUBY_BERRY_TREE_GRAPHICS_TABLES_H diff --git a/src/data/field_map_obj/callback_subroutine_pointers.h b/src/data/field_map_obj/callback_subroutine_pointers.h new file mode 100644 index 000000000..a324066b7 --- /dev/null +++ b/src/data/field_map_obj/callback_subroutine_pointers.h @@ -0,0 +1,442 @@ +// + +// + +#ifndef POKERUBY_CALLBACK_SUBROUTINE_POINTERS_H +#define POKERUBY_CALLBACK_SUBROUTINE_POINTERS_H + + +u8 (*const gUnknown_08375224[])(struct MapObject *, struct Sprite *) = { + sub_805C8F0, + sub_805C904, + sub_805C930, + sub_805C96C, + sub_805C98C, + sub_805C9D8, + sub_805CA08 +}; + +const u8 gUnknown_08375240[] = {DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST}; + +u8 (*const gUnknown_08375244[])(s16, s16, s16, s16) = { + sub_805CAAC, + sub_805CADC, + sub_805CAEC, + sub_805CB00, + sub_805CB5C, + sub_805CBB8, + sub_805CC14, + sub_805CC70, + sub_805CCAC, + sub_805CCE8, + sub_805CD24 +}; + +u8 (*const gUnknown_08375270[])(struct MapObject *, struct Sprite *) = { + sub_805CE2C, + sub_805CE40, + sub_805CE6C, + sub_805CEB0, + sub_805CEE0 +}; + +u8 (*const gUnknown_08375284[])(struct MapObject *, struct Sprite *) = { + sub_805CF6C, + sub_805CF80, + sub_805CFAC, + sub_805CFE8, + sub_805D008, + sub_805D054, + sub_805D084 +}; + +const u8 gUnknown_083752A0[] = {DIR_SOUTH, DIR_NORTH}; + +u8 (*const gUnknown_083752A4[])(struct MapObject *, struct Sprite *) = { + sub_805D0F0, + sub_805D104, + sub_805D130, + sub_805D16C, + sub_805D18C, + sub_805D1D8, + sub_805D208 +}; + +const u8 gUnknown_083752C0[] = {DIR_WEST, DIR_EAST}; + +u8 (*const gUnknown_083752C4[])(struct MapObject *, struct Sprite *) = { + sub_805D274, + sub_805D2A0, + sub_805D2C0 +}; + +u8 (*const gUnknown_083752D0[])(struct MapObject *, struct Sprite *) = { + do_berry_tree_growth_sparkle_1, + sub_805D3EC, + do_berry_tree_growth_sparkle_2, + sub_805D458, + sub_805D4A8 +}; + +u8 (*const gUnknown_083752E4[])(struct MapObject *, struct Sprite *) = { + sub_805D538, + sub_805D54C, + sub_805D578, + sub_805D5BC, + sub_805D5EC +}; + +u8 (*const gUnknown_083752F8[])(struct MapObject *, struct Sprite *) = { + sub_805D678, + sub_805D68C, + sub_805D6B8, + sub_805D6FC, + sub_805D72C +}; + +u8 (*const gUnknown_0837530C[])(struct MapObject *, struct Sprite *) = { + sub_805D7B8, + sub_805D7CC, + sub_805D7F8, + sub_805D83C, + sub_805D86C +}; + +const u8 gUnknown_08375320[] = {DIR_NORTH, DIR_WEST}; + +u8 (*const gUnknown_08375324[])(struct MapObject *, struct Sprite *) = { + sub_805D8F8, + sub_805D90C, + sub_805D938, + sub_805D97C, + sub_805D9AC +}; + +const u8 gUnknown_08375338[] = {DIR_NORTH, DIR_EAST}; + +u8 (*const gUnknown_0837533C[])(struct MapObject *, struct Sprite *) = { + sub_805DA38, + sub_805DA4C, + sub_805DA78, + sub_805DABC, + sub_805DAEC +}; + +const u8 gUnknown_08375350[] = {DIR_SOUTH, DIR_WEST}; + +u8 (*const gUnknown_08375354[])(struct MapObject *, struct Sprite *) = { + sub_805DB78, + sub_805DB8C, + sub_805DBB8, + sub_805DBFC, + sub_805DC2C +}; + +const u8 gUnknown_08375368[] = {DIR_SOUTH, DIR_EAST}; + +u8 (*const gUnknown_0837536C[])(struct MapObject *, struct Sprite *) = { + sub_805DCB8, + sub_805DCCC, + sub_805DCF8, + sub_805DD3C, + sub_805DD6C +}; + +const u8 gUnknown_08375380[] = {DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_SOUTH}; + +u8 (*const gUnknown_08375384[])(struct MapObject *, struct Sprite *) = { + sub_805DDF8, + sub_805DE0C, + sub_805DE38, + sub_805DE7C, + sub_805DEAC +}; + +const u8 gUnknown_08375398[] = {DIR_SOUTH, DIR_NORTH, DIR_EAST, DIR_SOUTH}; + +u8 (*const gUnknown_0837539C[])(struct MapObject *, struct Sprite *) = { + sub_805DF38, + sub_805DF4C, + sub_805DF78, + sub_805DFBC, + sub_805DFEC +}; + +const u8 gUnknown_083753B0[] = {DIR_NORTH, DIR_WEST, DIR_EAST, DIR_NORTH}; + +u8 (*const gUnknown_083753B4[])(struct MapObject *, struct Sprite *) = { + sub_805E078, + sub_805E08C, + sub_805E0B8, + sub_805E0FC, + sub_805E12C +}; + +const u8 gUnknown_083753C8[] = {DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH}; + +u8 (*const gUnknown_083753CC[])(struct MapObject *, struct Sprite *) = { + sub_805E1B8, + sub_805E1E4, + sub_805E208, + sub_805E234 +}; + +const u8 gUnknown_083753DC[] = {DIR_SOUTH, DIR_EAST, DIR_WEST, DIR_SOUTH, DIR_NORTH}; + +u8 (*const gUnknown_083753E4[])(struct MapObject *, struct Sprite *) = { + sub_805E2BC, + sub_805E2E8, + sub_805E30C, + sub_805E338 +}; + +const u8 gUnknown_083753F4[] = {DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH}; + +u8 (*const gUnknown_083753FC[])(struct MapObject *, struct Sprite *) = { + sub_805E3C0, + sub_805E3D4, + sub_805E40C, + sub_805E4C4 +}; + +u8 (*const gUnknown_0837540C[])(struct MapObject *, struct Sprite *) = { + sub_805E4EC, + sub_805E620, + sub_805E5B4 +}; + +const u8 gUnknown_08375418[] = {DIR_NORTH, DIR_EAST, DIR_WEST, DIR_SOUTH}; + +u8 (*const gUnknown_0837541C[])(struct MapObject *, struct Sprite *) = { + sub_805E4EC, + sub_805E6AC, + sub_805E5B4 +}; + +const u8 gUnknown_08375428[] = {DIR_EAST, DIR_WEST, DIR_SOUTH, DIR_NORTH}; +u8 (*const gUnknown_0837542C[])(struct MapObject *, struct Sprite *) = { + sub_805E4EC, + sub_805E738, + sub_805E5B4 +}; + +const u8 gUnknown_08375438[] = {DIR_SOUTH, DIR_NORTH, DIR_EAST, DIR_WEST}; + +u8 (*const gUnknown_0837543C[])(struct MapObject *, struct Sprite *) = { + sub_805E4EC, + sub_805E7C4, + sub_805E5B4 +}; + +const u8 gUnknown_08375448[] = {DIR_WEST, DIR_SOUTH, DIR_NORTH, DIR_EAST}; + +u8 (*const gUnknown_0837544C[])(struct MapObject *, struct Sprite *) = { + sub_805E4EC, + sub_805E850, + sub_805E5B4 +}; + +const u8 gUnknown_08375458[] = {DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH}; + +u8 (*const gUnknown_0837545C[])(struct MapObject *, struct Sprite *) = { + sub_805E4EC, + sub_805E8DC, + sub_805E5B4 +}; + +const u8 gUnknown_08375468[] = {DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_NORTH}; + +u8 (*const gUnknown_0837546C[])(struct MapObject *, struct Sprite *) = { + sub_805E4EC, + sub_805E968, + sub_805E5B4 +}; + +u8 (*const gUnknown_08375478[])(struct MapObject *, struct Sprite *) = { + sub_805E4EC, + sub_805E9F4, + sub_805E5B4 +}; + +const u8 gUnknown_08375484[] = {DIR_EAST, DIR_SOUTH, DIR_NORTH, DIR_WEST}; + +u8 (*const gUnknown_08375488[])(struct MapObject *, struct Sprite *) = { + sub_805E4EC, + sub_805EA80, + sub_805E5B4 +}; + +const u8 gUnknown_08375494[] = {DIR_WEST, DIR_NORTH, DIR_SOUTH, DIR_EAST}; + +u8 (*const gUnknown_08375498[])(struct MapObject *, struct Sprite *) = { + sub_805E4EC, + sub_805EB0C, + sub_805E5B4 +}; + +const u8 gUnknown_083754A4[] = {DIR_NORTH, DIR_SOUTH, DIR_EAST, DIR_WEST}; + +u8 (*const gUnknown_083754A8[])(struct MapObject *, struct Sprite *) = { + sub_805E4EC, + sub_805EB98, + sub_805E5B4 +}; + +const u8 gUnknown_083754B4[] = {DIR_EAST, DIR_WEST, DIR_NORTH, DIR_SOUTH}; + +u8 (*const gUnknown_083754B8[])(struct MapObject *, struct Sprite *) = { + sub_805E4EC, + sub_805EC24, + sub_805E5B4 +}; + +const u8 gUnknown_083754C4[] = {DIR_SOUTH, DIR_EAST, DIR_WEST, DIR_NORTH}; + +u8 (*const gUnknown_083754C8[])(struct MapObject *, struct Sprite *) = { + sub_805E4EC, + sub_805ECB0, + sub_805E5B4 +}; + +const u8 gUnknown_083754D4[] = {DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST}; + +u8 (*const gUnknown_083754D8[])(struct MapObject *, struct Sprite *) = { + sub_805E4EC, + sub_805ED3C, + sub_805E5B4 +}; + +const u8 gUnknown_083754E4[] = {DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST}; + +u8 (*const gUnknown_083754E8[])(struct MapObject *, struct Sprite *) = { + sub_805E4EC, + sub_805EDC8, + sub_805E5B4 +}; + +const u8 gUnknown_083754F4[] = {DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH}; + +u8 (*const gUnknown_083754F8[])(struct MapObject *, struct Sprite *) = { + sub_805E4EC, + sub_805EE54, + sub_805E5B4 +}; + +const u8 gUnknown_08375504[] = {DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH}; + +u8 (*const gUnknown_08375508[])(struct MapObject *, struct Sprite *) = { + sub_805E4EC, + sub_805EEE0, + sub_805E5B4 +}; + +const u8 gUnknown_08375514[] = {DIR_NORTH, DIR_WEST, DIR_SOUTH, DIR_EAST}; + +u8 (*const gUnknown_08375518[])(struct MapObject *, struct Sprite *) = { + sub_805E4EC, + sub_805EF6C, + sub_805E5B4 +}; + +const u8 gUnknown_08375524[] = {DIR_SOUTH, DIR_EAST, DIR_NORTH, DIR_WEST}; + +u8 (*const gUnknown_08375528[])(struct MapObject *, struct Sprite *) = { + sub_805E4EC, + sub_805EFF8, + sub_805E5B4 +}; + +const u8 gUnknown_08375534[] = {DIR_WEST, DIR_SOUTH, DIR_EAST, DIR_NORTH}; + +u8 (*const gUnknown_08375538[])(struct MapObject *, struct Sprite *) = { + sub_805E4EC, + sub_805F084, + sub_805E5B4 +}; + +const u8 gUnknown_08375544[] = {DIR_EAST, DIR_NORTH, DIR_WEST, DIR_SOUTH}; + +u8 (*const gUnknown_08375548[])(struct MapObject *, struct Sprite *) = { + sub_805E4EC, + sub_805F110, + sub_805E5B4 +}; + +const u8 gUnknown_08375554[] = {DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_WEST}; + +u8 (*const gUnknown_08375558[])(struct MapObject *, struct Sprite *) = { + sub_805E4EC, + sub_805F19C, + sub_805E5B4 +}; + +const u8 gUnknown_08375564[] = {DIR_SOUTH, DIR_WEST, DIR_NORTH, DIR_EAST}; + +u8 (*const gUnknown_08375568[])(struct MapObject *, struct Sprite *) = { + sub_805E4EC, + sub_805F228, + sub_805E5B4 +}; + +const u8 gUnknown_08375574[] = {DIR_WEST, DIR_NORTH, DIR_EAST, DIR_SOUTH}; + +u8 (*const gUnknown_08375578[])(struct MapObject *, struct Sprite *) = { + sub_805E4EC, + sub_805F2B4, + sub_805E5B4 +}; + +const u8 gUnknown_08375584[] = {DIR_EAST, DIR_SOUTH, DIR_WEST, DIR_NORTH}; + +u8 (*const gUnknown_08375588[])(struct MapObject *, struct Sprite *) = { + mss_npc_reset_oampriv3_1_unk2_unk3, + sub_805F364, + sub_805F3C4 +}; + +u8 (*const gUnknown_08375594[])(struct MapObject *, struct Sprite *, u8, bool8(u8)) = { + sub_805F3EC, + sub_805F3F0, + sub_805F438, + sub_805F4F0, + sub_805F5A8, + sub_805F660, + cph_IM_DIFFERENT, + sub_805F760, + oac_hopping, + sub_805F3EC, + sub_805F3EC +}; + +u8 (*const gUnknown_083755C0[])(struct MapObject *, struct Sprite *) = { + mss_npc_reset_oampriv3_1_unk2_unk3, + mss_08062EA4, + sub_805F3C4 +}; + +u8 (*const gUnknown_083755CC[])(struct MapObject *, struct Sprite *) = { + sub_805FAF8 +}; + +u8 (*const gUnknown_083755D0[])(struct MapObject *, struct Sprite *) = { + sub_805FB64, + sub_805FB04 +}; + +u8 (*const gUnknown_083755D8[])(struct MapObject *, struct Sprite *) = { + sub_805FBD4, + sub_805FB04 +}; + +u8 (*const gUnknown_083755E0[])(struct MapObject *, struct Sprite *) = { + sub_805FC44, + sub_805FB04 +}; + +u8 (*const gUnknown_083755E8[])(struct MapObject *, struct Sprite *) = { + sub_805FCB4, + sub_805FCE8, + sub_805FD08 +}; + +#endif //POKERUBY_CALLBACK_SUBROUTINE_POINTERS_H diff --git a/src/data/field_map_obj/field_effect_object_template_pointers.h b/src/data/field_map_obj/field_effect_object_template_pointers.h new file mode 100644 index 000000000..320af1ff8 --- /dev/null +++ b/src/data/field_map_obj/field_effect_object_template_pointers.h @@ -0,0 +1,84 @@ +// + +// + +#ifndef POKERUBY_FIELD_EFFECT_OBJECT_TEMPLATE_POINTERS_H +#define POKERUBY_FIELD_EFFECT_OBJECT_TEMPLATE_POINTERS_H + +const struct SpriteTemplate gFieldEffectSpriteTemplate_ShadowSmall; +const struct SpriteTemplate gFieldEffectSpriteTemplate_ShadowMedium; +const struct SpriteTemplate gFieldEffectSpriteTemplate_ShadowLarge; +const struct SpriteTemplate gFieldEffectSpriteTemplate_ShadowExtraLarge; +const struct SpriteTemplate gFieldEffectSpriteTemplate_TallGrass; +const struct SpriteTemplate gFieldEffectSpriteTemplate_Ripple; +const struct SpriteTemplate gFieldEffectSpriteTemplate_Ash; +const struct SpriteTemplate gFieldEffectSpriteTemplate_SurfBlob; +const struct SpriteTemplate gFieldEffectSpriteTemplate_Arrow; +const struct SpriteTemplate gFieldEffectSpriteTemplate_Dust; +const struct SpriteTemplate gFieldEffectSpriteTemplate_JumpTallGrass; +const struct SpriteTemplate gFieldEffectSpriteTemplate_SandFootprints; +const struct SpriteTemplate gFieldEffectSpriteTemplate_JumpBigSplash; +const struct SpriteTemplate gFieldEffectSpriteTemplate_Splash; +const struct SpriteTemplate gFieldEffectSpriteTemplate_JumpSmallSplash; +const struct SpriteTemplate gFieldEffectSpriteTemplate_LongGrass; +const struct SpriteTemplate gFieldEffectSpriteTemplate_JumpLongGrass; +const struct SpriteTemplate gFieldEffectSpriteTemplate_Unknown17; +const struct SpriteTemplate gFieldEffectSpriteTemplate_Unknown18; +const struct SpriteTemplate gFieldEffectSpriteTemplate_Unknown19; +const struct SpriteTemplate gFieldEffectSpriteTemplate_Unknown20; +const struct SpriteTemplate gFieldEffectSpriteTemplate_Unknown21; +const struct SpriteTemplate gFieldEffectSpriteTemplate_BerryTreeGrowthSparkle; +const struct SpriteTemplate gFieldEffectSpriteTemplate_DeepSandFootprints; +const struct SpriteTemplate gFieldEffectSpriteTemplate_TreeDisguise; +const struct SpriteTemplate gFieldEffectSpriteTemplate_MountainDisguise; +const struct SpriteTemplate gFieldEffectSpriteTemplate_Bird; +const struct SpriteTemplate gFieldEffectSpriteTemplate_BikeTireTracks; +const struct SpriteTemplate gFieldEffectSpriteTemplate_SandDisguise; +const struct SpriteTemplate gFieldEffectSpriteTemplate_SandPile; +const struct SpriteTemplate gFieldEffectSpriteTemplate_ShortGrass; +const struct SpriteTemplate gFieldEffectSpriteTemplate_HotSpringsWater; +const struct SpriteTemplate gFieldEffectSpriteTemplate_PopOutOfAsh; +const struct SpriteTemplate gFieldEffectSpriteTemplate_LavaridgeGymWarp; +const struct SpriteTemplate gFieldEffectSpriteTemplate_Bubbles; +const struct SpriteTemplate gFieldEffectSpriteTemplate_Sparkle; + +const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[] = { + &gFieldEffectSpriteTemplate_ShadowSmall, + &gFieldEffectSpriteTemplate_ShadowMedium, + &gFieldEffectSpriteTemplate_ShadowLarge, + &gFieldEffectSpriteTemplate_ShadowExtraLarge, + &gFieldEffectSpriteTemplate_TallGrass, + &gFieldEffectSpriteTemplate_Ripple, + &gFieldEffectSpriteTemplate_Ash, + &gFieldEffectSpriteTemplate_SurfBlob, + &gFieldEffectSpriteTemplate_Arrow, + &gFieldEffectSpriteTemplate_Dust, + &gFieldEffectSpriteTemplate_JumpTallGrass, + &gFieldEffectSpriteTemplate_SandFootprints, + &gFieldEffectSpriteTemplate_JumpBigSplash, + &gFieldEffectSpriteTemplate_Splash, + &gFieldEffectSpriteTemplate_JumpSmallSplash, + &gFieldEffectSpriteTemplate_LongGrass, + &gFieldEffectSpriteTemplate_JumpLongGrass, + &gFieldEffectSpriteTemplate_Unknown17, + &gFieldEffectSpriteTemplate_Unknown18, + &gFieldEffectSpriteTemplate_Unknown19, + &gFieldEffectSpriteTemplate_Unknown20, + &gFieldEffectSpriteTemplate_Unknown21, + &gFieldEffectSpriteTemplate_BerryTreeGrowthSparkle, + &gFieldEffectSpriteTemplate_DeepSandFootprints, + &gFieldEffectSpriteTemplate_TreeDisguise, + &gFieldEffectSpriteTemplate_MountainDisguise, + &gFieldEffectSpriteTemplate_Bird, + &gFieldEffectSpriteTemplate_BikeTireTracks, + &gFieldEffectSpriteTemplate_SandDisguise, + &gFieldEffectSpriteTemplate_SandPile, + &gFieldEffectSpriteTemplate_ShortGrass, + &gFieldEffectSpriteTemplate_HotSpringsWater, + &gFieldEffectSpriteTemplate_PopOutOfAsh, + &gFieldEffectSpriteTemplate_LavaridgeGymWarp, + &gFieldEffectSpriteTemplate_Bubbles, + &gFieldEffectSpriteTemplate_Sparkle +}; + +#endif //POKERUBY_FIELD_EFFECT_OBJECT_TEMPLATE_POINTERS_H diff --git a/src/data/field_map_obj/field_effect_objects.h b/src/data/field_map_obj/field_effect_objects.h new file mode 100644 index 000000000..9d3ae343d --- /dev/null +++ b/src/data/field_map_obj/field_effect_objects.h @@ -0,0 +1,897 @@ +// + +// + +#ifndef POKERUBY_FIELD_EFFECT_OBJECTS_H +#define POKERUBY_FIELD_EFFECT_OBJECTS_H + +const struct SpritePalette gFieldEffectObjectPaletteInfo0 = {gFieldEffectObjectPalette0, 0x1004}; + +const struct SpritePalette gFieldEffectObjectPaletteInfo1 = {gFieldEffectObjectPalette1, 0x1005}; + +const union AnimCmd gFieldEffectAnim_8374534[] = { + ANIMCMD_FRAME(0, 1), + ANIMCMD_END +}; + +const union AnimCmd *const gFieldEffectAnimTable_Shadow[] = { + gFieldEffectAnim_8374534 +}; + +const struct SpriteFrameImage gFieldEffectPicTable_ShadowSmall[] = { + obj_frame_tiles(gFieldEffectPic_ShadowSmall) +}; + +const struct SpriteFrameImage gFieldEffectPicTable_ShadowMedium[] = { + obj_frame_tiles(gFieldEffectPic_ShadowMedium) +}; + +const struct SpriteFrameImage gFieldEffectPicTable_ShadowLarge[] = { + obj_frame_tiles(gFieldEffectPic_ShadowLarge) +}; + +const struct SpriteFrameImage gFieldEffectPicTable_ShadowExtraLarge[] = { + obj_frame_tiles(gFieldEffectPic_ShadowExtraLarge) +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_ShadowSmall = {0xFFFF, 0xFFFF, &gFieldOamData_8x8, gFieldEffectAnimTable_Shadow, gFieldEffectPicTable_ShadowSmall, gDummySpriteAffineAnimTable, oamc_shadow}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_ShadowMedium = {0xFFFF, 0xFFFF, &gFieldOamData_16x8, gFieldEffectAnimTable_Shadow, gFieldEffectPicTable_ShadowMedium, gDummySpriteAffineAnimTable, oamc_shadow}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_ShadowLarge = {0xFFFF, 0xFFFF, &gFieldOamData_32x8, gFieldEffectAnimTable_Shadow, gFieldEffectPicTable_ShadowLarge, gDummySpriteAffineAnimTable, oamc_shadow}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_ShadowExtraLarge = {0xFFFF, 0xFFFF, &gFieldOamData_64x32, gFieldEffectAnimTable_Shadow, gFieldEffectPicTable_ShadowExtraLarge, gDummySpriteAffineAnimTable, oamc_shadow}; + +const struct SpriteFrameImage gFieldEffectPicTable_TallGrass[] = { + obj_frame_tiles(gFieldEffectPic_TallGrass_0), + obj_frame_tiles(gFieldEffectPic_TallGrass_1), + obj_frame_tiles(gFieldEffectPic_TallGrass_2), + obj_frame_tiles(gFieldEffectPic_TallGrass_3), + obj_frame_tiles(gFieldEffectPic_TallGrass_4) +}; + +const union AnimCmd gFieldEffectAnim_83745E8[] = { + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(2, 10), + ANIMCMD_FRAME(3, 10), + ANIMCMD_FRAME(4, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_END +}; + +const union AnimCmd *const gFieldEffectAnimTable_TallGrass[] = { + gFieldEffectAnim_83745E8 +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_TallGrass = {0xFFFF, 0x1005, &gFieldOamData_16x16, gFieldEffectAnimTable_TallGrass, gFieldEffectPicTable_TallGrass, gDummySpriteAffineAnimTable, unc_grass_normal}; + +const struct SpriteFrameImage gFieldEffectPicTable_Ripple[] = { + obj_frame_tiles(gFieldEffectPic_Ripple_0), + obj_frame_tiles(gFieldEffectPic_Ripple_1), + obj_frame_tiles(gFieldEffectPic_Ripple_2), + obj_frame_tiles(gFieldEffectPic_Ripple_3), + obj_frame_tiles(gFieldEffectPic_Ripple_4) +}; + +const union AnimCmd gFieldEffectAnim_8374644[] = { + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 9), + ANIMCMD_FRAME(2, 9), + ANIMCMD_FRAME(3, 9), + ANIMCMD_FRAME(0, 9), + ANIMCMD_FRAME(1, 9), + ANIMCMD_FRAME(2, 11), + ANIMCMD_FRAME(4, 11), + ANIMCMD_END +}; + +const union AnimCmd *const gFieldEffectAnimTable_Ripple[] = { + gFieldEffectAnim_8374644 +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_Ripple = {0xFFFF, 0x1005, &gFieldOamData_16x16, gFieldEffectAnimTable_Ripple, gFieldEffectPicTable_Ripple, gDummySpriteAffineAnimTable, sub_8128800}; + +const struct SpriteFrameImage gFieldEffectPicTable_Ash[] = { + obj_frame_tiles(gFieldEffectPic_Ash_0), + obj_frame_tiles(gFieldEffectPic_Ash_1), + obj_frame_tiles(gFieldEffectPic_Ash_2), + obj_frame_tiles(gFieldEffectPic_Ash_3), + obj_frame_tiles(gFieldEffectPic_Ash_4) +}; + +const union AnimCmd gFieldEffectAnim_83746AC[] = { + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(3, 12), + ANIMCMD_FRAME(4, 12), + ANIMCMD_END +}; + +const union AnimCmd *const gFieldEffectAnimTable_Ash[] = { + gFieldEffectAnim_83746AC +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_Ash = {0xFFFF, 0x1005, &gFieldOamData_16x16, gFieldEffectAnimTable_Ash, gFieldEffectPicTable_Ash, gDummySpriteAffineAnimTable, sub_8127D84}; + +const struct SpriteFrameImage gFieldEffectPicTable_SurfBlob[] = { + obj_frame_tiles(gFieldEffectPic_SurfBlob_0), + obj_frame_tiles(gFieldEffectPic_SurfBlob_1), + obj_frame_tiles(gFieldEffectPic_SurfBlob_2) +}; + +const union AnimCmd gFieldEffectAnim_83746F8[] = { + ANIMCMD_FRAME(0, 1), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gFieldEffectAnim_8374700[] = { + ANIMCMD_FRAME(1, 1), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gFieldEffectAnim_8374708[] = { + ANIMCMD_FRAME(2, 1), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gFieldEffectAnim_8374710[] = { + ANIMCMD_FRAME(2, 1, .hFlip = TRUE), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd *const gFieldEffectAnimTable_SurfBlob[] = { + gFieldEffectAnim_83746F8, + gFieldEffectAnim_8374700, + gFieldEffectAnim_8374708, + gFieldEffectAnim_8374710 +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_SurfBlob = {0xFFFF, 0xFFFF, &gFieldOamData_32x32, gFieldEffectAnimTable_SurfBlob, gFieldEffectPicTable_SurfBlob, gDummySpriteAffineAnimTable, sub_8127F7C}; + +const struct SpriteFrameImage gFieldEffectPicTable_Arrow[] = { + obj_frame_tiles(gFieldEffectPic_Arrow_0), + obj_frame_tiles(gFieldEffectPic_Arrow_1), + obj_frame_tiles(gFieldEffectPic_Arrow_2), + obj_frame_tiles(gFieldEffectPic_Arrow_3), + obj_frame_tiles(gFieldEffectPic_Arrow_4), + obj_frame_tiles(gFieldEffectPic_Arrow_5), + obj_frame_tiles(gFieldEffectPic_Arrow_6), + obj_frame_tiles(gFieldEffectPic_Arrow_7) +}; + +const union AnimCmd gFieldEffectAnim_8374780[] = { + ANIMCMD_FRAME(3, 32), + ANIMCMD_FRAME(7, 32), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gFieldEffectAnim_837478C[] = { + ANIMCMD_FRAME(0, 32), + ANIMCMD_FRAME(4, 32), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gFieldEffectAnim_8374798[] = { + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(5, 32), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gFieldEffectAnim_83747A4[] = { + ANIMCMD_FRAME(2, 32), + ANIMCMD_FRAME(6, 32), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd *const gFieldEffectAnimTable_Arrow[] = { + gFieldEffectAnim_8374780, + gFieldEffectAnim_837478C, + gFieldEffectAnim_8374798, + gFieldEffectAnim_83747A4 +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_Arrow = {0xFFFF, 0xFFFF, &gFieldOamData_16x16, gFieldEffectAnimTable_Arrow, gFieldEffectPicTable_Arrow, gDummySpriteAffineAnimTable, SpriteCallbackDummy}; + +const struct SpriteFrameImage gFieldEffectPicTable_Dust[] = { + obj_frame_tiles(gFieldEffectPic_Dust_0), + obj_frame_tiles(gFieldEffectPic_Dust_1), + obj_frame_tiles(gFieldEffectPic_Dust_2) +}; + +const union AnimCmd gFieldEffectAnim_83747F0[] = { + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_END +}; + +const union AnimCmd *const gFieldEffectAnimTable_Dust[] = { + gFieldEffectAnim_83747F0 +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_Dust = {0xFFFF, 0x1004, &gFieldOamData_16x8, gFieldEffectAnimTable_Dust, gFieldEffectPicTable_Dust, gDummySpriteAffineAnimTable, sub_81287C4}; + +const struct SpriteFrameImage gFieldEffectPicTable_JumpTallGrass[] = { + obj_frame_tiles(gFieldEffectPic_JumpTallGrass_0), + obj_frame_tiles(gFieldEffectPic_JumpTallGrass_1), + obj_frame_tiles(gFieldEffectPic_JumpTallGrass_2), + obj_frame_tiles(gFieldEffectPic_JumpTallGrass_3) +}; + +const union AnimCmd gFieldEffectAnim_837483C[] = { + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(3, 8), + ANIMCMD_END +}; + +const union AnimCmd *const gFieldEffectAnimTable_JumpTallGrass[] = { + gFieldEffectAnim_837483C +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_JumpTallGrass = {0xFFFF, 0x1005, &gFieldOamData_16x8, gFieldEffectAnimTable_JumpTallGrass, gFieldEffectPicTable_JumpTallGrass, gDummySpriteAffineAnimTable, sub_81287C4}; + +const struct SpriteFrameImage gFieldEffectPicTable_SandFootprints[] = { + obj_frame_tiles(gFieldEffectPic_SandFootprints_0), + obj_frame_tiles(gFieldEffectPic_SandFootprints_1) +}; + +const union AnimCmd gFieldEffectAnim_837487C[] = { + ANIMCMD_FRAME(0, 1, .vFlip = TRUE), + ANIMCMD_END +}; + +const union AnimCmd gFieldEffectAnim_8374884[] = { + ANIMCMD_FRAME(0, 1), + ANIMCMD_END +}; + +const union AnimCmd gFieldEffectAnim_837488C[] = { + ANIMCMD_FRAME(1, 1), + ANIMCMD_END +}; + +const union AnimCmd gFieldEffectAnim_8374894[] = { + ANIMCMD_FRAME(1, 1, .hFlip = TRUE), + ANIMCMD_END +}; + +const union AnimCmd *const gFieldEffectAnimTable_SandFootprints[] = { + gFieldEffectAnim_837487C, + gFieldEffectAnim_837487C, + gFieldEffectAnim_8374884, + gFieldEffectAnim_837488C, + gFieldEffectAnim_8374894 +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_SandFootprints = {0xFFFF, 0x1004, &gFieldOamData_16x16, gFieldEffectAnimTable_SandFootprints, gFieldEffectPicTable_SandFootprints, gDummySpriteAffineAnimTable, sub_8127584}; + +const struct SpriteFrameImage gFieldEffectPicTable_DeepSandFootprints[] = { + obj_frame_tiles(gFieldEffectPic_DeepSandFootprints_0), + obj_frame_tiles(gFieldEffectPic_DeepSandFootprints_1) +}; + +const union AnimCmd gFieldEffectAnim_83748D8[] = { + ANIMCMD_FRAME(0, 1, .vFlip = TRUE), + ANIMCMD_END +}; + +const union AnimCmd gFieldEffectAnim_83748E0[] = { + ANIMCMD_FRAME(0, 1), + ANIMCMD_END +}; + +const union AnimCmd gFieldEffectAnim_83748E8[] = { + ANIMCMD_FRAME(1, 1), + ANIMCMD_END +}; + +const union AnimCmd gFieldEffectAnim_83748F0[] = { + ANIMCMD_FRAME(1, 1, .hFlip = TRUE), + ANIMCMD_END +}; + +const union AnimCmd *const gFieldEffectAnimTable_DeepSandFootprints[] = { + gFieldEffectAnim_83748D8, + gFieldEffectAnim_83748D8, + gFieldEffectAnim_83748E0, + gFieldEffectAnim_83748E8, + gFieldEffectAnim_83748F0 +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_DeepSandFootprints = {0xFFFF, 0x1004, &gFieldOamData_16x16, gFieldEffectAnimTable_DeepSandFootprints, gFieldEffectPicTable_DeepSandFootprints, gDummySpriteAffineAnimTable, sub_8127584}; + +const struct SpriteFrameImage gFieldEffectPicTable_BikeTireTracks[] = { + obj_frame_tiles(gFieldEffectPic_BikeTireTracks_0), + obj_frame_tiles(gFieldEffectPic_BikeTireTracks_1), + obj_frame_tiles(gFieldEffectPic_BikeTireTracks_2), + obj_frame_tiles(gFieldEffectPic_BikeTireTracks_3) +}; + +const union AnimCmd gFieldEffectAnim_8374944[] = { + ANIMCMD_FRAME(2, 1), + ANIMCMD_END +}; + +const union AnimCmd gFieldEffectAnim_837494C[] = { + ANIMCMD_FRAME(2, 1), + ANIMCMD_END +}; + +const union AnimCmd gFieldEffectAnim_8374954[] = { + ANIMCMD_FRAME(1, 1), + ANIMCMD_END +}; + +const union AnimCmd gFieldEffectAnim_837495C[] = { + ANIMCMD_FRAME(1, 1), + ANIMCMD_END +}; + +const union AnimCmd gFieldEffectAnim_8374964[] = { + ANIMCMD_FRAME(0, 1), + ANIMCMD_END +}; + +const union AnimCmd gFieldEffectAnim_837496C[] = { + ANIMCMD_FRAME(0, 1, .hFlip = TRUE), + ANIMCMD_END +}; + +const union AnimCmd gFieldEffectAnim_8374974[] = { + ANIMCMD_FRAME(3, 1, .hFlip = TRUE), + ANIMCMD_END +}; + +const union AnimCmd gFieldEffectAnim_837497C[] = { + ANIMCMD_FRAME(3, 1), + ANIMCMD_END +}; + +const union AnimCmd *const gFieldEffectAnimTable_BikeTireTracks[] = { + gFieldEffectAnim_8374944, + gFieldEffectAnim_8374944, + gFieldEffectAnim_837494C, + gFieldEffectAnim_8374954, + gFieldEffectAnim_837495C, + gFieldEffectAnim_8374964, + gFieldEffectAnim_837496C, + gFieldEffectAnim_8374974, + gFieldEffectAnim_837497C +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_BikeTireTracks = {0xFFFF, 0x1004, &gFieldOamData_16x16, gFieldEffectAnimTable_BikeTireTracks, gFieldEffectPicTable_BikeTireTracks, gDummySpriteAffineAnimTable, sub_8127584}; + +const struct SpriteFrameImage gFieldEffectPicTable_JumpBigSplash[] = { + obj_frame_tiles(gFieldEffectPic_JumpBigSplash_0), + obj_frame_tiles(gFieldEffectPic_JumpBigSplash_1), + obj_frame_tiles(gFieldEffectPic_JumpBigSplash_2), + obj_frame_tiles(gFieldEffectPic_JumpBigSplash_3) +}; + +const union AnimCmd gFieldEffectAnim_83749E0[] = { + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(3, 8), + ANIMCMD_END +}; + +const union AnimCmd *const gFieldEffectAnimTable_JumpBigSplash[] = { + gFieldEffectAnim_83749E0 +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_JumpBigSplash = {0xFFFF, 0x1004, &gFieldOamData_16x16, gFieldEffectAnimTable_JumpBigSplash, gFieldEffectPicTable_JumpBigSplash, gDummySpriteAffineAnimTable, sub_81287C4}; + +const struct SpriteFrameImage gFieldEffectPicTable_Splash[] = { + obj_frame_tiles(gFieldEffectPic_Splash_0), + obj_frame_tiles(gFieldEffectPic_Splash_1) +}; + +const union AnimCmd gFieldEffectAnim_8374A20[] = { + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_END +}; + +const union AnimCmd gFieldEffectAnim_8374A2C[] = { + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd *const gFieldEffectAnimTable_Splash[] = { + gFieldEffectAnim_8374A20, + gFieldEffectAnim_8374A2C +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_Splash = {0xFFFF, 0x1004, &gFieldOamData_16x8, gFieldEffectAnimTable_Splash, gFieldEffectPicTable_Splash, gDummySpriteAffineAnimTable, sub_81276B4}; + +const struct SpriteFrameImage gFieldEffectPicTable_JumpSmallSplash[] = { + obj_frame_tiles(gFieldEffectPic_JumpSmallSplash_0), + obj_frame_tiles(gFieldEffectPic_JumpSmallSplash_1), + obj_frame_tiles(gFieldEffectPic_JumpSmallSplash_2) +}; + +const union AnimCmd gFieldEffectAnim_8374A88[] = { + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_END +}; + +const union AnimCmd *const gFieldEffectAnimTable_JumpSmallSplash[] = { + gFieldEffectAnim_8374A88 +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_JumpSmallSplash = {0xFFFF, 0x1004, &gFieldOamData_16x8, gFieldEffectAnimTable_JumpSmallSplash, gFieldEffectPicTable_JumpSmallSplash, gDummySpriteAffineAnimTable, sub_81287C4}; + +const struct SpriteFrameImage gFieldEffectPicTable_LongGrass[] = { + obj_frame_tiles(gFieldEffectPic_LongGrass_0), + obj_frame_tiles(gFieldEffectPic_LongGrass_1), + obj_frame_tiles(gFieldEffectPic_LongGrass_2), + obj_frame_tiles(gFieldEffectPic_LongGrass_3) +}; + +const union AnimCmd gFieldEffectAnim_8374AD4[] = { + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(2, 3), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(3, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(3, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_END +}; + +const union AnimCmd *const gFieldEffectAnimTable_LongGrass[] = { + gFieldEffectAnim_8374AD4 +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_LongGrass = {0xFFFF, 0x1005, &gFieldOamData_16x16, gFieldEffectAnimTable_LongGrass, gFieldEffectPicTable_LongGrass, gDummySpriteAffineAnimTable, unc_grass_tall}; + +const struct SpriteFrameImage gFieldEffectPicTable_JumpLongGrass[] = { + obj_frame_tiles(gFieldEffectPic_JumpLongGrass_0), + obj_frame_tiles(gFieldEffectPic_JumpLongGrass_1), + obj_frame_tiles(gFieldEffectPic_JumpLongGrass_2), + obj_frame_tiles(gFieldEffectPic_JumpLongGrass_3), + obj_frame_tiles(gFieldEffectPic_JumpLongGrass_4), + obj_frame_tiles(gFieldEffectPic_JumpLongGrass_5) +}; + +const union AnimCmd gFieldEffectAnim_8374B40[] = { + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(3, 8), + ANIMCMD_FRAME(4, 8), + ANIMCMD_FRAME(5, 8), + ANIMCMD_END +}; + +const union AnimCmd *const gFieldEffectAnimTable_JumpLongGrass[] = { + gFieldEffectAnim_8374B40 +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_JumpLongGrass = {0xFFFF, 0x1005, &gFieldOamData_16x16, gFieldEffectAnimTable_JumpLongGrass, gFieldEffectPicTable_JumpLongGrass, gDummySpriteAffineAnimTable, sub_81287C4}; + +const struct SpriteFrameImage gFieldEffectPicTable_Unknown17[] = { + obj_frame_tiles(gFieldEffectPic_JumpLongGrass_5), + obj_frame_tiles(gFieldEffectPic_Unknown17_0), + obj_frame_tiles(gFieldEffectPic_Unknown17_1), + obj_frame_tiles(gFieldEffectPic_Unknown17_2), + obj_frame_tiles(gFieldEffectPic_Unknown17_3), + obj_frame_tiles(gFieldEffectPic_Unknown17_4), + obj_frame_tiles(gFieldEffectPic_Unknown17_5), + obj_frame_tiles(gFieldEffectPic_Unknown17_6), + obj_frame_tiles(gFieldEffectPic_Unknown17_7) +}; + +const union AnimCmd gFieldEffectAnim_8374BC0[] = { + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(3, 4), + ANIMCMD_FRAME(4, 4), + ANIMCMD_FRAME(5, 4), + ANIMCMD_FRAME(6, 4), + ANIMCMD_FRAME(7, 4), + ANIMCMD_FRAME(8, 4), + ANIMCMD_JUMP(7) +}; + +const union AnimCmd *const gFieldEffectAnimTable_Unknown17[] = { + gFieldEffectAnim_8374BC0 +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_Unknown17 = {0xFFFF, 0x1005, &gFieldOamData_16x16, gFieldEffectAnimTable_Unknown17, gFieldEffectPicTable_Unknown17, gDummySpriteAffineAnimTable, sub_8128800}; + +const struct SpriteFrameImage gFieldEffectPicTable_Unknown18[] = { + obj_frame_tiles(gFieldEffectPic_Unknown18_0), + obj_frame_tiles(gFieldEffectPic_Unknown18_1), + obj_frame_tiles(gFieldEffectPic_Unknown18_2), + obj_frame_tiles(gFieldEffectPic_Unknown18_3) +}; + +const union AnimCmd gFieldEffectAnim_8374C24[] = { + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(3, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd *const gFieldEffectAnimTable_Unknown18[] = { + gFieldEffectAnim_8374C24 +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_Unknown18 = {0xFFFF, 0x1005, &gFieldOamData_16x16, gFieldEffectAnimTable_Unknown18, gFieldEffectPicTable_Unknown18, gDummySpriteAffineAnimTable, sub_8128800}; + +const struct SpriteFrameImage gFieldEffectPicTable_Unknown19[] = { + obj_frame_tiles(gFieldEffectPic_Unknown19_0), + obj_frame_tiles(gFieldEffectPic_Unknown19_1), + obj_frame_tiles(gFieldEffectPic_Unknown19_2), + obj_frame_tiles(gFieldEffectPic_Unknown19_3) +}; + +const union AnimCmd gFieldEffectAnim_8374C7C[] = { + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(3, 4), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd *const gFieldEffectAnimTable_Unknown19[] = { + gFieldEffectAnim_8374C7C +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_Unknown19 = {0xFFFF, 0x1004, &gFieldOamData_16x16, gFieldEffectAnimTable_Unknown19, gFieldEffectPicTable_Unknown19, gDummySpriteAffineAnimTable, sub_8128800}; + +const struct SpriteFrameImage gFieldEffectPicTable_SandPile[] = { + obj_frame_tiles(gFieldEffectPic_SandPile_0), + obj_frame_tiles(gFieldEffectPic_SandPile_1), + obj_frame_tiles(gFieldEffectPic_SandPile_2) +}; + +const union AnimCmd gFieldEffectAnim_8374CC4[] = { + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_END +}; + +const union AnimCmd *const gFieldEffectAnimTable_SandPile[] = { + gFieldEffectAnim_8374CC4 +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_SandPile = {0xFFFF, 0x1004, &gFieldOamData_16x8, gFieldEffectAnimTable_SandPile, gFieldEffectPicTable_SandPile, gDummySpriteAffineAnimTable, sub_81282E0}; + +const struct SpriteFrameImage gFieldEffectPicTable_Unknown20[] = { + obj_frame_tiles(gFieldEffectPic_Unknown20_0), + obj_frame_tiles(gFieldEffectPic_Unknown20_1), + obj_frame_tiles(gFieldEffectPic_Unknown20_2), + obj_frame_tiles(gFieldEffectPic_Unknown20_3) +}; + +const union AnimCmd gFieldEffectAnim_8374D10[] = { + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(3, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd *const gFieldEffectAnimTable_Unknown20[] = { + gFieldEffectAnim_8374D10 +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_Unknown20 = {0xFFFF, 0x1004, &gFieldOamData_16x16, gFieldEffectAnimTable_Unknown20, gFieldEffectPicTable_Unknown20, gDummySpriteAffineAnimTable, sub_8128800}; + +const union AffineAnimCmd gFieldEffectAffineAnim_8374D48[] = { + AFFINEANIMCMD_FRAME(0xFF00, 0x100, -128, 0), + AFFINEANIMCMD_FRAME(0x1, 0x0, 0, 4), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_FRAME(0xFFFF, 0x0, 0, 4), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_FRAME(0xFFFF, 0x0, 0, 4), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_FRAME(0x1, 0x0, 0, 4), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_JUMP(1) +}; + +const union AffineAnimCmd gFieldEffectAffineAnim_8374D98[] = { + AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0), + AFFINEANIMCMD_FRAME(0xFFFF, 0x0, 0, 4), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_FRAME(0x1, 0x0, 0, 4), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_FRAME(0x1, 0x0, 0, 4), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_FRAME(0xFFFF, 0x0, 0, 4), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_JUMP(1) +}; + +const union AffineAnimCmd *const gFieldEffectAffineAnimTable_Unknown21[] = { + gFieldEffectAffineAnim_8374D48, + gFieldEffectAffineAnim_8374D98 +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_Unknown21 = {0x0, 0xFFFF, &gDummyOamData, gDummySpriteAnimTable, NULL, gFieldEffectAffineAnimTable_Unknown21, SpriteCallbackDummy}; + +const struct SpriteFrameImage gFieldEffectPicTable_BerryTreeGrowthSparkle[] = { + obj_frame_tiles(gFieldEffectPic_BerryTreeGrowthSparkle_0), + obj_frame_tiles(gFieldEffectPic_BerryTreeGrowthSparkle_1), + obj_frame_tiles(gFieldEffectPic_BerryTreeGrowthSparkle_2), + obj_frame_tiles(gFieldEffectPic_BerryTreeGrowthSparkle_3), + obj_frame_tiles(gFieldEffectPic_BerryTreeGrowthSparkle_4), + obj_frame_tiles(gFieldEffectPic_BerryTreeGrowthSparkle_5) +}; + +const union AnimCmd gFieldEffectAnim_8374E38[] = { + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(3, 8), + ANIMCMD_FRAME(4, 8), + ANIMCMD_FRAME(5, 8), + ANIMCMD_LOOP(0), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(3, 4), + ANIMCMD_FRAME(4, 4), + ANIMCMD_FRAME(5, 4), + ANIMCMD_LOOP(3), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(3, 8), + ANIMCMD_FRAME(4, 8), + ANIMCMD_FRAME(5, 8), + ANIMCMD_END +}; + +const union AnimCmd *const gFieldEffectAnimTable_BerryTreeGrowthSparkle[] = { + gFieldEffectAnim_8374E38 +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_BerryTreeGrowthSparkle = {0xFFFF, 0xFFFF, &gFieldOamData_16x16, gFieldEffectAnimTable_BerryTreeGrowthSparkle, gFieldEffectPicTable_BerryTreeGrowthSparkle, gDummySpriteAffineAnimTable, sub_8128800}; + +const struct SpriteFrameImage gFieldEffectPicTable_TreeDisguise[] = { + obj_frame_tiles(gFieldEffectPic_TreeDisguise_0), + obj_frame_tiles(gFieldEffectPic_TreeDisguise_1), + obj_frame_tiles(gFieldEffectPic_TreeDisguise_2), + obj_frame_tiles(gFieldEffectPic_TreeDisguise_3), + obj_frame_tiles(gFieldEffectPic_TreeDisguise_4), + obj_frame_tiles(gFieldEffectPic_TreeDisguise_5), + obj_frame_tiles(gFieldEffectPic_TreeDisguise_6) +}; + +const union AnimCmd gFieldEffectAnim_8374EE0[] = { + ANIMCMD_FRAME(0, 16), + ANIMCMD_END +}; + +const union AnimCmd gFieldEffectAnim_8374EE8[] = { + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(3, 4), + ANIMCMD_FRAME(4, 4), + ANIMCMD_FRAME(5, 4), + ANIMCMD_FRAME(6, 4), + ANIMCMD_END +}; + +const union AnimCmd *const gFieldEffectAnimTable_TreeDisguise[] = { + gFieldEffectAnim_8374EE0, + gFieldEffectAnim_8374EE8 +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_TreeDisguise = {0xFFFF, 0xFFFF, &gFieldOamData_16x32, gFieldEffectAnimTable_TreeDisguise, gFieldEffectPicTable_TreeDisguise, gDummySpriteAffineAnimTable, sub_81285AC}; + +const struct SpriteFrameImage gFieldEffectPicTable_MountainDisguise[] = { + obj_frame_tiles(gFieldEffectPic_MountainDisguise_0), + obj_frame_tiles(gFieldEffectPic_MountainDisguise_1), + obj_frame_tiles(gFieldEffectPic_MountainDisguise_2), + obj_frame_tiles(gFieldEffectPic_MountainDisguise_3), + obj_frame_tiles(gFieldEffectPic_MountainDisguise_4), + obj_frame_tiles(gFieldEffectPic_MountainDisguise_5), + obj_frame_tiles(gFieldEffectPic_MountainDisguise_6) +}; + +const union AnimCmd gFieldEffectAnim_8374F60[] = { + ANIMCMD_FRAME(0, 16), + ANIMCMD_END +}; + +const union AnimCmd gFieldEffectAnim_8374F68[] = { + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(3, 4), + ANIMCMD_FRAME(4, 4), + ANIMCMD_FRAME(5, 4), + ANIMCMD_FRAME(6, 4), + ANIMCMD_END +}; + +const union AnimCmd *const gFieldEffectAnimTable_MountainDisguise[] = { + gFieldEffectAnim_8374F60, + gFieldEffectAnim_8374F68 +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_MountainDisguise = {0xFFFF, 0xFFFF, &gFieldOamData_16x32, gFieldEffectAnimTable_MountainDisguise, gFieldEffectPicTable_MountainDisguise, gDummySpriteAffineAnimTable, sub_81285AC}; + +const struct SpriteFrameImage gFieldEffectPicTable_SandDisguise[] = { + obj_frame_tiles(gFieldEffectPic_SandDisguise_0), + obj_frame_tiles(gFieldEffectPic_SandDisguise_1), + obj_frame_tiles(gFieldEffectPic_SandDisguise_2), + obj_frame_tiles(gFieldEffectPic_SandDisguise_3), + obj_frame_tiles(gFieldEffectPic_SandDisguise_4), + obj_frame_tiles(gFieldEffectPic_SandDisguise_5), + obj_frame_tiles(gFieldEffectPic_SandDisguise_6) +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_SandDisguise = {0xFFFF, 0xFFFF, &gFieldOamData_16x32, gFieldEffectAnimTable_TreeDisguise, gFieldEffectPicTable_SandDisguise, gDummySpriteAffineAnimTable, sub_81285AC}; + +const struct SpriteFrameImage gFieldEffectPicTable_Bird[] = { + obj_frame_tiles(gFieldEffectPic_Bird) +}; + +const union AnimCmd gFieldEffectAnim_8375000[] = { + ANIMCMD_FRAME(0, 1), + ANIMCMD_END +}; + +const union AnimCmd *const gFieldEffectAnimTable_Bird[] = { + gFieldEffectAnim_8375000 +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_Bird = {0xFFFF, 0xFFFF, &gFieldOamData_32x32, gFieldEffectAnimTable_Bird, gFieldEffectPicTable_Bird, gDummySpriteAffineAnimTable, SpriteCallbackDummy}; + +const struct SpriteFrameImage gFieldEffectPicTable_ShortGrass[] = { + obj_frame_tiles(gFieldEffectPic_ShortGrass_0), + obj_frame_tiles(gFieldEffectPic_ShortGrass_1) +}; + +const union AnimCmd gFieldEffectAnim_8375034[] = { + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_END +}; + +const union AnimCmd *const gFieldEffectAnimTable_ShortGrass[] = { + gFieldEffectAnim_8375034 +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_ShortGrass = {0xFFFF, 0x1005, &gFieldOamData_16x16, gFieldEffectAnimTable_ShortGrass, gFieldEffectPicTable_ShortGrass, gDummySpriteAffineAnimTable, sub_8127334}; + +const struct SpriteFrameImage gFieldEffectPicTable_HotSpringsWater[] = { + obj_frame_tiles(gFieldEffectPic_HotSpringsWater) +}; + +const union AnimCmd gFieldEffectAnim_8375064[] = { + ANIMCMD_FRAME(0, 4), + ANIMCMD_END +}; + +const union AnimCmd *const gFieldEffectAnimTable_HotSpringsWater[] = { + gFieldEffectAnim_8375064 +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_HotSpringsWater = {0xFFFF, 0x1005, &gFieldOamData_16x16, gFieldEffectAnimTable_HotSpringsWater, gFieldEffectPicTable_HotSpringsWater, gDummySpriteAffineAnimTable, sub_8127A7C}; + +const struct SpriteFrameImage gFieldEffectPicTable_PopOutOfAsh[] = { + obj_frame_tiles(gFieldEffectPic_PopOutOfAsh_0), + obj_frame_tiles(gFieldEffectPic_PopOutOfAsh_1), + obj_frame_tiles(gFieldEffectPic_PopOutOfAsh_2), + obj_frame_tiles(gFieldEffectPic_PopOutOfAsh_3), + obj_frame_tiles(gFieldEffectPic_PopOutOfAsh_4) +}; + +const union AnimCmd gFieldEffectAnim_83750B0[] = { + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(2, 6), + ANIMCMD_FRAME(3, 6), + ANIMCMD_FRAME(4, 6), + ANIMCMD_END +}; + +const union AnimCmd *const gFieldEffectAnimTable_PopOutOfAsh[] = { + gFieldEffectAnim_83750B0 +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_PopOutOfAsh = {0xFFFF, 0x100D, &gFieldOamData_16x16, gFieldEffectAnimTable_PopOutOfAsh, gFieldEffectPicTable_PopOutOfAsh, gDummySpriteAffineAnimTable, sub_808788C}; + +const struct SpritePalette gFieldEffectObjectPaletteInfo2 = {gFieldEffectObjectPalette2, 0x100D}; + +const struct SpriteFrameImage gFieldEffectPicTable_LavaridgeGymWarp[] = { + obj_frame_tiles(gFieldEffectPic_LavaridgeGymWarp_0), + obj_frame_tiles(gFieldEffectPic_LavaridgeGymWarp_1), + obj_frame_tiles(gFieldEffectPic_LavaridgeGymWarp_2), + obj_frame_tiles(gFieldEffectPic_LavaridgeGymWarp_3), + obj_frame_tiles(gFieldEffectPic_LavaridgeGymWarp_4) +}; + +const union AnimCmd gFieldEffectAnim_8375114[] = { + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(2, 6), + ANIMCMD_FRAME(3, 6), + ANIMCMD_FRAME(4, 6), + ANIMCMD_END +}; + +const union AnimCmd *const gFieldEffectAnimTable_LavaridgeGymWarp[] = { + gFieldEffectAnim_8375114 +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_LavaridgeGymWarp = {0xFFFF, 0x100D, &gFieldOamData_16x16, gFieldEffectAnimTable_LavaridgeGymWarp, gFieldEffectPicTable_LavaridgeGymWarp, gDummySpriteAffineAnimTable, sub_8087638}; + +const struct SpriteFrameImage gFieldEffectPicTable_Bubbles[] = { + obj_frame_tiles(gFieldEffectPic_Bubbles_0), + obj_frame_tiles(gFieldEffectPic_Bubbles_1), + obj_frame_tiles(gFieldEffectPic_Bubbles_2), + obj_frame_tiles(gFieldEffectPic_Bubbles_3), + obj_frame_tiles(gFieldEffectPic_Bubbles_4), + obj_frame_tiles(gFieldEffectPic_Bubbles_5), + obj_frame_tiles(gFieldEffectPic_Bubbles_6), + obj_frame_tiles(gFieldEffectPic_Bubbles_7) +}; + +const union AnimCmd gFieldEffectAnim_8375188[] = { + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(3, 6), + ANIMCMD_FRAME(4, 6), + ANIMCMD_FRAME(5, 4), + ANIMCMD_FRAME(6, 4), + ANIMCMD_FRAME(7, 4), + ANIMCMD_END +}; + +const union AnimCmd *const gFieldEffectAnimTable_Bubbles[] = { + gFieldEffectAnim_8375188 +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_Bubbles = {0xFFFF, 0x1004, &gFieldOamData_16x32, gFieldEffectAnimTable_Bubbles, gFieldEffectPicTable_Bubbles, gDummySpriteAffineAnimTable, sub_8128410}; + +const struct SpriteFrameImage gFieldEffectPicTable_Sparkle[] = { + obj_frame_tiles(gFieldEffectPic_Sparkle_0), + obj_frame_tiles(gFieldEffectPic_Sparkle_1) +}; + +const union AnimCmd gFieldEffectAnim_83751D8[] = { + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_END +}; + +const union AnimCmd *const gFieldEffectAnimTable_Sparkle[] = { + gFieldEffectAnim_83751D8 +}; + +const struct SpriteTemplate gFieldEffectSpriteTemplate_Sparkle = {0xFFFF, 0x100F, &gFieldOamData_16x16, gFieldEffectAnimTable_Sparkle, gFieldEffectPicTable_Sparkle, gDummySpriteAffineAnimTable, sub_8128774}; + +const struct SpritePalette gFieldEffectObjectPaletteInfo3 = {gFieldEffectObjectPalette3, 0x100F}; + +#endif //POKERUBY_FIELD_EFFECT_OBJECTS_H diff --git a/src/data/field_map_obj/map_object_anims.h b/src/data/field_map_obj/map_object_anims.h new file mode 100644 index 000000000..0993f3efd --- /dev/null +++ b/src/data/field_map_obj/map_object_anims.h @@ -0,0 +1,886 @@ +// + +// + +#ifndef POKERUBY_MAP_OBJECT_ANIMS_H +#define POKERUBY_MAP_OBJECT_ANIMS_H + + +const union AnimCmd gMapObjectImageAnim_83708C8[] = { + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_83708DC[] = { + ANIMCMD_FRAME(0, 16), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_83708E4[] = { + ANIMCMD_FRAME(1, 16), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_83708EC[] = { + ANIMCMD_FRAME(2, 16), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_83708F4[] = { + ANIMCMD_FRAME(2, 16, .hFlip = TRUE), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_83708FC[] = { + ANIMCMD_FRAME(3, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(3, 8, .hFlip = TRUE), + ANIMCMD_FRAME(0, 8), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370910[] = { + ANIMCMD_FRAME(4, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(4, 8, .hFlip = TRUE), + ANIMCMD_FRAME(1, 8), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370924[] = { + ANIMCMD_FRAME(5, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(6, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370938[] = { + ANIMCMD_FRAME(5, 8, .hFlip = TRUE), + ANIMCMD_FRAME(2, 8, .hFlip = TRUE), + ANIMCMD_FRAME(6, 8, .hFlip = TRUE), + ANIMCMD_FRAME(2, 8, .hFlip = TRUE), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_837094C[] = { + ANIMCMD_FRAME(3, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(3, 4, .hFlip = TRUE), + ANIMCMD_FRAME(0, 4), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370960[] = { + ANIMCMD_FRAME(4, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(4, 4, .hFlip = TRUE), + ANIMCMD_FRAME(1, 4), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370974[] = { + ANIMCMD_FRAME(5, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(6, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370988[] = { + ANIMCMD_FRAME(5, 4, .hFlip = TRUE), + ANIMCMD_FRAME(2, 4, .hFlip = TRUE), + ANIMCMD_FRAME(6, 4, .hFlip = TRUE), + ANIMCMD_FRAME(2, 4, .hFlip = TRUE), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_837099C[] = { + ANIMCMD_FRAME(3, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(3, 2, .hFlip = TRUE), + ANIMCMD_FRAME(0, 2), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_83709B0[] = { + ANIMCMD_FRAME(4, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(4, 2, .hFlip = TRUE), + ANIMCMD_FRAME(1, 2), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_83709C4[] = { + ANIMCMD_FRAME(5, 2), + ANIMCMD_FRAME(2, 2), + ANIMCMD_FRAME(6, 2), + ANIMCMD_FRAME(2, 2), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_83709D8[] = { + ANIMCMD_FRAME(5, 2, .hFlip = TRUE), + ANIMCMD_FRAME(2, 2, .hFlip = TRUE), + ANIMCMD_FRAME(6, 2, .hFlip = TRUE), + ANIMCMD_FRAME(2, 2, .hFlip = TRUE), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_83709EC[] = { + ANIMCMD_FRAME(3, 1), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(3, 1, .hFlip = TRUE), + ANIMCMD_FRAME(0, 1), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370A00[] = { + ANIMCMD_FRAME(4, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(4, 1, .hFlip = TRUE), + ANIMCMD_FRAME(1, 1), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370A14[] = { + ANIMCMD_FRAME(5, 1), + ANIMCMD_FRAME(2, 1), + ANIMCMD_FRAME(6, 1), + ANIMCMD_FRAME(2, 1), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370A28[] = { + ANIMCMD_FRAME(5, 1, .hFlip = TRUE), + ANIMCMD_FRAME(2, 1, .hFlip = TRUE), + ANIMCMD_FRAME(6, 1, .hFlip = TRUE), + ANIMCMD_FRAME(2, 1, .hFlip = TRUE), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370A3C[] = { + ANIMCMD_FRAME(0, 16), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370A44[] = { + ANIMCMD_FRAME(1, 16), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370A4C[] = { + ANIMCMD_FRAME(2, 16), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370A54[] = { + ANIMCMD_FRAME(2, 16, .hFlip = TRUE), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370A5C[] = { + ANIMCMD_FRAME(3, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(4, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370A70[] = { + ANIMCMD_FRAME(5, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(6, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370A84[] = { + ANIMCMD_FRAME(7, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(8, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370A98[] = { + ANIMCMD_FRAME(7, 8, .hFlip = TRUE), + ANIMCMD_FRAME(2, 8, .hFlip = TRUE), + ANIMCMD_FRAME(8, 8, .hFlip = TRUE), + ANIMCMD_FRAME(2, 8, .hFlip = TRUE), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370AAC[] = { + ANIMCMD_FRAME(3, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(4, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370AC0[] = { + ANIMCMD_FRAME(5, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(6, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370AD4[] = { + ANIMCMD_FRAME(7, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(8, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370AE8[] = { + ANIMCMD_FRAME(7, 4, .hFlip = TRUE), + ANIMCMD_FRAME(2, 4, .hFlip = TRUE), + ANIMCMD_FRAME(8, 4, .hFlip = TRUE), + ANIMCMD_FRAME(2, 4, .hFlip = TRUE), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370AFC[] = { + ANIMCMD_FRAME(3, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(4, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370B10[] = { + ANIMCMD_FRAME(5, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(6, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370B24[] = { + ANIMCMD_FRAME(7, 2), + ANIMCMD_FRAME(2, 2), + ANIMCMD_FRAME(8, 2), + ANIMCMD_FRAME(2, 2), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370B38[] = { + ANIMCMD_FRAME(7, 2, .hFlip = TRUE), + ANIMCMD_FRAME(2, 2, .hFlip = TRUE), + ANIMCMD_FRAME(8, 2, .hFlip = TRUE), + ANIMCMD_FRAME(2, 2, .hFlip = TRUE), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370B4C[] = { + ANIMCMD_FRAME(3, 1), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(4, 1), + ANIMCMD_FRAME(0, 1), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370B60[] = { + ANIMCMD_FRAME(5, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(6, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370B74[] = { + ANIMCMD_FRAME(7, 1), + ANIMCMD_FRAME(2, 1), + ANIMCMD_FRAME(8, 1), + ANIMCMD_FRAME(2, 1), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370B88[] = { + ANIMCMD_FRAME(7, 1, .hFlip = TRUE), + ANIMCMD_FRAME(2, 1, .hFlip = TRUE), + ANIMCMD_FRAME(8, 1, .hFlip = TRUE), + ANIMCMD_FRAME(2, 1, .hFlip = TRUE), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370B9C[] = { + ANIMCMD_FRAME(12, 5), + ANIMCMD_FRAME(9, 3), + ANIMCMD_FRAME(13, 5), + ANIMCMD_FRAME(9, 3), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370BB0[] = { + ANIMCMD_FRAME(14, 5), + ANIMCMD_FRAME(10, 3), + ANIMCMD_FRAME(15, 5), + ANIMCMD_FRAME(10, 3), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370BC4[] = { + ANIMCMD_FRAME(16, 5), + ANIMCMD_FRAME(11, 3), + ANIMCMD_FRAME(17, 5), + ANIMCMD_FRAME(11, 3), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370BD8[] = { + ANIMCMD_FRAME(16, 5, .hFlip = TRUE), + ANIMCMD_FRAME(11, 3, .hFlip = TRUE), + ANIMCMD_FRAME(17, 5, .hFlip = TRUE), + ANIMCMD_FRAME(11, 3, .hFlip = TRUE), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370BEC[] = { + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(3, 4), + ANIMCMD_FRAME(4, 8), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370C04[] = { + ANIMCMD_FRAME(9, 32), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370C0C[] = { + ANIMCMD_FRAME(10, 32), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370C14[] = { + ANIMCMD_FRAME(11, 32), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370C1C[] = { + ANIMCMD_FRAME(11, 32, .hFlip = TRUE), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370C24[] = { + ANIMCMD_FRAME(9, 4), + ANIMCMD_FRAME(10, 4), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370C30[] = { + ANIMCMD_FRAME(13, 4), + ANIMCMD_FRAME(14, 4), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370C3C[] = { + ANIMCMD_FRAME(17, 4), + ANIMCMD_FRAME(18, 4), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370C48[] = { + ANIMCMD_FRAME(17, 4, .hFlip = TRUE), + ANIMCMD_FRAME(18, 4, .hFlip = TRUE), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370C54[] = { + ANIMCMD_FRAME(11, 4), + ANIMCMD_FRAME(12, 4), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370C60[] = { + ANIMCMD_FRAME(15, 4), + ANIMCMD_FRAME(16, 4), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370C6C[] = { + ANIMCMD_FRAME(19, 4), + ANIMCMD_FRAME(20, 4), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370C78[] = { + ANIMCMD_FRAME(19, 4, .hFlip = TRUE), + ANIMCMD_FRAME(20, 4, .hFlip = TRUE), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370C84[] = { + ANIMCMD_FRAME(9, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370C90[] = { + ANIMCMD_FRAME(13, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370C9C[] = { + ANIMCMD_FRAME(17, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370CA8[] = { + ANIMCMD_FRAME(17, 4, .hFlip = TRUE), + ANIMCMD_FRAME(2, 4, .hFlip = TRUE), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370CB4[] = { + ANIMCMD_FRAME(11, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370CC0[] = { + ANIMCMD_FRAME(15, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370CCC[] = { + ANIMCMD_FRAME(19, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370CD8[] = { + ANIMCMD_FRAME(19, 4, .hFlip = TRUE), + ANIMCMD_FRAME(2, 4, .hFlip = TRUE), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370CE4[] = { + ANIMCMD_FRAME(21, 4), + ANIMCMD_FRAME(10, 4), + ANIMCMD_FRAME(22, 4), + ANIMCMD_FRAME(10, 4), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370CF8[] = { + ANIMCMD_FRAME(23, 4), + ANIMCMD_FRAME(14, 4), + ANIMCMD_FRAME(24, 4), + ANIMCMD_FRAME(14, 4), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370D0C[] = { + ANIMCMD_FRAME(25, 4), + ANIMCMD_FRAME(18, 4), + ANIMCMD_FRAME(26, 4), + ANIMCMD_FRAME(18, 4), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370D20[] = { + ANIMCMD_FRAME(25, 4, .hFlip = TRUE), + ANIMCMD_FRAME(18, 4, .hFlip = TRUE), + ANIMCMD_FRAME(26, 4, .hFlip = TRUE), + ANIMCMD_FRAME(18, 4, .hFlip = TRUE), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370D34[] = { + ANIMCMD_FRAME(0, 32), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370D3C[] = { + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(2, 32), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370D48[] = { + ANIMCMD_FRAME(3, 48), + ANIMCMD_FRAME(4, 48), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370D54[] = { + ANIMCMD_FRAME(5, 32), + ANIMCMD_FRAME(5, 32), + ANIMCMD_FRAME(6, 32), + ANIMCMD_FRAME(6, 32), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370D68[] = { + ANIMCMD_FRAME(7, 48), + ANIMCMD_FRAME(7, 48), + ANIMCMD_FRAME(8, 48), + ANIMCMD_FRAME(8, 48), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370D7C[] = { + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(9, 32), + ANIMCMD_FRAME(0, 8), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370D8C[] = { + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(3, 8), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370DA0[] = { + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(2, 6), + ANIMCMD_FRAME(3, 6), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370DB4[] = { + ANIMCMD_FRAME(8, 4), + ANIMCMD_FRAME(9, 4), + ANIMCMD_FRAME(10, 4), + ANIMCMD_FRAME(11, 4), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370DC8[] = { + ANIMCMD_FRAME(4, 4), + ANIMCMD_FRAME(5, 4), + ANIMCMD_FRAME(6, 4), + ANIMCMD_FRAME(7, 4), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370DDC[] = { + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(3, 4), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370DF0[] = { + ANIMCMD_FRAME(0, 4, .hFlip = TRUE), + ANIMCMD_FRAME(1, 4, .hFlip = TRUE), + ANIMCMD_FRAME(2, 4, .hFlip = TRUE), + ANIMCMD_FRAME(3, 4, .hFlip = TRUE), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370E04[] = { + ANIMCMD_FRAME(11, 4), + ANIMCMD_FRAME(10, 6), + ANIMCMD_FRAME(9, 6), + ANIMCMD_FRAME(8, 6), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370E18[] = { + ANIMCMD_FRAME(7, 4), + ANIMCMD_FRAME(6, 6), + ANIMCMD_FRAME(5, 6), + ANIMCMD_FRAME(4, 6), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370E2C[] = { + ANIMCMD_FRAME(3, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370E40[] = { + ANIMCMD_FRAME(3, 4, .hFlip = TRUE), + ANIMCMD_FRAME(2, 4, .hFlip = TRUE), + ANIMCMD_FRAME(1, 4, .hFlip = TRUE), + ANIMCMD_FRAME(0, 4, .hFlip = TRUE), + ANIMCMD_END +}; + +const union AnimCmd gMapObjectImageAnim_8370E54[] = { + ANIMCMD_FRAME(10, 6), + ANIMCMD_FRAME(11, 6), + ANIMCMD_LOOP(1), + ANIMCMD_FRAME(11, 30), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370E68[] = { + ANIMCMD_FRAME(6, 6), + ANIMCMD_FRAME(7, 6), + ANIMCMD_LOOP(1), + ANIMCMD_FRAME(7, 30), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370E7C[] = { + ANIMCMD_FRAME(2, 6), + ANIMCMD_FRAME(3, 6), + ANIMCMD_LOOP(1), + ANIMCMD_FRAME(3, 30), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gMapObjectImageAnim_8370E90[] = { + ANIMCMD_FRAME(2, 6, .hFlip = TRUE), + ANIMCMD_FRAME(3, 6, .hFlip = TRUE), + ANIMCMD_LOOP(1), + ANIMCMD_FRAME(3, 30, .hFlip = TRUE), + ANIMCMD_JUMP(0) +}; + +const union AffineAnimCmd gMapObjectRotScalAnim_8370EA4[] = { + AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 1), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1), + AFFINEANIMCMD_LOOP(7), + AFFINEANIMCMD_JUMP(0) +}; + +const union AffineAnimCmd gMapObjectRotScalAnim_8370ED4[] = { + AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 1), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1), + AFFINEANIMCMD_LOOP(15), + AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 1), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1), + AFFINEANIMCMD_LOOP(15), + AFFINEANIMCMD_JUMP(0) +}; + +const union AnimCmd *const gMapObjectImageAnimTable_Inanimate[] = { + gMapObjectImageAnim_83708C8 +}; + +const union AnimCmd *const gMapObjectImageAnimTable_QuintyPlump[] = { + gMapObjectImageAnim_83708DC, + gMapObjectImageAnim_83708E4, + gMapObjectImageAnim_83708EC, + gMapObjectImageAnim_83708F4, + gMapObjectImageAnim_83708FC, + gMapObjectImageAnim_8370910, + gMapObjectImageAnim_8370924, + gMapObjectImageAnim_8370938, + gMapObjectImageAnim_837094C, + gMapObjectImageAnim_8370960, + gMapObjectImageAnim_8370974, + gMapObjectImageAnim_8370988, + gMapObjectImageAnim_837099C, + gMapObjectImageAnim_83709B0, + gMapObjectImageAnim_83709C4, + gMapObjectImageAnim_83709D8, + gMapObjectImageAnim_83709EC, + gMapObjectImageAnim_8370A00, + gMapObjectImageAnim_8370A14, + gMapObjectImageAnim_8370A28 +}; + +const union AnimCmd *const gMapObjectImageAnimTable_Standard[] = { + gMapObjectImageAnim_8370A3C, + gMapObjectImageAnim_8370A44, + gMapObjectImageAnim_8370A4C, + gMapObjectImageAnim_8370A54, + gMapObjectImageAnim_8370A5C, + gMapObjectImageAnim_8370A70, + gMapObjectImageAnim_8370A84, + gMapObjectImageAnim_8370A98, + gMapObjectImageAnim_8370AAC, + gMapObjectImageAnim_8370AC0, + gMapObjectImageAnim_8370AD4, + gMapObjectImageAnim_8370AE8, + gMapObjectImageAnim_8370AFC, + gMapObjectImageAnim_8370B10, + gMapObjectImageAnim_8370B24, + gMapObjectImageAnim_8370B38, + gMapObjectImageAnim_8370B4C, + gMapObjectImageAnim_8370B60, + gMapObjectImageAnim_8370B74, + gMapObjectImageAnim_8370B88 +}; + +const union AnimCmd *const gMapObjectImageAnimTable_BrendanMayNormal[] = { + gMapObjectImageAnim_8370A3C, + gMapObjectImageAnim_8370A44, + gMapObjectImageAnim_8370A4C, + gMapObjectImageAnim_8370A54, + gMapObjectImageAnim_8370A5C, + gMapObjectImageAnim_8370A70, + gMapObjectImageAnim_8370A84, + gMapObjectImageAnim_8370A98, + gMapObjectImageAnim_8370AAC, + gMapObjectImageAnim_8370AC0, + gMapObjectImageAnim_8370AD4, + gMapObjectImageAnim_8370AE8, + gMapObjectImageAnim_8370AFC, + gMapObjectImageAnim_8370B10, + gMapObjectImageAnim_8370B24, + gMapObjectImageAnim_8370B38, + gMapObjectImageAnim_8370B4C, + gMapObjectImageAnim_8370B60, + gMapObjectImageAnim_8370B74, + gMapObjectImageAnim_8370B88, + gMapObjectImageAnim_8370B9C, + gMapObjectImageAnim_8370BB0, + gMapObjectImageAnim_8370BC4, + gMapObjectImageAnim_8370BD8 +}; + +const union AnimCmd *const gMapObjectImageAnimTable_AcroBike[] = { + gMapObjectImageAnim_8370A3C, + gMapObjectImageAnim_8370A44, + gMapObjectImageAnim_8370A4C, + gMapObjectImageAnim_8370A54, + gMapObjectImageAnim_8370A5C, + gMapObjectImageAnim_8370A70, + gMapObjectImageAnim_8370A84, + gMapObjectImageAnim_8370A98, + gMapObjectImageAnim_8370AAC, + gMapObjectImageAnim_8370AC0, + gMapObjectImageAnim_8370AD4, + gMapObjectImageAnim_8370AE8, + gMapObjectImageAnim_8370AFC, + gMapObjectImageAnim_8370B10, + gMapObjectImageAnim_8370B24, + gMapObjectImageAnim_8370B38, + gMapObjectImageAnim_8370B4C, + gMapObjectImageAnim_8370B60, + gMapObjectImageAnim_8370B74, + gMapObjectImageAnim_8370B88, + gMapObjectImageAnim_8370C24, + gMapObjectImageAnim_8370C30, + gMapObjectImageAnim_8370C3C, + gMapObjectImageAnim_8370C48, + gMapObjectImageAnim_8370C54, + gMapObjectImageAnim_8370C60, + gMapObjectImageAnim_8370C6C, + gMapObjectImageAnim_8370C78, + gMapObjectImageAnim_8370C84, + gMapObjectImageAnim_8370C90, + gMapObjectImageAnim_8370C9C, + gMapObjectImageAnim_8370CA8, + gMapObjectImageAnim_8370CB4, + gMapObjectImageAnim_8370CC0, + gMapObjectImageAnim_8370CCC, + gMapObjectImageAnim_8370CD8, + gMapObjectImageAnim_8370CE4, + gMapObjectImageAnim_8370CF8, + gMapObjectImageAnim_8370D0C, + gMapObjectImageAnim_8370D20 +}; + +const union AnimCmd *const gMapObjectImageAnimTable_Surfing[] = { + gMapObjectImageAnim_8370A3C, + gMapObjectImageAnim_8370A44, + gMapObjectImageAnim_8370A4C, + gMapObjectImageAnim_8370A54, + gMapObjectImageAnim_8370A5C, + gMapObjectImageAnim_8370A70, + gMapObjectImageAnim_8370A84, + gMapObjectImageAnim_8370A98, + gMapObjectImageAnim_8370AAC, + gMapObjectImageAnim_8370AC0, + gMapObjectImageAnim_8370AD4, + gMapObjectImageAnim_8370AE8, + gMapObjectImageAnim_8370AFC, + gMapObjectImageAnim_8370B10, + gMapObjectImageAnim_8370B24, + gMapObjectImageAnim_8370B38, + gMapObjectImageAnim_8370B4C, + gMapObjectImageAnim_8370B60, + gMapObjectImageAnim_8370B74, + gMapObjectImageAnim_8370B88, + gMapObjectImageAnim_8370C04, + gMapObjectImageAnim_8370C0C, + gMapObjectImageAnim_8370C14, + gMapObjectImageAnim_8370C1C +}; + +const union AnimCmd *const gMapObjectImageAnimTable_Nurse[] = { + gMapObjectImageAnim_8370A3C, + gMapObjectImageAnim_8370A44, + gMapObjectImageAnim_8370A4C, + gMapObjectImageAnim_8370A54, + gMapObjectImageAnim_8370A5C, + gMapObjectImageAnim_8370A70, + gMapObjectImageAnim_8370A84, + gMapObjectImageAnim_8370A98, + gMapObjectImageAnim_8370AAC, + gMapObjectImageAnim_8370AC0, + gMapObjectImageAnim_8370AD4, + gMapObjectImageAnim_8370AE8, + gMapObjectImageAnim_8370AFC, + gMapObjectImageAnim_8370B10, + gMapObjectImageAnim_8370B24, + gMapObjectImageAnim_8370B38, + gMapObjectImageAnim_8370B4C, + gMapObjectImageAnim_8370B60, + gMapObjectImageAnim_8370B74, + gMapObjectImageAnim_8370B88, + gMapObjectImageAnim_8370D7C +}; + +const union AnimCmd *const gMapObjectImageAnimTable_FieldMove[] = { + gMapObjectImageAnim_8370BEC +}; + +const union AnimCmd *const gMapObjectImageAnimTable_BerryTree[] = { + gMapObjectImageAnim_8370D34, + gMapObjectImageAnim_8370D3C, + gMapObjectImageAnim_8370D48, + gMapObjectImageAnim_8370D54, + gMapObjectImageAnim_8370D68 +}; + +const union AnimCmd *const gMapObjectImageAnimTable_BreakableRock[] = { + gMapObjectImageAnim_83708C8, + gMapObjectImageAnim_8370D8C +}; + +const union AnimCmd *const gMapObjectImageAnimTable_CuttableTree[] = { + gMapObjectImageAnim_83708C8, + gMapObjectImageAnim_8370DA0 +}; + +const union AnimCmd *const gMapObjectImageAnimTable_Fishing[] = { + gMapObjectImageAnim_8370DB4, + gMapObjectImageAnim_8370DC8, + gMapObjectImageAnim_8370DDC, + gMapObjectImageAnim_8370DF0, + gMapObjectImageAnim_8370E04, + gMapObjectImageAnim_8370E18, + gMapObjectImageAnim_8370E2C, + gMapObjectImageAnim_8370E40, + gMapObjectImageAnim_8370E54, + gMapObjectImageAnim_8370E68, + gMapObjectImageAnim_8370E7C, + gMapObjectImageAnim_8370E90 +}; + +const union AffineAnimCmd *const gMapObjectRotScalAnimTable_KyogreGroudon[] = { + gMapObjectRotScalAnim_8370EA4, + gMapObjectRotScalAnim_8370ED4 +}; + +#endif //POKERUBY_MAP_OBJECT_ANIMS_H diff --git a/src/data/field_map_obj/map_object_graphics_info.h b/src/data/field_map_obj/map_object_graphics_info.h new file mode 100644 index 000000000..7b021b66d --- /dev/null +++ b/src/data/field_map_obj/map_object_graphics_info.h @@ -0,0 +1,227 @@ +// + +// + +#ifndef POKERUBY_MAP_OBJECT_GRAPHICS_INFO_H +#define POKERUBY_MAP_OBJECT_GRAPHICS_INFO_H + +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BrendanNormal = {0xffff, 0x1100, 0x1102, 512, 16, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_BrendanMayNormal, gMapObjectPicTable_BrendanNormal, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BrendanMachBike = {0xffff, 0x1100, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_BrendanMachBike, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BrendanAcroBike = {0xffff, 0x1100, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_AcroBike, gMapObjectPicTable_BrendanAcroBike, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BrendanSurfing = {0xffff, 0x1100, 0x11ff, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Surfing, gMapObjectPicTable_BrendanSurfing, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BrendanFieldMove = {0xffff, 0x1100, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_FieldMove, gMapObjectPicTable_BrendanFieldMove, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_QuintyPlump = {0xffff, 0x110b, 0x11ff, 512, 32, 32, 10, SHADOW_SIZE_L, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_QuintyPlump, gMapObjectPicTable_QuintyPlump, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_LittleBoy1 = {0xffff, 0x1103, 0x11ff, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_LittleBoy1, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_LittleGirl1 = {0xffff, 0x1104, 0x11ff, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_LittleGirl1, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Boy1 = {0xffff, 0x1105, 0x11ff, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Boy1, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Girl1 = {0xffff, 0x1104, 0x11ff, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Girl1, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Boy2 = {0xffff, 0x1103, 0x11ff, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Boy2, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Girl2 = {0xffff, 0x1105, 0x11ff, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Girl2, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_LittleBoy2 = {0xffff, 0x1106, 0x11ff, 128, 16, 16, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_LittleBoy2, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_LittleGirl2 = {0xffff, 0x1104, 0x11ff, 128, 16, 16, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_LittleGirl2, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Boy3 = {0xffff, 0x1106, 0x11ff, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Boy3, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Girl3 = {0xffff, 0x1104, 0x11ff, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Girl3, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Boy4 = {0xffff, 0x1105, 0x11ff, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Boy4, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Woman1 = {0xffff, 0x1103, 0x11ff, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Woman1, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_FatMan = {0xffff, 0x1103, 0x11ff, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_FatMan, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Woman2 = {0xffff, 0x1104, 0x11ff, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Woman2, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Man1 = {0xffff, 0x1105, 0x11ff, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Man1, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Woman3 = {0xffff, 0x1105, 0x11ff, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Woman3, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_OldMan1 = {0xffff, 0x1106, 0x11ff, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_OldMan1, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_OldWoman1 = {0xffff, 0x1106, 0x11ff, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_OldWoman1, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Man2 = {0xffff, 0x1105, 0x11ff, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Man2, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Woman4 = {0xffff, 0x1104, 0x11ff, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Woman4, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Man3 = {0xffff, 0x1104, 0x11ff, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Man3, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Woman5 = {0xffff, 0x1103, 0x11ff, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Woman5, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Cook = {0xffff, 0x1105, 0x11ff, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Cook, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Woman6 = {0xffff, 0x1105, 0x11ff, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Woman6, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_OldMan2 = {0xffff, 0x1106, 0x11ff, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_OldMan2, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_OldWoman2 = {0xffff, 0x1105, 0x11ff, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_OldWoman2, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Camper = {0xffff, 0x1105, 0x11ff, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Camper, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Picnicker = {0xffff, 0x1105, 0x11ff, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Picnicker, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Man4 = {0xffff, 0x1104, 0x11ff, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Man4, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Woman7 = {0xffff, 0x1104, 0x11ff, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Woman7, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Youngster = {0xffff, 0x1103, 0x11ff, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Youngster, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BugCatcher = {0xffff, 0x1103, 0x11ff, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_BugCatcher, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_PsychicM = {0xffff, 0x1106, 0x11ff, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_PsychicM, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_SchoolKidM = {0xffff, 0x1103, 0x11ff, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_SchoolKidM, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Maniac = {0xffff, 0x1106, 0x11ff, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Maniac, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_HexManiac = {0xffff, 0x1106, 0x11ff, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_HexManiac, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Woman8 = {0xffff, 0x1105, 0x11ff, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Woman8, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_SwimmerM = {0xffff, 0x1103, 0x11ff, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_SwimmerM, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_SwimmerF = {0xffff, 0x1104, 0x11ff, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_SwimmerF, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BlackBelt = {0xffff, 0x1105, 0x11ff, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_BlackBelt, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Beauty = {0xffff, 0x1105, 0x11ff, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Beauty, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Scientist1 = {0xffff, 0x1105, 0x11ff, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Scientist1, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Lass = {0xffff, 0x1106, 0x11ff, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Lass, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Gentleman = {0xffff, 0x1105, 0x11ff, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Gentleman, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Sailor = {0xffff, 0x1103, 0x11ff, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Sailor, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Fisherman = {0xffff, 0x1104, 0x11ff, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Fisherman, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_RunningTriathleteM = {0xffff, 0x1106, 0x11ff, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_RunningTriathleteM, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_RunningTriathleteF = {0xffff, 0x1104, 0x11ff, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_RunningTriathleteF, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_TuberF = {0xffff, 0x1103, 0x11ff, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_TuberF, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_TuberM = {0xffff, 0x1104, 0x11ff, 128, 16, 16, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_TuberM, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Hiker = {0xffff, 0x1103, 0x11ff, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Hiker, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_CyclingTriathleteM = {0xffff, 0x1105, 0x11ff, 512, 32, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_AcroBike, gMapObjectPicTable_CyclingTriathleteM, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_CyclingTriathleteF = {0xffff, 0x1103, 0x11ff, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_AcroBike, gMapObjectPicTable_CyclingTriathleteF, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Nurse = {0xffff, 0x1103, 0x11ff, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Nurse, gMapObjectPicTable_Nurse, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_ItemBall = {0xffff, 0x1105, 0x11ff, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_ItemBall, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BerryTree = {0xffff, 0x1103, 0x11ff, 256, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, NULL, gMapObjectImageAnimTable_BerryTree, gMapObjectPicTable_PechaBerryTree, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BerryTreeEarlyStages = {0xffff, 0x1103, 0x11ff, 256, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_BerryTree, gMapObjectPicTable_PechaBerryTree, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BerryTreeLateStages = {0xffff, 0x1103, 0x11ff, 256, 16, 32, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_BerryTree, gMapObjectPicTable_PechaBerryTree, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_ProfBirch = {0xffff, 0x1105, 0x11ff, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_ProfBirch, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Man5 = {0xffff, 0x1106, 0x11ff, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Man5, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Man6 = {0xffff, 0x1104, 0x11ff, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Man6, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_ReporterM = {0xffff, 0x1106, 0x11ff, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_ReporterM, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_ReporterF = {0xffff, 0x1106, 0x11ff, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_ReporterF, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Bard = {0xffff, 0x1103, 0x11ff, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_MauvilleOldMan1, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Hipster = {0xffff, 0x1104, 0x11ff, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_MauvilleOldMan1, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Trader = {0xffff, 0x1105, 0x11ff, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_MauvilleOldMan1, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Storyteller = {0xffff, 0x1103, 0x11ff, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_MauvilleOldMan2, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Giddy = {0xffff, 0x1104, 0x11ff, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_MauvilleOldMan2, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_UnusedMauvilleOldMan1 = {0xffff, 0x1105, 0x11ff, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_MauvilleOldMan2, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_UnusedMauvilleOldMan2 = {0xffff, 0x1106, 0x11ff, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_MauvilleOldMan2, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_UnusedNatuDoll = {0xffff, 0x1105, 0x11ff, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_UnusedNatuDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_UnusedMagnemiteDoll = {0xffff, 0x1105, 0x11ff, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_UnusedMagnemiteDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_UnusedSquirtleDoll = {0xffff, 0x1103, 0x11ff, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_UnusedSquirtleDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_UnusedWooperDoll = {0xffff, 0x1105, 0x11ff, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_UnusedWooperDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_UnusedPikachuDoll = {0xffff, 0x1104, 0x11ff, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_UnusedPikachuDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_UnusedPorygon2Doll = {0xffff, 0x1103, 0x11ff, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_UnusedPorygon2Doll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_CuttableTree = {0xffff, 0x1105, 0x11ff, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_CuttableTree, gMapObjectPicTable_CuttableTree, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MartEmployee = {0xffff, 0x1103, 0x11ff, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_MartEmployee, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_RooftopSaleWoman = {0xffff, 0x1103, 0x11ff, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_RooftopSaleWoman, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Teala = {0xffff, 0x1103, 0x11ff, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Teala, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BreakableRock = {0xffff, 0x1103, 0x11ff, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_BreakableRock, gMapObjectPicTable_BreakableRock, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_PushableBoulder = {0xffff, 0x1103, 0x11ff, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_PushableBoulder, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MrBrineysBoat = {0xffff, 0x1105, 0x11ff, 512, 32, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_MrBrineysBoat, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MayNormal = {0xffff, 0x1110, 0x1102, 512, 16, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_BrendanMayNormal, gMapObjectPicTable_MayNormal, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MayMachBike = {0xffff, 0x1110, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_MayMachBike, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MayAcroBike = {0xffff, 0x1110, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_AcroBike, gMapObjectPicTable_MayAcroBike, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MaySurfing = {0xffff, 0x1110, 0x11ff, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Surfing, gMapObjectPicTable_MaySurfing, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MayFieldMove = {0xffff, 0x1110, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_FieldMove, gMapObjectPicTable_MayFieldMove, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Truck = {0xffff, 0x110d, 0x11ff, 1152, 48, 48, 10, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_32x32, gMapObjectSubspriteTables_Truck, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_Truck, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MachokeCarryingBox = {0xffff, 0x110e, 0x11ff, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_MachokeCarryingBox, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MachokeFacingAway = {0xffff, 0x110e, 0x11ff, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_MachokeFacingAway, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BirchsBag = {0xffff, 0x1104, 0x11ff, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_BirchsBag, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Poochyena = {0xffff, 0x110f, 0x11ff, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Poochyena, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Artist = {0xffff, 0x1106, 0x11ff, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Artist, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_RivalBrendanNormal = {0xffff, 0x1100, 0x1102, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_BrendanMayNormal, gMapObjectPicTable_BrendanNormal, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_RivalBrendanMachBike = {0xffff, 0x1100, 0x1102, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_BrendanMachBike, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_RivalBrendanAcroBike = {0xffff, 0x1100, 0x1102, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_AcroBike, gMapObjectPicTable_BrendanAcroBike, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_RivalBrendanSurfing = {0xffff, 0x1100, 0x11ff, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Surfing, gMapObjectPicTable_BrendanSurfing, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_RivalBrendanFieldMove = {0xffff, 0x1100, 0x1102, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_FieldMove, gMapObjectPicTable_BrendanFieldMove, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_RivalMayNormal = {0xffff, 0x1110, 0x1102, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_BrendanMayNormal, gMapObjectPicTable_MayNormal, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_RivalMayMachBike = {0xffff, 0x1110, 0x1102, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_MayMachBike, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_RivalMayAcroBike = {0xffff, 0x1110, 0x1102, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_AcroBike, gMapObjectPicTable_MayAcroBike, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_RivalMaySurfing = {0xffff, 0x1110, 0x11ff, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Surfing, gMapObjectPicTable_MaySurfing, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_RivalMayFieldMove = {0xffff, 0x1110, 0x1102, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_FieldMove, gMapObjectPicTable_MayFieldMove, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Cameraman = {0xffff, 0x1106, 0x11ff, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Cameraman, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BrendanUnderwater = {0xffff, 0x1115, 0x11ff, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_BrendanUnderwater, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MayUnderwater = {0xffff, 0x1115, 0x11ff, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_MayUnderwater, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MovingBox = {0xffff, 0x1112, 0x11ff, 128, 16, 16, 10, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_MovingBox, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_CableCar = {0xffff, 0x1113, 0x11ff, 2048, 64, 64, 10, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_64x64, gMapObjectSubspriteTables_CableCar, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_CableCar, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Scientist2 = {0xffff, 0x1103, 0x11ff, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Scientist2, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Man7 = {0xffff, 0x1104, 0x11ff, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Man7, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_AquaMemberM = {0xffff, 0x1106, 0x11ff, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_AquaMemberM, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_AquaMemberF = {0xffff, 0x1106, 0x11ff, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_AquaMemberF, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MagmaMemberM = {0xffff, 0x1104, 0x11ff, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_MagmaMemberM, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MagmaMemberF = {0xffff, 0x1104, 0x11ff, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_MagmaMemberF, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Sidney = {0xffff, 0x1104, 0x11ff, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Sidney, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Phoebe = {0xffff, 0x1103, 0x11ff, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Phoebe, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Glacia = {0xffff, 0x1104, 0x11ff, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Glacia, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Drake = {0xffff, 0x1105, 0x11ff, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Drake, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Roxanne = {0xffff, 0x1103, 0x11ff, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Roxanne, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Brawly = {0xffff, 0x1105, 0x11ff, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Brawly, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Wattson = {0xffff, 0x1104, 0x11ff, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Wattson, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Flannery = {0xffff, 0x1103, 0x11ff, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Flannery, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Norman = {0xffff, 0x1106, 0x11ff, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Norman, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Winona = {0xffff, 0x1106, 0x11ff, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Winona, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Liza = {0xffff, 0x1103, 0x11ff, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Liza, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Tate = {0xffff, 0x1103, 0x11ff, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Tate, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Wallace = {0xffff, 0x1106, 0x11ff, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Wallace, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Steven = {0xffff, 0x1106, 0x11ff, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Steven, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Wally = {0xffff, 0x1103, 0x11ff, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Wally, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_LittleBoy3 = {0xffff, 0x1103, 0x11ff, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_LittleBoy3, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BrendanFishing = {0xffff, 0x1100, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Fishing, gMapObjectPicTable_BrendanFishing, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MayFishing = {0xffff, 0x1110, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Fishing, gMapObjectPicTable_MayFishing, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_HotSpringsOldWoman = {0xffff, 0x1106, 0x11ff, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_HotSpringsOldWoman, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_SSTidal = {0xffff, 0x1114, 0x11ff, 1920, 96, 40, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gFieldOamData_8x8, gMapObjectSubspriteTables_SSTidal, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_SSTidal, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_SubmarineShadow = {0xffff, 0x111a, 0x11ff, 1408, 88, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gFieldOamData_8x8, gMapObjectSubspriteTables_SubmarineShadow, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_SubmarineShadow, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_PichuDoll = {0xffff, 0x1104, 0x11ff, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_PichuDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_PikachuDoll = {0xffff, 0x1104, 0x11ff, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_PikachuDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MarillDoll = {0xffff, 0x1103, 0x11ff, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_MarillDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_TogepiDoll = {0xffff, 0x1105, 0x11ff, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_TogepiDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_CyndaquilDoll = {0xffff, 0x1106, 0x11ff, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_CyndaquilDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_ChikoritaDoll = {0xffff, 0x1105, 0x11ff, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_ChikoritaDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_TotodileDoll = {0xffff, 0x1103, 0x11ff, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_TotodileDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_JigglypuffDoll = {0xffff, 0x1103, 0x11ff, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_JigglypuffDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MeowthDoll = {0xffff, 0x1104, 0x11ff, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_MeowthDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_ClefairyDoll = {0xffff, 0x1103, 0x11ff, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_ClefairyDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_DittoDoll = {0xffff, 0x1106, 0x11ff, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_DittoDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_SmoochumDoll = {0xffff, 0x1106, 0x11ff, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_SmoochumDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_TreeckoDoll = {0xffff, 0x1105, 0x11ff, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_TreeckoDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_TorchicDoll = {0xffff, 0x1104, 0x11ff, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_TorchicDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MudkipDoll = {0xffff, 0x1103, 0x11ff, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_MudkipDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_DuskullDoll = {0xffff, 0x1106, 0x11ff, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_DuskullDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_WynautDoll = {0xffff, 0x1103, 0x11ff, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_WynautDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BaltoyDoll = {0xffff, 0x1103, 0x11ff, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_BaltoyDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_KecleonDoll = {0xffff, 0x1105, 0x11ff, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_KecleonDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_AzurillDoll = {0xffff, 0x1103, 0x11ff, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_AzurillDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_SkittyDoll = {0xffff, 0x1103, 0x11ff, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_SkittyDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_SwabluDoll = {0xffff, 0x1103, 0x11ff, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_SwabluDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_GulpinDoll = {0xffff, 0x1105, 0x11ff, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_GulpinDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_LotadDoll = {0xffff, 0x1105, 0x11ff, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_LotadDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_SeedotDoll = {0xffff, 0x1105, 0x11ff, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_SeedotDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_PikaCushion = {0xffff, 0x1104, 0x11ff, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_PikaCushion, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_RoundCushion = {0xffff, 0x1103, 0x11ff, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_RoundCushion, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_KissCushion = {0xffff, 0x1106, 0x11ff, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_KissCushion, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_ZigzagCushion = {0xffff, 0x1103, 0x11ff, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_ZigzagCushion, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_SpinCushion = {0xffff, 0x1103, 0x11ff, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_SpinCushion, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_DiamondCushion = {0xffff, 0x1106, 0x11ff, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_DiamondCushion, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BallCushion = {0xffff, 0x1105, 0x11ff, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_BallCushion, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_GrassCushion = {0xffff, 0x1105, 0x11ff, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_GrassCushion, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_FireCushion = {0xffff, 0x1104, 0x11ff, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_FireCushion, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_WaterCushion = {0xffff, 0x1103, 0x11ff, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_WaterCushion, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BigSnorlaxDoll = {0xffff, 0x1106, 0x11ff, 512, 32, 32, 5, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_BigSnorlaxDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BigRhydonDoll = {0xffff, 0x1106, 0x11ff, 512, 32, 32, 5, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_BigRhydonDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BigLaprasDoll = {0xffff, 0x1103, 0x11ff, 512, 32, 32, 2, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_BigLaprasDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BigVenusaurDoll = {0xffff, 0x1105, 0x11ff, 512, 32, 32, 4, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_BigVenusaurDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BigCharizardDoll = {0xffff, 0x1104, 0x11ff, 512, 32, 32, 3, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_BigCharizardDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BigBlastoiseDoll = {0xffff, 0x1103, 0x11ff, 512, 32, 32, 2, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_BigBlastoiseDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BigWailmerDoll = {0xffff, 0x1106, 0x11ff, 512, 32, 32, 5, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_BigWailmerDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BigRegirockDoll = {0xffff, 0x1103, 0x11ff, 512, 32, 32, 2, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_BigRegirockDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BigRegiceDoll = {0xffff, 0x1105, 0x11ff, 512, 32, 32, 4, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_BigRegiceDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BigRegisteelDoll = {0xffff, 0x1106, 0x11ff, 512, 32, 32, 5, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_BigRegisteelDoll, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Latias = {0xffff, 0x1104, 0x11ff, 512, 32, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_LatiasLatios, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Latios = {0xffff, 0x1103, 0x11ff, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_LatiasLatios, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Boy5 = {0xffff, 0x1105, 0x11ff, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Boy5, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_ContestJudge = {0xffff, 0x1105, 0x11ff, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_ContestJudge, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BrendanWatering = {0xffff, 0x1100, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_BrendanWatering, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MayWatering = {0xffff, 0x1110, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_MayWatering, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BrendanDecorating = {0xffff, 0x1100, 0x1102, 256, 16, 32, 10, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_BrendanDecorating, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MayDecorating = {0xffff, 0x1110, 0x1102, 256, 16, 32, 10, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_MayDecorating, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Archie = {0xffff, 0x1103, 0x11ff, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Archie, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Maxie = {0xffff, 0x1104, 0x11ff, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Maxie, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Kyogre1 = {0xffff, 0x1106, 0x11ff, 512, 32, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Kyogre, gMapObjectRotScalAnimTable_KyogreGroudon}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Groudon1 = {0xffff, 0x1105, 0x11ff, 512, 32, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Groudon, gMapObjectRotScalAnimTable_KyogreGroudon}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Fossil = {0xffff, 0x1103, 0x11ff, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Inanimate, gMapObjectPicTable_Fossil, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Regirock = {0xffff, 0x1104, 0x11ff, 512, 32, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Regi, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Regice = {0xffff, 0x1105, 0x11ff, 512, 32, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Regi, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Registeel = {0xffff, 0x1106, 0x11ff, 512, 32, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Regi, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Skitty = {0xffff, 0x1103, 0x11ff, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Skitty, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Kecleon1 = {0xffff, 0x1105, 0x11ff, 128, 16, 16, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Kecleon, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Kyogre2 = {0xffff, 0x1116, 0x11ff, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Kyogre, gMapObjectRotScalAnimTable_KyogreGroudon}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Groudon2 = {0xffff, 0x1118, 0x11ff, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Groudon, gMapObjectRotScalAnimTable_KyogreGroudon}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Rayquaza = {0xffff, 0x1105, 0x11ff, 512, 32, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_32x32, gMapObjectSubspriteTables_32x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Rayquaza, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Zigzagoon = {0xffff, 0x1103, 0x11ff, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Zigzagoon, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Pikachu = {0xffff, 0x1104, 0x11ff, 128, 16, 16, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Pikachu, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Azumarill = {0xffff, 0x1103, 0x11ff, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Azumarill, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Wingull = {0xffff, 0x1103, 0x11ff, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Wingull, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Kecleon2 = {0xffff, 0x1105, 0x1102, 128, 16, 16, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Kecleon, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_TuberMSwimming = {0xffff, 0x1104, 0x11ff, 128, 16, 16, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_TuberMSwimming, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Azurill = {0xffff, 0x1103, 0x11ff, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x16, gMapObjectSubspriteTables_16x16, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Azurill, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Mom = {0xffff, 0x1106, 0x11ff, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_Standard, gMapObjectPicTable_Mom, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_LinkBrendan = {0xffff, 0x1110, 0x1102, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_BrendanMayNormal, gMapObjectPicTable_BrendanNormal, gDummySpriteAffineAnimTable}; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_LinkMay = {0xffff, 0x1110, 0x1102, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gFieldOamData_16x32, gMapObjectSubspriteTables_16x32, gMapObjectImageAnimTable_BrendanMayNormal, gMapObjectPicTable_MayNormal, gDummySpriteAffineAnimTable}; + +#endif //POKERUBY_MAP_OBJECT_GRAPHICS_INFO_H diff --git a/src/data/field_map_obj/map_object_graphics_info_pointers.h b/src/data/field_map_obj/map_object_graphics_info_pointers.h new file mode 100644 index 000000000..22a052b0d --- /dev/null +++ b/src/data/field_map_obj/map_object_graphics_info_pointers.h @@ -0,0 +1,448 @@ +// + +// + +#ifndef POKERUBY_MAP_OBJECT_GRAPHICS_INFO_POINTERS_H +#define POKERUBY_MAP_OBJECT_GRAPHICS_INFO_POINTERS_H + +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BrendanNormal; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BrendanMachBike; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BrendanSurfing; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BrendanFieldMove; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_QuintyPlump; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_LittleBoy1; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_LittleGirl1; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Boy1; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Girl1; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Boy2; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Girl2; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_LittleBoy2; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_LittleGirl2; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Boy3; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Girl3; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Boy4; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Woman1; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_FatMan; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Woman2; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Man1; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Woman3; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_OldMan1; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_OldWoman1; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Man2; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Woman4; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Man3; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Woman5; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Cook; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Woman6; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_OldMan2; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_OldWoman2; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Camper; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Picnicker; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Man4; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Woman7; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Youngster; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BugCatcher; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_PsychicM; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_SchoolKidM; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Maniac; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_HexManiac; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Woman8; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_SwimmerM; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_SwimmerF; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BlackBelt; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Beauty; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Scientist1; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Lass; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Gentleman; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Sailor; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Fisherman; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_RunningTriathleteM; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_RunningTriathleteF; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_TuberF; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_TuberM; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Hiker; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_CyclingTriathleteM; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_CyclingTriathleteF; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Nurse; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_ItemBall; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BerryTree; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BerryTreeEarlyStages; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BerryTreeLateStages; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BrendanAcroBike; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_ProfBirch; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Man5; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Man6; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_ReporterM; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_ReporterF; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Bard; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Hipster; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Trader; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Storyteller; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Giddy; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_UnusedMauvilleOldMan1; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_UnusedMauvilleOldMan2; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_UnusedNatuDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_UnusedMagnemiteDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_UnusedSquirtleDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_UnusedWooperDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_UnusedPikachuDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_UnusedPorygon2Doll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_CuttableTree; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MartEmployee; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_RooftopSaleWoman; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Teala; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BreakableRock; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_PushableBoulder; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MrBrineysBoat; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MayNormal; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MayMachBike; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MayAcroBike; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MaySurfing; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MayFieldMove; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Truck; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MachokeCarryingBox; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MachokeFacingAway; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BirchsBag; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Poochyena; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Artist; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_RivalBrendanNormal; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_RivalBrendanMachBike; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_RivalBrendanAcroBike; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_RivalBrendanSurfing; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_RivalBrendanFieldMove; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_RivalMayNormal; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_RivalMayMachBike; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_RivalMayAcroBike; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_RivalMaySurfing; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_RivalMayFieldMove; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Cameraman; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BrendanUnderwater; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MayUnderwater; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MovingBox; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_CableCar; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Scientist2; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Man7; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_AquaMemberM; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_AquaMemberF; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MagmaMemberM; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MagmaMemberF; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Sidney; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Phoebe; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Glacia; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Drake; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Roxanne; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Brawly; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Wattson; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Flannery; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Norman; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Winona; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Liza; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Tate; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Wallace; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Steven; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Wally; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_LittleBoy3; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BrendanFishing; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MayFishing; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_HotSpringsOldWoman; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_SSTidal; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_SubmarineShadow; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_PichuDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_PikachuDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MarillDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_TogepiDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_CyndaquilDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_ChikoritaDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_TotodileDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_JigglypuffDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MeowthDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_ClefairyDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_DittoDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_SmoochumDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_TreeckoDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_TorchicDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MudkipDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_DuskullDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_WynautDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BaltoyDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_KecleonDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_AzurillDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_SkittyDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_SwabluDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_GulpinDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_LotadDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_SeedotDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_PikaCushion; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_RoundCushion; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_KissCushion; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_ZigzagCushion; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_SpinCushion; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_DiamondCushion; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BallCushion; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_GrassCushion; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_FireCushion; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_WaterCushion; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BigSnorlaxDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BigRhydonDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BigLaprasDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BigVenusaurDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BigCharizardDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BigBlastoiseDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BigWailmerDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BigRegirockDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BigRegiceDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BigRegisteelDoll; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Latias; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Latios; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Boy5; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_ContestJudge; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BrendanWatering; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MayWatering; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_BrendanDecorating; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_MayDecorating; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Archie; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Maxie; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Kyogre1; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Groudon1; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Fossil; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Regirock; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Regice; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Registeel; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Skitty; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Kecleon1; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Kyogre2; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Groudon2; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Rayquaza; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Zigzagoon; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Pikachu; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Azumarill; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Wingull; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Kecleon2; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_TuberMSwimming; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Azurill; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_Mom; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_LinkBrendan; +const struct MapObjectGraphicsInfo gMapObjectGraphicsInfo_LinkMay; + +const struct MapObjectGraphicsInfo *const gMapObjectGraphicsInfoPointers[] = { + &gMapObjectGraphicsInfo_BrendanNormal, + &gMapObjectGraphicsInfo_BrendanMachBike, + &gMapObjectGraphicsInfo_BrendanSurfing, + &gMapObjectGraphicsInfo_BrendanFieldMove, + &gMapObjectGraphicsInfo_QuintyPlump, + &gMapObjectGraphicsInfo_LittleBoy1, + &gMapObjectGraphicsInfo_LittleGirl1, + &gMapObjectGraphicsInfo_Boy1, + &gMapObjectGraphicsInfo_Girl1, + &gMapObjectGraphicsInfo_Boy2, + &gMapObjectGraphicsInfo_Girl2, + &gMapObjectGraphicsInfo_LittleBoy2, + &gMapObjectGraphicsInfo_LittleGirl2, + &gMapObjectGraphicsInfo_Boy3, + &gMapObjectGraphicsInfo_Girl3, + &gMapObjectGraphicsInfo_Boy4, + &gMapObjectGraphicsInfo_Woman1, + &gMapObjectGraphicsInfo_FatMan, + &gMapObjectGraphicsInfo_Woman2, + &gMapObjectGraphicsInfo_Man1, + &gMapObjectGraphicsInfo_Woman3, + &gMapObjectGraphicsInfo_OldMan1, + &gMapObjectGraphicsInfo_OldWoman1, + &gMapObjectGraphicsInfo_Man2, + &gMapObjectGraphicsInfo_Woman4, + &gMapObjectGraphicsInfo_Man3, + &gMapObjectGraphicsInfo_Woman5, + &gMapObjectGraphicsInfo_Cook, + &gMapObjectGraphicsInfo_Woman6, + &gMapObjectGraphicsInfo_OldMan2, + &gMapObjectGraphicsInfo_OldWoman2, + &gMapObjectGraphicsInfo_Camper, + &gMapObjectGraphicsInfo_Picnicker, + &gMapObjectGraphicsInfo_Man4, + &gMapObjectGraphicsInfo_Woman7, + &gMapObjectGraphicsInfo_Youngster, + &gMapObjectGraphicsInfo_BugCatcher, + &gMapObjectGraphicsInfo_PsychicM, + &gMapObjectGraphicsInfo_SchoolKidM, + &gMapObjectGraphicsInfo_Maniac, + &gMapObjectGraphicsInfo_HexManiac, + &gMapObjectGraphicsInfo_Woman8, + &gMapObjectGraphicsInfo_SwimmerM, + &gMapObjectGraphicsInfo_SwimmerF, + &gMapObjectGraphicsInfo_BlackBelt, + &gMapObjectGraphicsInfo_Beauty, + &gMapObjectGraphicsInfo_Scientist1, + &gMapObjectGraphicsInfo_Lass, + &gMapObjectGraphicsInfo_Gentleman, + &gMapObjectGraphicsInfo_Sailor, + &gMapObjectGraphicsInfo_Fisherman, + &gMapObjectGraphicsInfo_RunningTriathleteM, + &gMapObjectGraphicsInfo_RunningTriathleteF, + &gMapObjectGraphicsInfo_TuberF, + &gMapObjectGraphicsInfo_TuberM, + &gMapObjectGraphicsInfo_Hiker, + &gMapObjectGraphicsInfo_CyclingTriathleteM, + &gMapObjectGraphicsInfo_CyclingTriathleteF, + &gMapObjectGraphicsInfo_Nurse, + &gMapObjectGraphicsInfo_ItemBall, + &gMapObjectGraphicsInfo_BerryTree, + &gMapObjectGraphicsInfo_BerryTreeEarlyStages, + &gMapObjectGraphicsInfo_BerryTreeLateStages, + &gMapObjectGraphicsInfo_BrendanAcroBike, + &gMapObjectGraphicsInfo_ProfBirch, + &gMapObjectGraphicsInfo_Man5, + &gMapObjectGraphicsInfo_Man6, + &gMapObjectGraphicsInfo_ReporterM, + &gMapObjectGraphicsInfo_ReporterF, + &gMapObjectGraphicsInfo_Bard, + &gMapObjectGraphicsInfo_Hipster, + &gMapObjectGraphicsInfo_Trader, + &gMapObjectGraphicsInfo_Storyteller, + &gMapObjectGraphicsInfo_Giddy, + &gMapObjectGraphicsInfo_UnusedMauvilleOldMan1, + &gMapObjectGraphicsInfo_UnusedMauvilleOldMan2, + &gMapObjectGraphicsInfo_UnusedNatuDoll, + &gMapObjectGraphicsInfo_UnusedMagnemiteDoll, + &gMapObjectGraphicsInfo_UnusedSquirtleDoll, + &gMapObjectGraphicsInfo_UnusedWooperDoll, + &gMapObjectGraphicsInfo_UnusedPikachuDoll, + &gMapObjectGraphicsInfo_UnusedPorygon2Doll, + &gMapObjectGraphicsInfo_CuttableTree, + &gMapObjectGraphicsInfo_MartEmployee, + &gMapObjectGraphicsInfo_RooftopSaleWoman, + &gMapObjectGraphicsInfo_Teala, + &gMapObjectGraphicsInfo_BreakableRock, + &gMapObjectGraphicsInfo_PushableBoulder, + &gMapObjectGraphicsInfo_MrBrineysBoat, + &gMapObjectGraphicsInfo_MayNormal, + &gMapObjectGraphicsInfo_MayMachBike, + &gMapObjectGraphicsInfo_MayAcroBike, + &gMapObjectGraphicsInfo_MaySurfing, + &gMapObjectGraphicsInfo_MayFieldMove, + &gMapObjectGraphicsInfo_Truck, + &gMapObjectGraphicsInfo_MachokeCarryingBox, + &gMapObjectGraphicsInfo_MachokeFacingAway, + &gMapObjectGraphicsInfo_BirchsBag, + &gMapObjectGraphicsInfo_Poochyena, + &gMapObjectGraphicsInfo_Artist, + &gMapObjectGraphicsInfo_RivalBrendanNormal, + &gMapObjectGraphicsInfo_RivalBrendanMachBike, + &gMapObjectGraphicsInfo_RivalBrendanAcroBike, + &gMapObjectGraphicsInfo_RivalBrendanSurfing, + &gMapObjectGraphicsInfo_RivalBrendanFieldMove, + &gMapObjectGraphicsInfo_RivalMayNormal, + &gMapObjectGraphicsInfo_RivalMayMachBike, + &gMapObjectGraphicsInfo_RivalMayAcroBike, + &gMapObjectGraphicsInfo_RivalMaySurfing, + &gMapObjectGraphicsInfo_RivalMayFieldMove, + &gMapObjectGraphicsInfo_Cameraman, + &gMapObjectGraphicsInfo_BrendanUnderwater, + &gMapObjectGraphicsInfo_MayUnderwater, + &gMapObjectGraphicsInfo_MovingBox, + &gMapObjectGraphicsInfo_CableCar, + &gMapObjectGraphicsInfo_Scientist2, + &gMapObjectGraphicsInfo_Man7, + &gMapObjectGraphicsInfo_AquaMemberM, + &gMapObjectGraphicsInfo_AquaMemberF, + &gMapObjectGraphicsInfo_MagmaMemberM, + &gMapObjectGraphicsInfo_MagmaMemberF, + &gMapObjectGraphicsInfo_Sidney, + &gMapObjectGraphicsInfo_Phoebe, + &gMapObjectGraphicsInfo_Glacia, + &gMapObjectGraphicsInfo_Drake, + &gMapObjectGraphicsInfo_Roxanne, + &gMapObjectGraphicsInfo_Brawly, + &gMapObjectGraphicsInfo_Wattson, + &gMapObjectGraphicsInfo_Flannery, + &gMapObjectGraphicsInfo_Norman, + &gMapObjectGraphicsInfo_Winona, + &gMapObjectGraphicsInfo_Liza, + &gMapObjectGraphicsInfo_Tate, + &gMapObjectGraphicsInfo_Wallace, + &gMapObjectGraphicsInfo_Steven, + &gMapObjectGraphicsInfo_Wally, + &gMapObjectGraphicsInfo_LittleBoy3, + &gMapObjectGraphicsInfo_BrendanFishing, + &gMapObjectGraphicsInfo_MayFishing, + &gMapObjectGraphicsInfo_HotSpringsOldWoman, + &gMapObjectGraphicsInfo_SSTidal, + &gMapObjectGraphicsInfo_SubmarineShadow, + &gMapObjectGraphicsInfo_PichuDoll, + &gMapObjectGraphicsInfo_PikachuDoll, + &gMapObjectGraphicsInfo_MarillDoll, + &gMapObjectGraphicsInfo_TogepiDoll, + &gMapObjectGraphicsInfo_CyndaquilDoll, + &gMapObjectGraphicsInfo_ChikoritaDoll, + &gMapObjectGraphicsInfo_TotodileDoll, + &gMapObjectGraphicsInfo_JigglypuffDoll, + &gMapObjectGraphicsInfo_MeowthDoll, + &gMapObjectGraphicsInfo_ClefairyDoll, + &gMapObjectGraphicsInfo_DittoDoll, + &gMapObjectGraphicsInfo_SmoochumDoll, + &gMapObjectGraphicsInfo_TreeckoDoll, + &gMapObjectGraphicsInfo_TorchicDoll, + &gMapObjectGraphicsInfo_MudkipDoll, + &gMapObjectGraphicsInfo_DuskullDoll, + &gMapObjectGraphicsInfo_WynautDoll, + &gMapObjectGraphicsInfo_BaltoyDoll, + &gMapObjectGraphicsInfo_KecleonDoll, + &gMapObjectGraphicsInfo_AzurillDoll, + &gMapObjectGraphicsInfo_SkittyDoll, + &gMapObjectGraphicsInfo_SwabluDoll, + &gMapObjectGraphicsInfo_GulpinDoll, + &gMapObjectGraphicsInfo_LotadDoll, + &gMapObjectGraphicsInfo_SeedotDoll, + &gMapObjectGraphicsInfo_PikaCushion, + &gMapObjectGraphicsInfo_RoundCushion, + &gMapObjectGraphicsInfo_KissCushion, + &gMapObjectGraphicsInfo_ZigzagCushion, + &gMapObjectGraphicsInfo_SpinCushion, + &gMapObjectGraphicsInfo_DiamondCushion, + &gMapObjectGraphicsInfo_BallCushion, + &gMapObjectGraphicsInfo_GrassCushion, + &gMapObjectGraphicsInfo_FireCushion, + &gMapObjectGraphicsInfo_WaterCushion, + &gMapObjectGraphicsInfo_BigSnorlaxDoll, + &gMapObjectGraphicsInfo_BigRhydonDoll, + &gMapObjectGraphicsInfo_BigLaprasDoll, + &gMapObjectGraphicsInfo_BigVenusaurDoll, + &gMapObjectGraphicsInfo_BigCharizardDoll, + &gMapObjectGraphicsInfo_BigBlastoiseDoll, + &gMapObjectGraphicsInfo_BigWailmerDoll, + &gMapObjectGraphicsInfo_BigRegirockDoll, + &gMapObjectGraphicsInfo_BigRegiceDoll, + &gMapObjectGraphicsInfo_BigRegisteelDoll, + &gMapObjectGraphicsInfo_Latias, + &gMapObjectGraphicsInfo_Latios, + &gMapObjectGraphicsInfo_Boy5, + &gMapObjectGraphicsInfo_ContestJudge, + &gMapObjectGraphicsInfo_BrendanWatering, + &gMapObjectGraphicsInfo_MayWatering, + &gMapObjectGraphicsInfo_BrendanDecorating, + &gMapObjectGraphicsInfo_MayDecorating, + &gMapObjectGraphicsInfo_Archie, + &gMapObjectGraphicsInfo_Maxie, + &gMapObjectGraphicsInfo_Kyogre1, + &gMapObjectGraphicsInfo_Groudon1, + &gMapObjectGraphicsInfo_Fossil, + &gMapObjectGraphicsInfo_Regirock, + &gMapObjectGraphicsInfo_Regice, + &gMapObjectGraphicsInfo_Registeel, + &gMapObjectGraphicsInfo_Skitty, + &gMapObjectGraphicsInfo_Kecleon1, + &gMapObjectGraphicsInfo_Kyogre2, + &gMapObjectGraphicsInfo_Groudon2, + &gMapObjectGraphicsInfo_Rayquaza, + &gMapObjectGraphicsInfo_Zigzagoon, + &gMapObjectGraphicsInfo_Pikachu, + &gMapObjectGraphicsInfo_Azumarill, + &gMapObjectGraphicsInfo_Wingull, + &gMapObjectGraphicsInfo_Kecleon2, + &gMapObjectGraphicsInfo_TuberMSwimming, + &gMapObjectGraphicsInfo_Azurill, + &gMapObjectGraphicsInfo_Mom, + &gMapObjectGraphicsInfo_LinkBrendan, + &gMapObjectGraphicsInfo_LinkMay +}; + +#endif //POKERUBY_MAP_OBJECT_GRAPHICS_INFO_POINTERS_H diff --git a/src/data/field_map_obj/map_object_pic_tables.h b/src/data/field_map_obj/map_object_pic_tables.h new file mode 100644 index 000000000..ecb5c8836 --- /dev/null +++ b/src/data/field_map_obj/map_object_pic_tables.h @@ -0,0 +1,1879 @@ +// + +// + +#ifndef POKERUBY_MAP_OBJECT_PIC_TABLES_H +#define POKERUBY_MAP_OBJECT_PIC_TABLES_H + +const struct SpriteFrameImage gMapObjectPicTable_BrendanNormal[] = { + obj_frame_tiles(gMapObjectPic_BrendanNormal_0), + obj_frame_tiles(gMapObjectPic_BrendanNormal_1), + obj_frame_tiles(gMapObjectPic_BrendanNormal_2), + obj_frame_tiles(gMapObjectPic_BrendanNormal_3), + obj_frame_tiles(gMapObjectPic_BrendanNormal_4), + obj_frame_tiles(gMapObjectPic_BrendanNormal_5), + obj_frame_tiles(gMapObjectPic_BrendanNormal_6), + obj_frame_tiles(gMapObjectPic_BrendanNormal_7), + obj_frame_tiles(gMapObjectPic_BrendanNormal_8), + obj_frame_tiles(gMapObjectPic_BrendanNormal_9), + obj_frame_tiles(gMapObjectPic_BrendanNormal_10), + obj_frame_tiles(gMapObjectPic_BrendanNormal_11), + obj_frame_tiles(gMapObjectPic_BrendanNormal_12), + obj_frame_tiles(gMapObjectPic_BrendanNormal_13), + obj_frame_tiles(gMapObjectPic_BrendanNormal_14), + obj_frame_tiles(gMapObjectPic_BrendanNormal_15), + obj_frame_tiles(gMapObjectPic_BrendanNormal_16), + obj_frame_tiles(gMapObjectPic_BrendanNormal_17) +}; + +const struct SpriteFrameImage gMapObjectPicTable_BrendanMachBike[] = { + obj_frame_tiles(gMapObjectPic_BrendanMachBike_0), + obj_frame_tiles(gMapObjectPic_BrendanMachBike_1), + obj_frame_tiles(gMapObjectPic_BrendanMachBike_2), + obj_frame_tiles(gMapObjectPic_BrendanMachBike_3), + obj_frame_tiles(gMapObjectPic_BrendanMachBike_4), + obj_frame_tiles(gMapObjectPic_BrendanMachBike_5), + obj_frame_tiles(gMapObjectPic_BrendanMachBike_6), + obj_frame_tiles(gMapObjectPic_BrendanMachBike_7), + obj_frame_tiles(gMapObjectPic_BrendanMachBike_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_BrendanAcroBike[] = { + obj_frame_tiles(gMapObjectPic_BrendanAcroBike_0), + obj_frame_tiles(gMapObjectPic_BrendanAcroBike_1), + obj_frame_tiles(gMapObjectPic_BrendanAcroBike_2), + obj_frame_tiles(gMapObjectPic_BrendanAcroBike_3), + obj_frame_tiles(gMapObjectPic_BrendanAcroBike_4), + obj_frame_tiles(gMapObjectPic_BrendanAcroBike_5), + obj_frame_tiles(gMapObjectPic_BrendanAcroBike_6), + obj_frame_tiles(gMapObjectPic_BrendanAcroBike_7), + obj_frame_tiles(gMapObjectPic_BrendanAcroBike_8), + obj_frame_tiles(gMapObjectPic_BrendanAcroBike_9), + obj_frame_tiles(gMapObjectPic_BrendanAcroBike_10), + obj_frame_tiles(gMapObjectPic_BrendanAcroBike_11), + obj_frame_tiles(gMapObjectPic_BrendanAcroBike_12), + obj_frame_tiles(gMapObjectPic_BrendanAcroBike_13), + obj_frame_tiles(gMapObjectPic_BrendanAcroBike_14), + obj_frame_tiles(gMapObjectPic_BrendanAcroBike_15), + obj_frame_tiles(gMapObjectPic_BrendanAcroBike_16), + obj_frame_tiles(gMapObjectPic_BrendanAcroBike_17), + obj_frame_tiles(gMapObjectPic_BrendanAcroBike_18), + obj_frame_tiles(gMapObjectPic_BrendanAcroBike_19), + obj_frame_tiles(gMapObjectPic_BrendanAcroBike_20), + obj_frame_tiles(gMapObjectPic_BrendanAcroBike_21), + obj_frame_tiles(gMapObjectPic_BrendanAcroBike_22), + obj_frame_tiles(gMapObjectPic_BrendanAcroBike_23), + obj_frame_tiles(gMapObjectPic_BrendanAcroBike_24), + obj_frame_tiles(gMapObjectPic_BrendanAcroBike_25), + obj_frame_tiles(gMapObjectPic_BrendanAcroBike_26) +}; + +const struct SpriteFrameImage gMapObjectPicTable_BrendanSurfing[] = { + obj_frame_tiles(gMapObjectPic_BrendanSurfing_0), + obj_frame_tiles(gMapObjectPic_BrendanSurfing_1), + obj_frame_tiles(gMapObjectPic_BrendanSurfing_2), + obj_frame_tiles(gMapObjectPic_BrendanSurfing_0), + obj_frame_tiles(gMapObjectPic_BrendanSurfing_0), + obj_frame_tiles(gMapObjectPic_BrendanSurfing_1), + obj_frame_tiles(gMapObjectPic_BrendanSurfing_1), + obj_frame_tiles(gMapObjectPic_BrendanSurfing_2), + obj_frame_tiles(gMapObjectPic_BrendanSurfing_2), + obj_frame_tiles(gMapObjectPic_BrendanSurfing_3), + obj_frame_tiles(gMapObjectPic_BrendanSurfing_4), + obj_frame_tiles(gMapObjectPic_BrendanSurfing_5) +}; + +const struct SpriteFrameImage gMapObjectPicTable_BrendanUnderwater[] = { + obj_frame_tiles(gMapObjectPic_BrendanUnderwater_0), + obj_frame_tiles(gMapObjectPic_BrendanUnderwater_1), + obj_frame_tiles(gMapObjectPic_BrendanUnderwater_2), + obj_frame_tiles(gMapObjectPic_BrendanUnderwater_0), + obj_frame_tiles(gMapObjectPic_BrendanUnderwater_0), + obj_frame_tiles(gMapObjectPic_BrendanUnderwater_1), + obj_frame_tiles(gMapObjectPic_BrendanUnderwater_1), + obj_frame_tiles(gMapObjectPic_BrendanUnderwater_2), + obj_frame_tiles(gMapObjectPic_BrendanUnderwater_2) +}; + +const struct SpriteFrameImage gMapObjectPicTable_BrendanFieldMove[] = { + obj_frame_tiles(gMapObjectPic_BrendanFieldMove_0), + obj_frame_tiles(gMapObjectPic_BrendanFieldMove_1), + obj_frame_tiles(gMapObjectPic_BrendanFieldMove_2), + obj_frame_tiles(gMapObjectPic_BrendanFieldMove_3), + obj_frame_tiles(gMapObjectPic_BrendanFieldMove_4) +}; + +const struct SpriteFrameImage gMapObjectPicTable_QuintyPlump[] = { + obj_frame_tiles(gMapObjectPic_QuintyPlump_0), + obj_frame_tiles(gMapObjectPic_QuintyPlump_1), + obj_frame_tiles(gMapObjectPic_QuintyPlump_2), + obj_frame_tiles(gMapObjectPic_QuintyPlump_3), + obj_frame_tiles(gMapObjectPic_QuintyPlump_4), + obj_frame_tiles(gMapObjectPic_QuintyPlump_5), + obj_frame_tiles(gMapObjectPic_QuintyPlump_6) +}; + +const struct SpriteFrameImage gMapObjectPicTable_LittleBoy1[] = { + obj_frame_tiles(gMapObjectPic_LittleBoy1_0), + obj_frame_tiles(gMapObjectPic_LittleBoy1_1), + obj_frame_tiles(gMapObjectPic_LittleBoy1_2), + obj_frame_tiles(gMapObjectPic_LittleBoy1_3), + obj_frame_tiles(gMapObjectPic_LittleBoy1_4), + obj_frame_tiles(gMapObjectPic_LittleBoy1_5), + obj_frame_tiles(gMapObjectPic_LittleBoy1_6), + obj_frame_tiles(gMapObjectPic_LittleBoy1_7), + obj_frame_tiles(gMapObjectPic_LittleBoy1_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_LittleGirl1[] = { + obj_frame_tiles(gMapObjectPic_LittleGirl1_0), + obj_frame_tiles(gMapObjectPic_LittleGirl1_1), + obj_frame_tiles(gMapObjectPic_LittleGirl1_2), + obj_frame_tiles(gMapObjectPic_LittleGirl1_3), + obj_frame_tiles(gMapObjectPic_LittleGirl1_4), + obj_frame_tiles(gMapObjectPic_LittleGirl1_5), + obj_frame_tiles(gMapObjectPic_LittleGirl1_6), + obj_frame_tiles(gMapObjectPic_LittleGirl1_7), + obj_frame_tiles(gMapObjectPic_LittleGirl1_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Boy1[] = { + obj_frame_tiles(gMapObjectPic_Boy1_0), + obj_frame_tiles(gMapObjectPic_Boy1_1), + obj_frame_tiles(gMapObjectPic_Boy1_2), + obj_frame_tiles(gMapObjectPic_Boy1_3), + obj_frame_tiles(gMapObjectPic_Boy1_4), + obj_frame_tiles(gMapObjectPic_Boy1_5), + obj_frame_tiles(gMapObjectPic_Boy1_6), + obj_frame_tiles(gMapObjectPic_Boy1_7), + obj_frame_tiles(gMapObjectPic_Boy1_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Girl1[] = { + obj_frame_tiles(gMapObjectPic_Girl1_0), + obj_frame_tiles(gMapObjectPic_Girl1_1), + obj_frame_tiles(gMapObjectPic_Girl1_2), + obj_frame_tiles(gMapObjectPic_Girl1_3), + obj_frame_tiles(gMapObjectPic_Girl1_4), + obj_frame_tiles(gMapObjectPic_Girl1_5), + obj_frame_tiles(gMapObjectPic_Girl1_6), + obj_frame_tiles(gMapObjectPic_Girl1_7), + obj_frame_tiles(gMapObjectPic_Girl1_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Boy2[] = { + obj_frame_tiles(gMapObjectPic_Boy2_0), + obj_frame_tiles(gMapObjectPic_Boy2_1), + obj_frame_tiles(gMapObjectPic_Boy2_2), + obj_frame_tiles(gMapObjectPic_Boy2_3), + obj_frame_tiles(gMapObjectPic_Boy2_4), + obj_frame_tiles(gMapObjectPic_Boy2_5), + obj_frame_tiles(gMapObjectPic_Boy2_6), + obj_frame_tiles(gMapObjectPic_Boy2_7), + obj_frame_tiles(gMapObjectPic_Boy2_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Girl2[] = { + obj_frame_tiles(gMapObjectPic_Girl2_0), + obj_frame_tiles(gMapObjectPic_Girl2_1), + obj_frame_tiles(gMapObjectPic_Girl2_2), + obj_frame_tiles(gMapObjectPic_Girl2_3), + obj_frame_tiles(gMapObjectPic_Girl2_4), + obj_frame_tiles(gMapObjectPic_Girl2_5), + obj_frame_tiles(gMapObjectPic_Girl2_6), + obj_frame_tiles(gMapObjectPic_Girl2_7), + obj_frame_tiles(gMapObjectPic_Girl2_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_LittleBoy2[] = { + obj_frame_tiles(gMapObjectPic_LittleBoy2_0), + obj_frame_tiles(gMapObjectPic_LittleBoy2_1), + obj_frame_tiles(gMapObjectPic_LittleBoy2_2), + obj_frame_tiles(gMapObjectPic_LittleBoy2_3), + obj_frame_tiles(gMapObjectPic_LittleBoy2_4), + obj_frame_tiles(gMapObjectPic_LittleBoy2_5), + obj_frame_tiles(gMapObjectPic_LittleBoy2_6), + obj_frame_tiles(gMapObjectPic_LittleBoy2_7), + obj_frame_tiles(gMapObjectPic_LittleBoy2_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_LittleGirl2[] = { + obj_frame_tiles(gMapObjectPic_LittleGirl2_0), + obj_frame_tiles(gMapObjectPic_LittleGirl2_1), + obj_frame_tiles(gMapObjectPic_LittleGirl2_2), + obj_frame_tiles(gMapObjectPic_LittleGirl2_3), + obj_frame_tiles(gMapObjectPic_LittleGirl2_4), + obj_frame_tiles(gMapObjectPic_LittleGirl2_5), + obj_frame_tiles(gMapObjectPic_LittleGirl2_6), + obj_frame_tiles(gMapObjectPic_LittleGirl2_7), + obj_frame_tiles(gMapObjectPic_LittleGirl2_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Boy3[] = { + obj_frame_tiles(gMapObjectPic_Boy3_0), + obj_frame_tiles(gMapObjectPic_Boy3_1), + obj_frame_tiles(gMapObjectPic_Boy3_2), + obj_frame_tiles(gMapObjectPic_Boy3_3), + obj_frame_tiles(gMapObjectPic_Boy3_4), + obj_frame_tiles(gMapObjectPic_Boy3_5), + obj_frame_tiles(gMapObjectPic_Boy3_6), + obj_frame_tiles(gMapObjectPic_Boy3_7), + obj_frame_tiles(gMapObjectPic_Boy3_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Girl3[] = { + obj_frame_tiles(gMapObjectPic_Girl3_0), + obj_frame_tiles(gMapObjectPic_Girl3_1), + obj_frame_tiles(gMapObjectPic_Girl3_2), + obj_frame_tiles(gMapObjectPic_Girl3_3), + obj_frame_tiles(gMapObjectPic_Girl3_4), + obj_frame_tiles(gMapObjectPic_Girl3_5), + obj_frame_tiles(gMapObjectPic_Girl3_6), + obj_frame_tiles(gMapObjectPic_Girl3_7), + obj_frame_tiles(gMapObjectPic_Girl3_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Boy4[] = { + obj_frame_tiles(gMapObjectPic_Boy4_0), + obj_frame_tiles(gMapObjectPic_Boy4_1), + obj_frame_tiles(gMapObjectPic_Boy4_2), + obj_frame_tiles(gMapObjectPic_Boy4_3), + obj_frame_tiles(gMapObjectPic_Boy4_4), + obj_frame_tiles(gMapObjectPic_Boy4_5), + obj_frame_tiles(gMapObjectPic_Boy4_6), + obj_frame_tiles(gMapObjectPic_Boy4_7), + obj_frame_tiles(gMapObjectPic_Boy4_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Woman1[] = { + obj_frame_tiles(gMapObjectPic_Woman1_0), + obj_frame_tiles(gMapObjectPic_Woman1_1), + obj_frame_tiles(gMapObjectPic_Woman1_2), + obj_frame_tiles(gMapObjectPic_Woman1_3), + obj_frame_tiles(gMapObjectPic_Woman1_4), + obj_frame_tiles(gMapObjectPic_Woman1_5), + obj_frame_tiles(gMapObjectPic_Woman1_6), + obj_frame_tiles(gMapObjectPic_Woman1_7), + obj_frame_tiles(gMapObjectPic_Woman1_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_FatMan[] = { + obj_frame_tiles(gMapObjectPic_FatMan_0), + obj_frame_tiles(gMapObjectPic_FatMan_1), + obj_frame_tiles(gMapObjectPic_FatMan_2), + obj_frame_tiles(gMapObjectPic_FatMan_3), + obj_frame_tiles(gMapObjectPic_FatMan_4), + obj_frame_tiles(gMapObjectPic_FatMan_5), + obj_frame_tiles(gMapObjectPic_FatMan_6), + obj_frame_tiles(gMapObjectPic_FatMan_7), + obj_frame_tiles(gMapObjectPic_FatMan_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Woman2[] = { + obj_frame_tiles(gMapObjectPic_Woman2_0), + obj_frame_tiles(gMapObjectPic_Woman2_1), + obj_frame_tiles(gMapObjectPic_Woman2_2), + obj_frame_tiles(gMapObjectPic_Woman2_3), + obj_frame_tiles(gMapObjectPic_Woman2_4), + obj_frame_tiles(gMapObjectPic_Woman2_5), + obj_frame_tiles(gMapObjectPic_Woman2_6), + obj_frame_tiles(gMapObjectPic_Woman2_7), + obj_frame_tiles(gMapObjectPic_Woman2_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Man1[] = { + obj_frame_tiles(gMapObjectPic_Man1_0), + obj_frame_tiles(gMapObjectPic_Man1_1), + obj_frame_tiles(gMapObjectPic_Man1_2), + obj_frame_tiles(gMapObjectPic_Man1_3), + obj_frame_tiles(gMapObjectPic_Man1_4), + obj_frame_tiles(gMapObjectPic_Man1_5), + obj_frame_tiles(gMapObjectPic_Man1_6), + obj_frame_tiles(gMapObjectPic_Man1_7), + obj_frame_tiles(gMapObjectPic_Man1_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Woman3[] = { + obj_frame_tiles(gMapObjectPic_Woman3_0), + obj_frame_tiles(gMapObjectPic_Woman3_1), + obj_frame_tiles(gMapObjectPic_Woman3_2), + obj_frame_tiles(gMapObjectPic_Woman3_3), + obj_frame_tiles(gMapObjectPic_Woman3_4), + obj_frame_tiles(gMapObjectPic_Woman3_5), + obj_frame_tiles(gMapObjectPic_Woman3_6), + obj_frame_tiles(gMapObjectPic_Woman3_7), + obj_frame_tiles(gMapObjectPic_Woman3_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_OldMan1[] = { + obj_frame_tiles(gMapObjectPic_OldMan1_0), + obj_frame_tiles(gMapObjectPic_OldMan1_1), + obj_frame_tiles(gMapObjectPic_OldMan1_2), + obj_frame_tiles(gMapObjectPic_OldMan1_3), + obj_frame_tiles(gMapObjectPic_OldMan1_4), + obj_frame_tiles(gMapObjectPic_OldMan1_5), + obj_frame_tiles(gMapObjectPic_OldMan1_6), + obj_frame_tiles(gMapObjectPic_OldMan1_7), + obj_frame_tiles(gMapObjectPic_OldMan1_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_OldWoman1[] = { + obj_frame_tiles(gMapObjectPic_OldWoman1_0), + obj_frame_tiles(gMapObjectPic_OldWoman1_1), + obj_frame_tiles(gMapObjectPic_OldWoman1_2), + obj_frame_tiles(gMapObjectPic_OldWoman1_3), + obj_frame_tiles(gMapObjectPic_OldWoman1_4), + obj_frame_tiles(gMapObjectPic_OldWoman1_5), + obj_frame_tiles(gMapObjectPic_OldWoman1_6), + obj_frame_tiles(gMapObjectPic_OldWoman1_7), + obj_frame_tiles(gMapObjectPic_OldWoman1_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Man2[] = { + obj_frame_tiles(gMapObjectPic_Man2_0), + obj_frame_tiles(gMapObjectPic_Man2_1), + obj_frame_tiles(gMapObjectPic_Man2_2), + obj_frame_tiles(gMapObjectPic_Man2_3), + obj_frame_tiles(gMapObjectPic_Man2_4), + obj_frame_tiles(gMapObjectPic_Man2_5), + obj_frame_tiles(gMapObjectPic_Man2_6), + obj_frame_tiles(gMapObjectPic_Man2_7), + obj_frame_tiles(gMapObjectPic_Man2_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Woman4[] = { + obj_frame_tiles(gMapObjectPic_Woman4_0), + obj_frame_tiles(gMapObjectPic_Woman4_1), + obj_frame_tiles(gMapObjectPic_Woman4_2), + obj_frame_tiles(gMapObjectPic_Woman4_3), + obj_frame_tiles(gMapObjectPic_Woman4_4), + obj_frame_tiles(gMapObjectPic_Woman4_5), + obj_frame_tiles(gMapObjectPic_Woman4_6), + obj_frame_tiles(gMapObjectPic_Woman4_7), + obj_frame_tiles(gMapObjectPic_Woman4_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Man3[] = { + obj_frame_tiles(gMapObjectPic_Man3_0), + obj_frame_tiles(gMapObjectPic_Man3_1), + obj_frame_tiles(gMapObjectPic_Man3_2), + obj_frame_tiles(gMapObjectPic_Man3_3), + obj_frame_tiles(gMapObjectPic_Man3_4), + obj_frame_tiles(gMapObjectPic_Man3_5), + obj_frame_tiles(gMapObjectPic_Man3_6), + obj_frame_tiles(gMapObjectPic_Man3_7), + obj_frame_tiles(gMapObjectPic_Man3_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Woman5[] = { + obj_frame_tiles(gMapObjectPic_Woman5_0), + obj_frame_tiles(gMapObjectPic_Woman5_1), + obj_frame_tiles(gMapObjectPic_Woman5_2), + obj_frame_tiles(gMapObjectPic_Woman5_3), + obj_frame_tiles(gMapObjectPic_Woman5_4), + obj_frame_tiles(gMapObjectPic_Woman5_5), + obj_frame_tiles(gMapObjectPic_Woman5_6), + obj_frame_tiles(gMapObjectPic_Woman5_7), + obj_frame_tiles(gMapObjectPic_Woman5_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Cook[] = { + obj_frame_tiles(gMapObjectPic_Cook_0), + obj_frame_tiles(gMapObjectPic_Cook_1), + obj_frame_tiles(gMapObjectPic_Cook_2), + obj_frame_tiles(gMapObjectPic_Cook_0), + obj_frame_tiles(gMapObjectPic_Cook_0), + obj_frame_tiles(gMapObjectPic_Cook_1), + obj_frame_tiles(gMapObjectPic_Cook_1), + obj_frame_tiles(gMapObjectPic_Cook_2), + obj_frame_tiles(gMapObjectPic_Cook_2) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Woman6[] = { + obj_frame_tiles(gMapObjectPic_Woman6_0), + obj_frame_tiles(gMapObjectPic_Woman6_1), + obj_frame_tiles(gMapObjectPic_Woman6_2), + obj_frame_tiles(gMapObjectPic_Woman6_3), + obj_frame_tiles(gMapObjectPic_Woman6_4), + obj_frame_tiles(gMapObjectPic_Woman6_5), + obj_frame_tiles(gMapObjectPic_Woman6_6), + obj_frame_tiles(gMapObjectPic_Woman6_7), + obj_frame_tiles(gMapObjectPic_Woman6_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_OldMan2[] = { + obj_frame_tiles(gMapObjectPic_OldMan2_0), + obj_frame_tiles(gMapObjectPic_OldMan2_1), + obj_frame_tiles(gMapObjectPic_OldMan2_2), + obj_frame_tiles(gMapObjectPic_OldMan2_0), + obj_frame_tiles(gMapObjectPic_OldMan2_0), + obj_frame_tiles(gMapObjectPic_OldMan2_1), + obj_frame_tiles(gMapObjectPic_OldMan2_1), + obj_frame_tiles(gMapObjectPic_OldMan2_2), + obj_frame_tiles(gMapObjectPic_OldMan2_2) +}; + +const struct SpriteFrameImage gMapObjectPicTable_OldWoman2[] = { + obj_frame_tiles(gMapObjectPic_OldWoman2_0), + obj_frame_tiles(gMapObjectPic_OldWoman2_1), + obj_frame_tiles(gMapObjectPic_OldWoman2_2), + obj_frame_tiles(gMapObjectPic_OldWoman2_0), + obj_frame_tiles(gMapObjectPic_OldWoman2_0), + obj_frame_tiles(gMapObjectPic_OldWoman2_1), + obj_frame_tiles(gMapObjectPic_OldWoman2_1), + obj_frame_tiles(gMapObjectPic_OldWoman2_2), + obj_frame_tiles(gMapObjectPic_OldWoman2_2) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Camper[] = { + obj_frame_tiles(gMapObjectPic_Camper_0), + obj_frame_tiles(gMapObjectPic_Camper_1), + obj_frame_tiles(gMapObjectPic_Camper_2), + obj_frame_tiles(gMapObjectPic_Camper_3), + obj_frame_tiles(gMapObjectPic_Camper_4), + obj_frame_tiles(gMapObjectPic_Camper_5), + obj_frame_tiles(gMapObjectPic_Camper_6), + obj_frame_tiles(gMapObjectPic_Camper_7), + obj_frame_tiles(gMapObjectPic_Camper_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Picnicker[] = { + obj_frame_tiles(gMapObjectPic_Picnicker_0), + obj_frame_tiles(gMapObjectPic_Picnicker_1), + obj_frame_tiles(gMapObjectPic_Picnicker_2), + obj_frame_tiles(gMapObjectPic_Picnicker_3), + obj_frame_tiles(gMapObjectPic_Picnicker_4), + obj_frame_tiles(gMapObjectPic_Picnicker_5), + obj_frame_tiles(gMapObjectPic_Picnicker_6), + obj_frame_tiles(gMapObjectPic_Picnicker_7), + obj_frame_tiles(gMapObjectPic_Picnicker_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Man4[] = { + obj_frame_tiles(gMapObjectPic_Man4_0), + obj_frame_tiles(gMapObjectPic_Man4_1), + obj_frame_tiles(gMapObjectPic_Man4_2), + obj_frame_tiles(gMapObjectPic_Man4_3), + obj_frame_tiles(gMapObjectPic_Man4_4), + obj_frame_tiles(gMapObjectPic_Man4_5), + obj_frame_tiles(gMapObjectPic_Man4_6), + obj_frame_tiles(gMapObjectPic_Man4_7), + obj_frame_tiles(gMapObjectPic_Man4_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Woman7[] = { + obj_frame_tiles(gMapObjectPic_Woman7_0), + obj_frame_tiles(gMapObjectPic_Woman7_1), + obj_frame_tiles(gMapObjectPic_Woman7_2), + obj_frame_tiles(gMapObjectPic_Woman7_3), + obj_frame_tiles(gMapObjectPic_Woman7_4), + obj_frame_tiles(gMapObjectPic_Woman7_5), + obj_frame_tiles(gMapObjectPic_Woman7_6), + obj_frame_tiles(gMapObjectPic_Woman7_7), + obj_frame_tiles(gMapObjectPic_Woman7_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Youngster[] = { + obj_frame_tiles(gMapObjectPic_Youngster_0), + obj_frame_tiles(gMapObjectPic_Youngster_1), + obj_frame_tiles(gMapObjectPic_Youngster_2), + obj_frame_tiles(gMapObjectPic_Youngster_3), + obj_frame_tiles(gMapObjectPic_Youngster_4), + obj_frame_tiles(gMapObjectPic_Youngster_5), + obj_frame_tiles(gMapObjectPic_Youngster_6), + obj_frame_tiles(gMapObjectPic_Youngster_7), + obj_frame_tiles(gMapObjectPic_Youngster_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_BugCatcher[] = { + obj_frame_tiles(gMapObjectPic_BugCatcher_0), + obj_frame_tiles(gMapObjectPic_BugCatcher_1), + obj_frame_tiles(gMapObjectPic_BugCatcher_2), + obj_frame_tiles(gMapObjectPic_BugCatcher_3), + obj_frame_tiles(gMapObjectPic_BugCatcher_4), + obj_frame_tiles(gMapObjectPic_BugCatcher_5), + obj_frame_tiles(gMapObjectPic_BugCatcher_6), + obj_frame_tiles(gMapObjectPic_BugCatcher_7), + obj_frame_tiles(gMapObjectPic_BugCatcher_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_PsychicM[] = { + obj_frame_tiles(gMapObjectPic_PsychicM_0), + obj_frame_tiles(gMapObjectPic_PsychicM_1), + obj_frame_tiles(gMapObjectPic_PsychicM_2), + obj_frame_tiles(gMapObjectPic_PsychicM_3), + obj_frame_tiles(gMapObjectPic_PsychicM_4), + obj_frame_tiles(gMapObjectPic_PsychicM_5), + obj_frame_tiles(gMapObjectPic_PsychicM_6), + obj_frame_tiles(gMapObjectPic_PsychicM_7), + obj_frame_tiles(gMapObjectPic_PsychicM_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_SchoolKidM[] = { + obj_frame_tiles(gMapObjectPic_SchoolKidM_0), + obj_frame_tiles(gMapObjectPic_SchoolKidM_1), + obj_frame_tiles(gMapObjectPic_SchoolKidM_2), + obj_frame_tiles(gMapObjectPic_SchoolKidM_3), + obj_frame_tiles(gMapObjectPic_SchoolKidM_4), + obj_frame_tiles(gMapObjectPic_SchoolKidM_5), + obj_frame_tiles(gMapObjectPic_SchoolKidM_6), + obj_frame_tiles(gMapObjectPic_SchoolKidM_7), + obj_frame_tiles(gMapObjectPic_SchoolKidM_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Maniac[] = { + obj_frame_tiles(gMapObjectPic_Maniac_0), + obj_frame_tiles(gMapObjectPic_Maniac_1), + obj_frame_tiles(gMapObjectPic_Maniac_2), + obj_frame_tiles(gMapObjectPic_Maniac_3), + obj_frame_tiles(gMapObjectPic_Maniac_4), + obj_frame_tiles(gMapObjectPic_Maniac_5), + obj_frame_tiles(gMapObjectPic_Maniac_6), + obj_frame_tiles(gMapObjectPic_Maniac_7), + obj_frame_tiles(gMapObjectPic_Maniac_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_HexManiac[] = { + obj_frame_tiles(gMapObjectPic_HexManiac_0), + obj_frame_tiles(gMapObjectPic_HexManiac_1), + obj_frame_tiles(gMapObjectPic_HexManiac_2), + obj_frame_tiles(gMapObjectPic_HexManiac_3), + obj_frame_tiles(gMapObjectPic_HexManiac_4), + obj_frame_tiles(gMapObjectPic_HexManiac_5), + obj_frame_tiles(gMapObjectPic_HexManiac_6), + obj_frame_tiles(gMapObjectPic_HexManiac_7), + obj_frame_tiles(gMapObjectPic_HexManiac_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Woman8[] = { + obj_frame_tiles(gMapObjectPic_Woman8_0), + obj_frame_tiles(gMapObjectPic_Woman8_1), + obj_frame_tiles(gMapObjectPic_Woman8_2), + obj_frame_tiles(gMapObjectPic_Woman8_3), + obj_frame_tiles(gMapObjectPic_Woman8_4), + obj_frame_tiles(gMapObjectPic_Woman8_5), + obj_frame_tiles(gMapObjectPic_Woman8_6), + obj_frame_tiles(gMapObjectPic_Woman8_7), + obj_frame_tiles(gMapObjectPic_Woman8_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_SwimmerM[] = { + obj_frame_tiles(gMapObjectPic_SwimmerM_0), + obj_frame_tiles(gMapObjectPic_SwimmerM_1), + obj_frame_tiles(gMapObjectPic_SwimmerM_2), + obj_frame_tiles(gMapObjectPic_SwimmerM_3), + obj_frame_tiles(gMapObjectPic_SwimmerM_4), + obj_frame_tiles(gMapObjectPic_SwimmerM_5), + obj_frame_tiles(gMapObjectPic_SwimmerM_6), + obj_frame_tiles(gMapObjectPic_SwimmerM_7), + obj_frame_tiles(gMapObjectPic_SwimmerM_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_SwimmerF[] = { + obj_frame_tiles(gMapObjectPic_SwimmerF_0), + obj_frame_tiles(gMapObjectPic_SwimmerF_1), + obj_frame_tiles(gMapObjectPic_SwimmerF_2), + obj_frame_tiles(gMapObjectPic_SwimmerF_3), + obj_frame_tiles(gMapObjectPic_SwimmerF_4), + obj_frame_tiles(gMapObjectPic_SwimmerF_5), + obj_frame_tiles(gMapObjectPic_SwimmerF_6), + obj_frame_tiles(gMapObjectPic_SwimmerF_7), + obj_frame_tiles(gMapObjectPic_SwimmerF_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_BlackBelt[] = { + obj_frame_tiles(gMapObjectPic_BlackBelt_0), + obj_frame_tiles(gMapObjectPic_BlackBelt_1), + obj_frame_tiles(gMapObjectPic_BlackBelt_2), + obj_frame_tiles(gMapObjectPic_BlackBelt_3), + obj_frame_tiles(gMapObjectPic_BlackBelt_4), + obj_frame_tiles(gMapObjectPic_BlackBelt_5), + obj_frame_tiles(gMapObjectPic_BlackBelt_6), + obj_frame_tiles(gMapObjectPic_BlackBelt_7), + obj_frame_tiles(gMapObjectPic_BlackBelt_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Beauty[] = { + obj_frame_tiles(gMapObjectPic_Beauty_0), + obj_frame_tiles(gMapObjectPic_Beauty_1), + obj_frame_tiles(gMapObjectPic_Beauty_2), + obj_frame_tiles(gMapObjectPic_Beauty_3), + obj_frame_tiles(gMapObjectPic_Beauty_4), + obj_frame_tiles(gMapObjectPic_Beauty_5), + obj_frame_tiles(gMapObjectPic_Beauty_6), + obj_frame_tiles(gMapObjectPic_Beauty_7), + obj_frame_tiles(gMapObjectPic_Beauty_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Scientist1[] = { + obj_frame_tiles(gMapObjectPic_Scientist1_0), + obj_frame_tiles(gMapObjectPic_Scientist1_1), + obj_frame_tiles(gMapObjectPic_Scientist1_2), + obj_frame_tiles(gMapObjectPic_Scientist1_3), + obj_frame_tiles(gMapObjectPic_Scientist1_4), + obj_frame_tiles(gMapObjectPic_Scientist1_5), + obj_frame_tiles(gMapObjectPic_Scientist1_6), + obj_frame_tiles(gMapObjectPic_Scientist1_7), + obj_frame_tiles(gMapObjectPic_Scientist1_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Lass[] = { + obj_frame_tiles(gMapObjectPic_Lass_0), + obj_frame_tiles(gMapObjectPic_Lass_1), + obj_frame_tiles(gMapObjectPic_Lass_2), + obj_frame_tiles(gMapObjectPic_Lass_3), + obj_frame_tiles(gMapObjectPic_Lass_4), + obj_frame_tiles(gMapObjectPic_Lass_5), + obj_frame_tiles(gMapObjectPic_Lass_6), + obj_frame_tiles(gMapObjectPic_Lass_7), + obj_frame_tiles(gMapObjectPic_Lass_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Gentleman[] = { + obj_frame_tiles(gMapObjectPic_Gentleman_0), + obj_frame_tiles(gMapObjectPic_Gentleman_1), + obj_frame_tiles(gMapObjectPic_Gentleman_2), + obj_frame_tiles(gMapObjectPic_Gentleman_3), + obj_frame_tiles(gMapObjectPic_Gentleman_4), + obj_frame_tiles(gMapObjectPic_Gentleman_5), + obj_frame_tiles(gMapObjectPic_Gentleman_6), + obj_frame_tiles(gMapObjectPic_Gentleman_7), + obj_frame_tiles(gMapObjectPic_Gentleman_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Sailor[] = { + obj_frame_tiles(gMapObjectPic_Sailor_0), + obj_frame_tiles(gMapObjectPic_Sailor_1), + obj_frame_tiles(gMapObjectPic_Sailor_2), + obj_frame_tiles(gMapObjectPic_Sailor_3), + obj_frame_tiles(gMapObjectPic_Sailor_4), + obj_frame_tiles(gMapObjectPic_Sailor_5), + obj_frame_tiles(gMapObjectPic_Sailor_6), + obj_frame_tiles(gMapObjectPic_Sailor_7), + obj_frame_tiles(gMapObjectPic_Sailor_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Fisherman[] = { + obj_frame_tiles(gMapObjectPic_Fisherman_0), + obj_frame_tiles(gMapObjectPic_Fisherman_1), + obj_frame_tiles(gMapObjectPic_Fisherman_2), + obj_frame_tiles(gMapObjectPic_Fisherman_3), + obj_frame_tiles(gMapObjectPic_Fisherman_4), + obj_frame_tiles(gMapObjectPic_Fisherman_5), + obj_frame_tiles(gMapObjectPic_Fisherman_6), + obj_frame_tiles(gMapObjectPic_Fisherman_7), + obj_frame_tiles(gMapObjectPic_Fisherman_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_RunningTriathleteM[] = { + obj_frame_tiles(gMapObjectPic_RunningTriathleteM_0), + obj_frame_tiles(gMapObjectPic_RunningTriathleteM_1), + obj_frame_tiles(gMapObjectPic_RunningTriathleteM_2), + obj_frame_tiles(gMapObjectPic_RunningTriathleteM_3), + obj_frame_tiles(gMapObjectPic_RunningTriathleteM_4), + obj_frame_tiles(gMapObjectPic_RunningTriathleteM_5), + obj_frame_tiles(gMapObjectPic_RunningTriathleteM_6), + obj_frame_tiles(gMapObjectPic_RunningTriathleteM_7), + obj_frame_tiles(gMapObjectPic_RunningTriathleteM_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_RunningTriathleteF[] = { + obj_frame_tiles(gMapObjectPic_RunningTriathleteF_0), + obj_frame_tiles(gMapObjectPic_RunningTriathleteF_1), + obj_frame_tiles(gMapObjectPic_RunningTriathleteF_2), + obj_frame_tiles(gMapObjectPic_RunningTriathleteF_3), + obj_frame_tiles(gMapObjectPic_RunningTriathleteF_4), + obj_frame_tiles(gMapObjectPic_RunningTriathleteF_5), + obj_frame_tiles(gMapObjectPic_RunningTriathleteF_6), + obj_frame_tiles(gMapObjectPic_RunningTriathleteF_7), + obj_frame_tiles(gMapObjectPic_RunningTriathleteF_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_TuberF[] = { + obj_frame_tiles(gMapObjectPic_TuberF_0), + obj_frame_tiles(gMapObjectPic_TuberF_1), + obj_frame_tiles(gMapObjectPic_TuberF_2), + obj_frame_tiles(gMapObjectPic_TuberF_3), + obj_frame_tiles(gMapObjectPic_TuberF_4), + obj_frame_tiles(gMapObjectPic_TuberF_5), + obj_frame_tiles(gMapObjectPic_TuberF_6), + obj_frame_tiles(gMapObjectPic_TuberF_7), + obj_frame_tiles(gMapObjectPic_TuberF_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_TuberM[] = { + obj_frame_tiles(gMapObjectPic_TuberM_0), + obj_frame_tiles(gMapObjectPic_TuberM_1), + obj_frame_tiles(gMapObjectPic_TuberM_2), + obj_frame_tiles(gMapObjectPic_TuberM_3), + obj_frame_tiles(gMapObjectPic_TuberM_4), + obj_frame_tiles(gMapObjectPic_TuberM_5), + obj_frame_tiles(gMapObjectPic_TuberM_6), + obj_frame_tiles(gMapObjectPic_TuberM_7), + obj_frame_tiles(gMapObjectPic_TuberM_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Hiker[] = { + obj_frame_tiles(gMapObjectPic_Hiker_0), + obj_frame_tiles(gMapObjectPic_Hiker_1), + obj_frame_tiles(gMapObjectPic_Hiker_2), + obj_frame_tiles(gMapObjectPic_Hiker_3), + obj_frame_tiles(gMapObjectPic_Hiker_4), + obj_frame_tiles(gMapObjectPic_Hiker_5), + obj_frame_tiles(gMapObjectPic_Hiker_6), + obj_frame_tiles(gMapObjectPic_Hiker_7), + obj_frame_tiles(gMapObjectPic_Hiker_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_CyclingTriathleteM[] = { + obj_frame_tiles(gMapObjectPic_CyclingTriathleteM_0), + obj_frame_tiles(gMapObjectPic_CyclingTriathleteM_1), + obj_frame_tiles(gMapObjectPic_CyclingTriathleteM_2), + obj_frame_tiles(gMapObjectPic_CyclingTriathleteM_3), + obj_frame_tiles(gMapObjectPic_CyclingTriathleteM_4), + obj_frame_tiles(gMapObjectPic_CyclingTriathleteM_5), + obj_frame_tiles(gMapObjectPic_CyclingTriathleteM_6), + obj_frame_tiles(gMapObjectPic_CyclingTriathleteM_7), + obj_frame_tiles(gMapObjectPic_CyclingTriathleteM_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_CyclingTriathleteF[] = { + obj_frame_tiles(gMapObjectPic_CyclingTriathleteF_0), + obj_frame_tiles(gMapObjectPic_CyclingTriathleteF_1), + obj_frame_tiles(gMapObjectPic_CyclingTriathleteF_2), + obj_frame_tiles(gMapObjectPic_CyclingTriathleteF_3), + obj_frame_tiles(gMapObjectPic_CyclingTriathleteF_4), + obj_frame_tiles(gMapObjectPic_CyclingTriathleteF_5), + obj_frame_tiles(gMapObjectPic_CyclingTriathleteF_6), + obj_frame_tiles(gMapObjectPic_CyclingTriathleteF_7), + obj_frame_tiles(gMapObjectPic_CyclingTriathleteF_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Nurse[] = { + obj_frame_tiles(gMapObjectPic_Nurse_0), + obj_frame_tiles(gMapObjectPic_Nurse_1), + obj_frame_tiles(gMapObjectPic_Nurse_2), + obj_frame_tiles(gMapObjectPic_Nurse_3), + obj_frame_tiles(gMapObjectPic_Nurse_4), + obj_frame_tiles(gMapObjectPic_Nurse_5), + obj_frame_tiles(gMapObjectPic_Nurse_6), + obj_frame_tiles(gMapObjectPic_Nurse_7), + obj_frame_tiles(gMapObjectPic_Nurse_8), + obj_frame_tiles(gMapObjectPic_Nurse_9) +}; + +const struct SpriteFrameImage gMapObjectPicTable_ItemBall[] = { + obj_frame_tiles(gMapObjectPic_ItemBall) +}; + +const struct SpriteFrameImage gMapObjectPicTable_ProfBirch[] = { + obj_frame_tiles(gMapObjectPic_ProfBirch_0), + obj_frame_tiles(gMapObjectPic_ProfBirch_1), + obj_frame_tiles(gMapObjectPic_ProfBirch_2), + obj_frame_tiles(gMapObjectPic_ProfBirch_3), + obj_frame_tiles(gMapObjectPic_ProfBirch_4), + obj_frame_tiles(gMapObjectPic_ProfBirch_5), + obj_frame_tiles(gMapObjectPic_ProfBirch_6), + obj_frame_tiles(gMapObjectPic_ProfBirch_7), + obj_frame_tiles(gMapObjectPic_ProfBirch_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Man5[] = { + obj_frame_tiles(gMapObjectPic_Man5_0), + obj_frame_tiles(gMapObjectPic_Man5_1), + obj_frame_tiles(gMapObjectPic_Man5_2), + obj_frame_tiles(gMapObjectPic_Man5_3), + obj_frame_tiles(gMapObjectPic_Man5_4), + obj_frame_tiles(gMapObjectPic_Man5_5), + obj_frame_tiles(gMapObjectPic_Man5_6), + obj_frame_tiles(gMapObjectPic_Man5_7), + obj_frame_tiles(gMapObjectPic_Man5_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Man6[] = { + obj_frame_tiles(gMapObjectPic_Man6_0), + obj_frame_tiles(gMapObjectPic_Man6_1), + obj_frame_tiles(gMapObjectPic_Man6_2), + obj_frame_tiles(gMapObjectPic_Man6_3), + obj_frame_tiles(gMapObjectPic_Man6_4), + obj_frame_tiles(gMapObjectPic_Man6_5), + obj_frame_tiles(gMapObjectPic_Man6_6), + obj_frame_tiles(gMapObjectPic_Man6_7), + obj_frame_tiles(gMapObjectPic_Man6_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_ReporterM[] = { + obj_frame_tiles(gMapObjectPic_ReporterM_0), + obj_frame_tiles(gMapObjectPic_ReporterM_1), + obj_frame_tiles(gMapObjectPic_ReporterM_2), + obj_frame_tiles(gMapObjectPic_ReporterM_3), + obj_frame_tiles(gMapObjectPic_ReporterM_4), + obj_frame_tiles(gMapObjectPic_ReporterM_5), + obj_frame_tiles(gMapObjectPic_ReporterM_6), + obj_frame_tiles(gMapObjectPic_ReporterM_7), + obj_frame_tiles(gMapObjectPic_ReporterM_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_ReporterF[] = { + obj_frame_tiles(gMapObjectPic_ReporterF_0), + obj_frame_tiles(gMapObjectPic_ReporterF_1), + obj_frame_tiles(gMapObjectPic_ReporterF_2), + obj_frame_tiles(gMapObjectPic_ReporterF_3), + obj_frame_tiles(gMapObjectPic_ReporterF_4), + obj_frame_tiles(gMapObjectPic_ReporterF_5), + obj_frame_tiles(gMapObjectPic_ReporterF_6), + obj_frame_tiles(gMapObjectPic_ReporterF_7), + obj_frame_tiles(gMapObjectPic_ReporterF_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_MauvilleOldMan1[] = { + obj_frame_tiles(gMapObjectPic_MauvilleOldMan1_0), + obj_frame_tiles(gMapObjectPic_MauvilleOldMan1_1), + obj_frame_tiles(gMapObjectPic_MauvilleOldMan1_2), + obj_frame_tiles(gMapObjectPic_MauvilleOldMan1_3), + obj_frame_tiles(gMapObjectPic_MauvilleOldMan1_4), + obj_frame_tiles(gMapObjectPic_MauvilleOldMan1_5), + obj_frame_tiles(gMapObjectPic_MauvilleOldMan1_6), + obj_frame_tiles(gMapObjectPic_MauvilleOldMan1_7), + obj_frame_tiles(gMapObjectPic_MauvilleOldMan1_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_MauvilleOldMan2[] = { + obj_frame_tiles(gMapObjectPic_MauvilleOldMan2_0), + obj_frame_tiles(gMapObjectPic_MauvilleOldMan2_1), + obj_frame_tiles(gMapObjectPic_MauvilleOldMan2_2), + obj_frame_tiles(gMapObjectPic_MauvilleOldMan2_3), + obj_frame_tiles(gMapObjectPic_MauvilleOldMan2_4), + obj_frame_tiles(gMapObjectPic_MauvilleOldMan2_5), + obj_frame_tiles(gMapObjectPic_MauvilleOldMan2_6), + obj_frame_tiles(gMapObjectPic_MauvilleOldMan2_7), + obj_frame_tiles(gMapObjectPic_MauvilleOldMan2_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_UnusedNatuDoll[] = { + obj_frame_tiles(gMapObjectPic_UnusedNatuDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_UnusedMagnemiteDoll[] = { + obj_frame_tiles(gMapObjectPic_UnusedMagnemiteDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_UnusedSquirtleDoll[] = { + obj_frame_tiles(gMapObjectPic_UnusedSquirtleDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_UnusedWooperDoll[] = { + obj_frame_tiles(gMapObjectPic_UnusedWooperDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_UnusedPikachuDoll[] = { + obj_frame_tiles(gMapObjectPic_UnusedPikachuDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_UnusedPorygon2Doll[] = { + obj_frame_tiles(gMapObjectPic_UnusedPorygon2Doll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_CuttableTree[] = { + obj_frame_tiles(gMapObjectPic_CuttableTree_0), + obj_frame_tiles(gMapObjectPic_CuttableTree_1), + obj_frame_tiles(gMapObjectPic_CuttableTree_2), + obj_frame_tiles(gMapObjectPic_CuttableTree_3) +}; + +const struct SpriteFrameImage gMapObjectPicTable_MartEmployee[] = { + obj_frame_tiles(gMapObjectPic_MartEmployee_0), + obj_frame_tiles(gMapObjectPic_MartEmployee_1), + obj_frame_tiles(gMapObjectPic_MartEmployee_2), + obj_frame_tiles(gMapObjectPic_MartEmployee_3), + obj_frame_tiles(gMapObjectPic_MartEmployee_4), + obj_frame_tiles(gMapObjectPic_MartEmployee_5), + obj_frame_tiles(gMapObjectPic_MartEmployee_6), + obj_frame_tiles(gMapObjectPic_MartEmployee_7), + obj_frame_tiles(gMapObjectPic_MartEmployee_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_RooftopSaleWoman[] = { + obj_frame_tiles(gMapObjectPic_RooftopSaleWoman_0), + obj_frame_tiles(gMapObjectPic_RooftopSaleWoman_1), + obj_frame_tiles(gMapObjectPic_RooftopSaleWoman_2), + obj_frame_tiles(gMapObjectPic_RooftopSaleWoman_3), + obj_frame_tiles(gMapObjectPic_RooftopSaleWoman_4), + obj_frame_tiles(gMapObjectPic_RooftopSaleWoman_5), + obj_frame_tiles(gMapObjectPic_RooftopSaleWoman_6), + obj_frame_tiles(gMapObjectPic_RooftopSaleWoman_7), + obj_frame_tiles(gMapObjectPic_RooftopSaleWoman_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Teala[] = { + obj_frame_tiles(gMapObjectPic_Teala_0), + obj_frame_tiles(gMapObjectPic_Teala_1), + obj_frame_tiles(gMapObjectPic_Teala_2), + obj_frame_tiles(gMapObjectPic_Teala_3), + obj_frame_tiles(gMapObjectPic_Teala_4), + obj_frame_tiles(gMapObjectPic_Teala_5), + obj_frame_tiles(gMapObjectPic_Teala_6), + obj_frame_tiles(gMapObjectPic_Teala_7), + obj_frame_tiles(gMapObjectPic_Teala_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_BreakableRock[] = { + obj_frame_tiles(gMapObjectPic_BreakableRock_0), + obj_frame_tiles(gMapObjectPic_BreakableRock_1), + obj_frame_tiles(gMapObjectPic_BreakableRock_2), + obj_frame_tiles(gMapObjectPic_BreakableRock_3) +}; + +const struct SpriteFrameImage gMapObjectPicTable_PushableBoulder[] = { + obj_frame_tiles(gMapObjectPic_PushableBoulder) +}; + +const struct SpriteFrameImage gMapObjectPicTable_MrBrineysBoat[] = { + obj_frame_tiles(gMapObjectPic_MrBrineysBoat_0), + obj_frame_tiles(gMapObjectPic_MrBrineysBoat_1), + obj_frame_tiles(gMapObjectPic_MrBrineysBoat_2), + obj_frame_tiles(gMapObjectPic_MrBrineysBoat_0), + obj_frame_tiles(gMapObjectPic_MrBrineysBoat_0), + obj_frame_tiles(gMapObjectPic_MrBrineysBoat_1), + obj_frame_tiles(gMapObjectPic_MrBrineysBoat_1), + obj_frame_tiles(gMapObjectPic_MrBrineysBoat_2), + obj_frame_tiles(gMapObjectPic_MrBrineysBoat_2) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Truck[] = { + obj_frame_tiles(gMapObjectPic_Truck) +}; + +const struct SpriteFrameImage gMapObjectPicTable_MachokeCarryingBox[] = { + obj_frame_tiles(gMapObjectPic_MachokeCarryingBox_0), + obj_frame_tiles(gMapObjectPic_MachokeCarryingBox_0), + obj_frame_tiles(gMapObjectPic_MachokeCarryingBox_0), + obj_frame_tiles(gMapObjectPic_MachokeCarryingBox_1), + obj_frame_tiles(gMapObjectPic_MachokeCarryingBox_2), + obj_frame_tiles(gMapObjectPic_MachokeCarryingBox_1), + obj_frame_tiles(gMapObjectPic_MachokeCarryingBox_2), + obj_frame_tiles(gMapObjectPic_MachokeCarryingBox_1), + obj_frame_tiles(gMapObjectPic_MachokeCarryingBox_2) +}; + +const struct SpriteFrameImage gMapObjectPicTable_MachokeFacingAway[] = { + obj_frame_tiles(gMapObjectPic_MachokeFacingAway_0), + obj_frame_tiles(gMapObjectPic_MachokeFacingAway_0), + obj_frame_tiles(gMapObjectPic_MachokeFacingAway_0), + obj_frame_tiles(gMapObjectPic_MachokeFacingAway_1), + obj_frame_tiles(gMapObjectPic_MachokeFacingAway_1), + obj_frame_tiles(gMapObjectPic_MachokeFacingAway_1), + obj_frame_tiles(gMapObjectPic_MachokeFacingAway_1), + obj_frame_tiles(gMapObjectPic_MachokeFacingAway_1), + obj_frame_tiles(gMapObjectPic_MachokeFacingAway_1) +}; + +const struct SpriteFrameImage gMapObjectPicTable_BirchsBag[] = { + obj_frame_tiles(gMapObjectPic_BirchsBag) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Poochyena[] = { + obj_frame_tiles(gMapObjectPic_Poochyena_0), + obj_frame_tiles(gMapObjectPic_Poochyena_1), + obj_frame_tiles(gMapObjectPic_Poochyena_2), + obj_frame_tiles(gMapObjectPic_Poochyena_3), + obj_frame_tiles(gMapObjectPic_Poochyena_4), + obj_frame_tiles(gMapObjectPic_Poochyena_5), + obj_frame_tiles(gMapObjectPic_Poochyena_6), + obj_frame_tiles(gMapObjectPic_Poochyena_7), + obj_frame_tiles(gMapObjectPic_Poochyena_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Artist[] = { + obj_frame_tiles(gMapObjectPic_Artist_0), + obj_frame_tiles(gMapObjectPic_Artist_1), + obj_frame_tiles(gMapObjectPic_Artist_2), + obj_frame_tiles(gMapObjectPic_Artist_3), + obj_frame_tiles(gMapObjectPic_Artist_4), + obj_frame_tiles(gMapObjectPic_Artist_5), + obj_frame_tiles(gMapObjectPic_Artist_6), + obj_frame_tiles(gMapObjectPic_Artist_7), + obj_frame_tiles(gMapObjectPic_Artist_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_MayNormal[] = { + obj_frame_tiles(gMapObjectPic_MayNormal_0), + obj_frame_tiles(gMapObjectPic_MayNormal_1), + obj_frame_tiles(gMapObjectPic_MayNormal_2), + obj_frame_tiles(gMapObjectPic_MayNormal_3), + obj_frame_tiles(gMapObjectPic_MayNormal_4), + obj_frame_tiles(gMapObjectPic_MayNormal_5), + obj_frame_tiles(gMapObjectPic_MayNormal_6), + obj_frame_tiles(gMapObjectPic_MayNormal_7), + obj_frame_tiles(gMapObjectPic_MayNormal_8), + obj_frame_tiles(gMapObjectPic_MayNormal_9), + obj_frame_tiles(gMapObjectPic_MayNormal_10), + obj_frame_tiles(gMapObjectPic_MayNormal_11), + obj_frame_tiles(gMapObjectPic_MayNormal_12), + obj_frame_tiles(gMapObjectPic_MayNormal_13), + obj_frame_tiles(gMapObjectPic_MayNormal_14), + obj_frame_tiles(gMapObjectPic_MayNormal_15), + obj_frame_tiles(gMapObjectPic_MayNormal_16), + obj_frame_tiles(gMapObjectPic_MayNormal_17) +}; + +const struct SpriteFrameImage gMapObjectPicTable_MayMachBike[] = { + obj_frame_tiles(gMapObjectPic_MayMachBike_0), + obj_frame_tiles(gMapObjectPic_MayMachBike_1), + obj_frame_tiles(gMapObjectPic_MayMachBike_2), + obj_frame_tiles(gMapObjectPic_MayMachBike_3), + obj_frame_tiles(gMapObjectPic_MayMachBike_4), + obj_frame_tiles(gMapObjectPic_MayMachBike_5), + obj_frame_tiles(gMapObjectPic_MayMachBike_6), + obj_frame_tiles(gMapObjectPic_MayMachBike_7), + obj_frame_tiles(gMapObjectPic_MayMachBike_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_MayAcroBike[] = { + obj_frame_tiles(gMapObjectPic_MayAcroBike_0), + obj_frame_tiles(gMapObjectPic_MayAcroBike_1), + obj_frame_tiles(gMapObjectPic_MayAcroBike_2), + obj_frame_tiles(gMapObjectPic_MayAcroBike_3), + obj_frame_tiles(gMapObjectPic_MayAcroBike_4), + obj_frame_tiles(gMapObjectPic_MayAcroBike_5), + obj_frame_tiles(gMapObjectPic_MayAcroBike_6), + obj_frame_tiles(gMapObjectPic_MayAcroBike_7), + obj_frame_tiles(gMapObjectPic_MayAcroBike_8), + obj_frame_tiles(gMapObjectPic_MayAcroBike_9), + obj_frame_tiles(gMapObjectPic_MayAcroBike_10), + obj_frame_tiles(gMapObjectPic_MayAcroBike_11), + obj_frame_tiles(gMapObjectPic_MayAcroBike_12), + obj_frame_tiles(gMapObjectPic_MayAcroBike_13), + obj_frame_tiles(gMapObjectPic_MayAcroBike_14), + obj_frame_tiles(gMapObjectPic_MayAcroBike_15), + obj_frame_tiles(gMapObjectPic_MayAcroBike_16), + obj_frame_tiles(gMapObjectPic_MayAcroBike_17), + obj_frame_tiles(gMapObjectPic_MayAcroBike_18), + obj_frame_tiles(gMapObjectPic_MayAcroBike_19), + obj_frame_tiles(gMapObjectPic_MayAcroBike_20), + obj_frame_tiles(gMapObjectPic_MayAcroBike_21), + obj_frame_tiles(gMapObjectPic_MayAcroBike_22), + obj_frame_tiles(gMapObjectPic_MayAcroBike_23), + obj_frame_tiles(gMapObjectPic_MayAcroBike_24), + obj_frame_tiles(gMapObjectPic_MayAcroBike_25), + obj_frame_tiles(gMapObjectPic_MayAcroBike_26) +}; + +const struct SpriteFrameImage gMapObjectPicTable_MaySurfing[] = { + obj_frame_tiles(gMapObjectPic_MaySurfing_0), + obj_frame_tiles(gMapObjectPic_MaySurfing_1), + obj_frame_tiles(gMapObjectPic_MaySurfing_2), + obj_frame_tiles(gMapObjectPic_MaySurfing_0), + obj_frame_tiles(gMapObjectPic_MaySurfing_0), + obj_frame_tiles(gMapObjectPic_MaySurfing_1), + obj_frame_tiles(gMapObjectPic_MaySurfing_1), + obj_frame_tiles(gMapObjectPic_MaySurfing_2), + obj_frame_tiles(gMapObjectPic_MaySurfing_2), + obj_frame_tiles(gMapObjectPic_MaySurfing_3), + obj_frame_tiles(gMapObjectPic_MaySurfing_4), + obj_frame_tiles(gMapObjectPic_MaySurfing_5) +}; + +const struct SpriteFrameImage gMapObjectPicTable_MayUnderwater[] = { + obj_frame_tiles(gMapObjectPic_MayUnderwater_0), + obj_frame_tiles(gMapObjectPic_MayUnderwater_1), + obj_frame_tiles(gMapObjectPic_MayUnderwater_2), + obj_frame_tiles(gMapObjectPic_MayUnderwater_0), + obj_frame_tiles(gMapObjectPic_MayUnderwater_0), + obj_frame_tiles(gMapObjectPic_MayUnderwater_1), + obj_frame_tiles(gMapObjectPic_MayUnderwater_1), + obj_frame_tiles(gMapObjectPic_MayUnderwater_2), + obj_frame_tiles(gMapObjectPic_MayUnderwater_2) +}; + +const struct SpriteFrameImage gMapObjectPicTable_MayFieldMove[] = { + obj_frame_tiles(gMapObjectPic_MayFieldMove_0), + obj_frame_tiles(gMapObjectPic_MayFieldMove_1), + obj_frame_tiles(gMapObjectPic_MayFieldMove_2), + obj_frame_tiles(gMapObjectPic_MayFieldMove_3), + obj_frame_tiles(gMapObjectPic_MayFieldMove_4) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Cameraman[] = { + obj_frame_tiles(gMapObjectPic_Cameraman_0), + obj_frame_tiles(gMapObjectPic_Cameraman_1), + obj_frame_tiles(gMapObjectPic_Cameraman_2), + obj_frame_tiles(gMapObjectPic_Cameraman_3), + obj_frame_tiles(gMapObjectPic_Cameraman_4), + obj_frame_tiles(gMapObjectPic_Cameraman_5), + obj_frame_tiles(gMapObjectPic_Cameraman_6), + obj_frame_tiles(gMapObjectPic_Cameraman_7), + obj_frame_tiles(gMapObjectPic_Cameraman_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_MovingBox[] = { + obj_frame_tiles(gMapObjectPic_MovingBox) +}; + +const struct SpriteFrameImage gMapObjectPicTable_CableCar[] = { + obj_frame_tiles(gMapObjectPic_CableCar) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Scientist2[] = { + obj_frame_tiles(gMapObjectPic_Scientist2_0), + obj_frame_tiles(gMapObjectPic_Scientist2_1), + obj_frame_tiles(gMapObjectPic_Scientist2_2), + obj_frame_tiles(gMapObjectPic_Scientist2_3), + obj_frame_tiles(gMapObjectPic_Scientist2_4), + obj_frame_tiles(gMapObjectPic_Scientist2_5), + obj_frame_tiles(gMapObjectPic_Scientist2_6), + obj_frame_tiles(gMapObjectPic_Scientist2_7), + obj_frame_tiles(gMapObjectPic_Scientist2_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Man7[] = { + obj_frame_tiles(gMapObjectPic_Man7_0), + obj_frame_tiles(gMapObjectPic_Man7_1), + obj_frame_tiles(gMapObjectPic_Man7_2), + obj_frame_tiles(gMapObjectPic_Man7_3), + obj_frame_tiles(gMapObjectPic_Man7_4), + obj_frame_tiles(gMapObjectPic_Man7_5), + obj_frame_tiles(gMapObjectPic_Man7_6), + obj_frame_tiles(gMapObjectPic_Man7_7), + obj_frame_tiles(gMapObjectPic_Man7_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_AquaMemberM[] = { + obj_frame_tiles(gMapObjectPic_AquaMemberM_0), + obj_frame_tiles(gMapObjectPic_AquaMemberM_1), + obj_frame_tiles(gMapObjectPic_AquaMemberM_2), + obj_frame_tiles(gMapObjectPic_AquaMemberM_3), + obj_frame_tiles(gMapObjectPic_AquaMemberM_4), + obj_frame_tiles(gMapObjectPic_AquaMemberM_5), + obj_frame_tiles(gMapObjectPic_AquaMemberM_6), + obj_frame_tiles(gMapObjectPic_AquaMemberM_7), + obj_frame_tiles(gMapObjectPic_AquaMemberM_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_AquaMemberF[] = { + obj_frame_tiles(gMapObjectPic_AquaMemberF_0), + obj_frame_tiles(gMapObjectPic_AquaMemberF_1), + obj_frame_tiles(gMapObjectPic_AquaMemberF_2), + obj_frame_tiles(gMapObjectPic_AquaMemberF_3), + obj_frame_tiles(gMapObjectPic_AquaMemberF_4), + obj_frame_tiles(gMapObjectPic_AquaMemberF_5), + obj_frame_tiles(gMapObjectPic_AquaMemberF_6), + obj_frame_tiles(gMapObjectPic_AquaMemberF_7), + obj_frame_tiles(gMapObjectPic_AquaMemberF_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_MagmaMemberM[] = { + obj_frame_tiles(gMapObjectPic_MagmaMemberM_0), + obj_frame_tiles(gMapObjectPic_MagmaMemberM_1), + obj_frame_tiles(gMapObjectPic_MagmaMemberM_2), + obj_frame_tiles(gMapObjectPic_MagmaMemberM_3), + obj_frame_tiles(gMapObjectPic_MagmaMemberM_4), + obj_frame_tiles(gMapObjectPic_MagmaMemberM_5), + obj_frame_tiles(gMapObjectPic_MagmaMemberM_6), + obj_frame_tiles(gMapObjectPic_MagmaMemberM_7), + obj_frame_tiles(gMapObjectPic_MagmaMemberM_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_MagmaMemberF[] = { + obj_frame_tiles(gMapObjectPic_MagmaMemberF_0), + obj_frame_tiles(gMapObjectPic_MagmaMemberF_1), + obj_frame_tiles(gMapObjectPic_MagmaMemberF_2), + obj_frame_tiles(gMapObjectPic_MagmaMemberF_3), + obj_frame_tiles(gMapObjectPic_MagmaMemberF_4), + obj_frame_tiles(gMapObjectPic_MagmaMemberF_5), + obj_frame_tiles(gMapObjectPic_MagmaMemberF_6), + obj_frame_tiles(gMapObjectPic_MagmaMemberF_7), + obj_frame_tiles(gMapObjectPic_MagmaMemberF_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Sidney[] = { + obj_frame_tiles(gMapObjectPic_Sidney_0), + obj_frame_tiles(gMapObjectPic_Sidney_1), + obj_frame_tiles(gMapObjectPic_Sidney_2), + obj_frame_tiles(gMapObjectPic_Sidney_0), + obj_frame_tiles(gMapObjectPic_Sidney_0), + obj_frame_tiles(gMapObjectPic_Sidney_1), + obj_frame_tiles(gMapObjectPic_Sidney_1), + obj_frame_tiles(gMapObjectPic_Sidney_2), + obj_frame_tiles(gMapObjectPic_Sidney_2) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Phoebe[] = { + obj_frame_tiles(gMapObjectPic_Phoebe_0), + obj_frame_tiles(gMapObjectPic_Phoebe_1), + obj_frame_tiles(gMapObjectPic_Phoebe_2), + obj_frame_tiles(gMapObjectPic_Phoebe_0), + obj_frame_tiles(gMapObjectPic_Phoebe_0), + obj_frame_tiles(gMapObjectPic_Phoebe_1), + obj_frame_tiles(gMapObjectPic_Phoebe_1), + obj_frame_tiles(gMapObjectPic_Phoebe_2), + obj_frame_tiles(gMapObjectPic_Phoebe_2) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Glacia[] = { + obj_frame_tiles(gMapObjectPic_Glacia_0), + obj_frame_tiles(gMapObjectPic_Glacia_1), + obj_frame_tiles(gMapObjectPic_Glacia_2), + obj_frame_tiles(gMapObjectPic_Glacia_0), + obj_frame_tiles(gMapObjectPic_Glacia_0), + obj_frame_tiles(gMapObjectPic_Glacia_1), + obj_frame_tiles(gMapObjectPic_Glacia_1), + obj_frame_tiles(gMapObjectPic_Glacia_2), + obj_frame_tiles(gMapObjectPic_Glacia_2) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Drake[] = { + obj_frame_tiles(gMapObjectPic_Drake_0), + obj_frame_tiles(gMapObjectPic_Drake_1), + obj_frame_tiles(gMapObjectPic_Drake_2), + obj_frame_tiles(gMapObjectPic_Drake_0), + obj_frame_tiles(gMapObjectPic_Drake_0), + obj_frame_tiles(gMapObjectPic_Drake_1), + obj_frame_tiles(gMapObjectPic_Drake_1), + obj_frame_tiles(gMapObjectPic_Drake_2), + obj_frame_tiles(gMapObjectPic_Drake_2) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Roxanne[] = { + obj_frame_tiles(gMapObjectPic_Roxanne_0), + obj_frame_tiles(gMapObjectPic_Roxanne_1), + obj_frame_tiles(gMapObjectPic_Roxanne_2), + obj_frame_tiles(gMapObjectPic_Roxanne_0), + obj_frame_tiles(gMapObjectPic_Roxanne_0), + obj_frame_tiles(gMapObjectPic_Roxanne_1), + obj_frame_tiles(gMapObjectPic_Roxanne_1), + obj_frame_tiles(gMapObjectPic_Roxanne_2), + obj_frame_tiles(gMapObjectPic_Roxanne_2) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Brawly[] = { + obj_frame_tiles(gMapObjectPic_Brawly_0), + obj_frame_tiles(gMapObjectPic_Brawly_1), + obj_frame_tiles(gMapObjectPic_Brawly_2), + obj_frame_tiles(gMapObjectPic_Brawly_0), + obj_frame_tiles(gMapObjectPic_Brawly_0), + obj_frame_tiles(gMapObjectPic_Brawly_1), + obj_frame_tiles(gMapObjectPic_Brawly_1), + obj_frame_tiles(gMapObjectPic_Brawly_2), + obj_frame_tiles(gMapObjectPic_Brawly_2) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Wattson[] = { + obj_frame_tiles(gMapObjectPic_Wattson_0), + obj_frame_tiles(gMapObjectPic_Wattson_1), + obj_frame_tiles(gMapObjectPic_Wattson_2), + obj_frame_tiles(gMapObjectPic_Wattson_0), + obj_frame_tiles(gMapObjectPic_Wattson_0), + obj_frame_tiles(gMapObjectPic_Wattson_1), + obj_frame_tiles(gMapObjectPic_Wattson_1), + obj_frame_tiles(gMapObjectPic_Wattson_2), + obj_frame_tiles(gMapObjectPic_Wattson_2) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Flannery[] = { + obj_frame_tiles(gMapObjectPic_Flannery_0), + obj_frame_tiles(gMapObjectPic_Flannery_1), + obj_frame_tiles(gMapObjectPic_Flannery_2), + obj_frame_tiles(gMapObjectPic_Flannery_0), + obj_frame_tiles(gMapObjectPic_Flannery_0), + obj_frame_tiles(gMapObjectPic_Flannery_1), + obj_frame_tiles(gMapObjectPic_Flannery_1), + obj_frame_tiles(gMapObjectPic_Flannery_2), + obj_frame_tiles(gMapObjectPic_Flannery_2) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Norman[] = { + obj_frame_tiles(gMapObjectPic_Norman_0), + obj_frame_tiles(gMapObjectPic_Norman_1), + obj_frame_tiles(gMapObjectPic_Norman_2), + obj_frame_tiles(gMapObjectPic_Norman_3), + obj_frame_tiles(gMapObjectPic_Norman_4), + obj_frame_tiles(gMapObjectPic_Norman_5), + obj_frame_tiles(gMapObjectPic_Norman_6), + obj_frame_tiles(gMapObjectPic_Norman_7), + obj_frame_tiles(gMapObjectPic_Norman_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Winona[] = { + obj_frame_tiles(gMapObjectPic_Winona_0), + obj_frame_tiles(gMapObjectPic_Winona_1), + obj_frame_tiles(gMapObjectPic_Winona_2), + obj_frame_tiles(gMapObjectPic_Winona_0), + obj_frame_tiles(gMapObjectPic_Winona_0), + obj_frame_tiles(gMapObjectPic_Winona_1), + obj_frame_tiles(gMapObjectPic_Winona_1), + obj_frame_tiles(gMapObjectPic_Winona_2), + obj_frame_tiles(gMapObjectPic_Winona_2) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Liza[] = { + obj_frame_tiles(gMapObjectPic_Liza_0), + obj_frame_tiles(gMapObjectPic_Liza_1), + obj_frame_tiles(gMapObjectPic_Liza_2), + obj_frame_tiles(gMapObjectPic_Liza_0), + obj_frame_tiles(gMapObjectPic_Liza_0), + obj_frame_tiles(gMapObjectPic_Liza_1), + obj_frame_tiles(gMapObjectPic_Liza_1), + obj_frame_tiles(gMapObjectPic_Liza_2), + obj_frame_tiles(gMapObjectPic_Liza_2) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Tate[] = { + obj_frame_tiles(gMapObjectPic_Tate_0), + obj_frame_tiles(gMapObjectPic_Tate_1), + obj_frame_tiles(gMapObjectPic_Tate_2), + obj_frame_tiles(gMapObjectPic_Tate_0), + obj_frame_tiles(gMapObjectPic_Tate_0), + obj_frame_tiles(gMapObjectPic_Tate_1), + obj_frame_tiles(gMapObjectPic_Tate_1), + obj_frame_tiles(gMapObjectPic_Tate_2), + obj_frame_tiles(gMapObjectPic_Tate_2) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Wallace[] = { + obj_frame_tiles(gMapObjectPic_Wallace_0), + obj_frame_tiles(gMapObjectPic_Wallace_1), + obj_frame_tiles(gMapObjectPic_Wallace_2), + obj_frame_tiles(gMapObjectPic_Wallace_3), + obj_frame_tiles(gMapObjectPic_Wallace_4), + obj_frame_tiles(gMapObjectPic_Wallace_5), + obj_frame_tiles(gMapObjectPic_Wallace_6), + obj_frame_tiles(gMapObjectPic_Wallace_7), + obj_frame_tiles(gMapObjectPic_Wallace_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Steven[] = { + obj_frame_tiles(gMapObjectPic_Steven_0), + obj_frame_tiles(gMapObjectPic_Steven_1), + obj_frame_tiles(gMapObjectPic_Steven_2), + obj_frame_tiles(gMapObjectPic_Steven_3), + obj_frame_tiles(gMapObjectPic_Steven_4), + obj_frame_tiles(gMapObjectPic_Steven_5), + obj_frame_tiles(gMapObjectPic_Steven_6), + obj_frame_tiles(gMapObjectPic_Steven_7), + obj_frame_tiles(gMapObjectPic_Steven_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Wally[] = { + obj_frame_tiles(gMapObjectPic_Wally_0), + obj_frame_tiles(gMapObjectPic_Wally_1), + obj_frame_tiles(gMapObjectPic_Wally_2), + obj_frame_tiles(gMapObjectPic_Wally_3), + obj_frame_tiles(gMapObjectPic_Wally_4), + obj_frame_tiles(gMapObjectPic_Wally_5), + obj_frame_tiles(gMapObjectPic_Wally_6), + obj_frame_tiles(gMapObjectPic_Wally_7), + obj_frame_tiles(gMapObjectPic_Wally_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_LittleBoy3[] = { + obj_frame_tiles(gMapObjectPic_LittleBoy3_0), + obj_frame_tiles(gMapObjectPic_LittleBoy3_1), + obj_frame_tiles(gMapObjectPic_LittleBoy3_2), + obj_frame_tiles(gMapObjectPic_LittleBoy3_3), + obj_frame_tiles(gMapObjectPic_LittleBoy3_4), + obj_frame_tiles(gMapObjectPic_LittleBoy3_5), + obj_frame_tiles(gMapObjectPic_LittleBoy3_6), + obj_frame_tiles(gMapObjectPic_LittleBoy3_7), + obj_frame_tiles(gMapObjectPic_LittleBoy3_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_BrendanFishing[] = { + obj_frame_tiles(gMapObjectPic_BrendanFishing_0), + obj_frame_tiles(gMapObjectPic_BrendanFishing_1), + obj_frame_tiles(gMapObjectPic_BrendanFishing_2), + obj_frame_tiles(gMapObjectPic_BrendanFishing_3), + obj_frame_tiles(gMapObjectPic_BrendanFishing_4), + obj_frame_tiles(gMapObjectPic_BrendanFishing_5), + obj_frame_tiles(gMapObjectPic_BrendanFishing_6), + obj_frame_tiles(gMapObjectPic_BrendanFishing_7), + obj_frame_tiles(gMapObjectPic_BrendanFishing_8), + obj_frame_tiles(gMapObjectPic_BrendanFishing_9), + obj_frame_tiles(gMapObjectPic_BrendanFishing_10), + obj_frame_tiles(gMapObjectPic_BrendanFishing_11) +}; + +const struct SpriteFrameImage gMapObjectPicTable_MayFishing[] = { + obj_frame_tiles(gMapObjectPic_MayFishing_0), + obj_frame_tiles(gMapObjectPic_MayFishing_1), + obj_frame_tiles(gMapObjectPic_MayFishing_2), + obj_frame_tiles(gMapObjectPic_MayFishing_3), + obj_frame_tiles(gMapObjectPic_MayFishing_4), + obj_frame_tiles(gMapObjectPic_MayFishing_5), + obj_frame_tiles(gMapObjectPic_MayFishing_6), + obj_frame_tiles(gMapObjectPic_MayFishing_7), + obj_frame_tiles(gMapObjectPic_MayFishing_8), + obj_frame_tiles(gMapObjectPic_MayFishing_9), + obj_frame_tiles(gMapObjectPic_MayFishing_10), + obj_frame_tiles(gMapObjectPic_MayFishing_11) +}; + +const struct SpriteFrameImage gMapObjectPicTable_HotSpringsOldWoman[] = { + obj_frame_tiles(gMapObjectPic_HotSpringsOldWoman_0), + obj_frame_tiles(gMapObjectPic_HotSpringsOldWoman_1), + obj_frame_tiles(gMapObjectPic_HotSpringsOldWoman_2), + obj_frame_tiles(gMapObjectPic_HotSpringsOldWoman_3), + obj_frame_tiles(gMapObjectPic_HotSpringsOldWoman_4), + obj_frame_tiles(gMapObjectPic_HotSpringsOldWoman_5), + obj_frame_tiles(gMapObjectPic_HotSpringsOldWoman_6), + obj_frame_tiles(gMapObjectPic_HotSpringsOldWoman_7), + obj_frame_tiles(gMapObjectPic_HotSpringsOldWoman_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_SSTidal[] = { + obj_frame_tiles(gMapObjectPic_SSTidal), + obj_frame_tiles(gMapObjectPic_SSTidal), + obj_frame_tiles(gMapObjectPic_SSTidal), + obj_frame_tiles(gMapObjectPic_SSTidal), + obj_frame_tiles(gMapObjectPic_SSTidal), + obj_frame_tiles(gMapObjectPic_SSTidal), + obj_frame_tiles(gMapObjectPic_SSTidal), + obj_frame_tiles(gMapObjectPic_SSTidal), + obj_frame_tiles(gMapObjectPic_SSTidal) +}; + +const struct SpriteFrameImage gMapObjectPicTable_SubmarineShadow[] = { + obj_frame_tiles(gMapObjectPic_SubmarineShadow), + obj_frame_tiles(gMapObjectPic_SubmarineShadow), + obj_frame_tiles(gMapObjectPic_SubmarineShadow), + obj_frame_tiles(gMapObjectPic_SubmarineShadow), + obj_frame_tiles(gMapObjectPic_SubmarineShadow), + obj_frame_tiles(gMapObjectPic_SubmarineShadow), + obj_frame_tiles(gMapObjectPic_SubmarineShadow), + obj_frame_tiles(gMapObjectPic_SubmarineShadow), + obj_frame_tiles(gMapObjectPic_SubmarineShadow) +}; + +const struct SpriteFrameImage gMapObjectPicTable_PichuDoll[] = { + obj_frame_tiles(gMapObjectPic_PichuDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_PikachuDoll[] = { + obj_frame_tiles(gMapObjectPic_PikachuDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_MarillDoll[] = { + obj_frame_tiles(gMapObjectPic_MarillDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_TogepiDoll[] = { + obj_frame_tiles(gMapObjectPic_TogepiDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_CyndaquilDoll[] = { + obj_frame_tiles(gMapObjectPic_CyndaquilDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_ChikoritaDoll[] = { + obj_frame_tiles(gMapObjectPic_ChikoritaDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_TotodileDoll[] = { + obj_frame_tiles(gMapObjectPic_TotodileDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_JigglypuffDoll[] = { + obj_frame_tiles(gMapObjectPic_JigglypuffDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_MeowthDoll[] = { + obj_frame_tiles(gMapObjectPic_MeowthDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_ClefairyDoll[] = { + obj_frame_tiles(gMapObjectPic_ClefairyDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_DittoDoll[] = { + obj_frame_tiles(gMapObjectPic_DittoDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_SmoochumDoll[] = { + obj_frame_tiles(gMapObjectPic_SmoochumDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_TreeckoDoll[] = { + obj_frame_tiles(gMapObjectPic_TreeckoDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_TorchicDoll[] = { + obj_frame_tiles(gMapObjectPic_TorchicDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_MudkipDoll[] = { + obj_frame_tiles(gMapObjectPic_MudkipDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_DuskullDoll[] = { + obj_frame_tiles(gMapObjectPic_DuskullDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_WynautDoll[] = { + obj_frame_tiles(gMapObjectPic_WynautDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_BaltoyDoll[] = { + obj_frame_tiles(gMapObjectPic_BaltoyDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_KecleonDoll[] = { + obj_frame_tiles(gMapObjectPic_KecleonDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_AzurillDoll[] = { + obj_frame_tiles(gMapObjectPic_AzurillDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_SkittyDoll[] = { + obj_frame_tiles(gMapObjectPic_SkittyDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_SwabluDoll[] = { + obj_frame_tiles(gMapObjectPic_SwabluDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_GulpinDoll[] = { + obj_frame_tiles(gMapObjectPic_GulpinDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_LotadDoll[] = { + obj_frame_tiles(gMapObjectPic_LotadDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_SeedotDoll[] = { + obj_frame_tiles(gMapObjectPic_SeedotDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_PikaCushion[] = { + obj_frame_tiles(gMapObjectPic_PikaCushion) +}; + +const struct SpriteFrameImage gMapObjectPicTable_RoundCushion[] = { + obj_frame_tiles(gMapObjectPic_RoundCushion) +}; + +const struct SpriteFrameImage gMapObjectPicTable_KissCushion[] = { + obj_frame_tiles(gMapObjectPic_KissCushion) +}; + +const struct SpriteFrameImage gMapObjectPicTable_ZigzagCushion[] = { + obj_frame_tiles(gMapObjectPic_ZigzagCushion) +}; + +const struct SpriteFrameImage gMapObjectPicTable_SpinCushion[] = { + obj_frame_tiles(gMapObjectPic_SpinCushion) +}; + +const struct SpriteFrameImage gMapObjectPicTable_DiamondCushion[] = { + obj_frame_tiles(gMapObjectPic_DiamondCushion) +}; + +const struct SpriteFrameImage gMapObjectPicTable_BallCushion[] = { + obj_frame_tiles(gMapObjectPic_BallCushion) +}; + +const struct SpriteFrameImage gMapObjectPicTable_GrassCushion[] = { + obj_frame_tiles(gMapObjectPic_GrassCushion) +}; + +const struct SpriteFrameImage gMapObjectPicTable_FireCushion[] = { + obj_frame_tiles(gMapObjectPic_FireCushion) +}; + +const struct SpriteFrameImage gMapObjectPicTable_WaterCushion[] = { + obj_frame_tiles(gMapObjectPic_WaterCushion) +}; + +const struct SpriteFrameImage gMapObjectPicTable_BigSnorlaxDoll[] = { + obj_frame_tiles(gMapObjectPic_BigSnorlaxDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_BigRhydonDoll[] = { + obj_frame_tiles(gMapObjectPic_BigRhydonDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_BigLaprasDoll[] = { + obj_frame_tiles(gMapObjectPic_BigLaprasDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_BigVenusaurDoll[] = { + obj_frame_tiles(gMapObjectPic_BigVenusaurDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_BigCharizardDoll[] = { + obj_frame_tiles(gMapObjectPic_BigCharizardDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_BigBlastoiseDoll[] = { + obj_frame_tiles(gMapObjectPic_BigBlastoiseDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_BigWailmerDoll[] = { + obj_frame_tiles(gMapObjectPic_BigWailmerDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_BigRegirockDoll[] = { + obj_frame_tiles(gMapObjectPic_BigRegirockDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_BigRegiceDoll[] = { + obj_frame_tiles(gMapObjectPic_BigRegiceDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_BigRegisteelDoll[] = { + obj_frame_tiles(gMapObjectPic_BigRegisteelDoll) +}; + +const struct SpriteFrameImage gMapObjectPicTable_LatiasLatios[] = { + obj_frame_tiles(gMapObjectPic_LatiasLatios_0), + obj_frame_tiles(gMapObjectPic_LatiasLatios_0), + obj_frame_tiles(gMapObjectPic_LatiasLatios_0), + obj_frame_tiles(gMapObjectPic_LatiasLatios_1), + obj_frame_tiles(gMapObjectPic_LatiasLatios_2), + obj_frame_tiles(gMapObjectPic_LatiasLatios_1), + obj_frame_tiles(gMapObjectPic_LatiasLatios_2), + obj_frame_tiles(gMapObjectPic_LatiasLatios_1), + obj_frame_tiles(gMapObjectPic_LatiasLatios_2) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Boy5[] = { + obj_frame_tiles(gMapObjectPic_Boy5_0), + obj_frame_tiles(gMapObjectPic_Boy5_1), + obj_frame_tiles(gMapObjectPic_Boy5_2), + obj_frame_tiles(gMapObjectPic_Boy5_0), + obj_frame_tiles(gMapObjectPic_Boy5_0), + obj_frame_tiles(gMapObjectPic_Boy5_1), + obj_frame_tiles(gMapObjectPic_Boy5_1), + obj_frame_tiles(gMapObjectPic_Boy5_2), + obj_frame_tiles(gMapObjectPic_Boy5_2) +}; + +const struct SpriteFrameImage gMapObjectPicTable_ContestJudge[] = { + obj_frame_tiles(gMapObjectPic_ContestJudge_0), + obj_frame_tiles(gMapObjectPic_ContestJudge_1), + obj_frame_tiles(gMapObjectPic_ContestJudge_2), + obj_frame_tiles(gMapObjectPic_ContestJudge_3), + obj_frame_tiles(gMapObjectPic_ContestJudge_4), + obj_frame_tiles(gMapObjectPic_ContestJudge_5), + obj_frame_tiles(gMapObjectPic_ContestJudge_6), + obj_frame_tiles(gMapObjectPic_ContestJudge_7), + obj_frame_tiles(gMapObjectPic_ContestJudge_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_BrendanWatering[] = { + obj_frame_tiles(gMapObjectPic_BrendanWatering_0), + obj_frame_tiles(gMapObjectPic_BrendanWatering_1), + obj_frame_tiles(gMapObjectPic_BrendanWatering_2), + obj_frame_tiles(gMapObjectPic_BrendanWatering_3), + obj_frame_tiles(gMapObjectPic_BrendanWatering_3), + obj_frame_tiles(gMapObjectPic_BrendanWatering_4), + obj_frame_tiles(gMapObjectPic_BrendanWatering_4), + obj_frame_tiles(gMapObjectPic_BrendanWatering_5), + obj_frame_tiles(gMapObjectPic_BrendanWatering_5) +}; + +const struct SpriteFrameImage gMapObjectPicTable_MayWatering[] = { + obj_frame_tiles(gMapObjectPic_MayWatering_0), + obj_frame_tiles(gMapObjectPic_MayWatering_1), + obj_frame_tiles(gMapObjectPic_MayWatering_2), + obj_frame_tiles(gMapObjectPic_MayWatering_3), + obj_frame_tiles(gMapObjectPic_MayWatering_3), + obj_frame_tiles(gMapObjectPic_MayWatering_4), + obj_frame_tiles(gMapObjectPic_MayWatering_4), + obj_frame_tiles(gMapObjectPic_MayWatering_5), + obj_frame_tiles(gMapObjectPic_MayWatering_5) +}; + +const struct SpriteFrameImage gMapObjectPicTable_BrendanDecorating[] = { + obj_frame_tiles(gMapObjectPic_BrendanDecorating) +}; + +const struct SpriteFrameImage gMapObjectPicTable_MayDecorating[] = { + obj_frame_tiles(gMapObjectPic_MayDecorating) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Archie[] = { + obj_frame_tiles(gMapObjectPic_Archie_0), + obj_frame_tiles(gMapObjectPic_Archie_1), + obj_frame_tiles(gMapObjectPic_Archie_2), + obj_frame_tiles(gMapObjectPic_Archie_3), + obj_frame_tiles(gMapObjectPic_Archie_4), + obj_frame_tiles(gMapObjectPic_Archie_5), + obj_frame_tiles(gMapObjectPic_Archie_6), + obj_frame_tiles(gMapObjectPic_Archie_7), + obj_frame_tiles(gMapObjectPic_Archie_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Maxie[] = { + obj_frame_tiles(gMapObjectPic_Maxie_0), + obj_frame_tiles(gMapObjectPic_Maxie_1), + obj_frame_tiles(gMapObjectPic_Maxie_2), + obj_frame_tiles(gMapObjectPic_Maxie_3), + obj_frame_tiles(gMapObjectPic_Maxie_4), + obj_frame_tiles(gMapObjectPic_Maxie_5), + obj_frame_tiles(gMapObjectPic_Maxie_6), + obj_frame_tiles(gMapObjectPic_Maxie_7), + obj_frame_tiles(gMapObjectPic_Maxie_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Kyogre[] = { + obj_frame_tiles(gMapObjectPic_Kyogre_0), + obj_frame_tiles(gMapObjectPic_Kyogre_0), + obj_frame_tiles(gMapObjectPic_Kyogre_0), + obj_frame_tiles(gMapObjectPic_Kyogre_1), + obj_frame_tiles(gMapObjectPic_Kyogre_1), + obj_frame_tiles(gMapObjectPic_Kyogre_1), + obj_frame_tiles(gMapObjectPic_Kyogre_1), + obj_frame_tiles(gMapObjectPic_Kyogre_1), + obj_frame_tiles(gMapObjectPic_Kyogre_1) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Groudon[] = { + obj_frame_tiles(gMapObjectPic_Groudon_0), + obj_frame_tiles(gMapObjectPic_Groudon_0), + obj_frame_tiles(gMapObjectPic_Groudon_0), + obj_frame_tiles(gMapObjectPic_Groudon_1), + obj_frame_tiles(gMapObjectPic_Groudon_1), + obj_frame_tiles(gMapObjectPic_Groudon_1), + obj_frame_tiles(gMapObjectPic_Groudon_1), + obj_frame_tiles(gMapObjectPic_Groudon_1), + obj_frame_tiles(gMapObjectPic_Groudon_1) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Fossil[] = { + obj_frame_tiles(gMapObjectPic_Fossil) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Regi[] = { + obj_frame_tiles(gMapObjectPic_Regi), + obj_frame_tiles(gMapObjectPic_Regi), + obj_frame_tiles(gMapObjectPic_Regi), + obj_frame_tiles(gMapObjectPic_Regi), + obj_frame_tiles(gMapObjectPic_Regi), + obj_frame_tiles(gMapObjectPic_Regi), + obj_frame_tiles(gMapObjectPic_Regi), + obj_frame_tiles(gMapObjectPic_Regi), + obj_frame_tiles(gMapObjectPic_Regi) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Skitty[] = { + obj_frame_tiles(gMapObjectPic_Skitty_0), + obj_frame_tiles(gMapObjectPic_Skitty_1), + obj_frame_tiles(gMapObjectPic_Skitty_2), + obj_frame_tiles(gMapObjectPic_Skitty_0), + obj_frame_tiles(gMapObjectPic_Skitty_0), + obj_frame_tiles(gMapObjectPic_Skitty_1), + obj_frame_tiles(gMapObjectPic_Skitty_1), + obj_frame_tiles(gMapObjectPic_Skitty_2), + obj_frame_tiles(gMapObjectPic_Skitty_2) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Kecleon[] = { + obj_frame_tiles(gMapObjectPic_Kecleon_0), + obj_frame_tiles(gMapObjectPic_Kecleon_1), + obj_frame_tiles(gMapObjectPic_Kecleon_2), + obj_frame_tiles(gMapObjectPic_Kecleon_0), + obj_frame_tiles(gMapObjectPic_Kecleon_0), + obj_frame_tiles(gMapObjectPic_Kecleon_1), + obj_frame_tiles(gMapObjectPic_Kecleon_1), + obj_frame_tiles(gMapObjectPic_Kecleon_2), + obj_frame_tiles(gMapObjectPic_Kecleon_2) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Rayquaza[] = { + obj_frame_tiles(gMapObjectPic_Rayquaza_0), + obj_frame_tiles(gMapObjectPic_Rayquaza_0), + obj_frame_tiles(gMapObjectPic_Rayquaza_0), + obj_frame_tiles(gMapObjectPic_Rayquaza_1), + obj_frame_tiles(gMapObjectPic_Rayquaza_1), + obj_frame_tiles(gMapObjectPic_Rayquaza_1), + obj_frame_tiles(gMapObjectPic_Rayquaza_1), + obj_frame_tiles(gMapObjectPic_Rayquaza_1), + obj_frame_tiles(gMapObjectPic_Rayquaza_1) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Zigzagoon[] = { + obj_frame_tiles(gMapObjectPic_Zigzagoon_0), + obj_frame_tiles(gMapObjectPic_Zigzagoon_1), + obj_frame_tiles(gMapObjectPic_Zigzagoon_2), + obj_frame_tiles(gMapObjectPic_Zigzagoon_0), + obj_frame_tiles(gMapObjectPic_Zigzagoon_0), + obj_frame_tiles(gMapObjectPic_Zigzagoon_1), + obj_frame_tiles(gMapObjectPic_Zigzagoon_1), + obj_frame_tiles(gMapObjectPic_Zigzagoon_2), + obj_frame_tiles(gMapObjectPic_Zigzagoon_2) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Pikachu[] = { + obj_frame_tiles(gMapObjectPic_Pikachu_0), + obj_frame_tiles(gMapObjectPic_Pikachu_1), + obj_frame_tiles(gMapObjectPic_Pikachu_2), + obj_frame_tiles(gMapObjectPic_Pikachu_0), + obj_frame_tiles(gMapObjectPic_Pikachu_0), + obj_frame_tiles(gMapObjectPic_Pikachu_1), + obj_frame_tiles(gMapObjectPic_Pikachu_1), + obj_frame_tiles(gMapObjectPic_Pikachu_2), + obj_frame_tiles(gMapObjectPic_Pikachu_2) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Azumarill[] = { + obj_frame_tiles(gMapObjectPic_Azumarill_0), + obj_frame_tiles(gMapObjectPic_Azumarill_1), + obj_frame_tiles(gMapObjectPic_Azumarill_2), + obj_frame_tiles(gMapObjectPic_Azumarill_0), + obj_frame_tiles(gMapObjectPic_Azumarill_0), + obj_frame_tiles(gMapObjectPic_Azumarill_1), + obj_frame_tiles(gMapObjectPic_Azumarill_1), + obj_frame_tiles(gMapObjectPic_Azumarill_2), + obj_frame_tiles(gMapObjectPic_Azumarill_2) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Wingull[] = { + obj_frame_tiles(gMapObjectPic_Wingull_0), + obj_frame_tiles(gMapObjectPic_Wingull_1), + obj_frame_tiles(gMapObjectPic_Wingull_2), + obj_frame_tiles(gMapObjectPic_Wingull_3), + obj_frame_tiles(gMapObjectPic_Wingull_3), + obj_frame_tiles(gMapObjectPic_Wingull_4), + obj_frame_tiles(gMapObjectPic_Wingull_4), + obj_frame_tiles(gMapObjectPic_Wingull_5), + obj_frame_tiles(gMapObjectPic_Wingull_5) +}; + +const struct SpriteFrameImage gMapObjectPicTable_TuberMSwimming[] = { + obj_frame_tiles(gMapObjectPic_TuberMSwimming_0), + obj_frame_tiles(gMapObjectPic_TuberMSwimming_1), + obj_frame_tiles(gMapObjectPic_TuberMSwimming_2), + obj_frame_tiles(gMapObjectPic_TuberMSwimming_3), + obj_frame_tiles(gMapObjectPic_TuberMSwimming_4), + obj_frame_tiles(gMapObjectPic_TuberMSwimming_5), + obj_frame_tiles(gMapObjectPic_TuberMSwimming_6), + obj_frame_tiles(gMapObjectPic_TuberMSwimming_7), + obj_frame_tiles(gMapObjectPic_TuberMSwimming_8) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Azurill[] = { + obj_frame_tiles(gMapObjectPic_Azurill_0), + obj_frame_tiles(gMapObjectPic_Azurill_1), + obj_frame_tiles(gMapObjectPic_Azurill_2), + obj_frame_tiles(gMapObjectPic_Azurill_0), + obj_frame_tiles(gMapObjectPic_Azurill_0), + obj_frame_tiles(gMapObjectPic_Azurill_1), + obj_frame_tiles(gMapObjectPic_Azurill_1), + obj_frame_tiles(gMapObjectPic_Azurill_2), + obj_frame_tiles(gMapObjectPic_Azurill_2) +}; + +const struct SpriteFrameImage gMapObjectPicTable_Mom[] = { + obj_frame_tiles(gMapObjectPic_Mom_0), + obj_frame_tiles(gMapObjectPic_Mom_1), + obj_frame_tiles(gMapObjectPic_Mom_2), + obj_frame_tiles(gMapObjectPic_Mom_3), + obj_frame_tiles(gMapObjectPic_Mom_4), + obj_frame_tiles(gMapObjectPic_Mom_5), + obj_frame_tiles(gMapObjectPic_Mom_6), + obj_frame_tiles(gMapObjectPic_Mom_7), + obj_frame_tiles(gMapObjectPic_Mom_8), +}; + +#endif //POKERUBY_MAP_OBJECT_PIC_TABLES_H diff --git a/src/data/field_map_obj/map_object_subsprites.h b/src/data/field_map_obj/map_object_subsprites.h new file mode 100644 index 000000000..951d71e99 --- /dev/null +++ b/src/data/field_map_obj/map_object_subsprites.h @@ -0,0 +1,345 @@ +// + +// + +#ifndef POKERUBY_MAP_OBJECT_SUBSPRITES_H +#define POKERUBY_MAP_OBJECT_SUBSPRITES_H + +const struct Subsprite gMapObjectSubspriteTable_16x16_0[] = { + { -8, -8, 0, 1, 0, 2} +}; + +const struct Subsprite gMapObjectSubspriteTable_16x16_1[] = { + { -8, -8, 0, 1, 0, 1} +}; + +const struct Subsprite gMapObjectSubspriteTable_16x16_2[] = { + { -8, -8, 1, 0, 0, 2}, + { -8, 0, 1, 0, 2, 3} +}; + +const struct Subsprite gMapObjectSubspriteTable_16x16_3[] = { + { -8, -8, 0, 1, 0, 2}, + { -8, -8, 0, 1, 0, 3} +}; + +const struct Subsprite gMapObjectSubspriteTable_16x16_4[] = { + { -8, -8, 0, 1, 0, 1}, + { -8, -8, 0, 1, 0, 3} +}; + +const struct SubspriteTable gMapObjectSubspriteTables_16x16[] = { + {0, NULL}, + {1, gMapObjectSubspriteTable_16x16_0}, + {1, gMapObjectSubspriteTable_16x16_1}, + {2, gMapObjectSubspriteTable_16x16_2}, + {2, gMapObjectSubspriteTable_16x16_3}, + {2, gMapObjectSubspriteTable_16x16_4} +}; + +const struct Subsprite gMapObjectSubspriteTable_16x32_0[] = { + { -8, -16, 2, 2, 0, 2} +}; + +const struct Subsprite gMapObjectSubspriteTable_16x32_1[] = { + { -8, -16, 2, 2, 0, 1} +}; + +const struct Subsprite gMapObjectSubspriteTable_16x32_2[] = { + { -8, -16, 0, 1, 0, 2}, + { -8, 0, 1, 0, 4, 2}, + { -8, 8, 1, 0, 6, 3} +}; + +const struct Subsprite gMapObjectSubspriteTable_16x32_3[] = { + { -8, -16, 0, 1, 0, 2}, + { -8, 0, 0, 1, 4, 3} +}; + +const struct Subsprite gMapObjectSubspriteTable_16x32_4[] = { + { -8, -16, 0, 1, 0, 1}, + { -8, 0, 0, 1, 4, 3} +}; + +const struct SubspriteTable gMapObjectSubspriteTables_16x32[] = { + {0, NULL}, + {1, gMapObjectSubspriteTable_16x32_0}, + {1, gMapObjectSubspriteTable_16x32_1}, + {3, gMapObjectSubspriteTable_16x32_2}, + {2, gMapObjectSubspriteTable_16x32_3}, + {2, gMapObjectSubspriteTable_16x32_4} +}; + +const struct Subsprite gMapObjectSubspriteTable_32x32_0[] = { + {-16, -16, 0, 2, 0, 2} +}; + +const struct Subsprite gMapObjectSubspriteTable_32x32_1[] = { + {-16, -16, 0, 2, 0, 1} +}; + +const struct Subsprite gMapObjectSubspriteTable_32x32_2[] = { + {-16, -16, 1, 2, 0, 2}, + {-16, 0, 1, 1, 8, 2}, + {-16, 8, 1, 1, 12, 3} +}; + +const struct Subsprite gMapObjectSubspriteTable_32x32_3[] = { + {-16, -16, 1, 2, 0, 2}, + {-16, 0, 1, 2, 8, 3} +}; + +const struct Subsprite gMapObjectSubspriteTable_32x32_4[] = { + {-16, -16, 1, 2, 0, 1}, + {-16, 0, 1, 2, 8, 3} +}; + +const struct SubspriteTable gMapObjectSubspriteTables_32x32[] = { + {0, NULL}, + {1, gMapObjectSubspriteTable_32x32_0}, + {1, gMapObjectSubspriteTable_32x32_1}, + {3, gMapObjectSubspriteTable_32x32_2}, + {2, gMapObjectSubspriteTable_32x32_3}, + {2, gMapObjectSubspriteTable_32x32_4} +}; + +const struct Subsprite gMapObjectSubspriteTable_Truck_0[] = { + {-24, -24, 1, 1, 0, 2}, + { 8, -24, 1, 0, 4, 2}, + {-24, -16, 1, 1, 6, 2}, + { 8, -16, 1, 0, 10, 2}, + {-24, -8, 1, 1, 12, 2}, + { 8, -8, 1, 0, 16, 2}, + {-24, 0, 1, 1, 18, 2}, + { 8, 0, 1, 0, 22, 2}, + {-24, 8, 1, 1, 24, 2}, + { 8, 8, 1, 0, 28, 2}, + {-24, 16, 1, 1, 30, 2}, + { 8, 16, 1, 0, 34, 2} +}; + +const struct SubspriteTable gMapObjectSubspriteTables_Truck[] = { + {12, gMapObjectSubspriteTable_Truck_0}, + {12, gMapObjectSubspriteTable_Truck_0}, + {12, gMapObjectSubspriteTable_Truck_0}, + {12, gMapObjectSubspriteTable_Truck_0}, + {12, gMapObjectSubspriteTable_Truck_0}, + {12, gMapObjectSubspriteTable_Truck_0} +}; + +const struct Subsprite gMapObjectSubspriteTable_Unused_0[] = { + {-32, -16, 1, 3, 0, 2} +}; + +const struct Subsprite gMapObjectSubspriteTable_Unused_1[] = { + {-32, -16, 1, 3, 0, 1} +}; + +const struct Subsprite gMapObjectSubspriteTable_Unused_2[] = { + {-32, -16, 1, 3, 0, 2} +}; + +const struct Subsprite gMapObjectSubspriteTable_Unused_3[] = { + {-32, -16, 1, 3, 0, 2} +}; + +const struct SubspriteTable gMapObjectSubspriteTables_Unused[] = { + {0, NULL}, + {1, gMapObjectSubspriteTable_Unused_0}, + {1, gMapObjectSubspriteTable_Unused_1}, + {1, gMapObjectSubspriteTable_Unused_2}, + {1, gMapObjectSubspriteTable_Unused_3}, + {1, gMapObjectSubspriteTable_Unused_3} +}; + +const struct Subsprite gMapObjectSubspriteTable_CableCar_0[] = { + {-32, -32, 0, 3, 0, 2} +}; + +const struct Subsprite gMapObjectSubspriteTable_CableCar_1[] = { + {-32, -32, 0, 3, 0, 1} +}; + +const struct Subsprite gMapObjectSubspriteTable_CableCar_2[] = { + {-32, -32, 0, 3, 0, 2} +}; + +const struct Subsprite gMapObjectSubspriteTable_CableCar_3[] = { + {-32, -32, 0, 3, 0, 2} +}; + +const struct SubspriteTable gMapObjectSubspriteTables_CableCar[] = { + {0, NULL}, + {1, gMapObjectSubspriteTable_CableCar_0}, + {1, gMapObjectSubspriteTable_CableCar_1}, + {1, gMapObjectSubspriteTable_CableCar_2}, + {1, gMapObjectSubspriteTable_CableCar_3}, + {1, gMapObjectSubspriteTable_CableCar_3} +}; + +const struct Subsprite gMapObjectSubspriteTable_SSTidal_0[] = { + {-48, -20, 1, 1, 0, 2}, + {-16, -20, 1, 1, 4, 2}, + { 16, -20, 1, 1, 8, 2}, + {-48, -12, 1, 1, 12, 2}, + {-16, -12, 1, 1, 16, 2}, + { 16, -12, 1, 1, 20, 2}, + {-48, -4, 1, 1, 24, 2}, + {-16, -4, 1, 1, 28, 2}, + { 16, -4, 1, 1, 32, 2}, + {-48, 4, 1, 1, 36, 2}, + {-16, 4, 1, 1, 40, 2}, + { 16, 4, 1, 1, 44, 2}, + {-48, 12, 1, 1, 48, 2}, + {-16, 12, 1, 1, 52, 2}, + { 16, 12, 1, 1, 56, 2} +}; + +const struct Subsprite gMapObjectSubspriteTable_SSTidal_1[] = { + {-48, -20, 1, 1, 0, 1}, + {-16, -20, 1, 1, 4, 1}, + { 16, -20, 1, 1, 8, 1}, + {-48, -12, 1, 1, 12, 1}, + {-16, -12, 1, 1, 16, 1}, + { 16, -12, 1, 1, 20, 1}, + {-48, -4, 1, 1, 24, 1}, + {-16, -4, 1, 1, 28, 1}, + { 16, -4, 1, 1, 32, 1}, + {-48, 4, 1, 1, 36, 1}, + {-16, 4, 1, 1, 40, 1}, + { 16, 4, 1, 1, 44, 1}, + {-48, 12, 1, 1, 48, 1}, + {-16, 12, 1, 1, 52, 1}, + { 16, 12, 1, 1, 56, 1} +}; + +const struct Subsprite gMapObjectSubspriteTable_SSTidal_2[] = { + {-48, -20, 1, 1, 0, 2}, + {-16, -20, 1, 1, 4, 2}, + { 16, -20, 1, 1, 8, 2}, + {-48, -12, 1, 1, 12, 2}, + {-16, -12, 1, 1, 16, 2}, + { 16, -12, 1, 1, 20, 2}, + {-48, -4, 1, 1, 24, 2}, + {-16, -4, 1, 1, 28, 2}, + { 16, -4, 1, 1, 32, 2}, + {-48, 4, 1, 1, 36, 2}, + {-16, 4, 1, 1, 40, 2}, + { 16, 4, 1, 1, 44, 2}, + {-48, 12, 1, 1, 48, 2}, + {-16, 12, 1, 1, 52, 2}, + { 16, 12, 1, 1, 56, 2} +}; + +const struct Subsprite gMapObjectSubspriteTable_SSTidal_3[] = { + {-48, -20, 1, 1, 0, 1}, + {-16, -20, 1, 1, 4, 1}, + { 16, -20, 1, 1, 8, 1}, + {-48, -12, 1, 1, 12, 1}, + {-16, -12, 1, 1, 16, 1}, + { 16, -12, 1, 1, 20, 1}, + {-48, -4, 1, 1, 24, 2}, + {-16, -4, 1, 1, 28, 2}, + { 16, -4, 1, 1, 32, 2}, + {-48, 4, 1, 1, 36, 2}, + {-16, 4, 1, 1, 40, 2}, + { 16, 4, 1, 1, 44, 2}, + {-48, 12, 1, 1, 48, 2}, + {-16, 12, 1, 1, 52, 2}, + { 16, 12, 1, 1, 56, 2} +}; + +const struct SubspriteTable gMapObjectSubspriteTables_SSTidal[] = { + {15, gMapObjectSubspriteTable_SSTidal_0}, + {15, gMapObjectSubspriteTable_SSTidal_0}, + {15, gMapObjectSubspriteTable_SSTidal_1}, + {15, gMapObjectSubspriteTable_SSTidal_2}, + {15, gMapObjectSubspriteTable_SSTidal_3}, + {15, gMapObjectSubspriteTable_SSTidal_3} +}; + +const struct Subsprite gMapObjectSubspriteTable_SubmarineShadow_0[] = { + {-48, -20, 1, 1, 0, 2}, + {-16, -20, 1, 1, 4, 2}, + { 16, -20, 1, 0, 8, 2}, + { 32, -20, 0, 0, 10, 2}, + {-48, -12, 1, 1, 11, 2}, + {-16, -12, 1, 1, 15, 2}, + { 16, -12, 1, 0, 19, 2}, + { 32, -12, 0, 0, 21, 2}, + {-48, -4, 1, 1, 22, 2}, + {-16, -4, 1, 1, 26, 2}, + { 16, -4, 1, 0, 30, 2}, + { 32, -4, 0, 0, 32, 2}, + {-48, 4, 1, 1, 33, 2}, + {-16, 4, 1, 1, 37, 2}, + { 16, 4, 1, 0, 41, 2}, + { 32, 4, 0, 0, 43, 2} +}; + +const struct Subsprite gMapObjectSubspriteTable_SubmarineShadow_1[] = { + {-48, -20, 1, 1, 0, 1}, + {-16, -20, 1, 1, 4, 1}, + { 16, -20, 1, 0, 8, 1}, + { 32, -20, 0, 0, 10, 1}, + {-48, -12, 1, 1, 11, 1}, + {-16, -12, 1, 1, 15, 1}, + { 16, -12, 1, 0, 19, 1}, + { 32, -12, 0, 0, 21, 1}, + {-48, -4, 1, 1, 22, 1}, + {-16, -4, 1, 1, 26, 1}, + { 16, -4, 1, 0, 30, 1}, + { 32, -4, 0, 0, 32, 1}, + {-48, 4, 1, 1, 33, 1}, + {-16, 4, 1, 1, 37, 1}, + { 16, 4, 1, 0, 41, 1}, + { 32, 4, 0, 0, 43, 1} +}; + +const struct Subsprite gMapObjectSubspriteTable_SubmarineShadow_2[] = { + {-48, -20, 1, 1, 0, 2}, + {-16, -20, 1, 1, 4, 2}, + { 16, -20, 1, 0, 8, 2}, + { 32, -20, 0, 0, 10, 2}, + {-48, -12, 1, 1, 11, 2}, + {-16, -12, 1, 1, 15, 2}, + { 16, -12, 1, 0, 19, 2}, + { 32, -12, 0, 0, 21, 2}, + {-48, -4, 1, 1, 22, 2}, + {-16, -4, 1, 1, 26, 2}, + { 16, -4, 1, 0, 30, 2}, + { 32, -4, 0, 0, 32, 2}, + {-48, 4, 1, 1, 33, 2}, + {-16, 4, 1, 1, 37, 2}, + { 16, 4, 1, 0, 41, 2}, + { 32, 4, 0, 0, 43, 2} +}; + +const struct Subsprite gMapObjectSubspriteTable_SubmarineShadow_3[] = { + {-48, -20, 1, 1, 0, 1}, + {-16, -20, 1, 1, 4, 1}, + { 16, -20, 1, 0, 8, 1}, + { 32, -20, 0, 0, 10, 1}, + {-48, -12, 1, 1, 11, 1}, + {-16, -12, 1, 1, 15, 1}, + { 16, -12, 1, 0, 19, 1}, + { 32, -12, 0, 0, 21, 1}, + {-48, -4, 1, 1, 22, 2}, + {-16, -4, 1, 1, 26, 2}, + { 16, -4, 1, 0, 30, 2}, + { 32, -4, 0, 0, 32, 2}, + {-48, 4, 1, 1, 33, 2}, + {-16, 4, 1, 1, 37, 2}, + { 16, 4, 1, 0, 41, 2}, + { 32, 4, 0, 0, 43, 2} +}; + +const struct SubspriteTable gMapObjectSubspriteTables_SubmarineShadow[] = { + {16, gMapObjectSubspriteTable_SubmarineShadow_0}, + {16, gMapObjectSubspriteTable_SubmarineShadow_0}, + {16, gMapObjectSubspriteTable_SubmarineShadow_1}, + {16, gMapObjectSubspriteTable_SubmarineShadow_2}, + {16, gMapObjectSubspriteTable_SubmarineShadow_3}, + {16, gMapObjectSubspriteTable_SubmarineShadow_3} +}; +#endif //POKERUBY_MAP_OBJECT_SUBSPRITES_H diff --git a/src/data/pokemon/base_stats.h b/src/data/pokemon/base_stats.h new file mode 100644 index 000000000..37f59e1c6 --- /dev/null +++ b/src/data/pokemon/base_stats.h @@ -0,0 +1,7823 @@ +// + +// + +#ifndef POKERUBY_BASE_STATS_H +#define POKERUBY_BASE_STATS_H + +const struct BaseStats gBaseStats[] = { + { // ?????????? + }, { + // Bulbasaur + 45, 49, 49, 45, 65, 65, + TYPE_GRASS, + TYPE_POISON, + 45, // catch rate + 64, // base exp. yield + 0, 0, 0, 0, 1, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_GRASS, + ABILITY_OVERGROW, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Ivysaur + 60, 62, 63, 60, 80, 80, + TYPE_GRASS, + TYPE_POISON, + 45, // catch rate + 141, // base exp. yield + 0, 0, 0, 0, 1, 1, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_GRASS, + ABILITY_OVERGROW, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Venusaur + 80, 82, 83, 80, 100, 100, + TYPE_GRASS, + TYPE_POISON, + 45, // catch rate + 208, // base exp. yield + 0, 0, 0, 0, 2, 1, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_GRASS, + ABILITY_OVERGROW, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Charmander + 39, 52, 43, 65, 60, 50, + TYPE_FIRE, + TYPE_FIRE, + 45, // catch rate + 65, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_DRAGON, + ABILITY_BLAZE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Charmeleon + 58, 64, 58, 80, 80, 65, + TYPE_FIRE, + TYPE_FIRE, + 45, // catch rate + 142, // base exp. yield + 0, 0, 0, 1, 1, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_DRAGON, + ABILITY_BLAZE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Charizard + 78, 84, 78, 100, 109, 85, + TYPE_FIRE, + TYPE_FLYING, + 45, // catch rate + 209, // base exp. yield + 0, 0, 0, 0, 3, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_DRAGON, + ABILITY_BLAZE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Squirtle + 44, 48, 65, 43, 50, 64, + TYPE_WATER, + TYPE_WATER, + 45, // catch rate + 66, // base exp. yield + 0, 0, 1, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_WATER_1, + ABILITY_TORRENT, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Wartortle + 59, 63, 80, 58, 65, 80, + TYPE_WATER, + TYPE_WATER, + 45, // catch rate + 143, // base exp. yield + 0, 0, 1, 0, 0, 1, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_WATER_1, + ABILITY_TORRENT, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Blastoise + 79, 83, 100, 78, 85, 105, + TYPE_WATER, + TYPE_WATER, + 45, // catch rate + 210, // base exp. yield + 0, 0, 0, 0, 0, 3, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_WATER_1, + ABILITY_TORRENT, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Caterpie + 45, 30, 35, 45, 20, 20, + TYPE_BUG, + TYPE_BUG, + 255, // catch rate + 53, // base exp. yield + 1, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_SHIELD_DUST, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Metapod + 50, 20, 55, 30, 25, 25, + TYPE_BUG, + TYPE_BUG, + 120, // catch rate + 72, // base exp. yield + 0, 0, 2, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_SHED_SKIN, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Butterfree + 60, 45, 50, 70, 80, 80, + TYPE_BUG, + TYPE_FLYING, + 45, // catch rate + 160, // base exp. yield + 0, 0, 0, 0, 2, 1, + ITEM_NONE, + ITEM_SILVER_POWDER, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_COMPOUND_EYES, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_WHITE + }, { // Weedle + 40, 35, 30, 50, 20, 20, + TYPE_BUG, + TYPE_POISON, + 255, // catch rate + 52, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_SHIELD_DUST, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Kakuna + 45, 25, 50, 35, 25, 25, + TYPE_BUG, + TYPE_POISON, + 120, // catch rate + 71, // base exp. yield + 0, 0, 2, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_SHED_SKIN, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Beedrill + 65, 80, 40, 75, 45, 80, + TYPE_BUG, + TYPE_POISON, + 45, // catch rate + 159, // base exp. yield + 0, 2, 0, 0, 0, 1, + ITEM_NONE, + ITEM_POISON_BARB, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_SWARM, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Pidgey + 40, 45, 40, 56, 35, 35, + TYPE_NORMAL, + TYPE_FLYING, + 255, // catch rate + 55, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_FLYING, + EGG_GROUP_FLYING, + ABILITY_KEEN_EYE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Pidgeotto + 63, 60, 55, 71, 50, 50, + TYPE_NORMAL, + TYPE_FLYING, + 120, // catch rate + 113, // base exp. yield + 0, 0, 0, 2, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_FLYING, + EGG_GROUP_FLYING, + ABILITY_KEEN_EYE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Pidgeot + 83, 80, 75, 91, 70, 70, + TYPE_NORMAL, + TYPE_FLYING, + 45, // catch rate + 172, // base exp. yield + 0, 0, 0, 3, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_FLYING, + EGG_GROUP_FLYING, + ABILITY_KEEN_EYE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Rattata + 30, 56, 35, 72, 25, 35, + TYPE_NORMAL, + TYPE_NORMAL, + 255, // catch rate + 57, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_RUN_AWAY, + ABILITY_GUTS, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Raticate + 55, 81, 60, 97, 50, 70, + TYPE_NORMAL, + TYPE_NORMAL, + 127, // catch rate + 116, // base exp. yield + 0, 0, 0, 2, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_RUN_AWAY, + ABILITY_GUTS, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Spearow + 40, 60, 30, 70, 31, 31, + TYPE_NORMAL, + TYPE_FLYING, + 255, // catch rate + 58, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FLYING, + EGG_GROUP_FLYING, + ABILITY_KEEN_EYE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Fearow + 65, 90, 65, 100, 61, 61, + TYPE_NORMAL, + TYPE_FLYING, + 90, // catch rate + 162, // base exp. yield + 0, 0, 0, 2, 0, 0, + ITEM_NONE, + ITEM_SHARP_BEAK, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FLYING, + EGG_GROUP_FLYING, + ABILITY_KEEN_EYE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Ekans + 35, 60, 44, 55, 40, 54, + TYPE_POISON, + TYPE_POISON, + 255, // catch rate + 62, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_DRAGON, + ABILITY_INTIMIDATE, + ABILITY_SHED_SKIN, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Arbok + 60, 85, 69, 80, 65, 79, + TYPE_POISON, + TYPE_POISON, + 90, // catch rate + 147, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_DRAGON, + ABILITY_INTIMIDATE, + ABILITY_SHED_SKIN, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Pikachu + 35, 55, 30, 90, 50, 40, + TYPE_ELECTRIC, + TYPE_ELECTRIC, + 190, // catch rate + 82, // base exp. yield + 0, 0, 0, 2, 0, 0, + ITEM_ORAN_BERRY, + ITEM_LIGHT_BALL, + 127, // gender + 10, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FAIRY, + ABILITY_STATIC, + ABILITY_NONE, + 6, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Raichu + 60, 90, 55, 100, 90, 80, + TYPE_ELECTRIC, + TYPE_ELECTRIC, + 75, // catch rate + 122, // base exp. yield + 0, 0, 0, 3, 0, 0, + ITEM_NONE, + ITEM_ORAN_BERRY, + 127, // gender + 10, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FAIRY, + ABILITY_STATIC, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Sandshrew + 50, 75, 85, 40, 20, 30, + TYPE_GROUND, + TYPE_GROUND, + 255, // catch rate + 93, // base exp. yield + 0, 0, 1, 0, 0, 0, + ITEM_NONE, + ITEM_QUICK_CLAW, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_SAND_VEIL, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Sandslash + 75, 100, 110, 65, 45, 55, + TYPE_GROUND, + TYPE_GROUND, + 90, // catch rate + 163, // base exp. yield + 0, 0, 2, 0, 0, 0, + ITEM_NONE, + ITEM_QUICK_CLAW, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_SAND_VEIL, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Nidoran♀ + 55, 47, 52, 41, 40, 40, + TYPE_POISON, + TYPE_POISON, + 235, // catch rate + 59, // base exp. yield + 1, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 254, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_FIELD, + ABILITY_POISON_POINT, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Nidorina + 70, 62, 67, 56, 55, 55, + TYPE_POISON, + TYPE_POISON, + 120, // catch rate + 117, // base exp. yield + 2, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 254, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_POISON_POINT, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Nidoqueen + 90, 82, 87, 76, 75, 85, + TYPE_POISON, + TYPE_GROUND, + 45, // catch rate + 194, // base exp. yield + 3, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 254, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_POISON_POINT, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Nidoran♂ + 46, 57, 40, 50, 40, 40, + TYPE_POISON, + TYPE_POISON, + 235, // catch rate + 60, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 0, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_FIELD, + ABILITY_POISON_POINT, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Nidorino + 61, 72, 57, 65, 55, 55, + TYPE_POISON, + TYPE_POISON, + 120, // catch rate + 118, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 0, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_FIELD, + ABILITY_POISON_POINT, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Nidoking + 81, 92, 77, 85, 85, 75, + TYPE_POISON, + TYPE_GROUND, + 45, // catch rate + 195, // base exp. yield + 0, 3, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 0, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_FIELD, + ABILITY_POISON_POINT, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Clefairy + 70, 45, 48, 35, 60, 65, + TYPE_NORMAL, + TYPE_NORMAL, + 150, // catch rate + 68, // base exp. yield + 2, 0, 0, 0, 0, 0, + ITEM_LEPPA_BERRY, + ITEM_MOON_STONE, + 191, // gender + 10, // egg cycles + 140, // base friendship + GROWTH_FAST, + EGG_GROUP_FAIRY, + EGG_GROUP_FAIRY, + ABILITY_CUTE_CHARM, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PINK + }, { // Clefable + 95, 70, 73, 60, 85, 90, + TYPE_NORMAL, + TYPE_NORMAL, + 25, // catch rate + 129, // base exp. yield + 3, 0, 0, 0, 0, 0, + ITEM_LEPPA_BERRY, + ITEM_MOON_STONE, + 191, // gender + 10, // egg cycles + 140, // base friendship + GROWTH_FAST, + EGG_GROUP_FAIRY, + EGG_GROUP_FAIRY, + ABILITY_CUTE_CHARM, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PINK + }, { // Vulpix + 38, 41, 40, 65, 50, 65, + TYPE_FIRE, + TYPE_FIRE, + 190, // catch rate + 63, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_RAWST_BERRY, + ITEM_RAWST_BERRY, + 191, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_FLASH_FIRE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Ninetales + 73, 76, 75, 100, 81, 100, + TYPE_FIRE, + TYPE_FIRE, + 75, // catch rate + 178, // base exp. yield + 0, 0, 0, 1, 0, 1, + ITEM_RAWST_BERRY, + ITEM_RAWST_BERRY, + 191, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_FLASH_FIRE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Jigglypuff + 115, 45, 20, 20, 45, 25, + TYPE_NORMAL, + TYPE_NORMAL, + 170, // catch rate + 76, // base exp. yield + 2, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 191, // gender + 10, // egg cycles + 70, // base friendship + GROWTH_FAST, + EGG_GROUP_FAIRY, + EGG_GROUP_FAIRY, + ABILITY_CUTE_CHARM, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PINK + }, { // Wigglytuff + 140, 70, 45, 45, 75, 50, + TYPE_NORMAL, + TYPE_NORMAL, + 50, // catch rate + 109, // base exp. yield + 3, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 191, // gender + 10, // egg cycles + 70, // base friendship + GROWTH_FAST, + EGG_GROUP_FAIRY, + EGG_GROUP_FAIRY, + ABILITY_CUTE_CHARM, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PINK + }, { // Zubat + 40, 45, 35, 55, 30, 40, + TYPE_POISON, + TYPE_FLYING, + 255, // catch rate + 54, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FLYING, + EGG_GROUP_FLYING, + ABILITY_INNER_FOCUS, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Golbat + 75, 80, 70, 90, 65, 75, + TYPE_POISON, + TYPE_FLYING, + 90, // catch rate + 171, // base exp. yield + 0, 0, 0, 2, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FLYING, + EGG_GROUP_FLYING, + ABILITY_INNER_FOCUS, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Oddish + 45, 50, 55, 30, 75, 65, + TYPE_GRASS, + TYPE_POISON, + 255, // catch rate + 78, // base exp. yield + 0, 0, 0, 0, 1, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_GRASS, + EGG_GROUP_GRASS, + ABILITY_CHLOROPHYLL, + ABILITY_NONE, + 4, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Gloom + 60, 65, 70, 40, 85, 75, + TYPE_GRASS, + TYPE_POISON, + 120, // catch rate + 132, // base exp. yield + 0, 0, 0, 0, 2, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_GRASS, + EGG_GROUP_GRASS, + ABILITY_CHLOROPHYLL, + ABILITY_NONE, + 6, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Vileplume + 75, 80, 85, 50, 100, 90, + TYPE_GRASS, + TYPE_POISON, + 45, // catch rate + 184, // base exp. yield + 0, 0, 0, 0, 3, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_GRASS, + EGG_GROUP_GRASS, + ABILITY_CHLOROPHYLL, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Paras + 35, 70, 55, 25, 45, 55, + TYPE_BUG, + TYPE_GRASS, + 190, // catch rate + 70, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_TINY_MUSHROOM, + ITEM_BIG_MUSHROOM, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_BUG, + EGG_GROUP_GRASS, + ABILITY_EFFECT_SPORE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Parasect + 60, 95, 80, 30, 60, 80, + TYPE_BUG, + TYPE_GRASS, + 75, // catch rate + 128, // base exp. yield + 0, 2, 1, 0, 0, 0, + ITEM_TINY_MUSHROOM, + ITEM_BIG_MUSHROOM, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_BUG, + EGG_GROUP_GRASS, + ABILITY_EFFECT_SPORE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Venonat + 60, 55, 50, 45, 40, 55, + TYPE_BUG, + TYPE_POISON, + 190, // catch rate + 75, // base exp. yield + 0, 0, 0, 0, 0, 1, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_COMPOUND_EYES, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Venomoth + 70, 65, 60, 90, 90, 75, + TYPE_BUG, + TYPE_POISON, + 75, // catch rate + 138, // base exp. yield + 0, 0, 0, 1, 1, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_SHIELD_DUST, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Diglett + 10, 55, 25, 95, 35, 45, + TYPE_GROUND, + TYPE_GROUND, + 255, // catch rate + 81, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_SAND_VEIL, + ABILITY_ARENA_TRAP, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Dugtrio + 35, 80, 50, 120, 50, 70, + TYPE_GROUND, + TYPE_GROUND, + 50, // catch rate + 153, // base exp. yield + 0, 0, 0, 2, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_SAND_VEIL, + ABILITY_ARENA_TRAP, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Meowth + 40, 45, 35, 90, 40, 40, + TYPE_NORMAL, + TYPE_NORMAL, + 255, // catch rate + 69, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_PICKUP, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Persian + 65, 70, 60, 115, 65, 65, + TYPE_NORMAL, + TYPE_NORMAL, + 90, // catch rate + 148, // base exp. yield + 0, 0, 0, 2, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_LIMBER, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Psyduck + 50, 52, 48, 55, 65, 50, + TYPE_WATER, + TYPE_WATER, + 190, // catch rate + 80, // base exp. yield + 0, 0, 0, 0, 1, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_WATER_1, + EGG_GROUP_FIELD, + ABILITY_DAMP, + ABILITY_CLOUD_NINE, + 6, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Golduck + 80, 82, 78, 85, 95, 80, + TYPE_WATER, + TYPE_WATER, + 75, // catch rate + 174, // base exp. yield + 0, 0, 0, 0, 2, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_WATER_1, + EGG_GROUP_FIELD, + ABILITY_DAMP, + ABILITY_CLOUD_NINE, + 8, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Mankey + 40, 80, 35, 70, 35, 45, + TYPE_FIGHTING, + TYPE_FIGHTING, + 190, // catch rate + 74, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_VITAL_SPIRIT, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Primeape + 65, 105, 60, 95, 60, 70, + TYPE_FIGHTING, + TYPE_FIGHTING, + 75, // catch rate + 149, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_VITAL_SPIRIT, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Growlithe + 55, 70, 45, 60, 70, 50, + TYPE_FIRE, + TYPE_FIRE, + 190, // catch rate + 91, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_RAWST_BERRY, + ITEM_RAWST_BERRY, + 63, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_INTIMIDATE, + ABILITY_FLASH_FIRE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Arcanine + 90, 110, 80, 95, 100, 80, + TYPE_FIRE, + TYPE_FIRE, + 75, // catch rate + 213, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_RAWST_BERRY, + ITEM_RAWST_BERRY, + 63, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_INTIMIDATE, + ABILITY_FLASH_FIRE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Poliwag + 40, 50, 40, 90, 40, 40, + TYPE_WATER, + TYPE_WATER, + 255, // catch rate + 77, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_WATER_1, + EGG_GROUP_WATER_1, + ABILITY_WATER_ABSORB, + ABILITY_DAMP, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE, TRUE + }, { // Poliwhirl + 65, 65, 65, 90, 50, 50, + TYPE_WATER, + TYPE_WATER, + 120, // catch rate + 131, // base exp. yield + 0, 0, 0, 2, 0, 0, + ITEM_NONE, + ITEM_KINGS_ROCK, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_WATER_1, + EGG_GROUP_WATER_1, + ABILITY_WATER_ABSORB, + ABILITY_DAMP, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE, TRUE + }, { // Poliwrath + 90, 85, 95, 70, 70, 90, + TYPE_WATER, + TYPE_FIGHTING, + 45, // catch rate + 185, // base exp. yield + 0, 0, 3, 0, 0, 0, + ITEM_NONE, + ITEM_KINGS_ROCK, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_WATER_1, + EGG_GROUP_WATER_1, + ABILITY_WATER_ABSORB, + ABILITY_DAMP, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE, TRUE + }, { // Abra + 25, 20, 15, 90, 105, 55, + TYPE_PSYCHIC, + TYPE_PSYCHIC, + 200, // catch rate + 73, // base exp. yield + 0, 0, 0, 0, 1, 0, + ITEM_NONE, + ITEM_TWISTED_SPOON, + 63, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_HUMAN_LIKE, + EGG_GROUP_HUMAN_LIKE, + ABILITY_SYNCHRONIZE, + ABILITY_INNER_FOCUS, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Kadabra + 40, 35, 30, 105, 120, 70, + TYPE_PSYCHIC, + TYPE_PSYCHIC, + 100, // catch rate + 145, // base exp. yield + 0, 0, 0, 0, 2, 0, + ITEM_NONE, + ITEM_TWISTED_SPOON, + 63, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_HUMAN_LIKE, + EGG_GROUP_HUMAN_LIKE, + ABILITY_SYNCHRONIZE, + ABILITY_INNER_FOCUS, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Alakazam + 55, 50, 45, 120, 135, 85, + TYPE_PSYCHIC, + TYPE_PSYCHIC, + 50, // catch rate + 186, // base exp. yield + 0, 0, 0, 0, 3, 0, + ITEM_NONE, + ITEM_TWISTED_SPOON, + 63, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_HUMAN_LIKE, + EGG_GROUP_HUMAN_LIKE, + ABILITY_SYNCHRONIZE, + ABILITY_INNER_FOCUS, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Machop + 70, 80, 50, 35, 35, 35, + TYPE_FIGHTING, + TYPE_FIGHTING, + 180, // catch rate + 88, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 63, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_HUMAN_LIKE, + EGG_GROUP_HUMAN_LIKE, + ABILITY_GUTS, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Machoke + 80, 100, 70, 45, 50, 60, + TYPE_FIGHTING, + TYPE_FIGHTING, + 90, // catch rate + 146, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 63, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_HUMAN_LIKE, + EGG_GROUP_HUMAN_LIKE, + ABILITY_GUTS, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Machamp + 90, 130, 80, 55, 65, 85, + TYPE_FIGHTING, + TYPE_FIGHTING, + 45, // catch rate + 193, // base exp. yield + 0, 3, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 63, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_HUMAN_LIKE, + EGG_GROUP_HUMAN_LIKE, + ABILITY_GUTS, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Bellsprout + 50, 75, 35, 40, 70, 30, + TYPE_GRASS, + TYPE_POISON, + 255, // catch rate + 84, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_GRASS, + EGG_GROUP_GRASS, + ABILITY_CHLOROPHYLL, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Weepinbell + 65, 90, 50, 55, 85, 45, + TYPE_GRASS, + TYPE_POISON, + 120, // catch rate + 151, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_GRASS, + EGG_GROUP_GRASS, + ABILITY_CHLOROPHYLL, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Victreebel + 80, 105, 65, 70, 100, 60, + TYPE_GRASS, + TYPE_POISON, + 45, // catch rate + 191, // base exp. yield + 0, 3, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_GRASS, + EGG_GROUP_GRASS, + ABILITY_CHLOROPHYLL, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Tentacool + 40, 40, 35, 70, 50, 100, + TYPE_WATER, + TYPE_POISON, + 190, // catch rate + 105, // base exp. yield + 0, 0, 0, 0, 0, 1, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_WATER_3, + EGG_GROUP_WATER_3, + ABILITY_CLEAR_BODY, + ABILITY_LIQUID_OOZE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Tentacruel + 80, 70, 65, 100, 80, 120, + TYPE_WATER, + TYPE_POISON, + 60, // catch rate + 205, // base exp. yield + 0, 0, 0, 0, 0, 2, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_WATER_3, + EGG_GROUP_WATER_3, + ABILITY_CLEAR_BODY, + ABILITY_LIQUID_OOZE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Geodude + 40, 80, 100, 20, 30, 30, + TYPE_ROCK, + TYPE_GROUND, + 255, // catch rate + 86, // base exp. yield + 0, 0, 1, 0, 0, 0, + ITEM_NONE, + ITEM_EVERSTONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MINERAL, + EGG_GROUP_MINERAL, + ABILITY_ROCK_HEAD, + ABILITY_STURDY, + 4, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Graveler + 55, 95, 115, 35, 45, 45, + TYPE_ROCK, + TYPE_GROUND, + 120, // catch rate + 134, // base exp. yield + 0, 0, 2, 0, 0, 0, + ITEM_NONE, + ITEM_EVERSTONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MINERAL, + EGG_GROUP_MINERAL, + ABILITY_ROCK_HEAD, + ABILITY_STURDY, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Golem + 80, 110, 130, 45, 55, 65, + TYPE_ROCK, + TYPE_GROUND, + 45, // catch rate + 177, // base exp. yield + 0, 0, 3, 0, 0, 0, + ITEM_NONE, + ITEM_EVERSTONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MINERAL, + EGG_GROUP_MINERAL, + ABILITY_ROCK_HEAD, + ABILITY_STURDY, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Ponyta + 50, 85, 55, 90, 65, 65, + TYPE_FIRE, + TYPE_FIRE, + 190, // catch rate + 152, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_RUN_AWAY, + ABILITY_FLASH_FIRE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Rapidash + 65, 100, 70, 105, 80, 80, + TYPE_FIRE, + TYPE_FIRE, + 60, // catch rate + 192, // base exp. yield + 0, 0, 0, 2, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_RUN_AWAY, + ABILITY_FLASH_FIRE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Slowpoke + 90, 65, 65, 15, 40, 40, + TYPE_WATER, + TYPE_PSYCHIC, + 190, // catch rate + 99, // base exp. yield + 1, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_KINGS_ROCK, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_MONSTER, + EGG_GROUP_WATER_1, + ABILITY_OBLIVIOUS, + ABILITY_OWN_TEMPO, + 0, // Safari Zone flee rate + BODY_COLOR_PINK + }, { // Slowbro + 95, 75, 110, 30, 100, 80, + TYPE_WATER, + TYPE_PSYCHIC, + 75, // catch rate + 164, // base exp. yield + 0, 0, 2, 0, 0, 0, + ITEM_NONE, + ITEM_KINGS_ROCK, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_MONSTER, + EGG_GROUP_WATER_1, + ABILITY_OBLIVIOUS, + ABILITY_OWN_TEMPO, + 0, // Safari Zone flee rate + BODY_COLOR_PINK + }, { // Magnemite + 25, 35, 70, 45, 95, 55, + TYPE_ELECTRIC, + TYPE_STEEL, + 190, // catch rate + 89, // base exp. yield + 0, 0, 0, 0, 1, 0, + ITEM_NONE, + ITEM_METAL_COAT, + 255, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_MINERAL, + EGG_GROUP_MINERAL, + ABILITY_MAGNET_PULL, + ABILITY_STURDY, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Magneton + 50, 60, 95, 70, 120, 70, + TYPE_ELECTRIC, + TYPE_STEEL, + 60, // catch rate + 161, // base exp. yield + 0, 0, 0, 0, 2, 0, + ITEM_NONE, + ITEM_METAL_COAT, + 255, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_MINERAL, + EGG_GROUP_MINERAL, + ABILITY_MAGNET_PULL, + ABILITY_STURDY, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Farfetch'd + 52, 65, 55, 60, 58, 62, + TYPE_NORMAL, + TYPE_FLYING, + 45, // catch rate + 94, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_STICK, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FLYING, + EGG_GROUP_FIELD, + ABILITY_KEEN_EYE, + ABILITY_INNER_FOCUS, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Doduo + 35, 85, 45, 75, 35, 35, + TYPE_NORMAL, + TYPE_FLYING, + 190, // catch rate + 96, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_SHARP_BEAK, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FLYING, + EGG_GROUP_FLYING, + ABILITY_RUN_AWAY, + ABILITY_EARLY_BIRD, + 8, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Dodrio + 60, 110, 70, 100, 60, 60, + TYPE_NORMAL, + TYPE_FLYING, + 45, // catch rate + 158, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_SHARP_BEAK, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FLYING, + EGG_GROUP_FLYING, + ABILITY_RUN_AWAY, + ABILITY_EARLY_BIRD, + 10, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Seel + 65, 45, 55, 45, 45, 70, + TYPE_WATER, + TYPE_WATER, + 190, // catch rate + 100, // base exp. yield + 0, 0, 0, 0, 0, 1, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_WATER_1, + EGG_GROUP_FIELD, + ABILITY_THICK_FAT, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_WHITE + }, { // Dewgong + 90, 70, 80, 70, 70, 95, + TYPE_WATER, + TYPE_ICE, + 75, // catch rate + 176, // base exp. yield + 0, 0, 0, 0, 0, 2, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_WATER_1, + EGG_GROUP_FIELD, + ABILITY_THICK_FAT, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_WHITE + }, { // Grimer + 80, 80, 50, 25, 40, 50, + TYPE_POISON, + TYPE_POISON, + 190, // catch rate + 90, // base exp. yield + 1, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NUGGET, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_AMORPHOUS, + EGG_GROUP_AMORPHOUS, + ABILITY_STENCH, + ABILITY_STICKY_HOLD, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Muk + 105, 105, 75, 50, 65, 100, + TYPE_POISON, + TYPE_POISON, + 75, // catch rate + 157, // base exp. yield + 1, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NUGGET, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_AMORPHOUS, + EGG_GROUP_AMORPHOUS, + ABILITY_STENCH, + ABILITY_STICKY_HOLD, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Shellder + 30, 65, 100, 40, 45, 25, + TYPE_WATER, + TYPE_WATER, + 190, // catch rate + 97, // base exp. yield + 0, 0, 1, 0, 0, 0, + ITEM_PEARL, + ITEM_BIG_PEARL, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_WATER_3, + EGG_GROUP_WATER_3, + ABILITY_SHELL_ARMOR, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Cloyster + 50, 95, 180, 70, 85, 45, + TYPE_WATER, + TYPE_ICE, + 60, // catch rate + 203, // base exp. yield + 0, 0, 2, 0, 0, 0, + ITEM_PEARL, + ITEM_BIG_PEARL, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_WATER_3, + EGG_GROUP_WATER_3, + ABILITY_SHELL_ARMOR, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Gastly + 30, 35, 30, 80, 100, 35, + TYPE_GHOST, + TYPE_POISON, + 190, // catch rate + 95, // base exp. yield + 0, 0, 0, 0, 1, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_AMORPHOUS, + EGG_GROUP_AMORPHOUS, + ABILITY_LEVITATE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Haunter + 45, 50, 45, 95, 115, 55, + TYPE_GHOST, + TYPE_POISON, + 90, // catch rate + 126, // base exp. yield + 0, 0, 0, 0, 2, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_AMORPHOUS, + EGG_GROUP_AMORPHOUS, + ABILITY_LEVITATE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Gengar + 60, 65, 60, 110, 130, 75, + TYPE_GHOST, + TYPE_POISON, + 45, // catch rate + 190, // base exp. yield + 0, 0, 0, 0, 3, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_AMORPHOUS, + EGG_GROUP_AMORPHOUS, + ABILITY_LEVITATE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Onix + 35, 45, 160, 70, 30, 45, + TYPE_ROCK, + TYPE_GROUND, + 45, // catch rate + 108, // base exp. yield + 0, 0, 1, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 25, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_MINERAL, + EGG_GROUP_MINERAL, + ABILITY_ROCK_HEAD, + ABILITY_STURDY, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Drowzee + 60, 48, 45, 42, 43, 90, + TYPE_PSYCHIC, + TYPE_PSYCHIC, + 190, // catch rate + 102, // base exp. yield + 0, 0, 0, 0, 0, 1, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_HUMAN_LIKE, + EGG_GROUP_HUMAN_LIKE, + ABILITY_INSOMNIA, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Hypno + 85, 73, 70, 67, 73, 115, + TYPE_PSYCHIC, + TYPE_PSYCHIC, + 75, // catch rate + 165, // base exp. yield + 0, 0, 0, 0, 0, 2, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_HUMAN_LIKE, + EGG_GROUP_HUMAN_LIKE, + ABILITY_INSOMNIA, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Krabby + 30, 105, 90, 50, 25, 25, + TYPE_WATER, + TYPE_WATER, + 225, // catch rate + 115, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_WATER_3, + EGG_GROUP_WATER_3, + ABILITY_HYPER_CUTTER, + ABILITY_SHELL_ARMOR, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Kingler + 55, 130, 115, 75, 50, 50, + TYPE_WATER, + TYPE_WATER, + 60, // catch rate + 206, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_WATER_3, + EGG_GROUP_WATER_3, + ABILITY_HYPER_CUTTER, + ABILITY_SHELL_ARMOR, + 0, // Safari Zone flee rate + BODY_COLOR_RED, TRUE + }, { // Voltorb + 40, 30, 50, 100, 55, 55, + TYPE_ELECTRIC, + TYPE_ELECTRIC, + 190, // catch rate + 103, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_MINERAL, + EGG_GROUP_MINERAL, + ABILITY_SOUNDPROOF, + ABILITY_STATIC, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Electrode + 60, 50, 70, 140, 80, 80, + TYPE_ELECTRIC, + TYPE_ELECTRIC, + 60, // catch rate + 150, // base exp. yield + 0, 0, 0, 2, 0, 0, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_MINERAL, + EGG_GROUP_MINERAL, + ABILITY_SOUNDPROOF, + ABILITY_STATIC, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Exeggcute + 60, 40, 80, 40, 60, 45, + TYPE_GRASS, + TYPE_PSYCHIC, + 90, // catch rate + 98, // base exp. yield + 0, 0, 1, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_GRASS, + EGG_GROUP_GRASS, + ABILITY_CHLOROPHYLL, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PINK + }, { // Exeggutor + 95, 95, 85, 55, 125, 65, + TYPE_GRASS, + TYPE_PSYCHIC, + 45, // catch rate + 212, // base exp. yield + 0, 0, 0, 0, 2, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_GRASS, + EGG_GROUP_GRASS, + ABILITY_CHLOROPHYLL, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Cubone + 50, 50, 95, 35, 40, 50, + TYPE_GROUND, + TYPE_GROUND, + 190, // catch rate + 87, // base exp. yield + 0, 0, 1, 0, 0, 0, + ITEM_NONE, + ITEM_THICK_CLUB, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_MONSTER, + EGG_GROUP_MONSTER, + ABILITY_ROCK_HEAD, + ABILITY_LIGHTNING_ROD, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Marowak + 60, 80, 110, 45, 50, 80, + TYPE_GROUND, + TYPE_GROUND, + 75, // catch rate + 124, // base exp. yield + 0, 0, 2, 0, 0, 0, + ITEM_NONE, + ITEM_THICK_CLUB, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_MONSTER, + EGG_GROUP_MONSTER, + ABILITY_ROCK_HEAD, + ABILITY_LIGHTNING_ROD, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Hitmonlee + 50, 120, 53, 87, 35, 110, + TYPE_FIGHTING, + TYPE_FIGHTING, + 45, // catch rate + 139, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 0, // gender + 25, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_HUMAN_LIKE, + EGG_GROUP_HUMAN_LIKE, + ABILITY_LIMBER, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Hitmonchan + 50, 105, 79, 76, 35, 110, + TYPE_FIGHTING, + TYPE_FIGHTING, + 45, // catch rate + 140, // base exp. yield + 0, 0, 0, 0, 0, 2, + ITEM_NONE, + ITEM_NONE, + 0, // gender + 25, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_HUMAN_LIKE, + EGG_GROUP_HUMAN_LIKE, + ABILITY_KEEN_EYE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Lickitung + 90, 55, 75, 30, 60, 75, + TYPE_NORMAL, + TYPE_NORMAL, + 45, // catch rate + 127, // base exp. yield + 2, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_MONSTER, + EGG_GROUP_MONSTER, + ABILITY_OWN_TEMPO, + ABILITY_OBLIVIOUS, + 0, // Safari Zone flee rate + BODY_COLOR_PINK + }, { // Koffing + 40, 65, 95, 35, 60, 45, + TYPE_POISON, + TYPE_POISON, + 190, // catch rate + 114, // base exp. yield + 0, 0, 1, 0, 0, 0, + ITEM_NONE, + ITEM_SMOKE_BALL, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_AMORPHOUS, + EGG_GROUP_AMORPHOUS, + ABILITY_LEVITATE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Weezing + 65, 90, 120, 60, 85, 70, + TYPE_POISON, + TYPE_POISON, + 60, // catch rate + 173, // base exp. yield + 0, 0, 2, 0, 0, 0, + ITEM_NONE, + ITEM_SMOKE_BALL, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_AMORPHOUS, + EGG_GROUP_AMORPHOUS, + ABILITY_LEVITATE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Rhyhorn + 80, 85, 95, 25, 30, 30, + TYPE_GROUND, + TYPE_ROCK, + 120, // catch rate + 135, // base exp. yield + 0, 0, 1, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_FIELD, + ABILITY_LIGHTNING_ROD, + ABILITY_ROCK_HEAD, + 4, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Rhydon + 105, 130, 120, 40, 45, 45, + TYPE_GROUND, + TYPE_ROCK, + 60, // catch rate + 204, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_FIELD, + ABILITY_LIGHTNING_ROD, + ABILITY_ROCK_HEAD, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Chansey + 250, 5, 5, 50, 35, 105, + TYPE_NORMAL, + TYPE_NORMAL, + 30, // catch rate + 255, // base exp. yield + 2, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_LUCKY_EGG, + 254, // gender + 40, // egg cycles + 140, // base friendship + GROWTH_FAST, + EGG_GROUP_FAIRY, + EGG_GROUP_FAIRY, + ABILITY_NATURAL_CURE, + ABILITY_SERENE_GRACE, + 0, // Safari Zone flee rate + BODY_COLOR_PINK + }, { // Tangela + 65, 55, 115, 60, 100, 40, + TYPE_GRASS, + TYPE_GRASS, + 45, // catch rate + 166, // base exp. yield + 0, 0, 1, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_GRASS, + EGG_GROUP_GRASS, + ABILITY_CHLOROPHYLL, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Kangaskhan + 105, 95, 80, 90, 40, 80, + TYPE_NORMAL, + TYPE_NORMAL, + 45, // catch rate + 175, // base exp. yield + 2, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 254, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_MONSTER, + EGG_GROUP_MONSTER, + ABILITY_EARLY_BIRD, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Horsea + 30, 40, 70, 60, 70, 25, + TYPE_WATER, + TYPE_WATER, + 225, // catch rate + 83, // base exp. yield + 0, 0, 0, 0, 1, 0, + ITEM_NONE, + ITEM_DRAGON_SCALE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_WATER_1, + EGG_GROUP_DRAGON, + ABILITY_SWIFT_SWIM, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Seadra + 55, 65, 95, 85, 95, 45, + TYPE_WATER, + TYPE_WATER, + 75, // catch rate + 155, // base exp. yield + 0, 0, 1, 0, 1, 0, + ITEM_NONE, + ITEM_DRAGON_SCALE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_WATER_1, + EGG_GROUP_DRAGON, + ABILITY_POISON_POINT, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Goldeen + 45, 67, 60, 63, 35, 50, + TYPE_WATER, + TYPE_WATER, + 225, // catch rate + 111, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_WATER_2, + EGG_GROUP_WATER_2, + ABILITY_SWIFT_SWIM, + ABILITY_WATER_VEIL, + 4, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Seaking + 80, 92, 65, 68, 65, 80, + TYPE_WATER, + TYPE_WATER, + 60, // catch rate + 170, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_WATER_2, + EGG_GROUP_WATER_2, + ABILITY_SWIFT_SWIM, + ABILITY_WATER_VEIL, + 6, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Staryu + 30, 45, 55, 85, 70, 55, + TYPE_WATER, + TYPE_WATER, + 225, // catch rate + 106, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_STARDUST, + ITEM_STAR_PIECE, + 255, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_WATER_3, + EGG_GROUP_WATER_3, + ABILITY_ILLUMINATE, + ABILITY_NATURAL_CURE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Starmie + 60, 75, 85, 115, 100, 85, + TYPE_WATER, + TYPE_PSYCHIC, + 60, // catch rate + 207, // base exp. yield + 0, 0, 0, 2, 0, 0, + ITEM_STARDUST, + ITEM_STAR_PIECE, + 255, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_WATER_3, + EGG_GROUP_WATER_3, + ABILITY_ILLUMINATE, + ABILITY_NATURAL_CURE, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Mr. mime + 40, 45, 65, 90, 100, 120, + TYPE_PSYCHIC, + TYPE_PSYCHIC, + 45, // catch rate + 136, // base exp. yield + 0, 0, 0, 0, 0, 2, + ITEM_NONE, + ITEM_LEPPA_BERRY, + 127, // gender + 25, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_HUMAN_LIKE, + EGG_GROUP_HUMAN_LIKE, + ABILITY_SOUNDPROOF, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PINK + }, { // Scyther + 70, 110, 80, 105, 55, 80, + TYPE_BUG, + TYPE_FLYING, + 45, // catch rate + 187, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 25, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_SWARM, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Jynx + 65, 50, 35, 95, 115, 95, + TYPE_ICE, + TYPE_PSYCHIC, + 45, // catch rate + 137, // base exp. yield + 0, 0, 0, 0, 2, 0, + ITEM_ASPEAR_BERRY, + ITEM_ASPEAR_BERRY, + 254, // gender + 25, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_HUMAN_LIKE, + EGG_GROUP_HUMAN_LIKE, + ABILITY_OBLIVIOUS, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Electabuzz + 65, 83, 57, 105, 95, 85, + TYPE_ELECTRIC, + TYPE_ELECTRIC, + 45, // catch rate + 156, // base exp. yield + 0, 0, 0, 2, 0, 0, + ITEM_NONE, + ITEM_NONE, + 63, // gender + 25, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_HUMAN_LIKE, + EGG_GROUP_HUMAN_LIKE, + ABILITY_STATIC, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW, TRUE + }, { // Magmar + 65, 95, 57, 93, 100, 85, + TYPE_FIRE, + TYPE_FIRE, + 45, // catch rate + 167, // base exp. yield + 0, 0, 0, 0, 2, 0, + ITEM_RAWST_BERRY, + ITEM_RAWST_BERRY, + 63, // gender + 25, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_HUMAN_LIKE, + EGG_GROUP_HUMAN_LIKE, + ABILITY_FLAME_BODY, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Pinsir + 65, 125, 100, 85, 55, 70, + TYPE_BUG, + TYPE_BUG, + 45, // catch rate + 200, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 25, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_HYPER_CUTTER, + ABILITY_NONE, + 8, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Tauros + 75, 100, 95, 110, 40, 70, + TYPE_NORMAL, + TYPE_NORMAL, + 45, // catch rate + 211, // base exp. yield + 0, 1, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 0, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_INTIMIDATE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Magikarp + 20, 10, 55, 80, 15, 20, + TYPE_WATER, + TYPE_WATER, + 255, // catch rate + 20, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 5, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_WATER_2, + EGG_GROUP_DRAGON, + ABILITY_SWIFT_SWIM, + ABILITY_NONE, + 4, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Gyarados + 95, 125, 79, 81, 60, 100, + TYPE_WATER, + TYPE_FLYING, + 45, // catch rate + 214, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 5, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_WATER_2, + EGG_GROUP_DRAGON, + ABILITY_INTIMIDATE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Lapras + 130, 85, 80, 60, 85, 95, + TYPE_WATER, + TYPE_ICE, + 45, // catch rate + 219, // base exp. yield + 2, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 40, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_WATER_1, + ABILITY_WATER_ABSORB, + ABILITY_SHELL_ARMOR, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Ditto + 48, 48, 48, 48, 48, 48, + TYPE_NORMAL, + TYPE_NORMAL, + 35, // catch rate + 61, // base exp. yield + 1, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_METAL_POWDER, + 255, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_DITTO, + EGG_GROUP_DITTO, + ABILITY_LIMBER, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Eevee + 55, 55, 50, 55, 45, 65, + TYPE_NORMAL, + TYPE_NORMAL, + 45, // catch rate + 92, // base exp. yield + 0, 0, 0, 0, 0, 1, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 35, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_RUN_AWAY, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Vaporeon + 130, 65, 60, 65, 110, 95, + TYPE_WATER, + TYPE_WATER, + 45, // catch rate + 196, // base exp. yield + 2, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 35, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_WATER_ABSORB, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Jolteon + 65, 65, 60, 130, 110, 95, + TYPE_ELECTRIC, + TYPE_ELECTRIC, + 45, // catch rate + 197, // base exp. yield + 0, 0, 0, 2, 0, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 35, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_VOLT_ABSORB, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Flareon + 65, 130, 60, 65, 95, 110, + TYPE_FIRE, + TYPE_FIRE, + 45, // catch rate + 198, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 35, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_FLASH_FIRE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Porygon + 65, 60, 70, 40, 85, 75, + TYPE_NORMAL, + TYPE_NORMAL, + 45, // catch rate + 130, // base exp. yield + 0, 0, 0, 0, 1, 0, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_MINERAL, + EGG_GROUP_MINERAL, + ABILITY_TRACE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PINK + }, { // Omanyte + 35, 40, 100, 35, 90, 55, + TYPE_ROCK, + TYPE_WATER, + 45, // catch rate + 120, // base exp. yield + 0, 0, 1, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 30, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_WATER_1, + EGG_GROUP_WATER_3, + ABILITY_SWIFT_SWIM, + ABILITY_SHELL_ARMOR, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Omastar + 70, 60, 125, 55, 115, 70, + TYPE_ROCK, + TYPE_WATER, + 45, // catch rate + 199, // base exp. yield + 0, 0, 2, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 30, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_WATER_1, + EGG_GROUP_WATER_3, + ABILITY_SWIFT_SWIM, + ABILITY_SHELL_ARMOR, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Kabuto + 30, 80, 90, 55, 55, 45, + TYPE_ROCK, + TYPE_WATER, + 45, // catch rate + 119, // base exp. yield + 0, 0, 1, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 30, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_WATER_1, + EGG_GROUP_WATER_3, + ABILITY_SWIFT_SWIM, + ABILITY_BATTLE_ARMOR, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Kabutops + 60, 115, 105, 80, 65, 70, + TYPE_ROCK, + TYPE_WATER, + 45, // catch rate + 201, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 30, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_WATER_1, + EGG_GROUP_WATER_3, + ABILITY_SWIFT_SWIM, + ABILITY_BATTLE_ARMOR, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Aerodactyl + 80, 105, 65, 130, 60, 75, + TYPE_ROCK, + TYPE_FLYING, + 45, // catch rate + 202, // base exp. yield + 0, 0, 0, 2, 0, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 35, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_FLYING, + EGG_GROUP_FLYING, + ABILITY_ROCK_HEAD, + ABILITY_PRESSURE, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Snorlax + 160, 110, 65, 30, 65, 110, + TYPE_NORMAL, + TYPE_NORMAL, + 25, // catch rate + 154, // base exp. yield + 2, 0, 0, 0, 0, 0, + ITEM_LEFTOVERS, + ITEM_LEFTOVERS, + 31, // gender + 40, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_MONSTER, + ABILITY_IMMUNITY, + ABILITY_THICK_FAT, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // Articuno + 90, 85, 100, 85, 95, 125, + TYPE_ICE, + TYPE_FLYING, + 3, // catch rate + 215, // base exp. yield + 0, 0, 0, 0, 0, 3, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 80, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_PRESSURE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Zapdos + 90, 90, 85, 100, 125, 90, + TYPE_ELECTRIC, + TYPE_FLYING, + 3, // catch rate + 216, // base exp. yield + 0, 0, 0, 0, 3, 0, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 80, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_PRESSURE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Moltres + 90, 100, 90, 90, 125, 85, + TYPE_FIRE, + TYPE_FLYING, + 3, // catch rate + 217, // base exp. yield + 0, 0, 0, 0, 3, 0, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 80, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_PRESSURE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Dratini + 41, 64, 45, 50, 50, 50, + TYPE_DRAGON, + TYPE_DRAGON, + 45, // catch rate + 67, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_DRAGON_SCALE, + 127, // gender + 40, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_WATER_1, + EGG_GROUP_DRAGON, + ABILITY_SHED_SKIN, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Dragonair + 61, 84, 65, 70, 70, 70, + TYPE_DRAGON, + TYPE_DRAGON, + 45, // catch rate + 144, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_DRAGON_SCALE, + 127, // gender + 40, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_WATER_1, + EGG_GROUP_DRAGON, + ABILITY_SHED_SKIN, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Dragonite + 91, 134, 95, 80, 100, 100, + TYPE_DRAGON, + TYPE_FLYING, + 45, // catch rate + 218, // base exp. yield + 0, 3, 0, 0, 0, 0, + ITEM_NONE, + ITEM_DRAGON_SCALE, + 127, // gender + 40, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_WATER_1, + EGG_GROUP_DRAGON, + ABILITY_INNER_FOCUS, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Mewtwo + 106, 110, 90, 130, 154, 90, + TYPE_PSYCHIC, + TYPE_PSYCHIC, + 3, // catch rate + 220, // base exp. yield + 0, 0, 0, 0, 3, 0, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_SLOW, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_PRESSURE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Mew + 100, 100, 100, 100, 100, 100, + TYPE_PSYCHIC, + TYPE_PSYCHIC, + 45, // catch rate + 64, // base exp. yield + 3, 0, 0, 0, 0, 0, + ITEM_LUM_BERRY, + ITEM_LUM_BERRY, + 255, // gender + 120, // egg cycles + 100, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_SYNCHRONIZE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PINK + }, { // Chikorita + 45, 49, 65, 45, 49, 65, + TYPE_GRASS, + TYPE_GRASS, + 45, // catch rate + 64, // base exp. yield + 0, 0, 0, 0, 0, 1, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_GRASS, + ABILITY_OVERGROW, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Bayleef + 60, 62, 80, 60, 63, 80, + TYPE_GRASS, + TYPE_GRASS, + 45, // catch rate + 141, // base exp. yield + 0, 0, 1, 0, 0, 1, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_GRASS, + ABILITY_OVERGROW, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Meganium + 80, 82, 100, 80, 83, 100, + TYPE_GRASS, + TYPE_GRASS, + 45, // catch rate + 208, // base exp. yield + 0, 0, 1, 0, 0, 2, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_GRASS, + ABILITY_OVERGROW, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Cyndaquil + 39, 52, 43, 65, 60, 50, + TYPE_FIRE, + TYPE_FIRE, + 45, // catch rate + 65, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_BLAZE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Quilava + 58, 64, 58, 80, 80, 65, + TYPE_FIRE, + TYPE_FIRE, + 45, // catch rate + 142, // base exp. yield + 0, 0, 0, 1, 1, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_BLAZE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Typhlosion + 78, 84, 78, 100, 109, 85, + TYPE_FIRE, + TYPE_FIRE, + 45, // catch rate + 209, // base exp. yield + 0, 0, 0, 0, 3, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_BLAZE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Totodile + 50, 65, 64, 43, 44, 48, + TYPE_WATER, + TYPE_WATER, + 45, // catch rate + 66, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_WATER_1, + ABILITY_TORRENT, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Croconaw + 65, 80, 80, 58, 59, 63, + TYPE_WATER, + TYPE_WATER, + 45, // catch rate + 143, // base exp. yield + 0, 1, 1, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_WATER_1, + ABILITY_TORRENT, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE, TRUE + }, { // Feraligatr + 85, 105, 100, 78, 79, 83, + TYPE_WATER, + TYPE_WATER, + 45, // catch rate + 210, // base exp. yield + 0, 2, 1, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_WATER_1, + ABILITY_TORRENT, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Sentret + 35, 46, 34, 20, 35, 45, + TYPE_NORMAL, + TYPE_NORMAL, + 255, // catch rate + 57, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_ORAN_BERRY, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_RUN_AWAY, + ABILITY_KEEN_EYE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Furret + 85, 76, 64, 90, 45, 55, + TYPE_NORMAL, + TYPE_NORMAL, + 90, // catch rate + 116, // base exp. yield + 0, 0, 0, 2, 0, 0, + ITEM_ORAN_BERRY, + ITEM_SITRUS_BERRY, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_RUN_AWAY, + ABILITY_KEEN_EYE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Hoothoot + 60, 30, 30, 50, 36, 56, + TYPE_NORMAL, + TYPE_FLYING, + 255, // catch rate + 58, // base exp. yield + 1, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FLYING, + EGG_GROUP_FLYING, + ABILITY_INSOMNIA, + ABILITY_KEEN_EYE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Noctowl + 100, 50, 50, 70, 76, 96, + TYPE_NORMAL, + TYPE_FLYING, + 90, // catch rate + 162, // base exp. yield + 2, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FLYING, + EGG_GROUP_FLYING, + ABILITY_INSOMNIA, + ABILITY_KEEN_EYE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Ledyba + 40, 20, 30, 55, 40, 80, + TYPE_BUG, + TYPE_FLYING, + 255, // catch rate + 54, // base exp. yield + 0, 0, 0, 0, 0, 1, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_FAST, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_SWARM, + ABILITY_EARLY_BIRD, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Ledian + 55, 35, 50, 85, 55, 110, + TYPE_BUG, + TYPE_FLYING, + 90, // catch rate + 134, // base exp. yield + 0, 0, 0, 0, 0, 2, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_FAST, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_SWARM, + ABILITY_EARLY_BIRD, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Spinarak + 40, 60, 40, 30, 40, 40, + TYPE_BUG, + TYPE_POISON, + 255, // catch rate + 54, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_FAST, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_SWARM, + ABILITY_INSOMNIA, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Ariados + 70, 90, 70, 40, 60, 60, + TYPE_BUG, + TYPE_POISON, + 90, // catch rate + 134, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_FAST, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_SWARM, + ABILITY_INSOMNIA, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Crobat + 85, 90, 80, 130, 70, 80, + TYPE_POISON, + TYPE_FLYING, + 90, // catch rate + 204, // base exp. yield + 0, 0, 0, 3, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FLYING, + EGG_GROUP_FLYING, + ABILITY_INNER_FOCUS, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Chinchou + 75, 38, 38, 67, 56, 56, + TYPE_WATER, + TYPE_ELECTRIC, + 190, // catch rate + 90, // base exp. yield + 1, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_YELLOW_SHARD, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_WATER_2, + EGG_GROUP_WATER_2, + ABILITY_VOLT_ABSORB, + ABILITY_ILLUMINATE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Lanturn + 125, 58, 58, 67, 76, 76, + TYPE_WATER, + TYPE_ELECTRIC, + 75, // catch rate + 156, // base exp. yield + 2, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_YELLOW_SHARD, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_WATER_2, + EGG_GROUP_WATER_2, + ABILITY_VOLT_ABSORB, + ABILITY_ILLUMINATE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Pichu + 20, 40, 15, 60, 35, 35, + TYPE_ELECTRIC, + TYPE_ELECTRIC, + 190, // catch rate + 42, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_ORAN_BERRY, + 127, // gender + 10, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_STATIC, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Cleffa + 50, 25, 28, 15, 45, 55, + TYPE_NORMAL, + TYPE_NORMAL, + 150, // catch rate + 37, // base exp. yield + 0, 0, 0, 0, 0, 1, + ITEM_LEPPA_BERRY, + ITEM_MOON_STONE, + 191, // gender + 10, // egg cycles + 140, // base friendship + GROWTH_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_CUTE_CHARM, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PINK + }, { // Igglybuff + 90, 30, 15, 15, 40, 20, + TYPE_NORMAL, + TYPE_NORMAL, + 170, // catch rate + 39, // base exp. yield + 1, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 191, // gender + 10, // egg cycles + 70, // base friendship + GROWTH_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_CUTE_CHARM, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PINK, TRUE + }, { // Togepi + 35, 20, 65, 20, 40, 65, + TYPE_NORMAL, + TYPE_NORMAL, + 190, // catch rate + 74, // base exp. yield + 0, 0, 0, 0, 0, 1, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 10, // egg cycles + 70, // base friendship + GROWTH_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_HUSTLE, + ABILITY_SERENE_GRACE, + 0, // Safari Zone flee rate + BODY_COLOR_WHITE + }, { // Togetic + 55, 40, 85, 40, 80, 105, + TYPE_NORMAL, + TYPE_FLYING, + 75, // catch rate + 114, // base exp. yield + 0, 0, 0, 0, 0, 2, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 10, // egg cycles + 70, // base friendship + GROWTH_FAST, + EGG_GROUP_FLYING, + EGG_GROUP_FAIRY, + ABILITY_HUSTLE, + ABILITY_SERENE_GRACE, + 0, // Safari Zone flee rate + BODY_COLOR_WHITE + }, { // Natu + 40, 50, 45, 70, 70, 45, + TYPE_PSYCHIC, + TYPE_FLYING, + 190, // catch rate + 73, // base exp. yield + 0, 0, 0, 0, 1, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FLYING, + EGG_GROUP_FLYING, + ABILITY_SYNCHRONIZE, + ABILITY_EARLY_BIRD, + 6, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Xatu + 65, 75, 70, 95, 95, 70, + TYPE_PSYCHIC, + TYPE_FLYING, + 75, // catch rate + 171, // base exp. yield + 0, 0, 0, 1, 1, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FLYING, + EGG_GROUP_FLYING, + ABILITY_SYNCHRONIZE, + ABILITY_EARLY_BIRD, + 8, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Mareep + 55, 40, 40, 35, 65, 45, + TYPE_ELECTRIC, + TYPE_ELECTRIC, + 235, // catch rate + 59, // base exp. yield + 0, 0, 0, 0, 1, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_FIELD, + ABILITY_STATIC, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_WHITE + }, { // Flaaffy + 70, 55, 55, 45, 80, 60, + TYPE_ELECTRIC, + TYPE_ELECTRIC, + 120, // catch rate + 117, // base exp. yield + 0, 0, 0, 0, 2, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_FIELD, + ABILITY_STATIC, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PINK + }, { // Ampharos + 90, 75, 75, 55, 115, 90, + TYPE_ELECTRIC, + TYPE_ELECTRIC, + 45, // catch rate + 194, // base exp. yield + 0, 0, 0, 0, 3, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_FIELD, + ABILITY_STATIC, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Bellossom + 75, 80, 85, 50, 90, 100, + TYPE_GRASS, + TYPE_GRASS, + 45, // catch rate + 184, // base exp. yield + 0, 0, 0, 0, 0, 3, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_GRASS, + EGG_GROUP_GRASS, + ABILITY_CHLOROPHYLL, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Marill + 70, 20, 50, 40, 20, 50, + TYPE_WATER, + TYPE_WATER, + 190, // catch rate + 58, // base exp. yield + 2, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 10, // egg cycles + 70, // base friendship + GROWTH_FAST, + EGG_GROUP_WATER_1, + EGG_GROUP_FAIRY, + ABILITY_THICK_FAT, + ABILITY_HUGE_POWER, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Azumarill + 100, 50, 80, 50, 50, 80, + TYPE_WATER, + TYPE_WATER, + 75, // catch rate + 153, // base exp. yield + 3, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 10, // egg cycles + 70, // base friendship + GROWTH_FAST, + EGG_GROUP_WATER_1, + EGG_GROUP_FAIRY, + ABILITY_THICK_FAT, + ABILITY_HUGE_POWER, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Sudowoodo + 70, 100, 115, 30, 30, 65, + TYPE_ROCK, + TYPE_ROCK, + 65, // catch rate + 135, // base exp. yield + 0, 0, 2, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_MINERAL, + EGG_GROUP_MINERAL, + ABILITY_STURDY, + ABILITY_ROCK_HEAD, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Politoed + 90, 75, 75, 70, 90, 100, + TYPE_WATER, + TYPE_WATER, + 45, // catch rate + 185, // base exp. yield + 0, 0, 0, 0, 0, 3, + ITEM_NONE, + ITEM_KINGS_ROCK, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_WATER_1, + EGG_GROUP_WATER_1, + ABILITY_WATER_ABSORB, + ABILITY_DAMP, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN, TRUE + }, { // Hoppip + 35, 35, 40, 50, 35, 55, + TYPE_GRASS, + TYPE_FLYING, + 255, // catch rate + 74, // base exp. yield + 0, 0, 0, 0, 0, 1, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_FAIRY, + EGG_GROUP_GRASS, + ABILITY_CHLOROPHYLL, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PINK + }, { // Skiploom + 55, 45, 50, 80, 45, 65, + TYPE_GRASS, + TYPE_FLYING, + 120, // catch rate + 136, // base exp. yield + 0, 0, 0, 2, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_FAIRY, + EGG_GROUP_GRASS, + ABILITY_CHLOROPHYLL, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Jumpluff + 75, 55, 70, 110, 55, 85, + TYPE_GRASS, + TYPE_FLYING, + 45, // catch rate + 176, // base exp. yield + 0, 0, 0, 3, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_FAIRY, + EGG_GROUP_GRASS, + ABILITY_CHLOROPHYLL, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Aipom + 55, 70, 55, 85, 40, 55, + TYPE_NORMAL, + TYPE_NORMAL, + 45, // catch rate + 94, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_RUN_AWAY, + ABILITY_PICKUP, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Sunkern + 30, 30, 30, 30, 30, 30, + TYPE_GRASS, + TYPE_GRASS, + 235, // catch rate + 52, // base exp. yield + 0, 0, 0, 0, 1, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_GRASS, + EGG_GROUP_GRASS, + ABILITY_CHLOROPHYLL, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Sunflora + 75, 75, 55, 30, 105, 85, + TYPE_GRASS, + TYPE_GRASS, + 120, // catch rate + 146, // base exp. yield + 0, 0, 0, 0, 2, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_GRASS, + EGG_GROUP_GRASS, + ABILITY_CHLOROPHYLL, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Yanma + 65, 65, 45, 95, 75, 45, + TYPE_BUG, + TYPE_FLYING, + 75, // catch rate + 147, // base exp. yield + 0, 0, 0, 2, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_SPEED_BOOST, + ABILITY_COMPOUND_EYES, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Wooper + 55, 45, 45, 15, 25, 25, + TYPE_WATER, + TYPE_GROUND, + 255, // catch rate + 52, // base exp. yield + 1, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_WATER_1, + EGG_GROUP_FIELD, + ABILITY_DAMP, + ABILITY_WATER_ABSORB, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Quagsire + 95, 85, 85, 35, 65, 65, + TYPE_WATER, + TYPE_GROUND, + 90, // catch rate + 137, // base exp. yield + 2, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_WATER_1, + EGG_GROUP_FIELD, + ABILITY_DAMP, + ABILITY_WATER_ABSORB, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Espeon + 65, 65, 60, 110, 130, 95, + TYPE_PSYCHIC, + TYPE_PSYCHIC, + 45, // catch rate + 197, // base exp. yield + 0, 0, 0, 0, 2, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 35, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_SYNCHRONIZE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Umbreon + 95, 65, 110, 65, 60, 130, + TYPE_DARK, + TYPE_DARK, + 45, // catch rate + 197, // base exp. yield + 0, 0, 0, 0, 0, 2, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 35, // egg cycles + 35, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_SYNCHRONIZE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // Murkrow + 60, 85, 42, 91, 85, 42, + TYPE_DARK, + TYPE_FLYING, + 30, // catch rate + 107, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 35, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_FLYING, + EGG_GROUP_FLYING, + ABILITY_INSOMNIA, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // Slowking + 95, 75, 80, 30, 100, 110, + TYPE_WATER, + TYPE_PSYCHIC, + 70, // catch rate + 164, // base exp. yield + 0, 0, 0, 0, 0, 3, + ITEM_NONE, + ITEM_KINGS_ROCK, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_MONSTER, + EGG_GROUP_WATER_1, + ABILITY_OBLIVIOUS, + ABILITY_OWN_TEMPO, + 0, // Safari Zone flee rate + BODY_COLOR_PINK + }, { // Misdreavus + 60, 60, 60, 85, 85, 85, + TYPE_GHOST, + TYPE_GHOST, + 45, // catch rate + 147, // base exp. yield + 0, 0, 0, 0, 1, 1, + ITEM_NONE, + ITEM_SPELL_TAG, + 127, // gender + 25, // egg cycles + 35, // base friendship + GROWTH_FAST, + EGG_GROUP_AMORPHOUS, + EGG_GROUP_AMORPHOUS, + ABILITY_LEVITATE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Unown + 48, 72, 48, 48, 72, 48, + TYPE_PSYCHIC, + TYPE_PSYCHIC, + 225, // catch rate + 61, // base exp. yield + 0, 1, 0, 0, 1, 0, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 40, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_LEVITATE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK, TRUE + }, { // Wobbuffet + 190, 33, 58, 33, 33, 58, + TYPE_PSYCHIC, + TYPE_PSYCHIC, + 45, // catch rate + 177, // base exp. yield + 2, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_AMORPHOUS, + EGG_GROUP_AMORPHOUS, + ABILITY_SHADOW_TAG, + ABILITY_NONE, + 4, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Girafarig + 70, 80, 65, 85, 90, 65, + TYPE_NORMAL, + TYPE_PSYCHIC, + 60, // catch rate + 149, // base exp. yield + 0, 0, 0, 0, 2, 0, + ITEM_NONE, + ITEM_PERSIM_BERRY, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_INNER_FOCUS, + ABILITY_EARLY_BIRD, + 4, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Pineco + 50, 65, 90, 15, 35, 35, + TYPE_BUG, + TYPE_BUG, + 190, // catch rate + 60, // base exp. yield + 0, 0, 1, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_STURDY, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Forretress + 75, 90, 140, 40, 60, 60, + TYPE_BUG, + TYPE_STEEL, + 75, // catch rate + 118, // base exp. yield + 0, 0, 2, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_STURDY, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Dunsparce + 100, 70, 70, 45, 65, 65, + TYPE_NORMAL, + TYPE_NORMAL, + 190, // catch rate + 75, // base exp. yield + 1, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_SERENE_GRACE, + ABILITY_RUN_AWAY, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Gligar + 65, 75, 105, 85, 35, 65, + TYPE_GROUND, + TYPE_FLYING, + 60, // catch rate + 108, // base exp. yield + 0, 0, 1, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_HYPER_CUTTER, + ABILITY_SAND_VEIL, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Steelix + 75, 85, 200, 30, 55, 65, + TYPE_STEEL, + TYPE_GROUND, + 25, // catch rate + 196, // base exp. yield + 0, 0, 2, 0, 0, 0, + ITEM_NONE, + ITEM_METAL_COAT, + 127, // gender + 25, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_MINERAL, + EGG_GROUP_MINERAL, + ABILITY_ROCK_HEAD, + ABILITY_STURDY, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Snubbull + 60, 80, 50, 30, 40, 40, + TYPE_NORMAL, + TYPE_NORMAL, + 190, // catch rate + 63, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 191, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FAIRY, + ABILITY_INTIMIDATE, + ABILITY_RUN_AWAY, + 0, // Safari Zone flee rate + BODY_COLOR_PINK + }, { // Granbull + 90, 120, 75, 45, 60, 60, + TYPE_NORMAL, + TYPE_NORMAL, + 75, // catch rate + 178, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 191, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FAIRY, + ABILITY_INTIMIDATE, + ABILITY_INTIMIDATE, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Qwilfish + 65, 95, 75, 85, 55, 55, + TYPE_WATER, + TYPE_POISON, + 45, // catch rate + 100, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_WATER_2, + EGG_GROUP_WATER_2, + ABILITY_POISON_POINT, + ABILITY_SWIFT_SWIM, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Scizor + 70, 130, 100, 65, 55, 80, + TYPE_BUG, + TYPE_STEEL, + 25, // catch rate + 200, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 25, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_SWARM, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Shuckle + 20, 10, 230, 5, 10, 230, + TYPE_BUG, + TYPE_ROCK, + 190, // catch rate + 80, // base exp. yield + 0, 0, 1, 0, 0, 1, + ITEM_ORAN_BERRY, + ITEM_ORAN_BERRY, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_STURDY, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Heracross + 80, 125, 75, 85, 40, 95, + TYPE_BUG, + TYPE_FIGHTING, + 45, // catch rate + 200, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 25, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_SWARM, + ABILITY_GUTS, + 8, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Sneasel + 55, 95, 55, 115, 35, 75, + TYPE_DARK, + TYPE_ICE, + 60, // catch rate + 132, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_QUICK_CLAW, + 127, // gender + 20, // egg cycles + 35, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_INNER_FOCUS, + ABILITY_KEEN_EYE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK, TRUE + }, { // Teddiursa + 60, 80, 50, 40, 50, 50, + TYPE_NORMAL, + TYPE_NORMAL, + 120, // catch rate + 124, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_PICKUP, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN, TRUE + }, { // Ursaring + 90, 130, 75, 55, 75, 75, + TYPE_NORMAL, + TYPE_NORMAL, + 60, // catch rate + 189, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_GUTS, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Slugma + 40, 40, 40, 20, 70, 40, + TYPE_FIRE, + TYPE_FIRE, + 190, // catch rate + 78, // base exp. yield + 0, 0, 0, 0, 1, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_AMORPHOUS, + EGG_GROUP_AMORPHOUS, + ABILITY_MAGMA_ARMOR, + ABILITY_FLAME_BODY, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Magcargo + 50, 50, 120, 30, 80, 80, + TYPE_FIRE, + TYPE_ROCK, + 75, // catch rate + 154, // base exp. yield + 0, 0, 2, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_AMORPHOUS, + EGG_GROUP_AMORPHOUS, + ABILITY_MAGMA_ARMOR, + ABILITY_FLAME_BODY, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Swinub + 50, 50, 40, 50, 30, 30, + TYPE_ICE, + TYPE_GROUND, + 225, // catch rate + 78, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_OBLIVIOUS, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Piloswine + 100, 100, 80, 50, 60, 60, + TYPE_ICE, + TYPE_GROUND, + 75, // catch rate + 160, // base exp. yield + 1, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_OBLIVIOUS, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Corsola + 55, 55, 85, 35, 65, 85, + TYPE_WATER, + TYPE_ROCK, + 60, // catch rate + 113, // base exp. yield + 0, 0, 1, 0, 0, 1, + ITEM_NONE, + ITEM_RED_SHARD, + 191, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_FAST, + EGG_GROUP_WATER_1, + EGG_GROUP_WATER_3, + ABILITY_HUSTLE, + ABILITY_NATURAL_CURE, + 0, // Safari Zone flee rate + BODY_COLOR_PINK + }, { // Remoraid + 35, 65, 35, 65, 65, 35, + TYPE_WATER, + TYPE_WATER, + 190, // catch rate + 78, // base exp. yield + 0, 0, 0, 0, 1, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_WATER_1, + EGG_GROUP_WATER_2, + ABILITY_HUSTLE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Octillery + 75, 105, 75, 45, 105, 75, + TYPE_WATER, + TYPE_WATER, + 75, // catch rate + 164, // base exp. yield + 0, 1, 0, 0, 1, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_WATER_1, + EGG_GROUP_WATER_2, + ABILITY_SUCTION_CUPS, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Delibird + 45, 55, 45, 75, 65, 45, + TYPE_ICE, + TYPE_FLYING, + 45, // catch rate + 183, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_FAST, + EGG_GROUP_WATER_1, + EGG_GROUP_FIELD, + ABILITY_VITAL_SPIRIT, + ABILITY_HUSTLE, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Mantine + 65, 40, 70, 70, 80, 140, + TYPE_WATER, + TYPE_FLYING, + 25, // catch rate + 168, // base exp. yield + 0, 0, 0, 0, 0, 2, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 25, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_WATER_1, + EGG_GROUP_WATER_1, + ABILITY_SWIFT_SWIM, + ABILITY_WATER_ABSORB, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Skarmory + 65, 80, 140, 70, 40, 70, + TYPE_STEEL, + TYPE_FLYING, + 25, // catch rate + 168, // base exp. yield + 0, 0, 2, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 25, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_FLYING, + EGG_GROUP_FLYING, + ABILITY_KEEN_EYE, + ABILITY_STURDY, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Houndour + 45, 60, 30, 65, 80, 50, + TYPE_DARK, + TYPE_FIRE, + 120, // catch rate + 114, // base exp. yield + 0, 0, 0, 0, 1, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_EARLY_BIRD, + ABILITY_FLASH_FIRE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // Houndoom + 75, 90, 50, 95, 110, 80, + TYPE_DARK, + TYPE_FIRE, + 45, // catch rate + 204, // base exp. yield + 0, 0, 0, 0, 2, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_EARLY_BIRD, + ABILITY_FLASH_FIRE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // Kingdra + 75, 95, 95, 85, 95, 95, + TYPE_WATER, + TYPE_DRAGON, + 45, // catch rate + 207, // base exp. yield + 0, 1, 0, 0, 1, 1, + ITEM_NONE, + ITEM_DRAGON_SCALE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_WATER_1, + EGG_GROUP_DRAGON, + ABILITY_SWIFT_SWIM, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Phanpy + 90, 60, 60, 40, 40, 40, + TYPE_GROUND, + TYPE_GROUND, + 120, // catch rate + 124, // base exp. yield + 1, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_PICKUP, + ABILITY_NONE, + 10, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Donphan + 90, 120, 120, 50, 60, 60, + TYPE_GROUND, + TYPE_GROUND, + 60, // catch rate + 189, // base exp. yield + 0, 1, 1, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_STURDY, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Porygon2 + 85, 80, 90, 60, 105, 95, + TYPE_NORMAL, + TYPE_NORMAL, + 45, // catch rate + 180, // base exp. yield + 0, 0, 0, 0, 2, 0, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_MINERAL, + EGG_GROUP_MINERAL, + ABILITY_TRACE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Stantler + 73, 95, 62, 85, 85, 65, + TYPE_NORMAL, + TYPE_NORMAL, + 45, // catch rate + 165, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_INTIMIDATE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Smeargle + 55, 20, 35, 75, 20, 45, + TYPE_NORMAL, + TYPE_NORMAL, + 45, // catch rate + 106, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_OWN_TEMPO, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_WHITE + }, { // Tyrogue + 35, 35, 35, 35, 35, 35, + TYPE_FIGHTING, + TYPE_FIGHTING, + 75, // catch rate + 91, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 0, // gender + 25, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_GUTS, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Hitmontop + 50, 95, 95, 70, 35, 110, + TYPE_FIGHTING, + TYPE_FIGHTING, + 45, // catch rate + 138, // base exp. yield + 0, 0, 0, 0, 0, 2, + ITEM_NONE, + ITEM_NONE, + 0, // gender + 25, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_HUMAN_LIKE, + EGG_GROUP_HUMAN_LIKE, + ABILITY_INTIMIDATE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Smoochum + 45, 30, 15, 65, 85, 65, + TYPE_ICE, + TYPE_PSYCHIC, + 45, // catch rate + 87, // base exp. yield + 0, 0, 0, 0, 1, 0, + ITEM_ASPEAR_BERRY, + ITEM_ASPEAR_BERRY, + 254, // gender + 25, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_OBLIVIOUS, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PINK + }, { // Elekid + 45, 63, 37, 95, 65, 55, + TYPE_ELECTRIC, + TYPE_ELECTRIC, + 45, // catch rate + 106, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 63, // gender + 25, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_STATIC, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW, TRUE + }, { // Magby + 45, 75, 37, 83, 70, 55, + TYPE_FIRE, + TYPE_FIRE, + 45, // catch rate + 117, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_RAWST_BERRY, + ITEM_RAWST_BERRY, + 63, // gender + 25, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_FLAME_BODY, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Miltank + 95, 80, 105, 100, 40, 70, + TYPE_NORMAL, + TYPE_NORMAL, + 45, // catch rate + 200, // base exp. yield + 0, 0, 2, 0, 0, 0, + ITEM_MOOMOO_MILK, + ITEM_MOOMOO_MILK, + 254, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_THICK_FAT, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PINK + }, { // Blissey + 255, 10, 10, 55, 75, 135, + TYPE_NORMAL, + TYPE_NORMAL, + 30, // catch rate + 255, // base exp. yield + 2, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_LUCKY_EGG, + 254, // gender + 40, // egg cycles + 140, // base friendship + GROWTH_FAST, + EGG_GROUP_FAIRY, + EGG_GROUP_FAIRY, + ABILITY_NATURAL_CURE, + ABILITY_SERENE_GRACE, + 0, // Safari Zone flee rate + BODY_COLOR_PINK + }, { // Raikou + 90, 85, 75, 115, 115, 100, + TYPE_ELECTRIC, + TYPE_ELECTRIC, + 3, // catch rate + 216, // base exp. yield + 0, 0, 0, 2, 1, 0, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 80, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_PRESSURE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Entei + 115, 115, 85, 100, 90, 75, + TYPE_FIRE, + TYPE_FIRE, + 3, // catch rate + 217, // base exp. yield + 1, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 80, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_PRESSURE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Suicune + 100, 75, 115, 85, 90, 115, + TYPE_WATER, + TYPE_WATER, + 3, // catch rate + 215, // base exp. yield + 0, 0, 1, 0, 0, 2, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 80, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_PRESSURE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Larvitar + 50, 64, 50, 41, 45, 50, + TYPE_ROCK, + TYPE_GROUND, + 45, // catch rate + 67, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 40, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_MONSTER, + ABILITY_GUTS, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Pupitar + 70, 84, 70, 51, 65, 70, + TYPE_ROCK, + TYPE_GROUND, + 45, // catch rate + 144, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 40, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_MONSTER, + ABILITY_SHED_SKIN, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Tyranitar + 100, 134, 110, 61, 95, 100, + TYPE_ROCK, + TYPE_DARK, + 45, // catch rate + 218, // base exp. yield + 0, 3, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 40, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_MONSTER, + ABILITY_SAND_STREAM, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Lugia + 106, 90, 130, 110, 90, 154, + TYPE_PSYCHIC, + TYPE_FLYING, + 3, // catch rate + 220, // base exp. yield + 0, 0, 0, 0, 0, 3, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_SLOW, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_PRESSURE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_WHITE + }, { // Ho-Oh + 106, 130, 90, 90, 110, 154, + TYPE_FIRE, + TYPE_FLYING, + 3, // catch rate + 220, // base exp. yield + 0, 0, 0, 0, 0, 3, + ITEM_SACRED_ASH, + ITEM_SACRED_ASH, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_SLOW, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_PRESSURE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Celebi + 100, 100, 100, 100, 100, 100, + TYPE_PSYCHIC, + TYPE_GRASS, + 45, // catch rate + 64, // base exp. yield + 3, 0, 0, 0, 0, 0, + ITEM_LUM_BERRY, + ITEM_LUM_BERRY, + 255, // gender + 120, // egg cycles + 100, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_NATURAL_CURE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // ? + 50, 150, 50, 150, 150, 50, + TYPE_NORMAL, + TYPE_NORMAL, + 3, // catch rate + 1, // base exp. yield + 2, 2, 2, 2, 2, 2, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_NONE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // ? + 50, 150, 50, 150, 150, 50, + TYPE_NORMAL, + TYPE_NORMAL, + 3, // catch rate + 1, // base exp. yield + 2, 2, 2, 2, 2, 2, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_NONE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // ? + 50, 150, 50, 150, 150, 50, + TYPE_NORMAL, + TYPE_NORMAL, + 3, // catch rate + 1, // base exp. yield + 2, 2, 2, 2, 2, 2, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_NONE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // ? + 50, 150, 50, 150, 150, 50, + TYPE_NORMAL, + TYPE_NORMAL, + 3, // catch rate + 1, // base exp. yield + 2, 2, 2, 2, 2, 2, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_NONE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // ? + 50, 150, 50, 150, 150, 50, + TYPE_NORMAL, + TYPE_NORMAL, + 3, // catch rate + 1, // base exp. yield + 2, 2, 2, 2, 2, 2, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_NONE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // ? + 50, 150, 50, 150, 150, 50, + TYPE_NORMAL, + TYPE_NORMAL, + 3, // catch rate + 1, // base exp. yield + 2, 2, 2, 2, 2, 2, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_NONE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // ? + 50, 150, 50, 150, 150, 50, + TYPE_NORMAL, + TYPE_NORMAL, + 3, // catch rate + 1, // base exp. yield + 2, 2, 2, 2, 2, 2, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_NONE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // ? + 50, 150, 50, 150, 150, 50, + TYPE_NORMAL, + TYPE_NORMAL, + 3, // catch rate + 1, // base exp. yield + 2, 2, 2, 2, 2, 2, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_NONE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // ? + 50, 150, 50, 150, 150, 50, + TYPE_NORMAL, + TYPE_NORMAL, + 3, // catch rate + 1, // base exp. yield + 2, 2, 2, 2, 2, 2, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_NONE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // ? + 50, 150, 50, 150, 150, 50, + TYPE_NORMAL, + TYPE_NORMAL, + 3, // catch rate + 1, // base exp. yield + 2, 2, 2, 2, 2, 2, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_NONE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // ? + 50, 150, 50, 150, 150, 50, + TYPE_NORMAL, + TYPE_NORMAL, + 3, // catch rate + 1, // base exp. yield + 2, 2, 2, 2, 2, 2, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_NONE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // ? + 50, 150, 50, 150, 150, 50, + TYPE_NORMAL, + TYPE_NORMAL, + 3, // catch rate + 1, // base exp. yield + 2, 2, 2, 2, 2, 2, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_NONE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // ? + 50, 150, 50, 150, 150, 50, + TYPE_NORMAL, + TYPE_NORMAL, + 3, // catch rate + 1, // base exp. yield + 2, 2, 2, 2, 2, 2, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_NONE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // ? + 50, 150, 50, 150, 150, 50, + TYPE_NORMAL, + TYPE_NORMAL, + 3, // catch rate + 1, // base exp. yield + 2, 2, 2, 2, 2, 2, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_NONE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // ? + 50, 150, 50, 150, 150, 50, + TYPE_NORMAL, + TYPE_NORMAL, + 3, // catch rate + 1, // base exp. yield + 2, 2, 2, 2, 2, 2, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_NONE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // ? + 50, 150, 50, 150, 150, 50, + TYPE_NORMAL, + TYPE_NORMAL, + 3, // catch rate + 1, // base exp. yield + 2, 2, 2, 2, 2, 2, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_NONE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // ? + 50, 150, 50, 150, 150, 50, + TYPE_NORMAL, + TYPE_NORMAL, + 3, // catch rate + 1, // base exp. yield + 2, 2, 2, 2, 2, 2, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_NONE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // ? + 50, 150, 50, 150, 150, 50, + TYPE_NORMAL, + TYPE_NORMAL, + 3, // catch rate + 1, // base exp. yield + 2, 2, 2, 2, 2, 2, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_NONE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // ? + 50, 150, 50, 150, 150, 50, + TYPE_NORMAL, + TYPE_NORMAL, + 3, // catch rate + 1, // base exp. yield + 2, 2, 2, 2, 2, 2, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_NONE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // ? + 50, 150, 50, 150, 150, 50, + TYPE_NORMAL, + TYPE_NORMAL, + 3, // catch rate + 1, // base exp. yield + 2, 2, 2, 2, 2, 2, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_NONE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // ? + 50, 150, 50, 150, 150, 50, + TYPE_NORMAL, + TYPE_NORMAL, + 3, // catch rate + 1, // base exp. yield + 2, 2, 2, 2, 2, 2, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_NONE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // ? + 50, 150, 50, 150, 150, 50, + TYPE_NORMAL, + TYPE_NORMAL, + 3, // catch rate + 1, // base exp. yield + 2, 2, 2, 2, 2, 2, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_NONE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // ? + 50, 150, 50, 150, 150, 50, + TYPE_NORMAL, + TYPE_NORMAL, + 3, // catch rate + 1, // base exp. yield + 2, 2, 2, 2, 2, 2, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_NONE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // ? + 50, 150, 50, 150, 150, 50, + TYPE_NORMAL, + TYPE_NORMAL, + 3, // catch rate + 1, // base exp. yield + 2, 2, 2, 2, 2, 2, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_NONE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // ? + 50, 150, 50, 150, 150, 50, + TYPE_NORMAL, + TYPE_NORMAL, + 3, // catch rate + 1, // base exp. yield + 2, 2, 2, 2, 2, 2, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_NONE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // Treecko + 40, 45, 35, 70, 65, 55, + TYPE_GRASS, + TYPE_GRASS, + 45, // catch rate + 65, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_DRAGON, + ABILITY_OVERGROW, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Grovyle + 50, 65, 45, 95, 85, 65, + TYPE_GRASS, + TYPE_GRASS, + 45, // catch rate + 141, // base exp. yield + 0, 0, 0, 2, 0, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_DRAGON, + ABILITY_OVERGROW, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Sceptile + 70, 85, 65, 120, 105, 85, + TYPE_GRASS, + TYPE_GRASS, + 45, // catch rate + 208, // base exp. yield + 0, 0, 0, 3, 0, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_DRAGON, + ABILITY_OVERGROW, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Torchic + 45, 60, 40, 45, 70, 50, + TYPE_FIRE, + TYPE_FIRE, + 45, // catch rate + 65, // base exp. yield + 0, 0, 0, 0, 1, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_BLAZE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Combusken + 60, 85, 60, 55, 85, 60, + TYPE_FIRE, + TYPE_FIGHTING, + 45, // catch rate + 142, // base exp. yield + 0, 1, 0, 0, 1, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_BLAZE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Blaziken + 80, 120, 70, 80, 110, 70, + TYPE_FIRE, + TYPE_FIGHTING, + 45, // catch rate + 209, // base exp. yield + 0, 3, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_BLAZE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Mudkip + 50, 70, 50, 40, 50, 50, + TYPE_WATER, + TYPE_WATER, + 45, // catch rate + 65, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_WATER_1, + ABILITY_TORRENT, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Marshtomp + 70, 85, 70, 50, 60, 70, + TYPE_WATER, + TYPE_GROUND, + 45, // catch rate + 143, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_WATER_1, + ABILITY_TORRENT, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Swampert + 100, 110, 90, 60, 85, 90, + TYPE_WATER, + TYPE_GROUND, + 45, // catch rate + 210, // base exp. yield + 0, 3, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_WATER_1, + ABILITY_TORRENT, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Poochyena + 35, 55, 35, 35, 30, 30, + TYPE_DARK, + TYPE_DARK, + 255, // catch rate + 55, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_PECHA_BERRY, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_RUN_AWAY, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Mightyena + 70, 90, 70, 70, 60, 60, + TYPE_DARK, + TYPE_DARK, + 127, // catch rate + 128, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_PECHA_BERRY, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_INTIMIDATE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Zigzagoon + 38, 30, 41, 60, 30, 41, + TYPE_NORMAL, + TYPE_NORMAL, + 255, // catch rate + 60, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_ORAN_BERRY, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_PICKUP, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Linoone + 78, 70, 61, 100, 50, 61, + TYPE_NORMAL, + TYPE_NORMAL, + 90, // catch rate + 128, // base exp. yield + 0, 0, 0, 2, 0, 0, + ITEM_ORAN_BERRY, + ITEM_SITRUS_BERRY, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_PICKUP, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_WHITE + }, { // Wurmple + 45, 45, 35, 20, 20, 30, + TYPE_BUG, + TYPE_BUG, + 255, // catch rate + 54, // base exp. yield + 1, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_SHIELD_DUST, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Silcoon + 50, 35, 55, 15, 25, 25, + TYPE_BUG, + TYPE_BUG, + 120, // catch rate + 71, // base exp. yield + 0, 0, 2, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_SHED_SKIN, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_WHITE + }, { // Beautifly + 60, 70, 50, 65, 90, 50, + TYPE_BUG, + TYPE_FLYING, + 45, // catch rate + 161, // base exp. yield + 0, 0, 0, 0, 3, 0, + ITEM_NONE, + ITEM_SILVER_POWDER, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_SWARM, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Cascoon + 50, 35, 55, 15, 25, 25, + TYPE_BUG, + TYPE_BUG, + 120, // catch rate + 72, // base exp. yield + 0, 0, 2, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_SHED_SKIN, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Dustox + 60, 50, 70, 65, 50, 90, + TYPE_BUG, + TYPE_POISON, + 45, // catch rate + 160, // base exp. yield + 0, 0, 0, 0, 0, 3, + ITEM_NONE, + ITEM_SILVER_POWDER, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_SHIELD_DUST, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Lotad + 40, 30, 30, 30, 40, 50, + TYPE_WATER, + TYPE_GRASS, + 255, // catch rate + 74, // base exp. yield + 0, 0, 0, 0, 0, 1, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_WATER_1, + EGG_GROUP_GRASS, + ABILITY_SWIFT_SWIM, + ABILITY_RAIN_DISH, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Lombre + 60, 50, 50, 50, 60, 70, + TYPE_WATER, + TYPE_GRASS, + 120, // catch rate + 141, // base exp. yield + 0, 0, 0, 0, 0, 2, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_WATER_1, + EGG_GROUP_GRASS, + ABILITY_SWIFT_SWIM, + ABILITY_RAIN_DISH, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Ludicolo + 80, 70, 70, 70, 90, 100, + TYPE_WATER, + TYPE_GRASS, + 45, // catch rate + 181, // base exp. yield + 0, 0, 0, 0, 0, 3, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_WATER_1, + EGG_GROUP_GRASS, + ABILITY_SWIFT_SWIM, + ABILITY_RAIN_DISH, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Seedot + 40, 40, 50, 30, 30, 30, + TYPE_GRASS, + TYPE_GRASS, + 255, // catch rate + 74, // base exp. yield + 0, 0, 1, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_FIELD, + EGG_GROUP_GRASS, + ABILITY_CHLOROPHYLL, + ABILITY_EARLY_BIRD, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Nuzleaf + 70, 70, 40, 60, 60, 40, + TYPE_GRASS, + TYPE_DARK, + 120, // catch rate + 141, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_FIELD, + EGG_GROUP_GRASS, + ABILITY_CHLOROPHYLL, + ABILITY_EARLY_BIRD, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Shiftry + 90, 100, 60, 80, 90, 60, + TYPE_GRASS, + TYPE_DARK, + 45, // catch rate + 181, // base exp. yield + 0, 3, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_FIELD, + EGG_GROUP_GRASS, + ABILITY_CHLOROPHYLL, + ABILITY_EARLY_BIRD, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Nincada + 31, 45, 90, 40, 30, 30, + TYPE_BUG, + TYPE_GROUND, + 255, // catch rate + 65, // base exp. yield + 0, 0, 1, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_ERRATIC, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_COMPOUND_EYES, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Ninjask + 61, 90, 45, 160, 50, 50, + TYPE_BUG, + TYPE_FLYING, + 120, // catch rate + 155, // base exp. yield + 0, 0, 0, 2, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_ERRATIC, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_SPEED_BOOST, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Shedinja + 1, 90, 45, 40, 30, 30, + TYPE_BUG, + TYPE_GHOST, + 45, // catch rate + 95, // base exp. yield + 2, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_ERRATIC, + EGG_GROUP_MINERAL, + EGG_GROUP_MINERAL, + ABILITY_WONDER_GUARD, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Taillow + 40, 55, 30, 85, 30, 30, + TYPE_NORMAL, + TYPE_FLYING, + 200, // catch rate + 59, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_FLYING, + EGG_GROUP_FLYING, + ABILITY_GUTS, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Swellow + 60, 85, 60, 125, 50, 50, + TYPE_NORMAL, + TYPE_FLYING, + 45, // catch rate + 162, // base exp. yield + 0, 0, 0, 2, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_FLYING, + EGG_GROUP_FLYING, + ABILITY_GUTS, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Shroomish + 60, 40, 60, 35, 40, 60, + TYPE_GRASS, + TYPE_GRASS, + 255, // catch rate + 65, // base exp. yield + 1, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_FLUCTUATING, + EGG_GROUP_FAIRY, + EGG_GROUP_GRASS, + ABILITY_EFFECT_SPORE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Breloom + 60, 130, 80, 70, 60, 60, + TYPE_GRASS, + TYPE_FIGHTING, + 90, // catch rate + 165, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_FLUCTUATING, + EGG_GROUP_FAIRY, + EGG_GROUP_GRASS, + ABILITY_EFFECT_SPORE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Spinda + 60, 60, 60, 60, 60, 60, + TYPE_NORMAL, + TYPE_NORMAL, + 255, // catch rate + 85, // base exp. yield + 0, 0, 0, 0, 1, 0, + ITEM_NONE, + ITEM_CHESTO_BERRY, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_HUMAN_LIKE, + ABILITY_OWN_TEMPO, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN, TRUE + }, { // Wingull + 40, 30, 30, 85, 55, 30, + TYPE_WATER, + TYPE_FLYING, + 190, // catch rate + 64, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_WATER_1, + EGG_GROUP_FLYING, + ABILITY_KEEN_EYE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_WHITE + }, { // Pelipper + 60, 50, 100, 65, 85, 70, + TYPE_WATER, + TYPE_FLYING, + 45, // catch rate + 164, // base exp. yield + 0, 0, 2, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_WATER_1, + EGG_GROUP_FLYING, + ABILITY_KEEN_EYE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Surskit + 40, 30, 32, 65, 50, 52, + TYPE_BUG, + TYPE_WATER, + 200, // catch rate + 63, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_WATER_1, + EGG_GROUP_BUG, + ABILITY_SWIFT_SWIM, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Masquerain + 70, 60, 62, 60, 80, 82, + TYPE_BUG, + TYPE_FLYING, + 75, // catch rate + 128, // base exp. yield + 0, 0, 0, 0, 1, 1, + ITEM_NONE, + ITEM_SILVER_POWDER, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_WATER_1, + EGG_GROUP_BUG, + ABILITY_INTIMIDATE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Wailmer + 130, 70, 35, 60, 70, 35, + TYPE_WATER, + TYPE_WATER, + 125, // catch rate + 137, // base exp. yield + 1, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 40, // egg cycles + 70, // base friendship + GROWTH_FLUCTUATING, + EGG_GROUP_FIELD, + EGG_GROUP_WATER_2, + ABILITY_WATER_VEIL, + ABILITY_OBLIVIOUS, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Wailord + 170, 90, 45, 60, 90, 45, + TYPE_WATER, + TYPE_WATER, + 60, // catch rate + 206, // base exp. yield + 2, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 40, // egg cycles + 70, // base friendship + GROWTH_FLUCTUATING, + EGG_GROUP_FIELD, + EGG_GROUP_WATER_2, + ABILITY_WATER_VEIL, + ABILITY_OBLIVIOUS, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Skitty + 50, 45, 45, 50, 35, 35, + TYPE_NORMAL, + TYPE_NORMAL, + 255, // catch rate + 65, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_LEPPA_BERRY, + 191, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FAIRY, + ABILITY_CUTE_CHARM, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PINK + }, { // Delcatty + 70, 65, 65, 70, 55, 55, + TYPE_NORMAL, + TYPE_NORMAL, + 60, // catch rate + 138, // base exp. yield + 1, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_LEPPA_BERRY, + 191, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FAIRY, + ABILITY_CUTE_CHARM, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Kecleon + 60, 90, 70, 40, 60, 120, + TYPE_NORMAL, + TYPE_NORMAL, + 200, // catch rate + 132, // base exp. yield + 0, 0, 0, 0, 0, 1, + ITEM_NONE, + ITEM_PERSIM_BERRY, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_COLOR_CHANGE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Baltoy + 40, 40, 55, 55, 40, 70, + TYPE_GROUND, + TYPE_PSYCHIC, + 255, // catch rate + 58, // base exp. yield + 0, 0, 0, 0, 0, 1, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_MINERAL, + EGG_GROUP_MINERAL, + ABILITY_LEVITATE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Claydol + 60, 70, 105, 75, 70, 120, + TYPE_GROUND, + TYPE_PSYCHIC, + 90, // catch rate + 189, // base exp. yield + 0, 0, 0, 0, 0, 2, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_MINERAL, + EGG_GROUP_MINERAL, + ABILITY_LEVITATE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // Nosepass + 30, 45, 135, 30, 45, 90, + TYPE_ROCK, + TYPE_ROCK, + 255, // catch rate + 108, // base exp. yield + 0, 0, 1, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_MINERAL, + EGG_GROUP_MINERAL, + ABILITY_STURDY, + ABILITY_MAGNET_PULL, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Torkoal + 70, 85, 140, 20, 85, 70, + TYPE_FIRE, + TYPE_FIRE, + 90, // catch rate + 161, // base exp. yield + 0, 0, 2, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_WHITE_SMOKE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Sableye + 50, 75, 75, 50, 65, 65, + TYPE_DARK, + TYPE_GHOST, + 45, // catch rate + 98, // base exp. yield + 0, 1, 1, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 25, // egg cycles + 35, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_HUMAN_LIKE, + EGG_GROUP_HUMAN_LIKE, + ABILITY_KEEN_EYE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Barboach + 50, 48, 43, 60, 46, 41, + TYPE_WATER, + TYPE_GROUND, + 190, // catch rate + 92, // base exp. yield + 1, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_WATER_2, + EGG_GROUP_WATER_2, + ABILITY_OBLIVIOUS, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Whiscash + 110, 78, 73, 60, 76, 71, + TYPE_WATER, + TYPE_GROUND, + 75, // catch rate + 158, // base exp. yield + 2, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_WATER_2, + EGG_GROUP_WATER_2, + ABILITY_OBLIVIOUS, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Luvdisc + 43, 30, 55, 97, 40, 65, + TYPE_WATER, + TYPE_WATER, + 225, // catch rate + 110, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_HEART_SCALE, + ITEM_NONE, + 191, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_FAST, + EGG_GROUP_WATER_2, + EGG_GROUP_WATER_2, + ABILITY_SWIFT_SWIM, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PINK + }, { // Corphish + 43, 80, 65, 35, 50, 35, + TYPE_WATER, + TYPE_WATER, + 205, // catch rate + 111, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_FLUCTUATING, + EGG_GROUP_WATER_1, + EGG_GROUP_WATER_3, + ABILITY_HYPER_CUTTER, + ABILITY_SHELL_ARMOR, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Crawdaunt + 63, 120, 85, 55, 90, 55, + TYPE_WATER, + TYPE_DARK, + 155, // catch rate + 161, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_FLUCTUATING, + EGG_GROUP_WATER_1, + EGG_GROUP_WATER_3, + ABILITY_HYPER_CUTTER, + ABILITY_SHELL_ARMOR, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Feebas + 20, 15, 20, 80, 10, 55, + TYPE_WATER, + TYPE_WATER, + 255, // catch rate + 61, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_ERRATIC, + EGG_GROUP_WATER_1, + EGG_GROUP_DRAGON, + ABILITY_SWIFT_SWIM, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Milotic + 95, 60, 79, 81, 100, 125, + TYPE_WATER, + TYPE_WATER, + 60, // catch rate + 213, // base exp. yield + 0, 0, 0, 0, 0, 2, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_ERRATIC, + EGG_GROUP_WATER_1, + EGG_GROUP_DRAGON, + ABILITY_MARVEL_SCALE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PINK + }, { // Carvanha + 45, 90, 20, 65, 65, 20, + TYPE_WATER, + TYPE_DARK, + 225, // catch rate + 88, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_WATER_2, + EGG_GROUP_WATER_2, + ABILITY_ROUGH_SKIN, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Sharpedo + 70, 120, 40, 95, 95, 40, + TYPE_WATER, + TYPE_DARK, + 60, // catch rate + 175, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_WATER_2, + EGG_GROUP_WATER_2, + ABILITY_ROUGH_SKIN, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Trapinch + 45, 100, 45, 10, 45, 45, + TYPE_GROUND, + TYPE_GROUND, + 255, // catch rate + 73, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_SOFT_SAND, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_HYPER_CUTTER, + ABILITY_ARENA_TRAP, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Vibrava + 50, 70, 50, 70, 50, 50, + TYPE_GROUND, + TYPE_DRAGON, + 120, // catch rate + 126, // base exp. yield + 0, 1, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_LEVITATE, + ABILITY_LEVITATE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Flygon + 80, 100, 80, 100, 80, 80, + TYPE_GROUND, + TYPE_DRAGON, + 45, // catch rate + 197, // base exp. yield + 0, 1, 0, 2, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_BUG, + EGG_GROUP_BUG, + ABILITY_LEVITATE, + ABILITY_LEVITATE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Makuhita + 72, 60, 30, 25, 20, 30, + TYPE_FIGHTING, + TYPE_FIGHTING, + 180, // catch rate + 87, // base exp. yield + 1, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 63, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_FLUCTUATING, + EGG_GROUP_HUMAN_LIKE, + EGG_GROUP_HUMAN_LIKE, + ABILITY_THICK_FAT, + ABILITY_GUTS, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Hariyama + 144, 120, 60, 50, 40, 60, + TYPE_FIGHTING, + TYPE_FIGHTING, + 200, // catch rate + 184, // base exp. yield + 2, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_KINGS_ROCK, + 63, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_FLUCTUATING, + EGG_GROUP_HUMAN_LIKE, + EGG_GROUP_HUMAN_LIKE, + ABILITY_THICK_FAT, + ABILITY_GUTS, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Electrike + 40, 45, 40, 65, 65, 40, + TYPE_ELECTRIC, + TYPE_ELECTRIC, + 120, // catch rate + 104, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_STATIC, + ABILITY_LIGHTNING_ROD, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Manectric + 70, 75, 60, 105, 105, 60, + TYPE_ELECTRIC, + TYPE_ELECTRIC, + 45, // catch rate + 168, // base exp. yield + 0, 0, 0, 2, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_STATIC, + ABILITY_LIGHTNING_ROD, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Numel + 60, 60, 40, 35, 65, 45, + TYPE_FIRE, + TYPE_GROUND, + 255, // catch rate + 88, // base exp. yield + 0, 0, 0, 0, 1, 0, + ITEM_RAWST_BERRY, + ITEM_RAWST_BERRY, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_OBLIVIOUS, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Camerupt + 70, 100, 70, 40, 105, 75, + TYPE_FIRE, + TYPE_GROUND, + 150, // catch rate + 175, // base exp. yield + 0, 1, 0, 0, 1, 0, + ITEM_RAWST_BERRY, + ITEM_RAWST_BERRY, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_MAGMA_ARMOR, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Spheal + 70, 40, 50, 25, 55, 50, + TYPE_ICE, + TYPE_WATER, + 255, // catch rate + 75, // base exp. yield + 1, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_WATER_1, + EGG_GROUP_FIELD, + ABILITY_THICK_FAT, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Sealeo + 90, 60, 70, 45, 75, 70, + TYPE_ICE, + TYPE_WATER, + 120, // catch rate + 128, // base exp. yield + 2, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_WATER_1, + EGG_GROUP_FIELD, + ABILITY_THICK_FAT, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Walrein + 110, 80, 90, 65, 95, 90, + TYPE_ICE, + TYPE_WATER, + 45, // catch rate + 192, // base exp. yield + 3, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_WATER_1, + EGG_GROUP_FIELD, + ABILITY_THICK_FAT, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Cacnea + 50, 85, 40, 35, 85, 40, + TYPE_GRASS, + TYPE_GRASS, + 190, // catch rate + 97, // base exp. yield + 0, 0, 0, 0, 1, 0, + ITEM_NONE, + ITEM_POISON_BARB, + 127, // gender + 20, // egg cycles + 35, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_GRASS, + EGG_GROUP_HUMAN_LIKE, + ABILITY_SAND_VEIL, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Cacturne + 70, 115, 60, 55, 115, 60, + TYPE_GRASS, + TYPE_DARK, + 60, // catch rate + 177, // base exp. yield + 0, 1, 0, 0, 1, 0, + ITEM_NONE, + ITEM_POISON_BARB, + 127, // gender + 20, // egg cycles + 35, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_GRASS, + EGG_GROUP_HUMAN_LIKE, + ABILITY_SAND_VEIL, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Snorunt + 50, 50, 50, 50, 50, 50, + TYPE_ICE, + TYPE_ICE, + 190, // catch rate + 74, // base exp. yield + 1, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FAIRY, + EGG_GROUP_MINERAL, + ABILITY_INNER_FOCUS, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Glalie + 80, 80, 80, 80, 80, 80, + TYPE_ICE, + TYPE_ICE, + 75, // catch rate + 187, // base exp. yield + 2, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NEVER_MELT_ICE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FAIRY, + EGG_GROUP_MINERAL, + ABILITY_INNER_FOCUS, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Lunatone + 70, 55, 65, 70, 95, 85, + TYPE_ROCK, + TYPE_PSYCHIC, + 45, // catch rate + 150, // base exp. yield + 0, 0, 0, 0, 2, 0, + ITEM_NONE, + ITEM_MOON_STONE, + 255, // gender + 25, // egg cycles + 70, // base friendship + GROWTH_FAST, + EGG_GROUP_MINERAL, + EGG_GROUP_MINERAL, + ABILITY_LEVITATE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Solrock + 70, 95, 85, 70, 55, 65, + TYPE_ROCK, + TYPE_PSYCHIC, + 45, // catch rate + 150, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_SUN_STONE, + 255, // gender + 25, // egg cycles + 70, // base friendship + GROWTH_FAST, + EGG_GROUP_MINERAL, + EGG_GROUP_MINERAL, + ABILITY_LEVITATE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Azurill + 50, 20, 40, 20, 20, 40, + TYPE_NORMAL, + TYPE_NORMAL, + 150, // catch rate + 33, // base exp. yield + 1, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 191, // gender + 10, // egg cycles + 70, // base friendship + GROWTH_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_THICK_FAT, + ABILITY_HUGE_POWER, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Spoink + 60, 25, 35, 60, 70, 80, + TYPE_PSYCHIC, + TYPE_PSYCHIC, + 255, // catch rate + 89, // base exp. yield + 0, 0, 0, 0, 0, 1, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_THICK_FAT, + ABILITY_OWN_TEMPO, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // Grumpig + 80, 45, 65, 80, 90, 110, + TYPE_PSYCHIC, + TYPE_PSYCHIC, + 60, // catch rate + 164, // base exp. yield + 0, 0, 0, 0, 0, 2, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_THICK_FAT, + ABILITY_OWN_TEMPO, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Plusle + 60, 50, 40, 95, 85, 75, + TYPE_ELECTRIC, + TYPE_ELECTRIC, + 200, // catch rate + 120, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FAIRY, + EGG_GROUP_FAIRY, + ABILITY_PLUS, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Minun + 60, 40, 50, 95, 75, 85, + TYPE_ELECTRIC, + TYPE_ELECTRIC, + 200, // catch rate + 120, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FAIRY, + EGG_GROUP_FAIRY, + ABILITY_MINUS, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Mawile + 50, 85, 85, 50, 55, 55, + TYPE_STEEL, + TYPE_STEEL, + 45, // catch rate + 98, // base exp. yield + 0, 1, 1, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_FAST, + EGG_GROUP_FIELD, + EGG_GROUP_FAIRY, + ABILITY_HYPER_CUTTER, + ABILITY_INTIMIDATE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // Meditite + 30, 40, 55, 60, 40, 55, + TYPE_FIGHTING, + TYPE_PSYCHIC, + 180, // catch rate + 91, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_HUMAN_LIKE, + EGG_GROUP_HUMAN_LIKE, + ABILITY_PURE_POWER, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Medicham + 60, 60, 75, 80, 60, 75, + TYPE_FIGHTING, + TYPE_PSYCHIC, + 90, // catch rate + 153, // base exp. yield + 0, 0, 0, 2, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_HUMAN_LIKE, + EGG_GROUP_HUMAN_LIKE, + ABILITY_PURE_POWER, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Swablu + 45, 40, 60, 50, 40, 75, + TYPE_NORMAL, + TYPE_FLYING, + 255, // catch rate + 74, // base exp. yield + 0, 0, 0, 0, 0, 1, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_ERRATIC, + EGG_GROUP_FLYING, + EGG_GROUP_DRAGON, + ABILITY_NATURAL_CURE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Altaria + 75, 70, 90, 80, 70, 105, + TYPE_DRAGON, + TYPE_FLYING, + 45, // catch rate + 188, // base exp. yield + 0, 0, 0, 0, 0, 2, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_ERRATIC, + EGG_GROUP_FLYING, + EGG_GROUP_DRAGON, + ABILITY_NATURAL_CURE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Wynaut + 95, 23, 48, 23, 23, 48, + TYPE_PSYCHIC, + TYPE_PSYCHIC, + 125, // catch rate + 44, // base exp. yield + 1, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_SHADOW_TAG, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Duskull + 20, 40, 90, 25, 30, 90, + TYPE_GHOST, + TYPE_GHOST, + 190, // catch rate + 97, // base exp. yield + 0, 0, 1, 0, 0, 1, + ITEM_NONE, + ITEM_SPELL_TAG, + 127, // gender + 25, // egg cycles + 35, // base friendship + GROWTH_FAST, + EGG_GROUP_AMORPHOUS, + EGG_GROUP_AMORPHOUS, + ABILITY_LEVITATE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // Dusclops + 40, 70, 130, 25, 60, 130, + TYPE_GHOST, + TYPE_GHOST, + 90, // catch rate + 179, // base exp. yield + 0, 0, 1, 0, 0, 2, + ITEM_NONE, + ITEM_SPELL_TAG, + 127, // gender + 25, // egg cycles + 35, // base friendship + GROWTH_FAST, + EGG_GROUP_AMORPHOUS, + EGG_GROUP_AMORPHOUS, + ABILITY_PRESSURE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // Roselia + 50, 60, 45, 65, 100, 80, + TYPE_GRASS, + TYPE_POISON, + 150, // catch rate + 152, // base exp. yield + 0, 0, 0, 0, 1, 0, + ITEM_NONE, + ITEM_POISON_BARB, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_FAIRY, + EGG_GROUP_GRASS, + ABILITY_NATURAL_CURE, + ABILITY_POISON_POINT, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN, TRUE + }, { // Slakoth + 60, 60, 60, 30, 35, 35, + TYPE_NORMAL, + TYPE_NORMAL, + 255, // catch rate + 83, // base exp. yield + 1, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_TRUANT, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Vigoroth + 80, 80, 80, 90, 55, 55, + TYPE_NORMAL, + TYPE_NORMAL, + 120, // catch rate + 126, // base exp. yield + 0, 0, 0, 2, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_VITAL_SPIRIT, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_WHITE + }, { // Slaking + 150, 160, 100, 100, 95, 65, + TYPE_NORMAL, + TYPE_NORMAL, + 45, // catch rate + 210, // base exp. yield + 3, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_TRUANT, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Gulpin + 70, 43, 53, 40, 43, 53, + TYPE_POISON, + TYPE_POISON, + 225, // catch rate + 75, // base exp. yield + 1, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_BIG_PEARL, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_FLUCTUATING, + EGG_GROUP_AMORPHOUS, + EGG_GROUP_AMORPHOUS, + ABILITY_LIQUID_OOZE, + ABILITY_STICKY_HOLD, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Swalot + 100, 73, 83, 55, 73, 83, + TYPE_POISON, + TYPE_POISON, + 75, // catch rate + 168, // base exp. yield + 2, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_BIG_PEARL, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_FLUCTUATING, + EGG_GROUP_AMORPHOUS, + EGG_GROUP_AMORPHOUS, + ABILITY_LIQUID_OOZE, + ABILITY_STICKY_HOLD, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Tropius + 99, 68, 83, 51, 72, 87, + TYPE_GRASS, + TYPE_FLYING, + 200, // catch rate + 169, // base exp. yield + 2, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 25, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_GRASS, + ABILITY_CHLOROPHYLL, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Whismur + 64, 51, 23, 28, 51, 23, + TYPE_NORMAL, + TYPE_NORMAL, + 190, // catch rate + 68, // base exp. yield + 1, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_CHESTO_BERRY, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_FIELD, + ABILITY_SOUNDPROOF, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PINK + }, { // Loudred + 84, 71, 43, 48, 71, 43, + TYPE_NORMAL, + TYPE_NORMAL, + 120, // catch rate + 126, // base exp. yield + 2, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_CHESTO_BERRY, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_FIELD, + ABILITY_SOUNDPROOF, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Exploud + 104, 91, 63, 68, 91, 63, + TYPE_NORMAL, + TYPE_NORMAL, + 45, // catch rate + 184, // base exp. yield + 3, 0, 0, 0, 0, 0, + ITEM_NONE, + ITEM_CHESTO_BERRY, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_FIELD, + ABILITY_SOUNDPROOF, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Clamperl + 35, 64, 85, 32, 74, 55, + TYPE_WATER, + TYPE_WATER, + 255, // catch rate + 142, // base exp. yield + 0, 0, 1, 0, 0, 0, + ITEM_NONE, + ITEM_BLUE_SHARD, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_ERRATIC, + EGG_GROUP_WATER_1, + EGG_GROUP_WATER_1, + ABILITY_SHELL_ARMOR, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Huntail + 55, 104, 105, 52, 94, 75, + TYPE_WATER, + TYPE_WATER, + 60, // catch rate + 178, // base exp. yield + 0, 1, 1, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_ERRATIC, + EGG_GROUP_WATER_1, + EGG_GROUP_WATER_1, + ABILITY_SWIFT_SWIM, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Gorebyss + 55, 84, 105, 52, 114, 75, + TYPE_WATER, + TYPE_WATER, + 60, // catch rate + 178, // base exp. yield + 0, 0, 0, 0, 2, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_ERRATIC, + EGG_GROUP_WATER_1, + EGG_GROUP_WATER_1, + ABILITY_SWIFT_SWIM, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PINK + }, { // Absol + 65, 130, 60, 75, 75, 60, + TYPE_DARK, + TYPE_DARK, + 30, // catch rate + 174, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 25, // egg cycles + 35, // base friendship + GROWTH_MEDIUM_SLOW, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_PRESSURE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_WHITE, TRUE + }, { // Shuppet + 44, 75, 35, 45, 63, 33, + TYPE_GHOST, + TYPE_GHOST, + 225, // catch rate + 97, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_SPELL_TAG, + 127, // gender + 25, // egg cycles + 35, // base friendship + GROWTH_FAST, + EGG_GROUP_AMORPHOUS, + EGG_GROUP_AMORPHOUS, + ABILITY_INSOMNIA, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // Banette + 64, 115, 65, 65, 83, 63, + TYPE_GHOST, + TYPE_GHOST, + 45, // catch rate + 179, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_SPELL_TAG, + 127, // gender + 25, // egg cycles + 35, // base friendship + GROWTH_FAST, + EGG_GROUP_AMORPHOUS, + EGG_GROUP_AMORPHOUS, + ABILITY_INSOMNIA, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK + }, { // Seviper + 73, 100, 60, 65, 100, 60, + TYPE_POISON, + TYPE_POISON, + 90, // catch rate + 165, // base exp. yield + 0, 1, 0, 0, 1, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_FLUCTUATING, + EGG_GROUP_FIELD, + EGG_GROUP_DRAGON, + ABILITY_SHED_SKIN, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLACK, TRUE + }, { // Zangoose + 73, 115, 60, 90, 60, 60, + TYPE_NORMAL, + TYPE_NORMAL, + 90, // catch rate + 165, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 70, // base friendship + GROWTH_ERRATIC, + EGG_GROUP_FIELD, + EGG_GROUP_FIELD, + ABILITY_IMMUNITY, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_WHITE, TRUE + }, { // Relicanth + 100, 90, 130, 55, 45, 65, + TYPE_WATER, + TYPE_ROCK, + 25, // catch rate + 198, // base exp. yield + 1, 0, 1, 0, 0, 0, + ITEM_NONE, + ITEM_GREEN_SHARD, + 31, // gender + 40, // egg cycles + 70, // base friendship + GROWTH_SLOW, + EGG_GROUP_WATER_1, + EGG_GROUP_WATER_2, + ABILITY_SWIFT_SWIM, + ABILITY_ROCK_HEAD, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Aron + 50, 70, 100, 30, 40, 40, + TYPE_STEEL, + TYPE_ROCK, + 180, // catch rate + 96, // base exp. yield + 0, 0, 1, 0, 0, 0, + ITEM_NONE, + ITEM_HARD_STONE, + 127, // gender + 35, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_MONSTER, + ABILITY_STURDY, + ABILITY_ROCK_HEAD, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Lairon + 60, 90, 140, 40, 50, 50, + TYPE_STEEL, + TYPE_ROCK, + 90, // catch rate + 152, // base exp. yield + 0, 0, 2, 0, 0, 0, + ITEM_NONE, + ITEM_HARD_STONE, + 127, // gender + 35, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_MONSTER, + ABILITY_STURDY, + ABILITY_ROCK_HEAD, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Aggron + 70, 110, 180, 50, 60, 60, + TYPE_STEEL, + TYPE_ROCK, + 45, // catch rate + 205, // base exp. yield + 0, 0, 3, 0, 0, 0, + ITEM_NONE, + ITEM_HARD_STONE, + 127, // gender + 35, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_MONSTER, + EGG_GROUP_MONSTER, + ABILITY_STURDY, + ABILITY_ROCK_HEAD, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Castform + 70, 70, 70, 70, 70, 70, + TYPE_NORMAL, + TYPE_NORMAL, + 45, // catch rate + 145, // base exp. yield + 1, 0, 0, 0, 0, 0, + ITEM_MYSTIC_WATER, + ITEM_MYSTIC_WATER, + 127, // gender + 25, // egg cycles + 70, // base friendship + GROWTH_MEDIUM_FAST, + EGG_GROUP_FAIRY, + EGG_GROUP_AMORPHOUS, + ABILITY_FORECAST, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_WHITE + }, { // Volbeat + 65, 73, 55, 85, 47, 75, + TYPE_BUG, + TYPE_BUG, + 150, // catch rate + 146, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 0, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_ERRATIC, + EGG_GROUP_BUG, + EGG_GROUP_HUMAN_LIKE, + ABILITY_ILLUMINATE, + ABILITY_SWARM, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Illumise + 65, 47, 55, 85, 73, 75, + TYPE_BUG, + TYPE_BUG, + 150, // catch rate + 146, // base exp. yield + 0, 0, 0, 1, 0, 0, + ITEM_NONE, + ITEM_NONE, + 254, // gender + 15, // egg cycles + 70, // base friendship + GROWTH_FLUCTUATING, + EGG_GROUP_BUG, + EGG_GROUP_HUMAN_LIKE, + ABILITY_OBLIVIOUS, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Lileep + 66, 41, 77, 23, 61, 87, + TYPE_ROCK, + TYPE_GRASS, + 45, // catch rate + 121, // base exp. yield + 0, 0, 0, 0, 0, 1, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 30, // egg cycles + 70, // base friendship + GROWTH_ERRATIC, + EGG_GROUP_WATER_3, + EGG_GROUP_WATER_3, + ABILITY_SUCTION_CUPS, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_PURPLE + }, { // Cradily + 86, 81, 97, 43, 81, 107, + TYPE_ROCK, + TYPE_GRASS, + 45, // catch rate + 201, // base exp. yield + 0, 0, 0, 0, 0, 2, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 30, // egg cycles + 70, // base friendship + GROWTH_ERRATIC, + EGG_GROUP_WATER_3, + EGG_GROUP_WATER_3, + ABILITY_SUCTION_CUPS, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Anorith + 45, 95, 50, 75, 40, 50, + TYPE_ROCK, + TYPE_BUG, + 45, // catch rate + 119, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 30, // egg cycles + 70, // base friendship + GROWTH_ERRATIC, + EGG_GROUP_WATER_3, + EGG_GROUP_WATER_3, + ABILITY_BATTLE_ARMOR, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Armaldo + 75, 125, 100, 45, 70, 80, + TYPE_ROCK, + TYPE_BUG, + 45, // catch rate + 200, // base exp. yield + 0, 2, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 31, // gender + 30, // egg cycles + 70, // base friendship + GROWTH_ERRATIC, + EGG_GROUP_WATER_3, + EGG_GROUP_WATER_3, + ABILITY_BATTLE_ARMOR, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Ralts + 28, 25, 25, 40, 45, 35, + TYPE_PSYCHIC, + TYPE_PSYCHIC, + 235, // catch rate + 70, // base exp. yield + 0, 0, 0, 0, 1, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_AMORPHOUS, + EGG_GROUP_AMORPHOUS, + ABILITY_SYNCHRONIZE, + ABILITY_TRACE, + 0, // Safari Zone flee rate + BODY_COLOR_WHITE + }, { // Kirlia + 38, 35, 35, 50, 65, 55, + TYPE_PSYCHIC, + TYPE_PSYCHIC, + 120, // catch rate + 140, // base exp. yield + 0, 0, 0, 0, 2, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_AMORPHOUS, + EGG_GROUP_AMORPHOUS, + ABILITY_SYNCHRONIZE, + ABILITY_TRACE, + 0, // Safari Zone flee rate + BODY_COLOR_WHITE + }, { // Gardevoir + 68, 65, 65, 80, 125, 115, + TYPE_PSYCHIC, + TYPE_PSYCHIC, + 45, // catch rate + 208, // base exp. yield + 0, 0, 0, 0, 3, 0, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 20, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_AMORPHOUS, + EGG_GROUP_AMORPHOUS, + ABILITY_SYNCHRONIZE, + ABILITY_TRACE, + 0, // Safari Zone flee rate + BODY_COLOR_WHITE + }, { // Bagon + 45, 75, 60, 50, 40, 30, + TYPE_DRAGON, + TYPE_DRAGON, + 45, // catch rate + 89, // base exp. yield + 0, 1, 0, 0, 0, 0, + ITEM_NONE, + ITEM_DRAGON_SCALE, + 127, // gender + 40, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_DRAGON, + EGG_GROUP_DRAGON, + ABILITY_ROCK_HEAD, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Shelgon + 65, 95, 100, 50, 60, 50, + TYPE_DRAGON, + TYPE_DRAGON, + 45, // catch rate + 144, // base exp. yield + 0, 0, 2, 0, 0, 0, + ITEM_NONE, + ITEM_DRAGON_SCALE, + 127, // gender + 40, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_DRAGON, + EGG_GROUP_DRAGON, + ABILITY_ROCK_HEAD, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_WHITE + }, { // Salamence + 95, 135, 80, 100, 110, 80, + TYPE_DRAGON, + TYPE_FLYING, + 45, // catch rate + 218, // base exp. yield + 0, 3, 0, 0, 0, 0, + ITEM_NONE, + ITEM_DRAGON_SCALE, + 127, // gender + 40, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_DRAGON, + EGG_GROUP_DRAGON, + ABILITY_INTIMIDATE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Beldum + 40, 55, 80, 30, 35, 60, + TYPE_STEEL, + TYPE_PSYCHIC, + 3, // catch rate + 103, // base exp. yield + 0, 0, 1, 0, 0, 0, + ITEM_NONE, + ITEM_METAL_COAT, + 255, // gender + 40, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_MINERAL, + EGG_GROUP_MINERAL, + ABILITY_CLEAR_BODY, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Metang + 60, 75, 100, 50, 55, 80, + TYPE_STEEL, + TYPE_PSYCHIC, + 3, // catch rate + 153, // base exp. yield + 0, 0, 2, 0, 0, 0, + ITEM_NONE, + ITEM_METAL_COAT, + 255, // gender + 40, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_MINERAL, + EGG_GROUP_MINERAL, + ABILITY_CLEAR_BODY, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Metagross + 80, 135, 130, 70, 95, 90, + TYPE_STEEL, + TYPE_PSYCHIC, + 3, // catch rate + 210, // base exp. yield + 0, 0, 3, 0, 0, 0, + ITEM_NONE, + ITEM_METAL_COAT, + 255, // gender + 40, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_MINERAL, + EGG_GROUP_MINERAL, + ABILITY_CLEAR_BODY, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Regirock + 80, 100, 200, 50, 50, 100, + TYPE_ROCK, + TYPE_ROCK, + 3, // catch rate + 217, // base exp. yield + 0, 0, 3, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 80, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_CLEAR_BODY, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BROWN + }, { // Regice + 80, 50, 100, 50, 100, 200, + TYPE_ICE, + TYPE_ICE, + 3, // catch rate + 216, // base exp. yield + 0, 0, 0, 0, 0, 3, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 80, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_CLEAR_BODY, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Registeel + 80, 75, 150, 50, 75, 150, + TYPE_STEEL, + TYPE_STEEL, + 3, // catch rate + 215, // base exp. yield + 0, 0, 2, 0, 0, 1, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 80, // egg cycles + 35, // base friendship + GROWTH_SLOW, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_CLEAR_BODY, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GRAY + }, { // Kyogre + 100, 100, 90, 90, 150, 140, + TYPE_WATER, + TYPE_WATER, + 5, // catch rate + 218, // base exp. yield + 0, 0, 0, 0, 3, 0, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_SLOW, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_DRIZZLE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Groudon + 100, 150, 140, 90, 100, 90, + TYPE_GROUND, + TYPE_GROUND, + 5, // catch rate + 218, // base exp. yield + 0, 3, 0, 0, 0, 0, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_SLOW, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_DROUGHT, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Rayquaza + 105, 150, 90, 95, 150, 90, + TYPE_DRAGON, + TYPE_FLYING, + 3, // catch rate + 220, // base exp. yield + 0, 2, 0, 0, 1, 0, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_SLOW, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_AIR_LOCK, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_GREEN + }, { // Latias + 80, 80, 90, 110, 110, 130, + TYPE_DRAGON, + TYPE_PSYCHIC, + 3, // catch rate + 211, // base exp. yield + 0, 0, 0, 0, 0, 3, + ITEM_NONE, + ITEM_NONE, + 254, // gender + 120, // egg cycles + 90, // base friendship + GROWTH_SLOW, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_LEVITATE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_RED + }, { // Latios + 80, 90, 80, 110, 130, 110, + TYPE_DRAGON, + TYPE_PSYCHIC, + 3, // catch rate + 211, // base exp. yield + 0, 0, 0, 0, 3, 0, + ITEM_NONE, + ITEM_NONE, + 0, // gender + 120, // egg cycles + 90, // base friendship + GROWTH_SLOW, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_LEVITATE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + }, { // Jirachi + 100, 100, 100, 100, 100, 100, + TYPE_STEEL, + TYPE_PSYCHIC, + 3, // catch rate + 215, // base exp. yield + 3, 0, 0, 0, 0, 0, + ITEM_STAR_PIECE, + ITEM_STAR_PIECE, + 255, // gender + 120, // egg cycles + 100, // base friendship + GROWTH_SLOW, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_SERENE_GRACE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_YELLOW + }, { // Deoxys + 50, 150, 50, 150, 150, 50, + TYPE_PSYCHIC, + TYPE_PSYCHIC, + 3, // catch rate + 215, // base exp. yield + 0, 1, 0, 1, 1, 0, + ITEM_NONE, + ITEM_NONE, + 255, // gender + 120, // egg cycles + 0, // base friendship + GROWTH_SLOW, + EGG_GROUP_UNDISCOVERED, + EGG_GROUP_UNDISCOVERED, + ABILITY_PRESSURE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_RED, TRUE + }, { // Chimecho + 65, 50, 70, 65, 95, 80, + TYPE_PSYCHIC, + TYPE_PSYCHIC, + 45, // catch rate + 147, // base exp. yield + 0, 0, 0, 0, 1, 1, + ITEM_NONE, + ITEM_NONE, + 127, // gender + 25, // egg cycles + 70, // base friendship + GROWTH_FAST, + EGG_GROUP_AMORPHOUS, + EGG_GROUP_AMORPHOUS, + ABILITY_LEVITATE, + ABILITY_NONE, + 0, // Safari Zone flee rate + BODY_COLOR_BLUE + } +}; + +#endif //POKERUBY_BASE_STATS_H diff --git a/src/data/pokemon/cry_ids.h b/src/data/pokemon/cry_ids.h new file mode 100644 index 000000000..6207a92f0 --- /dev/null +++ b/src/data/pokemon/cry_ids.h @@ -0,0 +1,146 @@ +// + +// + +#ifndef POKERUBY_CRY_IDS_H +#define POKERUBY_CRY_IDS_H + +const u16 gSpeciesIdToCryId[] = { + 273, // TREECKO + 274, // GROVYLE + 275, // SCEPTILE + 270, // TORCHIC + 271, // COMBUSKEN + 272, // BLAZIKEN + 276, // MUDKIP + 277, // MARSHTOMP + 278, // SWAMPERT + 359, // POOCHYENA + 360, // MIGHTYENA + 378, // ZIGZAGOON + 375, // LINOONE + 290, // WURMPLE + 291, // SILCOON + 292, // BEAUTIFLY + 293, // CASCOON + 294, // DUSTOX + 283, // LOTAD + 284, // LOMBRE + 285, // LUDICOLO + 286, // SEEDOT + 287, // NUZLEAF + 288, // SHIFTRY + 301, // NINCADA + 302, // NINJASK + 303, // SHEDINJA + 266, // TAILLOW + 267, // SWELLOW + 374, // SHROOMISH + 373, // BRELOOM + 269, // SPINDA + 280, // WINGULL + 279, // PELIPPER + 310, // SURSKIT + 311, // MASQUERAIN + 377, // WAILMER + 381, // WAILORD + 312, // SKITTY + 313, // DELCATTY + 251, // KECLEON + 329, // BALTOY + 330, // CLAYDOL + 306, // NOSEPASS + 253, // TORKOAL + 362, // SABLEYE + 318, // BARBOACH + 319, // WHISCASH + 368, // LUVDISC + 320, // CORPHISH + 321, // CRAWDAUNT + 333, // FEEBAS + 334, // MILOTIC + 289, // CARVANHA + 260, // SHARPEDO + 324, // TRAPINCH + 325, // VIBRAVA + 326, // FLYGON + 304, // MAKUHITA + 305, // HARIYAMA + 254, // ELECTRIKE + 255, // MANECTRIC + 316, // NUMEL + 317, // CAMERUPT + 338, // SPHEAL + 339, // SEALEO + 340, // WALREIN + 327, // CACNEA + 328, // CACTURNE + 383, // SNORUNT + 307, // GLALIE + 331, // LUNATONE + 332, // SOLROCK + 262, // AZURILL + 322, // SPOINK + 323, // GRUMPIG + 308, // PLUSLE + 309, // MINUN + 363, // MAWILE + 336, // MEDITITE + 337, // MEDICHAM + 263, // SWABLU + 264, // ALTARIA + 258, // WYNAUT + 256, // DUSKULL + 361, // DUSCLOPS + 252, // ROSELIA + 298, // SLAKOTH + 299, // VIGOROTH + 300, // SLAKING + 314, // GULPIN + 315, // SWALOT + 376, // TROPIUS + 382, // WHISMUR + 380, // LOUDRED + 379, // EXPLOUD + 341, // CLAMPERL + 342, // HUNTAIL + 343, // GOREBYSS + 335, // ABSOL + 282, // SHUPPET + 281, // BANETTE + 259, // SEVIPER + 261, // ZANGOOSE + 367, // RELICANTH + 364, // ARON + 365, // LAIRON + 366, // AGGRON + 356, // CASTFORM + 357, // VOLBEAT + 358, // ILLUMISE + 344, // LILEEP + 345, // CRADILY + 346, // ANORITH + 347, // ARMALDO + 295, // RALTS + 296, // KIRLIA + 297, // GARDEVOIR + 351, // BAGON + 352, // SHELGON + 372, // SALAMENCE + 348, // BELDUM + 349, // METANG + 350, // METAGROSS + 353, // REGIROCK + 354, // REGICE + 355, // REGISTEEL + 370, // KYOGRE + 369, // GROUDON + 371, // RAYQUAZA + 257, // LATIAS + 384, // LATIOS + 385, // JIRACHI + 386, // DEOXYS + 387 // CHIMECHO +}; + +#endif //POKERUBY_CRY_IDS_H diff --git a/src/data/pokemon/dex_order.h b/src/data/pokemon/dex_order.h new file mode 100644 index 000000000..cbb7182ed --- /dev/null +++ b/src/data/pokemon/dex_order.h @@ -0,0 +1,15 @@ +// + +// + +#ifndef POKERUBY_DEX_ORDER_H +#define POKERUBY_DEX_ORDER_H + +const u16 gSpeciesToHoennPokedexNum[] = {203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 156, 157, 112, 113, 227, 228, 229, 230, 231, 232, 233, 234, 153, 154, 138, 139, 63, 64, 88, 89, 90, 235, 236, 237, 238, 239, 240, 241, 242, 158, 159, 243, 244, 245, 246, 247, 248, 249, 39, 40, 41, 73, 74, 75, 250, 251, 252, 66, 67, 57, 58, 59, 253, 254, 255, 256, 82, 83, 257, 92, 93, 258, 259, 106, 107, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 84, 85, 270, 271, 272, 273, 274, 275, 276, 108, 109, 169, 170, 277, 278, 279, 184, 185, 50, 51, 143, 144, 280, 281, 282, 283, 284, 167, 285, 52, 53, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 65, 181, 182, 155, 324, 137, 325, 326, 162, 163, 327, 328, 329, 91, 55, 56, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 161, 164, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 168, 357, 358, 359, 103, 104, 360, 361, 180, 362, 363, 364, 365, 115, 366, 367, 186, 165, 166, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 42, 43, 44, 25, 26, 34, 35, 114, 27, 28, 32, 33, 99, 100, 61, 62, 145, 131, 132, 60, 105, 68, 127, 128, 183, 129, 130, 140, 141, 97, 98, 116, 117, 118, 48, 49, 78, 79, 101, 102, 173, 174, 175, 119, 120, 171, 172, 125, 126, 54, 110, 111, 80, 81, 69, 76, 77, 121, 122, 160, 148, 149, 94, 36, 37, 38, 95, 96, 150, 45, 46, 47, 176, 177, 178, 152, 146, 147, 124, 123, 179, 70, 71, 72, 142, 86, 87, 133, 134, 135, 136, 29, 30, 31, 187, 188, 189, 190, 191, 192, 193, 194, 195, 198, 199, 200, 196, 197, 201, 202, 151 +}; + +const u16 gSpeciesToNationalPokedexNum[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 290, 291, 292, 276, 277, 285, 286, 327, 278, 279, 283, 284, 320, 321, 300, 301, 352, 343, 344, 299, 324, 302, 339, 340, 370, 341, 342, 349, 350, 318, 319, 328, 329, 330, 296, 297, 309, 310, 322, 323, 363, 364, 365, 331, 332, 361, 362, 337, 338, 298, 325, 326, 311, 312, 303, 307, 308, 333, 334, 360, 355, 356, 315, 287, 288, 289, 316, 317, 357, 293, 294, 295, 366, 367, 368, 359, 353, 354, 336, 335, 369, 304, 305, 306, 351, 313, 314, 345, 346, 347, 348, 280, 281, 282, 371, 372, 373, 374, 375, 376, 377, 378, 379, 382, 383, 384, 380, 381, 385, 386, 358}; + +const u16 gHoennToNationalOrder[] = {252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 63, 64, 65, 290, 291, 292, 293, 294, 295, 296, 297, 118, 119, 129, 130, 298, 183, 184, 74, 75, 76, 299, 300, 301, 41, 42, 169, 72, 73, 302, 303, 304, 305, 306, 66, 67, 68, 307, 308, 309, 310, 311, 312, 81, 82, 100, 101, 313, 314, 43, 44, 45, 182, 84, 85, 315, 316, 317, 318, 319, 320, 321, 322, 323, 218, 219, 324, 88, 89, 109, 110, 325, 326, 27, 28, 327, 227, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 174, 39, 40, 349, 350, 351, 120, 121, 352, 353, 354, 355, 356, 357, 358, 359, 37, 38, 172, 25, 26, 54, 55, 360, 202, 177, 178, 203, 231, 232, 127, 214, 111, 112, 361, 362, 363, 364, 365, 366, 367, 368, 369, 222, 170, 171, 370, 116, 117, 230, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 29, 30, 31, 32, 33, 34, 35, 36, 46, 47, 48, 49, 50, 51, 52, 53, 56, 57, 58, 59, 60, 61, 62, 69, 70, 71, 77, 78, 79, 80, 83, 86, 87, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 102, 103, 104, 105, 106, 107, 108, 113, 114, 115, 122, 123, 124, 125, 126, 128, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 173, 175, 176, 179, 180, 181, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, 220, 221, 223, 224, 225, 226, 228, 229, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411}; + +#endif //POKERUBY_DEX_ORDER_H diff --git a/src/data/pokemon/egg_moves.h b/src/data/pokemon/egg_moves.h new file mode 100644 index 000000000..ab1b1dd33 --- /dev/null +++ b/src/data/pokemon/egg_moves.h @@ -0,0 +1,1318 @@ +// + +// + +#ifndef POKERUBY_DAYCARE_H +#define POKERUBY_DAYCARE_H + +#define EGG_MOVES_SPECIES_OFFSET 20000 +#define egg_moves(species, moves...) (SPECIES_##species + EGG_MOVES_SPECIES_OFFSET), moves + +#endif //POKERUBY_DAYCARE_H + +const u16 gEggMoves[] = { + egg_moves(BULBASAUR, + MOVE_LIGHT_SCREEN, + MOVE_SKULL_BASH, + MOVE_SAFEGUARD, + MOVE_CHARM, + MOVE_PETAL_DANCE, + MOVE_MAGICAL_LEAF, + MOVE_GRASS_WHISTLE, + MOVE_CURSE), + + egg_moves(CHARMANDER, + MOVE_BELLY_DRUM, + MOVE_ANCIENT_POWER, + MOVE_ROCK_SLIDE, + MOVE_BITE, + MOVE_OUTRAGE, + MOVE_BEAT_UP, + MOVE_SWORDS_DANCE, + MOVE_DRAGON_DANCE), + + egg_moves(SQUIRTLE, + MOVE_MIRROR_COAT, + MOVE_HAZE, + MOVE_MIST, + MOVE_FORESIGHT, + MOVE_FLAIL, + MOVE_REFRESH, + MOVE_MUD_SPORT, + MOVE_YAWN), + + egg_moves(PIDGEY, + MOVE_PURSUIT, + MOVE_FAINT_ATTACK, + MOVE_FORESIGHT, + MOVE_STEEL_WING, + MOVE_AIR_CUTTER), + + egg_moves(RATTATA, + MOVE_SCREECH, + MOVE_FLAME_WHEEL, + MOVE_FURY_SWIPES, + MOVE_BITE, + MOVE_COUNTER, + MOVE_REVERSAL, + MOVE_UPROAR, + MOVE_SWAGGER), + + egg_moves(SPEAROW, + MOVE_FAINT_ATTACK, + MOVE_FALSE_SWIPE, + MOVE_SCARY_FACE, + MOVE_QUICK_ATTACK, + MOVE_TRI_ATTACK, + MOVE_ASTONISH, + MOVE_SKY_ATTACK), + + egg_moves(EKANS, + MOVE_PURSUIT, + MOVE_SLAM, + MOVE_SPITE, + MOVE_BEAT_UP, + MOVE_POISON_FANG), + + egg_moves(SANDSHREW, + MOVE_FLAIL, + MOVE_SAFEGUARD, + MOVE_COUNTER, + MOVE_RAPID_SPIN, + MOVE_ROCK_SLIDE, + MOVE_METAL_CLAW, + MOVE_SWORDS_DANCE, + MOVE_CRUSH_CLAW), + + egg_moves(NIDORAN_F, + MOVE_SUPERSONIC, + MOVE_DISABLE, + MOVE_TAKE_DOWN, + MOVE_FOCUS_ENERGY, + MOVE_CHARM, + MOVE_COUNTER, + MOVE_BEAT_UP), + + egg_moves(NIDORAN_M, + MOVE_COUNTER, + MOVE_DISABLE, + MOVE_SUPERSONIC, + MOVE_TAKE_DOWN, + MOVE_AMNESIA, + MOVE_CONFUSION, + MOVE_BEAT_UP), + + egg_moves(VULPIX, + MOVE_FAINT_ATTACK, + MOVE_HYPNOSIS, + MOVE_FLAIL, + MOVE_SPITE, + MOVE_DISABLE, + MOVE_HOWL, + MOVE_PSYCH_UP, + MOVE_HEAT_WAVE), + + egg_moves(ZUBAT, + MOVE_QUICK_ATTACK, + MOVE_PURSUIT, + MOVE_FAINT_ATTACK, + MOVE_GUST, + MOVE_WHIRLWIND, + MOVE_CURSE), + + egg_moves(ODDISH, + MOVE_SWORDS_DANCE, + MOVE_RAZOR_LEAF, + MOVE_FLAIL, + MOVE_SYNTHESIS, + MOVE_CHARM, + MOVE_INGRAIN), + + egg_moves(PARAS, + MOVE_FALSE_SWIPE, + MOVE_SCREECH, + MOVE_COUNTER, + MOVE_PSYBEAM, + MOVE_FLAIL, + MOVE_SWEET_SCENT, + MOVE_LIGHT_SCREEN, + MOVE_PURSUIT), + + egg_moves(VENONAT, + MOVE_BATON_PASS, + MOVE_SCREECH, + MOVE_GIGA_DRAIN, + MOVE_SIGNAL_BEAM), + + egg_moves(DIGLETT, + MOVE_FAINT_ATTACK, + MOVE_SCREECH, + MOVE_ANCIENT_POWER, + MOVE_PURSUIT, + MOVE_BEAT_UP, + MOVE_UPROAR, + MOVE_ROCK_SLIDE), + + egg_moves(MEOWTH, + MOVE_SPITE, + MOVE_CHARM, + MOVE_HYPNOSIS, + MOVE_AMNESIA, + MOVE_PSYCH_UP, + MOVE_ASSIST), + + egg_moves(PSYDUCK, + MOVE_HYPNOSIS, + MOVE_PSYBEAM, + MOVE_FORESIGHT, + MOVE_LIGHT_SCREEN, + MOVE_FUTURE_SIGHT, + MOVE_PSYCHIC, + MOVE_CROSS_CHOP, + MOVE_REFRESH), + + egg_moves(MANKEY, + MOVE_ROCK_SLIDE, + MOVE_FORESIGHT, + MOVE_MEDITATE, + MOVE_COUNTER, + MOVE_REVERSAL, + MOVE_BEAT_UP, + MOVE_REVENGE, + MOVE_SMELLING_SALT), + + egg_moves(GROWLITHE, + MOVE_BODY_SLAM, + MOVE_SAFEGUARD, + MOVE_CRUNCH, + MOVE_THRASH, + MOVE_FIRE_SPIN, + MOVE_HOWL, + MOVE_HEAT_WAVE), + + egg_moves(POLIWAG, + MOVE_MIST, + MOVE_SPLASH, + MOVE_BUBBLE_BEAM, + MOVE_HAZE, + MOVE_MIND_READER, + MOVE_WATER_SPORT, + MOVE_ICE_BALL), + + egg_moves(ABRA, + MOVE_ENCORE, + MOVE_BARRIER, + MOVE_KNOCK_OFF, + MOVE_FIRE_PUNCH, + MOVE_THUNDER_PUNCH, + MOVE_ICE_PUNCH), + + egg_moves(MACHOP, + MOVE_LIGHT_SCREEN, + MOVE_MEDITATE, + MOVE_ROLLING_KICK, + MOVE_ENCORE, + MOVE_SMELLING_SALT, + MOVE_COUNTER, + MOVE_ROCK_SLIDE), + + egg_moves(BELLSPROUT, + MOVE_SWORDS_DANCE, + MOVE_ENCORE, + MOVE_REFLECT, + MOVE_SYNTHESIS, + MOVE_LEECH_LIFE, + MOVE_INGRAIN, + MOVE_MAGICAL_LEAF), + + egg_moves(TENTACOOL, + MOVE_AURORA_BEAM, + MOVE_MIRROR_COAT, + MOVE_RAPID_SPIN, + MOVE_HAZE, + MOVE_SAFEGUARD, + MOVE_CONFUSE_RAY), + + egg_moves(GEODUDE, + MOVE_MEGA_PUNCH, + MOVE_ROCK_SLIDE, + MOVE_BLOCK), + + egg_moves(PONYTA, + MOVE_FLAME_WHEEL, + MOVE_THRASH, + MOVE_DOUBLE_KICK, + MOVE_HYPNOSIS, + MOVE_CHARM, + MOVE_DOUBLE_EDGE), + + egg_moves(SLOWPOKE, + MOVE_SAFEGUARD, + MOVE_BELLY_DRUM, + MOVE_FUTURE_SIGHT, + MOVE_STOMP, + MOVE_MUD_SPORT, + MOVE_SLEEP_TALK, + MOVE_SNORE), + + egg_moves(FARFETCHD, + MOVE_STEEL_WING, + MOVE_FORESIGHT, + MOVE_MIRROR_MOVE, + MOVE_GUST, + MOVE_QUICK_ATTACK, + MOVE_FLAIL, + MOVE_FEATHER_DANCE, + MOVE_CURSE), + + egg_moves(DODUO, + MOVE_QUICK_ATTACK, + MOVE_SUPERSONIC, + MOVE_HAZE, + MOVE_FAINT_ATTACK, + MOVE_FLAIL, + MOVE_ENDEAVOR), + + egg_moves(SEEL, + MOVE_LICK, + MOVE_PERISH_SONG, + MOVE_DISABLE, + MOVE_HORN_DRILL, + MOVE_SLAM, + MOVE_ENCORE, + MOVE_FAKE_OUT, + MOVE_ICICLE_SPEAR), + + egg_moves(GRIMER, + MOVE_HAZE, + MOVE_MEAN_LOOK, + MOVE_LICK, + MOVE_IMPRISON, + MOVE_CURSE, + MOVE_SHADOW_PUNCH, + MOVE_EXPLOSION), + + egg_moves(SHELLDER, + MOVE_BUBBLE_BEAM, + MOVE_TAKE_DOWN, + MOVE_BARRIER, + MOVE_RAPID_SPIN, + MOVE_SCREECH, + MOVE_ICICLE_SPEAR), + + egg_moves(GASTLY, + MOVE_PSYWAVE, + MOVE_PERISH_SONG, + MOVE_HAZE, + MOVE_ASTONISH, + MOVE_WILL_O_WISP, + MOVE_GRUDGE, + MOVE_EXPLOSION), + + egg_moves(ONIX, + MOVE_ROCK_SLIDE, + MOVE_FLAIL, + MOVE_EXPLOSION, + MOVE_BLOCK), + + egg_moves(DROWZEE, + MOVE_BARRIER, + MOVE_ASSIST, + MOVE_ROLE_PLAY, + MOVE_FIRE_PUNCH, + MOVE_THUNDER_PUNCH, + MOVE_ICE_PUNCH), + + egg_moves(KRABBY, + MOVE_DIG, + MOVE_HAZE, + MOVE_AMNESIA, + MOVE_FLAIL, + MOVE_SLAM, + MOVE_KNOCK_OFF, + MOVE_SWORDS_DANCE), + + egg_moves(EXEGGCUTE, + MOVE_SYNTHESIS, + MOVE_MOONLIGHT, + MOVE_REFLECT, + MOVE_ANCIENT_POWER, + MOVE_PSYCH_UP, + MOVE_INGRAIN, + MOVE_CURSE), + + egg_moves(CUBONE, + MOVE_ROCK_SLIDE, + MOVE_ANCIENT_POWER, + MOVE_BELLY_DRUM, + MOVE_SCREECH, + MOVE_SKULL_BASH, + MOVE_PERISH_SONG, + MOVE_SWORDS_DANCE), + + egg_moves(LICKITUNG, + MOVE_BELLY_DRUM, + MOVE_MAGNITUDE, + MOVE_BODY_SLAM, + MOVE_CURSE, + MOVE_SMELLING_SALT, + MOVE_SLEEP_TALK, + MOVE_SNORE, + MOVE_SUBSTITUTE), + + egg_moves(KOFFING, + MOVE_SCREECH, + MOVE_PSYWAVE, + MOVE_PSYBEAM, + MOVE_DESTINY_BOND, + MOVE_PAIN_SPLIT, + MOVE_WILL_O_WISP), + + egg_moves(RHYHORN, + MOVE_CRUNCH, + MOVE_REVERSAL, + MOVE_ROCK_SLIDE, + MOVE_COUNTER, + MOVE_MAGNITUDE, + MOVE_SWORDS_DANCE, + MOVE_CURSE, + MOVE_CRUSH_CLAW), + + egg_moves(CHANSEY, + MOVE_PRESENT, + MOVE_METRONOME, + MOVE_HEAL_BELL, + MOVE_AROMATHERAPY, + MOVE_SUBSTITUTE), + + egg_moves(TANGELA, + MOVE_FLAIL, + MOVE_CONFUSION, + MOVE_MEGA_DRAIN, + MOVE_REFLECT, + MOVE_AMNESIA, + MOVE_LEECH_SEED, + MOVE_NATURE_POWER), + + egg_moves(KANGASKHAN, + MOVE_STOMP, + MOVE_FORESIGHT, + MOVE_FOCUS_ENERGY, + MOVE_SAFEGUARD, + MOVE_DISABLE, + MOVE_COUNTER, + MOVE_CRUSH_CLAW, + MOVE_SUBSTITUTE), + + egg_moves(HORSEA, + MOVE_FLAIL, + MOVE_AURORA_BEAM, + MOVE_OCTAZOOKA, + MOVE_DISABLE, + MOVE_SPLASH, + MOVE_DRAGON_RAGE, + MOVE_DRAGON_BREATH), + + egg_moves(GOLDEEN, + MOVE_PSYBEAM, + MOVE_HAZE, + MOVE_HYDRO_PUMP, + MOVE_SLEEP_TALK, + MOVE_MUD_SPORT), + + egg_moves(MR_MIME, + MOVE_FUTURE_SIGHT, + MOVE_HYPNOSIS, + MOVE_MIMIC, + MOVE_PSYCH_UP, + MOVE_FAKE_OUT, + MOVE_TRICK), + + egg_moves(SCYTHER, + MOVE_COUNTER, + MOVE_SAFEGUARD, + MOVE_BATON_PASS, + MOVE_RAZOR_WIND, + MOVE_REVERSAL, + MOVE_LIGHT_SCREEN, + MOVE_ENDURE, + MOVE_SILVER_WIND), + + egg_moves(PINSIR, + MOVE_FURY_ATTACK, + MOVE_FLAIL, + MOVE_FALSE_SWIPE, + MOVE_FAINT_ATTACK), + + egg_moves(LAPRAS, + MOVE_FORESIGHT, + MOVE_SUBSTITUTE, + MOVE_TICKLE, + MOVE_REFRESH, + MOVE_DRAGON_DANCE, + MOVE_CURSE, + MOVE_SLEEP_TALK, + MOVE_HORN_DRILL), + + egg_moves(EEVEE, + MOVE_CHARM, + MOVE_FLAIL, + MOVE_ENDURE, + MOVE_CURSE, + MOVE_TICKLE, + MOVE_WISH), + + egg_moves(OMANYTE, + MOVE_BUBBLE_BEAM, + MOVE_AURORA_BEAM, + MOVE_SLAM, + MOVE_SUPERSONIC, + MOVE_HAZE, + MOVE_ROCK_SLIDE, + MOVE_SPIKES), + + egg_moves(KABUTO, + MOVE_BUBBLE_BEAM, + MOVE_AURORA_BEAM, + MOVE_RAPID_SPIN, + MOVE_DIG, + MOVE_FLAIL, + MOVE_KNOCK_OFF, + MOVE_CONFUSE_RAY), + + egg_moves(AERODACTYL, + MOVE_WHIRLWIND, + MOVE_PURSUIT, + MOVE_FORESIGHT, + MOVE_STEEL_WING, + MOVE_DRAGON_BREATH, + MOVE_CURSE), + + egg_moves(SNORLAX, + MOVE_LICK, + MOVE_CHARM, + MOVE_DOUBLE_EDGE, + MOVE_CURSE, + MOVE_FISSURE, + MOVE_SUBSTITUTE), + + egg_moves(DRATINI, + MOVE_LIGHT_SCREEN, + MOVE_MIST, + MOVE_HAZE, + MOVE_SUPERSONIC, + MOVE_DRAGON_BREATH, + MOVE_DRAGON_DANCE), + + egg_moves(CHIKORITA, + MOVE_VINE_WHIP, + MOVE_LEECH_SEED, + MOVE_COUNTER, + MOVE_ANCIENT_POWER, + MOVE_FLAIL, + MOVE_NATURE_POWER, + MOVE_INGRAIN, + MOVE_GRASS_WHISTLE), + + egg_moves(CYNDAQUIL, + MOVE_FURY_SWIPES, + MOVE_QUICK_ATTACK, + MOVE_REVERSAL, + MOVE_THRASH, + MOVE_FORESIGHT, + MOVE_COVET, + MOVE_HOWL, + MOVE_CRUSH_CLAW), + + egg_moves(TOTODILE, + MOVE_CRUNCH, + MOVE_THRASH, + MOVE_HYDRO_PUMP, + MOVE_ANCIENT_POWER, + MOVE_ROCK_SLIDE, + MOVE_MUD_SPORT, + MOVE_WATER_SPORT, + MOVE_DRAGON_CLAW), + + egg_moves(SENTRET, + MOVE_DOUBLE_EDGE, + MOVE_PURSUIT, + MOVE_SLASH, + MOVE_FOCUS_ENERGY, + MOVE_REVERSAL, + MOVE_SUBSTITUTE, + MOVE_TRICK, + MOVE_ASSIST), + + egg_moves(HOOTHOOT, + MOVE_MIRROR_MOVE, + MOVE_SUPERSONIC, + MOVE_FAINT_ATTACK, + MOVE_WING_ATTACK, + MOVE_WHIRLWIND, + MOVE_SKY_ATTACK, + MOVE_FEATHER_DANCE), + + egg_moves(LEDYBA, + MOVE_PSYBEAM, + MOVE_BIDE, + MOVE_SILVER_WIND), + + egg_moves(SPINARAK, + MOVE_PSYBEAM, + MOVE_DISABLE, + MOVE_SONIC_BOOM, + MOVE_BATON_PASS, + MOVE_PURSUIT, + MOVE_SIGNAL_BEAM), + + egg_moves(CHINCHOU, + MOVE_FLAIL, + MOVE_SCREECH, + MOVE_AMNESIA), + + egg_moves(PICHU, + MOVE_REVERSAL, + MOVE_BIDE, + MOVE_PRESENT, + MOVE_ENCORE, + MOVE_DOUBLE_SLAP, + MOVE_WISH, + MOVE_CHARGE), + + egg_moves(CLEFFA, + MOVE_PRESENT, + MOVE_METRONOME, + MOVE_AMNESIA, + MOVE_BELLY_DRUM, + MOVE_SPLASH, + MOVE_MIMIC, + MOVE_WISH, + MOVE_SUBSTITUTE), + + egg_moves(IGGLYBUFF, + MOVE_PERISH_SONG, + MOVE_PRESENT, + MOVE_FAINT_ATTACK, + MOVE_WISH, + MOVE_FAKE_TEARS), + + egg_moves(TOGEPI, + MOVE_PRESENT, + MOVE_MIRROR_MOVE, + MOVE_PECK, + MOVE_FORESIGHT, + MOVE_FUTURE_SIGHT, + MOVE_SUBSTITUTE, + MOVE_PSYCH_UP), + + egg_moves(NATU, + MOVE_HAZE, + MOVE_DRILL_PECK, + MOVE_QUICK_ATTACK, + MOVE_FAINT_ATTACK, + MOVE_STEEL_WING, + MOVE_PSYCH_UP, + MOVE_FEATHER_DANCE, + MOVE_REFRESH), + + egg_moves(MAREEP, + MOVE_TAKE_DOWN, + MOVE_BODY_SLAM, + MOVE_SAFEGUARD, + MOVE_SCREECH, + MOVE_REFLECT, + MOVE_ODOR_SLEUTH, + MOVE_CHARGE), + + egg_moves(MARILL, + MOVE_LIGHT_SCREEN, + MOVE_PRESENT, + MOVE_AMNESIA, + MOVE_FUTURE_SIGHT, + MOVE_BELLY_DRUM, + MOVE_PERISH_SONG, + MOVE_SUPERSONIC, + MOVE_SUBSTITUTE), + + egg_moves(SUDOWOODO, + MOVE_SELF_DESTRUCT), + + egg_moves(HOPPIP, + MOVE_CONFUSION, + MOVE_ENCORE, + MOVE_DOUBLE_EDGE, + MOVE_REFLECT, + MOVE_AMNESIA, + MOVE_HELPING_HAND, + MOVE_PSYCH_UP), + + egg_moves(AIPOM, + MOVE_COUNTER, + MOVE_SCREECH, + MOVE_PURSUIT, + MOVE_AGILITY, + MOVE_SPITE, + MOVE_SLAM, + MOVE_DOUBLE_SLAP, + MOVE_BEAT_UP), + + egg_moves(SUNKERN, + MOVE_GRASS_WHISTLE, + MOVE_ENCORE, + MOVE_LEECH_SEED, + MOVE_NATURE_POWER, + MOVE_CURSE, + MOVE_HELPING_HAND), + + egg_moves(YANMA, + MOVE_WHIRLWIND, + MOVE_REVERSAL, + MOVE_LEECH_LIFE, + MOVE_SIGNAL_BEAM, + MOVE_SILVER_WIND), + + egg_moves(WOOPER, + MOVE_BODY_SLAM, + MOVE_ANCIENT_POWER, + MOVE_SAFEGUARD, + MOVE_CURSE, + MOVE_MUD_SPORT, + MOVE_STOCKPILE, + MOVE_SWALLOW, + MOVE_SPIT_UP), + + egg_moves(MURKROW, + MOVE_WHIRLWIND, + MOVE_DRILL_PECK, + MOVE_MIRROR_MOVE, + MOVE_WING_ATTACK, + MOVE_SKY_ATTACK, + MOVE_CONFUSE_RAY, + MOVE_FEATHER_DANCE, + MOVE_PERISH_SONG), + + egg_moves(MISDREAVUS, + MOVE_SCREECH, + MOVE_DESTINY_BOND, + MOVE_PSYCH_UP, + MOVE_IMPRISON), + + egg_moves(GIRAFARIG, + MOVE_TAKE_DOWN, + MOVE_AMNESIA, + MOVE_FORESIGHT, + MOVE_FUTURE_SIGHT, + MOVE_BEAT_UP, + MOVE_PSYCH_UP, + MOVE_WISH, + MOVE_MAGIC_COAT), + + egg_moves(PINECO, + MOVE_REFLECT, + MOVE_PIN_MISSILE, + MOVE_FLAIL, + MOVE_SWIFT, + MOVE_COUNTER, + MOVE_SAND_TOMB), + + egg_moves(DUNSPARCE, + MOVE_BIDE, + MOVE_ANCIENT_POWER, + MOVE_ROCK_SLIDE, + MOVE_BITE, + MOVE_HEADBUTT, + MOVE_ASTONISH, + MOVE_CURSE), + + egg_moves(GLIGAR, + MOVE_METAL_CLAW, + MOVE_WING_ATTACK, + MOVE_RAZOR_WIND, + MOVE_COUNTER, + MOVE_SAND_TOMB), + + egg_moves(SNUBBULL, + MOVE_METRONOME, + MOVE_FAINT_ATTACK, + MOVE_REFLECT, + MOVE_PRESENT, + MOVE_CRUNCH, + MOVE_HEAL_BELL, + MOVE_SNORE, + MOVE_SMELLING_SALT), + + egg_moves(QWILFISH, + MOVE_FLAIL, + MOVE_HAZE, + MOVE_BUBBLE_BEAM, + MOVE_SUPERSONIC, + MOVE_ASTONISH), + + egg_moves(SHUCKLE, + MOVE_SWEET_SCENT), + + egg_moves(HERACROSS, + MOVE_HARDEN, + MOVE_BIDE, + MOVE_FLAIL, + MOVE_FALSE_SWIPE), + + egg_moves(SNEASEL, + MOVE_COUNTER, + MOVE_SPITE, + MOVE_FORESIGHT, + MOVE_REFLECT, + MOVE_BITE, + MOVE_CRUSH_CLAW, + MOVE_FAKE_OUT), + + egg_moves(TEDDIURSA, + MOVE_CRUNCH, + MOVE_TAKE_DOWN, + MOVE_SEISMIC_TOSS, + MOVE_COUNTER, + MOVE_METAL_CLAW, + MOVE_FAKE_TEARS, + MOVE_YAWN, + MOVE_SLEEP_TALK), + + egg_moves(SLUGMA, + MOVE_ACID_ARMOR, + MOVE_HEAT_WAVE), + + egg_moves(SWINUB, + MOVE_TAKE_DOWN, + MOVE_BITE, + MOVE_BODY_SLAM, + MOVE_ROCK_SLIDE, + MOVE_ANCIENT_POWER, + MOVE_MUD_SHOT, + MOVE_ICICLE_SPEAR, + MOVE_DOUBLE_EDGE), + + egg_moves(CORSOLA, + MOVE_ROCK_SLIDE, + MOVE_SCREECH, + MOVE_MIST, + MOVE_AMNESIA, + MOVE_BARRIER, + MOVE_INGRAIN, + MOVE_CONFUSE_RAY, + MOVE_ICICLE_SPEAR), + + egg_moves(REMORAID, + MOVE_AURORA_BEAM, + MOVE_OCTAZOOKA, + MOVE_SUPERSONIC, + MOVE_HAZE, + MOVE_SCREECH, + MOVE_THUNDER_WAVE, + MOVE_ROCK_BLAST), + + egg_moves(DELIBIRD, + MOVE_AURORA_BEAM, + MOVE_QUICK_ATTACK, + MOVE_FUTURE_SIGHT, + MOVE_SPLASH, + MOVE_RAPID_SPIN, + MOVE_ICE_BALL), + + egg_moves(MANTINE, + MOVE_TWISTER, + MOVE_HYDRO_PUMP, + MOVE_HAZE, + MOVE_SLAM, + MOVE_MUD_SPORT, + MOVE_ROCK_SLIDE), + + egg_moves(SKARMORY, + MOVE_DRILL_PECK, + MOVE_PURSUIT, + MOVE_WHIRLWIND, + MOVE_SKY_ATTACK, + MOVE_CURSE), + + egg_moves(HOUNDOUR, + MOVE_FIRE_SPIN, + MOVE_RAGE, + MOVE_PURSUIT, + MOVE_COUNTER, + MOVE_SPITE, + MOVE_REVERSAL, + MOVE_BEAT_UP, + MOVE_WILL_O_WISP), + + egg_moves(PHANPY, + MOVE_FOCUS_ENERGY, + MOVE_BODY_SLAM, + MOVE_ANCIENT_POWER, + MOVE_SNORE, + MOVE_COUNTER, + MOVE_FISSURE), + + egg_moves(STANTLER, + MOVE_SPITE, + MOVE_DISABLE, + MOVE_BITE, + MOVE_SWAGGER, + MOVE_PSYCH_UP, + MOVE_EXTRASENSORY), + + egg_moves(TYROGUE, + MOVE_RAPID_SPIN, + MOVE_HI_JUMP_KICK, + MOVE_MACH_PUNCH, + MOVE_MIND_READER, + MOVE_HELPING_HAND), + + egg_moves(SMOOCHUM, + MOVE_MEDITATE, + MOVE_PSYCH_UP, + MOVE_FAKE_OUT, + MOVE_WISH, + MOVE_ICE_PUNCH), + + egg_moves(ELEKID, + MOVE_KARATE_CHOP, + MOVE_BARRIER, + MOVE_ROLLING_KICK, + MOVE_MEDITATE, + MOVE_CROSS_CHOP, + MOVE_FIRE_PUNCH, + MOVE_ICE_PUNCH), + + egg_moves(MAGBY, + MOVE_KARATE_CHOP, + MOVE_MEGA_PUNCH, + MOVE_BARRIER, + MOVE_SCREECH, + MOVE_CROSS_CHOP, + MOVE_THUNDER_PUNCH), + + egg_moves(MILTANK, + MOVE_PRESENT, + MOVE_REVERSAL, + MOVE_SEISMIC_TOSS, + MOVE_ENDURE, + MOVE_PSYCH_UP, + MOVE_CURSE, + MOVE_HELPING_HAND, + MOVE_SLEEP_TALK), + + egg_moves(LARVITAR, + MOVE_PURSUIT, + MOVE_STOMP, + MOVE_OUTRAGE, + MOVE_FOCUS_ENERGY, + MOVE_ANCIENT_POWER, + MOVE_DRAGON_DANCE, + MOVE_CURSE), + + egg_moves(TREECKO, + MOVE_CRUNCH, + MOVE_MUD_SPORT, + MOVE_ENDEAVOR, + MOVE_LEECH_SEED, + MOVE_DRAGON_BREATH, + MOVE_CRUSH_CLAW), + + egg_moves(TORCHIC, + MOVE_COUNTER, + MOVE_REVERSAL, + MOVE_ENDURE, + MOVE_SWAGGER, + MOVE_ROCK_SLIDE, + MOVE_SMELLING_SALT), + + egg_moves(MUDKIP, + MOVE_REFRESH, + MOVE_UPROAR, + MOVE_CURSE, + MOVE_STOMP, + MOVE_ICE_BALL, + MOVE_MIRROR_COAT), + + egg_moves(POOCHYENA, + MOVE_ASTONISH, + MOVE_POISON_FANG, + MOVE_COVET, + MOVE_LEER, + MOVE_YAWN), + + egg_moves(ZIGZAGOON, + MOVE_CHARM, + MOVE_PURSUIT, + MOVE_SUBSTITUTE, + MOVE_TICKLE, + MOVE_TRICK), + + egg_moves(LOTAD, + MOVE_SYNTHESIS, + MOVE_RAZOR_LEAF, + MOVE_SWEET_SCENT, + MOVE_LEECH_SEED, + MOVE_FLAIL, + MOVE_WATER_GUN), + + egg_moves(SEEDOT, + MOVE_LEECH_SEED, + MOVE_AMNESIA, + MOVE_QUICK_ATTACK, + MOVE_RAZOR_WIND, + MOVE_TAKE_DOWN, + MOVE_FALSE_SWIPE), + + egg_moves(NINCADA, + MOVE_ENDURE, + MOVE_FAINT_ATTACK, + MOVE_GUST, + MOVE_SILVER_WIND), + + egg_moves(TAILLOW, + MOVE_PURSUIT, + MOVE_SUPERSONIC, + MOVE_REFRESH, + MOVE_MIRROR_MOVE, + MOVE_RAGE, + MOVE_SKY_ATTACK), + + egg_moves(SHROOMISH, + MOVE_FAKE_TEARS, + MOVE_SWAGGER, + MOVE_CHARM, + MOVE_FALSE_SWIPE, + MOVE_HELPING_HAND), + + egg_moves(SPINDA, + MOVE_ENCORE, + MOVE_ROCK_SLIDE, + MOVE_ASSIST, + MOVE_DISABLE, + MOVE_BATON_PASS, + MOVE_WISH, + MOVE_TRICK, + MOVE_SMELLING_SALT), + + egg_moves(WINGULL, + MOVE_MIST, + MOVE_TWISTER, + MOVE_AGILITY, + MOVE_GUST, + MOVE_WATER_SPORT), + + egg_moves(SURSKIT, + MOVE_FORESIGHT, + MOVE_MUD_SHOT, + MOVE_PSYBEAM, + MOVE_HYDRO_PUMP, + MOVE_MIND_READER), + + egg_moves(WAILMER, + MOVE_DOUBLE_EDGE, + MOVE_THRASH, + MOVE_SWAGGER, + MOVE_SNORE, + MOVE_SLEEP_TALK, + MOVE_CURSE, + MOVE_FISSURE, + MOVE_TICKLE), + + egg_moves(SKITTY, + MOVE_HELPING_HAND, + MOVE_PSYCH_UP, + MOVE_UPROAR, + MOVE_FAKE_TEARS, + MOVE_WISH, + MOVE_BATON_PASS, + MOVE_SUBSTITUTE, + MOVE_TICKLE), + + egg_moves(KECLEON, + MOVE_DISABLE, + MOVE_MAGIC_COAT, + MOVE_TRICK), + + egg_moves(NOSEPASS, + MOVE_MAGNITUDE, + MOVE_ROLLOUT, + MOVE_EXPLOSION), + + egg_moves(TORKOAL, + MOVE_ERUPTION, + MOVE_ENDURE, + MOVE_SLEEP_TALK, + MOVE_YAWN), + + egg_moves(SABLEYE, + MOVE_PSYCH_UP, + MOVE_RECOVER, + MOVE_MOONLIGHT), + + egg_moves(BARBOACH, + MOVE_THRASH, + MOVE_WHIRLPOOL, + MOVE_SPARK), + + egg_moves(LUVDISC, + MOVE_SPLASH, + MOVE_SUPERSONIC, + MOVE_WATER_SPORT, + MOVE_MUD_SPORT), + + egg_moves(CORPHISH, + MOVE_MUD_SPORT, + MOVE_ENDEAVOR, + MOVE_BODY_SLAM, + MOVE_ANCIENT_POWER), + + egg_moves(FEEBAS, + MOVE_MIRROR_COAT, + MOVE_DRAGON_BREATH, + MOVE_MUD_SPORT, + MOVE_HYPNOSIS, + MOVE_LIGHT_SCREEN, + MOVE_CONFUSE_RAY), + + egg_moves(CARVANHA, + MOVE_HYDRO_PUMP, + MOVE_DOUBLE_EDGE, + MOVE_THRASH), + + egg_moves(TRAPINCH, + MOVE_FOCUS_ENERGY, + MOVE_QUICK_ATTACK, + MOVE_GUST), + + egg_moves(MAKUHITA, + MOVE_FAINT_ATTACK, + MOVE_DETECT, + MOVE_FORESIGHT, + MOVE_HELPING_HAND, + MOVE_CROSS_CHOP, + MOVE_REVENGE, + MOVE_DYNAMIC_PUNCH, + MOVE_COUNTER), + + egg_moves(ELECTRIKE, + MOVE_CRUNCH, + MOVE_HEADBUTT, + MOVE_UPROAR, + MOVE_CURSE, + MOVE_SWIFT), + + egg_moves(NUMEL, + MOVE_HOWL, + MOVE_SCARY_FACE, + MOVE_BODY_SLAM, + MOVE_ROLLOUT, + MOVE_DEFENSE_CURL, + MOVE_STOMP), + + egg_moves(SPHEAL, + MOVE_WATER_SPORT, + MOVE_STOCKPILE, + MOVE_SWALLOW, + MOVE_SPIT_UP, + MOVE_YAWN, + MOVE_ROCK_SLIDE, + MOVE_CURSE, + MOVE_FISSURE), + + egg_moves(CACNEA, + MOVE_GRASS_WHISTLE, + MOVE_ACID, + MOVE_TEETER_DANCE, + MOVE_DYNAMIC_PUNCH, + MOVE_COUNTER), + + egg_moves(SNORUNT, + MOVE_BLOCK, + MOVE_SPIKES), + + egg_moves(AZURILL, + MOVE_ENCORE, + MOVE_SING, + MOVE_REFRESH, + MOVE_SLAM, + MOVE_TICKLE), + + egg_moves(SPOINK, + MOVE_FUTURE_SIGHT, + MOVE_EXTRASENSORY, + MOVE_SUBSTITUTE, + MOVE_TRICK), + + egg_moves(PLUSLE, + MOVE_SUBSTITUTE, + MOVE_WISH), + + egg_moves(MINUN, + MOVE_SUBSTITUTE, + MOVE_WISH), + + egg_moves(MAWILE, + MOVE_SWORDS_DANCE, + MOVE_FALSE_SWIPE, + MOVE_POISON_FANG, + MOVE_PSYCH_UP, + MOVE_ANCIENT_POWER, + MOVE_TICKLE), + + egg_moves(MEDITITE, + MOVE_FIRE_PUNCH, + MOVE_THUNDER_PUNCH, + MOVE_ICE_PUNCH, + MOVE_FORESIGHT, + MOVE_FAKE_OUT, + MOVE_BATON_PASS, + MOVE_DYNAMIC_PUNCH), + + egg_moves(SWABLU, + MOVE_AGILITY, + MOVE_HAZE, + MOVE_PURSUIT, + MOVE_RAGE), + + egg_moves(DUSKULL, + MOVE_IMPRISON, + MOVE_DESTINY_BOND, + MOVE_PAIN_SPLIT, + MOVE_GRUDGE, + MOVE_MEMENTO, + MOVE_FAINT_ATTACK), + + egg_moves(ROSELIA, + MOVE_SPIKES, + MOVE_SYNTHESIS, + MOVE_PIN_MISSILE, + MOVE_COTTON_SPORE), + + egg_moves(SLAKOTH, + MOVE_PURSUIT, + MOVE_SLASH, + MOVE_BODY_SLAM, + MOVE_SNORE, + MOVE_CRUSH_CLAW, + MOVE_CURSE, + MOVE_SLEEP_TALK), + + egg_moves(GULPIN, + MOVE_DREAM_EATER, + MOVE_ACID_ARMOR, + MOVE_SMOG, + MOVE_PAIN_SPLIT), + + egg_moves(TROPIUS, + MOVE_HEADBUTT, + MOVE_SLAM, + MOVE_RAZOR_WIND, + MOVE_LEECH_SEED, + MOVE_NATURE_POWER), + + egg_moves(WHISMUR, + MOVE_TAKE_DOWN, + MOVE_SNORE, + MOVE_SWAGGER, + MOVE_EXTRASENSORY, + MOVE_SMELLING_SALT), + + egg_moves(CLAMPERL, + MOVE_REFRESH, + MOVE_MUD_SPORT, + MOVE_BODY_SLAM, + MOVE_SUPERSONIC, + MOVE_BARRIER, + MOVE_CONFUSE_RAY), + + egg_moves(ABSOL, + MOVE_BATON_PASS, + MOVE_FAINT_ATTACK, + MOVE_DOUBLE_EDGE, + MOVE_MAGIC_COAT, + MOVE_CURSE, + MOVE_SUBSTITUTE), + + egg_moves(SHUPPET, + MOVE_DISABLE, + MOVE_DESTINY_BOND, + MOVE_FORESIGHT, + MOVE_ASTONISH, + MOVE_IMPRISON), + + egg_moves(SEVIPER, + MOVE_STOCKPILE, + MOVE_SWALLOW, + MOVE_SPIT_UP, + MOVE_BODY_SLAM), + + egg_moves(ZANGOOSE, + MOVE_FLAIL, + MOVE_DOUBLE_KICK, + MOVE_RAZOR_WIND, + MOVE_COUNTER, + MOVE_ROAR, + MOVE_CURSE), + + egg_moves(RELICANTH, + MOVE_MAGNITUDE, + MOVE_SKULL_BASH, + MOVE_WATER_SPORT, + MOVE_AMNESIA, + MOVE_SLEEP_TALK, + MOVE_ROCK_SLIDE), + + egg_moves(ARON, + MOVE_ENDEAVOR, + MOVE_BODY_SLAM, + MOVE_STOMP, + MOVE_SMELLING_SALT), + + egg_moves(CASTFORM, + MOVE_FUTURE_SIGHT, + MOVE_PSYCH_UP), + + egg_moves(VOLBEAT, + MOVE_BATON_PASS, + MOVE_SILVER_WIND, + MOVE_TRICK), + + egg_moves(ILLUMISE, + MOVE_BATON_PASS, + MOVE_SILVER_WIND, + MOVE_GROWTH), + + egg_moves(LILEEP, + MOVE_BARRIER, + MOVE_RECOVER, + MOVE_MIRROR_COAT, + MOVE_ROCK_SLIDE), + + egg_moves(ANORITH, + MOVE_RAPID_SPIN, + MOVE_KNOCK_OFF, + MOVE_SWORDS_DANCE, + MOVE_ROCK_SLIDE), + + egg_moves(RALTS, + MOVE_DISABLE, + MOVE_WILL_O_WISP, + MOVE_MEAN_LOOK, + MOVE_MEMENTO, + MOVE_DESTINY_BOND), + + egg_moves(BAGON, + MOVE_HYDRO_PUMP, + MOVE_THRASH, + MOVE_DRAGON_RAGE, + MOVE_TWISTER, + MOVE_DRAGON_DANCE), + + egg_moves(CHIMECHO, + MOVE_DISABLE, + MOVE_CURSE, + MOVE_HYPNOSIS, + MOVE_DREAM_EATER), + + 0xFFFF +}; diff --git a/src/data/pokemon/evolution.h b/src/data/pokemon/evolution.h new file mode 100644 index 000000000..919416fee --- /dev/null +++ b/src/data/pokemon/evolution.h @@ -0,0 +1,608 @@ +// + +// + +#ifndef POKERUBY_EVOLUTION_H +#define POKERUBY_EVOLUTION_H + +const struct EvolutionData gEvolutionTable[] = { + {{ // ?????????? + }}, {{ // Bulbasaur + {EVO_LEVEL, 16, SPECIES_IVYSAUR}, + }}, {{ // Ivysaur + {EVO_LEVEL, 32, SPECIES_VENUSAUR}, + }}, {{ // Venusaur + }}, {{ // Charmander + {EVO_LEVEL, 16, SPECIES_CHARMELEON}, + }}, {{ // Charmeleon + {EVO_LEVEL, 36, SPECIES_CHARIZARD}, + }}, {{ // Charizard + }}, {{ // Squirtle + {EVO_LEVEL, 16, SPECIES_WARTORTLE}, + }}, {{ // Wartortle + {EVO_LEVEL, 36, SPECIES_BLASTOISE}, + }}, {{ // Blastoise + }}, {{ // Caterpie + {EVO_LEVEL, 7, SPECIES_METAPOD}, + }}, {{ // Metapod + {EVO_LEVEL, 10, SPECIES_BUTTERFREE}, + }}, {{ // Butterfree + }}, {{ // Weedle + {EVO_LEVEL, 7, SPECIES_KAKUNA}, + }}, {{ // Kakuna + {EVO_LEVEL, 10, SPECIES_BEEDRILL}, + }}, {{ // Beedrill + }}, {{ // Pidgey + {EVO_LEVEL, 18, SPECIES_PIDGEOTTO}, + }}, {{ // Pidgeotto + {EVO_LEVEL, 36, SPECIES_PIDGEOT}, + }}, {{ // Pidgeot + }}, {{ // Rattata + {EVO_LEVEL, 20, SPECIES_RATICATE}, + }}, {{ // Raticate + }}, {{ // Spearow + {EVO_LEVEL, 20, SPECIES_FEAROW}, + }}, {{ // Fearow + }}, {{ // Ekans + {EVO_LEVEL, 22, SPECIES_ARBOK}, + }}, {{ // Arbok + }}, {{ // Pikachu + {EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_RAICHU}, + }}, {{ // Raichu + }}, {{ // Sandshrew + {EVO_LEVEL, 22, SPECIES_SANDSLASH}, + }}, {{ // Sandslash + }}, {{ // Nidoran♀ + {EVO_LEVEL, 16, SPECIES_NIDORINA}, + }}, {{ // Nidorina + {EVO_ITEM, ITEM_MOON_STONE, SPECIES_NIDOQUEEN}, + }}, {{ // Nidoqueen + }}, {{ // Nidoran♂ + {EVO_LEVEL, 16, SPECIES_NIDORINO}, + }}, {{ // Nidorino + {EVO_ITEM, ITEM_MOON_STONE, SPECIES_NIDOKING}, + }}, {{ // Nidoking + }}, {{ // Clefairy + {EVO_ITEM, ITEM_MOON_STONE, SPECIES_CLEFABLE}, + }}, {{ // Clefable + }}, {{ // Vulpix + {EVO_ITEM, ITEM_FIRE_STONE, SPECIES_NINETALES}, + }}, {{ // Ninetales + }}, {{ // Jigglypuff + {EVO_ITEM, ITEM_MOON_STONE, SPECIES_WIGGLYTUFF}, + }}, {{ // Wigglytuff + }}, {{ // Zubat + {EVO_LEVEL, 22, SPECIES_GOLBAT}, + }}, {{ // Golbat + {EVO_FRIENDSHIP, 0, SPECIES_CROBAT}, + }}, {{ // Oddish + {EVO_LEVEL, 21, SPECIES_GLOOM}, + }}, {{ // Gloom + {EVO_ITEM, ITEM_LEAF_STONE, SPECIES_VILEPLUME}, + {EVO_ITEM, ITEM_SUN_STONE, SPECIES_BELLOSSOM}, + }}, {{ // Vileplume + }}, {{ // Paras + {EVO_LEVEL, 24, SPECIES_PARASECT}, + }}, {{ // Parasect + }}, {{ // Venonat + {EVO_LEVEL, 31, SPECIES_VENOMOTH}, + }}, {{ // Venomoth + }}, {{ // Diglett + {EVO_LEVEL, 26, SPECIES_DUGTRIO}, + }}, {{ // Dugtrio + }}, {{ // Meowth + {EVO_LEVEL, 28, SPECIES_PERSIAN}, + }}, {{ // Persian + }}, {{ // Psyduck + {EVO_LEVEL, 33, SPECIES_GOLDUCK}, + }}, {{ // Golduck + }}, {{ // Mankey + {EVO_LEVEL, 28, SPECIES_PRIMEAPE}, + }}, {{ // Primeape + }}, {{ // Growlithe + {EVO_ITEM, ITEM_FIRE_STONE, SPECIES_ARCANINE}, + }}, {{ // Arcanine + }}, {{ // Poliwag + {EVO_LEVEL, 25, SPECIES_POLIWHIRL}, + }}, {{ // Poliwhirl + {EVO_ITEM, ITEM_WATER_STONE, SPECIES_POLIWRATH}, + {EVO_TRADE_ITEM, ITEM_KINGS_ROCK, SPECIES_POLITOED}, + }}, {{ // Poliwrath + }}, {{ // Abra + {EVO_LEVEL, 16, SPECIES_KADABRA}, + }}, {{ // Kadabra + {EVO_TRADE, 0, SPECIES_ALAKAZAM}, + }}, {{ // Alakazam + }}, {{ // Machop + {EVO_LEVEL, 28, SPECIES_MACHOKE}, + }}, {{ // Machoke + {EVO_TRADE, 0, SPECIES_MACHAMP}, + }}, {{ // Machamp + }}, {{ // Bellsprout + {EVO_LEVEL, 21, SPECIES_WEEPINBELL}, + }}, {{ // Weepinbell + {EVO_ITEM, ITEM_LEAF_STONE, SPECIES_VICTREEBEL}, + }}, {{ // Victreebel + }}, {{ // Tentacool + {EVO_LEVEL, 30, SPECIES_TENTACRUEL}, + }}, {{ // Tentacruel + }}, {{ // Geodude + {EVO_LEVEL, 25, SPECIES_GRAVELER}, + }}, {{ // Graveler + {EVO_TRADE, 0, SPECIES_GOLEM}, + }}, {{ // Golem + }}, {{ // Ponyta + {EVO_LEVEL, 40, SPECIES_RAPIDASH}, + }}, {{ // Rapidash + }}, {{ // Slowpoke + {EVO_LEVEL, 37, SPECIES_SLOWBRO}, + {EVO_TRADE_ITEM, ITEM_KINGS_ROCK, SPECIES_SLOWKING}, + }}, {{ // Slowbro + }}, {{ // Magnemite + {EVO_LEVEL, 30, SPECIES_MAGNETON}, + }}, {{ // Magneton + }}, {{ // Farfetch'd + }}, {{ // Doduo + {EVO_LEVEL, 31, SPECIES_DODRIO}, + }}, {{ // Dodrio + }}, {{ // Seel + {EVO_LEVEL, 34, SPECIES_DEWGONG}, + }}, {{ // Dewgong + }}, {{ // Grimer + {EVO_LEVEL, 38, SPECIES_MUK}, + }}, {{ // Muk + }}, {{ // Shellder + {EVO_ITEM, ITEM_WATER_STONE, SPECIES_CLOYSTER}, + }}, {{ // Cloyster + }}, {{ // Gastly + {EVO_LEVEL, 25, SPECIES_HAUNTER}, + }}, {{ // Haunter + {EVO_TRADE, 0, SPECIES_GENGAR}, + }}, {{ // Gengar + }}, {{ // Onix + {EVO_TRADE_ITEM, ITEM_METAL_COAT, SPECIES_STEELIX}, + }}, {{ // Drowzee + {EVO_LEVEL, 26, SPECIES_HYPNO}, + }}, {{ // Hypno + }}, {{ // Krabby + {EVO_LEVEL, 28, SPECIES_KINGLER}, + }}, {{ // Kingler + }}, {{ // Voltorb + {EVO_LEVEL, 30, SPECIES_ELECTRODE}, + }}, {{ // Electrode + }}, {{ // Exeggcute + {EVO_ITEM, ITEM_LEAF_STONE, SPECIES_EXEGGUTOR}, + }}, {{ // Exeggutor + }}, {{ // Cubone + {EVO_LEVEL, 28, SPECIES_MAROWAK}, + }}, {{ // Marowak + }}, {{ // Hitmonlee + }}, {{ // Hitmonchan + }}, {{ // Lickitung + }}, {{ // Koffing + {EVO_LEVEL, 35, SPECIES_WEEZING}, + }}, {{ // Weezing + }}, {{ // Rhyhorn + {EVO_LEVEL, 42, SPECIES_RHYDON}, + }}, {{ // Rhydon + }}, {{ // Chansey + {EVO_FRIENDSHIP, 0, SPECIES_BLISSEY}, + }}, {{ // Tangela + }}, {{ // Kangaskhan + }}, {{ // Horsea + {EVO_LEVEL, 32, SPECIES_SEADRA}, + }}, {{ // Seadra + {EVO_TRADE_ITEM, ITEM_DRAGON_SCALE, SPECIES_KINGDRA}, + }}, {{ // Goldeen + {EVO_LEVEL, 33, SPECIES_SEAKING}, + }}, {{ // Seaking + }}, {{ // Staryu + {EVO_ITEM, ITEM_WATER_STONE, SPECIES_STARMIE}, + }}, {{ // Starmie + }}, {{ // Mr. mime + }}, {{ // Scyther + {EVO_TRADE_ITEM, ITEM_METAL_COAT, SPECIES_SCIZOR}, + }}, {{ // Jynx + }}, {{ // Electabuzz + }}, {{ // Magmar + }}, {{ // Pinsir + }}, {{ // Tauros + }}, {{ // Magikarp + {EVO_LEVEL, 20, SPECIES_GYARADOS}, + }}, {{ // Gyarados + }}, {{ // Lapras + }}, {{ // Ditto + }}, {{ // Eevee + {EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_JOLTEON}, + {EVO_ITEM, ITEM_WATER_STONE, SPECIES_VAPOREON}, + {EVO_ITEM, ITEM_FIRE_STONE, SPECIES_FLAREON}, + {EVO_FRIENDSHIP_DAY, 0, SPECIES_ESPEON}, + {EVO_FRIENDSHIP_NIGHT, 0, SPECIES_UMBREON}, + }}, {{ // Vaporeon + }}, {{ // Jolteon + }}, {{ // Flareon + }}, {{ // Porygon + {EVO_TRADE_ITEM, ITEM_UP_GRADE, SPECIES_PORYGON2}, + }}, {{ // Omanyte + {EVO_LEVEL, 40, SPECIES_OMASTAR}, + }}, {{ // Omastar + }}, {{ // Kabuto + {EVO_LEVEL, 40, SPECIES_KABUTOPS}, + }}, {{ // Kabutops + }}, {{ // Aerodactyl + }}, {{ // Snorlax + }}, {{ // Articuno + }}, {{ // Zapdos + }}, {{ // Moltres + }}, {{ // Dratini + {EVO_LEVEL, 30, SPECIES_DRAGONAIR}, + }}, {{ // Dragonair + {EVO_LEVEL, 55, SPECIES_DRAGONITE}, + }}, {{ // Dragonite + }}, {{ // Mewtwo + }}, {{ // Mew + }}, {{ // Chikorita + {EVO_LEVEL, 16, SPECIES_BAYLEEF}, + }}, {{ // Bayleef + {EVO_LEVEL, 32, SPECIES_MEGANIUM}, + }}, {{ // Meganium + }}, {{ // Cyndaquil + {EVO_LEVEL, 14, SPECIES_QUILAVA}, + }}, {{ // Quilava + {EVO_LEVEL, 36, SPECIES_TYPHLOSION}, + }}, {{ // Typhlosion + }}, {{ // Totodile + {EVO_LEVEL, 18, SPECIES_CROCONAW}, + }}, {{ // Croconaw + {EVO_LEVEL, 30, SPECIES_FERALIGATR}, + }}, {{ // Feraligatr + }}, {{ // Sentret + {EVO_LEVEL, 15, SPECIES_FURRET}, + }}, {{ // Furret + }}, {{ // Hoothoot + {EVO_LEVEL, 20, SPECIES_NOCTOWL}, + }}, {{ // Noctowl + }}, {{ // Ledyba + {EVO_LEVEL, 18, SPECIES_LEDIAN}, + }}, {{ // Ledian + }}, {{ // Spinarak + {EVO_LEVEL, 22, SPECIES_ARIADOS}, + }}, {{ // Ariados + }}, {{ // Crobat + }}, {{ // Chinchou + {EVO_LEVEL, 27, SPECIES_LANTURN}, + }}, {{ // Lanturn + }}, {{ // Pichu + {EVO_FRIENDSHIP, 0, SPECIES_PIKACHU}, + }}, {{ // Cleffa + {EVO_FRIENDSHIP, 0, SPECIES_CLEFAIRY}, + }}, {{ // Igglybuff + {EVO_FRIENDSHIP, 0, SPECIES_JIGGLYPUFF}, + }}, {{ // Togepi + {EVO_FRIENDSHIP, 0, SPECIES_TOGETIC}, + }}, {{ // Togetic + }}, {{ // Natu + {EVO_LEVEL, 25, SPECIES_XATU}, + }}, {{ // Xatu + }}, {{ // Mareep + {EVO_LEVEL, 15, SPECIES_FLAAFFY}, + }}, {{ // Flaaffy + {EVO_LEVEL, 30, SPECIES_AMPHAROS}, + }}, {{ // Ampharos + }}, {{ // Bellossom + }}, {{ // Marill + {EVO_LEVEL, 18, SPECIES_AZUMARILL}, + }}, {{ // Azumarill + }}, {{ // Sudowoodo + }}, {{ // Politoed + }}, {{ // Hoppip + {EVO_LEVEL, 18, SPECIES_SKIPLOOM}, + }}, {{ // Skiploom + {EVO_LEVEL, 27, SPECIES_JUMPLUFF}, + }}, {{ // Jumpluff + }}, {{ // Aipom + }}, {{ // Sunkern + {EVO_ITEM, ITEM_SUN_STONE, SPECIES_SUNFLORA}, + }}, {{ // Sunflora + }}, {{ // Yanma + }}, {{ // Wooper + {EVO_LEVEL, 20, SPECIES_QUAGSIRE}, + }}, {{ // Quagsire + }}, {{ // Espeon + }}, {{ // Umbreon + }}, {{ // Murkrow + }}, {{ // Slowking + }}, {{ // Misdreavus + }}, {{ // Unown + }}, {{ // Wobbuffet + }}, {{ // Girafarig + }}, {{ // Pineco + {EVO_LEVEL, 31, SPECIES_FORRETRESS}, + }}, {{ // Forretress + }}, {{ // Dunsparce + }}, {{ // Gligar + }}, {{ // Steelix + }}, {{ // Snubbull + {EVO_LEVEL, 23, SPECIES_GRANBULL}, + }}, {{ // Granbull + }}, {{ // Qwilfish + }}, {{ // Scizor + }}, {{ // Shuckle + }}, {{ // Heracross + }}, {{ // Sneasel + }}, {{ // Teddiursa + {EVO_LEVEL, 30, SPECIES_URSARING}, + }}, {{ // Ursaring + }}, {{ // Slugma + {EVO_LEVEL, 38, SPECIES_MAGCARGO}, + }}, {{ // Magcargo + }}, {{ // Swinub + {EVO_LEVEL, 33, SPECIES_PILOSWINE}, + }}, {{ // Piloswine + }}, {{ // Corsola + }}, {{ // Remoraid + {EVO_LEVEL, 25, SPECIES_OCTILLERY}, + }}, {{ // Octillery + }}, {{ // Delibird + }}, {{ // Mantine + }}, {{ // Skarmory + }}, {{ // Houndour + {EVO_LEVEL, 24, SPECIES_HOUNDOOM}, + }}, {{ // Houndoom + }}, {{ // Kingdra + }}, {{ // Phanpy + {EVO_LEVEL, 25, SPECIES_DONPHAN}, + }}, {{ // Donphan + }}, {{ // Porygon2 + }}, {{ // Stantler + }}, {{ // Smeargle + }}, {{ // Tyrogue + {EVO_LEVEL_ATK_LT_DEF, 20, SPECIES_HITMONCHAN}, + {EVO_LEVEL_ATK_GT_DEF, 20, SPECIES_HITMONLEE}, + {EVO_LEVEL_ATK_EQ_DEF, 20, SPECIES_HITMONTOP}, + }}, {{ // Hitmontop + }}, {{ // Smoochum + {EVO_LEVEL, 30, SPECIES_JYNX}, + }}, {{ // Elekid + {EVO_LEVEL, 30, SPECIES_ELECTABUZZ}, + }}, {{ // Magby + {EVO_LEVEL, 30, SPECIES_MAGMAR}, + }}, {{ // Miltank + }}, {{ // Blissey + }}, {{ // Raikou + }}, {{ // Entei + }}, {{ // Suicune + }}, {{ // Larvitar + {EVO_LEVEL, 30, SPECIES_PUPITAR}, + }}, {{ // Pupitar + {EVO_LEVEL, 55, SPECIES_TYRANITAR}, + }}, {{ // Tyranitar + }}, {{ // Lugia + }}, {{ // Ho-Oh + }}, {{ // Celebi + }}, {{ // ? + }}, {{ // ? + }}, {{ // ? + }}, {{ // ? + }}, {{ // ? + }}, {{ // ? + }}, {{ // ? + }}, {{ // ? + }}, {{ // ? + }}, {{ // ? + }}, {{ // ? + }}, {{ // ? + }}, {{ // ? + }}, {{ // ? + }}, {{ // ? + }}, {{ // ? + }}, {{ // ? + }}, {{ // ? + }}, {{ // ? + }}, {{ // ? + }}, {{ // ? + }}, {{ // ? + }}, {{ // ? + }}, {{ // ? + }}, {{ // ? + }}, {{ // Treecko + {EVO_LEVEL, 16, SPECIES_GROVYLE}, + }}, {{ // Grovyle + {EVO_LEVEL, 36, SPECIES_SCEPTILE}, + }}, {{ // Sceptile + }}, {{ // Torchic + {EVO_LEVEL, 16, SPECIES_COMBUSKEN}, + }}, {{ // Combusken + {EVO_LEVEL, 36, SPECIES_BLAZIKEN}, + }}, {{ // Blaziken + }}, {{ // Mudkip + {EVO_LEVEL, 16, SPECIES_MARSHTOMP}, + }}, {{ // Marshtomp + {EVO_LEVEL, 36, SPECIES_SWAMPERT}, + }}, {{ // Swampert + }}, {{ // Poochyena + {EVO_LEVEL, 18, SPECIES_MIGHTYENA}, + }}, {{ // Mightyena + }}, {{ // Zigzagoon + {EVO_LEVEL, 20, SPECIES_LINOONE}, + }}, {{ // Linoone + }}, {{ // Wurmple + {EVO_LEVEL_SILCOON, 7, SPECIES_SILCOON}, + {EVO_LEVEL_CASCOON, 7, SPECIES_CASCOON}, + }}, {{ // Silcoon + {EVO_LEVEL, 10, SPECIES_BEAUTIFLY}, + }}, {{ // Beautifly + }}, {{ // Cascoon + {EVO_LEVEL, 10, SPECIES_DUSTOX}, + }}, {{ // Dustox + }}, {{ // Lotad + {EVO_LEVEL, 14, SPECIES_LOMBRE}, + }}, {{ // Lombre + {EVO_ITEM, ITEM_WATER_STONE, SPECIES_LUDICOLO}, + }}, {{ // Ludicolo + }}, {{ // Seedot + {EVO_LEVEL, 14, SPECIES_NUZLEAF}, + }}, {{ // Nuzleaf + {EVO_ITEM, ITEM_LEAF_STONE, SPECIES_SHIFTRY}, + }}, {{ // Shiftry + }}, {{ // Nincada + {EVO_LEVEL_NINJASK, 20, SPECIES_NINJASK}, + {EVO_LEVEL_SHEDINJA, 20, SPECIES_SHEDINJA}, + }}, {{ // Ninjask + }}, {{ // Shedinja + }}, {{ // Taillow + {EVO_LEVEL, 22, SPECIES_SWELLOW}, + }}, {{ // Swellow + }}, {{ // Shroomish + {EVO_LEVEL, 23, SPECIES_BRELOOM}, + }}, {{ // Breloom + }}, {{ // Spinda + }}, {{ // Wingull + {EVO_LEVEL, 25, SPECIES_PELIPPER}, + }}, {{ // Pelipper + }}, {{ // Surskit + {EVO_LEVEL, 22, SPECIES_MASQUERAIN}, + }}, {{ // Masquerain + }}, {{ // Wailmer + {EVO_LEVEL, 40, SPECIES_WAILORD}, + }}, {{ // Wailord + }}, {{ // Skitty + {EVO_ITEM, ITEM_MOON_STONE, SPECIES_DELCATTY}, + }}, {{ // Delcatty + }}, {{ // Kecleon + }}, {{ // Baltoy + {EVO_LEVEL, 36, SPECIES_CLAYDOL}, + }}, {{ // Claydol + }}, {{ // Nosepass + }}, {{ // Torkoal + }}, {{ // Sableye + }}, {{ // Barboach + {EVO_LEVEL, 30, SPECIES_WHISCASH}, + }}, {{ // Whiscash + }}, {{ // Luvdisc + }}, {{ // Corphish + {EVO_LEVEL, 30, SPECIES_CRAWDAUNT}, + }}, {{ // Crawdaunt + }}, {{ // Feebas + {EVO_BEAUTY, 170, SPECIES_MILOTIC}, + }}, {{ // Milotic + }}, {{ // Carvanha + {EVO_LEVEL, 30, SPECIES_SHARPEDO}, + }}, {{ // Sharpedo + }}, {{ // Trapinch + {EVO_LEVEL, 35, SPECIES_VIBRAVA}, + }}, {{ // Vibrava + {EVO_LEVEL, 45, SPECIES_FLYGON}, + }}, {{ // Flygon + }}, {{ // Makuhita + {EVO_LEVEL, 24, SPECIES_HARIYAMA}, + }}, {{ // Hariyama + }}, {{ // Electrike + {EVO_LEVEL, 26, SPECIES_MANECTRIC}, + }}, {{ // Manectric + }}, {{ // Numel + {EVO_LEVEL, 33, SPECIES_CAMERUPT}, + }}, {{ // Camerupt + }}, {{ // Spheal + {EVO_LEVEL, 32, SPECIES_SEALEO}, + }}, {{ // Sealeo + {EVO_LEVEL, 44, SPECIES_WALREIN}, + }}, {{ // Walrein + }}, {{ // Cacnea + {EVO_LEVEL, 32, SPECIES_CACTURNE}, + }}, {{ // Cacturne + }}, {{ // Snorunt + {EVO_LEVEL, 42, SPECIES_GLALIE}, + }}, {{ // Glalie + }}, {{ // Lunatone + }}, {{ // Solrock + }}, {{ // Azurill + {EVO_FRIENDSHIP, 0, SPECIES_MARILL}, + }}, {{ // Spoink + {EVO_LEVEL, 32, SPECIES_GRUMPIG}, + }}, {{ // Grumpig + }}, {{ // Plusle + }}, {{ // Minun + }}, {{ // Mawile + }}, {{ // Meditite + {EVO_LEVEL, 37, SPECIES_MEDICHAM}, + }}, {{ // Medicham + }}, {{ // Swablu + {EVO_LEVEL, 35, SPECIES_ALTARIA}, + }}, {{ // Altaria + }}, {{ // Wynaut + {EVO_LEVEL, 15, SPECIES_WOBBUFFET}, + }}, {{ // Duskull + {EVO_LEVEL, 37, SPECIES_DUSCLOPS}, + }}, {{ // Dusclops + }}, {{ // Roselia + }}, {{ // Slakoth + {EVO_LEVEL, 18, SPECIES_VIGOROTH}, + }}, {{ // Vigoroth + {EVO_LEVEL, 36, SPECIES_SLAKING}, + }}, {{ // Slaking + }}, {{ // Gulpin + {EVO_LEVEL, 26, SPECIES_SWALOT}, + }}, {{ // Swalot + }}, {{ // Tropius + }}, {{ // Whismur + {EVO_LEVEL, 20, SPECIES_LOUDRED}, + }}, {{ // Loudred + {EVO_LEVEL, 40, SPECIES_EXPLOUD}, + }}, {{ // Exploud + }}, {{ // Clamperl + {EVO_TRADE_ITEM, ITEM_DEEP_SEA_TOOTH, SPECIES_HUNTAIL}, + {EVO_TRADE_ITEM, ITEM_DEEP_SEA_SCALE, SPECIES_GOREBYSS}, + }}, {{ // Huntail + }}, {{ // Gorebyss + }}, {{ // Absol + }}, {{ // Shuppet + {EVO_LEVEL, 37, SPECIES_BANETTE}, + }}, {{ // Banette + }}, {{ // Seviper + }}, {{ // Zangoose + }}, {{ // Relicanth + }}, {{ // Aron + {EVO_LEVEL, 32, SPECIES_LAIRON}, + }}, {{ // Lairon + {EVO_LEVEL, 42, SPECIES_AGGRON}, + }}, {{ // Aggron + }}, {{ // Castform + }}, {{ // Volbeat + }}, {{ // Illumise + }}, {{ // Lileep + {EVO_LEVEL, 40, SPECIES_CRADILY}, + }}, {{ // Cradily + }}, {{ // Anorith + {EVO_LEVEL, 40, SPECIES_ARMALDO}, + }}, {{ // Armaldo + }}, {{ // Ralts + {EVO_LEVEL, 20, SPECIES_KIRLIA}, + }}, {{ // Kirlia + {EVO_LEVEL, 30, SPECIES_GARDEVOIR}, + }}, {{ // Gardevoir + }}, {{ // Bagon + {EVO_LEVEL, 30, SPECIES_SHELGON}, + }}, {{ // Shelgon + {EVO_LEVEL, 50, SPECIES_SALAMENCE}, + }}, {{ // Salamence + }}, {{ // Beldum + {EVO_LEVEL, 20, SPECIES_METANG}, + }}, {{ // Metang + {EVO_LEVEL, 45, SPECIES_METAGROSS}, + }}, {{ // Metagross + }}, {{ // Regirock + }}, {{ // Regice + }}, {{ // Registeel + }}, {{ // Kyogre + }}, {{ // Groudon + }}, {{ // Rayquaza + }}, {{ // Latias + }}, {{ // Latios + }}, {{ // Jirachi + }}, {{ // Deoxys + }}, {{ // Chimecho + }} +}; + +#endif //POKERUBY_EVOLUTION_H diff --git a/src/data/pokemon/experience_tables.h b/src/data/pokemon/experience_tables.h new file mode 100644 index 000000000..2fb416fe9 --- /dev/null +++ b/src/data/pokemon/experience_tables.h @@ -0,0 +1,828 @@ +// + +// + +#ifndef POKERUBY_EXPERIENCE_TABLES_H +#define POKERUBY_EXPERIENCE_TABLES_H + +const u32 gExperienceTables[][101] = { + { // Medium Fast + 0, // 0 + 1, // 1 + 8, // 2 + 27, // 3 + 64, // 4 + 125, // 5 + 216, // 6 + 343, // 7 + 512, // 8 + 729, // 9 + 1000, // 10 + 1331, // 11 + 1728, // 12 + 2197, // 13 + 2744, // 14 + 3375, // 15 + 4096, // 16 + 4913, // 17 + 5832, // 18 + 6859, // 19 + 8000, // 20 + 9261, // 21 + 10648, // 22 + 12167, // 23 + 13824, // 24 + 15625, // 25 + 17576, // 26 + 19683, // 27 + 21952, // 28 + 24389, // 29 + 27000, // 30 + 29791, // 31 + 32768, // 32 + 35937, // 33 + 39304, // 34 + 42875, // 35 + 46656, // 36 + 50653, // 37 + 54872, // 38 + 59319, // 39 + 64000, // 40 + 68921, // 41 + 74088, // 42 + 79507, // 43 + 85184, // 44 + 91125, // 45 + 97336, // 46 + 103823, // 47 + 110592, // 48 + 117649, // 49 + 125000, // 50 + 132651, // 51 + 140608, // 52 + 148877, // 53 + 157464, // 54 + 166375, // 55 + 175616, // 56 + 185193, // 57 + 195112, // 58 + 205379, // 59 + 216000, // 60 + 226981, // 61 + 238328, // 62 + 250047, // 63 + 262144, // 64 + 274625, // 65 + 287496, // 66 + 300763, // 67 + 314432, // 68 + 328509, // 69 + 343000, // 70 + 357911, // 71 + 373248, // 72 + 389017, // 73 + 405224, // 74 + 421875, // 75 + 438976, // 76 + 456533, // 77 + 474552, // 78 + 493039, // 79 + 512000, // 80 + 531441, // 81 + 551368, // 82 + 571787, // 83 + 592704, // 84 + 614125, // 85 + 636056, // 86 + 658503, // 87 + 681472, // 88 + 704969, // 89 + 729000, // 90 + 753571, // 91 + 778688, // 92 + 804357, // 93 + 830584, // 94 + 857375, // 95 + 884736, // 96 + 912673, // 97 + 941192, // 98 + 970299, // 99 + 1000000 // 100 + }, { // Erratic + 0, // 0 + 1, // 1 + 15, // 2 + 52, // 3 + 122, // 4 + 237, // 5 + 406, // 6 + 637, // 7 + 942, // 8 + 1326, // 9 + 1800, // 10 + 2369, // 11 + 3041, // 12 + 3822, // 13 + 4719, // 14 + 5737, // 15 + 6881, // 16 + 8155, // 17 + 9564, // 18 + 11111, // 19 + 12800, // 20 + 14632, // 21 + 16610, // 22 + 18737, // 23 + 21012, // 24 + 23437, // 25 + 26012, // 26 + 28737, // 27 + 31610, // 28 + 34632, // 29 + 37800, // 30 + 41111, // 31 + 44564, // 32 + 48155, // 33 + 51881, // 34 + 55737, // 35 + 59719, // 36 + 63822, // 37 + 68041, // 38 + 72369, // 39 + 76800, // 40 + 81326, // 41 + 85942, // 42 + 90637, // 43 + 95406, // 44 + 100237, // 45 + 105122, // 46 + 110052, // 47 + 115015, // 48 + 120001, // 49 + 125000, // 50 + 131324, // 51 + 137795, // 52 + 144410, // 53 + 151165, // 54 + 158056, // 55 + 165079, // 56 + 172229, // 57 + 179503, // 58 + 186894, // 59 + 194400, // 60 + 202013, // 61 + 209728, // 62 + 217540, // 63 + 225443, // 64 + 233431, // 65 + 241496, // 66 + 249633, // 67 + 257834, // 68 + 267406, // 69 + 276458, // 70 + 286328, // 71 + 296358, // 72 + 305767, // 73 + 316074, // 74 + 326531, // 75 + 336255, // 76 + 346965, // 77 + 357812, // 78 + 367807, // 79 + 378880, // 80 + 390077, // 81 + 400293, // 82 + 411686, // 83 + 423190, // 84 + 433572, // 85 + 445239, // 86 + 457001, // 87 + 467489, // 88 + 479378, // 89 + 491346, // 90 + 501878, // 91 + 513934, // 92 + 526049, // 93 + 536557, // 94 + 548720, // 95 + 560922, // 96 + 571333, // 97 + 583539, // 98 + 591882, // 99 + 600000 // 100 + }, { // Fluctuating + 0, // 0 + 1, // 1 + 4, // 2 + 13, // 3 + 32, // 4 + 65, // 5 + 112, // 6 + 178, // 7 + 276, // 8 + 393, // 9 + 540, // 10 + 745, // 11 + 967, // 12 + 1230, // 13 + 1591, // 14 + 1957, // 15 + 2457, // 16 + 3046, // 17 + 3732, // 18 + 4526, // 19 + 5440, // 20 + 6482, // 21 + 7666, // 22 + 9003, // 23 + 10506, // 24 + 12187, // 25 + 14060, // 26 + 16140, // 27 + 18439, // 28 + 20974, // 29 + 23760, // 30 + 26811, // 31 + 30146, // 32 + 33780, // 33 + 37731, // 34 + 42017, // 35 + 46656, // 36 + 50653, // 37 + 55969, // 38 + 60505, // 39 + 66560, // 40 + 71677, // 41 + 78533, // 42 + 84277, // 43 + 91998, // 44 + 98415, // 45 + 107069, // 46 + 114205, // 47 + 123863, // 48 + 131766, // 49 + 142500, // 50 + 151222, // 51 + 163105, // 52 + 172697, // 53 + 185807, // 54 + 196322, // 55 + 210739, // 56 + 222231, // 57 + 238036, // 58 + 250562, // 59 + 267840, // 60 + 281456, // 61 + 300293, // 62 + 315059, // 63 + 335544, // 64 + 351520, // 65 + 373744, // 66 + 390991, // 67 + 415050, // 68 + 433631, // 69 + 459620, // 70 + 479600, // 71 + 507617, // 72 + 529063, // 73 + 559209, // 74 + 582187, // 75 + 614566, // 76 + 639146, // 77 + 673863, // 78 + 700115, // 79 + 737280, // 80 + 765275, // 81 + 804997, // 82 + 834809, // 83 + 877201, // 84 + 908905, // 85 + 954084, // 86 + 987754, // 87 + 1035837, // 88 + 1071552, // 89 + 1122660, // 90 + 1160499, // 91 + 1214753, // 92 + 1254796, // 93 + 1312322, // 94 + 1354652, // 95 + 1415577, // 96 + 1460276, // 97 + 1524731, // 98 + 1571884, // 99 + 1640000 // 100 + }, { // Medium Slow + 0, // 0 + 1, // 1 + 9, // 2 + 57, // 3 + 96, // 4 + 135, // 5 + 179, // 6 + 236, // 7 + 314, // 8 + 419, // 9 + 560, // 10 + 742, // 11 + 973, // 12 + 1261, // 13 + 1612, // 14 + 2035, // 15 + 2535, // 16 + 3120, // 17 + 3798, // 18 + 4575, // 19 + 5460, // 20 + 6458, // 21 + 7577, // 22 + 8825, // 23 + 10208, // 24 + 11735, // 25 + 13411, // 26 + 15244, // 27 + 17242, // 28 + 19411, // 29 + 21760, // 30 + 24294, // 31 + 27021, // 32 + 29949, // 33 + 33084, // 34 + 36435, // 35 + 40007, // 36 + 43808, // 37 + 47846, // 38 + 52127, // 39 + 56660, // 40 + 61450, // 41 + 66505, // 42 + 71833, // 43 + 77440, // 44 + 83335, // 45 + 89523, // 46 + 96012, // 47 + 102810, // 48 + 109923, // 49 + 117360, // 50 + 125126, // 51 + 133229, // 52 + 141677, // 53 + 150476, // 54 + 159635, // 55 + 169159, // 56 + 179056, // 57 + 189334, // 58 + 199999, // 59 + 211060, // 60 + 222522, // 61 + 234393, // 62 + 246681, // 63 + 259392, // 64 + 272535, // 65 + 286115, // 66 + 300140, // 67 + 314618, // 68 + 329555, // 69 + 344960, // 70 + 360838, // 71 + 377197, // 72 + 394045, // 73 + 411388, // 74 + 429235, // 75 + 447591, // 76 + 466464, // 77 + 485862, // 78 + 505791, // 79 + 526260, // 80 + 547274, // 81 + 568841, // 82 + 590969, // 83 + 613664, // 84 + 636935, // 85 + 660787, // 86 + 685228, // 87 + 710266, // 88 + 735907, // 89 + 762160, // 90 + 789030, // 91 + 816525, // 92 + 844653, // 93 + 873420, // 94 + 902835, // 95 + 932903, // 96 + 963632, // 97 + 995030, // 98 + 1027103, // 99 + 1059860 // 100 + }, { // Fast + 0, // 0 + 1, // 1 + 6, // 2 + 21, // 3 + 51, // 4 + 100, // 5 + 172, // 6 + 274, // 7 + 409, // 8 + 583, // 9 + 800, // 10 + 1064, // 11 + 1382, // 12 + 1757, // 13 + 2195, // 14 + 2700, // 15 + 3276, // 16 + 3930, // 17 + 4665, // 18 + 5487, // 19 + 6400, // 20 + 7408, // 21 + 8518, // 22 + 9733, // 23 + 11059, // 24 + 12500, // 25 + 14060, // 26 + 15746, // 27 + 17561, // 28 + 19511, // 29 + 21600, // 30 + 23832, // 31 + 26214, // 32 + 28749, // 33 + 31443, // 34 + 34300, // 35 + 37324, // 36 + 40522, // 37 + 43897, // 38 + 47455, // 39 + 51200, // 40 + 55136, // 41 + 59270, // 42 + 63605, // 43 + 68147, // 44 + 72900, // 45 + 77868, // 46 + 83058, // 47 + 88473, // 48 + 94119, // 49 + 100000, // 50 + 106120, // 51 + 112486, // 52 + 119101, // 53 + 125971, // 54 + 133100, // 55 + 140492, // 56 + 148154, // 57 + 156089, // 58 + 164303, // 59 + 172800, // 60 + 181584, // 61 + 190662, // 62 + 200037, // 63 + 209715, // 64 + 219700, // 65 + 229996, // 66 + 240610, // 67 + 251545, // 68 + 262807, // 69 + 274400, // 70 + 286328, // 71 + 298598, // 72 + 311213, // 73 + 324179, // 74 + 337500, // 75 + 351180, // 76 + 365226, // 77 + 379641, // 78 + 394431, // 79 + 409600, // 80 + 425152, // 81 + 441094, // 82 + 457429, // 83 + 474163, // 84 + 491300, // 85 + 508844, // 86 + 526802, // 87 + 545177, // 88 + 563975, // 89 + 583200, // 90 + 602856, // 91 + 622950, // 92 + 643485, // 93 + 664467, // 94 + 685900, // 95 + 707788, // 96 + 730138, // 97 + 752953, // 98 + 776239, // 99 + 800000 // 100 + }, { // Slow + 0, // 0 + 1, // 1 + 10, // 2 + 33, // 3 + 80, // 4 + 156, // 5 + 270, // 6 + 428, // 7 + 640, // 8 + 911, // 9 + 1250, // 10 + 1663, // 11 + 2160, // 12 + 2746, // 13 + 3430, // 14 + 4218, // 15 + 5120, // 16 + 6141, // 17 + 7290, // 18 + 8573, // 19 + 10000, // 20 + 11576, // 21 + 13310, // 22 + 15208, // 23 + 17280, // 24 + 19531, // 25 + 21970, // 26 + 24603, // 27 + 27440, // 28 + 30486, // 29 + 33750, // 30 + 37238, // 31 + 40960, // 32 + 44921, // 33 + 49130, // 34 + 53593, // 35 + 58320, // 36 + 63316, // 37 + 68590, // 38 + 74148, // 39 + 80000, // 40 + 86151, // 41 + 92610, // 42 + 99383, // 43 + 106480, // 44 + 113906, // 45 + 121670, // 46 + 129778, // 47 + 138240, // 48 + 147061, // 49 + 156250, // 50 + 165813, // 51 + 175760, // 52 + 186096, // 53 + 196830, // 54 + 207968, // 55 + 219520, // 56 + 231491, // 57 + 243890, // 58 + 256723, // 59 + 270000, // 60 + 283726, // 61 + 297910, // 62 + 312558, // 63 + 327680, // 64 + 343281, // 65 + 359370, // 66 + 375953, // 67 + 393040, // 68 + 410636, // 69 + 428750, // 70 + 447388, // 71 + 466560, // 72 + 486271, // 73 + 506530, // 74 + 527343, // 75 + 548720, // 76 + 570666, // 77 + 593190, // 78 + 616298, // 79 + 640000, // 80 + 664301, // 81 + 689210, // 82 + 714733, // 83 + 740880, // 84 + 767656, // 85 + 795070, // 86 + 823128, // 87 + 851840, // 88 + 881211, // 89 + 911250, // 90 + 941963, // 91 + 973360, // 92 + 1005446, // 93 + 1038230, // 94 + 1071718, // 95 + 1105920, // 96 + 1140841, // 97 + 1176490, // 98 + 1212873, // 99 + 1250000 // 100 + }, { // Medium Fast copy 2 (unused? to-do: investigate) + 0, // 0 + 1, // 1 + 8, // 2 + 27, // 3 + 64, // 4 + 125, // 5 + 216, // 6 + 343, // 7 + 512, // 8 + 729, // 9 + 1000, // 10 + 1331, // 11 + 1728, // 12 + 2197, // 13 + 2744, // 14 + 3375, // 15 + 4096, // 16 + 4913, // 17 + 5832, // 18 + 6859, // 19 + 8000, // 20 + 9261, // 21 + 10648, // 22 + 12167, // 23 + 13824, // 24 + 15625, // 25 + 17576, // 26 + 19683, // 27 + 21952, // 28 + 24389, // 29 + 27000, // 30 + 29791, // 31 + 32768, // 32 + 35937, // 33 + 39304, // 34 + 42875, // 35 + 46656, // 36 + 50653, // 37 + 54872, // 38 + 59319, // 39 + 64000, // 40 + 68921, // 41 + 74088, // 42 + 79507, // 43 + 85184, // 44 + 91125, // 45 + 97336, // 46 + 103823, // 47 + 110592, // 48 + 117649, // 49 + 125000, // 50 + 132651, // 51 + 140608, // 52 + 148877, // 53 + 157464, // 54 + 166375, // 55 + 175616, // 56 + 185193, // 57 + 195112, // 58 + 205379, // 59 + 216000, // 60 + 226981, // 61 + 238328, // 62 + 250047, // 63 + 262144, // 64 + 274625, // 65 + 287496, // 66 + 300763, // 67 + 314432, // 68 + 328509, // 69 + 343000, // 70 + 357911, // 71 + 373248, // 72 + 389017, // 73 + 405224, // 74 + 421875, // 75 + 438976, // 76 + 456533, // 77 + 474552, // 78 + 493039, // 79 + 512000, // 80 + 531441, // 81 + 551368, // 82 + 571787, // 83 + 592704, // 84 + 614125, // 85 + 636056, // 86 + 658503, // 87 + 681472, // 88 + 704969, // 89 + 729000, // 90 + 753571, // 91 + 778688, // 92 + 804357, // 93 + 830584, // 94 + 857375, // 95 + 884736, // 96 + 912673, // 97 + 941192, // 98 + 970299, // 99 + 1000000 // 100 + }, { // Medium Fast copy 3 (unused? to-do: investigate) + 0, // 0 + 1, // 1 + 8, // 2 + 27, // 3 + 64, // 4 + 125, // 5 + 216, // 6 + 343, // 7 + 512, // 8 + 729, // 9 + 1000, // 10 + 1331, // 11 + 1728, // 12 + 2197, // 13 + 2744, // 14 + 3375, // 15 + 4096, // 16 + 4913, // 17 + 5832, // 18 + 6859, // 19 + 8000, // 20 + 9261, // 21 + 10648, // 22 + 12167, // 23 + 13824, // 24 + 15625, // 25 + 17576, // 26 + 19683, // 27 + 21952, // 28 + 24389, // 29 + 27000, // 30 + 29791, // 31 + 32768, // 32 + 35937, // 33 + 39304, // 34 + 42875, // 35 + 46656, // 36 + 50653, // 37 + 54872, // 38 + 59319, // 39 + 64000, // 40 + 68921, // 41 + 74088, // 42 + 79507, // 43 + 85184, // 44 + 91125, // 45 + 97336, // 46 + 103823, // 47 + 110592, // 48 + 117649, // 49 + 125000, // 50 + 132651, // 51 + 140608, // 52 + 148877, // 53 + 157464, // 54 + 166375, // 55 + 175616, // 56 + 185193, // 57 + 195112, // 58 + 205379, // 59 + 216000, // 60 + 226981, // 61 + 238328, // 62 + 250047, // 63 + 262144, // 64 + 274625, // 65 + 287496, // 66 + 300763, // 67 + 314432, // 68 + 328509, // 69 + 343000, // 70 + 357911, // 71 + 373248, // 72 + 389017, // 73 + 405224, // 74 + 421875, // 75 + 438976, // 76 + 456533, // 77 + 474552, // 78 + 493039, // 79 + 512000, // 80 + 531441, // 81 + 551368, // 82 + 571787, // 83 + 592704, // 84 + 614125, // 85 + 636056, // 86 + 658503, // 87 + 681472, // 88 + 704969, // 89 + 729000, // 90 + 753571, // 91 + 778688, // 92 + 804357, // 93 + 830584, // 94 + 857375, // 95 + 884736, // 96 + 912673, // 97 + 941192, // 98 + 970299, // 99 + 1000000 // 100 + } +}; + +#endif //POKERUBY_EXPERIENCE_TABLES_H diff --git a/src/data/pokemon/item_effects.h b/src/data/pokemon/item_effects.h new file mode 100644 index 000000000..cd06228dd --- /dev/null +++ b/src/data/pokemon/item_effects.h @@ -0,0 +1,824 @@ +// + +// + +#ifndef POKERUBY_ITEM_EFFECTS_H +#define POKERUBY_ITEM_EFFECTS_H + +const u8 gItemEffect_Potion[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 20 +}; + +const u8 gItemEffect_Antidote[] = { + 0x00, + 0x00, + 0x00, + 0x10, + 0x00, + 0x00 +}; + +const u8 gItemEffect_BurnHeal[] = { + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00 +}; + +const u8 gItemEffect_IceHeal[] = { + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00 +}; + +const u8 gItemEffect_Awakening[] = { + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00 +}; + +const u8 gItemEffect_ParalyzeHeal[] = { + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00 +}; + +const u8 gItemEffect_FullRestore[] = { + 0x00, + 0x00, + 0x00, + 0x3f, + 0x04, + 0x00, + 0xff +}; + +const u8 gItemEffect_MaxPotion[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0xff +}; + +const u8 gItemEffect_HyperPotion[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 200 +}; + +const u8 gItemEffect_SuperPotion[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 50 +}; + +const u8 gItemEffect_FullHeal[] = { + 0x00, + 0x00, + 0x00, + 0x3f, + 0x00, + 0x00 +}; + +const u8 gItemEffect_Revive[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x44, + 0x00, + 0xfe +}; + +const u8 gItemEffect_MaxRevive[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x44, + 0x00, + 0xff +}; + +const u8 gItemEffect_FreshWater[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 50 +}; + +const u8 gItemEffect_SodaPop[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 60 +}; + +const u8 gItemEffect_Lemonade[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 80 +}; + +const u8 gItemEffect_MoomooMilk[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 100 +}; + +const u8 gItemEffect_EnergyPowder[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x04, + 0xe0, + 50, + 0xfb, + 0xfb, + 0xf6 +}; + +const u8 gItemEffect_EnergyRoot[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x04, + 0xe0, + 200, + 0xf6, + 0xf6, + 0xf1 +}; + +const u8 gItemEffect_HealPowder[] = { + 0x00, + 0x00, + 0x00, + 0x3f, + 0x00, + 0xe0, + 0xfb, + 0xfb, + 0xf6 +}; + +const u8 gItemEffect_RevivalHerb[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x44, + 0xe0, + 0xfe, + 0xf1, + 0xf1, + 0xec +}; + +const u8 gItemEffect_Ether[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x18, + 0x00, + 0x0a +}; + +const u8 gItemEffect_MaxEther[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x18, + 0x00, + 0x7f +}; + +const u8 gItemEffect_Elixir[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x0a +}; + +const u8 gItemEffect_MaxElixir[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x7f +}; + +const u8 gItemEffect_LavaCookie[] = { + 0x00, + 0x00, + 0x00, + 0x3f, + 0x00, + 0x00 +}; + +const u8 gItemEffect_BlueFlute[] = { + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00 +}; + +const u8 gItemEffect_YellowFlute[] = { + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00 +}; + +const u8 gItemEffect_RedFlute[] = { + 0x80, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00 +}; + +const u8 gItemEffect_BerryJuice[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 20 +}; + +const u8 gItemEffect_SacredAsh[] = { + 0x40, + 0x00, + 0x00, + 0x00, + 0x44, + 0x00, + 0xff +}; + +const u8 gItemEffect_HPUp[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x01, + 0xe0, + 0x0a, + 0x05, + 0x03, + 0x02 +}; + +const u8 gItemEffect_Protein[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x02, + 0xe0, + 0x0a, + 0x05, + 0x03, + 0x02 +}; + +const u8 gItemEffect_Iron[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xe1, + 0x0a, + 0x05, + 0x03, + 0x02 +}; + +const u8 gItemEffect_Carbos[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xe2, + 0x0a, + 0x05, + 0x03, + 0x02 +}; + +const u8 gItemEffect_Calcium[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xe8, + 0x0a, + 0x05, + 0x03, + 0x02 +}; + +const u8 gItemEffect_RareCandy[] = { + 0x00, + 0x00, + 0x00, + 0x40, + 0x44, + 0xe0, + 253, + 0x05, + 0x03, + 0x02 +}; + +const u8 gItemEffect_PPUp[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0xe0, + 0x05, + 0x03, + 0x02 +}; + +const u8 gItemEffect_Zinc[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xe4, + 0x0a, + 0x05, + 0x03, + 0x02 +}; + +const u8 gItemEffect_PPMax[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xf0, + 0x05, + 0x03, + 0x02 +}; + +const u8 gItemEffect_GuardSpec[] = { + 0x00, + 0x00, + 0x00, + 0x80, + 0x00, + 0x60, + 0x01, + 0x01 +}; + +const u8 gItemEffect_DireHit[] = { + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x60, + 0x01, + 0x01 +}; + +const u8 gItemEffect_XAttack[] = { + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x60, + 0x01, + 0x01 +}; + +const u8 gItemEffect_XDefend[] = { + 0x00, + 0x10, + 0x00, + 0x00, + 0x00, + 0x60, + 0x01, + 0x01 +}; + +const u8 gItemEffect_XSpeed[] = { + 0x00, + 0x01, + 0x00, + 0x00, + 0x00, + 0x60, + 0x01, + 0x01 +}; + +const u8 gItemEffect_XAccuracy[] = { + 0x00, + 0x00, + 0x10, + 0x00, + 0x00, + 0x60, + 0x01, + 0x01 +}; + +const u8 gItemEffect_XSpecial[] = { + 0x00, + 0x00, + 0x01, + 0x00, + 0x00, + 0x60, + 0x01, + 0x01 +}; + +const u8 gItemEffect_SunStone[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x80, + 0x00 +}; + +const u8 gItemEffect_MoonStone[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x80, + 0x00 +}; + +const u8 gItemEffect_FireStone[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x80, + 0x00 +}; + +const u8 gItemEffect_ThunderStone[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x80, + 0x00 +}; + +const u8 gItemEffect_WaterStone[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x80, + 0x00 +}; + +const u8 gItemEffect_LeafStone[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x80, + 0x00 +}; + +const u8 gItemEffect_CheriBerry[] = { + 0x00, + 0x00, + 0x00, + 0x02, + 0x00, + 0x00 +}; + +const u8 gItemEffect_ChestoBerry[] = { + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x00 +}; + +const u8 gItemEffect_PechaBerry[] = { + 0x00, + 0x00, + 0x00, + 0x10, + 0x00, + 0x00 +}; + +const u8 gItemEffect_RawstBerry[] = { + 0x00, + 0x00, + 0x00, + 0x08, + 0x00, + 0x00 +}; + +const u8 gItemEffect_AspearBerry[] = { + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x00 +}; + +const u8 gItemEffect_LeppaBerry[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x18, + 0x00, + 0x0a +}; + +const u8 gItemEffect_OranBerry[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 10 +}; + +const u8 gItemEffect_PersimBerry[] = { + 0x00, + 0x00, + 0x00, + 0x01, + 0x00, + 0x00 +}; + +const u8 gItemEffect_LumBerry[] = { + 0x00, + 0x00, + 0x00, + 0x3f, + 0x00, + 0x00 +}; + +const u8 gItemEffect_SitrusBerry[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 30 +}; + +const u8 *const gItemEffectTable[] = { + gItemEffect_Potion, + gItemEffect_Antidote, + gItemEffect_BurnHeal, + gItemEffect_IceHeal, + gItemEffect_Awakening, + gItemEffect_ParalyzeHeal, + gItemEffect_FullRestore, + gItemEffect_MaxPotion, + gItemEffect_HyperPotion, + gItemEffect_SuperPotion, + gItemEffect_FullHeal, + gItemEffect_Revive, + gItemEffect_MaxRevive, + gItemEffect_FreshWater, + gItemEffect_SodaPop, + gItemEffect_Lemonade, + gItemEffect_MoomooMilk, + gItemEffect_EnergyPowder, + gItemEffect_EnergyRoot, + gItemEffect_HealPowder, + gItemEffect_RevivalHerb, + gItemEffect_Ether, + gItemEffect_MaxEther, + gItemEffect_Elixir, + gItemEffect_MaxElixir, + gItemEffect_LavaCookie, + gItemEffect_BlueFlute, + gItemEffect_YellowFlute, + gItemEffect_RedFlute, + NULL, + NULL, + gItemEffect_BerryJuice, + gItemEffect_SacredAsh, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + gItemEffect_HPUp, + gItemEffect_Protein, + gItemEffect_Iron, + gItemEffect_Carbos, + gItemEffect_Calcium, + gItemEffect_RareCandy, + gItemEffect_PPUp, + gItemEffect_Zinc, + gItemEffect_PPMax, + NULL, + gItemEffect_GuardSpec, + gItemEffect_DireHit, + gItemEffect_XAttack, + gItemEffect_XDefend, + gItemEffect_XSpeed, + gItemEffect_XAccuracy, + gItemEffect_XSpecial, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + gItemEffect_SunStone, + gItemEffect_MoonStone, + gItemEffect_FireStone, + gItemEffect_ThunderStone, + gItemEffect_WaterStone, + gItemEffect_LeafStone, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + gItemEffect_CheriBerry, + gItemEffect_ChestoBerry, + gItemEffect_PechaBerry, + gItemEffect_RawstBerry, + gItemEffect_AspearBerry, + gItemEffect_LeppaBerry, + gItemEffect_OranBerry, + gItemEffect_PersimBerry, + gItemEffect_LumBerry, + gItemEffect_SitrusBerry, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +#endif //POKERUBY_ITEM_EFFECTS_H diff --git a/src/data/pokemon/level_up_learnset_pointers.h b/src/data/pokemon/level_up_learnset_pointers.h new file mode 100644 index 000000000..19761c996 --- /dev/null +++ b/src/data/pokemon/level_up_learnset_pointers.h @@ -0,0 +1,423 @@ +// + +// + +#ifndef POKERUBY_LEVEL_UP_LEARNSET_POINTERS_H +#define POKERUBY_LEVEL_UP_LEARNSET_POINTERS_H + +const u16 *const gLevelUpLearnsets[] = { + gBulbasaurLevelUpLearnset, + gBulbasaurLevelUpLearnset, + gIvysaurLevelUpLearnset, + gVenusaurLevelUpLearnset, + gCharmanderLevelUpLearnset, + gCharmeleonLevelUpLearnset, + gCharizardLevelUpLearnset, + gSquirtleLevelUpLearnset, + gWartortleLevelUpLearnset, + gBlastoiseLevelUpLearnset, + gCaterpieLevelUpLearnset, + gMetapodLevelUpLearnset, + gButterfreeLevelUpLearnset, + gWeedleLevelUpLearnset, + gKakunaLevelUpLearnset, + gBeedrillLevelUpLearnset, + gPidgeyLevelUpLearnset, + gPidgeottoLevelUpLearnset, + gPidgeotLevelUpLearnset, + gRattataLevelUpLearnset, + gRaticateLevelUpLearnset, + gSpearowLevelUpLearnset, + gFearowLevelUpLearnset, + gEkansLevelUpLearnset, + gArbokLevelUpLearnset, + gPikachuLevelUpLearnset, + gRaichuLevelUpLearnset, + gSandshrewLevelUpLearnset, + gSandslashLevelUpLearnset, + gNidoranFLevelUpLearnset, + gNidorinaLevelUpLearnset, + gNidoqueenLevelUpLearnset, + gNidoranMLevelUpLearnset, + gNidorinoLevelUpLearnset, + gNidokingLevelUpLearnset, + gClefairyLevelUpLearnset, + gClefableLevelUpLearnset, + gVulpixLevelUpLearnset, + gNinetalesLevelUpLearnset, + gJigglypuffLevelUpLearnset, + gWigglytuffLevelUpLearnset, + gZubatLevelUpLearnset, + gGolbatLevelUpLearnset, + gOddishLevelUpLearnset, + gGloomLevelUpLearnset, + gVileplumeLevelUpLearnset, + gParasLevelUpLearnset, + gParasectLevelUpLearnset, + gVenonatLevelUpLearnset, + gVenomothLevelUpLearnset, + gDiglettLevelUpLearnset, + gDugtrioLevelUpLearnset, + gMeowthLevelUpLearnset, + gPersianLevelUpLearnset, + gPsyduckLevelUpLearnset, + gGolduckLevelUpLearnset, + gMankeyLevelUpLearnset, + gPrimeapeLevelUpLearnset, + gGrowlitheLevelUpLearnset, + gArcanineLevelUpLearnset, + gPoliwagLevelUpLearnset, + gPoliwhirlLevelUpLearnset, + gPoliwrathLevelUpLearnset, + gAbraLevelUpLearnset, + gKadabraLevelUpLearnset, + gAlakazamLevelUpLearnset, + gMachopLevelUpLearnset, + gMachokeLevelUpLearnset, + gMachampLevelUpLearnset, + gBellsproutLevelUpLearnset, + gWeepinbellLevelUpLearnset, + gVictreebelLevelUpLearnset, + gTentacoolLevelUpLearnset, + gTentacruelLevelUpLearnset, + gGeodudeLevelUpLearnset, + gGravelerLevelUpLearnset, + gGolemLevelUpLearnset, + gPonytaLevelUpLearnset, + gRapidashLevelUpLearnset, + gSlowpokeLevelUpLearnset, + gSlowbroLevelUpLearnset, + gMagnemiteLevelUpLearnset, + gMagnetonLevelUpLearnset, + gFarfetchdLevelUpLearnset, + gDoduoLevelUpLearnset, + gDodrioLevelUpLearnset, + gSeelLevelUpLearnset, + gDewgongLevelUpLearnset, + gGrimerLevelUpLearnset, + gMukLevelUpLearnset, + gShellderLevelUpLearnset, + gCloysterLevelUpLearnset, + gGastlyLevelUpLearnset, + gHaunterLevelUpLearnset, + gGengarLevelUpLearnset, + gOnixLevelUpLearnset, + gDrowzeeLevelUpLearnset, + gHypnoLevelUpLearnset, + gKrabbyLevelUpLearnset, + gKinglerLevelUpLearnset, + gVoltorbLevelUpLearnset, + gElectrodeLevelUpLearnset, + gExeggcuteLevelUpLearnset, + gExeggutorLevelUpLearnset, + gCuboneLevelUpLearnset, + gMarowakLevelUpLearnset, + gHitmonleeLevelUpLearnset, + gHitmonchanLevelUpLearnset, + gLickitungLevelUpLearnset, + gKoffingLevelUpLearnset, + gWeezingLevelUpLearnset, + gRhyhornLevelUpLearnset, + gRhydonLevelUpLearnset, + gChanseyLevelUpLearnset, + gTangelaLevelUpLearnset, + gKangaskhanLevelUpLearnset, + gHorseaLevelUpLearnset, + gSeadraLevelUpLearnset, + gGoldeenLevelUpLearnset, + gSeakingLevelUpLearnset, + gStaryuLevelUpLearnset, + gStarmieLevelUpLearnset, + gMrmimeLevelUpLearnset, + gScytherLevelUpLearnset, + gJynxLevelUpLearnset, + gElectabuzzLevelUpLearnset, + gMagmarLevelUpLearnset, + gPinsirLevelUpLearnset, + gTaurosLevelUpLearnset, + gMagikarpLevelUpLearnset, + gGyaradosLevelUpLearnset, + gLaprasLevelUpLearnset, + gDittoLevelUpLearnset, + gEeveeLevelUpLearnset, + gVaporeonLevelUpLearnset, + gJolteonLevelUpLearnset, + gFlareonLevelUpLearnset, + gPorygonLevelUpLearnset, + gOmanyteLevelUpLearnset, + gOmastarLevelUpLearnset, + gKabutoLevelUpLearnset, + gKabutopsLevelUpLearnset, + gAerodactylLevelUpLearnset, + gSnorlaxLevelUpLearnset, + gArticunoLevelUpLearnset, + gZapdosLevelUpLearnset, + gMoltresLevelUpLearnset, + gDratiniLevelUpLearnset, + gDragonairLevelUpLearnset, + gDragoniteLevelUpLearnset, + gMewtwoLevelUpLearnset, + gMewLevelUpLearnset, + gChikoritaLevelUpLearnset, + gBayleefLevelUpLearnset, + gMeganiumLevelUpLearnset, + gCyndaquilLevelUpLearnset, + gQuilavaLevelUpLearnset, + gTyphlosionLevelUpLearnset, + gTotodileLevelUpLearnset, + gCroconawLevelUpLearnset, + gFeraligatrLevelUpLearnset, + gSentretLevelUpLearnset, + gFurretLevelUpLearnset, + gHoothootLevelUpLearnset, + gNoctowlLevelUpLearnset, + gLedybaLevelUpLearnset, + gLedianLevelUpLearnset, + gSpinarakLevelUpLearnset, + gAriadosLevelUpLearnset, + gCrobatLevelUpLearnset, + gChinchouLevelUpLearnset, + gLanturnLevelUpLearnset, + gPichuLevelUpLearnset, + gCleffaLevelUpLearnset, + gIgglybuffLevelUpLearnset, + gTogepiLevelUpLearnset, + gTogeticLevelUpLearnset, + gNatuLevelUpLearnset, + gXatuLevelUpLearnset, + gMareepLevelUpLearnset, + gFlaaffyLevelUpLearnset, + gAmpharosLevelUpLearnset, + gBellossomLevelUpLearnset, + gMarillLevelUpLearnset, + gAzumarillLevelUpLearnset, + gSudowoodoLevelUpLearnset, + gPolitoedLevelUpLearnset, + gHoppipLevelUpLearnset, + gSkiploomLevelUpLearnset, + gJumpluffLevelUpLearnset, + gAipomLevelUpLearnset, + gSunkernLevelUpLearnset, + gSunfloraLevelUpLearnset, + gYanmaLevelUpLearnset, + gWooperLevelUpLearnset, + gQuagsireLevelUpLearnset, + gEspeonLevelUpLearnset, + gUmbreonLevelUpLearnset, + gMurkrowLevelUpLearnset, + gSlowkingLevelUpLearnset, + gMisdreavusLevelUpLearnset, + gUnownLevelUpLearnset, + gWobbuffetLevelUpLearnset, + gGirafarigLevelUpLearnset, + gPinecoLevelUpLearnset, + gForretressLevelUpLearnset, + gDunsparceLevelUpLearnset, + gGligarLevelUpLearnset, + gSteelixLevelUpLearnset, + gSnubbullLevelUpLearnset, + gGranbullLevelUpLearnset, + gQwilfishLevelUpLearnset, + gScizorLevelUpLearnset, + gShuckleLevelUpLearnset, + gHeracrossLevelUpLearnset, + gSneaselLevelUpLearnset, + gTeddiursaLevelUpLearnset, + gUrsaringLevelUpLearnset, + gSlugmaLevelUpLearnset, + gMagcargoLevelUpLearnset, + gSwinubLevelUpLearnset, + gPiloswineLevelUpLearnset, + gCorsolaLevelUpLearnset, + gRemoraidLevelUpLearnset, + gOctilleryLevelUpLearnset, + gDelibirdLevelUpLearnset, + gMantineLevelUpLearnset, + gSkarmoryLevelUpLearnset, + gHoundourLevelUpLearnset, + gHoundoomLevelUpLearnset, + gKingdraLevelUpLearnset, + gPhanpyLevelUpLearnset, + gDonphanLevelUpLearnset, + gPorygon2LevelUpLearnset, + gStantlerLevelUpLearnset, + gSmeargleLevelUpLearnset, + gTyrogueLevelUpLearnset, + gHitmontopLevelUpLearnset, + gSmoochumLevelUpLearnset, + gElekidLevelUpLearnset, + gMagbyLevelUpLearnset, + gMiltankLevelUpLearnset, + gBlisseyLevelUpLearnset, + gRaikouLevelUpLearnset, + gEnteiLevelUpLearnset, + gSuicuneLevelUpLearnset, + gLarvitarLevelUpLearnset, + gPupitarLevelUpLearnset, + gTyranitarLevelUpLearnset, + gLugiaLevelUpLearnset, + gHoOhLevelUpLearnset, + gCelebiLevelUpLearnset, + gSpecies252LevelUpLearnset, + gSpecies253LevelUpLearnset, + gSpecies254LevelUpLearnset, + gSpecies255LevelUpLearnset, + gSpecies256LevelUpLearnset, + gSpecies257LevelUpLearnset, + gSpecies258LevelUpLearnset, + gSpecies259LevelUpLearnset, + gSpecies260LevelUpLearnset, + gSpecies261LevelUpLearnset, + gSpecies262LevelUpLearnset, + gSpecies263LevelUpLearnset, + gSpecies264LevelUpLearnset, + gSpecies265LevelUpLearnset, + gSpecies266LevelUpLearnset, + gSpecies267LevelUpLearnset, + gSpecies268LevelUpLearnset, + gSpecies269LevelUpLearnset, + gSpecies270LevelUpLearnset, + gSpecies271LevelUpLearnset, + gSpecies272LevelUpLearnset, + gSpecies273LevelUpLearnset, + gSpecies274LevelUpLearnset, + gSpecies275LevelUpLearnset, + gSpecies276LevelUpLearnset, + gTreeckoLevelUpLearnset, + gGrovyleLevelUpLearnset, + gSceptileLevelUpLearnset, + gTorchicLevelUpLearnset, + gCombuskenLevelUpLearnset, + gBlazikenLevelUpLearnset, + gMudkipLevelUpLearnset, + gMarshtompLevelUpLearnset, + gSwampertLevelUpLearnset, + gPoochyenaLevelUpLearnset, + gMightyenaLevelUpLearnset, + gZigzagoonLevelUpLearnset, + gLinooneLevelUpLearnset, + gWurmpleLevelUpLearnset, + gSilcoonLevelUpLearnset, + gBeautiflyLevelUpLearnset, + gCascoonLevelUpLearnset, + gDustoxLevelUpLearnset, + gLotadLevelUpLearnset, + gLombreLevelUpLearnset, + gLudicoloLevelUpLearnset, + gSeedotLevelUpLearnset, + gNuzleafLevelUpLearnset, + gShiftryLevelUpLearnset, + gNincadaLevelUpLearnset, + gNinjaskLevelUpLearnset, + gShedinjaLevelUpLearnset, + gTaillowLevelUpLearnset, + gSwellowLevelUpLearnset, + gShroomishLevelUpLearnset, + gBreloomLevelUpLearnset, + gSpindaLevelUpLearnset, + gWingullLevelUpLearnset, + gPelipperLevelUpLearnset, + gSurskitLevelUpLearnset, + gMasquerainLevelUpLearnset, + gWailmerLevelUpLearnset, + gWailordLevelUpLearnset, + gSkittyLevelUpLearnset, + gDelcattyLevelUpLearnset, + gKecleonLevelUpLearnset, + gBaltoyLevelUpLearnset, + gClaydolLevelUpLearnset, + gNosepassLevelUpLearnset, + gTorkoalLevelUpLearnset, + gSableyeLevelUpLearnset, + gBarboachLevelUpLearnset, + gWhiscashLevelUpLearnset, + gLuvdiscLevelUpLearnset, + gCorphishLevelUpLearnset, + gCrawdauntLevelUpLearnset, + gFeebasLevelUpLearnset, + gMiloticLevelUpLearnset, + gCarvanhaLevelUpLearnset, + gSharpedoLevelUpLearnset, + gTrapinchLevelUpLearnset, + gVibravaLevelUpLearnset, + gFlygonLevelUpLearnset, + gMakuhitaLevelUpLearnset, + gHariyamaLevelUpLearnset, + gElectrikeLevelUpLearnset, + gManectricLevelUpLearnset, + gNumelLevelUpLearnset, + gCameruptLevelUpLearnset, + gSphealLevelUpLearnset, + gSealeoLevelUpLearnset, + gWalreinLevelUpLearnset, + gCacneaLevelUpLearnset, + gCacturneLevelUpLearnset, + gSnoruntLevelUpLearnset, + gGlalieLevelUpLearnset, + gLunatoneLevelUpLearnset, + gSolrockLevelUpLearnset, + gAzurillLevelUpLearnset, + gSpoinkLevelUpLearnset, + gGrumpigLevelUpLearnset, + gPlusleLevelUpLearnset, + gMinunLevelUpLearnset, + gMawileLevelUpLearnset, + gMedititeLevelUpLearnset, + gMedichamLevelUpLearnset, + gSwabluLevelUpLearnset, + gAltariaLevelUpLearnset, + gWynautLevelUpLearnset, + gDuskullLevelUpLearnset, + gDusclopsLevelUpLearnset, + gRoseliaLevelUpLearnset, + gSlakothLevelUpLearnset, + gVigorothLevelUpLearnset, + gSlakingLevelUpLearnset, + gGulpinLevelUpLearnset, + gSwalotLevelUpLearnset, + gTropiusLevelUpLearnset, + gWhismurLevelUpLearnset, + gLoudredLevelUpLearnset, + gExploudLevelUpLearnset, + gClamperlLevelUpLearnset, + gHuntailLevelUpLearnset, + gGorebyssLevelUpLearnset, + gAbsolLevelUpLearnset, + gShuppetLevelUpLearnset, + gBanetteLevelUpLearnset, + gSeviperLevelUpLearnset, + gZangooseLevelUpLearnset, + gRelicanthLevelUpLearnset, + gAronLevelUpLearnset, + gLaironLevelUpLearnset, + gAggronLevelUpLearnset, + gCastformLevelUpLearnset, + gVolbeatLevelUpLearnset, + gIllumiseLevelUpLearnset, + gLileepLevelUpLearnset, + gCradilyLevelUpLearnset, + gAnorithLevelUpLearnset, + gArmaldoLevelUpLearnset, + gRaltsLevelUpLearnset, + gKirliaLevelUpLearnset, + gGardevoirLevelUpLearnset, + gBagonLevelUpLearnset, + gShelgonLevelUpLearnset, + gSalamenceLevelUpLearnset, + gBeldumLevelUpLearnset, + gMetangLevelUpLearnset, + gMetagrossLevelUpLearnset, + gRegirockLevelUpLearnset, + gRegiceLevelUpLearnset, + gRegisteelLevelUpLearnset, + gKyogreLevelUpLearnset, + gGroudonLevelUpLearnset, + gRayquazaLevelUpLearnset, + gLatiasLevelUpLearnset, + gLatiosLevelUpLearnset, + gJirachiLevelUpLearnset, + gDeoxysLevelUpLearnset, + gChimechoLevelUpLearnset +}; + +#endif //POKERUBY_LEVEL_UP_LEARNSET_POINTERS_H diff --git a/src/data/pokemon/level_up_learnsets.h b/src/data/pokemon/level_up_learnsets.h new file mode 100644 index 000000000..bc1de82de --- /dev/null +++ b/src/data/pokemon/level_up_learnsets.h @@ -0,0 +1,5627 @@ +// + +// + +#ifndef POKERUBY_LEVEL_UP_LEARNSETS_H +#define POKERUBY_LEVEL_UP_LEARNSETS_H + +#define LEVEL_UP_MOVE(lvl, move) ((lvl << 9) | move) +#define LEVEL_UP_END 0xffff + +const u16 gBulbasaurLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 4, MOVE_GROWL), + LEVEL_UP_MOVE( 7, MOVE_LEECH_SEED), + LEVEL_UP_MOVE(10, MOVE_VINE_WHIP), + LEVEL_UP_MOVE(15, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(20, MOVE_RAZOR_LEAF), + LEVEL_UP_MOVE(25, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE(32, MOVE_GROWTH), + LEVEL_UP_MOVE(39, MOVE_SYNTHESIS), + LEVEL_UP_MOVE(46, MOVE_SOLAR_BEAM), + LEVEL_UP_END +}; + +const u16 gIvysaurLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_LEECH_SEED), + LEVEL_UP_MOVE( 4, MOVE_GROWL), + LEVEL_UP_MOVE( 7, MOVE_LEECH_SEED), + LEVEL_UP_MOVE(10, MOVE_VINE_WHIP), + LEVEL_UP_MOVE(15, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(22, MOVE_RAZOR_LEAF), + LEVEL_UP_MOVE(29, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE(38, MOVE_GROWTH), + LEVEL_UP_MOVE(47, MOVE_SYNTHESIS), + LEVEL_UP_MOVE(56, MOVE_SOLAR_BEAM), + LEVEL_UP_END +}; + +const u16 gVenusaurLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_LEECH_SEED), + LEVEL_UP_MOVE( 1, MOVE_VINE_WHIP), + LEVEL_UP_MOVE( 4, MOVE_GROWL), + LEVEL_UP_MOVE( 7, MOVE_LEECH_SEED), + LEVEL_UP_MOVE(10, MOVE_VINE_WHIP), + LEVEL_UP_MOVE(15, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(22, MOVE_RAZOR_LEAF), + LEVEL_UP_MOVE(29, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE(41, MOVE_GROWTH), + LEVEL_UP_MOVE(53, MOVE_SYNTHESIS), + LEVEL_UP_MOVE(65, MOVE_SOLAR_BEAM), + LEVEL_UP_END +}; + +const u16 gCharmanderLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 7, MOVE_EMBER), + LEVEL_UP_MOVE(13, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE(19, MOVE_RAGE), + LEVEL_UP_MOVE(25, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(31, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(37, MOVE_SLASH), + LEVEL_UP_MOVE(43, MOVE_DRAGON_RAGE), + LEVEL_UP_MOVE(49, MOVE_FIRE_SPIN), + LEVEL_UP_END +}; + +const u16 gCharmeleonLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_EMBER), + LEVEL_UP_MOVE( 7, MOVE_EMBER), + LEVEL_UP_MOVE(13, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE(20, MOVE_RAGE), + LEVEL_UP_MOVE(27, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(34, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(41, MOVE_SLASH), + LEVEL_UP_MOVE(48, MOVE_DRAGON_RAGE), + LEVEL_UP_MOVE(55, MOVE_FIRE_SPIN), + LEVEL_UP_END +}; + +const u16 gCharizardLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_EMBER), + LEVEL_UP_MOVE( 1, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE( 7, MOVE_EMBER), + LEVEL_UP_MOVE(13, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE(20, MOVE_RAGE), + LEVEL_UP_MOVE(27, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(34, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(36, MOVE_WING_ATTACK), + LEVEL_UP_MOVE(44, MOVE_SLASH), + LEVEL_UP_MOVE(54, MOVE_DRAGON_RAGE), + LEVEL_UP_MOVE(64, MOVE_FIRE_SPIN), + LEVEL_UP_END +}; + +const u16 gSquirtleLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 4, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 7, MOVE_BUBBLE), + LEVEL_UP_MOVE(10, MOVE_WITHDRAW), + LEVEL_UP_MOVE(13, MOVE_WATER_GUN), + LEVEL_UP_MOVE(18, MOVE_BITE), + LEVEL_UP_MOVE(23, MOVE_RAPID_SPIN), + LEVEL_UP_MOVE(28, MOVE_PROTECT), + LEVEL_UP_MOVE(33, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(40, MOVE_SKULL_BASH), + LEVEL_UP_MOVE(47, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +const u16 gWartortleLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 1, MOVE_BUBBLE), + LEVEL_UP_MOVE( 4, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 7, MOVE_BUBBLE), + LEVEL_UP_MOVE(10, MOVE_WITHDRAW), + LEVEL_UP_MOVE(13, MOVE_WATER_GUN), + LEVEL_UP_MOVE(19, MOVE_BITE), + LEVEL_UP_MOVE(25, MOVE_RAPID_SPIN), + LEVEL_UP_MOVE(31, MOVE_PROTECT), + LEVEL_UP_MOVE(37, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(45, MOVE_SKULL_BASH), + LEVEL_UP_MOVE(53, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +const u16 gBlastoiseLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 1, MOVE_BUBBLE), + LEVEL_UP_MOVE( 1, MOVE_WITHDRAW), + LEVEL_UP_MOVE( 4, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 7, MOVE_BUBBLE), + LEVEL_UP_MOVE(10, MOVE_WITHDRAW), + LEVEL_UP_MOVE(13, MOVE_WATER_GUN), + LEVEL_UP_MOVE(19, MOVE_BITE), + LEVEL_UP_MOVE(25, MOVE_RAPID_SPIN), + LEVEL_UP_MOVE(31, MOVE_PROTECT), + LEVEL_UP_MOVE(42, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(55, MOVE_SKULL_BASH), + LEVEL_UP_MOVE(68, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +const u16 gCaterpieLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_STRING_SHOT), + LEVEL_UP_END +}; + +const u16 gMetapodLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_HARDEN), + LEVEL_UP_MOVE( 7, MOVE_HARDEN), + LEVEL_UP_END +}; + +const u16 gButterfreeLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_CONFUSION), + LEVEL_UP_MOVE(10, MOVE_CONFUSION), + LEVEL_UP_MOVE(13, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(14, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(18, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(23, MOVE_WHIRLWIND), + LEVEL_UP_MOVE(28, MOVE_GUST), + LEVEL_UP_MOVE(34, MOVE_PSYBEAM), + LEVEL_UP_MOVE(40, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(47, MOVE_SILVER_WIND), + LEVEL_UP_END +}; + +const u16 gWeedleLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POISON_STING), + LEVEL_UP_MOVE( 1, MOVE_STRING_SHOT), + LEVEL_UP_END +}; + +const u16 gKakunaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_HARDEN), + LEVEL_UP_MOVE( 7, MOVE_HARDEN), + LEVEL_UP_END +}; + +const u16 gBeedrillLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(10, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(15, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(20, MOVE_TWINEEDLE), + LEVEL_UP_MOVE(25, MOVE_RAGE), + LEVEL_UP_MOVE(30, MOVE_PURSUIT), + LEVEL_UP_MOVE(35, MOVE_PIN_MISSILE), + LEVEL_UP_MOVE(40, MOVE_AGILITY), + LEVEL_UP_MOVE(45, MOVE_ENDEAVOR), + LEVEL_UP_END +}; + +const u16 gPidgeyLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 5, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 9, MOVE_GUST), + LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(19, MOVE_WHIRLWIND), + LEVEL_UP_MOVE(25, MOVE_WING_ATTACK), + LEVEL_UP_MOVE(31, MOVE_FEATHER_DANCE), + LEVEL_UP_MOVE(39, MOVE_AGILITY), + LEVEL_UP_MOVE(47, MOVE_MIRROR_MOVE), + LEVEL_UP_END +}; + +const u16 gPidgeottoLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_GUST), + LEVEL_UP_MOVE( 5, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 9, MOVE_GUST), + LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(20, MOVE_WHIRLWIND), + LEVEL_UP_MOVE(27, MOVE_WING_ATTACK), + LEVEL_UP_MOVE(34, MOVE_FEATHER_DANCE), + LEVEL_UP_MOVE(43, MOVE_AGILITY), + LEVEL_UP_MOVE(52, MOVE_MIRROR_MOVE), + LEVEL_UP_END +}; + +const u16 gPidgeotLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_GUST), + LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE( 5, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 9, MOVE_GUST), + LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(20, MOVE_WHIRLWIND), + LEVEL_UP_MOVE(27, MOVE_WING_ATTACK), + LEVEL_UP_MOVE(34, MOVE_FEATHER_DANCE), + LEVEL_UP_MOVE(48, MOVE_AGILITY), + LEVEL_UP_MOVE(62, MOVE_MIRROR_MOVE), + LEVEL_UP_END +}; + +const u16 gRattataLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 7, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(13, MOVE_HYPER_FANG), + LEVEL_UP_MOVE(20, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(27, MOVE_PURSUIT), + LEVEL_UP_MOVE(34, MOVE_SUPER_FANG), + LEVEL_UP_MOVE(41, MOVE_ENDEAVOR), + LEVEL_UP_END +}; + +const u16 gRaticateLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE( 7, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(13, MOVE_HYPER_FANG), + LEVEL_UP_MOVE(20, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(30, MOVE_PURSUIT), + LEVEL_UP_MOVE(40, MOVE_SUPER_FANG), + LEVEL_UP_MOVE(50, MOVE_ENDEAVOR), + LEVEL_UP_END +}; + +const u16 gSpearowLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_PECK), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 7, MOVE_LEER), + LEVEL_UP_MOVE(13, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(19, MOVE_PURSUIT), + LEVEL_UP_MOVE(25, MOVE_AERIAL_ACE), + LEVEL_UP_MOVE(31, MOVE_MIRROR_MOVE), + LEVEL_UP_MOVE(37, MOVE_DRILL_PECK), + LEVEL_UP_MOVE(43, MOVE_AGILITY), + LEVEL_UP_END +}; + +const u16 gFearowLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_PECK), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE( 7, MOVE_LEER), + LEVEL_UP_MOVE(13, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(26, MOVE_PURSUIT), + LEVEL_UP_MOVE(32, MOVE_MIRROR_MOVE), + LEVEL_UP_MOVE(40, MOVE_DRILL_PECK), + LEVEL_UP_MOVE(47, MOVE_AGILITY), + LEVEL_UP_END +}; + +const u16 gEkansLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WRAP), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 8, MOVE_POISON_STING), + LEVEL_UP_MOVE(13, MOVE_BITE), + LEVEL_UP_MOVE(20, MOVE_GLARE), + LEVEL_UP_MOVE(25, MOVE_SCREECH), + LEVEL_UP_MOVE(32, MOVE_ACID), + LEVEL_UP_MOVE(37, MOVE_STOCKPILE), + LEVEL_UP_MOVE(37, MOVE_SWALLOW), + LEVEL_UP_MOVE(37, MOVE_SPIT_UP), + LEVEL_UP_MOVE(44, MOVE_HAZE), + LEVEL_UP_END +}; + +const u16 gArbokLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WRAP), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_POISON_STING), + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 8, MOVE_POISON_STING), + LEVEL_UP_MOVE(13, MOVE_BITE), + LEVEL_UP_MOVE(20, MOVE_GLARE), + LEVEL_UP_MOVE(28, MOVE_SCREECH), + LEVEL_UP_MOVE(38, MOVE_ACID), + LEVEL_UP_MOVE(46, MOVE_STOCKPILE), + LEVEL_UP_MOVE(46, MOVE_SWALLOW), + LEVEL_UP_MOVE(46, MOVE_SPIT_UP), + LEVEL_UP_MOVE(56, MOVE_HAZE), + LEVEL_UP_END +}; + +const u16 gPikachuLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_THUNDER_SHOCK), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 6, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 8, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE(11, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(15, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE(20, MOVE_SLAM), + LEVEL_UP_MOVE(26, MOVE_THUNDERBOLT), + LEVEL_UP_MOVE(33, MOVE_AGILITY), + LEVEL_UP_MOVE(41, MOVE_THUNDER), + LEVEL_UP_MOVE(50, MOVE_LIGHT_SCREEN), + LEVEL_UP_END +}; + +const u16 gRaichuLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_THUNDER_SHOCK), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_THUNDERBOLT), + LEVEL_UP_END +}; + +const u16 gSandshrewLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 6, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE(11, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(17, MOVE_POISON_STING), + LEVEL_UP_MOVE(23, MOVE_SLASH), + LEVEL_UP_MOVE(30, MOVE_SWIFT), + LEVEL_UP_MOVE(37, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(45, MOVE_SAND_TOMB), + LEVEL_UP_MOVE(53, MOVE_SANDSTORM), + LEVEL_UP_END +}; + +const u16 gSandslashLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE( 1, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 6, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE(11, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(17, MOVE_POISON_STING), + LEVEL_UP_MOVE(24, MOVE_SLASH), + LEVEL_UP_MOVE(33, MOVE_SWIFT), + LEVEL_UP_MOVE(42, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(52, MOVE_SAND_TOMB), + LEVEL_UP_MOVE(62, MOVE_SANDSTORM), + LEVEL_UP_END +}; + +const u16 gNidoranFLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 8, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE(12, MOVE_DOUBLE_KICK), + LEVEL_UP_MOVE(17, MOVE_POISON_STING), + LEVEL_UP_MOVE(20, MOVE_BITE), + LEVEL_UP_MOVE(23, MOVE_HELPING_HAND), + LEVEL_UP_MOVE(30, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(38, MOVE_FLATTER), + LEVEL_UP_MOVE(47, MOVE_CRUNCH), + LEVEL_UP_END +}; + +const u16 gNidorinaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 8, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE(12, MOVE_DOUBLE_KICK), + LEVEL_UP_MOVE(18, MOVE_POISON_STING), + LEVEL_UP_MOVE(22, MOVE_BITE), + LEVEL_UP_MOVE(26, MOVE_HELPING_HAND), + LEVEL_UP_MOVE(34, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(43, MOVE_FLATTER), + LEVEL_UP_MOVE(53, MOVE_CRUNCH), + LEVEL_UP_END +}; + +const u16 gNidoqueenLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 1, MOVE_DOUBLE_KICK), + LEVEL_UP_MOVE( 1, MOVE_POISON_STING), + LEVEL_UP_MOVE(23, MOVE_BODY_SLAM), + LEVEL_UP_END +}; + +const u16 gNidoranMLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_PECK), + LEVEL_UP_MOVE( 8, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(12, MOVE_DOUBLE_KICK), + LEVEL_UP_MOVE(17, MOVE_POISON_STING), + LEVEL_UP_MOVE(20, MOVE_HORN_ATTACK), + LEVEL_UP_MOVE(23, MOVE_HELPING_HAND), + LEVEL_UP_MOVE(30, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(38, MOVE_FLATTER), + LEVEL_UP_MOVE(47, MOVE_HORN_DRILL), + LEVEL_UP_END +}; + +const u16 gNidorinoLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_PECK), + LEVEL_UP_MOVE( 8, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(12, MOVE_DOUBLE_KICK), + LEVEL_UP_MOVE(18, MOVE_POISON_STING), + LEVEL_UP_MOVE(22, MOVE_HORN_ATTACK), + LEVEL_UP_MOVE(26, MOVE_HELPING_HAND), + LEVEL_UP_MOVE(34, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(43, MOVE_FLATTER), + LEVEL_UP_MOVE(53, MOVE_HORN_DRILL), + LEVEL_UP_END +}; + +const u16 gNidokingLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_PECK), + LEVEL_UP_MOVE( 1, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE( 1, MOVE_DOUBLE_KICK), + LEVEL_UP_MOVE( 1, MOVE_POISON_STING), + LEVEL_UP_MOVE(23, MOVE_THRASH), + LEVEL_UP_END +}; + +const u16 gClefairyLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POUND), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 5, MOVE_ENCORE), + LEVEL_UP_MOVE( 9, MOVE_SING), + LEVEL_UP_MOVE(13, MOVE_DOUBLE_SLAP), + LEVEL_UP_MOVE(17, MOVE_FOLLOW_ME), + LEVEL_UP_MOVE(21, MOVE_MINIMIZE), + LEVEL_UP_MOVE(25, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE(29, MOVE_METRONOME), + LEVEL_UP_MOVE(33, MOVE_COSMIC_POWER), + LEVEL_UP_MOVE(37, MOVE_MOONLIGHT), + LEVEL_UP_MOVE(41, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(45, MOVE_METEOR_MASH), + LEVEL_UP_END +}; + +const u16 gClefableLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SING), + LEVEL_UP_MOVE( 1, MOVE_DOUBLE_SLAP), + LEVEL_UP_MOVE( 1, MOVE_MINIMIZE), + LEVEL_UP_MOVE( 1, MOVE_METRONOME), + LEVEL_UP_END +}; + +const u16 gVulpixLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_EMBER), + LEVEL_UP_MOVE( 5, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 9, MOVE_ROAR), + LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(17, MOVE_WILL_O_WISP), + LEVEL_UP_MOVE(21, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(25, MOVE_IMPRISON), + LEVEL_UP_MOVE(29, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(33, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(37, MOVE_GRUDGE), + LEVEL_UP_MOVE(41, MOVE_FIRE_SPIN), + LEVEL_UP_END +}; + +const u16 gNinetalesLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_EMBER), + LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE( 1, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(45, MOVE_FIRE_SPIN), + LEVEL_UP_END +}; + +const u16 gJigglypuffLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SING), + LEVEL_UP_MOVE( 4, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE( 9, MOVE_POUND), + LEVEL_UP_MOVE(14, MOVE_DISABLE), + LEVEL_UP_MOVE(19, MOVE_ROLLOUT), + LEVEL_UP_MOVE(24, MOVE_DOUBLE_SLAP), + LEVEL_UP_MOVE(29, MOVE_REST), + LEVEL_UP_MOVE(34, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(39, MOVE_MIMIC), + LEVEL_UP_MOVE(44, MOVE_HYPER_VOICE), + LEVEL_UP_MOVE(49, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +const u16 gWigglytuffLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SING), + LEVEL_UP_MOVE( 1, MOVE_DISABLE), + LEVEL_UP_MOVE( 1, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE( 1, MOVE_DOUBLE_SLAP), + LEVEL_UP_END +}; + +const u16 gZubatLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_LEECH_LIFE), + LEVEL_UP_MOVE( 6, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(11, MOVE_ASTONISH), + LEVEL_UP_MOVE(16, MOVE_BITE), + LEVEL_UP_MOVE(21, MOVE_WING_ATTACK), + LEVEL_UP_MOVE(26, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(31, MOVE_AIR_CUTTER), + LEVEL_UP_MOVE(36, MOVE_MEAN_LOOK), + LEVEL_UP_MOVE(41, MOVE_POISON_FANG), + LEVEL_UP_MOVE(46, MOVE_HAZE), + LEVEL_UP_END +}; + +const u16 gGolbatLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCREECH), + LEVEL_UP_MOVE( 1, MOVE_LEECH_LIFE), + LEVEL_UP_MOVE( 1, MOVE_SUPERSONIC), + LEVEL_UP_MOVE( 1, MOVE_ASTONISH), + LEVEL_UP_MOVE( 6, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(11, MOVE_ASTONISH), + LEVEL_UP_MOVE(16, MOVE_BITE), + LEVEL_UP_MOVE(21, MOVE_WING_ATTACK), + LEVEL_UP_MOVE(28, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(35, MOVE_AIR_CUTTER), + LEVEL_UP_MOVE(42, MOVE_MEAN_LOOK), + LEVEL_UP_MOVE(49, MOVE_POISON_FANG), + LEVEL_UP_MOVE(56, MOVE_HAZE), + LEVEL_UP_END +}; + +const u16 gOddishLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ABSORB), + LEVEL_UP_MOVE( 7, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE(14, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(16, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(18, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(23, MOVE_ACID), + LEVEL_UP_MOVE(32, MOVE_MOONLIGHT), + LEVEL_UP_MOVE(39, MOVE_PETAL_DANCE), + LEVEL_UP_END +}; + +const u16 gGloomLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ABSORB), + LEVEL_UP_MOVE( 1, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE( 1, MOVE_POISON_POWDER), + LEVEL_UP_MOVE( 7, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE(14, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(16, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(18, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(24, MOVE_ACID), + LEVEL_UP_MOVE(35, MOVE_MOONLIGHT), + LEVEL_UP_MOVE(44, MOVE_PETAL_DANCE), + LEVEL_UP_END +}; + +const u16 gVileplumeLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ABSORB), + LEVEL_UP_MOVE( 1, MOVE_AROMATHERAPY), + LEVEL_UP_MOVE( 1, MOVE_STUN_SPORE), + LEVEL_UP_MOVE( 1, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE(44, MOVE_PETAL_DANCE), + LEVEL_UP_END +}; + +const u16 gParasLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 7, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(13, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(19, MOVE_LEECH_LIFE), + LEVEL_UP_MOVE(25, MOVE_SPORE), + LEVEL_UP_MOVE(31, MOVE_SLASH), + LEVEL_UP_MOVE(37, MOVE_GROWTH), + LEVEL_UP_MOVE(43, MOVE_GIGA_DRAIN), + LEVEL_UP_MOVE(49, MOVE_AROMATHERAPY), + LEVEL_UP_END +}; + +const u16 gParasectLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_STUN_SPORE), + LEVEL_UP_MOVE( 1, MOVE_POISON_POWDER), + LEVEL_UP_MOVE( 7, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(13, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(19, MOVE_LEECH_LIFE), + LEVEL_UP_MOVE(27, MOVE_SPORE), + LEVEL_UP_MOVE(35, MOVE_SLASH), + LEVEL_UP_MOVE(43, MOVE_GROWTH), + LEVEL_UP_MOVE(51, MOVE_GIGA_DRAIN), + LEVEL_UP_MOVE(59, MOVE_AROMATHERAPY), + LEVEL_UP_END +}; + +const u16 gVenonatLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_DISABLE), + LEVEL_UP_MOVE( 1, MOVE_FORESIGHT), + LEVEL_UP_MOVE( 9, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(17, MOVE_CONFUSION), + LEVEL_UP_MOVE(20, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(25, MOVE_LEECH_LIFE), + LEVEL_UP_MOVE(28, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(33, MOVE_PSYBEAM), + LEVEL_UP_MOVE(36, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(41, MOVE_PSYCHIC), + LEVEL_UP_END +}; + +const u16 gVenomothLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SILVER_WIND), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_DISABLE), + LEVEL_UP_MOVE( 1, MOVE_FORESIGHT), + LEVEL_UP_MOVE( 1, MOVE_SUPERSONIC), + LEVEL_UP_MOVE( 9, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(17, MOVE_CONFUSION), + LEVEL_UP_MOVE(20, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(25, MOVE_LEECH_LIFE), + LEVEL_UP_MOVE(28, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(31, MOVE_GUST), + LEVEL_UP_MOVE(36, MOVE_PSYBEAM), + LEVEL_UP_MOVE(42, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(52, MOVE_PSYCHIC), + LEVEL_UP_END +}; + +const u16 gDiglettLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 5, MOVE_GROWL), + LEVEL_UP_MOVE( 9, MOVE_MAGNITUDE), + LEVEL_UP_MOVE(17, MOVE_DIG), + LEVEL_UP_MOVE(25, MOVE_MUD_SLAP), + LEVEL_UP_MOVE(33, MOVE_SLASH), + LEVEL_UP_MOVE(41, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(49, MOVE_FISSURE), + LEVEL_UP_END +}; + +const u16 gDugtrioLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TRI_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 5, MOVE_GROWL), + LEVEL_UP_MOVE( 9, MOVE_MAGNITUDE), + LEVEL_UP_MOVE(17, MOVE_DIG), + LEVEL_UP_MOVE(25, MOVE_MUD_SLAP), + LEVEL_UP_MOVE(26, MOVE_SAND_TOMB), + LEVEL_UP_MOVE(38, MOVE_SLASH), + LEVEL_UP_MOVE(51, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(64, MOVE_FISSURE), + LEVEL_UP_END +}; + +const u16 gMeowthLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE(11, MOVE_BITE), + LEVEL_UP_MOVE(20, MOVE_PAY_DAY), + LEVEL_UP_MOVE(28, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(35, MOVE_SCREECH), + LEVEL_UP_MOVE(41, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(46, MOVE_SLASH), + LEVEL_UP_MOVE(50, MOVE_FAKE_OUT), + LEVEL_UP_END +}; + +const u16 gPersianLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE(11, MOVE_BITE), + LEVEL_UP_MOVE(20, MOVE_PAY_DAY), + LEVEL_UP_MOVE(29, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(38, MOVE_SCREECH), + LEVEL_UP_MOVE(46, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(53, MOVE_SLASH), + LEVEL_UP_MOVE(59, MOVE_FAKE_OUT), + LEVEL_UP_END +}; + +const u16 gPsyduckLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WATER_SPORT), + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 5, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE(10, MOVE_DISABLE), + LEVEL_UP_MOVE(16, MOVE_CONFUSION), + LEVEL_UP_MOVE(23, MOVE_SCREECH), + LEVEL_UP_MOVE(31, MOVE_PSYCH_UP), + LEVEL_UP_MOVE(40, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(50, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +const u16 gGolduckLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WATER_SPORT), + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 1, MOVE_DISABLE), + LEVEL_UP_MOVE( 5, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE(10, MOVE_DISABLE), + LEVEL_UP_MOVE(16, MOVE_CONFUSION), + LEVEL_UP_MOVE(23, MOVE_SCREECH), + LEVEL_UP_MOVE(31, MOVE_PSYCH_UP), + LEVEL_UP_MOVE(44, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(58, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +const u16 gMankeyLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 9, MOVE_LOW_KICK), + LEVEL_UP_MOVE(15, MOVE_KARATE_CHOP), + LEVEL_UP_MOVE(21, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(27, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(33, MOVE_SEISMIC_TOSS), + LEVEL_UP_MOVE(39, MOVE_CROSS_CHOP), + LEVEL_UP_MOVE(45, MOVE_SCREECH), + LEVEL_UP_MOVE(51, MOVE_THRASH), + LEVEL_UP_END +}; + +const u16 gPrimeapeLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_LOW_KICK), + LEVEL_UP_MOVE( 1, MOVE_RAGE), + LEVEL_UP_MOVE( 9, MOVE_LOW_KICK), + LEVEL_UP_MOVE(15, MOVE_KARATE_CHOP), + LEVEL_UP_MOVE(21, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(27, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(28, MOVE_RAGE), + LEVEL_UP_MOVE(36, MOVE_SEISMIC_TOSS), + LEVEL_UP_MOVE(45, MOVE_CROSS_CHOP), + LEVEL_UP_MOVE(54, MOVE_SCREECH), + LEVEL_UP_MOVE(63, MOVE_THRASH), + LEVEL_UP_END +}; + +const u16 gGrowlitheLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 1, MOVE_ROAR), + LEVEL_UP_MOVE( 7, MOVE_EMBER), + LEVEL_UP_MOVE(13, MOVE_LEER), + LEVEL_UP_MOVE(19, MOVE_ODOR_SLEUTH), + LEVEL_UP_MOVE(25, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(31, MOVE_FLAME_WHEEL), + LEVEL_UP_MOVE(37, MOVE_HELPING_HAND), + LEVEL_UP_MOVE(43, MOVE_AGILITY), + LEVEL_UP_MOVE(49, MOVE_FLAMETHROWER), + LEVEL_UP_END +}; + +const u16 gArcanineLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 1, MOVE_ROAR), + LEVEL_UP_MOVE( 1, MOVE_EMBER), + LEVEL_UP_MOVE( 1, MOVE_ODOR_SLEUTH), + LEVEL_UP_MOVE(49, MOVE_EXTREME_SPEED), + LEVEL_UP_END +}; + +const u16 gPoliwagLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BUBBLE), + LEVEL_UP_MOVE( 7, MOVE_HYPNOSIS), + LEVEL_UP_MOVE(13, MOVE_WATER_GUN), + LEVEL_UP_MOVE(19, MOVE_DOUBLE_SLAP), + LEVEL_UP_MOVE(25, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(31, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(37, MOVE_BELLY_DRUM), + LEVEL_UP_MOVE(43, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +const u16 gPoliwhirlLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BUBBLE), + LEVEL_UP_MOVE( 1, MOVE_HYPNOSIS), + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 7, MOVE_HYPNOSIS), + LEVEL_UP_MOVE(13, MOVE_WATER_GUN), + LEVEL_UP_MOVE(19, MOVE_DOUBLE_SLAP), + LEVEL_UP_MOVE(27, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(35, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(43, MOVE_BELLY_DRUM), + LEVEL_UP_MOVE(51, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +const u16 gPoliwrathLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 1, MOVE_HYPNOSIS), + LEVEL_UP_MOVE( 1, MOVE_DOUBLE_SLAP), + LEVEL_UP_MOVE( 1, MOVE_SUBMISSION), + LEVEL_UP_MOVE(35, MOVE_SUBMISSION), + LEVEL_UP_MOVE(51, MOVE_MIND_READER), + LEVEL_UP_END +}; + +const u16 gAbraLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TELEPORT), + LEVEL_UP_END +}; + +const u16 gKadabraLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TELEPORT), + LEVEL_UP_MOVE( 1, MOVE_KINESIS), + LEVEL_UP_MOVE( 1, MOVE_CONFUSION), + LEVEL_UP_MOVE(16, MOVE_CONFUSION), + LEVEL_UP_MOVE(18, MOVE_DISABLE), + LEVEL_UP_MOVE(21, MOVE_PSYBEAM), + LEVEL_UP_MOVE(23, MOVE_REFLECT), + LEVEL_UP_MOVE(25, MOVE_RECOVER), + LEVEL_UP_MOVE(30, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(33, MOVE_ROLE_PLAY), + LEVEL_UP_MOVE(36, MOVE_PSYCHIC), + LEVEL_UP_MOVE(43, MOVE_TRICK), + LEVEL_UP_END +}; + +const u16 gAlakazamLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TELEPORT), + LEVEL_UP_MOVE( 1, MOVE_KINESIS), + LEVEL_UP_MOVE( 1, MOVE_CONFUSION), + LEVEL_UP_MOVE(16, MOVE_CONFUSION), + LEVEL_UP_MOVE(18, MOVE_DISABLE), + LEVEL_UP_MOVE(21, MOVE_PSYBEAM), + LEVEL_UP_MOVE(23, MOVE_REFLECT), + LEVEL_UP_MOVE(25, MOVE_RECOVER), + LEVEL_UP_MOVE(30, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(33, MOVE_CALM_MIND), + LEVEL_UP_MOVE(36, MOVE_PSYCHIC), + LEVEL_UP_MOVE(43, MOVE_TRICK), + LEVEL_UP_END +}; + +const u16 gMachopLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_LOW_KICK), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 7, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(13, MOVE_KARATE_CHOP), + LEVEL_UP_MOVE(19, MOVE_SEISMIC_TOSS), + LEVEL_UP_MOVE(22, MOVE_FORESIGHT), + LEVEL_UP_MOVE(25, MOVE_REVENGE), + LEVEL_UP_MOVE(31, MOVE_VITAL_THROW), + LEVEL_UP_MOVE(37, MOVE_SUBMISSION), + LEVEL_UP_MOVE(40, MOVE_CROSS_CHOP), + LEVEL_UP_MOVE(43, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(49, MOVE_DYNAMIC_PUNCH), + LEVEL_UP_END +}; + +const u16 gMachokeLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_LOW_KICK), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE( 7, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(13, MOVE_KARATE_CHOP), + LEVEL_UP_MOVE(19, MOVE_SEISMIC_TOSS), + LEVEL_UP_MOVE(22, MOVE_FORESIGHT), + LEVEL_UP_MOVE(25, MOVE_REVENGE), + LEVEL_UP_MOVE(33, MOVE_VITAL_THROW), + LEVEL_UP_MOVE(41, MOVE_SUBMISSION), + LEVEL_UP_MOVE(46, MOVE_CROSS_CHOP), + LEVEL_UP_MOVE(51, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(59, MOVE_DYNAMIC_PUNCH), + LEVEL_UP_END +}; + +const u16 gMachampLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_LOW_KICK), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE( 7, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(13, MOVE_KARATE_CHOP), + LEVEL_UP_MOVE(19, MOVE_SEISMIC_TOSS), + LEVEL_UP_MOVE(22, MOVE_FORESIGHT), + LEVEL_UP_MOVE(25, MOVE_REVENGE), + LEVEL_UP_MOVE(33, MOVE_VITAL_THROW), + LEVEL_UP_MOVE(41, MOVE_SUBMISSION), + LEVEL_UP_MOVE(46, MOVE_CROSS_CHOP), + LEVEL_UP_MOVE(51, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(59, MOVE_DYNAMIC_PUNCH), + LEVEL_UP_END +}; + +const u16 gBellsproutLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_VINE_WHIP), + LEVEL_UP_MOVE( 6, MOVE_GROWTH), + LEVEL_UP_MOVE(11, MOVE_WRAP), + LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(17, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(19, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(23, MOVE_ACID), + LEVEL_UP_MOVE(30, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE(37, MOVE_RAZOR_LEAF), + LEVEL_UP_MOVE(45, MOVE_SLAM), + LEVEL_UP_END +}; + +const u16 gWeepinbellLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_VINE_WHIP), + LEVEL_UP_MOVE( 1, MOVE_GROWTH), + LEVEL_UP_MOVE( 1, MOVE_WRAP), + LEVEL_UP_MOVE( 6, MOVE_GROWTH), + LEVEL_UP_MOVE(11, MOVE_WRAP), + LEVEL_UP_MOVE(15, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(17, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(19, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(24, MOVE_ACID), + LEVEL_UP_MOVE(33, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE(42, MOVE_RAZOR_LEAF), + LEVEL_UP_MOVE(54, MOVE_SLAM), + LEVEL_UP_END +}; + +const u16 gVictreebelLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_VINE_WHIP), + LEVEL_UP_MOVE( 1, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE( 1, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE( 1, MOVE_RAZOR_LEAF), + LEVEL_UP_END +}; + +const u16 gTentacoolLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POISON_STING), + LEVEL_UP_MOVE( 6, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(12, MOVE_CONSTRICT), + LEVEL_UP_MOVE(19, MOVE_ACID), + LEVEL_UP_MOVE(25, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(30, MOVE_WRAP), + LEVEL_UP_MOVE(36, MOVE_BARRIER), + LEVEL_UP_MOVE(43, MOVE_SCREECH), + LEVEL_UP_MOVE(49, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +const u16 gTentacruelLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POISON_STING), + LEVEL_UP_MOVE( 1, MOVE_SUPERSONIC), + LEVEL_UP_MOVE( 1, MOVE_CONSTRICT), + LEVEL_UP_MOVE( 6, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(12, MOVE_CONSTRICT), + LEVEL_UP_MOVE(19, MOVE_ACID), + LEVEL_UP_MOVE(25, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(30, MOVE_WRAP), + LEVEL_UP_MOVE(38, MOVE_BARRIER), + LEVEL_UP_MOVE(47, MOVE_SCREECH), + LEVEL_UP_MOVE(55, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +const u16 gGeodudeLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE( 6, MOVE_MUD_SPORT), + LEVEL_UP_MOVE(11, MOVE_ROCK_THROW), + LEVEL_UP_MOVE(16, MOVE_MAGNITUDE), + LEVEL_UP_MOVE(21, MOVE_SELF_DESTRUCT), + LEVEL_UP_MOVE(26, MOVE_ROLLOUT), + LEVEL_UP_MOVE(31, MOVE_ROCK_BLAST), + LEVEL_UP_MOVE(36, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(41, MOVE_EXPLOSION), + LEVEL_UP_MOVE(46, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +const u16 gGravelerLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE( 1, MOVE_MUD_SPORT), + LEVEL_UP_MOVE( 1, MOVE_ROCK_THROW), + LEVEL_UP_MOVE( 6, MOVE_MUD_SPORT), + LEVEL_UP_MOVE(11, MOVE_ROCK_THROW), + LEVEL_UP_MOVE(16, MOVE_MAGNITUDE), + LEVEL_UP_MOVE(21, MOVE_SELF_DESTRUCT), + LEVEL_UP_MOVE(29, MOVE_ROLLOUT), + LEVEL_UP_MOVE(37, MOVE_ROCK_BLAST), + LEVEL_UP_MOVE(45, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(53, MOVE_EXPLOSION), + LEVEL_UP_MOVE(62, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +const u16 gGolemLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE( 1, MOVE_MUD_SPORT), + LEVEL_UP_MOVE( 1, MOVE_ROCK_THROW), + LEVEL_UP_MOVE( 6, MOVE_MUD_SPORT), + LEVEL_UP_MOVE(11, MOVE_ROCK_THROW), + LEVEL_UP_MOVE(16, MOVE_MAGNITUDE), + LEVEL_UP_MOVE(21, MOVE_SELF_DESTRUCT), + LEVEL_UP_MOVE(29, MOVE_ROLLOUT), + LEVEL_UP_MOVE(37, MOVE_ROCK_BLAST), + LEVEL_UP_MOVE(45, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(53, MOVE_EXPLOSION), + LEVEL_UP_MOVE(62, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +const u16 gPonytaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 5, MOVE_GROWL), + LEVEL_UP_MOVE( 9, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE(14, MOVE_EMBER), + LEVEL_UP_MOVE(19, MOVE_STOMP), + LEVEL_UP_MOVE(25, MOVE_FIRE_SPIN), + LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(38, MOVE_AGILITY), + LEVEL_UP_MOVE(45, MOVE_BOUNCE), + LEVEL_UP_MOVE(53, MOVE_FIRE_BLAST), + LEVEL_UP_END +}; + +const u16 gRapidashLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 1, MOVE_EMBER), + LEVEL_UP_MOVE( 5, MOVE_GROWL), + LEVEL_UP_MOVE( 9, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE(14, MOVE_EMBER), + LEVEL_UP_MOVE(19, MOVE_STOMP), + LEVEL_UP_MOVE(25, MOVE_FIRE_SPIN), + LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(38, MOVE_AGILITY), + LEVEL_UP_MOVE(40, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(50, MOVE_BOUNCE), + LEVEL_UP_MOVE(63, MOVE_FIRE_BLAST), + LEVEL_UP_END +}; + +const u16 gSlowpokeLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_CURSE), + LEVEL_UP_MOVE( 1, MOVE_YAWN), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 6, MOVE_GROWL), + LEVEL_UP_MOVE(15, MOVE_WATER_GUN), + LEVEL_UP_MOVE(20, MOVE_CONFUSION), + LEVEL_UP_MOVE(29, MOVE_DISABLE), + LEVEL_UP_MOVE(34, MOVE_HEADBUTT), + LEVEL_UP_MOVE(43, MOVE_AMNESIA), + LEVEL_UP_MOVE(48, MOVE_PSYCHIC), + LEVEL_UP_END +}; + +const u16 gSlowbroLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_CURSE), + LEVEL_UP_MOVE( 1, MOVE_YAWN), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 6, MOVE_GROWL), + LEVEL_UP_MOVE(15, MOVE_WATER_GUN), + LEVEL_UP_MOVE(20, MOVE_CONFUSION), + LEVEL_UP_MOVE(29, MOVE_DISABLE), + LEVEL_UP_MOVE(34, MOVE_HEADBUTT), + LEVEL_UP_MOVE(37, MOVE_WITHDRAW), + LEVEL_UP_MOVE(46, MOVE_AMNESIA), + LEVEL_UP_MOVE(54, MOVE_PSYCHIC), + LEVEL_UP_END +}; + +const u16 gMagnemiteLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_METAL_SOUND), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 6, MOVE_THUNDER_SHOCK), + LEVEL_UP_MOVE(11, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(16, MOVE_SONIC_BOOM), + LEVEL_UP_MOVE(21, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE(26, MOVE_SPARK), + LEVEL_UP_MOVE(32, MOVE_LOCK_ON), + LEVEL_UP_MOVE(38, MOVE_SWIFT), + LEVEL_UP_MOVE(44, MOVE_SCREECH), + LEVEL_UP_MOVE(50, MOVE_ZAP_CANNON), + LEVEL_UP_END +}; + +const u16 gMagnetonLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_METAL_SOUND), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_SHOCK), + LEVEL_UP_MOVE( 1, MOVE_SUPERSONIC), + LEVEL_UP_MOVE( 6, MOVE_THUNDER_SHOCK), + LEVEL_UP_MOVE(11, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(16, MOVE_SONIC_BOOM), + LEVEL_UP_MOVE(21, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE(26, MOVE_SPARK), + LEVEL_UP_MOVE(35, MOVE_LOCK_ON), + LEVEL_UP_MOVE(44, MOVE_TRI_ATTACK), + LEVEL_UP_MOVE(53, MOVE_SCREECH), + LEVEL_UP_MOVE(62, MOVE_ZAP_CANNON), + LEVEL_UP_END +}; + +const u16 gFarfetchdLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_PECK), + LEVEL_UP_MOVE( 6, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(11, MOVE_LEER), + LEVEL_UP_MOVE(16, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(21, MOVE_KNOCK_OFF), + LEVEL_UP_MOVE(26, MOVE_FURY_CUTTER), + LEVEL_UP_MOVE(31, MOVE_SWORDS_DANCE), + LEVEL_UP_MOVE(36, MOVE_AGILITY), + LEVEL_UP_MOVE(41, MOVE_SLASH), + LEVEL_UP_MOVE(46, MOVE_FALSE_SWIPE), + LEVEL_UP_END +}; + +const u16 gDoduoLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_PECK), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 9, MOVE_PURSUIT), + LEVEL_UP_MOVE(13, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(21, MOVE_TRI_ATTACK), + LEVEL_UP_MOVE(25, MOVE_RAGE), + LEVEL_UP_MOVE(33, MOVE_UPROAR), + LEVEL_UP_MOVE(37, MOVE_DRILL_PECK), + LEVEL_UP_MOVE(45, MOVE_AGILITY), + LEVEL_UP_END +}; + +const u16 gDodrioLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_PECK), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_PURSUIT), + LEVEL_UP_MOVE( 1, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE( 9, MOVE_PURSUIT), + LEVEL_UP_MOVE(13, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(21, MOVE_TRI_ATTACK), + LEVEL_UP_MOVE(25, MOVE_RAGE), + LEVEL_UP_MOVE(38, MOVE_UPROAR), + LEVEL_UP_MOVE(47, MOVE_DRILL_PECK), + LEVEL_UP_MOVE(60, MOVE_AGILITY), + LEVEL_UP_END +}; + +const u16 gSeelLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_HEADBUTT), + LEVEL_UP_MOVE( 9, MOVE_GROWL), + LEVEL_UP_MOVE(17, MOVE_ICY_WIND), + LEVEL_UP_MOVE(21, MOVE_AURORA_BEAM), + LEVEL_UP_MOVE(29, MOVE_REST), + LEVEL_UP_MOVE(37, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(41, MOVE_ICE_BEAM), + LEVEL_UP_MOVE(49, MOVE_SAFEGUARD), + LEVEL_UP_END +}; + +const u16 gDewgongLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_HEADBUTT), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_ICY_WIND), + LEVEL_UP_MOVE( 1, MOVE_AURORA_BEAM), + LEVEL_UP_MOVE( 9, MOVE_GROWL), + LEVEL_UP_MOVE(17, MOVE_ICY_WIND), + LEVEL_UP_MOVE(21, MOVE_AURORA_BEAM), + LEVEL_UP_MOVE(29, MOVE_REST), + LEVEL_UP_MOVE(34, MOVE_SHEER_COLD), + LEVEL_UP_MOVE(42, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(51, MOVE_ICE_BEAM), + LEVEL_UP_MOVE(64, MOVE_SAFEGUARD), + LEVEL_UP_END +}; + +const u16 gGrimerLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POISON_GAS), + LEVEL_UP_MOVE( 1, MOVE_POUND), + LEVEL_UP_MOVE( 4, MOVE_HARDEN), + LEVEL_UP_MOVE( 8, MOVE_DISABLE), + LEVEL_UP_MOVE(13, MOVE_SLUDGE), + LEVEL_UP_MOVE(19, MOVE_MINIMIZE), + LEVEL_UP_MOVE(26, MOVE_SCREECH), + LEVEL_UP_MOVE(34, MOVE_ACID_ARMOR), + LEVEL_UP_MOVE(43, MOVE_SLUDGE_BOMB), + LEVEL_UP_MOVE(53, MOVE_MEMENTO), + LEVEL_UP_END +}; + +const u16 gMukLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POISON_GAS), + LEVEL_UP_MOVE( 1, MOVE_POUND), + LEVEL_UP_MOVE( 1, MOVE_HARDEN), + LEVEL_UP_MOVE( 4, MOVE_HARDEN), + LEVEL_UP_MOVE( 8, MOVE_DISABLE), + LEVEL_UP_MOVE(13, MOVE_SLUDGE), + LEVEL_UP_MOVE(19, MOVE_MINIMIZE), + LEVEL_UP_MOVE(26, MOVE_SCREECH), + LEVEL_UP_MOVE(34, MOVE_ACID_ARMOR), + LEVEL_UP_MOVE(47, MOVE_SLUDGE_BOMB), + LEVEL_UP_MOVE(61, MOVE_MEMENTO), + LEVEL_UP_END +}; + +const u16 gShellderLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_WITHDRAW), + LEVEL_UP_MOVE( 9, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(17, MOVE_AURORA_BEAM), + LEVEL_UP_MOVE(25, MOVE_PROTECT), + LEVEL_UP_MOVE(33, MOVE_LEER), + LEVEL_UP_MOVE(41, MOVE_CLAMP), + LEVEL_UP_MOVE(49, MOVE_ICE_BEAM), + LEVEL_UP_END +}; + +const u16 gCloysterLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WITHDRAW), + LEVEL_UP_MOVE( 1, MOVE_SUPERSONIC), + LEVEL_UP_MOVE( 1, MOVE_AURORA_BEAM), + LEVEL_UP_MOVE( 1, MOVE_PROTECT), + LEVEL_UP_MOVE(33, MOVE_SPIKES), + LEVEL_UP_MOVE(41, MOVE_SPIKE_CANNON), + LEVEL_UP_END +}; + +const u16 gGastlyLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_HYPNOSIS), + LEVEL_UP_MOVE( 1, MOVE_LICK), + LEVEL_UP_MOVE( 8, MOVE_SPITE), + LEVEL_UP_MOVE(13, MOVE_MEAN_LOOK), + LEVEL_UP_MOVE(16, MOVE_CURSE), + LEVEL_UP_MOVE(21, MOVE_NIGHT_SHADE), + LEVEL_UP_MOVE(28, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(33, MOVE_DREAM_EATER), + LEVEL_UP_MOVE(36, MOVE_DESTINY_BOND), + LEVEL_UP_END +}; + +const u16 gHaunterLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_HYPNOSIS), + LEVEL_UP_MOVE( 1, MOVE_LICK), + LEVEL_UP_MOVE( 1, MOVE_SPITE), + LEVEL_UP_MOVE( 8, MOVE_SPITE), + LEVEL_UP_MOVE(13, MOVE_MEAN_LOOK), + LEVEL_UP_MOVE(16, MOVE_CURSE), + LEVEL_UP_MOVE(21, MOVE_NIGHT_SHADE), + LEVEL_UP_MOVE(25, MOVE_SHADOW_PUNCH), + LEVEL_UP_MOVE(31, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(39, MOVE_DREAM_EATER), + LEVEL_UP_MOVE(48, MOVE_DESTINY_BOND), + LEVEL_UP_END +}; + +const u16 gGengarLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_HYPNOSIS), + LEVEL_UP_MOVE( 1, MOVE_LICK), + LEVEL_UP_MOVE( 1, MOVE_SPITE), + LEVEL_UP_MOVE( 8, MOVE_SPITE), + LEVEL_UP_MOVE(13, MOVE_MEAN_LOOK), + LEVEL_UP_MOVE(16, MOVE_CURSE), + LEVEL_UP_MOVE(21, MOVE_NIGHT_SHADE), + LEVEL_UP_MOVE(25, MOVE_SHADOW_PUNCH), + LEVEL_UP_MOVE(31, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(39, MOVE_DREAM_EATER), + LEVEL_UP_MOVE(48, MOVE_DESTINY_BOND), + LEVEL_UP_END +}; + +const u16 gOnixLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_SCREECH), + LEVEL_UP_MOVE( 9, MOVE_BIND), + LEVEL_UP_MOVE(13, MOVE_ROCK_THROW), + LEVEL_UP_MOVE(21, MOVE_HARDEN), + LEVEL_UP_MOVE(25, MOVE_RAGE), + LEVEL_UP_MOVE(33, MOVE_SANDSTORM), + LEVEL_UP_MOVE(37, MOVE_SLAM), + LEVEL_UP_MOVE(45, MOVE_IRON_TAIL), + LEVEL_UP_MOVE(49, MOVE_SAND_TOMB), + LEVEL_UP_MOVE(57, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +const u16 gDrowzeeLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POUND), + LEVEL_UP_MOVE( 1, MOVE_HYPNOSIS), + LEVEL_UP_MOVE(10, MOVE_DISABLE), + LEVEL_UP_MOVE(18, MOVE_CONFUSION), + LEVEL_UP_MOVE(25, MOVE_HEADBUTT), + LEVEL_UP_MOVE(31, MOVE_POISON_GAS), + LEVEL_UP_MOVE(36, MOVE_MEDITATE), + LEVEL_UP_MOVE(40, MOVE_PSYCHIC), + LEVEL_UP_MOVE(43, MOVE_PSYCH_UP), + LEVEL_UP_MOVE(45, MOVE_FUTURE_SIGHT), + LEVEL_UP_END +}; + +const u16 gHypnoLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POUND), + LEVEL_UP_MOVE( 1, MOVE_HYPNOSIS), + LEVEL_UP_MOVE( 1, MOVE_DISABLE), + LEVEL_UP_MOVE( 1, MOVE_CONFUSION), + LEVEL_UP_MOVE(10, MOVE_DISABLE), + LEVEL_UP_MOVE(18, MOVE_CONFUSION), + LEVEL_UP_MOVE(25, MOVE_HEADBUTT), + LEVEL_UP_MOVE(33, MOVE_POISON_GAS), + LEVEL_UP_MOVE(40, MOVE_MEDITATE), + LEVEL_UP_MOVE(49, MOVE_PSYCHIC), + LEVEL_UP_MOVE(55, MOVE_PSYCH_UP), + LEVEL_UP_MOVE(60, MOVE_FUTURE_SIGHT), + LEVEL_UP_END +}; + +const u16 gKrabbyLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BUBBLE), + LEVEL_UP_MOVE( 5, MOVE_LEER), + LEVEL_UP_MOVE(12, MOVE_VICE_GRIP), + LEVEL_UP_MOVE(16, MOVE_HARDEN), + LEVEL_UP_MOVE(23, MOVE_MUD_SHOT), + LEVEL_UP_MOVE(27, MOVE_STOMP), + LEVEL_UP_MOVE(34, MOVE_GUILLOTINE), + LEVEL_UP_MOVE(41, MOVE_PROTECT), + LEVEL_UP_MOVE(45, MOVE_CRABHAMMER), + LEVEL_UP_END +}; + +const u16 gKinglerLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BUBBLE), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_VICE_GRIP), + LEVEL_UP_MOVE( 5, MOVE_LEER), + LEVEL_UP_MOVE(12, MOVE_VICE_GRIP), + LEVEL_UP_MOVE(16, MOVE_HARDEN), + LEVEL_UP_MOVE(23, MOVE_MUD_SHOT), + LEVEL_UP_MOVE(27, MOVE_STOMP), + LEVEL_UP_MOVE(38, MOVE_GUILLOTINE), + LEVEL_UP_MOVE(49, MOVE_PROTECT), + LEVEL_UP_MOVE(57, MOVE_CRABHAMMER), + LEVEL_UP_END +}; + +const u16 gVoltorbLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_CHARGE), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 8, MOVE_SCREECH), + LEVEL_UP_MOVE(15, MOVE_SONIC_BOOM), + LEVEL_UP_MOVE(21, MOVE_SPARK), + LEVEL_UP_MOVE(27, MOVE_SELF_DESTRUCT), + LEVEL_UP_MOVE(32, MOVE_ROLLOUT), + LEVEL_UP_MOVE(37, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(42, MOVE_SWIFT), + LEVEL_UP_MOVE(46, MOVE_EXPLOSION), + LEVEL_UP_MOVE(49, MOVE_MIRROR_COAT), + LEVEL_UP_END +}; + +const u16 gElectrodeLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_CHARGE), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_SCREECH), + LEVEL_UP_MOVE( 1, MOVE_SONIC_BOOM), + LEVEL_UP_MOVE( 8, MOVE_SCREECH), + LEVEL_UP_MOVE(15, MOVE_SONIC_BOOM), + LEVEL_UP_MOVE(21, MOVE_SPARK), + LEVEL_UP_MOVE(27, MOVE_SELF_DESTRUCT), + LEVEL_UP_MOVE(34, MOVE_ROLLOUT), + LEVEL_UP_MOVE(41, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(48, MOVE_SWIFT), + LEVEL_UP_MOVE(54, MOVE_EXPLOSION), + LEVEL_UP_MOVE(59, MOVE_MIRROR_COAT), + LEVEL_UP_END +}; + +const u16 gExeggcuteLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BARRAGE), + LEVEL_UP_MOVE( 1, MOVE_UPROAR), + LEVEL_UP_MOVE( 1, MOVE_HYPNOSIS), + LEVEL_UP_MOVE( 7, MOVE_REFLECT), + LEVEL_UP_MOVE(13, MOVE_LEECH_SEED), + LEVEL_UP_MOVE(19, MOVE_CONFUSION), + LEVEL_UP_MOVE(25, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(31, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(37, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(43, MOVE_SOLAR_BEAM), + LEVEL_UP_END +}; + +const u16 gExeggutorLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BARRAGE), + LEVEL_UP_MOVE( 1, MOVE_HYPNOSIS), + LEVEL_UP_MOVE( 1, MOVE_CONFUSION), + LEVEL_UP_MOVE(19, MOVE_STOMP), + LEVEL_UP_MOVE(31, MOVE_EGG_BOMB), + LEVEL_UP_END +}; + +const u16 gCuboneLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 5, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 9, MOVE_BONE_CLUB), + LEVEL_UP_MOVE(13, MOVE_HEADBUTT), + LEVEL_UP_MOVE(17, MOVE_LEER), + LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(25, MOVE_BONEMERANG), + LEVEL_UP_MOVE(29, MOVE_RAGE), + LEVEL_UP_MOVE(33, MOVE_FALSE_SWIPE), + LEVEL_UP_MOVE(37, MOVE_THRASH), + LEVEL_UP_MOVE(41, MOVE_BONE_RUSH), + LEVEL_UP_MOVE(45, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +const u16 gMarowakLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 1, MOVE_BONE_CLUB), + LEVEL_UP_MOVE( 1, MOVE_HEADBUTT), + LEVEL_UP_MOVE( 5, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 9, MOVE_BONE_CLUB), + LEVEL_UP_MOVE(13, MOVE_HEADBUTT), + LEVEL_UP_MOVE(17, MOVE_LEER), + LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(25, MOVE_BONEMERANG), + LEVEL_UP_MOVE(32, MOVE_RAGE), + LEVEL_UP_MOVE(39, MOVE_FALSE_SWIPE), + LEVEL_UP_MOVE(46, MOVE_THRASH), + LEVEL_UP_MOVE(53, MOVE_BONE_RUSH), + LEVEL_UP_MOVE(61, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +const u16 gHitmonleeLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_REVENGE), + LEVEL_UP_MOVE( 1, MOVE_DOUBLE_KICK), + LEVEL_UP_MOVE( 6, MOVE_MEDITATE), + LEVEL_UP_MOVE(11, MOVE_ROLLING_KICK), + LEVEL_UP_MOVE(16, MOVE_JUMP_KICK), + LEVEL_UP_MOVE(20, MOVE_BRICK_BREAK), + LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(26, MOVE_HI_JUMP_KICK), + LEVEL_UP_MOVE(31, MOVE_MIND_READER), + LEVEL_UP_MOVE(36, MOVE_FORESIGHT), + LEVEL_UP_MOVE(41, MOVE_ENDURE), + LEVEL_UP_MOVE(46, MOVE_MEGA_KICK), + LEVEL_UP_MOVE(51, MOVE_REVERSAL), + LEVEL_UP_END +}; + +const u16 gHitmonchanLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_REVENGE), + LEVEL_UP_MOVE( 1, MOVE_COMET_PUNCH), + LEVEL_UP_MOVE( 7, MOVE_AGILITY), + LEVEL_UP_MOVE(13, MOVE_PURSUIT), + LEVEL_UP_MOVE(20, MOVE_MACH_PUNCH), + LEVEL_UP_MOVE(26, MOVE_THUNDER_PUNCH), + LEVEL_UP_MOVE(26, MOVE_ICE_PUNCH), + LEVEL_UP_MOVE(26, MOVE_FIRE_PUNCH), + LEVEL_UP_MOVE(32, MOVE_SKY_UPPERCUT), + LEVEL_UP_MOVE(38, MOVE_MEGA_PUNCH), + LEVEL_UP_MOVE(44, MOVE_DETECT), + LEVEL_UP_MOVE(50, MOVE_COUNTER), + LEVEL_UP_END +}; + +const u16 gLickitungLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_LICK), + LEVEL_UP_MOVE( 7, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(12, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE(18, MOVE_KNOCK_OFF), + LEVEL_UP_MOVE(23, MOVE_STOMP), + LEVEL_UP_MOVE(29, MOVE_WRAP), + LEVEL_UP_MOVE(34, MOVE_DISABLE), + LEVEL_UP_MOVE(40, MOVE_SLAM), + LEVEL_UP_MOVE(45, MOVE_SCREECH), + LEVEL_UP_MOVE(51, MOVE_REFRESH), + LEVEL_UP_END +}; + +const u16 gKoffingLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POISON_GAS), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 9, MOVE_SMOG), + LEVEL_UP_MOVE(17, MOVE_SELF_DESTRUCT), + LEVEL_UP_MOVE(21, MOVE_SLUDGE), + LEVEL_UP_MOVE(25, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE(33, MOVE_HAZE), + LEVEL_UP_MOVE(41, MOVE_EXPLOSION), + LEVEL_UP_MOVE(45, MOVE_DESTINY_BOND), + LEVEL_UP_MOVE(49, MOVE_MEMENTO), + LEVEL_UP_END +}; + +const u16 gWeezingLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POISON_GAS), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_SMOG), + LEVEL_UP_MOVE( 1, MOVE_SELF_DESTRUCT), + LEVEL_UP_MOVE( 9, MOVE_SMOG), + LEVEL_UP_MOVE(17, MOVE_SELF_DESTRUCT), + LEVEL_UP_MOVE(21, MOVE_SLUDGE), + LEVEL_UP_MOVE(25, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE(33, MOVE_HAZE), + LEVEL_UP_MOVE(44, MOVE_EXPLOSION), + LEVEL_UP_MOVE(51, MOVE_DESTINY_BOND), + LEVEL_UP_MOVE(58, MOVE_MEMENTO), + LEVEL_UP_END +}; + +const u16 gRhyhornLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_HORN_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE(10, MOVE_STOMP), + LEVEL_UP_MOVE(15, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(24, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(29, MOVE_ROCK_BLAST), + LEVEL_UP_MOVE(38, MOVE_HORN_DRILL), + LEVEL_UP_MOVE(43, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(52, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(57, MOVE_MEGAHORN), + LEVEL_UP_END +}; + +const u16 gRhydonLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_HORN_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 1, MOVE_STOMP), + LEVEL_UP_MOVE( 1, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(10, MOVE_STOMP), + LEVEL_UP_MOVE(15, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(24, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(29, MOVE_ROCK_BLAST), + LEVEL_UP_MOVE(38, MOVE_HORN_DRILL), + LEVEL_UP_MOVE(46, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(58, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(66, MOVE_MEGAHORN), + LEVEL_UP_END +}; + +const u16 gChanseyLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POUND), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 5, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 9, MOVE_REFRESH), + LEVEL_UP_MOVE(13, MOVE_SOFT_BOILED), + LEVEL_UP_MOVE(17, MOVE_DOUBLE_SLAP), + LEVEL_UP_MOVE(23, MOVE_MINIMIZE), + LEVEL_UP_MOVE(29, MOVE_SING), + LEVEL_UP_MOVE(35, MOVE_EGG_BOMB), + LEVEL_UP_MOVE(41, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE(49, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(57, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +const u16 gTangelaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_INGRAIN), + LEVEL_UP_MOVE( 1, MOVE_CONSTRICT), + LEVEL_UP_MOVE( 4, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(10, MOVE_ABSORB), + LEVEL_UP_MOVE(13, MOVE_GROWTH), + LEVEL_UP_MOVE(19, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(22, MOVE_VINE_WHIP), + LEVEL_UP_MOVE(28, MOVE_BIND), + LEVEL_UP_MOVE(31, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE(37, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(40, MOVE_SLAM), + LEVEL_UP_MOVE(46, MOVE_TICKLE), + LEVEL_UP_END +}; + +const u16 gKangaskhanLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_COMET_PUNCH), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 7, MOVE_BITE), + LEVEL_UP_MOVE(13, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE(19, MOVE_FAKE_OUT), + LEVEL_UP_MOVE(25, MOVE_MEGA_PUNCH), + LEVEL_UP_MOVE(31, MOVE_RAGE), + LEVEL_UP_MOVE(37, MOVE_ENDURE), + LEVEL_UP_MOVE(43, MOVE_DIZZY_PUNCH), + LEVEL_UP_MOVE(49, MOVE_REVERSAL), + LEVEL_UP_END +}; + +const u16 gHorseaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BUBBLE), + LEVEL_UP_MOVE( 8, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE(15, MOVE_LEER), + LEVEL_UP_MOVE(22, MOVE_WATER_GUN), + LEVEL_UP_MOVE(29, MOVE_TWISTER), + LEVEL_UP_MOVE(36, MOVE_AGILITY), + LEVEL_UP_MOVE(43, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(50, MOVE_DRAGON_DANCE), + LEVEL_UP_END +}; + +const u16 gSeadraLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BUBBLE), + LEVEL_UP_MOVE( 1, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 8, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE(15, MOVE_LEER), + LEVEL_UP_MOVE(22, MOVE_WATER_GUN), + LEVEL_UP_MOVE(29, MOVE_TWISTER), + LEVEL_UP_MOVE(40, MOVE_AGILITY), + LEVEL_UP_MOVE(51, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(62, MOVE_DRAGON_DANCE), + LEVEL_UP_END +}; + +const u16 gGoldeenLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_PECK), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 1, MOVE_WATER_SPORT), + LEVEL_UP_MOVE(10, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(15, MOVE_HORN_ATTACK), + LEVEL_UP_MOVE(24, MOVE_FLAIL), + LEVEL_UP_MOVE(29, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(38, MOVE_WATERFALL), + LEVEL_UP_MOVE(43, MOVE_HORN_DRILL), + LEVEL_UP_MOVE(52, MOVE_AGILITY), + LEVEL_UP_END +}; + +const u16 gSeakingLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_PECK), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 1, MOVE_WATER_SPORT), + LEVEL_UP_MOVE( 1, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(10, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(15, MOVE_HORN_ATTACK), + LEVEL_UP_MOVE(24, MOVE_FLAIL), + LEVEL_UP_MOVE(29, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(41, MOVE_WATERFALL), + LEVEL_UP_MOVE(49, MOVE_HORN_DRILL), + LEVEL_UP_MOVE(61, MOVE_AGILITY), + LEVEL_UP_END +}; + +const u16 gStaryuLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_HARDEN), + LEVEL_UP_MOVE( 6, MOVE_WATER_GUN), + LEVEL_UP_MOVE(10, MOVE_RAPID_SPIN), + LEVEL_UP_MOVE(15, MOVE_RECOVER), + LEVEL_UP_MOVE(19, MOVE_CAMOUFLAGE), + LEVEL_UP_MOVE(24, MOVE_SWIFT), + LEVEL_UP_MOVE(28, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(33, MOVE_MINIMIZE), + LEVEL_UP_MOVE(37, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(42, MOVE_COSMIC_POWER), + LEVEL_UP_MOVE(46, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +const u16 gStarmieLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 1, MOVE_RAPID_SPIN), + LEVEL_UP_MOVE( 1, MOVE_RECOVER), + LEVEL_UP_MOVE( 1, MOVE_SWIFT), + LEVEL_UP_MOVE(33, MOVE_CONFUSE_RAY), + LEVEL_UP_END +}; + +const u16 gMrmimeLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BARRIER), + LEVEL_UP_MOVE( 5, MOVE_CONFUSION), + LEVEL_UP_MOVE( 9, MOVE_SUBSTITUTE), + LEVEL_UP_MOVE(13, MOVE_MEDITATE), + LEVEL_UP_MOVE(17, MOVE_DOUBLE_SLAP), + LEVEL_UP_MOVE(21, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(21, MOVE_REFLECT), + LEVEL_UP_MOVE(25, MOVE_ENCORE), + LEVEL_UP_MOVE(29, MOVE_PSYBEAM), + LEVEL_UP_MOVE(33, MOVE_RECYCLE), + LEVEL_UP_MOVE(37, MOVE_TRICK), + LEVEL_UP_MOVE(41, MOVE_ROLE_PLAY), + LEVEL_UP_MOVE(45, MOVE_PSYCHIC), + LEVEL_UP_MOVE(49, MOVE_BATON_PASS), + LEVEL_UP_MOVE(53, MOVE_SAFEGUARD), + LEVEL_UP_END +}; + +const u16 gScytherLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 6, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(11, MOVE_PURSUIT), + LEVEL_UP_MOVE(16, MOVE_FALSE_SWIPE), + LEVEL_UP_MOVE(21, MOVE_AGILITY), + LEVEL_UP_MOVE(26, MOVE_WING_ATTACK), + LEVEL_UP_MOVE(31, MOVE_SLASH), + LEVEL_UP_MOVE(36, MOVE_SWORDS_DANCE), + LEVEL_UP_MOVE(41, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE(46, MOVE_FURY_CUTTER), + LEVEL_UP_END +}; + +const u16 gJynxLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POUND), + LEVEL_UP_MOVE( 1, MOVE_LICK), + LEVEL_UP_MOVE( 1, MOVE_LOVELY_KISS), + LEVEL_UP_MOVE( 1, MOVE_POWDER_SNOW), + LEVEL_UP_MOVE( 9, MOVE_LOVELY_KISS), + LEVEL_UP_MOVE(13, MOVE_POWDER_SNOW), + LEVEL_UP_MOVE(21, MOVE_DOUBLE_SLAP), + LEVEL_UP_MOVE(25, MOVE_ICE_PUNCH), + LEVEL_UP_MOVE(35, MOVE_MEAN_LOOK), + LEVEL_UP_MOVE(41, MOVE_FAKE_TEARS), + LEVEL_UP_MOVE(51, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(57, MOVE_PERISH_SONG), + LEVEL_UP_MOVE(67, MOVE_BLIZZARD), + LEVEL_UP_END +}; + +const u16 gElectabuzzLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_PUNCH), + LEVEL_UP_MOVE( 9, MOVE_THUNDER_PUNCH), + LEVEL_UP_MOVE(17, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(25, MOVE_SWIFT), + LEVEL_UP_MOVE(36, MOVE_SCREECH), + LEVEL_UP_MOVE(47, MOVE_THUNDERBOLT), + LEVEL_UP_MOVE(58, MOVE_THUNDER), + LEVEL_UP_END +}; + +const u16 gMagmarLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_EMBER), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_SMOG), + LEVEL_UP_MOVE( 1, MOVE_FIRE_PUNCH), + LEVEL_UP_MOVE( 7, MOVE_LEER), + LEVEL_UP_MOVE(13, MOVE_SMOG), + LEVEL_UP_MOVE(19, MOVE_FIRE_PUNCH), + LEVEL_UP_MOVE(25, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE(33, MOVE_SUNNY_DAY), + LEVEL_UP_MOVE(41, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(49, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(57, MOVE_FIRE_BLAST), + LEVEL_UP_END +}; + +const u16 gPinsirLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_VICE_GRIP), + LEVEL_UP_MOVE( 1, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE( 7, MOVE_BIND), + LEVEL_UP_MOVE(13, MOVE_SEISMIC_TOSS), + LEVEL_UP_MOVE(19, MOVE_HARDEN), + LEVEL_UP_MOVE(25, MOVE_REVENGE), + LEVEL_UP_MOVE(31, MOVE_BRICK_BREAK), + LEVEL_UP_MOVE(37, MOVE_GUILLOTINE), + LEVEL_UP_MOVE(43, MOVE_SUBMISSION), + LEVEL_UP_MOVE(49, MOVE_SWORDS_DANCE), + LEVEL_UP_END +}; + +const u16 gTaurosLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 4, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 8, MOVE_RAGE), + LEVEL_UP_MOVE(13, MOVE_HORN_ATTACK), + LEVEL_UP_MOVE(19, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(26, MOVE_PURSUIT), + LEVEL_UP_MOVE(34, MOVE_REST), + LEVEL_UP_MOVE(43, MOVE_THRASH), + LEVEL_UP_MOVE(53, MOVE_TAKE_DOWN), + LEVEL_UP_END +}; + +const u16 gMagikarpLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SPLASH), + LEVEL_UP_MOVE(15, MOVE_TACKLE), + LEVEL_UP_MOVE(30, MOVE_FLAIL), + LEVEL_UP_END +}; + +const u16 gGyaradosLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_THRASH), + LEVEL_UP_MOVE(20, MOVE_BITE), + LEVEL_UP_MOVE(25, MOVE_DRAGON_RAGE), + LEVEL_UP_MOVE(30, MOVE_LEER), + LEVEL_UP_MOVE(35, MOVE_TWISTER), + LEVEL_UP_MOVE(40, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(45, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(50, MOVE_DRAGON_DANCE), + LEVEL_UP_MOVE(55, MOVE_HYPER_BEAM), + LEVEL_UP_END +}; + +const u16 gLaprasLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_SING), + LEVEL_UP_MOVE( 7, MOVE_MIST), + LEVEL_UP_MOVE(13, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(19, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(25, MOVE_PERISH_SONG), + LEVEL_UP_MOVE(31, MOVE_ICE_BEAM), + LEVEL_UP_MOVE(37, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(43, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(49, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(55, MOVE_SHEER_COLD), + LEVEL_UP_END +}; + +const u16 gDittoLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TRANSFORM), + LEVEL_UP_END +}; + +const u16 gEeveeLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 1, MOVE_HELPING_HAND), + LEVEL_UP_MOVE( 8, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(16, MOVE_GROWL), + LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(30, MOVE_BITE), + LEVEL_UP_MOVE(36, MOVE_BATON_PASS), + LEVEL_UP_MOVE(42, MOVE_TAKE_DOWN), + LEVEL_UP_END +}; + +const u16 gVaporeonLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 1, MOVE_HELPING_HAND), + LEVEL_UP_MOVE( 8, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(16, MOVE_WATER_GUN), + LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(30, MOVE_BITE), + LEVEL_UP_MOVE(36, MOVE_AURORA_BEAM), + LEVEL_UP_MOVE(42, MOVE_HAZE), + LEVEL_UP_MOVE(47, MOVE_ACID_ARMOR), + LEVEL_UP_MOVE(52, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +const u16 gJolteonLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 1, MOVE_HELPING_HAND), + LEVEL_UP_MOVE( 8, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(16, MOVE_THUNDER_SHOCK), + LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(30, MOVE_DOUBLE_KICK), + LEVEL_UP_MOVE(36, MOVE_PIN_MISSILE), + LEVEL_UP_MOVE(42, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE(47, MOVE_AGILITY), + LEVEL_UP_MOVE(52, MOVE_THUNDER), + LEVEL_UP_END +}; + +const u16 gFlareonLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 1, MOVE_HELPING_HAND), + LEVEL_UP_MOVE( 8, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(16, MOVE_EMBER), + LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(30, MOVE_BITE), + LEVEL_UP_MOVE(36, MOVE_FIRE_SPIN), + LEVEL_UP_MOVE(42, MOVE_SMOG), + LEVEL_UP_MOVE(47, MOVE_LEER), + LEVEL_UP_MOVE(52, MOVE_FLAMETHROWER), + LEVEL_UP_END +}; + +const u16 gPorygonLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_CONVERSION_2), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_CONVERSION), + LEVEL_UP_MOVE( 9, MOVE_AGILITY), + LEVEL_UP_MOVE(12, MOVE_PSYBEAM), + LEVEL_UP_MOVE(20, MOVE_RECOVER), + LEVEL_UP_MOVE(24, MOVE_SHARPEN), + LEVEL_UP_MOVE(32, MOVE_LOCK_ON), + LEVEL_UP_MOVE(36, MOVE_TRI_ATTACK), + LEVEL_UP_MOVE(44, MOVE_RECYCLE), + LEVEL_UP_MOVE(48, MOVE_ZAP_CANNON), + LEVEL_UP_END +}; + +const u16 gOmanyteLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_CONSTRICT), + LEVEL_UP_MOVE( 1, MOVE_WITHDRAW), + LEVEL_UP_MOVE(13, MOVE_BITE), + LEVEL_UP_MOVE(19, MOVE_WATER_GUN), + LEVEL_UP_MOVE(25, MOVE_MUD_SHOT), + LEVEL_UP_MOVE(31, MOVE_LEER), + LEVEL_UP_MOVE(37, MOVE_PROTECT), + LEVEL_UP_MOVE(43, MOVE_TICKLE), + LEVEL_UP_MOVE(49, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(55, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +const u16 gOmastarLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_CONSTRICT), + LEVEL_UP_MOVE( 1, MOVE_WITHDRAW), + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE(13, MOVE_BITE), + LEVEL_UP_MOVE(19, MOVE_WATER_GUN), + LEVEL_UP_MOVE(25, MOVE_MUD_SHOT), + LEVEL_UP_MOVE(31, MOVE_LEER), + LEVEL_UP_MOVE(37, MOVE_PROTECT), + LEVEL_UP_MOVE(40, MOVE_SPIKE_CANNON), + LEVEL_UP_MOVE(46, MOVE_TICKLE), + LEVEL_UP_MOVE(55, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(65, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +const u16 gKabutoLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_HARDEN), + LEVEL_UP_MOVE(13, MOVE_ABSORB), + LEVEL_UP_MOVE(19, MOVE_LEER), + LEVEL_UP_MOVE(25, MOVE_MUD_SHOT), + LEVEL_UP_MOVE(31, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(37, MOVE_ENDURE), + LEVEL_UP_MOVE(43, MOVE_METAL_SOUND), + LEVEL_UP_MOVE(49, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE(55, MOVE_ANCIENT_POWER), + LEVEL_UP_END +}; + +const u16 gKabutopsLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_HARDEN), + LEVEL_UP_MOVE( 1, MOVE_ABSORB), + LEVEL_UP_MOVE(13, MOVE_ABSORB), + LEVEL_UP_MOVE(19, MOVE_LEER), + LEVEL_UP_MOVE(25, MOVE_MUD_SHOT), + LEVEL_UP_MOVE(31, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(37, MOVE_ENDURE), + LEVEL_UP_MOVE(40, MOVE_SLASH), + LEVEL_UP_MOVE(46, MOVE_METAL_SOUND), + LEVEL_UP_MOVE(55, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE(65, MOVE_ANCIENT_POWER), + LEVEL_UP_END +}; + +const u16 gAerodactylLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WING_ATTACK), + LEVEL_UP_MOVE( 8, MOVE_AGILITY), + LEVEL_UP_MOVE(15, MOVE_BITE), + LEVEL_UP_MOVE(22, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(29, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(36, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(43, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(50, MOVE_HYPER_BEAM), + LEVEL_UP_END +}; + +const u16 gSnorlaxLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 6, MOVE_AMNESIA), + LEVEL_UP_MOVE(10, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE(15, MOVE_BELLY_DRUM), + LEVEL_UP_MOVE(19, MOVE_HEADBUTT), + LEVEL_UP_MOVE(24, MOVE_YAWN), + LEVEL_UP_MOVE(28, MOVE_REST), + LEVEL_UP_MOVE(28, MOVE_SNORE), + LEVEL_UP_MOVE(33, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(37, MOVE_BLOCK), + LEVEL_UP_MOVE(42, MOVE_COVET), + LEVEL_UP_MOVE(46, MOVE_ROLLOUT), + LEVEL_UP_MOVE(51, MOVE_HYPER_BEAM), + LEVEL_UP_END +}; + +const u16 gArticunoLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_GUST), + LEVEL_UP_MOVE( 1, MOVE_POWDER_SNOW), + LEVEL_UP_MOVE(13, MOVE_MIST), + LEVEL_UP_MOVE(25, MOVE_AGILITY), + LEVEL_UP_MOVE(37, MOVE_MIND_READER), + LEVEL_UP_MOVE(49, MOVE_ICE_BEAM), + LEVEL_UP_MOVE(61, MOVE_REFLECT), + LEVEL_UP_MOVE(73, MOVE_BLIZZARD), + LEVEL_UP_MOVE(85, MOVE_SHEER_COLD), + LEVEL_UP_END +}; + +const u16 gZapdosLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_PECK), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_SHOCK), + LEVEL_UP_MOVE(13, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE(25, MOVE_AGILITY), + LEVEL_UP_MOVE(37, MOVE_DETECT), + LEVEL_UP_MOVE(49, MOVE_DRILL_PECK), + LEVEL_UP_MOVE(61, MOVE_CHARGE), + LEVEL_UP_MOVE(73, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(85, MOVE_THUNDER), + LEVEL_UP_END +}; + +const u16 gMoltresLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WING_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_EMBER), + LEVEL_UP_MOVE(13, MOVE_FIRE_SPIN), + LEVEL_UP_MOVE(25, MOVE_AGILITY), + LEVEL_UP_MOVE(37, MOVE_ENDURE), + LEVEL_UP_MOVE(49, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(61, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(73, MOVE_HEAT_WAVE), + LEVEL_UP_MOVE(85, MOVE_SKY_ATTACK), + LEVEL_UP_END +}; + +const u16 gDratiniLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WRAP), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 8, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE(15, MOVE_TWISTER), + LEVEL_UP_MOVE(22, MOVE_DRAGON_RAGE), + LEVEL_UP_MOVE(29, MOVE_SLAM), + LEVEL_UP_MOVE(36, MOVE_AGILITY), + LEVEL_UP_MOVE(43, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(50, MOVE_OUTRAGE), + LEVEL_UP_MOVE(57, MOVE_HYPER_BEAM), + LEVEL_UP_END +}; + +const u16 gDragonairLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WRAP), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE( 1, MOVE_TWISTER), + LEVEL_UP_MOVE( 8, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE(15, MOVE_TWISTER), + LEVEL_UP_MOVE(22, MOVE_DRAGON_RAGE), + LEVEL_UP_MOVE(29, MOVE_SLAM), + LEVEL_UP_MOVE(38, MOVE_AGILITY), + LEVEL_UP_MOVE(47, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(56, MOVE_OUTRAGE), + LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM), + LEVEL_UP_END +}; + +const u16 gDragoniteLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WRAP), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE( 1, MOVE_TWISTER), + LEVEL_UP_MOVE( 8, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE(15, MOVE_TWISTER), + LEVEL_UP_MOVE(22, MOVE_DRAGON_RAGE), + LEVEL_UP_MOVE(29, MOVE_SLAM), + LEVEL_UP_MOVE(38, MOVE_AGILITY), + LEVEL_UP_MOVE(47, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(55, MOVE_WING_ATTACK), + LEVEL_UP_MOVE(61, MOVE_OUTRAGE), + LEVEL_UP_MOVE(75, MOVE_HYPER_BEAM), + LEVEL_UP_END +}; + +const u16 gMewtwoLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_CONFUSION), + LEVEL_UP_MOVE( 1, MOVE_DISABLE), + LEVEL_UP_MOVE(11, MOVE_BARRIER), + LEVEL_UP_MOVE(22, MOVE_SWIFT), + LEVEL_UP_MOVE(33, MOVE_PSYCH_UP), + LEVEL_UP_MOVE(44, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(55, MOVE_MIST), + LEVEL_UP_MOVE(66, MOVE_PSYCHIC), + LEVEL_UP_MOVE(77, MOVE_AMNESIA), + LEVEL_UP_MOVE(88, MOVE_RECOVER), + LEVEL_UP_MOVE(99, MOVE_SAFEGUARD), + LEVEL_UP_END +}; + +const u16 gMewLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POUND), + LEVEL_UP_MOVE(10, MOVE_TRANSFORM), + LEVEL_UP_MOVE(20, MOVE_MEGA_PUNCH), + LEVEL_UP_MOVE(30, MOVE_METRONOME), + LEVEL_UP_MOVE(40, MOVE_PSYCHIC), + LEVEL_UP_MOVE(50, MOVE_ANCIENT_POWER), + LEVEL_UP_END +}; + +const u16 gChikoritaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 8, MOVE_RAZOR_LEAF), + LEVEL_UP_MOVE(12, MOVE_REFLECT), + LEVEL_UP_MOVE(15, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(22, MOVE_SYNTHESIS), + LEVEL_UP_MOVE(29, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(36, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(43, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(50, MOVE_SOLAR_BEAM), + LEVEL_UP_END +}; + +const u16 gBayleefLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_RAZOR_LEAF), + LEVEL_UP_MOVE( 1, MOVE_REFLECT), + LEVEL_UP_MOVE( 8, MOVE_RAZOR_LEAF), + LEVEL_UP_MOVE(12, MOVE_REFLECT), + LEVEL_UP_MOVE(15, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(23, MOVE_SYNTHESIS), + LEVEL_UP_MOVE(31, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(39, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(47, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(55, MOVE_SOLAR_BEAM), + LEVEL_UP_END +}; + +const u16 gMeganiumLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_RAZOR_LEAF), + LEVEL_UP_MOVE( 1, MOVE_REFLECT), + LEVEL_UP_MOVE( 8, MOVE_RAZOR_LEAF), + LEVEL_UP_MOVE(12, MOVE_REFLECT), + LEVEL_UP_MOVE(15, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(23, MOVE_SYNTHESIS), + LEVEL_UP_MOVE(31, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(41, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(51, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(61, MOVE_SOLAR_BEAM), + LEVEL_UP_END +}; + +const u16 gCyndaquilLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 6, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE(12, MOVE_EMBER), + LEVEL_UP_MOVE(19, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(27, MOVE_FLAME_WHEEL), + LEVEL_UP_MOVE(36, MOVE_SWIFT), + LEVEL_UP_MOVE(46, MOVE_FLAMETHROWER), + LEVEL_UP_END +}; + +const u16 gQuilavaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE( 6, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE(12, MOVE_EMBER), + LEVEL_UP_MOVE(21, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(31, MOVE_FLAME_WHEEL), + LEVEL_UP_MOVE(42, MOVE_SWIFT), + LEVEL_UP_MOVE(54, MOVE_FLAMETHROWER), + LEVEL_UP_END +}; + +const u16 gTyphlosionLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE( 1, MOVE_EMBER), + LEVEL_UP_MOVE( 6, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE(12, MOVE_EMBER), + LEVEL_UP_MOVE(21, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(31, MOVE_FLAME_WHEEL), + LEVEL_UP_MOVE(45, MOVE_SWIFT), + LEVEL_UP_MOVE(60, MOVE_FLAMETHROWER), + LEVEL_UP_END +}; + +const u16 gTotodileLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 7, MOVE_RAGE), + LEVEL_UP_MOVE(13, MOVE_WATER_GUN), + LEVEL_UP_MOVE(20, MOVE_BITE), + LEVEL_UP_MOVE(27, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(35, MOVE_SLASH), + LEVEL_UP_MOVE(43, MOVE_SCREECH), + LEVEL_UP_MOVE(52, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +const u16 gCroconawLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_RAGE), + LEVEL_UP_MOVE( 7, MOVE_RAGE), + LEVEL_UP_MOVE(13, MOVE_WATER_GUN), + LEVEL_UP_MOVE(21, MOVE_BITE), + LEVEL_UP_MOVE(28, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(37, MOVE_SLASH), + LEVEL_UP_MOVE(45, MOVE_SCREECH), + LEVEL_UP_MOVE(55, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +const u16 gFeraligatrLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_RAGE), + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 7, MOVE_RAGE), + LEVEL_UP_MOVE(13, MOVE_WATER_GUN), + LEVEL_UP_MOVE(21, MOVE_BITE), + LEVEL_UP_MOVE(28, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(38, MOVE_SLASH), + LEVEL_UP_MOVE(47, MOVE_SCREECH), + LEVEL_UP_MOVE(58, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +const u16 gSentretLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 4, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE( 7, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(12, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(17, MOVE_HELPING_HAND), + LEVEL_UP_MOVE(24, MOVE_SLAM), + LEVEL_UP_MOVE(31, MOVE_FOLLOW_ME), + LEVEL_UP_MOVE(40, MOVE_REST), + LEVEL_UP_MOVE(49, MOVE_AMNESIA), + LEVEL_UP_END +}; + +const u16 gFurretLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE( 4, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE( 7, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(12, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(19, MOVE_HELPING_HAND), + LEVEL_UP_MOVE(28, MOVE_SLAM), + LEVEL_UP_MOVE(37, MOVE_FOLLOW_ME), + LEVEL_UP_MOVE(48, MOVE_REST), + LEVEL_UP_MOVE(59, MOVE_AMNESIA), + LEVEL_UP_END +}; + +const u16 gHoothootLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 6, MOVE_FORESIGHT), + LEVEL_UP_MOVE(11, MOVE_PECK), + LEVEL_UP_MOVE(16, MOVE_HYPNOSIS), + LEVEL_UP_MOVE(22, MOVE_REFLECT), + LEVEL_UP_MOVE(28, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(34, MOVE_CONFUSION), + LEVEL_UP_MOVE(48, MOVE_DREAM_EATER), + LEVEL_UP_END +}; + +const u16 gNoctowlLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_FORESIGHT), + LEVEL_UP_MOVE( 1, MOVE_PECK), + LEVEL_UP_MOVE( 6, MOVE_FORESIGHT), + LEVEL_UP_MOVE(11, MOVE_PECK), + LEVEL_UP_MOVE(16, MOVE_HYPNOSIS), + LEVEL_UP_MOVE(25, MOVE_REFLECT), + LEVEL_UP_MOVE(33, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(41, MOVE_CONFUSION), + LEVEL_UP_MOVE(57, MOVE_DREAM_EATER), + LEVEL_UP_END +}; + +const u16 gLedybaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 8, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(15, MOVE_COMET_PUNCH), + LEVEL_UP_MOVE(22, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(22, MOVE_REFLECT), + LEVEL_UP_MOVE(22, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(29, MOVE_BATON_PASS), + LEVEL_UP_MOVE(36, MOVE_SWIFT), + LEVEL_UP_MOVE(43, MOVE_AGILITY), + LEVEL_UP_MOVE(50, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +const u16 gLedianLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_SUPERSONIC), + LEVEL_UP_MOVE( 8, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(15, MOVE_COMET_PUNCH), + LEVEL_UP_MOVE(24, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(24, MOVE_REFLECT), + LEVEL_UP_MOVE(24, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(33, MOVE_BATON_PASS), + LEVEL_UP_MOVE(42, MOVE_SWIFT), + LEVEL_UP_MOVE(51, MOVE_AGILITY), + LEVEL_UP_MOVE(60, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +const u16 gSpinarakLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POISON_STING), + LEVEL_UP_MOVE( 1, MOVE_STRING_SHOT), + LEVEL_UP_MOVE( 6, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(11, MOVE_CONSTRICT), + LEVEL_UP_MOVE(17, MOVE_NIGHT_SHADE), + LEVEL_UP_MOVE(23, MOVE_LEECH_LIFE), + LEVEL_UP_MOVE(30, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(37, MOVE_SPIDER_WEB), + LEVEL_UP_MOVE(45, MOVE_AGILITY), + LEVEL_UP_MOVE(53, MOVE_PSYCHIC), + LEVEL_UP_END +}; + +const u16 gAriadosLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POISON_STING), + LEVEL_UP_MOVE( 1, MOVE_STRING_SHOT), + LEVEL_UP_MOVE( 1, MOVE_SCARY_FACE), + LEVEL_UP_MOVE( 1, MOVE_CONSTRICT), + LEVEL_UP_MOVE( 6, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(11, MOVE_CONSTRICT), + LEVEL_UP_MOVE(17, MOVE_NIGHT_SHADE), + LEVEL_UP_MOVE(25, MOVE_LEECH_LIFE), + LEVEL_UP_MOVE(34, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(43, MOVE_SPIDER_WEB), + LEVEL_UP_MOVE(53, MOVE_AGILITY), + LEVEL_UP_MOVE(63, MOVE_PSYCHIC), + LEVEL_UP_END +}; + +const u16 gCrobatLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCREECH), + LEVEL_UP_MOVE( 1, MOVE_LEECH_LIFE), + LEVEL_UP_MOVE( 1, MOVE_SUPERSONIC), + LEVEL_UP_MOVE( 1, MOVE_ASTONISH), + LEVEL_UP_MOVE( 6, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(11, MOVE_ASTONISH), + LEVEL_UP_MOVE(16, MOVE_BITE), + LEVEL_UP_MOVE(21, MOVE_WING_ATTACK), + LEVEL_UP_MOVE(28, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(35, MOVE_AIR_CUTTER), + LEVEL_UP_MOVE(42, MOVE_MEAN_LOOK), + LEVEL_UP_MOVE(49, MOVE_POISON_FANG), + LEVEL_UP_MOVE(56, MOVE_HAZE), + LEVEL_UP_END +}; + +const u16 gChinchouLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BUBBLE), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE( 5, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(13, MOVE_FLAIL), + LEVEL_UP_MOVE(17, MOVE_WATER_GUN), + LEVEL_UP_MOVE(25, MOVE_SPARK), + LEVEL_UP_MOVE(29, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(37, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(41, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(49, MOVE_CHARGE), + LEVEL_UP_END +}; + +const u16 gLanturnLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BUBBLE), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE( 1, MOVE_SUPERSONIC), + LEVEL_UP_MOVE( 5, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(13, MOVE_FLAIL), + LEVEL_UP_MOVE(17, MOVE_WATER_GUN), + LEVEL_UP_MOVE(25, MOVE_SPARK), + LEVEL_UP_MOVE(32, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(43, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(50, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(61, MOVE_CHARGE), + LEVEL_UP_END +}; + +const u16 gPichuLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_THUNDER_SHOCK), + LEVEL_UP_MOVE( 1, MOVE_CHARM), + LEVEL_UP_MOVE( 6, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 8, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE(11, MOVE_SWEET_KISS), + LEVEL_UP_END +}; + +const u16 gCleffaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POUND), + LEVEL_UP_MOVE( 1, MOVE_CHARM), + LEVEL_UP_MOVE( 4, MOVE_ENCORE), + LEVEL_UP_MOVE( 8, MOVE_SING), + LEVEL_UP_MOVE(13, MOVE_SWEET_KISS), + LEVEL_UP_END +}; + +const u16 gIgglybuffLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SING), + LEVEL_UP_MOVE( 1, MOVE_CHARM), + LEVEL_UP_MOVE( 4, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE( 9, MOVE_POUND), + LEVEL_UP_MOVE(14, MOVE_SWEET_KISS), + LEVEL_UP_END +}; + +const u16 gTogepiLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_CHARM), + LEVEL_UP_MOVE( 6, MOVE_METRONOME), + LEVEL_UP_MOVE(11, MOVE_SWEET_KISS), + LEVEL_UP_MOVE(16, MOVE_YAWN), + LEVEL_UP_MOVE(21, MOVE_ENCORE), + LEVEL_UP_MOVE(26, MOVE_FOLLOW_ME), + LEVEL_UP_MOVE(31, MOVE_WISH), + LEVEL_UP_MOVE(36, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(41, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +const u16 gTogeticLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_CHARM), + LEVEL_UP_MOVE( 6, MOVE_METRONOME), + LEVEL_UP_MOVE(11, MOVE_SWEET_KISS), + LEVEL_UP_MOVE(16, MOVE_YAWN), + LEVEL_UP_MOVE(21, MOVE_ENCORE), + LEVEL_UP_MOVE(26, MOVE_FOLLOW_ME), + LEVEL_UP_MOVE(31, MOVE_WISH), + LEVEL_UP_MOVE(36, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(41, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +const u16 gNatuLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_PECK), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE(10, MOVE_NIGHT_SHADE), + LEVEL_UP_MOVE(20, MOVE_TELEPORT), + LEVEL_UP_MOVE(30, MOVE_WISH), + LEVEL_UP_MOVE(30, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(40, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(50, MOVE_PSYCHIC), + LEVEL_UP_END +}; + +const u16 gXatuLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_PECK), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE(10, MOVE_NIGHT_SHADE), + LEVEL_UP_MOVE(20, MOVE_TELEPORT), + LEVEL_UP_MOVE(35, MOVE_WISH), + LEVEL_UP_MOVE(35, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(50, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(65, MOVE_PSYCHIC), + LEVEL_UP_END +}; + +const u16 gMareepLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 9, MOVE_THUNDER_SHOCK), + LEVEL_UP_MOVE(16, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE(23, MOVE_COTTON_SPORE), + LEVEL_UP_MOVE(30, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(37, MOVE_THUNDER), + LEVEL_UP_END +}; + +const u16 gFlaaffyLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_SHOCK), + LEVEL_UP_MOVE( 9, MOVE_THUNDER_SHOCK), + LEVEL_UP_MOVE(18, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE(27, MOVE_COTTON_SPORE), + LEVEL_UP_MOVE(36, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(45, MOVE_THUNDER), + LEVEL_UP_END +}; + +const u16 gAmpharosLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_SHOCK), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE( 9, MOVE_THUNDER_SHOCK), + LEVEL_UP_MOVE(18, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE(27, MOVE_COTTON_SPORE), + LEVEL_UP_MOVE(30, MOVE_THUNDER_PUNCH), + LEVEL_UP_MOVE(42, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(57, MOVE_THUNDER), + LEVEL_UP_END +}; + +const u16 gBellossomLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ABSORB), + LEVEL_UP_MOVE( 1, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE( 1, MOVE_STUN_SPORE), + LEVEL_UP_MOVE( 1, MOVE_MAGICAL_LEAF), + LEVEL_UP_MOVE(44, MOVE_PETAL_DANCE), + LEVEL_UP_MOVE(55, MOVE_SOLAR_BEAM), + LEVEL_UP_END +}; + +const u16 gMarillLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 3, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE( 6, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE(10, MOVE_WATER_GUN), + LEVEL_UP_MOVE(15, MOVE_ROLLOUT), + LEVEL_UP_MOVE(21, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(28, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(36, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(45, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +const u16 gAzumarillLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 3, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE( 6, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE(10, MOVE_WATER_GUN), + LEVEL_UP_MOVE(15, MOVE_ROLLOUT), + LEVEL_UP_MOVE(24, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(34, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(45, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(57, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +const u16 gSudowoodoLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ROCK_THROW), + LEVEL_UP_MOVE( 1, MOVE_MIMIC), + LEVEL_UP_MOVE( 9, MOVE_FLAIL), + LEVEL_UP_MOVE(17, MOVE_LOW_KICK), + LEVEL_UP_MOVE(25, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(33, MOVE_BLOCK), + LEVEL_UP_MOVE(41, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(49, MOVE_SLAM), + LEVEL_UP_MOVE(57, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +const u16 gPolitoedLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 1, MOVE_HYPNOSIS), + LEVEL_UP_MOVE( 1, MOVE_DOUBLE_SLAP), + LEVEL_UP_MOVE( 1, MOVE_PERISH_SONG), + LEVEL_UP_MOVE(35, MOVE_PERISH_SONG), + LEVEL_UP_MOVE(51, MOVE_SWAGGER), + LEVEL_UP_END +}; + +const u16 gHoppipLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SPLASH), + LEVEL_UP_MOVE( 5, MOVE_SYNTHESIS), + LEVEL_UP_MOVE( 5, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE(10, MOVE_TACKLE), + LEVEL_UP_MOVE(13, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(15, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(17, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(20, MOVE_LEECH_SEED), + LEVEL_UP_MOVE(25, MOVE_COTTON_SPORE), + LEVEL_UP_MOVE(30, MOVE_MEGA_DRAIN), + LEVEL_UP_END +}; + +const u16 gSkiploomLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SPLASH), + LEVEL_UP_MOVE( 1, MOVE_SYNTHESIS), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 5, MOVE_SYNTHESIS), + LEVEL_UP_MOVE( 5, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE(10, MOVE_TACKLE), + LEVEL_UP_MOVE(13, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(15, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(17, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(22, MOVE_LEECH_SEED), + LEVEL_UP_MOVE(29, MOVE_COTTON_SPORE), + LEVEL_UP_MOVE(36, MOVE_MEGA_DRAIN), + LEVEL_UP_END +}; + +const u16 gJumpluffLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SPLASH), + LEVEL_UP_MOVE( 1, MOVE_SYNTHESIS), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 5, MOVE_SYNTHESIS), + LEVEL_UP_MOVE( 5, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE(10, MOVE_TACKLE), + LEVEL_UP_MOVE(13, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(15, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(17, MOVE_SLEEP_POWDER), + LEVEL_UP_MOVE(22, MOVE_LEECH_SEED), + LEVEL_UP_MOVE(33, MOVE_COTTON_SPORE), + LEVEL_UP_MOVE(44, MOVE_MEGA_DRAIN), + LEVEL_UP_END +}; + +const u16 gAipomLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 6, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(13, MOVE_ASTONISH), + LEVEL_UP_MOVE(18, MOVE_BATON_PASS), + LEVEL_UP_MOVE(25, MOVE_TICKLE), + LEVEL_UP_MOVE(31, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(38, MOVE_SWIFT), + LEVEL_UP_MOVE(43, MOVE_SCREECH), + LEVEL_UP_MOVE(50, MOVE_AGILITY), + LEVEL_UP_END +}; + +const u16 gSunkernLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ABSORB), + LEVEL_UP_MOVE( 6, MOVE_GROWTH), + LEVEL_UP_MOVE(13, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE(18, MOVE_INGRAIN), + LEVEL_UP_MOVE(25, MOVE_ENDEAVOR), + LEVEL_UP_MOVE(30, MOVE_SUNNY_DAY), + LEVEL_UP_MOVE(37, MOVE_SYNTHESIS), + LEVEL_UP_MOVE(42, MOVE_GIGA_DRAIN), + LEVEL_UP_END +}; + +const u16 gSunfloraLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ABSORB), + LEVEL_UP_MOVE( 1, MOVE_POUND), + LEVEL_UP_MOVE( 6, MOVE_GROWTH), + LEVEL_UP_MOVE(13, MOVE_RAZOR_LEAF), + LEVEL_UP_MOVE(18, MOVE_INGRAIN), + LEVEL_UP_MOVE(25, MOVE_BULLET_SEED), + LEVEL_UP_MOVE(30, MOVE_SUNNY_DAY), + LEVEL_UP_MOVE(37, MOVE_PETAL_DANCE), + LEVEL_UP_MOVE(42, MOVE_SOLAR_BEAM), + LEVEL_UP_END +}; + +const u16 gYanmaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_FORESIGHT), + LEVEL_UP_MOVE( 7, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(13, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE(19, MOVE_SONIC_BOOM), + LEVEL_UP_MOVE(25, MOVE_DETECT), + LEVEL_UP_MOVE(31, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(37, MOVE_UPROAR), + LEVEL_UP_MOVE(43, MOVE_WING_ATTACK), + LEVEL_UP_MOVE(49, MOVE_SCREECH), + LEVEL_UP_END +}; + +const u16 gWooperLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE(11, MOVE_SLAM), + LEVEL_UP_MOVE(16, MOVE_MUD_SHOT), + LEVEL_UP_MOVE(21, MOVE_AMNESIA), + LEVEL_UP_MOVE(31, MOVE_YAWN), + LEVEL_UP_MOVE(36, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(41, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(51, MOVE_MIST), + LEVEL_UP_MOVE(51, MOVE_HAZE), + LEVEL_UP_END +}; + +const u16 gQuagsireLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE(11, MOVE_SLAM), + LEVEL_UP_MOVE(16, MOVE_MUD_SHOT), + LEVEL_UP_MOVE(23, MOVE_AMNESIA), + LEVEL_UP_MOVE(35, MOVE_YAWN), + LEVEL_UP_MOVE(42, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(49, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(61, MOVE_MIST), + LEVEL_UP_MOVE(61, MOVE_HAZE), + LEVEL_UP_END +}; + +const u16 gEspeonLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 1, MOVE_HELPING_HAND), + LEVEL_UP_MOVE( 8, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(16, MOVE_CONFUSION), + LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(30, MOVE_SWIFT), + LEVEL_UP_MOVE(36, MOVE_PSYBEAM), + LEVEL_UP_MOVE(42, MOVE_PSYCH_UP), + LEVEL_UP_MOVE(47, MOVE_PSYCHIC), + LEVEL_UP_MOVE(52, MOVE_MORNING_SUN), + LEVEL_UP_END +}; + +const u16 gUmbreonLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 1, MOVE_HELPING_HAND), + LEVEL_UP_MOVE( 8, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(16, MOVE_PURSUIT), + LEVEL_UP_MOVE(23, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(30, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(36, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(42, MOVE_MEAN_LOOK), + LEVEL_UP_MOVE(47, MOVE_SCREECH), + LEVEL_UP_MOVE(52, MOVE_MOONLIGHT), + LEVEL_UP_END +}; + +const u16 gMurkrowLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_PECK), + LEVEL_UP_MOVE( 9, MOVE_ASTONISH), + LEVEL_UP_MOVE(14, MOVE_PURSUIT), + LEVEL_UP_MOVE(22, MOVE_HAZE), + LEVEL_UP_MOVE(27, MOVE_NIGHT_SHADE), + LEVEL_UP_MOVE(35, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(40, MOVE_TAUNT), + LEVEL_UP_MOVE(48, MOVE_MEAN_LOOK), + LEVEL_UP_END +}; + +const u16 gSlowkingLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_CURSE), + LEVEL_UP_MOVE( 1, MOVE_YAWN), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 6, MOVE_GROWL), + LEVEL_UP_MOVE(15, MOVE_WATER_GUN), + LEVEL_UP_MOVE(20, MOVE_CONFUSION), + LEVEL_UP_MOVE(29, MOVE_DISABLE), + LEVEL_UP_MOVE(34, MOVE_HEADBUTT), + LEVEL_UP_MOVE(43, MOVE_SWAGGER), + LEVEL_UP_MOVE(48, MOVE_PSYCHIC), + LEVEL_UP_END +}; + +const u16 gMisdreavusLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_PSYWAVE), + LEVEL_UP_MOVE( 6, MOVE_SPITE), + LEVEL_UP_MOVE(11, MOVE_ASTONISH), + LEVEL_UP_MOVE(17, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(23, MOVE_MEAN_LOOK), + LEVEL_UP_MOVE(30, MOVE_PSYBEAM), + LEVEL_UP_MOVE(37, MOVE_PAIN_SPLIT), + LEVEL_UP_MOVE(45, MOVE_PERISH_SONG), + LEVEL_UP_MOVE(53, MOVE_GRUDGE), + LEVEL_UP_END +}; + +const u16 gUnownLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_HIDDEN_POWER), + LEVEL_UP_END +}; + +const u16 gWobbuffetLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_COUNTER), + LEVEL_UP_MOVE( 1, MOVE_MIRROR_COAT), + LEVEL_UP_MOVE( 1, MOVE_SAFEGUARD), + LEVEL_UP_MOVE( 1, MOVE_DESTINY_BOND), + LEVEL_UP_END +}; + +const u16 gGirafarigLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 7, MOVE_ASTONISH), + LEVEL_UP_MOVE(13, MOVE_CONFUSION), + LEVEL_UP_MOVE(19, MOVE_STOMP), + LEVEL_UP_MOVE(25, MOVE_ODOR_SLEUTH), + LEVEL_UP_MOVE(31, MOVE_AGILITY), + LEVEL_UP_MOVE(37, MOVE_BATON_PASS), + LEVEL_UP_MOVE(43, MOVE_PSYBEAM), + LEVEL_UP_MOVE(49, MOVE_CRUNCH), + LEVEL_UP_END +}; + +const u16 gPinecoLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_PROTECT), + LEVEL_UP_MOVE( 8, MOVE_SELF_DESTRUCT), + LEVEL_UP_MOVE(15, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(22, MOVE_RAPID_SPIN), + LEVEL_UP_MOVE(29, MOVE_BIDE), + LEVEL_UP_MOVE(36, MOVE_EXPLOSION), + LEVEL_UP_MOVE(43, MOVE_SPIKES), + LEVEL_UP_MOVE(50, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +const u16 gForretressLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_PROTECT), + LEVEL_UP_MOVE( 1, MOVE_SELF_DESTRUCT), + LEVEL_UP_MOVE( 8, MOVE_SELF_DESTRUCT), + LEVEL_UP_MOVE(15, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(22, MOVE_RAPID_SPIN), + LEVEL_UP_MOVE(29, MOVE_BIDE), + LEVEL_UP_MOVE(39, MOVE_EXPLOSION), + LEVEL_UP_MOVE(49, MOVE_SPIKES), + LEVEL_UP_MOVE(59, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +const u16 gDunsparceLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_RAGE), + LEVEL_UP_MOVE( 4, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE(11, MOVE_YAWN), + LEVEL_UP_MOVE(14, MOVE_GLARE), + LEVEL_UP_MOVE(21, MOVE_SPITE), + LEVEL_UP_MOVE(24, MOVE_PURSUIT), + LEVEL_UP_MOVE(31, MOVE_SCREECH), + LEVEL_UP_MOVE(34, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(41, MOVE_ENDEAVOR), + LEVEL_UP_END +}; + +const u16 gGligarLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POISON_STING), + LEVEL_UP_MOVE( 6, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(13, MOVE_HARDEN), + LEVEL_UP_MOVE(20, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(28, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(36, MOVE_SLASH), + LEVEL_UP_MOVE(44, MOVE_SCREECH), + LEVEL_UP_MOVE(52, MOVE_GUILLOTINE), + LEVEL_UP_END +}; + +const u16 gSteelixLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_SCREECH), + LEVEL_UP_MOVE( 9, MOVE_BIND), + LEVEL_UP_MOVE(13, MOVE_ROCK_THROW), + LEVEL_UP_MOVE(21, MOVE_HARDEN), + LEVEL_UP_MOVE(25, MOVE_RAGE), + LEVEL_UP_MOVE(33, MOVE_SANDSTORM), + LEVEL_UP_MOVE(37, MOVE_SLAM), + LEVEL_UP_MOVE(45, MOVE_IRON_TAIL), + LEVEL_UP_MOVE(49, MOVE_CRUNCH), + LEVEL_UP_MOVE(57, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +const u16 gSnubbullLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_SCARY_FACE), + LEVEL_UP_MOVE( 4, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 8, MOVE_CHARM), + LEVEL_UP_MOVE(13, MOVE_BITE), + LEVEL_UP_MOVE(19, MOVE_LICK), + LEVEL_UP_MOVE(26, MOVE_ROAR), + LEVEL_UP_MOVE(34, MOVE_RAGE), + LEVEL_UP_MOVE(43, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(53, MOVE_CRUNCH), + LEVEL_UP_END +}; + +const u16 gGranbullLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_SCARY_FACE), + LEVEL_UP_MOVE( 4, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 8, MOVE_CHARM), + LEVEL_UP_MOVE(13, MOVE_BITE), + LEVEL_UP_MOVE(19, MOVE_LICK), + LEVEL_UP_MOVE(28, MOVE_ROAR), + LEVEL_UP_MOVE(38, MOVE_RAGE), + LEVEL_UP_MOVE(49, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(61, MOVE_CRUNCH), + LEVEL_UP_END +}; + +const u16 gQwilfishLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SPIKES), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_POISON_STING), + LEVEL_UP_MOVE(10, MOVE_HARDEN), + LEVEL_UP_MOVE(10, MOVE_MINIMIZE), + LEVEL_UP_MOVE(19, MOVE_WATER_GUN), + LEVEL_UP_MOVE(28, MOVE_PIN_MISSILE), + LEVEL_UP_MOVE(37, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(46, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +const u16 gScizorLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 6, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(11, MOVE_PURSUIT), + LEVEL_UP_MOVE(16, MOVE_FALSE_SWIPE), + LEVEL_UP_MOVE(21, MOVE_AGILITY), + LEVEL_UP_MOVE(26, MOVE_METAL_CLAW), + LEVEL_UP_MOVE(31, MOVE_SLASH), + LEVEL_UP_MOVE(36, MOVE_SWORDS_DANCE), + LEVEL_UP_MOVE(41, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE(46, MOVE_FURY_CUTTER), + LEVEL_UP_END +}; + +const u16 gShuckleLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_CONSTRICT), + LEVEL_UP_MOVE( 1, MOVE_WITHDRAW), + LEVEL_UP_MOVE( 9, MOVE_WRAP), + LEVEL_UP_MOVE(14, MOVE_ENCORE), + LEVEL_UP_MOVE(23, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(28, MOVE_BIDE), + LEVEL_UP_MOVE(37, MOVE_REST), + LEVEL_UP_END +}; + +const u16 gHeracrossLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 6, MOVE_HORN_ATTACK), + LEVEL_UP_MOVE(11, MOVE_ENDURE), + LEVEL_UP_MOVE(17, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(23, MOVE_BRICK_BREAK), + LEVEL_UP_MOVE(30, MOVE_COUNTER), + LEVEL_UP_MOVE(37, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(45, MOVE_REVERSAL), + LEVEL_UP_MOVE(53, MOVE_MEGAHORN), + LEVEL_UP_END +}; + +const u16 gSneaselLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_TAUNT), + LEVEL_UP_MOVE( 8, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(15, MOVE_SCREECH), + LEVEL_UP_MOVE(22, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(29, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(36, MOVE_AGILITY), + LEVEL_UP_MOVE(43, MOVE_ICY_WIND), + LEVEL_UP_MOVE(50, MOVE_SLASH), + LEVEL_UP_MOVE(57, MOVE_BEAT_UP), + LEVEL_UP_MOVE(64, MOVE_METAL_CLAW), + LEVEL_UP_END +}; + +const u16 gTeddiursaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 7, MOVE_LICK), + LEVEL_UP_MOVE(13, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(19, MOVE_FAKE_TEARS), + LEVEL_UP_MOVE(25, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(31, MOVE_REST), + LEVEL_UP_MOVE(37, MOVE_SLASH), + LEVEL_UP_MOVE(43, MOVE_SNORE), + LEVEL_UP_MOVE(49, MOVE_THRASH), + LEVEL_UP_END +}; + +const u16 gUrsaringLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_LICK), + LEVEL_UP_MOVE( 1, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE( 7, MOVE_LICK), + LEVEL_UP_MOVE(13, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(19, MOVE_FAKE_TEARS), + LEVEL_UP_MOVE(25, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(31, MOVE_REST), + LEVEL_UP_MOVE(37, MOVE_SLASH), + LEVEL_UP_MOVE(43, MOVE_SNORE), + LEVEL_UP_MOVE(49, MOVE_THRASH), + LEVEL_UP_END +}; + +const u16 gSlugmaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_YAWN), + LEVEL_UP_MOVE( 1, MOVE_SMOG), + LEVEL_UP_MOVE( 8, MOVE_EMBER), + LEVEL_UP_MOVE(15, MOVE_ROCK_THROW), + LEVEL_UP_MOVE(22, MOVE_HARDEN), + LEVEL_UP_MOVE(29, MOVE_AMNESIA), + LEVEL_UP_MOVE(36, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(43, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(50, MOVE_BODY_SLAM), + LEVEL_UP_END +}; + +const u16 gMagcargoLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_YAWN), + LEVEL_UP_MOVE( 1, MOVE_SMOG), + LEVEL_UP_MOVE( 1, MOVE_EMBER), + LEVEL_UP_MOVE( 1, MOVE_ROCK_THROW), + LEVEL_UP_MOVE( 8, MOVE_EMBER), + LEVEL_UP_MOVE(15, MOVE_ROCK_THROW), + LEVEL_UP_MOVE(22, MOVE_HARDEN), + LEVEL_UP_MOVE(29, MOVE_AMNESIA), + LEVEL_UP_MOVE(36, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(48, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(60, MOVE_BODY_SLAM), + LEVEL_UP_END +}; + +const u16 gSwinubLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_ODOR_SLEUTH), + LEVEL_UP_MOVE(10, MOVE_POWDER_SNOW), + LEVEL_UP_MOVE(19, MOVE_ENDURE), + LEVEL_UP_MOVE(28, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(37, MOVE_MIST), + LEVEL_UP_MOVE(46, MOVE_BLIZZARD), + LEVEL_UP_MOVE(55, MOVE_AMNESIA), + LEVEL_UP_END +}; + +const u16 gPiloswineLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_HORN_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_ODOR_SLEUTH), + LEVEL_UP_MOVE( 1, MOVE_POWDER_SNOW), + LEVEL_UP_MOVE( 1, MOVE_ENDURE), + LEVEL_UP_MOVE(10, MOVE_POWDER_SNOW), + LEVEL_UP_MOVE(19, MOVE_ENDURE), + LEVEL_UP_MOVE(28, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(33, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(42, MOVE_MIST), + LEVEL_UP_MOVE(56, MOVE_BLIZZARD), + LEVEL_UP_MOVE(70, MOVE_AMNESIA), + LEVEL_UP_END +}; + +const u16 gCorsolaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 6, MOVE_HARDEN), + LEVEL_UP_MOVE(12, MOVE_BUBBLE), + LEVEL_UP_MOVE(17, MOVE_RECOVER), + LEVEL_UP_MOVE(17, MOVE_REFRESH), + LEVEL_UP_MOVE(23, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(28, MOVE_SPIKE_CANNON), + LEVEL_UP_MOVE(34, MOVE_ROCK_BLAST), + LEVEL_UP_MOVE(39, MOVE_MIRROR_COAT), + LEVEL_UP_MOVE(45, MOVE_ANCIENT_POWER), + LEVEL_UP_END +}; + +const u16 gRemoraidLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE(11, MOVE_LOCK_ON), + LEVEL_UP_MOVE(22, MOVE_PSYBEAM), + LEVEL_UP_MOVE(22, MOVE_AURORA_BEAM), + LEVEL_UP_MOVE(22, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(33, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(44, MOVE_ICE_BEAM), + LEVEL_UP_MOVE(55, MOVE_HYPER_BEAM), + LEVEL_UP_END +}; + +const u16 gOctilleryLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE(11, MOVE_CONSTRICT), + LEVEL_UP_MOVE(22, MOVE_PSYBEAM), + LEVEL_UP_MOVE(22, MOVE_AURORA_BEAM), + LEVEL_UP_MOVE(22, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(25, MOVE_OCTAZOOKA), + LEVEL_UP_MOVE(38, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(54, MOVE_ICE_BEAM), + LEVEL_UP_MOVE(70, MOVE_HYPER_BEAM), + LEVEL_UP_END +}; + +const u16 gDelibirdLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_PRESENT), + LEVEL_UP_END +}; + +const u16 gMantineLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_BUBBLE), + LEVEL_UP_MOVE( 8, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(15, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(22, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(29, MOVE_AGILITY), + LEVEL_UP_MOVE(36, MOVE_WING_ATTACK), + LEVEL_UP_MOVE(43, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(50, MOVE_CONFUSE_RAY), + LEVEL_UP_END +}; + +const u16 gSkarmoryLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_PECK), + LEVEL_UP_MOVE(10, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(13, MOVE_SWIFT), + LEVEL_UP_MOVE(16, MOVE_AGILITY), + LEVEL_UP_MOVE(26, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(29, MOVE_AIR_CUTTER), + LEVEL_UP_MOVE(32, MOVE_STEEL_WING), + LEVEL_UP_MOVE(42, MOVE_SPIKES), + LEVEL_UP_MOVE(45, MOVE_METAL_SOUND), + LEVEL_UP_END +}; + +const u16 gHoundourLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_EMBER), + LEVEL_UP_MOVE( 7, MOVE_HOWL), + LEVEL_UP_MOVE(13, MOVE_SMOG), + LEVEL_UP_MOVE(19, MOVE_ROAR), + LEVEL_UP_MOVE(25, MOVE_BITE), + LEVEL_UP_MOVE(31, MOVE_ODOR_SLEUTH), + LEVEL_UP_MOVE(37, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(43, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(49, MOVE_CRUNCH), + LEVEL_UP_END +}; + +const u16 gHoundoomLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_EMBER), + LEVEL_UP_MOVE( 1, MOVE_HOWL), + LEVEL_UP_MOVE( 7, MOVE_HOWL), + LEVEL_UP_MOVE(13, MOVE_SMOG), + LEVEL_UP_MOVE(19, MOVE_ROAR), + LEVEL_UP_MOVE(27, MOVE_BITE), + LEVEL_UP_MOVE(35, MOVE_ODOR_SLEUTH), + LEVEL_UP_MOVE(43, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(51, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(59, MOVE_CRUNCH), + LEVEL_UP_END +}; + +const u16 gKingdraLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BUBBLE), + LEVEL_UP_MOVE( 1, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 8, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE(15, MOVE_LEER), + LEVEL_UP_MOVE(22, MOVE_WATER_GUN), + LEVEL_UP_MOVE(29, MOVE_TWISTER), + LEVEL_UP_MOVE(40, MOVE_AGILITY), + LEVEL_UP_MOVE(51, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(62, MOVE_DRAGON_DANCE), + LEVEL_UP_END +}; + +const u16 gPhanpyLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ODOR_SLEUTH), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 9, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE(17, MOVE_FLAIL), + LEVEL_UP_MOVE(25, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(33, MOVE_ROLLOUT), + LEVEL_UP_MOVE(41, MOVE_ENDURE), + LEVEL_UP_MOVE(49, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +const u16 gDonphanLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ODOR_SLEUTH), + LEVEL_UP_MOVE( 1, MOVE_HORN_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 9, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE(17, MOVE_FLAIL), + LEVEL_UP_MOVE(25, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(33, MOVE_ROLLOUT), + LEVEL_UP_MOVE(41, MOVE_RAPID_SPIN), + LEVEL_UP_MOVE(49, MOVE_EARTHQUAKE), + LEVEL_UP_END +}; + +const u16 gPorygon2LevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_CONVERSION_2), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_CONVERSION), + LEVEL_UP_MOVE( 9, MOVE_AGILITY), + LEVEL_UP_MOVE(12, MOVE_PSYBEAM), + LEVEL_UP_MOVE(20, MOVE_RECOVER), + LEVEL_UP_MOVE(24, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE(32, MOVE_LOCK_ON), + LEVEL_UP_MOVE(36, MOVE_TRI_ATTACK), + LEVEL_UP_MOVE(44, MOVE_RECYCLE), + LEVEL_UP_MOVE(48, MOVE_ZAP_CANNON), + LEVEL_UP_END +}; + +const u16 gStantlerLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 7, MOVE_LEER), + LEVEL_UP_MOVE(13, MOVE_ASTONISH), + LEVEL_UP_MOVE(19, MOVE_HYPNOSIS), + LEVEL_UP_MOVE(25, MOVE_STOMP), + LEVEL_UP_MOVE(31, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(37, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(43, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(49, MOVE_CALM_MIND), + LEVEL_UP_END +}; + +const u16 gSmeargleLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SKETCH), + LEVEL_UP_MOVE(11, MOVE_SKETCH), + LEVEL_UP_MOVE(21, MOVE_SKETCH), + LEVEL_UP_MOVE(31, MOVE_SKETCH), + LEVEL_UP_MOVE(41, MOVE_SKETCH), + LEVEL_UP_MOVE(51, MOVE_SKETCH), + LEVEL_UP_MOVE(61, MOVE_SKETCH), + LEVEL_UP_MOVE(71, MOVE_SKETCH), + LEVEL_UP_MOVE(81, MOVE_SKETCH), + LEVEL_UP_MOVE(91, MOVE_SKETCH), + LEVEL_UP_END +}; + +const u16 gTyrogueLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_END +}; + +const u16 gHitmontopLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_REVENGE), + LEVEL_UP_MOVE( 1, MOVE_ROLLING_KICK), + LEVEL_UP_MOVE( 7, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(13, MOVE_PURSUIT), + LEVEL_UP_MOVE(19, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(20, MOVE_TRIPLE_KICK), + LEVEL_UP_MOVE(25, MOVE_RAPID_SPIN), + LEVEL_UP_MOVE(31, MOVE_COUNTER), + LEVEL_UP_MOVE(37, MOVE_AGILITY), + LEVEL_UP_MOVE(43, MOVE_DETECT), + LEVEL_UP_MOVE(49, MOVE_ENDEAVOR), + LEVEL_UP_END +}; + +const u16 gSmoochumLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POUND), + LEVEL_UP_MOVE( 1, MOVE_LICK), + LEVEL_UP_MOVE( 9, MOVE_SWEET_KISS), + LEVEL_UP_MOVE(13, MOVE_POWDER_SNOW), + LEVEL_UP_MOVE(21, MOVE_CONFUSION), + LEVEL_UP_MOVE(25, MOVE_SING), + LEVEL_UP_MOVE(33, MOVE_MEAN_LOOK), + LEVEL_UP_MOVE(37, MOVE_FAKE_TEARS), + LEVEL_UP_MOVE(45, MOVE_PSYCHIC), + LEVEL_UP_MOVE(49, MOVE_PERISH_SONG), + LEVEL_UP_MOVE(57, MOVE_BLIZZARD), + LEVEL_UP_END +}; + +const u16 gElekidLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 9, MOVE_THUNDER_PUNCH), + LEVEL_UP_MOVE(17, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(25, MOVE_SWIFT), + LEVEL_UP_MOVE(33, MOVE_SCREECH), + LEVEL_UP_MOVE(41, MOVE_THUNDERBOLT), + LEVEL_UP_MOVE(49, MOVE_THUNDER), + LEVEL_UP_END +}; + +const u16 gMagbyLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_EMBER), + LEVEL_UP_MOVE( 7, MOVE_LEER), + LEVEL_UP_MOVE(13, MOVE_SMOG), + LEVEL_UP_MOVE(19, MOVE_FIRE_PUNCH), + LEVEL_UP_MOVE(25, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE(31, MOVE_SUNNY_DAY), + LEVEL_UP_MOVE(37, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(43, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(49, MOVE_FIRE_BLAST), + LEVEL_UP_END +}; + +const u16 gMiltankLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 4, MOVE_GROWL), + LEVEL_UP_MOVE( 8, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE(13, MOVE_STOMP), + LEVEL_UP_MOVE(19, MOVE_MILK_DRINK), + LEVEL_UP_MOVE(26, MOVE_BIDE), + LEVEL_UP_MOVE(34, MOVE_ROLLOUT), + LEVEL_UP_MOVE(43, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(53, MOVE_HEAL_BELL), + LEVEL_UP_END +}; + +const u16 gBlisseyLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POUND), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 4, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 7, MOVE_REFRESH), + LEVEL_UP_MOVE(10, MOVE_SOFT_BOILED), + LEVEL_UP_MOVE(13, MOVE_DOUBLE_SLAP), + LEVEL_UP_MOVE(18, MOVE_MINIMIZE), + LEVEL_UP_MOVE(23, MOVE_SING), + LEVEL_UP_MOVE(28, MOVE_EGG_BOMB), + LEVEL_UP_MOVE(33, MOVE_DEFENSE_CURL), + LEVEL_UP_MOVE(40, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(47, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +const u16 gRaikouLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE(11, MOVE_THUNDER_SHOCK), + LEVEL_UP_MOVE(21, MOVE_ROAR), + LEVEL_UP_MOVE(31, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(41, MOVE_SPARK), + LEVEL_UP_MOVE(51, MOVE_REFLECT), + LEVEL_UP_MOVE(61, MOVE_CRUNCH), + LEVEL_UP_MOVE(71, MOVE_THUNDER), + LEVEL_UP_MOVE(81, MOVE_CALM_MIND), + LEVEL_UP_END +}; + +const u16 gEnteiLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE(11, MOVE_EMBER), + LEVEL_UP_MOVE(21, MOVE_ROAR), + LEVEL_UP_MOVE(31, MOVE_FIRE_SPIN), + LEVEL_UP_MOVE(41, MOVE_STOMP), + LEVEL_UP_MOVE(51, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(61, MOVE_SWAGGER), + LEVEL_UP_MOVE(71, MOVE_FIRE_BLAST), + LEVEL_UP_MOVE(81, MOVE_CALM_MIND), + LEVEL_UP_END +}; + +const u16 gSuicuneLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE(11, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(21, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(31, MOVE_GUST), + LEVEL_UP_MOVE(41, MOVE_AURORA_BEAM), + LEVEL_UP_MOVE(51, MOVE_MIST), + LEVEL_UP_MOVE(61, MOVE_MIRROR_COAT), + LEVEL_UP_MOVE(71, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(81, MOVE_CALM_MIND), + LEVEL_UP_END +}; + +const u16 gLarvitarLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 8, MOVE_SANDSTORM), + LEVEL_UP_MOVE(15, MOVE_SCREECH), + LEVEL_UP_MOVE(22, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(29, MOVE_THRASH), + LEVEL_UP_MOVE(36, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(43, MOVE_CRUNCH), + LEVEL_UP_MOVE(50, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(57, MOVE_HYPER_BEAM), + LEVEL_UP_END +}; + +const u16 gPupitarLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_SANDSTORM), + LEVEL_UP_MOVE( 1, MOVE_SCREECH), + LEVEL_UP_MOVE( 8, MOVE_SANDSTORM), + LEVEL_UP_MOVE(15, MOVE_SCREECH), + LEVEL_UP_MOVE(22, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(29, MOVE_THRASH), + LEVEL_UP_MOVE(38, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(47, MOVE_CRUNCH), + LEVEL_UP_MOVE(56, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM), + LEVEL_UP_END +}; + +const u16 gTyranitarLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_SANDSTORM), + LEVEL_UP_MOVE( 1, MOVE_SCREECH), + LEVEL_UP_MOVE( 8, MOVE_SANDSTORM), + LEVEL_UP_MOVE(15, MOVE_SCREECH), + LEVEL_UP_MOVE(22, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(29, MOVE_THRASH), + LEVEL_UP_MOVE(38, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(47, MOVE_CRUNCH), + LEVEL_UP_MOVE(61, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(75, MOVE_HYPER_BEAM), + LEVEL_UP_END +}; + +const u16 gLugiaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WHIRLWIND), + LEVEL_UP_MOVE(11, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(22, MOVE_GUST), + LEVEL_UP_MOVE(33, MOVE_RECOVER), + LEVEL_UP_MOVE(44, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(55, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(66, MOVE_SWIFT), + LEVEL_UP_MOVE(77, MOVE_AEROBLAST), + LEVEL_UP_MOVE(88, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(99, MOVE_FUTURE_SIGHT), + LEVEL_UP_END +}; + +const u16 gHoOhLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WHIRLWIND), + LEVEL_UP_MOVE(11, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(22, MOVE_GUST), + LEVEL_UP_MOVE(33, MOVE_RECOVER), + LEVEL_UP_MOVE(44, MOVE_FIRE_BLAST), + LEVEL_UP_MOVE(55, MOVE_SUNNY_DAY), + LEVEL_UP_MOVE(66, MOVE_SWIFT), + LEVEL_UP_MOVE(77, MOVE_SACRED_FIRE), + LEVEL_UP_MOVE(88, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(99, MOVE_FUTURE_SIGHT), + LEVEL_UP_END +}; + +const u16 gCelebiLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_LEECH_SEED), + LEVEL_UP_MOVE( 1, MOVE_CONFUSION), + LEVEL_UP_MOVE( 1, MOVE_RECOVER), + LEVEL_UP_MOVE( 1, MOVE_HEAL_BELL), + LEVEL_UP_MOVE(10, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(20, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(30, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(40, MOVE_BATON_PASS), + LEVEL_UP_MOVE(50, MOVE_PERISH_SONG), + LEVEL_UP_END +}; + +const u16 gSpecies252LevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_END +}; + +const u16 gSpecies253LevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_END +}; + +const u16 gSpecies254LevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_END +}; + +const u16 gSpecies255LevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_END +}; + +const u16 gSpecies256LevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_END +}; + +const u16 gSpecies257LevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_END +}; + +const u16 gSpecies258LevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_END +}; + +const u16 gSpecies259LevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_END +}; + +const u16 gSpecies260LevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_END +}; + +const u16 gSpecies261LevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_END +}; + +const u16 gSpecies262LevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_END +}; + +const u16 gSpecies263LevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_END +}; + +const u16 gSpecies264LevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_END +}; + +const u16 gSpecies265LevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_END +}; + +const u16 gSpecies266LevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_END +}; + +const u16 gSpecies267LevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_END +}; + +const u16 gSpecies268LevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_END +}; + +const u16 gSpecies269LevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_END +}; + +const u16 gSpecies270LevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_END +}; + +const u16 gSpecies271LevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_END +}; + +const u16 gSpecies272LevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_END +}; + +const u16 gSpecies273LevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_END +}; + +const u16 gSpecies274LevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_END +}; + +const u16 gSpecies275LevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_END +}; + +const u16 gSpecies276LevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_END +}; + +const u16 gTreeckoLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POUND), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 6, MOVE_ABSORB), + LEVEL_UP_MOVE(11, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(16, MOVE_PURSUIT), + LEVEL_UP_MOVE(21, MOVE_SCREECH), + LEVEL_UP_MOVE(26, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE(31, MOVE_AGILITY), + LEVEL_UP_MOVE(36, MOVE_SLAM), + LEVEL_UP_MOVE(41, MOVE_DETECT), + LEVEL_UP_MOVE(46, MOVE_GIGA_DRAIN), + LEVEL_UP_END +}; + +const u16 gGrovyleLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POUND), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_ABSORB), + LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE( 6, MOVE_ABSORB), + LEVEL_UP_MOVE(11, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(16, MOVE_FURY_CUTTER), + LEVEL_UP_MOVE(17, MOVE_PURSUIT), + LEVEL_UP_MOVE(23, MOVE_SCREECH), + LEVEL_UP_MOVE(29, MOVE_LEAF_BLADE), + LEVEL_UP_MOVE(35, MOVE_AGILITY), + LEVEL_UP_MOVE(41, MOVE_SLAM), + LEVEL_UP_MOVE(47, MOVE_DETECT), + LEVEL_UP_MOVE(53, MOVE_FALSE_SWIPE), + LEVEL_UP_END +}; + +const u16 gSceptileLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POUND), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_ABSORB), + LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE( 6, MOVE_ABSORB), + LEVEL_UP_MOVE(11, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(16, MOVE_FURY_CUTTER), + LEVEL_UP_MOVE(17, MOVE_PURSUIT), + LEVEL_UP_MOVE(23, MOVE_SCREECH), + LEVEL_UP_MOVE(29, MOVE_LEAF_BLADE), + LEVEL_UP_MOVE(35, MOVE_AGILITY), + LEVEL_UP_MOVE(43, MOVE_SLAM), + LEVEL_UP_MOVE(51, MOVE_DETECT), + LEVEL_UP_MOVE(59, MOVE_FALSE_SWIPE), + LEVEL_UP_END +}; + +const u16 gTorchicLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 7, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(10, MOVE_EMBER), + LEVEL_UP_MOVE(16, MOVE_PECK), + LEVEL_UP_MOVE(19, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(25, MOVE_FIRE_SPIN), + LEVEL_UP_MOVE(28, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(34, MOVE_SLASH), + LEVEL_UP_MOVE(37, MOVE_MIRROR_MOVE), + LEVEL_UP_MOVE(43, MOVE_FLAMETHROWER), + LEVEL_UP_END +}; + +const u16 gCombuskenLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE( 1, MOVE_EMBER), + LEVEL_UP_MOVE( 7, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(13, MOVE_EMBER), + LEVEL_UP_MOVE(16, MOVE_DOUBLE_KICK), + LEVEL_UP_MOVE(17, MOVE_PECK), + LEVEL_UP_MOVE(21, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(28, MOVE_BULK_UP), + LEVEL_UP_MOVE(32, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(39, MOVE_SLASH), + LEVEL_UP_MOVE(43, MOVE_MIRROR_MOVE), + LEVEL_UP_MOVE(50, MOVE_SKY_UPPERCUT), + LEVEL_UP_END +}; + +const u16 gBlazikenLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_FIRE_PUNCH), + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE( 1, MOVE_EMBER), + LEVEL_UP_MOVE( 7, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(13, MOVE_EMBER), + LEVEL_UP_MOVE(16, MOVE_DOUBLE_KICK), + LEVEL_UP_MOVE(17, MOVE_PECK), + LEVEL_UP_MOVE(21, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(28, MOVE_BULK_UP), + LEVEL_UP_MOVE(32, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(36, MOVE_BLAZE_KICK), + LEVEL_UP_MOVE(42, MOVE_SLASH), + LEVEL_UP_MOVE(49, MOVE_MIRROR_MOVE), + LEVEL_UP_MOVE(59, MOVE_SKY_UPPERCUT), + LEVEL_UP_END +}; + +const u16 gMudkipLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 6, MOVE_MUD_SLAP), + LEVEL_UP_MOVE(10, MOVE_WATER_GUN), + LEVEL_UP_MOVE(15, MOVE_BIDE), + LEVEL_UP_MOVE(19, MOVE_FORESIGHT), + LEVEL_UP_MOVE(24, MOVE_MUD_SPORT), + LEVEL_UP_MOVE(28, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(33, MOVE_WHIRLPOOL), + LEVEL_UP_MOVE(37, MOVE_PROTECT), + LEVEL_UP_MOVE(42, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(46, MOVE_ENDEAVOR), + LEVEL_UP_END +}; + +const u16 gMarshtompLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_MUD_SLAP), + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 6, MOVE_MUD_SLAP), + LEVEL_UP_MOVE(10, MOVE_WATER_GUN), + LEVEL_UP_MOVE(15, MOVE_BIDE), + LEVEL_UP_MOVE(16, MOVE_MUD_SHOT), + LEVEL_UP_MOVE(20, MOVE_FORESIGHT), + LEVEL_UP_MOVE(25, MOVE_MUD_SPORT), + LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(37, MOVE_MUDDY_WATER), + LEVEL_UP_MOVE(42, MOVE_PROTECT), + LEVEL_UP_MOVE(46, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(53, MOVE_ENDEAVOR), + LEVEL_UP_END +}; + +const u16 gSwampertLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_MUD_SLAP), + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 6, MOVE_MUD_SLAP), + LEVEL_UP_MOVE(10, MOVE_WATER_GUN), + LEVEL_UP_MOVE(15, MOVE_BIDE), + LEVEL_UP_MOVE(16, MOVE_MUD_SHOT), + LEVEL_UP_MOVE(20, MOVE_FORESIGHT), + LEVEL_UP_MOVE(25, MOVE_MUD_SPORT), + LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(39, MOVE_MUDDY_WATER), + LEVEL_UP_MOVE(46, MOVE_PROTECT), + LEVEL_UP_MOVE(52, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(61, MOVE_ENDEAVOR), + LEVEL_UP_END +}; + +const u16 gPoochyenaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 5, MOVE_HOWL), + LEVEL_UP_MOVE( 9, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(13, MOVE_BITE), + LEVEL_UP_MOVE(17, MOVE_ODOR_SLEUTH), + LEVEL_UP_MOVE(21, MOVE_ROAR), + LEVEL_UP_MOVE(25, MOVE_SWAGGER), + LEVEL_UP_MOVE(29, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(33, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(37, MOVE_TAUNT), + LEVEL_UP_MOVE(41, MOVE_CRUNCH), + LEVEL_UP_MOVE(45, MOVE_THIEF), + LEVEL_UP_END +}; + +const u16 gMightyenaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_HOWL), + LEVEL_UP_MOVE( 1, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 5, MOVE_HOWL), + LEVEL_UP_MOVE( 9, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(13, MOVE_BITE), + LEVEL_UP_MOVE(17, MOVE_ODOR_SLEUTH), + LEVEL_UP_MOVE(22, MOVE_ROAR), + LEVEL_UP_MOVE(27, MOVE_SWAGGER), + LEVEL_UP_MOVE(32, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(37, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(42, MOVE_TAUNT), + LEVEL_UP_MOVE(47, MOVE_CRUNCH), + LEVEL_UP_MOVE(52, MOVE_THIEF), + LEVEL_UP_END +}; + +const u16 gZigzagoonLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 5, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 9, MOVE_HEADBUTT), + LEVEL_UP_MOVE(13, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(17, MOVE_ODOR_SLEUTH), + LEVEL_UP_MOVE(21, MOVE_MUD_SPORT), + LEVEL_UP_MOVE(25, MOVE_PIN_MISSILE), + LEVEL_UP_MOVE(29, MOVE_COVET), + LEVEL_UP_MOVE(33, MOVE_FLAIL), + LEVEL_UP_MOVE(37, MOVE_REST), + LEVEL_UP_MOVE(41, MOVE_BELLY_DRUM), + LEVEL_UP_END +}; + +const u16 gLinooneLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 1, MOVE_HEADBUTT), + LEVEL_UP_MOVE( 5, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 9, MOVE_HEADBUTT), + LEVEL_UP_MOVE(13, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(17, MOVE_ODOR_SLEUTH), + LEVEL_UP_MOVE(23, MOVE_MUD_SPORT), + LEVEL_UP_MOVE(29, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(35, MOVE_COVET), + LEVEL_UP_MOVE(41, MOVE_SLASH), + LEVEL_UP_MOVE(47, MOVE_REST), + LEVEL_UP_MOVE(53, MOVE_BELLY_DRUM), + LEVEL_UP_END +}; + +const u16 gWurmpleLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_STRING_SHOT), + LEVEL_UP_MOVE( 5, MOVE_POISON_STING), + LEVEL_UP_END +}; + +const u16 gSilcoonLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_HARDEN), + LEVEL_UP_MOVE( 7, MOVE_HARDEN), + LEVEL_UP_END +}; + +const u16 gBeautiflyLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ABSORB), + LEVEL_UP_MOVE(10, MOVE_ABSORB), + LEVEL_UP_MOVE(13, MOVE_GUST), + LEVEL_UP_MOVE(17, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(20, MOVE_MORNING_SUN), + LEVEL_UP_MOVE(24, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE(27, MOVE_WHIRLWIND), + LEVEL_UP_MOVE(31, MOVE_ATTRACT), + LEVEL_UP_MOVE(34, MOVE_SILVER_WIND), + LEVEL_UP_MOVE(38, MOVE_GIGA_DRAIN), + LEVEL_UP_END +}; + +const u16 gCascoonLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_HARDEN), + LEVEL_UP_MOVE( 7, MOVE_HARDEN), + LEVEL_UP_END +}; + +const u16 gDustoxLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_CONFUSION), + LEVEL_UP_MOVE(10, MOVE_CONFUSION), + LEVEL_UP_MOVE(13, MOVE_GUST), + LEVEL_UP_MOVE(17, MOVE_PROTECT), + LEVEL_UP_MOVE(20, MOVE_MOONLIGHT), + LEVEL_UP_MOVE(24, MOVE_PSYBEAM), + LEVEL_UP_MOVE(27, MOVE_WHIRLWIND), + LEVEL_UP_MOVE(31, MOVE_LIGHT_SCREEN), + LEVEL_UP_MOVE(34, MOVE_SILVER_WIND), + LEVEL_UP_MOVE(38, MOVE_TOXIC), + LEVEL_UP_END +}; + +const u16 gLotadLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ASTONISH), + LEVEL_UP_MOVE( 3, MOVE_GROWL), + LEVEL_UP_MOVE( 7, MOVE_ABSORB), + LEVEL_UP_MOVE(13, MOVE_NATURE_POWER), + LEVEL_UP_MOVE(21, MOVE_MIST), + LEVEL_UP_MOVE(31, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(43, MOVE_MEGA_DRAIN), + LEVEL_UP_END +}; + +const u16 gLombreLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ASTONISH), + LEVEL_UP_MOVE( 3, MOVE_GROWL), + LEVEL_UP_MOVE( 7, MOVE_ABSORB), + LEVEL_UP_MOVE(13, MOVE_NATURE_POWER), + LEVEL_UP_MOVE(19, MOVE_FAKE_OUT), + LEVEL_UP_MOVE(25, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(31, MOVE_WATER_SPORT), + LEVEL_UP_MOVE(37, MOVE_THIEF), + LEVEL_UP_MOVE(43, MOVE_UPROAR), + LEVEL_UP_MOVE(49, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +const u16 gLudicoloLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ASTONISH), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_ABSORB), + LEVEL_UP_MOVE( 1, MOVE_NATURE_POWER), + LEVEL_UP_END +}; + +const u16 gSeedotLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BIDE), + LEVEL_UP_MOVE( 3, MOVE_HARDEN), + LEVEL_UP_MOVE( 7, MOVE_GROWTH), + LEVEL_UP_MOVE(13, MOVE_NATURE_POWER), + LEVEL_UP_MOVE(21, MOVE_SYNTHESIS), + LEVEL_UP_MOVE(31, MOVE_SUNNY_DAY), + LEVEL_UP_MOVE(43, MOVE_EXPLOSION), + LEVEL_UP_END +}; + +const u16 gNuzleafLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POUND), + LEVEL_UP_MOVE( 3, MOVE_HARDEN), + LEVEL_UP_MOVE( 7, MOVE_GROWTH), + LEVEL_UP_MOVE(13, MOVE_NATURE_POWER), + LEVEL_UP_MOVE(19, MOVE_FAKE_OUT), + LEVEL_UP_MOVE(25, MOVE_TORMENT), + LEVEL_UP_MOVE(31, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(37, MOVE_RAZOR_WIND), + LEVEL_UP_MOVE(43, MOVE_SWAGGER), + LEVEL_UP_MOVE(49, MOVE_EXTRASENSORY), + LEVEL_UP_END +}; + +const u16 gShiftryLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POUND), + LEVEL_UP_MOVE( 1, MOVE_HARDEN), + LEVEL_UP_MOVE( 1, MOVE_GROWTH), + LEVEL_UP_MOVE( 1, MOVE_NATURE_POWER), + LEVEL_UP_END +}; + +const u16 gNincadaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_HARDEN), + LEVEL_UP_MOVE( 5, MOVE_LEECH_LIFE), + LEVEL_UP_MOVE( 9, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(14, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(19, MOVE_MIND_READER), + LEVEL_UP_MOVE(25, MOVE_FALSE_SWIPE), + LEVEL_UP_MOVE(31, MOVE_MUD_SLAP), + LEVEL_UP_MOVE(38, MOVE_METAL_CLAW), + LEVEL_UP_MOVE(45, MOVE_DIG), + LEVEL_UP_END +}; + +const u16 gNinjaskLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_HARDEN), + LEVEL_UP_MOVE( 1, MOVE_LEECH_LIFE), + LEVEL_UP_MOVE( 1, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 5, MOVE_LEECH_LIFE), + LEVEL_UP_MOVE( 9, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(14, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(19, MOVE_MIND_READER), + LEVEL_UP_MOVE(20, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE(20, MOVE_FURY_CUTTER), + LEVEL_UP_MOVE(20, MOVE_SCREECH), + LEVEL_UP_MOVE(25, MOVE_SWORDS_DANCE), + LEVEL_UP_MOVE(31, MOVE_SLASH), + LEVEL_UP_MOVE(38, MOVE_AGILITY), + LEVEL_UP_MOVE(45, MOVE_BATON_PASS), + LEVEL_UP_END +}; + +const u16 gShedinjaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_HARDEN), + LEVEL_UP_MOVE( 5, MOVE_LEECH_LIFE), + LEVEL_UP_MOVE( 9, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(14, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(19, MOVE_MIND_READER), + LEVEL_UP_MOVE(25, MOVE_SPITE), + LEVEL_UP_MOVE(31, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(38, MOVE_SHADOW_BALL), + LEVEL_UP_MOVE(45, MOVE_GRUDGE), + LEVEL_UP_END +}; + +const u16 gTaillowLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_PECK), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 4, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE( 8, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(13, MOVE_WING_ATTACK), + LEVEL_UP_MOVE(19, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE(26, MOVE_ENDEAVOR), + LEVEL_UP_MOVE(34, MOVE_AERIAL_ACE), + LEVEL_UP_MOVE(43, MOVE_AGILITY), + LEVEL_UP_END +}; + +const u16 gSwellowLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_PECK), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE( 4, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE( 8, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(13, MOVE_WING_ATTACK), + LEVEL_UP_MOVE(19, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE(28, MOVE_ENDEAVOR), + LEVEL_UP_MOVE(38, MOVE_AERIAL_ACE), + LEVEL_UP_MOVE(49, MOVE_AGILITY), + LEVEL_UP_END +}; + +const u16 gShroomishLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ABSORB), + LEVEL_UP_MOVE( 4, MOVE_TACKLE), + LEVEL_UP_MOVE( 7, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(10, MOVE_LEECH_SEED), + LEVEL_UP_MOVE(16, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE(22, MOVE_HEADBUTT), + LEVEL_UP_MOVE(28, MOVE_POISON_POWDER), + LEVEL_UP_MOVE(36, MOVE_GROWTH), + LEVEL_UP_MOVE(45, MOVE_GIGA_DRAIN), + LEVEL_UP_MOVE(54, MOVE_SPORE), + LEVEL_UP_END +}; + +const u16 gBreloomLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ABSORB), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_STUN_SPORE), + LEVEL_UP_MOVE( 1, MOVE_LEECH_SEED), + LEVEL_UP_MOVE( 4, MOVE_TACKLE), + LEVEL_UP_MOVE( 7, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(10, MOVE_LEECH_SEED), + LEVEL_UP_MOVE(16, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE(22, MOVE_HEADBUTT), + LEVEL_UP_MOVE(23, MOVE_MACH_PUNCH), + LEVEL_UP_MOVE(28, MOVE_COUNTER), + LEVEL_UP_MOVE(36, MOVE_SKY_UPPERCUT), + LEVEL_UP_MOVE(45, MOVE_MIND_READER), + LEVEL_UP_MOVE(54, MOVE_DYNAMIC_PUNCH), + LEVEL_UP_END +}; + +const u16 gSpindaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 5, MOVE_UPROAR), + LEVEL_UP_MOVE(12, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(16, MOVE_PSYBEAM), + LEVEL_UP_MOVE(23, MOVE_HYPNOSIS), + LEVEL_UP_MOVE(27, MOVE_DIZZY_PUNCH), + LEVEL_UP_MOVE(34, MOVE_TEETER_DANCE), + LEVEL_UP_MOVE(38, MOVE_PSYCH_UP), + LEVEL_UP_MOVE(45, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(49, MOVE_FLAIL), + LEVEL_UP_MOVE(56, MOVE_THRASH), + LEVEL_UP_END +}; + +const u16 gWingullLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 7, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(13, MOVE_WING_ATTACK), + LEVEL_UP_MOVE(21, MOVE_MIST), + LEVEL_UP_MOVE(31, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(43, MOVE_PURSUIT), + LEVEL_UP_MOVE(55, MOVE_AGILITY), + LEVEL_UP_END +}; + +const u16 gPelipperLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 1, MOVE_WATER_SPORT), + LEVEL_UP_MOVE( 1, MOVE_WING_ATTACK), + LEVEL_UP_MOVE( 3, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 7, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(13, MOVE_WING_ATTACK), + LEVEL_UP_MOVE(21, MOVE_MIST), + LEVEL_UP_MOVE(25, MOVE_PROTECT), + LEVEL_UP_MOVE(33, MOVE_STOCKPILE), + LEVEL_UP_MOVE(33, MOVE_SWALLOW), + LEVEL_UP_MOVE(47, MOVE_SPIT_UP), + LEVEL_UP_MOVE(61, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +const u16 gSurskitLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BUBBLE), + LEVEL_UP_MOVE( 7, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(13, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE(19, MOVE_WATER_SPORT), + LEVEL_UP_MOVE(25, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(31, MOVE_AGILITY), + LEVEL_UP_MOVE(37, MOVE_MIST), + LEVEL_UP_MOVE(37, MOVE_HAZE), + LEVEL_UP_END +}; + +const u16 gMasquerainLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BUBBLE), + LEVEL_UP_MOVE( 1, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE( 1, MOVE_WATER_SPORT), + LEVEL_UP_MOVE( 7, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(13, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE(19, MOVE_WATER_SPORT), + LEVEL_UP_MOVE(26, MOVE_GUST), + LEVEL_UP_MOVE(33, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(40, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(47, MOVE_SILVER_WIND), + LEVEL_UP_MOVE(53, MOVE_WHIRLWIND), + LEVEL_UP_END +}; + +const u16 gWailmerLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SPLASH), + LEVEL_UP_MOVE( 5, MOVE_GROWL), + LEVEL_UP_MOVE(10, MOVE_WATER_GUN), + LEVEL_UP_MOVE(14, MOVE_ROLLOUT), + LEVEL_UP_MOVE(19, MOVE_WHIRLPOOL), + LEVEL_UP_MOVE(23, MOVE_ASTONISH), + LEVEL_UP_MOVE(28, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(32, MOVE_MIST), + LEVEL_UP_MOVE(37, MOVE_REST), + LEVEL_UP_MOVE(41, MOVE_WATER_SPOUT), + LEVEL_UP_MOVE(46, MOVE_AMNESIA), + LEVEL_UP_MOVE(50, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +const u16 gWailordLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SPLASH), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 1, MOVE_ROLLOUT), + LEVEL_UP_MOVE( 5, MOVE_GROWL), + LEVEL_UP_MOVE(10, MOVE_WATER_GUN), + LEVEL_UP_MOVE(14, MOVE_ROLLOUT), + LEVEL_UP_MOVE(19, MOVE_WHIRLPOOL), + LEVEL_UP_MOVE(23, MOVE_ASTONISH), + LEVEL_UP_MOVE(28, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(32, MOVE_MIST), + LEVEL_UP_MOVE(37, MOVE_REST), + LEVEL_UP_MOVE(44, MOVE_WATER_SPOUT), + LEVEL_UP_MOVE(52, MOVE_AMNESIA), + LEVEL_UP_MOVE(59, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +const u16 gSkittyLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 3, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 7, MOVE_ATTRACT), + LEVEL_UP_MOVE(13, MOVE_SING), + LEVEL_UP_MOVE(15, MOVE_DOUBLE_SLAP), + LEVEL_UP_MOVE(19, MOVE_ASSIST), + LEVEL_UP_MOVE(25, MOVE_CHARM), + LEVEL_UP_MOVE(27, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(31, MOVE_COVET), + LEVEL_UP_MOVE(37, MOVE_HEAL_BELL), + LEVEL_UP_MOVE(39, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +const u16 gDelcattyLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_ATTRACT), + LEVEL_UP_MOVE( 1, MOVE_SING), + LEVEL_UP_MOVE( 1, MOVE_DOUBLE_SLAP), + LEVEL_UP_END +}; + +const u16 gKecleonLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_THIEF), + LEVEL_UP_MOVE( 1, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE( 1, MOVE_ASTONISH), + LEVEL_UP_MOVE( 1, MOVE_LICK), + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 4, MOVE_BIND), + LEVEL_UP_MOVE( 7, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(12, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(17, MOVE_PSYBEAM), + LEVEL_UP_MOVE(24, MOVE_SCREECH), + LEVEL_UP_MOVE(31, MOVE_SLASH), + LEVEL_UP_MOVE(40, MOVE_SUBSTITUTE), + LEVEL_UP_MOVE(49, MOVE_ANCIENT_POWER), + LEVEL_UP_END +}; + +const u16 gBaltoyLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_CONFUSION), + LEVEL_UP_MOVE( 3, MOVE_HARDEN), + LEVEL_UP_MOVE( 5, MOVE_RAPID_SPIN), + LEVEL_UP_MOVE( 7, MOVE_MUD_SLAP), + LEVEL_UP_MOVE(11, MOVE_PSYBEAM), + LEVEL_UP_MOVE(15, MOVE_ROCK_TOMB), + LEVEL_UP_MOVE(19, MOVE_SELF_DESTRUCT), + LEVEL_UP_MOVE(25, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(31, MOVE_SANDSTORM), + LEVEL_UP_MOVE(37, MOVE_COSMIC_POWER), + LEVEL_UP_MOVE(45, MOVE_EXPLOSION), + LEVEL_UP_END +}; + +const u16 gClaydolLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TELEPORT), + LEVEL_UP_MOVE( 1, MOVE_CONFUSION), + LEVEL_UP_MOVE( 1, MOVE_HARDEN), + LEVEL_UP_MOVE( 1, MOVE_RAPID_SPIN), + LEVEL_UP_MOVE( 3, MOVE_HARDEN), + LEVEL_UP_MOVE( 5, MOVE_RAPID_SPIN), + LEVEL_UP_MOVE( 7, MOVE_MUD_SLAP), + LEVEL_UP_MOVE(11, MOVE_PSYBEAM), + LEVEL_UP_MOVE(15, MOVE_ROCK_TOMB), + LEVEL_UP_MOVE(19, MOVE_SELF_DESTRUCT), + LEVEL_UP_MOVE(25, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(31, MOVE_SANDSTORM), + LEVEL_UP_MOVE(36, MOVE_HYPER_BEAM), + LEVEL_UP_MOVE(42, MOVE_COSMIC_POWER), + LEVEL_UP_MOVE(55, MOVE_EXPLOSION), + LEVEL_UP_END +}; + +const u16 gNosepassLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 7, MOVE_HARDEN), + LEVEL_UP_MOVE(13, MOVE_ROCK_THROW), + LEVEL_UP_MOVE(16, MOVE_BLOCK), + LEVEL_UP_MOVE(22, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE(28, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(31, MOVE_SANDSTORM), + LEVEL_UP_MOVE(37, MOVE_REST), + LEVEL_UP_MOVE(43, MOVE_ZAP_CANNON), + LEVEL_UP_MOVE(46, MOVE_LOCK_ON), + LEVEL_UP_END +}; + +const u16 gTorkoalLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_EMBER), + LEVEL_UP_MOVE( 4, MOVE_SMOG), + LEVEL_UP_MOVE( 7, MOVE_CURSE), + LEVEL_UP_MOVE(14, MOVE_SMOKESCREEN), + LEVEL_UP_MOVE(17, MOVE_FIRE_SPIN), + LEVEL_UP_MOVE(20, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(27, MOVE_PROTECT), + LEVEL_UP_MOVE(30, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(33, MOVE_IRON_DEFENSE), + LEVEL_UP_MOVE(40, MOVE_AMNESIA), + LEVEL_UP_MOVE(43, MOVE_FLAIL), + LEVEL_UP_MOVE(46, MOVE_HEAT_WAVE), + LEVEL_UP_END +}; + +const u16 gSableyeLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 5, MOVE_FORESIGHT), + LEVEL_UP_MOVE( 9, MOVE_NIGHT_SHADE), + LEVEL_UP_MOVE(13, MOVE_ASTONISH), + LEVEL_UP_MOVE(17, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(21, MOVE_FAKE_OUT), + LEVEL_UP_MOVE(25, MOVE_DETECT), + LEVEL_UP_MOVE(29, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(33, MOVE_KNOCK_OFF), + LEVEL_UP_MOVE(37, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(41, MOVE_SHADOW_BALL), + LEVEL_UP_MOVE(45, MOVE_MEAN_LOOK), + LEVEL_UP_END +}; + +const u16 gBarboachLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_MUD_SLAP), + LEVEL_UP_MOVE( 6, MOVE_MUD_SPORT), + LEVEL_UP_MOVE( 6, MOVE_WATER_SPORT), + LEVEL_UP_MOVE(11, MOVE_WATER_GUN), + LEVEL_UP_MOVE(16, MOVE_MAGNITUDE), + LEVEL_UP_MOVE(21, MOVE_AMNESIA), + LEVEL_UP_MOVE(26, MOVE_REST), + LEVEL_UP_MOVE(26, MOVE_SNORE), + LEVEL_UP_MOVE(31, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(36, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(41, MOVE_FISSURE), + LEVEL_UP_END +}; + +const u16 gWhiscashLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TICKLE), + LEVEL_UP_MOVE( 1, MOVE_MUD_SLAP), + LEVEL_UP_MOVE( 1, MOVE_MUD_SPORT), + LEVEL_UP_MOVE( 1, MOVE_WATER_SPORT), + LEVEL_UP_MOVE( 6, MOVE_MUD_SPORT), + LEVEL_UP_MOVE( 6, MOVE_WATER_SPORT), + LEVEL_UP_MOVE(11, MOVE_WATER_GUN), + LEVEL_UP_MOVE(16, MOVE_MAGNITUDE), + LEVEL_UP_MOVE(21, MOVE_AMNESIA), + LEVEL_UP_MOVE(26, MOVE_REST), + LEVEL_UP_MOVE(26, MOVE_SNORE), + LEVEL_UP_MOVE(36, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(46, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(56, MOVE_FISSURE), + LEVEL_UP_END +}; + +const u16 gLuvdiscLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 4, MOVE_CHARM), + LEVEL_UP_MOVE(12, MOVE_WATER_GUN), + LEVEL_UP_MOVE(16, MOVE_AGILITY), + LEVEL_UP_MOVE(24, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(28, MOVE_ATTRACT), + LEVEL_UP_MOVE(36, MOVE_SWEET_KISS), + LEVEL_UP_MOVE(40, MOVE_FLAIL), + LEVEL_UP_MOVE(48, MOVE_SAFEGUARD), + LEVEL_UP_END +}; + +const u16 gCorphishLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BUBBLE), + LEVEL_UP_MOVE( 7, MOVE_HARDEN), + LEVEL_UP_MOVE(10, MOVE_VICE_GRIP), + LEVEL_UP_MOVE(13, MOVE_LEER), + LEVEL_UP_MOVE(20, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(23, MOVE_PROTECT), + LEVEL_UP_MOVE(26, MOVE_KNOCK_OFF), + LEVEL_UP_MOVE(32, MOVE_TAUNT), + LEVEL_UP_MOVE(35, MOVE_CRABHAMMER), + LEVEL_UP_MOVE(38, MOVE_SWORDS_DANCE), + LEVEL_UP_MOVE(44, MOVE_GUILLOTINE), + LEVEL_UP_END +}; + +const u16 gCrawdauntLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BUBBLE), + LEVEL_UP_MOVE( 1, MOVE_HARDEN), + LEVEL_UP_MOVE( 1, MOVE_VICE_GRIP), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 7, MOVE_HARDEN), + LEVEL_UP_MOVE(10, MOVE_VICE_GRIP), + LEVEL_UP_MOVE(13, MOVE_LEER), + LEVEL_UP_MOVE(20, MOVE_BUBBLE_BEAM), + LEVEL_UP_MOVE(23, MOVE_PROTECT), + LEVEL_UP_MOVE(26, MOVE_KNOCK_OFF), + LEVEL_UP_MOVE(34, MOVE_TAUNT), + LEVEL_UP_MOVE(39, MOVE_CRABHAMMER), + LEVEL_UP_MOVE(44, MOVE_SWORDS_DANCE), + LEVEL_UP_MOVE(52, MOVE_GUILLOTINE), + LEVEL_UP_END +}; + +const u16 gFeebasLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SPLASH), + LEVEL_UP_MOVE(15, MOVE_TACKLE), + LEVEL_UP_MOVE(30, MOVE_FLAIL), + LEVEL_UP_END +}; + +const u16 gMiloticLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 5, MOVE_WRAP), + LEVEL_UP_MOVE(10, MOVE_WATER_SPORT), + LEVEL_UP_MOVE(15, MOVE_REFRESH), + LEVEL_UP_MOVE(20, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(25, MOVE_TWISTER), + LEVEL_UP_MOVE(30, MOVE_RECOVER), + LEVEL_UP_MOVE(35, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(40, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(45, MOVE_ATTRACT), + LEVEL_UP_MOVE(50, MOVE_SAFEGUARD), + LEVEL_UP_END +}; + +const u16 gCarvanhaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 7, MOVE_RAGE), + LEVEL_UP_MOVE(13, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(16, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(22, MOVE_CRUNCH), + LEVEL_UP_MOVE(28, MOVE_SCREECH), + LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(37, MOVE_SWAGGER), + LEVEL_UP_MOVE(43, MOVE_AGILITY), + LEVEL_UP_END +}; + +const u16 gSharpedoLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 1, MOVE_RAGE), + LEVEL_UP_MOVE( 1, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE( 7, MOVE_RAGE), + LEVEL_UP_MOVE(13, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(16, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(22, MOVE_CRUNCH), + LEVEL_UP_MOVE(28, MOVE_SCREECH), + LEVEL_UP_MOVE(33, MOVE_SLASH), + LEVEL_UP_MOVE(38, MOVE_TAUNT), + LEVEL_UP_MOVE(43, MOVE_SWAGGER), + LEVEL_UP_MOVE(48, MOVE_SKULL_BASH), + LEVEL_UP_MOVE(53, MOVE_AGILITY), + LEVEL_UP_END +}; + +const u16 gTrapinchLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 9, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(17, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(25, MOVE_SAND_TOMB), + LEVEL_UP_MOVE(33, MOVE_CRUNCH), + LEVEL_UP_MOVE(41, MOVE_DIG), + LEVEL_UP_MOVE(49, MOVE_SANDSTORM), + LEVEL_UP_MOVE(57, MOVE_HYPER_BEAM), + LEVEL_UP_END +}; + +const u16 gVibravaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 1, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_SAND_TOMB), + LEVEL_UP_MOVE( 9, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(17, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(25, MOVE_SAND_TOMB), + LEVEL_UP_MOVE(33, MOVE_CRUNCH), + LEVEL_UP_MOVE(35, MOVE_DRAGON_BREATH), + LEVEL_UP_MOVE(41, MOVE_SCREECH), + LEVEL_UP_MOVE(49, MOVE_SANDSTORM), + LEVEL_UP_MOVE(57, MOVE_HYPER_BEAM), + LEVEL_UP_END +}; + +const u16 gFlygonLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 1, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_SAND_TOMB), + LEVEL_UP_MOVE( 9, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(17, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(25, MOVE_SAND_TOMB), + LEVEL_UP_MOVE(33, MOVE_CRUNCH), + LEVEL_UP_MOVE(35, MOVE_DRAGON_BREATH), + LEVEL_UP_MOVE(41, MOVE_SCREECH), + LEVEL_UP_MOVE(53, MOVE_SANDSTORM), + LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM), + LEVEL_UP_END +}; + +const u16 gMakuhitaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE( 4, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(10, MOVE_ARM_THRUST), + LEVEL_UP_MOVE(13, MOVE_VITAL_THROW), + LEVEL_UP_MOVE(19, MOVE_FAKE_OUT), + LEVEL_UP_MOVE(22, MOVE_WHIRLWIND), + LEVEL_UP_MOVE(28, MOVE_KNOCK_OFF), + LEVEL_UP_MOVE(31, MOVE_SMELLING_SALT), + LEVEL_UP_MOVE(37, MOVE_BELLY_DRUM), + LEVEL_UP_MOVE(40, MOVE_ENDURE), + LEVEL_UP_MOVE(46, MOVE_SEISMIC_TOSS), + LEVEL_UP_MOVE(49, MOVE_REVERSAL), + LEVEL_UP_END +}; + +const u16 gHariyamaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE( 1, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE( 1, MOVE_ARM_THRUST), + LEVEL_UP_MOVE( 4, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(10, MOVE_ARM_THRUST), + LEVEL_UP_MOVE(13, MOVE_VITAL_THROW), + LEVEL_UP_MOVE(19, MOVE_FAKE_OUT), + LEVEL_UP_MOVE(22, MOVE_WHIRLWIND), + LEVEL_UP_MOVE(29, MOVE_KNOCK_OFF), + LEVEL_UP_MOVE(33, MOVE_SMELLING_SALT), + LEVEL_UP_MOVE(40, MOVE_BELLY_DRUM), + LEVEL_UP_MOVE(44, MOVE_ENDURE), + LEVEL_UP_MOVE(51, MOVE_SEISMIC_TOSS), + LEVEL_UP_MOVE(55, MOVE_REVERSAL), + LEVEL_UP_END +}; + +const u16 gElectrikeLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 4, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE( 9, MOVE_LEER), + LEVEL_UP_MOVE(12, MOVE_HOWL), + LEVEL_UP_MOVE(17, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(20, MOVE_SPARK), + LEVEL_UP_MOVE(25, MOVE_ODOR_SLEUTH), + LEVEL_UP_MOVE(28, MOVE_ROAR), + LEVEL_UP_MOVE(33, MOVE_BITE), + LEVEL_UP_MOVE(36, MOVE_THUNDER), + LEVEL_UP_MOVE(41, MOVE_CHARGE), + LEVEL_UP_END +}; + +const u16 gManectricLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_HOWL), + LEVEL_UP_MOVE( 4, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE( 9, MOVE_LEER), + LEVEL_UP_MOVE(12, MOVE_HOWL), + LEVEL_UP_MOVE(17, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(20, MOVE_SPARK), + LEVEL_UP_MOVE(25, MOVE_ODOR_SLEUTH), + LEVEL_UP_MOVE(31, MOVE_ROAR), + LEVEL_UP_MOVE(39, MOVE_BITE), + LEVEL_UP_MOVE(45, MOVE_THUNDER), + LEVEL_UP_MOVE(53, MOVE_CHARGE), + LEVEL_UP_END +}; + +const u16 gNumelLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE(11, MOVE_EMBER), + LEVEL_UP_MOVE(19, MOVE_MAGNITUDE), + LEVEL_UP_MOVE(25, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(29, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(31, MOVE_AMNESIA), + LEVEL_UP_MOVE(35, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(41, MOVE_FLAMETHROWER), + LEVEL_UP_MOVE(49, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +const u16 gCameruptLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_EMBER), + LEVEL_UP_MOVE( 1, MOVE_MAGNITUDE), + LEVEL_UP_MOVE(11, MOVE_EMBER), + LEVEL_UP_MOVE(19, MOVE_MAGNITUDE), + LEVEL_UP_MOVE(25, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(29, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(31, MOVE_AMNESIA), + LEVEL_UP_MOVE(33, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(37, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(45, MOVE_ERUPTION), + LEVEL_UP_MOVE(55, MOVE_FISSURE), + LEVEL_UP_END +}; + +const u16 gSphealLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POWDER_SNOW), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 7, MOVE_ENCORE), + LEVEL_UP_MOVE(13, MOVE_ICE_BALL), + LEVEL_UP_MOVE(19, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(25, MOVE_AURORA_BEAM), + LEVEL_UP_MOVE(31, MOVE_HAIL), + LEVEL_UP_MOVE(37, MOVE_REST), + LEVEL_UP_MOVE(37, MOVE_SNORE), + LEVEL_UP_MOVE(43, MOVE_BLIZZARD), + LEVEL_UP_MOVE(49, MOVE_SHEER_COLD), + LEVEL_UP_END +}; + +const u16 gSealeoLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POWDER_SNOW), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 1, MOVE_ENCORE), + LEVEL_UP_MOVE( 7, MOVE_ENCORE), + LEVEL_UP_MOVE(13, MOVE_ICE_BALL), + LEVEL_UP_MOVE(19, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(25, MOVE_AURORA_BEAM), + LEVEL_UP_MOVE(31, MOVE_HAIL), + LEVEL_UP_MOVE(39, MOVE_REST), + LEVEL_UP_MOVE(39, MOVE_SNORE), + LEVEL_UP_MOVE(47, MOVE_BLIZZARD), + LEVEL_UP_MOVE(55, MOVE_SHEER_COLD), + LEVEL_UP_END +}; + +const u16 gWalreinLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POWDER_SNOW), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 1, MOVE_ENCORE), + LEVEL_UP_MOVE( 7, MOVE_ENCORE), + LEVEL_UP_MOVE(13, MOVE_ICE_BALL), + LEVEL_UP_MOVE(19, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(25, MOVE_AURORA_BEAM), + LEVEL_UP_MOVE(31, MOVE_HAIL), + LEVEL_UP_MOVE(39, MOVE_REST), + LEVEL_UP_MOVE(39, MOVE_SNORE), + LEVEL_UP_MOVE(50, MOVE_BLIZZARD), + LEVEL_UP_MOVE(61, MOVE_SHEER_COLD), + LEVEL_UP_END +}; + +const u16 gCacneaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POISON_STING), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 5, MOVE_ABSORB), + LEVEL_UP_MOVE( 9, MOVE_GROWTH), + LEVEL_UP_MOVE(13, MOVE_LEECH_SEED), + LEVEL_UP_MOVE(17, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(21, MOVE_PIN_MISSILE), + LEVEL_UP_MOVE(25, MOVE_INGRAIN), + LEVEL_UP_MOVE(29, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(33, MOVE_SPIKES), + LEVEL_UP_MOVE(37, MOVE_NEEDLE_ARM), + LEVEL_UP_MOVE(41, MOVE_COTTON_SPORE), + LEVEL_UP_MOVE(45, MOVE_SANDSTORM), + LEVEL_UP_END +}; + +const u16 gCacturneLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POISON_STING), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_ABSORB), + LEVEL_UP_MOVE( 1, MOVE_GROWTH), + LEVEL_UP_MOVE( 5, MOVE_ABSORB), + LEVEL_UP_MOVE( 9, MOVE_GROWTH), + LEVEL_UP_MOVE(13, MOVE_LEECH_SEED), + LEVEL_UP_MOVE(17, MOVE_SAND_ATTACK), + LEVEL_UP_MOVE(21, MOVE_PIN_MISSILE), + LEVEL_UP_MOVE(25, MOVE_INGRAIN), + LEVEL_UP_MOVE(29, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(35, MOVE_SPIKES), + LEVEL_UP_MOVE(41, MOVE_NEEDLE_ARM), + LEVEL_UP_MOVE(47, MOVE_COTTON_SPORE), + LEVEL_UP_MOVE(53, MOVE_SANDSTORM), + LEVEL_UP_END +}; + +const u16 gSnoruntLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POWDER_SNOW), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 7, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE(10, MOVE_BITE), + LEVEL_UP_MOVE(16, MOVE_ICY_WIND), + LEVEL_UP_MOVE(19, MOVE_HEADBUTT), + LEVEL_UP_MOVE(25, MOVE_PROTECT), + LEVEL_UP_MOVE(28, MOVE_CRUNCH), + LEVEL_UP_MOVE(34, MOVE_ICE_BEAM), + LEVEL_UP_MOVE(37, MOVE_HAIL), + LEVEL_UP_MOVE(43, MOVE_BLIZZARD), + LEVEL_UP_END +}; + +const u16 gGlalieLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POWDER_SNOW), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 7, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE(10, MOVE_BITE), + LEVEL_UP_MOVE(16, MOVE_ICY_WIND), + LEVEL_UP_MOVE(19, MOVE_HEADBUTT), + LEVEL_UP_MOVE(25, MOVE_PROTECT), + LEVEL_UP_MOVE(28, MOVE_CRUNCH), + LEVEL_UP_MOVE(34, MOVE_ICE_BEAM), + LEVEL_UP_MOVE(42, MOVE_HAIL), + LEVEL_UP_MOVE(53, MOVE_BLIZZARD), + LEVEL_UP_MOVE(61, MOVE_SHEER_COLD), + LEVEL_UP_END +}; + +const u16 gLunatoneLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_HARDEN), + LEVEL_UP_MOVE( 7, MOVE_CONFUSION), + LEVEL_UP_MOVE(13, MOVE_ROCK_THROW), + LEVEL_UP_MOVE(19, MOVE_HYPNOSIS), + LEVEL_UP_MOVE(25, MOVE_PSYWAVE), + LEVEL_UP_MOVE(31, MOVE_COSMIC_POWER), + LEVEL_UP_MOVE(37, MOVE_PSYCHIC), + LEVEL_UP_MOVE(43, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(49, MOVE_EXPLOSION), + LEVEL_UP_END +}; + +const u16 gSolrockLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_HARDEN), + LEVEL_UP_MOVE( 7, MOVE_CONFUSION), + LEVEL_UP_MOVE(13, MOVE_ROCK_THROW), + LEVEL_UP_MOVE(19, MOVE_FIRE_SPIN), + LEVEL_UP_MOVE(25, MOVE_PSYWAVE), + LEVEL_UP_MOVE(31, MOVE_COSMIC_POWER), + LEVEL_UP_MOVE(37, MOVE_ROCK_SLIDE), + LEVEL_UP_MOVE(43, MOVE_SOLAR_BEAM), + LEVEL_UP_MOVE(49, MOVE_EXPLOSION), + LEVEL_UP_END +}; + +const u16 gAzurillLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SPLASH), + LEVEL_UP_MOVE( 3, MOVE_CHARM), + LEVEL_UP_MOVE( 6, MOVE_TAIL_WHIP), + LEVEL_UP_MOVE(10, MOVE_BUBBLE), + LEVEL_UP_MOVE(15, MOVE_SLAM), + LEVEL_UP_MOVE(21, MOVE_WATER_GUN), + LEVEL_UP_END +}; + +const u16 gSpoinkLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SPLASH), + LEVEL_UP_MOVE( 7, MOVE_PSYWAVE), + LEVEL_UP_MOVE(10, MOVE_ODOR_SLEUTH), + LEVEL_UP_MOVE(16, MOVE_PSYBEAM), + LEVEL_UP_MOVE(19, MOVE_PSYCH_UP), + LEVEL_UP_MOVE(25, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(28, MOVE_MAGIC_COAT), + LEVEL_UP_MOVE(34, MOVE_PSYCHIC), + LEVEL_UP_MOVE(37, MOVE_REST), + LEVEL_UP_MOVE(37, MOVE_SNORE), + LEVEL_UP_MOVE(43, MOVE_BOUNCE), + LEVEL_UP_END +}; + +const u16 gGrumpigLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SPLASH), + LEVEL_UP_MOVE( 1, MOVE_PSYWAVE), + LEVEL_UP_MOVE( 1, MOVE_ODOR_SLEUTH), + LEVEL_UP_MOVE( 1, MOVE_PSYBEAM), + LEVEL_UP_MOVE( 7, MOVE_PSYWAVE), + LEVEL_UP_MOVE(10, MOVE_ODOR_SLEUTH), + LEVEL_UP_MOVE(16, MOVE_PSYBEAM), + LEVEL_UP_MOVE(19, MOVE_PSYCH_UP), + LEVEL_UP_MOVE(25, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(28, MOVE_MAGIC_COAT), + LEVEL_UP_MOVE(37, MOVE_PSYCHIC), + LEVEL_UP_MOVE(43, MOVE_REST), + LEVEL_UP_MOVE(43, MOVE_SNORE), + LEVEL_UP_MOVE(55, MOVE_BOUNCE), + LEVEL_UP_END +}; + +const u16 gPlusleLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 4, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE(10, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(13, MOVE_HELPING_HAND), + LEVEL_UP_MOVE(19, MOVE_SPARK), + LEVEL_UP_MOVE(22, MOVE_ENCORE), + LEVEL_UP_MOVE(28, MOVE_FAKE_TEARS), + LEVEL_UP_MOVE(31, MOVE_CHARGE), + LEVEL_UP_MOVE(37, MOVE_THUNDER), + LEVEL_UP_MOVE(40, MOVE_BATON_PASS), + LEVEL_UP_MOVE(47, MOVE_AGILITY), + LEVEL_UP_END +}; + +const u16 gMinunLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 4, MOVE_THUNDER_WAVE), + LEVEL_UP_MOVE(10, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(13, MOVE_HELPING_HAND), + LEVEL_UP_MOVE(19, MOVE_SPARK), + LEVEL_UP_MOVE(22, MOVE_ENCORE), + LEVEL_UP_MOVE(28, MOVE_CHARM), + LEVEL_UP_MOVE(31, MOVE_CHARGE), + LEVEL_UP_MOVE(37, MOVE_THUNDER), + LEVEL_UP_MOVE(40, MOVE_BATON_PASS), + LEVEL_UP_MOVE(47, MOVE_AGILITY), + LEVEL_UP_END +}; + +const u16 gMawileLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ASTONISH), + LEVEL_UP_MOVE( 6, MOVE_FAKE_TEARS), + LEVEL_UP_MOVE(11, MOVE_BITE), + LEVEL_UP_MOVE(16, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE(21, MOVE_VICE_GRIP), + LEVEL_UP_MOVE(26, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(31, MOVE_BATON_PASS), + LEVEL_UP_MOVE(36, MOVE_CRUNCH), + LEVEL_UP_MOVE(41, MOVE_IRON_DEFENSE), + LEVEL_UP_MOVE(46, MOVE_STOCKPILE), + LEVEL_UP_MOVE(46, MOVE_SWALLOW), + LEVEL_UP_MOVE(46, MOVE_SPIT_UP), + LEVEL_UP_END +}; + +const u16 gMedititeLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BIDE), + LEVEL_UP_MOVE( 4, MOVE_MEDITATE), + LEVEL_UP_MOVE( 9, MOVE_CONFUSION), + LEVEL_UP_MOVE(12, MOVE_DETECT), + LEVEL_UP_MOVE(18, MOVE_HIDDEN_POWER), + LEVEL_UP_MOVE(22, MOVE_MIND_READER), + LEVEL_UP_MOVE(28, MOVE_CALM_MIND), + LEVEL_UP_MOVE(32, MOVE_HI_JUMP_KICK), + LEVEL_UP_MOVE(38, MOVE_PSYCH_UP), + LEVEL_UP_MOVE(42, MOVE_REVERSAL), + LEVEL_UP_MOVE(48, MOVE_RECOVER), + LEVEL_UP_END +}; + +const u16 gMedichamLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_FIRE_PUNCH), + LEVEL_UP_MOVE( 1, MOVE_THUNDER_PUNCH), + LEVEL_UP_MOVE( 1, MOVE_ICE_PUNCH), + LEVEL_UP_MOVE( 1, MOVE_BIDE), + LEVEL_UP_MOVE( 1, MOVE_MEDITATE), + LEVEL_UP_MOVE( 1, MOVE_CONFUSION), + LEVEL_UP_MOVE( 1, MOVE_DETECT), + LEVEL_UP_MOVE( 4, MOVE_MEDITATE), + LEVEL_UP_MOVE( 9, MOVE_CONFUSION), + LEVEL_UP_MOVE(12, MOVE_DETECT), + LEVEL_UP_MOVE(18, MOVE_HIDDEN_POWER), + LEVEL_UP_MOVE(22, MOVE_MIND_READER), + LEVEL_UP_MOVE(28, MOVE_CALM_MIND), + LEVEL_UP_MOVE(32, MOVE_HI_JUMP_KICK), + LEVEL_UP_MOVE(40, MOVE_PSYCH_UP), + LEVEL_UP_MOVE(46, MOVE_REVERSAL), + LEVEL_UP_MOVE(54, MOVE_RECOVER), + LEVEL_UP_END +}; + +const u16 gSwabluLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_PECK), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 8, MOVE_ASTONISH), + LEVEL_UP_MOVE(11, MOVE_SING), + LEVEL_UP_MOVE(18, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(21, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(28, MOVE_MIST), + LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(38, MOVE_MIRROR_MOVE), + LEVEL_UP_MOVE(41, MOVE_REFRESH), + LEVEL_UP_MOVE(48, MOVE_PERISH_SONG), + LEVEL_UP_END +}; + +const u16 gAltariaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_PECK), + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_ASTONISH), + LEVEL_UP_MOVE( 1, MOVE_SING), + LEVEL_UP_MOVE( 8, MOVE_ASTONISH), + LEVEL_UP_MOVE(11, MOVE_SING), + LEVEL_UP_MOVE(18, MOVE_FURY_ATTACK), + LEVEL_UP_MOVE(21, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(28, MOVE_MIST), + LEVEL_UP_MOVE(31, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(35, MOVE_DRAGON_BREATH), + LEVEL_UP_MOVE(40, MOVE_DRAGON_DANCE), + LEVEL_UP_MOVE(45, MOVE_REFRESH), + LEVEL_UP_MOVE(54, MOVE_PERISH_SONG), + LEVEL_UP_MOVE(59, MOVE_SKY_ATTACK), + LEVEL_UP_END +}; + +const u16 gWynautLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SPLASH), + LEVEL_UP_MOVE( 1, MOVE_CHARM), + LEVEL_UP_MOVE( 1, MOVE_ENCORE), + LEVEL_UP_MOVE(15, MOVE_COUNTER), + LEVEL_UP_MOVE(15, MOVE_MIRROR_COAT), + LEVEL_UP_MOVE(15, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(15, MOVE_DESTINY_BOND), + LEVEL_UP_END +}; + +const u16 gDuskullLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_NIGHT_SHADE), + LEVEL_UP_MOVE( 5, MOVE_DISABLE), + LEVEL_UP_MOVE(12, MOVE_FORESIGHT), + LEVEL_UP_MOVE(16, MOVE_ASTONISH), + LEVEL_UP_MOVE(23, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(27, MOVE_PURSUIT), + LEVEL_UP_MOVE(34, MOVE_CURSE), + LEVEL_UP_MOVE(38, MOVE_WILL_O_WISP), + LEVEL_UP_MOVE(45, MOVE_MEAN_LOOK), + LEVEL_UP_MOVE(49, MOVE_FUTURE_SIGHT), + LEVEL_UP_END +}; + +const u16 gDusclopsLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_BIND), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_NIGHT_SHADE), + LEVEL_UP_MOVE( 1, MOVE_DISABLE), + LEVEL_UP_MOVE( 5, MOVE_DISABLE), + LEVEL_UP_MOVE(12, MOVE_FORESIGHT), + LEVEL_UP_MOVE(16, MOVE_ASTONISH), + LEVEL_UP_MOVE(23, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(27, MOVE_PURSUIT), + LEVEL_UP_MOVE(34, MOVE_CURSE), + LEVEL_UP_MOVE(37, MOVE_SHADOW_PUNCH), + LEVEL_UP_MOVE(41, MOVE_WILL_O_WISP), + LEVEL_UP_MOVE(51, MOVE_MEAN_LOOK), + LEVEL_UP_MOVE(58, MOVE_FUTURE_SIGHT), + LEVEL_UP_END +}; + +const u16 gRoseliaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ABSORB), + LEVEL_UP_MOVE( 5, MOVE_GROWTH), + LEVEL_UP_MOVE( 9, MOVE_POISON_STING), + LEVEL_UP_MOVE(13, MOVE_STUN_SPORE), + LEVEL_UP_MOVE(17, MOVE_MEGA_DRAIN), + LEVEL_UP_MOVE(21, MOVE_LEECH_SEED), + LEVEL_UP_MOVE(25, MOVE_MAGICAL_LEAF), + LEVEL_UP_MOVE(29, MOVE_GRASS_WHISTLE), + LEVEL_UP_MOVE(33, MOVE_GIGA_DRAIN), + LEVEL_UP_MOVE(37, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE(41, MOVE_INGRAIN), + LEVEL_UP_MOVE(45, MOVE_TOXIC), + LEVEL_UP_MOVE(49, MOVE_PETAL_DANCE), + LEVEL_UP_MOVE(53, MOVE_AROMATHERAPY), + LEVEL_UP_MOVE(57, MOVE_SYNTHESIS), + LEVEL_UP_END +}; + +const u16 gSlakothLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_YAWN), + LEVEL_UP_MOVE( 7, MOVE_ENCORE), + LEVEL_UP_MOVE(13, MOVE_SLACK_OFF), + LEVEL_UP_MOVE(19, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(25, MOVE_AMNESIA), + LEVEL_UP_MOVE(31, MOVE_COVET), + LEVEL_UP_MOVE(37, MOVE_COUNTER), + LEVEL_UP_MOVE(43, MOVE_FLAIL), + LEVEL_UP_END +}; + +const u16 gVigorothLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE( 1, MOVE_ENCORE), + LEVEL_UP_MOVE( 1, MOVE_UPROAR), + LEVEL_UP_MOVE( 7, MOVE_ENCORE), + LEVEL_UP_MOVE(13, MOVE_UPROAR), + LEVEL_UP_MOVE(19, MOVE_FURY_SWIPES), + LEVEL_UP_MOVE(25, MOVE_ENDURE), + LEVEL_UP_MOVE(31, MOVE_SLASH), + LEVEL_UP_MOVE(37, MOVE_COUNTER), + LEVEL_UP_MOVE(43, MOVE_FOCUS_PUNCH), + LEVEL_UP_MOVE(49, MOVE_REVERSAL), + LEVEL_UP_END +}; + +const u16 gSlakingLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_YAWN), + LEVEL_UP_MOVE( 1, MOVE_ENCORE), + LEVEL_UP_MOVE( 1, MOVE_SLACK_OFF), + LEVEL_UP_MOVE( 7, MOVE_ENCORE), + LEVEL_UP_MOVE(13, MOVE_SLACK_OFF), + LEVEL_UP_MOVE(19, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(25, MOVE_AMNESIA), + LEVEL_UP_MOVE(31, MOVE_COVET), + LEVEL_UP_MOVE(36, MOVE_SWAGGER), + LEVEL_UP_MOVE(37, MOVE_COUNTER), + LEVEL_UP_MOVE(43, MOVE_FLAIL), + LEVEL_UP_END +}; + +const u16 gGulpinLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POUND), + LEVEL_UP_MOVE( 6, MOVE_YAWN), + LEVEL_UP_MOVE( 9, MOVE_POISON_GAS), + LEVEL_UP_MOVE(14, MOVE_SLUDGE), + LEVEL_UP_MOVE(17, MOVE_AMNESIA), + LEVEL_UP_MOVE(23, MOVE_ENCORE), + LEVEL_UP_MOVE(28, MOVE_TOXIC), + LEVEL_UP_MOVE(34, MOVE_STOCKPILE), + LEVEL_UP_MOVE(34, MOVE_SPIT_UP), + LEVEL_UP_MOVE(34, MOVE_SWALLOW), + LEVEL_UP_MOVE(39, MOVE_SLUDGE_BOMB), + LEVEL_UP_END +}; + +const u16 gSwalotLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POUND), + LEVEL_UP_MOVE( 1, MOVE_YAWN), + LEVEL_UP_MOVE( 1, MOVE_POISON_GAS), + LEVEL_UP_MOVE( 1, MOVE_SLUDGE), + LEVEL_UP_MOVE( 6, MOVE_YAWN), + LEVEL_UP_MOVE( 9, MOVE_POISON_GAS), + LEVEL_UP_MOVE(14, MOVE_SLUDGE), + LEVEL_UP_MOVE(17, MOVE_AMNESIA), + LEVEL_UP_MOVE(23, MOVE_ENCORE), + LEVEL_UP_MOVE(26, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(31, MOVE_TOXIC), + LEVEL_UP_MOVE(40, MOVE_STOCKPILE), + LEVEL_UP_MOVE(40, MOVE_SPIT_UP), + LEVEL_UP_MOVE(40, MOVE_SWALLOW), + LEVEL_UP_MOVE(48, MOVE_SLUDGE_BOMB), + LEVEL_UP_END +}; + +const u16 gTropiusLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_GUST), + LEVEL_UP_MOVE( 7, MOVE_GROWTH), + LEVEL_UP_MOVE(11, MOVE_RAZOR_LEAF), + LEVEL_UP_MOVE(17, MOVE_STOMP), + LEVEL_UP_MOVE(21, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE(27, MOVE_WHIRLWIND), + LEVEL_UP_MOVE(31, MOVE_MAGICAL_LEAF), + LEVEL_UP_MOVE(37, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(41, MOVE_SOLAR_BEAM), + LEVEL_UP_MOVE(47, MOVE_SYNTHESIS), + LEVEL_UP_END +}; + +const u16 gWhismurLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POUND), + LEVEL_UP_MOVE( 5, MOVE_UPROAR), + LEVEL_UP_MOVE(11, MOVE_ASTONISH), + LEVEL_UP_MOVE(15, MOVE_HOWL), + LEVEL_UP_MOVE(21, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(25, MOVE_STOMP), + LEVEL_UP_MOVE(31, MOVE_SCREECH), + LEVEL_UP_MOVE(35, MOVE_ROAR), + LEVEL_UP_MOVE(41, MOVE_REST), + LEVEL_UP_MOVE(41, MOVE_SLEEP_TALK), + LEVEL_UP_MOVE(45, MOVE_HYPER_VOICE), + LEVEL_UP_END +}; + +const u16 gLoudredLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POUND), + LEVEL_UP_MOVE( 1, MOVE_UPROAR), + LEVEL_UP_MOVE( 1, MOVE_ASTONISH), + LEVEL_UP_MOVE( 1, MOVE_HOWL), + LEVEL_UP_MOVE( 5, MOVE_UPROAR), + LEVEL_UP_MOVE(11, MOVE_ASTONISH), + LEVEL_UP_MOVE(15, MOVE_HOWL), + LEVEL_UP_MOVE(23, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(29, MOVE_STOMP), + LEVEL_UP_MOVE(37, MOVE_SCREECH), + LEVEL_UP_MOVE(43, MOVE_ROAR), + LEVEL_UP_MOVE(51, MOVE_REST), + LEVEL_UP_MOVE(51, MOVE_SLEEP_TALK), + LEVEL_UP_MOVE(57, MOVE_HYPER_VOICE), + LEVEL_UP_END +}; + +const u16 gExploudLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_POUND), + LEVEL_UP_MOVE( 1, MOVE_UPROAR), + LEVEL_UP_MOVE( 1, MOVE_ASTONISH), + LEVEL_UP_MOVE( 1, MOVE_HOWL), + LEVEL_UP_MOVE( 5, MOVE_UPROAR), + LEVEL_UP_MOVE(11, MOVE_ASTONISH), + LEVEL_UP_MOVE(15, MOVE_HOWL), + LEVEL_UP_MOVE(23, MOVE_SUPERSONIC), + LEVEL_UP_MOVE(29, MOVE_STOMP), + LEVEL_UP_MOVE(37, MOVE_SCREECH), + LEVEL_UP_MOVE(40, MOVE_HYPER_BEAM), + LEVEL_UP_MOVE(45, MOVE_ROAR), + LEVEL_UP_MOVE(55, MOVE_REST), + LEVEL_UP_MOVE(55, MOVE_SLEEP_TALK), + LEVEL_UP_MOVE(63, MOVE_HYPER_VOICE), + LEVEL_UP_END +}; + +const u16 gClamperlLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_CLAMP), + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 1, MOVE_WHIRLPOOL), + LEVEL_UP_MOVE( 1, MOVE_IRON_DEFENSE), + LEVEL_UP_END +}; + +const u16 gHuntailLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WHIRLPOOL), + LEVEL_UP_MOVE( 8, MOVE_BITE), + LEVEL_UP_MOVE(15, MOVE_SCREECH), + LEVEL_UP_MOVE(22, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(29, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(36, MOVE_CRUNCH), + LEVEL_UP_MOVE(43, MOVE_BATON_PASS), + LEVEL_UP_MOVE(50, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +const u16 gGorebyssLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WHIRLPOOL), + LEVEL_UP_MOVE( 8, MOVE_CONFUSION), + LEVEL_UP_MOVE(15, MOVE_AGILITY), + LEVEL_UP_MOVE(22, MOVE_WATER_PULSE), + LEVEL_UP_MOVE(29, MOVE_AMNESIA), + LEVEL_UP_MOVE(36, MOVE_PSYCHIC), + LEVEL_UP_MOVE(43, MOVE_BATON_PASS), + LEVEL_UP_MOVE(50, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +const u16 gAbsolLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 5, MOVE_LEER), + LEVEL_UP_MOVE( 9, MOVE_TAUNT), + LEVEL_UP_MOVE(13, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(17, MOVE_RAZOR_WIND), + LEVEL_UP_MOVE(21, MOVE_BITE), + LEVEL_UP_MOVE(26, MOVE_SWORDS_DANCE), + LEVEL_UP_MOVE(31, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE(36, MOVE_SLASH), + LEVEL_UP_MOVE(41, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(46, MOVE_PERISH_SONG), + LEVEL_UP_END +}; + +const u16 gShuppetLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_KNOCK_OFF), + LEVEL_UP_MOVE( 8, MOVE_SCREECH), + LEVEL_UP_MOVE(13, MOVE_NIGHT_SHADE), + LEVEL_UP_MOVE(20, MOVE_CURSE), + LEVEL_UP_MOVE(25, MOVE_SPITE), + LEVEL_UP_MOVE(32, MOVE_WILL_O_WISP), + LEVEL_UP_MOVE(37, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(44, MOVE_SHADOW_BALL), + LEVEL_UP_MOVE(49, MOVE_SNATCH), + LEVEL_UP_MOVE(56, MOVE_GRUDGE), + LEVEL_UP_END +}; + +const u16 gBanetteLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_KNOCK_OFF), + LEVEL_UP_MOVE( 1, MOVE_SCREECH), + LEVEL_UP_MOVE( 1, MOVE_NIGHT_SHADE), + LEVEL_UP_MOVE( 1, MOVE_CURSE), + LEVEL_UP_MOVE( 8, MOVE_SCREECH), + LEVEL_UP_MOVE(13, MOVE_NIGHT_SHADE), + LEVEL_UP_MOVE(20, MOVE_CURSE), + LEVEL_UP_MOVE(25, MOVE_SPITE), + LEVEL_UP_MOVE(32, MOVE_WILL_O_WISP), + LEVEL_UP_MOVE(39, MOVE_FAINT_ATTACK), + LEVEL_UP_MOVE(48, MOVE_SHADOW_BALL), + LEVEL_UP_MOVE(55, MOVE_SNATCH), + LEVEL_UP_MOVE(64, MOVE_GRUDGE), + LEVEL_UP_END +}; + +const u16 gSeviperLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WRAP), + LEVEL_UP_MOVE( 7, MOVE_LICK), + LEVEL_UP_MOVE(10, MOVE_BITE), + LEVEL_UP_MOVE(16, MOVE_POISON_TAIL), + LEVEL_UP_MOVE(19, MOVE_SCREECH), + LEVEL_UP_MOVE(25, MOVE_GLARE), + LEVEL_UP_MOVE(28, MOVE_CRUNCH), + LEVEL_UP_MOVE(34, MOVE_POISON_FANG), + LEVEL_UP_MOVE(37, MOVE_SWAGGER), + LEVEL_UP_MOVE(43, MOVE_HAZE), + LEVEL_UP_END +}; + +const u16 gZangooseLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 4, MOVE_LEER), + LEVEL_UP_MOVE( 7, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(10, MOVE_SWORDS_DANCE), + LEVEL_UP_MOVE(13, MOVE_FURY_CUTTER), + LEVEL_UP_MOVE(19, MOVE_SLASH), + LEVEL_UP_MOVE(25, MOVE_PURSUIT), + LEVEL_UP_MOVE(31, MOVE_CRUSH_CLAW), + LEVEL_UP_MOVE(37, MOVE_TAUNT), + LEVEL_UP_MOVE(46, MOVE_DETECT), + LEVEL_UP_MOVE(55, MOVE_FALSE_SWIPE), + LEVEL_UP_END +}; + +const u16 gRelicanthLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_HARDEN), + LEVEL_UP_MOVE( 8, MOVE_WATER_GUN), + LEVEL_UP_MOVE(15, MOVE_ROCK_TOMB), + LEVEL_UP_MOVE(22, MOVE_YAWN), + LEVEL_UP_MOVE(29, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(36, MOVE_MUD_SPORT), + LEVEL_UP_MOVE(43, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(50, MOVE_REST), + LEVEL_UP_MOVE(57, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(64, MOVE_HYDRO_PUMP), + LEVEL_UP_END +}; + +const u16 gAronLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 4, MOVE_HARDEN), + LEVEL_UP_MOVE( 7, MOVE_MUD_SLAP), + LEVEL_UP_MOVE(10, MOVE_HEADBUTT), + LEVEL_UP_MOVE(13, MOVE_METAL_CLAW), + LEVEL_UP_MOVE(17, MOVE_IRON_DEFENSE), + LEVEL_UP_MOVE(21, MOVE_ROAR), + LEVEL_UP_MOVE(25, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(29, MOVE_IRON_TAIL), + LEVEL_UP_MOVE(34, MOVE_PROTECT), + LEVEL_UP_MOVE(39, MOVE_METAL_SOUND), + LEVEL_UP_MOVE(44, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +const u16 gLaironLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_HARDEN), + LEVEL_UP_MOVE( 1, MOVE_MUD_SLAP), + LEVEL_UP_MOVE( 1, MOVE_HEADBUTT), + LEVEL_UP_MOVE( 4, MOVE_HARDEN), + LEVEL_UP_MOVE( 7, MOVE_MUD_SLAP), + LEVEL_UP_MOVE(10, MOVE_HEADBUTT), + LEVEL_UP_MOVE(13, MOVE_METAL_CLAW), + LEVEL_UP_MOVE(17, MOVE_IRON_DEFENSE), + LEVEL_UP_MOVE(21, MOVE_ROAR), + LEVEL_UP_MOVE(25, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(29, MOVE_IRON_TAIL), + LEVEL_UP_MOVE(37, MOVE_PROTECT), + LEVEL_UP_MOVE(45, MOVE_METAL_SOUND), + LEVEL_UP_MOVE(53, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +const u16 gAggronLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 1, MOVE_HARDEN), + LEVEL_UP_MOVE( 1, MOVE_MUD_SLAP), + LEVEL_UP_MOVE( 1, MOVE_HEADBUTT), + LEVEL_UP_MOVE( 4, MOVE_HARDEN), + LEVEL_UP_MOVE( 7, MOVE_MUD_SLAP), + LEVEL_UP_MOVE(10, MOVE_HEADBUTT), + LEVEL_UP_MOVE(13, MOVE_METAL_CLAW), + LEVEL_UP_MOVE(17, MOVE_IRON_DEFENSE), + LEVEL_UP_MOVE(21, MOVE_ROAR), + LEVEL_UP_MOVE(25, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(29, MOVE_IRON_TAIL), + LEVEL_UP_MOVE(37, MOVE_PROTECT), + LEVEL_UP_MOVE(50, MOVE_METAL_SOUND), + LEVEL_UP_MOVE(63, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +const u16 gCastformLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE(10, MOVE_WATER_GUN), + LEVEL_UP_MOVE(10, MOVE_EMBER), + LEVEL_UP_MOVE(10, MOVE_POWDER_SNOW), + LEVEL_UP_MOVE(20, MOVE_RAIN_DANCE), + LEVEL_UP_MOVE(20, MOVE_SUNNY_DAY), + LEVEL_UP_MOVE(20, MOVE_HAIL), + LEVEL_UP_MOVE(30, MOVE_WEATHER_BALL), + LEVEL_UP_END +}; + +const u16 gVolbeatLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 5, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE( 9, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE(13, MOVE_MOONLIGHT), + LEVEL_UP_MOVE(17, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(21, MOVE_TAIL_GLOW), + LEVEL_UP_MOVE(25, MOVE_SIGNAL_BEAM), + LEVEL_UP_MOVE(29, MOVE_PROTECT), + LEVEL_UP_MOVE(33, MOVE_HELPING_HAND), + LEVEL_UP_MOVE(37, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +const u16 gIllumiseLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TACKLE), + LEVEL_UP_MOVE( 5, MOVE_SWEET_SCENT), + LEVEL_UP_MOVE( 9, MOVE_CHARM), + LEVEL_UP_MOVE(13, MOVE_MOONLIGHT), + LEVEL_UP_MOVE(17, MOVE_QUICK_ATTACK), + LEVEL_UP_MOVE(21, MOVE_WISH), + LEVEL_UP_MOVE(25, MOVE_ENCORE), + LEVEL_UP_MOVE(29, MOVE_FLATTER), + LEVEL_UP_MOVE(33, MOVE_HELPING_HAND), + LEVEL_UP_MOVE(37, MOVE_COVET), + LEVEL_UP_END +}; + +const u16 gLileepLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ASTONISH), + LEVEL_UP_MOVE( 8, MOVE_CONSTRICT), + LEVEL_UP_MOVE(15, MOVE_ACID), + LEVEL_UP_MOVE(22, MOVE_INGRAIN), + LEVEL_UP_MOVE(29, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(36, MOVE_AMNESIA), + LEVEL_UP_MOVE(43, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(50, MOVE_STOCKPILE), + LEVEL_UP_MOVE(50, MOVE_SPIT_UP), + LEVEL_UP_MOVE(50, MOVE_SWALLOW), + LEVEL_UP_END +}; + +const u16 gCradilyLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_ASTONISH), + LEVEL_UP_MOVE( 1, MOVE_CONSTRICT), + LEVEL_UP_MOVE( 1, MOVE_ACID), + LEVEL_UP_MOVE( 1, MOVE_INGRAIN), + LEVEL_UP_MOVE( 8, MOVE_CONSTRICT), + LEVEL_UP_MOVE(15, MOVE_ACID), + LEVEL_UP_MOVE(22, MOVE_INGRAIN), + LEVEL_UP_MOVE(29, MOVE_CONFUSE_RAY), + LEVEL_UP_MOVE(36, MOVE_AMNESIA), + LEVEL_UP_MOVE(48, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(60, MOVE_STOCKPILE), + LEVEL_UP_MOVE(60, MOVE_SPIT_UP), + LEVEL_UP_MOVE(60, MOVE_SWALLOW), + LEVEL_UP_END +}; + +const u16 gAnorithLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 7, MOVE_HARDEN), + LEVEL_UP_MOVE(13, MOVE_MUD_SPORT), + LEVEL_UP_MOVE(19, MOVE_WATER_GUN), + LEVEL_UP_MOVE(25, MOVE_METAL_CLAW), + LEVEL_UP_MOVE(31, MOVE_PROTECT), + LEVEL_UP_MOVE(37, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(43, MOVE_FURY_CUTTER), + LEVEL_UP_MOVE(49, MOVE_SLASH), + LEVEL_UP_MOVE(55, MOVE_ROCK_BLAST), + LEVEL_UP_END +}; + +const u16 gArmaldoLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_SCRATCH), + LEVEL_UP_MOVE( 1, MOVE_HARDEN), + LEVEL_UP_MOVE( 1, MOVE_MUD_SPORT), + LEVEL_UP_MOVE( 1, MOVE_WATER_GUN), + LEVEL_UP_MOVE( 7, MOVE_HARDEN), + LEVEL_UP_MOVE(13, MOVE_MUD_SPORT), + LEVEL_UP_MOVE(19, MOVE_WATER_GUN), + LEVEL_UP_MOVE(25, MOVE_METAL_CLAW), + LEVEL_UP_MOVE(31, MOVE_PROTECT), + LEVEL_UP_MOVE(37, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(46, MOVE_FURY_CUTTER), + LEVEL_UP_MOVE(55, MOVE_SLASH), + LEVEL_UP_MOVE(64, MOVE_ROCK_BLAST), + LEVEL_UP_END +}; + +const u16 gRaltsLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 6, MOVE_CONFUSION), + LEVEL_UP_MOVE(11, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE(16, MOVE_TELEPORT), + LEVEL_UP_MOVE(21, MOVE_CALM_MIND), + LEVEL_UP_MOVE(26, MOVE_PSYCHIC), + LEVEL_UP_MOVE(31, MOVE_IMPRISON), + LEVEL_UP_MOVE(36, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(41, MOVE_HYPNOSIS), + LEVEL_UP_MOVE(46, MOVE_DREAM_EATER), + LEVEL_UP_END +}; + +const u16 gKirliaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_CONFUSION), + LEVEL_UP_MOVE( 1, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE( 1, MOVE_TELEPORT), + LEVEL_UP_MOVE( 6, MOVE_CONFUSION), + LEVEL_UP_MOVE(11, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE(16, MOVE_TELEPORT), + LEVEL_UP_MOVE(21, MOVE_CALM_MIND), + LEVEL_UP_MOVE(26, MOVE_PSYCHIC), + LEVEL_UP_MOVE(33, MOVE_IMPRISON), + LEVEL_UP_MOVE(40, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(47, MOVE_HYPNOSIS), + LEVEL_UP_MOVE(54, MOVE_DREAM_EATER), + LEVEL_UP_END +}; + +const u16 gGardevoirLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_GROWL), + LEVEL_UP_MOVE( 1, MOVE_CONFUSION), + LEVEL_UP_MOVE( 1, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE( 1, MOVE_TELEPORT), + LEVEL_UP_MOVE( 6, MOVE_CONFUSION), + LEVEL_UP_MOVE(11, MOVE_DOUBLE_TEAM), + LEVEL_UP_MOVE(16, MOVE_TELEPORT), + LEVEL_UP_MOVE(21, MOVE_CALM_MIND), + LEVEL_UP_MOVE(26, MOVE_PSYCHIC), + LEVEL_UP_MOVE(33, MOVE_IMPRISON), + LEVEL_UP_MOVE(42, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(51, MOVE_HYPNOSIS), + LEVEL_UP_MOVE(60, MOVE_DREAM_EATER), + LEVEL_UP_END +}; + +const u16 gBagonLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_RAGE), + LEVEL_UP_MOVE( 5, MOVE_BITE), + LEVEL_UP_MOVE( 9, MOVE_LEER), + LEVEL_UP_MOVE(17, MOVE_HEADBUTT), + LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(25, MOVE_EMBER), + LEVEL_UP_MOVE(33, MOVE_DRAGON_BREATH), + LEVEL_UP_MOVE(37, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(41, MOVE_CRUNCH), + LEVEL_UP_MOVE(49, MOVE_DRAGON_CLAW), + LEVEL_UP_MOVE(53, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +const u16 gShelgonLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_RAGE), + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_HEADBUTT), + LEVEL_UP_MOVE( 5, MOVE_BITE), + LEVEL_UP_MOVE( 9, MOVE_LEER), + LEVEL_UP_MOVE(17, MOVE_HEADBUTT), + LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(25, MOVE_EMBER), + LEVEL_UP_MOVE(30, MOVE_PROTECT), + LEVEL_UP_MOVE(38, MOVE_DRAGON_BREATH), + LEVEL_UP_MOVE(47, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(56, MOVE_CRUNCH), + LEVEL_UP_MOVE(69, MOVE_DRAGON_CLAW), + LEVEL_UP_MOVE(78, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +const u16 gSalamenceLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_RAGE), + LEVEL_UP_MOVE( 1, MOVE_BITE), + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_HEADBUTT), + LEVEL_UP_MOVE( 5, MOVE_BITE), + LEVEL_UP_MOVE( 9, MOVE_LEER), + LEVEL_UP_MOVE(17, MOVE_HEADBUTT), + LEVEL_UP_MOVE(21, MOVE_FOCUS_ENERGY), + LEVEL_UP_MOVE(25, MOVE_EMBER), + LEVEL_UP_MOVE(30, MOVE_PROTECT), + LEVEL_UP_MOVE(38, MOVE_DRAGON_BREATH), + LEVEL_UP_MOVE(47, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(50, MOVE_FLY), + LEVEL_UP_MOVE(61, MOVE_CRUNCH), + LEVEL_UP_MOVE(79, MOVE_DRAGON_CLAW), + LEVEL_UP_MOVE(93, MOVE_DOUBLE_EDGE), + LEVEL_UP_END +}; + +const u16 gBeldumLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TAKE_DOWN), + LEVEL_UP_END +}; + +const u16 gMetangLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(20, MOVE_CONFUSION), + LEVEL_UP_MOVE(20, MOVE_METAL_CLAW), + LEVEL_UP_MOVE(26, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(32, MOVE_PURSUIT), + LEVEL_UP_MOVE(38, MOVE_PSYCHIC), + LEVEL_UP_MOVE(44, MOVE_IRON_DEFENSE), + LEVEL_UP_MOVE(50, MOVE_METEOR_MASH), + LEVEL_UP_MOVE(56, MOVE_AGILITY), + LEVEL_UP_MOVE(62, MOVE_HYPER_BEAM), + LEVEL_UP_END +}; + +const u16 gMetagrossLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE( 1, MOVE_CONFUSION), + LEVEL_UP_MOVE( 1, MOVE_METAL_CLAW), + LEVEL_UP_MOVE( 1, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(20, MOVE_CONFUSION), + LEVEL_UP_MOVE(20, MOVE_METAL_CLAW), + LEVEL_UP_MOVE(26, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(32, MOVE_PURSUIT), + LEVEL_UP_MOVE(38, MOVE_PSYCHIC), + LEVEL_UP_MOVE(44, MOVE_IRON_DEFENSE), + LEVEL_UP_MOVE(55, MOVE_METEOR_MASH), + LEVEL_UP_MOVE(66, MOVE_AGILITY), + LEVEL_UP_MOVE(77, MOVE_HYPER_BEAM), + LEVEL_UP_END +}; + +const u16 gRegirockLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_EXPLOSION), + LEVEL_UP_MOVE( 9, MOVE_ROCK_THROW), + LEVEL_UP_MOVE(17, MOVE_CURSE), + LEVEL_UP_MOVE(25, MOVE_SUPERPOWER), + LEVEL_UP_MOVE(33, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(41, MOVE_IRON_DEFENSE), + LEVEL_UP_MOVE(49, MOVE_ZAP_CANNON), + LEVEL_UP_MOVE(57, MOVE_LOCK_ON), + LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM), + LEVEL_UP_END +}; + +const u16 gRegiceLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_EXPLOSION), + LEVEL_UP_MOVE( 9, MOVE_ICY_WIND), + LEVEL_UP_MOVE(17, MOVE_CURSE), + LEVEL_UP_MOVE(25, MOVE_SUPERPOWER), + LEVEL_UP_MOVE(33, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(41, MOVE_AMNESIA), + LEVEL_UP_MOVE(49, MOVE_ZAP_CANNON), + LEVEL_UP_MOVE(57, MOVE_LOCK_ON), + LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM), + LEVEL_UP_END +}; + +const u16 gRegisteelLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_EXPLOSION), + LEVEL_UP_MOVE( 9, MOVE_METAL_CLAW), + LEVEL_UP_MOVE(17, MOVE_CURSE), + LEVEL_UP_MOVE(25, MOVE_SUPERPOWER), + LEVEL_UP_MOVE(33, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(41, MOVE_IRON_DEFENSE), + LEVEL_UP_MOVE(41, MOVE_AMNESIA), + LEVEL_UP_MOVE(49, MOVE_ZAP_CANNON), + LEVEL_UP_MOVE(57, MOVE_LOCK_ON), + LEVEL_UP_MOVE(65, MOVE_HYPER_BEAM), + LEVEL_UP_END +}; + +const u16 gKyogreLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WATER_PULSE), + LEVEL_UP_MOVE( 5, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(15, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(20, MOVE_BODY_SLAM), + LEVEL_UP_MOVE(30, MOVE_CALM_MIND), + LEVEL_UP_MOVE(35, MOVE_ICE_BEAM), + LEVEL_UP_MOVE(45, MOVE_HYDRO_PUMP), + LEVEL_UP_MOVE(50, MOVE_REST), + LEVEL_UP_MOVE(60, MOVE_SHEER_COLD), + LEVEL_UP_MOVE(65, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(75, MOVE_WATER_SPOUT), + LEVEL_UP_END +}; + +const u16 gGroudonLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_MUD_SHOT), + LEVEL_UP_MOVE( 5, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(15, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(20, MOVE_SLASH), + LEVEL_UP_MOVE(30, MOVE_BULK_UP), + LEVEL_UP_MOVE(35, MOVE_EARTHQUAKE), + LEVEL_UP_MOVE(45, MOVE_FIRE_BLAST), + LEVEL_UP_MOVE(50, MOVE_REST), + LEVEL_UP_MOVE(60, MOVE_FISSURE), + LEVEL_UP_MOVE(65, MOVE_SOLAR_BEAM), + LEVEL_UP_MOVE(75, MOVE_ERUPTION), + LEVEL_UP_END +}; + +const u16 gRayquazaLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_TWISTER), + LEVEL_UP_MOVE( 5, MOVE_SCARY_FACE), + LEVEL_UP_MOVE(15, MOVE_ANCIENT_POWER), + LEVEL_UP_MOVE(20, MOVE_DRAGON_CLAW), + LEVEL_UP_MOVE(30, MOVE_DRAGON_DANCE), + LEVEL_UP_MOVE(35, MOVE_CRUNCH), + LEVEL_UP_MOVE(45, MOVE_FLY), + LEVEL_UP_MOVE(50, MOVE_REST), + LEVEL_UP_MOVE(60, MOVE_EXTREME_SPEED), + LEVEL_UP_MOVE(65, MOVE_OUTRAGE), + LEVEL_UP_MOVE(75, MOVE_HYPER_BEAM), + LEVEL_UP_END +}; + +const u16 gLatiasLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_PSYWAVE), + LEVEL_UP_MOVE( 5, MOVE_WISH), + LEVEL_UP_MOVE(10, MOVE_HELPING_HAND), + LEVEL_UP_MOVE(15, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(20, MOVE_DRAGON_BREATH), + LEVEL_UP_MOVE(25, MOVE_WATER_SPORT), + LEVEL_UP_MOVE(30, MOVE_REFRESH), + LEVEL_UP_MOVE(35, MOVE_MIST_BALL), + LEVEL_UP_MOVE(40, MOVE_PSYCHIC), + LEVEL_UP_MOVE(45, MOVE_RECOVER), + LEVEL_UP_MOVE(50, MOVE_CHARM), + LEVEL_UP_END +}; + +const u16 gLatiosLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_PSYWAVE), + LEVEL_UP_MOVE( 5, MOVE_MEMENTO), + LEVEL_UP_MOVE(10, MOVE_HELPING_HAND), + LEVEL_UP_MOVE(15, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(20, MOVE_DRAGON_BREATH), + LEVEL_UP_MOVE(25, MOVE_PROTECT), + LEVEL_UP_MOVE(30, MOVE_REFRESH), + LEVEL_UP_MOVE(35, MOVE_LUSTER_PURGE), + LEVEL_UP_MOVE(40, MOVE_PSYCHIC), + LEVEL_UP_MOVE(45, MOVE_RECOVER), + LEVEL_UP_MOVE(50, MOVE_DRAGON_DANCE), + LEVEL_UP_END +}; + +const u16 gJirachiLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WISH), + LEVEL_UP_MOVE( 1, MOVE_CONFUSION), + LEVEL_UP_MOVE( 5, MOVE_REST), + LEVEL_UP_MOVE(10, MOVE_SWIFT), + LEVEL_UP_MOVE(15, MOVE_HELPING_HAND), + LEVEL_UP_MOVE(20, MOVE_PSYCHIC), + LEVEL_UP_MOVE(25, MOVE_REFRESH), + LEVEL_UP_MOVE(30, MOVE_REST), + LEVEL_UP_MOVE(35, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(40, MOVE_FUTURE_SIGHT), + LEVEL_UP_MOVE(45, MOVE_COSMIC_POWER), + LEVEL_UP_MOVE(50, MOVE_DOOM_DESIRE), + LEVEL_UP_END +}; + +const u16 gDeoxysLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_LEER), + LEVEL_UP_MOVE( 1, MOVE_WRAP), + LEVEL_UP_MOVE( 5, MOVE_NIGHT_SHADE), + LEVEL_UP_MOVE(10, MOVE_TELEPORT), + LEVEL_UP_MOVE(15, MOVE_KNOCK_OFF), + LEVEL_UP_MOVE(20, MOVE_PURSUIT), + LEVEL_UP_MOVE(25, MOVE_PSYCHIC), + LEVEL_UP_MOVE(30, MOVE_SNATCH), + LEVEL_UP_MOVE(35, MOVE_COSMIC_POWER), + LEVEL_UP_MOVE(40, MOVE_RECOVER), + LEVEL_UP_MOVE(45, MOVE_PSYCHO_BOOST), + LEVEL_UP_MOVE(50, MOVE_HYPER_BEAM), + LEVEL_UP_END +}; + +const u16 gChimechoLevelUpLearnset[] = { + LEVEL_UP_MOVE( 1, MOVE_WRAP), + LEVEL_UP_MOVE( 6, MOVE_GROWL), + LEVEL_UP_MOVE( 9, MOVE_ASTONISH), + LEVEL_UP_MOVE(14, MOVE_CONFUSION), + LEVEL_UP_MOVE(17, MOVE_TAKE_DOWN), + LEVEL_UP_MOVE(22, MOVE_UPROAR), + LEVEL_UP_MOVE(25, MOVE_YAWN), + LEVEL_UP_MOVE(30, MOVE_PSYWAVE), + LEVEL_UP_MOVE(33, MOVE_DOUBLE_EDGE), + LEVEL_UP_MOVE(38, MOVE_HEAL_BELL), + LEVEL_UP_MOVE(41, MOVE_SAFEGUARD), + LEVEL_UP_MOVE(46, MOVE_PSYCHIC), + LEVEL_UP_END +}; + +#endif //POKERUBY_LEVEL_UP_LEARNSETS_H diff --git a/src/data/pokemon/nature_stats.h b/src/data/pokemon/nature_stats.h new file mode 100644 index 000000000..fcef2a0ac --- /dev/null +++ b/src/data/pokemon/nature_stats.h @@ -0,0 +1,37 @@ +// + +// + +#ifndef POKERUBY_NATURE_STATS_H +#define POKERUBY_NATURE_STATS_H + +const s8 gNatureStatTable[][5] = { + // Atk Def Spd Sp.Atk Sp.Def + { 0, 0, 0, 0, 0}, // Hardy + { 1, -1, 0, 0, 0}, // Lonely + { 1, 0, -1, 0, 0}, // Brave + { 1, 0, 0, -1, 0}, // Adamant + { 1, 0, 0, 0, -1}, // Naughty + { -1, 1, 0, 0, 0}, // Bold + { 0, 0, 0, 0, 0}, // Docile + { 0, 1, -1, 0, 0}, // Relaxed + { 0, 1, 0, -1, 0}, // Impish + { 0, 1, 0, 0, -1}, // Lax + { -1, 0, 1, 0, 0}, // Timid + { 0, -1, 1, 0, 0}, // Hasty + { 0, 0, 0, 0, 0}, // Serious + { 0, 0, 1, -1, 0}, // Jolly + { 0, 0, 1, 0, -1}, // Naive + { -1, 0, 0, 1, 0}, // Modest + { 0, -1, 0, 1, 0}, // Mild + { 0, 0, -1, 1, 0}, // Quiet + { 0, 0, 0, 0, 0}, // Bashful + { 0, 0, 0, 1, -1}, // Rash + { -1, 0, 0, 0, 1}, // Calm + { 0, -1, 0, 0, 1}, // Gentle + { 0, 0, -1, 0, 1}, // Sassy + { 0, 0, 0, -1, 1}, // Careful + { 0, 0, 0, 0, 0} // Quirky +}; + +#endif //POKERUBY_NATURE_STATS_H diff --git a/src/data/pokemon/spinda_spots.h b/src/data/pokemon/spinda_spots.h new file mode 100644 index 000000000..d045e0734 --- /dev/null +++ b/src/data/pokemon/spinda_spots.h @@ -0,0 +1,15 @@ +// + +// + +#ifndef POKERUBY_SPINDA_SPOTS_H +#define POKERUBY_SPINDA_SPOTS_H + +const struct SpindaSpot gSpindaSpotGraphics[] = { + {16, 14, INCBIN_U16("graphics/spinda_spots/spot_0.bin")}, + {40, 15, INCBIN_U16("graphics/spinda_spots/spot_1.bin")}, + {22, 32, INCBIN_U16("graphics/spinda_spots/spot_2.bin")}, + {34, 33, INCBIN_U16("graphics/spinda_spots/spot_3.bin")} +}; + +#endif //POKERUBY_SPINDA_SPOTS_H diff --git a/src/data/pokemon/tmhm_learnsets.h b/src/data/pokemon/tmhm_learnsets.h new file mode 100644 index 000000000..02cd22d56 --- /dev/null +++ b/src/data/pokemon/tmhm_learnsets.h @@ -0,0 +1,431 @@ +// + +// + +#ifndef POKERUBY_TMHM_LEARNSETS_H +#define POKERUBY_TMHM_LEARNSETS_H + +// TO-DO: Rewrite this declaration to allow assignment of TM/HM learns by name. +// These are 58-bit numbers aligned to 64 bits. The least significant bit represents TM01, +// while the most significant bit represents HM08. + +asm( + ".align 2\n" + ".global gTMHMLearnsets\n" + "gTMHMLearnsets:\n" + + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ?????????? + ".8byte 0b0011100100000111100000100010000100001101010000011100100000\n" // Bulbasaur + ".8byte 0b0011100100000111100000100010000100001101010000011100100000\n" // Ivysaur + ".8byte 0b0011100100000111100000100010000110001101010100011100110000\n" // Venusaur + ".8byte 0b0010100110000111101010010011001100010100010000011000100011\n" // Charmander + ".8byte 0b0010100110000111101010010011001100010100010000011000100011\n" // Charmeleon + ".8byte 0b0010101110010111101010010011001110010100010100011000110011\n" // Charizard + ".8byte 0b1110110000000111100000000011001100010100110011001001100101\n" // Squirtle + ".8byte 0b1110110000000111100000000011001100010100110011001001100101\n" // Wartortle + ".8byte 0b1110110000000111100000000011001110010100110111001001110101\n" // Blastoise + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // Caterpie + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // Metapod + ".8byte 0b0001000000101111101000000010110100001111110100011000100000\n" // Butterfree + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // Weedle + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // Kakuna + ".8byte 0b0010000100001111101000100011000100001101010100011000100000\n" // Beedrill + ".8byte 0b0000001000011111101000000010000100000100110000011000100000\n" // Pidgey + ".8byte 0b0000001000011111101000000010000100000100110000011000100000\n" // Pidgeotto + ".8byte 0b0000001000011111101000000010000100000100110100011000100000\n" // Pidgeot + ".8byte 0b0010000100001111100000001010101101110100110011111000100000\n" // Rattata + ".8byte 0b0010100100001111100000001010101101110100110111111000110000\n" // Raticate + ".8byte 0b0000001000011111101000000010000100000100110000011000100000\n" // Spearow + ".8byte 0b0000001000011111101000000010000100000100110100011000100000\n" // Fearow + ".8byte 0b0000100001001111110000100010001110010101110000011000100000\n" // Ekans + ".8byte 0b0000100001001111110000100010001110010101110100011000100000\n" // Arbok + ".8byte 0b0011100000000111100000001011001101110100111000001000100001\n" // Pikachu + ".8byte 0b0011100000001111100000001011001101110100111100001000100001\n" // Raichu + ".8byte 0b0010100100001111101101000011001110010100010000011000100001\n" // Sandshrew + ".8byte 0b0010100100001111101101000011001110010100010100011000100001\n" // Sandslash + ".8byte 0b0010100100001111101000101010001101110100110011011000100100\n" // Nidoran♀ + ".8byte 0b0010100100001111101000101010001101110100110011011000100100\n" // Nidorina + ".8byte 0b0010110100001111111111111011101111110100110111111000110101\n" // Nidoqueen + ".8byte 0b0010100100001111100000101010001101110100110011011000100100\n" // Nidoran♂ + ".8byte 0b0010100100001111100000101010001101110100110011011000100100\n" // Nidorino + ".8byte 0b0010110100001111110111111011101111110100110111111000110101\n" // Nidoking + ".8byte 0b0001100001000111100010011111111101111110111011011000101101\n" // Clefairy + ".8byte 0b0001100001000111100010011111111101111110111111011000101101\n" // Clefable + ".8byte 0b0000000010000111100010010010001100010110010000011000110000\n" // Vulpix + ".8byte 0b0000000010000111100010010010001100010110010100011000110000\n" // Ninetales + ".8byte 0b0001100001000111100010011111111101101110111011011000100101\n" // Jigglypuff + ".8byte 0b0001100001000111100010011111111101101110111111011000100101\n" // Wigglytuff + ".8byte 0b0000000001011111111000100010100100000101110000111000100000\n" // Zubat + ".8byte 0b0000000001011111111000100010100100000101110100111000100000\n" // Golbat + ".8byte 0b0001000100000111100000100010000100001101010000011100100000\n" // Oddish + ".8byte 0b0001000100000111100000100010000100001101010000011100100000\n" // Gloom + ".8byte 0b0001000100000111100000100010000100001101010100011100100000\n" // Vileplume + ".8byte 0b0011000100001111101000100010001100001101010000011100100000\n" // Paras + ".8byte 0b0011000100001111101000100010001100001101010100011100100000\n" // Parasect + ".8byte 0b0001000000101111100000100010010100001101010000011000100000\n" // Venonat + ".8byte 0b0001000000101111101000100010010100001101010100011000100000\n" // Venomoth + ".8byte 0b0010000100001111101100100010001110000100010000011000100000\n" // Diglett + ".8byte 0b0010000100001111101100100010001110000100010100011000100000\n" // Dugtrio + ".8byte 0b0001000101001111111000001010101101110100110000111000100100\n" // Meowth + ".8byte 0b0001000101001111111000001010101101110100110100111000110100\n" // Persian + ".8byte 0b1111110000000111101000000011001100010100110011001001101101\n" // Psyduck + ".8byte 0b1111110000000111101000000011001100010100110111001001101101\n" // Golduck + ".8byte 0b0010100010001111101100000011001111110100110000111010100001\n" // Mankey + ".8byte 0b0010100010001111101100000011001111110100110100111010100001\n" // Primeape + ".8byte 0b0010100010001111101010010010001100010100010000011000110000\n" // Growlithe + ".8byte 0b0010100010001111101010010010001100010100010100011000110000\n" // Arcanine + ".8byte 0b1100010000001111100000000010011100000100110011001001100100\n" // Poliwag + ".8byte 0b1110110000001111100000000011011110000100110011001001100101\n" // Poliwhirl + ".8byte 0b1110110000001111100100000011011110000100110111001011100101\n" // Poliwrath + ".8byte 0b0001000001101111110000001110110100010110111000111000101001\n" // Abra + ".8byte 0b0001000001101111110000001110110100010110111000111000101001\n" // Kadabra + ".8byte 0b0001000001101111110000001110110100010110111100111000101001\n" // Alakazam + ".8byte 0b0010100000001111100110010011001110000100110000011010100001\n" // Machop + ".8byte 0b0010100000001111100110010011001110000100110000011010100001\n" // Machoke + ".8byte 0b0010100000001111100110010011001110000100110100011010100001\n" // Machamp + ".8byte 0b0001000100001111100000100010000100001101010000011100100000\n" // Bellsprout + ".8byte 0b0001000100001111100000100010000100001101010000011100100000\n" // Weepinbell + ".8byte 0b0001000100001111100000100010000100001101010100011100100000\n" // Victreebel + ".8byte 0b1100010100001111100000100010000100000101110011001001100100\n" // Tentacool + ".8byte 0b1100010100001111100000100010000100000101110111001001100100\n" // Tentacruel + ".8byte 0b0010100000000111100111010011001110000100010000011000100001\n" // Geodude + ".8byte 0b0010100000000111100111010011001110000100010000011000100001\n" // Graveler + ".8byte 0b0010100000000111100111010011001110000100010100011000110001\n" // Golem + ".8byte 0b0000100010000111100010010010000100011100010000011000100000\n" // Ponyta + ".8byte 0b0000100010000111100010010010000100011100010100011000100000\n" // Rapidash + ".8byte 0b1001110000100111100010010010111110010110110011011001101100\n" // Slowpoke + ".8byte 0b1011110000100111100010010011111110010110110111011001101101\n" // Slowbro + ".8byte 0b0001000000000011100000001110000101100100110000011000100000\n" // Magnemite + ".8byte 0b0001000000000011100000001110000101100100110100011000100000\n" // Magneton + ".8byte 0b0000001100011111101000000010000100010100010000011000100000\n" // Farfetch'd + ".8byte 0b0000001000011111101000000010000100000100010000011000100000\n" // Doduo + ".8byte 0b0000001000011111111000000010000100000100010100111000100000\n" // Dodrio + ".8byte 0b1100010000001111100000000010000100000110110011001001100100\n" // Seel + ".8byte 0b1100010000001111100000000010000100000110110111001001100100\n" // Dewgong + ".8byte 0b0000000000001111110110111010001101100101110000111000100000\n" // Grimer + ".8byte 0b0010100000001111110110111011001101100101110100111000100001\n" // Muk + ".8byte 0b1000010000000111100000000010000100000100110011001001100100\n" // Shellder + ".8byte 0b1000010000000111110000000010000100000100110111001001100100\n" // Cloyster + ".8byte 0b0000000001101111110000100010110100100101110000111000100000\n" // Gastly + ".8byte 0b0000000001101111110000100010110100100101110000111000100000\n" // Haunter + ".8byte 0b0010100001101111110000100011110101100101110100111000100001\n" // Gengar + ".8byte 0b0010100000000111110101000010001110010100010000111000110000\n" // Onix + ".8byte 0b0001000001101111110000000111110100000110111000111000101001\n" // Drowzee + ".8byte 0b0001000001101111110000000111110100000110111100111000101001\n" // Hypno + ".8byte 0b1010110100001111100100000010001100000100110011001001100100\n" // Krabby + ".8byte 0b1010110100001111100100000010001100000100110111001001100100\n" // Kingler + ".8byte 0b0001000000001011110000001010000101100100111000101000100000\n" // Voltorb + ".8byte 0b0001000000001011110000001010000101100100111100101000100000\n" // Electrode + ".8byte 0b0001100000101111100000100110010100001101011000011100100000\n" // Exeggcute + ".8byte 0b0001100000101111100000100110010100001101011100011100100000\n" // Exeggutor + ".8byte 0b0010100000001111101111010011001110010100010011011000100001\n" // Cubone + ".8byte 0b0010100000001111101111010011001110010100010111011000100001\n" // Marowak + ".8byte 0b0010100000001111100100000011000110000100110000011010100001\n" // Hitmonlee + ".8byte 0b0010100000001111100100000011000110000100110000011010100001\n" // Hitmonchan + ".8byte 0b0010110100001111100111011011101111111100110111011000100101\n" // Lickitung + ".8byte 0b0001000000001111110010111010100101100100110000111000100000\n" // Koffing + ".8byte 0b0001000000001111110010111010100101100100110100111000100000\n" // Weezing + ".8byte 0b0010100000001111100111011010001111110100110011011000110000\n" // Rhyhorn + ".8byte 0b0010110100001111100111011011001111110100110111011000110001\n" // Rhydon + ".8byte 0b0011100001100111100111011011110111111110111111011001101101\n" // Chansey + ".8byte 0b0011000100001111100000100010000100001101010100011100100000\n" // Tangela + ".8byte 0b0010110100001111101111011011101111111100110111011001110101\n" // Kangaskhan + ".8byte 0b1100010000000111100000000010000100000100110011001001100100\n" // Horsea + ".8byte 0b1100010000000111100000000010000100000100110111001001100100\n" // Seadra + ".8byte 0b1100010000000111100000000010000100000100110011001001100100\n" // Goldeen + ".8byte 0b1100010000000111100000000010000100000100110111001001100100\n" // Seaking + ".8byte 0b1101010000000011100000000110010101100100111011001001100100\n" // Staryu + ".8byte 0b1101010000100011100000000110010101100100111111001001100100\n" // Starmie + ".8byte 0b0001000001101111110000001111110101101110111100111000101001\n" // Mr. mime + ".8byte 0b0010000100011111101000000010000100000100110100011000100000\n" // Scyther + ".8byte 0b0001000000101111110000000111110100000100111111101001101101\n" // Jynx + ".8byte 0b0011100000001111100000001011010101110100111100001000100001\n" // Electabuzz + ".8byte 0b0010100000001111100010010011010100010100010100011000100001\n" // Magmar + ".8byte 0b0010100100001111100100000011001110000100110100011010100001\n" // Pinsir + ".8byte 0b0010110000000111100111011010000111111100110111011000100100\n" // Tauros + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // Magikarp + ".8byte 0b1110110000000111110011010010000111100100110111101001110100\n" // Gyarados + ".8byte 0b1110110000000111100000001010010101110110110111001001110100\n" // Lapras + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // Ditto + ".8byte 0b0000000000000111100000000010101100010100110000011000100000\n" // Eevee + ".8byte 0b1100010000000111100000000010101100010100110111011001110100\n" // Vaporeon + ".8byte 0b0001000000000111100000001010101101110100110100011000110000\n" // Jolteon + ".8byte 0b0000000010000111100010010010101100010100110100011000110000\n" // Flareon + ".8byte 0b0001000000001011101000001010110101111100110111011000100000\n" // Porygon + ".8byte 0b1110010000001111100101000010000100000100110011001001100100\n" // Omanyte + ".8byte 0b1110010000001111100101000010000100000100110111001001100100\n" // Omastar + ".8byte 0b0110010000001111101101000010001100000101110011001001100100\n" // Kabuto + ".8byte 0b1110010100001111101101000011001100000101110111001001100100\n" // Kabutops + ".8byte 0b0010101000011111111111010010000110010100110100111000110010\n" // Aerodactyl + ".8byte 0b0000110000000111100111011011110111101100110111011000100101\n" // Snorlax + ".8byte 0b0010001000010011101001000110000100000100110111011001110100\n" // Articuno + ".8byte 0b0011001000010011101001001010000101100100111100011000110000\n" // Zapdos + ".8byte 0b0010001010010011101011010010000100000110110100011000110000\n" // Moltres + ".8byte 0b0100010000000111100010011010000101110110110111011001100100\n" // Dratini + ".8byte 0b0100010000000111100010011010000101110110110111011001100100\n" // Dragonair + ".8byte 0b1110111100010111101111011011000111110110110111011001110111\n" // Dragonite + ".8byte 0b0011100001100011111111011111110111111110111111111011101101\n" // Mewtwo + ".8byte 0b1111111111111111111111111111111111111111111111111111111111\n" // Mew + ".8byte 0b0001000100000111100000000110000100011111011000011100100000\n" // Chikorita + ".8byte 0b0011100100000111100000000110000100011111011000011100100000\n" // Bayleef + ".8byte 0b0011100100000111100000000110000110011111011100011100100000\n" // Meganium + ".8byte 0b0000000110000111101010010010001100000100010000011000100000\n" // Cyndaquil + ".8byte 0b0010100110000111101010010011001100000100010000011000110001\n" // Quilava + ".8byte 0b0010100110000111101010010011001110000100010100011000110001\n" // Typhlosion + ".8byte 0b1100010100000111101000000011001100010100110011001001100101\n" // Totodile + ".8byte 0b1110110100000111101000000011001100010100110011001001110101\n" // Croconaw + ".8byte 0b1110110100000111101000000011001110010100110111001001110111\n" // Feraligatr + ".8byte 0b0000010100001111100000011011101100111100110001011000100101\n" // Sentret + ".8byte 0b0010110100001111100000011011101101111100110111011000100101\n" // Furret + ".8byte 0b0001001000011111101000000110110100000100110000011000100000\n" // Hoothoot + ".8byte 0b0001001000011111101000000110110100000100110100011000100000\n" // Noctowl + ".8byte 0b0001000000001111101000000111001100001111011000011000100001\n" // Ledyba + ".8byte 0b0001000000001111101000000111001100001111011100011000100001\n" // Ledian + ".8byte 0b0001000000001111100000100010011100001101010000011000100000\n" // Spinarak + ".8byte 0b0001000000001111100000100010011100001101010100011000100000\n" // Ariados + ".8byte 0b0000001001011111111000100010100100000101110100111000100000\n" // Crobat + ".8byte 0b1101010000000111100000001010000101100100110011001001100100\n" // Chinchou + ".8byte 0b1101010000000111100000001010000101100100110111001001100100\n" // Lanturn + ".8byte 0b0001000000000111100000001010000101110100111000001000100000\n" // Pichu + ".8byte 0b0001000000000111100010011110111100011110111000011000100100\n" // Cleffa + ".8byte 0b0001000000000111100010011110111100001110111000011000100100\n" // Igglybuff + ".8byte 0b0011000000000111100010011110110100001110111000011000100100\n" // Togepi + ".8byte 0b0011001000010111101010011111110100001110111100011000100101\n" // Togetic + ".8byte 0b0001000000111111101000000110110100001101111000011000101000\n" // Natu + ".8byte 0b0001001000111111101000000110110100001101111100011000101000\n" // Xatu + ".8byte 0b0001000000000111100000001010000101110100111000001000100000\n" // Mareep + ".8byte 0b0011100000000111100000001011000101110100111000001000100001\n" // Flaaffy + ".8byte 0b0011100000000111100000001011000101110100111100001000100001\n" // Ampharos + ".8byte 0b0001000100000111100000100010000100001111010100011100100000\n" // Bellossom + ".8byte 0b1110110000000111100000000011001100010100110011001001100101\n" // Marill + ".8byte 0b1110110000000111100000000011001100010100110111001001100101\n" // Azumarill + ".8byte 0b0010100000001111100101000011001110000100010000111000101001\n" // Sudowoodo + ".8byte 0b1110110000001111100000000011011110000100110111001001100101\n" // Politoed + ".8byte 0b0001000000000111101000000010000100001101010000011100100000\n" // Hoppip + ".8byte 0b0001000000000111101000000010000100001101010000011100100000\n" // Skiploom + ".8byte 0b0001000000000111101000000010000100001101010100011100100000\n" // Jumpluff + ".8byte 0b0010100101001111101000001011101101111100110000111000100101\n" // Aipom + ".8byte 0b0001000100000111100000100010000100001111011000011100100000\n" // Sunkern + ".8byte 0b0001000100000111100000100010000100001111011100011100100000\n" // Sunflora + ".8byte 0b0001000000011111101000000010110100001101010000011000100000\n" // Yanma + ".8byte 0b1111010000000111100001100010001110010100110011001001100100\n" // Wooper + ".8byte 0b1111110000000111100101100011001110010100110111001001100101\n" // Quagsire + ".8byte 0b0001000100100111100000000110111100010100111100011000101000\n" // Espeon + ".8byte 0b0001000101000111110000000010111100010100110100111000100000\n" // Umbreon + ".8byte 0b0000001001011111111000000010100100000100110000111000101000\n" // Murkrow + ".8byte 0b1011110000100111100010010011111110010110110111011001101101\n" // Slowking + ".8byte 0b0001000001101111111000001010110101100100110000111000101000\n" // Misdreavus + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // Unown + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // Wobbuffet + ".8byte 0b0011100000101111100000001110110111110100111000011000101000\n" // Girafarig + ".8byte 0b0010100000000111100001000110001110001101011000011000100000\n" // Pineco + ".8byte 0b0010100000000111100001000110001110001101011100011000100000\n" // Forretress + ".8byte 0b0010100000001111100110011010101111111100110011011000101100\n" // Dunsparce + ".8byte 0b0010100100011111101101100010001110010100110000011000100000\n" // Gligar + ".8byte 0b0010100100000111110101000010001110010100010100111000110000\n" // Steelix + ".8byte 0b0010100010001111110010111011101111101100110000111010110101\n" // Snubbull + ".8byte 0b0010100010001111110110111011101111111100110100111010110101\n" // Granbull + ".8byte 0b1100010000000111100000101010100100000100110011001001100100\n" // Qwilfish + ".8byte 0b0010100100011111101001000010000100000100110100011000100000\n" // Scizor + ".8byte 0b0011100000000111100101100010001110000110010000011000100000\n" // Shuckle + ".8byte 0b0010100100001111100100000011001110000100110100011010100001\n" // Heracross + ".8byte 0b0010110101001111111000000011101100010100110011111001101001\n" // Sneasel + ".8byte 0b0010100100001111111000000011001110000100110000111010110001\n" // Teddiursa + ".8byte 0b0010100100001111111100000011001110000100110100111010110001\n" // Ursaring + ".8byte 0b0010000010000111100010010110000100000100011000011000100000\n" // Slugma + ".8byte 0b0010100010000111100111010110000110000100011100011000100000\n" // Magcargo + ".8byte 0b0010100000000111100101000110001110000100111011001001110000\n" // Swinub + ".8byte 0b0010100000000111100101000110001110000100111111001001110000\n" // Piloswine + ".8byte 0b0010110000000111100101000110111110000110111011011001101100\n" // Corsola + ".8byte 0b1100010000001111100010010010010100000100110111011000100100\n" // Remoraid + ".8byte 0b1100010000001111100010110010010100000100110111011100100100\n" // Octillery + ".8byte 0b0000001000001111101000000010000100000100110011001001100101\n" // Delibird + ".8byte 0b1100010000000111101000000010000110000100110011001001100100\n" // Mantine + ".8byte 0b0010001100011111111001000010000100000100010000111000110000\n" // Skarmory + ".8byte 0b0010000011001111110010110010100100011100010000111000110000\n" // Houndour + ".8byte 0b0010100011001111110010110010100100011100010100111000110000\n" // Houndoom + ".8byte 0b1100010000000111100000000010000100000100110111001001100100\n" // Kingdra + ".8byte 0b0010100000000111100101000010000110010100010000011000110000\n" // Phanpy + ".8byte 0b0010100000000111100101000010000110010100010100011000110000\n" // Donphan + ".8byte 0b0001000000001011101000001010110101111100110111011000100000\n" // Porygon2 + ".8byte 0b0001000000101111100000001110110111111100111000011000111000\n" // Stantler + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // Smeargle + ".8byte 0b0010100000001111100000000011000110000100110000011010100000\n" // Tyrogue + ".8byte 0b0010100000001111100001000011001110000100110000011010100000\n" // Hitmontop + ".8byte 0b0001000000101111100000000110110100000100111011001001101100\n" // Smoochum + ".8byte 0b0011000000001111100000001011010101100100111000001000100001\n" // Elekid + ".8byte 0b0010000000001111100010010011010100010100010000011000100001\n" // Magby + ".8byte 0b0010110000000111100101001011100111111100110111011000100101\n" // Miltank + ".8byte 0b0011100001100111100111011011110111111110111111011001101101\n" // Blissey + ".8byte 0b0011100100000011100001001110001101110100110100011000111000\n" // Raikou + ".8byte 0b0011100100000011100011010110001100011100110100011000111000\n" // Entei + ".8byte 0b1110010100000011100001000110001100010100110111011001111100\n" // Suicune + ".8byte 0b0010000000000111110001000011001110000100110100111000100000\n" // Larvitar + ".8byte 0b0010000000000111110001000011001110000100110100111000100000\n" // Pupitar + ".8byte 0b0010110100000111111111011011001111110100110111111000110111\n" // Tyranitar + ".8byte 0b1110111000110011101001001110110111110111111111011001111100\n" // Lugia + ".8byte 0b0011101010010011101011011110110111101111111100011000111000\n" // Ho-Oh + ".8byte 0b0001000100100011101001001110110100001111111100011000101100\n" // Celebi + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // ? + ".8byte 0b0011100100000111101100000011001100011111010000011100100001\n" // Treecko + ".8byte 0b0011100100000111101100000011001100011111010000011100100001\n" // Grovyle + ".8byte 0b0011100100000111101100000011001110011111010100011100110011\n" // Sceptile + ".8byte 0b0010100110000111101110010010001100000100010000011000100000\n" // Torchic + ".8byte 0b0010100110000111101110010011001100000100010000011010100001\n" // Combusken + ".8byte 0b0010100110000111101110010011001110000100010100011010110001\n" // Blaziken + ".8byte 0b1110110000000111100100000010001100010100110011001001100100\n" // Mudkip + ".8byte 0b1110110000000111100100000010001110010100110011001001100100\n" // Marshtomp + ".8byte 0b1110110000000111100100000011001110010100110111001001110101\n" // Swampert + ".8byte 0b0010000001001111110000000010101100010100110000111000110000\n" // Poochyena + ".8byte 0b0010100001001111110000000010101100010100110100111000110000\n" // Mightyena + ".8byte 0b0010010100001111100000001010101101110100110011011000100100\n" // Zigzagoon + ".8byte 0b0010110100001111100000001010101101110100110111011000110100\n" // Linoone + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // Wurmple + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // Silcoon + ".8byte 0b0001000000001111101000000010110100001111010100011000100000\n" // Beautifly + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // Cascoon + ".8byte 0b0001000000001111101000100010110100001101011100011000100000\n" // Dustox + ".8byte 0b0001010000001111100000000010000100001101110011011101100100\n" // Lotad + ".8byte 0b1111110000001111100000000011000100001101110011011101100100\n" // Lombre + ".8byte 0b1111110000001111100000000011000100001101110111011101100101\n" // Ludicolo + ".8byte 0b0011000000000111100000000010101100001101010000011100100000\n" // Seedot + ".8byte 0b0011100100001111110100000011101100001101010100011100100000\n" // Nuzleaf + ".8byte 0b0011100100001111111100000011101100001101010100011100100000\n" // Shiftry + ".8byte 0b0001000100000011101001000010101100001101010000011000100000\n" // Nincada + ".8byte 0b0001000100001111101001000010101100001101010100011000100000\n" // Ninjask + ".8byte 0b0001000100001011101001000010101100001101010100011000100000\n" // Shedinja + ".8byte 0b0000001000011111101000000010000100000100110000011000100000\n" // Taillow + ".8byte 0b0000001000011111101000000010000100000100110100011000100000\n" // Swellow + ".8byte 0b0001000001000111100000100010000100001111010000011100100000\n" // Shroomish + ".8byte 0b0011100101000111100000100011000100011111010100011110100001\n" // Breloom + ".8byte 0b0011100001101111100100001011111100000110110000011000101101\n" // Spinda + ".8byte 0b0000001000011111101000001010000100000100110011001001100100\n" // Wingull + ".8byte 0b0000011000011111101000001010000100000100110111001001100100\n" // Pelipper + ".8byte 0b0001000000001111100000000010100100001101110011011000100100\n" // Surskit + ".8byte 0b0001000000001111101000000010100100001101110111011000100100\n" // Masquerain + ".8byte 0b1110110000000111100100000010000110000100110011001001110100\n" // Wailmer + ".8byte 0b1110110000000111100100000010000110000100110111001001110100\n" // Wailord + ".8byte 0b0001000000000111100000001010101101111110110011011000101100\n" // Skitty + ".8byte 0b0011100000000111100000001010101101111110110111011000101100\n" // Delcatty + ".8byte 0b0011100101101111101110011011101101111100110011011000100101\n" // Kecleon + ".8byte 0b0001000000100011100101000110111110001100111001011000100000\n" // Baltoy + ".8byte 0b0011100000100011100101000110111110001100111101011000100000\n" // Claydol + ".8byte 0b0010100000000111110101001010000111100100010000111000100000\n" // Nosepass + ".8byte 0b0010100010000111100010110010000100010100010000011000100000\n" // Torkoal + ".8byte 0b0011000101001111111100001011111100000100110000111000101101\n" // Sableye + ".8byte 0b1100010000000111100101000010000110000100110011001001100100\n" // Barboach + ".8byte 0b1110110000000111100101000010000110000100110111001001100100\n" // Whiscash + ".8byte 0b1100010000000111100000000010000100000110110011001001100100\n" // Luvdisc + ".8byte 0b0110110100000111101100100011001100000100110011101001100100\n" // Corphish + ".8byte 0b1110110100000111101100100011001100000100110111101001100100\n" // Crawdaunt + ".8byte 0b1100010000000111100000000010000100000100110011001001100100\n" // Feebas + ".8byte 0b1100010000000111100000000010000100010110110111001001100100\n" // Milotic + ".8byte 0b1100010000001111110000000010000100000100110011101001100100\n" // Carvanha + ".8byte 0b1110110000001111110100000010000110000100110111101001110100\n" // Sharpedo + ".8byte 0b0010100000000111100101000010001110001101010100011000100000\n" // Trapinch + ".8byte 0b0010101000010111100101000010001110001101010100011000100000\n" // Vibrava + ".8byte 0b0010101000010111100111010010001110011101010100011000100010\n" // Flygon + ".8byte 0b0010110000000111100100000011001110000100110000011010100001\n" // Makuhita + ".8byte 0b0010110000000111100100000011001110000100110100011010100001\n" // Hariyama + ".8byte 0b0001100000001111100000001010000101110100110000001000110000\n" // Electrike + ".8byte 0b0001100000001111100000001010000101110100110100001000110000\n" // Manectric + ".8byte 0b0010100010000111100111010010001110000100010000011000100000\n" // Numel + ".8byte 0b0010100010000111100111010010001110000100010100011000110000\n" // Camerupt + ".8byte 0b1110110000000111100100000010000110010100110011001001100100\n" // Spheal + ".8byte 0b1110110000000111100100000010000110010100110011001001110100\n" // Sealeo + ".8byte 0b1110110000000111100100000010000110010100110111001001110100\n" // Walrein + ".8byte 0b0001000100000111100001000010000100001101010000011100100001\n" // Cacnea + ".8byte 0b0001100100000111100001000010000100001101010100011100100001\n" // Cacturne + ".8byte 0b0001000000000111100000000010100100000110111011001001100100\n" // Snorunt + ".8byte 0b0001000000000111110000000010100110000110111111101001100100\n" // Glalie + ".8byte 0b0001000000100011100101000110110110000110111101001000101000\n" // Lunatone + ".8byte 0b0001000010100011100111010110110110001110011100011000101000\n" // Solrock + ".8byte 0b0100010000000111100000000010000100010100110011001001100100\n" // Azurill + ".8byte 0b0001000001101111110000001110110100010100111000111000101000\n" // Spoink + ".8byte 0b0001000001101111110000001110110100010100111100111000101001\n" // Grumpig + ".8byte 0b0001000000000111100000001010000101110100111000001000100000\n" // Plusle + ".8byte 0b0001000000000111100000001010000101110100111000001000100000\n" // Minun + ".8byte 0b0010100000000111110111110011000100001100110101111000100001\n" // Mawile + ".8byte 0b0011100000000111100100000111110100000100111000011010101001\n" // Meditite + ".8byte 0b0011100000000111100100000111110100000100111100011010101001\n" // Medicham + ".8byte 0b0000001000011111101000000010000100001110110001011000100000\n" // Swablu + ".8byte 0b0010001000011111101010010010000110011110110101011000110010\n" // Altaria + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // Wynaut + ".8byte 0b0001000001101111110000000010110100000100110011111000101000\n" // Duskull + ".8byte 0b0011100001101111110100000010110110000100110111111000101001\n" // Dusclops + ".8byte 0b0001000100000111100000100010100100001101010000011100100000\n" // Roselia + ".8byte 0b0010100100000111101010011011100101101100110011011010100101\n" // Slakoth + ".8byte 0b0010100100000111101010011011100111101100110011111010110101\n" // Vigoroth + ".8byte 0b0010100100000111101010011011100111101100110111111010110101\n" // Slaking + ".8byte 0b0010100001000111100000101010100100001101110001011100100100\n" // Gulpin + ".8byte 0b0010100001000111100000101010100100001101110101011100100100\n" // Swalot + ".8byte 0b0011101100010111101000000010000110001111010100011100110000\n" // Tropius + ".8byte 0b0000000000000111100010011010100100001100110011011000110100\n" // Whismur + ".8byte 0b0010100010000111110010011011100110001100110011111000110100\n" // Loudred + ".8byte 0b0010100010000111110010011011100110001100110111111000110100\n" // Exploud + ".8byte 0b1100010000000111100000000010000100000100110011001001100100\n" // Clamperl + ".8byte 0b1100010001000111100100000010000100000100110111001001100100\n" // Huntail + ".8byte 0b1100010000000111100000000010110100000110110111001001100100\n" // Gorebyss + ".8byte 0b0011100101001111111011011010100101110100110111111001101100\n" // Absol + ".8byte 0b0001000001101111110000001010110101100100110000111000101000\n" // Shuppet + ".8byte 0b0001000001101111110000001010110101100100110100111000101000\n" // Banette + ".8byte 0b0010100001001111100000110010001110010101110000111000100000\n" // Seviper + ".8byte 0b0010100000001111101010011011101101111101110011111000110101\n" // Zangoose + ".8byte 0b1110010000000111100101000010000110000110110111001001101100\n" // Relicanth + ".8byte 0b0010100100000111101101001010001110010100110000011000110100\n" // Aron + ".8byte 0b0010100100000111101101001010001110010100110000011000110100\n" // Lairon + ".8byte 0b0010110100000111101111011011001111111100110111111000110111\n" // Aggron + ".8byte 0b0001000000001111100011011010100101101100110011011001100100\n" // Castform + ".8byte 0b0001000000001111101000001011100101101101111000011000100101\n" // Volbeat + ".8byte 0b0001000000001111101000001011100101101101111000011000100101\n" // Illumise + ".8byte 0b0000000000000111100001100010000100001101010000011100100000\n" // Lileep + ".8byte 0b0010100000000111100101100010000110001101010100011100100000\n" // Cradily + ".8byte 0b0010000100000111101101000011001100000100010000011000100100\n" // Anorith + ".8byte 0b0010100100000111101101000011001110010100010100011000100100\n" // Armaldo + ".8byte 0b0001000001101111110000001110110100100110111000111000101000\n" // Ralts + ".8byte 0b0001000001101111110000001110110100100110111000111000101000\n" // Kirlia + ".8byte 0b0001000001101111110000001110110100100110111100111000101000\n" // Gardevoir + ".8byte 0b0010100100000111101110010011000100000100110000011000110010\n" // Bagon + ".8byte 0b0010100100000111101110010011000100000100110000011000110010\n" // Shelgon + ".8byte 0b0010101100010111101110010011000110010100110100011000110010\n" // Salamence + ".8byte 0b0000000000000000000000000000000000000000000000000000000000\n" // Beldum + ".8byte 0b0011100100000011101101100111110110000100111100011000100000\n" // Metang + ".8byte 0b0011100100000011101101100111110110000100111100011000100000\n" // Metagross + ".8byte 0b0010100000000011100101001011001111100110010100011000100001\n" // Regirock + ".8byte 0b0010100000000011100000001011000111100110110111001001100001\n" // Regice + ".8byte 0b0010100000000011101101001011000111100110110100011000100001\n" // Registeel + ".8byte 0b1110110000000011100100001011000111100110110111001001111100\n" // Kyogre + ".8byte 0b0010100110000011101111011011001111111110010100011010110010\n" // Groudon + ".8byte 0b1110111010000011101011011011000111111100110111011010110110\n" // Rayquaza + ".8byte 0b1101011100010111101001001110110111101110111101011000111110\n" // Latias + ".8byte 0b1101011100010111101001001110110111101110111101011000111110\n" // Latios + ".8byte 0b0001000000100011101001001110110101100110111100011000101100\n" // Jirachi + ".8byte 0b0011100101100011111100001111110101101110111101111000101101\n" // Deoxys + ".8byte 0b0001000001100111110000001110110100000110111000111000101000\n" // Chimecho +); + +#endif //POKERUBY_TMHM_LEARNSETS_H diff --git a/src/data/pokemon/trainer_class_lookups.h b/src/data/pokemon/trainer_class_lookups.h new file mode 100644 index 000000000..c86e795c4 --- /dev/null +++ b/src/data/pokemon/trainer_class_lookups.h @@ -0,0 +1,168 @@ +// + +// + +#ifndef POKERUBY_TRAINER_CLASS_LOOKUPS_H +#define POKERUBY_TRAINER_CLASS_LOOKUPS_H + +const u8 gTrainerClassToPicIndex[] = { + TRAINER_PIC_ARCHIE, // AQUA_LEADER + TRAINER_PIC_AQUA_GRUNT_M, // TEAM_AQUA_M + TRAINER_PIC_AQUA_GRUNT_F, // TEAM_AQUA_F + TRAINER_PIC_AROMA_LADY, // AROMA_LADY + TRAINER_PIC_RUIN_MANIAC, // RUIN_MANIAC + TRAINER_PIC_INTERVIEWER, // INTERVIEWER + TRAINER_PIC_TUBER_F, // TUBER_F + TRAINER_PIC_TUBER_M, // TUBER_M + TRAINER_PIC_COOL_TRAINER_M, // COOL_TRAINER_M + TRAINER_PIC_COOL_TRAINER_F, // COOL_TRAINER_F + TRAINER_PIC_HEX_MANIAC, // HEX_MANIAC + TRAINER_PIC_LADY, // LADY + TRAINER_PIC_BEAUTY, // BEAUTY + TRAINER_PIC_RICH_BOY, // RICH_BOY + TRAINER_PIC_POKEMANIAC, // POKEMANIAC + TRAINER_PIC_SWIMMER_M, // SWIMMER_M + TRAINER_PIC_BLACK_BELT, // BLACK_BELT + TRAINER_PIC_GUITARIST, // GUITARIST + TRAINER_PIC_KINDLER, // KINDLER + TRAINER_PIC_CAMPER, // CAMPER + TRAINER_PIC_BUG_MANIAC, // BUG_MANIAC + TRAINER_PIC_PSYCHIC_M, // PSYCHIC_M + TRAINER_PIC_PSYCHIC_F, // PSYCHIC_F + TRAINER_PIC_GENTLEMAN, // GENTLEMAN + TRAINER_PIC_SIDNEY, // ELITE_FOUR_M + TRAINER_PIC_PHOEBE, // ELITE_FOUR_F + TRAINER_PIC_ROXANNE, // LEADER_F + TRAINER_PIC_BRAWLY, // LEADER_M + TRAINER_PIC_TATE_AND_LIZA, // LEADER_MF + TRAINER_PIC_SCHOOL_KID_M, // SCHOOL_KID_M + TRAINER_PIC_SCHOOL_KID_F, // SCHOOL_KID_F + TRAINER_PIC_SR_AND_JR, // SR_AND_JR + TRAINER_PIC_POKEFAN_M, // POKEFAN_M + TRAINER_PIC_POKEFAN_F, // POKEFAN_F + TRAINER_PIC_EXPERT_M, // EXPERT_M + TRAINER_PIC_EXPERT_F, // EXPERT_F + TRAINER_PIC_YOUNGSTER, // YOUNGSTER + TRAINER_PIC_STEVEN, // CHAMPION + TRAINER_PIC_FISHERMAN, // FISHERMAN + TRAINER_PIC_CYCLING_TRIATHLETE_M, // CYCLING_TRIATHLETE_M + TRAINER_PIC_CYCLING_TRIATHLETE_F, // CYCLING_TRIATHLETE_F + TRAINER_PIC_RUNNING_TRIATHLETE_M, // RUNNING_TRIATHLETE_M + TRAINER_PIC_RUNNING_TRIATHLETE_F, // RUNNING_TRIATHLETE_F + TRAINER_PIC_SWIMMING_TRIATHLETE_M, // SWIMMING_TRIATHLETE_M + TRAINER_PIC_SWIMMING_TRIATHLETE_F, // SWIMMING_TRIATHLETE_F + TRAINER_PIC_DRAGON_TAMER, // DRAGON_TAMER + TRAINER_PIC_BIRD_KEEPER, // BIRD_KEEPER + TRAINER_PIC_NINJA_BOY, // NINJA_BOY + TRAINER_PIC_BATTLE_GIRL, // BATTLE_GIRL + TRAINER_PIC_PARASOL_LADY, // PARASOL_LADY + TRAINER_PIC_SWIMMER_F, // SWIMMER_F + TRAINER_PIC_PICNICKER, // PICNICKER + TRAINER_PIC_TWINS, // TWINS + TRAINER_PIC_SAILOR, // SAILOR + TRAINER_PIC_YOUNGSTER, // BOARDER_1 + TRAINER_PIC_YOUNGSTER, // BOARDER_2 + TRAINER_PIC_COLLECTOR, // COLLECTOR + TRAINER_PIC_WALLY, // WALLY + TRAINER_PIC_BRENDAN, // BRENDAN_1 + TRAINER_PIC_BRENDAN, // BRENDAN_2 + TRAINER_PIC_BRENDAN, // BRENDAN_3 + TRAINER_PIC_MAY, // MAY_1 + TRAINER_PIC_MAY, // MAY_2 + TRAINER_PIC_MAY, // MAY_3 + TRAINER_PIC_POKEMON_BREEDER_M, // POKEMON_BREEDER_M + TRAINER_PIC_POKEMON_BREEDER_F, // POKEMON_BREEDER_F + TRAINER_PIC_POKEMON_RANGER_M, // POKEMON_RANGER_M + TRAINER_PIC_POKEMON_RANGER_F, // POKEMON_RANGER_F + TRAINER_PIC_MAXIE, // MAGMA_LEADER + TRAINER_PIC_MAGMA_GRUNT_M, // TEAM_MAGMA_M + TRAINER_PIC_MAGMA_GRUNT_F, // TEAM_MAGMA_F + TRAINER_PIC_LASS, // LASS + TRAINER_PIC_BUG_CATCHER, // BUG_CATCHER + TRAINER_PIC_HIKER, // HIKER + TRAINER_PIC_YOUNG_COUPLE, // YOUNG_COUPLE + TRAINER_PIC_OLD_COUPLE, // OLD_COUPLE + TRAINER_PIC_SIS_AND_BRO // SIS_AND_BRO +}; + +const u8 gTrainerClassToNameIndex[] = { + TRAINER_CLASS_NAME_AQUA_LEADER, // AQUA_LEADER + TRAINER_CLASS_NAME_TEAM_AQUA, // TEAM_AQUA_M + TRAINER_CLASS_NAME_TEAM_AQUA, // TEAM_AQUA_F + TRAINER_CLASS_NAME_AROMA_LADY, // AROMA_LADY + TRAINER_CLASS_NAME_RUIN_MANIAC, // RUIN_MANIAC + TRAINER_CLASS_NAME_INTERVIEWER, // INTERVIEWER + TRAINER_CLASS_NAME_TUBER_F, // TUBER_F + TRAINER_CLASS_NAME_TUBER_M, // TUBER_M + TRAINER_CLASS_NAME_COOL_TRAINER, // COOL_TRAINER_M + TRAINER_CLASS_NAME_COOL_TRAINER, // COOL_TRAINER_F + TRAINER_CLASS_NAME_HEX_MANIAC, // HEX_MANIAC + TRAINER_CLASS_NAME_LADY, // LADY + TRAINER_CLASS_NAME_BEAUTY, // BEAUTY + TRAINER_CLASS_NAME_RICH_BOY, // RICH_BOY + TRAINER_CLASS_NAME_POKEMANIAC, // POKEMANIAC + TRAINER_CLASS_NAME_SWIMMER_M, // SWIMMER_M + TRAINER_CLASS_NAME_BLACK_BELT, // BLACK_BELT + TRAINER_CLASS_NAME_GUITARIST, // GUITARIST + TRAINER_CLASS_NAME_KINDLER, // KINDLER + TRAINER_CLASS_NAME_CAMPER, // CAMPER + TRAINER_CLASS_NAME_BUG_MANIAC, // BUG_MANIAC + TRAINER_CLASS_NAME_PSYCHIC, // PSYCHIC_M + TRAINER_CLASS_NAME_PSYCHIC, // PSYCHIC_F + TRAINER_CLASS_NAME_GENTLEMAN, // GENTLEMAN + TRAINER_CLASS_NAME_ELITE_FOUR, // ELITE_FOUR_M + TRAINER_CLASS_NAME_ELITE_FOUR, // ELITE_FOUR_F + TRAINER_CLASS_NAME_LEADER, // LEADER_F + TRAINER_CLASS_NAME_LEADER, // LEADER_M + TRAINER_CLASS_NAME_LEADER, // LEADER_MF + TRAINER_CLASS_NAME_SCHOOL_KID, // SCHOOL_KID_M + TRAINER_CLASS_NAME_SCHOOL_KID, // SCHOOL_KID_F + TRAINER_CLASS_NAME_SR_AND_JR, // SR_AND_JR + TRAINER_CLASS_NAME_POKEFAN, // POKEFAN_M + TRAINER_CLASS_NAME_POKEFAN, // POKEFAN_F + TRAINER_CLASS_NAME_EXPERT, // EXPERT_M + TRAINER_CLASS_NAME_EXPERT, // EXPERT_F + TRAINER_CLASS_NAME_YOUNGSTER, // YOUNGSTER + TRAINER_CLASS_NAME_CHAMPION, // CHAMPION + TRAINER_CLASS_NAME_FISHERMAN, // FISHERMAN + TRAINER_CLASS_NAME_TRIATHLETE, // CYCLING_TRIATHLETE_M + TRAINER_CLASS_NAME_TRIATHLETE, // CYCLING_TRIATHLETE_F + TRAINER_CLASS_NAME_TRIATHLETE, // RUNNING_TRIATHLETE_M + TRAINER_CLASS_NAME_TRIATHLETE, // RUNNING_TRIATHLETE_F + TRAINER_CLASS_NAME_TRIATHLETE, // SWIMMING_TRIATHLETE_M + TRAINER_CLASS_NAME_TRIATHLETE, // SWIMMING_TRIATHLETE_F + TRAINER_CLASS_NAME_DRAGON_TAMER, // DRAGON_TAMER + TRAINER_CLASS_NAME_BIRD_KEEPER, // BIRD_KEEPER + TRAINER_CLASS_NAME_NINJA_BOY, // NINJA_BOY + TRAINER_CLASS_NAME_BATTLE_GIRL, // BATTLE_GIRL + TRAINER_CLASS_NAME_PARASOL_LADY, // PARASOL_LADY + TRAINER_CLASS_NAME_SWIMMER_F, // SWIMMER_F + TRAINER_CLASS_NAME_PICNICKER, // PICNICKER + TRAINER_CLASS_NAME_TWINS, // TWINS + TRAINER_CLASS_NAME_SAILOR, // SAILOR + TRAINER_CLASS_NAME_BOARDER, // BOARDER_1 + TRAINER_CLASS_NAME_BOARDER, // BOARDER_2 + TRAINER_CLASS_NAME_COLLECTOR, // COLLECTOR + TRAINER_CLASS_NAME_POKEMON_TRAINER_3, // WALLY + TRAINER_CLASS_NAME_POKEMON_TRAINER_3, // BRENDAN_1 + TRAINER_CLASS_NAME_POKEMON_TRAINER_3, // BRENDAN_2 + TRAINER_CLASS_NAME_POKEMON_TRAINER_3, // BRENDAN_3 + TRAINER_CLASS_NAME_POKEMON_TRAINER_3, // MAY_1 + TRAINER_CLASS_NAME_POKEMON_TRAINER_3, // MAY_2 + TRAINER_CLASS_NAME_POKEMON_TRAINER_3, // MAY_3 + TRAINER_CLASS_NAME_POKEMON_BREEDER, // POKEMON_BREEDER_M + TRAINER_CLASS_NAME_POKEMON_BREEDER, // POKEMON_BREEDER_F + TRAINER_CLASS_NAME_POKEMON_RANGER, // POKEMON_RANGER_M + TRAINER_CLASS_NAME_POKEMON_RANGER, // POKEMON_RANGER_F + TRAINER_CLASS_NAME_MAGMA_LEADER, // MAGMA_LEADER + TRAINER_CLASS_NAME_TEAM_MAGMA, // TEAM_MAGMA_M + TRAINER_CLASS_NAME_TEAM_MAGMA, // TEAM_MAGMA_F + TRAINER_CLASS_NAME_LASS, // LASS + TRAINER_CLASS_NAME_BUG_CATCHER, // BUG_CATCHER + TRAINER_CLASS_NAME_HIKER, // HIKER + TRAINER_CLASS_NAME_YOUNG_COUPLE, // YOUNG_COUPLE + TRAINER_CLASS_NAME_OLD_COUPLE, // OLD_COUPLE + TRAINER_CLASS_NAME_SIS_AND_BRO // SIS_AND_BRO +}; + +#endif //POKERUBY_TRAINER_CLASS_LOOKUPS_H diff --git a/src/daycare.c b/src/daycare.c deleted file mode 100644 index 7f688016a..000000000 --- a/src/daycare.c +++ /dev/null @@ -1,350 +0,0 @@ -#include "global.h" -#include "daycare.h" -#include "pokemon.h" -#include "species.h" -#include "items.h" -#include "string_util.h" - -extern u8 gLastFieldPokeMenuOpened; - -u8 *GetMonNick(struct Pokemon *mon, u8 *dest) -{ - s8 nickname[POKEMON_NAME_LENGTH * 2]; - - GetMonData(mon, MON_DATA_NICKNAME, nickname); - return StringCopy10(dest, nickname); -} - -u8 *GetBoxMonNick(struct BoxPokemon *mon, u8 *dest) -{ - s8 nickname[POKEMON_NAME_LENGTH * 2]; - - GetBoxMonData(mon, MON_DATA_NICKNAME, nickname); - return StringCopy10(dest, nickname); -} - -u8 Daycare_CountPokemon(struct BoxPokemon *daycare_data) -{ - u8 i, count; - count = 0; - - for(i = 0;i <= 1;i++) - if(GetBoxMonData(daycare_data + i, MON_DATA_SPECIES) != 0) - count++; - - return count; -} - -void sub_8041324(struct BoxPokemon * box_pokemon, struct RecordMixing_UnknownStruct * void_pointer) -{ - u8 i; - u8 specCount; - specCount = 0; - for (i=0; i<2; i++) - { - if (GetBoxMonData(&box_pokemon[i], MON_DATA_SPECIES) != SPECIES_NONE) - { - specCount ++; - if (GetBoxMonData(&box_pokemon[i], MON_DATA_HELD_ITEM) == ITEM_NONE) - { - void_pointer->unk74[i] = 0; - } else - { - void_pointer->unk74[i] = 1; - } - } else - { - void_pointer->unk74[i] = 1; - } - } - void_pointer->unk70 = specCount; -} - -s8 Daycare_FindEmptySpot(struct BoxPokemon * daycare_data) -{ - u8 i; - - for(i = 0;i <= 1;i++) - if(GetBoxMonData(daycare_data + i, MON_DATA_SPECIES) == 0) - return i; - - return -1; -} - -/*void Daycare_SendPokemon(struct Pokemon * mon, struct BoxPokemon * daycare_data){ // unfinished - s8 empty_slot; - - empty_slot = Daycare_FindEmptySpot(daycare_data); - if(MonHasMail(mon) != 0){ // if the mon holds a mail? - u8 empty_slot_times_56 = empty_slot * 56; - u8 * something2 = ((u8 *) (daycare_data + 2)) + empty_slot_times_56 + 36; - StringCopy(something2, gSaveBlock2.playerName); - PadNameString(something2, 0xFC); - something2 += 8; - GetMonNick(mon, something2); - u8 pokerus = GetMonData(mon, MON_DATA_64); - something1 += (u8 * daycare_data) -}*/ - -__attribute__((naked)) -void Daycare_SendPokemon() -{ - // strange stack usage - happens because THUMB ARM only allows R0-R7 to be pushed/popped: - // all registers in reglist must be Lo registers, except that PUSH can include the LR, and POP can include the PC - // the ldm/stm section probably copies some struct, but I'm not sure how the code would look - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - adds r7, r0, 0\n\ - mov r8, r1\n\ - mov r0, r8\n\ - bl Daycare_FindEmptySpot\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - mov r9, r4\n\ - adds r0, r7, 0\n\ - bl MonHasMail\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _0804144A\n\ - lsls r0, r4, 24\n\ - asrs r0, 24\n\ - lsls r4, r0, 3\n\ - subs r4, r0\n\ - lsls r4, 3\n\ - adds r5, r4, 0\n\ - adds r5, 0xA0\n\ - add r5, r8\n\ - adds r6, r5, 0\n\ - adds r6, 0x24\n\ - ldr r1, _08041490 @ =gSaveBlock2\n\ - adds r0, r6, 0\n\ - bl StringCopy\n\ - adds r0, r6, 0\n\ - movs r1, 0xFC\n\ - bl PadNameString\n\ - adds r6, 0x8\n\ - adds r0, r7, 0\n\ - adds r1, r6, 0\n\ - bl GetMonNick\n\ - adds r0, r7, 0\n\ - movs r1, 0x40\n\ - bl GetMonData\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - add r4, r8\n\ - ldr r2, _08041494 @ =gSaveBlock1\n\ - lsls r1, r0, 3\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r2\n\ - adds r4, 0xA0\n\ - ldr r0, _08041498 @ =0x00002b4c\n\ - adds r1, r0\n\ - ldm r1!, {r0,r2,r3}\n\ - stm r4!, {r0,r2,r3}\n\ - ldm r1!, {r0,r2,r3}\n\ - stm r4!, {r0,r2,r3}\n\ - ldm r1!, {r0,r2,r3}\n\ - stm r4!, {r0,r2,r3}\n\ - adds r0, r7, 0\n\ - bl TakeMailFromMon\n\ -_0804144A:\n\ - mov r2, r9\n\ - lsls r4, r2, 24\n\ - asrs r4, 24\n\ - lsls r5, r4, 2\n\ - adds r4, r5, r4\n\ - lsls r4, 4\n\ - add r4, r8\n\ - adds r0, r4, 0\n\ - adds r1, r7, 0\n\ - movs r2, 0x50\n\ - bl memcpy\n\ - adds r0, r4, 0\n\ - bl BoxMonRestorePP\n\ - movs r0, 0x88\n\ - lsls r0, 1\n\ - add r0, r8\n\ - adds r0, r5\n\ - movs r1, 0\n\ - str r1, [r0]\n\ - adds r0, r7, 0\n\ - bl ZeroMonData\n\ - bl party_compaction\n\ - bl CalculatePlayerPartyCount\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08041490: .4byte gSaveBlock2\n\ -_08041494: .4byte gSaveBlock1\n\ -_08041498: .4byte 0x00002b4c\n\ - .syntax divided\n"); -} - -void Daycare_SendPokemon_Special() -{ - Daycare_SendPokemon(gPlayerParty + gLastFieldPokeMenuOpened, gSaveBlock1.daycareData); -} - -void sub_80417F4(u8 *); - -void sub_80414C0(struct BoxPokemon * daycare_data) -{ - u32 second_species; - if((GetBoxMonData(&daycare_data[1], MON_DATA_SPECIES) != 0) && ((second_species = GetBoxMonData(&daycare_data[0], MON_DATA_SPECIES)) == 0)){ - daycare_data[0] = daycare_data[1]; - ZeroBoxMonData(&daycare_data[1]); - memcpy(daycare_data + 2, (u8 *) (daycare_data + 1) + 0x88, 0x38); - *((u32 *)(daycare_data) + 68) = *((u32 *)(daycare_data) + 69); - *((u32 *)(daycare_data) + 69) = second_species; - sub_80417F4((u8 *) (daycare_data + 1) + 0x88); - } -} - -u8 TryIncrementMonLevel(struct Pokemon *); -extern u16 gMoveToLearn; - -void sub_804151C(struct Pokemon * mon) -{ - s32 i; - u8 r6; - u16 temp; - - for(i = 0; i < 100; i++){ - if(TryIncrementMonLevel(mon) == FALSE) goto end; - - r6 = 1; - while((temp = MonTryLearningNewMove(mon, r6)) != 0){ - r6 = 0; - if(temp == 0xffff){ - DeleteFirstMoveAndGiveMoveToMon(mon, gMoveToLearn); - } - } - } - - end: - - CalculateMonStats(mon); -} - -__attribute__((naked)) -u16 sub_8041570(struct BoxPokemon * daycare_data, u8 a2){ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - sub sp, 0x68\n\ - adds r5, r0, 0\n\ - lsls r1, 24\n\ - lsrs r4, r1, 24\n\ - lsls r7, r4, 2\n\ - adds r0, r7, r4\n\ - lsls r0, 4\n\ - adds r6, r5, r0\n\ - ldr r1, _08041640 @ =gStringVar1\n\ - adds r0, r6, 0\n\ - bl GetBoxMonNick\n\ - adds r0, r6, 0\n\ - movs r1, 0xB\n\ - bl GetBoxMonData\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - mov r9, r0\n\ - adds r0, r6, 0\n\ - mov r1, sp\n\ - bl sub_803B4B4\n\ - mov r0, sp\n\ - movs r1, 0x38\n\ - bl GetMonData\n\ - cmp r0, 0x64\n\ - beq _080415D8\n\ - mov r0, sp\n\ - movs r1, 0x19\n\ - bl GetMonData\n\ - movs r2, 0x88\n\ - lsls r2, 1\n\ - adds r1, r5, r2\n\ - adds r1, r7\n\ - ldr r1, [r1]\n\ - adds r0, r1\n\ - str r0, [sp, 0x64]\n\ - add r2, sp, 0x64\n\ - mov r0, sp\n\ - movs r1, 0x19\n\ - bl SetMonData\n\ - mov r0, sp\n\ - bl sub_804151C\n\ -_080415D8:\n\ - ldr r0, _08041644 @ =gPlayerParty\n\ - movs r1, 0xFA\n\ - lsls r1, 1\n\ - adds r1, r0\n\ - mov r8, r1\n\ - mov r0, r8\n\ - mov r1, sp\n\ - movs r2, 0x64\n\ - bl memcpy\n\ - lsls r0, r4, 3\n\ - subs r0, r4\n\ - lsls r1, r0, 3\n\ - adds r0, r5, r1\n\ - adds r0, 0xC0\n\ - ldrh r0, [r0]\n\ - cmp r0, 0\n\ - beq _08041610\n\ - adds r4, r1, 0\n\ - adds r4, 0xA0\n\ - adds r4, r5, r4\n\ - mov r0, r8\n\ - adds r1, r4, 0\n\ - bl GiveMailToMon2\n\ - adds r0, r4, 0\n\ - bl sub_80417F4\n\ -_08041610:\n\ - bl party_compaction\n\ - adds r0, r6, 0\n\ - bl ZeroBoxMonData\n\ - movs r2, 0x88\n\ - lsls r2, 1\n\ - adds r0, r5, r2\n\ - adds r0, r7\n\ - movs r1, 0\n\ - str r1, [r0]\n\ - adds r0, r5, 0\n\ - bl sub_80414C0\n\ - bl CalculatePlayerPartyCount\n\ - mov r0, r9\n\ - add sp, 0x68\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_08041640: .4byte gStringVar1\n\ -_08041644: .4byte gPlayerParty\n\ - .syntax divided"); -} - -extern u8 gSpecialVar_0x8004; - -u16 sub_8041648() -{ - return sub_8041570(gSaveBlock1.daycareData, gSpecialVar_0x8004); -} - -u8 Daycare_GetLevelAfterSteps(struct BoxPokemon * mon, u32 steps){ - struct BoxPokemon temp = *mon; - u32 new_exp = GetBoxMonData(mon, MON_DATA_EXP) + steps; - SetBoxMonData(&temp, MON_DATA_EXP, (u8 *) &new_exp); - return GetLevelFromBoxMonExp(&temp); -} diff --git a/src/de_rom_8040FE0.c b/src/de_rom_8040FE0.c index eebcc1437..8cf510d6f 100644 --- a/src/de_rom_8040FE0.c +++ b/src/de_rom_8040FE0.c @@ -1,5 +1,6 @@ #include "global.h" #include "battle.h" +#include "battle_tower.h" #if GERMAN @@ -59,7 +60,6 @@ u8 *de_sub_804100C(u8 gender) { u8 de_sub_81364AC(void); u8 get_trainer_class_name_index(void); u8 de_sub_81364F8(void); -u8 sub_8135FD8(void); u8 *de_sub_8041024(s32 arg0, u32 arg1) { u8 nameIndex, trainerClass, gender; @@ -94,7 +94,7 @@ u8 *de_sub_8041024(s32 arg0, u32 arg1) { case 0x800: trainerClass = de_sub_81364F8(); - nameIndex = sub_8135FD8(); + nameIndex = GetEReaderTrainerClassNameIndex(); if (trainerClass == TRAINER_CLASS_SCHOOL_KID_F) { return de_sub_8040FE0(FEMALE); @@ -196,7 +196,7 @@ _08041086:\n\ bl de_sub_81364F8\n\ lsls r0, 24\n\ lsrs r4, r0, 24\n\ - bl sub_8135FD8\n\ + bl GetEReaderTrainerClassNameIndex\n\ b _08041070\n\ _08041094:\n\ movs r0, 0x1\n\ diff --git a/src/matsuda_debug_menu.c b/src/debug/matsuda_debug_menu.c index c7d81f502..d0c0f95f7 100644 --- a/src/matsuda_debug_menu.c +++ b/src/debug/matsuda_debug_menu.c @@ -516,10 +516,10 @@ void SetDebugMonForContest(void) SetMonData(&gPlayerParty[0], MON_DATA_SMART, &gContestMons[gContestPlayerMonIndex].smart); SetMonData(&gPlayerParty[0], MON_DATA_TOUGH, &gContestMons[gContestPlayerMonIndex].tough); SetMonData(&gPlayerParty[0], MON_DATA_SHEEN, &gContestMons[gContestPlayerMonIndex].sheen); - SetMonData(&gPlayerParty[0], MON_DATA_MOVE1, (const u8 *) &gContestMons[gContestPlayerMonIndex].moves[0]); - SetMonData(&gPlayerParty[0], MON_DATA_MOVE2, (const u8 *) &gContestMons[gContestPlayerMonIndex].moves[1]); - SetMonData(&gPlayerParty[0], MON_DATA_MOVE3, (const u8 *) &gContestMons[gContestPlayerMonIndex].moves[2]); - SetMonData(&gPlayerParty[0], MON_DATA_MOVE4, (const u8 *) &gContestMons[gContestPlayerMonIndex].moves[3]); + SetMonData(&gPlayerParty[0], MON_DATA_MOVE1, &gContestMons[gContestPlayerMonIndex].moves[0]); + SetMonData(&gPlayerParty[0], MON_DATA_MOVE2, &gContestMons[gContestPlayerMonIndex].moves[1]); + SetMonData(&gPlayerParty[0], MON_DATA_MOVE3, &gContestMons[gContestPlayerMonIndex].moves[2]); + SetMonData(&gPlayerParty[0], MON_DATA_MOVE4, &gContestMons[gContestPlayerMonIndex].moves[3]); } void sub_80AA754(struct Sprite *sprite) diff --git a/src/mori_debug_menu.c b/src/debug/mori_debug_menu.c index 4eadaa78b..1595ecd2e 100644 --- a/src/mori_debug_menu.c +++ b/src/debug/mori_debug_menu.c @@ -52,7 +52,7 @@ u8 MoriDebugMenu_SearchChild(u8 a1, u8 a2, u8 *ptr) u16 monData; u16 var; - monData = GetMonData(gPlayerParty, 11, ptr); + monData = GetMonData(gPlayerParty, MON_DATA_SPECIES, ptr); var = sub_8041870(monData); StringCopy(localPtr, gSpeciesNames[monData]); StringAppend(localPtr, gUnknown_0839B24D); @@ -67,7 +67,7 @@ u8 MoriDebugMenu_SearchChild(u8 a1, u8 a2, u8 *ptr) s8 MoriDebugMenu_Egg(void) { - if ( Daycare_CountPokemon(gSaveBlock1.daycareData) == 2 && daycare_relationship_score_from_savegame() ) + if ( Daycare_CountPokemon(&gSaveBlock1.daycareData) == 2 && daycare_relationship_score_from_savegame() ) sub_8041940(); CloseMenu(); @@ -76,7 +76,7 @@ s8 MoriDebugMenu_Egg(void) s8 MoriDebugMenu_MaleEgg(void) { - if ( Daycare_CountPokemon(gSaveBlock1.daycareData) == 2 && daycare_relationship_score_from_savegame() ) + if ( Daycare_CountPokemon(&gSaveBlock1.daycareData) == 2 && daycare_relationship_score_from_savegame() ) sub_8041950(); CloseMenu(); @@ -117,7 +117,7 @@ s8 MoriDebugMenu_BreedEgg(void) SetMonData(&gPlayerParty[loopCounter], MON_DATA_FRIENDSHIP, &friendship); } } - gSaveBlock1.filler_30B6 = -3; + gSaveBlock1.daycareData.misc.countersEtc.unk_11a = -3; CloseMenu(); return 1; } diff --git a/src/debug/sound_check_menu.c b/src/debug/sound_check_menu.c new file mode 100644 index 000000000..14261b75e --- /dev/null +++ b/src/debug/sound_check_menu.c @@ -0,0 +1,1300 @@ +#include "global.h" +#include "sprite.h" +#include "palette.h" +#include "task.h" +#include "m4a.h" +#include "main.h" +#include "text.h" +#include "menu.h" +#include "songs.h" +#include "title_screen.h" +#include "sound.h" +#include "pokedex_cry_screen.h" + +// local task defines +#define tWindowSelected data[0] +#define tBgmIndex data[1] +#define tSeIndex data[2] + +// window selections +enum +{ + BGM_WINDOW, + SE_WINDOW +}; + +// driver test cry enums +enum +{ + CRY_TEST_VOICE, + CRY_TEST_VOLUME, + CRY_TEST_PANPOT, + CRY_TEST_PITCH, + CRY_TEST_LENGTH, + CRY_TEST_RELEASE, + CRY_TEST_PROGRESS, + CRY_TEST_CHORUS, + CRY_TEST_PRIORITY +}; + +// minmax range enums +enum +{ + MIN, + MAX +}; + +extern struct ToneData voicegroup_84537C0[]; +extern struct ToneData voicegroup_8452590[]; +extern struct ToneData voicegroup_8453DC0[]; +extern struct ToneData voicegroup_8452B90[]; +extern struct ToneData voicegroup_84543C0[]; +extern struct ToneData voicegroup_8453190[]; +extern struct ToneData voicegroup_84549C0[]; +extern struct ToneData voicegroup_8453790[]; + +static EWRAM_DATA u8 gUnknown_020387B0 = 0; +static EWRAM_DATA u8 gUnknown_020387B1 = 0; +static EWRAM_DATA u8 gUnknown_020387B2 = 0; +static EWRAM_DATA s8 sDriverTestSelection = 0; +static EWRAM_DATA int sSoundTestParams[9] = {0}; +static EWRAM_DATA u8 gUnknown_020387D8 = 0; +static EWRAM_DATA u8 gUnknown_020387D9 = 0; + +u16 gSoundTestCryNum; +extern u8 gUnknown_03005E98; + +struct MusicPlayerInfo *gUnknown_03005D30; + +extern struct MusicPlayerInfo gMPlay_BGM; + +void Task_InitSoundCheckMenu(u8); +void sub_80BA384(u8); +void sub_80BA65C(u8); +void sub_80BA68C(u8); +void HighlightSelectedWindow(u8); +void PrintSoundNumber(u16, u16, u16); +void sub_80BA79C(const u8 *const, u16, u16); +void Task_DrawDriverTestMenu(u8); +void Task_ProcessDriverTestInput(u8); +void AdjustSelectedDriverParam(s8); +void PrintDriverTestMenuText(void); +void sub_80BAE10(u8, u8); +void PrintSignedNumber(int, u16, u16, u8); +void sub_80BAF84(u8); +void sub_80BB038(u8); +void sub_80BB1D4(void); +void Task_InitCryTest(u8); +void Task_ProcessCryTestInput(u8); +void PrintCryNumber(void); + +void CB2_SoundCheckMenu(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void VBlankCB_SoundCheckMenu(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + + if (gUnknown_020387B0 != 0) + { + m4aSoundMain(); + m4aSoundMain(); + m4aSoundMain(); + } +} + +// unused +void CB2_StartSoundCheckMenu(void) +{ + u8 taskId; + + SetVBlankCallback(NULL); + REG_DISPCNT = 0; + REG_BG2CNT = 0; + REG_BG1CNT = 0; + REG_BG0CNT = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + DmaFill16(3, 0, VRAM, VRAM_SIZE); + DmaFill32(3, 0, OAM, OAM_SIZE); + DmaFill16(3, 0, PLTT, PLTT_SIZE); + ResetPaletteFade(); + ResetTasks(); + ResetSpriteData(); + SetUpWindowConfig(&gWindowConfig_81E6C3C); + InitMenuWindow(&gWindowConfig_81E6CE4); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + REG_WIN0H = WIN_RANGE(0, 0); + REG_WIN0V = WIN_RANGE(0, 0); + REG_WIN1H = WIN_RANGE(0, 0); + REG_WIN1V = WIN_RANGE(0, 0); + REG_WININ = 0x1111; + REG_WINOUT = 0x31; + REG_BLDCNT = 0xE1; + REG_BLDALPHA = 0; + REG_BLDY = 7; + REG_IE = 1; // could be a typo of REG_IME + REG_IE |= 1; + REG_DISPSTAT |= 8; + SetVBlankCallback(VBlankCB_SoundCheckMenu); + SetMainCallback2(CB2_SoundCheckMenu); + REG_DISPCNT = 0x7140; + taskId = CreateTask(Task_InitSoundCheckMenu, 0); + gTasks[taskId].tWindowSelected = BGM_WINDOW; + gTasks[taskId].tBgmIndex = 0; + gTasks[taskId].tSeIndex = 0; + gTasks[taskId].data[3] = 0; + gUnknown_020387B0 = 0; + gTasks[taskId].data[3] = 0; // why? + m4aSoundInit(); +} + +void Task_InitSoundCheckMenu(u8 taskId) +{ + u8 soundcheckStr[] = _("サウンドチェック"); + u8 bgmStr[] = _("BGM"); + u8 seStr[] = _("SE "); + u8 abDescStr[] = _("A‥さいせい B‥おわり"); + u8 upDownStr[] = _("L‥UP R‥DOWN"); + u8 driverStr[] = _("R‥DRIVER-TEST"); + + if (!gPaletteFade.active) + { + MenuDrawTextWindow(2, 0, 27, 3); + MenuDrawTextWindow(2, 5, 27, 10); + MenuDrawTextWindow(2, 12, 27, 17); + MenuPrint(soundcheckStr, 4, 1); + MenuPrint(abDescStr, 14, 1); + MenuPrint(bgmStr, 4, 6); + MenuPrint(upDownStr, 14, 6); + MenuPrint(seStr, 4, 13); + MenuPrint(upDownStr, 14, 13); + MenuPrint(driverStr, 14, 18); + gTasks[taskId].func = sub_80BA384; + REG_WIN0H = WIN_RANGE(17, 223); + REG_WIN0V = WIN_RANGE(1, 31); + } +} + +// ideally this should be a multi Coords8 struct, but it wont match when its treated like a struct. +static const u8 gUnknown_083D0300[] = { 1, 1, 1, 3, 1, 5, 1, 7, 1, 9, 1, 11, 1, 13, 1, 15, 1, 17 }; + +extern const u8 *const gBGMNames[]; +extern const u8 *const gSENames[]; + +void sub_80BA384(u8 taskId) // Task_HandleDrawingSoundCheckMenuText +{ + HighlightSelectedWindow(gTasks[taskId].tWindowSelected); + PrintSoundNumber(gTasks[taskId].tBgmIndex + BGM_STOP, 7, 8); // print by BGM index + sub_80BA79C(gBGMNames[gTasks[taskId].tBgmIndex], 11, 8); + PrintSoundNumber(gTasks[taskId].tSeIndex, 7, 15); + sub_80BA79C(gSENames[gTasks[taskId].tSeIndex], 11, 15); + gTasks[taskId].func = sub_80BA65C; +} + +bool8 Task_ProcessSoundCheckMenuInput(u8 taskId) +{ + if (gMain.newKeys & R_BUTTON) // driver test + { + gTasks[taskId].func = Task_DrawDriverTestMenu; + } + else if (gMain.newKeys & L_BUTTON) + { + gTasks[taskId].func = sub_80BAF84; + } + else if (gMain.newKeys & START_BUTTON) + { + gTasks[taskId].func = Task_InitCryTest; + } + else if (gMain.newKeys & A_BUTTON) + { + if (gTasks[taskId].tWindowSelected != 0) // is playing? + { + if (gTasks[taskId].data[4] != 0) + { + if (gTasks[taskId].tSeIndex != 0) + { + m4aSongNumStop(gTasks[taskId].data[4]); + m4aSongNumStart(gTasks[taskId].tSeIndex); + gTasks[taskId].data[4] = gTasks[taskId].tSeIndex; + } + else + { + m4aSongNumStop(gTasks[taskId].data[4]); + gTasks[taskId].data[4] = 0; + } + } + else if (gTasks[taskId].tSeIndex != 0) + { + m4aSongNumStart(gTasks[taskId].tSeIndex); + gTasks[taskId].data[4] = gTasks[taskId].tSeIndex; + } + } + else + { + if (gTasks[taskId].data[3] != 0) + { + if (gTasks[taskId].tBgmIndex != 0) + { + m4aSongNumStop(gTasks[taskId].data[3] + BGM_STOP); + m4aSongNumStart(gTasks[taskId].tBgmIndex + BGM_STOP); + gTasks[taskId].data[3] = gTasks[taskId].tBgmIndex; + } + else + { + m4aSongNumStop(gTasks[taskId].data[3] + BGM_STOP); + gTasks[taskId].data[3] = 0; + } + } + else if (gTasks[taskId].tBgmIndex != 0) + { + m4aSongNumStart(gTasks[taskId].tBgmIndex + BGM_STOP); + gTasks[taskId].data[3] = gTasks[taskId].tBgmIndex; + } + } + } + else if (gMain.newKeys & B_BUTTON) + { + m4aSongNumStart(SE_SELECT); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = sub_80BA68C; + } + else if (gMain.newAndRepeatedKeys & DPAD_UP) + { + gTasks[taskId].tWindowSelected ^= 1; + return TRUE; + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + gTasks[taskId].tWindowSelected ^= 1; + return TRUE; + } + else if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + { + if (gTasks[taskId].tWindowSelected != 0) + { + if (gTasks[taskId].tSeIndex > 0) + gTasks[taskId].tSeIndex--; + else + gTasks[taskId].tSeIndex = 247; + } + else + { + if (gTasks[taskId].tBgmIndex > 0) + gTasks[taskId].tBgmIndex--; + else + gTasks[taskId].tBgmIndex = 117; + } + return TRUE; + } + else if (gMain.newAndRepeatedKeys & DPAD_LEFT) + { + if (gTasks[taskId].tWindowSelected != 0) + { + if (gTasks[taskId].tSeIndex < 247) + gTasks[taskId].tSeIndex++; + else + gTasks[taskId].tSeIndex = 0; + } + else + { + if (gTasks[taskId].tBgmIndex < 117) + gTasks[taskId].tBgmIndex++; + else + gTasks[taskId].tBgmIndex = 0; + } + return TRUE; + } + else if (gMain.heldKeys & SELECT_BUTTON) + { + gUnknown_020387B0 = 1; + } + else + { + gUnknown_020387B0 = 0; + } + return FALSE; +} + +void sub_80BA65C(u8 taskId) +{ + if (Task_ProcessSoundCheckMenuInput(taskId) != FALSE) + gTasks[taskId].func = sub_80BA384; +} + +void sub_80BA68C(u8 taskId) +{ + if (!gPaletteFade.active) + { + DestroyTask(taskId); + SetMainCallback2(CB2_InitTitleScreen); + } +} + +void HighlightSelectedWindow(u8 windowType) +{ + switch (windowType) + { + case BGM_WINDOW: + default: + REG_WIN1H = WIN_RANGE(17, 223); + REG_WIN1V = WIN_RANGE(41, 87); + break; + case SE_WINDOW: + REG_WIN1H = WIN_RANGE(17, 223); + REG_WIN1V = WIN_RANGE(97, 143); + break; + } +} + +void PrintSoundNumber(u16 soundIndex, u16 x, u16 y) // PrintSoundNumber ? +{ + u8 i; + u8 str[5]; + bool8 someBool; + u8 divisorValue; + + for (i = 0; i < 3; i++) + str[i] = 0; // initialize array + + str[3] = CHAR_ELLIPSIS; + str[4] = EOS; + someBool = FALSE; + + divisorValue = soundIndex / 100; + if (divisorValue) + { + str[0] = divisorValue + CHAR_0; + someBool = TRUE; + } + + divisorValue = (soundIndex % 100) / 10; + if (divisorValue || someBool) + str[1] = divisorValue + CHAR_0; + + str[2] = ((soundIndex % 100) % 10) + CHAR_0; + MenuPrint(str, x, y); +} + +void sub_80BA79C(const u8 *const string, u16 x, u16 y) +{ + u8 i; + u8 str[11]; + + for (i = 0; i <= 10; i++) + str[i] = 0; // format string. + + str[10] = EOS; // the above for loop formats the last element of the array unnecessarily. + + for (i = 0; string[i] != EOS && i < 10; i++) + str[i] = string[i]; + + MenuPrint(str, x, y); +} + +void Task_DrawDriverTestMenu(u8 taskId) // Task_DrawDriverTestMenu +{ + u8 bbackStr[] = _("Bぼたんで もどる"); + u8 aplayStr[] = _("Aぼたんで さいせい"); + u8 voiceStr[] = _("VOICE‥‥‥‥"); + u8 volumeStr[] = _("VOLUME‥‥‥"); + u8 panpotStr[] = _("PANPOT‥‥‥"); + u8 pitchStr[] = _("PITCH‥‥‥‥"); + u8 lengthStr[] = _("LENGTH‥‥‥"); + u8 releaseStr[] = _("RELEASE‥‥"); + u8 progressStr[] = _("PROGRESS‥"); + u8 chorusStr[] = _("CHORUS‥‥‥"); + u8 priorityStr[] = _("PRIORITY‥"); + u8 playingStr[] = _("さいせいちゆう‥"); // 再生中 (playing) + u8 reverseStr[] = _("はんてん‥‥‥‥"); // 反転 (reverse) + u8 stereoStr[] = _("すてれお‥‥‥‥"); // stereo + + REG_DISPCNT = 0x3140; + MenuDrawTextWindow(0, 0, 29, 19); + MenuPrint(bbackStr, 19, 4); + MenuPrint(aplayStr, 19, 2); + MenuPrint(voiceStr, 2, 1); + MenuPrint(volumeStr, 2, 3); + MenuPrint(panpotStr, 2, 5); + MenuPrint(pitchStr, 2, 7); + MenuPrint(lengthStr, 2, 9); + MenuPrint(releaseStr, 2, 11); + MenuPrint(progressStr, 2, 13); + MenuPrint(chorusStr, 2, 15); + MenuPrint(priorityStr, 2, 17); + MenuPrint(playingStr, 19, 16); + MenuPrint(reverseStr, 19, 14); + MenuPrint(stereoStr, 19, 12); + REG_WIN0H = WIN_RANGE(0, DISPLAY_WIDTH); + REG_WIN0V = WIN_RANGE(0, DISPLAY_HEIGHT); + sDriverTestSelection = 0; + gUnknown_020387B1 = 0; + gUnknown_020387B2 = 0; + gUnknown_03005D30 = NULL; + gUnknown_020387D8 = 0; + gUnknown_020387D9 = 1; + sSoundTestParams[CRY_TEST_VOICE] = 0; + sSoundTestParams[CRY_TEST_VOLUME] = 120; + sSoundTestParams[CRY_TEST_PANPOT] = 0; + sSoundTestParams[CRY_TEST_PITCH] = 15360; + sSoundTestParams[CRY_TEST_LENGTH] = 180; + sSoundTestParams[CRY_TEST_PROGRESS] = 0; + sSoundTestParams[CRY_TEST_RELEASE] = 0; + sSoundTestParams[CRY_TEST_CHORUS] = 0; + sSoundTestParams[CRY_TEST_PRIORITY] = 2; + PrintDriverTestMenuText(); + sub_80BAE10(0, 0); + gTasks[taskId].func = Task_ProcessDriverTestInput; +} + +void Task_ProcessDriverTestInput(u8 taskId) +{ + if (gMain.newKeys & B_BUTTON) + { + REG_DISPCNT = 0x7140; + REG_WIN0H = WIN_RANGE(17, 223); + REG_WIN0V = WIN_RANGE(1, 31); + MenuZeroFillWindowRect(0, 0, 29, 19); + gTasks[taskId].func = Task_InitSoundCheckMenu; + return; + } + if (gMain.newAndRepeatedKeys & DPAD_UP) // _080BAAA8 + { + u8 old = sDriverTestSelection; + + if(--sDriverTestSelection < 0) + sDriverTestSelection = 8; + sub_80BAE10(old, sDriverTestSelection); + return; + } + if (gMain.newAndRepeatedKeys & DPAD_DOWN) // _080BAAD0 + { + u8 old = sDriverTestSelection; + + if(++sDriverTestSelection > 8) + sDriverTestSelection = 0; + sub_80BAE10(old, sDriverTestSelection); + return; + } + if (gMain.newKeys & START_BUTTON) // _080BAAF8 + { + gUnknown_020387D8 ^= 1; + PrintDriverTestMenuText(); + return; + } + if (gMain.newKeys & SELECT_BUTTON) // _080BAB14 + { + gUnknown_020387D9 ^= 1; + PrintDriverTestMenuText(); + SetPokemonCryStereo(gUnknown_020387D9); + return; + } + if (gMain.newAndRepeatedKeys & R_BUTTON) // _080BAB38 + { + AdjustSelectedDriverParam(10); + PrintDriverTestMenuText(); + return; + } + if (gMain.newAndRepeatedKeys & L_BUTTON) // _080BAB46 + { + AdjustSelectedDriverParam(-10); + PrintDriverTestMenuText(); + return; + } + if (gMain.newAndRepeatedKeys & DPAD_LEFT) // _080BAB56 + { + AdjustSelectedDriverParam(-1); + PrintDriverTestMenuText(); + return; + } + if (gMain.newAndRepeatedKeys & DPAD_RIGHT) // _080BAB64 + { + AdjustSelectedDriverParam(1); + PrintDriverTestMenuText(); + return; + } + if (gMain.newKeys & A_BUTTON) // _080BAB78 + { + u8 divide, remaining; + + SetPokemonCryVolume(sSoundTestParams[CRY_TEST_VOLUME]); + SetPokemonCryPanpot(sSoundTestParams[CRY_TEST_PANPOT]); + SetPokemonCryPitch(sSoundTestParams[CRY_TEST_PITCH]); + SetPokemonCryLength(sSoundTestParams[CRY_TEST_LENGTH]); + SetPokemonCryProgress(sSoundTestParams[CRY_TEST_PROGRESS]); + SetPokemonCryRelease(sSoundTestParams[CRY_TEST_RELEASE]); + SetPokemonCryChorus(sSoundTestParams[CRY_TEST_CHORUS]); + SetPokemonCryPriority(sSoundTestParams[CRY_TEST_PRIORITY]); + + remaining = sSoundTestParams[CRY_TEST_VOICE] % 128; + divide = sSoundTestParams[CRY_TEST_VOICE] / 128; + + switch (divide) + { + case 0: + if (gUnknown_020387D8) + gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_84537C0[remaining]); + else + gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8452590[remaining]); + break; + case 1: + if (gUnknown_020387D8) + gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8453DC0[remaining]); + else + gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8452B90[remaining]); + break; + case 2: + if (gUnknown_020387D8) + gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_84543C0[remaining]); + else + gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8453190[remaining]); + break; + case 3: + if (gUnknown_020387D8) + gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_84549C0[remaining]); + else + gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8453790[remaining]); + break; + } + } + + // _080BACA2 + if (gUnknown_03005D30 != NULL) + { + gUnknown_020387B1 = IsPokemonCryPlaying(gUnknown_03005D30); + + if (gUnknown_020387B1 != gUnknown_020387B2) + PrintDriverTestMenuText(); + + gUnknown_020387B2 = gUnknown_020387B1; + } +} + +void AdjustSelectedDriverParam(s8 delta) +{ + // also ideally should be a MinMax struct, but any attempt to make this into a struct causes it to not match due to the weird multi dim access. + int paramRanges[] = + { + 0, 387, // Voice + 0, 127, // Volume + -127, 127, // Panpot + -128, 32639, // Pitch + 0, 65535, // Length + 0, 255, // Release + 0, 65535, // Progress + -64, 63 // Chorus + // Priority??? Why is it missing? + }; + + sSoundTestParams[sDriverTestSelection] += delta; + + if (sSoundTestParams[sDriverTestSelection] > paramRanges[MULTI_DIM_ARR(sDriverTestSelection, B_16, MAX)]) + sSoundTestParams[sDriverTestSelection] = paramRanges[MULTI_DIM_ARR(sDriverTestSelection, B_16, MIN)]; + + if (sSoundTestParams[sDriverTestSelection] < paramRanges[MULTI_DIM_ARR(sDriverTestSelection, B_16, MIN)]) + sSoundTestParams[sDriverTestSelection] = paramRanges[MULTI_DIM_ARR(sDriverTestSelection, B_16, MAX)]; +} + +void PrintDriverTestMenuText(void) +{ + PrintSignedNumber(sSoundTestParams[CRY_TEST_VOICE] + 1, 11, 1, 5); + PrintSignedNumber(sSoundTestParams[CRY_TEST_VOLUME], 11, 3, 5); + PrintSignedNumber(sSoundTestParams[CRY_TEST_PANPOT], 11, 5, 5); + PrintSignedNumber(sSoundTestParams[CRY_TEST_PITCH], 11, 7, 5); + PrintSignedNumber(sSoundTestParams[CRY_TEST_LENGTH], 11, 9, 5); + PrintSignedNumber(sSoundTestParams[CRY_TEST_RELEASE], 11, 11, 5); + PrintSignedNumber(sSoundTestParams[CRY_TEST_PROGRESS], 11, 13, 5); + PrintSignedNumber(sSoundTestParams[CRY_TEST_CHORUS], 11, 15, 5); + PrintSignedNumber(sSoundTestParams[CRY_TEST_PRIORITY], 11, 17, 5); + PrintSignedNumber(gUnknown_020387B1, 27, 16, 1); + PrintSignedNumber(gUnknown_020387D8, 27, 14, 1); + PrintSignedNumber(gUnknown_020387D9, 27, 12, 1); +} + +void sub_80BAE10(u8 var1, u8 var2) +{ + u8 str1[] = _("▶"); + u8 str2[] = _(" "); + + MenuPrint(str2, gUnknown_083D0300[MULTI_DIM_ARR(var1, B_16, 0)], gUnknown_083D0300[MULTI_DIM_ARR(var1, B_16, 1)]); + MenuPrint(str1, gUnknown_083D0300[MULTI_DIM_ARR(var2, B_16, 0)], gUnknown_083D0300[MULTI_DIM_ARR(var2, B_16, 1)]); +} + +void PrintSignedNumber(int n, u16 x, u16 y, u8 digits) +{ + int powersOfTen[6] = + { + 1, + 10, + 100, + 1000, + 10000, + 100000 + }; + u8 str[8]; + s8 i; + s8 negative; + s8 someVar2; + + for (i = 0; i <= digits; i++) + str[i] = CHAR_SPACE; + str[digits + 1] = EOS; + + negative = FALSE; + if (n < 0) + { + n = -n; + negative = TRUE; + } + + if (digits == 1) + someVar2 = TRUE; + else + someVar2 = FALSE; + + for (i = digits - 1; i >= 0; i--) + { + s8 d = n / powersOfTen[i]; + + if (d != 0 || someVar2 || i == 0) + { + if (negative && !someVar2) + str[digits - i - 1] = CHAR_HYPHEN; + str[digits - i] = CHAR_0 + d; + someVar2 = TRUE; + } + n %= powersOfTen[i]; + } + + MenuPrint(str, x, y); +} + +static const s8 gUnknown_083D03F8[5] = { 0x3F, 0x00, 0xC0, 0x7F, 0x80 }; + +void sub_80BAF84(u8 taskId) +{ + u8 seStr[] = _("SE"); + u8 panStr[] = _("PAN"); + u8 playingStr[] = _("さいせいちゆう‥"); + + REG_DISPCNT = 0x3140; + MenuDrawTextWindow(0, 0, 29, 19); + MenuPrint(seStr, 3, 2); + MenuPrint(panStr, 3, 4); + MenuPrint(playingStr, 3, 8); + REG_WIN0H = WIN_RANGE(0, DISPLAY_WIDTH); + REG_WIN0V = WIN_RANGE(0, DISPLAY_HEIGHT); + sSoundTestParams[CRY_TEST_VOICE] = 1; + sSoundTestParams[CRY_TEST_PANPOT] = 0; + sSoundTestParams[CRY_TEST_CHORUS] = 0; + sSoundTestParams[CRY_TEST_PROGRESS] = 0; + sSoundTestParams[CRY_TEST_RELEASE] = 0; + sub_80BB1D4(); + gTasks[taskId].func = sub_80BB038; +} + +void sub_80BB038(u8 taskId) +{ + sub_80BB1D4(); + if (sSoundTestParams[CRY_TEST_PROGRESS]) + { + if (sSoundTestParams[CRY_TEST_RELEASE]) + { + sSoundTestParams[CRY_TEST_RELEASE]--; + } + else // _080BB05C + { + s8 panpot = gUnknown_083D03F8[sSoundTestParams[CRY_TEST_PANPOT]]; + if (panpot != -128) + { + if (panpot == 127) + { + sSoundTestParams[CRY_TEST_CHORUS] += 2; + if (sSoundTestParams[CRY_TEST_CHORUS] < 63) + SE12PanpotControl(sSoundTestParams[CRY_TEST_CHORUS]); + } + } + else // _080BB08C + { + sSoundTestParams[CRY_TEST_CHORUS] -= 2; + if (sSoundTestParams[CRY_TEST_CHORUS] > -64) + SE12PanpotControl(sSoundTestParams[CRY_TEST_CHORUS]); + } + } + } + // _080BB0A2 + if (gMain.newKeys & B_BUTTON) + { + REG_DISPCNT = 0x7140; + REG_WIN0H = WIN_RANGE(17, 223); + REG_WIN0V = WIN_RANGE(1, 31); + MenuZeroFillWindowRect(0, 0, 29, 19); + gTasks[taskId].func = Task_InitSoundCheckMenu; + return; + } + if (gMain.newKeys & A_BUTTON) // _080BB104 + { + s8 panpot = gUnknown_083D03F8[sSoundTestParams[CRY_TEST_PANPOT]]; + if (panpot != -128) + { + if (panpot == 127) + { + PlaySE12WithPanning(sSoundTestParams[CRY_TEST_VOICE], -64); + sSoundTestParams[CRY_TEST_CHORUS] = -64; + sSoundTestParams[CRY_TEST_PROGRESS] = 1; + sSoundTestParams[CRY_TEST_RELEASE] = 30; + return; + } + } + else // _080BB140 + { + PlaySE12WithPanning(sSoundTestParams[CRY_TEST_VOICE], 63); + sSoundTestParams[CRY_TEST_CHORUS] = 63; + sSoundTestParams[CRY_TEST_PROGRESS] = 1; + sSoundTestParams[CRY_TEST_RELEASE] = 30; + return; + } + // _080BB154 + PlaySE12WithPanning(sSoundTestParams[CRY_TEST_VOICE], panpot); + sSoundTestParams[CRY_TEST_PROGRESS] = 0; + return; + } + if (gMain.newKeys & L_BUTTON) // _080BB15E + { + sSoundTestParams[CRY_TEST_PANPOT]++; + if (sSoundTestParams[CRY_TEST_PANPOT] > 4) + sSoundTestParams[CRY_TEST_PANPOT] = 0; + } + if (gMain.newKeys & R_BUTTON) // _080BB176 + { + sSoundTestParams[CRY_TEST_PANPOT]--; + if (sSoundTestParams[CRY_TEST_PANPOT] < 0) + sSoundTestParams[CRY_TEST_PANPOT] = 4; + } + if (gMain.newAndRepeatedKeys & DPAD_RIGHT) // _080BB192 + { + sSoundTestParams[CRY_TEST_VOICE]++; + if (sSoundTestParams[CRY_TEST_VOICE] > 247) + sSoundTestParams[CRY_TEST_VOICE] = 0; + } + else if (gMain.newAndRepeatedKeys & DPAD_LEFT) // _080BB1B0 + { + sSoundTestParams[CRY_TEST_VOICE]--; + if (sSoundTestParams[CRY_TEST_VOICE] < 0) + sSoundTestParams[CRY_TEST_VOICE] = 247; + } +} + +void sub_80BB1D4(void) +{ + u8 lrStr[] = _(" LR"); + u8 rlStr[] = _(" RL"); + + PrintSignedNumber(sSoundTestParams[CRY_TEST_VOICE], 7, 2, 3); + + switch (gUnknown_083D03F8[sSoundTestParams[CRY_TEST_PANPOT]]) + { + case 127: + MenuPrint(lrStr, 7, 4); + break; + case -128: + MenuPrint(rlStr, 7, 4); + break; + default: + PrintSignedNumber(gUnknown_083D03F8[sSoundTestParams[CRY_TEST_PANPOT]], 7, 4, 3); + break; + } + PrintSignedNumber(IsSEPlaying(), 12, 8, 1); +} + +#define SOUND_LIST_BGM \ + X(BGM_STOP, "STOP") \ + X(BGM_TETSUJI, "TETSUJI") \ + X(BGM_FIELD13, "FIELD13") \ + X(BGM_KACHI22, "KACHI22") \ + X(BGM_KACHI2, "KACHI2") \ + X(BGM_KACHI3, "KACHI3") \ + X(BGM_KACHI5, "KACHI5") \ + X(BGM_PCC, "PCC") \ + X(BGM_NIBI, "NIBI") \ + X(BGM_SUIKUN, "SUIKUN") \ + X(BGM_DOORO1, "DOORO1") \ + X(BGM_DOORO_X1, "DOORO-X1") \ + X(BGM_DOORO_X3, "DOORO-X3") \ + X(BGM_MACHI_S2, "MACHI-S2") \ + X(BGM_MACHI_S4, "MACHI-S4") \ + X(BGM_GIM, "GIM") \ + X(BGM_NAMINORI, "NAMINORI") \ + X(BGM_DAN01, "DAN01") \ + X(BGM_FANFA1, "FANFA1") \ + X(BGM_ME_ASA, "ME-ASA") \ + X(BGM_ME_BACHI, "ME-BACHI") \ + X(BGM_FANFA4, "FANFA4") \ + X(BGM_FANFA5, "FANFA5") \ + X(BGM_ME_WAZA, "ME-WAZA") \ + X(BGM_BIJYUTU, "BIJYUTU") \ + X(BGM_DOORO_X4, "DOORO-X4") \ + X(BGM_FUNE_KAN, "FUNE-KAN") \ + X(BGM_ME_SHINKA, "ME-SHINKA") \ + X(BGM_SHINKA, "SHINKA") \ + X(BGM_ME_WASURE, "ME-WASURE") \ + X(BGM_SYOUJOEYE, "SYOUJOEYE") \ + X(BGM_BOYEYE, "BOYEYE") \ + X(BGM_DAN02, "DAN02") \ + X(BGM_MACHI_S3, "MACHI-S3") \ + X(BGM_ODAMAKI, "ODAMAKI") \ + X(BGM_B_TOWER, "B-TOWER") \ + X(BGM_SWIMEYE, "SWIMEYE") \ + X(BGM_DAN03, "DAN03") \ + X(BGM_ME_KINOMI, "ME-KINOMI") \ + X(BGM_ME_TAMA, "ME-TAMA") \ + X(BGM_ME_B_BIG, "ME-B-BIG") \ + X(BGM_ME_B_SMALL, "ME-B-SMALL") \ + X(BGM_ME_ZANNEN, "ME-ZANNEN") \ + X(BGM_BD_TIME, "BD-TIME") \ + X(BGM_TEST1, "TEST1") \ + X(BGM_TEST2, "TEST2") \ + X(BGM_TEST3, "TEST3") \ + X(BGM_TEST4, "TEST4") \ + X(BGM_TEST, "TEST") \ + X(BGM_GOMACHI0, "GOMACHI0") \ + X(BGM_GOTOWN, "GOTOWN") \ + X(BGM_POKECEN, "POKECEN") \ + X(BGM_NEXTROAD, "NEXTROAD") \ + X(BGM_GRANROAD, "GRANROAD") \ + X(BGM_CYCLING, "CYCLING") \ + X(BGM_FRIENDLY, "FRIENDLY") \ + X(BGM_MISHIRO, "MISHIRO") \ + X(BGM_TOZAN, "TOZAN") \ + X(BGM_GIRLEYE, "GIRLEYE") \ + X(BGM_MINAMO, "MINAMO") \ + X(BGM_ASHROAD, "ASHROAD") \ + X(BGM_EVENT0, "EVENT0") \ + X(BGM_DEEPDEEP, "DEEPDEEP") \ + X(BGM_KACHI1, "KACHI1") \ + X(BGM_TITLE3, "TITLE3") \ + X(BGM_DEMO1, "DEMO1") \ + X(BGM_GIRL_SUP, "GIRL-SUP") \ + X(BGM_HAGESHII, "HAGESHII") \ + X(BGM_KAKKOII, "KAKKOII") \ + X(BGM_KAZANBAI, "KAZANBAI") \ + X(BGM_AQA_0, "AQA-0") \ + X(BGM_TSURETEK, "TSURETEK") \ + X(BGM_BOY_SUP, "BOY-SUP") \ + X(BGM_RAINBOW, "RAINBOW") \ + X(BGM_AYASII, "AYASII") \ + X(BGM_KACHI4, "KACHI4") \ + X(BGM_ROPEWAY, "ROPEWAY") \ + X(BGM_CASINO, "CASINO") \ + X(BGM_HIGHTOWN, "HIGHTOWN") \ + X(BGM_SAFARI, "SAFARI") \ + X(BGM_C_ROAD, "C-ROAD") \ + X(BGM_AJITO, "AJITO") \ + X(BGM_M_BOAT, "M-BOAT") \ + X(BGM_M_DUNGON, "M-DUNGON") \ + X(BGM_FINECITY, "FINECITY") \ + X(BGM_MACHUPI, "MACHUPI") \ + X(BGM_P_SCHOOL, "P-SCHOOL") \ + X(BGM_DENDOU, "DENDOU") \ + X(BGM_TONEKUSA, "TONEKUSA") \ + X(BGM_MABOROSI, "MABOROSI") \ + X(BGM_CON_FAN, "CON-FAN") \ + X(BGM_CONTEST0, "CONTEST0") \ + X(BGM_MGM0, "MGM0") \ + X(BGM_T_BATTLE, "T-BATTLE") \ + X(BGM_OOAME, "OOAME") \ + X(BGM_HIDERI, "HIDERI") \ + X(BGM_RUNECITY, "RUNECITY") \ + X(BGM_CON_K, "CON-K") \ + X(BGM_EIKOU_R, "EIKOU-R") \ + X(BGM_KARAKURI, "KARAKURI") \ + X(BGM_HUTAGO, "HUTAGO") \ + X(BGM_SITENNOU, "SITENNOU") \ + X(BGM_YAMA_EYE, "YAMA-EYE") \ + X(BGM_CONLOBBY, "CONLOBBY") \ + X(BGM_INTER_V, "INTER-V") \ + X(BGM_DAIGO, "DAIGO") \ + X(BGM_THANKFOR, "THANKFOR") \ + X(BGM_END, "END") \ + X(BGM_BATTLE27, "BATTLE27") \ + X(BGM_BATTLE31, "BATTLE31") \ + X(BGM_BATTLE20, "BATTLE20") \ + X(BGM_BATTLE32, "BATTLE32") \ + X(BGM_BATTLE33, "BATTLE33") \ + X(BGM_BATTLE36, "BATTLE36") \ + X(BGM_BATTLE34, "BATTLE34") \ + X(BGM_BATTLE35, "BATTLE35") \ + X(BGM_BATTLE38, "BATTLE38") \ + X(BGM_BATTLE30, "BATTLE30") + +#define SOUND_LIST_SE \ + X(SE_STOP, "STOP") \ + X(SE_KAIFUKU, "KAIFUKU") \ + X(SE_PC_LOGON, "PC-LOGON") \ + X(SE_PC_OFF, "PC-OFF") \ + X(SE_PC_ON, "PC-ON") \ + X(SE_SELECT, "SELECT") \ + X(SE_WIN_OPEN, "WIN-OPEN") \ + X(SE_WALL_HIT, "WALL-HIT") \ + X(SE_DOOR, "DOOR") \ + X(SE_KAIDAN, "KAIDAN") \ + X(SE_DANSA, "DANSA") \ + X(SE_JITENSYA, "JITENSYA") \ + X(SE_KOUKA_L, "KOUKA-L") \ + X(SE_KOUKA_M, "KOUKA-M") \ + X(SE_KOUKA_H, "KOUKA-H") \ + X(SE_BOWA2, "BOWA2") \ + X(SE_POKE_DEAD, "POKE-DEAD") \ + X(SE_NIGERU, "NIGERU") \ + X(SE_JIDO_DOA, "JIDO-DOA") \ + X(SE_NAMINORI, "NAMINORI") \ + X(SE_BAN, "BAN") \ + X(SE_PIN, "PIN") \ + X(SE_BOO, "BOO") \ + X(SE_BOWA, "BOWA") \ + X(SE_JYUNI, "JYUNI") \ + X(SE_A, "A") \ + X(SE_I, "I") \ + X(SE_U, "U") \ + X(SE_E, "E") \ + X(SE_O, "O") \ + X(SE_N, "N") \ + X(SE_SEIKAI, "SEIKAI") \ + X(SE_HAZURE, "HAZURE") \ + X(SE_EXP, "EXP") \ + X(SE_JITE_PYOKO, "JITE-PYOKO") \ + X(SE_MU_PACHI, "MU-PACHI") \ + X(SE_TK_KASYA, "TK-KASYA") \ + X(SE_FU_ZAKU, "FU-ZAKU") \ + X(SE_FU_ZAKU2, "FU-ZAKU2") \ + X(SE_FU_ZUZUZU, "FU-ZUZUZU") \ + X(SE_RU_GASHIN, "RU-GASHIN") \ + X(SE_RU_GASYAN, "RU-GASYAN") \ + X(SE_RU_BARI, "RU-BARI") \ + X(SE_RU_HYUU, "RU-HYUU") \ + X(SE_KI_GASYAN, "KI-GASYAN") \ + X(SE_TK_WARPIN, "TK-WARPIN") \ + X(SE_TK_WARPOUT, "TK-WARPOUT") \ + X(SE_TU_SAA, "TU-SAA") \ + X(SE_HI_TURUN, "HI-TURUN") \ + X(SE_TRACK_MOVE, "TRACK-MOVE") \ + X(SE_TRACK_STOP, "TRACK-STOP") \ + X(SE_TRACK_HAIK, "TRACK-HAIK") \ + X(SE_TRACK_DOOR, "TRACK-DOOR") \ + X(SE_MOTER, "MOTER") \ + X(SE_CARD, "CARD") \ + X(SE_SAVE, "SAVE") \ + X(SE_KON, "KON") \ + X(SE_KON2, "KON2") \ + X(SE_KON3, "KON3") \ + X(SE_KON4, "KON4") \ + X(SE_SUIKOMU, "SUIKOMU") \ + X(SE_NAGERU, "NAGERU") \ + X(SE_TOY_C, "TOY-C") \ + X(SE_TOY_D, "TOY-D") \ + X(SE_TOY_E, "TOY-E") \ + X(SE_TOY_F, "TOY-F") \ + X(SE_TOY_G, "TOY-G") \ + X(SE_TOY_A, "TOY-A") \ + X(SE_TOY_B, "TOY-B") \ + X(SE_TOY_C1, "TOY-C1") \ + X(SE_MIZU, "MIZU") \ + X(SE_HASHI, "HASHI") \ + X(SE_DAUGI, "DAUGI") \ + X(SE_PINPON, "PINPON") \ + X(SE_FUUSEN1, "FUUSEN1") \ + X(SE_FUUSEN2, "FUUSEN2") \ + X(SE_FUUSEN3, "FUUSEN3") \ + X(SE_TOY_KABE, "TOY-KABE") \ + X(SE_TOY_DANGO, "TOY-DANGO") \ + X(SE_DOKU, "DOKU") \ + X(SE_ESUKA, "ESUKA") \ + X(SE_T_AME, "T-AME") \ + X(SE_T_AME_E, "T-AME-E") \ + X(SE_T_OOAME, "T-OOAME") \ + X(SE_T_OOAME_E, "T-OOAME-E") \ + X(SE_T_KOAME, "T-KOAME") \ + X(SE_T_KOAME_E, "T-KOAME-E") \ + X(SE_T_KAMI, "T-KAMI") \ + X(SE_T_KAMI2, "T-KAMI2") \ + X(SE_ELEBETA, "ELEBETA") \ + X(SE_HINSI, "HINSI") \ + X(SE_EXPMAX, "EXPMAX") \ + X(SE_TAMAKORO, "TAMAKORO") \ + X(SE_TAMAKORO_E, "TAMAKORO-E") \ + X(SE_BASABASA, "BASABASA") \ + X(SE_REGI, "REGI") \ + X(SE_C_GAJI, "C-GAJI") \ + X(SE_C_MAKU_U, "C-MAKU-U") \ + X(SE_C_MAKU_D, "C-MAKU-D") \ + X(SE_C_PASI, "C-PASI") \ + X(SE_C_SYU, "C-SYU") \ + X(SE_C_PIKON, "C-PIKON") \ + X(SE_REAPOKE, "REAPOKE") \ + X(SE_OP_BASYU, "OP-BASYU") \ + X(SE_BT_START, "BT-START") \ + X(SE_DENDOU, "DENDOU") \ + X(SE_JIHANKI, "JIHANKI") \ + X(SE_TAMA, "TAMA") \ + X(SE_Z_SCROLL, "Z-SCROLL") \ + X(SE_Z_PAGE, "Z-PAGE") \ + X(SE_PN_ON, "PN-ON") \ + X(SE_PN_OFF, "PN-OFF") \ + X(SE_Z_SEARCH, "Z-SEARCH") \ + X(SE_TAMAGO, "TAMAGO") \ + X(SE_TB_START, "TB-START") \ + X(SE_TB_KON, "TB-KON") \ + X(SE_TB_KARA, "TB-KARA") \ + X(SE_BIDORO, "BIDORO") \ + X(SE_W085, "W085") \ + X(SE_W085B, "W085B") \ + X(SE_W231, "W231") \ + X(SE_W171, "W171") \ + X(SE_W233, "W233") \ + X(SE_W233B, "W233B") \ + X(SE_W145, "W145") \ + X(SE_W145B, "W145B") \ + X(SE_W145C, "W145C") \ + X(SE_W240, "W240") \ + X(SE_W015, "W015") \ + X(SE_W081, "W081") \ + X(SE_W081B, "W081B") \ + X(SE_W088, "W088") \ + X(SE_W016, "W016") \ + X(SE_W016B, "W016B") \ + X(SE_W003, "W003") \ + X(SE_W104, "W104") \ + X(SE_W013, "W013") \ + X(SE_W196, "W196") \ + X(SE_W086, "W086") \ + X(SE_W004, "W004") \ + X(SE_W025, "W025") \ + X(SE_W025B, "W025B") \ + X(SE_W152, "W152") \ + X(SE_W026, "W026") \ + X(SE_W172, "W172") \ + X(SE_W172B, "W172B") \ + X(SE_W053, "W053") \ + X(SE_W007, "W007") \ + X(SE_W092, "W092") \ + X(SE_W221, "W221") \ + X(SE_W221B, "W221B") \ + X(SE_W052, "W052") \ + X(SE_W036, "W036") \ + X(SE_W059, "W059") \ + X(SE_W059B, "W059B") \ + X(SE_W010, "W010") \ + X(SE_W011, "W011") \ + X(SE_W017, "W017") \ + X(SE_W019, "W019") \ + X(SE_W028, "W028") \ + X(SE_W013B, "W013B") \ + X(SE_W044, "W044") \ + X(SE_W029, "W029") \ + X(SE_W057, "W057") \ + X(SE_W056, "W056") \ + X(SE_W250, "W250") \ + X(SE_W030, "W030") \ + X(SE_W039, "W039") \ + X(SE_W054, "W054") \ + X(SE_W077, "W077") \ + X(SE_W020, "W020") \ + X(SE_W082, "W082") \ + X(SE_W047, "W047") \ + X(SE_W195, "W195") \ + X(SE_W006, "W006") \ + X(SE_W091, "W091") \ + X(SE_W146, "W146") \ + X(SE_W120, "W120") \ + X(SE_W153, "W153") \ + X(SE_W071B, "W071B") \ + X(SE_W071, "W071") \ + X(SE_W103, "W103") \ + X(SE_W062, "W062") \ + X(SE_W062B, "W062B") \ + X(SE_W048, "W048") \ + X(SE_W187, "W187") \ + X(SE_W118, "W118") \ + X(SE_W155, "W155") \ + X(SE_W122, "W122") \ + X(SE_W060, "W060") \ + X(SE_W185, "W185") \ + X(SE_W014, "W014") \ + X(SE_W043, "W043") \ + X(SE_W207, "W207") \ + X(SE_W207B, "W207B") \ + X(SE_W215, "W215") \ + X(SE_W109, "W109") \ + X(SE_W173, "W173") \ + X(SE_W280, "W280") \ + X(SE_W202, "W202") \ + X(SE_W060B, "W060B") \ + X(SE_W076, "W076") \ + X(SE_W080, "W080") \ + X(SE_W100, "W100") \ + X(SE_W107, "W107") \ + X(SE_W166, "W166") \ + X(SE_W129, "W129") \ + X(SE_W115, "W115") \ + X(SE_W112, "W112") \ + X(SE_W197, "W197") \ + X(SE_W199, "W199") \ + X(SE_W236, "W236") \ + X(SE_W204, "W204") \ + X(SE_W268, "W268") \ + X(SE_W070, "W070") \ + X(SE_W063, "W063") \ + X(SE_W127, "W127") \ + X(SE_W179, "W179") \ + X(SE_W151, "W151") \ + X(SE_W201, "W201") \ + X(SE_W161, "W161") \ + X(SE_W161B, "W161B") \ + X(SE_W227, "W227") \ + X(SE_W227B, "W227B") \ + X(SE_W226, "W226") \ + X(SE_W208, "W208") \ + X(SE_W213, "W213") \ + X(SE_W213B, "W213B") \ + X(SE_W234, "W234") \ + X(SE_W260, "W260") \ + X(SE_W328, "W328") \ + X(SE_W320, "W320") \ + X(SE_W255, "W255") \ + X(SE_W291, "W291") \ + X(SE_W089, "W089") \ + X(SE_W239, "W239") \ + X(SE_W230, "W230") \ + X(SE_W281, "W281") \ + X(SE_W327, "W327") \ + X(SE_W287, "W287") \ + X(SE_W257, "W257") \ + X(SE_W253, "W253") \ + X(SE_W258, "W258") \ + X(SE_W322, "W322") \ + X(SE_W298, "W298") \ + X(SE_W287B, "W287B") \ + X(SE_W114, "W114") \ + X(SE_W063B, "W063B") + +// Create BGM list +#define X(songId, name) static const u8 sBGMName_##songId[] = _(name); +SOUND_LIST_BGM +#undef X + +#define X(songId, name) sBGMName_##songId, +static const u8 *const gBGMNames[] = +{ +SOUND_LIST_BGM +}; +#undef X + +// Create SE list +#define X(songId, name) static const u8 sSEName_##songId[] = _(name); +SOUND_LIST_SE +#undef X + +#define X(songId, name) sSEName_##songId, +static const u8 *const gSENames[] = +{ +SOUND_LIST_SE +}; +#undef X + +void Task_InitCryTest(u8 taskId) +{ + struct CryRelatedStruct cryStruct, cryStruct2; + u8 zero; + + SetUpWindowConfig(&gWindowConfig_81E6C3C); + InitMenuWindow(&gWindowConfig_81E6CE4); + gSoundTestCryNum = 1; + ResetSpriteData(); + FreeAllSpritePalettes(); + + cryStruct.unk0 = 0x2000; + cryStruct.unk2 = 29; + cryStruct.paletteNo = 12; + cryStruct.yPos = 30; + cryStruct.xPos = 4; + + zero = 0; // wtf? + gUnknown_03005E98 = 0; + + while (sub_8119E3C(&cryStruct, 3) == FALSE) + ; + + cryStruct2.unk0 = 0; + cryStruct2.unk2 = 15; + cryStruct2.paletteNo = 13; + cryStruct2.xPos = 12; + cryStruct2.yPos = 12; + + zero = 0; // wtf? + gUnknown_03005E98 = 0; + + while (ShowPokedexCryScreen(&cryStruct2, 2) == FALSE) + ; + + MenuDrawTextWindow(0, 16, 5, 19); + PrintCryNumber(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG2CNT = 0xF01; + REG_BG3CNT = 0x1D03; + REG_DISPCNT = 0x1d40; + m4aMPlayFadeOutTemporarily(&gMPlay_BGM, 2); + gTasks[taskId].func = Task_ProcessCryTestInput; +} + +void Task_ProcessCryTestInput(u8 taskId) +{ + sub_8119F88(3); + + if (gMain.newKeys & A_BUTTON) + { + sub_811A050(gSoundTestCryNum); + } + if (gMain.newKeys & R_BUTTON) + { + StopCryAndClearCrySongs(); + } + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + if(--gSoundTestCryNum == 0) + gSoundTestCryNum = 384; // total species + PrintCryNumber(); + } + if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if(++gSoundTestCryNum > 384) + gSoundTestCryNum = 1; + PrintCryNumber(); + } + if (gMain.newKeys & B_BUTTON) + { + REG_DISPCNT = 0x7140; + REG_WIN0H = WIN_RANGE(17, 223); + REG_WIN0V = WIN_RANGE(1, 31); + MenuZeroFillWindowRect(0, 0, 29, 19); + gTasks[taskId].func = Task_InitSoundCheckMenu; + DestroyCryMeterNeedleSprite(); + } +} + +void PrintCryNumber(void) +{ + PrintSignedNumber(gSoundTestCryNum, 1, 17, 3); +} diff --git a/src/unknown_debug_menu.c b/src/debug/unknown_debug_menu.c index a81625f2a..429f43766 100644 --- a/src/unknown_debug_menu.c +++ b/src/debug/unknown_debug_menu.c @@ -1,4 +1,5 @@ #include "global.h" +#include "battle_tower.h" #include "menu.h" extern u8 gBattleCommunication[]; @@ -41,12 +42,12 @@ static u8 sub_814A464(void) u8 sub_814A4B8(void) { - gSaveBlock2.filler_A8.var_4AE[0] = 3; - gSaveBlock2.filler_A8.var_4AE[1] = 3; - gSaveBlock2.filler_A8.var_4B4 = gBattleCommunication[0] + 1; - gSaveBlock2.filler_A8.var_4B6 = gBattleCommunication[0] + 1; - gSaveBlock2.filler_A8.var_4B0 = 1; - gSaveBlock2.filler_A8.var_4B2 = 1; + gSaveBlock2.battleTower.var_4AE[0] = 3; + gSaveBlock2.battleTower.var_4AE[1] = 3; + gSaveBlock2.battleTower.curStreakChallengesNum[0] = gBattleCommunication[0] + 1; + gSaveBlock2.battleTower.curStreakChallengesNum[1] = gBattleCommunication[0] + 1; + gSaveBlock2.battleTower.curChallengeBattleNum[0] = 1; + gSaveBlock2.battleTower.curChallengeBattleNum[1] = 1; CloseMenu(); return 1; } diff --git a/src/blend_palette.c b/src/engine/blend_palette.c index 843c50ac1..843c50ac1 100644 --- a/src/blend_palette.c +++ b/src/engine/blend_palette.c diff --git a/src/cable_club.c b/src/engine/cable_club.c index 7a85f2b6c..c61a1d01c 100644 --- a/src/cable_club.c +++ b/src/engine/cable_club.c @@ -68,7 +68,7 @@ static void sub_8083B6C(void); static void sub_8083CA4(u8 taskId); extern void sub_80831F8(u8 taskId); -extern void call_map_music_set_to_zero(void); +extern void Overworld_ResetMapMusic(void); extern void sub_810FEFC(void); extern void sub_8047CD8(void); extern void sub_805559C(void); @@ -708,7 +708,7 @@ static void sub_808382C(u8 taskId) static void sub_8083958(void) { - call_map_music_set_to_zero(); + Overworld_ResetMapMusic(); LoadPlayerParty(); SavePlayerBag(); sub_810FEFC(); diff --git a/src/clear_save_data_menu.c b/src/engine/clear_save_data_menu.c index 498562fe0..498562fe0 100644 --- a/src/clear_save_data_menu.c +++ b/src/engine/clear_save_data_menu.c diff --git a/src/clock.c b/src/engine/clock.c index 9635514d2..cb8af64a8 100644 --- a/src/clock.c +++ b/src/engine/clock.c @@ -61,19 +61,18 @@ static void UpdatePerDay(struct Time *time) static void UpdatePerMinute(struct Time *time) { struct Time newTime; - s32 minutes; + s32 minutesPassed; CalcTimeDifference(&newTime, &gSaveBlock2.lastBerryTreeUpdate, time); - minutes = 1440 * newTime.days + 60 * newTime.hours + newTime.minutes; + minutesPassed = 1440 * newTime.days + 60 * newTime.hours + newTime.minutes; - // there's no way to get the correct assembly other than with this nested if check. so dumb. - if (minutes != 0) + if (minutesPassed == 0) // do not do the update for the first minute. + return; + + if (minutesPassed > -1) // do not perform an update on invalid minutesPassed. { - if (minutes >= 0) - { - BerryTreeTimeUpdate(minutes); - gSaveBlock2.lastBerryTreeUpdate = *time; - } + BerryTreeTimeUpdate(minutesPassed); + gSaveBlock2.lastBerryTreeUpdate = *time; } } diff --git a/src/decompress.c b/src/engine/decompress.c index d7f7087a7..3e5993118 100644 --- a/src/decompress.c +++ b/src/engine/decompress.c @@ -6,7 +6,7 @@ #define WRAM 0x02000000 -void sub_800D238(const void *src, void *dest) +void LZDecompressWram(const void *src, void *dest) { LZ77UnCompWram(src, dest); } diff --git a/src/link.c b/src/engine/link.c index 850201ccb..7f7e48083 100644 --- a/src/link.c +++ b/src/engine/link.c @@ -954,7 +954,7 @@ static u16 LinkTestCalcBlockChecksum(void *data, u16 size) static void PrintHexDigit(u8 tileNum, u8 x, u8 y) { - u16 *tilemap = (u16 *)BG_SCREEN_ADDR(gLinkTestBGInfo.screenBaseBlock); + u16 *tilemap = BG_SCREEN_ADDR(gLinkTestBGInfo.screenBaseBlock); tilemap[(32 * y) + x] = (gLinkTestBGInfo.paletteNum << 12) | (tileNum + 1); } diff --git a/src/load_save.c b/src/engine/load_save.c index 8424b1121..8424b1121 100644 --- a/src/load_save.c +++ b/src/engine/load_save.c diff --git a/src/main.c b/src/engine/main.c index d7c11b6c8..d7c11b6c8 100644 --- a/src/main.c +++ b/src/engine/main.c diff --git a/src/main_menu.c b/src/engine/main_menu.c index e0af86f3d..e0af86f3d 100644 --- a/src/main_menu.c +++ b/src/engine/main_menu.c diff --git a/src/menu.c b/src/engine/menu.c index a9c4aaa43..a9c4aaa43 100644 --- a/src/menu.c +++ b/src/engine/menu.c diff --git a/src/menu_cursor.c b/src/engine/menu_cursor.c index d43be2a2f..d43be2a2f 100644 --- a/src/menu_cursor.c +++ b/src/engine/menu_cursor.c diff --git a/src/mystery_event_menu.c b/src/engine/mystery_event_menu.c index 0e48dc177..0e48dc177 100644 --- a/src/mystery_event_menu.c +++ b/src/engine/mystery_event_menu.c diff --git a/src/mystery_event_script.c b/src/engine/mystery_event_script.c index f507942a7..69434710f 100644 --- a/src/mystery_event_script.c +++ b/src/engine/mystery_event_script.c @@ -1,5 +1,6 @@ #include "global.h" #include "berry.h" +#include "battle_tower.h" #include "easy_chat.h" #include "event_data.h" #include "mail_data.h" @@ -27,7 +28,6 @@ #endif extern void party_compaction(void); -extern void sub_813601C(void); extern ScrCmdFunc gMysteryEventScriptCmdTable[]; extern ScrCmdFunc gMysteryEventScriptCmdTableEnd[]; @@ -401,8 +401,8 @@ bool8 MEScrCmd_givepokemon(struct ScriptContext *ctx) if (species != SPECIES_EGG) { u16 pokedexNum = SpeciesToNationalPokedexNum(species); - GetNationalPokedexFlag(pokedexNum, 2); - GetNationalPokedexFlag(pokedexNum, 3); + GetSetPokedexFlag(pokedexNum, 2); + GetSetPokedexFlag(pokedexNum, 3); } heldItem = GetMonData(&gPlayerParty[5], MON_DATA_HELD_ITEM); @@ -420,8 +420,8 @@ bool8 MEScrCmd_givepokemon(struct ScriptContext *ctx) bool8 MEScrCmd_addtrainer(struct ScriptContext *ctx) { u32 data = ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]; - memcpy(gSaveBlock2.filler_A8.ereaderTrainer, (void *)data, sizeof(gSaveBlock2.filler_A8.ereaderTrainer)); - sub_813601C(); + memcpy(&gSaveBlock2.battleTower.ereaderTrainer, (void *)data, sizeof(gSaveBlock2.battleTower.ereaderTrainer)); + ValidateEReaderTrainer(); StringExpandPlaceholders(gStringVar4, gOtherText_NewTrainerInHoenn); ctx->data[2] = 2; return FALSE; diff --git a/src/name_string_util.c b/src/engine/name_string_util.c index f1a935453..f1a935453 100644 --- a/src/name_string_util.c +++ b/src/engine/name_string_util.c diff --git a/src/naming_screen.c b/src/engine/naming_screen.c index 3f8417e6d..a20a15569 100644 --- a/src/naming_screen.c +++ b/src/engine/naming_screen.c @@ -30,6 +30,8 @@ extern u8 unk_2000000[]; #define namingScreenData (*(struct NamingScreenData *)(unk_2000000)) +extern u8 CreateMonIcon(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u32 personality); + const u32 gSpriteImage_83CE094[] = INCBIN_U32("graphics/naming_screen/pc_icon/0.4bpp"); const u32 gSpriteImage_83CE154[] = INCBIN_U32("graphics/naming_screen/pc_icon/1.4bpp"); diff --git a/src/option_menu.c b/src/engine/option_menu.c index dfc49b035..dfc49b035 100644 --- a/src/option_menu.c +++ b/src/engine/option_menu.c diff --git a/src/palette.c b/src/engine/palette.c index 94a4f8092..17e9ca178 100644 --- a/src/palette.c +++ b/src/engine/palette.c @@ -74,7 +74,7 @@ static bool8 IsSoftwarePaletteFadeFinishing(void); void LoadCompressedPalette(const void *src, u16 offset, u16 size) { - sub_800D238(src, sPaletteDecompressionBuffer); + LZDecompressWram(src, sPaletteDecompressionBuffer); CpuCopy16(sPaletteDecompressionBuffer, gPlttBufferUnfaded + offset, size); CpuCopy16(sPaletteDecompressionBuffer, gPlttBufferFaded + offset, size); } diff --git a/src/play_time.c b/src/engine/play_time.c index 9882c9c4b..9882c9c4b 100644 --- a/src/play_time.c +++ b/src/engine/play_time.c diff --git a/src/record_mixing.c b/src/engine/record_mixing.c index d02d89467..87fc6a81d 100644 --- a/src/record_mixing.c +++ b/src/engine/record_mixing.c @@ -29,7 +29,7 @@ extern u8 ewram[]; #define unk_2018000 (*(struct PlayerRecords *)(ewram + 0x18000)) #define unk_2008000 (*(struct PlayerRecords *)(ewram + 0x08000)) -extern struct RecordMixing_UnknownStruct gUnknown_02038738; +extern struct RecordMixingDayCareMail gUnknown_02038738; extern u16 gSpecialVar_0x8005; u32 gUnknown_03005D2C; @@ -42,8 +42,8 @@ void *recordMixingTvShows = &gSaveBlock1.tvShows; void *gUnknown_083D0274 = &gSaveBlock1.unknown_2ABC; void *gUnknown_083D0278 = &gSaveBlock1.mauvilleMan; void *recordMixingEasyChatPairs = &gSaveBlock1.easyChatPairs; -struct RecordMixing_UnknownStruct *gUnknown_083D0280 = &gUnknown_02038738; -void *gUnknown_083D0284 = &gSaveBlock2.filler_A8; +struct RecordMixingDayCareMail *gUnknown_083D0280 = &gUnknown_02038738; +void *gBattleTowerPlayerRecord = &gSaveBlock2.battleTower.playerRecord; #define BUFFER_CHUNK_SIZE 200 @@ -59,8 +59,8 @@ struct PlayerRecords u8 filler1004[0x40]; u8 filler1044[0x40]; struct EasyChatPair easyChatPairs[5]; - struct RecordMixing_UnknownStruct filler10AC; - u8 filler1124[0xA4]; + struct RecordMixingDayCareMail filler10AC; + struct BattleTowerRecord battleTowerRecord; u16 filler11C8[0x34]; }; @@ -74,11 +74,11 @@ void RecordMixing_PrepareExchangePacket(void) memcpy(unk_2018000.filler1004, gUnknown_083D0274, sizeof(unk_2008000.filler1004)); memcpy(unk_2018000.filler1044, gUnknown_083D0278, sizeof(unk_2008000.filler1044)); memcpy(unk_2018000.easyChatPairs, recordMixingEasyChatPairs, sizeof(unk_2018000.easyChatPairs)); - gUnknown_02038738.data[0] = gSaveBlock1.filler_303C.data[0]; - gUnknown_02038738.data[1] = gSaveBlock1.filler_303C.data[1]; - sub_8041324(gSaveBlock1.daycareData, &gUnknown_02038738); - memcpy(&unk_2018000.filler10AC, gUnknown_083D0280, sizeof(struct RecordMixing_UnknownStruct)); - memcpy(unk_2018000.filler1124, gUnknown_083D0284, sizeof(unk_2018000.filler1124)); + gUnknown_02038738.mail[0] = gSaveBlock1.daycareData.misc.mail[0]; + gUnknown_02038738.mail[1] = gSaveBlock1.daycareData.misc.mail[1]; + sub_8041324(gSaveBlock1.daycareData.mons, &gUnknown_02038738); + memcpy(&unk_2018000.filler10AC, gUnknown_083D0280, sizeof(struct RecordMixingDayCareMail)); + memcpy(&unk_2018000.battleTowerRecord, gBattleTowerPlayerRecord, sizeof(struct BattleTowerRecord)); if (GetMultiplayerId() == 0) unk_2018000.filler11C8[0] = GetRecordMixingGift(); @@ -92,7 +92,7 @@ void RecordMixing_ReceiveExchangePacket(u32 a) sub_80B9B1C(unk_2008000.filler1044, sizeof(struct PlayerRecords), a); sub_80FA4E4(unk_2008000.easyChatPairs, sizeof(struct PlayerRecords), a); sub_80B9C6C((u8 *)&unk_2008000.filler10AC, sizeof(struct PlayerRecords), a, unk_2008000.tvShows); - sub_80B9B70(unk_2008000.filler1124, sizeof(struct PlayerRecords), a); + sub_80B9B70(&unk_2008000.battleTowerRecord, sizeof(struct PlayerRecords), a); sub_80B9F3C(unk_2008000.filler11C8, a); } @@ -447,11 +447,11 @@ void sub_80B9B1C(u8 *a, size_t size, u8 index) sub_80F7F30(); } -void sub_80B9B70(u8 *a, size_t size, u8 index) +void sub_80B9B70(void *battleTowerRecord, u32 size, u8 index) { sub_80B9A88(gUnknown_0300071C); - memcpy(a + size * index, a + size * gUnknown_0300071C[index], 0xA4); - sub_8134AC0(a + size * index); + memcpy(battleTowerRecord + size * index, battleTowerRecord + size * gUnknown_0300071C[index], sizeof(struct BattleTowerRecord)); + sub_8134AC0(battleTowerRecord + size * index); } u8 sub_80B9BBC(u16 *a) @@ -461,10 +461,10 @@ u8 sub_80B9BBC(u16 *a) void sub_80B9BC4(u8 *a, size_t b, u8 c[][2], u8 d, u8 e) { - struct RecordMixing_UnknownStructSub *r6 = (struct RecordMixing_UnknownStructSub *)(a + b * c[d][0]); - struct RecordMixing_UnknownStructSub *src = r6 + c[d][1]; - struct RecordMixing_UnknownStructSub sp0 = *src; - struct RecordMixing_UnknownStructSub *r8 = (struct RecordMixing_UnknownStructSub *)(a + b * c[e][0]); + struct DayCareMail *r6 = (struct DayCareMail *)(a + b * c[d][0]); + struct DayCareMail *src = r6 + c[d][1]; + struct DayCareMail sp0 = *src; + struct DayCareMail *r8 = (struct DayCareMail *)(a + b * c[e][0]); r6 += c[d][1]; *r6 = *(r8 + c[e][1]); @@ -511,7 +511,7 @@ void sub_80B9C6C(u8 *a, u32 b, u8 c, void *d) u16 i; // r3 u16 r7; u8 r1; - struct RecordMixing_UnknownStruct *r6; + struct DayCareMisc *r6; //asm("":::"r8"); SeedRng(gLinkPlayers[0].trainerId); @@ -526,7 +526,7 @@ void sub_80B9C6C(u8 *a, u32 b, u8 c, void *d) sp3C = 0; for (i = 0; i < r8; i++) { - r6 = (struct RecordMixing_UnknownStruct *)(a + b * i); + r6 = (struct DayCareMisc *)(a + b * i); if (r6->unk70 != 0) { for (r7 = 0; r7 < r6->unk70; r7++) @@ -540,7 +540,7 @@ void sub_80B9C6C(u8 *a, u32 b, u8 c, void *d) //_080B9D46 for (r7 = 0, i = 0; i < r8; i++) { - r6 = (struct RecordMixing_UnknownStruct *)(a + b * i); + r6 = (struct DayCareMisc *)(a + b * i); if (sp1C[i][0] == 1 || sp1C[i][1] == 1) sp3C++; if (sp1C[i][0] == 1 && sp1C[i][1] == 0) @@ -596,7 +596,7 @@ void sub_80B9C6C(u8 *a, u32 b, u8 c, void *d) //_080B9E3E for (i = 0; i < 4; i++) { - r6 = (struct RecordMixing_UnknownStruct *)a + b * c; + r6 = (struct DayCareMisc *)a + b * c; spC[i] = r6; } r1 = sub_80B9C4C(d) % 3; @@ -630,7 +630,7 @@ void sub_80B9C6C(u8 *a, u32 b, u8 c, void *d) //_080B9EF0 //memcpy(&gSaveBlock1.filler_303C.data[0], a + b * c, 0x38); //memcpy(&gSaveBlock1.filler_303C.data[1], a + b * c + 0x38, 0x38); - r6 = (struct RecordMixing_UnknownStruct *)(a + b * c); + r6 = (struct DayCareMisc *)(a + b * c); gSaveBlock1.filler_303C.data[0] = r6->data[0]; gSaveBlock1.filler_303C.data[1] = r6->data[1]; //memcpy(&gSaveBlock1.filler_303C.data[0], &r6->data[0], 0x38); diff --git a/src/reset_rtc_screen.c b/src/engine/reset_rtc_screen.c index d052992ad..d052992ad 100644 --- a/src/reset_rtc_screen.c +++ b/src/engine/reset_rtc_screen.c diff --git a/src/rng.c b/src/engine/rng.c index 7d4b5600e..7d4b5600e 100644 --- a/src/rng.c +++ b/src/engine/rng.c diff --git a/src/rtc.c b/src/engine/rtc.c index d73f943d2..d73f943d2 100644 --- a/src/rtc.c +++ b/src/engine/rtc.c diff --git a/src/save.c b/src/engine/save.c index eae3f4470..5ea949cae 100644 --- a/src/save.c +++ b/src/engine/save.c @@ -282,7 +282,7 @@ u8 sub_81255B8(u16 a1, const struct SaveSectionLocation *location) for (i = 0; i < sizeof(struct UnkSaveSection); i++) { - if (ProgramFlashByte(sector, i, ((u8 *)gFastSaveSection)[i])) + if (ProgramFlashByte(sector, i, gFastSaveSection->data[i])) { status = 0xFF; break; @@ -402,7 +402,7 @@ u8 sub_81258BC(u16 a1, const struct SaveSectionLocation *location) { u16 j; for (j = 0; j < location[id].size; j++) - ((u8 *)location[id].data)[j] = gFastSaveSection->data[j]; + location[id].data[j] = gFastSaveSection->data[j]; } } @@ -774,7 +774,7 @@ u8 unref_sub_8125FF0(u8 *data, u16 size) for (i = 0; i < size; i++) section->data[i] = data[i]; - gLastSaveSectorStatus = ProgramFlashSectorAndVerifyNBytes(gFlashSectors[0], (u8 *)section, sizeof(struct SaveSection)); + gLastSaveSectorStatus = ProgramFlashSectorAndVerifyNBytes(gFlashSectors[0], section, sizeof(struct SaveSection)); if (gLastSaveSectorStatus) return 0xFF; diff --git a/src/save_failed_screen.c b/src/engine/save_failed_screen.c index b91e8b5bf..17bda237e 100644 --- a/src/save_failed_screen.c +++ b/src/engine/save_failed_screen.c @@ -267,10 +267,10 @@ static void VBlankCB_UpdateClockGraphics(void) static bool8 VerifySectorWipe(u16 sector) { - u32 *ptr = (u32 *)unk_2000000; + u32 *ptr = (u32 *)&unk_2000000; u16 i; - ReadFlash(sector, 0, (u8 *)ptr, 4096); + ReadFlash(sector, 0, ptr, 4096); for (i = 0; i < 0x400; i++, ptr++) if (*ptr) diff --git a/src/save_menu_util.c b/src/engine/save_menu_util.c index a2d17bd36..a2d17bd36 100644 --- a/src/save_menu_util.c +++ b/src/engine/save_menu_util.c diff --git a/src/script.c b/src/engine/script.c index f049b96fc..8625cfdc2 100644 --- a/src/script.c +++ b/src/engine/script.c @@ -3,6 +3,14 @@ #include "event_data.h" #define RAM_SCRIPT_MAGIC 51 +#define SCRIPT_STACK_SIZE 20 + +enum +{ + SCRIPT_MODE_STOPPED, + SCRIPT_MODE_BYTECODE, + SCRIPT_MODE_NATIVE, +}; EWRAM_DATA u8 *gUnknown_0202E8AC = NULL; @@ -19,66 +27,66 @@ void InitScriptContext(struct ScriptContext *ctx, void *cmdTable, void *cmdTable { s32 i; - ctx->mode = 0; - ctx->scriptPtr = 0; + ctx->mode = SCRIPT_MODE_STOPPED; + ctx->scriptPtr = NULL; ctx->stackDepth = 0; - ctx->nativePtr = 0; + ctx->nativePtr = NULL; ctx->cmdTable = cmdTable; ctx->cmdTableEnd = cmdTableEnd; for (i = 0; i < 4; i++) ctx->data[i] = 0; - for (i = 0; i < 20; i++) + for (i = 0; i < SCRIPT_STACK_SIZE; i++) ctx->stack[i] = 0; } u8 SetupBytecodeScript(struct ScriptContext *ctx, const u8 *ptr) { ctx->scriptPtr = ptr; - ctx->mode = 1; + ctx->mode = SCRIPT_MODE_BYTECODE; return 1; } void SetupNativeScript(struct ScriptContext *ctx, bool8 (*ptr)(void)) { - ctx->mode = 2; + ctx->mode = SCRIPT_MODE_NATIVE; ctx->nativePtr = ptr; } void StopScript(struct ScriptContext *ctx) { - ctx->mode = 0; - ctx->scriptPtr = 0; + ctx->mode = SCRIPT_MODE_STOPPED; + ctx->scriptPtr = NULL; } -u8 RunScriptCommand(struct ScriptContext *ctx) +bool8 RunScriptCommand(struct ScriptContext *ctx) { - if (ctx->mode == 0) - return 0; + if (ctx->mode == SCRIPT_MODE_STOPPED) + return FALSE; switch (ctx->mode) { - case 0: - return 0; - case 2: + case SCRIPT_MODE_STOPPED: + return FALSE; + case SCRIPT_MODE_NATIVE: if (ctx->nativePtr) { if (ctx->nativePtr() == TRUE) - ctx->mode = 1; - return 1; + ctx->mode = SCRIPT_MODE_BYTECODE; + return TRUE; } - ctx->mode = 1; - case 1: + ctx->mode = SCRIPT_MODE_BYTECODE; + case SCRIPT_MODE_BYTECODE: while (1) { u8 cmdCode; - ScrCmdFunc *func; + ScrCmdFunc *cmdFunc; - if (!ctx->scriptPtr) + if (ctx->scriptPtr == NULL) { - ctx->mode = 0; - return 0; + ctx->mode = SCRIPT_MODE_STOPPED; + return FALSE; } if (ctx->scriptPtr == gNullScriptPtr) @@ -89,25 +97,25 @@ u8 RunScriptCommand(struct ScriptContext *ctx) cmdCode = *(ctx->scriptPtr); ctx->scriptPtr++; - func = &ctx->cmdTable[cmdCode]; + cmdFunc = &ctx->cmdTable[cmdCode]; - if (func >= ctx->cmdTableEnd) + if (cmdFunc >= ctx->cmdTableEnd) { - ctx->mode = 0; - return 0; + ctx->mode = SCRIPT_MODE_STOPPED; + return FALSE; } - if ((*func)(ctx) == 1) - return 1; + if ((*cmdFunc)(ctx) == TRUE) + return TRUE; } } - return 1; + return TRUE; } u8 ScriptPush(struct ScriptContext *ctx, const u8 *ptr) { - if (ctx->stackDepth + 1 >= 20) + if (ctx->stackDepth + 1 >= SCRIPT_STACK_SIZE) { return 1; } diff --git a/src/sound.c b/src/engine/sound.c index 91f5e06a3..a6a61c0b5 100644 --- a/src/sound.c +++ b/src/engine/sound.c @@ -81,8 +81,6 @@ void MapMusicMain(void) PlayBGM(sCurrentMapMusic); break; case 2: - case 3: - case 4: break; case 5: if (IsBGMStopped()) diff --git a/src/sprite.c b/src/engine/sprite.c index fb8c2b648..34ca3802d 100644 --- a/src/sprite.c +++ b/src/engine/sprite.c @@ -833,13 +833,13 @@ static void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct Spr if (gSpriteCopyRequestCount < MAX_SPRITE_COPY_REQUESTS) { gSpriteCopyRequests[gSpriteCopyRequestCount].src = images[index].data; - gSpriteCopyRequests[gSpriteCopyRequestCount].dest = (u8 *)OBJ_VRAM0 + TILE_SIZE_4BPP * tileNum; + gSpriteCopyRequests[gSpriteCopyRequestCount].dest = OBJ_VRAM0 + TILE_SIZE_4BPP * tileNum; gSpriteCopyRequests[gSpriteCopyRequestCount].size = images[index].size; gSpriteCopyRequestCount++; } } -void RequestSpriteCopy(const u8 *src, u8 *dest, u16 size) +void RequestSpriteCopy(const void *src, u8 *dest, u16 size) { if (gSpriteCopyRequestCount < MAX_SPRITE_COPY_REQUESTS) { @@ -850,6 +850,7 @@ void RequestSpriteCopy(const u8 *src, u8 *dest, u16 size) } } +// these two functions are unused. void CopyFromSprites(u8 *dest) { u32 i; @@ -916,16 +917,17 @@ void DestroySpriteAndFreeResources(struct Sprite *sprite) DestroySprite(sprite); } -void sub_800142C(u32 a1, u32 a2, u16 *a3, u16 a4, u32 a5) +// Loads the mon name, level, and hp sprites into OAM. +void DrawPartyMenuMonText(u32 a1, u32 a2, const u16 *a3, u16 a4, u32 baseTileNumber) { - u16 *d = a3; + const u16 *d = a3; struct OamData *oam = &gMain.oamBuffer[gMain.objCount]; while (!(gMain.objCount & 0x80) && (s16)(d[0] + 1) != 0) { u16 *x = (u16 *)oam; x[0] = (d[0] & sOamBitmasks[0]) | ((d[0] + a2) & sOamBitmasks[1]) | ((a4 & sOamBitmasks[2]) << 8); x[1] = (d[1] & sOamBitmasks[3]) | ((d[1] + a1) & sOamBitmasks[4]) | ((a4 & sOamBitmasks[5]) << 4); - x[2] = (d[2] & sOamBitmasks[6]) | ((d[2] + a5) & sOamBitmasks[7]) | (a4 & sOamBitmasks[8]); + x[2] = (d[2] & sOamBitmasks[6]) | ((d[2] + baseTileNumber) & sOamBitmasks[7]) | (a4 & sOamBitmasks[8]); oam++; gMain.objCount++; d += 3; @@ -1478,7 +1480,7 @@ u16 LoadSpriteSheet(const struct SpriteSheet *sheet) else { AllocSpriteTileRange(sheet->tag, (u16)tileStart, sheet->size / TILE_SIZE_4BPP); - CpuCopy16(sheet->data, (u8 *)OBJ_VRAM0 + TILE_SIZE_4BPP * tileStart, sheet->size); + CpuCopy16(sheet->data, OBJ_VRAM0 + TILE_SIZE_4BPP * tileStart, sheet->size); return (u16)tileStart; } } @@ -1516,7 +1518,7 @@ void LoadTilesForSpriteSheet(const struct SpriteSheet *sheet) { const u8 *data = sheet->data; u16 tileStart = GetSpriteTileStartByTag(sheet->tag); - CpuCopy16(data, (u8 *)OBJ_VRAM0 + TILE_SIZE_4BPP * tileStart, sheet->size); + CpuCopy16(data, OBJ_VRAM0 + TILE_SIZE_4BPP * tileStart, sheet->size); } void LoadTilesForSpriteSheets(struct SpriteSheet *sheets) @@ -1602,7 +1604,7 @@ void RequestSpriteSheetCopy(const struct SpriteSheet *sheet) { const u8 *data = sheet->data; u16 tileStart = GetSpriteTileStartByTag(sheet->tag); - RequestSpriteCopy(data, (u8 *)OBJ_VRAM0 + tileStart * TILE_SIZE_4BPP, sheet->size); + RequestSpriteCopy(data, OBJ_VRAM0 + tileStart * TILE_SIZE_4BPP, sheet->size); } u16 LoadSpriteSheetDeferred(const struct SpriteSheet *sheet) diff --git a/src/string_util.c b/src/engine/string_util.c index 9686256a1..7316f533a 100644 --- a/src/string_util.c +++ b/src/engine/string_util.c @@ -376,7 +376,7 @@ u8 *StringExpandPlaceholders(u8 *dest, const u8 *src) { u8 c = *src++; u8 placeholderId; - u8 *expandedString; + const u8 *expandedString; u8 length; switch (c) @@ -432,45 +432,45 @@ u8 *StringBraille(u8 *dest, const u8 *src) } } -static u8 *ExpandPlaceholder_UnknownStringVar(void) +static const u8 *ExpandPlaceholder_UnknownStringVar(void) { return gUnknownStringVar; } -static u8 *ExpandPlaceholder_PlayerName(void) +static const u8 *ExpandPlaceholder_PlayerName(void) { return gSaveBlock2.playerName; } -static u8 *ExpandPlaceholder_StringVar1(void) +static const u8 *ExpandPlaceholder_StringVar1(void) { return gStringVar1; } -static u8 *ExpandPlaceholder_StringVar2(void) +static const u8 *ExpandPlaceholder_StringVar2(void) { return gStringVar2; } -static u8 *ExpandPlaceholder_StringVar3(void) +static const u8 *ExpandPlaceholder_StringVar3(void) { return gStringVar3; } -static u8 *ExpandPlaceholder_KunChan(void) +static const u8 *ExpandPlaceholder_KunChan(void) { if (gSaveBlock2.playerGender == MALE) - return (u8 *) gExpandedPlaceholder_Kun; + return gExpandedPlaceholder_Kun; else - return (u8 *) gExpandedPlaceholder_Chan; + return gExpandedPlaceholder_Chan; } -static u8 *ExpandPlaceholder_RivalName(void) +static const u8 *ExpandPlaceholder_RivalName(void) { if (gSaveBlock2.playerGender == MALE) - return (u8 *) gExpandedPlaceholder_May; + return gExpandedPlaceholder_May; else - return (u8 *) gExpandedPlaceholder_Brendan; + return gExpandedPlaceholder_Brendan; } #define VERSION_DEPENDENT_PLACEHOLDER_LIST \ @@ -484,19 +484,19 @@ static u8 *ExpandPlaceholder_RivalName(void) #ifdef SAPPHIRE #define X(ph, r, s) \ -static u8 *ExpandPlaceholder_##ph(void) { return (u8 *) gExpandedPlaceholder_##s; } +static const u8 *ExpandPlaceholder_##ph(void) { return gExpandedPlaceholder_##s; } VERSION_DEPENDENT_PLACEHOLDER_LIST #else #define X(ph, r, s) \ -static u8 *ExpandPlaceholder_##ph(void) { return (u8 *) gExpandedPlaceholder_##r; } +static const u8 *ExpandPlaceholder_##ph(void) { return gExpandedPlaceholder_##r; } VERSION_DEPENDENT_PLACEHOLDER_LIST #endif #undef X -u8 *GetExpandedPlaceholder(u32 id) +const u8 *GetExpandedPlaceholder(u32 id) { - typedef u8 *(*ExpandPlaceholderFunc)(void); + typedef const u8 *(*ExpandPlaceholderFunc)(void); static const ExpandPlaceholderFunc funcs[] = { @@ -517,7 +517,7 @@ u8 *GetExpandedPlaceholder(u32 id) }; if (id >= ARRAY_COUNT(funcs)) - return (u8 *) gExpandedPlaceholder_Empty; + return gExpandedPlaceholder_Empty; else return funcs[id](); } diff --git a/src/task.c b/src/engine/task.c index 7bd2b5937..7bd2b5937 100644 --- a/src/task.c +++ b/src/engine/task.c diff --git a/src/text.c b/src/engine/text.c index b27084b86..1d1d31383 100644 --- a/src/text.c +++ b/src/engine/text.c @@ -219,12 +219,12 @@ static const u8 sBrailleGlyphs[] = INCBIN_U8("graphics/fonts/font6_braille.1bpp" static const u32 sDownArrowTiles[] = INCBIN_U32("graphics/fonts/down_arrow.4bpp"); // clang-format off -#include "data/text/type1_map.h" -#include "data/text/type3_map.h" -#include "data/text/font1_widths.h" -#include "data/text/font4_widths.h" -#include "data/text/font0_widths.h" -#include "data/text/font3_widths.h" +#include "../data/text/type1_map.h" +#include "../data/text/type3_map.h" +#include "../data/text/font1_widths.h" +#include "../data/text/font4_widths.h" +#include "../data/text/font0_widths.h" +#include "../data/text/font3_widths.h" // clang-format on const u16 gUnknownPalette_81E6692[] = INCBIN_U16("graphics/fonts/unknown_81E6692.gbapal"); @@ -396,6 +396,8 @@ extern const u32 gFont4LatinGlyphs[]; extern const u32 gFont3JapaneseGlyphs[]; extern const u32 gFont4JapaneseGlyphs[]; +// Getting rid of the u8 recasting will make the ROM no longer match due to +// a const being required to pass the elements directly to the rodata structs. static const struct Font sFonts[] = { // Japanese fonts @@ -405,15 +407,15 @@ static const struct Font sFonts[] = { 4, (u8 *)gFont3JapaneseGlyphs, 64, 512 }, { 1, (u8 *)gFont4JapaneseGlyphs, 32, 0 }, { 2, (u8 *)gFont4JapaneseGlyphs, 32, 0 }, - { 3, (u8 *)sBrailleGlyphs, 8, 0 }, + { 3, (u8 *)sBrailleGlyphs, 8, 0 }, // Latin - { 0, (u8 *)sFont0LatinGlyphs, 16, 8 }, - { 1, (u8 *)sFont1LatinGlyphs, 8, 0 }, - { 2, (u8 *)sFont1LatinGlyphs, 8, 0 }, - { 0, (u8 *)gFont3LatinGlyphs, 64, 32 }, - { 1, (u8 *)gFont4LatinGlyphs, 32, 0 }, - { 2, (u8 *)gFont4LatinGlyphs, 32, 0 }, - { 3, (u8 *)sBrailleGlyphs, 8, 0 }, + { 0, (u8 *)sFont0LatinGlyphs, 16, 8 }, + { 1, (u8 *)sFont1LatinGlyphs, 8, 0 }, + { 2, (u8 *)sFont1LatinGlyphs, 8, 0 }, + { 0, (u8 *)gFont3LatinGlyphs, 64, 32 }, + { 1, (u8 *)gFont4LatinGlyphs, 32, 0 }, + { 2, (u8 *)gFont4LatinGlyphs, 32, 0 }, + { 3, (u8 *)sBrailleGlyphs, 8, 0 }, }; static const u8 sTextSpeedDelays[] = { 6, 3, 1 }; // slow, mid, fast @@ -492,8 +494,8 @@ const struct WindowConfig gWindowConfig_81E6C3C = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(31), // tilemap }; const struct WindowConfig gWindowConfig_81E6C58 = @@ -513,8 +515,8 @@ const struct WindowConfig gWindowConfig_81E6C58 = 0, // tilemap top coordinate 26, // width 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(24), // tilemap + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(24), // tilemap }; const struct WindowConfig gWindowConfig_81E6C74 = @@ -534,7 +536,7 @@ const struct WindowConfig gWindowConfig_81E6C74 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)OBJ_VRAM0, // tile data + OBJ_VRAM0, // tile data NULL, // tilemap }; @@ -555,8 +557,8 @@ const struct WindowConfig gWindowConfig_81E6C90 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(1), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap + BG_CHAR_ADDR(1), // tile data + BG_SCREEN_ADDR(30), // tilemap }; const struct WindowConfig gWindowConfig_81E6CAC = @@ -597,8 +599,8 @@ const struct WindowConfig gWindowConfig_81E6CC8 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(15), // tilemap + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(15), // tilemap }; const struct WindowConfig gWindowConfig_81E6CE4 = @@ -618,8 +620,8 @@ const struct WindowConfig gWindowConfig_81E6CE4 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(31), // tilemap }; const struct WindowConfig gWindowConfig_81E6D00 = @@ -639,8 +641,8 @@ const struct WindowConfig gWindowConfig_81E6D00 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(31), // tilemap }; const struct WindowConfig gWindowConfig_81E6D1C = @@ -660,8 +662,8 @@ const struct WindowConfig gWindowConfig_81E6D1C = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(31), // tilemap }; const struct WindowConfig gWindowConfig_81E6D38 = @@ -702,8 +704,8 @@ const struct WindowConfig gWindowConfig_81E6D54 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(3), // tile data - (u16 *)BG_SCREEN_ADDR(15), // tilemap + BG_CHAR_ADDR(3), // tile data + BG_SCREEN_ADDR(15), // tilemap }; const struct WindowConfig gWindowConfig_81E6D70 = @@ -723,8 +725,8 @@ const struct WindowConfig gWindowConfig_81E6D70 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(3), // tile data - (u16 *)BG_SCREEN_ADDR(15), // tilemap + BG_CHAR_ADDR(3), // tile data + BG_SCREEN_ADDR(15), // tilemap }; const struct WindowConfig gWindowConfig_81E6D8C = @@ -744,8 +746,8 @@ const struct WindowConfig gWindowConfig_81E6D8C = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(14), // tilemap + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(14), // tilemap }; const struct WindowConfig gWindowConfig_81E6DA8 = @@ -765,8 +767,8 @@ const struct WindowConfig gWindowConfig_81E6DA8 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(11), // tilemap + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(11), // tilemap }; const struct WindowConfig WindowConfig_TrainerCard_Back_Values = @@ -786,8 +788,8 @@ const struct WindowConfig WindowConfig_TrainerCard_Back_Values = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(30), // tilemap }; const struct WindowConfig WindowConfig_TrainerCard_Back_Labels = @@ -807,8 +809,8 @@ const struct WindowConfig WindowConfig_TrainerCard_Back_Labels = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(30), // tilemap }; const struct WindowConfig gWindowConfig_81E6DFC = @@ -828,8 +830,8 @@ const struct WindowConfig gWindowConfig_81E6DFC = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(31), // tilemap }; const struct WindowConfig gWindowConfig_81E6E18 = @@ -849,8 +851,8 @@ const struct WindowConfig gWindowConfig_81E6E18 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(31), // tilemap }; const struct WindowConfig gWindowConfig_81E6E34 = @@ -870,8 +872,8 @@ const struct WindowConfig gWindowConfig_81E6E34 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(31), // tilemap }; const struct WindowConfig gWindowConfig_81E6E50 = @@ -891,8 +893,8 @@ const struct WindowConfig gWindowConfig_81E6E50 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(28), // tilemap + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(28), // tilemap }; const struct WindowConfig gWindowConfig_81E6E6C = @@ -912,8 +914,8 @@ const struct WindowConfig gWindowConfig_81E6E6C = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(30), // tilemap }; const struct WindowConfig gWindowConfig_81E6E88 = @@ -933,8 +935,8 @@ const struct WindowConfig gWindowConfig_81E6E88 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(31), // tilemap }; const struct WindowConfig gWindowConfig_81E6EA4 = @@ -954,8 +956,8 @@ const struct WindowConfig gWindowConfig_81E6EA4 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(28), // tilemap + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(28), // tilemap }; const struct WindowConfig gWindowConfig_81E6EC0 = @@ -975,8 +977,8 @@ const struct WindowConfig gWindowConfig_81E6EC0 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(29), // tilemap + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(29), // tilemap }; const struct WindowConfig gWindowConfig_81E6EDC = @@ -996,8 +998,8 @@ const struct WindowConfig gWindowConfig_81E6EDC = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(28), // tilemap + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(28), // tilemap }; const struct WindowConfig gWindowConfig_81E6EF8 = @@ -1017,8 +1019,8 @@ const struct WindowConfig gWindowConfig_81E6EF8 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(29), // tilemap + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(29), // tilemap }; const struct WindowConfig gWindowConfig_81E6F14 = @@ -1038,8 +1040,8 @@ const struct WindowConfig gWindowConfig_81E6F14 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(28), // tilemap + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(28), // tilemap }; const struct WindowConfig gWindowConfig_81E6F30 = @@ -1059,8 +1061,8 @@ const struct WindowConfig gWindowConfig_81E6F30 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(29), // tilemap + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(29), // tilemap }; const struct WindowConfig gWindowConfig_81E6F4C = @@ -1080,8 +1082,8 @@ const struct WindowConfig gWindowConfig_81E6F4C = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(30), // tilemap }; const struct WindowConfig gWindowConfig_81E6F68 = @@ -1101,8 +1103,8 @@ const struct WindowConfig gWindowConfig_81E6F68 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(13), // tilemap + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(13), // tilemap }; const struct WindowConfig gWindowConfig_81E6F84 = @@ -1122,8 +1124,8 @@ const struct WindowConfig gWindowConfig_81E6F84 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(31), // tilemap }; const struct WindowConfig gWindowConfig_81E6FA0 = @@ -1143,8 +1145,8 @@ const struct WindowConfig gWindowConfig_81E6FA0 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(24), // tilemap + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(24), // tilemap }; const struct WindowConfig gWindowConfig_81E6FBC = @@ -1164,8 +1166,8 @@ const struct WindowConfig gWindowConfig_81E6FBC = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(30), // tilemap }; const struct WindowConfig gWindowConfig_81E6FD8 = @@ -1185,8 +1187,8 @@ const struct WindowConfig gWindowConfig_81E6FD8 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(24), // tilemap + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(24), // tilemap }; const struct WindowConfig gWindowConfig_81E6FF4 = @@ -1206,8 +1208,8 @@ const struct WindowConfig gWindowConfig_81E6FF4 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(24), // tilemap + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(24), // tilemap }; const struct WindowConfig gWindowConfig_81E7010 = @@ -1227,8 +1229,8 @@ const struct WindowConfig gWindowConfig_81E7010 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(30), // tilemap }; const struct WindowConfig gWindowConfig_81E702C = @@ -1248,8 +1250,8 @@ const struct WindowConfig gWindowConfig_81E702C = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(15), // tilemap + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(15), // tilemap }; const struct WindowConfig gWindowConfig_81E7048 = @@ -1269,8 +1271,8 @@ const struct WindowConfig gWindowConfig_81E7048 = 0, // tilemap top coordinate 16, // width 32, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(14), // tilemap + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(14), // tilemap }; const struct WindowConfig gWindowConfig_81E7064 = @@ -1290,8 +1292,8 @@ const struct WindowConfig gWindowConfig_81E7064 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(14), // tilemap + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(14), // tilemap }; const struct WindowConfig gWindowConfig_81E7080 = @@ -1311,8 +1313,8 @@ const struct WindowConfig gWindowConfig_81E7080 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(30), // tilemap }; const struct WindowConfig gWindowConfig_81E709C = @@ -1332,8 +1334,8 @@ const struct WindowConfig gWindowConfig_81E709C = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(31), // tilemap }; const struct WindowConfig gWindowConfig_81E70B8 = @@ -1353,8 +1355,8 @@ const struct WindowConfig gWindowConfig_81E70B8 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(30), // tilemap }; const struct WindowConfig gWindowConfig_81E70D4 = @@ -1374,8 +1376,8 @@ const struct WindowConfig gWindowConfig_81E70D4 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(30), // tilemap }; const struct WindowConfig gWindowConfig_81E70F0 = @@ -1416,8 +1418,8 @@ const struct WindowConfig gWindowConfig_81E710C = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(31), // tilemap }; const struct WindowConfig gWindowConfig_81E7128 = @@ -1437,8 +1439,8 @@ const struct WindowConfig gWindowConfig_81E7128 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(31), // tilemap }; const struct WindowConfig gWindowConfig_81E7144 = @@ -1458,8 +1460,8 @@ const struct WindowConfig gWindowConfig_81E7144 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(31), // tilemap }; const struct WindowConfig gWindowConfig_81E7160 = @@ -1479,8 +1481,8 @@ const struct WindowConfig gWindowConfig_81E7160 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(1), // tile data - (u16 *)BG_SCREEN_ADDR(10), // tilemap + BG_CHAR_ADDR(1), // tile data + BG_SCREEN_ADDR(10), // tilemap }; const struct WindowConfig gWindowConfig_81E717C = @@ -1500,8 +1502,8 @@ const struct WindowConfig gWindowConfig_81E717C = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(3), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap + BG_CHAR_ADDR(3), // tile data + BG_SCREEN_ADDR(31), // tilemap }; const struct WindowConfig gWindowConfig_81E7198 = @@ -1521,8 +1523,8 @@ const struct WindowConfig gWindowConfig_81E7198 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(15), // tilemap + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(15), // tilemap }; const struct WindowConfig gWindowConfig_81E71B4 = @@ -1542,8 +1544,8 @@ const struct WindowConfig gWindowConfig_81E71B4 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(15), // tilemap + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(15), // tilemap }; const struct WindowConfig gWindowConfig_81E71D0 = @@ -1563,8 +1565,8 @@ const struct WindowConfig gWindowConfig_81E71D0 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(1), // tile data - (u16 *)BG_SCREEN_ADDR(28), // tilemap + BG_CHAR_ADDR(1), // tile data + BG_SCREEN_ADDR(28), // tilemap }; const struct WindowConfig gWindowConfig_81E71EC = @@ -1584,8 +1586,8 @@ const struct WindowConfig gWindowConfig_81E71EC = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(1), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap + BG_CHAR_ADDR(1), // tile data + BG_SCREEN_ADDR(30), // tilemap }; const struct WindowConfig gWindowConfig_81E7208 = @@ -1605,8 +1607,8 @@ const struct WindowConfig gWindowConfig_81E7208 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(28), // tilemap + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(28), // tilemap }; const struct WindowConfig gWindowConfig_81E7224 = @@ -1626,8 +1628,8 @@ const struct WindowConfig gWindowConfig_81E7224 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(0), // tile data - (u16 *)BG_SCREEN_ADDR(31), // tilemap + BG_CHAR_ADDR(0), // tile data + BG_SCREEN_ADDR(31), // tilemap }; const struct WindowConfig gWindowConfig_81E7240 = @@ -1647,8 +1649,8 @@ const struct WindowConfig gWindowConfig_81E7240 = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)BG_CHAR_ADDR(2), // tile data - (u16 *)BG_SCREEN_ADDR(30), // tilemap + BG_CHAR_ADDR(2), // tile data + BG_SCREEN_ADDR(30), // tilemap }; const struct WindowConfig gWindowConfig_81E725C = @@ -1668,7 +1670,7 @@ const struct WindowConfig gWindowConfig_81E725C = 0, // tilemap top coordinate 30, // width 20, // height - (u8 *)OBJ_VRAM0, // tile data + OBJ_VRAM0, // tile data NULL, // tilemap }; @@ -1943,7 +1945,7 @@ void InitWindowFromConfig(struct Window *win, const struct WindowConfig *winConf void InitWindow(struct Window *win, const u8 *text, u16 tileDataStartOffset, u8 left, u8 top) { - struct WindowConfig *winConfig = win->config; + const struct WindowConfig *winConfig = win->config; win->textMode = winConfig->textMode; win->fontNum = winConfig->fontNum; win->language = GAME_LANGUAGE; @@ -2342,7 +2344,7 @@ u8 sub_8003490(struct Window *win, u8 c, u16 tileDataStartOffset, u8 left, u8 to void sub_80034D4(u8 *tileData, const u8 *text) { - sub_8004E3C((struct WindowConfig *)&gWindowConfig_81E6C74, tileData, text); + sub_8004E3C(&gWindowConfig_81E6C74, tileData, text); } u8 sub_80034EC(u8 *str) @@ -3645,7 +3647,7 @@ void sub_8004E28(struct Window *win, u8 *foreground, u8 *background, u8 *shadow) *shadow = win->shadowColor; } -void sub_8004E3C(struct WindowConfig *winConfig, u8 *tileData, const u8 *text) +void sub_8004E3C(const struct WindowConfig *winConfig, u8 *tileData, const u8 *text) { sTempWindow.config = winConfig; InitWindow(&sTempWindow, text, 0, 0, 0); @@ -3653,7 +3655,7 @@ void sub_8004E3C(struct WindowConfig *winConfig, u8 *tileData, const u8 *text) sub_8002F44(&sTempWindow); } -u8 GetStringWidthGivenWindowConfig(struct WindowConfig *winConfig, const u8 *s) +u8 GetStringWidthGivenWindowConfig(const struct WindowConfig *winConfig, const u8 *s) { sTempWindow.config = winConfig; InitWindow(&sTempWindow, s, 0, 0, 0); diff --git a/src/text_window.c b/src/engine/text_window.c index 9a88789d1..9a88789d1 100644 --- a/src/text_window.c +++ b/src/engine/text_window.c diff --git a/src/tileset_anim.c b/src/engine/tileset_anim.c index 34685381d..f892e5e9a 100644 --- a/src/tileset_anim.c +++ b/src/engine/tileset_anim.c @@ -32,8 +32,8 @@ extern u8 *gTilesetAnimTable_BikeShop[]; struct Dma { - u8 *src; - u8 *dest; + void *src; + void *dest; u16 size; }; @@ -95,7 +95,7 @@ static void ClearTilesetAnimDmas(void) CpuFill32(0, &gTilesetAnimDmas, sizeof(gTilesetAnimDmas)); } -static void QueueTilesetAnimDma(u8 *src, u8 *dest, u16 size) +static void QueueTilesetAnimDma(void *src, void *dest, u16 size) { if (gNumTilesetAnimDmas < 20) { @@ -217,28 +217,28 @@ static void sub_8073070(u16 a1) { int v1; v1 = a1 % 4; - QueueTilesetAnimDma(gTilesetAnimTable_General_0[v1], (u8 *)(BG_VRAM + 0x3f80), 0x80); + QueueTilesetAnimDma(gTilesetAnimTable_General_0[v1], BG_TILE_ADDR(127), 0x80); } static void sub_8073098(u16 a1) { u8 v1; v1 = a1 % 8; - QueueTilesetAnimDma(gTilesetAnimTable_General_1[v1], (u8 *)(BG_VRAM + 0x3600), 0x3c0); + QueueTilesetAnimDma(gTilesetAnimTable_General_1[v1], BG_TILE_ADDR(108), 0x3c0); } static void sub_80730C0(u16 a1) { int v1; v1 = a1 % 8; - QueueTilesetAnimDma(gTilesetAnimTable_General_2[v1], (u8 *)(BG_VRAM + 0x3a00), 0x140); + QueueTilesetAnimDma(gTilesetAnimTable_General_2[v1], BG_TILE_ADDR(116), 0x140); } static void sub_80730E8(u16 a1) { int v1; v1 = a1 % 4; - QueueTilesetAnimDma(gTilesetAnimTable_General_3[v1], (u8 *)(BG_VRAM + 0x3e00), 0xc0); + QueueTilesetAnimDma(gTilesetAnimTable_General_3[v1], BG_TILE_ADDR(124), 0xc0); } void TilesetCB_Petalburg(void) @@ -454,37 +454,37 @@ static void sub_807361C(u16 a1) { int v1; v1 = a1 % 4; - QueueTilesetAnimDma(gTilesetAnimTable_General_4[v1], (u8 *)(BG_VRAM + 0x3c00), 0x140); + QueueTilesetAnimDma(gTilesetAnimTable_General_4[v1], BG_TILE_ADDR(120), 0x140); } static void sub_8073644(u8 a1) { u8 v1; v1 = a1 % 4; - QueueTilesetAnimDma(gTilesetAnimTable_Lavaridge[v1], (u8 *)(BG_VRAM + 0x6400), 0x80); + QueueTilesetAnimDma(gTilesetAnimTable_Lavaridge[v1], BG_TILE_ADDR(200), 0x80); v1 = (a1 + 2) % 4; - QueueTilesetAnimDma(gTilesetAnimTable_Lavaridge[v1], (u8 *)(BG_VRAM + 0x6480), 0x80); + QueueTilesetAnimDma(gTilesetAnimTable_Lavaridge[v1], BG_TILE_ADDR(201), 0x80); } static void sub_807368C(u8 a1) { int v1; v1 = a1 % 4; - QueueTilesetAnimDma(gTilesetAnimTable_Pacifidlog_0[v1], (u8 *)(BG_VRAM + 0x7a00), 0x3c0); + QueueTilesetAnimDma(gTilesetAnimTable_Pacifidlog_0[v1], BG_TILE_ADDR(244), 0x3c0); } static void sub_80736B4(u8 a1) { int v1; v1 = a1 % 4; - QueueTilesetAnimDma(gTilesetAnimTable_Underwater[v1], (u8 *)(BG_VRAM + 0x7e00), 0x80); + QueueTilesetAnimDma(gTilesetAnimTable_Underwater[v1], BG_TILE_ADDR(252), 0x80); } static void sub_80736DC(u8 a1) { int v1; v1 = a1 % 8; - QueueTilesetAnimDma(gTilesetAnimTable_Pacifidlog_1[v1], (u8 *)(BG_VRAM + 0x7e00), 0x100); + QueueTilesetAnimDma(gTilesetAnimTable_Pacifidlog_1[v1], BG_TILE_ADDR(252), 0x100); } static void sub_8073704(u16 a1, u8 a2) @@ -521,14 +521,14 @@ static void sub_80737E0(u16 a1) { int v1; v1 = a1 % 2; - QueueTilesetAnimDma(gTilesetAnimTable_Rustboro_1[v1], (u8 *)(BG_VRAM + 0x7800), 0x80); + QueueTilesetAnimDma(gTilesetAnimTable_Rustboro_1[v1], BG_TILE_ADDR(240), 0x80); } static void sub_8073808(u16 a1) { int v1; v1 = a1 % 4; - QueueTilesetAnimDma(gTilesetAnimTable_Cave[v1], (u8 *)(BG_VRAM + 0x5400), 0x80); + QueueTilesetAnimDma(gTilesetAnimTable_Cave[v1], BG_TILE_ADDR(168), 0x80); } static void sub_8073830(u16 a1, u8 a2) @@ -543,7 +543,7 @@ static void sub_8073868(u16 a1) { int v1; v1 = a1 % 4; - QueueTilesetAnimDma(gTilesetAnimTable_Cave[v1], (u8 *)(BG_VRAM + 0x7400), 0x80); + QueueTilesetAnimDma(gTilesetAnimTable_Cave[v1], BG_TILE_ADDR(232), 0x80); } static void sub_8073890(u16 a1) @@ -590,41 +590,41 @@ static void sub_8073904(u16 a1) { int v1; v1 = a1 % 2; - QueueTilesetAnimDma(gTilesetAnimTable_Building[v1], (u8 *)(BG_VRAM + 0x3e00), 0x80); + QueueTilesetAnimDma(gTilesetAnimTable_Building[v1], BG_TILE_ADDR(124), 0x80); } static void sub_807392C(u16 a1) { int v1; v1 = a1 % 3; - QueueTilesetAnimDma(gTilesetAnimTable_SootopolisGym_0[v1], (u8 *)(BG_VRAM + 0x7e00), 0x180); - QueueTilesetAnimDma(gTilesetAnimTable_SootopolisGym_1[v1], (u8 *)(BG_VRAM + 0x7a00), 0x280); + QueueTilesetAnimDma(gTilesetAnimTable_SootopolisGym_0[v1], BG_TILE_ADDR(252), 0x180); + QueueTilesetAnimDma(gTilesetAnimTable_SootopolisGym_1[v1], BG_TILE_ADDR(244), 0x280); } static void sub_8073974(u16 a1) { int v1; v1 = a1 % 4; - QueueTilesetAnimDma(gTilesetAnimTable_EliteFour_0[v1], (u8 *)(BG_VRAM + 0x7f00), 0x20); + QueueTilesetAnimDma(gTilesetAnimTable_EliteFour_0[v1], BG_TILE_ADDR(254), 0x20); } static void sub_807399C(u16 a1) { int v1; v1 = a1 % 2; - QueueTilesetAnimDma(gTilesetAnimTable_EliteFour_1[v1], (u8 *)(BG_VRAM + 0x7c00), 0x80); + QueueTilesetAnimDma(gTilesetAnimTable_EliteFour_1[v1], BG_TILE_ADDR(248), 0x80); } static void sub_80739C4(u16 a1) { int v1; v1 = a1 % 2; - QueueTilesetAnimDma(gTilesetAnimTable_MauvilleGym[v1], (u8 *)(BG_VRAM + 0x5200), 0x200); + QueueTilesetAnimDma(gTilesetAnimTable_MauvilleGym[v1], BG_TILE_ADDR(164), 0x200); } static void sub_80739EC(u16 a1) { int v1; v1 = a1 % 2; - QueueTilesetAnimDma(gTilesetAnimTable_BikeShop[v1], (u8 *)(BG_VRAM + 0x7e00), 0x120); + QueueTilesetAnimDma(gTilesetAnimTable_BikeShop[v1], BG_TILE_ADDR(252), 0x120); } diff --git a/src/time_events.c b/src/engine/time_events.c index accb03db8..accb03db8 100644 --- a/src/time_events.c +++ b/src/engine/time_events.c diff --git a/src/engine/trade.c b/src/engine/trade.c new file mode 100644 index 000000000..8fad94be8 --- /dev/null +++ b/src/engine/trade.c @@ -0,0 +1,5715 @@ +#include "global.h" +#include "name_string_util.h" +#include "string_util.h" +#include "text.h" +#include "main.h" +#include "species.h" +#include "items.h" +#include "moves.h" +#include "easy_chat.h" +#include "link.h" +#include "strings2.h" +#include "graphics.h" +#include "palette.h" +#include "task.h" +#include "menu.h" +#include "text_window.h" +#include "pokemon_icon.h" +#include "cable_club.h" +#include "party_menu.h" +#include "songs.h" +#include "sound.h" +#include "data2.h" +#include "pokemon_summary_screen.h" +#include "overworld.h" +#include "rom_8077ABC.h" +#include "daycare.h" +#include "event_data.h" +#include "strings.h" +#include "load_save.h" +#include "save.h" +#include "script.h" +#include "field_fadetransition.h" +#include "decompress.h" +#include "mail_data.h" +#include "evolution_scene.h" +#include "pokeball.h" +#include "pokedex.h" +#include "field_effect.h" +#include "util.h" +#include "battle_interface.h" +#include "trade.h" + +#ifdef ENGLISH +#define sub_804A96C_alt sub_804A96C +asm(".set sub_804A96C_alt, sub_804A96C"); +#endif + +#define Trade_SendData(ptr) (SendBlock(bitmask_all_link_players_but_self(), ptr->linkData, 20)) + +struct InGameTrade { + /*0x00*/ u8 name[11]; + /*0x0C*/ u16 species; + /*0x0E*/ u8 ivs[6]; + /*0x14*/ bool8 secondAbility; + /*0x18*/ u32 otId; + /*0x1C*/ u8 stats[5]; + /*0x24*/ u32 personality; + /*0x28*/ u16 heldItem; + /*0x2A*/ u8 mailNum; + /*0x2B*/ u8 otName[11]; + /*0x36*/ u8 otGender; + /*0x37*/ u8 sheen; + /*0x38*/ u16 playerSpecies; +}; + +struct UnkStructC { + /*0x00*/ u16 words[9]; + /*0x10*/ u8 string[8]; + /*0x1A*/ u8 otId[4]; + /*0x1E*/ u16 species; + /*0x20*/ u16 heldItem; +}; + +struct UnkStructD { + /*0x00*/ u8 filler_00[8]; + /*0x08*/ void *vramAddr; + /*0x0c*/ u8 filler_0c[4]; + /*0x10*/ u8 unk_10; + /*0x12*/ u16 unk_12[0x400]; +}; + +struct UnkStructE { + /*0x00*/ u8 unk_00; + /*0x02*/ u16 unk_02; + /*0x04*/ u8 unk_04; +}; + +struct TradeEwramSubstruct { + /*0x0000*/ u8 unk_0000; + /*0x0001*/ u8 unk_0001; + /*0x0004*/ struct Window window; + /*0x0034*/ u8 partyIcons[2][6]; + /*0x0040*/ u8 tradeMenuCursorSpriteIdx; + /*0x0041*/ u8 tradeMenuCursorPosition; + /*0x0042*/ u8 partyCounts[2]; + /*0x0044*/ u8 tradeMenuOptionsActive[13]; + /*0x0051*/ u8 unk_0051[2][6]; + /*0x005d*/ u8 unk_005d[2][6]; + /*0x005d*/ u8 unk_0069[2][6]; + /*0x0075*/ u8 unk_0075; + /*0x0076*/ u8 filler_0076[4]; + /*0x007a*/ u8 unk_007a; + /*0x007b*/ u8 unk_007b; + /*0x007c*/ u8 unk_007c; + /*0x007d*/ u8 unk_007d; + /*0x007e*/ u16 unk_007e; + /*0x0080*/ u8 unk_0080[2]; + /*0x0082*/ u8 unk_0082[2]; + /*0x0084*/ u8 unk_0084; + /*0x0085*/ u8 unk_0085; + /*0x0086*/ u8 unk_0086; + /*0x0087*/ u8 unk_0087; + /*0x0088*/ u8 filler_0088[2]; + /*0x008a*/ u8 unk_008a; + /*0x008c*/ u16 linkData[20]; + /*0x00b4*/ u8 unk_00b4; + /*0x00b5*/ u8 unk_00b5[11]; + /*0x00c0*/ u8 filler_00c0[8]; + /*0x00c8*/ struct UnkStructD unk_00c8; + /*0x08dc*/ struct UnkStructE unk_08dc[4]; + /*0x08fc*/ u8 filler_08fc[0x704]; +}; + +IWRAM_DATA u8 gUnknown_03000508[8]; + +struct UnkStructF { + u8 filler_0000[9]; + u8 unk_0009; + u8 filler_000a[0xff6]; +}; + +struct TradeEwramStruct { + /*0x00000*/ u8 filler_00000[0x7000]; + /*0x07000*/ struct TradeEwramSubstruct unk_07000; + /*0x08000*/ struct UnkStructF unk_08000; + /*0x09000*/ u8 filler_09000[0x4000]; + /*0x0d000*/ u8 tileBuffers[13][256]; + /*0x0dd00*/ u8 filler_0dd00[0x1300]; + /*0x0f000*/ struct TradeEwramSubstruct2 unk_0f000; +}; + +static void sub_8047EC0(void); +static void sub_804AFB8(const struct WindowConfig *, u8 *, const u8 *, u8); +static void sub_804ACD8(const u8 *, u8 *, u8); +static void nullsub_5(u8, u8); +static void sub_804AA88(void); +static void sub_804A964(struct UnkStructD *, void *); +static void sub_80489F4(void); +static void sub_804AA0C(u8); +static bool8 sub_8048D44(void); +static void sub_804AF84(void); +static bool8 sub_804ABF8(void); +static void sub_804ACF4(u8); +static void sub_804A41C(u8); +static void sub_8048C70(void); +static void sub_8048B0C(u8); +static void sub_804AE3C(u8); +static void sub_804AF10(void); +static void sub_80494D8(void); +static void sub_8048AB4(void); +static void sub_804A940(struct UnkStructD *); +static void sub_804B41C(void); +static void sub_8049DE0(void); +static void sub_804AB30(void); +static void sub_8049ED4(u8); +static void sub_804A6DC(u8); +static void sub_804A938(struct UnkStructD *); +static void sub_804A9F4(u8); +static void sub_804AA00(u8); +static void sub_8049E9C(u8); +static void sub_804AADC(u16, u8); +static void sub_804A80C(void); +static u8 sub_80499F0(const u8 *, u8, u8); +static void sub_804A840(u8); +#ifdef NONMATCHING +static +#endif +u8 sub_804A2B4(u8 *, u8, u8); +static void sub_804A96C_alt(struct UnkStructD *, u8, u8, const u16 *, u8, u8, u16); +static void sub_804A96C(struct UnkStructD *, u8, u8, const u16 *, u8, u8, u16); +#ifdef NONMATCHING +static +#endif +void sub_804A33C(u8 *, u8, u8); +#ifdef NONMATCHING +static +#endif +void sub_804A51C(u8, u8, u8, u8, u8, u8); +static void sub_804D7AC(struct Sprite *); +static bool8 sub_804C29C(void); +static void sub_804DC18(void); +static u8 sub_804B2B0(void); +static void sub_804E144(void); +static void sub_804E1A0(u8); +static void sub_804DAD4(struct MailStruct *, const struct InGameTrade *); +static void sub_804DC88(void); +static void sub_804D6BC(struct Sprite *); +static void sub_804D738(struct Sprite *); +static void sub_804BBE8(u8); +static void sub_804B058(struct Sprite *); +static void sub_804B07C(struct Sprite *); +static void sub_804B0BC(struct Sprite *); +static void sub_804B104(struct Sprite *); +static void sub_804D80C(struct Sprite *); +static void sub_804E1DC(void); +static void sub_804BBCC(void); +static void sub_804D8E4(void); +static void sub_804C164(void); +static void sub_804C1A8(void); +#ifdef NONMATCHING +static +#endif +void sub_804DB84(void); + +extern u8 gUnknown_020297D8[2]; +extern u8 *gUnknown_020296CC[13]; +extern struct TradeEwramSubstruct *gUnknown_03004824; +extern struct MailStruct gUnknown_02029700[16]; + +#define ewram_2010000 (*(struct TradeEwramStruct *)(ewram + 0x10000)) + + +const u32 unref_data_820ABD4[] = { + 0x00000890, + 0x00003AC0, + 0x0000001C, + 0x00000530, + 0x00000024, + 0x00000064, + 0x000004D8 +}; + +const u16 gTradeMovesBoxTilemap[] = INCBIN_U16("graphics/trade/moves_box_map.bin"); +const u16 gTradePartyBoxTilemap[] = INCBIN_U16("graphics/trade/party_box_map.bin"); +const u16 gTradeStripesBG2Tilemap[] = INCBIN_U16("graphics/trade/stripes_bg2_map.bin"); +const u16 gTradeStripesBG3Tilemap[] = INCBIN_U16("graphics/trade/stripes_bg3_map.bin"); + +const struct OamData gOamData_820BFEC = { + .shape = ST_OAM_H_RECTANGLE, + .size = 2, + .priority = 1 +}; + +const union AnimCmd gSpriteAnim_820BFF4[] = { + ANIMCMD_FRAME(0, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_820BFFC[] = { + ANIMCMD_FRAME(8, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_820C004[] = { + ANIMCMD_FRAME(16, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_820C00C[] = { + ANIMCMD_FRAME(24, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_820C014[] = { + ANIMCMD_FRAME(32, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_820C01C[] = { + ANIMCMD_FRAME(40, 5), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_820C024[] = { + gSpriteAnim_820BFF4, + gSpriteAnim_820BFFC, + gSpriteAnim_820C004, + gSpriteAnim_820C00C, + gSpriteAnim_820C014, + gSpriteAnim_820C01C +}; + +const u16 TradeScreenTextPalette[] = INCBIN_U16("graphics/trade/text1.gbapal"); +const u16 UnrefTradeScreenTextPalette[] = INCBIN_U16("graphics/trade/text2.gbapal"); + +const struct SpriteSheet gUnknown_0820C07C[] = { + {ewram_2010000.tileBuffers[ 0], 256, 200}, + {ewram_2010000.tileBuffers[ 1], 256, 201}, + {ewram_2010000.tileBuffers[ 2], 256, 202}, + {ewram_2010000.tileBuffers[ 3], 256, 203}, + {ewram_2010000.tileBuffers[ 4], 256, 204}, + {ewram_2010000.tileBuffers[ 5], 256, 205}, + {ewram_2010000.tileBuffers[ 6], 256, 206}, + {ewram_2010000.tileBuffers[ 7], 256, 207}, + {ewram_2010000.tileBuffers[ 8], 256, 208}, + {ewram_2010000.tileBuffers[ 9], 256, 209}, + {ewram_2010000.tileBuffers[10], 256, 210}, + {ewram_2010000.tileBuffers[11], 256, 211}, + {ewram_2010000.tileBuffers[12], 256, 212}, +}; + +const struct SpritePalette gSpritePalette_TradeScreenText = { + TradeScreenTextPalette, 4925 +}; + +const struct SpriteTemplate gSpriteTemplate_820C0EC = { + 200, + 4925, + &gOamData_820BFEC, + gSpriteAnimTable_820C024, + NULL, + gDummySpriteAffineAnimTable, + SpriteCallbackDummy +}; + +const struct OamData gOamData_820C104 = { + .shape = ST_OAM_H_RECTANGLE, + .size = 3, + .priority = 1 +}; + +const union AnimCmd gSpriteAnim_820C10C[] = { + ANIMCMD_FRAME(0, 5), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_820C114[] = { + ANIMCMD_FRAME(32, 5), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_820C11C[] = { + gSpriteAnim_820C10C, + gSpriteAnim_820C114 +}; + +const struct SpriteSheet gUnknown_0820C124 = { + gUnknown_08EA1DEC, 0x800, 300 +}; + +const struct SpritePalette gUnknown_0820C12C = { + gUnknown_08EA0328, 2345 +}; + +const struct SpriteTemplate gSpriteTemplate_820C134 = { + 300, + 2345, + &gOamData_820C104, + gSpriteAnimTable_820C11C, + NULL, + gDummySpriteAffineAnimTable, + SpriteCallbackDummy +}; + +const u8 *const gUnknown_0820C14C[] = { + TradeText_Cancel, + TradeText_ChoosePoke, + TradeText_Summary1, + TradeText_Trade1, + TradeText_CancelTradePrompt, + TradeText_PressBToExit +}; + +// This is used to determine the next mon to select when the D-Pad is +// pressed in a given direction. +// Note that the mons are laid out like this. +// 0-5 are the player's party and 6-11 are the trading partner's party. +// 12 is the cancel button. +// 0 1 6 7 +// 2 3 8 9 +// 4 5 10 11 +// 12 + +const u8 gTradeNextSelectedMonTable[][4][6] = { + { + { 4, 2, 12, 12, 0, 0}, + { 2, 4, 12, 12, 0, 0}, + { 7, 6, 1, 0, 0, 0}, + { 1, 6, 7, 0, 0, 0} + }, { + { 5, 3, 12, 12, 0, 0}, + { 3, 5, 12, 12, 0, 0}, + { 0, 7, 6, 1, 0, 0}, + { 6, 7, 0, 1, 0, 0} + }, { + { 0, 0, 0, 0, 0, 0}, + { 4, 0, 0, 0, 0, 0}, + { 9, 8, 7, 6, 0, 0}, + { 3, 1, 0, 0, 0, 0} + }, { + { 1, 1, 1, 1, 0, 0}, + { 5, 1, 1, 1, 0, 0}, + { 2, 9, 8, 7, 0, 0}, + { 8, 9, 6, 6, 0, 0} + }, { + { 2, 2, 2, 2, 0, 0}, + { 0, 0, 0, 0, 0, 0}, + {11, 10, 9, 8, 7, 6}, + { 5, 3, 1, 0, 0, 0} + }, { + { 3, 3, 3, 3, 0, 0}, + { 1, 1, 1, 1, 0, 0}, + { 4, 4, 4, 4, 0, 0}, + {10, 8, 6, 0, 0, 0} + }, { + {10, 8, 12, 0, 0, 0}, + { 8, 10, 12, 0, 0, 0}, + { 1, 0, 0, 0, 0, 0}, + { 7, 0, 1, 0, 0, 0} + }, { + {12, 0, 0, 0, 0, 0}, + { 9, 12, 0, 0, 0, 0}, + { 6, 0, 0, 0, 0, 0}, + { 0, 0, 0, 0, 0, 0} + }, { + { 6, 0, 0, 0, 0, 0}, + {10, 6, 0, 0, 0, 0}, + { 3, 2, 1, 0, 0, 0}, + { 9, 7, 0, 0, 0, 0} + }, { + { 7, 0, 0, 0, 0, 0}, + {11, 12, 0, 0, 0, 0}, + { 8, 0, 0, 0, 0, 0}, + { 2, 1, 0, 0, 0, 0} + }, { + { 8, 0, 0, 0, 0, 0}, + { 6, 0, 0, 0, 0, 0}, + { 5, 4, 3, 2, 1, 0}, + {11, 9, 7, 0, 0, 0} + }, { + { 9, 0, 0, 0, 0, 0}, + {12, 0, 0, 0, 0, 0}, + {10, 0, 0, 0, 0, 0}, + { 4, 2, 0, 0, 0, 0} + }, { + {11, 9, 7, 6, 0, 0}, + { 7, 6, 0, 0, 0, 0}, + {12, 0, 0, 0, 0, 0}, + {12, 0, 0, 0, 0, 0} + } +}; + +const u8 gTradeMonSpriteCoords[][2] = { + // Your party + {1, 5}, + {8, 5}, + {1, 10}, + {8, 10}, + {1, 15}, + {8, 15}, + + // Friend's party + {16, 5}, + {23, 5}, + {16, 10}, + {23, 10}, + {16, 15}, + {23, 15}, + + {23, 18} // CANCEL +}; + +const u8 gTradeLevelDisplayCoords[2][6][2] = { + { + // Your party + {5, 4}, + {12, 4}, + {5, 9}, + {12, 9}, + {5, 14}, + {12, 14}, + }, + { + // Friend's party + {20, 4}, + {27, 4}, + {20, 9}, + {27, 9}, + {20, 14}, + {27, 14} + } +}; + +const u8 gTradeMonBoxCoords[2][6][2] = { + { + // Your party + {1, 3}, + {8, 3}, + {1, 8}, + {8, 8}, + {1, 13}, + {8, 13}, + }, + { + // Friend's party + {16, 3}, + {23, 3}, + {16, 8}, + {23, 8}, + {16, 13}, + {23, 13} + } +}; + +const u8 gTradeUnknownSpriteCoords[][2][2] = { + { + { 59, 10}, + {179, 10}, + }, + { + { 59, 10}, + {179, 10} + } +}; + +const u8 *const gUnknown_0820C2F0[] = { + TradeText_LinkStandby, + TradeText_TradeCancelled, + TradeText_OnlyPoke, + TradeText_NonTradablePoke, + TradeText_WaitingForFriend, + TradeText_WantToTrade +}; + +const u8 gTradeMessageWindowRects[][4] = { + {8, 7, 22, 12}, + {8, 7, 22, 12}, + {6, 7, 24, 12}, + {6, 7, 24, 12}, + {8, 7, 22, 12}, + {7, 7, 23, 12} +}; + +const struct MenuAction2 gUnknown_0820C320[] = { + {TradeText_Summary2, sub_804A9F4}, + {TradeText_Trade2, sub_804AA00} +}; + +const u8 gUnknown_0820C330[][2] = { + { 0, 14}, + {15, 29} +}; + +const u8 gUnknown_0820C334[][2] = { + { 3, 5}, + { 3, 7}, + {18, 5}, + {18, 7} +}; + +const u8 gOtherText_Terminator[] = _(""); +const u8 gOtherText_MaleSymbol3[] = _("♂"); +const u8 gOtherText_FemaleSymbol3[] = _("♀"); +const u8 gOtherText_GenderlessSymbol[] = _("$"); + +u8 *const unref_data_820C344 = gTileBuffer; +const u8 unref_strings_820C348[][13] = { + _("かいめの そうしん"), + _("かいめの じゅしん"), + _("ポケモンアイコンセット"), + _("OBJテキストセット"), + _("セルセット"), + _("OBJテキストADD"), + _("システムメッセージADD"), + _("はいけいセット"), +}; + +const u8 gUnknown_0820C3B0[] = _("ヌケニン"); +const u8 unref_string_0820C3B5[] = _("こうかんせいりつ "); +const u8 unref_string_0820C3C3[] = _("だめだたらしいよ "); +const u8 gUnknown_0820C3D1[][2] = { + { 4, 3}, + {19, 3}, + { 0, 0} +}; + +const u16 gTradeBallPalette[] = INCBIN_U16("graphics/trade/ball.gbapal"); +const u32 gTradeBallTiles[] = INCBIN_U32("graphics/trade/ball.4bpp"); +const u16 gUnknown_0820C9F8[][16] = { + INCBIN_U16("graphics/trade/unknown.gbapal"), + INCBIN_U16("graphics/trade/gba.gbapal"), + INCBIN_U16("graphics/trade/shadow.gbapal"), + {}, + INCBIN_U16("graphics/trade/misc.gbapal") +}; + +const u32 gUnknown_0820CA98[] = INCBIN_U32("graphics/trade/gba.4bpp"); +const u32 gUnknown_0820CA98_2[] = INCBIN_U32("graphics/trade/shadow.4bpp"); +const u32 gUnknown_0820DD98[] = INCBIN_U32("graphics/trade/pokeball_symbol.8bpp"); +const u16 gUnknown_0820F798[] = INCBIN_U16("graphics/trade/shadow_map.bin"); +const u16 gUnknown_08210798[] = INCBIN_U16("graphics/trade/gba_map.bin"); +const u16 gUnknown_08211798[] = INCBIN_U16("graphics/trade/cable_closeup_map.bin"); +const u16 gUnknown_08211F98[] = INCBIN_U16("graphics/trade/pokeball_symbol_map.bin"); +const u16 unused_08212098[] = INCBIN_U16("graphics/unused/unknown/8212098.gbapal"); +const u16 gTradeCableEndPalette[] = INCBIN_U16("graphics/trade/cable_end.gbapal"); +const u16 unused_082120D8[] = INCBIN_U16("graphics/unused/unknown/82120D8.gbapal"); +const u16 nullpal_082120F8[16] = {}; +const u16 gTradeGlowPalette[] = INCBIN_U16("graphics/trade/glow.gbapal"); +const u32 gTradeGlow1Tiles[] = INCBIN_U32("graphics/trade/glow1.4bpp"); +const u32 gTradeGlow2Tiles[] = INCBIN_U32("graphics/trade/glow2.4bpp"); +const u32 gTradeCableEndTiles[] = INCBIN_U32("graphics/trade/cable_end.4bpp"); +const u32 gTradeGBAScreenTiles[] = INCBIN_U32("graphics/trade/gba_screen.4bpp"); +const u32 gUnknown_08213738[] = INCBIN_U32("graphics/trade/gba_affine.8bpp"); +const u16 gUnknown_08215778[] = INCBIN_U16("graphics/trade/gba_affine_map.bin"); + +const struct OamData gOamData_8215878 = { + .affineMode = 1, + .size = 1 +}; + +const union AnimCmd gSpriteAnim_8215880[] = { + ANIMCMD_FRAME( 0, 3), + ANIMCMD_FRAME( 4, 3), + ANIMCMD_FRAME( 8, 3), + ANIMCMD_FRAME(12, 3), + ANIMCMD_FRAME(16, 3), + ANIMCMD_FRAME(20, 3), + ANIMCMD_FRAME(24, 3), + ANIMCMD_FRAME(28, 3), + ANIMCMD_FRAME(32, 3), + ANIMCMD_FRAME(36, 3), + ANIMCMD_FRAME(40, 3), + ANIMCMD_FRAME(44, 3), + ANIMCMD_LOOP(1), + ANIMCMD_FRAME( 0, 3), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_82158BC[] = { + ANIMCMD_FRAME( 0, 3), + ANIMCMD_FRAME( 4, 3), + ANIMCMD_FRAME( 8, 3), + ANIMCMD_FRAME(12, 3), + ANIMCMD_FRAME(16, 3), + ANIMCMD_FRAME(20, 3), + ANIMCMD_FRAME(24, 3), + ANIMCMD_FRAME(28, 3), + ANIMCMD_FRAME(32, 3), + ANIMCMD_FRAME(36, 3), + ANIMCMD_FRAME(40, 3), + ANIMCMD_FRAME(44, 3), + ANIMCMD_LOOP(2), + ANIMCMD_FRAME( 0, 3), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_82158F8[] = { + gSpriteAnim_8215880, + gSpriteAnim_82158BC +}; + +const union AffineAnimCmd gSpriteAffineAnim_8215900[] = { + AFFINEANIMCMD_FRAME(0, 0, 0, 1), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd gSpriteAffineAnim_8215910[] = { + AFFINEANIMCMD_FRAME(-8, 0, 0, 20), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd gSpriteAffineAnim_8215920[] = { + AFFINEANIMCMD_FRAME(0x60, 0x100, 0, 0), + AFFINEANIMCMD_FRAME( 0, 0, 0, 5), + AFFINEANIMCMD_FRAME( 8, 0, 0, 20), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_8215940[] = { + gSpriteAffineAnim_8215900, + gSpriteAffineAnim_8215910, + gSpriteAffineAnim_8215920 +}; + +const struct SpriteSheet gUnknown_0821594C = { + (const u8 *)gTradeBallTiles, 0x600, 5557 +}; + +const struct SpritePalette gUnknown_08215954 = { + gTradeBallPalette, 5558 +}; + +const struct SpriteTemplate gSpriteTemplate_821595C = { + 5557, + 5558, + &gOamData_8215878, + gSpriteAnimTable_82158F8, + NULL, + gSpriteAffineAnimTable_8215940, + sub_804D6BC +}; + +const struct OamData gOamData_8215974 = { + .affineMode = 1, + .objMode = 1, + .size = 2, + .priority = 1 +}; + +const union AnimCmd gSpriteAnim_821597C[] = { + ANIMCMD_FRAME(0, 5, .hFlip = TRUE, .vFlip = TRUE), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_8215984[] = { + gSpriteAnim_821597C +}; + +const union AffineAnimCmd gSpriteAffineAnim_8215988[] = { + AFFINEANIMCMD_FRAME(-10, -10, 0, 5), + AFFINEANIMCMD_FRAME(10, 10, 0, 5), + AFFINEANIMCMD_JUMP(0) +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_82159A0[] = { + gSpriteAffineAnim_8215988 +}; + +const struct SpriteSheet gUnknown_082159A4 = { + (const u8 *)gTradeGlow1Tiles, 0x200, 5550 +}; + +const struct SpritePalette gUnknown_082159AC = { + gTradeGlowPalette, 5551 +}; + +const struct SpritePalette gUnknown_082159B4 = { + gTradeCableEndPalette, 5555 +}; + +const struct SpriteTemplate gSpriteTemplate_82159BC = { + 5550, + 5551, + &gOamData_8215974, + gSpriteAnimTable_8215984, + NULL, + gSpriteAffineAnimTable_82159A0, + sub_804B058 +}; + +const struct OamData gOamData_82159D4 = { + .shape = ST_OAM_V_RECTANGLE, + .size = 2, + .priority = 1 +}; + +const union AnimCmd gSpriteAnim_82159DC[] = { + ANIMCMD_FRAME(0, 5, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_82159E4[] = { + ANIMCMD_FRAME(8, 5, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_82159EC[] = { + gSpriteAnim_82159DC, + gSpriteAnim_82159E4 +}; + +const struct SpriteSheet gUnknown_082159F4 = { + (const u8 *)gTradeGlow2Tiles, 0x300, 5552 +}; + +const struct SpriteTemplate gSpriteTemplate_82159FC = { + 5552, + 5551, + &gOamData_82159D4, + gSpriteAnimTable_82159EC, + NULL, + gDummySpriteAffineAnimTable, + sub_804B07C +}; + +const struct OamData gOamData_8215A14 = { + .shape = ST_OAM_V_RECTANGLE, + .size = 2, + .priority = 1 +}; + +const union AnimCmd gSpriteAnim_8215A1C[] = { + ANIMCMD_FRAME(0, 10), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_8215A24[] = { + gSpriteAnim_8215A1C +}; + +const struct SpriteSheet gUnknown_08215A28 = { + (const u8 *)gTradeCableEndTiles, 0x100, 5554 +}; + +const struct SpriteTemplate gSpriteTemplate_8215A30 = { + 5554, + 5555, + &gOamData_8215A14, + gSpriteAnimTable_8215A24, + NULL, + gDummySpriteAffineAnimTable, + sub_804B0BC +}; + +const struct OamData gOamData_8215A48 = { + .shape = ST_OAM_H_RECTANGLE, + .size = 3, + .priority = 1 +}; + +const union AnimCmd gSpriteAnim_8215A50[] = { + ANIMCMD_FRAME( 0, 2, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME(32, 2, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME(64, 2, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME(96, 2, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME(64, 2, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME(32, 2, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME( 0, 2, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_LOOP(8), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_8215A74[] = { + gSpriteAnim_8215A50 +}; + +const struct SpriteSheet gUnknown_08215A78 = { + (const u8 *)gTradeGBAScreenTiles, 0x1000, 5556 +}; + +const struct SpriteTemplate gSpriteTemplate_8215A80 = { + 5556, + 5555, + &gOamData_8215A48, + gSpriteAnimTable_8215A74, + NULL, + gDummySpriteAffineAnimTable, + sub_804B104 +}; + +const u16 gTradeGlow2PaletteAnimTable[] = { + RGB(18, 24, 31), + RGB(18, 24, 31), + RGB(18, 24, 31), + RGB(31, 31, 31), + RGB(31, 31, 31), + RGB(31, 31, 31), + RGB(18, 24, 31), + RGB(18, 24, 31), + RGB(18, 24, 31), + RGB(31, 31, 31), + RGB(31, 31, 31), + RGB(31, 31, 31), +}; + +const union AffineAnimCmd gSpriteAffineAnim_8215AB0[] = { + AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), + AFFINEANIMCMD_JUMP(0) +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_8215AC0[] = { + gSpriteAffineAnim_8215AB0 +}; + +const struct InGameTrade gIngameTrades[] = { +#if ENGLISH + { + _("MAKIT"), SPECIES_MAKUHITA, + 5, 5, 4, 4, 4, 4, + TRUE, 49562, + 5, 5, 5, 5, 30, + 0x9C40, + ITEM_X_ATTACK, -1, + _("ELYSSA"), MALE, 10, + SPECIES_SLAKOTH + }, { + _("SKITIT"), SPECIES_SKITTY, + 5, 4, 4, 5, 4, 4, + FALSE, 2259, + 5, 5, 30, 5, 5, + 0x498A2E17, + ITEM_GLITTER_MAIL, 0, + _("DARRELL"), FEMALE, 10, + SPECIES_PIKACHU + }, { + _("COROSO"), + SPECIES_CORSOLA, + 4, 4, 5, 4, 4, 5, + TRUE, 50183, + 5, 30, 5, 5, 5, + 0x4C970B7F, + ITEM_TROPIC_MAIL, 1, + _("LANE"), FEMALE, 10, + SPECIES_BELLOSSOM + } +#elif GERMAN + { + _("MAKIT"), SPECIES_MAKUHITA, + 5, 5, 4, 4, 4, 4, + TRUE, 49562, + 5, 5, 5, 5, 30, + 0x9C40, + ITEM_X_ATTACK, -1, + _("MAIK"), MALE, 10, + SPECIES_SLAKOTH + }, { + _("CONEC"), SPECIES_SKITTY, + 5, 4, 4, 5, 4, 4, + FALSE, 2259, + 5, 5, 30, 5, 5, + 0x498A2E17, + ITEM_GLITTER_MAIL, 0, + _("MADINA"), FEMALE, 10, + SPECIES_PIKACHU + }, { + _("CORASO"), + SPECIES_CORSOLA, + 4, 4, 5, 4, 4, 5, + TRUE, 50183, + 5, 30, 5, 5, 5, + 0x4C970B7F, + ITEM_TROPIC_MAIL, 1, + _("LIANA"), FEMALE, 10, + SPECIES_BELLOSSOM + } +#endif +}; + +const u16 gIngameTradeMail[][10] = { +#if ENGLISH + { + EC_POKEMON(PIKACHU), + EC_WORD_THANK_YOU, + EC_WORD_EXCL, + EC_WORD_MY, + EC_POKEMON(SKITTY), + EC_WORD_EATS, + EC_WORD_A_LOT, + EC_WORD_NOW, + EC_WORD_EXCL, + 0 + }, { + EC_WORD_I, + EC_WORD_WANT, + EC_WORD_TO, + EC_WORD_SEE, + EC_WORD_A, + EC_MOVE2(PETAL_DANCE), + EC_WORD_IT_S, + EC_WORD_SO, + EC_WORD_PRETTY, + 0 + } +#elif GERMAN + { + EC_POKEMON(PIKACHU), + EC_WORD_THANK_YOU, + EC_WORD_EXCL, + EC_WORD_MY, + EC_POKEMON(SKITTY), + EC_WORD_EATS, + 0xFFFF, + EC_WORD_A_LOT, + EC_WORD_EXCL, + 0 + }, { + EC_WORD_I, + EC_WORD_WANT, + EC_WORD_OF, + EC_MOVE2(PETAL_DANCE), + EC_WORD_WORKS, + EC_WORD_THE, + EC_WORD_IS, + EC_WORD_SO, + EC_WORD_PRETTY, + 0 + } +#endif +}; + +const s8 gTradeBallVerticalVelocityTable[] = { + 0, 0, 1, 0, + 1, 0, 1, 1, + 1, 1, 2, 2, + 2, 2, 3, 3, + 3, 3, 4, 4, + 4, 4, -4, -4, + -4, -3, -3, -3, + -3, -2, -2, -2, + -2, -1, -1, -1, + -1, 0, -1, 0, + -1, 0, 0, 0, + 0, 0, 1, 0, + 1, 0, 1, 1, + 1, 1, 2, 2, + 2, 2, 3, 3, + 3, 3, 4, 4, + 4, 4, -4, -3, + -3, -2, -2, -1, + -1, -1, 0, -1, + 0, 0, 0, 0, + 0, 0, 1, 0, + 1, 1, 1, 2, + 2, 3, 3, 4, + -4, -3, -2, -1, + -1, -1, 0, 0, + 0, 0, 1, 0, + 1, 1, 2, 3 +}; + +// .text + +void sub_8047CD8(void) +{ + SetMainCallback2(sub_8047EC0); +} + +static void sub_8047CE8(void) +{ + u8 mpId; + sub_804AFB8(&gWindowConfig_81E725C, gUnknown_020296CC[0], gSaveBlock2.playerName, 0xC); + mpId = GetMultiplayerId(); + sub_804AFB8(&gWindowConfig_81E725C, gUnknown_020296CC[3], gLinkPlayers[mpId ^ 1].name, 0xC); + sub_804AFB8(&gWindowConfig_81E725C, gUnknown_020296CC[6], gUnknown_0820C14C[0], 0x8); + sub_804ACD8(gUnknown_0820C14C[1], gUnknown_020296CC[8], 0x14); + nullsub_5(3, 0); +} + +static void sub_8047D58(void) +{ + struct SpriteTemplate spriteTemplate; + int i; + u8 mpId; + u16 slen; + int language; + + slen = StringLength(gSaveBlock2.playerName); + language = slen <= 5 ? 0 : 1; + for (i = 0; i < 3; i ++) + { + spriteTemplate = gSpriteTemplate_820C0EC; + spriteTemplate.tileTag += i; + CreateSprite(&spriteTemplate, gTradeUnknownSpriteCoords[language][0][0] + 32 * i, gTradeUnknownSpriteCoords[language][0][1], 1); + } + + mpId = GetMultiplayerId(); + slen = StringLength(gLinkPlayers[mpId ^ 1].name); + language = slen <= 5 ? 0 : 1; + for (i = 0; i < 3; i ++) + { + spriteTemplate = gSpriteTemplate_820C0EC; + spriteTemplate.tileTag += i + 3; + CreateSprite(&spriteTemplate, gTradeUnknownSpriteCoords[language][1][0] + 32 * i, gTradeUnknownSpriteCoords[language][1][1], 1); + } + nullsub_5(5, 0); +} + +static void sub_8047E44(void) +{ + struct SpriteTemplate spriteTemplate; + int i; + + for (i = 0; i < 2; i ++) + { + spriteTemplate = gSpriteTemplate_820C0EC; + spriteTemplate.tileTag += i + 6; + CreateSprite(&spriteTemplate, 0xd6 + 32 * i, 0x98, 1); + } + + for (i = 0; i < 5; i ++) + { + spriteTemplate = gSpriteTemplate_820C0EC; + spriteTemplate.tileTag += i + 8; + CreateSprite(&spriteTemplate, 0x18 + 32 * i, 0x96, 1); + } +} + +static void sub_8047EC0(void) +{ + int i; + + switch (gMain.state) + { + case 0: + gUnknown_03004824 = &ewram_2010000.unk_07000; + sub_804AA88(); + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetTasks(); + sub_804A964(&gUnknown_03004824->unk_00c8, BG_SCREEN_ADDR(5)); + SetVBlankCallback(sub_80489F4); + InitMenuWindow(&gWindowConfig_81E6CE4); + SetUpWindowConfig(&gWindowConfig_81E6F84); + InitWindowFromConfig(&gUnknown_03004824->window, &gWindowConfig_81E6F84); + gUnknown_03004824->unk_007a = SetTextWindowBaseTileNum(20); + LoadTextWindowGraphics(&gUnknown_03004824->window); + MenuZeroFillScreen(); + sub_809D51C(); + gUnknown_03004824->unk_0075 = 0; + gUnknown_03004824->unk_007b = 0; + gUnknown_03004824->unk_007c = 0; + gUnknown_03004824->unk_0080[0] = 0; + gUnknown_03004824->unk_0080[1] = 0; + gUnknown_03004824->unk_0086 = 0; + gUnknown_03004824->unk_0087 = 0; + gUnknown_03004824->unk_00b4 = 0; + gUnknown_03000508[0] = 0; + gMain.state ++; + sub_804AA0C(0); + CpuFill16(0, ewram_2010000.tileBuffers, sizeof(ewram_2010000.tileBuffers)); + for (i = 0; i < 13; i ++) + gUnknown_020296CC[i] = ewram_2010000.tileBuffers[i]; + break; + case 1: + gLinkType = 0x1122; + OpenLink(); + for (i = 0; i < PARTY_SIZE; i ++) + CreateMon(&gEnemyParty[i], 0, 0, 0x20, FALSE, 0, FALSE, 0); + gMain.state ++; + gUnknown_03004824->unk_00b4 = 0; + CreateTask(sub_8083C50, 1); + break; + case 2: + gUnknown_03004824->unk_00b4 ++; + if (gUnknown_03004824->unk_00b4 > 11) + { + gUnknown_03004824->unk_00b4 = 0; + gMain.state ++; + } + break; + case 3: + if (GetLinkPlayerCount_2() >= sub_800820C()) + { + if (IsLinkMaster()) + { + if (++gUnknown_03004824->unk_00b4 > 30) + { + sub_8007F4C(); + gMain.state ++; + } + } + else + gMain.state ++; + } + break; + case 4: + if (gReceivedRemoteLinkPlayers == 1 && IsLinkPlayerDataExchangeComplete() == TRUE) + { + CalculatePlayerPartyCount(); + gMain.state ++; + } + break; + case 5: + if (sub_8048D44()) + { + sub_804AF84(); + gMain.state ++; + } + break; + case 6: + CalculateEnemyPartyCount(); + FillWindowRect_DefaultPalette(&gUnknown_03004824->window, 0, 0, 0, 29, 19); + REG_DISPCNT = 0; + gUnknown_03004824->partyCounts[0] = gPlayerPartyCount; + gUnknown_03004824->partyCounts[1] = gEnemyPartyCount; + for (i = 0; i < gUnknown_03004824->partyCounts[0]; i ++) + gUnknown_03004824->partyIcons[0][i] = CreateMonIcon(GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2), sub_809D62C, gTradeMonSpriteCoords[i][0] * 8 + 14, gTradeMonSpriteCoords[i][1] * 8 - 12, TRUE, GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY)); + for (i = 0; i < gUnknown_03004824->partyCounts[1]; i ++) + gUnknown_03004824->partyIcons[1][i] = CreateMonIcon(GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2, NULL), sub_809D62C, gTradeMonSpriteCoords[6 + i][0] * 8 + 14, gTradeMonSpriteCoords[6 + i][1] * 8 - 12, TRUE, GetMonData(&gEnemyParty[i], MON_DATA_PERSONALITY)); + nullsub_5(2, 0); + gMain.state ++; + break; + case 7: + LoadHeldItemIconGraphics(); + CreateHeldItemIcons(&gUnknown_03004824->partyCounts[0], gUnknown_03004824->partyIcons[0], 0); + gMain.state ++; + break; + case 8: + CreateHeldItemIcons(&gUnknown_03004824->partyCounts[0], gUnknown_03004824->partyIcons[0], 1); + gMain.state ++; + break; + case 9: + sub_8047CE8(); + gMain.state ++; + gUnknown_03004824->unk_00b4 = 0; + break; + case 10: + nullsub_5(4, 0); + if (sub_804ABF8()) + gMain.state ++; + break; + case 11: + sub_8047D58(); + gMain.state ++; + break; + case 12: + sub_8047E44(); + gUnknown_03004824->tradeMenuCursorSpriteIdx = CreateSprite(&gSpriteTemplate_820C134, gTradeMonSpriteCoords[0][0] * 8 + 32, gTradeMonSpriteCoords[0][1] * 8, 2); + gUnknown_03004824->tradeMenuCursorPosition = 0; + gMain.state ++; + nullsub_5(6, 0); + break; + case 13: + sub_804ACF4(0); + sub_804A41C(0); + gUnknown_03004824->unk_0000 = 0; + gUnknown_03004824->unk_0001 = 0; + sub_8048C70(); + gMain.state ++; + nullsub_5(7, 0); + PlayBGM(BGM_P_SCHOOL); + break; + case 14: + sub_804ACF4(1); + sub_804A41C(1); + gMain.state ++; + // fallthrough + case 15: + sub_8048B0C(0); + gMain.state ++; + break; + case 16: + sub_8048B0C(1); + gMain.state ++; + break; + case 17: + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + gMain.state ++; + break; + case 18: + REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; + gMain.state ++; + break; + case 19: + sub_804AE3C(0); + gMain.state ++; + break; + case 20: + sub_804AE3C(1); + sub_804AF10(); + gMain.state ++; + break; + case 21: + if (!gPaletteFade.active) + { + gMain.callback1 = sub_80494D8; + SetMainCallback2(sub_8048AB4); + gUnknown_03000508[0] = 0; + } + break; + } + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_80484F4(void) +{ + int i; + struct UnkStructF *unkStructF; + + switch (gMain.state) + { + case 0: + gUnknown_03004824 = &ewram_2010000.unk_07000; + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetTasks(); + sub_804A964(&gUnknown_03004824->unk_00c8, BG_SCREEN_ADDR(5)); + SetVBlankCallback(sub_80489F4); + InitMenuWindow(&gWindowConfig_81E6CE4); + SetUpWindowConfig(&gWindowConfig_81E6F84); + InitWindowFromConfig(&gUnknown_03004824->window, &gWindowConfig_81E6F84); + gUnknown_03004824->unk_007a = SetTextWindowBaseTileNum(20); + LoadTextWindowGraphics(&gUnknown_03004824->window); + MenuZeroFillScreen(); + sub_809D51C(); + gUnknown_03004824->unk_0075 = 0; + gUnknown_03004824->unk_007b = 0; + gUnknown_03004824->unk_007c = 0; + gUnknown_03004824->unk_0080[0] = 0; + gUnknown_03004824->unk_0080[1] = 0; + gUnknown_03004824->unk_0086 = 0; + gUnknown_03004824->unk_0087 = 0; + gUnknown_03004824->unk_00b4 = 0; + gUnknown_03000508[0] = 0; + gMain.state ++; + for (i = 0; i < 13; i ++) + gUnknown_020296CC[i] = ewram_2010000.tileBuffers[i]; + break; + case 1: + gMain.state ++; + gUnknown_03004824->unk_00b4 = 0; + break; + case 2: + gMain.state ++; + break; + case 3: + gMain.state ++; + break; + case 4: + CalculatePlayerPartyCount(); + gMain.state ++; + break; + case 5: + gMain.state ++; + break; + case 6: + CalculateEnemyPartyCount(); + REG_DISPCNT = 0; + gUnknown_03004824->partyCounts[0] = gPlayerPartyCount; + gUnknown_03004824->partyCounts[1] = gEnemyPartyCount; + sub_804A41C(0); + sub_804A41C(1); + for (i = 0; i < gUnknown_03004824->partyCounts[0]; i ++) + gUnknown_03004824->partyIcons[0][i] = CreateMonIcon(GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL), sub_809D62C, gTradeMonSpriteCoords[i][0] * 8 + 14, gTradeMonSpriteCoords[i][1] * 8 - 12, TRUE, GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY)); + for (i = 0; i < gUnknown_03004824->partyCounts[1]; i ++) + gUnknown_03004824->partyIcons[1][i] = CreateMonIcon(GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2, NULL), sub_809D62C, gTradeMonSpriteCoords[6 + i][0] * 8 + 14, gTradeMonSpriteCoords[6 + i][1] * 8 - 12, TRUE, GetMonData(&gEnemyParty[i], MON_DATA_PERSONALITY)); + nullsub_5(2, 0); + gMain.state ++; + break; + case 7: + LoadHeldItemIconGraphics(); + CreateHeldItemIcons(&gUnknown_03004824->partyCounts[0], gUnknown_03004824->partyIcons[0], 0); + gMain.state ++; + break; + case 8: + CreateHeldItemIcons(&gUnknown_03004824->partyCounts[0], gUnknown_03004824->partyIcons[0], 1); + gMain.state ++; + break; + case 9: + sub_8047CE8(); + gMain.state ++; + gUnknown_03004824->unk_00b4 = 0; + break; + case 10: + nullsub_5(4, 0); + if (sub_804ABF8()) + { + gMain.state ++; + } + break; + case 11: + sub_8047D58(); + gMain.state ++; + break; + case 12: + sub_8047E44(); + unkStructF = &ewram_2010000.unk_08000; + if (gUnknown_03004824->tradeMenuCursorPosition < 6) + gUnknown_03004824->tradeMenuCursorPosition = unkStructF->unk_0009; + else + gUnknown_03004824->tradeMenuCursorPosition = unkStructF->unk_0009 + 6; + gUnknown_03004824->tradeMenuCursorSpriteIdx = CreateSprite(&gSpriteTemplate_820C134, gTradeMonSpriteCoords[gUnknown_03004824->tradeMenuCursorPosition][0] * 8 + 32, gTradeMonSpriteCoords[gUnknown_03004824->tradeMenuCursorPosition][1] * 8, 2); + gMain.state = 15; + nullsub_5(6, 0); + break; + case 15: + sub_8048B0C(0); + gMain.state ++; + break; + case 16: + sub_8048B0C(1); + gUnknown_03004824->unk_0000 = 0; + gUnknown_03004824->unk_0001 = 0; + sub_8048C70(); + nullsub_5(7, 0); + gMain.state ++; + break; + case 17: + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + gMain.state ++; + break; + case 18: + REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; + gMain.state ++; + break; + case 19: + gMain.state ++; + break; + case 20: + sub_804AF10(); + gMain.state ++; + break; + case 21: + if (!gPaletteFade.active) + { + SetMainCallback2(sub_8048AB4); + gUnknown_03000508[0] = 0; + } + break; + } + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_80489F4(void) +{ + sub_804A940(&gUnknown_03004824->unk_00c8); + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +/*static*/ void sub_8048A14(void) +{ + if (++gUnknown_03004824->unk_00b4 >= 16) + { + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gUnknown_03004824->unk_007b = 10; + } +} + +/*static*/ void sub_8048A50(void) +{ + if (!gPaletteFade.active) + { + gUnknown_020297D8[0] = gUnknown_03004824->tradeMenuCursorPosition; + gUnknown_020297D8[1] = gUnknown_03004824->unk_008a; + sub_800832C(); + gUnknown_03004824->unk_007b = 13; + } +} + +/*static*/ void sub_8048A90(void) +{ + if (!gReceivedRemoteLinkPlayers) + { + gMain.callback1 = NULL; + SetMainCallback2(sub_804B41C); + } +} + +static void sub_8048AB4(void) +{ + sub_8049DE0(); + sub_804AB30(); + sub_8049ED4(0); + sub_8049ED4(1); + REG_BG2HOFS = gUnknown_03004824->unk_0000++; + REG_BG3HOFS = gUnknown_03004824->unk_0001--; + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +#ifdef NONMATCHING +// Only minor register permutations +#pragma push_macro("BLOCKSIZE") +#define BLOCKSIZE 0x800 +static void sub_8048B0C(u8 a0) +{ + int i; + u16 *dest; + const u16 *src; + u32 size; + switch (a0) + { + case 0: + for (i = 0; i < 48; i ++) + { + gPlttBufferUnfaded[i] = *(gUnknown_08EA02C8 + i); + gPlttBufferFaded[i] = *(gUnknown_08EA02C8 + i); + } + src = gUnknown_08EA0348; + dest = (u16 *)BG_VRAM; + size = 0x1280; + while (1) + { + DmaCopy16(3, src, dest, BLOCKSIZE * sizeof(u16)); + src += BLOCKSIZE; + dest += BLOCKSIZE; + size -= BLOCKSIZE * sizeof(u16); + if (size <= BLOCKSIZE * sizeof(u16)) + { + DmaCopy16(3, src, dest, size); + break; + } + } + for (i = 0; i < 0x400; i ++) + gUnknown_03004824->unk_00c8.unk_12[i] = gUnknown_08EA15C8[i]; + dest = BG_SCREEN_ADDR(6); + DmaCopy16(3, gTradeStripesBG2Tilemap, dest, 0x800); + break; + case 1: + src = gTradeStripesBG3Tilemap; + dest = BG_SCREEN_ADDR(7); + DmaCopy16(3, src, dest, 0x800); + sub_804A6DC(0); + sub_804A6DC(1); + sub_804A938(&gUnknown_03004824->unk_00c8); + REG_BG0CNT &= ~0x03; // BGCNT_PRIORITY(0) + REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(5); + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(6); + REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_SCREENBASE(7); + REG_BG0HOFS = 0; + REG_BG1HOFS = 0; + REG_BG2HOFS = 0; + REG_BG3HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1VOFS = 0; + REG_BG2VOFS = 0; + REG_BG3VOFS = 0; + break; + } +} +#pragma pop_macro("BLOCKSIZE") +#else +asm(".include \"constants/gba_constants.inc\""); +__attribute__((naked)) +static void sub_8048B0C(u8 a0) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _08048B1C\n" + "\tcmp r0, 0x1\n" + "\tbeq _08048BD0\n" + "\tb _08048C3A\n" + "_08048B1C:\n" + "\tldr r5, _08048BA0 @ =gUnknown_08EA0348\n" + "\tldr r0, _08048BA4 @ =gTradeStripesBG2Tilemap\n" + "\tmov r12, r0\n" + "\tldr r1, _08048BA8 @ =gUnknown_08EA02C8\n" + "\tldr r4, _08048BAC @ =gPlttBufferFaded\n" + "\tldr r3, _08048BB0 @ =gPlttBufferUnfaded\n" + "\tmovs r2, 0x2F\n" + "_08048B2A:\n" + "\tldrh r0, [r1]\n" + "\tstrh r0, [r3]\n" + "\tldrh r0, [r1]\n" + "\tstrh r0, [r4]\n" + "\tadds r1, 0x2\n" + "\tadds r4, 0x2\n" + "\tadds r3, 0x2\n" + "\tsubs r2, 0x1\n" + "\tcmp r2, 0\n" + "\tbge _08048B2A\n" + "\tadds r3, r5, 0\n" + "\tmovs r4, 0xC0\n" + "\tlsls r4, 19\n" + "\tmovs r5, 0x94\n" + "\tlsls r5, 5\n" + "\tldr r1, _08048BB4 @ =0x040000d4\n" + "\tldr r6, _08048BB8 @ =0x80000800\n" + "\tmovs r2, 0x80\n" + "\tlsls r2, 5\n" + "\tmovs r7, 0x80\n" + "\tlsls r7, 24\n" + "_08048B54:\n" + "\tstr r3, [r1]\n" + "\tstr r4, [r1, 0x4]\n" + "\tstr r6, [r1, 0x8]\n" + "\tldr r0, [r1, 0x8]\n" + "\tadds r3, r2\n" + "\tadds r4, r2\n" + "\tsubs r5, r2\n" + "\tcmp r5, r2\n" + "\tbhi _08048B54\n" + "\tstr r3, [r1]\n" + "\tstr r4, [r1, 0x4]\n" + "\tlsrs r0, r5, 1\n" + "\torrs r0, r7\n" + "\tstr r0, [r1, 0x8]\n" + "\tldr r0, [r1, 0x8]\n" + "\tmovs r2, 0\n" + "\tldr r5, _08048BBC @ =0x000003ff\n" + "\tldr r4, _08048BC0 @ =gUnknown_03004824\n" + "\tldr r3, _08048BC4 @ =gUnknown_08EA15C8\n" + "_08048B7A:\n" + "\tldr r0, [r4]\n" + "\tlsls r1, r2, 1\n" + "\tadds r0, 0xDA\n" + "\tadds r0, r1\n" + "\tldrh r1, [r3]\n" + "\tstrh r1, [r0]\n" + "\tadds r3, 0x2\n" + "\tadds r2, 0x1\n" + "\tcmp r2, r5\n" + "\tble _08048B7A\n" + "\tldr r1, _08048BC8 @ =0x06003000\n" + "\tldr r0, _08048BB4 @ =0x040000d4\n" + "\tmov r2, r12\n" + "\tstr r2, [r0]\n" + "\tstr r1, [r0, 0x4]\n" + "\tldr r1, _08048BCC @ =0x80000400\n" + "\tstr r1, [r0, 0x8]\n" + "\tldr r0, [r0, 0x8]\n" + "\tb _08048C3A\n" + "\t.align 2, 0\n" + "_08048BA0: .4byte gUnknown_08EA0348\n" + "_08048BA4: .4byte gTradeStripesBG2Tilemap\n" + "_08048BA8: .4byte gUnknown_08EA02C8\n" + "_08048BAC: .4byte gPlttBufferFaded\n" + "_08048BB0: .4byte gPlttBufferUnfaded\n" + "_08048BB4: .4byte 0x040000d4\n" + "_08048BB8: .4byte 0x80000800\n" + "_08048BBC: .4byte 0x000003ff\n" + "_08048BC0: .4byte gUnknown_03004824\n" + "_08048BC4: .4byte gUnknown_08EA15C8\n" + "_08048BC8: .4byte 0x06003000\n" + "_08048BCC: .4byte 0x80000400\n" + "_08048BD0:\n" + "\tldr r1, _08048C40 @ =gTradeStripesBG3Tilemap\n" + "\tldr r2, _08048C44 @ =0x06003800\n" + "\tldr r0, _08048C48 @ =0x040000d4\n" + "\tstr r1, [r0]\n" + "\tstr r2, [r0, 0x4]\n" + "\tldr r1, _08048C4C @ =0x80000400\n" + "\tstr r1, [r0, 0x8]\n" + "\tldr r0, [r0, 0x8]\n" + "\tmovs r0, 0\n" + "\tbl sub_804A6DC\n" + "\tmovs r0, 0x1\n" + "\tbl sub_804A6DC\n" + "\tldr r0, _08048C50 @ =gUnknown_03004824\n" + "\tldr r0, [r0]\n" + "\tadds r0, 0xC8\n" + "\tbl sub_804A938\n" + "\tldr r2, _08048C54 @ =REG_BG0CNT\n" + "\tldrh r1, [r2]\n" + "\tldr r0, _08048C58 @ =0x0000fffc\n" + "\tands r0, r1\n" + "\tstrh r0, [r2]\n" + "\tldr r1, _08048C5C @ =REG_BG1CNT\n" + "\tldr r2, _08048C60 @ =0x00000501\n" + "\tadds r0, r2, 0\n" + "\tstrh r0, [r1]\n" + "\tadds r1, 0x2\n" + "\tldr r2, _08048C64 @ =0x00000602\n" + "\tadds r0, r2, 0\n" + "\tstrh r0, [r1]\n" + "\tadds r1, 0x2\n" + "\tldr r2, _08048C68 @ =0x00000703\n" + "\tadds r0, r2, 0\n" + "\tstrh r0, [r1]\n" + "\tldr r0, _08048C6C @ =REG_BG0HOFS\n" + "\tmovs r1, 0\n" + "\tstrh r1, [r0]\n" + "\tadds r0, 0x4\n" + "\tstrh r1, [r0]\n" + "\tadds r0, 0x4\n" + "\tstrh r1, [r0]\n" + "\tadds r0, 0x4\n" + "\tstrh r1, [r0]\n" + "\tsubs r0, 0xA\n" + "\tstrh r1, [r0]\n" + "\tadds r0, 0x4\n" + "\tstrh r1, [r0]\n" + "\tadds r0, 0x4\n" + "\tstrh r1, [r0]\n" + "\tadds r0, 0x4\n" + "\tstrh r1, [r0]\n" + "_08048C3A:\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_08048C40: .4byte gTradeStripesBG3Tilemap\n" + "_08048C44: .4byte 0x06003800\n" + "_08048C48: .4byte 0x040000d4\n" + "_08048C4C: .4byte 0x80000400\n" + "_08048C50: .4byte gUnknown_03004824\n" + "_08048C54: .4byte REG_BG0CNT\n" + "_08048C58: .4byte 0x0000fffc\n" + "_08048C5C: .4byte REG_BG1CNT\n" + "_08048C60: .4byte 0x00000501\n" + "_08048C64: .4byte 0x00000602\n" + "_08048C68: .4byte 0x00000703\n" + "_08048C6C: .4byte REG_BG0HOFS"); +} +#endif + +static void sub_8048C70(void) +{ + int i; + for (i = 0; i < PARTY_SIZE; i ++) + { + if (i < gUnknown_03004824->partyCounts[0]) + { + gSprites[gUnknown_03004824->partyIcons[0][i]].invisible = FALSE; + gUnknown_03004824->tradeMenuOptionsActive[i] = TRUE; + } + else + { + gUnknown_03004824->tradeMenuOptionsActive[i] = FALSE; + } + if (i < gUnknown_03004824->partyCounts[1]) + { + gSprites[gUnknown_03004824->partyIcons[1][i]].invisible = FALSE; + gUnknown_03004824->tradeMenuOptionsActive[i + 6] = TRUE; + } + else + { + gUnknown_03004824->tradeMenuOptionsActive[i + 6] = FALSE; + } + } + gUnknown_03004824->tradeMenuOptionsActive[12] = TRUE; +} + +static void nullsub_5(u8 a0, u8 a1) {} + +// why not just use memcpy? +static void Trade_Memcpy(void *dataDest, void *dataSrc, u32 size) +{ + u8 *dest = dataDest; + u8 *src = dataSrc; + int i; + for (i = 0; i < size; i ++) dest[i] = src[i]; +} + +static bool8 sub_8048D44(void) +{ + u8 mpId = GetMultiplayerId(); + int i; + u16 species; + u8 nickname[11]; + struct Pokemon *pokemon; + + SetLinkDebugValues(gUnknown_03004824->unk_0075 / 100, gUnknown_03004824->unk_0075 % 100); + switch (gUnknown_03004824->unk_0075) + { + case 0: + Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[0], 2 * sizeof(struct Pokemon)); + gUnknown_03004824->unk_0075 ++; + break; + case 1: + if (sub_8007ECC()) + { + if (GetBlockReceivedStatus() == 0) + { + gUnknown_03004824->unk_0075 ++; + } + else + { + ResetBlockReceivedFlags(); + gUnknown_03004824->unk_0075 ++; + } + } + break; + case 2: + if (mpId == 0) + { + sub_8007E9C(1); + } + gUnknown_03004824->unk_0075 ++; + break; + case 3: + if (GetBlockReceivedStatus() == 3) + { + Trade_Memcpy(&gEnemyParty[0], gBlockRecvBuffer[mpId ^ 1], 2 * sizeof(struct Pokemon)); + ResetBlockReceivedFlags(); + gUnknown_03004824->unk_0075 ++; + } + break; + case 4: + Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[2], 2 * sizeof(struct Pokemon)); + gUnknown_03004824->unk_0075 ++; + break; + case 5: + if (mpId == 0) + { + sub_8007E9C(1); + } + gUnknown_03004824->unk_0075 ++; + break; + case 6: + if (GetBlockReceivedStatus() == 3) + { + Trade_Memcpy(&gEnemyParty[2], gBlockRecvBuffer[mpId ^ 1], 2 * sizeof(struct Pokemon)); + ResetBlockReceivedFlags(); + gUnknown_03004824->unk_0075 ++; + } + break; + case 7: + Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[4], 2 * sizeof(struct Pokemon)); + gUnknown_03004824->unk_0075 ++; + break; + case 8: + if (mpId == 0) + { + sub_8007E9C(1); + } + gUnknown_03004824->unk_0075 ++; + break; + case 9: + if (GetBlockReceivedStatus() == 3) + { + Trade_Memcpy(&gEnemyParty[4], gBlockRecvBuffer[mpId ^ 1], 2 * sizeof(struct Pokemon)); + ResetBlockReceivedFlags(); + gUnknown_03004824->unk_0075 ++; + } + break; + case 10: + Trade_Memcpy(gBlockSendBuffer, &gSaveBlock1.mail[0], 6 * sizeof(struct MailStruct) + 4); + gUnknown_03004824->unk_0075 ++; + break; + case 11: + if (mpId == 0) + { + sub_8007E9C(3); + } + gUnknown_03004824->unk_0075 ++; + break; + case 12: + if (GetBlockReceivedStatus() == 3) + { + Trade_Memcpy(&gUnknown_02029700[0], gBlockRecvBuffer[mpId ^ 1], 6 * sizeof(struct MailStruct)); + ResetBlockReceivedFlags(); + gUnknown_03004824->unk_0075 ++; + } + break; + case 13: + Trade_Memcpy(gBlockSendBuffer, gSaveBlock1.giftRibbons, 11); + gUnknown_03004824->unk_0075 ++; + break; + case 14: + if (mpId == 0) + { + sub_8007E9C(4); + } + gUnknown_03004824->unk_0075 ++; + break; + case 15: + if (GetBlockReceivedStatus() == 3) + { + Trade_Memcpy(gUnknown_03004824->unk_00b5, gBlockRecvBuffer[mpId ^ 1], 11); + ResetBlockReceivedFlags(); + gUnknown_03004824->unk_0075 ++; + } + break; + case 16: + pokemon = gEnemyParty; + for (i = 0; i < PARTY_SIZE; i ++) + { + if ((species = GetMonData(pokemon, MON_DATA_SPECIES)) != SPECIES_NONE && species == SPECIES_SHEDINJA && GetMonData(pokemon, MON_DATA_LANGUAGE) != LANGUAGE_JAPANESE) + { + GetMonData(pokemon, MON_DATA_NICKNAME, nickname); + if (!StringCompareWithoutExtCtrlCodes(nickname, gUnknown_0820C3B0)) + SetMonData(pokemon, MON_DATA_NICKNAME, gSpeciesNames[SPECIES_SHEDINJA]); + } + pokemon ++; + } + return TRUE; + } + return FALSE; +} + +static void sub_8049088(void) +{ + u8 string[28]; + StringCopy(string, gTradeText_TradeOkayPrompt); + sub_804ACD8(string, BG_CHAR_ADDR(4) + gUnknown_03004824->unk_007e * 32, 20); +} + +static void sub_80490BC(u8 mpId, u8 a1) +{ + if (a1 & 1) + { + switch (gBlockRecvBuffer[mpId][0]) + { + case 0xeeaa: + gUnknown_03004824->unk_0084 = 2; + break; + case 0xaabb: + gUnknown_03004824->unk_0084 = 1; + break; + case 0xbbbb: + gUnknown_03004824->unk_0086 = 1; + break; + case 0xbbcc: + gUnknown_03004824->unk_0086 = 2; + break; + } + ResetBlockReceivedFlag(0); + } + if (a1 & 2) + { + switch (gBlockRecvBuffer[1][0]) + { + case 0xeeaa: + gUnknown_03004824->unk_0085 = 2; + break; + case 0xaabb: + gUnknown_03004824->unk_008a = gBlockRecvBuffer[1][1] + 6; + gUnknown_03004824->unk_0085 = 1; + break; + case 0xbbbb: + gUnknown_03004824->unk_0087 = 1; + break; + case 0xbbcc: + gUnknown_03004824->unk_0087 = 2; + break; + } + ResetBlockReceivedFlag(1); + } +} + +static void sub_80491E4(u8 mpId, u8 status) +{ + if (status & 1) + { + switch (gBlockRecvBuffer[0][0]) + { + case 0xeebb: + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + sub_804AA0C(4); + gUnknown_03004824->unk_007b = 11; + break; + case 0xeecc: + sub_804AA0C(5); + gUnknown_03004824->unk_007b = 8; + break; + case 0xdddd: + gUnknown_03004824->unk_008a = gBlockRecvBuffer[0][1] + 6; + sub_8049E9C(gUnknown_03004824->tradeMenuCursorPosition); + sub_8049E9C(gUnknown_03004824->unk_008a); + gUnknown_03004824->unk_007b = 7; + break; + case 0xccdd: + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gUnknown_03004824->unk_007b = 10; + break; + case 0xddee: + sub_804AA0C(1); + gUnknown_03004824->unk_007b = 8; + break; + } + ResetBlockReceivedFlag(0); + } + if (status & 2) + { + ResetBlockReceivedFlag(1); + } +} + +static void sub_80492D8(void) +{ + if (gUnknown_03004824->unk_0084 && gUnknown_03004824->unk_0085) + { + if (gUnknown_03004824->unk_0084 == 1 && gUnknown_03004824->unk_0085 == 1) + { + gUnknown_03004824->unk_007b = 6; + gUnknown_03004824->linkData[0] = 0xdddd; + gUnknown_03004824->linkData[1] = gUnknown_03004824->tradeMenuCursorPosition; + sub_804AADC(5, 0); + gUnknown_03004824->unk_0084 = gUnknown_03004824->unk_0085 = 0; + } + else if (gUnknown_03004824->unk_0084 == 1 && gUnknown_03004824->unk_0085 == 2) + { + sub_804AA0C(1); + gUnknown_03004824->linkData[0] = 0xeecc; + gUnknown_03004824->linkData[1] = 0; + sub_804AADC(5, 0); + gUnknown_03004824->unk_0086 = gUnknown_03004824->unk_0087 = 0; + gUnknown_03004824->unk_0084 = gUnknown_03004824->unk_0085 = 0; + gUnknown_03004824->unk_007b = 8; + } + else if (gUnknown_03004824->unk_0084 == 2 && gUnknown_03004824->unk_0085 == 1) + { + sub_804AA0C(5); + gUnknown_03004824->linkData[0] = 0xddee; + gUnknown_03004824->linkData[1] = 0; + sub_804AADC(5, 0); + gUnknown_03004824->unk_0086 = gUnknown_03004824->unk_0087 = 0; + gUnknown_03004824->unk_0084 = gUnknown_03004824->unk_0085 = 0; + gUnknown_03004824->unk_007b = 8; + } + else if (gUnknown_03004824->unk_0084 == 2 && gUnknown_03004824->unk_0085 == 2) + { + gUnknown_03004824->linkData[0] = 0xeebb; + gUnknown_03004824->linkData[1] = 0; + sub_804AADC(5, 0); + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gUnknown_03004824->unk_0084 = gUnknown_03004824->unk_0085 = 0; + gUnknown_03004824->unk_007b = 11; + } + } + if (gUnknown_03004824->unk_0086 && gUnknown_03004824->unk_0087) + { + if (gUnknown_03004824->unk_0086 == 1 && gUnknown_03004824->unk_0087 == 1) + { + gUnknown_03004824->linkData[0] = 0xccdd; + gUnknown_03004824->linkData[1] = 0; + sub_804AADC(5, 0); + gUnknown_03004824->unk_0086 = 0; + gUnknown_03004824->unk_0087 = 0; + gUnknown_03004824->unk_007b = 9; + } + if (gUnknown_03004824->unk_0086 == 2 || gUnknown_03004824->unk_0087 == 2) + { + sub_804AA0C(1); + gUnknown_03004824->linkData[0] = 0xddee; + gUnknown_03004824->linkData[1] = 0; + sub_804AADC(5, 0); + gUnknown_03004824->unk_0086 = 0; + gUnknown_03004824->unk_0087 = 0; + gUnknown_03004824->unk_007b = 8; + } + } +} + +static void sub_80494D8(void) +{ + u8 mpId = GetMultiplayerId(); + u8 status; + if ((status = GetBlockReceivedStatus())) + { + if (mpId == 0) + sub_80490BC(mpId, status); + else + sub_80491E4(mpId, status); + ResetBlockReceivedFlags(); + } + if (mpId == 0) + sub_80492D8(); +} + +static u8 sub_8049514(u8 oldPosition, u8 direction) +{ + int i; + u8 newPosition = 0; + for (i = 0; i < PARTY_SIZE; i ++) + { + if (gUnknown_03004824->tradeMenuOptionsActive[gTradeNextSelectedMonTable[oldPosition][direction][i]] == TRUE) + { + newPosition = gTradeNextSelectedMonTable[oldPosition][direction][i]; + break; + } + } + return newPosition; +} + +static void TradeMenuMoveCursor(u8 *tradeMenuCursorPosition, u8 direction) +{ + u8 newPosition = sub_8049514(*tradeMenuCursorPosition, direction); + if (newPosition == 12) // CANCEL + { + StartSpriteAnim(&gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx], 1); + gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx].pos1.x = 0xe0; + gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx].pos1.y = 0xa0; + } + else + { + StartSpriteAnim(&gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx], 0); + gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx].pos1.x = gTradeMonSpriteCoords[newPosition][0] * 8 + 32; + gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx].pos1.y = gTradeMonSpriteCoords[newPosition][1] * 8; + } + if (*tradeMenuCursorPosition != newPosition) + { + PlaySE(SE_SELECT); + } + *tradeMenuCursorPosition = newPosition; +} + +static void sub_8049620(void) +{ + sub_804AA0C(0); + gUnknown_03004824->unk_007b = 5; + if (GetMultiplayerId() == 1) + { + gUnknown_03004824->linkData[0] = 0xaabb; + gUnknown_03004824->linkData[1] = gUnknown_03004824->tradeMenuCursorPosition; + Trade_SendData(gUnknown_03004824); + } + else + { + gUnknown_03004824->unk_0084 = 1; + } +} + +static void sub_8049680(void) +{ + int i; + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + TradeMenuMoveCursor(&gUnknown_03004824->tradeMenuCursorPosition, 0); + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + TradeMenuMoveCursor(&gUnknown_03004824->tradeMenuCursorPosition, 1); + } + else if (gMain.newAndRepeatedKeys & DPAD_LEFT) + { + TradeMenuMoveCursor(&gUnknown_03004824->tradeMenuCursorPosition, 2); + } + else if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + { + TradeMenuMoveCursor(&gUnknown_03004824->tradeMenuCursorPosition, 3); + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (gUnknown_03004824->tradeMenuCursorPosition < PARTY_SIZE) + { + DrawTextWindow(&gUnknown_03004824->window, 18, 14, 28, 19); + PrintMenuItems(19, 15, 2, (const struct MenuAction *)gUnknown_0820C320); + InitMenu(0, 19, 15, 2, 0, 9); + gUnknown_03004824->unk_007b = 1; + } + else if (gUnknown_03004824->tradeMenuCursorPosition < 2 * PARTY_SIZE) + { + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gUnknown_03004824->unk_007b = 2; + } + else if (gUnknown_03004824->tradeMenuCursorPosition == 2 * PARTY_SIZE) + { + DrawTextWindow(&gUnknown_03004824->window, 24, 14, 29, 19); + InitYesNoMenu(24, 14, 4); + gUnknown_03004824->unk_007b = 4; + sub_804ACD8(gUnknown_0820C14C[4], BG_CHAR_ADDR(4) + 32 * gUnknown_03004824->unk_007e, 20); + } + } + if (gMain.newKeys & R_BUTTON) + { + for (i = 0; i < 10; i ++) + { + gUnknown_03004824->linkData[i] = i; + } + Trade_SendData(gUnknown_03004824); + } +} + +static void sub_8049804(void) +{ + HandleDestroyMenuCursors(); + sub_804A80C(); + gUnknown_03004824->unk_007b = 0; + gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx].invisible = FALSE; + sub_804ACD8(gUnknown_0820C14C[1], BG_CHAR_ADDR(4) + 32 * gUnknown_03004824->unk_007e, 20); +} + +static void sub_8049860(void) +{ + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + gUnknown_03004824->unk_007c = MoveMenuCursor(-1); + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + gUnknown_03004824->unk_007c = MoveMenuCursor(+1); + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (GetMenuCursorPos() == 0) + { + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gUnknown_03004824->unk_007b = 2; + } + else if (sub_80499F0(gUnknown_03004824->unk_0051[0], gUnknown_03004824->partyCounts[0], gUnknown_03004824->tradeMenuCursorPosition) == 0) + { + sub_804AADC(3, 2); + gUnknown_03004824->unk_007b = 8; + } + else + { + sub_8049620(); + gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx].invisible = TRUE; + } + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_8049804(); + } +} + +static void sub_8049954(void) +{ + if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_8049804(); + } +} + +static void sub_804997C(void) +{ + if (!gPaletteFade.active) + { + if (gUnknown_03004824->tradeMenuCursorPosition < PARTY_SIZE) + { + ShowPokemonSummaryScreen(gPlayerParty, gUnknown_03004824->tradeMenuCursorPosition, gUnknown_03004824->partyCounts[0] - 1, sub_80484F4, 4); + } + else + { + ShowPokemonSummaryScreen(gEnemyParty, gUnknown_03004824->tradeMenuCursorPosition - 6, gUnknown_03004824->partyCounts[1] - 1, sub_80484F4, 4); + } + } +} + +static u8 sub_80499F0(const u8 *src, u8 partyCount, u8 tradeMenuCursorPosition) +{ + u8 retval = 0; + int i; + for (i = 0; i < partyCount; i ++) + { + if (tradeMenuCursorPosition != i) + { + retval += src[i]; + } + } + return retval; +} + +static void sub_8049A20(void) +{ + u8 unk_0051[12]; + int i; + for (i = 0; i < gUnknown_03004824->partyCounts[0]; i ++) + { + unk_0051[i] = gUnknown_03004824->unk_0051[0][i]; + } + if (sub_80499F0(unk_0051, gUnknown_03004824->partyCounts[0], gUnknown_03004824->tradeMenuCursorPosition) == 0) + { + sub_804AADC(3, 2); + gUnknown_03004824->linkData[0] = 0xbbcc; + sub_804AADC(0xb4, 0); + } + else + { + sub_804AADC(3, 1); + gUnknown_03004824->linkData[0] = 0xbbbb; + if (sub_8007ECC()) + { + Trade_SendData(gUnknown_03004824); + } + } +} + +static void sub_8049AC0(void) +{ + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + gUnknown_03004824->unk_007c = MoveMenuCursor(-1); + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + gUnknown_03004824->unk_007c = MoveMenuCursor(+1); + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (GetMenuCursorPos() == 0) + { + sub_8049A20(); + } + else + { + sub_804AADC(3, 1); + if (sub_8007ECC()) + { + gUnknown_03004824->linkData[0] = 0xbbcc; + Trade_SendData(gUnknown_03004824); + } + } + gUnknown_03004824->unk_007b = 100; + } + else if (gMain.newKeys & B_BUTTON) + { + sub_804AADC(3, 1); + if (GetMenuCursorPos() == 0) + { + gUnknown_03004824->unk_007c = MoveMenuCursor(+1); + } + gUnknown_03004824->linkData[0] = 0xbbcc; + Trade_SendData(gUnknown_03004824); + gUnknown_03004824->unk_007b = 100; + } +} + +static void sub_8049BC0(void) +{ + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + gUnknown_03004824->unk_007c = MoveMenuCursor(-1); + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + gUnknown_03004824->unk_007c = MoveMenuCursor(+1); + } + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (GetMenuCursorPos() == 0) + { + sub_804AA0C(4); + gUnknown_03004824->linkData[0] = 0xeeaa; + gUnknown_03004824->linkData[1] = 0; + sub_804AADC(5, 0); + gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx].invisible = TRUE; + gUnknown_03004824->unk_007b = 100; + } + else + { + sub_8049804(); + } + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_8049804(); + } +} + +static void sub_8049C8C(void) +{ + if (GetMultiplayerId() == 0) + { + sub_8049E9C(gUnknown_03004824->tradeMenuCursorPosition); + sub_8049E9C(gUnknown_03004824->unk_008a); + } + gUnknown_03004824->unk_007b = 7; +} + +static void sub_8049CC4(void) +{ + if (gUnknown_03004824->unk_0080[0] == 5 && gUnknown_03004824->unk_0080[1] == 5) + { + sub_8049088(); + gUnknown_03004824->unk_007b = 14; + } +} + +static void DisplayMessageAndContinueTask(void) +{ + gUnknown_03004824->unk_00b4++; + if (gUnknown_03004824->unk_00b4 > 120) + { + DrawTextWindow(&gUnknown_03004824->window, 24, 14, 29, 19); + InitYesNoMenu(24, 14, 4); + gUnknown_03004824->unk_00b4 = 0; + gUnknown_03004824->unk_007b = 3; + } +} + +static void sub_8049D44(void) +{ + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + sub_804A840(0); + sub_804A840(1); + gUnknown_03004824->unk_007b = 0; + gSprites[gUnknown_03004824->tradeMenuCursorSpriteIdx].invisible = FALSE; + } +} + +static void sub_8049D9C(void) +{ + if (!gPaletteFade.active) + { + sub_800832C(); + gUnknown_03004824->unk_007b = 12; + } +} + +static void sub_8049DC4(void) +{ + if (gReceivedRemoteLinkPlayers == 0) + { + SetMainCallback2(sub_805465C); + } +} + +static void sub_8049DE0(void) +{ + switch (gUnknown_03004824->unk_007b) + { + case 0: + sub_8049680(); + break; + case 1: + sub_8049860(); + break; + case 2: + sub_804997C(); + break; + case 3: + sub_8049AC0(); + break; + case 4: + sub_8049BC0(); + break; + case 6: + sub_8049C8C(); + break; + case 7: + sub_8049CC4(); + break; + case 8: + sub_8049D44(); + break; + case 9: + sub_8048A14(); + break; + case 10: + sub_8048A50(); + break; + case 11: + sub_8049D9C(); + break; + case 12: + sub_8049DC4(); + break; + case 13: + sub_8048A90(); + break; + case 14: + DisplayMessageAndContinueTask(); + break; + case 15: + sub_8049954(); + break; + } +} + +static void sub_8049E9C(u8 a0) +{ + u8 v0 = a0 / 6; + if (gUnknown_03004824->unk_0080[v0] == 0) + { + gUnknown_03004824->unk_0080[v0] = 1; + gUnknown_03004824->unk_0082[v0] = a0; + } +} + +// TODO: Figure out what the f**k is going on here +#ifdef NONMATCHING +static void sub_8049ED4(u8 a0) +{ + u8 i; + s8 stringLength; + u8 whichParty = 1; + u8 whichPokemon; + u8 string1[40]; + u8 string2[56]; + u8 temp0 = gUnknown_03004824->unk_0082[a0]; + if (temp0 < PARTY_SIZE) + whichParty = 0; + whichPokemon = temp0 % PARTY_SIZE; + + switch (gUnknown_03004824->unk_0080[a0]) + { + case 1: + for (i = 0; i < gUnknown_03004824->partyCounts[a0]; i ++) + { + gSprites[gUnknown_03004824->partyIcons[whichParty][i]].invisible = TRUE; + } + gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]].invisible = FALSE; + gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]].data0 = 20; + gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]].data2 = (gTradeMonSpriteCoords[6 * whichParty + whichPokemon][0] + gTradeMonSpriteCoords[6 * whichParty + whichPokemon + 1][0]) / 2 * 8 + 14; + gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]].data4 = gTradeMonSpriteCoords[6 * whichParty + whichPokemon][1] * 8 - 12; + StoreSpriteCallbackInData6(&gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]], sub_809D62C); + gUnknown_03004824->unk_0080[a0] ++; + sub_8078A34(&gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]]); + HandleDestroyMenuCursors(); + FillWindowRect_DefaultPalette(&gUnknown_03004824->window, 0, gUnknown_0820C330[whichParty][0], 0, gUnknown_0820C330[whichParty][1], 19); + sub_804A96C_alt(&gUnknown_03004824->unk_00c8, 15 * a0, 0, gTradePartyBoxTilemap, 15, 17, 0); + if (whichParty == 0) + { + sub_804A80C(); + } + break; + case 2: + if (gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]].callback == sub_809D62C) + { + gUnknown_03004824->unk_0080[a0] = 3; + } + break; + case 3: + sub_804A96C_alt(&gUnknown_03004824->unk_00c8, 15 * whichParty, 0, gTradePartyBoxTilemap, 15, 17, 0); + gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]].pos1.x = (gTradeMonSpriteCoords[6 * whichParty + whichPokemon ][0] + gTradeMonSpriteCoords[6 * whichParty + whichPokemon + 1][0]) / 2 * 8 + 14; + gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]].pos1.y = gTradeMonSpriteCoords[6 * whichParty + whichPokemon ][1] * 8 - 12; + gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]].pos2.x = 0; + gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]].pos2.y = 0; + stringLength = sub_804A2B4(string1 + 6, whichParty, whichPokemon); + string1[0] = 0xFC; + string1[1] = 0x06; + string1[2] = 0x04; + string1[3] = 0xFC; + string1[4] = 0x11; + string1[5] = (64 - stringLength) / 2; + sub_8003460(&gUnknown_03004824->window, string1, gUnknown_03004824->unk_007a + whichParty * 6 * 32, gUnknown_0820C334[whichParty][0], gUnknown_0820C334[whichParty][1]); + sub_804A33C(string2, whichParty, whichPokemon); + sub_8003460(&gUnknown_03004824->window, gOtherText_Terminator2, gUnknown_03004824->unk_007a + whichParty * 6 * 32 + 32, gUnknown_0820C334[whichParty + 1][0], gUnknown_0820C334[whichParty + 1][1] + 1); + sub_8003460(&gUnknown_03004824->window, string2, gUnknown_03004824->unk_007a + whichParty * 6 * 32 + 38, gUnknown_0820C334[whichParty + 1][0], gUnknown_0820C334[whichParty + 1][1] + 1); + gUnknown_03004824->unk_0080[a0] ++; + break; + case 4: + sub_804ACD8(gUnknown_0820C14C[5], BG_CHAR_ADDR(4) + 32 * gUnknown_03004824->unk_007e, 20); + sub_804A51C(a0, whichPokemon, gUnknown_0820C3D1[a0][0] + 4, gUnknown_0820C3D1[a0][1] + 1, gUnknown_0820C3D1[a0][0], gUnknown_0820C3D1[a0][1]); + gUnknown_03004824->unk_0080[a0] ++; + break; + } +} +#else +__attribute__((naked)) +static void sub_8049ED4(u8 a0) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0x74\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tmov r10, r0\n" + "\tldr r0, _08049F24 @ =gUnknown_03004824\n" + "\tldr r5, [r0]\n" + "\tadds r0, r5, 0\n" + "\tadds r0, 0x82\n" + "\tadd r0, r10\n" + "\tldrb r0, [r0]\n" + "\tmovs r1, 0x1\n" + "\tstr r1, [sp, 0x6C]\n" + "\tcmp r0, 0x5\n" + "\tbhi _08049EFE\n" + "\tmovs r2, 0\n" + "\tstr r2, [sp, 0x6C]\n" + "_08049EFE:\n" + "\tmovs r1, 0x6\n" + "\tbl __umodsi3\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tmov r8, r0\n" + "\tadds r0, r5, 0\n" + "\tadds r0, 0x80\n" + "\tmov r1, r10\n" + "\tadds r3, r0, r1\n" + "\tldrb r0, [r3]\n" + "\tcmp r0, 0x2\n" + "\tbne _08049F1A\n" + "\tb _0804A0AC\n" + "_08049F1A:\n" + "\tcmp r0, 0x2\n" + "\tbgt _08049F28\n" + "\tcmp r0, 0x1\n" + "\tbeq _08049F36\n" + "\tb _0804A294\n" + "\t.align 2, 0\n" + "_08049F24: .4byte gUnknown_03004824\n" + "_08049F28:\n" + "\tcmp r0, 0x3\n" + "\tbne _08049F2E\n" + "\tb _0804A0E4\n" + "_08049F2E:\n" + "\tcmp r0, 0x4\n" + "\tbne _08049F34\n" + "\tb _0804A244\n" + "_08049F34:\n" + "\tb _0804A294\n" + "_08049F36:\n" + "\tmovs r4, 0\n" + "\tadds r0, r5, 0\n" + "\tadds r0, 0x42\n" + "\tadd r0, r10\n" + "\tldr r7, _0804A094 @ =gSprites\n" + "\tldr r2, [sp, 0x6C]\n" + "\tlsls r2, 1\n" + "\tmov r9, r2\n" + "\tldr r3, _0804A098 @ =gTradeMonSpriteCoords\n" + "\tmov r12, r3\n" + "\tmov r5, r10\n" + "\tlsls r5, 4\n" + "\tstr r5, [sp, 0x70]\n" + "\tldrb r0, [r0]\n" + "\tcmp r4, r0\n" + "\tbcs _08049F8E\n" + "\tadds r6, r7, 0\n" + "\tldr r2, _0804A09C @ =gUnknown_03004824\n" + "\tldr r0, [sp, 0x6C]\n" + "\tadd r0, r9\n" + "\tlsls r3, r0, 1\n" + "\tmovs r5, 0x4\n" + "_08049F62:\n" + "\tldr r0, [r2]\n" + "\tadds r1, r4, r3\n" + "\tadds r0, 0x34\n" + "\tadds r0, r1\n" + "\tldrb r1, [r0]\n" + "\tlsls r0, r1, 4\n" + "\tadds r0, r1\n" + "\tlsls r0, 2\n" + "\tadds r0, r6\n" + "\tadds r0, 0x3E\n" + "\tldrb r1, [r0]\n" + "\torrs r1, r5\n" + "\tstrb r1, [r0]\n" + "\tadds r0, r4, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tldr r0, [r2]\n" + "\tadds r0, 0x42\n" + "\tadd r0, r10\n" + "\tldrb r0, [r0]\n" + "\tcmp r4, r0\n" + "\tbcc _08049F62\n" + "_08049F8E:\n" + "\tldr r1, _0804A09C @ =gUnknown_03004824\n" + "\tldr r0, [r1]\n" + "\tldr r5, [sp, 0x6C]\n" + "\tadd r5, r9\n" + "\tlsls r3, r5, 1\n" + "\tmov r2, r8\n" + "\tadds r6, r2, r3\n" + "\tadds r0, 0x34\n" + "\tadds r0, r6\n" + "\tldrb r1, [r0]\n" + "\tlsls r0, r1, 4\n" + "\tadds r0, r1\n" + "\tlsls r0, 2\n" + "\tadds r0, r7\n" + "\tadds r0, 0x3E\n" + "\tldrb r2, [r0]\n" + "\tmovs r1, 0x5\n" + "\tnegs r1, r1\n" + "\tands r1, r2\n" + "\tstrb r1, [r0]\n" + "\tldr r0, _0804A09C @ =gUnknown_03004824\n" + "\tldr r4, [r0]\n" + "\tadds r4, 0x34\n" + "\tadds r4, r6\n" + "\tldrb r1, [r4]\n" + "\tlsls r0, r1, 4\n" + "\tadds r0, r1\n" + "\tlsls r0, 2\n" + "\tadds r0, r7\n" + "\tmovs r1, 0x14\n" + "\tstrh r1, [r0, 0x2E]\n" + "\tldrb r0, [r4]\n" + "\tlsls r2, r0, 4\n" + "\tadds r2, r0\n" + "\tlsls r2, 2\n" + "\tadds r2, r7\n" + "\tlsls r5, 2\n" + "\tmov r1, r12\n" + "\tadds r0, r5, r1\n" + "\tldrb r0, [r0]\n" + "\tadds r3, 0x1\n" + "\tlsls r3, 1\n" + "\tadd r3, r12\n" + "\tldrb r1, [r3]\n" + "\tadds r0, r1\n" + "\tasrs r0, 1\n" + "\tlsls r0, 3\n" + "\tadds r0, 0xE\n" + "\tstrh r0, [r2, 0x32]\n" + "\tldrb r0, [r4]\n" + "\tlsls r1, r0, 4\n" + "\tadds r1, r0\n" + "\tlsls r1, 2\n" + "\tadds r1, r7\n" + "\tmov r0, r12\n" + "\tadds r0, 0x1\n" + "\tadds r5, r0\n" + "\tldrb r0, [r5]\n" + "\tlsls r0, 3\n" + "\tsubs r0, 0xC\n" + "\tstrh r0, [r1, 0x36]\n" + "\tldrb r1, [r4]\n" + "\tlsls r0, r1, 4\n" + "\tadds r0, r1\n" + "\tlsls r0, 2\n" + "\tadds r0, r7\n" + "\tldr r1, _0804A0A0 @ =sub_809D62C\n" + "\tbl StoreSpriteCallbackInData6\n" + "\tldr r2, _0804A09C @ =gUnknown_03004824\n" + "\tldr r1, [r2]\n" + "\tadds r1, 0x80\n" + "\tadd r1, r10\n" + "\tldrb r0, [r1]\n" + "\tadds r0, 0x1\n" + "\tstrb r0, [r1]\n" + "\tldr r0, [r2]\n" + "\tadds r0, 0x34\n" + "\tadds r0, r6\n" + "\tldrb r1, [r0]\n" + "\tlsls r0, r1, 4\n" + "\tadds r0, r1\n" + "\tlsls r0, 2\n" + "\tadds r0, r7\n" + "\tbl sub_8078A34\n" + "\tbl HandleDestroyMenuCursors\n" + "\tldr r3, _0804A09C @ =gUnknown_03004824\n" + "\tldr r0, [r3]\n" + "\tadds r0, 0x4\n" + "\tldr r1, _0804A0A4 @ =gUnknown_0820C330\n" + "\tmov r5, r9\n" + "\tadds r2, r5, r1\n" + "\tldrb r2, [r2]\n" + "\tadds r1, 0x1\n" + "\tadd r1, r9\n" + "\tldrb r1, [r1]\n" + "\tstr r1, [sp]\n" + "\tmovs r1, 0x13\n" + "\tstr r1, [sp, 0x4]\n" + "\tmovs r1, 0\n" + "\tmovs r3, 0\n" + "\tbl FillWindowRect_DefaultPalette\n" + "\tldr r1, _0804A09C @ =gUnknown_03004824\n" + "\tldr r0, [r1]\n" + "\tadds r0, 0xC8\n" + "\tldr r2, [sp, 0x70]\n" + "\tmov r3, r10\n" + "\tsubs r1, r2, r3\n" + "\tlsls r1, 24\n" + "\tlsrs r1, 24\n" + "\tldr r3, _0804A0A8 @ =gTradePartyBoxTilemap\n" + "\tmovs r2, 0xF\n" + "\tstr r2, [sp]\n" + "\tmovs r2, 0x11\n" + "\tstr r2, [sp, 0x4]\n" + "\tmovs r5, 0\n" + "\tstr r5, [sp, 0x8]\n" + "\tmovs r2, 0\n" + "\tbl sub_804A96C_alt\n" + "\tldr r0, [sp, 0x6C]\n" + "\tcmp r0, 0\n" + "\tbeq _0804A08C\n" + "\tb _0804A294\n" + "_0804A08C:\n" + "\tbl sub_804A80C\n" + "\tb _0804A294\n" + "\t.align 2, 0\n" + "_0804A094: .4byte gSprites\n" + "_0804A098: .4byte gTradeMonSpriteCoords\n" + "_0804A09C: .4byte gUnknown_03004824\n" + "_0804A0A0: .4byte sub_809D62C\n" + "_0804A0A4: .4byte gUnknown_0820C330\n" + "_0804A0A8: .4byte gTradePartyBoxTilemap\n" + "_0804A0AC:\n" + "\tldr r2, _0804A0DC @ =gSprites\n" + "\tldr r1, [sp, 0x6C]\n" + "\tlsls r0, r1, 1\n" + "\tadds r0, r1\n" + "\tlsls r0, 1\n" + "\tadd r0, r8\n" + "\tadds r1, r5, 0\n" + "\tadds r1, 0x34\n" + "\tadds r1, r0\n" + "\tldrb r1, [r1]\n" + "\tlsls r0, r1, 4\n" + "\tadds r0, r1\n" + "\tlsls r0, 2\n" + "\tadds r2, 0x1C\n" + "\tadds r0, r2\n" + "\tldr r1, [r0]\n" + "\tldr r0, _0804A0E0 @ =sub_809D62C\n" + "\tcmp r1, r0\n" + "\tbeq _0804A0D4\n" + "\tb _0804A294\n" + "_0804A0D4:\n" + "\tmovs r0, 0x3\n" + "\tstrb r0, [r3]\n" + "\tb _0804A294\n" + "\t.align 2, 0\n" + "_0804A0DC: .4byte gSprites\n" + "_0804A0E0: .4byte sub_809D62C\n" + "_0804A0E4:\n" + "\tadds r0, r5, 0\n" + "\tadds r0, 0xC8\n" + "\tldr r2, [sp, 0x6C]\n" + "\tlsls r1, r2, 4\n" + "\tsubs r1, r2\n" + "\tlsls r1, 24\n" + "\tlsrs r1, 24\n" + "\tldr r3, _0804A228 @ =gTradeMovesBoxTilemap\n" + "\tmovs r2, 0xF\n" + "\tstr r2, [sp]\n" + "\tmovs r7, 0x11\n" + "\tstr r7, [sp, 0x4]\n" + "\tmovs r5, 0\n" + "\tstr r5, [sp, 0x8]\n" + "\tmovs r2, 0\n" + "\tbl sub_804A96C_alt\n" + "\tldr r0, _0804A22C @ =gUnknown_03004824\n" + "\tldr r3, [r0]\n" + "\tldr r1, [sp, 0x6C]\n" + "\tlsls r6, r1, 1\n" + "\tadds r1, r6\n" + "\tmov r9, r1\n" + "\tlsls r1, 1\n" + "\tmov r2, r8\n" + "\tadds r0, r2, r1\n" + "\tadds r3, 0x34\n" + "\tadds r3, r0\n" + "\tldrb r0, [r3]\n" + "\tlsls r2, r0, 4\n" + "\tadds r2, r0\n" + "\tlsls r2, 2\n" + "\tldr r5, _0804A230 @ =gSprites\n" + "\tadds r2, r5\n" + "\tldr r4, _0804A234 @ =gTradeMonSpriteCoords\n" + "\tmov r0, r9\n" + "\tlsls r5, r0, 2\n" + "\tadds r0, r5, r4\n" + "\tldrb r0, [r0]\n" + "\tadds r1, 0x1\n" + "\tlsls r1, 1\n" + "\tadds r1, r4\n" + "\tldrb r1, [r1]\n" + "\tadds r0, r1\n" + "\tasrs r0, 1\n" + "\tlsls r0, 3\n" + "\tadds r0, 0xE\n" + "\tstrh r0, [r2, 0x20]\n" + "\tldrb r0, [r3]\n" + "\tlsls r1, r0, 4\n" + "\tadds r1, r0\n" + "\tlsls r1, 2\n" + "\tldr r2, _0804A230 @ =gSprites\n" + "\tadds r1, r2\n" + "\tadds r4, 0x1\n" + "\tadds r5, r4\n" + "\tldrb r0, [r5]\n" + "\tlsls r0, 3\n" + "\tsubs r0, 0xC\n" + "\tstrh r0, [r1, 0x22]\n" + "\tldrb r1, [r3]\n" + "\tlsls r0, r1, 4\n" + "\tadds r0, r1\n" + "\tlsls r0, 2\n" + "\tadds r0, r2\n" + "\tmovs r5, 0\n" + "\tstrh r5, [r0, 0x24]\n" + "\tldrb r1, [r3]\n" + "\tlsls r0, r1, 4\n" + "\tadds r0, r1\n" + "\tlsls r0, 2\n" + "\tadds r0, r2\n" + "\tstrh r5, [r0, 0x26]\n" + "\tmov r0, sp\n" + "\tadds r0, 0x12\n" + "\tldr r1, [sp, 0x6C]\n" + "\tmov r2, r8\n" + "\tbl sub_804A2B4\n" + "\tadd r1, sp, 0xC\n" + "\tmovs r3, 0xFC\n" + "\tstrb r3, [r1]\n" + "\tadds r2, r1, 0\n" + "\tmovs r1, 0x6\n" + "\tstrb r1, [r2, 0x1]\n" + "\tmovs r1, 0x4\n" + "\tstrb r1, [r2, 0x2]\n" + "\tadds r1, r2, 0\n" + "\tstrb r3, [r1, 0x3]\n" + "\tstrb r7, [r1, 0x4]\n" + "\tlsls r0, 24\n" + "\tasrs r0, 24\n" + "\tmovs r1, 0x40\n" + "\tsubs r1, r0\n" + "\tlsrs r0, r1, 31\n" + "\tadds r1, r0\n" + "\tasrs r1, 1\n" + "\tstrb r1, [r2, 0x5]\n" + "\tldr r0, _0804A22C @ =gUnknown_03004824\n" + "\tldr r1, [r0]\n" + "\tadds r0, r1, 0x4\n" + "\tadds r1, 0x7A\n" + "\tldrb r2, [r1]\n" + "\tmov r1, r9\n" + "\tlsls r1, 6\n" + "\tmov r9, r1\n" + "\tadd r2, r9\n" + "\tldr r4, _0804A238 @ =gUnknown_0820C334\n" + "\tldr r3, [sp, 0x6C]\n" + "\tlsls r1, r3, 2\n" + "\tadds r3, r1, r4\n" + "\tldrb r3, [r3]\n" + "\tldr r5, _0804A23C @ =gUnknown_0820C334 + 0x1\n" + "\tadds r1, r5\n" + "\tldrb r1, [r1]\n" + "\tstr r1, [sp]\n" + "\tadd r1, sp, 0xC\n" + "\tbl sub_8003460\n" + "\tadd r7, sp, 0x34\n" + "\tadds r0, r7, 0\n" + "\tldr r1, [sp, 0x6C]\n" + "\tmov r2, r8\n" + "\tbl sub_804A33C\n" + "\tldr r0, _0804A22C @ =gUnknown_03004824\n" + "\tldr r2, [r0]\n" + "\tadds r0, r2, 0x4\n" + "\tldr r1, _0804A240 @ =gOtherText_Terminator2\n" + "\tadds r2, 0x7A\n" + "\tldrb r2, [r2]\n" + "\tadd r2, r9\n" + "\tadds r2, 0x20\n" + "\tadds r6, 0x1\n" + "\tlsls r6, 1\n" + "\tadds r4, r6, r4\n" + "\tldrb r5, [r4]\n" + "\tldr r3, _0804A23C @ =gUnknown_0820C334 + 0x1\n" + "\tadds r6, r3\n" + "\tldrb r4, [r6]\n" + "\tadds r4, 0x1\n" + "\tlsls r4, 24\n" + "\tlsrs r4, 24\n" + "\tstr r4, [sp]\n" + "\tadds r3, r5, 0\n" + "\tbl sub_8003460\n" + "\tldr r0, _0804A22C @ =gUnknown_03004824\n" + "\tldr r1, [r0]\n" + "\tadds r0, r1, 0x4\n" + "\tadds r1, 0x7A\n" + "\tldrb r2, [r1]\n" + "\tadd r2, r9\n" + "\tadds r2, 0x26\n" + "\tstr r4, [sp]\n" + "\tadds r1, r7, 0\n" + "\tadds r3, r5, 0\n" + "\tbl sub_8003460\n" + "\tldr r2, _0804A22C @ =gUnknown_03004824\n" + "\tldr r1, [r2]\n" + "\tb _0804A28A\n" + "\t.align 2, 0\n" + "_0804A228: .4byte gTradeMovesBoxTilemap\n" + "_0804A22C: .4byte gUnknown_03004824\n" + "_0804A230: .4byte gSprites\n" + "_0804A234: .4byte gTradeMonSpriteCoords\n" + "_0804A238: .4byte gUnknown_0820C334\n" + "_0804A23C: .4byte gUnknown_0820C334 + 0x1\n" + "_0804A240: .4byte gOtherText_Terminator2\n" + "_0804A244:\n" + "\tldr r0, _0804A2A4 @ =gUnknown_0820C14C\n" + "\tldr r0, [r0, 0x14]\n" + "\tadds r1, r5, 0\n" + "\tadds r1, 0x7E\n" + "\tldrh r1, [r1]\n" + "\tlsls r1, 5\n" + "\tldr r3, _0804A2A8 @ =0x06010000\n" + "\tadds r1, r3\n" + "\tmovs r2, 0x14\n" + "\tbl sub_804ACD8\n" + "\tldr r0, _0804A2AC @ =gUnknown_0820C3D1\n" + "\tmov r5, r10\n" + "\tlsls r1, r5, 1\n" + "\tadds r4, r1, r0\n" + "\tldrb r2, [r4]\n" + "\tadds r2, 0x4\n" + "\tlsls r2, 24\n" + "\tlsrs r2, 24\n" + "\tadds r0, 0x1\n" + "\tadds r1, r0\n" + "\tldrb r3, [r1]\n" + "\tadds r3, 0x1\n" + "\tlsls r3, 24\n" + "\tlsrs r3, 24\n" + "\tldrb r0, [r4]\n" + "\tstr r0, [sp]\n" + "\tldrb r0, [r1]\n" + "\tstr r0, [sp, 0x4]\n" + "\tmov r0, r10\n" + "\tmov r1, r8\n" + "\tbl sub_804A51C\n" + "\tldr r0, _0804A2B0 @ =gUnknown_03004824\n" + "\tldr r1, [r0]\n" + "_0804A28A:\n" + "\tadds r1, 0x80\n" + "\tadd r1, r10\n" + "\tldrb r0, [r1]\n" + "\tadds r0, 0x1\n" + "\tstrb r0, [r1]\n" + "_0804A294:\n" + "\tadd sp, 0x74\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_0804A2A4: .4byte gUnknown_0820C14C\n" + "_0804A2A8: .4byte 0x06010000\n" + "_0804A2AC: .4byte gUnknown_0820C3D1\n" + "_0804A2B0: .4byte gUnknown_03004824"); +} +#endif + +#ifdef NONMATCHING +static +#endif +u8 sub_804A2B4(u8 *a0, u8 whichParty, u8 whichPokemon) +{ + u8 string[11]; + if (whichParty == 0) + { + GetMonData(&gPlayerParty[whichPokemon], MON_DATA_NICKNAME, string); + StringCopy10(a0, string); + GetMonGender(&gPlayerParty[whichPokemon]); + GetMonData(&gPlayerParty[whichPokemon], MON_DATA_LEVEL); + } + else + { + GetMonData(&gEnemyParty[whichPokemon], MON_DATA_NICKNAME, string); + StringCopy10(a0, string); + GetMonGender(&gEnemyParty[whichPokemon]); + GetMonData(&gEnemyParty[whichPokemon], MON_DATA_LEVEL); + } + return GetStringWidthGivenWindowConfig(&gWindowConfig_81E7294, a0); +} + +#ifdef NONMATCHING +static +#endif +void sub_804A33C(u8 *a0, u8 whichParty, u8 whichPokemon) +{ + u16 i; + u16 moves[4]; + if (gUnknown_03004824->unk_005d[whichParty][whichPokemon] == 0) + { + for (i = 0; i < 4; i ++) + { + if (whichParty == 0) + moves[i] = GetMonData(&gPlayerParty[whichPokemon], MON_DATA_MOVE1 + i, NULL); + else + moves[i] = GetMonData(&gEnemyParty[whichPokemon], MON_DATA_MOVE1 + i, NULL); + } + StringCopy(a0, gOtherText_Terminator); + for (i = 0; i < 4; i ++) + { + if (moves[i] != 0) + { + StringAppend(a0, gMoveNames[moves[i]]); + } + StringAppend(a0, gOtherText_ControlAndMiscText); + } + } + else + { + StringCopy(a0, gOtherText_Terminator); + StringAppend(a0, gOtherText_FourQuestions); + } +} + +#ifdef NONMATCHING +static void sub_804A41C(u8 whichParty) +{ + u8 i; + u8 nickname[22]; + u8 string[40]; + struct Pokemon *pokemon; + + string[0] = 0xFC; + string[1] = 0x06; + string[2] = 0x04; + string[3] = 0xFC; + string[4] = 0x11; + string[5] = 0x00; + + for (i = 0; i < gUnknown_03004824->partyCounts[whichParty]; i ++) + { + pokemon = whichParty == 0 ? &gPlayerParty[i] : &gEnemyParty[i]; + GetMonData(pokemon, MON_DATA_NICKNAME, nickname); + StringCopy10(string + 6, nickname); + GetMonGender(pokemon); + string[5] = (50 - GetStringWidthGivenWindowConfig(&gWindowConfig_81E7294, string + 6)) / 2; + sub_8003460(&gUnknown_03004824->window, string, gUnknown_03004824->unk_007a + 22 * 6 * whichParty + 22 * i, gTradeMonSpriteCoords[i + 6 * whichParty][0], gTradeMonSpriteCoords[i + 6 * whichParty][1]); + } +} +#else +__attribute__((naked)) +static void sub_804A41C(u8 whichParty) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0x44\n" + "\tlsls r0, 24\n" + "\tlsrs r5, r0, 24\n" + "\tadd r3, sp, 0x1C\n" + "\tmovs r2, 0\n" + "\tmovs r1, 0xFC\n" + "\tstrb r1, [r3]\n" + "\tmovs r0, 0x6\n" + "\tstrb r0, [r3, 0x1]\n" + "\tmovs r0, 0x4\n" + "\tstrb r0, [r3, 0x2]\n" + "\tstrb r1, [r3, 0x3]\n" + "\tmovs r0, 0x11\n" + "\tstrb r0, [r3, 0x4]\n" + "\tstrb r2, [r3, 0x5]\n" + "\tmovs r6, 0\n" + "\tldr r1, _0804A470 @ =gUnknown_03004824\n" + "\tldr r0, [r1]\n" + "\tadds r0, 0x42\n" + "\tadds r0, r5\n" + "\tldrb r0, [r0]\n" + "\tcmp r6, r0\n" + "\tbcs _0804A504\n" + "\tmov r8, r3\n" + "\tadds r7, r1, 0\n" + "\tldr r0, _0804A474 @ =gTradeMonSpriteCoords\n" + "\tmov r9, r0\n" + "\tmovs r4, 0x1\n" + "\tadd r4, r9\n" + "\tmov r10, r4\n" + "_0804A462:\n" + "\tcmp r5, 0\n" + "\tbne _0804A47C\n" + "\tmovs r0, 0x64\n" + "\tadds r4, r6, 0\n" + "\tmuls r4, r0\n" + "\tldr r0, _0804A478 @ =gPlayerParty\n" + "\tb _0804A484\n" + "\t.align 2, 0\n" + "_0804A470: .4byte gUnknown_03004824\n" + "_0804A474: .4byte gTradeMonSpriteCoords\n" + "_0804A478: .4byte gPlayerParty\n" + "_0804A47C:\n" + "\tmovs r0, 0x64\n" + "\tadds r4, r6, 0\n" + "\tmuls r4, r0\n" + "\tldr r0, _0804A514 @ =gEnemyParty\n" + "_0804A484:\n" + "\tadds r4, r0\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0x2\n" + "\tadd r2, sp, 0x4\n" + "\tbl GetMonData\n" + "\tmov r0, sp\n" + "\tadds r0, 0x22\n" + "\tadd r1, sp, 0x4\n" + "\tbl StringCopy10\n" + "\tadds r0, r4, 0\n" + "\tbl GetMonGender\n" + "\tmov r1, sp\n" + "\tadds r1, 0x22\n" + "\tldr r0, _0804A518 @ =gWindowConfig_81E7294\n" + "\tbl GetStringWidthGivenWindowConfig\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tmovs r1, 0x32\n" + "\tsubs r1, r0\n" + "\tlsrs r0, r1, 31\n" + "\tadds r1, r0\n" + "\tasrs r1, 1\n" + "\tmov r0, r8\n" + "\tstrb r1, [r0, 0x5]\n" + "\tldr r1, [r7]\n" + "\tadds r0, r1, 0x4\n" + "\tadds r1, 0x7A\n" + "\tlsls r2, r5, 5\n" + "\tadds r2, r5\n" + "\tlsls r2, 2\n" + "\tldrb r1, [r1]\n" + "\tadds r2, r1\n" + "\tmovs r1, 0x16\n" + "\tmuls r1, r6\n" + "\tadds r2, r1\n" + "\tlsls r2, 16\n" + "\tlsrs r2, 16\n" + "\tlsls r1, r5, 1\n" + "\tadds r1, r5\n" + "\tlsls r1, 1\n" + "\tadds r1, r6, r1\n" + "\tlsls r1, 1\n" + "\tmov r4, r9\n" + "\tadds r3, r1, r4\n" + "\tldrb r3, [r3]\n" + "\tadd r1, r10\n" + "\tldrb r1, [r1]\n" + "\tstr r1, [sp]\n" + "\tmov r1, r8\n" + "\tbl sub_8003460\n" + "\tadds r0, r6, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r6, r0, 24\n" + "\tldr r0, [r7]\n" + "\tadds r0, 0x42\n" + "\tadds r0, r5\n" + "\tldrb r0, [r0]\n" + "\tcmp r6, r0\n" + "\tbcc _0804A462\n" + "_0804A504:\n" + "\tadd sp, 0x44\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_0804A514: .4byte gEnemyParty\n" + "_0804A518: .4byte gWindowConfig_81E7294"); +} +#endif + +#ifdef NONMATCHING +static +#endif +void sub_804A51C(u8 a0, u8 a1, u8 a2, u8 a3, u8 a4, u8 a5) +{ + u8 nickname[24]; + u8 level; + u8 gender; + u8 lv_div_10; + sub_804A96C(&gUnknown_03004824->unk_00c8, a4, a5, gTradeMonBoxTilemap, 6, 3, 0); + if (a0 == 0) + { + level = GetMonData(&gPlayerParty[a1], MON_DATA_LEVEL, NULL); + gender = GetMonGender(&gPlayerParty[a1]); + GetMonData(&gPlayerParty[a1], MON_DATA_NICKNAME, nickname); + } + else + { + level = GetMonData(&gEnemyParty[a1], MON_DATA_LEVEL, NULL); + gender = GetMonGender(&gEnemyParty[a1]); + GetMonData(&gEnemyParty[a1], MON_DATA_NICKNAME, nickname); + } + if (gUnknown_03004824->unk_005d[a0][a1] == 0) + { + lv_div_10 = level / 10; + if (lv_div_10 != 0) + { + gUnknown_03004824->unk_00c8.unk_12[a2 + 32 * a3] = lv_div_10 + 0x60; + } + gUnknown_03004824->unk_00c8.unk_12[a2 + 32 * a3 + 1] = (u8)(level % 10) + 0x70; + if (gender == MON_MALE) + { + if (!NameHasGenderSymbol(nickname, MON_MALE)) + { + gUnknown_03004824->unk_00c8.unk_12[a2 + 32 * a3 - 31] += 1; + } + } + else if (gender == MON_FEMALE) + { + if (!NameHasGenderSymbol(nickname, MON_FEMALE)) + { + gUnknown_03004824->unk_00c8.unk_12[a2 + 32 * a3 - 31] += 2; + } + } + } + else + { + gUnknown_03004824->unk_00c8.unk_12[a2 + 32 * a3 - 32] = gUnknown_03004824->unk_00c8.unk_12[a2 + 32 * a3 - 33]; + gUnknown_03004824->unk_00c8.unk_12[a2 + 32 * a3 - 31] = gUnknown_03004824->unk_00c8.unk_12[a2 + 32 * a3 - 36] | 0x400; + } +#ifdef GERMAN + gUnknown_03004824->unk_00c8.unk_10 = 1; +#endif +} + +#ifdef NONMATCHING +static void sub_804A6DC(u8 whichParty) +{ + int i; + for (i = 0; i < gUnknown_03004824->partyCounts[whichParty]; i ++) + { + sub_804A51C(whichParty, i, gTradeLevelDisplayCoords[whichParty][i][0], gTradeLevelDisplayCoords[whichParty][i][1], gTradeMonBoxCoords[whichParty][i][0], gTradeMonBoxCoords[whichParty][i][1]); + } +} +#else +__attribute__((naked)) +static void sub_804A6DC(u8 whichParty) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tsub sp, 0x8\n" + "\tlsls r0, 24\n" + "\tlsrs r6, r0, 24\n" + "\tmovs r7, 0\n" + "\tldr r0, _0804A734 @ =gUnknown_03004824\n" + "\tldr r0, [r0]\n" + "\tadds r0, 0x42\n" + "\tadds r0, r6\n" + "\tldrb r0, [r0]\n" + "\tcmp r7, r0\n" + "\tbge _0804A72C\n" + "\tlsls r0, r6, 1\n" + "\tadds r0, r6\n" + "\tldr r1, _0804A738 @ =gTradeLevelDisplayCoords\n" + "\tlsls r0, 2\n" + "\tadds r5, r0, r1\n" + "\tldr r1, _0804A73C @ =gTradeMonBoxCoords\n" + "\tadds r4, r0, r1\n" + "_0804A702:\n" + "\tlsls r1, r7, 24\n" + "\tlsrs r1, 24\n" + "\tldrb r2, [r5]\n" + "\tldrb r3, [r5, 0x1]\n" + "\tldrb r0, [r4]\n" + "\tstr r0, [sp]\n" + "\tldrb r0, [r4, 0x1]\n" + "\tstr r0, [sp, 0x4]\n" + "\tadds r0, r6, 0\n" + "\tbl sub_804A51C\n" + "\tadds r5, 0x2\n" + "\tadds r4, 0x2\n" + "\tadds r7, 0x1\n" + "\tldr r0, _0804A734 @ =gUnknown_03004824\n" + "\tldr r0, [r0]\n" + "\tadds r0, 0x42\n" + "\tadds r0, r6\n" + "\tldrb r0, [r0]\n" + "\tcmp r7, r0\n" + "\tblt _0804A702\n" + "_0804A72C:\n" + "\tadd sp, 0x8\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_0804A734: .4byte gUnknown_03004824\n" + "_0804A738: .4byte gTradeLevelDisplayCoords\n" + "_0804A73C: .4byte gTradeMonBoxCoords"); +} +#endif + +static void sub_804A740(u8 whichParty) +{ + int i; + for (i = 0; i < gUnknown_03004824->partyCounts[whichParty]; i ++) + { + gSprites[gUnknown_03004824->partyIcons[whichParty][i]].invisible = FALSE; + gSprites[gUnknown_03004824->partyIcons[whichParty][i]].pos1.x = gTradeMonSpriteCoords[6 * whichParty + i][0] * 8 + 14; + gSprites[gUnknown_03004824->partyIcons[whichParty][i]].pos1.y = gTradeMonSpriteCoords[6 * whichParty + i][1] * 8 - 12; + gSprites[gUnknown_03004824->partyIcons[whichParty][i]].pos2.x = 0; + gSprites[gUnknown_03004824->partyIcons[whichParty][i]].pos2.y = 0; + } +} + +static void sub_804A80C(void) +{ + FillWindowRect_DefaultPalette(&gUnknown_03004824->window, 0, gUnknown_0820C330[1][0], 0, gUnknown_0820C330[1][1], 19); + sub_804A41C(1); +} + +static void sub_804A840(u8 whichParty) +{ + if (whichParty == 0) + { + FillWindowRect_DefaultPalette(&gUnknown_03004824->window, 0, gUnknown_0820C330[0][0], 0, gUnknown_0820C330[0][1], 19); + sub_804A96C_alt(&gUnknown_03004824->unk_00c8, 0, 0, gTradePartyBoxTilemap, 15, 17, 0); + sub_804A6DC(0); + sub_804A41C(0); + sub_804A740(0); + sub_804A938(&gUnknown_03004824->unk_00c8); + } + else + { + HandleDestroyMenuCursors(); + FillWindowRect_DefaultPalette(&gUnknown_03004824->window, 0, gUnknown_0820C330[1][0], 0, gUnknown_0820C330[1][1], 19); + sub_804A96C_alt(&gUnknown_03004824->unk_00c8, 15, 0, gTradePartyBoxTilemap, 15, 17, 0); + sub_804A6DC(1); + sub_804A41C(1); + sub_804A740(1); + sub_804A938(&gUnknown_03004824->unk_00c8); + } + sub_804ACD8(gUnknown_0820C14C[1], BG_CHAR_ADDR(4) + 32 * gUnknown_03004824->unk_007e, 20); + gUnknown_03004824->unk_0080[whichParty] = 0; +} + +static void sub_804A938(struct UnkStructD *unkStructD) +{ + unkStructD->unk_10 = 1; +} + +static void sub_804A940(struct UnkStructD *unkStructD) +{ + if (unkStructD->unk_10) + { + CpuCopy16(unkStructD->unk_12, unkStructD->vramAddr, sizeof(unkStructD->unk_12)); + unkStructD->unk_10 = 0; + } +} + +static void sub_804A964(struct UnkStructD *unkStructD, void *dest) +{ + unkStructD->unk_10 = 0; + unkStructD->vramAddr = dest; +} + +static void sub_804A96C(struct UnkStructD *arg0, u8 left, u8 top, const u16 *tilemap, u8 width, u8 height, u16 sp8) { + int y, x; + + for (y = 0; y < height; y++) + { + + for (x = 0; x < width; x++) + { + arg0->unk_12[(top * 32 + left) + y * 32 + x] = tilemap[width * y + x] | sp8; + } + } + +#if ENGLISH + arg0->unk_10 = 1; +#endif +} + +#if GERMAN +static void sub_804A96C_alt(struct UnkStructD *arg0, u8 left, u8 top, const u16 *tilemap, u8 width, u8 height, u16 sp8) { + sub_804A96C(arg0, left, top, tilemap, width, height, sp8); + + arg0->unk_10 = 1; +} +#endif + +static void sub_804A9F4(u8 unused) +{ + MenuZeroFillScreen(); +} + +static void sub_804AA00(u8 unused) +{ + MenuZeroFillScreen(); +} + +static void sub_804AA0C(u8 a0) +{ + DrawTextWindow(&gUnknown_03004824->window, gTradeMessageWindowRects[a0][0], gTradeMessageWindowRects[a0][1], gTradeMessageWindowRects[a0][2], gTradeMessageWindowRects[a0][3]); + sub_8003460(&gUnknown_03004824->window, gUnknown_0820C2F0[a0], 0x180 + gUnknown_03004824->unk_007a, gTradeMessageWindowRects[a0][0] + 1, gTradeMessageWindowRects[a0][1] + 1); +} + +static void sub_804AA88(void) +{ + int i; + for (i = 0; i < 4; i ++) + { + gUnknown_03004824->unk_08dc[i].unk_00 = 0; + gUnknown_03004824->unk_08dc[i].unk_02 = 0; + gUnknown_03004824->unk_08dc[i].unk_04 |= 0xff; + } +} + +static void sub_804AADC(u16 a0, u8 a1) +{ + int i; + for (i = 0; i < 4; i ++) + { + if (gUnknown_03004824->unk_08dc[i].unk_00 == 0) + { + gUnknown_03004824->unk_08dc[i].unk_02 = a0; + gUnknown_03004824->unk_08dc[i].unk_04 = a1; + gUnknown_03004824->unk_08dc[i].unk_00 = 1; + break; + } + } +} + +static void sub_804AB30(void) +{ + int i; + for (i = 0; i < 4; i ++) + { + if (gUnknown_03004824->unk_08dc[i].unk_00) + { + if (gUnknown_03004824->unk_08dc[i].unk_02 != 0) + { + gUnknown_03004824->unk_08dc[i].unk_02 --; + continue; + } + switch (gUnknown_03004824->unk_08dc[i].unk_04) + { + case 0: + Trade_SendData(gUnknown_03004824); + break; + case 1: + sub_804AA0C(0); + break; + case 2: + sub_804AA0C(2); + break; + case 3: + sub_804AA0C(3); + break; + case 4: + sub_804AA0C(3); + break; + case 5: + sub_804AA0C(3); + break; + } + gUnknown_03004824->unk_08dc[i].unk_00 = 0; + } + } +} + +static bool8 sub_804ABF8(void) +{ + switch (gUnknown_03004824->unk_00b4) + { + case 8: + gUnknown_03004824->unk_007e = LoadSpriteSheet(&gUnknown_0820C07C[gUnknown_03004824->unk_00b4]); + gUnknown_03004824->unk_00b4 ++; + return FALSE; + case 13: + LoadSpritePalette(&gSpritePalette_TradeScreenText); + gUnknown_03004824->unk_00b4 ++; + return FALSE; + case 14: + LoadSpritePalette(&gUnknown_0820C12C); + gUnknown_03004824->unk_00b4 ++; + return FALSE; + case 15: + LoadSpriteSheet(&gUnknown_0820C124); + gUnknown_03004824->unk_00b4 ++; + // fallthrough + case 16: + gUnknown_03004824->unk_00b4 = 0; + return TRUE; + default: + LoadSpriteSheet(&gUnknown_0820C07C[gUnknown_03004824->unk_00b4]); + gUnknown_03004824->unk_00b4 ++; + return FALSE; + } +} + +static void sub_804ACD8(const u8 *src, u8 *dest, u8 a2) +{ + sub_804AFB8(&gWindowConfig_81E725C, dest, src, a2); +} + +#ifdef NONMATCHING +static void sub_804ACF4(u8 who) +{ + struct Pokemon *pokemon; + int i; + switch (who) + { + case 0: + for (i = 0; i < gUnknown_03004824->partyCounts[0]; i ++) + { + pokemon = &gPlayerParty[i]; + if (GetMonData(pokemon, MON_DATA_IS_EGG) == TRUE) + { + gUnknown_03004824->unk_0051[0][i] = 0; + gUnknown_03004824->unk_005d[0][i] = 1; + } + else if (GetMonData(pokemon, MON_DATA_HP) == 0) + { + gUnknown_03004824->unk_0051[0][i] = 0; + gUnknown_03004824->unk_005d[0][i] = 0; + } + else + { + gUnknown_03004824->unk_0051[0][i] = 1; + gUnknown_03004824->unk_005d[0][i] = 0; + } + } + break; + case 1: + for (i = 0; i < gUnknown_03004824->partyCounts[1]; i ++) + { + pokemon = &gEnemyParty[i]; + if (GetMonData(pokemon, MON_DATA_IS_EGG) == TRUE) + { + gUnknown_03004824->unk_0051[1][i] = 0; + gUnknown_03004824->unk_005d[1][i] = 1; + } + else if (GetMonData(pokemon, MON_DATA_HP) == 0) + { + gUnknown_03004824->unk_0051[1][i] = 0; + gUnknown_03004824->unk_005d[1][i] = 0; + } + else + { + gUnknown_03004824->unk_0051[1][i] = 1; + gUnknown_03004824->unk_005d[1][i] = 0; + } + } + break; + } +} +#else +static __attribute__((naked)) void sub_804ACF4(u8 who) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r9\n" + "\tmov r6, r8\n" + "\tpush {r6,r7}\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tmov r8, r0\n" + "\tcmp r0, 0\n" + "\tbeq _0804AD0C\n" + "\tcmp r0, 0x1\n" + "\tbeq _0804ADA0\n" + "\tb _0804AE2C\n" + "_0804AD0C:\n" + "\tmovs r7, 0\n" + "\tldr r1, _0804AD4C @ =gUnknown_03004824\n" + "\tldr r0, [r1]\n" + "\tadds r0, 0x42\n" + "\tldrb r0, [r0]\n" + "\tcmp r7, r0\n" + "\tblt _0804AD1C\n" + "\tb _0804AE2C\n" + "_0804AD1C:\n" + "\tadds r6, r1, 0\n" + "\tmovs r5, 0\n" + "\tmov r9, r5\n" + "_0804AD22:\n" + "\tmovs r0, 0x64\n" + "\tadds r1, r7, 0\n" + "\tmuls r1, r0\n" + "\tldr r0, _0804AD50 @ =gPlayerParty\n" + "\tadds r4, r1, r0\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0x2D\n" + "\tbl GetMonData\n" + "\tadds r1, r0, 0\n" + "\tcmp r1, 0x1\n" + "\tbne _0804AD54\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x51\n" + "\tadds r0, r5\n" + "\tmov r2, r9\n" + "\tstrb r2, [r0]\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x5D\n" + "\tadds r0, r5\n" + "\tb _0804AD84\n" + "\t.align 2, 0\n" + "_0804AD4C: .4byte gUnknown_03004824\n" + "_0804AD50: .4byte gPlayerParty\n" + "_0804AD54:\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0x39\n" + "\tbl GetMonData\n" + "\tadds r1, r0, 0\n" + "\tcmp r1, 0\n" + "\tbne _0804AD72\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x51\n" + "\tadds r0, r5\n" + "\tstrb r1, [r0]\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x5D\n" + "\tadds r0, r5\n" + "\tb _0804AD84\n" + "_0804AD72:\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x51\n" + "\tadds r0, r5\n" + "\tmovs r1, 0x1\n" + "\tstrb r1, [r0]\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x5D\n" + "\tadds r0, r5\n" + "\tmov r1, r9\n" + "_0804AD84:\n" + "\tstrb r1, [r0]\n" + "\tldr r0, _0804AD9C @ =gUnknown_03004824\n" + "\tadds r5, 0x1\n" + "\tadds r7, 0x1\n" + "\tldr r0, [r0]\n" + "\tadds r0, 0x42\n" + "\tadd r0, r8\n" + "\tldrb r0, [r0]\n" + "\tcmp r7, r0\n" + "\tblt _0804AD22\n" + "\tb _0804AE2C\n" + "\t.align 2, 0\n" + "_0804AD9C: .4byte gUnknown_03004824\n" + "_0804ADA0:\n" + "\tmovs r7, 0\n" + "\tldr r1, _0804ADE0 @ =gUnknown_03004824\n" + "\tldr r0, [r1]\n" + "\tadds r0, 0x43\n" + "\tldrb r0, [r0]\n" + "\tcmp r7, r0\n" + "\tbge _0804AE2C\n" + "\tadds r6, r1, 0\n" + "\tmovs r5, 0x6\n" + "\tmovs r2, 0\n" + "\tmov r9, r2\n" + "_0804ADB6:\n" + "\tmovs r0, 0x64\n" + "\tadds r1, r7, 0\n" + "\tmuls r1, r0\n" + "\tldr r0, _0804ADE4 @ =gEnemyParty\n" + "\tadds r4, r1, r0\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0x2D\n" + "\tbl GetMonData\n" + "\tadds r1, r0, 0\n" + "\tcmp r1, 0x1\n" + "\tbne _0804ADE8\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x51\n" + "\tadds r0, r5\n" + "\tmov r2, r9\n" + "\tstrb r2, [r0]\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x5D\n" + "\tadds r0, r5\n" + "\tb _0804AE18\n" + "\t.align 2, 0\n" + "_0804ADE0: .4byte gUnknown_03004824\n" + "_0804ADE4: .4byte gEnemyParty\n" + "_0804ADE8:\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0x39\n" + "\tbl GetMonData\n" + "\tadds r1, r0, 0\n" + "\tcmp r1, 0\n" + "\tbne _0804AE06\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x51\n" + "\tadds r0, r5\n" + "\tstrb r1, [r0]\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x5D\n" + "\tadds r0, r5\n" + "\tb _0804AE18\n" + "_0804AE06:\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x51\n" + "\tadds r0, r5\n" + "\tmovs r1, 0x1\n" + "\tstrb r1, [r0]\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x5D\n" + "\tadds r0, r5\n" + "\tmov r1, r9\n" + "_0804AE18:\n" + "\tstrb r1, [r0]\n" + "\tldr r0, _0804AE38 @ =gUnknown_03004824\n" + "\tadds r5, 0x1\n" + "\tadds r7, 0x1\n" + "\tldr r0, [r0]\n" + "\tadds r0, 0x42\n" + "\tadd r0, r8\n" + "\tldrb r0, [r0]\n" + "\tcmp r7, r0\n" + "\tblt _0804ADB6\n" + "_0804AE2C:\n" + "\tpop {r3,r4}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_0804AE38: .4byte gUnknown_03004824"); +} +#endif + +static void sub_804AE3C(u8 who) +{ + u16 i; + u16 curHp; + u16 maxHp; + switch (who) + { + case 0: + for (i = 0; i < gUnknown_03004824->partyCounts[0]; i ++) + { + curHp = GetMonData(&gPlayerParty[i], MON_DATA_HP); + maxHp = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP); + gUnknown_03004824->unk_0069[0][i] = GetHPBarLevel(curHp, maxHp); + } + break; + case 1: + for (i = 0; i < gUnknown_03004824->partyCounts[1]; i ++) + { + curHp = GetMonData(&gEnemyParty[i], MON_DATA_HP); + maxHp = GetMonData(&gEnemyParty[i], MON_DATA_MAX_HP); + gUnknown_03004824->unk_0069[1][i] = GetHPBarLevel(curHp, maxHp); + } + break; + } +} + +static void sub_804AF10(void) +{ + int i, j; + for (i = 0; i < 2; i ++) + { + for (j = 0; j < gUnknown_03004824->partyCounts[i]; j ++) + { + sub_809D824(&gSprites[gUnknown_03004824->partyIcons[i][j]], 4 - gUnknown_03004824->unk_0069[i][j]); + } + } +} + +static void sub_804AF84(void) +{ + int i; + for (i = 0; i < 11; i ++) + if (gSaveBlock1.giftRibbons[i] == 0 && gUnknown_03004824->unk_00b5[i] != 0) + gSaveBlock1.giftRibbons[i] = gUnknown_03004824->unk_00b5[i]; +} + +static void sub_804AFB8(const struct WindowConfig *windowConfig, u8 *dest, const u8 *src, u8 size) +{ + u8 i; + u8 *tileBuffer; + size = (size + 3) / 4; + tileBuffer = gTileBuffer; + CpuFill16(0, tileBuffer, size * 0x80); + CpuFill16(0, tileBuffer + windowConfig->width * 0x20, size * 0x80); + sub_8004E3C(windowConfig, tileBuffer, src); + for (i = 0; i < size; i ++) + { + CpuCopy16(&tileBuffer[32 * (i * 4)], &dest[32 * (i * 8)], 0x80); + CpuCopy16(&tileBuffer[32 * (i * 4 + windowConfig->width)], &dest[32 * (i * 8 + 4)], 0x80); + } +} + +static void sub_804B058(struct Sprite *sprite) +{ + if (++ sprite->data0 == 10) + { + PlaySE(SE_BOWA); + sprite->data0 = 0; + } +} + +static void sub_804B07C(struct Sprite *sprite) +{ + if (sprite->data1 == 0) + { + if (++ sprite->data0 == 12) + sprite->data0 = 0; + LoadPalette(&gTradeGlow2PaletteAnimTable[sprite->data0], 16 * (sprite->oam.paletteNum + 16) + 4, 2); + } +} + +static void sub_804B0BC(struct Sprite *sprite) +{ + sprite->data0 ++; + sprite->pos2.y ++; + if (sprite->data0 == 10) + DestroySprite(sprite); +} + +static void sub_804B0E0(struct Sprite *sprite) +{ + sprite->data0 ++; + sprite->pos2.y --; + if (sprite->data0 == 10) + DestroySprite(sprite); +} + +static void sub_804B104(struct Sprite *sprite) +{ + if (++ sprite->data0 == 15) + { + PlaySE(SE_W107); + sprite->data0 = 0; + } +} + +static void sub_804B128(void) +{ + struct BgAffineDstData dest; + DoBgAffineSet(&dest, gUnknown_03004828->unk_0104 << 8, gUnknown_03004828->unk_0106 << 8, gUnknown_03004828->unk_010c, gUnknown_03004828->unk_010e, gUnknown_03004828->unk_0118, gUnknown_03004828->unk_0118, gUnknown_03004828->unk_011c); + REG_BG2PA = dest.pa; + REG_BG2PB = dest.pb; + REG_BG2PC = dest.pc; + REG_BG2PD = dest.pd; + REG_BG2X = dest.dx; + REG_BG2Y = dest.dy; +} + +#ifdef NONMATCHING +static void sub_804B1BC(void) +{ + REG_BG1VOFS = gUnknown_03004828->bg1vofs; + REG_BG1HOFS = gUnknown_03004828->bg1hofs; + if ((REG_DISPCNT & 7) == DISPCNT_MODE_0) + { + REG_BG2VOFS = gUnknown_03004828->bg2vofs; + REG_BG2HOFS = gUnknown_03004828->bg2hofs; + } + else + { + sub_804B128(); + } +} +#else +__attribute__((naked)) static void sub_804B1BC(void) +{ + asm_unified("\tpush {lr}\n" + "\tldr r1, _0804B1FC @ =REG_BG1VOFS\n" + "\tldr r0, _0804B200 @ =gUnknown_03004828\n" + "\tldr r2, [r0]\n" + "\tmovs r3, 0x88\n" + "\tlsls r3, 1\n" + "\tadds r0, r2, r3\n" + "\tldrh r0, [r0]\n" + "\tstrh r0, [r1]\n" + "\tsubs r1, 0x2\n" + "\tadds r3, 0x2\n" + "\tadds r0, r2, r3\n" + "\tldrh r0, [r0]\n" + "\tstrh r0, [r1]\n" + "\tmovs r0, 0x80\n" + "\tlsls r0, 19\n" + "\tldrh r0, [r0]\n" + "\tmovs r1, 0x7\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbne _0804B208\n" + "\tldr r1, _0804B204 @ =REG_BG2VOFS\n" + "\tadds r3, 0x2\n" + "\tadds r0, r2, r3\n" + "\tldrh r0, [r0]\n" + "\tstrh r0, [r1]\n" + "\tsubs r1, 0x2\n" + "\tadds r3, 0x2\n" + "\tadds r0, r2, r3\n" + "\tldrh r0, [r0]\n" + "\tstrh r0, [r1]\n" + "\tb _0804B20C\n" + "\t.align 2, 0\n" + "_0804B1FC: .4byte REG_BG1VOFS\n" + "_0804B200: .4byte gUnknown_03004828\n" + "_0804B204: .4byte REG_BG2VOFS\n" + "_0804B208:\n" + "\tbl sub_804B128\n" + "_0804B20C:\n" + "\tpop {r0}\n" + "\tbx r0"); +} +#endif + +static void sub_804B210(void) +{ + sub_804B1BC(); + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void sub_804B228(void) +{ + gUnknown_03004828->unk_00b4 = 0; + gUnknown_03004828->unk_00b2 = 0; + gUnknown_03004828->unk_00b3 = 0; +} + +#ifdef NONMATCHING +static +#endif +void sub_804B24C(void) +{ + if (gUnknown_03004828->unk_00b2 == gUnknown_03004828->unk_00b3) + { + gUnknown_03004828->unk_00b4 ++; + } + else + { + gUnknown_03004828->unk_00b4 = 0; + } + if (gUnknown_03004828->unk_00b4 > 0xb4) + { + gUnknown_03004828->unk_00b4 = 0; + gUnknown_03004828->unk_00b3 = 0; + gUnknown_03004828->unk_00b2 = 0; + } + gUnknown_03004828->unk_00b3 = gUnknown_03004828->unk_00b2; +} + +static u8 sub_804B2B0(void) +{ + if (gReceivedRemoteLinkPlayers) + return GetMultiplayerId(); + return 0; +} + +static void sub_804B2D0(u8 whichParty, u8 a1) +{ + u8 v0; + struct Pokemon *pokemon; + u16 species; + u32 personality; + + v0 = 0; + pokemon = NULL; + if (whichParty == 0) + { + pokemon = &gPlayerParty[gUnknown_020297D8[0]]; + v0 = 1; + } + if (whichParty == 1) + { + pokemon = &gEnemyParty[gUnknown_020297D8[1] % 6]; + v0 = 3; + } + switch (a1) + { + case 0: + species = GetMonData(pokemon, MON_DATA_SPECIES2); + personality = GetMonData(pokemon, MON_DATA_PERSONALITY); + HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, (u32)ewram, gUnknown_081FAF4C[whichParty * 2 + 1], species, personality); + LoadCompressedObjectPalette(GetMonSpritePalStruct(pokemon)); + gUnknown_03004828->tradeSpecies[whichParty] = species; + break; + case 1: + GetMonSpriteTemplate_803C56C(GetMonSpritePalStruct(pokemon)->tag, v0); + gUnknown_03004828->pokePicSpriteIdxs[whichParty] = CreateSprite(&gUnknown_02024E8C, 0x78, 0x3c, 0x6); + gSprites[gUnknown_03004828->pokePicSpriteIdxs[whichParty]].invisible = TRUE; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[whichParty]].callback = SpriteCallbackDummy; + break; + } +} + +#ifdef NONMATCHING +static void sub_804B41C(void) +// Link trade init +{ + switch (gMain.state) + { + case 0: + REG_DISPCNT = 0; + ResetTasks(); + CloseLink(); + gUnknown_03004828 = &ewram_2010000.unk_0f000; + ResetSpriteData(); + FreeAllSpritePalettes(); + SetVBlankCallback(sub_804B210); + sub_804B228(); + SetUpWindowConfig(&gWindowConfig_81E6F84); + InitWindowFromConfig(&gUnknown_03004828->window, &gWindowConfig_81E6F84); + gUnknown_03004828->textWindowBaseTileNum = SetTextWindowBaseTileNum(2); + LoadTextWindowGraphics(&gUnknown_03004828->window); + MenuZeroFillScreen(); + gLinkType = 0x1144; + gMain.state ++; + LZDecompressVram(gUnknown_08D00000, (void *)VRAM); + CpuCopy16(gUnknown_08D00524, ewram, 0x1000); + DmaCopy16Defvars(3, ewram, BG_SCREEN_ADDR(5), 0x500); + LoadCompressedPalette(gUnknown_08D004E0, 0, 32); + gUnknown_03004828->unk_00b6 = 0; + gUnknown_03004828->unk_00c4 = 0; + gUnknown_03004828->isLinkTrade = TRUE; + gUnknown_03004828->unk_0104 = 0x40; + gUnknown_03004828->unk_0106 = 0x40; + gUnknown_03004828->unk_0108 = 0; + gUnknown_03004828->unk_010a = 0; + gUnknown_03004828->unk_010c = 0x78; + gUnknown_03004828->unk_010e = 0x50; + gUnknown_03004828->unk_0118 = 0x100; + gUnknown_03004828->unk_011c = 0; + break; + case 1: + OpenLink(); + gMain.state ++; + gUnknown_03004828->unk_00c0 = 0; + break; + case 2: + if (++ gUnknown_03004828->unk_00c0 > 60) + { + gUnknown_03004828->unk_00c0 = 0; + gMain.state ++; + } + break; + case 3: + if (IsLinkMaster()) + { + if (GetLinkPlayerCount_2() >= sub_800820C() && ++ gUnknown_03004828->unk_00c0 > 30) + { + sub_8007F4C(); + gMain.state ++; + } + } + else + { + gMain.state ++; + } + break; + case 4: + sub_804B24C(); + if (gReceivedRemoteLinkPlayers == TRUE && IsLinkPlayerDataExchangeComplete() == TRUE) gMain.state ++; + break; + case 5: + gUnknown_03004828->unk_009c = 0; + gUnknown_03004828->unk_009d = 0; + gUnknown_03004828->unk_00bd = 0; + sub_804B2D0(0, 0); + gMain.state ++; + break; + case 6: + sub_804B2D0(0, 1); + gMain.state ++; + break; + case 7: + sub_804B2D0(1, 0); + gMain.state ++; + break; + case 8: + sub_804B2D0(1, 1); + gMain.state ++; + break; + case 9: + sub_804C164(); + LoadSpriteSheet(&gUnknown_0821594C); + LoadSpritePalette(&gUnknown_08215954); + REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(5); + gMain.state ++; + break; + case 10: + gMain.state ++; + // fallthrough + case 11: + sub_804BBE8(5); + sub_804BBE8(0); + sub_804C1A8(); + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + gMain.state ++; + break; + case 12: + if (!gPaletteFade.active) + { + SetMainCallback2(sub_804DB84); + } + break; + } + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} +#else +static __attribute__((naked)) void sub_804B41C(void) +{ + asm_unified("\tpush {r4-r6,lr}\n" + "\tsub sp, 0x4\n" + "\tldr r1, _0804B43C @ =gMain\n" + "\tldr r2, _0804B440 @ =0x0000043c\n" + "\tadds r0, r1, r2\n" + "\tldrb r0, [r0]\n" + "\tadds r2, r1, 0\n" + "\tcmp r0, 0xC\n" + "\tbls _0804B430\n" + "\tb _0804B76E_break\n" + "_0804B430:\n" + "\tlsls r0, 2\n" + "\tldr r1, _0804B444 @ =_0804B448\n" + "\tadds r0, r1\n" + "\tldr r0, [r0]\n" + "\tmov pc, r0\n" + "\t.align 2, 0\n" + "_0804B43C: .4byte gMain\n" + "_0804B440: .4byte 0x0000043c\n" + "_0804B444: .4byte _0804B448\n" + "\t.align 2, 0\n" + "_0804B448:\n" + "\t.4byte _0804B47C_case00\n" + "\t.4byte _0804B5AC_case01\n" + "\t.4byte _0804B5D4_case02\n" + "\t.4byte _0804B5FC_case03\n" + "\t.4byte _0804B648_case04\n" + "\t.4byte _0804B678_case05\n" + "\t.4byte _0804B6A8_case06\n" + "\t.4byte _0804B6B2_case07\n" + "\t.4byte _0804B6CC_case08\n" + "\t.4byte _0804B6E4_case09\n" + "\t.4byte _0804B71C_case10\n" + "\t.4byte _0804B726_case11\n" + "\t.4byte _0804B75C_case12\n" + "_0804B47C_case00:\n" + "\tmovs r1, 0x80\n" + "\tlsls r1, 19\n" + "\tmovs r0, 0\n" + "\tstrh r0, [r1]\n" + "\tbl ResetTasks\n" + "\tbl CloseLink\n" + "\tldr r6, _0804B570 @ =gUnknown_03004828\n" + "\tldr r5, _0804B574 @ =0x0201f000\n" + "\tstr r5, [r6]\n" + "\tbl ResetSpriteData\n" + "\tbl FreeAllSpritePalettes\n" + "\tldr r0, _0804B578 @ =sub_804B210\n" + "\tbl SetVBlankCallback\n" + "\tbl sub_804B228\n" + "\tldr r4, _0804B57C @ =gWindowConfig_81E6F84\n" + "\tadds r0, r4, 0\n" + "\tbl SetUpWindowConfig\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x4\n" + "\tadds r1, r4, 0\n" + "\tbl InitWindowFromConfig\n" + "\tmovs r0, 0x2\n" + "\tbl SetTextWindowBaseTileNum\n" + "\tldr r1, [r6]\n" + "\tadds r1, 0x34\n" + "\tstrb r0, [r1]\n" + "\tldr r0, [r6]\n" + "\tadds r0, 0x4\n" + "\tbl LoadTextWindowGraphics\n" + "\tbl MenuZeroFillScreen\n" + "\tldr r1, _0804B580 @ =gLinkType\n" + "\tldr r4, _0804B584 @ =0x00001144\n" + "\tadds r0, r4, 0\n" + "\tstrh r0, [r1]\n" + "\tldr r1, _0804B588 @ =gMain\n" + "\tldr r0, _0804B58C @ =0x0000043c\n" + "\tadds r1, r0\n" + "\tldrb r0, [r1]\n" + "\tadds r0, 0x1\n" + "\tstrb r0, [r1]\n" + "\tldr r0, _0804B590 @ =gUnknown_08D00000\n" + "\tmovs r1, 0xC0\n" + "\tlsls r1, 19\n" + "\tbl LZDecompressVram\n" + "\tldr r0, _0804B594 @ =gUnknown_08D00524\n" + "\tldr r1, _0804B598 @ =0xfffe1000\n" + "\tadds r5, r1\n" + "\tmovs r2, 0x80\n" + "\tlsls r2, 4\n" + "\tadds r1, r5, 0\n" + "\tbl CpuSet\n" + "\tldr r1, _0804B59C @ =0x06002800\n" + "\tldr r0, _0804B5A0 @ =0x040000d4\n" + "\tstr r5, [r0]\n" + "\tstr r1, [r0, 0x4]\n" + "\tldr r1, _0804B5A4 @ =0x80000280\n" + "\tstr r1, [r0, 0x8]\n" + "\tldr r0, [r0, 0x8]\n" + "\tldr r0, _0804B5A8 @ =gUnknown_08D004E0\n" + "\tmovs r1, 0\n" + "\tmovs r2, 0x20\n" + "\tbl LoadCompressedPalette\n" + "\tldr r1, [r6]\n" + "\tadds r0, r1, 0\n" + "\tadds r0, 0xB6\n" + "\tmovs r2, 0\n" + "\tstrh r2, [r0]\n" + "\tadds r0, 0xE\n" + "\tstrh r2, [r0]\n" + "\tmovs r4, 0x8F\n" + "\tlsls r4, 1\n" + "\tadds r1, r4\n" + "\tmovs r0, 0x1\n" + "\tstrb r0, [r1]\n" + "\tldr r3, [r6]\n" + "\tmovs r1, 0x82\n" + "\tlsls r1, 1\n" + "\tadds r0, r3, r1\n" + "\tmovs r1, 0x40\n" + "\tstrh r1, [r0]\n" + "\tsubs r4, 0x18\n" + "\tadds r0, r3, r4\n" + "\tstrh r1, [r0]\n" + "\tadds r1, 0xC8\n" + "\tadds r0, r3, r1\n" + "\tstrh r2, [r0]\n" + "\tadds r4, 0x4\n" + "\tadds r0, r3, r4\n" + "\tstrh r2, [r0]\n" + "\tmovs r0, 0x86\n" + "\tlsls r0, 1\n" + "\tadds r1, r3, r0\n" + "\tmovs r0, 0x78\n" + "\tstrh r0, [r1]\n" + "\tadds r4, 0x4\n" + "\tadds r1, r3, r4\n" + "\tmovs r0, 0x50\n" + "\tstrh r0, [r1]\n" + "\tadds r0, 0xC8\n" + "\tadds r1, r3, r0\n" + "\tsubs r0, 0x18\n" + "\tstrh r0, [r1]\n" + "\tmovs r1, 0x8E\n" + "\tlsls r1, 1\n" + "\tadds r0, r3, r1\n" + "\tstrh r2, [r0]\n" + "\tb _0804B76E_break\n" + "\t.align 2, 0\n" + "_0804B570: .4byte gUnknown_03004828\n" + "_0804B574: .4byte 0x0201f000\n" + "_0804B578: .4byte sub_804B210\n" + "_0804B57C: .4byte gWindowConfig_81E6F84\n" + "_0804B580: .4byte gLinkType\n" + "_0804B584: .4byte 0x00001144\n" + "_0804B588: .4byte gMain\n" + "_0804B58C: .4byte 0x0000043c\n" + "_0804B590: .4byte gUnknown_08D00000\n" + "_0804B594: .4byte gUnknown_08D00524\n" + "_0804B598: .4byte 0xfffe1000\n" + "_0804B59C: .4byte 0x06002800\n" + "_0804B5A0: .4byte 0x040000d4\n" + "_0804B5A4: .4byte 0x80000280\n" + "_0804B5A8: .4byte gUnknown_08D004E0\n" + "_0804B5AC_case01:\n" + "\tbl OpenLink\n" + "\tldr r1, _0804B5C8 @ =gMain\n" + "\tldr r2, _0804B5CC @ =0x0000043c\n" + "\tadds r1, r2\n" + "\tldrb r0, [r1]\n" + "\tadds r0, 0x1\n" + "\tmovs r2, 0\n" + "\tstrb r0, [r1]\n" + "\tldr r0, _0804B5D0 @ =gUnknown_03004828\n" + "\tldr r0, [r0]\n" + "\tadds r0, 0xC0\n" + "\tstr r2, [r0]\n" + "\tb _0804B76E_break\n" + "\t.align 2, 0\n" + "_0804B5C8: .4byte gMain\n" + "_0804B5CC: .4byte 0x0000043c\n" + "_0804B5D0: .4byte gUnknown_03004828\n" + "_0804B5D4_case02:\n" + "\tldr r0, _0804B5F4 @ =gUnknown_03004828\n" + "\tldr r0, [r0]\n" + "\tadds r1, r0, 0\n" + "\tadds r1, 0xC0\n" + "\tldr r0, [r1]\n" + "\tadds r0, 0x1\n" + "\tstr r0, [r1]\n" + "\tcmp r0, 0x3C\n" + "\tbhi _0804B5E8\n" + "\tb _0804B76E_break\n" + "_0804B5E8:\n" + "\tmovs r0, 0\n" + "\tstr r0, [r1]\n" + "\tldr r4, _0804B5F8 @ =0x0000043c\n" + "\tadds r1, r2, r4\n" + "\tb _0804B74C\n" + "\t.align 2, 0\n" + "_0804B5F4: .4byte gUnknown_03004828\n" + "_0804B5F8: .4byte 0x0000043c\n" + "_0804B5FC_case03:\n" + "\tbl IsLinkMaster\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbne _0804B608\n" + "\tb _0804B746\n" + "_0804B608:\n" + "\tbl GetLinkPlayerCount_2\n" + "\tadds r4, r0, 0\n" + "\tbl sub_800820C\n" + "\tlsls r4, 24\n" + "\tlsls r0, 24\n" + "\tcmp r4, r0\n" + "\tbcs _0804B61C\n" + "\tb _0804B76E_break\n" + "_0804B61C:\n" + "\tldr r0, _0804B63C @ =gUnknown_03004828\n" + "\tldr r1, [r0]\n" + "\tadds r1, 0xC0\n" + "\tldr r0, [r1]\n" + "\tadds r0, 0x1\n" + "\tstr r0, [r1]\n" + "\tcmp r0, 0x1E\n" + "\tbhi _0804B62E\n" + "\tb _0804B76E_break\n" + "_0804B62E:\n" + "\tbl sub_8007F4C\n" + "\tldr r1, _0804B640 @ =gMain\n" + "\tldr r0, _0804B644 @ =0x0000043c\n" + "\tadds r1, r0\n" + "\tb _0804B74C\n" + "\t.align 2, 0\n" + "_0804B63C: .4byte gUnknown_03004828\n" + "_0804B640: .4byte gMain\n" + "_0804B644: .4byte 0x0000043c\n" + "_0804B648_case04:\n" + "\tbl sub_804B24C\n" + "\tldr r0, _0804B66C @ =gReceivedRemoteLinkPlayers\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0x1\n" + "\tbeq _0804B656\n" + "\tb _0804B76E_break\n" + "_0804B656:\n" + "\tbl IsLinkPlayerDataExchangeComplete\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r0, 0x1\n" + "\tbeq _0804B664\n" + "\tb _0804B76E_break\n" + "_0804B664:\n" + "\tldr r1, _0804B670 @ =gMain\n" + "\tldr r4, _0804B674 @ =0x0000043c\n" + "\tadds r1, r4\n" + "\tb _0804B74C\n" + "\t.align 2, 0\n" + "_0804B66C: .4byte gReceivedRemoteLinkPlayers\n" + "_0804B670: .4byte gMain\n" + "_0804B674: .4byte 0x0000043c\n" + "_0804B678_case05:\n" + "\tldr r2, _0804B69C @ =gUnknown_03004828\n" + "\tldr r0, [r2]\n" + "\tadds r0, 0x9C\n" + "\tmovs r1, 0\n" + "\tstrb r1, [r0]\n" + "\tldr r0, [r2]\n" + "\tadds r0, 0x9D\n" + "\tstrb r1, [r0]\n" + "\tldr r0, [r2]\n" + "\tadds r0, 0xBD\n" + "\tstrb r1, [r0]\n" + "\tmovs r0, 0\n" + "\tbl sub_804B2D0\n" + "\tldr r1, _0804B6A0 @ =gMain\n" + "\tldr r0, _0804B6A4 @ =0x0000043c\n" + "\tadds r1, r0\n" + "\tb _0804B74C\n" + "\t.align 2, 0\n" + "_0804B69C: .4byte gUnknown_03004828\n" + "_0804B6A0: .4byte gMain\n" + "_0804B6A4: .4byte 0x0000043c\n" + "_0804B6A8_case06:\n" + "\tmovs r0, 0\n" + "\tmovs r1, 0x1\n" + "\tbl sub_804B2D0\n" + "\tb _0804B746\n" + "_0804B6B2_case07:\n" + "\tmovs r0, 0x1\n" + "\tmovs r1, 0\n" + "\tbl sub_804B2D0\n" + "\tldr r1, _0804B6C4 @ =gMain\n" + "\tldr r4, _0804B6C8 @ =0x0000043c\n" + "\tadds r1, r4\n" + "\tb _0804B74C\n" + "\t.align 2, 0\n" + "_0804B6C4: .4byte gMain\n" + "_0804B6C8: .4byte 0x0000043c\n" + "_0804B6CC_case08:\n" + "\tmovs r0, 0x1\n" + "\tmovs r1, 0x1\n" + "\tbl sub_804B2D0\n" + "\tldr r1, _0804B6DC @ =gMain\n" + "\tldr r0, _0804B6E0 @ =0x0000043c\n" + "\tadds r1, r0\n" + "\tb _0804B74C\n" + "\t.align 2, 0\n" + "_0804B6DC: .4byte gMain\n" + "_0804B6E0: .4byte 0x0000043c\n" + "_0804B6E4_case09:\n" + "\tbl sub_804C164\n" + "\tldr r0, _0804B704 @ =gUnknown_0821594C\n" + "\tbl LoadSpriteSheet\n" + "\tldr r0, _0804B708 @ =gUnknown_08215954\n" + "\tbl LoadSpritePalette\n" + "\tldr r1, _0804B70C @ =REG_BG1CNT\n" + "\tldr r2, _0804B710 @ =0x00000502\n" + "\tadds r0, r2, 0\n" + "\tstrh r0, [r1]\n" + "\tldr r1, _0804B714 @ =gMain\n" + "\tldr r4, _0804B718 @ =0x0000043c\n" + "\tadds r1, r4\n" + "\tb _0804B74C\n" + "\t.align 2, 0\n" + "_0804B704: .4byte gUnknown_0821594C\n" + "_0804B708: .4byte gUnknown_08215954\n" + "_0804B70C: .4byte REG_BG1CNT\n" + "_0804B710: .4byte 0x00000502\n" + "_0804B714: .4byte gMain\n" + "_0804B718: .4byte 0x0000043c\n" + "_0804B71C_case10:\n" + "\tldr r0, _0804B754 @ =0x0000043c\n" + "\tadds r1, r2, r0\n" + "\tldrb r0, [r1]\n" + "\tadds r0, 0x1\n" + "\tstrb r0, [r1]\n" + "_0804B726_case11:\n" + "\tmovs r0, 0x5\n" + "\tbl sub_804BBE8\n" + "\tmovs r0, 0\n" + "\tbl sub_804BBE8\n" + "\tbl sub_804C1A8\n" + "\tmovs r0, 0x1\n" + "\tnegs r0, r0\n" + "\tmovs r1, 0\n" + "\tstr r1, [sp]\n" + "\tmovs r2, 0x10\n" + "\tmovs r3, 0\n" + "\tbl BeginNormalPaletteFade\n" + "_0804B746:\n" + "\tldr r1, _0804B758 @ =gMain\n" + "\tldr r2, _0804B754 @ =0x0000043c\n" + "\tadds r1, r2\n" + "_0804B74C:\n" + "\tldrb r0, [r1]\n" + "\tadds r0, 0x1\n" + "\tstrb r0, [r1]\n" + "\tb _0804B76E_break\n" + "\t.align 2, 0\n" + "_0804B754: .4byte 0x0000043c\n" + "_0804B758: .4byte gMain\n" + "_0804B75C_case12:\n" + "\tldr r0, _0804B788 @ =gPaletteFade\n" + "\tldrb r1, [r0, 0x7]\n" + "\tmovs r0, 0x80\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbne _0804B76E_break\n" + "\tldr r0, _0804B78C @ =sub_804DB84\n" + "\tbl SetMainCallback2\n" + "_0804B76E_break:\n" + "\tbl RunTasks\n" + "\tbl AnimateSprites\n" + "\tbl BuildOamBuffer\n" + "\tbl UpdatePaletteFade\n" + "\tadd sp, 0x4\n" + "\tpop {r4-r6}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_0804B788: .4byte gPaletteFade\n" + "_0804B78C: .4byte sub_804DB84"); +} +#endif + +static void sub_804B790(void) +// In-game trade init +{ + u8 otName[11]; + switch (gMain.state) + { + case 0: + gUnknown_020297D8[0] = gSpecialVar_0x8005; + gUnknown_020297D8[1] = 6; + StringCopy(gLinkPlayers[0].name, gSaveBlock2.playerName); + GetMonData(&gEnemyParty[0], MON_DATA_OT_NAME, otName); + StringCopy(gLinkPlayers[1].name, otName); + REG_DISPCNT = 0; + ResetTasks(); + gUnknown_03004828 = &ewram_2010000.unk_0f000; + ResetSpriteData(); + FreeAllSpritePalettes(); + SetVBlankCallback(sub_804B210); + sub_804B228(); + SetUpWindowConfig(&gWindowConfig_81E717C); + InitWindowFromConfig(&gUnknown_03004828->window, &gWindowConfig_81E717C); + gUnknown_03004828->textWindowBaseTileNum = SetTextWindowBaseTileNum(2); + LoadTextWindowGraphics(&gUnknown_03004828->window); + MenuZeroFillScreen(); + gLinkType = 0x1144; + gUnknown_03004828->isLinkTrade = FALSE; + gUnknown_03004828->unk_00b6 = 0; + gUnknown_03004828->unk_00c4 = 0; + gUnknown_03004828->unk_0104 = 0x40; + gUnknown_03004828->unk_0106 = 0x40; + gUnknown_03004828->unk_0108 = 0; + gUnknown_03004828->unk_010a = 0; + gUnknown_03004828->unk_010c = 0x78; + gUnknown_03004828->unk_010e = 0x50; + gUnknown_03004828->unk_0118 = 0x100; + gUnknown_03004828->unk_011c = 0; + gUnknown_03004828->unk_00c0 = 0; + gMain.state = 5; + break; + case 5: + sub_804B2D0(0, 0); + gMain.state ++; + break; + case 6: + sub_804B2D0(0, 1); + gMain.state ++; + break; + case 7: + sub_804B2D0(1, 0); + gMain.state ++; + break; + case 8: + sub_804B2D0(1, 1); + gMain.state ++; + break; + case 9: + sub_804C164(); + LoadSpriteSheet(&gUnknown_0821594C); + LoadSpritePalette(&gUnknown_08215954); + REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(5); + gMain.state ++; + break; + case 10: + gMain.state ++; + // fallthrough + case 11: + sub_804BBE8(5); + sub_804BBE8(0); + sub_804C1A8(); + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + gMain.state ++; + break; + case 12: + if (!gPaletteFade.active) + { + SetMainCallback2(sub_804BBCC); + } + break; + } + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_804BA18(u8 partyIdx) +{ + struct Pokemon *pokemon = &gPlayerParty[partyIdx]; + if (!GetMonData(pokemon, MON_DATA_IS_EGG)) + { + u16 species = SpeciesToNationalPokedexNum(GetMonData(pokemon, MON_DATA_SPECIES, NULL)); + GetSetPokedexFlag(species, 2); + GetSetPokedexFlag(species, 3); + } +} + +static void sub_804BA64(void) +{ + u8 mpId = GetMultiplayerId(); + if (gLinkPlayers[mpId ^ 1].lp_field_2 == 0x8000) + EnableNationalPokedex(); +} + +static void sub_804BA94(u8 a0, u8 a1) +{ + u8 friendship; + struct Pokemon *playerPokemon = &gPlayerParty[a0]; + u16 playerMail = GetMonData(playerPokemon, MON_DATA_MAIL); + + struct Pokemon *friendPokemon = &gEnemyParty[a1]; + u16 friendMail = GetMonData(friendPokemon, MON_DATA_MAIL); + + if (playerMail != 0xff) + ClearMailStruct(&gSaveBlock1.mail[playerMail]); + + // This is where the actual trade happens!! + gUnknown_03004828->pokemon = *playerPokemon; + *playerPokemon = *friendPokemon; + *friendPokemon = gUnknown_03004828->pokemon; + + friendship = 70; + if (!GetMonData(playerPokemon, MON_DATA_IS_EGG)) + SetMonData(playerPokemon, MON_DATA_FRIENDSHIP, &friendship); + + if (friendMail != 0xff) + GiveMailToMon2(playerPokemon, &gUnknown_02029700[friendMail]); + + sub_804BA18(a0); + if (gReceivedRemoteLinkPlayers) + sub_804BA64(); +} + +static void sub_804BB78(void) +{ + switch (gUnknown_03004828->unk_00bd) + { + case 1: + if (sub_8007ECC()) + { + Trade_SendData(gUnknown_03004828); + gUnknown_03004828->unk_00bd ++; + } + // fallthrough + case 2: + gUnknown_03004828->unk_00bd = 0; + break; + } +} + +static void sub_804BBCC(void) +{ + sub_804C29C(); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_804BBE8(u8 a0) +{ + int i; + u16 *buffer; + switch (a0) + { + case 0: + LoadPalette(gUnknown_0820C9F8, 0x10, 0xa0); + DmaCopyLarge16(3, gUnknown_0820CA98, BG_CHAR_ADDR(1), 0x1300, 0x1000); + DmaCopy16Defvars(3, gUnknown_0820F798, BG_SCREEN_ADDR(18), 0x1000); + gUnknown_03004828->bg2vofs = 0; + gUnknown_03004828->bg2hofs = 0xb4; + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(18) | BGCNT_TXT512x256; + break; + case 1: + gUnknown_03004828->bg1hofs = 0; + gUnknown_03004828->bg1vofs = 0x15c; + REG_BG1VOFS = 0x15c; + REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(5) | BGCNT_TXT256x512; + + DmaCopy16Defvars(3, gUnknown_08210798, BG_SCREEN_ADDR(5), 0x1000); + DmaCopyLarge16(3, gUnknown_0820CA98, BG_CHAR_ADDR(0), 0x1300, 0x1000); + REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON; + break; + case 2: + gUnknown_03004828->bg1vofs = 0; + gUnknown_03004828->bg1hofs = 0; + REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON; + DmaCopy16Defvars(3, gUnknown_08211798, BG_SCREEN_ADDR(5), 0x800); + break; + case 3: + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON; + gUnknown_03004828->unk_0104 = 0x40; + gUnknown_03004828->unk_0106 = 0x40; + gUnknown_03004828->unk_010c = 0x78; + gUnknown_03004828->unk_010e = -0x46; + gUnknown_03004828->unk_011c = 0; + DmaCopyLarge16(3, gUnknown_0820DD98, BG_CHAR_ADDR(1), 0x1a00, 0x1000); + DmaCopy16Defvars(3, gUnknown_08211F98, BG_SCREEN_ADDR(18), 0x100); + break; + case 4: + REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; + REG_BG2CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_256COLOR | BGCNT_SCREENBASE(18); + gUnknown_03004828->unk_0104 = 0x40; + gUnknown_03004828->unk_0106 = 0x5c; + gUnknown_03004828->unk_0118 = 0x20; + gUnknown_03004828->unk_011a = 0x400; + gUnknown_03004828->unk_011c = 0; + DmaCopyLarge16(3, gUnknown_08213738, BG_CHAR_ADDR(1), 0x2040, 0x1000); + DmaCopy16Defvars(3, gUnknown_08215778, BG_SCREEN_ADDR(18), 0x100); + break; + case 5: + gUnknown_03004828->bg1vofs = 0; + gUnknown_03004828->bg1hofs = 0; + REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(5); + LZDecompressVram(gUnknown_08D00000, BG_CHAR_ADDR(0)); + CpuCopy16(gUnknown_08D00524, buffer = (u16 *)ewram, 0x1000); + LoadCompressedPalette(gUnknown_08D004E0, 0x70, 0x20); + FillPalette(0, 0, 2); + for (i = 0; i < 0x280; i ++) + buffer[i] |= 0x7000; + DmaCopy16Defvars(3, ewram, BG_SCREEN_ADDR(5), 0x500); + MenuZeroFillWindowRect(2, 15, 27, 18); + break; + case 6: + REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; + REG_BG2CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_256COLOR | BGCNT_SCREENBASE(18); + gUnknown_03004828->unk_0104 = 0x40; + gUnknown_03004828->unk_0106 = 0x5c; + gUnknown_03004828->unk_0118 = 0x100; + gUnknown_03004828->unk_011a = 0x80; + gUnknown_03004828->unk_010c = 0x78; + gUnknown_03004828->unk_010e = 0x50; + gUnknown_03004828->unk_011c = 0; + DmaCopyLarge16(3, gUnknown_08213738, BG_CHAR_ADDR(1), 0x2040, 0x1000); + DmaCopy16Defvars(3, gUnknown_08215778, BG_SCREEN_ADDR(18), 0x100); + break; + case 7: + gUnknown_03004828->bg2vofs = 0; + gUnknown_03004828->bg2hofs = 0; + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(18) | BGCNT_TXT512x256; + LoadPalette(gUnknown_0820C9F8, 0x10, 0xa0); + DmaCopyLarge16(3, gUnknown_0820CA98, BG_CHAR_ADDR(1), 0x1300, 0x1000); + DmaCopy16Defvars(3, gUnknown_0820F798, BG_SCREEN_ADDR(18), 0x1000); + break; + } +} + +static void sub_804C0F8(u8 a0) +{ + if (a0 == 0) + { + if (gUnknown_03004828->bg1vofs < 0x10a) + { + gUnknown_03004828->unk_010e ++; + gUnknown_03004828->unk_011c += 64; + } + } + else + { + if (gUnknown_03004828->unk_010e > -0x40) + { + gUnknown_03004828->unk_010e --; + gUnknown_03004828->unk_011c += 64; + } + } +} + +static void sub_804C164(void) +{ + LoadSpriteSheet(&gUnknown_082159A4); + LoadSpriteSheet(&gUnknown_082159F4); + LoadSpriteSheet(&gUnknown_08215A28); + LoadSpriteSheet(&gUnknown_08215A78); + LoadSpritePalette(&gUnknown_082159AC); + LoadSpritePalette(&gUnknown_082159B4); +} + +static void sub_804C1A8(void) +{ + u8 mpId; + u8 string[20]; + const struct InGameTrade *ingameTrade; + if (gUnknown_03004828->isLinkTrade) + { + mpId = GetMultiplayerId(); + StringCopy(gStringVar1, gLinkPlayers[mpId ^ 1].name); + GetMonData(&gEnemyParty[gUnknown_020297D8[1] % 6], MON_DATA_NICKNAME, string); + StringCopy10(gStringVar3, string); + GetMonData(&gPlayerParty[gUnknown_020297D8[0]], MON_DATA_NICKNAME, string); + StringCopy10(gStringVar2, string); + } + else + { + ingameTrade = &gIngameTrades[gSpecialVar_0x8004]; + StringCopy(gStringVar1, ingameTrade->otName); + StringCopy10(gStringVar3, ingameTrade->name); + GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_NICKNAME, string); + StringCopy10(gStringVar2, string); + } +} + +static bool8 sub_804C29C(void) +{ + u16 evoTarget; + + switch (gUnknown_03004828->unk_00c4) + { + case 0: + gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].invisible = FALSE; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos2.x = -0xb4; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos2.y = gMonFrontPicCoords[gUnknown_03004828->tradeSpecies[0]].y_offset; + gUnknown_03004828->unk_00c4 ++; + gUnknown_03004828->unk_0124 = GetCurrentMapMusic(); + PlayBGM(BGM_SHINKA); + break; + case 1: + if (gUnknown_03004828->bg2hofs > 0) + { + gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos2.x += 3; + gUnknown_03004828->bg2hofs -= 3; + } + else + { + gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos2.x = 0; + gUnknown_03004828->bg2hofs = 0; + gUnknown_03004828->unk_00c4 = 10; + } + break; + + case 10: + StringExpandPlaceholders(gStringVar4, gTradeText_WillBeSent); + sub_8003460(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + gUnknown_03004828->unk_00c4 = 11; + gUnknown_03004828->unk_00c0 = 0; + break; + case 11: + if (++gUnknown_03004828->unk_00c0 == 80) + { + gUnknown_03004828->unk_0102 = sub_8047580(gUnknown_03004828->pokePicSpriteIdxs[0], gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].oam.paletteNum, 0x78, 0x20, 0x2, 0x1, 0x14, 0xfffff); + gUnknown_03004828->unk_00c4 ++; + ZeroFillWindowRect(&gUnknown_03004828->window, 0, 0, 29, 19); + StringExpandPlaceholders(gStringVar4, gTradeText_ByeBye); + sub_8003460(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + } + break; + case 12: + if (gSprites[gUnknown_03004828->unk_0102].callback == SpriteCallbackDummy && sub_80035AC(&gUnknown_03004828->window) == TRUE) + { + gUnknown_03004828->unk_0103 = CreateSprite(&gSpriteTemplate_821595C, 0x78, 0x20, 0); + gSprites[gUnknown_03004828->unk_0103].callback = sub_804D738; + DestroySprite(&gSprites[gUnknown_03004828->unk_0102]); + gUnknown_03004828->unk_00c4 ++; + } + break; + case 13: + // The game waits here for the sprite to finish its animation sequence. + break; + case 14: + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gUnknown_03004828->unk_00c4 = 20; + break; + + case 20: + if (!gPaletteFade.active) + { + sub_804BBE8(4); + gUnknown_03004828->unk_00c4 ++; + } + break; + case 21: + BeginNormalPaletteFade(-1, -1, 16, 0, 0); + gUnknown_03004828->unk_00c4 ++; + break; + case 22: + if (!gPaletteFade.active) + { + gUnknown_03004828->unk_00c4 = 23; + } + break; + case 23: + if (gUnknown_03004828->unk_011a > 0x100) + { + gUnknown_03004828->unk_011a -= 0x34; + } + else + { + sub_804BBE8(1); + gUnknown_03004828->unk_011a = 0x80; + gUnknown_03004828->unk_00c4 ++; + gUnknown_03004828->unk_00c0 = 0; + } + gUnknown_03004828->unk_0118 = 0x8000 / gUnknown_03004828->unk_011a; + break; + case 24: + if (++ gUnknown_03004828->unk_00c0 > 20) + { + sub_804BBE8(3); + sub_804B128(); + gUnknown_03004828->unk_00bb = CreateSprite(&gSpriteTemplate_8215A80, 0x78, 0x50, 0); + gUnknown_03004828->unk_00c4 ++; + } + break; + case 25: + if (gSprites[gUnknown_03004828->unk_00bb].animEnded) + { + DestroySprite(&gSprites[gUnknown_03004828->unk_00bb]); + REG_BLDCNT = 0x640; + REG_BLDALPHA = 0x40C; + gUnknown_03004828->unk_00c4 ++; + } + break; + case 26: + if (-- gUnknown_03004828->bg1vofs == 0x13C) + { + gUnknown_03004828->unk_00c4 ++; + } + if (gUnknown_03004828->bg1vofs == 0x148) + { + gUnknown_03004828->unk_00bc = CreateSprite(&gSpriteTemplate_8215A30, 0x80, 0x41, 0); + } + break; + case 27: + gUnknown_03004828->unk_00ba = CreateSprite(&gSpriteTemplate_82159BC, 0x80, 0x50, 3); + gUnknown_03004828->unk_00bb = CreateSprite(&gSpriteTemplate_82159FC, 0x80, 0x50, 0); + StartSpriteAnim(&gSprites[gUnknown_03004828->unk_00bb], 1); + gUnknown_03004828->unk_00c4 ++; + break; + case 28: + if ((gUnknown_03004828->bg1vofs -= 2) == 0xA6) + { + gUnknown_03004828->unk_00c4 = 200; + } + sub_804C0F8(0); + REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; + break; + case 200: + gSprites[gUnknown_03004828->unk_00ba].pos1.y -= 2; + gSprites[gUnknown_03004828->unk_00bb].pos1.y -= 2; + sub_804C0F8(0); + if (gSprites[gUnknown_03004828->unk_00ba].pos1.y < -8) + { + gUnknown_03004828->unk_00c4 = 29; + } + break; + case 29: + BeginNormalPaletteFade(-1, -1, 0, 16, 0); + gUnknown_03004828->unk_00c4 = 30; + break; + case 30: + if (!gPaletteFade.active) + { + DestroySprite(&gSprites[gUnknown_03004828->unk_00ba]); + DestroySprite(&gSprites[gUnknown_03004828->unk_00bb]); + sub_804BBE8(2); + gUnknown_03004828->unk_00c4 ++; + } + break; + case 31: + BeginNormalPaletteFade(-1, -1, 16, 0, 0); + gUnknown_03004828->unk_00ba = CreateSprite(&gSpriteTemplate_82159FC, 0x6f, 0xaa, 0); + gUnknown_03004828->unk_00bb = CreateSprite(&gSpriteTemplate_82159FC, 0x81, -0xa, 0); + gUnknown_03004828->unk_00c4 ++; + break; + case 32: + if (!gPaletteFade.active) + { + PlaySE(SE_TK_WARPOUT); + gUnknown_03004828->unk_00c4 ++; + } + gSprites[gUnknown_03004828->unk_00ba].pos2.y -= 3; + gSprites[gUnknown_03004828->unk_00bb].pos2.y += 3; + break; + case 33: + gSprites[gUnknown_03004828->unk_00ba].pos2.y -= 3; + gSprites[gUnknown_03004828->unk_00bb].pos2.y += 3; + if (gSprites[gUnknown_03004828->unk_00ba].pos2.y <= -0x5a) + { + gSprites[gUnknown_03004828->unk_00ba].data1 = 1; + gSprites[gUnknown_03004828->unk_00bb].data1 = 1; + gUnknown_03004828->unk_00c4 ++; + } + break; + case 34: + BlendPalettes(1, 16, 0xffff); + gUnknown_03004828->unk_00c4 ++; + break; + case 35: + BlendPalettes(1, 0, 0xffff); + gUnknown_03004828->unk_00c4 ++; + break; + case 36: + BlendPalettes(1, 16, 0xffff); + gUnknown_03004828->unk_00c4 ++; + break; + case 37: + if (!IsPokeSpriteNotFlipped(gUnknown_03004828->tradeSpecies[0])) + { + gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].affineAnims = gSpriteAffineAnimTable_8215AC0; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].oam.affineMode = 3; + CalcCenterToCornerVec(&gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]], 0, 3, 3); + StartSpriteAffineAnim(&gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]], 0); + } + else + { + StartSpriteAffineAnim(&gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]], 0); + } + StartSpriteAffineAnim(&gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]], 0); + gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos1.x = 0x3c; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].pos1.x = 0xb4; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos1.y = 0xc0; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].pos1.y = -0x20; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].invisible = FALSE; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].invisible = FALSE; + gUnknown_03004828->unk_00c4 ++; + break; + case 38: + gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos2.y -= 3; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].pos2.y += 3; + if (-0xa0 > gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos2.y && gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos2.y >= -0xa3) + { + PlaySE(SE_TK_WARPIN); + } + if (gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].pos2.y < -0xde) + { + gSprites[gUnknown_03004828->unk_00ba].data1 = 0; + gSprites[gUnknown_03004828->unk_00bb].data1 = 0; + gUnknown_03004828->unk_00c4 ++; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]].invisible = TRUE; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].invisible = TRUE; + BlendPalettes(1, 0, 0xffff); + } + break; + case 39: + gSprites[gUnknown_03004828->unk_00ba].pos2.y -= 3; + gSprites[gUnknown_03004828->unk_00bb].pos2.y += 3; + if (gSprites[gUnknown_03004828->unk_00ba].pos2.y <= -0xde) + { + BeginNormalPaletteFade(-1, -1, 0, 16, 0); + gUnknown_03004828->unk_00c4 ++; + DestroySprite(&gSprites[gUnknown_03004828->unk_00ba]); + DestroySprite(&gSprites[gUnknown_03004828->unk_00bb]); + } + break; + case 40: + if (!gPaletteFade.active) + { + gUnknown_03004828->unk_00c4 ++; + sub_804BBE8(1); + gUnknown_03004828->bg1vofs = 0xa6; + gUnknown_03004828->unk_00ba = CreateSprite(&gSpriteTemplate_82159BC, 0x80, -0x14, 3); + gUnknown_03004828->unk_00bb = CreateSprite(&gSpriteTemplate_82159FC, 0x80, -0x14, 0); + StartSpriteAnim(&gSprites[gUnknown_03004828->unk_00bb], 1); + } + break; + case 41: + BeginNormalPaletteFade(-1, -1, 16, 0, 0); + gUnknown_03004828->unk_00c4 ++; + break; + case 42: + REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; + sub_804C0F8(1); + if (!gPaletteFade.active) + { + gUnknown_03004828->unk_00c4 ++; + } + break; + case 43: + sub_804C0F8(1); + gSprites[gUnknown_03004828->unk_00ba].pos2.y += 3; + gSprites[gUnknown_03004828->unk_00bb].pos2.y += 3; + if (gSprites[gUnknown_03004828->unk_00ba].pos2.y + gSprites[gUnknown_03004828->unk_00ba].pos1.y == 64) + { + gUnknown_03004828->unk_00c4 ++; + } + break; + case 44: + sub_804C0F8(1); + if ((gUnknown_03004828->bg1vofs += 2) > 0x13c) + { + gUnknown_03004828->bg1vofs = 0x13c; + gUnknown_03004828->unk_00c4 ++; + } + break; + case 45: + DestroySprite(&gSprites[gUnknown_03004828->unk_00ba]); + DestroySprite(&gSprites[gUnknown_03004828->unk_00bb]); + gUnknown_03004828->unk_00c4 ++; + gUnknown_03004828->unk_00c0 = 0; + break; + case 46: + if (++ gUnknown_03004828->unk_00c0 == 10) + { + gUnknown_03004828->unk_00c4 ++; + } + break; + case 47: + if (++ gUnknown_03004828->bg1vofs > 0x15c) + { + gUnknown_03004828->bg1vofs = 0x15c; + gUnknown_03004828->unk_00c4 ++; + } + if (gUnknown_03004828->bg1vofs == 0x148) + gUnknown_03004828->unk_00bc = CreateSprite(&gSpriteTemplate_8215A30, 0x80, 0x41, 0); + gSprites[gUnknown_03004828->unk_00bc].callback = sub_804B0E0; + break; + case 48: + gUnknown_03004828->unk_00bb = CreateSprite(&gSpriteTemplate_8215A80, 0x78, 0x50, 0); + gUnknown_03004828->unk_00c4 = 50; + break; + + case 50: + if (gSprites[gUnknown_03004828->unk_00bb].animEnded) + { + DestroySprite(&gSprites[gUnknown_03004828->unk_00bb]); + sub_804BBE8(6); + gUnknown_03004828->unk_00c4 ++; + PlaySE(SE_W028); + } + break; + case 51: + if (gUnknown_03004828->unk_011a < 0x400) + { + gUnknown_03004828->unk_011a += 0x34; + } + else + { + gUnknown_03004828->unk_011a = 0x400; + gUnknown_03004828->unk_00c4 ++; + } + gUnknown_03004828->unk_0118 = 0x8000 / gUnknown_03004828->unk_011a; + break; + case 52: + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gUnknown_03004828->unk_00c4 = 60; + break; + + case 60: + if (!gPaletteFade.active) + { + sub_804BBE8(5); + sub_804BBE8(7); + gUnknown_03004828->unk_00c4 ++; + } + break; + case 61: + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + gUnknown_03004828->unk_00c4 ++; + break; + case 62: + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; + if (!gPaletteFade.active) + { + gUnknown_03004828->unk_00c4 ++; + } + break; + case 63: + gUnknown_03004828->unk_0103 = CreateSprite(&gSpriteTemplate_821595C, 0x78, -0x8, 0); + gSprites[gUnknown_03004828->unk_0103].data3 = 0x4a; + gSprites[gUnknown_03004828->unk_0103].callback = sub_804D80C; + StartSpriteAnim(&gSprites[gUnknown_03004828->unk_0103], 1); + StartSpriteAffineAnim(&gSprites[gUnknown_03004828->unk_0103], 2); + BlendPalettes(1 << (16 + gSprites[gUnknown_03004828->unk_0103].oam.paletteNum), 16, 0xffff); + gUnknown_03004828->unk_00c4 ++; + gUnknown_03004828->unk_00c0 = 0; + break; + case 64: + BeginNormalPaletteFade(1 << (16 + gSprites[gUnknown_03004828->unk_0103].oam.paletteNum), 1, 16, 0, 0xffff); + gUnknown_03004828->unk_00c4 ++; + break; + case 65: + if (gSprites[gUnknown_03004828->unk_0103].callback == SpriteCallbackDummy) + { + gUnknown_03004828->unk_00c4 ++; + } + break; + case 66: + gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].pos1.x = 0x78; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].pos1.y = gMonFrontPicCoords[gUnknown_03004828->tradeSpecies[1]].y_offset + 60; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].pos2.x = 0; + gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].pos2.y = 0; + CreatePokeballSprite(gUnknown_03004828->pokePicSpriteIdxs[1], gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]].oam.paletteNum, 0x78, 0x54, 2, 1, 0x14, 0xfffff); + FreeSpriteOamMatrix(&gSprites[gUnknown_03004828->unk_0103]); + DestroySprite(&gSprites[gUnknown_03004828->unk_0103]); + gUnknown_03004828->unk_00c4 ++; + break; + case 67: + REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; + ZeroFillWindowRect(&gUnknown_03004828->window, 0, 0, 29, 19); + StringExpandPlaceholders(gStringVar4, gTradeText_SentOverPoke); + sub_8003460(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + gUnknown_03004828->unk_00c4 ++; + gUnknown_03004828->unk_00c0 = 0; + break; + case 68: + if (++ gUnknown_03004828->unk_00c0 == 4) + { + PlayFanfare(BGM_FANFA5); + } + if (gUnknown_03004828->unk_00c0 == 0xf0) + { + gUnknown_03004828->unk_00c4 ++; + ZeroFillWindowRect(&gUnknown_03004828->window, 0, 0, 29, 19); + StringExpandPlaceholders(gStringVar4, gTradeText_TakeGoodCare); + sub_8003460(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + gUnknown_03004828->unk_00c0 = 0; + } + break; + case 69: // OneHand + if (++ gUnknown_03004828->unk_00c0 == 60) + { + gUnknown_03004828->unk_00c4 ++; + } + break; + case 70: + sub_804E1DC(); + gUnknown_03004828->unk_00c4 ++; + break; + case 71: + if (gUnknown_03004828->isLinkTrade) + { + return TRUE; + } + else if (gMain.newKeys & A_BUTTON) + { + gUnknown_03004828->unk_00c4 ++; + } + break; + case 72: // Only if in-game trade + sub_804BA94(gSpecialVar_0x8005, 0); + gCB2_AfterEvolution = sub_804BBCC; + evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gUnknown_020297D8[0]], TRUE, ITEM_NONE); + if (evoTarget != SPECIES_NONE) + TradeEvolutionScene(&gPlayerParty[gUnknown_020297D8[0]], evoTarget, gUnknown_03004828->pokePicSpriteIdxs[1], gUnknown_020297D8[0]); + gUnknown_03004828->unk_00c4 ++; + break; + case 73: + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gUnknown_03004828->unk_00c4 ++; + break; + case 74: + if (!gPaletteFade.active) + { + PlayBGM(gUnknown_03004828->unk_0124); + SetMainCallback2(c2_exit_to_overworld_2_switch); + sub_804D8E4(); + } + break; + } + return FALSE; +} + +static void sub_804D588(void) +{ + u16 evoTarget; + switch (gMain.state) + { + case 0: + gMain.state = 4; + gSoftResetDisabled = TRUE; + break; + case 4: + gCB2_AfterEvolution = sub_804DC88; + evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gUnknown_020297D8[0]], TRUE, ITEM_NONE); + if (evoTarget != SPECIES_NONE) + TradeEvolutionScene(&gPlayerParty[gUnknown_020297D8[0]], evoTarget, gUnknown_03004828->pokePicSpriteIdxs[1], gUnknown_020297D8[0]); + else + SetMainCallback2(sub_804DC88); + gUnknown_020297D8[0] = 255; + break; + } + if (!HasLinkErrorOccurred()) + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_804D63C(void) +{ + u8 blockReceivedStatus; + sub_804B2B0(); + blockReceivedStatus = GetBlockReceivedStatus(); + if (blockReceivedStatus & 0x01) + { + if (gBlockRecvBuffer[0][0] == 0xdcba) + { + SetMainCallback2(sub_804D588); + } + if (gBlockRecvBuffer[0][0] == 0xabcd) + { + gUnknown_03004828->unk_009c = 1; + } + ResetBlockReceivedFlag(0); + } + if (blockReceivedStatus & 0x02) + { + if (gBlockRecvBuffer[1][0] == 0xabcd) + { + gUnknown_03004828->unk_009d = 1; + } + ResetBlockReceivedFlag(1); + } +} + +static void sub_804D6BC(struct Sprite *sprite) +{ + sprite->pos1.y += sprite->data0 / 10; + sprite->data5 += sprite->data1; + sprite->pos1.x = sprite->data5 / 10; + if (sprite->pos1.y > 0x4c) + { + sprite->pos1.y = 0x4c; + sprite->data0 = -(sprite->data0 * sprite->data2) / 100; + sprite->data3 ++; + } + if (sprite->pos1.x == 0x78) + sprite->data1 = 0; + sprite->data0 += sprite->data4; + if (sprite->data3 == 4) + { + sprite->data7 = 1; + sprite->callback = SpriteCallbackDummy; + } +} + +static void sub_804D738(struct Sprite *sprite) +{ + sprite->pos2.y += gTradeBallVerticalVelocityTable[sprite->data0]; + if (sprite->data0 == 22) + PlaySE(SE_KON); + if (++ sprite->data0 == 44) + { + PlaySE(SE_W025); + sprite->callback = sub_804D7AC; + sprite->data0 = 0; + BeginNormalPaletteFade(1 << (16 + sprite->oam.paletteNum), -1, 0, 16, -1); + } +} + +static void sub_804D7AC(struct Sprite *sprite) +{ + if (sprite->data1 == 20) + StartSpriteAffineAnim(sprite, 1); + if (++ sprite->data1 > 20) + { + sprite->pos2.y -= gTradeBallVerticalVelocityTable[sprite->data0]; + if (++ sprite->data0 == 23) + { + DestroySprite(sprite); + gUnknown_03004828->unk_00c4 = 14; // Resume the master trade animation + } + } +} + +static void sub_804D80C(struct Sprite *sprite) +{ + if (sprite->data2 == 0) + { + if ((sprite->pos1.y += 4) > sprite->data3) + { + sprite->data2 ++; + sprite->data0 = 0x16; + PlaySE(SE_KON); + } + } + else + { + if (sprite->data0 == 0x42) + PlaySE(SE_KON2); + if (sprite->data0 == 0x5c) + PlaySE(SE_KON3); + if (sprite->data0 == 0x6b) + PlaySE(SE_KON4); + sprite->pos2.y += gTradeBallVerticalVelocityTable[sprite->data0]; + if (++sprite->data0 == 0x6c) + sprite->callback = SpriteCallbackDummy; + } +} + +u16 sub_804D89C(void) +{ + const struct InGameTrade *inGameTrade = &gIngameTrades[gSpecialVar_0x8004]; + StringCopy(gStringVar1, gSpeciesNames[inGameTrade->playerSpecies]); + StringCopy(gStringVar2, gSpeciesNames[inGameTrade->species]); + return inGameTrade->playerSpecies; +} + +static void sub_804D8E4(void) +{ + u8 nickname[32]; + const struct InGameTrade *inGameTrade = &gIngameTrades[gSpecialVar_0x8004]; + GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_NICKNAME, nickname); + StringCopy10(gStringVar1, nickname); + StringCopy(gStringVar2, gSpeciesNames[inGameTrade->species]); +} + +static void sub_804D948(u8 whichPlayerMon, u8 whichInGameTrade) +{ + const struct InGameTrade *inGameTrade = &gIngameTrades[whichInGameTrade]; + u8 level = GetMonData(&gPlayerParty[whichPlayerMon], MON_DATA_LEVEL); + + struct MailStruct mail; + u8 metLocation = 0xFE; + u8 isMail; + struct Pokemon *pokemon = &gEnemyParty[0]; + + CreateMon(pokemon, inGameTrade->species, level, 32, TRUE, inGameTrade->personality, TRUE, inGameTrade->otId); + + SetMonData(pokemon, MON_DATA_HP_IV, &inGameTrade->ivs[0]); + SetMonData(pokemon, MON_DATA_ATK_IV, &inGameTrade->ivs[1]); + SetMonData(pokemon, MON_DATA_DEF_IV, &inGameTrade->ivs[2]); + SetMonData(pokemon, MON_DATA_SPEED_IV, &inGameTrade->ivs[3]); + SetMonData(pokemon, MON_DATA_SPATK_IV, &inGameTrade->ivs[4]); + SetMonData(pokemon, MON_DATA_SPDEF_IV, &inGameTrade->ivs[5]); + SetMonData(pokemon, MON_DATA_NICKNAME, inGameTrade->name); + SetMonData(pokemon, MON_DATA_OT_NAME, inGameTrade->otName); + SetMonData(pokemon, MON_DATA_OT_GENDER, &inGameTrade->otGender); + SetMonData(pokemon, MON_DATA_ALT_ABILITY, &inGameTrade->secondAbility); + SetMonData(pokemon, MON_DATA_BEAUTY, &inGameTrade->stats[1]); + SetMonData(pokemon, MON_DATA_CUTE, &inGameTrade->stats[2]); + SetMonData(pokemon, MON_DATA_COOL, &inGameTrade->stats[0]); + SetMonData(pokemon, MON_DATA_SMART, &inGameTrade->stats[3]); + SetMonData(pokemon, MON_DATA_TOUGH, &inGameTrade->stats[4]); + SetMonData(pokemon, MON_DATA_SHEEN, &inGameTrade->sheen); + SetMonData(pokemon, MON_DATA_MET_LOCATION, &metLocation); + + isMail = FALSE; + if (inGameTrade->heldItem != ITEM_NONE) + { + if (ItemIsMail(inGameTrade->heldItem)) + { + sub_804DAD4(&mail, inGameTrade); + gUnknown_02029700[0] = mail; + SetMonData(pokemon, MON_DATA_MAIL, &isMail); + SetMonData(pokemon, MON_DATA_HELD_ITEM, &inGameTrade->heldItem); + } + else + { + SetMonData(pokemon, MON_DATA_HELD_ITEM, &inGameTrade->heldItem); + } + } + CalculateMonStats(&gEnemyParty[0]); +} + +static void sub_804DAD4(struct MailStruct *mail, const struct InGameTrade *trade) { + s32 i; + + for (i = 0; i < 9; i++) + { + mail->words[i] = gIngameTradeMail[trade->mailNum][i]; + } + + StringCopy(mail->playerName, trade->otName); + +#if GERMAN + PadNameString(mail->playerName, CHAR_SPACE); +#endif + + mail->trainerId[0] = trade->otId >> 24; + mail->trainerId[1] = trade->otId >> 16; + mail->trainerId[2] = trade->otId >> 8; + mail->trainerId[3] = trade->otId; + mail->species = trade->species; + mail->itemId = trade->heldItem; +} + +u16 sub_804DB2C(void) +{ + if (GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_IS_EGG)) + return SPECIES_NONE; + return GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_SPECIES); +} + +void sub_804DB68(void) +{ + sub_804D948(gSpecialVar_0x8005, gSpecialVar_0x8004); +} + +#ifdef NONMATCHING +static +#endif +void sub_804DB84(void) +{ + if (sub_804C29C() == TRUE) + { + DestroySprite(&gSprites[gUnknown_03004828->pokePicSpriteIdxs[0]]); + FreeSpriteOamMatrix(&gSprites[gUnknown_03004828->pokePicSpriteIdxs[1]]); + sub_804BA94(gUnknown_020297D8[0], gUnknown_020297D8[1] % 6); + gUnknown_03004828->linkData[0] = 0xabcd; + gUnknown_03004828->unk_00bd = 1; + SetMainCallback2(sub_804DC18); + } + sub_804BB78(); + sub_804D63C(); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_804DC18(void) +{ + u8 mpId = sub_804B2B0(); + sub_804D63C(); + if (mpId == 0 && gUnknown_03004828->unk_009c == 1 && gUnknown_03004828->unk_009d == 1) + { + gUnknown_03004828->linkData[0] = 0xdcba; + Trade_SendData(gUnknown_03004828); + gUnknown_03004828->unk_009c = 2; + gUnknown_03004828->unk_009d = 2; + } + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_804DC88(void) +{ + switch (gMain.state) + { + case 0: + gUnknown_03004828 = &ewram_2010000.unk_0f000; + gMain.state ++; + ZeroFillWindowRect(&gUnknown_03004828->window, 0, 0, 29, 19); + StringExpandPlaceholders(gStringVar4, gOtherText_LinkStandby2); + sub_8003460(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + break; + case 1: + sub_80084A4(); + gMain.state = 100; + gUnknown_03004828->unk_00c0 = 0; + break; + case 100: + if (++ gUnknown_03004828->unk_00c0 > 180) + { + gMain.state = 101; + gUnknown_03004828->unk_00c0 = 0; + } + if (sub_8007ECC()) + { + gMain.state = 2; + } + break; + case 101: + if (sub_8007ECC()) + { + gMain.state = 2; + } + break; + case 2: + gMain.state = 50; + ZeroFillWindowRect(&gUnknown_03004828->window, 0, 0, 29, 19); + sub_8003460(&gUnknown_03004828->window, gSystemText_Saving, gUnknown_03004828->textWindowBaseTileNum, 2, 15); + break; + case 50: + SetSecretBase2Field_9_AndHideBG(); + IncrementGameStat(GAME_STAT_POKEMON_TRADES); + sub_8125D80(); + gMain.state ++; + gUnknown_03004828->unk_00c0 = 0; + break; + case 51: + if (++ gUnknown_03004828->unk_00c0 == 5) + { + gMain.state ++; + } + break; + case 52: + if (sub_8125DA8()) + { + ClearSecretBase2Field_9_2(); + gMain.state = 4; + } + else + { + gUnknown_03004828->unk_00c0 = 0; + gMain.state = 51; + } + break; + case 4: + sub_8125DDC(); + gMain.state = 40; + gUnknown_03004828->unk_00c0 = 0; + break; + case 40: + if (++ gUnknown_03004828->unk_00c0 > 50) + { + gUnknown_03004828->unk_00c0 = 0; + gMain.state = 41; + } + break; + case 41: + sub_80084A4(); + gMain.state = 42; + break; + case 42: + if (sub_8007ECC()) + { + sub_8125E04(); + gSoftResetDisabled = FALSE; + gMain.state = 5; + } + break; + case 5: + if (++ gUnknown_03004828->unk_00c0 > 60) + { + gMain.state ++; + sub_80084A4(); + } + break; + case 6: + if (sub_8007ECC()) + { + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gMain.state ++; + } + break; + case 7: + if (!gPaletteFade.active) + { + FadeOutBGM(3); + gMain.state ++; + } + break; + case 8: + if (IsBGMStopped() == TRUE) + { + sub_800832C(); + gMain.state ++; + } + break; + case 9: + if (!gReceivedRemoteLinkPlayers) + { + SetMainCallback2(sub_804E144); + } + break; + } + if (!HasLinkErrorOccurred()) + { + RunTasks(); + } + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_804E144(void) +{ + if (!gPaletteFade.active) + SetMainCallback2((sub_8047CD8)); + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void sub_804E174(void) +{ + ScriptContext2_Enable(); + CreateTask(sub_804E1A0, 10); + BeginNormalPaletteFade(-1, 0, 0, 16, 0); +} + +static void sub_804E1A0(u8 taskId) +{ + if (!gPaletteFade.active) + { + SetMainCallback2(sub_804B790); + gFieldCallback = sub_8080990; + DestroyTask(taskId); + } +} + +static void sub_804E1DC(void) +{ + u8 i; + u8 numRibbons = 0; + for (i = 0; i < 12; i ++) + { + numRibbons += GetMonData(&gEnemyParty[gUnknown_020297D8[1] % 6], MON_DATA_CHAMPION_RIBBON + i); + } + if (numRibbons != 0) + FlagSet(SYS_RIBBON_GET); +} + +void sub_804E22C(void) +{ + const u16 *src; + u16 *dest; + LZDecompressVram(gUnknown_08D00000, (void *)VRAM); + CpuCopy16(gUnknown_08D00524, ewram, 0x1000); + src = (const u16 *)ewram; + dest = BG_SCREEN_ADDR(5); + DmaCopy16(3, src, dest, 0x500) + LoadCompressedPalette(gUnknown_08D004E0, 0, 32); + REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(5); +} diff --git a/src/trainer_card.c b/src/engine/trainer_card.c index bcb62ede6..3e9dadbda 100644 --- a/src/trainer_card.c +++ b/src/engine/trainer_card.c @@ -311,16 +311,16 @@ static void nullsub_60(u8 taskid) { } -void sub_8093390(struct TrainerCard *arg1) +void sub_8093390(struct TrainerCard *trainerCard) { u32 playTime; bool32 enteredHallOfFame; bool8 r4; u8 i; - arg1->gender = gSaveBlock2.playerGender; - arg1->playTimeHours = gSaveBlock2.playTimeHours; - arg1->playTimeMinutes = gSaveBlock2.playTimeMinutes; + trainerCard->gender = gSaveBlock2.playerGender; + trainerCard->playTimeHours = gSaveBlock2.playTimeHours; + trainerCard->playTimeMinutes = gSaveBlock2.playTimeMinutes; playTime = GetGameStat(GAME_STAT_FIRST_HOF_PLAY_TIME); enteredHallOfFame = GetGameStat(GAME_STAT_ENTERED_HOF); @@ -328,39 +328,39 @@ void sub_8093390(struct TrainerCard *arg1) { playTime = 0; } - arg1->firstHallOfFameA = playTime >> 16; - arg1->firstHallOfFameB = (playTime >> 8) & 0xFF; - arg1->firstHallOfFameC = playTime & 0xFF; + trainerCard->firstHallOfFameA = playTime >> 16; + trainerCard->firstHallOfFameB = (playTime >> 8) & 0xFF; + trainerCard->firstHallOfFameC = playTime & 0xFF; - arg1->hasPokedex = FlagGet(SYS_POKEDEX_GET); - arg1->var_3 = sub_8090FC0(); - arg1->pokedexSeen = GetPokedexSeenCount(); + trainerCard->hasPokedex = FlagGet(SYS_POKEDEX_GET); + trainerCard->var_3 = sub_8090FC0(); + trainerCard->pokedexSeen = GetPokedexSeenCount(); - arg1->trainerId = (gSaveBlock2.playerTrainerId[1] << 8) | gSaveBlock2.playerTrainerId[0]; + trainerCard->trainerId = (gSaveBlock2.playerTrainerId[1] << 8) | gSaveBlock2.playerTrainerId[0]; // Link Cable Battles - arg1->linkBattleWins = sav12_xor_get_clamped_above(GAME_STAT_LINK_BATTLE_WINS, 9999); - arg1->linkBattleLosses = sav12_xor_get_clamped_above(GAME_STAT_LINK_BATTLE_LOSSES, 9999); + trainerCard->linkBattleWins = sav12_xor_get_clamped_above(GAME_STAT_LINK_BATTLE_WINS, 9999); + trainerCard->linkBattleLosses = sav12_xor_get_clamped_above(GAME_STAT_LINK_BATTLE_LOSSES, 9999); // Contests w/ Friends - arg1->contestsWithFriends = sav12_xor_get_clamped_above(GAME_STAT_WON_LINK_CONTEST, 999); + trainerCard->contestsWithFriends = sav12_xor_get_clamped_above(GAME_STAT_WON_LINK_CONTEST, 999); // Pokéblocks w/ Friends - arg1->pokeblocksWithFriends = sav12_xor_get_clamped_above(GAME_STAT_POKEBLOCKS_WITH_FRIENDS, 0xFFFF); + trainerCard->pokeblocksWithFriends = sav12_xor_get_clamped_above(GAME_STAT_POKEBLOCKS_WITH_FRIENDS, 0xFFFF); // Pokémon Trades - arg1->pokemonTrades = sav12_xor_get_clamped_above(GAME_STAT_POKEMON_TRADES, 0xFFFF); + trainerCard->pokemonTrades = sav12_xor_get_clamped_above(GAME_STAT_POKEMON_TRADES, 0xFFFF); - // Battle tower? - arg1->battleTowerWins = gSaveBlock2.filler_A8.var_4C8; - arg1->battleTowerLosses = gSaveBlock2.filler_A8.var_4CA; - if (arg1->battleTowerWins > 9999) + // Battle Tower + trainerCard->battleTowerWins = gSaveBlock2.battleTower.totalBattleTowerWins; + trainerCard->battleTowerLosses = gSaveBlock2.battleTower.bestBattleTowerWinStreak; + if (trainerCard->battleTowerWins > 9999) { - arg1->battleTowerWins = 9999; + trainerCard->battleTowerWins = 9999; } - if (arg1->battleTowerLosses > 9999) + if (trainerCard->battleTowerLosses > 9999) { - arg1->battleTowerLosses = 9999; + trainerCard->battleTowerLosses = 9999; } r4 = FALSE; @@ -368,21 +368,21 @@ void sub_8093390(struct TrainerCard *arg1) { r4 = TRUE; } - arg1->var_4 = r4; + trainerCard->var_4 = r4; - arg1->money = gSaveBlock1.money; + trainerCard->money = gSaveBlock1.money; for (i = 0; i < 4; i++) { - arg1->var_28[i] = gSaveBlock1.unk2B1C[i]; + trainerCard->var_28[i] = gSaveBlock1.easyChats.unk2B1C[i]; } for (i = 0; i < 8; i++) { - arg1->playerName[i] = gSaveBlock2.playerName[i]; + trainerCard->playerName[i] = gSaveBlock2.playerName[i]; } - arg1->stars = sub_80934F4(arg1); + trainerCard->stars = sub_80934F4(trainerCard); } u8 sub_80934C4(u8 id) diff --git a/src/trig.c b/src/engine/trig.c index e16a69e63..e16a69e63 100644 --- a/src/trig.c +++ b/src/engine/trig.c diff --git a/src/util.c b/src/engine/util.c index 582b9f806..582b9f806 100644 --- a/src/util.c +++ b/src/engine/util.c diff --git a/src/bard_music.c b/src/field/bard_music.c index daf003233..daf003233 100644 --- a/src/bard_music.c +++ b/src/field/bard_music.c diff --git a/src/field/battle_tower.c b/src/field/battle_tower.c new file mode 100644 index 000000000..1b5759f49 --- /dev/null +++ b/src/field/battle_tower.c @@ -0,0 +1,2375 @@ +#include "global.h" +#include "battle.h" +#include "battle_setup.h" +#include "battle_tower.h" +#include "battle_transition.h" +#include "data2.h" +#include "easy_chat.h" +#include "event_data.h" +#include "item.h" +#include "items.h" +#include "main.h" +#include "map_object_constants.h" +#include "moves.h" +#include "new_game.h" +#include "overworld.h" +#include "pokedex.h" +#include "rng.h" +#include "save.h" +#include "script_pokemon_80C4.h" +#include "species.h" +#include "string_util.h" +#include "task.h" +#include "text.h" +#include "trainer.h" +#include "tv.h" +#include "vars.h" + +#if ENGLISH +#include "../data/battle_tower/trainers.h" +#elif GERMAN +#include "../data/battle_tower/trainers_de.h" +#endif + +static const u16 sBattleTowerHeldItems[] = { + ITEM_NONE, + ITEM_KINGS_ROCK, + ITEM_SITRUS_BERRY, + ITEM_ORAN_BERRY, + ITEM_CHESTO_BERRY, + ITEM_HARD_STONE, + ITEM_FOCUS_BAND, + ITEM_PERSIM_BERRY, + ITEM_MIRACLE_SEED, + ITEM_BERRY_JUICE, + ITEM_MACHO_BRACE, + ITEM_SILVER_POWDER, + ITEM_CHERI_BERRY, + ITEM_BLACK_GLASSES, + ITEM_BLACK_BELT, + ITEM_SOUL_DEW, + ITEM_CHOICE_BAND, + ITEM_MAGNET, + ITEM_SILK_SCARF, + ITEM_WHITE_HERB, + ITEM_DEEP_SEA_SCALE, + ITEM_DEEP_SEA_TOOTH, + ITEM_MYSTIC_WATER, + ITEM_SHARP_BEAK, + ITEM_QUICK_CLAW, + ITEM_LEFTOVERS, + ITEM_RAWST_BERRY, + ITEM_LIGHT_BALL, + ITEM_POISON_BARB, + ITEM_NEVER_MELT_ICE, + ITEM_ASPEAR_BERRY, + ITEM_SPELL_TAG, + ITEM_BRIGHT_POWDER, + ITEM_LEPPA_BERRY, + ITEM_SCOPE_LENS, + ITEM_TWISTED_SPOON, + ITEM_METAL_COAT, + ITEM_MENTAL_HERB, + ITEM_CHARCOAL, + ITEM_PECHA_BERRY, + ITEM_SOFT_SAND, + ITEM_LUM_BERRY, + ITEM_DRAGON_SCALE, + ITEM_DRAGON_FANG, + ITEM_IAPAPA_BERRY, + ITEM_WIKI_BERRY, + ITEM_SEA_INCENSE, + ITEM_SHELL_BELL, + ITEM_SALAC_BERRY, + ITEM_LANSAT_BERRY, + ITEM_APICOT_BERRY, + ITEM_STARF_BERRY, + ITEM_LIECHI_BERRY, + ITEM_STICK, + ITEM_LAX_INCENSE, + ITEM_AGUAV_BERRY, + ITEM_FIGY_BERRY, + ITEM_THICK_CLUB, + ITEM_MAGO_BERRY, + ITEM_METAL_POWDER, + ITEM_PETAYA_BERRY, + ITEM_LUCKY_PUNCH, + ITEM_GANLON_BERRY, +}; + +#include "../data/battle_tower/level_50_mons.h" +#include "../data/battle_tower/level_100_mons.h" + +static const u8 sMaleTrainerClasses[] = { + TRAINER_CLASS_RUIN_MANIAC, + TRAINER_CLASS_TUBER_M, + TRAINER_CLASS_COOL_TRAINER_M, + TRAINER_CLASS_RICH_BOY, + TRAINER_CLASS_POKEMANIAC, + TRAINER_CLASS_SWIMMER_M, + TRAINER_CLASS_BLACK_BELT, + TRAINER_CLASS_GUITARIST, + TRAINER_CLASS_KINDLER, + TRAINER_CLASS_CAMPER, + TRAINER_CLASS_BUG_MANIAC, + TRAINER_CLASS_PSYCHIC_M, + TRAINER_CLASS_GENTLEMAN, + TRAINER_CLASS_SCHOOL_KID_M, + TRAINER_CLASS_POKEFAN_M, + TRAINER_CLASS_EXPERT_M, + TRAINER_CLASS_YOUNGSTER, + TRAINER_CLASS_FISHERMAN, + TRAINER_CLASS_CYCLING_TRIATHLETE_M, + TRAINER_CLASS_RUNNING_TRIATHLETE_M, + TRAINER_CLASS_SWIMMING_TRIATHLETE_M, + TRAINER_CLASS_DRAGON_TAMER, + TRAINER_CLASS_BIRD_KEEPER, + TRAINER_CLASS_NINJA_BOY, + TRAINER_CLASS_SAILOR, + TRAINER_CLASS_COLLECTOR, + TRAINER_CLASS_POKEMON_BREEDER_M, + TRAINER_CLASS_POKEMON_RANGER_M, + TRAINER_CLASS_BUG_CATCHER, + TRAINER_CLASS_HIKER, +}; + +static const u8 sFemaleTrainerClasses[] = { + TRAINER_CLASS_AROMA_LADY, + TRAINER_CLASS_TUBER_F, + TRAINER_CLASS_COOL_TRAINER_F, + TRAINER_CLASS_HEX_MANIAC, + TRAINER_CLASS_LADY, + TRAINER_CLASS_BEAUTY, + TRAINER_CLASS_PSYCHIC_F, + TRAINER_CLASS_SCHOOL_KID_F, + TRAINER_CLASS_POKEFAN_F, + TRAINER_CLASS_EXPERT_F, + TRAINER_CLASS_CYCLING_TRIATHLETE_F, + TRAINER_CLASS_RUNNING_TRIATHLETE_F, + TRAINER_CLASS_SWIMMING_TRIATHLETE_F, + TRAINER_CLASS_BATTLE_GIRL, + TRAINER_CLASS_PARASOL_LADY, + TRAINER_CLASS_SWIMMER_F, + TRAINER_CLASS_PICNICKER, + TRAINER_CLASS_POKEMON_BREEDER_F, + TRAINER_CLASS_POKEMON_RANGER_F, + TRAINER_CLASS_LASS, +}; + +static const u8 sMaleTrainerGfxIds[] = { + MAP_OBJ_GFX_HIKER, + MAP_OBJ_GFX_TUBER_M, + MAP_OBJ_GFX_MAN_4, + MAP_OBJ_GFX_BOY_4, + MAP_OBJ_GFX_MANIAC, + MAP_OBJ_GFX_RUNNING_TRIATHLETE_M, + MAP_OBJ_GFX_BLACK_BELT, + MAP_OBJ_GFX_MAN_6, + MAP_OBJ_GFX_MAN_6, + MAP_OBJ_GFX_CAMPER, + MAP_OBJ_GFX_MANIAC, + MAP_OBJ_GFX_PSYCHIC_M, + MAP_OBJ_GFX_GENTLEMAN, + MAP_OBJ_GFX_SCHOOL_KID_M, + MAP_OBJ_GFX_MAN_3, + MAP_OBJ_GFX_OLD_MAN_1, + MAP_OBJ_GFX_YOUNGSTER, + MAP_OBJ_GFX_FISHERMAN, + MAP_OBJ_GFX_CYCLING_TRIATHLETE_M, + MAP_OBJ_GFX_RUNNING_TRIATHLETE_M, + MAP_OBJ_GFX_RUNNING_TRIATHLETE_M, + MAP_OBJ_GFX_MAN_4, + MAP_OBJ_GFX_MAN_6, + MAP_OBJ_GFX_LITTLE_BOY_1, + MAP_OBJ_GFX_SAILOR, + MAP_OBJ_GFX_MANIAC, + MAP_OBJ_GFX_MAN_5, + MAP_OBJ_GFX_CAMPER, + MAP_OBJ_GFX_BUG_CATCHER, + MAP_OBJ_GFX_HIKER, +}; + +static const u8 sFemaleTrainerGfxIds[] = { + MAP_OBJ_GFX_WOMAN_3, + MAP_OBJ_GFX_TUBER_F, + MAP_OBJ_GFX_WOMAN_7, + MAP_OBJ_GFX_WOMAN_1, + MAP_OBJ_GFX_WOMAN_3, + MAP_OBJ_GFX_BEAUTY, + MAP_OBJ_GFX_LASS, + MAP_OBJ_GFX_GIRL_3, + MAP_OBJ_GFX_WOMAN_2, + MAP_OBJ_GFX_OLD_WOMAN_1, + MAP_OBJ_GFX_CYCLING_TRIATHLETE_F, + MAP_OBJ_GFX_RUNNING_TRIATHLETE_F, + MAP_OBJ_GFX_RUNNING_TRIATHLETE_F, + MAP_OBJ_GFX_GIRL_3, + MAP_OBJ_GFX_WOMAN_7, + MAP_OBJ_GFX_RUNNING_TRIATHLETE_F, + MAP_OBJ_GFX_PICNICKER, + MAP_OBJ_GFX_WOMAN_3, + MAP_OBJ_GFX_PICNICKER, + MAP_OBJ_GFX_LASS, +}; + +const u16 gBattleTowerBannedSpecies[] = { + SPECIES_MEW, + SPECIES_MEWTWO, + SPECIES_HO_OH, + SPECIES_LUGIA, + SPECIES_CELEBI, + SPECIES_KYOGRE, + SPECIES_GROUDON, + SPECIES_RAYQUAZA, + SPECIES_JIRACHI, + SPECIES_DEOXYS, + 0xFFFF, +}; + +// Item prizes for battle tower streaks of 5 or fewer sets. +/*static*/ const u16 sShortStreakPrizes[] = { + ITEM_HP_UP, + ITEM_PROTEIN, + ITEM_IRON, + ITEM_CALCIUM, + ITEM_CARBOS, + ITEM_ZINC, +}; + +// Item prizes for battle tower streaks of greater than 5 sets. +/*static*/ const u16 sLongStreakPrizes[] = { + ITEM_BRIGHT_POWDER, + ITEM_WHITE_HERB, + ITEM_QUICK_CLAW, + ITEM_LEFTOVERS, + ITEM_MENTAL_HERB, + ITEM_KINGS_ROCK, + ITEM_FOCUS_BAND, + ITEM_SCOPE_LENS, + ITEM_CHOICE_BAND, +}; + +static void ResetBattleTowerStreak(u8 levelType); +static void ValidateBattleTowerRecordChecksums(void); +static void PrintEReaderTrainerFarewellMessage(void); +extern void SetBattleTowerTrainerGfxId(u8); +extern void sub_8135A3C(void); +static void sub_8135CFC(void); +static void CheckMonBattleTowerBanlist(u16, u16, u16, u8, u8, u16 *, u16 *, u8 *); +static void ClearEReaderTrainer(struct BattleTowerEReaderTrainer *); +static void SetEReaderTrainerChecksum(struct BattleTowerEReaderTrainer *ereaderTrainer); +static void SetBattleTowerRecordChecksum(struct BattleTowerRecord *); +static void ClearBattleTowerRecord(struct BattleTowerRecord *); + +extern const u8 gUnknown_08400E23[]; +extern const u8 gUnknown_08400E29[]; +extern const u8 gUnknown_08400E2C[]; +extern const u8 gUnknown_08400E2E[]; +extern const u8 gUnknown_08400E30[]; +extern const u8 gUnknown_08400E32[]; +extern const u8 gUnknown_08400E36[]; +extern u16 gSpecialVar_0x8004; +extern u8 gTrainerClassToPicIndex[]; +extern u8 gTrainerClassToNameIndex[]; +extern u16 gTrainerBattleOpponent; +extern u16 gBattleTypeFlags; +extern u8 gSelectedOrderFromParty[]; +extern u8 gBattleOutcome; +extern struct Pokemon gUnknown_030042FC[]; +extern struct BattlePokemon gBattleMons[]; + +#define ewram160FB (ewram[0x160FB]) + + +void sub_8134548(void) +{ + u8 var1 = 0; + s32 levelType; + + for (levelType = 0; levelType < 2; levelType++) + { + switch (gSaveBlock2.battleTower.var_4AE[levelType]) + { + case 0: + default: + ResetBattleTowerStreak(levelType); + if (!var1) + { + VarSet(VAR_0x4000, 5); + } + break; + case 1: + ResetBattleTowerStreak(levelType); + VarSet(VAR_0x4000, 1); + var1++; + break; + case 4: + VarSet(VAR_0x4000, 2); + var1++; + break; + case 5: + VarSet(VAR_0x4000, 3); + var1++; + break; + case 2: + VarSet(VAR_0x4000, 4); + var1++; + break; + case 3: + case 6: + break; + } + } + + if ((gSaveBlock2.battleTower.var_4AE[0] == 3 || gSaveBlock2.battleTower.var_4AE[0] == 6) + && (gSaveBlock2.battleTower.var_4AE[1] == 3 || gSaveBlock2.battleTower.var_4AE[1] == 6)) + { + VarSet(VAR_0x4000, 5); + } + + ValidateBattleTowerRecordChecksums(); +} + +void ResetBattleTowerStreak(u8 levelType) +{ + gSaveBlock2.battleTower.var_4AE[levelType] = 0; + gSaveBlock2.battleTower.curChallengeBattleNum[levelType] = 1; + gSaveBlock2.battleTower.curStreakChallengesNum[levelType] = 1; +} + +// Checks if the next trainer in Battle Tower should be the E-Reader trainer. +bool8 ShouldBattleEReaderTrainer(u8 levelType, u16 winStreak) +{ + u8 trainerTeamLevel; + u8 monLevel; + s32 i; + u16 validPartySpecies[6]; + u16 validPartyHeldItems[6]; + u8 numValid; + + numValid = 0; + + ValidateEReaderTrainer(); + + if (gScriptResult != 0 || gSaveBlock2.battleTower.ereaderTrainer.winStreak != winStreak) + { + return FALSE; + } + + trainerTeamLevel = 50; + if (levelType != 0) + { + trainerTeamLevel = 100; + } + + for (i = 0; i < 3; i++) + { + monLevel = gSaveBlock2.battleTower.ereaderTrainer.party[i].level; + if (gSaveBlock2.battleTower.ereaderTrainer.party[i].level != trainerTeamLevel) + { + return FALSE; + } + + CheckMonBattleTowerBanlist( + gSaveBlock2.battleTower.ereaderTrainer.party[i].species, + gSaveBlock2.battleTower.ereaderTrainer.party[i].heldItem, + 1, + levelType, + monLevel, + validPartySpecies, + validPartyHeldItems, + &numValid); + } + + return numValid == 3; +} + +bool8 sub_81346F4(void) +{ + s32 recordIndex, i; + u8 battleTowerLevelType; + u16 winStreak; + bool8 retVal; + s32 numCandidates; + u32 trainerIds[5]; + + numCandidates = 0; + battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; + + winStreak = GetCurrentBattleTowerWinStreak(battleTowerLevelType); + if (ShouldBattleEReaderTrainer(battleTowerLevelType, winStreak)) + { + gSaveBlock2.battleTower.battleTowerTrainerId = BATTLE_TOWER_EREADER_TRAINER_ID; + retVal = TRUE; + } + else + { + // Check if one of the battle tower trainers from record mixing should be the next trainer. + for (recordIndex = 0; recordIndex < 5; recordIndex++) + { + struct BattleTowerRecord *record = &gSaveBlock2.battleTower.records[recordIndex]; + u32 recordHasData = 0; + u32 checksum = 0; + for (i = 0; i < sizeof(struct BattleTowerRecord) / sizeof(u32) - 1; i++) + { + recordHasData |= ((u32 *)record)[i]; + checksum += ((u32 *)record)[i]; + } + + if (gSaveBlock2.battleTower.records[recordIndex].winStreak == winStreak + && gSaveBlock2.battleTower.records[recordIndex].battleTowerLevelType == battleTowerLevelType + && recordHasData + && gSaveBlock2.battleTower.records[recordIndex].checksum == checksum) + { + trainerIds[numCandidates] = recordIndex; + numCandidates++; + } + } + + if (numCandidates == 0) + { + retVal = FALSE; + } + else + { + gSaveBlock2.battleTower.battleTowerTrainerId = trainerIds[Random() % numCandidates] + BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID; + retVal = TRUE; + } + } + + return retVal; +} + +// void sub_81347F8(void) +// { +// bool8 levelType = gSaveBlock2.battleTower.battleTowerLevelType; +// if (sub_81346F4()) +// { +// SetBattleTowerTrainerGfxId(gSaveBlock2.battleTower.battleTowerTrainerId); +// gSaveBlock2.battleTower.var_4C1[gSaveBlock2.battleTower.curChallengeBattleNum[levelType]] = gSaveBlock2.battleTower.battleTowerTrainerId; +// } +// else +// { +// u16 var1; + +// if (gSaveBlock2.battleTower.curStreakChallengesNum[levelType] > 7) +// { +// while (1) +// { +// s32 i; +// u32 temp = ((Random() & 0xFF) * 30) >> 8; +// var1 = temp + 70; +// for (i = 0; i < gSaveBlock2.battleTower.curChallengeBattleNum[levelType] - 1 && var1 != gSaveBlock2.battleTower.var_4C1[i]; i++) // TODO: [i + 1]??? +// { } + +// if (i == gSaveBlock2.battleTower.curChallengeBattleNum[levelType] - 1) +// { +// break; +// } +// } +// } +// else +// { +// if (gSaveBlock2.battleTower.curChallengeBattleNum[levelType] == 7) +// { +// while (1) +// { +// s32 i; +// u32 temp = ((Random() & 0xFF) * 5); +// u32 temp2 = (((gSaveBlock2.battleTower.curStreakChallengesNum[levelType] - 1) * 10) + 20); +// var1 = temp / 128 + temp2; +// for (i = 0; i < gSaveBlock2.battleTower.curChallengeBattleNum[levelType] - 1 && gSaveBlock2.battleTower.var_4C1[i] != var1; i++) // TODO: [i + 1]???? +// { } + +// if (i == gSaveBlock2.battleTower.curChallengeBattleNum[levelType] - 1) +// { +// break; +// } +// } +// } +// else +// { +// while (1) +// { +// s32 i; +// u32 temp = ((Random() & 0xFF) * 320); +// u32 temp2 = ((gSaveBlock2.battleTower.curStreakChallengesNum[levelType] - 1) * 10); +// var1 = temp + temp2; +// for (i = 0; i < gSaveBlock2.battleTower.curChallengeBattleNum[levelType] - 1 && gSaveBlock2.battleTower.var_4C1[i] != var1; i++) +// { } + +// if (i == gSaveBlock2.battleTower.curChallengeBattleNum[levelType] - 1) +// { +// break; +// } +// } +// } +// } + +// gSaveBlock2.battleTower.battleTowerTrainerId = var1; +// SetBattleTowerTrainerGfxId(gSaveBlock2.battleTower.battleTowerTrainerId); + +// if (gSaveBlock2.battleTower.curChallengeBattleNum[levelType] < 7) +// { +// gSaveBlock2.battleTower.var_4C1[gSaveBlock2.battleTower.curChallengeBattleNum[levelType]] = gSaveBlock2.battleTower.battleTowerTrainerId; +// } +// } +// } + +__attribute__((naked)) +void sub_81347F8(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + ldr r5, _08134838 @ =gSaveBlock2\n\ + ldr r1, _0813483C @ =0x00000554\n\ + adds r0, r5, r1\n\ + ldrb r0, [r0]\n\ + lsls r0, 31\n\ + lsrs r6, r0, 31\n\ + bl sub_81346F4\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _08134848\n\ + ldr r2, _08134840 @ =0x00000564\n\ + adds r4, r5, r2\n\ + ldrb r0, [r4]\n\ + bl SetBattleTowerTrainerGfxId\n\ + lsls r0, r6, 1\n\ + movs r3, 0xAB\n\ + lsls r3, 3\n\ + adds r1, r5, r3\n\ + adds r0, r1\n\ + ldrh r0, [r0]\n\ + adds r0, r5, r0\n\ + ldr r1, _08134844 @ =0x00000569\n\ + adds r0, r1\n\ + ldrb r1, [r4]\n\ + b _081349DC\n\ + .align 2, 0\n\ +_08134838: .4byte gSaveBlock2\n\ +_0813483C: .4byte 0x00000554\n\ +_08134840: .4byte 0x00000564\n\ +_08134844: .4byte 0x00000569\n\ +_08134848:\n\ + lsls r0, r6, 1\n\ + ldr r2, _081348D8 @ =0x0000055c\n\ + adds r1, r5, r2\n\ + adds r1, r0, r1\n\ + ldrh r1, [r1]\n\ + adds r7, r0, 0\n\ + cmp r1, 0x7\n\ + bls _0813485A\n\ + b _0813495C\n\ +_0813485A:\n\ + movs r3, 0xAB\n\ + lsls r3, 3\n\ + adds r0, r5, r3\n\ + adds r1, r7, r0\n\ + ldrh r0, [r1]\n\ + cmp r0, 0x7\n\ + bne _081348E4\n\ + adds r6, r5, 0\n\ + mov r9, r7\n\ + adds r5, r1, 0\n\ + ldr r0, _081348DC @ =0x0000056a\n\ + adds r0, r6\n\ + mov r10, r0\n\ + mov r8, r5\n\ +_08134876:\n\ + bl Random\n\ + movs r1, 0xFF\n\ + ands r1, r0\n\ + lsls r2, r1, 2\n\ + adds r2, r1\n\ + ldr r1, _081348D8 @ =0x0000055c\n\ + adds r4, r6, r1\n\ + mov r3, r9\n\ + adds r0, r3, r4\n\ + ldrh r1, [r0]\n\ + subs r1, 0x1\n\ + lsls r0, r1, 2\n\ + adds r0, r1\n\ + lsls r0, 1\n\ + adds r0, 0x14\n\ + lsrs r2, 7\n\ + adds r2, r0\n\ + lsls r2, 16\n\ + lsrs r2, 16\n\ + movs r1, 0\n\ + ldrh r0, [r5]\n\ + subs r0, 0x1\n\ + cmp r1, r0\n\ + bge _081348C8\n\ + mov r3, r10\n\ + ldrb r0, [r3]\n\ + cmp r0, r2\n\ + beq _081348C8\n\ + subs r0, r4, 0x4\n\ + adds r0, r7, r0\n\ + ldrh r0, [r0]\n\ + subs r3, r0, 0x1\n\ + adds r4, 0xE\n\ +_081348BA:\n\ + adds r1, 0x1\n\ + cmp r1, r3\n\ + bge _081348C8\n\ + adds r0, r1, r4\n\ + ldrb r0, [r0]\n\ + cmp r0, r2\n\ + bne _081348BA\n\ +_081348C8:\n\ + mov r3, r8\n\ + ldrh r0, [r3]\n\ + subs r0, 0x1\n\ + ldr r4, _081348E0 @ =gSaveBlock2\n\ + cmp r1, r0\n\ + bne _08134876\n\ + b _081349B6\n\ + .align 2, 0\n\ +_081348D8: .4byte 0x0000055c\n\ +_081348DC: .4byte 0x0000056a\n\ +_081348E0: .4byte gSaveBlock2\n\ +_081348E4:\n\ + adds r6, r5, 0\n\ + mov r9, r7\n\ + adds r5, r1, 0\n\ + ldr r2, _08134950 @ =0x0000056a\n\ + adds r2, r6\n\ + mov r10, r2\n\ + mov r8, r5\n\ +_081348F2:\n\ + bl Random\n\ + movs r1, 0xFF\n\ + ands r1, r0\n\ + lsls r0, r1, 2\n\ + adds r0, r1\n\ + lsrs r2, r0, 6\n\ + ldr r3, _08134954 @ =0x0000055c\n\ + adds r4, r6, r3\n\ + mov r1, r9\n\ + adds r0, r1, r4\n\ + ldrh r1, [r0]\n\ + subs r1, 0x1\n\ + lsls r0, r1, 2\n\ + adds r0, r1\n\ + lsls r0, 1\n\ + adds r0, r2, r0\n\ + lsls r0, 16\n\ + lsrs r2, r0, 16\n\ + movs r1, 0\n\ + ldrh r0, [r5]\n\ + subs r0, 0x1\n\ + cmp r1, r0\n\ + bge _08134942\n\ + mov r3, r10\n\ + ldrb r0, [r3]\n\ + cmp r0, r2\n\ + beq _08134942\n\ + subs r0, r4, 0x4\n\ + adds r0, r7, r0\n\ + ldrh r0, [r0]\n\ + subs r3, r0, 0x1\n\ + adds r4, 0xE\n\ +_08134934:\n\ + adds r1, 0x1\n\ + cmp r1, r3\n\ + bge _08134942\n\ + adds r0, r1, r4\n\ + ldrb r0, [r0]\n\ + cmp r0, r2\n\ + bne _08134934\n\ +_08134942:\n\ + mov r3, r8\n\ + ldrh r0, [r3]\n\ + subs r0, 0x1\n\ + ldr r4, _08134958 @ =gSaveBlock2\n\ + cmp r1, r0\n\ + bne _081348F2\n\ + b _081349B6\n\ + .align 2, 0\n\ +_08134950: .4byte 0x0000056a\n\ +_08134954: .4byte 0x0000055c\n\ +_08134958: .4byte gSaveBlock2\n\ +_0813495C:\n\ + movs r2, 0xAB\n\ + lsls r2, 3\n\ + adds r0, r5, r2\n\ + adds r6, r7, r0\n\ + ldr r3, _081349EC @ =0x0000056a\n\ + adds r3, r5\n\ + mov r8, r3\n\ + adds r5, r6, 0\n\ +_0813496C:\n\ + bl Random\n\ + movs r1, 0xFF\n\ + ands r1, r0\n\ + lsls r0, r1, 4\n\ + subs r0, r1\n\ + lsls r0, 1\n\ + asrs r0, 8\n\ + adds r0, 0x46\n\ + lsls r0, 16\n\ + lsrs r2, r0, 16\n\ + movs r1, 0\n\ + ldrh r0, [r6]\n\ + subs r0, 0x1\n\ + cmp r1, r0\n\ + bge _081349AC\n\ + mov r3, r8\n\ + ldrb r0, [r3]\n\ + ldr r4, _081349F0 @ =gSaveBlock2\n\ + cmp r0, r2\n\ + beq _081349AC\n\ + ldrh r0, [r5]\n\ + subs r3, r0, 0x1\n\ + ldr r0, _081349EC @ =0x0000056a\n\ + adds r4, r0\n\ +_0813499E:\n\ + adds r1, 0x1\n\ + cmp r1, r3\n\ + bge _081349AC\n\ + adds r0, r1, r4\n\ + ldrb r0, [r0]\n\ + cmp r0, r2\n\ + bne _0813499E\n\ +_081349AC:\n\ + ldrh r0, [r6]\n\ + subs r0, 0x1\n\ + ldr r4, _081349F0 @ =gSaveBlock2\n\ + cmp r1, r0\n\ + bne _0813496C\n\ +_081349B6:\n\ + ldr r1, _081349F4 @ =0x00000564\n\ + adds r0, r4, r1\n\ + strb r2, [r0]\n\ + ldr r2, _081349F4 @ =0x00000564\n\ + adds r5, r4, r2\n\ + ldrb r0, [r5]\n\ + bl SetBattleTowerTrainerGfxId\n\ + movs r3, 0xAB\n\ + lsls r3, 3\n\ + adds r0, r4, r3\n\ + adds r1, r7, r0\n\ + ldrh r0, [r1]\n\ + cmp r0, 0x6\n\ + bhi _081349DE\n\ + adds r0, r4, r0\n\ + ldr r1, _081349F8 @ =0x00000569\n\ + adds r0, r1\n\ + ldrb r1, [r5]\n\ +_081349DC:\n\ + strb r1, [r0]\n\ +_081349DE:\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_081349EC: .4byte 0x0000056a\n\ +_081349F0: .4byte gSaveBlock2\n\ +_081349F4: .4byte 0x00000564\n\ +_081349F8: .4byte 0x00000569\n\ +.syntax divided\n"); +} + +void SetBattleTowerTrainerGfxId(u8 trainerIndex) +{ + u32 i; + u8 trainerClass; + + if (trainerIndex < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) + { + trainerClass = gBattleTowerTrainers[trainerIndex].trainerClass; + } + else if (trainerIndex < BATTLE_TOWER_EREADER_TRAINER_ID) + { + trainerClass = gSaveBlock2.battleTower.records[trainerIndex - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].trainerClass; + } + else + { + trainerClass = gSaveBlock2.battleTower.ereaderTrainer.trainerClass; + } + + for (i = 0; i < 30 && sMaleTrainerClasses[i] != trainerClass; i++); + if (i != 30) + { + u8 trainerObjectGfxId = sMaleTrainerGfxIds[i]; + VarSet(0x4010, trainerObjectGfxId); + return; + } + + for (i = 0; i < 20 && sFemaleTrainerClasses[i] != trainerClass; i++); + if (i != 20) + { + u8 trainerObjectGfxId = sFemaleTrainerGfxIds[i]; + VarSet(0x4010, trainerObjectGfxId); + return; + } + + VarSet(0x4010, MAP_OBJ_GFX_BOY_1); +} + +void SetEReaderTrainerGfxId(void) +{ + SetBattleTowerTrainerGfxId(BATTLE_TOWER_EREADER_TRAINER_ID); +} + +// void sub_8134AC0(struct BattleTowerRecord *record) +// { +// u16 var1[6]; +// u16 var2[6]; +// s32 i, j, k; +// s16 l = 0; + +// for (i = 0; i < 5; i++) +// { +// k = 0; +// for (j = 0; j < 4 && gSaveBlock2.battleTower.records[i].trainerId[j] == record->trainerId[j]; j++); +// if (j == 4) +// { +// for (; k < 7 && gSaveBlock2.battleTower.records[i].name[4] == record->name[4]; k++) +// { +// if (record->name[4] == 0xFF) +// { +// k = 7; +// break; +// } +// } +// } + +// if (k == 7) +// { +// break; +// } +// } + +// if (i < 5) +// { +// gSaveBlock2.battleTower.records[i] = *record; +// return; +// } + +// i = 0; +// while (i < 5) +// { +// if (gSaveBlock2.battleTower.records[i].winStreak == 0) +// { +// if (i > 4) +// { +// break; +// } + +// gSaveBlock2.battleTower.records[i] = *record; +// return; +// } + +// i++; +// } + +// var1[0] = gSaveBlock2.battleTower.records[0].winStreak; +// var2[0] = 0; +// l++; + +// for (i = 1; i < 5; i++) +// { +// j = 0; +// if (j < l) +// { +// for (; gSaveBlock2.battleTower.records[i].winStreak <= var1[j]; j++) +// { +// if (gSaveBlock2.battleTower.records[i].winStreak < var1[j]) +// { +// j = 0; +// l = 1; +// var1[0] = gSaveBlock2.battleTower.records[i].winStreak; +// var2[0] = i; +// break; +// } +// } +// } + +// if (j == l) +// { +// var1[l] = gSaveBlock2.battleTower.records[i].winStreak; +// var2[l] = i; +// l++; +// } +// } + +// gSaveBlock2.battleTower.records[var2[(Random() % l)]] = *record; +// } +__attribute__((naked)) +void sub_8134AC0(struct BattleTowerRecord *record) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x1C\n\ + movs r7, 0\n\ + mov r8, r0\n\ + movs r5, 0\n\ + ldr r0, _08134B3C @ =gSaveBlock2\n\ + mov r12, r0\n\ + mov r1, r8\n\ + ldrb r1, [r1, 0xC]\n\ + str r1, [sp, 0x18]\n\ + movs r2, 0xAA\n\ + lsls r2, 1\n\ + add r2, r12\n\ + mov r10, r2\n\ + mov r9, r5\n\ +_08134AE6:\n\ + movs r6, 0\n\ + movs r3, 0\n\ + ldr r0, _08134B40 @ =gSaveBlock2 + 0x158\n\ + add r0, r9\n\ + ldrb r0, [r0]\n\ + ldr r1, [sp, 0x18]\n\ + cmp r0, r1\n\ + bne _08134B14\n\ + movs r0, 0xA4\n\ + muls r0, r5\n\ + ldr r1, _08134B40 @ =gSaveBlock2 + 0x158\n\ + adds r2, r0, r1\n\ + mov r4, r8\n\ + adds r4, 0xC\n\ +_08134B02:\n\ + adds r2, 0x1\n\ + adds r3, 0x1\n\ + cmp r3, 0x3\n\ + bgt _08134B14\n\ + adds r1, r4, r3\n\ + ldrb r0, [r2]\n\ + ldrb r1, [r1]\n\ + cmp r0, r1\n\ + beq _08134B02\n\ +_08134B14:\n\ + cmp r3, 0x4\n\ + bne _08134B54\n\ + movs r6, 0\n\ + mov r2, r10\n\ + ldrb r0, [r2]\n\ + mov r3, r8\n\ + ldrb r3, [r3, 0x8]\n\ + cmp r0, r3\n\ + bne _08134B54\n\ + adds r1, r0, 0\n\ + movs r0, 0xA4\n\ + muls r0, r5\n\ + adds r0, 0x4\n\ + ldr r3, _08134B44 @ =gSaveBlock2 + 0x150\n\ + adds r2, r0, r3\n\ +_08134B32:\n\ + cmp r1, 0xFF\n\ + bne _08134B48\n\ + movs r6, 0x7\n\ + b _08134B54\n\ + .align 2, 0\n\ +_08134B3C: .4byte gSaveBlock2\n\ +_08134B40: .4byte gSaveBlock2 + 0x158\n\ +_08134B44: .4byte gSaveBlock2 + 0x150\n\ +_08134B48:\n\ + adds r6, 0x1\n\ + cmp r6, 0x6\n\ + bgt _08134B54\n\ + ldrb r0, [r2]\n\ + cmp r0, r1\n\ + beq _08134B32\n\ +_08134B54:\n\ + cmp r6, 0x7\n\ + beq _08134B64\n\ + movs r0, 0xA4\n\ + add r10, r0\n\ + add r9, r0\n\ + adds r5, 0x1\n\ + cmp r5, 0x4\n\ + ble _08134AE6\n\ +\n\ +_08134B64:\n\ + cmp r5, 0x4\n\ + bgt _08134B76\n\ + movs r0, 0xA4\n\ + muls r0, r5\n\ + add r0, r12\n\ + movs r1, 0xA6\n\ + lsls r1, 1\n\ + adds r0, r1\n\ + b _08134B9E\n\ +_08134B76:\n\ + movs r5, 0\n\ + movs r1, 0xA7\n\ + lsls r1, 1\n\ + add r1, r12\n\ + b _08134B88\n\ +_08134B80:\n\ + adds r1, 0xA4\n\ + adds r5, 0x1\n\ + cmp r5, 0x4\n\ + bgt _08134BA8\n\ +_08134B88:\n\ + ldrh r0, [r1]\n\ + cmp r0, 0\n\ + bne _08134B80\n\ + cmp r5, 0x4\n\ + bgt _08134BA8\n\ + movs r0, 0xA4\n\ + muls r0, r5\n\ + add r0, r12\n\ + movs r2, 0xA6\n\ + lsls r2, 1\n\ + adds r0, r2\n\ +_08134B9E:\n\ + mov r1, r8\n\ + movs r2, 0xA4\n\ + bl memcpy\n\ + b _08134C5E\n\ +\n\ +_08134BA8:\n\ + mov r2, sp\n\ + movs r3, 0xA7\n\ + lsls r3, 1\n\ + mov r1, r12\n\ + adds r0, r1, r3\n\ + ldrh r0, [r0]\n\ + movs r1, 0\n\ + strh r0, [r2]\n\ + add r0, sp, 0xC\n\ + strh r1, [r0]\n\ + adds r7, 0x1\n\ + movs r5, 0x1\n\ + add r2, sp, 0xC @var2 = r2\n\ + mov r9, r2\n\ + mov r10, r3\n\ +_08134BC6:\n\ + movs r3, 0\n\ + adds r0, r5, 0x1\n\ + mov r12, r0\n\ + cmp r3, r7\n\ + bge _08134C0A @ j < l\n\ + movs r1, 0xA4\n\ + adds r0, r5, 0\n\ + muls r0, r1\n\ + ldr r2, _08134BFC @ =gSaveBlock2\n\ + adds r0, r2\n\ + mov r1, r10\n\ + adds r4, r0, r1\n\ + mov r6, sp\n\ +_08134BE0:\n\ + lsls r0, r3, 1\n\ + add r0, sp\n\ + ldrh r2, [r4]\n\ + adds r1, r2, 0\n\ + ldrh r0, [r0]\n\ + cmp r1, r0\n\ + bcs _08134C00\n\ + movs r3, 0\n\ + movs r7, 0x1\n\ + strh r2, [r6]\n\ + mov r2, r9\n\ + strh r5, [r2]\n\ + b _08134C0A\n\ + .align 2, 0\n\ +_08134BFC: .4byte gSaveBlock2\n\ +_08134C00:\n\ + cmp r1, r0\n\ + bhi _08134C0A\n\ + adds r3, 0x1\n\ + cmp r3, r7\n\ + blt _08134BE0\n\ +_08134C0A:\n\ + cmp r3, r7\n\ + bne _08134C2A\n\ + lsls r1, r7, 1\n\ + mov r3, sp\n\ + adds r2, r3, r1\n\ + movs r3, 0xA4\n\ + adds r0, r5, 0\n\ + muls r0, r3\n\ + ldr r3, _08134C70 @ =gSaveBlock2\n\ + adds r0, r3\n\ + add r0, r10\n\ + ldrh r0, [r0]\n\ + strh r0, [r2]\n\ + add r1, r9\n\ + strh r5, [r1]\n\ + adds r7, 0x1\n\ +_08134C2A:\n\ + mov r5, r12\n\ + cmp r5, 0x4\n\ + ble _08134BC6\n\ + bl Random\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + adds r1, r7, 0\n\ + bl __modsi3\n\ + adds r5, r0, 0\n\ + ldr r2, _08134C70 @ =gSaveBlock2\n\ + lsls r0, r5, 1\n\ + add r0, sp\n\ + adds r0, 0xC\n\ + ldrh r1, [r0]\n\ + movs r0, 0xA4\n\ + muls r0, r1\n\ + adds r0, r2\n\ + movs r1, 0xA6\n\ + lsls r1, 1\n\ + adds r0, r1\n\ + mov r1, r8\n\ + movs r2, 0xA4\n\ + bl memcpy\n\ +_08134C5E:\n\ + add sp, 0x1C\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_08134C70: .4byte gSaveBlock2\n\ + .syntax divided\n"); +} + +u8 get_trainer_class_pic_index(void) +{ + if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) + { + return gTrainerClassToPicIndex[gSaveBlock2.battleTower.ereaderTrainer.trainerClass]; + } + else if (gSaveBlock2.battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) + { + return gTrainerClassToPicIndex[gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].trainerClass]; + } + else + { + return gTrainerClassToPicIndex[gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].trainerClass]; + } +} + +u8 get_trainer_class_name_index(void) +{ + if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) + { + return gTrainerClassToNameIndex[gSaveBlock2.battleTower.ereaderTrainer.trainerClass]; + } + else if (gSaveBlock2.battleTower.battleTowerTrainerId >= BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) + { + return gTrainerClassToNameIndex[gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].trainerClass]; + } + else + { + return gTrainerClassToNameIndex[gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].trainerClass]; + } +} + +void get_trainer_name(u8* dest) +{ + s32 i; + + if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) + { + for (i = 0; i < 7; i++) + { + dest[i] = gSaveBlock2.battleTower.ereaderTrainer.name[i]; + } + } + else if (gSaveBlock2.battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) + { + for (i = 0; i < 7; i++) + { + dest[i] = gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].name[i]; + } + } + else + { + for (i = 0; i < 7; i++) + { + dest[i] = gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].name[i]; + } + } + + dest[i] = 0xFF; +} + +void FillBattleTowerTrainerParty(void) +{ + s32 partyIndex, i; + u16 chosenMonIndices[3]; + u8 friendship; + u8 level; + u8 fixedIV; + u8 battleMonsOffset; + u8 monPoolSize; + u8 teamFlags; + const struct BattleTowerPokemon *battleTowerMons; + + battleMonsOffset = 0; + monPoolSize = 60; + friendship = 255; + + ZeroEnemyPartyMons(); + + // Different trainers have access to different sets of pokemon to use in battle. + // The pokemon later in gBattleTowerLevel100Mons or gBattleTowerLevel50Mons are + // stronger. Additionally, the later trainers' pokemon are granted higher IVs. + if (gSaveBlock2.battleTower.battleTowerTrainerId < 20) + { + fixedIV = 6; + } + else if (gSaveBlock2.battleTower.battleTowerTrainerId < 30) + { + fixedIV = 9; + battleMonsOffset = 30; + } + else if (gSaveBlock2.battleTower.battleTowerTrainerId < 40) + { + fixedIV = 12; + battleMonsOffset = 60; + } + else if (gSaveBlock2.battleTower.battleTowerTrainerId < 50) + { + fixedIV = 15; + battleMonsOffset = 90; + } + else if (gSaveBlock2.battleTower.battleTowerTrainerId < 60) + { + fixedIV = 18; + battleMonsOffset = 120; + } + else if (gSaveBlock2.battleTower.battleTowerTrainerId < 70) + { + fixedIV = 21; + battleMonsOffset = 150; + } + else if (gSaveBlock2.battleTower.battleTowerTrainerId < 80) + { + fixedIV = 31; + battleMonsOffset = 180; + } + else if (gSaveBlock2.battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) + { + fixedIV = 31; + battleMonsOffset = 200; + monPoolSize = 100; + } + else if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) + { + // Load E-Reader trainer's party. + for (partyIndex = 0; partyIndex < 3; partyIndex++) + { + sub_803ADE8(&gEnemyParty[partyIndex], &gSaveBlock2.battleTower.ereaderTrainer.party[partyIndex]); + } + + return; + } + else + { + // Load a battle tower record's party. (From record mixing) + for (partyIndex = 0; partyIndex < 3; partyIndex++) + { + sub_803ADE8( + &gEnemyParty[partyIndex], + &gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].party[partyIndex]); + } + + return; + } + + // Use the appropriate list of pokemon and level depending on the + // current challenge type. (level 50 or level 100 challenge) + if (gSaveBlock2.battleTower.battleTowerLevelType != 0) + { + battleTowerMons = gBattleTowerLevel100Mons; + level = 100; + } + else + { + battleTowerMons = gBattleTowerLevel50Mons; + level = 50; + } + + teamFlags = gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].teamFlags; + + // Attempt to fill the trainer's party with random Pokemon until 3 have been + // successfully chosen. The trainer's party may not have duplicate pokemon species + // or duplicate held items. Each pokemon must have all of the trainer's team flags + // set, as well. If any of those conditions are not met, then the loop starts over + // and another pokemon is chosen at random. + partyIndex = 0; + while (partyIndex != 3) + { + // Pick a random pokemon index based on the number of pokemon available to choose from + // and the starting offset in the battle tower pokemon array. + s32 battleMonIndex = ((Random() & 0xFF) * monPoolSize) / 256 + battleMonsOffset; + + // Ensure the chosen pokemon has compatible team flags with the trainer. + if (teamFlags == 0 || (battleTowerMons[battleMonIndex].teamFlags & teamFlags) == teamFlags) + { + // Ensure this pokemon species isn't a duplicate. + for (i = 0; i < partyIndex; i++) + { + if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES, NULL) == battleTowerMons[battleMonIndex].species) + break; + } + + if (i != partyIndex) + continue; + + // Ensure this pokemon's held item isn't a duplicate. + for (i = 0; i < partyIndex; i++) + { + if (GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, NULL) != 0 + && GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, NULL) == sBattleTowerHeldItems[battleTowerMons[battleMonIndex].heldItem]) + { + break; + } + } + + if (i != partyIndex) + continue; + + // Ensure this exact pokemon index isn't a duplicate. This check doesn't seem necessary + // because the species and held items were already checked directly above. Perhaps this + // is leftover code before the logic for duplicate species and held items was added. + for (i = 0; i < partyIndex && chosenMonIndices[i] != battleMonIndex; i++); + + if (i != partyIndex) + continue; + + chosenMonIndices[partyIndex] = battleMonIndex; + + // Place the chosen pokemon into the trainer's party. + CreateMonWithEVSpread( + &gEnemyParty[partyIndex], + battleTowerMons[battleMonIndex].species, + level, + fixedIV, + battleTowerMons[battleMonIndex].evSpread); + + // Give the chosen pokemon its specified moves. + for (i = 0; i < 4; i++) + { + SetMonMoveSlot(&gEnemyParty[partyIndex], battleTowerMons[battleMonIndex].moves[i], i); + if (battleTowerMons[battleMonIndex].moves[i] == MOVE_FRUSTRATION) + { + // MOVE_FRUSTRATION is more powerful the lower the pokemon's friendship is. + friendship = 0; + } + } + + SetMonData(&gEnemyParty[partyIndex], MON_DATA_FRIENDSHIP, &friendship); + SetMonData(&gEnemyParty[partyIndex], MON_DATA_HELD_ITEM, &sBattleTowerHeldItems[battleTowerMons[battleMonIndex].heldItem]); + + // The pokemon was successfully added to the trainer's party, so it's safe to move on to + // the next party slot. + partyIndex++; + } + } + +} + +u32 CountBattleTowerBanlistCaught(void) +{ + s32 i; + u32 numCaught = 0; + + for (i = 0; gBattleTowerBannedSpecies[i] != 0xFFFF; i++) + { + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleTowerBannedSpecies[i]), FLAG_GET_CAUGHT)) + { + numCaught++; + } + } + + return numCaught; +} + +u8 AppendBattleTowerBannedSpeciesName(u16 species, u8 curIndexToAppend, s32 numToAppend) +{ + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)) + { + curIndexToAppend++; + + switch (curIndexToAppend - 1) + { + case 0: + case 2: + case 4: + case 6: + case 8: + case 10: + if (numToAppend == curIndexToAppend) + { + StringAppend(gStringVar1, gUnknown_08400E23); + } + else if (numToAppend > curIndexToAppend) + { + StringAppend(gStringVar1, gUnknown_08400E29); + } + break; + case 1: + if (curIndexToAppend == numToAppend) + { + StringAppend(gStringVar1, gUnknown_08400E23); + } + else + { + StringAppend(gStringVar1, gUnknown_08400E29); + } + + StringAppend(gStringVar1, gUnknown_08400E30); + break; + case 3: + case 5: + case 7: + case 9: + default: + if (curIndexToAppend == numToAppend) + { + StringAppend(gStringVar1, gUnknown_08400E23); + } + else + { + StringAppend(gStringVar1, gUnknown_08400E29); + } + + StringAppend(gStringVar1, gUnknown_08400E2E); + break; + } + + StringAppend(gStringVar1, gSpeciesNames[species]); + } + + return curIndexToAppend; +} + +void CheckMonBattleTowerBanlist(u16 species, u16 heldItem, u16 hp, u8 battleTowerLevelType, u8 monLevel, u16 *validPartySpecies, u16 *validPartyHeldItems, u8 *numValid) +{ + s32 i; + u32 counter = 0; + + if (species == SPECIES_EGG || species == SPECIES_NONE) + return; + + while (1) + { + if (gBattleTowerBannedSpecies[counter] == 0xFFFF) + goto EXIT2; // Couldn't get the code to match without this GOTO + + if (gBattleTowerBannedSpecies[counter] == species) + break; + + counter++; + } + + if (gBattleTowerBannedSpecies[counter] != 0xFFFF) + return; + + EXIT2: + if (battleTowerLevelType == 0 && monLevel > 50) + return; + + for (i = 0; i < *numValid && validPartySpecies[i] != species ; i++); + if (i != *numValid) + return; + + if (heldItem != 0) + { + for (i = 0; i < *numValid && validPartyHeldItems[i] != heldItem ; i++); + if (i != *numValid) + return; + } + + validPartySpecies[*numValid] = species; + validPartyHeldItems[*numValid] = heldItem; + *numValid = *numValid + 1; +} + +void CheckPartyBattleTowerBanlist(void) +{ + s32 i; + u16 species2; + u16 heldItem; + u8 level; + u16 hp; + u32 numBanlistCaught; + u16 validPartySpecies[6]; + u16 validPartyHeldItems[6]; + u8 counter; + + counter = 0; + + for (i = 0; i < PARTY_SIZE; i++) + { + species2 = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); + heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); + level = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL); + hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); + + CheckMonBattleTowerBanlist(species2, heldItem, hp, gScriptResult, level, validPartySpecies, validPartyHeldItems, &counter); + } + + if (counter < 3) + { + gStringVar1[0] = 0xFF; + gSpecialVar_0x8004 = 1; + counter = 0; + + numBanlistCaught = CountBattleTowerBanlistCaught(); + + for (i = 0; gBattleTowerBannedSpecies[i] != 0xFFFF; i++) + { + counter = AppendBattleTowerBannedSpeciesName(gBattleTowerBannedSpecies[i], counter, numBanlistCaught); + } + + if (counter == 0) + { + StringAppend(gStringVar1, gUnknown_08400E2C); + StringAppend(gStringVar1, gUnknown_08400E32); + return; + } + + if (1 & counter) + StringAppend(gStringVar1, gUnknown_08400E2E); + else + StringAppend(gStringVar1, gUnknown_08400E2C); + + StringAppend(gStringVar1, gUnknown_08400E36); + } + else + { + gSpecialVar_0x8004 = 0; + gSaveBlock2.battleTower.battleTowerLevelType = gScriptResult; + } +} + +void PrintBattleTowerTrainerMessage(u16 *easyChat) +{ + sub_80EB544(gStringVar4, easyChat, 2, 3); +} + +void PrintBattleTowerTrainerGreeting(void) +{ + if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) + { + PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.greeting.easyChat); + } + else if (gSaveBlock2.battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) + { + PrintBattleTowerTrainerMessage((u16 *)gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].greeting.easyChat); + } + else + { + PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].greeting.easyChat); + } +} + +void sub_81354CC(void) +{ + s32 i; + u16 heldItem; + + switch (gSpecialVar_0x8004) + { + case 0: + break; + case 1: + for (i = 0; i < PARTY_SIZE; i++) + { + heldItem = GetMonData(&gSaveBlock1.playerParty[i], MON_DATA_HELD_ITEM); + SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &heldItem); + } + break; + case 2: + PrintEReaderTrainerFarewellMessage(); + break; + } + + SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); +} + +void sub_8135534(u8 taskId) +{ + if (IsBattleTransitionDone() == TRUE) + { + gMain.savedCallback = sub_81354CC; + SetMainCallback2(sub_800E7C4); + DestroyTask(taskId); + } +} + +void sub_813556C(void) +{ + s32 i; + u16 heldItem; + u8 transition; + + switch (gSpecialVar_0x8004) + { + case 0: + gBattleTypeFlags = (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_TRAINER); + gTrainerBattleOpponent = 0; + + FillBattleTowerTrainerParty(); + + CreateTask(sub_8135534, 1); + current_map_music_set__default_for_battle(0); + transition = BattleSetup_GetBattleTowerBattleTransition(); + BattleTransition_StartOnField(transition); + break; + case 1: + for (i = 0; i < PARTY_SIZE; i++) + { + heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); + SetMonData(&gSaveBlock1.playerParty[i], MON_DATA_HELD_ITEM, &heldItem); + } + + CreateTask(sub_8135534, 1); + current_map_music_set__default_for_battle(0); + transition = BattleSetup_GetBattleTowerBattleTransition(); + BattleTransition_StartOnField(transition); + break; + case 2: + ZeroEnemyPartyMons(); + + for (i = 0; i < 3; i++) + { + sub_803ADE8(&gEnemyParty[i], &gSaveBlock2.battleTower.ereaderTrainer.party[i]); + } + + gBattleTypeFlags = (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_TRAINER); + gTrainerBattleOpponent = 0; + + CreateTask(sub_8135534, 1); + current_map_music_set__default_for_battle(0); + transition = BattleSetup_GetBattleTowerBattleTransition(); + BattleTransition_StartOnField(transition); + break; + } +} + +void sub_8135668(void) +{ + s32 i; + u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; + + switch (gSpecialVar_0x8004) + { + case 0: + ewram160FB = gSaveBlock2.battleTower.var_4AE[battleTowerLevelType]; + gSaveBlock2.battleTower.var_4AE[battleTowerLevelType] = gSpecialVar_0x8005; + break; + case 1: + gSaveBlock2.battleTower.battleTowerLevelType = gSpecialVar_0x8005; + break; + case 2: + gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType] = gSpecialVar_0x8005; + break; + case 3: + gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType] = gSpecialVar_0x8005; + break; + case 4: + gSaveBlock2.battleTower.battleTowerTrainerId = gSpecialVar_0x8005; + break; + case 5: + for (i = 0; i < 3; i++) + { + gSaveBlock2.battleTower.selectedPartyMons[i] = gSelectedOrderFromParty[i]; + } + break; + case 6: + if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) + { + ClearEReaderTrainer(&gSaveBlock2.battleTower.ereaderTrainer); + } + + if (gSaveBlock2.battleTower.totalBattleTowerWins < 9999) + { + gSaveBlock2.battleTower.totalBattleTowerWins++; + } + + gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType]++; + sub_8135A3C(); + gScriptResult = gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType]; + + gStringVar1[0] = gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType] + 0xA1; + gStringVar1[1] = 0xFF; + break; + case 7: + if (gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType] < 1430) + { + gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType]++; + } + + sub_8135A3C(); + gScriptResult = gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType]; + break; + case 8: + gSaveBlock2.battleTower.unk_554 = gSpecialVar_0x8005; + break; + case 9: + break; + case 10: + SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, gSaveBlock2.battleTower.bestBattleTowerWinStreak); + break; + case 11: + if (gSaveBlock2.battleTower.var_4AE[battleTowerLevelType] != 3) + { + ResetBattleTowerStreak(battleTowerLevelType); + } + break; + case 12: + gSaveBlock2.battleTower.var_4AE[battleTowerLevelType] = ewram160FB; + break; + case 13: + gSaveBlock2.battleTower.currentWinStreaks[battleTowerLevelType] = GetCurrentBattleTowerWinStreak(battleTowerLevelType); + break; + case 14: + gSaveBlock2.battleTower.lastStreakLevelType = gSaveBlock2.battleTower.battleTowerLevelType; + break; + } +} + +void sub_81358A4(void) +{ + u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; + + switch (gSpecialVar_0x8004) + { + case 0: + gScriptResult = gSaveBlock2.battleTower.var_4AE[battleTowerLevelType]; + break; + case 1: + gScriptResult = gSaveBlock2.battleTower.battleTowerLevelType; + break; + case 2: + gScriptResult = gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType]; + break; + case 3: + gScriptResult = gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType]; + break; + case 4: + gScriptResult = gSaveBlock2.battleTower.battleTowerTrainerId; + break; + case 5: + case 6: + case 7: + break; + case 8: + gScriptResult = gSaveBlock2.battleTower.unk_554; + break; + case 9: + gScriptResult = GetCurrentBattleTowerWinStreak(battleTowerLevelType); + break; + case 10: + SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, gSaveBlock2.battleTower.bestBattleTowerWinStreak); + break; + case 11: + ResetBattleTowerStreak(battleTowerLevelType); + break; + case 12: + gSaveBlock2.battleTower.var_4AE[battleTowerLevelType] = ewram160FB; + break; + case 13: + gSaveBlock2.battleTower.currentWinStreaks[battleTowerLevelType] = GetCurrentBattleTowerWinStreak(battleTowerLevelType); + break; + case 14: + gSaveBlock2.battleTower.lastStreakLevelType = gSaveBlock2.battleTower.battleTowerLevelType; + break; + } +} + +void sub_8135A14(void) +{ + s32 i; + + for (i = 0; i < 3; i++) + { + gSelectedOrderFromParty[i] = gSaveBlock2.battleTower.selectedPartyMons[i]; + } + + ReducePlayerPartyToThree(); +} + +#ifdef NONMATCHING +void sub_8135A3C(void) +{ + u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; + u16 winStreak = GetCurrentBattleTowerWinStreak(battleTowerLevelType); + + if (gSaveBlock2.battleTower.recordWinStreaks[battleTowerLevelType] < winStreak) + { + gSaveBlock2.battleTower.recordWinStreaks[battleTowerLevelType] = winStreak; + } + + if (gSaveBlock2.battleTower.recordWinStreaks[0] > gSaveBlock2.battleTower.recordWinStreaks[1]) + { + u16 streak = gSaveBlock2.battleTower.recordWinStreaks[0]; + SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, streak); + if (streak > 9999) + { + gSaveBlock2.battleTower.bestBattleTowerWinStreak = 9999; + } + else + { + gSaveBlock2.battleTower.bestBattleTowerWinStreak = streak; + } + } + else + { + u16 streak = gSaveBlock2.battleTower.recordWinStreaks[1]; + SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, streak); + if (streak > 9999) + { + gSaveBlock2.battleTower.bestBattleTowerWinStreak = 9999; + } + else + { + gSaveBlock2.battleTower.bestBattleTowerWinStreak = streak; + } + } +} +#else +__attribute__((naked)) +void sub_8135A3C(void) +{ + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + ldr r6, _08135A84 @ =gSaveBlock2\n\ + ldr r1, _08135A88 @ =0x00000554\n\ + adds r0, r6, r1\n\ + ldrb r4, [r0]\n\ + lsls r4, 31\n\ + lsrs r4, 31\n\ + adds r0, r4, 0\n\ + bl GetCurrentBattleTowerWinStreak\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + lsls r4, 1\n\ + movs r3, 0xAC\n\ + lsls r3, 3\n\ + adds r2, r6, r3\n\ + adds r4, r2\n\ + ldrh r0, [r4]\n\ + cmp r0, r5\n\ + bcs _08135A66\n\ + strh r5, [r4]\n\ +_08135A66:\n\ + ldr r0, _08135A8C @ =0x00000562\n\ + adds r1, r6, r0\n\ + ldrh r0, [r2]\n\ + ldrh r3, [r1]\n\ + cmp r0, r3\n\ + bls _08135A94\n\ + adds r5, r0, 0\n\ + movs r0, 0x20\n\ + adds r1, r5, 0\n\ + bl SetGameStat\n\ + ldr r1, _08135A90 @ =0x0000270f\n\ + cmp r5, r1\n\ + bhi _08135AA4\n\ + b _08135AB4\n\ + .align 2, 0\n\ +_08135A84: .4byte gSaveBlock2\n\ +_08135A88: .4byte 0x00000554\n\ +_08135A8C: .4byte 0x00000562\n\ +_08135A90: .4byte 0x0000270f\n\ +_08135A94:\n\ + ldrh r5, [r1]\n\ + movs r0, 0x20\n\ + adds r1, r5, 0\n\ + bl SetGameStat\n\ + ldr r1, _08135AAC @ =0x0000270f\n\ + cmp r5, r1\n\ + bls _08135AB4\n\ +_08135AA4:\n\ + ldr r2, _08135AB0 @ =0x00000572\n\ + adds r0, r6, r2\n\ + strh r1, [r0]\n\ + b _08135ABA\n\ + .align 2, 0\n\ +_08135AAC: .4byte 0x0000270f\n\ +_08135AB0: .4byte 0x00000572\n\ +_08135AB4:\n\ + ldr r3, _08135AC0 @ =0x00000572\n\ + adds r0, r6, r3\n\ + strh r5, [r0]\n\ +_08135ABA:\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_08135AC0: .4byte 0x00000572\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +void sub_8135AC4(void) +{ + s32 i; + u8 trainerClass; + struct BattleTowerRecord *playerRecord = &gSaveBlock2.battleTower.playerRecord; + u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; + + if (gSaveBlock2.playerGender != MALE) + { + trainerClass = sFemaleTrainerClasses[(gSaveBlock2.playerTrainerId[0] + gSaveBlock2.playerTrainerId[1] + + gSaveBlock2.playerTrainerId[2] + gSaveBlock2.playerTrainerId[3]) % 20u]; + } + else + { + trainerClass = sMaleTrainerClasses[(gSaveBlock2.playerTrainerId[0] + gSaveBlock2.playerTrainerId[1] + + gSaveBlock2.playerTrainerId[2] + gSaveBlock2.playerTrainerId[3]) % 30u]; + } + + playerRecord->battleTowerLevelType = battleTowerLevelType; + playerRecord->trainerClass = trainerClass; + + copy_word_to_mem(playerRecord->trainerId, gSaveBlock2.playerTrainerId); + StringCopy8(playerRecord->name, gSaveBlock2.playerName); + + playerRecord->winStreak = GetCurrentBattleTowerWinStreak(battleTowerLevelType); + + for (i = 0; i < 6; i++) + { + playerRecord->greeting.easyChat[i] = gSaveBlock1.easyChats.unk2B28[i]; + } + + for (i = 0; i < 3; i++) + { + sub_803AF78(&gUnknown_030042FC[gSaveBlock2.battleTower.selectedPartyMons[i]], &playerRecord->party[i]); + } + + SetBattleTowerRecordChecksum(&gSaveBlock2.battleTower.playerRecord); + sub_8135A3C(); +} + +void sub_8135BA0(void) +{ + u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; + + if (gSpecialVar_0x8004 == 3 || gSpecialVar_0x8004 == 0) + { + if (gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType] > 1 + || gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType] > 1) + { + sub_8135AC4(); + } + } + + sub_8135CFC(); + + gSaveBlock2.battleTower.battleOutcome = gBattleOutcome; + + if (gSpecialVar_0x8004 != 3) + { + gSaveBlock2.battleTower.var_4AE[battleTowerLevelType] = gSpecialVar_0x8004; + } + + VarSet(VAR_0x4000, 0); + gSaveBlock2.battleTower.unk_554 = 1; + TrySavingData(EREADER_SAVE); +} + +void BattleTower_SoftReset(void) +{ + DoSoftReset(); +} + +void ValidateBattleTowerRecordChecksums(void) +{ + u32 i; + s32 recordIndex; + struct BattleTowerRecord *record; + u32 checksum; + + checksum = 0; + for (i = 0; i < (sizeof(struct BattleTowerRecord) / sizeof(u32)) - 1; i++) + { + checksum += ((u32 *)&gSaveBlock2.battleTower.playerRecord)[i]; + } + + if (gSaveBlock2.battleTower.playerRecord.checksum != checksum) + { + ClearBattleTowerRecord(&gSaveBlock2.battleTower.playerRecord); + } + + for (recordIndex = 0; recordIndex < 5; recordIndex++) + { + record = &gSaveBlock2.battleTower.records[recordIndex]; + checksum = 0; + for (i = 0; i < (sizeof(struct BattleTowerRecord) / sizeof(u32)) - 1; i++) + { + checksum += ((u32 *)record)[i]; + } + + if (gSaveBlock2.battleTower.records[recordIndex].checksum != checksum) + { + ClearBattleTowerRecord(&gSaveBlock2.battleTower.records[recordIndex]); + } + } +} + +void SetBattleTowerRecordChecksum(struct BattleTowerRecord *record) +{ + u32 i; + + record->checksum = 0; + for (i = 0; i < (sizeof(struct BattleTowerRecord) / sizeof(u32)) - 1; i++) + { + record->checksum += ((u32 *)record)[i]; + } +} + +void ClearBattleTowerRecord(struct BattleTowerRecord *record) +{ + u32 i; + + for (i = 0; i < sizeof(struct BattleTowerRecord) / sizeof(u32); i++) + { + ((u32 *)record)[i] = 0; + } +} + +void sub_8135CFC(void) +{ + s32 i; + + get_trainer_name(gSaveBlock2.battleTower.defeatedByTrainerName); + gSaveBlock2.battleTower.defeatedBySpecies = gBattleMons[1].species; + gSaveBlock2.battleTower.firstMonSpecies = gBattleMons[0].species; + + for (i = 0; i < POKEMON_NAME_LENGTH; i++) + { + gSaveBlock2.battleTower.firstMonNickname[i] = gBattleMons[0].nickname[i]; + } +} + +u16 GetCurrentBattleTowerWinStreak(u8 battleTowerLevelType) +{ + u16 winStreak = ((gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType] - 1) * 7 - 1) + + gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType]; + + if (winStreak > 9999) + { + return 9999; + } + + return winStreak; +} + +#ifdef NONMATCHING +void DetermineBattleTowerPrize(void) +{ + u16 prizeItem; + struct SaveBlock2 *saveBlock = &gSaveBlock2; + u8 battleTowerLevelType = saveBlock->battleTower.battleTowerLevelType; + + if (saveBlock->battleTower.curStreakChallengesNum[battleTowerLevelType] - 1 > 5) + { + prizeItem = sLongStreakPrizes[Random() % ARRAY_COUNT(sLongStreakPrizes)]; + } + else + { + prizeItem = sShortStreakPrizes[Random() % ARRAY_COUNT(sShortStreakPrizes)]; + } + + saveBlock->battleTower.prizeItem = prizeItem; +} +#else +__attribute__((naked)) +void DetermineBattleTowerPrize(void) +{ + asm(".syntax unified\n\ + push {r4,r5,lr}\n\ + ldr r5, _08135DB0 @ =gSaveBlock2\n\ + ldr r1, _08135DB4 @ =0x00000554\n\ + adds r0, r5, r1\n\ + ldrb r0, [r0]\n\ + lsls r0, 31\n\ + lsrs r0, 31\n\ + lsls r0, 1\n\ + ldr r2, _08135DB8 @ =0x0000055c\n\ + adds r1, r5, r2\n\ + adds r0, r1\n\ + ldrh r0, [r0]\n\ + subs r0, 0x1\n\ + cmp r0, 0x5\n\ + ble _08135DC0\n\ + bl Random\n\ + ldr r4, _08135DBC @ =sLongStreakPrizes\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + movs r1, 0x9\n\ + b _08135DCC\n\ + .align 2, 0\n\ +_08135DB0: .4byte gSaveBlock2\n\ +_08135DB4: .4byte 0x00000554\n\ +_08135DB8: .4byte 0x0000055c\n\ +_08135DBC: .4byte sLongStreakPrizes\n\ +_08135DC0:\n\ + bl Random\n\ + ldr r4, _08135DE8 @ =sShortStreakPrizes\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + movs r1, 0x6\n\ +_08135DCC:\n\ + bl __umodsi3\n\ + lsls r0, 16\n\ + lsrs r0, 15\n\ + adds r0, r4\n\ + ldrh r1, [r0]\n\ + movs r2, 0xAD\n\ + lsls r2, 3\n\ + adds r0, r5, r2\n\ + strh r1, [r0]\n\ + pop {r4,r5}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_08135DE8: .4byte sShortStreakPrizes\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +void GiveBattleTowerPrize(void) +{ + u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; + + if (AddBagItem(gSaveBlock2.battleTower.prizeItem, 1) == TRUE) + { + CopyItemName(gSaveBlock2.battleTower.prizeItem, gStringVar1); + gScriptResult = 1; + } + else + { + gScriptResult = 0; + gSaveBlock2.battleTower.var_4AE[battleTowerLevelType] = 6; + } +} + +void AwardBattleTowerRibbons(void) +{ + s32 i; + u32 partyIndex; + struct Pokemon *pokemon; + u8 ribbonType; + u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; + + ribbonType = MON_DATA_WINNING_RIBBON; + if (battleTowerLevelType != 0) + { + ribbonType = MON_DATA_VICTORY_RIBBON; + } + + gScriptResult = 0; + + if (GetCurrentBattleTowerWinStreak(battleTowerLevelType) > 55) + { + for (i = 0; i < 3; i++) + { + partyIndex = gSaveBlock2.battleTower.selectedPartyMons[i] - 1; + pokemon = &gPlayerParty[partyIndex]; + if (!GetMonData(pokemon, ribbonType)) + { + gScriptResult = 1; + SetMonData(pokemon, ribbonType, &gScriptResult); + } + } + } + + if (gScriptResult != 0) + { + IncrementGameStat(GAME_STAT_RECEIVED_RIBBONS); + } +} + +// This is a leftover debugging function that is used to populate the E-Reader +// trainer with the player's current data. +void Debug_FillEReaderTrainerWithPlayerData(void) +{ + struct BattleTowerEReaderTrainer *ereaderTrainer; + s32 i; + s32 j; + + ereaderTrainer = &gSaveBlock2.battleTower.ereaderTrainer; + + if (gSaveBlock2.playerGender != MALE) + { + ereaderTrainer->trainerClass = sFemaleTrainerClasses[(gSaveBlock2.playerTrainerId[0] + gSaveBlock2.playerTrainerId[1] + + gSaveBlock2.playerTrainerId[2] + gSaveBlock2.playerTrainerId[3]) % 20u]; + } + else + { + ereaderTrainer->trainerClass = sMaleTrainerClasses[(gSaveBlock2.playerTrainerId[0] + gSaveBlock2.playerTrainerId[1] + + gSaveBlock2.playerTrainerId[2] + gSaveBlock2.playerTrainerId[3]) % 30u]; + } + + copy_word_to_mem(ereaderTrainer->trainerId, gSaveBlock2.playerTrainerId); + StringCopy8(ereaderTrainer->name, gSaveBlock2.playerName); + + ereaderTrainer->winStreak = 1; + + j = 7; + for (i = 0; i < 6; i++) + { + ereaderTrainer->greeting.easyChat[i] = gSaveBlock1.easyChats.unk2B28[i]; + ereaderTrainer->farewellPlayerLost.easyChat[i] = j; + ereaderTrainer->farewellPlayerWon.easyChat[i] = j + 6; + j++; + } + + for (i = 0; i < 3; i++) + { + sub_803AF78(&gPlayerParty[i], &ereaderTrainer->party[i]); + } + + SetEReaderTrainerChecksum(ereaderTrainer); +} + +u8 GetEReaderTrainerPicIndex(void) +{ + return gTrainerClassToPicIndex[gSaveBlock2.battleTower.ereaderTrainer.trainerClass]; +} + +u8 GetEReaderTrainerClassNameIndex(void) +{ + return gTrainerClassToNameIndex[gSaveBlock2.battleTower.ereaderTrainer.trainerClass]; +} + +void SetEReaderTrainerName(u8 *trainerName) +{ + s32 i; + + for (i = 0; i < 7; i++) + { + trainerName[i] = gSaveBlock2.battleTower.ereaderTrainer.name[i]; + } + + trainerName[i] = 0xFF; +} + +// Checks if the saved E-Reader trainer is valid. +void ValidateEReaderTrainer(void) +{ + u32 i; + u32 checksum; + struct BattleTowerEReaderTrainer *ereaderTrainer; + + gScriptResult = 0; + ereaderTrainer = &gSaveBlock2.battleTower.ereaderTrainer; + + checksum = 0; + for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32) - 1; i++) + { + checksum |= ((u32 *)ereaderTrainer)[i]; + } + + if (checksum == 0) + { + gScriptResult = 1; + return; + } + + checksum = 0; + for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32) - 1; i++) + { + checksum += ((u32 *)ereaderTrainer)[i]; + } + + if (gSaveBlock2.battleTower.ereaderTrainer.checksum != checksum) + { + ClearEReaderTrainer(&gSaveBlock2.battleTower.ereaderTrainer); + gScriptResult = 1; + } +} + +void SetEReaderTrainerChecksum(struct BattleTowerEReaderTrainer *ereaderTrainer) +{ + s32 i; + + ereaderTrainer->checksum = 0; + for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32) - 1; i++) + { + ereaderTrainer->checksum += ((u32 *)ereaderTrainer)[i]; + } +} + +void ClearEReaderTrainer(struct BattleTowerEReaderTrainer *ereaderTrainer) +{ + u32 i; + + for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32); i++) + { + ((u32 *)ereaderTrainer)[i] = 0; + } +} + +void PrintEReaderTrainerGreeting(void) +{ + PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.greeting.easyChat); +} + +void PrintEReaderTrainerFarewellMessage(void) +{ + if (gBattleOutcome == BATTLE_DREW) + { + gStringVar4[0] = 0xFF; + } + else if (gBattleOutcome == BATTLE_WON) + { + PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.farewellPlayerWon.easyChat); + } + else + { + PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.farewellPlayerLost.easyChat); + } +} + +void sub_813610C(void) +{ + s32 i; + + for (i = 0; i < 2; i++) + { + if (gSaveBlock2.battleTower.var_4AE[i] == 1) + { + sub_80BFD20(); + } + } +} + +#if GERMAN +u8 de_sub_81364AC(void) +{ + if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) + { + return gSaveBlock2.battleTower.ereaderTrainer.trainerClass; + } + else if (gSaveBlock2.battleTower.battleTowerTrainerId >= BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) + { + return gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].trainerClass; + } + else + { + return gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].trainerClass; + } +} + +u8 de_sub_81364F8(void) +{ + return gSaveBlock2.battleTower.ereaderTrainer.trainerClass; +} +#endif diff --git a/src/berry.c b/src/field/berry.c index d82eab2a6..cd1fc5c94 100644 --- a/src/berry.c +++ b/src/field/berry.c @@ -12,10 +12,16 @@ #include "text.h" #define BERRY_NAME_LENGTH 6 +#define BERRY_REGROW_LIMIT 10 +#define MAX_BERRY_TREES 128 +#define BERRY_NONE 0 #define FIRST_BERRY ITEM_CHERI_BERRY #define LAST_BERRY ITEM_ENIGMA_BERRY +#define GETBERRYID(berry) ((berry - FIRST_BERRY) + 1) +#define GETITEMID(berry) ((berry + FIRST_BERRY) - 1) + #ifdef ENGLISH #define NAME_CHERI_BERRY _("CHERI") #define NAME_CHESTO_BERRY _("CHESTO") @@ -61,92 +67,92 @@ #define NAME_STARF_BERRY _("STARF") #define NAME_ENIGMA_BERRY _("ENIGMA") -const u8 gBerryDescriptionPart1_Cheri[] = _("Blooms with delicate pretty flowers."); -const u8 gBerryDescriptionPart2_Cheri[] = _("The bright red BERRY is very spicy."); -const u8 gBerryDescriptionPart1_Chesto[] = _("The BERRY’s thick skin and fruit are"); -const u8 gBerryDescriptionPart2_Chesto[] = _("very tough. It is dry-tasting all over."); -const u8 gBerryDescriptionPart1_Pecha[] = _("Very sweet and delicious."); -const u8 gBerryDescriptionPart2_Pecha[] = _("Also very tender - handle with care."); -const u8 gBerryDescriptionPart1_Rawst[] = _("If the leaves grow long and curly,"); -const u8 gBerryDescriptionPart2_Rawst[] = _("the BERRY seems to grow very bitter."); -const u8 gBerryDescriptionPart1_Aspear[] = _("The hard BERRY is dense with a rich"); -const u8 gBerryDescriptionPart2_Aspear[] = _("juice. It is quite sour."); -const u8 gBerryDescriptionPart1_Leppa[] = _("Grows slower than CHERI and others."); -const u8 gBerryDescriptionPart2_Leppa[] = _("The smaller the BERRY, the tastier."); -const u8 gBerryDescriptionPart1_Oran[] = _("A peculiar BERRY with a mix of flavors."); -const u8 gBerryDescriptionPart2_Oran[] = _("BERRIES grow in half a day."); -const u8 gBerryDescriptionPart1_Persim[] = _("Loves sunlight. The BERRY’s color"); -const u8 gBerryDescriptionPart2_Persim[] = _("grows vivid when exposed to the sun."); -const u8 gBerryDescriptionPart1_Lum[] = _("Slow to grow. If raised with loving"); -const u8 gBerryDescriptionPart2_Lum[] = _("care, it may grow two BERRIES."); -const u8 gBerryDescriptionPart1_Sitrus[] = _("Closely related to ORAN. The large"); -const u8 gBerryDescriptionPart2_Sitrus[] = _("BERRY has a well-rounded flavor."); -const u8 gBerryDescriptionPart1_Figy[] = _("The BERRY, which looks chewed up,"); -const u8 gBerryDescriptionPart2_Figy[] = _("brims with spicy substances."); -const u8 gBerryDescriptionPart1_Wiki[] = _("The BERRY is said to have grown lumpy"); -const u8 gBerryDescriptionPart2_Wiki[] = _("to help POKéMON grip it."); -const u8 gBerryDescriptionPart1_Mago[] = _("The BERRY turns curvy as it grows."); -const u8 gBerryDescriptionPart2_Mago[] = _("The curvier, the sweeter and tastier."); -const u8 gBerryDescriptionPart1_Aguav[] = _("The flower is dainty. It is rare in its"); -const u8 gBerryDescriptionPart2_Aguav[] = _("ability to grow without light."); -const u8 gBerryDescriptionPart1_Iapapa[] = _("The BERRY is very big and sour."); -const u8 gBerryDescriptionPart2_Iapapa[] = _("It takes at least a day to grow."); -const u8 gBerryDescriptionPart1_Razz[] = _("The red BERRY tastes slightly spicy."); -const u8 gBerryDescriptionPart2_Razz[] = _("It grows quickly in just four hours."); -const u8 gBerryDescriptionPart1_Bluk[] = _("The BERRY is blue on the outside, but"); -const u8 gBerryDescriptionPart2_Bluk[] = _("it blackens the mouth when eaten."); -const u8 gBerryDescriptionPart1_Nanab[] = _("This BERRY was the seventh"); -const u8 gBerryDescriptionPart2_Nanab[] = _("discovered in the world. It is sweet."); -const u8 gBerryDescriptionPart1_Wepear[] = _("The flower is small and white. It has a"); -const u8 gBerryDescriptionPart2_Wepear[] = _("delicate balance of bitter and sour."); -const u8 gBerryDescriptionPart1_Pinap[] = _("Weak against wind and cold."); -const u8 gBerryDescriptionPart2_Pinap[] = _("The fruit is spicy and the skin, sour."); -const u8 gBerryDescriptionPart1_Pomeg[] = _("However much it is watered,"); -const u8 gBerryDescriptionPart2_Pomeg[] = _("it only grows up to six BERRIES."); -const u8 gBerryDescriptionPart1_Kelpsy[] = _("A rare variety shaped like a root."); -const u8 gBerryDescriptionPart2_Kelpsy[] = _("Grows a very large flower."); -const u8 gBerryDescriptionPart1_Qualot[] = _("Loves water. Grows strong even in"); -const u8 gBerryDescriptionPart2_Qualot[] = _("locations with constant rainfall."); -const u8 gBerryDescriptionPart1_Hondew[] = _("A BERRY that is very valuable and"); -const u8 gBerryDescriptionPart2_Hondew[] = _("rarely seen. It is very delicious."); -const u8 gBerryDescriptionPart1_Grepa[] = _("Despite its tenderness and round"); -const u8 gBerryDescriptionPart2_Grepa[] = _("shape, the BERRY is unimaginably sour."); -const u8 gBerryDescriptionPart1_Tamato[] = _("The BERRY is lip-bendingly spicy."); -const u8 gBerryDescriptionPart2_Tamato[] = _("It takes time to grow."); -const u8 gBerryDescriptionPart1_Cornn[] = _("A BERRY from an ancient era. May not"); -const u8 gBerryDescriptionPart2_Cornn[] = _("grow unless planted in quantity."); -const u8 gBerryDescriptionPart1_Magost[] = _("A BERRY that is widely said to have"); -const u8 gBerryDescriptionPart2_Magost[] = _("a finely balanced flavor."); -const u8 gBerryDescriptionPart1_Rabuta[] = _("A rare variety that is overgrown with"); -const u8 gBerryDescriptionPart2_Rabuta[] = _("hair. It is quite bitter."); -const u8 gBerryDescriptionPart1_Nomel[] = _("Quite sour. Just one bite makes it"); -const u8 gBerryDescriptionPart2_Nomel[] = _("impossible to taste for three days."); -const u8 gBerryDescriptionPart1_Spelon[] = _("The vividly red BERRY is very spicy."); -const u8 gBerryDescriptionPart2_Spelon[] = _("Its warts secrete a spicy substance."); -const u8 gBerryDescriptionPart1_Pamtre[] = _("Drifts on the sea from somewhere."); -const u8 gBerryDescriptionPart2_Pamtre[] = _("It is thought to grow elsewhere."); -const u8 gBerryDescriptionPart1_Watmel[] = _("A huge BERRY, with some over 20"); -const u8 gBerryDescriptionPart2_Watmel[] = _("inches discovered. Exceedingly sweet."); -const u8 gBerryDescriptionPart1_Durin[] = _("Bitter to even look at. It is so"); -const u8 gBerryDescriptionPart2_Durin[] = _("bitter, no one has ever eaten it as is."); -const u8 gBerryDescriptionPart1_Belue[] = _("It is glossy and looks delicious, but"); -const u8 gBerryDescriptionPart2_Belue[] = _("it is awfully sour. Takes time to grow."); -const u8 gBerryDescriptionPart1_Liechi[] = _("A mysterious BERRY. It is rumored to"); -const u8 gBerryDescriptionPart2_Liechi[] = _("contain the power of the sea."); -const u8 gBerryDescriptionPart1_Ganlon[] = _("A mysterious BERRY. It is rumored to"); -const u8 gBerryDescriptionPart2_Ganlon[] = _("contain the power of the land."); -const u8 gBerryDescriptionPart1_Salac[] = _("A mysterious BERRY. It is rumored to"); -const u8 gBerryDescriptionPart2_Salac[] = _("contain the power of the sky."); -const u8 gBerryDescriptionPart1_Petaya[] = _("A mysterious BERRY. It is rumored to"); -const u8 gBerryDescriptionPart2_Petaya[] = _("contain the power of all living things."); -const u8 gBerryDescriptionPart1_Apicot[] = _("A very mystifying BERRY. No telling"); -const u8 gBerryDescriptionPart2_Apicot[] = _("what may happen or how it can be used."); -const u8 gBerryDescriptionPart1_Lansat[] = _("Said to be a legendary BERRY."); -const u8 gBerryDescriptionPart2_Lansat[] = _("Holding it supposedly brings joy."); -const u8 gBerryDescriptionPart1_Starf[] = _("So strong, it was abandoned at the"); -const u8 gBerryDescriptionPart2_Starf[] = _("world’s edge. Considered a mirage."); -const u8 gBerryDescriptionPart1_Enigma[] = _("A completely enigmatic BERRY."); -const u8 gBerryDescriptionPart2_Enigma[] = _("Appears to have the power of stars."); +static const u8 gBerryDescriptionPart1_Cheri[] = _("Blooms with delicate pretty flowers."); +static const u8 gBerryDescriptionPart2_Cheri[] = _("The bright red BERRY is very spicy."); +static const u8 gBerryDescriptionPart1_Chesto[] = _("The BERRY’s thick skin and fruit are"); +static const u8 gBerryDescriptionPart2_Chesto[] = _("very tough. It is dry-tasting all over."); +static const u8 gBerryDescriptionPart1_Pecha[] = _("Very sweet and delicious."); +static const u8 gBerryDescriptionPart2_Pecha[] = _("Also very tender - handle with care."); +static const u8 gBerryDescriptionPart1_Rawst[] = _("If the leaves grow long and curly,"); +static const u8 gBerryDescriptionPart2_Rawst[] = _("the BERRY seems to grow very bitter."); +static const u8 gBerryDescriptionPart1_Aspear[] = _("The hard BERRY is dense with a rich"); +static const u8 gBerryDescriptionPart2_Aspear[] = _("juice. It is quite sour."); +static const u8 gBerryDescriptionPart1_Leppa[] = _("Grows slower than CHERI and others."); +static const u8 gBerryDescriptionPart2_Leppa[] = _("The smaller the BERRY, the tastier."); +static const u8 gBerryDescriptionPart1_Oran[] = _("A peculiar BERRY with a mix of flavors."); +static const u8 gBerryDescriptionPart2_Oran[] = _("BERRIES grow in half a day."); +static const u8 gBerryDescriptionPart1_Persim[] = _("Loves sunlight. The BERRY’s color"); +static const u8 gBerryDescriptionPart2_Persim[] = _("grows vivid when exposed to the sun."); +static const u8 gBerryDescriptionPart1_Lum[] = _("Slow to grow. If raised with loving"); +static const u8 gBerryDescriptionPart2_Lum[] = _("care, it may grow two BERRIES."); +static const u8 gBerryDescriptionPart1_Sitrus[] = _("Closely related to ORAN. The large"); +static const u8 gBerryDescriptionPart2_Sitrus[] = _("BERRY has a well-rounded flavor."); +static const u8 gBerryDescriptionPart1_Figy[] = _("The BERRY, which looks chewed up,"); +static const u8 gBerryDescriptionPart2_Figy[] = _("brims with spicy substances."); +static const u8 gBerryDescriptionPart1_Wiki[] = _("The BERRY is said to have grown lumpy"); +static const u8 gBerryDescriptionPart2_Wiki[] = _("to help POKéMON grip it."); +static const u8 gBerryDescriptionPart1_Mago[] = _("The BERRY turns curvy as it grows."); +static const u8 gBerryDescriptionPart2_Mago[] = _("The curvier, the sweeter and tastier."); +static const u8 gBerryDescriptionPart1_Aguav[] = _("The flower is dainty. It is rare in its"); +static const u8 gBerryDescriptionPart2_Aguav[] = _("ability to grow without light."); +static const u8 gBerryDescriptionPart1_Iapapa[] = _("The BERRY is very big and sour."); +static const u8 gBerryDescriptionPart2_Iapapa[] = _("It takes at least a day to grow."); +static const u8 gBerryDescriptionPart1_Razz[] = _("The red BERRY tastes slightly spicy."); +static const u8 gBerryDescriptionPart2_Razz[] = _("It grows quickly in just four hours."); +static const u8 gBerryDescriptionPart1_Bluk[] = _("The BERRY is blue on the outside, but"); +static const u8 gBerryDescriptionPart2_Bluk[] = _("it blackens the mouth when eaten."); +static const u8 gBerryDescriptionPart1_Nanab[] = _("This BERRY was the seventh"); +static const u8 gBerryDescriptionPart2_Nanab[] = _("discovered in the world. It is sweet."); +static const u8 gBerryDescriptionPart1_Wepear[] = _("The flower is small and white. It has a"); +static const u8 gBerryDescriptionPart2_Wepear[] = _("delicate balance of bitter and sour."); +static const u8 gBerryDescriptionPart1_Pinap[] = _("Weak against wind and cold."); +static const u8 gBerryDescriptionPart2_Pinap[] = _("The fruit is spicy and the skin, sour."); +static const u8 gBerryDescriptionPart1_Pomeg[] = _("However much it is watered,"); +static const u8 gBerryDescriptionPart2_Pomeg[] = _("it only grows up to six BERRIES."); +static const u8 gBerryDescriptionPart1_Kelpsy[] = _("A rare variety shaped like a root."); +static const u8 gBerryDescriptionPart2_Kelpsy[] = _("Grows a very large flower."); +static const u8 gBerryDescriptionPart1_Qualot[] = _("Loves water. Grows strong even in"); +static const u8 gBerryDescriptionPart2_Qualot[] = _("locations with constant rainfall."); +static const u8 gBerryDescriptionPart1_Hondew[] = _("A BERRY that is very valuable and"); +static const u8 gBerryDescriptionPart2_Hondew[] = _("rarely seen. It is very delicious."); +static const u8 gBerryDescriptionPart1_Grepa[] = _("Despite its tenderness and round"); +static const u8 gBerryDescriptionPart2_Grepa[] = _("shape, the BERRY is unimaginably sour."); +static const u8 gBerryDescriptionPart1_Tamato[] = _("The BERRY is lip-bendingly spicy."); +static const u8 gBerryDescriptionPart2_Tamato[] = _("It takes time to grow."); +static const u8 gBerryDescriptionPart1_Cornn[] = _("A BERRY from an ancient era. May not"); +static const u8 gBerryDescriptionPart2_Cornn[] = _("grow unless planted in quantity."); +static const u8 gBerryDescriptionPart1_Magost[] = _("A BERRY that is widely said to have"); +static const u8 gBerryDescriptionPart2_Magost[] = _("a finely balanced flavor."); +static const u8 gBerryDescriptionPart1_Rabuta[] = _("A rare variety that is overgrown with"); +static const u8 gBerryDescriptionPart2_Rabuta[] = _("hair. It is quite bitter."); +static const u8 gBerryDescriptionPart1_Nomel[] = _("Quite sour. Just one bite makes it"); +static const u8 gBerryDescriptionPart2_Nomel[] = _("impossible to taste for three days."); +static const u8 gBerryDescriptionPart1_Spelon[] = _("The vividly red BERRY is very spicy."); +static const u8 gBerryDescriptionPart2_Spelon[] = _("Its warts secrete a spicy substance."); +static const u8 gBerryDescriptionPart1_Pamtre[] = _("Drifts on the sea from somewhere."); +static const u8 gBerryDescriptionPart2_Pamtre[] = _("It is thought to grow elsewhere."); +static const u8 gBerryDescriptionPart1_Watmel[] = _("A huge BERRY, with some over 20"); +static const u8 gBerryDescriptionPart2_Watmel[] = _("inches discovered. Exceedingly sweet."); +static const u8 gBerryDescriptionPart1_Durin[] = _("Bitter to even look at. It is so"); +static const u8 gBerryDescriptionPart2_Durin[] = _("bitter, no one has ever eaten it as is."); +static const u8 gBerryDescriptionPart1_Belue[] = _("It is glossy and looks delicious, but"); +static const u8 gBerryDescriptionPart2_Belue[] = _("it is awfully sour. Takes time to grow."); +static const u8 gBerryDescriptionPart1_Liechi[] = _("A mysterious BERRY. It is rumored to"); +static const u8 gBerryDescriptionPart2_Liechi[] = _("contain the power of the sea."); +static const u8 gBerryDescriptionPart1_Ganlon[] = _("A mysterious BERRY. It is rumored to"); +static const u8 gBerryDescriptionPart2_Ganlon[] = _("contain the power of the land."); +static const u8 gBerryDescriptionPart1_Salac[] = _("A mysterious BERRY. It is rumored to"); +static const u8 gBerryDescriptionPart2_Salac[] = _("contain the power of the sky."); +static const u8 gBerryDescriptionPart1_Petaya[] = _("A mysterious BERRY. It is rumored to"); +static const u8 gBerryDescriptionPart2_Petaya[] = _("contain the power of all living things."); +static const u8 gBerryDescriptionPart1_Apicot[] = _("A very mystifying BERRY. No telling"); +static const u8 gBerryDescriptionPart2_Apicot[] = _("what may happen or how it can be used."); +static const u8 gBerryDescriptionPart1_Lansat[] = _("Said to be a legendary BERRY."); +static const u8 gBerryDescriptionPart2_Lansat[] = _("Holding it supposedly brings joy."); +static const u8 gBerryDescriptionPart1_Starf[] = _("So strong, it was abandoned at the"); +static const u8 gBerryDescriptionPart2_Starf[] = _("world’s edge. Considered a mirage."); +static const u8 gBerryDescriptionPart1_Enigma[] = _("A completely enigmatic BERRY."); +static const u8 gBerryDescriptionPart2_Enigma[] = _("Appears to have the power of stars."); #elif defined(GERMAN) #define NAME_CHERI_BERRY _("AMRENA") #define NAME_CHESTO_BERRY _("MARON") @@ -192,92 +198,92 @@ const u8 gBerryDescriptionPart2_Enigma[] = _("Appears to have the power of stars #define NAME_STARF_BERRY _("KRAMBO") #define NAME_ENIGMA_BERRY _("ENIGMA") -const u8 gBerryDescriptionPart1_Cheri[] = _("Erblüht mit hübschen, zarten Blumen."); -const u8 gBerryDescriptionPart2_Cheri[] = _("Diese knallrote BEERE ist sehr scharf."); -const u8 gBerryDescriptionPart1_Chesto[] = _("Diese BEERE hat eine dicke Haut und"); -const u8 gBerryDescriptionPart2_Chesto[] = _("hartes Fruchtfleisch. Trocken!"); -const u8 gBerryDescriptionPart1_Pecha[] = _("Sehr süß und delikat."); -const u8 gBerryDescriptionPart2_Pecha[] = _("Sehr zart. Vorsichtig anfassen!"); -const u8 gBerryDescriptionPart1_Rawst[] = _("Wenn die Blätter lang und wellig sind,"); -const u8 gBerryDescriptionPart2_Rawst[] = _("wird die BEERE sehr bitter."); -const u8 gBerryDescriptionPart1_Aspear[] = _("Diese harte BEERE ist sehr"); -const u8 gBerryDescriptionPart2_Aspear[] = _("saftig und sauer im Geschmack!"); -const u8 gBerryDescriptionPart1_Leppa[] = _("Wächst langsamer als AMRENA und"); -const u8 gBerryDescriptionPart2_Leppa[] = _("andere. Je kleiner, desto delikater."); -const u8 gBerryDescriptionPart1_Oran[] = _("Eine BEERE unterschiedlichsten Ge-"); -const u8 gBerryDescriptionPart2_Oran[] = _("schmacks. Wächst an einem halben Tag."); -const u8 gBerryDescriptionPart1_Persim[] = _("Liebt Sonnenlicht. Die BEERE"); -const u8 gBerryDescriptionPart2_Persim[] = _("wächst im Sonnenlicht sehr schnell."); -const u8 gBerryDescriptionPart1_Lum[] = _("Langsamer Wuchs. Wird sie liebevoll ge-"); -const u8 gBerryDescriptionPart2_Lum[] = _("pflegt, kann sie 2 BEEREN tragen."); -const u8 gBerryDescriptionPart1_Sitrus[] = _("Eng verwandt mit SINEL. Diese große"); -const u8 gBerryDescriptionPart2_Sitrus[] = _("BEERE ist von rundem Geschmack."); -const u8 gBerryDescriptionPart1_Figy[] = _("Die BEERE sieht angekaut aus. Sie ist"); -const u8 gBerryDescriptionPart2_Figy[] = _("voller scharfer Substanzen."); -const u8 gBerryDescriptionPart1_Wiki[] = _("Die BEERE wächst unförmig,"); -const u8 gBerryDescriptionPart2_Wiki[] = _("damit PKMN sie besser greifen können."); -const u8 gBerryDescriptionPart1_Mago[] = _("Die BEERE hat Ausbeulungen. Je mehr"); -const u8 gBerryDescriptionPart2_Mago[] = _("Beulen, desto schmackhafter ist sie."); -const u8 gBerryDescriptionPart1_Aguav[] = _("Die Blume ist zart. Sie ist fähig,"); -const u8 gBerryDescriptionPart2_Aguav[] = _("ohne Licht wachsen zu können."); -const u8 gBerryDescriptionPart1_Iapapa[] = _("Die BEERE ist groß und sauer."); -const u8 gBerryDescriptionPart2_Iapapa[] = _("Sie braucht einen Tag zum Wachsen."); -const u8 gBerryDescriptionPart1_Razz[] = _("Diese rote BEERE schmeckt etwas"); -const u8 gBerryDescriptionPart2_Razz[] = _("scharf. Sie wächst in nur 4 Stunden."); -const u8 gBerryDescriptionPart1_Bluk[] = _("Die BEERE ist außen blau, verfärbt"); -const u8 gBerryDescriptionPart2_Bluk[] = _("sich im Mund aber schwarz."); -const u8 gBerryDescriptionPart1_Nanab[] = _("Diese BEERE war die 7., die auf der"); -const u8 gBerryDescriptionPart2_Nanab[] = _("Welt entdeckt wurde. Sie ist süß."); -const u8 gBerryDescriptionPart1_Wepear[] = _("Die Blume ist klein und weiß. Angenehm"); -const u8 gBerryDescriptionPart2_Wepear[] = _("bitter und sauer zugleich."); -const u8 gBerryDescriptionPart1_Pinap[] = _("Wind und Kälte verträgt sie nicht."); -const u8 gBerryDescriptionPart2_Pinap[] = _("Fruchtfleisch: Scharf. Haut: Sauer."); -const u8 gBerryDescriptionPart1_Pomeg[] = _("Egal wie viel Wasser sie bekommt, sie"); -const u8 gBerryDescriptionPart2_Pomeg[] = _("trägt immer bis zu 6 BEEREN."); -const u8 gBerryDescriptionPart1_Kelpsy[] = _("Eine Seltenheit. Geformt wie eine"); -const u8 gBerryDescriptionPart2_Kelpsy[] = _("Wurzel. Hat eine große Blume."); -const u8 gBerryDescriptionPart1_Qualot[] = _("Liebt das Wasser. Wächst besonders"); -const u8 gBerryDescriptionPart2_Qualot[] = _("gut in regenreichen Gegenden."); -const u8 gBerryDescriptionPart1_Hondew[] = _("Eine wertvolle und seltene BEERE."); -const u8 gBerryDescriptionPart2_Hondew[] = _("Sie ist sehr schmackhaft."); -const u8 gBerryDescriptionPart1_Grepa[] = _("Die BEERE ist zart und von runder"); -const u8 gBerryDescriptionPart2_Grepa[] = _("Form. Aber sie ist unglaublich sauer!"); -const u8 gBerryDescriptionPart1_Tamato[] = _("Die Schärfe der BEERE verbrennt die"); -const u8 gBerryDescriptionPart2_Tamato[] = _("Lippen. Sie braucht Zeit zum Wachsen."); -const u8 gBerryDescriptionPart1_Cornn[] = _("Eine BEERE aus alten Zeiten. Wächst"); -const u8 gBerryDescriptionPart2_Cornn[] = _("nur, wenn in großen Mengen gepflanzt."); -const u8 gBerryDescriptionPart1_Magost[] = _("Eine BEERE, die für ihren feinen, aus-"); -const u8 gBerryDescriptionPart2_Magost[] = _("gewogenen Geschmack bekannt ist."); -const u8 gBerryDescriptionPart1_Rabuta[] = _("Eine Seltenheit, die über und über mit"); -const u8 gBerryDescriptionPart2_Rabuta[] = _("Haaren bewachsen ist. Sehr bitter!"); -const u8 gBerryDescriptionPart1_Nomel[] = _("Sehr sauer. Ein Biss betäubt die"); -const u8 gBerryDescriptionPart2_Nomel[] = _("Geschmacksnerven für 3 Tage!"); -const u8 gBerryDescriptionPart1_Spelon[] = _("Die leuchtend rote BEERE ist sehr"); -const u8 gBerryDescriptionPart2_Spelon[] = _("scharf. Gibt scharfe Substanzen ab!"); -const u8 gBerryDescriptionPart1_Pamtre[] = _("Wird vom Meer angespült. Sie wächst"); -const u8 gBerryDescriptionPart2_Pamtre[] = _("an einem anderen Ort."); -const u8 gBerryDescriptionPart1_Watmel[] = _("Eine große BEERE, 25 cm groß."); -const u8 gBerryDescriptionPart2_Watmel[] = _("Außergewöhnlich süß."); -const u8 gBerryDescriptionPart1_Durin[] = _("Bitter schon ihr Anblick! Sie ist so"); -const u8 gBerryDescriptionPart2_Durin[] = _("bitter, dass niemand sie pur isst."); -const u8 gBerryDescriptionPart1_Belue[] = _("Sie glänzt, sieht zart aus, ist extrem"); -const u8 gBerryDescriptionPart2_Belue[] = _("sauer und braucht Zeit zum Wachsen."); -const u8 gBerryDescriptionPart1_Liechi[] = _("Eine geheimnisvolle BEERE. Man sagt,"); -const u8 gBerryDescriptionPart2_Liechi[] = _("sie enthalte die Kraft des Meeres."); -const u8 gBerryDescriptionPart1_Ganlon[] = _("Eine geheimnisvolle BEERE. Man sagt,"); -const u8 gBerryDescriptionPart2_Ganlon[] = _("sie enthalte die Kraft des Landes."); -const u8 gBerryDescriptionPart1_Salac[] = _("Eine geheimnisvolle BEERE. Man sagt,"); -const u8 gBerryDescriptionPart2_Salac[] = _("sie enthalte die Kraft des Himmels."); -const u8 gBerryDescriptionPart1_Petaya[] = _("Eine geheimnisvolle BEERE. Man sagt,"); -const u8 gBerryDescriptionPart2_Petaya[] = _("sie enthalte die Kraft allen Lebens."); -const u8 gBerryDescriptionPart1_Apicot[] = _("Eine rätselhafte BEERE. Man kann"); -const u8 gBerryDescriptionPart2_Apicot[] = _("nicht sagen, wie und was sie ist."); -const u8 gBerryDescriptionPart1_Lansat[] = _("Eine legendäre BEERE. Sie zu"); -const u8 gBerryDescriptionPart2_Lansat[] = _("tragen bringt Freude."); -const u8 gBerryDescriptionPart1_Starf[] = _("So stark, dass sie an den Rand der"); -const u8 gBerryDescriptionPart2_Starf[] = _("Welt verbannt wurde. Ein Märchen?"); -const u8 gBerryDescriptionPart1_Enigma[] = _("Eine enigmatische BEERE. Sie scheint"); -const u8 gBerryDescriptionPart2_Enigma[] = _("die Macht der Sterne zu besitzen."); +static const u8 gBerryDescriptionPart1_Cheri[] = _("Erblüht mit hübschen, zarten Blumen."); +static const u8 gBerryDescriptionPart2_Cheri[] = _("Diese knallrote BEERE ist sehr scharf."); +static const u8 gBerryDescriptionPart1_Chesto[] = _("Diese BEERE hat eine dicke Haut und"); +static const u8 gBerryDescriptionPart2_Chesto[] = _("hartes Fruchtfleisch. Trocken!"); +static const u8 gBerryDescriptionPart1_Pecha[] = _("Sehr süß und delikat."); +static const u8 gBerryDescriptionPart2_Pecha[] = _("Sehr zart. Vorsichtig anfassen!"); +static const u8 gBerryDescriptionPart1_Rawst[] = _("Wenn die Blätter lang und wellig sind,"); +static const u8 gBerryDescriptionPart2_Rawst[] = _("wird die BEERE sehr bitter."); +static const u8 gBerryDescriptionPart1_Aspear[] = _("Diese harte BEERE ist sehr"); +static const u8 gBerryDescriptionPart2_Aspear[] = _("saftig und sauer im Geschmack!"); +static const u8 gBerryDescriptionPart1_Leppa[] = _("Wächst langsamer als AMRENA und"); +static const u8 gBerryDescriptionPart2_Leppa[] = _("andere. Je kleiner, desto delikater."); +static const u8 gBerryDescriptionPart1_Oran[] = _("Eine BEERE unterschiedlichsten Ge-"); +static const u8 gBerryDescriptionPart2_Oran[] = _("schmacks. Wächst an einem halben Tag."); +static const u8 gBerryDescriptionPart1_Persim[] = _("Liebt Sonnenlicht. Die BEERE"); +static const u8 gBerryDescriptionPart2_Persim[] = _("wächst im Sonnenlicht sehr schnell."); +static const u8 gBerryDescriptionPart1_Lum[] = _("Langsamer Wuchs. Wird sie liebevoll ge-"); +static const u8 gBerryDescriptionPart2_Lum[] = _("pflegt, kann sie 2 BEEREN tragen."); +static const u8 gBerryDescriptionPart1_Sitrus[] = _("Eng verwandt mit SINEL. Diese große"); +static const u8 gBerryDescriptionPart2_Sitrus[] = _("BEERE ist von rundem Geschmack."); +static const u8 gBerryDescriptionPart1_Figy[] = _("Die BEERE sieht angekaut aus. Sie ist"); +static const u8 gBerryDescriptionPart2_Figy[] = _("voller scharfer Substanzen."); +static const u8 gBerryDescriptionPart1_Wiki[] = _("Die BEERE wächst unförmig,"); +static const u8 gBerryDescriptionPart2_Wiki[] = _("damit PKMN sie besser greifen können."); +static const u8 gBerryDescriptionPart1_Mago[] = _("Die BEERE hat Ausbeulungen. Je mehr"); +static const u8 gBerryDescriptionPart2_Mago[] = _("Beulen, desto schmackhafter ist sie."); +static const u8 gBerryDescriptionPart1_Aguav[] = _("Die Blume ist zart. Sie ist fähig,"); +static const u8 gBerryDescriptionPart2_Aguav[] = _("ohne Licht wachsen zu können."); +static const u8 gBerryDescriptionPart1_Iapapa[] = _("Die BEERE ist groß und sauer."); +static const u8 gBerryDescriptionPart2_Iapapa[] = _("Sie braucht einen Tag zum Wachsen."); +static const u8 gBerryDescriptionPart1_Razz[] = _("Diese rote BEERE schmeckt etwas"); +static const u8 gBerryDescriptionPart2_Razz[] = _("scharf. Sie wächst in nur 4 Stunden."); +static const u8 gBerryDescriptionPart1_Bluk[] = _("Die BEERE ist außen blau, verfärbt"); +static const u8 gBerryDescriptionPart2_Bluk[] = _("sich im Mund aber schwarz."); +static const u8 gBerryDescriptionPart1_Nanab[] = _("Diese BEERE war die 7., die auf der"); +static const u8 gBerryDescriptionPart2_Nanab[] = _("Welt entdeckt wurde. Sie ist süß."); +static const u8 gBerryDescriptionPart1_Wepear[] = _("Die Blume ist klein und weiß. Angenehm"); +static const u8 gBerryDescriptionPart2_Wepear[] = _("bitter und sauer zugleich."); +static const u8 gBerryDescriptionPart1_Pinap[] = _("Wind und Kälte verträgt sie nicht."); +static const u8 gBerryDescriptionPart2_Pinap[] = _("Fruchtfleisch: Scharf. Haut: Sauer."); +static const u8 gBerryDescriptionPart1_Pomeg[] = _("Egal wie viel Wasser sie bekommt, sie"); +static const u8 gBerryDescriptionPart2_Pomeg[] = _("trägt immer bis zu 6 BEEREN."); +static const u8 gBerryDescriptionPart1_Kelpsy[] = _("Eine Seltenheit. Geformt wie eine"); +static const u8 gBerryDescriptionPart2_Kelpsy[] = _("Wurzel. Hat eine große Blume."); +static const u8 gBerryDescriptionPart1_Qualot[] = _("Liebt das Wasser. Wächst besonders"); +static const u8 gBerryDescriptionPart2_Qualot[] = _("gut in regenreichen Gegenden."); +static const u8 gBerryDescriptionPart1_Hondew[] = _("Eine wertvolle und seltene BEERE."); +static const u8 gBerryDescriptionPart2_Hondew[] = _("Sie ist sehr schmackhaft."); +static const u8 gBerryDescriptionPart1_Grepa[] = _("Die BEERE ist zart und von runder"); +static const u8 gBerryDescriptionPart2_Grepa[] = _("Form. Aber sie ist unglaublich sauer!"); +static const u8 gBerryDescriptionPart1_Tamato[] = _("Die Schärfe der BEERE verbrennt die"); +static const u8 gBerryDescriptionPart2_Tamato[] = _("Lippen. Sie braucht Zeit zum Wachsen."); +static const u8 gBerryDescriptionPart1_Cornn[] = _("Eine BEERE aus alten Zeiten. Wächst"); +static const u8 gBerryDescriptionPart2_Cornn[] = _("nur, wenn in großen Mengen gepflanzt."); +static const u8 gBerryDescriptionPart1_Magost[] = _("Eine BEERE, die für ihren feinen, aus-"); +static const u8 gBerryDescriptionPart2_Magost[] = _("gewogenen Geschmack bekannt ist."); +static const u8 gBerryDescriptionPart1_Rabuta[] = _("Eine Seltenheit, die über und über mit"); +static const u8 gBerryDescriptionPart2_Rabuta[] = _("Haaren bewachsen ist. Sehr bitter!"); +static const u8 gBerryDescriptionPart1_Nomel[] = _("Sehr sauer. Ein Biss betäubt die"); +static const u8 gBerryDescriptionPart2_Nomel[] = _("Geschmacksnerven für 3 Tage!"); +static const u8 gBerryDescriptionPart1_Spelon[] = _("Die leuchtend rote BEERE ist sehr"); +static const u8 gBerryDescriptionPart2_Spelon[] = _("scharf. Gibt scharfe Substanzen ab!"); +static const u8 gBerryDescriptionPart1_Pamtre[] = _("Wird vom Meer angespült. Sie wächst"); +static const u8 gBerryDescriptionPart2_Pamtre[] = _("an einem anderen Ort."); +static const u8 gBerryDescriptionPart1_Watmel[] = _("Eine große BEERE, 25 cm groß."); +static const u8 gBerryDescriptionPart2_Watmel[] = _("Außergewöhnlich süß."); +static const u8 gBerryDescriptionPart1_Durin[] = _("Bitter schon ihr Anblick! Sie ist so"); +static const u8 gBerryDescriptionPart2_Durin[] = _("bitter, dass niemand sie pur isst."); +static const u8 gBerryDescriptionPart1_Belue[] = _("Sie glänzt, sieht zart aus, ist extrem"); +static const u8 gBerryDescriptionPart2_Belue[] = _("sauer und braucht Zeit zum Wachsen."); +static const u8 gBerryDescriptionPart1_Liechi[] = _("Eine geheimnisvolle BEERE. Man sagt,"); +static const u8 gBerryDescriptionPart2_Liechi[] = _("sie enthalte die Kraft des Meeres."); +static const u8 gBerryDescriptionPart1_Ganlon[] = _("Eine geheimnisvolle BEERE. Man sagt,"); +static const u8 gBerryDescriptionPart2_Ganlon[] = _("sie enthalte die Kraft des Landes."); +static const u8 gBerryDescriptionPart1_Salac[] = _("Eine geheimnisvolle BEERE. Man sagt,"); +static const u8 gBerryDescriptionPart2_Salac[] = _("sie enthalte die Kraft des Himmels."); +static const u8 gBerryDescriptionPart1_Petaya[] = _("Eine geheimnisvolle BEERE. Man sagt,"); +static const u8 gBerryDescriptionPart2_Petaya[] = _("sie enthalte die Kraft allen Lebens."); +static const u8 gBerryDescriptionPart1_Apicot[] = _("Eine rätselhafte BEERE. Man kann"); +static const u8 gBerryDescriptionPart2_Apicot[] = _("nicht sagen, wie und was sie ist."); +static const u8 gBerryDescriptionPart1_Lansat[] = _("Eine legendäre BEERE. Sie zu"); +static const u8 gBerryDescriptionPart2_Lansat[] = _("tragen bringt Freude."); +static const u8 gBerryDescriptionPart1_Starf[] = _("So stark, dass sie an den Rand der"); +static const u8 gBerryDescriptionPart2_Starf[] = _("Welt verbannt wurde. Ein Märchen?"); +static const u8 gBerryDescriptionPart1_Enigma[] = _("Eine enigmatische BEERE. Sie scheint"); +static const u8 gBerryDescriptionPart2_Enigma[] = _("die Macht der Sterne zu besitzen."); #endif const struct Berry gBerries[] = @@ -972,7 +978,7 @@ const struct Berry gBerries[] = }, }; -const struct BerryTree gBlankBerryTree = {0}; +static const struct BerryTree gBlankBerryTree = {0}; extern u8 S_BerryTree[]; extern u16 gScriptLastTalked; @@ -980,7 +986,21 @@ extern u16 gSpecialVar_0x8004; extern u16 gSpecialVar_0x8005; extern u16 gSpecialVar_0x8006; +/* + An enigma berry is a type of berry which functions + as though it is a custom berry. Because it behaves + like its a custom berry, it doesn't hold an identity + represented in its icons or descriptions, leaving its + information to be decided by the e-reader cards + which were intended to deliver these custom + berries. +*/ + +static u8 CalcBerryYield(struct BerryTree *tree); +static u16 GetStageDurationByBerryType(u8 berry); + // unused +// this could be static, but making it so causes a compile-time warning. void ClearEnigmaBerries(void) { CpuFill16(0, &gSaveBlock1.enigmaBerry, sizeof(gSaveBlock1.enigmaBerry)); @@ -988,17 +1008,21 @@ void ClearEnigmaBerries(void) void SetEnigmaBerry(u8 *src) { + // initialize the enigma berry by copying the data from the script. u32 i; u8 *dest = (u8*)&gSaveBlock1.enigmaBerry; for (i = 0; i < sizeof(gSaveBlock1.enigmaBerry); i++) dest[i] = src[i]; + // at this point, the description pointer is not yet initialized. we need to initialize it since + // we dont know where in memory this is going to be. set the berry desc pointers to the + // EnigmaBerry struct's description arrays since these are where the descriptions are stored. gSaveBlock1.enigmaBerry.berry.description1 = gSaveBlock1.enigmaBerry.description1; gSaveBlock1.enigmaBerry.berry.description2 = gSaveBlock1.enigmaBerry.description2; } -u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry) +static u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry) { const u8 *description1; const u8 *description2; @@ -1006,10 +1030,13 @@ u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry) u32 checksum; u8 *dest; + // the description pointers could be pointing to anywhere in memory. we do not want these + // pointers to factor into the checksum as it will produce a different result every time: so + // back the pointers up and set them to null so the checksum is safe to calculate. description1 = gSaveBlock1.enigmaBerry.berry.description1; description2 = gSaveBlock1.enigmaBerry.berry.description2; - gSaveBlock1.enigmaBerry.berry.description1 = 0; - gSaveBlock1.enigmaBerry.berry.description2 = 0; + gSaveBlock1.enigmaBerry.berry.description1 = NULL; + gSaveBlock1.enigmaBerry.berry.description2 = NULL; dest = (u8*)enigmaBerry; checksum = 0; @@ -1018,17 +1045,20 @@ u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry) checksum += dest[i]; } + // the checksum is calculated: the descriptions are safe to restore now. gSaveBlock1.enigmaBerry.berry.description1 = description1; gSaveBlock1.enigmaBerry.berry.description2 = description2; return checksum; } +// due to e-reader scans being particularly volatile to failure, it is a requirement to check for +// their integrity here due to scans possibly failing to produce the correct result. bool32 IsEnigmaBerryValid(void) { - if (!gSaveBlock1.enigmaBerry.berry.stageDuration) + if (gSaveBlock1.enigmaBerry.berry.stageDuration == 0) return FALSE; - if (!gSaveBlock1.enigmaBerry.berry.maxYield) + if (gSaveBlock1.enigmaBerry.berry.maxYield == 0) return FALSE; if (GetEnigmaBerryChecksum(&gSaveBlock1.enigmaBerry) != gSaveBlock1.enigmaBerry.checksum) return FALSE; @@ -1037,37 +1067,51 @@ bool32 IsEnigmaBerryValid(void) const struct Berry *GetBerryInfo(u8 berry) { - if (berry == 0x2B && IsEnigmaBerryValid()) + // when getting the pointer to the berry info, enigma berries are handled differently. if your + // berry is an Enigma Berry and its checksum is valid, fetch the pointer to its information in + // the save block. + if (berry == GETBERRYID(ITEM_ENIGMA_BERRY) && IsEnigmaBerryValid()) return &gSaveBlock1.enigmaBerry.berry; else { - if (berry == 0 || berry > 0x2B) - berry = 1; + // invalid berries will be flattened into a cheri berry. Interestingly, if your berry was + // an enigma berry whos checksum failed, the game will use the Enigma Berry information + // for this: meaning if you see the Enigma Berry information, its actually because the + // checksum failed. + if (berry == BERRY_NONE || berry > GETBERRYID(LAST_BERRY)) + berry = GETBERRYID(FIRST_BERRY); return &gBerries[berry - 1]; } } -struct BerryTree *GetBerryTreeInfo(u8 id) +// the save file can handle up to a number of 128 berry trees as indicated by its definition +// in global.h. Interestingly, this function does not check that limit of 128. +static struct BerryTree *GetBerryTreeInfo(u8 id) { return &gSaveBlock1.berryTrees[id]; } +// this was called because the berry script was successful: meaning the player chose to +// water the tree. We need to check for the current tree stage and set the appropriate +// water flag to true. bool32 FieldObjectInteractionWaterBerryTree(void) { + // GetBerryTreeInfo does not sanitize the tree retrieved, but there are no known + // instances where this can cause problems. struct BerryTree *tree = GetBerryTreeInfo(FieldObjectGetBerryTreeId(gSelectedMapObject)); switch (tree->stage) { - case 1: + case BERRY_STAGE_PLANTED: tree->watered1 = TRUE; break; - case 2: + case BERRY_STAGE_SPROUTED: tree->watered2 = TRUE; break; - case 3: + case BERRY_STAGE_TALLER: tree->watered3 = TRUE; break; - case 4: + case BERRY_STAGE_FLOWERING: tree->watered4 = TRUE; break; default: @@ -1076,10 +1120,10 @@ bool32 FieldObjectInteractionWaterBerryTree(void) return TRUE; } -bool8 IsPlayerFacingPlantedBerryTree(void) +bool8 IsPlayerFacingUnplantedSoil(void) { - if (GetFieldObjectScriptPointerForComparison() == S_BerryTree - && GetStageByBerryTreeId(FieldObjectGetBerryTreeId(gSelectedMapObject)) == 0) + if (GetFieldObjectScriptPointerPlayerFacing() == S_BerryTree + && GetStageByBerryTreeId(FieldObjectGetBerryTreeId(gSelectedMapObject)) == BERRY_STAGE_NO_BERRY) return TRUE; else return FALSE; @@ -1087,7 +1131,7 @@ bool8 IsPlayerFacingPlantedBerryTree(void) bool8 TryToWaterBerryTree(void) { - if (GetFieldObjectScriptPointerForComparison() != S_BerryTree) + if (GetFieldObjectScriptPointerPlayerFacing() != S_BerryTree) return FALSE; else return FieldObjectInteractionWaterBerryTree(); @@ -1099,70 +1143,84 @@ void ClearBerryTrees(void) struct SaveBlock1 *saveBlock1 = &gSaveBlock1; struct BerryTree berryTree = gBlankBerryTree; - for (i = 0; i < (u8)ARRAY_COUNT(saveBlock1->berryTrees); i++) // casting to u8 fixes a mismatched signed compare. what + for (i = 0; i < MAX_BERRY_TREES; i++) saveBlock1->berryTrees[i] = berryTree; } -bool32 BerryTreeGrow(struct BerryTree *tree) +// when the player does not interact with the tree for a period of time, this is called +// to advance the grow state. +static bool32 BerryTreeGrow(struct BerryTree *tree) { if (tree->growthSparkle) return FALSE; switch (tree->stage) { - case 0: + case BERRY_STAGE_NO_BERRY: return FALSE; - case 4: + case BERRY_STAGE_FLOWERING: tree->berryYield = CalcBerryYield(tree); - case 1: - case 2: - case 3: + case BERRY_STAGE_PLANTED: + case BERRY_STAGE_SPROUTED: + case BERRY_STAGE_TALLER: tree->stage++; break; - case 5: + case BERRY_STAGE_BERRIES: tree->watered1 = 0; tree->watered2 = 0; tree->watered3 = 0; tree->watered4 = 0; tree->berryYield = 0; - tree->stage = 2; - if (++tree->regrowthCount == 10) + tree->stage = BERRY_STAGE_SPROUTED; + if (++tree->regrowthCount == BERRY_REGROW_LIMIT) *tree = gBlankBerryTree; break; } return TRUE; } -void BerryTreeTimeUpdate(s32 minutes) +void BerryTreeTimeUpdate(s32 minutesPassed) { int i; struct BerryTree *tree; - for (i = 0; i < (u8)ARRAY_COUNT(gSaveBlock1.berryTrees); i++) + for (i = 0; i < MAX_BERRY_TREES; i++) { tree = &gSaveBlock1.berryTrees[i]; - if (tree->berry && tree->stage && !tree->growthSparkle) + if (tree->berry != BERRY_NONE && tree->stage != BERRY_STAGE_NO_BERRY && tree->growthSparkle == FALSE) { - if (minutes >= GetStageDurationByBerryType(tree->berry) * 71) + // the player has waited too long to water the berry. Reset the tree. This is because + // if the berry state is not in the unwatered state, the tree will grow anyway despite this + // check, which means BerryTreeGrow will handle the regrow process for this, removing the + // need for this check. This only handles the unwatered soil state. + if (minutesPassed >= GetStageDurationByBerryType(tree->berry) * 71) { *tree = gBlankBerryTree; } else { - s32 time = minutes; + // because time is altered below, perhaps they thought it was unsafe to change it, even + // though that is not how passed arguments behave. + s32 time = minutesPassed; while (time != 0) { if (tree->minutesUntilNextStage > time) { - tree->minutesUntilNextStage -= time; + // its been X minutes since the last berry update, so update + // minutesUntilNextStage appropriately to match the time offset + // that has passed since the update. + tree->minutesUntilNextStage -= time; break; } + // perform the subtraction the other way around to get the number of minutes since + // the inferred stage update that occured, since minutesUntilNextStage is <= time. + // we may need this variable to simulate multiple berry cycles in the while loop. time -= tree->minutesUntilNextStage; - tree->minutesUntilNextStage = GetStageDurationByBerryType(tree->berry); - if (!BerryTreeGrow(tree)) + tree->minutesUntilNextStage = GetStageDurationByBerryType(tree->berry); // since the tree was inferred to update, set the new minutesUntilNextStage. + if (BerryTreeGrow(tree) == FALSE) break; - if (tree->stage == 5) + if (tree->stage == BERRY_STAGE_BERRIES) tree->minutesUntilNextStage *= 4; } } @@ -1170,7 +1228,7 @@ void BerryTreeTimeUpdate(s32 minutes) } } -void PlantBerryTree(u8 id, u8 berry, u8 stage, bool8 sparkle) +void PlantBerryTree(u8 id, u8 berry, u8 stage, bool8 noSparkle) { struct BerryTree *tree = GetBerryTreeInfo(id); @@ -1178,12 +1236,12 @@ void PlantBerryTree(u8 id, u8 berry, u8 stage, bool8 sparkle) tree->berry = berry; tree->minutesUntilNextStage = GetStageDurationByBerryType(berry); tree->stage = stage; - if (stage == 5) + if (stage == BERRY_STAGE_BERRIES) { tree->berryYield = CalcBerryYield(tree); tree->minutesUntilNextStage *= 4; } - if (!sparkle) + if (noSparkle == FALSE) { tree->growthSparkle = TRUE; } @@ -1209,19 +1267,19 @@ u8 ItemIdToBerryType(u16 item) u16 berry = item - FIRST_BERRY; if (berry > LAST_BERRY - FIRST_BERRY) - return 1; + return GETBERRYID(FIRST_BERRY); else - return item - FIRST_BERRY + 1; + return GETBERRYID(item); } -u16 BerryTypeToItemId(u16 berry) +static u16 BerryTypeToItemId(u16 berry) { u16 item = berry - 1; if (item > LAST_BERRY - FIRST_BERRY) return FIRST_BERRY; else - return berry + FIRST_BERRY - 1; + return GETITEMID(berry); } void GetBerryNameByBerryType(u8 berry, u8 *string) @@ -1232,10 +1290,10 @@ void GetBerryNameByBerryType(u8 berry, u8 *string) void ResetBerryTreeSparkleFlag(u8 id) { - GetBerryTreeInfo(id)->growthSparkle = 0; + GetBerryTreeInfo(id)->growthSparkle = FALSE; } -u8 BerryTreeGetNumStagesWatered(struct BerryTree *tree) +static u8 BerryTreeGetNumStagesWatered(struct BerryTree *tree) { u8 count = 0; @@ -1250,18 +1308,20 @@ u8 BerryTreeGetNumStagesWatered(struct BerryTree *tree) return count; } -u8 GetNumStagesWateredByBerryTreeId(u8 id) +static u8 GetNumStagesWateredByBerryTreeId(u8 id) { return BerryTreeGetNumStagesWatered(GetBerryTreeInfo(id)); } -u8 CalcBerryYieldInternal(u16 max, u16 min, u8 water) +static u8 CalcBerryYieldInternal(u16 max, u16 min, u8 water) { u32 randMin; u32 randMax; u32 rand; u32 extraYield; + // depending on if the player gave the tree plenty of water, berry yield will be affected proportionally. + if (water == 0) return min; else @@ -1270,7 +1330,7 @@ u8 CalcBerryYieldInternal(u16 max, u16 min, u8 water) randMax = (max - min) * (water); rand = randMin + Random() % (randMax - randMin + 1); - if ((rand & 3) > 1) + if ((rand % 4) > 1) extraYield = rand / 4 + 1; else extraYield = rand / 4; @@ -1278,7 +1338,7 @@ u8 CalcBerryYieldInternal(u16 max, u16 min, u8 water) } } -u8 CalcBerryYield(struct BerryTree *tree) +static u8 CalcBerryYield(struct BerryTree *tree) { const struct Berry *berry = GetBerryInfo(tree->berry); u8 min = berry->minYield; @@ -1287,12 +1347,12 @@ u8 CalcBerryYield(struct BerryTree *tree) return CalcBerryYieldInternal(max, min, BerryTreeGetNumStagesWatered(tree)); } -u8 GetBerryCountByBerryTreeId(u8 id) +static u8 GetBerryCountByBerryTreeId(u8 id) { return gSaveBlock1.berryTrees[id].berryYield; } -u16 GetStageDurationByBerryType(u8 berry) +static u16 GetStageDurationByBerryType(u8 berry) { return GetBerryInfo(berry)->stageDuration * 60; } @@ -1301,18 +1361,23 @@ void FieldObjectInteractionGetBerryTreeData(void) { u8 id; u8 berry; - u8 unk; + u8 localId; u8 group; u8 num; id = FieldObjectGetBerryTreeId(gSelectedMapObject); berry = GetBerryTypeByBerryTreeId(id); ResetBerryTreeSparkleFlag(id); - unk = gScriptLastTalked; + localId = gScriptLastTalked; num = gSaveBlock1.location.mapNum; group = gSaveBlock1.location.mapGroup; - if (sub_8060234(unk, num, group)) - gSpecialVar_0x8004 = 0xFF; + if (IsBerryTreeSparkling(localId, num, group)) + { + // we cannot allow the player to grow/interact with the tree while the tree + // is undergoing the sparkling effect, so set the special var to the sparkling + // state and let the event script process the flag. + gSpecialVar_0x8004 = BERRY_STAGE_SPARKLING; + } else gSpecialVar_0x8004 = GetStageByBerryTreeId(id); gSpecialVar_0x8005 = GetNumStagesWateredByBerryTreeId(id); @@ -1320,7 +1385,7 @@ void FieldObjectInteractionGetBerryTreeData(void) GetBerryNameByBerryType(berry, gStringVar1); } -void sub_80B4EE4(void) +void Berry_FadeAndGoToBerryBagMenu(void) { SetMainCallback2(sub_80A68CC); } @@ -1347,11 +1412,13 @@ void FieldObjectInteractionRemoveBerryTree(void) sub_8060288(gScriptLastTalked, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); } -u8 PlayerHasBerries(void) +bool8 PlayerHasBerries(void) { return IsBagPocketNonEmpty(BAG_BERRIES); } +// whenever the player is not within view of the berry tree during its sparkle state, the +// sparkle state will be reset. void ResetBerryTreeSparkleFlags(void) { s16 cam_left; @@ -1369,7 +1436,7 @@ void ResetBerryTreeSparkleFlags(void) bottom = top + 8; for (i = 0; i < (u8)ARRAY_COUNT(gSaveBlock1.mapObjects); i++) { - if (gMapObjects[i].active && gMapObjects[i].animPattern == 12) + if (gMapObjects[i].active && gMapObjects[i].animPattern == 12) // is the object an active berry tree? { cam_left = gMapObjects[i].coords2.x; cam_top = gMapObjects[i].coords2.y; diff --git a/src/berry_tag_screen.c b/src/field/berry_tag_screen.c index 1413a02ca..1413a02ca 100644 --- a/src/berry_tag_screen.c +++ b/src/field/berry_tag_screen.c diff --git a/src/field/bike.c b/src/field/bike.c new file mode 100644 index 000000000..e36ae1798 --- /dev/null +++ b/src/field/bike.c @@ -0,0 +1,1051 @@ +#include "global.h" +#include "bike.h" +#include "field_map_obj.h" +#include "field_player_avatar.h" +#include "fieldmap.h" +#include "flags.h" +#include "global.fieldmap.h" +#include "metatile_behavior.h" +#include "overworld.h" +#include "songs.h" +#include "sound.h" + +extern bool8 gBikeCyclingChallenge; +extern u8 gBikeCollisions; +extern u8 gUnusedBikeCameraAheadPanback; + +static void MovePlayerOnMachBike(u8, u16, u16); +static u8 GetMachBikeTransition(u8 *); +static void MachBikeTransition_FaceDirection(u8); +static void MachBikeTransition_TurnDirection(u8); +static void MachBikeTransition_TrySpeedUp(u8); +static void MachBikeTransition_TrySlowDown(u8); +static void MovePlayerOnAcroBike(u8, u16, u16); +static u8 CheckMovementInputAcroBike(u8 *, u16, u16); +static u8 AcroBikeHandleInputNormal(u8 *, u16, u16); +static u8 AcroBikeHandleInputTurning(u8 *, u16, u16); +static u8 AcroBikeHandleInputWheelieStanding(u8 *, u16, u16); +static u8 AcroBikeHandleInputBunnyHop(u8 *, u16, u16); +static u8 AcroBikeHandleInputWheelieMoving(u8 *, u16, u16); +static u8 AcroBikeHandleInputSidewaysJump(u8 *, u16, u16); +static u8 AcroBikeHandleInputTurnJump(u8 *, u16, u16); +static void AcroBikeTransition_FaceDirection(u8); +static void AcroBikeTransition_TurnDirection(u8); +static void AcroBikeTransition_Moving(u8); +static void AcroBikeTransition_NormalToWheelie(u8); +static void AcroBikeTransition_WheelieToNormal(u8); +static void AcroBikeTransition_WheelieIdle(u8); +static void AcroBikeTransition_WheelieHoppingStanding(u8); +static void AcroBikeTransition_WheelieHoppingMoving(u8); +static void AcroBikeTransition_SideJump(u8); +static void AcroBikeTransition_TurnJump(u8); +static void AcroBikeTransition_WheelieMoving(u8); +static void AcroBikeTransition_WheelieRisingMoving(u8); +static void AcroBikeTransition_WheelieLoweringMoving(u8); +static void AcroBike_TryHistoryUpdate(u16, u16); +static u8 AcroBike_GetJumpDirection(void); +static void Bike_UpdateDirTimerHistory(u8); +static void Bike_UpdateABStartSelectHistory(u8); +static u8 Bike_DPadToDirection(u16); +static u8 get_some_collision(u8); +static u8 Bike_CheckCollisionTryAdvanceCollisionCount(struct MapObject *, s16, s16, u8, u8); +static bool8 IsRunningDisallowedByMetatile(u8); +static void Bike_TryAdvanceCyclingRoadCollisions(); +static u8 CanBikeFaceDirOnMetatile(u8, u8); +static bool8 WillPlayerCollideWithCollision(u8, u8); +static void Bike_SetBikeStill(void); + +/* + A bike transition is a type of callback for the bike that actually + modifies the bicycle's direction or momentum or otherwise movement. + Alternatively, a bike may also have input handlers which process the + bike transition to call: the acro bike has input handlers while the mach + bike does not. This is because the Acro needs to know the button inputs + for its complex tricks and actions. +*/ + +static void (*const sMachBikeTransitions[])(u8) = +{ + MachBikeTransition_FaceDirection, // Face vs Turn: Face has no anim while Turn does. Turn checks for collision because if you turn right as opposed to face right, if there is a wall there, turn will make a bonk sound effect while face will not. + MachBikeTransition_TurnDirection, + MachBikeTransition_TrySpeedUp, + MachBikeTransition_TrySlowDown, +}; + +// bikeFrameCounter is input which is represented by gMachBikeSpeeds in order: 0 is normal speed (1 speed), 1 is fast speed (2 speed), 2 is fastest speed (4 speed) +static void (*const sMachBikeSpeedCallbacks[])(u8) = +{ + PlayerGoSpeed1, // normal speed (1 speed) + PlayerGoSpeed2, // fast speed (2 speed) + PlayerGoSpeed4, // fastest speed (4 speed) +}; + +static void (*const sAcroBikeTransitions[])(u8) = +{ + AcroBikeTransition_FaceDirection, + AcroBikeTransition_TurnDirection, + AcroBikeTransition_Moving, + AcroBikeTransition_NormalToWheelie, + AcroBikeTransition_WheelieToNormal, + AcroBikeTransition_WheelieIdle, + AcroBikeTransition_WheelieHoppingStanding, + AcroBikeTransition_WheelieHoppingMoving, + AcroBikeTransition_SideJump, + AcroBikeTransition_TurnJump, + AcroBikeTransition_WheelieMoving, + AcroBikeTransition_WheelieRisingMoving, + AcroBikeTransition_WheelieLoweringMoving, +}; + +static u8 (*const sAcroBikeInputHandlers[])(u8 *, u16, u16) = +{ + AcroBikeHandleInputNormal, + AcroBikeHandleInputTurning, + AcroBikeHandleInputWheelieStanding, + AcroBikeHandleInputBunnyHop, + AcroBikeHandleInputWheelieMoving, + AcroBikeHandleInputSidewaysJump, + AcroBikeHandleInputTurnJump, +}; + +// used with bikeFrameCounter from mach bike +const u16 gMachBikeSpeeds[] = {SPEED_NORMAL, SPEED_FAST, SPEED_FASTEST}; + +// this is a list of timers to compare against later, terminated with 0. the only timer being compared against is 4 frames in this list. +static const u8 AcroBikeJumpTimerList[] = {4, 0}; + +// this is a list of history inputs to do in order to do the check to retrieve a jump direction for acro bike. it seems to be an extensible list, so its possible that Game Freak may have intended for the Acro Bike to have more complex tricks at some point. The final list only has the acro jump. +static const struct BikeHistoryInputInfo gAcroBikeTricksList[] = +{ + // the 0xF is a mask performed with each byte of the array in order to perform the check on only the last entry of the history list, otherwise the check wouldnt work as there can be 0xF0 as opposed to 0x0F. + {DIR_SOUTH, B_BUTTON, 0xF, 0xF, AcroBikeJumpTimerList, AcroBikeJumpTimerList, DIR_SOUTH}, + {DIR_NORTH, B_BUTTON, 0xF, 0xF, AcroBikeJumpTimerList, AcroBikeJumpTimerList, DIR_NORTH}, + {DIR_WEST, B_BUTTON, 0xF, 0xF, AcroBikeJumpTimerList, AcroBikeJumpTimerList, DIR_WEST}, + {DIR_EAST, B_BUTTON, 0xF, 0xF, AcroBikeJumpTimerList, AcroBikeJumpTimerList, DIR_EAST}, +}; + +void MovePlayerOnBike(u8 direction, u16 newKeys, u16 heldKeys) +{ + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE) + MovePlayerOnMachBike(direction, newKeys, heldKeys); + else + MovePlayerOnAcroBike(direction, newKeys, heldKeys); +} + +static void MovePlayerOnMachBike(u8 direction, u16 newKeys, u16 heldKeys) +{ + sMachBikeTransitions[GetMachBikeTransition(&direction)](direction); +} + +// dirTraveling is a variable that is 0 when the player is standing still. +static u8 GetMachBikeTransition(u8 *dirTraveling) +{ + // if the dir updated before this function, get the relevent new direction to check later. + u8 direction = player_get_direction_upper_nybble(); + + // is the player standing still? + if (*dirTraveling == 0) + { + *dirTraveling = direction; // update the direction, since below we either faced a direction or we started moving. + if (gPlayerAvatar.bikeSpeed == SPEED_STANDING) + { + gPlayerAvatar.runningState = NOT_MOVING; + return MACH_TRANS_FACE_DIRECTION; + } + gPlayerAvatar.runningState = MOVING; + return MACH_TRANS_START_MOVING; + } + + // we need to check if the last traveled direction changed from the new direction as well as ensuring that we dont update the state while the player is moving: see the else check. + if (*dirTraveling != direction && gPlayerAvatar.runningState != MOVING) + { + if (gPlayerAvatar.bikeSpeed != SPEED_STANDING) + { + *dirTraveling = direction; // implement the new direction + gPlayerAvatar.runningState = MOVING; + return MACH_TRANS_START_MOVING; + } + // if you didnt start moving but your dir was different, do a turn direction instead. + gPlayerAvatar.runningState = TURN_DIRECTION; + return MACH_TRANS_TURN_DIRECTION; + } + else // the player is either going in the current direction and hasnt changed or their state is currently moving. + { + gPlayerAvatar.runningState = MOVING; + return MACH_TRANS_KEEP_MOVING; + } +} + +// the difference between face direction and turn direction is that one changes direction while the other does the animation of turning as well as changing direction. +static void MachBikeTransition_FaceDirection(u8 direction) +{ + PlayerFaceDirection(direction); + Bike_SetBikeStill(); +} + +static void MachBikeTransition_TurnDirection(u8 direction) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E)) + { + PlayerTurnInPlace(direction); + Bike_SetBikeStill(); + } + else + { + MachBikeTransition_FaceDirection(playerMapObj->mapobj_unk_18); + } +} + +static void MachBikeTransition_TrySpeedUp(u8 direction) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + u8 collision; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == FALSE) + { + // we cannot go forward, so either slow down or, if we are stopped, idle face direction. + if (gPlayerAvatar.bikeSpeed) + MachBikeTransition_TrySlowDown(playerMapObj->placeholder18); + else + MachBikeTransition_FaceDirection(playerMapObj->placeholder18); + } + else + { + collision = get_some_collision(direction); + if (collision > 0 && collision < 12) + { + // we hit a solid object, but check to see if its a ledge and then jump. + if (collision == COLLISION_LEDGE_JUMP) + { + PlayerJumpLedge(direction); + } + else + { + // we hit a solid object that is not a ledge, so perform the collision. + Bike_SetBikeStill(); + if (collision < 5 || collision > 8) + PlayerOnBikeCollide(direction); + } + } + else + { + // we did not hit anything that can slow us down, so perform the advancement callback depending on the bikeFrameCounter and try to increase the mach bike's speed. + sMachBikeSpeedCallbacks[gPlayerAvatar.bikeFrameCounter](direction); + gPlayerAvatar.bikeSpeed = gPlayerAvatar.bikeFrameCounter + (gPlayerAvatar.bikeFrameCounter >> 1); // same as dividing by 2, but compiler is insistent on >> 1 + if (gPlayerAvatar.bikeFrameCounter < 2) // do not go faster than the last element in the mach bike array + gPlayerAvatar.bikeFrameCounter++; + } + } +} + +static void MachBikeTransition_TrySlowDown(u8 var) +{ + u8 collision; + + if (gPlayerAvatar.bikeSpeed != SPEED_STANDING) + gPlayerAvatar.bikeFrameCounter = --gPlayerAvatar.bikeSpeed; + + collision = get_some_collision(var); + + if (collision > 0 && collision < 12) + { + if (collision == COLLISION_LEDGE_JUMP) + { + PlayerJumpLedge(var); + } + else + { + Bike_SetBikeStill(); + if (collision < 5 || collision > 8) + PlayerOnBikeCollide(var); + } + } + else + { + sMachBikeSpeedCallbacks[gPlayerAvatar.bikeFrameCounter](var); + } +} + +// the acro bike requires the input handler to be executed before the transition can. +static void MovePlayerOnAcroBike(u8 newDirection, u16 newKeys, u16 heldKeys) +{ + sAcroBikeTransitions[CheckMovementInputAcroBike(&newDirection, newKeys, heldKeys)](newDirection); +} + +static u8 CheckMovementInputAcroBike(u8 *newDirection, u16 newKeys, u16 heldKeys) +{ + return sAcroBikeInputHandlers[gPlayerAvatar.acroBikeState](newDirection, newKeys, heldKeys); +} + +static u8 AcroBikeHandleInputNormal(u8 *newDirection, u16 newKeys, u16 heldKeys) +{ + u8 direction = player_get_direction_upper_nybble(); + + gPlayerAvatar.bikeFrameCounter = 0; + if (*newDirection == DIR_NONE) + { + if (newKeys & B_BUTTON) + { + //We're standing still with the B button held. + //Do a wheelie. + *newDirection = direction; + gPlayerAvatar.runningState = NOT_MOVING; + gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; + return ACRO_TRANS_NORMAL_TO_WHEELIE; + } + else + { + *newDirection = direction; + gPlayerAvatar.runningState = NOT_MOVING; + return ACRO_TRANS_FACE_DIRECTION; + } + } + if (*newDirection == direction && (heldKeys & B_BUTTON) && gPlayerAvatar.bikeSpeed == SPEED_STANDING) + { + gPlayerAvatar.bikeSpeed++; + gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_MOVING; + return ACRO_TRANS_WHEELIE_RISING_MOVING; + } + if (*newDirection != direction && gPlayerAvatar.runningState != MOVING) + { + gPlayerAvatar.acroBikeState = ACRO_STATE_TURNING; + gPlayerAvatar.newDirBackup = *newDirection; + gPlayerAvatar.runningState = NOT_MOVING; + return CheckMovementInputAcroBike(newDirection, newKeys, heldKeys); + } + gPlayerAvatar.runningState = MOVING; + return ACRO_TRANS_MOVING; +} + +static u8 AcroBikeHandleInputTurning(u8 *newDirection, u16 newKeys, u16 heldKeys) +{ + u8 direction; + + *newDirection = gPlayerAvatar.newDirBackup; + gPlayerAvatar.bikeFrameCounter++; + + // Wait 6 frames before actually changing direction + if (gPlayerAvatar.bikeFrameCounter > 6) // ... because it takes 6 frames to advance 1 tile. + { + gPlayerAvatar.runningState = TURN_DIRECTION; + gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; + Bike_SetBikeStill(); + return ACRO_TRANS_TURN_DIRECTION; + } + direction = player_get_direction_upper_nybble(); + if (*newDirection == AcroBike_GetJumpDirection()) + { + Bike_SetBikeStill(); // Bike_SetBikeStill sets speed to standing, but the next line immediately overrides it. could have just reset acroBikeState to 0 here instead of wasting a jump. + gPlayerAvatar.bikeSpeed = SPEED_NORMAL; + if (*newDirection == GetOppositeDirection(direction)) + { + // do a turn jump. + // no need to update runningState, didnt move. + gPlayerAvatar.acroBikeState = ACRO_STATE_TURN_JUMP; + return ACRO_TRANS_TURN_JUMP; + } + else + { + // do a sideways jump. + gPlayerAvatar.runningState = MOVING; // we need to move, set state to moving. + gPlayerAvatar.acroBikeState = ACRO_STATE_SIDE_JUMP; + return ACRO_TRANS_SIDE_JUMP; + } + } + *newDirection = direction; + return ACRO_TRANS_FACE_DIRECTION; +} + +static u8 AcroBikeHandleInputWheelieStanding(u8 *newDirection, u16 newKeys, u16 heldKeys) +{ + u8 direction; + struct MapObject *playerMapObj; + + direction = player_get_direction_upper_nybble(); + playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + gPlayerAvatar.runningState = NOT_MOVING; + + if (heldKeys & B_BUTTON) + gPlayerAvatar.bikeFrameCounter++; + else + { + // B button was released. + gPlayerAvatar.bikeFrameCounter = 0; + if (!MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) + { + // Go back to normal on flat ground + *newDirection = direction; + gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; + Bike_SetBikeStill(); + return ACRO_TRANS_WHEELIE_TO_NORMAL; + } + } + if (gPlayerAvatar.bikeFrameCounter >= 40) + { + *newDirection = direction; + gPlayerAvatar.acroBikeState = ACRO_STATE_BUNNY_HOP; + Bike_SetBikeStill(); + return ACRO_TRANS_WHEELIE_HOPPING_STANDING; + } + if (*newDirection == direction) + { + gPlayerAvatar.runningState = MOVING; + gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_MOVING; + Bike_SetBikeStill(); + return ACRO_TRANS_WHEELIE_MOVING; + } + if (*newDirection == 0) + { + *newDirection = direction; + return ACRO_TRANS_WHEELIE_IDLE; + } + gPlayerAvatar.runningState = TURN_DIRECTION; + return ACRO_TRANS_WHEELIE_IDLE; +} + +static u8 AcroBikeHandleInputBunnyHop(u8 *newDirection, u16 newKeys, u16 heldKeys) +{ + u8 direction; + struct MapObject *playerMapObj; + + direction = player_get_direction_upper_nybble(); + playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (!(heldKeys & B_BUTTON)) + { + // B button was released + Bike_SetBikeStill(); + if (MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) + { + // even though B was released, dont undo the wheelie on the bumpy slope. + gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; + return CheckMovementInputAcroBike(newDirection, newKeys, heldKeys); + } + else + { + // .. otherwise, go back to normal on flat ground + *newDirection = direction; + gPlayerAvatar.runningState = NOT_MOVING; + gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; + return ACRO_TRANS_WHEELIE_TO_NORMAL; + } + } + + // B Button is still held + + if (*newDirection == DIR_NONE) + { + // we did not move, so keep hopping in place without moving. + *newDirection = direction; + gPlayerAvatar.runningState = NOT_MOVING; + return ACRO_TRANS_WHEELIE_HOPPING_STANDING; + } + if (*newDirection != direction && gPlayerAvatar.runningState != MOVING) + { + // we changed direction, so turn but do not move hop. + gPlayerAvatar.runningState = TURN_DIRECTION; + return ACRO_TRANS_WHEELIE_HOPPING_STANDING; + } + // otherwise, we started moving while hopping + gPlayerAvatar.runningState = MOVING; + return ACRO_TRANS_WHEELIE_HOPPING_MOVING; +} + +static u8 AcroBikeHandleInputWheelieMoving(u8 *newDirection, u16 newKeys, u16 heldKeys) +{ + u8 direction; + struct MapObject *playerMapObj; + + direction = player_get_direction_lower_nybble(); + playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (!(heldKeys & B_BUTTON)) + { + // we were moving on a wheelie, but we let go while moving. reset bike still status + Bike_SetBikeStill(); + if (!MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) + { + // we let go of B and arent on a bumpy slope, set state to normal because now we need to handle this + gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; + if (*newDirection == DIR_NONE) + { + // we stopped moving but are turning, still try to lower the wheelie in place. + *newDirection = direction; + gPlayerAvatar.runningState = NOT_MOVING; + return ACRO_TRANS_WHEELIE_TO_NORMAL; + } + if (*newDirection != direction && gPlayerAvatar.runningState != MOVING) + { + // we did not turn while lowering wheelie, so do so without turning. + gPlayerAvatar.runningState = NOT_MOVING; + return ACRO_TRANS_WHEELIE_TO_NORMAL; + } + // if we are moving while lowering wheelie, put the acro into a lowering state while moving. + gPlayerAvatar.runningState = MOVING; + return ACRO_TRANS_WHEELIE_LOWERING_MOVING; + } + // please do not undo the wheelie on a bumpy slope + gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; + return CheckMovementInputAcroBike(newDirection, newKeys, heldKeys); + } + // we are still holding B. + if (*newDirection == DIR_NONE) + { + // idle the wheelie in place because we're holding B without moving. + *newDirection = direction; + gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; + gPlayerAvatar.runningState = NOT_MOVING; + Bike_SetBikeStill(); + return ACRO_TRANS_WHEELIE_IDLE; + } + if (direction != *newDirection && gPlayerAvatar.runningState != MOVING) + { + gPlayerAvatar.runningState = NOT_MOVING; + return ACRO_TRANS_WHEELIE_IDLE; + } + gPlayerAvatar.runningState = MOVING; + return ACRO_TRANS_WHEELIE_MOVING; +} + +static u8 AcroBikeHandleInputSidewaysJump(u8 *ptr, u16 newKeys, u16 heldKeys) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + playerMapObj->mapobj_bit_9 = 0; + FieldObjectSetDirection(playerMapObj, playerMapObj->mapobj_unk_18); + gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; + return CheckMovementInputAcroBike(ptr, newKeys, heldKeys); +} + +static u8 AcroBikeHandleInputTurnJump(u8 *ptr, u16 newKeys, u16 heldKeys) +{ + gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; + return CheckMovementInputAcroBike(ptr, newKeys, heldKeys); +} + +static void AcroBikeTransition_FaceDirection(u8 direction) +{ + PlayerFaceDirection(direction); +} + +static void AcroBikeTransition_TurnDirection(u8 direction) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + direction = playerMapObj->placeholder18; + PlayerFaceDirection(direction); +} + +static void AcroBikeTransition_Moving(u8 direction) +{ + u8 collision; + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + { + AcroBikeTransition_FaceDirection(playerMapObj->placeholder18); + return; + } + collision = get_some_collision(direction); + if (collision > 0 && collision < 12) + { + if (collision == COLLISION_LEDGE_JUMP) + PlayerJumpLedge(direction); + else if (collision < 5 || collision > 8) + PlayerOnBikeCollide(direction); + } + else + { + npc_use_some_d2s(direction); + } +} + +static void AcroBikeTransition_NormalToWheelie(u8 direction) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + direction = playerMapObj->placeholder18; + PlayerStartWheelie(direction); +} + +static void AcroBikeTransition_WheelieToNormal(u8 direction) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + direction = playerMapObj->placeholder18; + PlayerEndWheelie(direction); +} + +static void AcroBikeTransition_WheelieIdle(u8 direction) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + direction = playerMapObj->placeholder18; + PlayerIdleWheelie(direction); +} + +static void AcroBikeTransition_WheelieHoppingStanding(u8 direction) +{ + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + direction = playerMapObj->placeholder18; + PlayerStandingHoppingWheelie(direction); +} + +static void AcroBikeTransition_WheelieHoppingMoving(u8 direction) +{ + u8 var; + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + { + AcroBikeTransition_WheelieHoppingStanding(playerMapObj->placeholder18); + return; + } + var = get_some_collision(direction); + //TODO: Try to get rid of this goto + if (var == 0 || var == 9) + { + goto derp; + } + else if (var == 6) + { + PlayerLedgeHoppingWheelie(direction); + } + else if (var < 5 || var > 8) + { + if (var <= 11) + { + AcroBikeTransition_WheelieHoppingStanding(direction); + } + else + { + derp: + PlayerMovingHoppingWheelie(direction); + } + } +} + +static void AcroBikeTransition_SideJump(u8 direction) +{ + u8 var; + struct MapObject *playerMapObj; + + var = get_some_collision(direction); + if (var != 0) + { + if (var == 7) + return; + if (var < 10) + { + AcroBikeTransition_TurnDirection(direction); + return; + } + if (WillPlayerCollideWithCollision(var, direction) == FALSE) + { + AcroBikeTransition_TurnDirection(direction); + return; + } + } + playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + PlaySE(SE_JITE_PYOKO); + playerMapObj->mapobj_bit_9 = 1; + PlayerSetAnimId(sub_80608A4(direction), 2); +} + +static void AcroBikeTransition_TurnJump(u8 direction) +{ + PlayerAcroTurnJump(direction); +} + +static void AcroBikeTransition_WheelieMoving(u8 direction) +{ + u8 var; + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + { + PlayerIdleWheelie(playerMapObj->placeholder18); + return; + } + var = get_some_collision(direction); + if (var > 0 && var < 12) + { + if (var == 6) + { + PlayerLedgeHoppingWheelie(direction); + } + else if (var == 9) + { + PlayerIdleWheelie(direction); + } + else if (var <= 4) + { + if (MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) + PlayerIdleWheelie(direction); + else + sub_80595DC(direction); //hit wall? + } + return; + } + sub_8059618(direction); + gPlayerAvatar.runningState = MOVING; +} + +static void AcroBikeTransition_WheelieRisingMoving(u8 direction) +{ + u8 var; + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + { + PlayerStartWheelie(playerMapObj->placeholder18); + return; + } + var = get_some_collision(direction); + if (var > 0 && var < 12) + { + if (var == 6) + { + PlayerLedgeHoppingWheelie(direction); + } + else if (var == 9) + { + PlayerIdleWheelie(direction); + } + else if (var <= 4) + { + if (MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) + PlayerIdleWheelie(direction); + else + sub_80595DC(direction); //hit wall? + } + return; + } + sub_8059600(direction); + gPlayerAvatar.runningState = MOVING; +} + +static void AcroBikeTransition_WheelieLoweringMoving(u8 direction) +{ + u8 var; + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + { + PlayerEndWheelie(playerMapObj->placeholder18); + return; + } + var = get_some_collision(direction); + if (var > 0 && var < 12) + { + if (var == 6) + PlayerJumpLedge(direction); + else if (var < 5 || var > 8) + PlayerEndWheelie(direction); + return; + } + sub_8059630(direction); +} + +void Bike_TryAcroBikeHistoryUpdate(u16 newKeys, u16 heldKeys) +{ + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE) + AcroBike_TryHistoryUpdate(newKeys, heldKeys); +} + +static void AcroBike_TryHistoryUpdate(u16 newKeys, u16 heldKeys) // newKeys is unused +{ + u8 direction = Bike_DPadToDirection(heldKeys); + + if (direction == (gPlayerAvatar.directionHistory & 0xF)) + { + // increment the timer for direction history since last input. + if (gPlayerAvatar.dirTimerHistory[0] < 0xFF) + gPlayerAvatar.dirTimerHistory[0]++; + } + else + { + Bike_UpdateDirTimerHistory(direction); + gPlayerAvatar.bikeSpeed = SPEED_STANDING; + } + + direction = heldKeys & (A_BUTTON | B_BUTTON | SELECT_BUTTON | START_BUTTON); // directions is reused for some reason. + if (direction == (gPlayerAvatar.abStartSelectHistory & 0xF)) + { + if (gPlayerAvatar.abStartSelectTimerHistory[0] < 0xFF) + gPlayerAvatar.abStartSelectTimerHistory[0]++; + } + else + { + Bike_UpdateABStartSelectHistory(direction); + gPlayerAvatar.bikeSpeed = SPEED_STANDING; + } +} + +static bool8 HasPlayerInputTakenLongerThanList(const u8 *dirTimerList, const u8 *abStartSelectTimerList) +{ + u8 i; + + for (i = 0; dirTimerList[i] != 0; i++) + { + if (gPlayerAvatar.dirTimerHistory[i] > dirTimerList[i]) + return FALSE; + } + for (i = 0; abStartSelectTimerList[i] != 0; i++) + { + if (gPlayerAvatar.abStartSelectTimerHistory[i] > abStartSelectTimerList[i]) + return FALSE; + } + return TRUE; +} + +static u8 AcroBike_GetJumpDirection(void) +{ + u32 i; + + for (i = 0; i < 4; i++) + { + const struct BikeHistoryInputInfo *historyInputInfo = &gAcroBikeTricksList[i]; + u32 dirHistory = gPlayerAvatar.directionHistory; + u32 abStartSelectHistory = gPlayerAvatar.abStartSelectHistory; + + dirHistory &= historyInputInfo->dirHistoryMask; + abStartSelectHistory &= historyInputInfo->abStartSelectHistoryMask; + if (dirHistory == historyInputInfo->dirHistoryMatch && abStartSelectHistory == historyInputInfo->abStartSelectHistoryMatch && HasPlayerInputTakenLongerThanList(historyInputInfo->dirTimerHistoryList, historyInputInfo->abStartSelectHistoryList)) + return historyInputInfo->direction; + } + return 0; +} + +static void Bike_UpdateDirTimerHistory(u8 dir) +{ + u8 i; + + gPlayerAvatar.directionHistory = (gPlayerAvatar.directionHistory << 4) | (dir & 0xF); + + for (i = 7; i != 0; i--) + gPlayerAvatar.dirTimerHistory[i] = gPlayerAvatar.dirTimerHistory[i - 1]; + gPlayerAvatar.dirTimerHistory[0] = 1; +} + +static void Bike_UpdateABStartSelectHistory(u8 input) +{ + u8 i; + + gPlayerAvatar.abStartSelectHistory = (gPlayerAvatar.abStartSelectHistory << 4) | (input & 0xF); + + for (i = 7; i != 0; i--) + gPlayerAvatar.abStartSelectTimerHistory[i] = gPlayerAvatar.abStartSelectTimerHistory[i - 1]; + gPlayerAvatar.abStartSelectTimerHistory[0] = 1; +} + +static u8 Bike_DPadToDirection(u16 heldKeys) +{ + if (heldKeys & DPAD_UP) + return DIR_NORTH; + if (heldKeys & DPAD_DOWN) + return DIR_SOUTH; + if (heldKeys & DPAD_LEFT) + return DIR_WEST; + if (heldKeys & DPAD_RIGHT) + return DIR_EAST; + return DIR_NONE; +} + +static u8 get_some_collision(u8 direction) +{ + s16 x; + s16 y; + u8 metatitleBehavior; + struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + + x = playerMapObj->coords2.x; + y = playerMapObj->coords2.y; + MoveCoords(direction, &x, &y); + metatitleBehavior = MapGridGetMetatileBehaviorAt(x, y); + return Bike_CheckCollisionTryAdvanceCollisionCount(playerMapObj, x, y, direction, metatitleBehavior); +} + +static u8 Bike_CheckCollisionTryAdvanceCollisionCount(struct MapObject *mapObject, s16 x, s16 y, u8 direction, u8 metatitleBehavior) +{ + u8 collision = CheckForFieldObjectCollision(mapObject, x, y, direction, metatitleBehavior); + + if (collision > 4) + return collision; + + if (collision == 0 && IsRunningDisallowedByMetatile(metatitleBehavior)) + collision = 2; + + if (collision) + Bike_TryAdvanceCyclingRoadCollisions(); + + return collision; +} + +bool8 IsRunningDisallowed(u8 tile) +{ + if (IsRunningDisallowedByMetatile(tile) != FALSE || gMapHeader.mapType == MAP_TYPE_INDOOR) + return TRUE; + else + return FALSE; +} + +static bool8 IsRunningDisallowedByMetatile(u8 tile) +{ + if (MetatileBehavior_IsRunningDisallowed(tile)) + return TRUE; + if (MetatileBehavior_IsFortreeBridge(tile) && (PlayerGetZCoord() & 1) == 0) + return TRUE; + return FALSE; +} + +static void Bike_TryAdvanceCyclingRoadCollisions(void) +{ + if (gBikeCyclingChallenge != FALSE && gBikeCollisions < 100) + gBikeCollisions++; +} + +static bool8 CanBikeFaceDirOnMetatile(u8 direction, u8 tile) +{ + if (direction == DIR_EAST || direction == DIR_WEST) + { + //Bike cannot face east or west on a vertical rail + if (MetatileBehavior_IsIsolatedVerticalRail(tile) + || MetatileBehavior_IsVerticalRail(tile)) + return FALSE; + } + else + { + //Bike cannot face north or south on a horizontal rail + if (MetatileBehavior_IsIsolatedHorizontalRail(tile) + || MetatileBehavior_IsHorizontalRail(tile)) + return FALSE; + } + return TRUE; +} + +static bool8 WillPlayerCollideWithCollision(u8 newTileCollision, u8 direction) +{ + if (direction == DIR_NORTH || direction == DIR_SOUTH) + { + if (newTileCollision == 10 || newTileCollision == 12) + return FALSE; + } + else if (newTileCollision == 11 || newTileCollision == 13) + { + return FALSE; + } + + return TRUE; +} + +bool8 IsBikingDisallowedByPlayer(void) +{ + s16 x, y; + u8 tileBehavior; + + if (!(gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_4))) + { + PlayerGetDestCoords(&x, &y); + tileBehavior = MapGridGetMetatileBehaviorAt(x, y); + if (!IsRunningDisallowedByMetatile(tileBehavior)) + return FALSE; + } + return TRUE; +} + +bool8 player_should_look_direction_be_enforced_upon_movement(void) +{ + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE) != FALSE && MetatileBehavior_IsBumpySlope(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E) != FALSE) + return FALSE; + else + return TRUE; +} + +void GetOnOffBike(u8 var) +{ + gUnusedBikeCameraAheadPanback = FALSE; + + if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) + { + SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); + Overworld_ClearSavedMusic(); + Overworld_PlaySpecialMapMusic(); + } + else + { + SetPlayerAvatarTransitionFlags(var); + Overworld_SetSavedMusic(BGM_CYCLING); + Overworld_ChangeMusicTo(BGM_CYCLING); + } +} + +void BikeClearState(int newDirHistory, int newAbStartHistory) +{ + u8 i; + + gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; + gPlayerAvatar.newDirBackup = DIR_NONE; + gPlayerAvatar.bikeFrameCounter = 0; + gPlayerAvatar.bikeSpeed = SPEED_STANDING; + gPlayerAvatar.directionHistory = newDirHistory; + gPlayerAvatar.abStartSelectHistory = newAbStartHistory; + + for (i = 0; i < 8; i++) + gPlayerAvatar.dirTimerHistory[i] = 0; + + for (i = 0; i < 8; i++) + gPlayerAvatar.abStartSelectTimerHistory[i] = 0; +} + +void Bike_UpdateBikeCounterSpeed(u8 counter) +{ + gPlayerAvatar.bikeFrameCounter = counter; + gPlayerAvatar.bikeSpeed = gPlayerAvatar.bikeFrameCounter + (gPlayerAvatar.bikeFrameCounter >> 1); // lazy way of multiplying by 1.5. +} + +static void Bike_SetBikeStill(void) +{ + gPlayerAvatar.bikeFrameCounter = 0; + gPlayerAvatar.bikeSpeed = SPEED_STANDING; +} + +s16 GetPlayerSpeed(void) +{ + // because the player pressed a direction, it won't ever return a speed of 0 since this function returns the player's current speed. + s16 machSpeeds[3]; + + memcpy(machSpeeds, gMachBikeSpeeds, sizeof(machSpeeds)); + + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE) + return machSpeeds[gPlayerAvatar.bikeFrameCounter]; + else if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE) + return SPEED_FASTER; + else if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_DASH)) + return SPEED_FAST; + else + return SPEED_NORMAL; +} + +void Bike_HandleBumpySlopeJump(void) +{ + s16 x, y; + u8 tileBehavior; + + if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE) + { + PlayerGetDestCoords(&x, &y); + tileBehavior = MapGridGetMetatileBehaviorAt(x, y); + if (MetatileBehavior_IsBumpySlope(tileBehavior)) + { + gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; + sub_8059C94(player_get_direction_upper_nybble()); + } + } +} diff --git a/src/birch_pc.c b/src/field/birch_pc.c index 5fb6427c3..9872dd54d 100644 --- a/src/birch_pc.c +++ b/src/field/birch_pc.c @@ -91,15 +91,15 @@ const u8 *GetPokedexRatingText(u16 count) return gBirchDexRatingText_LessThan200; if (count == 200) { - if (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_JIRACHI), 1) - || GetNationalPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_DEOXYS), 1)) // Jirachi or Deoxys is not counted towards the dex completion. If either of these flags are enabled, it means the actual count is less than 200. + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_JIRACHI), 1) + || GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_DEOXYS), 1)) // Jirachi or Deoxys is not counted towards the dex completion. If either of these flags are enabled, it means the actual count is less than 200. return gBirchDexRatingText_LessThan200; return gBirchDexRatingText_DexCompleted; } if (count == 201) { - if (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_JIRACHI), 1) - && GetNationalPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_DEOXYS), 1)) // If both of these flags are enabled, it means the actual count is less than 200. + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_JIRACHI), 1) + && GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_DEOXYS), 1)) // If both of these flags are enabled, it means the actual count is less than 200. return gBirchDexRatingText_LessThan200; return gBirchDexRatingText_DexCompleted; } diff --git a/src/braille_puzzles.c b/src/field/braille_puzzles.c index b11b1ff3a..b11b1ff3a 100644 --- a/src/braille_puzzles.c +++ b/src/field/braille_puzzles.c diff --git a/src/choose_party.c b/src/field/choose_party.c index 9cdf63fc8..adb210e7b 100644 --- a/src/choose_party.c +++ b/src/field/choose_party.c @@ -18,71 +18,23 @@ #include "task.h" #include "text.h" -struct UnknownPokemonStruct2 -{ - /*0x00*/ u16 species; - /*0x02*/ u16 heldItem; - /*0x04*/ u8 nickname[11]; - /*0x0F*/ u8 level; - /*0x10*/ u16 hp; - /*0x12*/ u16 maxhp; - /*0x14*/ u32 status; - /*0x18*/ u32 personality; - /*0x1C*/ u8 gender; - /*0x1D*/ u8 language; -}; - extern u8 gPlayerPartyCount; extern u8 gLastFieldPokeMenuOpened; extern u8 gUnknown_020384F0; extern struct UnknownPokemonStruct2 gUnknown_02023A00[]; extern u8 gUnknown_0202E8F6; extern struct Pokemon gUnknown_030042FC[]; -extern const u16 gBattleTowerBanlist[]; +extern const u16 gBattleTowerBannedSpecies[]; EWRAM_DATA u8 gSelectedOrderFromParty[3] = {0}; -extern void OpenPartyMenu(); -extern void TryCreatePartyMenuMonIcon(u8, u8, struct Pokemon *); -extern void LoadHeldItemIconGraphics(void); -extern void CreateHeldItemIcons_806DC34(); extern u8 sub_806BD58(u8, u8); extern void PartyMenuPrintMonsLevelOrStatus(void); -extern void PrintPartyMenuMonNicknames(void); extern void sub_806BC3C(u8, u8); -extern u8 sub_806B58C(u8); -extern u16 sub_806BE38(); -extern u8 sub_806CA38(); -extern TaskFunc PartyMenuGetPopupMenuFunc(u8, const struct PartyPopupMenu *, const struct PartyMenuItem *, u8); -extern u8 sub_806B124(); -extern void sub_806C994(); -extern void sub_806C658(); -extern void sub_806AEDC(void); -extern void sub_806AF4C(); extern void ShowPokemonSummaryScreen(struct Pokemon *, u8, u8, void (*)(void), int); -extern void sub_806C890(); -extern void sub_806D5A4(); -extern void sub_806B908(void); -extern void CreateMonIcon_806D99C(int, u8, int, struct UnknownPokemonStruct2 *); -extern void sub_806D50C(int, u8); -extern void CreatePartyMenuMonIcon(); -extern void CreateHeldItemIcon_806DCD4(int, u8, int); extern u8 GetMonStatusAndPokerus(); extern void PartyMenuPrintHP(); -extern void PartyMenuPutStatusTilemap(u8, int, u8); -extern void PartyMenuPrintLevel(); -extern void PartyMenuPutNicknameTilemap(); -extern void PrintPartyMenuMonNickname(); -extern void PartyMenuDrawHPBar(); extern bool8 sub_80F9344(void); -extern void sub_806D4AC(); -extern void sub_806D3B4(); -extern void PartyMenuDoPrintLevel(u8, u8, u8); -extern void PartyMenuDoDrawHPBar(u8, u8, u16, u16); -extern void PartyMenuDoPutNicknameTilemap(u16, u8, u8, u8, const u8 *); -extern void box_print(u8, int, const u8 *); -extern void sub_806BCE8(void); -extern void sub_806E750(u8, const struct PartyPopupMenu *, const struct PartyMenuItem *, int); static void ClearPartySelection(void); static bool8 IsMonAllowedInBattleTower(struct Pokemon *); @@ -106,14 +58,14 @@ void sub_8121E10(void) { ClearPartySelection(); ewram1B000.unk263 = 0; - OpenPartyMenu(4, 0); + OpenPartyMenu(PARTY_MENU_TYPE_BATTLE_TOWER, 0); } void sub_8121E34(void) { ClearPartySelection(); ewram1B000.unk263 = 1; - OpenPartyMenu(4, 0); + OpenPartyMenu(PARTY_MENU_TYPE_BATTLE_TOWER, 0); } static void ClearPartySelection(void) @@ -124,50 +76,50 @@ static void ClearPartySelection(void) gSelectedOrderFromParty[i] = 0; } -bool8 sub_8121E78(void) +bool8 SetupBattleTowerPartyMenu(void) { u8 i; - switch (ewram1B000_alt.unk264) + switch (ewram1B000_alt.setupState) { case 0: - if (ewram1B000_alt.unk266 < gPlayerPartyCount) + if (ewram1B000_alt.monIndex < gPlayerPartyCount) { - TryCreatePartyMenuMonIcon(ewram1B000_alt.unk260, ewram1B000_alt.unk266, &gPlayerParty[ewram1B000_alt.unk266]); - ewram1B000_alt.unk266++; + TryCreatePartyMenuMonIcon(ewram1B000_alt.menuHandlerTaskId, ewram1B000_alt.monIndex, &gPlayerParty[ewram1B000_alt.monIndex]); + ewram1B000_alt.monIndex++; } else { - ewram1B000_alt.unk266 = 0; - ewram1B000_alt.unk264++; + ewram1B000_alt.monIndex = 0; + ewram1B000_alt.setupState++; } break; case 1: LoadHeldItemIconGraphics(); - ewram1B000_alt.unk264++; + ewram1B000_alt.setupState++; break; case 2: - CreateHeldItemIcons_806DC34(ewram1B000_alt.unk260); - ewram1B000_alt.unk264++; + CreateHeldItemIcons_806DC34(ewram1B000_alt.menuHandlerTaskId); + ewram1B000_alt.setupState++; break; case 3: - if (sub_806BD58(ewram1B000_alt.unk260, ewram1B000_alt.unk266) == 1) + if (sub_806BD58(ewram1B000_alt.menuHandlerTaskId, ewram1B000_alt.monIndex) == 1) { - ewram1B000_alt.unk266 = 0; - ewram1B000_alt.unk264++; + ewram1B000_alt.monIndex = 0; + ewram1B000_alt.setupState++; } else { - ewram1B000_alt.unk266++; + ewram1B000_alt.monIndex++; } break; case 4: PartyMenuPrintMonsLevelOrStatus(); - ewram1B000_alt.unk264++; + ewram1B000_alt.setupState++; break; case 5: PrintPartyMenuMonNicknames(); - ewram1B000_alt.unk264++; + ewram1B000_alt.setupState++; break; case 6: for (i = 0; i < gPlayerPartyCount; i++) @@ -190,18 +142,18 @@ bool8 sub_8121E78(void) sub_806BC3C(i, 0x7E); } } - ewram1B000_alt.unk264++; + ewram1B000_alt.setupState++; break; case 7: - if (sub_806B58C(ewram1B000_alt.unk266) == 1) + if (DrawPartyMonBackground(ewram1B000_alt.monIndex) == 1) { - ewram1B000_alt.unk266 = 0; - ewram1B000_alt.unk264 = 0; + ewram1B000_alt.monIndex = 0; + ewram1B000_alt.setupState = 0; return TRUE; } else { - ewram1B000_alt.unk266++; + ewram1B000_alt.monIndex++; } break; } @@ -224,15 +176,15 @@ static bool8 IsMonAllowedInBattleTower(struct Pokemon *pkmn) return TRUE; } - if ((gSaveBlock2.filler_A8.var_4AC & 1) == 0 + if ((gSaveBlock2.battleTower.battleTowerLevelType) == 0 && GetMonData(pkmn, MON_DATA_LEVEL) > 50) return FALSE; // Check if the pkmn is in the ban list species = GetMonData(pkmn, MON_DATA_SPECIES); - while (gBattleTowerBanlist[i] != 0xFFFF) + while (gBattleTowerBannedSpecies[i] != 0xFFFF) { - if (gBattleTowerBanlist[i] == species) + if (gBattleTowerBannedSpecies[i] == species) return FALSE; i++; } @@ -273,7 +225,7 @@ static void BattleTowerEntryMenuCallback_Enter(u8); static void BattleTowerEntryMenuCallback_NoEntry(u8); static void BattleTowerEntryMenuCallback_Exit(u8); -static const struct PartyMenuItem sBattleTowerEntryMenuItems[] = +static const struct MenuAction2 sBattleTowerEntryMenuItems[] = { {OtherText_Summary, BattleTowerEntryMenuCallback_Summary}, {OtherText_Enter2, BattleTowerEntryMenuCallback_Enter}, @@ -307,34 +259,34 @@ static bool8 IsPartyMemberAlreadySelected(u8 partyMember) static void sub_81221F8(u8 taskId) { - sub_806D538(5, 1); + PrintPartyMenuPromptText(5, 1); if (IsMonAllowedInBattleTower(&gPlayerParty[gLastFieldPokeMenuOpened]) == TRUE) { if (IsPartyMemberAlreadySelected(gLastFieldPokeMenuOpened + 1) == TRUE) { gTasks[taskId].data[4] = 1; - sub_806E750(1, sBattleTowerEntryMenu, sBattleTowerEntryMenuItems, 0); + ShowPartyPopupMenu(1, sBattleTowerEntryMenu, sBattleTowerEntryMenuItems, 0); } else { gTasks[taskId].data[4] = 0; - sub_806E750(0, sBattleTowerEntryMenu, sBattleTowerEntryMenuItems, 0); + ShowPartyPopupMenu(0, sBattleTowerEntryMenu, sBattleTowerEntryMenuItems, 0); } } else { gTasks[taskId].data[4] = 2; - sub_806E750(2, sBattleTowerEntryMenu, sBattleTowerEntryMenuItems, 0); + ShowPartyPopupMenu(2, sBattleTowerEntryMenu, sBattleTowerEntryMenuItems, 0); } } -void sub_81222B0(u8 taskId) +void HandleBattleTowerPartyMenu(u8 taskId) { if (!gPaletteFade.active) { - switch (sub_806BE38(taskId)) + switch (HandleBattleTowerPartyMenuInput(taskId)) { - case 1: + case A_BUTTON: PlaySE(SE_SELECT); gLastFieldPokeMenuOpened = sub_806CA38(taskId); if (gLastFieldPokeMenuOpened != 6) @@ -349,7 +301,7 @@ void sub_81222B0(u8 taskId) } sub_808B5B4(taskId); break; - case 2: + case B_BUTTON: PlaySE(SE_SELECT); ClearPartySelection(); BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); @@ -426,7 +378,7 @@ static void sub_81224A8(u8 taskId) if (val != 0xFF) { - sub_806D538(val, 0); + PrintPartyMenuPromptText(val, 0); gTasks[taskId].func = sub_8122480; } else @@ -439,7 +391,7 @@ static void sub_81224A8(u8 taskId) else { PlaySE(SE_HAZURE); - sub_806D538(14, 0); + PrintPartyMenuPromptText(14, 0); gTasks[taskId].func = sub_8122480; } } @@ -450,14 +402,14 @@ static void sub_8122530(void) { while (1) { - if (sub_806B124() == 1) + if (InitPartyMenu() == TRUE) { - sub_806C994(ewram1B000.unk260, gUnknown_020384F0); - sub_806C658(ewram1B000.unk260, 0); + sub_806C994(ewram1B000.menuHandlerTaskId, gUnknown_020384F0); + ChangeBattleTowerPartyMenuSelection(ewram1B000.menuHandlerTaskId, 0); GetMonNickname(&gPlayerParty[gUnknown_020384F0], gStringVar1); gLastFieldPokeMenuOpened = gUnknown_020384F0; - sub_81221F8(ewram1B000.unk260); - SetMainCallback2(sub_806AEDC); + sub_81221F8(ewram1B000.menuHandlerTaskId); + SetMainCallback2(CB2_PartyMenuMain); break; } if (sub_80F9344() == 1) @@ -468,7 +420,7 @@ static void sub_8122530(void) static void sub_81225A4(void) { gPaletteFade.bufferTransferDisabled = TRUE; - sub_806AF4C(4, 0xFF, sub_812238C, 5); + SetPartyMenuSettings(PARTY_MENU_TYPE_BATTLE_TOWER, 0xFF, sub_812238C, 5); SetMainCallback2(sub_8122530); } @@ -503,7 +455,7 @@ static void BattleTowerEntryMenuCallback_Enter(u8 taskId) gSelectedOrderFromParty[i] = gLastFieldPokeMenuOpened + 1; sub_806BC3C(gLastFieldPokeMenuOpened, i * 14 + 0x1C); if (i == 2) - sub_806C890(taskId); + SelectBattleTowerOKButton(taskId); BattleTowerEntryMenuCallback_Exit(taskId); return; } @@ -565,8 +517,8 @@ static void sub_81227FC(u8 taskId) { MenuZeroFillWindowRect(20, 10, 29, 19); HandleDestroyMenuCursors(); - sub_806D538(0, 0); - gTasks[taskId].func = sub_81222B0; + PrintPartyMenuPromptText(0, 0); + gTasks[taskId].func = HandleBattleTowerPartyMenu; } static void BattleTowerEntryMenuCallback_Exit(u8 taskId) @@ -575,25 +527,25 @@ static void BattleTowerEntryMenuCallback_Exit(u8 taskId) sub_81227FC(taskId); } -bool8 sub_8122854(void) +bool8 SetupLinkMultiBattlePartyMenu(void) { - switch (ewram1B000_alt.unk264) + switch (ewram1B000_alt.setupState) { case 0: - sub_81228E8(ewram1B000_alt.unk260); - ewram1B000_alt.unk264++; + sub_81228E8(ewram1B000_alt.menuHandlerTaskId); + ewram1B000_alt.setupState++; break; case 1: LoadHeldItemIconGraphics(); - ewram1B000_alt.unk264++; + ewram1B000_alt.setupState++; break; case 2: - sub_8122950(ewram1B000_alt.unk260); - ewram1B000_alt.unk264++; + sub_8122950(ewram1B000_alt.menuHandlerTaskId); + ewram1B000_alt.setupState++; break; case 3: sub_81229B8(); - ewram1B000_alt.unk264++; + ewram1B000_alt.setupState++; break; case 4: sub_806B908(); @@ -612,7 +564,7 @@ static void sub_81228E8(u8 a) CreatePartyMenuMonIcon(a, i, 3, &gPlayerParty[i]); if (gUnknown_02023A00[i].species != 0) { - CreateMonIcon_806D99C(a, i + 3, 3, &gUnknown_02023A00[i]); + CreateMonIcon_LinkMultiBattle(a, i + 3, 3, &gUnknown_02023A00[i]); sub_806D50C(a, i + 3); } } @@ -651,14 +603,14 @@ static void sub_81229B8(void) PartyMenuPutStatusTilemap(i, 3, status - 1); else PartyMenuPrintLevel(i, 3, &gPlayerParty[i]); - PartyMenuPutNicknameTilemap(i, 3, &gPlayerParty[i]); + PartyMenuPrintGenderIcon(i, 3, &gPlayerParty[i]); PrintPartyMenuMonNickname(i, 3, &gPlayerParty[i]); PartyMenuDrawHPBar(i, 3, &gPlayerParty[i]); } } } -void sub_8122A48(u8 taskId) +void HandleLinkMultiBattlePartyMenu(u8 taskId) { if (!gPaletteFade.active) { @@ -701,11 +653,11 @@ static void sub_8122B10(u8 taskId) PartyMenuPutStatusTilemap(i + 3, 3, r2 - 1); else PartyMenuDoPrintLevel(i + 3, 3, gUnknown_02023A00[i].level); - PartyMenuDoPutNicknameTilemap(gUnknown_02023A00[i].species, gUnknown_02023A00[i].gender, 3, i + 3, gUnknown_02023A00[i].nickname); + PartyMenuDoPrintGenderIcon(gUnknown_02023A00[i].species, gUnknown_02023A00[i].gender, 3, i + 3, gUnknown_02023A00[i].nickname); StringCopy(gStringVar1, gUnknown_02023A00[i].nickname); StringGetEnd10(gStringVar1); SanitizeNameString(gStringVar1); - box_print(i + 3, 3, gStringVar1); + PartyMenuDoPrintMonNickname(i + 3, 3, gStringVar1); PartyMenuDoDrawHPBar(i + 3, 3, gUnknown_02023A00[i].hp, gUnknown_02023A00[i].maxhp); } } @@ -723,64 +675,64 @@ static void sub_8122C18(u8 taskId) } } -// Exactly the same as sub_8121E78 except for case 6 +// Exactly the same as SetupBattleTowerPartyMenu except for case 6 bool8 unref_sub_8122C60(void) { - switch (ewram1B000_alt.unk264) + switch (ewram1B000_alt.setupState) { case 0: - if (ewram1B000_alt.unk266 < gPlayerPartyCount) + if (ewram1B000_alt.monIndex < gPlayerPartyCount) { - TryCreatePartyMenuMonIcon(ewram1B000_alt.unk260, ewram1B000_alt.unk266, &gPlayerParty[ewram1B000_alt.unk266]); - ewram1B000_alt.unk266++; + TryCreatePartyMenuMonIcon(ewram1B000_alt.menuHandlerTaskId, ewram1B000_alt.monIndex, &gPlayerParty[ewram1B000_alt.monIndex]); + ewram1B000_alt.monIndex++; } else { - ewram1B000_alt.unk266 = 0; - ewram1B000_alt.unk264++; + ewram1B000_alt.monIndex = 0; + ewram1B000_alt.setupState++; } break; case 1: LoadHeldItemIconGraphics(); - ewram1B000_alt.unk264++; + ewram1B000_alt.setupState++; break; case 2: - CreateHeldItemIcons_806DC34(ewram1B000_alt.unk260); - ewram1B000_alt.unk264++; + CreateHeldItemIcons_806DC34(ewram1B000_alt.menuHandlerTaskId); + ewram1B000_alt.setupState++; break; case 3: - if (sub_806BD58(ewram1B000_alt.unk260, ewram1B000_alt.unk266) == 1) + if (sub_806BD58(ewram1B000_alt.menuHandlerTaskId, ewram1B000_alt.monIndex) == 1) { - ewram1B000_alt.unk266 = 0; - ewram1B000_alt.unk264++; + ewram1B000_alt.monIndex = 0; + ewram1B000_alt.setupState++; } else { - ewram1B000_alt.unk266++; + ewram1B000_alt.monIndex++; } break; case 4: PartyMenuPrintMonsLevelOrStatus(); - ewram1B000_alt.unk264++; + ewram1B000_alt.setupState++; break; case 5: PrintPartyMenuMonNicknames(); - ewram1B000_alt.unk264++; + ewram1B000_alt.setupState++; break; case 6: sub_806BCE8(); - ewram1B000_alt.unk264++; + ewram1B000_alt.setupState++; break; case 7: - if (sub_806B58C(ewram1B000_alt.unk266) == 1) + if (DrawPartyMonBackground(ewram1B000_alt.monIndex) == 1) { - ewram1B000_alt.unk266 = 0; - ewram1B000_alt.unk264 = 0; + ewram1B000_alt.monIndex = 0; + ewram1B000_alt.setupState = 0; return TRUE; } else { - ewram1B000_alt.unk266++; + ewram1B000_alt.monIndex++; } break; } @@ -795,7 +747,7 @@ static void DaycareStorageMenuCallback_Store(u8); static void DaycareStorageMenuCallback_Summary(u8); static void DaycareStorageMenuCallback_Exit(u8); -static const struct PartyMenuItem sDaycareStorageMenuItems[] = +static const struct MenuAction2 sDaycareStorageMenuItems[] = { {OtherText_Store, DaycareStorageMenuCallback_Store}, {OtherText_Summary, DaycareStorageMenuCallback_Summary}, @@ -816,29 +768,29 @@ static void sub_8122D94(u8 taskId) if (!GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_IS_EGG)) { gTasks[taskId].data[4] = 0; - sub_806E750(0, sDaycareStorageMenus, sDaycareStorageMenuItems, 0); + ShowPartyPopupMenu(0, sDaycareStorageMenus, sDaycareStorageMenuItems, 0); } else { gTasks[taskId].data[4] = 1; - sub_806E750(1, sDaycareStorageMenus, sDaycareStorageMenuItems, 0); + ShowPartyPopupMenu(1, sDaycareStorageMenus, sDaycareStorageMenuItems, 0); } } -void sub_8122E0C(u8 taskId) +void HandleDaycarePartyMenu(u8 taskId) { if (!gPaletteFade.active) { - switch (sub_806BD80(taskId)) + switch (HandleDefaultPartyMenuInput(taskId)) { - case 1: + case A_BUTTON: PlaySE(SE_SELECT); gLastFieldPokeMenuOpened = sub_806CA38(taskId); GetMonNickname(&gPlayerParty[gLastFieldPokeMenuOpened], gStringVar1); sub_8122D94(taskId); gTasks[taskId].func = Task_DaycareStorageMenu8122EAC; break; - case 2: + case B_BUTTON: PlaySE(SE_SELECT); gLastFieldPokeMenuOpened = 0xFF; gSpecialVar_0x8004 = 0xFF; @@ -901,14 +853,14 @@ static void sub_8122F90(void) { while (1) { - if (sub_806B124() == 1) + if (InitPartyMenu() == TRUE) { - sub_806C994(ewram1B000.unk260, gUnknown_020384F0); - sub_806BF74(ewram1B000.unk260, 0); + sub_806C994(ewram1B000.menuHandlerTaskId, gUnknown_020384F0); + ChangePartyMenuSelection(ewram1B000.menuHandlerTaskId, 0); GetMonNickname(&gPlayerParty[gUnknown_020384F0], gStringVar1); gLastFieldPokeMenuOpened = gUnknown_020384F0; - sub_8122D94(ewram1B000.unk260); - SetMainCallback2(sub_806AEDC); + sub_8122D94(ewram1B000.menuHandlerTaskId); + SetMainCallback2(CB2_PartyMenuMain); break; } if (sub_80F9344() == 1) @@ -919,7 +871,7 @@ static void sub_8122F90(void) static void sub_8123004(void) { gPaletteFade.bufferTransferDisabled = TRUE; - sub_806AF4C(6, 0xFF, Task_DaycareStorageMenu8122EAC, 5); + SetPartyMenuSettings(PARTY_MENU_TYPE_DAYCARE, 0xFF, Task_DaycareStorageMenu8122EAC, 5); SetMainCallback2(sub_8122F90); } @@ -946,8 +898,8 @@ static void DaycareStorageMenuCallback_Exit(u8 taskId) PlaySE(SE_SELECT); MenuZeroFillWindowRect(20, 10, 29, 19); HandleDestroyMenuCursors(); - sub_806D538(15, 0); - gTasks[taskId].func = sub_8122E0C; + PrintPartyMenuPromptText(15, 0); + gTasks[taskId].func = HandleDaycarePartyMenu; } void sub_8123138(u8 taskId) diff --git a/src/coins.c b/src/field/coins.c index 3c6356612..91a4b508d 100644 --- a/src/coins.c +++ b/src/field/coins.c @@ -6,47 +6,47 @@ #define MAX_COINS 9999 -void UpdateCoinsWindow(s32 a, u8 b, u8 c) +void UpdateCoinsWindow(s32 coins, u8 x, u8 y) { - PrintCoins(a, 4, b + 2, c + 1); + PrintCoins(coins, 4, x + 2, y + 1); } -void ShowCoinsWindow(u32 a, u8 b, u8 c) +void ShowCoinsWindow(u32 coins, u8 x, u8 y) { - MenuDrawTextWindow(b, c, b + 9, c + 3); - UpdateCoinsWindow(a, b, c); + MenuDrawTextWindow(x, y, x + 9, y + 3); + UpdateCoinsWindow(coins, x, y); } -void HideCoinsWindow(u8 a, u8 b) +void HideCoinsWindow(u8 x, u8 y) { - MenuZeroFillWindowRect(a, b, a + 9, b + 3); + MenuZeroFillWindowRect(x, y, x + 9, y + 3); } -void PrintCoins(s32 a, u8 b, u8 c, u8 d) +void PrintCoins(s32 coins, u8 b, u8 x, u8 y) { u8 string[16]; u8 *ptr; u8 r1; u8 foo; - ConvertIntToDecimalString(string, a); + ConvertIntToDecimalString(string, coins); r1 = (b * 6 + 0x21 - 8 * (b + 2)); - c = c - r1 / 8; + x = x - r1 / 8; foo = r1 % 8; ptr = gStringVar1; if (foo) { - ptr[0] = 0xFC; + ptr[0] = EXT_CTRL_CODE_BEGIN; ptr[1] = 0x11; ptr[2] = 8 - (foo); ptr += 3; } - ptr[0] = 0xFC; + ptr[0] = EXT_CTRL_CODE_BEGIN; ptr[1] = 0x11; ptr[2] = (b - StringLength(string)) * 6; ptr += 3; StringCopy(ptr, string); - MenuPrint(gOtherText_Coins2, c, d); + MenuPrint(gOtherText_Coins2, x, y); } u16 GetCoins(void) diff --git a/src/coord_event_weather.c b/src/field/coord_event_weather.c index 9c5a1ca4d..9c5a1ca4d 100644 --- a/src/coord_event_weather.c +++ b/src/field/coord_event_weather.c diff --git a/src/field/daycare.c b/src/field/daycare.c new file mode 100644 index 000000000..dd74f59e0 --- /dev/null +++ b/src/field/daycare.c @@ -0,0 +1,1691 @@ +#include "global.h" +#include "daycare.h" +#include "pokemon.h" +#include "event_data.h" +#include "species.h" +#include "items.h" +#include "text.h" +#include "string_util.h" +#include "mail_data.h" +#include "name_string_util.h" +#include "pokemon_storage_system.h" +#include "rng.h" +#include "moves.h" +#include "trade.h" +#include "strings2.h" +#include "party_menu.h" +#include "field_effect.h" +#include "main.h" +#include "menu.h" +#include "sound.h" +#include "songs.h" +#include "script.h" +#include "overworld.h" + +IWRAM_DATA u16 gUnknown_03000470[52]; +IWRAM_DATA u16 gUnknown_030004D8[4]; +IWRAM_DATA u16 gUnknown_030004E0[4]; +IWRAM_DATA u16 gUnknown_030004E8[12]; +IWRAM_DATA u16 gUnknown_03000500[4]; + +static void sub_80417F4(struct DayCareMail *); +static void sub_80420FC(struct Pokemon *, u16, struct DayCareData *); +static u8 daycare_relationship_score(struct DayCareData *); + +#include "../data/pokemon/egg_moves.h" + +const u8 *const gUnknown_08209AC4[] = { + DaycareText_GetAlongVeryWell, + DaycareText_GetAlong, + DaycareText_DontLikeOther, + DaycareText_PlayOther +}; + +const u8 gUnknown_08209AD4[] = _("タマゴ"); + +u8 *GetMonNick(struct Pokemon *mon, u8 *dest) +{ + s8 nickname[POKEMON_NAME_LENGTH * 2]; + + GetMonData(mon, MON_DATA_NICKNAME, nickname); + return StringCopy10(dest, nickname); +} + +u8 *GetBoxMonNick(struct BoxPokemon *mon, u8 *dest) +{ + s8 nickname[POKEMON_NAME_LENGTH * 2]; + + GetBoxMonData(mon, MON_DATA_NICKNAME, nickname); + return StringCopy10(dest, nickname); +} + +u8 Daycare_CountPokemon(struct DayCareData *daycare_data) +{ + u8 i, count; + count = 0; + + for(i = 0;i <= 1;i++) + if(GetBoxMonData(&daycare_data->mons[i], MON_DATA_SPECIES) != 0) + count++; + + return count; +} + +void sub_8041324(struct BoxPokemon * box_pokemon, struct RecordMixingDayCareMail * daycareMailEtc) +{ + u8 i; + u8 specCount; + specCount = 0; + for (i=0; i<2; i++) + { + if (GetBoxMonData(&box_pokemon[i], MON_DATA_SPECIES) != SPECIES_NONE) + { + specCount ++; + if (GetBoxMonData(&box_pokemon[i], MON_DATA_HELD_ITEM) == ITEM_NONE) + { + daycareMailEtc->unk74[i] = 0; + } else + { + daycareMailEtc->unk74[i] = 1; + } + } else + { + daycareMailEtc->unk74[i] = 1; + } + } + daycareMailEtc->unk70 = specCount; +} + +static s8 Daycare_FindEmptySpot(struct BoxPokemon * daycare_data) +{ + u8 i; + + for(i = 0;i <= 1;i++) + if(GetBoxMonData(daycare_data + i, MON_DATA_SPECIES) == 0) + return i; + + return -1; +} + +static void Daycare_SendPokemon(struct Pokemon * mon, struct DayCareData * daycare_data) +{ + s8 empty_slot; + u8 mail; + u8 *names; + + empty_slot = Daycare_FindEmptySpot(daycare_data->mons); + if(MonHasMail(mon)) { + StringCopy((names = daycare_data->misc.mail[empty_slot].names), gSaveBlock2.playerName); + PadNameString(names, 0xFC); + names += 8; + GetMonNick(mon, names); + mail = GetMonData(mon, MON_DATA_MAIL); + daycare_data->misc.mail[empty_slot].message = gSaveBlock1.mail[mail]; + TakeMailFromMon(mon); + } + daycare_data->mons[empty_slot] = mon->box; + BoxMonRestorePP(&daycare_data->mons[empty_slot]); + daycare_data->misc.countersEtc.steps[empty_slot] = 0; + ZeroMonData(mon); + party_compaction(); + CalculatePlayerPartyCount(); +} + +void Daycare_SendPokemon_Special() +{ + Daycare_SendPokemon(gPlayerParty + gLastFieldPokeMenuOpened, &gSaveBlock1.daycareData); +} + +static void sub_80414C0(struct DayCareData * daycare_data) +{ + if((GetBoxMonData(&daycare_data->mons[1], MON_DATA_SPECIES) != 0) && GetBoxMonData(&daycare_data->mons[0], MON_DATA_SPECIES) == 0) + { + daycare_data->mons[0] = daycare_data->mons[1]; + ZeroBoxMonData(&daycare_data->mons[1]); + daycare_data->misc.mail[0] = daycare_data->misc.mail[1]; + daycare_data->misc.countersEtc.steps[0] = daycare_data->misc.countersEtc.steps[1]; + daycare_data->misc.countersEtc.steps[1] = 0; + sub_80417F4(&daycare_data->misc.mail[1]); + } +} + +u8 TryIncrementMonLevel(struct Pokemon *); +extern u16 gMoveToLearn; + +static void DayCare_LevelUpMoves(struct Pokemon * mon) +{ + s32 i; + u8 r6; + u16 temp; + + for (i = 0; i < MAX_LEVEL; i++) + { + if (TryIncrementMonLevel(mon)) + { + r6 = 1; + while ((temp = MonTryLearningNewMove(mon, r6)) != 0) + { + r6 = 0; + if (temp == 0xffff) + DeleteFirstMoveAndGiveMoveToMon(mon, gMoveToLearn); + } + } + else + break; + } + + CalculateMonStats(mon); +} + +static u16 sub_8041570(struct DayCareData * daycare_data, u8 slot) +{ + u16 species; + u32 experience; + struct Pokemon pokemon; + + GetBoxMonNick(&daycare_data->mons[slot], gStringVar1); + species = GetBoxMonData(&daycare_data->mons[slot], MON_DATA_SPECIES); + sub_803B4B4(&daycare_data->mons[slot], &pokemon); + if (GetMonData(&pokemon, MON_DATA_LEVEL) != MAX_LEVEL) + { + experience = GetMonData(&pokemon, MON_DATA_EXP) + daycare_data->misc.countersEtc.steps[slot]; + SetMonData(&pokemon, MON_DATA_EXP, &experience); + DayCare_LevelUpMoves(&pokemon); + } + gPlayerParty[PARTY_SIZE - 1] = pokemon; + if (daycare_data->misc.mail[slot].message.itemId) + { + GiveMailToMon2(&gPlayerParty[PARTY_SIZE - 1], &daycare_data->misc.mail[slot].message); + sub_80417F4(&daycare_data->misc.mail[slot]); + } + party_compaction(); + ZeroBoxMonData(&daycare_data->mons[slot]); + daycare_data->misc.countersEtc.steps[slot] = 0; + sub_80414C0(daycare_data); + CalculatePlayerPartyCount(); + return species; +} + +u16 sub_8041648() +{ + return sub_8041570(&gSaveBlock1.daycareData, gSpecialVar_0x8004); +} + +u8 Daycare_GetLevelAfterSteps(struct BoxPokemon * mon, u32 steps){ + struct BoxPokemon temp = *mon; + u32 new_exp = GetBoxMonData(mon, MON_DATA_EXP) + steps; + SetBoxMonData(&temp, MON_DATA_EXP, &new_exp); + return GetLevelFromBoxMonExp(&temp); +} + +static u8 sub_80416A0(struct DayCareData *daycareData, u8 slot) +{ + u8 levelBefore; + u8 levelAfter; + + levelBefore = GetLevelFromBoxMonExp(&daycareData->mons[slot]); + levelAfter = Daycare_GetLevelAfterSteps(&daycareData->mons[slot], daycareData->misc.countersEtc.steps[slot]); + return levelAfter - levelBefore; +} + +static u8 sub_80416E8(struct DayCareData *dayCareData, u8 slot) +{ + u8 levelDelta = sub_80416A0(dayCareData, slot); + GetBoxMonNick(&dayCareData->mons[slot], gStringVar1); + ConvertIntToDecimalStringN(gStringVar2, levelDelta, STR_CONV_MODE_LEFT_ALIGN, 2); + return levelDelta; +} + +static u16 sub_8041728(struct DayCareData *dayCareData, u8 slot) +{ + u16 cost; + + u8 levelDelta = sub_80416A0(dayCareData, slot); + GetBoxMonNick(&dayCareData->mons[slot], gStringVar1); + cost = 100 + 100 * levelDelta; + ConvertIntToDecimalStringN(gStringVar2, cost, STR_CONV_MODE_LEFT_ALIGN, 5); + return cost; +} + +void sub_8041770(void) +{ + gSpecialVar_0x8005 = sub_8041728(&gSaveBlock1.daycareData, gSpecialVar_0x8004); +} + +void sub_8041790(u16 i) +{ + gSaveBlock1.daycareData.misc.countersEtc.steps[0] += i; + gSaveBlock1.daycareData.misc.countersEtc.steps[1] += i; +} + +u8 sub_80417B8(void) +{ + if (GetBoxMonData(&gSaveBlock1.daycareData.mons[gSpecialVar_0x8004], MON_DATA_SPECIES) != 0) + return sub_80416E8(&gSaveBlock1.daycareData, gSpecialVar_0x8004); + return 0; +} + +static void sub_80417F4(struct DayCareMail *mail) +{ + u8 zero; + u8 *names; + u8 *names2; + int i; + zero = 0; + for (i = 7, names = mail->names + 7; i >= 0; i --) + *names-- = zero; + names2 = mail->names + 8; + zero = 0; + names = mail->names + 18; + do *names-- = zero; while ((int)names >= (int)names2); + ClearMailStruct(&mail->message); +} + +void unref_sub_8041824(struct DayCareData *dayCareData) +{ + u8 slot; + for (slot = 0; slot < ARRAY_COUNT(dayCareData->mons); slot ++) + { + ZeroBoxMonData(&dayCareData->mons[slot]); + dayCareData->misc.countersEtc.steps[slot] = 0; + sub_80417F4(&dayCareData->misc.mail[slot]); + } + dayCareData->misc.countersEtc.personalityLo = 0; + dayCareData->misc.countersEtc.unk_11a = 0; +} + +u16 sub_8041870(u16 species) +{ + int i, j, k; + bool8 found; + for (i = 0; i < 5; i ++) + { + found = FALSE; + for (j = 1; j < NUM_SPECIES; j ++) + { + for (k = 0; k < 5; k ++) + { + if (gEvolutionTable[j].evolutions[k].targetSpecies == species) + { + species = j; + found = TRUE; + break; + } + } + if (found) + break; + } + if (j == 412) + break; + } + return species; +} + +static void sub_80418F0(struct DayCareData *dayCareData) +{ + dayCareData->misc.countersEtc.personalityLo = (Random() % 0xfffe) + 1; + FlagSet(0x86); +} + +static void sub_804191C(struct DayCareData *dayCareData) +{ + dayCareData->misc.countersEtc.personalityLo = Random() | 0x8000; + FlagSet(0x86); +} + +void sub_8041940(void) +{ + sub_80418F0(&gSaveBlock1.daycareData); +} + +void sub_8041950(void) +{ + sub_804191C(&gSaveBlock1.daycareData); +} + +static void sub_8041960(u8 *data, u8 idx) +{ + int i, j; + u8 temp[6]; + data[idx] = 0xff; + for (i = 0; i < 6; i ++) + temp[i] = data[i]; + j = 0; + for (i = 0; i < 6; i ++) + if (temp[i] != 0xff) + data[j++] = temp[i]; +} + +static void InheritIVs(struct Pokemon *egg, struct DayCareData *dayCareData) +{ + u8 i; + u8 selectedIvs[3]; + u8 allIvs[6]; + u8 whichParent[3]; + u8 iv; + for (i = 0; i < 6; i ++) + allIvs[i] = i; + for (i = 0; i < 3; i ++) + { + selectedIvs[i] = allIvs[Random() % (6 - i)]; + sub_8041960(allIvs, selectedIvs[i]); + } + for (i = 0; i < 3; i ++) + whichParent[i] = Random() % 2; + for (i = 0; i < 3; i ++) + { + switch (selectedIvs[i]) + { + case 0: + iv = GetBoxMonData(&dayCareData->mons[whichParent[i]], MON_DATA_HP_IV); + SetMonData(egg, MON_DATA_HP_IV, &iv); + break; + case 1: + iv = GetBoxMonData(&dayCareData->mons[whichParent[i]], MON_DATA_ATK_IV); + SetMonData(egg, MON_DATA_ATK_IV, &iv); + break; + case 2: + iv = GetBoxMonData(&dayCareData->mons[whichParent[i]], MON_DATA_DEF_IV); + SetMonData(egg, MON_DATA_DEF_IV, &iv); + break; + case 3: + iv = GetBoxMonData(&dayCareData->mons[whichParent[i]], MON_DATA_SPEED_IV); + SetMonData(egg, MON_DATA_SPEED_IV, &iv); + break; + case 4: + iv = GetBoxMonData(&dayCareData->mons[whichParent[i]], MON_DATA_SPATK_IV); + SetMonData(egg, MON_DATA_SPATK_IV, &iv); + break; + case 5: + iv = GetBoxMonData(&dayCareData->mons[whichParent[i]], MON_DATA_SPDEF_IV); + SetMonData(egg, MON_DATA_SPDEF_IV, &iv); + break; + } + } +} + +#ifdef NONMATCHING +static +#endif +u8 pokemon_get_eggmoves(struct Pokemon *pokemon, u16 *eggMoves) +{ + u16 eggMoveIdx; + u16 numMovesFound; + u16 species; + u16 i; + + numMovesFound = 0; + eggMoveIdx = 0; + species = GetMonData(pokemon, MON_DATA_SPECIES); + for (i = 0; i < ARRAY_COUNT(gEggMoves) - 1; i ++) + { + if (gEggMoves[i] == species + EGG_MOVES_SPECIES_OFFSET) + { + eggMoveIdx = i + 1; + break; + } + } + for (i = 0; i < 10; i ++) + { + if (gEggMoves[eggMoveIdx + i] > EGG_MOVES_SPECIES_OFFSET) + { + break; + } + eggMoves[i] = gEggMoves[eggMoveIdx + i]; + numMovesFound++; + } + return numMovesFound; +} + +#ifdef NONMATCHING + +void daycare_build_child_moveset(struct Pokemon *egg, struct BoxPokemon *dad, struct BoxPokemon *mom) +{ + u16 numSharedParentMoves; + u8 numLevelUpMoves; + u8 numEggMoves; + u16 i, j; + + numSharedParentMoves = 0; + for (i = 0; i < 4; i ++) + { + gUnknown_03000500[i] = 0; + gUnknown_030004D8[i] = 0; + gUnknown_030004E0[i] = 0; + } + for (i = 0; i < 10; i ++) + gUnknown_030004E8[i] = 0; + for (i = 0; i < 50; i ++) + gUnknown_03000470[i] = 0; + + numLevelUpMoves = GetLevelUpMovesBySpecies(GetMonData(egg, MON_DATA_SPECIES), gUnknown_03000470); + for (i = 0; i < 4; i ++) + { + gUnknown_030004D8[i] = GetBoxMonData(dad, MON_DATA_MOVE1 + i); + gUnknown_03000500[i] = GetBoxMonData(mom, MON_DATA_MOVE1 + i); + } + numEggMoves = pokemon_get_eggmoves(egg, gUnknown_030004E8); + + for (i = 0; i < 4; i ++) + { + if (gUnknown_030004D8[i] != MOVE_NONE) + { + for (j = 0; j < numEggMoves; j ++) + { + if (gUnknown_030004D8[i] == gUnknown_030004E8[j]) + { + if (GiveMoveToMon(egg, gUnknown_030004D8[i]) == 0xffff) + DeleteFirstMoveAndGiveMoveToMon(egg, gUnknown_030004D8[i]); + break; + } + } + } + else + break; + } + for (i = 0; i < 4; i ++) + { + if (gUnknown_030004D8[i] != MOVE_NONE) + { + for (j = 0; j < 50 + 8; j ++) + { + if (gUnknown_030004D8[i] == ItemIdToBattleMoveId(ITEM_TM01 + j) && CanMonLearnTMHM(egg, j)) + { + if (GiveMoveToMon(egg, gUnknown_030004D8[i]) == 0xffff) + DeleteFirstMoveAndGiveMoveToMon(egg, gUnknown_030004D8[i]); + } + } + } + } + for (i = 0; i < 4; i ++) + { + if (gUnknown_030004D8[i] == MOVE_NONE) + break; + for (j = 0; j < 4; j ++) + { + if (gUnknown_030004D8[i] == gUnknown_03000500[j] && gUnknown_030004D8[i] != MOVE_NONE) + gUnknown_030004E0[numSharedParentMoves++] = gUnknown_030004D8[i]; + } + } + for (i = 0; i < 4; i ++) + { + if (gUnknown_030004E0[i] == MOVE_NONE) + break; + for (j = 0; j < numLevelUpMoves; j ++) + { + if (gUnknown_03000470[j] != MOVE_NONE && gUnknown_030004E0[i] == gUnknown_03000470[j]) + { + if (GiveMoveToMon(egg, gUnknown_030004E0[i]) == 0xffff) + DeleteFirstMoveAndGiveMoveToMon(egg, gUnknown_030004E0[i]); + break; + } + } + } +} +#else +__attribute__((naked)) +void daycare_build_child_moveset(struct Pokemon *egg, struct BoxPokemon *dad, struct BoxPokemon *mom) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0xC\n" + "\tadds r7, r0, 0\n" + "\tmov r10, r1\n" + "\tmov r9, r2\n" + "\tmovs r0, 0\n" + "\tstr r0, [sp]\n" + "\tmovs r6, 0\n" + "\tldr r5, _08041CC8 @ =gUnknown_03000500\n" + "\tmovs r2, 0\n" + "\tldr r4, _08041CCC @ =gUnknown_030004D8\n" + "\tldr r3, _08041CD0 @ =gUnknown_030004E0\n" + "_08041BE4:\n" + "\tlsls r1, r6, 1\n" + "\tadds r0, r1, r5\n" + "\tstrh r2, [r0]\n" + "\tadds r0, r1, r4\n" + "\tstrh r2, [r0]\n" + "\tadds r1, r3\n" + "\tstrh r2, [r1]\n" + "\tadds r0, r6, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r6, r0, 16\n" + "\tcmp r6, 0x3\n" + "\tbls _08041BE4\n" + "\tmovs r6, 0\n" + "\tldr r2, _08041CD4 @ =gUnknown_030004E8\n" + "\tmovs r1, 0\n" + "_08041C02:\n" + "\tlsls r0, r6, 1\n" + "\tadds r0, r2\n" + "\tstrh r1, [r0]\n" + "\tadds r0, r6, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r6, r0, 16\n" + "\tcmp r6, 0x9\n" + "\tbls _08041C02\n" + "\tmovs r6, 0\n" + "\tldr r2, _08041CD8 @ =gUnknown_03000470\n" + "\tmovs r1, 0\n" + "_08041C18:\n" + "\tlsls r0, r6, 1\n" + "\tadds r0, r2\n" + "\tstrh r1, [r0]\n" + "\tadds r0, r6, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r6, r0, 16\n" + "\tcmp r6, 0x31\n" + "\tbls _08041C18\n" + "\tadds r0, r7, 0\n" + "\tmovs r1, 0xB\n" + "\tbl GetMonData\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tldr r1, _08041CD8 @ =gUnknown_03000470\n" + "\tbl GetLevelUpMovesBySpecies\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tstr r0, [sp, 0x4]\n" + "\tmovs r6, 0\n" + "\tldr r1, _08041CCC @ =gUnknown_030004D8\n" + "\tmov r8, r1\n" + "_08041C46:\n" + "\tadds r5, r6, 0\n" + "\tadds r5, 0xD\n" + "\tmov r0, r10\n" + "\tadds r1, r5, 0\n" + "\tbl GetBoxMonData\n" + "\tlsls r4, r6, 1\n" + "\tmov r2, r8\n" + "\tadds r1, r4, r2\n" + "\tstrh r0, [r1]\n" + "\tmov r0, r9\n" + "\tadds r1, r5, 0\n" + "\tbl GetBoxMonData\n" + "\tldr r1, _08041CC8 @ =gUnknown_03000500\n" + "\tadds r4, r1\n" + "\tstrh r0, [r4]\n" + "\tadds r0, r6, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r6, r0, 16\n" + "\tcmp r6, 0x3\n" + "\tbls _08041C46\n" + "\tldr r1, _08041CD4 @ =gUnknown_030004E8\n" + "\tadds r0, r7, 0\n" + "\tbl pokemon_get_eggmoves\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tmov r8, r0\n" + "\tmovs r6, 0\n" + "_08041C82:\n" + "\tldr r0, _08041CCC @ =gUnknown_030004D8\n" + "\tlsls r1, r6, 1\n" + "\tadds r2, r1, r0\n" + "\tldrh r1, [r2]\n" + "\tmov r9, r0\n" + "\tcmp r1, 0\n" + "\tbeq _08041CF8\n" + "\tmovs r5, 0\n" + "\tcmp r5, r8\n" + "\tbcs _08041CEA\n" + "\tadds r4, r2, 0\n" + "\tldr r2, _08041CDC @ =0x0000ffff\n" + "_08041C9A:\n" + "\tldr r0, _08041CD4 @ =gUnknown_030004E8\n" + "\tlsls r1, r5, 1\n" + "\tadds r1, r0\n" + "\tldrh r0, [r4]\n" + "\tldrh r1, [r1]\n" + "\tcmp r0, r1\n" + "\tbne _08041CE0\n" + "\tadds r1, r0, 0\n" + "\tadds r0, r7, 0\n" + "\tstr r2, [sp, 0x8]\n" + "\tbl GiveMoveToMon\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tldr r2, [sp, 0x8]\n" + "\tcmp r0, r2\n" + "\tbne _08041CEA\n" + "\tldrh r1, [r4]\n" + "\tadds r0, r7, 0\n" + "\tbl DeleteFirstMoveAndGiveMoveToMon\n" + "\tb _08041CEA\n" + "\t.align 2, 0\n" + "_08041CC8: .4byte gUnknown_03000500\n" + "_08041CCC: .4byte gUnknown_030004D8\n" + "_08041CD0: .4byte gUnknown_030004E0\n" + "_08041CD4: .4byte gUnknown_030004E8\n" + "_08041CD8: .4byte gUnknown_03000470\n" + "_08041CDC: .4byte 0x0000ffff\n" + "_08041CE0:\n" + "\tadds r0, r5, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r5, r0, 16\n" + "\tcmp r5, r8\n" + "\tbcc _08041C9A\n" + "_08041CEA:\n" + "\tadds r0, r6, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r6, r0, 16\n" + "\tldr r3, _08041E14 @ =gUnknown_030004D8\n" + "\tmov r9, r3\n" + "\tcmp r6, 0x3\n" + "\tbls _08041C82\n" + "_08041CF8:\n" + "\tmovs r6, 0\n" + "_08041CFA:\n" + "\tlsls r0, r6, 1\n" + "\tmov r2, r9\n" + "\tadds r1, r0, r2\n" + "\tldrh r1, [r1]\n" + "\tadds r2, r0, 0\n" + "\tadds r6, 0x1\n" + "\tmov r8, r6\n" + "\tcmp r1, 0\n" + "\tbeq _08041D5C\n" + "\tmovs r5, 0\n" + "\tldr r0, _08041E14 @ =gUnknown_030004D8\n" + "\tadds r4, r2, r0\n" + "\tldr r6, _08041E18 @ =0x0000ffff\n" + "\tmov r9, r0\n" + "_08041D16:\n" + "\tldr r3, _08041E1C @ =0x00000121\n" + "\tadds r0, r5, r3\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tbl ItemIdToBattleMoveId\n" + "\tldrh r1, [r4]\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tcmp r1, r0\n" + "\tbne _08041D52\n" + "\tlsls r1, r5, 24\n" + "\tlsrs r1, 24\n" + "\tadds r0, r7, 0\n" + "\tbl CanMonLearnTMHM\n" + "\tcmp r0, 0\n" + "\tbeq _08041D52\n" + "\tldrh r1, [r4]\n" + "\tadds r0, r7, 0\n" + "\tbl GiveMoveToMon\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tcmp r0, r6\n" + "\tbne _08041D52\n" + "\tldrh r1, [r4]\n" + "\tadds r0, r7, 0\n" + "\tbl DeleteFirstMoveAndGiveMoveToMon\n" + "_08041D52:\n" + "\tadds r0, r5, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r5, r0, 16\n" + "\tcmp r5, 0x39\n" + "\tbls _08041D16\n" + "_08041D5C:\n" + "\tmov r1, r8\n" + "\tlsls r0, r1, 16\n" + "\tlsrs r6, r0, 16\n" + "\tcmp r6, 0x3\n" + "\tbls _08041CFA\n" + "\tmovs r6, 0\n" + "\tmov r2, r9\n" + "\tldrh r0, [r2]\n" + "\tldr r3, _08041E20 @ =gUnknown_030004E0\n" + "\tmov r10, r3\n" + "\tcmp r0, 0\n" + "\tbeq _08041DC6\n" + "\tmov r4, r9\n" + "\tldr r0, _08041E24 @ =gUnknown_03000500\n" + "\tmov r9, r0\n" + "\tmov r12, r10\n" + "_08041D7C:\n" + "\tmovs r5, 0\n" + "\tlsls r2, r6, 1\n" + "\tadds r6, 0x1\n" + "\tmov r8, r6\n" + "\tadds r3, r2, r4\n" + "_08041D86:\n" + "\tlsls r0, r5, 1\n" + "\tadd r0, r9\n" + "\tldrh r2, [r3]\n" + "\tadds r1, r2, 0\n" + "\tldrh r0, [r0]\n" + "\tcmp r1, r0\n" + "\tbne _08041DA8\n" + "\tcmp r1, 0\n" + "\tbeq _08041DA8\n" + "\tldr r1, [sp]\n" + "\tadds r0, r1, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tstr r0, [sp]\n" + "\tlsls r1, 1\n" + "\tadd r1, r12\n" + "\tstrh r2, [r1]\n" + "_08041DA8:\n" + "\tadds r0, r5, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r5, r0, 16\n" + "\tcmp r5, 0x3\n" + "\tbls _08041D86\n" + "\tmov r1, r8\n" + "\tlsls r0, r1, 16\n" + "\tlsrs r6, r0, 16\n" + "\tcmp r6, 0x3\n" + "\tbhi _08041DC6\n" + "\tlsls r0, r6, 1\n" + "\tadds r0, r4\n" + "\tldrh r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbne _08041D7C\n" + "_08041DC6:\n" + "\tmovs r6, 0\n" + "\tmov r2, r10\n" + "\tldrh r0, [r2]\n" + "\tcmp r0, 0\n" + "\tbeq _08041E50\n" + "_08041DD0:\n" + "\tmovs r5, 0\n" + "\tadds r3, r6, 0x1\n" + "\tmov r8, r3\n" + "\tldr r0, [sp, 0x4]\n" + "\tcmp r5, r0\n" + "\tbcs _08041E38\n" + "\tldr r2, _08041E18 @ =0x0000ffff\n" + "_08041DDE:\n" + "\tldr r1, _08041E28 @ =gUnknown_03000470\n" + "\tlsls r0, r5, 1\n" + "\tadds r0, r1\n" + "\tldrh r1, [r0]\n" + "\tcmp r1, 0\n" + "\tbeq _08041E2C\n" + "\tlsls r0, r6, 1\n" + "\tmov r3, r10\n" + "\tadds r4, r0, r3\n" + "\tldrh r0, [r4]\n" + "\tcmp r0, r1\n" + "\tbne _08041E2C\n" + "\tadds r1, r0, 0\n" + "\tadds r0, r7, 0\n" + "\tstr r2, [sp, 0x8]\n" + "\tbl GiveMoveToMon\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tldr r2, [sp, 0x8]\n" + "\tcmp r0, r2\n" + "\tbne _08041E38\n" + "\tldrh r1, [r4]\n" + "\tadds r0, r7, 0\n" + "\tbl DeleteFirstMoveAndGiveMoveToMon\n" + "\tb _08041E38\n" + "\t.align 2, 0\n" + "_08041E14: .4byte gUnknown_030004D8\n" + "_08041E18: .4byte 0x0000ffff\n" + "_08041E1C: .4byte 0x00000121\n" + "_08041E20: .4byte gUnknown_030004E0\n" + "_08041E24: .4byte gUnknown_03000500\n" + "_08041E28: .4byte gUnknown_03000470\n" + "_08041E2C:\n" + "\tadds r0, r5, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r5, r0, 16\n" + "\tldr r0, [sp, 0x4]\n" + "\tcmp r5, r0\n" + "\tbcc _08041DDE\n" + "_08041E38:\n" + "\tmov r1, r8\n" + "\tlsls r0, r1, 16\n" + "\tlsrs r6, r0, 16\n" + "\tcmp r6, 0x3\n" + "\tbhi _08041E50\n" + "\tldr r0, _08041E60 @ =gUnknown_030004E0\n" + "\tlsls r1, r6, 1\n" + "\tadds r1, r0\n" + "\tldrh r1, [r1]\n" + "\tmov r10, r0\n" + "\tcmp r1, 0\n" + "\tbne _08041DD0\n" + "_08041E50:\n" + "\tadd sp, 0xC\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_08041E60: .4byte gUnknown_030004E0"); +} +#endif + +static void RemoveEggFromDayCare(struct DayCareData *dayCareData) +{ + dayCareData->misc.countersEtc.personalityLo = 0; + dayCareData->misc.countersEtc.unk_11a = 0; +} + +void sub_8041E7C(void) +{ + RemoveEggFromDayCare(&gSaveBlock1.daycareData); +} + +static void incense_effects(u16 *species, struct DayCareData *dayCareData) +{ + u16 momItem, dadItem; + if (*species == SPECIES_WYNAUT || *species == SPECIES_AZURILL) + { + momItem = GetBoxMonData(&dayCareData->mons[0], MON_DATA_HELD_ITEM); + dadItem = GetBoxMonData(&dayCareData->mons[1], MON_DATA_HELD_ITEM); + if (*species == SPECIES_WYNAUT && momItem != ITEM_LAX_INCENSE && dadItem != ITEM_LAX_INCENSE) + { + *species = SPECIES_WOBBUFFET; + } + if (*species == SPECIES_AZURILL && momItem != ITEM_SEA_INCENSE && dadItem != ITEM_SEA_INCENSE) + { + *species = SPECIES_MARILL; + } + } +} + +static u16 sub_8041EEC(struct DayCareData *dayCareData, u8 *a1) // inherit_species_from_mom +{ + u16 i; + u16 species[2]; + u16 eggSpecies; + u8 buffer; + for (i=0; i<2; i++) + { + species[i] = GetBoxMonData(&dayCareData->mons[i], MON_DATA_SPECIES); + if (species[i] == SPECIES_DITTO) + { + a1[0] = i ^ 1; + a1[1] = i; + } + else if (GetBoxMonGender(&dayCareData->mons[i]) == MON_FEMALE) + { + a1[0] = i; + a1[1] = i ^ 1; + } + } + eggSpecies = sub_8041870(species[a1[0]]); + if (eggSpecies == SPECIES_NIDORAN_F && dayCareData->misc.countersEtc.personalityLo & 0x8000) + { + eggSpecies = SPECIES_NIDORAN_M; + } + if (eggSpecies == SPECIES_ILLUMISE && dayCareData->misc.countersEtc.personalityLo & 0x8000) + { + eggSpecies = SPECIES_VOLBEAT; + } + if (species[a1[1]] == SPECIES_DITTO && GetBoxMonGender(&dayCareData->mons[a1[0]]) != MON_FEMALE) + { + buffer = a1[1]; + a1[1] = a1[0]; + a1[0] = buffer; + } + return eggSpecies; +} + +static void sub_8041FC4(struct DayCareData *dayCareData) // give_egg +{ + struct Pokemon egg; + u16 species; + u8 parents[2]; + u8 isEgg; + species = sub_8041EEC(dayCareData, parents); + incense_effects(&species, dayCareData); + sub_80420FC(&egg, species, dayCareData); + InheritIVs(&egg, dayCareData); + daycare_build_child_moveset(&egg, &dayCareData->mons[parents[1]], &dayCareData->mons[parents[0]]); + isEgg = TRUE; + SetMonData(&egg, MON_DATA_IS_EGG, &isEgg); + gPlayerParty[5] = egg; + party_compaction(); + CalculatePlayerPartyCount(); + RemoveEggFromDayCare(dayCareData); +} + + +void sub_8042044(struct Pokemon *mon, u16 species, u8 overwriteMetLocation) // scr_create_egg +{ + u8 metLevel; + u16 ball; + u8 language; + u8 metLocation; + u8 isEgg; + CreateMon(mon, species, 5, 0x20, FALSE, 0, FALSE, 0); + metLevel = 0; + ball = ITEM_POKE_BALL; + language = LANGUAGE_JAPANESE; + SetMonData(mon, MON_DATA_POKEBALL, &ball); + SetMonData(mon, MON_DATA_NICKNAME, gUnknown_08209AD4); + SetMonData(mon, MON_DATA_FRIENDSHIP, &gBaseStats[species].eggCycles); + SetMonData(mon, MON_DATA_MET_LEVEL, &metLevel); + SetMonData(mon, MON_DATA_LANGUAGE, &language); + if (overwriteMetLocation) + { + metLocation = 0xfd; + SetMonData(mon, MON_DATA_MET_LOCATION, &metLocation); + } + isEgg = TRUE; + SetMonData(mon, MON_DATA_IS_EGG, &isEgg); +} + +static void sub_80420FC(struct Pokemon *mon, u16 species, struct DayCareData *dayCareData) +{ + u32 personality; + u16 ball; + u8 metLevel; + u8 language; + personality = dayCareData->misc.countersEtc.personalityLo | (Random() << 16); + CreateMon(mon, species, 5, 0x20, TRUE, personality, FALSE, 0); + metLevel = 0; + ball = ITEM_POKE_BALL; + language = LANGUAGE_JAPANESE; + SetMonData(mon, MON_DATA_POKEBALL, &ball); + SetMonData(mon, MON_DATA_NICKNAME, gUnknown_08209AD4); + SetMonData(mon, MON_DATA_FRIENDSHIP, &gBaseStats[species].eggCycles); + SetMonData(mon, MON_DATA_MET_LEVEL, &metLevel); + SetMonData(mon, MON_DATA_LANGUAGE, &language); +} + +void sp0B8_daycare(void) +{ + sub_8041FC4(&gSaveBlock1.daycareData); +} + +#ifdef NONMATCHING +static bool8 sub_80421B0(struct DayCareData *dayCareData) +{ + struct BoxPokemon *parent; + u32 i; + int v0; + int steps; + v0 = 0; + for (i=0, parent=&dayCareData->mons[0]; i<2; parent++, i++) + { + if (GetBoxMonData(parent, MON_DATA_SANITY_BIT2, v0)) + { + dayCareData->misc.countersEtc.steps[i]++; + v0++; + } + } + if (dayCareData->misc.countersEtc.personalityLo == 0 && v0 == 2 && dayCareData->misc.extra.misc[4] == 0xff && daycare_relationship_score(dayCareData) > (u32)((u32)(Random() * 100) / 0xffff)) + { + sub_8041940(); + } + if ((++dayCareData->misc.countersEtc.unk_11a) == 0xff) + { + for (i=0; i<gPlayerPartyCount; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) + { + steps = GetMonData(&gPlayerParty[i], MON_DATA_FRIENDSHIP); + if (steps == 0) + { + gSpecialVar_0x8004 = i; + return TRUE; + } + steps--; + SetMonData(&gPlayerParty[i], MON_DATA_FRIENDSHIP, &steps); + } + } + } + return FALSE; +} +#else +__attribute__((naked)) +static bool8 sub_80421B0(struct DayCareData *dayCareData) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tsub sp, 0x8\n" + "\tadds r7, r0, 0\n" + "\tmovs r2, 0\n" + "\tmovs r6, 0\n" + "\tadds r5, r7, 0\n" + "_080421BC:\n" + "\tlsls r4, r6, 2\n" + "\tadds r0, r5, 0\n" + "\tmovs r1, 0x5\n" + "\tstr r2, [sp, 0x4]\n" + "\tbl GetBoxMonData\n" + "\tldr r2, [sp, 0x4]\n" + "\tcmp r0, 0\n" + "\tbeq _080421DE\n" + "\tmovs r0, 0x88\n" + "\tlsls r0, 1\n" + "\tadds r1, r7, r0\n" + "\tadds r1, r4\n" + "\tldr r0, [r1]\n" + "\tadds r0, 0x1\n" + "\tstr r0, [r1]\n" + "\tadds r2, 0x1\n" + "_080421DE:\n" + "\tadds r5, 0x50\n" + "\tadds r6, 0x1\n" + "\tcmp r6, 0x1\n" + "\tbls _080421BC\n" + "\tmovs r1, 0x8C\n" + "\tlsls r1, 1\n" + "\tadds r0, r7, r1\n" + "\tldrh r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbne _08042226\n" + "\tcmp r2, 0x2\n" + "\tbne _08042226\n" + "\tsubs r1, 0x4\n" + "\tadds r0, r7, r1\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0xFF\n" + "\tbne _08042226\n" + "\tadds r0, r7, 0\n" + "\tbl daycare_relationship_score\n" + "\tadds r4, r0, 0\n" + "\tlsls r4, 24\n" + "\tlsrs r4, 24\n" + "\tbl Random\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tmovs r1, 0x64\n" + "\tmuls r0, r1\n" + "\tldr r1, _08042240 @ =0x0000ffff\n" + "\tbl __udivsi3\n" + "\tcmp r4, r0\n" + "\tbls _08042226\n" + "\tbl sub_8041940\n" + "_08042226:\n" + "\tmovs r0, 0x8D\n" + "\tlsls r0, 1\n" + "\tadds r1, r7, r0\n" + "\tldrb r0, [r1]\n" + "\tadds r0, 0x1\n" + "\tstrb r0, [r1]\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r0, 0xFF\n" + "\tbne _08042290\n" + "\tmovs r6, 0\n" + "\tb _08042288\n" + "\t.align 2, 0\n" + "_08042240: .4byte 0x0000ffff\n" + "_08042244:\n" + "\tmovs r0, 0x64\n" + "\tadds r1, r6, 0\n" + "\tmuls r1, r0\n" + "\tldr r0, _08042270 @ =gPlayerParty\n" + "\tadds r4, r1, r0\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0x2D\n" + "\tbl GetMonData\n" + "\tcmp r0, 0\n" + "\tbeq _08042286\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0x20\n" + "\tbl GetMonData\n" + "\tstr r0, [sp]\n" + "\tcmp r0, 0\n" + "\tbne _08042278\n" + "\tldr r0, _08042274 @ =gSpecialVar_0x8004\n" + "\tstrh r6, [r0]\n" + "\tmovs r0, 0x1\n" + "\tb _08042292\n" + "\t.align 2, 0\n" + "_08042270: .4byte gPlayerParty\n" + "_08042274: .4byte gSpecialVar_0x8004\n" + "_08042278:\n" + "\tsubs r0, 0x1\n" + "\tstr r0, [sp]\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0x20\n" + "\tmov r2, sp\n" + "\tbl SetMonData\n" + "_08042286:\n" + "\tadds r6, 0x1\n" + "_08042288:\n" + "\tldr r0, _0804229C @ =gPlayerPartyCount\n" + "\tldrb r0, [r0]\n" + "\tcmp r6, r0\n" + "\tbcc _08042244\n" + "_08042290:\n" + "\tmovs r0, 0\n" + "_08042292:\n" + "\tadd sp, 0x8\n" + "\tpop {r4-r7}\n" + "\tpop {r1}\n" + "\tbx r1\n" + "\t.align 2, 0\n" + "_0804229C: .4byte gPlayerPartyCount"); +} +#endif + +bool8 sub_80422A0(void) +{ + return sub_80421B0(&gSaveBlock1.daycareData); +} + +static bool8 sub_80422B4(struct DayCareData *dayCareData) +{ + return (u32)((-dayCareData->misc.countersEtc.personalityLo) | dayCareData->misc.countersEtc.personalityLo) >> 31; +} + +static void sub_80422C4(struct DayCareData *dayCareData) +{ + u8 language; + if (GetBoxMonData(&dayCareData->mons[0], MON_DATA_SPECIES) != 0) + { + GetBoxMonNick(&dayCareData->mons[0], gStringVar1); + language = GetBoxMonData(&dayCareData->mons[0], MON_DATA_LANGUAGE); + GetBoxMonData(&dayCareData->mons[0], MON_DATA_OT_NAME, gStringVar3); + ConvertInternationalString(gStringVar3, language); + } + if (GetBoxMonData(&dayCareData->mons[1], MON_DATA_SPECIES) != 0) + { + GetBoxMonNick(&dayCareData->mons[1], gStringVar2); + } +} + +u16 sub_8042328(void) +{ + GetBoxMonNick(&gPlayerParty[gLastFieldPokeMenuOpened].box, gStringVar1); + return GetBoxMonData(&gPlayerParty[gLastFieldPokeMenuOpened].box, MON_DATA_SPECIES); +} + +void sp0B5_daycare(void) +{ + sub_80422C4(&gSaveBlock1.daycareData); +} + +u8 sp0B6_daycare(void) +{ + u8 monCount; + if (sub_80422B4(&gSaveBlock1.daycareData)) + { + return 1; + } + monCount = Daycare_CountPokemon(&gSaveBlock1.daycareData); + if (monCount != 0) + { + return monCount + 1; + } + return 0; +} + +#ifdef NONMATCHING +static +#endif +bool8 sub_80423A8(u16 *a, u16 *b) +{ + int i, j; + u16 *v0, *v1, v2; + for (i=0, v0=a; i<2; v0++, i++) + { + for (j=0, v2=*v0, v1=b; j<2; v1++, j++) + { + if (v2 == *v1) + { + return TRUE; + } + } + } + return FALSE; +} + +#ifdef NONMATCHING +static u8 daycare_relationship_score(struct DayCareData *dayCareData) +{ + u16 species[2]; + u32 otIds[2]; + u32 genders[2]; + u16 eggGroups[2][2]; + int i; + u16 *spc; + u32 *ids; + u32 *gnd; + u16 *egg1; + u16 *egg2; + struct BoxPokemon *parent; + for (i=0, parent=&dayCareData->mons[0], spc=species, ids=otIds, gnd=genders, egg1=&eggGroups[0][0], egg2=&eggGroups[0][1]; i<2; spc++, egg1+=2, egg2+=2, parent++, i++) + { + *spc = GetBoxMonData(parent, MON_DATA_SPECIES); + *ids++ = GetBoxMonData(parent, MON_DATA_OT_ID); + *gnd++ = GetGenderFromSpeciesAndPersonality(*spc, GetBoxMonData(parent, MON_DATA_PERSONALITY)); + *egg1 = gBaseStats[*spc].eggGroup1; + *egg2 = gBaseStats[*spc].eggGroup2; + } + if (eggGroups[0][0] == 0xf) + { + return 0; + } + if (eggGroups[1][0] == 0xf) + { + return 0; + } + if (eggGroups[0][0] == 0xd && eggGroups[1][0] == 0xd) + { + return 0; + } + else if (eggGroups[0][0] == 0xd || eggGroups[1][0] == 0xd) + { + if (otIds[0] == otIds[1]) + { + return 20; + } + return 50; + } + if (genders[0] == genders[1] || genders[0] == MON_GENDERLESS || genders[1] == MON_GENDERLESS) + { + return 0; + } + if (!sub_80423A8(eggGroups[0], eggGroups[1])) + { + return 0; + } + if (species[0] == species[1]) + { + if (otIds[0] == otIds[1]) + { + return 50; + } + return 70; + } + else + { + if (otIds[0] != otIds[1]) + { + return 50; + } + return 20; + } +} +#else +__attribute__((naked)) +static u8 daycare_relationship_score(struct DayCareData *dayCareData) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0x2C\n" + "\tmovs r1, 0\n" + "\tmov r8, r1\n" + "\tmov r2, sp\n" + "\tadds r2, 0x8\n" + "\tstr r2, [sp, 0x1C]\n" + "\tadd r1, sp, 0xC\n" + "\tmov r10, r1\n" + "\tadds r2, 0xC\n" + "\tstr r2, [sp, 0x20]\n" + "\tmov r1, sp\n" + "\tadds r1, 0x2\n" + "\tldr r2, _08042488 @ =gBaseStats\n" + "\tmov r9, r2\n" + "\tldr r5, [sp, 0x1C]\n" + "\tadds r7, r1, 0\n" + "\tmov r6, sp\n" + "\tldr r1, [sp, 0x20]\n" + "\tstr r1, [sp, 0x24]\n" + "\tmov r2, r10\n" + "\tstr r2, [sp, 0x28]\n" + "\tadds r4, r0, 0\n" + "_0804240E:\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0xB\n" + "\tbl GetBoxMonData\n" + "\tstrh r0, [r5]\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0x1\n" + "\tbl GetBoxMonData\n" + "\tldr r1, [sp, 0x28]\n" + "\tstm r1!, {r0}\n" + "\tstr r1, [sp, 0x28]\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0\n" + "\tbl GetBoxMonData\n" + "\tadds r1, r0, 0\n" + "\tldrh r0, [r5]\n" + "\tbl GetGenderFromSpeciesAndPersonality\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tldr r2, [sp, 0x24]\n" + "\tstm r2!, {r0}\n" + "\tstr r2, [sp, 0x24]\n" + "\tldrh r1, [r5]\n" + "\tlsls r0, r1, 3\n" + "\tsubs r0, r1\n" + "\tlsls r0, 2\n" + "\tadd r0, r9\n" + "\tldrb r0, [r0, 0x14]\n" + "\tstrh r0, [r6]\n" + "\tldrh r1, [r5]\n" + "\tlsls r0, r1, 3\n" + "\tsubs r0, r1\n" + "\tlsls r0, 2\n" + "\tadd r0, r9\n" + "\tldrb r0, [r0, 0x15]\n" + "\tstrh r0, [r7]\n" + "\tadds r5, 0x2\n" + "\tadds r7, 0x4\n" + "\tadds r6, 0x4\n" + "\tadds r4, 0x50\n" + "\tmovs r0, 0x1\n" + "\tadd r8, r0\n" + "\tmov r1, r8\n" + "\tcmp r1, 0x1\n" + "\tbls _0804240E\n" + "\tmov r0, sp\n" + "\tldrh r1, [r0]\n" + "\tcmp r1, 0xF\n" + "\tbeq _08042484\n" + "\tldrh r0, [r0, 0x4]\n" + "\tcmp r0, 0xF\n" + "\tbeq _08042484\n" + "\tcmp r1, 0xD\n" + "\tbne _0804248C\n" + "\tcmp r0, 0xD\n" + "\tbne _08042490\n" + "_08042484:\n" + "\tmovs r0, 0\n" + "\tb _080424E4\n" + "\t.align 2, 0\n" + "_08042488: .4byte gBaseStats\n" + "_0804248C:\n" + "\tcmp r0, 0xD\n" + "\tbne _0804249C\n" + "_08042490:\n" + "\tldr r1, [sp, 0xC]\n" + "\tmov r2, r10\n" + "\tldr r0, [r2, 0x4]\n" + "\tcmp r1, r0\n" + "\tbeq _080424DE\n" + "\tb _080424E2\n" + "_0804249C:\n" + "\tldr r0, [sp, 0x14]\n" + "\tldr r2, [sp, 0x20]\n" + "\tldr r1, [r2, 0x4]\n" + "\tcmp r0, r1\n" + "\tbeq _08042484\n" + "\tcmp r0, 0xFF\n" + "\tbeq _08042484\n" + "\tcmp r1, 0xFF\n" + "\tbeq _08042484\n" + "\tadd r1, sp, 0x4\n" + "\tmov r0, sp\n" + "\tbl sub_80423A8\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _08042484\n" + "\tldr r0, [sp, 0x1C]\n" + "\tldrh r1, [r0, 0x2]\n" + "\tldrh r0, [r0]\n" + "\tcmp r0, r1\n" + "\tbne _080424D4\n" + "\tldr r1, [sp, 0xC]\n" + "\tmov r2, r10\n" + "\tldr r0, [r2, 0x4]\n" + "\tcmp r1, r0\n" + "\tbeq _080424E2\n" + "\tmovs r0, 0x46\n" + "\tb _080424E4\n" + "_080424D4:\n" + "\tldr r1, [sp, 0xC]\n" + "\tmov r2, r10\n" + "\tldr r0, [r2, 0x4]\n" + "\tcmp r1, r0\n" + "\tbne _080424E2\n" + "_080424DE:\n" + "\tmovs r0, 0x14\n" + "\tb _080424E4\n" + "_080424E2:\n" + "\tmovs r0, 0x32\n" + "_080424E4:\n" + "\tadd sp, 0x2C\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r1}\n" + "\tbx r1"); +} +#endif + +u8 daycare_relationship_score_from_savegame(void) +{ + return daycare_relationship_score(&gSaveBlock1.daycareData); +} + +void sp0B9_daycare_relationship_comment(void) +{ + u8 whichString; + u8 relationshipScore; + + relationshipScore = daycare_relationship_score_from_savegame(); + whichString = 0; + if (relationshipScore == 0) + whichString = 3; + if (relationshipScore == 20) + whichString = 2; + if (relationshipScore == 50) + whichString = 1; + if (relationshipScore == 70) + whichString = 0; + StringCopy(gStringVar4, gUnknown_08209AC4[whichString]); +} + +#ifdef NONMATCHING +bool8 NameHasGenderSymbol(const u8 *name, u8 genderRatio) +{ + u8 i; + u8 flags[2]; + + // This portion is nonmatching + flags[1] = 0; + flags[0] = 0; + for (i = 0; name[i] != EOS; i ++) + // End nonmatching portion + + { + if (name[i] == CHAR_MALE) flags[0] ++; + if (name[i] == CHAR_FEMALE) flags[1] ++; + } + if (genderRatio == MON_MALE && flags[0] && !flags[1]) return TRUE; + if (genderRatio == MON_FEMALE && flags[1] && !flags[0]) return TRUE; + return FALSE; +} +#else +__attribute__((naked)) +bool8 NameHasGenderSymbol(const u8 *name, u8 genderRatio) +{ + asm_unified("\n" + "\tpush {r4,r5,lr}\n" + "\tsub sp, 0x4\n" + "\tadds r4, r0, 0\n" + "\tlsls r1, 24\n" + "\tlsrs r5, r1, 24\n" + "\tmov r2, sp\n" + "\tmov r1, sp\n" + "\tmovs r0, 0\n" + "\tstrb r0, [r1, 0x1]\n" + "\tstrb r0, [r2]\n" + "\tmovs r3, 0\n" + "\tldrb r0, [r4]\n" + "\tcmp r0, 0xFF\n" + "\tbeq _0804258C\n" + "_08042564:\n" + "\tadds r1, r4, r3\n" + "\tldrb r0, [r1]\n" + "\tcmp r0, 0xB5\n" + "\tbne _08042572\n" + "\tldrb r0, [r2]\n" + "\tadds r0, 0x1\n" + "\tstrb r0, [r2]\n" + "_08042572:\n" + "\tldrb r0, [r1]\n" + "\tcmp r0, 0xB6\n" + "\tbne _0804257E\n" + "\tldrb r0, [r2, 0x1]\n" + "\tadds r0, 0x1\n" + "\tstrb r0, [r2, 0x1]\n" + "_0804257E:\n" + "\tadds r0, r3, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r3, r0, 24\n" + "\tadds r0, r4, r3\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0xFF\n" + "\tbne _08042564\n" + "_0804258C:\n" + "\tcmp r5, 0\n" + "\tbne _080425A0\n" + "\tmov r0, sp\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbeq _080425A0\n" + "\tmov r0, sp\n" + "\tldrb r0, [r0, 0x1]\n" + "\tcmp r0, 0\n" + "\tbeq _080425B4\n" + "_080425A0:\n" + "\tcmp r5, 0xFE\n" + "\tbne _080425B8\n" + "\tmov r0, sp\n" + "\tldrb r0, [r0, 0x1]\n" + "\tcmp r0, 0\n" + "\tbeq _080425B8\n" + "\tmov r0, sp\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbne _080425B8\n" + "_080425B4:\n" + "\tmovs r0, 0x1\n" + "\tb _080425BA\n" + "_080425B8:\n" + "\tmovs r0, 0\n" + "_080425BA:\n" + "\tadd sp, 0x4\n" + "\tpop {r4,r5}\n" + "\tpop {r1}\n" + "\tbx r1"); +} +#endif + +static u8 *AppendGenderSymbol(u8 *name, u8 gender) +{ + if (gender == MON_MALE) + { + if (!NameHasGenderSymbol(name, MON_MALE)) + return StringAppend(name, gOtherText_MaleSymbol3); + } + + else if (gender == MON_FEMALE) + { + if (!NameHasGenderSymbol(name, MON_FEMALE)) + return StringAppend(name, gOtherText_FemaleSymbol3); + } + return StringAppend(name, gOtherText_GenderlessSymbol); +} + +static u8 *MonAppendGenderSymbol(u8 *name, struct BoxPokemon *boxMon) +{ + return AppendGenderSymbol(name, GetBoxMonGender(boxMon)); +} + +static void DaycareLevelMenuGetText(struct DayCareData *dayCareData, u8 *dest) +{ + u8 buffers[2][20]; + u8 i; + *dest = EOS; + for (i = 0; i < 2; i ++) + { + GetBoxMonNick(&dayCareData->mons[i], buffers[i]); + MonAppendGenderSymbol(buffers[i], &dayCareData->mons[i]); + } + StringCopy(dest, buffers[0]); + StringAppend(dest, gOtherText_NewLine2); + StringAppend(dest, buffers[1]); + StringAppend(dest, gOtherText_NewLine2); + StringAppend(dest, gOtherText_CancelAndLv); +} + +static void DaycareLevelMenuGetLevelText(struct DayCareData *dayCareData, u8 *dest) +{ + u8 i; + u8 level; + *dest = EOS; + for (i = 0; i < 2; i ++) + { + level = Daycare_GetLevelAfterSteps(&dayCareData->mons[i], dayCareData->misc.countersEtc.steps[i]); + dest[0] = 0x34; + dest[1] = 0xFC; + dest[2] = 0x14; + dest[3] = 0x06; + dest = ConvertIntToDecimalStringN(dest + 4, level, STR_CONV_MODE_RIGHT_ALIGN, 3); + dest[0] = 0xFC; + dest[1] = 0x14; + dest[2] = 0x00; + dest = StringCopy(dest + 3, gOtherText_NewLine2); + } + *dest = EOS; +} + +static void DaycareLevelMenuProcessKeyInput(u8 taskId) +{ + if (gMain.newKeys & DPAD_UP) + { + if (gTasks[taskId].data[0] != 0) + { + gTasks[taskId].data[0] --; + MoveMenuCursor(-1); + PlaySE(SE_SELECT); + } + } + else if (gMain.newKeys & DPAD_DOWN) + { + if (gTasks[taskId].data[0] != 2) + { + gTasks[taskId].data[0] ++; + MoveMenuCursor(+1); + PlaySE(SE_SELECT); + } + } + else if (gMain.newKeys & A_BUTTON) + { + HandleDestroyMenuCursors(); + PlaySE(SE_SELECT); + gLastFieldPokeMenuOpened = gScriptResult = gTasks[taskId].data[0]; + DestroyTask(taskId); + MenuZeroFillWindowRect(15, 6, 29, 13); + EnableBothScriptContexts(); + } + else if (gMain.newKeys & B_BUTTON) + { + HandleDestroyMenuCursors(); + gLastFieldPokeMenuOpened = gScriptResult = 2; + DestroyTask(taskId); + MenuZeroFillWindowRect(15, 6, 29, 13); + EnableBothScriptContexts(); + } +} + +void ShowDaycareLevelMenu(void) +{ + u8 buffer[100]; + MenuDrawTextWindow(15, 6, 29, 13); + DaycareLevelMenuGetText(&gSaveBlock1.daycareData, buffer); + MenuPrint(buffer, 16, 7); + DaycareLevelMenuGetLevelText(&gSaveBlock1.daycareData, buffer); + MenuPrint_PixelCoords(buffer, 0xce, 0x38, TRUE); + InitMenu(0, 16, 7, 3, 0, 13); + CreateTask(DaycareLevelMenuProcessKeyInput, 3); +} + +void ChooseSendDaycareMon(void) +{ + OpenPartyMenu(PARTY_MENU_TYPE_DAYCARE, 0); + gMain.savedCallback = c2_exit_to_overworld_2_switch; +} diff --git a/src/decoration.c b/src/field/decoration.c index 1d48692c1..59c19c20a 100644 --- a/src/decoration.c +++ b/src/field/decoration.c @@ -619,7 +619,7 @@ const u8 DecorDesc_REGISTEEL_DOLL[] = _( "Place it on a mat\n" "or a desk."); #elif GERMAN -#include "data/decoration/descriptions_de.h" +#include "../data/decoration/descriptions_de.h" #endif const u16 DecorGfx_SMALL_DESK[] = { @@ -1389,7 +1389,7 @@ const struct Decoration gDecorations[] = { {DECOR_REGISTEEL_DOLL, _("REGISTEEL DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_REGISTEEL_DOLL, DecorGfx_REGISTEEL_DOLL} }; #elif GERMAN -#include "data/decoration/decorations.h" +#include "../data/decoration/decorations.h" #endif const u8 *const gUnknown_083EC5E4[] = { @@ -1494,7 +1494,7 @@ const union AnimCmd *const gSpriteAnimTable_83EC930[] = { }; const struct SpriteFrameImage gSpriteImageTable_83EC934[] = { - {.data = (u8 *)&gUnknown_02038900.image, .size = sizeof gUnknown_02038900.image} + {.data = gUnknown_02038900.image, .size = sizeof(gUnknown_02038900.image)} }; const struct SpriteTemplate gSpriteTemplate_83EC93C = { @@ -2199,7 +2199,7 @@ void sub_80FF0E0(u8 taskId) void sub_80FF114(u8 taskId) { DrawWholeMapView(); - warp1_set(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1, gTasks[taskId].data[3], gTasks[taskId].data[4]); + Overworld_SetWarpDestination(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1, gTasks[taskId].data[3], gTasks[taskId].data[4]); warp_in(); } void sub_80FF160(u8 taskId) diff --git a/src/decoration_inventory.c b/src/field/decoration_inventory.c index 35ba7e228..687589373 100644 --- a/src/decoration_inventory.c +++ b/src/field/decoration_inventory.c @@ -1,5 +1,5 @@ // -// Created by Scott Norton on 6/5/17. + // #include "global.h" @@ -8,7 +8,7 @@ #include "decoration.h" #include "decoration_inventory.h" -#define DECOR_INV(ptr) {.items = (u8 *)&ptr, .size = sizeof ptr} +#define DECOR_INV(ptr) {.items = ptr, .size = sizeof ptr} struct DecorationInventory const gDecorationInventories[] = { DECOR_INV(gSaveBlock1.decorDesk), diff --git a/src/dewford_trend.c b/src/field/dewford_trend.c index aaf4dd66a..aaf4dd66a 100644 --- a/src/dewford_trend.c +++ b/src/field/dewford_trend.c diff --git a/src/diploma.c b/src/field/diploma.c index 27601404c..27601404c 100644 --- a/src/diploma.c +++ b/src/field/diploma.c diff --git a/src/easy_chat.c b/src/field/easy_chat.c index dd33e69c3..8e7413516 100644 --- a/src/easy_chat.c +++ b/src/field/easy_chat.c @@ -19,6 +19,8 @@ extern const u8 gEasyChatGroupSizes[]; extern u16 gSpecialVar_0x8004; +IWRAM_DATA u8 gUnknown_03000740; + // returns the end of the destination buffer text u8 *EasyChat_GetWordText(u8 *dst, u16 word) { @@ -159,7 +161,7 @@ u16 unref_sub_80EB5E0(u16 arg0) { case EC_GROUP_POKEMON: // 0 case EC_GROUP_POKEMON_2: // 21 - chars = (u8 *) gSpeciesNames[word]; + chars = gSpeciesNames[word]; break; case EC_GROUP_MOVE_1: // 18 case EC_GROUP_MOVE_2: // 19 @@ -276,13 +278,13 @@ void sub_80EB7C4(void) switch (gSpecialVar_0x8004) { case 0: - words = gSaveBlock1.unk2B1C; + words = gSaveBlock1.easyChats.unk2B1C; arg1 = 2; arg2 = 2; break; case 1: - words = gSaveBlock1.unk2B28; - if (sub_80EB680(gSaveBlock1.unk2B28, 3, 2, 20)) + words = gSaveBlock1.easyChats.unk2B28; + if (sub_80EB680(gSaveBlock1.easyChats.unk2B28, 3, 2, 20)) { arg1 = 2; arg2 = 3; @@ -294,12 +296,12 @@ void sub_80EB7C4(void) } break; case 2: - words = gSaveBlock1.unk2B34; + words = gSaveBlock1.easyChats.unk2B34; arg1 = 3; arg2 = 2; break; case 3: - words = gSaveBlock1.unk2B40; + words = gSaveBlock1.easyChats.unk2B40; arg1 = 3; arg2 = 2; break; @@ -428,7 +430,7 @@ static u16 sub_80EB9D8(void) for (i = 0; i < gEasyChatGroupSizes[EC_GROUP_POKEMON]; i++) { const u16 dexNum = SpeciesToNationalPokedexNum(*speciesList); - const u8 local2 = GetNationalPokedexFlag(dexNum, 0); + const u8 local2 = GetSetPokedexFlag(dexNum, 0); if (local2) { diff --git a/src/event_data.c b/src/field/event_data.c index ee475343f..43d49c417 100644 --- a/src/event_data.c +++ b/src/field/event_data.c @@ -114,10 +114,8 @@ u16 *GetVarPointer(u16 id) { if (id < 0x4000) return NULL; - - if ((s16)id >= 0) + if (id < 0x8000) return &gSaveBlock1.vars[id - 0x4000]; - return gSpecialVars[id - 0x8000]; } diff --git a/src/field_camera.c b/src/field/field_camera.c index db51cf054..a29f4c49f 100644 --- a/src/field_camera.c +++ b/src/field/field_camera.c @@ -7,7 +7,7 @@ #include "sprite.h" #include "text.h" -EWRAM_DATA u8 gUnknown_0202E854 = 0; +EWRAM_DATA bool8 gUnusedBikeCameraAheadPanback = FALSE; struct UnknownStruct { @@ -455,13 +455,14 @@ static void CameraPanningCB_PanAhead(void) { u8 var; - if (gUnknown_0202E854 == 0) + if (gUnusedBikeCameraAheadPanback == FALSE) { InstallCameraPanAheadCallback(); } else { - if (gPlayerAvatar.running1 == 1) + // this code is never reached. + if (gPlayerAvatar.tileTransitionState == T_TILE_TRANSITION) { gUnknown_0300059C ^= 1; if (gUnknown_0300059C == 0) diff --git a/src/field_control_avatar.c b/src/field/field_control_avatar.c index ff8e8504c..e9dd0e9a6 100644 --- a/src/field_control_avatar.c +++ b/src/field/field_control_avatar.c @@ -124,8 +124,8 @@ void FieldClearPlayerInput(struct FieldInput *input) void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys) { - u8 r6 = gPlayerAvatar.running1; - u8 r9 = gPlayerAvatar.running2; + u8 r6 = gPlayerAvatar.tileTransitionState; + u8 r9 = gPlayerAvatar.runningState; bool8 forcedMove = MetatileBehavior_IsMoveTile(cur_mapdata_block_role_at_player_pos(r9)); if ((r6 == 2 && forcedMove == FALSE) || r6 == 0) @@ -856,7 +856,7 @@ u8 sub_8068F18(void) return 0; } -u8 *GetFieldObjectScriptPointerForComparison(void) +u8 *GetFieldObjectScriptPointerPlayerFacing(void) { u8 r4; struct MapPosition position; diff --git a/src/field_door.c b/src/field/field_door.c index ab46f0696..ab46f0696 100644 --- a/src/field_door.c +++ b/src/field/field_door.c diff --git a/src/field_effect.c b/src/field/field_effect.c index 0625e9d18..bd78fb632 100644 --- a/src/field_effect.c +++ b/src/field/field_effect.c @@ -37,7 +37,7 @@ const u16 gFieldEffectObjectPalette4[16] = INCBIN_U16("graphics/field_effect_obj const u32 gSpriteImage_839E474[] = INCBIN_U32("graphics/misc/pokecenter_monitor/0.4bpp"); const u32 gSpriteImage_839E534[] = INCBIN_U32("graphics/misc/pokecenter_monitor/1.4bpp"); const u32 gSpriteImage_839E5F4[] = INCBIN_U32("graphics/misc/big_hof_monitor.4bpp"); -const u32 gSpriteImage_839E7F4[] = INCBIN_U32("graphics/misc/small_hof_monitor.4bpp"); +const u8 gSpriteImage_839E7F4[] = INCBIN_U8("graphics/misc/small_hof_monitor.4bpp"); const u16 gFieldEffectObjectPalette5[16] = INCBIN_U16("graphics/field_effect_objects/palettes/05.gbapal"); // Graphics for the lights streaking past your Pokemon when it uses a field move. @@ -110,7 +110,7 @@ const struct SpriteFrameImage gSpriteImageTable_839F170[] = { }; const struct SpriteFrameImage gSpriteImageTable_839F178[] = { - {.data = (u8 *)gSpriteImage_839E7F4, .size = 0x200} // the macro breaks down here + {.data = gSpriteImage_839E7F4, .size = 0x200} // the macro breaks down here }; const struct Subsprite Unknown_39F180[] = { @@ -660,7 +660,7 @@ u8 CreateMonSprite_FieldMove(u16 species, u32 d, u32 g, s16 x, s16 y, u8 subprio const struct CompressedSpritePalette *spritePalette; HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, (u32)gUnknown_081FAF4C[3] /* this is actually u8* or something, pointing to ewram */, gUnknown_081FAF4C[3], species, g); - spritePalette = sub_80409C8(species, d, g); + spritePalette = GetMonSpritePalStructFromOtIdPersonality(species, d, g); LoadCompressedObjectPalette(spritePalette); GetMonSpriteTemplate_803C56C(species, 3); gUnknown_02024E8C.paletteTag = spritePalette->tag; @@ -1213,7 +1213,7 @@ void task00_8084310(u8 taskId) } if (!FieldEffectActiveListContains(FLDEFF_USE_FLY)) { - flag_var_implications_of_teleport_(); + Overworld_ResetStateAfterFly(); warp_in(); SetMainCallback2(CB2_LoadMap); gFieldCallback = mapldr_08084390; @@ -1223,7 +1223,7 @@ void task00_8084310(u8 taskId) void mapldr_08084390(void) { - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); pal_fill_black(); CreateTask(c3_080843F8, 0); gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 1; @@ -1264,7 +1264,7 @@ extern void CameraObjectReset1(void); void sub_8086748(void) { - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); pal_fill_for_map_transition(); ScriptContext2_Enable(); FreezeMapObjects(); @@ -1287,7 +1287,7 @@ bool8 sub_80867AC(struct Task *task) // gUnknown_0839F2CC[0] playerSprite = &gSprites[gPlayerAvatar.spriteId]; CameraObjectReset2(); gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 1; - gPlayerAvatar.unk6 = 1; + gPlayerAvatar.preventStep = TRUE; FieldObjectSetSpecialAnim(playerObject, GetFaceDirectionAnimId(player_get_direction_lower_nybble())); task->data[4] = playerSprite->subspriteMode; playerObject->mapobj_bit_26 = 1; @@ -1382,7 +1382,7 @@ bool8 sub_80869B8(struct Task *task) bool8 sub_80869F8(struct Task *task) { - gPlayerAvatar.unk6 = 0; + gPlayerAvatar.preventStep = FALSE; ScriptContext2_Disable(); CameraObjectReset1(); UnfreezeMapObjects(); @@ -1533,7 +1533,7 @@ void sub_8086C40(void) void sub_8086C94(void) { - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); pal_fill_for_map_transition(); ScriptContext2_Enable(); CreateTask(sub_8086CBC, 0); @@ -1678,7 +1678,7 @@ void sub_8086F64(u8 taskId) bool8 sub_8086FB0(struct Task *task, struct MapObject *mapObject) { ScriptContext2_Enable(); - gPlayerAvatar.unk6 = 1; + gPlayerAvatar.preventStep = TRUE; task->data[0]++; return FALSE; } @@ -1725,7 +1725,7 @@ bool8 sub_8087058(struct Task *task, struct MapObject *mapObject) return TRUE; } ScriptContext2_Disable(); - gPlayerAvatar.unk6 = 0; + gPlayerAvatar.preventStep = FALSE; DestroyTask(FindTaskIdByFunc(sub_8086F64)); FieldEffectActiveListRemove(FLDEFF_USE_WATERFALL); return FALSE; @@ -1751,7 +1751,7 @@ void Task_Dive(u8 taskId) bool8 sub_8087124(struct Task *task) { - gPlayerAvatar.unk6 = 1; + gPlayerAvatar.preventStep = TRUE; task->data[0]++; return FALSE; } @@ -1796,7 +1796,7 @@ bool8 sub_808722C(struct Task *task, struct MapObject *mapObject, struct Sprite FreezeMapObjects(); CameraObjectReset2(); SetCameraPanningCallback(NULL); - gPlayerAvatar.unk6 = 1; + gPlayerAvatar.preventStep = TRUE; mapObject->mapobj_bit_26 = 1; task->data[1] = 1; task->data[0]++; @@ -1894,11 +1894,10 @@ bool8 sub_80873F4(struct Task *task, struct MapObject *mapObject, struct Sprite } void sub_8087470(u8); -extern u8 sub_80608A4(u8); void mapldr_080851BC(void) { - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); pal_fill_for_map_transition(); ScriptContext2_Enable(); gFieldCallback = NULL; @@ -1914,7 +1913,7 @@ bool8 sub_80874CC(struct Task *task, struct MapObject *mapObject, struct Sprite { CameraObjectReset2(); FreezeMapObjects(); - gPlayerAvatar.unk6 = 1; + gPlayerAvatar.preventStep = TRUE; mapObject->mapobj_bit_13 = 1; task->data[0]++; return FALSE; @@ -1952,7 +1951,7 @@ bool8 sub_808759C(struct Task *task, struct MapObject *mapObject, struct Sprite { if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) { - gPlayerAvatar.unk6 = 0; + gPlayerAvatar.preventStep = FALSE; ScriptContext2_Disable(); UnfreezeMapObjects(); DestroyTask(FindTaskIdByFunc(sub_8087470)); @@ -1997,7 +1996,7 @@ bool8 sub_80876C8(struct Task *task, struct MapObject *mapObject, struct Sprite { FreezeMapObjects(); CameraObjectReset2(); - gPlayerAvatar.unk6 = 1; + gPlayerAvatar.preventStep = TRUE; mapObject->mapobj_bit_26 = 1; task->data[0]++; return FALSE; @@ -2135,7 +2134,7 @@ void sub_8087A74(u8); void mapldr_080859D4(void) { - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); pal_fill_for_map_transition(); ScriptContext2_Enable(); FreezeMapObjects(); @@ -2267,7 +2266,7 @@ void sub_8087D78(struct Task *task) { if (!gPaletteFade.active && sub_8054034() == TRUE) { - sub_8053570(); + Overworld_SetWarpDestToLastHealLoc(); warp_in(); SetMainCallback2(CB2_LoadMap); gFieldCallback = mapldr_08085D88; @@ -2279,7 +2278,7 @@ void sub_8087E1C(u8); void mapldr_08085D88(void) { - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); pal_fill_for_map_transition(); ScriptContext2_Enable(); FreezeMapObjects(); @@ -2880,7 +2879,7 @@ u8 FldEff_UseSurf(void) u8 taskId; taskId = CreateTask(sub_8088954, 0xff); gTasks[taskId].data[15] = gFieldEffectArguments[0]; - sav1_reset_battle_music_maybe(); + Overworld_ClearSavedMusic(); Overworld_ChangeMusicTo(0x016d); return FALSE; } @@ -2894,7 +2893,7 @@ void sub_8088984(struct Task *task) { ScriptContext2_Enable(); FreezeMapObjects(); - gPlayerAvatar.unk6 = 1; + gPlayerAvatar.preventStep = TRUE; SetPlayerAvatarStateMask(8); PlayerGetDestCoords(&task->data[1], &task->data[2]); MoveCoords(gMapObjects[gPlayerAvatar.mapObjectId].placeholder18, &task->data[1], &task->data[2]); @@ -2948,7 +2947,7 @@ void sub_8088AF4(struct Task *task) mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) { - gPlayerAvatar.unk6 = 0; + gPlayerAvatar.preventStep = FALSE; gPlayerAvatar.flags &= 0xdf; FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(mapObject->placeholder18)); sub_8127ED0(mapObject->mapobj_unk_1A, 1); @@ -3025,7 +3024,7 @@ void sub_8088CA0(struct Task *task) if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) { task->data[15] = gPlayerAvatar.flags; - gPlayerAvatar.unk6 = 0x01; + gPlayerAvatar.preventStep = TRUE; SetPlayerAvatarStateMask(1); sub_8059BF4(); FieldObjectSetSpecialAnim(mapObject, 0x39); @@ -3297,7 +3296,7 @@ void sub_80892A0(struct Task *task) task->data[0]++; task->data[2] = 17; task->data[15] = gPlayerAvatar.flags; - gPlayerAvatar.unk6 = 1; + gPlayerAvatar.preventStep = TRUE; SetPlayerAvatarStateMask(0x01); if (task->data[15] & 0x08) { @@ -3399,7 +3398,7 @@ void fishE(struct Task *task) sub_805B980(mapObject, GetPlayerAvatarGraphicsIdByStateId(state)); FieldObjectTurn(mapObject, DIR_SOUTH); gPlayerAvatar.flags = task->data[15]; - gPlayerAvatar.unk6 = 0; + gPlayerAvatar.preventStep = FALSE; FieldEffectActiveListRemove(FLDEFF_FLY_IN); DestroyTask(FindTaskIdByFunc(sub_8089270)); } diff --git a/src/field/field_effect_helpers.c b/src/field/field_effect_helpers.c new file mode 100644 index 000000000..2ad8bdce3 --- /dev/null +++ b/src/field/field_effect_helpers.c @@ -0,0 +1,1632 @@ +#include "global.h" +#include "sprite.h" +#include "fieldmap.h" +#include "metatile_behavior.h" +#include "songs.h" +#include "sound.h" +#include "field_map_obj.h" +#include "field_camera.h" +#include "field_map_obj_helpers.h" +#include "field_weather.h" +#include "field_effect.h" +#include "field_ground_effect.h" +#include "field_effect_helpers.h" + +static void sub_81269E0(struct Sprite *); +static void npc_pal_op(struct MapObject *mapObject, struct Sprite *sprite); +static void npc_pal_op_A(struct MapObject *, u8); +static void npc_pal_op_B(struct MapObject *, u8); +static void sub_81275A0(struct Sprite *); +static void sub_81275C4(struct Sprite *); +static void sub_8127DA0(struct Sprite *); +static void sub_8127DD0(struct Sprite *); +static void sub_8127E30(struct Sprite *); +static void sub_812882C(struct Sprite *, u8, u8); +static void sub_81278D8(struct Sprite *); +static void sub_8127FD4(struct MapObject *, struct Sprite *); +static void sub_812800C(struct MapObject *, struct Sprite *); +static void sub_81280A0(struct MapObject *, struct Sprite *, struct Sprite *); +static void sub_8128174(struct Sprite *); +static u32 ShowDisguiseFieldEffect(u8, u8, u8); + +const u8 UnusedEggString_8401E28[] = _("タマゴ"); + +const u16 gUnknown_08401E2C[] = { + 0x0c, + 0x1c, + 0x2c +}; + +const u8 gUnknown_08401E32[] = { + 0, + 1, + 2, + 3 +}; + +const u16 gUnknown_08401E36[] = { + 4, + 4, + 4, + 16 +}; + +void (*const gUnknown_08401E40[])(struct Sprite *) = { + sub_81275A0, + sub_81275C4 +}; + +void (*const gUnknown_08401E48[])(struct Sprite *) = { + sub_8127DA0, + sub_8127DD0, + sub_8127E30 +}; + +const u8 gUnknown_08401E54[] = { + 0, + 0, + 1, + 2, + 3 +}; + +const u16 gUnknown_08401E5A[] = { + 3, + 7 +}; + +void SetUpReflection(struct MapObject *mapObject, struct Sprite *sprite, bool8 flag) +{ + struct Sprite *newSprite; + + newSprite = &gSprites[obj_unfreeze(sprite, sprite->pos1.x, sprite->pos1.y, 0x98)]; + newSprite->callback = sub_81269E0; + newSprite->oam.priority = 3; + newSprite->oam.paletteNum = gUnknown_0830FD14[newSprite->oam.paletteNum]; + newSprite->usingSheet = TRUE; + newSprite->anims = gDummySpriteAnimTable; + StartSpriteAnim(newSprite, 0); + newSprite->affineAnims = gDummySpriteAffineAnimTable; + newSprite->affineAnimBeginning = TRUE; + newSprite->subspriteMode = 0; + newSprite->data0 = sprite->data0; + newSprite->data1 = mapObject->localId; + newSprite->data7 = flag; + npc_pal_op(mapObject, newSprite); + if (!flag) + { + newSprite->oam.affineMode = 1; + } +} + +static s16 sub_81268D0(struct MapObject *mapObject) +{ + return GetFieldObjectGraphicsInfo(mapObject->graphicsId)->height - 2; +} + +static void npc_pal_op(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 whichElement; + u16 unk_8041e2c[ARRAY_COUNT(gUnknown_08401E2C)]; + + memcpy(unk_8041e2c, gUnknown_08401E2C, sizeof gUnknown_08401E2C); + sprite->data2 = 0; + if (!GetFieldObjectGraphicsInfo(mapObject->graphicsId)->disableReflectionPaletteLoad && ((whichElement = sub_8057450(mapObject->mapobj_unk_1F)) || (whichElement = sub_8057450(mapObject->mapobj_unk_1E)))) + { + sprite->data2 = unk_8041e2c[whichElement - 1]; + npc_pal_op_A(mapObject, sprite->oam.paletteNum); + } + else + { + npc_pal_op_B(mapObject, sprite->oam.paletteNum); + } +} + +static void npc_pal_op_B(struct MapObject *mapObject, u8 paletteNum) +{ + const struct MapObjectGraphicsInfo *graphicsInfo; + + graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + if (graphicsInfo->paletteTag2 != 0x11ff) + { + if (graphicsInfo->paletteSlot == 0) + { + npc_load_two_palettes__no_record(graphicsInfo->paletteTag1, paletteNum); + } + else if (graphicsInfo->paletteSlot == 10) + { + npc_load_two_palettes__and_record(graphicsInfo->paletteTag1, paletteNum); + } + else + { + pal_patch_for_npc(npc_paltag_by_palslot(paletteNum), paletteNum); + } + sub_807D78C(paletteNum); + } +} + +static void npc_pal_op_A(struct MapObject *mapObject, u8 paletteNum) +{ + const struct MapObjectGraphicsInfo *graphicsInfo; + + graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + if (graphicsInfo->paletteTag2 != 0x11ff) + { + pal_patch_for_npc(graphicsInfo->paletteTag2, paletteNum); + sub_807D78C(paletteNum); + } +} + +static void sub_81269E0(struct Sprite *sprite) +{ + struct MapObject *mapObject; + struct Sprite *oldSprite; + + mapObject = &gMapObjects[sprite->data0]; + oldSprite = &gSprites[mapObject->spriteId]; + if (!mapObject->active || !mapObject->mapobj_bit_17 || mapObject->localId != sprite->data1) + { + sprite->inUse = FALSE; + } + else + { + sprite->oam.paletteNum = gUnknown_0830FD14[oldSprite->oam.paletteNum]; + sprite->oam.shape = oldSprite->oam.shape; + sprite->oam.size = oldSprite->oam.size; + sprite->oam.matrixNum = oldSprite->oam.matrixNum | 0x10; + sprite->oam.tileNum = oldSprite->oam.tileNum; + sprite->subspriteTables = oldSprite->subspriteTables; + sprite->subspriteTableNum = oldSprite->subspriteTableNum; + sprite->invisible = oldSprite->invisible; + sprite->pos1.x = oldSprite->pos1.x; + sprite->pos1.y = oldSprite->pos1.y + sub_81268D0(mapObject) + sprite->data2; + sprite->centerToCornerVecX = oldSprite->centerToCornerVecX; + sprite->centerToCornerVecY = oldSprite->centerToCornerVecY; + sprite->pos2.x = oldSprite->pos2.x; + sprite->pos2.y = -oldSprite->pos2.y; + sprite->coordOffsetEnabled = oldSprite->coordOffsetEnabled; + if (sprite->data7 == FALSE) + { + sprite->oam.matrixNum = 0; + if (oldSprite->oam.matrixNum & 0x8) + { + sprite->oam.matrixNum = 1; + } + } + } +} + +u8 sub_8126B54(void) +{ + u8 spriteId; + struct Sprite *sprite; + + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[8] /*gFieldEffectSpriteTemplate_Arrow*/, 0, 0, 0x52); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->oam.priority = 1; + sprite->coordOffsetEnabled = TRUE; + sprite->invisible = TRUE; + } + return spriteId; +} + +void objid_set_invisible(u8 spriteId) +{ + gSprites[spriteId].invisible = TRUE; +} + +void sub_8126BC4(u8 spriteId, u8 animNum, s16 x, s16 y) +{ + s16 x2; + s16 y2; + struct Sprite *sprite; + + sprite = &gSprites[spriteId]; + if (sprite->invisible || sprite->data0 != x || sprite->data1 != y) + { + sub_80603CC(x, y, &x2, &y2); + sprite = &gSprites[spriteId]; + sprite->pos1.x = x2 + 8; + sprite->pos1.y = y2 + 8; + sprite->invisible = FALSE; + sprite->data0 = x; + sprite->data1 = y; + StartSpriteAnim(sprite, animNum - 1); + } +} + +u32 FldEff_Shadow(void) +{ + u8 mapObjectId; + const struct MapObjectGraphicsInfo *graphicsInfo; + u8 spriteId; + + mapObjectId = GetFieldObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + graphicsInfo = GetFieldObjectGraphicsInfo(gMapObjects[mapObjectId].graphicsId); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[gUnknown_08401E32[graphicsInfo->shadowSize]], 0, 0, 0x94); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].coordOffsetEnabled = TRUE; + gSprites[spriteId].data0 = gFieldEffectArguments[0]; + gSprites[spriteId].data1 = gFieldEffectArguments[1]; + gSprites[spriteId].data2 = gFieldEffectArguments[2]; + gSprites[spriteId].data3 = (graphicsInfo->height >> 1) - gUnknown_08401E36[graphicsInfo->shadowSize]; + } + return 0; +} + +void oamc_shadow(struct Sprite *sprite) +{ + u8 mapObjectId; + struct MapObject *mapObject; + struct Sprite *linkedSprite; + + if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data0, sprite->data1, sprite->data2, &mapObjectId)) + { + FieldEffectStop(sprite, FLDEFF_SHADOW); + } + else + { + mapObject = &gMapObjects[mapObjectId]; + linkedSprite = &gSprites[mapObject->spriteId]; + sprite->oam.priority = linkedSprite->oam.priority; + sprite->pos1.x = linkedSprite->pos1.x; + sprite->pos1.y = linkedSprite->pos1.y + sprite->data3; + if (!mapObject->active || !mapObject->mapobj_bit_22 || MetatileBehavior_IsPokeGrass(mapObject->mapobj_unk_1E) || MetatileBehavior_IsSurfableWaterOrUnderwater(mapObject->mapobj_unk_1E) || MetatileBehavior_IsSurfableWaterOrUnderwater(mapObject->mapobj_unk_1F) || MetatileBehavior_IsReflective(mapObject->mapobj_unk_1E) || MetatileBehavior_IsReflective(mapObject->mapobj_unk_1F)) + { + FieldEffectStop(sprite, FLDEFF_SHADOW); + } + } +} + +u32 FldEff_TallGrass(void) +{ + s16 x; + s16 y; + u8 spriteId; + struct Sprite *sprite; + + x = gFieldEffectArguments[0]; + y = gFieldEffectArguments[1]; + sub_8060470(&x, &y, 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[4], x, y, 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data0 = gFieldEffectArguments[2]; + sprite->data1 = gFieldEffectArguments[0]; + sprite->data2 = gFieldEffectArguments[1]; + sprite->data3 = gFieldEffectArguments[4]; + sprite->data4 = gFieldEffectArguments[5]; + sprite->data5 = gFieldEffectArguments[6]; + if (gFieldEffectArguments[7]) + { + SeekSpriteAnim(sprite, 4); + } + } + return 0; +} + +void unc_grass_normal(struct Sprite *sprite) +{ + u8 mapNum; + u8 mapGroup; + u8 metatileBehavior; + u8 localId; + u8 mapObjectId; + struct MapObject *mapObject; + + mapNum = sprite->data5 >> 8; + mapGroup = sprite->data5; + if (gCamera.field_0 && (gSaveBlock1.location.mapNum != mapNum || gSaveBlock1.location.mapGroup != mapGroup)) + { + sprite->data1 -= gCamera.x; + sprite->data2 -= gCamera.y; + sprite->data5 = ((u8)gSaveBlock1.location.mapNum << 8) | (u8)gSaveBlock1.location.mapGroup; + } + localId = sprite->data3 >> 8; + mapNum = sprite->data3; + mapGroup = sprite->data4; + metatileBehavior = MapGridGetMetatileBehaviorAt(sprite->data1, sprite->data2); + if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId) || !MetatileBehavior_IsTallGrass(metatileBehavior) || (sprite->data7 && sprite->animEnded)) + { + FieldEffectStop(sprite, FLDEFF_TALL_GRASS); + } + else + { + mapObject = &gMapObjects[mapObjectId]; + if ((mapObject->coords2.x != sprite->data1 || mapObject->coords2.y != sprite->data2) && (mapObject->coords3.x != sprite->data1 || mapObject->coords3.y != sprite->data2)) + { + sprite->data7 = TRUE; + } + metatileBehavior = 0; + if (sprite->animCmdIndex == 0) + { + metatileBehavior = 4; + } + sub_806487C(sprite, 0); + sub_812882C(sprite, sprite->data0, metatileBehavior); + } +} + +u32 FldEff_JumpTallGrass(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[10], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data0 = gFieldEffectArguments[2]; + sprite->data1 = 12; + } + return 0; +} + +u8 sub_8126FF0(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) +{ + struct Sprite *sprite; + u8 i; + + for (i = 0; i < MAX_SPRITES; i ++) + { + if (gSprites[i].inUse) + { + sprite = &gSprites[i]; + if (sprite->callback == unc_grass_normal && (x == sprite->data1 && y == sprite->data2) && (localId == (u8)(sprite->data3 >> 8) && mapNum == (sprite->data3 & 0xFF) && mapGroup == sprite->data4)) + { + return i; + } + } + } + return MAX_SPRITES; +} + +u32 FldEff_LongGrass(void) +{ + s16 x; + s16 y; + u8 spriteId; + struct Sprite *sprite; + + x = gFieldEffectArguments[0]; + y = gFieldEffectArguments[1]; + sub_8060470(&x, &y, 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[15], x, y, 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = ZCoordToPriority(gFieldEffectArguments[2]); + sprite->data0 = gFieldEffectArguments[2]; + sprite->data1 = gFieldEffectArguments[0]; + sprite->data2 = gFieldEffectArguments[1]; + sprite->data3 = gFieldEffectArguments[4]; + sprite->data4 = gFieldEffectArguments[5]; + sprite->data5 = gFieldEffectArguments[6]; + if (gFieldEffectArguments[7]) + { + SeekSpriteAnim(sprite, 6); + } + } + return 0; +} + +void unc_grass_tall(struct Sprite *sprite) +{ + u8 mapNum; + u8 mapGroup; + u8 metatileBehavior; + u8 localId; + u8 mapObjectId; + struct MapObject *mapObject; + + mapNum = sprite->data5 >> 8; + mapGroup = sprite->data5; + if (gCamera.field_0 && (gSaveBlock1.location.mapNum != mapNum || gSaveBlock1.location.mapGroup != mapGroup)) + { + sprite->data1 -= gCamera.x; + sprite->data2 -= gCamera.y; + sprite->data5 = ((u8)gSaveBlock1.location.mapNum << 8) | (u8)gSaveBlock1.location.mapGroup; + } + localId = sprite->data3 >> 8; + mapNum = sprite->data3; + mapGroup = sprite->data4; + metatileBehavior = MapGridGetMetatileBehaviorAt(sprite->data1, sprite->data2); + if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId) || !MetatileBehavior_IsLongGrass(metatileBehavior) || (sprite->data7 && sprite->animEnded)) + { + FieldEffectStop(sprite, FLDEFF_LONG_GRASS); + } + else + { + mapObject = &gMapObjects[mapObjectId]; + if ((mapObject->coords2.x != sprite->data1 || mapObject->coords2.y != sprite->data2) && (mapObject->coords3.x != sprite->data1 || mapObject->coords3.y != sprite->data2)) + { + sprite->data7 = TRUE; + } + sub_806487C(sprite, 0); + sub_812882C(sprite, sprite->data0, 0); + } +} + +u32 FldEff_JumpLongGrass(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[16], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data0 = gFieldEffectArguments[2]; + sprite->data1 = 18; + } + return 0; +} + +u32 FldEff_ShortGrass(void) +{ + u8 mapObjectId; + struct MapObject *mapObject; + u8 spriteId; + struct Sprite *sprite; + + mapObjectId = GetFieldObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + mapObject = &gMapObjects[mapObjectId]; + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[30], 0, 0, 0); + if (spriteId != MAX_SPRITES) + { + sprite = &(gSprites[spriteId]); + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gSprites[mapObject->spriteId].oam.priority; + sprite->data0 = gFieldEffectArguments[0]; + sprite->data1 = gFieldEffectArguments[1]; + sprite->data2 = gFieldEffectArguments[2]; + sprite->data3 = gSprites[mapObject->spriteId].pos1.x; + sprite->data4 = gSprites[mapObject->spriteId].pos1.y; + } + return 0; +} + +void sub_8127334(struct Sprite *sprite) +{ + u8 mapObjectId; + s16 x; + s16 y; + const struct MapObjectGraphicsInfo *graphicsInfo; + struct Sprite *linkedSprite; + + if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data0, sprite->data1, sprite->data2, &mapObjectId) || !gMapObjects[mapObjectId].mapobj_bit_18) + { + FieldEffectStop(sprite, FLDEFF_SHORT_GRASS); + } + else + { + graphicsInfo = GetFieldObjectGraphicsInfo(gMapObjects[mapObjectId].graphicsId); + linkedSprite = &gSprites[gMapObjects[mapObjectId].spriteId]; + y = linkedSprite->pos1.y; + x = linkedSprite->pos1.x; + if (x != sprite->data3 || y != sprite->data4) + { + sprite->data3 = x; + sprite->data4 = y; + if (sprite->animEnded) + { + StartSpriteAnim(sprite, 0); + } + } + sprite->pos1.x = x; + sprite->pos1.y = y; + sprite->pos2.y = (graphicsInfo->height >> 1) - 8; + sprite->subpriority = linkedSprite->subpriority - 1; + sprite->oam.priority = linkedSprite->oam.priority; + sub_806487C(sprite, linkedSprite->invisible); + } +} + +u32 FldEff_SandFootprints(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[11], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data7 = FLDEFF_SAND_FOOTPRINTS; + StartSpriteAnim(sprite, gFieldEffectArguments[4]); + } + return 0; +} + +u32 FldEff_DeepSandFootprints(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[23], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data7 = FLDEFF_DEEP_SAND_FOOTPRINTS; + StartSpriteAnim(sprite, gFieldEffectArguments[4]); + } + return spriteId; +} + +u32 FldEff_BikeTireTracks(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[27], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data7 = FLDEFF_BIKE_TIRE_TRACKS; + StartSpriteAnim(sprite, gFieldEffectArguments[4]); + } + return spriteId; +} + +void sub_8127584(struct Sprite *sprite) +{ + gUnknown_08401E40[sprite->data0](sprite); +} + +static void sub_81275A0(struct Sprite *sprite) +{ + if (++sprite->data1 > 40) + { + sprite->data0 = 1; + } + sub_806487C(sprite, FALSE); +} + +static void sub_81275C4(struct Sprite *sprite) +{ + sprite->invisible ^= 1; + sprite->data1 ++; + sub_806487C(sprite, sprite->invisible); + if (sprite->data1 > 56) + { + FieldEffectStop(sprite, sprite->data7); + } +} + +u32 FldEff_Splash(void) +{ + u8 mapObjectId; + struct MapObject *mapObject; + u8 spriteId; + struct Sprite *sprite; + const struct MapObjectGraphicsInfo *graphicsInfo; + struct Sprite *linkedSprite; + + mapObjectId = GetFieldObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + mapObject = &gMapObjects[mapObjectId]; + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[13], 0, 0, 0); + if (spriteId != MAX_SPRITES) + { + graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + linkedSprite = &gSprites[mapObject->spriteId]; + sprite->oam.priority = linkedSprite->oam.priority; + sprite->data0 = gFieldEffectArguments[0]; + sprite->data1 = gFieldEffectArguments[1]; + sprite->data2 = gFieldEffectArguments[2]; + sprite->pos2.y = (graphicsInfo->height >> 1) - 4; + PlaySE(SE_MIZU); + } + return 0; +} + +void sub_81276B4(struct Sprite *sprite) +{ + u8 mapObjectId; + + if (sprite->animEnded || TryGetFieldObjectIdByLocalIdAndMap(sprite->data0, sprite->data1, sprite->data2, &mapObjectId)) + { + FieldEffectStop(sprite, FLDEFF_SPLASH); + } + else + { + sprite->pos1.x = gSprites[gMapObjects[mapObjectId].spriteId].pos1.x; + sprite->pos1.y = gSprites[gMapObjects[mapObjectId].spriteId].pos1.y; + sub_806487C(sprite, FALSE); + } +} + +u32 FldEff_JumpSmallSplash(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[14], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data0 = gFieldEffectArguments[2]; + sprite->data1 = FLDEFF_JUMP_SMALL_SPLASH; + } + return 0; +} + +u32 FldEff_JumpBigSplash(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[12], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data0 = gFieldEffectArguments[2]; + sprite->data1 = FLDEFF_JUMP_BIG_SPLASH; + } + return 0; +} + +u32 FldEff_FeetInFlowingWater(void) +{ + u8 mapObjectId; + struct MapObject *mapObject; + u8 spriteId; + struct Sprite *sprite; + const struct MapObjectGraphicsInfo *graphicsInfo; + + mapObjectId = GetFieldObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + mapObject = &gMapObjects[mapObjectId]; + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[13], 0, 0, 0); + if (spriteId != MAX_SPRITES) + { + graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + sprite = &gSprites[spriteId]; + sprite->callback = sub_81278D8; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gSprites[mapObject->spriteId].oam.priority; + sprite->data0 = gFieldEffectArguments[0]; + sprite->data1 = gFieldEffectArguments[1]; + sprite->data2 = gFieldEffectArguments[2]; + sprite->data3 = -1; + sprite->data4 = -1; + sprite->pos2.y = (graphicsInfo->height >> 1) - 4; + StartSpriteAnim(sprite, 1); + } + return 0; +} + +static void sub_81278D8(struct Sprite *sprite) +{ + u8 mapObjectId; + struct Sprite *linkedSprite; + struct MapObject *mapObject; + + if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data0, sprite->data1, sprite->data2, &mapObjectId) || !gMapObjects[mapObjectId].mapobj_bit_19) + { + FieldEffectStop(sprite, FLDEFF_FEET_IN_FLOWING_WATER); + } + else + { + mapObject = &gMapObjects[mapObjectId]; + linkedSprite = &gSprites[mapObject->spriteId]; + sprite->pos1.x = linkedSprite->pos1.x; + sprite->pos1.y = linkedSprite->pos1.y; + sprite->subpriority = linkedSprite->subpriority; + sub_806487C(sprite, FALSE); + if (mapObject->coords2.x != sprite->data3 || mapObject->coords2.y != sprite->data4) + { + sprite->data3 = mapObject->coords2.x; + sprite->data4 = mapObject->coords2.y; + if (!sprite->invisible) + { + PlaySE(SE_MIZU); + } + } + } +} + +u32 FldEff_Ripple(void) +{ + u8 spriteId; + struct Sprite *sprite; + + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[5], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data0 = FLDEFF_RIPPLE; + } + return 0; +} + +u32 FldEff_HotSpringsWater(void) +{ + u8 mapObjectId; + struct MapObject *mapObject; + u8 spriteId; + struct Sprite *sprite; + + mapObjectId = GetFieldObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + mapObject = &gMapObjects[mapObjectId]; + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[31], 0, 0, 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gSprites[mapObject->spriteId].oam.priority; + sprite->data0 = gFieldEffectArguments[0]; + sprite->data1 = gFieldEffectArguments[1]; + sprite->data2 = gFieldEffectArguments[2]; + sprite->data3 = gSprites[mapObject->spriteId].pos1.x; + sprite->data4 = gSprites[mapObject->spriteId].pos1.y; + } + return 0; +} + +void sub_8127A7C(struct Sprite *sprite) +{ + u8 mapObjectId; + const struct MapObjectGraphicsInfo *graphicsInfo; + struct Sprite *linkedSprite; + + if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data0, sprite->data1, sprite->data2, &mapObjectId) || !gMapObjects[mapObjectId].mapobj_bit_21) + { + FieldEffectStop(sprite, FLDEFF_HOT_SPRINGS_WATER); + } + else + { + graphicsInfo = GetFieldObjectGraphicsInfo(gMapObjects[mapObjectId].graphicsId); + linkedSprite = &gSprites[gMapObjects[mapObjectId].spriteId]; + sprite->pos1.x = linkedSprite->pos1.x; + sprite->pos1.y = (graphicsInfo->height >> 1) + linkedSprite->pos1.y - 8; + sprite->subpriority = linkedSprite->subpriority - 1; + sub_806487C(sprite, FALSE); + } +} + +u32 FldEff_Unknown19(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[17], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data0 = FLDEFF_UNKNOWN_19; + } + return 0; +} + +u32 FldEff_Unknown20(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[18], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data0 = FLDEFF_UNKNOWN_20; + } + return 0; +} + +u32 FldEff_Unknown21(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[19], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data0 = FLDEFF_UNKNOWN_21; + } + return 0; +} + +u32 FldEff_Unknown22(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[20], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data0 = FLDEFF_UNKNOWN_22; + } + return 0; +} + +void ash(s16 x, s16 y, u16 c, s16 d) +{ + gFieldEffectArguments[0] = x; + gFieldEffectArguments[1] = y; + gFieldEffectArguments[2] = 0x52; + gFieldEffectArguments[3] = 1; + gFieldEffectArguments[4] = c; + gFieldEffectArguments[5] = d; + FieldEffectStart(FLDEFF_ASH); +} + +u32 FldEff_Ash(void) +{ + s16 x; + s16 y; + u8 spriteId; + struct Sprite *sprite; + + x = gFieldEffectArguments[0]; + y = gFieldEffectArguments[1]; + sub_8060470(&x, &y, 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[6], x, y, gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data1 = gFieldEffectArguments[0]; + sprite->data2 = gFieldEffectArguments[1]; + sprite->data3 = gFieldEffectArguments[4]; + sprite->data4 = gFieldEffectArguments[5]; + } + return 0; +} + +void sub_8127D84(struct Sprite *sprite) +{ + gUnknown_08401E48[sprite->data0](sprite); +} + +static void sub_8127DA0(struct Sprite *sprite) +{ + sprite->invisible = TRUE; + sprite->animPaused = TRUE; + if (--sprite->data4 == 0) + { + sprite->data0 = 1; + } +} + +static void sub_8127DD0(struct Sprite *sprite) +{ + sprite->invisible = FALSE; + sprite->animPaused = FALSE; + MapGridSetMetatileIdAt(sprite->data1, sprite->data2, sprite->data3); + CurrentMapDrawMetatileAt(sprite->data1, sprite->data2); + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_2 = TRUE; + sprite->data0 = 2; +} + +static void sub_8127E30(struct Sprite *sprite) +{ + sub_806487C(sprite, FALSE); + if (sprite->animEnded) + { + FieldEffectStop(sprite, FLDEFF_ASH); + } +} + +u32 FldEff_SurfBlob(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[7], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x96); + if (spriteId !=MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.paletteNum = 0; + sprite->data2 = gFieldEffectArguments[2]; + sprite->data3 = -1; + sprite->data6 = -1; + sprite->data7 = -1; + } + FieldEffectActiveListRemove(FLDEFF_SURF_BLOB); + return spriteId; +} + +void sub_8127ED0(u8 spriteId, u8 value) +{ + gSprites[spriteId].data0 = (gSprites[spriteId].data0 & ~0xF) | (value & 0xF); +} + +void sub_8127EFC(u8 spriteId, u8 value) +{ + gSprites[spriteId].data0 = (gSprites[spriteId].data0 & ~0xF0) | ((value & 0xF) << 4); +} + +void sub_8127F28(u8 spriteId, u8 value, s16 data1) +{ + gSprites[spriteId].data0 = (gSprites[spriteId].data0 & ~0xF00) | ((value & 0xF) << 8); + gSprites[spriteId].data1 = data1; +} + +static u8 sub_8127F5C(struct Sprite *sprite) +{ + return sprite->data0 & 0xF; +} + +static u8 sub_8127F64(struct Sprite *sprite) +{ + return (sprite->data0 & 0xF0) >> 4; +} + +static u8 sub_8127F70(struct Sprite *sprite) +{ + return (sprite->data0 & 0xF00) >> 8; +} + +void sub_8127F7C(struct Sprite *sprite) +{ + struct MapObject *mapObject; + struct Sprite *linkedSprite; + + mapObject = &gMapObjects[sprite->data2]; + linkedSprite = &gSprites[mapObject->spriteId]; + sub_8127FD4(mapObject, sprite); + sub_812800C(mapObject, sprite); + sub_81280A0(mapObject, linkedSprite, sprite); + sprite->oam.priority = linkedSprite->oam.priority; +} + +static void sub_8127FD4(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 unk_8041E54[ARRAY_COUNT(gUnknown_08401E54)]; + + memcpy(unk_8041E54, gUnknown_08401E54, sizeof gUnknown_08401E54); + if (sub_8127F64(sprite) == 0) + { + StartSpriteAnimIfDifferent(sprite, unk_8041E54[mapObject->placeholder18]); + } +} + +#ifdef NONMATCHING +static void sub_812800C(struct MapObject *mapObject, struct Sprite *sprite) +{ + s16 x; + s16 y; + u8 i; + + x = mapObject->coords2.x; + y = mapObject->coords2.y; + if (sprite->pos2.y == 0 && (x != sprite->data6 || y != sprite->data7)) + { + sprite->data5 = sprite->pos2.y; + for (sprite->data6 = x, sprite->data7 = y, i = DIR_SOUTH; i <= DIR_EAST; i ++, x = sprite->data6, y = sprite->data7) + { + MoveCoords(i, &x, &y); + if (MapGridGetZCoordAt(x, y) == 3) + { + sprite->data5 ++; + break; + } + } + } +} +#else +__attribute__((naked)) static void sub_812800C(struct MapObject *mapObject, struct Sprite *sprite) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r8\n" + "\tpush {r7}\n" + "\tsub sp, 0x4\n" + "\tadds r4, r1, 0\n" + "\tldrh r2, [r0, 0x10]\n" + "\tmov r1, sp\n" + "\tstrh r2, [r1]\n" + "\tldrh r1, [r0, 0x12]\n" + "\tmov r0, sp\n" + "\tadds r0, 0x2\n" + "\tstrh r1, [r0]\n" + "\tmovs r2, 0x26\n" + "\tldrsh r3, [r4, r2]\n" + "\tmov r8, r0\n" + "\tcmp r3, 0\n" + "\tbne _08128094\n" + "\tmov r0, sp\n" + "\tmovs r5, 0\n" + "\tldrsh r2, [r0, r5]\n" + "\tmovs r5, 0x3A\n" + "\tldrsh r0, [r4, r5]\n" + "\tcmp r2, r0\n" + "\tbne _08128048\n" + "\tlsls r0, r1, 16\n" + "\tasrs r0, 16\n" + "\tmovs r5, 0x3C\n" + "\tldrsh r1, [r4, r5]\n" + "\tcmp r0, r1\n" + "\tbeq _08128094\n" + "_08128048:\n" + "\tstrh r3, [r4, 0x38]\n" + "\tstrh r2, [r4, 0x3A]\n" + "\tmov r1, r8\n" + "\tmovs r2, 0\n" + "\tldrsh r0, [r1, r2]\n" + "\tstrh r0, [r4, 0x3C]\n" + "\tmovs r5, 0x1\n" + "\tmov r7, r8\n" + "\tmov r6, sp\n" + "_0812805A:\n" + "\tadds r0, r5, 0\n" + "\tmov r1, sp\n" + "\tadds r2, r7, 0\n" + "\tbl MoveCoords\n" + "\tmovs r1, 0\n" + "\tldrsh r0, [r6, r1]\n" + "\tmovs r2, 0\n" + "\tldrsh r1, [r7, r2]\n" + "\tbl MapGridGetZCoordAt\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r0, 0x3\n" + "\tbne _08128080\n" + "\tldrh r0, [r4, 0x38]\n" + "\tadds r0, 0x1\n" + "\tstrh r0, [r4, 0x38]\n" + "\tb _08128094\n" + "_08128080:\n" + "\tadds r0, r5, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r5, r0, 24\n" + "\tldrh r0, [r4, 0x3A]\n" + "\tstrh r0, [r6]\n" + "\tldrh r0, [r4, 0x3C]\n" + "\tmov r1, r8\n" + "\tstrh r0, [r1]\n" + "\tcmp r5, 0x4\n" + "\tbls _0812805A\n" + "_08128094:\n" + "\tadd sp, 0x4\n" + "\tpop {r3}\n" + "\tmov r8, r3\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0"); +} +#endif + +static void sub_81280A0(struct MapObject *mapObject, struct Sprite *linkedSprite, struct Sprite *sprite) +{ + u16 unk_8401E5A[ARRAY_COUNT(gUnknown_08401E5A)]; + u8 v0; + + memcpy(unk_8401E5A, gUnknown_08401E5A, sizeof gUnknown_08401E5A); + v0 = sub_8127F5C(sprite); + if (v0 != 0) + { + if (((u16)(++ sprite->data4) & unk_8401E5A[sprite->data5]) == 0) + { + sprite->pos2.y += sprite->data3; + } + if ((sprite->data4 & 0x0F) == 0) + { + sprite->data3 = -sprite->data3; + } + if (v0 != 2) + { + if (sub_8127F70(sprite) == 0) + { + linkedSprite->pos2.y = sprite->pos2.y; + } + else + { + linkedSprite->pos2.y = sprite->data1 + sprite->pos2.y; + } + sprite->pos1.x = linkedSprite->pos1.x; + sprite->pos1.y = linkedSprite->pos1.y + 8; + } + } +} + +u8 sub_8128124(u8 oldSpriteId) +{ + u8 spriteId; + struct Sprite *sprite; + + spriteId = CreateSpriteAtEnd(&gDummySpriteTemplate, 0, 0, -1); + sprite = &gSprites[spriteId]; + sprite->callback = sub_8128174; + sprite->invisible = TRUE; + sprite->data0 = oldSpriteId; + sprite->data1 = 1; + return spriteId; +} + +static void sub_8128174(struct Sprite *sprite) +{ + struct Sprite *oldSprite; + + oldSprite = &gSprites[sprite->data0]; + if (((sprite->data2++) & 0x03) == 0) + { + oldSprite->pos2.y += sprite->data1; + } + if ((sprite->data2 & 0x0F) == 0) + { + sprite->data1 = -sprite->data1; + } +} + +u32 FldEff_Dust(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[9], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data0 = gFieldEffectArguments[2]; + sprite->data1 = 10; + } + return 0; +} + +u32 FldEff_SandPile(void) +{ + u8 mapObjectId; + struct MapObject *mapObject; + u8 spriteId; + struct Sprite *sprite; + const struct MapObjectGraphicsInfo *graphicsInfo; + + mapObjectId = GetFieldObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + mapObject = &gMapObjects[mapObjectId]; + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[29], 0, 0, 0); + if (spriteId != MAX_SPRITES) + { + graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gSprites[mapObject->spriteId].oam.priority; + sprite->data0 = gFieldEffectArguments[0]; + sprite->data1 = gFieldEffectArguments[1]; + sprite->data2 = gFieldEffectArguments[2]; + sprite->data3 = gSprites[mapObject->spriteId].pos1.x; + sprite->data4 = gSprites[mapObject->spriteId].pos1.y; + sprite->pos2.y = (graphicsInfo->height >> 1) - 2; + SeekSpriteAnim(sprite, 2); + } + return 0; +} + +void sub_81282E0(struct Sprite *sprite) +{ + u8 mapObjectId; + s16 x; + s16 y; + + if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data0, sprite->data1, sprite->data2, &mapObjectId) || !gMapObjects[mapObjectId].mapobj_bit_20) + { + FieldEffectStop(sprite, FLDEFF_SAND_PILE); + } + else + { + y = gSprites[gMapObjects[mapObjectId].spriteId].pos1.y; + x = gSprites[gMapObjects[mapObjectId].spriteId].pos1.x; + if (x != sprite->data3 || y != sprite->data4) + { + sprite->data3 = x; + sprite->data4 = y; + if (sprite->animEnded) + { + StartSpriteAnim(sprite, 0); + } + } + sprite->pos1.x = x; + sprite->pos1.y = y; + sprite->subpriority = gSprites[gMapObjects[mapObjectId].spriteId].subpriority; + sub_806487C(sprite, FALSE); + } +} + +u32 FldEff_Bubbles(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 0); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[34], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x52); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = 1; + } + return 0; +} + +void sub_8128410(struct Sprite *sprite) +{ + sprite->data0 += 0x80; + sprite->data0 &= 0x100; + sprite->pos1.y -= sprite->data0 >> 8; + sub_806487C(sprite, FALSE); + if (sprite->invisible || sprite->animEnded) + { + FieldEffectStop(sprite, FLDEFF_BUBBLES); + } +} + +u32 FldEff_BerryTreeGrowthSparkle(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 4); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[22], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->oam.paletteNum = 5; + sprite->data0 = FLDEFF_BERRY_TREE_GROWTH_SPARKLE; + } + return 0; +} + +u32 FldEff_TreeDisguise(void) +{ + return ShowDisguiseFieldEffect(FLDEFF_TREE_DISGUISE, 0x18, 0x04); +} + + +u32 FldEff_MountainDisguise(void) +{ + return ShowDisguiseFieldEffect(FLDEFF_MOUNTAIN_DISGUISE, 0x19, 0x03); +} + + +u32 FldEff_SandDisguise(void) +{ + return ShowDisguiseFieldEffect(FLDEFF_SAND_DISGUISE, 0x1C, 0x02); +} + +static u32 ShowDisguiseFieldEffect(u8 fldEff, u8 templateIdx, u8 paletteNum) +{ + u8 spriteId; + struct Sprite *sprite; + + if (TryGetFieldObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2], &spriteId)) + { + FieldEffectActiveListRemove(fldEff); + return MAX_SPRITES; + } + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[templateIdx], 0, 0, 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled ++; + sprite->oam.paletteNum = paletteNum; + sprite->data1 = fldEff; + sprite->data2 = gFieldEffectArguments[0]; + sprite->data3 = gFieldEffectArguments[1]; + sprite->data4 = gFieldEffectArguments[2]; + } + return spriteId; +} + +void sub_81285AC(struct Sprite *sprite) +{ + u8 mapObjectId; + const struct MapObjectGraphicsInfo *graphicsInfo; + struct Sprite *linkedSprite; + + if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data2, sprite->data3, sprite->data4, &mapObjectId)) + { + FieldEffectStop(sprite, sprite->data1); + } + // else { + graphicsInfo = GetFieldObjectGraphicsInfo(gMapObjects[mapObjectId].graphicsId); + linkedSprite = &gSprites[gMapObjects[mapObjectId].spriteId]; + sprite->invisible = linkedSprite->invisible; + sprite->pos1.x = linkedSprite->pos1.x; + sprite->pos1.y = (graphicsInfo->height >> 1) + linkedSprite->pos1.y - 16; + sprite->subpriority = linkedSprite->subpriority - 1; + if (sprite->data0 == 1) + { + sprite->data0 ++; + StartSpriteAnim(sprite, 1); + } + if (sprite->data0 == 2 && sprite->animEnded) + { + sprite->data7 = 1; + } + if (sprite->data0 == 3) + { + FieldEffectStop(sprite, sprite->data1); + } + // } +} + +void sub_812869C(struct MapObject *mapObject) +{ + if (mapObject->mapobj_unk_21 == 1) + { + gSprites[mapObject->mapobj_unk_1A].data0 ++; + } +} + +bool8 sub_81286C4(struct MapObject *mapObject) +{ + struct Sprite *sprite; + + if (mapObject->mapobj_unk_21 == 2) + { + return TRUE; + } + if (mapObject->mapobj_unk_21 == 0) + { + return TRUE; + } + sprite = &gSprites[mapObject->mapobj_unk_1A]; + if (sprite->data7) + { + mapObject->mapobj_unk_21 = 2; + sprite->data0 ++; + return TRUE; + } + return FALSE; +} + +u32 FldEff_Sparkle(void) +{ + u8 spriteId; + + gFieldEffectArguments[0] += 7; + gFieldEffectArguments[1] += 7; + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[35], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x52); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].oam.priority = gFieldEffectArguments[2]; + gSprites[spriteId].coordOffsetEnabled = TRUE; + } + return 0; +} + +void sub_8128774(struct Sprite *sprite) +{ + if (sprite->data0 == 0) + { + if (sprite->animEnded) + { + sprite->invisible = TRUE; + sprite->data0 ++; + } + if (sprite->data0 == 0) + { + return; + } + } + if (++ sprite->data1 >= 35) + { + FieldEffectStop(sprite, FLDEFF_SPARKLE); + } +} + +void sub_81287C4(struct Sprite *sprite) +{ + if (sprite->animEnded) + { + FieldEffectStop(sprite, sprite->data1); + } + else + { + sub_806487C(sprite, FALSE); + SetObjectSubpriorityByZCoord(sprite->data0, sprite, 0); + } +} + +void sub_8128800(struct Sprite *sprite) +{ + if (sprite->animEnded) + { + FieldEffectStop(sprite, sprite->data0); + } + else + { + sub_806487C(sprite, FALSE); + } +} + +#ifdef NONMATCHING +static void sub_812882C(struct Sprite *sprite /*r6*/, u8 z, u8 offset) +{ + u8 i; + s16 xlo; + s16 xhi; + s16 lx; + s16 lyhi; + s16 ly; + s16 ylo; + s16 yhi; + struct MapObject *mapObject; // r4 + const struct MapObjectGraphicsInfo *graphicsInfo; // destroyed + struct Sprite *linkedSprite; // r5 + + SetObjectSubpriorityByZCoord(z, sprite, offset); + for (i = 0; i < 16; i ++) + { + mapObject = &gMapObjects[i]; + if (mapObject->active) + { + graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + linkedSprite = &gSprites[mapObject->spriteId]; + xhi = sprite->pos1.x + sprite->centerToCornerVecX; + xlo = sprite->pos1.x - sprite->centerToCornerVecX; + lx = linkedSprite->pos1.x; + if (xhi < lx && xlo > lx) + { + lyhi = linkedSprite->pos1.y + linkedSprite->centerToCornerVecY; + ly = linkedSprite->pos1.y; + ylo = sprite->pos1.y - sprite->centerToCornerVecY; + yhi = ylo + linkedSprite->centerToCornerVecY; + if ((lyhi < yhi || lyhi < ylo) && ly > yhi) + { + if (sprite->subpriority <= linkedSprite->subpriority) + { + sprite->subpriority = linkedSprite->subpriority + 2; + break; + } + } + } + } + } +} +#else +__attribute__((naked)) static void sub_812882C(struct Sprite *sprite /*r6*/, u8 z, u8 offset) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tadds r6, r0, 0\n" + "\tadds r0, r1, 0\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tlsls r2, 24\n" + "\tlsrs r2, 24\n" + "\tadds r1, r6, 0\n" + "\tbl SetObjectSubpriorityByZCoord\n" + "\tmovs r7, 0\n" + "_08128842:\n" + "\tlsls r0, r7, 3\n" + "\tadds r0, r7\n" + "\tlsls r0, 2\n" + "\tldr r1, _081288DC @ =gMapObjects\n" + "\tadds r4, r0, r1\n" + "\tldrb r0, [r4]\n" + "\tlsls r0, 31\n" + "\tcmp r0, 0\n" + "\tbeq _081288E4\n" + "\tldrb r0, [r4, 0x5]\n" + "\tbl GetFieldObjectGraphicsInfo\n" + "\tldrb r1, [r4, 0x4]\n" + "\tlsls r0, r1, 4\n" + "\tadds r0, r1\n" + "\tlsls r0, 2\n" + "\tldr r1, _081288E0 @ =gSprites\n" + "\tadds r5, r0, r1\n" + "\tadds r0, r6, 0\n" + "\tadds r0, 0x28\n" + "\tmovs r2, 0\n" + "\tldrsb r2, [r0, r2]\n" + "\tldrh r0, [r6, 0x20]\n" + "\tadds r1, r0, r2\n" + "\tsubs r0, r2\n" + "\tlsls r0, 16\n" + "\tlsrs r4, r0, 16\n" + "\tlsls r1, 16\n" + "\tasrs r1, 16\n" + "\tmovs r0, 0x20\n" + "\tldrsh r2, [r5, r0]\n" + "\tcmp r1, r2\n" + "\tbge _081288E4\n" + "\tlsls r0, r4, 16\n" + "\tasrs r0, 16\n" + "\tcmp r0, r2\n" + "\tble _081288E4\n" + "\tadds r0, r5, 0\n" + "\tadds r0, 0x29\n" + "\tmovs r3, 0\n" + "\tldrsb r3, [r0, r3]\n" + "\tldrh r2, [r5, 0x22]\n" + "\tadds r2, r3\n" + "\tldrh r4, [r5, 0x22]\n" + "\tadds r0, r6, 0\n" + "\tadds r0, 0x29\n" + "\tmovs r1, 0\n" + "\tldrsb r1, [r0, r1]\n" + "\tldrh r0, [r6, 0x22]\n" + "\tsubs r0, r1\n" + "\tlsls r0, 16\n" + "\tasrs r0, 16\n" + "\tadds r3, r0, r3\n" + "\tlsls r2, 16\n" + "\tasrs r2, 16\n" + "\tlsls r3, 16\n" + "\tasrs r3, 16\n" + "\tcmp r2, r3\n" + "\tblt _081288BC\n" + "\tcmp r2, r0\n" + "\tbge _081288E4\n" + "_081288BC:\n" + "\tlsls r0, r4, 16\n" + "\tasrs r0, 16\n" + "\tcmp r0, r3\n" + "\tble _081288E4\n" + "\tadds r2, r6, 0\n" + "\tadds r2, 0x43\n" + "\tadds r0, r5, 0\n" + "\tadds r0, 0x43\n" + "\tldrb r1, [r0]\n" + "\tldrb r0, [r2]\n" + "\tcmp r0, r1\n" + "\tbhi _081288E4\n" + "\tadds r0, r1, 0x2\n" + "\tstrb r0, [r2]\n" + "\tb _081288EE\n" + "\t.align 2, 0\n" + "_081288DC: .4byte gMapObjects\n" + "_081288E0: .4byte gSprites\n" + "_081288E4:\n" + "\tadds r0, r7, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r7, r0, 24\n" + "\tcmp r7, 0xF\n" + "\tbls _08128842\n" + "_081288EE:\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0"); +} +#endif diff --git a/src/field_fadetransition.c b/src/field/field_fadetransition.c index d95177821..82776d18c 100644 --- a/src/field_fadetransition.c +++ b/src/field/field_fadetransition.c @@ -89,7 +89,7 @@ void task0A_asap_script_env_2_enable_and_set_ctx_running(u8 taskID) void sub_8080990(void) { ScriptContext2_Enable(); - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); pal_fill_black(); CreateTask(task0A_asap_script_env_2_enable_and_set_ctx_running, 10); } @@ -130,7 +130,7 @@ void task_mpl_807DD60(u8 taskId) void sub_8080A3C(void) { ScriptContext2_Enable(); - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); palette_bg_fill_black(); CreateTask(task_mpl_807DD60, 10); } @@ -165,7 +165,7 @@ void sub_8080A5C(u8 taskId) void sub_8080AC4(void) { ScriptContext2_Enable(); - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); palette_bg_fill_black(); CreateTask(sub_8080A5C, 10); } @@ -188,7 +188,7 @@ void sub_8080AE4(void) void mapldr_default(void) { - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); pal_fill_for_map_transition(); sub_8080AE4(); ScriptContext2_Enable(); @@ -196,7 +196,7 @@ void mapldr_default(void) void sub_8080B60(void) { - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); pal_fill_black(); sub_8080AE4(); ScriptContext2_Enable(); @@ -204,7 +204,7 @@ void sub_8080B60(void) void sub_8080B78(void) { - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); pal_fill_for_map_transition(); PlaySE(SE_TK_WARPOUT); CreateTask(task_map_chg_seq_0807E2CC, 10); @@ -354,7 +354,7 @@ void sub_8080E28(void) void sub_8080E44(void) { ScriptContext2_Enable(); - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); pal_fill_black(); CreateTask(task_mpl_807E3C8, 10); } diff --git a/src/field_ground_effect.c b/src/field/field_ground_effect.c index 2a398ba22..25b678ff9 100644 --- a/src/field_ground_effect.c +++ b/src/field/field_ground_effect.c @@ -458,78 +458,54 @@ bool8 AreZCoordsCompatible(u8 a, u8 b) void GroundEffect_SpawnOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite) { - u8 *ptr; - gFieldEffectArguments[0] = mapObj->coords2.x; gFieldEffectArguments[1] = mapObj->coords2.y; gFieldEffectArguments[2] = mapObj->elevation; gFieldEffectArguments[3] = 2; - gFieldEffectArguments[4] = (mapObj->localId << 8) | mapObj->mapNum; + gFieldEffectArguments[4] = mapObj->localId << 8 | mapObj->mapNum; gFieldEffectArguments[5] = mapObj->mapGroup; - - ptr = (u8 *)&gSaveBlock1; - gFieldEffectArguments[6] = ((u8)gSaveBlock1.location.mapNum << 8) - | (u8)gSaveBlock1.location.mapGroup; - + gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup; gFieldEffectArguments[7] = 1; - FieldEffectStart(4); + FieldEffectStart(FLDEFF_TALL_GRASS); } void sub_8063E94(struct MapObject *mapObj, struct Sprite *sprite) { - u8 *ptr; - gFieldEffectArguments[0] = mapObj->coords2.x; gFieldEffectArguments[1] = mapObj->coords2.y; gFieldEffectArguments[2] = mapObj->elevation; gFieldEffectArguments[3] = 2; - gFieldEffectArguments[4] = (mapObj->localId << 8) | mapObj->mapNum; + gFieldEffectArguments[4] = mapObj->localId << 8 | mapObj->mapNum; gFieldEffectArguments[5] = mapObj->mapGroup; - - ptr = (u8 *)&gSaveBlock1; - gFieldEffectArguments[6] = ((u8)gSaveBlock1.location.mapNum << 8) - | (u8)gSaveBlock1.location.mapGroup; - + gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup; gFieldEffectArguments[7] = 0; - FieldEffectStart(4); + FieldEffectStart(FLDEFF_TALL_GRASS); } void sub_8063EE0(struct MapObject *mapObj, struct Sprite *sprite) { - u8 *ptr; - gFieldEffectArguments[0] = mapObj->coords2.x; gFieldEffectArguments[1] = mapObj->coords2.y; gFieldEffectArguments[2] = mapObj->elevation; gFieldEffectArguments[3] = 2; - gFieldEffectArguments[4] = (mapObj->localId << 8) | mapObj->mapNum; + gFieldEffectArguments[4] = mapObj->localId << 8 | mapObj->mapNum; gFieldEffectArguments[5] = mapObj->mapGroup; - - ptr = (u8 *)&gSaveBlock1; - gFieldEffectArguments[6] = ((u8)gSaveBlock1.location.mapNum << 8) - | (u8)gSaveBlock1.location.mapGroup; - + gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup; gFieldEffectArguments[7] = 1; - FieldEffectStart(17); + FieldEffectStart(FLDEFF_LONG_GRASS); } void sub_8063F2C(struct MapObject *mapObj, struct Sprite *sprite) { - u8 *ptr; - gFieldEffectArguments[0] = mapObj->coords2.x; gFieldEffectArguments[1] = mapObj->coords2.y; gFieldEffectArguments[2] = mapObj->elevation; gFieldEffectArguments[3] = 2; gFieldEffectArguments[4] = (mapObj->localId << 8) | mapObj->mapNum; gFieldEffectArguments[5] = mapObj->mapGroup; - - ptr = (u8 *)&gSaveBlock1; - gFieldEffectArguments[6] = ((u8)gSaveBlock1.location.mapNum << 8) - | (u8)gSaveBlock1.location.mapGroup; - + gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup; gFieldEffectArguments[7] = 0; - FieldEffectStart(17); + FieldEffectStart(FLDEFF_LONG_GRASS); } void GroundEffect_WaterReflection(struct MapObject *mapObj, struct Sprite *sprite) @@ -570,7 +546,10 @@ static void nullsub(struct MapObject *mapObj, struct Sprite *sprite, u8 a) static void DoTracksGroundEffect_Footprints(struct MapObject *mapObj, struct Sprite *sprite, u8 a) { // First half-word is a Field Effect script id. (gFieldEffectScriptPointers) - u16 sandFootprints_FieldEffectData[2] = { 0xD, 0x18 }; + u16 sandFootprints_FieldEffectData[2] = { + FLDEFF_SAND_FOOTPRINTS, + FLDEFF_DEEP_SAND_FOOTPRINTS + }; gFieldEffectArguments[0] = mapObj->coords3.x; gFieldEffectArguments[1] = mapObj->coords3.y; diff --git a/src/field_map_obj.c b/src/field/field_map_obj.c index 0e7cd7896..74ef3b7fe 100644 --- a/src/field_map_obj.c +++ b/src/field/field_map_obj.c @@ -1578,13 +1578,13 @@ void (*const gUnknown_0836DA88[])(struct Sprite *) = const u8 gUnknown_0836DBBC[] = {0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; const u8 gUnknown_0836DC09[] = {DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_WEST, DIR_NORTH, DIR_NORTH, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_WEST, DIR_NORTH, DIR_WEST, DIR_SOUTH, DIR_EAST, DIR_WEST, DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_EAST, DIR_NORTH, DIR_WEST, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH}; -#include "data/field_map_obj/map_object_graphics_info_pointers.h" -#include "data/field_map_obj/field_effect_object_template_pointers.h" -#include "data/field_map_obj/map_object_pic_tables.h" -#include "data/field_map_obj/map_object_anims.h" -#include "data/field_map_obj/base_oam.h" -#include "data/field_map_obj/map_object_subsprites.h" -#include "data/field_map_obj/map_object_graphics_info.h" +#include "../data/field_map_obj/map_object_graphics_info_pointers.h" +#include "../data/field_map_obj/field_effect_object_template_pointers.h" +#include "../data/field_map_obj/map_object_pic_tables.h" +#include "../data/field_map_obj/map_object_anims.h" +#include "../data/field_map_obj/base_oam.h" +#include "../data/field_map_obj/map_object_subsprites.h" +#include "../data/field_map_obj/map_object_graphics_info.h" const struct SpritePalette gUnknown_0837377C[] = { {gMapObjectPalette0, 0x1103}, @@ -1790,14 +1790,14 @@ const u16 *const gUnknown_0837399C[] = { Unknown_8373988 }; -#include "data/field_map_obj/berry_tree_graphics_tables.h" -#include "data/field_map_obj/field_effect_objects.h" +#include "../data/field_map_obj/berry_tree_graphics_tables.h" +#include "../data/field_map_obj/field_effect_objects.h" const s16 gUnknown_0837520C[] = {0x20, 0x40, 0x60, 0x80}; const s16 gUnknown_08375204[] = {0x20, 0x40, 0x80, 0xc0}; const s16 gUnknown_0837521C[] = {0x20, 0x30, 0x40, 0x50}; -#include "data/field_map_obj/callback_subroutine_pointers.h" +#include "../data/field_map_obj/callback_subroutine_pointers.h" const u8 gUnknown_083755F4[] = {0x00, 0x00, 0x01, 0x02, 0x03, 0x00, 0x00, 0x01, 0x01}; const u8 gUnknown_083755FD[] = {0x04, 0x04, 0x05, 0x06, 0x07, 0x04, 0x04, 0x05, 0x05}; @@ -1886,7 +1886,7 @@ const u8 gUnknown_08375767[][4] = { {3, 4, 2, 1} }; -#include "data/field_map_obj/anim_func_ptrs.h" +#include "../data/field_map_obj/anim_func_ptrs.h" // text @@ -1901,7 +1901,7 @@ extern void CameraObjectReset1(void); extern struct LinkPlayerMapObject gLinkPlayerMapObjects[]; extern u8 gReservedSpritePaletteCount; -extern struct Camera gUnknown_0202E844; +extern struct Camera gCamera; static u8 gUnknown_030005A4; static u16 gUnknown_030005A6; @@ -2462,24 +2462,24 @@ extern void sub_8064970(struct Sprite *); extern void sub_8060470(s16 *, s16 *, s16, s16); extern void InitObjectPriorityByZCoord(); -u8 sub_805B410(u8 a, u8 b, s16 c, s16 d, u8 e, u8 f) +u8 sub_805B410(u8 graphicsId, u8 b, s16 x, s16 y, u8 elevation, u8 direction) { const struct MapObjectGraphicsInfo *gfxInfo; struct SpriteTemplate spriteTemplate; const struct SubspriteTable *subspriteTables; u8 spriteId; - gfxInfo = GetFieldObjectGraphicsInfo(a); - MakeObjectTemplateFromFieldObjectGraphicsInfo(a, sub_8064970, &spriteTemplate, &subspriteTables); + gfxInfo = GetFieldObjectGraphicsInfo(graphicsId); + MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, sub_8064970, &spriteTemplate, &subspriteTables); #ifdef NONMATCHING spriteTemplate.paletteTag = 0xFFFF; #else *(u16 *)&spriteTemplate.paletteTag = 0xFFFF; #endif - c += 7; - d += 7; - sub_8060470(&c, &d, 8, 16); - spriteId = CreateSpriteAtEnd(&spriteTemplate, c, d, 0); + x += 7; + y += 7; + sub_8060470(&x, &y, 8, 16); + spriteId = CreateSpriteAtEnd(&spriteTemplate, x, y, 0); if (spriteId != 64) { struct Sprite *sprite = &gSprites[spriteId]; @@ -2490,7 +2490,7 @@ u8 sub_805B410(u8 a, u8 b, s16 c, s16 d, u8 e, u8 f) sprite->oam.paletteNum = gfxInfo->paletteSlot; sprite->coordOffsetEnabled = TRUE; sprite->data0 = b; - sprite->data1 = e; + sprite->data1 = elevation; if (gfxInfo->paletteSlot == 10) npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot); if (subspriteTables != NULL) @@ -2498,9 +2498,9 @@ u8 sub_805B410(u8 a, u8 b, s16 c, s16 d, u8 e, u8 f) SetSubspriteTables(sprite, subspriteTables); sprite->subspriteMode = 2; } - InitObjectPriorityByZCoord(sprite, e); - SetObjectSubpriorityByZCoord(e, sprite, 1); - StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(f)); + InitObjectPriorityByZCoord(sprite, elevation); + SetObjectSubpriorityByZCoord(elevation, sprite, 1); + StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(direction)); } return spriteId; } @@ -2775,11 +2775,11 @@ void npc_by_local_id_and_map_set_field_1_bit_x20(u8 localId, u8 mapNum, u8 mapGr gMapObjects[mapObjectId].mapobj_bit_13 = d; } -void FieldObjectGetLocalIdAndMap(struct MapObject *mapObject, u8 *localId, u8 *mapNum, u8 *mapGroup) +void FieldObjectGetLocalIdAndMap(struct MapObject *mapObject, void *localId, void *mapNum, void *mapGroup) { - *localId = mapObject->localId; - *mapNum = mapObject->mapNum; - *mapGroup = mapObject->mapGroup; + *(u8 *)localId = mapObject->localId; + *(u8 *)mapNum = mapObject->mapNum; + *(u8 *)mapGroup = mapObject->mapGroup; } void sub_805BCC0(s16 x, s16 y) @@ -2986,24 +2986,21 @@ void UpdateFieldObjectCoordsForCameraUpdate(void) s16 deltaX; s16 deltaY; -#ifndef NONMATCHING - asm(""::"r"(i)); //makes the compiler store i in r3 -#endif - - if (gUnknown_0202E844.field_0) + if (gCamera.field_0) { - for (i = 0, deltaX = gUnknown_0202E844.x, deltaY = gUnknown_0202E844.y; i < 16; i++) + deltaX = gCamera.x; + deltaY = gCamera.y; + for (i = 0; i < 16; i++) { - struct MapObject *mapObject = &gMapObjects[i]; - if (mapObject->active) + if (gMapObjects[i].active) { - mapObject->coords1.x -= deltaX; - mapObject->coords1.y -= deltaY; - mapObject->coords2.x -= deltaX; - mapObject->coords2.y -= deltaY; - mapObject->coords3.x -= deltaX; - mapObject->coords3.y -= deltaY; + gMapObjects[i].coords1.x -= deltaX; + gMapObjects[i].coords1.y -= deltaY; + gMapObjects[i].coords2.x -= deltaX; + gMapObjects[i].coords2.y -= deltaY; + gMapObjects[i].coords3.x -= deltaX; + gMapObjects[i].coords3.y -= deltaY; } } } @@ -5013,7 +5010,7 @@ u8 mss_npc_reset_oampriv3_1_unk2_unk3(struct MapObject *mapObject, struct Sprite u8 sub_805F364(struct MapObject *mapObject, struct Sprite *sprite) { - if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.running1 == 2) + if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.tileTransitionState == T_TILE_CENTER) { return 0; } @@ -5030,32 +5027,30 @@ u8 sub_805F3C4(struct MapObject *mapObject, struct Sprite *sprite) return 0; } -#ifdef NONMATCHING - -u8 sub_805F3EC(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, u8 *a3(u8)) +bool8 sub_805F3EC(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, bool8 a3(u8)) { return 0; } -u8 sub_805F3F0(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, u8 *a3(u8)) +bool8 sub_805F3F0(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, bool8 a3(u8)) { - int direction; - direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, a2); - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, a2))); mapObject->mapobj_bit_1 = 1; sprite->data1 = 2; return 1; } -u8 sub_805F438(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, u8 *a3(u8)) +bool8 sub_805F438(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, bool8 a3(u8)) { + u32 direction; s16 x; s16 y; - int direction; - direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, a2); + + direction = a2; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); FieldObjectMoveDestCoords(mapObject, direction, &x, &y); FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(direction)); - if (!npc_block_way(mapObject, x, y, direction) || (a3 != NULL && !a3(MapGridGetMetatileBehaviorAt(x, y)))) + if (npc_block_way(mapObject, x, y, direction) || (a3 != NULL && !a3(MapGridGetMetatileBehaviorAt(x, y)))) { FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); } @@ -5063,15 +5058,121 @@ u8 sub_805F438(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, u8 *a3 sprite->data1 = 2; return 1; } -#endif -asm(".section .text_fmocb2_c\n"); +bool8 sub_805F4F0(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + FieldObjectMoveDestCoords(mapObject, direction, &x, &y); + FieldObjectSetRegularAnim(mapObject, sprite, sub_8060744(direction)); + if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) + { + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + } + mapObject->mapobj_bit_1 = TRUE; + sprite->data1 = 2; + return TRUE; +} + +bool8 sub_805F5A8(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + FieldObjectMoveDestCoords(mapObject, direction, &x, &y); + FieldObjectSetRegularAnim(mapObject, sprite, sub_806079C(direction)); + if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) + { + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + } + mapObject->mapobj_bit_1 = TRUE; + sprite->data1 = 2; + return TRUE; +} + +bool8 sub_805F660(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + FieldObjectMoveDestCoords(mapObject, direction, &x, &y); + FieldObjectSetRegularAnim(mapObject, sprite, sub_80607C8(direction)); + if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) + { + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + } + mapObject->mapobj_bit_1 = TRUE; + sprite->data1 = 2; + return TRUE; +} + +bool8 cph_IM_DIFFERENT(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + FieldObjectSetRegularAnim(mapObject, sprite, sub_806084C(direction)); + mapObject->mapobj_bit_1 = TRUE; + sprite->data1 = 2; + return TRUE; +} + +bool8 sub_805F760(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + FieldObjectMoveDestCoords(mapObject, direction, &x, &y); + FieldObjectSetRegularAnim(mapObject, sprite, sub_80608A4(direction)); + if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) + { + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + } + mapObject->mapobj_bit_1 = TRUE; + sprite->data1 = 2; + return TRUE; +} + +bool8 oac_hopping(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + x = mapObject->coords2.x; + y = mapObject->coords2.y; + sub_8060320(direction, &x, &y, 2, 2); + FieldObjectSetRegularAnim(mapObject, sprite, GetJumpLedgeAnimId(direction)); + if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) + { + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + } + mapObject->mapobj_bit_1 = TRUE; + sprite->data1 = 2; + return TRUE; +} fieldmap_object_cb(sub_805F8E0, sub_805F904, gUnknown_083755C0); u8 mss_08062EA4(struct MapObject *mapObject, struct Sprite *sprite) { - if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.running1 == 2) + if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.tileTransitionState == T_TILE_CENTER) { return 0; } @@ -5086,7 +5187,7 @@ void FieldObjectCB_TreeDisguise(struct Sprite *sprite) mapObject = &gMapObjects[sprite->data0]; if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && sprite->data7 == 0)) { - FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]); + FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_TREE_DISGUISE); mapObject->mapobj_unk_21 = 1; sprite->data7 ++; @@ -5106,7 +5207,7 @@ void FieldObjectCB_MountainDisguise(struct Sprite *sprite) mapObject = &gMapObjects[sprite->data0]; if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && sprite->data7 == 0)) { - FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]); + FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_MOUNTAIN_DISGUISE); mapObject->mapobj_unk_21 = 1; sprite->data7 ++; @@ -5367,8 +5468,10 @@ bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject2 *mapObject, s16 x, static bool8 DoesObjectCollideWithObjectAt(struct MapObject *mapObject, s16 x, s16 y); bool8 IsMetatileDirectionallyImpassable(struct MapObject *mapObject, s16 x, s16 y, u8 direction); -u8 npc_block_way(struct MapObject *mapObject, s16 x, s16 y, u8 direction) +u8 npc_block_way(struct MapObject *mapObject, s16 x, s16 y, u32 dirn) { + u8 direction; + direction = dirn; if (IsCoordOutsideFieldObjectMovementRect((struct MapObject2 *)mapObject, x, y)) return 1; else if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction)) @@ -5446,17 +5549,16 @@ static bool8 DoesObjectCollideWithObjectAt(struct MapObject *mapObject, s16 x, s return 0; } -bool8 sub_8060234(u8 localId, u8 mapNum, u8 mapGroup) +// this function is only used in berry.c, but its unknown whether its intended context is the berry tree check or if its checking for the flickering. +bool8 IsBerryTreeSparkling(u8 localId, u8 mapNum, u8 mapGroup) { u8 mapObjectId; + if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { if (gSprites[gMapObjects[mapObjectId].spriteId].data7 & 2) - { - return 1; - } - } - return 0; + return TRUE; + + return FALSE; } void sub_8060288(u8 localId, u8 mapNum, u8 mapGroup) @@ -5480,23 +5582,26 @@ void unref_sub_80602F8(u8 direction, s16 *x, s16 *y) *y += gDirectionToVector[direction].y << 4; } -void sub_8060320(u8 direction, s16 *x, s16 *y, s16 deltaX, s16 deltaY) +void sub_8060320(u32 dirn, s16 *x, s16 *y, s16 deltaX, s16 deltaY) { + u8 direction = dirn; + s16 dx2 = deltaX; + s16 dy2 = deltaY; if (gDirectionToVector[direction].x > 0) { - *x += deltaX; + *x += dx2; } if (gDirectionToVector[direction].x < 0) { - *x -= deltaX; + *x -= dx2; } if (gDirectionToVector[direction].y > 0) { - *y += deltaY; + *y += dy2; } if (gDirectionToVector[direction].y < 0) { - *y -= deltaY; + *y -= dy2; } } @@ -5563,11 +5668,12 @@ void GetFieldObjectMovingCameraOffset(s16 *x, s16 *y) } } -void FieldObjectMoveDestCoords(struct MapObject *mapObject, u8 direction, s16 *x, s16 *y) +void FieldObjectMoveDestCoords(struct MapObject *mapObject, u32 direction, s16 *x, s16 *y) { + u8 newDirn = direction; *x = mapObject->coords2.x; *y = mapObject->coords2.y; - MoveCoords(direction, x, y); + MoveCoords(newDirn, x, y); } bool8 FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(struct MapObject *mapObject) @@ -5681,193 +5787,34 @@ void meta_step(struct MapObject *mapObject, struct Sprite *sprite, u8 (*callback FieldObjectUpdateSubpriority(mapObject, sprite); } - -u8 GetFaceDirectionAnimId(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756C8, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 GetSimpleGoAnimId(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756CD, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 GetGoSpeed0AnimId(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756D2, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060744(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756D7, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 d2s_08064034(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756DC, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_806079C(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756E1, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_80607C8(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756E6, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_80607F4(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756EB, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 GetJumpLedgeAnimId(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756F0, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_806084C(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756F5, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060878(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756FA, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_80608A4(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756FF, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_80608D0(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375704, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 GetStepInPlaceDelay32AnimId(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375709, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 GetStepInPlaceDelay16AnimId(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_0837570E, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 GetStepInPlaceDelay8AnimId(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375713, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 GetStepInPlaceDelay4AnimId(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375718, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} +#define dirn_to_anim(name, table)\ +u8 name(u32 idx)\ +{\ + u8 direction;\ + u8 animIds[sizeof(table)];\ + direction = idx;\ + memcpy(animIds, (table), sizeof(table));\ + if (direction > DIR_EAST) direction = 0;\ + return animIds[direction];\ +} + +dirn_to_anim(GetFaceDirectionAnimId, gUnknown_083756C8) +dirn_to_anim(GetSimpleGoAnimId, gUnknown_083756CD) +dirn_to_anim(GetGoSpeed0AnimId, gUnknown_083756D2) +dirn_to_anim(sub_8060744, gUnknown_083756D7) +dirn_to_anim(d2s_08064034, gUnknown_083756DC) +dirn_to_anim(sub_806079C, gUnknown_083756E1) +dirn_to_anim(sub_80607C8, gUnknown_083756E6) +dirn_to_anim(sub_80607F4, gUnknown_083756EB) +dirn_to_anim(GetJumpLedgeAnimId, gUnknown_083756F0) +dirn_to_anim(sub_806084C, gUnknown_083756F5) +dirn_to_anim(sub_8060878, gUnknown_083756FA) +dirn_to_anim(sub_80608A4, gUnknown_083756FF) +dirn_to_anim(sub_80608D0, gUnknown_08375704) +dirn_to_anim(GetStepInPlaceDelay32AnimId, gUnknown_08375709) +dirn_to_anim(GetStepInPlaceDelay16AnimId, gUnknown_0837570E) +dirn_to_anim(GetStepInPlaceDelay8AnimId, gUnknown_08375713) +dirn_to_anim(GetStepInPlaceDelay4AnimId, gUnknown_08375718) u8 FieldObjectFaceOppositeDirection(struct MapObject *mapObject, u8 direction) { @@ -5995,65 +5942,23 @@ u8 GetOppositeDirection(u8 direction) return directions[direction - 1]; } -int zffu_offset_calc(u8 a0, u8 a1) +u32 zffu_offset_calc(u8 a0, u8 a1) { return gUnknown_08375757[a0 - 1][a1 - 1]; } -#ifdef NONMATCHING -int state_to_direction(u8 a0, u8 a1, u8 a2) +u32 state_to_direction(u8 a0, u32 a1, u32 a2) { - int zffuOffset; - asm_comment("For some reason, r2 is being backed up to r3 and restored ahead of the zffu call."); - if (a1 == 0 || a2 == 0 || a1 > 4 || a2 > 4) + u32 zffuOffset; + u8 a1_2 = a1; + u8 a2_2 = a2; + if (a1_2 == 0 || a2_2 == 0 || a1_2 > DIR_EAST || a2_2 > DIR_EAST) { return 0; } - zffuOffset = zffu_offset_calc(a1, a2); + zffuOffset = zffu_offset_calc(a1_2, a2); return gUnknown_08375767[a0 - 1][zffuOffset - 1]; } -#else -__attribute__((naked)) -int state_to_direction(u8 a0, u8 a1, u8 a2) -{ - asm(".syntax unified\n\ - push {r4,lr}\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - adds r0, r1, 0\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - cmp r1, 0\n\ - beq _08060BFC\n\ - cmp r2, 0\n\ - beq _08060BFC\n\ - cmp r1, 0x4\n\ - bhi _08060BFC\n\ - cmp r2, 0x4\n\ - bls _08060C00\n\ -_08060BFC:\n\ - movs r0, 0\n\ - b _08060C12\n\ -_08060C00:\n\ - adds r1, r2, 0\n\ - bl zffu_offset_calc\n\ - ldr r2, _08060C18 @ =gUnknown_08375767\n\ - lsls r1, r4, 2\n\ - subs r1, 0x5\n\ - adds r0, r1\n\ - adds r0, r2\n\ - ldrb r0, [r0]\n\ -_08060C12:\n\ - pop {r4}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_08060C18: .4byte gUnknown_08375767\n\ -.syntax divided\n"); -} -#endif void FieldObjectExecSpecialAnim(struct MapObject *mapObject, struct Sprite *sprite) { @@ -7466,7 +7371,7 @@ bool8 sub_8062644(struct MapObject *mapObject, struct Sprite *sprite) bool8 do_exclamation_mark_bubble_1(struct MapObject *mapObject, struct Sprite *sprite) { - FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]); + FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_1); sprite->data2 = 1; return TRUE; @@ -7474,7 +7379,7 @@ bool8 do_exclamation_mark_bubble_1(struct MapObject *mapObject, struct Sprite *s bool8 do_exclamation_mark_bubble_2(struct MapObject *mapObject, struct Sprite *sprite) { - FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]); + FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_2); sprite->data2 = 1; return TRUE; @@ -7482,7 +7387,7 @@ bool8 do_exclamation_mark_bubble_2(struct MapObject *mapObject, struct Sprite *s bool8 do_heart_bubble(struct MapObject *mapObject, struct Sprite *sprite) { - FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]); + FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); FieldEffectStart(FLDEFF_HEART_ICON); sprite->data2 = 1; return TRUE; diff --git a/src/field_map_obj_helpers.c b/src/field/field_map_obj_helpers.c index 93cd57557..59e857aae 100644 --- a/src/field_map_obj_helpers.c +++ b/src/field/field_map_obj_helpers.c @@ -294,7 +294,7 @@ void sub_8064990(u8 a1, u8 dir) u32 oe_exec_and_other_stuff(u8 fieldEffectId, struct MapObject *mapObject) { - FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]); + FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); return FieldEffectStart(fieldEffectId); } @@ -303,7 +303,7 @@ void DoShadowFieldEffect(struct MapObject *mapObject) if (!mapObject->mapobj_bit_22) { mapObject->mapobj_bit_22 = 1; - oe_exec_and_other_stuff(3, mapObject); + oe_exec_and_other_stuff(FLDEFF_SHADOW, mapObject); } } diff --git a/src/field_message_box.c b/src/field/field_message_box.c index 35aac7ac9..35aac7ac9 100644 --- a/src/field_message_box.c +++ b/src/field/field_message_box.c diff --git a/src/field_player_avatar.c b/src/field/field_player_avatar.c index c8099a73d..e7da9b1b7 100644 --- a/src/field_player_avatar.c +++ b/src/field/field_player_avatar.c @@ -31,7 +31,7 @@ static bool8 sub_8058854(struct MapObject *, u8); static void npc_clear_strange_bits(struct MapObject *a); static void MovePlayerAvatarUsingKeypadInput(u8 a, u16 b, u16 c); static void PlayerAllowForcedMovementIfMovingSameDirection(void); -static u8 TryDoMetatileBehaviorForcedMovement(void); +static bool8 TryDoMetatileBehaviorForcedMovement(void); static u8 GetForcedMovementByMetatileBehavior(void); static void MovePlayerNotOnBike(u8 a, u16 b); static u8 CheckMovementInputNotOnBike(u8 a); @@ -49,7 +49,7 @@ static void PlayerNotOnBikeCollide(u8 a); static void PlayCollisionSoundIfNotFacingWarp(u8 a); static void sub_8059D60(struct MapObject *a); static void StartStrengthAnim(u8 a, u8 b); -static void sub_8059F94(void); +static void DoPlayerMatJump(void); static void sub_805A06C(void); static bool8 (*const gUnknown_0830FB58[])(u8) = @@ -73,7 +73,7 @@ static bool8 (*const gUnknown_0830FB58[])(u8) = MetatileBehavior_0xBC, MetatileBehavior_IsMuddySlope, }; -static u8 (*const gUnknown_0830FBA0[])(void) = +static bool8 (*const gUnknown_0830FBA0[])(void) = { ForcedMovement_None, ForcedMovement_Slip, @@ -91,7 +91,7 @@ static u8 (*const gUnknown_0830FBA0[])(void) = ForcedMovement_SlideWest, ForcedMovement_SlideEast, sub_8058B0C, - sub_8058C04, + ForcedMovement_MatJump, sub_8058C10, ForcedMovement_MuddySlope, }; @@ -182,9 +182,9 @@ static u8 (*const gUnknown_0830FC88[])(struct Task *, struct MapObject *, struct sub_8059EA4, sub_8059F40, }; -static u8 (*const gUnknown_0830FC94[])(struct Task *, struct MapObject *) = +static u8 (*const sPlayerAvatarSecretBaseMatJump[])(struct Task *, struct MapObject *) = { - sub_805A000, + PlayerAvatar_DoSecretBaseMatJump, }; static u8 (*const gUnknown_0830FC98[])(struct Task *, struct MapObject *) = { @@ -201,9 +201,9 @@ void player_step(u8 direction, u16 newKeys, u16 heldKeys) struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; sub_8059D60(playerMapObj); - if (gPlayerAvatar.unk6 == 0) + if (gPlayerAvatar.preventStep == FALSE) { - sub_80E5B38(newKeys, heldKeys); + Bike_TryAcroBikeHistoryUpdate(newKeys, heldKeys); if (!sub_8058854(playerMapObj, direction)) { npc_clear_strange_bits(playerMapObj); @@ -256,11 +256,11 @@ static void MovePlayerAvatarUsingKeypadInput(u8 direction, u16 newKeys, u16 held static void PlayerAllowForcedMovementIfMovingSameDirection(void) { - if (gPlayerAvatar.running2 == 2) + if (gPlayerAvatar.runningState == MOVING) gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_5; } -static u8 TryDoMetatileBehaviorForcedMovement(void) +static bool8 TryDoMetatileBehaviorForcedMovement(void) { return gUnknown_0830FBA0[GetForcedMovementByMetatileBehavior()](); } @@ -282,7 +282,7 @@ static u8 GetForcedMovementByMetatileBehavior(void) return 0; } -u8 ForcedMovement_None(void) +bool8 ForcedMovement_None(void) { if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_6) { @@ -293,7 +293,7 @@ u8 ForcedMovement_None(void) FieldObjectSetDirection(playerMapObj, playerMapObj->mapobj_unk_18); gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_6; } - return 0; + return FALSE; } static u8 DoForcedMovement(u8 direction, void (*b)(u8)) @@ -314,13 +314,13 @@ static u8 DoForcedMovement(u8 direction, void (*b)(u8)) if (collisionType == COLLISION_LEDGE_JUMP) PlayerJumpLedge(direction); playerAvatar->flags |= PLAYER_AVATAR_FLAG_6; - playerAvatar->running2 = 2; + playerAvatar->runningState = MOVING; return 1; } } else { - playerAvatar->running2 = 2; + playerAvatar->runningState = MOVING; b(direction); return 1; } @@ -334,47 +334,47 @@ static u8 DoForcedMovementInCurrentDirection(void (*a)(u8)) return DoForcedMovement(playerMapObj->placeholder18, a); } -u8 ForcedMovement_Slip(void) +bool8 ForcedMovement_Slip(void) { - return DoForcedMovementInCurrentDirection(sub_80593C4); + return DoForcedMovementInCurrentDirection(PlayerGoSpeed2); } -u8 sub_8058AAC(void) +bool8 sub_8058AAC(void) { - return DoForcedMovement(1, PlayerGoSpeed0); + return DoForcedMovement(1, PlayerGoSpeed1); } -u8 sub_8058AC4(void) +bool8 sub_8058AC4(void) { - return DoForcedMovement(2, PlayerGoSpeed0); + return DoForcedMovement(2, PlayerGoSpeed1); } -u8 sub_8058ADC(void) +bool8 sub_8058ADC(void) { - return DoForcedMovement(3, PlayerGoSpeed0); + return DoForcedMovement(3, PlayerGoSpeed1); } -u8 sub_8058AF4(void) +bool8 sub_8058AF4(void) { - return DoForcedMovement(4, PlayerGoSpeed0); + return DoForcedMovement(4, PlayerGoSpeed1); } -u8 sub_8058B0C(void) +bool8 sub_8058B0C(void) { return DoForcedMovement(1, npc_use_some_d2s); } -u8 sub_8058B24(void) +bool8 sub_8058B24(void) { return DoForcedMovement(2, npc_use_some_d2s); } -u8 sub_8058B3C(void) +bool8 sub_8058B3C(void) { return DoForcedMovement(3, npc_use_some_d2s); } -u8 sub_8058B54(void) +bool8 sub_8058B54(void) { return DoForcedMovement(4, npc_use_some_d2s); } @@ -388,51 +388,51 @@ static u8 ForcedMovement_Slide(u8 direction, void (*b)(u8)) return DoForcedMovement(direction, b); } -u8 ForcedMovement_SlideSouth(void) +bool8 ForcedMovement_SlideSouth(void) { - return ForcedMovement_Slide(1, sub_80593C4); + return ForcedMovement_Slide(1, PlayerGoSpeed2); } -u8 ForcedMovement_SlideNorth(void) +bool8 ForcedMovement_SlideNorth(void) { - return ForcedMovement_Slide(2, sub_80593C4); + return ForcedMovement_Slide(2, PlayerGoSpeed2); } -u8 ForcedMovement_SlideWest(void) +bool8 ForcedMovement_SlideWest(void) { - return ForcedMovement_Slide(3, sub_80593C4); + return ForcedMovement_Slide(3, PlayerGoSpeed2); } -u8 ForcedMovement_SlideEast(void) +bool8 ForcedMovement_SlideEast(void) { - return ForcedMovement_Slide(4, sub_80593C4); + return ForcedMovement_Slide(4, PlayerGoSpeed2); } -u8 sub_8058C04(void) +bool8 ForcedMovement_MatJump(void) { - sub_8059F94(); - return 1; + DoPlayerMatJump(); + return TRUE; } -u8 sub_8058C10(void) +bool8 sub_8058C10(void) { sub_805A06C(); - return 1; + return TRUE; } -u8 ForcedMovement_MuddySlope(void) +bool8 ForcedMovement_MuddySlope(void) { struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; if (playerMapObj->placeholder18 != 2 || GetPlayerSpeed() <= 3) { - sub_80E6010(0); + Bike_UpdateBikeCounterSpeed(0); playerMapObj->mapobj_bit_9 = 1; - return DoForcedMovement(1, sub_80593C4); + return DoForcedMovement(1, PlayerGoSpeed2); } else { - return 0; + return FALSE; } } @@ -445,17 +445,17 @@ static u8 CheckMovementInputNotOnBike(u8 direction) { if (direction == DIR_NONE) { - gPlayerAvatar.running2 = 0; + gPlayerAvatar.runningState = NOT_MOVING; return 0; } - else if (direction != player_get_direction_upper_nybble() && gPlayerAvatar.running2 != 2) + else if (direction != player_get_direction_upper_nybble() && gPlayerAvatar.runningState != MOVING) { - gPlayerAvatar.running2 = 1; + gPlayerAvatar.runningState = TURN_DIRECTION; return 1; } else { - gPlayerAvatar.running2 = 2; + gPlayerAvatar.runningState = MOVING; return 2; } } @@ -486,7 +486,8 @@ void sub_8058D0C(u8 direction, u16 heldKeys) case 0: if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) { - sub_80593C4(direction); + // speed 2 is fast, same speed as running + PlayerGoSpeed2(direction); return; } if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_4) && (heldKeys & B_BUTTON) && FlagGet(SYS_B_DASH) @@ -497,7 +498,7 @@ void sub_8058D0C(u8 direction, u16 heldKeys) } else { - PlayerGoSpeed0(direction); + PlayerGoSpeed1(direction); } } } @@ -601,14 +602,14 @@ static void check_acro_bike_metatile(int unused1, int unused2, u8 c, u8 *d) void SetPlayerAvatarTransitionFlags(u16 a) { - gPlayerAvatar.bike |= a; + gPlayerAvatar.unk1 |= a; DoPlayerAvatarTransition(); } static void DoPlayerAvatarTransition(void) { u8 i; - u32 flags = gPlayerAvatar.bike; + u32 flags = gPlayerAvatar.unk1; if (flags != 0) { @@ -627,7 +628,7 @@ static void DoPlayerAvatarTransition(void) } #endif } - gPlayerAvatar.bike = 0; + gPlayerAvatar.unk1 = 0; } } @@ -656,7 +657,7 @@ void PlayerAvatarTransition_AcroBike(struct MapObject *a) FieldObjectTurn(a, a->placeholder18); SetPlayerAvatarStateMask(4); BikeClearState(0, 0); - sub_80E6084(); + Bike_HandleBumpySlopeJump(); } void PlayerAvatarTransition_Surfing(struct MapObject *a) @@ -689,18 +690,18 @@ void sub_80591F4(struct MapObject *a) void sub_8059204(void) { - gPlayerAvatar.running1 = 0; + gPlayerAvatar.tileTransitionState = T_NOT_MOVING; if (PlayerIsAnimActive()) { if (!PlayerCheckIfAnimFinishedOrInactive()) { if (!player_is_anim_in_certain_ranges()) - gPlayerAvatar.running1 = 1; + gPlayerAvatar.tileTransitionState = T_TILE_TRANSITION; } else { if (!sub_80592A4()) - gPlayerAvatar.running1 = 2; + gPlayerAvatar.tileTransitionState = T_TILE_CENTER; } } } @@ -721,7 +722,7 @@ static bool8 player_is_anim_in_certain_ranges(void) static bool8 sub_80592A4(void) { - if (player_is_anim_in_certain_ranges() && gPlayerAvatar.running2 != 1) + if (player_is_anim_in_certain_ranges() && gPlayerAvatar.runningState != TURN_DIRECTION) return TRUE; else return FALSE; @@ -761,12 +762,14 @@ void PlayerSetAnimId(u8 animId, u8 b) } } -void PlayerGoSpeed0(u8 a) +// normal speed (1 speed) +void PlayerGoSpeed1(u8 a) { PlayerSetAnimId(GetGoSpeed0AnimId(a), 2); } -void sub_80593C4(u8 a) +// fast speed (2 speed) +void PlayerGoSpeed2(u8 a) { PlayerSetAnimId(sub_8060744(a), 2); } @@ -776,7 +779,8 @@ void npc_use_some_d2s(u8 a) PlayerSetAnimId(d2s_08064034(a), 2); } -void sub_80593F4(u8 a) +// fastest speed (4 speed) +void PlayerGoSpeed4(u8 a) { PlayerSetAnimId(sub_806079C(a), 2); } @@ -816,48 +820,54 @@ void PlayerJumpLedge(u8 direction) void sub_80594C0(void) { - if (gPlayerAvatar.running1 == 2 || gPlayerAvatar.running1 == 0) + if (gPlayerAvatar.tileTransitionState == T_TILE_CENTER || gPlayerAvatar.tileTransitionState == T_NOT_MOVING) { if (player_should_look_direction_be_enforced_upon_movement()) sub_8059348(GetFaceDirectionAnimId(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_18)); } } -void sub_8059504(u8 a) +// wheelie idle +void PlayerIdleWheelie(u8 a) { PlayerSetAnimId(sub_80609D8(a), 1); } -//normal to wheelie +// normal to wheelie void PlayerStartWheelie(u8 a) { PlayerSetAnimId(sub_8060A04(a), 1); } -void sub_8059534(u8 a) +// wheelie to normal +void PlayerEndWheelie(u8 a) { PlayerSetAnimId(sub_8060A30(a), 1); } -void sub_805954C(u8 a) +// wheelie hopping standing +void PlayerStandingHoppingWheelie(u8 a) { PlaySE(SE_JITE_PYOKO); PlayerSetAnimId(sub_8060A5C(a), 1); } -void sub_8059570(u8 a) +// wheelie hopping moving +void PlayerMovingHoppingWheelie(u8 a) { PlaySE(SE_JITE_PYOKO); PlayerSetAnimId(sub_8060A88(a), 2); } -void sub_8059594(u8 a) +// wheelie hopping ledge +void PlayerLedgeHoppingWheelie(u8 a) { PlaySE(SE_JITE_PYOKO); PlayerSetAnimId(sub_8060AB4(a), 8); } -void sub_80595B8(u8 direction) +// acro turn jump +void PlayerAcroTurnJump(u8 direction) { PlaySE(SE_JITE_PYOKO); PlayerSetAnimId(sub_8060878(direction), 1); @@ -963,8 +973,8 @@ void sub_80597F4(void) FieldObjectSetDirection(playerMapObj, playerMapObj->mapobj_unk_18); if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) { - sub_80E6084(); - sub_80E6010(0); + Bike_HandleBumpySlopeJump(); + Bike_UpdateBikeCounterSpeed(0); } } @@ -1060,7 +1070,6 @@ bool8 IsPlayerFacingSurfableFishableWater(void) void ClearPlayerAvatarInfo(void) { - //TODO: 0x24 should be the size of gPlayerAvatar memset(&gPlayerAvatar, 0, sizeof(struct PlayerAvatar)); } @@ -1099,7 +1108,7 @@ void SetPlayerAvatarExtraStateTransition(u8 a, u8 b) { u8 unk = GetPlayerAvatarStateTransitionByGraphicsId(a, gPlayerAvatar.gender); - gPlayerAvatar.bike |= unk | b; + gPlayerAvatar.unk1 |= unk | b; DoPlayerAvatarTransition(); } @@ -1127,8 +1136,8 @@ void InitPlayerAvatar(s16 x, s16 y, u8 direction, u8 gender) mapObject->mapobj_unk_1B = sub_8126B54(); FieldObjectTurn(mapObject, direction); ClearPlayerAvatarInfo(); - gPlayerAvatar.running2 = 0; - gPlayerAvatar.running1 = 0; + gPlayerAvatar.runningState = NOT_MOVING; + gPlayerAvatar.tileTransitionState = T_NOT_MOVING; gPlayerAvatar.mapObjectId = mapObjectId; gPlayerAvatar.spriteId = mapObject->spriteId; gPlayerAvatar.gender = gender; @@ -1212,7 +1221,7 @@ static void sub_8059E2C(u8 taskId) u8 sub_8059E84(struct Task *task, struct MapObject *b, struct MapObject *c) { ScriptContext2_Enable(); - gPlayerAvatar.unk6 = 1; + gPlayerAvatar.preventStep = TRUE; task->data[0]++; return 0; } @@ -1224,8 +1233,8 @@ u8 sub_8059EA4(struct Task *task, struct MapObject *b, struct MapObject *c) { FieldObjectClearAnimIfSpecialAnimFinished(b); FieldObjectClearAnimIfSpecialAnimFinished(c); - FieldObjectSetSpecialAnim(b, GetStepInPlaceDelay16AnimId(task->data[2])); - FieldObjectSetSpecialAnim(c, GetSimpleGoAnimId(task->data[2])); + FieldObjectSetSpecialAnim(b, GetStepInPlaceDelay16AnimId((u8)task->data[2])); + FieldObjectSetSpecialAnim(c, GetSimpleGoAnimId((u8)task->data[2])); gFieldEffectArguments[0] = c->coords2.x; gFieldEffectArguments[1] = c->coords2.y; gFieldEffectArguments[2] = c->elevation; @@ -1244,7 +1253,7 @@ u8 sub_8059F40(struct Task *task, struct MapObject *b, struct MapObject *c) { FieldObjectClearAnimIfSpecialAnimFinished(b); FieldObjectClearAnimIfSpecialAnimFinished(c); - gPlayerAvatar.unk6 = 0; + gPlayerAvatar.preventStep = FALSE; ScriptContext2_Disable(); DestroyTask(FindTaskIdByFunc(sub_8059E2C)); } @@ -1253,24 +1262,23 @@ u8 sub_8059F40(struct Task *task, struct MapObject *b, struct MapObject *c) /* Some field effect */ -static void sub_8059FB4(u8 taskId); +static void DoPlayerAvatarSecretBaseMatJump(u8 taskId); -static void sub_8059F94(void) +static void DoPlayerMatJump(void) { - u8 taskId = CreateTask(sub_8059FB4, 0xFF); - - sub_8059FB4(taskId); + DoPlayerAvatarSecretBaseMatJump(CreateTask(DoPlayerAvatarSecretBaseMatJump, 0xFF)); } -static void sub_8059FB4(u8 taskId) +static void DoPlayerAvatarSecretBaseMatJump(u8 taskId) { - while (gUnknown_0830FC94[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId])) + while (sPlayerAvatarSecretBaseMatJump[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId])) ; } -u8 sub_805A000(struct Task *task, struct MapObject *mapObject) +// because data[0] is used to call this, it can be inferred that there may have been multiple mat jump functions at one point, so the name for these groups of functions is appropriate in assuming the sole use of mat jump. +u8 PlayerAvatar_DoSecretBaseMatJump(struct Task *task, struct MapObject *mapObject) { - gPlayerAvatar.unk6 = 1; + gPlayerAvatar.preventStep = TRUE; if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) { PlaySE(SE_DANSA); @@ -1278,9 +1286,9 @@ u8 sub_805A000(struct Task *task, struct MapObject *mapObject) task->data[1]++; if (task->data[1] > 1) { - gPlayerAvatar.unk6 = 0; - gPlayerAvatar.bike |= 0x20; - DestroyTask(FindTaskIdByFunc(sub_8059FB4)); + gPlayerAvatar.preventStep = FALSE; + gPlayerAvatar.unk1 |= 0x20; + DestroyTask(FindTaskIdByFunc(DoPlayerAvatarSecretBaseMatJump)); } } return 0; @@ -1307,7 +1315,7 @@ u8 sub_805A0D8(struct Task *task, struct MapObject *mapObject) { task->data[0]++; task->data[1] = mapObject->placeholder18; - gPlayerAvatar.unk6 = 1; + gPlayerAvatar.preventStep = TRUE; ScriptContext2_Enable(); PlaySE(SE_TK_WARPIN); return 1; @@ -1349,7 +1357,7 @@ u8 sub_805A1B8(struct Task *task, struct MapObject *mapObject) { FieldObjectSetSpecialAnim(mapObject, GetSimpleGoAnimId(GetOppositeDirection(task->data[1]))); ScriptContext2_Disable(); - gPlayerAvatar.unk6 = 0; + gPlayerAvatar.preventStep = FALSE; DestroyTask(FindTaskIdByFunc(sub_805A08C)); } return 0; @@ -1365,11 +1373,11 @@ void sub_805A20C(u8 a) u8 taskId; ScriptContext2_Enable(); - sav1_reset_battle_music_maybe(); - sub_8053F84(); + Overworld_ClearSavedMusic(); + Overworld_ChangeMusicToDefault(); gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_SURFING; gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_ON_FOOT; - gPlayerAvatar.unk6 = 1; + gPlayerAvatar.preventStep = TRUE; taskId = CreateTask(taskFF_0805D1D4, 0xFF); gTasks[taskId].data[0] = a; taskFF_0805D1D4(taskId); @@ -1385,7 +1393,7 @@ static void taskFF_0805D1D4(u8 taskId) return; } sub_8127ED0(playerMapObj->mapobj_unk_1A, 2); - FieldObjectSetSpecialAnim(playerMapObj, sub_80608D0(gTasks[taskId].data[0])); + FieldObjectSetSpecialAnim(playerMapObj, sub_80608D0((u8)gTasks[taskId].data[0])); gTasks[taskId].func = sub_805A2D0; } @@ -1397,7 +1405,7 @@ static void sub_805A2D0(u8 taskId) { sub_805B980(playerMapObj, GetPlayerAvatarGraphicsIdByStateId(0)); FieldObjectSetSpecialAnim(playerMapObj, GetFaceDirectionAnimId(playerMapObj->mapobj_unk_18)); - gPlayerAvatar.unk6 = 0; + gPlayerAvatar.preventStep = FALSE; ScriptContext2_Disable(); DestroySprite(&gSprites[playerMapObj->mapobj_unk_1A]); DestroyTask(taskId); @@ -1462,7 +1470,7 @@ static void Task_Fishing(u8 taskId) u8 Fishing1(struct Task *task) { ScriptContext2_Enable(); - gPlayerAvatar.unk6 = 1; + gPlayerAvatar.preventStep = TRUE; task->tStep++; return 0; } @@ -1647,7 +1655,7 @@ u8 Fishing11(struct Task *task) if (task->tFrameCounter != 0) { - gPlayerAvatar.unk6 = 0; + gPlayerAvatar.preventStep = FALSE; ScriptContext2_Disable(); FishingWildEncounter(task->tFishingRod); sub_80BE97C(1); @@ -1707,7 +1715,7 @@ u8 Fishing16(struct Task *task) { if (MenuUpdateWindowText()) { - gPlayerAvatar.unk6 = 0; + gPlayerAvatar.preventStep = FALSE; ScriptContext2_Disable(); UnfreezeMapObjects(); MenuZeroFillScreen(); diff --git a/src/field_poison.c b/src/field/field_poison.c index 1244b9c62..b6ff12ff9 100644 --- a/src/field_poison.c +++ b/src/field/field_poison.c @@ -128,7 +128,7 @@ s32 DoPoisonFieldEffect(void) hp--; if (hp == 0) numFainting++; //Pokemon will now faint due to poison - SetMonData(pkmn, MON_DATA_HP, (u8 *)&hp); + SetMonData(pkmn, MON_DATA_HP, &hp); numPoisoned++; } pkmn++; diff --git a/src/field_region_map.c b/src/field/field_region_map.c index 7cb22e5df..7cb22e5df 100644 --- a/src/field_region_map.c +++ b/src/field/field_region_map.c diff --git a/src/field_screen_effect.c b/src/field/field_screen_effect.c index 1464a99b1..0c76d254d 100644 --- a/src/field_screen_effect.c +++ b/src/field/field_screen_effect.c @@ -327,7 +327,7 @@ static void task50_0807F0C8(u8); void sub_8081924(void) { - sub_8054044(); + Overworld_FadeOutMapMusic(); CreateTask(task50_0807F0C8, 80); } diff --git a/src/field_special_scene.c b/src/field/field_special_scene.c index 38c076c51..5758929b6 100644 --- a/src/field_special_scene.c +++ b/src/field/field_special_scene.c @@ -18,6 +18,52 @@ #define SECONDS(value) ((signed) (60.0 * value + 0.5)) +// TODO: Move somewhere else +enum +{ + STEP_17 = 0x17, + STEP_18, + STEP_END = 0xFE, +}; + +const u32 gMapObjectPic_MovingBox[] = INCBIN_U32("graphics/map_objects/pics/misc/moving_box.4bpp"); +const u16 gMapObjectPalette19[] = INCBIN_U16("graphics/map_objects/palettes/19.gbapal"); + +static const s8 gTruckCamera_HorizontalTable[] = +{ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + -1, + -1, + -1, + 0, +}; + +const u8 gUnknown_083D295F[] = +{ + STEP_18, + STEP_END, +}; + +const u8 gUnknown_083D2961[] = +{ + STEP_17, + STEP_END, +}; + // porthole states enum { @@ -27,12 +73,7 @@ enum EXIT_PORTHOLE, }; -extern s8 gTruckCamera_HorizontalTable[]; - -extern u8 gUnknown_083D295F[]; -extern u8 gUnknown_083D2961[]; - -s32 GetTruckCameraBobbingY(int a1) +s16 GetTruckCameraBobbingY(int a1) { if (!(a1 % 120)) return -1; @@ -42,7 +83,7 @@ s32 GetTruckCameraBobbingY(int a1) return 0; } -s32 GetTruckBoxMovement(int a1) // for the box movement? +s16 GetTruckBoxMovement(int a1) // for the box movement? { if (!((a1 + 120) % 180)) return -1; @@ -53,28 +94,22 @@ s32 GetTruckBoxMovement(int a1) // for the box movement? void Task_Truck1(u8 taskId) { s16 *data = gTasks[taskId].data; - s16 cameraYpan; - s16 box1 = 0; - s16 box2 = 0; - s16 box3 = 0; - u8 mapNum, mapGroup; - register s16 zero asm("r4"); + s16 cameraYpan, cameraXpan = 0; + s16 box1, box2, box3; box1 = GetTruckBoxMovement(data[0] + 30) * 4; // top box. - sub_805BD90(1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, 3, box1 + 3); + sub_805BD90(1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, 3 - cameraXpan, box1 + 3); box2 = GetTruckBoxMovement(data[0]) * 2; // bottom left box. - sub_805BD90(2, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, 0, box2 - 3); + sub_805BD90(2, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, -cameraXpan, box2 - 3); box3 = GetTruckBoxMovement(data[0]) * 4; // bottom right box. - mapNum = gSaveBlock1.location.mapNum; - mapGroup = gSaveBlock1.location.mapGroup; - zero = 0; - sub_805BD90(3, mapNum, mapGroup, -3, box3); + sub_805BD90(3, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, -3 - cameraXpan, box3); if (++data[0] == SECONDS(500)) // this will never run - data[0] = zero; // reset the timer if it gets stuck. + data[0] = 0; // reset the timer if it gets stuck. + // this also matches with directly calling GetTruckCameraBobbingY within SetCameraPanning, but this is consistent with a later function that requires a temp variable. cameraYpan = GetTruckCameraBobbingY(data[0]); - SetCameraPanning(0, cameraYpan); + SetCameraPanning(cameraXpan, cameraYpan); } void Task_Truck2(u8 taskId) @@ -82,9 +117,7 @@ void Task_Truck2(u8 taskId) s16 *data = gTasks[taskId].data; s16 cameraYpan; s16 cameraXpan; - s16 box1; - s16 box2; - s16 box3; + s16 box1, box2, box3; data[0]++; data[2]++; @@ -137,7 +170,7 @@ void Task_Truck3(u8 taskId) { cameraXpan = gTruckCamera_HorizontalTable[data[1]]; cameraYpan = 0; - SetCameraPanning(cameraXpan, 0); + SetCameraPanning(cameraXpan, cameraYpan); sub_805BD90(1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, 3 - cameraXpan, cameraYpan + 3); sub_805BD90(2, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, -cameraXpan, cameraYpan - 3); sub_805BD90(3, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, -3 - cameraXpan, cameraYpan); @@ -250,7 +283,7 @@ bool8 sub_80C7754(void) } else { - warp1_set(mapGroup, mapNum, -1, x, y); + Overworld_SetWarpDestination(mapGroup, mapNum, -1, x, y); return TRUE; } } diff --git a/src/field_specials.c b/src/field/field_specials.c index c23ea2ddc..46061febf 100644 --- a/src/field_specials.c +++ b/src/field/field_specials.c @@ -48,9 +48,9 @@ extern u16 gSpecialVar_0x8004; extern u16 gSpecialVar_0x8005; extern u16 gScriptResult; -EWRAM_DATA u8 gUnknown_02039250 = 0; -EWRAM_DATA u8 gUnknown_02039251 = 0; -EWRAM_DATA u32 gUnknown_02039254 = 0; +EWRAM_DATA bool8 gBikeCyclingChallenge = FALSE; +EWRAM_DATA u8 gBikeCollisions = 0; +EWRAM_DATA u32 gBikeCyclingTimer = 0; EWRAM_DATA u8 gUnknown_02039258 = 0; EWRAM_DATA u8 gUnknown_02039259 = 0; EWRAM_DATA u8 gUnknown_0203925A = 0; @@ -76,16 +76,16 @@ void ScrSpecial_ViewWallClock(void) void ResetCyclingRoadChallengeData(void) { - gUnknown_02039250 = 0; - gUnknown_02039251 = 0; - gUnknown_02039254 = 0; + gBikeCyclingChallenge = FALSE; + gBikeCollisions = 0; + gBikeCyclingTimer = 0; } void ScrSpecial_BeginCyclingRoadChallenge(void) { - gUnknown_02039250 = 1; - gUnknown_02039251 = 0; - gUnknown_02039254 = gMain.vblankCounter1; + gBikeCyclingChallenge = TRUE; + gBikeCollisions = 0; + gBikeCyclingTimer = gMain.vblankCounter1; } u16 GetPlayerAvatarBike(void) @@ -171,10 +171,10 @@ static void DetermineCyclingRoadResults(u32 arg0, u8 arg1) } void FinishCyclingRoadChallenge(void) { - const u32 time = gMain.vblankCounter1 - gUnknown_02039254; + const u32 time = gMain.vblankCounter1 - gBikeCyclingTimer; - DetermineCyclingRoadResults(time, gUnknown_02039251); - RecordCyclingRoadResults(time, gUnknown_02039251); + DetermineCyclingRoadResults(time, gBikeCollisions); + RecordCyclingRoadResults(time, gBikeCollisions); } static void RecordCyclingRoadResults(u32 arg0, u8 arg1) { @@ -213,7 +213,7 @@ void UpdateCyclingRoadState(void) { if (VarGet(0x40a9) == 2 || VarGet(0x40a9) == 3) { VarSet(0x40a9, 0); - sav1_set_battle_music_maybe(SE_STOP); + Overworld_SetSavedMusic(SE_STOP); } } @@ -700,11 +700,11 @@ void CableCarWarp(void) { if (gSpecialVar_0x8004 != 0) { - warp1_set(MAP_GROUP_ROUTE112_CABLE_CAR_STATION, MAP_ID_ROUTE112_CABLE_CAR_STATION, -1, 6, 4); + Overworld_SetWarpDestination(MAP_GROUP_ROUTE112_CABLE_CAR_STATION, MAP_ID_ROUTE112_CABLE_CAR_STATION, -1, 6, 4); } else { - warp1_set(MAP_GROUP_MT_CHIMNEY_CABLE_CAR_STATION, MAP_ID_MT_CHIMNEY_CABLE_CAR_STATION, -1, 6, 4); + Overworld_SetWarpDestination(MAP_GROUP_MT_CHIMNEY_CABLE_CAR_STATION, MAP_ID_MT_CHIMNEY_CABLE_CAR_STATION, -1, 6, 4); } } @@ -1789,7 +1789,7 @@ u16 sub_810F404(void) void sub_810F414(void) { - sub_8135FF4(gStringVar1); + SetEReaderTrainerName(gStringVar1); } const u8 gUnknown_083F83E0[] = {12, 2, 4, 5, 1, 8, 7, 11, 3, 10, 9, 6}; @@ -1905,13 +1905,13 @@ void PutZigzagoonInPlayerParty(void) u16 monData; CreateMon(&gPlayerParty[0], SPECIES_ZIGZAGOON, 7, 0x20, FALSE, 0, FALSE, 0); monData = TRUE; - SetMonData(&gPlayerParty[0], MON_DATA_ALT_ABILITY, (u8 *)&monData); + SetMonData(&gPlayerParty[0], MON_DATA_ALT_ABILITY, &monData); monData = MOVE_TACKLE; - SetMonData(&gPlayerParty[0], MON_DATA_MOVE1, (u8 *)&monData); + SetMonData(&gPlayerParty[0], MON_DATA_MOVE1, &monData); monData = MOVE_NONE; - SetMonData(&gPlayerParty[0], MON_DATA_MOVE2, (u8 *)&monData); - SetMonData(&gPlayerParty[0], MON_DATA_MOVE3, (u8 *)&monData); - SetMonData(&gPlayerParty[0], MON_DATA_MOVE4, (u8 *)&monData); + SetMonData(&gPlayerParty[0], MON_DATA_MOVE2, &monData); + SetMonData(&gPlayerParty[0], MON_DATA_MOVE3, &monData); + SetMonData(&gPlayerParty[0], MON_DATA_MOVE4, &monData); } bool8 IsStarterInParty(void) diff --git a/src/field_tasks.c b/src/field/field_tasks.c index 2be54f923..da6f162c2 100644 --- a/src/field_tasks.c +++ b/src/field/field_tasks.c @@ -1,5 +1,5 @@ // -// Created by scott on 6/22/2017. + // #include "global.h" @@ -845,11 +845,11 @@ void Task_MuddySlope(u8 taskId) } break; } - if (gUnknown_0202E844.field_0 && mapIndices != data[0]) + if (gCamera.field_0 && mapIndices != data[0]) { data[0] = mapIndices; - x2 = gUnknown_0202E844.x; - y2 = gUnknown_0202E844.y; + x2 = gCamera.x; + y2 = gCamera.y; } else { diff --git a/src/field_weather.c b/src/field/field_weather.c index c4fb4872f..a2abf7623 100644 --- a/src/field_weather.c +++ b/src/field/field_weather.c @@ -118,7 +118,7 @@ extern u16 gUnknown_0202FF58; extern u8 *gUnknown_083970E8; extern u8 (*gUnknown_08396FC8[][4])(void); extern u8 (*gUnknown_083970B8[])(void); -extern const u8 *gUnknown_030006DC; +IWRAM_DATA const u8 *gUnknown_030006DC; extern const u8 gUnknown_083970C8[]; // This is a pointer to gWeather. All code sub_807DE78 and below uses this pointer, @@ -140,6 +140,8 @@ const u8 DroughtPaletteData_2[] = INCBIN_U8("graphics/weather/drought2.bin.lz"); const u8 DroughtPaletteData_3[] = INCBIN_U8("graphics/weather/drought3.bin.lz"); const u8 DroughtPaletteData_4[] = INCBIN_U8("graphics/weather/drought4.bin.lz"); const u8 DroughtPaletteData_5[] = INCBIN_U8("graphics/weather/drought5.bin.lz"); +extern u8 (*gUnknown_0202FC48)[32]; +extern u8 gUnknown_0202F9E8[32]; const u8 *const gUnknown_08396FA8[] = { diff --git a/src/fieldmap.c b/src/field/fieldmap.c index 3ad190a4b..7a31ae720 100644 --- a/src/fieldmap.c +++ b/src/field/fieldmap.c @@ -22,7 +22,7 @@ struct Coords32 EWRAM_DATA static u16 gUnknown_02029828[0x2800] = {0}; EWRAM_DATA struct MapHeader gMapHeader = {0}; -EWRAM_DATA struct Camera gUnknown_0202E844 = {0}; +EWRAM_DATA struct Camera gCamera = {0}; EWRAM_DATA static struct ConnectionFlags gUnknown_0202E850 = {0}; struct BackupMapData gUnknown_03004870; @@ -713,7 +713,7 @@ bool8 CameraMove(int x, int y) unsigned int direction; struct MapConnection *connection; int old_x, old_y; - gUnknown_0202E844.field_0 = FALSE; + gCamera.field_0 = FALSE; direction = GetPostCameraMoveMapBorderId(x, y); if (direction + 1 <= 1) { @@ -728,14 +728,14 @@ bool8 CameraMove(int x, int y) connection = sub_8056A64(direction, gSaveBlock1.pos.x, gSaveBlock1.pos.y); sub_8056918(connection, direction, x, y); sub_80538F0(connection->mapGroup, connection->mapNum); - gUnknown_0202E844.field_0 = TRUE; - gUnknown_0202E844.x = old_x - gSaveBlock1.pos.x; - gUnknown_0202E844.y = old_y - gSaveBlock1.pos.y; + gCamera.field_0 = TRUE; + gCamera.x = old_x - gSaveBlock1.pos.x; + gCamera.y = old_y - gSaveBlock1.pos.y; gSaveBlock1.pos.x += x; gSaveBlock1.pos.y += y; sub_80566F0(direction); } - return gUnknown_0202E844.field_0; + return gCamera.field_0; } struct MapConnection *sub_8056A64(u8 direction, int x, int y) diff --git a/src/fldeff_cut.c b/src/field/fldeff_cut.c index 00643a979..00643a979 100644 --- a/src/fldeff_cut.c +++ b/src/field/fldeff_cut.c diff --git a/src/fldeff_flash.c b/src/field/fldeff_flash.c index 1ee8a8f05..1ee8a8f05 100644 --- a/src/fldeff_flash.c +++ b/src/field/fldeff_flash.c diff --git a/src/fldeff_softboiled.c b/src/field/fldeff_softboiled.c index cb26d9966..22f9c13f5 100644 --- a/src/fldeff_softboiled.c +++ b/src/field/fldeff_softboiled.c @@ -75,7 +75,7 @@ bool8 SetUpFieldMove_SoftBoiled(void) { void sub_8133D28(u8 taskid) { EWRAM_1000.unkC = sub_8133D50; EWRAM_1B000_2.unk272 = 3; - sub_808A004(taskid); + DoPokemonMenu_Switch(taskid); } static void sub_8133D50(u8 taskId) { @@ -132,8 +132,8 @@ static void sub_8133E74(u8 taskId) { } MenuZeroFillWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); - sub_806D538(3, 0); - gTasks[taskId].func = sub_806CB74; + PrintPartyMenuPromptText(3, 0); + gTasks[taskId].func = HandlePartyMenuSwitchPokemonInput; } static void sub_8133EB8(u8 taskId) { @@ -148,6 +148,6 @@ static void sub_8133EF8(void) { EWRAM_1B000_2.unk261 = 2; DestroySprite(&gSprites[EWRAM_1000.unk1]); MenuZeroFillWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); - sub_806D538(0, 0); + PrintPartyMenuPromptText(0, 0); SwitchTaskToFollowupFunc(EWRAM_1000.unk0); } diff --git a/src/fldeff_strength.c b/src/field/fldeff_strength.c index d9603d094..d9603d094 100644 --- a/src/fldeff_strength.c +++ b/src/field/fldeff_strength.c diff --git a/src/fldeff_sweetscent.c b/src/field/fldeff_sweetscent.c index b9dbf619d..b9dbf619d 100644 --- a/src/fldeff_sweetscent.c +++ b/src/field/fldeff_sweetscent.c diff --git a/src/fldeff_teleport.c b/src/field/fldeff_teleport.c index af48fb414..af48fb414 100644 --- a/src/fldeff_teleport.c +++ b/src/field/fldeff_teleport.c diff --git a/src/heal_location.c b/src/field/heal_location.c index 42bc18567..42bc18567 100644 --- a/src/heal_location.c +++ b/src/field/heal_location.c diff --git a/src/hof_pc.c b/src/field/hof_pc.c index aeeb7fe17..267ed4274 100644 --- a/src/hof_pc.c +++ b/src/field/hof_pc.c @@ -28,7 +28,7 @@ void ReturnFromHallOfFamePC(void) static void ReshowPCMenuAfterHallOfFamePC(void) { ScriptContext2_Enable(); - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); ScrSpecial_CreatePCMenu(); ScriptMenu_DisplayPCStartupPrompt(); diff --git a/src/item.c b/src/field/item.c index 36871285a..fd49f5c39 100644 --- a/src/item.c +++ b/src/field/item.c @@ -30,11 +30,11 @@ enum }; #if ENGLISH -#include "data/item_descriptions_en.h" -#include "data/items_en.h" +#include "../data/item_descriptions_en.h" +#include "../data/items_en.h" #elif GERMAN -#include "data/item_descriptions_de.h" -#include "data/items_de.h" +#include "../data/item_descriptions_de.h" +#include "../data/items_de.h" #endif static void CompactPCItems(void); diff --git a/src/item_menu.c b/src/field/item_menu.c index 891eb135f..c508bcacf 100644 --- a/src/item_menu.c +++ b/src/field/item_menu.c @@ -152,7 +152,7 @@ static u8 sReturnLocation; static const u8 *sPopupMenuActionList; // common -void (*gUnknown_03005D00)(u8) = NULL; +void (*gFieldItemUseCallback)(u8) = NULL; extern u16 gUnknown_030041B4; extern struct PocketScrollState gBagPocketScrollStates[]; extern struct ItemSlot *gCurrentBagPocketItemSlots; // selected pocket item slots @@ -2718,7 +2718,7 @@ void ExecuteItemUseFromBlackPalette(void) static void Task_CallItemUseOnFieldCallback(u8 taskId) { if (sub_807D770() == TRUE) - gUnknown_03005D00(taskId); + gFieldItemUseCallback(taskId); } void sub_80A5D04(void) @@ -4492,7 +4492,7 @@ static void LoadBerryPic(u8 berryId) spritePal.data = (u16 *)sBerryGraphicsTable[berryId].lzPalette; spritePal.tag = 0x7544; LoadCompressedObjectPalette((struct CompressedSpritePalette *)&spritePal); - sub_800D238(sBerryGraphicsTable[berryId].lzPic, ewramBerryPicTemp); + LZDecompressWram(sBerryGraphicsTable[berryId].lzPic, ewramBerryPicTemp); DrawBerryPic(ewramBerryPicTemp, ewramBerryPic); } } diff --git a/src/item_use.c b/src/field/item_use.c index 8bc83bdc6..14b13ca3b 100644 --- a/src/item_use.c +++ b/src/field/item_use.c @@ -36,7 +36,7 @@ #include "task.h" #include "vars.h" -extern void (*gUnknown_03005D00)(u8); +extern void (*gFieldItemUseCallback)(u8); extern void (*gFieldCallback)(void); extern void (*gUnknown_0300485C)(void); extern void (*gUnknown_03004AE4)(u8, u16, TaskFunc); @@ -106,11 +106,13 @@ void SetUpItemUseOnFieldCallback(u8 taskId) { if (gTasks[taskId].data[2] != 1) { - gFieldCallback = (void *)ExecuteItemUseFromBlackPalette; + gFieldCallback = ExecuteItemUseFromBlackPalette; ItemMenu_ConfirmNormalFade(taskId); } else - gUnknown_03005D00(taskId); + { + gFieldItemUseCallback(taskId); + } } void HandleDeniedItemUseMessage(u8 var1, u8 playerMenuStatus, const u8 *text) @@ -185,9 +187,9 @@ void ItemUseOutOfBattle_Bike(u8 taskId) } else { - if (Overworld_IsBikeAllowedOnCurrentMap() == TRUE && IsBikingDisallowedByPlayer() == FALSE) + if (Overworld_IsBikingAllowed() == TRUE && IsBikingDisallowedByPlayer() == FALSE) { - gUnknown_03005D00 = (void *)ItemUseOnFieldCB_Bike; + gFieldItemUseCallback = (void *)ItemUseOnFieldCB_Bike; SetUpItemUseOnFieldCallback(taskId); } else @@ -241,7 +243,7 @@ void ItemUseOutOfBattle_Rod(u8 taskId) { if (CanFish() == TRUE) { - gUnknown_03005D00 = (void *)ItemUseOnFieldCB_Rod; + gFieldItemUseCallback = (void *)ItemUseOnFieldCB_Rod; SetUpItemUseOnFieldCallback(taskId); } else @@ -257,7 +259,7 @@ void ItemUseOnFieldCB_Rod(u8 taskId) void ItemUseOutOfBattle_Itemfinder(u8 var) { IncrementGameStat(0x27); - gUnknown_03005D00 = (void *)ItemUseOnFieldCB_Itemfinder; + gFieldItemUseCallback = (void *)ItemUseOnFieldCB_Itemfinder; SetUpItemUseOnFieldCallback(var); } @@ -778,9 +780,9 @@ void ItemUseOutOfBattle_SSTicket(u8 taskId) void sub_80C9C7C(u8 taskId) { - if (IsPlayerFacingPlantedBerryTree() == TRUE) + if (IsPlayerFacingUnplantedSoil() == TRUE) { - gUnknown_03005D00 = sub_80C9D00; + gFieldItemUseCallback = sub_80C9D00; gFieldCallback = ExecuteItemUseFromBlackPalette; gTasks[taskId].data[8] = (u32)c2_exit_to_overworld_2_switch >> 16; gTasks[taskId].data[9] = (u32)c2_exit_to_overworld_2_switch; @@ -805,7 +807,7 @@ void ItemUseOutOfBattle_WailmerPail(u8 taskId) { if (TryToWaterBerryTree() == TRUE) { - gUnknown_03005D00 = sub_80C9D74; + gFieldItemUseCallback = sub_80C9D74; SetUpItemUseOnFieldCallback(taskId); } else @@ -909,7 +911,7 @@ void sub_80C9FC0(u8 var) sub_80C9D98(var); } -void sub_80C9FDC(void) +static void PrepareItemUseMessage(void) { RemoveBagItem(gScriptItemId, 1); sub_80A3E0C(); @@ -922,7 +924,7 @@ void ItemUseOutOfBattle_Repel(u8 var) if (VarGet(VAR_REPEL_STEP_COUNT) == FALSE) { VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(gScriptItemId)); - sub_80C9FDC(); + PrepareItemUseMessage(); DisplayItemMessageOnField(var, gStringVar4, CleanUpItemMenuMessage, 1); } else @@ -975,10 +977,10 @@ void task08_080A1C44(u8 taskId) DestroyTask(taskId); } -void sub_80CA18C(u8 taskId) +void EscapeRopeCallback(u8 taskId) { - sub_8053014(); - sub_80C9FDC(); + Overworld_ResetStateAfterDigEscRope(); + PrepareItemUseMessage(); gTasks[taskId].data[0] = 0; DisplayItemMessageOnField(taskId, gStringVar4, task08_080A1C44, 0); } @@ -995,7 +997,7 @@ void ItemUseOutOfBattle_EscapeRope(u8 taskId) { if (CanUseEscapeRopeOnCurrMap() == TRUE) { - gUnknown_03005D00 = sub_80CA18C; + gFieldItemUseCallback = EscapeRopeCallback; SetUpItemUseOnFieldCallback(taskId); } else @@ -1114,7 +1116,7 @@ void ItemUseInBattle_Escape(u8 taskId) if((gBattleTypeFlags & BATTLE_TYPE_TRAINER) == FALSE) { - sub_80C9FDC(); + PrepareItemUseMessage(); DisplayItemMessageOnField(taskId, gStringVar4, sub_80A7094, 1); } else diff --git a/src/landmark.c b/src/field/landmark.c index 6a53716bb..6a53716bb 100644 --- a/src/landmark.c +++ b/src/field/landmark.c diff --git a/src/lottery_corner.c b/src/field/lottery_corner.c index c2c25b9ac..c2c25b9ac 100644 --- a/src/lottery_corner.c +++ b/src/field/lottery_corner.c diff --git a/src/map_name_popup.c b/src/field/map_name_popup.c index 01105d0db..01105d0db 100644 --- a/src/map_name_popup.c +++ b/src/field/map_name_popup.c diff --git a/src/map_obj_lock.c b/src/field/map_obj_lock.c index 2856320b8..91feaf177 100644 --- a/src/map_obj_lock.c +++ b/src/field/map_obj_lock.c @@ -10,7 +10,7 @@ extern u16 gScriptFacing; bool8 walkrun_is_standing_still(void) { - if (gPlayerAvatar.running1 == 1) + if (gPlayerAvatar.tileTransitionState == T_TILE_TRANSITION) return FALSE; else return TRUE; diff --git a/src/mauville_man.c b/src/field/mauville_man.c index 33bc39648..33bc39648 100644 --- a/src/mauville_man.c +++ b/src/field/mauville_man.c diff --git a/src/menu_helpers.c b/src/field/menu_helpers.c index 14e823355..14e823355 100644 --- a/src/menu_helpers.c +++ b/src/field/menu_helpers.c diff --git a/src/metatile_behavior.c b/src/field/metatile_behavior.c index d05ba0b89..d05ba0b89 100644 --- a/src/metatile_behavior.c +++ b/src/field/metatile_behavior.c diff --git a/src/money.c b/src/field/money.c index 5d0f0ae8d..5d0f0ae8d 100644 --- a/src/money.c +++ b/src/field/money.c diff --git a/src/overworld.c b/src/field/overworld.c index 9b41a262d..d6f255409 100644 --- a/src/overworld.c +++ b/src/field/overworld.c @@ -91,7 +91,7 @@ extern struct MapHeader * const * const gMapGroups[]; extern s32 gMaxFlashLevel; EWRAM_DATA struct WarpData gUnknown_020297F0 = {0}; -EWRAM_DATA struct WarpData gUnknown_020297F8 = {0}; +EWRAM_DATA struct WarpData gWarpDestination = {0}; // new warp position EWRAM_DATA struct WarpData gUnknown_02029800 = {0}; EWRAM_DATA struct WarpData gUnknown_02029808 = {0}; EWRAM_DATA struct UnkPlayerStruct gUnknown_02029810 = {0}; @@ -195,12 +195,12 @@ static void DoWhiteOut(void) ScriptContext2_RunNewScript(S_WhiteOut); gSaveBlock1.money /= 2; ScrSpecial_HealPlayerParty(); - sub_8053050(); - sub_8053570(); + Overworld_ResetStateAfterWhiteOut(); + Overworld_SetWarpDestToLastHealLoc(); warp_in(); } -void flag_var_implications_of_teleport_(void) +void Overworld_ResetStateAfterFly(void) { player_avatar_init_params_reset(); FlagClear(SYS_CYCLING_ROAD); @@ -221,7 +221,7 @@ void Overworld_ResetStateAfterTeleport(void) ScriptContext2_RunNewScript(gUnknown_0819FC9F); } -void sub_8053014(void) +void Overworld_ResetStateAfterDigEscRope(void) { player_avatar_init_params_reset(); FlagClear(SYS_CYCLING_ROAD); @@ -231,7 +231,7 @@ void sub_8053014(void) FlagClear(SYS_USE_FLASH); } -void sub_8053050(void) +void Overworld_ResetStateAfterWhiteOut(void) { player_avatar_init_params_reset(); FlagClear(SYS_CYCLING_ROAD); @@ -283,9 +283,12 @@ void SetGameStat(u8 index, u32 value) gSaveBlock1.gameStats[index] = value; } -void sub_8053154(void) +void LoadMapObjTemplatesFromHeader(void) { + // Clear map object templates CpuFill32(0, gSaveBlock1.mapObjectTemplates, sizeof(gSaveBlock1.mapObjectTemplates)); + + // Copy map header events to save block CpuCopy32(gMapHeader.events->mapObjects, gSaveBlock1.mapObjectTemplates, gMapHeader.events->mapObjectCount * sizeof(struct MapObjectTemplate)); @@ -300,7 +303,7 @@ static void LoadSaveblockMapObjScripts(void) mapObjectTemplates[i].script = gMapHeader.events->mapObjects[i].script; } -void Overworld_SaveMapObjCoords(u8 localId, s16 x, s16 y) +void Overworld_SetMapObjTemplateCoords(u8 localId, s16 x, s16 y) { s32 i; for (i = 0; i < 64; i++) @@ -315,9 +318,10 @@ void Overworld_SaveMapObjCoords(u8 localId, s16 x, s16 y) } } -void Overworld_SaveMapObjMovementType(u8 localId, u8 movementType) +void Overworld_SetMapObjTemplateMovementType(u8 localId, u8 movementType) { s32 i; + for (i = 0; i < 64; i++) { struct MapObjectTemplate *mapObjectTemplate = &gSaveBlock1.mapObjectTemplates[i]; @@ -346,15 +350,15 @@ static struct MapData *get_mapdata_header(void) return NULL; } -static void warp_shift(void) +static void ApplyCurrentWarp(void) { gUnknown_020297F0 = gSaveBlock1.location; - gSaveBlock1.location = gUnknown_020297F8; + gSaveBlock1.location = gWarpDestination; gUnknown_02029800 = sDummyWarpData; gUnknown_02029808 = sDummyWarpData; } -static void warp_set(struct WarpData *warp, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) +static void SetWarpData(struct WarpData *warp, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) { warp->mapGroup = mapGroup; warp->mapNum = mapNum; @@ -385,7 +389,7 @@ struct MapHeader *const Overworld_GetMapHeaderByGroupAndId(u16 mapGroup, u16 map struct MapHeader *const warp1_get_mapheader(void) { - return Overworld_GetMapHeaderByGroupAndId(gUnknown_020297F8.mapGroup, gUnknown_020297F8.mapNum); + return Overworld_GetMapHeaderByGroupAndId(gWarpDestination.mapGroup, gWarpDestination.mapNum); } static void set_current_map_header_from_sav1_save_old_name(void) @@ -422,34 +426,34 @@ void sub_80533CC(void) void warp_in(void) { - warp_shift(); + ApplyCurrentWarp(); set_current_map_header_from_sav1_save_old_name(); sub_80533CC(); } -void warp1_set(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) +void Overworld_SetWarpDestination(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) { - warp_set(&gUnknown_020297F8, mapGroup, mapNum, warpId, x, y); + SetWarpData(&gWarpDestination, mapGroup, mapNum, warpId, x, y); } void warp1_set_2(s8 mapGroup, s8 mapNum, s8 warpId) { - warp1_set(mapGroup, mapNum, warpId, -1, -1); + Overworld_SetWarpDestination(mapGroup, mapNum, warpId, -1, -1); } void saved_warp2_set(int unused, s8 mapGroup, s8 mapNum, s8 warpId) { - warp_set(&gSaveBlock1.warp2, mapGroup, mapNum, warpId, gSaveBlock1.pos.x, gSaveBlock1.pos.y); + SetWarpData(&gSaveBlock1.warp2, mapGroup, mapNum, warpId, gSaveBlock1.pos.x, gSaveBlock1.pos.y); } void saved_warp2_set_2(int unused, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) { - warp_set(&gSaveBlock1.warp2, mapGroup, mapNum, warpId, x, y); + SetWarpData(&gSaveBlock1.warp2, mapGroup, mapNum, warpId, x, y); } void copy_saved_warp2_bank_and_enter_x_to_warp1(u8 unused) { - gUnknown_020297F8 = gSaveBlock1.warp2; + gWarpDestination = gSaveBlock1.warp2; } void sub_8053538(u8 a1) @@ -457,81 +461,82 @@ void sub_8053538(u8 a1) const struct HealLocation *warp = GetHealLocation(a1); if (warp) - warp1_set(warp->group, warp->map, -1, warp->x, warp->y); + Overworld_SetWarpDestination(warp->group, warp->map, -1, warp->x, warp->y); } -void sub_8053570(void) +void Overworld_SetWarpDestToLastHealLoc(void) { - gUnknown_020297F8 = gSaveBlock1.warp3; + gWarpDestination = gSaveBlock1.lastHealLocation; } -void sub_8053588(u8 a1) +void Overworld_SetHealLocationWarp(u8 healLocationId) { - const struct HealLocation *warp = GetHealLocation(a1); - if (warp) - warp_set(&gSaveBlock1.warp3, warp->group, warp->map, -1, warp->x, warp->y); + const struct HealLocation *healLocation = GetHealLocation(healLocationId); + + if (healLocation != NULL) + SetWarpData(&gSaveBlock1.lastHealLocation, healLocation->group, healLocation->map, -1, healLocation->x, healLocation->y); } void sub_80535C4(s16 a1, s16 a2) { - u8 v4 = Overworld_GetMapTypeOfSaveblockLocation(); - u8 v5 = GetMapTypeByGroupAndId(gUnknown_020297F8.mapGroup, gUnknown_020297F8.mapNum); - if (is_map_type_1_2_3_5_or_6(v4) && is_map_type_1_2_3_5_or_6(v5) != TRUE) + u8 currMapType = Overworld_GetMapTypeOfSaveblockLocation(); + u8 destMapType = GetMapTypeByGroupAndId(gWarpDestination.mapGroup, gWarpDestination.mapNum); + if (is_map_type_1_2_3_5_or_6(currMapType) && is_map_type_1_2_3_5_or_6(destMapType) != TRUE) sub_805363C(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1, a1 - 7, a2 - 6); } void sub_805363C(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) { - warp_set(&gSaveBlock1.warp4, mapGroup, mapNum, warpId, x, y); + SetWarpData(&gSaveBlock1.warp4, mapGroup, mapNum, warpId, x, y); } void sub_8053678(void) { - gUnknown_020297F8 = gSaveBlock1.warp4; + gWarpDestination = gSaveBlock1.warp4; } void sub_8053690(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) { - warp_set(&gUnknown_02029800, mapGroup, mapNum, warpId, x, y); + SetWarpData(&gUnknown_02029800, mapGroup, mapNum, warpId, x, y); } -void warp1_set_to_warp2(void) +static void warp1_set_to_warp2(void) { - gUnknown_020297F8 = gUnknown_02029800; + gWarpDestination = gUnknown_02029800; } void sub_80536E4(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) { - warp_set(&gUnknown_02029808, mapGroup, mapNum, warpId, x, y); + SetWarpData(&gUnknown_02029808, mapGroup, mapNum, warpId, x, y); } void sub_8053720(s16 x, s16 y) { if (warp_data_is_not_neg_1(&gUnknown_02029808) == TRUE) { - gUnknown_020297F8 = gUnknown_020297F0; + gWarpDestination = gUnknown_020297F0; } else { - warp1_set(gUnknown_02029808.mapGroup, gUnknown_02029808.mapNum, -1, x, y); + Overworld_SetWarpDestination(gUnknown_02029808.mapGroup, gUnknown_02029808.mapNum, -1, x, y); } } void sub_8053778(void) { - gUnknown_020297F8 = gSaveBlock1.warp1; + gWarpDestination = gSaveBlock1.warp1; } void unref_sub_8053790(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) { - warp_set(&gSaveBlock1.warp1, mapGroup, mapNum, warpId, x, y); + SetWarpData(&gSaveBlock1.warp1, mapGroup, mapNum, warpId, x, y); } void sub_80537CC(u8 a1) { const struct HealLocation *warp = GetHealLocation(a1); if (warp) - warp_set(&gSaveBlock1.warp1, warp->group, warp->map, -1, warp->x, warp->y); + SetWarpData(&gSaveBlock1.warp1, warp->group, warp->map, -1, warp->x, warp->y); } void gpu_sync_bg_hide() @@ -539,7 +544,7 @@ void gpu_sync_bg_hide() gSaveBlock1.warp1 = gSaveBlock1.warp2; } -struct MapConnection *sub_8053818(u8 dir) +struct MapConnection *GetMapConnection(u8 dir) { s32 i; s32 count = gMapHeader.connections->count; @@ -557,10 +562,11 @@ struct MapConnection *sub_8053818(u8 dir) bool8 sub_8053850(u8 dir, u16 x, u16 y) { - struct MapConnection *connection = sub_8053818(dir); + struct MapConnection *connection = GetMapConnection(dir); + if (connection != NULL) { - warp1_set(connection->mapGroup, connection->mapNum, -1, x, y); + Overworld_SetWarpDestination(connection->mapGroup, connection->mapNum, -1, x, y); } else { @@ -586,11 +592,11 @@ void sub_80538F0(u8 mapGroup, u8 mapNum) { s32 i; - warp1_set(mapGroup, mapNum, -1, -1, -1); + Overworld_SetWarpDestination(mapGroup, mapNum, -1, -1, -1); sub_8053F0C(); - warp_shift(); + ApplyCurrentWarp(); set_current_map_header_from_sav1_save_old_name(); - sub_8053154(); + LoadMapObjTemplatesFromHeader(); ClearTempFieldEventData(); ResetCyclingRoadChallengeData(); prev_quest_postbuffer_cursor_backup_reset(); @@ -599,7 +605,7 @@ void sub_80538F0(u8 mapGroup, u8 mapNum) sub_80806E4(); ChooseAmbientCrySpecies(); SetDefaultFlashLevel(); - sav1_reset_battle_music_maybe(); + Overworld_ClearSavedMusic(); mapheader_run_script_with_tag_x3(); not_trainer_hill_battle_pyramid(); sub_8056D38(gMapHeader.mapData); @@ -623,7 +629,7 @@ void sub_8053994(u32 a1) bool8 v3; set_current_map_header_from_sav1_save_old_name(); - sub_8053154(); + LoadMapObjTemplatesFromHeader(); v2 = is_map_type_1_2_3_5_or_6(gMapHeader.mapType); v3 = Overworld_MapTypeIsIndoors(gMapHeader.mapType); ClearTempFieldEventData(); @@ -637,7 +643,7 @@ void sub_8053994(u32 a1) if (v2) FlagClear(SYS_USE_FLASH); SetDefaultFlashLevel(); - sav1_reset_battle_music_maybe(); + Overworld_ClearSavedMusic(); mapheader_run_script_with_tag_x3(); UpdateLocationHistoryForRoamer(); RoamerMoveToOtherLocationSet(); @@ -691,7 +697,7 @@ u8 sub_8053B00(struct UnkPlayerStruct *playerStruct, u16 a2, u8 a3) return 16; if (MetatileBehavior_IsSurfableWaterOrUnderwater(a2) == 1) return 8; - if (Overworld_IsBikeAllowedOnCurrentMap() != TRUE) + if (Overworld_IsBikingAllowed() != TRUE) return 1; if (playerStruct->player_field_0 == 2) return 2; @@ -729,7 +735,7 @@ u16 cur_mapdata_block_role_at_screen_center_acc_to_sav1(void) return MapGridGetMetatileBehaviorAt(gSaveBlock1.pos.x + 7, gSaveBlock1.pos.y + 7); } -bool32 Overworld_IsBikeAllowedOnCurrentMap(void) +bool32 Overworld_IsBikingAllowed(void) { // is player in cycling road entrance? if (gSaveBlock1.location.mapGroup == MAP_GROUP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE @@ -830,10 +836,11 @@ static u16 GetLocationMusic(struct WarpData *warp) return Overworld_GetMapHeaderByGroupAndId(warp->mapGroup, warp->mapNum)->music; } -u16 sav1_map_get_music(void) +u16 GetCurrLocationDefaultMusic(void) { u16 music; + // Play the desert music only when the sandstorm is active on Route 111. if (gSaveBlock1.location.mapGroup == MAP_GROUP_ROUTE111 && gSaveBlock1.location.mapNum == MAP_ID_ROUTE111 && GetSav1Weather() == 8) @@ -853,9 +860,9 @@ u16 sav1_map_get_music(void) } } -u16 warp1_target_get_music(void) +u16 GetWarpDestinationMusic(void) { - u16 music = GetLocationMusic(&gUnknown_020297F8); + u16 music = GetLocationMusic(&gWarpDestination); if (music != 0x7FFF) { return music; @@ -870,19 +877,19 @@ u16 warp1_target_get_music(void) } } -void call_map_music_set_to_zero(void) +void Overworld_ResetMapMusic(void) { ResetMapMusic(); } -void sub_8053E90(void) +void Overworld_PlaySpecialMapMusic(void) { - u16 music = sav1_map_get_music(); + u16 music = GetCurrLocationDefaultMusic(); if (music != LEGENDARY_MUSIC) { - if (gSaveBlock1.battleMusic) - music = gSaveBlock1.battleMusic; + if (gSaveBlock1.savedMusic) + music = gSaveBlock1.savedMusic; else if (Overworld_GetMapTypeOfSaveblockLocation() == MAP_TYPE_UNDERWATER) music = BGM_DEEPDEEP; else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) @@ -893,21 +900,21 @@ void sub_8053E90(void) PlayNewMapMusic(music); } -void sav1_set_battle_music_maybe(u16 songNum) +void Overworld_SetSavedMusic(u16 songNum) { - gSaveBlock1.battleMusic = songNum; + gSaveBlock1.savedMusic = songNum; } -void sav1_reset_battle_music_maybe(void) +void Overworld_ClearSavedMusic(void) { - gSaveBlock1.battleMusic = 0; + gSaveBlock1.savedMusic = 0; } void sub_8053F0C(void) { if (FlagGet(SPECIAL_FLAG_1) != TRUE) { - u16 newMusic = warp1_target_get_music(); + u16 newMusic = GetWarpDestinationMusic(); u16 currentMusic = GetCurrentMapMusic(); if (newMusic != LEGENDARY_MUSIC) { @@ -926,11 +933,11 @@ void sub_8053F0C(void) } } -void sub_8053F84(void) +void Overworld_ChangeMusicToDefault(void) { u16 currentMusic = GetCurrentMapMusic(); - if (currentMusic != sav1_map_get_music()) - FadeOutAndPlayNewMapMusic(sav1_map_get_music(), 8); + if (currentMusic != GetCurrLocationDefaultMusic()) + FadeOutAndPlayNewMapMusic(GetCurrLocationDefaultMusic(), 8); } void Overworld_ChangeMusicTo(u16 newMusic) @@ -951,7 +958,7 @@ u8 GetMapMusicFadeoutSpeed(void) void sub_8053FF8(void) { - u16 music = warp1_target_get_music(); + u16 music = GetWarpDestinationMusic(); if (FlagGet(SPECIAL_FLAG_1) != TRUE && music != GetCurrentMapMusic()) { u8 speed = GetMapMusicFadeoutSpeed(); @@ -964,7 +971,7 @@ bool8 sub_8054034(void) return IsNotWaitingForBGMStop(); } -void sub_8054044(void) +void Overworld_FadeOutMapMusic(void) { FadeOutMapMusic(4); } @@ -972,14 +979,16 @@ void sub_8054044(void) static void PlayAmbientCry(void) { s16 x, y; + s8 pan; + s8 volume; + PlayerGetDestCoords(&x, &y); - if (sIsAmbientCryWaterMon != TRUE - || MetatileBehavior_IsSurfableWaterOrUnderwater(MapGridGetMetatileBehaviorAt(x, y))) - { - s8 pan = (Random() % 88) + 212; - s8 volume = (Random() % 30) + 50; - PlayCry2(sAmbientCrySpecies, pan, volume, 1); - } + if (sIsAmbientCryWaterMon == TRUE + && !MetatileBehavior_IsSurfableWaterOrUnderwater(MapGridGetMetatileBehaviorAt(x, y))) + return; + pan = (Random() % 88) + 212; + volume = (Random() % 30) + 50; + PlayCry2(sAmbientCrySpecies, pan, volume, 1); } void UpdateAmbientCry(s16 *state, u16 *delayCounter) @@ -1149,6 +1158,7 @@ void OverworldBasic(void) sub_8072EDC(); } +// This CB2 is used when starting void CB2_OverworldBasic(void) { OverworldBasic(); @@ -1176,7 +1186,7 @@ void sub_80543DC(u16 (*a1)(u32)) void sub_80543E8(void) { - if (gFieldCallback) + if (gFieldCallback != NULL) gFieldCallback(); else mapldr_default(); @@ -1977,27 +1987,27 @@ void sub_8055280(u16 a1) u16 sub_80552B0(u32 a1) { - if (gMain.heldKeys & 0x40) + if (gMain.heldKeys & DPAD_UP) { return 19; } - else if (gMain.heldKeys & 0x80) + else if (gMain.heldKeys & DPAD_DOWN) { return 18; } - else if (gMain.heldKeys & 0x20) + else if (gMain.heldKeys & DPAD_LEFT) { return 20; } - else if (gMain.heldKeys & 0x10) + else if (gMain.heldKeys & DPAD_RIGHT) { return 21; } - else if (gMain.newKeys & 8) + else if (gMain.newKeys & START_BUTTON) { return 24; } - else if (gMain.newKeys & 1) + else if (gMain.newKeys & A_BUTTON) { return 25; } diff --git a/src/field/party_menu.c b/src/field/party_menu.c new file mode 100644 index 000000000..7a519d737 --- /dev/null +++ b/src/field/party_menu.c @@ -0,0 +1,5651 @@ +#include "global.h" +#include "party_menu.h" +#include "battle.h" +#include "battle_interface.h" +#include "battle_party_menu.h" +#include "choose_party.h" +#include "data2.h" +#include "decompress.h" +#include "event_data.h" +#include "evolution_scene.h" +#include "item.h" +#include "item_use.h" +#include "item_menu.h" +#include "items.h" +#include "mail_data.h" +#include "main.h" +#include "menu.h" +#include "menu_helpers.h" +#include "moves.h" +#include "palette.h" +#include "pokemon.h" +#include "pokemon_icon.h" +#include "pokemon_item_effect.h" +#include "pokemon_menu.h" +#include "pokemon_summary_screen.h" +#include "rom_8077ABC.h" +#include "rom_8094928.h" +#include "script_pokemon_80F9.h" +#include "songs.h" +#include "sound.h" +#include "species.h" +#include "sprite.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "unknown_task.h" +#include "util.h" + +struct Coords8 +{ + u8 x; + u8 y; +}; + +struct PartyMenuWindowCoords +{ + u8 left; + u8 top; + u8 right; + u8 bottom; +}; + +struct PartyMonTextSettingsStruct +{ + u8 xOffset; + u8 yOffset; + const u16 *oamSettings; +}; + +struct PartyMenuHandlersStruct +{ + /*0x0*/TaskFunc menuHandler; + /*0x4*/bool8 (*menuSetup)(void); + /*0x8*/u8 initialPromptTextId; // element in PartyMenuPromptTexts +}; + +static void nullsub_12(u8 monIndex, struct Pokemon *pokemon); +static void TryPrintPartyMenuMonNickname(u8 monIndex, struct Pokemon *pokemon); +static void PartyMenuTryPrintHP(u8 monIndex, struct Pokemon *pokemon); +static void sub_806D05C(u8 taskId); +static void sub_806D15C(u8 taskId); +static void sub_806D198(u8 taskId); +static void sub_806E884(u8 taskId); +static void sub_8070D90(u8 taskId); +static void sub_806D5B8(u8 taskId); +static void sub_806D014(u8 taskId); +static void sub_806D118(u8 taskId); +static void CB2_InitPartyMenu(void); +static void ReDrawPartyMonBackgrounds(void); +static void sub_806BA94(s16 a, u16 b, u8 c, u8 d); +static void sub_806B9A4(s16 a, u16 b, u8 c); +static void sub_806CA18(u8 taskId, u8 b); +static void ChangeDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed); +static void ChangeDefaultPartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed); +static void ChangeLinkDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed); +static void UpdateMonIconFrame_806DA0C(struct Sprite *sprite); +static void UpdateMonIconFrame_806DA38(struct Sprite *sprite); +static void UpdateMonIconFrame_806DA44(u8 taskId, u8 monIndex, u8 c); +static u8 sub_806CA00(u8 taskId); +static void SpriteCB_sub_806D37C(struct Sprite *sprite); +static u8 GetMonIconSpriteId(u8 taskId, u8 monIndex); +static void SpriteCB_UpdateHeldItemIconPosition(struct Sprite *sprite); +static void ItemUseMoveMenu_HandleMoveSelection(u8 taskId); +static void ItemUseMoveMenu_HandleCancel(u8 taskId); +static bool8 SetupDefaultPartyMenu(void); +static void sub_806B4A8(void); +static void VBlankCB_PartyMenu(void); +static bool8 LoadPartyMenuGraphics(u8 a); +static void sub_806BF24(const u8 *a, u8 monIndex, u8 c, u8 d); +static void sub_806BB9C(u8 a); +static void sub_806BBEC(u8 a); + +const u16 TMHMMoves[] = { + MOVE_FOCUS_PUNCH, + MOVE_DRAGON_CLAW, + MOVE_WATER_PULSE, + MOVE_CALM_MIND, + MOVE_ROAR, + MOVE_TOXIC, + MOVE_HAIL, + MOVE_BULK_UP, + MOVE_BULLET_SEED, + MOVE_HIDDEN_POWER, + MOVE_SUNNY_DAY, + MOVE_TAUNT, + MOVE_ICE_BEAM, + MOVE_BLIZZARD, + MOVE_HYPER_BEAM, + MOVE_LIGHT_SCREEN, + MOVE_PROTECT, + MOVE_RAIN_DANCE, + MOVE_GIGA_DRAIN, + MOVE_SAFEGUARD, + MOVE_FRUSTRATION, + MOVE_SOLAR_BEAM, + MOVE_IRON_TAIL, + MOVE_THUNDERBOLT, + MOVE_THUNDER, + MOVE_EARTHQUAKE, + MOVE_RETURN, + MOVE_DIG, + MOVE_PSYCHIC, + MOVE_SHADOW_BALL, + MOVE_BRICK_BREAK, + MOVE_DOUBLE_TEAM, + MOVE_REFLECT, + MOVE_SHOCK_WAVE, + MOVE_FLAMETHROWER, + MOVE_SLUDGE_BOMB, + MOVE_SANDSTORM, + MOVE_FIRE_BLAST, + MOVE_ROCK_TOMB, + MOVE_AERIAL_ACE, + MOVE_TORMENT, + MOVE_FACADE, + MOVE_SECRET_POWER, + MOVE_REST, + MOVE_ATTRACT, + MOVE_THIEF, + MOVE_STEEL_WING, + MOVE_SKILL_SWAP, + MOVE_SNATCH, + MOVE_OVERHEAT, + MOVE_CUT, + MOVE_FLY, + MOVE_SURF, + MOVE_STRENGTH, + MOVE_FLASH, + MOVE_ROCK_SMASH, + MOVE_WATERFALL, + MOVE_DIVE, +}; + +//FIXME +//const u8 *unrefTileBuffer = gTileBuffer; +asm(".4byte gTileBuffer\n"); + +static const u8 MenuGfx_HoldIcons[] = INCBIN_U8("graphics/interface/hold_icons.4bpp"); +static const u16 MenuPal_HoldIcons[] = INCBIN_U16("graphics/interface/hold_icons.gbapal"); + +static const struct SpriteSheet HeldItemsSpriteSheet = { + MenuGfx_HoldIcons, + sizeof MenuGfx_HoldIcons, + 0xd750 +}; + +static const struct SpritePalette HeldItemsPalette = { + MenuPal_HoldIcons, + 0xd750 +}; + +static const struct OamData gOamData_83765EC = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd gSpriteAnim_83765F4[] = { + ANIMCMD_FRAME(0, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83765FC[] = { + ANIMCMD_FRAME(1, 1), + ANIMCMD_END +}; + +static const union AnimCmd *const gSpriteAnimTable_8376604[] = { + gSpriteAnim_83765F4, + gSpriteAnim_83765FC, +}; + +static const struct SpriteTemplate gSpriteTemplate_837660C = { + 55120, + 55120, + &gOamData_83765EC, + gSpriteAnimTable_8376604, + NULL, + gDummySpriteAffineAnimTable, + SpriteCB_UpdateHeldItemIconPosition +}; + +// Texts that can be displayed in the bottom of the party menu. +static const u8 *const PartyMenuPromptTexts[] = { + OtherText_ChoosePoke, + OtherText_MovePokeTo, + OtherText_TeachWhat, + OtherText_UseWhat, + OtherText_GiveWhat, + OtherText_DoWhat, + OtherText_NothingToCut, + OtherText_CantSurf, + OtherText_AlreadySurfing, + OtherText_CantUseThatHere, + OtherText_RestoreWhatMove, + OtherText_BoostPP, + gOtherText_CancelWithTerminator, + OtherText_DoWhatWithItem, + OtherText_NoPokeForBattle, + OtherText_ChoosePoke2, + OtherText_NotEnoughHP, + OtherText_ThreePokeNeeded, + OtherText_PokeCantBeSame, + OtherText_NoIdenticalHoldItems, + OtherText_TeachWhichPoke, +}; + +static const struct Coords8 gUnknown_08376678[8][6] = { + {{16, 40}, {104, 18}, {104, 42}, {104, 66}, {104, 90}, {104, 114}}, // PARTY_MENU_TYPE_STANDARD + {{16, 24}, { 16, 80}, {104, 18}, {104, 50}, {104, 82}, {104, 114}}, // PARTY_MENU_TYPE_BATTLE + {{16, 24}, { 16, 80}, {104, 26}, {104, 50}, {104, 82}, {104, 106}}, // PARTY_MENU_TYPE_CONTEST + {{16, 24}, {104, 26}, {104, 50}, { 16, 80}, {104, 82}, {104, 106}}, // PARTY_MENU_TYPE_IN_GAME_TRADE + {{ 5, 4}, { 16, 1}, { 16, 4}, { 16, 7}, { 16, 10}, { 16, 13}}, // PARTY_MENU_TYPE_BATTLE_TOWER + {{ 5, 2}, { 5, 9}, { 16, 1}, { 16, 5}, { 16, 9}, { 16, 13}}, // PARTY_MENU_TYPE_LINK_MULTI_BATTLE + {{ 5, 2}, { 5, 9}, { 16, 2}, { 16, 5}, { 16, 9}, { 16, 12}}, // PARTY_MENU_TYPE_DAYCARE + {{ 5, 2}, { 16, 2}, { 16, 5}, { 5, 9}, { 16, 9}, { 16, 12}}, // PARTY_MENU_TYPE_MOVE_TUTOR +}; + +static const struct Coords8 gUnknown_08376738[12][6] = { + {{6, 5}, {17, 2}, {17, 5}, {17, 8}, {17, 11}, {17, 14}}, + {{6, 3}, { 6, 10}, {17, 2}, {17, 6}, {17, 10}, {17, 14}}, + {{6, 3}, { 6, 10}, {17, 3}, {17, 6}, {17, 10}, {17, 13}}, + {{6, 3}, {17, 3}, {17, 6}, { 6, 10}, {17, 10}, {17, 13}}, + {{3, 7}, {22, 2}, {22, 5}, {22, 8}, {22, 11}, {22, 14}}, + {{3, 5}, { 3, 12}, {22, 2}, {22, 6}, {22, 10}, {22, 14}}, + {{3, 5}, { 3, 12}, {22, 3}, {22, 6}, {22, 10}, {22, 13}}, + {{3, 5}, {22, 3}, {22, 6}, { 3, 12}, {22, 10}, {22, 13}}, + {{7, 7}, {26, 2}, {26, 5}, {26, 8}, {26, 11}, {26, 14}}, + {{7, 5}, { 7, 12}, {26, 2}, {26, 6}, {26, 10}, {26, 14}}, + {{7, 5}, { 7, 12}, {26, 3}, {26, 6}, {26, 10}, {26, 13}}, + {{7, 5}, {26, 3}, {26, 6}, { 7, 12}, {26, 10}, {26, 13}}, +}; + +static u16 *const gUnknown_08376858[4][6] = { + {(u16*)(BG_VRAM + 0xF1C8), (u16*)(BG_VRAM + 0xF0AE), (u16*)(BG_VRAM + 0xF16E), (u16*)(BG_VRAM + 0xF22E), (u16*)(BG_VRAM + 0xF2EE), (u16*)(BG_VRAM + 0xF3AE)}, // PARTY_MENU_STANDARD + {(u16*)(BG_VRAM + 0xF148), (u16*)(BG_VRAM + 0xF308), (u16*)(BG_VRAM + 0xF0AE), (u16*)(BG_VRAM + 0xF1AE), (u16*)(BG_VRAM + 0xF2AE), (u16*)(BG_VRAM + 0xF3AE)}, // PARTY_MENU_LAYOUT_DOUBLE_BATTLE + {(u16*)(BG_VRAM + 0xF148), (u16*)(BG_VRAM + 0xF308), (u16*)(BG_VRAM + 0xF0EE), (u16*)(BG_VRAM + 0xF1AE), (u16*)(BG_VRAM + 0xF2AE), (u16*)(BG_VRAM + 0xF36E)}, // PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE + {(u16*)(BG_VRAM + 0xF148), (u16*)(BG_VRAM + 0xF0EE), (u16*)(BG_VRAM + 0xF1AE), (u16*)(BG_VRAM + 0xF308), (u16*)(BG_VRAM + 0xF2AE), (u16*)(BG_VRAM + 0xF36E)}, // PARTY_MENU_LAYOUT_MULTI_BATTLE +}; + +static const struct Coords8 gUnknown_083768B8[3][8] = { + {{8, 44}, {92, 22}, {92, 46}, {92, 70}, {92, 94}, {92, 118}, {196, 136}, {196, 152}}, // PARTY_MENU_LAYOUT_STANDARD + {{8, 28}, { 8, 84}, {92, 22}, {92, 54}, {92, 86}, {92, 118}, {196, 136}, {196, 152}}, // PARTY_MENU_LAYOUT_DOUBLE_BATTLE + {{8, 28}, { 8, 84}, {92, 30}, {92, 54}, {92, 86}, {92, 110}, {196, 136}, {196, 152}}, // PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE +}; + +static u16 *const gUnknown_08376918[2][PARTY_SIZE] = { + {(u16*)(BG_VRAM + 0xF1C6), (u16*)(BG_VRAM + 0xF06C), (u16*)(BG_VRAM + 0xF12C), (u16*)(BG_VRAM + 0xF1EC), (u16*)(BG_VRAM + 0xF2AC), (u16*)(BG_VRAM + 0xF36C)}, + {(u16*)(BG_VRAM + 0xF148), (u16*)(BG_VRAM + 0xF308), (u16*)(BG_VRAM + 0xF0AE), (u16*)(BG_VRAM + 0xF1AE), (u16*)(BG_VRAM + 0xF2AE), (u16*)(BG_VRAM + 0xF3AE)}, +}; + +static const struct PartyMenuWindowCoords gUnknown_08376948[2][6] = { + {{2, 4, 10, 9}, {16, 1, 29, 3}, {16, 4, 29, 6}, {16, 7, 29, 9}, {16, 10, 29, 12}, {16, 13, 29, 15}}, + {{2, 2, 10, 7}, { 2, 9, 10, 14}, {16, 1, 29, 3}, {16, 5, 29, 7}, {16, 9, 29, 11}, {16, 13, 29, 15}}, +}; + +static const struct PartyMenuWindowCoords gUnknown_08376978[2][6] = { + {{2, 7, 10, 9}, {21, 1, 29, 3}, {21, 4, 29, 6}, {21, 7, 29, 9}, {21, 10, 29, 12}, {21, 13, 29, 15}}, + {{2, 2, 10, 7}, { 2, 9, 10, 14}, {16, 1, 29, 3}, {16, 5, 29, 7}, {16, 9, 29, 11}, {16, 13, 29, 15}}, +}; + +// This is actually a 2x6x2 array, but the code reads it as a flat array. +static const u8 gUnknown_083769A8[] = { + 0, 3, 11, 1, 11, 4, 11, 7, 11, 10, 11, 13, + 0, 1, 0, 8, 11, 1, 11, 5, 11, 9, 11, 13, // Double battle +}; + +// This is actually a 2x6x2 array, but the code reads it as a flat array. +//FIXME: sub_806B908() accesses this data via gUnknown_083769A8 (directly above this). This means these +// two arrays might be a struct, rather than separate arrays. +static const u8 gUnknown_083769C0[] = { + 0, 1, 0, 8, 11, 2, 11, 5, 11, 9, 11, 12, + 0, 1, 0, 8, 11, 2, 11, 5, 11, 9, 11, 12, // Double battle +}; + +static const u8 gUnknown_083769D8[] = { + 0x24,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x27, + 0x34,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x37, + 0x34,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x37, + 0x34,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x37, + 0x44,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x47, + 0x44,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x47, + 0x54,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x57, +}; + +static const u8 gUnknown_08376A25[] = { + 0x50,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x51,0x53, + 0x60,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x63, + 0x70,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x71,0x73, +}; + +static const u8 gUnknown_08376A5E[] = { + 0x20,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x23, + 0x30,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x33, + 0x40,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x43, +}; + +static const u8 gUnusedData_08376A97[] = { + 0x0C,0x0D,0x0E,0x0F,0x00,0x01,0x02,0x03,0x04,0x05,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x0F,0x06,0x05,0x01,0x07, + 0x08,0x09,0x0F,0x16,0x15,0x11,0x17,0x18,0x19,0x0F,0x09, + 0x0A,0x0B,0x05,0x0C,0x0F,0x0F,0x19,0x1A,0x1B,0x15,0x1C, + 0x0F,0x0F,0x0D,0x0B,0x05,0x0C,0x0F,0x0F,0x0F,0x1D,0x1B, + 0x15,0x1C,0x0F,0x0F,0x0F,0x06,0x05,0x0B,0x05,0x0C,0x0F, + 0x0F,0x16,0x15,0x1B,0x15,0x1C,0x0F,0x0F,0x0F,0x0F,0x20, + 0x0C,0x09,0x0F,0x0F,0x0F,0x1F,0x30,0x1C,0x19,0x0F,0x0F, + 0x0F,0x25,0x0F,0x22,0x24,0x0F,0x0F,0x0F,0x35,0x41,0x32, + 0x34,0x0F,0x0F,0x0F,0x26,0x0F,0x23,0x0E,0x0F,0x0F,0x0F, + 0x36,0x43,0x33,0x1E,0x0F,0x0F,0x27,0x28,0x29,0x03,0x2A, + 0x0F,0x0F,0x37,0x38,0x39,0x13,0x3A,0x0F,0x0F,0x27,0x28, + 0x29,0x03,0x04,0x05,0x0F,0x37,0x38,0x39,0x13,0x14,0x15, + 0x0F,0x2B,0x2C,0x02,0x28,0x29,0x2D,0x21,0x3B,0x3C,0x12, + 0x38,0x39,0x3D,0x31,0x2B,0x2C,0x02,0x28,0x29,0x08,0x09, + 0x3B,0x3C,0x12,0x38,0x39,0x18,0x19,0x2E,0x2F,0x2B,0x2C, + 0x02,0x27,0x2D,0x3E,0x3F,0x3B,0x3C,0x12,0x45,0x3D, +}; + +static const TaskFunc gUnknown_08376B54[] = { + ItemUseMoveMenu_HandleMoveSelection, + ItemUseMoveMenu_HandleCancel, +}; + +#define PartyMonOAMSettings(x, y, palette, shape, size, priority, tileOffset) \ + ((shape) << 14) | (y), \ + ((size) << 14) | (x), \ + ((palette) << 12) | ((priority) << 10) | (tileOffset) + +static const u16 PartyMonOAMSettings_LeftColumn[] = { + PartyMonOAMSettings(24, 0, 15, ST_OAM_H_RECTANGLE, 1, 1, 0), + PartyMonOAMSettings(56, 0, 15, ST_OAM_H_RECTANGLE, 1, 1, 4), + PartyMonOAMSettings(24, 8, 15, ST_OAM_H_RECTANGLE, 1, 1, 8), + PartyMonOAMSettings(56, 8, 15, ST_OAM_H_RECTANGLE, 1, 1, 12), + PartyMonOAMSettings(32, 16, 15, ST_OAM_H_RECTANGLE, 1, 1, 16), + PartyMonOAMSettings(37, 32, 15, ST_OAM_H_RECTANGLE, 1, 1, 24), + PartyMonOAMSettings(69, 32, 15, ST_OAM_H_RECTANGLE, 1, 1, 28), + 0xFFFF, +}; + +static const u16 PartyMonOAMSettings_RightColumn[] = { + PartyMonOAMSettings( 24, 0, 15, ST_OAM_H_RECTANGLE, 1, 1, 0), + PartyMonOAMSettings( 56, 0, 15, ST_OAM_H_RECTANGLE, 1, 1, 4), + PartyMonOAMSettings( 24, 8, 15, ST_OAM_H_RECTANGLE, 1, 1, 8), + PartyMonOAMSettings( 56, 8, 15, ST_OAM_H_RECTANGLE, 1, 1, 12), + PartyMonOAMSettings( 32, 16, 15, ST_OAM_H_RECTANGLE, 1, 1, 16), + PartyMonOAMSettings(101, 16, 15, ST_OAM_H_RECTANGLE, 1, 1, 24), + PartyMonOAMSettings(133, 16, 15, ST_OAM_H_RECTANGLE, 1, 1, 28), + 0xFFFF, +}; + +// Controls where and how the mons' text appears in the party menu screen (nickname, HP, and level). +static struct PartyMonTextSettingsStruct const PartyMonTextSettings[4][6] = { + { // PARTY_MENU_LAYOUT_STANDARD + { 1, 4, PartyMonOAMSettings_LeftColumn}, + {12, 1, PartyMonOAMSettings_RightColumn}, + {12, 4, PartyMonOAMSettings_RightColumn}, + {12, 7, PartyMonOAMSettings_RightColumn}, + {12, 10, PartyMonOAMSettings_RightColumn}, + {12, 13, PartyMonOAMSettings_RightColumn}, + }, + { // PARTY_MENU_LAYOUT_DOUBLE_BATTLE + { 1, 2, PartyMonOAMSettings_LeftColumn}, + { 1, 9, PartyMonOAMSettings_LeftColumn}, + {12, 1, PartyMonOAMSettings_RightColumn}, + {12, 5, PartyMonOAMSettings_RightColumn}, + {12, 9, PartyMonOAMSettings_RightColumn}, + {12, 13, PartyMonOAMSettings_RightColumn}, + }, + { // PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE + { 1, 2, PartyMonOAMSettings_LeftColumn}, + { 1, 9, PartyMonOAMSettings_LeftColumn}, + {12, 2, PartyMonOAMSettings_RightColumn}, + {12, 5, PartyMonOAMSettings_RightColumn}, + {12, 9, PartyMonOAMSettings_RightColumn}, + {12, 12, PartyMonOAMSettings_RightColumn}, + }, + { // PARTY_MENU_LAYOUT_MULTI_BATTLE + { 1, 2, PartyMonOAMSettings_LeftColumn}, + {12, 2, PartyMonOAMSettings_RightColumn}, + {12, 5, PartyMonOAMSettings_RightColumn}, + { 1, 9, PartyMonOAMSettings_LeftColumn}, + {12, 9, PartyMonOAMSettings_RightColumn}, + {12, 12, PartyMonOAMSettings_RightColumn}, + }, +}; + +static const struct PartyMenuHandlersStruct PartyMenuHandlers[] = { + {HandleDefaultPartyMenu, SetupDefaultPartyMenu, 0}, // PARTY_MENU_TYPE_STANDARD + {HandleBattlePartyMenu, SetUpBattlePartyMenu, 0}, // PARTY_MENU_TYPE_BATTLE + {HandleSelectPartyMenu, SetupContestPartyMenu, 0}, // PARTY_MENU_TYPE_CONTEST + {HandleSelectPartyMenu, SetupDefaultPartyMenu, 0}, // PARTY_MENU_TYPE_IN_GAME_TRADE + {HandleBattleTowerPartyMenu, SetupBattleTowerPartyMenu, 0}, // PARTY_MENU_TYPE_BATTLE_TOWER + {HandleLinkMultiBattlePartyMenu, SetupLinkMultiBattlePartyMenu, 0xFF}, // PARTY_MENU_TYPE_LINK_MULTI_BATTLE + {HandleDaycarePartyMenu, SetupDefaultPartyMenu, 0x0F}, // PARTY_MENU_TYPE_DAYCARE + {HandleMoveTutorPartyMenu, SetupMoveTutorPartyMenu, 0}, // PARTY_MENU_TYPE_MOVE_TUTOR +}; + +static const u16 gUnknown_08376CD4[] = { + 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, +}; + +static const u16 gUnknown_08376CEC[] = { + 0x2A, 0x0B, 0x0C, 0x0D, 0x0E, 0x2F, + 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, +}; + +static const u8 *const StatNames[] = { + gOtherText_HP, + gOtherText_Attack, + gOtherText_Defense, + gOtherText_SpAtk, + gOtherText_SpDef, + gOtherText_Speed, +}; + +static const u8 StatDataTypes[] = { + MON_DATA_MAX_HP, + MON_DATA_ATK, + MON_DATA_DEF, + MON_DATA_SPATK, + MON_DATA_SPDEF, + MON_DATA_SPEED, +}; + +struct Unk201C000 +{ + /*0x00*/ struct Pokemon *pokemon; + /*0x04*/ u8 unk4; + /*0x05*/ u8 unk5; + /*0x06*/ u16 unk6; + /*0x08*/ u16 unk8; + /*0x0A*/ u8 pad_0A[2]; + /*0x0C*/ s32 unkC; + /*0x10*/ TaskFunc unk10; + /*0x14*/ TaskFunc unk14; +}; + +struct Unk201FE00 +{ + u8 unkE00; // not sure if this is an array or struct, or how big it is + u8 unkE01; + u8 unkE02; +}; + +#define ewram1C000 (*(struct Unk201C000 *)(ewram + 0x1C000)) +#define ewram1FE00 (*(struct Unk201FE00 *)(ewram + 0x1FE00)) + +extern u16 gBattleTypeFlags; +extern u8 gTileBuffer[]; +extern u8 gUnknown_0202E8F4; +extern u8 gUnknown_0202E8F6; +extern u16 gUnknown_0202E8F8; +extern u8 gPartyMenuType; +extern u8 gLastFieldPokeMenuOpened; +extern u8 gPlayerPartyCount; +extern s32 gBattleMoveDamage; +extern u16 gMoveToLearn; + +extern u16 gUnknown_08E9A300[]; +extern struct Coords8 const gUnknown_08376738[12][6]; +extern const u8 gUnknown_083769C0[]; +extern u8 gUnknown_02039460[]; +extern struct Window gUnknown_03004210; + +extern const u8 gPartyMenuMisc_Gfx[]; +extern const u8 gPartyMenuMisc_Tilemap[]; +extern const u8 gPartyMenuMisc_Pal[]; +extern const u8 gFontDefaultPalette[]; +extern const u8 gPartyMenuHpBar_Gfx[]; +extern const u8 gPartyMenuOrderText_Gfx[]; +extern const u8 gStatusGfx_Icons[]; +extern const u8 gStatusPal_Icons[]; + +#if ENGLISH +#define WINDOW_LEFT (3) +#define WINDOW_RIGHT (26) +#elif GERMAN +#define WINDOW_LEFT (0) +#define WINDOW_RIGHT (29) +#endif + + +#ifdef NONMATCHING +// Main handler for the party menu. +void CB2_PartyMenuMain(void) +{ + const struct PartyMonTextSettingsStruct *textSettings; + s32 i; + + AnimateSprites(); + BuildOamBuffer(); + + textSettings = PartyMonTextSettings[gPartyMenuType]; + for (i = 0; i < PARTY_SIZE; i++) + { + // Draw mon name, level, and hp sprites + DrawPartyMenuMonText( + textSettings[i].xOffset * 8, + textSettings[i].yOffset * 8, + textSettings[i].oamSettings, + 0, + (i << 5) | 0x200); + } + + RunTasks(); + UpdatePaletteFade(); +} +#else +__attribute__((naked)) +void CB2_PartyMenuMain(void) +{ + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + sub sp, 0x4\n\ + bl AnimateSprites\n\ + bl BuildOamBuffer\n\ + ldr r0, _0806AF2C @ =gPartyMenuType\n\ + ldrb r1, [r0]\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + lsls r0, 4\n\ + ldr r1, _0806AF30 @ =PartyMonTextSettings\n\ + adds r5, r0, r1\n\ + movs r6, 0\n\ +_0806AEF8:\n\ + ldrb r0, [r5]\n\ + lsls r0, 3\n\ + ldrb r1, [r5, 0x1]\n\ + lsls r1, 3\n\ + ldr r2, [r5, 0x4]\n\ + lsls r3, r6, 5\n\ + movs r4, 0x80\n\ + lsls r4, 2\n\ + orrs r3, r4\n\ + str r3, [sp]\n\ + movs r3, 0\n\ + bl DrawPartyMenuMonText\n\ + adds r5, 0x8\n\ + adds r6, 0x1\n\ + cmp r6, 0x5\n\ + ble _0806AEF8\n\ + bl RunTasks\n\ + bl UpdatePaletteFade\n\ + add sp, 0x4\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0806AF2C: .4byte gPartyMenuType\n\ +_0806AF30: .4byte PartyMonTextSettings\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +void VBlankCB_PartyMenu(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + ReDrawPartyMonBackgrounds(); +} + +void SetPartyMenuSettings(u8 menuType, u8 battleTypeFlags, TaskFunc menuHandlerFunc, u8 textId) +{ + if (battleTypeFlags != 0xFF) + { + gBattleTypeFlags = battleTypeFlags; + } + + ewram1B000.menuType = menuType; + ewram1B000.menuHandler = menuHandlerFunc; + ewram1B000.promptTextId = textId; +} + +void DoOpenPartyMenu(u8 menuType, u8 battleFlags, TaskFunc menuHandlerFunc, u8 textId) +{ + SetPartyMenuSettings(menuType, battleFlags, menuHandlerFunc, textId); + SetMainCallback2(CB2_InitPartyMenu); +} + +void OpenPartyMenu(u8 menuType, u8 battleFlags) +{ + DoOpenPartyMenu(menuType, battleFlags, PartyMenuHandlers[menuType].menuHandler, PartyMenuHandlers[menuType].initialPromptTextId); +} + +// This is a Task which is repeatedly called until it eventually returns TRUE when finished. +bool8 SetupDefaultPartyMenu(void) +{ + switch (ewram1B000_alt.setupState) + { + case 0: + if (ewram1B000_alt.monIndex < gPlayerPartyCount) { + TryCreatePartyMenuMonIcon(ewram1B000_alt.menuHandlerTaskId, ewram1B000_alt.monIndex, &gPlayerParty[ewram1B000_alt.monIndex]); + ewram1B000_alt.monIndex++; + } else { + ewram1B000_alt.monIndex = 0; + ewram1B000_alt.setupState++; + } + + break; + case 1: + LoadHeldItemIconGraphics(); + ewram1B000_alt.setupState++; + break; + case 2: + CreateHeldItemIcons_806DC34(ewram1B000_alt.menuHandlerTaskId); + ewram1B000_alt.setupState++; + break; + case 3: + if (sub_806BD58(ewram1B000_alt.menuHandlerTaskId, ewram1B000_alt.monIndex) != 1) + { + ewram1B000_alt.monIndex++; + } + else + { + ewram1B000_alt.monIndex = 0; + ewram1B000_alt.setupState++; + } + + break; + case 4: + PartyMenuPrintMonsLevelOrStatus(); + ewram1B000_alt.setupState++; + break; + case 5: + PrintPartyMenuMonNicknames(); + ewram1B000_alt.setupState++; + break; + case 6: + PartyMenuTryPrintMonsHP(); + ewram1B000_alt.setupState++; + break; + case 7: + nullsub_13(); + ewram1B000_alt.setupState++; + break; + case 8: + PartyMenuDrawHPBars(); + ewram1B000_alt.setupState++; + break; + case 9: + if (DrawPartyMonBackground(ewram1B000_alt.monIndex) == 1) + { + ewram1B000_alt.monIndex = 0; + ewram1B000_alt.setupState = 0; + return TRUE; + } + else + { + ewram1B000_alt.monIndex++; + break; + } + } + + return FALSE; +} + +bool8 InitPartyMenu(void) +{ + u8 *addr; + u32 size; + + switch (gMain.state) + { + case 0: + SetVBlankCallback(NULL); + addr = (u8 *)VRAM; + size = VRAM_SIZE; + while (1) + { + DmaFill16(3, 0, addr, 0x1000); + addr += 0x1000; + size -= 0x1000; + if (size <= 0x1000) + { + DmaFill16(3, 0, addr, size); + break; + } + } + + DmaClear32(3, OAM, OAM_SIZE); + DmaClear16(3, PLTT, PLTT_SIZE); + + gPaletteFade.bufferTransferDisabled = 1; + gMain.state++; + break; + case 1: + remove_some_task(); + gMain.state++; + break; + case 2: + sub_806B4A8(); + ewram1B000_alt.setupState = 0; + ewram1B000_alt.monIndex = 0; + ewram1B000_alt.unk268 = 0; + gMain.state++; + break; + case 3: + ResetSpriteData(); + gMain.state++; + break; + case 4: + if (ewram1B000.menuType != PARTY_MENU_TYPE_BATTLE && ewram1B000.menuType != PARTY_MENU_TYPE_LINK_MULTI_BATTLE) + { + ResetTasks(); + } + + gMain.state++; + break; + case 5: + FreeAllSpritePalettes(); + gMain.state++; + break; + case 6: + ewram1B000.menuHandlerTaskId = CreateTask(ewram1B000.menuHandler, 0); + gMain.state++; + break; + case 7: + SetUpWindowConfig(&gWindowConfig_81E6C90); + gMain.state++; + break; + case 8: + InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6C90); + MultistepInitWindowTileData(&gUnknown_03004210, 1); + gMain.state++; + break; + case 9: + if (MultistepLoadFont()) + { + ewram1B000_alt.setupState = 1; + gMain.state++; + } + break; + case 10: + if (LoadPartyMenuGraphics(ewram1B000_alt.setupState) == TRUE) + { + ewram1B000_alt.setupState = 0; + gMain.state++; + } + else + { + ewram1B000_alt.setupState++; + } + break; + case 11: + sub_809D51C(); + gMain.state++; + break; + case 12: + if (PartyMenuHandlers[ewram1B000.menuType].menuSetup() == TRUE) + { + gMain.state++; + } + break; + case 13: + MultistepInitMenuWindowBegin(&gWindowConfig_81E6CC8); + gMain.state++; + break; + case 14: + if (MultistepInitMenuWindowContinue()) + { + gMain.state++; + } + break; + case 15: + PrintPartyMenuPromptText(ewram1B000.promptTextId, 0); + gMain.state++; + break; + case 16: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + gPaletteFade.bufferTransferDisabled = 0; + gMain.state++; + break; + case 17: + SetVBlankCallback(VBlankCB_PartyMenu); + return TRUE; + } + + return FALSE; +} + +void CB2_InitPartyMenu(void) +{ + while (InitPartyMenu() != TRUE) + { + if (sub_80F9344() == TRUE) + { + return; + } + } + + if (ewram1B000.menuType != PARTY_MENU_TYPE_LINK_MULTI_BATTLE) + { + ChangePartyMenuSelection(ewram1B000.menuHandlerTaskId, 0); + } + + SetMainCallback2(CB2_PartyMenuMain); +} + +void sub_806B4A8(void) +{ + SetHBlankCallback(NULL); + REG_DISPCNT = 8000; + REG_BG0CNT = 0x1E05; + REG_BG1CNT = 0x703; + REG_BG2CNT = 0xF08; + REG_BG3CNT = 0x602; + REG_BLDCNT = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_BG3VOFS = -1; +} + +bool8 IsLinkDoubleBattle() +{ + if ((gBattleTypeFlags & BATTLE_TYPE_LINK_DOUBLE) == BATTLE_TYPE_LINK_DOUBLE) + return TRUE; + else + return FALSE; +} + +// Draws the blue rectangular regions surrounding each of the party mons. +void ReDrawPartyMonBackgrounds(void) +{ + if (ewram1B000.unk261) + { + const void *src = gBGTilemapBuffers[2]; + void *dest = (void *)(BG_VRAM + 0x3000); + DmaCopy16(3, src, dest, 0x800); + + if (ewram1B000.unk261 == 2) + { + ewram1B000.unk261 = 0; + } + } +} + +bool8 DrawPartyMonBackground(u8 monIndex) +{ + const u8 *arr; + + if (!IsDoubleBattle()) + gPartyMenuType = PARTY_MENU_LAYOUT_STANDARD; + else if (IsLinkDoubleBattle() == TRUE) + gPartyMenuType = PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE; + else + gPartyMenuType = PARTY_MENU_LAYOUT_DOUBLE_BATTLE; + + arr = &gUnknown_083769A8[gPartyMenuType * 12]; + + switch (monIndex) + { + case 0: + memset(&gBGTilemapBuffers[2], 0, 0x800); + break; + case 1: + sub_806B9A4(arr[0], arr[1], 3); + sub_806BF24(&arr[0], 0, 3, 0); + break; + case 2: + if (!IsDoubleBattle()) { + if (gPlayerPartyCount > 1) { + sub_806BA94(arr[2], arr[3], 0, 3); + sub_806BF24(&arr[2], 1, 3, 0); + } else { + sub_806BA94(arr[2], arr[3], 1, 3); + } + } else if (IsLinkDoubleBattle() == TRUE) { + sub_806B9A4(arr[2], arr[3], 4); + sub_806BF24(&arr[2], 1, 4, 0); + } else { + sub_806B9A4(arr[2], arr[3], 3); + sub_806BF24(&arr[2], 1, 3, 0); + } + + break; + case 3: + if (!IsDoubleBattle()) { + if (gPlayerPartyCount > 2) { + sub_806BA94(arr[4], arr[5], 0, 3); + sub_806BF24(&arr[4], 2, 3, 0); + } else { + sub_806BA94(arr[4], arr[5], 1, 3); + } + } else if (IsLinkDoubleBattle() == TRUE) { + if (GetMonData(&gPlayerParty[2], MON_DATA_SPECIES)) { + sub_806BA94(arr[4], arr[5], 0, 3); + sub_806BF24(&arr[4], 2, 3, 0); + } else { + sub_806BA94(arr[4], arr[5], 1, 3); + } + } else if (gPlayerPartyCount > 2) { + sub_806BA94(arr[4], arr[5], 0, 3); + sub_806BF24(&arr[4], 2, 3, 0); + } else { + sub_806BA94(arr[4], arr[5], 1, 3); + } + + break; + case 4: + if (!IsDoubleBattle()) { + if (gPlayerPartyCount > 3) { + sub_806BA94(arr[6], arr[7], 0, 3); + sub_806BF24(&arr[6], 3, 3, 0); + } else { + sub_806BA94(arr[6], arr[7], 1, 3); + } + } else if (IsLinkDoubleBattle() == TRUE) { + if (GetMonData(&gPlayerParty[3], MON_DATA_SPECIES)) { + sub_806BA94(arr[6], arr[7], 0, 3); + sub_806BF24(&arr[6], 3, 3, 0); + } else { + sub_806BA94(arr[6], arr[7], 1, 3); + } + } else if (gPlayerPartyCount > 3) { + sub_806BA94(arr[6], arr[7], 0, 3); + sub_806BF24(&arr[6], 3, 3, 0); + } else { + sub_806BA94(arr[6], arr[7], 1, 3); + } + + break; + case 5: + if (!IsDoubleBattle()) { + if (gPlayerPartyCount > 4) { + sub_806BA94(arr[8], arr[9], 0, 3); + sub_806BF24(&arr[8], 4, 3, 0); + } else { + sub_806BA94(arr[8], arr[9], 1, 3); + } + } else if (IsLinkDoubleBattle() == TRUE) { + if (GetMonData(&gPlayerParty[4], MON_DATA_SPECIES)) { + sub_806BA94(arr[8], arr[9], 0, 4); + sub_806BF24(&arr[8], 4, 4, 0); + } else { + sub_806BA94(arr[8], arr[9], 1, 4); + } + } else if (gPlayerPartyCount > 4) { + sub_806BA94(arr[8], arr[9], 0, 3); + sub_806BF24(&arr[8], 4, 3, 0); + } else { + sub_806BA94(arr[8], arr[9], 1, 3); + } + + break; + case 6: + if (!IsDoubleBattle()) { + if (gPlayerPartyCount > 5) { + sub_806BA94(arr[10], arr[11], 0, 3); + sub_806BF24(&arr[10], 5, 3, 0); + } else { + sub_806BA94(arr[10], arr[11], 1, 3); + } + } else if (IsLinkDoubleBattle() == TRUE) { + if (GetMonData(&gPlayerParty[5], MON_DATA_SPECIES)) { + sub_806BA94(arr[10], arr[11], 0, 4); + sub_806BF24(&arr[10], 5, 4, 0); + } else { + sub_806BA94(arr[10], arr[11], 1, 4); + } + } else if (gPlayerPartyCount > 5) { + sub_806BA94(arr[10], arr[11], 0, 3); + sub_806BF24(&arr[10], 5, 3, 0); + } else { + sub_806BA94(arr[10], arr[11], 1, 3); + } + + break; + case 7: + if (ewram1B000.menuType == PARTY_MENU_TYPE_BATTLE_TOWER) { + sub_806BB9C(1); + } + + sub_806BBEC(1); + break; + case 8: + ewram1B000.unk261 = 2; + return TRUE; + } + + return FALSE; +} + +#ifdef NONMATCHING +void sub_806B908(void) +{ + memset(&gBGTilemapBuffers[2], 0, 0x800); + gPartyMenuType = PARTY_MENU_LAYOUT_MULTI_BATTLE; + sub_806B9A4(gUnknown_083769C0[12], gUnknown_083769C0[13], 3); + + if (GetMonData(&gPlayerParty[1], MON_DATA_SPECIES)) + sub_806BA94(gUnknown_083769C0[16], gUnknown_083769C0[17], 0, 3); + else + sub_806BA94(gUnknown_083769C0[16], gUnknown_083769C0[17], 1, 3); + + if (GetMonData(&gPlayerParty[2], MON_DATA_SPECIES)) + sub_806BA94(gUnknown_083769C0[18], gUnknown_083769C0[19], 0, 3); + else + sub_806BA94(gUnknown_083769C0[18], gUnknown_083769C0[19], 1, 3); + + ewram1B000.unk261 = 2; +} +#else +__attribute__((naked)) +void sub_806B908(void) +{ + asm(".syntax unified\n\ + push {r4,r5,lr}\n\ + ldr r0, _0806B948 @ =gBGTilemapBuffers + 0x1000\n\ + movs r2, 0x80\n\ + lsls r2, 4\n\ + movs r1, 0\n\ + bl memset\n\ + ldr r1, _0806B94C @ =gPartyMenuType\n\ + movs r0, 0x3\n\ + strb r0, [r1]\n\ + ldr r0, _0806B950 @ =gUnknown_083769A8\n\ + adds r4, r0, 0\n\ + adds r4, 0x24\n\ + ldr r5, _0806B954 @ =gPlayerParty + 1 * 0x64\n\ + ldrb r0, [r4]\n\ + ldrb r1, [r4, 0x1]\n\ + movs r2, 0x3\n\ + bl sub_806B9A4\n\ + adds r0, r5, 0\n\ + movs r1, 0xB\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + beq _0806B958\n\ + ldrb r0, [r4, 0x4]\n\ + ldrb r1, [r4, 0x5]\n\ + movs r2, 0\n\ + movs r3, 0x3\n\ + bl sub_806BA94\n\ + b _0806B964\n\ + .align 2, 0\n\ +_0806B948: .4byte gBGTilemapBuffers + 0x1000\n\ +_0806B94C: .4byte gPartyMenuType\n\ +_0806B950: .4byte gUnknown_083769A8\n\ +_0806B954: .4byte gPlayerParty + 1 * 0x64\n\ +_0806B958:\n\ + ldrb r0, [r4, 0x4]\n\ + ldrb r1, [r4, 0x5]\n\ + movs r2, 0x1\n\ + movs r3, 0x3\n\ + bl sub_806BA94\n\ +_0806B964:\n\ + adds r0, r5, 0\n\ + adds r0, 0x64\n\ + movs r1, 0xB\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + beq _0806B980\n\ + ldrb r0, [r4, 0x6]\n\ + ldrb r1, [r4, 0x7]\n\ + movs r2, 0\n\ + movs r3, 0x3\n\ + bl sub_806BA94\n\ + b _0806B98C\n\ +_0806B980:\n\ + ldrb r0, [r4, 0x6]\n\ + ldrb r1, [r4, 0x7]\n\ + movs r2, 0x1\n\ + movs r3, 0x3\n\ + bl sub_806BA94\n\ +_0806B98C:\n\ + ldr r0, _0806B99C @ =0x0201b000\n\ + ldr r1, _0806B9A0 @ =0x00000261\n\ + adds r0, r1\n\ + movs r1, 0x2\n\ + strb r1, [r0]\n\ + pop {r4,r5}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0806B99C: .4byte 0x0201b000\n\ +_0806B9A0: .4byte 0x00000261\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +void sub_806B9A4(s16 a, u16 b, u8 c) +{ + u8 i; + u16 var1 = b * 32; + + for (i = 0; i <= 6; i++) + { + u8 j = 0; + + if (a <= 0x1F) + { + for (; j <= 10 && a + j <= 0x1F; j++) + { + if (a + j >= 0) + { + gBGTilemapBuffers[2][var1 + (i * 32) + (a + j)] = (c << 12) | gUnknown_083769D8[i * 11 + j]; + } + } + } + } +} + +void sub_806BA34(s16 a, u16 b) +{ + u8 i; + u16 var1 = b * 32; + + for (i = 0; i <= 6; i++) + { + u8 j = 0; + + if (a <= 0x1F) + { + for (; j <= 10 && a + j <= 0x1F; j++) + { + if (a + j >= 0) + { + gBGTilemapBuffers[2][var1 + (i * 32) + (a + j)] = 0; + } + } + } + } +} + +void sub_806BA94(s16 a, u16 b, u8 c, u8 d) +{ + u8 i; + const u8 *arr; + u16 var1; + + arr = gUnknown_08376A5E; + if (c == 0) + { + arr = gUnknown_08376A25; + } + + var1 = b * 32; + + + for (i = 0; i < 3; i++) + { + u8 j = 0; + + if (a <= 0x1F) + { + while (j <= 0x12 && a + j <= 0x1F) + { + if (a + j >= 0) + { + gBGTilemapBuffers[2][var1 + (i * 32) + (a + j)] = (d << 12) | arr[i * 19 + j]; + } + + j++; + } + } + } +} + +void sub_806BB3C(s16 a, u16 b) +{ + u8 i; + u16 var1 = (b * 32); + + for (i = 0; i < 3; i++) + { + u8 j = 0; + + if (a <= 0x1F) + { + for (; j <= 0x12 && a + j <= 0x1F; j++) + { + if (a + j >= 0) + { + gBGTilemapBuffers[2][var1 + (i * 32) + (a + j)] = 0; + } + } + } + } +} + +void sub_806BB9C(u8 a) +{ + u8 i; + u16 *vramPtr; + const u16 arr[12]; + + memcpy(&arr, gUnknown_08376CD4, sizeof gUnknown_08376CD4); + + vramPtr = (u16 *)(BG_VRAM + 0x3C30); + for (i = 0; i < PARTY_SIZE; i++) + { + vramPtr[i] = arr[i] + (a << 12); + vramPtr[i + 0x20] = arr[i + PARTY_SIZE] + (a << 12); + } +} + +void sub_806BBEC(u8 a) +{ + u8 i; + u16 *vramPtr; + const u16 arr[12]; + + memcpy(&arr, gUnknown_08376CEC, sizeof gUnknown_08376CEC); + + vramPtr = (u16 *)(BG_VRAM + 0x3CB0); + for (i = 0; i < PARTY_SIZE; i++) + { + vramPtr[i] = arr[i] + (a << 12); + vramPtr[i + 0x20] = arr[i + PARTY_SIZE] + (a << 12); + } +} + +#ifdef NONMATCHING +// The original THUMB is preserving r8 for seemingly no reason. Unsure how to match. +void sub_806BC3C(u8 monIndex, u8 b) +{ + u16 *vramPtr = gUnknown_08376918[IsDoubleBattle()][monIndex]; + u8 i; + u16 var1; + + for (i = 0, var1 = (b / 7) * 32; i <= PARTY_SIZE; i++) + { + u32 offset = i + var1; + vramPtr[i] = gUnknown_08E9A300[offset] + 0x10C; + vramPtr[i + 0x20] = gUnknown_08E9A300[offset + 0x20] + 0x10C; + } +} +#else +__attribute__((naked)) +void sub_806BC3C(u8 monIndex, u8 b) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + adds r4, r0, 0\n\ + adds r5, r1, 0\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + lsls r5, 24\n\ + lsrs r5, 24\n\ + ldr r6, _0806BCB0 @ =gUnknown_08376918\n\ + bl IsDoubleBattle\n\ + lsls r4, 2\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r1, r0, 1\n\ + adds r1, r0\n\ + lsls r1, 3\n\ + adds r4, r1\n\ + adds r4, r6\n\ + ldr r7, [r4]\n\ + movs r6, 0\n\ + adds r0, r5, 0\n\ + movs r1, 0x7\n\ + bl __udivsi3\n\ + lsls r0, 24\n\ + lsrs r4, r0, 19\n\ + ldr r5, _0806BCB4 @ =gUnknown_08E9A300\n\ + movs r0, 0x86\n\ + lsls r0, 1\n\ + adds r3, r0, 0\n\ +_0806BC7C:\n\ + adds r1, r6, r4\n\ + lsls r2, r6, 1\n\ + adds r2, r7\n\ + lsls r0, r1, 1\n\ + adds r0, r5\n\ + ldrh r0, [r0]\n\ + adds r0, r3, r0\n\ + strh r0, [r2]\n\ + adds r2, 0x40\n\ + adds r1, 0x20\n\ + lsls r1, 1\n\ + adds r1, r5\n\ + ldrh r1, [r1]\n\ + adds r0, r3, r1\n\ + strh r0, [r2]\n\ + adds r0, r6, 0x1\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + cmp r6, 0x6\n\ + bls _0806BC7C\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0806BCB0: .4byte gUnknown_08376918\n\ +_0806BCB4: .4byte gUnknown_08E9A300\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +void unref_sub_806BCB8(u8 a) +{ + u8 i; + + for (i = 0; i < gPlayerPartyCount; i++) + { + sub_806BC3C(i, a); + } +} + +// This is ultimately unreferenced, since it's caller is unreferenced. +void sub_806BCE8() +{ + u8 i; + + for (i = 0; i < gPlayerPartyCount; i++) + { + if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) + { + u8 gender = GetMonGender(&gPlayerParty[i]); + switch (gender) + { + case MON_MALE: + sub_806BC3C(i, 0x54); + break; + case MON_FEMALE: + sub_806BC3C(i, 0x62); + break; + default: + sub_806BC3C(i, 0x46); + break; + } + } + else + { + sub_806BC3C(i, 0x46); + } + } +} + +u8 sub_806BD58(u8 taskId, u8 b) +{ + u8 spriteId = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); + sub_806CA18(taskId, spriteId); + return 1; +} + +#ifdef NONMATCHING +u16 HandleDefaultPartyMenuInput(u8 taskId) +{ + s8 menuDirectionPressed = 0x0; + + switch (gMain.newAndRepeatedKeys) + { + case DPAD_UP: + menuDirectionPressed = -1; + break; + case DPAD_DOWN: + menuDirectionPressed = 1; + break; + case DPAD_LEFT: + menuDirectionPressed = -2; + break; + case DPAD_RIGHT: + menuDirectionPressed = 2; + break; + } + + if (menuDirectionPressed == 0) + { + u8 var1 = sub_80F92BC(); + switch (var1) + { + case 1: + menuDirectionPressed = -1; + break; + case 2: + menuDirectionPressed = 1; + break; + } + + if (menuDirectionPressed == 0) + { + if ((gMain.newKeys & A_BUTTON) && gSprites[sub_806CA00(taskId)].data0 == 7) + { + // Selected "CANCEL" + return B_BUTTON; + } + else + { + return gMain.newKeys & (A_BUTTON | B_BUTTON); + } + } + } + + ChangePartyMenuSelection(taskId, menuDirectionPressed); + return gMain.newAndRepeatedKeys; +} +#else +__attribute__((naked)) +u16 HandleDefaultPartyMenuInput(u8 taskId) +{ + asm(".syntax unified\n\ + push {r4,r5,lr}\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + movs r4, 0\n\ + ldr r0, _0806BD9C @ =gMain\n\ + ldrh r0, [r0, 0x30]\n\ + cmp r0, 0x20\n\ + beq _0806BDB2\n\ + cmp r0, 0x20\n\ + bgt _0806BDA0\n\ + cmp r0, 0x10\n\ + beq _0806BDB6\n\ + b _0806BDB8\n\ + .align 2, 0\n\ +_0806BD9C: .4byte gMain\n\ +_0806BDA0:\n\ + cmp r0, 0x40\n\ + beq _0806BDAA\n\ + cmp r0, 0x80\n\ + beq _0806BDAE\n\ + b _0806BDB8\n\ +_0806BDAA:\n\ + movs r4, 0xFF\n\ + b _0806BDB8\n\ +_0806BDAE:\n\ + movs r4, 0x1\n\ + b _0806BDB8\n\ +_0806BDB2:\n\ + movs r4, 0xFE\n\ + b _0806BDB8\n\ +_0806BDB6:\n\ + movs r4, 0x2\n\ +_0806BDB8:\n\ + lsls r0, r4, 24\n\ + cmp r0, 0\n\ + bne _0806BDDC\n\ + bl sub_80F92BC\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + beq _0806BDD0\n\ + cmp r0, 0x2\n\ + beq _0806BDD4\n\ + b _0806BDD6\n\ +_0806BDD0:\n\ + movs r4, 0xFF\n\ + b _0806BDD6\n\ +_0806BDD4:\n\ + movs r4, 0x1\n\ +_0806BDD6:\n\ + lsls r0, r4, 24\n\ + cmp r0, 0\n\ + beq _0806BDF0\n\ +_0806BDDC:\n\ + asrs r1, r0, 24\n\ + adds r0, r5, 0\n\ + bl ChangePartyMenuSelection\n\ + ldr r0, _0806BDEC @ =gMain\n\ + ldrh r0, [r0, 0x30]\n\ + b _0806BE2C\n\ + .align 2, 0\n\ +_0806BDEC: .4byte gMain\n\ +_0806BDF0:\n\ + ldr r0, _0806BE1C @ =gMain\n\ + ldrh r1, [r0, 0x2E]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0806BE24\n\ + ldr r4, _0806BE20 @ =gSprites\n\ + adds r0, r5, 0\n\ + bl sub_806CA00\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r1, r0, 4\n\ + adds r1, r0\n\ + lsls r1, 2\n\ + adds r1, r4\n\ + movs r2, 0x2E\n\ + ldrsh r0, [r1, r2]\n\ + cmp r0, 0x7\n\ + bne _0806BE24\n\ + movs r0, 0x2\n\ + b _0806BE2C\n\ + .align 2, 0\n\ +_0806BE1C: .4byte gMain\n\ +_0806BE20: .4byte gSprites\n\ +_0806BE24:\n\ + ldr r0, _0806BE34 @ =gMain\n\ + ldrh r1, [r0, 0x2E]\n\ + movs r0, 0x3\n\ + ands r0, r1\n\ +_0806BE2C:\n\ + pop {r4,r5}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_0806BE34: .4byte gMain\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +u16 HandleBattleTowerPartyMenuInput(u8 taskId) +{ + u8 menuDirectionPressed = 0x0; + + switch (gMain.newAndRepeatedKeys) + { + case DPAD_UP: + menuDirectionPressed = 0xFF; + break; + case DPAD_DOWN: + menuDirectionPressed = 0x1; + break; + case DPAD_LEFT: + menuDirectionPressed = 0xFE; + break; + case DPAD_RIGHT: + menuDirectionPressed = 0x2; + break; + } + + if (menuDirectionPressed == 0) + { + u8 var1 = sub_80F92BC(); + switch (var1) + { + case 1: + menuDirectionPressed = 0xFF; + break; + case 2: + menuDirectionPressed = 0x1; + break; + } + } + + if (gMain.newKeys & START_BUTTON) + { + SelectBattleTowerOKButton(taskId); + return START_BUTTON; + } + else + { + s8 signedMenuDirection = menuDirectionPressed; + if (signedMenuDirection) + { + ChangeBattleTowerPartyMenuSelection(taskId, signedMenuDirection); + return gMain.newAndRepeatedKeys; + } + else + { + if (gMain.newKeys & A_BUTTON) + { + if (gSprites[sub_806CA00(taskId)].data0 == 7) + { + return B_BUTTON; + } + } + } + } + + return gMain.newKeys & (A_BUTTON | B_BUTTON); +} + +void task_pc_turn_off(const u8 *a, u8 b) +{ + if (a[0]) + sub_806BA94(a[0], a[1], 0, b); + else + sub_806B9A4(a[0], a[1], b); +} + +void sub_806BF24(const u8 *a, u8 monIndex, u8 c, u8 d) +{ + if (GetMonData(&gPlayerParty[monIndex], MON_DATA_SPECIES) && GetMonData(&gPlayerParty[monIndex], MON_DATA_HP) == 0) + c = PARTY_SIZE - 1; + + if (d == 1) + c += 4; + + task_pc_turn_off(a, c); +} + +void ChangePartyMenuSelection(u8 taskId, s8 directionPressed) +{ + bool8 isLinkDoubleBattle; + u8 spriteId = sub_806CA00(taskId); + u8 menuIndex = gSprites[spriteId].data0; + + UpdateMonIconFrame_806DA44(taskId, menuIndex, 0); + + isLinkDoubleBattle = IsLinkDoubleBattle(); + if (isLinkDoubleBattle == 1) + { + if (menuIndex == 0 || menuIndex == 2 || menuIndex == 3) + sub_806BF24(&gUnknown_083769C0[menuIndex * 2], menuIndex, 3, 0); + if (menuIndex == 1 || menuIndex == 4 || menuIndex == 5) + sub_806BF24(&gUnknown_083769C0[menuIndex * 2], menuIndex, 4, 0); + if (menuIndex == 7) + sub_806BBEC(1); + + ChangeLinkDoubleBattlePartyMenuSelection(spriteId, menuIndex, directionPressed); + + if (gSprites[spriteId].data0 == 0 || gSprites[spriteId].data0 == 2 || gSprites[spriteId].data0 == 3) + sub_806BF24(&gUnknown_083769C0[gSprites[spriteId].data0 * 2], gSprites[spriteId].data0, 3, 1); + if (gSprites[spriteId].data0 == 1 || gSprites[spriteId].data0 == 4 || gSprites[spriteId].data0 == 5) + sub_806BF24(&gUnknown_083769C0[gSprites[spriteId].data0 * 2], gSprites[spriteId].data0, 4, 1); + if (gSprites[spriteId].data0 == 7) + sub_806BBEC(2); + + ewram1B000.unk261 = 2; + + gSprites[spriteId].pos1.x = gUnknown_083768B8[PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE][gSprites[spriteId].data0].x; + gSprites[spriteId].pos1.y = gUnknown_083768B8[PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE][gSprites[spriteId].data0].y; + } + else + { + u8 isDoubleBattle = IsDoubleBattle(); + + if (menuIndex < PARTY_SIZE) + { + sub_806BF24(&gUnknown_083769A8[isDoubleBattle * 12 + menuIndex * 2], menuIndex, 3, 0); + } + else + { + sub_806BBEC(1); + } + + if (!isDoubleBattle) + { + ChangeDefaultPartyMenuSelection(spriteId, menuIndex, directionPressed); + } + else + { + ChangeDoubleBattlePartyMenuSelection(spriteId, menuIndex, directionPressed); + } + + if (gSprites[spriteId].data0 < PARTY_SIZE) + { + sub_806BF24(&gUnknown_083769A8[isDoubleBattle * 12 + gSprites[spriteId].data0 * 2], gSprites[spriteId].data0, 3, 1); + } + else + { + sub_806BBEC(2); + } + + ewram1B000.unk261 = 2; + + gSprites[spriteId].pos1.x = gUnknown_083768B8[isDoubleBattle][gSprites[spriteId].data0].x; + gSprites[spriteId].pos1.y = gUnknown_083768B8[isDoubleBattle][gSprites[spriteId].data0].y; + } + + UpdateMonIconFrame_806DA44(taskId, gSprites[spriteId].data0, 1); + + if (menuIndex != gSprites[spriteId].data0) + { + PlaySE(5); + } +} + +void ChangeDefaultPartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed) +{ + u8 nextIndex; + s8 menuMovement = directionPressed + 2; + + switch (menuMovement) + { + case 2: // no movement + gSprites[spriteId].data1 = 0; + break; + case 1: // moving up + if (menuIndex == 0) { + gSprites[spriteId].data0 = 7; + } else if (menuIndex == 7) { + gSprites[spriteId].data0 = gPlayerPartyCount - 1; + } else { + s8 diff = directionPressed; + gSprites[spriteId].data0 += diff; + } + + gSprites[spriteId].data1 = 0; + break; + case 3: // moving down + if (menuIndex == gPlayerPartyCount - 1) { + gSprites[spriteId].data0 = 7; + } else if (menuIndex == 7) { + gSprites[spriteId].data0 = 0; + } else { + s8 diff = directionPressed; + gSprites[spriteId].data0 += diff; + } + + gSprites[spriteId].data1 = 0; + break; + case 4: // moving right + if (gPlayerPartyCount > 1 && menuIndex == 0) + { + if (gSprites[spriteId].data1 == 0) + gSprites[spriteId].data1 = 1; + + gSprites[spriteId].data0 = gSprites[spriteId].data1; + } + break; + case 0: // moving left + // Only move the selection to the left side if one of the mons in the right-hand column are currently selected + nextIndex = menuIndex - 1; + if (nextIndex <= 4) { + gSprites[spriteId].data0 = 0; + gSprites[spriteId].data1 = menuIndex; + } + break; + } +} + +void ChangeDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed) +{ + u8 var1; + s8 menuMovement = directionPressed + 2; + + switch(menuMovement) + { + case 2: // no movement + gSprites[spriteId].data1 = 0; + break; + case 3: // moving down + if (menuIndex == 7) { + gSprites[spriteId].data0 = 0; + } else if (menuIndex == gPlayerPartyCount - 1) { + gSprites[spriteId].data0 = 7; + } else { + s8 diff = directionPressed; + gSprites[spriteId].data0 += diff; + } + + gSprites[spriteId].data1 = 0; + break; + case 1: // moving up + if (menuIndex == 0) { + gSprites[spriteId].data0 = 7; + } else if (menuIndex == 7) { + gSprites[spriteId].data0 = gPlayerPartyCount - 1; + } else { + s8 diff = directionPressed; + gSprites[spriteId].data0 += diff; + } + + gSprites[spriteId].data1 = 0; + break; + case 4: // moving right + if (menuIndex == 0) { + if (gPlayerPartyCount > 2) { + u16 var1 = gSprites[spriteId].data1 - 2; + if (var1 > 1) + gSprites[spriteId].data0 = 2; + else + gSprites[spriteId].data0 = gSprites[spriteId].data1; + } + } + else if (menuIndex == 1) { + if (gPlayerPartyCount > 4) { + u16 var1 = gSprites[spriteId].data1 - 4; + if (var1 <= 1) + gSprites[spriteId].data0 = gSprites[spriteId].data1; + else + gSprites[spriteId].data0 = 4; + } + } + break; + case 0: // moving left + var1 = menuIndex - 2; + if (var1 <= 1) { + gSprites[spriteId].data0 = 0; + gSprites[spriteId].data1 = menuIndex; + } else { + u8 var2 = menuIndex - 4; + if (var2 <= 1) { + gSprites[spriteId].data0 = 1; + gSprites[spriteId].data1 = menuIndex; + } + } + break; + } +} + +#ifdef NONMATCHING +void ChangeLinkDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed) +{ + s8 menuMovement; + u16 var1; + u8 var2; + + menuMovement = directionPressed + 2; + switch (menuMovement) + { + case 2: // no movement + gSprites[spriteId].data1 = 0; + break; + case 3: // moving down + if (menuIndex == 7) { + gSprites[spriteId].data0 = 0; + } else { + while (menuIndex != PARTY_SIZE - 1) { + menuIndex++; + if (GetMonData(&gPlayerParty[menuIndex], MON_DATA_SPECIES)) + { + gSprites[spriteId].data0 = menuIndex; + gSprites[spriteId].data1 = 0; + return; + } + } + + gSprites[spriteId].data0 = 7; + } + + gSprites[spriteId].data1 = 0; + break; + case 1: // moving up + while (menuIndex != 0) { + menuIndex--; + if (menuIndex != PARTY_SIZE && GetMonData(gPlayerParty[menuIndex], MON_DATA_SPECIES)) + { + gSprites[spriteId].data0 = menuIndex; + gSprites[spriteId].data1 = 0; + return; + } + } + + gSprites[spriteId].data0 = 7; + gSprites[spriteId].data1 = 0; + break; + case 4: // moving right + if (menuIndex == 0) { + var1 = gSprites[spriteId].data1 - 2; + if (var1 > 1) { + if (GetMonData(&gPlayerParty[2], MON_DATA_SPECIES)) { + gSprites[spriteId].data0 = 2; + } else if (GetMonData(&gPlayerParty[3], MON_DATA_SPECIES)) { + gSprites[spriteId].data0 = 3; + } + } else { + gSprites[spriteId].data0 = 1; + } + } else if (menuIndex == 1) { + var1 = gSprites[spriteId].data1 - 4; + if (var1 <= 1) { + gSprites[spriteId].data0 = gSprites[spriteId].data1; + } else { + if (GetMonData(&gPlayerParty[4], MON_DATA_SPECIES)) { + gSprites[spriteId].data0 = 4; + } else if (GetMonData(&gPlayerParty[5], MON_DATA_SPECIES)) { + gSprites[spriteId].data0 = 5; + } + } + } + break; + case 0: // moving left + var2 = menuIndex - 2; + if (var2 <= 1) { + gSprites[spriteId].data0 = 0; + gSprites[spriteId].data1 = menuIndex; + } else { + var2 = menuIndex - 4; + if (var2 <= 1) { + gSprites[spriteId].data0 = 1; + gSprites[spriteId].data1 = menuIndex; + } + } + + break; + } +} + +#else +__attribute__((naked)) +void ChangeLinkDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed) +{ + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + lsls r1, 24\n\ + lsrs r4, r1, 24\n\ + lsls r2, 24\n\ + movs r0, 0x80\n\ + lsls r0, 18\n\ + adds r2, r0\n\ + asrs r0, r2, 24\n\ + cmp r0, 0x4\n\ + bls _0806C4AA\n\ + b _0806C64E\n\ +_0806C4AA:\n\ + lsls r0, 2\n\ + ldr r1, _0806C4B4 @ =_0806C4B8\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .align 2, 0\n\ +_0806C4B4: .4byte _0806C4B8\n\ + .align 2, 0\n\ +_0806C4B8:\n\ + .4byte _0806C618\n\ + .4byte _0806C524\n\ + .4byte _0806C4CC\n\ + .4byte _0806C4E0\n\ + .4byte _0806C57C\n\ +_0806C4CC:\n\ + ldr r0, _0806C4DC @ =gSprites\n\ + lsls r1, r5, 4\n\ + adds r1, r5\n\ + lsls r1, 2\n\ + adds r1, r0\n\ + movs r0, 0\n\ + strh r0, [r1, 0x30]\n\ + b _0806C64E\n\ + .align 2, 0\n\ +_0806C4DC: .4byte gSprites\n\ +_0806C4E0:\n\ + cmp r4, 0x7\n\ + bne _0806C4FC\n\ + ldr r2, _0806C4F8 @ =gSprites\n\ + lsls r3, r5, 4\n\ + adds r0, r3, r5\n\ + lsls r0, 2\n\ + adds r0, r2\n\ + movs r1, 0\n\ + strh r1, [r0, 0x2E]\n\ + adds r1, r2, 0\n\ + adds r6, r3, 0\n\ + b _0806C566\n\ + .align 2, 0\n\ +_0806C4F8: .4byte gSprites\n\ +_0806C4FC:\n\ + lsls r6, r5, 4\n\ + b _0806C518\n\ +_0806C500:\n\ + adds r0, r4, 0x1\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + movs r0, 0x64\n\ + muls r0, r4\n\ + ldr r1, _0806C520 @ =gPlayerParty\n\ + adds r0, r1\n\ + movs r1, 0xB\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + bne _0806C528\n\ +_0806C518:\n\ + cmp r4, 0x5\n\ + bne _0806C500\n\ + b _0806C558\n\ + .align 2, 0\n\ +_0806C520: .4byte gPlayerParty\n\ +_0806C524:\n\ + lsls r6, r5, 4\n\ + b _0806C554\n\ +_0806C528:\n\ + ldr r1, _0806C534 @ =gSprites\n\ + adds r0, r6, r5\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + strh r4, [r0, 0x2E]\n\ + b _0806C566\n\ + .align 2, 0\n\ +_0806C534: .4byte gSprites\n\ +_0806C538:\n\ + subs r0, r4, 0x1\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + cmp r4, 0x6\n\ + beq _0806C554\n\ + movs r0, 0x64\n\ + muls r0, r4\n\ + ldr r1, _0806C574 @ =gPlayerParty\n\ + adds r0, r1\n\ + movs r1, 0xB\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + bne _0806C528\n\ +_0806C554:\n\ + cmp r4, 0\n\ + bne _0806C538\n\ +_0806C558:\n\ + ldr r0, _0806C578 @ =gSprites\n\ + adds r1, r6, r5\n\ + lsls r1, 2\n\ + adds r1, r0\n\ + movs r2, 0x7\n\ + strh r2, [r1, 0x2E]\n\ + adds r1, r0, 0\n\ +_0806C566:\n\ + adds r0, r6, r5\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + movs r1, 0\n\ + strh r1, [r0, 0x30]\n\ + b _0806C64E\n\ + .align 2, 0\n\ +_0806C574: .4byte gPlayerParty\n\ +_0806C578: .4byte gSprites\n\ +_0806C57C:\n\ + cmp r4, 0\n\ + bne _0806C5C8\n\ + ldr r0, _0806C5AC @ =gSprites\n\ + lsls r1, r5, 4\n\ + adds r1, r5\n\ + lsls r1, 2\n\ + adds r4, r1, r0\n\ + ldrh r1, [r4, 0x30]\n\ + subs r0, r1, 0x2\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r0, 0x1\n\ + bls _0806C5E2\n\ + ldr r5, _0806C5B0 @ =gPlayerParty + 2 * 0x64\n\ + adds r0, r5, 0\n\ + movs r1, 0xB\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + beq _0806C5B4\n\ + movs r0, 0x2\n\ + strh r0, [r4, 0x2E]\n\ + b _0806C64E\n\ + .align 2, 0\n\ +_0806C5AC: .4byte gSprites\n\ +_0806C5B0: .4byte gPlayerParty + 2 * 0x64\n\ +_0806C5B4:\n\ + adds r0, r5, 0\n\ + adds r0, 0x64\n\ + movs r1, 0xB\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + beq _0806C64E\n\ + movs r0, 0x3\n\ + strh r0, [r4, 0x2E]\n\ + b _0806C64E\n\ +_0806C5C8:\n\ + cmp r4, 0x1\n\ + bne _0806C64E\n\ + ldr r0, _0806C5E8 @ =gSprites\n\ + lsls r1, r5, 4\n\ + adds r1, r5\n\ + lsls r1, 2\n\ + adds r4, r1, r0\n\ + ldrh r1, [r4, 0x30]\n\ + subs r0, r1, 0x4\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r0, 0x1\n\ + bhi _0806C5EC\n\ +_0806C5E2:\n\ + strh r1, [r4, 0x2E]\n\ + b _0806C64E\n\ + .align 2, 0\n\ +_0806C5E8: .4byte gSprites\n\ +_0806C5EC:\n\ + ldr r5, _0806C600 @ =gPlayerParty + 4 * 0x64\n\ + adds r0, r5, 0\n\ + movs r1, 0xB\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + beq _0806C604\n\ + movs r0, 0x4\n\ + strh r0, [r4, 0x2E]\n\ + b _0806C64E\n\ + .align 2, 0\n\ +_0806C600: .4byte gPlayerParty + 4 * 0x64\n\ +_0806C604:\n\ + adds r0, r5, 0\n\ + adds r0, 0x64\n\ + movs r1, 0xB\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + beq _0806C64E\n\ + movs r0, 0x5\n\ + strh r0, [r4, 0x2E]\n\ + b _0806C64E\n\ +_0806C618:\n\ + subs r0, r4, 0x2\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bhi _0806C634\n\ + ldr r0, _0806C630 @ =gSprites\n\ + lsls r1, r5, 4\n\ + adds r1, r5\n\ + lsls r1, 2\n\ + adds r1, r0\n\ + movs r0, 0\n\ + b _0806C64A\n\ + .align 2, 0\n\ +_0806C630: .4byte gSprites\n\ +_0806C634:\n\ + subs r0, r4, 0x4\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bhi _0806C64E\n\ + ldr r0, _0806C654 @ =gSprites\n\ + lsls r1, r5, 4\n\ + adds r1, r5\n\ + lsls r1, 2\n\ + adds r1, r0\n\ + movs r0, 0x1\n\ +_0806C64A:\n\ + strh r0, [r1, 0x2E]\n\ + strh r4, [r1, 0x30]\n\ +_0806C64E:\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0806C654: .4byte gSprites\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +void ChangeBattleTowerPartyMenuSelection(u8 taskId, s8 directionPressed) +{ + u16 newMenuIndex; + u8 newMenuIndex2; + u8 newMenuIndex3; + s8 menuMovement; + u8 spriteId = sub_806CA00(taskId); + u8 menuIndex = gSprites[spriteId].data0; + + UpdateMonIconFrame_806DA44(taskId, menuIndex, 0); + + if (menuIndex < PARTY_SIZE) + { + sub_806BF24(&gUnknown_083769A8[menuIndex * 2], menuIndex, 3, 0); + } + else if (menuIndex == PARTY_SIZE) + { + sub_806BB9C(1); + } + else + { + sub_806BBEC(1); + } + + menuMovement = directionPressed + 2; + + switch (menuMovement) + { + case 2: // no movement + gSprites[spriteId].data1 = 0; + break; + case 1: // moving up + if (menuIndex == 0) { + gSprites[spriteId].data0 = 7; + } else if (menuIndex == PARTY_SIZE) { + gSprites[spriteId].data0 = gPlayerPartyCount - 1; + } else { + gSprites[spriteId].data0 += directionPressed; + } + + gSprites[spriteId].data1 = 0; + break; + case 3: // moving down + if (menuIndex == gPlayerPartyCount - 1) { + gSprites[spriteId].data0 = 6; + } else if (menuIndex == 7) { + gSprites[spriteId].data0 = 0; + } else { + gSprites[spriteId].data0 += directionPressed; + } + + gSprites[spriteId].data1 = 0; + break; + case 4: // moving right + if (gPlayerPartyCount > 1 && menuIndex == 0) + { + if (gSprites[spriteId].data1 == 0) { + gSprites[spriteId].data1 = 1; + } + + gSprites[spriteId].data0 = gSprites[spriteId].data1; + } + break; + case 0: // moving left + newMenuIndex3 = menuIndex - 1; + if (newMenuIndex3 <= 4) + { + gSprites[spriteId].data0 = 0; + gSprites[spriteId].data1 = menuIndex; + } + break; + } + + gSprites[spriteId].pos1.x = gUnknown_083768B8[PARTY_MENU_LAYOUT_STANDARD][gSprites[spriteId].data0].x; + gSprites[spriteId].pos1.y = gUnknown_083768B8[PARTY_MENU_LAYOUT_STANDARD][gSprites[spriteId].data0].y; + + + newMenuIndex = gSprites[spriteId].data0; + if (gSprites[spriteId].data0 < PARTY_SIZE) + { + sub_806BF24(&gUnknown_083769A8[gSprites[spriteId].data0 * 2], newMenuIndex, 3, 1); + } + else if (gSprites[spriteId].data0 == PARTY_SIZE) + { + sub_806BB9C(2); + } + else + { + sub_806BBEC(2); + } + + ewram1B000.unk261 = 2; + + newMenuIndex2 = gSprites[spriteId].data0; + UpdateMonIconFrame_806DA44(taskId, newMenuIndex2, 1); + + if (menuIndex != gSprites[spriteId].data0) + { + PlaySE(5); + } +} + +// Selects the "OK" button in the Battle Tower party menu. +void SelectBattleTowerOKButton(u8 taskId) +{ + u8 spriteId = sub_806CA00(taskId); + + u8 menuIndex = gSprites[spriteId].data0; + if (menuIndex != 6) + { + UpdateMonIconFrame_806DA44(taskId, menuIndex, 0); + + if (menuIndex < PARTY_SIZE) + { + sub_806BF24(&gUnknown_083769A8[menuIndex * 2], menuIndex, 3, 0); + } + else + { + sub_806BBEC(1); + } + + gSprites[spriteId].data1 = 0; + gSprites[spriteId].data0 = 6; + gSprites[spriteId].pos1.x = gUnknown_083768B8[PARTY_MENU_LAYOUT_STANDARD][6].x; + gSprites[spriteId].pos1.y = gUnknown_083768B8[PARTY_MENU_LAYOUT_STANDARD][6].y; + + sub_806BB9C(2); + + ewram1B000.unk261 = 2; + PlaySE(5); + } +} + +void sub_806C92C(u8 spriteId) +{ + u8 menuIndex1 = gSprites[spriteId].data0; + u8 menuIndex2 = gSprites[spriteId].data1; + + if (!IsDoubleBattle()) + { + if (menuIndex1 < 1) { + if (menuIndex2 < 1) { + menuIndex2 = 1; + } + } else { + if (menuIndex2 >= 1) { + menuIndex2 = 0; + } + } + } else { + if (menuIndex1 < 2) { + if (menuIndex2 < 2) { + menuIndex2 = 2; + } + } else { + if (menuIndex2 >= 2) { + menuIndex2 = 0; + } + } + } + + gSprites[spriteId].data1 = menuIndex2; +} + +void sub_806C994(u8 taskId, u8 b) +{ + u8 spriteId = sub_806CA00(taskId); + + gSprites[spriteId].data0 = b; + sub_806C92C(spriteId); +} + +void sub_806C9C4(u8 taskId, u8 spriteId) +{ + u8 spriteId2 = sub_806CA00(taskId); + + gSprites[spriteId].pos1.x = gSprites[spriteId2].pos1.x; + gSprites[spriteId].pos1.y = gSprites[spriteId2].pos1.y; + gSprites[spriteId].data0 = gSprites[spriteId2].data0; +} + +u8 sub_806CA00(u8 taskId) +{ + return gTasks[taskId].data[3] >> 8; +} + +void sub_806CA18(u8 taskId, u8 b) +{ + u8 var1 = gTasks[taskId].data[3]; + gTasks[taskId].data[3] = var1 | (b << 8); +} + +u8 sub_806CA38(u8 taskId) +{ + u8 spriteId = sub_806CA00(taskId); + return gSprites[spriteId].data0; +} + +void SetupDefaultPartyMenuSwitchPokemon(u8 taskId) +{ + gTasks[taskId].func = TaskDummy; + ewram01000.unk0 = taskId; + + CreateTask(HandlePartyMenuSwitchPokemonInput, 0); + ewram01000.unk1 = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); + + sub_806C9C4(taskId, ewram01000.unk1); + ewram01000.unk2 = sub_806CA00(taskId); + + PrintPartyMenuPromptText(ewram1B000_alt.unk272, 0); + + sub_806BF24(&gUnknown_083769A8[gSprites[ewram01000.unk1].data0 * 2], gSprites[ewram01000.unk1].data0, 6, 0); + ewram1B000.unk261 = 2; +} + +// Handles changing the the current mon selection when choosing mons to swap places. +void ChangePartyMenuSwitchPokemonSelection(u8 taskId, s16 menuDirectionPressed) +{ + struct Sprite *sprite1 = &gSprites[ewram01000.unk1]; + struct Sprite *sprite2 = &gSprites[ewram01000.unk2]; + + ChangePartyMenuSelection(taskId, menuDirectionPressed); + + if (sprite1->data0 != sprite2->data0) + { + sub_806BF24(&gUnknown_083769A8[sprite1->data0 * 2], sprite1->data0, 6, 1); + } + else + { + sub_806BF24(&gUnknown_083769A8[sprite1->data0 * 2], sprite1->data0, 6, 0); + } +} + +void HandlePartyMenuSwitchPokemonInput(u8 taskId) +{ + switch (gMain.newAndRepeatedKeys) + { + case DPAD_UP: + ChangePartyMenuSwitchPokemonSelection(ewram01000.unk0, -1); + break; + case DPAD_DOWN: + ChangePartyMenuSwitchPokemonSelection(ewram01000.unk0, 1); + break; + case DPAD_LEFT: + ChangePartyMenuSwitchPokemonSelection(ewram01000.unk0, -2); + break; + case DPAD_RIGHT: + ChangePartyMenuSwitchPokemonSelection(ewram01000.unk0, 2); + break; + } + + if (gMain.newKeys & A_BUTTON) + { + PlaySE(5); + gTasks[taskId].func = ewram01000.unkC; + gTasks[taskId].func(taskId); + } + else if (gMain.newKeys == B_BUTTON) + { + PlaySE(5); + sub_806CD44(taskId); + } +} + +void sub_806CC2C(u8 taskId) +{ + DestroySprite(&gSprites[ewram01000.unk1]); + PrintPartyMenuPromptText(0, 0); + + ewram1B000.unk261 = 2; + SwitchTaskToFollowupFunc(ewram01000.unk0); + DestroyTask(taskId); +} + +void sub_806CC74(u8 taskId) +{ + sub_806BF24(&gUnknown_083769A8[gSprites[ewram01000.unk2].data0 * 2], gSprites[ewram01000.unk2].data0, 3, 1); + sub_806BF24(&gUnknown_083769A8[gSprites[ewram01000.unk1].data0 * 2], gSprites[ewram01000.unk1].data0, 3, 0); + sub_806CC2C(taskId); +} + +void sub_806CCE4() +{ + u8 monIndex1 = gSprites[ewram01000.unk1].data0; + u8 monIndex2 = gSprites[ewram01000.unk2].data0; + + if (monIndex1 <= 5) + { + sub_806BF24(&gUnknown_083769A8[monIndex1 * 2], monIndex1, 3, 0); + } + + if (monIndex2 <= 5) + { + sub_806BF24(&gUnknown_083769A8[monIndex2 * 2], monIndex2, 3, 1); + } +} + +void sub_806CD44(u8 taskId) +{ + sub_806CCE4(); + sub_806CC2C(taskId); +} + +void sub_806CD5C(u8 taskId) +{ + u8 monIndex1 = gSprites[ewram01000.unk1].data0; + u8 monIndex2 = gSprites[ewram01000.unk2].data0; + + if (monIndex1 == monIndex2 || monIndex1 == 7 || monIndex2 == 7) + { + sub_806CD44(taskId); + } + else + { + u8 var1; + + sub_806D5B8(monIndex1); + sub_806D5B8(monIndex2); + + if (monIndex1 > monIndex2) + { + ewram01000.unk5 = monIndex2; + ewram01000.unk6 = monIndex1; + } + else + { + ewram01000.unk5 = monIndex1; + ewram01000.unk6 = monIndex2; + } + + ewram01000.unk3 = GetMonIconSpriteId(ewram01000.unk0, ewram01000.unk5); + ewram01000.unk4 = GetMonIconSpriteId(ewram01000.unk0, ewram01000.unk6); + + var1 = ewram01000.unk5; + if (!var1) + { + gSprites[ewram01000.unk3].data0 = -8; + gSprites[ewram01000.unk3].data2 = -0xA8; + ewram01000.unk8 = var1; + ewram01000.unkA = 11; + + gTasks[taskId].func = sub_806D014; + ewram1B000.unk261 = 1; + } + else + { + gSprites[ewram01000.unk3].data0 = 8; + gSprites[ewram01000.unk3].data2 = 0xA8; + ewram01000.unk8 = 11; + ewram01000.unkA = 11; + + gTasks[taskId].func = sub_806D118; + ewram1B000.unk261 = 1; + } + + gSprites[ewram01000.unk3].callback = SpriteCB_sub_806D37C; + + gSprites[ewram01000.unk4].data0 = 8; + gSprites[ewram01000.unk4].data2 = 0xA8; + gSprites[ewram01000.unk4].callback = SpriteCB_sub_806D37C; + + gSprites[ewram01000.unk3].callback(&gSprites[ewram01000.unk3]); + gSprites[ewram01000.unk4].callback(&gSprites[ewram01000.unk4]); + } +} + +void SwapValues_s16(s16 *a, s16 *b) +{ + s16 temp = *a; + *a = *b; + *b = temp; +} + +#ifdef NONMATCHING +void sub_806CF04(void) +{ + SwapValues_s16(&gSprites[ewram01000.unk3].pos1.x, &gSprites[ewram01000.unk4].pos1.x); + SwapValues_s16(&gSprites[ewram01000.unk3].pos1.y, &gSprites[ewram01000.unk4].pos1.y); + SwapValues_s16(&gSprites[ewram01000.unk3].pos2.x, &gSprites[ewram01000.unk4].pos2.x); + SwapValues_s16(&gSprites[ewram01000.unk3].data0, &gSprites[ewram01000.unk4].data0); + + gSprites[ewram01000.unk3].callback = SpriteCB_sub_806D37C; + gSprites[ewram01000.unk4].callback = SpriteCB_sub_806D37C; +} +#else +__attribute__((naked)) +void sub_806CF04(void) +{ + asm(".syntax unified\n\ + push {r4,r5,lr}\n\ + ldr r4, _0806CF94 @ =0x02001000\n\ + ldrb r1, [r4, 0x3]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + ldr r5, _0806CF98 @ =gSprites + 0x20\n\ + adds r0, r5\n\ + ldrb r2, [r4, 0x4]\n\ + lsls r1, r2, 4\n\ + adds r1, r2\n\ + lsls r1, 2\n\ + adds r1, r5\n\ + bl SwapValues_s16\n\ + ldrb r1, [r4, 0x3]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r3, r5, 0x2\n\ + adds r0, r3\n\ + ldrb r2, [r4, 0x4]\n\ + lsls r1, r2, 4\n\ + adds r1, r2\n\ + lsls r1, 2\n\ + adds r1, r3\n\ + bl SwapValues_s16\n\ + ldrb r1, [r4, 0x3]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r3, r5, 0x4\n\ + adds r0, r3\n\ + ldrb r2, [r4, 0x4]\n\ + lsls r1, r2, 4\n\ + adds r1, r2\n\ + lsls r1, 2\n\ + adds r1, r3\n\ + bl SwapValues_s16\n\ + ldrb r1, [r4, 0x3]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r3, r5, 0\n\ + adds r3, 0xE\n\ + adds r0, r3\n\ + ldrb r2, [r4, 0x4]\n\ + lsls r1, r2, 4\n\ + adds r1, r2\n\ + lsls r1, 2\n\ + adds r1, r3\n\ + bl SwapValues_s16\n\ + ldrb r1, [r4, 0x3]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + subs r5, 0x4\n\ + adds r0, r5\n\ + ldr r2, _0806CF9C @ =SpriteCB_sub_806D37C\n\ + str r2, [r0]\n\ + ldrb r1, [r4, 0x4]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r5\n\ + str r2, [r0]\n\ + pop {r4,r5}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0806CF94: .4byte 0x02001000\n\ +_0806CF98: .4byte gSprites + 0x20\n\ +_0806CF9C: .4byte SpriteCB_sub_806D37C\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +void sub_806CFA0(u8 taskId, u8 b) +{ + u8 var1 = ((ewram01000.unk6 - 1) * 3) + 1; + + sub_806BA34(ewram01000.unk8, 3); + sub_806BB3C(ewram01000.unkA, var1); + + if (!b) + { + ewram01000.unk8--; + ewram01000.unkA++; + } + else + { + ewram01000.unk8++; + ewram01000.unkA--; + } + + sub_806B9A4(ewram01000.unk8, 3, 10); + sub_806BA94(ewram01000.unkA, var1, 0, 10); +} + +void sub_806D014(u8 taskId) +{ + sub_806CFA0(taskId, 0); + + if (ewram01000.unk8 < -13 && ewram01000.unkA > 32) + { + sub_806CF04(); + gTasks[taskId].func = sub_806D05C; + } +} + +void sub_806D05C(u8 taskId) +{ + sub_806CFA0(taskId, 1); + + if (ewram01000.unk8 == 0 && ewram01000.unkA == 11) + { + gTasks[taskId].func = sub_806D198; + } +} + +void sub_806D098(u8 a, u8 b) +{ + u8 var1 = ((ewram01000.unk5 - 1) * 3) + 1; + u8 var2 = ((ewram01000.unk6 - 1) * 3) + 1; + + sub_806BB3C(ewram01000.unk8, var1); + sub_806BB3C(ewram01000.unkA, var2); + + if (!b) + { + ewram01000.unk8++; + ewram01000.unkA++; + } + else + { + ewram01000.unk8--; + ewram01000.unkA--; + } + + sub_806BA94(ewram01000.unk8, var1, 0, 10); + sub_806BA94(ewram01000.unkA, var2, 0, 10); +} + +void sub_806D118(u8 taskId) +{ + sub_806D098(taskId, 0); + + if (ewram01000.unk8 > 32 && ewram01000.unkA > 32) + { + sub_806CF04(); + gTasks[taskId].func = sub_806D15C; + } +} + +void sub_806D15C(u8 taskId) +{ + sub_806D098(taskId, 1); + + if (ewram01000.unk8 == 11 && ewram01000.unkA == 11) + { + gTasks[taskId].func = sub_806D198; + } +} + +void sub_806D198(u8 taskId) +{ + u8 spriteId; + + SetMonIconSpriteId(ewram01000.unk0, ewram01000.unk5, ewram01000.unk4); + SetMonIconSpriteId(ewram01000.unk0, ewram01000.unk6, ewram01000.unk3); + + gSprites[ewram01000.unk3].pos1.x = gUnknown_08376678[IsDoubleBattle()][ewram01000.unk6].x; + gSprites[ewram01000.unk3].pos1.y = gUnknown_08376678[IsDoubleBattle()][ewram01000.unk6].y; + gSprites[ewram01000.unk3].pos2.x = 0; + gSprites[ewram01000.unk3].pos2.y = 0; + gSprites[ewram01000.unk3].callback = UpdateMonIconFrame_806DA38; + + gSprites[ewram01000.unk4].pos1.x = gUnknown_08376678[IsDoubleBattle()][ewram01000.unk5].x; + gSprites[ewram01000.unk4].pos1.y = gUnknown_08376678[IsDoubleBattle()][ewram01000.unk5].y; + gSprites[ewram01000.unk4].pos2.x = 0; + gSprites[ewram01000.unk4].pos2.y = 0; + gSprites[ewram01000.unk4].callback = UpdateMonIconFrame_806DA38; + + spriteId = GetMonIconSpriteId(ewram01000.unk0, gSprites[ewram01000.unk2].data0); + gSprites[spriteId].callback = UpdateMonIconFrame_806DA0C; + + SwapPokemon(&gPlayerParty[ewram01000.unk5], &gPlayerParty[ewram01000.unk6]); + + PartyMenuPrintMonLevelOrStatus(ewram01000.unk5, &gPlayerParty[ewram01000.unk5]); + TryPrintPartyMenuMonNickname(ewram01000.unk5, &gPlayerParty[ewram01000.unk5]); + PartyMenuTryPrintHP(ewram01000.unk5, &gPlayerParty[ewram01000.unk5]); + nullsub_12(ewram01000.unk5, &gPlayerParty[ewram01000.unk5]); + + PartyMenuPrintMonLevelOrStatus(ewram01000.unk6, &gPlayerParty[ewram01000.unk6]); + TryPrintPartyMenuMonNickname(ewram01000.unk6, &gPlayerParty[ewram01000.unk6]); + PartyMenuTryPrintHP(ewram01000.unk6, &gPlayerParty[ewram01000.unk6]); + nullsub_12(ewram01000.unk6, &gPlayerParty[ewram01000.unk6]); + + PartyMenuDrawHPBars(); + sub_806CC74(taskId); +} + +void SpriteCB_sub_806D37C(struct Sprite *sprite) +{ + UpdateMonIconFrame(sprite); + + if (sprite->pos2.x == sprite->data2) + { + sprite->data0 *= -1; + sprite->data2 = 0; + sprite->callback = UpdateMonIconFrame_806DA38; + } + else + { + sprite->pos2.x += sprite->data0; + } +} + +void sub_806D3B4(u8 taskId, u16 species1, u16 species2) +{ + const u8 *var1 = gUnknown_083769C0; + + sub_806BA34(var1[2] + gTasks[taskId].data[0], var1[3]); + sub_806BB3C(var1[8] + gTasks[taskId].data[0], var1[9]); + sub_806BB3C(var1[10] + gTasks[taskId].data[0], var1[11]); + + gTasks[taskId].data[0]--; + + sub_806B9A4(var1[2] + gTasks[taskId].data[0], var1[3], 4); + + if (species1) + { + sub_806BA94(var1[8] + gTasks[taskId].data[0], var1[9], 0, 4); + } + else + { + sub_806BA94(var1[8] + gTasks[taskId].data[0], var1[9], 1, 4); + } + + if (species2) + { + sub_806BA94(var1[10] + gTasks[taskId].data[0], var1[11], 0, 4); + } + else + { + sub_806BA94(var1[10] + gTasks[taskId].data[0], var1[11], 1, 4); + } +} + +void sub_806D4AC(u8 taskId, u16 species, u8 c) +{ + if (species) + { + u8 monIndex = c + 3; + u8 spriteId = GetMonIconSpriteId(taskId, monIndex); + + gSprites[spriteId].data0 = -8; + gSprites[spriteId].data2 = gTasks[taskId].data[0] * -8; + gSprites[spriteId].callback = SpriteCB_sub_806D37C; + } +} + +void sub_806D50C(u8 taskId, u8 monIndex) +{ + gSprites[GetMonIconSpriteId(taskId, monIndex)].pos1.x += 0xF0; +} + +void PrintPartyMenuPromptText(u8 textId, u8 b) +{ + if (textId != 0xFF) + { + switch (b) + { + case 0: + MenuDrawTextWindow(0, 16, 23, 19); + break; + case 1: + MenuDrawTextWindow(0, 16, 19, 19); + break; + case 2: + MenuDrawTextWindow(0, 16, 22, 19); + break; + case 3: + MenuDrawTextWindow(0, 16, 18, 19); + break; + } + + MenuPrint(PartyMenuPromptTexts[textId], 1, 17); + } +} + +void sub_806D5A4(void) +{ + MenuZeroFillWindowRect(0, 16, 29, 19); +} + +void sub_806D5B8(u8 monIndex) +{ + u32 var1; + u8 left = gUnknown_08376948[IsDoubleBattle()][monIndex].left; + u8 top = gUnknown_08376948[IsDoubleBattle()][monIndex].top; + u8 right = gUnknown_08376948[IsDoubleBattle()][monIndex].right; + u8 bottom = gUnknown_08376948[IsDoubleBattle()][monIndex].bottom; + + ZeroFillWindowRect(&gUnknown_03004210, left, top, right, bottom); + + var1 = 0; + CpuFastSet(&var1, OBJ_VRAM1 + monIndex * 0x400, 0x1000100); +} + +void sub_806D668(u8 monIndex) +{ + u32 var1; + u8 left = gUnknown_08376978[IsDoubleBattle()][monIndex].left; + u8 top = gUnknown_08376978[IsDoubleBattle()][monIndex].top; + u8 right = gUnknown_08376978[IsDoubleBattle()][monIndex].right; + u8 bottom = gUnknown_08376978[IsDoubleBattle()][monIndex].bottom; + + ZeroFillWindowRect(&gUnknown_03004210, left, top, right, bottom); + + var1 = 0; + CpuFastSet(&var1, OBJ_VRAM1 + 0x300 + monIndex * 0x400, 0x1000040); +} + +bool8 LoadPartyMenuGraphics(u8 a) +{ + u16 palette = 0x7FFF; + bool8 retVal = FALSE; + + if (a < 2) + { + LZDecompressVram(gPartyMenuMisc_Gfx, (void *)BG_VRAM); + } + + if (a == 2 || a == 0) + { + LZDecompressVram(gPartyMenuMisc_Tilemap, (void *)(BG_VRAM + 0x3800)); + } + + if (a == 3 || a == 0) + { + LoadCompressedPalette(gPartyMenuMisc_Pal, 0, 0x160); + } + + if (a == 4 || a == 0) + { + LoadPalette(&palette, 0, 2); + LoadPalette(gFontDefaultPalette, 0xF0, 0x20); + } + + if (a == 5 || a == 0) + { + LZDecompressVram(gPartyMenuHpBar_Gfx, (void *)(BG_VRAM + 0x6000)); + } + + if (a == 6 || a == 0) + { + LZDecompressVram(gPartyMenuOrderText_Gfx, (void *)(BG_VRAM + 0x6180)); + } + + if (a == 7 || a == 0) + { + LZDecompressVram(gStatusGfx_Icons, (void *)(BG_VRAM + 0x7180)); + } + + if (a == 8 || a == 0) + { + LoadCompressedPalette(gStatusPal_Icons, 0xB0, 0x20); + retVal = TRUE; + } + + return retVal; +} + +void SetMonIconAnimByHP(u8 spriteId, u16 currentHP, u16 maxHP) +{ + u8 hpBarLevel = GetHPBarLevel(currentHP, maxHP); + u8 animNum = 0; + + if (currentHP != maxHP) + { + if (hpBarLevel == 3) + { + animNum = 1; + } + else if (hpBarLevel == 2) + { + animNum = 2; + } + else if (hpBarLevel == 1) + { + animNum = 3; + } + else + { + animNum = 4; + } + } + + sub_809D824(&gSprites[spriteId], animNum); +} + +void SetMonIconAnim(u8 spriteId, struct Pokemon *pokemon) +{ + u16 currentHP = GetMonData(pokemon, MON_DATA_HP); + u16 maxHP = GetMonData(pokemon, MON_DATA_MAX_HP); + + SetMonIconAnimByHP(spriteId, currentHP, maxHP); +} + +void CreatePartyMenuMonIcon(u8 taskId, u8 monIndex, u8 menuType, struct Pokemon *pokemon) +{ + u8 x = gUnknown_08376678[menuType][monIndex].x; + u8 y = gUnknown_08376678[menuType][monIndex].y; + + u16 species2 = GetMonData(pokemon, MON_DATA_SPECIES2); + u32 personality = GetMonData(pokemon, MON_DATA_PERSONALITY); + + u8 spriteId = CreateMonIcon(species2, sub_809D62C, x, y, 5, personality); + SetMonIconSpriteId(taskId, monIndex, spriteId); + SetMonIconAnim(spriteId, pokemon); +} + +void TryCreatePartyMenuMonIcon(u8 taskId, u8 monIndex, struct Pokemon *pokemon) +{ + if (GetMonData(pokemon, MON_DATA_SPECIES)) + { + bool8 isLinkDoubleBattle = IsLinkDoubleBattle(); + if (isLinkDoubleBattle == TRUE) + { + CreatePartyMenuMonIcon(taskId, monIndex, PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE, pokemon); + } + else + { + CreatePartyMenuMonIcon(taskId, monIndex, IsDoubleBattle(), pokemon); + } + } +} + +void unref_sub_806D964(u8 taskId) +{ + u8 i; + for (i = 0; i < gPlayerPartyCount; i++) + { + TryCreatePartyMenuMonIcon(taskId, i, &gPlayerParty[i]); + } +} + +void CreateMonIcon_LinkMultiBattle(u8 taskId, u8 monIndex, u8 menuType, struct UnknownPokemonStruct2 *pokemon) +{ + u8 x = gUnknown_08376678[menuType][monIndex].x; + u8 y = gUnknown_08376678[menuType][monIndex].y; + + u8 spriteId = CreateMonIcon(pokemon->species, sub_809D62C, x, y, 5, pokemon->personality); + SetMonIconSpriteId(taskId, monIndex, spriteId); + SetMonIconAnimByHP(spriteId, pokemon->hp, pokemon->maxhp); +} + +void UpdateMonIconFrame_806DA0C(struct Sprite *sprite) +{ + u8 var1; + + var1 = UpdateMonIconFrame(sprite); + if (var1) + { + if (var1 & 1) + { + sprite->pos2.y = -3; + } + else + { + sprite->pos2.y = 1; + } + } +} + +void UpdateMonIconFrame_806DA38(struct Sprite *sprite) +{ + UpdateMonIconFrame(sprite); +} + +void UpdateMonIconFrame_806DA44(u8 taskId, u8 monIndex, u8 c) +{ + u8 spriteId; + + if (monIndex < PARTY_SIZE) + { + spriteId = GetMonIconSpriteId(taskId, monIndex); + gSprites[spriteId].pos2.y = 0; + gSprites[spriteId].data0 = 0; + + if (!c) + { + gSprites[spriteId].callback = UpdateMonIconFrame_806DA38; + } + else + { + gSprites[spriteId].callback = UpdateMonIconFrame_806DA0C; + } + } +} + +void LoadHeldItemIconGraphics(void) +{ + LoadSpriteSheet(&HeldItemsSpriteSheet); + LoadSpritePalette(&HeldItemsPalette); +} + +void SpriteCB_HeldItemIcon(struct Sprite *sprite) +{ + + u8 data7 = sprite->data7; + if (gSprites[data7].invisible) + { + sprite->invisible = 1; + } + else + { + sprite->invisible = 0; + sprite->pos1.x = gSprites[data7].pos1.x + gSprites[data7].pos2.x; + sprite->pos1.y = gSprites[data7].pos1.y + gSprites[data7].pos2.y; + } +} + +void CreateHeldItemIcon(u8 a, u8 b) +{ + u8 subPriority; + u8 spriteId; + + subPriority = gSprites[a].subpriority; + spriteId = CreateSprite(&gSpriteTemplate_837660C, 0xFA, 0xAA, subPriority - 1); + + gSprites[spriteId].pos2.x = 4; + gSprites[spriteId].pos2.y = 10; + gSprites[spriteId].callback = SpriteCB_HeldItemIcon; + gSprites[spriteId].data7 = a; + + StartSpriteAnim(&gSprites[spriteId], b); + gSprites[spriteId].callback(&gSprites[spriteId]); +} + +void CreateHeldItemIcons(u8 *a, u8 *b, u8 c) +{ + u16 i; + u16 heldItem; + + switch (c) + { + case 0: + i = 0; + while (i < a[0]) + { + heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); + if (heldItem) + { + CreateHeldItemIcon(b[i], ItemIsMail(heldItem)); + } + + i++; + } + break; + case 1: + i = 0; + while (i < a[1]) + { + heldItem = GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM); + if (heldItem) + { + CreateHeldItemIcon(b[i + 6], ItemIsMail(heldItem)); + } + + i++; + } + break; + } +} + +void CreateHeldItemIcons_806DC34(u8 taskId) +{ + u8 i; + u8 monIconSpriteId; + u8 heldItemSpriteId; + + for (i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES)) + { + monIconSpriteId = GetMonIconSpriteId(taskId, i); + heldItemSpriteId = CreateSprite(&gSpriteTemplate_837660C, 0xFA, 0xAA, 4); + + gSprites[heldItemSpriteId].pos2.x = 4; + gSprites[heldItemSpriteId].pos2.y = 10; + gSprites[heldItemSpriteId].data7 = monIconSpriteId; + gSprites[monIconSpriteId].data7 = heldItemSpriteId; + + SetHeldItemIconVisibility(taskId, i); + gSprites[heldItemSpriteId].callback(&gSprites[heldItemSpriteId]); + } + } +} + +#ifdef NONMATCHING +void CreateHeldItemIcon_806DCD4(u8 taskId, u8 monIndex, u16 item) +{ + u8 monIconSpriteId; + u8 heldItemSpriteId; + + monIconSpriteId = GetMonIconSpriteId(taskId, monIndex); + heldItemSpriteId = CreateSprite(gSpriteTemplate_837660C, 0xFA, 0xAA, 4); + + gSprites[heldItemSpriteId].pos2.x = 4; + gSprites[heldItemSpriteId].pos2.y = 10; + gSprites[heldItemSpriteId].data7 = monIconSpriteId; + gSprites[monIconSpriteId].data7 = heldItemSpriteId; + + if (!item) + { + gSprites[heldItemSpriteId].invisible = 1; + } + else + { + if (ItemIsMail(item)) + { + StartSpriteAnim(&gSprites[heldItemSpriteId], 1); + } + else + { + StartSpriteAnim(&gSprites[heldItemSpriteId], 0); + } + + gSprites[heldItemSpriteId].invisible = 0; + } + + gSprites[heldItemSpriteId].callback(&gSprites[heldItemSpriteId]); +} +#else +__attribute__((naked)) +void CreateHeldItemIcon_806DCD4(u8 taskId, u8 monIndex, u16 item) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + lsls r2, 16\n\ + lsrs r7, r2, 16\n\ + bl GetMonIconSpriteId\n\ + adds r4, r0, 0\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + ldr r0, _0806DD2C @ =gSpriteTemplate_837660C\n\ + movs r1, 0xFA\n\ + movs r2, 0xAA\n\ + movs r3, 0x4\n\ + bl CreateSprite\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + ldr r1, _0806DD30 @ =gSprites\n\ + lsls r0, r6, 4\n\ + adds r0, r6\n\ + lsls r0, 2\n\ + adds r5, r0, r1\n\ + movs r0, 0x4\n\ + strh r0, [r5, 0x24]\n\ + movs r0, 0xA\n\ + strh r0, [r5, 0x26]\n\ + strh r4, [r5, 0x3C]\n\ + lsls r0, r4, 4\n\ + adds r0, r4\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + strh r6, [r0, 0x3C]\n\ + cmp r7, 0\n\ + bne _0806DD34\n\ + adds r0, r5, 0\n\ + adds r0, 0x3E\n\ + ldrb r1, [r0]\n\ + movs r2, 0x4\n\ + orrs r1, r2\n\ + strb r1, [r0]\n\ + b _0806DD5C\n\ + .align 2, 0\n\ +_0806DD2C: .4byte gSpriteTemplate_837660C\n\ +_0806DD30: .4byte gSprites\n\ +_0806DD34:\n\ + adds r0, r7, 0\n\ + bl ItemIsMail\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _0806DD46\n\ + adds r0, r5, 0\n\ + movs r1, 0x1\n\ + b _0806DD4A\n\ +_0806DD46:\n\ + adds r0, r5, 0\n\ + movs r1, 0\n\ +_0806DD4A:\n\ + bl StartSpriteAnim\n\ + adds r2, r5, 0\n\ + adds r2, 0x3E\n\ + ldrb r1, [r2]\n\ + movs r0, 0x5\n\ + negs r0, r0\n\ + ands r0, r1\n\ + strb r0, [r2]\n\ +_0806DD5C:\n\ + ldr r2, _0806DD78 @ =gSprites\n\ + lsls r0, r6, 4\n\ + adds r0, r6\n\ + lsls r0, 2\n\ + adds r1, r2, 0\n\ + adds r1, 0x1C\n\ + adds r1, r0, r1\n\ + adds r0, r2\n\ + ldr r1, [r1]\n\ + bl _call_via_r1\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0806DD78: .4byte gSprites\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +void SpriteCB_UpdateHeldItemIconPosition(struct Sprite *sprite) +{ + u8 spriteId = sprite->data7; + + sprite->pos1.x = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x; + sprite->pos1.y = gSprites[spriteId].pos1.y; +} + +u8 GetMonIconSpriteId(u8 taskId, u8 monIndex) +{ + switch (monIndex) + { + case 1: + return gTasks[taskId].data[0]; + break; + case 2: + return gTasks[taskId].data[1] >> 8; + break; + case 3: + return gTasks[taskId].data[1]; + break; + case 4: + return gTasks[taskId].data[2] >> 8; + break; + case 5: + return gTasks[taskId].data[2]; + break; + case 0: + default: + return gTasks[taskId].data[0] >> 8; + break; + } +} + +void SetMonIconSpriteId(u8 taskId, u8 monIndex, u8 spriteId) +{ + switch (monIndex) + { + case 0: + gTasks[taskId].data[0] = (u8)gTasks[taskId].data[0] | (spriteId << 8); + break; + case 1: + gTasks[taskId].data[0] = (gTasks[taskId].data[0] & -0x100) | spriteId; + break; + case 2: + gTasks[taskId].data[1] = (u8)gTasks[taskId].data[1] | (spriteId << 8); + break; + case 3: + gTasks[taskId].data[1] = (gTasks[taskId].data[1] & -0x100) | spriteId; + break; + case 4: + gTasks[taskId].data[2] = (u8)gTasks[taskId].data[2] | (spriteId << 8); + break; + case 5: + gTasks[taskId].data[2] = (gTasks[taskId].data[2] & -0x100) | spriteId; + break; + } +} + +u16 GetMonHeldItemIconSpriteId(u8 taskId, u8 monIndex) +{ + u8 spriteId = GetMonIconSpriteId(taskId, monIndex); + u8 retVal = gSprites[spriteId].data7; + return retVal; +} + +#ifdef NONMATCHING +void SetHeldItemIconVisibility(u8 taskId, u8 monIndex) +{ + u8 spriteId; + u16 heldItem; + + spriteId = GetMonHeldItemIconSpriteId(taskId, monIndex); + if (!GetMonData(&gPlayerParty[monIndex], MON_DATA_HELD_ITEM)) + { + gSprites[spriteId].invisible = 1; + } + else + { + struct Sprite *sprite; + + heldItem = GetMonData(&gPlayerParty[monIndex], MON_DATA_HELD_ITEM); + sprite = &gSprites[spriteId]; + if (ItemIsMail(heldItem)) + { + StartSpriteAnim(sprite, 1); + } + else + { + StartSpriteAnim(sprite, 0); + } + + sprite->invisible = 0; + } +} +#else +__attribute__((naked)) +void SetHeldItemIconVisibility(u8 a, u8 monIndex) +{ + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + adds r4, r1, 0\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + adds r1, r4, 0\n\ + bl GetMonHeldItemIconSpriteId\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + adds r6, r5, 0\n\ + movs r0, 0x64\n\ + adds r1, r4, 0\n\ + muls r1, r0\n\ + ldr r0, _0806DFA4 @ =gPlayerParty\n\ + adds r4, r1, r0\n\ + adds r0, r4, 0\n\ + movs r1, 0xC\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + bne _0806DFAC\n\ + ldr r1, _0806DFA8 @ =gSprites\n\ + lsls r0, r5, 4\n\ + adds r0, r5\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + adds r0, 0x3E\n\ + ldrb r1, [r0]\n\ + movs r2, 0x4\n\ + orrs r1, r2\n\ + strb r1, [r0]\n\ + b _0806DFF6\n\ + .align 2, 0\n\ +_0806DFA4: .4byte gPlayerParty\n\ +_0806DFA8: .4byte gSprites\n\ +_0806DFAC:\n\ + adds r0, r4, 0\n\ + movs r1, 0xC\n\ + bl GetMonData\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + bl ItemIsMail\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _0806DFD8\n\ + lsls r4, r5, 4\n\ + adds r4, r5\n\ + lsls r4, 2\n\ + ldr r0, _0806DFD4 @ =gSprites\n\ + adds r4, r0\n\ + adds r0, r4, 0\n\ + movs r1, 0x1\n\ + b _0806DFE6\n\ + .align 2, 0\n\ +_0806DFD4: .4byte gSprites\n\ +_0806DFD8:\n\ + lsls r4, r6, 4\n\ + adds r4, r6\n\ + lsls r4, 2\n\ + ldr r0, _0806DFFC @ =gSprites\n\ + adds r4, r0\n\ + adds r0, r4, 0\n\ + movs r1, 0\n\ +_0806DFE6:\n\ + bl StartSpriteAnim\n\ + adds r4, 0x3E\n\ + ldrb r1, [r4]\n\ + movs r0, 0x5\n\ + negs r0, r0\n\ + ands r0, r1\n\ + strb r0, [r4]\n\ +_0806DFF6:\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0806DFFC: .4byte gSprites\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +void PartyMenuDoPrintMonNickname(u8 monIndex, int b, const u8 *nameBuffer) +{ + u32 var1 = 0; + CpuFastSet(&var1, gTileBuffer, 0x1000100); + sub_8004E3C((struct WindowConfig *)&gWindowConfig_81E6CAC, gTileBuffer, nameBuffer); + CpuFastSet(gTileBuffer, OBJ_VRAM1 + (monIndex * 0x400), 128); +} + +void PrintPartyMenuMonNickname(u8 monIndex, u8 b, struct Pokemon *pokemon) +{ + u8 nameBuffer[12]; + GetMonNickname(pokemon, nameBuffer); + PartyMenuDoPrintMonNickname(monIndex, b, nameBuffer); +} + +void TryPrintPartyMenuMonNickname(u8 monIndex, struct Pokemon *pokemon) +{ + if (GetMonData(pokemon, MON_DATA_SPECIES)) + { + bool8 isLinkDoubleBattle = IsLinkDoubleBattle(); + if (isLinkDoubleBattle == TRUE) + { + PrintPartyMenuMonNickname(monIndex, PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE, pokemon); + } + else + { + PrintPartyMenuMonNickname(monIndex, IsDoubleBattle(), pokemon); + } + } +} + +void PrintPartyMenuMonNicknames(void) +{ + u8 i; + + for (i = 0; i < PARTY_SIZE; i++) + { + TryPrintPartyMenuMonNickname(i, &gPlayerParty[i]); + } +} + +u8 *GetMonNickname(struct Pokemon *pokemon, u8 *stringBuffer) +{ + GetMonData(pokemon, MON_DATA_NICKNAME, stringBuffer); + return StringGetEnd10(stringBuffer); +} + +void PartyMenuPutStatusTilemap(u8 monIndex, u8 menuLayout, u8 status) +{ + u8 i; + u8 x = gUnknown_08376738[menuLayout][monIndex].x - 1; + u8 y = gUnknown_08376738[menuLayout][monIndex].y + 1; + u16 *vramPtr = (u16*)(VRAM + 0xF000) + (x + y * 32); + u8 var1 = status * 4; + + for (i = 0; i < 4; i++) + { + vramPtr[i] = (0x18C + var1 + i) | -0x5000; + } +} + +static void PartyMenuClearLevelStatusTilemap(u8 monIndex) +{ + bool8 isLinkDoubleBattle; + u8 menuLayout; + u8 x; + u8 y; + u16 *vramPtr; + u8 i; + + isLinkDoubleBattle = IsLinkDoubleBattle(); + if (isLinkDoubleBattle == TRUE) + { + menuLayout = PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE; + } + else + { + menuLayout = IsDoubleBattle(); + } + + x = gUnknown_08376738[menuLayout][monIndex].x - 1; + y = gUnknown_08376738[menuLayout][monIndex].y + 1; + + vramPtr = (u16*)(VRAM + 0xF000) + (x + y * 32); + for (i = 0; i < 4; i++) + { + vramPtr[i] = 0; + } +} + +static void PartyMenuWriteTilemap(u8 a, u8 x, u8 y) +{ + u16 *vramPtr = (u16*)(VRAM + 0xF000) + (x + y * 32); + *vramPtr = a + 0x10C; +} + +void PartyMenuDoPrintLevel(u8 monIndex, u8 menuLayout, u8 level) +{ + u8 *stringVar; + u32 var1; + u8 x = gUnknown_08376738[menuLayout][monIndex].x; + u8 y = gUnknown_08376738[menuLayout][monIndex].y; + + PartyMenuWriteTilemap(0x40, x - 1, y + 1); + + stringVar = gStringVar1; + stringVar[0] = 0xFC; + stringVar[1] = 0x12; + stringVar[2] = 0x8; + + ConvertIntToDecimalString(&stringVar[3], level); + + var1 = 0; + CpuFastSet(&var1, gUnknown_02039460, 0x1000020); + sub_8004E3C((struct WindowConfig *)&gWindowConfig_81E6CAC, gUnknown_02039460 - 0x100 /*gTileBuffer*/, gStringVar1); + CpuFastSet(gUnknown_02039460, OBJ_VRAM1 + 0x200 + (monIndex * 0x400), 32); +} + +void PartyMenuPrintLevel(u8 monIndex, u8 menuLayout, struct Pokemon *pokemon) +{ + u16 level = GetMonData(pokemon, MON_DATA_LEVEL); + PartyMenuDoPrintLevel(monIndex, menuLayout, level); +} + +void PartyMenuPrintMonLevelOrStatus(u8 monIndex, struct Pokemon *pokemon) +{ + if (GetMonData(pokemon, MON_DATA_SPECIES) && !GetMonData(pokemon, MON_DATA_IS_EGG)) + { + u8 statusAndPkrs; + bool8 isLinkDoubleBattle; + u8 menuLayout; + + statusAndPkrs = GetMonStatusAndPokerus(pokemon); + + isLinkDoubleBattle = IsLinkDoubleBattle(); + if (isLinkDoubleBattle == TRUE) + { + menuLayout = PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE; + } + else + { + menuLayout = IsDoubleBattle(); + } + + if (statusAndPkrs != 0 && statusAndPkrs != 6) + { + PartyMenuPutStatusTilemap(monIndex, menuLayout, statusAndPkrs - 1); + } + else + { + PartyMenuPrintLevel(monIndex, menuLayout, pokemon); + } + + PartyMenuPrintGenderIcon(monIndex, menuLayout, pokemon); + } +} + +void PartyMenuPrintMonsLevelOrStatus(void) +{ + u8 i; + + for (i = 0; i < PARTY_SIZE; i++) + { + PartyMenuPrintMonLevelOrStatus(i, &gPlayerParty[i]); + } +} + +void PartyMenuDoPrintGenderIcon(u16 species, u8 gender, u8 menuLayout, u8 monIndex, u8 *nickname) +{ + if (!ShouldHideGenderIcon(species, nickname)) + { + u8 x = gUnknown_08376738[menuLayout][monIndex].x + 3; + u8 y = gUnknown_08376738[menuLayout][monIndex].y + 1; + + switch (gender) + { + case MON_MALE: + PartyMenuWriteTilemap(0x42, x, y); + break; + case MON_FEMALE: + PartyMenuWriteTilemap(0x44, x, y); + break; + } + } +} + +void PartyMenuPrintGenderIcon(u8 monIndex, u8 menuLayout, struct Pokemon *pokemon) +{ + u16 species2; + u8 gender; + + GetMonNickname(pokemon, gStringVar1); + species2 = GetMonData(pokemon, MON_DATA_SPECIES2); + gender = GetMonGender(pokemon); + PartyMenuDoPrintGenderIcon(species2, gender, menuLayout, monIndex, gStringVar1); +} + +void PartyMenuDoPrintHP(u8 monIndex, u8 b, u16 currentHP, u16 maxHP) +{ + u32 *var; + register u8 *stringVar1 asm("r2") = gStringVar1; + register u8 *textPtr asm("r2") = sub_8072C14(stringVar1, currentHP, 15, 1); + textPtr[0] = CHAR_SLASH; + + sub_8072C14(++textPtr, maxHP, 35, 1); + var = 0; + + CpuFastSet(&var, gUnknown_02039460, 0x1000040); + sub_8004E3C((struct WindowConfig *)&gWindowConfig_81E6CAC, gUnknown_02039460 - 0x100 /*gTileBuffer*/, gStringVar1); + CpuFastSet(gUnknown_02039460, OBJ_VRAM1 + 0x300 + (monIndex * 0x400), 64); +} + +void PartyMenuPrintHP(u8 monIndex, u8 b, struct Pokemon *pokemon) +{ + u16 currentHP; + u16 maxHP; + + currentHP = GetMonData(pokemon, MON_DATA_HP); + maxHP = GetMonData(pokemon, MON_DATA_MAX_HP); + + PartyMenuDoPrintHP(monIndex, b, currentHP, maxHP); +} + +void PartyMenuTryPrintHP(u8 monIndex, struct Pokemon *pokemon) +{ + if (GetMonData(pokemon, MON_DATA_SPECIES) && !GetMonData(pokemon, MON_DATA_IS_EGG)) + { + bool8 isLinkDoubleBattle = IsLinkDoubleBattle(); + if (isLinkDoubleBattle == TRUE) + { + PartyMenuPrintHP(monIndex, PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE, pokemon); + } + else + { + PartyMenuPrintHP(monIndex, IsDoubleBattle(), pokemon); + } + } +} + +void PartyMenuTryPrintMonsHP(void) +{ + u8 i; + + for (i = 0; i < PARTY_SIZE; i++) + { + PartyMenuTryPrintHP(i, &gPlayerParty[i]); + } +} + +void unref_sub_806E564(void) { } +void unref_sub_806E568(void) { } +void nullsub_12(u8 monIndex, struct Pokemon *pokemon) { } +void nullsub_13(void) { } + +void PartyMenuDoDrawHPBar(u8 monIndex, u8 menuLayout, u16 currentHP, u16 maxHP) +{ + u8 hpBarLevel; + u16 *vramPtr; + int var = -32768; + struct BattleInterfaceStruct1 battleInterface; + battleInterface.unk0 = maxHP; + battleInterface.unk4 = currentHP; + battleInterface.unk8 = 0; + + hpBarLevel = GetHPBarLevel(currentHP, maxHP); + if (hpBarLevel > 2) + { + battleInterface.unkC_0 = 4; + } + if (hpBarLevel == 2) + { + battleInterface.unkC_0 = 5; + } + if (hpBarLevel < 2) + { + battleInterface.unkC_0 = 6; + } + + battleInterface.unk10 = 0x100; + + vramPtr = gUnknown_08376858[menuLayout][monIndex]; + sub_80460C8(&battleInterface, &var, vramPtr, 0); + + vramPtr -= 2; + + vramPtr[0] = 0x3109; + vramPtr[1] = 0x310A; + vramPtr[8] = 0x310B; +} + +void PartyMenuDrawHPBar(u8 monIndex, u8 menuLayout, struct Pokemon *pokemon) +{ + u16 currentHP = GetMonData(pokemon, MON_DATA_HP); + u16 maxHP = GetMonData(pokemon, MON_DATA_MAX_HP); + + PartyMenuDoDrawHPBar(monIndex, menuLayout, currentHP, maxHP); +} + +void PartyMenuTryDrawHPBar(u8 monIndex, struct Pokemon *pokemon) +{ + if (GetMonData(pokemon, MON_DATA_SPECIES) && !GetMonData(pokemon, MON_DATA_IS_EGG)) + { + bool8 isDoubleBattle = IsLinkDoubleBattle(); + if (isDoubleBattle == TRUE) + { + PartyMenuDrawHPBar(monIndex, PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE, pokemon); + } + else + { + PartyMenuDrawHPBar(monIndex, IsDoubleBattle(), pokemon); + } + } +} + +void PartyMenuDrawHPBars(void) +{ + u8 i; + + for (i = 0; i < PARTY_SIZE; i++) + { + PartyMenuTryDrawHPBar(i, &gPlayerParty[i]); + } +} + +void SwapPokemon(struct Pokemon *a, struct Pokemon *b) +{ + struct Pokemon temp = *a; + *a = *b; + *b = temp; +} + +void SetPartyPopupMenuOffsets(u8 menuIndex, u8 *left, u8 *top, const struct PartyPopupMenu *menu) +{ + u8 bottomOffset = (2 * menu[menuIndex].numChoices) + 2; + u8 rightOffset = menu[menuIndex].width + 1; + + *left = 30 - rightOffset; + *top = 20 - bottomOffset; +} + +void ShowPartyPopupMenu(u8 menuIndex, const struct PartyPopupMenu *menu, const struct MenuAction2 *menuActions, u8 cursorPos) +{ + u8 left; + u8 top; + + SetPartyPopupMenuOffsets(menuIndex, &left, &top, menu); + sub_8089C50(left, top, menu[menuIndex].width, menu[menuIndex].numChoices, menuActions, menu[menuIndex].items); + + InitMenu(0, left + 1, top + 1, menu[menuIndex].numChoices, cursorPos, menu[menuIndex].width - 1); +} + +void ClosePartyPopupMenu(u8 index, const struct PartyPopupMenu *menu) +{ + u8 left; + u8 top; + + SetPartyPopupMenuOffsets(index, &left, &top, menu); + + MenuZeroFillWindowRect(left, top, left + menu[index].width, menu[index].numChoices * 2 + top + 1); + HandleDestroyMenuCursors(); +} + +TaskFunc PartyMenuGetPopupMenuFunc(u8 menuIndex, const struct PartyPopupMenu *menus, const struct MenuAction2 *menuActions, u8 itemIndex) +{ + u8 action = menus[menuIndex].items[itemIndex]; + return menuActions[action].func; +} + +u8 sub_806E834(const u8 *message, u8 arg1) +{ + u8 taskId; + + gUnknown_0202E8F6 = 1; + + MenuDrawTextWindow(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); + MenuPrintMessage(message, WINDOW_LEFT + 1, 15); + + taskId = CreateTask(sub_806E884, 1); + gTasks[taskId].data[0] = arg1; + + return taskId; +} + +static void sub_806E884(u8 taskId) +{ + if (MenuUpdateWindowText()) + { + gUnknown_0202E8F6 = 0; + if (gTasks[taskId].data[0] == 0) + MenuZeroFillWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); + DestroyTask(taskId); + } +} + +void sub_806E8D0(u8 taskId, u16 b, TaskFunc c) +{ + ewram1C000.unk10 = c; + ewram1C000.unk4 = taskId; + ewram1C000.unk5 = sub_806CA38(taskId); + ewram1C000.unk6 = b; + ewram1C000.pokemon = &gPlayerParty[ewram1C000.unk5]; +} + +bool8 PartyMenuUpdateMonHeldItem(struct Pokemon *pkmn, u16 item) +{ + u8 itemData[2]; + + if (ItemIsMail(item) == TRUE) + { + if (GiveMailToMon(pkmn, item) == 0xFF) + return TRUE; + gUnknown_0202E8F4 = 2; + } + else + { + gUnknown_0202E8F4 = 1; + } + + itemData[0] = item; + itemData[1] = item >> 8; + SetMonData(pkmn, MON_DATA_HELD_ITEM, itemData); + return FALSE; +} + +void PartyMenuTryGiveMonHeldItem(u8 taskId, u16 newItem, TaskFunc c) +{ + u16 currentItem; + + gTasks[taskId].func = TaskDummy; + sub_806E8D0(taskId, newItem, c); + currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); + gUnknown_0202E8F4 = 0; + gUnknown_0202E8F8 = 0; + if (currentItem != 0) + { + if (ItemIsMail(currentItem) == TRUE) + { + sub_806E834(gOtherText_MailMustBeRemoved, 1); + CreateTask(party_menu_link_mon_held_item_object, 5); + } + else + { + GetMonNickname(ewram1C000.pokemon, gStringVar1); + CopyItemName(currentItem, gStringVar2); + StringExpandPlaceholders(gStringVar4, gOtherText_AlreadyHolding); + sub_806E834(gStringVar4, 1); + CreateTask(Task_ConfirmGiveHeldItem, 5); + if (ItemIsMail(newItem) == TRUE) + gUnknown_0202E8F8 = currentItem; + } + } + else + { + PartyMenuUpdateMonHeldItem(ewram1C000.pokemon, newItem); + RemoveBagItem(newItem, 1); + if (ItemIsMail(newItem)) + { + gTasks[taskId].func = c; + } + else + { + DisplayGiveHeldItemMessage(ewram1C000.unk5, newItem, 1); + CreateTask(party_menu_link_mon_held_item_object, 5); + } + } +} + +void party_menu_link_mon_held_item_object(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.unk5); + gTasks[ewram1C000.unk4].func = ewram1C000.unk10; + DestroyTask(taskId); + } +} + +void PartyMenuTryGiveMonHeldItem_806EACC(u8 taskId) +{ + s8 selection = ProcessMenuInputNoWrap_(); + + if (selection == 0) + { + u16 currentItem; + + MenuZeroFillWindowRect(23, 8, 29, 13); + currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); + RemoveBagItem(ewram1C000.unk6, 1); + if (AddBagItem(currentItem, 1) == TRUE) + { + PartyMenuUpdateMonHeldItem(ewram1C000.pokemon, ewram1C000.unk6); + if (ItemIsMail(ewram1C000.unk6)) + { + DisplayTakeHeldItemMessage(ewram1C000.unk5, currentItem, 1); + } + else + { + CopyItemName(ewram1C000.unk6, gStringVar1); + StringExpandPlaceholders(gStringVar4, gOtherText_TakenAndReplaced); + sub_806E834(gStringVar4, 1); + } + } + else + { + sub_806E834(gOtherText_BagFullCannotRemoveItem, 0); + AddBagItem(ewram1C000.unk6, 1); + } + } + else + { + if (selection != 1 && selection != -1) + return; + if (selection == -1) + PlaySE(SE_SELECT); + MenuZeroFillWindowRect(23, 8, 29, 13); + } + gTasks[taskId].func = party_menu_link_mon_held_item_object; +} + +void Task_ConfirmGiveHeldItem(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + DisplayYesNoMenu(23, 8, 1); + gTasks[taskId].func = PartyMenuTryGiveMonHeldItem_806EACC; + } +} + +void DisplayGiveHeldItemMessage(u8 a, u16 b, u8 c) +{ + GetMonNickname(&gPlayerParty[a], gStringVar1); + CopyItemName(b, gStringVar2); + StringExpandPlaceholders(gStringVar4, gOtherText_WasGivenToHold); + sub_806E834(gStringVar4, c); +} + +void PartyMenuTryGiveMonMail(u8 taskId, TaskFunc func) +{ + u32 var1; + u16 currentItem; + struct MailStruct *mail; + + gTasks[taskId].func = TaskDummy; + sub_806E8D0(taskId, 0, func); + currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); + gUnknown_0202E8F4 = 0; + var1 = ewram1FE00.unkE00 + 6; + mail = &gSaveBlock1.mail[var1 + ewram1FE00.unkE02]; + + if (currentItem != 0) + { + sub_806E834(gOtherText_PokeHoldingItemCantMail, 1); + CreateTask(party_menu_link_mon_held_item_object, 5); + } + else + { + GiveMailToMon2(ewram1C000.pokemon, mail); + ClearMailStruct(mail); + sub_806E834(gOtherText_MailTransferredMailbox, 1); + CreateTask(party_menu_link_mon_held_item_object, 5); + } +} + +void PartyMenuTryGiveMonHeldItem_806ECE8(u8 taskId, TaskFunc func) +{ + u16 currentItem; + + gTasks[taskId].func = TaskDummy; + sub_806E8D0(taskId, 0, func); + currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); + if (currentItem == 0) + { + StringExpandPlaceholders(gStringVar4, gOtherText_NotHoldingAnything); + sub_806E834(gStringVar4, 0); + CreateTask(party_menu_link_mon_held_item_object, 5); + } + else + { + u8 itemData[2]; + + itemData[0] = 0; + itemData[1] = 0; + if (AddBagItem(currentItem, 1) == TRUE) + { + if (ItemIsMail(currentItem) == TRUE) + TakeMailFromMon(ewram1C000.pokemon); + DisplayTakeHeldItemMessage(ewram1C000.unk5, currentItem, 0); + SetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM, itemData); + } + else + { + sub_806E834(gOtherText_BagFullCannotRemoveItem, 0); + } + CreateTask(party_menu_link_mon_held_item_object, 5); + } +} + +void DisplayTakeHeldItemMessage(u8 a, u16 b, u8 c) +{ + GetMonNickname(&gPlayerParty[a], gStringVar1); + CopyItemName(b, gStringVar2); + StringExpandPlaceholders(gStringVar4, gOtherText_ReceivedTheThingFrom); + sub_806E834(gStringVar4, c); +} + +void DoTakeMail(u8 taskId, TaskFunc func) +{ + gTasks[taskId].func = TaskDummy; + sub_806E8D0(taskId, 0, func); + ewram1C000.unk6 = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); + sub_806E834(gOtherText_SendRemovedMailPrompt, 1); + CreateTask(Task_ConfirmTakeHeldMail, 5); +} + +void Task_LoseMailMessage(u8 taskId) +{ + s8 selection = ProcessMenuInputNoWrap_(); + + if (selection == 0) + { + if (AddBagItem(ewram1C000.unk6, 1) == TRUE) + { + TakeMailFromMon(ewram1C000.pokemon); + sub_806E834(gOtherText_MailTaken, 0); + } + else + { + sub_806E834(gOtherText_BagFullCannotRemoveItem, 0); + } + MenuZeroFillWindowRect(23, 8, 29, 13); + gTasks[taskId].func = party_menu_link_mon_held_item_object; + } + else + { + if (selection != 1 && selection != -1) + return; + if (selection == -1) + PlaySE(SE_SELECT); + MenuZeroFillWindowRect(23, 8, 29, 13); + MenuZeroFillWindowRect(0, 14, 29, 19); + gTasks[taskId].func = party_menu_link_mon_held_item_object; + } +} + +void Task_ConfirmLoseMailMessage(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + DisplayYesNoMenu(23, 8, 1); + gTasks[taskId].func = Task_LoseMailMessage; + } +} + +void Task_TakeHeldMail(u8 taskId) +{ + s8 selection = ProcessMenuInputNoWrap_(); + + if (selection == 0) + { + MenuZeroFillWindowRect(23, 8, 29, 13); + if (TakeMailFromMon2(ewram1C000.pokemon) != 0xFF) + sub_806E834(gOtherText_MailWasSent, 0); + else + sub_806E834(gOtherText_MailboxIsFull, 0); + gTasks[taskId].func = party_menu_link_mon_held_item_object; + } + else + { + if (selection != 1 && selection != -1) + return; + if (selection == -1) + PlaySE(SE_SELECT); + MenuZeroFillWindowRect(23, 8, 29, 13); + sub_806E834(gOtherText_MailRemovedMessageLost, 1); + gTasks[taskId].func = Task_ConfirmLoseMailMessage; + } +} + +void Task_ConfirmTakeHeldMail(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + DisplayYesNoMenu(23, 8, 1); + gTasks[taskId].func = Task_TakeHeldMail; + } +} + +u16 ItemIdToBattleMoveId(u16 item) +{ + u16 machineNumber = item - ITEM_TM01; + return TMHMMoves[machineNumber]; +} + +bool8 pokemon_has_move(struct Pokemon *pkmn, u16 move) +{ + u8 i; + + for (i = 0; i < 4; i++) + { + if (GetMonData(pkmn, MON_DATA_MOVE1 + i) == move) + return TRUE; + } + return FALSE; +} + +void TeachMonTMMove(u8 taskId, u16 move, TaskFunc func) +{ + PlaySE(SE_SELECT); + gTasks[taskId].func = TaskDummy; + sub_806E8D0(taskId, move, func); + CreateTask(Task_TeamMonTMMove, 5); +} + +void Task_TeamMonTMMove(u8 taskId) +{ + GetMonNickname(ewram1C000.pokemon, gStringVar1); + ewram1C000.unk8 = ItemIdToBattleMoveId(ewram1C000.unk6); + StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); + ewram1B000.unk282 = 0; + if (pokemon_has_move(ewram1C000.pokemon, ewram1C000.unk8)) + { + StringExpandPlaceholders(gStringVar4, gOtherText_AlreadyKnows); + sub_806E834(gStringVar4, 1); + gTasks[taskId].func = party_menu_link_mon_held_item_object; + } + else + { + if (!CanMonLearnTMHM(ewram1C000.pokemon, ewram1C000.unk6 - 33)) + { + StringExpandPlaceholders(gStringVar4, gOtherText_NotCompatible); + sub_806E834(gStringVar4, 1); + gTasks[taskId].func = party_menu_link_mon_held_item_object; + } + else + { + if (GiveMoveToMon(ewram1C000.pokemon, ewram1C000.unk8) != 0xFFFF) + { + Task_TeamMonTMMove2(taskId); + } + else + { + StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn); + sub_806E834(gStringVar4, 1); + gTasks[taskId].func = sub_806F358; + } + } + } +} + +void Task_TeamMonTMMove2(u8 taskId) +{ + StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); + StringExpandPlaceholders(gStringVar4, gOtherText_LearnedMove); + sub_806E834(gStringVar4, 1); + AdjustFriendship(ewram1C000.pokemon, 4); + if (ewram1B000.unk282 == 0 && ewram1C000.unk6 <= 0x152) + RemoveBagItem(ewram1C000.unk6, 1); + gTasks[taskId].func = Task_TeamMonTMMove3; +} + +void Task_TeamMonTMMove3(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + PlayFanfare(BGM_FANFA1); + gTasks[taskId].func = Task_TeamMonTMMove4; + } +} + +void Task_TeamMonTMMove4(u8 taskId) +{ + if (IsFanfareTaskInactive()) + { + if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) + { + SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.unk5); + if (ewram1B000.unk282 == 1) + { + TeachMonMoveInPartyMenu(taskId); + } + else + { + gTasks[ewram1C000.unk4].func = ewram1C000.unk10; + DestroyTask(taskId); + } + } + } +} + +void sub_806F2FC(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.unk5); + if (ewram1B000.unk282 == 1) + { + TeachMonMoveInPartyMenu(taskId); + } + else + { + gTasks[ewram1C000.unk4].func = ewram1C000.unk10; + DestroyTask(taskId); + } + } +} + +void sub_806F358(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + DisplayYesNoMenu(23, 8, 1); + gTasks[taskId].func = sub_806F390; + } +} + +void sub_806F390(u8 taskId) +{ + s8 selection = ProcessMenuInputNoWrap_(); + + if (selection == 0) + { + MenuZeroFillWindowRect(23, 8, 29, 13); + sub_806E834(gOtherText_WhichMoveToForget2, 1); + gTasks[taskId].func = sub_806F44C; + } + else + { + if (selection != 1 && selection != -1) + return; + if (selection == -1) + PlaySE(SE_SELECT); + StopTryingToTeachMove_806F614(taskId); + } +} + +void sub_806F3FC(u8 taskId) +{ + if (!gPaletteFade.active) + { + sub_809D9F0(gPlayerParty, ewram1C000.unk5, gPlayerPartyCount - 1, sub_808B564, ewram1C000.unk8); + DestroyTask(taskId); + } +} + +void sub_806F44C(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = sub_806F3FC; + } +} + +void TaughtMove(u8 taskId) +{ + if (!gPaletteFade.active) + { + u8 moveIndex; + u16 r4; + + gTasks[taskId].func = TaskDummy; + sub_806E8D0(taskId, gScriptItemId, sub_808B508); + moveIndex = sub_809FA30(); + r4 = GetMonData(ewram1C000.pokemon, MON_DATA_MOVE1 + moveIndex); + GetMonNickname(ewram1C000.pokemon, gStringVar1); + StringCopy(gStringVar2, gMoveNames[r4]); + StringExpandPlaceholders(gStringVar4, gOtherText_ForgetMove123_2); + sub_806E834(gStringVar4, 1); + CreateTask(TMMoveUpdateMoveSlot, 5); + } +} + +void TMMoveUpdateMoveSlot(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + RemoveMonPPBonus(ewram1C000.pokemon, sub_809FA30()); + SetMonMoveSlot(ewram1C000.pokemon, ewram1C000.unk8, sub_809FA30()); + Task_TeamMonTMMove2(taskId); + } +} + +void StopTryingToTeachMove_806F588(u8 taskId) +{ + if (!gPaletteFade.active) + { + gTasks[taskId].func = TaskDummy; + sub_806E8D0(taskId, gScriptItemId, sub_808B508); + StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); + StringExpandPlaceholders(gStringVar4, gOtherText_StopTryingTo); + sub_806E834(gStringVar4, 1); + CreateTask(StopTryingToTeachMove_806F67C, 5); + } +} + +void StopTryingToTeachMove_806F614(u8 taskId) +{ + MenuZeroFillWindowRect(23, 8, 29, 13); + StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); + StringExpandPlaceholders(gStringVar4, gOtherText_StopTryingTo); + sub_806E834(gStringVar4, 1); + gTasks[taskId].func = StopTryingToTeachMove_806F67C; +} + +void StopTryingToTeachMove_806F67C(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + DisplayYesNoMenu(23, 8, 1); + gTasks[taskId].func = StopTryingToTeachMove_806F6B4; + } +} + +void StopTryingToTeachMove_806F6B4(u8 taskId) +{ + s8 selection = ProcessMenuInputNoWrap_(); + + if (selection == 0) + { + MenuZeroFillWindowRect(23, 8, 29, 13); + GetMonNickname(ewram1C000.pokemon, gStringVar1); + StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); + StringExpandPlaceholders(gStringVar4, gOtherText_DidNotLearnMove2); + sub_806E834(gStringVar4, 1); + gTasks[taskId].func = sub_806F2FC; + } + else + { + if (selection != 1 && selection != -1) + return; + if (selection == -1) + PlaySE(SE_SELECT); + MenuZeroFillWindowRect(23, 8, 29, 13); + GetMonNickname(ewram1C000.pokemon, gStringVar1); + StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); + StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn); + sub_806E834(gStringVar4, 1); + gTasks[taskId].func = sub_806F358; + } +} + +bool8 IsHMMove(u16 move) +{ + u8 i; + + for (i = 0; i < NUM_HIDDEN_MACHINES; i++) + { + if (TMHMMoves[NUM_TECHNICAL_MACHINES + i] == move) + return TRUE; + } + + return FALSE; +} + +s16 sub_806F7E8(u8 taskId, struct BattleInterfaceStruct1 *b, s8 c) +{ + s16 *taskData; + u8 hpBarLevel; + void *vramPtr; + + taskData = gTasks[taskId].data; + + b->unk0 = taskData[10]; + b->unk4 = taskData[11]; + b->unk8 = taskData[12] * c; + b->unk10 = 0x100; + hpBarLevel = GetHPBarLevel(ewram1B000.unk282, b->unk0); + if (hpBarLevel > 2) + b->unkC_0 = 4; + if (hpBarLevel == 2) + b->unkC_0 = 5; + if (hpBarLevel < 2) + b->unkC_0 = 6; + vramPtr = gUnknown_08376858[IsDoubleBattle()][ewram1C000.unk5]; + return sub_80460C8(b, &ewram1C000.unkC, vramPtr, 0); +} + +void sub_806F8AC(u8 taskId) +{ + struct BattleInterfaceStruct1 sp0; + u16 sp14; + + ewram1B000.unk282 = sub_806F7E8(taskId, &sp0, -1); + if (ewram1B000.unk282 == -1) + { + ewram1C000.unkC = 0; + if (-sp0.unk8 + sp0.unk4 > sp0.unk0) + sp14 = sp0.unk0 - sp0.unk4; + else + sp14 = -sp0.unk8; + gBattleMoveDamage = -sp14; + GetMonNickname(ewram1C000.pokemon, gStringVar1); + ConvertIntToDecimalStringN(gStringVar2, sp14, 0, 3); + if (gTasks[taskId].data[14] == 0) + StringExpandPlaceholders(gStringVar4, gOtherText_HPRestoredBy); + else + StringExpandPlaceholders(gStringVar4, gOtherText_RegainedHealth); + SetMonIconAnim(GetMonIconSpriteId(ewram1C000.unk4, ewram1C000.unk5), ewram1C000.pokemon); + task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.unk5 * 2], 7); + ewram1B000.unk261 = 2; + sub_806E834(gStringVar4, 1); + sp14 += sp0.unk4; + SetMonData(ewram1C000.pokemon, MON_DATA_HP, &sp14); + RemoveBagItem(ewram1C000.unk6, 1); + sub_8032638(); + gTasks[taskId].func = sub_806FB44; + } + else + { + PartyMenuDoPrintHP(ewram1C000.unk5, IsDoubleBattle(), ewram1B000.unk282, sp0.unk0); + } +} + +void sub_806FA18(u8 taskId) +{ + struct BattleInterfaceStruct1 sp0; + + ewram1B000.unk282 = sub_806F7E8(taskId, &sp0, 1); + if (ewram1B000.unk282 == -1) + { + PlaySE(SE_KAIFUKU); + ewram1C000.unkC = 0; + gTasks[taskId].data[11] -= gTasks[taskId].data[12]; + SetMonData(ewram1C000.pokemon, MON_DATA_HP, &gTasks[taskId].data[11]); + SetMonIconAnim(GetMonIconSpriteId(ewram1C000.unk4, ewram01000.unk1), ewram1C000.pokemon); + ewram1C000.unk5 = gSprites[ewram01000.unk2].data0; + ewram1C000.pokemon = &gPlayerParty[ewram1C000.unk5]; + gTasks[taskId].data[10] = GetMonData(ewram1C000.pokemon, MON_DATA_MAX_HP); + gTasks[taskId].data[11] = GetMonData(ewram1C000.pokemon, MON_DATA_HP); + ewram1C000.unkC = -32768; + ewram1C000.unk14 = ewram1C000.unk10; + gTasks[taskId].func = sub_806F8AC; + ewram1B000.unk282 = gTasks[taskId].data[11]; + } + else + { + PartyMenuDoPrintHP(ewram1C000.unk5, IsDoubleBattle(), ewram1B000.unk282, sp0.unk0); + } +} + +void sub_806FB0C(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + gTasks[ewram1C000.unk4].func = ewram1C000.unk10; + DestroyTask(taskId); + } +} + +void sub_806FB44(u8 taskId) +{ + if (gUnknown_0202E8F6 == 0) + { + gTasks[ewram1C000.unk4].func = ewram1C000.unk14; + DestroyTask(taskId); + } +} + +bool8 IsHPRecoveryItem(u16 item) +{ + const u8 *itemEffect; + + if (item == ITEM_ENIGMA_BERRY) + itemEffect = gSaveBlock1.enigmaBerry.itemEffect; + else + itemEffect = gItemEffectTable[item - ITEM_POTION]; + + if (itemEffect[4] & 4) + return TRUE; + else + return FALSE; +} + +void PartyMenuUpdateLevelOrStatus(struct Pokemon *pkmn, u8 monIndex) +{ + PartyMenuClearLevelStatusTilemap(monIndex); + PartyMenuPrintMonLevelOrStatus(monIndex, pkmn); +} + +void GetMedicineItemEffectMessage(u16 item) +{ + switch (GetItemEffectType(item)) + { + case 3: + StringExpandPlaceholders(gStringVar4, gOtherText_CuredPoisoning); + break; + case 4: + StringExpandPlaceholders(gStringVar4, gOtherText_WokeUp); + break; + case 5: + StringExpandPlaceholders(gStringVar4, gOtherText_BurnHealed); + break; + case 6: + StringExpandPlaceholders(gStringVar4, gOtherText_ThawedOut); + break; + case 7: + StringExpandPlaceholders(gStringVar4, gOtherText_CuredParalysis); + break; + case 8: + StringExpandPlaceholders(gStringVar4, gOtherText_SnapConfusion); + break; + case 9: + StringExpandPlaceholders(gStringVar4, gOtherText_GotOverLove); + break; + case 11: + StringExpandPlaceholders(gStringVar4, gOtherText_BecameHealthy); + break; + case 13: + StringCopy(gStringVar2, gOtherText_Hp2); + StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); + break; + case 12: + StringCopy(gStringVar2, gOtherText_Attack); + StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); + break; + case 17: + StringCopy(gStringVar2, gOtherText_Defense); + StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); + break; + case 16: + StringCopy(gStringVar2, gOtherText_Speed); + StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); + break; + case 14: + StringCopy(gStringVar2, gOtherText_SpAtk2); + StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); + break; + case 15: + StringCopy(gStringVar2, gOtherText_SpDef2); + StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); + break; + case 19: + case 20: + StringExpandPlaceholders(gStringVar4, gOtherText_PPIncreased); + break; + case 21: + StringExpandPlaceholders(gStringVar4, gOtherText_PPRestored); + break; + default: + StringExpandPlaceholders(gStringVar4, gOtherText_WontHaveAnyEffect); + break; + } +} + +bool8 IsMedicineIneffective(struct Pokemon *pkmn, u16 item) +{ + if (GetItemEffectType(item) == 13 + && GetMonData(pkmn, MON_DATA_SPECIES) == SPECIES_SHEDINJA) + return TRUE; + else + return FALSE; +} + +bool8 ExecuteTableBasedItemEffect__(u8 a, u16 b, u8 c) +{ + if (gMain.inBattle) + return ExecuteTableBasedItemEffect_(&gPlayerParty[a], b, sub_8094C20(a), c); + else + return ExecuteTableBasedItemEffect_(&gPlayerParty[a], b, a, c); +} + +void UseMedicine(u8 taskId, u16 item, TaskFunc func) +{ + u8 r7; + bool8 r9 = FALSE; + bool8 r0; + + gTasks[taskId].func = TaskDummy; + r7 = CreateTask(TaskDummy, 5); + sub_806E8D0(taskId, item, func); + if (!IsMedicineIneffective(ewram1C000.pokemon, item)) + { + r9 = IsHPRecoveryItem(item); + if (r9 == TRUE) + { + gTasks[r7].data[10] = GetMonData(ewram1C000.pokemon, MON_DATA_MAX_HP); + gTasks[r7].data[11] = GetMonData(ewram1C000.pokemon, MON_DATA_HP); + if (gTasks[r7].data[10] == gTasks[r7].data[11]) + { + r9 = FALSE; + gTasks[r7].data[10] = 0; + gTasks[r7].data[11] = 0; + } + } + r0 = ExecuteTableBasedItemEffect__(ewram1C000.unk5, item, 0); + } + else + { + r0 = TRUE; + } + + if (r0) + { + gUnknown_0202E8F4 = 0; + PlaySE(SE_SELECT); + sub_806E834(gOtherText_WontHaveAnyEffect, 1); + gTasks[r7].func = sub_806FB0C; + } + else + { + u8 statusAndPkrs; + + gUnknown_0202E8F4 = 1; + if (!IsBlueYellowRedFlute(item)) + PlaySE(SE_KAIFUKU); + else + PlaySE(SE_BIDORO); + statusAndPkrs = GetMonStatusAndPokerus(ewram1C000.pokemon); + if (statusAndPkrs == 6 || statusAndPkrs == 0) + PartyMenuUpdateLevelOrStatus(ewram1C000.pokemon, ewram1C000.unk5); + if (r9 == TRUE) + { + gTasks[r7].data[12] = GetMonData(ewram1C000.pokemon, MON_DATA_HP) - gTasks[r7].data[11]; + ewram1C000.unkC = -32768; + if (gTasks[r7].data[11] == 0) + gTasks[r7].data[14] = 1; + else + gTasks[r7].data[14] = 0; + ewram1C000.unk14 = ewram1C000.unk10; + gTasks[r7].func = sub_806F8AC; + ewram1B000.unk282 = gTasks[r7].data[11]; + } + else + { + GetMonNickname(ewram1C000.pokemon, gStringVar1); + if (!IsBlueYellowRedFlute(item)) + RemoveBagItem(item, 1); + GetMedicineItemEffectMessage(item); + TryPrintPartyMenuMonNickname(ewram1C000.unk5, ewram1C000.pokemon); + sub_806E834(gStringVar4, 1); + gTasks[r7].func = sub_806FB0C; + } + } +} + +bool8 IsBlueYellowRedFlute(u16 item) +{ + if (item == 0x27 + || item == 0x29 + || item == 0x28) + return TRUE; + else + return FALSE; +} + +void sub_8070048(u8 taskId, u16 item, TaskFunc func) +{ + ewram1C000.unk10 = func; + ewram1C000.unk4 = taskId; + ewram1C000.unk6 = item; + ewram1C000.unk5 = 0; + ewram1C000.unk14 = sub_80701DC; + ewram1B000.unk27E = 0; + ewram1B000.unk280 = 0; + sub_8070088(taskId); +} + +void sub_8070088(u8 taskId) +{ + u8 taskId2; + + gTasks[taskId].func = TaskDummy; + if (GetMonData(&gPlayerParty[ewram1C000.unk5], MON_DATA_SPECIES) == 0) + { + gTasks[taskId].func = sub_80701DC; + } + else + { + s16 *taskData; + + taskId2 = CreateTask(TaskDummy, 5); + taskData = gTasks[taskId2].data; + ewram1C000.pokemon = &gPlayerParty[ewram1C000.unk5]; + taskData[10] = GetMonData(ewram1C000.pokemon, MON_DATA_MAX_HP); + taskData[11] = GetMonData(ewram1C000.pokemon, MON_DATA_HP); + if (ExecuteTableBasedItemEffect__(ewram1C000.unk5, ewram1C000.unk6, 0)) + { + DestroyTask(taskId2); + gTasks[taskId].func = sub_80701DC; + } + else + { + gUnknown_0202E8F4 = 1; + MenuZeroFillWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); + PlaySE(SE_KAIFUKU); + PartyMenuUpdateLevelOrStatus(ewram1C000.pokemon, ewram1C000.unk5); + task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.unk5 * 2], 9); + ewram1B000.unk261 = 2; + taskData[12] = GetMonData(ewram1C000.pokemon, MON_DATA_HP) - taskData[11]; + taskData[14] = 1; + ewram1B000.unk27E = 1; + ewram1B000.unk280 = 1; + ewram1B000.unk282 = taskData[11]; + ewram1C000.unkC = -32768; + gTasks[taskId2].func = sub_806F8AC; + } + } +} + +void sub_80701DC(u8 taskId) +{ + if (ewram1B000.unk27E == 1) + { + AddBagItem(ewram1C000.unk6, 1); + if (GetMonData(&gPlayerParty[ewram1C000.unk5], MON_DATA_SPECIES) != 0) + { + task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.unk5 * 2], 3); + ewram1B000.unk261 = 2; + } + ewram1B000.unk27E = 0; + } + ewram1C000.unk5++; + if (ewram1C000.unk5 == 6) + { + gUnknown_0202E8F4 = 0; + if (ewram1B000.unk280 == 0) + { + gTasks[taskId].func = TaskDummy; + sub_806E834(gOtherText_WontHaveAnyEffect, 1); + CreateTask(sub_806FB0C, 8); + } + else + { + RemoveBagItem(ewram1C000.unk6, 1); + gTasks[taskId].func = ewram1C000.unk10; + } + gLastFieldPokeMenuOpened = 0; + } + else + { + sub_8070088(taskId); + } +} + +void CreateItemUseMoveMenu(u8 partyMonIndex) +{ + u8 r6; + u8 i; + + r6 = 0; + MenuDrawTextWindow(19, 10, 29, 19); + for (i = 0; i < 4; i++) + { + u16 move = GetMonData(&gPlayerParty[partyMonIndex], MON_DATA_MOVE1 + i); + + MenuPrint(gMoveNames[move], 20, i * 2 + 11); + if (move != 0) + r6++; + } + InitMenu(0, 20, 11, r6, 0, 9); +} + +void Task_HandleItemUseMoveMenuInput(u8 taskId) +{ + if (gMain.newKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + MoveMenuCursor(-1); + } + else if (gMain.newKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + MoveMenuCursor(1); + } + else if (gMain.newKeys & A_BUTTON) + { + gUnknown_08376B54[0](taskId); + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + gUnknown_08376B54[1](taskId); + } +} + +void DoPPRecoveryItemEffect(u8 taskId, u16 item, TaskFunc c) +{ + const u8 *itemEffect; + u8 taskId2; + + if (item == ITEM_ENIGMA_BERRY) + itemEffect = gSaveBlock1.enigmaBerry.itemEffect; + else + itemEffect = gItemEffectTable[item - ITEM_POTION]; + gTasks[taskId].func = TaskDummy; + taskId2 = CreateTask(TaskDummy, 5); + sub_806E8D0(taskId, item, c); + if (!(itemEffect[4] & 0x10)) + { + gTasks[taskId2].data[11] = 0; + DoRecoverPP(taskId2); + } + else + { + PlaySE(SE_SELECT); + PrintPartyMenuPromptText(10, 3); + CreateItemUseMoveMenu(ewram1C000.unk5); + gTasks[taskId2].func = Task_HandleItemUseMoveMenuInput; + gMain.newKeys = 0; + } +} + +void ItemUseMoveMenu_HandleMoveSelection(u8 taskId) +{ + HandleDestroyMenuCursors(); + MenuZeroFillWindowRect(19, 10, 29, 19); + sub_806D5A4(); + gTasks[taskId].data[11] = GetMenuCursorPos(); + DoRecoverPP(taskId); +} + +void ItemUseMoveMenu_HandleCancel(u8 taskId) +{ + HandleDestroyMenuCursors(); + MenuZeroFillWindowRect(19, 10, 29, 19); + if (gMain.inBattle) + gTasks[ewram1C000.unk4].func = HandleBattlePartyMenu; + else + gTasks[ewram1C000.unk4].func = sub_808B0C0; + PrintPartyMenuPromptText(3, 0); + DestroyTask(taskId); +} + +void DoRecoverPP(u8 taskId) +{ + u16 r5 = 0; + + if (ExecuteTableBasedItemEffect__(ewram1C000.unk5, ewram1C000.unk6, gTasks[taskId].data[11])) + { + gUnknown_0202E8F4 = r5; + PlaySE(SE_SELECT); + sub_806E834(gOtherText_WontHaveAnyEffect, 1); + } + else + { + gUnknown_0202E8F4 = 1; + PlaySE(SE_KAIFUKU); + RemoveBagItem(ewram1C000.unk6, 1); + r5 = GetMonData(ewram1C000.pokemon, MON_DATA_MOVE1 + gTasks[taskId].data[11]); + StringCopy(gStringVar1, gMoveNames[r5]); + GetMedicineItemEffectMessage(ewram1C000.unk6); + sub_806E834(gStringVar4, 1); + } + gTasks[taskId].func = sub_806FB0C; +} + +void DoPPUpItemEffect(u8 taskId, u16 b, TaskFunc c) +{ + gTasks[taskId].func = TaskDummy; + sub_806E8D0(taskId, b, c); + PlaySE(SE_SELECT); + PrintPartyMenuPromptText(11, 3); + CreateItemUseMoveMenu(ewram1C000.unk5); + CreateTask(Task_HandleItemUseMoveMenuInput, 5); + gMain.newKeys = 0; +} + +void DoRareCandyItemEffect(u8 taskId, u16 b, TaskFunc c) +{ + u8 i; + bool8 r0; + + gTasks[taskId].func = TaskDummy; + sub_806E8D0(taskId, b, c); + + if (GetMonData(ewram1C000.pokemon, MON_DATA_LEVEL) != 100) + { + for (i = 0; i < 6; i++) + ewram1B000.statGrowths[i] = GetMonData(ewram1C000.pokemon, StatDataTypes[i]); + r0 = ExecuteTableBasedItemEffect__(ewram1C000.unk5, b, 0); + } + else + r0 = TRUE; + + if (r0) + { + gUnknown_0202E8F4 = 0; + PlaySE(SE_SELECT); + sub_806E834(gOtherText_WontHaveAnyEffect, 1); + CreateTask(sub_806FB0C, 5); + } + else + { + u8 level; + + gUnknown_0202E8F4 = 1; + PlayFanfareByFanfareNum(0); + RedrawPokemonInfoInMenu(ewram1C000.unk5, ewram1C000.pokemon); + RemoveBagItem(b, 1); + GetMonNickname(ewram1C000.pokemon, gStringVar1); + level = GetMonData(ewram1C000.pokemon, MON_DATA_LEVEL); + ConvertIntToDecimalStringN(gStringVar2, level, 0, 3); + StringExpandPlaceholders(gStringVar4, gOtherText_ElevatedTo); + sub_806E834(gStringVar4, 1); + CreateTask(Task_RareCandy1, 5); + } +} + +void Task_RareCandy1(u8 taskId) +{ + if (WaitFanfare(0) && gUnknown_0202E8F6 == 0) + { + if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) + { + PlaySE(SE_SELECT); + PrintStatGrowthsInLevelUpWindow(taskId); + gTasks[taskId].func = Task_RareCandy2; + } + } +} + +void Task_RareCandy2(u8 taskId) +{ + if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) + { + PlaySE(SE_SELECT); + PrintNewStatsInLevelUpWindow(taskId); + gTasks[taskId].func = Task_RareCandy3; + } +} + +#if ENGLISH +void PrintStatGrowthsInLevelUpWindow(u8 taskId) +{ + u8 i; + + MenuDrawTextWindow(11, 0, 29, 7); + + for (i = 0; i < NUM_STATS; i++) + { + u8 x; + u8 y; + u32 stat; + + stat = GetMonData(ewram1C000.pokemon, StatDataTypes[i]); + + ewram1B000.statGrowths[i + NUM_STATS] = stat; + ewram1B000.statGrowths[i] = stat - ewram1B000.statGrowths[i]; + + x = (i / 3) * 9 + 11; + y = ((i % 3) << 1) + 1; + + MenuPrint_PixelCoords(StatNames[i], (x + 1) * 8, y * 8, 1); + + if (i == 2) + MenuPrint_PixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 0); + else + MenuPrint_PixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 1); + + gStringVar1[0] = EXT_CTRL_CODE_BEGIN; + gStringVar1[1] = 0x14; + gStringVar1[2] = 0x06; + + ConvertIntToDecimalStringN(gStringVar1 + 3, ewram1B000.statGrowths[i], 1, 2); + + MenuPrint_PixelCoords(gStringVar1, (x + 6) * 8 + 12, y * 8, 0); + } +} +#elif GERMAN +__attribute__((naked)) +void PrintStatGrowthsInLevelUpWindow(u8 taskId) { + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + movs r0, 0xB\n\ + movs r1, 0\n\ + movs r2, 0x1D\n\ + movs r3, 0x7\n\ + bl MenuDrawTextWindow\n\ + movs r7, 0\n\ + ldr r0, _0807092C @ =gStringVar1\n\ + mov r10, r0\n\ + movs r1, 0xFC\n\ + mov r9, r1\n\ + movs r2, 0x13\n\ + mov r8, r2\n\ +_0807086C:\n\ + ldr r1, _08070930 @ =0x0201c000\n\ + ldr r0, [r1]\n\ + ldr r1, _08070934 @ =StatDataTypes\n\ + adds r1, r7, r1\n\ + ldrb r1, [r1]\n\ + bl GetMonData\n\ + adds r1, r7, 0x6\n\ + lsls r1, 1\n\ + ldr r2, _08070938 @ =0x0201b264\n\ + adds r1, r2, r1\n\ + strh r0, [r1]\n\ + lsls r6, r7, 1\n\ + adds r6, r2, r6\n\ + ldrh r1, [r6]\n\ + subs r0, r1\n\ + strh r0, [r6]\n\ + adds r0, r7, 0\n\ + movs r1, 0x3\n\ + bl __udivsi3\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r4, r0, 3\n\ + adds r4, r0\n\ + adds r4, 0xB\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + adds r0, r7, 0\n\ + movs r1, 0x3\n\ + bl __umodsi3\n\ + adds r5, r0, 0\n\ + lsls r5, 1\n\ + adds r5, 0x1\n\ + lsls r5, 24\n\ + lsrs r5, 24\n\ + ldr r1, _0807093C @ =StatNames\n\ + lsls r0, r7, 2\n\ + adds r0, r1\n\ + ldr r1, [r0]\n\ + mov r0, r10\n\ + bl StringCopy\n\ + adds r2, r0, 0\n\ + mov r0, r9\n\ + strb r0, [r2]\n\ + adds r2, 0x1\n\ + mov r1, r8\n\ + strb r1, [r2]\n\ + adds r2, 0x1\n\ + movs r0, 0x2E\n\ + strb r0, [r2]\n\ + adds r2, 0x1\n\ + adds r0, r2, 0\n\ + ldr r1, _08070940 @ =gOtherText_TallPlusAndRightArrow\n\ + bl StringCopy\n\ + adds r2, r0, 0\n\ + mov r0, r9\n\ + strb r0, [r2]\n\ + adds r2, 0x1\n\ + mov r1, r8\n\ + strb r1, [r2]\n\ + adds r2, 0x1\n\ + movs r0, 0x34\n\ + strb r0, [r2]\n\ + adds r2, 0x1\n\ + movs r0, 0\n\ + ldrsh r1, [r6, r0]\n\ + adds r0, r2, 0\n\ + movs r2, 0x1\n\ + movs r3, 0x2\n\ + bl ConvertIntToDecimalStringN\n\ + adds r4, 0x1\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + mov r0, r10\n\ + adds r1, r4, 0\n\ + adds r2, r5, 0\n\ + bl MenuPrint\n\ + adds r0, r7, 0x1\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + cmp r7, 0x5\n\ + bls _0807086C\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0807092C: .4byte gStringVar1\n\ +_08070930: .4byte 0x0201c000\n\ +_08070934: .4byte StatDataTypes\n\ +_08070938: .4byte 0x0201b264\n\ +_0807093C: .4byte StatNames\n\ +_08070940: .4byte gOtherText_TallPlusAndRightArrow\n\ + .syntax divided\n"); +} +#endif + +void PrintNewStatsInLevelUpWindow(u8 taskId) +{ + u8 i; + + for (i = 0; i < NUM_STATS; i++) + { + u8 x; + u8 y; + u32 stat; + u32 newStatIndex; + + stat = GetMonData(ewram1C000.pokemon, StatDataTypes[i]); + newStatIndex = i + 6; + ewram1B000.statGrowths[newStatIndex] = stat; + + x = ((i / 3) * 9) + 11; + y = ((i % 3) << 1) + 1; + + gStringVar1[0] = EXT_CTRL_CODE_BEGIN; + gStringVar1[1] = 0x14; + gStringVar1[2] = 0x06; + + ConvertIntToDecimalStringN(gStringVar1 + 3, ewram1B000.statGrowths[newStatIndex], 1, 3); + MenuPrint_PixelCoords(gStringVar1, (x + 6) * 8 + 6, y * 8, 0); + } +} + +void RedrawPokemonInfoInMenu(u8 monIndex, struct Pokemon *pokemon) +{ + u8 statusAndPkrs; + bool8 isDoubleBattle; + u16 currentHP; + u16 maxHP; + u8 icon; + + statusAndPkrs = GetMonStatusAndPokerus(pokemon); + if (statusAndPkrs == 0 || statusAndPkrs == 6) + { + PartyMenuUpdateLevelOrStatus(pokemon, monIndex); + } + + isDoubleBattle = IsDoubleBattle(); + + currentHP = GetMonData(pokemon, MON_DATA_HP); + maxHP = GetMonData(pokemon, MON_DATA_MAX_HP); + + PartyMenuDoPrintHP(monIndex, isDoubleBattle, currentHP, maxHP); + PartyMenuTryDrawHPBar(monIndex, pokemon); + + icon = GetMonIconSpriteId(ewram1C000.unk4, monIndex); + SetMonIconAnim(icon, pokemon); + + task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + monIndex * 2], 7); + ewram1B000.unk261 = 2; +} + +void Task_RareCandy3(u8 taskId) +{ + if (WaitFanfare(0)) + { + if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) + { + u16 learnedMove; + u16 evolutionSpecies; + + MenuZeroFillWindowRect(11, 0, 29, 7); + + learnedMove = MonTryLearningNewMove(ewram1C000.pokemon, TRUE); + ewram1B000.unk282 = 1; + + switch (learnedMove) + { + case 0: + // No move is learned. + evolutionSpecies = GetEvolutionTargetSpecies(ewram1C000.pokemon, 0, 0); + if (evolutionSpecies != 0) + { + gCB2_AfterEvolution = sub_80A53F8; + BeginEvolutionScene(ewram1C000.pokemon, evolutionSpecies, TRUE, ewram1C000.unk5); + DestroyTask(taskId); + } + else + { + sub_8070D90(taskId); + } + break; + case 0xFFFF: + // Mon already knows 4 moves. + GetMonNickname(ewram1C000.pokemon, gStringVar1); + StringCopy(gStringVar2, gMoveNames[gMoveToLearn]); + + StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn); + sub_806E834(gStringVar4, 1); + + ewram1C000.unk8 = gMoveToLearn; + gTasks[taskId].func = sub_806F358; + break; + case 0xFFFE: + // Move was already known by the mon. + gTasks[taskId].func = TeachMonMoveInPartyMenu; + break; + default: + // Mon automatically learned a move because it knew less than four moves. + GetMonNickname(ewram1C000.pokemon, gStringVar1); + StringCopy(gStringVar2, gMoveNames[learnedMove]); + + StringExpandPlaceholders(gStringVar4, gOtherText_LearnedMove); + sub_806E834(gStringVar4, 1); + + gTasks[taskId].func = Task_TeamMonTMMove3; + break; + } + } + } +} + +void TeachMonMoveInPartyMenu(u8 taskId) +{ + u16 learnedMove; + u16 evolutionSpecies; + + learnedMove = MonTryLearningNewMove(ewram1C000.pokemon, FALSE); + switch (learnedMove) + { + case 0: + // No move is learned. + evolutionSpecies = GetEvolutionTargetSpecies(ewram1C000.pokemon, 0, 0); + if (evolutionSpecies != 0) + { + gCB2_AfterEvolution = sub_80A53F8; + BeginEvolutionScene(ewram1C000.pokemon, evolutionSpecies, TRUE, ewram1C000.unk5); + DestroyTask(taskId); + } + else + { + sub_8070D90(taskId); + } + break; + case 0xFFFF: + // Mon already knows 4 moves. + GetMonNickname(ewram1C000.pokemon, gStringVar1); + StringCopy(gStringVar2, gMoveNames[gMoveToLearn]); + + StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn); + sub_806E834(gStringVar4, 1); + + ewram1C000.unk8 = gMoveToLearn; + gTasks[taskId].func = sub_806F358; + break; + case 0xFFFE: + // Move was already known by the mon. Go on the the next move to be learned. + TeachMonMoveInPartyMenu(taskId); + break; + default: + // Mon automatically learned a move because it knew less than four moves. + GetMonNickname(ewram1C000.pokemon, gStringVar1); + StringCopy(gStringVar2, gMoveNames[learnedMove]); + + StringExpandPlaceholders(gStringVar4, gOtherText_LearnedMove); + sub_806E834(gStringVar4, 1); + + gTasks[taskId].func = Task_TeamMonTMMove3; + break; + } +} + +static void sub_8070D90(u8 taskId) +{ + gTasks[ewram1C000.unk4].func = ewram1C000.unk10; + DestroyTask(taskId); +} + +void DoEvolutionStoneItemEffect(u8 taskId, u16 evolutionStoneItem, TaskFunc c) +{ + PlaySE(SE_SELECT); + + gTasks[taskId].func = TaskDummy; + sub_806E8D0(taskId, evolutionStoneItem, c); + + gCB2_AfterEvolution = sub_80A53F8; + + if (ExecuteTableBasedItemEffect__(ewram1C000.unk5, evolutionStoneItem, 0)) + { + gUnknown_0202E8F4 = 0; + sub_806E834(gOtherText_WontHaveAnyEffect, 1); + + CreateTask(sub_806FB0C, 5); + } + else + { + RemoveBagItem(evolutionStoneItem, 1); + } +} + +#ifdef NONMATCHING +u8 GetItemEffectType(u16 item) +{ + const u8 *itemEffect; + register u8 itemEffect0 asm("r1"); + u8 mask; + + // Read the item's effect properties. + if (item == ITEM_ENIGMA_BERRY) + { + itemEffect = gSaveBlock1.enigmaBerry.itemEffect; + } + else + { + itemEffect = gItemEffectTable[item - ITEM_POTION]; + } + + itemEffect0 = itemEffect[0]; + mask = 0x3F; + + if ((itemEffect0 & mask) || itemEffect[1] || itemEffect[2] || (itemEffect[3] & 0x80)) + { + return 0; + } + else if (itemEffect0 & 0x40) + { + return 10; + } + else if (itemEffect[3] & 0x40) + { + return 1; + } + else if ((itemEffect[3] & mask) || (itemEffect0 >> 7)) + { + if ((itemEffect[3] & mask) == 0x20) + { + return 4; + } + else if ((itemEffect[3] & mask) == 0x10) + { + return 3; + } + else if ((itemEffect[3] & mask) == 0x8) + { + return 5; + } + else if ((itemEffect[3] & mask) == 0x4) + { + return 6; + } + else if ((itemEffect[3] & mask) == 0x2) + { + return 7; + } + else if ((itemEffect[3] & mask) == 0x1) + { + return 8; + } + else if ((itemEffect0 >> 7) != 0 && (itemEffect[3] & mask) == 0) + { + return 9; + } + else + { + return 11; + } + } + else if (itemEffect[4] & 0x44) + { + return 2; + } + else if (itemEffect[4] & 0x2) + { + return 12; + } + else if (itemEffect[4] & 0x1) + { + return 13; + } + else if (itemEffect[5] & 0x8) + { + return 14; + } + else if (itemEffect[5] & 0x4) + { + return 15; + } + else if (itemEffect[5] & 0x2) + { + return 16; + } + else if (itemEffect[5] & 0x1) + { + return 17; + } + else if (itemEffect[4] & 0x80) + { + return 18; + } + else if (itemEffect[4] & 0x20) + { + return 19; + } + else if (itemEffect[5] & 0x10) + { + return 20; + } + else if (itemEffect[4] & 0x18) + { + return 21; + } + else + { + return 22; + } +} +#else +__attribute__((naked)) +u8 GetItemEffectType(u16 item) +{ + asm(".syntax unified\n\ + push {r4,r5,lr}\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r0, 0xAF\n\ + bne _08070E5C\n\ + ldr r4, _08070E58 @ =gSaveBlock1 + 0x3676\n\ + b _08070E66\n\ + .align 2, 0\n\ +_08070E58: .4byte gSaveBlock1 + 0x3676\n\ +_08070E5C:\n\ + ldr r1, _08070E8C @ =gItemEffectTable\n\ + subs r0, 0xD\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldr r4, [r0]\n\ +_08070E66:\n\ + ldrb r1, [r4]\n\ + movs r5, 0x3F\n\ + adds r0, r5, 0\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _08070E88\n\ + ldrb r0, [r4, 0x1]\n\ + cmp r0, 0\n\ + bne _08070E88\n\ + ldrb r0, [r4, 0x2]\n\ + cmp r0, 0\n\ + bne _08070E88\n\ + ldrb r3, [r4, 0x3]\n\ + movs r0, 0x80\n\ + ands r0, r3\n\ + cmp r0, 0\n\ + beq _08070E90\n\ +_08070E88:\n\ + movs r0, 0\n\ + b _08070F8A\n\ + .align 2, 0\n\ +_08070E8C: .4byte gItemEffectTable\n\ +_08070E90:\n\ + movs r2, 0x40\n\ + adds r0, r2, 0\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08070E9E\n\ + movs r0, 0xA\n\ + b _08070F8A\n\ +_08070E9E:\n\ + adds r0, r2, 0\n\ + ands r0, r3\n\ + cmp r0, 0\n\ + beq _08070EAA\n\ + movs r0, 0x1\n\ + b _08070F8A\n\ +_08070EAA:\n\ + adds r2, r5, 0\n\ + ands r2, r3\n\ + cmp r2, 0\n\ + bne _08070EB8\n\ + lsrs r0, r1, 7\n\ + cmp r0, 0\n\ + beq _08070EFA\n\ +_08070EB8:\n\ + cmp r2, 0x20\n\ + bne _08070EC0\n\ + movs r0, 0x4\n\ + b _08070F8A\n\ +_08070EC0:\n\ + cmp r2, 0x10\n\ + bne _08070EC8\n\ + movs r0, 0x3\n\ + b _08070F8A\n\ +_08070EC8:\n\ + cmp r2, 0x8\n\ + bne _08070ED0\n\ + movs r0, 0x5\n\ + b _08070F8A\n\ +_08070ED0:\n\ + cmp r2, 0x4\n\ + bne _08070ED8\n\ + movs r0, 0x6\n\ + b _08070F8A\n\ +_08070ED8:\n\ + cmp r2, 0x2\n\ + bne _08070EE0\n\ + movs r0, 0x7\n\ + b _08070F8A\n\ +_08070EE0:\n\ + cmp r2, 0x1\n\ + bne _08070EE8\n\ + movs r0, 0x8\n\ + b _08070F8A\n\ +_08070EE8:\n\ + lsrs r0, r1, 7\n\ + cmp r0, 0\n\ + beq _08070EF6\n\ + cmp r2, 0\n\ + bne _08070EF6\n\ + movs r0, 0x9\n\ + b _08070F8A\n\ +_08070EF6:\n\ + movs r0, 0xB\n\ + b _08070F8A\n\ +_08070EFA:\n\ + ldrb r1, [r4, 0x4]\n\ + movs r0, 0x44\n\ + ands r0, r1\n\ + adds r2, r1, 0\n\ + cmp r0, 0\n\ + beq _08070F0A\n\ + movs r0, 0x2\n\ + b _08070F8A\n\ +_08070F0A:\n\ + movs r5, 0x2\n\ + adds r0, r5, 0\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + beq _08070F18\n\ + movs r0, 0xC\n\ + b _08070F8A\n\ +_08070F18:\n\ + movs r3, 0x1\n\ + adds r0, r3, 0\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + beq _08070F26\n\ + movs r0, 0xD\n\ + b _08070F8A\n\ +_08070F26:\n\ + ldrb r1, [r4, 0x5]\n\ + movs r0, 0x8\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08070F34\n\ + movs r0, 0xE\n\ + b _08070F8A\n\ +_08070F34:\n\ + movs r0, 0x4\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08070F40\n\ + movs r0, 0xF\n\ + b _08070F8A\n\ +_08070F40:\n\ + adds r0, r5, 0\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08070F4C\n\ + movs r0, 0x10\n\ + b _08070F8A\n\ +_08070F4C:\n\ + adds r0, r3, 0\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08070F58\n\ + movs r0, 0x11\n\ + b _08070F8A\n\ +_08070F58:\n\ + movs r0, 0x80\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + beq _08070F64\n\ + movs r0, 0x12\n\ + b _08070F8A\n\ +_08070F64:\n\ + movs r0, 0x20\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + beq _08070F70\n\ + movs r0, 0x13\n\ + b _08070F8A\n\ +_08070F70:\n\ + movs r0, 0x10\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _08070F7C\n\ + movs r0, 0x14\n\ + b _08070F8A\n\ +_08070F7C:\n\ + movs r0, 0x18\n\ + ands r0, r2\n\ + cmp r0, 0\n\ + bne _08070F88\n\ + movs r0, 0x16\n\ + b _08070F8A\n\ +_08070F88:\n\ + movs r0, 0x15\n\ +_08070F8A:\n\ + pop {r4,r5}\n\ + pop {r1}\n\ + bx r1\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +void unref_sub_8070F90(void) +{ + FlagSet(SYS_POKEDEX_GET); + FlagSet(SYS_POKEMON_GET); + FlagSet(SYS_POKENAV_GET); +} diff --git a/src/player_pc.c b/src/field/player_pc.c index 83e6dd221..d01829266 100644 --- a/src/player_pc.c +++ b/src/field/player_pc.c @@ -32,7 +32,7 @@ extern u8 sub_807D770(void); extern void sub_808B020(void); extern void sub_80F944C(void); -static EWRAM_DATA u8 *gPcItemMenuOptionOrder = NULL; +static EWRAM_DATA const u8 *gPcItemMenuOptionOrder = NULL; static u8 gPcItemMenuOptionsNum; @@ -211,14 +211,14 @@ void NewGameInitPCItems(void) void BedroomPC(void) { - gPcItemMenuOptionOrder = (u8 *)gBedroomPC_OptionOrder; + gPcItemMenuOptionOrder = gBedroomPC_OptionOrder; gPcItemMenuOptionsNum = 4; DisplayItemMessageOnField(CreateTask(TaskDummy, 0), gOtherText_WhatWillYouDo, InitPlayerPCMenu, 0); } void PlayerPC(void) { - gPcItemMenuOptionOrder = (u8 *)gPlayerPC_OptionOrder; + gPcItemMenuOptionOrder = gPlayerPC_OptionOrder; gPcItemMenuOptionsNum = 3; DisplayItemMessageOnField(CreateTask(TaskDummy, 0), gOtherText_WhatWillYouDo, InitPlayerPCMenu, 0); } @@ -1064,7 +1064,7 @@ static void Mailbox_DrawMailList(u8 taskId) // taskId is unused if(i != mailbox->count) { - StringCopy(gStringVar1, (u8 *)gSaveBlock1.mail[i + 6].playerName); + StringCopy(gStringVar1, gSaveBlock1.mail[i + 6].playerName); SanitizeNameString(gStringVar1); MenuPrint(gStringVar1, 0x15, yCoord + 2); } diff --git a/src/pokeblock.c b/src/field/pokeblock.c index d69c41639..2ee1a23ae 100644 --- a/src/pokeblock.c +++ b/src/field/pokeblock.c @@ -1,5 +1,5 @@ // -// Created by scott on 6/27/2017. + // #include "global.h" @@ -374,11 +374,11 @@ static bool8 sub_810B998(void) switch (ewram[0x1ffff]) { case 0: - LZDecompressVram(gMenuPokeblock_Gfx, (u8 *)BG_CHAR_ADDR(2)); + LZDecompressVram(gMenuPokeblock_Gfx, BG_CHAR_ADDR(2)); ewram[0x1ffff]++; break; case 1: - sub_800D238(gMenuPokeblock_Tilemap, gBGTilemapBuffers[2]); + LZDecompressWram(gMenuPokeblock_Tilemap, gBGTilemapBuffers[2]); ewram[0x1ffff]++; break; case 2: diff --git a/src/pokenav.c b/src/field/pokenav.c index 84ed7b14b..21d7bb4e3 100644 --- a/src/pokenav.c +++ b/src/field/pokenav.c @@ -38,3 +38,5 @@ void sub_80F700C(u8 *arg0, u16 arg1) { ptr[2] = 0x80; ptr[3] = 0xFF; } + +IWRAM_DATA MainCallback gUnknown_03000744; diff --git a/src/region_map.c b/src/field/region_map.c index 900c9ad71..bfd2729c2 100644 --- a/src/region_map.c +++ b/src/field/region_map.c @@ -140,12 +140,12 @@ static const u16 sRegionMapBkgnd_Pal[] = INCBIN_U16("graphics/pokenav/region_map static const u8 sRegionMapBkgnd_ImageLZ[] = INCBIN_U8("graphics/pokenav/region_map.8bpp.lz"); static const u8 sRegionMapBkgnd_TilemapLZ[] = INCBIN_U8("graphics/pokenav/region_map_map.bin.lz"); -#include "data/region_map_layout.h" +#include "../data/region_map_layout.h" #if ENGLISH -#include "data/region_map_names_en.h" +#include "../data/region_map_names_en.h" #elif GERMAN -#include "data/region_map_names_de.h" +#include "../data/region_map_names_de.h" #endif struct RegionMapLocation diff --git a/src/roamer.c b/src/field/roamer.c index 948828d5e..c45c87601 100644 --- a/src/roamer.c +++ b/src/field/roamer.c @@ -173,13 +173,13 @@ void CreateRoamerMonInstance(void) struct Pokemon *mon = &gEnemyParty[0]; struct Roamer *roamer = &gSaveBlock1.roamer; CreateMonWithIVsPersonality(mon, roamer->species, roamer->level, roamer->ivs, roamer->personality); - SetMonData(mon, MON_DATA_STATUS, (u8 *)&roamer->status); - SetMonData(mon, MON_DATA_HP, (u8 *)&roamer->hp); - SetMonData(mon, MON_DATA_COOL, (u8 *)&roamer->cool); - SetMonData(mon, MON_DATA_BEAUTY, (u8 *)&roamer->beauty); - SetMonData(mon, MON_DATA_CUTE, (u8 *)&roamer->cute); - SetMonData(mon, MON_DATA_SMART, (u8 *)&roamer->smart); - SetMonData(mon, MON_DATA_TOUGH, (u8 *)&roamer->tough); + SetMonData(mon, MON_DATA_STATUS, &roamer->status); + SetMonData(mon, MON_DATA_HP, &roamer->hp); + SetMonData(mon, MON_DATA_COOL, &roamer->cool); + SetMonData(mon, MON_DATA_BEAUTY, &roamer->beauty); + SetMonData(mon, MON_DATA_CUTE, &roamer->cute); + SetMonData(mon, MON_DATA_SMART, &roamer->smart); + SetMonData(mon, MON_DATA_TOUGH, &roamer->tough); } bool8 TryStartRoamerEncounter(void) diff --git a/src/rotating_gate.c b/src/field/rotating_gate.c index e8ab7e1bf..e8ab7e1bf 100644 --- a/src/rotating_gate.c +++ b/src/field/rotating_gate.c diff --git a/src/safari_zone.c b/src/field/safari_zone.c index 14fd1ddc4..14fd1ddc4 100644 --- a/src/safari_zone.c +++ b/src/field/safari_zone.c diff --git a/src/scrcmd.c b/src/field/scrcmd.c index 31a90158a..28584d4d0 100644 --- a/src/scrcmd.c +++ b/src/field/scrcmd.c @@ -91,12 +91,12 @@ static u8 * const sScriptStringVars[] = gStringVar3, }; -bool8 ScrCmd_snop(struct ScriptContext *ctx) +bool8 ScrCmd_nop(struct ScriptContext *ctx) { return FALSE; } -bool8 ScrCmd_snop1(struct ScriptContext *ctx) +bool8 ScrCmd_nop1(struct ScriptContext *ctx) { return FALSE; } @@ -107,9 +107,10 @@ bool8 ScrCmd_end(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_jumpasm(struct ScriptContext *ctx) +bool8 ScrCmd_gotonative(struct ScriptContext *ctx) { bool8 (*addr)(void) = (bool8 (*)(void))ScriptReadWord(ctx); + SetupNativeScript(ctx, addr); return TRUE; } @@ -117,20 +118,23 @@ bool8 ScrCmd_jumpasm(struct ScriptContext *ctx) bool8 ScrCmd_special(struct ScriptContext *ctx) { u16 index = ScriptReadHalfword(ctx); + gSpecials[index](); return FALSE; } -bool8 ScrCmd_specialval(struct ScriptContext *ctx) +bool8 ScrCmd_specialvar(struct ScriptContext *ctx) { u16 *var = GetVarPointer(ScriptReadHalfword(ctx)); + *var = gSpecials[ScriptReadHalfword(ctx)](); return FALSE; } -bool8 ScrCmd_callasm(struct ScriptContext *ctx) +bool8 ScrCmd_callnative(struct ScriptContext *ctx) { NativeFunc func = (NativeFunc)ScriptReadWord(ctx); + func(); return FALSE; } @@ -141,9 +145,10 @@ bool8 ScrCmd_waitstate(struct ScriptContext *ctx) return TRUE; } -bool8 ScrCmd_jump(struct ScriptContext *ctx) +bool8 ScrCmd_goto(struct ScriptContext *ctx) { u8 *ptr = (u8 *)ScriptReadWord(ctx); + ScriptJump(ctx, ptr); return FALSE; } @@ -156,25 +161,27 @@ bool8 ScrCmd_return(struct ScriptContext *ctx) bool8 ScrCmd_call(struct ScriptContext *ctx) { - u8 *ptr = (u8 *)ScriptReadWord(ctx); + ScriptCall(ctx, ptr); return FALSE; } -bool8 ScrCmd_jumpif(struct ScriptContext *ctx) +bool8 ScrCmd_goto_if(struct ScriptContext *ctx) { u8 condition = ScriptReadByte(ctx); u8 *ptr = (u8 *)ScriptReadWord(ctx); + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) ScriptJump(ctx, ptr); return FALSE; } -bool8 ScrCmd_callif(struct ScriptContext *ctx) +bool8 ScrCmd_call_if(struct ScriptContext *ctx) { u8 condition = ScriptReadByte(ctx); u8 *ptr = (u8 *)ScriptReadWord(ctx); + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) ScriptCall(ctx, ptr); return FALSE; @@ -184,13 +191,15 @@ bool8 ScrCmd_setvaddress(struct ScriptContext *ctx) { u32 addr1 = (u32)ctx->scriptPtr - 1; u32 addr2 = ScriptReadWord(ctx); + gUnknown_0202E8B0 = addr2 - addr1; return FALSE; } -bool8 ScrCmd_vjump(struct ScriptContext *ctx) +bool8 ScrCmd_vgoto(struct ScriptContext *ctx) { u32 addr = ScriptReadWord(ctx); + ScriptJump(ctx, (u8 *)(addr - gUnknown_0202E8B0)); return FALSE; } @@ -198,32 +207,36 @@ bool8 ScrCmd_vjump(struct ScriptContext *ctx) bool8 ScrCmd_vcall(struct ScriptContext *ctx) { u32 addr = ScriptReadWord(ctx); + ScriptCall(ctx, (u8 *)(addr - gUnknown_0202E8B0)); return FALSE; } -bool8 ScrCmd_if5(struct ScriptContext *ctx) +bool8 ScrCmd_vgoto_if(struct ScriptContext *ctx) { u8 condition = ScriptReadByte(ctx); u8 *ptr = (u8 *)(ScriptReadWord(ctx) - gUnknown_0202E8B0); + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) ScriptJump(ctx, ptr); return FALSE; } -bool8 ScrCmd_if6(struct ScriptContext *ctx) +bool8 ScrCmd_vcall_if(struct ScriptContext *ctx) { u8 condition = ScriptReadByte(ctx); u8 *ptr = (u8 *)(ScriptReadWord(ctx) - gUnknown_0202E8B0); + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) ScriptCall(ctx, ptr); return FALSE; } -bool8 ScrCmd_jumpstd(struct ScriptContext *ctx) +bool8 ScrCmd_gotostd(struct ScriptContext *ctx) { u8 index = ScriptReadByte(ctx); u8 **ptr = &gStdScripts[index]; + if (ptr < gStdScripts_End) ScriptJump(ctx, *ptr); return FALSE; @@ -233,15 +246,17 @@ bool8 ScrCmd_callstd(struct ScriptContext *ctx) { u8 index = ScriptReadByte(ctx); u8 **ptr = &gStdScripts[index]; + if (ptr < gStdScripts_End) ScriptCall(ctx, *ptr); return FALSE; } -bool8 ScrCmd_jumpstdif(struct ScriptContext *ctx) +bool8 ScrCmd_gotostd_if(struct ScriptContext *ctx) { u8 condition = ScriptReadByte(ctx); u8 index = ScriptReadByte(ctx); + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) { u8 **ptr = &gStdScripts[index]; @@ -251,10 +266,11 @@ bool8 ScrCmd_jumpstdif(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_callstdif(struct ScriptContext *ctx) +bool8 ScrCmd_callstd_if(struct ScriptContext *ctx) { u8 condition = ScriptReadByte(ctx); u8 index = ScriptReadByte(ctx); + if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) { u8 **ptr = &gStdScripts[index]; @@ -264,50 +280,55 @@ bool8 ScrCmd_callstdif(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_jumpram(struct ScriptContext *ctx) +bool8 ScrCmd_gotoram(struct ScriptContext *ctx) { ScriptJump(ctx, (u8 *)gUnknown_0202E8AC); return FALSE; } -bool8 ScrCmd_die(struct ScriptContext *ctx) +bool8 ScrCmd_killscript(struct ScriptContext *ctx) { ClearRamScript(); StopScript(ctx); return TRUE; } -bool8 ScrCmd_setbyte(struct ScriptContext *ctx) +bool8 ScrCmd_setmysteryeventstatus(struct ScriptContext *ctx) { u8 value = ScriptReadByte(ctx); + SetMysteryEventScriptStatus(value); return FALSE; } -bool8 ScrCmd_loadptr(struct ScriptContext *ctx) +bool8 ScrCmd_loadword(struct ScriptContext *ctx) { u8 index = ScriptReadByte(ctx); + ctx->data[index] = ScriptReadWord(ctx); return FALSE; } -bool8 ScrCmd_loadbytefrompointer(struct ScriptContext *ctx) +bool8 ScrCmd_loadbytefromaddr(struct ScriptContext *ctx) { u8 index = ScriptReadByte(ctx); + ctx->data[index] = *(u8 *)ScriptReadWord(ctx); return FALSE; } -bool8 ScrCmd_writebytetooffset(struct ScriptContext *ctx) +bool8 ScrCmd_writebytetoaddr(struct ScriptContext *ctx) { u8 value = ScriptReadByte(ctx); + *(u8 *)ScriptReadWord(ctx) = value; return FALSE; } -bool8 ScrCmd_setbufferbyte(struct ScriptContext *ctx) +bool8 ScrCmd_loadbyte(struct ScriptContext *ctx) { u8 index = ScriptReadByte(ctx); + ctx->data[index] = ScriptReadByte(ctx); return FALSE; } @@ -315,14 +336,16 @@ bool8 ScrCmd_setbufferbyte(struct ScriptContext *ctx) bool8 ScrCmd_setptrbyte(struct ScriptContext *ctx) { u8 index = ScriptReadByte(ctx); + *(u8 *)ScriptReadWord(ctx) = ctx->data[index]; return FALSE; } -bool8 ScrCmd_copybuffers(struct ScriptContext *ctx) +bool8 ScrCmd_copylocal(struct ScriptContext *ctx) { u8 destIndex = ScriptReadByte(ctx); u8 srcIndex = ScriptReadByte(ctx); + ctx->data[destIndex] = ctx->data[srcIndex]; return FALSE; } @@ -359,73 +382,81 @@ u8 compare_012(u16 a1, u16 a2) { if (a1 < a2) return 0; - if (a1 == a2) return 1; - return 2; } -bool8 ScrCmd_comparebuffers(struct ScriptContext *ctx) +// comparelocaltolocal +bool8 ScrCmd_compare_local_to_local(struct ScriptContext *ctx) { u8 value1 = ctx->data[ScriptReadByte(ctx)]; u8 value2 = ctx->data[ScriptReadByte(ctx)]; + ctx->comparisonResult = compare_012(value1, value2); return FALSE; } -bool8 ScrCmd_comparebuffertobyte(struct ScriptContext *ctx) +// comparelocaltoimm +bool8 ScrCmd_compare_local_to_value(struct ScriptContext *ctx) { u8 value1 = ctx->data[ScriptReadByte(ctx)]; u8 value2 = ScriptReadByte(ctx); + ctx->comparisonResult = compare_012(value1, value2); return FALSE; } -bool8 ScrCmd_comparebuffertoptrbyte(struct ScriptContext *ctx) +bool8 ScrCmd_compare_local_to_addr(struct ScriptContext *ctx) { u8 value1 = ctx->data[ScriptReadByte(ctx)]; u8 value2 = *(u8 *)ScriptReadWord(ctx); + ctx->comparisonResult = compare_012(value1, value2); return FALSE; } -bool8 ScrCmd_compareptrbytetobuffer(struct ScriptContext *ctx) +bool8 ScrCmd_compare_addr_to_local(struct ScriptContext *ctx) { u8 value1 = *(u8 *)ScriptReadWord(ctx); u8 value2 = ctx->data[ScriptReadByte(ctx)]; + ctx->comparisonResult = compare_012(value1, value2); return FALSE; } -bool8 ScrCmd_compareptrbytetobyte(struct ScriptContext *ctx) +bool8 ScrCmd_compare_addr_to_value(struct ScriptContext *ctx) { u8 value1 = *(u8 *)ScriptReadWord(ctx); u8 value2 = ScriptReadByte(ctx); + ctx->comparisonResult = compare_012(value1, value2); return FALSE; } -bool8 ScrCmd_compareptrbytes(struct ScriptContext *ctx) +bool8 ScrCmd_compare_addr_to_addr(struct ScriptContext *ctx) { u8 value1 = *(u8 *)ScriptReadWord(ctx); u8 value2 = *(u8 *)ScriptReadWord(ctx); + ctx->comparisonResult = compare_012(value1, value2); return FALSE; } -bool8 ScrCmd_compare(struct ScriptContext *ctx) +bool8 ScrCmd_compare_var_to_value(struct ScriptContext *ctx) { u16 value1 = *GetVarPointer(ScriptReadHalfword(ctx)); u16 value2 = ScriptReadHalfword(ctx); + ctx->comparisonResult = compare_012(value1, value2); return FALSE; } -bool8 ScrCmd_comparevars(struct ScriptContext *ctx) +bool8 ScrCmd_compare_var_to_var(struct ScriptContext *ctx) { u16 *ptr1 = GetVarPointer(ScriptReadHalfword(ctx)); u16 *ptr2 = GetVarPointer(ScriptReadHalfword(ctx)); + ctx->comparisonResult = compare_012(*ptr1, *ptr2); return FALSE; } @@ -447,6 +478,7 @@ bool8 ScrCmd_subvar(struct ScriptContext *ctx) bool8 ScrCmd_random(struct ScriptContext *ctx) { u16 max = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = Random() % max; return FALSE; } @@ -455,6 +487,7 @@ bool8 ScrCmd_additem(struct ScriptContext *ctx) { u16 itemId = VarGet(ScriptReadHalfword(ctx)); u32 quantity = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = AddBagItem(itemId, (u8)quantity); return FALSE; } @@ -463,6 +496,7 @@ bool8 ScrCmd_removeitem(struct ScriptContext *ctx) { u16 itemId = VarGet(ScriptReadHalfword(ctx)); u32 quantity = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = RemoveBagItem(itemId, (u8)quantity); return FALSE; } @@ -471,6 +505,7 @@ bool8 ScrCmd_checkitemspace(struct ScriptContext *ctx) { u16 itemId = VarGet(ScriptReadHalfword(ctx)); u32 quantity = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = CheckBagHasSpace(itemId, (u8)quantity); return FALSE; } @@ -479,6 +514,7 @@ bool8 ScrCmd_checkitem(struct ScriptContext *ctx) { u16 itemId = VarGet(ScriptReadHalfword(ctx)); u32 quantity = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = CheckBagHasItem(itemId, (u8)quantity); return FALSE; } @@ -486,6 +522,7 @@ bool8 ScrCmd_checkitem(struct ScriptContext *ctx) bool8 ScrCmd_checkitemtype(struct ScriptContext *ctx) { u16 itemId = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = GetPocketByItemId(itemId); return FALSE; } @@ -494,6 +531,7 @@ bool8 ScrCmd_addpcitem(struct ScriptContext *ctx) { u16 itemId = VarGet(ScriptReadHalfword(ctx)); u16 quantity = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = AddPCItem(itemId, quantity); return FALSE; } @@ -502,6 +540,7 @@ bool8 ScrCmd_checkpcitem(struct ScriptContext *ctx) { u16 itemId = VarGet(ScriptReadHalfword(ctx)); u16 quantity = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = CheckPCHasItem(itemId, quantity); return FALSE; } @@ -509,6 +548,7 @@ bool8 ScrCmd_checkpcitem(struct ScriptContext *ctx) bool8 ScrCmd_adddecor(struct ScriptContext *ctx) { u32 decorId = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = IsThereStorageSpaceForDecoration(decorId); return FALSE; } @@ -516,6 +556,7 @@ bool8 ScrCmd_adddecor(struct ScriptContext *ctx) bool8 ScrCmd_removedecor(struct ScriptContext *ctx) { u32 decorId = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = sub_81340A8(decorId); return FALSE; } @@ -523,13 +564,15 @@ bool8 ScrCmd_removedecor(struct ScriptContext *ctx) bool8 ScrCmd_checkdecor(struct ScriptContext *ctx) { u32 decorId = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = sub_8134074(decorId); return FALSE; } -bool8 ScrCmd_testdecor(struct ScriptContext *ctx) +bool8 ScrCmd_hasdecor(struct ScriptContext *ctx) { u32 decorId = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = sub_8133FE4(decorId); return FALSE; } @@ -552,22 +595,23 @@ bool8 ScrCmd_checkflag(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_inccounter(struct ScriptContext *ctx) +bool8 ScrCmd_incrementgamestat(struct ScriptContext *ctx) { IncrementGameStat(ScriptReadByte(ctx)); return FALSE; } -bool8 ScrCmd_lighten(struct ScriptContext *ctx) +bool8 ScrCmd_animdarklevel(struct ScriptContext *ctx) { sub_8081594(ScriptReadByte(ctx)); ScriptContext1_Stop(); return TRUE; } -bool8 ScrCmd_darken(struct ScriptContext *ctx) +bool8 ScrCmd_setdarklevel(struct ScriptContext *ctx) { u16 flashLevel = VarGet(ScriptReadHalfword(ctx)); + Overworld_SetFlashLevel(flashLevel); return FALSE; } @@ -591,6 +635,7 @@ bool8 ScrCmd_fadescreendelay(struct ScriptContext *ctx) { u8 duration = ScriptReadByte(ctx); u8 delay = ScriptReadByte(ctx); + fade_screen(duration, delay); SetupNativeScript(ctx, IsPaletteNotActive); return TRUE; @@ -606,28 +651,29 @@ bool8 s28_pause_asm() return FALSE; } -bool8 ScrCmd_pause(struct ScriptContext *ctx) +bool8 ScrCmd_delay(struct ScriptContext *ctx) { sPauseCounter = ScriptReadHalfword(ctx); SetupNativeScript(ctx, s28_pause_asm); return TRUE; } -bool8 ScrCmd_compareflags(struct ScriptContext *ctx) +bool8 ScrCmd_initclock(struct ScriptContext *ctx) { u8 hour = VarGet(ScriptReadHalfword(ctx)); u8 minute = VarGet(ScriptReadHalfword(ctx)); + RtcInitLocalTimeOffset(hour, minute); return FALSE; } -bool8 ScrCmd_checkdailyflags(struct ScriptContext *ctx) +bool8 ScrCmd_dodailyevents(struct ScriptContext *ctx) { DoTimeBasedEvents(); return FALSE; } -bool8 ScrCmd_resetvars(struct ScriptContext *ctx) +bool8 ScrCmd_gettime(struct ScriptContext *ctx) { RtcCalcLocalTime(); gSpecialVar_0x8000 = gLocalTime.hours; @@ -638,8 +684,9 @@ bool8 ScrCmd_resetvars(struct ScriptContext *ctx) bool8 ScrCmd_setweather(struct ScriptContext *ctx) { - u16 value = VarGet(ScriptReadHalfword(ctx)); - SetSav1Weather(value); + u16 weather = VarGet(ScriptReadHalfword(ctx)); + + SetSav1Weather(weather); return FALSE; } @@ -661,47 +708,51 @@ bool8 ScrCmd_tileeffect(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_setmapfooter(struct ScriptContext *ctx) +bool8 ScrCmd_setmaplayoutindex(struct ScriptContext *ctx) { u16 value = VarGet(ScriptReadHalfword(ctx)); + sub_8053D14(value); return FALSE; } bool8 ScrCmd_warp(struct ScriptContext *ctx) { - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u16 v4 = VarGet(ScriptReadHalfword(ctx)); - s8 v5 = VarGet(ScriptReadHalfword(ctx)); - warp1_set(v1, v2, v3, v4, v5); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 warpId = ScriptReadByte(ctx); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); sub_8080E88(); player_avatar_init_params_reset(); return TRUE; } -bool8 ScrCmd_warpmuted(struct ScriptContext *ctx) +bool8 ScrCmd_warpsilent(struct ScriptContext *ctx) { - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u16 v4 = VarGet(ScriptReadHalfword(ctx)); - s8 v5 = VarGet(ScriptReadHalfword(ctx)); - warp1_set(v1, v2, v3, v4, v5); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 warpId = ScriptReadByte(ctx); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); sp13E_warp_to_last_warp(); player_avatar_init_params_reset(); return TRUE; } -bool8 ScrCmd_warpwalk(struct ScriptContext *ctx) +bool8 ScrCmd_warpdoor(struct ScriptContext *ctx) { - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u16 v4 = VarGet(ScriptReadHalfword(ctx)); - s8 v5 = VarGet(ScriptReadHalfword(ctx)); - warp1_set(v1, v2, v3, v4, v5); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 warpId = ScriptReadByte(ctx); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); sub_8080EF0(); player_avatar_init_params_reset(); return TRUE; @@ -709,18 +760,16 @@ bool8 ScrCmd_warpwalk(struct ScriptContext *ctx) bool8 ScrCmd_warphole(struct ScriptContext *ctx) { - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); u16 x; u16 y; PlayerGetDestCoords(&x, &y); - - if (v1 == 0xFF && v2 == 0xFF) + if (mapGroup == 0xFF && mapNum == 0xFF) sub_8053720(x - 7, y - 7); else - warp1_set(v1, v2, -1, x - 7, y - 7); - + Overworld_SetWarpDestination(mapGroup, mapNum, -1, x - 7, y - 7); sp13F_fall_to_last_warp(); player_avatar_init_params_reset(); return TRUE; @@ -728,78 +777,85 @@ bool8 ScrCmd_warphole(struct ScriptContext *ctx) bool8 ScrCmd_warpteleport(struct ScriptContext *ctx) { - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u16 v4 = VarGet(ScriptReadHalfword(ctx)); - s8 v5 = VarGet(ScriptReadHalfword(ctx)); - warp1_set(v1, v2, v3, v4, v5); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 warpId = ScriptReadByte(ctx); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); sub_8080F68(); player_avatar_init_params_reset(); return TRUE; } -bool8 ScrCmd_warp3(struct ScriptContext *ctx) +bool8 ScrCmd_setwarp(struct ScriptContext *ctx) { - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u16 v4 = VarGet(ScriptReadHalfword(ctx)); - s8 v5 = VarGet(ScriptReadHalfword(ctx)); - warp1_set(v1, v2, v3, v4, v5); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 warpId = ScriptReadByte(ctx); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); return FALSE; } -bool8 ScrCmd_warpplace(struct ScriptContext *ctx) +bool8 ScrCmd_setdynamicwarp(struct ScriptContext *ctx) { - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u16 v4 = VarGet(ScriptReadHalfword(ctx)); - s8 v5 = VarGet(ScriptReadHalfword(ctx)); - saved_warp2_set_2(0, v1, v2, v3, v4, v5); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 warpId = ScriptReadByte(ctx); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + saved_warp2_set_2(0, mapGroup, mapNum, warpId, x, y); return FALSE; } -bool8 ScrCmd_warp4(struct ScriptContext *ctx) +bool8 ScrCmd_setdivewarp(struct ScriptContext *ctx) { - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u16 v4 = VarGet(ScriptReadHalfword(ctx)); - s8 v5 = VarGet(ScriptReadHalfword(ctx)); - sub_8053690(v1, v2, v3, v4, v5); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 warpId = ScriptReadByte(ctx); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + sub_8053690(mapGroup, mapNum, warpId, x, y); return FALSE; } -bool8 ScrCmd_warp5(struct ScriptContext *ctx) +bool8 ScrCmd_setholewarp(struct ScriptContext *ctx) { - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u16 v4 = VarGet(ScriptReadHalfword(ctx)); - s8 v5 = VarGet(ScriptReadHalfword(ctx)); - sub_80536E4(v1, v2, v3, v4, v5); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 warpId = ScriptReadByte(ctx); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + sub_80536E4(mapGroup, mapNum, warpId, x, y); return FALSE; } -bool8 ScrCmd_warp6(struct ScriptContext *ctx) +bool8 ScrCmd_setescapewarp(struct ScriptContext *ctx) { - u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u16 v4 = VarGet(ScriptReadHalfword(ctx)); - s8 v5 = VarGet(ScriptReadHalfword(ctx)); - sub_805363C(v1, v2, v3, v4, v5); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 warpId = ScriptReadByte(ctx); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + sub_805363C(mapGroup, mapNum, warpId, x, y); return FALSE; } bool8 ScrCmd_getplayerxy(struct ScriptContext *ctx) { - u16 *ptr1 = GetVarPointer(ScriptReadHalfword(ctx)); - u16 *ptr2 = GetVarPointer(ScriptReadHalfword(ctx)); - *ptr1 = gSaveBlock1.pos.x; - *ptr2 = gSaveBlock1.pos.y; + u16 *pX = GetVarPointer(ScriptReadHalfword(ctx)); + u16 *pY = GetVarPointer(ScriptReadHalfword(ctx)); + + *pX = gSaveBlock1.pos.x; + *pY = gSaveBlock1.pos.y; return FALSE; } @@ -809,7 +865,7 @@ bool8 ScrCmd_countpokemon(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_playsfx(struct ScriptContext *ctx) +bool8 ScrCmd_playse(struct ScriptContext *ctx) { PlaySE(ScriptReadHalfword(ctx)); return FALSE; @@ -823,13 +879,13 @@ static bool8 WaitForSoundEffectFinish() return FALSE; } -bool8 ScrCmd_checksound(struct ScriptContext *ctx) +bool8 ScrCmd_waitse(struct ScriptContext *ctx) { SetupNativeScript(ctx, WaitForSoundEffectFinish); return TRUE; } -bool8 ScrCmd_fanfare(struct ScriptContext *ctx) +bool8 ScrCmd_playfanfare(struct ScriptContext *ctx) { PlayFanfare(ScriptReadHalfword(ctx)); return FALSE; @@ -846,37 +902,39 @@ bool8 ScrCmd_waitfanfare(struct ScriptContext *ctx) return TRUE; } -bool8 ScrCmd_playmusic(struct ScriptContext *ctx) +bool8 ScrCmd_playbgm(struct ScriptContext *ctx) { u16 songId = ScriptReadHalfword(ctx); bool8 val = ScriptReadByte(ctx); + if (val == TRUE) - sav1_set_battle_music_maybe(songId); + Overworld_SetSavedMusic(songId); PlayNewMapMusic(songId); return FALSE; } -bool8 ScrCmd_playmusicbattle(struct ScriptContext *ctx) +bool8 ScrCmd_savebgm(struct ScriptContext *ctx) { - sav1_set_battle_music_maybe(ScriptReadHalfword(ctx)); + Overworld_SetSavedMusic(ScriptReadHalfword(ctx)); return FALSE; } -bool8 ScrCmd_fadedefault(struct ScriptContext *ctx) +bool8 ScrCmd_fadedefaultbgm(struct ScriptContext *ctx) { - sub_8053F84(); + Overworld_ChangeMusicToDefault(); return FALSE; } -bool8 ScrCmd_fademusic(struct ScriptContext *ctx) +bool8 ScrCmd_fadenewbgm(struct ScriptContext *ctx) { Overworld_ChangeMusicTo(ScriptReadHalfword(ctx)); return FALSE; } -bool8 ScrCmd_fadeout(struct ScriptContext *ctx) +bool8 ScrCmd_fadeoutbgm(struct ScriptContext *ctx) { u8 speed = ScriptReadByte(ctx); + if (speed != 0) FadeOutBGMTemporarily(4 * speed); else @@ -885,9 +943,10 @@ bool8 ScrCmd_fadeout(struct ScriptContext *ctx) return TRUE; } -bool8 ScrCmd_fadein(struct ScriptContext *ctx) +bool8 ScrCmd_fadeinbgm(struct ScriptContext *ctx) { u8 speed = ScriptReadByte(ctx); + if (speed != 0) FadeInBGM(4 * speed); else @@ -895,7 +954,7 @@ bool8 ScrCmd_fadein(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_move(struct ScriptContext *ctx) +bool8 ScrCmd_applymovement(struct ScriptContext *ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); void *movementScript = (void *)ScriptReadWord(ctx); @@ -905,7 +964,7 @@ bool8 ScrCmd_move(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_movecoords(struct ScriptContext *ctx) +bool8 ScrCmd_applymovement_at(struct ScriptContext *ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); void *movementScript = (void *)ScriptReadWord(ctx); @@ -922,7 +981,7 @@ static bool8 WaitForMovementFinish(void) return ScriptMovement_IsObjectMovementFinished(sMovingNpcId, sMovingNpcMapId, sMovingNpcMapBank); } -bool8 ScrCmd_waitmove(struct ScriptContext *ctx) +bool8 ScrCmd_waitmovement(struct ScriptContext *ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); @@ -934,7 +993,7 @@ bool8 ScrCmd_waitmove(struct ScriptContext *ctx) return TRUE; } -bool8 ScrCmd_waitmovexy(struct ScriptContext *ctx) +bool8 ScrCmd_waitmovement_at(struct ScriptContext *ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); u8 mapBank; @@ -950,97 +1009,108 @@ bool8 ScrCmd_waitmovexy(struct ScriptContext *ctx) return TRUE; } -bool8 ScrCmd_disappear(struct ScriptContext *ctx) +bool8 ScrCmd_removeobject(struct ScriptContext *ctx) { - u16 objectId = VarGet(ScriptReadHalfword(ctx)); - RemoveFieldObjectByLocalIdAndMap(objectId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); + u16 localId = VarGet(ScriptReadHalfword(ctx)); + + RemoveFieldObjectByLocalIdAndMap(localId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); return FALSE; } -bool8 ScrCmd_disappearxy(struct ScriptContext *ctx) +bool8 ScrCmd_removeobject_at(struct ScriptContext *ctx) { u16 objectId = VarGet(ScriptReadHalfword(ctx)); u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); + RemoveFieldObjectByLocalIdAndMap(objectId, mapNum, mapGroup); return FALSE; } -bool8 ScrCmd_reappear(struct ScriptContext *ctx) +bool8 ScrCmd_addobject(struct ScriptContext *ctx) { u16 objectId = VarGet(ScriptReadHalfword(ctx)); + show_sprite(objectId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); return FALSE; } -bool8 ScrCmd_reappearxy(struct ScriptContext *ctx) +bool8 ScrCmd_addobject_at(struct ScriptContext *ctx) { u16 objectId = VarGet(ScriptReadHalfword(ctx)); u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); + show_sprite(objectId, mapNum, mapGroup); return FALSE; } -bool8 ScrCmd_movesprite(struct ScriptContext *ctx) +bool8 ScrCmd_setobjectxy(struct ScriptContext *ctx) { - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - u16 v2 = VarGet(ScriptReadHalfword(ctx)); - u32 v3 = VarGet(ScriptReadHalfword(ctx)); - sub_805C0F8(v1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, v2, v3); + u16 localId = VarGet(ScriptReadHalfword(ctx)); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + sub_805C0F8(localId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, x, y); return FALSE; } -bool8 ScrCmd_movespriteperm(struct ScriptContext *ctx) +bool8 ScrCmd_setobjectxyperm(struct ScriptContext *ctx) { - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - u16 v2 = VarGet(ScriptReadHalfword(ctx)); - u32 v3 = VarGet(ScriptReadHalfword(ctx)); - Overworld_SaveMapObjCoords(v1, v2, v3); + u16 localId = VarGet(ScriptReadHalfword(ctx)); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u16 y = VarGet(ScriptReadHalfword(ctx)); + + Overworld_SetMapObjTemplateCoords(localId, x, y); return FALSE; } -bool8 ScrCmd_moveoffscreen(struct ScriptContext *ctx) +bool8 ScrCmd_moveobjectoffscreen(struct ScriptContext *ctx) { - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - sub_805C78C(v1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); + u16 localId = VarGet(ScriptReadHalfword(ctx)); + + sub_805C78C(localId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); return FALSE; } -bool8 ScrCmd_spritevisible(struct ScriptContext *ctx) +bool8 ScrCmd_showobject(struct ScriptContext *ctx) { - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - npc_by_local_id_and_map_set_field_1_bit_x20(v1, v3, v2, 0); + u16 localId = VarGet(ScriptReadHalfword(ctx)); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + + npc_by_local_id_and_map_set_field_1_bit_x20(localId, mapNum, mapGroup, 0); return FALSE; } -bool8 ScrCmd_spriteinvisible(struct ScriptContext *ctx) +bool8 ScrCmd_hideobject(struct ScriptContext *ctx) { - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - npc_by_local_id_and_map_set_field_1_bit_x20(v1, v3, v2, 1); + u16 localId = VarGet(ScriptReadHalfword(ctx)); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + + npc_by_local_id_and_map_set_field_1_bit_x20(localId, mapNum, mapGroup, 1); return FALSE; } -bool8 ScrCmd_spritelevelup(struct ScriptContext *ctx) +bool8 ScrCmd_setobjectpriority(struct ScriptContext *ctx) { - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - u8 v4 = ScriptReadByte(ctx); - sub_805BCF0(v1, v3, v2, v4 + 83); + u16 localId = VarGet(ScriptReadHalfword(ctx)); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + u8 priority = ScriptReadByte(ctx); + + sub_805BCF0(localId, mapNum, mapGroup, priority + 83); return FALSE; } -bool8 ScrCmd_restorespritelevel(struct ScriptContext *ctx) +bool8 ScrCmd_resetobjectpriority(struct ScriptContext *ctx) { - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - sub_805BD48(v1, v3, v2); + u16 localId = VarGet(ScriptReadHalfword(ctx)); + u8 mapGroup = ScriptReadByte(ctx); + u8 mapNum = ScriptReadByte(ctx); + + sub_805BD48(localId, mapNum, mapGroup); return FALSE; } @@ -1054,39 +1124,43 @@ bool8 ScrCmd_faceplayer(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_spriteface(struct ScriptContext *ctx) +bool8 ScrCmd_turnobject(struct ScriptContext *ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); u8 direction = ScriptReadByte(ctx); + FieldObjectTurnByLocalIdAndMap(localId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, direction); return FALSE; } -bool8 ScrCmd_spritebehave(struct ScriptContext *ctx) +bool8 ScrCmd_setobjectmovementtype(struct ScriptContext *ctx) { - u16 v1 = VarGet(ScriptReadHalfword(ctx)); - u8 v2 = ScriptReadByte(ctx); - Overworld_SaveMapObjMovementType(v1, v2); + u16 localId = VarGet(ScriptReadHalfword(ctx)); + u8 movementType = ScriptReadByte(ctx); + + Overworld_SetMapObjTemplateMovementType(localId, movementType); return FALSE; } -bool8 ScrCmd_createvsprite(struct ScriptContext *ctx) +bool8 ScrCmd_createvobject(struct ScriptContext *ctx) { - u8 v1 = ScriptReadByte(ctx); + u8 graphicsId = ScriptReadByte(ctx); u8 v2 = ScriptReadByte(ctx); - u16 v3 = VarGet(ScriptReadHalfword(ctx)); - u32 v4 = VarGet(ScriptReadHalfword(ctx)); - u8 v5 = ScriptReadByte(ctx); - u8 v6 = ScriptReadByte(ctx); - sub_805B410(v1, v2, v3, v4, v5, v6); + u16 x = VarGet(ScriptReadHalfword(ctx)); + u32 y = VarGet(ScriptReadHalfword(ctx)); + u8 elevation = ScriptReadByte(ctx); + u8 direction = ScriptReadByte(ctx); + + sub_805B410(graphicsId, v2, x, y, elevation, direction); return FALSE; } -bool8 ScrCmd_vspriteface(struct ScriptContext *ctx) +bool8 ScrCmd_turnvobject(struct ScriptContext *ctx) { u8 v1 = ScriptReadByte(ctx); - u8 v2 = ScriptReadByte(ctx); - sub_8064990(v1, v2); + u8 direction = ScriptReadByte(ctx); + + sub_8064990(v1, direction); return FALSE; } @@ -1122,7 +1196,6 @@ bool8 ScrCmd_lock(struct ScriptContext *ctx) ScriptFreezeMapObjects(); SetupNativeScript(ctx, sub_8064CFC); } - return TRUE; } } @@ -1156,34 +1229,36 @@ bool8 ScrCmd_release(struct ScriptContext *ctx) bool8 ScrCmd_message(struct ScriptContext *ctx) { u8 *msg = (u8 *)ScriptReadWord(ctx); - if (!msg) + + if (msg == NULL) msg = (u8 *)ctx->data[0]; ShowFieldMessage(msg); return FALSE; } -bool8 ScrCmd_message2(struct ScriptContext *ctx) +bool8 ScrCmd_messageautoscroll(struct ScriptContext *ctx) { u8 *msg = (u8 *)ScriptReadWord(ctx); - if (!msg) + + if (msg == NULL) msg = (u8 *)ctx->data[0]; ShowFieldAutoScrollMessage(msg); return FALSE; } -bool8 ScrCmd_waittext(struct ScriptContext *ctx) +bool8 ScrCmd_waitmessage(struct ScriptContext *ctx) { SetupNativeScript(ctx, IsFieldMessageBoxHidden); return TRUE; } -bool8 ScrCmd_closebutton(struct ScriptContext *ctx) +bool8 ScrCmd_closemessage(struct ScriptContext *ctx) { HideFieldMessageBox(); return FALSE; } -bool8 WaitForAorBPress(void) +static bool8 WaitForAorBPress(void) { if (gMain.newKeys & A_BUTTON) return TRUE; @@ -1202,6 +1277,7 @@ bool8 ScrCmd_yesnobox(struct ScriptContext *ctx) { u8 left = ScriptReadByte(ctx); u8 top = ScriptReadByte(ctx); + if (ScriptMenu_YesNo(left, top) == TRUE) { ScriptContext1_Stop(); @@ -1219,6 +1295,7 @@ bool8 ScrCmd_multichoice(struct ScriptContext *ctx) u8 top = ScriptReadByte(ctx); u8 multichoiceId = ScriptReadByte(ctx); u8 ignoreBPress = ScriptReadByte(ctx); + if (ScriptMenu_Multichoice(left, top, multichoiceId, ignoreBPress) == TRUE) { ScriptContext1_Stop(); @@ -1230,13 +1307,14 @@ bool8 ScrCmd_multichoice(struct ScriptContext *ctx) } } -bool8 ScrCmd_multichoicedef(struct ScriptContext *ctx) +bool8 ScrCmd_multichoicedefault(struct ScriptContext *ctx) { u8 left = ScriptReadByte(ctx); u8 top = ScriptReadByte(ctx); u8 multichoiceId = ScriptReadByte(ctx); u8 defaultChoice = ScriptReadByte(ctx); u8 ignoreBPress = ScriptReadByte(ctx); + if (ScriptMenu_MultichoiceWithDefault(left, top, multichoiceId, ignoreBPress, defaultChoice) == TRUE) { ScriptContext1_Stop(); @@ -1248,23 +1326,25 @@ bool8 ScrCmd_multichoicedef(struct ScriptContext *ctx) } } -bool8 ScrCmd_showbox(struct ScriptContext *ctx) +bool8 ScrCmd_drawbox(struct ScriptContext *ctx) { u8 left = ScriptReadByte(ctx); u8 top = ScriptReadByte(ctx); u8 right = ScriptReadByte(ctx); u8 bottom = ScriptReadByte(ctx); + MenuDrawTextWindow(left, top, right, bottom); return FALSE; } -bool8 ScrCmd_multichoicerow(struct ScriptContext *ctx) +bool8 ScrCmd_multichoicegrid(struct ScriptContext *ctx) { u8 left = ScriptReadByte(ctx); u8 top = ScriptReadByte(ctx); u8 multichoiceId = ScriptReadByte(ctx); u8 numColumns = ScriptReadByte(ctx); u8 ignoreBPress = ScriptReadByte(ctx); + if (ScriptMenu_MultichoiceGrid(left, top, multichoiceId, ignoreBPress, numColumns) == TRUE) { ScriptContext1_Stop(); @@ -1276,23 +1356,25 @@ bool8 ScrCmd_multichoicerow(struct ScriptContext *ctx) } } -bool8 ScrCmd_hidebox(struct ScriptContext *ctx) +bool8 ScrCmd_erasebox(struct ScriptContext *ctx) { u8 left = ScriptReadByte(ctx); u8 top = ScriptReadByte(ctx); u8 right = ScriptReadByte(ctx); u8 bottom = ScriptReadByte(ctx); + MenuZeroFillWindowRect(left, top, right, bottom); return FALSE; } // unused -bool8 ScrCmd_clearbox(struct ScriptContext *ctx) +bool8 ScrCmd_drawboxtext(struct ScriptContext *ctx) { u8 left = ScriptReadByte(ctx); u8 top = ScriptReadByte(ctx); u8 multichoiceId = ScriptReadByte(ctx); u8 ignoreBPress = ScriptReadByte(ctx); + if (Multichoice(left, top, multichoiceId, ignoreBPress) == TRUE) { ScriptContext1_Stop(); @@ -1304,16 +1386,17 @@ bool8 ScrCmd_clearbox(struct ScriptContext *ctx) } } -bool8 ScrCmd_showpokepic(struct ScriptContext *ctx) +bool8 ScrCmd_drawpokepic(struct ScriptContext *ctx) { u16 species = VarGet(ScriptReadHalfword(ctx)); u8 x = ScriptReadByte(ctx); u8 y = ScriptReadByte(ctx); + ScriptMenu_ShowPokemonPic(species, x, y); return FALSE; } -bool8 ScrCmd_hidepokepic(struct ScriptContext *ctx) +bool8 ScrCmd_erasepokepic(struct ScriptContext *ctx) { bool8 (*func)(void) = ScriptMenu_GetPicboxWaitFunc(); @@ -1323,9 +1406,10 @@ bool8 ScrCmd_hidepokepic(struct ScriptContext *ctx) return TRUE; } -bool8 ScrCmd_showcontestwinner(struct ScriptContext *ctx) +bool8 ScrCmd_drawcontestwinner(struct ScriptContext *ctx) { u8 v1 = ScriptReadByte(ctx); + if (v1) sub_8106630(v1); ShowContestWinner(); @@ -1333,9 +1417,10 @@ bool8 ScrCmd_showcontestwinner(struct ScriptContext *ctx) return TRUE; } -bool8 ScrCmd_braillemsg(struct ScriptContext *ctx) +bool8 ScrCmd_braillemessage(struct ScriptContext *ctx) { u8 *ptr = (u8 *)ScriptReadWord(ctx); + u8 v2 = ptr[0]; u8 v3 = ptr[1]; u8 v4 = ptr[2]; @@ -1348,24 +1433,27 @@ bool8 ScrCmd_braillemsg(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_vtext(struct ScriptContext *ctx) +bool8 ScrCmd_vmessage(struct ScriptContext *ctx) { u32 v1 = ScriptReadWord(ctx); + ShowFieldMessage((u8 *)(v1 - gUnknown_0202E8B0)); return FALSE; } -bool8 ScrCmd_bufferpoke(struct ScriptContext *ctx) +bool8 ScrCmd_getspeciesname(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u16 species = VarGet(ScriptReadHalfword(ctx)); + StringCopy(sScriptStringVars[stringVarIndex], gSpeciesNames[species]); return FALSE; } -bool8 ScrCmd_bufferfirstpoke(struct ScriptContext *ctx) +bool8 ScrCmd_getfirstpartypokename(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); + u8 *dest = sScriptStringVars[stringVarIndex]; u8 partyIndex = GetLeadMonIndex(); u32 species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES, NULL); @@ -1373,82 +1461,91 @@ bool8 ScrCmd_bufferfirstpoke(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_bufferpartypoke(struct ScriptContext *ctx) +bool8 ScrCmd_getpartypokename(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u16 partyIndex = VarGet(ScriptReadHalfword(ctx)); + GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, sScriptStringVars[stringVarIndex]); StringGetEnd10(sScriptStringVars[stringVarIndex]); return FALSE; } -bool8 ScrCmd_bufferitem(struct ScriptContext *ctx) +bool8 ScrCmd_getitemname(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u16 itemId = VarGet(ScriptReadHalfword(ctx)); + CopyItemName(itemId, sScriptStringVars[stringVarIndex]); return FALSE; } -bool8 ScrCmd_bufferdecor(struct ScriptContext *ctx) +bool8 ScrCmd_getdecorname(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u16 decorId = VarGet(ScriptReadHalfword(ctx)); + StringCopy(sScriptStringVars[stringVarIndex], gDecorations[decorId].name); return FALSE; } -bool8 ScrCmd_bufferattack(struct ScriptContext *ctx) +bool8 ScrCmd_getmovename(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u16 moveId = VarGet(ScriptReadHalfword(ctx)); + StringCopy(sScriptStringVars[stringVarIndex], gMoveNames[moveId]); return FALSE; } -bool8 ScrCmd_buffernum(struct ScriptContext *ctx) +bool8 ScrCmd_getnumberstring(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u16 v1 = VarGet(ScriptReadHalfword(ctx)); u8 v2 = sub_80BF0B8(v1); + ConvertIntToDecimalStringN(sScriptStringVars[stringVarIndex], v1, 0, v2); return FALSE; } -bool8 ScrCmd_bufferstd(struct ScriptContext *ctx) +bool8 ScrCmd_getstdstring(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u16 index = VarGet(ScriptReadHalfword(ctx)); + StringCopy(sScriptStringVars[stringVarIndex], gUnknown_083CE048[index]); return FALSE; } -bool8 ScrCmd_buffertext(struct ScriptContext *ctx) +bool8 ScrCmd_getstring(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u8 *text = (u8 *)ScriptReadWord(ctx); + StringCopy(sScriptStringVars[stringVarIndex], text); return FALSE; } -bool8 ScrCmd_vloadptr(struct ScriptContext *ctx) +bool8 ScrCmd_vloadword(struct ScriptContext *ctx) { u8 *ptr = (u8 *)(ScriptReadWord(ctx) - gUnknown_0202E8B0); + StringExpandPlaceholders(gStringVar4, ptr); return FALSE; } -bool8 ScrCmd_vbuffer(struct ScriptContext *ctx) +bool8 ScrCmd_vgetstring(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); u32 addr = ScriptReadWord(ctx); + u8 *src = (u8 *)(addr - gUnknown_0202E8B0); u8 *dest = sScriptStringVars[stringVarIndex]; StringCopy(dest, src); return FALSE; } -bool8 ScrCmd_givepokemon(struct ScriptContext *ctx) +bool8 ScrCmd_givepoke(struct ScriptContext *ctx) { u16 species = VarGet(ScriptReadHalfword(ctx)); u8 level = ScriptReadByte(ctx); @@ -1456,6 +1553,7 @@ bool8 ScrCmd_givepokemon(struct ScriptContext *ctx) u32 unkParam1 = ScriptReadWord(ctx); u32 unkParam2 = ScriptReadWord(ctx); u8 unkParam3 = ScriptReadByte(ctx); + gScriptResult = ScriptGiveMon(species, level, item, unkParam1, unkParam2, unkParam3); return FALSE; } @@ -1463,6 +1561,7 @@ bool8 ScrCmd_givepokemon(struct ScriptContext *ctx) bool8 ScrCmd_giveegg(struct ScriptContext *ctx) { u16 species = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = ScriptGiveEgg(species); return FALSE; } @@ -1472,14 +1571,16 @@ bool8 ScrCmd_setpokemove(struct ScriptContext *ctx) u8 partyIndex = ScriptReadByte(ctx); u8 slot = ScriptReadByte(ctx); u16 move = ScriptReadHalfword(ctx); + ScriptSetMonMoveSlot(partyIndex, move, slot); return FALSE; } -bool8 ScrCmd_checkattack(struct ScriptContext *ctx) +bool8 ScrCmd_checkpokemove(struct ScriptContext *ctx) { u8 i; u16 moveId = ScriptReadHalfword(ctx); + gScriptResult = 6; for (i = 0; i < 6; i++) { @@ -1501,15 +1602,17 @@ bool8 ScrCmd_givemoney(struct ScriptContext *ctx) { u32 amount = ScriptReadWord(ctx); u8 ignore = ScriptReadByte(ctx); + if (!ignore) AddMoney(&gSaveBlock1.money, amount); return FALSE; } -bool8 ScrCmd_paymoney(struct ScriptContext *ctx) +bool8 ScrCmd_takemoney(struct ScriptContext *ctx) { u32 amount = ScriptReadWord(ctx); u8 ignore = ScriptReadByte(ctx); + if (!ignore) RemoveMoney(&gSaveBlock1.money, amount); return FALSE; @@ -1519,60 +1622,67 @@ bool8 ScrCmd_checkmoney(struct ScriptContext *ctx) { u32 amount = ScriptReadWord(ctx); u8 ignore = ScriptReadByte(ctx); + if (!ignore) gScriptResult = IsEnoughMoney(gSaveBlock1.money, amount); return FALSE; } -bool8 ScrCmd_showmoney(struct ScriptContext *ctx) +bool8 ScrCmd_showmoneybox(struct ScriptContext *ctx) { u8 x = ScriptReadByte(ctx); u8 y = ScriptReadByte(ctx); u8 ignore = ScriptReadByte(ctx); + if (!ignore) OpenMoneyWindow(gSaveBlock1.money, x, y); return FALSE; } -bool8 ScrCmd_hidemoney(struct ScriptContext *ctx) +bool8 ScrCmd_hidemoneybox(struct ScriptContext *ctx) { u8 x = ScriptReadByte(ctx); u8 y = ScriptReadByte(ctx); + CloseMoneyWindow(x, y); return FALSE; } -bool8 ScrCmd_updatemoney(struct ScriptContext *ctx) +bool8 ScrCmd_updatemoneybox(struct ScriptContext *ctx) { - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); + u8 x = ScriptReadByte(ctx); + u8 y = ScriptReadByte(ctx); u8 ignore = ScriptReadByte(ctx); + if (!ignore) - UpdateMoneyWindow(gSaveBlock1.money, v2, v3); + UpdateMoneyWindow(gSaveBlock1.money, x, y); return FALSE; } -bool8 ScrCmd_showcoins(struct ScriptContext *ctx) +bool8 ScrCmd_showcoinsbox(struct ScriptContext *ctx) { - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - ShowCoinsWindow(gSaveBlock1.coins, v2, v3); + u8 x = ScriptReadByte(ctx); + u8 y = ScriptReadByte(ctx); + + ShowCoinsWindow(gSaveBlock1.coins, x, y); return FALSE; } -bool8 ScrCmd_hidecoins(struct ScriptContext *ctx) +bool8 ScrCmd_hidecoinsbox(struct ScriptContext *ctx) { - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - HideCoinsWindow(v2, v3); + u8 x = ScriptReadByte(ctx); + u8 y = ScriptReadByte(ctx); + + HideCoinsWindow(x, y); return FALSE; } -bool8 ScrCmd_updatecoins(struct ScriptContext *ctx) +bool8 ScrCmd_updatecoinsbox(struct ScriptContext *ctx) { - u8 v2 = ScriptReadByte(ctx); - u8 v3 = ScriptReadByte(ctx); - UpdateCoinsWindow(gSaveBlock1.coins, v2, v3); + u8 x = ScriptReadByte(ctx); + u8 y = ScriptReadByte(ctx); + + UpdateCoinsWindow(gSaveBlock1.coins, x, y); return FALSE; } @@ -1582,19 +1692,19 @@ bool8 ScrCmd_trainerbattle(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_reptrainerbattle(struct ScriptContext *ctx) +bool8 ScrCmd_battlebegin(struct ScriptContext *ctx) { BattleSetup_StartTrainerBattle(); return TRUE; } -bool8 ScrCmd_endtrainerbattle(struct ScriptContext *ctx) +bool8 ScrCmd_ontrainerbattleend(struct ScriptContext *ctx) { ctx->scriptPtr = BattleSetup_GetScriptAddrAfterBattle(); return FALSE; } -bool8 ScrCmd_endtrainerbattle2(struct ScriptContext *ctx) +bool8 ScrCmd_ontrainerbattleendgoto(struct ScriptContext *ctx) { ctx->scriptPtr = BattleSetup_GetTrainerPostBattleScript(); return FALSE; @@ -1603,20 +1713,23 @@ bool8 ScrCmd_endtrainerbattle2(struct ScriptContext *ctx) bool8 ScrCmd_checktrainerflag(struct ScriptContext *ctx) { u16 index = VarGet(ScriptReadHalfword(ctx)); + ctx->comparisonResult = HasTrainerAlreadyBeenFought(index); return FALSE; } -bool8 ScrCmd_cleartrainerflag(struct ScriptContext *ctx) +bool8 ScrCmd_settrainerflag(struct ScriptContext *ctx) { u16 index = VarGet(ScriptReadHalfword(ctx)); + trainer_flag_set(index); return FALSE; } -bool8 ScrCmd_settrainerflag(struct ScriptContext *ctx) +bool8 ScrCmd_cleartrainerflag(struct ScriptContext *ctx) { u16 index = VarGet(ScriptReadHalfword(ctx)); + trainer_flag_clear(index); return FALSE; } @@ -1626,6 +1739,7 @@ bool8 ScrCmd_setwildbattle(struct ScriptContext *ctx) u16 species = ScriptReadHalfword(ctx); u8 level = ScriptReadByte(ctx); u16 item = ScriptReadHalfword(ctx); + CreateScriptedWildMon(species, level, item); return FALSE; } @@ -1640,6 +1754,7 @@ bool8 ScrCmd_dowildbattle(struct ScriptContext *ctx) bool8 ScrCmd_pokemart(struct ScriptContext *ctx) { void *ptr = (void *)ScriptReadWord(ctx); + CreatePokemartMenu(ptr); ScriptContext1_Stop(); return TRUE; @@ -1648,6 +1763,7 @@ bool8 ScrCmd_pokemart(struct ScriptContext *ctx) bool8 ScrCmd_pokemartdecor(struct ScriptContext *ctx) { void *ptr = (void *)ScriptReadWord(ctx); + CreateDecorationShop1Menu(ptr); ScriptContext1_Stop(); return TRUE; @@ -1656,24 +1772,27 @@ bool8 ScrCmd_pokemartdecor(struct ScriptContext *ctx) bool8 ScrCmd_pokemartbp(struct ScriptContext *ctx) { void *ptr = (void *)ScriptReadWord(ctx); + CreateDecorationShop2Menu(ptr); ScriptContext1_Stop(); return TRUE; } -bool8 ScrCmd_pokecasino(struct ScriptContext *ctx) +bool8 ScrCmd_playslotmachine(struct ScriptContext *ctx) { u8 v2 = VarGet(ScriptReadHalfword(ctx)); + PlaySlotMachine(v2, c2_exit_to_overworld_1_continue_scripts_restart_music); ScriptContext1_Stop(); return TRUE; } -bool8 ScrCmd_event_8a(struct ScriptContext *ctx) +bool8 ScrCmd_plantberrytree(struct ScriptContext *ctx) { u8 treeId = ScriptReadByte(ctx); u8 berry = ScriptReadByte(ctx); u8 growthStage = ScriptReadByte(ctx); + if (berry == 0) PlantBerryTree(treeId, 0, growthStage, FALSE); else @@ -1681,9 +1800,10 @@ bool8 ScrCmd_event_8a(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_event_96(struct ScriptContext *ctx) +bool8 ScrCmd_getpricereduction(struct ScriptContext *ctx) { u16 value = VarGet(ScriptReadHalfword(ctx)); + gScriptResult = GetPriceReduction(value); return FALSE; } @@ -1716,17 +1836,19 @@ bool8 ScrCmd_contestlinktransfer(struct ScriptContext *ctx) return TRUE; } -bool8 ScrCmd_doanimation(struct ScriptContext *ctx) +bool8 ScrCmd_dofieldeffect(struct ScriptContext *ctx) { u16 effectId = VarGet(ScriptReadHalfword(ctx)); + sFieldEffectScriptId = effectId; FieldEffectStart(sFieldEffectScriptId); return FALSE; } -bool8 ScrCmd_setanimation(struct ScriptContext *ctx) +bool8 ScrCmd_setfieldeffect(struct ScriptContext *ctx) { u8 argNum = ScriptReadByte(ctx); + gFieldEffectArguments[argNum] = (s16)VarGet(ScriptReadHalfword(ctx)); return FALSE; } @@ -1739,7 +1861,7 @@ static bool8 sub_8067B48() return FALSE; } -bool8 ScrCmd_checkanimation(struct ScriptContext *ctx) +bool8 ScrCmd_waitfieldeffect(struct ScriptContext *ctx) { sFieldEffectScriptId = VarGet(ScriptReadHalfword(ctx)); SetupNativeScript(ctx, sub_8067B48); @@ -1748,21 +1870,23 @@ bool8 ScrCmd_checkanimation(struct ScriptContext *ctx) bool8 ScrCmd_sethealplace(struct ScriptContext *ctx) { - u16 v2 = VarGet(ScriptReadHalfword(ctx)); - sub_8053588(v2); + u16 healLocationId = VarGet(ScriptReadHalfword(ctx)); + + Overworld_SetHealLocationWarp(healLocationId); return FALSE; } -bool8 ScrCmd_checkgender(struct ScriptContext *ctx) +bool8 ScrCmd_checkplayergender(struct ScriptContext *ctx) { gScriptResult = gSaveBlock2.playerGender; return FALSE; } -bool8 ScrCmd_pokecry(struct ScriptContext *ctx) +bool8 ScrCmd_playpokecry(struct ScriptContext *ctx) { u16 species = VarGet(ScriptReadHalfword(ctx)); u16 mode = VarGet(ScriptReadHalfword(ctx)); + PlayCry5(species, mode); return FALSE; } @@ -1779,6 +1903,7 @@ bool8 ScrCmd_setmaptile(struct ScriptContext *ctx) u16 y = VarGet(ScriptReadHalfword(ctx)); u16 tileId = VarGet(ScriptReadHalfword(ctx)); u16 v8 = VarGet(ScriptReadHalfword(ctx)); + x += 7; y += 7; if (!v8) @@ -1788,10 +1913,11 @@ bool8 ScrCmd_setmaptile(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_setdooropened(struct ScriptContext *ctx) +bool8 ScrCmd_opendoor(struct ScriptContext *ctx) { u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); + x += 7; y += 7; PlaySE(GetDoorSoundEffect(x, y)); @@ -1799,10 +1925,11 @@ bool8 ScrCmd_setdooropened(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_setdoorclosed(struct ScriptContext *ctx) +bool8 ScrCmd_closedoor(struct ScriptContext *ctx) { u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); + x += 7; y += 7; FieldAnimateDoorClose(x, y); @@ -1817,43 +1944,46 @@ static bool8 IsDoorAnimationStopped() return FALSE; } -bool8 ScrCmd_doorchange(struct ScriptContext *ctx) +bool8 ScrCmd_waitdooranim(struct ScriptContext *ctx) { SetupNativeScript(ctx, IsDoorAnimationStopped); return TRUE; } -bool8 ScrCmd_setdooropened2(struct ScriptContext *ctx) +bool8 ScrCmd_setdooropen(struct ScriptContext *ctx) { u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); + x += 7; y += 7; FieldSetDoorOpened(x, y); return FALSE; } -bool8 ScrCmd_setdoorclosed2(struct ScriptContext *ctx) +bool8 ScrCmd_setdoorclosed(struct ScriptContext *ctx) { u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); + x += 7; y += 7; FieldSetDoorClosed(x, y); return FALSE; } -bool8 ScrCmd_event_b1(struct ScriptContext *ctx) +bool8 ScrCmd_addelevmenuitem(struct ScriptContext *ctx) { u8 v3 = ScriptReadByte(ctx); u16 v5 = VarGet(ScriptReadHalfword(ctx)); u16 v7 = VarGet(ScriptReadHalfword(ctx)); u16 v9 = VarGet(ScriptReadHalfword(ctx)); + ScriptAddElevatorMenuItem(v3, v5, v7, v9); return FALSE; } -bool8 ScrCmd_event_b2(struct ScriptContext *ctx) +bool8 ScrCmd_showelevmenu(struct ScriptContext *ctx) { ScriptShowElevatorMenu(); ScriptContext1_Stop(); @@ -1870,21 +2000,21 @@ bool8 ScrCmd_checkcoins(struct ScriptContext *ctx) bool8 ScrCmd_givecoins(struct ScriptContext *ctx) { u16 coins = VarGet(ScriptReadHalfword(ctx)); + if (GiveCoins(coins) == TRUE) gScriptResult = 0; else gScriptResult = 1; - return FALSE; } -bool8 ScrCmd_removecoins(struct ScriptContext *ctx) +bool8 ScrCmd_takecoins(struct ScriptContext *ctx) { u16 coins = VarGet(ScriptReadHalfword(ctx)); + if (TakeCoins(coins) == TRUE) gScriptResult = 0; else gScriptResult = 1; - return FALSE; } diff --git a/src/script_menu.c b/src/field/script_menu.c index e25e74d8c..e25e74d8c 100644 --- a/src/script_menu.c +++ b/src/field/script_menu.c diff --git a/src/script_movement.c b/src/field/script_movement.c index 30e10b451..c7ce55171 100644 --- a/src/script_movement.c +++ b/src/field/script_movement.c @@ -5,19 +5,19 @@ #include "task.h" #include "util.h" -static EWRAM_DATA u8 *gUnknown_020384F8[16] = {0}; +static EWRAM_DATA const u8 *gUnknown_020384F8[16] = {0}; static void sub_80A2198(u8); static u8 sub_80A21E0(void); -static bool8 sub_80A21F4(u8, u8, u8 *); +static bool8 sub_80A21F4(u8, u8, const u8 *); static u8 sub_80A2260(u8, u8); static bool8 sub_80A2370(u8, u8); -static void sub_80A23C8(u8, u8, u8, u8 *); +static void sub_80A23C8(u8, u8, u8, const u8 *); static void UnfreezeObjects(u8); static void Task_80A244C(u8); -static void sub_80A2490(u8, u8, u8, u8 *); +static void sub_80A2490(u8, u8, u8, const u8 *); -bool8 ScriptMovement_StartObjectMovementScript(u8 localId, u8 mapNum, u8 mapGroup, u8 *movementScript) +bool8 ScriptMovement_StartObjectMovementScript(u8 localId, u8 mapNum, u8 mapGroup, const u8 *movementScript) { u8 mapObjId; @@ -70,7 +70,7 @@ static u8 sub_80A21E0(void) return FindTaskIdByFunc(Task_80A244C); } -static bool8 sub_80A21F4(u8 taskId, u8 mapObjId, u8 *movementScript) +static bool8 sub_80A21F4(u8 taskId, u8 mapObjId, const u8 *movementScript) { u8 r4; @@ -160,17 +160,17 @@ static bool8 sub_80A2370(u8 taskId, u8 b) return FALSE; } -static void npc_obj_offscreen_culling_and_flag_update(u8 a, u8 *movementScript) +static void npc_obj_offscreen_culling_and_flag_update(u8 a, const u8 *movementScript) { gUnknown_020384F8[a] = movementScript; } -static u8 *sub_80A23B8(u8 a) +static const u8 *sub_80A23B8(u8 a) { return gUnknown_020384F8[a]; } -static void sub_80A23C8(u8 taskId, u8 b, u8 mapObjId, u8 *movementScript) +static void sub_80A23C8(u8 taskId, u8 b, u8 mapObjId, const u8 *movementScript) { sub_80A2318(taskId, b); npc_obj_offscreen_culling_and_flag_update(b, movementScript); @@ -203,7 +203,7 @@ static void Task_80A244C(u8 taskId) } } -static void sub_80A2490(u8 taskId, u8 b, u8 mapObjId, u8 *d) +static void sub_80A2490(u8 taskId, u8 b, u8 mapObjId, const u8 *d) { u8 var; diff --git a/src/field/secret_base.c b/src/field/secret_base.c new file mode 100644 index 000000000..8c1b7c8c1 --- /dev/null +++ b/src/field/secret_base.c @@ -0,0 +1,1711 @@ +#include "global.h" +#include "secret_base.h" +#include "decoration.h" +#include "species.h" +#include "items.h" +#include "moves.h" +#include "event_data.h" +#include "field_camera.h" +#include "field_effect.h" +#include "field_fadetransition.h" +#include "field_player_avatar.h" +#include "field_specials.h" +#include "field_weather.h" +#include "fieldmap.h" +#include "link.h" +#include "main.h" +#include "sound.h" +#include "songs.h" +#include "map_constants.h" +#include "map_name_popup.h" +#include "menu.h" +#include "menu_helpers.h" +#include "metatile_behavior.h" +#include "palette.h" +#include "pokemon.h" +#include "overworld.h" +#include "script.h" +#include "sound.h" +#include "species.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "text.h" +#include "vars.h" + + +static void sub_80BC7D8(u8 taskId); +static void sub_80BC824(u8 taskId); +static u8 sub_80BC948(u8 a); +static void sub_80BC980(u8 taskId); +static void sub_80BC9E4(u8 taskId); +static void sub_80BCA84(u8); +static void sub_80BCAEC(u8 taskId); +static void sub_80BCB90(u8); +static void sub_80BCBC0(u8); +static void sub_80BCBF8(u8 taskId); +static void sub_80BCC54(u8 taskId); +static void Task_SecretBasePC_Registry(u8 taskId); + +extern void DoDecorationSoundEffect(s16 metatileId); +extern void sub_80C6A54(s16 x, s16 y); +extern void sub_80C68A4(s16 metatileId, s16 x, s16 y); +extern void DoYellowCave4Sparkle(void); + +extern u8 gUnknown_0815F399[]; +extern u8 gUnknown_0815F49A[]; +extern u8 gUnknown_020387DC; + +const struct +{ + u16 unk_083D1358_0; + u16 unk_083D1358_1; +} gUnknown_083D1358[] = { + {0x26, 0x36}, + {0x27, 0x37}, + {0x1a0, 0x1a1}, + {0x1a8, 0x1a9}, + {0x1b0, 0x1b1}, + {0x208, 0x210}, + {0x271, 0x278} +}; + + +const u8 gUnknown_083D1374[] = { + MAP_ID_SECRET_BASE_RED_CAVE1, 0, 1, 3, + MAP_ID_SECRET_BASE_RED_CAVE2, 0, 5, 9, + MAP_ID_SECRET_BASE_RED_CAVE3, 0, 1, 3, + MAP_ID_SECRET_BASE_RED_CAVE4, 0, 7, 13, + MAP_ID_SECRET_BASE_BROWN_CAVE1, 0, 2, 3, + MAP_ID_SECRET_BASE_BROWN_CAVE2, 0, 9, 2, + MAP_ID_SECRET_BASE_BROWN_CAVE3, 0, 13, 4, + MAP_ID_SECRET_BASE_BROWN_CAVE4, 0, 1, 2, + MAP_ID_SECRET_BASE_BLUE_CAVE1, 0, 1, 3, + MAP_ID_SECRET_BASE_BLUE_CAVE2, 0, 1, 2, + MAP_ID_SECRET_BASE_BLUE_CAVE3, 0, 3, 15, + MAP_ID_SECRET_BASE_BLUE_CAVE4, 0, 3, 14, + MAP_ID_SECRET_BASE_YELLOW_CAVE1, 0, 9, 3, + MAP_ID_SECRET_BASE_YELLOW_CAVE2, 0, 8, 7, + MAP_ID_SECRET_BASE_YELLOW_CAVE3, 0, 3, 6, + MAP_ID_SECRET_BASE_YELLOW_CAVE4, 0, 5, 9, + MAP_ID_SECRET_BASE_TREE1, 0, 2, 3, + MAP_ID_SECRET_BASE_TREE2, 0, 5, 6, + MAP_ID_SECRET_BASE_TREE3, 0, 15, 3, + MAP_ID_SECRET_BASE_TREE4, 0, 4, 10, + MAP_ID_SECRET_BASE_SHRUB1, 0, 3, 3, + MAP_ID_SECRET_BASE_SHRUB2, 0, 1, 2, + MAP_ID_SECRET_BASE_SHRUB3, 0, 7, 8, + MAP_ID_SECRET_BASE_SHRUB4, 0, 9, 6 +}; + +const struct MenuAction2 gUnknown_083D13D4[] = { + {SecretBaseText_DelRegist, sub_80BCA84}, + {gUnknownText_Exit, sub_80BCBF8} +}; + +const struct YesNoFuncTable gUnknown_083D13E4 = { + sub_80BCB90, + sub_80BCBC0 +}; + +const u8 gUnknown_083D13EC[] = { + 0x23,0x24,0xF,0x1F,0x21,0x2F,0xE,0x14,0x20,0x22,0x0,0x0 +}; + +extern void *gUnknown_0300485C; +extern u8 gUnknown_081A2E14[]; +extern u8 UnknownString_81A1BB2[]; +extern u8 UnknownString_81A1F67[]; +extern u8 UnknownString_81A2254[]; +extern u8 UnknownString_81A25C3[]; +extern u8 UnknownString_81A2925[]; +extern u8 UnknownString_81A1D74[]; +extern u8 UnknownString_81A20C9[]; +extern u8 UnknownString_81A2439[]; +extern u8 UnknownString_81A2B2A[]; +extern u8 UnknownString_81A2754[]; + + +void ClearSecretBase(struct SecretBaseRecord *record) +{ + u16 i; + u16 j; + record->secretBaseId = 0; + for (i=0; i<OT_NAME_LENGTH; i++) + record->playerName[i] = 0xff; + for (i=0; i<4; i++) + record->trainerId[i] = 0x00; + record->sbr_field_e = 0; + record->sbr_field_10 = 0; + record->sbr_field_11 = 0; + record->sbr_field_1_0 = 0; + record->gender = 0; + record->sbr_field_1_5 = 0; + record->sbr_field_1_6 = 0; + for (i=0; i<16; i++) { + record->decorations[i] = 0; + record->decorationPos[i] = 0; + } + for (i=0; i<6; i++) { + for (j=0; j<4; j++) { + record->partyMoves[i * 4 + j] = 0; + } + record->partyPersonality[i] = 0; + record->partyEVs[i] = 0; + record->partySpecies[i] = 0; + record->partyHeldItems[i] = 0; + record->partyLevels[i] = 0; + } +} + +void ResetSecretBase(u8 idx) +{ + ClearSecretBase(&gSaveBlock1.secretBases[idx]); +} + +void ResetSecretBases(void) +{ + u16 i; + for (i = 0; i < MAX_SECRET_BASES; i++) + ResetSecretBase(i); +} + +void sub_80BB5D0(void) +{ + gUnknown_020387DC = gSpecialVar_0x8004; +} + +void sub_80BB5E4(void) +{ + u16 i; + gScriptResult = 0; + for (i = 0; i < MAX_SECRET_BASES; i++) { + if (gUnknown_020387DC != gSaveBlock1.secretBases[i].secretBaseId) + continue; + gScriptResult = 1; + VarSet(VAR_0x4054, i); + break; + } +} + +void sub_80BB63C(void) // 80bb63c +{ + if (gSaveBlock1.secretBases[0].secretBaseId) + gScriptResult = 1; + else + gScriptResult = 0; +} + +u8 sub_80BB66C(void) // 80bb66c +{ + s16 x, y; + s16 v0; + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + v0 = MapGridGetMetatileBehaviorAt(x, y) & 0xFFF; + if (v0 == 0x90 || v0 == 0x91) + return 1; + else if (v0 == 0x92 || v0 == 0x93) + return 2; + else if (v0 == 0x9a || v0 == 0x9b) + return 3; + else if (v0 == 0x94 || v0 == 0x95) + return 4; + else if (v0 == 0x96 || v0 == 0x97 || v0 == 0x9c || v0 == 0x9d) + return 5; + else if (v0 == 0x98 || v0 == 0x99) + return 6; + return 0; +} + +void sub_80BB70C(void) // 80bb70c +{ + gSpecialVar_0x8007 = sub_80BB66C(); +} + +s16 unref_sub_80BB724(u16 *a0, u8 a1) +{ + u16 v2; + for (v2=0; v2<0x200; v2++) { + if ((a0[v2] & 0xFFF) == a1) + return (s16)v2; + } + return -1; +} + +void sub_80BB764(s16 *arg1, s16 *arg2, u16 arg3) +{ + s16 x, y; + for (y=0; y<gMapHeader.mapData->height; y++) { + for (x=0; x<gMapHeader.mapData->width; x++) { + if ((gMapHeader.mapData->map[y * gMapHeader.mapData->width + x] & 0x3ff) == arg3) { + *arg1 = x; + *arg2 = y; + return; + } + } + } +} + +void sub_80BB800(void) +{ + s16 x, y; + s16 tile_id; + u16 idx; + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + tile_id = MapGridGetMetatileIdAt(x, y); + for (idx=0; idx<7; idx++) { + if (gUnknown_083D1358[idx].unk_083D1358_0 == tile_id) { + MapGridSetMetatileIdAt(x, y, gUnknown_083D1358[idx].unk_083D1358_1 | 0xc00); + CurrentMapDrawMetatileAt(x, y); + return; + } + } + for (idx=0; idx<7; idx++) { + if (gUnknown_083D1358[idx].unk_083D1358_1 == tile_id) { + MapGridSetMetatileIdAt(x, y, gUnknown_083D1358[idx].unk_083D1358_0 | 0xc00); + CurrentMapDrawMetatileAt(x, y); + return; + } + } +} + +u8 sub_80BB8A8(u8 *arg1) +{ + u8 idx; + for (idx=0; idx<7; idx++) { + if (arg1[idx] == EOS) + return idx; + } + return 7; +} + +void sub_80BB8CC(void) +{ + u8 nameLength; + u16 idx; + gSaveBlock1.secretBases[0].secretBaseId = gUnknown_020387DC; + for (idx=0; idx<4; idx++) { + gSaveBlock1.secretBases[0].trainerId[idx] = gSaveBlock2.playerTrainerId[idx]; + } + VarSet(VAR_0x4054, 0); + nameLength = sub_80BB8A8(gSaveBlock2.playerName); + memset(gSaveBlock1.secretBases[0].playerName, 0xFF, OT_NAME_LENGTH); + StringCopyN(gSaveBlock1.secretBases[0].playerName, gSaveBlock2.playerName, nameLength); + gSaveBlock1.secretBases[0].gender = gSaveBlock2.playerGender; + VarSet(VAR_SECRET_BASE_MAP, gMapHeader.regionMapSectionId); +} + +void sub_80BB970(struct MapEvents *events) +{ + u16 bgevidx, idx, jdx; + s16 tile_id; + for (bgevidx=0; bgevidx<events->bgEventCount; bgevidx++) { + if (events->bgEvents[bgevidx].kind == 8) { + for (jdx=0; jdx<MAX_SECRET_BASES; jdx++) { + if (gSaveBlock1.secretBases[jdx].secretBaseId == events->bgEvents[bgevidx].bgUnion.secretBaseId) { + tile_id = MapGridGetMetatileIdAt(events->bgEvents[bgevidx].x + 7, events->bgEvents[bgevidx].y + 7); + for (idx=0; idx<7; idx++) { + if (gUnknown_083D1358[idx].unk_083D1358_0 == tile_id) { + MapGridSetMetatileIdAt(events->bgEvents[bgevidx].x + 7, events->bgEvents[bgevidx].y + 7, gUnknown_083D1358[idx].unk_083D1358_1 | 0xc00); + break; + } + } + break; + } + } + } + } +} + +void sub_80BBA14(void) +{ + s8 idx = 4 * (gUnknown_020387DC / 10); + warp1_set_2(MAP_GROUP_SECRET_BASE_RED_CAVE1, gUnknown_083D1374[idx], gUnknown_083D1374[idx + 1]); +} + +void sub_80BBA48(u8 taskid) +{ + u16 curbaseid; + switch (gTasks[taskid].data[0]) { + case 0: + gTasks[taskid].data[0] = 1; + break; + case 1: + if (!gPaletteFade.active) { + gTasks[taskid].data[0] = 2; + } + break; + case 2: + curbaseid = VarGet(VAR_0x4054); + if (gSaveBlock1.secretBases[curbaseid].sbr_field_10 < 0xff) + gSaveBlock1.secretBases[curbaseid].sbr_field_10++; + sub_80BBA14(); + warp_in(); + gFieldCallback = sub_8080990; + SetMainCallback2(CB2_LoadMap); + DestroyTask(taskid); + break; + } +} + +void sub_80BBAF0(void) +{ + CreateTask(sub_80BBA48, 0); + fade_screen(1, 0); + saved_warp2_set(0, gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1); +} + +bool8 sub_80BBB24(void) +{ + if (gMapHeader.mapType == MAP_TYPE_SECRET_BASE && VarGet(VAR_0x4097) == 0) + return FALSE; + return TRUE; +} + +void sub_80BBB50(u8 taskid) +{ + FieldObjectTurn(&(gMapObjects[gPlayerAvatar.mapObjectId]), 2); + if (sub_807D770() == 1) { + EnableBothScriptContexts(); + DestroyTask(taskid); + } +} + +void sub_80BBB90(void) +{ + s16 x, y; + ScriptContext2_Enable(); + HideMapNamePopup(); + sub_80BB764(&x, &y, 0x220); + MapGridSetMetatileIdAt(x + 7, y + 7, 0xe20); + CurrentMapDrawMetatileAt(x + 7, y + 7); + pal_fill_black(); + CreateTask(sub_80BBB50, 0); +} + +void sub_80BBBEC(u8 taskid) +{ + s8 idx; + if (!gPaletteFade.active) { + idx = 4 * (gUnknown_020387DC / 10); + Overworld_SetWarpDestination(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1, gUnknown_083D1374[idx + 2], gUnknown_083D1374[idx + 3]); + warp_in(); + gFieldCallback = sub_80BBB90; + SetMainCallback2(CB2_LoadMap); + DestroyTask(taskid); + } +} + +void sub_80BBC78(void) +{ + u8 taskid = CreateTask(sub_80BBBEC, 0); + gTasks[taskid].data[0] = 0; + fade_screen(1, 0); +} + +bool8 CurrentMapIsSecretBase(void) +{ + if (gSaveBlock1.location.mapGroup == MAP_GROUP_SECRET_BASE_SHRUB4 && (u8)(gSaveBlock1.location.mapNum) <= MAP_ID_SECRET_BASE_SHRUB4) + return TRUE; + return FALSE; +} + +void sub_80BBCCC(u8 flagIn) +{ + u16 curBaseId; + u16 x, y; + if (CurrentMapIsSecretBase()) { + curBaseId = VarGet(VAR_0x4054); + for (x=0; x<16; x++) { + if (gSaveBlock1.secretBases[curBaseId].decorations[x] > 0 && gSaveBlock1.secretBases[curBaseId].decorations[x] <= 0x78 && gDecorations[gSaveBlock1.secretBases[curBaseId].decorations[x]].permission != DECORPERM_SOLID_MAT) { + sub_80FF394((gSaveBlock1.secretBases[curBaseId].decorationPos[x] >> 4) + 7, (gSaveBlock1.secretBases[curBaseId].decorationPos[x] & 0xF) + 7, gSaveBlock1.secretBases[curBaseId].decorations[x]); + } + } + if (curBaseId != 0) { + sub_80BB764(&x, &y, 0x220); + MapGridSetMetatileIdAt(x + 7, y + 7, 0xe21); + } else if (flagIn == 1 && VarGet(VAR_0x4089) == 1) { + sub_80BB764(&x, &y, 0x220); + MapGridSetMetatileIdAt(x + 7, y + 7, 0xe0a); + } + } +} + +void sub_80BBDD0(void) +{ + u8 *roomdecor; + u8 *roomdecorpos; + u8 decidx; + u8 objid = 0; + u8 metatile; + u8 permission; + u8 ndecor; + u16 curBase = VarGet(VAR_0x4054); + if (!CurrentMapIsSecretBase()) { + roomdecor = gSaveBlock1.playerRoomDecor; + roomdecorpos = gSaveBlock1.playerRoomDecorPos; + ndecor = 12; + } else { + roomdecor = gSaveBlock1.secretBases[curBase].decorations; + roomdecorpos = gSaveBlock1.secretBases[curBase].decorationPos; + ndecor = 16; + } + for (decidx=0; decidx<ndecor; decidx++) { + if (roomdecor[decidx] != DECOR_NONE) { + permission = gDecorations[roomdecor[decidx]].permission; + if (permission == DECORPERM_SOLID_MAT) + { + for (objid=0; objid<gMapHeader.events->mapObjectCount; objid++) { + if (gMapHeader.events->mapObjects[objid].flagId == gSpecialVar_0x8004 + 0xAE) + break; + } + if (objid == gMapHeader.events->mapObjectCount) + continue; + gSpecialVar_0x8006 = roomdecorpos[decidx] >> 4; + gSpecialVar_0x8007 = roomdecorpos[decidx] & 0xF; + metatile = MapGridGetMetatileBehaviorAt(gSpecialVar_0x8006 + 7, gSpecialVar_0x8007 + 7); + if (sub_80572D8(metatile) == TRUE || sub_80572EC(metatile) == TRUE) { + gScriptResult = gMapHeader.events->mapObjects[objid].graphicsId + VAR_0x3F20; + VarSet(gScriptResult, gDecorations[roomdecor[decidx]].tiles[0]); + gScriptResult = gMapHeader.events->mapObjects[objid].localId; + FlagClear(gSpecialVar_0x8004 + 0xAE); + show_sprite(gScriptResult, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); + sub_805C0F8(gScriptResult, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, gSpecialVar_0x8006, gSpecialVar_0x8007); + sub_805C78C(gScriptResult, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); + gSpecialVar_0x8004 ++; + } + } + } + } +} + +void sub_80BBFA4(void) +{ + int curBase = VarGet(VAR_0x4054); + VarSet(VAR_0x401F, gUnknown_083D13EC[sub_80BCCA4(curBase)]); +} + +void sub_80BBFD8(struct MapPosition *position, struct MapEvents *events) +{ + s16 bgevtidx; + for (bgevtidx=0; bgevtidx<events->bgEventCount; bgevtidx++) { + if (events->bgEvents[bgevtidx].kind == 8 && position->x == events->bgEvents[bgevtidx].x + 7 && position->y == events->bgEvents[bgevtidx].y + 7) { + gUnknown_020387DC = events->bgEvents[bgevtidx].bgUnion.secretBaseId; + break; + } + } +} + +void sub_80BC038(struct MapPosition *position, struct MapEvents *events) +{ + sub_80BBFD8(position, events); + sub_80BB5E4(); + ScriptContext1_SetupScript(gUnknown_081A2E14); +} + +bool8 sub_80BC050(void) +{ + sub_80BB5D0(); + sub_80BB5E4(); + if (gScriptResult == 1) + return FALSE; + return TRUE; +} + +void sub_80BC074(u8 taskid) +{ + switch (gTasks[taskid].data[0]) { + case 0: + ScriptContext2_Enable(); + gTasks[taskid].data[0] = 1; + break; + case 1: + if (!gPaletteFade.active) { + gTasks[taskid].data[0] = 2; + } + break; + case 2: + copy_saved_warp2_bank_and_enter_x_to_warp1(0x7E); + warp_in(); + gFieldCallback = mapldr_default; + SetMainCallback2(CB2_LoadMap); + ScriptContext2_Disable(); + DestroyTask(taskid); + break; + } +} + +void sub_80BC0F8(void) { + CreateTask(sub_80BC074, 0); + fade_screen(1, 0); +} + +void sub_80BC114(void) { + if (gSaveBlock1.secretBases[0].secretBaseId != gUnknown_020387DC) + gScriptResult = 1; + else + gScriptResult = 0; +} + +u8 sub_80BC14C(u8 sbid) +{ + s16 idx; + for (idx=0; idx<MAX_SECRET_BASES; idx++) { + if (gSaveBlock1.secretBases[idx].secretBaseId == sbid) + return idx; + } + return 0; +} + +u8 *sub_80BC190(u8 *dest, u8 arg1) { // 80bc190 + u8 local1; + u8 *str; + + local1 = sub_80BB8A8(gSaveBlock1.secretBases[arg1].playerName); + + str = StringCopyN(dest, gSaveBlock1.secretBases[arg1].playerName, local1); + str[0] = EOS; + +#if ENGLISH + return StringAppend(dest, gOtherText_PlayersBase); +#elif GERMAN + return de_sub_8073174(dest, gOtherText_PlayersBase); +#endif +} + +u8 *GetSecretBaseMapName(u8 *dest) { + gUnknown_020387DC = gSaveBlock1.secretBases[VarGet(VAR_0x4054)].secretBaseId; + return sub_80BC190(dest, VarGet(VAR_0x4054)); +} + +void sub_80BC224(void) { + u8 *var0 = gSaveBlock1.secretBases[(u8)VarGet(VAR_0x4054)].playerName; + u8 *var1 = gStringVar1; + u8 var2 = sub_80BB8A8(var0); + u8 *var3 = StringCopyN(var1, var0, var2); + *var3 = EOS; +} + +bool8 sub_80BC268(u8 i) { // 80bc268 + if (gSaveBlock1.secretBases[i].sbr_field_1_6) + return TRUE; + return FALSE; +} + +u8 sub_80BC298(struct Pokemon *mon) { // 80bc298 + u16 evsum = GetMonData(mon, MON_DATA_HP_EV); + evsum += GetMonData(mon, MON_DATA_ATK_EV); + evsum += GetMonData(mon, MON_DATA_DEF_EV); + evsum += GetMonData(mon, MON_DATA_SPEED_EV); + evsum += GetMonData(mon, MON_DATA_SPATK_EV); + evsum += GetMonData(mon, MON_DATA_SPDEF_EV); + return (u8)(evsum / 6); +} + +#ifdef NONMATCHING +// So much is wrong with this function. +// The compiler likes to store pointers in temp variables. That's not what it's supposed to do. +void sub_80BC300(void) +{ + u16 partyidx; + u16 moveidx; + u16 sbpartyidx = 0; + for (partyidx=0; partyidx<PARTY_SIZE; partyidx++) + { + for (moveidx=0; moveidx<4; moveidx++) + gSaveBlock1.secretBases[0].partyMoves[partyidx * 4 + moveidx] = MOVE_NONE; + gSaveBlock1.secretBases[0].partySpecies[partyidx] = SPECIES_NONE; + gSaveBlock1.secretBases[0].partyHeldItems[partyidx] = ITEM_NONE; + gSaveBlock1.secretBases[0].partyLevels[partyidx] = 0; + gSaveBlock1.secretBases[0].partyPersonality[partyidx] = 0; + gSaveBlock1.secretBases[0].partyEVs[partyidx] = 0; + if (GetMonData(&(gPlayerParty[partyidx]), MON_DATA_SPECIES) != SPECIES_NONE && !GetMonData(&(gPlayerParty[partyidx]), MON_DATA_IS_EGG)) { + for (moveidx=0; moveidx<4; moveidx++) + gSaveBlock1.secretBases[0].partyMoves[sbpartyidx * 4 + moveidx] = GetMonData(&(gPlayerParty[partyidx]), MON_DATA_MOVE1 + moveidx); + gSaveBlock1.secretBases[0].partySpecies[sbpartyidx] = GetMonData(&(gPlayerParty[partyidx]), MON_DATA_SPECIES); + gSaveBlock1.secretBases[0].partyHeldItems[sbpartyidx] = GetMonData(&(gPlayerParty[partyidx]), MON_DATA_HELD_ITEM); + gSaveBlock1.secretBases[0].partyLevels[sbpartyidx] = GetMonData(&(gPlayerParty[partyidx]), MON_DATA_LEVEL); + gSaveBlock1.secretBases[0].partyPersonality[sbpartyidx] = GetMonData(&(gPlayerParty[partyidx]), MON_DATA_PERSONALITY); + gSaveBlock1.secretBases[0].partyEVs[sbpartyidx] = sub_80BC298(&(gPlayerParty[partyidx])); + sbpartyidx ++; + } + } +} +#else +__attribute__((naked)) +void sub_80BC300(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0xC\n\ + movs r0, 0\n\ + mov r10, r0\n\ + movs r6, 0\n\ + mov r9, r6\n\ +_080BC314:\n\ + movs r4, 0\n\ + lsls r3, r6, 2\n\ + lsls r2, r6, 1\n\ + ldr r7, _080BC424 @ =gPlayerParty\n\ + adds r1, r6, 0x1\n\ + str r1, [sp]\n\ + adds r1, r3, 0\n\ +_080BC322:\n\ + adds r0, r1, r4\n\ + lsls r0, 1\n\ + ldr r5, _080BC428 @ =gSaveBlock1 + 0x1A54\n\ + adds r0, r5, r0\n\ + mov r5, r9\n\ + strh r5, [r0]\n\ + adds r0, r4, 0x1\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + cmp r4, 0x3\n\ + bls _080BC322\n\ + ldr r1, _080BC42C @ =gSaveBlock1 + 0x1A84\n\ + adds r0, r1, r2\n\ + strh r5, [r0]\n\ + ldr r5, _080BC430 @ =gSaveBlock1 + 0x1A90\n\ + adds r0, r5, r2\n\ + mov r1, r9\n\ + strh r1, [r0]\n\ + ldr r2, _080BC434 @ =gSaveBlock1 + 0x1A9C\n\ + adds r0, r2, r6\n\ + mov r5, r9\n\ + strb r5, [r0]\n\ + ldr r1, _080BC438 @ =gSaveBlock1 + 0x1A3C\n\ + adds r0, r1, r3\n\ + mov r2, r9\n\ + str r2, [r0]\n\ + ldr r3, _080BC43C @ =gSaveBlock1 + 0x1AA2\n\ + adds r0, r3, r6\n\ + strb r2, [r0]\n\ + movs r0, 0x64\n\ + adds r5, r6, 0\n\ + muls r5, r0\n\ + adds r4, r5, r7\n\ + adds r0, r4, 0\n\ + movs r1, 0xB\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + beq _080BC408\n\ + adds r0, r4, 0\n\ + movs r1, 0x2D\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + bne _080BC408\n\ + movs r4, 0\n\ + mov r0, r10\n\ + lsls r0, 2\n\ + mov r8, r0\n\ + mov r1, r10\n\ + lsls r7, r1, 1\n\ + adds r1, 0x1\n\ + str r1, [sp, 0x4]\n\ + ldr r2, _080BC424 @ =gPlayerParty\n\ +_080BC38E:\n\ + adds r1, r4, 0\n\ + adds r1, 0xD\n\ + adds r0, r5, r2\n\ + str r2, [sp, 0x8]\n\ + bl GetMonData\n\ + mov r3, r8\n\ + adds r1, r3, r4\n\ + lsls r1, 1\n\ + ldr r3, _080BC428 @ =gSaveBlock1 + 0x1A54\n\ + adds r1, r3, r1\n\ + strh r0, [r1]\n\ + adds r0, r4, 0x1\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + ldr r2, [sp, 0x8]\n\ + cmp r4, 0x3\n\ + bls _080BC38E\n\ + movs r0, 0x64\n\ + adds r4, r6, 0\n\ + muls r4, r0\n\ + ldr r0, _080BC424 @ =gPlayerParty\n\ + adds r4, r0\n\ + adds r0, r4, 0\n\ + movs r1, 0xB\n\ + bl GetMonData\n\ + ldr r5, _080BC42C @ =gSaveBlock1 + 0x1A84\n\ + adds r1, r5, r7\n\ + strh r0, [r1]\n\ + adds r0, r4, 0\n\ + movs r1, 0xC\n\ + bl GetMonData\n\ + ldr r2, _080BC430 @ =gSaveBlock1 + 0x1A90\n\ + adds r1, r2, r7\n\ + strh r0, [r1]\n\ + adds r0, r4, 0\n\ + movs r1, 0x38\n\ + bl GetMonData\n\ + ldr r1, _080BC434 @ =gSaveBlock1 + 0x1A9C\n\ + add r1, r10\n\ + strb r0, [r1]\n\ + adds r0, r4, 0\n\ + movs r1, 0\n\ + bl GetMonData\n\ + ldr r1, _080BC438 @ =gSaveBlock1 + 0x1A3C\n\ + add r1, r8\n\ + str r0, [r1]\n\ + adds r0, r4, 0\n\ + bl sub_80BC298\n\ + ldr r1, _080BC43C @ =gSaveBlock1 + 0x1AA2\n\ + add r1, r10\n\ + strb r0, [r1]\n\ + ldr r3, [sp, 0x4]\n\ + lsls r0, r3, 16\n\ + lsrs r0, 16\n\ + mov r10, r0\n\ +_080BC408:\n\ + ldr r5, [sp]\n\ + lsls r0, r5, 16\n\ + lsrs r6, r0, 16\n\ + cmp r6, 0x5\n\ + bls _080BC314\n\ + add sp, 0xC\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080BC424: .4byte gPlayerParty\n\ +_080BC428: .4byte gSaveBlock1 + 0x1A54\n\ +_080BC42C: .4byte gSaveBlock1 + 0x1A84\n\ +_080BC430: .4byte gSaveBlock1 + 0x1A90\n\ +_080BC434: .4byte gSaveBlock1 + 0x1A9C\n\ +_080BC438: .4byte gSaveBlock1 + 0x1A3C\n\ +_080BC43C: .4byte gSaveBlock1 + 0x1AA2\n\ +.syntax divided\n"); +} +#endif + +void sub_80BC440(void) +{ + u16 backupValue = gSaveBlock1.secretBases[0].sbr_field_e; + ResetSecretBase(0); + gSaveBlock1.secretBases[0].sbr_field_e = backupValue; + sub_80BC0F8(); +} + +void SecretBasePC_PackUp(void) +{ + IncrementGameStat(GAME_STAT_MOVED_SECRET_BASE); + sub_80BC440(); +} + +void sub_80BC474(void) +{ + u16 eventId; + struct MapEvents *mapEvents = gMapHeader.events; + for (eventId = 0; eventId < mapEvents->bgEventCount; eventId++) + { + if (mapEvents->bgEvents[eventId].kind == 8 + && gSaveBlock1.secretBases[0].secretBaseId == mapEvents->bgEvents[eventId].bgUnion.secretBaseId) + { + u16 i; + s16 tileId = MapGridGetMetatileIdAt(mapEvents->bgEvents[eventId].x + 7, mapEvents->bgEvents[eventId].y + 7); + + for (i = 0; i < 7; i++) + { + if (gUnknown_083D1358[i].unk_083D1358_1 == tileId) + { + MapGridSetMetatileIdAt( + mapEvents->bgEvents[eventId].x + 7, + mapEvents->bgEvents[eventId].y + 7, + gUnknown_083D1358[i].unk_083D1358_0 | 0xc00); + break; + } + } + + DrawWholeMapView(); + break; + } + } +} + +void sub_80BC50C(void) +{ + u16 backupValue; + sub_80BC474(); + IncrementGameStat(GAME_STAT_MOVED_SECRET_BASE); + + backupValue = gSaveBlock1.secretBases[0].sbr_field_e; + ResetSecretBase(0); + gSaveBlock1.secretBases[0].sbr_field_e = backupValue; +} + +u8 sub_80BC538(void) +{ + s16 secretBaseIndex; + u8 retVal = 0; + + for (secretBaseIndex = 1; secretBaseIndex < MAX_SECRET_BASES; secretBaseIndex++) + { + if (sub_80BC268(secretBaseIndex) == TRUE) + { + retVal++; + } + } + + return retVal; +} + +void sub_80BC56C(void) +{ + u8 secretBaseIndex = sub_80BC14C(gUnknown_020387DC); + if (sub_80BC268(secretBaseIndex) == TRUE) + { + gScriptResult = 1; + } + else if (sub_80BC538() > 9) + { + gScriptResult = 2; + } + else + { + gScriptResult = 0; + } +} + +void sub_80BC5BC(void) +{ + gSaveBlock1.secretBases[sub_80BC14C(gUnknown_020387DC)].sbr_field_1_6 ^= 1; + FlagSet(0x10C); +} + +void SecretBasePC_Decoration(void) +{ + CreateTask(Task_SecretBasePC_Decoration, 0); +} + +void SecretBasePC_Registry(void) +{ + CreateTask(Task_SecretBasePC_Registry, 0); +} + +void Task_SecretBasePC_Registry(u8 taskId) +{ + s16 *taskData; + + ScriptContext2_Enable(); + sub_80F944C(); + LoadScrollIndicatorPalette(); + + taskData = gTasks[taskId].data; + taskData[0] = sub_80BC538(); + if (taskData[0] != 0) + { + if (taskData[0] > 7) { + taskData[3] = 7; + } + else + { + taskData[3] = taskData[0]; + } + + taskData[1] = 0; + taskData[2] = 0; + + MenuZeroFillWindowRect(0, 0, 29, 19); + sub_80BC7D8(taskId); + + gTasks[taskId].func = sub_80BC824; + } + else + { + DisplayItemMessageOnField(taskId, gSecretBaseText_NoRegistry, sub_80BCC54, 0); + } +} + +void sub_80BC6B0(u8 taskId) +{ + u8 i; + s16 *taskData = gTasks[taskId].data; + u8 m = 0; + u8 n = 0; + + for (i = 1; i < MAX_SECRET_BASES; i++) + { + if (m == taskData[2]) + { + m = i; + break; + } + + if (sub_80BC268(i) == TRUE) + m++; + } + + for (i = m; i < MAX_SECRET_BASES; i++) + { + if (sub_80BC268(i) == TRUE) + { + sub_80BC190(gStringVar1, i); + MenuFillWindowRectWithBlankTile(18, 2 * n + 2, 28, 2 * n + 3); + MenuPrint(gStringVar1, 18, 2 * n + 2); + if (++n == 8) + break; + } + } + + if (n < 8) + { + MenuFillWindowRectWithBlankTile(18, 2 * n + 2, 28, 2 * n + 3); + MenuPrint(gUnknownText_Exit, 18, 2 * n + 2); + DestroyVerticalScrollIndicator(1); + if (n != 7) + MenuFillWindowRectWithBlankTile(18, ((n << 25) + (1 << 26)) >> 24, 28, 18); // the shifts are needed to match + } + else + CreateVerticalScrollIndicators(1, 0xbc, 0x98); + + if (taskData[2] == 0) + DestroyVerticalScrollIndicator(0); + else + CreateVerticalScrollIndicators(0, 0xbc, 0x08); +} + +void sub_80BC7D8(u8 taskId) +{ + u16 *taskData = gTasks[taskId].data; + MenuDrawTextWindow(17, 0, 29, 19); + InitMenu(0, 18, 2, taskData[3] + 1, taskData[1], 11); + + sub_80BC6B0(taskId); +} + +void sub_80BC824(u8 taskId) +{ + s16 *taskData = gTasks[taskId].data; + + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + if (taskData[1]) + { + PlaySE(5); + taskData[1] = MoveMenuCursor(-1); + } + else if (taskData[2]) + { + PlaySE(5); + taskData[2]--; + sub_80BC6B0(taskId); + } + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if (taskData[1] == taskData[3]) + { + if (taskData[2] + taskData[1] != taskData[0]) + { + PlaySE(5); + taskData[2]++; + sub_80BC6B0(taskId); + } + } + else + { + PlaySE(5); + taskData[1] = MoveMenuCursor(1); + } + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(5); + if (taskData[1] + taskData[2] == taskData[0]) + { + HandleDestroyMenuCursors(); + MenuZeroFillWindowRect(0, 0, 29, 19); + sub_80BCC54(taskId); + } + else + { + HandleDestroyMenuCursors(); + taskData[4] = sub_80BC948(taskData[1] + taskData[2]); + sub_80BC980(taskId); + } + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(5); + HandleDestroyMenuCursors(); + MenuZeroFillWindowRect(0, 0, 29, 19); + sub_80BCC54(taskId); + } +} + +u8 sub_80BC948(u8 a) +{ + u8 secretBaseIndex; + u8 count = 0; + + for (secretBaseIndex = 1; secretBaseIndex < MAX_SECRET_BASES; secretBaseIndex++) + { + if (sub_80BC268(secretBaseIndex) == TRUE) + { + if (a == count) + { + return secretBaseIndex; + } + + count++; + } + } + + return 0; +} + +void sub_80BC980(u8 taskId) +{ + PauseVerticalScrollIndicator(0); + PauseVerticalScrollIndicator(1); + MenuDrawTextWindow(1, 0, 12, 5); + PrintMenuItems(2, 1, 2, (const struct MenuAction *)gUnknown_083D13D4); + InitMenu(0, 2, 1, 2, 0, 10); + gTasks[taskId].func = sub_80BC9E4; +} + +void sub_80BC9E4(u8 taskId) +{ + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + if (GetMenuCursorPos()) + { + PlaySE(5); + MoveMenuCursor(-1); + } + } + else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if (GetMenuCursorPos() != 1) + { + PlaySE(5); + MoveMenuCursor(1); + } + } + else if (gMain.newKeys & A_BUTTON) + { + PlaySE(5); + gUnknown_083D13D4[GetMenuCursorPos()].func(taskId); + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(5); + sub_80BCBF8(taskId); + } +} + +void sub_80BCA84(u8 taskId) +{ + s16 *taskData = gTasks[taskId].data; + + DestroyVerticalScrollIndicator(0); + DestroyVerticalScrollIndicator(1); + HandleDestroyMenuCursors(); + MenuZeroFillWindowRect(0, 0, 29, 19); + + sub_80BC190(gStringVar1, taskData[4]); + StringExpandPlaceholders(gStringVar4, gOtherText_OkayToDeleteFromRegistry); + DisplayItemMessageOnField(taskId, gStringVar4, sub_80BCAEC, 0); +} + +void sub_80BCAEC(u8 taskId) +{ + DisplayYesNoMenu(20, 8, 1); + DoYesNoFuncWithChoice(taskId, &gUnknown_083D13E4); +} + +void sub_80BCB10(u8 taskId) +{ + s16 *taskData = gTasks[taskId].data; + + MenuZeroFillWindowRect(0, 0, 29, 19); + + gSaveBlock1.secretBases[taskData[4]].sbr_field_1_6 = 0; + taskData[0]--; + + if (taskData[2] > 0) + { + taskData[2]--; + } + + if (taskData[0] < 8) + { + taskData[3]--; + } + + sub_80BC7D8(taskId); + gTasks[taskId].func = sub_80BC824; +} + +void sub_80BCB90(u8 taskId) +{ + MenuZeroFillWindowRect(20, 8, 26, 13); + DisplayItemMessageOnField(taskId, gOtherText_RegisteredDataDeleted, sub_80BCB10, 0); +} + +void sub_80BCBC0(u8 taskId) +{ + MenuZeroFillWindowRect(0, 0, 29, 19); + + sub_80BC7D8(taskId); + gTasks[taskId].func = sub_80BC824; +} + +void sub_80BCBF8(u8 taskId) +{ + s16 *taskData = gTasks[taskId].data; + + InitMenu(0, 18, 2, taskData[3] + 1, taskData[1], 11); + MenuZeroFillWindowRect(1, 0, 12, 5); + StartVerticalScrollIndicators(0); + StartVerticalScrollIndicators(1); + + gTasks[taskId].func = sub_80BC824; +} + +void sub_80BCC54(u8 taskId) +{ + u16 curBaseIndex = VarGet(VAR_0x4054); + + BuyMenuFreeMemory(); + DestroyVerticalScrollIndicator(0); + DestroyVerticalScrollIndicator(1); + + if (curBaseIndex == 0) + { + ScriptContext1_SetupScript(gUnknown_0815F399); + } + else + { + ScriptContext1_SetupScript(gUnknown_0815F49A); + } + + DestroyTask(taskId); +} + +u8 sub_80BCCA4(u8 secretBaseIndex) +{ + return (gSaveBlock1.secretBases[secretBaseIndex].playerName[OT_NAME_LENGTH] % 5) + + gSaveBlock1.secretBases[secretBaseIndex].gender * 5; +} + +const u8 *sub_80BCCE8(void) +{ + u8 param = sub_80BCCA4(VarGet(VAR_0x4054)); + if (param == 0) return UnknownString_81A1BB2; + if (param == 1) return UnknownString_81A1F67; + if (param == 2) return UnknownString_81A2254; + if (param == 3) return UnknownString_81A25C3; + if (param == 4) return UnknownString_81A2925; + if (param == 5) return UnknownString_81A1D74; + if (param == 6) return UnknownString_81A20C9; + if (param == 7) return UnknownString_81A2439; + if (param == 8) return UnknownString_81A2754; + return UnknownString_81A2B2A; +} + +// Debugging function to test secret base battles. +void unref_sub_80BCD7C(u8 secretBaseIndex) +{ + u16 i; + for (i = 0; i == 0; i++) + { + gSaveBlock1.secretBases[secretBaseIndex].partyPersonality[i] = i + 1; + gSaveBlock1.secretBases[secretBaseIndex].partyMoves[i * 4] = i + 1; + gSaveBlock1.secretBases[secretBaseIndex].partySpecies[i] = SPECIES_TREECKO; + gSaveBlock1.secretBases[secretBaseIndex].partyHeldItems[i] = i + 1; + gSaveBlock1.secretBases[secretBaseIndex].partyLevels[i] = i + 5; + gSaveBlock1.secretBases[secretBaseIndex].partyEVs[i] = i * 5; + } +} + +void sub_80BCE1C(void) +{ + u16 curBaseIndex = VarGet(VAR_0x4054); + sub_810FB10(1); + + CreateSecretBaseEnemyParty(&gSaveBlock1.secretBases[curBaseIndex]); +} + +void sub_80BCE4C() +{ + gSaveBlock1.secretBases[VarGet(VAR_0x4054)].sbr_field_1_5 = gScriptResult; +} + +void sub_80BCE90() +{ + u16 curBaseIndex = VarGet(VAR_0x4054); + + if (!FlagGet(0x8C2)) + { + u8 i; + + for (i = 0; i < MAX_SECRET_BASES; i++) + { + gSaveBlock1.secretBases[i].sbr_field_1_5 = 0; + } + + FlagSet(0x8C2); + } + + gSpecialVar_0x8004 = sub_80BCCA4(curBaseIndex); + gScriptResult = gSaveBlock1.secretBases[curBaseIndex].sbr_field_1_5; +} + +void sub_80BCF1C(u8 taskId) +{ + s16 x, y; + u32 behavior; + s16 *taskData = gTasks[taskId].data; + + switch (taskData[1]) + { + case 0: + PlayerGetDestCoords(&taskData[2], &taskData[3]); + taskData[1] = 1; + break; + case 1: + PlayerGetDestCoords(&x, &y); + if (x != taskData[2] || y != taskData[3]) + { + taskData[2] = x; + taskData[3] = y; + + behavior = MapGridGetMetatileBehaviorAt(x, y); + if (sub_8057350(behavior) == TRUE) + { + DoYellowCave4Sparkle(); + } + else if (sub_8057314(behavior) == TRUE) + { + sub_80C68A4(MapGridGetMetatileIdAt(x, y), x, y); + } + else if (sub_8057328(behavior) == TRUE) + { + sub_80C6A54(x, y); + } + else if (sub_805733C(behavior) == TRUE) + { + DoDecorationSoundEffect(MapGridGetMetatileIdAt(x, y)); + } + } + break; + case 2: + if (!FieldEffectActiveListContains(taskData[4])) + { + taskData[1] = 1; + } + break; + } +} + +void sub_80BD034(u8 i, struct SecretBaseRecord *secretBase) +{ + gSaveBlock1.secretBases[i] = *secretBase; + gSaveBlock1.secretBases[i].sbr_field_1_6 = 2; +} + +bool8 sub_80BD070(struct SecretBaseRecord *baseA, struct SecretBaseRecord *baseB) +{ + u8 i; + + for (i = 0; i < 4; i++) + { + if (baseA->trainerId[i] != baseB->trainerId[i]) + { + return FALSE; + } + } + + return TRUE; +} + +bool8 sub_80BD0A0(struct SecretBaseRecord *baseA, struct SecretBaseRecord *baseB) +{ + u8 i; + + for (i = 0; i < OT_NAME_LENGTH && (baseA->playerName[i] != 0xFF || baseB->playerName[i] != 0xFF); i++) + { + if (baseA->playerName[i] != baseB->playerName[i]) + { + return FALSE; + } + } + + return TRUE; +} + +bool8 sub_80BD0EC(struct SecretBaseRecord *baseA, struct SecretBaseRecord *baseB) +{ + if (baseA->gender == baseB->gender && sub_80BD070(baseA, baseB) && sub_80BD0A0(baseA, baseB)) + { + return TRUE; + } + + + return FALSE; +} + +s16 sub_80BD12C(u8 secretBaseId) +{ + s16 i; + + for (i = 0; i < MAX_SECRET_BASES; i++) + { + if (gSaveBlock1.secretBases[i].secretBaseId == secretBaseId) + { + return i; + } + } + + return -1; +} + +u8 sub_80BD170(void) +{ + s16 i; + + for (i = 1; i < MAX_SECRET_BASES; i++) + { + if (gSaveBlock1.secretBases[i].secretBaseId == 0) + { + return i; + } + } + + return 0; +} + +u8 sub_80BD1B0(void) +{ + s16 i; + + for (i = 1; i < MAX_SECRET_BASES; i++) + { + if (gSaveBlock1.secretBases[i].sbr_field_1_6 == 0 && gSaveBlock1.secretBases[i].sbr_field_1_0 == 0) + { + return i; + } + } + + return 0; +} + +u8 sub_80BD1FC(struct SecretBaseRecord *secretBase) +{ + s16 secretBaseIndex; + + if (secretBase->secretBaseId == 0) + { + return 0; + } + + secretBaseIndex = sub_80BD12C(secretBase->secretBaseId); + if (secretBaseIndex != 0) + { + if (secretBaseIndex != -1) + { + if (gSaveBlock1.secretBases[secretBaseIndex].sbr_field_1_0 == 1) + { + return 0; + } + if (gSaveBlock1.secretBases[secretBaseIndex].sbr_field_1_6 != 2 + || secretBase->sbr_field_1_0 == 1) + { + sub_80BD034(secretBaseIndex, secretBase); + return secretBaseIndex; + } + } + else + { + secretBaseIndex = sub_80BD170(); + if (secretBaseIndex != 0) + { + sub_80BD034(secretBaseIndex, secretBase); + return secretBaseIndex; + } + secretBaseIndex = sub_80BD1B0(); + if (secretBaseIndex) + { + sub_80BD034(secretBaseIndex, secretBase); + return secretBaseIndex; + } + } + } + + return 0; +} + +void sub_80BD280(void) +{ + u8 i; + u8 j; + struct SecretBaseRecord temp; + struct SecretBaseRecord *secretBases = gSaveBlock1.secretBases; + + for (i = 1; i < MAX_SECRET_BASES - 1; i++) + { + for (j = i + 1; j < MAX_SECRET_BASES; j++) + { + if ((!secretBases[i].sbr_field_1_6 && secretBases[j].sbr_field_1_6 == 1) + || (secretBases[i].sbr_field_1_6 == 2 && secretBases[j].sbr_field_1_6 != 2)) + { + temp = secretBases[i]; + secretBases[i] = secretBases[j]; + secretBases[j] = temp; + } + } + } +} + +void sub_80BD328(struct SecretBaseRecord *secretBases, u8 b) +{ + u16 i; + + for (i = 1; i < MAX_SECRET_BASES; i++) + { + if (secretBases[i].sbr_field_1_6 == b) + { + sub_80BD1FC(&secretBases[i]); + } + } +} + +bool8 sub_80BD358(struct SecretBaseRecord *secretBase) +{ + u8 i; + + if (!secretBase->secretBaseId) + return FALSE; + + if (secretBase->secretBaseId && secretBase->gender != gSaveBlock2.playerGender) + return FALSE; + + // Check if the player's trainer Id matches the secret base's id. + for (i = 0; i < 4; i++) + { + if (secretBase->trainerId[i] != gSaveBlock2.playerTrainerId[i]) + return FALSE; + } + + for (i = 0; i < OT_NAME_LENGTH && (secretBase->playerName[i] != 0xFF || gSaveBlock2.playerName[i] != 0xFF); i++) + { + if (secretBase->playerName[i] != gSaveBlock2.playerName[i]) + return FALSE; + } + + return TRUE; +} + +void sub_80BD3DC(struct SecretBaseRecord *basesA, struct SecretBaseRecord *basesB, struct SecretBaseRecord *basesC) +{ + u8 i; + u8 var1 = 0; + + for (i = 0; i < MAX_SECRET_BASES; i++) + { + if ((var1 & 1) == 0) + { + if (sub_80BD358(&basesA[i]) == TRUE) + { + ClearSecretBase(&basesA[i]); + var1 |= 1; + } + } + + if ((var1 & 2) == 0) + { + if (sub_80BD358(&basesB[i]) == TRUE) + { + ClearSecretBase(&basesB[i]); + var1 |= 2; + } + } + + if ((var1 & 4) == 0) + { + if (sub_80BD358(&basesC[i]) == TRUE) + { + ClearSecretBase(&basesC[i]); + var1 |= 4; + } + } + + if (var1 == 7) + { + break; + } + } +} + +bool8 sub_80BD494(struct SecretBaseRecord *base, struct SecretBaseRecord *secretBases, u8 c) +{ + u8 i; + + for (i = 0; i < MAX_SECRET_BASES; i++) + { + if (secretBases[i].secretBaseId) + { + if (sub_80BD0EC(base, &secretBases[i]) == TRUE) + { + if (c == 0) + { + ClearSecretBase(&secretBases[i]); + return FALSE; + } + + if (base->sbr_field_e > secretBases[i].sbr_field_e) + { + ClearSecretBase(&secretBases[i]); + return FALSE; + } + + secretBases[i].sbr_field_1_0 = base->sbr_field_1_0; + + ClearSecretBase(base); + return TRUE; + } + } + } + + return FALSE; +} + +void sub_80BD514(struct SecretBaseRecord *basesA, struct SecretBaseRecord *basesB, struct SecretBaseRecord *basesC, struct SecretBaseRecord *basesD) +{ + u8 i; + + for (i = 1; i < MAX_SECRET_BASES; i++) + { + if (basesA[i].secretBaseId) + { + if (basesA[i].sbr_field_1_6 == 1) + { + basesA[i].sbr_field_1_0 = 1; + } + + if (!sub_80BD494(&basesA[i], basesB, i)) + { + if (!sub_80BD494(&basesA[i], basesC, i)) + { + sub_80BD494(&basesA[i], basesD, i); + } + } + } + } + + for (i = 0; i < MAX_SECRET_BASES; i++) + { + if (basesB[i].secretBaseId) + { + basesB[i].sbr_field_1_5 = 0; + + if (!sub_80BD494(&basesB[i], basesC, i)) + { + sub_80BD494(&basesB[i], basesD, i); + } + } + } + + for (i = 0; i < MAX_SECRET_BASES; i++) + { + if (basesC[i].secretBaseId) + { + basesC[i].sbr_field_1_5 = 0; + sub_80BD494(&basesC[i], basesD, i); + } + + if (basesD[i].secretBaseId) + { + basesD[i].sbr_field_1_5 = 0; + } + } +} + +void sub_80BD610(struct SecretBaseRecord *basesA, struct SecretBaseRecord *basesB, struct SecretBaseRecord *basesC) +{ + sub_80BD3DC(basesA, basesB, basesC); + sub_80BD514(gSaveBlock1.secretBases, basesA, basesB, basesC); + + sub_80BD1FC(basesA); + sub_80BD1FC(basesB); + sub_80BD1FC(basesC); + + sub_80BD328(basesA, 1); + sub_80BD328(basesB, 1); + sub_80BD328(basesC, 1); + + sub_80BD328(basesA, 0); + sub_80BD328(basesB, 0); + sub_80BD328(basesC, 0); +} + +void sub_80BD674(void *playerRecords, u32 size, u8 c) +{ + if (FlagGet(0x60)) + { + u16 i; + u8 numLinkedPlayers = GetLinkPlayerCount(); + switch (numLinkedPlayers) + { + case 2: + memset(playerRecords + size * 2, 0, size); + memset(playerRecords + size * 3, 0, size); + break; + case 3: + memset(playerRecords + size * 3, 0, size); + break; + } + + switch (c) + { + case 0: + sub_80BD610(playerRecords + size, playerRecords + size * 2, playerRecords + size * 3); + break; + case 1: + sub_80BD610(playerRecords + size * 2, playerRecords + size * 3, playerRecords); + break; + case 2: + sub_80BD610(playerRecords + size * 3, playerRecords, playerRecords + size); + break; + case 3: + sub_80BD610(playerRecords, playerRecords + size, playerRecords + size * 2); + break; + } + + for (i = 1; i < MAX_SECRET_BASES; i++) + { + if (gSaveBlock1.secretBases[i].sbr_field_1_0 == 1) + { + gSaveBlock1.secretBases[i].sbr_field_1_6 = 1; + gSaveBlock1.secretBases[i].sbr_field_1_0 = 0; + } + } + + sub_80BD280(); + + for (i = 1; i < MAX_SECRET_BASES; i++) + { + if (gSaveBlock1.secretBases[i].sbr_field_1_6 == 2) + { + gSaveBlock1.secretBases[i].sbr_field_1_6 = 0; + } + } + + if (gSaveBlock1.secretBases[0].sbr_field_e != 0xFFFF) + { + gSaveBlock1.secretBases[0].sbr_field_e++; + } + } +} diff --git a/src/shop.c b/src/field/shop.c index 22250b1c4..375205935 100644 --- a/src/shop.c +++ b/src/field/shop.c @@ -282,7 +282,7 @@ void BuyMenuDrawGraphics(void) register const u32 zero asm("r6") = 0; DmaFill32(3, zero, addr, OAM_SIZE); LZDecompressVram(gBuyMenuFrame_Gfx, (void*)(VRAM + 0x7C00)); - sub_800D238(gBuyMenuFrame_Tilemap, (void *)0x02018000); + LZDecompressWram(gBuyMenuFrame_Tilemap, (void *)0x02018000); LoadCompressedPalette(gMenuMoneyPal, 0xC0, sizeof(gMenuMoneyPal)); FreeAllSpritePalettes(); ResetPaletteFade(); diff --git a/src/slot_machine.c b/src/field/slot_machine.c index c9a06a758..153970337 100644 --- a/src/slot_machine.c +++ b/src/field/slot_machine.c @@ -71,7 +71,7 @@ void sub_8106448(void) { u32 offsetRead, offsetWrite; u32 size; - sub_800D238(gSlotMachine_Gfx, (void *) 0x02010000); + LZDecompressWram(gSlotMachine_Gfx, (void *) 0x02010000); offsetRead = 0x02010000; offsetWrite = BG_VRAM; @@ -94,7 +94,7 @@ void sub_8106448(void) { } void sub_81064B8(void) { - CpuCopy16(gUnknown_08E95AB8, (void *) BG_SCREEN_ADDR(29), 20 * 32 * 2); + CpuCopy16(gUnknown_08E95AB8, BG_SCREEN_ADDR(29), 20 * 32 * 2); LoadSlotMachineWheelOverlay(); } @@ -102,7 +102,7 @@ static void LoadSlotMachineWheelOverlay(void) { s16 x, y, dx; u16 *screen; - screen = (u16 *) BG_SCREEN_ADDR(30); + screen = BG_SCREEN_ADDR(30); for (x = 4; x < 18; x += 5) { @@ -125,7 +125,7 @@ static void LoadSlotMachineWheelOverlay(void) { } void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4) { - u16 *vram = (u16 *) BG_SCREEN_ADDR(29); + u16 *vram = BG_SCREEN_ADDR(29); vram[15 * 32 + arg0] = arg1; vram[15 * 32 + 1 + arg0] = arg2; @@ -137,9 +137,9 @@ void sub_81065DC(void) { s16 y, x; u16 *screen; - CpuCopy16(gUnknown_08E95FB8, (void *) BG_SCREEN_ADDR(29), 20 * 32 * 2); + CpuCopy16(gUnknown_08E95FB8, BG_SCREEN_ADDR(29), 20 * 32 * 2); - screen = (u16 *) BG_SCREEN_ADDR(30); + screen = BG_SCREEN_ADDR(30); for (y = 0; y < 20; y++) { for (x = 0; x < 30; x++) diff --git a/src/start_menu.c b/src/field/start_menu.c index 6e44090df..6e44090df 100644 --- a/src/start_menu.c +++ b/src/field/start_menu.c diff --git a/src/starter_choose.c b/src/field/starter_choose.c index 2b28df4f0..2b28df4f0 100644 --- a/src/starter_choose.c +++ b/src/field/starter_choose.c diff --git a/src/trader.c b/src/field/trader.c index 61f48fad8..61f48fad8 100644 --- a/src/trader.c +++ b/src/field/trader.c diff --git a/src/trainer_see.c b/src/field/trainer_see.c index 5a8ebbafc..85bd7ad0b 100644 --- a/src/trainer_see.c +++ b/src/field/trainer_see.c @@ -257,7 +257,7 @@ static bool8 sub_8084398(u8 taskId, struct Task *task, struct MapObject *trainer { u8 direction; - FieldObjectGetLocalIdAndMap(trainerObj, (u8 *)&gFieldEffectArguments[0], (u8 *)&gFieldEffectArguments[1], (u8 *)&gFieldEffectArguments[2]); + FieldObjectGetLocalIdAndMap(trainerObj, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_1); direction = GetFaceDirectionAnimId(trainerObj->mapobj_unk_18); FieldObjectSetSpecialAnim(trainerObj, direction); diff --git a/src/tv.c b/src/field/tv.c index 734cbad6f..87fc03065 100644 --- a/src/tv.c +++ b/src/field/tv.c @@ -123,7 +123,6 @@ void ClearTVShowData(void) bool8 sub_80BF1B4(u8); void sub_80BF20C(void); -extern u16 sub_8135D3C(u8); extern u8 gScriptContestCategory; extern u8 gScriptContestRank; extern u8 gUnknown_03004316[11]; @@ -674,12 +673,12 @@ void sub_80BE320(void) bravoTrainerTower->var00 = TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE; bravoTrainerTower->var01 = 1; StringCopy(bravoTrainerTower->trainerName, gSaveBlock2.playerName); - StringCopy(bravoTrainerTower->pokemonName, gSaveBlock2.filler_A8.filler_3DC); - bravoTrainerTower->species = gSaveBlock2.filler_A8.var_480; - bravoTrainerTower->defeatedSpecies = gSaveBlock2.filler_A8.var_482; - bravoTrainerTower->var16 = sub_8135D3C(gSaveBlock2.filler_A8.var_4D0); - bravoTrainerTower->var1c = gSaveBlock2.filler_A8.var_4AD; - if (gSaveBlock2.filler_A8.var_4D0 == 0) + StringCopy(bravoTrainerTower->pokemonName, gSaveBlock2.battleTower.defeatedByTrainerName); + bravoTrainerTower->species = gSaveBlock2.battleTower.firstMonSpecies; + bravoTrainerTower->defeatedSpecies = gSaveBlock2.battleTower.defeatedBySpecies; + bravoTrainerTower->var16 = GetCurrentBattleTowerWinStreak(gSaveBlock2.battleTower.lastStreakLevelType); + bravoTrainerTower->var1c = gSaveBlock2.battleTower.battleOutcome; + if (gSaveBlock2.battleTower.lastStreakLevelType == 0) bravoTrainerTower->btLevel = 50; else bravoTrainerTower->btLevel = 100; @@ -1555,7 +1554,7 @@ u16 sub_80BF674(u16 species) rspecies = (Random() % (NUM_SPECIES - 1)) + 1; cspecies = rspecies; - while (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(cspecies), 0) != 1 || cspecies == species) + while (GetSetPokedexFlag(SpeciesToNationalPokedexNum(cspecies), 0) != 1 || cspecies == species) { if (cspecies == SPECIES_BULBASAUR) cspecies = NUM_SPECIES - 1; @@ -2319,7 +2318,7 @@ void sub_80C03A8(u8 showidx) void sub_80C03C8(u16 species, u8 showidx) { - if (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(species), 0) == 0) + if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), 0) == 0) gSaveBlock1.tvShows[showidx].common.var01 = 0; } diff --git a/src/use_pokeblock.c b/src/field/use_pokeblock.c index be3003680..5fbecec0d 100644 --- a/src/use_pokeblock.c +++ b/src/field/use_pokeblock.c @@ -1,5 +1,5 @@ // -// Created by Scott Norton on 5/31/17. + // Modified by Dizzy Egg on 8/15/17. // @@ -22,10 +22,10 @@ #ifdef GERMAN extern const u16 ConditionUpDownPalette[16]; -extern const u32 ConditionUpDownTiles[0x80]; +extern const u8 ConditionUpDownTiles[0x200]; #else const u16 ConditionUpDownPalette[] = INCBIN_U16("graphics/misc/condition_up_down.gbapal"); -const u32 ConditionUpDownTiles[] = INCBIN_U32("graphics/misc/condition_up_down.4bpp"); +const u8 ConditionUpDownTiles[] = INCBIN_U8("graphics/misc/condition_up_down.4bpp"); #endif static const u32 sContestStatsMonData[] = { @@ -49,7 +49,7 @@ static const u8 *const sContextStatNames[] = { }; static const struct SpriteSheet gSpriteSheet_ConditionUpDown = { - (u8 *)ConditionUpDownTiles, + ConditionUpDownTiles, sizeof ConditionUpDownTiles, GFX_TAG_CONDITIONUPDOWN }; diff --git a/src/wallclock.c b/src/field/wallclock.c index 8db13dc2d..8db13dc2d 100644 --- a/src/wallclock.c +++ b/src/field/wallclock.c diff --git a/src/wild_encounter.c b/src/field/wild_encounter.c index 390898917..390898917 100644 --- a/src/wild_encounter.c +++ b/src/field/wild_encounter.c diff --git a/src/agb_flash.c b/src/libs/agb_flash.c index 340d469a7..5b171abcb 100644 --- a/src/agb_flash.c +++ b/src/libs/agb_flash.c @@ -9,7 +9,7 @@ static u16 sSavedIme; u8 gFlashTimeoutFlag; u8 (*PollFlashStatus)(u8 *); u16 (*WaitForFlashWrite)(u8 phase, u8 *addr, u8 lastData); -u16 (*ProgramFlashSector)(u16 sectorNum, u8 *src); +u16 (*ProgramFlashSector)(u16 sectorNum, void *src); const struct FlashType *gFlash; u16 (*ProgramFlashByte)(u16 sectorNum, u32 offset, u8 data); u16 gFlashNumRemainingBytes; @@ -135,7 +135,7 @@ void ReadFlash_Core(u8 *src, u8 *dest, u32 size) } } -void ReadFlash(u16 sectorNum, u32 offset, u8 *dest, u32 size) +void ReadFlash(u16 sectorNum, u32 offset, void *dest, u32 size) { u8 *src; u16 i; @@ -256,7 +256,7 @@ u32 VerifyFlashSectorNBytes(u16 sectorNum, u8 *src, u32 n) return verifyFlashSector_Core(src, tgt, n); } -u32 ProgramFlashSectorAndVerify(u16 sectorNum, u8 *src) // 3rd is unused +u32 ProgramFlashSectorAndVerify(u16 sectorNum, u8 *src) { u8 i; u32 result; @@ -275,18 +275,18 @@ u32 ProgramFlashSectorAndVerify(u16 sectorNum, u8 *src) // 3rd is unused return result; // return 0 if verified and programmed. } -u32 ProgramFlashSectorAndVerifyNBytes(u16 sectorNum, u8 *src, u32 n) +u32 ProgramFlashSectorAndVerifyNBytes(u16 sectorNum, void *dataSrc, u32 n) { u8 i; u32 result; for (i = 0; i < 3; i++) { - result = ProgramFlashSector(sectorNum, src); + result = ProgramFlashSector(sectorNum, dataSrc); if (result != 0) continue; - result = VerifyFlashSectorNBytes(sectorNum, src, n); + result = VerifyFlashSectorNBytes(sectorNum, dataSrc, n); if (result == 0) break; } diff --git a/src/agb_flash_1m.c b/src/libs/agb_flash_1m.c index e249fab9a..e249fab9a 100644 --- a/src/agb_flash_1m.c +++ b/src/libs/agb_flash_1m.c diff --git a/src/agb_flash_le.c b/src/libs/agb_flash_le.c index 39d956e27..39d956e27 100644 --- a/src/agb_flash_le.c +++ b/src/libs/agb_flash_le.c diff --git a/src/agb_flash_mx.c b/src/libs/agb_flash_mx.c index 67348901f..b4f710f36 100644 --- a/src/agb_flash_mx.c +++ b/src/libs/agb_flash_mx.c @@ -157,7 +157,7 @@ static u16 ProgramByte(u8 *src, u8 *dest) return WaitForFlashWrite(1, dest, *src); } -u16 ProgramFlashSector_MX(u16 sectorNum, u8 *src) +u16 ProgramFlashSector_MX(u16 sectorNum, void *src) { u16 result; u8 *dest; diff --git a/src/libc.c b/src/libs/libc.c index 920673e3e..920673e3e 100644 --- a/src/libc.c +++ b/src/libs/libc.c diff --git a/src/m4a_2.c b/src/libs/m4a_2.c index 2d3c65848..2d3c65848 100644 --- a/src/m4a_2.c +++ b/src/libs/m4a_2.c diff --git a/src/m4a_4.c b/src/libs/m4a_4.c index 2e1d140b4..2e1d140b4 100644 --- a/src/m4a_4.c +++ b/src/libs/m4a_4.c diff --git a/src/m4a_tables.c b/src/libs/m4a_tables.c index 91f00a31d..91f00a31d 100644 --- a/src/m4a_tables.c +++ b/src/libs/m4a_tables.c diff --git a/src/siirtc.c b/src/libs/siirtc.c index 965a068f1..965a068f1 100644 --- a/src/siirtc.c +++ b/src/libs/siirtc.c diff --git a/src/party_menu.c b/src/party_menu.c deleted file mode 100644 index 39477e293..000000000 --- a/src/party_menu.c +++ /dev/null @@ -1,1494 +0,0 @@ -#include "global.h" -#include "party_menu.h" -#include "battle.h" -#include "battle_interface.h" -#include "battle_party_menu.h" -#include "data2.h" -#include "event_data.h" -#include "item.h" -#include "item_use.h" -#include "mail_data.h" -#include "main.h" -#include "menu.h" -#include "palette.h" -#include "pokemon.h" -#include "pokemon_item_effect.h" -#include "pokemon_menu.h" -#include "pokemon_summary_screen.h" -#include "rom_8077ABC.h" -#include "rom_8094928.h" -#include "songs.h" -#include "sound.h" -#include "species.h" -#include "sprite.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" -#include "sprite.h" -#include "palette.h" -#include "event_data.h" -#include "main.h" -#include "item.h" -#include "battle_interface.h" -#include "species.h" -#include "party_menu.h" - -struct Unk201C000 -{ - /*0x00*/ struct Pokemon *pokemon; - /*0x04*/ u8 unk4; - /*0x05*/ u8 unk5; - /*0x06*/ u16 unk6; - /*0x08*/ u16 unk8; - /*0x0A*/ u8 pad_0A[2]; - /*0x0C*/ s32 unkC; - /*0x10*/ TaskFunc unk10; - /*0x14*/ TaskFunc unk14; -}; - -struct Unk201F000 -{ - u8 filler0[0xE00]; - u8 unkE00[3]; // not sure if this is an array or struct, or how big it is -}; - -struct UnknownStruct5 -{ - u8 unk0; - u8 unk1; - u16 *unk4; -}; - -#define ewram1C000 (*(struct Unk201C000 *)(ewram + 0x1C000)) -#define ewram1F000 (*(struct Unk201F000 *)(ewram + 0x1F000)) - -extern u8 gUnknown_0202E8F4; -extern u8 gUnknown_0202E8F6; -extern u16 gUnknown_0202E8F8; -extern u8 gUnknown_0202E8FA; -extern u8 gLastFieldPokeMenuOpened; -extern u8 gPlayerPartyCount; -extern s32 gBattleMoveDamage; - -//extern const u16 gUnknown_083769A8[][6]; -//extern const u8 gUnknown_083769A8[][12]; -extern void *const gUnknown_08376858[][6]; -extern const u8 gUnknown_083769A8[]; -extern const u8 gUnknown_08376D1C[DATA_COUNT]; -extern const u16 gUnknown_08376504[]; -extern void (*const gUnknown_08376B54[])(u8); -extern const u8 *const gUnknown_08376D04[DATA_COUNT]; -extern const struct UnknownStruct5 gUnknown_08376BB4[][6]; - -static void sub_806E884(u8 taskId); - -/* -void sub_806AEDC(void) -{ - const struct UnknownStruct5 *r5; - s32 i; - - AnimateSprites(); - BuildOamBuffer(); - r5 = gUnknown_08376BB4[gUnknown_0202E8FA]; - for (i = 0; i < 6; i++) - sub_800142C(r5[i].unk0 * 8, r5[i].unk1 * 8, r5[i].unk4, 0, (i << 5) | 0x200); - RunTasks(); - UpdatePaletteFade(); -} -*/ - -#if ENGLISH -#define WINDOW_LEFT (3) -#define WINDOW_RIGHT (26) -#elif GERMAN -#define WINDOW_LEFT (0) -#define WINDOW_RIGHT (29) -#endif - -u8 sub_806E834(const u8 *message, u8 arg1) -{ - u8 taskId; - - gUnknown_0202E8F6 = 1; - - MenuDrawTextWindow(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); - MenuPrintMessage(message, WINDOW_LEFT + 1, 15); - - taskId = CreateTask(sub_806E884, 1); - gTasks[taskId].data[0] = arg1; - - return taskId; -} - -static void sub_806E884(u8 taskId) -{ - if (MenuUpdateWindowText()) - { - gUnknown_0202E8F6 = 0; - if (gTasks[taskId].data[0] == 0) - MenuZeroFillWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); - DestroyTask(taskId); - } -} - -void sub_806E8D0(u8 taskId, u16 b, TaskFunc c) -{ - ewram1C000.unk10 = c; - ewram1C000.unk4 = taskId; - ewram1C000.unk5 = sub_806CA38(taskId); - ewram1C000.unk6 = b; - ewram1C000.pokemon = &gPlayerParty[ewram1C000.unk5]; -} - -bool8 PartyMenuUpdateMonHeldItem(struct Pokemon *pkmn, u16 item) -{ - u8 itemData[2]; - - if (ItemIsMail(item) == TRUE) - { - if (GiveMailToMon(pkmn, item) == 0xFF) - return TRUE; - gUnknown_0202E8F4 = 2; - } - else - { - gUnknown_0202E8F4 = 1; - } - - itemData[0] = item; - itemData[1] = item >> 8; - SetMonData(pkmn, MON_DATA_HELD_ITEM, itemData); - return FALSE; -} - -void PartyMenuTryGiveMonHeldItem(u8 taskId, u16 newItem, TaskFunc c) -{ - u16 currentItem; - - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, newItem, c); - currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); - gUnknown_0202E8F4 = 0; - gUnknown_0202E8F8 = 0; - if (currentItem != 0) - { - if (ItemIsMail(currentItem) == TRUE) - { - sub_806E834(gOtherText_MailMustBeRemoved, 1); - CreateTask(party_menu_link_mon_held_item_object, 5); - } - else - { - GetMonNickname(ewram1C000.pokemon, gStringVar1); - CopyItemName(currentItem, gStringVar2); - StringExpandPlaceholders(gStringVar4, gOtherText_AlreadyHolding); - sub_806E834(gStringVar4, 1); - CreateTask(Task_ConfirmGiveHeldItem, 5); - if (ItemIsMail(newItem) == TRUE) - gUnknown_0202E8F8 = currentItem; - } - } - else - { - PartyMenuUpdateMonHeldItem(ewram1C000.pokemon, newItem); - RemoveBagItem(newItem, 1); - if (ItemIsMail(newItem)) - { - gTasks[taskId].func = c; - } - else - { - DisplayGiveHeldItemMessage(ewram1C000.unk5, newItem, 1); - CreateTask(party_menu_link_mon_held_item_object, 5); - } - } -} - -void party_menu_link_mon_held_item_object(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.unk5); - gTasks[ewram1C000.unk4].func = ewram1C000.unk10; - DestroyTask(taskId); - } -} - -void PartyMenuTryGiveMonHeldItem_806EACC(u8 taskId) -{ - s8 selection = ProcessMenuInputNoWrap_(); - - if (selection == 0) - { - u16 currentItem; - - MenuZeroFillWindowRect(23, 8, 29, 13); - currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); - RemoveBagItem(ewram1C000.unk6, 1); - if (AddBagItem(currentItem, 1) == TRUE) - { - PartyMenuUpdateMonHeldItem(ewram1C000.pokemon, ewram1C000.unk6); - if (ItemIsMail(ewram1C000.unk6)) - { - DisplayTakeHeldItemMessage(ewram1C000.unk5, currentItem, 1); - } - else - { - CopyItemName(ewram1C000.unk6, gStringVar1); - StringExpandPlaceholders(gStringVar4, gOtherText_TakenAndReplaced); - sub_806E834(gStringVar4, 1); - } - } - else - { - sub_806E834(gOtherText_BagFullCannotRemoveItem, 0); - AddBagItem(ewram1C000.unk6, 1); - } - } - else - { - if (selection != 1 && selection != -1) - return; - if (selection == -1) - PlaySE(SE_SELECT); - MenuZeroFillWindowRect(23, 8, 29, 13); - } - gTasks[taskId].func = party_menu_link_mon_held_item_object; -} - -void Task_ConfirmGiveHeldItem(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - DisplayYesNoMenu(23, 8, 1); - gTasks[taskId].func = PartyMenuTryGiveMonHeldItem_806EACC; - } -} - -void DisplayGiveHeldItemMessage(u8 a, u16 b, u8 c) -{ - GetMonNickname(&gPlayerParty[a], gStringVar1); - CopyItemName(b, gStringVar2); - StringExpandPlaceholders(gStringVar4, gOtherText_WasGivenToHold); - sub_806E834(gStringVar4, c); -} - - -// Not sure about this one for now. -/* -void PartyMenuTryGiveMonMail(u8 taskId, TaskFunc func) -{ - u16 currentItem; - struct MailStruct *r4; - - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, 0, func); - currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); - gUnknown_0202E8F4 = 0; - r4 = &gSaveBlock1.mail[ewram1F000.unkE00[0] + ewram1F000.unkE00[2]]; - if (currentItem != 0) - { - sub_806E834(gOtherText_PokeHoldingItemCantMail, 1); - CreateTask(party_menu_link_mon_held_item_object, 5); - } - else - { - GiveMailToMon2(ewram1C000.pokemon, r4); - ClearMailStruct(r4); - sub_806E834(gOtherText_MailTransferredMailbox, 1); - CreateTask(party_menu_link_mon_held_item_object, 5); - } -} -*/ -__attribute__((naked)) -void PartyMenuTryGiveMonMail(u8 taskId, TaskFunc func) -{ - asm(".syntax unified\n\ - push {r4,r5,lr}\n\ - adds r2, r1, 0\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - ldr r3, _0806ECA0 @ =gTasks\n\ - lsls r1, r0, 2\n\ - adds r1, r0\n\ - lsls r1, 3\n\ - adds r1, r3\n\ - ldr r3, _0806ECA4 @ =TaskDummy\n\ - str r3, [r1]\n\ - movs r1, 0\n\ - bl sub_806E8D0\n\ - ldr r5, _0806ECA8 @ =0x0201c000\n\ - ldr r0, [r5]\n\ - movs r1, 0xC\n\ - bl GetMonData\n\ - lsls r0, 16\n\ - ldr r2, _0806ECAC @ =gUnknown_0202E8F4\n\ - movs r1, 0\n\ - strb r1, [r2]\n\ - movs r1, 0xF8\n\ - lsls r1, 6\n\ - adds r2, r5, r1\n\ - ldrb r1, [r2]\n\ - adds r1, 0x6\n\ - ldrb r2, [r2, 0x2]\n\ - adds r1, r2\n\ - lsls r2, r1, 3\n\ - adds r2, r1\n\ - lsls r2, 2\n\ - ldr r1, _0806ECB0 @ =gSaveBlock1 + 0x2B4C\n\ - adds r4, r2, r1\n\ - cmp r0, 0\n\ - beq _0806ECBC\n\ - ldr r0, _0806ECB4 @ =gOtherText_PokeHoldingItemCantMail\n\ - movs r1, 0x1\n\ - bl sub_806E834\n\ - ldr r0, _0806ECB8 @ =party_menu_link_mon_held_item_object\n\ - movs r1, 0x5\n\ - bl CreateTask\n\ - b _0806ECDA\n\ - .align 2, 0\n\ -_0806ECA0: .4byte gTasks\n\ -_0806ECA4: .4byte TaskDummy\n\ -_0806ECA8: .4byte 0x0201c000\n\ -_0806ECAC: .4byte gUnknown_0202E8F4\n\ -_0806ECB0: .4byte gSaveBlock1 + 0x2B4C\n\ -_0806ECB4: .4byte gOtherText_PokeHoldingItemCantMail\n\ -_0806ECB8: .4byte party_menu_link_mon_held_item_object\n\ -_0806ECBC:\n\ - ldr r0, [r5]\n\ - adds r1, r4, 0\n\ - bl GiveMailToMon2\n\ - adds r0, r4, 0\n\ - bl ClearMailStruct\n\ - ldr r0, _0806ECE0 @ =gOtherText_MailTransferredMailbox\n\ - movs r1, 0x1\n\ - bl sub_806E834\n\ - ldr r0, _0806ECE4 @ =party_menu_link_mon_held_item_object\n\ - movs r1, 0x5\n\ - bl CreateTask\n\ -_0806ECDA:\n\ - pop {r4,r5}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0806ECE0: .4byte gOtherText_MailTransferredMailbox\n\ -_0806ECE4: .4byte party_menu_link_mon_held_item_object\n\ - .syntax divided\n"); -} - -void PartyMenuTryGiveMonHeldItem_806ECE8(u8 taskId, TaskFunc func) -{ - u16 currentItem; - - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, 0, func); - currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); - if (currentItem == 0) - { - StringExpandPlaceholders(gStringVar4, gOtherText_NotHoldingAnything); - sub_806E834(gStringVar4, 0); - CreateTask(party_menu_link_mon_held_item_object, 5); - } - else - { - u8 itemData[2]; - - itemData[0] = 0; - itemData[1] = 0; - if (AddBagItem(currentItem, 1) == TRUE) - { - if (ItemIsMail(currentItem) == TRUE) - TakeMailFromMon(ewram1C000.pokemon); - DisplayTakeHeldItemMessage(ewram1C000.unk5, currentItem, 0); - SetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM, itemData); - } - else - { - sub_806E834(gOtherText_BagFullCannotRemoveItem, 0); - } - CreateTask(party_menu_link_mon_held_item_object, 5); - } -} - -void DisplayTakeHeldItemMessage(u8 a, u16 b, u8 c) -{ - GetMonNickname(&gPlayerParty[a], gStringVar1); - CopyItemName(b, gStringVar2); - StringExpandPlaceholders(gStringVar4, gOtherText_ReceivedTheThingFrom); - sub_806E834(gStringVar4, c); -} - -void DoTakeMail(u8 taskId, TaskFunc func) -{ - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, 0, func); - ewram1C000.unk6 = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); - sub_806E834(gOtherText_SendRemovedMailPrompt, 1); - CreateTask(Task_ConfirmTakeHeldMail, 5); -} - -void Task_LoseMailMessage(u8 taskId) -{ - s8 selection = ProcessMenuInputNoWrap_(); - - if (selection == 0) - { - if (AddBagItem(ewram1C000.unk6, 1) == TRUE) - { - TakeMailFromMon(ewram1C000.pokemon); - sub_806E834(gOtherText_MailTaken, 0); - } - else - { - sub_806E834(gOtherText_BagFullCannotRemoveItem, 0); - } - MenuZeroFillWindowRect(23, 8, 29, 13); - gTasks[taskId].func = party_menu_link_mon_held_item_object; - } - else - { - if (selection != 1 && selection != -1) - return; - if (selection == -1) - PlaySE(SE_SELECT); - MenuZeroFillWindowRect(23, 8, 29, 13); - MenuZeroFillWindowRect(0, 14, 29, 19); - gTasks[taskId].func = party_menu_link_mon_held_item_object; - } -} - -void Task_ConfirmLoseMailMessage(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - DisplayYesNoMenu(23, 8, 1); - gTasks[taskId].func = Task_LoseMailMessage; - } -} - -void Task_TakeHeldMail(u8 taskId) -{ - s8 selection = ProcessMenuInputNoWrap_(); - - if (selection == 0) - { - MenuZeroFillWindowRect(23, 8, 29, 13); - if (TakeMailFromMon2(ewram1C000.pokemon) != 0xFF) - sub_806E834(gOtherText_MailWasSent, 0); - else - sub_806E834(gOtherText_MailboxIsFull, 0); - gTasks[taskId].func = party_menu_link_mon_held_item_object; - } - else - { - if (selection != 1 && selection != -1) - return; - if (selection == -1) - PlaySE(SE_SELECT); - MenuZeroFillWindowRect(23, 8, 29, 13); - sub_806E834(gOtherText_MailRemovedMessageLost, 1); - gTasks[taskId].func = Task_ConfirmLoseMailMessage; - } -} - -void Task_ConfirmTakeHeldMail(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - DisplayYesNoMenu(23, 8, 1); - gTasks[taskId].func = Task_TakeHeldMail; - } -} - -u16 ItemIdToBattleMoveId(u16 item) -{ - u16 moveId = item - 289; - - return gUnknown_08376504[moveId]; -} - -bool8 pokemon_has_move(struct Pokemon *pkmn, u16 move) -{ - u8 i; - - for (i = 0; i < 4; i++) - { - if (GetMonData(pkmn, MON_DATA_MOVE1 + i) == move) - return TRUE; - } - return FALSE; -} - -void TeachMonTMMove(u8 taskId, u16 move, TaskFunc func) -{ - PlaySE(SE_SELECT); - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, move, func); - CreateTask(Task_TeamMonTMMove, 5); -} - -void Task_TeamMonTMMove(u8 taskId) -{ - GetMonNickname(ewram1C000.pokemon, gStringVar1); - ewram1C000.unk8 = ItemIdToBattleMoveId(ewram1C000.unk6); - StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); - ewram1B000.unk282 = 0; - if (pokemon_has_move(ewram1C000.pokemon, ewram1C000.unk8)) - { - StringExpandPlaceholders(gStringVar4, gOtherText_AlreadyKnows); - sub_806E834(gStringVar4, 1); - gTasks[taskId].func = party_menu_link_mon_held_item_object; - } - else - { - if (!CanMonLearnTMHM(ewram1C000.pokemon, ewram1C000.unk6 - 33)) - { - StringExpandPlaceholders(gStringVar4, gOtherText_NotCompatible); - sub_806E834(gStringVar4, 1); - gTasks[taskId].func = party_menu_link_mon_held_item_object; - } - else - { - if (GiveMoveToMon(ewram1C000.pokemon, ewram1C000.unk8) != 0xFFFF) - { - Task_TeamMonTMMove2(taskId); - } - else - { - StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn); - sub_806E834(gStringVar4, 1); - gTasks[taskId].func = sub_806F358; - } - } - } -} - -void Task_TeamMonTMMove2(u8 taskId) -{ - StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); - StringExpandPlaceholders(gStringVar4, gOtherText_LearnedMove); - sub_806E834(gStringVar4, 1); - AdjustFriendship(ewram1C000.pokemon, 4); - if (ewram1B000.unk282 == 0 && ewram1C000.unk6 <= 0x152) - RemoveBagItem(ewram1C000.unk6, 1); - gTasks[taskId].func = Task_TeamMonTMMove3; -} - -void Task_TeamMonTMMove3(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - PlayFanfare(BGM_FANFA1); - gTasks[taskId].func = Task_TeamMonTMMove4; - } -} - -void Task_TeamMonTMMove4(u8 taskId) -{ - if (IsFanfareTaskInactive()) - { - if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) - { - SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.unk5); - if (ewram1B000.unk282 == 1) - { - sub_8070C54(taskId); - } - else - { - gTasks[ewram1C000.unk4].func = ewram1C000.unk10; - DestroyTask(taskId); - } - } - } -} - -void sub_806F2FC(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.unk5); - if (ewram1B000.unk282 == 1) - { - sub_8070C54(taskId); - } - else - { - gTasks[ewram1C000.unk4].func = ewram1C000.unk10; - DestroyTask(taskId); - } - } -} - -void sub_806F358(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - DisplayYesNoMenu(23, 8, 1); - gTasks[taskId].func = sub_806F390; - } -} - -void sub_806F390(u8 taskId) -{ - s8 selection = ProcessMenuInputNoWrap_(); - - if (selection == 0) - { - MenuZeroFillWindowRect(23, 8, 29, 13); - sub_806E834(gOtherText_WhichMoveToForget2, 1); - gTasks[taskId].func = sub_806F44C; - } - else - { - if (selection != 1 && selection != -1) - return; - if (selection == -1) - PlaySE(SE_SELECT); - StopTryingToTeachMove_806F614(taskId); - } -} - -void sub_806F3FC(u8 taskId) -{ - if (!gPaletteFade.active) - { - sub_809D9F0(gPlayerParty, ewram1C000.unk5, gPlayerPartyCount - 1, sub_808B564, ewram1C000.unk8); - DestroyTask(taskId); - } -} - -void sub_806F44C(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gTasks[taskId].func = sub_806F3FC; - } -} - -void TaughtMove(u8 taskId) -{ - if (!gPaletteFade.active) - { - u8 moveIndex; - u16 r4; - - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, gScriptItemId, sub_808B508); - moveIndex = sub_809FA30(); - r4 = GetMonData(ewram1C000.pokemon, MON_DATA_MOVE1 + moveIndex); - GetMonNickname(ewram1C000.pokemon, gStringVar1); - StringCopy(gStringVar2, gMoveNames[r4]); - StringExpandPlaceholders(gStringVar4, gOtherText_ForgetMove123_2); - sub_806E834(gStringVar4, 1); - CreateTask(TMMoveUpdateMoveSlot, 5); - } -} - -void TMMoveUpdateMoveSlot(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - RemoveMonPPBonus(ewram1C000.pokemon, sub_809FA30()); - SetMonMoveSlot(ewram1C000.pokemon, ewram1C000.unk8, sub_809FA30()); - Task_TeamMonTMMove2(taskId); - } -} - -void StopTryingToTeachMove_806F588(u8 taskId) -{ - if (!gPaletteFade.active) - { - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, gScriptItemId, sub_808B508); - StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); - StringExpandPlaceholders(gStringVar4, gOtherText_StopTryingTo); - sub_806E834(gStringVar4, 1); - CreateTask(StopTryingToTeachMove_806F67C, 5); - } -} - -void StopTryingToTeachMove_806F614(u8 taskId) -{ - MenuZeroFillWindowRect(23, 8, 29, 13); - StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); - StringExpandPlaceholders(gStringVar4, gOtherText_StopTryingTo); - sub_806E834(gStringVar4, 1); - gTasks[taskId].func = StopTryingToTeachMove_806F67C; -} - -void StopTryingToTeachMove_806F67C(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - DisplayYesNoMenu(23, 8, 1); - gTasks[taskId].func = StopTryingToTeachMove_806F6B4; - } -} - -void StopTryingToTeachMove_806F6B4(u8 taskId) -{ - s8 selection = ProcessMenuInputNoWrap_(); - - if (selection == 0) - { - MenuZeroFillWindowRect(23, 8, 29, 13); - GetMonNickname(ewram1C000.pokemon, gStringVar1); - StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); - StringExpandPlaceholders(gStringVar4, gOtherText_DidNotLearnMove2); - sub_806E834(gStringVar4, 1); - gTasks[taskId].func = sub_806F2FC; - } - else - { - if (selection != 1 && selection != -1) - return; - if (selection == -1) - PlaySE(SE_SELECT); - MenuZeroFillWindowRect(23, 8, 29, 13); - GetMonNickname(ewram1C000.pokemon, gStringVar1); - StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); - StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn); - sub_806E834(gStringVar4, 1); - gTasks[taskId].func = sub_806F358; - } -} - -bool8 IsHMMove(u16 move) -{ - u8 i; - - for (i = 0; i < 8; i++) - { - if (gUnknown_08376504[50 + i] == move) - return TRUE; - } - return FALSE; -} - -s16 sub_806F7E8(u8 taskId, struct BattleInterfaceStruct1 *b, s8 c) -{ - s16 *taskData; - u8 hpBarLevel; - void *vramPtr; - - taskData = gTasks[taskId].data; - - b->unk0 = taskData[10]; - b->unk4 = taskData[11]; - b->unk8 = taskData[12] * c; - b->unk10 = 0x100; - hpBarLevel = GetHPBarLevel(ewram1B000.unk282, b->unk0); - if (hpBarLevel > 2) - b->unkC_0 = 4; - if (hpBarLevel == 2) - b->unkC_0 = 5; - if (hpBarLevel < 2) - b->unkC_0 = 6; - vramPtr = gUnknown_08376858[IsDoubleBattle()][ewram1C000.unk5]; - return sub_80460C8(b, &ewram1C000.unkC, vramPtr, 0); -} - -void sub_806F8AC(u8 taskId) -{ - struct BattleInterfaceStruct1 sp0; - u16 sp14; - - ewram1B000.unk282 = sub_806F7E8(taskId, &sp0, -1); - if (ewram1B000.unk282 == -1) - { - ewram1C000.unkC = 0; - if (-sp0.unk8 + sp0.unk4 > sp0.unk0) - sp14 = sp0.unk0 - sp0.unk4; - else - sp14 = -sp0.unk8; - gBattleMoveDamage = -sp14; - GetMonNickname(ewram1C000.pokemon, gStringVar1); - ConvertIntToDecimalStringN(gStringVar2, sp14, 0, 3); - if (gTasks[taskId].data[14] == 0) - StringExpandPlaceholders(gStringVar4, gOtherText_HPRestoredBy); - else - StringExpandPlaceholders(gStringVar4, gOtherText_RegainedHealth); - SetMonIconAnim(GetMonIconSpriteId_maybe(ewram1C000.unk4, ewram1C000.unk5), ewram1C000.pokemon); - task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.unk5 * 2], 7); - ewram1B000.unk261 = 2; - sub_806E834(gStringVar4, 1); - sp14 += sp0.unk4; - SetMonData(ewram1C000.pokemon, MON_DATA_HP, (u8 *)&sp14); - RemoveBagItem(ewram1C000.unk6, 1); - sub_8032638(); - gTasks[taskId].func = sub_806FB44; - } - else - { - PartyMenuDoPrintHP(ewram1C000.unk5, IsDoubleBattle(), ewram1B000.unk282, sp0.unk0); - } -} - -void sub_806FA18(u8 taskId) -{ - struct BattleInterfaceStruct1 sp0; - - ewram1B000.unk282 = sub_806F7E8(taskId, &sp0, 1); - if (ewram1B000.unk282 == -1) - { - PlaySE(SE_KAIFUKU); - ewram1C000.unkC = 0; - gTasks[taskId].data[11] -= gTasks[taskId].data[12]; - SetMonData(ewram1C000.pokemon, MON_DATA_HP, (u8 *)&gTasks[taskId].data[11]); - SetMonIconAnim(GetMonIconSpriteId_maybe(ewram1C000.unk4, ewram01000.unk1), ewram1C000.pokemon); - ewram1C000.unk5 = gSprites[ewram01000.unk2].data0; - ewram1C000.pokemon = &gPlayerParty[ewram1C000.unk5]; - gTasks[taskId].data[10] = GetMonData(ewram1C000.pokemon, MON_DATA_MAX_HP); - gTasks[taskId].data[11] = GetMonData(ewram1C000.pokemon, MON_DATA_HP); - ewram1C000.unkC = -32768; - ewram1C000.unk14 = ewram1C000.unk10; - gTasks[taskId].func = sub_806F8AC; - ewram1B000.unk282 = gTasks[taskId].data[11]; - } - else - { - PartyMenuDoPrintHP(ewram1C000.unk5, IsDoubleBattle(), ewram1B000.unk282, sp0.unk0); - } -} - -void sub_806FB0C(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - gTasks[ewram1C000.unk4].func = ewram1C000.unk10; - DestroyTask(taskId); - } -} - -void sub_806FB44(u8 taskId) -{ - if (gUnknown_0202E8F6 == 0) - { - gTasks[ewram1C000.unk4].func = ewram1C000.unk14; - DestroyTask(taskId); - } -} - -bool8 IsHPRecoveryItem(u16 item) -{ - const u8 *itemEffect; - - if (item == 0xAF) - itemEffect = gSaveBlock1.enigmaBerry.itemEffect; - else - itemEffect = gItemEffectTable[item - 13]; - - if (itemEffect[4] & 4) - return TRUE; - else - return FALSE; -} - -void PartyMenuUpdateLevelOrStatus(struct Pokemon *pkmn, u8 b) -{ - PartyMenuClearLevelStatusTilemap(b); - PartyMenuPrintMonLevelOrStatus(b, pkmn); -} - -void GetMedicineItemEffectMessage(u16 item) -{ - switch (GetItemEffectType(item)) - { - case 3: - StringExpandPlaceholders(gStringVar4, gOtherText_CuredPoisoning); - break; - case 4: - StringExpandPlaceholders(gStringVar4, gOtherText_WokeUp); - break; - case 5: - StringExpandPlaceholders(gStringVar4, gOtherText_BurnHealed); - break; - case 6: - StringExpandPlaceholders(gStringVar4, gOtherText_ThawedOut); - break; - case 7: - StringExpandPlaceholders(gStringVar4, gOtherText_CuredParalysis); - break; - case 8: - StringExpandPlaceholders(gStringVar4, gOtherText_SnapConfusion); - break; - case 9: - StringExpandPlaceholders(gStringVar4, gOtherText_GotOverLove); - break; - case 11: - StringExpandPlaceholders(gStringVar4, gOtherText_BecameHealthy); - break; - case 13: - StringCopy(gStringVar2, gOtherText_Hp2); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 12: - StringCopy(gStringVar2, gOtherText_Attack); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 17: - StringCopy(gStringVar2, gOtherText_Defense); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 16: - StringCopy(gStringVar2, gOtherText_Speed); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 14: - StringCopy(gStringVar2, gOtherText_SpAtk2); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 15: - StringCopy(gStringVar2, gOtherText_SpDef2); - StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised); - break; - case 19: - case 20: - StringExpandPlaceholders(gStringVar4, gOtherText_PPIncreased); - break; - case 21: - StringExpandPlaceholders(gStringVar4, gOtherText_PPRestored); - break; - default: - StringExpandPlaceholders(gStringVar4, gOtherText_WontHaveAnyEffect); - break; - } -} - -bool8 IsMedicineIneffective(struct Pokemon *pkmn, u16 item) -{ - if (GetItemEffectType(item) == 13 - && GetMonData(pkmn, MON_DATA_SPECIES) == SPECIES_SHEDINJA) - return TRUE; - else - return FALSE; -} - -bool8 ExecuteTableBasedItemEffect__(u8 a, u16 b, u8 c) -{ - if (gMain.inBattle) - return ExecuteTableBasedItemEffect_(&gPlayerParty[a], b, sub_8094C20(a), c); - else - return ExecuteTableBasedItemEffect_(&gPlayerParty[a], b, a, c); -} - -void UseMedicine(u8 taskId, u16 item, TaskFunc func) -{ - u8 r7; - bool8 r9 = FALSE; - bool8 r0; - - gTasks[taskId].func = TaskDummy; - r7 = CreateTask(TaskDummy, 5); - sub_806E8D0(taskId, item, func); - if (!IsMedicineIneffective(ewram1C000.pokemon, item)) - { - r9 = IsHPRecoveryItem(item); - if (r9 == TRUE) - { - gTasks[r7].data[10] = GetMonData(ewram1C000.pokemon, MON_DATA_MAX_HP); - gTasks[r7].data[11] = GetMonData(ewram1C000.pokemon, MON_DATA_HP); - if (gTasks[r7].data[10] == gTasks[r7].data[11]) - { - r9 = FALSE; - gTasks[r7].data[10] = 0; - gTasks[r7].data[11] = 0; - } - } - r0 = ExecuteTableBasedItemEffect__(ewram1C000.unk5, item, 0); - } - else - { - r0 = TRUE; - } - - if (r0) - { - gUnknown_0202E8F4 = 0; - PlaySE(SE_SELECT); - sub_806E834(gOtherText_WontHaveAnyEffect, 1); - gTasks[r7].func = sub_806FB0C; - } - else - { - u8 statusAndPkrs; - - gUnknown_0202E8F4 = 1; - if (!IsBlueYellowRedFlute(item)) - PlaySE(SE_KAIFUKU); - else - PlaySE(SE_BIDORO); - statusAndPkrs = GetMonStatusAndPokerus(ewram1C000.pokemon); - if (statusAndPkrs == 6 || statusAndPkrs == 0) - PartyMenuUpdateLevelOrStatus(ewram1C000.pokemon, ewram1C000.unk5); - if (r9 == TRUE) - { - gTasks[r7].data[12] = GetMonData(ewram1C000.pokemon, MON_DATA_HP) - gTasks[r7].data[11]; - ewram1C000.unkC = -32768; - if (gTasks[r7].data[11] == 0) - gTasks[r7].data[14] = 1; - else - gTasks[r7].data[14] = 0; - ewram1C000.unk14 = ewram1C000.unk10; - gTasks[r7].func = sub_806F8AC; - ewram1B000.unk282 = gTasks[r7].data[11]; - } - else - { - GetMonNickname(ewram1C000.pokemon, gStringVar1); - if (!IsBlueYellowRedFlute(item)) - RemoveBagItem(item, 1); - GetMedicineItemEffectMessage(item); - TryPrintPartyMenuMonNickname(ewram1C000.unk5, ewram1C000.pokemon); - sub_806E834(gStringVar4, 1); - gTasks[r7].func = sub_806FB0C; - } - } -} - -bool8 IsBlueYellowRedFlute(u16 item) -{ - if (item == 0x27 - || item == 0x29 - || item == 0x28) - return TRUE; - else - return FALSE; -} - -void sub_8070048(u8 taskId, u16 item, TaskFunc func) -{ - ewram1C000.unk10 = func; - ewram1C000.unk4 = taskId; - ewram1C000.unk6 = item; - ewram1C000.unk5 = 0; - ewram1C000.unk14 = sub_80701DC; - ewram1B000.unk27E = 0; - ewram1B000.unk280 = 0; - sub_8070088(taskId); -} - -void sub_8070088(u8 taskId) -{ - u8 taskId2; - - gTasks[taskId].func = TaskDummy; - if (GetMonData(&gPlayerParty[ewram1C000.unk5], MON_DATA_SPECIES) == 0) - { - gTasks[taskId].func = sub_80701DC; - } - else - { - s16 *taskData; - - taskId2 = CreateTask(TaskDummy, 5); - taskData = gTasks[taskId2].data; - ewram1C000.pokemon = &gPlayerParty[ewram1C000.unk5]; - taskData[10] = GetMonData(ewram1C000.pokemon, MON_DATA_MAX_HP); - taskData[11] = GetMonData(ewram1C000.pokemon, MON_DATA_HP); - if (ExecuteTableBasedItemEffect__(ewram1C000.unk5, ewram1C000.unk6, 0)) - { - DestroyTask(taskId2); - gTasks[taskId].func = sub_80701DC; - } - else - { - gUnknown_0202E8F4 = 1; - MenuZeroFillWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); - PlaySE(SE_KAIFUKU); - PartyMenuUpdateLevelOrStatus(ewram1C000.pokemon, ewram1C000.unk5); - task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.unk5 * 2], 9); - ewram1B000.unk261 = 2; - taskData[12] = GetMonData(ewram1C000.pokemon, MON_DATA_HP) - taskData[11]; - taskData[14] = 1; - ewram1B000.unk27E = 1; - ewram1B000.unk280 = 1; - ewram1B000.unk282 = taskData[11]; - ewram1C000.unkC = -32768; - gTasks[taskId2].func = sub_806F8AC; - } - } -} - -void sub_80701DC(u8 taskId) -{ - if (ewram1B000.unk27E == 1) - { - AddBagItem(ewram1C000.unk6, 1); - if (GetMonData(&gPlayerParty[ewram1C000.unk5], MON_DATA_SPECIES) != 0) - { - task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.unk5 * 2], 3); - ewram1B000.unk261 = 2; - } - ewram1B000.unk27E = 0; - } - ewram1C000.unk5++; - if (ewram1C000.unk5 == 6) - { - gUnknown_0202E8F4 = 0; - if (ewram1B000.unk280 == 0) - { - gTasks[taskId].func = TaskDummy; - sub_806E834(gOtherText_WontHaveAnyEffect, 1); - CreateTask(sub_806FB0C, 8); - } - else - { - RemoveBagItem(ewram1C000.unk6, 1); - gTasks[taskId].func = ewram1C000.unk10; - } - gLastFieldPokeMenuOpened = 0; - } - else - { - sub_8070088(taskId); - } -} - -void CreateItemUseMoveMenu(u8 partyMonIndex) -{ - u8 r6; - u8 i; - - r6 = 0; - MenuDrawTextWindow(19, 10, 29, 19); - for (i = 0; i < 4; i++) - { - u16 move = GetMonData(&gPlayerParty[partyMonIndex], MON_DATA_MOVE1 + i); - - MenuPrint(gMoveNames[move], 20, i * 2 + 11); - if (move != 0) - r6++; - } - InitMenu(0, 20, 11, r6, 0, 9); -} - -void Task_HandleItemUseMoveMenuInput(u8 taskId) -{ - if (gMain.newKeys & DPAD_UP) - { - PlaySE(SE_SELECT); - MoveMenuCursor(-1); - } - else if (gMain.newKeys & DPAD_DOWN) - { - PlaySE(SE_SELECT); - MoveMenuCursor(1); - } - else if (gMain.newKeys & A_BUTTON) - { - gUnknown_08376B54[0](taskId); - } - else if (gMain.newKeys & B_BUTTON) - { - PlaySE(SE_SELECT); - gUnknown_08376B54[1](taskId); - } -} - -void DoPPRecoveryItemEffect(u8 taskId, u16 b, TaskFunc c) -{ - const u8 *itemEffect; - u8 taskId2; - - if (b == 0xAF) - itemEffect = gSaveBlock1.enigmaBerry.itemEffect; - else - itemEffect = gItemEffectTable[b - 13]; - gTasks[taskId].func = TaskDummy; - taskId2 = CreateTask(TaskDummy, 5); - sub_806E8D0(taskId, b, c); - if (!(itemEffect[4] & 0x10)) - { - gTasks[taskId2].data[11] = 0; - DoRecoverPP(taskId2); - } - else - { - PlaySE(SE_SELECT); - sub_806D538(10, 3); - CreateItemUseMoveMenu(ewram1C000.unk5); - gTasks[taskId2].func = Task_HandleItemUseMoveMenuInput; - gMain.newKeys = 0; - } -} - -void ItemUseMoveMenu_HandleMoveSelection(u8 taskId) -{ - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(19, 10, 29, 19); - sub_806D5A4(); - gTasks[taskId].data[11] = GetMenuCursorPos(); - DoRecoverPP(taskId); -} - -void ItemUseMoveMenu_HandleCancel(u8 taskId) -{ - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(19, 10, 29, 19); - if (gMain.inBattle) - gTasks[ewram1C000.unk4].func = SetUpBattlePokemonMenu; - else - gTasks[ewram1C000.unk4].func = sub_808B0C0; - sub_806D538(3, 0); - DestroyTask(taskId); -} - -void DoRecoverPP(u8 taskId) -{ - u16 r5 = 0; - - if (ExecuteTableBasedItemEffect__(ewram1C000.unk5, ewram1C000.unk6, gTasks[taskId].data[11])) - { - gUnknown_0202E8F4 = r5; - PlaySE(SE_SELECT); - sub_806E834(gOtherText_WontHaveAnyEffect, 1); - } - else - { - gUnknown_0202E8F4 = 1; - PlaySE(SE_KAIFUKU); - RemoveBagItem(ewram1C000.unk6, 1); - r5 = GetMonData(ewram1C000.pokemon, MON_DATA_MOVE1 + gTasks[taskId].data[11]); - StringCopy(gStringVar1, gMoveNames[r5]); - GetMedicineItemEffectMessage(ewram1C000.unk6); - sub_806E834(gStringVar4, 1); - } - gTasks[taskId].func = sub_806FB0C; -} - -void DoPPUpItemEffect(u8 taskId, u16 b, TaskFunc c) -{ - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, b, c); - PlaySE(SE_SELECT); - sub_806D538(11, 3); - CreateItemUseMoveMenu(ewram1C000.unk5); - CreateTask(Task_HandleItemUseMoveMenuInput, 5); - gMain.newKeys = 0; -} - -void DoRareCandyItemEffect(u8 taskId, u16 b, TaskFunc c) -{ - u8 i; - bool8 r0; - - gTasks[taskId].func = TaskDummy; - sub_806E8D0(taskId, b, c); - - if (GetMonData(ewram1C000.pokemon, MON_DATA_LEVEL) != 100) - { - for (i = 0; i < 6; i++) - ewram1B000.unk264[i] = GetMonData(ewram1C000.pokemon, gUnknown_08376D1C[i]); - r0 = ExecuteTableBasedItemEffect__(ewram1C000.unk5, b, 0); - } - else - r0 = TRUE; - - if (r0) - { - gUnknown_0202E8F4 = 0; - PlaySE(SE_SELECT); - sub_806E834(gOtherText_WontHaveAnyEffect, 1); - CreateTask(sub_806FB0C, 5); - } - else - { - u8 level; - - gUnknown_0202E8F4 = 1; - PlayFanfareByFanfareNum(0); - sub_8070A20(ewram1C000.unk5, ewram1C000.pokemon); - RemoveBagItem(b, 1); - GetMonNickname(ewram1C000.pokemon, gStringVar1); - level = GetMonData(ewram1C000.pokemon, MON_DATA_LEVEL); - ConvertIntToDecimalStringN(gStringVar2, level, 0, 3); - StringExpandPlaceholders(gStringVar4, gOtherText_ElevatedTo); - sub_806E834(gStringVar4, 1); - CreateTask(Task_RareCandy1, 5); - } -} - -void Task_RareCandy1(u8 taskId) -{ - if (WaitFanfare(0) && gUnknown_0202E8F6 == 0) - { - if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) - { - PlaySE(SE_SELECT); - sub_8070848(taskId); - gTasks[taskId].func = Task_RareCandy2; - } - } -} - -void Task_RareCandy2(u8 taskId) -{ - if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) - { - PlaySE(SE_SELECT); - sub_8070968(taskId); - gTasks[taskId].func = Task_RareCandy3; - } -} - -#if ENGLISH -void sub_8070848(u8 taskId) -{ - u8 i; - - MenuDrawTextWindow(11, 0, 29, 7); - - for (i = 0; i < DATA_COUNT; i++) - { - u8 x; - u8 y; - u32 stat; - - stat = GetMonData(ewram1C000.pokemon, gUnknown_08376D1C[i]); - - ewram1B000.unk264[i + DATA_COUNT] = stat; - ewram1B000.unk264[i] = stat - ewram1B000.unk264[i]; - - x = (i / 3) * 9 + 11; - y = ((i % 3) << 1) + 1; - - MenuPrint_PixelCoords(gUnknown_08376D04[i], (x + 1) * 8, y * 8, 1); - - if (i == 2) - MenuPrint_PixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 0); - else - MenuPrint_PixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 1); - - gStringVar1[0] = EXT_CTRL_CODE_BEGIN; - gStringVar1[1] = 0x14; - gStringVar1[2] = 0x06; - - ConvertIntToDecimalStringN(gStringVar1 + 3, ewram1B000.unk264[i], 1, 2); - - MenuPrint_PixelCoords(gStringVar1, (x + 6) * 8 + 12, y * 8, 0); - } -} -#elif GERMAN -__attribute__((naked)) -void sub_8070848(u8 taskId) { - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - movs r0, 0xB\n\ - movs r1, 0\n\ - movs r2, 0x1D\n\ - movs r3, 0x7\n\ - bl MenuDrawTextWindow\n\ - movs r7, 0\n\ - ldr r0, _0807092C @ =gStringVar1\n\ - mov r10, r0\n\ - movs r1, 0xFC\n\ - mov r9, r1\n\ - movs r2, 0x13\n\ - mov r8, r2\n\ -_0807086C:\n\ - ldr r1, _08070930 @ =0x0201c000\n\ - ldr r0, [r1]\n\ - ldr r1, _08070934 @ =gUnknown_08376D1C\n\ - adds r1, r7, r1\n\ - ldrb r1, [r1]\n\ - bl GetMonData\n\ - adds r1, r7, 0x6\n\ - lsls r1, 1\n\ - ldr r2, _08070938 @ =0x0201b264\n\ - adds r1, r2, r1\n\ - strh r0, [r1]\n\ - lsls r6, r7, 1\n\ - adds r6, r2, r6\n\ - ldrh r1, [r6]\n\ - subs r0, r1\n\ - strh r0, [r6]\n\ - adds r0, r7, 0\n\ - movs r1, 0x3\n\ - bl __udivsi3\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r4, r0, 3\n\ - adds r4, r0\n\ - adds r4, 0xB\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - adds r0, r7, 0\n\ - movs r1, 0x3\n\ - bl __umodsi3\n\ - adds r5, r0, 0\n\ - lsls r5, 1\n\ - adds r5, 0x1\n\ - lsls r5, 24\n\ - lsrs r5, 24\n\ - ldr r1, _0807093C @ =gUnknown_08376D04\n\ - lsls r0, r7, 2\n\ - adds r0, r1\n\ - ldr r1, [r0]\n\ - mov r0, r10\n\ - bl StringCopy\n\ - adds r2, r0, 0\n\ - mov r0, r9\n\ - strb r0, [r2]\n\ - adds r2, 0x1\n\ - mov r1, r8\n\ - strb r1, [r2]\n\ - adds r2, 0x1\n\ - movs r0, 0x2E\n\ - strb r0, [r2]\n\ - adds r2, 0x1\n\ - adds r0, r2, 0\n\ - ldr r1, _08070940 @ =gOtherText_TallPlusAndRightArrow\n\ - bl StringCopy\n\ - adds r2, r0, 0\n\ - mov r0, r9\n\ - strb r0, [r2]\n\ - adds r2, 0x1\n\ - mov r1, r8\n\ - strb r1, [r2]\n\ - adds r2, 0x1\n\ - movs r0, 0x34\n\ - strb r0, [r2]\n\ - adds r2, 0x1\n\ - movs r0, 0\n\ - ldrsh r1, [r6, r0]\n\ - adds r0, r2, 0\n\ - movs r2, 0x1\n\ - movs r3, 0x2\n\ - bl ConvertIntToDecimalStringN\n\ - adds r4, 0x1\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - mov r0, r10\n\ - adds r1, r4, 0\n\ - adds r2, r5, 0\n\ - bl MenuPrint\n\ - adds r0, r7, 0x1\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - cmp r7, 0x5\n\ - bls _0807086C\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0807092C: .4byte gStringVar1\n\ -_08070930: .4byte 0x0201c000\n\ -_08070934: .4byte gUnknown_08376D1C\n\ -_08070938: .4byte 0x0201b264\n\ -_0807093C: .4byte gUnknown_08376D04\n\ -_08070940: .4byte gOtherText_TallPlusAndRightArrow\n\ - .syntax divided\n"); -} -#endif diff --git a/src/learn_move.c b/src/pokemon/learn_move.c index 33252c66b..33252c66b 100644 --- a/src/learn_move.c +++ b/src/pokemon/learn_move.c diff --git a/src/mail.c b/src/pokemon/mail.c index c5dd119e3..c5dd119e3 100644 --- a/src/mail.c +++ b/src/pokemon/mail.c diff --git a/src/mail_data.c b/src/pokemon/mail_data.c index ae3f4b3e8..ae3f4b3e8 100644 --- a/src/mail_data.c +++ b/src/pokemon/mail_data.c diff --git a/src/mon_markings.c b/src/pokemon/mon_markings.c index 0cad8db59..0cad8db59 100644 --- a/src/mon_markings.c +++ b/src/pokemon/mon_markings.c diff --git a/src/pokeblock_feed.c b/src/pokemon/pokeblock_feed.c index ccbb391af..5d6b215cd 100644 --- a/src/pokeblock_feed.c +++ b/src/pokemon/pokeblock_feed.c @@ -46,7 +46,7 @@ extern const u8 gBattleTerrainPalette_BattleTower[]; extern const struct CompressedSpriteSheet gUnknown_083F7F74; extern const struct CompressedSpritePalette gUnknown_083F7F7C; -bool8 sub_8040A3C(u16 species); +bool8 IsPokeSpriteNotFlipped(u16 species); // this file's functions static void sub_8147B04(void); @@ -626,7 +626,7 @@ static bool8 sub_8147B20(struct Pokemon* mon) species = GetMonData(mon, MON_DATA_SPECIES2); PiD = GetMonData(mon, MON_DATA_PERSONALITY); TiD = GetMonData(mon, MON_DATA_OT_ID); - palette = sub_80409C8(species, TiD, PiD); + palette = GetMonSpritePalStructFromOtIdPersonality(species, TiD, PiD); LoadCompressedObjectPalette(palette); GetMonSpriteTemplate_803C56C(palette->tag, 1); ewram[0x1FFFF]++; @@ -766,7 +766,7 @@ static u8 PokeblockFeed_CreatePokeSprite(struct Pokemon* mon) gSprites[spriteID].data2 = species; gSprites[spriteID].callback = SpriteCallbackDummy; gPokeblockMonNotFlipped = 1; - if (!sub_8040A3C(species)) + if (!IsPokeSpriteNotFlipped(species)) { gSprites[spriteID].affineAnims = sSpriteAffineAnimTable_84120EC; gSprites[spriteID].oam.affineMode = 3; diff --git a/src/pokedex.c b/src/pokemon/pokedex.c index 603b5ae48..947dfd218 100644 --- a/src/pokedex.c +++ b/src/pokemon/pokedex.c @@ -1,4 +1,3 @@ - #include "global.h" #include "gba/m4a_internal.h" #include "pokedex.h" @@ -150,7 +149,6 @@ extern const u8 gUnknown_08E96738[]; extern const u8 gUnknown_08E96888[]; extern const u8 gUnknown_08E96994[]; extern const u8 gUnknown_08E9C6DC[]; -extern const u8 gUnknown_08D00524[]; extern const u8 gUnknown_08E96BD4[]; extern const u8 gUnknown_08E96ACC[]; extern const u8 gUnknown_08E96B58[]; @@ -186,7 +184,7 @@ static const u8 gUnknown_0839FA7C[] = INCBIN_U8("graphics/pokedex/noball.4bpp.lz extern const u8 gUnknown_0839FA7C[]; #endif -#include "data/pokedex_orders.h" +#include "../data/pokedex_orders.h" static const struct OamData gOamData_83A0404 = { .y = 160, @@ -515,9 +513,9 @@ static const u8 gUnknown_083A05F1[] = {16, 8, 4, 2, 1}; const u8 gEmptySpacce_83A05F6[] = {0, 0}; // Padding, maybe? static const u8 gUnknown_083A05F8[] = _(""); #if ENGLISH -#include "data/pokedex_entries_en.h" +#include "../data/pokedex_entries_en.h" #elif GERMAN -#include "data/pokedex_entries_de.h" +#include "../data/pokedex_entries_de.h" #endif static const u16 gUnknown_083B4EC4[16] = {0}; static const u8 *const sMonFootprintTable[] = @@ -1320,8 +1318,8 @@ void ResetPokedex(void) { gSaveBlock2.pokedex.owned[i] = 0; gSaveBlock2.pokedex.seen[i] = 0; - gSaveBlock1.unk938[i] = 0; - gSaveBlock1.unk3A8C[i] = 0; + gSaveBlock1.dexSeen2[i] = 0; + gSaveBlock1.dexSeen3[i] = 0; } } @@ -2030,8 +2028,8 @@ static void SortPokedex(u8 dexMode, u8 sortMode) { vars[2] = HoennToNationalOrder(i + 1); gPokedexView->unk0[i].dexNum = vars[2]; - gPokedexView->unk0[i].seen = GetNationalPokedexFlag(vars[2], 0); - gPokedexView->unk0[i].owned = GetNationalPokedexFlag(vars[2], 1); + gPokedexView->unk0[i].seen = GetSetPokedexFlag(vars[2], 0); + gPokedexView->unk0[i].owned = GetSetPokedexFlag(vars[2], 1); if (gPokedexView->unk0[i].seen) gPokedexView->pokemonListCount = i + 1; } @@ -2045,14 +2043,14 @@ static void SortPokedex(u8 dexMode, u8 sortMode) for (i = 0; i < vars[0]; i++) { vars[2] = i + 1; - if (GetNationalPokedexFlag(vars[2], 0)) + if (GetSetPokedexFlag(vars[2], 0)) r10 = 1; if (r10) { asm(""); //Needed to match for some reason gPokedexView->unk0[r5].dexNum = vars[2]; - gPokedexView->unk0[r5].seen = GetNationalPokedexFlag(vars[2], 0); - gPokedexView->unk0[r5].owned = GetNationalPokedexFlag(vars[2], 1); + gPokedexView->unk0[r5].seen = GetSetPokedexFlag(vars[2], 0); + gPokedexView->unk0[r5].owned = GetSetPokedexFlag(vars[2], 1); if (gPokedexView->unk0[r5].seen) gPokedexView->pokemonListCount = r5 + 1; r5++; @@ -2065,11 +2063,11 @@ static void SortPokedex(u8 dexMode, u8 sortMode) { vars[2] = gPokedexOrder_Alphabetical[i]; - if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 0)) + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 0)) { gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; - gPokedexView->unk0[gPokedexView->pokemonListCount].owned = GetNationalPokedexFlag(vars[2], 1); + gPokedexView->unk0[gPokedexView->pokemonListCount].owned = GetSetPokedexFlag(vars[2], 1); gPokedexView->pokemonListCount++; } } @@ -2079,7 +2077,7 @@ static void SortPokedex(u8 dexMode, u8 sortMode) { vars[2] = gPokedexOrder_Weight[i]; - if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 1)) + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 1)) { gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; @@ -2093,7 +2091,7 @@ static void SortPokedex(u8 dexMode, u8 sortMode) { vars[2] = gPokedexOrder_Weight[i]; - if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 1)) + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 1)) { gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; @@ -2107,7 +2105,7 @@ static void SortPokedex(u8 dexMode, u8 sortMode) { vars[2] = gPokedexOrder_Height[i]; - if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 1)) + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 1)) { gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; @@ -2121,7 +2119,7 @@ static void SortPokedex(u8 dexMode, u8 sortMode) { vars[2] = gPokedexOrder_Height[i]; - if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 1)) + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 1)) { gPokedexView->unk0[gPokedexView->pokemonListCount].dexNum = vars[2]; gPokedexView->unk0[gPokedexView->pokemonListCount].seen = 1; @@ -3946,7 +3944,7 @@ static void sub_8090B8C(u8 taskId) otId = ((u16)gTasks[taskId].data[13] << 16) | (u16)gTasks[taskId].data[12]; personality = ((u16)gTasks[taskId].data[15] << 16) | (u16)gTasks[taskId].data[14]; paletteNum = gSprites[gTasks[taskId].data[3]].oam.paletteNum; - lzPaletteData = species_and_otid_get_pal(species, otId, personality); + lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, otId, personality); LoadCompressedPalette(lzPaletteData, 0x100 | paletteNum * 16, 32); DestroyTask(taskId); } @@ -4008,79 +4006,79 @@ u16 GetPokedexHeightWeight(u16 dexNum, u8 data) } } -s8 GetNationalPokedexFlag(u16 a, u8 b) +s8 GetSetPokedexFlag(u16 nationalDexNo, u8 caseID) { u8 index; u8 bit; u8 mask; s8 retVal; - a--; - index = a / 8; - bit = a % 8; + nationalDexNo--; + index = nationalDexNo / 8; + bit = nationalDexNo % 8; mask = 1 << bit; retVal = 0; - switch (b) + switch (caseID) { - case 0: + case FLAG_GET_SEEN: if (gSaveBlock2.pokedex.seen[index] & mask) { - if ((gSaveBlock2.pokedex.seen[index] & mask) == (gSaveBlock1.unk938[index] & mask) - && (gSaveBlock2.pokedex.seen[index] & mask) == (gSaveBlock1.unk3A8C[index] & mask)) + if ((gSaveBlock2.pokedex.seen[index] & mask) == (gSaveBlock1.dexSeen2[index] & mask) + && (gSaveBlock2.pokedex.seen[index] & mask) == (gSaveBlock1.dexSeen3[index] & mask)) retVal = 1; else { gSaveBlock2.pokedex.seen[index] &= ~mask; - gSaveBlock1.unk938[index] &= ~mask; - gSaveBlock1.unk3A8C[index] &= ~mask; + gSaveBlock1.dexSeen2[index] &= ~mask; + gSaveBlock1.dexSeen3[index] &= ~mask; retVal = 0; } } break; - case 1: + case FLAG_GET_CAUGHT: if (gSaveBlock2.pokedex.owned[index] & mask) { if ((gSaveBlock2.pokedex.owned[index] & mask) == (gSaveBlock2.pokedex.seen[index] & mask) - && (gSaveBlock2.pokedex.owned[index] & mask) == (gSaveBlock1.unk938[index] & mask) - && (gSaveBlock2.pokedex.owned[index] & mask) == (gSaveBlock1.unk3A8C[index] & mask)) + && (gSaveBlock2.pokedex.owned[index] & mask) == (gSaveBlock1.dexSeen2[index] & mask) + && (gSaveBlock2.pokedex.owned[index] & mask) == (gSaveBlock1.dexSeen3[index] & mask)) retVal = 1; else { gSaveBlock2.pokedex.owned[index] &= ~mask; gSaveBlock2.pokedex.seen[index] &= ~mask; - gSaveBlock1.unk938[index] &= ~mask; - gSaveBlock1.unk3A8C[index] &= ~mask; + gSaveBlock1.dexSeen2[index] &= ~mask; + gSaveBlock1.dexSeen3[index] &= ~mask; retVal = 0; } } break; - case 2: + case FLAG_SET_SEEN: gSaveBlock2.pokedex.seen[index] |= mask; - gSaveBlock1.unk938[index] |= mask; - gSaveBlock1.unk3A8C[index] |= mask; + gSaveBlock1.dexSeen2[index] |= mask; + gSaveBlock1.dexSeen3[index] |= mask; break; - case 3: + case FLAG_SET_CAUGHT: gSaveBlock2.pokedex.owned[index] |= mask; break; } return retVal; } -u16 GetNationalPokedexCount(u8 a) +u16 GetNationalPokedexCount(u8 caseID) { u16 count = 0; u16 i; for (i = 0; i < NATIONAL_DEX_COUNT; i++) { - switch (a) + switch (caseID) { - case 0: - if (GetNationalPokedexFlag(i + 1, 0) != 0) + case FLAG_GET_SEEN: + if (GetSetPokedexFlag(i + 1, FLAG_GET_SEEN)) count++; break; - case 1: - if (GetNationalPokedexFlag(i + 1, 1) != 0) + case FLAG_GET_CAUGHT: + if (GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT)) count++; break; } @@ -4088,21 +4086,21 @@ u16 GetNationalPokedexCount(u8 a) return count; } -u16 GetHoennPokedexCount(u8 a) +u16 GetHoennPokedexCount(u8 caseID) { u16 count = 0; u16 i; for (i = 0; i < 202; i++) { - switch (a) + switch (caseID) { - case 0: - if (GetNationalPokedexFlag(HoennToNationalOrder(i + 1), 0) != 0) + case FLAG_GET_SEEN: + if (GetSetPokedexFlag(HoennToNationalOrder(i + 1), FLAG_GET_SEEN)) count++; break; - case 1: - if (GetNationalPokedexFlag(HoennToNationalOrder(i + 1), 1) != 0) + case FLAG_GET_CAUGHT: + if (GetSetPokedexFlag(HoennToNationalOrder(i + 1), FLAG_GET_CAUGHT)) count++; break; } @@ -4116,7 +4114,7 @@ bool8 sub_8090FC0(void) for (i = 0; i < 200; i++) { - if (GetNationalPokedexFlag(HoennToNationalOrder(i + 1), 1) == 0) + if (!GetSetPokedexFlag(HoennToNationalOrder(i + 1), FLAG_GET_CAUGHT)) return FALSE; } return TRUE; @@ -4128,17 +4126,17 @@ u16 sub_8090FF4(void) for (i = 0; i < 150; i++) { - if (GetNationalPokedexFlag(i + 1, 1) == 0) + if (GetSetPokedexFlag(i + 1, 1) == 0) return 0; } for (i = 152; i < 250; i++) { - if (GetNationalPokedexFlag(i + 1, 1) == 0) + if (GetSetPokedexFlag(i + 1, 1) == 0) return 0; } for (i = 252; i < 384; i++) { - if (GetNationalPokedexFlag(i + 1, 1) == 0) + if (GetSetPokedexFlag(i + 1, 1) == 0) return 0; } return 1; diff --git a/src/pokedex_cry_screen.c b/src/pokemon/pokedex_cry_screen.c index 92fd832fc..ad7029f59 100644 --- a/src/pokedex_cry_screen.c +++ b/src/pokemon/pokedex_cry_screen.c @@ -49,7 +49,7 @@ u8 ShowPokedexCryScreen(struct CryRelatedStruct *cry, u8 arg1) { u32 r12; int x, y; - vram = (void *) BG_SCREEN_ADDR(cry->unk2); + vram = BG_SCREEN_ADDR(cry->unk2); r12 = (u32) (cry->unk0 << 18) >> 23; diff --git a/src/pokemon_1.c b/src/pokemon/pokemon_1.c index fd7916ee6..0c0d14d7a 100644 --- a/src/pokemon_1.c +++ b/src/pokemon/pokemon_1.c @@ -39,17 +39,17 @@ void ZeroMonData(struct Pokemon *mon) u32 arg; ZeroBoxMonData(&mon->box); arg = 0; - SetMonData(mon, MON_DATA_STATUS, (u8 *)&arg); - SetMonData(mon, MON_DATA_LEVEL, (u8 *)&arg); - SetMonData(mon, MON_DATA_HP, (u8 *)&arg); - SetMonData(mon, MON_DATA_MAX_HP, (u8 *)&arg); - SetMonData(mon, MON_DATA_ATK, (u8 *)&arg); - SetMonData(mon, MON_DATA_DEF, (u8 *)&arg); - SetMonData(mon, MON_DATA_SPD, (u8 *)&arg); - SetMonData(mon, MON_DATA_SPATK, (u8 *)&arg); - SetMonData(mon, MON_DATA_SPDEF, (u8 *)&arg); + SetMonData(mon, MON_DATA_STATUS, &arg); + SetMonData(mon, MON_DATA_LEVEL, &arg); + SetMonData(mon, MON_DATA_HP, &arg); + SetMonData(mon, MON_DATA_MAX_HP, &arg); + SetMonData(mon, MON_DATA_ATK, &arg); + SetMonData(mon, MON_DATA_DEF, &arg); + SetMonData(mon, MON_DATA_SPEED, &arg); + SetMonData(mon, MON_DATA_SPATK, &arg); + SetMonData(mon, MON_DATA_SPDEF, &arg); arg = 255; - SetMonData(mon, MON_DATA_MAIL, (u8 *)&arg); + SetMonData(mon, MON_DATA_MAIL, &arg); } void ZeroPlayerPartyMons(void) @@ -74,7 +74,7 @@ void CreateMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFix CreateBoxMon(&mon->box, species, level, fixedIV, hasFixedPersonality, fixedPersonality, otIdType, fixedOtId); SetMonData(mon, MON_DATA_LEVEL, &level); arg = 255; - SetMonData(mon, MON_DATA_MAIL, (u8 *)&arg); + SetMonData(mon, MON_DATA_MAIL, &arg); CalculateMonStats(mon); } @@ -92,7 +92,7 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, else personality = Random32(); - SetBoxMonData(boxMon, MON_DATA_PERSONALITY, (u8 *)&personality); + SetBoxMonData(boxMon, MON_DATA_PERSONALITY, &personality); //Determine original trainer ID if (otIdType == 2) //Pokemon cannot be shiny @@ -116,24 +116,24 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, | (gSaveBlock2.playerTrainerId[3] << 24); } - SetBoxMonData(boxMon, MON_DATA_OT_ID, (u8 *)&value); + SetBoxMonData(boxMon, MON_DATA_OT_ID, &value); checksum = CalculateBoxMonChecksum(boxMon); - SetBoxMonData(boxMon, MON_DATA_CHECKSUM, (u8 *)&checksum); + SetBoxMonData(boxMon, MON_DATA_CHECKSUM, &checksum); EncryptBoxMon(boxMon); GetSpeciesName(speciesName, species); SetBoxMonData(boxMon, MON_DATA_NICKNAME, speciesName); SetBoxMonData(boxMon, MON_DATA_LANGUAGE, &gGameLanguage); SetBoxMonData(boxMon, MON_DATA_OT_NAME, gSaveBlock2.playerName); - SetBoxMonData(boxMon, MON_DATA_SPECIES, (u8 *)&species); - SetBoxMonData(boxMon, MON_DATA_EXP, (u8 *)&gExperienceTables[gBaseStats[species].growthRate][level]); + SetBoxMonData(boxMon, MON_DATA_SPECIES, &species); + SetBoxMonData(boxMon, MON_DATA_EXP, &gExperienceTables[gBaseStats[species].growthRate][level]); SetBoxMonData(boxMon, MON_DATA_FRIENDSHIP, &gBaseStats[species].friendship); value = sav1_map_get_name(); - SetBoxMonData(boxMon, MON_DATA_MET_LOCATION, (u8 *)&value); + SetBoxMonData(boxMon, MON_DATA_MET_LOCATION, &value); SetBoxMonData(boxMon, MON_DATA_MET_LEVEL, &level); SetBoxMonData(boxMon, MON_DATA_MET_GAME, &gGameVersion); value = 4; - SetBoxMonData(boxMon, MON_DATA_POKEBALL, (u8 *)&value); + SetBoxMonData(boxMon, MON_DATA_POKEBALL, &value); SetBoxMonData(boxMon, MON_DATA_OT_GENDER, &gSaveBlock2.playerGender); if (fixedIV < 32) @@ -141,7 +141,7 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, SetBoxMonData(boxMon, MON_DATA_HP_IV, &fixedIV); SetBoxMonData(boxMon, MON_DATA_ATK_IV, &fixedIV); SetBoxMonData(boxMon, MON_DATA_DEF_IV, &fixedIV); - SetBoxMonData(boxMon, MON_DATA_SPD_IV, &fixedIV); + SetBoxMonData(boxMon, MON_DATA_SPEED_IV, &fixedIV); SetBoxMonData(boxMon, MON_DATA_SPATK_IV, &fixedIV); SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &fixedIV); } @@ -151,26 +151,26 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, value = Random(); iv = value & 0x1F; - SetBoxMonData(boxMon, MON_DATA_HP_IV, (u8 *)&iv); + SetBoxMonData(boxMon, MON_DATA_HP_IV, &iv); iv = (value & 0x3E0) >> 5; - SetBoxMonData(boxMon, MON_DATA_ATK_IV, (u8 *)&iv); + SetBoxMonData(boxMon, MON_DATA_ATK_IV, &iv); iv = (value & 0x7C00) >> 10; - SetBoxMonData(boxMon, MON_DATA_DEF_IV, (u8 *)&iv); + SetBoxMonData(boxMon, MON_DATA_DEF_IV, &iv); value = Random(); iv = value & 0x1F; - SetBoxMonData(boxMon, MON_DATA_SPD_IV, (u8 *)&iv); + SetBoxMonData(boxMon, MON_DATA_SPEED_IV, &iv); iv = (value & 0x3E0) >> 5; - SetBoxMonData(boxMon, MON_DATA_SPATK_IV, (u8 *)&iv); + SetBoxMonData(boxMon, MON_DATA_SPATK_IV, &iv); iv = (value & 0x7C00) >> 10; - SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, (u8 *)&iv); + SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &iv); } if (gBaseStats[species].ability2) { value = personality & 1; - SetBoxMonData(boxMon, MON_DATA_ALT_ABILITY, (u8 *)&value); + SetBoxMonData(boxMon, MON_DATA_ALT_ABILITY, &value); } GiveBoxMonInitialMoveset(boxMon); @@ -237,7 +237,7 @@ void CreateMaleMon(struct Pokemon *mon, u16 species, u8 level) void CreateMonWithIVsPersonality(struct Pokemon *mon, u16 species, u8 level, u32 ivs, u32 personality) { CreateMon(mon, species, level, 0, 1, personality, 0, 0); - SetMonData(mon, MON_DATA_IVS, (u8 *)&ivs); + SetMonData(mon, MON_DATA_IVS, &ivs); CalculateMonStats(mon); } @@ -247,7 +247,7 @@ void CreateMonWithIVsOTID(struct Pokemon *mon, u16 species, u8 level, u8 *ivs, u SetMonData(mon, MON_DATA_HP_IV, &ivs[0]); SetMonData(mon, MON_DATA_ATK_IV, &ivs[1]); SetMonData(mon, MON_DATA_DEF_IV, &ivs[2]); - SetMonData(mon, MON_DATA_SPD_IV, &ivs[3]); + SetMonData(mon, MON_DATA_SPEED_IV, &ivs[3]); SetMonData(mon, MON_DATA_SPATK_IV, &ivs[4]); SetMonData(mon, MON_DATA_SPDEF_IV, &ivs[5]); CalculateMonStats(mon); @@ -278,7 +278,7 @@ void CreateMonWithEVSpread(struct Pokemon *mon, u16 species, u8 level, u8 fixedI for (i = 0; i < 6; i++) { if (evSpread & temp) - SetMonData(mon, MON_DATA_HP_EV + i, (u8 *)&evAmount); + SetMonData(mon, MON_DATA_HP_EV + i, &evAmount); temp <<= 1; } @@ -297,8 +297,8 @@ void sub_803ADE8(struct Pokemon *mon, struct UnknownPokemonStruct *src) for (i = 0; i < 4; i++) SetMonMoveSlot(mon, src->moves[i], i); - SetMonData(mon, MON_DATA_PP_BONUSES, (u8 *)&src->ppBonuses); - SetMonData(mon, MON_DATA_HELD_ITEM, (u8 *)&src->heldItem); + SetMonData(mon, MON_DATA_PP_BONUSES, &src->ppBonuses); + SetMonData(mon, MON_DATA_HELD_ITEM, &src->heldItem); StringCopy(nickname, src->nickname); @@ -310,13 +310,13 @@ void sub_803ADE8(struct Pokemon *mon, struct UnknownPokemonStruct *src) SetMonData(mon, MON_DATA_LANGUAGE, &language); StripExtCtrlCodes(nickname); SetMonData(mon, MON_DATA_NICKNAME, nickname); - SetMonData(mon, MON_DATA_FRIENDSHIP, (u8 *)&src->friendship); - SetMonData(mon, MON_DATA_HP_EV, (u8 *)&src->hpEV); - SetMonData(mon, MON_DATA_ATK_EV, (u8 *)&src->attackEV); - SetMonData(mon, MON_DATA_DEF_EV, (u8 *)&src->defenseEV); - SetMonData(mon, MON_DATA_SPD_EV, (u8 *)&src->speedEV); - SetMonData(mon, MON_DATA_SPATK_EV, (u8 *)&src->spAttackEV); - SetMonData(mon, MON_DATA_SPDEF_EV, (u8 *)&src->spDefenseEV); + SetMonData(mon, MON_DATA_FRIENDSHIP, &src->friendship); + SetMonData(mon, MON_DATA_HP_EV, &src->hpEV); + SetMonData(mon, MON_DATA_ATK_EV, &src->attackEV); + SetMonData(mon, MON_DATA_DEF_EV, &src->defenseEV); + SetMonData(mon, MON_DATA_SPEED_EV, &src->speedEV); + SetMonData(mon, MON_DATA_SPATK_EV, &src->spAttackEV); + SetMonData(mon, MON_DATA_SPDEF_EV, &src->spDefenseEV); value = src->altAbility; SetMonData(mon, MON_DATA_ALT_ABILITY, &value); value = src->hpIV; @@ -326,7 +326,7 @@ void sub_803ADE8(struct Pokemon *mon, struct UnknownPokemonStruct *src) value = src->defenseIV; SetMonData(mon, MON_DATA_DEF_IV, &value); value = src->speedIV; - SetMonData(mon, MON_DATA_SPD_IV, &value); + SetMonData(mon, MON_DATA_SPEED_IV, &value); value = src->spAttackIV; SetMonData(mon, MON_DATA_SPATK_IV, &value); value = src->spDefenseIV; @@ -356,14 +356,14 @@ void sub_803AF78(struct Pokemon *mon, struct UnknownPokemonStruct *dest) dest->hpEV = GetMonData(mon, MON_DATA_HP_EV, NULL); dest->attackEV = GetMonData(mon, MON_DATA_ATK_EV, NULL); dest->defenseEV = GetMonData(mon, MON_DATA_DEF_EV, NULL); - dest->speedEV = GetMonData(mon, MON_DATA_SPD_EV, NULL); + dest->speedEV = GetMonData(mon, MON_DATA_SPEED_EV, NULL); dest->spAttackEV = GetMonData(mon, MON_DATA_SPATK_EV, NULL); dest->spDefenseEV = GetMonData(mon, MON_DATA_SPDEF_EV, NULL); dest->friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); dest->hpIV = GetMonData(mon, MON_DATA_HP_IV, NULL); dest->attackIV = GetMonData(mon, MON_DATA_ATK_IV, NULL); dest->defenseIV = GetMonData(mon, MON_DATA_DEF_IV, NULL); - dest->speedIV = GetMonData(mon, MON_DATA_SPD_IV, NULL); + dest->speedIV = GetMonData(mon, MON_DATA_SPEED_IV, NULL); dest->spAttackIV = GetMonData(mon, MON_DATA_SPATK_IV, NULL); dest->spDefenseIV = GetMonData(mon, MON_DATA_SPDEF_IV, NULL); dest->altAbility = GetMonData(mon, MON_DATA_ALT_ABILITY, NULL); @@ -401,7 +401,7 @@ u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon) s32 n = (((2 * baseStat + iv + ev / 4) * level) / 100) + 5; \ u8 nature = GetNature(mon); \ n = nature_stat_mod(nature, n, statIndex); \ - SetMonData(mon, field, (u8 *)&n); \ + SetMonData(mon, field, &n); \ } void CalculateMonStats(struct Pokemon *mon) @@ -414,8 +414,8 @@ void CalculateMonStats(struct Pokemon *mon) s32 attackEV = GetMonData(mon, MON_DATA_ATK_EV, NULL); s32 defenseIV = GetMonData(mon, MON_DATA_DEF_IV, NULL); s32 defenseEV = GetMonData(mon, MON_DATA_DEF_EV, NULL); - s32 speedIV = GetMonData(mon, MON_DATA_SPD_IV, NULL); - s32 speedEV = GetMonData(mon, MON_DATA_SPD_EV, NULL); + s32 speedIV = GetMonData(mon, MON_DATA_SPEED_IV, NULL); + s32 speedEV = GetMonData(mon, MON_DATA_SPEED_EV, NULL); s32 spAttackIV = GetMonData(mon, MON_DATA_SPATK_IV, NULL); s32 spAttackEV = GetMonData(mon, MON_DATA_SPATK_EV, NULL); s32 spDefenseIV = GetMonData(mon, MON_DATA_SPDEF_IV, NULL); @@ -424,7 +424,7 @@ void CalculateMonStats(struct Pokemon *mon) s32 level = GetLevelFromMonExp(mon); s32 newMaxHP; - SetMonData(mon, MON_DATA_LEVEL, (u8 *)&level); + SetMonData(mon, MON_DATA_LEVEL, &level); if (species == SPECIES_SHEDINJA) { @@ -440,11 +440,11 @@ void CalculateMonStats(struct Pokemon *mon) if (unk_2000000[0x160FA] == 0) unk_2000000[0x160FA] = 1; - SetMonData(mon, MON_DATA_MAX_HP, (u8 *)&newMaxHP); + SetMonData(mon, MON_DATA_MAX_HP, &newMaxHP); CALC_STAT(baseAttack, attackIV, attackEV, 1, MON_DATA_ATK) CALC_STAT(baseDefense, defenseIV, defenseEV, 2, MON_DATA_DEF) - CALC_STAT(baseSpeed, speedIV, speedEV, 3, MON_DATA_SPD) + CALC_STAT(baseSpeed, speedIV, speedEV, 3, MON_DATA_SPEED) CALC_STAT(baseSpAttack, spAttackIV, spAttackEV, 4, MON_DATA_SPATK) CALC_STAT(baseSpDefense, spDefenseIV, spDefenseEV, 5, MON_DATA_SPDEF) @@ -465,18 +465,18 @@ void CalculateMonStats(struct Pokemon *mon) return; } - SetMonData(mon, MON_DATA_HP, (u8 *)¤tHP); + SetMonData(mon, MON_DATA_HP, ¤tHP); } -void sub_803B4B4(struct Pokemon *src, struct Pokemon *dest) +void sub_803B4B4(const struct BoxPokemon *src, struct Pokemon *dest) { u32 value = 0; - memcpy(&dest->box, &src->box, sizeof(struct BoxPokemon)); - SetMonData(dest, MON_DATA_STATUS, (u8 *)&value); - SetMonData(dest, MON_DATA_HP, (u8 *)&value); - SetMonData(dest, MON_DATA_MAX_HP, (u8 *)&value); + dest->box = *src; + SetMonData(dest, MON_DATA_STATUS, &value); + SetMonData(dest, MON_DATA_HP, &value); + SetMonData(dest, MON_DATA_MAX_HP, &value); value = 255; - SetMonData(dest, MON_DATA_MAIL, (u8 *)&value); + SetMonData(dest, MON_DATA_MAIL, &value); CalculateMonStats(dest); } @@ -517,7 +517,7 @@ u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move) u16 existingMove = GetBoxMonData(boxMon, MON_DATA_MOVE1 + i, NULL); if (!existingMove) { - SetBoxMonData(boxMon, MON_DATA_MOVE1 + i, (u8 *)&move); + SetBoxMonData(boxMon, MON_DATA_MOVE1 + i, &move); SetBoxMonData(boxMon, MON_DATA_PP1 + i, &gBattleMoves[move].pp); return move; } @@ -546,7 +546,7 @@ u16 GiveMoveToBattleMon(struct BattlePokemon *mon, u16 move) void SetMonMoveSlot(struct Pokemon *mon, u16 move, u8 slot) { - SetMonData(mon, MON_DATA_MOVE1 + slot, (u8 *)&move); + SetMonData(mon, MON_DATA_MOVE1 + slot, &move); SetMonData(mon, MON_DATA_PP1 + slot, &gBattleMoves[move].pp); } @@ -636,7 +636,7 @@ void DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, u16 move) for (i = 0; i < 4; i++) { - SetMonData(mon, MON_DATA_MOVE1 + i, (u8 *)&moves[i]); + SetMonData(mon, MON_DATA_MOVE1 + i, &moves[i]); SetMonData(mon, MON_DATA_PP1 + i, &pp[i]); } @@ -663,7 +663,7 @@ void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move) for (i = 0; i < 4; i++) { - SetBoxMonData(boxMon, MON_DATA_MOVE1 + i, (u8 *)&moves[i]); + SetBoxMonData(boxMon, MON_DATA_MOVE1 + i, &moves[i]); SetBoxMonData(boxMon, MON_DATA_PP1 + i, &pp[i]); } diff --git a/src/pokemon_2.c b/src/pokemon/pokemon_2.c index f02ce6170..d3bdf3a13 100644 --- a/src/pokemon_2.c +++ b/src/pokemon/pokemon_2.c @@ -278,7 +278,7 @@ u32 GetMonData(struct Pokemon *mon, s32 field, u8 *data) return mon->attack; case MON_DATA_DEF: return mon->defense; - case MON_DATA_SPD: + case MON_DATA_SPEED: return mon->speed; case MON_DATA_SPATK: return mon->spAttack; @@ -422,7 +422,7 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data) case MON_DATA_DEF_EV: retVal = substruct2->defenseEV; break; - case MON_DATA_SPD_EV: + case MON_DATA_SPEED_EV: retVal = substruct2->speedEV; break; case MON_DATA_SPATK_EV: @@ -476,7 +476,7 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data) case MON_DATA_DEF_IV: retVal = substruct3->defenseIV; break; - case MON_DATA_SPD_IV: + case MON_DATA_SPEED_IV: retVal = substruct3->speedIV; break; case MON_DATA_SPATK_IV: @@ -653,7 +653,7 @@ void SetMonData(struct Pokemon *mon, s32 field, const u8 *data) case MON_DATA_DEF: SET16(mon->defense); break; - case MON_DATA_SPD: + case MON_DATA_SPEED: SET16(mon->speed); break; case MON_DATA_SPATK: @@ -784,7 +784,7 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const u8 *data) case MON_DATA_DEF_EV: SET8(substruct2->defenseEV); break; - case MON_DATA_SPD_EV: + case MON_DATA_SPEED_EV: SET8(substruct2->speedEV); break; case MON_DATA_SPATK_EV: @@ -844,7 +844,7 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const u8 *data) case MON_DATA_DEF_IV: SET8(substruct3->defenseIV); break; - case MON_DATA_SPD_IV: + case MON_DATA_SPEED_IV: SET8(substruct3->speedIV); break; case MON_DATA_SPATK_IV: @@ -1077,6 +1077,7 @@ void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord) 2, 0); + // these two SetMonData calls require the (u8 *) cast since SetMonData is declared in this function. SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, (u8 *)&gSecretBaseRecord.partyHeldItems[i]); for (j = 0; j < 6; j++) @@ -1185,7 +1186,7 @@ void CopyPlayerPartyMonToBattleData(u8 battleIndex, u8 partyIndex) gBattleMons[battleIndex].hpIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP_IV, NULL); gBattleMons[battleIndex].attackIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ATK_IV, NULL); gBattleMons[battleIndex].defenseIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_DEF_IV, NULL); - gBattleMons[battleIndex].speedIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPD_IV, NULL); + gBattleMons[battleIndex].speedIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPEED_IV, NULL); gBattleMons[battleIndex].spAttackIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPATK_IV, NULL); gBattleMons[battleIndex].spDefenseIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPDEF_IV, NULL); gBattleMons[battleIndex].personality = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PERSONALITY, NULL); @@ -1195,7 +1196,7 @@ void CopyPlayerPartyMonToBattleData(u8 battleIndex, u8 partyIndex) gBattleMons[battleIndex].maxHP = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MAX_HP, NULL); gBattleMons[battleIndex].attack = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ATK, NULL); gBattleMons[battleIndex].defense = GetMonData(&gPlayerParty[partyIndex], MON_DATA_DEF, NULL); - gBattleMons[battleIndex].speed = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPD, NULL); + gBattleMons[battleIndex].speed = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPEED, NULL); gBattleMons[battleIndex].spAttack = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPATK, NULL); gBattleMons[battleIndex].spDefense = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPDEF, NULL); gBattleMons[battleIndex].isEgg = GetMonData(&gPlayerParty[partyIndex], MON_DATA_IS_EGG, NULL); diff --git a/src/pokemon_3.c b/src/pokemon/pokemon_3.c index e51d3187b..9c2cb4730 100644 --- a/src/pokemon_3.c +++ b/src/pokemon/pokemon_3.c @@ -68,7 +68,7 @@ bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 bat if (status & healMask) { status &= ~healMask; - SetMonData(mon, MON_DATA_STATUS, (u8 *)&status); + SetMonData(mon, MON_DATA_STATUS, &status); if (gMain.inBattle && battleId != 4) gBattleMons[battleId].status1 &= ~healMask; return FALSE; @@ -203,7 +203,7 @@ void sub_803F324(int stat) u8 *sub_803F378(u16 itemId) { int i; - u8 *itemEffect; + const u8 *itemEffect; if (itemId == ITEM_ENIGMA_BERRY) { @@ -218,7 +218,7 @@ u8 *sub_803F378(u16 itemId) } else { - itemEffect = (u8 *) gItemEffectTable[itemId - 13]; + itemEffect = gItemEffectTable[itemId - 13]; } gStringBank = gBankInMenu; @@ -278,7 +278,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem) else holdEffect = ItemId_GetHoldEffect(heldItem); - if (holdEffect == 38 && type != 3) + if (holdEffect == HOLD_EFFECT_PREVENT_EVOLVE && type != 3) return 0; switch (type) @@ -355,7 +355,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem) if (gEvolutionTable[species].evolutions[i].param == heldItem) { heldItem = 0; - SetMonData(mon, MON_DATA_HELD_ITEM, (u8 *)&heldItem); + SetMonData(mon, MON_DATA_HELD_ITEM, &heldItem); targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies; } break; @@ -695,7 +695,7 @@ void AdjustFriendship(struct Pokemon *mon, u8 event) friendship = 0; if (friendship > 255) friendship = 255; - SetMonData(mon, MON_DATA_FRIENDSHIP, (u8 *)&friendship); + SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship); } } } @@ -1096,7 +1096,7 @@ void ClearBattleMonForms(void) gBattleMonForms[i] = 0; } -u16 sub_8040728(void) +u16 GetBGM_ForBattle(void) { if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) return BGM_BATTLE34; @@ -1137,7 +1137,7 @@ void sub_80408BC(void) { ResetMapMusic(); m4aMPlayAllStop(); - PlayBGM(sub_8040728()); + PlayBGM(GetBGM_ForBattle()); } void current_map_music_set__default_for_battle(u16 song) @@ -1147,15 +1147,15 @@ void current_map_music_set__default_for_battle(u16 song) if (song) PlayNewMapMusic(song); else - PlayNewMapMusic(sub_8040728()); + PlayNewMapMusic(GetBGM_ForBattle()); } -const u8 *pokemon_get_pal(struct Pokemon *mon) +const u8 *GetMonSpritePal(struct Pokemon *mon) { u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0); u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); - return species_and_otid_get_pal(species, otId, personality); + return GetMonSpritePalFromOtIdPersonality(species, otId, personality); } //Extracts the upper 16 bits of a 32-bit number @@ -1164,7 +1164,7 @@ const u8 *pokemon_get_pal(struct Pokemon *mon) //Extracts the lower 16 bits of a 32-bit number #define LOHALF(n) ((n) & 0xFFFF) -const u8 *species_and_otid_get_pal(u16 species, u32 otId, u32 personality) +const u8 *GetMonSpritePalFromOtIdPersonality(u16 species, u32 otId, u32 personality) { u32 shinyValue; @@ -1178,15 +1178,15 @@ const u8 *species_and_otid_get_pal(u16 species, u32 otId, u32 personality) return gMonPaletteTable[species].data; } -const struct CompressedSpritePalette *sub_8040990(struct Pokemon *mon) +const struct CompressedSpritePalette *GetMonSpritePalStruct(struct Pokemon *mon) { u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0); u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); - return sub_80409C8(species, otId, personality); + return GetMonSpritePalStructFromOtIdPersonality(species, otId, personality); } -const struct CompressedSpritePalette *sub_80409C8(u16 species, u32 otId , u32 personality) +const struct CompressedSpritePalette *GetMonSpritePalStructFromOtIdPersonality(u16 species, u32 otId , u32 personality) { u32 shinyValue; @@ -1208,9 +1208,9 @@ bool32 IsHMMove2(u16 move) return FALSE; } -bool8 sub_8040A3C(u16 species) +bool8 IsPokeSpriteNotFlipped(u16 species) { - return gBaseStats[species].unk19_7; + return gBaseStats[species].noFlip; } s8 sub_8040A54(struct Pokemon *mon, u8 a2) @@ -1299,16 +1299,16 @@ void SetWildMonHeldItem(void) u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, 0); if (gBaseStats[species].item1 == gBaseStats[species].item2) { - SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, (u8 *)&gBaseStats[species].item1); + SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gBaseStats[species].item1); return; } if (rnd > 44) { if (rnd <= 94) - SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, (u8 *)&gBaseStats[species].item1); + SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gBaseStats[species].item1); else - SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, (u8 *)&gBaseStats[species].item2); + SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &gBaseStats[species].item2); } } } @@ -1337,7 +1337,7 @@ u8 *sub_8040D08(void) return gLinkPlayers[sub_803FC34(gLinkPlayers[id].lp_field_18 ^ 2)].name; } -bool32 sub_8040D3C(u16 species, u8 *name, u8 language) +bool32 ShouldHideGenderIconForLanguage(u16 species, u8 *name, u8 language) { bool32 retVal = FALSE; if (species == SPECIES_NIDORAN_M || species == SPECIES_NIDORAN_F) @@ -1362,12 +1362,12 @@ bool32 sub_8040D3C(u16 species, u8 *name, u8 language) return retVal; } -bool32 sub_8040D8C(u16 species, u8 *name) +bool32 ShouldHideGenderIcon(u16 species, u8 *name) { u8 language = GAME_LANGUAGE; if (name[0] == 0xFC && name[1] == 21) language = LANGUAGE_JAPANESE; - return sub_8040D3C(species, name, language); + return ShouldHideGenderIconForLanguage(species, name, language); } bool32 unref_sub_8040DAC(struct Pokemon *mon) @@ -1376,5 +1376,5 @@ bool32 unref_sub_8040DAC(struct Pokemon *mon) u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); u8 language = GetMonData(mon, MON_DATA_LANGUAGE, 0); GetMonData(mon, MON_DATA_NICKNAME, name); - return sub_8040D3C(species, name, language); + return ShouldHideGenderIconForLanguage(species, name, language); } diff --git a/src/pokemon_data.c b/src/pokemon/pokemon_data.c index 6414134fb..3d13a3390 100644 --- a/src/pokemon_data.c +++ b/src/pokemon/pokemon_data.c @@ -9,18 +9,18 @@ #include "sprite.h" #include "data2.h" -#include "data/pokemon/dex_order.h" -#include "data/pokemon/spinda_spots.h" -#include "data/pokemon/item_effects.h" -#include "data/pokemon/nature_stats.h" -#include "data/pokemon/tmhm_learnsets.h" -#include "data/pokemon/trainer_class_lookups.h" -#include "data/pokemon/cry_ids.h" -#include "data/pokemon/experience_tables.h" -#include "data/pokemon/base_stats.h" -#include "data/pokemon/level_up_learnsets.h" -#include "data/pokemon/evolution.h" -#include "data/pokemon/level_up_learnset_pointers.h" +#include "../data/pokemon/dex_order.h" +#include "../data/pokemon/spinda_spots.h" +#include "../data/pokemon/item_effects.h" +#include "../data/pokemon/nature_stats.h" +#include "../data/pokemon/tmhm_learnsets.h" +#include "../data/pokemon/trainer_class_lookups.h" +#include "../data/pokemon/cry_ids.h" +#include "../data/pokemon/experience_tables.h" +#include "../data/pokemon/base_stats.h" +#include "../data/pokemon/level_up_learnsets.h" +#include "../data/pokemon/evolution.h" +#include "../data/pokemon/level_up_learnset_pointers.h" const u8 gUnknown_08208238[] = { // Masks for getting PP Up count, also PP Max values 0x03, 0x0c, 0x30, 0xc0 @@ -93,7 +93,7 @@ const u8 gUnknown_082082F2[] = { MON_DATA_HP_EV, MON_DATA_ATK_EV, MON_DATA_DEF_EV, - MON_DATA_SPD_EV, + MON_DATA_SPEED_EV, MON_DATA_SPDEF_EV, MON_DATA_SPATK_EV }; diff --git a/src/pokemon_icon.c b/src/pokemon/pokemon_icon.c index 9bb3386e1..e83f912ec 100644 --- a/src/pokemon_icon.c +++ b/src/pokemon/pokemon_icon.c @@ -1215,8 +1215,11 @@ u8 UpdateMonIconFrame(struct Sprite *sprite) break; default: RequestSpriteCopy( - (u8 *)sprite->images + sSpriteImageSizes[sprite->oam.shape][sprite->oam.size] * frame, - (u8 *)OBJ_VRAM0 + sprite->oam.tileNum * TILE_SIZE_4BPP, + // pointer arithmetic is needed to get the correct pointer to perform the sprite copy on. + // because sprite->images is a struct def, it has to be casted to (u8 *) before any + // arithmetic can be performed. + (u8 *)sprite->images + (sSpriteImageSizes[sprite->oam.shape][sprite->oam.size] * frame), + OBJ_VRAM0 + sprite->oam.tileNum * TILE_SIZE_4BPP, sSpriteImageSizes[sprite->oam.shape][sprite->oam.size]); { register u8 duration asm("r0") = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration; diff --git a/src/pokemon_menu.c b/src/pokemon/pokemon_menu.c index bc5150a16..7d70e7708 100644 --- a/src/pokemon_menu.c +++ b/src/pokemon/pokemon_menu.c @@ -57,7 +57,6 @@ void sub_80E62A0(u8 arg0, struct MailStruct* arg1, void* arg2, u8 arg3); void sub_808A520(void); void sub_80A61D0(void); void CB2_InitFlyRegionMap(void); -u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem); bool8 SetUpFieldMove_Cut(void); bool8 SetUpFieldMove_Flash(void); bool8 SetUpFieldMove_RockSmash(void); @@ -184,7 +183,7 @@ static const struct PokeMenuFieldMoveFunc sFieldMoveFuncs[] = void sub_8089A70(void) { gPaletteFade.bufferTransferDisabled = 1; - OpenPartyMenu(0, 0); + OpenPartyMenu(PARTY_MENU_TYPE_STANDARD, 0); } static void sub_8089A8C(void) @@ -229,7 +228,7 @@ static void sub_8089A8C(void) static void sub_8089BDC(u8 arg0, u8 arg1, u8 arg2, u8 noOfOptions, const struct MenuAction2 *menuActions, const u8 *order, u8 arg6) { - sub_806D538(5, arg6); + PrintPartyMenuPromptText(5, arg6); MenuDrawTextWindow(arg0, arg1, arg0 + arg2, (noOfOptions * 2) + arg1 + 1); PrintMenuItemsReordered(arg0 + 1, arg1 + 1, noOfOptions, menuActions, order); } @@ -248,13 +247,13 @@ static void sub_8089C7C(u8 arg0) InitMenu(0, 20, r4, sPokeMenuOptionsNo, arg0, 9); } -void sub_8089CD4(u8 taskID) +void HandleDefaultPartyMenu(u8 taskID) { if (!gPaletteFade.active) { - switch (sub_806BD80(taskID)) + switch (HandleDefaultPartyMenuInput(taskID)) { - case 1: + case A_BUTTON: PlaySE(SE_SELECT); gLastFieldPokeMenuOpened = sub_806CA38(taskID); GetMonNickname(&gPlayerParty[gLastFieldPokeMenuOpened], gStringVar1); @@ -264,7 +263,7 @@ void sub_8089CD4(u8 taskID) gTasks[taskID].func = sub_8089D94; sub_808B5B4(taskID); break; - case 2: + case B_BUTTON: PlaySE(SE_SELECT); BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); gTasks[taskID].func = sub_8089E4C; @@ -325,13 +324,13 @@ static void sub_8089EBC(void) { do { - if (sub_806B124() == TRUE) + if (InitPartyMenu() == TRUE) { - sub_806C994(EWRAM_1B000.unk260, gUnknown_020384F0); - sub_806BF74(EWRAM_1B000.unk260, 0); + sub_806C994(EWRAM_1B000.menuHandlerTaskId, gUnknown_020384F0); + ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0); gLastFieldPokeMenuOpened = gUnknown_020384F0; sub_8089E84(); - SetMainCallback2(sub_806AEDC); + SetMainCallback2(CB2_PartyMenuMain); break; } } while (sub_80F9344() != TRUE); @@ -340,7 +339,7 @@ static void sub_8089EBC(void) static void sub_8089F14(void) { gPaletteFade.bufferTransferDisabled = 1; - sub_806AF4C(0, 0xFF, sub_8089D94, 5); + SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0xFF, sub_8089D94, 5); SetMainCallback2(sub_8089EBC); } @@ -361,9 +360,9 @@ static void PokemonMenu_Summary(u8 taskID) gTasks[taskID].func = sub_8089F44; } -void sub_808A004(u8 taskID) +void DoPokemonMenu_Switch(u8 taskID) { - SetTaskFuncWithFollowupFunc(taskID, sub_806CA60, sub_8089CD4); + SetTaskFuncWithFollowupFunc(taskID, SetupDefaultPartyMenuSwitchPokemon, HandleDefaultPartyMenu); MenuZeroFillWindowRect(19, 0, 29, 19); } @@ -372,7 +371,7 @@ static void PokemonMenu_Switch(u8 taskID) HandleDestroyMenuCursors(); ewram01000.unkC = sub_806CD5C; ewram01000.array[53553] = 1; - sub_808A004(taskID); + DoPokemonMenu_Switch(taskID); } static void sub_808A060(u8 taskID) @@ -390,19 +389,19 @@ static void sub_808A060(u8 taskID) if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - PartyMenuGetPopupMenuFunc(0, &sUnknown_0839F578, (void *)sPokemonMenuActions, sPokeMenuCursorPos)(taskID); + PartyMenuGetPopupMenuFunc(0, &sUnknown_0839F578, sPokemonMenuActions, sPokeMenuCursorPos)(taskID); } else if (gMain.newKeys & B_BUTTON) { - sub_806E7D0(0, &sUnknown_0839F578); + ClosePartyPopupMenu(0, &sUnknown_0839F578); PokemonMenu_CancelSubmenu(taskID); } } static void sub_808A100(u8 taskID) { - sub_806E750(0, &sUnknown_0839F578, (void*)(sPokemonMenuActions), 0); - sub_806D538(0xD, 2); + ShowPartyPopupMenu(0, &sUnknown_0839F578, (void*)(sPokemonMenuActions), 0); + PrintPartyMenuPromptText(0xD, 2); gTasks[taskID].func = sub_808A060; } @@ -429,8 +428,8 @@ static void sub_808A1E0(u8 taskID) if (gUnknown_0202E8F6 != 1) { SetHeldItemIconVisibility(taskID, sub_806CA38(taskID)); - sub_806D538(0, 0); - gTasks[taskID].func = sub_8089CD4; + PrintPartyMenuPromptText(0, 0); + gTasks[taskID].func = HandleDefaultPartyMenu; } } @@ -444,8 +443,8 @@ static void sub_808A228(u8 taskID) else { MenuZeroFillWindowRect(0, 0, 29, 19); - sub_806D538(0, 0); - gTasks[taskID].func = sub_8089CD4; + PrintPartyMenuPromptText(0, 0); + gTasks[taskID].func = HandleDefaultPartyMenu; } } @@ -476,11 +475,11 @@ static void sub_808A358(void) { while (1) { - if (sub_806B124() == TRUE) + if (InitPartyMenu() == TRUE) { - sub_806C994(EWRAM_1B000.unk260, gLastFieldPokeMenuOpened); - sub_806BF74(EWRAM_1B000.unk260, 0); - SetMainCallback2(sub_806AEDC); + sub_806C994(EWRAM_1B000.menuHandlerTaskId, gLastFieldPokeMenuOpened); + ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0); + SetMainCallback2(CB2_PartyMenuMain); break; } if (sub_80F9344() == TRUE) @@ -492,13 +491,13 @@ static void sub_808A3A4(void) { while (1) { - if (sub_806B124() == TRUE) + if (InitPartyMenu() == TRUE) { - sub_806C994(EWRAM_1B000.unk260, gLastFieldPokeMenuOpened); - sub_806BF74(EWRAM_1B000.unk260, 0); + sub_806C994(EWRAM_1B000.menuHandlerTaskId, gLastFieldPokeMenuOpened); + ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0); EWRAM_1B000.unk262 = 3; sub_8089E84(); - SetMainCallback2(sub_806AEDC); + SetMainCallback2(CB2_PartyMenuMain); break; } if (sub_80F9344() == TRUE) @@ -514,7 +513,7 @@ void sub_808A3F8(void) gPaletteFade.bufferTransferDisabled = 1; sub_806BD58(taskID, 0); sub_806C994(taskID, gLastFieldPokeMenuOpened); - sub_806BF74(taskID, 0); + ChangePartyMenuSelection(taskID, 0); if (!(bool8)(GetMonData(&gPlayerParty[sub_806CA38(taskID)], MON_DATA_HELD_ITEM))) { SetMainCallback2(sub_808A34C); @@ -526,12 +525,12 @@ void sub_808A3F8(void) gPaletteFade.bufferTransferDisabled = 1; if (gScriptItemId) { - sub_806AF4C(0, 0xFF, sub_808A2AC, 0xFF); + SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0xFF, sub_808A2AC, 0xFF); SetMainCallback2(sub_808A358); } else { - sub_806AF4C(0, 0xFF, sub_8089D94, 5); + SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0xFF, sub_8089D94, 5); SetMainCallback2(sub_808A3A4); } } @@ -540,11 +539,11 @@ static void sub_808A4D4(void) { while (1) { - if (sub_806B124() == TRUE) + if (InitPartyMenu() == TRUE) { - sub_806C994(EWRAM_1B000.unk260, gLastFieldPokeMenuOpened); - sub_806BF74(EWRAM_1B000.unk260, 0); - SetMainCallback2(sub_806AEDC); + sub_806C994(EWRAM_1B000.menuHandlerTaskId, gLastFieldPokeMenuOpened); + ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0); + SetMainCallback2(CB2_PartyMenuMain); break; } if (sub_80F9344() == TRUE) @@ -562,10 +561,10 @@ void sub_808A520(void) AddBagItem(GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_HELD_ITEM), 1); TakeMailFromMon(&gPlayerParty[gLastFieldPokeMenuOpened]); SetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_HELD_ITEM, (void*) &gUnknown_0202E8F8); - sub_806AF4C(0, 0xFF, sub_8089CD4, 0); + SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0xFF, HandleDefaultPartyMenu, 0); } else - sub_806AF4C(0, 0xFF, sub_808A5BC, 0xFF); + SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0xFF, sub_808A5BC, 0xFF); SetMainCallback2(sub_808A4D4); } @@ -620,7 +619,7 @@ static void PokemonMenu_Mail(u8 taskID) HandleDestroyMenuCursors(); sPokeMenuCursorPos = 0; MenuZeroFillWindowRect(19, 0, 29, 19); - sub_806E750(0, &sUnknown_0839F584, (void*) sPokemonMenuActions, 0); + ShowPartyPopupMenu(0, &sUnknown_0839F584, (void*) sPokemonMenuActions, 0); gTasks[taskID].func = sub_808A73C; } @@ -630,26 +629,26 @@ static void sub_808A73C(u8 taskID) { PlaySE(SE_SELECT); if (sPokeMenuCursorPos == 0) - sPokeMenuCursorPos = MoveMenuCursor(sUnknown_0839F584.unk0 - 1); + sPokeMenuCursorPos = MoveMenuCursor(sUnknown_0839F584.numChoices - 1); else sPokeMenuCursorPos = MoveMenuCursor(-1); } if (gMain.newAndRepeatedKeys == DPAD_DOWN) { PlaySE(SE_SELECT); - if (sPokeMenuCursorPos == sUnknown_0839F584.unk0 - 1) - sPokeMenuCursorPos = MoveMenuCursor(1 - sUnknown_0839F584.unk0); + if (sPokeMenuCursorPos == sUnknown_0839F584.numChoices - 1) + sPokeMenuCursorPos = MoveMenuCursor(1 - sUnknown_0839F584.numChoices); else sPokeMenuCursorPos = MoveMenuCursor(1); } if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - PartyMenuGetPopupMenuFunc(0, &sUnknown_0839F584, (void*) sPokemonMenuActions, sPokeMenuCursorPos)(taskID); + PartyMenuGetPopupMenuFunc(0, &sUnknown_0839F584, sPokemonMenuActions, sPokeMenuCursorPos)(taskID); } else if (gMain.newKeys & B_BUTTON) { - sub_806E7D0(0, &sUnknown_0839F584); + ClosePartyPopupMenu(0, &sUnknown_0839F584); PokemonMenu_Cancel(taskID); } } @@ -681,8 +680,8 @@ static void sub_808A8D4(u8 taskID) { sPokeMenuCursorPos = 0; MenuZeroFillWindowRect(19, 0, 29, 19); - sub_806D538(0, 0); - gTasks[taskID].func = sub_8089CD4; + PrintPartyMenuPromptText(0, 0); + gTasks[taskID].func = HandleDefaultPartyMenu; } static void PokemonMenu_Cancel(u8 taskID) @@ -718,9 +717,9 @@ static void PokemonMenu_FieldMove(u8 taskID) { MenuZeroFillWindowRect(19, 0, 29, 19); if (IS_SOFTBOILED_MILKDRINK(tFieldMoveId)) - sub_806D538(9, 0); + PrintPartyMenuPromptText(9, 0); else - sub_806D538(sFieldMoveFuncs[tFieldMoveId].field_1, 0); + PrintPartyMenuPromptText(sFieldMoveFuncs[tFieldMoveId].field_1, 0); gTasks[taskID].func = sub_808ABF4; } else if (tFieldMoveId <= 7 && FlagGet(BADGE01_GET + tFieldMoveId) != TRUE) @@ -748,9 +747,9 @@ static void PokemonMenu_FieldMove(u8 taskID) { MenuZeroFillWindowRect(19, 0, 29, 19); if (IS_SURF(tFieldMoveId) && TestPlayerAvatarFlags(8)) - sub_806D538(8, 0); + PrintPartyMenuPromptText(8, 0); else - sub_806D538(sFieldMoveFuncs[tFieldMoveId].field_1, 0); + PrintPartyMenuPromptText(sFieldMoveFuncs[tFieldMoveId].field_1, 0); gTasks[taskID].func = sub_808ABF4; } } @@ -849,11 +848,11 @@ static void sub_808AD0C(void) { while (1) { - if (sub_806B124() == TRUE) + if (InitPartyMenu() == TRUE) { - sub_806C994(EWRAM_1B000.unk260, gLastFieldPokeMenuOpened); - sub_806BF74(EWRAM_1B000.unk260, 0); - SetMainCallback2(sub_806AEDC); + sub_806C994(EWRAM_1B000.menuHandlerTaskId, gLastFieldPokeMenuOpened); + ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0); + SetMainCallback2(CB2_PartyMenuMain); break; } if (sub_80F9344() == TRUE) @@ -864,7 +863,7 @@ static void sub_808AD0C(void) void sub_808AD58(void) { gPaletteFade.bufferTransferDisabled = 1; - sub_806AF4C(0, 0xFF, sub_8089CD4, 0); + SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0xFF, HandleDefaultPartyMenu, 0); SetMainCallback2(sub_808AD0C); } @@ -952,7 +951,7 @@ static void sub_808AF80(void) { while (1) { - if (sub_806B124() == TRUE) + if (InitPartyMenu() == TRUE) { if (gUnknown_02038561 == 0) { @@ -968,9 +967,9 @@ static void sub_808AF80(void) } if (gLastFieldPokeMenuOpened > 5 || !GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_SPECIES)) gLastFieldPokeMenuOpened = 0; - sub_806C994(ewram1B000.unk260, gLastFieldPokeMenuOpened); - sub_806BF74(ewram1B000.unk260, 0); - SetMainCallback2(sub_806AEDC); + sub_806C994(ewram1B000.menuHandlerTaskId, gLastFieldPokeMenuOpened); + ChangePartyMenuSelection(ewram1B000.menuHandlerTaskId, 0); + SetMainCallback2(CB2_PartyMenuMain); break; } if (sub_80F9344() == TRUE) @@ -985,16 +984,16 @@ void sub_808B020(void) { case 0: if (CheckIfItemIsTMHMOrEvolutionStone(gScriptItemId) == 1) - sub_806AF4C(0, 0, sub_808B0C0, 20); + SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0, sub_808B0C0, 20); else - sub_806AF4C(0, 0, sub_808B0C0, 3); + SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0, sub_808B0C0, 3); break; case 4: - sub_806AF4C(0, 0, sub_808B1EC, 0xFF); + SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0, sub_808B1EC, 0xFF); break; case 1: case 3: - sub_806AF4C(0, 0, sub_808B0C0, 4); + SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0, sub_808B0C0, 4); break; } SetMainCallback2(sub_808AF80); @@ -1004,9 +1003,9 @@ void sub_808B0C0(u8 taskID) { if (!gPaletteFade.active) { - switch (sub_806BD80(taskID)) + switch (HandleDefaultPartyMenuInput(taskID)) { - case 1: + case A_BUTTON: gLastFieldPokeMenuOpened = sub_806CA38(taskID); if (GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_IS_EGG)) PlaySE(SE_HAZURE); @@ -1027,7 +1026,7 @@ void sub_808B0C0(u8 taskID) } } break; - case 2: + case B_BUTTON: gLastFieldPokeMenuOpened = sub_806CA38(taskID); PlaySE(SE_SELECT); BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); @@ -1104,11 +1103,11 @@ static void sub_808B3A0(void) { while (1) { - if (sub_806B124() == TRUE) + if (InitPartyMenu() == TRUE) { - sub_806C994(EWRAM_1B000.unk260, gLastFieldPokeMenuOpened); - sub_806BF74(EWRAM_1B000.unk260, 0); - SetMainCallback2(sub_806AEDC); + sub_806C994(EWRAM_1B000.menuHandlerTaskId, gLastFieldPokeMenuOpened); + ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0); + SetMainCallback2(CB2_PartyMenuMain); break; } if (sub_80F9344() == TRUE) @@ -1130,11 +1129,11 @@ static void sub_808B3EC(void) SetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_HELD_ITEM, (void*) &gUnknown_0202E8F8); CreateTask(sub_808B25C, 5); gPaletteFade.bufferTransferDisabled = 0; - callback = sub_806AEDC; + callback = CB2_PartyMenuMain; } else { - sub_806AF4C(0, 0, sub_808B4A4, 0xFF); + SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0, sub_808B4A4, 0xFF); callback = sub_808B3A0; } SetMainCallback2(callback); @@ -1164,11 +1163,11 @@ static void sub_808B518(void) { while (1) { - if (sub_806B124() == TRUE) + if (InitPartyMenu() == TRUE) { - sub_806C994(EWRAM_1B000.unk260, gUnknown_020384F0); - sub_806BF74(EWRAM_1B000.unk260, 0); - SetMainCallback2(sub_806AEDC); + sub_806C994(EWRAM_1B000.menuHandlerTaskId, gUnknown_020384F0); + ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0); + SetMainCallback2(CB2_PartyMenuMain); break; } if (sub_80F9344() == TRUE) @@ -1180,9 +1179,9 @@ void sub_808B564(void) { gPaletteFade.bufferTransferDisabled = 1; if (sub_809FA30() != 4) - sub_806AF4C(0, 0, TaughtMove, 0xFF); + SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0, TaughtMove, 0xFF); else - sub_806AF4C(0, 0, StopTryingToTeachMove_806F588, 0xFF); + SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0, StopTryingToTeachMove_806F588, 0xFF); SetMainCallback2(sub_808B518); } diff --git a/src/pokemon_size_record.c b/src/pokemon/pokemon_size_record.c index f2222bd3b..a71e6f1fd 100644 --- a/src/pokemon_size_record.c +++ b/src/pokemon/pokemon_size_record.c @@ -46,7 +46,7 @@ static u32 GetMonSizeHash(struct Pokemon *pkmn) u16 hpIV = GetMonData(pkmn, MON_DATA_HP_IV) & 0xF; u16 attackIV = GetMonData(pkmn, MON_DATA_ATK_IV) & 0xF; u16 defenseIV = GetMonData(pkmn, MON_DATA_DEF_IV) & 0xF; - u16 speedIV = GetMonData(pkmn, MON_DATA_SPD_IV) & 0xF; + u16 speedIV = GetMonData(pkmn, MON_DATA_SPEED_IV) & 0xF; u16 spAtkIV = GetMonData(pkmn, MON_DATA_SPATK_IV) & 0xF; u16 spDefIV = GetMonData(pkmn, MON_DATA_SPDEF_IV) & 0xF; u32 hibyte = ((attackIV ^ defenseIV) * hpIV) ^ (personality & 0xFF); diff --git a/src/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c index 5e97523e2..5e97523e2 100644 --- a/src/pokemon_storage_system.c +++ b/src/pokemon/pokemon_storage_system.c diff --git a/src/pokemon_summary_screen.c b/src/pokemon/pokemon_summary_screen.c index 00a0bea29..00a0bea29 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon/pokemon_summary_screen.c diff --git a/src/rom3.c b/src/rom3.c index 3f4860ecc..75dfdf2a2 100644 --- a/src/rom3.c +++ b/src/rom3.c @@ -92,7 +92,7 @@ void setup_poochyena_battle(void) ZeroEnemyPartyMons(); CreateMon(&gEnemyParty[0], SPECIES_POOCHYENA, 2, 32, 0, 0, 0, 0); i = ITEM_NONE; - SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, (u8 *)&i); + SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &i); } gUnknown_020239FC = 0; gUnknown_02024C78 = 0; @@ -489,7 +489,7 @@ void sub_800C35C(void) u8 i; //r4 s32 j; //r2 u16 r6; //r6 - u8 *recvBuffer; //r3 + u16 *recvBuffer; //r3 u8 *dest; //r5 u8 *src; //r4 @@ -500,10 +500,10 @@ void sub_800C35C(void) if (GetBlockReceivedStatus() & gBitTable[i]) { ResetBlockReceivedFlag(i); - recvBuffer = (u8 *)&gBlockRecvBuffer[i]; + recvBuffer = gBlockRecvBuffer[i]; #ifndef NONMATCHING asm(""); - recvBuffer = (u8 *)&gBlockRecvBuffer[i]; + recvBuffer = gBlockRecvBuffer[i]; #endif r6 = gBlockRecvBuffer[i][2]; if (gTasks[gUnknown_020238C5].data[14] + 9 + r6 > 0x1000) @@ -513,7 +513,7 @@ void sub_800C35C(void) } //_0800C402 dest = EWRAM_15000 + gTasks[gUnknown_020238C5].data[14]; - src = recvBuffer; + src = (u8 *)recvBuffer; for (j = 0; j < r6 + 8; j++) dest[j] = src[j]; gTasks[gUnknown_020238C5].data[14] = gTasks[gUnknown_020238C5].data[14] + r6 + 8; @@ -1097,7 +1097,7 @@ void EmitTrainerBallThrow(u8 a) PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4); } -void Emitcmd48(u8 a, u8 *b, u8 c) +void EmitDrawPartyStatusSummary(u8 a, struct HpAndStatus *hpAndStatus, u8 c) { int i; @@ -1106,7 +1106,7 @@ void Emitcmd48(u8 a, u8 *b, u8 c) gBattleBuffersTransferData[2] = (c & 0x80) >> 7; gBattleBuffersTransferData[3] = 48; for (i = 0; i < 48; i++) - gBattleBuffersTransferData[4 + i] = b[i]; + gBattleBuffersTransferData[4 + i] = *(i + (u8*)(hpAndStatus)); PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 52); } diff --git a/src/rom6.c b/src/rom6.c index 3a5071034..32b5f52a5 100644 --- a/src/rom6.c +++ b/src/rom6.c @@ -59,7 +59,7 @@ static void task08_080C9820(u8 taskId) u8 mapObjId; ScriptContext2_Enable(); - gPlayerAvatar.unk6 = 1; + gPlayerAvatar.preventStep = TRUE; mapObjId = gPlayerAvatar.mapObjectId; if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(&gMapObjects[mapObjId]) || FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[mapObjId])) @@ -112,7 +112,7 @@ static void sub_810B4CC(u8 taskId) void (*func)(void) = (void (*)(void))(((u16)gTasks[taskId].data[8] << 16) | (u16)gTasks[taskId].data[9]); func(); - gPlayerAvatar.unk6 = 0; + gPlayerAvatar.preventStep = FALSE; DestroyTask(taskId); } @@ -169,7 +169,7 @@ int SetUpFieldMove_Dig(void) static void sub_810B5D8(void) { - sub_8053014(); + Overworld_ResetStateAfterDigEscRope(); FieldEffectStart(FLDEFF_USE_DIG); gFieldEffectArguments[0] = gLastFieldPokeMenuOpened; } diff --git a/src/rom_8077ABC.c b/src/rom_8077ABC.c index 249146b37..285c992ca 100644 --- a/src/rom_8077ABC.c +++ b/src/rom_8077ABC.c @@ -102,8 +102,8 @@ extern u32 gTransformPersonalities[NUM_BATTLE_SLOTS]; extern u8 gBattleMonForms[NUM_BATTLE_SLOTS]; extern u16 gUnknown_0202F7CA[]; extern u8 gBattleMonSprites[NUM_BATTLE_SLOTS]; -extern u8 gBattleAnimPlayerMonIndex; -extern u8 gBattleAnimEnemyMonIndex; +extern u8 gBattleAnimBankAttacker; +extern u8 gBattleAnimBankTarget; extern s16 gBattleAnimArgs[8]; extern u8 gBanksBySide[NUM_BATTLE_SLOTS]; extern u8 gNoOfAllBanks; // gNumBattleMons? @@ -111,6 +111,8 @@ extern struct OamMatrix gOamMatrices[]; extern struct Struct_2017810 unk_2017810[]; extern u8 gHappinessMoveAnim; +extern u8 UpdateMonIconFrame(struct Sprite *sprite); + EWRAM_DATA union AffineAnimCmd *gUnknown_0202F7D4 = NULL; EWRAM_DATA u32 filler_0202F7D8[3] = {0}; @@ -185,7 +187,7 @@ u8 sub_8077ABC(u8 slot, u8 a2) { u16 species; struct TransformStatus *transform; - if (IsContest()) { + if (NotInBattle()) { if (a2 == 3 && slot == 3) { a2 = 1; } @@ -201,7 +203,7 @@ u8 sub_8077ABC(u8 slot, u8 a2) { case 3: case 4: default: - if (IsContest()) { + if (NotInBattle()) { if (unk_2019348.field_4 & 1) { species = unk_2019348.field_2; } else { @@ -241,9 +243,9 @@ u8 sub_8077BFC(u8 slot, u16 species) { u8 ret; u16 var; - if (!GetBankSide(slot) || IsContest()) { + if (!GetBankSide(slot) || NotInBattle()) { if (species == SPECIES_UNOWN) { - if (IsContest()) { + if (NotInBattle()) { if (unk_2019348.field_4 & 1) { personality = unk_2019348.field_10; } else { @@ -300,7 +302,7 @@ u8 sub_8077BFC(u8 slot, u16 species) { u8 sub_8077DD8(u8 slot, u16 species) { u8 ret = 0; if (GetBankSide(slot) == 1) { - if (!IsContest()) { + if (!NotInBattle()) { if (species == SPECIES_CASTFORM) { ret = gCastformElevations[gBattleMonForms[slot]]; } else if (species > NUM_SPECIES) { @@ -316,7 +318,7 @@ u8 sub_8077DD8(u8 slot, u16 species) { u8 sub_8077E44(u8 slot, u16 species, u8 a3) { u16 offset; u8 y; - if (GetBankSide(slot) == 0 || IsContest()) { + if (GetBankSide(slot) == 0 || NotInBattle()) { offset = sub_8077BFC(slot, species); } else { offset = sub_8077BFC(slot, species); @@ -336,7 +338,7 @@ u8 sub_8077EE4(u8 slot, u8 a2) { u16 species; struct TransformStatus *transform; if (a2 == 3 || a2 == 4) { - if (IsContest()) { + if (NotInBattle()) { if (unk_2019348.field_4 & 1) { species = unk_2019348.field_2; } else { @@ -379,7 +381,7 @@ u8 sub_8077FC0(u8 slot) { u8 r6; struct TransformStatus *transform; r6 = sub_8077ABC(slot, 1); - if (!IsContest()) { + if (!NotInBattle()) { if (GetBankSide(slot)) { transform = &gTransformStatuses[slot]; if (!transform->species) { @@ -402,43 +404,43 @@ u8 sub_8077FC0(u8 slot) { return r6; } -u8 obj_id_for_side_relative_to_move(u8 a1) { +u8 GetAnimBankSpriteId(u8 whichBank) { u8 *sprites; - if (a1 == 0) { - if (sub_8078874(gBattleAnimPlayerMonIndex)) { + if (whichBank == ANIM_BANK_ATK) { + if (AnimBankSpriteExists(gBattleAnimBankAttacker)) { sprites = gBattleMonSprites; - return sprites[gBattleAnimPlayerMonIndex]; + return sprites[gBattleAnimBankAttacker]; } else { return 0xff; } - } else if (a1 == 1) { - if (sub_8078874(gBattleAnimEnemyMonIndex)) { + } else if (whichBank == ANIM_BANK_DEF) { + if (AnimBankSpriteExists(gBattleAnimBankTarget)) { sprites = gBattleMonSprites; - return sprites[gBattleAnimEnemyMonIndex]; + return sprites[gBattleAnimBankTarget]; } else { return 0xff; } - } else if (a1 == 2) { - if (!b_side_obj__get_some_boolean(gBattleAnimPlayerMonIndex ^ 2)) { + } else if (whichBank == ANIM_BANK_ATK_PARTNER) { + if (!IsAnimBankSpriteVisible(gBattleAnimBankAttacker ^ 2)) { return 0xff; } else { - return gBattleMonSprites[gBattleAnimPlayerMonIndex ^ 2]; + return gBattleMonSprites[gBattleAnimBankAttacker ^ 2]; } } else { - if (b_side_obj__get_some_boolean(gBattleAnimEnemyMonIndex ^ 2)) { - return gBattleMonSprites[gBattleAnimEnemyMonIndex ^ 2]; + if (IsAnimBankSpriteVisible(gBattleAnimBankTarget ^ 2)) { + return gBattleMonSprites[gBattleAnimBankTarget ^ 2]; } else { return 0xff; } } } -void oamt_set_x3A_32(struct Sprite *sprite, void (*callback)(struct Sprite*)) { +void StoreSpriteCallbackInData6(struct Sprite *sprite, void (*callback)(struct Sprite*)) { sprite->data6 = (u32)(callback) & 0xffff; sprite->data7 = (u32)(callback) >> 16; } -void sub_8078104(struct Sprite *sprite) { +void SetCallbackToStoredInData6(struct Sprite *sprite) { u32 callback = (u16)sprite->data6 | (sprite->data7 << 16); sprite->callback = (void (*)(struct Sprite *))callback; } @@ -455,7 +457,7 @@ void sub_8078114(struct Sprite *sprite) { } sprite->data3--; } else { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } } @@ -472,7 +474,7 @@ void sub_8078174(struct Sprite *sprite) { } sprite->data3--; } else { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } } @@ -494,7 +496,7 @@ void unref_sub_80781F0(struct Sprite *sprite) { } sprite->data3--; } else { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } } @@ -510,7 +512,7 @@ void sub_8078278(struct Sprite *sprite) { } sprite->data3--; } else { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } } @@ -518,7 +520,7 @@ void sub_80782D8(struct Sprite *sprite) { if (sprite->data0 > 0) { sprite->data0--; } else { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } } @@ -547,7 +549,7 @@ void sub_8078364(struct Sprite *sprite) { sprite->pos2.x += sprite->data1; sprite->pos2.y += sprite->data2; } else { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } } @@ -559,7 +561,7 @@ void sub_8078394(struct Sprite *sprite) { sprite->pos2.x = sprite->data3 >> 8; sprite->pos2.y = sprite->data4 >> 8; } else { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } } @@ -571,7 +573,7 @@ void sub_80783D0(struct Sprite *sprite) { sprite->pos2.x = sprite->data3 >> 8; sprite->pos2.y = sprite->data4 >> 8; } else { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } UpdateMonIconFrame(sprite); } @@ -579,8 +581,8 @@ void sub_80783D0(struct Sprite *sprite) { void unref_sub_8078414(struct Sprite *sprite) { sprite->data1 = sprite->pos1.x + sprite->pos2.x; sprite->data3 = sprite->pos1.y + sprite->pos2.y; - sprite->data2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 2); - sprite->data4 = sub_8077ABC(gBattleAnimEnemyMonIndex, 3); + sprite->data2 = sub_8077ABC(gBattleAnimBankTarget, 2); + sprite->data4 = sub_8077ABC(gBattleAnimBankTarget, 3); sprite->callback = sub_80782F8; } @@ -590,7 +592,7 @@ void sub_8078458(struct Sprite *sprite) { gSprites[sprite->data3].pos2.x += sprite->data1; gSprites[sprite->data3].pos2.y += sprite->data2; } else { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } } @@ -602,7 +604,7 @@ void sub_80784A8(struct Sprite *sprite) { gSprites[sprite->data5].pos2.x = sprite->data3 >> 8; gSprites[sprite->data5].pos2.y = sprite->data4 >> 8; } else { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } } @@ -619,7 +621,7 @@ void sub_8078504(struct Sprite *sprite) { } } } else { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } } @@ -631,8 +633,8 @@ void move_anim_8074EE0(struct Sprite *sprite) { void unref_sub_8078588(struct Sprite *sprite) { sprite->data1 = sprite->pos1.x + sprite->pos2.x; sprite->data3 = sprite->pos1.y + sprite->pos2.y; - sprite->data2 = sub_8077ABC(gBattleAnimPlayerMonIndex, 2); - sprite->data4 = sub_8077ABC(gBattleAnimPlayerMonIndex, 3); + sprite->data2 = sub_8077ABC(gBattleAnimBankAttacker, 2); + sprite->data4 = sub_8077ABC(gBattleAnimBankAttacker, 3); sprite->callback = sub_80782F8; } @@ -643,13 +645,13 @@ void unref_sub_80785CC(struct Sprite *sprite) { void sub_80785E4(struct Sprite *sprite) { if (sprite->affineAnimEnded) { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } } void sub_8078600(struct Sprite *sprite) { if (sprite->animEnded) { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } } @@ -666,19 +668,19 @@ void sub_8078634(u8 task) { } void sub_8078650(struct Sprite *sprite) { - sprite->pos1.x = sub_8077ABC(gBattleAnimPlayerMonIndex, 2); - sprite->pos1.y = sub_8077ABC(gBattleAnimPlayerMonIndex, 3); + sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2); + sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3); } void sub_807867C(struct Sprite *sprite, s16 a2) { - u16 v1 = sub_8077ABC(gBattleAnimPlayerMonIndex, 0); - u16 v2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 0); + u16 v1 = sub_8077ABC(gBattleAnimBankAttacker, 0); + u16 v2 = sub_8077ABC(gBattleAnimBankTarget, 0); if (v1 > v2) { sprite->pos1.x -= a2; } else if (v1 < v2) { sprite->pos1.x += a2; } else { - if (GetBankSide(gBattleAnimPlayerMonIndex)) { + if (GetBankSide(gBattleAnimBankAttacker)) { sprite->pos1.x -= a2; } else { sprite->pos1.x += a2; @@ -712,8 +714,8 @@ void oamt_add_pos2_onto_pos1(struct Sprite *sprite) { void sub_8078764(struct Sprite *sprite, u8 a2) { if (!a2) { - sprite->pos1.x = sub_8077EE4(gBattleAnimEnemyMonIndex, 0); - sprite->pos1.y = sub_8077EE4(gBattleAnimEnemyMonIndex, 1); + sprite->pos1.x = sub_8077EE4(gBattleAnimBankTarget, 0); + sprite->pos1.y = sub_8077EE4(gBattleAnimBankTarget, 1); } sub_807867C(sprite, gBattleAnimArgs[0]); sprite->pos1.y += gBattleAnimArgs[1]; @@ -721,11 +723,11 @@ void sub_8078764(struct Sprite *sprite, u8 a2) { void sub_80787B0(struct Sprite *sprite, u8 a2) { if (!a2) { - sprite->pos1.x = sub_8077EE4(gBattleAnimPlayerMonIndex, 0); - sprite->pos1.y = sub_8077EE4(gBattleAnimPlayerMonIndex, 1); + sprite->pos1.x = sub_8077EE4(gBattleAnimBankAttacker, 0); + sprite->pos1.y = sub_8077EE4(gBattleAnimBankAttacker, 1); } else { - sprite->pos1.x = sub_8077EE4(gBattleAnimPlayerMonIndex, 2); - sprite->pos1.y = sub_8077EE4(gBattleAnimPlayerMonIndex, 3); + sprite->pos1.x = sub_8077EE4(gBattleAnimBankAttacker, 2); + sprite->pos1.y = sub_8077EE4(gBattleAnimBankAttacker, 3); } sub_807867C(sprite, gBattleAnimArgs[0]); sprite->pos1.y += gBattleAnimArgs[1]; @@ -749,12 +751,12 @@ u8 GetBankByPlayerAI(u8 slot) { return i; } -bool8 sub_8078874(u8 slot) { - if (IsContest()) { - if (gBattleAnimPlayerMonIndex == slot) { +bool8 AnimBankSpriteExists(u8 slot) { + if (NotInBattle()) { + if (gBattleAnimBankAttacker == slot) { return TRUE; } - if (gBattleAnimEnemyMonIndex == slot) { + if (gBattleAnimBankTarget == slot) { return TRUE; } return FALSE; @@ -780,7 +782,7 @@ bool8 IsDoubleBattle() { } void sub_8078914(struct Struct_sub_8078914 *unk) { - if (IsContest()) { + if (NotInBattle()) { unk->field_0 = (u8 *)0x6008000; unk->field_4 = (u8 *)0x600f000; unk->field_8 = 0xe; @@ -792,11 +794,11 @@ void sub_8078914(struct Struct_sub_8078914 *unk) { } void sub_8078954(struct Struct_sub_8078914 *unk) { - if (IsContest()) { + if (NotInBattle()) { unk->field_0 = (u8 *)0x6008000; unk->field_4 = (u8 *)0x600f000; unk->field_8 = 0xe; - } else if (GetBankIdentity_permutated(gBattleAnimPlayerMonIndex) == 1) { + } else if (GetBankIdentity_permutated(gBattleAnimBankAttacker) == 1) { unk->field_0 = (u8 *)0x6004000; unk->field_4 = (u8 *)0x600e000; unk->field_8 = 0x8; @@ -808,7 +810,7 @@ void sub_8078954(struct Struct_sub_8078914 *unk) { } u8 sub_80789BC() { - if (IsContest()) { + if (NotInBattle()) { return 1; } return 2; @@ -818,7 +820,7 @@ void sub_80789D4(bool8 a1) { if (!a1) { BG3CNT.size = 0; BG3CNT.overflow = 1; - } else if (IsContest()) { + } else if (NotInBattle()) { BG3CNT.size = 0; BG3CNT.overflow = 1; } else { @@ -906,7 +908,7 @@ bool8 sub_8078B5C(struct Sprite *sprite) { void sub_8078BB8(struct Sprite *sprite) { if (sub_8078B5C(sprite)) { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } } @@ -986,7 +988,7 @@ bool8 sub_8078CE8(struct Sprite *sprite) { void sub_8078D44(struct Sprite *sprite) { if (sub_8078CE8(sprite)) { - sub_8078104(sprite); + SetCallbackToStoredInData6(sprite); } } @@ -1023,8 +1025,8 @@ void obj_id_set_rotscale(u8 sprite, s16 xScale, s16 yScale, u16 rotation) { } bool8 sub_8078E38() { - if (IsContest()) { - if (gSprites[obj_id_for_side_relative_to_move(0)].data2 == 0xc9 /* XXX SPECIES_UNOWN? */) { + if (NotInBattle()) { + if (gSprites[GetAnimBankSpriteId(0)].data2 == 0xc9 /* XXX SPECIES_UNOWN? */) { return FALSE; } return TRUE; @@ -1035,12 +1037,12 @@ bool8 sub_8078E38() { void sub_8078E70(u8 sprite, u8 a2) { struct Struct_2017810 *unk; u8 r7 = gSprites[sprite].data0; - if (IsContest() || b_side_obj__get_some_boolean(r7)) { + if (NotInBattle() || IsAnimBankSpriteVisible(r7)) { gSprites[sprite].invisible = FALSE; } gSprites[sprite].oam.objMode = a2; gSprites[sprite].affineAnimPaused = TRUE; - if (!IsContest() && !gSprites[sprite].oam.affineMode) { + if (!NotInBattle() && !gSprites[sprite].oam.affineMode) { unk = &unk_2017810[r7]; gSprites[sprite].oam.matrixNum = unk->field_6; } @@ -1096,12 +1098,12 @@ void sub_8079098(struct Sprite *sprite) { CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); } -u16 sub_80790D8(s16 a, s16 b) { +static u16 ArcTan2_(s16 a, s16 b) { return ArcTan2(a, b); } u16 sub_80790F0(s16 a, s16 b) { - u16 var = sub_80790D8(a, b); + u16 var = ArcTan2_(a, b); return -var; } @@ -1133,41 +1135,41 @@ u32 sub_80791A8(u8 a1, u8 a2, u8 a3, u8 a4, u8 a5, u8 a6, u8 a7) { u32 var = 0; u32 shift; if (a1) { - if (!IsContest()) { + if (!NotInBattle()) { var = 0xe; } else { var = 1 << sub_80789BC(); } } if (a2) { - shift = gBattleAnimPlayerMonIndex + 16; + shift = gBattleAnimBankAttacker + 16; var |= 1 << shift; } if (a3) { - shift = gBattleAnimEnemyMonIndex + 16; + shift = gBattleAnimBankTarget + 16; var |= 1 << shift; } if (a4) { - if (b_side_obj__get_some_boolean(gBattleAnimPlayerMonIndex ^ 2)) { - shift = (gBattleAnimPlayerMonIndex ^ 2) + 16; + if (IsAnimBankSpriteVisible(gBattleAnimBankAttacker ^ 2)) { + shift = (gBattleAnimBankAttacker ^ 2) + 16; var |= 1 << shift; } } if (a5) { - if (b_side_obj__get_some_boolean(gBattleAnimEnemyMonIndex ^ 2)) { - shift = (gBattleAnimEnemyMonIndex ^ 2) + 16; + if (IsAnimBankSpriteVisible(gBattleAnimBankTarget ^ 2)) { + shift = (gBattleAnimBankTarget ^ 2) + 16; var |= 1 << shift; } } if (a6) { - if (!IsContest()) { + if (!NotInBattle()) { var |= 0x100; } else { var |= 0x4000; } } if (a7) { - if (!IsContest()) { + if (!NotInBattle()) { var |= 0x200; } } @@ -1177,31 +1179,31 @@ u32 sub_80791A8(u8 a1, u8 a2, u8 a3, u8 a4, u8 a5, u8 a6, u8 a7) { u32 sub_80792C0(u8 a1, u8 a2, u8 a3, u8 a4) { u32 var = 0; u32 shift; - if (IsContest()) { + if (NotInBattle()) { if (a1) { var |= 1 << 18; return var; } } else { if (a1) { - if (b_side_obj__get_some_boolean(GetBankByPlayerAI(0))) { + if (IsAnimBankSpriteVisible(GetBankByPlayerAI(0))) { var |= 1 << (GetBankByPlayerAI(0) + 16); } } if (a2) { - if (b_side_obj__get_some_boolean(GetBankByPlayerAI(2))) { + if (IsAnimBankSpriteVisible(GetBankByPlayerAI(2))) { shift = GetBankByPlayerAI(2) + 16; var |= 1 << shift; } } if (a3) { - if (b_side_obj__get_some_boolean(GetBankByPlayerAI(1))) { + if (IsAnimBankSpriteVisible(GetBankByPlayerAI(1))) { shift = GetBankByPlayerAI(1) + 16; var |= 1 << shift; } } if (a4) { - if (b_side_obj__get_some_boolean(GetBankByPlayerAI(3))) { + if (IsAnimBankSpriteVisible(GetBankByPlayerAI(3))) { shift = GetBankByPlayerAI(3) + 16; var |= 1 << shift; } @@ -1252,24 +1254,24 @@ void sub_807941C(struct Sprite *sprite) { v2 = 1; } sub_80787B0(sprite, v1); - if (GetBankSide(gBattleAnimPlayerMonIndex)) { + if (GetBankSide(gBattleAnimBankAttacker)) { gBattleAnimArgs[2] = -gBattleAnimArgs[2]; } sprite->data0 = gBattleAnimArgs[4]; - sprite->data2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 2) + gBattleAnimArgs[2]; - sprite->data4 = sub_8077ABC(gBattleAnimEnemyMonIndex, v2) + gBattleAnimArgs[3]; + sprite->data2 = sub_8077ABC(gBattleAnimBankTarget, 2) + gBattleAnimArgs[2]; + sprite->data4 = sub_8077ABC(gBattleAnimBankTarget, v2) + gBattleAnimArgs[3]; sprite->callback = sub_8078B34; - oamt_set_x3A_32(sprite, move_anim_8072740); + StoreSpriteCallbackInData6(sprite, move_anim_8072740); } void sub_80794A8(struct Sprite *sprite) { sub_80787B0(sprite, 1); - if (GetBankSide(gBattleAnimPlayerMonIndex)) { + if (GetBankSide(gBattleAnimBankAttacker)) { gBattleAnimArgs[2] = -gBattleAnimArgs[2]; } sprite->data0 = gBattleAnimArgs[4]; - sprite->data2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 2) + gBattleAnimArgs[2]; - sprite->data4 = sub_8077ABC(gBattleAnimEnemyMonIndex, 3) + gBattleAnimArgs[3]; + sprite->data2 = sub_8077ABC(gBattleAnimBankTarget, 2) + gBattleAnimArgs[2]; + sprite->data4 = sub_8077ABC(gBattleAnimBankTarget, 3) + gBattleAnimArgs[3]; sprite->data5 = gBattleAnimArgs[5]; sub_80786EC(sprite); sprite->callback = sub_8079518; @@ -1292,12 +1294,12 @@ void sub_8079534(struct Sprite *sprite) { } if (!gBattleAnimArgs[5]) { sub_80787B0(sprite, r4); - slot = gBattleAnimPlayerMonIndex; + slot = gBattleAnimBankAttacker; } else { sub_8078764(sprite, r4); - slot = gBattleAnimEnemyMonIndex; + slot = gBattleAnimBankTarget; } - if (GetBankSide(gBattleAnimPlayerMonIndex)) { + if (GetBankSide(gBattleAnimBankAttacker)) { gBattleAnimArgs[2] = -gBattleAnimArgs[2]; } sub_8078764(sprite, r4); @@ -1305,12 +1307,12 @@ void sub_8079534(struct Sprite *sprite) { sprite->data2 = sub_8077ABC(slot, 2) + gBattleAnimArgs[2]; sprite->data4 = sub_8077ABC(slot, r7) + gBattleAnimArgs[3]; sprite->callback = sub_8078B34; - oamt_set_x3A_32(sprite, move_anim_8072740); + StoreSpriteCallbackInData6(sprite, move_anim_8072740); } s16 duplicate_obj_of_side_rel2move_in_transparent_mode(u8 a1) { u16 i; - u8 sprite = obj_id_for_side_relative_to_move(a1); + u8 sprite = GetAnimBankSpriteId(a1); if (sprite != 0xff) { for (i = 0; i < 0x40; i++) { if (gSprites[i].inUse) { @@ -1380,7 +1382,7 @@ void sub_80796F8(u8 taskId) { } void sub_8079790(u8 task) { - u8 sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]); + u8 sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]); if (sprite == 0xff) { DestroyAnimVisualTask(task); return; @@ -1538,7 +1540,7 @@ u16 sub_8079B10(u8 sprite) { u16 i; for (i = 0; i < (sizeof(gBattleMonSprites) / sizeof(u8)); i++) { if (gBattleMonSprites[i] == sprite) { - if (IsContest()) { + if (NotInBattle()) { species = unk_2019348.field_0; return gMonBackPicCoords[species].y_offset; } else { @@ -1624,24 +1626,24 @@ void sub_8079CEC(u8 task) { } void unref_sub_8079D20(u8 priority) { - if (b_side_obj__get_some_boolean(gBattleAnimEnemyMonIndex)) { - gSprites[gBattleMonSprites[gBattleAnimEnemyMonIndex]].oam.priority = priority; + if (IsAnimBankSpriteVisible(gBattleAnimBankTarget)) { + gSprites[gBattleMonSprites[gBattleAnimBankTarget]].oam.priority = priority; } - if (b_side_obj__get_some_boolean(gBattleAnimPlayerMonIndex)) { - gSprites[gBattleMonSprites[gBattleAnimPlayerMonIndex]].oam.priority = priority; + if (IsAnimBankSpriteVisible(gBattleAnimBankAttacker)) { + gSprites[gBattleMonSprites[gBattleAnimBankAttacker]].oam.priority = priority; } - if (b_side_obj__get_some_boolean(gBattleAnimEnemyMonIndex ^ 2)) { - gSprites[gBattleMonSprites[gBattleAnimEnemyMonIndex ^ 2]].oam.priority = priority; + if (IsAnimBankSpriteVisible(gBattleAnimBankTarget ^ 2)) { + gSprites[gBattleMonSprites[gBattleAnimBankTarget ^ 2]].oam.priority = priority; } - if (b_side_obj__get_some_boolean(gBattleAnimPlayerMonIndex ^ 2)) { - gSprites[gBattleMonSprites[gBattleAnimPlayerMonIndex ^ 2]].oam.priority = priority; + if (IsAnimBankSpriteVisible(gBattleAnimBankAttacker ^ 2)) { + gSprites[gBattleMonSprites[gBattleAnimBankAttacker ^ 2]].oam.priority = priority; } } void sub_8079E24() { int i; for (i = 0; i < gNoOfAllBanks; i++) { - if (b_side_obj__get_some_boolean(i)) { + if (IsAnimBankSpriteVisible(i)) { gSprites[gBattleMonSprites[i]].subpriority = sub_8079E90(i); gSprites[gBattleMonSprites[i]].oam.priority = 2; } @@ -1651,7 +1653,7 @@ void sub_8079E24() { u8 sub_8079E90(u8 slot) { u8 status; u8 ret; - if (IsContest()) { + if (NotInBattle()) { if (slot == 2) { return 30; } else { @@ -1674,7 +1676,7 @@ u8 sub_8079E90(u8 slot) { u8 sub_8079ED4(u8 slot) { u8 status = GetBankIdentity(slot); - if (IsContest()) { + if (NotInBattle()) { return 2; } if (status == 0 || status == 3) { @@ -1686,7 +1688,7 @@ u8 sub_8079ED4(u8 slot) { u8 GetBankIdentity_permutated(u8 slot) { u8 status; - if (!IsContest()) { + if (!NotInBattle()) { status = GetBankIdentity(slot); if (status == 0 || status == 3) { return 2; @@ -1706,7 +1708,7 @@ u8 sub_8079F44(u16 species, u8 isBackpic, u8 a3, s16 a4, s16 a5, u8 a6, u32 a7, u16 sheet = LoadSpriteSheet(&gUnknown_0837F5E0[a3]); u16 palette = AllocSpritePalette(gSpriteTemplate_837F5B0[a3].paletteTag); if (!isBackpic) { - LoadCompressedPalette(species_and_otid_get_pal(species, a8, a7), (palette * 0x10) + 0x100, 0x20); + LoadCompressedPalette(GetMonSpritePalFromOtIdPersonality(species, a8, a7), (palette * 0x10) + 0x100, 0x20); LoadSpecialPokePic( &gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, @@ -1719,7 +1721,7 @@ u8 sub_8079F44(u16 species, u8 isBackpic, u8 a3, s16 a4, s16 a5, u8 a6, u32 a7, ); } else { LoadCompressedPalette( - species_and_otid_get_pal(species, a8, a7), (palette * 0x10) + 0x100, 0x20); + GetMonSpritePalFromOtIdPersonality(species, a8, a7), (palette * 0x10) + 0x100, 0x20); LoadSpecialPokePic( &gMonBackPicTable[species], gMonBackPicCoords[species].coords, @@ -1742,7 +1744,7 @@ u8 sub_8079F44(u16 species, u8 isBackpic, u8 a3, s16 a4, s16 a5, u8 a6, u32 a7, } else { sprite = CreateSprite(&gSpriteTemplate_837F5B0[a3], a4, a5 + gMonBackPicCoords[species].y_offset, a6); } - if (IsContest()) { + if (NotInBattle()) { gSprites[sprite].affineAnims = &gSpriteAffineAnimTable_81E7C18; StartSpriteAffineAnim(&gSprites[sprite], 0); } @@ -1761,7 +1763,7 @@ int sub_807A100(u8 slot, u8 a2) { int ret; const struct MonCoords *coords; struct TransformStatus *transform; - if (IsContest()) { + if (NotInBattle()) { if (unk_2019348.field_4 & 1) { species = unk_2019348.field_2; personality = unk_2019348.field_10; @@ -1868,7 +1870,7 @@ void sub_807A3FC(u8 slot, u8 a2, s16 *a3, s16 *a4) { } v3 = sub_8077ABC(slot, v1); v4 = sub_8077ABC(slot, v2); - if (IsDoubleBattle() && !IsContest()) { + if (IsDoubleBattle() && !NotInBattle()) { v5 = sub_8077ABC(slot ^ 2, v1); v6 = sub_8077ABC(slot ^ 2, v2); } else { @@ -1892,7 +1894,7 @@ u8 sub_807A4A0(int a1, u8 sprite, int a3) { void sub_807A544(struct Sprite *sprite) { sub_8078650(sprite); - if (GetBankSide(gBattleAnimPlayerMonIndex)) { + if (GetBankSide(gBattleAnimBankAttacker)) { sprite->pos1.x -= gBattleAnimArgs[0]; gBattleAnimArgs[3] = -gBattleAnimArgs[3]; sprite->hFlip = TRUE; @@ -1904,12 +1906,12 @@ void sub_807A544(struct Sprite *sprite) { sprite->data1 = gBattleAnimArgs[3]; sprite->data3 = gBattleAnimArgs[4]; sprite->data5 = gBattleAnimArgs[5]; - oamt_set_x3A_32(sprite, move_anim_8074EE0); + StoreSpriteCallbackInData6(sprite, move_anim_8074EE0); sprite->callback = sub_8078504; } void sub_807A5C4(struct Sprite *sprite) { - if (GetBankSide(gBattleAnimPlayerMonIndex)) { + if (GetBankSide(gBattleAnimBankAttacker)) { sprite->pos1.x -= gBattleAnimArgs[0]; gBattleAnimArgs[3] *= -1; } else { @@ -1921,28 +1923,28 @@ void sub_807A5C4(struct Sprite *sprite) { sprite->data3 = gBattleAnimArgs[4]; sprite->data5 = gBattleAnimArgs[5]; StartSpriteAnim(sprite, gBattleAnimArgs[6]); - oamt_set_x3A_32(sprite, move_anim_8074EE0); + StoreSpriteCallbackInData6(sprite, move_anim_8074EE0); sprite->callback = sub_8078504; } void sub_807A63C(struct Sprite *sprite) { sub_8078650(sprite); - if (GetBankSide(gBattleAnimPlayerMonIndex)) { + if (GetBankSide(gBattleAnimBankAttacker)) { sprite->pos1.x -= gBattleAnimArgs[0]; } else { sprite->pos1.x += gBattleAnimArgs[0]; } sprite->pos1.y += gBattleAnimArgs[1]; sprite->callback = sub_8078600; - oamt_set_x3A_32(sprite, move_anim_8072740); + StoreSpriteCallbackInData6(sprite, move_anim_8072740); } void sub_807A69C(u8 taskId) { u16 src; u16 dest; struct Task *task = &gTasks[taskId]; - task->data[0] = obj_id_for_side_relative_to_move(0); - task->data[1] = (GetBankSide(gBattleAnimPlayerMonIndex)) ? -8 : 8; + task->data[0] = GetAnimBankSpriteId(0); + task->data[1] = (GetBankSide(gBattleAnimBankAttacker)) ? -8 : 8; task->data[2] = 0; task->data[3] = 0; gSprites[task->data[0]].pos2.x -= task->data[0]; @@ -1951,7 +1953,7 @@ void sub_807A69C(u8 taskId) { dest = (task->data[4] + 0x10) * 0x10; src = (gSprites[task->data[0]].oam.paletteNum + 0x10) * 0x10; - task->data[6] = sub_8079E90(gBattleAnimPlayerMonIndex); + task->data[6] = sub_8079E90(gBattleAnimBankAttacker); if (task->data[6] == 20 || task->data[6] == 40) { task->data[6] = 2; } else { @@ -2012,9 +2014,9 @@ void sub_807A8D4(struct Sprite *sprite) { } void sub_807A908(struct Sprite *sprite) { - sprite->pos1.x = sub_8077ABC(gBattleAnimPlayerMonIndex, 2); - sprite->pos1.y = sub_8077ABC(gBattleAnimPlayerMonIndex, 3); - if (!GetBankSide(gBattleAnimPlayerMonIndex)) { + sprite->pos1.x = sub_8077ABC(gBattleAnimBankAttacker, 2); + sprite->pos1.y = sub_8077ABC(gBattleAnimBankAttacker, 3); + if (!GetBankSide(gBattleAnimBankAttacker)) { sprite->data0 = 5; } else { sprite->data0 = -10; @@ -2041,7 +2043,7 @@ void sub_807A9BC(struct Sprite *sprite) { sprite->data0 = gBattleAnimArgs[2]; sprite->data2 = sprite->pos1.x + gBattleAnimArgs[4]; sprite->data4 = sprite->pos1.y + gBattleAnimArgs[5]; - if (!GetBankSide(gBattleAnimEnemyMonIndex)) { + if (!GetBankSide(gBattleAnimBankTarget)) { x = (u16)gBattleAnimArgs[4] + 30; sprite->pos1.x += x; sprite->pos1.y = gBattleAnimArgs[5] - 20; @@ -2051,5 +2053,5 @@ void sub_807A9BC(struct Sprite *sprite) { sprite->pos1.y = gBattleAnimArgs[5] - 80; } sprite->callback = sub_8078B34; - oamt_set_x3A_32(sprite, move_anim_8072740); + StoreSpriteCallbackInData6(sprite, move_anim_8072740); } diff --git a/src/berry_blender.c b/src/scene/berry_blender.c index 455aabc45..7ffcc5185 100644 --- a/src/berry_blender.c +++ b/src/scene/berry_blender.c @@ -828,7 +828,7 @@ static bool8 sub_804E2EC(void) switch (gBerryBlenderData->field_1) { case 0: - sub_800D238(gUnknown_08E6C100, &ewram[0x10000]); + LZDecompressWram(gUnknown_08E6C100, &ewram[0x10000]); gBerryBlenderData->field_1++; break; case 1: @@ -862,11 +862,11 @@ static bool8 sub_804E2EC(void) } break; case 3: - sub_800D238(gUnknown_08E6C920, &ewram[0x10000]); + LZDecompressWram(gUnknown_08E6C920, &ewram[0x10000]); gBerryBlenderData->field_1++; break; case 4: - sub_800D238(gUnknown_08E6D354, &ewram[0x13000]); + LZDecompressWram(gUnknown_08E6D354, &ewram[0x13000]); gBerryBlenderData->field_1++; break; case 5: diff --git a/src/contest_painting.c b/src/scene/contest_painting.c index 391cbdfaa..3662efdec 100644 --- a/src/contest_painting.c +++ b/src/scene/contest_painting.c @@ -353,7 +353,7 @@ static void sub_8106AC4(u16 species, u8 arg1) void *pal; // Unsure what gUnknown_03005E8C->var0 is supposed to be. - pal = species_and_otid_get_pal(species, gUnknown_03005E8C->var4, gUnknown_03005E8C->var0); + pal = GetMonSpritePalFromOtIdPersonality(species, gUnknown_03005E8C->var4, gUnknown_03005E8C->var0); LZDecompressVram(pal, gUnknown_03005E90); if (arg1 == 1) @@ -402,7 +402,7 @@ static void sub_8106AC4(u16 arg0, u8 arg2) ldr r1, [r0, 0x4]\n\ ldr r2, [r0]\n\ adds r0, r6, 0\n\ - bl species_and_otid_get_pal\n\ + bl GetMonSpritePalFromOtIdPersonality\n\ ldr r1, _08106B2C @ =gUnknown_03005E90\n\ mov r8, r1\n\ ldr r1, [r1]\n\ diff --git a/src/credits.c b/src/scene/credits.c index df70674b6..cf10137c1 100644 --- a/src/credits.c +++ b/src/scene/credits.c @@ -1387,7 +1387,7 @@ static u8 sub_81456B4(u16 species, u16 x, u16 y, u16 position) 1 ); - lzPaletteData = species_and_otid_get_pal(species, 0, 0xFFFF); + lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, 0, 0xFFFF); LoadCompressedPalette(lzPaletteData, 0x100 + (position * 16), 0x20); sub_8143648(position, position); @@ -1433,7 +1433,7 @@ static void sub_81458DC(void) for (dexNum = 1, seenTypesCount = 0; dexNum < 386; dexNum++) { - if (GetNationalPokedexFlag(dexNum, 1)) + if (GetSetPokedexFlag(dexNum, 1)) { unk201C000->unk90[seenTypesCount] = dexNum; seenTypesCount++; diff --git a/src/cute_sketch.c b/src/scene/cute_sketch.c index 5317bc334..5317bc334 100644 --- a/src/cute_sketch.c +++ b/src/scene/cute_sketch.c diff --git a/src/egg_hatch.c b/src/scene/egg_hatch.c index 90d1ee039..032dcd284 100644 --- a/src/egg_hatch.c +++ b/src/scene/egg_hatch.c @@ -19,6 +19,7 @@ #include "naming_screen.h" #include "trig.h" #include "rng.h" +#include "trade.h" extern u8 ewram[]; extern struct SpriteTemplate gUnknown_02024E8C; @@ -40,18 +41,15 @@ struct EggHatchData* gEggHatchData; extern const u32 gUnknown_08D00000[]; extern const u32 gUnknown_08D00524[]; -extern const u32 gUnknown_0820CA98[]; -extern const u32 gUnknown_0820F798[]; extern const u16 gUnknown_08D004E0[]; //palette -extern const u16 gUnknown_0820C9F8[]; //palette extern const struct SpriteSheet sUnknown_0820A3B0; extern const struct SpriteSheet sUnknown_0820A3B8; extern const struct SpritePalette sUnknown_0820A3C0; -bool8 GetNationalPokedexFlag(u16 nationalNum, u8 caseID); +bool8 GetSetPokedexFlag(u16 nationalNum, u8 caseID); u8* GetMonNick(struct Pokemon* mon, u8* dst); u8 sav1_map_get_name(void); -const struct CompressedSpritePalette* sub_8040990(struct Pokemon* mon); //gets pokemon palette address +const struct CompressedSpritePalette* GetMonSpritePalStruct(struct Pokemon* mon); //gets pokemon palette address void sub_8080990(void); static void Task_EggHatch(u8 taskID); @@ -289,8 +287,8 @@ static void AddHatchedMonToParty(u8 id) SetMonData(mon, MON_DATA_NICKNAME, name); pokeNum = SpeciesToNationalPokedexNum(pokeNum); - GetNationalPokedexFlag(pokeNum, 2); - GetNationalPokedexFlag(pokeNum, 3); + GetSetPokedexFlag(pokeNum, 2); + GetSetPokedexFlag(pokeNum, 3); GetMonNick(mon, gStringVar1); @@ -419,11 +417,11 @@ static u8 EggHatchCreateMonSprite(u8 a0, u8 switchID, u8 pokeID) u16 species = GetMonData(mon, MON_DATA_SPECIES); u32 pid = GetMonData(mon, MON_DATA_PERSONALITY); HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset,(u32)(&ewram[0]), gUnknown_081FAF4C[2 * a0 + 1], species, pid); - LoadCompressedObjectPalette(sub_8040990(mon)); + LoadCompressedObjectPalette(GetMonSpritePalStruct(mon)); } break; case 1: - GetMonSpriteTemplate_803C56C(sub_8040990(mon)->tag, r5); + GetMonSpriteTemplate_803C56C(GetMonSpritePalStruct(mon)->tag, r5); spriteID = CreateSprite(&gUnknown_02024E8C, 120, 70, 6); gSprites[spriteID].invisible = 1; gSprites[spriteID].callback = SpriteCallbackDummy; @@ -512,7 +510,7 @@ static void CB2_EggHatch_0(void) u32 size; REG_BG2CNT = 0x4C06; - LoadPalette(&gUnknown_0820C9F8, 0x10, 0xA0); + LoadPalette(gUnknown_0820C9F8, 0x10, 0xA0); offsetRead = (u32)(&gUnknown_0820CA98); offsetWrite = (VRAM + 0x4000); diff --git a/src/evolution_graphics.c b/src/scene/evolution_graphics.c index 1fd5bf8fa..1fd5bf8fa 100644 --- a/src/evolution_graphics.c +++ b/src/scene/evolution_graphics.c diff --git a/src/evolution_scene.c b/src/scene/evolution_scene.c index e312b081f..24168dc56 100644 --- a/src/evolution_scene.c +++ b/src/scene/evolution_scene.c @@ -236,7 +236,7 @@ void EvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, bool8 canStopEvo, gMonFrontPicCoords[currSpecies].y_offset, (void*)(0x2000000), gUnknown_081FAF4C[1], currSpecies); - pokePal = (void*) sub_80409C8(currSpecies, TiD, PiD); + pokePal = (void*) GetMonSpritePalStructFromOtIdPersonality(currSpecies, TiD, PiD); LoadCompressedPalette(*pokePal, 0x110, 0x20); GetMonSpriteTemplate_803C56C(currSpecies, 1); @@ -253,7 +253,7 @@ void EvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, bool8 canStopEvo, gMonFrontPicCoords[speciesToEvolve].y_offset, (void*)(0x2000000), gUnknown_081FAF4C[3], speciesToEvolve); - pokePal = (void*) sub_80409C8(speciesToEvolve, TiD, PiD); + pokePal = (void*) GetMonSpritePalStructFromOtIdPersonality(speciesToEvolve, TiD, PiD); LoadCompressedPalette(*pokePal, 0x120, 0x20); GetMonSpriteTemplate_803C56C(speciesToEvolve, 3); @@ -333,7 +333,7 @@ static void CB2_EvolutionSceneLoadGraphics(void) gMonFrontPicCoords[postEvoSpecies].y_offset, (void*)(0x2000000), gUnknown_081FAF4C[3], postEvoSpecies); - pokePal = (void*) sub_80409C8(postEvoSpecies, TiD, PiD); + pokePal = (void*) GetMonSpritePalStructFromOtIdPersonality(postEvoSpecies, TiD, PiD); LoadCompressedPalette(*pokePal, 0x120, 0x20); GetMonSpriteTemplate_803C56C(postEvoSpecies, 3); @@ -376,13 +376,13 @@ static void CB2_TradeEvolutionSceneLoadGraphics(void) break; case 1: SetUpWindowConfig(&gWindowConfig_81E6F84); - InitWindowFromConfig(&gUnknown_03004828->field_4, &gWindowConfig_81E6F84); + InitWindowFromConfig(&gUnknown_03004828->window, &gWindowConfig_81E6F84); gMain.state++; break; case 2: - LoadTextWindowGraphics(&gUnknown_03004828->field_4); - gUnknown_03004828->field_34 = SetTextWindowBaseTileNum(2); - LoadTextWindowGraphics(&gUnknown_03004828->field_4); + LoadTextWindowGraphics(&gUnknown_03004828->window); + gUnknown_03004828->textWindowBaseTileNum = SetTextWindowBaseTileNum(2); + LoadTextWindowGraphics(&gUnknown_03004828->window); MenuZeroFillScreen(); ResetPaletteFade(); gMain.state++; @@ -403,7 +403,7 @@ static void CB2_TradeEvolutionSceneLoadGraphics(void) gMonFrontPicCoords[postEvoSpecies].y_offset, (void*)(0x2000000), gUnknown_081FAF4C[3], postEvoSpecies); - pokePal = (void*) sub_80409C8(postEvoSpecies, TiD, PiD); + pokePal = (void*) GetMonSpritePalStructFromOtIdPersonality(postEvoSpecies, TiD, PiD); LoadCompressedPalette(*pokePal, 0x120, 0x20); gMain.state++; } @@ -453,7 +453,7 @@ void TradeEvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, u8 preEvoSpri gMonFrontPicCoords[speciesToEvolve].y_offset, (void*)(0x2000000), gUnknown_081FAF4C[1], speciesToEvolve); - pokePal = (void*) sub_80409C8(speciesToEvolve, TiD, PiD); + pokePal = (void*) GetMonSpritePalStructFromOtIdPersonality(speciesToEvolve, TiD, PiD); LoadCompressedPalette(*pokePal, 0x120, 0x20); GetMonSpriteTemplate_803C56C(speciesToEvolve, 1); @@ -492,7 +492,7 @@ static void CB2_TradeEvolutionSceneUpdate(void) { AnimateSprites(); BuildOamBuffer(); - sub_80035AC(&gUnknown_03004828->field_4); + sub_80035AC(&gUnknown_03004828->window); UpdatePaletteFade(); RunTasks(); } @@ -527,8 +527,8 @@ static void CreateShedinja(u16 preEvoSpecies, struct Pokemon* mon) // can't match it otherwise, ehh EvoTable = gEvolutionTable; Evos = EvoTable + preEvoSpecies; - GetNationalPokedexFlag(SpeciesToNationalPokedexNum(Evos->evolutions[1].targetSpecies), 2); - GetNationalPokedexFlag(SpeciesToNationalPokedexNum(Evos->evolutions[1].targetSpecies), 3); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(Evos->evolutions[1].targetSpecies), 2); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(Evos->evolutions[1].targetSpecies), 3); if (GetMonData(Shedinja, MON_DATA_SPECIES) == SPECIES_SHEDINJA && GetMonData(Shedinja, MON_DATA_LANGUAGE) == LANGUAGE_JAPANESE @@ -654,8 +654,8 @@ static void Task_EvolutionScene(u8 taskID) SetMonData(mon, MON_DATA_SPECIES, (void*)(&gTasks[taskID].tPostEvoSpecies)); CalculateMonStats(mon); EvolutionRenameMon(mon, gTasks[taskID].tPreEvoSpecies, gTasks[taskID].tPostEvoSpecies); - GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskID].tPostEvoSpecies), 2); - GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskID].tPostEvoSpecies), 3); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskID].tPostEvoSpecies), 2); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskID].tPostEvoSpecies), 3); IncrementGameStat(14); } break; @@ -667,7 +667,7 @@ static void Task_EvolutionScene(u8 taskID) { u8 text[20]; - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); gTasks[taskID].tBits |= TASK_BIT_LEARN_MOVE; gTasks[taskID].tLearnsFirstMove = FALSE; gTasks[taskID].tLearnMoveState = 0; @@ -691,7 +691,7 @@ static void Task_EvolutionScene(u8 taskID) if (!gPaletteFade.active) { if (!(gTasks[taskID].tBits & TASK_BIT_LEARN_MOVE)) - sub_8053E90(); + Overworld_PlaySpecialMapMusic(); if (!gTasks[taskID].tEvoWasStopped) CreateShedinja(gTasks[taskID].tPreEvoSpecies, mon); DestroyTask(taskID); @@ -902,11 +902,11 @@ static void Task_TradeEvolutionScene(u8 taskID) { case 0: StringExpandPlaceholders(gStringVar4, gUnknown_08400C4A); - sub_8002EB0(&gUnknown_03004828->field_4, gStringVar4, gUnknown_03004828->field_34, 2, 15); + sub_8002EB0(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); gTasks[taskID].tState++; break; case 1: - if (gUnknown_03004828->field_4.state == 0) + if (gUnknown_03004828->window.state == 0) { PlayCry1(gTasks[taskID].tPreEvoSpecies, 0); gTasks[taskID].tState++; @@ -990,19 +990,19 @@ static void Task_TradeEvolutionScene(u8 taskID) if (IsCryFinished() && !gPaletteFade.active) { StringExpandPlaceholders(gStringVar4, gUnknown_08400C60); - sub_8002EB0(&gUnknown_03004828->field_4, gStringVar4, gUnknown_03004828->field_34, 2, 15); + sub_8002EB0(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15); PlayFanfare(BGM_FANFA5); gTasks[taskID].tState++; SetMonData(mon, MON_DATA_SPECIES, (void*)(&gTasks[taskID].tPostEvoSpecies)); CalculateMonStats(mon); EvolutionRenameMon(mon, gTasks[taskID].tPreEvoSpecies, gTasks[taskID].tPostEvoSpecies); - GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskID].tPostEvoSpecies), 2); - GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskID].tPostEvoSpecies), 3); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskID].tPostEvoSpecies), 2); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskID].tPostEvoSpecies), 3); IncrementGameStat(14); } break; case 13: - if (gUnknown_03004828->field_4.state == 0 && IsFanfareTaskInactive() == TRUE) + if (gUnknown_03004828->window.state == 0 && IsFanfareTaskInactive() == TRUE) { var = MonTryLearningNewMove(mon, gTasks[taskID].tLearnsFirstMove); if (var != 0 && !gTasks[taskID].tEvoWasStopped) @@ -1024,71 +1024,71 @@ static void Task_TradeEvolutionScene(u8 taskID) else { PlayBGM(BGM_SHINKA); - sub_8002EB0(&gUnknown_03004828->field_4, gOtherText_LinkStandby2, gUnknown_03004828->field_34, 2, 15); + sub_8002EB0(&gUnknown_03004828->window, gOtherText_LinkStandby2, gUnknown_03004828->textWindowBaseTileNum, 2, 15); gTasks[taskID].tState++; } } break; case 14: - if (gUnknown_03004828->field_4.state == 0) + if (gUnknown_03004828->window.state == 0) { DestroyTask(taskID); SetMainCallback2(gCB2_AfterEvolution); } break; case 15: - if (gUnknown_03004828->field_4.state == 0 && !IsSEPlaying()) + if (gUnknown_03004828->window.state == 0 && !IsSEPlaying()) { sub_8024CEC(); PlayFanfare(BGM_FANFA1); StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[3]); - sub_8002EB0(&gUnknown_03004828->field_4, gDisplayedStringBattle, gUnknown_03004828->field_34, 2, 15); + sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); gTasks[taskID].tLearnsFirstMove = 0x40; // re-used as a counter gTasks[taskID].tState++; } break; case 16: - if (gUnknown_03004828->field_4.state == 0 && IsFanfareTaskInactive() == TRUE && --gTasks[taskID].tLearnsFirstMove == 0) + if (gUnknown_03004828->window.state == 0 && IsFanfareTaskInactive() == TRUE && --gTasks[taskID].tLearnsFirstMove == 0) gTasks[taskID].tState = 13; break; case 17: switch (gTasks[taskID].tLearnMoveState) { case 0: - if (gUnknown_03004828->field_4.state == 0 && !IsSEPlaying()) + if (gUnknown_03004828->window.state == 0 && !IsSEPlaying()) { sub_8024CEC(); StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[4]); - sub_8002EB0(&gUnknown_03004828->field_4, gDisplayedStringBattle, gUnknown_03004828->field_34, 2, 15); + sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); gTasks[taskID].tLearnMoveState++; } break; case 1: - if (gUnknown_03004828->field_4.state == 0 && !IsSEPlaying()) + if (gUnknown_03004828->window.state == 0 && !IsSEPlaying()) { StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[5]); - sub_8002EB0(&gUnknown_03004828->field_4, gDisplayedStringBattle, gUnknown_03004828->field_34, 2, 15); + sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); gTasks[taskID].tLearnMoveState++; } break; case 2: - if (gUnknown_03004828->field_4.state != 0) + if (gUnknown_03004828->window.state != 0) break; if (!IsSEPlaying()) { StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[6]); - sub_8002EB0(&gUnknown_03004828->field_4, gDisplayedStringBattle, gUnknown_03004828->field_34, 2, 15); + sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); gTasks[taskID].tData9 = 5; gTasks[taskID].tData10 = 9; gTasks[taskID].tLearnMoveState++; } case 3: - if (gUnknown_03004828->field_4.state == 0 && !IsSEPlaying()) + if (gUnknown_03004828->window.state == 0 && !IsSEPlaying()) { - DrawTextWindow(&gUnknown_03004828->field_4, 24, 8, 29, 13); + DrawTextWindow(&gUnknown_03004828->window, 24, 8, 29, 13); sEvoCursorPos = 0; - InitWindow(&gUnknown_03004828->field_4, gOtherText_YesNoAndPlayer, gUnknown_03004828->field_34 + 128, 25, 9); - sub_8002F44(&gUnknown_03004828->field_4); + InitWindow(&gUnknown_03004828->window, gOtherText_YesNoAndPlayer, gUnknown_03004828->textWindowBaseTileNum + 128, 25, 9); + sub_8002F44(&gUnknown_03004828->window); sub_814A5C0(0, 0xFFFF, 0xC, 0x2D9F, 0x20); sub_81150D8(); gTasks[taskID].tLearnMoveState++; @@ -1112,10 +1112,10 @@ static void Task_TradeEvolutionScene(u8 taskID) } if (gMain.newKeys & A_BUTTON) { - ZeroFillWindowRect(&gUnknown_03004828->field_4, 0x18, 8, 0x1D, 0xD); + ZeroFillWindowRect(&gUnknown_03004828->window, 0x18, 8, 0x1D, 0xD); DestroyMenuCursor(); StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[292]); - sub_8002EB0(&gUnknown_03004828->field_4, gDisplayedStringBattle, gUnknown_03004828->field_34, 2, 15); + sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); PlaySE(SE_SELECT); if (sEvoCursorPos != 0) gTasks[taskID].tLearnMoveState = gTasks[taskID].tData10; @@ -1128,10 +1128,10 @@ static void Task_TradeEvolutionScene(u8 taskID) } if (gMain.newKeys & B_BUTTON) { - ZeroFillWindowRect(&gUnknown_03004828->field_4, 0x18, 8, 0x1D, 0xD); + ZeroFillWindowRect(&gUnknown_03004828->window, 0x18, 8, 0x1D, 0xD); DestroyMenuCursor(); StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[292]); - sub_8002EB0(&gUnknown_03004828->field_4, gDisplayedStringBattle, gUnknown_03004828->field_34, 2, 15); + sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); PlaySE(SE_SELECT); gTasks[taskID].tLearnMoveState = gTasks[taskID].tData10; } @@ -1157,7 +1157,7 @@ static void Task_TradeEvolutionScene(u8 taskID) if (IsHMMove2(move)) { StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[307]); - sub_8002EB0(&gUnknown_03004828->field_4, gDisplayedStringBattle, gUnknown_03004828->field_34, 2, 15); + sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); gTasks[taskID].tLearnMoveState = 11; } else @@ -1170,42 +1170,42 @@ static void Task_TradeEvolutionScene(u8 taskID) RemoveMonPPBonus(mon, var); SetMonMoveSlot(mon, gMoveToLearn, var); StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[207]); - sub_8002EB0(&gUnknown_03004828->field_4, gDisplayedStringBattle, gUnknown_03004828->field_34, 2, 15); + sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); gTasks[taskID].tLearnMoveState++; } } } break; case 7: - if (gUnknown_03004828->field_4.state == 0 && !IsSEPlaying()) + if (gUnknown_03004828->window.state == 0 && !IsSEPlaying()) { StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[7]); - sub_8002EB0(&gUnknown_03004828->field_4, gDisplayedStringBattle, gUnknown_03004828->field_34, 2, 15); + sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); gTasks[taskID].tLearnMoveState++; } break; case 8: - if (gUnknown_03004828->field_4.state == 0 && !IsSEPlaying()) + if (gUnknown_03004828->window.state == 0 && !IsSEPlaying()) { StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[208]); - sub_8002EB0(&gUnknown_03004828->field_4, gDisplayedStringBattle, gUnknown_03004828->field_34, 2, 15); + sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); gTasks[taskID].tState = 15; } break; case 9: StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[8]); - sub_8002EB0(&gUnknown_03004828->field_4, gDisplayedStringBattle, gUnknown_03004828->field_34, 2, 15); + sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); gTasks[taskID].tData9 = 10; gTasks[taskID].tData10 = 0; gTasks[taskID].tLearnMoveState = 3; break; case 10: StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[9]); - sub_8002EB0(&gUnknown_03004828->field_4, gDisplayedStringBattle, gUnknown_03004828->field_34, 2, 15); + sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15); gTasks[taskID].tState = 13; break; case 11: - if (gUnknown_03004828->field_4.state == 0 && !IsSEPlaying()) + if (gUnknown_03004828->window.state == 0 && !IsSEPlaying()) gTasks[taskID].tLearnMoveState = 5; break; } diff --git a/src/hall_of_fame.c b/src/scene/hall_of_fame.c index 10c999ef3..6f7df576b 100644 --- a/src/hall_of_fame.c +++ b/src/scene/hall_of_fame.c @@ -1347,7 +1347,7 @@ static u32 HallOfFame_LoadPokemonPic(u16 species, s16 posX, s16 posY, u16 pokeID LoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, 0x2000000, gUnknown_0840B5A0[pokeID], species, pid, 1); - pokePal = species_and_otid_get_pal(species, tid, pid); + pokePal = GetMonSpritePalFromOtIdPersonality(species, tid, pid); LoadCompressedPalette(pokePal, 16 * pokeID + 256, 0x20); sub_8143648(pokeID, pokeID); diff --git a/src/intro.c b/src/scene/intro.c index a43e0356c..a6dd23c92 100644 --- a/src/intro.c +++ b/src/scene/intro.c @@ -768,7 +768,7 @@ const struct SpritePalette gIntro3MiscPal_Table[] = const u32 unusedData = 0x02000000; static void MainCB2_EndIntro(void); -static void Task_IntroLoadPart1Graphics(u8); +void Task_IntroLoadPart1Graphics(u8); static void Task_IntroFadeIn(u8); static void Task_IntroWaterDrops(u8); static void Task_IntroScrollDownAndShowEon(u8); @@ -938,7 +938,7 @@ void CB2_InitCopyrightScreenAfterTitleScreen(void) SetUpCopyrightScreen(); } -static void Task_IntroLoadPart1Graphics(u8 taskId) +void Task_IntroLoadPart1Graphics(u8 taskId) { SetVBlankCallback(NULL); gUnknown_02039318 = Random() & 1; @@ -1785,7 +1785,7 @@ static u16 sub_813CE88(u16 species, s16 x, s16 y, u16 d, u8 front) LoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, 0x2000000, gUnknown_0840B5A0[d], species, 0, 1); else LoadSpecialPokePic(&gMonBackPicTable[species], gMonBackPicCoords[species].coords, gMonBackPicCoords[species].y_offset, 0x2000000, gUnknown_0840B5A0[d], species, 0, 0); - lzPaletteData = species_and_otid_get_pal(species, 0, 0xFFFF); + lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, 0, 0xFFFF); LoadCompressedPalette(lzPaletteData, 0x100 + d * 0x10, 0x20); sub_8143648(d, d); spriteId = CreateSprite(&gUnknown_02024E8C, x, y, (d + 1) * 4); diff --git a/src/intro_credits_graphics.c b/src/scene/intro_credits_graphics.c index cd0589af8..cd0589af8 100755 --- a/src/intro_credits_graphics.c +++ b/src/scene/intro_credits_graphics.c diff --git a/src/new_game.c b/src/scene/new_game.c index 3f9e9f5a1..b15282960 100644 --- a/src/new_game.c +++ b/src/scene/new_game.c @@ -92,14 +92,14 @@ void sub_8052DA8(void) gSaveBlock1.sbStruct.unkSB1.sb1_2EFC_struct[i] = gUnknown_08216604; } -void sub_8052DE4(void) +void ZeroBattleTowerData(void) { - CpuFill32(0, &gSaveBlock2.filler_A8, sizeof(gSaveBlock2.filler_A8)); + CpuFill32(0, &gSaveBlock2.battleTower, sizeof(gSaveBlock2.battleTower)); } void WarpToTruck(void) { - warp1_set(25, 40, -1, -1, -1); // inside of truck + Overworld_SetWarpDestination(25, 40, -1, -1, -1); // inside of truck warp_in(); } @@ -127,7 +127,7 @@ void NewGameInitData(void) ZeroPlayerPartyMons(); ZeroEnemyPartyMons(); ResetPokedex(); - sub_8052DE4(); + ZeroBattleTowerData(); memset(&gSaveBlock1, 0, sizeof(gSaveBlock1)); ClearMailData(); gSaveBlock2.specialSaveWarp = 0; diff --git a/src/title_screen.c b/src/scene/title_screen.c index 2503b0654..2503b0654 100644 --- a/src/title_screen.c +++ b/src/scene/title_screen.c diff --git a/src/script_pokemon_util_80C4BF0.c b/src/script_pokemon_util_80C4BF0.c index 323df991a..f98293a90 100644 --- a/src/script_pokemon_util_80C4BF0.c +++ b/src/script_pokemon_util_80C4BF0.c @@ -433,7 +433,7 @@ void ShowContestEntryMonPic(void) gUnknown_081FAF4C[1], species, var1); - palette = sub_80409C8(species, var2, var1); + palette = GetMonSpritePalStructFromOtIdPersonality(species, var2, var1); LoadCompressedObjectPalette(palette); GetMonSpriteTemplate_803C56C(species, 1); gUnknown_02024E8C.paletteTag = palette->tag; @@ -560,8 +560,8 @@ u8 ScriptGiveMon(u16 species, u8 level, u16 item, u32 unused1, u32 unused2, u8 u { case 0: case 1: - GetNationalPokedexFlag(nationalDexNum, 2); - GetNationalPokedexFlag(nationalDexNum, 3); + GetSetPokedexFlag(nationalDexNum, 2); + GetSetPokedexFlag(nationalDexNum, 3); break; } return sentToPc; diff --git a/src/script_pokemon_util_80F99CC.c b/src/script_pokemon_util_80F99CC.c index f930df8e2..e303d5173 100644 --- a/src/script_pokemon_util_80F99CC.c +++ b/src/script_pokemon_util_80F99CC.c @@ -31,8 +31,8 @@ void sub_80F99CC(void) u8 taskId; ScriptContext2_Enable(); - taskId = CreateTask((void *)sub_80F9A8C, 0xA); - gTasks[taskId].data[0] = 2; + taskId = CreateTask((void *)OpenPartyMenuFromScriptContext, 0xA); + gTasks[taskId].data[0] = PARTY_MENU_TYPE_CONTEST; BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); } @@ -41,8 +41,8 @@ void sub_80F9A0C(void) u8 taskId; ScriptContext2_Enable(); - taskId = CreateTask((void *)sub_80F9A8C, 0xA); - gTasks[taskId].data[0] = 3; + taskId = CreateTask((void *)OpenPartyMenuFromScriptContext, 0xA); + gTasks[taskId].data[0] = PARTY_MENU_TYPE_IN_GAME_TRADE; BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); } @@ -51,12 +51,12 @@ void sub_80F9A4C(void) u8 taskId; ScriptContext2_Enable(); - taskId = CreateTask((void *)sub_80F9A8C, 0xA); - gTasks[taskId].data[0] = 7; + taskId = CreateTask((void *)OpenPartyMenuFromScriptContext, 0xA); + gTasks[taskId].data[0] = PARTY_MENU_TYPE_MOVE_TUTOR; BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); } -void sub_80F9A8C(u8 taskId) +void OpenPartyMenuFromScriptContext(u8 taskId) { if (!gPaletteFade.active) { @@ -66,64 +66,64 @@ void sub_80F9A8C(u8 taskId) } } -bool8 sub_80F9ACC(void) +bool8 SetupContestPartyMenu(void) { - switch (EWRAM_1B000.unk264) + switch (EWRAM_1B000.setupState) { case 0: - if (EWRAM_1B000.unk266 < gPlayerPartyCount) + if (EWRAM_1B000.monIndex < gPlayerPartyCount) { - TryCreatePartyMenuMonIcon(EWRAM_1B000.unk260, EWRAM_1B000.unk266, &gPlayerParty[EWRAM_1B000.unk266]); - EWRAM_1B000.unk266++; + TryCreatePartyMenuMonIcon(EWRAM_1B000.menuHandlerTaskId, EWRAM_1B000.monIndex, &gPlayerParty[EWRAM_1B000.monIndex]); + EWRAM_1B000.monIndex++; } else { - EWRAM_1B000.unk266 = 0; - EWRAM_1B000.unk264++; + EWRAM_1B000.monIndex = 0; + EWRAM_1B000.setupState++; } break; case 1: LoadHeldItemIconGraphics(); - EWRAM_1B000.unk264++; + EWRAM_1B000.setupState++; break; case 2: - CreateHeldItemIcons_806DC34(EWRAM_1B000.unk260); - EWRAM_1B000.unk264++; + CreateHeldItemIcons_806DC34(EWRAM_1B000.menuHandlerTaskId); + EWRAM_1B000.setupState++; break; case 3: - if (sub_806BD58(EWRAM_1B000.unk260, EWRAM_1B000.unk266) != 1) + if (sub_806BD58(EWRAM_1B000.menuHandlerTaskId, EWRAM_1B000.monIndex) != 1) { - EWRAM_1B000.unk266++; + EWRAM_1B000.monIndex++; break; } else { - EWRAM_1B000.unk266 = 0; - EWRAM_1B000.unk264++; + EWRAM_1B000.monIndex = 0; + EWRAM_1B000.setupState++; break; } case 4: PartyMenuPrintMonsLevelOrStatus(); - EWRAM_1B000.unk264++; + EWRAM_1B000.setupState++; break; case 5: PrintPartyMenuMonNicknames(); - EWRAM_1B000.unk264++; + EWRAM_1B000.setupState++; break; case 6: sub_80F9C00(); - EWRAM_1B000.unk264++; + EWRAM_1B000.setupState++; break; case 7: // the only case that can return true. - if (sub_806B58C(EWRAM_1B000.unk266) != 1) + if (DrawPartyMonBackground(EWRAM_1B000.monIndex) != 1) { - EWRAM_1B000.unk266++; + EWRAM_1B000.monIndex++; break; } else { - EWRAM_1B000.unk266 = 0; - EWRAM_1B000.unk264 = 0; + EWRAM_1B000.monIndex = 0; + EWRAM_1B000.setupState = 0; return TRUE; } } @@ -151,19 +151,19 @@ void sub_80F9C00(void) } } -void sub_80F9C6C(u8 var) +void HandleSelectPartyMenu(u8 var) { if (!gPaletteFade.active) { - switch (sub_806BD80(var)) + switch (HandleDefaultPartyMenuInput(var)) { - case 1: + case A_BUTTON: PlaySE(SE_SELECT); gUnknown_02038694 = sub_806CA38(var); gSpecialVar_0x8004 = gUnknown_02038694; sub_8123138(var); break; - case 2: + case B_BUTTON: PlaySE(SE_SELECT); gUnknown_02038694 = 0xFF; gSpecialVar_0x8004 = 0xFF; @@ -173,67 +173,66 @@ void sub_80F9C6C(u8 var) } } -bool8 sub_80F9CE8(void) // this is the same function as sub_80F9ACC except case 6 calls a different function. why +bool8 SetupMoveTutorPartyMenu(void) { - switch (EWRAM_1B000.unk264) + switch (EWRAM_1B000.setupState) { case 0: - if (EWRAM_1B000.unk266 < gPlayerPartyCount) + if (EWRAM_1B000.monIndex < gPlayerPartyCount) { - TryCreatePartyMenuMonIcon(EWRAM_1B000.unk260, EWRAM_1B000.unk266, &gPlayerParty[EWRAM_1B000.unk266]); - EWRAM_1B000.unk266++; + TryCreatePartyMenuMonIcon(EWRAM_1B000.menuHandlerTaskId, EWRAM_1B000.monIndex, &gPlayerParty[EWRAM_1B000.monIndex]); + EWRAM_1B000.monIndex++; } else { - EWRAM_1B000.unk266 = 0; - EWRAM_1B000.unk264++; + EWRAM_1B000.monIndex = 0; + EWRAM_1B000.setupState++; } break; case 1: LoadHeldItemIconGraphics(); - EWRAM_1B000.unk264++; + EWRAM_1B000.setupState++; break; case 2: - CreateHeldItemIcons_806DC34(EWRAM_1B000.unk260); - EWRAM_1B000.unk264++; + CreateHeldItemIcons_806DC34(EWRAM_1B000.menuHandlerTaskId); + EWRAM_1B000.setupState++; break; case 3: - if (sub_806BD58(EWRAM_1B000.unk260, EWRAM_1B000.unk266) != 1) + if (sub_806BD58(EWRAM_1B000.menuHandlerTaskId, EWRAM_1B000.monIndex) != 1) { - EWRAM_1B000.unk266++; - break; + EWRAM_1B000.monIndex++; } else { - EWRAM_1B000.unk266 = 0; - EWRAM_1B000.unk264++; - break; + EWRAM_1B000.monIndex = 0; + EWRAM_1B000.setupState++; } + break; case 4: PartyMenuPrintMonsLevelOrStatus(); - EWRAM_1B000.unk264++; + EWRAM_1B000.setupState++; break; case 5: PrintPartyMenuMonNicknames(); - EWRAM_1B000.unk264++; + EWRAM_1B000.setupState++; break; case 6: sub_80F9E1C(); - EWRAM_1B000.unk264++; + EWRAM_1B000.setupState++; break; case 7: // the only case that can return true. - if (sub_806B58C(EWRAM_1B000.unk266) != 1) + if (DrawPartyMonBackground(EWRAM_1B000.monIndex) != 1) { - EWRAM_1B000.unk266++; - break; + EWRAM_1B000.monIndex++; } else { - EWRAM_1B000.unk266 = 0; - EWRAM_1B000.unk264 = 0; + EWRAM_1B000.monIndex = 0; + EWRAM_1B000.setupState = 0; return TRUE; } } + return FALSE; } @@ -250,19 +249,19 @@ void sub_80F9E1C(void) } } -void sub_80F9E64(u8 var) +void HandleMoveTutorPartyMenu(u8 var) { if (!gPaletteFade.active) { - switch (sub_806BD80(var)) + switch (HandleDefaultPartyMenuInput(var)) { - case 1: + case A_BUTTON: PlaySE(SE_SELECT); gSpecialVar_0x8004 = sub_806CA38(var); gSpecialVar_0x8005 = sub_8040574(&gPlayerParty[gSpecialVar_0x8004]); sub_8123138(var); break; - case 2: + case B_BUTTON: PlaySE(SE_SELECT); gSpecialVar_0x8004 = 0xFF; sub_8123138(var); diff --git a/src/secret_base.c b/src/secret_base.c deleted file mode 100644 index b2cd1f094..000000000 --- a/src/secret_base.c +++ /dev/null @@ -1,1075 +0,0 @@ -#include "global.h" -#include "secret_base.h" -#include "decoration.h" -#include "event_data.h" -#include "field_camera.h" -#include "field_fadetransition.h" -#include "field_player_avatar.h" -#include "field_weather.h" -#include "fieldmap.h" -#include "main.h" -#include "map_constants.h" -#include "map_name_popup.h" -#include "menu.h" -#include "metatile_behavior.h" -#include "palette.h" -#include "pokemon.h" -#include "overworld.h" -#include "script.h" -#include "string_util.h" -#include "strings.h" -#include "task.h" -#include "text.h" -#include "vars.h" - -extern u8 gUnknown_020387DC; -extern u16 gSpecialVar_0x8004; -extern u16 gSpecialVar_0x8005; -extern u16 gSpecialVar_0x8006; -extern u16 gSpecialVar_0x8007; -extern u16 gScriptResult; -extern const struct -{ - u16 unk_083D1358_0; - u16 unk_083D1358_1; -} gUnknown_083D1358[7]; -extern const u8 gUnknown_083D1374[4 * 16]; -extern void *gUnknown_0300485C; -extern const u8 gUnknown_083D13EC[12]; -extern u8 gUnknown_081A2E14[]; - - -void sub_80BB4AC(struct SecretBaseRecord *record) // 080bb4ac -{ - u16 i; - u16 j; - record->sbr_field_0 = 0; - for (i=0; i<7; i++) - record->sbr_field_2[i] = 0xff; - for (i=0; i<4; i++) - record->trainerId[i] = 0x00; - record->sbr_field_e = 0; - record->sbr_field_10 = 0; - record->sbr_field_11 = 0; - record->sbr_field_1_0 = 0; - record->gender = 0; - record->sbr_field_1_5 = 0; - record->sbr_field_1_6 = 0; - for (i=0; i<16; i++) { - record->decorations[i] = 0; - record->decorationPos[i] = 0; - } - for (i=0; i<6; i++) { - for (j=0; j<4; j++) { - record->partyMoves[i * 4 + j] = 0; - } - record->partyPersonality[i] = 0; - record->partyEVs[i] = 0; - record->partySpecies[i] = 0; - record->partyHeldItems[i] = 0; - record->partyLevels[i] = 0; - } -} - -void ResetSecretBase(u8 idx) // 80bb594 -{ - sub_80BB4AC(&(gSaveBlock1.secretBases[idx])); -} - -void ResetSecretBases(void) // 080bb5b4 -{ - u16 i; - for (i=0; i<20; i++) - ResetSecretBase(i); -} - -void sub_80BB5D0(void) // 080bb5d0 -{ - gUnknown_020387DC = gSpecialVar_0x8004; -} - -void sub_80BB5E4(void) // 80bb5e4 -{ - u16 idx; - gScriptResult = 0; - for (idx=0; idx<20; idx++) { - if (gUnknown_020387DC != gSaveBlock1.secretBases[idx].sbr_field_0) - continue; - gScriptResult = 1; - VarSet(VAR_0x4054, idx); - break; - } -} - -void sub_80BB63C(void) // 80bb63c -{ - if (gSaveBlock1.secretBases[0].sbr_field_0) - gScriptResult = 1; - else - gScriptResult = 0; -} - -u8 sub_80BB66C(void) // 80bb66c -{ - s16 x, y; - s16 v0; - GetXYCoordsOneStepInFrontOfPlayer(&x, &y); - v0 = MapGridGetMetatileBehaviorAt(x, y) & 0xFFF; - if (v0 == 0x90 || v0 == 0x91) - return 1; - else if (v0 == 0x92 || v0 == 0x93) - return 2; - else if (v0 == 0x9a || v0 == 0x9b) - return 3; - else if (v0 == 0x94 || v0 == 0x95) - return 4; - else if (v0 == 0x96 || v0 == 0x97 || v0 == 0x9c || v0 == 0x9d) - return 5; - else if (v0 == 0x98 || v0 == 0x99) - return 6; - return 0; -} - -void sub_80BB70C(void) // 80bb70c -{ - gSpecialVar_0x8007 = sub_80BB66C(); -} - -s16 unref_sub_80BB724(u16 *a0, u8 a1) -{ - u16 v2; - for (v2=0; v2<0x200; v2++) { - if ((a0[v2] & 0xFFF) == a1) - return (s16)v2; - } - return -1; -} - -void sub_80BB764(s16 *arg1, s16 *arg2, u16 arg3) -{ - s16 x, y; - for (y=0; y<gMapHeader.mapData->height; y++) { - for (x=0; x<gMapHeader.mapData->width; x++) { - if ((gMapHeader.mapData->map[y * gMapHeader.mapData->width + x] & 0x3ff) == arg3) { - *arg1 = x; - *arg2 = y; - return; - } - } - } -} - -void sub_80BB800(void) -{ - s16 x, y; - s16 tile_id; - u16 idx; - GetXYCoordsOneStepInFrontOfPlayer(&x, &y); - tile_id = MapGridGetMetatileIdAt(x, y); - for (idx=0; idx<7; idx++) { - if (gUnknown_083D1358[idx].unk_083D1358_0 == tile_id) { - MapGridSetMetatileIdAt(x, y, gUnknown_083D1358[idx].unk_083D1358_1 | 0xc00); - CurrentMapDrawMetatileAt(x, y); - return; - } - } - for (idx=0; idx<7; idx++) { - if (gUnknown_083D1358[idx].unk_083D1358_1 == tile_id) { - MapGridSetMetatileIdAt(x, y, gUnknown_083D1358[idx].unk_083D1358_0 | 0xc00); - CurrentMapDrawMetatileAt(x, y); - return; - } - } -} - -u8 sub_80BB8A8(u8 *arg1) -{ - u8 idx; - for (idx=0; idx<7; idx++) { - if (arg1[idx] == EOS) - return idx; - } - return 7; -} - -void sub_80BB8CC(void) -{ - u8 nameLength; - u16 idx; - gSaveBlock1.secretBases[0].sbr_field_0 = gUnknown_020387DC; - for (idx=0; idx<4; idx++) { - gSaveBlock1.secretBases[0].trainerId[idx] = gSaveBlock2.playerTrainerId[idx]; - } - VarSet(VAR_0x4054, 0); - nameLength = sub_80BB8A8(gSaveBlock2.playerName); - memset(gSaveBlock1.secretBases[0].sbr_field_2, 0xFF, 7); - StringCopyN(gSaveBlock1.secretBases[0].sbr_field_2, gSaveBlock2.playerName, nameLength); - gSaveBlock1.secretBases[0].gender = gSaveBlock2.playerGender; - VarSet(VAR_SECRET_BASE_MAP, gMapHeader.regionMapSectionId); -} - -void sub_80BB970(struct MapEvents *events) -{ - u16 bgevidx, idx, jdx; - s16 tile_id; - for (bgevidx=0; bgevidx<events->bgEventCount; bgevidx++) { - if (events->bgEvents[bgevidx].kind == 8) { - for (jdx=0; jdx<20; jdx++) { - if (gSaveBlock1.secretBases[jdx].sbr_field_0 == events->bgEvents[bgevidx].bgUnion.secretBaseId) { - tile_id = MapGridGetMetatileIdAt(events->bgEvents[bgevidx].x + 7, events->bgEvents[bgevidx].y + 7); - for (idx=0; idx<7; idx++) { - if (gUnknown_083D1358[idx].unk_083D1358_0 == tile_id) { - MapGridSetMetatileIdAt(events->bgEvents[bgevidx].x + 7, events->bgEvents[bgevidx].y + 7, gUnknown_083D1358[idx].unk_083D1358_1 | 0xc00); - break; - } - } - break; - } - } - } - } -} - -void sub_80BBA14(void) -{ - s8 idx = 4 * (gUnknown_020387DC / 10); - warp1_set_2(MAP_GROUP_SECRET_BASE_RED_CAVE1, gUnknown_083D1374[idx], gUnknown_083D1374[idx + 1]); -} - -void sub_80BBA48(u8 taskid) -{ - u16 curbaseid; - switch (gTasks[taskid].data[0]) { - case 0: - gTasks[taskid].data[0] = 1; - break; - case 1: - if (!gPaletteFade.active) { - gTasks[taskid].data[0] = 2; - } - break; - case 2: - curbaseid = VarGet(VAR_0x4054); - if (gSaveBlock1.secretBases[curbaseid].sbr_field_10 < 0xff) - gSaveBlock1.secretBases[curbaseid].sbr_field_10 ++; - sub_80BBA14(); - warp_in(); - gFieldCallback = sub_8080990; - SetMainCallback2(CB2_LoadMap); - DestroyTask(taskid); - break; - } -} - -void sub_80BBAF0(void) -{ - CreateTask(sub_80BBA48, 0); - fade_screen(1, 0); - saved_warp2_set(0, gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1); -} - -bool8 sub_80BBB24(void) -{ - if (gMapHeader.mapType == MAP_TYPE_SECRET_BASE && VarGet(VAR_0x4097) == 0) - return FALSE; - return TRUE; -} - -void sub_80BBB50(u8 taskid) -{ - FieldObjectTurn(&(gMapObjects[gPlayerAvatar.mapObjectId]), 2); - if (sub_807D770() == 1) { - EnableBothScriptContexts(); - DestroyTask(taskid); - } -} - -void sub_80BBB90(void) -{ - s16 x, y; - ScriptContext2_Enable(); - HideMapNamePopup(); - sub_80BB764(&x, &y, 0x220); - MapGridSetMetatileIdAt(x + 7, y + 7, 0xe20); - CurrentMapDrawMetatileAt(x + 7, y + 7); - pal_fill_black(); - CreateTask(sub_80BBB50, 0); -} - -void sub_80BBBEC(u8 taskid) -{ - s8 idx; - if (!gPaletteFade.active) { - idx = 4 * (gUnknown_020387DC / 10); - warp1_set(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1, gUnknown_083D1374[idx + 2], gUnknown_083D1374[idx + 3]); - warp_in(); - gFieldCallback = sub_80BBB90; - SetMainCallback2(CB2_LoadMap); - DestroyTask(taskid); - } -} - -void sub_80BBC78(void) -{ - u8 taskid = CreateTask(sub_80BBBEC, 0); - gTasks[taskid].data[0] = 0; - fade_screen(1, 0); -} - -bool8 CurrentMapIsSecretBase(void) -{ - if (gSaveBlock1.location.mapGroup == MAP_GROUP_SECRET_BASE_SHRUB4 && (u8)(gSaveBlock1.location.mapNum) <= MAP_ID_SECRET_BASE_SHRUB4) - return TRUE; - return FALSE; -} - -#ifdef NONMATCHING -void sub_80BBCCC(u8 flagIn) -{ - u16 curBaseId; - u16 x, y; - if (CurrentMapIsSecretBase()) { - curBaseId = VarGet(VAR_0x4054); - for (x=0; x<16; x++) { - if ((u8)(gSaveBlock1.secretBases[curBaseId].decorations[x] - 1) <= 0x77 && gDecorations[gSaveBlock1.secretBases[curBaseId].decorations[x]].decor_field_11 != 4) { - sub_80FF394((gSaveBlock1.secretBases[0].decorationPos[x] >> 4) + 7, (gSaveBlock1.secretBases[0].decorationPos[x] & 0xF) + 7, gSaveBlock1.secretBases[curBaseId].decorations[x]); - } - } - if (curBaseId != 0) { - sub_80BB764(&x, &y, 0x220); - MapGridSetMetatileIdAt(x + 7, y + 7, 0xe21); - } else if (flagIn == 1 && VarGet(VAR_0x4089) == 1) { - sub_80BB764(&x, &y, 0x220); - MapGridSetMetatileIdAt(x + 7, y + 7, 0xe0a); - } - } -} - -void sub_80BBDD0(void) -{ - u8 *roomdecor; - u8 *roomdecorpos; - u8 ndecor; - u8 decidx; - u8 objid = 0; - u8 metatile; - u16 curBase = VarGet(VAR_0x4054); - if (!CurrentMapIsSecretBase()) { - roomdecor = gSaveBlock1.playerRoomDecor; - roomdecorpos = gSaveBlock1.playerRoomDecorPos; - ndecor = 12; - } else { - roomdecor = gSaveBlock1.secretBases[curBase].decorations; - roomdecorpos = gSaveBlock1.secretBases[curBase].decorationPos; - ndecor = 16; - } - for (decidx=0; decidx<ndecor; decidx++) { - if (roomdecor[decidx] == 0) - continue; - if (gDecorations[roomdecor[decidx]].decor_field_11 != 4) - continue; - for (objid=0; objid<gMapHeader.events->mapObjectCount; objid++) { - if (gMapHeader.events->mapObjects[objid].flagId == gSpecialVar_0x8004 + 0xAE) - break; - } - if (objid != gMapHeader.events->mapObjectCount) { - gSpecialVar_0x8006 = roomdecorpos[decidx] >> 4; - gSpecialVar_0x8007 = roomdecorpos[decidx] & 0xF; - metatile = MapGridGetMetatileBehaviorAt(gSpecialVar_0x8006 + 7, gSpecialVar_0x8007 + 7); - if (sub_80572D8(metatile) == 1 || sub_80572EC(metatile) == 1) { - gScriptResult = gMapHeader.events->mapObjects[objid].graphicsId + 0x3f20; - VarSet(gScriptResult, gDecorations[roomdecor[decidx]].tiles[0]); - gScriptResult = gMapHeader.events->mapObjects[objid].localId; - FlagClear(gSpecialVar_0x8004 + 0xAE); - show_sprite(gScriptResult, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); - sub_805C0F8(gScriptResult, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, gSpecialVar_0x8006, gSpecialVar_0x8007); - sub_805C78C(gScriptResult, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup); - gSpecialVar_0x8004 ++; - } - } - } -} - -#else -__attribute__((naked)) -void sub_80BBCCC(u8 flagIn) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - sub sp, 0x4\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r8, r0\n\ - bl CurrentMapIsSecretBase\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _080BBDBC\n\ - ldr r0, _080BBD70 @ =0x00004054\n\ - bl VarGet\n\ - lsls r0, 16\n\ - lsrs r5, r0, 16\n\ - movs r1, 0\n\ - mov r0, sp\n\ - strh r1, [r0]\n\ - ldr r6, _080BBD74 @ =gSaveBlock1\n\ - mov r4, sp\n\ - ldr r0, _080BBD78 @ =0x00001a2a\n\ - adds r7, r6, r0\n\ -_080BBCFC:\n\ - lsls r0, r5, 2\n\ - adds r0, r5\n\ - lsls r0, 5\n\ - ldrh r1, [r4]\n\ - adds r2, r0, r1\n\ - ldr r1, _080BBD7C @ =0x00001a1a\n\ - adds r0, r6, r1\n\ - adds r1, r2, r0\n\ - ldrb r0, [r1]\n\ - subs r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x77\n\ - bhi _080BBD3A\n\ - ldr r0, _080BBD80 @ =gDecorations\n\ - ldrb r3, [r1]\n\ - lsls r1, r3, 5\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x11]\n\ - cmp r0, 0x4\n\ - beq _080BBD3A\n\ - adds r0, r2, r7\n\ - ldrb r2, [r0]\n\ - lsrs r0, r2, 4\n\ - adds r0, 0x7\n\ - movs r1, 0xF\n\ - ands r1, r2\n\ - adds r1, 0x7\n\ - adds r2, r3, 0\n\ - bl sub_80FF394\n\ -_080BBD3A:\n\ - ldrh r0, [r4]\n\ - adds r0, 0x1\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - strh r0, [r4]\n\ - cmp r0, 0xF\n\ - bls _080BBCFC\n\ - cmp r5, 0\n\ - beq _080BBD88\n\ - mov r4, sp\n\ - adds r4, 0x2\n\ - movs r2, 0x88\n\ - lsls r2, 2\n\ - mov r0, sp\n\ - adds r1, r4, 0\n\ - bl sub_80BB764\n\ - mov r0, sp\n\ - ldrh r0, [r0]\n\ - adds r0, 0x7\n\ - ldrh r1, [r4]\n\ - adds r1, 0x7\n\ - ldr r2, _080BBD84 @ =0x00000e21\n\ - bl MapGridSetMetatileIdAt\n\ - b _080BBDBC\n\ - .align 2, 0\n\ -_080BBD70: .4byte 0x00004054\n\ -_080BBD74: .4byte gSaveBlock1\n\ -_080BBD78: .4byte 0x00001a2a\n\ -_080BBD7C: .4byte 0x00001a1a\n\ -_080BBD80: .4byte gDecorations\n\ -_080BBD84: .4byte 0x00000e21\n\ -_080BBD88:\n\ - mov r0, r8\n\ - cmp r0, 0x1\n\ - bne _080BBDBC\n\ - ldr r0, _080BBDC8 @ =0x00004089\n\ - bl VarGet\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - cmp r0, 0x1\n\ - bne _080BBDBC\n\ - mov r4, sp\n\ - adds r4, 0x2\n\ - movs r2, 0x88\n\ - lsls r2, 2\n\ - mov r0, sp\n\ - adds r1, r4, 0\n\ - bl sub_80BB764\n\ - mov r0, sp\n\ - ldrh r0, [r0]\n\ - adds r0, 0x7\n\ - ldrh r1, [r4]\n\ - adds r1, 0x7\n\ - ldr r2, _080BBDCC @ =0x00000e0a\n\ - bl MapGridSetMetatileIdAt\n\ -_080BBDBC:\n\ - add sp, 0x4\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080BBDC8: .4byte 0x00004089\n\ -_080BBDCC: .4byte 0x00000e0a\n\ -.syntax divided\n"); -} - -__attribute__((naked)) -void sub_80BBDD0(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x14\n\ - ldr r0, _080BBE00 @ =0x00004054\n\ - bl VarGet\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - bl CurrentMapIsSecretBase\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _080BBE08\n\ - ldr r0, _080BBE04 @ =gSaveBlock1 + 0x2688\n\ - str r0, [sp, 0x4]\n\ - adds r0, 0xC\n\ - str r0, [sp, 0x8]\n\ - movs r1, 0xC\n\ - str r1, [sp, 0xC]\n\ - b _080BBE1E\n\ - .align 2, 0\n\ -_080BBE00: .4byte 0x00004054\n\ -_080BBE04: .4byte gSaveBlock1 + 0x2688\n\ -_080BBE08:\n\ - lsls r1, r4, 2\n\ - adds r1, r4\n\ - lsls r1, 5\n\ - ldr r0, _080BBF7C @ =gSaveBlock1 + 0x1A1A\n\ - adds r2, r1, r0\n\ - str r2, [sp, 0x4]\n\ - adds r0, 0x10\n\ - adds r1, r0\n\ - str r1, [sp, 0x8]\n\ - movs r3, 0x10\n\ - str r3, [sp, 0xC]\n\ -_080BBE1E:\n\ - movs r6, 0\n\ - ldr r4, [sp, 0xC]\n\ - cmp r6, r4\n\ - bcc _080BBE28\n\ - b _080BBF6C\n\ -_080BBE28:\n\ - ldr r5, _080BBF80 @ =gSaveBlock1\n\ - mov r10, r5\n\ -_080BBE2C:\n\ - ldr r1, [sp, 0x4]\n\ - adds r0, r1, r6\n\ - ldrb r1, [r0]\n\ - mov r9, r0\n\ - adds r2, r6, 0x1\n\ - str r2, [sp, 0x10]\n\ - cmp r1, 0\n\ - bne _080BBE3E\n\ - b _080BBF5E\n\ -_080BBE3E:\n\ - ldrb r0, [r0]\n\ - lsls r0, 5\n\ - ldr r3, _080BBF84 @ =gDecorations\n\ - adds r0, r3\n\ - ldrb r0, [r0, 0x11]\n\ - cmp r0, 0x4\n\ - beq _080BBE4E\n\ - b _080BBF5E\n\ -_080BBE4E:\n\ - movs r5, 0\n\ - ldr r0, _080BBF88 @ =gMapHeader\n\ - ldr r2, [r0, 0x4]\n\ - ldrb r3, [r2]\n\ - mov r8, r0\n\ - cmp r5, r3\n\ - bcs _080BBE8E\n\ - ldr r0, [r2, 0x4]\n\ - ldrh r1, [r0, 0x14]\n\ - ldr r4, _080BBF8C @ =gSpecialVar_0x8004\n\ - ldrh r0, [r4]\n\ - adds r0, 0xAE\n\ - adds r7, r4, 0\n\ - cmp r1, r0\n\ - beq _080BBE8E\n\ - adds r4, r2, 0\n\ - adds r2, r3, 0\n\ -_080BBE70:\n\ - adds r0, r5, 0x1\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - cmp r5, r2\n\ - bcs _080BBE8E\n\ - ldr r1, [r4, 0x4]\n\ - lsls r0, r5, 1\n\ - adds r0, r5\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - ldrh r1, [r0, 0x14]\n\ - ldrh r0, [r7]\n\ - adds r0, 0xAE\n\ - cmp r1, r0\n\ - bne _080BBE70\n\ -_080BBE8E:\n\ - mov r1, r8\n\ - ldr r0, [r1, 0x4]\n\ - ldrb r0, [r0]\n\ - cmp r5, r0\n\ - beq _080BBF5E\n\ - ldr r7, _080BBF90 @ =gSpecialVar_0x8006\n\ - ldr r2, [sp, 0x8]\n\ - adds r1, r2, r6\n\ - ldrb r0, [r1]\n\ - lsrs r0, 4\n\ - strh r0, [r7]\n\ - ldr r6, _080BBF94 @ =gSpecialVar_0x8007\n\ - ldrb r1, [r1]\n\ - movs r0, 0xF\n\ - ands r0, r1\n\ - strh r0, [r6]\n\ - ldrh r0, [r7]\n\ - adds r0, 0x7\n\ - ldrh r1, [r6]\n\ - adds r1, 0x7\n\ - bl MapGridGetMetatileBehaviorAt\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - adds r0, r4, 0\n\ - bl sub_80572D8\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - beq _080BBEDA\n\ - adds r0, r4, 0\n\ - bl sub_80572EC\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bne _080BBF5E\n\ -_080BBEDA:\n\ - mov r3, r8\n\ - ldr r0, [r3, 0x4]\n\ - ldr r1, [r0, 0x4]\n\ - lsls r4, r5, 1\n\ - adds r4, r5\n\ - lsls r4, 3\n\ - adds r1, r4, r1\n\ - ldr r5, _080BBF98 @ =0x00003f20\n\ - adds r0, r5, 0\n\ - ldrb r1, [r1, 0x1]\n\ - adds r0, r1\n\ - ldr r1, _080BBF9C @ =gScriptResult\n\ - strh r0, [r1]\n\ - ldrh r0, [r1]\n\ - mov r2, r9\n\ - ldrb r1, [r2]\n\ - lsls r1, 5\n\ - ldr r3, _080BBFA0 @ =gDecorations + 0x1C\n\ - adds r1, r3\n\ - ldr r1, [r1]\n\ - ldrh r1, [r1]\n\ - bl VarSet\n\ - mov r5, r8\n\ - ldr r0, [r5, 0x4]\n\ - ldr r0, [r0, 0x4]\n\ - adds r4, r0\n\ - ldrb r0, [r4]\n\ - ldr r1, _080BBF9C @ =gScriptResult\n\ - strh r0, [r1]\n\ - ldr r2, _080BBF8C @ =gSpecialVar_0x8004\n\ - ldrh r0, [r2]\n\ - adds r0, 0xAE\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - bl FlagClear\n\ - ldr r3, _080BBF9C @ =gScriptResult\n\ - ldrb r0, [r3]\n\ - mov r4, r10\n\ - ldrb r1, [r4, 0x5]\n\ - ldrb r2, [r4, 0x4]\n\ - bl show_sprite\n\ - ldr r5, _080BBF9C @ =gScriptResult\n\ - ldrb r0, [r5]\n\ - ldrb r1, [r4, 0x5]\n\ - ldrb r2, [r4, 0x4]\n\ - movs r4, 0\n\ - ldrsh r3, [r7, r4]\n\ - movs r5, 0\n\ - ldrsh r4, [r6, r5]\n\ - str r4, [sp]\n\ - bl sub_805C0F8\n\ - ldr r1, _080BBF9C @ =gScriptResult\n\ - ldrb r0, [r1]\n\ - mov r2, r10\n\ - ldrb r1, [r2, 0x5]\n\ - ldrb r2, [r2, 0x4]\n\ - bl sub_805C78C\n\ - ldr r3, _080BBF8C @ =gSpecialVar_0x8004\n\ - ldrh r0, [r3]\n\ - adds r0, 0x1\n\ - strh r0, [r3]\n\ -_080BBF5E:\n\ - ldr r4, [sp, 0x10]\n\ - lsls r0, r4, 24\n\ - lsrs r6, r0, 24\n\ - ldr r5, [sp, 0xC]\n\ - cmp r6, r5\n\ - bcs _080BBF6C\n\ - b _080BBE2C\n\ -_080BBF6C:\n\ - add sp, 0x14\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080BBF7C: .4byte gSaveBlock1 + 0x1A1A\n\ -_080BBF80: .4byte gSaveBlock1\n\ -_080BBF84: .4byte gDecorations\n\ -_080BBF88: .4byte gMapHeader\n\ -_080BBF8C: .4byte gSpecialVar_0x8004\n\ -_080BBF90: .4byte gSpecialVar_0x8006\n\ -_080BBF94: .4byte gSpecialVar_0x8007\n\ -_080BBF98: .4byte 0x00003f20\n\ -_080BBF9C: .4byte gScriptResult\n\ -_080BBFA0: .4byte gDecorations + 0x1C\n\ -.syntax divided\n"); -} -#endif - -void sub_80BBFA4(void) -{ - int curBase = VarGet(VAR_0x4054); - VarSet(VAR_0x401F, gUnknown_083D13EC[sub_80BCCA4(curBase)]); -} - -void sub_80BBFD8(s16 *position, struct MapEvents *events) -{ - s16 bgevtidx; - for (bgevtidx=0; bgevtidx<events->bgEventCount; bgevtidx++) { - if (events->bgEvents[bgevtidx].kind == 8 && position[0] == events->bgEvents[bgevtidx].x + 7 && position[1] == events->bgEvents[bgevtidx].y + 7) { - gUnknown_020387DC = events->bgEvents[bgevtidx].bgUnion.secretBaseId; - break; - } - } -} - -void sub_80BC038(s16 *position, struct MapEvents *events) -{ - sub_80BBFD8(position, events); - sub_80BB5E4(); - ScriptContext1_SetupScript(gUnknown_081A2E14); -} - -bool8 sub_80BC050(void) -{ - sub_80BB5D0(); - sub_80BB5E4(); - if (gScriptResult == 1) - return FALSE; - return TRUE; -} - -void sub_80BC074(u8 taskid) -{ - switch (gTasks[taskid].data[0]) { - case 0: - ScriptContext2_Enable(); - gTasks[taskid].data[0] = 1; - break; - case 1: - if (!gPaletteFade.active) { - gTasks[taskid].data[0] = 2; - } - break; - case 2: - copy_saved_warp2_bank_and_enter_x_to_warp1(0x7E); - warp_in(); - gFieldCallback = mapldr_default; - SetMainCallback2(CB2_LoadMap); - ScriptContext2_Disable(); - DestroyTask(taskid); - break; - } -} - -void sub_80BC0F8(void) { - CreateTask(sub_80BC074, 0); - fade_screen(1, 0); -} - -void sub_80BC114(void) { - if (gSaveBlock1.secretBases[0].sbr_field_0 != gUnknown_020387DC) - gScriptResult = 1; - else - gScriptResult = 0; -} - -u8 sub_80BC14C(u8 sbid) -{ - s16 idx; - for (idx=0; idx<20; idx++) { - if (gSaveBlock1.secretBases[idx].sbr_field_0 == sbid) - return idx; - } - return 0; -} - -u8 *sub_80BC190(u8 *dest, u8 arg1) { // 80bc190 - u8 local1; - u8 *str; - - local1 = sub_80BB8A8(gSaveBlock1.secretBases[arg1].sbr_field_2); - - str = StringCopyN(dest, gSaveBlock1.secretBases[arg1].sbr_field_2, local1); - str[0] = EOS; - -#if ENGLISH - return StringAppend(dest, gOtherText_PlayersBase); -#elif GERMAN - return de_sub_8073174(dest, gOtherText_PlayersBase); -#endif -} - -u8 *GetSecretBaseMapName(u8 *dest) { - gUnknown_020387DC = gSaveBlock1.secretBases[VarGet(VAR_0x4054)].sbr_field_0; - return sub_80BC190(dest, VarGet(VAR_0x4054)); -} - -void sub_80BC224(void) { - u8 *var0 = gSaveBlock1.secretBases[(u8)VarGet(VAR_0x4054)].sbr_field_2; - u8 *var1 = gStringVar1; - u8 var2 = sub_80BB8A8(var0); - u8 *var3 = StringCopyN(var1, var0, var2); - *var3 = EOS; -} - -u8 sub_80BC268(u8 foo) { // 80bc268 - if (gSaveBlock1.secretBases[foo].sbr_field_1_6) - return 1; - return 0; -} - -u8 sub_80BC298(struct Pokemon *mon) { // 80bc298 - u16 evsum = GetMonData(mon, MON_DATA_HP_EV); - evsum += GetMonData(mon, MON_DATA_ATK_EV); - evsum += GetMonData(mon, MON_DATA_DEF_EV); - evsum += GetMonData(mon, MON_DATA_SPD_EV); - evsum += GetMonData(mon, MON_DATA_SPATK_EV); - evsum += GetMonData(mon, MON_DATA_SPDEF_EV); - return (u8)(evsum / 6); -} - -#ifdef NONMATCHING -void sub_80BC300(void) -{ - u16 moveidx; - u16 sbpartyidx = 0; - int resetVal = 0; - u16 partyidx = 0; - while (partyidx < 6) { - partyidx ++; - for (moveidx=0; moveidx<4; moveidx++) { - gSaveBlock1.secretBases[0].partyMoves[(partyidx - 1) * 6 + moveidx] = resetVal; - } - gSaveBlock1.secretBases[0].partySpecies[partyidx - 1] = resetVal; - gSaveBlock1.secretBases[0].partyHeldItems[partyidx - 1] = resetVal; - gSaveBlock1.secretBases[0].partyLevels[partyidx - 1] = resetVal; - gSaveBlock1.secretBases[0].partyPersonality[partyidx - 1] = resetVal; - gSaveBlock1.secretBases[0].partyEVs[partyidx - 1] = resetVal; - if (GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_SPECIES) != 0 && !GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_IS_EGG)) { - sbpartyidx ++; - for (moveidx=0; moveidx<4; moveidx++) { - gSaveBlock1.secretBases[0].partyMoves[(sbpartyidx - 1) * 6 + moveidx] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_MOVE1 + moveidx); - } - gSaveBlock1.secretBases[0].partySpecies[sbpartyidx - 1] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_SPECIES); - gSaveBlock1.secretBases[0].partyHeldItems[sbpartyidx - 1] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_HELD_ITEM); - gSaveBlock1.secretBases[0].partyLevels[sbpartyidx - 1] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_LEVEL); - gSaveBlock1.secretBases[0].partyPersonality[sbpartyidx - 1] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_PERSONALITY); - gSaveBlock1.secretBases[0].partyEVs[sbpartyidx - 1] = sub_80BC298(&(gPlayerParty[partyidx - 1])); - } - } -} -#else -__attribute__((naked)) -void sub_80BC300(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0xC\n\ - movs r0, 0\n\ - mov r10, r0\n\ - movs r6, 0\n\ - mov r9, r6\n\ -_080BC314:\n\ - movs r4, 0\n\ - lsls r3, r6, 2\n\ - lsls r2, r6, 1\n\ - ldr r7, _080BC424 @ =gPlayerParty\n\ - adds r1, r6, 0x1\n\ - str r1, [sp]\n\ - adds r1, r3, 0\n\ -_080BC322:\n\ - adds r0, r1, r4\n\ - lsls r0, 1\n\ - ldr r5, _080BC428 @ =gSaveBlock1 + 0x1A54\n\ - adds r0, r5, r0\n\ - mov r5, r9\n\ - strh r5, [r0]\n\ - adds r0, r4, 0x1\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - cmp r4, 0x3\n\ - bls _080BC322\n\ - ldr r1, _080BC42C @ =gSaveBlock1 + 0x1A84\n\ - adds r0, r1, r2\n\ - strh r5, [r0]\n\ - ldr r5, _080BC430 @ =gSaveBlock1 + 0x1A90\n\ - adds r0, r5, r2\n\ - mov r1, r9\n\ - strh r1, [r0]\n\ - ldr r2, _080BC434 @ =gSaveBlock1 + 0x1A9C\n\ - adds r0, r2, r6\n\ - mov r5, r9\n\ - strb r5, [r0]\n\ - ldr r1, _080BC438 @ =gSaveBlock1 + 0x1A3C\n\ - adds r0, r1, r3\n\ - mov r2, r9\n\ - str r2, [r0]\n\ - ldr r3, _080BC43C @ =gSaveBlock1 + 0x1AA2\n\ - adds r0, r3, r6\n\ - strb r2, [r0]\n\ - movs r0, 0x64\n\ - adds r5, r6, 0\n\ - muls r5, r0\n\ - adds r4, r5, r7\n\ - adds r0, r4, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - beq _080BC408\n\ - adds r0, r4, 0\n\ - movs r1, 0x2D\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - bne _080BC408\n\ - movs r4, 0\n\ - mov r0, r10\n\ - lsls r0, 2\n\ - mov r8, r0\n\ - mov r1, r10\n\ - lsls r7, r1, 1\n\ - adds r1, 0x1\n\ - str r1, [sp, 0x4]\n\ - ldr r2, _080BC424 @ =gPlayerParty\n\ -_080BC38E:\n\ - adds r1, r4, 0\n\ - adds r1, 0xD\n\ - adds r0, r5, r2\n\ - str r2, [sp, 0x8]\n\ - bl GetMonData\n\ - mov r3, r8\n\ - adds r1, r3, r4\n\ - lsls r1, 1\n\ - ldr r3, _080BC428 @ =gSaveBlock1 + 0x1A54\n\ - adds r1, r3, r1\n\ - strh r0, [r1]\n\ - adds r0, r4, 0x1\n\ - lsls r0, 16\n\ - lsrs r4, r0, 16\n\ - ldr r2, [sp, 0x8]\n\ - cmp r4, 0x3\n\ - bls _080BC38E\n\ - movs r0, 0x64\n\ - adds r4, r6, 0\n\ - muls r4, r0\n\ - ldr r0, _080BC424 @ =gPlayerParty\n\ - adds r4, r0\n\ - adds r0, r4, 0\n\ - movs r1, 0xB\n\ - bl GetMonData\n\ - ldr r5, _080BC42C @ =gSaveBlock1 + 0x1A84\n\ - adds r1, r5, r7\n\ - strh r0, [r1]\n\ - adds r0, r4, 0\n\ - movs r1, 0xC\n\ - bl GetMonData\n\ - ldr r2, _080BC430 @ =gSaveBlock1 + 0x1A90\n\ - adds r1, r2, r7\n\ - strh r0, [r1]\n\ - adds r0, r4, 0\n\ - movs r1, 0x38\n\ - bl GetMonData\n\ - ldr r1, _080BC434 @ =gSaveBlock1 + 0x1A9C\n\ - add r1, r10\n\ - strb r0, [r1]\n\ - adds r0, r4, 0\n\ - movs r1, 0\n\ - bl GetMonData\n\ - ldr r1, _080BC438 @ =gSaveBlock1 + 0x1A3C\n\ - add r1, r8\n\ - str r0, [r1]\n\ - adds r0, r4, 0\n\ - bl sub_80BC298\n\ - ldr r1, _080BC43C @ =gSaveBlock1 + 0x1AA2\n\ - add r1, r10\n\ - strb r0, [r1]\n\ - ldr r3, [sp, 0x4]\n\ - lsls r0, r3, 16\n\ - lsrs r0, 16\n\ - mov r10, r0\n\ -_080BC408:\n\ - ldr r5, [sp]\n\ - lsls r0, r5, 16\n\ - lsrs r6, r0, 16\n\ - cmp r6, 0x5\n\ - bls _080BC314\n\ - add sp, 0xC\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080BC424: .4byte gPlayerParty\n\ -_080BC428: .4byte gSaveBlock1 + 0x1A54\n\ -_080BC42C: .4byte gSaveBlock1 + 0x1A84\n\ -_080BC430: .4byte gSaveBlock1 + 0x1A90\n\ -_080BC434: .4byte gSaveBlock1 + 0x1A9C\n\ -_080BC438: .4byte gSaveBlock1 + 0x1A3C\n\ -_080BC43C: .4byte gSaveBlock1 + 0x1AA2\n\ -.syntax divided\n"); -} -#endif - -void sub_80BC440(void) -{ - u16 backupValue = gSaveBlock1.secretBases[0].sbr_field_e; - ResetSecretBase(0); - gSaveBlock1.secretBases[0].sbr_field_e = backupValue; - sub_80BC0F8(); -} - -void SecretBasePC_PackUp(void) -{ - IncrementGameStat(20); - sub_80BC440(); -} diff --git a/src/sound_check_menu.c b/src/sound_check_menu.c deleted file mode 100644 index d97ae6d86..000000000 --- a/src/sound_check_menu.c +++ /dev/null @@ -1,2199 +0,0 @@ -#include "global.h" -#include "sprite.h" -#include "palette.h" -#include "task.h" -#include "m4a.h" -#include "main.h" -#include "text.h" -#include "menu.h" -#include "songs.h" -#include "title_screen.h" -#include "sound.h" -#include "pokedex_cry_screen.h" - -// local task defines -#define WINDOW_SELECTED data[0] -#define BGM_INDEX data[1] -#define SE_INDEX data[2] -#define UNK_DATA3 data[3] -#define UNK_DATA4 data[4] -// data 5-7 are not used -// i dont have a define for data 8 yet because its used in a nonmatching and I can't be sure yet its actually used. - -// window selections -enum -{ - BGM_WINDOW, - SE_WINDOW -}; - -// driver test cry enums -enum -{ - CRY_TEST_UNK0, - CRY_TEST_VOLUME, - CRY_TEST_PANPOT, - CRY_TEST_PITCH, - CRY_TEST_LENGTH, - CRY_TEST_RELEASE, - CRY_TEST_PROGRESS, - CRY_TEST_CHORUS, - CRY_TEST_PRIORITY -}; - -// minmax range enums -enum -{ - MIN, - MAX -}; - -extern struct ToneData voicegroup_84537C0[]; -extern struct ToneData voicegroup_8452590[]; -extern struct ToneData voicegroup_8453DC0[]; -extern struct ToneData voicegroup_8452B90[]; -extern struct ToneData voicegroup_84543C0[]; -extern struct ToneData voicegroup_8453190[]; -extern struct ToneData voicegroup_84549C0[]; -extern struct ToneData voicegroup_8453790[]; - -static EWRAM_DATA u8 gUnknown_020387B0 = 0; -static EWRAM_DATA u8 gUnknown_020387B1 = 0; -static EWRAM_DATA u8 gUnknown_020387B2 = 0; -static EWRAM_DATA s8 gUnknown_020387B3 = 0; -static EWRAM_DATA int gUnknown_020387B4[9] = {0}; -static EWRAM_DATA u8 gUnknown_020387D8 = 0; -static EWRAM_DATA u8 gUnknown_020387D9 = 0; - -extern u16 gUnknown_03005D34; -extern u8 gUnknown_03005E98; - -struct MusicPlayerInfo *gUnknown_03005D30; - -extern struct MusicPlayerInfo gMPlay_BGM; - -void sub_80BA258(u8); -void sub_80BA384(u8); -void sub_80BA65C(u8); -void sub_80BA68C(u8); -void sub_80BA6B8(u8); -void sub_80BA700(u16, u16, u16); -void sub_80BA79C(const u8 *const, u16, u16); -void sub_80BA800(u8); -void sub_80BAA48(u8); -void sub_80BACDC(s8); -void sub_80BAD5C(void); -void sub_80BAE10(u8, u8); -void sub_80BAE78(int, u16, u16, u8); -void sub_80BAF84(u8); -void sub_80BB038(u8); -void sub_80BB1D4(void); -void sub_80BB25C(u8); -void sub_80BB3B4(u8); -void sub_80BB494(void); - -static const u8 gDebugText_SoundCheckJap[] = _("サウンドチェック"); -static const u8 gDebugText_BGM[] = _("BGM"); -static const u8 gDebugText_SE[] = _("SE "); -static const u8 gDebugText_ABDesc[] = _("A‥さいせい B‥おわり"); -static const u8 gDebugText_UpDown[] = _("L‥UP R‥DOWN"); -static const u8 gDebugText_DriverTest[] = _("R‥DRIVER-TEST"); - -// ideally this should be a multi Coords8 struct, but it wont match when its treated like a struct. -static const u8 gUnknown_083D0300[] = { 1, 1, 1, 3, 1, 5, 1, 7, 1, 9, 1, 11, 1, 13, 1, 15, 1, 17 }; - -static const u8 gDebugText_BBack[] = _("Bぼたんで もどる"); -static const u8 gDebugText_APlay[] = _("Aぼたんで さいせい"); -static const u8 gDebugText_Voice[] = _("VOICE‥‥‥‥"); -static const u8 gDebugText_Volume[] = _("VOLUME‥‥‥"); -static const u8 gDebugText_Panpot[] = _("PANPOT‥‥‥"); -static const u8 gDebugText_Pitch[] = _("PITCH‥‥‥‥"); -static const u8 gDebugText_Length[] = _("LENGTH‥‥‥"); -static const u8 gDebugText_Release[] = _("RELEASE‥‥"); -static const u8 gDebugText_Progress[] = _("PROGRESS‥"); -static const u8 gDebugText_Chorus[] = _("CHORUS‥‥‥"); -static const u8 gDebugText_Priority[] = _("PRIORITY‥"); -static const u8 gDebugText_Playing[] = _("さいせいちゆう‥"); // 再生中 (playing) -static const u8 gDebugText_Reverse[] = _("はんてん‥‥‥‥"); // 反転 (reverse) -static const u8 gDebugText_Stereo[] = _("すてれお‥‥‥‥"); // stereo - -// also ideally should be a MinMax struct, but any attempt to make this into a struct causes it to not match due to the weird multi dim access. -static const int gUnknown_083D039C[16] = -{ - 0, 387, - 0, 127, - -127, 127, - -128, 32639, - 0, 65535, - 0, 255, - 0, 65535, - -64, 63 -}; - -static const u8 gUnknown_083D03DC[] = _("▶"); -static const u8 gUnknown_083D03DE[] = _(" "); - -// why not just use Powers of ten from string_util? -static const int gUnknown_083D03E0[6] = -{ - 1, - 10, - 100, - 1000, - 10000, - 100000 -}; - -static const s8 gUnknown_083D03F8[5] = { 0x3F, 0x00, 0xC0, 0x7F, 0x80 }; - -static const u8 gOtherText_SE[] = _("SE"); -static const u8 gOtherText_Pan[] = _("PAN"); -static const u8 gOtherText_LR[] = _(" LR"); -static const u8 gOtherText_RL[] = _(" RL"); - -// bgm names -static const u8 BGMName_STOP[] = _("STOP"); -static const u8 BGMName_TETSUJI[] = _("TETSUJI"); -static const u8 BGMName_FIELD13[] = _("FIELD13"); -static const u8 BGMName_KACHI22[] = _("KACHI22"); -static const u8 BGMName_KACHI2[] = _("KACHI2"); -static const u8 BGMName_KACHI3[] = _("KACHI3"); -static const u8 BGMName_KACHI5[] = _("KACHI5"); -static const u8 BGMName_PCC[] = _("PCC"); -static const u8 BGMName_NIBI[] = _("NIBI"); -static const u8 BGMName_SUIKUN[] = _("SUIKUN"); -static const u8 BGMName_DOORO1[] = _("DOORO1"); -static const u8 BGMName_DOORO_X1[] = _("DOORO-X1"); -static const u8 BGMName_DOORO_X3[] = _("DOORO-X3"); -static const u8 BGMName_MACHI_S2[] = _("MACHI-S2"); -static const u8 BGMName_MACHI_S4[] = _("MACHI-S4"); -static const u8 BGMName_GIM[] = _("GIM"); -static const u8 BGMName_NAMINORI[] = _("NAMINORI"); -static const u8 BGMName_DAN01[] = _("DAN01"); -static const u8 BGMName_FANFA1[] = _("FANFA1"); -static const u8 BGMName_ME_ASA[] = _("ME-ASA"); -static const u8 BGMName_ME_BACHI[] = _("ME-BACHI"); -static const u8 BGMName_FANFA4[] = _("FANFA4"); -static const u8 BGMName_FANFA5[] = _("FANFA5"); -static const u8 BGMName_ME_WAZA[] = _("ME-WAZA"); -static const u8 BGMName_BIJYUTU[] = _("BIJYUTU"); -static const u8 BGMName_DOORO_X4[] = _("DOORO-X4"); -static const u8 BGMName_FUNE_KAN[] = _("FUNE-KAN"); -static const u8 BGMName_ME_SHINKA[] = _("ME-SHINKA"); -static const u8 BGMName_SHINKA[] = _("SHINKA"); -static const u8 BGMName_ME_WASURE[] = _("ME-WASURE"); -static const u8 BGMName_SYOUJOEYE[] = _("SYOUJOEYE"); -static const u8 BGMName_BOYEYE[] = _("BOYEYE"); -static const u8 BGMName_DAN02[] = _("DAN02"); -static const u8 BGMName_MACHI_S3[] = _("MACHI-S3"); -static const u8 BGMName_ODAMAKI[] = _("ODAMAKI"); -static const u8 BGMName_B_TOWER[] = _("B-TOWER"); -static const u8 BGMName_SWIMEYE[] = _("SWIMEYE"); -static const u8 BGMName_DAN03[] = _("DAN03"); -static const u8 BGMName_ME_KINOMI[] = _("ME-KINOMI"); -static const u8 BGMName_ME_TAMA[] = _("ME-TAMA"); -static const u8 BGMName_ME_B_BIG[] = _("ME-B-BIG"); -static const u8 BGMName_ME_B_SMALL[] = _("ME-B-SMALL"); -static const u8 BGMName_ME_ZANNEN[] = _("ME-ZANNEN"); -static const u8 BGMName_BD_TIME[] = _("BD-TIME"); -static const u8 BGMName_TEST1[] = _("TEST1"); -static const u8 BGMName_TEST2[] = _("TEST2"); -static const u8 BGMName_TEST3[] = _("TEST3"); -static const u8 BGMName_TEST4[] = _("TEST4"); -static const u8 BGMName_TEST[] = _("TEST"); -static const u8 BGMName_GOMACHI0[] = _("GOMACHI0"); -static const u8 BGMName_GOTOWN[] = _("GOTOWN"); -static const u8 BGMName_POKECEN[] = _("POKECEN"); -static const u8 BGMName_NEXTROAD[] = _("NEXTROAD"); -static const u8 BGMName_GRANROAD[] = _("GRANROAD"); -static const u8 BGMName_CYCLING[] = _("CYCLING"); -static const u8 BGMName_FRIENDLY[] = _("FRIENDLY"); -static const u8 BGMName_MISHIRO[] = _("MISHIRO"); -static const u8 BGMName_TOZAN[] = _("TOZAN"); -static const u8 BGMName_GIRLEYE[] = _("GIRLEYE"); -static const u8 BGMName_MINAMO[] = _("MINAMO"); -static const u8 BGMName_ASHROAD[] = _("ASHROAD"); -static const u8 BGMName_EVENT0[] = _("EVENT0"); -static const u8 BGMName_DEEPDEEP[] = _("DEEPDEEP"); -static const u8 BGMName_KACHI1[] = _("KACHI1"); -static const u8 BGMName_TITLE3[] = _("TITLE3"); -static const u8 BGMName_DEMO1[] = _("DEMO1"); -static const u8 BGMName_GIRL_SUP[] = _("GIRL-SUP"); -static const u8 BGMName_HAGESHII[] = _("HAGESHII"); -static const u8 BGMName_KAKKOII[] = _("KAKKOII"); -static const u8 BGMName_KAZANBAI[] = _("KAZANBAI"); -static const u8 BGMName_AQA_0[] = _("AQA-0"); -static const u8 BGMName_TSURETEK[] = _("TSURETEK"); -static const u8 BGMName_BOY_SUP[] = _("BOY-SUP"); -static const u8 BGMName_RAINBOW[] = _("RAINBOW"); -static const u8 BGMName_AYASII[] = _("AYASII"); -static const u8 BGMName_KACHI4[] = _("KACHI4"); -static const u8 BGMName_ROPEWAY[] = _("ROPEWAY"); -static const u8 BGMName_CASINO[] = _("CASINO"); -static const u8 BGMName_HIGHTOWN[] = _("HIGHTOWN"); -static const u8 BGMName_SAFARI[] = _("SAFARI"); -static const u8 BGMName_C_ROAD[] = _("C-ROAD"); -static const u8 BGMName_AJITO[] = _("AJITO"); -static const u8 BGMName_M_BOAT[] = _("M-BOAT"); -static const u8 BGMName_M_DUNGON[] = _("M-DUNGON"); -static const u8 BGMName_FINECITY[] = _("FINECITY"); -static const u8 BGMName_MACHUPI[] = _("MACHUPI"); -static const u8 BGMName_P_SCHOOL[] = _("P-SCHOOL"); -static const u8 BGMName_DENDOU[] = _("DENDOU"); -static const u8 BGMName_TONEKUSA[] = _("TONEKUSA"); -static const u8 BGMName_MABOROSI[] = _("MABOROSI"); -static const u8 BGMName_CON_FAN[] = _("CON-FAN"); -static const u8 BGMName_CONTEST0[] = _("CONTEST0"); -static const u8 BGMName_MGM0[] = _("MGM0"); -static const u8 BGMName_T_BATTLE[] = _("T-BATTLE"); -static const u8 BGMName_OOAME[] = _("OOAME"); -static const u8 BGMName_HIDERI[] = _("HIDERI"); -static const u8 BGMName_RUNECITY[] = _("RUNECITY"); -static const u8 BGMName_CON_K[] = _("CON-K"); -static const u8 BGMName_EIKOU_R[] = _("EIKOU-R"); -static const u8 BGMName_KARAKURI[] = _("KARAKURI"); -static const u8 BGMName_HUTAGO[] = _("HUTAGO"); -static const u8 BGMName_SITENNOU[] = _("SITENNOU"); -static const u8 BGMName_YAMA_EYE[] = _("YAMA-EYE"); -static const u8 BGMName_CONLOBBY[] = _("CONLOBBY"); -static const u8 BGMName_INTER_V[] = _("INTER-V"); -static const u8 BGMName_DAIGO[] = _("DAIGO"); -static const u8 BGMName_THANKFOR[] = _("THANKFOR"); -static const u8 BGMName_END[] = _("END"); -static const u8 BGMName_BATTLE27[] = _("BATTLE27"); -static const u8 BGMName_BATTLE31[] = _("BATTLE31"); -static const u8 BGMName_BATTLE20[] = _("BATTLE20"); -static const u8 BGMName_BATTLE32[] = _("BATTLE32"); -static const u8 BGMName_BATTLE33[] = _("BATTLE33"); -static const u8 BGMName_BATTLE36[] = _("BATTLE36"); -static const u8 BGMName_BATTLE34[] = _("BATTLE34"); -static const u8 BGMName_BATTLE35[] = _("BATTLE35"); -static const u8 BGMName_BATTLE38[] = _("BATTLE38"); -static const u8 BGMName_BATTLE30[] = _("BATTLE30"); - -static const u8 *const gBGMNames[] = -{ - BGMName_STOP, - BGMName_TETSUJI, - BGMName_FIELD13, - BGMName_KACHI22, - BGMName_KACHI2, - BGMName_KACHI3, - BGMName_KACHI5, - BGMName_PCC, - BGMName_NIBI, - BGMName_SUIKUN, - BGMName_DOORO1, - BGMName_DOORO_X1, - BGMName_DOORO_X3, - BGMName_MACHI_S2, - BGMName_MACHI_S4, - BGMName_GIM, - BGMName_NAMINORI, - BGMName_DAN01, - BGMName_FANFA1, - BGMName_ME_ASA, - BGMName_ME_BACHI, - BGMName_FANFA4, - BGMName_FANFA5, - BGMName_ME_WAZA, - BGMName_BIJYUTU, - BGMName_DOORO_X4, - BGMName_FUNE_KAN, - BGMName_ME_SHINKA, - BGMName_SHINKA, - BGMName_ME_WASURE, - BGMName_SYOUJOEYE, - BGMName_BOYEYE, - BGMName_DAN02, - BGMName_MACHI_S3, - BGMName_ODAMAKI, - BGMName_B_TOWER, - BGMName_SWIMEYE, - BGMName_DAN03, - BGMName_ME_KINOMI, - BGMName_ME_TAMA, - BGMName_ME_B_BIG, - BGMName_ME_B_SMALL, - BGMName_ME_ZANNEN, - BGMName_BD_TIME, - BGMName_TEST1, - BGMName_TEST2, - BGMName_TEST3, - BGMName_TEST4, - BGMName_TEST, - BGMName_GOMACHI0, - BGMName_GOTOWN, - BGMName_POKECEN, - BGMName_NEXTROAD, - BGMName_GRANROAD, - BGMName_CYCLING, - BGMName_FRIENDLY, - BGMName_MISHIRO, - BGMName_TOZAN, - BGMName_GIRLEYE, - BGMName_MINAMO, - BGMName_ASHROAD, - BGMName_EVENT0, - BGMName_DEEPDEEP, - BGMName_KACHI1, - BGMName_TITLE3, - BGMName_DEMO1, - BGMName_GIRL_SUP, - BGMName_HAGESHII, - BGMName_KAKKOII, - BGMName_KAZANBAI, - BGMName_AQA_0, - BGMName_TSURETEK, - BGMName_BOY_SUP, - BGMName_RAINBOW, - BGMName_AYASII, - BGMName_KACHI4, - BGMName_ROPEWAY, - BGMName_CASINO, - BGMName_HIGHTOWN, - BGMName_SAFARI, - BGMName_C_ROAD, - BGMName_AJITO, - BGMName_M_BOAT, - BGMName_M_DUNGON, - BGMName_FINECITY, - BGMName_MACHUPI, - BGMName_P_SCHOOL, - BGMName_DENDOU, - BGMName_TONEKUSA, - BGMName_MABOROSI, - BGMName_CON_FAN, - BGMName_CONTEST0, - BGMName_MGM0, - BGMName_T_BATTLE, - BGMName_OOAME, - BGMName_HIDERI, - BGMName_RUNECITY, - BGMName_CON_K, - BGMName_EIKOU_R, - BGMName_KARAKURI, - BGMName_HUTAGO, - BGMName_SITENNOU, - BGMName_YAMA_EYE, - BGMName_CONLOBBY, - BGMName_INTER_V, - BGMName_DAIGO, - BGMName_THANKFOR, - BGMName_END, - BGMName_BATTLE27, - BGMName_BATTLE31, - BGMName_BATTLE20, - BGMName_BATTLE32, - BGMName_BATTLE33, - BGMName_BATTLE36, - BGMName_BATTLE34, - BGMName_BATTLE35, - BGMName_BATTLE38, - BGMName_BATTLE30 -}; - -// SE names -static const u8 SEName_STOP[] = _("STOP"); -static const u8 SEName_KAIFUKU[] = _("KAIFUKU"); -static const u8 SEName_PC_LOGON[] = _("PC-LOGON"); -static const u8 SEName_PC_OFF[] = _("PC-OFF"); -static const u8 SEName_PC_ON[] = _("PC-ON"); -static const u8 SEName_SELECT[] = _("SELECT"); -static const u8 SEName_WIN_OPEN[] = _("WIN-OPEN"); -static const u8 SEName_WALL_HIT[] = _("WALL-HIT"); -static const u8 SEName_DOOR[] = _("DOOR"); -static const u8 SEName_KAIDAN[] = _("KAIDAN"); -static const u8 SEName_DANSA[] = _("DANSA"); -static const u8 SEName_JITENSYA[] = _("JITENSYA"); -static const u8 SEName_KOUKA_L[] = _("KOUKA-L"); -static const u8 SEName_KOUKA_M[] = _("KOUKA-M"); -static const u8 SEName_KOUKA_H[] = _("KOUKA-H"); -static const u8 SEName_BOWA2[] = _("BOWA2"); -static const u8 SEName_POKE_DEAD[] = _("POKE-DEAD"); -static const u8 SEName_NIGERU[] = _("NIGERU"); -static const u8 SEName_JIDO_DOA[] = _("JIDO-DOA"); -static const u8 SEName_NAMINORI[] = _("NAMINORI"); -static const u8 SEName_BAN[] = _("BAN"); -static const u8 SEName_PIN[] = _("PIN"); -static const u8 SEName_BOO[] = _("BOO"); -static const u8 SEName_BOWA[] = _("BOWA"); -static const u8 SEName_JYUNI[] = _("JYUNI"); -static const u8 SEName_A[] = _("A"); -static const u8 SEName_I[] = _("I"); -static const u8 SEName_U[] = _("U"); -static const u8 SEName_E[] = _("E"); -static const u8 SEName_O[] = _("O"); -static const u8 SEName_N[] = _("N"); -static const u8 SEName_SEIKAI[] = _("SEIKAI"); -static const u8 SEName_HAZURE[] = _("HAZURE"); -static const u8 SEName_EXP[] = _("EXP"); -static const u8 SEName_JITE_PYOKO[] = _("JITE-PYOKO"); -static const u8 SEName_MU_PACHI[] = _("MU-PACHI"); -static const u8 SEName_TK_KASYA[] = _("TK-KASYA"); -static const u8 SEName_FU_ZAKU[] = _("FU-ZAKU"); -static const u8 SEName_FU_ZAKU2[] = _("FU-ZAKU2"); -static const u8 SEName_FU_ZUZUZU[] = _("FU-ZUZUZU"); -static const u8 SEName_RU_GASHIN[] = _("RU-GASHIN"); -static const u8 SEName_RU_GASYAN[] = _("RU-GASYAN"); -static const u8 SEName_RU_BARI[] = _("RU-BARI"); -static const u8 SEName_RU_HYUU[] = _("RU-HYUU"); -static const u8 SEName_KI_GASYAN[] = _("KI-GASYAN"); -static const u8 SEName_TK_WARPIN[] = _("TK-WARPIN"); -static const u8 SEName_TK_WARPOUT[] = _("TK-WARPOUT"); -static const u8 SEName_TU_SAA[] = _("TU-SAA"); -static const u8 SEName_HI_TURUN[] = _("HI-TURUN"); -static const u8 SEName_TRACK_MOVE[] = _("TRACK-MOVE"); -static const u8 SEName_TRACK_STOP[] = _("TRACK-STOP"); -static const u8 SEName_TRACK_HAIK[] = _("TRACK-HAIK"); -static const u8 SEName_TRACK_DOOR[] = _("TRACK-DOOR"); -static const u8 SEName_MOTER[] = _("MOTER"); -static const u8 SEName_CARD[] = _("CARD"); -static const u8 SEName_SAVE[] = _("SAVE"); -static const u8 SEName_KON[] = _("KON"); -static const u8 SEName_KON2[] = _("KON2"); -static const u8 SEName_KON3[] = _("KON3"); -static const u8 SEName_KON4[] = _("KON4"); -static const u8 SEName_SUIKOMU[] = _("SUIKOMU"); -static const u8 SEName_NAGERU[] = _("NAGERU"); -static const u8 SEName_TOY_C[] = _("TOY-C"); -static const u8 SEName_TOY_D[] = _("TOY-D"); -static const u8 SEName_TOY_E[] = _("TOY-E"); -static const u8 SEName_TOY_F[] = _("TOY-F"); -static const u8 SEName_TOY_G[] = _("TOY-G"); -static const u8 SEName_TOY_A[] = _("TOY-A"); -static const u8 SEName_TOY_B[] = _("TOY-B"); -static const u8 SEName_TOY_C1[] = _("TOY-C1"); -static const u8 SEName_MIZU[] = _("MIZU"); -static const u8 SEName_HASHI[] = _("HASHI"); -static const u8 SEName_DAUGI[] = _("DAUGI"); -static const u8 SEName_PINPON[] = _("PINPON"); -static const u8 SEName_FUUSEN1[] = _("FUUSEN1"); -static const u8 SEName_FUUSEN2[] = _("FUUSEN2"); -static const u8 SEName_FUUSEN3[] = _("FUUSEN3"); -static const u8 SEName_TOY_KABE[] = _("TOY-KABE"); -static const u8 SEName_TOY_DANGO[] = _("TOY-DANGO"); -static const u8 SEName_DOKU[] = _("DOKU"); -static const u8 SEName_ESUKA[] = _("ESUKA"); -static const u8 SEName_T_AME[] = _("T-AME"); -static const u8 SEName_T_AME_E[] = _("T-AME-E"); -static const u8 SEName_T_OOAME[] = _("T-OOAME"); -static const u8 SEName_T_OOAME_E[] = _("T-OOAME-E"); -static const u8 SEName_T_KOAME[] = _("T-KOAME"); -static const u8 SEName_T_KOAME_E[] = _("T-KOAME-E"); -static const u8 SEName_T_KAMI[] = _("T-KAMI"); -static const u8 SEName_T_KAMI2[] = _("T-KAMI2"); -static const u8 SEName_ELEBETA[] = _("ELEBETA"); -static const u8 SEName_HINSI[] = _("HINSI"); -static const u8 SEName_EXPMAX[] = _("EXPMAX"); -static const u8 SEName_TAMAKORO[] = _("TAMAKORO"); -static const u8 SEName_TAMAKORO_E[] = _("TAMAKORO-E"); -static const u8 SEName_BASABASA[] = _("BASABASA"); -static const u8 SEName_REGI[] = _("REGI"); -static const u8 SEName_C_GAJI[] = _("C-GAJI"); -static const u8 SEName_C_MAKU_U[] = _("C-MAKU-U"); -static const u8 SEName_C_MAKU_D[] = _("C-MAKU-D"); -static const u8 SEName_C_PASI[] = _("C-PASI"); -static const u8 SEName_C_SYU[] = _("C-SYU"); -static const u8 SEName_C_PIKON[] = _("C-PIKON"); -static const u8 SEName_REAPOKE[] = _("REAPOKE"); -static const u8 SEName_OP_BASYU[] = _("OP-BASYU"); -static const u8 SEName_BT_START[] = _("BT-START"); -static const u8 SEName_DENDOU[] = _("DENDOU"); -static const u8 SEName_JIHANKI[] = _("JIHANKI"); -static const u8 SEName_TAMA[] = _("TAMA"); -static const u8 SEName_Z_SCROLL[] = _("Z-SCROLL"); -static const u8 SEName_Z_PAGE[] = _("Z-PAGE"); -static const u8 SEName_PN_ON[] = _("PN-ON"); -static const u8 SEName_PN_OFF[] = _("PN-OFF"); -static const u8 SEName_Z_SEARCH[] = _("Z-SEARCH"); -static const u8 SEName_TAMAGO[] = _("TAMAGO"); -static const u8 SEName_TB_START[] = _("TB-START"); -static const u8 SEName_TB_KON[] = _("TB-KON"); -static const u8 SEName_TB_KARA[] = _("TB-KARA"); -static const u8 SEName_BIDORO[] = _("BIDORO"); -static const u8 SEName_W085[] = _("W085"); -static const u8 SEName_W085B[] = _("W085B"); -static const u8 SEName_W231[] = _("W231"); -static const u8 SEName_W171[] = _("W171"); -static const u8 SEName_W233[] = _("W233"); -static const u8 SEName_W233B[] = _("W233B"); -static const u8 SEName_W145[] = _("W145"); -static const u8 SEName_W145B[] = _("W145B"); -static const u8 SEName_W145C[] = _("W145C"); -static const u8 SEName_W240[] = _("W240"); -static const u8 SEName_W015[] = _("W015"); -static const u8 SEName_W081[] = _("W081"); -static const u8 SEName_W081B[] = _("W081B"); -static const u8 SEName_W088[] = _("W088"); -static const u8 SEName_W016[] = _("W016"); -static const u8 SEName_W016B[] = _("W016B"); -static const u8 SEName_W003[] = _("W003"); -static const u8 SEName_W104[] = _("W104"); -static const u8 SEName_W013[] = _("W013"); -static const u8 SEName_W196[] = _("W196"); -static const u8 SEName_W086[] = _("W086"); -static const u8 SEName_W004[] = _("W004"); -static const u8 SEName_W025[] = _("W025"); -static const u8 SEName_W025B[] = _("W025B"); -static const u8 SEName_W152[] = _("W152"); -static const u8 SEName_W026[] = _("W026"); -static const u8 SEName_W172[] = _("W172"); -static const u8 SEName_W172B[] = _("W172B"); -static const u8 SEName_W053[] = _("W053"); -static const u8 SEName_W007[] = _("W007"); -static const u8 SEName_W092[] = _("W092"); -static const u8 SEName_W221[] = _("W221"); -static const u8 SEName_W221B[] = _("W221B"); -static const u8 SEName_W052[] = _("W052"); -static const u8 SEName_W036[] = _("W036"); -static const u8 SEName_W059[] = _("W059"); -static const u8 SEName_W059B[] = _("W059B"); -static const u8 SEName_W010[] = _("W010"); -static const u8 SEName_W011[] = _("W011"); -static const u8 SEName_W017[] = _("W017"); -static const u8 SEName_W019[] = _("W019"); -static const u8 SEName_W028[] = _("W028"); -static const u8 SEName_W013B[] = _("W013B"); -static const u8 SEName_W044[] = _("W044"); -static const u8 SEName_W029[] = _("W029"); -static const u8 SEName_W057[] = _("W057"); -static const u8 SEName_W056[] = _("W056"); -static const u8 SEName_W250[] = _("W250"); -static const u8 SEName_W030[] = _("W030"); -static const u8 SEName_W039[] = _("W039"); -static const u8 SEName_W054[] = _("W054"); -static const u8 SEName_W077[] = _("W077"); -static const u8 SEName_W020[] = _("W020"); -static const u8 SEName_W082[] = _("W082"); -static const u8 SEName_W047[] = _("W047"); -static const u8 SEName_W195[] = _("W195"); -static const u8 SEName_W006[] = _("W006"); -static const u8 SEName_W091[] = _("W091"); -static const u8 SEName_W146[] = _("W146"); -static const u8 SEName_W120[] = _("W120"); -static const u8 SEName_W153[] = _("W153"); -static const u8 SEName_W071B[] = _("W071B"); -static const u8 SEName_W071[] = _("W071"); -static const u8 SEName_W103[] = _("W103"); -static const u8 SEName_W062[] = _("W062"); -static const u8 SEName_W062B[] = _("W062B"); -static const u8 SEName_W048[] = _("W048"); -static const u8 SEName_W187[] = _("W187"); -static const u8 SEName_W118[] = _("W118"); -static const u8 SEName_W155[] = _("W155"); -static const u8 SEName_W122[] = _("W122"); -static const u8 SEName_W060[] = _("W060"); -static const u8 SEName_W185[] = _("W185"); -static const u8 SEName_W014[] = _("W014"); -static const u8 SEName_W043[] = _("W043"); -static const u8 SEName_W207[] = _("W207"); -static const u8 SEName_W207B[] = _("W207B"); -static const u8 SEName_W215[] = _("W215"); -static const u8 SEName_W109[] = _("W109"); -static const u8 SEName_W173[] = _("W173"); -static const u8 SEName_W280[] = _("W280"); -static const u8 SEName_W202[] = _("W202"); -static const u8 SEName_W060B[] = _("W060B"); -static const u8 SEName_W076[] = _("W076"); -static const u8 SEName_W080[] = _("W080"); -static const u8 SEName_W100[] = _("W100"); -static const u8 SEName_W107[] = _("W107"); -static const u8 SEName_W166[] = _("W166"); -static const u8 SEName_W129[] = _("W129"); -static const u8 SEName_W115[] = _("W115"); -static const u8 SEName_W112[] = _("W112"); -static const u8 SEName_W197[] = _("W197"); -static const u8 SEName_W199[] = _("W199"); -static const u8 SEName_W236[] = _("W236"); -static const u8 SEName_W204[] = _("W204"); -static const u8 SEName_W268[] = _("W268"); -static const u8 SEName_W070[] = _("W070"); -static const u8 SEName_W063[] = _("W063"); -static const u8 SEName_W127[] = _("W127"); -static const u8 SEName_W179[] = _("W179"); -static const u8 SEName_W151[] = _("W151"); -static const u8 SEName_W201[] = _("W201"); -static const u8 SEName_W161[] = _("W161"); -static const u8 SEName_W161B[] = _("W161B"); -static const u8 SEName_W227[] = _("W227"); -static const u8 SEName_W227B[] = _("W227B"); -static const u8 SEName_W226[] = _("W226"); -static const u8 SEName_W208[] = _("W208"); -static const u8 SEName_W213[] = _("W213"); -static const u8 SEName_W213B[] = _("W213B"); -static const u8 SEName_W234[] = _("W234"); -static const u8 SEName_W260[] = _("W260"); -static const u8 SEName_W328[] = _("W328"); -static const u8 SEName_W320[] = _("W320"); -static const u8 SEName_W255[] = _("W255"); -static const u8 SEName_W291[] = _("W291"); -static const u8 SEName_W089[] = _("W089"); -static const u8 SEName_W239[] = _("W239"); -static const u8 SEName_W230[] = _("W230"); -static const u8 SEName_W281[] = _("W281"); -static const u8 SEName_W327[] = _("W327"); -static const u8 SEName_W287[] = _("W287"); -static const u8 SEName_W257[] = _("W257"); -static const u8 SEName_W253[] = _("W253"); -static const u8 SEName_W258[] = _("W258"); -static const u8 SEName_W322[] = _("W322"); -static const u8 SEName_W298[] = _("W298"); -static const u8 SEName_W287B[] = _("W287B"); -static const u8 SEName_W114[] = _("W114"); -static const u8 SEName_W063B[] = _("W063B"); - -static const u8 *const gSENames[] = -{ - SEName_STOP, - SEName_KAIFUKU, - SEName_PC_LOGON, - SEName_PC_OFF, - SEName_PC_ON, - SEName_SELECT, - SEName_WIN_OPEN, - SEName_WALL_HIT, - SEName_DOOR, - SEName_KAIDAN, - SEName_DANSA, - SEName_JITENSYA, - SEName_KOUKA_L, - SEName_KOUKA_M, - SEName_KOUKA_H, - SEName_BOWA2, - SEName_POKE_DEAD, - SEName_NIGERU, - SEName_JIDO_DOA, - SEName_NAMINORI, - SEName_BAN, - SEName_PIN, - SEName_BOO, - SEName_BOWA, - SEName_JYUNI, - SEName_A, - SEName_I, - SEName_U, - SEName_E, - SEName_O, - SEName_N, - SEName_SEIKAI, - SEName_HAZURE, - SEName_EXP, - SEName_JITE_PYOKO, - SEName_MU_PACHI, - SEName_TK_KASYA, - SEName_FU_ZAKU, - SEName_FU_ZAKU2, - SEName_FU_ZUZUZU, - SEName_RU_GASHIN, - SEName_RU_GASYAN, - SEName_RU_BARI, - SEName_RU_HYUU, - SEName_KI_GASYAN, - SEName_TK_WARPIN, - SEName_TK_WARPOUT, - SEName_TU_SAA, - SEName_HI_TURUN, - SEName_TRACK_MOVE, - SEName_TRACK_STOP, - SEName_TRACK_HAIK, - SEName_TRACK_DOOR, - SEName_MOTER, - SEName_CARD, - SEName_SAVE, - SEName_KON, - SEName_KON2, - SEName_KON3, - SEName_KON4, - SEName_SUIKOMU, - SEName_NAGERU, - SEName_TOY_C, - SEName_TOY_D, - SEName_TOY_E, - SEName_TOY_F, - SEName_TOY_G, - SEName_TOY_A, - SEName_TOY_B, - SEName_TOY_C1, - SEName_MIZU, - SEName_HASHI, - SEName_DAUGI, - SEName_PINPON, - SEName_FUUSEN1, - SEName_FUUSEN2, - SEName_FUUSEN3, - SEName_TOY_KABE, - SEName_TOY_DANGO, - SEName_DOKU, - SEName_ESUKA, - SEName_T_AME, - SEName_T_AME_E, - SEName_T_OOAME, - SEName_T_OOAME_E, - SEName_T_KOAME, - SEName_T_KOAME_E, - SEName_T_KAMI, - SEName_T_KAMI2, - SEName_ELEBETA, - SEName_HINSI, - SEName_EXPMAX, - SEName_TAMAKORO, - SEName_TAMAKORO_E, - SEName_BASABASA, - SEName_REGI, - SEName_C_GAJI, - SEName_C_MAKU_U, - SEName_C_MAKU_D, - SEName_C_PASI, - SEName_C_SYU, - SEName_C_PIKON, - SEName_REAPOKE, - SEName_OP_BASYU, - SEName_BT_START, - SEName_DENDOU, - SEName_JIHANKI, - SEName_TAMA, - SEName_Z_SCROLL, - SEName_Z_PAGE, - SEName_PN_ON, - SEName_PN_OFF, - SEName_Z_SEARCH, - SEName_TAMAGO, - SEName_TB_START, - SEName_TB_KON, - SEName_TB_KARA, - SEName_BIDORO, - SEName_W085, - SEName_W085B, - SEName_W231, - SEName_W171, - SEName_W233, - SEName_W233B, - SEName_W145, - SEName_W145B, - SEName_W145C, - SEName_W240, - SEName_W015, - SEName_W081, - SEName_W081B, - SEName_W088, - SEName_W016, - SEName_W016B, - SEName_W003, - SEName_W104, - SEName_W013, - SEName_W196, - SEName_W086, - SEName_W004, - SEName_W025, - SEName_W025B, - SEName_W152, - SEName_W026, - SEName_W172, - SEName_W172B, - SEName_W053, - SEName_W007, - SEName_W092, - SEName_W221, - SEName_W221B, - SEName_W052, - SEName_W036, - SEName_W059, - SEName_W059B, - SEName_W010, - SEName_W011, - SEName_W017, - SEName_W019, - SEName_W028, - SEName_W013B, - SEName_W044, - SEName_W029, - SEName_W057, - SEName_W056, - SEName_W250, - SEName_W030, - SEName_W039, - SEName_W054, - SEName_W077, - SEName_W020, - SEName_W082, - SEName_W047, - SEName_W195, - SEName_W006, - SEName_W091, - SEName_W146, - SEName_W120, - SEName_W153, - SEName_W071B, - SEName_W071, - SEName_W103, - SEName_W062, - SEName_W062B, - SEName_W048, - SEName_W187, - SEName_W118, - SEName_W155, - SEName_W122, - SEName_W060, - SEName_W185, - SEName_W014, - SEName_W043, - SEName_W207, - SEName_W207B, - SEName_W215, - SEName_W109, - SEName_W173, - SEName_W280, - SEName_W202, - SEName_W060B, - SEName_W076, - SEName_W080, - SEName_W100, - SEName_W107, - SEName_W166, - SEName_W129, - SEName_W115, - SEName_W112, - SEName_W197, - SEName_W199, - SEName_W236, - SEName_W204, - SEName_W268, - SEName_W070, - SEName_W063, - SEName_W127, - SEName_W179, - SEName_W151, - SEName_W201, - SEName_W161, - SEName_W161B, - SEName_W227, - SEName_W227B, - SEName_W226, - SEName_W208, - SEName_W213, - SEName_W213B, - SEName_W234, - SEName_W260, - SEName_W328, - SEName_W320, - SEName_W255, - SEName_W291, - SEName_W089, - SEName_W239, - SEName_W230, - SEName_W281, - SEName_W327, - SEName_W287, - SEName_W257, - SEName_W253, - SEName_W258, - SEName_W322, - SEName_W298, - SEName_W287B, - SEName_W114, - SEName_W063B -}; - -void sub_80BA0A8(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -void sub_80BA0C0(void) -{ - LoadOam(); - ProcessSpriteCopyRequests(); - TransferPlttBuffer(); - - if(gUnknown_020387B0 != 0) - { - m4aSoundMain(); - m4aSoundMain(); - m4aSoundMain(); - } -} - -// unused -void CB2_StartSoundCheckMenu(void) -{ - u8 taskId; - - SetVBlankCallback(NULL); - REG_DISPCNT = 0; - REG_BG2CNT = 0; - REG_BG1CNT = 0; - REG_BG0CNT = 0; - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG1HOFS = 0; - REG_BG1VOFS = 0; - REG_BG0HOFS = 0; - REG_BG0VOFS = 0; - DmaFill16(3, 0, VRAM, VRAM_SIZE); - DmaFill32(3, 0, OAM, OAM_SIZE); - DmaFill16(3, 0, PLTT, PLTT_SIZE); - ResetPaletteFade(); - ResetTasks(); - ResetSpriteData(); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - REG_WIN0H = WIN_RANGE(0, 0); - REG_WIN0V = WIN_RANGE(0, 0); - REG_WIN1H = WIN_RANGE(0, 0); - REG_WIN1V = WIN_RANGE(0, 0); - REG_WININ = 0x1111; - REG_WINOUT = 0x31; - REG_BLDCNT = 0xE1; - REG_BLDALPHA = 0; - REG_BLDY = 7; - REG_IE = 1; // could be a typo of REG_IME - REG_IE |= 1; - REG_DISPSTAT |= 8; - SetVBlankCallback(sub_80BA0C0); - SetMainCallback2(sub_80BA0A8); - REG_DISPCNT = 0x7140; - taskId = CreateTask(sub_80BA258, 0); - TASK.WINDOW_SELECTED = BGM_WINDOW; - TASK.BGM_INDEX = 0; - TASK.SE_INDEX = 0; - TASK.UNK_DATA3 = 0; - gUnknown_020387B0 = 0; - TASK.UNK_DATA3 = 0; // why? - m4aSoundInit(); -} - -// Task_InitSoundCheckMenu -void sub_80BA258(u8 taskId) -{ - u8 soundcheckStr[sizeof(gDebugText_SoundCheckJap)]; - u8 bgmStr[sizeof(gDebugText_BGM)]; - u8 seStr[sizeof(gDebugText_SE)]; - u8 abDescStr[sizeof(gDebugText_ABDesc)]; - u8 upDownStr[sizeof(gDebugText_UpDown)]; - u8 driverStr[sizeof(gDebugText_DriverTest)]; - - memcpy(soundcheckStr, gDebugText_SoundCheckJap, sizeof(gDebugText_SoundCheckJap)); - memcpy(bgmStr, gDebugText_BGM, sizeof(gDebugText_BGM)); - memcpy(seStr, gDebugText_SE, sizeof(gDebugText_SE)); - memcpy(abDescStr, gDebugText_ABDesc, sizeof(gDebugText_ABDesc)); - memcpy(upDownStr, gDebugText_UpDown, sizeof(gDebugText_UpDown)); - memcpy(driverStr, gDebugText_DriverTest, sizeof(gDebugText_DriverTest)); - - if(!gPaletteFade.active) - { - MenuDrawTextWindow(0x2, 0, 0x1B, 0x3); - MenuDrawTextWindow(0x2, 0x5, 0x1B, 0xA); - MenuDrawTextWindow(0x2, 0xC, 0x1B, 0x11); - MenuPrint(soundcheckStr, 4, 1); - MenuPrint(abDescStr, 14, 1); - MenuPrint(bgmStr, 4, 6); - MenuPrint(upDownStr, 14, 6); - MenuPrint(seStr, 4, 13); - MenuPrint(upDownStr, 14, 13); - MenuPrint(driverStr, 14, 18); - TASK.FUNC = sub_80BA384; - REG_WIN0H = WIN_RANGE(17, 223); - REG_WIN0V = WIN_RANGE(1, 31); - } -} - -void sub_80BA384(u8 taskId) // Task_HandleDrawingSoundCheckMenuText -{ - sub_80BA6B8(TASK.WINDOW_SELECTED); - sub_80BA700(TASK.BGM_INDEX + BGM_STOP, 7, 8); // print by BGM index - sub_80BA79C(gBGMNames[TASK.BGM_INDEX], 11, 8); - sub_80BA700(TASK.SE_INDEX, 7, 15); - sub_80BA79C(gSENames[TASK.SE_INDEX], 11, 15); - TASK.FUNC = sub_80BA65C; -} - -#ifdef NONMATCHING -bool8 sub_80BA400(u8 taskId) // Task_ProcessSoundCheckMenuInput -{ - if(gMain.newKeys & R_BUTTON) // driver test - { - TASK.FUNC = sub_80BA800; - return FALSE; - } - if(gMain.newKeys & L_BUTTON) - { - TASK.FUNC = sub_80BAF84; - return FALSE; - } - if(gMain.newKeys & START_BUTTON) - { - TASK.FUNC = sub_80BB25C; - return FALSE; - } - if(gMain.newKeys & A_BUTTON) // both these cases insist on non reuses of certain data variables and cause the function to not match. - { - if(TASK.WINDOW_SELECTED != 0) // is playing? - { - if(TASK.UNK_DATA4 != 0) - { - if(TASK.SE_INDEX != 0) // why are you insiting on a non signed halfword? - { - m4aSongNumStop(TASK.UNK_DATA4); - } - else - { - m4aSongNumStop(TASK.SE_INDEX); - TASK.UNK_DATA4 = TASK.SE_INDEX; - return FALSE; - } - } - else if(TASK.SE_INDEX == 0) // _080BA4BA - { - return FALSE; - } - // _080BA4C4 - m4aSongNumStart(TASK.SE_INDEX); - TASK.UNK_DATA4 = TASK.SE_INDEX; - return FALSE; - } - else // _080BA4D0 - { - if(TASK.UNK_DATA3 != 0) - { - if(TASK.BGM_INDEX != 0) - { - m4aSongNumStop(TASK.UNK_DATA3 + BGM_STOP); - } - else // _080BA500 - { - m4aSongNumStop(TASK.UNK_DATA3 + BGM_STOP); - TASK.UNK_DATA3 = TASK.BGM_INDEX; - return FALSE; - } - } - else if(TASK.BGM_INDEX == 0) // _080BA514 - return FALSE; - - m4aSongNumStart(TASK.BGM_INDEX + BGM_STOP); - TASK.UNK_DATA3 = TASK.BGM_INDEX; - } - return FALSE; - } - if(gMain.newKeys & B_BUTTON) - { - m4aSongNumStart(5); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - TASK.FUNC = sub_80BA68C; - return FALSE; - } - if(gMain.newAndRepeatedKeys & DPAD_UP) - { - TASK.data[8] ^= A_BUTTON; // huh? - return TRUE; - } - if(gMain.newAndRepeatedKeys & DPAD_DOWN) - { - TASK.data[8] ^= A_BUTTON; // huh? - return TRUE; - } - else - { - u16 keys = gMain.newAndRepeatedKeys & DPAD_RIGHT; - if(keys) - { - if(TASK.WINDOW_SELECTED != 0) - { - if(TASK.SE_INDEX > 0) - { - TASK.SE_INDEX--; - } - else - { - TASK.SE_INDEX = 0xF7; - } - } - else if(TASK.BGM_INDEX > 0) - { - TASK.BGM_INDEX--; - } - else - { - TASK.BGM_INDEX = 0x75; - } - return TRUE; - } - if(gMain.newAndRepeatedKeys & DPAD_LEFT) - { - if(TASK.WINDOW_SELECTED != 0) - { - if(TASK.SE_INDEX < 0xF7) - { - TASK.SE_INDEX++; - } - else - { - TASK.SE_INDEX = keys; // ?? - } - } - else if(TASK.BGM_INDEX < 0x75) - { - TASK.BGM_INDEX++; - return TRUE; - } - else - { - TASK.BGM_INDEX = TASK.SE_INDEX; - return TRUE; - } - return TRUE; - } - if(gMain.heldKeys & SELECT_BUTTON) - { - gUnknown_020387B0 = A_BUTTON; - return FALSE; - } - else - { - gUnknown_020387B0 = (gMain.heldKeys & SELECT_BUTTON); - return FALSE; - } - } -} -#else -__attribute__((naked)) -bool8 sub_80BA400(u8 taskId) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - sub sp, 0x4\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - ldr r2, _080BA428 @ =gMain\n\ - ldrh r1, [r2, 0x2E]\n\ - movs r0, 0x80\n\ - lsls r0, 1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080BA434\n\ - ldr r0, _080BA42C @ =gTasks\n\ - lsls r1, r4, 2\n\ - adds r1, r4\n\ - lsls r1, 3\n\ - adds r1, r0\n\ - ldr r0, _080BA430 @ =sub_80BA800\n\ - str r0, [r1]\n\ - b _080BA64C\n\ - .align 2, 0\n\ -_080BA428: .4byte gMain\n\ -_080BA42C: .4byte gTasks\n\ -_080BA430: .4byte sub_80BA800\n\ -_080BA434:\n\ - movs r0, 0x80\n\ - lsls r0, 2\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080BA458\n\ - ldr r0, _080BA450 @ =gTasks\n\ - lsls r1, r4, 2\n\ - adds r1, r4\n\ - lsls r1, 3\n\ - adds r1, r0\n\ - ldr r0, _080BA454 @ =sub_80BAF84\n\ - str r0, [r1]\n\ - b _080BA64C\n\ - .align 2, 0\n\ -_080BA450: .4byte gTasks\n\ -_080BA454: .4byte sub_80BAF84\n\ -_080BA458:\n\ - movs r0, 0x8\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080BA478\n\ - ldr r0, _080BA470 @ =gTasks\n\ - lsls r1, r4, 2\n\ - adds r1, r4\n\ - lsls r1, 3\n\ - adds r1, r0\n\ - ldr r0, _080BA474 @ =sub_80BB25C\n\ - str r0, [r1]\n\ - b _080BA64C\n\ - .align 2, 0\n\ -_080BA470: .4byte gTasks\n\ -_080BA474: .4byte sub_80BB25C\n\ -_080BA478:\n\ - movs r6, 0x1\n\ - movs r5, 0x1\n\ - ands r5, r1\n\ - cmp r5, 0\n\ - beq _080BA538\n\ - ldr r0, _080BA4AC @ =gTasks\n\ - lsls r1, r4, 2\n\ - adds r1, r4\n\ - lsls r1, 3\n\ - adds r5, r1, r0\n\ - movs r1, 0x8\n\ - ldrsh r0, [r5, r1]\n\ - cmp r0, 0\n\ - beq _080BA4D0\n\ - movs r2, 0x10\n\ - ldrsh r0, [r5, r2]\n\ - cmp r0, 0\n\ - beq _080BA4BA\n\ - movs r3, 0xC\n\ - ldrsh r4, [r5, r3]\n\ - cmp r4, 0\n\ - beq _080BA4B0\n\ - ldrh r0, [r5, 0x10]\n\ - bl m4aSongNumStop\n\ - b _080BA4C4\n\ - .align 2, 0\n\ -_080BA4AC: .4byte gTasks\n\ -_080BA4B0:\n\ - ldrh r0, [r5, 0x10]\n\ - bl m4aSongNumStop\n\ - strh r4, [r5, 0x10]\n\ - b _080BA64C\n\ -_080BA4BA:\n\ - movs r4, 0xC\n\ - ldrsh r0, [r5, r4]\n\ - cmp r0, 0\n\ - bne _080BA4C4\n\ - b _080BA64C\n\ -_080BA4C4:\n\ - ldrh r0, [r5, 0xC]\n\ - bl m4aSongNumStart\n\ - ldrh r0, [r5, 0xC]\n\ - strh r0, [r5, 0x10]\n\ - b _080BA64C\n\ -_080BA4D0:\n\ - ldrh r1, [r5, 0xE]\n\ - movs r2, 0xE\n\ - ldrsh r0, [r5, r2]\n\ - cmp r0, 0\n\ - beq _080BA514\n\ - movs r3, 0xA\n\ - ldrsh r4, [r5, r3]\n\ - cmp r4, 0\n\ - beq _080BA500\n\ - ldr r0, _080BA4FC @ =0x0000015d\n\ - adds r4, r0, 0\n\ - adds r0, r1, r4\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - bl m4aSongNumStop\n\ - ldrh r1, [r5, 0xA]\n\ - adds r4, r1\n\ - lsls r4, 16\n\ - lsrs r4, 16\n\ - adds r0, r4, 0\n\ - b _080BA528\n\ - .align 2, 0\n\ -_080BA4FC: .4byte 0x0000015d\n\ -_080BA500:\n\ - ldr r2, _080BA510 @ =0x0000015d\n\ - adds r0, r1, r2\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - bl m4aSongNumStop\n\ - strh r4, [r5, 0xE]\n\ - b _080BA64C\n\ - .align 2, 0\n\ -_080BA510: .4byte 0x0000015d\n\ -_080BA514:\n\ - ldrh r1, [r5, 0xA]\n\ - movs r3, 0xA\n\ - ldrsh r0, [r5, r3]\n\ - cmp r0, 0\n\ - bne _080BA520\n\ - b _080BA64C\n\ -_080BA520:\n\ - ldr r4, _080BA534 @ =0x0000015d\n\ - adds r0, r1, r4\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ -_080BA528:\n\ - bl m4aSongNumStart\n\ - ldrh r0, [r5, 0xA]\n\ - strh r0, [r5, 0xE]\n\ - b _080BA64C\n\ - .align 2, 0\n\ -_080BA534: .4byte 0x0000015d\n\ -_080BA538:\n\ - movs r0, 0x2\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080BA570\n\ - movs r0, 0x5\n\ - bl m4aSongNumStart\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - str r5, [sp]\n\ - movs r1, 0\n\ - movs r2, 0\n\ - movs r3, 0x10\n\ - bl BeginNormalPaletteFade\n\ - ldr r1, _080BA568 @ =gTasks\n\ - lsls r0, r4, 2\n\ - adds r0, r4\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - ldr r1, _080BA56C @ =sub_80BA68C\n\ - str r1, [r0]\n\ - b _080BA64C\n\ - .align 2, 0\n\ -_080BA568: .4byte gTasks\n\ -_080BA56C: .4byte sub_80BA68C\n\ -_080BA570:\n\ - ldrh r1, [r2, 0x30]\n\ - movs r0, 0x40\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _080BA582\n\ - movs r0, 0x80\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080BA59C\n\ -_080BA582:\n\ - ldr r0, _080BA598 @ =gTasks\n\ - lsls r1, r4, 2\n\ - adds r1, r4\n\ - lsls r1, 3\n\ - adds r1, r0\n\ - ldrh r0, [r1, 0x8]\n\ - eors r0, r6\n\ - strh r0, [r1, 0x8]\n\ -_080BA592:\n\ - movs r0, 0x1\n\ - b _080BA64E\n\ - .align 2, 0\n\ -_080BA598: .4byte gTasks\n\ -_080BA59C:\n\ - movs r0, 0x10\n\ - ands r0, r1\n\ - lsls r0, 16\n\ - lsrs r3, r0, 16\n\ - cmp r3, 0\n\ - beq _080BA5EA\n\ - ldr r0, _080BA5CC @ =gTasks\n\ - lsls r1, r4, 2\n\ - adds r1, r4\n\ - lsls r1, 3\n\ - adds r1, r0\n\ - movs r2, 0x8\n\ - ldrsh r0, [r1, r2]\n\ - cmp r0, 0\n\ - beq _080BA5D6\n\ - ldrh r2, [r1, 0xC]\n\ - movs r3, 0xC\n\ - ldrsh r0, [r1, r3]\n\ - cmp r0, 0\n\ - ble _080BA5D0\n\ - subs r0, r2, 0x1\n\ - strh r0, [r1, 0xC]\n\ - b _080BA592\n\ - .align 2, 0\n\ -_080BA5CC: .4byte gTasks\n\ -_080BA5D0:\n\ - movs r0, 0xF7\n\ - strh r0, [r1, 0xC]\n\ - b _080BA592\n\ -_080BA5D6:\n\ - ldrh r2, [r1, 0xA]\n\ - movs r4, 0xA\n\ - ldrsh r0, [r1, r4]\n\ - cmp r0, 0\n\ - ble _080BA5E4\n\ - subs r0, r2, 0x1\n\ - b _080BA5E6\n\ -_080BA5E4:\n\ - movs r0, 0x75\n\ -_080BA5E6:\n\ - strh r0, [r1, 0xA]\n\ - b _080BA592\n\ -_080BA5EA:\n\ - movs r0, 0x20\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _080BA630\n\ - ldr r1, _080BA614 @ =gTasks\n\ - lsls r0, r4, 2\n\ - adds r0, r4\n\ - lsls r0, 3\n\ - adds r1, r0, r1\n\ - movs r0, 0x8\n\ - ldrsh r2, [r1, r0]\n\ - cmp r2, 0\n\ - beq _080BA61C\n\ - ldrh r2, [r1, 0xC]\n\ - movs r4, 0xC\n\ - ldrsh r0, [r1, r4]\n\ - cmp r0, 0xF6\n\ - bgt _080BA618\n\ - adds r0, r2, 0x1\n\ - strh r0, [r1, 0xC]\n\ - b _080BA592\n\ - .align 2, 0\n\ -_080BA614: .4byte gTasks\n\ -_080BA618:\n\ - strh r3, [r1, 0xC]\n\ - b _080BA592\n\ -_080BA61C:\n\ - ldrh r3, [r1, 0xA]\n\ - movs r4, 0xA\n\ - ldrsh r0, [r1, r4]\n\ - cmp r0, 0x74\n\ - bgt _080BA62C\n\ - adds r0, r3, 0x1\n\ - strh r0, [r1, 0xA]\n\ - b _080BA592\n\ -_080BA62C:\n\ - strh r2, [r1, 0xA]\n\ - b _080BA592\n\ -_080BA630:\n\ - ldrh r1, [r2, 0x2C]\n\ - movs r0, 0x4\n\ - ands r0, r1\n\ - lsls r0, 16\n\ - lsrs r1, r0, 16\n\ - cmp r1, 0\n\ - beq _080BA648\n\ - ldr r0, _080BA644 @ =gUnknown_020387B0\n\ - strb r6, [r0]\n\ - b _080BA64C\n\ - .align 2, 0\n\ -_080BA644: .4byte gUnknown_020387B0\n\ -_080BA648:\n\ - ldr r0, _080BA658 @ =gUnknown_020387B0\n\ - strb r1, [r0]\n\ -_080BA64C:\n\ - movs r0, 0\n\ -_080BA64E:\n\ - add sp, 0x4\n\ - pop {r4-r6}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_080BA658: .4byte gUnknown_020387B0\n\ - .syntax divided"); -} -#endif - -void sub_80BA65C(u8 taskId) -{ - if(sub_80BA400(taskId) != FALSE) - TASK.FUNC = sub_80BA384; -} - -void sub_80BA68C(u8 taskId) -{ - if(!gPaletteFade.active) - { - DestroyTask(taskId); - SetMainCallback2(CB2_InitTitleScreen); - } -} - -void sub_80BA6B8(u8 windowType) -{ - switch(windowType) - { - case BGM_WINDOW: - default: - REG_WIN1H = WIN_RANGE(17, 223); - REG_WIN1V = WIN_RANGE(41, 87); - break; - case SE_WINDOW: - REG_WIN1H = WIN_RANGE(17, 223); - REG_WIN1V = WIN_RANGE(97, 143); - break; - } -} - -void sub_80BA700(u16 soundIndex, u16 x, u16 y) // PrintSoundNumber ? -{ - u8 i; - u8 str[5]; - bool8 someBool; - u8 divisorValue; - - for(i = 0; i < 3; i++) - str[i] = 0; // initialize array - - str[3] = CHAR_ELLIPSIS; - str[4] = EOS; - someBool = FALSE; - - divisorValue = soundIndex / 100; - if(divisorValue) - { - str[0] = divisorValue + CHAR_0; - someBool = TRUE; - } - - divisorValue = (soundIndex % 100) / 10; - if(divisorValue || someBool != FALSE) - str[1] = divisorValue + CHAR_0; - - str[2] = ((soundIndex % 100) % 10) + CHAR_0; - MenuPrint(str, x, y); -} - -void sub_80BA79C(const u8 *const string, u16 x, u16 y) -{ - u8 i; - u8 str[11]; - - for(i = 0; i < 11; i++) - str[i] = 0; // format string. - - str[10] = EOS; // the above for loop formats the last element of the array unnecessarily. - - for(i = 0; string[i] != EOS && i < 10; i++) - str[i] = string[i]; - - MenuPrint(str, x, y); -} - -void sub_80BA800(u8 taskId) // Task_DrawDriverTestMenu -{ - u8 bbackStr[sizeof(gDebugText_BBack)]; - u8 aplayStr[sizeof(gDebugText_APlay)]; - u8 voiceStr[sizeof(gDebugText_Voice)]; - u8 volumeStr[sizeof(gDebugText_Volume)]; - u8 panpotStr[sizeof(gDebugText_Panpot)]; - u8 pitchStr[sizeof(gDebugText_Pitch)]; - u8 lengthStr[sizeof(gDebugText_Length)]; - u8 releaseStr[sizeof(gDebugText_Release)]; - u8 progressStr[sizeof(gDebugText_Progress)]; - u8 chorusStr[sizeof(gDebugText_Chorus)]; - u8 priorityStr[sizeof(gDebugText_Priority)]; - u8 playingStr[sizeof(gDebugText_Playing)]; - u8 reverseStr[sizeof(gDebugText_Reverse)]; - u8 stereoStr[sizeof(gDebugText_Stereo)]; - - memcpy(bbackStr, gDebugText_BBack, sizeof(gDebugText_BBack)); - memcpy(aplayStr, gDebugText_APlay, sizeof(gDebugText_APlay)); - memcpy(voiceStr, gDebugText_Voice, sizeof(gDebugText_Voice)); - memcpy(volumeStr, gDebugText_Volume, sizeof(gDebugText_Volume)); - memcpy(panpotStr, gDebugText_Panpot, sizeof(gDebugText_Panpot)); - memcpy(pitchStr, gDebugText_Pitch, sizeof(gDebugText_Pitch)); - memcpy(lengthStr, gDebugText_Length, sizeof(gDebugText_Length)); - memcpy(releaseStr, gDebugText_Release, sizeof(gDebugText_Release)); - memcpy(progressStr, gDebugText_Progress, sizeof(gDebugText_Progress)); - memcpy(chorusStr, gDebugText_Chorus, sizeof(gDebugText_Chorus)); - memcpy(priorityStr, gDebugText_Priority, sizeof(gDebugText_Priority)); - memcpy(playingStr, gDebugText_Playing, sizeof(gDebugText_Playing)); - memcpy(reverseStr, gDebugText_Reverse, sizeof(gDebugText_Reverse)); - memcpy(stereoStr, gDebugText_Stereo, sizeof(gDebugText_Stereo)); - - REG_DISPCNT = 0x3140; - MenuDrawTextWindow(0, 0, 0x1D, 0x13); - MenuPrint(bbackStr, 0x13, 0x4); - MenuPrint(aplayStr, 0x13, 0x2); - MenuPrint(voiceStr, 0x2, 0x1); - MenuPrint(volumeStr, 0x2, 0x3); - MenuPrint(panpotStr, 0x2, 0x5); - MenuPrint(pitchStr, 0x2, 0x7); - MenuPrint(lengthStr, 0x2, 0x9); - MenuPrint(releaseStr, 0x2, 0xB); - MenuPrint(progressStr, 0x2, 0xD); - MenuPrint(chorusStr, 0x2, 0xF); - MenuPrint(priorityStr, 0x2, 0x11); - MenuPrint(playingStr, 0x13, 0x10); - MenuPrint(reverseStr, 0x13, 0xE); - MenuPrint(stereoStr, 0x13, 0xC); - REG_WIN0H = WIN_RANGE(0, 240); - REG_WIN0V = WIN_RANGE(0, 160); - gUnknown_020387B3 = 0; - gUnknown_020387B1 = 0; - gUnknown_020387B2 = 0; - gUnknown_03005D30 = NULL; - gUnknown_020387D8 = 0; - gUnknown_020387D9 = 1; - gUnknown_020387B4[CRY_TEST_UNK0] = 0; - gUnknown_020387B4[CRY_TEST_VOLUME] = 0x78; - gUnknown_020387B4[CRY_TEST_PANPOT] = 0; - gUnknown_020387B4[CRY_TEST_PITCH] = 0x3C00; - gUnknown_020387B4[CRY_TEST_LENGTH] = 0xB4; - gUnknown_020387B4[CRY_TEST_PROGRESS] = 0; - gUnknown_020387B4[CRY_TEST_RELEASE] = 0; - gUnknown_020387B4[CRY_TEST_CHORUS] = 0; - gUnknown_020387B4[CRY_TEST_PRIORITY] = 2; - sub_80BAD5C(); - sub_80BAE10(0, 0); - TASK.FUNC = sub_80BAA48; -} - -void sub_80BAA48(u8 taskId) // Task_ProcessDriverTestInput -{ - if(gMain.newKeys & B_BUTTON) - { - REG_DISPCNT = 0x7140; - REG_WIN0H = WIN_RANGE(17, 223); - REG_WIN0V = WIN_RANGE(1, 31); - MenuZeroFillWindowRect(0, 0, 0x1D, 0x13); - TASK.FUNC = sub_80BA258; - return; - } - if(gMain.newAndRepeatedKeys & DPAD_UP) // _080BAAA8 - { - u8 backupVar = gUnknown_020387B3; - if(--gUnknown_020387B3 < 0) - gUnknown_020387B3 = 8; - - sub_80BAE10(backupVar, gUnknown_020387B3); - return; - } - if(gMain.newAndRepeatedKeys & DPAD_DOWN) // _080BAAD0 - { - u8 backupVar = gUnknown_020387B3; - if(++gUnknown_020387B3 > 8) - gUnknown_020387B3 = 0; - - sub_80BAE10(backupVar, gUnknown_020387B3); - return; - } - if(gMain.newKeys & START_BUTTON) // _080BAAF8 - { - gUnknown_020387D8 ^= 1; - sub_80BAD5C(); - return; - } - if(gMain.newKeys & SELECT_BUTTON) // _080BAB14 - { - gUnknown_020387D9 ^= 1; - sub_80BAD5C(); - SetPokemonCryStereo(gUnknown_020387D9); - return; - } - if(gMain.newAndRepeatedKeys & R_BUTTON) // _080BAB38 - { - sub_80BACDC(10); - sub_80BAD5C(); - return; - } - if(gMain.newAndRepeatedKeys & L_BUTTON) // _080BAB46 - { - sub_80BACDC(-10); - sub_80BAD5C(); - return; - } - if(gMain.newAndRepeatedKeys & DPAD_LEFT) // _080BAB56 - { - sub_80BACDC(-1); - sub_80BAD5C(); - return; - } - if(gMain.newAndRepeatedKeys & DPAD_RIGHT) // _080BAB64 - { - sub_80BACDC(1); - sub_80BAD5C(); - return; - } - if(gMain.newKeys & A_BUTTON) // _080BAB78 - { - u8 divide, remaining; - - SetPokemonCryVolume(gUnknown_020387B4[CRY_TEST_VOLUME]); - SetPokemonCryPanpot(gUnknown_020387B4[CRY_TEST_PANPOT]); - SetPokemonCryPitch(gUnknown_020387B4[CRY_TEST_PITCH]); - SetPokemonCryLength(gUnknown_020387B4[CRY_TEST_LENGTH]); - SetPokemonCryProgress(gUnknown_020387B4[CRY_TEST_PROGRESS]); - SetPokemonCryRelease(gUnknown_020387B4[CRY_TEST_RELEASE]); - SetPokemonCryChorus(gUnknown_020387B4[CRY_TEST_CHORUS]); - SetPokemonCryPriority(gUnknown_020387B4[CRY_TEST_PRIORITY]); - - remaining = gUnknown_020387B4[CRY_TEST_UNK0] % 128; - divide = gUnknown_020387B4[CRY_TEST_UNK0] / 128; - - switch(divide) - { - case 0: - if(gUnknown_020387D8) - gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_84537C0[remaining]); - else - gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8452590[remaining]); - break; - case 1: - if(gUnknown_020387D8) - gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8453DC0[remaining]); - else - gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8452B90[remaining]); - break; - case 2: - if(gUnknown_020387D8) - gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_84543C0[remaining]); - else - gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8453190[remaining]); - break; - case 3: - if(gUnknown_020387D8) - gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_84549C0[remaining]); - else - gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8453790[remaining]); - break; - } - } - - // _080BACA2 - if(gUnknown_03005D30 != NULL) - { - gUnknown_020387B1 = IsPokemonCryPlaying(gUnknown_03005D30); - - if(gUnknown_020387B1 != gUnknown_020387B2) - sub_80BAD5C(); - - gUnknown_020387B2 = gUnknown_020387B1; - } -} - -void sub_80BACDC(s8 var) -{ - int minMaxArray[ARRAY_COUNT(gUnknown_083D039C)]; - - memcpy(minMaxArray, gUnknown_083D039C, sizeof(gUnknown_083D039C)); - gUnknown_020387B4[gUnknown_020387B3] += var; - - if(gUnknown_020387B4[gUnknown_020387B3] > minMaxArray[MULTI_DIM_ARR(gUnknown_020387B3, B_16, MAX)]) - gUnknown_020387B4[gUnknown_020387B3] = minMaxArray[MULTI_DIM_ARR(gUnknown_020387B3, B_16, MIN)]; - - if(gUnknown_020387B4[gUnknown_020387B3] < minMaxArray[MULTI_DIM_ARR(gUnknown_020387B3, B_16, MIN)]) - gUnknown_020387B4[gUnknown_020387B3] = minMaxArray[MULTI_DIM_ARR(gUnknown_020387B3, B_16, MAX)]; -} - -void sub_80BAD5C(void) -{ - sub_80BAE78(gUnknown_020387B4[CRY_TEST_UNK0] + 1, 0xB, 0x1, 0x5); - sub_80BAE78(gUnknown_020387B4[CRY_TEST_VOLUME], 0xB, 0x3, 0x5); - sub_80BAE78(gUnknown_020387B4[CRY_TEST_PANPOT], 0xB, 0x5, 0x5); - sub_80BAE78(gUnknown_020387B4[CRY_TEST_PITCH], 0xB, 0x7, 0x5); - sub_80BAE78(gUnknown_020387B4[CRY_TEST_LENGTH], 0xB, 0x9, 0x5); - sub_80BAE78(gUnknown_020387B4[CRY_TEST_RELEASE], 0xB, 0xB, 0x5); - sub_80BAE78(gUnknown_020387B4[CRY_TEST_PROGRESS], 0xB, 0xD, 0x5); - sub_80BAE78(gUnknown_020387B4[CRY_TEST_CHORUS], 0xB, 0xF, 0x5); - sub_80BAE78(gUnknown_020387B4[CRY_TEST_PRIORITY], 0xB, 0x11, 0x5); - sub_80BAE78(gUnknown_020387B1, 0x1B, 0x10, 0x1); - sub_80BAE78(gUnknown_020387D8, 0x1B, 0xE, 0x1); - sub_80BAE78(gUnknown_020387D9, 0x1B, 0xC, 0x1); -} - -void sub_80BAE10(u8 var1, u8 var2) -{ - u8 str1[sizeof(gUnknown_083D03DC)]; - u8 str2[sizeof(gUnknown_083D03DE)]; - - memcpy(str1, gUnknown_083D03DC, sizeof(gUnknown_083D03DC)); - memcpy(str2, gUnknown_083D03DE, sizeof(gUnknown_083D03DE)); - - MenuPrint(str2, gUnknown_083D0300[MULTI_DIM_ARR(var1, B_16, 0)], gUnknown_083D0300[MULTI_DIM_ARR(var1, B_16, 1)]); - MenuPrint(str1, gUnknown_083D0300[MULTI_DIM_ARR(var2, B_16, 0)], gUnknown_083D0300[MULTI_DIM_ARR(var2, B_16, 1)]); -} - -/*void sub_80BAE78(int var1, u16 var2, u16 var3, u8 var4) -{ - u32 powers[6]; - u8 str[8]; - u8 i; - u8 someVar, someVar2; - - memcpy(powers, gUnknown_083D03E0, sizeof(powers); - - for(i = 0; i < var4; i++) - str[i] = 0; - - str[var4 + 1] = CHAR_0; - someVar = 0; - - if(var1 < 0) // make absolute value? wtf - { - var1 = -var1; // just use abs? - someVar = 1; - } - - // _080BAED6 - someVar2 = 0; - if(var4 == 1) - someVar2 = 1; - - // _080BAEE2 - for(;;) - { - - } -}*/ - -// no. -__attribute__((naked)) -void sub_80BAE78(int var1, u16 var2, u16 var3, u8 var4) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x2C\n\ - mov r8, r0\n\ - lsls r1, 16\n\ - lsrs r6, r1, 16\n\ - lsls r2, 16\n\ - lsrs r2, 16\n\ - lsls r3, 24\n\ - lsrs r7, r3, 24\n\ - mov r1, sp\n\ - ldr r0, _080BAF80 @ =gUnknown_083D03E0\n\ - ldm r0!, {r3-r5}\n\ - stm r1!, {r3-r5}\n\ - ldm r0!, {r3-r5}\n\ - stm r1!, {r3-r5}\n\ - movs r5, 0\n\ - add r0, sp, 0x18\n\ - mov r9, r0\n\ - cmp r5, r7\n\ - bgt _080BAEC0\n\ - mov r4, r9\n\ - movs r3, 0\n\ -_080BAEAC:\n\ - lsls r0, r5, 24\n\ - asrs r0, 24\n\ - adds r1, r4, r0\n\ - strb r3, [r1]\n\ - adds r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - asrs r0, 24\n\ - cmp r0, r7\n\ - ble _080BAEAC\n\ -_080BAEC0:\n\ - adds r0, r7, 0x1\n\ - add r0, r9\n\ - movs r1, 0xFF\n\ - strb r1, [r0]\n\ - movs r1, 0\n\ - mov r3, r8\n\ - cmp r3, 0\n\ - bge _080BAED6\n\ - negs r3, r3\n\ - mov r8, r3\n\ - movs r1, 0x1\n\ -_080BAED6:\n\ - movs r4, 0\n\ - mov r10, r4\n\ - cmp r7, 0x1\n\ - bne _080BAEE2\n\ - movs r5, 0x1\n\ - mov r10, r5\n\ -_080BAEE2:\n\ - subs r0, r7, 0x1\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - lsls r0, r5, 24\n\ - lsls r6, 24\n\ - str r6, [sp, 0x24]\n\ - lsls r2, 24\n\ - str r2, [sp, 0x28]\n\ - cmp r0, 0\n\ - blt _080BAF62\n\ - str r1, [sp, 0x20]\n\ -_080BAEF8:\n\ - asrs r6, r0, 24\n\ - lsls r0, r6, 2\n\ - add r0, sp\n\ - ldr r1, [r0]\n\ - mov r0, r8\n\ - bl __divsi3\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - cmp r0, 0\n\ - bne _080BAF1A\n\ - mov r0, r10\n\ - cmp r0, 0\n\ - bne _080BAF1A\n\ - lsls r4, r5, 24\n\ - cmp r6, 0\n\ - bne _080BAF46\n\ -_080BAF1A:\n\ - lsls r4, r5, 24\n\ - ldr r3, [sp, 0x20]\n\ - cmp r3, 0\n\ - beq _080BAF34\n\ - mov r5, r10\n\ - cmp r5, 0\n\ - bne _080BAF34\n\ - asrs r0, r4, 24\n\ - subs r0, r7, r0\n\ - subs r0, 0x1\n\ - add r0, r9\n\ - movs r1, 0xAE\n\ - strb r1, [r0]\n\ -_080BAF34:\n\ - asrs r1, r4, 24\n\ - subs r1, r7, r1\n\ - add r1, r9\n\ - lsls r0, r2, 24\n\ - asrs r0, 24\n\ - subs r0, 0x5F\n\ - strb r0, [r1]\n\ - movs r0, 0x1\n\ - mov r10, r0\n\ -_080BAF46:\n\ - asrs r4, 24\n\ - lsls r0, r4, 2\n\ - add r0, sp\n\ - ldr r1, [r0]\n\ - mov r0, r8\n\ - bl __modsi3\n\ - mov r8, r0\n\ - subs r4, 0x1\n\ - lsls r4, 24\n\ - lsrs r5, r4, 24\n\ - lsls r0, r5, 24\n\ - cmp r0, 0\n\ - bge _080BAEF8\n\ -_080BAF62:\n\ - ldr r3, [sp, 0x24]\n\ - lsrs r1, r3, 24\n\ - ldr r4, [sp, 0x28]\n\ - lsrs r2, r4, 24\n\ - mov r0, r9\n\ - bl MenuPrint\n\ - add sp, 0x2C\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080BAF80: .4byte gUnknown_083D03E0\n\ - .syntax divided"); -} - -void sub_80BAF84(u8 taskId) -{ - u8 seStr[sizeof(gOtherText_SE)]; - u8 panStr[sizeof(gOtherText_Pan)]; - u8 playingStr[sizeof(gDebugText_Playing)]; - - memcpy(seStr, gOtherText_SE, sizeof(gOtherText_SE)); - memcpy(panStr, gOtherText_Pan, sizeof(gOtherText_Pan)); - memcpy(playingStr, gDebugText_Playing, sizeof(gDebugText_Playing)); - - REG_DISPCNT = 0x3140; - MenuDrawTextWindow(0, 0, 0x1D, 0x13); - MenuPrint(seStr, 3, 2); - MenuPrint(panStr, 3, 4); - MenuPrint(playingStr, 3, 8); - REG_WIN0H = WIN_RANGE(0, 240); - REG_WIN0V = WIN_RANGE(0, 160); - gUnknown_020387B4[CRY_TEST_UNK0] = 1; - gUnknown_020387B4[CRY_TEST_PANPOT] = 0; - gUnknown_020387B4[CRY_TEST_CHORUS] = 0; - gUnknown_020387B4[CRY_TEST_PROGRESS] = 0; - gUnknown_020387B4[CRY_TEST_RELEASE] = 0; - sub_80BB1D4(); - TASK.FUNC = sub_80BB038; -} - -void sub_80BB038(u8 taskId) -{ - sub_80BB1D4(); - if(gUnknown_020387B4[CRY_TEST_PROGRESS]) - { - if(gUnknown_020387B4[CRY_TEST_RELEASE]) - { - gUnknown_020387B4[CRY_TEST_RELEASE]--; - } - else // _080BB05C - { - s8 panpot = gUnknown_083D03F8[gUnknown_020387B4[CRY_TEST_PANPOT]]; - if(panpot != -128) - { - if(panpot == 0x7F) - { - gUnknown_020387B4[CRY_TEST_CHORUS] += 2; - if(gUnknown_020387B4[CRY_TEST_CHORUS] < 0x3F) - SE12PanpotControl(gUnknown_020387B4[CRY_TEST_CHORUS]); - } - } - else // _080BB08C - { - gUnknown_020387B4[CRY_TEST_CHORUS] -= 2; - if(gUnknown_020387B4[CRY_TEST_CHORUS] > -0x40) - SE12PanpotControl(gUnknown_020387B4[CRY_TEST_CHORUS]); - } - } - } - // _080BB0A2 - if(gMain.newKeys & B_BUTTON) - { - REG_DISPCNT = 0x7140; - REG_WIN0H = WIN_RANGE(17, 223); - REG_WIN0V = WIN_RANGE(1, 31); - MenuZeroFillWindowRect(0, 0, 0x1D, 0x13); - TASK.FUNC = sub_80BA258; - return; - } - if(gMain.newKeys & A_BUTTON) // _080BB104 - { - s8 panpot = gUnknown_083D03F8[gUnknown_020387B4[CRY_TEST_PANPOT]]; - if(panpot != -128) - { - if(panpot == 0x7F) - { - PlaySE12WithPanning(gUnknown_020387B4[CRY_TEST_UNK0], -0x40); - gUnknown_020387B4[CRY_TEST_CHORUS] = -0x40; - gUnknown_020387B4[CRY_TEST_PROGRESS] = 1; - gUnknown_020387B4[CRY_TEST_RELEASE] = 0x1E; - return; - } - } - else // _080BB140 - { - PlaySE12WithPanning(gUnknown_020387B4[CRY_TEST_UNK0], 0x3F); - gUnknown_020387B4[CRY_TEST_CHORUS] = 0x3F; - gUnknown_020387B4[CRY_TEST_PROGRESS] = 1; - gUnknown_020387B4[CRY_TEST_RELEASE] = 0x1E; - return; - } - // _080BB154 - PlaySE12WithPanning(gUnknown_020387B4[CRY_TEST_UNK0], panpot); - gUnknown_020387B4[CRY_TEST_PROGRESS] = 0; - return; - } - if(gMain.newKeys & L_BUTTON) // _080BB15E - { - gUnknown_020387B4[CRY_TEST_PANPOT]++; - if(gUnknown_020387B4[CRY_TEST_PANPOT] > 4) - gUnknown_020387B4[CRY_TEST_PANPOT] = 0; - } - if(gMain.newKeys & R_BUTTON) // _080BB176 - { - gUnknown_020387B4[CRY_TEST_PANPOT]--; - if(gUnknown_020387B4[CRY_TEST_PANPOT] < 0) - gUnknown_020387B4[CRY_TEST_PANPOT] = 4; - } - if(gMain.newAndRepeatedKeys & DPAD_RIGHT) // _080BB192 - { - gUnknown_020387B4[CRY_TEST_UNK0]++; - if(gUnknown_020387B4[CRY_TEST_UNK0] > 0xF7) - gUnknown_020387B4[CRY_TEST_UNK0] = 0; - } - else if(gMain.newAndRepeatedKeys & DPAD_LEFT) // _080BB1B0 - { - gUnknown_020387B4[CRY_TEST_UNK0]--; - if(gUnknown_020387B4[CRY_TEST_UNK0] < 0) - gUnknown_020387B4[CRY_TEST_UNK0] = 0xF7; - } -} - -void sub_80BB1D4(void) -{ - u8 lrStr[sizeof(gOtherText_LR)]; - u8 rlStr[sizeof(gOtherText_RL)]; - - memcpy(lrStr, gOtherText_LR, sizeof(lrStr)); - memcpy(rlStr, gOtherText_RL, sizeof(rlStr)); - - sub_80BAE78(gUnknown_020387B4[CRY_TEST_UNK0], 7, 2, 3); - - switch(gUnknown_083D03F8[gUnknown_020387B4[CRY_TEST_PANPOT]]) - { - case 0x7F: - MenuPrint(lrStr, 7, 4); - break; - case -0x80: - MenuPrint(rlStr, 7, 4); - break; - default: - sub_80BAE78(gUnknown_083D03F8[gUnknown_020387B4[CRY_TEST_PANPOT]], 7, 4, 3); - break; - } - sub_80BAE78(IsSEPlaying(), 12, 8, 1); -} - -void sub_80BB25C(u8 taskId) -{ - struct CryRelatedStruct cryStruct, cryStruct2; - u8 zero; - - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); - gUnknown_03005D34 = 1; - ResetSpriteData(); - FreeAllSpritePalettes(); - - cryStruct.unk0 = 0x2000; - cryStruct.unk2 = 29; - cryStruct.paletteNo = 12; - cryStruct.yPos = 30; - cryStruct.xPos = 4; - - zero = 0; // wtf? - gUnknown_03005E98 = 0; - - while(sub_8119E3C(&cryStruct, 3) == FALSE); - - cryStruct2.unk0 = 0; - cryStruct2.unk2 = 15; - cryStruct2.paletteNo = 13; - cryStruct2.xPos = 12; - cryStruct2.yPos = 12; - - zero = 0; // wtf? - gUnknown_03005E98 = 0; - - while(ShowPokedexCryScreen(&cryStruct2, 2) == FALSE); - - MenuDrawTextWindow(0, 16, 5, 19); - sub_80BB494(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - REG_BG2HOFS = 0; - REG_BG2VOFS = 0; - REG_BG2CNT = 0xF01; - REG_BG3CNT = 0x1D03; - REG_DISPCNT = 0x1d40; - m4aMPlayFadeOutTemporarily(&gMPlay_BGM, 2); - TASK.FUNC = sub_80BB3B4; -} - -void sub_80BB3B4(u8 taskId) -{ - sub_8119F88(3); - - if(gMain.newKeys & A_BUTTON) - { - sub_811A050(gUnknown_03005D34); - } - if(gMain.newKeys & R_BUTTON) - { - StopCryAndClearCrySongs(); - } - if(gMain.newAndRepeatedKeys & DPAD_UP) - { - if(--gUnknown_03005D34 == 0) - gUnknown_03005D34 = 384; // total species - sub_80BB494(); - } - if(gMain.newAndRepeatedKeys & DPAD_DOWN) - { - if(++gUnknown_03005D34 > 384) - gUnknown_03005D34 = 1; - sub_80BB494(); - } - if(gMain.newKeys & B_BUTTON) - { - REG_DISPCNT = 0x7140; - REG_WIN0H = WIN_RANGE(17, 223); - REG_WIN0V = WIN_RANGE(1, 31); - MenuZeroFillWindowRect(0, 0, 0x1D, 0x13); - TASK.FUNC = sub_80BA258; - DestroyCryMeterNeedleSprite(); - } -} - -void sub_80BB494(void) -{ - sub_80BAE78(gUnknown_03005D34, 1, 17, 3); -} diff --git a/src/trade.c b/src/trade.c deleted file mode 100644 index cb190d194..000000000 --- a/src/trade.c +++ /dev/null @@ -1,88 +0,0 @@ -#include "global.h" -#include "name_string_util.h" -#include "string_util.h" -#include "text.h" - -struct InGameTrade { - /*0x00*/ u8 name[11]; - /*0x0C*/ u16 species; - /*0x0E*/ u8 ivs[6]; - /*0x14*/ bool8 secondAbility; - /*0x18*/ u32 otId; - /*0x1C*/ u8 stats[5]; - /*0x24*/ u32 personality; - /*0x28*/ u16 heldItem; - /*0x2A*/ u8 mailNum; - /*0x2B*/ u8 otName[11]; - /*0x36*/ u8 otGender; - /*0x37*/ u8 sheen; - /*0x38*/ u16 playerSpecies; -}; - -struct UnkStructC { - /*0x00*/ u16 words[9]; - /*0x10*/ u8 string[8]; - /*0x1A*/ u8 otId[4]; - /*0x1E*/ u16 species; - /*0x20*/ u16 heldItem; -}; - -struct UnkStructD { - /*0x00*/ u8 pad00[0x10]; - /*0x10*/ u8 var10; - /*0x11*/ u8 pad11[1]; - /*0x12*/ u16 var12[1]; -}; - -extern const struct InGameTrade gIngameTrades[]; -extern const u16 gIngameTradeMail[][10]; - - -void sub_804A96C(struct UnkStructD *arg0, u8 left, u8 top, u16 *tilemap, u8 width, u8 height, u16 sp8) { - int y, x; - - for (y = 0; y < height; y++) - { - - for (x = 0; x < width; x++) - { - arg0->var12[(top * 32 + left) + y * 32 + x] = tilemap[width * y + x] | sp8; - } - } - -#if ENGLISH - arg0->var10 = 1; -#endif -} - -#if GERMAN -void sub_804A96C_alt(struct UnkStructD *arg0, u8 left, u8 top, u16 *tilemap, u8 width, u8 height, u16 sp8) { - sub_804A96C(arg0, left, top, tilemap, width, height, sp8); - - arg0->var10 = 1; -} -#endif - -asm(".section .text.sub_804DAD4"); - -void sub_804DAD4(struct UnkStructC *arg0, struct InGameTrade *trade) { - s32 i; - - for (i = 0; i < 9; i++) - { - arg0->words[i] = gIngameTradeMail[trade->mailNum][i]; - } - - StringCopy(arg0->string, trade->otName); - -#if GERMAN - PadNameString(arg0->string, CHAR_SPACE); -#endif - - arg0->otId[0] = trade->otId >> 24; - arg0->otId[1] = trade->otId >> 16; - arg0->otId[2] = trade->otId >> 8; - arg0->otId[3] = trade->otId; - arg0->species = trade->species; - arg0->heldItem = trade->heldItem; -} diff --git a/src/unused_8124F94.c b/src/unused_8124F94.c index 93b569058..5f76fa92e 100644 --- a/src/unused_8124F94.c +++ b/src/unused_8124F94.c @@ -64,7 +64,7 @@ u8 unref_sub_8124FD8(struct UnknownStruct1 *a, const struct UnknownStruct2 *b) } else { - sub_800D238(b->src, a->dest + a->unk2 * 64); + LZDecompressWram(b->src, a->dest + a->unk2 * 64); } a->unk88[a->unk1].unk8 = a->unk2; temp = r6 + a->unk2; @@ -95,7 +95,7 @@ u8 unref_sub_81250A4(struct UnknownStruct1 *a, struct UnknownStruct3 *b) { u16 palette[16]; - sub_800D238(b->paletteSrc, palette); + LZDecompressWram(b->paletteSrc, palette); LoadPalette(palette, a->paletteNum * 16, 32); } a->unk8[a->paletteNum].paletteCount = a->paletteNum; @@ -111,7 +111,7 @@ u8 unref_sub_8125118(struct UnknownStruct1 *a, struct UnknownStruct3 *b) u8 r7 = b->paletteCount; u8 i; - sub_800D238(b->paletteSrc, palettes); + LZDecompressWram(b->paletteSrc, palettes); for (i = a->paletteNum; i < r7; i++) { if (a->paletteNum + i >= 16) |