summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgolem galvanize <golemgalvanize@github.com>2018-01-09 16:48:01 -0500
committergolem galvanize <golemgalvanize@github.com>2018-01-09 16:48:01 -0500
commitc7722a492017dbd8a5fb3bb216062eb62129daf5 (patch)
tree2a5c0ba6a6b9364aa93eb4a9a89b35153954ab63 /src
parent2d141bc612ffecc984f6b4238c2791ba8419a192 (diff)
parent85174ad6193d3d58b92deaaedf8c510440ed85ee (diff)
fixing merge conflicts
Diffstat (limited to 'src')
-rw-r--r--src/bard_music.c97
-rwxr-xr-xsrc/battle/anim/alert.c33
-rwxr-xr-xsrc/battle/anim/angel.c37
-rwxr-xr-xsrc/battle/anim/angel_kiss.c87
-rwxr-xr-xsrc/battle/anim/anger.c34
-rw-r--r--src/battle/anim/aurora.c72
-rw-r--r--src/battle/anim/beta_beat_up.c34
-rwxr-xr-xsrc/battle/anim/blow_kiss.c39
-rwxr-xr-xsrc/battle/anim/bottle.c125
-rwxr-xr-xsrc/battle/anim/brace.c45
-rwxr-xr-xsrc/battle/anim/breath.c36
-rw-r--r--src/battle/anim/bubble.c102
-rwxr-xr-xsrc/battle/anim/bullet.c69
-rwxr-xr-xsrc/battle/anim/copy_orb.c46
-rwxr-xr-xsrc/battle/anim/cube.c52
-rwxr-xr-xsrc/battle/anim/curtain.c82
-rwxr-xr-xsrc/battle/anim/cutter.c130
-rwxr-xr-xsrc/battle/anim/cyclone.c28
-rw-r--r--src/battle/anim/devil.c37
-rwxr-xr-xsrc/battle/anim/draw.c292
-rwxr-xr-xsrc/battle/anim/drum.c32
-rwxr-xr-xsrc/battle/anim/egg.c122
-rw-r--r--src/battle/anim/energy_wave.c162
-rwxr-xr-xsrc/battle/anim/espeed.c241
-rwxr-xr-xsrc/battle/anim/evasion.c95
-rwxr-xr-xsrc/battle/anim/fang.c19
-rw-r--r--src/battle/anim/fire.c146
-rw-r--r--src/battle/anim/fire_2.c326
-rwxr-xr-xsrc/battle/anim/flash.c123
-rwxr-xr-xsrc/battle/anim/flying_hearts.c40
-rwxr-xr-xsrc/battle/anim/flying_path.c296
-rwxr-xr-xsrc/battle/anim/flying_petals.c83
-rw-r--r--src/battle/anim/fury_cutter_count.c20
-rwxr-xr-xsrc/battle/anim/glitter.c63
-rwxr-xr-xsrc/battle/anim/glow.c55
-rwxr-xr-xsrc/battle/anim/grip.c44
-rwxr-xr-xsrc/battle/anim/grow.c31
-rw-r--r--src/battle/anim/guard.c34
-rwxr-xr-xsrc/battle/anim/guillotine.c90
-rwxr-xr-xsrc/battle/anim/heal.c27
-rwxr-xr-xsrc/battle/anim/heart_1.c25
-rw-r--r--src/battle/anim/heated_rock.c205
-rwxr-xr-xsrc/battle/anim/homing.c86
-rwxr-xr-xsrc/battle/anim/hop.c160
-rwxr-xr-xsrc/battle/anim/hop_2.c70
-rwxr-xr-xsrc/battle/anim/kiss_fountain.c38
-rwxr-xr-xsrc/battle/anim/leaf.c74
-rwxr-xr-xsrc/battle/anim/love_bg.c121
-rwxr-xr-xsrc/battle/anim/lunge_1.c124
-rwxr-xr-xsrc/battle/anim/lunge_2.c163
-rwxr-xr-xsrc/battle/anim/money.c62
-rwxr-xr-xsrc/battle/anim/moon.c39
-rw-r--r--src/battle/anim/noise.c56
-rwxr-xr-xsrc/battle/anim/note_rain.c37
-rwxr-xr-xsrc/battle/anim/note_scatter.c54
-rwxr-xr-xsrc/battle/anim/note_scatter_2.c57
-rw-r--r--src/battle/anim/note_spin.c110
-rwxr-xr-xsrc/battle/anim/note_wave.c143
-rwxr-xr-xsrc/battle/anim/orbit.c147
-rwxr-xr-xsrc/battle/anim/orbit_fast.c62
-rwxr-xr-xsrc/battle/anim/orbit_scatter.c31
-rwxr-xr-xsrc/battle/anim/orbs.c162
-rwxr-xr-xsrc/battle/anim/osmose.c29
-rwxr-xr-xsrc/battle/anim/perceive.c24
-rwxr-xr-xsrc/battle/anim/powder.c48
-rw-r--r--src/battle/anim/rain.c56
-rwxr-xr-xsrc/battle/anim/ring.c156
-rwxr-xr-xsrc/battle/anim/roots.c67
-rwxr-xr-xsrc/battle/anim/scan.c200
-rwxr-xr-xsrc/battle/anim/scary_face.c129
-rwxr-xr-xsrc/battle/anim/seed.c50
-rw-r--r--src/battle/anim/sfx.c280
-rwxr-xr-xsrc/battle/anim/shadow_enlarge.c35
-rwxr-xr-xsrc/battle/anim/shadow_minimize.c262
-rwxr-xr-xsrc/battle/anim/shield.c81
-rwxr-xr-xsrc/battle/anim/shimmer.c48
-rw-r--r--src/battle/anim/shock.c106
-rwxr-xr-xsrc/battle/anim/silhouette.c77
-rwxr-xr-xsrc/battle/anim/slash.c83
-rwxr-xr-xsrc/battle/anim/sleep.c44
-rwxr-xr-xsrc/battle/anim/slice.c111
-rwxr-xr-xsrc/battle/anim/smoke.c22
-rwxr-xr-xsrc/battle/anim/sonic.c136
-rwxr-xr-xsrc/battle/anim/sonic_task.c152
-rwxr-xr-xsrc/battle/anim/spin_finger.c73
-rwxr-xr-xsrc/battle/anim/spit.c30
-rwxr-xr-xsrc/battle/anim/splash.c87
-rwxr-xr-xsrc/battle/anim/startle.c56
-rwxr-xr-xsrc/battle/anim/strike.c77
-rw-r--r--src/battle/anim/struggle.c52
-rw-r--r--src/battle/anim/sunlight.c17
-rw-r--r--src/battle/anim/swipe.c20
-rwxr-xr-xsrc/battle/anim/switch.c128
-rwxr-xr-xsrc/battle/anim/sword.c30
-rwxr-xr-xsrc/battle/anim/taunt_finger.c56
-rwxr-xr-xsrc/battle/anim/tendrils.c67
-rwxr-xr-xsrc/battle/anim/thought.c52
-rwxr-xr-xsrc/battle/anim/thrashing.c111
-rw-r--r--src/battle/anim/thunder.c36
-rwxr-xr-xsrc/battle/anim/tile_in.c51
-rwxr-xr-xsrc/battle/anim/tile_out.c81
-rwxr-xr-xsrc/battle/anim/twinkle.c42
-rwxr-xr-xsrc/battle/anim/unused_1.c25
-rwxr-xr-xsrc/battle/anim/unused_2.c80
-rwxr-xr-xsrc/battle/anim/unused_3.c45
-rwxr-xr-xsrc/battle/anim/unused_4.c58
-rwxr-xr-xsrc/battle/anim/unused_5.c25
-rwxr-xr-xsrc/battle/anim/unused_6.c49
-rwxr-xr-xsrc/battle/anim/unused_7.c51
-rwxr-xr-xsrc/battle/anim/unused_8.c41
-rwxr-xr-xsrc/battle/anim/unused_9.c113
-rw-r--r--src/battle/anim/uproar.c25
-rw-r--r--src/battle/anim/water.c371
-rwxr-xr-xsrc/battle/anim/wave_finger.c39
-rwxr-xr-xsrc/battle/anim/whip.c46
-rw-r--r--src/battle/anim/wisp_orb.c105
-rwxr-xr-xsrc/battle/anim/withdraw.c69
-rw-r--r--src/battle/battle_2.c5390
-rw-r--r--src/battle/battle_4.c (renamed from src/battle_4.c)3794
-rw-r--r--src/battle/battle_7.c (renamed from src/battle_7.c)144
-rw-r--r--src/battle/battle_ai.c (renamed from src/battle_ai.c)229
-rw-r--r--src/battle/battle_anim.c1999
-rw-r--r--src/battle/battle_anim_807B69C.c (renamed from src/battle_anim_807B69C.c)55
-rw-r--r--src/battle/battle_anim_80A7E7C.c (renamed from src/battle_anim_80A7E7C.c)220
-rw-r--r--src/battle/battle_anim_80CA710.c18
-rw-r--r--src/battle/battle_controller_linkopponent.c (renamed from src/battle_controller_linkopponent2.c)509
-rw-r--r--src/battle/battle_controller_linkpartner.c (renamed from src/battle_controller_linkpartner.c)195
-rw-r--r--src/battle/battle_controller_opponent.c (renamed from src/battle_controller_opponent.c)240
-rw-r--r--src/battle/battle_controller_player.c (renamed from src/battle_controller_player.c)335
-rw-r--r--src/battle/battle_controller_safari.c710
-rw-r--r--src/battle/battle_controller_wally.c (renamed from src/battle_controller_wally.c)244
-rw-r--r--src/battle/battle_interface.c (renamed from src/battle_interface.c)249
-rw-r--r--src/battle/battle_message.c (renamed from src/battle_message.c)376
-rw-r--r--src/battle/battle_party_menu.c (renamed from src/battle_party_menu.c)179
-rw-r--r--src/battle/battle_records.c (renamed from src/battle_records.c)23
-rw-r--r--src/battle/battle_setup.c1471
-rw-r--r--src/battle/battle_transition.c (renamed from src/battle_transition.c)119
-rw-r--r--src/battle/battle_util.c (renamed from src/battle_3.c)4146
-rw-r--r--src/battle/calculate_base_damage.c (renamed from src/calculate_base_damage.c)24
-rw-r--r--src/battle/contest_link_80C857C.c (renamed from src/contest_link_80C857C.c)39
-rw-r--r--src/battle/pokeball.c (renamed from src/pokeball.c)369
-rw-r--r--src/battle/post_battle_event_funcs.c (renamed from src/post_battle_event_funcs.c)10
-rw-r--r--src/battle/reshow_battle_screen.c (renamed from src/reshow_battle_screen.c)60
-rw-r--r--src/battle/smokescreen.c (renamed from src/smokescreen.c)24
-rw-r--r--src/battle_2.c2441
-rw-r--r--src/battle_anim.c2270
-rw-r--r--src/battle_controller_safari.c173
-rw-r--r--src/battle_setup.c1416
-rw-r--r--src/bike.c1013
-rw-r--r--src/cable_club.c317
-rw-r--r--src/contest.c5377
-rw-r--r--src/coord_event_weather.c118
-rw-r--r--src/data/bard_music_de.h3699
-rw-r--r--src/data/bard_music_en.h3678
-rwxr-xr-xsrc/data/battle_strings_de.h1612
-rwxr-xr-xsrc/data/battle_strings_en.h1612
-rw-r--r--src/data/battle_tower/level_100_mons.h3903
-rw-r--r--src/data/battle_tower/level_50_mons.h3903
-rw-r--r--src/data/battle_tower/trainers.h1503
-rw-r--r--src/data/battle_tower/trainers_de.h1503
-rwxr-xr-xsrc/data/credits_de.h624
-rwxr-xr-xsrc/data/credits_en.h654
-rw-r--r--src/data/field_map_obj/anim_func_ptrs.h1519
-rw-r--r--src/data/field_map_obj/base_oam.h56
-rw-r--r--src/data/field_map_obj/berry_tree_graphics_tables.h573
-rw-r--r--src/data/field_map_obj/callback_subroutine_pointers.h442
-rw-r--r--src/data/field_map_obj/field_effect_object_template_pointers.h84
-rw-r--r--src/data/field_map_obj/field_effect_objects.h897
-rw-r--r--src/data/field_map_obj/map_object_anims.h886
-rw-r--r--src/data/field_map_obj/map_object_graphics_info.h227
-rw-r--r--src/data/field_map_obj/map_object_graphics_info_pointers.h448
-rw-r--r--src/data/field_map_obj/map_object_pic_tables.h1879
-rw-r--r--src/data/field_map_obj/map_object_subsprites.h345
-rw-r--r--src/data/menu_cursor_de.h345
-rw-r--r--src/data/menu_cursor_en.h363
-rw-r--r--src/data/pokemon/base_stats.h7823
-rw-r--r--src/data/pokemon/cry_ids.h146
-rw-r--r--src/data/pokemon/dex_order.h15
-rw-r--r--src/data/pokemon/egg_moves.h1318
-rw-r--r--src/data/pokemon/evolution.h608
-rw-r--r--src/data/pokemon/experience_tables.h828
-rw-r--r--src/data/pokemon/item_effects.h824
-rw-r--r--src/data/pokemon/level_up_learnset_pointers.h423
-rw-r--r--src/data/pokemon/level_up_learnsets.h5627
-rw-r--r--src/data/pokemon/nature_stats.h37
-rw-r--r--src/data/pokemon/spinda_spots.h15
-rw-r--r--src/data/pokemon/tmhm_learnsets.h431
-rw-r--r--src/data/pokemon/trainer_class_lookups.h164
-rw-r--r--src/data/text/move_descriptions_de.h1771
-rw-r--r--src/data/text/move_descriptions_en.h1772
-rw-r--r--src/data/text/nature_names_de.h53
-rw-r--r--src/data/text/nature_names_en.h53
-rw-r--r--src/daycare.c350
-rw-r--r--src/de_rom_8040FE0.c111
-rw-r--r--src/debug/matsuda_debug_menu.c1094
-rw-r--r--src/debug/mori_debug_menu.c (renamed from src/mori_debug_menu.c)91
-rw-r--r--src/debug/sound_check_menu.c1300
-rw-r--r--src/debug/unknown_debug_menu.c73
-rw-r--r--src/easy_chat.c442
-rw-r--r--src/easy_chat_1.c1742
-rw-r--r--src/easy_chat_2.c3034
-rw-r--r--src/engine/blend_palette.c (renamed from src/blend_palette.c)0
-rw-r--r--src/engine/cable_car_util.c47
-rw-r--r--src/engine/cable_club.c924
-rw-r--r--src/engine/clear_save_data_menu.c (renamed from src/clear_save_data_menu.c)2
-rw-r--r--src/engine/clock.c (renamed from src/clock.c)25
-rw-r--r--src/engine/decompress.c (renamed from src/decompress.c)7
-rw-r--r--src/engine/link.c (renamed from src/link.c)15
-rw-r--r--src/engine/load_save.c (renamed from src/load_save.c)2
-rw-r--r--src/engine/main.c (renamed from src/main.c)5
-rw-r--r--src/engine/main_menu.c (renamed from src/main_menu.c)478
-rw-r--r--src/engine/menu.c (renamed from src/menu.c)10
-rw-r--r--src/engine/menu_cursor.c (renamed from src/menu_cursor.c)26
-rw-r--r--src/engine/mystery_event_menu.c (renamed from src/mystery_event_menu.c)31
-rw-r--r--src/engine/mystery_event_msg.c51
-rw-r--r--src/engine/mystery_event_script.c (renamed from src/mystery_event_script.c)26
-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)530
-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/random.c (renamed from src/rng.c)2
-rw-r--r--src/engine/record_mixing.c (renamed from src/record_mixing.c)117
-rw-r--r--src/engine/reset_rtc_screen.c (renamed from src/reset_rtc_screen.c)145
-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)30
-rw-r--r--src/engine/save_failed_screen.c (renamed from src/save_failed_screen.c)7
-rw-r--r--src/engine/save_menu_util.c (renamed from src/save_menu_util.c)6
-rw-r--r--src/engine/script.c (renamed from src/script.c)84
-rw-r--r--src/engine/sound.c (renamed from src/sound.c)4
-rw-r--r--src/engine/sprite.c (renamed from src/sprite.c)37
-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)252
-rw-r--r--src/engine/text_window.c (renamed from src/text_window.c)76
-rw-r--r--src/engine/tileset_anim.c991
-rw-r--r--src/engine/time_events.c (renamed from src/time_events.c)10
-rw-r--r--src/engine/trade.c5713
-rw-r--r--src/engine/trainer_card.c (renamed from src/trainer_card.c)328
-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.c225
-rw-r--r--src/field/battle_tower.c2226
-rw-r--r--src/field/berry.c (renamed from src/berry.c)541
-rw-r--r--src/field/berry_tag_screen.c (renamed from src/berry_tag_screen.c)62
-rw-r--r--src/field/bike.c1051
-rw-r--r--src/field/birch_pc.c (renamed from src/birch_pc.c)10
-rw-r--r--src/field/braille_puzzles.c (renamed from src/braille_puzzles.c)50
-rw-r--r--src/field/choose_party.c (renamed from src/choose_party.c)261
-rw-r--r--src/field/coins.c (renamed from src/coins.c)26
-rw-r--r--src/field/coord_event_weather.c119
-rw-r--r--src/field/daycare.c1792
-rw-r--r--src/field/decoration.c (renamed from src/decoration.c)360
-rw-r--r--src/field/decoration_inventory.c (renamed from src/decoration_inventory.c)7
-rw-r--r--src/field/dewford_trend.c (renamed from src/dewford_trend.c)24
-rw-r--r--src/field/diploma.c (renamed from src/diploma.c)4
-rw-r--r--src/field/event_data.c (renamed from src/event_data.c)50
-rw-r--r--src/field/field_camera.c (renamed from src/field_camera.c)11
-rw-r--r--src/field/field_control_avatar.c (renamed from src/field_control_avatar.c)90
-rw-r--r--src/field/field_door.c603
-rw-r--r--src/field/field_effect.c (renamed from src/field_effect.c)642
-rw-r--r--src/field/field_effect_helpers.c1606
-rw-r--r--src/field/field_fadetransition.c (renamed from src/field_fadetransition.c)28
-rw-r--r--src/field/field_ground_effect.c772
-rw-r--r--src/field/field_map_obj.c (renamed from src/field_map_obj.c)1265
-rw-r--r--src/field/field_map_obj_helpers.c (renamed from src/field_map_obj_helpers.c)201
-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)443
-rw-r--r--src/field/field_poison.c (renamed from src/field_poison.c)12
-rw-r--r--src/field/field_region_map.c (renamed from src/field_region_map.c)26
-rw-r--r--src/field/field_screen_effect.c (renamed from src/field_screen_effect.c)37
-rw-r--r--src/field/field_special_scene.c (renamed from src/field_special_scene.c)109
-rw-r--r--src/field/field_specials.c (renamed from src/field_specials.c)422
-rw-r--r--src/field/field_tasks.c (renamed from src/field_tasks.c)73
-rw-r--r--src/field/field_weather.c1163
-rw-r--r--src/field/field_weather_effects.c2384
-rw-r--r--src/field/fieldmap.c (renamed from src/fieldmap.c)16
-rw-r--r--src/field/fldeff_berrytree.c56
-rw-r--r--src/field/fldeff_cut.c (renamed from src/fldeff_cut.c)113
-rw-r--r--src/field/fldeff_decoration.c364
-rw-r--r--src/field/fldeff_flash.c (renamed from src/fldeff_flash.c)56
-rw-r--r--src/field/fldeff_poison.c44
-rw-r--r--src/field/fldeff_recordmixing.c83
-rw-r--r--src/field/fldeff_secret_base_pc.c69
-rw-r--r--src/field/fldeff_secretpower.c484
-rw-r--r--src/field/fldeff_softboiled.c (renamed from src/fldeff_softboiled.c)25
-rw-r--r--src/field/fldeff_strength.c (renamed from src/fldeff_strength.c)22
-rw-r--r--src/field/fldeff_sweetscent.c (renamed from src/fldeff_sweetscent.c)8
-rw-r--r--src/field/fldeff_teleport.c (renamed from src/fldeff_teleport.c)14
-rw-r--r--src/field/heal_location.c63
-rw-r--r--src/field/hof_pc.c (renamed from src/hof_pc.c)8
-rw-r--r--src/field/item.c (renamed from src/item.c)12
-rw-r--r--src/field/item_menu.c (renamed from src/item_menu.c)178
-rw-r--r--src/field/item_use.c (renamed from src/item_use.c)203
-rw-r--r--src/field/landmark.c417
-rw-r--r--src/field/lottery_corner.c (renamed from src/lottery_corner.c)30
-rw-r--r--src/field/map_name_popup.c (renamed from src/map_name_popup.c)2
-rw-r--r--src/field/map_obj_lock.c (renamed from src/map_obj_lock.c)8
-rw-r--r--src/field/mauville_man.c1313
-rw-r--r--src/field/menu_helpers.c (renamed from src/menu_helpers.c)60
-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)105
-rw-r--r--src/field/overworld.c (renamed from src/rom4.c)711
-rw-r--r--src/field/party_menu.c5522
-rw-r--r--src/field/pc_screen_effect.c128
-rw-r--r--src/field/player_pc.c (renamed from src/player_pc.c)199
-rw-r--r--src/field/pokeblock.c (renamed from src/pokeblock.c)90
-rw-r--r--src/field/region_map.c (renamed from src/region_map.c)277
-rw-r--r--src/field/roamer.c (renamed from src/roamer.c)18
-rw-r--r--src/field/rotating_gate.c (renamed from src/rotating_gate.c)24
-rw-r--r--src/field/safari_zone.c (renamed from src/safari_zone.c)30
-rw-r--r--src/field/scrcmd.c (renamed from src/scrcmd.c)1061
-rw-r--r--src/field/script_menu.c1178
-rw-r--r--src/field/script_movement.c (renamed from src/script_movement.c)72
-rw-r--r--src/field/secret_base.c1708
-rw-r--r--src/field/shop.c (renamed from src/shop.c)39
-rw-r--r--src/field/slot_machine.c5413
-rw-r--r--src/field/start_menu.c (renamed from src/start_menu.c)22
-rw-r--r--src/field/starter_choose.c (renamed from src/starter_choose.c)32
-rw-r--r--src/field/trader.c (renamed from src/trader.c)58
-rw-r--r--src/field/trainer_see.c559
-rw-r--r--src/field/tv.c (renamed from src/tv.c)1273
-rw-r--r--src/field/use_pokeblock.c (renamed from src/use_pokeblock.c)24
-rw-r--r--src/field/wallclock.c (renamed from src/wallclock.c)74
-rw-r--r--src/field/wild_encounter.c (renamed from src/wild_encounter.c)889
-rw-r--r--src/field_door.c221
-rw-r--r--src/field_ground_effect.c240
-rw-r--r--src/field_weather.c367
-rw-r--r--src/heal_location.c63
-rwxr-xr-xsrc/intro_credits_graphics.c532
-rw-r--r--src/landmark.c73
-rw-r--r--src/libc.c143
-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/m4a_2.c (renamed from src/m4a_2.c)2
-rw-r--r--src/libs/m4a_4.c (renamed from src/m4a_4.c)4
-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/mail.c437
-rw-r--r--src/matsuda_debug_menu.c1113
-rw-r--r--src/mauville_old_man.c247
-rw-r--r--src/party_menu.c1505
-rw-r--r--src/pokemon/learn_move.c (renamed from src/learn_move.c)65
-rw-r--r--src/pokemon/mail.c599
-rw-r--r--src/pokemon/mail_data.c (renamed from src/mail_data.c)4
-rw-r--r--src/pokemon/mon_markings.c (renamed from src/mon_markings.c)301
-rw-r--r--src/pokemon/pokeblock_feed.c (renamed from src/pokeblock_feed.c)85
-rw-r--r--src/pokemon/pokedex.c (renamed from src/pokedex.c)361
-rw-r--r--src/pokemon/pokedex_cry_screen.c (renamed from src/pokedex_cry_screen.c)7
-rw-r--r--src/pokemon/pokemon_1.c (renamed from src/pokemon_1.c)161
-rw-r--r--src/pokemon/pokemon_2.c (renamed from src/pokemon_2.c)58
-rw-r--r--src/pokemon/pokemon_3.c (renamed from src/pokemon_3.c)79
-rw-r--r--src/pokemon/pokemon_data.c (renamed from src/pokemon_data.c)40
-rw-r--r--src/pokemon/pokemon_icon.c (renamed from src/pokemon_icon.c)9
-rw-r--r--src/pokemon/pokemon_menu.c1199
-rw-r--r--src/pokemon/pokemon_size_record.c (renamed from src/pokemon_size_record.c)16
-rw-r--r--src/pokemon/pokemon_storage_system.c (renamed from src/pokemon_storage_system.c)8
-rw-r--r--src/pokemon/pokemon_summary_screen.c5351
-rw-r--r--src/pokemon_summary_screen.c180
-rw-r--r--src/pokenav_after.c (renamed from src/pokenav.c)16
-rw-r--r--src/pokenav_before.c4610
-rw-r--r--src/rom3.c85
-rw-r--r--src/rom6.c60
-rw-r--r--src/rom_800D42C.c1
-rw-r--r--src/rom_8077ABC.c2142
-rw-r--r--src/roulette.c4637
-rw-r--r--src/roulette_util.c280
-rw-r--r--src/scene/berry_blender.c (renamed from src/berry_blender.c)166
-rw-r--r--src/scene/cable_car.c979
-rw-r--r--src/scene/contest_painting.c (renamed from src/contest_painting.c)28
-rw-r--r--src/scene/credits.c (renamed from src/credits.c)375
-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)138
-rw-r--r--src/scene/evolution_graphics.c (renamed from src/evolution_graphics.c)93
-rw-r--r--src/scene/evolution_scene.c3964
-rw-r--r--src/scene/hall_of_fame.c (renamed from src/hall_of_fame.c)142
-rw-r--r--src/scene/intro.c (renamed from src/intro.c)725
-rwxr-xr-xsrc/scene/intro_credits_graphics.c758
-rw-r--r--src/scene/new_game.c (renamed from src/new_game.c)35
-rw-r--r--src/scene/title_screen.c (renamed from src/title_screen.c)48
-rw-r--r--src/script_menu.c1134
-rw-r--r--src/script_pokemon_util_80C4BF0.c412
-rw-r--r--src/script_pokemon_util_80F99CC.c331
-rw-r--r--src/secret_base.c1075
-rw-r--r--src/slot_machine.c150
-rw-r--r--src/sound_check_menu.c2199
-rw-r--r--src/strings.c6
-rw-r--r--src/tileset_anim.c630
-rw-r--r--src/trade.c88
-rw-r--r--src/trainer_see.c455
-rw-r--r--src/unknown_debug_menu.c52
-rw-r--r--src/unknown_task.c54
-rw-r--r--src/unused_8124F94.c6
-rw-r--r--src/unused_81258BC.c36
396 files changed, 158874 insertions, 35538 deletions
diff --git a/src/bard_music.c b/src/bard_music.c
deleted file mode 100644
index a31568475..000000000
--- a/src/bard_music.c
+++ /dev/null
@@ -1,97 +0,0 @@
-#include "global.h"
-#include "easy_chat.h"
-
-struct BardSound
-{
- u8 pad_00[48];
-};
-
-struct UnkBard
-{
- /*0x00*/ u8 var00;
- /*0x01*/ s8 var01;
- /*0x02*/ u16 var02;
- /*0x04*/ u16 var04;
- /*0x06*/ u16 var06;
-};
-
-struct UnkBard3
-{
- /*0x00*/ u16 var00;
- /*0x02*/ u16 var02;
- /*0x04*/ s16 var04;
- /*0x06*/ u16 var06;
-};
-
-struct UnkBard2
-{
- /*0x00*/ u8 var00;
- /*0x01*/ u8 var01;
- /*0x02*/ u8 var02;
- /*0x03*/ u8 var03;
- /*0x04*/ u16 var04;
- u8 pad06[4];
- /*0x0A*/ u16 var0A;
- u8 pad0C[12];
- /*0x18*/ struct UnkBard3 var18[6];
-};
-
-extern struct BardSound *gBardMusicTable[];
-extern s16 *gUnknown_08417068[];
-extern u32 gUnknown_084170F4[];
-
-static s16 sub_814A2B8(u32 arg0, u32 arg1)
-{
- return gUnknown_08417068[arg0][arg1];
-}
-
-#if ENGLISH
-struct BardSound *sub_814A2D0(u16 arg0, u16 arg1)
-{
- struct BardSound *sounds = gBardMusicTable[arg0];
-
- return &sounds[arg1];
-}
-#elif GERMAN
-struct BardSound *sub_814A2D0(u16 arg0, u16 arg1)
-{
- u32 index;
- struct BardSound *sounds;
-
- sounds = gBardMusicTable[arg0];
- index = de_sub_80EB748(arg0, arg1);
-
- return &sounds[index];
-}
-#endif
-
-s32 sub_814A2EC(struct UnkBard2 *dest, struct UnkBard *src, u16 arg2)
-{
- s32 i;
- s32 j;
- s32 thirty;
-
- for (i = 0; i < 6; i++)
- {
- dest->var18[i].var00 = src[i].var00;
- if (src[i].var00 != 0xFF)
- {
- s32 r1 = src[i].var01 +gUnknown_084170F4[src[i].var00];
-
- dest->var18[i].var02 = r1;
- dest->var18[i].var06 = src[i].var04;
- dest->var04 += r1;
- }
- }
-
- for (j = 0, thirty = 30; j < i; j++)
- dest->var18[j].var04 = sub_814A2B8(thirty + arg2, j);
-
- dest->var00++;
- dest->var01 = 0;
- dest->var02 = 0;
- dest->var03 = 0;
- dest->var0A = 0;
-
- //warning: no return statement in function returning non-void
-}
diff --git a/src/battle/anim/alert.c b/src/battle/anim/alert.c
new file mode 100755
index 000000000..7cd42c17b
--- /dev/null
+++ b/src/battle/anim/alert.c
@@ -0,0 +1,33 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+// alert (red thunder from the sides of a Pokemon, simulating more alert behavior.)
+// Used in Kinesis.
+
+void sub_80CF610(struct Sprite* sprite)
+{
+ sub_8078650(sprite);
+ sub_807867C(sprite, gBattleAnimArgs[0]);
+ sprite->pos1.y += gBattleAnimArgs[1];
+ if (GetBankSide(gAnimBankAttacker) != 0)
+ {
+ sprite->hFlip = 1;
+ if (gBattleAnimArgs[2] != 0)
+ sprite->vFlip = 1;
+ }
+ else
+ {
+ if (gBattleAnimArgs[2] != 0)
+ sprite->vFlip = 1;
+ }
+
+ sprite->callback = sub_8078600;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+}
diff --git a/src/battle/anim/angel.c b/src/battle/anim/angel.c
new file mode 100755
index 000000000..5ec083887
--- /dev/null
+++ b/src/battle/anim/angel.c
@@ -0,0 +1,37 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+// angel (a little angel descends from somewhere towards a position)
+// Used in Sweet Kiss.
+
+void sub_80D2938(struct Sprite* sprite)
+{
+ s16 r5;
+ if (sprite->data[0] == 0)
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ }
+
+ sprite->data[0]++;
+ r5 = (sprite->data[0] * 10) & 0xFF;
+ sprite->pos2.x = Sin(r5, 0x50) >> 8;
+ if (sprite->data[0] <= 0x4F)
+ sprite->pos2.y = (sprite->data[0] / 2) + (Cos(r5, 0x50) >> 8);
+
+ if (sprite->data[0] > 0x5A)
+ {
+ sprite->data[2]++;
+ sprite->pos2.x -= sprite->data[2] / 2;
+ }
+
+ if (sprite->data[0] > 0x64)
+ DestroyAnimSprite(sprite);
+}
diff --git a/src/battle/anim/angel_kiss.c b/src/battle/anim/angel_kiss.c
new file mode 100755
index 000000000..d5be6e2af
--- /dev/null
+++ b/src/battle/anim/angel_kiss.c
@@ -0,0 +1,87 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "random.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+// angel_kiss (a different variation of kiss_fountain.)
+// Used in Sweet Kiss.
+
+void sub_80D29CC(struct Sprite* sprite)
+{
+ sprite->data[5]++;
+ sprite->pos2.x = Sin(sprite->data[3], 5);
+ sprite->pos2.y = sprite->data[5] / 2;
+ sprite->data[3] = (sprite->data[3] + 3) & 0xFF;
+ if (sprite->data[5] > 20)
+ sprite->invisible = sprite->data[5] % 2;
+
+ if (sprite->data[5] > 30)
+ DestroyAnimSprite(sprite);
+}
+
+void sub_80D2A38(struct Sprite* sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sprite->data[1] = gBattleAnimArgs[0];
+ sprite->data[2] = gBattleAnimArgs[1];
+ sprite->data[0]++;
+ }
+ else
+ {
+ sprite->data[4] += sprite->data[1];
+ sprite->pos2.x = sprite->data[4] >> 8;
+ sprite->pos2.y = Sin(sprite->data[3], sprite->data[2]);
+ sprite->data[3] = (sprite->data[3] + 3) & 0xFF;
+ if (sprite->data[3] > 0x46)
+ {
+ sprite->callback = sub_80D29CC;
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->data[3] = Random() % 0xB4;
+ }
+ }
+}
+
+// this is for the next file, but i didnt feel like deleting it from the original 80C file.
+/* void sub_80D2ABC(struct Sprite* sprite)
+{
+ int var;
+ s16 var2;
+ int var3;
+ if (sprite->data[3] == 0)
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ StartSpriteAnim(sprite, 0);
+ sprite->subpriority = sub_8079E90(gAnimBankTarget) - 1;
+ sprite->data[2] = 1;
+ }
+
+ sprite->data[0] += sprite->data[2];
+ var = sprite->data[0] * 4;
+ if (var < 0)
+ var += 0xFF;
+
+ sprite->data[1] = (sprite->data[0] * 4) -(((var) >> 8) << 8);
+ if (sprite->data[1] < 0)
+ sprite->data[1] = 0;
+
+ var3 = sprite->data[1];
+ var2 = sprite->data[0];
+ var2 /= 4;
+ sprite->pos2.x = Cos(var3, 30 - var2);
+ var3 = sprite->data[1];
+ var2 = sprite->data[0] / 8;
+ sprite->pos2.x = Sin(var3, 10 - var2);
+ if (sprite->data[1] > 0x80 && sprite->data[2] > 0)
+ sprite->data[2] = 0xFFFF;
+} */
diff --git a/src/battle/anim/anger.c b/src/battle/anim/anger.c
new file mode 100755
index 000000000..011aa68ce
--- /dev/null
+++ b/src/battle/anim/anger.c
@@ -0,0 +1,34 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+// anger (anger emotes, usually above the Pokemon's head, indicating annoyed emotions.)
+// Used in Frustration, Rage, Swagger, Torment, and Taunt.
+
+void sub_80D09C0(struct Sprite* sprite)
+{
+ u8 bank;
+ if (gBattleAnimArgs[0] == 0)
+ bank = gAnimBankAttacker;
+ else
+ bank = gAnimBankTarget;
+
+ if (GetBankSide(bank) == 1)
+ {
+ gBattleAnimArgs[1] *= -1;
+ }
+
+ sprite->pos1.x = GetBankPosition(bank, 2) + gBattleAnimArgs[1];
+ sprite->pos1.y = GetBankPosition(bank, 3) + gBattleAnimArgs[2];
+ if (sprite->pos1.y <= 7)
+ sprite->pos1.y = 8;
+
+ StoreSpriteCallbackInData(sprite, move_anim_8074EE0);
+ sprite->callback = sub_80785E4;
+}
diff --git a/src/battle/anim/aurora.c b/src/battle/anim/aurora.c
new file mode 100644
index 000000000..90fa5c879
--- /dev/null
+++ b/src/battle/anim/aurora.c
@@ -0,0 +1,72 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "palette.h"
+#include "rom_8077ABC.h"
+#include "sprite.h"
+#include "task.h"
+
+extern s16 gBattleAnimArgs[8];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80D344C(struct Sprite *);
+static void sub_80D34D4(u8);
+
+void sub_80D33B4(struct Sprite *sprite)
+{
+ s16 r6;
+
+ sub_80787B0(sprite, 1);
+ if (GetBankSide(gAnimBankAttacker) != 0)
+ r6 = -gBattleAnimArgs[2];
+ else
+ r6 = gBattleAnimArgs[2];
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = GetBankPosition(gAnimBankTarget, 2) + r6;
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[3];
+ obj_translate_based_on_private_1_2_3_4(sprite);
+ sprite->callback = sub_80D344C;
+ sprite->affineAnimPaused = TRUE;
+ sprite->callback(sprite);
+}
+
+static void sub_80D344C(struct Sprite *sprite)
+{
+ if ((u16)gBattleAnimArgs[7] == 0xFFFF)
+ {
+ StartSpriteAnim(sprite, 1);
+ sprite->affineAnimPaused = FALSE;
+ }
+ if (sub_8078B5C(sprite) != 0)
+ DestroyAnimSprite(sprite);
+}
+
+void sub_80D3490(u8 taskId)
+{
+ gTasks[taskId].data[0] = gBattleAnimArgs[0];
+ gTasks[taskId].data[2] = 0x100 + IndexOfSpritePaletteTag(0x279C) * 16;
+ gTasks[taskId].func = sub_80D34D4;
+}
+
+static void sub_80D34D4(u8 taskId)
+{
+ gTasks[taskId].data[10]++;
+ if (gTasks[taskId].data[10] == 3)
+ {
+ u16 r5;
+ u16 r6;
+ s32 i;
+
+ gTasks[taskId].data[10] = 0;
+ r5 = gTasks[taskId].data[2] + 1;
+ r6 = gPlttBufferFaded[r5];
+ for (i = 1; i < 8; i++)
+ gPlttBufferFaded[r5 + i - 1] = gPlttBufferFaded[r5 + i];
+ gPlttBufferFaded[r5 + 7] = r6;
+ }
+ gTasks[taskId].data[11]++;
+ if (gTasks[taskId].data[11] == gTasks[taskId].data[0])
+ DestroyAnimVisualTask(taskId);
+}
diff --git a/src/battle/anim/beta_beat_up.c b/src/battle/anim/beta_beat_up.c
new file mode 100644
index 000000000..3af6dd926
--- /dev/null
+++ b/src/battle/anim/beta_beat_up.c
@@ -0,0 +1,34 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+
+extern s16 gBattleAnimArgs[8];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80D6278(struct Sprite *);
+
+// beta_beat_up
+
+void sub_80D6234(struct Sprite *sprite)
+{
+ if (GetBankSide(gAnimBankAttacker) != 0)
+ {
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ }
+ else
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ }
+
+ sprite->callback = sub_80D6278;
+}
+
+static void sub_80D6278(struct Sprite *sprite)
+{
+ if (sprite->affineAnimEnded)
+ {
+ move_anim_8074EE0(sprite);
+ }
+}
diff --git a/src/battle/anim/blow_kiss.c b/src/battle/anim/blow_kiss.c
new file mode 100755
index 000000000..e7b49471d
--- /dev/null
+++ b/src/battle/anim/blow_kiss.c
@@ -0,0 +1,39 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80D1FA4(struct Sprite* sprite);
+
+// blow_kiss (a heart floating across the screen.)
+// Used in Attract.
+
+void sub_80D1F58(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 1);
+ sprite->data[0] = 0x5F;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = GetBankPosition(gAnimBankTarget, 2);
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = GetBankPosition(gAnimBankTarget, 3);
+ obj_translate_based_on_private_1_2_3_4(sprite);
+ sprite->callback = sub_80D1FA4;
+}
+
+void sub_80D1FA4(struct Sprite* sprite)
+{
+ if (sub_8078B5C(sprite) == 0)
+ {
+ sprite->pos2.y += Sin(sprite->data[5], 14);
+ sprite->data[5] = (sprite->data[5] + 4) & 0xFF;
+ }
+ else
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
diff --git a/src/battle/anim/bottle.c b/src/battle/anim/bottle.c
new file mode 100755
index 000000000..5485bcf5d
--- /dev/null
+++ b/src/battle/anim/bottle.c
@@ -0,0 +1,125 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80CCF70(struct Sprite* sprite);
+static void sub_80CD0CC(struct Sprite* sprite, int unk1, int unk2);
+
+// bottle (shows a bottle swinging back and forth.)
+// Used by Milk Drink.
+
+void sub_80CCF04(struct Sprite* sprite)
+{
+ sprite->pos1.x = GetBankPosition(gAnimBankTarget, 2);
+ sprite->pos1.y = GetBankPosition(gAnimBankTarget, 3) + 0xFFE8;
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+ sprite->data[6] = 0;
+ sprite->data[7] = 16;
+ REG_BLDCNT = 0x3F40;
+ REG_BLDALPHA = (sprite->data[7] << 8) | sprite->data[6];
+ sprite->callback = sub_80CCF70;
+}
+
+void sub_80CCF70(struct Sprite* sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ if (++sprite->data[2] > 0)
+ {
+ sprite->data[2] = 0;
+ if (((++sprite->data[1]) & 1) != 0)
+ {
+ if (sprite->data[6] <= 15)
+ sprite->data[6]++;
+ }
+ else if (sprite->data[7] > 0)
+ sprite->data[7]--;
+
+ REG_BLDALPHA = (sprite->data[7] << 8) | sprite->data[6];
+ if (sprite->data[6] == 16 && sprite->data[7] == 0)
+ {
+ sprite->data[1] = 0;
+ sprite->data[0]++;
+ }
+ }
+ break;
+ case 1:
+ if (++sprite->data[1] > 8)
+ {
+ sprite->data[1] = 0;
+ StartSpriteAffineAnim(sprite, 1);
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ sub_80CD0CC(sprite, 16, 4);
+ if (++sprite->data[1] > 2)
+ {
+ sprite->data[1] = 0;
+ sprite->pos1.y++;
+ }
+
+ if (++sprite->data[2] <= 29)
+ break;
+
+ if (sprite->data[2] & 1)
+ {
+ if (sprite->data[6] > 0)
+ sprite->data[6]--;
+ }
+ else if (sprite->data[7] <= 15)
+ {
+ sprite->data[7]++;
+ }
+
+ REG_BLDALPHA = (sprite->data[7] << 8) | sprite->data[6];
+ if (sprite->data[6] == 0 && sprite->data[7] == 16)
+ {
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 3:
+ sprite->invisible = 1;
+ sprite->data[0]++;
+ break;
+ case 4:
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ DestroyAnimSprite(sprite);
+ break;
+ }
+}
+
+void sub_80CD0CC(struct Sprite* sprite, int unk1, int unk2)
+{
+ if (sprite->data[3] <= 11)
+ sprite->data[4] += 2;
+
+ if ((u16)(sprite->data[3] - 0x12) <= 0x17)
+ sprite->data[4] -= 2;
+
+ if ((sprite->data[3]) > 0x2F)
+ sprite->data[4] += 2;
+
+ sprite->pos2.x = sprite->data[4] / 9;
+ sprite->pos2.y = sprite->data[4] / 14;
+ if (sprite->pos2.y < 0)
+ sprite->pos2.y *= -1;
+
+ sprite->data[3]++;
+ if (sprite->data[3] > 0x3B)
+ sprite->data[3] = 0;
+}
diff --git a/src/battle/anim/brace.c b/src/battle/anim/brace.c
new file mode 100755
index 000000000..19ea4297b
--- /dev/null
+++ b/src/battle/anim/brace.c
@@ -0,0 +1,45 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80CDF70(struct Sprite* sprite);
+
+// brace (the Pokemon prepares to endure a hit)
+// Used in Endure.
+
+void sub_80CDF0C(struct Sprite* sprite)
+{
+ if (gBattleAnimArgs[0] == 0)
+ {
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 0) + gBattleAnimArgs[1];
+ sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 1) + gBattleAnimArgs[2];
+ }
+ else
+ {
+ sprite->pos1.x = GetBankPosition(gAnimBankTarget, 0) + gBattleAnimArgs[1];
+ sprite->pos1.y = GetBankPosition(gAnimBankTarget, 1) + gBattleAnimArgs[2];
+ }
+
+ sprite->data[0] = 0;
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->callback = sub_80CDF70;
+}
+
+void sub_80CDF70(struct Sprite* sprite)
+{
+ if (++sprite->data[0] > sprite->data[1])
+ {
+ sprite->data[0] = 0;
+ sprite->pos1.y--;
+ }
+
+ sprite->pos1.y -= sprite->data[0];
+ if (sprite->animEnded)
+ DestroyAnimSprite(sprite);
+}
diff --git a/src/battle/anim/breath.c b/src/battle/anim/breath.c
new file mode 100755
index 000000000..831b222ad
--- /dev/null
+++ b/src/battle/anim/breath.c
@@ -0,0 +1,36 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+// breath (a puff of smoke, usually from the mouth or nose of the Pokemon.)
+// Used in Swagger and Bulk Up.
+
+void sub_80D0930(struct Sprite* sprite)
+{
+ if (GetBankSide(gAnimBankAttacker) == 0)
+ {
+ StartSpriteAnim(sprite, 0);
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2) + 32;
+ sprite->data[1] = 0x40;
+ }
+ else
+ {
+ StartSpriteAnim(sprite, 1);
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2) - 32;
+ sprite->data[1] = -0x40;
+ }
+
+ sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3);
+ sprite->data[0] = 0x34;
+ sprite->data[2] = 0;
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+ sprite->callback = sub_8078394;
+}
diff --git a/src/battle/anim/bubble.c b/src/battle/anim/bubble.c
new file mode 100644
index 000000000..403003ce3
--- /dev/null
+++ b/src/battle/anim/bubble.c
@@ -0,0 +1,102 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "util.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80D32E8(struct Sprite *sprite);
+static void sub_80D3370(struct Sprite *sprite);
+static void sub_80D3398(struct Sprite *sprite);
+
+// bubble (indidivual bubble that floats around)
+// Used in Bubble and Bubblebeam
+
+void sub_80D31C8(struct Sprite* sprite)
+{
+ u8 newSpriteId;
+
+ if (GetBankSide(gAnimBankAttacker) != 0)
+ {
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2) - gBattleAnimArgs[0];
+ sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3) + gBattleAnimArgs[1];
+ }
+ else
+ {
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2) + gBattleAnimArgs[0];
+ sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3) + gBattleAnimArgs[1];
+ }
+
+ sprite->animPaused = 1;
+
+ if (GetBankSide(gAnimBankAttacker) != 0)
+ {
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+ }
+
+ sprite->data[0] = gBattleAnimArgs[6];
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = GetBankPosition(gAnimBankTarget, 2);
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = GetBankPosition(gAnimBankTarget, 3);
+
+ obj_translate_based_on_private_1_2_3_4(sprite);
+
+ newSpriteId = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy);
+ sprite->data[5] = newSpriteId;
+
+ sprite->pos1.x -= Sin((u8)gBattleAnimArgs[4], gBattleAnimArgs[2]);
+ sprite->pos1.y -= Cos((u8)gBattleAnimArgs[4], gBattleAnimArgs[3]);
+
+ gSprites[newSpriteId].data[0] = gBattleAnimArgs[2];
+ gSprites[newSpriteId].data[1] = gBattleAnimArgs[3];
+ gSprites[newSpriteId].data[2] = gBattleAnimArgs[5];
+ gSprites[newSpriteId].data[3] = (u8)gBattleAnimArgs[4] * 256;
+ gSprites[newSpriteId].data[4] = gBattleAnimArgs[6];
+
+ sprite->callback = sub_80D32E8;
+ sprite->callback(sprite);
+}
+
+static void sub_80D32E8(struct Sprite *sprite)
+{
+ u8 spriteId = sprite->data[5];
+
+ u8 counter = gSprites[spriteId].data[4];
+ u16 index = gSprites[spriteId].data[3];
+
+ sprite->data[0] = 1;
+ sub_8078B5C(sprite);
+
+ sprite->pos2.x += Sin(index / 256, gSprites[spriteId].data[0]);
+ sprite->pos2.y += Cos(index / 256, gSprites[spriteId].data[1]);
+
+ gSprites[spriteId].data[3] = gSprites[spriteId].data[2] + index;
+
+ if (--counter != 0)
+ {
+ gSprites[spriteId].data[4] = counter;
+ }
+ else
+ {
+ sprite->callback = sub_80D3370;
+ DestroySprite(&gSprites[spriteId]);
+ }
+}
+
+static void sub_80D3370(struct Sprite *sprite)
+{
+ sprite->animPaused = 0;
+ sprite->callback = sub_8078600;
+ StoreSpriteCallbackInData(sprite, sub_80D3398);
+}
+
+static void sub_80D3398(struct Sprite *sprite)
+{
+ sprite->data[0] = 10;
+ sprite->callback = sub_80782D8;
+ StoreSpriteCallbackInData(sprite, move_anim_8074EE0);
+}
diff --git a/src/battle/anim/bullet.c b/src/battle/anim/bullet.c
new file mode 100755
index 000000000..90b2021f1
--- /dev/null
+++ b/src/battle/anim/bullet.c
@@ -0,0 +1,69 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "random.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80D0030(struct Sprite* sprite);
+static void sub_80D00B4(struct Sprite* sprite);
+
+// bullet (shoot seeds as ammunition.)
+// Used by Bullet Seed.
+
+void sub_80CFFD8(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 1);
+ sprite->data[0] = 20;
+ sprite->data[2] = GetBankPosition(gAnimBankTarget, 2);
+ sprite->data[4] = GetBankPosition(gAnimBankTarget, 3);
+ sprite->callback = sub_8078B34;
+ sprite->affineAnimPaused = 1;
+ StoreSpriteCallbackInData(sprite, sub_80D0030);
+}
+
+void sub_80D0030(struct Sprite* sprite)
+{
+ int i;
+ u16 rand;
+ s16* ptr;
+ PlaySE12WithPanning(0xA6, BattleAnimAdjustPanning(0x3F));
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+ ptr = &sprite->data[7];
+ for (i = 0; i < 8; i++)
+ {
+ ptr[i - 7] = 0;
+ }
+
+ rand = Random();
+ sprite->data[6] = 0xFFF4 - (rand & 7);
+ rand = Random();
+ sprite->data[7] = (rand % 0xA0) + 0xA0;
+ sprite->callback = sub_80D00B4;
+ sprite->affineAnimPaused = 0;
+}
+
+void sub_80D00B4(struct Sprite* sprite)
+{
+ sprite->data[0] += sprite->data[7];
+ sprite->pos2.x = sprite->data[0] >> 8;
+ if (sprite->data[7] & 1)
+ sprite->pos2.x = -sprite->pos2.x;
+
+ sprite->pos2.y = Sin(sprite->data[1], sprite->data[6]);
+ sprite->data[1] += 8;
+ if (sprite->data[1] > 0x7E)
+ {
+ sprite->data[1] = 0;
+ sprite->data[2] /= 2;
+ if (++sprite->data[3] == 1)
+ DestroyAnimSprite(sprite);
+ }
+}
diff --git a/src/battle/anim/copy_orb.c b/src/battle/anim/copy_orb.c
new file mode 100755
index 000000000..4fa8ea163
--- /dev/null
+++ b/src/battle/anim/copy_orb.c
@@ -0,0 +1,46 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+// copy_orb
+// Used in Mimic.
+
+void sub_80CB4CC(struct Sprite* sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ {
+ if (GetBankSide(gAnimBankTarget) == 0)
+ {
+ s16 a = gBattleAnimArgs[0];
+ gBattleAnimArgs[0] = -a;
+ }
+
+ sprite->pos1.x = GetBankPosition(gAnimBankTarget, 0) + gBattleAnimArgs[0];
+ sprite->pos1.y = GetBankPosition(gAnimBankTarget, 1) + gBattleAnimArgs[1];
+ sprite->invisible = 1;
+ sprite->data[0]++;
+ break;
+ }
+ case 1:
+ {
+ sprite->invisible = 0;
+ if (sprite->affineAnimEnded)
+ {
+ ChangeSpriteAffineAnim(sprite, 1);
+ sprite->data[0] = 25;
+ sprite->data[2] = GetBankPosition(gAnimBankAttacker, 2);
+ sprite->data[4] = GetBankPosition(gAnimBankAttacker, 3);
+ sprite->callback = sub_8078CC0;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+ break;
+ }
+ }
+ }
+}
diff --git a/src/battle/anim/cube.c b/src/battle/anim/cube.c
new file mode 100755
index 000000000..9adf46e32
--- /dev/null
+++ b/src/battle/anim/cube.c
@@ -0,0 +1,52 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "constants/songs.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80CE000(struct Sprite* sprite);
+
+// cube (shows a sphere sharpening into a cube.)
+// Used in Sharpen.
+
+void sub_80CDFB0(struct Sprite* sprite)
+{
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2);
+ sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3) - 12;
+ sprite->data[0] = 0;
+ sprite->data[1] = 2;
+ sprite->data[2] = 0;
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+ sprite->data[5] = BattleAnimAdjustPanning(-0x40);
+ sprite->callback = sub_80CE000;
+}
+
+void sub_80CE000(struct Sprite* sprite)
+{
+ if (++sprite->data[0] >= sprite->data[1])
+ {
+ sprite->invisible = !sprite->invisible;
+ if (!sprite->invisible)
+ {
+ sprite->data[4]++;
+ if (!(sprite->data[4] & 1))
+ PlaySE12WithPanning(SE_W207B, sprite->data[5]);
+ }
+
+ sprite->data[0] = 0;
+ if (++sprite->data[2] > 1)
+ {
+ sprite->data[2] = 0;
+ sprite->data[1]++;
+ }
+ }
+
+ if (sprite->animEnded && sprite->data[1] > 16 && sprite->invisible)
+ DestroyAnimSprite(sprite);
+}
diff --git a/src/battle/anim/curtain.c b/src/battle/anim/curtain.c
new file mode 100755
index 000000000..3c9e4e84c
--- /dev/null
+++ b/src/battle/anim/curtain.c
@@ -0,0 +1,82 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "palette.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern u16 gBattle_WIN0V;
+extern u16 gBattle_WIN0H;
+
+static void sub_80D1D48(u8 taskId);
+static void sub_80D1D9C(u8 taskId);
+
+// curtain (a sweeping blackening curtain in the BG)
+// Used in Fake Out.
+
+void sub_80D1CD0(u8 taskId)
+{
+ int zero;
+ bool8 result = IsContest();
+ u16 var = 0xF0;
+ if (result)
+ {
+ var = 0x98;
+ zero = 0;
+ }
+ else
+ {
+ zero = 0;
+ }
+
+ gBattle_WIN0H = var;
+ gBattle_WIN0V = 0xA0;
+ REG_WIN0H = var;
+ REG_WIN0V = 0xA0;
+ REG_WININ = 0x3F1F;
+ REG_WINOUT = 0x3F3F;
+ REG_BLDCNT = 0xC8;
+ REG_BLDY = 0x10;
+ gTasks[taskId].data[0] = zero;
+ gTasks[taskId].data[1] = var;
+ gTasks[taskId].func = sub_80D1D48;
+}
+
+void sub_80D1D48(u8 taskId)
+{
+ gTasks[taskId].data[0] += 13;
+ gTasks[taskId].data[1] -= 13;
+ if (gTasks[taskId].data[0] >= gTasks[taskId].data[1])
+ {
+ gBattle_WIN0H = 0;
+ gTasks[taskId].func = sub_80D1D9C;
+ }
+ else
+ {
+ gBattle_WIN0H = gTasks[taskId].data[1] | (gTasks[taskId].data[0] << 8);
+ }
+}
+
+void sub_80D1D9C(u8 taskId)
+{
+ if (++gTasks[taskId].data[10] == 5)
+ {
+ gTasks[taskId].data[11] = 0x88;
+ RequestSpriteCopy((u8 *)(&gTasks[taskId].data[11]), (u8 *)(&REG_BLDCNT), 2);
+ BlendPalettes(sub_80791A8(1, 0, 0, 0, 0, 0, 0), 16, RGB(31, 31, 31));
+ }
+ else if (gTasks[taskId].data[10] > 4)
+ {
+ gBattle_WIN0H = 0;
+ gBattle_WIN0V = 0;
+ REG_WININ = 0x3F3F;
+ REG_WINOUT = 0x3F3F;
+ REG_BLDCNT = 0;
+ REG_BLDY = 0;
+ DestroyAnimVisualTask(taskId);
+ }
+}
diff --git a/src/battle/anim/cutter.c b/src/battle/anim/cutter.c
new file mode 100755
index 000000000..2234ebacb
--- /dev/null
+++ b/src/battle/anim/cutter.c
@@ -0,0 +1,130 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80CB09C(struct Sprite* sprite);
+static void sub_80CB1A4(struct Sprite* sprite);
+
+// cutter (the cresent shaped leaf used in throwing projectiles for the listed moves.)
+// Used by Razor Leaf and Magical Leaf.
+
+void sub_80CAFD0(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 1);
+ if (GetBankSide(gAnimBankAttacker))
+ {
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+ }
+
+ sprite->data[0] = gBattleAnimArgs[4];
+ if (!(gBattleAnimArgs[6]))
+ {
+ sprite->data[2] = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[2];
+ sprite->data[4] = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[3];
+ }
+ else
+ {
+ sub_807A3FC(gAnimBankTarget, 1, &sprite->data[2], &sprite->data[4]);
+ sprite->data[2] += gBattleAnimArgs[2];
+ sprite->data[4] += gBattleAnimArgs[3];
+ }
+
+ sprite->data[5] = gBattleAnimArgs[5];
+ sub_80786EC(sprite);
+ if (GetBankSide(gAnimBankAttacker) == GetBankSide(gAnimBankTarget))
+ {
+ sprite->data[0] = 1;
+ }
+ else
+ {
+ sprite->data[0] = 0;
+ }
+
+ sprite->callback = sub_80CB09C;
+}
+
+void sub_80CB09C(struct Sprite* sprite)
+{
+ bool8 c = FALSE;
+ s16 a = sprite->data[0];
+ s16 b = sprite->data[7];
+ s16 r0;
+
+ sprite->data[0] = 1;
+ sub_8078718(sprite);
+ r0 = sprite->data[7];
+ sprite->data[0] = a;
+ if (b > 0xC8 && r0 <= 0x37 && sprite->oam.affineParam == 0)
+ sprite->oam.affineParam++;
+
+ if (sprite->oam.affineParam != 0 && sprite->data[0] != 0)
+ {
+ sprite->invisible ^= 1;
+ sprite->oam.affineParam++;
+ if (sprite->oam.affineParam == 0x1E)
+ c = TRUE;
+ }
+
+ if (sprite->pos1.x + sprite->pos2.x > 0x100
+ || sprite->pos1.x + sprite->pos2.x < -16
+ || sprite->pos1.y + sprite->pos2.y > 0xA0
+ || sprite->pos1.y + sprite->pos2.y < -16)
+ c = TRUE;
+
+ if (c)
+ DestroyAnimSprite(sprite);
+}
+
+void sub_80CB144(struct Sprite* sprite)
+{
+ if (!IsContest() && IsDoubleBattle() == TRUE)
+ {
+ sub_807A3FC(gAnimBankTarget, 1, &sprite->pos1.x, &sprite->pos1.y);
+ }
+
+ sprite->pos1.y += 32;
+ sprite->data[0] = gBattleAnimArgs[0];
+ sprite->data[1] = gBattleAnimArgs[1];
+ sprite->data[2] = gBattleAnimArgs[2];
+ sprite->data[3] = gBattleAnimArgs[3];
+ sprite->data[4] = gBattleAnimArgs[4];
+ sprite->callback = sub_80CB1A4;
+}
+
+void sub_80CB1A4(struct Sprite* sprite)
+{
+ if (sprite->data[1] == 0xFF)
+ {
+ sprite->pos1.y -= 2;
+ }
+ else if (sprite->data[1] > 0)
+ {
+ sprite->pos1.y -= 2;
+ sprite->data[1] -= 2;
+ }
+
+ sprite->data[5] += sprite->data[2];
+ if (sprite->data[0] < sprite->data[4])
+ sprite->data[5] += sprite->data[2];
+
+ sprite->data[5] &= 0xFF;
+ sprite->pos2.x = Cos(sprite->data[5], sprite->data[3]);
+ sprite->pos2.y = Sin(sprite->data[5], 5);
+ if (sprite->data[5] <= 0x7F)
+ {
+ sprite->oam.priority = sub_8079ED4(gAnimBankTarget) - 1;
+ }
+ else
+ {
+ sprite->oam.priority = sub_8079ED4(gAnimBankTarget) + 1;
+ }
+
+ sprite->data[0]--;
+ if (!sprite->data[0])
+ DestroyAnimSprite(sprite);
+}
diff --git a/src/battle/anim/cyclone.c b/src/battle/anim/cyclone.c
new file mode 100755
index 000000000..0f83df211
--- /dev/null
+++ b/src/battle/anim/cyclone.c
@@ -0,0 +1,28 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+// cyclone (creates a circling motion like a cyclone, usually a wind sprite.)
+// Used in Razor Wind.
+
+void sub_80D0118(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 0);
+ if (GetBankSide(gAnimBankAttacker) == 0)
+ sprite->pos1.y += 16;
+
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[1] = gBattleAnimArgs[2];
+ sprite->data[2] = gBattleAnimArgs[5];
+ sprite->data[3] = gBattleAnimArgs[6];
+ sprite->data[4] = gBattleAnimArgs[3];
+ sprite->callback = sub_8078114;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+ sprite->callback(sprite);
+}
diff --git a/src/battle/anim/devil.c b/src/battle/anim/devil.c
new file mode 100644
index 000000000..c628abfc0
--- /dev/null
+++ b/src/battle/anim/devil.c
@@ -0,0 +1,37 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "rom_8077ABC.h"
+#include "sprite.h"
+#include "trig.h"
+
+extern s16 gBattleAnimArgs[8];
+extern u8 gAnimBankTarget;
+
+void sub_80D2ABC(struct Sprite *sprite)
+{
+ if (sprite->data[3] == 0)
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ StartSpriteAnim(sprite, 0);
+ sprite->subpriority = sub_8079E90(gAnimBankTarget) - 1;
+ sprite->data[2] = 1;
+ }
+ sprite->data[0] += sprite->data[2];
+ sprite->data[1] = (sprite->data[0] * 4) % 256;
+ if (sprite->data[1] < 0)
+ sprite->data[1] = 0;
+ sprite->pos2.x = Cos(sprite->data[1], 30 - sprite->data[0] / 4);
+ sprite->pos2.y = Sin(sprite->data[1], 10 - sprite->data[0] / 8);
+ if (sprite->data[1] > 128 && sprite->data[2] > 0)
+ sprite->data[2] = -1;
+ if (sprite->data[1] == 0 && sprite->data[2] < 0)
+ sprite->data[2] = 1;
+ sprite->data[3]++;
+ if (sprite->data[3] < 10 || sprite->data[3] > 0x50)
+ sprite->invisible = sprite->data[0] % 2;
+ else
+ sprite->invisible = FALSE;
+ if (sprite->data[3] > 0x5A)
+ DestroyAnimSprite(sprite);
+}
diff --git a/src/battle/anim/draw.c b/src/battle/anim/draw.c
new file mode 100755
index 000000000..3adb62e06
--- /dev/null
+++ b/src/battle/anim/draw.c
@@ -0,0 +1,292 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "unknown_task.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern u16 gBattle_BG2_X;
+extern u16 gBattle_BG1_X;
+
+static void sub_80D0D68(u8 taskId);
+static void sub_80D0E8C(struct Sprite* sprite);
+
+// draw (draws the Pokemon into the world using a pencil.)
+// Used in Sketch.
+
+void sub_80D0C88(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ struct UnknownTaskStruct sp;
+ s16 i;
+ task->data[0] = sub_8077FC0(gAnimBankTarget) + 32;
+ task->data[1] = 4;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[4] = 0;
+ task->data[5] = 0;
+ task->data[15] = sub_807A100(gAnimBankTarget, 0);
+ if (GetBankIdentity_permutated(gAnimBankTarget) == 1)
+ {
+ task->data[6] = gBattle_BG1_X;
+ sp.dest = (u16 *)REG_ADDR_BG1HOFS;
+ }
+ else
+ {
+ task->data[6] = gBattle_BG2_X;
+ sp.dest = (u16 *)REG_ADDR_BG2HOFS;
+ }
+
+ for (i = task->data[0] - 0x40; i <= task->data[0];i++)
+ {
+ if (i >= 0)
+ {
+ gUnknown_03004DE0[0][i] = task->data[6] + 0xF0;
+ gUnknown_03004DE0[1][i] = task->data[6] + 0xF0;
+ }
+ }
+
+ sp.control = 0xa2600001;
+ sp.unk8 = 1;
+ sp.unk9 = 0;
+ sub_80895F8(sp);
+ task->func = sub_80D0D68;
+}
+
+#ifdef NONMATCHING
+void sub_80D0D68(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+
+ switch (task->data[4])
+ {
+ case 0:
+ if (++task->data[5] > 20)
+ task->data[4]++;
+ break;
+ case 1:
+ if (++task->data[1] > 3)
+ {
+ task->data[1] = 0;
+ task->data[2] = task->data[3] & 3;
+ task->data[5] = task->data[0] - task->data[3];
+ switch (task->data[2])
+ {
+ case 0:
+ break;
+ case 1:
+ task->data[5] -= 2;
+ break;
+ case 2:
+ task->data[5] += 1;
+ break;
+ case 3:
+ task->data[5] += 1;
+ break;
+ }
+
+ if (task->data[5] >= 0)
+ {
+ gUnknown_03004DE0[0][task->data[5]] = task->data[6];
+ gUnknown_03004DE0[1][task->data[5]] = task->data[6];
+ }
+
+ if (++task->data[3] >= task->data[15])
+ {
+ gUnknown_03004DC0.unk15 = 3;
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+ break;
+ }
+}
+#else
+__attribute__((naked))
+void sub_80D0D68(u8 taskId)
+{
+ asm(".syntax unified\n\
+ push {r4,lr}\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ lsls r0, r4, 2\n\
+ adds r0, r4\n\
+ lsls r0, 3\n\
+ ldr r1, _080D0D88 @ =gTasks\n\
+ adds r3, r0, r1\n\
+ movs r1, 0x10\n\
+ ldrsh r0, [r3, r1]\n\
+ cmp r0, 0\n\
+ beq _080D0D8C\n\
+ cmp r0, 0x1\n\
+ beq _080D0DA2\n\
+ b _080D0E22\n\
+ .align 2, 0\n\
+_080D0D88: .4byte gTasks\n\
+_080D0D8C:\n\
+ ldrh r0, [r3, 0x12]\n\
+ adds r0, 0x1\n\
+ strh r0, [r3, 0x12]\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0x14\n\
+ ble _080D0E22\n\
+ ldrh r0, [r3, 0x10]\n\
+ adds r0, 0x1\n\
+ strh r0, [r3, 0x10]\n\
+ b _080D0E22\n\
+_080D0DA2:\n\
+ ldrh r0, [r3, 0xA]\n\
+ adds r0, 0x1\n\
+ strh r0, [r3, 0xA]\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0x3\n\
+ ble _080D0E22\n\
+ movs r0, 0\n\
+ strh r0, [r3, 0xA]\n\
+ ldrh r1, [r3, 0xE]\n\
+ movs r0, 0x3\n\
+ ands r0, r1\n\
+ strh r0, [r3, 0xC]\n\
+ ldrh r0, [r3, 0x8]\n\
+ subs r0, r1\n\
+ strh r0, [r3, 0x12]\n\
+ movs r2, 0xC\n\
+ ldrsh r1, [r3, r2]\n\
+ cmp r1, 0x1\n\
+ beq _080D0DD8\n\
+ cmp r1, 0x1\n\
+ ble _080D0DE0\n\
+ cmp r1, 0x2\n\
+ beq _080D0DDC\n\
+ cmp r1, 0x3\n\
+ beq _080D0DDC\n\
+ b _080D0DE0\n\
+_080D0DD8:\n\
+ subs r0, 0x2\n\
+ b _080D0DDE\n\
+_080D0DDC:\n\
+ adds r0, 0x1\n\
+_080D0DDE:\n\
+ strh r0, [r3, 0x12]\n\
+_080D0DE0:\n\
+ movs r1, 0x12\n\
+ ldrsh r0, [r3, r1]\n\
+ cmp r0, 0\n\
+ blt _080D0E04\n\
+ ldr r2, _080D0E28 @ =gUnknown_03004DE0\n\
+ lsls r0, 1\n\
+ adds r0, r2\n\
+ ldrh r1, [r3, 0x14]\n\
+ strh r1, [r0]\n\
+ movs r1, 0x12\n\
+ ldrsh r0, [r3, r1]\n\
+ lsls r0, 1\n\
+ movs r1, 0xF0\n\
+ lsls r1, 3\n\
+ adds r2, r1\n\
+ adds r0, r2\n\
+ ldrh r1, [r3, 0x14]\n\
+ strh r1, [r0]\n\
+_080D0E04:\n\
+ ldrh r0, [r3, 0xE]\n\
+ adds r0, 0x1\n\
+ strh r0, [r3, 0xE]\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ movs r2, 0x26\n\
+ ldrsh r1, [r3, r2]\n\
+ cmp r0, r1\n\
+ blt _080D0E22\n\
+ ldr r1, _080D0E2C @ =gUnknown_03004DC0\n\
+ movs r0, 0x3\n\
+ strb r0, [r1, 0x15]\n\
+ adds r0, r4, 0\n\
+ bl DestroyAnimVisualTask\n\
+_080D0E22:\n\
+ pop {r4}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080D0E28: .4byte gUnknown_03004DE0\n\
+_080D0E2C: .4byte gUnknown_03004DC0\n\
+.syntax divided\n");
+}
+#endif
+
+void sub_80D0E30(struct Sprite* sprite)
+{
+ sprite->pos1.x = GetBankPosition(gAnimBankTarget, 0) - 16;
+ sprite->pos1.y = sub_8077FC0(gAnimBankTarget) + 16;
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ sprite->data[3] = 16;
+ sprite->data[4] = 0;
+ sprite->data[5] = sub_807A100(gAnimBankTarget, 0) + 2;
+ sprite->data[6] = BattleAnimAdjustPanning(0x3F);
+ sprite->callback = sub_80D0E8C;
+}
+
+void sub_80D0E8C(struct Sprite* sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ if (++sprite->data[2] > 1)
+ {
+ sprite->data[2] = 0;
+ sprite->invisible = !sprite->invisible;
+ }
+ if (++sprite->data[1] > 16)
+ {
+ sprite->invisible = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 1:
+ if (++sprite->data[1] > 3 && sprite->data[2] < sprite->data[5])
+ {
+ sprite->data[1] = 0;
+ sprite->pos1.y -= 1;
+ sprite->data[2]++;
+ if (sprite->data[2] % 10 == 0)
+ PlaySE12WithPanning(0xCD, sprite->data[6]);
+ }
+ sprite->data[4] += sprite->data[3];
+ if (sprite->data[4] > 31)
+ {
+ sprite->data[4] = 0x40 - sprite->data[4];
+ sprite->data[3] *= -1;
+ }
+ else if (sprite->data[4] <= -32)
+ {
+ sprite->data[4] = -0x40 - sprite->data[4];
+ sprite->data[3] *= -1;
+ }
+ sprite->pos2.x = sprite->data[4];
+ if (sprite->data[5] == sprite->data[2])
+ {
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ if (++sprite->data[2] > 1)
+ {
+ sprite->data[2] = 0;
+ sprite->invisible = !sprite->invisible;
+ }
+ if (++sprite->data[1] > 16)
+ {
+ sprite->invisible = 0;
+ DestroyAnimSprite(sprite);
+ }
+ break;
+ }
+}
diff --git a/src/battle/anim/drum.c b/src/battle/anim/drum.c
new file mode 100755
index 000000000..6306778ae
--- /dev/null
+++ b/src/battle/anim/drum.c
@@ -0,0 +1,32 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+// drum (using hands to slap the Pokemon's belly in a rhythm.)
+// Used in Belly Drum.
+
+void sub_80CEDF0(struct Sprite* sprite)
+{
+ s16 a;
+ if (gBattleAnimArgs[0] == 1)
+ {
+ sprite->oam.matrixNum = 8;
+ a = 16;
+ }
+ else
+ {
+ a = -16;
+ }
+
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2) + a;
+ sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3) + 8;
+ sprite->data[0] = 8;
+ sprite->callback = sub_80782D8;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+}
diff --git a/src/battle/anim/egg.c b/src/battle/anim/egg.c
new file mode 100755
index 000000000..8004b3bf5
--- /dev/null
+++ b/src/battle/anim/egg.c
@@ -0,0 +1,122 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80D13AC(struct Sprite* sprite);
+static void sub_80D1424(struct Sprite* sprite);
+static void sub_80D144C(struct Sprite* sprite);
+static void sub_80D14C4(struct Sprite* sprite);
+static void sub_80D1504(struct Sprite* sprite);
+static void sub_80D154C(struct Sprite* sprite);
+static void sub_80D158C(struct Sprite* sprite);
+
+// egg (a hatching egg)
+// Used in Softboiled.
+
+void sub_80D1368(struct Sprite* sprite)
+{
+ s16 r1;
+ sub_80787B0(sprite, 0);
+ r1 = (GetBankSide(gAnimBankAttacker)) ? -0xA0 : 0xA0;
+ sprite->data[0] = 0x380;
+ sprite->data[1] = r1;
+ sprite->data[7] = gBattleAnimArgs[2];
+ sprite->callback = sub_80D13AC;
+}
+
+void sub_80D13AC(struct Sprite* sprite)
+{
+ s16 add;
+ sprite->pos2.y -= (sprite->data[0] >> 8);
+ sprite->pos2.x = sprite->data[1] >> 8;
+ sprite->data[0] -= 32;
+ add = (GetBankSide(gAnimBankAttacker)) ? -0xA0 : 0xA0;
+ sprite->data[1] += add;
+ if (sprite->pos2.y > 0)
+ {
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+ sprite->data[0] = 0;
+ StartSpriteAffineAnim(sprite, 1);
+ sprite->callback = sub_80D1424;
+ }
+}
+
+void sub_80D1424(struct Sprite* sprite)
+{
+ if (sprite->data[0]++ > 19)
+ {
+ StartSpriteAffineAnim(sprite, 2);
+ sprite->callback = sub_80D144C;
+ }
+}
+
+void sub_80D144C(struct Sprite* sprite)
+{
+ if (sprite->affineAnimEnded)
+ {
+ StartSpriteAffineAnim(sprite, 1);
+ sprite->data[0] = 0;
+ if (sprite->data[7] == 0)
+ {
+ sprite->oam.tileNum += 16;
+ sprite->callback = sub_80D14C4;
+ }
+ else
+ {
+ sprite->oam.tileNum += 32;
+ sprite->callback = sub_80D154C;
+ }
+ }
+}
+
+void sub_80D14C4(struct Sprite* sprite)
+{
+ sprite->pos2.y -= 2;
+ if (++sprite->data[0] == 9)
+ {
+ sprite->data[0] = 16;
+ sprite->data[1] = 0;
+ REG_BLDCNT = 0x3F40;
+ REG_BLDALPHA = sprite->data[0];
+ sprite->callback = sub_80D1504;
+ }
+}
+
+void sub_80D1504(struct Sprite* sprite)
+{
+ if (sprite->data[1]++ % 3 == 0)
+ {
+ sprite->data[0]--;
+ REG_BLDALPHA = sprite->data[0] | ((16 - sprite->data[0]) << 8);
+ if (sprite->data[0] == 0)
+ sprite->callback = sub_80D154C;
+ }
+}
+
+void sub_80D154C(struct Sprite* sprite)
+{
+ if ((u16)gBattleAnimArgs[7] == 0xFFFF)
+ {
+ sprite->invisible = 1;
+ if (sprite->data[7] == 0)
+ sprite->callback = sub_80D158C;
+ else
+ sprite->callback = DestroyAnimSprite;
+ }
+}
+
+void sub_80D158C(struct Sprite* sprite)
+{
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ DestroyAnimSprite(sprite);
+}
diff --git a/src/battle/anim/energy_wave.c b/src/battle/anim/energy_wave.c
new file mode 100644
index 000000000..15045f5bd
--- /dev/null
+++ b/src/battle/anim/energy_wave.c
@@ -0,0 +1,162 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "rom_8077ABC.h"
+#include "sprite.h"
+#include "task.h"
+#include "trig.h"
+
+extern s16 gBattleAnimArgs[8];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+extern const struct SpriteTemplate gSpriteTemplate_83D9130[];
+
+static void sub_80D35DC(struct Sprite *);
+static void sub_80D365C(u8);
+static void sub_80D370C(struct Sprite *);
+
+// energy_wave (animates steady "waves" of energy)
+// Used in Hydro Pump, Mud Shot, Signal Beam, Flamethrower, Psywave, and
+// Hydro Cannon.
+
+void sub_80D3554(struct Sprite *sprite)
+{
+ sub_80787B0(sprite, 1);
+
+ sprite->data[0] = 30;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = GetBankPosition(gAnimBankTarget, 2);
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = GetBankPosition(gAnimBankTarget, 3);
+
+ obj_translate_based_on_private_1_2_3_4(sprite);
+
+ sprite->data[5] = 0xD200 / sprite->data[0];
+ sprite->data[7] = gBattleAnimArgs[3];
+
+ if (gBattleAnimArgs[7] > 127)
+ {
+ sprite->data[6] = (gBattleAnimArgs[7] - 127) << 8;
+ sprite->data[7] = -sprite->data[7];
+ }
+ else
+ {
+ sprite->data[6] = gBattleAnimArgs[7] << 8;
+ }
+
+ sprite->callback = sub_80D35DC;
+ sprite->callback(sprite);
+}
+
+static void sub_80D35DC(struct Sprite *sprite)
+{
+ if (sub_8078B5C(sprite))
+ {
+ DestroyAnimSprite(sprite);
+ }
+
+ sprite->pos2.y += Sin(sprite->data[6] >> 8, sprite->data[7]);
+ if (((sprite->data[6] + sprite->data[5]) >> 8) > 127)
+ {
+ sprite->data[6] = 0;
+ sprite->data[7] = -sprite->data[7];
+ }
+ else
+ {
+ sprite->data[6] += sprite->data[5];
+ }
+}
+
+void sub_80D3630(u8 taskId)
+{
+ gTasks[taskId].data[0] = gBattleAnimArgs[0];
+ gBattleAnimArgs[7] = 0;
+ gTasks[taskId].func = sub_80D365C;
+}
+
+static void sub_80D365C(u8 taskId)
+{
+ gBattleAnimArgs[7] = (gBattleAnimArgs[7] + 3) & 0xFF;
+ if (--gTasks[taskId].data[0] == 0)
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+void sub_80D3698(struct Sprite *sprite)
+{
+ u8 subpriority;
+
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 0);
+ sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 1);
+ sprite->pos2.y = -10;
+
+ subpriority = sub_8079E90(gAnimBankAttacker);
+
+ if (!IsContest())
+ {
+ if (GetBankSide(gAnimBankAttacker) == 0)
+ {
+ sprite->pos2.x = 10;
+ sprite->subpriority = subpriority + 2;
+ }
+ else
+ {
+ sprite->pos2.x = -10;
+ sprite->subpriority = subpriority - 2;
+ }
+ }
+ else
+ {
+ sprite->pos2.x = -10;
+ sprite->subpriority = subpriority + 2;
+ }
+
+ sprite->callback = sub_80D370C;
+}
+
+static void sub_80D370C(struct Sprite *sprite)
+{
+ if (sprite->affineAnimEnded)
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void sub_80D3728(struct Sprite *sprite)
+{
+ int var1, var2;
+
+ if (GetBankSide(gAnimBankAttacker) == GetBankSide(gAnimBankTarget))
+ {
+ gBattleAnimArgs[0] *= -1;
+
+ if (GetBankIdentity(gAnimBankAttacker) == 0 || GetBankIdentity(gAnimBankAttacker) == 1)
+ {
+ gBattleAnimArgs[0] *= -1;
+ }
+
+ }
+
+ if ((gBattleAnimArgs[5] & 0xFF00) == 0)
+ var1 = 1;
+ else
+ var1 = 0;
+
+ if ((u8)gBattleAnimArgs[5] == 0)
+ var2 = 3;
+ else
+ var2 = 1;
+
+ sub_80787B0(sprite, var1);
+
+ if (GetBankSide(gAnimBankAttacker) != 0)
+ {
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+ }
+
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[2] = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[2];
+ sprite->data[4] = GetBankPosition(gAnimBankTarget, var2) + gBattleAnimArgs[3];
+ sprite->callback = sub_8078B34;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+}
diff --git a/src/battle/anim/espeed.c b/src/battle/anim/espeed.c
new file mode 100755
index 000000000..469522092
--- /dev/null
+++ b/src/battle/anim/espeed.c
@@ -0,0 +1,241 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern s8 gUnknown_083D7A00[4][2];
+
+extern struct AffineAnimFrameCmd gUnknown_083D79BC;
+extern struct SpriteTemplate gSpriteTemplate_83D79E8;
+
+static void sub_80D15E0(u8 taskId);
+static void sub_80D16A0(u8 taskId);
+static void sub_80D1808(u8 taskId);
+static void sub_80D1930(u8 taskId);
+
+// espeed (the Pokemon's width decreases as the sprite becomes vertically compressed)
+// Used in Extremespeed.
+
+// apply espeed
+void sub_80D15A4(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ u8 spriteId = GetAnimBankSpriteId(0);
+ task->data[0] = spriteId;
+ sub_80798F4(task, spriteId, &gUnknown_083D79BC);
+ task->func = sub_80D15E0;
+}
+
+void sub_80D15E0(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ if (sub_807992C(task) == 0)
+ {
+ gSprites[task->data[0]].pos2.y = 0;
+ gSprites[task->data[0]].invisible = 1;
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+// espeed hit effect
+void sub_80D1638(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ task->data[0] = 0;
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[12] = 3;
+ if (GetBankSide(gAnimBankTarget) == 0)
+ {
+ task->data[13] = 0xFFFF;
+ task->data[14] = 8;
+ }
+ else
+ {
+ task->data[13] = 1;
+ task->data[14] = -8;
+ }
+
+ task->data[15] = GetAnimBankSpriteId(1);
+ task->func = sub_80D16A0;
+}
+
+void sub_80D16A0(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ gSprites[task->data[15]].pos2.x += task->data[14];
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[0]++;
+ break;
+ case 1:
+ if (++task->data[1] > 1)
+ {
+ task->data[1] = 0;
+ task->data[2]++;
+ if (task->data[2] & 1)
+ gSprites[task->data[15]].pos2.x += 6;
+ else
+ gSprites[task->data[15]].pos2.x -= 6;
+
+ if (++task->data[3] > 4)
+ {
+ if (task->data[2] & 1)
+ gSprites[task->data[15]].pos2.x -= 6;
+
+ task->data[0]++;
+ }
+ }
+ break;
+ case 2:
+ if (--task->data[12] != 0)
+ task->data[0] = 0;
+ else
+ task->data[0]++;
+ break;
+ case 3:
+ gSprites[task->data[15]].pos2.x += task->data[13];
+ if (gSprites[task->data[15]].pos2.x == 0)
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+// espeed poke flicker in
+void sub_80D17C4(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ task->data[0] = 0;
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[4] = 1;
+ task->data[13] = 14;
+ task->data[14] = 2;
+ task->data[15] = GetAnimBankSpriteId(0);
+ task->func = sub_80D1808;
+}
+
+void sub_80D1808(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ if (task->data[0] == 0 && ++task->data[1] > task->data[4])
+ {
+ task->data[1] = 0;
+ if (++task->data[2] & 1)
+ gSprites[task->data[15]].invisible = 0;
+ else
+ gSprites[task->data[15]].invisible = 1;
+
+ if (++task->data[3] >= task->data[13])
+ {
+ if (++task->data[4] < task->data[14])
+ {
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ }
+ else
+ {
+ gSprites[task->data[15]].invisible = 0;
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+ }
+}
+
+// espeed smoke flicker
+void sub_80D18D4(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ task->data[0] = 0;
+ task->data[1] = 4;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[4] = 0;
+ task->data[5] = 0;
+ task->data[6] = 0;
+ task->data[7] = 0;
+ task->data[8] = 0;
+ task->data[13] = 0;
+ task->data[14] = GetBankPosition(gAnimBankAttacker, 0);
+ task->data[15] = GetBankPosition(gAnimBankAttacker, 1);
+ task->func = sub_80D1930;
+}
+
+void sub_80D1930(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ switch (task->data[8])
+ {
+ case 0:
+ if (++task->data[4] > 1)
+ {
+ task->data[4] = 0;
+ task->data[5] = (task->data[5] + 1) & 1;
+ if (++task->data[6] > 20)
+ {
+ if (task->data[7] == 0)
+ {
+ task->data[6] = 0;
+ task->data[8] = 1;
+ }
+ else
+ task->data[8] = 2;
+ }
+ }
+ break;
+ case 1:
+ task->data[5] = 0;
+ if (++task->data[4] > 20)
+ {
+ task->data[7] = 1;
+ task->data[8] = 0;
+ }
+ break;
+ case 2:
+ task->data[5] = 1;
+ break;
+ }
+
+ switch (task->data[0])
+ {
+ case 0:
+ if (++task->data[1] > 4)
+ {
+ u8 spriteId;
+ task->data[1] = 0;
+ spriteId = CreateSprite(&gSpriteTemplate_83D79E8, task->data[14], task->data[15], 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].data[1] = 13;
+ gSprites[spriteId].pos2.x = gUnknown_083D7A00[task->data[2]][0];
+ gSprites[spriteId].pos2.y = gUnknown_083D7A00[task->data[2]][1];
+ task->data[13]++;
+ if (++task->data[2] > 3)
+ {
+ task->data[2] = 0;
+ if (++task->data[3] > 5)
+ task->data[0]++;
+ }
+ }
+ }
+ break;
+ case 1:
+ if (task->data[13] == 0)
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
diff --git a/src/battle/anim/evasion.c b/src/battle/anim/evasion.c
new file mode 100755
index 000000000..ded8428d4
--- /dev/null
+++ b/src/battle/anim/evasion.c
@@ -0,0 +1,95 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "palette.h"
+#include "blend_palette.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80CE910(u8 taskId);
+static void sub_80CE974(struct Sprite* sprite);
+
+// evasion (the shadow seen during evasion increases, mainly Double Team.)
+// Used by Double Team.
+
+void sub_80CE7E0(u8 taskId)
+{
+ u16 i;
+ int obj;
+ u16 r3;
+ u16 r4;
+ struct Task* task = &gTasks[taskId];
+ task->data[0] = GetAnimBankSpriteId(0);
+ task->data[1] = AllocSpritePalette(0x2771);
+ r3 = (task->data[1] * 16) + 0x100;
+ r4 = (gSprites[task->data[0]].oam.paletteNum + 16) << 4;
+ for (i = 1; i < 16; i++)
+ {
+ gPlttBufferUnfaded[r3 + i] = gPlttBufferUnfaded[r4 + i];
+ }
+
+ BlendPalette(r3, 16, 11, 0);
+ task->data[3] = 0;
+ i = 0;
+ while (i <= 1 && (obj = duplicate_obj_of_side_rel2move_in_transparent_mode(0)) >= 0)
+ {
+ gSprites[obj].oam.paletteNum = task->data[1];
+ gSprites[obj].data[0] = 0;
+ gSprites[obj].data[1] = i << 7;
+ gSprites[obj].data[2] = taskId;
+ gSprites[obj].callback = sub_80CE974;
+ task->data[3]++;
+ i++;
+ }
+
+ task->func = sub_80CE910;
+ if (GetBankIdentity_permutated(gAnimBankAttacker) == 1)
+ {
+ REG_DISPCNT &= 0xFDFF;
+ }
+ else
+ {
+ REG_DISPCNT &= 0xFBFF;
+ }
+}
+
+void sub_80CE910(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ if (!task->data[3])
+ {
+ if (GetBankIdentity_permutated(gAnimBankAttacker) == 1)
+ REG_DISPCNT |= 0x200;
+ else
+ REG_DISPCNT |= 0x400;
+
+ FreeSpritePaletteByTag(0x2771);
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+void sub_80CE974(struct Sprite* sprite)
+{
+ if (++sprite->data[3] > 1)
+ {
+ sprite->data[3] = 0;
+ sprite->data[0]++;
+ }
+
+ if (sprite->data[0] > 0x40)
+ {
+ gTasks[sprite->data[2]].data[3]--;
+ obj_delete_but_dont_free_vram(sprite);
+ }
+ else
+ {
+ sprite->data[4] = gSineTable[sprite->data[0]] / 6;
+ sprite->data[5] = gSineTable[sprite->data[0]] / 13;
+ sprite->data[1] = (sprite->data[1] + sprite->data[5]) & 0xFF;
+ sprite->pos2.x = Sin(sprite->data[1], sprite->data[4]);
+ }
+}
diff --git a/src/battle/anim/fang.c b/src/battle/anim/fang.c
new file mode 100755
index 000000000..5ed7372a8
--- /dev/null
+++ b/src/battle/anim/fang.c
@@ -0,0 +1,19 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+// fang
+// Used by Super Fang (and probably Hyper Fang, but the actual callbacks are not in this file.)
+// (Look into this one later.)
+
+void sub_80CEA04(struct Sprite* sprite)
+{
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+ sprite->callback = sub_8078600;
+}
diff --git a/src/battle/anim/fire.c b/src/battle/anim/fire.c
new file mode 100644
index 000000000..253236805
--- /dev/null
+++ b/src/battle/anim/fire.c
@@ -0,0 +1,146 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+
+void sub_80D5038(struct Sprite *);
+void sub_80D50E8(struct Sprite *);
+
+void sub_80D4ED8(struct Sprite *sprite)
+{
+ sprite->data[0] = gBattleAnimArgs[0];
+ sprite->data[1] = 0x3C;
+ sprite->data[2] = 0x9;
+ sprite->data[3] = 0x1E;
+ sprite->data[4] = 0xFE00;
+
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+
+ sprite->callback = sub_8078174;
+ sub_8078174(sprite);
+}
+
+void sub_80D4F18(struct Sprite *sprite)
+{
+ sub_807867C(sprite, gBattleAnimArgs[0]);
+
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[1] = gBattleAnimArgs[2];
+ sprite->data[2] = gBattleAnimArgs[3];
+
+ sprite->callback = sub_8078394;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+}
+
+void sub_80D4F5C(struct Sprite *sprite)
+{
+ sub_8078650(sprite);
+
+ if (GetBankSide(gAnimBankAttacker))
+ {
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[2] = -gBattleAnimArgs[4];
+ }
+ else
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[2] = gBattleAnimArgs[4];
+ }
+
+ sprite->data[1] = gBattleAnimArgs[2];
+ sprite->data[4] = gBattleAnimArgs[3];
+ sprite->data[3] = gBattleAnimArgs[5];
+
+ sprite->callback = sub_80D5038;
+}
+
+void sub_80D4FCC(struct Sprite *sprite)
+{
+ if (GetBankSide(gAnimBankAttacker))
+ {
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[2] = gBattleAnimArgs[4];
+ }
+ else
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[2] = -gBattleAnimArgs[4];
+ }
+
+ sprite->data[1] = gBattleAnimArgs[2];
+ sprite->data[4] = gBattleAnimArgs[3];
+ sprite->data[3] = gBattleAnimArgs[5];
+
+ sprite->callback = sub_80D5038;
+}
+
+void sub_80D5038(struct Sprite *sprite)
+{
+ if (++sprite->data[0] < sprite->data[4])
+ {
+ sprite->pos2.x += sprite->data[2];
+ sprite->pos2.y += sprite->data[3];
+ }
+
+ if (sprite->data[0] == sprite->data[1])
+ move_anim_8074EE0(sprite);
+}
+
+void sub_80D5074(struct Sprite *sprite)
+{
+ sub_8078650(sprite);
+
+ if (GetBankSide(gAnimBankAttacker))
+ {
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ }
+ else
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->subpriority = 8;
+ }
+
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->data[2] = gBattleAnimArgs[4];
+ sprite->data[3] = gBattleAnimArgs[5];
+ sprite->data[4] = gBattleAnimArgs[6];
+ sprite->data[5] = 0;
+
+ sprite->callback = sub_80D50E8;
+}
+
+void sub_80D50E8(struct Sprite *sprite)
+{
+ if (sprite->data[3])
+ {
+ if(sprite->data[5] > 10000)
+ sprite->subpriority = 1;
+
+ sprite->pos2.x = Sin(sprite->data[0], sprite->data[1] + (sprite->data[5] >> 8));
+ sprite->pos2.y = Cos(sprite->data[0], sprite->data[1] + (sprite->data[5] >> 8));
+
+ sprite->data[0] += sprite->data[2];
+ sprite->data[5] += sprite->data[4];
+
+ if (sprite->data[0] > 255)
+ sprite->data[0] -= 256;
+ else if (sprite->data[0] < 0)
+ sprite->data[0] += 256;
+
+ sprite->data[3]--;
+ }
+ else
+ {
+ move_anim_8074EE0(sprite);
+ }
+} \ No newline at end of file
diff --git a/src/battle/anim/fire_2.c b/src/battle/anim/fire_2.c
new file mode 100644
index 000000000..4d577a765
--- /dev/null
+++ b/src/battle/anim/fire_2.c
@@ -0,0 +1,326 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "heated_rock.h"
+#include "rom_8077ABC.h"
+#include "task.h"
+#include "trig.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+extern struct SpriteTemplate gSpriteTemplate_83D96C4;
+extern s16 gHeatedRockCoords[7][2];
+
+void sub_80D5254(struct Sprite *);
+void sub_80D5348(struct Sprite *);
+void sub_80D52AC(struct Sprite *);
+void sub_80D5324(struct Sprite *);
+void sub_80D53F4(struct Sprite *);
+void sub_80D541C(struct Sprite *);
+void sub_80D54E0(u8 taskId);
+void sub_80D57C4(u8 spriteId, u8 taskId, u8 a3);
+
+void sub_80D51A8(struct Sprite *sprite)
+{
+ if (GetBankSide(gAnimBankAttacker) == GetBankSide(gAnimBankTarget)
+ && (gAnimBankAttacker == GetBankByIdentity(2)
+ || gAnimBankAttacker == GetBankByIdentity(3)))
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+
+ sprite->callback = sub_8079534;
+ sub_8079534(sprite);
+}
+
+struct Sprite *sub_80D5210(struct Sprite *sprite)
+{
+ gBattleAnimArgs[0] = -gBattleAnimArgs[0];
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+
+ sprite->callback = sub_8079534;
+ return sprite;
+}
+
+void sub_80D522C(struct Sprite *sprite)
+{
+ sub_80787B0(sprite, 1);
+
+ sprite->data[7] = gBattleAnimArgs[2];
+ sprite->data[0] = 0;
+
+ sprite->callback = sub_80D5254;
+}
+
+void sub_80D5254(struct Sprite *sprite)
+{
+ sub_80D5348(sprite);
+
+ if (++sprite->data[0] == 0x12)
+ {
+ sprite->data[0] = 0x19;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = GetBankPosition(gAnimBankTarget, 2);
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = GetBankPosition(gAnimBankTarget, 3);
+
+ obj_translate_based_on_private_1_2_3_4(sprite);
+
+ sprite->callback = sub_80D52AC;
+ }
+}
+
+void sub_80D52AC(struct Sprite *sprite)
+{
+ if (sub_8078B5C(sprite))
+ {
+ sprite->data[0] = 0;
+
+ sprite->pos1.x = GetBankPosition(gAnimBankTarget, 2);
+ sprite->pos1.y = GetBankPosition(gAnimBankTarget, 3);
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+
+ sprite->callback = sub_80D5324;
+ sub_80D5324(sprite);
+ }
+ else
+ {
+ sprite->pos2.x += Sin(sprite->data[7], 28);
+ sprite->pos2.y += Cos(sprite->data[7], 28);
+
+ sprite->data[7] = (sprite->data[7] + 20) & 0xFF;
+ }
+}
+
+void sub_80D5324(struct Sprite *sprite)
+{
+ sub_80D5348(sprite);
+
+ if (++sprite->data[0] == 0x1F)
+ DestroyAnimSprite(sprite);
+}
+
+void sub_80D5348(struct Sprite *sprite)
+{
+ sprite->pos2.x = Sin(sprite->data[7], 28);
+ sprite->pos2.y = Cos(sprite->data[7], 28);
+
+ sprite->data[7] = (sprite->data[7] + 20) & 0xFF;
+}
+
+void sub_80D5374(struct Sprite *sprite)
+{
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->data[2] = gBattleAnimArgs[4];
+
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+
+ sprite->callback = sub_8078364;
+}
+
+void sub_80D53B4(struct Sprite *sprite)
+{
+ sub_80787B0(sprite, 1);
+
+ sprite->data[1] = gBattleAnimArgs[2];
+ sprite->data[0] = gBattleAnimArgs[3];
+
+ sprite->invisible = TRUE;
+ sprite->callback = sub_80782D8;
+
+ StoreSpriteCallbackInData(sprite, sub_80D53F4);
+}
+
+void sub_80D53F4(struct Sprite *sprite)
+{
+ sprite->invisible = FALSE;
+
+ sprite->data[0] = sprite->data[1];
+ sprite->data[1] = 0;
+
+ sprite->callback = sub_80D541C;
+ sub_80D541C(sprite);
+}
+
+void sub_80D541C(struct Sprite *sprite)
+{
+ sprite->pos2.x = Sin(sprite->data[1], sprite->data[2] >> 8);
+ sprite->pos2.y = Cos(sprite->data[1], sprite->data[2] >> 8);
+
+ sprite->data[1] = (sprite->data[1] + 10) & 0xFF;
+ sprite->data[2] += 0xD0;
+
+ if (--sprite->data[0] == -1)
+ DestroyAnimSprite(sprite);
+}
+
+void sub_80D5470(u8 taskId) // initialize animation task for Move_ERUPTION?
+{
+ struct Task *task = &gTasks[taskId];
+
+ task->data[15] = GetAnimBankSpriteId(0);
+
+ task->data[0] = 0;
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[4] = gSprites[task->data[15]].pos1.y;
+ task->data[5] = GetBankSide(gAnimBankAttacker);
+ task->data[6] = 0;
+
+ sub_8078E70(task->data[15], 0);
+
+ task->func = sub_80D54E0;
+}
+
+void sub_80D54E0(u8 taskId) // animate Move_ERUPTION?
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ sub_8079C08(task, task->data[15], 0x100, 0x100, 0xE0, 0x200, 0x20);
+
+ task->data[0]++;
+ case 1:
+ if (++task->data[1] > 1)
+ {
+ task->data[1] = 0;
+
+ if (++task->data[2] & 0x1)
+ gSprites[task->data[15]].pos2.x = 3;
+ else
+ gSprites[task->data[15]].pos2.x = -3;
+ }
+
+ if (task->data[5])
+ {
+ if (++task->data[3] > 4)
+ {
+ task->data[3] = 0;
+ gSprites[task->data[15]].pos1.y++;
+ }
+ }
+
+ if(!sub_8079C74(task))
+ {
+ sub_8079A64(task->data[15]);
+ gSprites[task->data[15]].pos2.x = 0;
+
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 2:
+ if (++task->data[1] > 4)
+ {
+ if (task->data[5])
+ sub_8079C08(task, task->data[15], 0xE0, 0x200, 0x180, 0xF0, 0x6);
+ else
+ sub_8079C08(task, task->data[15], 0xE0, 0x200, 0x180, 0xC0, 0x6);
+
+ task->data[1] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 3:
+ if (!sub_8079C74(task))
+ {
+ sub_80D57C4(task->data[15], taskId, 6);
+
+ task->data[0]++;
+ }
+ break;
+ case 4:
+ if (++task->data[1] > 1)
+ {
+ task->data[1] = 0;
+
+ if (++task->data[2] & 1)
+ gSprites[task->data[15]].pos2.y += 3;
+ else
+ gSprites[task->data[15]].pos2.y -= 3;
+ }
+
+ if (++task->data[3] > 0x18)
+ {
+ if (task->data[5])
+ sub_8079C08(task, task->data[15], 0x180, 0xF0, 0x100, 0x100, 0x8);
+ else
+ sub_8079C08(task, task->data[15], 0x180, 0xC0, 0x100, 0x100, 0x8);
+
+ if (task->data[2] & 1)
+ gSprites[task->data[15]].pos2.y -= 3;
+
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 5:
+ if (task->data[5])
+ gSprites[task->data[15]].pos1.y--;
+
+ if (!sub_8079C74(task))
+ {
+ gSprites[task->data[15]].pos1.y = task->data[4];
+ sub_8078F40(task->data[15]);
+
+ task->data[2] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 6:
+ if (!task->data[6])
+ DestroyAnimVisualTask(taskId);
+
+ break;
+ default:
+ }
+}
+
+void sub_80D57C4(u8 spriteId, u8 taskId, u8 a3)
+{
+ u16 i, j;
+ s8 sign;
+
+ u16 y = sub_80D5940(spriteId);
+ u16 x = gSprites[spriteId].pos1.x;
+
+ if(!GetBankSide(gAnimBankAttacker))
+ {
+ x -= 0xC;
+ sign = 1;
+ }
+ else
+ {
+ x += 0x10;
+ sign = -1;
+ }
+
+ for (i = 0, j = 0; i <= 6; i++)
+ {
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83D96C4, x, y, 2);
+
+ if (spriteId != 0x40)
+ {
+ gSprites[spriteId].oam.tileNum += j * 4 + 0x40;
+
+ if (++j >= 5)
+ j = 0;
+
+ sub_80D5994(&gSprites[spriteId], gHeatedRockCoords[i][0] * sign, gHeatedRockCoords[i][1]);
+ gSprites[spriteId].data[6] = taskId;
+ gSprites[spriteId].data[7] = a3;
+
+ gTasks[taskId].data[a3]++;
+ }
+ }
+} \ No newline at end of file
diff --git a/src/battle/anim/flash.c b/src/battle/anim/flash.c
new file mode 100755
index 000000000..eaa38e5b7
--- /dev/null
+++ b/src/battle/anim/flash.c
@@ -0,0 +1,123 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "palette.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern struct SpriteTemplate gBattleAnimSpriteTemplate_83D6FC8;
+extern struct SpriteTemplate gBattleAnimSpriteTemplate_83D6FF8;
+
+static void sub_80CE4D4(u8 taskId);
+
+// flash (a "ting!" flash effect.)
+// Used in Moonlight.
+
+void sub_80CE3EC(u8 taskId)
+{
+ int a = sub_80791A8(1, 0, 0, 0, 0, 0, 0) & 0xFFFF;
+ int b;
+ int c;
+ int d;
+
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].data[3] = a;
+ gTasks[taskId].data[4] = 0;
+ gTasks[taskId].data[5] = 0;
+ gTasks[taskId].data[6] = 0;
+ gTasks[taskId].data[7] = 13;
+ gTasks[taskId].data[8] = 14;
+ gTasks[taskId].data[9] = 15;
+ b = sub_80792C0(1, 1, 1, 1);
+ c = a | b;
+ sub_8079BF4(&gTasks[taskId].data[14], &gTasks[taskId].data[15], (void*)c);
+ b = b | (0x10000 << IndexOfSpritePaletteTag(0x27D2));
+ d = IndexOfSpritePaletteTag(0x27D3);
+ BeginNormalPaletteFade((0x10000 << d) | b, 0, 0, 0x10, 32699);
+ gTasks[taskId].func = sub_80CE4D4;
+ sub_80CE4D4(taskId);
+}
+
+void sub_80CE4D4(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ switch (task->data[0])
+ {
+ case 0:
+ if (++task->data[1] > 0)
+ {
+ u16 color;
+ u16 bitmask;
+ u16 r3;
+ u16 i;
+ u16 j;
+ task->data[1] = 0;
+ if (++task->data[2] <= 15)
+ {
+ u16 red;
+ u16 green;
+ u16 blue;
+ task->data[4] += task->data[7];
+ task->data[5] += task->data[8];
+ task->data[6] += task->data[9];
+ red = task->data[4] >> 3;
+ green = task->data[5] >> 3;
+ blue = task->data[6] >> 3;
+ color = RGB(red, green, blue);
+ }
+ else
+ {
+ color = RGB(27, 29, 31);
+ task->data[0]++;
+ }
+
+ bitmask = 1;
+ r3 = 0;
+ for (i = 0; i <= 15; i++)
+ {
+ if (task->data[3] & bitmask)
+ {
+ for (j = 1; j <= 15; j++)
+ {
+ gPlttBufferFaded[r3 + j] = color;
+ }
+ }
+
+ bitmask <<= 1;
+ r3 += 16;
+ }
+ }
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ {
+ u8 spriteId;
+ for (spriteId = 0; spriteId < MAX_SPRITES; spriteId++)
+ {
+ if (gSprites[spriteId].template == &gBattleAnimSpriteTemplate_83D6FC8 || gSprites[spriteId].template == &gBattleAnimSpriteTemplate_83D6FF8)
+ gSprites[spriteId].data[0] = 1;
+ }
+
+ task->data[1] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 2:
+ if (++task->data[1] > 30)
+ {
+ BeginNormalPaletteFade((u32)sub_8079BFC(task->data[14], task->data[15]), 0, 16, 0, RGB(27, 29, 31));
+ task->data[0]++;
+ }
+ break;
+ case 3:
+ if (!gPaletteFade.active)
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
diff --git a/src/battle/anim/flying_hearts.c b/src/battle/anim/flying_hearts.c
new file mode 100755
index 000000000..d2d22602a
--- /dev/null
+++ b/src/battle/anim/flying_hearts.c
@@ -0,0 +1,40 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80D2094(struct Sprite* sprite);
+
+// flying_hearts (hearts float upward from the bottom of the screen.)
+// Used in Attract.
+
+void sub_80D2064(struct Sprite* sprite)
+{
+ sprite->pos1.x = gBattleAnimArgs[0];
+ sprite->pos1.y = 0xA0;
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[1] = gBattleAnimArgs[1];
+ sprite->callback = sub_80782D8;
+ StoreSpriteCallbackInData(sprite, sub_80D2094);
+}
+
+void sub_80D2094(struct Sprite* sprite)
+{
+ s16 y;
+ sprite->data[2] += sprite->data[1];
+ sprite->pos2.y = -((u16)sprite->data[2] >> 8);
+ sprite->pos2.x = Sin(sprite->data[3], 4);
+ sprite->data[3] = (sprite->data[3] + 3) & 0xFF;
+ y = sprite->pos1.y + sprite->pos2.y;
+ if (y <= 0x48)
+ {
+ sprite->invisible = sprite->data[3] % 2;
+ if (y <= 0x40)
+ DestroyAnimSprite(sprite);
+ }
+}
diff --git a/src/battle/anim/flying_path.c b/src/battle/anim/flying_path.c
new file mode 100755
index 000000000..441ac0e6d
--- /dev/null
+++ b/src/battle/anim/flying_path.c
@@ -0,0 +1,296 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern struct SpriteTemplate gSpriteTemplate_83D6884;
+
+static void sub_80CBF5C(u8 taskId);
+static s16 sub_80CC338(struct Sprite* sprite);
+static void sub_80CC358(struct Task* task, u8 taskId);
+static void sub_80CC408(struct Sprite* sprite);
+
+// flying_path (guides a sprite along a specific path.)
+// Used by Leaf Blade.
+
+void sub_80CBDF4(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ task->data[4] = sub_8079E90(gAnimBankTarget) - 1;
+ task->data[6] = GetBankPosition(gAnimBankTarget, 2);
+ task->data[7] = GetBankPosition(gAnimBankTarget, 3);
+ task->data[10] = sub_807A100(gAnimBankTarget, 1);
+ task->data[11] = sub_807A100(gAnimBankTarget, 0);
+ task->data[5] = (GetBankSide(gAnimBankTarget) == 1) ? 1 : -1;
+ task->data[9] = 0x38 - (task->data[5] * 64);
+ task->data[8] = task->data[7] - task->data[9] + task->data[6];
+ task->data[2] = CreateSprite(&gSpriteTemplate_83D6884, task->data[8], task->data[9], task->data[4]);
+ if (task->data[2] == 0x40)
+ DestroyAnimVisualTask(taskId);
+
+ gSprites[task->data[2]].data[0] = 10;
+ gSprites[task->data[2]].data[1] = task->data[8];
+ gSprites[task->data[2]].data[2] = task->data[6] - (task->data[10] / 2 + 10) * task->data[5];
+ gSprites[task->data[2]].data[3] = task->data[9];
+ gSprites[task->data[2]].data[4] = task->data[7] + (task->data[11] / 2 + 10) * task->data[5];
+ gSprites[task->data[2]].data[5] = sub_80CC338(&gSprites[task->data[2]]);
+ sub_80786EC(&gSprites[task->data[2]]);
+ task->func = sub_80CBF5C;
+}
+
+void sub_80CBF5C(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ struct Sprite* sprite = &gSprites[task->data[2]];
+ int a = task->data[0];
+ switch (a)
+ {
+ case 4:
+ sub_80CC358(task, taskId);
+ if (sub_8078718(sprite) == 0)
+ {
+ break;
+ }
+ else
+ {
+ task->data[15] = 5;
+ task->data[0] = 0xFF;
+ }
+ break;
+ case 8:
+ sub_80CC358(task, taskId);
+ if (sub_8078718(sprite) == 0)
+ {
+ break;
+ }
+ else
+ {
+ task->data[15] = 9;
+ task->data[0] = 0xFF;
+ }
+ break;
+ case 0:
+ sub_80CC358(task, taskId);
+ if (sub_8078718(sprite) == 0)
+ break;
+
+ task->data[15] = 1;
+ task->data[0] = 0xFF;
+ break;
+ case 1:
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->data[0] = 10;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = task->data[6];
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = task->data[7];
+ sprite->data[5] = sub_80CC338(sprite);
+ task->data[4] += 2;
+ task->data[3] = a;
+ sprite->subpriority = task->data[4];
+ StartSpriteAnim(sprite, task->data[3]);
+ sub_80786EC(sprite);
+ task->data[0]++;
+ break;
+ case 2:
+ sub_80CC358(task, taskId);
+ if (sub_8078718(sprite) == 0)
+ break;
+
+ task->data[15] = 3;
+ task->data[0] = 0xFF;
+ break;
+ case 3:
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->data[0] = 10;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = task->data[6] - ((task->data[10] / 2) + 10) * task->data[5];
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = task->data[7] - ((task->data[11] / 2) + 10) * task->data[5];
+ sprite->data[5] = sub_80CC338(sprite);
+ task->data[3] = 2;
+ sprite->subpriority = task->data[4];
+ StartSpriteAnim(sprite, task->data[3]);
+ sub_80786EC(sprite);
+ task->data[0]++;
+ break;
+ case 5:
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->data[0] = 10;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = task->data[6] + ((task->data[10] / 2) + 10) * task->data[5];
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = task->data[7] + ((task->data[11] / 2) + 10) * task->data[5];
+ sprite->data[5] = sub_80CC338(sprite);
+ task->data[4] -= 2;
+ task->data[3] = 3;
+ sprite->subpriority = task->data[4];
+ StartSpriteAnim(sprite, task->data[3]);
+ sub_80786EC(sprite);
+ task->data[0]++;
+ break;
+ case 6:
+ sub_80CC358(task, taskId);
+ if (sub_8078718(sprite) == 0)
+ break;
+
+ task->data[15] = 7;
+ task->data[0] = 0xFF;
+ break;
+ case 7:
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->data[0] = 10;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = task->data[6];
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = task->data[7];
+ sprite->data[5] = sub_80CC338(sprite);
+ task->data[4] += 2;
+ task->data[3] = 4;
+ sprite->subpriority = task->data[4];
+ StartSpriteAnim(sprite, task->data[3]);
+ sub_80786EC(sprite);
+ task->data[0]++;
+ break;
+ case 9:
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->data[0] = 10;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = task->data[6] - ((task->data[10] / 2) + 10) * task->data[5];
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = task->data[7] + ((task->data[11] / 2) + 10) * task->data[5];
+ sprite->data[5] = sub_80CC338(sprite);
+ task->data[3] = 5;
+ sprite->subpriority = task->data[4];
+ StartSpriteAnim(sprite, task->data[3]);
+ sub_80786EC(sprite);
+ task->data[0]++;
+ break;
+ case 10:
+ sub_80CC358(task, taskId);
+ if (sub_8078718(sprite) == 0)
+ {
+ break;
+ }
+ else
+ {
+ task->data[15] = 11;
+ task->data[0] = 0xFF;
+ }
+ break;
+ case 11:
+ {
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->data[0] = 10;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = task->data[8];
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = task->data[9];
+ sprite->data[5] = sub_80CC338(sprite);
+ task->data[4] -= 2;
+ task->data[3] = 6;
+ sprite->subpriority = task->data[4];
+ StartSpriteAnim(sprite, task->data[3]);
+ sub_80786EC(sprite);
+ task->data[0]++;
+ break;
+ }
+ case 12:
+ sub_80CC358(task, taskId);
+ if (sub_8078718(sprite) != 0)
+ {
+ DestroySprite(sprite);
+ task->data[0]++;
+ }
+ break;
+ case 13:
+ if (task->data[12] == 0)
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+ break;
+ case 255:
+ task->data[1]++;
+ if (task->data[1] > 5)
+ {
+ task->data[1] = 0;
+ task->data[0] = task->data[15];
+ }
+ break;
+ }
+}
+
+s16 sub_80CC338(struct Sprite* sprite)
+{
+ s16 var = 8;
+ if (sprite->data[4] < sprite->pos1.y)
+ var = -var;
+
+ return var;
+}
+
+void sub_80CC358(struct Task* task, u8 taskId)
+{
+ task->data[14]++;
+ if (task->data[14] > 0)
+ {
+ u8 spriteId;
+ s16 spriteX;
+ s16 spriteY;
+ task->data[14] = 0;
+ spriteX = gSprites[task->data[2]].pos1.x + gSprites[task->data[2]].pos2.x;
+ spriteY = gSprites[task->data[2]].pos1.y + gSprites[task->data[2]].pos2.y;
+ spriteId = CreateSprite(&gSpriteTemplate_83D6884, spriteX, spriteY, task->data[4]);
+ if (spriteId != 0x40)
+ {
+ gSprites[spriteId].data[6] = taskId;
+ gSprites[spriteId].data[7] = 12;
+ gTasks[taskId].data[12]++;
+ gSprites[spriteId].data[0] = task->data[13] & 1;
+ gTasks[taskId].data[13]++;
+ StartSpriteAnim(&gSprites[spriteId], task->data[3]);
+ gSprites[spriteId].subpriority = task->data[4];
+ gSprites[spriteId].callback = sub_80CC408;
+ }
+ }
+}
+
+void sub_80CC408(struct Sprite* sprite)
+{
+ sprite->data[0]++;
+ if (sprite->data[0] > 1)
+ {
+ sprite->data[0] = 0;
+ sprite->invisible ^= 1;
+ sprite->data[1]++;
+ if (sprite->data[1] > 8)
+ {
+ gTasks[sprite->data[6]].data[sprite->data[7]]--;
+ DestroySprite(sprite);
+ }
+ }
+}
diff --git a/src/battle/anim/flying_petals.c b/src/battle/anim/flying_petals.c
new file mode 100755
index 000000000..4eeaa5215
--- /dev/null
+++ b/src/battle/anim/flying_petals.c
@@ -0,0 +1,83 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80CC580(struct Sprite* sprite);
+
+// flying_petals (petals fly across the screen.)
+// Used by Aromatherapy.
+
+void sub_80CC474(struct Sprite* sprite)
+{
+ u8 bank;
+ if (!gBattleAnimArgs[6])
+ bank = gAnimBankAttacker;
+ else
+ bank = gAnimBankTarget;
+
+ if (GetBankSide(bank) != 0)
+ {
+ sprite->data[4] = 0;
+ sprite->data[2] = gBattleAnimArgs[3];
+ sprite->pos1.x = 0xFFF0;
+ }
+ else
+ {
+ sprite->data[4] = 1;
+ sprite->data[2] = -gBattleAnimArgs[3];
+ sprite->pos1.x = 0x100;
+ }
+
+ sprite->data[1] = gBattleAnimArgs[1];
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[3] = gBattleAnimArgs[4];
+ switch (gBattleAnimArgs[5])
+ {
+ case 0:
+ sprite->pos1.y = gBattleAnimArgs[0];
+ sprite->oam.priority = sub_8079ED4(bank);
+ break;
+ case 1:
+ sprite->pos1.y = gBattleAnimArgs[0];
+ sprite->oam.priority = sub_8079ED4(bank) + 1;
+ break;
+ case 2:
+ sprite->pos1.y = GetBankPosition(bank, 3) + gBattleAnimArgs[0];
+ sprite->oam.priority = sub_8079ED4(bank);
+ break;
+ case 3:
+ sprite->pos1.y = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[0];
+ GetAnimBankSpriteId(1);
+ sprite->oam.priority = sub_8079ED4(bank) + 1;
+ break;
+ }
+
+ sprite->callback = sub_80CC580;
+}
+
+void sub_80CC580(struct Sprite* sprite)
+{
+ int a = sprite->data[7];
+ sprite->data[7]++;
+ sprite->pos2.y = (sprite->data[1] * gSineTable[sprite->data[0]]) >> 8;
+ sprite->pos2.x = sprite->data[2] * a;
+ sprite->data[0] = (sprite->data[3] * a) & 0xFF;
+ if (sprite->data[4] == 0)
+ {
+ if (sprite->pos2.x + sprite->pos1.x <= 0xF7)
+ return;
+ }
+ else
+ {
+ if (sprite->pos2.x + sprite->pos1.x > -16)
+ return;
+ }
+
+ move_anim_8074EE0(sprite);
+}
diff --git a/src/battle/anim/fury_cutter_count.c b/src/battle/anim/fury_cutter_count.c
new file mode 100644
index 000000000..6b41055cb
--- /dev/null
+++ b/src/battle/anim/fury_cutter_count.c
@@ -0,0 +1,20 @@
+#include "global.h"
+#include "battle.h"
+#include "battle_anim.h"
+
+extern s16 gBattleAnimArgs[8];
+
+// fury_cutter (updates the direction and count of the fury cutter animation)
+// Used in Fury Cutter.
+
+void UpdateFuryCutterAnimDirection(u8 taskId)
+{
+ gBattleAnimArgs[7] = gAnimDisableStructPtr->furyCutterCounter & 1;
+ DestroyAnimVisualTask(taskId);
+}
+
+void UpdateFuryCutterAnimCount(u8 taskId)
+{
+ gBattleAnimArgs[7] = gAnimDisableStructPtr->furyCutterCounter;
+ DestroyAnimVisualTask(taskId);
+}
diff --git a/src/battle/anim/glitter.c b/src/battle/anim/glitter.c
new file mode 100755
index 000000000..e4577f1e1
--- /dev/null
+++ b/src/battle/anim/glitter.c
@@ -0,0 +1,63 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+// glitter (the sparkling effect seen on Pokemon, usually after healing or a beneficial effect.)
+// Used by Heal Bell, Cosmic Power, and Aromatherapy.
+
+void sub_80CD140(struct Sprite* sprite)
+{
+ if (!gBattleAnimArgs[2])
+ sub_8078650(sprite);
+
+ sub_807867C(sprite, gBattleAnimArgs[0]);
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[0] = gBattleAnimArgs[5];
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->data[2] = gBattleAnimArgs[4];
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+ sprite->callback = sub_8078394;
+}
+
+void sub_80CD190(struct Sprite* sprite)
+{
+ u8 bank;
+ if (!gBattleAnimArgs[2])
+ bank = gAnimBankAttacker;
+ else
+ bank = gAnimBankTarget;
+
+ if (IsDoubleBattle() && IsAnimBankSpriteVisible(bank ^ 2))
+ {
+ sub_807A3FC(bank, gBattleAnimArgs[6], &sprite->pos1.x, &sprite->pos1.y);
+ sub_807867C(sprite, gBattleAnimArgs[0]);
+ sprite->pos1.y += gBattleAnimArgs[1];
+ }
+ else
+ {
+ if (!gBattleAnimArgs[6])
+ {
+ sprite->pos1.x = GetBankPosition(bank, 0);
+ sprite->pos1.y = GetBankPosition(bank, 1) + gBattleAnimArgs[1];
+ }
+ else
+ {
+ sprite->pos1.x = GetBankPosition(bank, 2);
+ sprite->pos1.y = GetBankPosition(bank, 3) + gBattleAnimArgs[1];
+ }
+
+ sub_807867C(sprite, gBattleAnimArgs[0]);
+ }
+
+ sprite->data[0] = gBattleAnimArgs[5];
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->data[2] = gBattleAnimArgs[4];
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+ sprite->callback = sub_8078394;
+}
diff --git a/src/battle/anim/glow.c b/src/battle/anim/glow.c
new file mode 100755
index 000000000..63466c0ff
--- /dev/null
+++ b/src/battle/anim/glow.c
@@ -0,0 +1,55 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "ewram.h"
+#include "palette.h"
+#include "decompress.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern u16 gUnknown_083D7A5C[5];
+
+extern struct INCBIN_U8 gBattleAnimSpritePalette_206;
+
+// glow (a whitening effect where the Pokemon glows white in a cycle.)
+// Used in Heal Bell.
+
+void sub_80D1ADC(u8 taskId)
+{
+ int i;
+ u8 sp[8];
+ void* src;
+ void* dest;
+ void* what;
+ sp[0] = IndexOfSpritePaletteTag(0x27DE);
+ for (i = 1; i <= 4; i++)
+ {
+ sp[i] = AllocSpritePalette(0x2710 - i);
+ }
+
+ src = &gBattleAnimSpritePalette_206;
+ dest = (IsContest()) ? gSharedMem + 0x18000 - 0x3800: gSharedMem + 0x18000;
+ LZDecompressWram(src, dest);
+ for (i = 0; i <= 4; i++)
+ {
+ what = ((IsContest()) ? gSharedMem + 0x14800 : gSharedMem + 0x18000) + (i << 5);
+ LoadPalette(what, (u16)((sp[i] << 4) + 0x100), 32);
+ }
+
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_80D1B80(u8 taskId)
+{
+ int i;
+ for (i = 0; i < 5; i++)
+ {
+ FreeSpritePaletteByTag(gUnknown_083D7A5C[i]);
+ }
+
+ DestroyAnimVisualTask(taskId);
+}
diff --git a/src/battle/anim/grip.c b/src/battle/anim/grip.c
new file mode 100755
index 000000000..c4d7b1cef
--- /dev/null
+++ b/src/battle/anim/grip.c
@@ -0,0 +1,44 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80D020C(struct Sprite* sprite);
+
+// grip (does a slash which is capable of mirroring for the effect of "gripping".)
+// Used in Vice Grip.
+
+void sub_80D0178(struct Sprite* sprite)
+{
+ s16 r7 = 32;
+ s16 r4 = -32;
+ s16 r8 = 16;
+ s16 r6 = -16;
+ if (gBattleAnimArgs[0] != 0)
+ {
+ r7 = r4;
+ r4 = 32;
+ r8 = r6;
+ r6 = 16;
+ StartSpriteAnim(sprite, 1);
+ }
+
+ sprite->pos1.x += r7;
+ sprite->pos1.y += r4;
+ sprite->data[0] = 6;
+ sprite->data[2] = GetBankPosition(gAnimBankTarget, 2) + r8;
+ sprite->data[4] = GetBankPosition(gAnimBankTarget, 3) + r6;
+ sprite->callback = sub_8078B34;
+ StoreSpriteCallbackInData(sprite, sub_80D020C);
+}
+
+void sub_80D020C(struct Sprite* sprite)
+{
+ if (sprite->animEnded == 1)
+ DestroyAnimSprite(sprite);
+}
diff --git a/src/battle/anim/grow.c b/src/battle/anim/grow.c
new file mode 100755
index 000000000..8788b32fe
--- /dev/null
+++ b/src/battle/anim/grow.c
@@ -0,0 +1,31 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern struct AffineAnimFrameCmd gUnknown_083D7714;
+
+static void sub_80D0904(u8 taskId);
+
+// grow (grows a Pokemon then shrinks back to normal size.)
+// Used in Swagger and Bulk Up.
+
+void sub_80D08C8(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ u8 spriteId = GetAnimBankSpriteId(0);
+ sub_80798F4(task, spriteId, &gUnknown_083D7714);
+ task->func = sub_80D0904;
+}
+
+void sub_80D0904(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ if (!sub_807992C(task))
+ DestroyAnimVisualTask(taskId);
+}
diff --git a/src/battle/anim/guard.c b/src/battle/anim/guard.c
new file mode 100644
index 000000000..ab093eab1
--- /dev/null
+++ b/src/battle/anim/guard.c
@@ -0,0 +1,34 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "rom_8077ABC.h"
+
+extern s16 gBattleAnimArgs[8];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+extern u16 gBattleTypeFlags;
+
+// guard (moves guard rings upwards)
+// Used in Safeguard.
+
+void sub_80D3014(struct Sprite *sprite)
+{
+ if ((gBattleTypeFlags & 1) && IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2))
+ {
+ sub_807A3FC(gAnimBankAttacker, 0, &sprite->pos1.x, &sprite->pos1.y);
+ sprite->pos1.y += 40;
+
+ StartSpriteAffineAnim(sprite, 1);
+ }
+ else
+ {
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 0);
+ sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 1) + 40;
+ }
+
+ sprite->data[0] = 13;
+ sprite->data[2] = sprite->pos1.x;
+ sprite->data[4] = sprite->pos1.y - 72;
+
+ sprite->callback = sub_8078B34;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+}
diff --git a/src/battle/anim/guillotine.c b/src/battle/anim/guillotine.c
new file mode 100755
index 000000000..b3d842cdf
--- /dev/null
+++ b/src/battle/anim/guillotine.c
@@ -0,0 +1,90 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80D02D0(struct Sprite* sprite);
+static void sub_80D0344(struct Sprite* sprite);
+static void sub_80D03A8(struct Sprite* sprite);
+
+// guillotine (does a reverse grip where the slices can reverse at a given period.)
+// Used in Guillotine.
+
+void sub_80D0228(struct Sprite* sprite)
+{
+ s16 r8 = 32;
+ s16 r4 = -32;
+ s16 r9 = 16;
+ s16 r6 = -16;
+ if (gBattleAnimArgs[0] != 0)
+ {
+ r8 = r4;
+ r4 = 32;
+ r9 = r6;
+ r6 = 16;
+ StartSpriteAnim(sprite, gBattleAnimArgs[0]);
+ }
+
+ sprite->pos1.x += r8;
+ sprite->pos1.y += r4;
+ sprite->data[0] = 6;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = GetBankPosition(gAnimBankTarget, 2) + r9;
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = GetBankPosition(gAnimBankTarget, 3) + r6;
+ obj_translate_based_on_private_1_2_3_4(sprite);
+ sprite->data[5] = gBattleAnimArgs[0];
+ sprite->data[6] = sprite->data[0];
+ sprite->callback = sub_80D02D0;
+}
+
+void sub_80D02D0(struct Sprite* sprite)
+{
+ if (sub_8078B5C(sprite) && sprite->animEnded == 1)
+ {
+ SeekSpriteAnim(sprite, 0);
+ sprite->animPaused = 1;
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.x = 2;
+ sprite->pos2.y = -2;
+ sprite->data[0] = sprite->data[6];
+ sprite->data[1] ^= 1;
+ sprite->data[2] ^= 1;
+ sprite->data[4] = 0;
+ sprite->data[3] = 0;
+ sprite->callback = sub_80D0344;
+ }
+}
+
+void sub_80D0344(struct Sprite* sprite)
+{
+ if (sprite->data[3])
+ {
+ sprite->pos2.x = -sprite->pos2.x;
+ sprite->pos2.y = -sprite->pos2.y;
+ }
+
+ sprite->data[3] ^= 1;
+ if (++sprite->data[4] == 0x33)
+ {
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+ sprite->data[4] = 0;
+ sprite->data[3] = 0;
+ sprite->animPaused = 0;
+ StartSpriteAnim(sprite, sprite->data[5] ^ 1);
+ sprite->callback = sub_80D03A8;
+ }
+}
+
+void sub_80D03A8(struct Sprite* sprite)
+{
+ if (sub_8078B5C(sprite) != 0)
+ DestroyAnimSprite(sprite);
+}
diff --git a/src/battle/anim/heal.c b/src/battle/anim/heal.c
new file mode 100755
index 000000000..a8c14ea1c
--- /dev/null
+++ b/src/battle/anim/heal.c
@@ -0,0 +1,27 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+// heal (healing sparkles on a Pokemon)
+// Used in Present, if the move heals instead of damages.
+
+void sub_80CBAA4(struct Sprite* sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sub_8078764(sprite, 0);
+ sprite->data[1] = gBattleAnimArgs[2];
+ }
+
+ sprite->data[0]++;
+ sprite->pos2.y = sprite->data[1] * sprite->data[0];
+ if (sprite->animEnded)
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
diff --git a/src/battle/anim/heart_1.c b/src/battle/anim/heart_1.c
new file mode 100755
index 000000000..5df89f929
--- /dev/null
+++ b/src/battle/anim/heart_1.c
@@ -0,0 +1,25 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+// heart_1 (a floating heart in a wave pattern upward.)
+// Used in Charm, Covet, and when a Pokemon is infatuated.
+
+void sub_80D1C80(struct Sprite* sprite)
+{
+ if (++sprite->data[0] == 1)
+ sub_80787B0(sprite, 0);
+
+ sprite->pos2.x = Sin(sprite->data[1], 8);
+ sprite->pos2.y = sprite->data[2] >> 8;
+ sprite->data[1] = (sprite->data[1] + 7) & 0xFF;
+ sprite->data[2] -= 0x80;
+ if (sprite->data[0] == 0x3C)
+ DestroyAnimSprite(sprite);
+}
diff --git a/src/battle/anim/heated_rock.c b/src/battle/anim/heated_rock.c
new file mode 100644
index 000000000..51cfbd007
--- /dev/null
+++ b/src/battle/anim/heated_rock.c
@@ -0,0 +1,205 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "rom_8077ABC.h"
+
+extern s16 gBattleAnimArgs[8];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+extern u16 gBattleTypeFlags;
+
+void sub_80D59B0(struct Sprite *);
+static void sub_80D5A74(struct Sprite *);
+
+// heated_rock (moves heated rock sprites)
+// Used in Eruption.
+
+void sub_80D58FC(struct Sprite *sprite)
+{
+ sub_80D59B0(sprite);
+
+ if (sprite->invisible)
+ {
+ gTasks[sprite->data[6]].data[sprite->data[7]]--;
+ DestroySprite(sprite);
+ }
+}
+
+u16 sub_80D5940(u8 spriteId)
+{
+ u16 var1 = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y + gSprites[spriteId].centerToCornerVecY;
+
+ if (GetBankSide(gAnimBankAttacker) == 0)
+ {
+ var1 = ((var1 << 16) + 0x4A0000) >> 16;
+ }
+ else
+ {
+ var1 = ((var1 << 16) + 0x2C0000) >> 16;
+ }
+
+ return var1;
+}
+
+void sub_80D5994(struct Sprite *sprite, s16 x, s16 y)
+{
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ sprite->data[2] = (u16)sprite->pos1.x * 8;
+ sprite->data[3] = (u16)sprite->pos1.y * 8;
+ sprite->data[4] = x * 8;
+ sprite->data[5] = y * 8;
+}
+
+#ifdef NONMATCHING
+void sub_80D59B0(struct Sprite *sprite)
+{
+ int var1;
+ int var2;
+
+ if (++sprite->data[0] > 2)
+ {
+ sprite->data[0] = 0;
+ ++sprite->data[1];
+ sprite->data[3] += ((u16)sprite->data[1] * (u16)sprite->data[1]);
+ }
+
+ var1 = (u16)sprite->data[4] + (u16)sprite->data[2];
+ sprite->data[2] = var1;
+ var1 = (s16)var1 >> 3;
+ sprite->pos1.x = var1;
+
+ var2 = (u16)sprite->data[5] + (u16)sprite->data[3];
+ sprite->data[3] = var2;
+ var2 = (s16)var2 >> 3;
+ sprite->pos1.y = var2;
+
+ if ((u32)((var1 + 8) << 16) > 0x1000000 || var2 < -8 || var2 > 120)
+ {
+ sprite->invisible = 1;
+ }
+}
+#else
+__attribute__((naked))
+void sub_80D59B0(struct Sprite *sprite)
+{
+ asm(".syntax unified\n\
+ push {lr}\n\
+ adds r2, r0, 0\n\
+ ldrh r0, [r2, 0x2E]\n\
+ adds r0, 0x1\n\
+ strh r0, [r2, 0x2E]\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0x2\n\
+ ble _080D59DA\n\
+ movs r0, 0\n\
+ strh r0, [r2, 0x2E]\n\
+ ldrh r0, [r2, 0x30]\n\
+ adds r0, 0x1\n\
+ strh r0, [r2, 0x30]\n\
+ ldrh r0, [r2, 0x30]\n\
+ adds r1, r0, 0\n\
+ muls r1, r0\n\
+ adds r0, r1, 0\n\
+ ldrh r3, [r2, 0x34]\n\
+ adds r0, r3\n\
+ strh r0, [r2, 0x34]\n\
+_080D59DA:\n\
+ ldrh r0, [r2, 0x36]\n\
+ ldrh r1, [r2, 0x32]\n\
+ adds r0, r1\n\
+ strh r0, [r2, 0x32]\n\
+ lsls r0, 16\n\
+ asrs r0, 19\n\
+ strh r0, [r2, 0x20]\n\
+ ldrh r1, [r2, 0x38]\n\
+ ldrh r3, [r2, 0x34]\n\
+ adds r1, r3\n\
+ strh r1, [r2, 0x34]\n\
+ lsls r1, 16\n\
+ asrs r3, r1, 19\n\
+ strh r3, [r2, 0x22]\n\
+ adds r0, 0x8\n\
+ lsls r0, 16\n\
+ movs r1, 0x80\n\
+ lsls r1, 17\n\
+ cmp r0, r1\n\
+ bhi _080D5A10\n\
+ adds r1, r3, 0\n\
+ movs r0, 0x8\n\
+ negs r0, r0\n\
+ cmp r1, r0\n\
+ blt _080D5A10\n\
+ cmp r1, 0x78\n\
+ ble _080D5A1C\n\
+_080D5A10:\n\
+ adds r0, r2, 0\n\
+ adds r0, 0x3E\n\
+ ldrb r1, [r0]\n\
+ movs r2, 0x4\n\
+ orrs r1, r2\n\
+ strb r1, [r0]\n\
+_080D5A1C:\n\
+ pop {r0}\n\
+ bx r0\n\
+ .syntax divided\n");
+}
+#endif // NONMATCHING
+
+void sub_80D5A20(struct Sprite *sprite)
+{
+ sprite->pos1.x = gBattleAnimArgs[0];
+ sprite->pos1.y = gBattleAnimArgs[1];
+
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ sprite->data[6] = gBattleAnimArgs[2];
+ sprite->data[7] = gBattleAnimArgs[3];
+
+ sprite->oam.tileNum += gBattleAnimArgs[4] * 16;
+ sprite->callback = sub_80D5A74;
+}
+
+static void sub_80D5A74(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ if (sprite->data[6] != 0)
+ {
+ sprite->data[6]--;
+ return;
+ }
+
+ sprite->data[0]++;
+ // fall through
+ case 1:
+ sprite->pos1.y += 8;
+ if (sprite->pos1.y >= sprite->data[7])
+ {
+ sprite->pos1.y = sprite->data[7];
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ if (++sprite->data[1] > 1)
+ {
+ sprite->data[1] = 0;
+ if ((++sprite->data[2] & 1) != 0)
+ {
+ sprite->pos2.y = -3;
+ }
+ else
+ {
+ sprite->pos2.y = 3;
+ }
+ }
+
+ if (++sprite->data[3] > 16)
+ {
+ DestroyAnimSprite(sprite);
+ }
+ break;
+ }
+}
diff --git a/src/battle/anim/homing.c b/src/battle/anim/homing.c
new file mode 100755
index 000000000..6fb4a76d8
--- /dev/null
+++ b/src/battle/anim/homing.c
@@ -0,0 +1,86 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80CC7D4(struct Sprite* sprite);
+
+// homing (the spinning effect of sprites going inward in a static rotation.)
+// Used by Needle Arm.
+
+void sub_80CC6CC(struct Sprite* sprite)
+{
+ u8 a;
+ u8 b;
+ u16 c;
+ u16 x;
+ u16 y;
+
+ if (gBattleAnimArgs[4] == 0)
+ {
+ DestroyAnimSprite(sprite);
+ }
+ else
+ {
+ if (gBattleAnimArgs[0] == 0)
+ {
+ a = GetBankPosition(gAnimBankAttacker, 2);
+ b = GetBankPosition(gAnimBankAttacker, 3);
+ }
+ else
+ {
+ a = GetBankPosition(gAnimBankTarget, 2);
+ b = GetBankPosition(gAnimBankTarget, 3);
+ }
+
+ sprite->data[0] = gBattleAnimArgs[4];
+ if (gBattleAnimArgs[1] == 0)
+ {
+ sprite->pos1.x = gBattleAnimArgs[2] + a;
+ sprite->pos1.y = gBattleAnimArgs[3] + b;
+ sprite->data[5] = a;
+ sprite->data[6] = b;
+ }
+ else
+ {
+ sprite->pos1.x = a;
+ sprite->pos1.y = b;
+ sprite->data[5] = gBattleAnimArgs[2] + a;
+ sprite->data[6] = gBattleAnimArgs[3] + b;
+ }
+
+ x = sprite->pos1.x;
+ sprite->data[1] = x * 16;
+ y = sprite->pos1.y;
+ sprite->data[2] = y * 16;
+ sprite->data[3] = (sprite->data[5] - sprite->pos1.x) * 16 / gBattleAnimArgs[4];
+ sprite->data[4] = (sprite->data[6] - sprite->pos1.y) * 16 / gBattleAnimArgs[4];
+ c = sub_80790F0(sprite->data[5] - x, sprite->data[6] - y);
+ if (IsContest())
+ c -= 0x8000;
+
+ sub_8078FDC(sprite, 0, 0x100, 0x100, c);
+ sprite->callback = sub_80CC7D4;
+ }
+}
+
+void sub_80CC7D4(struct Sprite* sprite)
+{
+ if (sprite->data[0])
+ {
+ sprite->data[1] += sprite->data[3];
+ sprite->data[2] += sprite->data[4];
+ sprite->pos1.x = sprite->data[1] >> 4 ;
+ sprite->pos1.y = sprite->data[2] >> 4 ;
+ sprite->data[0]--;
+ }
+ else
+ {
+ move_anim_8074EE0(sprite);
+ }
+}
diff --git a/src/battle/anim/hop.c b/src/battle/anim/hop.c
new file mode 100755
index 000000000..4006e2d43
--- /dev/null
+++ b/src/battle/anim/hop.c
@@ -0,0 +1,160 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+// hop (where a sprite "hops" across the screen)
+// Used by Present, Trick, and the item knock off effect.
+
+void sub_80CB7EC(struct Sprite* sprite, s16 c)
+{
+ s32 a = (sprite->pos1.x * 256) | sprite->pos1.y;
+ s32 b = (sprite->data[6] * 256) | sprite->data[7];
+ c *= 256;
+ sprite->data[5] = a;
+ sprite->data[6] = b;
+ sprite->data[7] = c;
+}
+
+bool8 sub_80CB814(struct Sprite* sprite)
+{
+ u16 r10 = (u8)(sprite->data[5] >> 8);
+ u16 r9 = (u8)sprite->data[5];
+ s32 r2 = (u8)(sprite->data[6] >> 8);
+ s32 r4 = (u8)sprite->data[6];
+ s16 r6 = sprite->data[7] >> 8;
+ s16 r3 = sprite->data[7] & 0xFF;
+ s16 r4_2;
+ s16 r0;
+ s32 var1;
+ s32 var2;
+
+ if (r2 == 0)
+ {
+ r2 = -32;
+ }
+ else if (r2 == 255)
+ {
+ r2 = 0x110;
+ }
+
+ r4_2 = r4 - r9;
+ r0 = r2 - r10;
+ var1 = r0 * r3 / r6;
+ var2 = r4_2 * r3 / r6;
+ sprite->pos1.x = var1 + r10;
+ sprite->pos1.y = var2 + r9;
+ if (++r3 == r6)
+ return TRUE;
+
+ sprite->data[7] = (r6 << 8) | r3;
+ return FALSE;
+}
+
+void sub_80CB8B8(struct Sprite* sprite)
+{
+ if (sprite->data[0] == 10)
+ {
+ StartSpriteAffineAnim(sprite, 1);
+ }
+
+ sprite->data[0]++;
+ if (sprite->data[0] > 50)
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void sub_80CB8E8(struct Sprite* sprite)
+{
+ sprite->data[0] += sprite->data[3] * 128 / sprite->data[4];
+ if (sprite->data[0] >= 128)
+ {
+ sprite->data[1]++;
+ sprite->data[0] = 0;
+ }
+
+ sprite->pos2.y = Sin(sprite->data[0] + 128, 30 - sprite->data[1] * 8);
+ if (sub_80CB814(sprite))
+ {
+ sprite->pos2.y = 0;
+ sprite->data[0] = 0;
+ sprite->callback = sub_80CB8B8;
+ }
+}
+
+void sub_80CB94C(struct Sprite* sprite)
+{
+ s16 e1;
+ s16 e2;
+ sub_80787B0(sprite, 0);
+ e1 = GetBankPosition(gAnimBankTarget, 0);
+ e2 = GetBankPosition(gAnimBankTarget, 1);
+ if ((gAnimBankAttacker ^ 2) == gAnimBankTarget)
+ {
+ sprite->data[6] = e1;
+ sprite->data[7] = e2 + 10;
+ sub_80CB7EC(sprite, 0x3C);
+ sprite->data[3] = 1;
+ }
+ else
+ {
+ sprite->data[6] = e1;
+ sprite->data[7] = e2 + 10;
+ sub_80CB7EC(sprite, 0x3C);
+ sprite->data[3] = 3;
+ }
+
+ sprite->data[4] = 0x3C;
+ sprite->callback = sub_80CB8E8;
+}
+
+void sub_80CB9C4(struct Sprite* sprite)
+{
+ int zero;
+ sprite->data[0] += ((sprite->data[3] * 128) / sprite->data[4]);
+ zero = 0;
+ if (sprite->data[0] > 0x7F)
+ {
+ sprite->data[1]++;
+ sprite->data[0] = zero;
+ }
+
+ sprite->pos2.y = Sin(sprite->data[0] + 0x80, 30 - sprite->data[1] * 8);
+ if (sub_80CB814(sprite))
+ {
+ sprite->pos2.y = zero;
+ sprite->data[0] = zero;
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void sub_80CBA28(struct Sprite* sprite)
+{
+ s16 e = GetBankPosition(gAnimBankTarget, 1);
+ if (GetBankSide(gAnimBankTarget) == 0)
+ {
+ sprite->data[6] = 0;
+ sprite->data[7] = e + 10;
+ sub_80CB7EC(sprite, 0x28);
+ sprite->data[3] = 3;
+ sprite->data[4] = 0x3C;
+ sprite->callback = sub_80CB8E8;
+ }
+ else
+ {
+ sprite->data[6] = 255;
+ sprite->data[7] = e + 10;
+ if (IsContest())
+ sprite->data[6] = 0;
+
+ sub_80CB7EC(sprite, 0x28);
+ sprite->data[3] = 3;
+ sprite->data[4] = 0x3C;
+ sprite->callback = sub_80CB9C4;
+ }
+}
diff --git a/src/battle/anim/hop_2.c b/src/battle/anim/hop_2.c
new file mode 100755
index 000000000..1bc3f46af
--- /dev/null
+++ b/src/battle/anim/hop_2.c
@@ -0,0 +1,70 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern void sub_80CB7EC(struct Sprite* sprite, s16 c);
+extern bool8 sub_80CB814(struct Sprite* sprite);
+extern void sub_80CB8B8(struct Sprite* sprite);
+
+static void sub_80CBB60(struct Sprite* sprite);
+
+// hop_2
+// Used in item steal.
+
+void sub_80CBAE8(struct Sprite* sprite)
+{
+ s16 p1;
+ s16 p2;
+ sub_8078764(sprite, 0);
+ p1 = GetBankPosition(gAnimBankAttacker, 0);
+ p2 = GetBankPosition(gAnimBankAttacker, 1);
+ if ((gAnimBankTarget ^ 2) == gAnimBankAttacker)
+ {
+ sprite->data[6] = p1;
+ sprite->data[7] = p2 + 10;
+ sub_80CB7EC(sprite, 0x3c);
+ sprite->data[3] = 1;
+ }
+ else
+ {
+ sprite->data[6] = p1;
+ sprite->data[7] = p2 + 10;
+ sub_80CB7EC(sprite, 0x3c);
+ sprite->data[3] = 3;
+ }
+
+ sprite->data[4] = 0x3C;
+ sprite->callback = sub_80CBB60;
+}
+
+void sub_80CBB60(struct Sprite* sprite)
+{
+ int zero;
+ sprite->data[0] += ((sprite->data[3] * 128) / sprite->data[4]);
+ zero = 0;
+ if (sprite->data[0] > 0x7F)
+ {
+ sprite->data[1]++;
+ sprite->data[0] = zero;
+ }
+
+ sprite->pos2.y = Sin(sprite->data[0] + 0x80, 30 - sprite->data[1] * 8);
+ if (sprite->pos2.y == 0)
+ {
+ PlaySE12WithPanning(0x7D, BattleAnimAdjustPanning(0x3F));
+ }
+
+ if (sub_80CB814(sprite))
+ {
+ sprite->pos2.y = 0;
+ sprite->data[0] = 0;
+ sprite->callback = sub_80CB8B8;
+ PlaySE12WithPanning(0x7D, BattleAnimAdjustPanning(-0x40));
+ }
+}
diff --git a/src/battle/anim/kiss_fountain.c b/src/battle/anim/kiss_fountain.c
new file mode 100755
index 000000000..d3270ee65
--- /dev/null
+++ b/src/battle/anim/kiss_fountain.c
@@ -0,0 +1,38 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+// kiss_fountain (a series of hearts pour out of a target Pokemon.)
+// Used in Attract and Sweet Kiss.
+
+void sub_80D1FDC(struct Sprite* sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sprite->data[1] = gBattleAnimArgs[0];
+ sprite->data[2] = gBattleAnimArgs[1];
+ sprite->data[0]++;
+ }
+ else
+ {
+ sprite->data[4] += sprite->data[1];
+ sprite->pos2.x = sprite->data[4] >> 8;
+ sprite->pos2.y = Sin(sprite->data[3], sprite->data[2]);
+ sprite->data[3] = (sprite->data[3] + 3) & 0xFF;
+ if (sprite->data[3] > 0x64)
+ {
+ sprite->invisible = sprite->data[3] % 2;
+ }
+
+ if (sprite->data[3] > 0x78)
+ {
+ DestroyAnimSprite(sprite);
+ }
+ }
+}
diff --git a/src/battle/anim/leaf.c b/src/battle/anim/leaf.c
new file mode 100755
index 000000000..676734717
--- /dev/null
+++ b/src/battle/anim/leaf.c
@@ -0,0 +1,74 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80CAF20(struct Sprite* sprite);
+static void sub_80CAF6C(struct Sprite* sprite);
+
+// leaf
+// Used by Razor Leaf and Twister.
+
+void sub_80CAED8(struct Sprite* sprite)
+{
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2);
+ sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3);
+ sprite->data[0] = gBattleAnimArgs[0];
+ sprite->data[1] = gBattleAnimArgs[1];
+ sprite->data[2] = gBattleAnimArgs[2];
+ sprite->callback = sub_80CAF20;
+}
+
+void sub_80CAF20(struct Sprite* sprite)
+{
+ if (!sprite->data[2])
+ {
+ if (sprite->data[1] & 1)
+ {
+ sprite->data[0] = 0x80;
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ }
+ else
+ {
+ sprite->data[0] = sprite->data[1] & 1;
+ sprite->data[1] = sprite->data[1] & 1;
+ sprite->data[2] = sprite->data[1] & 1;
+ }
+ sprite->callback = sub_80CAF6C;
+ }
+ else
+ {
+ sprite->data[2]--;
+ sprite->pos1.x += sprite->data[0];
+ sprite->pos1.y += sprite->data[1];
+ }
+}
+
+void sub_80CAF6C(struct Sprite* sprite)
+{
+ if (GetBankSide(gAnimBankAttacker))
+ {
+ sprite->pos2.x = -Sin(sprite->data[0], 0x19);
+ }
+ else
+ {
+ sprite->pos2.x = Sin(sprite->data[0], 0x19);
+ }
+
+ sprite->data[0] = (sprite->data[0] + 2) & 0xFF;
+ sprite->data[1]++;
+ if (!(sprite->data[1] & 1))
+ {
+ sprite->pos2.y++;
+ }
+
+ if (sprite->data[1] > 0x50)
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
diff --git a/src/battle/anim/love_bg.c b/src/battle/anim/love_bg.c
new file mode 100755
index 000000000..bd3d22ca6
--- /dev/null
+++ b/src/battle/anim/love_bg.c
@@ -0,0 +1,121 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "decompress.h"
+#include "palette.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern struct INCBIN_U8 gAttractTilemap;
+extern struct INCBIN_U8 gAttractGfx;
+extern struct INCBIN_U8 gAttractPal;
+
+extern u16 gBattle_BG1_Y;
+extern u16 gBattle_BG1_X;
+
+static void sub_80D21F0(u8 taskId);
+
+// love_bg (makes the BG a background of hearts.)
+// Used in Attract.
+
+void sub_80D2100(u8 taskId)
+{
+ struct Struct_sub_8078914 subStruct;
+ u8* tempvar;
+ REG_BLDCNT = 0x3F42;
+ REG_BLDALPHA = 0x1000;
+ REG_BG1CNT_BITFIELD.priority = 3;
+ REG_BG1CNT_BITFIELD.screenSize = 0;
+ if (!IsContest())
+ REG_BG1CNT_BITFIELD.charBaseBlock = 1;
+
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ sub_8078914(&subStruct);
+ tempvar = subStruct.field_4;
+ DmaFill32(3, 0x0, tempvar, 0x1000);
+ LZDecompressVram(&gAttractTilemap, tempvar);
+ LZDecompressVram(&gAttractGfx, subStruct.field_0);
+ LoadCompressedPalette(&gAttractPal, subStruct.field_8 << 4, 32);
+ if (IsContest())
+ sub_80763FC(subStruct.field_8, (u16 *)subStruct.field_4, 0, 0);
+
+ gTasks[taskId].func = sub_80D21F0;
+}
+
+void sub_80D21F0(u8 taskId)
+{
+ struct Struct_sub_8078914 subStruct;
+
+ switch (gTasks[taskId].data[12])
+ {
+ case 0:
+ if (++gTasks[taskId].data[10] == 4)
+ {
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[11]++;
+ REG_BLDALPHA = gTasks[taskId].data[11] | ((16 - gTasks[taskId].data[11]) << 8);
+ if (gTasks[taskId].data[11] == 16)
+ {
+ gTasks[taskId].data[12]++;
+ gTasks[taskId].data[11] = 0;
+ }
+ }
+ break;
+ case 1:
+ if (++gTasks[taskId].data[11] == 0x8D)
+ {
+ gTasks[taskId].data[11] = 16;
+ gTasks[taskId].data[12]++;
+ }
+ break;
+ case 2:
+ if (++gTasks[taskId].data[10] == 4)
+ {
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[11]--;
+ REG_BLDALPHA = gTasks[taskId].data[11] | ((16 - gTasks[taskId].data[11]) << 8);
+ if (gTasks[taskId].data[11] == 0)
+ {
+ gTasks[taskId].data[12]++;
+ gTasks[taskId].data[11] = 0;
+ }
+ }
+ break;
+ case 3:
+ sub_8078914(&subStruct);
+ {
+ u8 *addr = subStruct.field_0;
+ u32 size = 0x2000;
+ while (1)
+ {
+ DmaFill32(3, 0, addr, 0x1000);
+ addr += 0x1000;
+ size -= 0x1000;
+ if (size <= 0x1000)
+ {
+ DmaFill32(3, 0, addr, size);
+ break;
+ }
+ }
+ }
+ DmaClear32(3, subStruct.field_4, 0x800);
+ if (!IsContest())
+ REG_BG1CNT_BITFIELD.charBaseBlock = 0;
+
+ gTasks[taskId].data[12]++;
+ // fall through
+ case 4:
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ REG_BG1CNT_BITFIELD.priority = 1;
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
diff --git a/src/battle/anim/lunge_1.c b/src/battle/anim/lunge_1.c
new file mode 100755
index 000000000..d379c8f09
--- /dev/null
+++ b/src/battle/anim/lunge_1.c
@@ -0,0 +1,124 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern u8 gObjectBankIDs[];
+
+static void sub_80CD7CC(struct Sprite* sprite);
+static void sub_80CD81C(struct Sprite* sprite);
+static void sub_80CD8A8(struct Sprite* sprite);
+static void sub_80CD8F8(struct Sprite* sprite);
+static void sub_80CD91C(struct Sprite* sprite);
+static void sub_80CD9B8(struct Sprite* sprite);
+
+// lunge_1 (makes the pokemon sprite do a "lunge" where it leans back to attack, usually with its head or horn.)
+// Used in Drill Peck, Headbutt, Horn Attack, and Horn Drill.
+
+void sub_80CD774(struct Sprite* sprite)
+{
+ sprite->invisible = 1;
+ sprite->data[0] = 0;
+ switch (gBattleAnimArgs[0])
+ {
+ case 0:
+ sprite->callback = sub_80CD7CC;
+ break;
+ case 1:
+ sprite->callback = sub_80CD8A8;
+ break;
+ case 2:
+ sprite->callback = sub_80CD8F8;
+ break;
+ default:
+ sprite->callback = sub_80CD9B8;
+ break;
+ }
+}
+
+void sub_80CD7CC(struct Sprite* sprite)
+{
+ sprite->data[0] = 6;
+ sprite->data[1] = (GetBankSide(gAnimBankAttacker)) ? 2 : -2;
+ sprite->data[2] = 0;
+ sprite->data[3] = gObjectBankIDs[gAnimBankAttacker];
+ StoreSpriteCallbackInData(sprite, sub_80CD81C);
+ sprite->callback = sub_8078458;
+}
+
+void sub_80CD81C(struct Sprite* sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sprite->data[3] = gObjectBankIDs[gAnimBankAttacker];
+ sub_8078E70(sprite->data[3], 0);
+ sprite->data[4] = (sprite->data[6] = GetBankSide(gAnimBankAttacker)) ? 0x300 : 0xFFFFFD00;
+ sprite->data[5] = 0;
+ }
+
+ sprite->data[5] += sprite->data[4];
+ obj_id_set_rotscale(sprite->data[3], 0x100, 0x100, sprite->data[5]);
+ sub_8078F9C(sprite->data[3]);
+ if (++sprite->data[0] > 3)
+ {
+ sprite->data[0] = 0;
+ sprite->callback = sub_80CD9B8;
+ }
+}
+
+void sub_80CD8A8(struct Sprite* sprite)
+{
+ sprite->data[0] = 4;
+ sprite->data[1] = (GetBankSide(gAnimBankAttacker)) ? -3 : 3;
+ sprite->data[2] = 0;
+ sprite->data[3] = gObjectBankIDs[gAnimBankAttacker];
+ StoreSpriteCallbackInData(sprite, sub_80CD9B8);
+ sprite->callback = sub_8078458;
+}
+
+void sub_80CD8F8(struct Sprite* sprite)
+{
+ if (++sprite->data[0] > 8)
+ {
+ sprite->data[0] = 0;
+ sprite->callback = sub_80CD91C;
+ }
+}
+
+void sub_80CD91C(struct Sprite* sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sprite->data[3] = gObjectBankIDs[gAnimBankAttacker];
+ sprite->data[6] = GetBankSide(gAnimBankAttacker);
+ if (GetBankSide(gAnimBankAttacker))
+ {
+ sprite->data[4] = 0xFC00;
+ sprite->data[5] = 0xC00;
+ }
+ else
+ {
+ sprite->data[4] = 0x400;
+ sprite->data[5] = 0xF400;
+ }
+ }
+
+ sprite->data[5] += sprite->data[4];
+ obj_id_set_rotscale(sprite->data[3], 0x100, 0x100, sprite->data[5]);
+ sub_8078F9C(sprite->data[3]);
+ if (++sprite->data[0] > 2)
+ {
+ sub_8078F40(sprite->data[3]);
+ sprite->callback = sub_80CD9B8;
+ }
+}
+
+void sub_80CD9B8(struct Sprite* sprite)
+{
+ DestroyAnimSprite(sprite);
+}
diff --git a/src/battle/anim/lunge_2.c b/src/battle/anim/lunge_2.c
new file mode 100755
index 000000000..fe2470567
--- /dev/null
+++ b/src/battle/anim/lunge_2.c
@@ -0,0 +1,163 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern u8 gObjectBankIDs[];
+
+static void sub_80CDB60(u8 taskId);
+static void sub_80CDD20(u8 taskId);
+
+// lunge_2
+// Drill Peck
+
+void sub_80CDAC8(u8 taskId)
+{
+ u8 a;
+
+ gTasks[taskId].data[0] = gObjectBankIDs[gAnimBankAttacker];
+ a = GetBankSide(gAnimBankAttacker);
+ gTasks[taskId].data[1] = a;
+ gTasks[taskId].data[2] = 0;
+ switch (gBattleAnimArgs[0])
+ {
+ default:
+ DestroyAnimVisualTask(taskId);
+ break;
+ case 0:
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].data[3] = 8;
+ gTasks[taskId].data[4] = 0;
+ gTasks[taskId].data[5] = 3;
+ if (a == 0)
+ gTasks[taskId].data[5] *= -1;
+
+ gTasks[taskId].func = sub_80CDB60;
+ break;
+ case 1:
+ gTasks[taskId].data[3] = 8;
+ gTasks[taskId].data[4] = 0x600;
+ gTasks[taskId].data[5] = 0xC0;
+ if (a == 0)
+ {
+ gTasks[taskId].data[4] = -gTasks[taskId].data[4];
+ gTasks[taskId].data[5] = -gTasks[taskId].data[5];
+ }
+
+ gTasks[taskId].func = sub_80CDD20;
+ break;
+ }
+}
+
+void sub_80CDB60(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ switch (task->data[2])
+ {
+ case 0:
+ if (task->data[3])
+ {
+ task->data[4] += task->data[5];
+ gSprites[task->data[0]].pos2.x = task->data[4];
+ task->data[3]--;
+ }
+ else
+ {
+ task->data[3] = 8;
+ task->data[4] = 0;
+ task->data[5] = (task->data[1] == 0) ? -0xC0 : 0xC0;
+ sub_8078E70(task->data[0], 0);
+ task->data[2]++;
+ }
+ break;
+ case 1:
+ if (task->data[3])
+ {
+ task->data[4] += task->data[5];
+ obj_id_set_rotscale(task->data[0], 0x100, 0x100, task->data[4]);
+ sub_8078F9C(task->data[0]);
+ task->data[3]--;
+ }
+ else
+ {
+ task->data[3] = 8;
+ task->data[4] = gSprites[task->data[0]].pos2.x;
+ task->data[5] = (task->data[1] == 0) ? 0x2 : -0x2;
+ task->data[6] = 1;
+ task->data[2]++;
+ }
+ break;
+ case 2:
+ if (task->data[3])
+ {
+ if (task->data[6])
+ {
+ task->data[6]--;
+ }
+ else
+ {
+ if (task->data[3] & 1)
+ gSprites[task->data[0]].pos2.x = task->data[4] + task->data[5];
+ else
+ gSprites[task->data[0]].pos2.x = task->data[4] - task->data[5];
+
+ task->data[6] = 1;
+ task->data[3]--;
+ }
+ }
+ else
+ {
+ gSprites[task->data[0]].pos2.x = task->data[4];
+ task->data[3] = 12;
+ task->data[2]++;
+ }
+ break;
+ case 3:
+ if (task->data[3])
+ {
+ task->data[3]--;
+ }
+ else
+ {
+ task->data[3] = 3;
+ task->data[4] = gSprites[task->data[0]].pos2.x;
+ task->data[5] = (task->data[1] == 0) ? 8 : -8;
+ task->data[2]++;
+ }
+ break;
+ case 4:
+ if (task->data[3])
+ {
+ task->data[4] += task->data[5];
+ gSprites[task->data[0]].pos2.x = task->data[4];
+ task->data[3]--;
+ }
+ else
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+ break;
+ }
+}
+
+void sub_80CDD20(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ if (task->data[3])
+ {
+ task->data[4] -= task->data[5];
+ obj_id_set_rotscale(task->data[0], 0x100, 0x100, task->data[4]);
+ sub_8078F9C(task->data[0]);
+ task->data[3]--;
+ }
+ else
+ {
+ sub_8078F40(task->data[0]);
+ DestroyAnimVisualTask(taskId);
+ }
+}
diff --git a/src/battle/anim/money.c b/src/battle/anim/money.c
new file mode 100755
index 000000000..8358d23db
--- /dev/null
+++ b/src/battle/anim/money.c
@@ -0,0 +1,62 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80CFF68(struct Sprite* sprite);
+
+// money
+// Used by Pay Day.
+
+void sub_80CFE9C(struct Sprite* sprite)
+{
+ s16 r6;
+ s16 r7;
+ u16 var;
+
+ sub_80787B0(sprite, 1);
+ r6 = GetBankPosition(gAnimBankTarget, 2);
+ r7 = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[3];
+ if (GetBankSide(gAnimBankAttacker) != 0)
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+
+ r6 += gBattleAnimArgs[2];
+ var = sub_80790F0(r6 - sprite->pos1.x, r7 - sprite->pos1.y);
+ var += 0xC000;
+ sub_8078FDC(sprite, 0, 0x100, 0x100, var);
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[2] = r6;
+ sprite->data[4] = r7;
+ sprite->callback = sub_8078C00;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+}
+
+void sub_80CFF50(struct Sprite* sprite)
+{
+ sprite->data[2] = -16;
+ sprite->pos1.y += 8;
+ sprite->callback = sub_80CFF68;
+}
+
+void sub_80CFF68(struct Sprite* sprite)
+{
+ sprite->data[0] += 0x80;
+ sprite->pos2.x = sprite->data[0] >> 8;
+ if (GetBankSide(gAnimBankAttacker) == 0)
+ sprite->pos2.x = -sprite->pos2.x;
+
+ sprite->pos2.y = Sin(sprite->data[1], sprite->data[2]);
+ sprite->data[1] += 5;
+ if (sprite->data[1] > 0x7E)
+ {
+ sprite->data[1] = 0;
+ sprite->data[2] /= 2;
+ if (++sprite->data[3] == 2)
+ DestroyAnimSprite(sprite);
+ }
+}
diff --git a/src/battle/anim/moon.c b/src/battle/anim/moon.c
new file mode 100755
index 000000000..c532e8057
--- /dev/null
+++ b/src/battle/anim/moon.c
@@ -0,0 +1,39 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80CE354(struct Sprite* sprite);
+
+// moon (shows a moon image.)
+// Used in Moonlight.
+
+void sub_80CE30C(struct Sprite* sprite)
+{
+ if (IsContest())
+ {
+ sprite->pos1.x = 0x30;
+ sprite->pos1.y = 0x28;
+ }
+ else
+ {
+ sprite->pos1.x = gBattleAnimArgs[0];
+ sprite->pos1.y = gBattleAnimArgs[1];
+ }
+
+ sprite->oam.shape = 0;
+ sprite->oam.size = 3;
+ sprite->data[0] = 0;
+ sprite->callback = sub_80CE354;
+}
+
+void sub_80CE354(struct Sprite* sprite)
+{
+ if (sprite->data[0])
+ DestroyAnimSprite(sprite);
+}
diff --git a/src/battle/anim/noise.c b/src/battle/anim/noise.c
new file mode 100644
index 000000000..369650d82
--- /dev/null
+++ b/src/battle/anim/noise.c
@@ -0,0 +1,56 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "battle_anim.h"
+
+extern s16 gBattleAnimArgs[8];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80D2E30(struct Sprite *);
+
+// noise (moving music note)
+// Used in Uproar.
+
+void sub_80D2D68(struct Sprite* sprite)
+{
+ int var1;
+ u8 slot = gBattleAnimArgs[0] == 0 ? gAnimBankAttacker : gAnimBankTarget;
+
+ if (GetBankSide(slot) == 1)
+ {
+ gBattleAnimArgs[1] *= -1;
+ }
+
+ sprite->pos1.x = GetBankPosition(slot, 2) + gBattleAnimArgs[1];
+ sprite->pos1.y = GetBankPosition(slot, 3) + gBattleAnimArgs[2];
+ sprite->data[0] = 0;
+ sprite->data[1] = (u16)sprite->pos1.x << 3;
+ sprite->data[2] = (u16)sprite->pos1.y << 3;
+
+ var1 = gBattleAnimArgs[1] << 3;
+ if (var1 < 0)
+ var1 += 7;
+ sprite->data[3] = var1 >> 3;
+
+ var1 = gBattleAnimArgs[2] << 3;
+ if (var1 < 0)
+ var1 += 7;
+ sprite->data[4] = var1 >> 3;
+
+ sprite->oam.tileNum += gBattleAnimArgs[3] * 16;
+ sprite->callback = sub_80D2E30;
+}
+
+static void sub_80D2E30(struct Sprite *sprite)
+{
+ sprite->data[1] += sprite->data[3];
+ sprite->data[2] += sprite->data[4];
+
+ sprite->pos1.x = sprite->data[1] >> 3;
+ sprite->pos1.y = sprite->data[2] >> 3;
+
+ if (++sprite->data[0] > 16)
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
diff --git a/src/battle/anim/note_rain.c b/src/battle/anim/note_rain.c
new file mode 100755
index 000000000..715462d73
--- /dev/null
+++ b/src/battle/anim/note_rain.c
@@ -0,0 +1,37 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern u16 gUnknown_083D7A5C[5];
+
+// note_rain (notes rain from a source point, usually a bell.)
+// Used in Heal Bell.
+
+void sub_80D1BA8(struct Sprite* sprite, u8 a, u8 b)
+{
+ u8 tile;
+ tile = (b & 1);
+ tile = ((-tile | tile) >> 31) & 32;
+ sprite->oam.tileNum += tile + (a << 2);
+ sprite->oam.paletteNum = IndexOfSpritePaletteTag(gUnknown_083D7A5C[b >> 1]);
+}
+
+void sub_80D1C08(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 0);
+ if (GetBankSide(gAnimBankAttacker) != 0)
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[2] = GetBankPosition(gAnimBankAttacker, 0) + gBattleAnimArgs[2];
+ sprite->data[4] = GetBankPosition(gAnimBankAttacker, 1) + gBattleAnimArgs[3];
+ sprite->callback = sub_8078B34;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+ sub_80D1BA8(sprite, gBattleAnimArgs[5], gBattleAnimArgs[6]);
+}
diff --git a/src/battle/anim/note_scatter.c b/src/battle/anim/note_scatter.c
new file mode 100755
index 000000000..8564c58fe
--- /dev/null
+++ b/src/battle/anim/note_scatter.c
@@ -0,0 +1,54 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80CED78(struct Sprite* sprite);
+
+// note_scatter
+// Used by Teeter Dance.
+
+void sub_80CECE8(struct Sprite* sprite)
+{
+ int a;
+ if (GetBankSide(gAnimBankAttacker) == 1)
+ {
+ a = gBattleAnimArgs[1];
+ (u16)gBattleAnimArgs[1] = -a;
+ }
+
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2) + gBattleAnimArgs[1];
+ sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3) + gBattleAnimArgs[2];
+ StartSpriteAnim(sprite, gBattleAnimArgs[0]);
+ sprite->data[2] = 0;
+ sprite->data[3] = 0;
+ sprite->data[4] = sprite->pos1.x << 4;
+ sprite->data[5] = sprite->pos1.y << 4;
+ sprite->data[6] = (gBattleAnimArgs[1] << 4) / 5;
+ sprite->data[7] = (gBattleAnimArgs[2] << 7) / 5;
+ sprite->callback = sub_80CED78;
+}
+
+void sub_80CED78(struct Sprite* sprite)
+{
+ sprite->data[4] += sprite->data[6];
+ sprite->data[5] += sprite->data[7];
+ sprite->pos1.x = sprite->data[4] >> 4;
+ sprite->pos1.y = sprite->data[5] >> 4;
+ if (sprite->data[0] > 5 && sprite->data[3] == 0)
+ {
+ sprite->data[2] = (sprite->data[2] + 16) & 0xFF;
+ sprite->pos2.x = Cos(sprite->data[2], 18);
+ sprite->pos2.y = Sin(sprite->data[2], 18);
+ if (sprite->data[2] == 0)
+ sprite->data[3] = 1;
+ }
+
+ if (++sprite->data[0] == 0x30)
+ move_anim_8074EE0(sprite);
+}
diff --git a/src/battle/anim/note_scatter_2.c b/src/battle/anim/note_scatter_2.c
new file mode 100755
index 000000000..524c51c08
--- /dev/null
+++ b/src/battle/anim/note_scatter_2.c
@@ -0,0 +1,57 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern u16 gUnknown_083D712C[4][6];
+
+static void sub_80CEEE8(struct Sprite* sprite);
+
+// note_scatter_2 (slower scatter of notes.)
+// Used in Belly Drum.
+
+void sub_80CEE60(struct Sprite* sprite)
+{
+ s16 a;
+ u8 index;
+ sub_8078650(sprite);
+ sprite->pos1.y += 8;
+ StartSpriteAnim(sprite, gBattleAnimArgs[1]);
+ index = IndexOfSpritePaletteTag(gUnknown_083D712C[gBattleAnimArgs[2]][0]);
+ if (index != 0xFF)
+ sprite->oam.paletteNum = index;
+
+ a = (gBattleAnimArgs[0] == 0) ? 0xFFE0 : 0x20;
+ sprite->data[0] = 40;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = a + sprite->data[1];
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = sprite->data[3] - 40;
+ obj_translate_based_on_private_1_2_3_4(sprite);
+ sprite->data[5] = gBattleAnimArgs[3];
+ sprite->callback = sub_80CEEE8;
+}
+
+void sub_80CEEE8(struct Sprite* sprite)
+{
+ if (sub_8078B5C(sprite) == 0)
+ {
+ s16 a;
+ a = Sin(sprite->data[5], 8);
+ if (sprite->pos2.x < 0)
+ a = -a;
+
+ sprite->pos2.x += a;
+ sprite->pos2.y += Sin(sprite->data[5], 4);
+ sprite->data[5] = (sprite->data[5] + 8) & 0xFF;
+ }
+ else
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
diff --git a/src/battle/anim/note_spin.c b/src/battle/anim/note_spin.c
new file mode 100644
index 000000000..026ee1856
--- /dev/null
+++ b/src/battle/anim/note_spin.c
@@ -0,0 +1,110 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+
+extern s16 gBattleAnimArgs[8];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80D2F80(struct Sprite *);
+static void sub_80D2FA4(struct Sprite *);
+
+// note_spin (spins music notes around, and rotates them)
+// Used in Perish Song.
+
+void sub_80D2E68(struct Sprite *sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sprite->data[1] = 120 - gBattleAnimArgs[0];
+ sprite->invisible = 1;
+ }
+
+ if (++sprite->data[0] == sprite->data[1])
+ {
+ sub_8079108(sprite->oam.paletteNum + 16, 0);
+ }
+
+ if (sprite->data[0] == sprite->data[1] + 80)
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void sub_80D2EC8(struct Sprite *sprite)
+{
+ int index;
+ int var2;
+
+ if (sprite->data[0] == 0)
+ {
+ sprite->pos1.x = 120;
+ sprite->pos1.y = (gBattleAnimArgs[0] + (((u16)gBattleAnimArgs[0]) >> 31)) / 2 - 15;
+
+ StartSpriteAnim(sprite, gBattleAnimArgs[1]);
+
+ sprite->data[5] = 120;
+ sprite->data[3] = gBattleAnimArgs[2];
+ }
+
+ sprite->data[0]++;
+
+ sprite->data[1] = (sprite->data[0] + ((u16)sprite->data[0] >> 31)) / 2;
+ index = ((sprite->data[0] * 3) + (u16)sprite->data[3]);
+ var2 = 0xFF;
+ sprite->data[6] = (sprite->data[6] + 10) & 0xFF;
+
+ index &= var2;
+ sprite->pos2.x = Cos(index, 100);
+
+ sprite->pos2.y = sprite->data[1] + Sin(index, 10) + Cos(sprite->data[6], 4);
+
+ if (sprite->data[0] > sprite->data[5])
+ {
+ sprite->callback = sub_80D2F80;
+
+ sprite->data[0] = 0;
+ oamt_add_pos2_onto_pos1(sprite);
+ sprite->data[2] = 5;
+ sprite->data[4] = 0;
+ sprite->data[3] = 0;
+
+ StartSpriteAffineAnim(sprite, 1);
+ }
+}
+
+static void sub_80D2F80(struct Sprite *sprite)
+{
+ if (++sprite->data[0] > 10)
+ {
+ sprite->data[0] = 0;
+ sprite->callback = sub_80D2FA4;
+ }
+}
+
+static void sub_80D2FA4(struct Sprite *sprite)
+{
+ sprite->data[3] += sprite->data[2];
+ sprite->pos2.y = sprite->data[3];
+
+ sprite->data[2]++;
+
+ if (sprite->data[3] > 48 && sprite->data[2] > 0)
+ {
+ sprite->data[2] = sprite->data[4] - 5;
+ sprite->data[4]++;
+ }
+
+ if (sprite->data[4] > 3)
+ {
+ int var1 = sprite->data[2];
+ sprite->invisible = var1 - (((s32)(var1 + ((u32)var1 >> 31)) >> 1) << 1);
+ DestroyAnimSprite(sprite);
+ }
+
+ if (sprite->data[4] == 4)
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
diff --git a/src/battle/anim/note_wave.c b/src/battle/anim/note_wave.c
new file mode 100755
index 000000000..80ed2256f
--- /dev/null
+++ b/src/battle/anim/note_wave.c
@@ -0,0 +1,143 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "palette.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern u16 gUnknown_083D712C[4][6];
+
+static void sub_80CEBC4(s16 a, s16 b, s16* c, s16* d, s8 e);
+static void sub_80CEC1C(struct Sprite* sprite);
+
+// note_wave
+// Used by Grasswhistle, Belly Drum, and Sing.
+
+// rainbow effect for musical notes
+void sub_80CEA20(u8 taskId)
+{
+ u16 i;
+ u16 j;
+ u16 index;
+
+ index = IndexOfSpritePaletteTag(gUnknown_083D712C[0][0]);
+ if (index != 0xFF)
+ {
+ index = (index << 4) + 0x100;
+ for (i = 1; i < 6; i++)
+ {
+ gPlttBufferFaded[index + i] = gUnknown_083D712C[0][i];
+ }
+ }
+
+ for (j = 1; j < 4; j++)
+ {
+ index = AllocSpritePalette(gUnknown_083D712C[j][0]);
+ if (index != 0xFF)
+ {
+ index = (index << 4) + 0x100;
+ for (i = 1; i < 6; i++)
+ {
+ gPlttBufferFaded[index + i] = gUnknown_083D712C[j][i];
+ }
+ }
+ }
+ DestroyAnimVisualTask(taskId);
+}
+
+// clears the rainbow effect for musical notes.
+void sub_80CEAD8(u8 taskId)
+{
+ u16 i;
+ for (i = 1; i < 4; i++)
+ {
+ FreeSpritePaletteByTag(gUnknown_083D712C[i][0]);
+ }
+
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_80CEB0C(struct Sprite* sprite)
+{
+ u8 index;
+ u8 a;
+ u8 b;
+ sub_8078650(sprite);
+ StartSpriteAnim(sprite, gBattleAnimArgs[0]);
+ if ((index = IndexOfSpritePaletteTag(gUnknown_083D712C[gBattleAnimArgs[1]][0])) != 0xFF)
+ sprite->oam.paletteNum = index;
+
+ sprite->data[1] = gBattleAnimArgs[1];
+ sprite->data[2] = 0;
+ sprite->data[3] = gBattleAnimArgs[2];
+ if (IsContest())
+ {
+ a = 0x30;
+ b = 0x28;
+ }
+ else
+ {
+ a = GetBankPosition(gAnimBankTarget, 2);
+ b = GetBankPosition(gAnimBankTarget, 3);
+ }
+
+ sprite->data[4] = sprite->pos1.x << 4;
+ sprite->data[5] = sprite->pos1.y << 4;
+ sub_80CEBC4(a - sprite->pos1.x, b - sprite->pos1.y, &sprite->data[6], &sprite->data[7], 0x28);
+ sprite->callback = sub_80CEC1C;
+}
+
+void sub_80CEBC4(s16 a, s16 b, s16* c, s16* d, s8 e)
+{
+ int f;
+ int g;
+ if (a < 0)
+ e = -e;
+
+ f = a << 8;
+ g = f / e;
+ if (g == 0)
+ g = 1;
+
+ *c = f / g;
+ *d = (b << 8) / g;
+}
+
+void sub_80CEC1C(struct Sprite* sprite)
+{
+ int b;
+ s16 a;
+ int c;
+ u8 index;
+ sprite->data[0]++;
+ b = sprite->data[0] * 5 - ((sprite->data[0] * 5 / 256) << 8);
+ sprite->data[4] += sprite->data[6];
+ sprite->data[5] += sprite->data[7];
+ sprite->pos1.x = sprite->data[4] >> 4;
+ sprite->pos1.y = sprite->data[5] >> 4;
+ sprite->pos2.y = Sin(b, 15);
+ a = (u16)sprite->pos1.y;
+ c = (u16)sprite->pos1.x;
+
+ if ((u32)((c + 16) << 16) > (0x110) << 16 || a < -16 || a > 0x80)
+ {
+ move_anim_8074EE0(sprite);
+ }
+ else
+ {
+ if (sprite->data[3] && ++sprite->data[2] > sprite->data[3])
+ {
+ sprite->data[2] = 0;
+ if (++sprite->data[1] > 3)
+ sprite->data[1] = 0;
+
+ index = IndexOfSpritePaletteTag(gUnknown_083D712C[sprite->data[1]][0]);
+ if (index != 0xFF)
+ sprite->oam.paletteNum = index;
+ }
+ }
+}
diff --git a/src/battle/anim/orbit.c b/src/battle/anim/orbit.c
new file mode 100755
index 000000000..c8cf339d2
--- /dev/null
+++ b/src/battle/anim/orbit.c
@@ -0,0 +1,147 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80CAC44(struct Sprite* sprite);
+static void sub_80CADA8(struct Sprite* sprite);
+static void sub_80CAE74(struct Sprite* sprite);
+
+// orbit (The effect of a sprite rotating around another one in a pseudo 3D effect.)
+// Used by Spore, Cotton Spore, and Petal Dance.
+
+void sub_80CABF8(struct Sprite* sprite)
+{
+ sub_8078764(sprite, 1);
+ StartSpriteAnim(sprite, gBattleAnimArgs[4]);
+ if (gBattleAnimArgs[4] == 1)
+ {
+ sprite->oam.objMode = 1;
+ }
+
+ sprite->data[0] = gBattleAnimArgs[3];
+ sprite->data[1] = gBattleAnimArgs[2];
+ sprite->callback = sub_80CAC44;
+ sub_80CAC44(sprite);
+}
+
+void sub_80CAC44(struct Sprite* sprite)
+{
+ u8 var1;
+
+ sprite->pos2.x = Sin(sprite->data[1], 32);
+ sprite->pos2.y = Cos(sprite->data[1], -3) + ((sprite->data[2] += 24) >> 8);
+ if ((u16)(sprite->data[1] - 0x40) < 0x80)
+ {
+ sprite->oam.priority = (sub_8079ED4(gAnimBankTarget) & 3);
+ }
+ else
+ {
+ var1 = sub_8079ED4(gAnimBankTarget) + 1;
+ if (var1 > 3)
+ {
+ var1 = 3;
+ }
+
+ sprite->oam.priority = var1;
+ }
+
+ sprite->data[1] = (sprite->data[1] + 2) & 0xFF;
+ sprite->data[0]--;
+ if (sprite->data[0] == -1)
+ DestroyAnimSprite(sprite);
+}
+
+void sub_80CACEC(u8 taskId)
+{
+ if (IsContest() || !IsDoubleBattle())
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+ else
+ {
+ if (GetBankIdentity_permutated(gAnimBankTarget) == 1)
+ {
+ REG_BG2CNT_BITFIELD.priority = 3;
+ }
+ else
+ {
+ REG_BG1CNT_BITFIELD.priority = 1;
+ }
+
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+void sub_80CAD54(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 0);
+ sprite->data[0] = gBattleAnimArgs[3];
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = sprite->pos1.x;
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = GetBankPosition(gAnimBankAttacker, 3) + gBattleAnimArgs[2];
+ obj_translate_based_on_private_1_2_3_4(sprite);
+ sprite->data[5] = 0x40;
+ sprite->callback = sub_80CADA8;
+ sub_80CADA8(sprite);
+}
+
+void sub_80CADA8(struct Sprite* sprite)
+{
+ if (!sub_8078B5C(sprite))
+ {
+ sprite->pos2.x += Sin(sprite->data[5], 32);
+ sprite->pos2.y += Cos(sprite->data[5], -5);
+ if ((u16)(sprite->data[5] - 0x40) < 0x80)
+ {
+ sprite->subpriority = sub_8079E90(gAnimBankAttacker) - 1;
+ }
+ else
+ {
+ sprite->subpriority = sub_8079E90(gAnimBankAttacker) + 1;
+ }
+
+ sprite->data[5] = (sprite->data[5] + 5) & 0xFF;
+ }
+ else
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void sub_80CAE20(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 1);
+ sprite->data[0] = gBattleAnimArgs[3];
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = sprite->pos1.x;
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = GetBankPosition(gAnimBankAttacker, 3) + gBattleAnimArgs[2];
+ obj_translate_based_on_private_1_2_3_4(sprite);
+ sprite->data[5] = 0x40;
+ sprite->callback = sub_80CAE74;
+ sub_80CAE74(sprite);
+}
+
+void sub_80CAE74(struct Sprite* sprite)
+{
+ if (!sub_8078B5C(sprite))
+ {
+ sprite->pos2.x += Sin(sprite->data[5], 8);
+ if ((u16)(sprite->data[5] - 0x3B) < 5 || (u16)(sprite->data[5] - 0xBB) < 5)
+ {
+ sprite->oam.matrixNum ^= 8;
+ }
+
+ sprite->data[5] = (sprite->data[5] + 5) & 0xFF;
+ }
+ else
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
diff --git a/src/battle/anim/orbit_fast.c b/src/battle/anim/orbit_fast.c
new file mode 100755
index 000000000..92b67672b
--- /dev/null
+++ b/src/battle/anim/orbit_fast.c
@@ -0,0 +1,62 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80D2704(struct Sprite* sprite);
+
+// orbit_fast (a quickly moving fast circular motion of a sprite around an object.)
+// Used by Hidden Power.
+
+void sub_80D26A4(struct Sprite* sprite)
+{
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2);
+ sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3);
+ sprite->affineAnimPaused = 1;
+ sprite->data[0] = gBattleAnimArgs[0];
+ sprite->data[1] = gBattleAnimArgs[1];
+ sprite->data[7] = sub_8079E90(gAnimBankAttacker);
+ sprite->callback = sub_80D2704;
+ sub_80D2704(sprite);
+}
+
+void sub_80D2704(struct Sprite* sprite)
+{
+ if ((u16)(sprite->data[1] - 0x40) <= 0x7F)
+ sprite->subpriority = sprite->data[7] + 1;
+ else
+ sprite->subpriority = sprite->data[7] - 1;
+
+ sprite->pos2.x = Sin(sprite->data[1], sprite->data[2] >> 8);
+ sprite->pos2.y = Cos(sprite->data[1], sprite->data[3] >> 8);
+ sprite->data[1] = (sprite->data[1] + 9) & 0xFF;
+ switch (sprite->data[5])
+ {
+ case 1:
+ sprite->data[2] -= 0x400;
+ sprite->data[3] -= 0x100;
+ if (++sprite->data[4] == sprite->data[0])
+ {
+ sprite->data[5] = 2;
+ return;
+ }
+ break;
+ case 0:
+ sprite->data[2] += 0x400;
+ sprite->data[3] += 0x100;
+ if (++sprite->data[4] == sprite->data[0])
+ {
+ sprite->data[4] = 0;
+ sprite->data[5] = 1;
+ }
+ break;
+ }
+
+ if ((u16)gBattleAnimArgs[7] == 0xFFFF)
+ DestroyAnimSprite(sprite);
+}
diff --git a/src/battle/anim/orbit_scatter.c b/src/battle/anim/orbit_scatter.c
new file mode 100755
index 000000000..54c157839
--- /dev/null
+++ b/src/battle/anim/orbit_scatter.c
@@ -0,0 +1,31 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80D2834(struct Sprite* sprite);
+
+// orbit_scatter (scatters the objects associated with the fast orbit from the last file.)
+// Used in Hidden Power.
+
+void sub_80D27E0(struct Sprite* sprite)
+{
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2);
+ sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3);
+ sprite->data[0] = Sin(gBattleAnimArgs[0], 10);
+ sprite->data[1] = Cos(gBattleAnimArgs[0], 7);
+ sprite->callback = sub_80D2834;
+}
+
+void sub_80D2834(struct Sprite* sprite)
+{
+ sprite->pos2.x += sprite->data[0];
+ sprite->pos2.y += sprite->data[1];
+ if (sprite->pos1.x + sprite->pos2.x + 16 > 0x110u || sprite->pos1.y + sprite->pos2.y > 0xA0 || sprite->pos1.y + sprite->pos2.y < -16)
+ DestroyAnimSprite(sprite);
+}
diff --git a/src/battle/anim/orbs.c b/src/battle/anim/orbs.c
new file mode 100755
index 000000000..6ca2fa71c
--- /dev/null
+++ b/src/battle/anim/orbs.c
@@ -0,0 +1,162 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "random.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80CA8B4(struct Sprite* sprite);
+static void sub_80CA9F8(struct Sprite* sprite);
+static void sub_80CAACC(struct Sprite* sprite);
+
+extern struct SpriteTemplate gSpriteTemplate_83D631C;
+
+// orbs
+// Used by Solar Beam, Absorb, Hyper Beam, and Leech Seed.
+
+void sub_80CA7B0(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 1);
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[2] = GetBankPosition(gAnimBankAttacker, 2);
+ sprite->data[4] = GetBankPosition(gAnimBankAttacker, 3);
+ sprite->callback = sub_8078B34;
+ StoreSpriteCallbackInData(sprite, move_anim_8074EE0);
+}
+
+void sub_80CA800(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 1);
+ StartSpriteAnim(sprite, gBattleAnimArgs[3]);
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[2] = GetBankPosition(gAnimBankTarget, 2);
+ sprite->data[4] = GetBankPosition(gAnimBankTarget, 3);
+ sprite->callback = sub_8078B34;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+}
+
+void sub_80CA858(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 1);
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = GetBankPosition(gAnimBankTarget, 2);
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = GetBankPosition(gAnimBankTarget, 3);
+ obj_translate_based_on_private_1_2_3_4(sprite);
+ sprite->data[5] = gBattleAnimArgs[3];
+ sprite->callback = sub_80CA8B4;
+ sub_80CA8B4(sprite);
+}
+
+void sub_80CA8B4(struct Sprite* sprite)
+{
+ if (sub_8078B5C(sprite))
+ {
+ DestroySprite(sprite);
+ }
+ else
+ {
+ if (sprite->data[5] > 0x7F)
+ {
+ sprite->subpriority = sub_8079E90(gAnimBankTarget) + 1;
+ }
+ else
+ {
+ sprite->subpriority = sub_8079E90(gAnimBankTarget) + 6;
+ }
+ sprite->pos2.x += Sin(sprite->data[5], 5);
+ sprite->pos2.y += Cos(sprite->data[5], 14);
+ sprite->data[5] = (sprite->data[5] + 15) & 0xFF;
+ }
+}
+
+void sub_80CA928(u8 taskId)
+{
+ gTasks[taskId].data[0]--;
+ if (gTasks[taskId].data[0] == -1)
+ {
+ gTasks[taskId].data[1]++;
+ gTasks[taskId].data[0] = 6;
+ gBattleAnimArgs[0] = 15;
+ gBattleAnimArgs[1] = 0;
+ gBattleAnimArgs[2] = 80;
+ gBattleAnimArgs[3] = 0;
+ CreateSpriteAndAnimate(&gSpriteTemplate_83D631C, 0, 0, sub_8079E90(gAnimBankTarget) + 1);
+ }
+
+ if (gTasks[taskId].data[1] == 15)
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_80CA9A8(struct Sprite* sprite)
+{
+ sub_8078764(sprite, 1);
+ sprite->data[0] = gBattleAnimArgs[3];
+ sprite->data[2] = GetBankPosition(gAnimBankAttacker, 2);
+ sprite->data[4] = GetBankPosition(gAnimBankAttacker, 3);
+ sprite->data[5] = gBattleAnimArgs[2];
+ sub_80786EC(sprite);
+ sprite->callback = sub_80CA9F8;
+}
+
+void sub_80CA9F8(struct Sprite* sprite)
+{
+ if (sub_8078718(sprite))
+ DestroyAnimSprite(sprite);
+}
+
+void sub_80CAA14(struct Sprite* sprite)
+{
+ u16 a = Random();
+ u16 b;
+
+ StartSpriteAnim(sprite, a & 7);
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2);
+ sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3);
+ if (GetBankSide(gAnimBankAttacker))
+ {
+ sprite->pos1.x -= 20;
+ }
+ else
+ {
+ sprite->pos1.x += 20;
+ }
+
+ b = Random();
+ sprite->data[0] = (b & 31) + 64;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = GetBankPosition(gAnimBankTarget, 2);
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = GetBankPosition(gAnimBankTarget, 3);
+ sub_8078D60(sprite);
+ sprite->data[5] = Random() & 0xFF;
+ sprite->data[6] = sprite->subpriority;
+ sprite->callback = sub_80CAACC;
+ sub_80CAACC(sprite);
+}
+
+void sub_80CAACC(struct Sprite* sprite)
+{
+ if (sub_8078CE8(sprite))
+ {
+ DestroyAnimSprite(sprite);
+ }
+ else
+ {
+ sprite->pos2.y += Cos(sprite->data[5], 12);
+ if (sprite->data[5] <= 0x7E)
+ {
+ sprite->subpriority = sprite->data[6];
+ }
+ else
+ {
+ sprite->subpriority = sprite->data[6] + 1;
+ }
+
+ sprite->data[5] = (sprite->data[5] + 24) & 0xFF;
+ }
+}
diff --git a/src/battle/anim/osmose.c b/src/battle/anim/osmose.c
new file mode 100755
index 000000000..1140aa34a
--- /dev/null
+++ b/src/battle/anim/osmose.c
@@ -0,0 +1,29 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+// osmose (I didn't want to use "absorb" as thats confusing)
+// Used by Ingrain.
+
+void sub_80CB768(struct Sprite* sprite)
+{
+ if (!sprite->data[0])
+ {
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2) + gBattleAnimArgs[0];
+ sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 1) + gBattleAnimArgs[1];
+ sprite->data[1] = gBattleAnimArgs[2];
+ sprite->data[2] = gBattleAnimArgs[3];
+ sprite->data[3] = gBattleAnimArgs[4];
+ }
+
+ sprite->data[0]++;
+ sprite->pos2.x = sprite->data[1] * sprite->data[0];
+ sprite->pos2.y = Sin((sprite->data[0] * 20) & 0xFF, sprite->data[2]);
+ if (sprite->data[0] > sprite->data[3])
+ DestroyAnimSprite(sprite);
+}
diff --git a/src/battle/anim/perceive.c b/src/battle/anim/perceive.c
new file mode 100755
index 000000000..3b3153428
--- /dev/null
+++ b/src/battle/anim/perceive.c
@@ -0,0 +1,24 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+// perceive (shows a sparkle in a set of eyes, usually for heightened perception.)
+// Used in Glare, Tickle, and Scary Face.
+
+void sub_80D2904(struct Sprite* sprite)
+{
+ if (sprite->animEnded)
+ DestroyAnimSprite(sprite);
+}
+
+void sub_80D2920(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 1);
+ sprite->callback = sub_80D2904;
+}
diff --git a/src/battle/anim/powder.c b/src/battle/anim/powder.c
new file mode 100755
index 000000000..a0be20d6f
--- /dev/null
+++ b/src/battle/anim/powder.c
@@ -0,0 +1,48 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+
+static void sub_80CA768(struct Sprite* sprite);
+
+// powder
+// Used by Sleep Powder, Stun Spore, and Poison Powder.
+
+void sub_80CA710(struct Sprite* sprite)
+{
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[1] = gBattleAnimArgs[3];
+
+ if (GetBankSide(gAnimBankAttacker))
+ {
+ sprite->data[3] = -gBattleAnimArgs[4];
+ }
+ else
+ {
+ sprite->data[3] = gBattleAnimArgs[4];
+ }
+
+ sprite->data[4] = gBattleAnimArgs[5];
+ sprite->callback = sub_80CA768;
+}
+
+void sub_80CA768(struct Sprite* sprite)
+{
+ if (sprite->data[0] > 0)
+ {
+ sprite->data[0]--;
+ sprite->pos2.y = sprite->data[2] >> 8;
+ sprite->data[2] += sprite->data[1];
+ sprite->pos2.x = Sin(sprite->data[5], sprite->data[3]);
+ sprite->data[5] = (sprite->data[5] + sprite->data[4]) & 0xFF;
+ }
+ else
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
diff --git a/src/battle/anim/rain.c b/src/battle/anim/rain.c
new file mode 100644
index 000000000..b38233e3c
--- /dev/null
+++ b/src/battle/anim/rain.c
@@ -0,0 +1,56 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "random.h"
+#include "sprite.h"
+#include "task.h"
+
+extern s16 gBattleAnimArgs[8];
+extern const struct SpriteTemplate gSpriteTemplate_83D9130[];
+
+static void MoveAnimRaindrop(struct Sprite *);
+
+// rain (spawns and animates raindrops)
+// Used in Rain Dance and general rain animation.
+
+void CreateAnimRaindrops(u8 taskId)
+{
+ if (gTasks[taskId].data[0] == 0)
+ {
+ gTasks[taskId].data[1] = gBattleAnimArgs[0];
+ gTasks[taskId].data[2] = gBattleAnimArgs[1];
+ gTasks[taskId].data[3] = gBattleAnimArgs[2];
+ }
+
+ gTasks[taskId].data[0]++;
+
+ if (gTasks[taskId].data[0] % gTasks[taskId].data[2] == 1)
+ {
+ u8 x = Random() % 240;
+ u8 y = Random() % 80;
+ CreateSprite(gSpriteTemplate_83D9130, x, y, 4);
+ }
+
+ if (gTasks[taskId].data[0] == gTasks[taskId].data[3])
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+void SetAnimRaindropCallback(struct Sprite *sprite)
+{
+ sprite->callback = MoveAnimRaindrop;
+}
+
+static void MoveAnimRaindrop(struct Sprite *sprite)
+{
+ if (++sprite->data[0] <= 13)
+ {
+ sprite->pos2.x++;
+ sprite->pos2.y += 4;
+ }
+
+ if (sprite->animEnded)
+ {
+ DestroySprite(sprite);
+ }
+}
diff --git a/src/battle/anim/ring.c b/src/battle/anim/ring.c
new file mode 100755
index 000000000..915cadcbc
--- /dev/null
+++ b/src/battle/anim/ring.c
@@ -0,0 +1,156 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "main.h"
+#include "blend_palette.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern u8 gObjectBankIDs[];
+
+static void sub_80D1098(struct Sprite* sprite);
+
+// ring (a ring that stretches outward from the Pokemon.)
+// Used in Aromatherapy and Heal Bell.
+
+void sub_80D0FD8(struct Sprite* sprite)
+{
+ u8 bank = 0;
+ u16 sp0 = 0;
+ u16 sp1 = 0;
+ u8 r4;
+
+ if (gBattleAnimArgs[2] == 0)
+ bank = gAnimBankAttacker;
+ else
+ bank = gAnimBankTarget;
+
+ r4 = gBattleAnimArgs[3] ^ 1;
+ if (IsDoubleBattle() && IsAnimBankSpriteVisible(bank ^ 2))
+ {
+ sub_807A3FC(bank, r4, &sp0, &sp1);
+ if (r4 == 0)
+ r4 = GetBankPosition(bank, 0);
+ else
+ r4 = GetBankPosition(bank, 2);
+
+ if (GetBankSide(bank) != 0)
+ gBattleAnimArgs[0] -= (sp0 - r4) - gBattleAnimArgs[0]; // This is weird.
+ else
+ gBattleAnimArgs[0] = sp0 - r4;
+ }
+
+ sprite->callback = sub_80793C4;
+ sub_80793C4(sprite);
+}
+
+void sub_80D1098(struct Sprite* sprite)
+{
+ if (sub_8078B5C(sprite))
+ {
+ FreeSpriteOamMatrix(sprite);
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void sub_80D10B8(struct Sprite* sprite)
+{
+ u16 r9 = 0;
+ u16 r6 = 0;
+ s16 sp0 = 0;
+ s16 sp1 = 0;
+ u8 sp4;
+ u8 bankr7;
+ u8 bankr8;
+ u8 r10;
+
+ if (gBattleAnimArgs[5] == 0)
+ {
+ bankr7 = gAnimBankAttacker;
+ bankr8 = gAnimBankTarget;
+ }
+ else
+ {
+ bankr7 = gAnimBankTarget;
+ bankr8 = gAnimBankAttacker;
+ }
+
+ if (gBattleAnimArgs[6] == 0)
+ {
+ r10 = 0;
+ sp4 = 1;
+ }
+ else
+ {
+ r10 = 2;
+ sp4 = 3;
+ }
+
+ if (GetBankSide(bankr7) != 0)
+ {
+ r9 = GetBankPosition(bankr7, r10) + gBattleAnimArgs[0];
+ if (IsAnimBankSpriteVisible(bankr8 ^ 2))
+ sprite->subpriority = gSprites[gObjectBankIDs[bankr8 ^ 2]].subpriority - 1;
+ else
+ sprite->subpriority = gSprites[gObjectBankIDs[bankr8]].subpriority - 1;
+ }
+ else
+ {
+ r9 = GetBankPosition(bankr7, r10) - gBattleAnimArgs[0];
+ if (gMain.inBattle && IsAnimBankSpriteVisible(bankr7 ^ 2))
+ {
+ if (gSprites[gObjectBankIDs[bankr7]].pos1.x < gSprites[gObjectBankIDs[bankr7 ^ 2]].pos1.x)
+ sprite->subpriority = gSprites[gObjectBankIDs[bankr7 ^ 2]].subpriority + 1;
+ else
+ sprite->subpriority = gSprites[gObjectBankIDs[bankr7]].subpriority - 1;
+ }
+ else
+ {
+ sprite->subpriority = gSprites[gObjectBankIDs[bankr7]].subpriority - 1;
+ }
+
+ }
+
+ r6 = GetBankPosition(bankr7, sp4) + gBattleAnimArgs[1];
+ if (gMain.inBattle && IsAnimBankSpriteVisible(bankr8 ^ 2))
+ {
+ sub_807A3FC(bankr8, gBattleAnimArgs[6], &sp0, &sp1);
+ }
+ else
+ {
+ sp0 = GetBankPosition(bankr8, r10);
+ sp1 = GetBankPosition(bankr8, sp4);
+ }
+
+ if (GetBankSide(bankr8))
+ sp0 += gBattleAnimArgs[3];
+ else
+ sp0 -= gBattleAnimArgs[3];
+
+ sp1 += gBattleAnimArgs[4];
+ sprite->pos1.x = sprite->data[1] = r9;
+ sprite->pos1.y = sprite->data[3] = r6;
+ sprite->data[2] = sp0;
+ sprite->data[4] = sp1;
+ sprite->data[0] = gBattleAnimArgs[0];
+ obj_translate_based_on_private_1_2_3_4(sprite);
+ sprite->callback = sub_80D1098;
+ sub_80D1098(sprite);
+}
+
+void sub_80D1318(struct Sprite* sprite)
+{
+ u8 index = IndexOfSpritePaletteTag(0x27DB);
+ if (index != 0xFF)
+ {
+ BlendPalette(((index << 20) + 0x1010000) >> 16, 15, gBattleAnimArgs[5], gBattleAnimArgs[4]);
+ }
+
+ StartSpriteAffineAnim(sprite, 1);
+ sprite->callback = sub_80793C4;
+ sub_80793C4(sprite);
+}
diff --git a/src/battle/anim/roots.c b/src/battle/anim/roots.c
new file mode 100755
index 000000000..68f8a3e2f
--- /dev/null
+++ b/src/battle/anim/roots.c
@@ -0,0 +1,67 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern s16 gUnknown_03000728[];
+
+static void sub_80CB710(struct Sprite* sprite);
+
+// roots
+// Used by Ingrain and Frenzy Plant.
+
+void sub_80CB59C(struct Sprite* sprite)
+{
+ if (!sprite->data[0])
+ {
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2);
+ sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 1);
+ sprite->pos2.x = gBattleAnimArgs[0];
+ sprite->pos2.y = gBattleAnimArgs[1];
+ sprite->subpriority = gBattleAnimArgs[2] + 30;
+ StartSpriteAnim(sprite, gBattleAnimArgs[3]);
+ sprite->data[2] = gBattleAnimArgs[4];
+ sprite->data[0]++;
+ if ((sprite->pos1.y + sprite->pos2.y) > 120)
+ {
+ sprite->pos1.y += -120 + (sprite->pos2.y + sprite->pos1.y);
+ }
+ }
+ sprite->callback = sub_80CB710;
+}
+
+void sub_80CB620(struct Sprite *sprite)
+{
+ s16 p1 = GetBankPosition(gAnimBankAttacker, 2);
+ s16 p2 = GetBankPosition(gAnimBankAttacker, 3);
+ s16 e1 = GetBankPosition(gAnimBankTarget, 2);
+ s16 e2 = GetBankPosition(gAnimBankTarget, 3);
+
+ e1 -= p1;
+ e2 -= p2;
+ sprite->pos1.x = p1 + e1 * gBattleAnimArgs[0] / 100;
+ sprite->pos1.y = p2 + e2 * gBattleAnimArgs[0] / 100;
+ sprite->pos2.x = gBattleAnimArgs[1];
+ sprite->pos2.y = gBattleAnimArgs[2];
+ sprite->subpriority = gBattleAnimArgs[3] + 30;
+ StartSpriteAnim(sprite, gBattleAnimArgs[4]);
+ sprite->data[2] = gBattleAnimArgs[5];
+ sprite->callback = sub_80CB710;
+ gUnknown_03000728[0] = sprite->pos1.x;
+ gUnknown_03000728[1] = sprite->pos1.y;
+ gUnknown_03000728[2] = e1;
+ gUnknown_03000728[3] = e2;
+}
+
+void sub_80CB710(struct Sprite* sprite)
+{
+ if (++sprite->data[0] > (sprite->data[2] - 10))
+ sprite->invisible = sprite->data[0] % 2;
+
+ if (sprite->data[0] > sprite->data[2])
+ DestroyAnimSprite(sprite);
+}
diff --git a/src/battle/anim/scan.c b/src/battle/anim/scan.c
new file mode 100755
index 000000000..22bb26973
--- /dev/null
+++ b/src/battle/anim/scan.c
@@ -0,0 +1,200 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "palette.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern s8 gUnknown_083D6DDC[4][2];
+
+static void sub_80CD408(struct Sprite* sprite);
+static void sub_80CD4B8(struct Sprite* sprite);
+static void sub_80CD4EC(struct Sprite* sprite);
+static void sub_80CD5A8(struct Sprite* sprite);
+static void sub_80CD654(struct Sprite* sprite);
+static void sub_80CD67C(struct Sprite* sprite);
+
+// scan
+// Used by Lock-On.
+
+void sub_80CD3E0(struct Sprite* sprite)
+{
+ sprite->pos1.x -= 32;
+ sprite->pos1.y -= 32;
+ sprite->data[0] = 20;
+ sprite->callback = sub_80782D8;
+ StoreSpriteCallbackInData(sprite, sub_80CD408);
+}
+
+void sub_80CD408(struct Sprite* sprite)
+{
+ switch (sprite->data[5] & 1)
+ {
+ case 0:
+ sprite->data[0] = 1;
+ sprite->callback = sub_80782D8;
+ StoreSpriteCallbackInData(sprite, sub_80CD408);
+ break;
+ case 1:
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+ sprite->data[0] = 8;
+ sprite->data[2] = sprite->pos1.x + gUnknown_083D6DDC[sprite->data[5] >> 8][0];
+ sprite->data[4] = sprite->pos1.y + gUnknown_083D6DDC[sprite->data[5] >> 8][1];
+ sprite->callback = sub_8078B34;
+ StoreSpriteCallbackInData(sprite, sub_80CD4B8);
+ sprite->data[5] += 0x100;
+ PlaySE12WithPanning(0xD2, BattleAnimAdjustPanning(0x3F));
+ break;
+ }
+
+ sprite->data[5] ^= 1;
+}
+
+void sub_80CD4B8(struct Sprite* sprite)
+{
+ if ((sprite->data[5] >> 8) == 4)
+ {
+ sprite->data[0] = 10;
+ sprite->callback = sub_80782D8;
+ StoreSpriteCallbackInData(sprite, sub_80CD4EC);
+ }
+ else
+ {
+ sprite->callback = sub_80CD408;
+ }
+}
+
+void sub_80CD4EC(struct Sprite* sprite)
+{
+ s16 a;
+ s16 b;
+ if (sprite->oam.affineParam == 0)
+ {
+ sprite->data[0] = 3;
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ sprite->callback = sub_80782D8;
+ StoreSpriteCallbackInData(sprite, sub_80CD5A8);
+ }
+ else
+ {
+ switch (sprite->oam.affineParam)
+ {
+ case 1:
+ a = -8;
+ b = -8;
+ break;
+ case 2:
+ a = -8;
+ b = 8;
+ break;
+ case 3:
+ a = 8;
+ b = -8;
+ break;
+ default:
+ a = 8;
+ b = 8;
+ break;
+ }
+
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+ sprite->data[0] = 6;
+ sprite->data[2] = GetBankPosition(gAnimBankTarget, 2) + a;
+ sprite->data[4] = GetBankPosition(gAnimBankTarget, 3) + b;
+ sprite->callback = sub_8078B34;
+ StoreSpriteCallbackInData(sprite, sub_80CD654);
+ }
+}
+
+void sub_80CD5A8(struct Sprite* sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ if ((sprite->data[1] += 3) > 16)
+ sprite->data[1] = 16;
+ }
+ else if ((sprite->data[1] -= 3) < 0)
+ {
+ sprite->data[1] = 0;
+ }
+
+ BlendPalettes(sub_80791A8(1, 1, 1, 1, 1, 0, 0), sprite->data[1], 0x7FFF);
+ if (sprite->data[1] == 16)
+ {
+ int pal;
+ sprite->data[2]++;
+ pal = sprite->oam.paletteNum;
+ LoadPalette(&gPlttBufferUnfaded[0x108 + pal * 16], pal * 16 | 0x101, 4);
+ PlaySE12WithPanning(0xC0, BattleAnimAdjustPanning(0x3F));
+ }
+ else if (sprite->data[1] == 0)
+ {
+ sprite->callback = sub_80CD654;
+ }
+}
+
+void sub_80CD654(struct Sprite* sprite)
+{
+ if ((u16)gBattleAnimArgs[7] == 0xFFFF)
+ {
+ sprite->data[1] = 0;
+ sprite->data[0] = 0;
+ sprite->callback = sub_80CD67C;
+ }
+}
+
+void sub_80CD67C(struct Sprite* sprite)
+{
+ if (sprite->data[0] % 3 == 0)
+ {
+ sprite->data[1]++;
+ sprite->invisible ^= 1;
+ }
+
+ sprite->data[0]++;
+ if (sprite->data[1] == 8)
+ DestroyAnimSprite(sprite);
+}
+
+void sub_80CD6CC(struct Sprite* sprite)
+{
+ sprite->oam.affineParam = gBattleAnimArgs[0];
+ if ((s16)sprite->oam.affineParam == 1)
+ {
+ sprite->pos1.x -= 0x18;
+ sprite->pos1.y -= 0x18;
+ }
+ else if ((s16)sprite->oam.affineParam == 2)
+ {
+ sprite->pos1.x -= 0x18;
+ sprite->pos1.y += 0x18;
+ sprite->oam.matrixNum = 16;
+ }
+ else if ((s16)sprite->oam.affineParam == 3)
+ {
+ sprite->pos1.x += 0x18;
+ sprite->pos1.y -= 0x18;
+ sprite->oam.matrixNum = 8;
+ }
+ else
+ {
+ sprite->pos1.x += 0x18;
+ sprite->pos1.y += 0x18;
+ sprite->oam.matrixNum = 24;
+ }
+
+ sprite->oam.tileNum = (sprite->oam.tileNum + 16);
+ sprite->callback = sub_80CD3E0;
+ sub_80CD3E0(sprite);
+}
diff --git a/src/battle/anim/scary_face.c b/src/battle/anim/scary_face.c
new file mode 100755
index 000000000..47776a3cb
--- /dev/null
+++ b/src/battle/anim/scary_face.c
@@ -0,0 +1,129 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "decompress.h"
+#include "palette.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern struct INCBIN_U8 gBattleAnimBackgroundTilemap_ScaryFaceContest;
+extern struct INCBIN_U8 gBattleAnimBackgroundTilemap_ScaryFacePlayer;
+extern struct INCBIN_U8 gBattleAnimBackgroundTilemap_ScaryFaceOpponent;
+extern struct INCBIN_U8 gBattleAnimBackgroundImage_ScaryFace;
+extern struct INCBIN_U8 gBattleAnimBackgroundPalette_ScaryFace;
+
+extern u16 gBattle_BG1_Y;
+extern u16 gBattle_BG1_X;
+
+static void sub_80D24E0(u8 taskId);
+
+// scary_face (darkens the screen and shows a scary face.)
+// Used in Glare and Scary Face.
+
+void sub_80D23B4(u8 taskId)
+{
+ struct Struct_sub_8078914 subStruct;
+ u8* tempvar;
+ REG_BLDCNT = 0x3F42;
+ REG_BLDALPHA = 0x1000;
+ REG_BG1CNT_BITFIELD.priority = 1;
+ REG_BG1CNT_BITFIELD.screenSize = 0;
+ if (!IsContest())
+ REG_BG1CNT_BITFIELD.charBaseBlock = 1;
+
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ sub_8078914(&subStruct);
+ tempvar = subStruct.field_4;
+ DmaFill32(3, 0x0, tempvar, 0x1000);
+ if (IsContest())
+ LZDecompressVram(&gBattleAnimBackgroundTilemap_ScaryFaceContest, subStruct.field_4);
+ else if (GetBankSide(gAnimBankTarget) == 1)
+ LZDecompressVram(&gBattleAnimBackgroundTilemap_ScaryFacePlayer, subStruct.field_4);
+ else
+ LZDecompressVram(&gBattleAnimBackgroundTilemap_ScaryFaceOpponent, subStruct.field_4);
+
+ LZDecompressVram(&gBattleAnimBackgroundImage_ScaryFace, subStruct.field_0);
+ LoadCompressedPalette(&gBattleAnimBackgroundPalette_ScaryFace, subStruct.field_8 << 4, 32);
+ if (IsContest())
+ sub_80763FC(subStruct.field_8, (u16 *)subStruct.field_4, 0, 0);
+
+ gTasks[taskId].func = sub_80D24E0;
+}
+
+void sub_80D24E0(u8 taskId)
+{
+ struct Struct_sub_8078914 subStruct;
+
+ switch (gTasks[taskId].data[12])
+ {
+ case 0:
+ if (++gTasks[taskId].data[10] == 2)
+ {
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[11]++;
+ REG_BLDALPHA = gTasks[taskId].data[11] | ((16 - gTasks[taskId].data[11]) << 8);
+ if (gTasks[taskId].data[11] == 14)
+ {
+ gTasks[taskId].data[12]++;
+ gTasks[taskId].data[11] = 0;
+ }
+ }
+ break;
+ case 1:
+ if (++gTasks[taskId].data[11] == 0x15)
+ {
+ gTasks[taskId].data[11] = 14;
+ gTasks[taskId].data[12]++;
+ }
+ break;
+ case 2:
+ if (++gTasks[taskId].data[10] == 2)
+ {
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[11]--;
+ REG_BLDALPHA = gTasks[taskId].data[11] | ((16 - gTasks[taskId].data[11]) << 8);
+ if (gTasks[taskId].data[11] == 0)
+ {
+ gTasks[taskId].data[12]++;
+ gTasks[taskId].data[11] = 0;
+ }
+ }
+ break;
+ case 3:
+ sub_8078914(&subStruct);
+ {
+ u8 *addr = subStruct.field_0;
+ u32 size = 0x2000;
+ while (1)
+ {
+ DmaFill32(3, 0, addr, 0x1000);
+ addr += 0x1000;
+ size -= 0x1000;
+ if (size <= 0x1000)
+ {
+ DmaFill32(3, 0, addr, size);
+ break;
+ }
+ }
+ }
+ DmaClear32(3, subStruct.field_4, 0x800);
+ if (!IsContest())
+ REG_BG1CNT_BITFIELD.charBaseBlock = 0;
+
+ gTasks[taskId].data[12]++;
+ // fall through
+ case 4:
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ REG_BG1CNT_BITFIELD.priority = 1;
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
diff --git a/src/battle/anim/seed.c b/src/battle/anim/seed.c
new file mode 100755
index 000000000..be8613a74
--- /dev/null
+++ b/src/battle/anim/seed.c
@@ -0,0 +1,50 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80CAB88(struct Sprite* sprite);
+static void sub_80CABC0(struct Sprite* sprite);
+
+// seed (sprouts a sapling from a seed.)
+// Used by Leech Seed.
+
+void sub_80CAB18(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 1);
+ if (GetBankSide(gAnimBankAttacker))
+ {
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+ }
+
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[2] = GetBankPosition(gAnimBankTarget, 0) + gBattleAnimArgs[2];
+ sprite->data[4] = GetBankPosition(gAnimBankTarget, 1) + gBattleAnimArgs[3];
+ sprite->data[5] = gBattleAnimArgs[5];
+ sub_80786EC(sprite);
+ sprite->callback = sub_80CAB88;
+}
+
+void sub_80CAB88(struct Sprite* sprite)
+{
+ if (sub_8078718(sprite))
+ {
+ sprite->invisible = 1;
+ sprite->data[0] = 10;
+ sprite->callback = sub_80782D8;
+ StoreSpriteCallbackInData(sprite, sub_80CABC0);
+ }
+}
+
+void sub_80CABC0(struct Sprite* sprite)
+{
+ sprite->invisible = 0;
+ StartSpriteAnim(sprite, 1);
+ sprite->data[0] = 60;
+ sprite->callback = sub_80782D8;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+}
diff --git a/src/battle/anim/sfx.c b/src/battle/anim/sfx.c
new file mode 100644
index 000000000..10ef1681e
--- /dev/null
+++ b/src/battle/anim/sfx.c
@@ -0,0 +1,280 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "contest.h"
+#include "ewram.h"
+#include "rom_8077ABC.h"
+#include "sound.h"
+#include "task.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+extern u16 gBattlePartyID[];
+extern u16 gAnimSpeciesByBanks[];
+extern u8 gUnknown_0202F7D2;
+
+static void sub_812AF98(u8 taskId);
+static void sub_812B004(u8 taskId);
+static void sub_812B108(u8 taskId);
+static void sub_812B404(u8 taskId);
+
+// used in 1 move:
+// Move_FIRE_BLAST
+void sub_812AF30(u8 taskId)
+{
+ s8 sourcePan, targetPan, panIncrement;
+
+ TASK.data[0] = gBattleAnimArgs[0];
+ TASK.data[1] = gBattleAnimArgs[1];
+
+ sourcePan = BattleAnimAdjustPanning(-64);
+ targetPan = BattleAnimAdjustPanning(63);
+ panIncrement = CalculatePanIncrement(sourcePan, targetPan, 2);
+
+ TASK.data[2] = sourcePan;
+ TASK.data[3] = targetPan;
+ TASK.data[4] = panIncrement;
+ TASK.data[10] = 10;
+
+ TASK.func = sub_812AF98;
+}
+
+static void sub_812AF98(u8 taskId)
+{
+ s16 pan = TASK.data[2];
+ s8 dPan = TASK.data[4];
+
+ if (++TASK.data[11] == 111)
+ {
+ TASK.data[10] = 5;
+ TASK.data[11] = 0;
+ TASK.func = sub_812B004;
+ }
+ else
+ {
+ if (++TASK.data[10] == 11)
+ {
+ TASK.data[10] = 0;
+ PlaySE12WithPanning(TASK.data[0], pan);
+ }
+ pan += dPan;
+ TASK.data[2] = sub_8077104(pan, dPan);
+ }
+}
+
+static void sub_812B004(u8 taskId)
+{
+ s8 pan;
+
+ if (++TASK.data[10] == 6)
+ {
+ TASK.data[10] = 0;
+
+ pan = BattleAnimAdjustPanning(63);
+ PlaySE12WithPanning(TASK.data[1], pan);
+
+ if (++TASK.data[11] == 2)
+ {
+ DestroyAnimSoundTask(taskId);
+ }
+ }
+}
+
+// used in 7 moves:
+// Move_ICE_BEAM, Move_AURORA_BEAM, Move_PSYBEAM,
+// Move_PSYWAVE, Move_SHADOW_BALL, Move_TRI_ATTACK,
+// Move_HYPER_BEAM
+void sub_812B058(u8 taskId)
+{
+ s16 sp = gBattleAnimArgs[0];
+ s8 r5 = gBattleAnimArgs[2];
+ s8 panIncrement = gBattleAnimArgs[3];
+ u8 r10 = gBattleAnimArgs[4]; // number of times the sound must be played
+ u8 r7 = gBattleAnimArgs[5];
+ u8 r9 = gBattleAnimArgs[6];
+
+ s8 pan1 = BattleAnimAdjustPanning(gBattleAnimArgs[1]);
+ s8 pan2 = BattleAnimAdjustPanning(r5);
+ panIncrement = CalculatePanIncrement(pan1, pan2, panIncrement);
+
+ TASK.data[0] = sp;
+ TASK.data[1] = pan1;
+ TASK.data[2] = pan2;
+ TASK.data[3] = panIncrement;
+ TASK.data[4] = r10;
+ TASK.data[5] = r7;
+ TASK.data[6] = r9;
+ TASK.data[10] = 0;
+ TASK.data[11] = pan1;
+ TASK.data[12] = r9;
+
+ TASK.func = sub_812B108;
+ TASK.func(taskId);
+}
+
+static void sub_812B108(u8 taskId)
+{
+ if (TASK.data[12]++ == TASK.data[6])
+ {
+ TASK.data[12] = 0;
+ PlaySE12WithPanning(TASK.data[0], TASK.data[11]);
+
+ if (--TASK.data[4] == 0)
+ {
+ DestroyAnimSoundTask(taskId);
+ return;
+ }
+ }
+
+ if (TASK.data[10]++ == TASK.data[5])
+ {
+ u16 dPan, oldPan;
+ TASK.data[10] = 0;
+ dPan = TASK.data[3];
+ oldPan = TASK.data[11];
+ TASK.data[11] = dPan + oldPan;
+ TASK.data[11] = sub_8077104(TASK.data[11], oldPan);
+ }
+}
+
+// #define shared19348 (*(struct UnknownContestStruct8 *)(gSharedMem + 0x19348))
+// #define EWRAM_19348 (*(u16 *)(gSharedMem + 0x19348))
+
+// used in 3 moves:
+// Move_HOWL, Move_ROAR, Move_GROWL
+void sub_812B18C(u8 taskId)
+{
+ u16 species = 0;
+ s8 pan = BattleAnimAdjustPanning(-64);
+
+ if (IsContest())
+ {
+ if (!gBattleAnimArgs[0])
+ species = shared19348.unk0;
+ else
+ DestroyAnimVisualTask(taskId);
+ }
+ else
+ {
+ u8 bank;
+ if (gBattleAnimArgs[0] == 0)
+ bank = gAnimBankAttacker;
+ else if (gBattleAnimArgs[0] == 1)
+ bank = gAnimBankTarget;
+ else if (gBattleAnimArgs[0] == 2)
+ bank = gAnimBankAttacker ^ 0x2;
+ else
+ bank = gAnimBankTarget ^ 0x2;
+
+ if (gBattleAnimArgs[0] == 1 || gBattleAnimArgs[0] == 3)
+ {
+ if (!IsAnimBankSpriteVisible(bank))
+ {
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+ }
+
+ if (GetBankSide(bank))
+ species = GetMonData(&gEnemyParty[gBattlePartyID[bank]], 0xB);
+ else
+ species = GetMonData(&gPlayerParty[gBattlePartyID[bank]], 0xB);
+ }
+
+ if (species != 0)
+ {
+ s16 mode = gBattleAnimArgs[1];
+ if (mode == 0xFF)
+ PlayCry1(species, pan);
+ else
+ PlayCry3(species, pan, mode);
+ }
+
+ DestroyAnimVisualTask(taskId);
+}
+
+// used in Move_HYPER_VOICE
+void sub_812B2B8(u8 taskId)
+{
+ u16 species;
+ s8 pan = BattleAnimAdjustPanning(-64);
+
+ if (IsContest())
+ species = shared19348.unk0;
+ else
+ species = gAnimSpeciesByBanks[gAnimBankAttacker];
+
+ if (species != 0)
+ PlayCry3(species, pan, 4);
+
+ DestroyAnimVisualTask(taskId);
+}
+
+// used in 6 moves:
+// Move_SKY_ATTACK, Move_LUSTER_PURGE, Move_FLATTER,
+// Move_DRAGON_CLAW, Move_RETURN, Move_COSMIC_POWER,
+void sub_812B30C(u8 taskId)
+{
+ u16 songNum = gBattleAnimArgs[0];
+ s8 pan = BattleAnimAdjustPanning(gBattleAnimArgs[1]);
+ PlaySE1WithPanning(songNum, pan);
+
+ DestroyAnimVisualTask(taskId);
+}
+
+// used in 6 moves:
+// Move_SKY_ATTACK, Move_SUPERPOWER, Move_ENCORE,
+// Move_FLATTER, Move_RETURN, Move_COSMIC_POWER
+void sub_812B340(u8 taskId)
+{
+ u16 songNum = gBattleAnimArgs[0];
+ s8 pan = BattleAnimAdjustPanning(gBattleAnimArgs[1]);
+ PlaySE2WithPanning(songNum, pan);
+
+ DestroyAnimVisualTask(taskId);
+}
+
+// used in 2 moves:
+// Move_CONFUSE_RAY, Move_WILL_O_WISP
+void sub_812B374(u8 taskId)
+{
+ u8 r5 = gBattleAnimArgs[1];
+ s8 panIncrement = gBattleAnimArgs[2];
+ s16 r9 = gBattleAnimArgs[3];
+ s8 r1 = gBattleAnimArgs[0];
+
+ s8 sourcePan = BattleAnimAdjustPanning(r1);
+ s8 targetPan = BattleAnimAdjustPanning(r5);
+ panIncrement = CalculatePanIncrement(sourcePan, targetPan, panIncrement);
+
+ TASK.data[1] = sourcePan;
+ TASK.data[2] = targetPan;
+ TASK.data[3] = panIncrement;
+ TASK.data[5] = r9;
+ TASK.data[10] = 0;
+ TASK.data[11] = sourcePan;
+
+ TASK.func = sub_812B404;
+ TASK.func(taskId);
+}
+
+static void sub_812B404(u8 taskId)
+{
+ u16 dPan = TASK.data[3];
+
+ if (TASK.data[10]++ == TASK.data[5])
+ {
+ u16 oldPan;
+ TASK.data[10] = 0;
+ oldPan = TASK.data[11];
+ TASK.data[11] = dPan + oldPan;
+ TASK.data[11] = sub_8077104(TASK.data[11], oldPan);
+ }
+
+ gUnknown_0202F7D2 = TASK.data[11];
+
+ if (TASK.data[11] == TASK.data[2])
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+} \ No newline at end of file
diff --git a/src/battle/anim/shadow_enlarge.c b/src/battle/anim/shadow_enlarge.c
new file mode 100755
index 000000000..399cf1ba4
--- /dev/null
+++ b/src/battle/anim/shadow_enlarge.c
@@ -0,0 +1,35 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80D0428(u8 taskId);
+
+// shadow_enlarge (the magnifying-like shadow over the Pokemon effect)
+// Used in Disable.
+
+void sub_80D03C4(u8 taskId)
+{
+ u8 spriteId = GetAnimBankSpriteId(1);
+ sub_8078E70(spriteId, 1);
+ obj_id_set_rotscale(spriteId, 0xD0, 0xD0, 0);
+ sub_8079108(gSprites[spriteId].oam.paletteNum + 16, 0);
+ gTasks[taskId].data[0] = 0x50;
+ gTasks[taskId].func = sub_80D0428;
+}
+
+void sub_80D0428(u8 taskId)
+{
+ if (--gTasks[taskId].data[0] == -1)
+ {
+ u8 spriteId = GetAnimBankSpriteId(1);
+ sub_8078F40(spriteId);
+ sub_8079108(gSprites[spriteId].oam.paletteNum + 16, 1);
+ DestroyAnimVisualTask(taskId);
+ }
+}
diff --git a/src/battle/anim/shadow_minimize.c b/src/battle/anim/shadow_minimize.c
new file mode 100755
index 000000000..94069374f
--- /dev/null
+++ b/src/battle/anim/shadow_minimize.c
@@ -0,0 +1,262 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80D04E0(u8 taskId);
+void sub_80D0614(struct Task* task, u8 taskId);
+void sub_80D0704(struct Sprite* sprite);
+
+// shadow_minimize (the minimizing-like shadow over the Pokemon effect.)
+// Used in Minimize.
+
+void sub_80D0488(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ u8 spriteId = GetAnimBankSpriteId(0);
+ task->data[0] = spriteId;
+ sub_8078E70(spriteId, 0);
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[4] = 0x100;
+ task->data[5] = 0;
+ task->data[6] = 0;
+ task->data[7] = sub_8079E90(gAnimBankAttacker);
+ task->func = sub_80D04E0;
+}
+
+void sub_80D04E0(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ switch (task->data[1])
+ {
+ case 0:
+ if (task->data[2] == 0 || task->data[2] == 3 || task->data[2] == 6)
+ sub_80D0614(task, taskId);
+ task->data[2]++;
+ task->data[4] += 0x28;
+ obj_id_set_rotscale(task->data[0], task->data[4], task->data[4], 0);
+ sub_8079A64(task->data[0]);
+ if (task->data[2] == 32)
+ {
+ task->data[5]++;
+ task->data[1]++;
+ }
+ break;
+ case 1:
+ if (task->data[6] == 0)
+ {
+ if (task->data[5] == 3)
+ {
+ task->data[2] = 0;
+ task->data[1] = 3;
+ }
+ else
+ {
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[4] = 0x100;
+ obj_id_set_rotscale(task->data[0], task->data[4], task->data[4], 0);
+ sub_8079A64(task->data[0]);
+ task->data[1] = 2;
+ }
+ }
+ break;
+ case 2:
+ task->data[1] = 0;
+ break;
+ case 3:
+ if (++task->data[2] > 32)
+ {
+ task->data[2] = 0;
+ task->data[1]++;
+ }
+ break;
+ case 4:
+ task->data[2] += 2;
+ task->data[4] -= 0x50;
+ obj_id_set_rotscale(task->data[0], task->data[4], task->data[4], 0);
+ sub_8079A64(task->data[0]);
+ if (task->data[2] == 32)
+ {
+ task->data[2] = 0;
+ task->data[1]++;
+ }
+ break;
+ case 5:
+ sub_8078F40(task->data[0]);
+ gSprites[task->data[15]].pos2.y = 0;
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+#ifdef NONMATCHING
+void sub_80D0614(struct Task* task, u8 taskId)
+{
+ s16 r8 = duplicate_obj_of_side_rel2move_in_transparent_mode(0);
+ if (r8 >= 0)
+ {
+ u8 r6 = AllocOamMatrix();
+ if (r6 == 0xFF)
+ {
+ obj_delete_but_dont_free_vram(&gSprites[r8]);
+ }
+ else
+ {
+ gSprites[r8].oam.objMode = 1;
+ gSprites[r8].oam.affineMode = 3;
+ gSprites[r8].affineAnimPaused = 1;
+ gSprites[r8].oam.matrixNum = r6;
+ gSprites[r8].subpriority = task->data[7] - task->data[3];
+ task->data[3]++;
+ task->data[6]++;
+ gSprites[r8].data[0] = 16;
+ gSprites[r8].data[1] = taskId;
+ gSprites[r8].data[2] = 6;
+ gSprites[r8].callback = sub_80D0704;
+ obj_id_set_rotscale(r8, task->data[4], task->data[4], 0);
+ gSprites[r8].oam.affineMode = 1;
+ CalcCenterToCornerVec(&gSprites[r8], gSprites[r8].oam.shape, gSprites[r8].oam.size, gSprites[r8].oam.affineMode);
+ }
+ }
+}
+#else
+__attribute__((naked))
+void sub_80D0614(struct Task* task, u8 taskId)
+{
+ 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 @r7 is task\n\
+ lsls r1, 24\n\
+ lsrs r1, 24\n\
+ mov r9, r1 @r9 is taskId\n\
+ movs r0, 0\n\
+ bl duplicate_obj_of_side_rel2move_in_transparent_mode\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ mov r8, r0\n\
+ lsls r0, 16\n\
+ asrs r4, r0, 16\n\
+ cmp r4, 0\n\
+ blt _080D06EE @jump to bottom\n\
+ bl AllocOamMatrix\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ cmp r6, 0xFF\n\
+ bne _080D0658\n\
+ lsls r0, r4, 4\n\
+ adds r0, r4\n\
+ lsls r0, 2\n\
+ ldr r1, _080D0654 @ =gSprites\n\
+ adds r0, r1\n\
+ bl obj_delete_but_dont_free_vram\n\
+ b _080D06EE @ jump to bottom\n\
+ .align 2, 0\n\
+_080D0654: .4byte gSprites\n\
+_080D0658:\n\
+ ldr r5, _080D06FC @ =gSprites\n\
+ lsls r3, r4, 4\n\
+ adds r3, r4\n\
+ lsls r3, 2\n\
+ adds r4, r3, r5\n\
+ ldrb r1, [r4, 0x1]\n\
+ movs r0, 0xD\n\
+ negs r0, r0\n\
+ ands r0, r1\n\
+ movs r1, 0x4\n\
+ orrs r0, r1\n\
+ movs r1, 0x3\n\
+ orrs r0, r1\n\
+ strb r0, [r4, 0x1]\n\
+ adds r2, r4, 0\n\
+ adds r2, 0x2C\n\
+ ldrb r0, [r2]\n\
+ movs r1, 0x80\n\
+ orrs r0, r1\n\
+ strb r0, [r2]\n\
+ movs r0, 0x1F\n\
+ ands r6, r0\n\
+ lsls r2, r6, 1\n\
+ ldrb r1, [r4, 0x3]\n\
+ movs r0, 0x3F\n\
+ negs r0, r0\n\
+ ands r0, r1\n\
+ orrs r0, r2\n\
+ strb r0, [r4, 0x3]\n\
+ ldrb r0, [r7, 0x16]\n\
+ ldrb r1, [r7, 0xE]\n\
+ subs r0, r1\n\
+ adds r1, r4, 0\n\
+ adds r1, 0x43\n\
+ strb r0, [r1]\n\
+ ldrh r0, [r7, 0xE]\n\
+ adds r0, 0x1\n\
+ strh r0, [r7, 0xE]\n\
+ ldrh r0, [r7, 0x14]\n\
+ adds r0, 0x1\n\
+ strh r0, [r7, 0x14]\n\
+ movs r0, 0x10\n\
+ strh r0, [r4, 0x2E]\n\
+ mov r0, r9\n\
+ strh r0, [r4, 0x30]\n\
+ movs r0, 0x6\n\
+ strh r0, [r4, 0x32]\n\
+ adds r5, 0x1C\n\
+ adds r3, r5\n\
+ ldr r0, _080D0700 @ =sub_80D0704\n\
+ str r0, [r3]\n\
+ mov r1, r8 @duplicate_obj_of_side_rel2move_in_transparent_mode(0)\n\
+ lsls r0, r1, 24\n\
+ lsrs r0, 24\n\
+ movs r1, 0x10\n\
+ ldrsh r2, [r7, r1]\n\
+ adds r1, r2, 0\n\
+ movs r3, 0\n\
+ bl obj_id_set_rotscale\n\
+ ldrb r0, [r4, 0x1]\n\
+ movs r3, 0x4\n\
+ negs r3, r3\n\
+ ands r3, r0\n\
+ movs r0, 0x1\n\
+ orrs r3, r0\n\
+ strb r3, [r4, 0x1]\n\
+ lsrs r1, r3, 6\n\
+ ldrb r2, [r4, 0x3]\n\
+ lsrs r2, 6\n\
+ lsls r3, 30\n\
+ lsrs r3, 30\n\
+ adds r0, r4, 0\n\
+ bl CalcCenterToCornerVec\n\
+_080D06EE:\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\
+_080D06FC: .4byte gSprites\n\
+_080D0700: .4byte sub_80D0704\n\
+.syntax divided\n");
+}
+#endif
+
+void sub_80D0704(struct Sprite* sprite)
+{
+ if (--sprite->data[0] == 0)
+ {
+ gTasks[sprite->data[1]].data[sprite->data[2]]--;
+ FreeOamMatrix(sprite->oam.matrixNum);
+ obj_delete_but_dont_free_vram(sprite);
+ }
+}
diff --git a/src/battle/anim/shield.c b/src/battle/anim/shield.c
new file mode 100755
index 000000000..676318545
--- /dev/null
+++ b/src/battle/anim/shield.c
@@ -0,0 +1,81 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "palette.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80CCE0C(struct Sprite* sprite);
+
+// shield
+// Used by Protect.
+
+void sub_80CCD24(struct Sprite* sprite)
+{
+ if (IsContest() != 0)
+ {
+ gBattleAnimArgs[1] += 8;
+ }
+
+ sprite->pos1.x = sub_8077EE4(gAnimBankAttacker, 0) + gBattleAnimArgs[0];
+ sprite->pos1.y = sub_8077EE4(gAnimBankAttacker, 1) + gBattleAnimArgs[1];
+ if (GetBankSide(gAnimBankAttacker) == 0 || IsContest())
+ sprite->oam.priority = sub_8079ED4(gAnimBankAttacker) + 1;
+ else
+ sprite->oam.priority = sub_8079ED4(gAnimBankAttacker);
+
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[2] = (IndexOfSpritePaletteTag(0x2828) << 4) + 0x100;
+ sprite->data[7] = 16;
+ REG_BLDCNT = 0x3F40;
+ REG_BLDALPHA = (sprite->data[7] << 8) | (16 - sprite->data[7]);
+ sprite->callback = sub_80CCE0C;
+}
+
+void sub_80CCE0C(struct Sprite* sprite)
+{
+ int a;
+ int i;
+ sprite->data[5] += 0x60;
+ sprite->pos2.x = -(sprite->data[5] >> 8);
+ sprite->data[1]++;
+ if (sprite->data[1] > 1)
+ {
+ sprite->data[1] = 0;
+ a = gPlttBufferFaded[sprite->data[2] + 1];
+ i = 0;
+ do
+ {
+ gPlttBufferFaded[sprite->data[2] + ++i] = gPlttBufferFaded[sprite->data[2] + i + 1];
+ } while ( i <= 5 );
+
+ gPlttBufferFaded[sprite->data[2] + 7] = a;
+ }
+
+ if (sprite->data[7] > 6 && sprite->data[0] >0 && ++sprite->data[6] > 1)
+ {
+ sprite->data[6] = 0;
+ sprite->data[7] -= 1;
+ REG_BLDALPHA = (sprite->data[7] << 8) | (16 - sprite->data[7]);;
+ }
+
+ if (sprite->data[0] >0)
+ {
+ sprite->data[0] -= 1;
+ }
+ else if (++sprite->data[6] > 1)
+ {
+ sprite->data[6] = 0;
+ sprite->data[7]++;
+ REG_BLDALPHA = (sprite->data[7] << 8) | (16 - sprite->data[7]);
+ if (sprite->data[7] == 16)
+ {
+ sprite->invisible = 1;
+ sprite->callback = sub_807861C;
+ }
+ }
+}
diff --git a/src/battle/anim/shimmer.c b/src/battle/anim/shimmer.c
new file mode 100755
index 000000000..9e7bea1e4
--- /dev/null
+++ b/src/battle/anim/shimmer.c
@@ -0,0 +1,48 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "blend_palette.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern u16 gUnknown_083D6984[];
+
+// shimmer
+// Used by Magical Leaf.
+
+void sub_80CC5F8(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ switch (task->data[0])
+ {
+ case 0:
+ task->data[8] = IndexOfSpritePaletteTag(0x274f) * 16 + 256;
+ task->data[12] = IndexOfSpritePaletteTag(0x27b0) * 16 + 256;
+ task->data[0]++;
+ break;
+ case 1:
+ task->data[9]++;
+ if (task->data[9] >= 0)
+ {
+ task->data[9] = 0;
+ BlendPalette(task->data[8], 0x10, task->data[10], gUnknown_083D6984[task->data[11]]);
+ BlendPalette(task->data[12], 0x10, task->data[10], gUnknown_083D6984[task->data[11]]);
+ task->data[10]++;
+ if (task->data[10] == 17)
+ {
+ task->data[10] = 0;
+ task->data[11]++;
+ if (task->data[11] == 7)
+ task->data[11] = 0;
+ }
+ }
+ break;
+ }
+
+ if (gBattleAnimArgs[7] == -1)
+ DestroyAnimVisualTask(taskId);
+}
diff --git a/src/battle/anim/shock.c b/src/battle/anim/shock.c
new file mode 100644
index 000000000..16e04c9db
--- /dev/null
+++ b/src/battle/anim/shock.c
@@ -0,0 +1,106 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+
+extern s16 gBattleAnimArgs[8];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+extern struct OamMatrix gOamMatrices[];
+
+extern void sub_80DA48C(struct Sprite *);
+
+// shock (moves the little electricity lines)
+// Used in Shock.
+
+void sub_80D6294(struct Sprite *sprite)
+{
+ sprite->pos1.x = GetBankPosition(gAnimBankTarget, 2);
+ sprite->pos1.y = GetBankPosition(gAnimBankTarget, 3);
+
+ if (GetBankSide(gAnimBankAttacker) != 0)
+ {
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ sprite->pos1.y -= gBattleAnimArgs[1];
+ }
+ else
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ }
+
+ sprite->data[0] = 0;
+ sprite->data[1] = gBattleAnimArgs[2];
+ sprite->data[2] = gBattleAnimArgs[3];
+ sprite->data[3] = gBattleAnimArgs[4];
+
+ StoreSpriteCallbackInData(sprite, move_anim_8074EE0);
+ sprite->callback = sub_8078114;
+}
+
+void sub_80D6328(struct Sprite *sprite)
+{
+ u8 slot;
+ u32 matrixNum;
+ s16 sineVal;
+
+ switch (gBattleAnimArgs[4])
+ {
+ case 0:
+ slot = gAnimBankAttacker;
+ break;
+ case 1:
+ default:
+ slot = gAnimBankTarget;
+ break;
+ case 2:
+ if (!IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2))
+ {
+ slot = gAnimBankAttacker;
+ }
+ else
+ {
+ slot = gAnimBankAttacker ^ 2;
+ }
+ break;
+ case 3:
+ if (IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2))
+ {
+ slot = gAnimBankTarget ^ 2;
+ }
+ else
+ {
+ slot = gAnimBankTarget;
+ }
+ break;
+ }
+
+ if (gBattleAnimArgs[5] == 0)
+ {
+ sprite->pos1.x = GetBankPosition(slot, 0);
+ sprite->pos1.y = GetBankPosition(slot, 1);
+ }
+ else
+ {
+ sprite->pos1.x = GetBankPosition(slot, 2);
+ sprite->pos1.y = GetBankPosition(slot, 3);
+ }
+
+ sprite->pos2.x = (gSineTable[gBattleAnimArgs[0]] * gBattleAnimArgs[1]) >> 8;
+ sprite->pos2.y = (gSineTable[gBattleAnimArgs[0] + 64] * gBattleAnimArgs[1]) >> 8;
+
+ if (gBattleAnimArgs[6] & 1)
+ {
+ sprite->oam.priority = sub_8079ED4(slot) + 1;
+ }
+
+ matrixNum = sprite->oam.matrixNum;
+ sineVal = gSineTable[gBattleAnimArgs[2]];
+
+ gOamMatrices[matrixNum].a = gOamMatrices[matrixNum].d = gSineTable[gBattleAnimArgs[2] + 64];
+ gOamMatrices[matrixNum].b = sineVal;
+ gOamMatrices[matrixNum].c = -sineVal;
+
+ sprite->data[0] = gBattleAnimArgs[3];
+ sprite->callback = sub_80DA48C;
+}
diff --git a/src/battle/anim/silhouette.c b/src/battle/anim/silhouette.c
new file mode 100755
index 000000000..a3147f598
--- /dev/null
+++ b/src/battle/anim/silhouette.c
@@ -0,0 +1,77 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80CB3A8(u8 taskId);
+static void sub_80CB438(u8 taskId);
+
+// silhouette (the transparent shadow image used for mimic.)
+// Only used by Mimic.
+
+void sub_80CB340(u8 taskId)
+{
+ u8 spriteId = GetAnimBankSpriteId(1);
+ if (gSprites[spriteId].invisible)
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+ else
+ {
+ sub_8078E70(spriteId, 1);
+ gTasks[taskId].data[0] = gBattleAnimArgs[0];
+ gTasks[taskId].data[1] = gBattleAnimArgs[1];
+ gTasks[taskId].data[11] = 256;
+ gTasks[taskId].func = sub_80CB3A8;
+ }
+}
+
+void sub_80CB3A8(u8 taskId)
+{
+ u8 spriteId = GetAnimBankSpriteId(1);
+ gTasks[taskId].data[10] += gTasks[taskId].data[0];
+ gSprites[spriteId].pos2.x = gTasks[taskId].data[10] >> 8;
+ if (GetBankSide(gAnimBankTarget))
+ {
+ gSprites[spriteId].pos2.x = -gSprites[spriteId].pos2.x;
+ }
+
+ gTasks[taskId].data[11] += 16;
+ obj_id_set_rotscale(spriteId, gTasks[taskId].data[11], gTasks[taskId].data[11], 0);
+ sub_8079A64(spriteId);
+ gTasks[taskId].data[1]--;
+ if (!gTasks[taskId].data[1])
+ {
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_80CB438;
+ }
+}
+
+void sub_80CB438(u8 taskId)
+{
+ if ((u16)gBattleAnimArgs[7] == 0xFFFF)
+ {
+ if (gTasks[taskId].data[0] == 0)
+ {
+ u8 spriteId = GetAnimBankSpriteId(1);
+ sub_8078F40(spriteId);
+ gSprites[spriteId].pos2.x = 0;
+ gSprites[spriteId].pos2.y = 0;
+ gTasks[taskId].data[0]++;
+ return;
+ }
+ }
+ else
+ {
+ if (gTasks[taskId].data[0] == 0)
+ return;
+ }
+
+ gTasks[taskId].data[0]++;
+ if (gTasks[taskId].data[0] == 3)
+ DestroyAnimVisualTask(taskId);
+}
diff --git a/src/battle/anim/slash.c b/src/battle/anim/slash.c
new file mode 100755
index 000000000..6adcaf098
--- /dev/null
+++ b/src/battle/anim/slash.c
@@ -0,0 +1,83 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80CDE78(struct Sprite* sprite);
+static void sub_80CDEB0(struct Sprite* sprite);
+static void sub_80CDEC0(struct Sprite* sprite);
+
+// slash (a cutting animation)
+// Used in Slash and False Swipe.
+
+void sub_80CDD74(struct Sprite* sprite)
+{
+ if (gBattleAnimArgs[0] == 0)
+ {
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2) + gBattleAnimArgs[1];
+ sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3) + gBattleAnimArgs[2];
+ }
+ else
+ {
+ sprite->pos1.x = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[1];
+ sprite->pos1.y = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[2];
+ }
+
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ StoreSpriteCallbackInData(sprite, sub_80CDEC0);
+ sprite->callback = sub_8078600;
+}
+
+void sub_80CDDDC(struct Sprite* sprite)
+{
+ sprite->pos1.x = GetBankPosition(gAnimBankTarget, 2) + 0xFFD0;
+ sprite->pos1.y = GetBankPosition(gAnimBankTarget, 3);
+ StoreSpriteCallbackInData(sprite, sub_80CDE78);
+ sprite->callback = sub_8078600;
+}
+
+void sub_80CDE24(struct Sprite* sprite)
+{
+ sprite->pos1.x = sprite->pos1.x = GetBankPosition(gAnimBankTarget, 2) + 0xFFD0 + gBattleAnimArgs[0];
+ sprite->pos1.y = GetBankPosition(gAnimBankTarget, 3);
+ StartSpriteAnim(sprite, 1);
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ sprite->callback = sub_80CDEC0;
+}
+
+void sub_80CDE78(struct Sprite* sprite)
+{
+ if (++sprite->data[0] > 8)
+ {
+ sprite->data[0] = 12;
+ sprite->data[1] = 8;
+ sprite->data[2] = 0;
+ StoreSpriteCallbackInData(sprite, sub_80CDEB0);
+ sprite->callback = sub_8078364;
+ }
+}
+
+void sub_80CDEB0(struct Sprite* sprite)
+{
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ sprite->callback = sub_80CDEC0;
+}
+
+void sub_80CDEC0(struct Sprite* sprite)
+{
+ if (++sprite->data[0] > 1)
+ {
+ sprite->data[0] = 0;
+ sprite->invisible = !sprite->invisible;
+ if (++sprite->data[1] > 8)
+ DestroyAnimSprite(sprite);
+ }
+}
diff --git a/src/battle/anim/sleep.c b/src/battle/anim/sleep.c
new file mode 100755
index 000000000..0f0e54f80
--- /dev/null
+++ b/src/battle/anim/sleep.c
@@ -0,0 +1,44 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80CD394(struct Sprite* sprite);
+
+// sleep (the "ZZZ" graphical effect)
+// Used by Rest and the sleep turn when the Pokemon is still asleep.
+
+void sub_80CD328(struct Sprite* sprite)
+{
+ sub_8078650(sprite);
+ if (GetBankSide(gAnimBankAttacker) == 0)
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[3] = 1;
+ }
+ else
+ {
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[3] = 0xFFFF;
+ StartSpriteAffineAnim(sprite, 1);
+ }
+
+ sprite->callback = sub_80CD394;
+}
+
+void sub_80CD394(struct Sprite* sprite)
+{
+ sprite->pos2.y = -(sprite->data[0] / 0x28);
+ sprite->pos2.x = sprite->data[4] / 10;
+ sprite->data[4] += sprite->data[3] * 2;
+ sprite->data[0] += sprite->data[1];
+ if (++sprite->data[1] > 0x3C)
+ move_anim_8074EE0(sprite);
+}
diff --git a/src/battle/anim/slice.c b/src/battle/anim/slice.c
new file mode 100755
index 000000000..fe8745483
--- /dev/null
+++ b/src/battle/anim/slice.c
@@ -0,0 +1,111 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80CCB00(struct Sprite* sprite);
+
+// slice (the cutting animation showing as a yellow line drawn diagonally)
+// Used in Cut, Fury Cutter, Aerial Ace, and Air Cutter.
+
+void sub_80CC914(struct Sprite* sprite)
+{
+ sprite->pos1.x = GetBankPosition(gAnimBankTarget, 0);
+ sprite->pos1.y = GetBankPosition(gAnimBankTarget, 1);
+ if (GetBankSide(gAnimBankTarget) == 0)
+ sprite->pos1.y += 8;
+
+ sprite->callback = sub_80CCB00;
+ if (gBattleAnimArgs[2] == 0)
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ }
+ else
+ {
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ sprite->hFlip = 1;
+ }
+
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[1] -= 0x400;
+ sprite->data[2] += 0x400;
+ sprite->data[5] = gBattleAnimArgs[2];
+ if (sprite->data[5] == 1)
+ sprite->data[1] = -sprite->data[1];
+}
+
+void sub_80CC9BC(struct Sprite* sprite)
+{
+ u8 a;
+ u8 b;
+ switch (gBattleAnimArgs[3])
+ {
+ case 1:
+ a = GetBankPosition(gAnimBankTarget ^ 2, 0);
+ b = GetBankPosition(gAnimBankTarget ^ 2, 1);
+ break;
+ case 2:
+ a = GetBankPosition(gAnimBankTarget, 0);
+ b = GetBankPosition(gAnimBankTarget, 1);
+ if (IsAnimBankSpriteVisible(gAnimBankTarget ^ 2))
+ {
+ a = (GetBankPosition(gAnimBankTarget ^ 2, 0) + a) / 2;
+ b = (GetBankPosition(gAnimBankTarget ^ 2, 1) + b) / 2;
+ }
+ break;
+ case 0:
+ default:
+ a = GetBankPosition(gAnimBankTarget, 0);
+ b = GetBankPosition(gAnimBankTarget, 1);
+ break;
+ }
+
+ sprite->pos1.x = a;
+ sprite->pos1.y = b;
+ if (GetBankSide(gAnimBankTarget) == 0)
+ sprite->pos1.y += 8;
+
+ sprite->callback = sub_80CCB00;
+ if (gBattleAnimArgs[2] == 0)
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ }
+ else
+ {
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ sprite->hFlip = 1;
+ }
+
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[1] -= 0x400;
+ sprite->data[2] += 0x400;
+ sprite->data[5] = gBattleAnimArgs[2];
+ if (sprite->data[5] == 1)
+ sprite->data[1] = -sprite->data[1];
+}
+
+void sub_80CCB00(struct Sprite* sprite)
+{
+ sprite->data[3] += sprite->data[1];
+ sprite->data[4] += sprite->data[2];
+ if (sprite->data[5] == 0)
+ sprite->data[1] += 0x18;
+ else
+ sprite->data[1] -= 0x18;
+
+ sprite->data[2] -= 0x18;
+ sprite->pos2.x = sprite->data[3] >> 8;
+ sprite->pos2.y = sprite->data[4] >> 8;
+ sprite->data[0]++;
+ if (sprite->data[0] == 20)
+ {
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+ sprite->data[0] = 3;
+ sprite->callback = sub_80782D8;
+ }
+}
diff --git a/src/battle/anim/smoke.c b/src/battle/anim/smoke.c
new file mode 100755
index 000000000..7ab873e63
--- /dev/null
+++ b/src/battle/anim/smoke.c
@@ -0,0 +1,22 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+// smoke (smoke on the ground around a sprite.)
+// Used in Extremespeed.
+
+void sub_80D1A70(struct Sprite* sprite)
+{
+ sprite->invisible = gTasks[sprite->data[0]].data[5];
+ if (sprite->animEnded)
+ {
+ gTasks[sprite->data[0]].data[sprite->data[1]]--;
+ DestroySprite(sprite);
+ }
+}
diff --git a/src/battle/anim/sonic.c b/src/battle/anim/sonic.c
new file mode 100755
index 000000000..0897ec6e3
--- /dev/null
+++ b/src/battle/anim/sonic.c
@@ -0,0 +1,136 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "battle_anim_80CA710.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+// sonic (shoots a projectile towards the target.)
+// Used in Sonic Boom and Air Cutter.
+
+void sub_80CF6DC(struct Sprite* sprite)
+{
+ s16 a;
+ s16 b;
+ u16 c;
+
+ if (IsContest())
+ {
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+ }
+ else if (GetBankSide(gAnimBankAttacker) != 0)
+ {
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ gBattleAnimArgs[3] = -gBattleAnimArgs[3];
+ }
+
+ sub_80787B0(sprite, 1);
+ a = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[2];
+ b = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[3];
+ c = sub_80790F0(a - sprite->pos1.x, b - sprite->pos1.y);
+ c += 0xF000;
+ if (IsContest())
+ c -= 0x6000;
+
+ sub_8078FDC(sprite, 0, 0x100, 0x100, c);
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[2] = a;
+ sprite->data[4] = b;
+ sprite->callback = sub_8078B34;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+}
+
+void sub_80CF7E0(struct Sprite* sprite)
+{
+ if (sprite->data[0]-- <= 0)
+ {
+ gTasks[sprite->data[7]].data[1]--;
+ DestroySprite(sprite);
+ }
+}
+
+void sub_80CF814(struct Sprite* sprite)
+{
+ struct Task* task = &gTasks[sprite->data[7]];
+ if (sprite->data[0] > task->data[5])
+ {
+ sprite->data[5] += sprite->data[3];
+ sprite->data[6] += sprite->data[4];
+ }
+ else
+ {
+ sprite->data[5] -= sprite->data[3];
+ sprite->data[6] -= sprite->data[4];
+ }
+
+ sprite->data[1] += sprite->data[5];
+ sprite->data[2] += sprite->data[6];
+ if (1 & task->data[7])
+ sprite->pos2.x = ((u16)sprite->data[1] >> 8) * -1;
+ else
+ sprite->pos2.x = (u16)sprite->data[1] >> 8;
+
+ if (1 & task->data[8])
+ sprite->pos2.y = ((u16)sprite->data[2] / 256u) * -1;
+ else
+ sprite->pos2.y = (u16)sprite->data[2] / 256u;
+
+ if (sprite->data[0]-- <= 0)
+ {
+ sprite->data[0] = 30;
+ sprite->callback = sub_80CF7E0;
+ }
+}
+
+void sub_80CF8B8(struct Sprite* sprite)
+{
+ s16 a;
+ s16 b;
+ s16 c;
+
+ struct Task* task = &gTasks[sprite->data[7]];
+ sprite->data[1] += (-2 & task->data[7]);
+ sprite->data[2] += (-2 & task->data[8]);
+ if (1 & task->data[7])
+ sprite->pos2.x = ((u16)sprite->data[1] >> 8) * -1;
+ else
+ sprite->pos2.x = (u16)sprite->data[1] >> 8;
+
+ if (1 & task->data[8])
+ sprite->pos2.y = ((u16)sprite->data[2] / 256u) * -1;
+ else
+ sprite->pos2.y = (u16)sprite->data[2] / 256u;
+
+ if (sprite->data[0]-- <= 0)
+ {
+ sprite->data[0] = 8;
+ task->data[5] = 4;
+ a = sub_81174E0(0x1000);
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+ if (task->data[11] >= sprite->pos1.x)
+ b = (task->data[11] - sprite->pos1.x) << 8;
+ else
+ b = (sprite->pos1.x - task->data[11]) << 8;
+
+ if (task->data[12] >= sprite->pos1.y)
+ c = (task->data[12] - sprite->pos1.y) << 8;
+ else
+ c = (sprite->pos1.y - task->data[12]) << 8;
+
+ sprite->data[2] = 0;
+ sprite->data[1] = 0;
+ sprite->data[6] = 0;
+ sprite->data[5] = 0;
+ sprite->data[3] = sub_81174C4(sub_81174C4(b, a), sub_81174E0(0x1C0));
+ sprite->data[4] = sub_81174C4(sub_81174C4(c, a), sub_81174E0(0x1C0));
+ sprite->callback = sub_80CF814;
+ }
+}
diff --git a/src/battle/anim/sonic_task.c b/src/battle/anim/sonic_task.c
new file mode 100755
index 000000000..924b1b568
--- /dev/null
+++ b/src/battle/anim/sonic_task.c
@@ -0,0 +1,152 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "battle_anim_80CA710.h"
+#include "battle.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern u8 gBanksBySide[];
+extern u16 gBattleTypeFlags;
+extern struct SpriteTemplate gSpriteTemplate_83D74BC;
+
+// sonic_task (the task functions for the "sonic" effect.)
+// Used in Air Cutter and Sonic Boom.
+
+void sub_80CF9F8(u8 taskId)
+{
+ if (gTasks[taskId].data[1] == 0)
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_80CFA20(u8 taskId)
+{
+ if (gTasks[taskId].data[0]-- <= 0)
+ {
+ u8 spriteId;
+ struct Sprite* sprite;
+ spriteId = CreateSprite(&gSpriteTemplate_83D74BC, gTasks[taskId].data[9], gTasks[taskId].data[10], gTasks[taskId].data[2] - gTasks[taskId].data[1]);
+ sprite = &gSprites[spriteId];
+ switch (gTasks[taskId].data[4])
+ {
+ case 1:
+ sprite->oam.matrixNum |= 24;
+ break;
+ case 2:
+ sprite->oam.matrixNum = 8;
+ break;
+ }
+
+ sprite->data[0] = gTasks[taskId].data[5] - gTasks[taskId].data[6];
+ sprite->data[7] = taskId;
+ gTasks[taskId].data[gTasks[taskId].data[1] + 13] = spriteId;
+ gTasks[taskId].data[0] = gTasks[taskId].data[3];
+ gTasks[taskId].data[1]++;
+ PlaySE12WithPanning(0x9A, BattleAnimAdjustPanning(-0x3F));
+ if (gTasks[taskId].data[1] > 2)
+ gTasks[taskId].func = sub_80CF9F8;
+ }
+}
+
+void sub_80CFB04(u8 taskId)
+{
+ s16 r9 = 0;
+ s16 r6 = 0;
+ s16 sp1 = 0;
+ s16 sp2 = 0;
+ s16 r4;
+
+ if (IsContest())
+ {
+ gTasks[taskId].data[4] = 2;
+ gBattleAnimArgs[0] = -gBattleAnimArgs[0];
+ if (gBattleAnimArgs[2] & 1)
+ gBattleAnimArgs[2] &= ~1;
+ else
+ gBattleAnimArgs[2] |= 1;
+ }
+ else
+ {
+ if ((gBanksBySide[gAnimBankTarget] & 1) == 0)
+ {
+ gTasks[taskId].data[4] = 1;
+ gBattleAnimArgs[0] = -gBattleAnimArgs[0];
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ if (gBattleAnimArgs[2] & 1)
+ gBattleAnimArgs[2] &= ~1;
+ else
+ gBattleAnimArgs[2] |= 1;
+ }
+ }
+ r6 = gTasks[taskId].data[9] = GetBankPosition(gAnimBankAttacker, 0);
+ r9 = gTasks[taskId].data[10] = GetBankPosition(gAnimBankAttacker, 1);
+ if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
+ && IsAnimBankSpriteVisible(gAnimBankTarget ^ 2))
+ {
+ sub_807A3FC(gAnimBankTarget, 0, &sp1, &sp2);
+ }
+ else
+ {
+ sp1 = GetBankPosition(gAnimBankTarget, 0);
+ sp2 = GetBankPosition(gAnimBankTarget, 1);
+ }
+
+ sp1 = gTasks[taskId].data[11] = sp1 + gBattleAnimArgs[0];
+ sp2 = gTasks[taskId].data[12] = sp2 + gBattleAnimArgs[1];
+ if (sp1 >= r6)
+ r4 = sp1 - r6;
+ else
+ r4 = r6 - sp1;
+
+ gTasks[taskId].data[5] = sub_81174C4(r4, sub_81174E0(gBattleAnimArgs[2] & ~1));
+ gTasks[taskId].data[6] = sub_81174C4(gTasks[taskId].data[5], 0x80);
+ gTasks[taskId].data[7] = gBattleAnimArgs[2];
+ if (sp2 >= r9)
+ {
+ r4 = sp2 - r9;
+ gTasks[taskId].data[8] = sub_81174C4(r4, sub_81174E0(gTasks[taskId].data[5])) & ~1;
+ }
+ else
+ {
+ r4 = r9 - sp2;
+ gTasks[taskId].data[8] = sub_81174C4(r4, sub_81174E0(gTasks[taskId].data[5])) | 1;
+ }
+
+ gTasks[taskId].data[3] = gBattleAnimArgs[3];
+ if (gBattleAnimArgs[4] & 0x80)
+ {
+ gBattleAnimArgs[4] ^= 0x80;
+ if (gBattleAnimArgs[4] >= 64)
+ {
+ u16 var = sub_8079E90(gAnimBankTarget) + (gBattleAnimArgs[4] - 64);
+ gTasks[taskId].data[2] = var;
+ }
+ else
+ {
+ u16 var = sub_8079E90(gAnimBankTarget) - gBattleAnimArgs[4];
+ gTasks[taskId].data[2] = var;
+ }
+ }
+ else
+ {
+ if (gBattleAnimArgs[4] >= 64)
+ {
+ u16 var = sub_8079E90(gAnimBankTarget) + (gBattleAnimArgs[4] - 64);
+ gTasks[taskId].data[2] = var;
+ }
+ else
+ {
+ u16 var = sub_8079E90(gAnimBankTarget) - gBattleAnimArgs[4];
+ gTasks[taskId].data[2] = var;
+ }
+ }
+
+ if (gTasks[taskId].data[2] < 3)
+ gTasks[taskId].data[2] = 3;
+
+ gTasks[taskId].func = sub_80CFA20;
+}
diff --git a/src/battle/anim/spin_finger.c b/src/battle/anim/spin_finger.c
new file mode 100755
index 000000000..8eb060358
--- /dev/null
+++ b/src/battle/anim/spin_finger.c
@@ -0,0 +1,73 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern void sub_80CF088(struct Sprite* sprite);
+static void sub_80CF138(struct Sprite* sprite);
+static void sub_80CF158(struct Sprite* sprite);
+
+// spin_finger
+// Used in Follow Me.
+
+void sub_80CF0BC(struct Sprite* sprite)
+{
+ u8 bank;
+ if (gBattleAnimArgs[0] == 0)
+ bank = gAnimBankAttacker;
+ else
+ bank = gAnimBankTarget;
+
+ sprite->pos1.x = GetBankPosition(bank, 0);
+ sprite->pos1.y = sub_807A100(bank, 2);
+ if (sprite->pos1.y <= 9)
+ sprite->pos1.y = 10;
+
+ sprite->data[0] = 1;
+ sprite->data[1] = 0;
+ sprite->data[2] = sprite->subpriority;
+ sprite->data[3] = sprite->subpriority + 4;
+ sprite->data[4] = 0;
+ StoreSpriteCallbackInData(sprite, sub_80CF138);
+ sprite->callback = sub_80785E4;
+}
+
+void sub_80CF138(struct Sprite* sprite)
+{
+ if (++sprite->data[4] > 12)
+ sprite->callback = sub_80CF158;
+}
+
+void sub_80CF158(struct Sprite* sprite)
+{
+ s16 temp;
+ s16 temp2;
+ sprite->data[1] += 4;
+ if (sprite->data[1] > 0xFE)
+ {
+ if (--sprite->data[0] == 0)
+ {
+ sprite->pos2.x = 0;
+ sprite->callback = sub_80CF088;
+ return;
+ }
+ else
+ {
+ sprite->data[1] &= 0xFF;
+ }
+ }
+
+ if (sprite->data[1] > 0x4F)
+ sprite->subpriority = sprite->data[3];
+
+ if (sprite->data[1] > 0x9F)
+ sprite->subpriority = sprite->data[2];
+
+ temp = gSineTable[sprite->data[1]];
+ sprite->pos2.x = (temp2 = temp >> 3) + (temp2 >> 1);
+}
diff --git a/src/battle/anim/spit.c b/src/battle/anim/spit.c
new file mode 100755
index 000000000..1e65ba53e
--- /dev/null
+++ b/src/battle/anim/spit.c
@@ -0,0 +1,30 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+// spit (hurls sprites outward from the pokemon. Similar to orbit_fast, but takes another argument.)
+// Used in Spit Up.
+
+void sub_80D287C(struct Sprite* sprite)
+{
+ sprite->pos2.x += sprite->data[0];
+ sprite->pos2.y += sprite->data[1];
+ if (sprite->data[3]++ >= sprite->data[2])
+ DestroyAnimSprite(sprite);
+}
+
+void sub_80D28AC(struct Sprite* sprite)
+{
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2);
+ sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3);
+ sprite->data[0] = Sin(gBattleAnimArgs[0], 10);
+ sprite->data[1] = Cos(gBattleAnimArgs[0], 7);
+ sprite->data[2] = gBattleAnimArgs[1];
+ sprite->callback = sub_80D287C;
+}
diff --git a/src/battle/anim/splash.c b/src/battle/anim/splash.c
new file mode 100755
index 000000000..570ef0dca
--- /dev/null
+++ b/src/battle/anim/splash.c
@@ -0,0 +1,87 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern struct AffineAnimFrameCmd gUnknown_083D76F4;
+
+static void sub_80D07AC(u8 taskId);
+
+// splash (splash effect of hopping up and down)
+// Used in Splash, Mud Sport, and Sketch.
+
+void sub_80D074C(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ if (gBattleAnimArgs[1] == 0)
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+ else
+ {
+ u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
+ task->data[0] = spriteId;
+ task->data[1] = 0;
+ task->data[2] = gBattleAnimArgs[1];
+ task->data[3] = 0;
+ task->data[4] = 0;
+ sub_80798F4(task, spriteId, &gUnknown_083D76F4);
+ task->func = sub_80D07AC;
+ }
+}
+
+void sub_80D07AC(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ switch (task->data[1])
+ {
+ case 0:
+ sub_807992C(task);
+ task->data[4] += 3;
+ gSprites[task->data[0]].pos2.y += task->data[4];
+ if (++task->data[3] > 7)
+ {
+ task->data[3] = 0;
+ task->data[1]++;
+ }
+ break;
+ case 1:
+ sub_807992C(task);
+ gSprites[task->data[0]].pos2.y += task->data[4];
+ if (++task->data[3] > 7)
+ {
+ task->data[3] = 0;
+ task->data[1]++;
+ }
+ break;
+ case 2:
+ if (task->data[4] != 0)
+ {
+ gSprites[task->data[0]].pos2.y -= 2;
+ task->data[4] -= 2;
+ }
+ else
+ task->data[1]++;
+ break;
+ case 3:
+ if (!sub_807992C(task))
+ {
+ if (--task->data[2] == 0)
+ {
+ gSprites[task->data[0]].pos2.y = 0;
+ DestroyAnimVisualTask(taskId);
+ }
+ else
+ {
+ sub_80798F4(task, task->data[0], &gUnknown_083D76F4);
+ task->data[1] = 0;
+ }
+ }
+ break;
+ }
+}
diff --git a/src/battle/anim/startle.c b/src/battle/anim/startle.c
new file mode 100755
index 000000000..50e78af37
--- /dev/null
+++ b/src/battle/anim/startle.c
@@ -0,0 +1,56 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern struct AffineAnimFrameCmd gUnknown_083D7A98;
+
+// startle (the pokemon sprite shrivels upward and restores after a brief time.)
+// Used in Fake Out, Trick, and Astonish.
+
+// opponent
+void sub_80D1E38(u8 taskId)
+{
+ u8 spriteId = GetAnimBankSpriteId(1);
+ if (++gTasks[taskId].data[0] == 1)
+ {
+ sub_80798F4(&gTasks[taskId], GetAnimBankSpriteId(1), &gUnknown_083D7A98);
+ gSprites[spriteId].pos2.x = 4;
+ }
+ else
+ {
+ gSprites[spriteId].pos2.x = -gSprites[spriteId].pos2.x;
+ if (sub_807992C(&gTasks[taskId]) == 0)
+ {
+ gSprites[spriteId].pos2.x = 0;
+ gSprites[spriteId].pos2.y = 0;
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+}
+
+// player
+void sub_80D1EC8(u8 taskId)
+{
+ u8 spriteId = GetAnimBankSpriteId(0);
+ if (++gTasks[taskId].data[0] == 1)
+ {
+ sub_80798F4(&gTasks[taskId], GetAnimBankSpriteId(0), &gUnknown_083D7A98);
+ gSprites[spriteId].pos2.x = 4;
+ }
+ else
+ {
+ gSprites[spriteId].pos2.x = -gSprites[spriteId].pos2.x;
+ if (sub_807992C(&gTasks[taskId]) == 0)
+ {
+ gSprites[spriteId].pos2.x = 0;
+ gSprites[spriteId].pos2.y = 0;
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+}
diff --git a/src/battle/anim/strike.c b/src/battle/anim/strike.c
new file mode 100755
index 000000000..bfa1dc4f7
--- /dev/null
+++ b/src/battle/anim/strike.c
@@ -0,0 +1,77 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80CE798(struct Sprite* sprite);
+
+// strike (A red strike towards the opponent.)
+// Used in Horn Attack, Fury Attack, and Horn Drill.
+
+void sub_80CE670(struct Sprite* sprite)
+{
+ if (gBattleAnimArgs[2] <= 1)
+ gBattleAnimArgs[2] = 2;
+
+ if (gBattleAnimArgs[2] > 0x7F)
+ gBattleAnimArgs[2] = 0x7F;
+
+ sprite->data[0] = 0;
+ sprite->data[1] = gBattleAnimArgs[2];
+ sprite->pos1.x = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[0];
+ sprite->pos1.y = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[1];
+ sprite->data[6] = sprite->pos1.x;
+ sprite->data[7] = sprite->pos1.y;
+ if (IsContest() != 0)
+ {
+ sprite->oam.matrixNum = 8;
+ sprite->pos1.x += 40;
+ sprite->pos1.y += 20;
+ sprite->data[2] = sprite->pos1.x << 7;
+ sprite->data[3] = -0x1400 / sprite->data[1];
+ sprite->data[4] = sprite->pos1.y << 7;
+ sprite->data[5] = -0xA00 / sprite->data[1];
+ }
+ else if (GetBankSide(gAnimBankAttacker) == 0)
+ {
+ sprite->pos1.x -= 40;
+ sprite->pos1.y += 20;
+ sprite->data[2] = sprite->pos1.x << 7;
+ sprite->data[3] = 0x1400 / sprite->data[1];
+ sprite->data[4] = sprite->pos1.y << 7;
+ sprite->data[5] = -0xA00 / sprite->data[1];
+ }
+ else
+ {
+ sprite->pos1.x += 40;
+ sprite->pos1.y -= 20;
+ sprite->data[2] = sprite->pos1.x << 7;
+ sprite->data[3] = -0x1400 / sprite->data[1];
+ sprite->data[4] = sprite->pos1.y << 7;
+ sprite->data[5] = 0xA00 / sprite->data[1];
+ sprite->oam.matrixNum = 24;
+ }
+
+ sprite->callback = sub_80CE798;
+}
+
+void sub_80CE798(struct Sprite* sprite)
+{
+ sprite->data[2] += sprite->data[3];
+ sprite->data[4] += sprite->data[5];
+ sprite->pos1.x = sprite->data[2] >> 7;
+ sprite->pos1.y = sprite->data[4] >> 7;
+ if (--sprite->data[1] == 1)
+ {
+ sprite->pos1.x = sprite->data[6];
+ sprite->pos1.y = sprite->data[7];
+ }
+
+ if (sprite->data[1] == 0)
+ DestroyAnimSprite(sprite);
+}
diff --git a/src/battle/anim/struggle.c b/src/battle/anim/struggle.c
new file mode 100644
index 000000000..20dbaf2dc
--- /dev/null
+++ b/src/battle/anim/struggle.c
@@ -0,0 +1,52 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "rom_8077ABC.h"
+#include "sprite.h"
+
+extern s16 gBattleAnimArgs[8];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80D2CC4(struct Sprite *);
+
+void sub_80D2C38(struct Sprite *sprite)
+{
+ if (gBattleAnimArgs[2] == 0)
+ {
+ DestroyAnimSprite(sprite);
+ }
+ else
+ {
+ if (gBattleAnimArgs[0] == 0)
+ {
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2);
+ sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3);
+ }
+ else
+ {
+ sprite->pos1.x = GetBankPosition(gAnimBankTarget, 2);
+ sprite->pos1.y = GetBankPosition(gAnimBankTarget, 3);
+ }
+
+ if (gBattleAnimArgs[1] == 0)
+ sprite->pos1.x += 32;
+ else
+ sprite->pos1.x -= 32;
+
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[1] = gBattleAnimArgs[1];
+ StartSpriteAnim(sprite, sprite->data[1]);
+ sprite->callback = sub_80D2CC4;
+ }
+}
+
+static void sub_80D2CC4(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ {
+ if (--sprite->data[0] != 0)
+ StartSpriteAnim(sprite, sprite->data[1]);
+ else
+ DestroyAnimSprite(sprite);
+ }
+}
diff --git a/src/battle/anim/sunlight.c b/src/battle/anim/sunlight.c
new file mode 100644
index 000000000..e6fd49a11
--- /dev/null
+++ b/src/battle/anim/sunlight.c
@@ -0,0 +1,17 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "rom_8077ABC.h"
+
+// sunlight (creates sunlight orbs)
+// Used in Sunny Day
+
+void sub_80D517C(struct Sprite *sprite)
+{
+ sprite->pos1.x = 0;
+ sprite->pos1.y = 0;
+ sprite->data[0] = 60;
+ sprite->data[2] = 140;
+ sprite->data[4] = 80;
+ sprite->callback = sub_8078B34;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+}
diff --git a/src/battle/anim/swipe.c b/src/battle/anim/swipe.c
new file mode 100644
index 000000000..922b11a5f
--- /dev/null
+++ b/src/battle/anim/swipe.c
@@ -0,0 +1,20 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "sprite.h"
+
+extern s16 gBattleAnimArgs[8];
+
+void sub_80D2BE8(struct Sprite *sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ StartSpriteAnim(sprite, gBattleAnimArgs[2]);
+ sprite->data[0]++;
+ }
+ else if (sprite->animEnded)
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
diff --git a/src/battle/anim/switch.c b/src/battle/anim/switch.c
new file mode 100755
index 000000000..c4082b6aa
--- /dev/null
+++ b/src/battle/anim/switch.c
@@ -0,0 +1,128 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern s8 gUnknown_083D680C[11][3];
+
+static void sub_80CBC8C(struct Sprite* sprite);
+static void sub_80CBCF8(struct Sprite* sprite);
+static void sub_80CBDB0(struct Sprite* sprite);
+
+// switch (makes an item and circles it from side to side on the field.)
+// Used in Trick.
+
+void sub_80CBBF0(struct Sprite* sprite)
+{
+ int a;
+ int b;
+
+ if (sprite->data[0] == 0)
+ {
+ if (!IsContest())
+ {
+ sprite->data[1] = gBattleAnimArgs[1];
+ sprite->pos1.x = 0x78;
+ }
+ else
+ {
+ a = gBattleAnimArgs[1] - 32;
+ if (a < 0)
+ b = gBattleAnimArgs[1] + 0xDF;
+ else
+ b = a;
+
+ sprite->data[1] = a - ((b >> 8) << 8);
+ sprite->pos1.x = 0x46;
+ }
+
+ sprite->pos1.y = gBattleAnimArgs[0];
+ sprite->data[2] = gBattleAnimArgs[0];
+ sprite->data[4] = 20;
+ sprite->pos2.x = Cos(sprite->data[1], 0x3C);
+ sprite->pos2.y = Sin(sprite->data[1], 20);
+ sprite->callback = sub_80CBC8C;
+ if (sprite->data[1] > 0 && sprite->data[1] < 0xC0)
+ sprite->subpriority = 31;
+ else
+ sprite->subpriority = 29;
+ }
+}
+
+void sub_80CBC8C(struct Sprite* sprite)
+{
+ switch (sprite->data[3])
+ {
+ case 0:
+ if (sprite->data[2] > 0x4E)
+ {
+ sprite->data[3] = 1;
+ StartSpriteAffineAnim(sprite, 1);
+ break;
+ }
+ else
+ {
+ sprite->data[2] += sprite->data[4] / 10;
+ sprite->data[4] += 3;
+ sprite->pos1.y = sprite->data[2];
+ break;
+ }
+ break;
+ case 1:
+ if (sprite->data[3] && sprite->affineAnimEnded)
+ {
+ sprite->data[0] = 0;
+ sprite->data[2] = 0;
+ sprite->callback = sub_80CBCF8;
+ }
+ break;
+ }
+}
+
+void sub_80CBCF8(struct Sprite* sprite)
+{
+ if (sprite->data[2] == gUnknown_083D680C[sprite->data[0]][1])
+ {
+ if (gUnknown_083D680C[sprite->data[0]][2] == 0x7F)
+ {
+ sprite->data[0] = 0;
+ sprite->callback = sub_80CBDB0;
+ }
+
+ sprite->data[2] = 0;
+ sprite->data[0]++;
+ }
+ else
+ {
+ sprite->data[2]++;
+ sprite->data[1] = (gUnknown_083D680C[sprite->data[0]][0] * gUnknown_083D680C[sprite->data[0]][2] + sprite->data[1]) & 0xFF;
+ if (!IsContest())
+ {
+ if ((u16)(sprite->data[1] - 1) <= 0xBE)
+ {
+ sprite->subpriority = 31;
+ }
+ else
+ {
+ sprite->subpriority = 29;
+ }
+ }
+
+ sprite->pos2.x = Cos(sprite->data[1], 0x3C);
+ sprite->pos2.y = Sin(sprite->data[1], 20);
+ }
+}
+
+void sub_80CBDB0(struct Sprite* sprite)
+{
+ if (sprite->data[0] > 20)
+ DestroyAnimSprite(sprite);
+
+ sprite->invisible = sprite->data[0] % 2;
+ sprite->data[0]++;
+}
diff --git a/src/battle/anim/sword.c b/src/battle/anim/sword.c
new file mode 100755
index 000000000..b46fe6759
--- /dev/null
+++ b/src/battle/anim/sword.c
@@ -0,0 +1,30 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80CF6B4(struct Sprite* sprite);
+
+// sword (sword appears and floats upward.)
+// Used in Swords Dance.
+
+void sub_80CF690(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 0);
+ sprite->callback = sub_80785E4;
+ StoreSpriteCallbackInData(sprite, sub_80CF6B4);
+}
+
+void sub_80CF6B4(struct Sprite* sprite)
+{
+ sprite->data[0] = 6;
+ sprite->data[2] = sprite->pos1.x;
+ sprite->data[4] = sprite->pos1.y - 32;
+ sprite->callback = sub_8078B34;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+}
diff --git a/src/battle/anim/taunt_finger.c b/src/battle/anim/taunt_finger.c
new file mode 100755
index 000000000..023e14e45
--- /dev/null
+++ b/src/battle/anim/taunt_finger.c
@@ -0,0 +1,56 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern void sub_80CEF44(u8 bank, struct Sprite* sprite);
+static void sub_80CF228(struct Sprite* sprite);
+static void sub_80CF264(struct Sprite* sprite);
+
+// taunt_finger
+// Used in Taunt.
+
+void sub_80CF1C8(struct Sprite* sprite)
+{
+ u8 bank;
+ if (gBattleAnimArgs[0] == 0)
+ bank = gAnimBankAttacker;
+ else
+ bank = gAnimBankTarget;
+
+ sub_80CEF44(bank, sprite);
+ if (GetBankSide(bank) == 0)
+ {
+ StartSpriteAnim(sprite, 0);
+ sprite->data[0] = 2;
+ }
+ else
+ {
+ StartSpriteAnim(sprite, 1);
+ sprite->data[0] = 3;
+ }
+
+ sprite->callback = sub_80CF228;
+}
+
+void sub_80CF228(struct Sprite* sprite)
+{
+ if (++sprite->data[1] > 10)
+ {
+ sprite->data[1] = 0;
+ StartSpriteAnim(sprite, sprite->data[0]);
+ StoreSpriteCallbackInData(sprite, sub_80CF264);
+ sprite->callback = sub_8078600;
+ }
+}
+
+void sub_80CF264(struct Sprite* sprite)
+{
+ if (++sprite->data[1] > 5)
+ DestroyAnimSprite(sprite);
+}
diff --git a/src/battle/anim/tendrils.c b/src/battle/anim/tendrils.c
new file mode 100755
index 000000000..9f57ffd45
--- /dev/null
+++ b/src/battle/anim/tendrils.c
@@ -0,0 +1,67 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80CB298(struct Sprite* sprite);
+static void sub_80CB2D4(struct Sprite* sprite);
+
+// tendrils
+// Used by Constrict.
+
+void sub_80CB25C(struct Sprite* sprite)
+{
+ sub_8078764(sprite, 0);
+ sprite->affineAnimPaused = 1;
+ StartSpriteAffineAnim(sprite, gBattleAnimArgs[2]);
+ sprite->data[6] = gBattleAnimArgs[2];
+ sprite->data[7] = gBattleAnimArgs[3];
+ sprite->callback = sub_80CB298;
+}
+
+void sub_80CB298(struct Sprite* sprite)
+{
+ if ((u16)gBattleAnimArgs[7] == 0xFFFF)
+ {
+ sprite->affineAnimPaused = 0;
+ GetAnimBankSpriteId(1);
+ sprite->data[0] = 0x100;
+ sprite->callback = sub_80CB2D4;
+ }
+}
+
+void sub_80CB2D4(struct Sprite* sprite)
+{
+ GetAnimBankSpriteId(1);
+ if (!sprite->data[2])
+ {
+ sprite->data[0] += 11;
+ }
+ else
+ {
+ sprite->data[0] -= 11;
+ }
+ sprite->data[1]++;
+ if (sprite->data[1] == 6)
+ {
+ sprite->data[1] = 0;
+ sprite->data[2] ^= 1;
+ }
+
+ if (sprite->affineAnimEnded)
+ {
+ sprite->data[7]--;
+ if (sprite->data[7] > 0)
+ {
+ StartSpriteAffineAnim(sprite, sprite->data[6]);
+ }
+ else
+ {
+ DestroyAnimSprite(sprite);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/battle/anim/thought.c b/src/battle/anim/thought.c
new file mode 100755
index 000000000..c3ab6f82c
--- /dev/null
+++ b/src/battle/anim/thought.c
@@ -0,0 +1,52 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80CF008(struct Sprite* sprite);
+
+// thought (thought bubble)
+// Used in Metronome and Taunt.
+
+void sub_80CEF44(u8 bank, struct Sprite* sprite)
+{
+ if (GetBankSide(bank) == 0)
+ sprite->pos1.x = sub_807A100(bank, 5) + 8;
+ else
+ sprite->pos1.x = sub_807A100(bank, 4) - 8;
+
+ sprite->pos1.y = GetBankPosition(bank, 3) - (s16)sub_807A100(bank, 0) / 4;
+}
+
+void sub_80CEF9C(struct Sprite* sprite)
+{
+ u8 a;
+ u8 bank;
+ if (gBattleAnimArgs[0] == 0)
+ bank = gAnimBankAttacker;
+ else
+ bank = gAnimBankTarget;
+
+ sub_80CEF44(bank, sprite);
+ a = (GetBankSide(bank) == 0) ? 0 : 1;
+ sprite->data[0] = gBattleAnimArgs[1];
+ sprite->data[1] = a + 2;
+ StartSpriteAnim(sprite, a);
+ StoreSpriteCallbackInData(sprite, sub_80CF008);
+ sprite->callback = sub_8078600;
+}
+
+void sub_80CF008(struct Sprite* sprite)
+{
+ if (--sprite->data[0] == 0)
+ {
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+ StartSpriteAnim(sprite, sprite->data[1]);
+ sprite->callback = sub_8078600;
+ }
+}
diff --git a/src/battle/anim/thrashing.c b/src/battle/anim/thrashing.c
new file mode 100755
index 000000000..3fde815ae
--- /dev/null
+++ b/src/battle/anim/thrashing.c
@@ -0,0 +1,111 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern struct AffineAnimFrameCmd gUnknown_083D77B0;
+
+static void sub_80D0A8C(u8 taskId);
+static void sub_80D0B3C(u8 taskId);
+
+// thrashing (the movement of the Pokemon left/right repeatedly, with up/down movements below.)
+// Used by Thrash.
+
+// left/right movements
+void sub_80D0A4C(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ u8 spriteId = GetAnimBankSpriteId(0);
+ task->data[0] = spriteId;
+ task->data[1] = 0;
+ sub_80798F4(task, spriteId, &gUnknown_083D77B0);
+ task->func = sub_80D0A8C;
+}
+
+void sub_80D0A8C(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ if (!sub_807992C(task))
+ DestroyAnimVisualTask(taskId);
+}
+
+// up/down movements
+void sub_80D0AB8(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ task->data[0] = GetAnimBankSpriteId(0);
+ task->data[1] = 0;
+ task->data[2] = 4;
+ task->data[3] = 7;
+ task->data[4] = 3;
+ task->data[5] = gSprites[task->data[0]].pos1.x;
+ task->data[6] = gSprites[task->data[0]].pos1.y;
+ task->data[7] = 0;
+ task->data[8] = 0;
+ task->data[9] = 2;
+ if (GetBankSide(gAnimBankAttacker) == 1)
+ task->data[2] *= -1;
+
+ task->func = sub_80D0B3C;
+}
+
+void sub_80D0B3C(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+ if (++task->data[7] > 2)
+ {
+ task->data[7] = 0;
+ task->data[8]++;
+ if ((task->data[8] & 1) != 0)
+ {
+ gSprites[task->data[0]].pos1.y += task->data[9];
+ }
+ else
+ {
+ gSprites[task->data[0]].pos1.y -= task->data[9];
+ }
+ }
+ switch (task->data[1])
+ {
+ case 0:
+ gSprites[task->data[0]].pos1.x += task->data[2];
+ if (--task->data[3] == 0)
+ {
+ task->data[3] = 14;
+ task->data[1] = 1;
+ }
+ break;
+ case 1:
+ gSprites[task->data[0]].pos1.x -= task->data[2];
+ if (--task->data[3] == 0)
+ {
+ task->data[3] = 7;
+ task->data[1] = 2;
+ }
+ break;
+ case 2:
+ gSprites[task->data[0]].pos1.x += task->data[2];
+ if (--task->data[3] == 0)
+ {
+ if (--task->data[4] != 0)
+ {
+ task->data[3] = 7;
+ task->data[1] = 0;
+ }
+ else
+ {
+ if ((task->data[8] & 1) != 0)
+ {
+ gSprites[task->data[0]].pos1.y -= task->data[9];
+ }
+ DestroyAnimVisualTask(taskId);
+ }
+ }
+ break;
+ }
+}
diff --git a/src/battle/anim/thunder.c b/src/battle/anim/thunder.c
new file mode 100644
index 000000000..2ed073221
--- /dev/null
+++ b/src/battle/anim/thunder.c
@@ -0,0 +1,36 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "rom_8077ABC.h"
+
+extern s16 gBattleAnimArgs[8];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+extern u16 gBattleTypeFlags;
+
+static void sub_80D6218(struct Sprite *);
+
+// thunder (positions the lightning bolts)
+// Used in Thunder, Thunder Punch, and Tri Attack.
+
+void sub_80D61C8(struct Sprite *sprite)
+{
+ if (GetBankSide(gAnimBankAttacker) != 0)
+ {
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ }
+ else
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ }
+
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->callback = sub_80D6218;
+}
+
+static void sub_80D6218(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
diff --git a/src/battle/anim/tile_in.c b/src/battle/anim/tile_in.c
new file mode 100755
index 000000000..a4a544a0c
--- /dev/null
+++ b/src/battle/anim/tile_in.c
@@ -0,0 +1,51 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+// tile_in (flips a white tile from the scene into facing the player.)
+// Used in Conversion.
+
+void sub_80CE09C(struct Sprite* sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 0) + gBattleAnimArgs[0];
+ sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 1) + gBattleAnimArgs[1];
+ if (IsContest())
+ sprite->pos1.y += 10;
+ sprite->data[0]++;
+ }
+
+ if ((u16)gBattleAnimArgs[7] == 0xFFFF)
+ DestroyAnimSprite(sprite);
+}
+
+void sub_80CE108(u8 taskId)
+{
+ if (gTasks[taskId].data[2] == 1)
+ {
+ gBattleAnimArgs[7] = 0xFFFF;
+ gTasks[taskId].data[2]++;
+ }
+ else if (gTasks[taskId].data[2] == 2)
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+ else
+ {
+ if (++gTasks[taskId].data[0] == 4)
+ {
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1]++;
+ REG_BLDALPHA = (gTasks[taskId].data[1] << 8) | (16 - gTasks[taskId].data[1]);
+ if (gTasks[taskId].data[1] == 16)
+ gTasks[taskId].data[2]++;
+ }
+ }
+}
diff --git a/src/battle/anim/tile_out.c b/src/battle/anim/tile_out.c
new file mode 100755
index 000000000..50468a440
--- /dev/null
+++ b/src/battle/anim/tile_out.c
@@ -0,0 +1,81 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+#include "battle_interface.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern u8 gNoOfAllBanks;
+extern u8 gHealthboxIDs[];
+
+static void sub_80CE1AC(struct Sprite* sprite);
+
+// tile_out (makes a tile fly inward into a center point.)
+// Used in Conversion 2.
+
+void sub_80CE17C(struct Sprite* sprite)
+{
+ sub_8078764(sprite, 0);
+ sprite->animPaused = 1;
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->callback = sub_80CE1AC;
+}
+
+void sub_80CE1AC(struct Sprite* sprite)
+{
+ if (sprite->data[0])
+ {
+ sprite->data[0]--;
+ }
+ else
+ {
+ sprite->animPaused = 0;
+ sprite->data[0] = 30;
+ sprite->data[2] = GetBankPosition(gAnimBankAttacker, 2);
+ sprite->data[4] = GetBankPosition(gAnimBankAttacker, 3);
+ sprite->callback = sub_8078B34;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+ }
+}
+
+void sub_80CE210(u8 taskId)
+{
+ if (++gTasks[taskId].data[0] == 4)
+ {
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1]++;
+ REG_BLDALPHA = gTasks[taskId].data[1] | ((16 - gTasks[taskId].data[1]) << 8);
+ if (gTasks[taskId].data[1] == 16)
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+void unref_sub_80CE260(u8 taskId)
+{
+ u8 i;
+ for (i = 0; i < gNoOfAllBanks; i++)
+ {
+ if (gBattleAnimArgs[0] == 1 && GetBankSide(i) == 0)
+ sub_8043DB0(gHealthboxIDs[i]);
+
+ if (gBattleAnimArgs[1] == 1 && GetBankSide(i) == 1)
+ sub_8043DB0(gHealthboxIDs[i]);
+ }
+
+ DestroyAnimVisualTask(taskId);
+}
+
+void unref_sub_80CE2D4(u8 taskId)
+{
+ u8 i;
+ for (i = 0; i < gNoOfAllBanks; i++)
+ {
+ sub_8043DFC(gHealthboxIDs[i]);
+ }
+
+ DestroyAnimVisualTask(taskId);
+}
diff --git a/src/battle/anim/twinkle.c b/src/battle/anim/twinkle.c
new file mode 100755
index 000000000..e26669f63
--- /dev/null
+++ b/src/battle/anim/twinkle.c
@@ -0,0 +1,42 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80CE3B0(struct Sprite* sprite);
+
+// twinkle (a tiny twinkling star appears above the Pokemon and descends toward the Pokemon.)
+// Used in Moonlight.
+
+void sub_80CE36C(struct Sprite* sprite)
+{
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2) + gBattleAnimArgs[0];
+ sprite->pos1.y = gBattleAnimArgs[1];
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ sprite->data[3] = 0;
+ sprite->data[4] = 1;
+ sprite->callback = sub_80CE3B0;
+}
+
+void sub_80CE3B0(struct Sprite* sprite)
+{
+ if (++sprite->data[1] > 1)
+ {
+ sprite->data[1] = 0;
+ if (sprite->data[2] <= 0x77)
+ {
+ sprite->pos1.y++;
+ sprite->data[2]++;
+ }
+ }
+
+ if (sprite->data[0])
+ DestroyAnimSprite(sprite);
+}
diff --git a/src/battle/anim/unused_1.c b/src/battle/anim/unused_1.c
new file mode 100755
index 000000000..d7e5fbfe4
--- /dev/null
+++ b/src/battle/anim/unused_1.c
@@ -0,0 +1,25 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+// unused effect file.
+// Seems to be a beta effect for Beat Up, possibly.
+
+void sub_80CC8C8(struct Sprite* sprite)
+{
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->data[3] = gBattleAnimArgs[4];
+ sprite->data[5] = gBattleAnimArgs[5];
+ StartSpriteAffineAnim(sprite, gBattleAnimArgs[6]);
+ StoreSpriteCallbackInData(sprite, move_anim_8074EE0);
+ sprite->callback = sub_8078504;
+}
diff --git a/src/battle/anim/unused_2.c b/src/battle/anim/unused_2.c
new file mode 100755
index 000000000..122f39e02
--- /dev/null
+++ b/src/battle/anim/unused_2.c
@@ -0,0 +1,80 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80CCCB4(struct Sprite* sprite);
+
+// unused_2 (unknown effect with music notes.)
+// possibly another unused effect. Unknown usage.
+
+void unref_sub_80CCB6C(struct Sprite* sprite)
+{
+ if (sprite->data[2] > 1)
+ {
+ if (sprite->data[3] & 1)
+ {
+ sprite->invisible = 0;
+ gSprites[sprite->data[0]].invisible = 0;
+ gSprites[sprite->data[1]].invisible = 0;
+ }
+ else
+ {
+ sprite->invisible = 1;
+ gSprites[sprite->data[0]].invisible = 1;
+ gSprites[sprite->data[1]].invisible = 1;
+ }
+
+ sprite->data[2] = 0;
+ sprite->data[3]++;
+ }
+ else
+ {
+ sprite->data[2]++;
+ }
+
+ if (sprite->data[3] == 10)
+ {
+ DestroySprite(&gSprites[sprite->data[0]]);
+ DestroySprite(&gSprites[sprite->data[1]]);
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void sub_80CCC50(struct Sprite* sprite)
+{
+ sprite->data[0] = gBattleAnimArgs[2];
+ if (GetBankSide(gAnimBankAttacker) != 0)
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ else
+ sprite->pos1.x += gBattleAnimArgs[0];
+
+ StartSpriteAnim(sprite, gBattleAnimArgs[5]);
+ sprite->data[1] = -gBattleAnimArgs[3];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[3] = gBattleAnimArgs[4];
+ sprite->callback = sub_80CCCB4;
+ sub_80CCCB4(sprite);
+}
+
+void sub_80CCCB4(struct Sprite* sprite)
+{
+ sprite->pos2.x = Cos(sprite->data[0], 100);
+ sprite->pos2.y = Sin(sprite->data[0], 20);
+ if (sprite->data[0] <= 0x7F)
+ sprite->subpriority = 0;
+ else
+ sprite->subpriority = 14;
+
+ sprite->data[0] = (sprite->data[0] + sprite->data[1]) & 0xFF;
+ sprite->data[5] += 0x82;
+ sprite->pos2.y += sprite->data[5] >> 8;
+ sprite->data[2]++;
+ if (sprite->data[2] == sprite->data[3])
+ DestroyAnimSprite(sprite);
+}
diff --git a/src/battle/anim/unused_3.c b/src/battle/anim/unused_3.c
new file mode 100755
index 000000000..6dbcbfefe
--- /dev/null
+++ b/src/battle/anim/unused_3.c
@@ -0,0 +1,45 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80CD2D4(struct Sprite* sprite);
+
+// unused_3 (seems to be some sort of popping effect with a growing diamond shape)
+// yet another unused effect...
+
+void sub_80CD274(struct Sprite* sprite)
+{
+ sub_8078650(sprite);
+ if (GetBankSide(gAnimBankAttacker) == 0)
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ }
+ else
+ {
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ StartSpriteAnim(sprite, 1);
+ }
+
+ sprite->callback = sub_80CD2D4;
+}
+
+void sub_80CD2D4(struct Sprite* sprite)
+{
+ if (++sprite->data[0] > 30)
+ {
+ sprite->pos2.y = (30 - sprite->data[0]) / 3;
+ sprite->pos2.x = Sin(sprite->data[1] * 4, 3);
+ sprite->data[1]++;
+ }
+
+ if (sprite->animEnded)
+ DestroyAnimSprite(sprite);
+}
diff --git a/src/battle/anim/unused_4.c b/src/battle/anim/unused_4.c
new file mode 100755
index 000000000..bda476a0a
--- /dev/null
+++ b/src/battle/anim/unused_4.c
@@ -0,0 +1,58 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern u8 gObjectBankIDs[];
+
+static void sub_80CD9D4(struct Sprite* sprite);
+
+// unused_4
+// Unknown usage.
+
+void sub_80CD9C4(struct Sprite* sprite)
+{
+ sprite->data[0] = 0;
+ sprite->callback = sub_80CD9D4;
+}
+
+void sub_80CD9D4(struct Sprite* sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->data[1] = 0;
+ sprite->data[2] = gObjectBankIDs[gAnimBankAttacker];
+ sprite->data[3] = GetBankSide(gAnimBankAttacker);
+ sprite->data[4] = (sprite->data[3] != 0) ? 0x200 : -0x200;
+ sprite->data[5] = 0;
+ sub_8078E70(sprite->data[2], 0);
+ sprite->data[0]++;
+ case 1:
+ sprite->data[5] += sprite->data[4];
+ obj_id_set_rotscale(sprite->data[2], 0x100, 0x100, sprite->data[5]);
+ sub_8078F9C(sprite->data[2]);
+ if (++sprite->data[1] > 3)
+ {
+ sprite->data[1] = 0;
+ sprite->data[4] *= -1;
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ sprite->data[5] += sprite->data[4];
+ obj_id_set_rotscale(sprite->data[2], 0x100, 0x100, sprite->data[5]);
+ sub_8078F9C(sprite->data[2]);
+ if (++sprite->data[1] > 3)
+ {
+ sub_8078F40(sprite->data[2]);
+ DestroyAnimSprite(sprite);
+ }
+ break;
+ }
+}
diff --git a/src/battle/anim/unused_5.c b/src/battle/anim/unused_5.c
new file mode 100755
index 000000000..421cdd6bf
--- /dev/null
+++ b/src/battle/anim/unused_5.c
@@ -0,0 +1,25 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+// unused_5
+
+void sub_80CF280(struct Sprite* sprite)
+{
+ sub_8078650(sprite);
+ sub_807867C(sprite, gBattleAnimArgs[0]);
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[1] = gBattleAnimArgs[2];
+ sprite->data[2] = gBattleAnimArgs[4];
+ sprite->data[3] = gBattleAnimArgs[5];
+ sprite->data[4] = gBattleAnimArgs[3];
+ StoreSpriteCallbackInData(sprite, move_anim_8074EE0);
+ sprite->callback = sub_8078278;
+ sub_8078278(sprite);
+}
diff --git a/src/battle/anim/unused_6.c b/src/battle/anim/unused_6.c
new file mode 100755
index 000000000..37e2031b0
--- /dev/null
+++ b/src/battle/anim/unused_6.c
@@ -0,0 +1,49 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern void sub_80CEF44(u8 bank, struct Sprite* sprite);
+static void sub_80CF310(struct Sprite* sprite);
+
+// unused_6
+
+void sub_80CF2D0(struct Sprite* sprite)
+{
+ u8 bank;
+ if (gBattleAnimArgs[0] == 0)
+ bank = gAnimBankAttacker;
+ else
+ bank = gAnimBankTarget;
+
+ sub_80CEF44(bank, sprite);
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ sprite->callback = sub_80CF310;
+}
+
+void sub_80CF310(struct Sprite* sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->pos2.y -= 3;
+ if (++sprite->data[1] == 6)
+ sprite->data[0]++;
+ break;
+ case 1:
+ sprite->pos2.y += 3;
+ if (--sprite->data[1] == 0)
+ sprite->data[0]++;
+ break;
+ case 2:
+ if (++sprite->data[1] == 0x40)
+ DestroyAnimSprite(sprite);
+ break;
+ }
+}
diff --git a/src/battle/anim/unused_7.c b/src/battle/anim/unused_7.c
new file mode 100755
index 000000000..2be6e7633
--- /dev/null
+++ b/src/battle/anim/unused_7.c
@@ -0,0 +1,51 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern u8 gObjectBankIDs[];
+
+// unused_7
+
+void sub_80CF374(struct Sprite* sprite)
+{
+ s16 temp;
+ gSprites[sprite->data[2]].pos2.x += sprite->data[1];
+ temp = sprite->data[1];
+ sprite->data[1] = -temp;
+ if (sprite->data[0] == 0)
+ {
+ gSprites[sprite->data[2]].pos2.x = 0;
+ move_anim_8074EE0(sprite);
+ }
+
+ sprite->data[0]--;
+}
+
+void sub_80CF3C4(struct Sprite* sprite)
+{
+ u8 a;
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2);
+ sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3);
+ a = gObjectBankIDs[gAnimBankTarget];
+ if (GetBankSide(gAnimBankAttacker) != 0)
+ {
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ }
+ else
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ }
+
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->data[2] = a;
+ sprite->callback = sub_80CF374;
+ sprite->invisible = 1;
+}
diff --git a/src/battle/anim/unused_8.c b/src/battle/anim/unused_8.c
new file mode 100755
index 000000000..03772f951
--- /dev/null
+++ b/src/battle/anim/unused_8.c
@@ -0,0 +1,41 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80CF490(struct Sprite* sprite);
+static void sub_80CF4B8(struct Sprite* sprite);
+
+// unused_8
+
+void sub_80CF458(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 1);
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->data[5] = gBattleAnimArgs[4];
+ sprite->callback = sub_80782D8;
+ StoreSpriteCallbackInData(sprite, sub_80CF490);
+}
+
+void sub_80CF490(struct Sprite* sprite)
+{
+ sprite->data[0] = sprite->data[1];
+ sprite->data[2] = sprite->pos1.x;
+ sprite->data[4] = sprite->pos1.y + 15;
+ sprite->callback = sub_8078B34;
+ StoreSpriteCallbackInData(sprite, sub_80CF4B8);
+}
+
+void sub_80CF4B8(struct Sprite* sprite)
+{
+ if (sprite->data[5] == 0)
+ DestroyAnimSprite(sprite);
+ else
+ sprite->data[5]--;
+}
diff --git a/src/battle/anim/unused_9.c b/src/battle/anim/unused_9.c
new file mode 100755
index 000000000..cf3ccb0d4
--- /dev/null
+++ b/src/battle/anim/unused_9.c
@@ -0,0 +1,113 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern struct SpriteTemplate gSpriteTemplate_83D75AC;
+
+static void sub_80CFE2C(struct Sprite* sprite);
+
+// unused_9? (Most likely an unused effect.)
+// I cannot find any reference to this sprite template used to call this.
+
+void sub_80CFDFC(struct Sprite* sprite)
+{
+ sub_80787B0(sprite, 0);
+ sprite->data[0] = 0x100 + (IndexOfSpritePaletteTag(gSpriteTemplate_83D75AC.paletteTag) << 4);
+ sprite->callback = sub_80CFE2C;
+}
+
+#ifdef NONMATCHING
+void sub_80CFE2C(struct Sprite* sprite)
+{
+ u16 r7;
+ u16* r1;
+ u16* r2;
+ int i;
+ if (++sprite->data[1] == 2)
+ {
+ sprite->data[1] = 0;
+ r7 = gPlttBufferFaded[sprite->data[0] + 8];
+ r2 = &gPlttBufferFaded[0x10];
+ r1 = &gPlttBufferFaded[sprite->data[0] + 9];
+ for (i = 7; i >= 0; i--)
+ {
+ *r2 = *r1;
+ r1++;
+ r2++;
+ }
+
+ gPlttBufferFaded[sprite->data[0] + 15] = r7;
+ if (++sprite->data[2] == 0x18)
+ DestroyAnimSprite(sprite);
+ }
+}
+#else
+__attribute__((naked))
+void sub_80CFE2C(struct Sprite* sprite)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ adds r4, r0, 0\n\
+ ldrh r0, [r4, 0x30]\n\
+ adds r0, 0x1\n\
+ strh r0, [r4, 0x30]\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0x2\n\
+ bne _080CFE90\n\
+ movs r0, 0\n\
+ strh r0, [r4, 0x30]\n\
+ ldrh r5, [r4, 0x2E]\n\
+ ldr r1, _080CFE98 @ =gPlttBufferFaded\n\
+ adds r0, r5, 0\n\
+ adds r0, 0x8\n\
+ lsls r0, 1\n\
+ adds r0, r1\n\
+ ldrh r7, [r0]\n\
+ adds r6, r1, 0 @puts gPlttBufferFaded in r6\n\
+ adds r1, r5, 0\n\
+ adds r1, 0x9\n\
+ lsls r0, r5, 1\n\
+ adds r0, r6 \n\
+ adds r2, r0, 0\n\
+ adds r2, 0x10\n\
+ movs r3, 0x7\n\
+ lsls r1, 1\n\
+ adds r1, r6 \n\
+_080CFE64:\n\
+ ldrh r0, [r1]\n\
+ strh r0, [r2]\n\
+ adds r1, 0x2\n\
+ adds r2, 0x2\n\
+ subs r3, 0x1\n\
+ cmp r3, 0\n\
+ bge _080CFE64\n\
+ adds r0, r5, 0\n\
+ adds r0, 0xF\n\
+ lsls r0, 1\n\
+ adds r0, r6\n\
+ strh r7, [r0]\n\
+ ldrh r0, [r4, 0x32]\n\
+ adds r0, 0x1\n\
+ strh r0, [r4, 0x32]\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0x18\n\
+ bne _080CFE90\n\
+ adds r0, r4, 0\n\
+ bl DestroyAnimSprite\n\
+_080CFE90:\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080CFE98: .4byte gPlttBufferFaded\n\
+.syntax divided\n");
+}
+#endif
diff --git a/src/battle/anim/uproar.c b/src/battle/anim/uproar.c
new file mode 100644
index 000000000..03cc65bc0
--- /dev/null
+++ b/src/battle/anim/uproar.c
@@ -0,0 +1,25 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "rom_8077ABC.h"
+#include "sprite.h"
+#include "task.h"
+
+extern s16 gBattleAnimArgs[8];
+
+extern const union AffineAnimCmd gUnknown_083D7CA8[];
+
+void sub_80D2D3C(u8);
+
+void sub_80D2CF8(u8 taskId)
+{
+ u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
+
+ sub_80798F4(&gTasks[taskId], spriteId, gUnknown_083D7CA8);
+ gTasks[taskId].func = sub_80D2D3C;
+}
+
+void sub_80D2D3C(u8 taskId)
+{
+ if (!sub_807992C(&gTasks[taskId]))
+ DestroyAnimVisualTask(taskId);
+}
diff --git a/src/battle/anim/water.c b/src/battle/anim/water.c
new file mode 100644
index 000000000..4068cbe78
--- /dev/null
+++ b/src/battle/anim/water.c
@@ -0,0 +1,371 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "util.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+static void sub_80D3874(struct Sprite *);
+
+void sub_80D37FC(struct Sprite *sprite)
+{
+ sub_8078764(sprite, 1);
+
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2];
+ sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[4];
+
+ sprite->callback = sub_8078B34;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+}
+
+void sub_80D3838(struct Sprite *sprite)
+{
+ if (gBattleAnimArgs[3] != 0)
+ {
+ sub_8078764(sprite, 1);
+ }
+ else
+ {
+ sub_80787B0(sprite, 1);
+ }
+
+ sprite->data[7] = gBattleAnimArgs[2];
+ sprite->callback = sub_80D3874;
+}
+
+static void sub_80D3874(struct Sprite *sprite)
+{
+ sprite->data[0] = (sprite->data[0] + 11) & 0xFF;
+ sprite->pos2.x = Sin(sprite->data[0], 4);
+
+ sprite->data[1] += 48;
+ sprite->pos2.y = -(sprite->data[1] >> 8);
+
+ if (--sprite->data[7] == -1)
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
+
+__attribute__((naked))
+void sub_80D38BC(u8 taskId)
+{
+ asm(".syntax unified\n\
+ .equ REG_BLDCNT, 0x4000050\n\
+ .equ REG_BG1CNT, 0x400000A\n\
+ .equ REG_BG1HOFS, 0x4000014\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, 24\n\
+ lsrs r0, 24\n\
+ mov r10, r0\n\
+ ldr r1, _080D398C @ =REG_BLDCNT\n\
+ ldr r2, _080D3990 @ =0x00003f42\n\
+ adds r0, r2, 0\n\
+ strh r0, [r1]\n\
+ adds r1, 0x2\n\
+ movs r3, 0x80\n\
+ lsls r3, 5\n\
+ adds r0, r3, 0\n\
+ strh r0, [r1]\n\
+ ldr r2, _080D3994 @ =REG_BG1CNT\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0x4\n\
+ negs r0, r0\n\
+ ands r0, r1\n\
+ movs r1, 0x1\n\
+ orrs r0, r1\n\
+ strb r0, [r2]\n\
+ ldrb r1, [r2, 0x1]\n\
+ movs r0, 0x3F\n\
+ ands r0, r1\n\
+ movs r1, 0x40\n\
+ orrs r0, r1\n\
+ strb r0, [r2, 0x1]\n\
+ mov r0, sp\n\
+ bl sub_8078914\n\
+ ldr r2, [sp]\n\
+ movs r3, 0x80\n\
+ lsls r3, 6\n\
+ add r6, sp, 0x10\n\
+ add r0, sp, 0xC\n\
+ mov r12, r0\n\
+ movs r5, 0\n\
+ ldr r1, _080D3998 @ =0x040000d4\n\
+ movs r4, 0x80\n\
+ lsls r4, 5\n\
+ mov r8, r6\n\
+ ldr r7, _080D399C @ =0x85000400\n\
+ movs r0, 0x85\n\
+ lsls r0, 24\n\
+ mov r9, r0\n\
+_080D3920:\n\
+ str r5, [sp, 0x10]\n\
+ mov r0, r8\n\
+ str r0, [r1]\n\
+ str r2, [r1, 0x4]\n\
+ str r7, [r1, 0x8]\n\
+ ldr r0, [r1, 0x8]\n\
+ adds r2, r4\n\
+ subs r3, r4\n\
+ cmp r3, r4\n\
+ bhi _080D3920\n\
+ str r5, [sp, 0x10]\n\
+ str r6, [r1]\n\
+ str r2, [r1, 0x4]\n\
+ lsrs r0, r3, 2\n\
+ mov r2, r9\n\
+ orrs r0, r2\n\
+ str r0, [r1, 0x8]\n\
+ ldr r0, [r1, 0x8]\n\
+ movs r0, 0\n\
+ mov r3, r12\n\
+ strb r0, [r3]\n\
+ strb r0, [r3]\n\
+ ldr r1, [sp, 0x4]\n\
+ movs r0, 0\n\
+ str r0, [sp, 0x10]\n\
+ ldr r0, _080D3998 @ =0x040000d4\n\
+ str r6, [r0]\n\
+ str r1, [r0, 0x4]\n\
+ ldr r1, _080D399C @ =0x85000400\n\
+ str r1, [r0, 0x8]\n\
+ ldr r0, [r0, 0x8]\n\
+ bl IsContest\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _080D39B8\n\
+ ldr r2, _080D3994 @ =REG_BG1CNT\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0xD\n\
+ negs r0, r0\n\
+ ands r0, r1\n\
+ movs r1, 0x4\n\
+ orrs r0, r1\n\
+ strb r0, [r2]\n\
+ ldr r0, _080D39A0 @ =gAnimBankAttacker\n\
+ ldrb r0, [r0]\n\
+ bl GetBankSide\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0x1\n\
+ bne _080D39A8\n\
+ ldr r0, _080D39A4 @ =gUnknown_08E70968\n\
+ b _080D39AA\n\
+ .align 2, 0\n\
+_080D398C: .4byte REG_BLDCNT\n\
+_080D3990: .4byte 0x00003f42\n\
+_080D3994: .4byte REG_BG1CNT\n\
+_080D3998: .4byte 0x040000d4\n\
+_080D399C: .4byte 0x85000400\n\
+_080D39A0: .4byte gAnimBankAttacker\n\
+_080D39A4: .4byte gUnknown_08E70968\n\
+_080D39A8:\n\
+ ldr r0, _080D39B4 @ =gUnknown_08E70C38\n\
+_080D39AA:\n\
+ ldr r1, [sp, 0x4]\n\
+ bl LZDecompressVram\n\
+ b _080D39CE\n\
+ .align 2, 0\n\
+_080D39B4: .4byte gUnknown_08E70C38\n\
+_080D39B8:\n\
+ ldr r0, _080D39F0 @ =gUnknown_08E70F0C\n\
+ ldr r1, [sp, 0x4]\n\
+ bl LZDecompressVram\n\
+ mov r0, sp\n\
+ ldrb r0, [r0, 0x8]\n\
+ ldr r1, [sp, 0x4]\n\
+ movs r2, 0\n\
+ movs r3, 0x1\n\
+ bl sub_80763FC\n\
+_080D39CE:\n\
+ ldr r0, _080D39F4 @ =gBattleAnimBackgroundImage_Surf\n\
+ ldr r1, [sp]\n\
+ bl LZDecompressVram\n\
+ ldr r0, _080D39F8 @ =gBattleAnimArgs\n\
+ movs r1, 0\n\
+ ldrsh r0, [r0, r1]\n\
+ cmp r0, 0\n\
+ bne _080D3A00\n\
+ ldr r0, _080D39FC @ =gBattleAnimBackgroundPalette_Surf\n\
+ mov r1, sp\n\
+ ldrb r1, [r1, 0x8]\n\
+ lsls r1, 4\n\
+ movs r2, 0x20\n\
+ bl LoadCompressedPalette\n\
+ b _080D3A0E\n\
+ .align 2, 0\n\
+_080D39F0: .4byte gUnknown_08E70F0C\n\
+_080D39F4: .4byte gBattleAnimBackgroundImage_Surf\n\
+_080D39F8: .4byte gBattleAnimArgs\n\
+_080D39FC: .4byte gBattleAnimBackgroundPalette_Surf\n\
+_080D3A00:\n\
+ ldr r0, _080D3A78 @ =gBattleAnimBackgroundImageMuddyWater_Pal\n\
+ mov r1, sp\n\
+ ldrb r1, [r1, 0x8]\n\
+ lsls r1, 4\n\
+ movs r2, 0x20\n\
+ bl LoadCompressedPalette\n\
+_080D3A0E:\n\
+ ldr r0, _080D3A7C @ =sub_80D3D68\n\
+ ldr r4, _080D3A80 @ =gTasks\n\
+ mov r2, r10\n\
+ lsls r5, r2, 2\n\
+ adds r1, r5, r2\n\
+ lsls r1, 3\n\
+ adds r6, r1, r4\n\
+ ldrb r1, [r6, 0x7]\n\
+ adds r1, 0x1\n\
+ lsls r1, 24\n\
+ lsrs r1, 24\n\
+ bl CreateTask\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r8, r0\n\
+ movs r3, 0\n\
+ mov r9, r3\n\
+ mov r0, r8\n\
+ strh r0, [r6, 0x26]\n\
+ mov r1, r8\n\
+ lsls r0, r1, 2\n\
+ add r0, r8\n\
+ lsls r0, 3\n\
+ adds r7, r0, r4\n\
+ mov r2, r9\n\
+ strh r2, [r7, 0x8]\n\
+ movs r0, 0x80\n\
+ lsls r0, 5\n\
+ strh r0, [r7, 0xA]\n\
+ strh r0, [r7, 0xC]\n\
+ bl IsContest\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ cmp r4, 0\n\
+ beq _080D3A94\n\
+ ldr r3, _080D3A84 @ =0x0000ffb0\n\
+ adds r0, r3, 0\n\
+ ldr r1, _080D3A88 @ =gBattle_BG1_X\n\
+ strh r0, [r1]\n\
+ ldr r2, _080D3A8C @ =0x0000ffd0\n\
+ adds r0, r2, 0\n\
+ ldr r3, _080D3A90 @ =gBattle_BG1_Y\n\
+ strh r0, [r3]\n\
+ movs r0, 0x2\n\
+ strh r0, [r6, 0x8]\n\
+ movs r0, 0x1\n\
+ strh r0, [r6, 0xA]\n\
+ mov r0, r9\n\
+ strh r0, [r7, 0xE]\n\
+ b _080D3AEE\n\
+ .align 2, 0\n\
+_080D3A78: .4byte gBattleAnimBackgroundImageMuddyWater_Pal\n\
+_080D3A7C: .4byte sub_80D3D68\n\
+_080D3A80: .4byte gTasks\n\
+_080D3A84: .4byte 0x0000ffb0\n\
+_080D3A88: .4byte gBattle_BG1_X\n\
+_080D3A8C: .4byte 0x0000ffd0\n\
+_080D3A90: .4byte gBattle_BG1_Y\n\
+_080D3A94:\n\
+ ldr r0, _080D3AC4 @ =gAnimBankAttacker\n\
+ ldrb r0, [r0]\n\
+ bl GetBankSide\n\
+ lsls r0, 24\n\
+ lsrs r1, r0, 24\n\
+ cmp r1, 0x1\n\
+ bne _080D3AD8\n\
+ ldr r2, _080D3AC8 @ =0x0000ff20\n\
+ adds r0, r2, 0\n\
+ ldr r3, _080D3ACC @ =gBattle_BG1_X\n\
+ strh r0, [r3]\n\
+ movs r2, 0x80\n\
+ lsls r2, 1\n\
+ adds r0, r2, 0\n\
+ ldr r3, _080D3AD0 @ =gBattle_BG1_Y\n\
+ strh r0, [r3]\n\
+ movs r0, 0x2\n\
+ strh r0, [r6, 0x8]\n\
+ ldr r0, _080D3AD4 @ =0x0000ffff\n\
+ strh r0, [r6, 0xA]\n\
+ strh r1, [r7, 0xE]\n\
+ b _080D3AEE\n\
+ .align 2, 0\n\
+_080D3AC4: .4byte gAnimBankAttacker\n\
+_080D3AC8: .4byte 0x0000ff20\n\
+_080D3ACC: .4byte gBattle_BG1_X\n\
+_080D3AD0: .4byte gBattle_BG1_Y\n\
+_080D3AD4: .4byte 0x0000ffff\n\
+_080D3AD8:\n\
+ ldr r0, _080D3B1C @ =gBattle_BG1_X\n\
+ strh r4, [r0]\n\
+ ldr r1, _080D3B20 @ =0x0000ffd0\n\
+ adds r0, r1, 0\n\
+ ldr r2, _080D3B24 @ =gBattle_BG1_Y\n\
+ strh r0, [r2]\n\
+ ldr r0, _080D3B28 @ =0x0000fffe\n\
+ strh r0, [r6, 0x8]\n\
+ movs r0, 0x1\n\
+ strh r0, [r6, 0xA]\n\
+ strh r4, [r7, 0xE]\n\
+_080D3AEE:\n\
+ ldr r1, _080D3B2C @ =REG_BG1HOFS\n\
+ ldr r3, _080D3B1C @ =gBattle_BG1_X\n\
+ ldrh r0, [r3]\n\
+ strh r0, [r1]\n\
+ adds r1, 0x2\n\
+ ldr r2, _080D3B24 @ =gBattle_BG1_Y\n\
+ ldrh r0, [r2]\n\
+ strh r0, [r1]\n\
+ ldr r1, _080D3B30 @ =gTasks\n\
+ mov r3, r8\n\
+ lsls r0, r3, 2\n\
+ add r0, r8\n\
+ lsls r0, 3\n\
+ adds r2, r0, r1\n\
+ movs r3, 0xE\n\
+ ldrsh r0, [r2, r3]\n\
+ cmp r0, 0\n\
+ bne _080D3B34\n\
+ movs r0, 0x30\n\
+ strh r0, [r2, 0x10]\n\
+ movs r0, 0x70\n\
+ b _080D3B38\n\
+ .align 2, 0\n\
+_080D3B1C: .4byte gBattle_BG1_X\n\
+_080D3B20: .4byte 0x0000ffd0\n\
+_080D3B24: .4byte gBattle_BG1_Y\n\
+_080D3B28: .4byte 0x0000fffe\n\
+_080D3B2C: .4byte REG_BG1HOFS\n\
+_080D3B30: .4byte gTasks\n\
+_080D3B34:\n\
+ movs r0, 0\n\
+ strh r0, [r2, 0x10]\n\
+_080D3B38:\n\
+ strh r0, [r2, 0x12]\n\
+ mov r2, r10\n\
+ adds r0, r5, r2\n\
+ lsls r0, 3\n\
+ adds r0, r1\n\
+ movs r1, 0x1\n\
+ strh r1, [r0, 0x14]\n\
+ ldr r1, _080D3B5C @ =sub_80D3B60\n\
+ str r1, [r0]\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\
+_080D3B5C: .4byte sub_80D3B60\n\
+ .syntax divided\n");
+}
diff --git a/src/battle/anim/wave_finger.c b/src/battle/anim/wave_finger.c
new file mode 100755
index 000000000..2cf68c34c
--- /dev/null
+++ b/src/battle/anim/wave_finger.c
@@ -0,0 +1,39 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern void sub_80CEF44(u8 bank, struct Sprite* sprite);
+void sub_80CF088(struct Sprite* sprite);
+
+// wave_finger
+// Used by Metronome.
+
+void sub_80CF040(struct Sprite* sprite)
+{
+ u8 bank;
+ if (gBattleAnimArgs[0] == 0)
+ bank = gAnimBankAttacker;
+ else
+ bank = gAnimBankTarget;
+
+ sub_80CEF44(bank, sprite);
+ sprite->data[0] = 0;
+ StoreSpriteCallbackInData(sprite, sub_80CF088);
+ sprite->callback = sub_80785E4;
+}
+
+void sub_80CF088(struct Sprite* sprite)
+{
+ if (++sprite->data[0] > 16)
+ {
+ StartSpriteAffineAnim(sprite, 1);
+ StoreSpriteCallbackInData(sprite, move_anim_8074EE0);
+ sprite->callback = sub_80785E4;
+ }
+}
diff --git a/src/battle/anim/whip.c b/src/battle/anim/whip.c
new file mode 100755
index 000000000..cb3ce327e
--- /dev/null
+++ b/src/battle/anim/whip.c
@@ -0,0 +1,46 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+// whip (does a hitting animation that uses a rotating sprite to invoke the sprite getting hit.)
+// Used by Slam and Vine Whip.
+
+void sub_80CC810(struct Sprite* sprite)
+{
+ if (sprite->animEnded)
+ DestroyAnimSprite(sprite);
+}
+
+// unused, beta effect for diagonal sprite movement?
+void sub_80CC82C(struct Sprite* sprite)
+{
+ if (GetBankSide(gAnimBankAttacker) != 0)
+ {
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ }
+ else
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ }
+
+ sprite->callback = sub_8078600;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+}
+
+void sub_80CC884(struct Sprite* sprite)
+{
+ if (GetBankSide(gAnimBankAttacker) == 0)
+ StartSpriteAnim(sprite, 1);
+
+ sprite->callback = sub_80CC810;
+ sub_807867C(sprite, gBattleAnimArgs[0]);
+ sprite->pos1.y += gBattleAnimArgs[1];
+}
diff --git a/src/battle/anim/wisp_orb.c b/src/battle/anim/wisp_orb.c
new file mode 100644
index 000000000..0cbe6eed7
--- /dev/null
+++ b/src/battle/anim/wisp_orb.c
@@ -0,0 +1,105 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "constants/songs.h"
+#include "rom_8077ABC.h"
+#include "sound.h"
+#include "trig.h"
+
+extern s16 gBattleAnimArgs[8];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+extern u16 gBattleTypeFlags;
+extern u8 gUnknown_0202F7D2;
+
+static void sub_80D5C5C(struct Sprite *);
+
+// wisp_orb (animates the wisp orbs)
+// Used in Will-O-Wisp
+
+void sub_80D5B0C(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sub_80787B0(sprite, 0);
+ StartSpriteAnim(sprite, gBattleAnimArgs[2]);
+ sprite->data[7] = gBattleAnimArgs[2];
+
+ if (GetBankSide(gAnimBankAttacker) != 0)
+ {
+ sprite->data[4] = 4;
+ }
+ else
+ {
+ sprite->data[4] = -4;
+ }
+
+ sprite->oam.priority = sub_8079ED4(gAnimBankTarget);
+ sprite->data[0]++;
+ break;
+ case 1:
+ sprite->data[1] += 192;
+ if (GetBankSide(gAnimBankAttacker) != 0)
+ {
+ sprite->pos2.y = -(sprite->data[1] >> 8);
+ }
+ else
+ {
+ sprite->pos2.y = sprite->data[1] >> 8;
+ }
+
+ sprite->pos2.x = Sin(sprite->data[2], sprite->data[4]);
+ sprite->data[2] = (sprite->data[2] + 4) & 0xFF;
+
+ if (++sprite->data[3] == 1)
+ {
+ sprite->data[3] = 0;
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ sprite->pos2.x = Sin(sprite->data[2], sprite->data[4]);
+ sprite->data[2] = (sprite->data[2] + 4) & 0xFF;
+
+ if (++sprite->data[3] == 31)
+ {
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+
+ sprite->data[0] = 256;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = GetBankPosition(gAnimBankTarget, 2);
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = GetBankPosition(gAnimBankTarget, 3);
+
+ sub_8078BD4(sprite);
+ sprite->callback = sub_80D5C5C;
+ }
+ break;
+ }
+}
+
+static void sub_80D5C5C(struct Sprite *sprite)
+{
+ s16 initialData5;
+ s16 newData5;
+
+ if (!sub_8078B5C(sprite))
+ {
+ sprite->pos2.x += Sin(sprite->data[5], 16);
+ initialData5 = sprite->data[5];
+ sprite->data[5] = (sprite->data[5] + 4) & 0xFF;
+ newData5 = sprite->data[5];
+
+ if ((initialData5 == 0 || initialData5 > 196) && newData5 > 0 && sprite->data[7] == 0)
+ {
+ PlaySE12WithPanning(SE_W172, gUnknown_0202F7D2);
+ }
+ }
+ else
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
diff --git a/src/battle/anim/withdraw.c b/src/battle/anim/withdraw.c
new file mode 100755
index 000000000..e67248b9f
--- /dev/null
+++ b/src/battle/anim/withdraw.c
@@ -0,0 +1,69 @@
+#include "global.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+#include "battle_anim.h"
+#include "sound.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+
+extern u8 gObjectBankIDs[];
+
+static void sub_80CF514(u8 taskId);
+
+// withdraw (where a Pokemon leans inward to mimic the effect of withdrawing into a shell.)
+// Used in Withdraw.
+
+void sub_80CF4D8(u8 taskId)
+{
+ sub_8078E70(gObjectBankIDs[gAnimBankAttacker], 0);
+ gTasks[taskId].func = sub_80CF514;
+}
+
+void sub_80CF514(u8 taskId)
+{
+ u8 a = gObjectBankIDs[gAnimBankAttacker];
+ s16 b;
+ if (GetBankSide(gAnimBankAttacker) == 0)
+ {
+ b = -gTasks[taskId].data[0];
+ }
+ else
+ {
+ b = gTasks[taskId].data[0];
+ }
+
+ obj_id_set_rotscale(a, 0x100, 0x100, b);
+ if (gTasks[taskId].data[1] == 0)
+ {
+ gTasks[taskId].data[0] += 0xB0;
+ gSprites[a].pos2.y++;
+ }
+ else if (gTasks[taskId].data[1] == 1)
+ {
+ if (++gTasks[taskId].data[3] == 0x1E)
+ gTasks[taskId].data[1] = 2;
+
+ return;
+ }
+ else
+ {
+ gTasks[taskId].data[0] -= 0xB0;
+ gSprites[a].pos2.y--;
+ }
+
+ sub_8078F9C(a);
+ if (gTasks[taskId].data[0] == 0xF20 || gTasks[taskId].data[0] == 0)
+ {
+ if (gTasks[taskId].data[1] == 2)
+ {
+ sub_8078F40(a);
+ DestroyAnimVisualTask(taskId);
+ }
+ else
+ {
+ gTasks[taskId].data[1]++;
+ }
+ }
+}
diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c
new file mode 100644
index 000000000..ae84e5585
--- /dev/null
+++ b/src/battle/battle_2.c
@@ -0,0 +1,5390 @@
+#include "global.h"
+#include "constants/abilities.h"
+#include "battle.h"
+#include "battle_ai.h"
+#include "battle_interface.h"
+#include "battle_message.h"
+#include "battle_setup.h"
+#include "battle_util.h"
+#include "data2.h"
+#include "event_data.h"
+#include "evolution_scene.h"
+#include "item.h"
+#include "link.h"
+#include "main.h"
+#include "m4a.h"
+#include "name_string_util.h"
+#include "palette.h"
+#include "party_menu.h"
+#include "pokeball.h"
+#include "pokedex.h"
+#include "pokemon.h"
+#include "random.h"
+#include "roamer.h"
+#include "rom3.h"
+#include "rom_8077ABC.h"
+#include "rom_8094928.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "constants/species.h"
+#include "sprite.h"
+#include "string_util.h"
+#include "task.h"
+#include "text.h"
+#include "trainer.h"
+#include "trig.h"
+#include "tv.h"
+#include "unknown_task.h"
+#include "util.h"
+#include "constants/battle_move_effects.h"
+#include "constants/items.h"
+#include "constants/hold_effects.h"
+#include "constants/moves.h"
+#include "ewram.h"
+
+struct UnknownStruct7
+{
+ u8 unk0;
+ u8 unk1;
+ u8 unk2;
+ u8 unk3;
+};
+
+struct UnknownStruct8
+{
+ u8 unk0[7];
+ u8 unk7;
+ u8 unk8[18];
+ u8 unk1A;
+};
+
+struct UnknownStruct12
+{
+ u32 unk0;
+ u8 filler4[0x54];
+};
+
+extern const u16 gUnknown_08D004E0[];
+extern const struct MonCoords gCastformFrontSpriteCoords[];
+
+extern u8 gStatStageRatios[][2];
+extern u8 gActionsByTurnOrder[4];
+extern struct UnknownPokemonStruct2 gUnknown_02023A00[];
+extern u8 gBattleBufferB[][0x200];
+extern u8 gActiveBank;
+extern u32 gBattleExecBuffer;
+extern u8 gNoOfAllBanks;
+extern u16 gBattlePartyID[];
+extern u8 gCurrentActionFuncId;
+extern u8 gBanksByTurnOrder[];
+extern struct UnknownStruct12 gUnknown_02024AD0[];
+extern u8 gObjectBankIDs[];
+extern u16 gCurrentMove;
+extern u8 gLastUsedAbility;
+extern u8 gStringBank;
+extern u8 gAbsentBankFlags;
+extern u8 gMultiHitCounter;
+extern u8 gActionForBanks[];
+extern u16 gUnknown_02024C2C[];
+extern u16 gLastUsedMove[];
+extern u16 gMoveHitWith[];
+extern u16 gUnknown_02024C44[];
+extern u16 gUnknown_02024C4C[];
+extern u16 gLockedMoves[];
+extern u8 gUnknown_02024C5C[];
+extern u16 gChosenMovesByBanks[];
+extern u32 gHitMarker;
+extern u8 gUnknown_02024C70[];
+extern u16 gSideAffecting[];
+extern u32 gStatuses3[];
+//extern u8 gDisableStructs[][0x1C];
+extern u16 gPauseCounterBattle;
+extern u16 gPaydayMoney;
+extern u16 gRandomTurnNumber;
+extern u8 gBattleCommunication[];
+extern u8 gUnknown_02024D1F[]; // I don't actually know what type this is.
+extern u8 gBattleOutcome;
+extern u16 gUnknown_02024DE8;
+extern u8 gActionSelectionCursor[];
+extern u8 gMoveSelectionCursor[];
+extern u8 gUnknown_02038470[];
+extern u16 gUnknown_030041B0;
+extern u16 gBattle_BG1_Y;
+extern u16 gUnknown_030041B8;
+extern struct Window gUnknown_030041D0;
+extern u16 gBattle_WIN1H;
+extern struct Window gUnknown_03004210;
+extern u16 gBattle_WIN1V;
+extern struct Window gUnknown_03004250;
+extern u16 gBattle_WIN0V;
+extern u16 gBattle_BG2_Y;
+extern u32 gUnknown_03004284;
+extern u16 gBattle_BG2_X;
+extern u16 gBattle_BG0_Y;
+extern u16 gBattle_BG0_X;
+extern u16 gBattle_BG1_X;
+extern u16 gBattle_WIN0H;
+extern MainCallback gPreBattleCallback1;
+extern void (*gBattleMainFunc)(void);
+extern u8 gLeveledUpInBattle;
+extern void (*gBattleBankFunc[])(void);
+extern u8 gHealthboxIDs[];
+extern u16 gBattleTypeFlags;
+extern s8 gBattleTerrain; // I'm not sure if this is supposed to be s8 or u8. Regardless, it must have the same type as the return value of BattleSetup_GetTerrain.
+extern u8 gReservedSpritePaletteCount;
+extern u16 gTrainerBattleOpponent;
+extern struct BattleEnigmaBerry gEnigmaBerries[];
+extern u16 gBlockRecvBuffer[MAX_LINK_PLAYERS][BLOCK_BUFFER_SIZE / 2];
+extern u8 gBattleMonForms[];
+extern u8 gBankAttacker;
+extern u8 gBankTarget;
+extern u16 gBattleWeather;
+extern u32 gBattleMoveDamage;
+extern struct BattlePokemon gBattleMons[];
+extern u8 gBattleMoveFlags;
+extern u8 BattleScript_FocusPunchSetUp[];
+extern u16 gDynamicBasePower;
+extern u8 gCurrentTurnActionNumber;
+extern void (* const gUnknown_081FA640[])(void);
+extern void (* const gUnknown_081FA678[])(void);
+extern u8* gBattlescriptCurrInstr;
+extern u8 BattleScript_LinkBattleWonOrLost[];
+extern u8 BattleScript_PayDayMoneyAndPickUpItems[];
+extern u8 gUnknown_081D8E0D[];
+extern u8 BattleScript_LocalTrainerBattleWon[];
+extern u8 BattleScript_LocalBattleLost[];
+extern u8 BattleScript_GotAwaySafely[];
+extern u8 BattleScript_SmokeBallEscape[];
+extern u8 BattleScript_RanAwayUsingMonAbility[];
+extern u8 BattleScript_WildMonFled[];
+extern u8 BattleScript_ActionSwitch[];
+extern u8 BattleScript_PrintFailedToRunString[];
+extern const BattleCmdFunc gBattleScriptingCommandsTable[];
+extern u8 gCritMultiplier;
+extern u8 gCurrMovePos;
+extern u8 gUnknown_02024BE5;
+extern u16 gChosenMove;
+extern u8* gBattleScriptsForMoveEffects[];
+extern u16 gLastUsedItem;
+extern u8 * const gBattlescriptsForBallThrow[];
+extern u8 * const gBattlescriptsForRunningByItem[];
+extern u8 * const gBattlescriptsForUsingItem[];
+extern u8 * const gBattlescriptsForSafariActions[];
+extern u8 gBattleTextBuff2[];
+extern u8 gNumSafariBalls;
+extern u8 gUnknown_081FA70C[][3];
+extern u8 gUnknown_081FA71B[];
+extern u8 gUnknown_081FA71F[];
+
+
+static void BattlePrepIntroSlide(void);
+void CheckFocusPunch_ClearVarsBeforeTurnStarts(void);
+void SetActionsAndBanksTurnOrder(void);
+static void TurnValuesCleanUp(u8);
+void SpecialStatusesClear(void);
+static void RunTurnActionsFunctions(void);
+void HandleEndTurn_FinishBattle();
+static void FreeResetData_ReturnToOvOrDoEvolutions(void);
+void TryEvolvePokemon(void);
+static void ReturnFromBattleToOverworld(void);
+static void WaitForEvoSceneToFinish(void);
+
+void sub_800E7C4(void)
+{
+ if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ {
+ sub_800B858();
+ SetMainCallback2(sub_800F104);
+ gBattleCommunication[0] = 0;
+ }
+ else
+ {
+ InitBattle();
+ }
+}
+
+void InitBattle(void)
+{
+ s32 i;
+
+ SetHBlankCallback(NULL);
+ SetVBlankCallback(NULL);
+
+ CpuFill32(0, (void *)VRAM, VRAM_SIZE);
+
+ REG_MOSAIC = 0;
+ REG_WIN0H = 0xF0;
+ REG_WIN0V = 0x5051;
+ REG_WININ = 0;
+ REG_WINOUT = 0;
+ gBattle_WIN0H = 0xF0;
+ gBattle_WIN0V = 0x5051;
+ dp12_8087EA4();
+
+ for (i = 0; i < 80; i++)
+ {
+ gUnknown_03004DE0[0][i] = 0xF0;
+ gUnknown_03004DE0[1][i] = 0xF0;
+ }
+ for (i = 80; i < 160; i++)
+ {
+ asm(""::"r"(i)); // Needed to stop the compiler from optimizing out the loop counter
+ gUnknown_03004DE0[0][i] = 0xFF10;
+ gUnknown_03004DE0[1][i] = 0xFF10;
+ }
+ //sub_80895F8(gUnknown_081F9674.unk0, gUnknown_081F9674.unk4, gUnknown_081F9674.unk8);
+ sub_80895F8(gUnknown_081F9674);
+ SetUpWindowConfig(&gWindowConfig_81E6C58);
+ ResetPaletteFade();
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 0;
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ gBattle_BG2_X = 0;
+ gBattle_BG2_Y = 0;
+ gUnknown_030041B0 = 0;
+ gUnknown_030041B8 = 0;
+ gBattleTerrain = BattleSetup_GetTerrain();
+ InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6C58);
+ InitWindowFromConfig(&gUnknown_030041D0, &gWindowConfig_81E71D0);
+ InitWindowFromConfig(&gUnknown_03004250, &gWindowConfig_81E71EC);
+ sub_800D6D4();
+ sub_800DAB8();
+ ResetSpriteData();
+ ResetTasks();
+ sub_800E23C();
+ FreeAllSpritePalettes();
+ gReservedSpritePaletteCount = 4;
+ SetVBlankCallback(sub_800FCFC);
+ setup_poochyena_battle();
+ if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ SetMainCallback2(sub_800F298);
+ else
+ SetMainCallback2(sub_800EC9C);
+ if (!(gBattleTypeFlags & BATTLE_TYPE_LINK))
+ {
+ CreateNPCTrainerParty(gEnemyParty, gTrainerBattleOpponent);
+ SetWildMonHeldItem();
+ }
+ gMain.inBattle = TRUE;
+ for (i = 0; i < 6; i++)
+ AdjustFriendship(&gPlayerParty[i], 3);
+ gBattleCommunication[0] = 0;
+}
+
+void sub_800E9EC(void)
+{
+ u16 r6 = 0;
+ u16 species;
+ u16 hp;
+ u32 status;
+ s32 i;
+
+ for (i = 0; i < 6; i++)
+ {
+ species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
+ hp = GetMonData(&gPlayerParty[i], MON_DATA_HP);
+ status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS);
+
+ if (species == 0)
+ continue;
+ if (species != SPECIES_EGG && hp != 0 && status == 0)
+ r6 |= 1 << i * 2;
+
+ if (species == 0)
+ continue;
+ if (hp != 0 && (species == SPECIES_EGG || status != 0))
+ r6 |= 2 << i * 2;
+
+ if (species == 0)
+ continue;
+ if (species != SPECIES_EGG && hp == 0)
+ r6 |= 3 << i * 2;
+ }
+ BATTLE_STRUCT->unk2 = r6;
+ BATTLE_STRUCT->unk3 = r6 >> 8;
+}
+
+void sub_800EAAC(void)
+{
+ s32 i;
+ struct UnknownStruct8 *_ewram4 = &ewram4;
+
+ for (i = 0; i < 7; i++)
+ _ewram4->unk0[i] = gSaveBlock1.enigmaBerry.berry.name[i];
+ for (i = 0; i < 18; i++)
+ _ewram4->unk8[i] = gSaveBlock1.enigmaBerry.itemEffect[i];
+ _ewram4->unk7 = gSaveBlock1.enigmaBerry.holdEffect;
+ _ewram4->unk1A = gSaveBlock1.enigmaBerry.holdEffectParam;
+}
+
+void sub_800EB08(void)
+{
+ s32 i;
+ s32 j;
+
+ if (!(gBattleTypeFlags & BATTLE_TYPE_LINK))
+ {
+ for (i = 0; i < 7; i++)
+ {
+ gEnigmaBerries[0].name[i] = gSaveBlock1.enigmaBerry.berry.name[i];
+ gEnigmaBerries[2].name[i] = gSaveBlock1.enigmaBerry.berry.name[i];
+ }
+ for (i = 0; i < 18; i++)
+ {
+ gEnigmaBerries[0].itemEffect[i] = gSaveBlock1.enigmaBerry.itemEffect[i];
+ gEnigmaBerries[2].itemEffect[i] = gSaveBlock1.enigmaBerry.itemEffect[i];
+ }
+ gEnigmaBerries[0].holdEffect = gSaveBlock1.enigmaBerry.holdEffect;
+ gEnigmaBerries[2].holdEffect = gSaveBlock1.enigmaBerry.holdEffect;
+ gEnigmaBerries[0].holdEffectParam = gSaveBlock1.enigmaBerry.holdEffectParam;
+ gEnigmaBerries[2].holdEffectParam = gSaveBlock1.enigmaBerry.holdEffectParam;
+ }
+ else
+ {
+ s32 numPlayers;
+ struct BattleEnigmaBerry *src;
+ u8 r4;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ numPlayers = 4;
+ else
+ numPlayers = 2;
+ for (i = 0; i < numPlayers; i++)
+ {
+ src = (struct BattleEnigmaBerry *)(gBlockRecvBuffer[i] + 2);
+ r4 = gLinkPlayers[i].lp_field_18;
+
+ for (j = 0; j < 7; j++)
+ gEnigmaBerries[r4].name[j] = src->name[j];
+ for (j = 0; j < 18; j++)
+ gEnigmaBerries[r4].itemEffect[j] = src->itemEffect[j];
+ gEnigmaBerries[r4].holdEffect = src->holdEffect;
+ gEnigmaBerries[r4].holdEffectParam = src->holdEffectParam;
+ }
+ }
+}
+
+void shedinja_something(struct Pokemon *pkmn)
+{
+ u8 nickname[POKEMON_NAME_LENGTH + 1];
+ u8 language = 1;
+
+ if (GetMonData(pkmn, MON_DATA_SPECIES) == SPECIES_SHEDINJA
+ && GetMonData(pkmn, MON_DATA_LANGUAGE) != language)
+ {
+ GetMonData(pkmn, MON_DATA_NICKNAME, nickname);
+ if (StringCompareWithoutExtCtrlCodes(nickname, gUnknown_081F96C8) == 0)
+ SetMonData(pkmn, MON_DATA_LANGUAGE, &language);
+ }
+}
+
+void sub_800EC9C(void)
+{
+ u8 playerId;
+ u8 enemyId;
+
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ playerId = GetMultiplayerId();
+ ewram160CB = playerId;
+ enemyId = playerId ^ 1;
+
+ switch (gBattleCommunication[0])
+ {
+ case 0:
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ {
+ if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC())
+ {
+ BATTLE_STRUCT->unk0 = 1;
+ BATTLE_STRUCT->unk1 = 1;
+ sub_800E9EC();
+ sub_800EAAC();
+ SendBlock(bitmask_all_link_players_but_self(), BATTLE_STRUCT, 32);
+ gBattleCommunication[0] = 1;
+ }
+ }
+ else
+ {
+ gBattleTypeFlags |= BATTLE_TYPE_WILD;
+ gBattleCommunication[0] = 8;
+ sub_800EB08();
+ }
+ break;
+ case 1:
+ if ((GetBlockReceivedStatus() & 3) == 3)
+ {
+ s32 id;
+ u8 taskId;
+
+ ResetBlockReceivedFlags();
+ id = 0;
+ if (gBlockRecvBuffer[0][0] == 0x100)
+ {
+ if (playerId == 0)
+ gBattleTypeFlags |= 12;
+ else
+ gBattleTypeFlags |= 8;
+ id++;
+ }
+ if (id == 0)
+ {
+ if (gBlockRecvBuffer[0][0] == gBlockRecvBuffer[1][0])
+ {
+ if (playerId == 0)
+ gBattleTypeFlags |= 12;
+ else
+ gBattleTypeFlags |= 8;
+ id++;
+ }
+ if (id == 0)
+ {
+ while (id < 2)
+ {
+ if (gBlockRecvBuffer[id][0] > 0x0101 && id != playerId)
+ break;
+ id++;
+ }
+ if (id == 2)
+ gBattleTypeFlags |= 12;
+ else
+ gBattleTypeFlags |= 8;
+ }
+ }
+ sub_800EB08();
+ taskId = CreateTask(sub_800DE30, 0);
+ gTasks[taskId].data[1] = 0x10E;
+ gTasks[taskId].data[2] = 0x5A;
+ gTasks[taskId].data[5] = 0;
+ gTasks[taskId].data[3] = BATTLE_STRUCT->unk2 | (BATTLE_STRUCT->unk3 << 8);
+ gTasks[taskId].data[4] = gBlockRecvBuffer[enemyId][1];
+ gBattleCommunication[0]++;
+ }
+ break;
+ case 2:
+ if (sub_8007ECC())
+ {
+ SendBlock(bitmask_all_link_players_but_self(), gPlayerParty, sizeof(*gPlayerParty) * 2);
+ gBattleCommunication[0]++;
+ }
+ break;
+ case 3:
+ if ((GetBlockReceivedStatus() & 3) == 3)
+ {
+ ResetBlockReceivedFlags();
+ memcpy(gEnemyParty, gBlockRecvBuffer[enemyId], sizeof(*gEnemyParty) * 2);
+ gBattleCommunication[0]++;
+ }
+ break;
+ case 4:
+ if (sub_8007ECC())
+ {
+ SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 2, sizeof(*gPlayerParty) * 2);
+ gBattleCommunication[0]++;
+ }
+ break;
+ case 5:
+ if ((GetBlockReceivedStatus() & 3) == 3)
+ {
+ ResetBlockReceivedFlags();
+ memcpy(gEnemyParty + 2, gBlockRecvBuffer[enemyId], sizeof(*gEnemyParty) * 2);
+ gBattleCommunication[0]++;
+ }
+ break;
+ case 6:
+ if (sub_8007ECC())
+ {
+ SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 4, sizeof(*gPlayerParty) * 2);
+ gBattleCommunication[0]++;
+ }
+ break;
+ case 7:
+ if ((GetBlockReceivedStatus() & 3) == 3)
+ {
+ ResetBlockReceivedFlags();
+ memcpy(gEnemyParty + 4, gBlockRecvBuffer[enemyId], sizeof(*gEnemyParty) * 2);
+ shedinja_something(&gEnemyParty[0]);
+ shedinja_something(&gEnemyParty[1]);
+ shedinja_something(&gEnemyParty[2]);
+ shedinja_something(&gEnemyParty[3]);
+ shedinja_something(&gEnemyParty[4]);
+ shedinja_something(&gEnemyParty[5]);
+ gBattleCommunication[0]++;
+ }
+ break;
+ case 8:
+ sub_800B950();
+ gBattleCommunication[0]++;
+ gBattleCommunication[1] = 0;
+ gBattleCommunication[2] = 0;
+ break;
+ case 9:
+ if (battle_load_something(gUnknown_02024D1F, gUnknown_02024D1F + 1) != 0)
+ {
+ gPreBattleCallback1 = gMain.callback1;
+ gMain.callback1 = sub_8010824;
+ SetMainCallback2(BattleMainCB2);
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ {
+ gTrainerBattleOpponent = 0x800;
+ gBattleTypeFlags |= BATTLE_TYPE_20;
+ }
+ }
+ break;
+ }
+}
+
+void sub_800F02C(void)
+{
+ s32 i;
+
+ for (i = 0; i < 3; i++)
+ {
+ u8 *nickname = gUnknown_02023A00[i].nickname;
+
+ gUnknown_02023A00[i].species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES);
+ gUnknown_02023A00[i].heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM);
+ GetMonData(&gPlayerParty[i], MON_DATA_NICKNAME, nickname);
+ gUnknown_02023A00[i].level = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL);
+ gUnknown_02023A00[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP);
+ gUnknown_02023A00[i].maxhp = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP);
+ gUnknown_02023A00[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS);
+ gUnknown_02023A00[i].personality = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY);
+ gUnknown_02023A00[i].gender = GetMonGender(&gPlayerParty[i]);
+ StripExtCtrlCodes(nickname);
+ gUnknown_02023A00[i].language = GetMonData(&gPlayerParty[i], MON_DATA_LANGUAGE);
+ if (gUnknown_02023A00[i].language != 1)
+ PadNameString(nickname, 0);
+ }
+ memcpy(gSharedMem, gUnknown_02023A00, 0x60);
+}
+
+void sub_800F104(void)
+{
+ u8 playerId;
+ MainCallback *pSavedCallback;
+ u16 *pSavedBattleTypeFlags;
+
+ playerId = GetMultiplayerId();
+ ewram160CB = playerId;
+ // Seriously, Game Freak?
+ pSavedCallback = ewram160C4_Callback;
+ pSavedBattleTypeFlags = ewram160C2_Flags;
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+
+ switch (gBattleCommunication[0])
+ {
+ case 0:
+ if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC())
+ {
+ sub_800F02C();
+ SendBlock(bitmask_all_link_players_but_self(), gSharedMem, 0x60);
+ gBattleCommunication[0]++;
+ }
+ break;
+ case 1:
+ if ((GetBlockReceivedStatus() & 0xF) == 0xF)
+ {
+ s32 i;
+
+ ResetBlockReceivedFlags();
+ for (i = 0; i < 4; i++)
+ {
+ if (i != playerId)
+ {
+ if ((!(gLinkPlayers[i].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1))
+ || ((gLinkPlayers[i].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1)))
+ memcpy(gUnknown_02023A00, gBlockRecvBuffer[i], 0x60);
+ }
+ }
+ gBattleCommunication[0]++;
+ *pSavedCallback = gMain.savedCallback;
+ *pSavedBattleTypeFlags = gBattleTypeFlags;
+ gMain.savedCallback = sub_800F104;
+ OpenPartyMenu(PARTY_MENU_TYPE_LINK_MULTI_BATTLE, 0);
+ }
+ break;
+ case 2:
+ if (!gPaletteFade.active)
+ {
+ gBattleCommunication[0] = 3;
+ sub_800832C();
+ }
+ break;
+ case 3:
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ gBattleTypeFlags = *pSavedBattleTypeFlags;
+ gMain.savedCallback = *pSavedCallback;
+ SetMainCallback2(InitBattle);
+ }
+ break;
+ }
+}
+
+void sub_800F298(void)
+{
+ u8 playerId;
+ s32 id;
+
+ playerId = GetMultiplayerId();
+ ewram160CB = playerId;
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ switch (gBattleCommunication[0])
+ {
+ case 0:
+ if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC())
+ {
+ BATTLE_STRUCT->unk0 = 1;
+ BATTLE_STRUCT->unk1 = 1;
+ sub_800E9EC();
+ sub_800EAAC();
+ SendBlock(bitmask_all_link_players_but_self(), gSharedMem, 0x20);
+ gBattleCommunication[0]++;
+ }
+ break;
+ case 1:
+ if ((GetBlockReceivedStatus() & 0xF) == 0xF)
+ {
+ u8 taskId;
+
+ ResetBlockReceivedFlags();
+ id = 0;
+ if (gBlockRecvBuffer[0][0] == 0x100)
+ {
+ if (playerId == 0)
+ gBattleTypeFlags |= 12;
+ else
+ gBattleTypeFlags |= 8;
+ id++;
+ }
+ if (id == 0)
+ {
+ s32 i;
+
+ for (i = 0; i < MAX_LINK_PLAYERS; i++)
+ {
+ if (gBlockRecvBuffer[0][0] != gBlockRecvBuffer[i][0])
+ break;
+ }
+ if (i == MAX_LINK_PLAYERS)
+ {
+ if (playerId == 0)
+ gBattleTypeFlags |= 12;
+ else
+ gBattleTypeFlags |= 8;
+ id++;
+ }
+ if (id == 0)
+ {
+ while (id < MAX_LINK_PLAYERS)
+ {
+ if (gBlockRecvBuffer[id][0] == 0x0101 && id != playerId)
+ if (id < playerId)
+ break;
+ if (gBlockRecvBuffer[id][0] > 0x0101 && id != playerId)
+ break;
+ id++;
+ }
+ if (id == MAX_LINK_PLAYERS)
+ gBattleTypeFlags |= 12;
+ else
+ gBattleTypeFlags |= 8;
+ }
+ }
+ sub_800EB08();
+ memcpy(ewram1D000, gPlayerParty, sizeof(struct Pokemon) * 3);
+ taskId = CreateTask(sub_800DE30, 0);
+ gTasks[taskId].data[1] = 0x10E;
+ gTasks[taskId].data[2] = 0x5A;
+ gTasks[taskId].data[5] = 0;
+ gTasks[taskId].data[3] = 0;
+ gTasks[taskId].data[4] = 0;
+ for (id = 0; id < MAX_LINK_PLAYERS; id++)
+ {
+ switch (gLinkPlayers[id].lp_field_18)
+ {
+ case 0:
+ gTasks[taskId].data[3] |= gBlockRecvBuffer[id][1] & 0x3F;
+ break;
+ case 1:
+ gTasks[taskId].data[4] |= gBlockRecvBuffer[id][1] & 0x3F;
+ break;
+ case 2:
+ gTasks[taskId].data[3] |= (gBlockRecvBuffer[id][1] & 0x3F) << 6;
+ break;
+ case 3:
+ gTasks[taskId].data[4] |= (gBlockRecvBuffer[id][1] & 0x3F) << 6;
+ break;
+ }
+ }
+ ZeroPlayerPartyMons();
+ ZeroEnemyPartyMons();
+ gBattleCommunication[0]++;
+ goto step_2;
+ }
+ break;
+ case 2:
+ step_2:
+ if (sub_8007ECC())
+ {
+ SendBlock(bitmask_all_link_players_but_self(), ewram1D000, sizeof(struct Pokemon) * 2);
+ gBattleCommunication[0]++;
+ }
+ break;
+ case 3:
+ if ((GetBlockReceivedStatus() & 0xF) == 0xF)
+ {
+ ResetBlockReceivedFlags();
+ for (id = 0; id < MAX_LINK_PLAYERS; id++)
+ {
+ if (id == playerId)
+ {
+ switch (gLinkPlayers[id].lp_field_18)
+ {
+ case 0:
+ case 3:
+ memcpy(gPlayerParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
+ break;
+ case 1:
+ case 2:
+ memcpy(gPlayerParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
+ break;
+ }
+ }
+ else
+ {
+ if ((!(gLinkPlayers[id].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1))
+ || ((gLinkPlayers[id].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1)))
+ {
+ switch (gLinkPlayers[id].lp_field_18)
+ {
+ case 0:
+ case 3:
+ memcpy(gPlayerParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
+ break;
+ case 1:
+ case 2:
+ memcpy(gPlayerParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
+ break;
+ }
+ }
+ else
+ {
+ switch (gLinkPlayers[id].lp_field_18)
+ {
+ case 0:
+ case 3:
+ memcpy(gEnemyParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
+ break;
+ case 1:
+ case 2:
+ memcpy(gEnemyParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
+ break;
+ }
+ }
+ }
+ }
+ gBattleCommunication[0]++;
+ }
+ break;
+ case 4:
+ if (sub_8007ECC())
+ {
+ SendBlock(bitmask_all_link_players_but_self(), ewram1D000 + 2, sizeof(struct Pokemon));
+ gBattleCommunication[0]++;
+ }
+ break;
+ case 5:
+ if ((GetBlockReceivedStatus() & 0xF) == 0xF)
+ {
+ ResetBlockReceivedFlags();
+ for (id = 0; id < MAX_LINK_PLAYERS; id++)
+ {
+ if (id == playerId)
+ {
+ switch (gLinkPlayers[id].lp_field_18)
+ {
+ case 0:
+ case 3:
+ memcpy(gPlayerParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon));
+ break;
+ case 1:
+ case 2:
+ memcpy(gPlayerParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon));
+ break;
+ }
+ }
+ else
+ {
+ if ((!(gLinkPlayers[id].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1))
+ || ((gLinkPlayers[id].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1)))
+ {
+ switch (gLinkPlayers[id].lp_field_18)
+ {
+ case 0:
+ case 3:
+ memcpy(gPlayerParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon));
+ break;
+ case 1:
+ case 2:
+ memcpy(gPlayerParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon));
+ break;
+ }
+ }
+ else
+ {
+ switch (gLinkPlayers[id].lp_field_18)
+ {
+ case 0:
+ case 3:
+ memcpy(gEnemyParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon));
+ break;
+ case 1:
+ case 2:
+ memcpy(gEnemyParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon));
+ break;
+ }
+ }
+ }
+ }
+
+ shedinja_something(&gPlayerParty[0]);
+ shedinja_something(&gPlayerParty[1]);
+ shedinja_something(&gPlayerParty[2]);
+ shedinja_something(&gPlayerParty[3]);
+ shedinja_something(&gPlayerParty[4]);
+ shedinja_something(&gPlayerParty[5]);
+
+ shedinja_something(&gEnemyParty[0]);
+ shedinja_something(&gEnemyParty[1]);
+ shedinja_something(&gEnemyParty[2]);
+ shedinja_something(&gEnemyParty[3]);
+ shedinja_something(&gEnemyParty[4]);
+ shedinja_something(&gEnemyParty[5]);
+
+ gBattleCommunication[0]++;
+ }
+ break;
+ case 6:
+ sub_800B950();
+ gBattleCommunication[0]++;
+ gBattleCommunication[1] = 0;
+ gBattleCommunication[2] = 0;
+ break;
+ case 7:
+ if (battle_load_something(gUnknown_02024D1F, gUnknown_02024D1F + 1) != 0)
+ {
+ gPreBattleCallback1 = gMain.callback1;
+ gMain.callback1 = sub_8010824;
+ SetMainCallback2(BattleMainCB2);
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ {
+ gTrainerBattleOpponent = 0x800;
+ gBattleTypeFlags |= BATTLE_TYPE_20;
+ }
+ }
+ break;
+ }
+}
+
+void BattleMainCB2(void)
+{
+ AnimateSprites();
+ BuildOamBuffer();
+ sub_800374C(&gUnknown_03004210);
+ UpdatePaletteFade();
+ RunTasks();
+}
+
+void sub_800F828(struct Sprite *sprite)
+{
+ sprite->data[0] = 0;
+ sprite->callback = sub_800F838;
+}
+
+void sub_800F838(struct Sprite *sprite)
+{
+ u16 *arr = (u16 *)gSharedMem;
+
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->data[0]++;
+ sprite->data[1] = 0;
+ sprite->data[2] = 0x281;
+ sprite->data[3] = 0;
+ sprite->data[4] = 1;
+ // fall through
+ case 1:
+ sprite->data[4]--;
+ if (sprite->data[4] == 0)
+ {
+ s32 i;
+ s32 r2;
+ s32 r0;
+
+ sprite->data[4] = 2;
+ r2 = sprite->data[1] + sprite->data[3] * 32;
+ r0 = sprite->data[2] - sprite->data[3] * 32;
+ for (i = 0; i < 29; i += 2)
+ {
+ arr[r2 + i] = 0x3D;
+ arr[r0 + i] = 0x3D;
+ }
+ sprite->data[3]++;
+ if (sprite->data[3] == 21)
+ {
+ sprite->data[0]++;
+ sprite->data[1] = 32;
+ }
+ }
+ break;
+ case 2:
+ sprite->data[1]--;
+ if (sprite->data[1] == 20)
+ SetMainCallback2(sub_800E7C4);
+ break;
+ }
+}
+
+u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum)
+{
+ u32 nameHash = 0;
+ s32 i;
+
+ if (trainerNum == 0x400)
+ return 0;
+
+ if ((gBattleTypeFlags & 0x908) == 8)
+ {
+ ZeroEnemyPartyMons();
+ for (i = 0; i < gTrainers[trainerNum].partySize; i++)
+ {
+ u32 personalityValue;
+ s32 j;
+ u8 fixedIV;
+
+ if (gTrainers[trainerNum].doubleBattle == TRUE)
+ personalityValue = 0x80;
+ else if (gTrainers[trainerNum].encounterMusic_gender & 0x80)
+ personalityValue = 0x78;
+ else
+ personalityValue = 0x88;
+
+ for (j = 0; gTrainers[trainerNum].trainerName[j] != 0xFF; j++)
+ nameHash += gTrainers[trainerNum].trainerName[j];
+
+ switch (gTrainers[trainerNum].partyFlags)
+ {
+ case 0:
+ {
+ struct TrainerPartyMember0 *partyData = gTrainers[trainerNum].party;
+
+ for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++)
+ nameHash += gSpeciesNames[partyData[i].species][j];
+ personalityValue += nameHash << 8;
+ fixedIV = partyData[i].iv * 31 / 255;
+ CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0);
+ break;
+ }
+ case 1:
+ {
+ struct TrainerPartyMember1 *partyData = gTrainers[trainerNum].party;
+
+ for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++)
+ nameHash += gSpeciesNames[partyData[i].species][j];
+ personalityValue += nameHash << 8;
+ fixedIV = partyData[i].iv * 31 / 255;
+ CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0);
+
+ for (j = 0; j < 4; 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;
+ }
+ case 2:
+ {
+ struct TrainerPartyMember2 *partyData = gTrainers[trainerNum].party;
+
+ for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++)
+ nameHash += gSpeciesNames[partyData[i].species][j];
+ personalityValue += nameHash << 8;
+ 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, &partyData[i].heldItem);
+ break;
+ }
+ case 3:
+ {
+ struct TrainerPartyMember3 *partyData = gTrainers[trainerNum].party;
+
+ for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++)
+ nameHash += gSpeciesNames[partyData[i].species][j];
+ personalityValue += nameHash << 8;
+ 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, &partyData[i].heldItem);
+ for (j = 0; j < 4; 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;
+ }
+ }
+ }
+ gBattleTypeFlags |= gTrainers[trainerNum].doubleBattle;
+ }
+ return gTrainers[trainerNum].partySize;
+}
+
+void sub_800FCD4(void)
+{
+ if (REG_VCOUNT < 0xA0 && REG_VCOUNT >= 0x6F )
+ REG_BG0CNT = 0x9800;
+}
+
+void sub_800FCFC(void)
+{
+ Random(); // unused return value
+ REG_BG0HOFS = gBattle_BG0_X;
+ REG_BG0VOFS = gBattle_BG0_Y;
+ REG_BG1HOFS = gBattle_BG1_X;
+ REG_BG1VOFS = gBattle_BG1_Y;
+ REG_BG2HOFS = gBattle_BG2_X;
+ REG_BG2VOFS = gBattle_BG2_Y;
+ REG_BG3HOFS = gUnknown_030041B0;
+ REG_BG3VOFS = gUnknown_030041B8;
+ REG_WIN0H = gBattle_WIN0H;
+ REG_WIN0V = gBattle_WIN0V;
+ REG_WIN1H = gBattle_WIN1H;
+ REG_WIN1V = gBattle_WIN1V;
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ sub_8089668();
+}
+
+void nullsub_36(struct Sprite *sprite)
+{
+}
+
+void sub_800FDB0(struct Sprite *sprite)
+{
+ if (sprite->data[0] != 0)
+ sprite->pos1.x = sprite->data[1] + ((sprite->data[2] & 0xFF00) >> 8);
+ else
+ sprite->pos1.x = sprite->data[1] - ((sprite->data[2] & 0xFF00) >> 8);
+ sprite->data[2] += 0x180;
+ if (sprite->affineAnimEnded)
+ {
+ FreeSpriteTilesByTag(0x2710);
+ FreeSpritePaletteByTag(0x2710);
+ FreeSpriteOamMatrix(sprite);
+ DestroySprite(sprite);
+ }
+}
+
+void sub_800FE20(struct Sprite *sprite)
+{
+ StartSpriteAffineAnim(sprite, 1);
+ sprite->callback = sub_800FDB0;
+ PlaySE(SE_BT_START);
+}
+
+void sub_800FE40(u8 taskId)
+{
+ struct Pokemon *sp4 = NULL;
+ struct Pokemon *sp8 = NULL;
+ u8 r2 = ewram160CB;
+ u32 r7;
+ s32 i;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ {
+ switch (gLinkPlayers[r2].lp_field_18)
+ {
+ case 0:
+ case 2:
+ sp4 = gPlayerParty;
+ sp8 = gEnemyParty;
+ break;
+ case 1:
+ case 3:
+ sp4 = gEnemyParty;
+ sp8 = gPlayerParty;
+ break;
+ }
+ }
+ else
+ {
+ sp4 = gPlayerParty;
+ sp8 = gEnemyParty;
+ }
+
+ r7 = 0;
+ for (i = 0; i < 6; i++)
+ {
+ u16 species = GetMonData(&sp4[i], MON_DATA_SPECIES2);
+ u16 hp = GetMonData(&sp4[i], MON_DATA_HP);
+ u32 status = GetMonData(&sp4[i], MON_DATA_STATUS);
+
+ if (species == 0)
+ continue;
+ if (species != SPECIES_EGG && hp != 0 && status == 0)
+ r7 |= 1 << i * 2;
+
+ if (species == 0)
+ continue;
+ if (hp != 0 && (species == SPECIES_EGG || status != 0))
+ r7 |= 2 << i * 2;
+
+ if (species == 0)
+ continue;
+ if (species != SPECIES_EGG && hp == 0)
+ r7 |= 3 << i * 2;
+ }
+ gTasks[taskId].data[3] = r7;
+
+ r7 = 0;
+ for (i = 0; i < 6; i++)
+ {
+ u16 species = GetMonData(&sp8[i], MON_DATA_SPECIES2);
+ u16 hp = GetMonData(&sp8[i], MON_DATA_HP);
+ u32 status = GetMonData(&sp8[i], MON_DATA_STATUS);
+
+ if (species == 0)
+ continue;
+ if (species != SPECIES_EGG && hp != 0 && status == 0)
+ r7 |= 1 << i * 2;
+
+ if (species == 0)
+ continue;
+ if (hp != 0 && (species == SPECIES_EGG || status != 0))
+ r7 |= 2 << i * 2;
+
+ if (species == 0)
+ continue;
+ if (species != SPECIES_EGG && hp == 0)
+ r7 |= 3 << i * 2;
+ }
+ gTasks[taskId].data[4] = r7;
+}
+
+void c2_8011A1C(void)
+{
+ s32 i;
+ u8 taskId;
+
+ SetHBlankCallback(NULL);
+ SetVBlankCallback(NULL);
+ CpuFill32(0, (void *)VRAM, VRAM_SIZE);
+ REG_MOSAIC = 0;
+ REG_WIN0H = 0xF0;
+ REG_WIN0V = 0x5051;
+ REG_WININ = 0;
+ REG_WINOUT = 0;
+ gBattle_WIN0H = 0xF0;
+ gBattle_WIN0V = 0x5051;
+ dp12_8087EA4();
+
+ for (i = 0; i < 80; i++)
+ {
+ gUnknown_03004DE0[0][i] = 0xF0;
+ gUnknown_03004DE0[1][i] = 0xF0;
+ }
+ for (i = 80; i < 160; i++)
+ {
+ asm(""::"r"(i)); // Needed to stop the compiler from optimizing out the loop counter
+ gUnknown_03004DE0[0][i] = 0xFF10;
+ gUnknown_03004DE0[1][i] = 0xFF10;
+ }
+ SetUpWindowConfig(&gWindowConfig_81E6C58);
+ ResetPaletteFade();
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 0;
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ gBattle_BG2_X = 0;
+ gBattle_BG2_Y = 0;
+ gUnknown_030041B0 = 0;
+ gUnknown_030041B8 = 0;
+
+ InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6C58);
+ InitWindowFromConfig(&gUnknown_030041D0, &gWindowConfig_81E71D0);
+ InitWindowFromConfig(&gUnknown_03004250, &gWindowConfig_81E71EC);
+ sub_800D6D4();
+ LoadCompressedPalette(gUnknown_08D004E0, 0, 64);
+ sub_800D74C();
+ ResetSpriteData();
+ ResetTasks();
+ sub_800E23C();
+ REG_WINOUT = 0x37;
+ FreeAllSpritePalettes();
+ gReservedSpritePaletteCount = 4;
+ SetVBlankCallback(sub_800FCFC);
+ taskId = CreateTask(sub_800DE30, 0);
+ gTasks[taskId].data[1] = 0x10E;
+ gTasks[taskId].data[2] = 0x5A;
+ gTasks[taskId].data[5] = 1;
+ sub_800FE40(taskId);
+ SetMainCallback2(sub_80101B8);
+ gBattleCommunication[0] = 0;
+}
+
+void sub_80101B8(void)
+{
+ c2_081284E0();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+ RunTasks();
+}
+
+void c2_081284E0(void)
+{
+ switch (gBattleCommunication[0])
+ {
+ case 0:
+ gBattleCommunication[1] = 0xFF;
+ gBattleCommunication[0]++;
+ break;
+ case 1:
+ gBattleCommunication[1]--;
+ if (gBattleCommunication[1] == 0)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ gBattleCommunication[0]++;
+ }
+ break;
+ case 2:
+ if (!gPaletteFade.active)
+ SetMainCallback2(gMain.savedCallback);
+ break;
+ }
+}
+
+void oac_poke_opponent(struct Sprite *sprite)
+{
+ sprite->callback = sub_8010278;
+ StartSpriteAnimIfDifferent(sprite, 0);
+ BeginNormalPaletteFade(0x00020000, 0, 10, 10, 0x3DEF);
+}
+
+void sub_8010278(struct Sprite *sprite)
+{
+ if ((gUnknown_02024DE8 & 1) == 0)
+ {
+ sprite->pos2.x += 2;
+ if (sprite->pos2.x == 0)
+ {
+ sprite->callback = sub_80102AC;
+ PlayCry1(sprite->data[2], 25);
+ }
+ }
+}
+
+void sub_80102AC(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ {
+ sub_804777C(sprite->data[0]);
+ sub_8043DFC(gHealthboxIDs[sprite->data[0]]);
+ sprite->callback = nullsub_37;
+ StartSpriteAnimIfDifferent(sprite, 0);
+ BeginNormalPaletteFade(0x00020000, 0, 10, 0, 0x3DEF);
+ }
+}
+
+void nullsub_37(struct Sprite *sprite)
+{
+}
+
+void unref_sub_801030C(struct Sprite *sprite)
+{
+ sprite->data[3] = 6;
+ sprite->data[4] = 1;
+ sprite->callback = sub_8010320;
+}
+
+void sub_8010320(struct Sprite *sprite)
+{
+ sprite->data[4]--;
+ if (sprite->data[4] == 0)
+ {
+ sprite->data[4] = 8;
+ sprite->invisible ^= 1;
+ sprite->data[3]--;
+ if (sprite->data[3] == 0)
+ {
+ sprite->invisible = FALSE;
+ sprite->callback = nullsub_37;
+ gUnknown_03004284 = 0;
+ }
+ }
+}
+
+void sub_8010384(struct Sprite *sprite)
+{
+ u8 r6 = sprite->data[0];
+ u16 species;
+ u8 yOffset;
+
+ if (ewram17800[r6].transformedSpecies != 0)
+ species = ewram17800[r6].transformedSpecies;
+ else
+ species = sprite->data[2];
+
+ GetMonData(&gEnemyParty[gBattlePartyID[r6]], MON_DATA_PERSONALITY); // Unused return value
+
+ if (species == SPECIES_UNOWN)
+ {
+ u32 personalityValue = GetMonData(&gEnemyParty[gBattlePartyID[r6]], MON_DATA_PERSONALITY);
+ u16 unownForm = ((((personalityValue & 0x3000000) >> 18) | ((personalityValue & 0x30000) >> 12) | ((personalityValue & 0x300) >> 6) | (personalityValue & 3)) % 0x1C);
+ u16 unownSpecies;
+
+ if (unownForm == 0)
+ unownSpecies = SPECIES_UNOWN; // Use the A Unown form
+ else
+ unownSpecies = NUM_SPECIES + unownForm; // Use one of the other Unown letters
+
+ yOffset = gMonFrontPicCoords[unownSpecies].y_offset;
+ }
+ else if (species == SPECIES_CASTFORM)
+ {
+ yOffset = gCastformFrontSpriteCoords[gBattleMonForms[r6]].y_offset;
+ }
+ else if (species > NUM_SPECIES)
+ {
+ yOffset = gMonFrontPicCoords[SPECIES_NONE].y_offset;
+ }
+ else
+ {
+ yOffset = gMonFrontPicCoords[species].y_offset;
+ }
+
+ sprite->data[3] = 8 - yOffset / 8;
+ sprite->data[4] = 1;
+ sprite->callback = sub_8010494;
+}
+
+void sub_8010494(struct Sprite *sprite)
+{
+ s32 i;
+ u8 *dst;
+
+ sprite->data[4]--;
+ if (sprite->data[4] == 0)
+ {
+ sprite->data[4] = 2;
+ sprite->pos2.y += 8;
+ sprite->data[3]--;
+ if (sprite->data[3] < 0)
+ {
+ FreeSpriteOamMatrix(sprite);
+ DestroySprite(sprite);
+ }
+ else
+ {
+ // this should use a MEMSET_ALT, but *(dst++) wont match with it.
+ dst = (u8 *)gUnknown_081FAF4C[GetBankIdentity(sprite->data[0])] + (gBattleMonForms[sprite->data[0]] << 11) + (sprite->data[3] << 8);
+ for (i = 0; i < 0x100; i++)
+ *(dst++) = 0;
+ StartSpriteAnim(sprite, gBattleMonForms[sprite->data[0]]);
+ }
+ }
+}
+
+void sub_8010520(struct Sprite *sprite)
+{
+ sprite->data[3] = 8;
+ sprite->data[4] = sprite->invisible;
+ sprite->callback = sub_801053C;
+}
+
+void sub_801053C(struct Sprite *sprite)
+{
+ sprite->data[3]--;
+ if (sprite->data[3] == 0)
+ {
+ sprite->invisible ^= 1;
+ sprite->data[3] = 8;
+ }
+}
+
+void sub_8010574(struct Sprite *sprite)
+{
+ sprite->invisible = sprite->data[4];
+ sprite->data[4] = FALSE;
+ sprite->callback = nullsub_37;
+}
+
+void sub_80105A0(struct Sprite *sprite)
+{
+ sprite->callback = oac_poke_ally_;
+}
+
+void oac_poke_ally_(struct Sprite *sprite)
+{
+ if ((gUnknown_02024DE8 & 1) == 0)
+ {
+ sprite->pos2.x -= 2;
+ if (sprite->pos2.x == 0)
+ {
+ sprite->callback = nullsub_86;
+ sprite->data[1] = 0;
+ }
+ }
+}
+
+void sub_80105DC(struct Sprite *sprite)
+{
+ sprite->callback = nullsub_86;
+}
+
+void nullsub_86(struct Sprite *sprite)
+{
+}
+
+void sub_80105EC(struct Sprite *sprite)
+{
+ if ((gUnknown_02024DE8 & 1) == 0)
+ {
+ sprite->pos2.x += sprite->data[1];
+ sprite->pos2.y += sprite->data[2];
+ }
+}
+
+void dp11b_obj_instanciate(u8 bank, u8 b, s8 c, s8 d)
+{
+ u8 spriteId;
+ u8 objectID;
+
+ if (b)
+ {
+ if (ewram17810[bank].unk0_1)
+ return;
+ }
+ else
+ {
+ if (ewram17810[bank].unk0_2)
+ return;
+ }
+
+ spriteId = CreateInvisibleSpriteWithCallback(objc_dp11b_pingpong);
+ if (b == TRUE)
+ {
+ objectID = gHealthboxIDs[bank];
+ ewram17810[bank].unk2 = spriteId;
+ ewram17810[bank].unk0_1 = 1;
+ gSprites[spriteId].data[0] = 0x80;
+ }
+ else
+ {
+ objectID = gObjectBankIDs[bank];
+ ewram17810[bank].unk3 = spriteId;
+ ewram17810[bank].unk0_2 = 1;
+ gSprites[spriteId].data[0] = 0xC0;
+ }
+ gSprites[spriteId].data[1] = c;
+ gSprites[spriteId].data[2] = d;
+ gSprites[spriteId].data[3] = objectID;
+ gSprites[spriteId].data[4] = b;
+ gSprites[objectID].pos2.x = 0;
+ gSprites[objectID].pos2.y = 0;
+}
+
+void dp11b_obj_free(u8 a, u8 b)
+{
+ u8 r4;
+
+ if (b == TRUE)
+ {
+ if (!ewram17810[a].unk0_1)
+ return;
+ r4 = gSprites[ewram17810[a].unk2].data[3];
+ DestroySprite(&gSprites[ewram17810[a].unk2]);
+ ewram17810[a].unk0_1 = 0;
+ }
+ else
+ {
+ if (!ewram17810[a].unk0_2)
+ return;
+ r4 = gSprites[ewram17810[a].unk3].data[3];
+ DestroySprite(&gSprites[ewram17810[a].unk3]);
+ ewram17810[a].unk0_2 = 0;
+ }
+ gSprites[r4].pos2.x = 0;
+ gSprites[r4].pos2.y = 0;
+}
+
+void objc_dp11b_pingpong(struct Sprite *sprite)
+{
+ u8 spriteId = sprite->data[3];
+ s32 var;
+
+ if (sprite->data[4] == 1)
+ var = sprite->data[0];
+ else
+ var = sprite->data[0];
+
+ gSprites[spriteId].pos2.y = Sin(var, sprite->data[2]) + sprite->data[2];
+ sprite->data[0] = (sprite->data[0] + sprite->data[1]) & 0xFF;
+}
+
+void nullsub_41(void)
+{
+}
+
+void sub_8010800(void)
+{
+ sub_8010874();
+ gBattleCommunication[1] = 0;
+ gBattleMainFunc = bc_8012FAC;
+}
+
+void sub_8010824(void)
+{
+ gBattleMainFunc();
+
+ for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ gBattleBankFunc[gActiveBank]();
+}
+
+void sub_8010874(void)
+{
+ s32 i;
+ u32 j;
+ u8 *r4;
+
+ TurnValuesCleanUp(0);
+ SpecialStatusesClear();
+
+ for (i = 0; i < 4; i++)
+ {
+ gStatuses3[i] = 0;
+
+ MEMSET_ALT(&gDisableStructs[i], 0, 0x1C, j, r4);
+ gDisableStructs[i].isFirstTurn= 2;
+ gUnknown_02024C70[i] = 0;
+ gLastUsedMove[i] = 0;
+ gMoveHitWith[i] = 0;
+ gUnknown_02024C44[i] = 0;
+ gUnknown_02024C4C[i] = 0;
+ gUnknown_02024C5C[i] = 0xFF;
+ gLockedMoves[i] = 0;
+ gUnknown_02024C2C[i] = 0;
+ eFlashFireArr.arr[i] = 0;
+ }
+
+ for (i = 0; i < 2; i++)
+ {
+ gSideAffecting[i] = 0;
+ MEMSET_ALT(&gSideTimers[i], 0, 12, j, r4);
+ }
+
+ gBankAttacker = 0;
+ gBankTarget = 0;
+ gBattleWeather = 0;
+
+ MEMSET_ALT(&gWishFutureKnock, 0, 0x2C, i, r4);
+
+ gHitMarker = 0;
+ if ((gBattleTypeFlags & BATTLE_TYPE_LINK) == 0 && gSaveBlock2.optionsBattleSceneOff == TRUE)
+ gHitMarker = HITMARKER_NO_ANIMATIONS;
+ ewram16084 = gSaveBlock2.optionsBattleStyle;
+ gMultiHitCounter = 0;
+ gBattleOutcome = 0;
+ gBattleExecBuffer = 0;
+ gPaydayMoney = 0;
+ ewram17130 = 0;
+ ewram17160 = 0;
+ for (i = 0; i < 8; i++)
+ gBattleCommunication[i] = 0;
+ gPauseCounterBattle = 0;
+ gBattleMoveDamage = 0;
+ gUnknown_02024DE8 = 0;
+ ewram16002 = 0;
+ ewram160A1 = 0;
+ gLeveledUpInBattle = 0;
+ gAbsentBankFlags = 0;
+ ewram16078 = 0;
+ ewram16086 = 0;
+ ewram16087 = 0;
+ ewram16089 = gBaseStats[GetMonData(&gEnemyParty[0], MON_DATA_SPECIES)].catchRate * 100 / 1275;
+ ewram16088 = 3;
+ ewram1601B = 0;
+ ewram16056 = 1;
+
+ for (i = 0; i < 8; i++)
+ {
+ ewram160ACarr(i) = 0;
+ ewram160CCarr(i) = 0;
+ ewram160E8arr(i) = 0;
+ ewram160F0arr(i) = 0;
+ ewram16100arr(i) = 0;
+ ewram16108arr(i) = 0;
+ }
+
+ ewram160C8 = 6;
+ ewram160C9 = 6;
+ ewram16113 = 0;
+ for (i = 0; i < 11; i++)
+ gBattleResults.unk36[i] = 0;
+ gBattleResults.battleTurnCounter = 0;
+ gBattleResults.playerFaintCounter = 0;
+ gBattleResults.opponentFaintCounter = 0;
+ gBattleResults.unk2 = 0;
+ gBattleResults.unk3 = 0;
+ gBattleResults.unk4 = 0;
+ gBattleResults.unk5_0 = 0;
+ gBattleResults.unk5_1 = 0;
+ gBattleResults.lastOpponentSpecies = 0;
+ gBattleResults.lastUsedMove = 0;
+ gBattleResults.opponentMove = 0;
+ gBattleResults.poke1Species = 0;
+ gBattleResults.opponentSpecies = 0;
+ gBattleResults.caughtPoke = 0;
+ for (i = 0; i < 10; i++)
+ {
+ gBattleResults.pokeString1[i] = 0;
+ gBattleResults.pokeString2[i] = 0;
+ gBattleResults.caughtNick[i] = 0;
+ }
+}
+
+void SwitchInClearStructs(void)
+{
+ struct DisableStruct sp0 = gDisableStructs[gActiveBank];
+ s32 i;
+ u8 *ptr;
+
+ if (gBattleMoves[gCurrentMove].effect != EFFECT_BATON_PASS)
+ {
+ for (i = 0; i < 8; i++)
+ gBattleMons[gActiveBank].statStages[i] = 6;
+ for (i = 0; i < gNoOfAllBanks; i++)
+ {
+ struct UnknownStruct12 *sp20 = &gUnknown_02024AD0[i];
+
+ if ((sp20->unk0 & 0x04000000) && gDisableStructs[i].bankPreventingEscape == gActiveBank)
+ sp20->unk0 &= ~0x04000000;
+ if ((gStatuses3[i] & STATUS3_ALWAYS_HITS) && gDisableStructs[i].bankWithSureHit == gActiveBank)
+ {
+ gStatuses3[i] &= ~STATUS3_ALWAYS_HITS;
+ gDisableStructs[i].bankWithSureHit = 0;
+ }
+ }
+ }
+ if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS)
+ {
+ gBattleMons[gActiveBank].status2 &= (STATUS2_CONFUSION | STATUS2_FOCUS_ENERGY | STATUS2_SUBSTITUTE | STATUS2_ESCAPE_PREVENTION | STATUS2_CURSED);
+ gStatuses3[gActiveBank] &= (STATUS3_LEECHSEED_BANK | STATUS3_LEECHSEED | STATUS3_ALWAYS_HITS | STATUS3_PERISH_SONG | STATUS3_ROOTED | STATUS3_MUDSPORT | STATUS3_WATERSPORT);
+
+ for (i = 0; i < gNoOfAllBanks; i++)
+ {
+ if (GetBankSide(gActiveBank) != GetBankSide(i)
+ && (gStatuses3[i] & STATUS3_ALWAYS_HITS) != 0
+ && (gDisableStructs[i].bankWithSureHit == gActiveBank))
+ {
+ gStatuses3[i] &= ~STATUS3_ALWAYS_HITS;
+ gStatuses3[i] |= 0x10;
+ }
+ }
+ }
+ else
+ {
+ gBattleMons[gActiveBank].status2 = 0;
+ gStatuses3[gActiveBank] = 0;
+ }
+
+ for (i = 0; i < gNoOfAllBanks; i++)
+ {
+ if (gUnknown_02024AD0[i].unk0 & (gBitTable[gActiveBank] << 16))
+ gUnknown_02024AD0[i].unk0 &= ~(gBitTable[gActiveBank] << 16);
+ if ((gUnknown_02024AD0[i].unk0 & 0xE000) && ewram16020arr(i) == gActiveBank)
+ gUnknown_02024AD0[i].unk0 &= ~0xE000;
+ }
+
+ gActionSelectionCursor[gActiveBank] = 0;
+ gMoveSelectionCursor[gActiveBank] = 0;
+
+ MEMSET_ALT(&gDisableStructs[gActiveBank], 0, 0x1C, i, ptr);
+
+ if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS)
+ {
+ gDisableStructs[gActiveBank].substituteHP = sp0.substituteHP;
+ gDisableStructs[gActiveBank].bankWithSureHit = sp0.bankWithSureHit;
+ gDisableStructs[gActiveBank].perishSong1 = sp0.perishSong1;
+ gDisableStructs[gActiveBank].perishSong2 = sp0.perishSong2;
+ }
+
+ gDisableStructs[gActiveBank].isFirstTurn= 2;
+ gLastUsedMove[gActiveBank] = 0;
+ gMoveHitWith[gActiveBank] = 0;
+ gUnknown_02024C44[gActiveBank] = 0;
+ gUnknown_02024C4C[gActiveBank] = 0;
+ gUnknown_02024C2C[gActiveBank] = 0;
+ gUnknown_02024C5C[gActiveBank] = 0xFF;
+
+ ewram160ACarr2(0, gActiveBank) = 0;
+ ewram160ACarr2(1, gActiveBank) = 0;
+ ewram16100arr2(0, gActiveBank) = 0;
+ ewram16100arr2(1, gActiveBank) = 0;
+ ewram16100arr2(2, gActiveBank) = 0;
+ ewram16100arr2(3, gActiveBank) = 0;
+ ewram160E8arr2(0, gActiveBank) = 0;
+ ewram160E8arr2(1, gActiveBank) = 0;
+
+ eFlashFireArr.arr[gActiveBank] = 0;
+
+ gCurrentMove = 0;
+}
+
+void UndoEffectsAfterFainting(void)
+{
+ s32 i;
+ u8 *ptr;
+
+ for (i = 0; i < 8; i++)
+ gBattleMons[gActiveBank].statStages[i] = 6;
+ gBattleMons[gActiveBank].status2 = 0;
+ gStatuses3[gActiveBank] = 0;
+ for (i = 0; i < gNoOfAllBanks; i++)
+ {
+ if ((gBattleMons[i].status2 & STATUS2_ESCAPE_PREVENTION) && gDisableStructs[i].bankPreventingEscape == gActiveBank)
+ gBattleMons[i].status2 &= ~STATUS2_ESCAPE_PREVENTION;
+ if (gBattleMons[i].status2 & (gBitTable[gActiveBank] << 16))
+ gBattleMons[i].status2 &= ~(gBitTable[gActiveBank] << 16);
+ if ((gBattleMons[i].status2 & STATUS2_WRAPPED) && ewram16020arr(i) == gActiveBank)
+ gBattleMons[i].status2 &= ~STATUS2_WRAPPED;
+ }
+ gActionSelectionCursor[gActiveBank] = 0;
+ gMoveSelectionCursor[gActiveBank] = 0;
+
+ MEMSET_ALT(&gDisableStructs[gActiveBank], 0, 0x1C, i, ptr);
+ gProtectStructs[gActiveBank].protected = 0;
+ gProtectStructs[gActiveBank].endured = 0;
+ gProtectStructs[gActiveBank].onlyStruggle = 0;
+ gProtectStructs[gActiveBank].helpingHand = 0;
+ gProtectStructs[gActiveBank].bounceMove = 0;
+ gProtectStructs[gActiveBank].stealMove = 0;
+ gProtectStructs[gActiveBank].flag0Unknown = 0;
+ gProtectStructs[gActiveBank].prlzImmobility = 0;
+ gProtectStructs[gActiveBank].confusionSelfDmg = 0;
+ gProtectStructs[gActiveBank].notEffective = 0;
+ gProtectStructs[gActiveBank].chargingTurn = 0;
+ gProtectStructs[gActiveBank].fleeFlag = 0;
+ gProtectStructs[gActiveBank].usedImprisionedMove = 0;
+ gProtectStructs[gActiveBank].loveImmobility = 0;
+ gProtectStructs[gActiveBank].usedDisabledMove = 0;
+ gProtectStructs[gActiveBank].usedTauntedMove = 0;
+ gProtectStructs[gActiveBank].flag2Unknown = 0;
+ gProtectStructs[gActiveBank].flinchImmobility = 0;
+ gProtectStructs[gActiveBank].notFirstStrike = 0;
+
+ gDisableStructs[gActiveBank].isFirstTurn= 2;
+ gLastUsedMove[gActiveBank] = 0;
+ gMoveHitWith[gActiveBank] = 0;
+ gUnknown_02024C44[gActiveBank] = 0;
+ gUnknown_02024C4C[gActiveBank] = 0;
+ gUnknown_02024C2C[gActiveBank] = 0;
+ gUnknown_02024C5C[gActiveBank] = 0xFF;
+
+ ewram160E8arr2(0, gActiveBank) = 0;
+ ewram160E8arr2(1, gActiveBank) = 0;
+ ewram160ACarr2(0, gActiveBank) = 0;
+ ewram160ACarr2(1, gActiveBank) = 0;
+ ewram16100arr2(0, gActiveBank) = 0;
+ ewram16100arr2(1, gActiveBank) = 0;
+ ewram16100arr2(2, gActiveBank) = 0;
+ ewram16100arr2(3, gActiveBank) = 0;
+
+ eFlashFireArr.arr[gActiveBank] = 0;
+
+ gBattleMons[gActiveBank].type1 = gBaseStats[gBattleMons[gActiveBank].species].type1;
+ gBattleMons[gActiveBank].type2 = gBaseStats[gBattleMons[gActiveBank].species].type2;
+}
+
+void bc_8012FAC(void)
+{
+ switch (gBattleCommunication[0])
+ {
+ case 0:
+ gActiveBank = gBattleCommunication[1];
+ EmitGetAttributes(0, 0, 0);
+ MarkBufferBankForExecution(gActiveBank);
+ gBattleCommunication[0]++;
+ break;
+ case 1:
+ if (gBattleExecBuffer == 0)
+ {
+ gBattleCommunication[1]++;
+ if (gBattleCommunication[1] == gNoOfAllBanks)
+ gBattleMainFunc = BattlePrepIntroSlide;
+ else
+ gBattleCommunication[0] = 0;
+ }
+ break;
+ }
+}
+
+static void BattlePrepIntroSlide(void)
+{
+ if (gBattleExecBuffer == 0)
+ {
+ gActiveBank = GetBankByIdentity(0);
+ EmitIntroSlide(0, gBattleTerrain);
+ MarkBufferBankForExecution(gActiveBank);
+ gBattleMainFunc = sub_8011384;
+ gBattleCommunication[0] = 0;
+ gBattleCommunication[1] = 0;
+ }
+}
+
+void sub_8011384(void)
+{
+ u8 *ptr;
+ s32 i;
+
+ if (gBattleExecBuffer == 0)
+ {
+ for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ {
+ if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI)
+ && GetBankSide(gActiveBank) == 0)
+ {
+ MEMSET_ALT(&gBattleMons[gActiveBank], 0, 0x58, i, ptr);
+ }
+ else
+ {
+ u8 r0;
+
+ 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);
+ r0 = GetBankSide(gActiveBank);
+ ewram160BC[r0] = gBattleMons[gActiveBank].hp;
+ for (i = 0; i < 8; i++)
+ gBattleMons[gActiveBank].statStages[i] = 6;
+ gBattleMons[gActiveBank].status2 = 0;
+ }
+
+ if (GetBankIdentity(gActiveBank) == 0)
+ {
+ EmitTrainerThrow(0);
+ MarkBufferBankForExecution(gActiveBank);
+ }
+
+ if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
+ {
+ if (GetBankIdentity(gActiveBank) == 1)
+ {
+ EmitTrainerThrow(0);
+ MarkBufferBankForExecution(gActiveBank);
+ }
+ if (GetBankSide(gActiveBank) == 1
+ && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)))
+ GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), 2);
+ }
+ else
+ {
+ if (GetBankSide(gActiveBank) == 1
+ && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)))
+ {
+ GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), 2);
+ EmitLoadPokeSprite(0);
+ MarkBufferBankForExecution(gActiveBank);
+ }
+ }
+
+ if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ {
+ if (GetBankIdentity(gActiveBank) == 2
+ || GetBankIdentity(gActiveBank) == 3)
+ {
+ EmitTrainerThrow(0);
+ MarkBufferBankForExecution(gActiveBank);
+ }
+ }
+ }
+ gBattleMainFunc = bc_801333C;
+ }
+}
+
+void bc_801333C(void)
+{
+ s32 i;
+
+ if (gBattleExecBuffer == 0)
+ {
+ struct HpAndStatus hpStatus[6];
+
+ if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
+ {
+ for (i = 0; i < 6; i++)
+ {
+ if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == 0
+ || GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_EGG)
+ {
+ hpStatus[i].hp = 0xFFFF;
+ hpStatus[i].status = 0;
+ }
+ else
+ {
+ hpStatus[i].hp = GetMonData(&gEnemyParty[i], MON_DATA_HP);
+ hpStatus[i].status = GetMonData(&gEnemyParty[i], MON_DATA_STATUS);
+ }
+ }
+ gActiveBank = GetBankByIdentity(1);
+ EmitDrawPartyStatusSummary(0, hpStatus, 0x80);
+ MarkBufferBankForExecution(gActiveBank);
+
+ for (i = 0; i < 6; i++)
+ {
+ if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == 0
+ || GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_EGG)
+ {
+ hpStatus[i].hp = 0xFFFF;
+ hpStatus[i].status = 0;
+ }
+ else
+ {
+ hpStatus[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP);
+ hpStatus[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS);
+ }
+ }
+ gActiveBank = GetBankByIdentity(0);
+ EmitDrawPartyStatusSummary(0, hpStatus, 0x80);
+ MarkBufferBankForExecution(gActiveBank);
+
+ gBattleMainFunc = bc_battle_begin_message;
+ }
+ else
+ {
+ // The array gets set here, but nothing is ever done with it.
+ // Likely unfinished code.
+
+ for (i = 0; i < 6; i++)
+ {
+ if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == 0
+ || GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_EGG)
+ {
+ hpStatus[i].hp = 0xFFFF;
+ hpStatus[i].status = 0;
+ }
+ else
+ {
+ hpStatus[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP);
+ hpStatus[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS);
+ }
+ }
+
+ gBattleMainFunc = bc_8013568;
+ }
+ }
+}
+
+void bc_battle_begin_message(void)
+{
+ if (gBattleExecBuffer == 0)
+ {
+ gActiveBank = GetBankByIdentity(1);
+ PrepareStringBattle(0, gActiveBank);
+ gBattleMainFunc = sub_8011800;
+ }
+}
+
+void bc_8013568(void)
+{
+ if (gBattleExecBuffer == 0)
+ {
+ gBattleMainFunc = sub_8011970;
+ PrepareStringBattle(0, 0);
+ }
+}
+
+void sub_8011800(void)
+{
+ if (gBattleExecBuffer == 0)
+ {
+ PrepareStringBattle(1, GetBankByIdentity(1));
+ gBattleMainFunc = sub_8011834;
+ }
+}
+
+void sub_8011834(void)
+{
+ if (gBattleExecBuffer == 0)
+ {
+ for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ {
+ if (GetBankIdentity(gActiveBank) == 1)
+ {
+ EmitTrainerBallThrow(0);
+ MarkBufferBankForExecution(gActiveBank);
+ }
+ if ((gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ && GetBankIdentity(gActiveBank) == 3)
+ {
+ EmitTrainerBallThrow(0);
+ MarkBufferBankForExecution(gActiveBank);
+ }
+ }
+ gBattleMainFunc = bc_801362C;
+ }
+}
+
+void bc_801362C(void)
+{
+ if (gBattleExecBuffer == 0)
+ {
+ for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ {
+ if (GetBankSide(gActiveBank) == 1
+ && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)))
+ GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), 2);
+ }
+ gBattleMainFunc = sub_8011970;
+ }
+}
+
+void unref_sub_8011950(void)
+{
+ if (gBattleExecBuffer == 0)
+ gBattleMainFunc = sub_8011970;
+}
+
+void sub_8011970(void)
+{
+ if (gBattleExecBuffer == 0)
+ {
+ if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI))
+ PrepareStringBattle(1, GetBankByIdentity(0));
+ gBattleMainFunc = sub_80119B4;
+ }
+}
+
+void sub_80119B4(void)
+{
+ if (gBattleExecBuffer == 0)
+ {
+ for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ {
+ if (GetBankIdentity(gActiveBank) == 0)
+ {
+ EmitTrainerBallThrow(0);
+ MarkBufferBankForExecution(gActiveBank);
+ }
+ if ((gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ && GetBankIdentity(gActiveBank) == 2)
+ {
+ EmitTrainerBallThrow(0);
+ MarkBufferBankForExecution(gActiveBank);
+ }
+ }
+ ewram16058 = 0;
+ ewram160F9 = 0;
+ ewram160E6 = 0;
+ gBattleMainFunc = BattleBeginFirstTurn;
+ }
+}
+
+void unref_sub_8011A68(void)
+{
+ if (gBattleExecBuffer == 0)
+ {
+ for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ {
+ if (GetBankSide(gActiveBank) == 0)
+ {
+ EmitSendOutPoke(0, gBattlePartyID[gActiveBank], 0);
+ MarkBufferBankForExecution(gActiveBank);
+ }
+ }
+ ewram16058 = 0;
+ ewram160F9 = 0;
+ ewram160E6 = 0;
+ gBattleMainFunc = BattleBeginFirstTurn;
+ }
+}
+
+void BattleBeginFirstTurn(void)
+{
+ s32 i;
+ s32 j;
+ u8 r9 = 0;
+
+ if (gBattleExecBuffer == 0)
+ {
+ if (ewram16058 == 0)
+ {
+ for (i = 0; i < gNoOfAllBanks; i++)
+ gBanksByTurnOrder[i] = i;
+ for (i = 0; i < gNoOfAllBanks - 1; i++)
+ {
+ for (j = i + 1; j < gNoOfAllBanks; j++)
+ {
+ if (GetWhoStrikesFirst(gBanksByTurnOrder[i], gBanksByTurnOrder[j], 1) != 0)
+ SwapTurnOrder(i, j);
+ }
+ }
+ }
+ if (ewram160E6 == 0 && AbilityBattleEffects(0, 0, 0, 0xFF, 0) != 0)
+ {
+ ewram160E6 = 1;
+ return;
+ }
+ while (ewram16058 < gNoOfAllBanks)
+ {
+ if (AbilityBattleEffects(0, gBanksByTurnOrder[ewram16058], 0, 0, 0) != 0)
+ r9++;
+ ewram16058++;
+ if (r9 != 0)
+ return;
+ }
+ if (AbilityBattleEffects(9, 0, 0, 0, 0) != 0)
+ return;
+ if (AbilityBattleEffects(11, 0, 0, 0, 0) != 0)
+ return;
+ while (ewram160F9 < gNoOfAllBanks)
+ {
+ if (ItemBattleEffects(0, gBanksByTurnOrder[ewram160F9], 0) != 0)
+ r9++;
+ ewram160F9++;
+ if (r9 != 0)
+ return;
+ }
+ // Absolutely pointless for-loop that somehow doesn't get optimized out
+ for (i = 0; i < gNoOfAllBanks; i++)
+ ;
+ for (i = 0; i < 4; i++)
+ {
+ ewram16068arr(i) = 6;
+ gActionForBanks[i] = 0xFF;
+ gChosenMovesByBanks[i] = 0;
+ }
+ TurnValuesCleanUp(0);
+ SpecialStatusesClear();
+ ewram160A6 = gAbsentBankFlags;
+ gBattleMainFunc = sub_8012324;
+ ResetSentPokesToOpponentValue();
+ for (i = 0; i < 8; i++)
+ gBattleCommunication[i] = 0;
+ for (i = 0; i < gNoOfAllBanks; i++)
+ gBattleMons[i].status2 &= ~8;
+ ewram16000 = 0;
+ ewram16001 = 0;
+ ewram16110 = 0;
+ ewram16111 = 0;
+ ewram1600C = 0;
+ ewram16059 = 0;
+ ewram1600E = 0;
+ gBattleMoveFlags = 0;
+ gRandomTurnNumber = Random();
+ }
+}
+
+void bc_8013B1C(void)
+{
+ s32 i;
+
+ if (gBattleExecBuffer == 0)
+ {
+ gBattleMainFunc = BattleTurnPassed;
+ for (i = 0; i < 8; i++)
+ gBattleCommunication[i] = 0;
+ for (i = 0; i < gNoOfAllBanks; i++)
+ {
+ gBattleMons[i].status2 &= ~8;
+ if ((gBattleMons[i].status1 & 7) && (gBattleMons[i].status2 & 0x1000))
+ CancelMultiTurnMoves(i);
+ }
+ ewram16000 = 0;
+ ewram16001 = 0;
+ ewram16110 = 0;
+ ewram16111 = 0;
+ ewram1600E = 0;
+ gBattleMoveFlags = 0;
+ }
+}
+
+void BattleTurnPassed(void)
+{
+ s32 i;
+
+ TurnValuesCleanUp(1);
+ if (gBattleOutcome == 0)
+ {
+ if (UpdateTurnCounters() != 0)
+ return;
+ if (TurnBasedEffects() != 0)
+ return;
+ }
+ if (HandleFaintedMonActions() != 0)
+ return;
+ ewram16059 = 0;
+ if (HandleWishPerishSongOnTurnEnd() != 0)
+ return;
+ TurnValuesCleanUp(0);
+ gHitMarker &= ~HITMARKER_NO_ATTACKSTRING;
+ gHitMarker &= ~0x80000;
+ gHitMarker &= ~0x400000;
+ gHitMarker &= ~0x100000;
+ ewram16002 = 0;
+ ewram160A1 = 0;
+ ewram1600C = 0;
+ gBattleMoveDamage = 0;
+ gBattleMoveFlags = 0;
+ for (i = 0; i < 5; i++)
+ gBattleCommunication[i] = 0;
+ if (gBattleOutcome != 0)
+ {
+ gCurrentActionFuncId = 12;
+ gBattleMainFunc = RunTurnActionsFunctions;
+ return;
+ }
+ if (gBattleResults.battleTurnCounter < 0xFF)
+ gBattleResults.battleTurnCounter++;
+ for (i = 0; i < gNoOfAllBanks; i++)
+ {
+ gActionForBanks[i] = 0xFF;
+ gChosenMovesByBanks[i] = 0;
+ }
+ for (i = 0; i < 4; i++)
+ ewram16068arr(i) = 6;
+ ewram160A6 = gAbsentBankFlags;
+ gBattleMainFunc = sub_8012324;
+ gRandomTurnNumber = Random();
+}
+
+u8 CanRunFromBattle(void)
+{
+ u8 r2;
+ u8 r6;
+ s32 i;
+
+ if (gBattleMons[gActiveBank].item == ITEM_ENIGMA_BERRY)
+ r2 = gEnigmaBerries[gActiveBank].holdEffect;
+ else
+ r2 = ItemId_GetHoldEffect(gBattleMons[gActiveBank].item);
+ gStringBank = gActiveBank;
+ if (r2 == HOLD_EFFECT_CAN_ALWAYS_RUN)
+ return 0;
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ return 0;
+ if (gBattleMons[gActiveBank].ability == ABILITY_RUN_AWAY)
+ return 0;
+ r6 = GetBankSide(gActiveBank);
+ for (i = 0; i < gNoOfAllBanks; i++)
+ {
+ if (r6 != GetBankSide(i)
+ && gBattleMons[i].ability == ABILITY_SHADOW_TAG)
+ {
+ ewram16003 = i;
+ gLastUsedAbility = gBattleMons[i].ability;
+ gBattleCommunication[5] = 2;
+ return 2;
+ }
+ if (r6 != GetBankSide(i)
+ && gBattleMons[gActiveBank].ability != ABILITY_LEVITATE
+ && gBattleMons[gActiveBank].type1 != 2
+ && gBattleMons[gActiveBank].type2 != 2
+ && gBattleMons[i].ability == ABILITY_ARENA_TRAP)
+ {
+ ewram16003 = i;
+ gLastUsedAbility = gBattleMons[i].ability;
+ gBattleCommunication[5] = 2;
+ return 2;
+ }
+ }
+ i = AbilityBattleEffects(15, gActiveBank, ABILITY_MAGNET_PULL, 0, 0);
+ if (i != 0 && (gBattleMons[gActiveBank].type1 == 8 || gBattleMons[gActiveBank].type2 == 8))
+ {
+ ewram16003 = i - 1;
+ gLastUsedAbility = gBattleMons[i - 1].ability;
+ gBattleCommunication[5] = 2;
+ return 2;
+ }
+ if ((gBattleMons[gActiveBank].status2 & (STATUS2_ESCAPE_PREVENTION | STATUS2_WRAPPED)) || (gStatuses3[gActiveBank] & STATUS3_ROOTED))
+ {
+ gBattleCommunication[5] = 0;
+ return 1;
+ }
+ if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)
+ {
+ gBattleCommunication[5] = 1;
+ return 1;
+ }
+ return 0;
+}
+
+void sub_8012258(u8 a)
+{
+ s32 i;
+ u8 r4;
+ u8 r1;
+
+ for (i = 0; i < 3; i++)
+ gUnknown_02038470[i] = ewram1606Carr(i, a);
+ r4 = pokemon_order_func(gBattlePartyID[a]);
+ r1 = pokemon_order_func(ewram16068arr(a));
+ sub_8094C98(r4, r1);
+ if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
+ {
+ for (i = 0; i < 3; i++)
+ {
+ ewram1606Carr(i, a) = gUnknown_02038470[i];
+ ewram1606Carr(i, (a ^ 2)) = gUnknown_02038470[i];
+ }
+ }
+ else
+ {
+ for (i = 0; i < 3; i++)
+ {
+ ewram1606Carr(i, a) = gUnknown_02038470[i];
+ }
+ }
+}
+
+/*
+void sub_8012324(void)
+{
+ u8 r5;
+
+ gBattleCommunication[4] = 0;
+ // inverted loop
+ //_0801234C
+ for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ {
+ r5 = GetBankIdentity(gActiveBank);
+ switch (gBattleCommunication[gActiveBank])
+ {
+ case 0:
+ ewram16068arr(gActiveBank) = 6;
+ if (!(gBattleTypeFlags & 0x40)
+ && (r5 & 2)
+ && !(ewram160A6 & gBitTable[GetBankByIdentity(r5 ^ 2)])
+ && gBattleCommunication[GetBankByIdentity(r5)] != 4)
+ break;
+ //_080123F8
+ if (ewram160A6 & gBitTable[gActiveBank])
+ {
+ gActionForBanks[gActiveBank] = 13;
+ if (!(gBattleTypeFlags & 0x40))
+ gBattleCommunication[gActiveBank] = 4;
+ //_08012454
+ else
+ gBattleCommunication[gActiveBank] = 3;
+ break;
+ }
+ //_08012468
+ if ((gBattleMons[gActiveBank].status2 & 0x1000)
+ || (gBattleMons[gActiveBank].status2 & 0x10000000))
+ {
+ gActionForBanks[gActiveBank] = 0;
+ gBattleCommunication[gActiveBank] = 3;
+ }
+ else
+ {
+ Emitcmd18(0, gActionForBanks[0], gBattleBufferB[0][1] | (gBattleBufferB[0][2] << 8));
+ MarkBufferBankForExecution(gActiveBank);
+ gBattleCommunication[gActiveBank]++;
+ }
+ break;
+ case 1:
+ }
+ }
+}
+*/
+__attribute__((naked))
+void sub_8012324(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, 0x1C\n\
+ ldr r0, _08012340 @ =gBattleCommunication\n\
+ movs r1, 0\n\
+ strb r1, [r0, 0x4]\n\
+ ldr r0, _08012344 @ =gActiveBank\n\
+ strb r1, [r0]\n\
+ ldr r0, _08012348 @ =gNoOfAllBanks\n\
+ bl _08012F74\n\
+ .align 2, 0\n\
+_08012340: .4byte gBattleCommunication\n\
+_08012344: .4byte gActiveBank\n\
+_08012348: .4byte gNoOfAllBanks\n\
+_0801234C:\n\
+ ldr r4, _08012374 @ =gActiveBank\n\
+ ldrb r0, [r4]\n\
+ bl GetBankIdentity\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ ldr r1, _08012378 @ =gBattleCommunication\n\
+ ldrb r0, [r4]\n\
+ adds r0, r1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0x6\n\
+ bls _08012368\n\
+ bl _08012F66\n\
+_08012368:\n\
+ lsls r0, 2\n\
+ ldr r1, _0801237C @ =_08012380\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .align 2, 0\n\
+_08012374: .4byte gActiveBank\n\
+_08012378: .4byte gBattleCommunication\n\
+_0801237C: .4byte _08012380\n\
+ .align 2, 0\n\
+_08012380:\n\
+ .4byte _0801239C\n\
+ .4byte _080124C8\n\
+ .4byte _08012A28\n\
+ .4byte _08012DA8\n\
+ .4byte _08012E50\n\
+ .4byte _08012E94\n\
+ .4byte _08012F38\n\
+_0801239C:\n\
+ ldr r4, _08012434 @ =gSharedMem\n\
+ ldr r0, _08012438 @ =gActiveBank\n\
+ ldrb r0, [r0]\n\
+ ldr r1, _0801243C @ =0x00016068\n\
+ adds r0, r1\n\
+ adds r0, r4\n\
+ movs r1, 0x6\n\
+ strb r1, [r0]\n\
+ ldr r0, _08012440 @ =gBattleTypeFlags\n\
+ ldrh r1, [r0]\n\
+ movs r0, 0x40\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _080123F8\n\
+ movs r1, 0x2\n\
+ movs r0, 0x2\n\
+ ands r0, r5\n\
+ cmp r0, 0\n\
+ beq _080123F8\n\
+ eors r5, r1\n\
+ adds r0, r5, 0\n\
+ bl GetBankByIdentity\n\
+ ldr r2, _08012444 @ =0x000160a6\n\
+ adds r1, r4, r2\n\
+ ldrb r1, [r1]\n\
+ ldr r2, _08012448 @ =gBitTable\n\
+ lsls r0, 24\n\
+ lsrs r0, 22\n\
+ adds r0, r2\n\
+ ldr r0, [r0]\n\
+ ands r1, r0\n\
+ cmp r1, 0\n\
+ bne _080123F8\n\
+ ldr r4, _0801244C @ =gBattleCommunication\n\
+ adds r0, r5, 0\n\
+ bl GetBankByIdentity\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ adds r0, r4\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0x4\n\
+ beq _080123F8\n\
+ bl _08012F66\n\
+_080123F8:\n\
+ ldr r0, _08012434 @ =gSharedMem\n\
+ ldr r3, _08012444 @ =0x000160a6\n\
+ adds r0, r3\n\
+ ldrb r3, [r0]\n\
+ ldr r1, _08012448 @ =gBitTable\n\
+ ldr r4, _08012438 @ =gActiveBank\n\
+ ldrb r2, [r4]\n\
+ lsls r0, r2, 2\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ ands r3, r0\n\
+ cmp r3, 0\n\
+ beq _08012468\n\
+ ldr r0, _08012450 @ =gActionForBanks\n\
+ adds r0, r2, r0\n\
+ movs r1, 0xD\n\
+ strb r1, [r0]\n\
+ ldr r0, _08012440 @ =gBattleTypeFlags\n\
+ ldrh r1, [r0]\n\
+ movs r0, 0x40\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _08012454\n\
+ ldr r0, _0801244C @ =gBattleCommunication\n\
+ ldrb r1, [r4]\n\
+ adds r1, r0\n\
+ movs r0, 0x4\n\
+ strb r0, [r1]\n\
+ bl _08012F66\n\
+ .align 2, 0\n\
+_08012434: .4byte gSharedMem\n\
+_08012438: .4byte gActiveBank\n\
+_0801243C: .4byte 0x00016068\n\
+_08012440: .4byte gBattleTypeFlags\n\
+_08012444: .4byte 0x000160a6\n\
+_08012448: .4byte gBitTable\n\
+_0801244C: .4byte gBattleCommunication\n\
+_08012450: .4byte gActionForBanks\n\
+_08012454:\n\
+ ldr r0, _08012464 @ =gBattleCommunication\n\
+ ldrb r1, [r4]\n\
+ adds r1, r0\n\
+ movs r0, 0x3\n\
+ strb r0, [r1]\n\
+ bl _08012F66\n\
+ .align 2, 0\n\
+_08012464: .4byte gBattleCommunication\n\
+_08012468:\n\
+ ldr r1, _0801249C @ =gBattleMons\n\
+ movs r0, 0x58\n\
+ muls r0, r2\n\
+ adds r1, 0x50\n\
+ adds r0, r1\n\
+ ldr r1, [r0]\n\
+ movs r0, 0x80\n\
+ lsls r0, 5\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _08012488\n\
+ movs r0, 0x80\n\
+ lsls r0, 15\n\
+ ands r1, r0\n\
+ cmp r1, 0\n\
+ beq _080124A8\n\
+_08012488:\n\
+ ldr r0, _080124A0 @ =gActionForBanks\n\
+ adds r0, r2, r0\n\
+ strb r3, [r0]\n\
+ ldr r1, _080124A4 @ =gBattleCommunication\n\
+ ldrb r0, [r4]\n\
+ adds r0, r1\n\
+ movs r1, 0x3\n\
+ strb r1, [r0]\n\
+ bl _08012F66\n\
+ .align 2, 0\n\
+_0801249C: .4byte gBattleMons\n\
+_080124A0: .4byte gActionForBanks\n\
+_080124A4: .4byte gBattleCommunication\n\
+_080124A8:\n\
+ ldr r0, _080124C0 @ =gActionForBanks\n\
+ ldrb r1, [r0]\n\
+ ldr r0, _080124C4 @ =gBattleBufferB\n\
+ ldrb r2, [r0, 0x1]\n\
+ ldrb r0, [r0, 0x2]\n\
+ lsls r0, 8\n\
+ orrs r2, r0\n\
+ movs r0, 0\n\
+ bl Emitcmd18\n\
+ bl _08012E32\n\
+ .align 2, 0\n\
+_080124C0: .4byte gActionForBanks\n\
+_080124C4: .4byte gBattleBufferB\n\
+_080124C8:\n\
+ ldr r4, _08012520 @ =gBattleExecBuffer\n\
+ ldr r1, _08012524 @ =gBitTable\n\
+ ldr r3, _08012528 @ =gActiveBank\n\
+ ldrb r5, [r3]\n\
+ lsls r0, r5, 2\n\
+ adds r0, r1\n\
+ ldr r2, [r0]\n\
+ lsls r0, r2, 4\n\
+ movs r1, 0xF0\n\
+ lsls r1, 24\n\
+ orrs r0, r1\n\
+ orrs r0, r2\n\
+ lsls r1, r2, 8\n\
+ orrs r0, r1\n\
+ lsls r2, 12\n\
+ orrs r0, r2\n\
+ ldr r1, [r4]\n\
+ ands r1, r0\n\
+ mov r8, r3\n\
+ cmp r1, 0\n\
+ beq _080124F6\n\
+ bl _08012F66\n\
+_080124F6:\n\
+ ldr r2, _0801252C @ =gActionForBanks\n\
+ adds r2, r5, r2\n\
+ ldr r1, _08012530 @ =gBattleBufferB\n\
+ lsls r0, r5, 9\n\
+ adds r1, 0x1\n\
+ adds r0, r1\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r2]\n\
+ ldrb r0, [r3]\n\
+ lsls r0, 9\n\
+ adds r0, r1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0xC\n\
+ bls _08012514\n\
+ b _08012968\n\
+_08012514:\n\
+ lsls r0, 2\n\
+ ldr r1, _08012534 @ =_08012538\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .align 2, 0\n\
+_08012520: .4byte gBattleExecBuffer\n\
+_08012524: .4byte gBitTable\n\
+_08012528: .4byte gActiveBank\n\
+_0801252C: .4byte gActionForBanks\n\
+_08012530: .4byte gBattleBufferB\n\
+_08012534: .4byte _08012538\n\
+ .align 2, 0\n\
+_08012538:\n\
+ .4byte _0801256C\n\
+ .4byte _080126B4\n\
+ .4byte _080126E0\n\
+ .4byte _08012968\n\
+ .4byte _08012968\n\
+ .4byte _080128B0\n\
+ .4byte _08012908\n\
+ .4byte _08012968\n\
+ .4byte _08012968\n\
+ .4byte _08012968\n\
+ .4byte _08012968\n\
+ .4byte _08012968\n\
+ .4byte _0801292C\n\
+_0801256C:\n\
+ bl AreAllMovesUnusable\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _080125D0\n\
+ ldr r0, _080125B4 @ =gBattleCommunication\n\
+ ldr r2, _080125B8 @ =gActiveBank\n\
+ ldrb r1, [r2]\n\
+ adds r1, r0\n\
+ movs r4, 0\n\
+ movs r0, 0x5\n\
+ strb r0, [r1]\n\
+ ldr r3, _080125BC @ =gSharedMem\n\
+ ldrb r0, [r2]\n\
+ ldr r1, _080125C0 @ =0x00016060\n\
+ adds r0, r1\n\
+ adds r0, r3\n\
+ strb r4, [r0]\n\
+ ldrb r0, [r2]\n\
+ ldr r4, _080125C4 @ =0x00016094\n\
+ adds r0, r4\n\
+ adds r0, r3\n\
+ movs r1, 0x3\n\
+ strb r1, [r0]\n\
+ ldrb r1, [r2]\n\
+ ldr r0, _080125C8 @ =0x00016010\n\
+ adds r2, r1, r0\n\
+ adds r2, r3\n\
+ ldr r0, _080125CC @ =gBattleBufferB\n\
+ lsls r1, 9\n\
+ adds r0, 0x3\n\
+ adds r1, r0\n\
+ ldrb r0, [r1]\n\
+ strb r0, [r2]\n\
+ bl _08012F90\n\
+ .align 2, 0\n\
+_080125B4: .4byte gBattleCommunication\n\
+_080125B8: .4byte gActiveBank\n\
+_080125BC: .4byte gSharedMem\n\
+_080125C0: .4byte 0x00016060\n\
+_080125C4: .4byte 0x00016094\n\
+_080125C8: .4byte 0x00016010\n\
+_080125CC: .4byte gBattleBufferB\n\
+_080125D0:\n\
+ ldr r1, _080125FC @ =gDisableStructs\n\
+ ldr r5, _08012600 @ =gActiveBank\n\
+ ldrb r4, [r5]\n\
+ lsls r0, r4, 3\n\
+ subs r0, r4\n\
+ lsls r0, 2\n\
+ adds r0, r1\n\
+ ldrh r2, [r0, 0x6]\n\
+ cmp r2, 0\n\
+ beq _0801260C\n\
+ ldr r1, _08012604 @ =gChosenMovesByBanks\n\
+ lsls r0, r4, 1\n\
+ adds r0, r1\n\
+ strh r2, [r0]\n\
+ ldr r1, _08012608 @ =gBattleCommunication\n\
+ ldrb r0, [r5]\n\
+ adds r0, r1\n\
+ movs r1, 0x3\n\
+ strb r1, [r0]\n\
+ bl _08012F90\n\
+ .align 2, 0\n\
+_080125FC: .4byte gDisableStructs\n\
+_08012600: .4byte gActiveBank\n\
+_08012604: .4byte gChosenMovesByBanks\n\
+_08012608: .4byte gBattleCommunication\n\
+_0801260C:\n\
+ add r2, sp, 0x4\n\
+ ldr r3, _080126AC @ =gBattleMons\n\
+ movs r1, 0x58\n\
+ adds r0, r4, 0\n\
+ muls r0, r1\n\
+ adds r0, r3\n\
+ ldrh r0, [r0]\n\
+ strh r0, [r2, 0x10]\n\
+ ldrb r0, [r5]\n\
+ muls r0, r1\n\
+ adds r0, r3\n\
+ adds r0, 0x21\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r2, 0x12]\n\
+ ldrb r0, [r5]\n\
+ muls r0, r1\n\
+ adds r0, r3\n\
+ adds r0, 0x22\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r2, 0x13]\n\
+ movs r4, 0\n\
+ mov r1, sp\n\
+ adds r1, 0xC\n\
+ str r1, [sp, 0x18]\n\
+ add r2, sp, 0x10\n\
+ mov r10, r2\n\
+ mov r8, r3\n\
+ adds r7, r5, 0\n\
+ movs r6, 0x58\n\
+ movs r3, 0xC\n\
+ add r3, r8\n\
+ mov r9, r3\n\
+ add r5, sp, 0x4\n\
+_0801264E:\n\
+ lsls r2, r4, 1\n\
+ ldrb r0, [r7]\n\
+ muls r0, r6\n\
+ adds r0, r2, r0\n\
+ add r0, r9\n\
+ ldrh r0, [r0]\n\
+ strh r0, [r5]\n\
+ ldr r0, [sp, 0x18]\n\
+ adds r3, r0, r4\n\
+ ldrb r0, [r7]\n\
+ muls r0, r6\n\
+ adds r0, r4, r0\n\
+ mov r1, r8\n\
+ adds r1, 0x24\n\
+ adds r0, r1\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r3]\n\
+ ldrb r0, [r7]\n\
+ adds r1, r0, 0\n\
+ muls r1, r6\n\
+ adds r2, r1\n\
+ add r2, r9\n\
+ ldrh r0, [r2]\n\
+ add r1, r8\n\
+ adds r1, 0x3B\n\
+ ldrb r1, [r1]\n\
+ lsls r2, r4, 24\n\
+ lsrs r2, 24\n\
+ bl CalculatePPWithBonus\n\
+ mov r2, r10\n\
+ adds r1, r2, r4\n\
+ strb r0, [r1]\n\
+ adds r5, 0x2\n\
+ adds r4, 0x1\n\
+ cmp r4, 0x3\n\
+ ble _0801264E\n\
+ ldr r0, _080126B0 @ =gBattleTypeFlags\n\
+ ldrb r0, [r0]\n\
+ movs r1, 0x1\n\
+ ands r1, r0\n\
+ movs r0, 0\n\
+ movs r2, 0\n\
+ add r3, sp, 0x4\n\
+ bl Emitcmd20\n\
+ b _0801289E\n\
+ .align 2, 0\n\
+_080126AC: .4byte gBattleMons\n\
+_080126B0: .4byte gBattleTypeFlags\n\
+_080126B4:\n\
+ ldr r0, _080126D0 @ =gBattleTypeFlags\n\
+ ldrh r1, [r0]\n\
+ ldr r0, _080126D4 @ =0x00000902\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _080126C2\n\
+ b _08012908\n\
+_080126C2:\n\
+ ldr r1, _080126D8 @ =gUnknown_02024C1C\n\
+ mov r3, r8\n\
+ ldrb r0, [r3]\n\
+ lsls r0, 2\n\
+ adds r0, r1\n\
+ ldr r1, _080126DC @ =BattleScript_ActionSelectionItemsCantBeUsed\n\
+ b _080129CC\n\
+ .align 2, 0\n\
+_080126D0: .4byte gBattleTypeFlags\n\
+_080126D4: .4byte 0x00000902\n\
+_080126D8: .4byte gUnknown_02024C1C\n\
+_080126DC: .4byte BattleScript_ActionSelectionItemsCantBeUsed\n\
+_080126E0:\n\
+ ldr r3, _08012738 @ =gSharedMem\n\
+ ldr r5, _0801273C @ =gActiveBank\n\
+ ldrb r0, [r5]\n\
+ ldr r4, _08012740 @ =0x00016064\n\
+ adds r1, r0, r4\n\
+ adds r1, r3\n\
+ ldr r2, _08012744 @ =gBattlePartyID\n\
+ lsls r0, 1\n\
+ adds r0, r2\n\
+ ldrh r0, [r0]\n\
+ strb r0, [r1]\n\
+ ldr r7, _08012748 @ =gBattleMons\n\
+ ldrb r2, [r5]\n\
+ movs r6, 0x58\n\
+ adds r0, r2, 0\n\
+ muls r0, r6\n\
+ adds r1, r7, 0\n\
+ adds r1, 0x50\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ ldr r1, _0801274C @ =0x0400e000\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _08012722\n\
+ ldr r0, _08012750 @ =gStatuses3\n\
+ lsls r1, r2, 2\n\
+ adds r1, r0\n\
+ ldr r1, [r1]\n\
+ movs r0, 0x80\n\
+ lsls r0, 3\n\
+ ands r1, r0\n\
+ cmp r1, 0\n\
+ beq _08012758\n\
+_08012722:\n\
+ lsls r0, r2, 1\n\
+ adds r0, r2\n\
+ ldr r2, _08012754 @ =0x0001606c\n\
+ adds r1, r3, r2\n\
+ adds r0, r1\n\
+ str r0, [sp]\n\
+ movs r0, 0\n\
+ movs r1, 0x2\n\
+ movs r2, 0x6\n\
+ b _0801286C\n\
+ .align 2, 0\n\
+_08012738: .4byte gSharedMem\n\
+_0801273C: .4byte gActiveBank\n\
+_08012740: .4byte 0x00016064\n\
+_08012744: .4byte gBattlePartyID\n\
+_08012748: .4byte gBattleMons\n\
+_0801274C: .4byte 0x0400e000\n\
+_08012750: .4byte gStatuses3\n\
+_08012754: .4byte 0x0001606c\n\
+_08012758:\n\
+ str r1, [sp]\n\
+ movs r0, 0xC\n\
+ adds r1, r2, 0\n\
+ movs r2, 0x17\n\
+ movs r3, 0\n\
+ bl AbilityBattleEffects\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ cmp r4, 0\n\
+ bne _080127E0\n\
+ ldrb r1, [r5]\n\
+ str r4, [sp]\n\
+ movs r0, 0xC\n\
+ movs r2, 0x47\n\
+ movs r3, 0\n\
+ bl AbilityBattleEffects\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ cmp r4, 0\n\
+ beq _080127A8\n\
+ ldrb r0, [r5]\n\
+ muls r0, r6\n\
+ adds r1, r0, r7\n\
+ adds r0, r1, 0\n\
+ adds r0, 0x21\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0x2\n\
+ beq _080127A8\n\
+ adds r0, r1, 0\n\
+ adds r0, 0x22\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0x2\n\
+ beq _080127A8\n\
+ adds r0, r1, 0\n\
+ adds r0, 0x20\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0x1A\n\
+ bne _080127E0\n\
+_080127A8:\n\
+ ldr r5, _08012808 @ =gActiveBank\n\
+ ldrb r1, [r5]\n\
+ movs r0, 0\n\
+ str r0, [sp]\n\
+ movs r0, 0xF\n\
+ movs r2, 0x2A\n\
+ movs r3, 0\n\
+ bl AbilityBattleEffects\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ cmp r4, 0\n\
+ beq _08012818\n\
+ ldr r2, _0801280C @ =gBattleMons\n\
+ ldrb r1, [r5]\n\
+ movs r0, 0x58\n\
+ muls r0, r1\n\
+ adds r1, r0, r2\n\
+ adds r0, r1, 0\n\
+ adds r0, 0x21\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0x8\n\
+ beq _080127E0\n\
+ adds r0, r1, 0\n\
+ adds r0, 0x22\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0x8\n\
+ bne _08012818\n\
+_080127E0:\n\
+ subs r1, r4, 0x1\n\
+ lsls r1, 4\n\
+ movs r0, 0x4\n\
+ orrs r1, r0\n\
+ lsls r1, 24\n\
+ lsrs r1, 24\n\
+ ldr r0, _08012810 @ =gLastUsedAbility\n\
+ ldrb r3, [r0]\n\
+ ldr r0, _08012808 @ =gActiveBank\n\
+ ldrb r2, [r0]\n\
+ lsls r0, r2, 1\n\
+ adds r0, r2\n\
+ ldr r2, _08012814 @ =gSharedMem + 0x1606C\n\
+ adds r0, r2\n\
+ str r0, [sp]\n\
+ movs r0, 0\n\
+ movs r2, 0x6\n\
+ bl EmitChoosePokemon\n\
+ b _0801289E\n\
+ .align 2, 0\n\
+_08012808: .4byte gActiveBank\n\
+_0801280C: .4byte gBattleMons\n\
+_08012810: .4byte gLastUsedAbility\n\
+_08012814: .4byte gSharedMem + 0x1606C\n\
+_08012818:\n\
+ ldr r0, _08012830 @ =gActiveBank\n\
+ ldrb r1, [r0]\n\
+ mov r8, r0\n\
+ cmp r1, 0x2\n\
+ bne _08012840\n\
+ ldr r0, _08012834 @ =gActionForBanks\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0x2\n\
+ bne _08012840\n\
+ ldr r3, _08012838 @ =gSharedMem\n\
+ ldr r4, _0801283C @ =0x00016068\n\
+ b _08012854\n\
+ .align 2, 0\n\
+_08012830: .4byte gActiveBank\n\
+_08012834: .4byte gActionForBanks\n\
+_08012838: .4byte gSharedMem\n\
+_0801283C: .4byte 0x00016068\n\
+_08012840:\n\
+ mov r2, r8\n\
+ ldrb r0, [r2]\n\
+ cmp r0, 0x3\n\
+ bne _08012884\n\
+ ldr r0, _08012874 @ =gActionForBanks\n\
+ ldrb r0, [r0, 0x1]\n\
+ cmp r0, 0x2\n\
+ bne _08012884\n\
+ ldr r3, _08012878 @ =gSharedMem\n\
+ ldr r4, _0801287C @ =0x00016069\n\
+_08012854:\n\
+ adds r0, r3, r4\n\
+ ldrb r2, [r0]\n\
+ mov r0, r8\n\
+ ldrb r1, [r0]\n\
+ lsls r0, r1, 1\n\
+ adds r0, r1\n\
+ ldr r1, _08012880 @ =0x0001606c\n\
+ adds r3, r1\n\
+ adds r0, r3\n\
+ str r0, [sp]\n\
+ movs r0, 0\n\
+ movs r1, 0\n\
+_0801286C:\n\
+ movs r3, 0\n\
+ bl EmitChoosePokemon\n\
+ b _0801289E\n\
+ .align 2, 0\n\
+_08012874: .4byte gActionForBanks\n\
+_08012878: .4byte gSharedMem\n\
+_0801287C: .4byte 0x00016069\n\
+_08012880: .4byte 0x0001606c\n\
+_08012884:\n\
+ ldr r0, _080128A8 @ =gActiveBank\n\
+ ldrb r1, [r0]\n\
+ lsls r0, r1, 1\n\
+ adds r0, r1\n\
+ ldr r1, _080128AC @ =gSharedMem + 0x1606C\n\
+ adds r0, r1\n\
+ str r0, [sp]\n\
+ movs r0, 0\n\
+ movs r1, 0\n\
+ movs r2, 0x6\n\
+ movs r3, 0\n\
+ bl EmitChoosePokemon\n\
+_0801289E:\n\
+ ldr r0, _080128A8 @ =gActiveBank\n\
+ ldrb r0, [r0]\n\
+ bl MarkBufferBankForExecution\n\
+ b _08012968\n\
+ .align 2, 0\n\
+_080128A8: .4byte gActiveBank\n\
+_080128AC: .4byte gSharedMem + 0x1606C\n\
+_080128B0:\n\
+ bl PlayerPartyAndPokemonStorageFull\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _08012968\n\
+ ldr r1, _080128EC @ =gUnknown_02024C1C\n\
+ ldr r2, _080128F0 @ =gActiveBank\n\
+ ldrb r0, [r2]\n\
+ lsls r0, 2\n\
+ adds r0, r1\n\
+ ldr r1, _080128F4 @ =BattleScript_PrintFullBox\n\
+ str r1, [r0]\n\
+ ldr r0, _080128F8 @ =gBattleCommunication\n\
+ ldrb r1, [r2]\n\
+ adds r1, r0\n\
+ movs r3, 0\n\
+ movs r0, 0x5\n\
+ strb r0, [r1]\n\
+ ldr r1, _080128FC @ =gSharedMem\n\
+ ldrb r0, [r2]\n\
+ ldr r4, _08012900 @ =0x00016060\n\
+ adds r0, r4\n\
+ adds r0, r1\n\
+ strb r3, [r0]\n\
+ ldrb r0, [r2]\n\
+ ldr r2, _08012904 @ =0x00016094\n\
+ adds r0, r2\n\
+ adds r0, r1\n\
+ strb r3, [r0]\n\
+ b _08012F90\n\
+ .align 2, 0\n\
+_080128EC: .4byte gUnknown_02024C1C\n\
+_080128F0: .4byte gActiveBank\n\
+_080128F4: .4byte BattleScript_PrintFullBox\n\
+_080128F8: .4byte gBattleCommunication\n\
+_080128FC: .4byte gSharedMem\n\
+_08012900: .4byte 0x00016060\n\
+_08012904: .4byte 0x00016094\n\
+_08012908:\n\
+ ldr r4, _08012924 @ =gActiveBank\n\
+ ldrb r0, [r4]\n\
+ lsls r1, r0, 1\n\
+ adds r1, r0\n\
+ ldr r0, _08012928 @ =gSharedMem + 0x1606C\n\
+ adds r1, r0\n\
+ movs r0, 0\n\
+ bl EmitOpenBag\n\
+ ldrb r0, [r4]\n\
+ bl MarkBufferBankForExecution\n\
+ b _08012968\n\
+ .align 2, 0\n\
+_08012924: .4byte gActiveBank\n\
+_08012928: .4byte gSharedMem + 0x1606C\n\
+_0801292C:\n\
+ ldr r4, _08012964 @ =gBattleCommunication\n\
+ mov r3, r8\n\
+ ldrb r1, [r3]\n\
+ adds r1, r4\n\
+ movs r5, 0\n\
+ movs r0, 0x6\n\
+ strb r0, [r1]\n\
+ ldrb r0, [r3]\n\
+ bl GetBankIdentity\n\
+ movs r1, 0x2\n\
+ eors r0, r1\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ bl GetBankByIdentity\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ adds r0, r4\n\
+ strb r5, [r0]\n\
+ movs r0, 0\n\
+ bl Emitcmd50\n\
+ mov r4, r8\n\
+ ldrb r0, [r4]\n\
+ bl MarkBufferBankForExecution\n\
+ b _08012F90\n\
+ .align 2, 0\n\
+_08012964: .4byte gBattleCommunication\n\
+_08012968:\n\
+ ldr r0, _08012994 @ =gBattleTypeFlags\n\
+ ldrh r1, [r0]\n\
+ movs r0, 0xA\n\
+ ands r0, r1\n\
+ cmp r0, 0x8\n\
+ bne _080129A8\n\
+ ldr r0, _08012998 @ =gBattleBufferB\n\
+ ldr r4, _0801299C @ =gActiveBank\n\
+ ldrb r1, [r4]\n\
+ lsls r1, 9\n\
+ adds r0, 0x1\n\
+ adds r1, r0\n\
+ ldrb r0, [r1]\n\
+ cmp r0, 0x3\n\
+ bne _080129A8\n\
+ ldr r0, _080129A0 @ =BattleScript_PrintCantRunFromTrainer\n\
+ bl BattleScriptExecute\n\
+ ldr r1, _080129A4 @ =gBattleCommunication\n\
+ ldrb r0, [r4]\n\
+ adds r0, r1\n\
+ b _08012BFE\n\
+ .align 2, 0\n\
+_08012994: .4byte gBattleTypeFlags\n\
+_08012998: .4byte gBattleBufferB\n\
+_0801299C: .4byte gActiveBank\n\
+_080129A0: .4byte BattleScript_PrintCantRunFromTrainer\n\
+_080129A4: .4byte gBattleCommunication\n\
+_080129A8:\n\
+ bl CanRunFromBattle\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _08012A14\n\
+ ldr r0, _080129F4 @ =gBattleBufferB\n\
+ ldr r3, _080129F8 @ =gActiveBank\n\
+ ldrb r2, [r3]\n\
+ lsls r1, r2, 9\n\
+ adds r0, 0x1\n\
+ adds r1, r0\n\
+ ldrb r0, [r1]\n\
+ cmp r0, 0x3\n\
+ bne _08012A14\n\
+ ldr r1, _080129FC @ =gUnknown_02024C1C\n\
+ lsls r0, r2, 2\n\
+ adds r0, r1\n\
+ ldr r1, _08012A00 @ =BattleScript_PrintCantEscapeFromBattle\n\
+_080129CC:\n\
+ str r1, [r0]\n\
+ ldr r0, _08012A04 @ =gBattleCommunication\n\
+ ldrb r1, [r3]\n\
+ adds r1, r0\n\
+ movs r2, 0\n\
+ movs r0, 0x5\n\
+ strb r0, [r1]\n\
+ ldr r1, _08012A08 @ =gSharedMem\n\
+ ldrb r0, [r3]\n\
+ ldr r4, _08012A0C @ =0x00016060\n\
+ adds r0, r4\n\
+ adds r0, r1\n\
+ strb r2, [r0]\n\
+ ldrb r0, [r3]\n\
+ ldr r3, _08012A10 @ =0x00016094\n\
+ adds r0, r3\n\
+ adds r0, r1\n\
+ strb r2, [r0]\n\
+ b _08012F90\n\
+ .align 2, 0\n\
+_080129F4: .4byte gBattleBufferB\n\
+_080129F8: .4byte gActiveBank\n\
+_080129FC: .4byte gUnknown_02024C1C\n\
+_08012A00: .4byte BattleScript_PrintCantEscapeFromBattle\n\
+_08012A04: .4byte gBattleCommunication\n\
+_08012A08: .4byte gSharedMem\n\
+_08012A0C: .4byte 0x00016060\n\
+_08012A10: .4byte 0x00016094\n\
+_08012A14:\n\
+ ldr r2, _08012A20 @ =gBattleCommunication\n\
+ ldr r0, _08012A24 @ =gActiveBank\n\
+ ldrb r1, [r0]\n\
+ adds r1, r2\n\
+ b _08012E3E\n\
+ .align 2, 0\n\
+_08012A20: .4byte gBattleCommunication\n\
+_08012A24: .4byte gActiveBank\n\
+_08012A28:\n\
+ ldr r4, _08012A6C @ =gBattleExecBuffer\n\
+ ldr r1, _08012A70 @ =gBitTable\n\
+ ldr r3, _08012A74 @ =gActiveBank\n\
+ ldrb r5, [r3]\n\
+ lsls r0, r5, 2\n\
+ adds r0, r1\n\
+ ldr r2, [r0]\n\
+ lsls r0, r2, 4\n\
+ movs r1, 0xF0\n\
+ lsls r1, 24\n\
+ orrs r0, r1\n\
+ orrs r0, r2\n\
+ lsls r1, r2, 8\n\
+ orrs r0, r1\n\
+ lsls r2, 12\n\
+ orrs r0, r2\n\
+ ldr r1, [r4]\n\
+ ands r1, r0\n\
+ mov r8, r3\n\
+ cmp r1, 0\n\
+ beq _08012A54\n\
+ b _08012F66\n\
+_08012A54:\n\
+ ldr r1, _08012A78 @ =gActionForBanks\n\
+ adds r0, r5, r1\n\
+ ldrb r0, [r0]\n\
+ adds r3, r1, 0\n\
+ cmp r0, 0x9\n\
+ bls _08012A62\n\
+ b _08012F66\n\
+_08012A62:\n\
+ lsls r0, 2\n\
+ ldr r1, _08012A7C @ =_08012A80\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .align 2, 0\n\
+_08012A6C: .4byte gBattleExecBuffer\n\
+_08012A70: .4byte gBitTable\n\
+_08012A74: .4byte gActiveBank\n\
+_08012A78: .4byte gActionForBanks\n\
+_08012A7C: .4byte _08012A80\n\
+ .align 2, 0\n\
+_08012A80:\n\
+ .4byte _08012AA8\n\
+ .4byte _08012BB0\n\
+ .4byte _08012BE8\n\
+ .4byte _08012CE0\n\
+ .4byte _08012D04\n\
+ .4byte _08012D18\n\
+ .4byte _08012D2C\n\
+ .4byte _08012D5C\n\
+ .4byte _08012D70\n\
+ .4byte _08012D94\n\
+_08012AA8:\n\
+ ldr r0, _08012AC8 @ =gBattleBufferB\n\
+ mov r1, r8\n\
+ ldrb r4, [r1]\n\
+ lsls r1, r4, 9\n\
+ adds r2, r0, 0x1\n\
+ adds r1, r2\n\
+ ldrb r1, [r1]\n\
+ adds r6, r0, 0\n\
+ cmp r1, 0x9\n\
+ bgt _08012ACC\n\
+ cmp r1, 0x3\n\
+ blt _08012ACC\n\
+ adds r0, r4, r3\n\
+ strb r1, [r0]\n\
+ b _08012F90\n\
+ .align 2, 0\n\
+_08012AC8: .4byte gBattleBufferB\n\
+_08012ACC:\n\
+ adds r3, r6, 0\n\
+ mov r5, r8\n\
+ ldrb r4, [r5]\n\
+ lsls r1, r4, 9\n\
+ adds r7, r3, 0x2\n\
+ adds r0, r1, r7\n\
+ ldrb r2, [r0]\n\
+ adds r3, 0x3\n\
+ mov r9, r3\n\
+ add r1, r9\n\
+ ldrb r0, [r1]\n\
+ lsls r0, 8\n\
+ orrs r2, r0\n\
+ ldr r0, _08012AF4 @ =0x0000ffff\n\
+ cmp r2, r0\n\
+ bne _08012AFC\n\
+ ldr r0, _08012AF8 @ =gBattleCommunication\n\
+ adds r0, r4, r0\n\
+ b _08012BFE\n\
+ .align 2, 0\n\
+_08012AF4: .4byte 0x0000ffff\n\
+_08012AF8: .4byte gBattleCommunication\n\
+_08012AFC:\n\
+ bl TrySetCantSelectMoveBattleScript\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _08012B48\n\
+ ldr r0, _08012B38 @ =gBattleCommunication\n\
+ ldrb r1, [r5]\n\
+ adds r1, r0\n\
+ movs r2, 0\n\
+ movs r0, 0x5\n\
+ strb r0, [r1]\n\
+ ldr r3, _08012B3C @ =gSharedMem\n\
+ ldrb r0, [r5]\n\
+ ldr r4, _08012B40 @ =0x00016060\n\
+ adds r0, r4\n\
+ adds r0, r3\n\
+ strb r2, [r0]\n\
+ ldrb r0, [r5]\n\
+ lsls r0, 9\n\
+ adds r1, r6, 0x1\n\
+ adds r0, r1\n\
+ strb r2, [r0]\n\
+ ldrb r0, [r5]\n\
+ ldr r1, _08012B44 @ =0x00016094\n\
+ adds r0, r1\n\
+ adds r0, r3\n\
+ movs r1, 0x1\n\
+ strb r1, [r0]\n\
+ b _08012F90\n\
+ .align 2, 0\n\
+_08012B38: .4byte gBattleCommunication\n\
+_08012B3C: .4byte gSharedMem\n\
+_08012B40: .4byte 0x00016060\n\
+_08012B44: .4byte 0x00016094\n\
+_08012B48:\n\
+ ldr r6, _08012B98 @ =gSharedMem\n\
+ mov r2, r8\n\
+ ldrb r0, [r2]\n\
+ ldr r2, _08012B9C @ =0x0001608c\n\
+ adds r1, r0, r2\n\
+ adds r1, r6\n\
+ lsls r0, 9\n\
+ adds r0, r7\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r1]\n\
+ ldr r0, _08012BA0 @ =gChosenMovesByBanks\n\
+ mov r4, r8\n\
+ ldrb r3, [r4]\n\
+ lsls r5, r3, 1\n\
+ adds r5, r0\n\
+ ldr r4, _08012BA4 @ =gBattleMons\n\
+ adds r2, r3, r2\n\
+ adds r2, r6\n\
+ ldrb r0, [r2]\n\
+ lsls r0, 1\n\
+ movs r1, 0x58\n\
+ muls r1, r3\n\
+ adds r0, r1\n\
+ adds r4, 0xC\n\
+ adds r0, r4\n\
+ ldrh r0, [r0]\n\
+ strh r0, [r5]\n\
+ mov r1, r8\n\
+ ldrb r0, [r1]\n\
+ ldr r2, _08012BA8 @ =0x00016010\n\
+ adds r1, r0, r2\n\
+ adds r1, r6\n\
+ lsls r0, 9\n\
+ add r0, r9\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r1]\n\
+ ldr r0, _08012BAC @ =gBattleCommunication\n\
+ mov r3, r8\n\
+ ldrb r1, [r3]\n\
+ b _08012E3C\n\
+ .align 2, 0\n\
+_08012B98: .4byte gSharedMem\n\
+_08012B9C: .4byte 0x0001608c\n\
+_08012BA0: .4byte gChosenMovesByBanks\n\
+_08012BA4: .4byte gBattleMons\n\
+_08012BA8: .4byte 0x00016010\n\
+_08012BAC: .4byte gBattleCommunication\n\
+_08012BB0:\n\
+ ldr r2, _08012BD8 @ =gBattleBufferB\n\
+ ldr r5, _08012BDC @ =gActiveBank\n\
+ ldrb r4, [r5]\n\
+ lsls r1, r4, 9\n\
+ adds r0, r2, 0x1\n\
+ adds r0, r1, r0\n\
+ ldrb r3, [r0]\n\
+ adds r2, 0x2\n\
+ adds r1, r2\n\
+ ldrb r0, [r1]\n\
+ lsls r0, 8\n\
+ orrs r3, r0\n\
+ cmp r3, 0\n\
+ bne _08012BCE\n\
+ b _08012F60\n\
+_08012BCE:\n\
+ ldr r0, _08012BE0 @ =gLastUsedItem\n\
+ strh r3, [r0]\n\
+ ldr r0, _08012BE4 @ =gBattleCommunication\n\
+ ldrb r1, [r5]\n\
+ b _08012E3C\n\
+ .align 2, 0\n\
+_08012BD8: .4byte gBattleBufferB\n\
+_08012BDC: .4byte gActiveBank\n\
+_08012BE0: .4byte gLastUsedItem\n\
+_08012BE4: .4byte gBattleCommunication\n\
+_08012BE8:\n\
+ ldr r4, _08012C04 @ =gBattleBufferB\n\
+ ldr r7, _08012C08 @ =gActiveBank\n\
+ ldrb r2, [r7]\n\
+ lsls r0, r2, 9\n\
+ adds r1, r4, 0x1\n\
+ adds r0, r1\n\
+ ldrb r1, [r0]\n\
+ cmp r1, 0x6\n\
+ bne _08012C10\n\
+ ldr r0, _08012C0C @ =gBattleCommunication\n\
+ adds r0, r2, r0\n\
+_08012BFE:\n\
+ movs r1, 0\n\
+ strb r1, [r0]\n\
+ b _08012F66\n\
+ .align 2, 0\n\
+_08012C04: .4byte gBattleBufferB\n\
+_08012C08: .4byte gActiveBank\n\
+_08012C0C: .4byte gBattleCommunication\n\
+_08012C10:\n\
+ ldr r0, _08012CC4 @ =gSharedMem\n\
+ mov r12, r0\n\
+ ldr r3, _08012CC8 @ =0x00016068\n\
+ adds r0, r2, r3\n\
+ add r0, r12\n\
+ strb r1, [r0]\n\
+ ldr r0, _08012CCC @ =gBattleTypeFlags\n\
+ ldrh r1, [r0]\n\
+ movs r0, 0x40\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08012CBE\n\
+ ldrb r0, [r7]\n\
+ lsls r1, r0, 1\n\
+ adds r1, r0\n\
+ ldr r5, _08012CD0 @ =0x0001606c\n\
+ adds r1, r5\n\
+ add r1, r12\n\
+ ldrb r2, [r1]\n\
+ movs r0, 0xF\n\
+ ands r0, r2\n\
+ strb r0, [r1]\n\
+ ldrb r0, [r7]\n\
+ lsls r2, r0, 1\n\
+ adds r2, r0\n\
+ adds r2, r5\n\
+ add r2, r12\n\
+ lsls r0, 9\n\
+ adds r6, r4, 0x2\n\
+ adds r0, r6\n\
+ ldrb r1, [r0]\n\
+ movs r3, 0xF0\n\
+ adds r0, r3, 0\n\
+ ands r0, r1\n\
+ ldrb r1, [r2]\n\
+ orrs r0, r1\n\
+ strb r0, [r2]\n\
+ ldrb r0, [r7]\n\
+ lsls r1, r0, 1\n\
+ adds r1, r0\n\
+ ldr r2, _08012CD4 @ =0x0001606d\n\
+ adds r1, r2\n\
+ add r1, r12\n\
+ lsls r0, 9\n\
+ adds r4, 0x3\n\
+ mov r8, r4\n\
+ add r0, r8\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r1]\n\
+ ldrb r0, [r7]\n\
+ movs r4, 0x2\n\
+ eors r0, r4\n\
+ lsls r1, r0, 1\n\
+ adds r1, r0\n\
+ adds r1, r5\n\
+ add r1, r12\n\
+ ldrb r2, [r1]\n\
+ adds r0, r3, 0\n\
+ ands r0, r2\n\
+ strb r0, [r1]\n\
+ ldrb r0, [r7]\n\
+ eors r0, r4\n\
+ lsls r1, r0, 1\n\
+ adds r1, r0\n\
+ adds r1, r5\n\
+ add r1, r12\n\
+ ldrb r0, [r7]\n\
+ lsls r0, 9\n\
+ adds r0, r6\n\
+ ldrb r0, [r0]\n\
+ ands r3, r0\n\
+ lsrs r3, 4\n\
+ ldrb r0, [r1]\n\
+ orrs r3, r0\n\
+ strb r3, [r1]\n\
+ ldrb r0, [r7]\n\
+ eors r4, r0\n\
+ lsls r1, r4, 1\n\
+ adds r1, r4\n\
+ ldr r3, _08012CD8 @ =0x0001606e\n\
+ adds r1, r3\n\
+ add r1, r12\n\
+ ldrb r0, [r7]\n\
+ lsls r0, 9\n\
+ add r0, r8\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r1]\n\
+_08012CBE:\n\
+ ldr r0, _08012CDC @ =gBattleCommunication\n\
+ ldrb r1, [r7]\n\
+ b _08012E3C\n\
+ .align 2, 0\n\
+_08012CC4: .4byte gSharedMem\n\
+_08012CC8: .4byte 0x00016068\n\
+_08012CCC: .4byte gBattleTypeFlags\n\
+_08012CD0: .4byte 0x0001606c\n\
+_08012CD4: .4byte 0x0001606d\n\
+_08012CD8: .4byte 0x0001606e\n\
+_08012CDC: .4byte gBattleCommunication\n\
+_08012CE0:\n\
+ ldr r2, _08012CF8 @ =gHitMarker\n\
+ ldr r0, [r2]\n\
+ movs r1, 0x80\n\
+ lsls r1, 8\n\
+ orrs r0, r1\n\
+ str r0, [r2]\n\
+ ldr r2, _08012CFC @ =gBattleCommunication\n\
+ ldr r0, _08012D00 @ =gActiveBank\n\
+ ldrb r1, [r0]\n\
+ adds r1, r2\n\
+ b _08012E3E\n\
+ .align 2, 0\n\
+_08012CF8: .4byte gHitMarker\n\
+_08012CFC: .4byte gBattleCommunication\n\
+_08012D00: .4byte gActiveBank\n\
+_08012D04:\n\
+ ldr r2, _08012D10 @ =gBattleCommunication\n\
+ ldr r0, _08012D14 @ =gActiveBank\n\
+ ldrb r1, [r0]\n\
+ adds r1, r2\n\
+ b _08012E3E\n\
+ .align 2, 0\n\
+_08012D10: .4byte gBattleCommunication\n\
+_08012D14: .4byte gActiveBank\n\
+_08012D18:\n\
+ ldr r2, _08012D24 @ =gBattleCommunication\n\
+ ldr r0, _08012D28 @ =gActiveBank\n\
+ ldrb r1, [r0]\n\
+ adds r1, r2\n\
+ b _08012E3E\n\
+ .align 2, 0\n\
+_08012D24: .4byte gBattleCommunication\n\
+_08012D28: .4byte gActiveBank\n\
+_08012D2C:\n\
+ ldr r2, _08012D50 @ =gBattleBufferB\n\
+ ldr r0, _08012D54 @ =gActiveBank\n\
+ ldrb r4, [r0]\n\
+ lsls r1, r4, 9\n\
+ adds r0, r2, 0x1\n\
+ adds r0, r1, r0\n\
+ ldrb r3, [r0]\n\
+ adds r2, 0x2\n\
+ adds r1, r2\n\
+ ldrb r0, [r1]\n\
+ lsls r0, 8\n\
+ orrs r3, r0\n\
+ cmp r3, 0\n\
+ bne _08012D4A\n\
+ b _08012F60\n\
+_08012D4A:\n\
+ ldr r1, _08012D58 @ =gBattleCommunication\n\
+ adds r1, r4, r1\n\
+ b _08012E3E\n\
+ .align 2, 0\n\
+_08012D50: .4byte gBattleBufferB\n\
+_08012D54: .4byte gActiveBank\n\
+_08012D58: .4byte gBattleCommunication\n\
+_08012D5C:\n\
+ ldr r2, _08012D68 @ =gBattleCommunication\n\
+ ldr r0, _08012D6C @ =gActiveBank\n\
+ ldrb r1, [r0]\n\
+ adds r1, r2\n\
+ b _08012E3E\n\
+ .align 2, 0\n\
+_08012D68: .4byte gBattleCommunication\n\
+_08012D6C: .4byte gActiveBank\n\
+_08012D70:\n\
+ ldr r2, _08012D88 @ =gHitMarker\n\
+ ldr r0, [r2]\n\
+ movs r1, 0x80\n\
+ lsls r1, 8\n\
+ orrs r0, r1\n\
+ str r0, [r2]\n\
+ ldr r2, _08012D8C @ =gBattleCommunication\n\
+ ldr r0, _08012D90 @ =gActiveBank\n\
+ ldrb r1, [r0]\n\
+ adds r1, r2\n\
+ b _08012E3E\n\
+ .align 2, 0\n\
+_08012D88: .4byte gHitMarker\n\
+_08012D8C: .4byte gBattleCommunication\n\
+_08012D90: .4byte gActiveBank\n\
+_08012D94:\n\
+ ldr r2, _08012DA0 @ =gBattleCommunication\n\
+ ldr r0, _08012DA4 @ =gActiveBank\n\
+ ldrb r1, [r0]\n\
+ adds r1, r2\n\
+ b _08012E3E\n\
+ .align 2, 0\n\
+_08012DA0: .4byte gBattleCommunication\n\
+_08012DA4: .4byte gActiveBank\n\
+_08012DA8:\n\
+ ldr r3, _08012E10 @ =gBattleExecBuffer\n\
+ ldr r4, _08012E14 @ =gBitTable\n\
+ ldr r0, _08012E18 @ =gActiveBank\n\
+ ldrb r0, [r0]\n\
+ lsls r0, 2\n\
+ adds r0, r4\n\
+ ldr r2, [r0]\n\
+ lsls r1, r2, 4\n\
+ movs r0, 0xF0\n\
+ lsls r0, 24\n\
+ orrs r1, r0\n\
+ orrs r1, r2\n\
+ lsls r0, r2, 8\n\
+ orrs r1, r0\n\
+ lsls r2, 12\n\
+ orrs r1, r2\n\
+ ldr r0, [r3]\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08012DD2\n\
+ b _08012F66\n\
+_08012DD2:\n\
+ ldr r0, _08012E1C @ =gBattleTypeFlags\n\
+ ldrh r1, [r0]\n\
+ movs r0, 0x41\n\
+ ands r0, r1\n\
+ cmp r0, 0x1\n\
+ bne _08012E06\n\
+ movs r1, 0x2\n\
+ movs r0, 0x2\n\
+ ands r0, r5\n\
+ cmp r0, 0\n\
+ bne _08012E06\n\
+ adds r0, r5, 0\n\
+ eors r0, r1\n\
+ bl GetBankByIdentity\n\
+ ldr r1, _08012E20 @ =gSharedMem\n\
+ ldr r2, _08012E24 @ =0x000160a6\n\
+ adds r1, r2\n\
+ ldrb r1, [r1]\n\
+ lsls r0, 24\n\
+ lsrs r0, 22\n\
+ adds r0, r4\n\
+ ldr r0, [r0]\n\
+ ands r1, r0\n\
+ cmp r1, 0\n\
+ beq _08012E28\n\
+_08012E06:\n\
+ movs r0, 0\n\
+ movs r1, 0\n\
+ bl EmitLinkStandbyMsg\n\
+ b _08012E30\n\
+ .align 2, 0\n\
+_08012E10: .4byte gBattleExecBuffer\n\
+_08012E14: .4byte gBitTable\n\
+_08012E18: .4byte gActiveBank\n\
+_08012E1C: .4byte gBattleTypeFlags\n\
+_08012E20: .4byte gSharedMem\n\
+_08012E24: .4byte 0x000160a6\n\
+_08012E28:\n\
+ movs r0, 0\n\
+ movs r1, 0x1\n\
+ bl EmitLinkStandbyMsg\n\
+_08012E30:\n\
+ ldr r4, _08012E48 @ =gActiveBank\n\
+_08012E32:\n\
+ ldrb r0, [r4]\n\
+ bl MarkBufferBankForExecution\n\
+ ldr r0, _08012E4C @ =gBattleCommunication\n\
+ ldrb r1, [r4]\n\
+_08012E3C:\n\
+ adds r1, r0\n\
+_08012E3E:\n\
+ ldrb r0, [r1]\n\
+ adds r0, 0x1\n\
+ strb r0, [r1]\n\
+ b _08012F66\n\
+ .align 2, 0\n\
+_08012E48: .4byte gActiveBank\n\
+_08012E4C: .4byte gBattleCommunication\n\
+_08012E50:\n\
+ ldr r3, _08012E84 @ =gBattleExecBuffer\n\
+ ldr r1, _08012E88 @ =gBitTable\n\
+ ldr r0, _08012E8C @ =gActiveBank\n\
+ ldrb r0, [r0]\n\
+ lsls r0, 2\n\
+ adds r0, r1\n\
+ ldr r2, [r0]\n\
+ lsls r1, r2, 4\n\
+ movs r0, 0xF0\n\
+ lsls r0, 24\n\
+ orrs r1, r0\n\
+ orrs r1, r2\n\
+ lsls r0, r2, 8\n\
+ orrs r1, r0\n\
+ lsls r2, 12\n\
+ orrs r1, r2\n\
+ ldr r0, [r3]\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _08012F66\n\
+ ldr r1, _08012E90 @ =gBattleCommunication\n\
+ ldrb r0, [r1, 0x4]\n\
+ adds r0, 0x1\n\
+ strb r0, [r1, 0x4]\n\
+ b _08012F66\n\
+ .align 2, 0\n\
+_08012E84: .4byte gBattleExecBuffer\n\
+_08012E88: .4byte gBitTable\n\
+_08012E8C: .4byte gActiveBank\n\
+_08012E90: .4byte gBattleCommunication\n\
+_08012E94:\n\
+ ldr r2, _08012EB8 @ =gSharedMem\n\
+ ldr r5, _08012EBC @ =gActiveBank\n\
+ ldrb r1, [r5]\n\
+ ldr r3, _08012EC0 @ =0x00016060\n\
+ adds r0, r1, r3\n\
+ adds r0, r2\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ beq _08012ECC\n\
+ ldr r0, _08012EC4 @ =gBattleCommunication\n\
+ adds r0, r1, r0\n\
+ ldr r4, _08012EC8 @ =0x00016094\n\
+ adds r1, r4\n\
+ adds r1, r2\n\
+ ldrb r1, [r1]\n\
+ strb r1, [r0]\n\
+ b _08012F66\n\
+ .align 2, 0\n\
+_08012EB8: .4byte gSharedMem\n\
+_08012EBC: .4byte gActiveBank\n\
+_08012EC0: .4byte 0x00016060\n\
+_08012EC4: .4byte gBattleCommunication\n\
+_08012EC8: .4byte 0x00016094\n\
+_08012ECC:\n\
+ ldr r0, _08012F20 @ =gBankAttacker\n\
+ strb r1, [r0]\n\
+ ldr r7, _08012F24 @ =gBattlescriptCurrInstr\n\
+ ldr r6, _08012F28 @ =gUnknown_02024C1C\n\
+ ldrb r0, [r5]\n\
+ lsls r0, 2\n\
+ adds r0, r6\n\
+ ldr r4, [r0]\n\
+ str r4, [r7]\n\
+ ldr r3, _08012F2C @ =gBattleExecBuffer\n\
+ ldr r1, _08012F30 @ =gBitTable\n\
+ ldrb r0, [r5]\n\
+ lsls r0, 2\n\
+ adds r0, r1\n\
+ ldr r2, [r0]\n\
+ lsls r1, r2, 4\n\
+ movs r0, 0xF0\n\
+ lsls r0, 24\n\
+ orrs r1, r0\n\
+ orrs r1, r2\n\
+ lsls r0, r2, 8\n\
+ orrs r1, r0\n\
+ lsls r2, 12\n\
+ orrs r1, r2\n\
+ ldr r0, [r3]\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _08012F12\n\
+ ldr r0, _08012F34 @ =gBattleScriptingCommandsTable\n\
+ ldrb r1, [r4]\n\
+ lsls r1, 2\n\
+ adds r1, r0\n\
+ ldr r0, [r1]\n\
+ bl _call_via_r0\n\
+_08012F12:\n\
+ ldrb r0, [r5]\n\
+ lsls r0, 2\n\
+ adds r0, r6\n\
+ ldr r1, [r7]\n\
+ str r1, [r0]\n\
+ b _08012F66\n\
+ .align 2, 0\n\
+_08012F20: .4byte gBankAttacker\n\
+_08012F24: .4byte gBattlescriptCurrInstr\n\
+_08012F28: .4byte gUnknown_02024C1C\n\
+_08012F2C: .4byte gBattleExecBuffer\n\
+_08012F30: .4byte gBitTable\n\
+_08012F34: .4byte gBattleScriptingCommandsTable\n\
+_08012F38:\n\
+ ldr r3, _08012FA0 @ =gBattleExecBuffer\n\
+ ldr r1, _08012FA4 @ =gBitTable\n\
+ ldr r0, _08012FA8 @ =gActiveBank\n\
+ ldrb r4, [r0]\n\
+ lsls r0, r4, 2\n\
+ adds r0, r1\n\
+ ldr r2, [r0]\n\
+ lsls r0, r2, 4\n\
+ movs r1, 0xF0\n\
+ lsls r1, 24\n\
+ orrs r0, r1\n\
+ orrs r0, r2\n\
+ lsls r1, r2, 8\n\
+ orrs r0, r1\n\
+ lsls r2, 12\n\
+ orrs r0, r2\n\
+ ldr r3, [r3]\n\
+ ands r3, r0\n\
+ cmp r3, 0\n\
+ bne _08012F66\n\
+_08012F60:\n\
+ ldr r0, _08012FAC @ =gBattleCommunication\n\
+ adds r0, r4, r0\n\
+ strb r3, [r0]\n\
+_08012F66:\n\
+ ldr r0, _08012FA8 @ =gActiveBank\n\
+ ldrb r1, [r0]\n\
+ adds r1, 0x1\n\
+ strb r1, [r0]\n\
+ ldr r0, _08012FB0 @ =gNoOfAllBanks\n\
+ lsls r1, 24\n\
+ lsrs r1, 24\n\
+_08012F74:\n\
+ adds r2, r0, 0\n\
+ ldrb r0, [r2]\n\
+ cmp r1, r0\n\
+ bcs _08012F80\n\
+ bl _0801234C\n\
+_08012F80:\n\
+ ldr r0, _08012FAC @ =gBattleCommunication\n\
+ ldrb r0, [r0, 0x4]\n\
+ ldrb r2, [r2]\n\
+ cmp r0, r2\n\
+ bne _08012F90\n\
+ ldr r1, _08012FB4 @ =gBattleMainFunc\n\
+ ldr r0, _08012FB8 @ =SetActionsAndBanksTurnOrder\n\
+ str r0, [r1]\n\
+_08012F90:\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\
+_08012FA0: .4byte gBattleExecBuffer\n\
+_08012FA4: .4byte gBitTable\n\
+_08012FA8: .4byte gActiveBank\n\
+_08012FAC: .4byte gBattleCommunication\n\
+_08012FB0: .4byte gNoOfAllBanks\n\
+_08012FB4: .4byte gBattleMainFunc\n\
+_08012FB8: .4byte SetActionsAndBanksTurnOrder\n\
+ .syntax divided\n");
+}
+
+void SwapTurnOrder(u8 a, u8 b)
+{
+ int temp;
+
+ temp = gActionsByTurnOrder[a];
+ gActionsByTurnOrder[a] = gActionsByTurnOrder[b];
+ gActionsByTurnOrder[b] = temp;
+
+ temp = gBanksByTurnOrder[a];
+ gBanksByTurnOrder[a] = gBanksByTurnOrder[b];
+ gBanksByTurnOrder[b] = temp;
+}
+
+// Determines which of the two given mons will strike first in a battle.
+// Returns:
+// 0 = first mon moves first
+// 1 = second mon moves first
+// 2 = second mon moves first because it won a 50/50 roll
+u8 GetWhoStrikesFirst(u8 bank1, u8 bank2, bool8 ignoreMovePriorities)
+{
+ int bank1SpeedMultiplier, bank2SpeedMultiplier;
+ u32 bank1AdjustedSpeed, bank2AdjustedSpeed;
+ u8 heldItemEffect;
+ u8 heldItemEffectParam;
+ u16 bank1Move;
+ u16 bank2Move;
+ u8 strikesFirst = 0;
+
+ // Check for abilities that boost speed in weather.
+ if (WEATHER_HAS_EFFECT)
+ {
+ if ((gBattleMons[bank1].ability == ABILITY_SWIFT_SWIM && (gBattleWeather & WEATHER_RAIN_ANY))
+ || (gBattleMons[bank1].ability == ABILITY_CHLOROPHYLL && (gBattleWeather & WEATHER_SUN_ANY)))
+ bank1SpeedMultiplier = 2;
+ else
+ bank1SpeedMultiplier = 1;
+
+ if ((gBattleMons[bank2].ability == ABILITY_SWIFT_SWIM && (gBattleWeather & WEATHER_RAIN_ANY))
+ || (gBattleMons[bank2].ability == ABILITY_CHLOROPHYLL && (gBattleWeather & WEATHER_SUN_ANY)))
+ bank2SpeedMultiplier = 2;
+ else
+ bank2SpeedMultiplier = 1;
+ }
+ else
+ {
+ bank1SpeedMultiplier = 1;
+ bank2SpeedMultiplier = 1;
+ }
+
+ // Calculate adjusted speed for first mon.
+ bank1AdjustedSpeed = (gBattleMons[bank1].speed * bank1SpeedMultiplier)
+ * gStatStageRatios[gBattleMons[bank1].statStages[STAT_STAGE_SPEED]][0] / gStatStageRatios[gBattleMons[bank1].statStages[STAT_STAGE_SPEED]][1];
+
+ if (gBattleMons[bank1].item == ITEM_ENIGMA_BERRY)
+ {
+ heldItemEffect = gEnigmaBerries[bank1].holdEffect;
+ heldItemEffectParam = gEnigmaBerries[bank1].holdEffectParam;
+ }
+ else
+ {
+ heldItemEffect = ItemId_GetHoldEffect(gBattleMons[bank1].item);
+ heldItemEffectParam = ItemId_GetHoldEffectParam(gBattleMons[bank1].item);
+ }
+
+ // Only give badge speed boost to the player's mon.
+ if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) && FlagGet(FLAG_BADGE03_GET) && GetBankSide(bank1) == 0)
+ bank1AdjustedSpeed = (bank1AdjustedSpeed * 110) / 100;
+
+ if (heldItemEffect == HOLD_EFFECT_MACHO_BRACE)
+ bank1AdjustedSpeed /= 2;
+
+ if (gBattleMons[bank1].status1 & STATUS_PARALYSIS)
+ bank1AdjustedSpeed /= 4;
+
+ if (heldItemEffect == HOLD_EFFECT_QUICK_CLAW && gRandomTurnNumber < (heldItemEffectParam * 0xFFFF) / 100)
+ bank1AdjustedSpeed = UINT_MAX;
+
+ // Calculate adjusted speed for second mon.
+ bank2AdjustedSpeed = gBattleMons[bank2].speed * bank2SpeedMultiplier
+ * gStatStageRatios[gBattleMons[bank2].statStages[STAT_STAGE_SPEED]][0] / gStatStageRatios[gBattleMons[bank2].statStages[STAT_STAGE_SPEED]][1];
+
+ if (gBattleMons[bank2].item == ITEM_ENIGMA_BERRY)
+ {
+ heldItemEffect = gEnigmaBerries[bank2].holdEffect;
+ heldItemEffectParam = gEnigmaBerries[bank2].holdEffectParam;
+ }
+ else
+ {
+ heldItemEffect = ItemId_GetHoldEffect(gBattleMons[bank2].item);
+ heldItemEffectParam = ItemId_GetHoldEffectParam(gBattleMons[bank2].item);
+ }
+
+ // Only give badge speed boost to the player's mon.
+ if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) && FlagGet(FLAG_BADGE03_GET) && GetBankSide(bank2) == 0)
+ {
+ bank2AdjustedSpeed = (bank2AdjustedSpeed * 110) / 100;
+ }
+
+ if (heldItemEffect == HOLD_EFFECT_MACHO_BRACE)
+ bank2AdjustedSpeed /= 2;
+
+ if (gBattleMons[bank2].status1 & STATUS_PARALYSIS)
+ bank2AdjustedSpeed /= 4;
+
+ if (heldItemEffect == HOLD_EFFECT_QUICK_CLAW && gRandomTurnNumber < (heldItemEffectParam * 0xFFFF) / 100)
+ bank2AdjustedSpeed = UINT_MAX;
+
+ if (ignoreMovePriorities)
+ {
+ bank1Move = MOVE_NONE;
+ bank2Move = MOVE_NONE;
+ }
+ else
+ {
+ if (gActionForBanks[bank1] == 0)
+ {
+ if (gProtectStructs[bank1].onlyStruggle)
+ bank1Move = MOVE_STRUGGLE;
+ else
+ bank1Move = gBattleMons[bank1].moves[ewram1608Carr(bank1)];
+ }
+ else
+ bank1Move = MOVE_NONE;
+
+ if (gActionForBanks[bank2] == 0)
+ {
+ if (gProtectStructs[bank2].onlyStruggle)
+ bank2Move = MOVE_STRUGGLE;
+ else
+ bank2Move = gBattleMons[bank2].moves[ewram1608Carr(bank2)];
+ }
+ else
+ bank2Move = MOVE_NONE;
+ }
+
+ if (gBattleMoves[bank1Move].priority != 0 || gBattleMoves[bank2Move].priority != 0)
+ {
+ if (gBattleMoves[bank1Move].priority == gBattleMoves[bank2Move].priority)
+ {
+ if (bank1AdjustedSpeed == bank2AdjustedSpeed && (Random() & 1))
+ strikesFirst = 2;
+ else if (bank1AdjustedSpeed < bank2AdjustedSpeed)
+ strikesFirst = 1;
+ }
+ else if (gBattleMoves[bank1Move].priority < gBattleMoves[bank2Move].priority)
+ strikesFirst = 1;
+ }
+ else
+ {
+ if (bank1AdjustedSpeed == bank2AdjustedSpeed && (Random() & 1))
+ strikesFirst = 2;
+ else if (bank1AdjustedSpeed < bank2AdjustedSpeed)
+ strikesFirst = 1;
+ }
+
+ return strikesFirst;
+}
+
+void SetActionsAndBanksTurnOrder(void)
+{
+ s32 var = 0;
+ s32 i, j;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
+ {
+ for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ {
+ gActionsByTurnOrder[var] = gActionForBanks[gActiveBank];
+ gBanksByTurnOrder[var] = gActiveBank;
+ var++;
+ }
+ }
+ else
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ {
+ for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ {
+ if (gActionForBanks[gActiveBank] == ACTION_RUN)
+ {
+ var = 5;
+ break;
+ }
+ }
+ }
+ else
+ {
+ if (gActionForBanks[0] == ACTION_RUN)
+ {
+ gActiveBank = 0;
+ var = 5;
+ }
+ }
+
+ if (var == 5)
+ {
+ gActionsByTurnOrder[0] = gActionForBanks[gActiveBank];
+ gBanksByTurnOrder[0] = gActiveBank;
+ var = 1;
+ for (i = 0; i < gNoOfAllBanks; i++)
+ {
+ if (i != gActiveBank)
+ {
+ gActionsByTurnOrder[var] = gActionForBanks[i];
+ gBanksByTurnOrder[var] = i;
+ var++;
+ }
+ }
+ gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts;
+ eFocusPunchBank = 0;
+ return;
+ }
+ else
+ {
+ for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ {
+ if (gActionForBanks[gActiveBank] == ACTION_USE_ITEM || gActionForBanks[gActiveBank] == ACTION_SWITCH)
+ {
+ gActionsByTurnOrder[var] = gActionForBanks[gActiveBank];
+ gBanksByTurnOrder[var] = gActiveBank;
+ var++;
+ }
+ }
+ for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ {
+ if (gActionForBanks[gActiveBank] != ACTION_USE_ITEM && gActionForBanks[gActiveBank] != ACTION_SWITCH)
+ {
+ gActionsByTurnOrder[var] = gActionForBanks[gActiveBank];
+ gBanksByTurnOrder[var] = gActiveBank;
+ var++;
+ }
+ }
+ for (i = 0; i < gNoOfAllBanks - 1; i++)
+ {
+ for (j = i + 1; j < gNoOfAllBanks; j++)
+ {
+ u8 bank1 = gBanksByTurnOrder[i];
+ u8 bank2 = gBanksByTurnOrder[j];
+ if (gActionsByTurnOrder[i] != ACTION_USE_ITEM
+ && gActionsByTurnOrder[j] != ACTION_USE_ITEM
+ && gActionsByTurnOrder[i] != ACTION_SWITCH
+ && gActionsByTurnOrder[j] != ACTION_SWITCH)
+ {
+ if (GetWhoStrikesFirst(bank1, bank2, FALSE))
+ SwapTurnOrder(i, j);
+ }
+ }
+ }
+ }
+ }
+ gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts;
+ eFocusPunchBank = 0;
+}
+
+static void TurnValuesCleanUp(bool8 var0)
+{
+ s32 i;
+ u8 *dataPtr;
+
+ for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ {
+ if (var0)
+ {
+ gProtectStructs[gActiveBank].protected = 0;
+ gProtectStructs[gActiveBank].endured = 0;
+ }
+ else
+ {
+ dataPtr = (u8*)(&gProtectStructs[gActiveBank]);
+ for (i = 0; i < sizeof(struct ProtectStruct); i++)
+ dataPtr[i] = 0;
+
+ if (gDisableStructs[gActiveBank].isFirstTurn)
+ gDisableStructs[gActiveBank].isFirstTurn--;
+
+ if (gDisableStructs[gActiveBank].rechargeCounter)
+ {
+ gDisableStructs[gActiveBank].rechargeCounter--;
+ if (gDisableStructs[gActiveBank].rechargeCounter == 0)
+ gBattleMons[gActiveBank].status2 &= ~(STATUS2_RECHARGE);
+ }
+ }
+
+ if (gDisableStructs[gActiveBank].substituteHP == 0)
+ gBattleMons[gActiveBank].status2 &= ~(STATUS2_SUBSTITUTE);
+ }
+
+ gSideTimers[0].followmeTimer = 0;
+ gSideTimers[1].followmeTimer = 0;
+}
+
+void SpecialStatusesClear(void)
+{
+ for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ {
+ s32 i;
+ u8 *dataPtr = (u8*)(&gSpecialStatuses[gActiveBank]);
+
+ for (i = 0; i < sizeof(struct SpecialStatus); i++)
+ dataPtr[i] = 0;
+ }
+}
+
+void CheckFocusPunch_ClearVarsBeforeTurnStarts(void)
+{
+ if (!(gHitMarker & HITMARKER_RUN))
+ {
+ while (eFocusPunchBank < gNoOfAllBanks)
+ {
+ gActiveBank = gBankAttacker = eFocusPunchBank;
+ eFocusPunchBank++;
+ if (gChosenMovesByBanks[gActiveBank] == MOVE_FOCUS_PUNCH
+ && !(gBattleMons[gActiveBank].status1 & STATUS_SLEEP)
+ && !(gDisableStructs[gBankAttacker].truantCounter)
+ && !(gProtectStructs[gActiveBank].onlyStruggle))
+ {
+ BattleScriptExecute(BattleScript_FocusPunchSetUp);
+ return;
+ }
+ }
+ }
+
+ TryClearRageStatuses();
+ gCurrentTurnActionNumber = 0;
+ {
+ // something stupid needed to match
+ u8 zero;
+ gCurrentActionFuncId = gActionsByTurnOrder[(zero = 0)];
+ }
+
+ gDynamicBasePower = 0;
+ BATTLE_STRUCT->dynamicMoveType = 0;
+ gBattleMainFunc = RunTurnActionsFunctions;
+ gBattleCommunication[3] = 0;
+ gBattleCommunication[4] = 0;
+ eMultihitMoveEffect = 0;
+ ewram17130 = 0;
+}
+
+static void RunTurnActionsFunctions(void)
+{
+ if (gBattleOutcome != 0)
+ gCurrentActionFuncId = 12;
+
+ BATTLE_STRUCT->unk16057 = gCurrentTurnActionNumber;
+ gUnknown_081FA640[gCurrentActionFuncId]();
+
+ if (gCurrentTurnActionNumber >= gNoOfAllBanks) // everyone did their actions, turn finished
+ {
+ gHitMarker &= ~(HITMARKER_x100000);
+ gBattleMainFunc = gUnknown_081FA678[gBattleOutcome & 0x7F];
+ }
+ else
+ {
+ if (BATTLE_STRUCT->unk16057 != gCurrentTurnActionNumber) // action turn has been done, clear hitmarker bits for another bank
+ {
+ gHitMarker &= ~(HITMARKER_NO_ATTACKSTRING);
+ gHitMarker &= ~(HITMARKER_UNABLE_TO_USE_MOVE);
+ }
+ }
+}
+
+void HandleEndTurn_BattleWon(void)
+{
+ gCurrentActionFuncId = 0;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ {
+ gBattleTextBuff1[0] = gBattleOutcome;
+ gBankAttacker = GetBankByIdentity(IDENTITY_PLAYER_MON1);
+ gBattlescriptCurrInstr = BattleScript_LinkBattleWonOrLost;
+ gBattleOutcome &= ~(OUTCOME_LINK_BATTLE_RUN);
+ }
+ else if (gBattleTypeFlags & (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER))
+ {
+ gBattlescriptCurrInstr = gUnknown_081D8E0D;
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && !(gBattleTypeFlags & BATTLE_TYPE_LINK))
+ {
+ BattleMusicStop();
+ gBattlescriptCurrInstr = BattleScript_LocalTrainerBattleWon;
+
+ switch (gTrainers[gTrainerBattleOpponent].trainerClass)
+ {
+ case TRAINER_CLASS_ELITE_FOUR:
+ case TRAINER_CLASS_CHAMPION:
+ PlayBGM(BGM_KACHI5);
+ break;
+ case TRAINER_CLASS_TEAM_AQUA:
+ case TRAINER_CLASS_TEAM_MAGMA:
+ case TRAINER_CLASS_AQUA_ADMIN:
+ case TRAINER_CLASS_AQUA_LEADER:
+ case TRAINER_CLASS_MAGMA_ADMIN:
+ case TRAINER_CLASS_MAGMA_LEADER:
+ PlayBGM(BGM_KACHI4);
+ break;
+ case TRAINER_CLASS_LEADER:
+ PlayBGM(BGM_KACHI3);
+ break;
+ default:
+ PlayBGM(BGM_KACHI1);
+ break;
+ }
+ }
+ else
+ {
+ gBattlescriptCurrInstr = BattleScript_PayDayMoneyAndPickUpItems;
+ }
+
+ gBattleMainFunc = HandleEndTurn_FinishBattle;
+}
+
+void HandleEndTurn_BattleLost(void)
+{
+ gCurrentActionFuncId = 0;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ {
+ gBattleTextBuff1[0] = gBattleOutcome;
+ gBankAttacker = GetBankByIdentity(IDENTITY_PLAYER_MON1);
+ gBattlescriptCurrInstr = BattleScript_LinkBattleWonOrLost;
+ gBattleOutcome &= ~(OUTCOME_LINK_BATTLE_RUN);
+ }
+ else
+ {
+ gBattlescriptCurrInstr = BattleScript_LocalBattleLost;
+ }
+
+ gBattleMainFunc = HandleEndTurn_FinishBattle;
+}
+
+void HandleEndTurn_RanFromBattle(void)
+{
+ gCurrentActionFuncId = 0;
+
+ switch (gProtectStructs[gBankAttacker].fleeFlag)
+ {
+ default:
+ gBattlescriptCurrInstr = BattleScript_GotAwaySafely;
+ break;
+ case 1:
+ gBattlescriptCurrInstr = BattleScript_SmokeBallEscape;
+ break;
+ case 2:
+ gBattlescriptCurrInstr = BattleScript_RanAwayUsingMonAbility;
+ break;
+ }
+
+ gBattleMainFunc = HandleEndTurn_FinishBattle;
+}
+
+void HandleEndTurn_MonFled(void)
+{
+ gCurrentActionFuncId = 0;
+
+ PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBankAttacker, gBattlePartyID[gBankAttacker]);
+ gBattlescriptCurrInstr = BattleScript_WildMonFled;
+
+ gBattleMainFunc = HandleEndTurn_FinishBattle;
+}
+
+void HandleEndTurn_FinishBattle(void)
+{
+ if (gCurrentActionFuncId == 0xB || gCurrentActionFuncId == 0xC)
+ {
+ if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK
+ | BATTLE_TYPE_FIRST_BATTLE
+ | BATTLE_TYPE_SAFARI
+ | BATTLE_TYPE_EREADER_TRAINER
+ | BATTLE_TYPE_WALLY_TUTORIAL
+ | BATTLE_TYPE_BATTLE_TOWER)))
+ {
+ for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ {
+ if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ {
+ if (gBattleResults.poke1Species == SPECIES_NONE)
+ {
+ gBattleResults.poke1Species = gBattleMons[gActiveBank].species;
+ StringCopy(gBattleResults.pokeString1, gBattleMons[gActiveBank].nickname);
+ }
+ else
+ {
+ gBattleResults.opponentSpecies = gBattleMons[gActiveBank].species;
+ StringCopy(gBattleResults.pokeString2, gBattleMons[gActiveBank].nickname);
+ }
+ }
+ }
+ PutPokemonTodayCaughtOnAir();
+ }
+
+ BeginFastPaletteFade(3);
+ FadeOutMapMusic(5);
+ gBattleMainFunc = FreeResetData_ReturnToOvOrDoEvolutions;
+ gCB2_AfterEvolution = BattleMainCB2;
+ }
+ else
+ {
+ if (gBattleExecBuffer == 0)
+ gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]]();
+ }
+}
+
+static void FreeResetData_ReturnToOvOrDoEvolutions(void)
+{
+ if (!gPaletteFade.active)
+ {
+ ResetSpriteData();
+ if (gLeveledUpInBattle == 0 || gBattleOutcome != BATTLE_WON)
+ {
+ gBattleMainFunc = ReturnFromBattleToOverworld;
+ return;
+ }
+ else
+ {
+ gBattleMainFunc = TryEvolvePokemon;
+ }
+ }
+}
+
+void TryEvolvePokemon(void)
+{
+ s32 i;
+
+ while (gLeveledUpInBattle != 0)
+ {
+ for (i = 0; i < 6; i++)
+ {
+ if (gLeveledUpInBattle & gBitTable[i])
+ {
+ u16 species;
+ u8 levelUpBits = gLeveledUpInBattle;
+
+ levelUpBits &= ~(gBitTable[i]);
+ gLeveledUpInBattle = levelUpBits;
+
+ species = GetEvolutionTargetSpecies(&gPlayerParty[i], 0, levelUpBits);
+ if (species != SPECIES_NONE)
+ {
+ gBattleMainFunc = WaitForEvoSceneToFinish;
+ EvolutionScene(&gPlayerParty[i], species, 0x81, i);
+ return;
+ }
+ }
+ }
+ }
+
+ gBattleMainFunc = ReturnFromBattleToOverworld;
+}
+
+static void WaitForEvoSceneToFinish(void)
+{
+ if (gMain.callback2 == BattleMainCB2)
+ gBattleMainFunc = TryEvolvePokemon;
+}
+
+static void ReturnFromBattleToOverworld(void)
+{
+ if (!(gBattleTypeFlags & BATTLE_TYPE_LINK))
+ {
+ RandomlyGivePartyPokerus(gPlayerParty);
+ PartySpreadPokerus(gPlayerParty);
+ }
+
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK && gReceivedRemoteLinkPlayers != 0)
+ return;
+
+ gSpecialVar_Result = gBattleOutcome;
+ gMain.inBattle = 0;
+ gMain.callback1 = gPreBattleCallback1;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_ROAMER)
+ {
+ UpdateRoamerHPStatus(&gEnemyParty[0]);
+ if (gBattleOutcome == BATTLE_WON || gBattleOutcome == BATTLE_CAUGHT)
+ SetRoamerInactive();
+ }
+
+ m4aSongNumStop(0x5A);
+ SetMainCallback2(gMain.savedCallback);
+}
+
+void RunBattleScriptCommands_PopCallbacksStack(void)
+{
+ if (gCurrentActionFuncId == 0xB || gCurrentActionFuncId == 0xC)
+ {
+ if (B_FUNCTION_STACK->size != 0)
+ B_FUNCTION_STACK->size--;
+ gBattleMainFunc = B_FUNCTION_STACK->ptr[B_FUNCTION_STACK->size];
+ }
+ else
+ {
+ if (gBattleExecBuffer == 0)
+ gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]]();
+ }
+}
+
+void RunBattleScriptCommands(void)
+{
+ if (gBattleExecBuffer == 0)
+ gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]]();
+}
+
+void HandleAction_UseMove(void)
+{
+ u8 side;
+ u8 var = 4;
+
+ gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber];
+
+ if (ewram160A6 & gBitTable[gBankAttacker])
+ {
+ gCurrentActionFuncId = ACTION_FINISHED;
+ return;
+ }
+
+ gCritMultiplier = 1;
+ eDmgMultiplier = 1;
+ ewram160E7 = 0;
+ gBattleMoveFlags = 0;
+ gMultiHitCounter = 0;
+ gBattleCommunication[6] = 0;
+ gCurrMovePos = gUnknown_02024BE5 = ewram1608Carr(gBankAttacker);
+
+ // choose move
+ if (gProtectStructs[gBankAttacker].onlyStruggle)
+ {
+ gProtectStructs[gBankAttacker].onlyStruggle = 0;
+ gCurrentMove = gChosenMove = MOVE_STRUGGLE;
+ gHitMarker |= HITMARKER_NO_PPDEDUCT;
+ ewram16010arr(gBankAttacker) = GetMoveTarget(MOVE_STRUGGLE, 0);
+ }
+ else if (gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS || gBattleMons[gBankAttacker].status2 & STATUS2_RECHARGE)
+ {
+ gCurrentMove = gChosenMove = gLockedMoves[gBankAttacker];
+ }
+ // encore forces you to use the same move
+ else if (gDisableStructs[gBankAttacker].encoredMove != MOVE_NONE
+ && gDisableStructs[gBankAttacker].encoredMove == gBattleMons[gBankAttacker].moves[gDisableStructs[gBankAttacker].encoredMovePos])
+ {
+ gCurrentMove = gChosenMove = gDisableStructs[gBankAttacker].encoredMove;
+ gCurrMovePos = gUnknown_02024BE5 = gDisableStructs[gBankAttacker].encoredMovePos;
+ ewram16010arr(gBankAttacker) = GetMoveTarget(gCurrentMove, 0);
+ }
+ // check if the encored move wasn't overwritten
+ else if (gDisableStructs[gBankAttacker].encoredMove != MOVE_NONE
+ && gDisableStructs[gBankAttacker].encoredMove != gBattleMons[gBankAttacker].moves[gDisableStructs[gBankAttacker].encoredMovePos])
+ {
+ gCurrMovePos = gUnknown_02024BE5 = gDisableStructs[gBankAttacker].encoredMovePos;
+ gCurrentMove = gChosenMove = gBattleMons[gBankAttacker].moves[gCurrMovePos];
+ gDisableStructs[gBankAttacker].encoredMove = MOVE_NONE;
+ gDisableStructs[gBankAttacker].encoredMovePos = 0;
+ gDisableStructs[gBankAttacker].encoreTimer1 = 0;
+ ewram16010arr(gBankAttacker) = GetMoveTarget(gCurrentMove, 0);
+ }
+ else if (gBattleMons[gBankAttacker].moves[gCurrMovePos] != gChosenMovesByBanks[gBankAttacker])
+ {
+ gCurrentMove = gChosenMove = gBattleMons[gBankAttacker].moves[gCurrMovePos];
+ ewram16010arr(gBankAttacker) = GetMoveTarget(gCurrentMove, 0);
+ }
+ else
+ {
+ gCurrentMove = gChosenMove = gBattleMons[gBankAttacker].moves[gCurrMovePos];
+ }
+
+ if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
+ gBattleResults.lastUsedMove = gCurrentMove;
+ else
+ gBattleResults.opponentMove = gCurrentMove;
+
+ // choose target
+ side = GetBankSide(gBankAttacker) ^ BIT_SIDE;
+ if (gSideTimers[side].followmeTimer != 0
+ && gBattleMoves[gCurrentMove].target == MOVE_TARGET_SELECTED
+ && GetBankSide(gBankAttacker) != GetBankSide(gSideTimers[side].followmeTarget)
+ && gBattleMons[gSideTimers[side].followmeTarget].hp != 0)
+ {
+ gBankTarget = gSideTimers[side].followmeTarget;
+ }
+ else if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
+ && gSideTimers[side].followmeTimer == 0
+ && (gBattleMoves[gCurrentMove].power != 0
+ || gBattleMoves[gCurrentMove].target != MOVE_TARGET_x10)
+ && gBattleMons[ewram16010arr(gBankAttacker)].ability != ABILITY_LIGHTNING_ROD
+ && gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC)
+ {
+ side = GetBankSide(gBankAttacker);
+ for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ {
+ if (side != GetBankSide(gActiveBank)
+ && ewram16010arr(gBankAttacker) != gActiveBank
+ && gBattleMons[gActiveBank].ability == ABILITY_LIGHTNING_ROD
+ && BankGetTurnOrder(gActiveBank) < var)
+ {
+ var = BankGetTurnOrder(gActiveBank);
+ }
+ }
+ if (var == 4)
+ {
+ if (gBattleMoves[gChosenMove].target & MOVE_TARGET_RANDOM)
+ {
+ if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
+ {
+ if (Random() & 1)
+ gBankTarget = GetBankByIdentity(IDENTITY_OPPONENT_MON1);
+ else
+ gBankTarget = GetBankByIdentity(IDENTITY_OPPONENT_MON2);
+ }
+ else
+ {
+ if (Random() & 1)
+ gBankTarget = GetBankByIdentity(IDENTITY_PLAYER_MON1);
+ else
+ gBankTarget = GetBankByIdentity(IDENTITY_PLAYER_MON2);
+ }
+ }
+ else
+ {
+ gBankTarget = ewram16010arr(gBankAttacker);
+ }
+
+ if (gAbsentBankFlags & gBitTable[gBankTarget])
+ {
+ if (GetBankSide(gBankAttacker) != GetBankSide(gBankTarget))
+ {
+ gBankTarget = GetBankByIdentity(GetBankIdentity(gBankTarget) ^ BIT_MON);
+ }
+ else
+ {
+ gBankTarget = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ BIT_SIDE);
+ if (gAbsentBankFlags & gBitTable[gBankTarget])
+ gBankTarget = GetBankByIdentity(GetBankIdentity(gBankTarget) ^ BIT_MON);
+ }
+ }
+ }
+ else
+ {
+ gActiveBank = gBanksByTurnOrder[var];
+ RecordAbilityBattle(gActiveBank, gBattleMons[gActiveBank].ability);
+ gSpecialStatuses[gActiveBank].lightningRodRedirected = 1;
+ gBankTarget = gActiveBank;
+ }
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE
+ && gBattleMoves[gChosenMove].target & MOVE_TARGET_RANDOM)
+ {
+ if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
+ {
+ if (Random() & 1)
+ gBankTarget = GetBankByIdentity(IDENTITY_OPPONENT_MON1);
+ else
+ gBankTarget = GetBankByIdentity(IDENTITY_OPPONENT_MON2);
+ }
+ else
+ {
+ if (Random() & 1)
+ gBankTarget = GetBankByIdentity(IDENTITY_PLAYER_MON1);
+ else
+ gBankTarget = GetBankByIdentity(IDENTITY_PLAYER_MON2);
+ }
+
+ if (gAbsentBankFlags & gBitTable[gBankTarget]
+ && GetBankSide(gBankAttacker) != GetBankSide(gBankTarget))
+ {
+ gBankTarget = GetBankByIdentity(GetBankIdentity(gBankTarget) ^ BIT_MON);
+ }
+ }
+ else
+ {
+ gBankTarget = ewram16010arr(gBankAttacker);
+ if (gAbsentBankFlags & gBitTable[gBankTarget])
+ {
+ if (GetBankSide(gBankAttacker) != GetBankSide(gBankTarget))
+ {
+ gBankTarget = GetBankByIdentity(GetBankIdentity(gBankTarget) ^ BIT_MON);
+ }
+ else
+ {
+ gBankTarget = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ BIT_SIDE);
+ if (gAbsentBankFlags & gBitTable[gBankTarget])
+ gBankTarget = GetBankByIdentity(GetBankIdentity(gBankTarget) ^ BIT_MON);
+ }
+ }
+ }
+
+ gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect];
+ gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT;
+}
+
+void HandleAction_Switch(void)
+{
+ gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber];
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 0;
+ gActionSelectionCursor[gBankAttacker] = 0;
+ gMoveSelectionCursor[gBankAttacker] = 0;
+
+ PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBankAttacker, ewram16064arr(gBankAttacker))
+
+ ewram16003 = gBankAttacker;
+ gBattlescriptCurrInstr = BattleScript_ActionSwitch;
+ gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT;
+
+ if (gBattleResults.unk2 < 255)
+ gBattleResults.unk2++;
+}
+
+#ifdef NONMATCHING
+void HandleAction_UseItem(void)
+{
+ gBankAttacker = gBankTarget = gBanksByTurnOrder[gCurrentTurnActionNumber];
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 0;
+ gDisableStructs[gBankAttacker].furyCutterCounter = 0;
+ gLastUsedItem = gBattleBufferB[gBankAttacker][1] | (gBattleBufferB[gBankAttacker][2] << 8);
+
+ if (gLastUsedItem <= ITEM_PREMIER_BALL) // is ball
+ {
+ gBattlescriptCurrInstr = gBattlescriptsForBallThrow[gLastUsedItem];
+ }
+ else if (gLastUsedItem == ITEM_POKE_DOLL || gLastUsedItem == ITEM_FLUFFY_TAIL)
+ {
+ gBattlescriptCurrInstr = gBattlescriptsForRunningByItem[0];
+ }
+ else if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
+ {
+ gBattlescriptCurrInstr = gBattlescriptsForUsingItem[0];
+ }
+ else
+ {
+ ewram16003 = gBankAttacker;
+
+ switch (ewram160D8(gBankAttacker))
+ {
+ case AI_ITEM_FULL_RESTORE:
+ case AI_ITEM_HEAL_HP:
+ break;
+ case AI_ITEM_CURE_CONDITION:
+ gBattleCommunication[MULTISTRING_CHOOSER] = 0;
+ if (ewram160DA(gBankAttacker) & 1)
+ {
+ if (ewram160DA(gBankAttacker) & 0x3E)
+ gBattleCommunication[MULTISTRING_CHOOSER] = 5;
+ }
+ else
+ {
+ while (!(ewram160DA(gBankAttacker) & 1))
+ {
+ ewram160DA(gBankAttacker) /= 2;
+ gBattleCommunication[MULTISTRING_CHOOSER]++;
+ }
+ }
+ break;
+ case AI_ITEM_X_STAT:
+ gBattleCommunication[MULTISTRING_CHOOSER] = 4;
+ if (ewram160DA(gBankAttacker) & 0x80)
+ {
+ gBattleCommunication[MULTISTRING_CHOOSER] = 5;
+ }
+ else
+ {
+ PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK)
+ PREPARE_STRING_BUFFER(gBattleTextBuff2, 0xD2)
+
+ while (!(ewram160DA(gBankAttacker) & 1))
+ {
+ ewram160DA(gBankAttacker) /= 2;
+ gBattleTextBuff1[2]++;
+ }
+
+ ewram160A4 = gBattleTextBuff1[2] + 14;
+ ewram160A5 = 0;
+ }
+ break;
+ case AI_ITEM_GUARD_SPECS:
+ if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
+ gBattleCommunication[MULTISTRING_CHOOSER] = 2;
+ else
+ gBattleCommunication[MULTISTRING_CHOOSER] = 0;
+ break;
+ }
+
+ gBattlescriptCurrInstr = gBattlescriptsForUsingItem[ewram160D8(gBankAttacker)];
+ }
+ gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT;
+}
+#else
+__attribute__((naked))
+void HandleAction_UseItem(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 r4, _08014804 @ =gBankAttacker\n\
+ ldr r2, _08014808 @ =gBankTarget\n\
+ ldr r1, _0801480C @ =gBanksByTurnOrder\n\
+ ldr r0, _08014810 @ =gCurrentTurnActionNumber\n\
+ ldrb r0, [r0]\n\
+ adds r0, r1\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r2]\n\
+ strb r0, [r4]\n\
+ ldr r0, _08014814 @ =gBattle_BG0_X\n\
+ movs r2, 0\n\
+ strh r2, [r0]\n\
+ ldr r0, _08014818 @ =gBattle_BG0_Y\n\
+ strh r2, [r0]\n\
+ ldr r3, _0801481C @ =gDisableStructs\n\
+ ldrb r1, [r4]\n\
+ lsls r0, r1, 3\n\
+ subs r0, r1\n\
+ lsls r0, 2\n\
+ adds r0, r3\n\
+ strb r2, [r0, 0x10]\n\
+ ldr r5, _08014820 @ =gLastUsedItem\n\
+ ldr r2, _08014824 @ =gBattleBufferB\n\
+ ldrb r1, [r4]\n\
+ lsls r1, 9\n\
+ adds r0, r2, 0x1\n\
+ adds r0, r1, r0\n\
+ ldrb r3, [r0]\n\
+ adds r2, 0x2\n\
+ adds r1, r2\n\
+ ldrb r0, [r1]\n\
+ lsls r0, 8\n\
+ orrs r3, r0\n\
+ strh r3, [r5]\n\
+ cmp r3, 0xC\n\
+ bhi _08014830\n\
+ ldr r2, _08014828 @ =gBattlescriptCurrInstr\n\
+ ldr r1, _0801482C @ =gBattlescriptsForBallThrow\n\
+ ldrh r0, [r5]\n\
+ lsls r0, 2\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ str r0, [r2]\n\
+ b _08014A8C\n\
+ .align 2, 0\n\
+_08014804: .4byte gBankAttacker\n\
+_08014808: .4byte gBankTarget\n\
+_0801480C: .4byte gBanksByTurnOrder\n\
+_08014810: .4byte gCurrentTurnActionNumber\n\
+_08014814: .4byte gBattle_BG0_X\n\
+_08014818: .4byte gBattle_BG0_Y\n\
+_0801481C: .4byte gDisableStructs\n\
+_08014820: .4byte gLastUsedItem\n\
+_08014824: .4byte gBattleBufferB\n\
+_08014828: .4byte gBattlescriptCurrInstr\n\
+_0801482C: .4byte gBattlescriptsForBallThrow\n\
+_08014830:\n\
+ adds r0, r3, 0\n\
+ subs r0, 0x50\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ cmp r0, 0x1\n\
+ bhi _0801484C\n\
+ ldr r0, _08014844 @ =gBattlescriptCurrInstr\n\
+ ldr r1, _08014848 @ =gBattlescriptsForRunningByItem\n\
+ b _0801485C\n\
+ .align 2, 0\n\
+_08014844: .4byte gBattlescriptCurrInstr\n\
+_08014848: .4byte gBattlescriptsForRunningByItem\n\
+_0801484C:\n\
+ ldrb r0, [r4]\n\
+ bl GetBankSide\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _0801486C\n\
+ ldr r0, _08014864 @ =gBattlescriptCurrInstr\n\
+ ldr r1, _08014868 @ =gBattlescriptsForUsingItem\n\
+_0801485C:\n\
+ ldr r1, [r1]\n\
+ str r1, [r0]\n\
+ b _08014A8C\n\
+ .align 2, 0\n\
+_08014864: .4byte gBattlescriptCurrInstr\n\
+_08014868: .4byte gBattlescriptsForUsingItem\n\
+_0801486C:\n\
+ ldr r2, _080148A0 @ =gSharedMem\n\
+ ldrb r0, [r4]\n\
+ ldr r3, _080148A4 @ =0x00016003\n\
+ adds r1, r2, r3\n\
+ strb r0, [r1]\n\
+ lsls r0, 24\n\
+ lsrs r0, 25\n\
+ ldr r1, _080148A8 @ =0x000160d8\n\
+ adds r0, r1\n\
+ adds r0, r2\n\
+ ldrb r0, [r0]\n\
+ subs r0, 0x1\n\
+ mov r8, r4\n\
+ ldr r3, _080148AC @ =gBattlescriptCurrInstr\n\
+ mov r9, r3\n\
+ ldr r1, _080148B0 @ =gBattlescriptsForUsingItem\n\
+ mov r10, r1\n\
+ adds r7, r2, 0\n\
+ cmp r0, 0x4\n\
+ bls _08014896\n\
+ b _08014A74\n\
+_08014896:\n\
+ lsls r0, 2\n\
+ ldr r1, _080148B4 @ =_080148B8\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .align 2, 0\n\
+_080148A0: .4byte gSharedMem\n\
+_080148A4: .4byte 0x00016003\n\
+_080148A8: .4byte 0x000160d8\n\
+_080148AC: .4byte gBattlescriptCurrInstr\n\
+_080148B0: .4byte gBattlescriptsForUsingItem\n\
+_080148B4: .4byte _080148B8\n\
+ .align 2, 0\n\
+_080148B8:\n\
+ .4byte _08014A74\n\
+ .4byte _08014A74\n\
+ .4byte _080148CC\n\
+ .4byte _08014958\n\
+ .4byte _08014A30\n\
+_080148CC:\n\
+ ldr r2, _08014904 @ =gBattleCommunication\n\
+ movs r0, 0\n\
+ strb r0, [r2, 0x5]\n\
+ ldr r1, _08014908 @ =gBankAttacker\n\
+ ldrb r0, [r1]\n\
+ lsrs r0, 1\n\
+ ldr r6, _0801490C @ =0x000160da\n\
+ adds r0, r6\n\
+ adds r0, r7\n\
+ ldrb r3, [r0]\n\
+ movs r0, 0x1\n\
+ ands r0, r3\n\
+ mov r8, r1\n\
+ cmp r0, 0\n\
+ beq _08014918\n\
+ movs r0, 0x3E\n\
+ ands r0, r3\n\
+ ldr r3, _08014910 @ =gBattlescriptCurrInstr\n\
+ mov r9, r3\n\
+ ldr r1, _08014914 @ =gBattlescriptsForUsingItem\n\
+ mov r10, r1\n\
+ cmp r0, 0\n\
+ bne _080148FC\n\
+ b _08014A74\n\
+_080148FC:\n\
+ movs r0, 0x5\n\
+ strb r0, [r2, 0x5]\n\
+ b _08014A74\n\
+ .align 2, 0\n\
+_08014904: .4byte gBattleCommunication\n\
+_08014908: .4byte gBankAttacker\n\
+_0801490C: .4byte 0x000160da\n\
+_08014910: .4byte gBattlescriptCurrInstr\n\
+_08014914: .4byte gBattlescriptsForUsingItem\n\
+_08014918:\n\
+ ldr r3, _08014950 @ =gBattlescriptCurrInstr\n\
+ mov r9, r3\n\
+ ldr r0, _08014954 @ =gBattlescriptsForUsingItem\n\
+ mov r10, r0\n\
+ adds r5, r7, 0\n\
+ mov r4, r8\n\
+ adds r3, r6, 0\n\
+_08014926:\n\
+ ldrb r0, [r4]\n\
+ lsrs r0, 1\n\
+ adds r0, r3\n\
+ adds r0, r5\n\
+ ldrb r1, [r0]\n\
+ lsrs r1, 1\n\
+ strb r1, [r0]\n\
+ ldrb r0, [r2, 0x5]\n\
+ adds r0, 0x1\n\
+ strb r0, [r2, 0x5]\n\
+ ldrb r0, [r4]\n\
+ lsrs r0, 1\n\
+ adds r0, r3\n\
+ adds r0, r5\n\
+ ldrb r1, [r0]\n\
+ movs r0, 0x1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08014926\n\
+ b _08014A74\n\
+ .align 2, 0\n\
+_08014950: .4byte gBattlescriptCurrInstr\n\
+_08014954: .4byte gBattlescriptsForUsingItem\n\
+_08014958:\n\
+ ldr r3, _0801498C @ =gBattleCommunication\n\
+ movs r0, 0x4\n\
+ strb r0, [r3, 0x5]\n\
+ ldr r2, _08014990 @ =gBankAttacker\n\
+ ldrb r0, [r2]\n\
+ lsrs r0, 1\n\
+ ldr r1, _08014994 @ =0x000160da\n\
+ mov r12, r1\n\
+ add r0, r12\n\
+ adds r6, r0, r7\n\
+ ldrb r1, [r6]\n\
+ movs r0, 0x80\n\
+ ands r0, r1\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ mov r8, r2\n\
+ cmp r5, 0\n\
+ beq _080149A0\n\
+ movs r0, 0x5\n\
+ strb r0, [r3, 0x5]\n\
+ ldr r2, _08014998 @ =gBattlescriptCurrInstr\n\
+ mov r9, r2\n\
+ ldr r3, _0801499C @ =gBattlescriptsForUsingItem\n\
+ mov r10, r3\n\
+ b _08014A74\n\
+ .align 2, 0\n\
+_0801498C: .4byte gBattleCommunication\n\
+_08014990: .4byte gBankAttacker\n\
+_08014994: .4byte 0x000160da\n\
+_08014998: .4byte gBattlescriptCurrInstr\n\
+_0801499C: .4byte gBattlescriptsForUsingItem\n\
+_080149A0:\n\
+ ldr r3, _08014A18 @ =gBattleTextBuff1\n\
+ movs r4, 0xFD\n\
+ strb r4, [r3]\n\
+ movs r0, 0x5\n\
+ strb r0, [r3, 0x1]\n\
+ movs r2, 0x1\n\
+ strb r2, [r3, 0x2]\n\
+ movs r0, 0xFF\n\
+ strb r0, [r3, 0x3]\n\
+ ldr r1, _08014A1C @ =gBattleTextBuff2\n\
+ strb r4, [r1]\n\
+ strb r5, [r1, 0x1]\n\
+ movs r0, 0xD2\n\
+ strb r0, [r1, 0x2]\n\
+ strb r5, [r1, 0x3]\n\
+ subs r0, 0xD3\n\
+ strb r0, [r1, 0x4]\n\
+ ldrb r0, [r6]\n\
+ ands r2, r0\n\
+ ldr r0, _08014A20 @ =gBattlescriptCurrInstr\n\
+ mov r9, r0\n\
+ ldr r1, _08014A24 @ =gBattlescriptsForUsingItem\n\
+ mov r10, r1\n\
+ adds r6, r3, 0\n\
+ cmp r2, 0\n\
+ bne _08014A02\n\
+ adds r3, r7, 0\n\
+ mov r5, r8\n\
+ mov r4, r12\n\
+ adds r2, r6, 0\n\
+_080149DC:\n\
+ ldrb r0, [r5]\n\
+ lsrs r0, 1\n\
+ adds r0, r4\n\
+ adds r0, r3\n\
+ ldrb r1, [r0]\n\
+ lsrs r1, 1\n\
+ strb r1, [r0]\n\
+ ldrb r0, [r2, 0x2]\n\
+ adds r0, 0x1\n\
+ strb r0, [r2, 0x2]\n\
+ ldrb r0, [r5]\n\
+ lsrs r0, 1\n\
+ adds r0, r4\n\
+ adds r0, r3\n\
+ ldrb r1, [r0]\n\
+ movs r0, 0x1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080149DC\n\
+_08014A02:\n\
+ ldrb r0, [r6, 0x2]\n\
+ adds r0, 0xE\n\
+ ldr r2, _08014A28 @ =0x000160a4\n\
+ adds r1, r7, r2\n\
+ movs r2, 0\n\
+ strb r0, [r1]\n\
+ ldr r3, _08014A2C @ =0x000160a5\n\
+ adds r0, r7, r3\n\
+ strb r2, [r0]\n\
+ b _08014A74\n\
+ .align 2, 0\n\
+_08014A18: .4byte gBattleTextBuff1\n\
+_08014A1C: .4byte gBattleTextBuff2\n\
+_08014A20: .4byte gBattlescriptCurrInstr\n\
+_08014A24: .4byte gBattlescriptsForUsingItem\n\
+_08014A28: .4byte 0x000160a4\n\
+_08014A2C: .4byte 0x000160a5\n\
+_08014A30:\n\
+ ldr r0, _08014A50 @ =gBattleTypeFlags\n\
+ ldrh r0, [r0]\n\
+ movs r1, 0x1\n\
+ ands r1, r0\n\
+ cmp r1, 0\n\
+ beq _08014A64\n\
+ ldr r1, _08014A54 @ =gBattleCommunication\n\
+ movs r0, 0x2\n\
+ strb r0, [r1, 0x5]\n\
+ ldr r0, _08014A58 @ =gBankAttacker\n\
+ mov r8, r0\n\
+ ldr r1, _08014A5C @ =gBattlescriptCurrInstr\n\
+ mov r9, r1\n\
+ ldr r2, _08014A60 @ =gBattlescriptsForUsingItem\n\
+ mov r10, r2\n\
+ b _08014A74\n\
+ .align 2, 0\n\
+_08014A50: .4byte gBattleTypeFlags\n\
+_08014A54: .4byte gBattleCommunication\n\
+_08014A58: .4byte gBankAttacker\n\
+_08014A5C: .4byte gBattlescriptCurrInstr\n\
+_08014A60: .4byte gBattlescriptsForUsingItem\n\
+_08014A64:\n\
+ ldr r0, _08014AA0 @ =gBattleCommunication\n\
+ strb r1, [r0, 0x5]\n\
+ ldr r3, _08014AA4 @ =gBankAttacker\n\
+ mov r8, r3\n\
+ ldr r0, _08014AA8 @ =gBattlescriptCurrInstr\n\
+ mov r9, r0\n\
+ ldr r1, _08014AAC @ =gBattlescriptsForUsingItem\n\
+ mov r10, r1\n\
+_08014A74:\n\
+ mov r2, r8\n\
+ ldrb r0, [r2]\n\
+ lsrs r0, 1\n\
+ ldr r3, _08014AB0 @ =0x000160d8\n\
+ adds r0, r3\n\
+ adds r0, r7\n\
+ ldrb r0, [r0]\n\
+ lsls r0, 2\n\
+ add r0, r10\n\
+ ldr r0, [r0]\n\
+ mov r1, r9\n\
+ str r0, [r1]\n\
+_08014A8C:\n\
+ movs r0, 0xA\n\
+ ldr r2, _08014AB4 @ =gCurrentActionFuncId\n\
+ strb r0, [r2]\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\
+_08014AA0: .4byte gBattleCommunication\n\
+_08014AA4: .4byte gBankAttacker\n\
+_08014AA8: .4byte gBattlescriptCurrInstr\n\
+_08014AAC: .4byte gBattlescriptsForUsingItem\n\
+_08014AB0: .4byte 0x000160d8\n\
+_08014AB4: .4byte gCurrentActionFuncId\n\
+ .syntax divided\n");
+}
+#endif // NONMATCHING
+
+bool8 TryRunFromBattle(u8 bank)
+{
+ bool8 effect = FALSE;
+ u8 holdEffect;
+ u8 speedVar;
+
+ if (gBattleMons[bank].item == ITEM_ENIGMA_BERRY)
+ holdEffect = gEnigmaBerries[bank].holdEffect;
+ else
+ holdEffect = ItemId_GetHoldEffect(gBattleMons[bank].item);
+
+ gStringBank = bank;
+
+ if (holdEffect == HOLD_EFFECT_CAN_ALWAYS_RUN)
+ {
+ gLastUsedItem = gBattleMons[bank].item ;
+ gProtectStructs[bank].fleeFlag = 1;
+ effect++;
+ }
+ else if (gBattleMons[bank].ability == ABILITY_RUN_AWAY)
+ {
+ gLastUsedAbility = ABILITY_RUN_AWAY;
+ gProtectStructs[bank].fleeFlag = 2;
+ effect++;
+ }
+ else
+ {
+ if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
+ {
+ if (gBattleMons[bank].speed < gBattleMons[bank ^ BIT_SIDE].speed)
+ {
+ speedVar = (gBattleMons[bank].speed * 128) / (gBattleMons[bank ^ BIT_SIDE].speed) + (ewram16078 * 30);
+ if (speedVar > (Random() & 0xFF))
+ effect++;
+ }
+ else // same speed or faster
+ {
+ effect++;
+ }
+ }
+
+ ewram16078++;
+ }
+
+ if (effect)
+ {
+ gCurrentTurnActionNumber = gNoOfAllBanks;
+ gBattleOutcome = BATTLE_RAN;
+ }
+
+ return effect;
+}
+
+void HandleAction_Run(void)
+{
+ gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber];
+
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ {
+ gCurrentTurnActionNumber = gNoOfAllBanks;
+
+ for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ {
+ if (GetBankSide(gActiveBank) == SIDE_PLAYER)
+ {
+ if (gActionForBanks[gActiveBank] == ACTION_RUN)
+ gBattleOutcome |= BATTLE_LOST;
+ }
+ else
+ {
+ if (gActionForBanks[gActiveBank] == ACTION_RUN)
+ gBattleOutcome |= BATTLE_WON;
+ }
+ }
+
+ gBattleOutcome |= OUTCOME_LINK_BATTLE_RUN;
+ }
+ else
+ {
+ if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
+ {
+ if (!TryRunFromBattle(gBankAttacker)) // failed to run away
+ {
+ gBattleMons[gBankAttacker].status2 &= ~STATUS2_DESTINY_BOND;
+ gBattleCommunication[MULTISTRING_CHOOSER] = 3;
+ gBattlescriptCurrInstr = BattleScript_PrintFailedToRunString;
+ gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT;
+ }
+ }
+ else
+ {
+ if (gBattleMons[gBankAttacker].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION))
+ {
+ gBattleCommunication[MULTISTRING_CHOOSER] = 4;
+ gBattlescriptCurrInstr = BattleScript_PrintFailedToRunString;
+ gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT;
+ }
+ else
+ {
+ gCurrentTurnActionNumber = gNoOfAllBanks;
+ gBattleOutcome = BATTLE_POKE_FLED;
+ }
+ }
+ }
+}
+
+void HandleAction_WatchesCarefully(void)
+{
+ gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber];
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 0;
+ gBattlescriptCurrInstr = gBattlescriptsForSafariActions[0];
+ gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT;
+}
+
+void HandleAction_SafariZoneBallThrow(void)
+{
+ gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber];
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 0;
+ gNumSafariBalls--;
+ gLastUsedItem = ITEM_SAFARI_BALL;
+ gBattlescriptCurrInstr = gBattlescriptsForBallThrow[ITEM_SAFARI_BALL];
+ gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT;
+}
+
+void HandleAction_ThrowPokeblock(void)
+{
+ gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber];
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 0;
+ gBattleCommunication[MULTISTRING_CHOOSER] = gBattleBufferB[gBankAttacker][1] - 1;
+ gLastUsedItem = gBattleBufferB[gBankAttacker][2];
+
+ if (ewram16087 < 3)
+ ewram16087++;
+ if (ewram16088 > 1)
+ {
+ if (ewram16088 < gUnknown_081FA70C[ewram16087][gBattleCommunication[MULTISTRING_CHOOSER]])
+ ewram16088 = 1;
+ else
+ ewram16088 -= gUnknown_081FA70C[ewram16087][gBattleCommunication[MULTISTRING_CHOOSER]];
+ }
+
+ gBattlescriptCurrInstr = gBattlescriptsForSafariActions[2];
+ gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT;
+}
+
+void HandleAction_GoNear(void)
+{
+ gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber];
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 0;
+
+ ewram16089 += gUnknown_081FA71B[ewram16086];
+ if (ewram16089 > 20)
+ ewram16089 = 20;
+
+ ewram16088 += gUnknown_081FA71F[ewram16086];
+ if (ewram16088 > 20)
+ ewram16088 = 20;
+
+ if (ewram16086 < 3)
+ {
+ ewram16086++;
+ gBattleCommunication[MULTISTRING_CHOOSER] = 0;
+ }
+ else
+ {
+ gBattleCommunication[MULTISTRING_CHOOSER] = 1;
+ }
+ gBattlescriptCurrInstr = gBattlescriptsForSafariActions[1];
+ gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT;
+}
+
+void HandleAction_SafriZoneRun(void)
+{
+ gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber];
+ PlaySE(SE_NIGERU);
+ gCurrentTurnActionNumber = gNoOfAllBanks;
+ gBattleOutcome = BATTLE_RAN;
+}
+
+void HandleAction_Action9(void)
+{
+ gBankAttacker = gBanksByTurnOrder[gCurrentTurnActionNumber];
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 0;
+
+ PREPARE_MON_NICK_BUFFER(gBattleTextBuff1, gBankAttacker, gBattlePartyID[gBankAttacker])
+
+ gBattlescriptCurrInstr = gBattlescriptsForSafariActions[3];
+ gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT;
+ gActionsByTurnOrder[1] = ACTION_FINISHED;
+}
+
+void HandleAction_Action11(void)
+{
+ if (!HandleFaintedMonActions())
+ {
+ ewram16059 = 0;
+ gCurrentActionFuncId = ACTION_FINISHED;
+ }
+}
+
+void HandleAction_NothingIsFainted(void)
+{
+ gCurrentTurnActionNumber++;
+ gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber];
+ gHitMarker &= ~(HITMARKER_DESTINYBOND | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_ATTACKSTRING_PRINTED
+ | HITMARKER_NO_PPDEDUCT | HITMARKER_IGNORE_SAFEGUARD | HITMARKER_IGNORE_ON_AIR
+ | HITMARKER_IGNORE_UNDERGROUND | HITMARKER_IGNORE_UNDERWATER | HITMARKER_x100000
+ | HITMARKER_OBEYS | HITMARKER_x10 | HITMARKER_SYNCHRONISE_EFFECT
+ | HITMARKER_x8000000 | HITMARKER_x4000000);
+}
+
+void HandleAction_ActionFinished(void)
+{
+ gCurrentTurnActionNumber++;
+ gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber];
+ SpecialStatusesClear();
+ gHitMarker &= ~(HITMARKER_DESTINYBOND | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_ATTACKSTRING_PRINTED
+ | HITMARKER_NO_PPDEDUCT | HITMARKER_IGNORE_SAFEGUARD | HITMARKER_IGNORE_ON_AIR
+ | HITMARKER_IGNORE_UNDERGROUND | HITMARKER_IGNORE_UNDERWATER | HITMARKER_x100000
+ | HITMARKER_OBEYS | HITMARKER_x10 | HITMARKER_SYNCHRONISE_EFFECT
+ | HITMARKER_x8000000 | HITMARKER_x4000000);
+
+ gBattleMoveDamage = 0;
+ ewram16002 = 0;
+ ewram160A1 = 0;
+ gMoveHitWith[gBankAttacker] = 0;
+ gUnknown_02024C44[gBankAttacker] = 0;
+ eDynamicMoveType = 0;
+ gDynamicBasePower = 0;
+ ewram1600C = 0;
+ gBattleCommunication[3] = 0;
+ gBattleCommunication[4] = 0;
+ eMultihitMoveEffect = 0;
+ ewram17130 = 0;
+}
diff --git a/src/battle_4.c b/src/battle/battle_4.c
index a796ace94..5a20a8324 100644
--- a/src/battle_4.c
+++ b/src/battle/battle_4.c
@@ -1,24 +1,27 @@
#include "global.h"
#include "battle.h"
-#include "battle_move_effects.h"
-#include "moves.h"
-#include "abilities.h"
+#include "battle_util.h"
+#include "constants/battle_move_effects.h"
+#include "constants/moves.h"
+#include "constants/abilities.h"
#include "item.h"
-#include "items.h"
+#include "constants/items.h"
#include "data2.h"
-#include "hold_effects.h"
-#include "rng.h"
+#include "constants/hold_effects.h"
+#include "random.h"
#include "rom3.h"
-#include "species.h"
+#include "constants/species.h"
#include "pokemon.h"
#include "text.h"
#include "palette.h"
#include "main.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "task.h"
#include "decompress.h"
+#include "pokemon_summary_screen.h"
#include "naming_screen.h"
+#include "ewram.h"
//extern needed variables
extern u8 gCritMultiplier;
@@ -33,8 +36,8 @@ extern u8 gActiveBank;
extern u32 gBattleExecBuffer;
extern u8 gNoOfAllBanks;
extern u16 gBattlePartyID[4];
-extern u8 gTurnOrder[4];
-extern u8 gUnknown_02024A76[4];
+extern u8 gBanksByTurnOrder[4];
+extern u8 gActionsByTurnOrder[4];
extern u16 gCurrentMove;
extern u8 gLastUsedAbility;
extern u16 gBattleWeather;
@@ -43,7 +46,7 @@ extern u8 gEffectBank;
extern u8 gAbsentBankFlags;
extern u8 gMultiHitCounter;
extern u16 gLastUsedMove[4];
-extern u16 gLockedMove[4];
+extern u16 gLockedMoves[4];
extern u16 gChosenMovesByBanks[4];
extern u16 gSideAffecting[2];
extern u16 gPauseCounterBattle;
@@ -56,7 +59,7 @@ extern u8 gBankAttacker;
extern u8 gBankTarget;
extern u8* gBattlescriptCurrInstr;
extern u8 gCurrMovePos;
-extern u8 gFightStateTracker;
+extern u8 gCurrentActionFuncId;
extern u32 gHitMarker;
extern u8 gBattleMoveFlags;
extern u8 gBattleCommunication[];
@@ -80,29 +83,29 @@ extern u8 gBattleTextBuff3[];
extern u8 gLeveledUpInBattle;
extern void (*gBattleMainFunc)(void);
extern struct Window gUnknown_03004210;
-extern const u8 gUnknown_08400D7A[];
+extern const u8 BattleText_YesNo[];
extern u8 gPlayerPartyCount;
-extern u16 word_2024E82; //move to learn
+extern u16 gMoveToLearn; //move to learn
extern const u8 gTrainerMoney[];
extern u16 gRandomMove;
-extern u8* gBattleScriptsEffectsTable[];
-extern u16 gUnknown_02024BE8; //last used move in battle
+extern u8* gBattleScriptsForMoveEffects[];
+extern u16 gChosenMove; //last used move in battle
extern u8 gBankInMenu;
extern u8 gActionForBanks[4];
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 u8 gCurrentTurnActionNumber;
+extern u16 gTrappingMoves[];
//extern functions
u8 AtkCanceller_UnableToUseMove(void);
void PressurePPLose(u8 bank_atk, u8 bank_def, u16 move);
void CancelMultiTurnMoves(u8 bank);
-void b_movescr_stack_push(u8* BS_ptr);
-void b_movescr_stack_push_cursor(void);
+void BattleScriptPush(u8* BS_ptr);
+void BattleScriptPushCursor(void);
void RecordAbilityBattle(u8 bank, u8 ability);
void RecordItemBattle(u8 bank, u8 holdEffect);
-int IsPokeDisobedient(void);
static bool8 IsTwoTurnsMove(u16 move);
static void DestinyBondFlagUpdate(void);
static void b_wonderguard_and_levitate(void);
@@ -119,17 +122,16 @@ extern u8 gBattleBufferB[4][0x200];
void sub_80324F8(struct Pokemon*, u8 bank);
void AdjustFriendship(struct Pokemon*, u8 value);
bool8 IsTradedMon(struct Pokemon*);
-void b_movescr_stack_pop_cursor(void);
+void BattleScriptPop(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);
-u8 GetBankByPlayerAI(u8 ID);
+u8 GetBankByIdentity(u8 ID);
void sub_8012258(u8);
-void sub_80157C4(u8 bank); //update sent pokes in battle
-//sub_803B7C8 teach poke a move
+//MonTryLearningNewMove teach poke a move
u16 GiveMoveToBattleMon(struct BattlePokemon *mon, u16 move);
void IncrementGameStat(u8 index);
u8 GetScaledHPFraction(s16 hp, s16 maxhp, u8 scale);
@@ -137,35 +139,29 @@ u16 GetPokedexHeightWeight(u16 national_num, u8 heightweight);
u8 sub_814A5C0(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5);
void DestroyMenuCursor(void);
void sub_802BC6C(void);
-void sub_809D9F0(struct Pokemon *party, u8, u8, void *, u32);
u8 sub_809FA30(void);
bool32 IsHMMove2(u16 move);
void sub_802BBD4(u8 r0, u8 r1, u8 r2, u8 r3, u8 sp0);
void nullsub_6(void);
void ReshowBattleScreenAfterMenu(void);
-void sub_800F808(void);
-void sub_80B79B8(u32* moneySaveblock, u32 to_give);
-void sub_80156DC(void); //set sentpokes value
-bool8 sub_8014AB8(u8 bank); //can run from battle
+void BattleMainCB2(void);
+void AddMoney(u32* moneySaveblock, u32 to_give);
u8 CountAliveMons(u8 caseID);
void sub_803E1B0(struct Pokemon*, u16 item, u8 partyID, u8 r3, u8 sp);
u8 CanRunFromBattle(void);
u8 GetMoveTarget(u16 move, u8 targetbyte); //get target of move
-void sub_80153D0(u8 atk); //pressure perish song pp decrement
u8 CastformDataTypeChange(u8 bank);
-void b_push_move_exec(u8* bs_ptr);
-u8 sav1_map_get_light_level(void);
+u8 Overworld_GetMapTypeOfSaveblockLocation(void);
u8 CalculatePlayerPartyCount(void);
u16 Sqrt(u32 num);
u8 sub_809070C(u16 nationalNum, u32 TiD, u32 PiD); //task prepare poke dex display
void sub_814A880(u8 a1, u8 a2);
u8 CheckMoveLimitations(u8 bank, u8 unusable_moves, u8 flags);
-void sub_801529C(u8 bank);
bool8 IsLinkDoubleBattle(void);
void sub_8094B6C(u8 bank, u8 partyID, u8 r2);
//extern BattleScripts
-extern u8 BattleScript_EndTurn[];
+extern u8 BattleScript_MoveEnd[];
extern u8 BattleScript_NoPPForMove[];
extern u8 BattleScript_MagicCoatBounce[];
extern u8 BattleScript_TookAttack[];
@@ -199,26 +195,32 @@ extern u8 BattleScript_TrainerBallBlock[];
extern u8 BattleScript_WallyBallThrow[];
extern u8 BattleScript_SuccessBallThrow[];
extern u8 BattleScript_ShakeBallThrow[];
-
-extern u8 gUnknown_081D919F[]; //spikes1
-extern u8 gUnknown_081D9171[]; //spikes2
-extern u8 gUnknown_081D91CD[]; //spikes3
-extern u8 BattleScript_1D6F44[]; //present dmg
-extern u8 BattleScript_1D83B5[]; //present full hp
-extern u8 BattleScript_1D839B[]; //present hp heal
-extern u8 BattleScript_1D6F74[];
+extern u8 BattleScript_AllStatsUp[];
+extern u8 BattleScript_AtkDefDown[];
+extern u8 BattleScript_SAtkDown2[];
+
+extern u8 BattleScript_SpikesOnTarget[]; //spikes1
+extern u8 BattleScript_SpikesOnAttacker[]; //spikes2
+extern u8 BattleScript_SpikesOngBank1[]; //spikes3
+extern u8 BattleScript_HitFromCritCalc[]; //present dmg
+extern u8 BattleScript_AlreadyAtFullHp[]; //present full hp
+extern u8 BattleScript_PresentHealTarget[]; //present hp heal
+extern u8 BattleScript_MoveMissedPause[];
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
+extern u8 BattleScript_DampStopsExplosion[];
+extern u8 BattleScript_SuccessForceOut[]; //bs random switchout
+extern u8 BattleScript_PrintPayDayMoneyString[]; //bs payday money give
+extern u8 BattleScript_FaintAttacker[];
+extern u8 BattleScript_FaintTarget[];
+extern u8 BattleScript_DestinyBondTakesLife[];
+extern u8 BattleScript_SelectingImprisionedMoveInPalace[];
+
+// read via orr
#define BSScriptRead32(ptr) ((ptr)[0] | (ptr)[1] << 8 | (ptr)[2] << 16 | (ptr)[3] << 24)
-#define BSScriptRead8(ptr) (((u8)((ptr)[0])))
+#define BSScriptRead16(ptr) ((ptr)[0] | ((ptr)[1] << 8))
#define BSScriptReadPtr(ptr) ((void *)BSScriptRead32(ptr))
-//read via add
+// 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))
@@ -262,55 +264,53 @@ extern u8 gUnknown_081D95DB[]; //bs payday money give
#define sBYTE2_32(value)(( (u8) (((s32)(value) & (0x00FF0000)) >> 0x10)))
#define sBYTE3_32(value)(( (u8) (((s32)(value) & (0xFF000000)) >> 0x18)))
-#define USED_HELD_ITEM(bank)((((u16*)(&unk_2000000[bank * 2 + 0x160cc]))))
-
#define RecordAbilitySetField6(ability, fieldValue) \
(gLastUsedAbility = ability, gBattleCommunication[6] = fieldValue, RecordAbilityBattle(gBankTarget, ability))
#define TARGET_TURN_DAMAGED (((gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_physical.moveturnLostHP_special)))
-#define HP_ON_SWITCHOUT (((u16*)(0x020160bc)))
+#define HP_ON_SWITCHOUT (((u16*)(ewram_addr + 0x160BC)))
static void atk00_attackcanceler(void);
static void atk01_accuracycheck(void);
static void atk02_attackstring(void);
static void atk03_ppreduce(void);
static void atk04_critcalc(void);
-static void atk05_damagecalc1(void);
+static void atk05_damagecalc(void);
static void atk06_typecalc(void);
-static void atk07_dmg_adjustment(void);
-static void atk08_dmg_adjustment2(void);
+static void atk07_adjustnormaldamage(void);
+static void atk08_adjustnormaldamage2(void);
static void atk09_attackanimation(void);
static void atk0A_waitanimation(void);
static void atk0B_healthbarupdate(void);
static void atk0C_datahpupdate(void);
static void atk0D_critmessage(void);
-static void atk0E_effectiveness_sound(void);
+static void atk0E_effectivenesssound(void);
static void atk0F_resultmessage(void);
static void atk10_printstring(void);
-static void atk11_printstring_playeronly(void);
+static void atk11_printselectionstring(void);
static void atk12_waitmessage(void);
static void atk13_printfromtable(void);
-static void atk14_printfromtable_playeronly(void);
-static void atk15_seteffectwithchancetarget(void);
+static void atk14_printselectionstringfromtable(void);
+static void atk15_seteffectwithchance(void);
static void atk16_seteffectprimary(void);
static void atk17_seteffectsecondary(void);
-static void atk18_status_effect_clear(void);
-static void atk19_faint_pokemon(void);
-static void atk1A_faint_animation(void);
-static void atk1B_faint_effects_clear(void);
+static void atk18_clearstatusfromeffect(void);
+static void atk19_tryfaintmon(void);
+static void atk1A_dofaintanimation(void);
+static void atk1B_cleareffectsonfaint(void);
static void atk1C_jumpifstatus(void);
static void atk1D_jumpifstatus2(void);
static void atk1E_jumpifability(void);
static void atk1F_jumpifsideaffecting(void);
static void atk20_jumpifstat(void);
-static void atk21_jumpifstatus3(void);
+static void atk21_jumpifstatus3condition(void);
static void atk22_jumpiftype(void);
static void atk23_getexp(void);
static void atk24(void);
-static void atk25_move_values_cleanup(void);
-static void atk26_set_multihit(void);
-static void atk27_decrement_multihit(void);
+static void atk25_movevaluescleanup(void);
+static void atk26_setmultihit(void);
+static void atk27_decrementmultihit(void);
static void atk28_goto(void);
static void atk29_jumpifbyte(void);
static void atk2A_jumpifhalfword(void);
@@ -321,7 +321,7 @@ static void atk2E_setbyte(void);
static void atk2F_addbyte(void);
static void atk30_subbyte(void);
static void atk31_copyarray(void);
-static void atk32_copyarray_withindex(void);
+static void atk32_copyarraywithindex(void);
static void atk33_orbyte(void);
static void atk34_orhalfword(void);
static void atk35_orword(void);
@@ -335,141 +335,142 @@ static void atk3C_return(void);
static void atk3D_end(void);
static void atk3E_end2(void);
static void atk3F_end3(void);
-static void atk40_jump_if_move_affected_by_protect(void);
+static void atk40_jumpifaffectedbyprotect(void);
static void atk41_call(void);
static void atk42_jumpiftype2(void);
static void atk43_jumpifabilitypresent(void);
-static void atk44(void);
+static void atk44_endselectionscript(void);
static void atk45_playanimation(void);
static void atk46_playanimation2(void);
static void atk47_setgraphicalstatchangevalues(void);
static void atk48_playstatchangeanimation(void);
-static void atk49_moveendturn(void);
+static void atk49_moveend(void);
static void atk4A_typecalc2(void);
-static void atk4B_return_atk_to_ball(void);
-static void atk4C_copy_poke_data(void);
-static void atk4D_switch_data_update(void);
-static void atk4E_switchin_anim(void);
-static void atk4F_jump_if_cannot_switch(void);
+static void atk4B_returnatktoball(void);
+static void atk4C_getswitchedmondata(void);
+static void atk4D_switchindataupdate(void);
+static void atk4E_switchinanim(void);
+static void atk4F_jumpifcantswitch(void);
static void atk50_openpartyscreen(void);
-static void atk51_switch_handle_order(void);
-static void atk52_switch_in_effects(void);
-static void atk53_trainer_slide(void);
-static void atk54_effectiveness_sound(void);
-static void atk55_play_sound(void);
-static void atk56_fainting_cry(void);
+static void atk51_switchhandleorder(void);
+static void atk52_switchineffects(void);
+static void atk53_trainerslidein(void);
+static void atk54_playse(void);
+static void atk55_fanfare(void);
+static void atk56_playfaintcry(void);
static void atk57(void);
-static void atk58_return_to_ball(void);
-void atk59_learnmove_inbattle(void);
-static void atk5A(void);
-static void atk5B_80256E0(void);
+static void atk58_returntoball(void);
+void atk59_handlelearnnewmove(void);
+static void atk5A_yesnoboxlearnmove(void);
+static void atk5B_yesnoboxstoplearningmove(void);
static void atk5C_hitanimation(void);
static void atk5D_getmoneyreward(void);
static void atk5E_8025A70(void);
static void atk5F_8025B24(void);
-static void atk60_increment_gamestat(void);
-static void atk61_8025BA4(void);
+static void atk60_incrementgamestat(void);
+static void atk61_drawpartystatussummary(void);
static void atk62_08025C6C(void);
static void atk63_jumptorandomattack(void);
static void atk64_statusanimation(void);
static void atk65_status2animation(void);
static void atk66_chosenstatusanimation(void);
-static void atk67_8025ECC(void);
-static void atk68_80246A0(void);
-static void atk69_dmg_adjustment2(void);
+static void atk67_yesnobox(void);
+static void atk68_cancelallactions(void);
+static void atk69_adjustsetdamage(void);
void atk6A_removeitem(void);
static void atk6B_atknameinbuff1(void);
-static void atk6C_lvlbox_display(void);
-static void atk6D_set_sentpokes_values(void);
-static void atk6E_set_atk_to_player0(void);
-static void atk6F_set_visible(void);
-static void atk70_record_ability(void);
-static void atk71_buffer_move_to_learn(void);
-static void atk72_jump_if_can_run_frombattle(void);
-static void atk73_hp_thresholds(void);
-static void atk74_hp_thresholds2(void);
-static void atk75_8026A58(void);
+static void atk6C_drawlvlupbox(void);
+static void atk6D_resetsentmonsvalue(void);
+static void atk6E_setatktoplayer0(void);
+static void atk6F_makevisible(void);
+static void atk70_recordlastability(void);
+static void atk71_buffermovetolearn(void);
+static void atk72_jumpifplayerran(void);
+static void atk73_hpthresholds(void);
+static void atk74_hpthresholds2(void);
+static void atk75_useitemonopponent(void);
static void atk76_various(void);
-static void atk77_setprotect(void);
+static void atk77_setprotectlike(void);
static void atk78_faintifabilitynotdamp(void);
static void atk79_setatkhptozero(void);
-static void atk7A_jumpwhiletargetvalid(void);
-static void atk7B_healhalfHP_if_possible(void);
-static void atk7C_8025508(void);
-static void atk7D_set_rain(void);
+static void atk7A_jumpifnexttargetvalid(void);
+static void atk7B_tryhealhalfhealth(void);
+static void atk7C_trymirrormove(void);
+static void atk7D_setrain(void);
static void atk7E_setreflect(void);
static void atk7F_setseeded(void);
static void atk80_manipulatedamage(void);
-static void atk81_setrest(void);
+static void atk81_trysetrest(void);
static void atk82_jumpifnotfirstturn(void);
static void atk83_nop(void);
-static void atk84_jump_if_cant_sleep(void);
+static void atk84_jumpifcantmakeasleep(void);
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);
static void atk8C_confuseifrepeatingattackends(void);
-static void atk8D_setmultihit_counter(void);
-static void atk8E_prepare_multihit(void);
+static void atk8D_setmultihitcounter(void);
+static void atk8E_initmultihitstring(void);
static void atk8F_forcerandomswitch(void);
-static void atk90_conversion_type_change(void);
+static void atk90_tryconversiontypechange(void);
static void atk91_givepaydaymoney(void);
static void atk92_setlightscreen(void);
-static void atk93_ko_move(void);
-static void atk94_gethalfcurrentenemyhp(void);
+static void atk93_tryKO(void);
+static void atk94_damagetohalftargethp(void);
static void atk95_setsandstorm(void);
static void atk96_weatherdamage(void);
-static void atk97_try_infatuation(void);
-static void atk98_status_icon_update(void);
+static void atk97_tryinfatuating(void);
+static void atk98_updatestatusicon(void);
static void atk99_setmist(void);
-static void atk9A_set_focusenergy(void);
+static void atk9A_setfocusenergy(void);
static void atk9B_transformdataexecution(void);
-static void atk9C_set_substitute(void);
-static void atk9D_copyattack(void);
+static void atk9C_setsubstitute(void);
+static void atk9D_mimicattackcopy(void);
static void atk9E_metronome(void);
static void atk9F_dmgtolevel(void);
static void atkA0_psywavedamageeffect(void);
static void atkA1_counterdamagecalculator(void);
static void atkA2_mirrorcoatdamagecalculator(void);
static void atkA3_disablelastusedattack(void);
-static void atkA4_setencore(void);
+static void atkA4_trysetencore(void);
static void atkA5_painsplitdmgcalc(void);
static void atkA6_settypetorandomresistance(void);
static void atkA7_setalwayshitflag(void);
static void atkA8_copymovepermanently(void);
-static void atkA9_sleeptalk_choose_move(void);
-static void atkAA_set_destinybond(void);
-static void atkAB_DestinyBondFlagUpdate(void);
+static void atkA9_trychoosesleeptalkmove(void);
+static void atkAA_setdestinybond(void);
+static void atkAB_trysetdestinybondtohappen(void);
static void atkAC_remaininghptopower(void);
-static void atkAD_spite_ppreduce(void);
-static void atkAE_heal_party_status(void);
+static void atkAD_tryspiteppreduce(void);
+static void atkAE_healpartystatus(void);
static void atkAF_cursetarget(void);
-static void atkB0_set_spikes(void);
-static void atkB1_set_foresight(void);
-static void atkB2_setperishsong(void);
+static void atkB0_trysetspikes(void);
+static void atkB1_setforesight(void);
+static void atkB2_trysetperishsong(void);
static void atkB3_rolloutdamagecalculation(void);
static void atkB4_jumpifconfusedandstatmaxed(void);
static void atkB5_furycuttercalc(void);
static void atkB6_happinesstodamagecalculation(void);
static void atkB7_presentdamagecalculation(void);
-static void atkB8_set_safeguard(void);
+static void atkB8_setsafeguard(void);
static void atkB9_magnitudedamagecalculation(void);
static void atkBA_jumpifnopursuitswitchdmg(void);
static void atkBB_setsunny(void);
static void atkBC_maxattackhalvehp(void);
static void atkBD_copyfoestats(void);
-static void atkBE_breakfree(void);
-static void atkBF_set_defense_curl(void);
+static void atkBE_rapidspinfree(void);
+static void atkBF_setdefensecurlbit(void);
static void atkC0_recoverbasedonsunlight(void);
-static void atkC1_hidden_power(void);
-static void atkC2_selectnexttarget(void);
-static void atkC3_setfutureattack(void);
-static void atkC4_beat_up(void);
-static void atkC5_hidepreattack(void);
-static void atkC6_unhidepostattack(void);
+static void atkC1_hiddenpowercalc(void);
+static void atkC2_selectfirstvalidtarget(void);
+static void atkC3_trysetfutureattack(void);
+static void atkC4_trydobeatup(void);
+static void atkC5_setsemiinvulnerablebit(void);
+static void atkC6_clearsemiinvulnerablebit(void);
static void atkC7_setminimize(void);
static void atkC8_sethail(void);
static void atkC9_jumpifattackandspecialattackcannotfall(void);
@@ -480,45 +481,45 @@ static void atkCD_cureifburnedparalysedorpoisoned(void);
static void atkCE_settorment(void);
static void atkCF_jumpifnodamage(void);
static void atkD0_settaunt(void);
-static void atkD1_set_helpinghand(void);
-static void atkD2_swap_items(void);
-static void atkD3_copy_ability(void);
-static void atkD4_wish_effect(void);
-static void atkD5_setroots(void);
+static void atkD1_trysethelpinghand(void);
+static void atkD2_tryswapitems(void);
+static void atkD3_trycopyability(void);
+static void atkD4_trywish(void);
+static void atkD5_trysetroots(void);
static void atkD6_doubledamagedealtifdamaged(void);
static void atkD7_setyawn(void);
static void atkD8_setdamagetohealthdifference(void);
static void atkD9_scaledamagebyhealthratio(void);
-static void atkDA_abilityswap(void);
-static void atkDB_imprisoneffect(void);
-static void atkDC_setgrudge(void);
+static void atkDA_tryswapabilities(void);
+static void atkDB_tryimprision(void);
+static void atkDC_trysetgrudge(void);
static void atkDD_weightdamagecalculation(void);
static void atkDE_asistattackselect(void);
-static void atkDF_setmagiccoat(void);
-static void atkE0_setstealstatchange(void);
-static void atkE1_intimidate_string_loader(void);
-static void atkE2_switchout_abilities(void);
-static void atkE3_jumpiffainted(void);
+static void atkDF_trysetmagiccoat(void);
+static void atkE0_trysetsnatch(void);
+static void atkE1_trygetintimidatetarget(void);
+static void atkE2_switchoutabilities(void);
+static void atkE3_jumpifhasnohp(void);
static void atkE4_getsecretpowereffect(void);
static void atkE5_pickup(void);
-static void atkE6_castform_change_animation(void);
-static void atkE7_castform_data_change(void);
+static void atkE6_docastformchangeanimation(void);
+static void atkE7_trycastformdatachange(void);
static void atkE8_settypebasedhalvers(void);
static void atkE9_setweatherballtype(void);
-static void atkEA_recycleitem(void);
+static void atkEA_tryrecycleitem(void);
static void atkEB_settypetoterrain(void);
-static void atkEC_pursuit_sth(void);
-static void atkED_802B4B4(void);
+static void atkEC_pursuitrelated(void);
+static void atkED_snatchsetbanks(void);
static void atkEE_removelightscreenreflect(void);
-void atkEF_pokeball_catch_calculation(void);
-static void atkF0_copy_caught_poke(void);
-static void atkF1_setpoke_as_caught(void);
-static void atkF2_display_dex_info(void);
-static void atkF3_nickname_caught_poke(void);
-static void atkF4_802BEF0(void);
+void atkEF_handleballthrow(void);
+static void atkF0_givecaughtmon(void);
+static void atkF1_trysetcaughtmondexflags(void);
+static void atkF2_displaydexinfo(void);
+static void atkF3_trygivecaughtmonnick(void);
+static void atkF4_subattackerhpbydmg(void);
static void atkF5_removeattackerstatus1(void);
-static void atkF6_802BF48(void);
-static void atkF7_802BF54(void);
+static void atkF6_finishaction(void);
+static void atkF7_finishturn(void);
const BattleCmdFunc gBattleScriptingCommandsTable[] =
{
@@ -527,41 +528,41 @@ const BattleCmdFunc gBattleScriptingCommandsTable[] =
atk02_attackstring,
atk03_ppreduce,
atk04_critcalc,
- atk05_damagecalc1,
+ atk05_damagecalc,
atk06_typecalc,
- atk07_dmg_adjustment,
- atk08_dmg_adjustment2,
+ atk07_adjustnormaldamage,
+ atk08_adjustnormaldamage2,
atk09_attackanimation,
atk0A_waitanimation,
atk0B_healthbarupdate,
atk0C_datahpupdate,
atk0D_critmessage,
- atk0E_effectiveness_sound,
+ atk0E_effectivenesssound,
atk0F_resultmessage,
atk10_printstring,
- atk11_printstring_playeronly,
+ atk11_printselectionstring,
atk12_waitmessage,
atk13_printfromtable,
- atk14_printfromtable_playeronly,
- atk15_seteffectwithchancetarget,
+ atk14_printselectionstringfromtable,
+ atk15_seteffectwithchance,
atk16_seteffectprimary,
atk17_seteffectsecondary,
- atk18_status_effect_clear,
- atk19_faint_pokemon,
- atk1A_faint_animation,
- atk1B_faint_effects_clear,
+ atk18_clearstatusfromeffect,
+ atk19_tryfaintmon,
+ atk1A_dofaintanimation,
+ atk1B_cleareffectsonfaint,
atk1C_jumpifstatus,
atk1D_jumpifstatus2,
atk1E_jumpifability,
atk1F_jumpifsideaffecting,
atk20_jumpifstat,
- atk21_jumpifstatus3,
+ atk21_jumpifstatus3condition,
atk22_jumpiftype,
atk23_getexp,
atk24,
- atk25_move_values_cleanup,
- atk26_set_multihit,
- atk27_decrement_multihit,
+ atk25_movevaluescleanup,
+ atk26_setmultihit,
+ atk27_decrementmultihit,
atk28_goto,
atk29_jumpifbyte,
atk2A_jumpifhalfword,
@@ -572,7 +573,7 @@ const BattleCmdFunc gBattleScriptingCommandsTable[] =
atk2F_addbyte,
atk30_subbyte,
atk31_copyarray,
- atk32_copyarray_withindex,
+ atk32_copyarraywithindex,
atk33_orbyte,
atk34_orhalfword,
atk35_orword,
@@ -586,75 +587,75 @@ const BattleCmdFunc gBattleScriptingCommandsTable[] =
atk3D_end,
atk3E_end2,
atk3F_end3,
- atk40_jump_if_move_affected_by_protect,
+ atk40_jumpifaffectedbyprotect,
atk41_call,
atk42_jumpiftype2,
atk43_jumpifabilitypresent,
- atk44,
+ atk44_endselectionscript,
atk45_playanimation,
atk46_playanimation2,
atk47_setgraphicalstatchangevalues,
atk48_playstatchangeanimation,
- atk49_moveendturn,
+ atk49_moveend,
atk4A_typecalc2,
- atk4B_return_atk_to_ball,
- atk4C_copy_poke_data,
- atk4D_switch_data_update,
- atk4E_switchin_anim,
- atk4F_jump_if_cannot_switch,
+ atk4B_returnatktoball,
+ atk4C_getswitchedmondata,
+ atk4D_switchindataupdate,
+ atk4E_switchinanim,
+ atk4F_jumpifcantswitch,
atk50_openpartyscreen,
- atk51_switch_handle_order,
- atk52_switch_in_effects,
- atk53_trainer_slide,
- atk54_effectiveness_sound,
- atk55_play_sound,
- atk56_fainting_cry,
+ atk51_switchhandleorder,
+ atk52_switchineffects,
+ atk53_trainerslidein,
+ atk54_playse,
+ atk55_fanfare,
+ atk56_playfaintcry,
atk57,
- atk58_return_to_ball,
- atk59_learnmove_inbattle,
- atk5A,
- atk5B_80256E0,
+ atk58_returntoball,
+ atk59_handlelearnnewmove,
+ atk5A_yesnoboxlearnmove,
+ atk5B_yesnoboxstoplearningmove,
atk5C_hitanimation,
atk5D_getmoneyreward,
atk5E_8025A70,
atk5F_8025B24,
- atk60_increment_gamestat,
- atk61_8025BA4,
+ atk60_incrementgamestat,
+ atk61_drawpartystatussummary,
atk62_08025C6C,
atk63_jumptorandomattack,
atk64_statusanimation,
atk65_status2animation,
atk66_chosenstatusanimation,
- atk67_8025ECC,
- atk68_80246A0,
- atk69_dmg_adjustment2,
+ atk67_yesnobox,
+ atk68_cancelallactions,
+ atk69_adjustsetdamage,
atk6A_removeitem,
atk6B_atknameinbuff1,
- atk6C_lvlbox_display,
- atk6D_set_sentpokes_values,
- atk6E_set_atk_to_player0,
- atk6F_set_visible,
- atk70_record_ability,
- atk71_buffer_move_to_learn,
- atk72_jump_if_can_run_frombattle,
- atk73_hp_thresholds,
- atk74_hp_thresholds2,
- atk75_8026A58,
+ atk6C_drawlvlupbox,
+ atk6D_resetsentmonsvalue,
+ atk6E_setatktoplayer0,
+ atk6F_makevisible,
+ atk70_recordlastability,
+ atk71_buffermovetolearn,
+ atk72_jumpifplayerran,
+ atk73_hpthresholds,
+ atk74_hpthresholds2,
+ atk75_useitemonopponent,
atk76_various,
- atk77_setprotect,
+ atk77_setprotectlike,
atk78_faintifabilitynotdamp,
atk79_setatkhptozero,
- atk7A_jumpwhiletargetvalid,
- atk7B_healhalfHP_if_possible,
- atk7C_8025508,
- atk7D_set_rain,
+ atk7A_jumpifnexttargetvalid,
+ atk7B_tryhealhalfhealth,
+ atk7C_trymirrormove,
+ atk7D_setrain,
atk7E_setreflect,
atk7F_setseeded,
atk80_manipulatedamage,
- atk81_setrest,
+ atk81_trysetrest,
atk82_jumpifnotfirstturn,
atk83_nop,
- atk84_jump_if_cant_sleep,
+ atk84_jumpifcantmakeasleep,
atk85_stockpile,
atk86_stockpiletobasedamage,
atk87_stockpiletohpheal,
@@ -663,64 +664,64 @@ const BattleCmdFunc gBattleScriptingCommandsTable[] =
atk8A_normalisebuffs,
atk8B_setbide,
atk8C_confuseifrepeatingattackends,
- atk8D_setmultihit_counter,
- atk8E_prepare_multihit,
+ atk8D_setmultihitcounter,
+ atk8E_initmultihitstring,
atk8F_forcerandomswitch,
- atk90_conversion_type_change,
+ atk90_tryconversiontypechange,
atk91_givepaydaymoney,
atk92_setlightscreen,
- atk93_ko_move,
- atk94_gethalfcurrentenemyhp,
+ atk93_tryKO,
+ atk94_damagetohalftargethp,
atk95_setsandstorm,
atk96_weatherdamage,
- atk97_try_infatuation,
- atk98_status_icon_update,
+ atk97_tryinfatuating,
+ atk98_updatestatusicon,
atk99_setmist,
- atk9A_set_focusenergy,
+ atk9A_setfocusenergy,
atk9B_transformdataexecution,
- atk9C_set_substitute,
- atk9D_copyattack,
+ atk9C_setsubstitute,
+ atk9D_mimicattackcopy,
atk9E_metronome,
atk9F_dmgtolevel,
atkA0_psywavedamageeffect,
atkA1_counterdamagecalculator,
atkA2_mirrorcoatdamagecalculator,
atkA3_disablelastusedattack,
- atkA4_setencore,
+ atkA4_trysetencore,
atkA5_painsplitdmgcalc,
atkA6_settypetorandomresistance,
atkA7_setalwayshitflag,
atkA8_copymovepermanently,
- atkA9_sleeptalk_choose_move,
- atkAA_set_destinybond,
- atkAB_DestinyBondFlagUpdate,
+ atkA9_trychoosesleeptalkmove,
+ atkAA_setdestinybond,
+ atkAB_trysetdestinybondtohappen,
atkAC_remaininghptopower,
- atkAD_spite_ppreduce,
- atkAE_heal_party_status,
+ atkAD_tryspiteppreduce,
+ atkAE_healpartystatus,
atkAF_cursetarget,
- atkB0_set_spikes,
- atkB1_set_foresight,
- atkB2_setperishsong,
+ atkB0_trysetspikes,
+ atkB1_setforesight,
+ atkB2_trysetperishsong,
atkB3_rolloutdamagecalculation,
atkB4_jumpifconfusedandstatmaxed,
atkB5_furycuttercalc,
atkB6_happinesstodamagecalculation,
atkB7_presentdamagecalculation,
- atkB8_set_safeguard,
+ atkB8_setsafeguard,
atkB9_magnitudedamagecalculation,
atkBA_jumpifnopursuitswitchdmg,
atkBB_setsunny,
atkBC_maxattackhalvehp,
atkBD_copyfoestats,
- atkBE_breakfree,
- atkBF_set_defense_curl,
+ atkBE_rapidspinfree,
+ atkBF_setdefensecurlbit,
atkC0_recoverbasedonsunlight,
- atkC1_hidden_power,
- atkC2_selectnexttarget,
- atkC3_setfutureattack,
- atkC4_beat_up,
- atkC5_hidepreattack,
- atkC6_unhidepostattack,
+ atkC1_hiddenpowercalc,
+ atkC2_selectfirstvalidtarget,
+ atkC3_trysetfutureattack,
+ atkC4_trydobeatup,
+ atkC5_setsemiinvulnerablebit,
+ atkC6_clearsemiinvulnerablebit,
atkC7_setminimize,
atkC8_sethail,
atkC9_jumpifattackandspecialattackcannotfall,
@@ -731,45 +732,45 @@ const BattleCmdFunc gBattleScriptingCommandsTable[] =
atkCE_settorment,
atkCF_jumpifnodamage,
atkD0_settaunt,
- atkD1_set_helpinghand,
- atkD2_swap_items,
- atkD3_copy_ability,
- atkD4_wish_effect,
- atkD5_setroots,
+ atkD1_trysethelpinghand,
+ atkD2_tryswapitems,
+ atkD3_trycopyability,
+ atkD4_trywish,
+ atkD5_trysetroots,
atkD6_doubledamagedealtifdamaged,
atkD7_setyawn,
atkD8_setdamagetohealthdifference,
atkD9_scaledamagebyhealthratio,
- atkDA_abilityswap,
- atkDB_imprisoneffect,
- atkDC_setgrudge,
+ atkDA_tryswapabilities,
+ atkDB_tryimprision,
+ atkDC_trysetgrudge,
atkDD_weightdamagecalculation,
atkDE_asistattackselect,
- atkDF_setmagiccoat,
- atkE0_setstealstatchange,
- atkE1_intimidate_string_loader,
- atkE2_switchout_abilities,
- atkE3_jumpiffainted,
+ atkDF_trysetmagiccoat,
+ atkE0_trysetsnatch,
+ atkE1_trygetintimidatetarget,
+ atkE2_switchoutabilities,
+ atkE3_jumpifhasnohp,
atkE4_getsecretpowereffect,
atkE5_pickup,
- atkE6_castform_change_animation,
- atkE7_castform_data_change,
+ atkE6_docastformchangeanimation,
+ atkE7_trycastformdatachange,
atkE8_settypebasedhalvers,
atkE9_setweatherballtype,
- atkEA_recycleitem,
+ atkEA_tryrecycleitem,
atkEB_settypetoterrain,
- atkEC_pursuit_sth,
- atkED_802B4B4,
+ atkEC_pursuitrelated,
+ atkED_snatchsetbanks,
atkEE_removelightscreenreflect,
- atkEF_pokeball_catch_calculation,
- atkF0_copy_caught_poke,
- atkF1_setpoke_as_caught,
- atkF2_display_dex_info,
- atkF3_nickname_caught_poke,
- atkF4_802BEF0,
+ atkEF_handleballthrow,
+ atkF0_givecaughtmon,
+ atkF1_trysetcaughtmondexflags,
+ atkF2_displaydexinfo,
+ atkF3_trygivecaughtmonnick,
+ atkF4_subattackerhpbydmg,
atkF5_removeattackerstatus1,
- atkF6_802BF48,
- atkF7_802BF54,
+ atkF6_finishaction,
+ atkF7_finishturn,
};
struct statFractions
@@ -862,64 +863,64 @@ 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[];
-
-const u8* const gMoveEffectBS_Ptrs[] =
-{
- BattleScript_1D963E,
- BattleScript_1D963E,
- BattleScript_1D965A,
- BattleScript_1D9669,
- BattleScript_1D9678,
- BattleScript_1D9687,
- BattleScript_1D969D,
- BattleScript_1D96BA,
- BattleScript_1D963E,
- BattleScript_1D963E,
- BattleScript_1D9696,
- BattleScript_1D96AA,
- BattleScript_1D963E,
- BattleScript_1D96B1,
- BattleScript_1D96C8,
- BattleScript_1D963E,
- BattleScript_1D963E,
- BattleScript_1D963E,
- BattleScript_1D963E,
- BattleScript_1D963E,
- BattleScript_1D963E,
- BattleScript_1D963E,
- BattleScript_1D963E,
- BattleScript_1D963E,
- BattleScript_1D963E,
- BattleScript_1D963E,
- BattleScript_1D963E,
- BattleScript_1D963E,
- BattleScript_1D963E,
- BattleScript_1D963E,
- BattleScript_1D963E,
- BattleScript_1D963E,
- BattleScript_1D963E,
- BattleScript_1D963E,
- BattleScript_1D963E,
- BattleScript_1D963E,
- BattleScript_1D963E,
- BattleScript_1D963E,
- BattleScript_1D96C8
+extern u8 BattleScript_MoveEffectSleep[];
+extern u8 BattleScript_MoveEffectPoison[];
+extern u8 BattleScript_MoveEffectBurn[];
+extern u8 BattleScript_MoveEffectFreeze[];
+extern u8 BattleScript_MoveEffectParalysis[];
+extern u8 BattleScript_MoveEffectToxic[];
+extern u8 BattleScript_MoveEffectConfusion[];
+extern u8 BattleScript_MoveEffectUproar[];
+extern u8 BattleScript_MoveEffectWrap[];
+extern u8 BattleScript_MoveEffectPayDay[];
+extern u8 BattleScript_MoveEffectRecoil33[];
+
+u8* const gMoveEffectBS_Ptrs[] =
+{
+ BattleScript_MoveEffectSleep,
+ BattleScript_MoveEffectSleep,
+ BattleScript_MoveEffectPoison,
+ BattleScript_MoveEffectBurn,
+ BattleScript_MoveEffectFreeze,
+ BattleScript_MoveEffectParalysis,
+ BattleScript_MoveEffectToxic,
+ BattleScript_MoveEffectConfusion,
+ BattleScript_MoveEffectSleep,
+ BattleScript_MoveEffectSleep,
+ BattleScript_MoveEffectUproar,
+ BattleScript_MoveEffectPayDay,
+ BattleScript_MoveEffectSleep,
+ BattleScript_MoveEffectWrap,
+ BattleScript_MoveEffectRecoil33,
+ BattleScript_MoveEffectSleep,
+ BattleScript_MoveEffectSleep,
+ BattleScript_MoveEffectSleep,
+ BattleScript_MoveEffectSleep,
+ BattleScript_MoveEffectSleep,
+ BattleScript_MoveEffectSleep,
+ BattleScript_MoveEffectSleep,
+ BattleScript_MoveEffectSleep,
+ BattleScript_MoveEffectSleep,
+ BattleScript_MoveEffectSleep,
+ BattleScript_MoveEffectSleep,
+ BattleScript_MoveEffectSleep,
+ BattleScript_MoveEffectSleep,
+ BattleScript_MoveEffectSleep,
+ BattleScript_MoveEffectSleep,
+ BattleScript_MoveEffectSleep,
+ BattleScript_MoveEffectSleep,
+ BattleScript_MoveEffectSleep,
+ BattleScript_MoveEffectSleep,
+ BattleScript_MoveEffectSleep,
+ BattleScript_MoveEffectSleep,
+ BattleScript_MoveEffectSleep,
+ BattleScript_MoveEffectSleep,
+ BattleScript_MoveEffectRecoil33
};
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 +948,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,
@@ -1021,13 +1022,13 @@ static void atk00_attackcanceler(void)
int i;
if (gBattleOutcome)
{
- gFightStateTracker = 0xC;
+ gCurrentActionFuncId = 0xC;
return;
}
if (gBattleMons[gBankAttacker].hp == 0 && !(gHitMarker & HITMARKER_NO_ATTACKSTRING))
{
gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;
- gBattlescriptCurrInstr = BattleScript_EndTurn;
+ gBattlescriptCurrInstr = BattleScript_MoveEnd;
return;
}
if (AtkCanceller_UnableToUseMove())
@@ -1044,7 +1045,7 @@ static void atk00_attackcanceler(void)
gHitMarker &= ~(HITMARKER_x800000);
if (!(gHitMarker & HITMARKER_OBEYS) && !(gBattleMons[gBankAttacker].status2 & STATUS2_MULTIPLETURNS))
{
- u8 disobedient = IsPokeDisobedient();
+ u8 disobedient = IsMonDisobedient();
asm("":::"r0"); //It's impossible to match
asm("":::"r1");
if ((disobedient))
@@ -1061,18 +1062,18 @@ static void atk00_attackcanceler(void)
{
PressurePPLose(gBankAttacker, gBankTarget, MOVE_MAGIC_COAT);
gProtectStructs[gBankTarget].bounceMove = 0;
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_MagicCoatBounce;
return;
}
for (i = 0; i < gNoOfAllBanks; i++)
{
- if ((gProtectStructs[gTurnOrder[i]].stealMove) && gBattleMoves[gCurrentMove].flags & FLAG_SNATCH_AFFECTED)
+ if ((gProtectStructs[gBanksByTurnOrder[i]].stealMove) && gBattleMoves[gCurrentMove].flags & FLAG_SNATCH_AFFECTED)
{
- PressurePPLose(gBankAttacker, gTurnOrder[i], MOVE_SNATCH);
- gProtectStructs[gTurnOrder[i]].stealMove = 0;
- BATTLE_STRUCT->scriptingActive = gTurnOrder[i];
- b_movescr_stack_push_cursor();
+ PressurePPLose(gBankAttacker, gBanksByTurnOrder[i], MOVE_SNATCH);
+ gProtectStructs[gBanksByTurnOrder[i]].stealMove = 0;
+ BATTLE_STRUCT->scriptingActive = gBanksByTurnOrder[i];
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_SnatchedMove;
return;
}
@@ -1081,7 +1082,7 @@ static void atk00_attackcanceler(void)
{
gSpecialStatuses[gBankTarget].lightningRodRedirected = 0;
gLastUsedAbility = ABILITY_LIGHTNING_ROD;
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_TookAttack;
RecordAbilityBattle(gBankTarget, gLastUsedAbility);
}
@@ -1109,7 +1110,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
{
@@ -1120,7 +1121,7 @@ static void JumpIfMoveFailed(u8 adder, u16 move)
gBattlescriptCurrInstr = to_store;
}
-static void atk40_jump_if_move_affected_by_protect(void)
+static void atk40_jumpifaffectedbyprotect(void)
{
if (TargetProtectAffected)
{
@@ -1190,13 +1191,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;
}
@@ -1319,7 +1320,7 @@ static void atk03_ppreduce(void)
&& !((gDisableStructs[gBankAttacker].unk18_b) & gBitTable[gCurrMovePos]))
{
gActiveBank = gBankAttacker;
- EmitSetAttributes(0, REQUEST_PPMOVE1_BATTLE + gCurrMovePos, 0, 1, &gBattleMons[gBankAttacker].pp[gCurrMovePos]);
+ EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + gCurrMovePos, 0, 1, &gBattleMons[gBankAttacker].pp[gCurrMovePos]);
MarkBufferBankForExecution(gBankAttacker);
}
}
@@ -1376,7 +1377,7 @@ static void atk04_critcalc(void)
gBattlescriptCurrInstr++;
}
-static void atk05_damagecalc1(void)
+static void atk05_damagecalc(void)
{
u16 side_hword = gSideAffecting[GetBankIdentity(gBankTarget) & 1];
gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBankAttacker], &gBattleMons[gBankTarget], gCurrentMove,
@@ -1445,73 +1446,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 +1619,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 +1660,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 +1676,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)
{
@@ -1988,7 +1738,7 @@ void Unused_ApplyRandomDmgMultiplier(void)
ApplyRandomDmgMultiplier();
}
-static void atk07_dmg_adjustment(void)
+static void atk07_adjustnormaldamage(void)
{
u8 hold_effect, quality;
ApplyRandomDmgMultiplier();
@@ -2035,7 +1785,7 @@ static void atk07_dmg_adjustment(void)
gBattlescriptCurrInstr++;
}
-static void atk08_dmg_adjustment2(void) //literally the same as 0x7 except it doesn't check for false swipe move effect...
+static void atk08_adjustnormaldamage2(void) //literally the same as 0x7 except it doesn't check for false swipe move effect...
{
u8 hold_effect, quality;
ApplyRandomDmgMultiplier();
@@ -2089,7 +1839,7 @@ static void atk09_attackanimation(void)
if ((gHitMarker & HITMARKER_NO_ANIMATIONS) && (gCurrentMove != MOVE_TRANSFORM && gCurrentMove != MOVE_SUBSTITUTE))
{
- b_movescr_stack_push(gBattlescriptCurrInstr + 1);
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_Pausex20;
BATTLE_STRUCT->animTurn += 1;
BATTLE_STRUCT->animTargetsHit += 1;
@@ -2113,7 +1863,7 @@ static void atk09_attackanimation(void)
}
else
{
- b_movescr_stack_push(gBattlescriptCurrInstr + 1);
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_Pausex20;
}
}
@@ -2132,7 +1882,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 +1921,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)
@@ -2192,7 +1942,7 @@ static void atk0C_datahpupdate(void)
if (gDisableStructs[gActiveBank].substituteHP == 0)
{
gBattlescriptCurrInstr += 2;
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_SubstituteFade;
return;
}
@@ -2216,7 +1966,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 +1990,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 +2005,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;
@@ -2268,13 +2018,13 @@ static void atk0C_datahpupdate(void)
}
}
gHitMarker &= ~(HITMARKER_x100000);
- EmitSetAttributes(0, REQUEST_HP_BATTLE, 0, 2, &gBattleMons[gActiveBank].hp);
+ EmitSetMonData(0, REQUEST_HP_BATTLE, 0, 2, &gBattleMons[gActiveBank].hp);
MarkBufferBankForExecution(gActiveBank);
}
}
else
{
- gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1));
+ gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
if (gSpecialStatuses[gActiveBank].moveturnLostHP == 0)
gSpecialStatuses[gActiveBank].moveturnLostHP = 0xFFFF;
}
@@ -2294,7 +2044,7 @@ static void atk0D_critmessage(void)
}
}
-static void atk0E_effectiveness_sound(void)
+static void atk0E_effectivenesssound(void)
{
if (gBattleExecBuffer)
return;
@@ -2377,7 +2127,7 @@ static void atk0F_resultmessage(void)
gLastUsedItem = gBattleMons[gBankTarget].item;
gStringBank = gBankTarget;
gBattleMoveFlags &= ~(MOVESTATUS_ENDURED | MOVESTATUS_HUNGON);
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_HangedOnMsg;
return;
default:
@@ -2389,14 +2139,14 @@ static void atk0F_resultmessage(void)
gBattleMoveFlags &= ~(MOVESTATUS_ONEHITKO);
gBattleMoveFlags &= ~(MOVESTATUS_SUPEREFFECTIVE);
gBattleMoveFlags &= ~(MOVESTATUS_NOTVERYEFFECTIVE);
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_OneHitKOMsg;
return;
}
else if (gBattleMoveFlags & MOVESTATUS_ENDURED)
{
gBattleMoveFlags &= ~(MOVESTATUS_ENDURED | MOVESTATUS_HUNGON);
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_EnduredMsg;
return;
}
@@ -2405,7 +2155,7 @@ static void atk0F_resultmessage(void)
gLastUsedItem = gBattleMons[gBankTarget].item;
gStringBank = gBankTarget;
gBattleMoveFlags &= ~(MOVESTATUS_ENDURED | MOVESTATUS_HUNGON);
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_HangedOnMsg;
return;
}
@@ -2429,17 +2179,17 @@ 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;
}
}
-static void atk11_printstring_playeronly(void)
+static void atk11_printselectionstring(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 +2205,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 +2220,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;
@@ -2478,11 +2228,11 @@ static void atk13_printfromtable(void)
}
}
-static void atk14_printfromtable_playeronly(void)
+static void atk14_printselectionstringfromtable(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);
@@ -2497,7 +2247,7 @@ u8 BankGetTurnOrder(u8 bank)
int i;
for (i = 0; i < gNoOfAllBanks; i++)
{
- if (gTurnOrder[i] == bank)
+ if (gBanksByTurnOrder[i] == bank)
break;
}
return i;
@@ -2510,7 +2260,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 +2276,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 +2297,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);
- b_movescr_stack_push(gBattlescriptCurrInstr + 1);
+ RecordAbilityBattle(gEffectBank, ABILITY_IMMUNITY);
+ BattleScriptPush(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;
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
+ 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);
- b_movescr_stack_push(gBattlescriptCurrInstr + 1);
+ RecordAbilityBattle(gEffectBank, ABILITY_WATER_VEIL);
+ BattleScriptPush(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;
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
+ 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 +2380,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);
- b_movescr_stack_push(gBattlescriptCurrInstr + 1);
+ RecordAbilityBattle(gEffectBank, ABILITY_LIMBER);
+ BattleScriptPush(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);
- b_movescr_stack_push(gBattlescriptCurrInstr + 1);
+ RecordAbilityBattle(gEffectBank, ABILITY_IMMUNITY);
+ BattleScriptPush(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;
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
+ 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;
}
@@ -2702,25 +2453,25 @@ void SetMoveEffect(bool8 primary, u8 certainArg)
}
if (StatusChanged == 1)
{
- b_movescr_stack_push(gBattlescriptCurrInstr + 1);
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
if (gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]] == STATUS_SLEEP)
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);
+ EmitSetMonData(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 +2489,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]];
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
+ 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
@@ -2761,7 +2512,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg)
}
else
{
- if (BankGetTurnOrder(gEffectBank) > gCurrentMoveTurn)
+ if (BankGetTurnOrder(gEffectBank) > gCurrentTurnActionNumber)
gBattleMons[gEffectBank].status2 |= gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]];
gBattlescriptCurrInstr++; return;
}
@@ -2770,99 +2521,99 @@ void SetMoveEffect(bool8 primary, u8 certainArg)
if (gBattleMons[gEffectBank].status2 & STATUS2_UPROAR)
{gBattlescriptCurrInstr++; return;}
gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS;
- gLockedMove[gEffectBank] = gCurrentMove;
+ gLockedMoves[gEffectBank] = gCurrentMove;
gBattleMons[gEffectBank].status2 |= ((Random() & 3) + 2) << 4;
- b_movescr_stack_push(gBattlescriptCurrInstr + 1);
- gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]];
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
+ 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]];
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
+ 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);
break;
case 12: //charging move
gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS;
- gLockedMove[gEffectBank] = gCurrentMove;
- gProtectStructs[gEffectBank].flag1_chargingturn = 1;
+ gLockedMoves[gEffectBank] = gCurrentMove;
+ 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;
- 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++;
+ BATTLE_STRUCT->wrappedMove[gEffectBank*2] = (u8)gCurrentMove;
+ (1 + BATTLE_STRUCT->wrappedMove)[gEffectBank*2] = gCurrentMove >> 8; //don't ask.
+ BATTLE_STRUCT->wrappedBy[gEffectBank] = gBankAttacker;
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
+ 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]];
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
+ 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;
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
+ 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;
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
+ 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;
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
+ 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;
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = BattleScript_StatDown;
}
break;
case 29: //recharge
gBattleMons[gEffectBank].status2 |= STATUS2_RECHARGE;
- gDisableStructs[gEffectBank].recharge_counter = 2;
- gLockedMove[gEffectBank] = gCurrentMove;
+ gDisableStructs[gEffectBank].rechargeCounter = 2;
+ gLockedMoves[gEffectBank] = gCurrentMove;
gBattlescriptCurrInstr++;
break;
case 30: //rage
@@ -2871,121 +2622,122 @@ 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);
+ BattleScriptPushCursor();
+ 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;
+ USED_HELD_ITEM(bank) = gLastUsedItem;
+ gBattleMons[gBankTarget].item = 0;
gActiveBank = gBankAttacker;
- bb2_setattributes_in_battle(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gLastUsedItem);
- mark_buffer_bank_for_execution(gBankAttacker);
+ EmitSetMonData(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);
+ EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gBankTarget].item);
+ MarkBufferBankForExecution(gBankTarget);
- b_movescr_stack_push(gBattlescriptCurrInstr + 1);
- gBattlescriptCurrInstr = BS_ITEMSTEAL;
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = BattleScript_ItemSteal;
- STORE_CHOICEMOVE(gBankTarget, 0);
+ CHOICED_MOVE(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:
- b_movescr_stack_push(gBattlescriptCurrInstr + 1);
- gBattlescriptCurrInstr = gUnknown_081D9224;
+ case 34: //ancientpower
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = BattleScript_AllStatsUp;
return;
case 35: //break free rapidspin
- b_movescr_stack_push(gBattlescriptCurrInstr + 1);
- gBattlescriptCurrInstr = BS_RAPIDSPINAWAY;
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
+ 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);
- b_movescr_stack_push(gBattlescriptCurrInstr + 1);
- gBattlescriptCurrInstr = BS_PARALYSISHEALED;
+ EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status1);
+ MarkBufferBankForExecution(gActiveBank);
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = BattleScript_TargetPRLZHeal;
}
else
{gBattlescriptCurrInstr++; return;}
break;
- case 37: //
- b_movescr_stack_push(gBattlescriptCurrInstr + 1);
- gBattlescriptCurrInstr = gUnknown_081D93FA;
+ case 37: //superpower
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
+ 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]];
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]];
break;
case 53: //thrash
if (!(gBattleMons[gEffectBank].status2 & STATUS2_LOCK_CONFUSE))
{
gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS;
- gLockedMove[gEffectBank] = gCurrentMove;
+ gLockedMoves[gEffectBank] = gCurrentMove;
gBattleMons[gEffectBank].status2 |= (((Random() & 1) + 2) << 0xA);
}
else
{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]];
- b_movescr_stack_push(gBattlescriptCurrInstr + 1);
- gBattlescriptCurrInstr = BS_KNOCKEDOFF;
-
- STORE_CHOICEMOVE(gEffectBank, 0);
+ u8 side = GetBankSide(gEffectBank);
+ gLastUsedItem = gBattleMons[gEffectBank].item;
+ gBattleMons[gEffectBank].item = 0;
+ gWishFutureKnock.knockedOffPokes[side] |= gBitTable[gBattlePartyID[gEffectBank]];
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = BattleScript_KnockedOff;
+
+ CHOICED_MOVE(gEffectBank) = 0;
}
break;
- case 59: //overheat I guess, dont remember
- b_movescr_stack_push(gBattlescriptCurrInstr + 1);
- gBattlescriptCurrInstr = gUnknown_081D94B0;
+ case 59: //overheat
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = BattleScript_SAtkDown2;
return;
}
}
@@ -3025,21 +2777,21 @@ void SetMoveEffect(bool8 primary, u8 certainArg)
ands r0, r3\n\
strb r0, [r7, 0x3]\n\
movs r6, 0x40\n\
- ldr r0, _0801E43C @ =0x02000000\n\
+ ldr r0, _0801E43C @ =gSharedMem\n\
ldr r1, _0801E440 @ =gBankTarget\n\
b _0801E450\n\
.align 2, 0\n\
_0801E430: .4byte gBattleCommunication\n\
_0801E434: .4byte gEffectBank\n\
_0801E438: .4byte gBankAttacker\n\
-_0801E43C: .4byte 0x02000000\n\
+_0801E43C: .4byte gSharedMem\n\
_0801E440: .4byte gBankTarget\n\
_0801E444:\n\
ldr r2, _0801E538 @ =gEffectBank\n\
ldr r0, _0801E53C @ =gBankTarget\n\
ldrb r0, [r0]\n\
strb r0, [r2]\n\
- ldr r0, _0801E540 @ =0x02000000\n\
+ ldr r0, _0801E540 @ =gSharedMem\n\
ldr r1, _0801E544 @ =gBankAttacker\n\
_0801E450:\n\
ldrb r1, [r1]\n\
@@ -3163,7 +2915,7 @@ _0801E536:\n\
.align 2, 0\n\
_0801E538: .4byte gEffectBank\n\
_0801E53C: .4byte gBankTarget\n\
-_0801E540: .4byte 0x02000000\n\
+_0801E540: .4byte gSharedMem\n\
_0801E544: .4byte gBankAttacker\n\
_0801E548: .4byte 0x00016003\n\
_0801E54C: .4byte gBattleMons\n\
@@ -3308,7 +3060,7 @@ _0801E64A:\n\
ldr r4, _0801E67C @ =gBattlescriptCurrInstr\n\
ldr r0, [r4]\n\
adds r0, 0x1\n\
- bl b_movescr_stack_push\n\
+ bl BattleScriptPush\n\
ldr r0, _0801E680 @ =BattleScript_PSNPrevention\n\
_0801E664:\n\
str r0, [r4]\n\
@@ -3431,7 +3183,7 @@ _0801E72E:\n\
ldr r4, _0801E750 @ =gBattlescriptCurrInstr\n\
ldr r0, [r4]\n\
adds r0, 0x1\n\
- bl b_movescr_stack_push\n\
+ bl BattleScriptPush\n\
ldr r0, _0801E754 @ =BattleScript_BRNPrevention\n\
b _0801E664\n\
.align 2, 0\n\
@@ -3471,7 +3223,7 @@ _0801E78E:\n\
ldr r4, _0801E7A0 @ =gBattlescriptCurrInstr\n\
ldr r0, [r4]\n\
adds r0, 0x1\n\
- bl b_movescr_stack_push\n\
+ bl BattleScriptPush\n\
ldr r0, _0801E7A4 @ =BattleScript_BRNPrevention\n\
b _0801E998\n\
.align 2, 0\n\
@@ -3622,7 +3374,7 @@ _0801E8A6:\n\
ldr r4, _0801E8C8 @ =gBattlescriptCurrInstr\n\
ldr r0, [r4]\n\
adds r0, 0x1\n\
- bl b_movescr_stack_push\n\
+ bl BattleScriptPush\n\
ldr r0, _0801E8CC @ =BattleScript_PRLZPrevention\n\
b _0801E664\n\
.align 2, 0\n\
@@ -3665,7 +3417,7 @@ _0801E8FE:\n\
ldr r4, _0801E93C @ =gBattlescriptCurrInstr\n\
ldr r0, [r4]\n\
adds r0, 0x1\n\
- bl b_movescr_stack_push\n\
+ bl BattleScriptPush\n\
ldr r0, _0801E940 @ =BattleScript_PSNPrevention\n\
str r0, [r4]\n\
ldr r2, _0801E944 @ =gHitMarker\n\
@@ -3726,7 +3478,7 @@ _0801E98C:\n\
ldr r4, _0801E9A8 @ =gBattlescriptCurrInstr\n\
ldr r0, [r4]\n\
adds r0, 0x1\n\
- bl b_movescr_stack_push\n\
+ bl BattleScriptPush\n\
ldr r0, _0801E9AC @ =BattleScript_PSNPrevention\n\
_0801E998:\n\
str r0, [r4]\n\
@@ -3799,7 +3551,7 @@ _0801EA1C:\n\
ldr r0, _0801EA5C @ =gBattlescriptCurrInstr\n\
ldr r0, [r0]\n\
adds r0, 0x1\n\
- bl b_movescr_stack_push\n\
+ bl BattleScriptPush\n\
ldr r1, _0801EA60 @ =gStatusFlagsForMoveEffects\n\
ldr r0, _0801EA64 @ =gBattleCommunication\n\
ldrb r0, [r0, 0x3]\n\
@@ -3864,7 +3616,7 @@ _0801EA84:\n\
movs r1, 0x28\n\
movs r2, 0\n\
movs r3, 0x4\n\
- bl EmitSetAttributes\n\
+ bl EmitSetMonData\n\
ldrb r0, [r4]\n\
bl MarkBufferBankForExecution\n\
ldr r2, _0801EAF0 @ =gHitMarker\n\
@@ -3906,7 +3658,7 @@ _0801EAFA:\n\
beq _0801EB14\n\
bl _0801F5FA\n\
_0801EB14:\n\
- ldr r0, _0801EB30 @ =0x02000000\n\
+ ldr r0, _0801EB30 @ =gSharedMem\n\
ldrb r1, [r7, 0x3]\n\
ldr r2, _0801EB34 @ =0x000160ca\n\
adds r0, r2\n\
@@ -3918,7 +3670,7 @@ _0801EB14:\n\
bl _0801F4F2\n\
.align 2, 0\n\
_0801EB2C: .4byte gBattleCommunication\n\
-_0801EB30: .4byte 0x02000000\n\
+_0801EB30: .4byte gSharedMem\n\
_0801EB34: .4byte 0x000160ca\n\
_0801EB38: .4byte gHitMarker\n\
_0801EB3C:\n\
@@ -4057,7 +3809,7 @@ _0801EC8E:\n\
ldr r4, _0801ECC8 @ =gBattlescriptCurrInstr\n\
ldr r0, [r4]\n\
adds r0, 0x1\n\
- bl b_movescr_stack_push\n\
+ bl BattleScriptPush\n\
ldr r1, _0801ECCC @ =gMoveEffectBS_Ptrs\n\
ldr r0, _0801ECD0 @ =gBattleCommunication\n\
ldrb r0, [r0, 0x3]\n\
@@ -4103,7 +3855,7 @@ _0801ED14: .4byte BattleScript_FlinchPrevention\n\
_0801ED18:\n\
adds r0, r2, 0\n\
bl BankGetTurnOrder\n\
- ldr r1, _0801ED54 @ =gCurrentMoveTurn\n\
+ ldr r1, _0801ED54 @ =gCurrentTurnActionNumber\n\
lsls r0, 24\n\
lsrs r0, 24\n\
ldrb r1, [r1]\n\
@@ -4129,7 +3881,7 @@ _0801ED2E:\n\
str r1, [r2]\n\
bl _0801F5DC\n\
.align 2, 0\n\
-_0801ED54: .4byte gCurrentMoveTurn\n\
+_0801ED54: .4byte gCurrentTurnActionNumber\n\
_0801ED58: .4byte gStatusFlagsForMoveEffects\n\
_0801ED5C: .4byte gBattleCommunication\n\
_0801ED60:\n\
@@ -4151,7 +3903,7 @@ _0801ED7C:\n\
lsls r0, 5\n\
orrs r1, r0\n\
str r1, [r2]\n\
- ldr r1, _0801EDC8 @ =gLockedMove\n\
+ ldr r1, _0801EDC8 @ =gLockedMoves\n\
ldrb r0, [r3]\n\
lsls r0, 1\n\
adds r0, r1\n\
@@ -4174,7 +3926,7 @@ _0801ED7C:\n\
ldr r4, _0801EDD0 @ =gBattlescriptCurrInstr\n\
ldr r0, [r4]\n\
adds r0, 0x1\n\
- bl b_movescr_stack_push\n\
+ bl BattleScriptPush\n\
ldr r1, _0801EDD4 @ =gMoveEffectBS_Ptrs\n\
ldr r0, _0801EDD8 @ =gBattleCommunication\n\
ldrb r0, [r0, 0x3]\n\
@@ -4183,7 +3935,7 @@ _0801ED7C:\n\
ldr r0, [r0]\n\
bl _0801F5F8\n\
.align 2, 0\n\
-_0801EDC8: .4byte gLockedMove\n\
+_0801EDC8: .4byte gLockedMoves\n\
_0801EDCC: .4byte gCurrentMove\n\
_0801EDD0: .4byte gBattlescriptCurrInstr\n\
_0801EDD4: .4byte gMoveEffectBS_Ptrs\n\
@@ -4220,7 +3972,7 @@ _0801EE14:\n\
ldr r4, _0801EE40 @ =gBattlescriptCurrInstr\n\
ldr r0, [r4]\n\
adds r0, 0x1\n\
- bl b_movescr_stack_push\n\
+ bl BattleScriptPush\n\
ldr r1, _0801EE44 @ =gMoveEffectBS_Ptrs\n\
ldr r0, _0801EE48 @ =gBattleCommunication\n\
ldrb r0, [r0, 0x3]\n\
@@ -4277,7 +4029,7 @@ _0801EE84:\n\
lsls r1, 5\n\
orrs r0, r1\n\
str r0, [r2]\n\
- ldr r1, _0801EEC0 @ =gLockedMove\n\
+ ldr r1, _0801EEC0 @ =gLockedMoves\n\
mov r2, r8\n\
ldrb r0, [r2]\n\
lsls r0, 1\n\
@@ -4295,7 +4047,7 @@ _0801EE84:\n\
strb r0, [r1, 0x1]\n\
b _0801F5DC\n\
.align 2, 0\n\
-_0801EEC0: .4byte gLockedMove\n\
+_0801EEC0: .4byte gLockedMoves\n\
_0801EEC4: .4byte gCurrentMove\n\
_0801EEC8: .4byte gProtectStructs\n\
_0801EECC:\n\
@@ -4327,7 +4079,7 @@ _0801EEE8:\n\
ldr r0, [r2]\n\
orrs r0, r1\n\
str r0, [r2]\n\
- ldr r2, _0801EF80 @ =0x02000000\n\
+ ldr r2, _0801EF80 @ =gSharedMem\n\
mov r3, r8\n\
ldrb r0, [r3]\n\
lsls r0, 1\n\
@@ -4355,7 +4107,7 @@ _0801EEE8:\n\
ldr r4, _0801EF98 @ =gBattlescriptCurrInstr\n\
ldr r0, [r4]\n\
adds r0, 0x1\n\
- bl b_movescr_stack_push\n\
+ bl BattleScriptPush\n\
ldr r1, _0801EF9C @ =gMoveEffectBS_Ptrs\n\
ldr r2, _0801EFA0 @ =gBattleCommunication\n\
ldrb r0, [r2, 0x3]\n\
@@ -4392,7 +4144,7 @@ _0801EF70:\n\
bne _0801EF60\n\
b _0801F5FA\n\
.align 2, 0\n\
-_0801EF80: .4byte 0x02000000\n\
+_0801EF80: .4byte gSharedMem\n\
_0801EF84: .4byte 0x00016004\n\
_0801EF88: .4byte gCurrentMove\n\
_0801EF8C: .4byte 0x00016005\n\
@@ -4420,7 +4172,7 @@ _0801EFC0:\n\
ldr r4, _0801EFE0 @ =gBattlescriptCurrInstr\n\
ldr r0, [r4]\n\
adds r0, 0x1\n\
- bl b_movescr_stack_push\n\
+ bl BattleScriptPush\n\
ldr r1, _0801EFE4 @ =gMoveEffectBS_Ptrs\n\
ldr r0, _0801EFE8 @ =gBattleCommunication\n\
ldrb r0, [r0, 0x3]\n\
@@ -4449,7 +4201,7 @@ _0801EFEC:\n\
beq _0801F008\n\
b _0801F5DC\n\
_0801F008:\n\
- ldr r2, _0801F02C @ =0x02000000\n\
+ ldr r2, _0801F02C @ =gSharedMem\n\
ldrb r1, [r7, 0x3]\n\
movs r0, 0x3F\n\
ands r0, r1\n\
@@ -4462,11 +4214,11 @@ _0801F008:\n\
ldr r4, _0801F038 @ =gBattlescriptCurrInstr\n\
ldr r0, [r4]\n\
adds r0, 0x1\n\
- bl b_movescr_stack_push\n\
+ bl BattleScriptPush\n\
ldr r0, _0801F03C @ =BattleScript_StatUp\n\
b _0801F5F8\n\
.align 2, 0\n\
-_0801F02C: .4byte 0x02000000\n\
+_0801F02C: .4byte gSharedMem\n\
_0801F030: .4byte 0x000160a4\n\
_0801F034: .4byte 0x000160a5\n\
_0801F038: .4byte gBattlescriptCurrInstr\n\
@@ -4487,7 +4239,7 @@ _0801F040:\n\
beq _0801F05E\n\
b _0801F5DC\n\
_0801F05E:\n\
- ldr r2, _0801F080 @ =0x02000000\n\
+ ldr r2, _0801F080 @ =gSharedMem\n\
ldrb r1, [r7, 0x3]\n\
movs r0, 0x3F\n\
ands r0, r1\n\
@@ -4500,11 +4252,11 @@ _0801F05E:\n\
ldr r4, _0801F08C @ =gBattlescriptCurrInstr\n\
ldr r0, [r4]\n\
adds r0, 0x1\n\
- bl b_movescr_stack_push\n\
+ bl BattleScriptPush\n\
ldr r0, _0801F090 @ =BattleScript_StatDown\n\
b _0801F5F8\n\
.align 2, 0\n\
-_0801F080: .4byte 0x02000000\n\
+_0801F080: .4byte gSharedMem\n\
_0801F084: .4byte 0x000160a4\n\
_0801F088: .4byte 0x000160a5\n\
_0801F08C: .4byte gBattlescriptCurrInstr\n\
@@ -4524,7 +4276,7 @@ _0801F094:\n\
beq _0801F0B0\n\
b _0801F5DC\n\
_0801F0B0:\n\
- ldr r2, _0801F0D4 @ =0x02000000\n\
+ ldr r2, _0801F0D4 @ =gSharedMem\n\
ldrb r1, [r7, 0x3]\n\
movs r0, 0x3F\n\
ands r0, r1\n\
@@ -4537,11 +4289,11 @@ _0801F0B0:\n\
ldr r4, _0801F0E0 @ =gBattlescriptCurrInstr\n\
ldr r0, [r4]\n\
adds r0, 0x1\n\
- bl b_movescr_stack_push\n\
+ bl BattleScriptPush\n\
ldr r0, _0801F0E4 @ =BattleScript_StatUp\n\
b _0801F5F8\n\
.align 2, 0\n\
-_0801F0D4: .4byte 0x02000000\n\
+_0801F0D4: .4byte gSharedMem\n\
_0801F0D8: .4byte 0x000160a4\n\
_0801F0DC: .4byte 0x000160a5\n\
_0801F0E0: .4byte gBattlescriptCurrInstr\n\
@@ -4562,7 +4314,7 @@ _0801F0E8:\n\
beq _0801F106\n\
b _0801F5DC\n\
_0801F106:\n\
- ldr r2, _0801F128 @ =0x02000000\n\
+ ldr r2, _0801F128 @ =gSharedMem\n\
ldrb r1, [r7, 0x3]\n\
movs r0, 0x3F\n\
ands r0, r1\n\
@@ -4575,11 +4327,11 @@ _0801F106:\n\
ldr r4, _0801F134 @ =gBattlescriptCurrInstr\n\
ldr r0, [r4]\n\
adds r0, 0x1\n\
- bl b_movescr_stack_push\n\
+ bl BattleScriptPush\n\
ldr r0, _0801F138 @ =BattleScript_StatDown\n\
b _0801F5F8\n\
.align 2, 0\n\
-_0801F128: .4byte 0x02000000\n\
+_0801F128: .4byte gSharedMem\n\
_0801F12C: .4byte 0x000160a4\n\
_0801F130: .4byte 0x000160a5\n\
_0801F134: .4byte gBattlescriptCurrInstr\n\
@@ -4607,7 +4359,7 @@ _0801F13C:\n\
adds r0, r2\n\
movs r1, 0x2\n\
strb r1, [r0, 0x19]\n\
- ldr r1, _0801F17C @ =gLockedMove\n\
+ ldr r1, _0801F17C @ =gLockedMoves\n\
ldrb r0, [r3]\n\
lsls r0, 1\n\
adds r0, r1\n\
@@ -4617,7 +4369,7 @@ _0801F13C:\n\
b _0801F5DC\n\
.align 2, 0\n\
_0801F178: .4byte gDisableStructs\n\
-_0801F17C: .4byte gLockedMove\n\
+_0801F17C: .4byte gLockedMoves\n\
_0801F180: .4byte gCurrentMove\n\
_0801F184:\n\
ldr r0, _0801F1A0 @ =gBankAttacker\n\
@@ -4767,7 +4519,7 @@ _0801F2B0:\n\
b _0801F5DC\n\
_0801F2B6:\n\
lsls r0, r1, 1\n\
- ldr r5, _0801F344 @ =0x020160f0\n\
+ ldr r5, _0801F344 @ =gSharedMem + 0x160F0\n\
adds r0, r5\n\
ldr r1, _0801F348 @ =gLastUsedItem\n\
strh r2, [r0]\n\
@@ -4788,7 +4540,7 @@ _0801F2B6:\n\
movs r1, 0x2\n\
movs r2, 0\n\
movs r3, 0x2\n\
- bl EmitSetAttributes\n\
+ bl EmitSetMonData\n\
mov r3, r10\n\
ldrb r0, [r3]\n\
bl MarkBufferBankForExecution\n\
@@ -4806,13 +4558,13 @@ _0801F2B6:\n\
movs r1, 0x2\n\
movs r2, 0\n\
movs r3, 0x2\n\
- bl EmitSetAttributes\n\
+ bl EmitSetMonData\n\
ldrb r0, [r7]\n\
bl MarkBufferBankForExecution\n\
ldr r4, _0801F350 @ =gBattlescriptCurrInstr\n\
ldr r0, [r4]\n\
adds r0, 0x1\n\
- bl b_movescr_stack_push\n\
+ bl BattleScriptPush\n\
ldr r0, _0801F354 @ =BattleScript_ItemSteal\n\
str r0, [r4]\n\
ldr r0, _0801F358 @ =0xfffe9f10\n\
@@ -4832,7 +4584,7 @@ _0801F2B6:\n\
b _0801F5FA\n\
.align 2, 0\n\
_0801F340: .4byte gBankAttacker\n\
-_0801F344: .4byte 0x020160f0\n\
+_0801F344: .4byte gSharedMem + 0x160F0\n\
_0801F348: .4byte gLastUsedItem\n\
_0801F34C: .4byte gActiveBank\n\
_0801F350: .4byte gBattlescriptCurrInstr\n\
@@ -4887,17 +4639,17 @@ _0801F3BC:\n\
ldr r4, _0801F3CC @ =gBattlescriptCurrInstr\n\
ldr r0, [r4]\n\
adds r0, 0x1\n\
- bl b_movescr_stack_push\n\
- ldr r0, _0801F3D0 @ =gUnknown_081D9224\n\
+ bl BattleScriptPush\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\
adds r0, 0x1\n\
- bl b_movescr_stack_push\n\
+ bl BattleScriptPush\n\
ldr r0, _0801F3E8 @ =BattleScript_RapidSpinAway\n\
b _0801F5F8\n\
.align 2, 0\n\
@@ -4933,13 +4685,13 @@ _0801F406:\n\
movs r1, 0x28\n\
movs r2, 0\n\
movs r3, 0x4\n\
- bl EmitSetAttributes\n\
+ bl EmitSetMonData\n\
ldrb r0, [r4]\n\
bl MarkBufferBankForExecution\n\
ldr r4, _0801F444 @ =gBattlescriptCurrInstr\n\
ldr r0, [r4]\n\
adds r0, 0x1\n\
- bl b_movescr_stack_push\n\
+ bl BattleScriptPush\n\
ldr r0, _0801F448 @ =BattleScript_TargetPRLZHeal\n\
b _0801F5F8\n\
.align 2, 0\n\
@@ -4951,12 +4703,12 @@ _0801F44C:\n\
ldr r4, _0801F45C @ =gBattlescriptCurrInstr\n\
ldr r0, [r4]\n\
adds r0, 0x1\n\
- bl b_movescr_stack_push\n\
- ldr r0, _0801F460 @ =gUnknown_081D93FA\n\
+ bl BattleScriptPush\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\
@@ -4972,7 +4724,7 @@ _0801F47A:\n\
ldr r4, _0801F49C @ =gBattlescriptCurrInstr\n\
ldr r0, [r4]\n\
adds r0, 0x1\n\
- bl b_movescr_stack_push\n\
+ bl BattleScriptPush\n\
ldr r1, _0801F4A0 @ =gMoveEffectBS_Ptrs\n\
ldr r0, _0801F4A4 @ =gBattleCommunication\n\
ldrb r0, [r0, 0x3]\n\
@@ -5006,7 +4758,7 @@ _0801F4C4:\n\
lsls r0, 5\n\
orrs r1, r0\n\
str r1, [r2]\n\
- ldr r1, _0801F4F8 @ =gLockedMove\n\
+ ldr r1, _0801F4F8 @ =gLockedMoves\n\
ldrb r0, [r3]\n\
lsls r0, 1\n\
adds r0, r1\n\
@@ -5029,7 +4781,7 @@ _0801F4F2:\n\
str r0, [r2]\n\
b _0801F5FA\n\
.align 2, 0\n\
-_0801F4F8: .4byte gLockedMove\n\
+_0801F4F8: .4byte gLockedMoves\n\
_0801F4FC: .4byte gCurrentMove\n\
_0801F500:\n\
mov r5, r8\n\
@@ -5100,10 +4852,10 @@ _0801F540:\n\
ldr r4, _0801F5C8 @ =gBattlescriptCurrInstr\n\
ldr r0, [r4]\n\
adds r0, 0x1\n\
- bl b_movescr_stack_push\n\
+ bl BattleScriptPush\n\
ldr r0, _0801F5CC @ =BattleScript_KnockedOff\n\
str r0, [r4]\n\
- ldr r1, _0801F5D0 @ =0x02000000\n\
+ ldr r1, _0801F5D0 @ =gSharedMem\n\
mov r2, r8\n\
ldrb r0, [r2]\n\
lsls r0, 1\n\
@@ -5125,7 +4877,7 @@ _0801F5C0: .4byte gBitTable\n\
_0801F5C4: .4byte gBattlePartyID\n\
_0801F5C8: .4byte gBattlescriptCurrInstr\n\
_0801F5CC: .4byte BattleScript_KnockedOff\n\
-_0801F5D0: .4byte 0x02000000\n\
+_0801F5D0: .4byte gSharedMem\n\
_0801F5D4: .4byte 0x000160e8\n\
_0801F5D8: .4byte 0x000160e9\n\
_0801F5DC:\n\
@@ -5140,8 +4892,8 @@ _0801F5EC:\n\
ldr r4, _0801F60C @ =gBattlescriptCurrInstr\n\
ldr r0, [r4]\n\
adds r0, 0x1\n\
- bl b_movescr_stack_push\n\
- ldr r0, _0801F610 @ =gUnknown_081D94B0\n\
+ bl BattleScriptPush\n\
+ ldr r0, _0801F610 @ =BattleScript_SAtkDown2\n\
_0801F5F8:\n\
str r0, [r4]\n\
_0801F5FA:\n\
@@ -5155,12 +4907,13 @@ _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)
+
+static void atk15_seteffectwithchance(void)
{
u32 PercentChance;
if (gBattleMons[gBankAttacker].ability == ABILITY_SERENE_GRACE)
@@ -5195,9 +4948,9 @@ static void atk17_seteffectsecondary(void)
SetMoveEffect(0, 0);
}
-static void atk18_status_effect_clear(void)
+static void atk18_clearstatusfromeffect(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,446 +4961,128 @@ static void atk18_status_effect_clear(void)
BATTLE_STRUCT->unk16112 = 0;
}
-//Fuck this, Maybe later
-__attribute__((naked))
-static void atk19_faint_pokemon(void)
+static void atk19_tryfaintmon(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);
+
+ BattleScriptPop();
+ gBattlescriptCurrInstr = r4;
+ gSideAffecting[GetBankSide(gActiveBank)] &= ~SIDE_STATUS_SPIKES_DAMAGED;
+ }
+ else
+ {
+ gBattlescriptCurrInstr += 7;
+ }
+ }
+ else
+ {
+ u8 bank;
+
+ if (gBattlescriptCurrInstr[1] == 1)
+ {
+ gActiveBank = gBankAttacker;
+ bank = gBankTarget;
+ r4 = BattleScript_FaintAttacker;
+ }
+ else
+ {
+ gActiveBank = gBankTarget;
+ bank = gBankAttacker;
+ r4 = BattleScript_FaintTarget;
+ }
+ if (!(gAbsentBankFlags & gBitTable[gActiveBank])
+ && gBattleMons[gActiveBank].hp == 0)
+ {
+ ewram160ACarr2(0, bank) = 0;
+ ewram160ACarr2(1, bank) = 0;
+ ewram16100arr2(0, bank) = 0;
+ ewram16100arr2(1, bank) = 0;
+ ewram16100arr2(2, bank) = 0;
+ ewram16100arr2(3, bank) = 0;
+
+ gHitMarker |= HITMARKER_FAINTED(gActiveBank);
+ BattleScriptPush(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)
+ {
+ BattleScriptPush(gBattlescriptCurrInstr);
+ gBattleMoveDamage = gBattleMons[bank].hp;
+ gBattlescriptCurrInstr = BattleScript_DestinyBondTakesLife;
+ }
+ if ((gStatuses3[gBankTarget] & STATUS3_GRUDGE)
+ && !(gHitMarker & HITMARKER_GRUDGE)
+ && GetBankSide(gBankAttacker) != GetBankSide(gBankTarget)
+ && gBattleMons[gBankAttacker].hp != 0
+ && gCurrentMove != MOVE_STRUGGLE)
+ {
+ u8 moveIndex = ewram1608Carr(gBankAttacker);
+
+ gBattleMons[gBankAttacker].pp[moveIndex] = 0;
+ BattleScriptPush(gBattlescriptCurrInstr);
+ gBattlescriptCurrInstr = BattleScript_SelectingImprisionedMoveInPalace;
+ gActiveBank = gBankAttacker;
+ EmitSetMonData(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)
+static void atk1A_dofaintanimation(void)
{
if (gBattleExecBuffer == 0)
{
- gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1));
+ gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
Emitcmd10(0);
MarkBufferBankForExecution(gActiveBank);
gBattlescriptCurrInstr += 2;
}
}
-static void atk1B_faint_effects_clear(void)
+static void atk1B_cleareffectsonfaint(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);
+ EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 0x4, &gBattleMons[gActiveBank].status1);
MarkBufferBankForExecution(gActiveBank);
UndoEffectsAfterFainting();
gBattlescriptCurrInstr += 2;
@@ -5656,9 +5091,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 +5102,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 +5114,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)
@@ -5689,12 +5124,12 @@ static void atk1E_jumpifability(void)
gLastUsedAbility = ability;
gBattlescriptCurrInstr = jump_loc;
RecordAbilityBattle(bank -1, gLastUsedAbility);
- unk_2000000[0x160f8] = bank - 1;
+ ewram160F8 = bank - 1;
}
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)
@@ -5702,20 +5137,20 @@ static void atk1E_jumpifability(void)
gLastUsedAbility = ability;
gBattlescriptCurrInstr = jump_loc;
RecordAbilityBattle(bank - 1, gLastUsedAbility);
- unk_2000000[0x160f8] = bank - 1;
+ ewram160F8 = bank - 1;
}
else
gBattlescriptCurrInstr += 7;
}
else
{
- bank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1));
+ bank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
if (gBattleMons[bank].ability == ability)
{
gLastUsedAbility = ability;
gBattlescriptCurrInstr = jump_loc;
RecordAbilityBattle(bank, gLastUsedAbility);
- unk_2000000[0x160f8] = bank;
+ ewram160F8 = bank;
}
else
gBattlescriptCurrInstr += 7;
@@ -5727,13 +5162,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,50 +5179,50 @@ 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;
}
-static void atk21_jumpifstatus3(void)
+static void atk21_jumpifstatus3condition(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 +5240,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,23 +5257,24 @@ 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)
+ switch (BATTLE_STRUCT->getexpStateTracker)
{
case 0: //check if should receive exp at all
if (GetBankSide(gBank1) != 1 || (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_SAFARI | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER)))
- BATTLE_STRUCT->atk23StateTracker = 6; //goto last case
+ BATTLE_STRUCT->getexpStateTracker = 6; //goto last case
else
{
- BATTLE_STRUCT->atk23StateTracker++;
- unk_2000000[0x16113] |= gBitTable[gBattlePartyID[gBank1]];
+ BATTLE_STRUCT->getexpStateTracker++;
+ ((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;
@@ -5875,7 +5311,7 @@ static void atk23_getexp(void)
*exp = 1;
gExpShareExp = 0;
}
- BATTLE_STRUCT->atk23StateTracker++;
+ BATTLE_STRUCT->getexpStateTracker++;
BATTLE_STRUCT->expGetterID = 0;
BATTLE_STRUCT->sentInPokes = sent_in;
} //no break statement
@@ -5892,17 +5328,16 @@ static void atk23_getexp(void)
if ((hold_effect != HOLD_EFFECT_EXP_SHARE && !(BATTLE_STRUCT->sentInPokes & 1)))
{
BATTLE_STRUCT->sentInPokes >>= 1;
- tracker = &BATTLE_STRUCT->atk23StateTracker;
+ tracker = &BATTLE_STRUCT->getexpStateTracker;
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;
+ tracker = &BATTLE_STRUCT->getexpStateTracker;
zero = 0;
- LABEL:
*tracker = 5; //increment looper
gBattleMoveDamage = zero; //used for exp
}
@@ -5937,7 +5372,9 @@ static void atk23_getexp(void)
stringID = 0x14A;
}
else
- stringID = 0x149;
+ {
+ stringID = 0x149;
+ }
//get exp getter bank
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
@@ -5962,12 +5399,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;
@@ -5984,7 +5422,7 @@ static void atk23_getexp(void)
MonGainEVs(&gPlayerParty[BATTLE_STRUCT->expGetterID], gBattleMons[gBank1].species);
}
BATTLE_STRUCT->sentInPokes >>= 1;
- BATTLE_STRUCT->atk23StateTracker++;
+ BATTLE_STRUCT->getexpStateTracker++;
}
}
break;
@@ -5994,10 +5432,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);
@@ -6005,7 +5444,7 @@ static void atk23_getexp(void)
EmitExpBarUpdate(0, BATTLE_STRUCT->expGetterID, gBattleMoveDamage);
MarkBufferBankForExecution(gActiveBank);
}
- BATTLE_STRUCT->atk23StateTracker++;
+ BATTLE_STRUCT->getexpStateTracker++;
}
break;
case 4: //lvl up if necessary
@@ -6032,7 +5471,7 @@ static void atk23_getexp(void)
gBattleTextBuff2[4] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL);
gBattleTextBuff2[5] = 0xFF;
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gLeveledUpInBattle |= gBitTable[BATTLE_STRUCT->expGetterID];
gBattlescriptCurrInstr = BattleScript_LevelUp;
gBattleMoveDamage = (gBattleBufferB[gActiveBank][2] | (gBattleBufferB[gActiveBank][3] << 8));
@@ -6046,7 +5485,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,28 +5498,28 @@ 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;
+ BATTLE_STRUCT->getexpStateTracker = 5;
}
else
{
gBattleMoveDamage = 0;
- BATTLE_STRUCT->atk23StateTracker = 5;
+ BATTLE_STRUCT->getexpStateTracker = 5;
}
}
break;
case 5: //looper increment
if (gBattleMoveDamage) //there is exp to give, goto case 3 that gives exp
- BATTLE_STRUCT->atk23StateTracker = 3;
+ BATTLE_STRUCT->getexpStateTracker = 3;
else
{
if (++BATTLE_STRUCT->expGetterID <= 5)
- BATTLE_STRUCT->atk23StateTracker = 2; //loop again
+ BATTLE_STRUCT->getexpStateTracker = 2; //loop again
else
- BATTLE_STRUCT->atk23StateTracker = 6; //we're done
+ BATTLE_STRUCT->getexpStateTracker = 6; //we're done
}
break;
case 6: //increment instruction
@@ -6105,7 +5544,7 @@ static void atk23_getexp(void)
mov r5, r8\n\
push {r5-r7}\n\
movs r6, 0\n\
- ldr r0, _0802004C @ =0x0201605c\n\
+ ldr r0, _0802004C @ =gSharedMem + 0x1605C\n\
mov r10, r0\n\
ldr r0, _08020050 @ =gBattlescriptCurrInstr\n\
ldr r0, [r0]\n\
@@ -6134,7 +5573,7 @@ _08020040:\n\
ldr r0, [r0]\n\
mov pc, r0\n\
.align 2, 0\n\
-_0802004C: .4byte 0x0201605c\n\
+_0802004C: .4byte gSharedMem + 0x1605C\n\
_08020050: .4byte gBattlescriptCurrInstr\n\
_08020054: .4byte gBank1\n\
_08020058: .4byte gSentPokesToOpponent\n\
@@ -6163,7 +5602,7 @@ _0802007C:\n\
cmp r0, 0\n\
beq _080200BC\n\
_08020098:\n\
- ldr r0, _080200B4 @ =0x02000000\n\
+ ldr r0, _080200B4 @ =gSharedMem\n\
ldr r1, _080200B8 @ =0x0001600f\n\
adds r0, r1\n\
movs r1, 0x6\n\
@@ -6173,10 +5612,10 @@ _08020098:\n\
_080200A8: .4byte gBank1\n\
_080200AC: .4byte gBattleTypeFlags\n\
_080200B0: .4byte 0x00000982\n\
-_080200B4: .4byte 0x02000000\n\
+_080200B4: .4byte gSharedMem\n\
_080200B8: .4byte 0x0001600f\n\
_080200BC:\n\
- ldr r2, _080200E8 @ =0x02000000\n\
+ ldr r2, _080200E8 @ =gSharedMem\n\
ldr r3, _080200EC @ =0x0001600f\n\
adds r1, r2, r3\n\
ldrb r0, [r1]\n\
@@ -6198,7 +5637,7 @@ _080200BC:\n\
strb r0, [r2]\n\
bl _08020996\n\
.align 2, 0\n\
-_080200E8: .4byte 0x02000000\n\
+_080200E8: .4byte gSharedMem\n\
_080200EC: .4byte 0x0001600f\n\
_080200F0: .4byte 0x00016113\n\
_080200F4: .4byte gBitTable\n\
@@ -6325,7 +5764,7 @@ _080201F6:\n\
ldr r0, _08020248 @ =gExpShareExp\n\
strh r6, [r0]\n\
_080201FA:\n\
- ldr r1, _0802024C @ =0x02000000\n\
+ ldr r1, _0802024C @ =gSharedMem\n\
ldr r3, _08020250 @ =0x0001600f\n\
adds r2, r1, r3\n\
ldrb r0, [r2]\n\
@@ -6346,7 +5785,7 @@ _08020216:\n\
beq _08020220\n\
b _08020996\n\
_08020220:\n\
- ldr r0, _0802024C @ =0x02000000\n\
+ ldr r0, _0802024C @ =gSharedMem\n\
ldr r1, _08020254 @ =0x00016018\n\
adds r0, r1\n\
ldrb r1, [r0]\n\
@@ -6367,7 +5806,7 @@ _08020220:\n\
b _08020274\n\
.align 2, 0\n\
_08020248: .4byte gExpShareExp\n\
-_0802024C: .4byte 0x02000000\n\
+_0802024C: .4byte gSharedMem\n\
_08020250: .4byte 0x0001600f\n\
_08020254: .4byte 0x00016018\n\
_08020258: .4byte 0x0001605f\n\
@@ -6380,7 +5819,7 @@ _0802026C:\n\
lsls r0, 24\n\
lsrs r4, r0, 24\n\
_08020274:\n\
- ldr r5, _08020294 @ =0x02000000\n\
+ ldr r5, _08020294 @ =gSharedMem\n\
cmp r4, 0x19\n\
beq _080202A0\n\
ldr r3, _08020298 @ =0x0001605f\n\
@@ -6396,7 +5835,7 @@ _08020274:\n\
adds r1, r5, r0\n\
b _080202C8\n\
.align 2, 0\n\
-_08020294: .4byte 0x02000000\n\
+_08020294: .4byte gSharedMem\n\
_08020298: .4byte 0x0001605f\n\
_0802029C: .4byte 0x0001600f\n\
_080202A0:\n\
@@ -6454,7 +5893,7 @@ _080202E8:\n\
adds r0, 0x1\n\
strb r0, [r5]\n\
_08020316:\n\
- ldr r5, _0802035C @ =0x02000000\n\
+ ldr r5, _0802035C @ =gSharedMem\n\
ldr r1, _08020360 @ =0x00016018\n\
adds r0, r5, r1\n\
ldrb r1, [r0]\n\
@@ -6486,7 +5925,7 @@ _0802034C: .4byte gBattleTypeFlags\n\
_08020350: .4byte gBattleMons\n\
_08020354: .4byte 0x0001601b\n\
_08020358: .4byte 0x00000161\n\
-_0802035C: .4byte 0x02000000\n\
+_0802035C: .4byte gSharedMem\n\
_08020360: .4byte 0x00016018\n\
_08020364: .4byte gPlayerParty\n\
_08020368: .4byte 0x0001605f\n\
@@ -6530,7 +5969,7 @@ _0802039C:\n\
bl __divsi3\n\
str r0, [r4]\n\
_080203B8:\n\
- ldr r0, _080203F8 @ =0x02000000\n\
+ ldr r0, _080203F8 @ =gSharedMem\n\
ldr r2, _080203FC @ =0x00016018\n\
adds r0, r2\n\
ldrb r1, [r0]\n\
@@ -6557,7 +5996,7 @@ _080203B8:\n\
_080203EC: .4byte gBattleMoveDamage\n\
_080203F0: .4byte gExpShareExp\n\
_080203F4: .4byte gBattleTypeFlags\n\
-_080203F8: .4byte 0x02000000\n\
+_080203F8: .4byte gSharedMem\n\
_080203FC: .4byte 0x00016018\n\
_08020400: .4byte gPlayerParty\n\
_08020404:\n\
@@ -6572,7 +6011,7 @@ _0802040A:\n\
cmp r1, 0\n\
beq _08020488\n\
ldr r1, _08020448 @ =gBattlePartyID\n\
- ldr r0, _0802044C @ =0x02000000\n\
+ ldr r0, _0802044C @ =gSharedMem\n\
ldr r3, _08020450 @ =0x00016018\n\
adds r2, r0, r3\n\
ldrh r1, [r1, 0x4]\n\
@@ -6595,7 +6034,7 @@ _0802043C: .4byte 0x00000149\n\
_08020440: .4byte gBattleMoveDamage\n\
_08020444: .4byte gBattleTypeFlags\n\
_08020448: .4byte gBattlePartyID\n\
-_0802044C: .4byte 0x02000000\n\
+_0802044C: .4byte gSharedMem\n\
_08020450: .4byte 0x00016018\n\
_08020454: .4byte gBitTable\n\
_08020458: .4byte gAbsentBankFlags\n\
@@ -6622,7 +6061,7 @@ _0802047C:\n\
.align 2, 0\n\
_08020484: .4byte 0x000160a2\n\
_08020488:\n\
- ldr r0, _08020530 @ =0x02000000\n\
+ ldr r0, _08020530 @ =gSharedMem\n\
ldr r3, _08020534 @ =0x000160a2\n\
adds r0, r3\n\
strb r1, [r0]\n\
@@ -6633,7 +6072,7 @@ _08020490:\n\
strb r2, [r1]\n\
movs r5, 0x4\n\
strb r5, [r1, 0x1]\n\
- ldr r4, _08020530 @ =0x02000000\n\
+ ldr r4, _08020530 @ =gSharedMem\n\
ldr r0, _08020534 @ =0x000160a2\n\
adds r6, r4, r0\n\
ldrb r0, [r6]\n\
@@ -6697,7 +6136,7 @@ _08020490:\n\
ldrh r1, [r1]\n\
bl MonGainEVs\n\
_0802051E:\n\
- ldr r1, _08020530 @ =0x02000000\n\
+ ldr r1, _08020530 @ =gSharedMem\n\
ldr r3, _08020554 @ =0x0001605f\n\
adds r2, r1, r3\n\
ldrb r0, [r2]\n\
@@ -6707,7 +6146,7 @@ _0802051E:\n\
adds r1, r0\n\
b _08020618\n\
.align 2, 0\n\
-_08020530: .4byte 0x02000000\n\
+_08020530: .4byte gSharedMem\n\
_08020534: .4byte 0x000160a2\n\
_08020538: .4byte gBattleTextBuff1\n\
_0802053C: .4byte 0x00016018\n\
@@ -6726,7 +6165,7 @@ _0802055C:\n\
b _08020996\n\
_08020566:\n\
ldr r1, _08020624 @ =gBattleBufferB\n\
- ldr r4, _08020628 @ =0x02000000\n\
+ ldr r4, _08020628 @ =gSharedMem\n\
ldr r3, _0802062C @ =0x000160a2\n\
adds r3, r4\n\
mov r8, r3\n\
@@ -6802,7 +6241,7 @@ _08020566:\n\
ldrb r0, [r4]\n\
bl MarkBufferBankForExecution\n\
_08020612:\n\
- ldr r1, _08020628 @ =0x02000000\n\
+ ldr r1, _08020628 @ =gSharedMem\n\
ldr r3, _08020644 @ =0x0001600f\n\
adds r1, r3\n\
_08020618:\n\
@@ -6813,7 +6252,7 @@ _08020618:\n\
.align 2, 0\n\
_08020620: .4byte gBattleExecBuffer\n\
_08020624: .4byte gBattleBufferB\n\
-_08020628: .4byte 0x02000000\n\
+_08020628: .4byte gSharedMem\n\
_0802062C: .4byte 0x000160a2\n\
_08020630: .4byte 0x00016018\n\
_08020634: .4byte gPlayerParty\n\
@@ -6829,7 +6268,7 @@ _08020648:\n\
b _08020996\n\
_08020652:\n\
ldr r1, _080208B0 @ =gActiveBank\n\
- ldr r4, _080208B4 @ =0x02000000\n\
+ ldr r4, _080208B4 @ =gSharedMem\n\
ldr r2, _080208B8 @ =0x000160a2\n\
adds r0, r4, r2\n\
ldrb r0, [r0]\n\
@@ -6881,7 +6320,7 @@ _080206A8:\n\
ldr r5, _080208B0 @ =gActiveBank\n\
ldrb r0, [r5]\n\
strb r0, [r1, 0x2]\n\
- ldr r0, _080208B4 @ =0x02000000\n\
+ ldr r0, _080208B4 @ =gSharedMem\n\
ldr r3, _080208C8 @ =0x00016018\n\
adds r6, r0, r3\n\
ldrb r0, [r6]\n\
@@ -6909,7 +6348,7 @@ _080206A8:\n\
movs r0, 0x1\n\
negs r0, r0\n\
strb r0, [r4, 0x5]\n\
- bl b_movescr_stack_push_cursor\n\
+ bl BattleScriptPushCursor\n\
ldr r2, _080208D8 @ =gLeveledUpInBattle\n\
ldr r1, _080208DC @ =gBitTable\n\
ldrb r0, [r6]\n\
@@ -7025,7 +6464,7 @@ _080206A8:\n\
strh r0, [r4, 0xA]\n\
_080207EC:\n\
ldr r0, _080208C4 @ =gBattlePartyID\n\
- ldr r1, _080208B4 @ =0x02000000\n\
+ ldr r1, _080208B4 @ =gSharedMem\n\
ldr r3, _080208C8 @ =0x00016018\n\
adds r7, r1, r3\n\
ldrb r2, [r7]\n\
@@ -7114,7 +6553,7 @@ _080207EC:\n\
.align 2, 0\n\
_080208AC: .4byte gBattleExecBuffer\n\
_080208B0: .4byte gActiveBank\n\
-_080208B4: .4byte 0x02000000\n\
+_080208B4: .4byte gSharedMem\n\
_080208B8: .4byte 0x000160a2\n\
_080208BC: .4byte gBattleBufferB\n\
_080208C0: .4byte gBattleTypeFlags\n\
@@ -7134,7 +6573,7 @@ _080208F0:\n\
movs r0, 0\n\
str r0, [r1]\n\
_080208F6:\n\
- ldr r0, _08020908 @ =0x02000000\n\
+ ldr r0, _08020908 @ =gSharedMem\n\
ldr r1, _0802090C @ =0x0001600f\n\
adds r0, r1\n\
movs r1, 0x5\n\
@@ -7142,14 +6581,14 @@ _080208F6:\n\
b _08020996\n\
.align 2, 0\n\
_08020904: .4byte gBattleMoveDamage\n\
-_08020908: .4byte 0x02000000\n\
+_08020908: .4byte gSharedMem\n\
_0802090C: .4byte 0x0001600f\n\
_08020910:\n\
ldr r0, _08020924 @ =gBattleMoveDamage\n\
ldr r0, [r0]\n\
cmp r0, 0\n\
beq _08020930\n\
- ldr r0, _08020928 @ =0x02000000\n\
+ ldr r0, _08020928 @ =gSharedMem\n\
ldr r2, _0802092C @ =0x0001600f\n\
adds r0, r2\n\
movs r1, 0x3\n\
@@ -7157,10 +6596,10 @@ _08020910:\n\
b _08020996\n\
.align 2, 0\n\
_08020924: .4byte gBattleMoveDamage\n\
-_08020928: .4byte 0x02000000\n\
+_08020928: .4byte gSharedMem\n\
_0802092C: .4byte 0x0001600f\n\
_08020930:\n\
- ldr r2, _08020950 @ =0x02000000\n\
+ ldr r2, _08020950 @ =gSharedMem\n\
ldr r3, _08020954 @ =0x00016018\n\
adds r1, r2, r3\n\
ldrb r0, [r1]\n\
@@ -7176,7 +6615,7 @@ _08020930:\n\
strb r0, [r1]\n\
b _08020996\n\
.align 2, 0\n\
-_08020950: .4byte 0x02000000\n\
+_08020950: .4byte gSharedMem\n\
_08020954: .4byte 0x00016018\n\
_08020958: .4byte 0x0001600f\n\
_0802095C:\n\
@@ -7274,14 +6713,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;
}
@@ -7521,37 +6960,37 @@ static void MoveValuesCleanUp(void)
gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT);
}
-static void atk25_move_values_cleanup(void)
+static void atk25_movevaluescleanup(void)
{
MoveValuesCleanUp();
gBattlescriptCurrInstr += 1;
}
-static void atk26_set_multihit(void)
+static void atk26_setmultihit(void)
{
- gMultiHitCounter = BSScriptRead8(gBattlescriptCurrInstr + 1);
+ gMultiHitCounter = T2_READ_8(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr += 2;
}
-static void atk27_decrement_multihit(void)
+static void atk27_decrementmultihit(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 +7023,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 +7057,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 +7097,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 +7121,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 +7144,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++)
@@ -7738,12 +7178,12 @@ static void atk31_copyarray(void)
gBattlescriptCurrInstr += 10;
}
-static void atk32_copyarray_withindex(void)
+static void atk32_copyarraywithindex(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 +7196,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 +7212,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 +7221,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 +7237,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 +7248,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 +7265,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;
@@ -7837,26 +7277,26 @@ static void atk3B_healthbar_update(void)
static void atk3C_return(void)
{
- b_movescr_stack_pop_cursor();
+ BattleScriptPop();
}
static void atk3D_end(void)
{
gBattleMoveFlags = 0;
gActiveBank = 0;
- gFightStateTracker = 0xB;
+ gCurrentActionFuncId = 0xB;
}
static void atk3E_end2(void)
{
//not much difference between this and 3D. It's more apparent in Emerald
gActiveBank = 0;
- gFightStateTracker = 0xB;
+ gCurrentActionFuncId = 0xB;
}
static void atk3F_end3(void) //pops the main function stack
{
- b_movescr_stack_pop_cursor();
+ BattleScriptPop();
if (B_FUNCTION_STACK->size)
B_FUNCTION_STACK->size--;
gBattleMainFunc = B_FUNCTION_STACK->ptr[B_FUNCTION_STACK->size];
@@ -7864,274 +7304,115 @@ 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);
+ BattleScriptPush(gBattlescriptCurrInstr + 5);
+ 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;
}
-static void atk44(void)
+static void atk44_endselectionscript(void)
{
- unk_2000000[gBankAttacker + 0x16060] = 1;
+ ewram16060(gBankAttacker) = 1;
}
-#ifdef NONMATCHING
-
static void atk45_playanimation(void)
{
- #define ANIMATION_ID BSScriptRead8(gBattlescriptCurrInstr + 2)
- #define ARGUMENT (u16*) BS2ScriptReadPtr(gBattlescriptCurrInstr + 3)
- gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1));
+ const u16* argumentPtr;
- if ( ANIMATION_ID == 1 || ANIMATION_ID == 0x11 || ANIMATION_ID == 2) {
- EmitBattleAnimation(0, ANIMATION_ID, *argument);
+ gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
+ argumentPtr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 3);
+
+ if (gBattlescriptCurrInstr[2] == B_ANIM_STATS_CHANGE
+ || gBattlescriptCurrInstr[2] == B_ANIM_SNATCH_MOVE
+ || gBattlescriptCurrInstr[2] == B_ANIM_SUBSTITUTE_FADE)
+ {
+ EmitBattleAnimation(0, gBattlescriptCurrInstr[2], *argumentPtr);
MarkBufferBankForExecution(gActiveBank);
gBattlescriptCurrInstr += 7;
- } else if (gHitMarker & HITMARKER_NO_ANIMATIONS) {
- b_movescr_stack_push(gBattlescriptCurrInstr + 7);
+ }
+ else if (gHitMarker & HITMARKER_NO_ANIMATIONS)
+ {
+ BattleScriptPush(gBattlescriptCurrInstr + 7);
gBattlescriptCurrInstr = BattleScript_Pausex20;
- } else {
- if (((ANIMATION_ID - 10) > 3 && gStatuses3[gActiveBank] & (STATUS3_SEMI_INVULNERABLE))) {
- gBattlescriptCurrInstr += 7;
- } else {
- EmitBattleAnimation(0, ANIMATION_ID, *argument);
- MarkBufferBankForExecution(gActiveBank);
- gBattlescriptCurrInstr += 7;
- }
+ }
+ else if (gBattlescriptCurrInstr[2] == B_ANIM_RAIN_CONTINUES
+ || gBattlescriptCurrInstr[2] == B_ANIM_SUN_CONTINUES
+ || gBattlescriptCurrInstr[2] == B_ANIM_SANDSTORM_CONTINUES
+ || gBattlescriptCurrInstr[2] == B_ANIM_HAIL_CONTINUES)
+ {
+ EmitBattleAnimation(0, gBattlescriptCurrInstr[2], *argumentPtr);
+ MarkBufferBankForExecution(gActiveBank);
+ gBattlescriptCurrInstr += 7;
+ }
+ else if (gStatuses3[gActiveBank] & STATUS3_SEMI_INVULNERABLE)
+ {
+ gBattlescriptCurrInstr += 7;
+ }
+ else
+ {
+ EmitBattleAnimation(0, gBattlescriptCurrInstr[2], *argumentPtr);
+ MarkBufferBankForExecution(gActiveBank);
+ gBattlescriptCurrInstr += 7;
}
}
-#else
-__attribute__((naked))
-static void atk45_playanimation(void)
-{
- asm(".syntax unified\n\
- push {r4-r6,lr}\n\
- ldr r5, _08021444 @ =gBattlescriptCurrInstr\n\
- ldr r0, [r5]\n\
- ldrb r0, [r0, 0x1]\n\
- bl GetBattleBank\n\
- ldr r6, _08021448 @ =gActiveBank\n\
- strb r0, [r6]\n\
- ldr r2, [r5]\n\
- ldrb r1, [r2, 0x3]\n\
- ldrb r0, [r2, 0x4]\n\
- lsls r0, 8\n\
- adds r1, r0\n\
- ldrb r0, [r2, 0x5]\n\
- lsls r0, 16\n\
- adds r1, r0\n\
- ldrb r0, [r2, 0x6]\n\
- lsls r0, 24\n\
- adds r3, r1, r0\n\
- ldrb r4, [r2, 0x2]\n\
- adds r0, r4, 0\n\
- cmp r0, 0x1\n\
- beq _08021426\n\
- cmp r0, 0x11\n\
- beq _08021426\n\
- cmp r0, 0x2\n\
- bne _0802144C\n\
-_08021426:\n\
- ldr r4, _08021444 @ =gBattlescriptCurrInstr\n\
- ldr r0, [r4]\n\
- ldrb r1, [r0, 0x2]\n\
- ldrh r2, [r3]\n\
- movs r0, 0\n\
- bl EmitBattleAnimation\n\
- ldr r0, _08021448 @ =gActiveBank\n\
- ldrb r0, [r0]\n\
- bl MarkBufferBankForExecution\n\
- ldr r0, [r4]\n\
- adds r0, 0x7\n\
- str r0, [r4]\n\
- b _080214AE\n\
- .align 2, 0\n\
-_08021444: .4byte gBattlescriptCurrInstr\n\
-_08021448: .4byte gActiveBank\n\
-_0802144C:\n\
- ldr r0, _08021464 @ =gHitMarker\n\
- ldr r0, [r0]\n\
- movs r1, 0x80\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0802146C\n\
- adds r0, r2, 0x7\n\
- bl b_movescr_stack_push\n\
- ldr r0, _08021468 @ =BattleScript_Pausex20\n\
- b _080214AC\n\
- .align 2, 0\n\
-_08021464: .4byte gHitMarker\n\
-_08021468: .4byte BattleScript_Pausex20\n\
-_0802146C:\n\
- adds r0, r4, 0\n\
- subs r0, 0xA\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- cmp r0, 0x3\n\
- bls _08021498\n\
- ldr r1, _08021490 @ =gStatuses3\n\
- ldrb r0, [r6]\n\
- lsls r0, 2\n\
- adds r0, r1\n\
- ldr r0, [r0]\n\
- ldr r1, _08021494 @ =0x000400c0\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08021498\n\
- adds r0, r2, 0x7\n\
- b _080214AC\n\
- .align 2, 0\n\
-_08021490: .4byte gStatuses3\n\
-_08021494: .4byte 0x000400c0\n\
-_08021498:\n\
- ldrb r1, [r2, 0x2]\n\
- ldrh r2, [r3]\n\
- movs r0, 0\n\
- bl EmitBattleAnimation\n\
- ldrb r0, [r6]\n\
- bl MarkBufferBankForExecution\n\
- ldr r0, [r5]\n\
- adds r0, 0x7\n\
-_080214AC:\n\
- str r0, [r5]\n\
-_080214AE:\n\
- pop {r4-r6}\n\
- pop {r0}\n\
- bx r0\n\
- .syntax divided");
-}
-#endif // NONMATCHING
-
-#ifdef NONMATCHING
-static void atk46_playanimation2(void)
+static void atk46_playanimation2(void) // animation Id is stored in the first pointer
{
+ const u16* argumentPtr;
+ const u8* animationIdPtr;
-}
+ gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]);
+ animationIdPtr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 2);
+ argumentPtr = BS2ScriptReadPtr(gBattlescriptCurrInstr + 6);
-#else
-__attribute__((naked))
-static void atk46_playanimation2(void)
-{
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- ldr r6, _0802151C @ =gBattlescriptCurrInstr\n\
- ldr r0, [r6]\n\
- ldrb r0, [r0, 0x1]\n\
- bl GetBattleBank\n\
- ldr r7, _08021520 @ =gActiveBank\n\
- strb r0, [r7]\n\
- ldr r2, [r6]\n\
- ldrb r1, [r2, 0x2]\n\
- ldrb r0, [r2, 0x3]\n\
- lsls r0, 8\n\
- adds r1, r0\n\
- ldrb r0, [r2, 0x4]\n\
- lsls r0, 16\n\
- adds r1, r0\n\
- ldrb r0, [r2, 0x5]\n\
- lsls r0, 24\n\
- adds r3, r1, r0\n\
- ldrb r1, [r2, 0x6]\n\
- ldrb r0, [r2, 0x7]\n\
- lsls r0, 8\n\
- adds r1, r0\n\
- ldrb r0, [r2, 0x8]\n\
- lsls r0, 16\n\
- adds r1, r0\n\
- ldrb r0, [r2, 0x9]\n\
- lsls r0, 24\n\
- adds r4, r1, r0\n\
- ldrb r5, [r3]\n\
- adds r0, r5, 0\n\
- cmp r0, 0x1\n\
- beq _080214FE\n\
- cmp r0, 0x11\n\
- beq _080214FE\n\
- cmp r0, 0x2\n\
- bne _08021524\n\
-_080214FE:\n\
- ldrb r1, [r3]\n\
- ldrh r2, [r4]\n\
- movs r0, 0\n\
- bl EmitBattleAnimation\n\
- ldr r0, _08021520 @ =gActiveBank\n\
- ldrb r0, [r0]\n\
- bl MarkBufferBankForExecution\n\
- ldr r1, _0802151C @ =gBattlescriptCurrInstr\n\
- ldr r0, [r1]\n\
- adds r0, 0xA\n\
- str r0, [r1]\n\
- b _0802157A\n\
- .align 2, 0\n\
-_0802151C: .4byte gBattlescriptCurrInstr\n\
-_08021520: .4byte gActiveBank\n\
-_08021524:\n\
- ldr r0, _08021534 @ =gHitMarker\n\
- ldr r0, [r0]\n\
- movs r1, 0x80\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08021538\n\
- adds r0, r2, 0\n\
- b _08021576\n\
- .align 2, 0\n\
-_08021534: .4byte gHitMarker\n\
-_08021538:\n\
- adds r0, r5, 0\n\
- subs r0, 0xA\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- cmp r0, 0x3\n\
- bls _08021564\n\
- ldr r1, _0802155C @ =gStatuses3\n\
- ldrb r0, [r7]\n\
- lsls r0, 2\n\
- adds r0, r1\n\
- ldr r0, [r0]\n\
- ldr r1, _08021560 @ =0x000400c0\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08021564\n\
- adds r0, r2, 0\n\
- b _08021576\n\
- .align 2, 0\n\
-_0802155C: .4byte gStatuses3\n\
-_08021560: .4byte 0x000400c0\n\
-_08021564:\n\
- ldrb r1, [r3]\n\
- ldrh r2, [r4]\n\
- movs r0, 0\n\
- bl EmitBattleAnimation\n\
- ldrb r0, [r7]\n\
- bl MarkBufferBankForExecution\n\
- ldr r0, [r6]\n\
-_08021576:\n\
- adds r0, 0xA\n\
- str r0, [r6]\n\
-_0802157A:\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .syntax divided ");
+ if (*animationIdPtr == B_ANIM_STATS_CHANGE
+ || *animationIdPtr == B_ANIM_SNATCH_MOVE
+ || *animationIdPtr == B_ANIM_SUBSTITUTE_FADE)
+ {
+ EmitBattleAnimation(0, *animationIdPtr, *argumentPtr);
+ MarkBufferBankForExecution(gActiveBank);
+ gBattlescriptCurrInstr += 10;
+ }
+ else if (gHitMarker & HITMARKER_NO_ANIMATIONS)
+ {
+ gBattlescriptCurrInstr += 10;
+ }
+ else if (*animationIdPtr == B_ANIM_RAIN_CONTINUES
+ || *animationIdPtr == B_ANIM_SUN_CONTINUES
+ || *animationIdPtr == B_ANIM_SANDSTORM_CONTINUES
+ || *animationIdPtr == B_ANIM_HAIL_CONTINUES)
+ {
+ EmitBattleAnimation(0, *animationIdPtr, *argumentPtr);
+ MarkBufferBankForExecution(gActiveBank);
+ gBattlescriptCurrInstr += 10;
+ }
+ else if (gStatuses3[gActiveBank] & STATUS3_SEMI_INVULNERABLE)
+ {
+ gBattlescriptCurrInstr += 10;
+ }
+ else
+ {
+ EmitBattleAnimation(0, *animationIdPtr, *argumentPtr);
+ MarkBufferBankForExecution(gActiveBank);
+ gBattlescriptCurrInstr += 10;
+ }
}
-#endif // NONMATCHING
static void atk47_setgraphicalstatchangevalues(void)
{
@@ -8165,9 +7446,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,10 +7458,10 @@ 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)
+ if (gSideTimers[GetBankIdentity(gActiveBank) & 1].mistTimer)
continue;
ability = gBattleMons[gActiveBank].ability;
if (ability == ABILITY_CLEAR_BODY || ability == ABILITY_WHITE_SMOKE || (ability == ABILITY_KEEN_EYE && curr_stat == 6) || (ability == ABILITY_HYPER_CUTTER && curr_stat == 1))
@@ -8196,7 +7477,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 +7501,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;
}
@@ -8315,7 +7596,7 @@ _0802167C:\n\
lsls r0, r1, 1\n\
adds r0, r1\n\
lsls r0, 2\n\
- ldr r1, _08021704 @ =gSideTimer\n\
+ ldr r1, _08021704 @ =gSideTimers\n\
adds r0, r1\n\
ldrb r0, [r0, 0x2]\n\
ldr r3, [sp]\n\
@@ -8378,7 +7659,7 @@ _080216E4:\n\
b _08021770\n\
.align 2, 0\n\
_08021700: .4byte gActiveBank\n\
-_08021704: .4byte gSideTimer\n\
+_08021704: .4byte gSideTimers\n\
_08021708: .4byte gBattleMons\n\
_0802170C: .4byte gBattlescriptCurrInstr\n\
_08021710:\n\
@@ -8454,7 +7735,7 @@ _0802178C: .4byte gUnknown_02024A98\n\
_08021790:\n\
cmp r3, 0\n\
beq _080217E0\n\
- ldr r0, _080217D0 @ =0x02000000\n\
+ ldr r0, _080217D0 @ =gSharedMem\n\
ldr r1, _080217D4 @ =0x000160dc\n\
adds r4, r0, r1\n\
ldrb r0, [r4]\n\
@@ -8484,7 +7765,7 @@ _080217CC:\n\
ldr r1, _080217DC @ =gBattlescriptCurrInstr\n\
b _080217E2\n\
.align 2, 0\n\
-_080217D0: .4byte 0x02000000\n\
+_080217D0: .4byte gSharedMem\n\
_080217D4: .4byte 0x000160dc\n\
_080217D8: .4byte gActiveBank\n\
_080217DC: .4byte gBattlescriptCurrInstr\n\
@@ -8509,7 +7790,7 @@ _080217E6:\n\
#endif // NONMATCHING
#ifdef NONMATCHING
-static void atk49_moveendturn(void)
+static void atk49_moveend(void)
{
int i;
int effect = 0;
@@ -8518,14 +7799,14 @@ 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
hold_effect_atk = ItemId_GetHoldEffect(gBattleMons[gBankTarget].item);
- choiced_move_atk = (u16*)(gBankAttacker * 0x020160e8);
+ choiced_move_atk = (u16*)(gBankAttacker * (ewram_addr + 0x160E8));
if (BATTLE_STRUCT->dynamicMoveType)
move_type = BATTLE_STRUCT->dynamicMoveType & 0x3F;
else
@@ -8543,8 +7824,8 @@ static void atk49_moveendturn(void)
&& gBattleMoves[gCurrentMove].power && gBattleMons[gBankTarget].statStages[STAT_STAGE_ATK] <= 0xB)
{
gBattleMons[gBankTarget].statStages[STAT_STAGE_ATK]++;
- b_movescr_stack_push_cursor();
- gBattlescriptCurrInstr = gUnknown_081D9132;
+ BattleScriptPushCursor();
+ gBattlescriptCurrInstr = BattleScript_RageIsBuilding;
effect = 1;
}
BATTLE_STRUCT->cmd49StateTracker++;
@@ -8557,10 +7838,10 @@ static void atk49_moveendturn(void)
{
gBattleMons[gBankTarget].status1 &= ~(STATUS_FREEZE);
gActiveBank = gBankTarget;
- EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status1);
+ EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status1);
MarkBufferBankForExecution(gActiveBank);
- b_movescr_stack_push_cursor();
- gBattlescriptCurrInstr = gUnknown_081D955D;
+ BattleScriptPushCursor();
+ gBattlescriptCurrInstr = BattleScript_DefrostedViaFireMove;
effect = 1;
}
BATTLE_STRUCT->cmd49StateTracker++;
@@ -8601,7 +7882,7 @@ static void atk49_moveendturn(void)
case 7: //changed held items
for (i = 0; i < gNoOfAllBanks; i++)
{
- #define CHANGED_ITEM (((*u16)(0x020160f0)))
+ #define CHANGED_ITEM (((*u16)(gSharedMem + 0x160F0)))
if (CHANGED_ITEM(i))
gBattleMons[i].item = CHANGED_ITEM(i);
}
@@ -8617,10 +7898,9 @@ static void atk49_moveendturn(void)
}
BATTLE_STRUCT->cmd49StateTracker++;
break;
- //sub_8015660 CheckIfMoveFailed
case 9: //semi-invlurneable attacker make visible
if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) || !(gStatuses3[gBankAttacker] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER))
- || sub_8015660(gBankAttacker))
+ || WasUnableToUseMove(gBankAttacker))
{
gActiveBank = gBankAttacker;
EmitSpriteInvisibility(0, 0);
@@ -8632,7 +7912,7 @@ static void atk49_moveendturn(void)
break;
case 10: //semi-invlurneable target make visible
if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT) || !(gStatuses3[gBankTarget] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER))
- || sub_8015660(gBankTarget))
+ || WasUnableToUseMove(gBankTarget))
{
gActiveBank = gBankTarget;
EmitSpriteInvisibility(0, 0);
@@ -8649,7 +7929,7 @@ static void atk49_moveendturn(void)
}
#else
__attribute__((naked))
-static void atk49_moveendturn(void)
+static void atk49_moveend(void)
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
@@ -8697,7 +7977,7 @@ _0802184E:\n\
ldr r0, _0802186C @ =gBankAttacker\n\
ldrb r1, [r0]\n\
lsls r1, 1\n\
- ldr r0, _08021870 @ =0x020160e8\n\
+ ldr r0, _08021870 @ =gSharedMem + 0x160E8\n\
adds r1, r0\n\
str r1, [sp, 0xC]\n\
subs r0, 0xCC\n\
@@ -8710,18 +7990,18 @@ _0802184E:\n\
b _080218D2\n\
.align 2, 0\n\
_0802186C: .4byte gBankAttacker\n\
-_08021870: .4byte 0x020160e8\n\
+_08021870: .4byte gSharedMem + 0x160E8\n\
_08021874:\n\
strb r2, [r7]\n\
ldr r0, [r5]\n\
orrs r0, r6\n\
str r0, [r5]\n\
- ldr r0, _080218AC @ =0x02000000\n\
+ ldr r0, _080218AC @ =gSharedMem\n\
ldr r3, _080218B0 @ =0x0001600c\n\
adds r0, r3\n\
strb r4, [r0]\n\
bl MoveValuesCleanUp\n\
- ldr r2, _080218B4 @ =gBattleScriptsEffectsTable\n\
+ ldr r2, _080218B4 @ =gBattleScriptsForMoveEffects\n\
mov r4, r8\n\
ldrh r1, [r4]\n\
lsls r0, r1, 1\n\
@@ -8732,14 +8012,14 @@ _08021874:\n\
lsls r0, 2\n\
adds r0, r2\n\
ldr r0, [r0]\n\
- bl b_movescr_stack_push\n\
+ bl BattleScriptPush\n\
ldr r1, _080218B8 @ =gBattlescriptCurrInstr\n\
ldr r0, _080218BC @ =gUnknown_081D9B2D\n\
bl _0802229C\n\
.align 2, 0\n\
-_080218AC: .4byte 0x02000000\n\
+_080218AC: .4byte gSharedMem\n\
_080218B0: .4byte 0x0001600c\n\
-_080218B4: .4byte gBattleScriptsEffectsTable\n\
+_080218B4: .4byte gBattleScriptsForMoveEffects\n\
_080218B8: .4byte gBattlescriptCurrInstr\n\
_080218BC: .4byte gUnknown_081D9B2D\n\
_080218C0:\n\
@@ -8753,13 +8033,13 @@ _080218C0:\n\
ldrb r0, [r0, 0x2]\n\
str r0, [sp, 0x4]\n\
_080218D2:\n\
- ldr r5, _080218E0 @ =0x02000000\n\
+ ldr r5, _080218E0 @ =gSharedMem\n\
mov r12, r5\n\
b _080218EE\n\
.align 2, 0\n\
_080218D8: .4byte gBattleMoves\n\
_080218DC: .4byte gCurrentMove\n\
-_080218E0: .4byte 0x02000000\n\
+_080218E0: .4byte gSharedMem\n\
_080218E4:\n\
mov r0, r10\n\
cmp r0, 0\n\
@@ -8877,14 +8157,14 @@ _080219C8:\n\
bgt _080219FE\n\
adds r0, r2, 0x1\n\
strb r0, [r1, 0x19]\n\
- bl b_movescr_stack_push_cursor\n\
+ bl BattleScriptPushCursor\n\
ldr r1, _08021A24 @ =gBattlescriptCurrInstr\n\
- ldr r0, _08021A28 @ =gUnknown_081D9132\n\
+ ldr r0, _08021A28 @ =BattleScript_RageIsBuilding\n\
str r0, [r1]\n\
movs r5, 0x1\n\
mov r10, r5\n\
_080219FE:\n\
- ldr r2, _08021A2C @ =0x02000000\n\
+ ldr r2, _08021A2C @ =gSharedMem\n\
ldr r0, _08021A30 @ =0x0001600c\n\
adds r1, r2, r0\n\
b _08021E00\n\
@@ -8897,8 +8177,8 @@ _08021A18: .4byte gProtectStructs\n\
_08021A1C: .4byte gBattleMoves\n\
_08021A20: .4byte gCurrentMove\n\
_08021A24: .4byte gBattlescriptCurrInstr\n\
-_08021A28: .4byte gUnknown_081D9132\n\
-_08021A2C: .4byte 0x02000000\n\
+_08021A28: .4byte BattleScript_RageIsBuilding\n\
+_08021A2C: .4byte gSharedMem\n\
_08021A30: .4byte 0x0001600c\n\
_08021A34:\n\
ldr r2, _08021AD0 @ =gBattleMons\n\
@@ -8972,12 +8252,12 @@ _08021A92:\n\
movs r1, 0x28\n\
movs r2, 0\n\
movs r3, 0x4\n\
- bl EmitSetAttributes\n\
+ bl EmitSetMonData\n\
ldrb r0, [r4]\n\
bl MarkBufferBankForExecution\n\
- bl b_movescr_stack_push_cursor\n\
+ bl BattleScriptPushCursor\n\
ldr r1, _08021AE8 @ =gBattlescriptCurrInstr\n\
- ldr r0, _08021AEC @ =gUnknown_081D955D\n\
+ ldr r0, _08021AEC @ =BattleScript_DefrostedViaFireMove\n\
str r0, [r1]\n\
movs r2, 0x1\n\
mov r10, r2\n\
@@ -8990,7 +8270,7 @@ _08021ADC: .4byte gSpecialStatuses\n\
_08021AE0: .4byte gBattleMoveFlags\n\
_08021AE4: .4byte gActiveBank\n\
_08021AE8: .4byte gBattlescriptCurrInstr\n\
-_08021AEC: .4byte gUnknown_081D955D\n\
+_08021AEC: .4byte BattleScript_DefrostedViaFireMove\n\
_08021AF0:\n\
ldr r0, _08021B14 @ =gBankTarget\n\
ldrb r1, [r0]\n\
@@ -9006,13 +8286,13 @@ _08021AF0:\n\
movs r4, 0x1\n\
mov r10, r4\n\
_08021B0C:\n\
- ldr r2, _08021B18 @ =0x02000000\n\
+ ldr r2, _08021B18 @ =gSharedMem\n\
ldr r5, _08021B1C @ =0x0001600c\n\
adds r1, r2, r5\n\
b _08021E00\n\
.align 2, 0\n\
_08021B14: .4byte gBankTarget\n\
-_08021B18: .4byte 0x02000000\n\
+_08021B18: .4byte gSharedMem\n\
_08021B1C: .4byte 0x0001600c\n\
_08021B20:\n\
ldr r0, _08021B40 @ =gBankTarget\n\
@@ -9046,18 +8326,18 @@ _08021B44:\n\
beq _08021B68\n\
movs r4, 0x1\n\
mov r10, r4\n\
- ldr r5, _08021B64 @ =0x02000000\n\
+ ldr r5, _08021B64 @ =gSharedMem\n\
mov r12, r5\n\
b _0802224E\n\
.align 2, 0\n\
-_08021B64: .4byte 0x02000000\n\
+_08021B64: .4byte gSharedMem\n\
_08021B68:\n\
- ldr r2, _08021B70 @ =0x02000000\n\
+ ldr r2, _08021B70 @ =gSharedMem\n\
ldr r0, _08021B74 @ =0x0001600c\n\
adds r1, r2, r0\n\
b _08021E00\n\
.align 2, 0\n\
-_08021B70: .4byte 0x02000000\n\
+_08021B70: .4byte gSharedMem\n\
_08021B74: .4byte 0x0001600c\n\
_08021B78:\n\
ldr r0, _08021B98 @ =gBankAttacker\n\
@@ -9089,7 +8369,7 @@ _08021B9C:\n\
ldr r4, [sp, 0x8]\n\
cmp r4, 0x1D\n\
bne _08021BE0\n\
- ldr r0, _08021C2C @ =gUnknown_02024BE8\n\
+ ldr r0, _08021C2C @ =gChosenMove\n\
ldrh r2, [r0]\n\
adds r7, r0, 0\n\
cmp r2, 0xA5\n\
@@ -9157,7 +8437,7 @@ _08021C22:\n\
b _08022244\n\
.align 2, 0\n\
_08021C28: .4byte gHitMarker\n\
-_08021C2C: .4byte gUnknown_02024BE8\n\
+_08021C2C: .4byte gChosenMove\n\
_08021C30: .4byte 0x0000ffff\n\
_08021C34: .4byte gBattleMoveFlags\n\
_08021C38: .4byte gBattleMons\n\
@@ -9171,7 +8451,7 @@ _08021C40:\n\
b _08022244\n\
_08021C4C:\n\
movs r5, 0\n\
- ldr r2, _08021C70 @ =0x020160f0\n\
+ ldr r2, _08021C70 @ =gSharedMem + 0x160F0\n\
ldr r3, _08021C74 @ =gBattleMons\n\
_08021C52:\n\
ldrh r1, [r2]\n\
@@ -9189,7 +8469,7 @@ _08021C5C:\n\
b _08022244\n\
.align 2, 0\n\
_08021C6C: .4byte gNoOfAllBanks\n\
-_08021C70: .4byte 0x020160f0\n\
+_08021C70: .4byte gSharedMem + 0x160F0\n\
_08021C74: .4byte gBattleMons\n\
_08021C78:\n\
movs r0, 0x3\n\
@@ -9201,18 +8481,18 @@ _08021C78:\n\
beq _08021C98\n\
movs r2, 0x1\n\
mov r10, r2\n\
- ldr r3, _08021C94 @ =0x02000000\n\
+ ldr r3, _08021C94 @ =gSharedMem\n\
mov r12, r3\n\
b _0802224E\n\
.align 2, 0\n\
-_08021C94: .4byte 0x02000000\n\
+_08021C94: .4byte gSharedMem\n\
_08021C98:\n\
- ldr r2, _08021CA0 @ =0x02000000\n\
+ ldr r2, _08021CA0 @ =gSharedMem\n\
ldr r4, _08021CA4 @ =0x0001600c\n\
adds r1, r2, r4\n\
b _08021E00\n\
.align 2, 0\n\
-_08021CA0: .4byte 0x02000000\n\
+_08021CA0: .4byte gSharedMem\n\
_08021CA4: .4byte 0x0001600c\n\
_08021CA8:\n\
movs r0, 0x4\n\
@@ -9225,12 +8505,12 @@ _08021CA8:\n\
movs r5, 0x1\n\
mov r10, r5\n\
_08021CBC:\n\
- ldr r2, _08021CC4 @ =0x02000000\n\
+ ldr r2, _08021CC4 @ =gSharedMem\n\
ldr r0, _08021CC8 @ =0x0001600c\n\
adds r1, r2, r0\n\
b _08021E00\n\
.align 2, 0\n\
-_08021CC4: .4byte 0x02000000\n\
+_08021CC4: .4byte gSharedMem\n\
_08021CC8: .4byte 0x0001600c\n\
_08021CCC:\n\
ldr r1, _08021D04 @ =gStatuses3\n\
@@ -9285,7 +8565,7 @@ _08021D18:\n\
cmp r0, 0\n\
beq _08021D44\n\
adds r0, r2, 0\n\
- bl sub_8015660\n\
+ bl WasUnableToUseMove\n\
lsls r0, 24\n\
cmp r0, 0\n\
beq _08021D7E\n\
@@ -9318,7 +8598,7 @@ _08021D44:\n\
orrs r1, r2\n\
strb r1, [r0]\n\
_08021D7E:\n\
- ldr r2, _08021DA4 @ =0x02000000\n\
+ ldr r2, _08021DA4 @ =gSharedMem\n\
ldr r4, _08021DA8 @ =0x0001600c\n\
adds r1, r2, r4\n\
b _08021E00\n\
@@ -9330,7 +8610,7 @@ _08021D94: .4byte 0x000400c0\n\
_08021D98: .4byte gActiveBank\n\
_08021D9C: .4byte 0xfffbff3f\n\
_08021DA0: .4byte gSpecialStatuses\n\
-_08021DA4: .4byte 0x02000000\n\
+_08021DA4: .4byte gSharedMem\n\
_08021DA8: .4byte 0x0001600c\n\
_08021DAC:\n\
ldr r2, _08021E0C @ =gSpecialStatuses\n\
@@ -9371,7 +8651,7 @@ _08021DAC:\n\
ands r0, r1\n\
str r0, [r2]\n\
_08021DFA:\n\
- ldr r2, _08021E28 @ =0x02000000\n\
+ ldr r2, _08021E28 @ =gSharedMem\n\
ldr r3, _08021E2C @ =0x0001600c\n\
adds r1, r2, r3\n\
_08021E00:\n\
@@ -9388,7 +8668,7 @@ _08021E18: .4byte gStatuses3\n\
_08021E1C: .4byte 0x000400c0\n\
_08021E20: .4byte gActiveBank\n\
_08021E24: .4byte 0xfffbff3f\n\
-_08021E28: .4byte 0x02000000\n\
+_08021E28: .4byte gSharedMem\n\
_08021E2C: .4byte 0x0001600c\n\
_08021E30:\n\
movs r4, 0\n\
@@ -9446,7 +8726,7 @@ _08021E70:\n\
str r3, [r5]\n\
_08021E9A:\n\
ldr r1, _08021F40 @ =gBattleMoves\n\
- ldr r2, _08021F44 @ =gUnknown_02024BE8\n\
+ ldr r2, _08021F44 @ =gChosenMove\n\
ldrh r3, [r2]\n\
lsls r0, r3, 1\n\
adds r0, r3\n\
@@ -9529,7 +8809,7 @@ _08021F34: .4byte gActiveBank\n\
_08021F38: .4byte gBankTarget\n\
_08021F3C: .4byte 0xffffefff\n\
_08021F40: .4byte gBattleMoves\n\
-_08021F44: .4byte gUnknown_02024BE8\n\
+_08021F44: .4byte gChosenMove\n\
_08021F48: .4byte gBattleMoveFlags\n\
_08021F4C: .4byte gUnknown_02024C2C\n\
_08021F50: .4byte gAbsentBankFlags\n\
@@ -9680,7 +8960,7 @@ _08022082:\n\
b _08022244\n\
_08022090:\n\
ldr r1, _0802213C @ =gBattleMoves\n\
- ldr r4, _08022140 @ =gUnknown_02024BE8\n\
+ ldr r4, _08022140 @ =gChosenMove\n\
ldrh r3, [r4]\n\
lsls r0, r3, 1\n\
adds r0, r3\n\
@@ -9764,7 +9044,7 @@ _08022130: .4byte gBitTable\n\
_08022134: .4byte gBankAttacker\n\
_08022138: .4byte 0x000160a6\n\
_0802213C: .4byte gBattleMoves\n\
-_08022140: .4byte gUnknown_02024BE8\n\
+_08022140: .4byte gChosenMove\n\
_08022144: .4byte gHitMarker\n\
_08022148: .4byte gBankTarget\n\
_0802214C: .4byte gBattleMoveFlags\n\
@@ -9867,7 +9147,7 @@ _080221C0:\n\
eors r0, r1\n\
lsls r0, 24\n\
lsrs r0, 24\n\
- bl GetBankByPlayerAI\n\
+ bl GetBankByIdentity\n\
lsls r0, 24\n\
lsrs r2, r0, 24\n\
ldr r1, _080222CC @ =gBattleMons\n\
@@ -9882,7 +9162,7 @@ _0802223A:\n\
ldr r0, [r5]\n\
orrs r0, r6\n\
str r0, [r5]\n\
- ldr r2, _080222D0 @ =0x02000000\n\
+ ldr r2, _080222D0 @ =gSharedMem\n\
mov r12, r2\n\
_08022244:\n\
ldr r1, _080222D4 @ =0x0001600c\n\
@@ -9952,7 +9232,7 @@ _080222C0: .4byte gBattleMoves\n\
_080222C4: .4byte gCurrentMove\n\
_080222C8: .4byte gBankTarget\n\
_080222CC: .4byte gBattleMons\n\
-_080222D0: .4byte 0x02000000\n\
+_080222D0: .4byte gSharedMem\n\
_080222D4: .4byte 0x0001600c\n\
_080222D8: .4byte gBattlescriptCurrInstr\n\
.syntax divided"
@@ -10035,7 +9315,7 @@ static void atk4A_typecalc2(void)
gBattlescriptCurrInstr++;
}
-static void atk4B_return_atk_to_ball(void)
+static void atk4B_returnatktoball(void)
{
gActiveBank = gBankAttacker;
if (!(gHitMarker & HITMARKER_FAINTED(gActiveBank)))
@@ -10046,14 +9326,14 @@ static void atk4B_return_atk_to_ball(void)
gBattlescriptCurrInstr++;
}
-static void atk4C_copy_poke_data(void)
+static void atk4C_getswitchedmondata(void)
{
if (gBattleExecBuffer)
return;
- gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1));
+ gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
- gBattlePartyID[gActiveBank] = unk_2000000[0x16068 + gActiveBank];
+ gBattlePartyID[gActiveBank] = ewram16068arr(gActiveBank);
EmitGetAttributes(0, 0, gBitTable[gBattlePartyID[gActiveBank]]);
MarkBufferBankForExecution(gActiveBank);
@@ -10070,7 +9350,7 @@ static inline u8 get_knocked_off_byte(u8 bank)
return *cc;
}
-static void atk4D_switch_data_update(void)
+static void atk4D_switchindataupdate(void)
{
struct BattlePokemon OldData;
int i;
@@ -10078,7 +9358,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++)
@@ -10114,34 +9394,34 @@ static void atk4D_switch_data_update(void)
gBattlescriptCurrInstr += 2;
}
-static void atk4E_switchin_anim(void)
+static void atk4E_switchinanim(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;
}
-static void atk4F_jump_if_cannot_switch(void)
+static void atk4F_jumpifcantswitch(void)
{
int val, to_cmp;
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 +9442,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;
}
@@ -10170,18 +9450,18 @@ static void atk4F_jump_if_cannot_switch(void)
{
if (GetBankSide(gActiveBank) == 1)
{
- r7 = GetBankByPlayerAI(1);
+ r7 = GetBankByIdentity(1);
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
- to_cmp = GetBankByPlayerAI(3);
+ to_cmp = GetBankByIdentity(3);
else
to_cmp = r7;
party = gEnemyParty;
}
else
{
- r7 = GetBankByPlayerAI(0);
+ r7 = GetBankByIdentity(0);
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
- to_cmp = GetBankByPlayerAI(2);
+ to_cmp = GetBankByIdentity(2);
else
to_cmp = r7;
party = gPlayerParty;
@@ -10195,7 +9475,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;
}
@@ -10203,8 +9483,7 @@ static void atk4F_jump_if_cannot_switch(void)
void sub_8022A3C(u8 unkown)
{
- //BATTLE_STRUCT->unk16064[gActiveBank] = gBattlePartyID[gActiveBank];
- ewram[gActiveBank + 0x16064] = gBattlePartyID[gActiveBank];
+ BATTLE_PARTY_ID(gActiveBank) = gBattlePartyID[gActiveBank];
EmitChoosePokemon(0, 1, unkown, 0, BATTLE_STRUCT->unk1606C[gActiveBank]);
MarkBufferBankForExecution(gActiveBank);
}
@@ -10214,9 +9493,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)
{
@@ -10466,7 +9745,7 @@ _08022C2C:\n\
lsls r0, 25\n\
cmp r0, 0\n\
blt _08022C6C\n\
- ldr r0, _08022C64 @ =0x02000000\n\
+ ldr r0, _08022C64 @ =gSharedMem\n\
ldr r1, _08022C68 @ =0x0001606a\n\
adds r0, r1\n\
ldrb r0, [r0]\n\
@@ -10483,7 +9762,7 @@ _08022C2C:\n\
b _08022C7E\n\
.align 2, 0\n\
_08022C60: .4byte gSpecialStatuses\n\
-_08022C64: .4byte 0x02000000\n\
+_08022C64: .4byte gSharedMem\n\
_08022C68: .4byte 0x0001606a\n\
_08022C6C:\n\
movs r0, 0\n\
@@ -10551,7 +9830,7 @@ _08022CE8:\n\
lsls r0, 25\n\
cmp r0, 0\n\
blt _08022D28\n\
- ldr r0, _08022D20 @ =0x02000000\n\
+ ldr r0, _08022D20 @ =gSharedMem\n\
ldr r1, _08022D24 @ =0x00016068\n\
adds r0, r1\n\
ldrb r0, [r0]\n\
@@ -10568,7 +9847,7 @@ _08022CE8:\n\
b _08022D40\n\
.align 2, 0\n\
_08022D1C: .4byte gSpecialStatuses\n\
-_08022D20: .4byte 0x02000000\n\
+_08022D20: .4byte gSharedMem\n\
_08022D24: .4byte 0x00016068\n\
_08022D28:\n\
movs r0, 0x1\n\
@@ -10635,7 +9914,7 @@ _08022DA0:\n\
lsls r0, 25\n\
cmp r0, 0\n\
blt _08022DE0\n\
- ldr r0, _08022DD8 @ =0x02000000\n\
+ ldr r0, _08022DD8 @ =gSharedMem\n\
ldr r1, _08022DDC @ =0x0001606b\n\
adds r0, r1\n\
ldrb r0, [r0]\n\
@@ -10652,7 +9931,7 @@ _08022DA0:\n\
b _08022DF6\n\
.align 2, 0\n\
_08022DD4: .4byte gSpecialStatuses\n\
-_08022DD8: .4byte 0x02000000\n\
+_08022DD8: .4byte gSharedMem\n\
_08022DDC: .4byte 0x0001606b\n\
_08022DE0:\n\
movs r0, 0\n\
@@ -10722,7 +10001,7 @@ _08022E60:\n\
lsls r0, 25\n\
cmp r0, 0\n\
blt _08022EA0\n\
- ldr r0, _08022E98 @ =0x02000000\n\
+ ldr r0, _08022E98 @ =gSharedMem\n\
ldr r1, _08022E9C @ =0x00016069\n\
adds r0, r1\n\
ldrb r0, [r0]\n\
@@ -10739,7 +10018,7 @@ _08022E60:\n\
b _08022EB8\n\
.align 2, 0\n\
_08022E94: .4byte gSpecialStatuses\n\
-_08022E98: .4byte 0x02000000\n\
+_08022E98: .4byte gSharedMem\n\
_08022E9C: .4byte 0x00016069\n\
_08022EA0:\n\
movs r0, 0x2\n\
@@ -10922,7 +10201,7 @@ _08023008:\n\
lsls r0, 25\n\
cmp r0, 0\n\
blt _0802303A\n\
- ldr r0, _0802309C @ =0x02000000\n\
+ ldr r0, _0802309C @ =gSharedMem\n\
ldr r1, _080230A0 @ =0x00016068\n\
adds r0, r1\n\
ldrb r0, [r0]\n\
@@ -10983,7 +10262,7 @@ _0802303A:\n\
b _080230EE\n\
.align 2, 0\n\
_08023098: .4byte gSpecialStatuses\n\
-_0802309C: .4byte 0x02000000\n\
+_0802309C: .4byte gSharedMem\n\
_080230A0: .4byte 0x00016068\n\
_080230A4: .4byte gBitTable\n\
_080230A8: .4byte gActiveBank\n\
@@ -11002,7 +10281,7 @@ _080230BC:\n\
lsls r0, 25\n\
cmp r0, 0\n\
blt _080230EE\n\
- ldr r0, _08023100 @ =0x02000000\n\
+ ldr r0, _08023100 @ =gSharedMem\n\
ldr r1, _08023104 @ =0x00016069\n\
adds r0, r1\n\
ldrb r0, [r0]\n\
@@ -11025,7 +10304,7 @@ _080230EE:\n\
b _08023110\n\
.align 2, 0\n\
_080230FC: .4byte gSpecialStatuses\n\
-_08023100: .4byte 0x02000000\n\
+_08023100: .4byte gSharedMem\n\
_08023104: .4byte 0x00016069\n\
_08023108: .4byte gBattlescriptCurrInstr\n\
_0802310C:\n\
@@ -11146,7 +10425,7 @@ _080231F4: .4byte gHitMarker\n\
_080231F8:\n\
ldr r4, _080232A0 @ =gActiveBank\n\
strb r7, [r4]\n\
- ldr r3, _080232A4 @ =0x02000000\n\
+ ldr r3, _080232A4 @ =gSharedMem\n\
ldrb r0, [r4]\n\
ldr r2, _080232A8 @ =0x00016064\n\
adds r1, r0, r2\n\
@@ -11227,7 +10506,7 @@ _0802328A:\n\
b _08023302\n\
.align 2, 0\n\
_080232A0: .4byte gActiveBank\n\
-_080232A4: .4byte 0x02000000\n\
+_080232A4: .4byte gSharedMem\n\
_080232A8: .4byte 0x00016064\n\
_080232AC: .4byte gBattlePartyID\n\
_080232B0: .4byte 0x00016068\n\
@@ -11242,7 +10521,7 @@ _080232C4:\n\
eors r0, r1\n\
lsls r0, 24\n\
lsrs r0, 24\n\
- bl GetBankByPlayerAI\n\
+ bl GetBankByIdentity\n\
ldr r4, _08023310 @ =gActiveBank\n\
strb r0, [r4]\n\
ldr r0, _08023314 @ =gAbsentBankFlags\n\
@@ -11279,20 +10558,20 @@ _08023318: .4byte gBitTable\n\
.syntax divided");
}
-static void atk51_switch_handle_order(void)
+static void atk51_switchhandleorder(void)
{
int i;
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++)
{
if (gBattleBufferB[i][0] == 0x22)
- ewram[i + 0x16068] = gBattleBufferB[i][1];
+ ewram16068arr(i) = gBattleBufferB[i][1];
}
break;
case 1:
@@ -11301,17 +10580,15 @@ static void atk51_switch_handle_order(void)
break;
case 2:
gBattleCommunication[0] = gBattleBufferB[gActiveBank][1];
- ewram[gActiveBank + 0x16068] = gBattleBufferB[gActiveBank][1];
+ ewram16068arr(gActiveBank) = gBattleBufferB[gActiveBank][1];
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
-
- ewram[(gActiveBank) * 3 + (0x1606C + 0)] &= 0xF;
- ewram[(gActiveBank) * 3 + (0x1606C + 0)] |= (gBattleBufferB[gActiveBank][2] & 0xF0);
- ewram[(gActiveBank) * 3 + (0x1606C + 1)] = gBattleBufferB[gActiveBank][3];
-
- ewram[(gActiveBank ^ 2) * 3 + (0x1606C + 0)] &= (0xF0);
- ewram[(gActiveBank ^ 2) * 3 + (0x1606C + 0)] |= (gBattleBufferB[gActiveBank][2] & 0xF0) >> 4;
- ewram[(gActiveBank ^ 2) * 3 + (0x1606C + 2)] = gBattleBufferB[gActiveBank][3];
+ ewram1606Carr(0, gActiveBank) &= 0xF;
+ ewram1606Carr(0, gActiveBank) |= (gBattleBufferB[gActiveBank][2] & 0xF0);
+ ewram1606Carr(1, gActiveBank) = gBattleBufferB[gActiveBank][3];
+ ewram1606Carr(0, (gActiveBank ^ 2)) &= (0xF0);
+ ewram1606Carr(0, (gActiveBank ^ 2)) |= (gBattleBufferB[gActiveBank][2] & 0xF0) >> 4;
+ ewram1606Carr(2, (gActiveBank ^ 2)) = gBattleBufferB[gActiveBank][3];
}
else
sub_8012258(gActiveBank);
@@ -11332,11 +10609,11 @@ static void atk51_switch_handle_order(void)
gBattlescriptCurrInstr += 3;
}
-static void atk52_switch_in_effects(void)
+static void atk52_switchineffects(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;
@@ -11348,20 +10625,20 @@ static void atk52_switch_in_effects(void)
gSideAffecting[GetBankSide(gActiveBank)] |= SIDE_STATUS_SPIKES_DAMAGED;
- spikesDmg = (5 - gSideTimer[GetBankSide(gActiveBank)].spikesAmount) * 2;
+ spikesDmg = (5 - gSideTimers[GetBankSide(gActiveBank)].spikesAmount) * 2;
gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / (spikesDmg);
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
BATTLE_STRUCT->scriptingActive = gActiveBank;
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
- if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 0)
- gBattlescriptCurrInstr = gUnknown_081D919F;
- else if (BSScriptRead8(gBattlescriptCurrInstr + 1) == 1)
- gBattlescriptCurrInstr = gUnknown_081D9171;
+ if (T2_READ_8(gBattlescriptCurrInstr + 1) == 0)
+ gBattlescriptCurrInstr = BattleScript_SpikesOnTarget;
+ else if (T2_READ_8(gBattlescriptCurrInstr + 1) == 1)
+ gBattlescriptCurrInstr = BattleScript_SpikesOnAttacker;
else
- gBattlescriptCurrInstr = gUnknown_081D91CD;
+ gBattlescriptCurrInstr = BattleScript_SpikesOngBank1;
}
else
{
@@ -11376,8 +10653,8 @@ static void atk52_switch_in_effects(void)
for (i = 0; i < gNoOfAllBanks; i++)
{
- if (gTurnOrder[i] == gActiveBank)
- gUnknown_02024A76[i] = 0xC;
+ if (gBanksByTurnOrder[i] == gActiveBank)
+ gActionsByTurnOrder[i] = 0xC;
}
for (i = 0; i < gNoOfAllBanks; i++)
@@ -11385,7 +10662,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++;
@@ -11403,37 +10680,37 @@ static void atk52_switch_in_effects(void)
}
}
-static void atk53_trainer_slide(void)
+static void atk53_trainerslidein(void)
{
- if (!BSScriptRead8(gBattlescriptCurrInstr + 1))
- gActiveBank = GetBankByPlayerAI(0);
+ if (!T2_READ_8(gBattlescriptCurrInstr + 1))
+ gActiveBank = GetBankByIdentity(0);
else
- gActiveBank = GetBankByPlayerAI(1);
+ gActiveBank = GetBankByIdentity(1);
EmitTrainerSlide(0);
MarkBufferBankForExecution(gActiveBank);
gBattlescriptCurrInstr += 2;
}
-static void atk54_effectiveness_sound(void)
+static void atk54_playse(void)
{
gActiveBank = gBankAttacker;
- EmitEffectivenessSound(0, BS2ScriptRead16(gBattlescriptCurrInstr + 1));
+ EmitEffectivenessSound(0, T2_READ_16(gBattlescriptCurrInstr + 1));
MarkBufferBankForExecution(gActiveBank);
gBattlescriptCurrInstr += 3;
}
-static void atk55_play_sound(void)
+static void atk55_fanfare(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)
+static void atk56_playfaintcry(void)
{
- gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1));
+ gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
EmitFaintingCry(0);
MarkBufferBankForExecution(gActiveBank);
gBattlescriptCurrInstr += 2;
@@ -11441,28 +10718,28 @@ static void atk56_fainting_cry(void)
static void atk57(void)
{
- gActiveBank = GetBankByPlayerAI(0);
+ gActiveBank = GetBankByIdentity(0);
Emitcmd55(0, gBattleOutcome);
MarkBufferBankForExecution(gActiveBank);
gBattlescriptCurrInstr += 1;
}
-static void atk58_return_to_ball(void)
+static void atk58_returntoball(void)
{
- gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1));
+ gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
EmitReturnPokeToBall(0, 1);
MarkBufferBankForExecution(gActiveBank);
gBattlescriptCurrInstr += 2;
}
-void atk59_learnmove_inbattle(void)
+void atk59_handlelearnnewmove(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 = sub_803B7C8(&gPlayerParty[BATTLE_STRUCT->expGetterID], BSScriptRead8(gBattlescriptCurrInstr + 9));
+ u16 ret = MonTryLearningNewMove(&gPlayerParty[BATTLE_STRUCT->expGetterID], T2_READ_8(gBattlescriptCurrInstr + 9));
while (ret == 0xFFFE)
- ret = sub_803B7C8(&gPlayerParty[BATTLE_STRUCT->expGetterID], 0);
+ ret = MonTryLearningNewMove(&gPlayerParty[BATTLE_STRUCT->expGetterID], 0);
if (ret == 0)
{
@@ -11474,12 +10751,12 @@ void atk59_learnmove_inbattle(void)
}
else
{
- gActiveBank = GetBankByPlayerAI(0);
+ gActiveBank = GetBankByIdentity(0);
if (gBattlePartyID[gActiveBank] == BATTLE_STRUCT->expGetterID && !(gBattleMons[gActiveBank].status2 & STATUS2_TRANSFORMED))
GiveMoveToBattleMon(&gBattleMons[gActiveBank], ret);
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) //what is else if
{
- gActiveBank = GetBankByPlayerAI(2);
+ gActiveBank = GetBankByIdentity(2);
if (gBattlePartyID[gActiveBank] == BATTLE_STRUCT->expGetterID && !(gBattleMons[gActiveBank].status2 & STATUS2_TRANSFORMED))
GiveMoveToBattleMon(&gBattleMons[gActiveBank], ret);
}
@@ -11490,7 +10767,7 @@ void atk59_learnmove_inbattle(void)
void sub_8023A80(void)
{
sub_802BBD4(0x18, 8, 0x1D, 0xD, 0);
- InitWindow(&gUnknown_03004210, gUnknown_08400D7A, 0x100, 0x19, 0x9);
+ InitWindow(&gUnknown_03004210, BattleText_YesNo, 0x100, 0x19, 0x9);
sub_8002F44(&gUnknown_03004210);
sub_814A5C0(0, 0xFFFF, 0xC, 0x2D9F, 0x20);
}
@@ -11501,7 +10778,7 @@ void sub_8023AD8(void)
DestroyMenuCursor();
}
-static void atk5A(void)
+static void atk5A_yesnoboxlearnmove(void)
{
gActiveBank = 0;
switch (BATTLE_STRUCT->atk5A_StateTracker)
@@ -11549,12 +10826,12 @@ static void atk5A(void)
case 2:
if (!gPaletteFade.active)
{
- sub_809D9F0(gPlayerParty, BATTLE_STRUCT->expGetterID, gPlayerPartyCount - 1, ReshowBattleScreenAfterMenu, word_2024E82);
+ ShowSelectMovePokemonSummaryScreen(gPlayerParty, BATTLE_STRUCT->expGetterID, gPlayerPartyCount - 1, ReshowBattleScreenAfterMenu, gMoveToLearn);
BATTLE_STRUCT->atk5A_StateTracker++;
}
break;
case 3:
- if (!gPaletteFade.active && gMain.callback2 == sub_800F808)
+ if (!gPaletteFade.active && gMain.callback2 == BattleMainCB2)
{
u8 move_pos = sub_809FA30();
if (move_pos == 4)
@@ -11573,7 +10850,7 @@ static void atk5A(void)
{
u8 *ptr;
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
ptr = gBattleTextBuff2;
{
ptr[0] = 0xFD;
@@ -11584,18 +10861,18 @@ static void atk5A(void)
}
ptr[0] = 0xFF;
RemoveMonPPBonus(&gPlayerParty[BATTLE_STRUCT->expGetterID], move_pos);
- SetMonMoveSlot(&gPlayerParty[BATTLE_STRUCT->expGetterID], word_2024E82, move_pos);
+ SetMonMoveSlot(&gPlayerParty[BATTLE_STRUCT->expGetterID], gMoveToLearn, move_pos);
if (gBattlePartyID[0] == BATTLE_STRUCT->expGetterID && !(gBattleMons[0].status2 & STATUS2_TRANSFORMED)
&& !(gDisableStructs[0].unk18_b & gBitTable[move_pos]))
{
RemoveBattleMonPPBonus(&gBattleMons[0], move_pos);
- SetBattleMonMoveSlot(&gBattleMons[0], word_2024E82, move_pos);
+ SetBattleMonMoveSlot(&gBattleMons[0], gMoveToLearn, move_pos);
}
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && gBattlePartyID[2] == BATTLE_STRUCT->expGetterID && !(gBattleMons[2].status2 & STATUS2_TRANSFORMED)
&& !(gDisableStructs[2].unk18_b & gBitTable[move_pos]))
{
RemoveBattleMonPPBonus(&gBattleMons[2], move_pos);
- SetBattleMonMoveSlot(&gBattleMons[2], word_2024E82, move_pos);
+ SetBattleMonMoveSlot(&gBattleMons[2], gMoveToLearn, move_pos);
}
}
}
@@ -11614,7 +10891,7 @@ static void atk5A(void)
}
}
-static void atk5B_80256E0(void)
+static void atk5B_yesnoboxstoplearningmove(void)
{
switch (BATTLE_STRUCT->atk5A_StateTracker)
{
@@ -11643,7 +10920,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 +10928,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 +10936,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)
@@ -11672,7 +10949,7 @@ static void atk5C_hitanimation(void)
gBattlescriptCurrInstr += 2;
}
-#define MONEY_UNKNOWN ((*(u8*)(0x02017000 + 0x94)))
+#define MONEY_UNKNOWN ((*(u8*)(ewram_addr + 0x17000 + 0x94)))
#ifdef NONMATCHING
static void atk5D_getmoneyreward(void)
@@ -11717,7 +10994,7 @@ static void atk5D_getmoneyreward(void)
money_to_give = 1 * gTrainerMoney[i * 4 + 1] * money_to_give;
}
- sub_80B79B8(&gSaveBlock1.money, money_to_give);
+ AddMoney(&gSaveBlock1.money, money_to_give);
gBattleTextBuff1[0] = 0xFD;
gBattleTextBuff1[1] = 1;
gBattleTextBuff1[2] = 4;
@@ -11746,7 +11023,7 @@ static void atk5D_getmoneyreward(void)
lsls r1, 3\n\
cmp r2, r1\n\
bne _08024058\n\
- ldr r0, _0802404C @ =0x02017000\n\
+ ldr r0, _0802404C @ =gSharedMem + 0x17000\n\
adds r1, r0, 0\n\
adds r1, 0x94\n\
ldrb r2, [r1]\n\
@@ -11763,7 +11040,7 @@ static void atk5D_getmoneyreward(void)
b _08024140\n\
.align 2, 0\n\
_08024048: .4byte gTrainerBattleOpponent\n\
-_0802404C: .4byte 0x02017000\n\
+_0802404C: .4byte gSharedMem + 0x17000\n\
_08024050: .4byte 0xfffff056\n\
_08024054: .4byte gSaveBlock1 + 0x490\n\
_08024058:\n\
@@ -11833,7 +11110,7 @@ _080240C4:\n\
ldrb r1, [r3]\n\
mov r12, r0\n\
lsls r4, r5, 2\n\
- ldr r5, _08024124 @ =0x02000000\n\
+ ldr r5, _08024124 @ =gSharedMem\n\
ldr r7, _08024128 @ =gBattleTypeFlags\n\
ldr r0, _0802412C @ =gSaveBlock1 + 0x490\n\
mov r8, r0\n\
@@ -11877,7 +11154,7 @@ _080240FE:\n\
b _08024140\n\
.align 2, 0\n\
_08024120: .4byte gTrainerMoney\n\
-_08024124: .4byte 0x02000000\n\
+_08024124: .4byte gSharedMem\n\
_08024128: .4byte gBattleTypeFlags\n\
_0802412C: .4byte gSaveBlock1 + 0x490\n\
_08024130: .4byte gTrainers\n\
@@ -11889,7 +11166,7 @@ _0802413C:\n\
_08024140:\n\
mov r0, r8\n\
adds r1, r4, 0\n\
- bl sub_80B79B8\n\
+ bl AddMoney\n\
ldr r1, _0802418C @ =gBattleTextBuff1\n\
movs r0, 0xFD\n\
strb r0, [r1]\n\
@@ -11932,7 +11209,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:
@@ -11969,30 +11246,24 @@ static void atk5F_8025B24(void)
gBattlescriptCurrInstr++;
}
-static void atk60_increment_gamestat(void)
+static void atk60_incrementgamestat(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)
+static void atk61_drawpartystatussummary(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 +11282,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,18 +11297,18 @@ 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;
- gBattlescriptCurrInstr = gBattleScriptsEffectsTable[gBattleMoves[gCurrentMove].effect];
+ gChosenMove = gCurrentMove = gRandomMove;
+ gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect];
}
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 +11323,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,18 +11339,18 @@ 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;
}
}
-static void atk67_8025ECC(void)
+static void atk67_yesnobox(void)
{
switch (gBattleCommunication[0])
{
@@ -12121,17 +11392,17 @@ static void atk67_8025ECC(void)
}
}
-static void atk68_80246A0(void)
+static void atk68_cancelallactions(void)
{
int i;
for (i = 0; i < gNoOfAllBanks; i++)
{
- gUnknown_02024A76[i] = 0xC;
+ gActionsByTurnOrder[i] = 0xC;
}
gBattlescriptCurrInstr++;
}
-static void atk69_dmg_adjustment2(void) //literally a copy of atk07 except theres no rand dmg modifier...
+static void atk69_adjustsetdamage(void) //literally a copy of atk07 except theres no rand dmg modifier...
{
u8 hold_effect, quality;
if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY)
@@ -12176,12 +11447,11 @@ static void atk69_dmg_adjustment2(void) //literally a copy of atk07 except there
void atk6A_removeitem(void)
{
- gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1));
- #define USED_HELD_ITEMS(bank) (*(u16 *)&ewram[0x160CC + 2 * (bank)])
+ gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
USED_HELD_ITEMS(gActiveBank) = gBattleMons[gActiveBank].item;
gBattleMons[gActiveBank].item = 0;
- EmitSetAttributes(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBank].item);
+ EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBank].item);
MarkBufferBankForExecution(gActiveBank);
gBattlescriptCurrInstr += 2;
}
@@ -12197,7 +11467,7 @@ static void atk6B_atknameinbuff1(void)
}
#ifdef NONMATCHING
-static void atk6C_lvlbox_display(void)
+static void atk6C_drawlvlupbox(void)
{
u8 r1 = 0;
u8 r7 = 0;
@@ -12205,17 +11475,17 @@ static void atk6C_lvlbox_display(void)
{
case 0:
sub_802BBD4(0xB, 0, 0x1D, 0x7, r1);
- StringCopy(gStringVar4, gUnknown_08400D9F);
+ StringCopy(gStringVar4, BattleText_Format2);
}
}
#else
__attribute__((naked))
-static void atk6C_lvlbox_display(void)
+static void atk6C_drawlvlupbox(void)
{
asm(".syntax unified\n\
- push {r4-r7,lr}\n\
+ push {r4-r7,lr}\n\
mov r7, r10\n\
mov r6, r9\n\
mov r5, r8\n\
@@ -12223,7 +11493,7 @@ static void atk6C_lvlbox_display(void)
sub sp, 0x4\n\
movs r1, 0\n\
movs r7, 0\n\
- ldr r0, _08024928 @ =0x02000000\n\
+ ldr r0, _08024928 @ =gSharedMem\n\
mov r10, r0\n\
ldr r4, _0802492C @ =0x0001609c\n\
add r4, r10\n\
@@ -12238,7 +11508,7 @@ _0802491C:\n\
beq _0802493E\n\
b _08024C38\n\
.align 2, 0\n\
-_08024928: .4byte 0x02000000\n\
+_08024928: .4byte gSharedMem\n\
_0802492C: .4byte 0x0001609c\n\
_08024930:\n\
cmp r0, 0x2\n\
@@ -12258,7 +11528,7 @@ _0802493E:\n\
movs r3, 0x7\n\
bl sub_802BBD4\n\
ldr r0, _0802499C @ =gStringVar4\n\
- ldr r1, _080249A0 @ =gUnknown_08400D9F\n\
+ ldr r1, _080249A0 @ =BattleText_Format2\n\
bl StringCopy\n\
adds r5, r0, 0\n\
movs r1, 0\n\
@@ -12274,7 +11544,7 @@ _0802495A:\n\
adds r0, r5, 0\n\
bl StringAppend\n\
adds r5, r0, 0\n\
- ldr r0, _080249A8 @ =0x02000000\n\
+ ldr r0, _080249A8 @ =gSharedMem\n\
ldr r2, _080249AC @ =0x00016018\n\
adds r0, r2\n\
ldrb r1, [r0]\n\
@@ -12297,9 +11567,9 @@ _0802495A:\n\
mov pc, r0\n\
.align 2, 0\n\
_0802499C: .4byte gStringVar4\n\
-_080249A0: .4byte gUnknown_08400D9F\n\
+_080249A0: .4byte BattleText_Format2\n\
_080249A4: .4byte gUnknown_0840165C\n\
-_080249A8: .4byte 0x02000000\n\
+_080249A8: .4byte gSharedMem\n\
_080249AC: .4byte 0x00016018\n\
_080249B0: .4byte gPlayerParty\n\
_080249B4: .4byte gLevelUpStatBoxStats\n\
@@ -12313,37 +11583,37 @@ _080249BC:\n\
.4byte _08024A04\n\
.4byte _08024A10\n\
_080249D4:\n\
- ldr r0, _080249DC @ =0x02017180\n\
+ ldr r0, _080249DC @ =gSharedMem + 0x17180\n\
ldrh r0, [r0]\n\
b _08024A14\n\
.align 2, 0\n\
-_080249DC: .4byte 0x02017180\n\
+_080249DC: .4byte gSharedMem + 0x17180\n\
_080249E0:\n\
- ldr r0, _080249E8 @ =0x02017180\n\
+ ldr r0, _080249E8 @ =gSharedMem + 0x17180\n\
ldrh r0, [r0, 0x8]\n\
b _08024A14\n\
.align 2, 0\n\
-_080249E8: .4byte 0x02017180\n\
+_080249E8: .4byte gSharedMem + 0x17180\n\
_080249EC:\n\
- ldr r0, _080249F4 @ =0x02017180\n\
+ ldr r0, _080249F4 @ =gSharedMem + 0x17180\n\
ldrh r0, [r0, 0x2]\n\
b _08024A14\n\
.align 2, 0\n\
-_080249F4: .4byte 0x02017180\n\
+_080249F4: .4byte gSharedMem + 0x17180\n\
_080249F8:\n\
- ldr r0, _08024A00 @ =0x02017180\n\
+ ldr r0, _08024A00 @ =gSharedMem + 0x17180\n\
ldrh r0, [r0, 0xA]\n\
b _08024A14\n\
.align 2, 0\n\
-_08024A00: .4byte 0x02017180\n\
+_08024A00: .4byte gSharedMem + 0x17180\n\
_08024A04:\n\
- ldr r0, _08024A0C @ =0x02017180\n\
+ ldr r0, _08024A0C @ =gSharedMem + 0x17180\n\
ldrh r0, [r0, 0x4]\n\
b _08024A14\n\
.align 2, 0\n\
-_08024A0C: .4byte 0x02017180\n\
+_08024A0C: .4byte gSharedMem + 0x17180\n\
_08024A10:\n\
- ldr r0, _08024A54 @ =0x02017180\n\
+ ldr r0, _08024A54 @ =gSharedMem + 0x17180\n\
ldrh r0, [r0, 0x6]\n\
_08024A14:\n\
subs r0, r1, r0\n\
@@ -12377,13 +11647,13 @@ _08024A2C:\n\
mov r0, r9\n\
cmp r0, 0\n\
beq _08024A5C\n\
- ldr r1, _08024A58 @ =gUnknown_08400DAC\n\
+ ldr r1, _08024A58 @ =BattleText_Dash\n\
b _08024A5E\n\
.align 2, 0\n\
-_08024A54: .4byte 0x02017180\n\
-_08024A58: .4byte gUnknown_08400DAC\n\
+_08024A54: .4byte gSharedMem + 0x17180\n\
+_08024A58: .4byte BattleText_Dash\n\
_08024A5C:\n\
- ldr r1, _08024AA4 @ =gUnknown_08400DAA\n\
+ ldr r1, _08024AA4 @ =BattleText_Plus\n\
_08024A5E:\n\
adds r0, r5, 0\n\
bl StringCopy\n\
@@ -12419,7 +11689,7 @@ _08024A5E:\n\
adds r5, 0x1\n\
b _08024AB8\n\
.align 2, 0\n\
-_08024AA4: .4byte gUnknown_08400DAA\n\
+_08024AA4: .4byte BattleText_Plus\n\
_08024AA8:\n\
strb r6, [r5]\n\
movs r0, 0x11\n\
@@ -12447,14 +11717,14 @@ _08024AC4:\n\
bl InitWindow\n\
adds r0, r4, 0\n\
bl sub_8002F44\n\
- ldr r1, _08024AEC @ =0x02000000\n\
+ ldr r1, _08024AEC @ =gSharedMem\n\
ldr r2, _08024AF0 @ =0x0001609c\n\
adds r1, r2\n\
b _08024BEA\n\
.align 2, 0\n\
_08024AE4: .4byte gUnknown_03004210\n\
_08024AE8: .4byte gStringVar4\n\
-_08024AEC: .4byte 0x02000000\n\
+_08024AEC: .4byte gSharedMem\n\
_08024AF0: .4byte 0x0001609c\n\
_08024AF4:\n\
ldr r0, _08024B94 @ =gMain\n\
@@ -12466,7 +11736,7 @@ _08024AFE:\n\
movs r0, 0x5\n\
bl PlaySE\n\
ldr r0, _08024B98 @ =gStringVar4\n\
- ldr r1, _08024B9C @ =gUnknown_08400D9F\n\
+ ldr r1, _08024B9C @ =BattleText_Format2\n\
bl StringCopy\n\
adds r5, r0, 0\n\
movs r0, 0\n\
@@ -12537,7 +11807,7 @@ _08024B1C:\n\
.align 2, 0\n\
_08024B94: .4byte gMain\n\
_08024B98: .4byte gStringVar4\n\
-_08024B9C: .4byte gUnknown_08400D9F\n\
+_08024B9C: .4byte BattleText_Format2\n\
_08024BA0: .4byte 0x00016018\n\
_08024BA4: .4byte gUnknown_0840165C\n\
_08024BA8: .4byte gPlayerParty\n\
@@ -12568,7 +11838,7 @@ _08024BC0:\n\
bl InitWindow\n\
adds r0, r4, 0\n\
bl sub_8002F44\n\
- ldr r1, _08024BFC @ =0x02000000\n\
+ ldr r1, _08024BFC @ =gSharedMem\n\
ldr r0, _08024C00 @ =0x0001609c\n\
adds r1, r0\n\
_08024BEA:\n\
@@ -12579,7 +11849,7 @@ _08024BEA:\n\
.align 2, 0\n\
_08024BF4: .4byte gUnknown_03004210\n\
_08024BF8: .4byte gStringVar4\n\
-_08024BFC: .4byte 0x02000000\n\
+_08024BFC: .4byte gSharedMem\n\
_08024C00: .4byte 0x0001609c\n\
_08024C04:\n\
ldr r0, _08024C2C @ =gMain\n\
@@ -12622,29 +11892,29 @@ _08024C48: .4byte gBattlescriptCurrInstr\n\
#endif
-static void atk6D_set_sentpokes_values(void)
+static void atk6D_resetsentmonsvalue(void)
{
- sub_80156DC();
+ ResetSentPokesToOpponentValue();
gBattlescriptCurrInstr++;
}
-static void atk6E_set_atk_to_player0(void)
+static void atk6E_setatktoplayer0(void)
{
- gBankAttacker = GetBankByPlayerAI(0);
+ gBankAttacker = GetBankByIdentity(0);
gBattlescriptCurrInstr++;
}
-static void atk6F_set_visible(void)
+static void atk6F_makevisible(void)
{
- gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1));
+ gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
EmitSpriteInvisibility(0, 0);
MarkBufferBankForExecution(gActiveBank);
gBattlescriptCurrInstr += 2;
}
-static void atk70_record_ability(void)
+static void atk70_recordlastability(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...
}
@@ -12653,32 +11923,32 @@ void sub_8024CEC(void)
{
gBattleTextBuff2[0] = 0xFD;
gBattleTextBuff2[1] = 2;
- gBattleTextBuff2[2] = (word_2024E82);
- gBattleTextBuff2[3] = uBYTE1_16(word_2024E82);
+ gBattleTextBuff2[2] = (gMoveToLearn);
+ gBattleTextBuff2[3] = uBYTE1_16(gMoveToLearn);
gBattleTextBuff2[4] = 0xFF;
}
-static void atk71_buffer_move_to_learn(void)
+static void atk71_buffermovetolearn(void)
{
sub_8024CEC();
gBattlescriptCurrInstr++;
}
-static void atk72_jump_if_can_run_frombattle(void)
+static void atk72_jumpifplayerran(void)
{
- if (sub_8014AB8(gBank1))
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ if (TryRunFromBattle(gBank1))
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
else
gBattlescriptCurrInstr += 5;
}
-static void atk73_hp_thresholds(void)
+static void atk73_hpthresholds(void)
{
u8 opposing_bank;
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;
@@ -12698,16 +11968,16 @@ static void atk73_hp_thresholds(void)
gBattlescriptCurrInstr += 2;
}
-static void atk74_hp_thresholds2(void)
+static void atk74_hpthresholds2(void)
{
u8 opposing_bank;
u8 hp_switchout;
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)];
+ hp_switchout = ewram160BCarr(GetBankSide(opposing_bank)); //BATTLE_STRUCT->HP_OnSwitchout[GetBankSide(opposing_bank)];
result = (hp_switchout - gBattleMons[opposing_bank].hp) * 100 / hp_switchout;
if (gBattleMons[opposing_bank].hp >= hp_switchout)
@@ -12723,7 +11993,7 @@ static void atk74_hp_thresholds2(void)
gBattlescriptCurrInstr += 2;
}
-static void atk75_8026A58(void)
+static void atk75_useitemonopponent(void)
{
gBankInMenu = gBankAttacker;
sub_803E1B0(&gEnemyParty[gBattlePartyID[gBankAttacker]], gLastUsedItem, gBattlePartyID[gBankAttacker], 0, 1);
@@ -12732,8 +12002,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);
@@ -12743,8 +12013,8 @@ static void atk76_various(void)
u8 side;
gBankAttacker = gBankTarget;
side = GetBankSide(gBankAttacker) ^ 1;
- if (gSideTimer[side].followmeTimer && gBattleMons[gSideTimer[side].followmeTarget].hp)
- gBankTarget = gSideTimer[side].followmeTarget;
+ if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp)
+ gBankTarget = gSideTimers[side].followmeTarget;
else
gBankTarget = gActiveBank;
}
@@ -12781,7 +12051,7 @@ static void atk76_various(void)
else
gActiveBank = 2;
- choiced_move = (u16*)(&ewram[gActiveBank * 2 + 0x160e8]);
+ choiced_move = CHOICED_MOVE(gActiveBank);
for (i = 0; i < 4; i++)
{
if (gBattleMons[gActiveBank].moves[i] == *choiced_move)
@@ -12796,14 +12066,14 @@ static void atk76_various(void)
gBattlescriptCurrInstr += 3;
}
-static void atk77_setprotect(void) //protect and endure
+static void atk77_setprotectlike(void) //protect and endure
{
bool8 not_last_turn = 1;
u16 last_move = gUnknown_02024C4C[gBankAttacker];
if (last_move != MOVE_PROTECT && last_move != MOVE_DETECT && last_move != MOVE_ENDURE)
gDisableStructs[gBankAttacker].protectUses = 0;
- if (gCurrentMoveTurn == (gNoOfAllBanks - 1))
+ if (gCurrentTurnActionNumber == (gNoOfAllBanks - 1))
not_last_turn = 0;
if (sProtectSuccessRates[gDisableStructs[gBankAttacker].protectUses] > Random() && not_last_turn)
@@ -12861,7 +12131,7 @@ static void atk78_faintifabilitynotdamp(void)
{
gLastUsedAbility = ABILITY_DAMP;
RecordAbilityBattle(gBankTarget, gBattleMons[gBankTarget].ability);
- gBattlescriptCurrInstr = gUnknown_081D9834;
+ gBattlescriptCurrInstr = BattleScript_DampStopsExplosion;
}
}
@@ -12872,15 +12142,15 @@ static void atk79_setatkhptozero(void)
gActiveBank = gBankAttacker;
gBattleMons[gActiveBank].hp = 0;
- EmitSetAttributes(0, REQUEST_HP_BATTLE, 0, 2, &gBattleMons[gActiveBank].hp);
+ EmitSetMonData(0, REQUEST_HP_BATTLE, 0, 2, &gBattleMons[gActiveBank].hp);
MarkBufferBankForExecution(gActiveBank);
gBattlescriptCurrInstr++;
}
-static void atk7A_jumpwhiletargetvalid(void) //used by intimidate to loop through all targets
+static void atk7A_jumpifnexttargetvalid(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)
{
@@ -12901,11 +12171,11 @@ static void atk7A_jumpwhiletargetvalid(void) //used by intimidate to loop throug
gBattlescriptCurrInstr += 5;
}
-static void atk7B_healhalfHP_if_possible(void)
+static void atk7B_tryhealhalfhealth(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;
@@ -12919,18 +12189,18 @@ static void atk7B_healhalfHP_if_possible(void)
gBattlescriptCurrInstr += 6;
}
-static void atk7C_8025508(void)
+static void atk7C_trymirrormove(void)
{
- u16 r7 = ewram[gBankAttacker * 2 + 0x160ac] | (ewram[gBankAttacker * 2 + 0x160ad] << 8);
- u16 r6 = ewram[gBankAttacker * 4 + 0x16100] | (ewram[gBankAttacker * 4 + 0x16101] << 8);
- u16 r5 = ewram[gBankAttacker * 4 + 0x16102] | (ewram[gBankAttacker * 4 + 0x16103] << 8);
+ u16 r7 = ewram160ACarr2(0, gBankAttacker) | (ewram160ACarr2(1, gBankAttacker) << 8);
+ u16 r6 = ewram16100arr2(0, gBankAttacker) | (ewram16100arr2(1, gBankAttacker) << 8);
+ u16 r5 = ewram16100arr2(2, gBankAttacker) | (ewram16100arr2(3, gBankAttacker) << 8);
- if (r7 !=0 && r7 != 0xFFFF)
+ if (r7 != 0 && r7 != 0xFFFF)
{
gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED);
gCurrentMove = r7;
gBankTarget = GetMoveTarget(gCurrentMove, 0);
- gBattlescriptCurrInstr = gBattleScriptsEffectsTable[gBattleMoves[gCurrentMove].effect];
+ gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect];
}
else if (r6 != 0 && r5 != 0 && r6 != 0xFFFF && r5 != 0xFFFF)
{
@@ -12940,21 +12210,21 @@ static void atk7C_8025508(void)
else
gCurrentMove = r5;
gBankTarget = GetMoveTarget(gCurrentMove, 0);
- gBattlescriptCurrInstr = gBattleScriptsEffectsTable[gBattleMoves[gCurrentMove].effect];
+ gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect];
}
else if (r6 != 0 && r6 != 0xFFFF)
{
gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED);
gCurrentMove = r6;
gBankTarget = GetMoveTarget(gCurrentMove, 0);
- gBattlescriptCurrInstr = gBattleScriptsEffectsTable[gBattleMoves[gCurrentMove].effect];
+ gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect];
}
else if (r5 != 0 && r5 != 0xFFFF)
{
gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED);
gCurrentMove = r5;
gBankTarget = GetMoveTarget(gCurrentMove, 0);
- gBattlescriptCurrInstr = gBattleScriptsEffectsTable[gBattleMoves[gCurrentMove].effect];
+ gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect];
}
else
{
@@ -12963,7 +12233,7 @@ static void atk7C_8025508(void)
}
}
-static void atk7D_set_rain(void)
+static void atk7D_setrain(void)
{
if (gBattleWeather & WEATHER_RAIN_ANY)
{
@@ -12989,7 +12259,7 @@ static void atk7E_setreflect(void)
else
{
gSideAffecting[GetBankIdentity(gBankAttacker) & 1] |= SIDE_STATUS_REFLECT;
- gSideTimer[GetBankIdentity(gBankAttacker) & 1].reflectTimer = 5;
+ gSideTimers[GetBankIdentity(gBankAttacker) & 1].reflectTimer = 5;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMons(1) == 2)
gBattleCommunication[MULTISTRING_CHOOSER] = 2;
else
@@ -13022,7 +12292,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;
@@ -13042,9 +12312,9 @@ static void atk80_manipulatedamage(void)
gBattlescriptCurrInstr += 2;
}
-static void atk81_setrest(void)
+static void atk81_trysetrest(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)
@@ -13057,7 +12327,7 @@ static void atk81_setrest(void)
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
gBattleMons[gBankTarget].status1 = 3;
- EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1);
+ EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1);
MarkBufferBankForExecution(gActiveBank);
gBattlescriptCurrInstr += 5;
}
@@ -13065,7 +12335,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;
@@ -13100,9 +12370,9 @@ bool8 UproarWakeUpCheck(u8 bank)
return 1;
}
-static void atk84_jump_if_cant_sleep(void)
+static void atk84_jumpifcantmakeasleep(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 +12411,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 +12436,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;
@@ -13225,7 +12495,7 @@ u8 ChangeStatBuffs(s8 statchanger, u8 stat, u8 flags, u8* bs_ptr)
if ((statchanger << 0x18) < 0) //stat decrease
{
- if (gSideTimer[GetBankIdentity(gActiveBank) & 1].mistTimer && !r9 && gCurrentMove != MOVE_CURSE)
+ if (gSideTimers[GetBankIdentity(gActiveBank) & 1].mistTimer && !r9 && gCurrentMove != MOVE_CURSE)
{
if (flags == 1)
{
@@ -13233,7 +12503,7 @@ u8 ChangeStatBuffs(s8 statchanger, u8 stat, u8 flags, u8* bs_ptr)
gBattlescriptCurrInstr = bs_ptr;
else
{
- b_movescr_stack_push(bs_ptr);
+ BattleScriptPush(bs_ptr);
BATTLE_STRUCT->scriptingActive = gActiveBank;
gBattlescriptCurrInstr = BattleScript_MistProtected;
gSpecialStatuses[gActiveBank].statloweringflag = 1;
@@ -13254,7 +12524,7 @@ u8 ChangeStatBuffs(s8 statchanger, u8 stat, u8 flags, u8* bs_ptr)
gBattlescriptCurrInstr = bs_ptr;
else
{
- b_movescr_stack_push(bs_ptr);
+ BattleScriptPush(bs_ptr);
BATTLE_STRUCT->scriptingActive = gActiveBank;
gBattlescriptCurrInstr = BattleScript_AbilityNoStatLoss;
gLastUsedAbility = gBattleMons[gActiveBank].ability;
@@ -13268,7 +12538,7 @@ u8 ChangeStatBuffs(s8 statchanger, u8 stat, u8 flags, u8* bs_ptr)
{
if (flags == 1)
{
- b_movescr_stack_push(bs_ptr);
+ BattleScriptPush(bs_ptr);
BATTLE_STRUCT->scriptingActive = gActiveBank;
gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss;
gLastUsedAbility = gBattleMons[gActiveBank].ability;
@@ -13280,7 +12550,7 @@ u8 ChangeStatBuffs(s8 statchanger, u8 stat, u8 flags, u8* bs_ptr)
{
if (flags == 1)
{
- b_movescr_stack_push(bs_ptr);
+ BattleScriptPush(bs_ptr);
BATTLE_STRUCT->scriptingActive = gActiveBank;
gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss;
gLastUsedAbility = gBattleMons[gActiveBank].ability;
@@ -13451,7 +12721,7 @@ _08025E88:\n\
blt _08025EAC\n\
b _080261B0\n\
_08025EAC:\n\
- ldr r4, _08025F04 @ =gSideTimer\n\
+ ldr r4, _08025F04 @ =gSideTimers\n\
ldr r1, _08025EF8 @ =gActiveBank\n\
ldrb r0, [r1]\n\
bl GetBankIdentity\n\
@@ -13492,14 +12762,14 @@ _08025EAC:\n\
_08025EF8: .4byte gActiveBank\n\
_08025EFC: .4byte gBankTarget\n\
_08025F00: .4byte gBattleTextBuff1\n\
-_08025F04: .4byte gSideTimer\n\
+_08025F04: .4byte gSideTimers\n\
_08025F08: .4byte gCurrentMove\n\
_08025F0C: .4byte gSpecialStatuses\n\
_08025F10: .4byte gBattlescriptCurrInstr\n\
_08025F14:\n\
mov r0, r8\n\
- bl b_movescr_stack_push\n\
- ldr r0, _08025F40 @ =0x02000000\n\
+ bl BattleScriptPush\n\
+ ldr r0, _08025F40 @ =gSharedMem\n\
ldr r6, _08025F44 @ =gActiveBank\n\
ldrb r1, [r6]\n\
ldr r2, _08025F48 @ =0x00016003\n\
@@ -13519,7 +12789,7 @@ _08025F14:\n\
strb r1, [r0]\n\
b _08025F74\n\
.align 2, 0\n\
-_08025F40: .4byte 0x02000000\n\
+_08025F40: .4byte gSharedMem\n\
_08025F44: .4byte gActiveBank\n\
_08025F48: .4byte 0x00016003\n\
_08025F4C: .4byte gBattlescriptCurrInstr\n\
@@ -13593,8 +12863,8 @@ _08025FD8: .4byte gSpecialStatuses\n\
_08025FDC: .4byte gBattlescriptCurrInstr\n\
_08025FE0:\n\
mov r0, r8\n\
- bl b_movescr_stack_push\n\
- ldr r0, _08026028 @ =0x02000000\n\
+ bl BattleScriptPush\n\
+ ldr r0, _08026028 @ =gSharedMem\n\
ldr r2, _0802602C @ =gActiveBank\n\
ldrb r1, [r2]\n\
ldr r3, _08026030 @ =0x00016003\n\
@@ -13626,7 +12896,7 @@ _08025FE0:\n\
strb r1, [r0]\n\
b _08025F74\n\
.align 2, 0\n\
-_08026028: .4byte 0x02000000\n\
+_08026028: .4byte gSharedMem\n\
_0802602C: .4byte gActiveBank\n\
_08026030: .4byte 0x00016003\n\
_08026034: .4byte gBattlescriptCurrInstr\n\
@@ -13650,8 +12920,8 @@ _08026040:\n\
cmp r5, 0x1\n\
bne _08025F74\n\
mov r0, r8\n\
- bl b_movescr_stack_push\n\
- ldr r0, _08026094 @ =0x02000000\n\
+ bl BattleScriptPush\n\
+ ldr r0, _08026094 @ =gSharedMem\n\
ldr r3, _08026090 @ =gActiveBank\n\
ldrb r1, [r3]\n\
ldr r6, _08026098 @ =0x00016003\n\
@@ -13673,7 +12943,7 @@ _08026040:\n\
b _08025F74\n\
.align 2, 0\n\
_08026090: .4byte gActiveBank\n\
-_08026094: .4byte 0x02000000\n\
+_08026094: .4byte gSharedMem\n\
_08026098: .4byte 0x00016003\n\
_0802609C: .4byte gBattlescriptCurrInstr\n\
_080260A0: .4byte BattleScript_AbilityNoSpecificStatLoss\n\
@@ -13698,8 +12968,8 @@ _080260A8:\n\
b _08025F74\n\
_080260CA:\n\
mov r0, r8\n\
- bl b_movescr_stack_push\n\
- ldr r0, _08026100 @ =0x02000000\n\
+ bl BattleScriptPush\n\
+ ldr r0, _08026100 @ =gSharedMem\n\
ldr r3, _080260FC @ =gActiveBank\n\
ldrb r1, [r3]\n\
ldr r6, _08026104 @ =0x00016003\n\
@@ -13721,7 +12991,7 @@ _080260CA:\n\
b _08025F74\n\
.align 2, 0\n\
_080260FC: .4byte gActiveBank\n\
-_08026100: .4byte 0x02000000\n\
+_08026100: .4byte gSharedMem\n\
_08026104: .4byte 0x00016003\n\
_08026108: .4byte gBattlescriptCurrInstr\n\
_0802610C: .4byte BattleScript_AbilityNoSpecificStatLoss\n\
@@ -13953,8 +13223,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;
}
@@ -13974,7 +13244,7 @@ static void atk8A_normalisebuffs(void) //haze
static void atk8B_setbide(void)
{
gBattleMons[gBankAttacker].status2 |= STATUS2_MULTIPLETURNS;
- gLockedMove[gBankAttacker] = gCurrentMove;
+ gLockedMoves[gBankAttacker] = gCurrentMove;
gTakenDmg[gBankAttacker] = 0;
gBattleMons[gBankAttacker].status2 |= (STATUS2_BIDE - 0x100); //2 turns
gBattlescriptCurrInstr++;
@@ -13987,10 +13257,10 @@ static void atk8C_confuseifrepeatingattackends(void)
gBattlescriptCurrInstr++;
}
-static void atk8D_setmultihit_counter(void)
+static void atk8D_setmultihitcounter(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;
@@ -14002,14 +13272,14 @@ static void atk8D_setmultihit_counter(void)
gBattlescriptCurrInstr += 2;
}
-static void atk8E_prepare_multihit(void)
+static void atk8E_initmultihitstring(void)
{
- ewram[0x160e0] = 0xFD;
- ewram[0x160e1] = 1;
- ewram[0x160e2] = 1;
- ewram[0x160e3] = 1;
- ewram[0x160e4] = 0;
- ewram[0x160e5] = 0xFF;
+ ewram160E0(0) = 0xFD;
+ ewram160E0(1) = 1;
+ ewram160E0(2) = 1;
+ ewram160E0(3) = 1;
+ ewram160E0(4) = 0;
+ ewram160E0(5) = 0xFF;
gBattlescriptCurrInstr++;
}
@@ -14017,19 +13287,19 @@ static bool8 sub_80264C0(void)
{
if (gBattleMons[gBankAttacker].level >= gBattleMons[gBankTarget].level)
{
- ewram[gBankTarget + 0x16064] = gBattlePartyID[gBankTarget];
+ ewram16064arr(gBankTarget) = gBattlePartyID[gBankTarget];
}
else
{
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];
+ ewram16064arr(gBankTarget) = gBattlePartyID[gBankTarget];
}
- gBattlescriptCurrInstr = gUnknown_081D90FC;
+ gBattlescriptCurrInstr = BattleScript_SuccessForceOut;
return 1;
}
@@ -14075,7 +13345,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())
{
@@ -14108,7 +13378,7 @@ static void atk8F_forcerandomswitch(void)
} while (i == gBattlePartyID[gBankTarget] || !MON_CAN_BATTLE(&party[i]));
}
}
- ewram[gBankTarget + 0x16068] = i;
+ ewram16068arr(gBankTarget) = i;
if (!IsLinkDoubleBattle())
sub_8012258(gBankTarget);
sub_8094B6C(gBankTarget, i, 0);
@@ -14122,7 +13392,7 @@ static void atk8F_forcerandomswitch(void)
}
}
-static void atk90_conversion_type_change(void)
+static void atk90_tryconversiontypechange(void)
{
//randomly changes user's type to one of its moves' type
u8 valid_moves = 0;
@@ -14151,7 +13421,7 @@ static void atk90_conversion_type_change(void)
if (checked_move == valid_moves)
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
else
{
@@ -14186,7 +13456,7 @@ static void atk91_givepaydaymoney(void)
{
if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) && gPaydayMoney)
{
- sub_80B79B8(&gSaveBlock1.money, gPaydayMoney * BATTLE_STRUCT->moneyMultiplier);
+ AddMoney(&gSaveBlock1.money, gPaydayMoney * BATTLE_STRUCT->moneyMultiplier);
gBattleTextBuff1[0] = 0xFD;
gBattleTextBuff1[1] = 1;
gBattleTextBuff1[2] = 2;
@@ -14194,8 +13464,8 @@ static void atk91_givepaydaymoney(void)
gBattleTextBuff1[4] = gPaydayMoney;
gBattleTextBuff1[5] = uBYTE1_16(gPaydayMoney);
gBattleTextBuff1[6] = 0xFF;
- b_movescr_stack_push(gBattlescriptCurrInstr + 1);
- gBattlescriptCurrInstr = gUnknown_081D95DB;
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = BattleScript_PrintPayDayMoneyString;
}
else
gBattlescriptCurrInstr++;
@@ -14211,7 +13481,7 @@ static void atk92_setlightscreen(void)
else
{
gSideAffecting[GetBankIdentity(gBankAttacker) & 1] |= SIDE_STATUS_LIGHTSCREEN;
- gSideTimer[GetBankIdentity(gBankAttacker) & 1].lightscreenTimer = 5;
+ gSideTimers[GetBankIdentity(gBankAttacker) & 1].lightscreenTimer = 5;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMons(1) == 2)
gBattleCommunication[MULTISTRING_CHOOSER] = 4;
else
@@ -14221,7 +13491,7 @@ static void atk92_setlightscreen(void)
}
#ifdef NOTMATCHING
-static void atk93_ko_move(void)
+static void atk93_tryKO(void)
{
if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY)
hold_effect = gEnigmaBerries[gBankTarget].holdEffect, quality = gEnigmaBerries[gBankTarget].holdEffectParam;
@@ -14270,12 +13540,12 @@ MOVESTATUS_MISSED_LABEL:
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
else
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
#else
__attribute((naked))
-static void atk93_ko_move(void)
+static void atk93_tryKO(void)
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
@@ -14370,7 +13640,7 @@ _08026C0C:\n\
ldr r0, _08026C60 @ =gLastUsedAbility\n\
strb r3, [r0]\n\
ldr r1, _08026C64 @ =gBattlescriptCurrInstr\n\
- ldr r0, _08026C68 @ =gUnknown_081D9826\n\
+ ldr r0, _08026C68 @ =BattleScript_SturdyPreventsOHKO\n\
str r0, [r1]\n\
ldr r1, _08026C50 @ =gBankTarget\n\
ldrb r0, [r1]\n\
@@ -14385,7 +13655,7 @@ _08026C58: .4byte gBattleMons\n\
_08026C5C: .4byte gBattleMoveFlags\n\
_08026C60: .4byte gLastUsedAbility\n\
_08026C64: .4byte gBattlescriptCurrInstr\n\
-_08026C68: .4byte gUnknown_081D9826\n\
+_08026C68: .4byte BattleScript_SturdyPreventsOHKO\n\
_08026C6C:\n\
ldr r1, _08026CE0 @ =gStatuses3\n\
lsls r0, r2, 2\n\
@@ -14626,7 +13896,7 @@ _08026E54: .4byte gBattlescriptCurrInstr\n\
}
#endif // NOTMATCHING
-static void atk94_gethalfcurrentenemyhp(void) //super fang
+static void atk94_damagetohalftargethp(void) //super fang
{
gBattleMoveDamage = gBattleMons[gBankTarget].hp / 2;
if (gBattleMoveDamage == 0)
@@ -14692,7 +13962,7 @@ static void atk96_weatherdamage(void)
gBattlescriptCurrInstr++;
}
-static void atk97_try_infatuation(void)
+static void atk97_tryinfatuating(void)
{
struct Pokemon *attacker, *target;
u16 atk_species, def_species;
@@ -14725,7 +13995,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
{
@@ -14735,14 +14005,14 @@ static void atk97_try_infatuation(void)
}
}
-static void atk98_status_icon_update(void)
+static void atk98_updatestatusicon(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;
@@ -14757,7 +14027,7 @@ static void atk98_status_icon_update(void)
}
if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
{
- gActiveBank = GetBankByPlayerAI(GetBankIdentity(gBankAttacker) ^ 2);
+ gActiveBank = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ 2);
if (!(gAbsentBankFlags & gBitTable[gActiveBank]))
{
EmitStatusIconUpdate(0, gBattleMons[gActiveBank].status1, gBattleMons[gActiveBank].status2);
@@ -14770,21 +14040,21 @@ static void atk98_status_icon_update(void)
static void atk99_setmist(void)
{
- if (gSideTimer[GetBankIdentity(gBankAttacker) & 1].mistTimer)
+ if (gSideTimers[GetBankIdentity(gBankAttacker) & 1].mistTimer)
{
gBattleMoveFlags |= MOVESTATUS_FAILED;
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
}
else
{
- gSideTimer[GetBankIdentity(gBankAttacker) & 1].mistTimer = 5;
+ gSideTimers[GetBankIdentity(gBankAttacker) & 1].mistTimer = 5;
gSideAffecting[GetBankIdentity(gBankAttacker) & 1] |= SIDE_STATUS_MIST;
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
}
gBattlescriptCurrInstr++;
}
-static void atk9A_set_focusenergy(void)
+static void atk9A_setfocusenergy(void)
{
if (gBattleMons[gBankAttacker].status2 & STATUS2_FOCUS_ENERGY)
{
@@ -14801,7 +14071,7 @@ static void atk9A_set_focusenergy(void)
static void atk9B_transformdataexecution(void)
{
- gUnknown_02024BE8 = 0xFFFF;
+ gChosenMove = 0xFFFF;
gBattlescriptCurrInstr++;
if (gBattleMons[gBankTarget].status2 & STATUS2_TRANSFORMED || gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE)
{
@@ -14815,7 +14085,7 @@ static void atk9B_transformdataexecution(void)
gBattleMons[gBankAttacker].status2 |= STATUS2_TRANSFORMED;
gDisableStructs[gBankAttacker].disabledMove = 0;
gDisableStructs[gBankAttacker].disableTimer1 = 0;
- gDisableStructs[gBankAttacker].unk0 = gBattleMons[gBankTarget].personality;
+ gDisableStructs[gBankAttacker].transformedMonPersonality = gBattleMons[gBankTarget].personality;
gDisableStructs[gBankAttacker].unk18_b = 0;
gBattleTextBuff1[0] = 0xFD;
@@ -14845,7 +14115,7 @@ static void atk9B_transformdataexecution(void)
}
}
-static void atk9C_set_substitute(void)
+static void atk9C_setsubstitute(void)
{
u32 hp = gBattleMons[gBankAttacker].maxHP / 4;
if (gBattleMons[gBankAttacker].maxHP / 4 == 0)
@@ -14876,13 +14146,13 @@ static bool8 IsMoveUncopyable(u16 move)
return (sUnknown_081FACFE[i] != 0xFFFE);
}
-static void atk9D_copyattack(void)
+static void atk9D_mimicattackcopy(void)
{
- gUnknown_02024BE8 = 0xFFFF;
+ gChosenMove = 0xFFFF;
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 +14180,7 @@ static void atk9D_copyattack(void)
gBattlescriptCurrInstr += 5;
}
else
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
@@ -14926,7 +14196,7 @@ static void atk9E_metronome(void)
} while (sUnknown_081FACFE[i] != 0xFFFF);
gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED);
- gBattlescriptCurrInstr = gBattleScriptsEffectsTable[gBattleMoves[gCurrentMove].effect];
+ gBattlescriptCurrInstr = gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect];
gBankTarget = GetMoveTarget(gCurrentMove, 0);
}
@@ -14978,7 +14248,7 @@ _080278F8:\n\
ldr r1, _08027950 @ =0xfffffbff\n\
ands r0, r1\n\
str r0, [r2]\n\
- ldr r3, _08027954 @ =gBattleScriptsEffectsTable\n\
+ ldr r3, _08027954 @ =gBattleScriptsForMoveEffects\n\
ldr r2, _08027958 @ =gBattleMoves\n\
ldrh r1, [r4]\n\
lsls r0, r1, 1\n\
@@ -15009,7 +14279,7 @@ _08027944: .4byte 0x000001ff\n\
_08027948: .4byte 0x0000ffff\n\
_0802794C: .4byte gHitMarker\n\
_08027950: .4byte 0xfffffbff\n\
-_08027954: .4byte gBattleScriptsEffectsTable\n\
+_08027954: .4byte gBattleScriptsForMoveEffects\n\
_08027958: .4byte gBattleMoves\n\
_0802795C: .4byte gBankTarget\n\
.syntax divided");
@@ -15038,8 +14308,8 @@ static void atkA1_counterdamagecalculator(void)
if (gProtectStructs[gBankAttacker].physicalDmg && atk_side != def_side && gBattleMons[gProtectStructs[gBankAttacker].physicalBank].hp)
{
gBattleMoveDamage = gProtectStructs[gBankAttacker].physicalDmg * 2;
- if (gSideTimer[def_side].followmeTimer && gBattleMons[gSideTimer[def_side].followmeTarget].hp)
- gBankTarget = gSideTimer[def_side].followmeTarget;
+ if (gSideTimers[def_side].followmeTimer && gBattleMons[gSideTimers[def_side].followmeTarget].hp)
+ gBankTarget = gSideTimers[def_side].followmeTarget;
else
gBankTarget = gProtectStructs[gBankAttacker].physicalBank;
gBattlescriptCurrInstr += 5;
@@ -15047,7 +14317,7 @@ static void atkA1_counterdamagecalculator(void)
else
{
gSpecialStatuses[gBankAttacker].flag20 = 1;
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
@@ -15058,8 +14328,8 @@ static void atkA2_mirrorcoatdamagecalculator(void) //a copy of atkA1 with the ph
if (gProtectStructs[gBankAttacker].specialDmg && atk_side != def_side && gBattleMons[gProtectStructs[gBankAttacker].specialBank].hp)
{
gBattleMoveDamage = gProtectStructs[gBankAttacker].specialDmg * 2;
- if (gSideTimer[def_side].followmeTimer && gBattleMons[gSideTimer[def_side].followmeTarget].hp)
- gBankTarget = gSideTimer[def_side].followmeTarget;
+ if (gSideTimers[def_side].followmeTimer && gBattleMons[gSideTimers[def_side].followmeTarget].hp)
+ gBankTarget = gSideTimers[def_side].followmeTarget;
else
gBankTarget = gProtectStructs[gBankAttacker].specialBank;
gBattlescriptCurrInstr += 5;
@@ -15067,7 +14337,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,11 +14364,11 @@ static void atkA3_disablelastusedattack(void)
}
else
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
-static void atkA4_setencore(void)
+static void atkA4_trysetencore(void)
{
int i;
for (i = 0; i < 4; i++)
@@ -15118,7 +14388,7 @@ static void atkA4_setencore(void)
}
else
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
@@ -15139,14 +14409,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 +14458,7 @@ static void atkA6_settypetorandomresistance(void)
type += 3, rands += 3;
} while (rands < 336);
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
@@ -15465,7 +14735,7 @@ struct move_pp
static void atkA8_copymovepermanently(void)
{
- gUnknown_02024BE8 = 0xFFFF;
+ gChosenMove = 0xFFFF;
if (!(gBattleMons[gBankAttacker].status2 & STATUS2_TRANSFORMED) && gUnknown_02024C2C[gBankTarget] != MOVE_STRUGGLE && gUnknown_02024C2C[gBankTarget] != 0 && gUnknown_02024C2C[gBankTarget] != 0xFFFF && gUnknown_02024C2C[gBankTarget] != MOVE_SKETCH)
{
int i;
@@ -15477,7 +14747,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;
@@ -15490,7 +14760,7 @@ static void atkA8_copymovepermanently(void)
moves_data.pp[i] = gBattleMons[gBankAttacker].pp[i];
}
moves_data.ppBonuses = gBattleMons[gBankAttacker].ppBonuses;
- EmitSetAttributes(0, REQUEST_MOVES_PP_BATTLE, 0, sizeof(struct move_pp), &moves_data);
+ EmitSetMonData(0, REQUEST_MOVES_PP_BATTLE, 0, sizeof(struct move_pp), &moves_data);
MarkBufferBankForExecution(gActiveBank);
gBattleTextBuff1[0] = 0xFD;
gBattleTextBuff1[1] = 2;
@@ -15501,7 +14771,7 @@ static void atkA8_copymovepermanently(void)
}
}
else //sketch fail
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
static bool8 IsTwoTurnsMove(u16 move)
@@ -15536,7 +14806,7 @@ static u8 AttacksThisTurn(u8 bank, u16 move) //Note: returns 1 if it's a chargin
return 2;
}
-static void atkA9_sleeptalk_choose_move(void)
+static void atkA9_trychoosesleeptalkmove(void)
{
u8 unusable_moves = 0;
int i;
@@ -15562,11 +14832,11 @@ 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);
}
}
-static void atkAA_set_destinybond(void)
+static void atkAA_setdestinybond(void)
{
gBattleMons[gBankAttacker].status2 |= STATUS2_DESTINY_BOND;
gBattlescriptCurrInstr++;
@@ -15580,7 +14850,7 @@ static void DestinyBondFlagUpdate(void)
gHitMarker |= HITMARKER_DESTINYBOND;
}
-static void atkAB_DestinyBondFlagUpdate(void)
+static void atkAB_trysetdestinybondtohappen(void)
{
DestinyBondFlagUpdate();
gBattlescriptCurrInstr++;
@@ -15599,7 +14869,7 @@ static void atkAC_remaininghptopower(void)
gBattlescriptCurrInstr++;
}
-static void atkAD_spite_ppreduce(void)
+static void atkAD_tryspiteppreduce(void)
{
if (gLastUsedMove[gBankTarget] != 0 && gLastUsedMove[gBankTarget] != 0xFFFF && !(gStatuses3[gBankTarget] & STATUS3_SEMI_INVULNERABLE))
{
@@ -15633,7 +14903,7 @@ static void atkAD_spite_ppreduce(void)
if (!(gDisableStructs[gActiveBank].unk18_b & gBitTable[i])
&& !(gBattleMons[gActiveBank].status2 & STATUS2_TRANSFORMED))
{
- EmitSetAttributes(0, REQUEST_PPMOVE1_BATTLE + i, 0, 1, &gBattleMons[gActiveBank].pp[i]);
+ EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + i, 0, 1, &gBattleMons[gActiveBank].pp[i]);
MarkBufferBankForExecution(gActiveBank);
}
gBattlescriptCurrInstr += 5;
@@ -15642,10 +14912,10 @@ static void atkAD_spite_ppreduce(void)
return;
}
}
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
-static void atkAE_heal_party_status(void)
+static void atkAE_healpartystatus(void)
{
register u32 zero2 asm("r4") = 0;
u32 zero = zero2;
@@ -15671,7 +14941,7 @@ static void atkAE_heal_party_status(void)
gBattleCommunication[MULTISTRING_CHOOSER] |= 1;
}
- gActiveBank = BATTLE_STRUCT->scriptingActive = GetBankByPlayerAI(GetBankIdentity(gBankAttacker) ^ 2);
+ gActiveBank = BATTLE_STRUCT->scriptingActive = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ 2);
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBankFlags & gBitTable[gActiveBank]))
{
if (gBattleMons[gActiveBank].ability != ABILITY_SOUNDPROOF)
@@ -15709,14 +14979,14 @@ static void atkAE_heal_party_status(void)
to_heal = 0x3F;
gBattleMons[gBankAttacker].status1 = zero2;
- gActiveBank = GetBankByPlayerAI(GetBankIdentity(gBankAttacker) ^ 2);
+ gActiveBank = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ 2);
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBankFlags & gBitTable[gActiveBank]))
gBattleMons[gActiveBank].status1 = 0;
}
//missing check?
gActiveBank = gBankAttacker;
- EmitSetAttributes(0, REQUEST_STATUS_BATTLE, to_heal, 4, &zero);
+ EmitSetMonData(0, REQUEST_STATUS_BATTLE, to_heal, 4, &zero);
MarkBufferBankForExecution(gActiveBank);
gBattlescriptCurrInstr++;
@@ -15726,7 +14996,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
{
@@ -15738,29 +15008,29 @@ static void atkAF_cursetarget(void)
}
}
-static void atkB0_set_spikes(void)
+static void atkB0_trysetspikes(void)
{
u8 side = GetBankSide(gBankAttacker) ^ 1;
- if (gSideTimer[side].spikesAmount == 3)
+ if (gSideTimers[side].spikesAmount == 3)
{
gSpecialStatuses[gBankAttacker].flag20 = 1;
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
else
{
gSideAffecting[side] |= SIDE_STATUS_SPIKES;
- gSideTimer[side].spikesAmount++;
+ gSideTimers[side].spikesAmount++;
gBattlescriptCurrInstr += 5;
}
}
-static void atkB1_set_foresight(void)
+static void atkB1_setforesight(void)
{
gBattleMons[gBankTarget].status2 |= STATUS2_FORESIGHT;
gBattlescriptCurrInstr++;
}
-static void atkB2_setperishsong(void)
+static void atkB2_trysetperishsong(void)
{
int not_affected_pokes = 0, i;
@@ -15776,9 +15046,9 @@ static void atkB2_setperishsong(void)
}
}
- sub_80153D0(gBankAttacker);
+ PressurePPLoseOnUsingPerishSong(gBankAttacker);
if (not_affected_pokes == gNoOfAllBanks)
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
else
gBattlescriptCurrInstr += 5;
}
@@ -15788,7 +15058,7 @@ static void atkB3_rolloutdamagecalculation(void)
if (gBattleMoveFlags & MOVESTATUS_NOEFFECT)
{
CancelMultiTurnMoves(gBankAttacker);
- gBattlescriptCurrInstr = BattleScript_1D6F74;
+ gBattlescriptCurrInstr = BattleScript_MoveMissedPause;
}
else
{
@@ -15798,7 +15068,7 @@ static void atkB3_rolloutdamagecalculation(void)
gDisableStructs[gBankAttacker].rolloutTimer1 = 5;
gDisableStructs[gBankAttacker].rolloutTimer2 = 5;
gBattleMons[gBankAttacker].status2 |= STATUS2_MULTIPLETURNS;
- gLockedMove[gBankAttacker] = gCurrentMove;
+ gLockedMoves[gBankAttacker] = gCurrentMove;
}
if (--gDisableStructs[gBankAttacker].rolloutTimer1 == 0)
gBattleMons[gBankAttacker].status2 &= ~(STATUS2_MULTIPLETURNS);
@@ -15816,8 +15086,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;
}
@@ -15827,7 +15097,7 @@ static void atkB5_furycuttercalc(void)
if (gBattleMoveFlags & MOVESTATUS_NOEFFECT)
{
gDisableStructs[gBankAttacker].furyCutterCounter = 0;
- gBattlescriptCurrInstr = BattleScript_1D6F74;
+ gBattlescriptCurrInstr = BattleScript_MoveMissedPause;
}
else
{
@@ -15870,17 +15140,17 @@ static void atkB7_presentdamagecalculation(void)
gBattleMoveDamage *= -1;
}
if (rand < 204)
- gBattlescriptCurrInstr = BattleScript_1D6F44;
+ gBattlescriptCurrInstr = BattleScript_HitFromCritCalc;
else if (gBattleMons[gBankTarget].maxHP == gBattleMons[gBankTarget].hp)
- gBattlescriptCurrInstr = BattleScript_1D83B5;
+ gBattlescriptCurrInstr = BattleScript_AlreadyAtFullHp;
else
{
//gBattleMoveFlags &= ~(MOVESTATUS_NOTAFFECTED); only in Emerald
- gBattlescriptCurrInstr = BattleScript_1D839B;
+ gBattlescriptCurrInstr = BattleScript_PresentHealTarget;
}
}
-static void atkB8_set_safeguard(void)
+static void atkB8_setsafeguard(void)
{
if (gSideAffecting[GetBankIdentity(gBankAttacker) & 1] & SIDE_STATUS_SAFEGUARD)
{
@@ -15890,7 +15160,7 @@ static void atkB8_set_safeguard(void)
else
{
gSideAffecting[GetBankIdentity(gBankAttacker) & 1] |= SIDE_STATUS_SAFEGUARD;
- gSideTimer[GetBankIdentity(gBankAttacker) & 1].safeguardTimer = 5;
+ gSideTimers[GetBankIdentity(gBankAttacker) & 1].safeguardTimer = 5;
gBattleCommunication[MULTISTRING_CHOOSER] = 5;
}
gBattlescriptCurrInstr++;
@@ -15957,26 +15227,26 @@ static void atkBA_jumpifnopursuitswitchdmg(void)
if (gMultiHitCounter == 1)
{
if (GetBankSide(gBankAttacker) == 0)
- gBankTarget = GetBankByPlayerAI(1);
+ gBankTarget = GetBankByIdentity(1);
else
- gBankTarget = GetBankByPlayerAI(0);
+ gBankTarget = GetBankByIdentity(0);
}
else
{
if (GetBankSide(gBankAttacker) == 0)
- gBankTarget = GetBankByPlayerAI(3);
+ gBankTarget = GetBankByIdentity(3);
else
- gBankTarget = GetBankByPlayerAI(2);
+ gBankTarget = GetBankByIdentity(2);
}
- if (gActionForBanks[gBankTarget] == 0 && gBankAttacker == ewram[gBankTarget + 0x16010] && !(gBattleMons[gBankTarget].status1 & (STATUS_SLEEP | STATUS_FREEZE))
+ if (gActionForBanks[gBankTarget] == 0 && gBankAttacker == ewram16010arr(gBankTarget) && !(gBattleMons[gBankTarget].status1 & (STATUS_SLEEP | STATUS_FREEZE))
&& gBattleMons[gBankAttacker].hp && !gDisableStructs[gBankTarget].truantCounter && gChosenMovesByBanks[gBankTarget] == MOVE_PURSUIT)
{
int i;
for (i = 0; i < gNoOfAllBanks; i++)
{
- if (gTurnOrder[i] == gBankTarget)
- gUnknown_02024A76[i] = 11;
+ if (gBanksByTurnOrder[i] == gBankTarget)
+ gActionsByTurnOrder[i] = 11;
}
gCurrentMove = MOVE_PURSUIT;
gBattlescriptCurrInstr += 5;
@@ -15984,7 +15254,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 +15289,7 @@ static void atkBC_maxattackhalvehp(void) //belly drum
}
else
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
@@ -16033,39 +15303,39 @@ static void atkBD_copyfoestats(void) //psych up
gBattlescriptCurrInstr += 5; //why not 1? possible unused fail possibility?
}
-static void atkBE_breakfree(void) //rapid spin
+static void atkBE_rapidspinfree(void) //rapid spin
{
if (gBattleMons[gBankAttacker].status2 & STATUS2_WRAPPED)
{
gBattleMons[gBankAttacker].status2 &= ~(STATUS2_WRAPPED);
- gBankTarget = ewram[gBankAttacker + 0x16020];
+ gBankTarget = ewram16020arr(gBankAttacker);
gBattleTextBuff1[0] = 0xFD;
gBattleTextBuff1[1] = 2;
- gBattleTextBuff1[2] = ewram[gBankAttacker * 2 + 0x16004];
- gBattleTextBuff1[3] = ewram[gBankAttacker * 2 + 0x16005];
+ gBattleTextBuff1[2] = ewram16004arr(0, gBankAttacker);
+ gBattleTextBuff1[3] = ewram16004arr(1, gBankAttacker);
gBattleTextBuff1[4] = 0xFF;
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_WrapFree;
}
else if (gStatuses3[gBankAttacker] & STATUS3_LEECHSEED)
{
gStatuses3[gBankAttacker] &= ~(STATUS3_LEECHSEED);
gStatuses3[gBankAttacker] &= ~(STATUS3_LEECHSEED_BANK);
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_LeechSeedFree;
}
else if (gSideAffecting[GetBankSide(gBankAttacker)] & SIDE_STATUS_SPIKES)
{
gSideAffecting[GetBankSide(gBankAttacker)] &= ~(SIDE_STATUS_SPIKES);
- gSideTimer[GetBankSide(gBankAttacker)].spikesAmount = 0;
- b_movescr_stack_push_cursor();
+ gSideTimers[GetBankSide(gBankAttacker)].spikesAmount = 0;
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_SpikesFree;
}
else
gBattlescriptCurrInstr++;
}
-static void atkBF_set_defense_curl(void)
+static void atkBF_setdefensecurlbit(void)
{
gBattleMons[gBankAttacker].status2 |= STATUS2_DEFENSE_CURL;
gBattlescriptCurrInstr++;
@@ -16089,12 +15359,12 @@ static void atkC0_recoverbasedonsunlight(void)
}
else
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
__attribute__((naked))
-static void atkC1_hidden_power(void)
+static void atkC1_hiddenpowercalc(void)
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
@@ -16201,7 +15471,7 @@ push {r4-r7,lr}\n\
bl __divsi3\n\
adds r0, 0x1E\n\
strh r0, [r5]\n\
- ldr r5, _080298A0 @ =0x02000000\n\
+ ldr r5, _080298A0 @ =gSharedMem\n\
lsls r0, r4, 4\n\
subs r0, r4\n\
movs r1, 0x3F\n\
@@ -16236,13 +15506,13 @@ _08029876:\n\
_08029894: .4byte gBattleMons\n\
_08029898: .4byte gBankAttacker\n\
_0802989C: .4byte gDynamicBasePower\n\
-_080298A0: .4byte 0x02000000\n\
+_080298A0: .4byte gSharedMem\n\
_080298A4: .4byte 0x0001601c\n\
_080298A8: .4byte gBattlescriptCurrInstr\n\
.syntax divided");
}
-static void atkC2_selectnexttarget(void)
+static void atkC2_selectfirstvalidtarget(void)
{
for (gBankTarget = 0; gBankTarget < gNoOfAllBanks; gBankTarget++)
{
@@ -16254,11 +15524,11 @@ static void atkC2_selectnexttarget(void)
gBattlescriptCurrInstr++;
}
-static void atkC3_setfutureattack(void)
+static void atkC3_trysetfutureattack(void)
{
if (gWishFutureKnock.futureSightCounter[gBankTarget] != 0)
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
else
{
@@ -16282,7 +15552,7 @@ static void atkC3_setfutureattack(void)
}
#ifdef NONMATCHING
-static void atkC4_beat_up(void)
+static void atkC4_trydobeatup(void)
{
register struct Pokemon* party asm("r7");
if (GetBankSide(gBankAttacker) == 0)
@@ -16291,7 +15561,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,14 +15591,14 @@ 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
__attribute__((naked))
-static void atkC4_beat_up(void)
+static void atkC4_trydobeatup(void)
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
@@ -16581,7 +15851,7 @@ _08029C54: .4byte gBattlescriptCurrInstr\n\
}
#endif // NONMATCHING
-static void atkC5_hidepreattack(void)
+static void atkC5_setsemiinvulnerablebit(void)
{
switch (gCurrentMove)
{
@@ -16599,7 +15869,7 @@ static void atkC5_hidepreattack(void)
gBattlescriptCurrInstr++;
}
-static void atkC6_unhidepostattack(void)
+static void atkC6_clearsemiinvulnerablebit(void)
{
switch (gCurrentMove)
{
@@ -16645,7 +15915,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;
@@ -16658,8 +15928,8 @@ static void atkC9_jumpifattackandspecialattackcannotfall(void) //memento
static void atkCA_setforcedtarget(void) //follow me
{
- gSideTimer[GetBankSide(gBankAttacker)].followmeTimer = 1;
- gSideTimer[GetBankSide(gBankAttacker)].followmeTarget = gBankAttacker;
+ gSideTimers[GetBankSide(gBankAttacker)].followmeTimer = 1;
+ gSideTimers[GetBankSide(gBankAttacker)].followmeTarget = gBankAttacker;
gBattlescriptCurrInstr++;
}
@@ -16676,7 +15946,7 @@ static void atkCC_callterrainattack(void) //nature power
gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED);
gCurrentMove = sNaturePowerMoves[gBattleTerrain];
gBankTarget = GetMoveTarget(gCurrentMove, 0);
- b_movescr_stack_push(gBattleScriptsEffectsTable[gBattleMoves[gCurrentMove].effect]);
+ BattleScriptPush(gBattleScriptsForMoveEffects[gBattleMoves[gCurrentMove].effect]);
gBattlescriptCurrInstr++;
}
@@ -16687,17 +15957,17 @@ static void atkCD_cureifburnedparalysedorpoisoned(void) //refresh
gBattleMons[gBankAttacker].status1 = 0;
gBattlescriptCurrInstr += 5;
gActiveBank = gBankAttacker;
- EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1);
+ EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1);
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 +15980,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,12 +15992,12 @@ static void atkD0_settaunt(void)
gBattlescriptCurrInstr += 5;
}
else
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
-static void atkD1_set_helpinghand(void)
+static void atkD1_trysethelpinghand(void)
{
- gBankTarget = GetBankByPlayerAI(GetBankIdentity(gBankAttacker) ^ 2);
+ gBankTarget = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ 2);
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBankFlags & gBitTable[gBankTarget])
&& !gProtectStructs[gBankAttacker].helpingHand && !gProtectStructs[gBankTarget].helpingHand)
{
@@ -16735,11 +16005,11 @@ static void atkD1_set_helpinghand(void)
gBattlescriptCurrInstr += 5;
}
else
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
#ifdef NONMATCHING
-static void atkD2_swap_items(void)
+static void atkD2_tryswapitems(void)
{
if ((GetBankSide(gBankAttacker) != 1 || gBattleTypeFlags & (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER) || gTrainerBattleOpponent == 0x400))
{
@@ -16747,12 +16017,12 @@ static void atkD2_swap_items(void)
if (gBattleTypeFlags)
}
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
#else
__attribute__((naked))
-static void atkD2_swap_items(void)
+static void atkD2_tryswapitems(void)
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
@@ -16917,7 +16187,7 @@ _0802A364: .4byte BattleScript_NoItemSteal\n\
_0802A368: .4byte gLastUsedAbility\n\
_0802A36C:\n\
lsls r0, r4, 1\n\
- ldr r4, _0802A458 @ =0x020160f0\n\
+ ldr r4, _0802A458 @ =gSharedMem + 0x160F0\n\
adds r6, r0, r4\n\
ldrh r5, [r5, 0x2E]\n\
mov r10, r5\n\
@@ -16946,7 +16216,7 @@ _0802A36C:\n\
movs r1, 0x2\n\
movs r2, 0\n\
movs r3, 0x2\n\
- bl EmitSetAttributes\n\
+ bl EmitSetMonData\n\
ldr r2, _0802A45C @ =gBankAttacker\n\
ldrb r0, [r2]\n\
bl MarkBufferBankForExecution\n\
@@ -16964,7 +16234,7 @@ _0802A36C:\n\
movs r1, 0x2\n\
movs r2, 0\n\
movs r3, 0x2\n\
- bl EmitSetAttributes\n\
+ bl EmitSetMonData\n\
ldrb r0, [r7]\n\
bl MarkBufferBankForExecution\n\
ldr r0, _0802A464 @ =0xfffe9f10\n\
@@ -17031,7 +16301,7 @@ _0802A36C:\n\
movs r0, 0x2\n\
b _0802A498\n\
.align 2, 0\n\
-_0802A458: .4byte 0x020160f0\n\
+_0802A458: .4byte gSharedMem + 0x160F0\n\
_0802A45C: .4byte gBankAttacker\n\
_0802A460: .4byte gActiveBank\n\
_0802A464: .4byte 0xfffe9f10\n\
@@ -17071,7 +16341,7 @@ _0802A4AC: .4byte gBattleCommunication\n\
}
#endif // NONMATCHING
-static void atkD3_copy_ability(void) //role play
+static void atkD3_trycopyability(void) //role play
{
if (gBattleMons[gBankTarget].ability != 0 && gBattleMons[gBankTarget].ability != ABILITY_WONDER_GUARD)
{
@@ -17080,12 +16350,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)
+static void atkD4_trywish(void)
{
- switch (BSScriptRead8(gBattlescriptCurrInstr + 1))
+ switch (T2_READ_8(gBattlescriptCurrInstr + 1))
{
case 0: //use wish
if (gWishFutureKnock.wishCounter[gBankAttacker] == 0)
@@ -17095,7 +16365,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,17 +16378,17 @@ 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;
}
}
-static void atkD5_setroots(void) //ingrain
+static void atkD5_trysetroots(void) //ingrain
{
if (gStatuses3[gBankAttacker] & STATUS3_ROOTED)
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
else
{
gStatuses3[gBankAttacker] |= STATUS3_ROOTED;
@@ -17137,7 +16407,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 +16419,7 @@ static void atkD8_setdamagetohealthdifference(void)
{
if (gBattleMons[gBankTarget].hp <= gBattleMons[gBankAttacker].hp)
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
else
{
@@ -17170,12 +16440,12 @@ static void atkD9_scaledamagebyhealthratio(void)
gBattlescriptCurrInstr++;
}
-static void atkDA_abilityswap(void)
+static void atkDA_tryswapabilities(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;
@@ -17185,17 +16455,17 @@ static void atkDA_abilityswap(void)
}
}
-static void atkDB_imprisoneffect(void)
+static void atkDB_tryimprision(void)
{
u8 r8 = 0;
if ((gStatuses3[gBankAttacker] & STATUS3_IMPRISIONED))
{
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
else
{
u8 bank;
- sub_801529C(gBankAttacker);
+ PressurePPLoseOnUsingImprision(gBankAttacker);
for (bank = 0; bank < gNoOfAllBanks; bank++)
{
if (r8 != GetBankSide(bank))
@@ -17221,14 +16491,14 @@ static void atkDB_imprisoneffect(void)
}
}
if (bank == gNoOfAllBanks)
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
}
-static void atkDC_setgrudge(void)
+static void atkDC_trysetgrudge(void)
{
if (gStatuses3[gBankAttacker] & STATUS3_GRUDGE)
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
else
{
gStatuses3[gBankAttacker] |= STATUS3_GRUDGE;
@@ -17302,7 +16572,7 @@ static void atkDE_asistattackselect(void)
gBattlescriptCurrInstr += 5;
}
else
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
#else
@@ -17365,7 +16635,7 @@ _0802AAAE:\n\
mov r9, r6\n\
mov r1, r10\n\
lsls r0, r1, 1\n\
- ldr r1, _0802ABB0 @ =0x02016024\n\
+ ldr r1, _0802ABB0 @ =gSharedMem + 0x16024\n\
adds r6, r0, r1\n\
_0802AAF8:\n\
movs r7, 0\n\
@@ -17436,7 +16706,7 @@ _0802AB54:\n\
muls r0, r1\n\
asrs r0, 8\n\
lsls r0, 1\n\
- ldr r1, _0802ABB0 @ =0x02016024\n\
+ ldr r1, _0802ABB0 @ =gSharedMem + 0x16024\n\
adds r0, r1\n\
ldrh r0, [r0]\n\
strh r0, [r4]\n\
@@ -17456,7 +16726,7 @@ _0802ABA0: .4byte gPlayerParty\n\
_0802ABA4: .4byte gEnemyParty\n\
_0802ABA8: .4byte gBattlePartyID\n\
_0802ABAC: .4byte 0x0000ffff\n\
-_0802ABB0: .4byte 0x02016024\n\
+_0802ABB0: .4byte gSharedMem + 0x16024\n\
_0802ABB4: .4byte sUnknown_081FACFE\n\
_0802ABB8: .4byte gHitMarker\n\
_0802ABBC: .4byte 0xfffffbff\n\
@@ -17493,12 +16763,12 @@ _0802ABF8: .4byte gBattlescriptCurrInstr\n\
#endif // NONMATCHING
-static void atkDF_setmagiccoat(void)
+static void atkDF_trysetmagiccoat(void)
{
gBankTarget = gBankAttacker;
gSpecialStatuses[gBankAttacker].flag20 = 1;
- if (gCurrentMoveTurn == gNoOfAllBanks - 1) //last turn
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ if (gCurrentTurnActionNumber == gNoOfAllBanks - 1) //last turn
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
else
{
gProtectStructs[gBankAttacker].bounceMove = 1;
@@ -17506,11 +16776,11 @@ static void atkDF_setmagiccoat(void)
}
}
-static void atkE0_setstealstatchange(void)
+static void atkE0_trysetsnatch(void)
{
gSpecialStatuses[gBankAttacker].flag20 = 1;
- if (gCurrentMoveTurn == gNoOfAllBanks - 1) //last turn
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ if (gCurrentTurnActionNumber == gNoOfAllBanks - 1) //last turn
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
else
{
gProtectStructs[gBankAttacker].stealMove = 1;
@@ -17518,11 +16788,11 @@ static void atkE0_setstealstatchange(void)
}
}
-static void atkE1_intimidate_string_loader(void)
+static void atkE1_trygetintimidatetarget(void)
{
u8 side;
- BATTLE_STRUCT->scriptingActive = ewram[0x160dd];
+ BATTLE_STRUCT->scriptingActive = ewram160DD;
side = GetBankSide(BATTLE_STRUCT->scriptingActive);
gBattleTextBuff1[0] = 0xFD;
gBattleTextBuff1[1] = 9;
@@ -17538,30 +16808,30 @@ 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)
+static void atkE2_switchoutabilities(void)
{
- gActiveBank = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1));
+ gActiveBank = GetBattleBank(T2_READ_8(gBattlescriptCurrInstr + 1));
switch (gBattleMons[gActiveBank].ability)
{
case ABILITY_NATURAL_CURE:
gBattleMons[gActiveBank].status1 = 0;
- EmitSetAttributes(0, REQUEST_STATUS_BATTLE, gBitTable[ewram[gActiveBank + 0x16064]], 4, &gBattleMons[gActiveBank].status1);
+ EmitSetMonData(0, REQUEST_STATUS_BATTLE, gBitTable[ewram16064arr(gActiveBank)], 4, &gBattleMons[gActiveBank].status1);
MarkBufferBankForExecution(gActiveBank);
break;
}
gBattlescriptCurrInstr += 2;
}
-static void atkE3_jumpiffainted(void)
+static void atkE3_jumpifhasnohp(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;
}
@@ -17570,28 +16840,28 @@ static void atkE4_getsecretpowereffect(void)
{
switch (gBattleTerrain)
{
- case 0:
+ case BATTLE_TERRAIN_GRASS:
gBattleCommunication[MOVE_EFFECT_BYTE] = 2;
break;
- case 1:
+ case BATTLE_TERRAIN_LONG_GRASS:
gBattleCommunication[MOVE_EFFECT_BYTE] = 1;
break;
- case 2:
+ case BATTLE_TERRAIN_SAND:
gBattleCommunication[MOVE_EFFECT_BYTE] = 27;
break;
- case 3:
+ case BATTLE_TERRAIN_UNDERWATER:
gBattleCommunication[MOVE_EFFECT_BYTE] = 23;
break;
- case 4:
+ case BATTLE_TERRAIN_WATER:
gBattleCommunication[MOVE_EFFECT_BYTE] = 22;
break;
- case 5:
+ case BATTLE_TERRAIN_POND:
gBattleCommunication[MOVE_EFFECT_BYTE] = 24;
break;
- case 6:
+ case BATTLE_TERRAIN_MOUNTAIN:
gBattleCommunication[MOVE_EFFECT_BYTE] = 7;
break;
- case 7:
+ case BATTLE_TERRAIN_CAVE:
gBattleCommunication[MOVE_EFFECT_BYTE] = 8;
break;
default:
@@ -17629,24 +16899,24 @@ static void atkE5_pickup(void)
gBattlescriptCurrInstr++;
}
-static void atkE6_castform_change_animation(void)
+static void atkE6_docastformchangeanimation(void)
{
gActiveBank = BATTLE_STRUCT->scriptingActive;
if (gBattleMons[gActiveBank].status2 & STATUS2_SUBSTITUTE)
BATTLE_STRUCT->castformToChangeInto |= 0x80;
- EmitBattleAnimation(0, 0, BATTLE_STRUCT->castformToChangeInto);
+ EmitBattleAnimation(0, B_ANIM_CASTFORM_CHANGE, BATTLE_STRUCT->castformToChangeInto);
MarkBufferBankForExecution(gActiveBank);
gBattlescriptCurrInstr++;
}
-static void atkE7_castform_data_change(void)
+static void atkE7_trycastformdatachange(void)
{
u8 form;
gBattlescriptCurrInstr++;
form = CastformDataTypeChange(BATTLE_STRUCT->scriptingActive);
if (form)
{
- b_push_move_exec(BattleScript_CastformChange);
+ BattleScriptPushCursorAndCallback(BattleScript_CastformChange);
BATTLE_STRUCT->castformToChangeInto = form - 1;
}
}
@@ -17675,7 +16945,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)
@@ -17698,7 +16968,7 @@ static void atkE9_setweatherballtype(void)
gBattlescriptCurrInstr++;
}
-static void atkEA_recycleitem(void)
+static void atkEA_tryrecycleitem(void)
{
u16* used_item;
gActiveBank = gBankAttacker;
@@ -17708,12 +16978,12 @@ static void atkEA_recycleitem(void)
gLastUsedItem = *used_item;
*used_item = 0;
gBattleMons[gActiveBank].item = gLastUsedItem;
- EmitSetAttributes(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBank].item);
+ EmitSetMonData(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gActiveBank].item);
MarkBufferBankForExecution(gActiveBank);
gBattlescriptCurrInstr += 5;
}
else
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
static void atkEB_settypetoterrain(void)
@@ -17729,15 +16999,15 @@ static void atkEB_settypetoterrain(void)
gBattlescriptCurrInstr += 5;
}
else
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
-static void atkEC_pursuit_sth(void)
+static void atkEC_pursuitrelated(void)
{
- gActiveBank = GetBankByPlayerAI(GetBankIdentity(gBankAttacker) ^ 2);
+ gActiveBank = GetBankByIdentity(GetBankIdentity(gBankAttacker) ^ 2);
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && !(gAbsentBankFlags & gBitTable[gActiveBank]) && gActionForBanks[gActiveBank] == 0 && gChosenMovesByBanks[gActiveBank] == MOVE_PURSUIT)
{
- gUnknown_02024A76[gActiveBank] = 11;
+ gActionsByTurnOrder[gActiveBank] = 11;
gCurrentMove = MOVE_PURSUIT;
gBattlescriptCurrInstr += 5;
BATTLE_STRUCT->animTurn = 1;
@@ -17745,10 +17015,10 @@ static void atkEC_pursuit_sth(void)
gBankAttacker = gActiveBank;
}
else
- gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
}
-static void atkED_802B4B4(void)
+static void atkED_snatchsetbanks(void)
{
gEffectBank = gBankAttacker;
if (gBankAttacker == gBankTarget)
@@ -17762,12 +17032,12 @@ static void atkED_802B4B4(void)
static void atkEE_removelightscreenreflect(void) //brick break
{
u8 side = GetBankSide(gBankAttacker) ^ 1;
- if (gSideTimer[side].reflectTimer || gSideTimer[side].lightscreenTimer)
+ if (gSideTimers[side].reflectTimer || gSideTimers[side].lightscreenTimer)
{
gSideAffecting[side] &= ~(SIDE_STATUS_REFLECT);
gSideAffecting[side] &= ~(SIDE_STATUS_LIGHTSCREEN);
- gSideTimer[side].reflectTimer = 0;
- gSideTimer[side].lightscreenTimer = 0;
+ gSideTimers[side].reflectTimer = 0;
+ gSideTimers[side].lightscreenTimer = 0;
BATTLE_STRUCT->animTurn = 1;
BATTLE_STRUCT->animTargetsHit = 1;
}
@@ -17779,7 +17049,7 @@ static void atkEE_removelightscreenreflect(void) //brick break
gBattlescriptCurrInstr++;
}
-void atkEF_pokeball_catch_calculation(void)
+void atkEF_handleballthrow(void)
{
u8 ball_multiplier = 0;
if (gBattleExecBuffer)
@@ -17818,7 +17088,7 @@ void atkEF_pokeball_catch_calculation(void)
ball_multiplier = 10;
break;
case ITEM_DIVE_BALL:
- if (sav1_map_get_light_level() == 5)
+ if (Overworld_GetMapTypeOfSaveblockLocation() == 5)
ball_multiplier = 35;
else
ball_multiplier = 10;
@@ -17834,7 +17104,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;
@@ -17910,7 +17180,7 @@ void atkEF_pokeball_catch_calculation(void)
}
}
-static void atkF0_copy_caught_poke(void)
+static void atkF0_givecaughtmon(void)
{
GiveMonToPlayer(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]]);
gBattleResults.caughtPoke = gBattleMons[gBankAttacker ^ 1].species;
@@ -17918,13 +17188,13 @@ static void atkF0_copy_caught_poke(void)
gBattlescriptCurrInstr++;
}
-static void atkF1_setpoke_as_caught(void)
+static void atkF1_trysetcaughtmondexflags(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
@@ -17937,7 +17207,7 @@ extern const u32 gBattleTerrainTiles_Building[];
extern const u32 gBattleTerrainTilemap_Building[];
extern const u32 gBattleTerrainPalette_BattleTower[];
-static void atkF2_display_dex_info(void)
+static void atkF2_displaydexinfo(void)
{
switch (gBattleCommunication[0])
{
@@ -17953,7 +17223,7 @@ static void atkF2_display_dex_info(void)
}
break;
case 2:
- if (!gPaletteFade.active && gMain.callback2 == sub_800F808 && !gTasks[gBattleCommunication[1]].isActive)
+ if (!gPaletteFade.active && gMain.callback2 == BattleMainCB2 && !gTasks[gBattleCommunication[1]].isActive)
{
LZDecompressVram(gBattleTerrainTiles_Building, (void*)(0x06008000));
LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(0x0600d000));
@@ -18071,7 +17341,7 @@ void nullsub_6(void)
return;
}
-static void atkF3_nickname_caught_poke(void)
+static void atkF3_trygivecaughtmonnick(void)
{
switch (gBattleCommunication[0])
{
@@ -18117,27 +17387,27 @@ static void atkF3_nickname_caught_poke(void)
if (!gPaletteFade.active)
{
GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_NICKNAME, BATTLE_STRUCT->caughtNick);
- DoNamingScreen(2, BATTLE_STRUCT->caughtNick, GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_SPECIES), GetMonGender(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]]), GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_PERSONALITY, 0), sub_800F808);
+ DoNamingScreen(2, BATTLE_STRUCT->caughtNick, GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_SPECIES), GetMonGender(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]]), GetMonData(&gEnemyParty[gBattlePartyID[gBankAttacker ^ 1]], MON_DATA_PERSONALITY, 0), BattleMainCB2);
gBattleCommunication[0]++;
}
break;
case 3:
- if (gMain.callback2 == sub_800F808 && !gPaletteFade.active )
+ if (gMain.callback2 == BattleMainCB2 && !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;
}
}
-static void atkF4_802BEF0(void)
+static void atkF4_subattackerhpbydmg(void)
{
gBattleMons[gBankAttacker].hp -= gBattleMoveDamage;
gBattlescriptCurrInstr++;
@@ -18149,13 +17419,13 @@ static void atkF5_removeattackerstatus1(void)
gBattlescriptCurrInstr++;
}
-static void atkF6_802BF48(void)
+static void atkF6_finishaction(void)
{
- gFightStateTracker = 0xC;
+ gCurrentActionFuncId = 0xC;
}
-static void atkF7_802BF54(void)
+static void atkF7_finishturn(void)
{
- gFightStateTracker = 0xC;
- gCurrentMoveTurn = gNoOfAllBanks;
+ gCurrentActionFuncId = 0xC;
+ gCurrentTurnActionNumber = gNoOfAllBanks;
}
diff --git a/src/battle_7.c b/src/battle/battle_7.c
index cf3a3522e..1c79d7ebf 100644
--- a/src/battle_7.c
+++ b/src/battle/battle_7.c
@@ -3,6 +3,7 @@
#include "battle_anim.h"
#include "battle_interface.h"
#include "blend_palette.h"
+#include "contest.h"
#include "data2.h"
#include "decompress.h"
#include "main.h"
@@ -11,23 +12,14 @@
#include "pokemon.h"
#include "rom_8077ABC.h"
#include "rom_8094928.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
-#include "species.h"
+#include "constants/species.h"
#include "sprite.h"
#include "task.h"
#include "text.h"
#include "gba/m4a_internal.h"
-
-struct Struct2019348
-{
- u8 filler0[2];
- u16 unk2;
- u8 filler4[4];
- u32 unk8;
- u32 unkC;
- u32 unk10;
-};
+#include "ewram.h"
extern u8 gBattleBufferA[][0x200];
extern u8 gActiveBank;
@@ -37,7 +29,7 @@ extern u8 gBanksBySide[];
extern u8 gObjectBankIDs[];
extern u16 gUnknown_02024DE8;
extern u8 gDoingBattleAnim;
-extern u32 gPID_perBank[];
+extern u32 gTransformedPersonalities[];
extern struct Window gUnknown_03004210;
extern void (*gBattleBankFunc[])(void);
extern u8 gHealthboxIDs[];
@@ -48,12 +40,12 @@ extern struct MusicPlayerInfo gMPlay_BGM;
extern u32 gBitTable[];
extern u16 gBattleTypeFlags;
extern u8 gBattleMonForms[];
-extern u8 gBattleAnimPlayerMonIndex;
-extern u8 gBattleAnimEnemyMonIndex;
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
extern void (*gAnimScriptCallback)(void);
extern u8 gAnimScriptActive;
-extern const u8 *const gBattleAnims_Unknown1[];
-extern const u8 *const gBattleAnims_Unknown2[];
+extern const u8 *const gBattleAnims_General[];
+extern const u8 *const gBattleAnims_Special[];
extern const struct CompressedSpriteSheet gTrainerFrontPicTable[];
extern const struct MonCoords gTrainerFrontPicCoords[];
extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[];
@@ -71,14 +63,12 @@ extern const struct CompressedSpriteSheet gUnknown_0820A4B4[];
extern const struct SpritePalette gUnknown_0820A4D4[];
extern const u8 gUnknown_08D09C48[];
-#define ewram19348 (*(struct Struct2019348 *)(ewram + 0x19348))
-
extern void c3_0802FDF4(u8);
extern void sub_80440EC();
extern void sub_804777C();
extern void sub_8141828();
-extern u8 sub_8077ABC();
-extern u8 sub_8078874(u8);
+extern u8 GetBankPosition();
+extern u8 IsBankSpritePresent(u8);
extern u8 sub_8077F68(u8);
extern u8 sub_8077F7C(u8);
extern void sub_8094958(void);
@@ -97,7 +87,7 @@ void sub_80328A4(struct Sprite *);
void sub_80312F0(struct Sprite *sprite)
{
- u8 spriteId = sprite->data1;
+ u8 spriteId = sprite->data[1];
if (gSprites[spriteId].affineAnimEnded && !gSprites[spriteId].invisible)
{
@@ -127,7 +117,7 @@ void sub_80313A0(struct Sprite *sprite)
{
if (!(gUnknown_02024DE8 & 1))
{
- sprite->pos2.x += sprite->data0;
+ sprite->pos2.x += sprite->data[0];
if (sprite->pos2.x == 0)
sprite->callback = SpriteCallbackDummy;
}
@@ -185,10 +175,10 @@ bool8 move_anim_start_t3(u8 a, u8 b, u8 c, u8 d, u16 e)
sub_80324E0(a);
return TRUE;
}
- gBattleAnimPlayerMonIndex = b;
- gBattleAnimEnemyMonIndex = c;
+ gAnimBankAttacker = b;
+ gAnimBankTarget = c;
ewram17840.unk0 = e;
- DoMoveAnim(gBattleAnims_Unknown1, d, 0);
+ LaunchBattleAnimation(gBattleAnims_General, d, 0);
taskId = CreateTask(sub_80315E8, 10);
gTasks[taskId].data[0] = a;
ewram17810[gTasks[taskId].data[0]].unk0_5 = 1;
@@ -225,9 +215,9 @@ void move_anim_start_t4(u8 a, u8 b, u8 c, u8 d)
{
u8 taskId;
- gBattleAnimPlayerMonIndex = b;
- gBattleAnimEnemyMonIndex = c;
- DoMoveAnim(gBattleAnims_Unknown2, d, 0);
+ gAnimBankAttacker = b;
+ gAnimBankTarget = c;
+ LaunchBattleAnimation(gBattleAnims_Special, d, 0);
taskId = CreateTask(sub_80316CC, 10);
gTasks[taskId].data[0] = a;
ewram17810[gTasks[taskId].data[0]].unk0_6 = 1;
@@ -287,7 +277,7 @@ void BattleLoadOpponentMonSprite(struct Pokemon *pkmn, u8 b)
else
{
species = ewram17800[b].transformedSpecies;
- r7 = gPID_perBank[b];
+ r7 = gTransformedPersonalities[b];
}
otId = GetMonData(pkmn, MON_DATA_OT_ID);
var = GetBankIdentity(b);
@@ -295,23 +285,23 @@ void BattleLoadOpponentMonSprite(struct Pokemon *pkmn, u8 b)
&gMonFrontPicTable[species],
gMonFrontPicCoords[species].coords,
gMonFrontPicCoords[species].y_offset,
- 0x02000000,
+ eVoidSharedArr2,
gUnknown_081FAF4C[var],
species,
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);
- LoadPalette(ewram, paletteOffset, 0x20);
- LoadPalette(ewram, 0x80 + b * 16, 0x20);
+ lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, otId, personalityValue);
+ LZDecompressWram(lzPaletteData, gSharedMem);
+ LoadPalette(gSharedMem, paletteOffset, 0x20);
+ LoadPalette(gSharedMem, 0x80 + b * 16, 0x20);
if (species == SPECIES_CASTFORM)
{
paletteOffset = 0x100 + b * 16;
- sub_800D238(lzPaletteData, ewram + 0x16400);
- LoadPalette(ewram + 0x16400 + gBattleMonForms[b] * 32, paletteOffset, 0x20);
+ LZDecompressWram(lzPaletteData, ewram16400);
+ LoadPalette(ewram16400 + gBattleMonForms[b] * 32, paletteOffset, 0x20);
}
if (ewram17800[b].transformedSpecies != 0)
{
@@ -339,7 +329,7 @@ void BattleLoadPlayerMonSprite(struct Pokemon *pkmn, u8 b)
else
{
species = ewram17800[b].transformedSpecies;
- r7 = gPID_perBank[b];
+ r7 = gTransformedPersonalities[b];
}
otId = GetMonData(pkmn, MON_DATA_OT_ID);
var = GetBankIdentity(b);
@@ -347,23 +337,23 @@ void BattleLoadPlayerMonSprite(struct Pokemon *pkmn, u8 b)
&gMonBackPicTable[species],
gMonBackPicCoords[species].coords,
gMonBackPicCoords[species].y_offset,
- 0x02000000,
+ eVoidSharedArr2,
gUnknown_081FAF4C[var],
species,
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);
- LoadPalette(ewram, paletteOffset, 0x20);
- LoadPalette(ewram, 0x80 + b * 16, 0x20);
+ lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, otId, personalityValue);
+ LZDecompressWram(lzPaletteData, gSharedMem);
+ LoadPalette(gSharedMem, paletteOffset, 0x20);
+ LoadPalette(gSharedMem, 0x80 + b * 16, 0x20);
if (species == SPECIES_CASTFORM)
{
paletteOffset = 0x100 + b * 16;
- sub_800D238(lzPaletteData, ewram + 0x16400);
- LoadPalette(ewram + 0x16400 + gBattleMonForms[b] * 32, paletteOffset, 0x20);
+ LZDecompressWram(lzPaletteData, ewram16400);
+ LoadPalette(ewram16400 + gBattleMonForms[b] * 32, paletteOffset, 0x20);
}
if (ewram17800[b].transformedSpecies != 0)
{
@@ -390,7 +380,7 @@ void sub_8031A6C(u16 a, u8 b)
&gTrainerFrontPicTable[a],
gTrainerFrontPicCoords[a].coords,
gTrainerFrontPicCoords[a].y_offset,
- (void *)0x02000000,
+ eVoidSharedArr,
gUnknown_081FAF4C[status],
0);
spriteSheet.data = gUnknown_081FAF4C[status];
@@ -409,7 +399,7 @@ void LoadPlayerTrainerBankSprite(u16 a, u8 b)
&gTrainerBackPicTable[a],
gTrainerBackPicCoords[a].coords,
gTrainerBackPicCoords[a].y_offset,
- (void *)0x02000000,
+ eVoidSharedArr,
gUnknown_081FAF4C[status],
0);
LoadCompressedPalette(gTrainerBackPicPaletteTable[a].data, 0x100 + b * 16, 32);
@@ -506,7 +496,7 @@ bool8 sub_8031C30(u8 a)
void load_gfxc_health_bar(void)
{
- sub_800D238(gUnknown_08D09C48, (void *)0x02000000);
+ LZDecompressWram(gUnknown_08D09C48, eVoidSharedArr);
}
u8 battle_load_something(u8 *pState, u8 *b)
@@ -623,7 +613,7 @@ void sub_8031FC4(u8 a, u8 b, bool8 c)
{
StartSpriteAnim(&gSprites[gObjectBankIDs[a]], ewram17840.unk0);
paletteOffset = 0x100 + a * 16;
- LoadPalette(ewram + 0x16400 + ewram17840.unk0 * 32, paletteOffset, 32);
+ LoadPalette(ewram16400 + ewram17840.unk0 * 32, paletteOffset, 32);
gBattleMonForms[a] = ewram17840.unk0;
if (ewram17800[a].transformedSpecies != 0)
{
@@ -640,17 +630,17 @@ void sub_8031FC4(u8 a, u8 b, bool8 c)
if (IsContest())
{
r10 = 0;
- species = ewram19348.unk2;
- personalityValue = ewram19348.unk8;
- otId = ewram19348.unkC;
+ species = shared19348.unk2;
+ personalityValue = shared19348.unk8;
+ otId = shared19348.unkC;
HandleLoadSpecialPokePic(
&gMonBackPicTable[species],
gMonBackPicCoords[species].coords,
gMonBackPicCoords[species].y_offset,
- 0x02000000,
+ eVoidSharedArr2,
gUnknown_081FAF4C[0],
species,
- ewram19348.unk10);
+ shared19348.unk10);
}
else
{
@@ -667,10 +657,10 @@ void sub_8031FC4(u8 a, u8 b, bool8 c)
&gMonBackPicTable[species],
gMonBackPicCoords[species].coords,
gMonBackPicCoords[species].y_offset,
- 0x02000000,
+ eVoidSharedArr2,
gUnknown_081FAF4C[r10],
species,
- gPID_perBank[a]);
+ gTransformedPersonalities[a]);
}
else
{
@@ -680,24 +670,24 @@ void sub_8031FC4(u8 a, u8 b, bool8 c)
&gMonFrontPicTable[species],
gMonFrontPicCoords[species].coords,
gMonFrontPicCoords[species].y_offset,
- 0x02000000,
+ eVoidSharedArr2,
gUnknown_081FAF4C[r10],
species,
- gPID_perBank[a]);
+ gTransformedPersonalities[a]);
}
}
src = gUnknown_081FAF4C[r10];
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);
- LoadPalette(ewram, paletteOffset, 32);
+ lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, otId, personalityValue);
+ LZDecompressWram(lzPaletteData, gSharedMem);
+ LoadPalette(gSharedMem, paletteOffset, 32);
if (species == SPECIES_CASTFORM)
{
- u16 *paletteSrc = (u16 *)(ewram + 0x16400);
+ u16 *paletteSrc = (u16 *)ewram16400; // TODO: avoid casting?
- sub_800D238(lzPaletteData, paletteSrc);
+ LZDecompressWram(lzPaletteData, paletteSrc);
LoadPalette(paletteSrc + gBattleMonForms[b] * 16, paletteOffset, 32);
}
BlendPalette(paletteOffset, 16, 6, 0x7FFF);
@@ -805,7 +795,7 @@ void sub_80324F8(struct Pokemon *pkmn, u8 b)
void BattleMusicStop(void)
{
- u8 r4 = GetBankByPlayerAI(0);
+ u8 r4 = GetBankByIdentity(0);
ewram17800[r4].unk0_1 = 0;
if (IsDoubleBattle())
@@ -825,8 +815,8 @@ void sub_8032638(void)
{
if (gMain.inBattle)
{
- u8 r8 = GetBankByPlayerAI(0);
- u8 r9 = GetBankByPlayerAI(2);
+ u8 r8 = GetBankByIdentity(0);
+ u8 r9 = GetBankByIdentity(2);
u8 r4 = pokemon_order_func(gBattlePartyID[r8]);
u8 r5 = pokemon_order_func(gBattlePartyID[r9]);
@@ -846,7 +836,7 @@ void sub_80326EC(u8 a)
for (i = 0; i < gNoOfAllBanks; i++)
{
- if (sub_8078874(i) != 0)
+ if (IsBankSpritePresent(i) != 0)
{
gSprites[gObjectBankIDs[i]].oam.affineMode = a;
if (a == 0)
@@ -867,24 +857,24 @@ void sub_80327CC(void)
u8 r5;
LoadCompressedObjectPic(&gUnknown_081FAF24);
- r5 = GetBankByPlayerAI(1);
- ewram17810[r5].unk7 = CreateSprite(&gSpriteTemplate_81FAF34, sub_8077ABC(r5, 0), sub_8077ABC(r5, 1) + 32, 0xC8);
- gSprites[ewram17810[r5].unk7].data0 = r5;
+ r5 = GetBankByIdentity(1);
+ ewram17810[r5].unk7 = CreateSprite(&gSpriteTemplate_81FAF34, GetBankPosition(r5, 0), GetBankPosition(r5, 1) + 32, 0xC8);
+ gSprites[ewram17810[r5].unk7].data[0] = r5;
if (IsDoubleBattle())
{
- r5 = GetBankByPlayerAI(3);
- ewram17810[r5].unk7 = CreateSprite(&gSpriteTemplate_81FAF34, sub_8077ABC(r5, 0), sub_8077ABC(r5, 1) + 32, 0xC8);
- gSprites[ewram17810[r5].unk7].data0 = r5;
+ r5 = GetBankByIdentity(3);
+ ewram17810[r5].unk7 = CreateSprite(&gSpriteTemplate_81FAF34, GetBankPosition(r5, 0), GetBankPosition(r5, 1) + 32, 0xC8);
+ gSprites[ewram17810[r5].unk7].data[0] = r5;
}
}
void sub_80328A4(struct Sprite *sprite)
{
bool8 invisible = FALSE;
- u8 r4 = sprite->data0;
+ u8 r4 = sprite->data[0];
struct Sprite *r7 = &gSprites[gObjectBankIDs[r4]];
- if (!r7->inUse || sub_8078874(r4) == 0)
+ if (!r7->inUse || IsBankSpritePresent(r4) == 0)
{
sprite->callback = sub_8032978;
return;
diff --git a/src/battle_ai.c b/src/battle/battle_ai.c
index 0e20c6b05..977e91f5c 100644
--- a/src/battle_ai.c
+++ b/src/battle/battle_ai.c
@@ -1,16 +1,17 @@
#include "global.h"
#include "battle_ai.h"
-#include "abilities.h"
+#include "constants/abilities.h"
#include "battle.h"
-#include "battle_move_effects.h"
+#include "constants/battle_move_effects.h"
#include "data2.h"
#include "item.h"
-#include "moves.h"
+#include "constants/moves.h"
#include "pokemon.h"
-#include "rng.h"
+#include "random.h"
#include "rom_8077ABC.h"
-#include "species.h"
+#include "constants/species.h"
#include "util.h"
+#include "ewram.h"
extern u16 gBattleTypeFlags;
extern u16 gBattleWeather;
@@ -267,10 +268,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 +292,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 +413,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 +471,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 +479,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 +487,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 +495,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 +520,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 +535,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 +550,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 +565,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 +580,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 +598,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 +616,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 +634,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 +652,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 +670,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 +689,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 +708,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 +719,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 +727,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 +735,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 +743,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 +826,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 +837,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 +858,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 +869,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 +885,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 +901,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)
@@ -951,8 +953,8 @@ static void BattleAICmd_is_most_powerful_move(void)
&& sDiscouragedPowerfulMoveEffects[i] == 0xFFFF)
{
gDynamicBasePower = 0;
- ewram[0x1601C] = 0; // why is this a manual array?
- ewram[0x1601F] = 1;
+ eDynamicMoveType = 0;
+ eDmgMultiplier = 1;
gBattleMoveFlags = 0;
gCritMultiplier = 1;
@@ -1015,7 +1017,7 @@ static void BattleAICmd_is_most_powerful_move(void)
ldrh r1, [r0]\n\
ldr r4, _0810832C @ =0x0000ffff\n\
ldr r6, _08108330 @ =gBattleMoves\n\
- ldr r5, _08108334 @ =0x02016800\n\
+ ldr r5, _08108334 @ =gSharedMem + 0x16800\n\
cmp r1, r4\n\
beq _0810822E\n\
ldrh r1, [r5, 0x2]\n\
@@ -1148,7 +1150,7 @@ _081082BA:\n\
mov r4, sp\n\
add r4, r8\n\
ldr r2, _08108358 @ =gBattleMoveDamage\n\
- ldr r0, _08108334 @ =0x02016800\n\
+ ldr r0, _08108334 @ =gSharedMem + 0x16800\n\
adds r0, 0x18\n\
adds r0, r6, r0\n\
ldrb r1, [r0]\n\
@@ -1166,7 +1168,7 @@ _081082BA:\n\
_08108328: .4byte sDiscouragedPowerfulMoveEffects\n\
_0810832C: .4byte 0x0000ffff\n\
_08108330: .4byte gBattleMoves\n\
-_08108334: .4byte 0x02016800\n\
+_08108334: .4byte gSharedMem + 0x16800\n\
_08108338: .4byte gDynamicBasePower\n\
_0810833C: .4byte 0xfffff81c\n\
_08108340: .4byte gBattleMoveFlags\n\
@@ -1186,7 +1188,7 @@ _08108364:\n\
cmp r6, 0x3\n\
ble _08108276\n\
movs r6, 0\n\
- ldr r1, _081083A4 @ =0x02016800\n\
+ ldr r1, _081083A4 @ =gSharedMem + 0x16800\n\
ldrb r0, [r1, 0x1]\n\
lsls r0, 2\n\
add r0, sp\n\
@@ -1217,7 +1219,7 @@ _0810839A:\n\
str r0, [r5, 0x8]\n\
b _081083B8\n\
.align 2, 0\n\
-_081083A4: .4byte 0x02016800\n\
+_081083A4: .4byte gSharedMem + 0x16800\n\
_081083A8: .4byte gAIScriptPtr\n\
_081083AC:\n\
movs r0, 0x1\n\
@@ -1258,7 +1260,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 +1268,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, TRUE) == 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, TRUE) != gAIScriptPtr[1])
+ gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
}
@@ -1319,7 +1321,7 @@ static void BattleAICmd_count_alive_pokemon(void)
u32 status;
var = gBattlePartyID[index];
status = GetBankIdentity(index) ^ 2;
- var2 = gBattlePartyID[GetBankByPlayerAI(status)];
+ var2 = gBattlePartyID[GetBankByIdentity(status)];
}
else
{
@@ -1486,7 +1488,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 +1519,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 +1529,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 +1555,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 +1567,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 +1587,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 +1595,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 +1610,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 +1625,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 +1640,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 +1655,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 +1684,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 +1711,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 +1733,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 +1745,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 +1767,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 +1779,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 +1798,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 +1809,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 +1829,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 +1858,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 +1868,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 +1881,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 +1889,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 +1910,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;
}
@@ -1997,8 +1999,7 @@ static void BattleAICmd_get_used_item(void)
else
index = gBankTarget;
- // this hack and a half matches. whatever. i dont care. someone else fix this mess later. PS: still cant fix this.
- AI_THINKING_STRUCT->funcResult = ewram[MULTI_DIM_ARR(index, B_16, 0x160CC)];
+ AI_THINKING_STRUCT->funcResult = AI_ARRAY_160CC(index);
gAIScriptPtr += 2;
}
@@ -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/battle_anim.c b/src/battle/battle_anim.c
new file mode 100644
index 000000000..a0c74be1d
--- /dev/null
+++ b/src/battle/battle_anim.c
@@ -0,0 +1,1999 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "battle.h"
+#include "battle_anim_80CA710.h"
+#include "battle_interface.h"
+#include "contest.h"
+#include "decompress.h"
+#include "m4a.h"
+#include "main.h"
+#include "palette.h"
+#include "rom_8077ABC.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+#include "ewram.h"
+
+// sprites start at 10000 and thus must be subtracted of 10000 to account for the true index.
+#define GET_TRUE_SPRITE_INDEX(i) (i - 10000)
+
+#define ANIM_SPRITE_INDEX_COUNT 8
+#define ANIM_ARGS_COUNT 8
+
+extern u16 gBattlePartyID[4];
+extern u8 gObjectBankIDs[];
+extern u8 gBankAttacker;
+extern u8 gBankTarget;
+EWRAM_DATA const u8 *sBattleAnimScriptPtr = NULL;
+EWRAM_DATA const u8 *gBattleAnimScriptRetAddr = NULL;
+EWRAM_DATA void (*gAnimScriptCallback)(void) = NULL;
+EWRAM_DATA s8 gAnimFramesToWait = 0;
+EWRAM_DATA u8 gAnimScriptActive = FALSE;
+EWRAM_DATA u8 gAnimVisualTaskCount = 0;
+EWRAM_DATA u8 gAnimSoundTaskCount = 0;
+EWRAM_DATA struct DisableStruct *gAnimDisableStructPtr = NULL;
+EWRAM_DATA u32 gAnimMoveDmg = 0;
+EWRAM_DATA u16 gAnimMovePower = 0;
+EWRAM_DATA u8 gAnimFriendship = 0;
+EWRAM_DATA u16 gWeatherMoveAnim = 0;
+EWRAM_DATA u8 gMonAnimTaskIdArray[2] = {0};
+EWRAM_DATA u8 gAnimMoveTurn = 0;
+EWRAM_DATA u8 sAnimBackgroundFadeState = 0;
+EWRAM_DATA u16 sAnimMoveIndex = 0; // set but unused.
+EWRAM_DATA u8 gAnimBankAttacker = 0;
+EWRAM_DATA u8 gAnimBankTarget = 0;
+EWRAM_DATA u16 gAnimSpeciesByBanks[4] = {0};
+EWRAM_DATA u8 gUnknown_0202F7D2 = 0; // some global pan variable
+extern u16 gBattle_BG1_Y;
+extern u16 gBattle_WIN1H;
+extern u16 gBattle_WIN0V;
+extern u16 gBattle_WIN1V;
+extern u16 gBattle_BG2_Y;
+extern u16 gBattle_BG2_X;
+extern u16 gBattle_BG1_X;
+extern u16 gBattle_WIN0H;
+
+u16 gSoundAnimFramesToWait;
+s16 gBattleAnimArgs[ANIM_ARGS_COUNT];
+u16 gAnimSpriteIndexArray[ANIM_SPRITE_INDEX_COUNT];
+
+extern struct MusicPlayerInfo gMPlay_BGM;
+extern struct MusicPlayerInfo gMPlay_SE1;
+extern struct MusicPlayerInfo gMPlay_SE2;
+
+extern const u16 gUnknown_081C7160[];
+extern const u8 *const gBattleAnims_Moves[];
+extern const struct CompressedSpriteSheet gBattleAnimPicTable[];
+extern const struct CompressedSpritePalette gBattleAnimPaletteTable[];
+extern const struct BattleAnimBackground gBattleAnimBackgroundTable[];
+
+static void RunAnimScriptCommand(void);
+static void ScriptCmd_loadspritegfx(void);
+static void ScriptCmd_unloadspritegfx(void);
+static void ScriptCmd_createsprite(void);
+static void ScriptCmd_createvisualtask(void);
+static void ScriptCmd_delay(void);
+static void ScriptCmd_waitforvisualfinish(void);
+static void ScriptCmd_hang1(void);
+static void ScriptCmd_hang2(void);
+static void ScriptCmd_end(void);
+static void ScriptCmd_playse(void);
+static void ScriptCmd_monbg(void);
+static void sub_8076380(void);
+static void task_pA_ma0A_obj_to_bg_pal(u8);
+static void ScriptCmd_clearmonbg(void);
+static void sub_807672C(u8);
+static void ScriptCmd_monbg_22(void);
+static void ScriptCmd_clearmonbg_23(void);
+static void sub_80769A4(u8);
+static void ScriptCmd_setalpha(void);
+static void ScriptCmd_setbldcnt(void);
+static void ScriptCmd_blendoff(void);
+static void ScriptCmd_call(void);
+static void ScriptCmd_return(void);
+static void ScriptCmd_setarg(void);
+static void ScriptCmd_choosetwoturnanim(void);
+static void ScriptCmd_jumpifmoveturn(void);
+static void ScriptCmd_jump(void);
+static void ScriptCmd_fadetobg(void);
+static void ScriptCmd_fadetobgfromset(void);
+static void Task_FadeToBg(u8);
+static void LoadMoveBg(u16);
+static void LoadDefaultBg(void);
+static void ScriptCmd_restorebg(void);
+static void ScriptCmd_waitbgfadeout(void);
+static void ScriptCmd_waitbgfadein(void);
+static void ScriptCmd_changebg(void);
+static void ScriptCmd_playsewithpan(void);
+static void ScriptCmd_setpan(void);
+static void ScriptCmd_panse_1B(void);
+static void Task_PanFromInitialToTarget(u8);
+static void ScriptCmd_panse_26(void);
+static void ScriptCmd_panse_27(void);
+static void ScriptCmd_loopsewithpan(void);
+static void Task_LoopAndPlaySE(u8);
+static void ScriptCmd_waitplaysewithpan(void);
+static void Task_WaitAndPlaySE(u8);
+static void ScriptCmd_createsoundtask(void);
+static void ScriptCmd_waitsound(void);
+static void ScriptCmd_jumpargeq(void);
+static void ScriptCmd_jumpifcontest(void);
+static void ScriptCmd_monbgprio_28(void);
+static void ScriptCmd_monbgprio_29(void);
+static void ScriptCmd_monbgprio_2A(void);
+static void ScriptCmd_invisible(void);
+static void ScriptCmd_visible(void);
+static void ScriptCmd_doublebattle_2D(void);
+static void ScriptCmd_doublebattle_2E(void);
+static void ScriptCmd_stopsound(void);
+
+static void (*const sScriptCmdTable[])(void) = {
+ ScriptCmd_loadspritegfx,
+ ScriptCmd_unloadspritegfx,
+ ScriptCmd_createsprite,
+ ScriptCmd_createvisualtask,
+ ScriptCmd_delay,
+ ScriptCmd_waitforvisualfinish,
+ ScriptCmd_hang1,
+ ScriptCmd_hang2,
+ ScriptCmd_end,
+ ScriptCmd_playse,
+ ScriptCmd_monbg,
+ ScriptCmd_clearmonbg,
+ ScriptCmd_setalpha,
+ ScriptCmd_blendoff,
+ ScriptCmd_call,
+ ScriptCmd_return,
+ ScriptCmd_setarg,
+ ScriptCmd_choosetwoturnanim,
+ ScriptCmd_jumpifmoveturn,
+ ScriptCmd_jump,
+ ScriptCmd_fadetobg,
+ ScriptCmd_restorebg,
+ ScriptCmd_waitbgfadeout,
+ ScriptCmd_waitbgfadein,
+ ScriptCmd_changebg,
+ ScriptCmd_playsewithpan,
+ ScriptCmd_setpan,
+ ScriptCmd_panse_1B,
+ ScriptCmd_loopsewithpan,
+ ScriptCmd_waitplaysewithpan,
+ ScriptCmd_setbldcnt,
+ ScriptCmd_createsoundtask,
+ ScriptCmd_waitsound,
+ ScriptCmd_jumpargeq,
+ ScriptCmd_monbg_22,
+ ScriptCmd_clearmonbg_23,
+ ScriptCmd_jumpifcontest,
+ ScriptCmd_fadetobgfromset,
+ ScriptCmd_panse_26,
+ ScriptCmd_panse_27,
+ ScriptCmd_monbgprio_28,
+ ScriptCmd_monbgprio_29,
+ ScriptCmd_monbgprio_2A,
+ ScriptCmd_invisible,
+ ScriptCmd_visible,
+ ScriptCmd_doublebattle_2D,
+ ScriptCmd_doublebattle_2E,
+ ScriptCmd_stopsound,
+};
+
+void ClearBattleAnimationVars(void)
+{
+ s32 i;
+
+ gAnimFramesToWait = 0;
+ gAnimScriptActive = FALSE;
+ gAnimVisualTaskCount = 0;
+ gAnimSoundTaskCount = 0;
+ gAnimDisableStructPtr = NULL;
+ gAnimMoveDmg = 0;
+ gAnimMovePower = 0;
+ gAnimFriendship = 0;
+
+ // clear index array.
+ for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++)
+ gAnimSpriteIndexArray[i] |= 0xFFFF;
+
+ // clear anim args.
+ for (i = 0; i < ANIM_ARGS_COUNT; i++)
+ gBattleAnimArgs[i] = 0;
+
+ gMonAnimTaskIdArray[0] = 0xFF;
+ gMonAnimTaskIdArray[1] = 0xFF;
+ gAnimMoveTurn = 0;
+ sAnimBackgroundFadeState = 0;
+ sAnimMoveIndex = 0;
+ gAnimBankAttacker = 0;
+ gAnimBankTarget = 0;
+ gUnknown_0202F7D2 = 0;
+}
+
+void DoMoveAnim(u16 move)
+{
+ gAnimBankAttacker = gBankAttacker;
+ gAnimBankTarget = gBankTarget;
+ LaunchBattleAnimation(gBattleAnims_Moves, move, TRUE);
+}
+
+void LaunchBattleAnimation(const u8 *const moveAnims[], u16 move, u8 isMoveAnim)
+{
+ s32 i;
+
+ if (!IsContest())
+ {
+ sub_8079E24();
+ UpdateOamPriorityInAllHealthboxes(0);
+ for (i = 0; i < 4; i++)
+ {
+ if (GetBankSide(i) != 0)
+ gAnimSpeciesByBanks[i] = GetMonData(&gEnemyParty[gBattlePartyID[i]], MON_DATA_SPECIES);
+ else
+ gAnimSpeciesByBanks[i] = GetMonData(&gPlayerParty[gBattlePartyID[i]], MON_DATA_SPECIES);
+ }
+ }
+ else
+ {
+ for (i = 0; i < 4; i++)
+ gAnimSpeciesByBanks[i] = EWRAM_19348;
+ }
+
+ if (isMoveAnim == 0)
+ sAnimMoveIndex = 0;
+ else
+ sAnimMoveIndex = move;
+
+ for (i = 0; i < ANIM_ARGS_COUNT; i++)
+ gBattleAnimArgs[i] = 0;
+
+ gMonAnimTaskIdArray[0] = 0xFF;
+ gMonAnimTaskIdArray[1] = 0xFF;
+ sBattleAnimScriptPtr = moveAnims[move];
+ gAnimScriptActive = TRUE;
+ gAnimFramesToWait = 0;
+ gAnimScriptCallback = RunAnimScriptCommand;
+
+ for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++)
+ gAnimSpriteIndexArray[i] |= 0xFFFF;
+
+ if (isMoveAnim)
+ {
+ for (i = 0; gUnknown_081C7160[i] != 0xFFFF; i++)
+ {
+ if (move == gUnknown_081C7160[i])
+ {
+ m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 128);
+ break;
+ }
+ }
+ }
+
+ gBattle_WIN0H = 0;
+ gBattle_WIN0V = 0;
+ gBattle_WIN1H = 0;
+ gBattle_WIN1V = 0;
+}
+
+void DestroyAnimSprite(struct Sprite *sprite)
+{
+ FreeSpriteOamMatrix(sprite);
+ DestroySprite(sprite);
+ gAnimVisualTaskCount--;
+}
+
+void DestroyAnimVisualTask(u8 taskId)
+{
+ DestroyTask(taskId);
+ gAnimVisualTaskCount--;
+}
+
+void DestroyAnimSoundTask(u8 taskId)
+{
+ DestroyTask(taskId);
+ gAnimSoundTaskCount--;
+}
+
+static void AddSpriteIndex(u16 index)
+{
+ s32 i;
+
+ for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++)
+ {
+ if (gAnimSpriteIndexArray[i] == 0xFFFF)
+ {
+ gAnimSpriteIndexArray[i] = index;
+ return;
+ }
+ }
+}
+
+static void ClearSpriteIndex(u16 index)
+{
+ s32 i;
+
+ for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++)
+ {
+ if (gAnimSpriteIndexArray[i] == index)
+ {
+ gAnimSpriteIndexArray[i] |= 0xFFFF;
+ return;
+ }
+ }
+}
+
+static void WaitAnimFrameCount(void)
+{
+ if (gAnimFramesToWait <= 0)
+ {
+ gAnimScriptCallback = RunAnimScriptCommand;
+ gAnimFramesToWait = 0;
+ }
+ else
+ {
+ gAnimFramesToWait--;
+ }
+}
+
+static void RunAnimScriptCommand(void)
+{
+ do
+ {
+ sScriptCmdTable[T1_READ_8(sBattleAnimScriptPtr)]();
+ } while (gAnimFramesToWait == 0 && gAnimScriptActive);
+}
+
+static void ScriptCmd_loadspritegfx(void)
+{
+ u16 index;
+
+ sBattleAnimScriptPtr++;
+ index = T1_READ_16(sBattleAnimScriptPtr);
+ LoadCompressedObjectPic(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)]);
+ LoadCompressedObjectPalette(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(index)]);
+ sBattleAnimScriptPtr += 2;
+ AddSpriteIndex(GET_TRUE_SPRITE_INDEX(index));
+ gAnimFramesToWait = 1;
+ gAnimScriptCallback = WaitAnimFrameCount;
+}
+
+static void ScriptCmd_unloadspritegfx(void)
+{
+ u16 index;
+
+ sBattleAnimScriptPtr++;
+ index = T1_READ_16(sBattleAnimScriptPtr);
+ FreeSpriteTilesByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag);
+ FreeSpritePaletteByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag);
+ sBattleAnimScriptPtr += 2;
+ ClearSpriteIndex(GET_TRUE_SPRITE_INDEX(index));
+}
+
+static void ScriptCmd_createsprite(void)
+{
+ s32 i;
+ const struct SpriteTemplate *template;
+ u8 argVar;
+ u8 argsCount;
+ s16 subpriority;
+
+ sBattleAnimScriptPtr++;
+ template = (const struct SpriteTemplate *)(T2_READ_32(sBattleAnimScriptPtr));
+ sBattleAnimScriptPtr += 4;
+
+ argVar = T1_READ_8(sBattleAnimScriptPtr);
+ sBattleAnimScriptPtr++;
+
+ argsCount = T1_READ_8(sBattleAnimScriptPtr);
+ sBattleAnimScriptPtr++;
+ for (i = 0; i < argsCount; i++)
+ {
+ gBattleAnimArgs[i] = T1_READ_16(sBattleAnimScriptPtr);
+ sBattleAnimScriptPtr += 2;
+ }
+
+ if (argVar & 0x80)
+ {
+ argVar ^= 0x80;
+ if (argVar >= 0x40)
+ argVar -= 0x40;
+ else
+ argVar *= -1;
+
+ subpriority = sub_8079E90(gAnimBankTarget) + (s8)(argVar);
+ }
+ else
+ {
+ if (argVar >= 0x40)
+ argVar -= 0x40;
+ else
+ argVar *= -1;
+
+ subpriority = sub_8079E90(gAnimBankAttacker) + (s8)(argVar);
+ }
+
+ if (subpriority < 3)
+ subpriority = 3;
+
+ CreateSpriteAndAnimate(template, GetBankPosition(gAnimBankTarget, 2), GetBankPosition(gAnimBankTarget, 3), subpriority);
+ gAnimVisualTaskCount++;
+}
+
+static void ScriptCmd_createvisualtask(void)
+{
+ TaskFunc taskFunc;
+ u8 taskPriority;
+ u8 taskId;
+ u8 numArgs;
+ s32 i;
+
+ sBattleAnimScriptPtr++;
+
+ taskFunc = (TaskFunc)T2_READ_32(sBattleAnimScriptPtr);
+ sBattleAnimScriptPtr += 4;
+
+ taskPriority = T1_READ_8(sBattleAnimScriptPtr);
+ sBattleAnimScriptPtr++;
+
+ numArgs = T1_READ_8(sBattleAnimScriptPtr);
+ sBattleAnimScriptPtr++;
+
+ for (i = 0; i < numArgs; i++)
+ {
+ gBattleAnimArgs[i] = T1_READ_16(sBattleAnimScriptPtr);
+ sBattleAnimScriptPtr += 2;
+ }
+
+ taskId = CreateTask(taskFunc, taskPriority);
+ taskFunc(taskId);
+ gAnimVisualTaskCount++;
+}
+
+static void ScriptCmd_delay(void)
+{
+ sBattleAnimScriptPtr++;
+ gAnimFramesToWait = T1_READ_8(sBattleAnimScriptPtr);
+ if (gAnimFramesToWait == 0)
+ gAnimFramesToWait = -1;
+ sBattleAnimScriptPtr++;
+ gAnimScriptCallback = WaitAnimFrameCount;
+}
+
+// wait for visual tasks to finish.
+static void ScriptCmd_waitforvisualfinish(void)
+{
+ if (gAnimVisualTaskCount == 0)
+ {
+ sBattleAnimScriptPtr++;
+ gAnimFramesToWait = 0;
+ }
+ else
+ {
+ gAnimFramesToWait = 1;
+ }
+}
+
+static void ScriptCmd_hang1(void)
+{
+}
+
+static void ScriptCmd_hang2(void)
+{
+}
+
+static void ScriptCmd_end(void)
+{
+ s32 i;
+ bool32 continuousAnim = FALSE;
+
+ // keep waiting as long as there is animations to be done.
+ if (gAnimVisualTaskCount != 0 || gAnimSoundTaskCount != 0
+ || gMonAnimTaskIdArray[0] != 0xFF || gMonAnimTaskIdArray[1] != 0xFF)
+ {
+ gSoundAnimFramesToWait = 0;
+ gAnimFramesToWait = 1;
+ return;
+ }
+
+ // finish the sound effects.
+ if (IsSEPlaying())
+ {
+ if (++gSoundAnimFramesToWait <= 90) // wait 90 frames, then halt the sound effect.
+ {
+ gAnimFramesToWait = 1;
+ return;
+ }
+ else
+ {
+ m4aMPlayStop(&gMPlay_SE1);
+ m4aMPlayStop(&gMPlay_SE2);
+ }
+ }
+
+ // the SE has halted, so set the SE Frame Counter to 0 and continue.
+ gSoundAnimFramesToWait = 0;
+
+ for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++)
+ {
+ if (gAnimSpriteIndexArray[i] != 0xFFFF)
+ {
+ FreeSpriteTilesByTag(gBattleAnimPicTable[gAnimSpriteIndexArray[i]].tag);
+ FreeSpritePaletteByTag(gBattleAnimPicTable[gAnimSpriteIndexArray[i]].tag);
+ gAnimSpriteIndexArray[i] |= 0xFFFF; // set terminator.
+ }
+ }
+
+ if (!continuousAnim) // may have been used for debug?
+ {
+ m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 256);
+ if (IsContest() == 0)
+ {
+ sub_8079E24();
+ UpdateOamPriorityInAllHealthboxes(1);
+ }
+ gAnimScriptActive = FALSE;
+ }
+}
+
+static void ScriptCmd_playse(void)
+{
+ sBattleAnimScriptPtr++;
+ PlaySE(T1_READ_16(sBattleAnimScriptPtr));
+ sBattleAnimScriptPtr += 2;
+}
+
+static void ScriptCmd_monbg(void)
+{
+ u8 animBank;
+ u8 bank;
+ u8 identity;
+ bool8 toBG_2;
+ u16 r4;
+ u8 taskId;
+
+ sBattleAnimScriptPtr++;
+ animBank = T1_READ_8(sBattleAnimScriptPtr);
+ if (animBank == ANIM_BANK_ATTACKER)
+ animBank = ANIM_BANK_ATK_PARTNER;
+ else if (animBank == ANIM_BANK_TARGET)
+ animBank = ANIM_BANK_DEF_PARTNER;
+
+ if (animBank == ANIM_BANK_ATTACKER || animBank == ANIM_BANK_ATK_PARTNER)
+ bank = gAnimBankAttacker;
+ else
+ bank = gAnimBankTarget;
+
+ if (IsAnimBankSpriteVisible(bank))
+ {
+ identity = GetBankIdentity(bank);
+ identity += 0xFF;
+ if (identity <= 1 || IsContest() != 0)
+ toBG_2 = 0;
+ else
+ toBG_2 = 1;
+
+ sub_8076034(bank, toBG_2);
+ r4 = gObjectBankIDs[bank];
+ taskId = CreateTask(task_pA_ma0A_obj_to_bg_pal, 10);
+ gTasks[taskId].data[0] = r4;
+ gTasks[taskId].data[1] = gSprites[r4].pos1.x + gSprites[r4].pos2.x;
+ gTasks[taskId].data[2] = gSprites[r4].pos1.y + gSprites[r4].pos2.y;
+ if (toBG_2 == 0)
+ {
+ gTasks[taskId].data[3] = gBattle_BG1_X;
+ gTasks[taskId].data[4] = gBattle_BG1_Y;
+ }
+ else
+ {
+ gTasks[taskId].data[3] = gBattle_BG2_X;
+ gTasks[taskId].data[4] = gBattle_BG2_Y;
+ }
+ gTasks[taskId].data[5] = toBG_2;
+ gTasks[taskId].data[6] = bank;
+ gMonAnimTaskIdArray[0] = taskId;
+
+ }
+ bank ^= 2;
+ if (animBank > 1 && IsAnimBankSpriteVisible(bank))
+ {
+ identity = GetBankIdentity(bank);
+ identity += 0xFF;
+ if (identity <= 1 || IsContest() != 0)
+ toBG_2 = 0;
+ else
+ toBG_2 = 1;
+ sub_8076034(bank, toBG_2);
+ r4 = gObjectBankIDs[bank];
+ taskId = CreateTask(task_pA_ma0A_obj_to_bg_pal, 10);
+ gTasks[taskId].data[0] = r4;
+ gTasks[taskId].data[1] = gSprites[r4].pos1.x + gSprites[r4].pos2.x;
+ gTasks[taskId].data[2] = gSprites[r4].pos1.y + gSprites[r4].pos2.y;
+ if (toBG_2 == 0)
+ {
+ gTasks[taskId].data[3] = gBattle_BG1_X;
+ gTasks[taskId].data[4] = gBattle_BG1_Y;
+ }
+ else
+ {
+ gTasks[taskId].data[3] = gBattle_BG2_X;
+ gTasks[taskId].data[4] = gBattle_BG2_Y;
+ }
+
+ gTasks[taskId].data[5] = toBG_2;
+ gTasks[taskId].data[6] = bank;
+ gMonAnimTaskIdArray[1] = taskId;
+ }
+
+ sBattleAnimScriptPtr++;
+}
+
+bool8 IsAnimBankSpriteVisible(u8 bank)
+{
+ if (IsContest())
+ {
+ if (bank == gAnimBankAttacker)
+ return TRUE;
+ else
+ return FALSE;
+ }
+ if (!IsBankSpritePresent(bank))
+ return FALSE;
+ if (IsContest())
+ return TRUE; // this line wont ever be reached.
+ if (!(EWRAM_17800[bank].unk0 & 1) || !gSprites[gObjectBankIDs[bank]].invisible)
+ return TRUE;
+
+ return FALSE;
+}
+
+void sub_8076034(u8 a, u8 b)
+{
+ volatile u8 pointlessZero;
+ u16 *addr2;
+ u8 spriteId;
+
+ if (b == 0)
+ {
+ struct UnknownStruct2 s;
+ u8 *addr;
+ u32 size;
+ u8 r2;
+ u16 *addr3;
+
+ sub_8078914(&s);
+ addr = s.unk0;
+ size = 0x2000;
+ while (1)
+ {
+ DmaFill32(3, 0, addr, 0x1000);
+ addr += 0x1000;
+ size -= 0x1000;
+ if (size <= 0x1000)
+ {
+ DmaFill32(3, 0, addr, size);
+ break;
+ }
+ }
+ pointlessZero = 0;
+ pointlessZero = 0;
+ addr2 = (void *)s.unk4;
+ DmaFill16(3, 0xFF, addr2, 0x1000);
+
+ REG_BG1CNT_BITFIELD.priority = 2;
+ REG_BG1CNT_BITFIELD.screenSize = 1;
+ REG_BG1CNT_BITFIELD.areaOverflowMode = 0;
+
+ spriteId = gObjectBankIDs[a];
+ gBattle_BG1_X = -(gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x) + 32;
+ if (IsContest() != 0 && IsSpeciesNotUnown(EWRAM_19348) != 0)
+ gBattle_BG1_X--;
+ gBattle_BG1_Y = -(gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y) + 32;
+ gSprites[gObjectBankIDs[a]].invisible = TRUE;
+
+ REG_BG1HOFS = gBattle_BG1_X;
+ REG_BG1VOFS = gBattle_BG1_Y;
+
+ LoadPalette(gPlttBufferUnfaded + 0x100 + a * 16, s.unk8 * 16, 32);
+ addr3 = (u16 *)PLTT + s.unk8 * 16;
+ DmaCopy32(3, gPlttBufferUnfaded + 0x100 + a * 16, addr3, 32);
+
+ if (IsContest() != 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)
+ sub_8076380();
+ }
+ else
+ {
+ u8 *addr;
+ u32 size;
+ u16 *addr3;
+
+ addr = (void *)(VRAM + 0x6000);
+ size = 0x2000;
+ while (1)
+ {
+ DmaFill32(3, 0, addr, 0x1000);
+ addr += 0x1000;
+ size -= 0x1000;
+ if (size <= 0x1000)
+ {
+ DmaFill32(3, 0, addr, size);
+ break;
+ }
+ }
+ pointlessZero = 0;
+ pointlessZero = 0;
+ addr2 = (void *)(VRAM + 0xF000);
+ DmaFill32(3, 0, addr2, 0x800);
+
+ REG_BG2CNT_BITFIELD.priority = 2;
+ REG_BG2CNT_BITFIELD.screenSize = 1;
+ REG_BG2CNT_BITFIELD.areaOverflowMode = 0;
+
+ spriteId = gObjectBankIDs[a];
+ gBattle_BG2_X = -(gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x) + 32;
+ gBattle_BG2_Y = -(gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y) + 32;
+ gSprites[gObjectBankIDs[a]].invisible = TRUE;
+
+ REG_BG2HOFS = gBattle_BG2_X;
+ REG_BG2VOFS = gBattle_BG2_Y;
+
+ LoadPalette(gPlttBufferUnfaded + 0x100 + a * 16, 0x90, 32);
+ addr3 = (void *)(PLTT + 0x120);
+ DmaCopy32(3, gPlttBufferUnfaded + 0x100 + a * 16, addr3, 32);
+
+ sub_80E4EF8(0, 0, GetBankIdentity(a), 9, 0x6000, 0x1E, REG_BG2CNT_BITFIELD.charBaseBlock);
+ }
+}
+
+static void sub_8076380(void)
+{
+ int i;
+ int j;
+ struct UnknownStruct2 s;
+ u16 *ptr;
+
+ if (IsSpeciesNotUnown(EWRAM_19348))
+ {
+ sub_8078914(&s);
+ ptr = s.unk4;
+ for (i = 0; i < 8; i++)
+ {
+ for (j = 0; j < 4; j++)
+ {
+ u16 temp = ptr[j + i * 32];
+
+ ptr[j + i * 32] = ptr[7 - j + i * 32];
+ ptr[7 - j + i * 32] = temp;
+ }
+ }
+ for (i = 0; i < 8; i++)
+ {
+ for (j = 0; j < 8; j++)
+ ptr[j + i * 32] ^= 0x400;
+ }
+ }
+}
+
+void sub_80763FC(u16 a, u16 *b, u32 c, u8 d)
+{
+ u8 i;
+ u8 j;
+ u32 r9;
+
+ if (d == 0)
+ r9 = 32;
+ else
+ r9 = 64;
+ a <<= 12;
+ for (i = 0; i < r9; i++)
+ {
+ for (j = 0; j < 32; j++)
+ b[j + i * 32] = ((b[j + i * 32] & 0xFFF) | a) + c;
+ }
+}
+
+void sub_8076464(u8 a)
+{
+ u8 *addr;
+ u32 size;
+ volatile u8 pointlessZero;
+ struct UnknownStruct2 s;
+
+ sub_8078914(&s);
+ if (a == 0 || IsContest() != 0)
+ {
+ u16 *addr2;
+
+ addr = s.unk0;
+ size = 0x2000;
+ while (1)
+ {
+ DmaFill32(3, 0, addr, 0x1000);
+ addr += 0x1000;
+ size -= 0x1000;
+ if (size <= 0x1000)
+ {
+ DmaFill32(3, 0, addr, size);
+ break;
+ }
+ }
+ pointlessZero = 0;
+ pointlessZero = 0;
+ addr2 = s.unk4;
+ DmaFill32(3, 0, addr2, 0x800);
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ }
+ else
+ {
+ u16 *addr2;
+
+ addr = (void *)(VRAM + 0x6000);
+ size = 0x2000;
+ while (1)
+ {
+ DmaFill32(3, 0, addr, 0x1000);
+ addr += 0x1000;
+ size -= 0x1000;
+ if (size <= 0x1000)
+ {
+ DmaFill32(3, 0, addr, size);
+ break;
+ }
+ }
+ pointlessZero = 0;
+ pointlessZero = 0;
+ addr2 = (void *)(VRAM + 0xF000);
+ DmaFill32(3, 0, addr2, 0x800);
+ gBattle_BG2_X = 0;
+ gBattle_BG2_Y = 0;
+ }
+}
+
+static void task_pA_ma0A_obj_to_bg_pal(u8 taskId)
+{
+ u8 spriteId, palIndex;
+ s16 x, y;
+ struct UnknownStruct2 s;
+
+ spriteId = gTasks[taskId].data[0];
+ palIndex = gTasks[taskId].data[6];
+ sub_8078914(&s);
+ x = gTasks[taskId].data[1] - (gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x);
+ y = gTasks[taskId].data[2] - (gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y);
+
+ if (gTasks[taskId].data[5] == 0)
+ {
+ u16 *src;
+ u16 *dst;
+
+ gBattle_BG1_X = x + gTasks[taskId].data[3];
+ gBattle_BG1_Y = y + gTasks[taskId].data[4];
+ src = gPlttBufferFaded + 0x100 + palIndex * 16;
+ dst = gPlttBufferFaded + 0x100 + s.unk8 * 16 - 256;
+ DmaCopy32(3, src, dst, 32);
+ }
+ else
+ {
+ u16 *src;
+ u16 *dst;
+
+ gBattle_BG2_X = x + gTasks[taskId].data[3];
+ gBattle_BG2_Y = y + gTasks[taskId].data[4];
+ src = gPlttBufferFaded + 0x100 + palIndex * 16;
+ dst = gPlttBufferFaded + 0x100 - 112;
+ DmaCopy32(3, src, dst, 32);
+ }
+}
+
+static void ScriptCmd_clearmonbg(void)
+{
+ u8 animBankId;
+ u8 bank;
+ u8 taskId;
+
+ sBattleAnimScriptPtr++;
+ animBankId = T1_READ_8(sBattleAnimScriptPtr);
+
+ if (animBankId == ANIM_BANK_ATTACKER)
+ animBankId = ANIM_BANK_ATK_PARTNER;
+ else if (animBankId == ANIM_BANK_TARGET)
+ animBankId = ANIM_BANK_DEF_PARTNER;
+
+ if (animBankId == ANIM_BANK_ATTACKER || animBankId == ANIM_BANK_ATK_PARTNER)
+ bank = gAnimBankAttacker;
+ else
+ bank = gAnimBankTarget;
+
+ if (gMonAnimTaskIdArray[0] != 0xFF)
+ gSprites[gObjectBankIDs[bank]].invisible = FALSE;
+ if (animBankId > 1 && gMonAnimTaskIdArray[1] != 0xFF)
+ gSprites[gObjectBankIDs[bank ^ 2]].invisible = FALSE;
+ else
+ animBankId = 0;
+
+ taskId = CreateTask(sub_807672C, 5);
+ gTasks[taskId].data[0] = animBankId;
+ gTasks[taskId].data[2] = bank;
+ sBattleAnimScriptPtr++;
+}
+
+static void sub_807672C(u8 taskId)
+{
+ u8 identity;
+ u8 to_BG2;
+
+ gTasks[taskId].data[1]++;
+ if (gTasks[taskId].data[1] != 1)
+ {
+ identity = GetBankIdentity(gTasks[taskId].data[2]);
+ identity += 0xFF;
+ if (identity <= 1 || IsContest() != 0)
+ to_BG2 = 0;
+ else
+ to_BG2 = 1;
+ if (gMonAnimTaskIdArray[0] != 0xFF)
+ {
+ sub_8076464(to_BG2);
+ DestroyTask(gMonAnimTaskIdArray[0]);
+ gMonAnimTaskIdArray[0] = 0xFF;
+ }
+ if (gTasks[taskId].data[0] > 1)
+ {
+ sub_8076464(to_BG2 ^ 1);
+ DestroyTask(gMonAnimTaskIdArray[1]);
+ gMonAnimTaskIdArray[1] = 0xFF;
+ }
+ DestroyTask(taskId);
+ }
+}
+
+static void ScriptCmd_monbg_22(void)
+{
+ u8 animBankId;
+ u8 bank;
+ u8 identity;
+ u8 r1;
+
+ sBattleAnimScriptPtr++;
+ animBankId = T1_READ_8(sBattleAnimScriptPtr);
+
+ if (animBankId == ANIM_BANK_ATTACKER)
+ animBankId = ANIM_BANK_ATK_PARTNER;
+ else if (animBankId == ANIM_BANK_TARGET)
+ animBankId = ANIM_BANK_DEF_PARTNER;
+
+ if (animBankId == ANIM_BANK_ATTACKER || animBankId == ANIM_BANK_ATK_PARTNER)
+ bank = gAnimBankAttacker;
+ else
+ bank = gAnimBankTarget;
+
+ if (IsAnimBankSpriteVisible(bank))
+ {
+ identity = GetBankIdentity(bank);
+ identity += 0xFF;
+ if (identity <= 1 || IsContest() != 0)
+ r1 = 0;
+ else
+ r1 = 1;
+ sub_8076034(bank, r1);
+ gSprites[gObjectBankIDs[bank]].invisible = FALSE;
+ }
+
+ bank ^= 2;
+ if (animBankId > ANIM_BANK_TARGET && IsAnimBankSpriteVisible(bank))
+ {
+ identity = GetBankIdentity(bank);
+ identity += 0xFF;
+ if (identity <= 1 || IsContest() != 0)
+ r1 = 0;
+ else
+ r1 = 1;
+ sub_8076034(bank, r1);
+ gSprites[gObjectBankIDs[bank]].invisible = FALSE;
+ }
+ sBattleAnimScriptPtr++;
+}
+
+static void ScriptCmd_clearmonbg_23(void)
+{
+ u8 animBankId;
+ u8 bank;
+ u8 taskId;
+
+ sBattleAnimScriptPtr++;
+ animBankId = T1_READ_8(sBattleAnimScriptPtr);
+
+ if (animBankId == ANIM_BANK_ATTACKER)
+ animBankId = ANIM_BANK_ATK_PARTNER;
+ else if (animBankId == ANIM_BANK_TARGET)
+ animBankId = ANIM_BANK_DEF_PARTNER;
+
+ if (animBankId == ANIM_BANK_ATTACKER || animBankId == ANIM_BANK_ATK_PARTNER)
+ bank = gAnimBankAttacker;
+ else
+ bank = gAnimBankTarget;
+
+ if (IsAnimBankSpriteVisible(bank))
+ gSprites[gObjectBankIDs[bank]].invisible = FALSE;
+ if (animBankId > 1 && IsAnimBankSpriteVisible(bank ^ 2))
+ gSprites[gObjectBankIDs[bank ^ 2]].invisible = FALSE;
+ else
+ animBankId = 0;
+
+ taskId = CreateTask(sub_80769A4, 5);
+ gTasks[taskId].data[0] = animBankId;
+ gTasks[taskId].data[2] = bank;
+
+ sBattleAnimScriptPtr++;
+}
+
+static void sub_80769A4(u8 taskId)
+{
+ u8 identity;
+ u8 bank;
+ u8 toBG_2;
+
+ gTasks[taskId].data[1]++;
+ if (gTasks[taskId].data[1] != 1)
+ {
+ bank = gTasks[taskId].data[2];
+ identity = GetBankIdentity(bank);
+ identity += 0xFF;
+ if (identity <= 1 || IsContest() != 0)
+ toBG_2 = 0;
+ else
+ toBG_2 = 1;
+ if (IsAnimBankSpriteVisible(bank))
+ sub_8076464(toBG_2);
+ if (gTasks[taskId].data[0] > 1 && IsAnimBankSpriteVisible(bank ^ 2))
+ sub_8076464(toBG_2 ^ 1);
+ DestroyTask(taskId);
+ }
+}
+
+static void ScriptCmd_setalpha(void)
+{
+ u16 half1, half2;
+
+ sBattleAnimScriptPtr++;
+ half1 = *(sBattleAnimScriptPtr++);
+ half2 = *(sBattleAnimScriptPtr++) << 8;
+ REG_BLDCNT = 0x3F40;
+ REG_BLDALPHA = half1 | half2;
+}
+
+static void ScriptCmd_setbldcnt(void)
+{
+ u16 half1, half2;
+
+ sBattleAnimScriptPtr++;
+ half1 = *(sBattleAnimScriptPtr++);
+ half2 = *(sBattleAnimScriptPtr++) << 8;
+ REG_BLDCNT = half1 | half2;
+}
+
+static void ScriptCmd_blendoff(void)
+{
+ sBattleAnimScriptPtr++;
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+}
+
+static void ScriptCmd_call(void)
+{
+ sBattleAnimScriptPtr++;
+ gBattleAnimScriptRetAddr = sBattleAnimScriptPtr + 4;
+ sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr);
+}
+
+static void ScriptCmd_return(void)
+{
+ sBattleAnimScriptPtr = gBattleAnimScriptRetAddr;
+}
+
+static void ScriptCmd_setarg(void)
+{
+ const u8 *addr = sBattleAnimScriptPtr;
+ u16 value;
+ u8 argId;
+
+ sBattleAnimScriptPtr++;
+ argId = T1_READ_8(sBattleAnimScriptPtr);
+ sBattleAnimScriptPtr++;
+ value = T1_READ_16(sBattleAnimScriptPtr);
+ sBattleAnimScriptPtr = addr + 4;
+ gBattleAnimArgs[argId] = value;
+}
+
+static void ScriptCmd_choosetwoturnanim(void)
+{
+ sBattleAnimScriptPtr++;
+ if (gAnimMoveTurn & 1)
+ sBattleAnimScriptPtr += 4;
+ sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr);
+}
+
+static void ScriptCmd_jumpifmoveturn(void)
+{
+ u8 toCheck;
+
+ sBattleAnimScriptPtr++;
+ toCheck = T1_READ_8(sBattleAnimScriptPtr);
+ sBattleAnimScriptPtr++;
+
+ if (toCheck == gAnimMoveTurn)
+ {
+ sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr);
+ }
+ else
+ {
+ sBattleAnimScriptPtr += 4;
+ }
+}
+
+static void ScriptCmd_jump(void)
+{
+ sBattleAnimScriptPtr++;
+ sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr);
+}
+
+bool8 IsContest(void)
+{
+ if (!gMain.inBattle)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+#define tBackgroundId data[0]
+#define tState data[10]
+
+static void ScriptCmd_fadetobg(void)
+{
+ u8 backgroundId;
+ u8 taskId;
+
+ sBattleAnimScriptPtr++;
+ backgroundId = T1_READ_8(sBattleAnimScriptPtr);
+ sBattleAnimScriptPtr++;
+ taskId = CreateTask(Task_FadeToBg, 5);
+ gTasks[taskId].tBackgroundId = backgroundId;
+ sAnimBackgroundFadeState = 1;
+}
+
+static void ScriptCmd_fadetobgfromset(void)
+{
+ u8 bg1, bg2, bg3;
+ u8 taskId;
+
+ sBattleAnimScriptPtr++;
+ bg1 = sBattleAnimScriptPtr[0];
+ bg2 = sBattleAnimScriptPtr[1];
+ bg3 = sBattleAnimScriptPtr[2];
+ sBattleAnimScriptPtr += 3;
+ taskId = CreateTask(Task_FadeToBg, 5);
+
+ if (IsContest())
+ gTasks[taskId].tBackgroundId = bg3;
+ else if (GetBankSide(gAnimBankTarget) == 0)
+ gTasks[taskId].tBackgroundId = bg2;
+ else
+ gTasks[taskId].tBackgroundId = bg1;
+
+ sAnimBackgroundFadeState = 1;
+}
+
+static void Task_FadeToBg(u8 taskId)
+{
+ if (gTasks[taskId].tState == 0)
+ {
+ BeginHardwarePaletteFade(0xE8, 0, 0, 16, 0);
+ gTasks[taskId].tState++;
+ return;
+ }
+ if (gPaletteFade.active)
+ return;
+ if (gTasks[taskId].tState == 1)
+ {
+ gTasks[taskId].tState++;
+ sAnimBackgroundFadeState = 2;
+ }
+ else if (gTasks[taskId].tState == 2)
+ {
+ s16 bgId = (u16)gTasks[taskId].tBackgroundId;
+
+ if (bgId == -1)
+ LoadDefaultBg();
+ else
+ LoadMoveBg(bgId);
+
+ BeginHardwarePaletteFade(0xE8, 0, 16, 0, 1);
+ gTasks[taskId].tState++;
+ return;
+ }
+ if (gPaletteFade.active)
+ return;
+ if (gTasks[taskId].tState == 3)
+ {
+ DestroyTask(taskId);
+ sAnimBackgroundFadeState = 0;
+ }
+}
+
+static void LoadMoveBg(u16 bgId)
+{
+ if (IsContest())
+ {
+ void *tilemap = gBattleAnimBackgroundTable[bgId].tilemap;
+ void *dmaSrc;
+ void *dmaDest;
+
+ LZDecompressWram(tilemap, IsContest() ? EWRAM_14800 : EWRAM_18000);
+ sub_80763FC(sub_80789BC(), IsContest() ? EWRAM_14800 : EWRAM_18000, 0x100, 0);
+ dmaSrc = IsContest() ? EWRAM_14800 : EWRAM_18000;
+ dmaDest = (void *)(VRAM + 0xD000);
+ DmaCopy32(3, dmaSrc, dmaDest, 0x800);
+ LZDecompressVram(gBattleAnimBackgroundTable[bgId].image, (void *)(VRAM + 0x2000));
+ LoadCompressedPalette(gBattleAnimBackgroundTable[bgId].palette, sub_80789BC() * 16, 32);
+ }
+ else
+ {
+ LZDecompressVram(gBattleAnimBackgroundTable[bgId].tilemap, (void *)(VRAM + 0xD000));
+ LZDecompressVram(gBattleAnimBackgroundTable[bgId].image, (void *)(VRAM + 0x8000));
+ LoadCompressedPalette(gBattleAnimBackgroundTable[bgId].palette, 32, 32);
+ }
+}
+
+static void LoadDefaultBg(void)
+{
+ if (IsContest())
+ LoadContestBgAfterMoveAnim();
+ else
+ DrawMainBattleBackground();
+}
+
+static void ScriptCmd_restorebg(void)
+{
+ u8 taskId;
+
+ sBattleAnimScriptPtr++;
+ taskId = CreateTask(Task_FadeToBg, 5);
+ gTasks[taskId].tBackgroundId = 0xFFFF;
+ sAnimBackgroundFadeState = 1;
+}
+
+#undef tBackgroundId
+#undef tState
+
+static void ScriptCmd_waitbgfadeout(void)
+{
+ if (sAnimBackgroundFadeState == 2)
+ {
+ sBattleAnimScriptPtr++;
+ gAnimFramesToWait = 0;
+ }
+ else
+ {
+ gAnimFramesToWait = 1;
+ }
+}
+
+static void ScriptCmd_waitbgfadein(void)
+{
+ if (sAnimBackgroundFadeState == 0)
+ {
+ sBattleAnimScriptPtr++;
+ gAnimFramesToWait = 0;
+ }
+ else
+ {
+ gAnimFramesToWait = 1;
+ }
+}
+
+static void ScriptCmd_changebg(void)
+{
+ sBattleAnimScriptPtr++;
+ LoadMoveBg(T1_READ_8(sBattleAnimScriptPtr));
+ sBattleAnimScriptPtr++;
+}
+
+//Weird control flow
+/*
+s8 BattleAnimAdjustPanning(s8 a)
+{
+ if (!IsContest() && (EWRAM_17810[gAnimBankAttacker].unk0 & 0x10))
+ {
+ a = GetBankSide(gAnimBankAttacker) ? 0xC0 : 0x3F;
+ }
+ //_08076FDC
+ else
+ {
+ if (IsContest())
+ {
+ if (gAnimBankAttacker == gAnimBankTarget && gAnimBankAttacker == 2
+ && a == 0x3F)
+ {
+ //jump to _0807707A
+ if (a < -0x40)
+ a = 0xC0;
+ return a;
+ }
+ }
+ //_08077004
+ else
+ {
+ if (GetBankSide(gAnimBankAttacker) == 0)
+ {
+ if (GetBankSide(gAnimBankTarget) == 0)
+ }
+ //_08077042
+ else
+ {
+
+ }
+ //_0807706C
+ }
+ }
+ //_0807706E
+}
+*/
+__attribute__((naked))
+s8 BattleAnimAdjustPanning(s8 a)
+{
+ asm(".syntax unified\n\
+ push {r4,lr}\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ bl IsContest\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _08076FDC\n\
+ ldr r0, _08076FD4 @ =gAnimBankAttacker\n\
+ ldrb r2, [r0]\n\
+ lsls r0, r2, 1\n\
+ adds r0, r2\n\
+ lsls r0, 2\n\
+ ldr r1, _08076FD8 @ =gSharedMem + 0x17810\n\
+ adds r0, r1\n\
+ ldrb r1, [r0]\n\
+ movs r0, 0x10\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08076FDC\n\
+ adds r0, r2, 0\n\
+ bl GetBankSide\n\
+ lsls r0, 24\n\
+ movs r4, 0xC0\n\
+ cmp r0, 0\n\
+ beq _0807706E\n\
+ movs r4, 0x3F\n\
+ b _0807706E\n\
+ .align 2, 0\n\
+_08076FD4: .4byte gAnimBankAttacker\n\
+_08076FD8: .4byte gSharedMem + 0x17810\n\
+_08076FDC:\n\
+ bl IsContest\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _08077004\n\
+ ldr r0, _08076FFC @ =gAnimBankAttacker\n\
+ ldr r1, _08077000 @ =gAnimBankTarget\n\
+ ldrb r0, [r0]\n\
+ ldrb r1, [r1]\n\
+ cmp r0, r1\n\
+ bne _08077068\n\
+ cmp r0, 0x2\n\
+ bne _08077068\n\
+ cmp r4, 0x3F\n\
+ beq _0807707A\n\
+ b _08077068\n\
+ .align 2, 0\n\
+_08076FFC: .4byte gAnimBankAttacker\n\
+_08077000: .4byte gAnimBankTarget\n\
+_08077004:\n\
+ ldr r0, _0807702C @ =gAnimBankAttacker\n\
+ ldrb r0, [r0]\n\
+ bl GetBankSide\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _08077042\n\
+ ldr r0, _08077030 @ =gAnimBankTarget\n\
+ ldrb r0, [r0]\n\
+ bl GetBankSide\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _0807706E\n\
+ lsls r0, r4, 24\n\
+ asrs r1, r0, 24\n\
+ cmp r1, 0x3F\n\
+ bne _08077034\n\
+ movs r4, 0xC0\n\
+ b _0807706E\n\
+ .align 2, 0\n\
+_0807702C: .4byte gAnimBankAttacker\n\
+_08077030: .4byte gAnimBankTarget\n\
+_08077034:\n\
+ movs r0, 0x40\n\
+ negs r0, r0\n\
+ cmp r1, r0\n\
+ beq _0807706E\n\
+ negs r0, r1\n\
+ lsls r0, 24\n\
+ b _0807706C\n\
+_08077042:\n\
+ ldr r0, _08077064 @ =gAnimBankTarget\n\
+ ldrb r0, [r0]\n\
+ bl GetBankSide\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0x1\n\
+ bne _08077068\n\
+ lsls r0, r4, 24\n\
+ asrs r0, 24\n\
+ movs r1, 0x40\n\
+ negs r1, r1\n\
+ cmp r0, r1\n\
+ bne _0807706E\n\
+ movs r4, 0x3F\n\
+ b _0807706E\n\
+ .align 2, 0\n\
+_08077064: .4byte gAnimBankTarget\n\
+_08077068:\n\
+ lsls r0, r4, 24\n\
+ negs r0, r0\n\
+_0807706C:\n\
+ lsrs r4, r0, 24\n\
+_0807706E:\n\
+ lsls r0, r4, 24\n\
+ asrs r0, 24\n\
+ cmp r0, 0x3F\n\
+ ble _0807707A\n\
+ movs r4, 0x3F\n\
+ b _08077088\n\
+_0807707A:\n\
+ lsls r0, r4, 24\n\
+ asrs r0, 24\n\
+ movs r1, 0x40\n\
+ negs r1, r1\n\
+ cmp r0, r1\n\
+ bge _08077088\n\
+ movs r4, 0xC0\n\
+_08077088:\n\
+ lsls r0, r4, 24\n\
+ asrs r0, 24\n\
+ pop {r4}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .syntax divided\n");
+}
+
+s8 BattleAnimAdjustPanning2(s8 pan)
+{
+ if (!IsContest() && (EWRAM_17810[gAnimBankAttacker].unk0 & 0x10))
+ {
+ if (GetBankSide(gAnimBankAttacker) != 0)
+ pan = 0x3F;
+ else
+ pan = 0xC0;
+ }
+ else
+ {
+ if (GetBankSide(gAnimBankAttacker) != 0 || IsContest() != 0)
+ pan = -pan;
+ }
+ return pan;
+}
+
+s16 sub_8077104(s16 newPan, int oldPan)
+{
+ s16 var = newPan;
+
+ if (var > 63)
+ var = 63;
+ else if (var < -64)
+ var = -64;
+ return var;
+}
+
+s16 CalculatePanIncrement(s16 sourcePan, s16 targetPan, s16 incrementPan)
+{
+ u16 ret;
+
+ if (sourcePan < targetPan)
+ ret = ((incrementPan < 0) ? -incrementPan : incrementPan);
+ else if (sourcePan > targetPan)
+ ret = -((incrementPan < 0) ? -incrementPan : incrementPan);
+ else
+ ret = 0;
+
+ return ret;
+}
+
+static void ScriptCmd_playsewithpan(void)
+{
+ u16 songId;
+ s8 pan;
+
+ sBattleAnimScriptPtr++;
+ songId = T1_READ_16(sBattleAnimScriptPtr);
+ pan = T1_READ_8(sBattleAnimScriptPtr + 2);
+ PlaySE12WithPanning(songId, BattleAnimAdjustPanning(pan));
+ sBattleAnimScriptPtr += 3;
+}
+
+static void ScriptCmd_setpan(void)
+{
+ s8 pan;
+
+ sBattleAnimScriptPtr++;
+ pan = T1_READ_8(sBattleAnimScriptPtr);
+ SE12PanpotControl(BattleAnimAdjustPanning(pan));
+ sBattleAnimScriptPtr++;
+}
+
+#define tInitialPan data[0]
+#define tTargetPan data[1]
+#define tIncrementPan data[2]
+#define tFramesToWait data[3]
+#define tCurrentPan data[4]
+#define tFrameCounter data[8]
+
+static void ScriptCmd_panse_1B(void)
+{
+ u16 songNum;
+ s8 currentPanArg, incrementPan, incrementPanArg, currentPan, targetPan;
+ u8 framesToWait;
+ u8 taskId;
+
+ sBattleAnimScriptPtr++;
+ songNum = T1_READ_16(sBattleAnimScriptPtr);
+ currentPanArg = T1_READ_8(sBattleAnimScriptPtr + 2);
+ incrementPan = T1_READ_8(sBattleAnimScriptPtr + 3);
+ incrementPanArg = T1_READ_8(sBattleAnimScriptPtr + 4);
+ framesToWait = T1_READ_8(sBattleAnimScriptPtr + 5);
+
+ currentPan = BattleAnimAdjustPanning(currentPanArg);
+ targetPan = BattleAnimAdjustPanning(incrementPan);
+ incrementPan = CalculatePanIncrement(currentPan, targetPan, incrementPanArg);
+ taskId = CreateTask(Task_PanFromInitialToTarget, 1);
+ gTasks[taskId].tInitialPan = currentPan;
+ gTasks[taskId].tTargetPan = targetPan;
+ gTasks[taskId].tIncrementPan = incrementPan;
+ gTasks[taskId].tFramesToWait = framesToWait;
+ gTasks[taskId].tCurrentPan = currentPan;
+
+ PlaySE12WithPanning(songNum, currentPan);
+
+ gAnimSoundTaskCount++;
+ sBattleAnimScriptPtr += 6;
+}
+
+void Task_PanFromInitialToTarget(u8 taskId)
+{
+ bool32 destroyTask = FALSE;
+ if (gTasks[taskId].tFrameCounter++ >= gTasks[taskId].tFramesToWait)
+ {
+ s16 pan;
+ s16 initialPanning, targetPanning, currentPan, incrementPan;
+
+ gTasks[taskId].tFrameCounter = 0;
+ initialPanning = gTasks[taskId].tInitialPan;
+ targetPanning = gTasks[taskId].tTargetPan;
+ currentPan = gTasks[taskId].tCurrentPan;
+ incrementPan = gTasks[taskId].tIncrementPan;
+ pan = currentPan + incrementPan;
+ gTasks[taskId].tCurrentPan = pan;
+
+ if (incrementPan == 0) // If we're not incrementing, just cancel the task immediately
+ {
+ destroyTask = TRUE;
+ }
+ else if (initialPanning < targetPanning) // Panning increasing
+ {
+ if (pan >= targetPanning) // Target reached
+ destroyTask = TRUE;
+ }
+ else // Panning decreasing
+ {
+ if (pan <= targetPanning) // Target reached
+ destroyTask = TRUE;
+ }
+
+ if (destroyTask)
+ {
+ pan = targetPanning;
+ DestroyTask(taskId);
+ gAnimSoundTaskCount--;
+ }
+
+ SE12PanpotControl(pan);
+ }
+}
+
+static void ScriptCmd_panse_26(void)
+{
+ u16 songId;
+ s8 currentPan, targetPan, incrementPan;
+ u8 framesToWait;
+ u8 taskId;
+
+ sBattleAnimScriptPtr++;
+ songId = T1_READ_16(sBattleAnimScriptPtr);
+ currentPan = T1_READ_8(sBattleAnimScriptPtr + 2);
+ targetPan = T1_READ_8(sBattleAnimScriptPtr + 3);
+ incrementPan = T1_READ_8(sBattleAnimScriptPtr + 4);
+ framesToWait = T1_READ_8(sBattleAnimScriptPtr + 5);
+
+ taskId = CreateTask(Task_PanFromInitialToTarget, 1);
+ gTasks[taskId].tInitialPan = currentPan;
+ gTasks[taskId].tTargetPan = targetPan;
+ gTasks[taskId].tIncrementPan = incrementPan;
+ gTasks[taskId].tFramesToWait = framesToWait;
+ gTasks[taskId].tCurrentPan = currentPan;
+
+ PlaySE12WithPanning(songId, currentPan);
+
+ gAnimSoundTaskCount++;
+ sBattleAnimScriptPtr += 6;
+}
+
+static void ScriptCmd_panse_27(void)
+{
+ u16 songId;
+ u8 targetPanArg, incrementPanArg, currentPan, currentPanArg;
+ s8 targetPan, incrementPan, framesToWait;
+ u8 taskId;
+
+ sBattleAnimScriptPtr++;
+ songId = T1_READ_16(sBattleAnimScriptPtr);
+ currentPanArg = T1_READ_8(sBattleAnimScriptPtr + 2);
+ targetPanArg = T1_READ_8(sBattleAnimScriptPtr + 3);
+ incrementPanArg = T1_READ_8(sBattleAnimScriptPtr + 4);
+ currentPan = T1_READ_8(sBattleAnimScriptPtr + 5);
+
+ targetPan = BattleAnimAdjustPanning2(currentPanArg);
+ incrementPan = BattleAnimAdjustPanning2(targetPanArg);
+ framesToWait = BattleAnimAdjustPanning2(incrementPanArg);
+
+ taskId = CreateTask(Task_PanFromInitialToTarget, 1);
+ gTasks[taskId].data[0] = targetPan;
+ gTasks[taskId].data[1] = incrementPan;
+ gTasks[taskId].data[2] = framesToWait;
+ gTasks[taskId].data[3] = currentPan;
+ gTasks[taskId].data[4] = targetPan;
+
+ PlaySE12WithPanning(songId, targetPan);
+
+ gAnimSoundTaskCount++;
+ sBattleAnimScriptPtr += 6;
+}
+
+#undef tInitialPan
+#undef tTargetPan
+#undef tIncrementPan
+#undef tFramesToWait
+#undef tCurrentPan
+#undef tFrameCounter
+
+#define tSongId data[0]
+#define tPanning data[1]
+#define tFramesToWait data[2]
+#define tNumberOfPlays data[3]
+#define tFrameCounter data[8]
+
+static void ScriptCmd_loopsewithpan(void)
+{
+ u16 songId;
+ s8 panningArg, panning;
+ u8 framesToWait, numberOfPlays;
+ u8 taskId;
+
+ sBattleAnimScriptPtr++;
+ songId = T1_READ_16(sBattleAnimScriptPtr);
+ panningArg = T1_READ_8(sBattleAnimScriptPtr + 2);
+ framesToWait = T1_READ_8(sBattleAnimScriptPtr + 3);
+ numberOfPlays = T1_READ_8(sBattleAnimScriptPtr + 4);
+ panning = BattleAnimAdjustPanning(panningArg);
+
+ taskId = CreateTask(Task_LoopAndPlaySE, 1);
+ gTasks[taskId].tSongId = songId;
+ gTasks[taskId].tPanning = panning;
+ gTasks[taskId].tFramesToWait = framesToWait;
+ gTasks[taskId].tNumberOfPlays = numberOfPlays;
+ gTasks[taskId].tFrameCounter = framesToWait;
+ gTasks[taskId].func(taskId);
+
+ gAnimSoundTaskCount++;
+ sBattleAnimScriptPtr += 5;
+}
+
+static void Task_LoopAndPlaySE(u8 taskId)
+{
+ if (gTasks[taskId].tFrameCounter++ >= gTasks[taskId].tFramesToWait)
+ {
+ u16 songId;
+ s8 panning;
+ u8 numberOfPlays;
+
+ gTasks[taskId].tFrameCounter = 0;
+ songId = gTasks[taskId].tSongId;
+ panning = gTasks[taskId].tPanning;
+ numberOfPlays = --gTasks[taskId].tNumberOfPlays;
+ PlaySE12WithPanning(songId, panning);
+ if (numberOfPlays == 0)
+ {
+ DestroyTask(taskId);
+ gAnimSoundTaskCount--;
+ }
+ }
+}
+
+#undef tSongId
+#undef tPanning
+#undef tFramesToWait
+#undef tNumberOfPlays
+#undef tFrameCounter
+
+#define tSongId data[0]
+#define tPanning data[1]
+#define tFramesToWait data[2]
+
+static void ScriptCmd_waitplaysewithpan(void)
+{
+ u16 songId;
+ s8 panningArg, panning;
+ u8 framesToWait;
+ u8 taskId;
+
+ sBattleAnimScriptPtr++;
+ songId = T1_READ_16(sBattleAnimScriptPtr);
+ panningArg = T1_READ_8(sBattleAnimScriptPtr + 2);
+ framesToWait = T1_READ_8(sBattleAnimScriptPtr + 3);
+ panning = BattleAnimAdjustPanning(panningArg);
+
+ taskId = CreateTask(Task_WaitAndPlaySE, 1);
+ gTasks[taskId].tSongId = songId;
+ gTasks[taskId].tPanning = panning;
+ gTasks[taskId].tFramesToWait = framesToWait;
+
+ gAnimSoundTaskCount++;
+ sBattleAnimScriptPtr += 4;
+}
+
+static void Task_WaitAndPlaySE(u8 taskId)
+{
+ if (gTasks[taskId].tFramesToWait-- <= 0)
+ {
+ PlaySE12WithPanning(gTasks[taskId].tSongId, gTasks[taskId].tPanning);
+ DestroyTask(taskId);
+ gAnimSoundTaskCount--;
+ }
+}
+
+#undef tSongId
+#undef tPanning
+#undef tFramesToWait
+
+static void ScriptCmd_createsoundtask(void)
+{
+ TaskFunc func;
+ u8 numArgs, taskId;
+ s32 i;
+
+ sBattleAnimScriptPtr++;
+ func = (TaskFunc)T2_READ_32(sBattleAnimScriptPtr);
+ sBattleAnimScriptPtr += 4;
+ numArgs = T1_READ_8(sBattleAnimScriptPtr);
+ sBattleAnimScriptPtr++;
+ for (i = 0; i < numArgs; i++)
+ {
+ gBattleAnimArgs[i] = T1_READ_16(sBattleAnimScriptPtr);
+ sBattleAnimScriptPtr += 2;
+ }
+ taskId = CreateTask(func, 1);
+ func(taskId);
+ gAnimSoundTaskCount++;
+}
+
+static void ScriptCmd_waitsound(void)
+{
+ if (gAnimSoundTaskCount != 0)
+ {
+ gSoundAnimFramesToWait = 0;
+ gAnimFramesToWait = 1;
+ }
+ else if (IsSEPlaying())
+ {
+ if (++gSoundAnimFramesToWait > 90)
+ {
+ m4aMPlayStop(&gMPlay_SE1);
+ m4aMPlayStop(&gMPlay_SE2);
+ gSoundAnimFramesToWait = 0;
+ }
+ else
+ {
+ gAnimFramesToWait = 1;
+ }
+ }
+ else
+ {
+ gSoundAnimFramesToWait = 0;
+ sBattleAnimScriptPtr++;
+ gAnimFramesToWait = 0;
+ }
+}
+
+static void ScriptCmd_jumpargeq(void)
+{
+ u8 argId;
+ s16 valueToCheck;
+
+ sBattleAnimScriptPtr++;
+ argId = T1_READ_8(sBattleAnimScriptPtr);
+ valueToCheck = T1_READ_16(sBattleAnimScriptPtr + 1);
+
+ if (valueToCheck == gBattleAnimArgs[argId])
+ sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr + 3);
+ else
+ sBattleAnimScriptPtr += 7;
+}
+
+static void ScriptCmd_jumpifcontest(void)
+{
+ sBattleAnimScriptPtr++;
+ if (IsContest())
+ sBattleAnimScriptPtr = T2_READ_PTR(sBattleAnimScriptPtr);
+ else
+ sBattleAnimScriptPtr += 4;
+}
+
+static void ScriptCmd_monbgprio_28(void)
+{
+ u8 wantedBank;
+ u8 bank;
+ u8 bankIdentity;
+
+ wantedBank = T1_READ_8(sBattleAnimScriptPtr + 1);
+ sBattleAnimScriptPtr += 2;
+
+ if (wantedBank != 0)
+ bank = gAnimBankTarget;
+ else
+ bank = gAnimBankAttacker;
+
+ bankIdentity = GetBankIdentity(bank);
+ if (!IsContest() && (bankIdentity == 0 || bankIdentity == 3))
+ {
+ REG_BG1CNT_BITFIELD.priority = 1;
+ REG_BG2CNT_BITFIELD.priority = 2;
+ }
+}
+
+static void ScriptCmd_monbgprio_29(void)
+{
+ sBattleAnimScriptPtr++;
+ if (!IsContest())
+ {
+ REG_BG1CNT_BITFIELD.priority = 1;
+ REG_BG2CNT_BITFIELD.priority = 2;
+ }
+}
+
+static void ScriptCmd_monbgprio_2A(void)
+{
+ u8 wantedBank;
+ u8 bankIdentity;
+ u8 bank;
+
+ wantedBank = T1_READ_8(sBattleAnimScriptPtr + 1);
+ sBattleAnimScriptPtr += 2;
+ if (GetBankSide(gAnimBankAttacker) != GetBankSide(gAnimBankTarget))
+ {
+ if (wantedBank != 0)
+ bank = gAnimBankTarget;
+ else
+ bank = gAnimBankAttacker;
+ bankIdentity = GetBankIdentity(bank);
+ if (!IsContest() && (bankIdentity == 0 || bankIdentity == 3))
+ {
+ REG_BG1CNT_BITFIELD.priority = 1;
+ REG_BG2CNT_BITFIELD.priority = 2;
+ }
+ }
+}
+
+static void ScriptCmd_invisible(void)
+{
+ u8 spriteId;
+
+ spriteId = GetAnimBankSpriteId(T1_READ_8(sBattleAnimScriptPtr + 1));
+ if (spriteId != 0xFF)
+ gSprites[spriteId].invisible = TRUE;
+
+ sBattleAnimScriptPtr += 2;
+}
+
+static void ScriptCmd_visible(void)
+{
+ u8 spriteId;
+
+ spriteId = GetAnimBankSpriteId(T1_READ_8(sBattleAnimScriptPtr + 1));
+ if (spriteId != 0xFF)
+ gSprites[spriteId].invisible = FALSE;
+
+ sBattleAnimScriptPtr += 2;
+}
+
+static void ScriptCmd_doublebattle_2D(void)
+{
+ u8 wantedBank;
+ u8 r4;
+ u8 spriteId;
+
+ wantedBank = T1_READ_8(sBattleAnimScriptPtr + 1);
+ sBattleAnimScriptPtr += 2;
+ if (!IsContest() && IsDoubleBattle()
+ && GetBankSide(gAnimBankAttacker) == GetBankSide(gAnimBankTarget))
+ {
+ if (wantedBank == 0)
+ {
+ r4 = GetBankIdentity_permutated(gAnimBankAttacker);
+ spriteId = GetAnimBankSpriteId(0);
+ }
+ else
+ {
+ r4 = GetBankIdentity_permutated(gAnimBankTarget);
+ spriteId = GetAnimBankSpriteId(1);
+ }
+ if (spriteId != 0xFF)
+ {
+ gSprites[spriteId].invisible = FALSE;
+ if (r4 == 2)
+ gSprites[spriteId].oam.priority = 3;
+ if (r4 == 1)
+ sub_8076464(0);
+ else
+ sub_8076464(1);
+ }
+ }
+}
+
+static void ScriptCmd_doublebattle_2E(void)
+{
+ u8 wantedBank;
+ u8 r4;
+ u8 spriteId;
+
+ wantedBank = T1_READ_8(sBattleAnimScriptPtr + 1);
+ sBattleAnimScriptPtr += 2;
+ if (!IsContest() && IsDoubleBattle()
+ && GetBankSide(gAnimBankAttacker) == GetBankSide(gAnimBankTarget))
+ {
+ if (wantedBank == 0)
+ {
+ r4 = GetBankIdentity_permutated(gAnimBankAttacker);
+ spriteId = GetAnimBankSpriteId(0);
+ }
+ else
+ {
+ r4 = GetBankIdentity_permutated(gAnimBankTarget);
+ spriteId = GetAnimBankSpriteId(1);
+ }
+ if (spriteId != 0xFF && r4 == 2)
+ {
+ gSprites[spriteId].oam.priority = 2;
+ }
+ }
+}
+
+static void ScriptCmd_stopsound(void)
+{
+ m4aMPlayStop(&gMPlay_SE1);
+ m4aMPlayStop(&gMPlay_SE2);
+ sBattleAnimScriptPtr++;
+}
diff --git a/src/battle_anim_807B69C.c b/src/battle/battle_anim_807B69C.c
index 42932877b..058a45769 100644
--- a/src/battle_anim_807B69C.c
+++ b/src/battle/battle_anim_807B69C.c
@@ -7,13 +7,14 @@
#include "sprite.h"
#include "task.h"
#include "trig.h"
+#include "ewram.h"
-extern u8 gBattleAnimPlayerMonIndex;
-extern u8 gBattleAnimEnemyMonIndex;
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
extern bool8 gAnimScriptActive;
extern void (*gAnimScriptCallback)(void);
extern s16 gBattleAnimArgs[];
-extern u8 gBattleAnimEnemyMonIndex;
+extern u8 gAnimBankTarget;
extern u8 gObjectBankIDs[];
extern const struct CompressedSpriteSheet gBattleAnimPicTable[];
extern const struct CompressedSpritePalette gBattleAnimPaletteTable[];
@@ -21,7 +22,7 @@ extern const u8 *const gBattleAnims_StatusConditions[];
extern const struct OamData gOamData_837E05C;
extern const struct OamData gOamData_837DF24;
-extern u8 sub_8077ABC(u8, u8);
+extern u8 GetBankPosition(u8, u8);
extern void sub_80E32E0(u8);
@@ -85,11 +86,11 @@ u8 unref_sub_807B69C(u8 a, u8 b)
for (i = 0; i < 10; i++)
{
spriteId2 = CreateSprite(&gSpriteTemplate_83931F8, gSprites[spriteId1].pos1.x, gSprites[spriteId1].pos1.y + 32, 0);
- gSprites[spriteId2].data0 = i * 51;
- gSprites[spriteId2].data1 = -256;
+ gSprites[spriteId2].data[0] = i * 51;
+ gSprites[spriteId2].data[1] = -256;
gSprites[spriteId2].invisible = TRUE;
if (i > 4)
- gSprites[spriteId2].data6 = 21;
+ gSprites[spriteId2].data[6] = 21;
}
}
else
@@ -98,14 +99,14 @@ u8 unref_sub_807B69C(u8 a, u8 b)
for (i = 0; i < 10; i++)
{
spriteId2 = CreateSprite(&gSpriteTemplate_83931F8, gSprites[spriteId1].pos1.x, gSprites[spriteId1].pos1.y - 32, 0);
- gSprites[spriteId2].data0 = i * 51;
- gSprites[spriteId2].data1 = 256;
+ gSprites[spriteId2].data[0] = i * 51;
+ gSprites[spriteId2].data[1] = 256;
gSprites[spriteId2].invisible = TRUE;
if (i > 4)
- gSprites[spriteId2].data6 = 21;
+ gSprites[spriteId2].data[6] = 21;
}
}
- gSprites[spriteId2].data7 = 1;
+ gSprites[spriteId2].data[7] = 1;
return taskId;
}
@@ -144,7 +145,7 @@ static void sub_807B7E0(u8 taskId)
static void sub_807B870(struct Sprite *sprite)
{
- if (sprite->data6 == 0)
+ if (sprite->data[6] == 0)
{
sprite->invisible = FALSE;
sprite->callback = sub_807B8A4;
@@ -152,25 +153,25 @@ static void sub_807B870(struct Sprite *sprite)
}
else
{
- sprite->data6 --;
+ sprite->data[6] --;
}
}
static void sub_807B8A4(struct Sprite *sprite)
{
- sprite->pos2.x = Cos(sprite->data0, 32);
- sprite->pos2.y = Sin(sprite->data0, 8);
- if (sprite->data0 < 128)
+ sprite->pos2.x = Cos(sprite->data[0], 32);
+ sprite->pos2.y = Sin(sprite->data[0], 8);
+ if (sprite->data[0] < 128)
sprite->subpriority = 29;
else
sprite->subpriority = 31;
- sprite->data0 = (sprite->data0 + 8) & 0xFF;
- sprite->data5 += sprite->data1;
- sprite->pos2.y += sprite->data5 >> 8;
- sprite->data2++;
- if (sprite->data2 == 52)
+ sprite->data[0] = (sprite->data[0] + 8) & 0xFF;
+ sprite->data[5] += sprite->data[1];
+ sprite->pos2.y += sprite->data[5] >> 8;
+ sprite->data[2]++;
+ if (sprite->data[2] == 52)
{
- if (sprite->data7 != 0)
+ if (sprite->data[7] != 0)
DestroySpriteAndFreeResources(sprite);
else
DestroySprite(sprite);
@@ -179,8 +180,8 @@ 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 = GetBankPosition(gAnimBankTarget, 2) - 32;
+ s16 y = GetBankPosition(gAnimBankTarget, 3) - 36;
u8 spriteId;
if (IsContest())
@@ -335,9 +336,9 @@ void move_anim_start_t2(u8 a, u8 b)
{
u8 taskId;
- gBattleAnimPlayerMonIndex = a;
- gBattleAnimEnemyMonIndex = a;
- DoMoveAnim(gBattleAnims_StatusConditions, b, 0);
+ gAnimBankAttacker = a;
+ gAnimBankTarget = a;
+ LaunchBattleAnimation(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..c35434df0 100644
--- a/src/battle_anim_80A7E7C.c
+++ b/src/battle/battle_anim_80A7E7C.c
@@ -10,10 +10,10 @@
extern s16 gBattleAnimArgs[8];
extern u8 gObjectBankIDs[];
-extern s32 gMoveDmgMoveAnim;
-extern u16 gMovePowerMoveAnim;
-extern u8 gBattleAnimPlayerMonIndex;
-extern u8 gBattleAnimEnemyMonIndex;
+extern s32 gAnimMoveDmg;
+extern u16 gAnimMovePower;
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
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);
@@ -108,20 +108,20 @@ void sub_80A7FA0(u8 taskId)
switch (gBattleAnimArgs[0])
{
case 4:
- side = GetBankByPlayerAI(0);
+ side = GetBankByIdentity(0);
break;
case 5:
- side = GetBankByPlayerAI(2);
+ side = GetBankByIdentity(2);
break;
case 6:
- side = GetBankByPlayerAI(1);
+ side = GetBankByIdentity(1);
break;
case 7:
default:
- side = GetBankByPlayerAI(3);
+ side = GetBankByIdentity(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[gAnimBankAttacker];
}
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(gAnimBankAttacker))
{
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
}
@@ -338,50 +338,50 @@ void sub_80A8500(u8 taskId)
void sub_80A8530(struct Sprite *sprite)
{
sprite->invisible = TRUE;
- if (GetBankSide(gBattleAnimPlayerMonIndex))
+ if (GetBankSide(gAnimBankAttacker))
{
- sprite->data1 = -gBattleAnimArgs[1];
+ sprite->data[1] = -gBattleAnimArgs[1];
}
else
{
- sprite->data1 = gBattleAnimArgs[1];
+ sprite->data[1] = gBattleAnimArgs[1];
}
- sprite->data0 = gBattleAnimArgs[0];
- sprite->data2 = 0;
- sprite->data3 = gObjectBankIDs[gBattleAnimPlayerMonIndex];
- sprite->data4 = gBattleAnimArgs[0];
- oamt_set_x3A_32(sprite, sub_80A85A4);
+ sprite->data[0] = gBattleAnimArgs[0];
+ sprite->data[2] = 0;
+ sprite->data[3] = gObjectBankIDs[gAnimBankAttacker];
+ sprite->data[4] = gBattleAnimArgs[0];
+ StoreSpriteCallbackInData(sprite, sub_80A85A4);
sprite->callback = sub_8078458;
}
static void sub_80A85A4(struct Sprite *sprite)
{
- sprite->data0 = sprite->data4;
- sprite->data1 = -sprite->data1;
+ sprite->data[0] = sprite->data[4];
+ sprite->data[1] = -sprite->data[1];
sprite->callback = sub_8078458;
- oamt_set_x3A_32(sprite, move_anim_8072740);
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
}
void sub_80A85C8(struct Sprite *sprite)
{
u8 spriteId;
sprite->invisible = TRUE;
- spriteId = obj_id_for_side_relative_to_move(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);
+ spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]);
+ sprite->data[0] = gBattleAnimArgs[0];
+ sprite->data[1] = 0;
+ sprite->data[2] = gBattleAnimArgs[1];
+ sprite->data[3] = spriteId;
+ sprite->data[4] = gBattleAnimArgs[0];
+ StoreSpriteCallbackInData(sprite, sub_80A8614);
sprite->callback = sub_8078458;
}
void sub_80A8614(struct Sprite *sprite)
{
- sprite->data0 = sprite->data4;
- sprite->data2 = -sprite->data2;
+ sprite->data[0] = sprite->data[4];
+ sprite->data[2] = -sprite->data[2];
sprite->callback = sub_8078458;
- oamt_set_x3A_32(sprite, move_anim_8072740);
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
}
void sub_80A8638(struct Sprite *sprite)
@@ -390,34 +390,34 @@ void sub_80A8638(struct Sprite *sprite)
int spriteId;
if (!gBattleAnimArgs[0])
{
- spriteId = gObjectBankIDs[gBattleAnimPlayerMonIndex];
+ spriteId = gObjectBankIDs[gAnimBankAttacker];
}
else
{
- spriteId = gObjectBankIDs[gBattleAnimEnemyMonIndex];
+ spriteId = gObjectBankIDs[gAnimBankTarget];
}
- sprite->data0 = gBattleAnimArgs[2];
- sprite->data1 = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x;
- sprite->data2 = gSprites[spriteId].pos1.x;
- sprite->data3 = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y;
- sprite->data4 = gSprites[spriteId].pos1.y;
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[1] = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x;
+ sprite->data[2] = gSprites[spriteId].pos1.x;
+ sprite->data[3] = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y;
+ sprite->data[4] = gSprites[spriteId].pos1.y;
something = 0;
sub_8078A5C(sprite);
- sprite->data3 = something;
- sprite->data4 = something;
- sprite->data5 = gSprites[spriteId].pos2.x;
- sprite->data6 = gSprites[spriteId].pos2.y;
+ sprite->data[3] = something;
+ sprite->data[4] = something;
+ sprite->data[5] = gSprites[spriteId].pos2.x;
+ sprite->data[6] = gSprites[spriteId].pos2.y;
sprite->invisible = TRUE;
if (gBattleAnimArgs[1] == 1)
{
- sprite->data2 = something;
+ sprite->data[2] = something;
}
else if (gBattleAnimArgs[1] == 2)
{
- sprite->data1 = something;
+ sprite->data[1] = something;
}
- sprite->data7 = gBattleAnimArgs[1];
- sprite->data7 |= spriteId << 8;
+ sprite->data[7] = gBattleAnimArgs[1];
+ sprite->data[7] |= spriteId << 8;
sprite->callback = sub_80A86F4;
}
@@ -426,10 +426,10 @@ static void sub_80A86F4(struct Sprite *sprite)
s8 spriteId;
u8 lo;
struct Sprite *sprite2;
- lo = sprite->data7 & 0xff;
- spriteId = sprite->data7 >> 8;
+ lo = sprite->data[7] & 0xff;
+ spriteId = sprite->data[7] >> 8;
sprite2 = &gSprites[spriteId];
- if (sprite->data0 == 0)
+ if (sprite->data[0] == 0)
{
if (lo < 2)
{
@@ -439,15 +439,15 @@ static void sub_80A86F4(struct Sprite *sprite)
{
sprite2->pos2.y = 0;
}
- move_anim_8072740(sprite);
+ DestroyAnimSprite(sprite);
}
else
{
- sprite->data0--;
- sprite->data3 += sprite->data1;
- sprite->data4 += sprite->data2;
- sprite2->pos2.x = (s8)(sprite->data3 >> 8) + sprite->data5;
- sprite2->pos2.y = (s8)(sprite->data4 >> 8) + sprite->data6;
+ sprite->data[0]--;
+ sprite->data[3] += sprite->data[1];
+ sprite->data[4] += sprite->data[2];
+ sprite2->pos2.x = (s8)(sprite->data[3] >> 8) + sprite->data[5];
+ sprite2->pos2.y = (s8)(sprite->data[4] >> 8) + sprite->data[6];
}
}
@@ -457,11 +457,11 @@ void sub_80A8764(struct Sprite *sprite)
u8 spriteId;
if (!gBattleAnimArgs[0])
{
- v1 = gBattleAnimPlayerMonIndex;
+ v1 = gAnimBankAttacker;
}
else
{
- v1 = gBattleAnimEnemyMonIndex;
+ v1 = gAnimBankTarget;
}
spriteId = gObjectBankIDs[v1];
if (GetBankSide(v1))
@@ -472,17 +472,17 @@ void sub_80A8764(struct Sprite *sprite)
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
}
}
- sprite->data0 = gBattleAnimArgs[4];
- sprite->data1 = gSprites[spriteId].pos1.x;
- sprite->data2 = gSprites[spriteId].pos1.x + gBattleAnimArgs[1];
- sprite->data3 = gSprites[spriteId].pos1.y;
- sprite->data4 = gSprites[spriteId].pos1.y + gBattleAnimArgs[2];
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[1] = gSprites[spriteId].pos1.x;
+ sprite->data[2] = gSprites[spriteId].pos1.x + gBattleAnimArgs[1];
+ sprite->data[3] = gSprites[spriteId].pos1.y;
+ sprite->data[4] = gSprites[spriteId].pos1.y + gBattleAnimArgs[2];
sub_8078A5C(sprite);
- sprite->data3 = 0;
- sprite->data4 = 0;
- sprite->data5 = spriteId;
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+ sprite->data[5] = spriteId;
sprite->invisible = TRUE;
- oamt_set_x3A_32(sprite, move_anim_8072740);
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
sprite->callback = sub_80784A8;
}
@@ -493,11 +493,11 @@ void sub_80A8818(struct Sprite *sprite)
sprite->invisible = TRUE;
if (!gBattleAnimArgs[0])
{
- v1 = gBattleAnimPlayerMonIndex;
+ v1 = gAnimBankAttacker;
}
else
{
- v1 = gBattleAnimEnemyMonIndex;
+ v1 = gAnimBankTarget;
}
spriteId = gObjectBankIDs[v1];
if (GetBankSide(v1))
@@ -508,23 +508,23 @@ void sub_80A8818(struct Sprite *sprite)
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
}
}
- sprite->data0 = gBattleAnimArgs[4];
- sprite->data1 = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x;
- sprite->data2 = sprite->data1 + gBattleAnimArgs[1];
- sprite->data3 = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y;
- sprite->data4 = sprite->data3 + gBattleAnimArgs[2];
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[1] = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x;
+ sprite->data[2] = sprite->data[1] + gBattleAnimArgs[1];
+ sprite->data[3] = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y;
+ sprite->data[4] = sprite->data[3] + gBattleAnimArgs[2];
sub_8078A5C(sprite);
- sprite->data3 = gSprites[spriteId].pos2.x << 8;
- sprite->data4 = gSprites[spriteId].pos2.y << 8;
- sprite->data5 = spriteId;
- sprite->data6 = gBattleAnimArgs[5];
+ sprite->data[3] = gSprites[spriteId].pos2.x << 8;
+ sprite->data[4] = gSprites[spriteId].pos2.y << 8;
+ sprite->data[5] = spriteId;
+ sprite->data[6] = gBattleAnimArgs[5];
if (!gBattleAnimArgs[5])
{
- oamt_set_x3A_32(sprite, move_anim_8072740);
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
}
else
{
- oamt_set_x3A_32(sprite, sub_80A88F0);
+ StoreSpriteCallbackInData(sprite, sub_80A88F0);
}
sprite->callback = sub_80784A8;
}
@@ -532,21 +532,21 @@ void sub_80A8818(struct Sprite *sprite)
static void sub_80A88F0(struct Sprite *sprite)
{
- gSprites[sprite->data5].pos2.x = 0;
- gSprites[sprite->data5].pos2.y = 0;
- move_anim_8072740(sprite);
+ gSprites[sprite->data[5]].pos2.x = 0;
+ gSprites[sprite->data[5]].pos2.y = 0;
+ DestroyAnimSprite(sprite);
}
void sub_80A8920(u8 taskId)
{
s16 r7;
r7 = 0x8000 / gBattleAnimArgs[3];
- if (GetBankSide(gBattleAnimPlayerMonIndex))
+ if (GetBankSide(gAnimBankAttacker))
{
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(gAnimBankAttacker ^ 2))
{
DestroyAnimVisualTask(taskId);
return;
}
- spriteId = gObjectBankIDs[gBattleAnimPlayerMonIndex ^ 2];
+ spriteId = gObjectBankIDs[gAnimBankAttacker ^ 2];
break;
case 3:
- if (!b_side_obj__get_some_boolean(gBattleAnimEnemyMonIndex ^ 2))
+ if (!IsAnimBankSpriteVisible(gAnimBankTarget ^ 2))
{
DestroyAnimVisualTask(taskId);
return;
}
- spriteId = gObjectBankIDs[gBattleAnimEnemyMonIndex ^ 2];
+ spriteId = gObjectBankIDs[gAnimBankTarget ^ 2];
break;
default:
DestroyAnimVisualTask(taskId);
return;
}
TASK.data[0] = spriteId;
- if (GetBankSide(gBattleAnimEnemyMonIndex))
+ if (GetBankSide(gAnimBankTarget))
{
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(gAnimBankAttacker))
{
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] = gAnimBankAttacker;
}
else
{
- TASK.data[5] = gBattleAnimEnemyMonIndex;
+ TASK.data[5] = gAnimBankTarget;
}
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];
@@ -777,11 +777,11 @@ void sub_80A8E04(u8 taskId)
{
if (gBattleAnimArgs[2] == 0)
{
- TASK.data[7] = !GetBankSide(gBattleAnimPlayerMonIndex);
+ TASK.data[7] = !GetBankSide(gAnimBankAttacker);
}
else
{
- TASK.data[7] = !GetBankSide(gBattleAnimEnemyMonIndex);
+ TASK.data[7] = !GetBankSide(gAnimBankTarget);
}
}
if (TASK.data[7])
@@ -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(gAnimBankAttacker))
{
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
}
}
else
{
- if (GetBankSide(gBattleAnimEnemyMonIndex))
+ if (GetBankSide(gAnimBankTarget))
{
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
}
@@ -864,7 +864,7 @@ void sub_80A9058(u8 taskId)
{
if (!gBattleAnimArgs[0])
{
- TASK.data[15] = gMovePowerMoveAnim / 12;
+ TASK.data[15] = gAnimMovePower / 12;
if (TASK.data[15] < 1)
{
TASK.data[15] = 1;
@@ -876,7 +876,7 @@ void sub_80A9058(u8 taskId)
}
else
{
- TASK.data[15] = gMoveDmgMoveAnim / 12;
+ TASK.data[15] = gAnimMoveDmg / 12;
if (TASK.data[15] < 1)
{
TASK.data[15] = 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_linkopponent2.c b/src/battle/battle_controller_linkopponent.c
index 59030cd6e..54181bc21 100644
--- a/src/battle_controller_linkopponent2.c
+++ b/src/battle/battle_controller_linkopponent.c
@@ -1,20 +1,24 @@
#include "global.h"
#include "battle.h"
+#include "battle_anim.h"
#include "battle_interface.h"
#include "data2.h"
#include "link.h"
+#include "m4a.h"
+#include "main.h"
#include "palette.h"
#include "rom_8077ABC.h"
#include "rom3.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "sprite.h"
#include "string_util.h"
#include "task.h"
#include "text.h"
#include "util.h"
+#include "ewram.h"
-struct UnknownStruct3
+struct MovePpInfo
{
u16 moves[4];
u8 pp[4];
@@ -29,12 +33,11 @@ extern u8 gHealthboxIDs[];
extern u16 gBattleTypeFlags;
extern u8 gBattleMonForms[];
extern void (*gBattleBankFunc[])(void);
-extern u32 *gDisableStructMoveAnim;
-extern u32 gMoveDmgMoveAnim;
-extern u16 gMovePowerMoveAnim;
-extern u8 gHappinessMoveAnim;
+extern u32 gAnimMoveDmg;
+extern u16 gAnimMovePower;
+extern u8 gAnimFriendship;
extern u16 gWeatherMoveAnim;
-extern u32 gPID_perBank[];
+extern u32 gTransformedPersonalities[];
extern u8 gAnimScriptActive;
extern void (*gAnimScriptCallback)(void);
extern u8 gDisplayedStringBattle[];
@@ -43,11 +46,14 @@ extern u8 gBattleOutcome;
extern u16 gUnknown_02024DE8;
extern u8 gUnknown_02024E68[];
extern struct SpriteTemplate gUnknown_02024E8C;
-extern u8 gUnknown_0202F7C4;
+extern u8 gAnimMoveTurn;
extern struct Window gUnknown_03004210;
-extern u16 gUnknown_030042A0;
-extern u16 gUnknown_030042A4;
+extern u16 gBattle_BG0_Y;
+extern u16 gBattle_BG0_X;
extern u8 gUnknown_0300434C[];
+extern u32 gBattleExecBuffer;
+extern MainCallback gPreBattleCallback1;
+extern struct MusicPlayerInfo gMPlay_BGM;
extern u8 sub_8077F68();
extern u8 sub_8079E90();
@@ -66,14 +72,14 @@ 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 StoreSpriteCallbackInData();
extern void sub_8078B34(struct Sprite *);
extern void sub_80375B4(void);
extern void sub_8010384(struct Sprite *);
extern void sub_8037B78(void);
extern u8 sub_8031720();
extern bool8 mplay_80342A4(u8);
-extern void ExecuteMoveAnim();
+extern void DoMoveAnim();
extern void sub_80326EC();
extern void sub_8031F24(void);
extern void sub_80324BC();
@@ -94,15 +100,19 @@ extern void nullsub_47(void);
extern bool8 IsDoubleBattle(void);
extern void sub_8037840(void);
extern void sub_8031B74();
-extern u8 sub_8078874();
+extern u8 IsBankSpritePresent();
extern u8 move_anim_start_t3();
extern void sub_8037FD8(void);
extern void sub_8037F34(void);
extern void LinkOpponentBufferExecCompleted(void);
+extern void sub_8141828();
+extern void sub_804777C();
// this file's functions
u32 dp01_getattr_by_ch1_for_player_pokemon__(u8, u8 *);
+void sub_803752C(void);
+void sub_8037D2C(void);
void sub_8038900(u8);
void sub_8039430(u8, u8);
void sub_8039648(void);
@@ -234,6 +244,330 @@ const BattleBufferCmd gLinkOpponentBufferCommands[] =
// code
+void nullsub_47(void)
+{
+}
+
+void SetBankFuncToLinkOpponentBufferRunCommand(void)
+{
+ gBattleBankFunc[gActiveBank] = sub_803752C;
+}
+
+void sub_803752C(void)
+{
+ if (gBattleExecBuffer & gBitTable[gActiveBank])
+ {
+ if (gBattleBufferA[gActiveBank][0] <= 0x38)
+ gLinkOpponentBufferCommands[gBattleBufferA[gActiveBank][0]]();
+ else
+ LinkOpponentBufferExecCompleted();
+ }
+}
+
+void sub_803757C(void)
+{
+ if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy)
+ LinkOpponentBufferExecCompleted();
+}
+
+void sub_80375B4(void)
+{
+ if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy)
+ {
+ sub_8031B74(gSprites[gObjectBankIDs[gActiveBank]].oam.affineParam);
+ gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum = gSprites[gObjectBankIDs[gActiveBank]].data[5];
+ FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]);
+ DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]);
+ LinkOpponentBufferExecCompleted();
+ }
+}
+
+void sub_8037644(void)
+{
+ if ((--ewram17810[gActiveBank].unk9) == 0xFF)
+ {
+ ewram17810[gActiveBank].unk9 = 0;
+ LinkOpponentBufferExecCompleted();
+ }
+}
+
+void sub_8037680(void)
+{
+ bool8 r6 = FALSE;
+
+ if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI)))
+ {
+ if (gSprites[gHealthboxIDs[gActiveBank]].callback == SpriteCallbackDummy)
+ r6 = TRUE;
+ }
+ else
+ {
+ if (gSprites[gHealthboxIDs[gActiveBank]].callback == SpriteCallbackDummy
+ && gSprites[gHealthboxIDs[gActiveBank ^ 2]].callback == SpriteCallbackDummy)
+ r6 = TRUE;
+ }
+ if (IsCryPlayingOrClearCrySongs())
+ r6 = FALSE;
+
+ if (r6)
+ {
+ if (GetBankIdentity(gActiveBank) == 1)
+ {
+ if (!ewram17810[gActiveBank].unk1_0 || !ewram17810[gActiveBank ^ 2].unk1_0)
+ return;
+ ewram17810[gActiveBank].unk0_7 = 0;
+ ewram17810[gActiveBank].unk1_0 = 0;
+ ewram17810[gActiveBank ^ 2].unk0_7 = 0;
+ ewram17810[gActiveBank ^ 2].unk1_0 = 0;
+ FreeSpriteTilesByTag(0x27F9);
+ FreeSpritePaletteByTag(0x27F9);
+ }
+ if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ {
+ if (GetBankIdentity(gActiveBank) == 1)
+ m4aMPlayContinue(&gMPlay_BGM);
+ }
+ else
+ {
+ m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 256);
+ }
+ ewram17810[gActiveBank].unk9 = 3;
+ gBattleBankFunc[gActiveBank] = sub_8037644;
+ }
+}
+
+void sub_8037840(void)
+{
+ if (!ewram17810[gActiveBank].unk0_3 && !ewram17810[gActiveBank].unk0_7)
+ sub_8141828(gActiveBank, &gEnemyParty[gBattlePartyID[gActiveBank]]);
+ if (!ewram17810[gActiveBank ^ 2].unk0_3 && !ewram17810[gActiveBank ^ 2].unk0_7)
+ sub_8141828(gActiveBank ^ 2, &gEnemyParty[gBattlePartyID[gActiveBank ^ 2]]);
+ if (!ewram17810[gActiveBank].unk0_3 && !ewram17810[gActiveBank ^ 2].unk0_3)
+ {
+ if ((gBattleTypeFlags & BATTLE_TYPE_MULTI) && GetBankIdentity(gActiveBank) == 3)
+ {
+ if (++ewram17810[gActiveBank].unk9 == 1)
+ return;
+ ewram17810[gActiveBank].unk9 = 0;
+ }
+ if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI))
+ {
+ DestroySprite(&gSprites[gUnknown_0300434C[gActiveBank ^ 2]]);
+ sub_8045A5C(
+ gHealthboxIDs[gActiveBank ^ 2],
+ &gEnemyParty[gBattlePartyID[gActiveBank ^ 2]],
+ 0);
+ sub_804777C(gActiveBank ^ 2);
+ sub_8043DFC(gHealthboxIDs[gActiveBank ^ 2]);
+ sub_8032984(
+ gActiveBank ^ 2,
+ GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank ^ 2]], MON_DATA_SPECIES));
+ }
+ DestroySprite(&gSprites[gUnknown_0300434C[gActiveBank]]);
+ sub_8045A5C(
+ gHealthboxIDs[gActiveBank],
+ &gEnemyParty[gBattlePartyID[gActiveBank]],
+ 0);
+ sub_804777C(gActiveBank);
+ sub_8043DFC(gHealthboxIDs[gActiveBank]);
+ sub_8032984(
+ gActiveBank,
+ GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES));
+
+ ewram17840.unk9_0 = 0;
+ gBattleBankFunc[gActiveBank] = sub_8037680;
+ }
+}
+
+void sub_8037A74(void)
+{
+ if (gSprites[gObjectBankIDs[gActiveBank]].animEnded == TRUE
+ && gSprites[gObjectBankIDs[gActiveBank]].pos2.x == 0)
+ {
+ if (!ewram17810[gActiveBank].unk0_7)
+ {
+ sub_8141828(gActiveBank, &gEnemyParty[gBattlePartyID[gActiveBank]]);
+ return;
+ }
+ if (ewram17810[gActiveBank].unk1_0)
+ {
+ ewram17810[gActiveBank].unk0_7 = 0;
+ ewram17810[gActiveBank].unk1_0 = 0;
+ FreeSpriteTilesByTag(0x27F9);
+ FreeSpritePaletteByTag(0x27F9);
+ LinkOpponentBufferExecCompleted();
+ return;
+ }
+ }
+}
+
+void sub_8037B24(void)
+{
+ s16 r4 = sub_8045C78(gActiveBank, gHealthboxIDs[gActiveBank], 0, 0);
+
+ sub_8043DFC(gHealthboxIDs[gActiveBank]);
+ if (r4 != -1)
+ sub_80440EC(gHealthboxIDs[gActiveBank], r4, 0);
+ else
+ LinkOpponentBufferExecCompleted();
+}
+
+void sub_8037B78(void)
+{
+ if (!gSprites[gObjectBankIDs[gActiveBank]].inUse)
+ {
+ sub_8043DB0(gHealthboxIDs[gActiveBank]);
+ LinkOpponentBufferExecCompleted();
+ }
+}
+
+void sub_8037BBC(void)
+{
+ if (!ewram17810[gActiveBank].unk0_6)
+ {
+ FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]);
+ DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]);
+ sub_8032A08(gActiveBank);
+ sub_8043DB0(gHealthboxIDs[gActiveBank]);
+ LinkOpponentBufferExecCompleted();
+ }
+}
+
+void sub_8037C2C(void)
+{
+ if (gUnknown_03004210.state == 0)
+ LinkOpponentBufferExecCompleted();
+}
+
+void dp01t_0F_4_move_anim(void)
+{
+ u8 spriteId = gObjectBankIDs[gActiveBank];
+
+ if (gSprites[spriteId].data[1] == 32)
+ {
+ gSprites[spriteId].data[1] = 0;
+ gSprites[spriteId].invisible = FALSE;
+ gDoingBattleAnim = 0;
+ LinkOpponentBufferExecCompleted();
+ }
+ else
+ {
+ if (((u16)gSprites[spriteId].data[1] % 4) == 0)
+ gSprites[spriteId].invisible ^= 1;
+ gSprites[spriteId].data[1]++;
+ }
+}
+
+void sub_8037CC0(void)
+{
+ if (gSprites[gHealthboxIDs[gActiveBank]].callback == SpriteCallbackDummy)
+ {
+ if (ewram17800[gActiveBank].substituteSprite)
+ move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 6);
+ gBattleBankFunc[gActiveBank] = sub_8037D2C;
+ }
+}
+
+void sub_8037D2C(void)
+{
+ if (!ewram17810[gActiveBank].unk0_6)
+ {
+ CreateTask(c3_0802FDF4, 10);
+ LinkOpponentBufferExecCompleted();
+ }
+}
+
+void sub_8037D64(void)
+{
+ if (ewram17810[gActiveBank].unk1_0)
+ {
+ ewram17810[gActiveBank].unk0_7 = 0;
+ ewram17810[gActiveBank].unk1_0 = 0;
+ FreeSpriteTilesByTag(0x27F9);
+ FreeSpritePaletteByTag(0x27F9);
+ StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 0);
+ sub_8045A5C(
+ gHealthboxIDs[gActiveBank],
+ &gEnemyParty[gBattlePartyID[gActiveBank]],
+ 0);
+ sub_804777C(gActiveBank);
+ sub_8043DFC(gHealthboxIDs[gActiveBank]);
+ sub_8031F88(gActiveBank);
+ gBattleBankFunc[gActiveBank] = sub_8037CC0;
+ }
+}
+
+void sub_8037E30(void)
+{
+ if (!ewram17810[gActiveBank].unk0_3 && !ewram17810[gActiveBank].unk0_7)
+ sub_8141828(gActiveBank, &gEnemyParty[gBattlePartyID[gActiveBank]]);
+ if (gSprites[gUnknown_0300434C[gActiveBank]].callback == SpriteCallbackDummy
+ && !ewram17810[gActiveBank].unk0_3)
+ {
+ DestroySprite(&gSprites[gUnknown_0300434C[gActiveBank]]);
+ sub_8032984(gActiveBank, GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES));
+ gBattleBankFunc[gActiveBank] = sub_8037D64;
+ }
+}
+
+void sub_8037EF0(void)
+{
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ m4aSongNumStop(SE_HINSI);
+ gMain.inBattle = FALSE;
+ gMain.callback1 = gPreBattleCallback1;
+ SetMainCallback2(c2_8011A1C);
+ }
+}
+
+void sub_8037F34(void)
+{
+ if (!gPaletteFade.active)
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ {
+ sub_800832C();
+ gBattleBankFunc[gActiveBank] = sub_8037EF0;
+ }
+ else
+ {
+ m4aSongNumStop(SE_HINSI);
+ gMain.inBattle = FALSE;
+ gMain.callback1 = gPreBattleCallback1;
+ SetMainCallback2(gMain.savedCallback);
+ }
+ }
+}
+
+void sub_8037FAC(void)
+{
+ if (!ewram17810[gActiveBank].unk0_4)
+ LinkOpponentBufferExecCompleted();
+}
+
+void sub_8037FD8(void)
+{
+ if (!ewram17810[gActiveBank].unk0_5)
+ LinkOpponentBufferExecCompleted();
+}
+
+void LinkOpponentBufferExecCompleted(void)
+{
+ gBattleBankFunc[gActiveBank] = sub_803752C;
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ {
+ u8 playerId = GetMultiplayerId();
+
+ PrepareBufferDataTransferLink(2, 4, &playerId);
+ gBattleBufferA[gActiveBank][0] = 0x38;
+ }
+ else
+ {
+ gBattleExecBuffer &= ~gBitTable[gActiveBank];
+ }
+}
+
void LinkOpponentHandleGetAttributes(void)
{
u8 buffer[0x100];
@@ -262,7 +596,7 @@ void LinkOpponentHandleGetAttributes(void)
u32 dp01_getattr_by_ch1_for_player_pokemon__(u8 a, u8 *buffer)
{
struct BattlePokemon battlePokemon;
- struct UnknownStruct3 moveData;
+ struct MovePpInfo moveData;
u8 nickname[20];
u8 *src;
s16 data16;
@@ -285,7 +619,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);
@@ -295,7 +629,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);
@@ -304,9 +638,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);
@@ -327,9 +660,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:
@@ -380,7 +711,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:
@@ -419,7 +750,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;
@@ -437,7 +768,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:
@@ -499,7 +830,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;
@@ -594,7 +925,7 @@ void LinkOpponentHandleSetAttributes(void)
void sub_8038900(u8 a)
{
struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBank][3];
- struct UnknownStruct3 *moveData = (struct UnknownStruct3 *)&gBattleBufferA[gActiveBank][3];
+ struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBank][3];
s32 i;
switch (gBattleBufferA[gActiveBank][1])
@@ -603,38 +934,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:
@@ -646,8 +977,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;
@@ -686,7 +1017,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]);
@@ -716,7 +1047,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;
@@ -730,7 +1061,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]);
@@ -763,7 +1094,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]);
@@ -812,9 +1143,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();
}
@@ -826,11 +1157,11 @@ void LinkOpponentHandleLoadPokeSprite(void)
GetMonSpriteTemplate_803C56C(species, GetBankIdentity(gActiveBank));
gObjectBankIDs[gActiveBank] = CreateSprite(
&gUnknown_02024E8C,
- sub_8077ABC(gActiveBank, 2),
+ GetBankPosition(gActiveBank, 2),
sub_8077F68(gActiveBank),
sub_8079E90(gActiveBank));
gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -240;
- gSprites[gObjectBankIDs[gActiveBank]].data0 = gActiveBank;
+ gSprites[gObjectBankIDs[gActiveBank]].data[0] = gActiveBank;
gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank;
StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], gBattleMonForms[gActiveBank]);
sub_8032984(gActiveBank, GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES));
@@ -856,17 +1187,17 @@ void sub_8039430(u8 a, u8 b)
GetMonSpriteTemplate_803C56C(species, GetBankIdentity(a));
gObjectBankIDs[a] = CreateSprite(
&gUnknown_02024E8C,
- sub_8077ABC(a, 2),
+ GetBankPosition(a, 2),
sub_8077F68(a),
sub_8079E90(a));
- gSprites[gUnknown_0300434C[a]].data1 = gObjectBankIDs[a];
- gSprites[gObjectBankIDs[a]].data0 = a;
- gSprites[gObjectBankIDs[a]].data2 = species;
+ gSprites[gUnknown_0300434C[a]].data[1] = gObjectBankIDs[a];
+ gSprites[gObjectBankIDs[a]].data[0] = a;
+ gSprites[gObjectBankIDs[a]].data[2] = species;
gSprites[gObjectBankIDs[a]].oam.paletteNum = a;
StartSpriteAnim(&gSprites[gObjectBankIDs[a]], gBattleMonForms[a]);
gSprites[gObjectBankIDs[a]].invisible = TRUE;
gSprites[gObjectBankIDs[a]].callback = SpriteCallbackDummy;
- gSprites[gUnknown_0300434C[a]].data0 = sub_8046400(0, 0xFE);
+ gSprites[gUnknown_0300434C[a]].data[0] = sub_8046400(0, 0xFE);
}
void LinkOpponentHandleReturnPokeToBall(void)
@@ -931,9 +1262,9 @@ void LinkOpponentHandleTrainerThrow(void)
176 + xOffset, 40 + 4 * (8 - gTrainerFrontPicCoords[gender].coords),
sub_8079E90(gActiveBank));
gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -240;
- gSprites[gObjectBankIDs[gActiveBank]].data0 = 2;
+ gSprites[gObjectBankIDs[gActiveBank]].data[0] = 2;
gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[gender].tag);
- gSprites[gObjectBankIDs[gActiveBank]].data5 = gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum;
+ gSprites[gObjectBankIDs[gActiveBank]].data[5] = gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum;
gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[gender].tag);
gSprites[gObjectBankIDs[gActiveBank]].oam.affineParam = gender;
gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0;
@@ -948,11 +1279,11 @@ void LinkOpponentHandleTrainerSlide(void)
void LinkOpponentHandleTrainerSlideBack(void)
{
oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]);
- gSprites[gObjectBankIDs[gActiveBank]].data0 = 35;
- gSprites[gObjectBankIDs[gActiveBank]].data2 = 280;
- gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y;
+ gSprites[gObjectBankIDs[gActiveBank]].data[0] = 35;
+ gSprites[gObjectBankIDs[gActiveBank]].data[2] = 280;
+ gSprites[gObjectBankIDs[gActiveBank]].data[4] = gSprites[gObjectBankIDs[gActiveBank]].pos1.y;
gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34;
- oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy);
+ StoreSpriteCallbackInData(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy);
gBattleBankFunc[gActiveBank] = sub_80375B4;
}
@@ -1000,21 +1331,21 @@ void LinkOpponentHandleMoveAnimation(void)
u32 r0 = gBattleBufferA[gActiveBank][1]
| (gBattleBufferA[gActiveBank][2] << 8);
- gUnknown_0202F7C4 = gBattleBufferA[gActiveBank][3];
- gMovePowerMoveAnim = gBattleBufferA[gActiveBank][4]
+ gAnimMoveTurn = gBattleBufferA[gActiveBank][3];
+ gAnimMovePower = gBattleBufferA[gActiveBank][4]
| (gBattleBufferA[gActiveBank][5] << 8);
- gMoveDmgMoveAnim = gBattleBufferA[gActiveBank][6]
+ gAnimMoveDmg = gBattleBufferA[gActiveBank][6]
| (gBattleBufferA[gActiveBank][7] << 8)
| (gBattleBufferA[gActiveBank][8] << 16)
| (gBattleBufferA[gActiveBank][9] << 24);
- gHappinessMoveAnim = gBattleBufferA[gActiveBank][10];
+ gAnimFriendship = gBattleBufferA[gActiveBank][10];
gWeatherMoveAnim = gBattleBufferA[gActiveBank][12]
| (gBattleBufferA[gActiveBank][13] << 8);
- gDisableStructMoveAnim = (u32 *)&gBattleBufferA[gActiveBank][16];
- gPID_perBank[gActiveBank] = *gDisableStructMoveAnim;
+ gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBank][16];
+ gTransformedPersonalities[gActiveBank] = gAnimDisableStructPtr->transformedMonPersonality;
// Dead code. sub_8031720 always returns 0.
- if (sub_8031720(r0, gUnknown_0202F7C4) != 0)
+ if (sub_8031720(r0, gAnimMoveTurn) != 0)
{
LinkOpponentBufferExecCompleted();
}
@@ -1046,7 +1377,7 @@ void sub_8039B64(void)
if (!ewram17810[gActiveBank].unk0_6)
{
sub_80326EC(0);
- ExecuteMoveAnim(r4);
+ DoMoveAnim(r4);
ewram17810[gActiveBank].unk4 = 2;
}
break;
@@ -1079,8 +1410,8 @@ void sub_8039B64(void)
void LinkOpponentHandlePrintString(void)
{
- gUnknown_030042A4 = 0;
- gUnknown_030042A0 = 0;
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 0;
BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBank][2]);
sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15);
gBattleBankFunc[gActiveBank] = sub_8037C2C;
@@ -1250,7 +1581,7 @@ void LinkOpponentHandleHitAnimation(void)
else
{
gDoingBattleAnim = TRUE;
- gSprites[gObjectBankIDs[gActiveBank]].data1 = 0;
+ gSprites[gObjectBankIDs[gActiveBank]].data[1] = 0;
sub_8047858(gActiveBank);
gBattleBankFunc[gActiveBank] = dp01t_0F_4_move_anim;
}
@@ -1299,11 +1630,11 @@ void LinkOpponentHandleTrainerBallThrow(void)
u8 taskId;
oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]);
- gSprites[gObjectBankIDs[gActiveBank]].data0 = 35;
- gSprites[gObjectBankIDs[gActiveBank]].data2 = 280;
- gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y;
+ gSprites[gObjectBankIDs[gActiveBank]].data[0] = 35;
+ gSprites[gObjectBankIDs[gActiveBank]].data[2] = 280;
+ gSprites[gObjectBankIDs[gActiveBank]].data[4] = gSprites[gObjectBankIDs[gActiveBank]].pos1.y;
gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34;
- oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], sub_803A3A8);
+ StoreSpriteCallbackInData(&gSprites[gObjectBankIDs[gActiveBank]], sub_803A3A8);
taskId = CreateTask(sub_803A2C4, 5);
gTasks[taskId].data[0] = gActiveBank;
if (ewram17810[gActiveBank].unk0_0)
@@ -1340,7 +1671,7 @@ void sub_803A2C4(u8 taskId)
void sub_803A3A8(struct Sprite *sprite)
{
sub_8031B74(sprite->oam.affineParam);
- sprite->oam.tileNum = sprite->data5;
+ sprite->oam.tileNum = sprite->data[5];
FreeSpriteOamMatrix(sprite);
DestroySprite(sprite);
}
@@ -1400,7 +1731,7 @@ void LinkOpponentHandlecmd50(void)
void LinkOpponentHandleSpriteInvisibility(void)
{
- if (sub_8078874(gActiveBank) != 0)
+ if (IsBankSpritePresent(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..2c78d4a82 100644
--- a/src/battle_controller_linkpartner.c
+++ b/src/battle/battle_controller_linkpartner.c
@@ -1,5 +1,6 @@
#include "global.h"
#include "battle.h"
+#include "battle_anim.h"
#include "battle_interface.h"
#include "data2.h"
#include "battle_811DA74.h"
@@ -13,22 +14,15 @@
#include "rom3.h"
#include "rom_8077ABC.h"
#include "sound.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sprite.h"
#include "string_util.h"
#include "task.h"
#include "text.h"
#include "util.h"
+#include "ewram.h"
-struct UnknownStruct1
-{
- u8 unk0;
- u8 unk1;
- u8 unk2[0x1FE];
-};
-
-//Possibly PokemonSubstruct1
-struct UnknownStruct3
+struct MovePpInfo
{
u16 moves[4];
u8 pp[4];
@@ -46,17 +40,16 @@ extern u8 gBattleOutcome;
extern u16 gUnknown_02024DE8;
extern u8 gUnknown_02024E68[];
extern u8 gDoingBattleAnim;
-extern u32 gPID_perBank[];
+extern u32 gTransformedPersonalities[];
extern struct SpriteTemplate gUnknown_02024E8C;
-extern u32 *gDisableStructMoveAnim;
-extern u32 gMoveDmgMoveAnim;
-extern u16 gMovePowerMoveAnim;
-extern u8 gHappinessMoveAnim;
+extern u32 gAnimMoveDmg;
+extern u16 gAnimMovePower;
+extern u8 gAnimFriendship;
extern u16 gWeatherMoveAnim;
-extern u8 gUnknown_0202F7C4;
+extern u8 gAnimMoveTurn;
extern struct Window gUnknown_03004210;
-extern u16 gUnknown_030042A0;
-extern u16 gUnknown_030042A4;
+extern u16 gBattle_BG0_Y;
+extern u16 gBattle_BG0_X;
extern MainCallback gPreBattleCallback1;
extern void (*gBattleBankFunc[])(void);
extern u8 gHealthboxIDs[];
@@ -66,7 +59,7 @@ extern u8 gAnimScriptActive;
extern void (*gAnimScriptCallback)(void);
extern u8 move_anim_start_t3();
-extern u8 sub_8078874();
+extern u8 IsBankSpritePresent();
extern void sub_8044CA0(u8);
extern void sub_8030E38(struct Sprite *);
extern void sub_80E43C0();
@@ -77,12 +70,12 @@ extern void sub_8043D84();
extern void BufferStringBattle();
extern void sub_8031F24(void);
extern void sub_80326EC();
-extern void ExecuteMoveAnim();
+extern void DoMoveAnim();
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 StoreSpriteCallbackInData();
extern void sub_8078B34(struct Sprite *);
extern void sub_80105EC(struct Sprite *);
extern s32 sub_803FC34(u16);
@@ -92,7 +85,7 @@ extern u8 sub_8046400();
extern void sub_80312F0(struct Sprite *);
extern u8 CreateInvisibleSpriteWithCallback();
extern void BattleLoadPlayerMonSprite();
-extern u8 sub_8077ABC();
+extern u8 GetBankPosition();
extern u8 sub_8077F68();
extern u8 sub_8079E90();
extern void nullsub_10();
@@ -399,20 +392,20 @@ void sub_811DFA0(void)
void bx_blink_t3(void)
{
u8 spriteId = gObjectBankIDs[gActiveBank];
- if (gSprites[spriteId].data1 == 32)
+ if (gSprites[spriteId].data[1] == 32)
{
- gSprites[spriteId].data1 = 0;
+ gSprites[spriteId].data[1] = 0;
gSprites[spriteId].invisible = FALSE;
gDoingBattleAnim = 0;
LinkPartnerBufferExecCompleted();
}
else
{
- if ((gSprites[spriteId].data1 % 4) == 0)
+ if ((gSprites[spriteId].data[1] % 4) == 0)
{
gSprites[spriteId].invisible ^= 1;
}
- gSprites[spriteId].data1++;
+ gSprites[spriteId].data[1]++;
}
}
@@ -551,7 +544,7 @@ void LinkPartnerHandleGetAttributes(void)
u32 dp01_getattr_by_ch1_for_player_pokemon(u8 a, u8 *buffer)
{
struct BattlePokemon battlePokemon;
- struct UnknownStruct3 moveData;
+ struct MovePpInfo moveData;
u8 nickname[20];
u8 *src;
s16 data16;
@@ -574,7 +567,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 +577,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 +586,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 +607,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 +658,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 +697,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 +715,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 +777,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;
@@ -884,7 +873,7 @@ void LinkPartnerHandleSetAttributes(void)
void sub_811EC68(u8 a)
{
struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBank][3];
- struct UnknownStruct3 *moveData = (struct UnknownStruct3 *)&gBattleBufferA[gActiveBank][3];
+ struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBank][3];
s32 i;
switch (gBattleBufferA[gActiveBank][1])
@@ -893,38 +882,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 +925,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 +965,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 +995,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 +1009,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 +1042,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 +1092,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();
}
@@ -1117,11 +1106,11 @@ void LinkPartnerHandleLoadPokeSprite(void)
GetBankIdentity(gActiveBank));
gObjectBankIDs[gActiveBank] = CreateSprite(
&gUnknown_02024E8C,
- sub_8077ABC(gActiveBank, 2),
+ GetBankPosition(gActiveBank, 2),
sub_8077F68(gActiveBank),
sub_8079E90(gActiveBank));
gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -240;
- gSprites[gObjectBankIDs[gActiveBank]].data0 = gActiveBank;
+ gSprites[gObjectBankIDs[gActiveBank]].data[0] = gActiveBank;
gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank;
StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], gBattleMonForms[gActiveBank]);
gBattleBankFunc[gActiveBank] = sub_811DDE8;
@@ -1147,17 +1136,17 @@ void sub_811F864(u8 a, u8 b)
GetMonSpriteTemplate_803C56C(species, GetBankIdentity(a));
gObjectBankIDs[a] = CreateSprite(
&gUnknown_02024E8C,
- sub_8077ABC(a, 2),
+ GetBankPosition(a, 2),
sub_8077F68(a),
sub_8079E90(a));
- gSprites[gUnknown_0300434C[a]].data1 = gObjectBankIDs[a];
- gSprites[gObjectBankIDs[a]].data0 = a;
- gSprites[gObjectBankIDs[a]].data2 = species;
+ gSprites[gUnknown_0300434C[a]].data[1] = gObjectBankIDs[a];
+ gSprites[gObjectBankIDs[a]].data[0] = a;
+ gSprites[gObjectBankIDs[a]].data[2] = species;
gSprites[gObjectBankIDs[a]].oam.paletteNum = a;
StartSpriteAnim(&gSprites[gObjectBankIDs[a]], gBattleMonForms[a]);
gSprites[gObjectBankIDs[a]].invisible = TRUE;
gSprites[gObjectBankIDs[a]].callback = SpriteCallbackDummy;
- gSprites[gUnknown_0300434C[a]].data0 = sub_8046400(0, 0xFF);
+ gSprites[gUnknown_0300434C[a]].data[0] = sub_8046400(0, 0xFF);
}
void LinkPartnerHandleReturnPokeToBall(void)
@@ -1222,7 +1211,7 @@ void LinkPartnerHandleTrainerThrow(void)
sub_8079E90(gActiveBank));
gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank;
gSprites[gObjectBankIDs[gActiveBank]].pos2.x = 240;
- gSprites[gObjectBankIDs[gActiveBank]].data0 = -2;
+ gSprites[gObjectBankIDs[gActiveBank]].data[0] = -2;
gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0;
gBattleBankFunc[gActiveBank] = sub_811DAE4;
}
@@ -1235,11 +1224,11 @@ void LinkPartnerHandleTrainerSlide(void)
void LinkPartnerHandleTrainerSlideBack(void)
{
oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]);
- gSprites[gObjectBankIDs[gActiveBank]].data0 = 35;
- gSprites[gObjectBankIDs[gActiveBank]].data2 = -40;
- gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y;
+ gSprites[gObjectBankIDs[gActiveBank]].data[0] = 35;
+ gSprites[gObjectBankIDs[gActiveBank]].data[2] = -40;
+ gSprites[gObjectBankIDs[gActiveBank]].data[4] = gSprites[gObjectBankIDs[gActiveBank]].pos1.y;
gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34;
- oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy);
+ StoreSpriteCallbackInData(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy);
gBattleBankFunc[gActiveBank] = sub_811DB1C;
}
@@ -1256,8 +1245,8 @@ void LinkPartnerHandlecmd10(void)
ewram17810[gActiveBank].unk4 = 0;
sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
PlaySE12WithPanning(SE_POKE_DEAD, -64);
- gSprites[gObjectBankIDs[gActiveBank]].data1 = 0;
- gSprites[gObjectBankIDs[gActiveBank]].data2 = 5;
+ gSprites[gObjectBankIDs[gActiveBank]].data[1] = 0;
+ gSprites[gObjectBankIDs[gActiveBank]].data[2] = 5;
gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80105EC;
gBattleBankFunc[gActiveBank] = sub_811DE98;
}
@@ -1290,20 +1279,20 @@ void LinkPartnerHandleMoveAnimation(void)
u32 r0 = gBattleBufferA[gActiveBank][1]
| (gBattleBufferA[gActiveBank][2] << 8);
- gUnknown_0202F7C4 = gBattleBufferA[gActiveBank][3];
- gMovePowerMoveAnim = gBattleBufferA[gActiveBank][4]
+ gAnimMoveTurn = gBattleBufferA[gActiveBank][3];
+ gAnimMovePower = gBattleBufferA[gActiveBank][4]
| (gBattleBufferA[gActiveBank][5] << 8);
- gMoveDmgMoveAnim = gBattleBufferA[gActiveBank][6]
+ gAnimMoveDmg = gBattleBufferA[gActiveBank][6]
| (gBattleBufferA[gActiveBank][7] << 8)
| (gBattleBufferA[gActiveBank][8] << 16)
| (gBattleBufferA[gActiveBank][9] << 24);
- gHappinessMoveAnim = gBattleBufferA[gActiveBank][10];
+ gAnimFriendship = gBattleBufferA[gActiveBank][10];
gWeatherMoveAnim = gBattleBufferA[gActiveBank][12]
| (gBattleBufferA[gActiveBank][13] << 8);
- gDisableStructMoveAnim = (u32 *)&gBattleBufferA[gActiveBank][16];
- gPID_perBank[gActiveBank] = *gDisableStructMoveAnim;
+ gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBank][16];
+ gTransformedPersonalities[gActiveBank] = gAnimDisableStructPtr->transformedMonPersonality;
- if (sub_8031720(r0, gUnknown_0202F7C4) != 0)
+ if (sub_8031720(r0, gAnimMoveTurn) != 0)
LinkPartnerBufferExecCompleted();
else
{
@@ -1333,7 +1322,7 @@ void sub_811FF30(void)
if (!ewram17810[gActiveBank].unk0_6)
{
sub_80326EC(0);
- ExecuteMoveAnim(r4);
+ DoMoveAnim(r4);
ewram17810[gActiveBank].unk4 = 2;
}
break;
@@ -1366,8 +1355,8 @@ void sub_811FF30(void)
void LinkPartnerHandlePrintString(void)
{
- gUnknown_030042A4 = 0;
- gUnknown_030042A0 = 0;
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 0;
BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBank][2]);
sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15);
gBattleBankFunc[gActiveBank] = sub_811DFA0;
@@ -1537,7 +1526,7 @@ void LinkPartnerHandleHitAnimation(void)
else
{
gDoingBattleAnim = TRUE;
- gSprites[gObjectBankIDs[gActiveBank]].data1 = 0;
+ gSprites[gObjectBankIDs[gActiveBank]].data[1] = 0;
sub_8047858(gActiveBank);
gBattleBankFunc[gActiveBank] = bx_blink_t3;
}
@@ -1587,12 +1576,12 @@ void LinkPartnerHandleTrainerBallThrow(void)
u8 taskId;
oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]);
- gSprites[gObjectBankIDs[gActiveBank]].data0 = 50;
- gSprites[gObjectBankIDs[gActiveBank]].data2 = -40;
- gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y;
+ gSprites[gObjectBankIDs[gActiveBank]].data[0] = 50;
+ gSprites[gObjectBankIDs[gActiveBank]].data[2] = -40;
+ gSprites[gObjectBankIDs[gActiveBank]].data[4] = 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);
+ gSprites[gObjectBankIDs[gActiveBank]].data[5] = gActiveBank;
+ StoreSpriteCallbackInData(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38);
StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1);
r4 = AllocSpritePalette(0xD6F9);
LoadCompressedPalette(
@@ -1682,7 +1671,7 @@ void LinkPartnerHandlecmd50(void)
void LinkPartnerHandleSpriteInvisibility(void)
{
- if (sub_8078874(gActiveBank) != 0)
+ if (IsBankSpritePresent(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..ab7b6944b 100644
--- a/src/battle_controller_opponent.c
+++ b/src/battle/battle_controller_opponent.c
@@ -1,9 +1,11 @@
#include "global.h"
#include "battle.h"
+#include "battle_anim.h"
#include "battle_interface.h"
#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"
@@ -13,14 +15,15 @@
#include "rom3.h"
#include "rom_8077ABC.h"
#include "sound.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sprite.h"
#include "string_util.h"
#include "task.h"
#include "text.h"
#include "util.h"
+#include "ewram.h"
-struct UnknownStruct3
+struct MovePpInfo
{
u16 moves[4];
u8 pp[4];
@@ -38,18 +41,17 @@ extern u8 gUnknown_0300434C[];
extern u8 gHealthboxIDs[];
extern u16 gBattleTypeFlags;
extern u16 gTrainerBattleOpponent;
-extern u32 *gDisableStructMoveAnim;
-extern u32 gMoveDmgMoveAnim;
-extern u16 gMovePowerMoveAnim;
-extern u8 gHappinessMoveAnim;
+extern u32 gAnimMoveDmg;
+extern u16 gAnimMovePower;
+extern u8 gAnimFriendship;
extern u16 gWeatherMoveAnim;
-extern u32 gPID_perBank[];
-extern u8 gUnknown_0202F7C4;
+extern u32 gTransformedPersonalities[];
+extern u8 gAnimMoveTurn;
extern u8 gAnimScriptActive;
extern void (*gAnimScriptCallback)(void);
extern struct Window gUnknown_03004210;
-extern u16 gUnknown_030042A0;
-extern u16 gUnknown_030042A4;
+extern u16 gBattle_BG0_Y;
+extern u16 gBattle_BG0_X;
extern u8 gDisplayedStringBattle[];
extern u8 gBankTarget;
extern u8 gAbsentBankFlags;
@@ -63,7 +65,7 @@ extern struct MusicPlayerInfo gMPlay_SE2;
extern struct MusicPlayerInfo gMPlay_BGM;
extern u32 gBattleExecBuffer;
-extern u8 sub_8077ABC();
+extern u8 GetBankPosition();
extern u8 sub_8077F68();
extern u8 sub_8079E90();
extern void sub_8033018(void);
@@ -76,7 +78,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,19 +86,19 @@ 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 StoreSpriteCallbackInData();
extern void sub_803311C(void);
extern void sub_8010384(struct Sprite *);
extern bool8 mplay_80342A4(u8);
extern u8 sub_8031720();
-extern void ExecuteMoveAnim();
+extern void DoMoveAnim();
extern void sub_80326EC();
extern void sub_8031F24(void);
extern void sub_80324BC();
extern void BufferStringBattle();
extern void sub_80331D0(void);
extern void sub_8036B0C(void);
-extern u8 GetBankByPlayerAI(u8);
+extern u8 GetBankByIdentity(u8);
extern u8 sub_8036CD4(void);
extern void sub_80330C8(void);
extern void sub_8043D84();
@@ -113,7 +114,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 IsBankSpritePresent();
extern u8 move_anim_start_t3();
extern void sub_80334C0(void);
@@ -294,7 +295,7 @@ void sub_8032BBC(void)
if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy)
{
sub_8031B74(gSprites[gObjectBankIDs[gActiveBank]].oam.affineParam);
- gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum = gSprites[gObjectBankIDs[gActiveBank]].data5;
+ gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum = gSprites[gObjectBankIDs[gActiveBank]].data[5];
FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]);
DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]);
OpponentBufferExecCompleted();
@@ -446,18 +447,18 @@ void bx_blink_t7(void)
{
u8 spriteId = gObjectBankIDs[gActiveBank];
- if (gSprites[spriteId].data1 == 32)
+ if (gSprites[spriteId].data[1] == 32)
{
- gSprites[spriteId].data1 = 0;
+ gSprites[spriteId].data[1] = 0;
gSprites[spriteId].invisible = FALSE;
gDoingBattleAnim = 0;
OpponentBufferExecCompleted();
}
else
{
- if (((u16)gSprites[spriteId].data1 % 4) == 0)
+ if (((u16)gSprites[spriteId].data[1] % 4) == 0)
gSprites[spriteId].invisible ^= 1;
- gSprites[spriteId].data1++;
+ gSprites[spriteId].data[1]++;
}
}
@@ -559,7 +560,7 @@ void OpponentHandleGetAttributes(void)
u32 sub_8033598(u8 a, u8 *buffer)
{
struct BattlePokemon battlePokemon;
- struct UnknownStruct3 moveData;
+ struct MovePpInfo moveData;
u8 nickname[20];
u8 *src;
s16 data16;
@@ -582,7 +583,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 +593,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 +602,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 +623,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 +674,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 +713,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 +731,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 +793,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 +861,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();
}
@@ -899,7 +896,7 @@ void OpponentHandleSetAttributes(void)
void sub_8033E24(u8 a)
{
struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBank][3];
- struct UnknownStruct3 *moveData = (struct UnknownStruct3 *)&gBattleBufferA[gActiveBank][3];
+ struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBank][3];
s32 i;
switch (gBattleBufferA[gActiveBank][1])
@@ -908,38 +905,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 +948,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 +988,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 +1018,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 +1032,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 +1065,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 +1114,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();
}
@@ -1131,12 +1127,12 @@ void OpponentHandleLoadPokeSprite(void)
GetMonSpriteTemplate_803C56C(species, GetBankIdentity(gActiveBank));
gObjectBankIDs[gActiveBank] = CreateSprite(
&gUnknown_02024E8C,
- sub_8077ABC(gActiveBank, 2),
+ GetBankPosition(gActiveBank, 2),
sub_8077F68(gActiveBank),
sub_8079E90(gActiveBank));
gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -240;
- gSprites[gObjectBankIDs[gActiveBank]].data0 = gActiveBank;
- gSprites[gObjectBankIDs[gActiveBank]].data2 = species;
+ gSprites[gObjectBankIDs[gActiveBank]].data[0] = gActiveBank;
+ gSprites[gObjectBankIDs[gActiveBank]].data[2] = species;
gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank;
StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], gBattleMonForms[gActiveBank]);
sub_8032984(gActiveBank, GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES));
@@ -1163,17 +1159,17 @@ void sub_803495C(u8 a, u8 b)
GetMonSpriteTemplate_803C56C(species, GetBankIdentity(a));
gObjectBankIDs[a] = CreateSprite(
&gUnknown_02024E8C,
- sub_8077ABC(a, 2),
+ GetBankPosition(a, 2),
sub_8077F68(a),
sub_8079E90(a));
- gSprites[gObjectBankIDs[a]].data0 = a;
- gSprites[gObjectBankIDs[a]].data2 = species;
- gSprites[gUnknown_0300434C[a]].data1 = gObjectBankIDs[a];
+ gSprites[gObjectBankIDs[a]].data[0] = a;
+ gSprites[gObjectBankIDs[a]].data[2] = species;
+ gSprites[gUnknown_0300434C[a]].data[1] = gObjectBankIDs[a];
gSprites[gObjectBankIDs[a]].oam.paletteNum = a;
StartSpriteAnim(&gSprites[gObjectBankIDs[a]], gBattleMonForms[a]);
gSprites[gObjectBankIDs[a]].invisible = TRUE;
gSprites[gObjectBankIDs[a]].callback = SpriteCallbackDummy;
- gSprites[gUnknown_0300434C[a]].data0 = sub_8046400(0, 0xFE);
+ gSprites[gUnknown_0300434C[a]].data[0] = sub_8046400(0, 0xFE);
}
void OpponentHandleReturnPokeToBall(void)
@@ -1222,7 +1218,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;
@@ -1234,9 +1230,9 @@ void OpponentHandleTrainerThrow(void)
40 + 4 * (8 - gTrainerFrontPicCoords[trainerPicIndex].coords),
sub_8079E90(gActiveBank));
gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -240;
- gSprites[gObjectBankIDs[gActiveBank]].data0 = 2;
+ gSprites[gObjectBankIDs[gActiveBank]].data[0] = 2;
gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicIndex].tag);
- gSprites[gObjectBankIDs[gActiveBank]].data5 = gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum;
+ gSprites[gObjectBankIDs[gActiveBank]].data[5] = gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum;
gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[trainerPicIndex].tag);
gSprites[gObjectBankIDs[gActiveBank]].oam.affineParam = trainerPicIndex;
gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0;
@@ -1252,7 +1248,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;
@@ -1265,9 +1261,9 @@ void OpponentHandleTrainerSlide(void)
0x1E);
gSprites[gObjectBankIDs[gActiveBank]].pos2.x = 96;
gSprites[gObjectBankIDs[gActiveBank]].pos1.x += 32;
- gSprites[gObjectBankIDs[gActiveBank]].data0 = -2;
+ gSprites[gObjectBankIDs[gActiveBank]].data[0] = -2;
gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicIndex].tag);
- gSprites[gObjectBankIDs[gActiveBank]].data5 = gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum;
+ gSprites[gObjectBankIDs[gActiveBank]].data[5] = gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum;
gSprites[gObjectBankIDs[gActiveBank]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[trainerPicIndex].tag);
gSprites[gObjectBankIDs[gActiveBank]].oam.affineParam = trainerPicIndex;
gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0;
@@ -1277,11 +1273,11 @@ void OpponentHandleTrainerSlide(void)
void OpponentHandleTrainerSlideBack(void)
{
oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]);
- gSprites[gObjectBankIDs[gActiveBank]].data0 = 35;
- gSprites[gObjectBankIDs[gActiveBank]].data2 = 280;
- gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y;
+ gSprites[gObjectBankIDs[gActiveBank]].data[0] = 35;
+ gSprites[gObjectBankIDs[gActiveBank]].data[2] = 280;
+ gSprites[gObjectBankIDs[gActiveBank]].data[4] = gSprites[gObjectBankIDs[gActiveBank]].pos1.y;
gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34;
- oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy);
+ StoreSpriteCallbackInData(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy);
gBattleBankFunc[gActiveBank] = sub_8032BBC;
}
@@ -1329,21 +1325,21 @@ void OpponentHandleMoveAnimation(void)
u32 r0 = gBattleBufferA[gActiveBank][1]
| (gBattleBufferA[gActiveBank][2] << 8);
- gUnknown_0202F7C4 = gBattleBufferA[gActiveBank][3];
- gMovePowerMoveAnim = gBattleBufferA[gActiveBank][4]
+ gAnimMoveTurn = gBattleBufferA[gActiveBank][3];
+ gAnimMovePower = gBattleBufferA[gActiveBank][4]
| (gBattleBufferA[gActiveBank][5] << 8);
- gMoveDmgMoveAnim = gBattleBufferA[gActiveBank][6]
+ gAnimMoveDmg = gBattleBufferA[gActiveBank][6]
| (gBattleBufferA[gActiveBank][7] << 8)
| (gBattleBufferA[gActiveBank][8] << 16)
| (gBattleBufferA[gActiveBank][9] << 24);
- gHappinessMoveAnim = gBattleBufferA[gActiveBank][10];
+ gAnimFriendship = gBattleBufferA[gActiveBank][10];
gWeatherMoveAnim = gBattleBufferA[gActiveBank][12]
| (gBattleBufferA[gActiveBank][13] << 8);
- gDisableStructMoveAnim = (u32 *)&gBattleBufferA[gActiveBank][16];
- gPID_perBank[gActiveBank] = *gDisableStructMoveAnim;
+ gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBank][16];
+ gTransformedPersonalities[gActiveBank] = gAnimDisableStructPtr->transformedMonPersonality;
// Dead code. sub_8031720 always returns 0.
- if (sub_8031720(r0, gUnknown_0202F7C4) != 0)
+ if (sub_8031720(r0, gAnimMoveTurn) != 0)
{
OpponentBufferExecCompleted();
}
@@ -1375,7 +1371,7 @@ void sub_8035238(void)
if (!ewram17810[gActiveBank].unk0_6)
{
sub_80326EC(0);
- ExecuteMoveAnim(r4);
+ DoMoveAnim(r4);
ewram17810[gActiveBank].unk4 = 2;
}
break;
@@ -1408,8 +1404,8 @@ void sub_8035238(void)
void OpponentHandlePrintString(void)
{
- gUnknown_030042A4 = 0;
- gUnknown_030042A0 = 0;
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 0;
BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBank][2]);
sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15);
gBattleBankFunc[gActiveBank] = sub_80331D0;
@@ -1455,9 +1451,9 @@ void OpponentHandlecmd20(void)
gBankTarget = gActiveBank;
if (gBattleMoves[r5->moves[r4]].target & 8)
{
- gBankTarget = GetBankByPlayerAI(0);
+ gBankTarget = GetBankByIdentity(0);
if (gAbsentBankFlags & gBitTable[gBankTarget])
- gBankTarget = GetBankByPlayerAI(2);
+ gBankTarget = GetBankByIdentity(2);
}
r4 |= gBankTarget << 8;
Emitcmd33(1, 10, r4);
@@ -1483,13 +1479,13 @@ void OpponentHandlecmd20(void)
}
else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
- u16 r2 = GetBankByPlayerAI(Random() & 2) << 8;
+ u16 r2 = GetBankByIdentity(Random() & 2) << 8;
Emitcmd33(1, 10, r4 | r2);
}
else
{
- u16 r2 = GetBankByPlayerAI(0) << 8;
+ u16 r2 = GetBankByIdentity(0) << 8;
Emitcmd33(1, 10, r4 | r2);
}
@@ -1565,7 +1561,7 @@ _08035494:\n\
cmp r0, 0\n\
beq _080354CE\n\
movs r0, 0\n\
- bl GetBankByPlayerAI\n\
+ bl GetBankByIdentity\n\
ldr r5, _080354EC @ =gBankTarget\n\
strb r0, [r5]\n\
ldr r0, _080354F0 @ =gAbsentBankFlags\n\
@@ -1579,7 +1575,7 @@ _08035494:\n\
cmp r1, 0\n\
beq _080354CE\n\
movs r0, 0x2\n\
- bl GetBankByPlayerAI\n\
+ bl GetBankByIdentity\n\
strb r0, [r5]\n\
_080354CE:\n\
ldr r0, _080354EC @ =gBankTarget\n\
@@ -1644,7 +1640,7 @@ _0803553C:\n\
lsls r1, 24\n\
lsrs r1, 24\n\
adds r0, r1, 0\n\
- bl GetBankByPlayerAI\n\
+ bl GetBankByIdentity\n\
adds r2, r0, 0\n\
lsls r2, 24\n\
lsrs r2, 16\n\
@@ -1657,7 +1653,7 @@ _0803553C:\n\
_0803556C: .4byte gBattleTypeFlags\n\
_08035570:\n\
movs r0, 0\n\
- bl GetBankByPlayerAI\n\
+ bl GetBankByIdentity\n\
adds r2, r0, 0\n\
lsls r2, 24\n\
lsrs r2, 16\n\
@@ -1678,7 +1674,7 @@ _0803558A:\n\
void OpponentHandleOpenBag(void)
{
// What is this?
- Emitcmd35(1, ewram[0x160D4 + gActiveBank / 2 * 2]);
+ Emitcmd35(1, ewram160D4(gActiveBank));
OpponentBufferExecCompleted();
}
@@ -1686,7 +1682,7 @@ void OpponentHandlecmd22(void)
{
s32 r4;
- if (ewram[0x160C8 + GetBankIdentity(gActiveBank) / 2] == 6)
+ if (ewram160C8arr(GetBankIdentity(gActiveBank)) == 6)
{
u8 r6;
u8 r5;
@@ -1696,13 +1692,13 @@ void OpponentHandlecmd22(void)
{
if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
{
- r5 = GetBankByPlayerAI(1);
+ r5 = GetBankByIdentity(1);
r6 = r5;
}
else
{
- r6 = GetBankByPlayerAI(1);
- r5 = GetBankByPlayerAI(3);
+ r6 = GetBankByIdentity(1);
+ r5 = GetBankByIdentity(3);
}
for (r4 = 0; r4 < 6; r4++)
{
@@ -1715,10 +1711,10 @@ void OpponentHandlecmd22(void)
}
else
{
- r4 = ewram[0x160C8 + GetBankIdentity(gActiveBank) / 2];
- ewram[0x160C8 + GetBankIdentity(gActiveBank) / 2] = 6;
+ r4 = ewram160C8arr(GetBankIdentity(gActiveBank));
+ ewram160C8arr(GetBankIdentity(gActiveBank)) = 6;
}
- ewram[0x16068 + gActiveBank] = r4;
+ ewram16068arr(gActiveBank) = r4;
Emitcmd34(1, r4, 0);
OpponentBufferExecCompleted();
}
@@ -1857,7 +1853,7 @@ void OpponentHandleHitAnimation(void)
else
{
gDoingBattleAnim = TRUE;
- gSprites[gObjectBankIDs[gActiveBank]].data1 = 0;
+ gSprites[gObjectBankIDs[gActiveBank]].data[1] = 0;
sub_8047858(gActiveBank);
gBattleBankFunc[gActiveBank] = bx_blink_t7;
}
@@ -1906,11 +1902,11 @@ void OpponentHandleTrainerBallThrow(void)
u8 taskId;
oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]);
- gSprites[gObjectBankIDs[gActiveBank]].data0 = 35;
- gSprites[gObjectBankIDs[gActiveBank]].data2 = 280;
- gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y;
+ gSprites[gObjectBankIDs[gActiveBank]].data[0] = 35;
+ gSprites[gObjectBankIDs[gActiveBank]].data[2] = 280;
+ gSprites[gObjectBankIDs[gActiveBank]].data[4] = gSprites[gObjectBankIDs[gActiveBank]].pos1.y;
gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34;
- oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], sub_8035C10);
+ StoreSpriteCallbackInData(&gSprites[gObjectBankIDs[gActiveBank]], sub_8035C10);
taskId = CreateTask(sub_8035C44, 5);
gTasks[taskId].data[0] = gActiveBank;
if (ewram17810[gActiveBank].unk0_0)
@@ -1922,7 +1918,7 @@ void OpponentHandleTrainerBallThrow(void)
void sub_8035C10(struct Sprite *sprite)
{
sub_8031B74(sprite->oam.affineParam);
- sprite->oam.tileNum = sprite->data5;
+ sprite->oam.tileNum = sprite->data[5];
FreeSpriteOamMatrix(sprite);
DestroySprite(sprite);
}
@@ -2007,7 +2003,7 @@ void OpponentHandlecmd50(void)
void OpponentHandleSpriteInvisibility(void)
{
- if (sub_8078874(gActiveBank) != 0)
+ if (IsBankSpritePresent(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..f992e3e51 100644
--- a/src/battle_controller_player.c
+++ b/src/battle/battle_controller_player.c
@@ -1,27 +1,28 @@
#include "global.h"
#include "data2.h"
#include "battle.h"
+#include "battle_anim.h"
#include "battle_interface.h"
#include "battle_message.h"
#include "item.h"
-#include "items.h"
+#include "constants/items.h"
#include "link.h"
#include "m4a.h"
#include "main.h"
#include "menu_cursor.h"
-#include "moves.h"
+#include "constants/moves.h"
#include "palette.h"
#include "pokemon.h"
#include "rom3.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "string_util.h"
#include "task.h"
#include "text.h"
#include "util.h"
+#include "ewram.h"
-//Possibly PokemonSubstruct1
-struct UnknownStruct3
+struct MovePpInfo
{
u16 moves[4];
u8 pp[4];
@@ -34,8 +35,8 @@ struct UnknownStruct3
#define SUB_803037C_TILE_DATA_OFFSET 444
#endif
-extern u16 gUnknown_030042A4;
-extern u16 gUnknown_030042A0;
+extern u16 gBattle_BG0_X;
+extern u16 gBattle_BG0_Y;
extern struct Window gUnknown_03004210;
@@ -55,31 +56,30 @@ extern u16 gBattleTypeFlags;
extern u8 gBattleOutcome;
extern void (*gAnimScriptCallback)(void);
extern bool8 gAnimScriptActive;
-extern u16 gMovePowerMoveAnim;
-extern u32 gMoveDmgMoveAnim;
-extern u8 gHappinessMoveAnim;
+extern u16 gAnimMovePower;
+extern u32 gAnimMoveDmg;
+extern u8 gAnimFriendship;
extern u16 gWeatherMoveAnim;
-extern u32 *gDisableStructMoveAnim;
-extern u32 gPID_perBank[];
+extern u32 gTransformedPersonalities[];
extern u8 gBattleMonForms[];
extern u16 gUnknown_02024DE8;
extern u8 gUnknown_02024E68[];
extern struct SpriteTemplate gUnknown_02024E8C;
-extern u8 gUnknown_0202F7C4;
+extern u8 gAnimMoveTurn;
extern u8 gUnknown_02038470[];
extern u16 gUnknown_030041B0;
-extern u16 gUnknown_030041B4;
+extern u16 gBattle_BG1_Y;
extern u16 gUnknown_030041B8;
-extern u16 gUnknown_03004280;
-extern u16 gUnknown_03004288;
-extern u16 gUnknown_030042A4;
-extern u16 gUnknown_030042C0;
+extern u16 gBattle_BG2_Y;
+extern u16 gBattle_BG2_X;
+extern u16 gBattle_BG0_X;
+extern u16 gBattle_BG1_X;
extern u8 gUnknown_03004344;
extern u8 gUnknown_0300434C[];
-extern const u8 gUnknown_08400CA8[];
-extern const u8 gUnknown_08400CF3[];
-extern const u8 gUnknown_08400D38[];
+extern const u8 BattleText_OtherMenu[];
+extern const u8 BattleText_MenuOptions[];
+extern const u8 BattleText_PP[];
extern void sub_802C68C(void);
extern void sub_802E1B0(void);
@@ -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 StoreSpriteCallbackInData();
extern void BattleLoadPlayerMonSprite();
extern bool8 IsDoubleBattle(void);
extern void sub_802D500(void);
-extern bool8 sub_8078874(u8);
+extern bool8 IsBankSpritePresent(u8);
extern bool8 move_anim_start_t3();
extern void sub_802E460(void);
extern void b_link_standby_message(void);
@@ -113,12 +113,12 @@ extern void sub_802D18C(void);
extern void sub_802DF18(void);
extern void BufferStringBattle();
extern void sub_80326EC();
-extern void ExecuteMoveAnim();
+extern void DoMoveAnim();
extern void sub_8031F24(void);
extern void sub_80324BC();
extern u8 sub_8031720();
extern void bx_wait_t1(void);
-extern u8 GetBankByPlayerAI(u8);
+extern u8 GetBankByIdentity(u8);
extern void sub_802DE10(void);
extern void sub_80105EC(struct Sprite *);
extern void sub_802D274(void);
@@ -130,7 +130,7 @@ extern void sub_802D204(void);
extern u8 sub_8079E90();
extern void sub_802DEAC(void);
extern void sub_80312F0(struct Sprite *);
-extern u8 sub_8077ABC();
+extern u8 GetBankPosition();
extern u8 sub_8077F68();
extern u8 sub_8046400();
extern void sub_802D798(void);
@@ -148,10 +148,10 @@ extern u8 gAbsentBankFlags;
extern u8 gUnknown_03004344;
extern u8 gNoOfAllBanks;
extern u16 gBattlePartyID[];
-extern u16 gUnknown_030042A0;
-extern u16 gUnknown_030042A4;
+extern u16 gBattle_BG0_Y;
+extern u16 gBattle_BG0_X;
extern struct Window gUnknown_03004210;
-extern const u8 gUnknown_08400D89[];
+extern const u8 BattleText_SwitchWhich[];
extern u8 gUnknown_03004348;
extern struct BattlePokemon gBattleMons[];
extern MainCallback gPreBattleCallback1;
@@ -161,13 +161,13 @@ extern u8 gUnknown_0300434C[];
extern u8 gUnknown_0202E8F4;
extern u8 gUnknown_0202E8F5;
extern u8 gUnknown_02038470[];
-extern u16 gScriptItemId;
+extern u16 gSpecialVar_ItemId;
extern u8 gDisplayedStringBattle[];
-extern const u8 gUnknown_08400CE0[];
+extern const u8 BattleText_LinkStandby[];
extern void dp11b_obj_instanciate(u8, u8, s8, s8);
extern u8 GetBankIdentity(u8);
-extern u8 GetBankByPlayerAI(u8);
+extern u8 GetBankByIdentity(u8);
extern void dp11b_obj_free(u8, u8);
extern void sub_8010520(struct Sprite *);
extern void sub_8010574(struct Sprite *);
@@ -445,7 +445,7 @@ void sub_802C098(void)
{
if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
&& GetBankIdentity(gActiveBank) == 2
- && !(gAbsentBankFlags & gBitTable[GetBankByPlayerAI(0)])
+ && !(gAbsentBankFlags & gBitTable[GetBankByIdentity(0)])
&& !(gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
if (gBattleBufferA[gActiveBank][1] == 1)
@@ -529,7 +529,7 @@ void sub_802C2EC(void)
i--;
if (i < 0)
i = 3;
- gUnknown_03004344 = GetBankByPlayerAI(arr[i]);
+ gUnknown_03004344 = GetBankByIdentity(arr[i]);
} while(gUnknown_03004344 == gNoOfAllBanks);
i = 0;
switch (GetBankIdentity(gUnknown_03004344))
@@ -576,7 +576,7 @@ void sub_802C2EC(void)
i++;
if (i > 3)
i = 0;
- gUnknown_03004344 = GetBankByPlayerAI(arr[i]);
+ gUnknown_03004344 = GetBankByIdentity(arr[i]);
} while (gUnknown_03004344 == gNoOfAllBanks);
i = 0;
switch (GetBankIdentity(gUnknown_03004344))
@@ -605,7 +605,7 @@ void sub_802C2EC(void)
}
}
-struct UnknownStruct1
+struct ChooseMoveStruct
{
u16 moves[4];
u8 pp[4];
@@ -620,7 +620,7 @@ const u8 gUnknown_081FAE80[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW WHITE LIGHT
void sub_802C68C(void)
{
u32 r8 = 0;
- struct UnknownStruct1 *r6 = (struct UnknownStruct1 *)(gBattleBufferA[gActiveBank] + 4);
+ struct ChooseMoveStruct *r6 = (struct ChooseMoveStruct *)(gBattleBufferA[gActiveBank] + 4);
if (gMain.newKeys & A_BUTTON)
{
@@ -636,7 +636,7 @@ void sub_802C68C(void)
if (r4 & 0x10)
gUnknown_03004344 = gActiveBank;
else
- gUnknown_03004344 = GetBankByPlayerAI((GetBankIdentity(gActiveBank) & 1) ^ 1);
+ gUnknown_03004344 = GetBankByIdentity((GetBankIdentity(gActiveBank) & 1) ^ 1);
if (gBattleBufferA[gActiveBank][1] == 0)
{
@@ -668,10 +668,10 @@ void sub_802C68C(void)
gBattleBankFunc[gActiveBank] = sub_802C2EC;
if (r4 & 0x12)
gUnknown_03004344 = gActiveBank;
- else if (gAbsentBankFlags & gBitTable[GetBankByPlayerAI(1)])
- gUnknown_03004344 = GetBankByPlayerAI(3);
+ else if (gAbsentBankFlags & gBitTable[GetBankByIdentity(1)])
+ gUnknown_03004344 = GetBankByIdentity(3);
else
- gUnknown_03004344 = GetBankByPlayerAI(1);
+ gUnknown_03004344 = GetBankByIdentity(1);
gSprites[gObjectBankIDs[gUnknown_03004344]].callback = sub_8010520;
}
}
@@ -679,8 +679,8 @@ void sub_802C68C(void)
{
DestroyMenuCursor();
PlaySE(SE_SELECT);
- gUnknown_030042A4 = 0;
- gUnknown_030042A0 = 320;
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 320;
Emitcmd33(1, 10, 0xFFFF);
PlayerBufferExecCompleted();
}
@@ -745,15 +745,14 @@ void sub_802C68C(void)
gUnknown_03004344 = gMoveSelectionCursor[gActiveBank] + 1;
sub_802E3B4(gUnknown_03004344, 27);
FillWindowRect(&gUnknown_03004210, 0x1016, 0x17, 0x37, 0x1C, 0x3A);
- InitWindow(&gUnknown_03004210, gUnknown_08400D89, 0x290, 0x17, 0x37);
+ InitWindow(&gUnknown_03004210, BattleText_SwitchWhich, 0x290, 0x17, 0x37);
sub_8002F44(&gUnknown_03004210);
gBattleBankFunc[gActiveBank] = sub_802CA60;
}
}
}
-extern const u8 gUnknown_08400D49[];
-extern const u8 gUnknown_08400D38[];
+extern const u8 BattleText_Format[];
void sub_802CA60(void)
{
@@ -764,7 +763,7 @@ void sub_802CA60(void)
u8 pp[4];
u8 filler18[8]; // what is this?
} sp0;
- //struct UnknownStruct1 sp0;
+ //struct ChooseMoveStruct sp0;
u8 totalPPBonuses;
if (gMain.newKeys & (A_BUTTON | SELECT_BUTTON))
@@ -772,7 +771,7 @@ void sub_802CA60(void)
PlaySE(SE_SELECT);
if (gMoveSelectionCursor[gActiveBank] != gUnknown_03004344)
{
- struct UnknownStruct1 *r9 = (struct UnknownStruct1 *)&gBattleBufferA[gActiveBank][4];
+ struct ChooseMoveStruct *r9 = (struct ChooseMoveStruct *)&gBattleBufferA[gActiveBank][4];
s32 i;
i = r9->moves[gMoveSelectionCursor[gActiveBank]];
@@ -841,7 +840,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);
@@ -849,13 +848,13 @@ void sub_802CA60(void)
}
else
{
- sub_802E12C(gUnknown_03004344, gUnknown_08400D49);
+ sub_802E12C(gUnknown_03004344, BattleText_Format);
}
gBattleBankFunc[gActiveBank] = sub_802C68C;
gMoveSelectionCursor[gActiveBank] = gUnknown_03004344;
sub_802E3B4(gMoveSelectionCursor[gActiveBank], 0);
FillWindowRect(&gUnknown_03004210, 0x1016, 0x17, 0x37, 0x1C, 0x3A);
- InitWindow(&gUnknown_03004210, gUnknown_08400D38, 0x290, 0x17, 0x37);
+ InitWindow(&gUnknown_03004210, BattleText_PP, 0x290, 0x17, 0x37);
sub_8002F44(&gUnknown_03004210);
sub_802E220();
sub_802E2D4();
@@ -865,10 +864,10 @@ void sub_802CA60(void)
PlaySE(SE_SELECT);
nullsub_7(gUnknown_03004344);
sub_802E3B4(gMoveSelectionCursor[gActiveBank], 0);
- sub_802E12C(gMoveSelectionCursor[gActiveBank], gUnknown_08400D49);
+ sub_802E12C(gMoveSelectionCursor[gActiveBank], BattleText_Format);
gBattleBankFunc[gActiveBank] = sub_802C68C;
FillWindowRect(&gUnknown_03004210, 0x1016, 0x17, 0x37, 0x1C, 0x3A);
- InitWindow(&gUnknown_03004210, gUnknown_08400D38, 0x290, 0x17, 0x37);
+ InitWindow(&gUnknown_03004210, BattleText_PP, 0x290, 0x17, 0x37);
sub_8002F44(&gUnknown_03004210);
sub_802E220();
sub_802E2D4();
@@ -1149,7 +1148,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 +1165,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 +1230,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 +1246,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);
}
@@ -1496,7 +1495,7 @@ void sub_802DF30(void)
void sub_802DF88(void)
{
- if (gMain.callback2 == sub_800F808 && !gPaletteFade.active)
+ if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active)
{
if (gUnknown_0202E8F4 == 1)
Emitcmd34(1, gUnknown_0202E8F5, gUnknown_02038470);
@@ -1520,9 +1519,9 @@ void sub_802E004(void)
void sub_802E03C(void)
{
- if (gMain.callback2 == sub_800F808 && !gPaletteFade.active)
+ if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active)
{
- Emitcmd35(1, gScriptItemId);
+ Emitcmd35(1, gSpecialVar_ItemId);
PlayerBufferExecCompleted();
}
}
@@ -1537,24 +1536,24 @@ void bx_blink_t1(void)
{
u8 spriteId = gObjectBankIDs[gActiveBank];
- if (gSprites[spriteId].data1 == 32)
+ if (gSprites[spriteId].data[1] == 32)
{
- gSprites[spriteId].data1 = 0;
+ gSprites[spriteId].data[1] = 0;
gSprites[spriteId].invisible = FALSE;
gDoingBattleAnim = 0;
PlayerBufferExecCompleted();
}
else
{
- if (((u16)gSprites[spriteId].data1 % 4) == 0)
+ if (((u16)gSprites[spriteId].data[1] % 4) == 0)
gSprites[spriteId].invisible ^= 1;
- gSprites[spriteId].data1++;
+ gSprites[spriteId].data[1]++;
}
}
void sub_802E12C(s32 a, const u8 *b)
{
- struct UnknownStruct1 *r4 = (struct UnknownStruct1 *)&gBattleBufferA[gActiveBank][4];
+ struct ChooseMoveStruct *r4 = (struct ChooseMoveStruct *)&gBattleBufferA[gActiveBank][4];
StringCopy(gDisplayedStringBattle, b);
StringAppend(gDisplayedStringBattle, gMoveNames[r4->moves[a]]);
@@ -1569,7 +1568,7 @@ void sub_802E12C(s32 a, const u8 *b)
void sub_802E1B0(void)
{
- struct UnknownStruct1 *r4 = (struct UnknownStruct1 *)&gBattleBufferA[gActiveBank][4];
+ struct ChooseMoveStruct *r4 = (struct ChooseMoveStruct *)&gBattleBufferA[gActiveBank][4];
s32 i;
gUnknown_03004348 = 0;
@@ -1577,7 +1576,7 @@ void sub_802E1B0(void)
for (i = 0; i < 4; i++)
{
nullsub_7(i);
- sub_802E12C(i, gUnknown_08400D49);
+ sub_802E12C(i, BattleText_Format);
if (r4->moves[i] != 0)
gUnknown_03004348++;
}
@@ -1587,10 +1586,10 @@ void sub_802E220(void)
{
if (gBattleBufferA[gActiveBank][2] != 1)
{
- struct UnknownStruct1 *r4 = (struct UnknownStruct1 *)&gBattleBufferA[gActiveBank][4];
+ struct ChooseMoveStruct *r4 = (struct ChooseMoveStruct *)&gBattleBufferA[gActiveBank][4];
u8 *str = gDisplayedStringBattle;
- str = StringCopy(str, gUnknown_08400D49);
+ str = StringCopy(str, BattleText_Format);
str[0] = EXT_CTRL_CODE_BEGIN;
str[1] = 0x11;
str[2] = 2;
@@ -1607,7 +1606,7 @@ void sub_802E220(void)
}
}
-extern const u8 gUnknown_08400D52[];
+extern const u8 BattleText_ForgetMove[];
extern const u8 gTypeNames[][7];
void sub_802E2D4(void)
@@ -1615,14 +1614,14 @@ void sub_802E2D4(void)
if (gBattleBufferA[gActiveBank][2] == 1)
{
FillWindowRect(&gUnknown_03004210, 0x1016, 0x17, 0x37, 0x1C, 0x3A);
- InitWindow(&gUnknown_03004210, gUnknown_08400D52, 0x290, 0x13, 0x37);
+ InitWindow(&gUnknown_03004210, BattleText_ForgetMove, 0x290, 0x13, 0x37);
}
else
{
- struct UnknownStruct1 *r4 = (struct UnknownStruct1 *)&gBattleBufferA[gActiveBank][4];
+ struct ChooseMoveStruct *r4 = (struct ChooseMoveStruct *)&gBattleBufferA[gActiveBank][4];
u8 *str = gDisplayedStringBattle;
- str = StringCopy(str, gUnknown_08400D49);
+ str = StringCopy(str, BattleText_Format);
StringCopy(str, gTypeNames[gBattleMoves[r4->moves[gMoveSelectionCursor[gActiveBank]]].type]);
FillWindowRect(&gUnknown_03004210, 0x1016, 0x17, 0x39, 0x1C, 0x3A);
InitWindow(&gUnknown_03004210, gDisplayedStringBattle, 0x2C0, 0x17, 0x39);
@@ -1696,9 +1695,9 @@ void b_link_standby_message(void)
{
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
- gUnknown_030042A4 = 0;
- gUnknown_030042A0 = 0;
- sub_8002EB0(&gUnknown_03004210, gUnknown_08400CE0, 0x90, 2, 15);
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 0;
+ sub_8002EB0(&gUnknown_03004210, BattleText_LinkStandby, 0x90, 2, 15);
}
}
@@ -1731,7 +1730,7 @@ void PlayerHandleGetAttributes(void)
u32 dp01_getattr_by_ch1_for_player_pokemon_(u8 a, u8 *buffer)
{
struct BattlePokemon battlePokemon;
- struct UnknownStruct3 moveData;
+ struct MovePpInfo moveData;
u8 nickname[20];
u8 *src;
s16 data16;
@@ -1754,7 +1753,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 +1763,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 +1772,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 +1793,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 +1844,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 +1883,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 +1901,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 +1963,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 +2030,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();
}
@@ -2072,7 +2067,7 @@ void PlayerHandleSetAttributes(void)
void dp01_setattr_by_ch1_for_player_pokemon(u8 a)
{
struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBank][3];
- struct UnknownStruct3 *moveData = (struct UnknownStruct3 *)&gBattleBufferA[gActiveBank][3];
+ struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBank][3];
s32 i;
switch (gBattleBufferA[gActiveBank][1])
@@ -2081,38 +2076,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 +2119,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 +2159,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 +2189,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 +2203,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 +2236,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 +2283,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();
}
@@ -2325,17 +2320,17 @@ void sub_802F934(u8 bank, u8 b)
GetMonSpriteTemplate_803C56C(species, GetBankIdentity(bank));
gObjectBankIDs[bank] = CreateSprite(
&gUnknown_02024E8C,
- sub_8077ABC(bank, 2),
+ GetBankPosition(bank, 2),
sub_8077F68(bank),
sub_8079E90(bank));
- gSprites[gUnknown_0300434C[bank]].data1 = gObjectBankIDs[bank];
- gSprites[gObjectBankIDs[bank]].data0 = bank;
- gSprites[gObjectBankIDs[bank]].data2 = species;
+ gSprites[gUnknown_0300434C[bank]].data[1] = gObjectBankIDs[bank];
+ gSprites[gObjectBankIDs[bank]].data[0] = bank;
+ gSprites[gObjectBankIDs[bank]].data[2] = species;
gSprites[gObjectBankIDs[bank]].oam.paletteNum = bank;
StartSpriteAnim(&gSprites[gObjectBankIDs[bank]], gBattleMonForms[bank]);
gSprites[gObjectBankIDs[bank]].invisible = TRUE;
gSprites[gObjectBankIDs[bank]].callback = SpriteCallbackDummy;
- gSprites[gUnknown_0300434C[bank]].data0 = sub_8046400(0, 0xFF);
+ gSprites[gUnknown_0300434C[bank]].data[0] = sub_8046400(0, 0xFF);
}
void PlayerHandleReturnPokeToBall(void)
@@ -2397,7 +2392,7 @@ void PlayerHandleTrainerThrow(void)
sub_8079E90(gActiveBank));
gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank;
gSprites[gObjectBankIDs[gActiveBank]].pos2.x = 240;
- gSprites[gObjectBankIDs[gActiveBank]].data0 = -2;
+ gSprites[gObjectBankIDs[gActiveBank]].data[0] = -2;
gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0;
gBattleBankFunc[gActiveBank] = sub_802D204;
}
@@ -2413,7 +2408,7 @@ void PlayerHandleTrainerSlide(void)
30);
gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank;
gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -96;
- gSprites[gObjectBankIDs[gActiveBank]].data0 = 2;
+ gSprites[gObjectBankIDs[gActiveBank]].data[0] = 2;
gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0;
gBattleBankFunc[gActiveBank] = sub_802D23C;
}
@@ -2421,11 +2416,11 @@ void PlayerHandleTrainerSlide(void)
void PlayerHandleTrainerSlideBack(void)
{
oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]);
- gSprites[gObjectBankIDs[gActiveBank]].data0 = 50;
- gSprites[gObjectBankIDs[gActiveBank]].data2 = -40;
- gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y;
+ gSprites[gObjectBankIDs[gActiveBank]].data[0] = 50;
+ gSprites[gObjectBankIDs[gActiveBank]].data[2] = -40;
+ gSprites[gObjectBankIDs[gActiveBank]].data[4] = gSprites[gObjectBankIDs[gActiveBank]].pos1.y;
gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34;
- oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy);
+ StoreSpriteCallbackInData(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy);
StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1);
gBattleBankFunc[gActiveBank] = sub_802D274;
}
@@ -2445,8 +2440,8 @@ void PlayerHandlecmd10(void)
ewram17810[gActiveBank].unk4 = 0;
sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
PlaySE12WithPanning(SE_POKE_DEAD, -64);
- gSprites[gObjectBankIDs[gActiveBank]].data1 = 0;
- gSprites[gObjectBankIDs[gActiveBank]].data2 = 5;
+ gSprites[gObjectBankIDs[gActiveBank]].data[1] = 0;
+ gSprites[gObjectBankIDs[gActiveBank]].data[2] = 5;
gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80105EC;
gBattleBankFunc[gActiveBank] = sub_802DE10;
}
@@ -2463,7 +2458,7 @@ void PlayerHandlecmd12(void)
{
ewram17840.unk8 = 4;
gDoingBattleAnim = 1;
- move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 3);
+ move_anim_start_t4(gActiveBank, gActiveBank, GetBankByIdentity(1), 3);
gBattleBankFunc[gActiveBank] = bx_wait_t1;
}
@@ -2473,7 +2468,7 @@ void PlayerHandleBallThrow(void)
ewram17840.unk8 = var;
gDoingBattleAnim = 1;
- move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 3);
+ move_anim_start_t4(gActiveBank, gActiveBank, GetBankByIdentity(1), 3);
gBattleBankFunc[gActiveBank] = bx_wait_t1;
}
@@ -2494,14 +2489,14 @@ void PlayerHandleMoveAnimation(void)
{
u16 r0 = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8);
- gUnknown_0202F7C4 = gBattleBufferA[gActiveBank][3];
- gMovePowerMoveAnim = gBattleBufferA[gActiveBank][4] | (gBattleBufferA[gActiveBank][5] << 8);
- gMoveDmgMoveAnim = gBattleBufferA[gActiveBank][6] | (gBattleBufferA[gActiveBank][7] << 8) | (gBattleBufferA[gActiveBank][8] << 16) | (gBattleBufferA[gActiveBank][9] << 24);
- gHappinessMoveAnim = gBattleBufferA[gActiveBank][10];
+ gAnimMoveTurn = gBattleBufferA[gActiveBank][3];
+ gAnimMovePower = gBattleBufferA[gActiveBank][4] | (gBattleBufferA[gActiveBank][5] << 8);
+ gAnimMoveDmg = gBattleBufferA[gActiveBank][6] | (gBattleBufferA[gActiveBank][7] << 8) | (gBattleBufferA[gActiveBank][8] << 16) | (gBattleBufferA[gActiveBank][9] << 24);
+ gAnimFriendship = gBattleBufferA[gActiveBank][10];
gWeatherMoveAnim = gBattleBufferA[gActiveBank][12] | (gBattleBufferA[gActiveBank][13] << 8);
- gDisableStructMoveAnim = (u32 *)&gBattleBufferA[gActiveBank][16];
- gPID_perBank[gActiveBank] = *gDisableStructMoveAnim;
- if (sub_8031720(r0, gUnknown_0202F7C4) != 0)
+ gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBank][16];
+ gTransformedPersonalities[gActiveBank] = gAnimDisableStructPtr->transformedMonPersonality;
+ if (sub_8031720(r0, gAnimMoveTurn) != 0)
{
// Dead code. sub_8031720 always returns 0.
PlayerBufferExecCompleted();
@@ -2533,7 +2528,7 @@ void sub_8030190(void)
if (ewram17810[gActiveBank].unk0_6 == 0)
{
sub_80326EC(0);
- ExecuteMoveAnim(r4);
+ DoMoveAnim(r4);
ewram17810[gActiveBank].unk4 = 2;
}
break;
@@ -2564,8 +2559,8 @@ void sub_8030190(void)
void PlayerHandlePrintString(void)
{
- gUnknown_030042A4 = 0;
- gUnknown_030042A0 = 0;
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 0;
BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBank][2]);
sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 0x90, 2, 15);
gBattleBankFunc[gActiveBank] = sub_802DF18;
@@ -2583,14 +2578,14 @@ void PlayerHandlecmd18(void)
{
int r4;
- gUnknown_030042A4 = 0;
- gUnknown_030042A0 = 160;
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 160;
FillWindowRect(&gUnknown_03004210, 10, 2, 15, 27, 18);
FillWindowRect(&gUnknown_03004210, 10, 2, 35, 16, 38);
gBattleBankFunc[gActiveBank] = sub_802C098;
- InitWindow(&gUnknown_03004210, gUnknown_08400CF3, 400, 18, 35);
+ InitWindow(&gUnknown_03004210, BattleText_MenuOptions, 400, 18, 35);
sub_8002F44(&gUnknown_03004210);
sub_814A5C0(0, 0xFFFF, 12, 11679, 0);
@@ -2599,7 +2594,7 @@ void PlayerHandlecmd18(void)
sub_802E3E4(gActionSelectionCursor[gActiveBank], 0);
- StrCpyDecodeToDisplayedStringBattle((u8 *) gUnknown_08400CA8);
+ StrCpyDecodeToDisplayedStringBattle(BattleText_OtherMenu);
InitWindow(&gUnknown_03004210, gDisplayedStringBattle, SUB_803037C_TILE_DATA_OFFSET, 2, 35);
sub_8002F44(&gUnknown_03004210);
}
@@ -2617,14 +2612,14 @@ void PlayerHandlecmd20(void)
void sub_80304A8(void)
{
- gUnknown_030042A4 = 0;
- gUnknown_030042A0 = 320;
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 320;
sub_802E1B0();
gUnknown_03004344 = 0xFF;
sub_802E3B4(gMoveSelectionCursor[gActiveBank], 0);
if (gBattleBufferA[gActiveBank][2] != 1)
{
- InitWindow(&gUnknown_03004210, gUnknown_08400D38, 656, 23, 55);
+ InitWindow(&gUnknown_03004210, BattleText_PP, 656, 23, 55);
sub_8002F44(&gUnknown_03004210);
}
sub_802E220();
@@ -2648,9 +2643,9 @@ void PlayerHandlecmd22(void)
gUnknown_0300434C[gActiveBank] = CreateTask(TaskDummy, 0xFF);
gTasks[gUnknown_0300434C[gActiveBank]].data[0] = gBattleBufferA[gActiveBank][1] & 0xF;
- ewram[0x16054] = gBattleBufferA[gActiveBank][1] >> 4;
- ewram[0x1609D] = gBattleBufferA[gActiveBank][2];
- ewram[0x160C0] = gBattleBufferA[gActiveBank][3];
+ ewram16054 = gBattleBufferA[gActiveBank][1] >> 4;
+ EWRAM_1609D = gBattleBufferA[gActiveBank][2];
+ ewram160C0 = gBattleBufferA[gActiveBank][3];
for (i = 0; i < 3; i++)
gUnknown_02038470[i] = gBattleBufferA[gActiveBank][4 + i];
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
@@ -2841,7 +2836,7 @@ void PlayerHandleHitAnimation(void)
else
{
gDoingBattleAnim = 1;
- gSprites[gObjectBankIDs[gActiveBank]].data1 = 0;
+ gSprites[gObjectBankIDs[gActiveBank]].data[1] = 0;
sub_8047858(gActiveBank);
gBattleBankFunc[gActiveBank] = bx_blink_t1;
}
@@ -2891,12 +2886,12 @@ void PlayerHandleTrainerBallThrow(void)
u8 taskId;
oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]);
- gSprites[gObjectBankIDs[gActiveBank]].data0 = 50;
- gSprites[gObjectBankIDs[gActiveBank]].data2 = -40;
- gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y;
+ gSprites[gObjectBankIDs[gActiveBank]].data[0] = 50;
+ gSprites[gObjectBankIDs[gActiveBank]].data[2] = -40;
+ gSprites[gObjectBankIDs[gActiveBank]].data[4] = 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);
+ gSprites[gObjectBankIDs[gActiveBank]].data[5] = gActiveBank;
+ StoreSpriteCallbackInData(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38);
StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1);
paletteNum = AllocSpritePalette(0xD6F8);
LoadCompressedPalette(gTrainerBackPicPaletteTable[gSaveBlock2.playerGender].data, 0x100 + paletteNum * 16, 32);
@@ -2911,7 +2906,7 @@ void PlayerHandleTrainerBallThrow(void)
void sub_8030E38(struct Sprite *sprite)
{
- u8 r4 = sprite->data5;
+ u8 r4 = sprite->data[5];
FreeSpriteOamMatrix(sprite);
FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum));
@@ -2994,7 +2989,7 @@ void PlayerHandlecmd50(void)
void PlayerHandleSpriteInvisibility(void)
{
- if (sub_8078874(gActiveBank))
+ if (IsBankSpritePresent(gActiveBank))
{
gSprites[gObjectBankIDs[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1];
sub_8031F88(gActiveBank);
diff --git a/src/battle/battle_controller_safari.c b/src/battle/battle_controller_safari.c
new file mode 100644
index 000000000..0a629ba4d
--- /dev/null
+++ b/src/battle/battle_controller_safari.c
@@ -0,0 +1,710 @@
+#include "global.h"
+#include "battle_anim_81258BC.h"
+#include "battle.h"
+#include "battle_message.h"
+#include "data2.h"
+#include "link.h"
+#include "main.h"
+#include "menu_cursor.h"
+#include "palette.h"
+#include "rom3.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "text.h"
+#include "util.h"
+#include "ewram.h"
+
+extern struct Window gUnknown_03004210;
+extern u8 gDisplayedStringBattle[];
+extern u8 gActionSelectionCursor[];
+
+extern const u8 BattleText_PlayerMenu[];
+extern u8 gActiveBank;
+extern const u8 BattleText_MenuOptionsSafari[];
+
+extern void *gBattleBankFunc[];
+extern u16 gBattle_BG0_Y;
+extern u16 gBattle_BG0_X;
+extern u8 gBattleBufferA[][0x200];
+extern bool8 gDoingBattleAnim;
+extern u8 gObjectBankIDs[];
+extern struct SpriteTemplate gUnknown_02024E8C;
+extern u16 gBattleTypeFlags;
+extern u32 gBattleExecBuffer;
+extern u16 gSpecialVar_ItemId;
+extern MainCallback gPreBattleCallback1;
+extern u8 gBankInMenu;
+extern u8 gHealthboxIDs[];
+extern u16 gBattlePartyID[];
+extern u16 gUnknown_02024DE8;
+extern u8 gBattleOutcome;
+
+extern u8 GetBankSide(u8);
+extern u8 GetBankByIdentity(u8);
+extern u8 GetBankIdentity(u8);
+extern void LoadPlayerTrainerBankSprite();
+extern u8 sub_8079E90();
+extern void sub_80313A0(struct Sprite *);
+extern void sub_810BADC(void);
+extern void sub_8045A5C();
+extern void sub_80E43C0();
+extern void sub_804777C();
+extern void sub_8043DFC();
+extern bool8 move_anim_start_t3();
+
+#if ENGLISH
+#define SUB_812BB10_TILE_DATA_OFFSET 440
+#elif GERMAN
+#define SUB_812BB10_TILE_DATA_OFFSET 444
+#endif
+
+// this file's functions
+void SafariHandleGetAttributes(void);
+void SafariHandlecmd1(void);
+void SafariHandleSetAttributes(void);
+void SafariHandlecmd3(void);
+void SafariHandleLoadPokeSprite(void);
+void SafariHandleSendOutPoke(void);
+void SafariHandleReturnPokeToBall(void);
+void SafariHandleTrainerThrow(void);
+void SafariHandleTrainerSlide(void);
+void SafariHandleTrainerSlideBack(void);
+void SafariHandlecmd10(void);
+void SafariHandlecmd11(void);
+void SafariHandlecmd12(void);
+void SafariHandleBallThrow(void);
+void SafariHandlePuase(void);
+void SafariHandleMoveAnimation(void);
+void SafariHandlePrintString(void);
+void SafariHandlePrintStringPlayerOnly(void);
+void SafariHandlecmd18(void);
+void SafariHandlecmd19(void);
+void SafariHandlecmd20(void);
+void SafariHandleOpenBag(void);
+void SafariHandlecmd22(void);
+void SafariHandlecmd23(void);
+void SafariHandleHealthBarUpdate(void);
+void SafariHandleExpBarUpdate(void);
+void SafariHandleStatusIconUpdate(void);
+void SafariHandleStatusAnimation(void);
+void SafariHandleStatusXor(void);
+void SafariHandlecmd29(void);
+void SafariHandleDMATransfer(void);
+void SafariHandlecmd31(void);
+void SafariHandlecmd32(void);
+void SafariHandlecmd33(void);
+void SafariHandlecmd34(void);
+void SafariHandlecmd35(void);
+void SafariHandlecmd36(void);
+void SafariHandlecmd37(void);
+void SafariHandlecmd38(void);
+void SafariHandlecmd39(void);
+void SafariHandlecmd40(void);
+void SafariHandleHitAnimation(void);
+void SafariHandlecmd42(void);
+void SafariHandleEffectivenessSound(void);
+void SafariHandlecmd44(void);
+void SafariHandleFaintingCry(void);
+void SafariHandleIntroSlide(void);
+void SafariHandleTrainerBallThrow(void);
+void SafariHandlecmd48(void);
+void SafariHandlecmd49(void);
+void SafariHandlecmd50(void);
+void SafariHandleSpriteInvisibility(void);
+void SafariHandleBattleAnimation(void);
+void SafariHandleLinkStandbyMsg(void);
+void SafariHandleResetActionMoveSelection(void);
+void SafariHandlecmd55(void);
+void SafariHandlecmd56(void);
+
+// const data
+typedef void (*BattleBufferCmd) (void);
+const BattleBufferCmd gSafariBufferCommands[] =
+{
+ SafariHandleGetAttributes,
+ SafariHandlecmd1,
+ SafariHandleSetAttributes,
+ SafariHandlecmd3,
+ SafariHandleLoadPokeSprite,
+ SafariHandleSendOutPoke,
+ SafariHandleReturnPokeToBall,
+ SafariHandleTrainerThrow,
+ SafariHandleTrainerSlide,
+ SafariHandleTrainerSlideBack,
+ SafariHandlecmd10,
+ SafariHandlecmd11,
+ SafariHandlecmd12,
+ SafariHandleBallThrow,
+ SafariHandlePuase,
+ SafariHandleMoveAnimation,
+ SafariHandlePrintString,
+ SafariHandlePrintStringPlayerOnly,
+ SafariHandlecmd18,
+ SafariHandlecmd19,
+ SafariHandlecmd20,
+ SafariHandleOpenBag,
+ SafariHandlecmd22,
+ SafariHandlecmd23,
+ SafariHandleHealthBarUpdate,
+ SafariHandleExpBarUpdate,
+ SafariHandleStatusIconUpdate,
+ SafariHandleStatusAnimation,
+ SafariHandleStatusXor,
+ SafariHandlecmd29,
+ SafariHandleDMATransfer,
+ SafariHandlecmd31,
+ SafariHandlecmd32,
+ SafariHandlecmd33,
+ SafariHandlecmd34,
+ SafariHandlecmd35,
+ SafariHandlecmd36,
+ SafariHandlecmd37,
+ SafariHandlecmd38,
+ SafariHandlecmd39,
+ SafariHandlecmd40,
+ SafariHandleHitAnimation,
+ SafariHandlecmd42,
+ SafariHandleEffectivenessSound,
+ SafariHandlecmd44,
+ SafariHandleFaintingCry,
+ SafariHandleIntroSlide,
+ SafariHandleTrainerBallThrow,
+ SafariHandlecmd48,
+ SafariHandlecmd49,
+ SafariHandlecmd50,
+ SafariHandleSpriteInvisibility,
+ SafariHandleBattleAnimation,
+ SafariHandleLinkStandbyMsg,
+ SafariHandleResetActionMoveSelection,
+ SafariHandlecmd55,
+ SafariHandlecmd56,
+};
+// code
+
+void SafariBufferExecCompleted(void);
+void bx_wait_t6(void);
+void sub_812B65C(void);
+void SafariBufferRunCommand(void);
+void sub_812B758(void);
+
+void unref_sub_812B464(void)
+{
+}
+
+void SetBankFuncToSafariBufferRunCommand(void)
+{
+ gBattleBankFunc[gActiveBank] = SafariBufferRunCommand;
+}
+
+void SafariBufferRunCommand(void)
+{
+ if (gBattleExecBuffer & gBitTable[gActiveBank])
+ {
+ if (gBattleBufferA[gActiveBank][0] < 0x39)
+ gSafariBufferCommands[gBattleBufferA[gActiveBank][0]]();
+ else
+ SafariBufferExecCompleted();
+ }
+}
+
+void bx_battle_menu_t6_2(void)
+{
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ DestroyMenuCursor();
+
+ // Useless switch statement.
+ switch (gActionSelectionCursor[gActiveBank])
+ {
+ case 0:
+ Emitcmd33(1, 5, 0);
+ break;
+ case 1:
+ Emitcmd33(1, 6, 0);
+ break;
+ case 2:
+ Emitcmd33(1, 7, 0);
+ break;
+ case 3:
+ Emitcmd33(1, 8, 0);
+ break;
+ }
+ SafariBufferExecCompleted();
+ }
+ else if (gMain.newKeys & DPAD_LEFT)
+ {
+ if (gActionSelectionCursor[gActiveBank] & 1)
+ {
+ PlaySE(SE_SELECT);
+ nullsub_8(gActionSelectionCursor[gActiveBank]);
+ gActionSelectionCursor[gActiveBank] ^= 1;
+ sub_802E3E4(gActionSelectionCursor[gActiveBank], 0);
+ }
+ }
+ else if (gMain.newKeys & DPAD_RIGHT)
+ {
+ if (!(gActionSelectionCursor[gActiveBank] & 1))
+ {
+ PlaySE(SE_SELECT);
+ nullsub_8(gActionSelectionCursor[gActiveBank]);
+ gActionSelectionCursor[gActiveBank] ^= 1;
+ sub_802E3E4(gActionSelectionCursor[gActiveBank], 0);
+ }
+ }
+ else if (gMain.newKeys & DPAD_UP)
+ {
+ if (gActionSelectionCursor[gActiveBank] & 2)
+ {
+ PlaySE(SE_SELECT);
+ nullsub_8(gActionSelectionCursor[gActiveBank]);
+ gActionSelectionCursor[gActiveBank] ^= 2;
+ sub_802E3E4(gActionSelectionCursor[gActiveBank], 0);
+ }
+ }
+ else if (gMain.newKeys & DPAD_DOWN)
+ {
+ if (!(gActionSelectionCursor[gActiveBank] & 2))
+ {
+ PlaySE(SE_SELECT);
+ nullsub_8(gActionSelectionCursor[gActiveBank]);
+ gActionSelectionCursor[gActiveBank] ^= 2;
+ sub_802E3E4(gActionSelectionCursor[gActiveBank], 0);
+ }
+ }
+}
+
+void sub_812B65C(void)
+{
+ if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy)
+ SafariBufferExecCompleted();
+}
+
+void sub_812B694(void)
+{
+ if (gUnknown_03004210.state == 0)
+ SafariBufferExecCompleted();
+}
+
+void sub_812B6AC(void)
+{
+ if (!gPaletteFade.active)
+ {
+ gMain.inBattle = FALSE;
+ gMain.callback1 = gPreBattleCallback1;
+ SetMainCallback2(gMain.savedCallback);
+ }
+}
+
+void bx_wait_t6(void)
+{
+ if (!gDoingBattleAnim || !ewram17810[gActiveBank].unk0_6)
+ SafariBufferExecCompleted();
+}
+
+void sub_812B724(void)
+{
+ if (!gPaletteFade.active)
+ {
+ gBattleBankFunc[gActiveBank] = sub_812B758;
+ sub_810BADC();
+ }
+}
+
+void sub_812B758(void)
+{
+ if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active)
+ {
+ Emitcmd35(1, gSpecialVar_ItemId);
+ SafariBufferExecCompleted();
+ }
+}
+
+void sub_812B794(void)
+{
+ if (!ewram17810[gActiveBank].unk0_5)
+ SafariBufferExecCompleted();
+}
+
+void SafariBufferExecCompleted(void)
+{
+ gBattleBankFunc[gActiveBank] = SafariBufferRunCommand;
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ {
+ u8 playerId = GetMultiplayerId();
+
+ PrepareBufferDataTransferLink(2, 4, &playerId);
+ gBattleBufferA[gActiveBank][0] = 0x38;
+ }
+ else
+ {
+ gBattleExecBuffer &= ~gBitTable[gActiveBank];
+ }
+}
+
+void unref_sub_812B838(void)
+{
+ if (!ewram17810[gActiveBank].unk0_4)
+ SafariBufferExecCompleted();
+}
+
+void SafariHandleGetAttributes(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandlecmd1(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandleSetAttributes(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandlecmd3(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandleLoadPokeSprite(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandleSendOutPoke(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandleReturnPokeToBall(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandleTrainerThrow(void)
+{
+ LoadPlayerTrainerBankSprite(gSaveBlock2.playerGender, gActiveBank);
+ GetMonSpriteTemplate_803C5A0(gSaveBlock2.playerGender, GetBankIdentity(gActiveBank));
+ gObjectBankIDs[gActiveBank] = CreateSprite(
+ &gUnknown_02024E8C,
+ 80,
+ (8 - gTrainerBackPicCoords[gSaveBlock2.playerGender].coords) * 4 + 80,
+ 30);
+ gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank;
+ gSprites[gObjectBankIDs[gActiveBank]].pos2.x = 240;
+ gSprites[gObjectBankIDs[gActiveBank]].data[0] = -2;
+ gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0;
+ gBattleBankFunc[gActiveBank] = sub_812B65C;
+}
+
+void SafariHandleTrainerSlide(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandleTrainerSlideBack(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandlecmd10(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandlecmd11(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandlecmd12(void)
+{
+ ewram17840.unk8 = 4;
+ gDoingBattleAnim = 1;
+ move_anim_start_t4(gActiveBank, gActiveBank, GetBankByIdentity(1), 4);
+ gBattleBankFunc[gActiveBank] = bx_wait_t6;
+}
+
+void SafariHandleBallThrow(void)
+{
+ u8 var = gBattleBufferA[gActiveBank][1];
+
+ ewram17840.unk8 = var;
+ gDoingBattleAnim = 1;
+ move_anim_start_t4(gActiveBank, gActiveBank, GetBankByIdentity(1), 4);
+ gBattleBankFunc[gActiveBank] = bx_wait_t6;
+}
+
+// TODO: spell Pause correctly
+void SafariHandlePuase(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandleMoveAnimation(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandlePrintString(void)
+{
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 0;
+ BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBank][2]);
+ sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15);
+ gBattleBankFunc[gActiveBank] = sub_812B694;
+}
+
+void SafariHandlePrintStringPlayerOnly(void)
+{
+ if (GetBankSide(gActiveBank) == 0)
+ SafariHandlePrintString();
+ else
+ SafariBufferExecCompleted();
+}
+
+void SafariHandlecmd18(void)
+{
+ int i;
+
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 160;
+ gUnknown_03004210.paletteNum = 0;
+ FillWindowRect_DefaultPalette(&gUnknown_03004210, 10, 2, 15, 27, 18);
+ FillWindowRect_DefaultPalette(&gUnknown_03004210, 10, 2, 35, 16, 36);
+ gBattleBankFunc[gActiveBank] = bx_battle_menu_t6_2;
+
+ InitWindow(&gUnknown_03004210, BattleText_MenuOptionsSafari, 400, 18, 35);
+ sub_8002F44(&gUnknown_03004210);
+ sub_814A5C0(0, 0xFFFF, 12, 11679, 0);
+
+ for (i = 0; i < 4; i++)
+ nullsub_8(i);
+
+ sub_802E3E4(gActionSelectionCursor[gActiveBank], 0);
+ StrCpyDecodeToDisplayedStringBattle(BattleText_PlayerMenu);
+
+ InitWindow(&gUnknown_03004210, gDisplayedStringBattle, SUB_812BB10_TILE_DATA_OFFSET, 2, 35);
+ sub_8002F44(&gUnknown_03004210);
+}
+
+void SafariHandlecmd19(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandlecmd20(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandleOpenBag(void)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ gBattleBankFunc[gActiveBank] = sub_812B724;
+ gBankInMenu = gActiveBank;
+}
+
+void SafariHandlecmd22(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandlecmd23(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandleHealthBarUpdate(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandleExpBarUpdate(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandleStatusIconUpdate(void)
+{
+ sub_8045A5C(gHealthboxIDs[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], 11);
+ SafariBufferExecCompleted();
+}
+
+void SafariHandleStatusAnimation(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandleStatusXor(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandlecmd29(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandleDMATransfer(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandlecmd31(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandlecmd32(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandlecmd33(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandlecmd34(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandlecmd35(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandlecmd36(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandlecmd37(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandlecmd38(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandlecmd39(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandlecmd40(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandleHitAnimation(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandlecmd42(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandleEffectivenessSound(void)
+{
+ s8 pan;
+
+ if (GetBankSide(gActiveBank) == 0)
+ pan = -64;
+ else
+ pan = 63;
+ PlaySE12WithPanning(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8), pan);
+ SafariBufferExecCompleted();
+}
+
+void SafariHandlecmd44(void)
+{
+ PlayFanfare(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
+ SafariBufferExecCompleted();
+}
+
+void SafariHandleFaintingCry(void)
+{
+ u16 species = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES);
+
+ PlayCry1(species, 25);
+ SafariBufferExecCompleted();
+}
+
+void SafariHandleIntroSlide(void)
+{
+ sub_80E43C0(gBattleBufferA[gActiveBank][1]);
+ gUnknown_02024DE8 |= 1;
+ SafariBufferExecCompleted();
+}
+
+void SafariHandleTrainerBallThrow(void)
+{
+ sub_8045A5C(gHealthboxIDs[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], 10);
+ sub_804777C(gActiveBank);
+ sub_8043DFC(gHealthboxIDs[gActiveBank]);
+ SafariBufferExecCompleted();
+}
+
+void SafariHandlecmd48(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandlecmd49(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandlecmd50(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandleSpriteInvisibility(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandleBattleAnimation(void)
+{
+ u8 r3 = gBattleBufferA[gActiveBank][1];
+ u16 r4 = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8);
+
+ if (move_anim_start_t3(gActiveBank, gActiveBank, gActiveBank, r3, r4) != 0)
+ SafariBufferExecCompleted();
+ else
+ gBattleBankFunc[gActiveBank] = sub_812B794;
+}
+
+void SafariHandleLinkStandbyMsg(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandleResetActionMoveSelection(void)
+{
+ SafariBufferExecCompleted();
+}
+
+void SafariHandlecmd55(void)
+{
+ gBattleOutcome = gBattleBufferA[gActiveBank][1];
+ FadeOutMapMusic(5);
+ BeginFastPaletteFade(3);
+ SafariBufferExecCompleted();
+ if ((gBattleTypeFlags & BATTLE_TYPE_LINK) && !(gBattleTypeFlags & BATTLE_TYPE_WILD))
+ gBattleBankFunc[gActiveBank] = sub_812B6AC;
+}
+
+void SafariHandlecmd56(void)
+{
+}
diff --git a/src/battle_controller_wally.c b/src/battle/battle_controller_wally.c
index f2cf5bbb4..bd2b4a45b 100644
--- a/src/battle_controller_wally.c
+++ b/src/battle/battle_controller_wally.c
@@ -1,5 +1,6 @@
#include "global.h"
#include "battle.h"
+#include "battle_anim.h"
#include "battle_interface.h"
#include "battle_message.h"
#include "data2.h"
@@ -9,7 +10,7 @@
#include "palette.h"
#include "pokemon.h"
#include "rom3.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "sprite.h"
#include "item_use.h"
@@ -17,9 +18,9 @@
#include "task.h"
#include "text.h"
#include "util.h"
+#include "ewram.h"
-//Possibly PokemonSubstruct1
-struct UnknownStruct3
+struct MovePpInfo
{
u16 moves[4];
u8 pp[4];
@@ -36,12 +37,11 @@ extern bool8 gDoingBattleAnim;
extern u16 gBattlePartyID[];
extern u8 gHealthboxIDs[];
extern u16 gBattleTypeFlags;
-extern u16 gMovePowerMoveAnim;
-extern u32 gMoveDmgMoveAnim;
-extern u8 gHappinessMoveAnim;
+extern u16 gAnimMovePower;
+extern u32 gAnimMoveDmg;
+extern u8 gAnimFriendship;
extern u16 gWeatherMoveAnim;
-extern u32 *gDisableStructMoveAnim;
-extern u32 gPID_perBank[];
+extern u32 gTransformedPersonalities[];
extern void (*gAnimScriptCallback)(void);
extern bool8 gAnimScriptActive;
extern u8 gDisplayedStringBattle[];
@@ -51,13 +51,13 @@ extern u8 gBattleOutcome;
extern u16 gUnknown_02024DE8;
extern u8 gUnknown_02024E68[];
extern struct SpriteTemplate gUnknown_02024E8C;
-extern u8 gUnknown_0202F7C4;
+extern u8 gAnimMoveTurn;
extern struct Window gUnknown_03004210;
-extern u16 gUnknown_030042A0;
-extern u16 gUnknown_030042A4;
+extern u16 gBattle_BG0_Y;
+extern u16 gBattle_BG0_X;
extern u8 gUnknown_0300434C[];
-extern const u8 gUnknown_08400CCC[];
-extern const u8 gUnknown_08400CF3[];
+extern const u8 BattleText_WallyMenu[];
+extern const u8 BattleText_MenuOptions[];
// TODO: include rom3.h when my other PR gets merged
extern void Emitcmd33(u8, u8, u16);
@@ -75,9 +75,9 @@ extern void PlayerHandlecmd1(void);
extern void LoadPlayerTrainerBankSprite();
extern u8 GetBankIdentity(u8);
extern void sub_80313A0(struct Sprite *);
-extern u8 GetBankByPlayerAI(u8);
+extern u8 GetBankByIdentity(u8);
extern u8 sub_8031720();
-extern void ExecuteMoveAnim();
+extern void DoMoveAnim();
extern void sub_80326EC();
extern void sub_8031F24(void);
extern void sub_80324BC();
@@ -89,9 +89,9 @@ 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 StoreSpriteCallbackInData();
extern u8 sub_8046400();
-extern u8 sub_8077ABC();
+extern u8 GetBankPosition();
extern u8 sub_8077F68();
extern u8 sub_8079E90();
extern void sub_80312F0(struct Sprite *);
@@ -239,10 +239,10 @@ void unref_sub_8137220(void)
void SetBankFuncToWallyBufferRunCommand(void)
{
gBattleBankFunc[gActiveBank] = WallyBufferRunCommand;
- ewram[0x160A8] = 0;
- ewram[0x160A9] = 0;
- ewram[0x160AA] = 0;
- ewram[0x160AB] = 0;
+ ewram160A8 = 0;
+ ewram160A9 = 0;
+ ewram160AA = 0;
+ ewram160AB = 0;
}
void WallyBufferRunCommand(void)
@@ -260,59 +260,59 @@ void sub_81372BC(void)
{
u8 r4;
- switch (ewram[0x160A8])
+ switch (ewram160A8)
{
case 0:
- ewram[0x160AA] = 64;
- ewram[0x160A8]++;
+ ewram160AA = 64;
+ ewram160A8++;
// fall through
case 1:
- r4 = --ewram[0x160AA];
+ r4 = --ewram160AA;
if (r4 == 0)
{
PlaySE(SE_SELECT);
Emitcmd33(1, 0, 0);
WallyBufferExecCompleted();
- ewram[0x160A8]++;
- ewram[0x160A9] = r4;
- ewram[0x160AA] = 64;
+ ewram160A8++;
+ ewram160A9 = r4;
+ ewram160AA = 64;
}
break;
case 2:
- r4 = --ewram[0x160AA];
+ r4 = --ewram160AA;
if (r4 == 0)
{
PlaySE(SE_SELECT);
Emitcmd33(1, 0, 0);
WallyBufferExecCompleted();
- ewram[0x160A8]++;
- ewram[0x160A9] = r4;
- ewram[0x160AA] = 64;
+ ewram160A8++;
+ ewram160A9 = r4;
+ ewram160AA = 64;
}
break;
case 3:
- r4 = --ewram[0x160AA];
+ r4 = --ewram160AA;
if (r4 == 0)
{
Emitcmd33(1, 9, 0);
WallyBufferExecCompleted();
- ewram[0x160A8]++;
- ewram[0x160A9] = r4;
- ewram[0x160AA] = 64;
+ ewram160A8++;
+ ewram160A9 = r4;
+ ewram160AA = 64;
}
break;
case 4:
- if (--ewram[0x160AA] == 0)
+ if (--ewram160AA == 0)
{
PlaySE(SE_SELECT);
nullsub_8(0);
sub_802E3E4(1, 0);
- ewram[0x160AA] = 64;
- ewram[0x160A8]++;
+ ewram160AA = 64;
+ ewram160A8++;
}
break;
case 5:
- if (--ewram[0x160AA] == 0)
+ if (--ewram160AA == 0)
{
PlaySE(SE_SELECT);
DestroyMenuCursor();
@@ -363,10 +363,10 @@ void sub_81374C4(void)
void sub_81374FC(void)
{
- if (gMain.callback2 == sub_800F808
+ if (gMain.callback2 == BattleMainCB2
&& !gPaletteFade.active)
{
- Emitcmd35(1, gScriptItemId);
+ Emitcmd35(1, gSpecialVar_ItemId);
WallyBufferExecCompleted();
}
}
@@ -438,18 +438,18 @@ void bx_blink_t5(void)
{
u8 spriteId = gObjectBankIDs[gActiveBank];
- if (gSprites[spriteId].data1 == 32)
+ if (gSprites[spriteId].data[1] == 32)
{
- gSprites[spriteId].data1 = 0;
+ gSprites[spriteId].data[1] = 0;
gSprites[spriteId].invisible = FALSE;
gDoingBattleAnim = FALSE;
WallyBufferExecCompleted();
}
else
{
- if (((u16)gSprites[spriteId].data1 % 4) == 0)
+ if (((u16)gSprites[spriteId].data[1] % 4) == 0)
gSprites[spriteId].invisible ^= 1;
- gSprites[spriteId].data1++;
+ gSprites[spriteId].data[1]++;
}
}
@@ -527,7 +527,7 @@ void WallyHandleGetAttributes(void)
u32 sub_8137A84(u8 a, u8 *buffer)
{
struct BattlePokemon battlePokemon;
- struct UnknownStruct3 moveData;
+ struct MovePpInfo moveData;
u8 nickname[20];
u8 *src;
s16 data16;
@@ -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;
@@ -859,7 +855,7 @@ void WallyHandleSetAttributes(void)
void sub_8138294(u8 a)
{
struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBank][3];
- struct UnknownStruct3 *moveData = (struct UnknownStruct3 *)&gBattleBufferA[gActiveBank][3];
+ struct MovePpInfo *moveData = (struct MovePpInfo *)&gBattleBufferA[gActiveBank][3];
s32 i;
switch (gBattleBufferA[gActiveBank][1])
@@ -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]);
@@ -1114,7 +1110,7 @@ void WallyHandleTrainerThrow(void)
30);
gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank;
gSprites[gObjectBankIDs[gActiveBank]].pos2.x = 240;
- gSprites[gObjectBankIDs[gActiveBank]].data0 = -2;
+ gSprites[gObjectBankIDs[gActiveBank]].data[0] = -2;
gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0;
gBattleBankFunc[gActiveBank] = sub_813741C;
}
@@ -1129,7 +1125,7 @@ void WallyHandleTrainerSlide(void)
30);
gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank;
gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -96;
- gSprites[gObjectBankIDs[gActiveBank]].data0 = 2;
+ gSprites[gObjectBankIDs[gActiveBank]].data[0] = 2;
gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0;
gBattleBankFunc[gActiveBank] = sub_8137908;
}
@@ -1153,7 +1149,7 @@ void WallyHandlecmd12(void)
{
ewram17840.unk8 = 4;
gDoingBattleAnim = TRUE;
- move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 4);
+ move_anim_start_t4(gActiveBank, gActiveBank, GetBankByIdentity(1), 4);
gBattleBankFunc[gActiveBank] = bx_wait_t5;
}
@@ -1163,7 +1159,7 @@ void WallyHandleBallThrow(void)
ewram17840.unk8 = val;
gDoingBattleAnim = TRUE;
- move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 4);
+ move_anim_start_t4(gActiveBank, gActiveBank, GetBankByIdentity(1), 4);
gBattleBankFunc[gActiveBank] = bx_wait_t5;
}
@@ -1174,16 +1170,16 @@ void WallyHandlePuase(void)
void WallyHandleMoveAnimation(void)
{
- u16 r0 = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8);
+ u16 move = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8);
- gUnknown_0202F7C4 = gBattleBufferA[gActiveBank][3];
- gMovePowerMoveAnim = gBattleBufferA[gActiveBank][4] | (gBattleBufferA[gActiveBank][5] << 8);
- gMoveDmgMoveAnim = gBattleBufferA[gActiveBank][6] | (gBattleBufferA[gActiveBank][7] << 8) | (gBattleBufferA[gActiveBank][8] << 16) | (gBattleBufferA[gActiveBank][9] << 24);
- gHappinessMoveAnim = gBattleBufferA[gActiveBank][10];
+ gAnimMoveTurn = gBattleBufferA[gActiveBank][3];
+ gAnimMovePower = gBattleBufferA[gActiveBank][4] | (gBattleBufferA[gActiveBank][5] << 8);
+ gAnimMoveDmg = gBattleBufferA[gActiveBank][6] | (gBattleBufferA[gActiveBank][7] << 8) | (gBattleBufferA[gActiveBank][8] << 16) | (gBattleBufferA[gActiveBank][9] << 24);
+ gAnimFriendship = gBattleBufferA[gActiveBank][10];
gWeatherMoveAnim = gBattleBufferA[gActiveBank][12] | (gBattleBufferA[gActiveBank][13] << 8);
- gDisableStructMoveAnim = (u32 *)&gBattleBufferA[gActiveBank][16];
- gPID_perBank[gActiveBank] = *gDisableStructMoveAnim;
- if (sub_8031720(r0, gUnknown_0202F7C4) != 0)
+ gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBank][16];
+ gTransformedPersonalities[gActiveBank] = gAnimDisableStructPtr->transformedMonPersonality;
+ if (sub_8031720(move, gAnimMoveTurn) != 0)
{
// Dead code. sub_8031720 always returns 0.
WallyBufferExecCompleted();
@@ -1214,7 +1210,7 @@ void sub_81390D0(void)
if (ewram17810[gActiveBank].unk0_6 == 0)
{
sub_80326EC(0);
- ExecuteMoveAnim(r4);
+ DoMoveAnim(r4);
ewram17810[gActiveBank].unk4 = 2;
}
break;
@@ -1244,8 +1240,8 @@ void WallyHandlePrintString(void)
{
u16 *ptr;
- gUnknown_030042A4 = 0;
- gUnknown_030042A0 = 0;
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 0;
ptr = (u16 *)&gBattleBufferA[gActiveBank][2];
if (*ptr == 2)
DestroyMenuCursor();
@@ -1266,19 +1262,19 @@ void WallyHandlecmd18(void)
{
s32 i;
- gUnknown_030042A4 = 0;
- gUnknown_030042A0 = 160;
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 160;
gUnknown_03004210.paletteNum = 0;
FillWindowRect_DefaultPalette(&gUnknown_03004210, 10, 2, 15, 27, 18);
FillWindowRect_DefaultPalette(&gUnknown_03004210, 10, 2, 35, 16, 36);
gBattleBankFunc[gActiveBank] = sub_81372BC;
- InitWindow(&gUnknown_03004210, gUnknown_08400CF3, 400, 18, 35);
+ InitWindow(&gUnknown_03004210, BattleText_MenuOptions, 400, 18, 35);
sub_8002F44(&gUnknown_03004210);
sub_814A5C0(0, 0xFFFF, 12, 0x2D9F, 0);
for (i = 0; i < 4; i++)
nullsub_8(i);
sub_802E3E4(0, 0);
- StrCpyDecodeToDisplayedStringBattle(gUnknown_08400CCC);
+ StrCpyDecodeToDisplayedStringBattle(BattleText_WallyMenu);
#ifdef ENGLISH
InitWindow(&gUnknown_03004210, gDisplayedStringBattle, 440, 2, 35);
#else
@@ -1294,16 +1290,16 @@ void WallyHandlecmd19(void)
void WallyHandlecmd20(void)
{
- switch (ewram[0x160A9])
+ switch (ewram160A9)
{
case 0:
sub_80304A8();
- ewram[0x160A9]++;
- ewram[0x160AB] = 80;
+ ewram160A9++;
+ ewram160AB = 80;
// fall through
case 1:
- ewram[0x160AB]--;
- if (ewram[0x160AB] == 0)
+ ewram160AB--;
+ if (ewram160AB == 0)
{
DestroyMenuCursor();
PlaySE(SE_SELECT);
@@ -1443,7 +1439,7 @@ void WallyHandleHitAnimation(void)
else
{
gDoingBattleAnim = 1;
- gSprites[gObjectBankIDs[gActiveBank]].data1 = 0;
+ gSprites[gObjectBankIDs[gActiveBank]].data[1] = 0;
sub_8047858(gActiveBank);
gBattleBankFunc[gActiveBank] = bx_blink_t5;
}
@@ -1485,12 +1481,12 @@ void WallyHandleTrainerBallThrow(void)
u8 taskId;
oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]);
- gSprites[gObjectBankIDs[gActiveBank]].data0 = 50;
- gSprites[gObjectBankIDs[gActiveBank]].data2 = -40;
- gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y;
+ gSprites[gObjectBankIDs[gActiveBank]].data[0] = 50;
+ gSprites[gObjectBankIDs[gActiveBank]].data[2] = -40;
+ gSprites[gObjectBankIDs[gActiveBank]].data[4] = 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);
+ gSprites[gObjectBankIDs[gActiveBank]].data[5] = gActiveBank;
+ StoreSpriteCallbackInData(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38);
StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1);
paletteNum = AllocSpritePalette(0xD6F8);
LoadCompressedPalette(gTrainerBackPicPaletteTable[2].data, 0x100 + paletteNum * 16, 32);
@@ -1514,17 +1510,17 @@ void sub_81398BC(u8 bank)
GetMonSpriteTemplate_803C56C(species, GetBankIdentity(bank));
gObjectBankIDs[bank] = CreateSprite(
&gUnknown_02024E8C,
- sub_8077ABC(bank, 2),
+ GetBankPosition(bank, 2),
sub_8077F68(bank),
sub_8079E90(bank));
- gSprites[gUnknown_0300434C[bank]].data1 = gObjectBankIDs[bank];
- gSprites[gObjectBankIDs[bank]].data0 = bank;
- gSprites[gObjectBankIDs[bank]].data2 = species;
+ gSprites[gUnknown_0300434C[bank]].data[1] = gObjectBankIDs[bank];
+ gSprites[gObjectBankIDs[bank]].data[0] = bank;
+ gSprites[gObjectBankIDs[bank]].data[2] = species;
gSprites[gObjectBankIDs[bank]].oam.paletteNum = bank;
StartSpriteAnim(&gSprites[gObjectBankIDs[bank]], gBattleMonForms[bank]);
gSprites[gObjectBankIDs[bank]].invisible = TRUE;
gSprites[gObjectBankIDs[bank]].callback = SpriteCallbackDummy;
- gSprites[gUnknown_0300434C[bank]].data0 = sub_8046400(0, 0xFF);
+ gSprites[gUnknown_0300434C[bank]].data[0] = sub_8046400(0, 0xFF);
}
void sub_8139A2C(u8 taskId)
diff --git a/src/battle_interface.c b/src/battle/battle_interface.c
index 246bda62b..97568d254 100644
--- a/src/battle_interface.c
+++ b/src/battle/battle_interface.c
@@ -7,12 +7,13 @@
#include "pokemon.h"
#include "rom_8077ABC.h"
#include "safari_zone.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "sprite.h"
#include "string_util.h"
#include "task.h"
#include "text.h"
+#include "ewram.h"
struct UnknownStruct5
{
@@ -28,12 +29,6 @@ struct UnknownStruct7
u8 filler0[0x180];
};
-extern u8 ewram[];
-#define ewram520 ((struct UnknownStruct7 *)(ewram + 0x00520))
-#define ewram16088 (*(u8 *) (ewram + 0x16088))
-#define ewram16089 (*(u8 *) (ewram + 0x16089))
-#define ewram17850 ((struct UnknownStruct5 *)(ewram + 0x17850))
-
extern u8 gDisplayedStringBattle[];
extern u8 gNoOfAllBanks;
extern u16 gBattlePartyID[];
@@ -97,7 +92,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)
{
@@ -444,7 +439,7 @@ u8 battle_make_oam_normal_battle(u8 a)
//_080439F2
gSprites[spriteId1].oam.affineParam = spriteId2;
- gSprites[spriteId2].data5 = spriteId1;
+ gSprites[spriteId2].data[5] = spriteId1;
gSprites[spriteId2].callback = sub_8043D5C;
}
//_08043A28
@@ -456,7 +451,7 @@ u8 battle_make_oam_normal_battle(u8 a)
spriteId2 = CreateSpriteAtEnd(&gSpriteTemplate_820A4EC[GetBankIdentity(a) / 2], 240, 160, 1);
gSprites[spriteId1].oam.affineParam = spriteId2;
- gSprites[spriteId2].data5 = spriteId1;
+ gSprites[spriteId2].data[5] = spriteId1;
gSprites[spriteId2].oam.tileNum += 32;
gSprites[spriteId2].callback = sub_8043D5C;
sp0 = 1;
@@ -468,7 +463,7 @@ u8 battle_make_oam_normal_battle(u8 a)
spriteId2 = CreateSpriteAtEnd(&gSpriteTemplate_820A51C[GetBankIdentity(a) / 2], 240, 160, 1);
gSprites[spriteId1].oam.affineParam = spriteId2;
- gSprites[spriteId2].data5 = spriteId1;
+ gSprites[spriteId2].data[5] = spriteId1;
gSprites[spriteId2].oam.tileNum += 32;
gSprites[spriteId2].callback = sub_8043D5C;
sp0 = 2;
@@ -482,14 +477,14 @@ 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;
+ gSprites[spriteId1].data[5] = spriteId3;
+ gSprites[spriteId1].data[6] = a;
gSprites[spriteId1].invisible = TRUE;
gSprites[spriteId2].invisible = TRUE;
- sprite->data5 = spriteId1;
- sprite->data6 = sp0;
+ sprite->data[5] = spriteId1;
+ sprite->data[6] = sp0;
sprite->invisible = TRUE;
return spriteId1;
@@ -504,7 +499,7 @@ u8 battle_make_oam_safari_battle(void)
gSprites[spriteId2].oam.shape = 0;
gSprites[spriteId2].oam.tileNum += 0x40;
gSprites[spriteId1].oam.affineParam = spriteId2;
- gSprites[spriteId2].data5 = spriteId1;
+ gSprites[spriteId2].data[5] = spriteId1;
gSprites[spriteId2].callback = sub_8043D5C;
return spriteId1;
}
@@ -516,9 +511,9 @@ static const void *sub_8043CDC(u8 a)
void sub_8043CEC(struct Sprite *sprite)
{
- u8 r5 = sprite->data5;
+ u8 r5 = sprite->data[5];
- switch (sprite->data6)
+ switch (sprite->data[6])
{
case 0:
sprite->pos1.x = gSprites[r5].pos1.x + 16;
@@ -540,7 +535,7 @@ void sub_8043CEC(struct Sprite *sprite)
static void sub_8043D5C(struct Sprite *sprite)
{
- u8 data5 = sprite->data5;
+ u8 data5 = sprite->data[5];
sprite->pos1.x = gSprites[data5].pos1.x + 64;
sprite->pos1.y = gSprites[data5].pos1.y;
@@ -560,14 +555,14 @@ void sub_8043D84(u8 a, u8 b, u32 c, u32 d, u32 e)
void sub_8043DB0(u8 a)
{
gSprites[a].invisible = TRUE;
- gSprites[gSprites[a].data5].invisible = TRUE;
+ gSprites[gSprites[a].data[5]].invisible = TRUE;
gSprites[gSprites[a].oam.affineParam].invisible = TRUE;
}
void sub_8043DFC(u8 a)
{
gSprites[a].invisible = FALSE;
- gSprites[gSprites[a].data5].invisible = FALSE;
+ gSprites[gSprites[a].data[5]].invisible = FALSE;
gSprites[gSprites[a].oam.affineParam].invisible = FALSE;
}
@@ -580,7 +575,7 @@ static void sub_8043E50(u8 spriteId, s16 x, s16 y)
void unref_sub_8043E70(u8 a)
{
DestroySprite(&gSprites[gSprites[a].oam.affineParam]);
- DestroySprite(&gSprites[gSprites[a].data5]);
+ DestroySprite(&gSprites[gSprites[a].data[5]]);
DestroySprite(&gSprites[a]);
}
@@ -588,7 +583,7 @@ void nullsub_11()
{
}
-void sub_8043EB4(u8 priority)
+void UpdateOamPriorityInAllHealthboxes(u8 priority)
{
s32 i;
@@ -600,7 +595,7 @@ void sub_8043EB4(u8 priority)
spriteId1 = gHealthboxIDs[i];
spriteId2 = gSprites[spriteId1].oam.affineParam;
- spriteId3 = gSprites[spriteId1].data5;
+ spriteId3 = gSprites[spriteId1].data[5];
gSprites[spriteId1].oam.priority = priority;
gSprites[spriteId2].oam.priority = priority;
gSprites[spriteId3].oam.priority = priority;
@@ -668,14 +663,14 @@ static void sub_8043FC0(u8 a, u8 b)
memcpy(str, gUnknown_0820A81C, sizeof(str));
if (!IsDoubleBattle())
{
- if (GetBankSide(gSprites[a].data6) == 0)
+ if (GetBankSide(gSprites[a].data[6]) == 0)
r7 = gUnknown_0820A804;
else
r7 = gUnknown_0820A80C;
}
else
{
- if (GetBankSide(gSprites[a].data6) == 0)
+ if (GetBankSide(gSprites[a].data[6]) == 0)
r7 = gUnknown_0820A814;
else
r7 = gUnknown_0820A80C;
@@ -705,11 +700,11 @@ static void sub_8043FC0(u8 a, u8 b)
*(ptr++) = 0x13;
*(ptr++) = 0xF;
*(ptr++) = EOS;
- sub_80034D4((u8 *)0x02000000, str);
+ sub_80034D4(ewram0_9(0), str);
two = 2;
for (i = 0; i < two; i++)
- CpuCopy32((void *)(0x02000020 + i * 64), r7[i] + gSprites[a].oam.tileNum * 32, 32);
+ CpuCopy32((void *)(ewram0_9(1) + i * 64), r7[i] + gSprites[a].oam.tileNum * 32, 32);
}
#ifdef NONMATCHING
@@ -723,7 +718,7 @@ void sub_80440EC(u8 a, s16 b, u8 c)
// TODO: make this a local variable
memcpy(str, gUnknown_0820A864, sizeof(str));
- foo = gSprites[a].data6;
+ foo = gSprites[a].data[6];
if (IsDoubleBattle() == TRUE || GetBankSide(foo) == 1)
{
@@ -735,7 +730,7 @@ void sub_80440EC(u8 a, s16 b, u8 c)
ptr = str + 6;
if (c == 0)
{
- if (GetBankSide(gSprites[a].data6) == 0)
+ if (GetBankSide(gSprites[a].data[6]) == 0)
r4 = gUnknown_0820A83C;
else
r4 = gUnknown_0820A848;
@@ -743,24 +738,24 @@ void sub_80440EC(u8 a, s16 b, u8 c)
ptr = sub_8003504(ptr, b, 0x13, 1);
*(ptr++) = 0xBA;
*(ptr++) = 0xFF;
- sub_80034D4((u8 *)0x02000000, str);
+ sub_80034D4(ewram0_9(0), str);
}
else
{
- if (GetBankSide(gSprites[a].data6) == 0)
+ if (GetBankSide(gSprites[a].data[6]) == 0)
r4 = gUnknown_0820A854;
else
r4 = gUnknown_0820A85C;
c = 2;
sub_8003504(ptr, b, 0xF, 1);
- sub_80034D4((u8 *)0x02000000, str);
+ sub_80034D4(ewram0_9(0), str);
}
//asm(""::"r"(a));
//_080441B6
for (i = 0; i < c; i++) // _080440BC
{
void *temp = r4[i] + gSprites[a].oam.tileNum * 32;
- CpuCopy32((void *)(0x02000020 + i * 0x40), temp, 0x20);
+ CpuCopy32((void *)(ewram0_9(1) + i * 0x40), temp, 0x20);
}
}
#else
@@ -878,7 +873,7 @@ _080441B6:\n\
lsls r0, 2\n\
adds r6, r0, r1\n\
adds r7, r4, 0\n\
- ldr r5, _08044208 @ =0x02000020\n\
+ ldr r5, _08044208 @ =gSharedMem + 0x20\n\
mov r4, r8\n\
_080441D6:\n\
ldrh r0, [r6, 0x4]\n\
@@ -904,7 +899,7 @@ _080441F0:\n\
_080441FC: .4byte gUnknown_0820A85C\n\
_08044200: .4byte gUnknown_0820A854\n\
_08044204: .4byte gSprites\n\
-_08044208: .4byte 0x02000020\n\
+_08044208: .4byte gSharedMem + 0x20\n\
_0804420C: .4byte 0x04000008\n\
.syntax divided\n");
}
@@ -921,7 +916,7 @@ static void sub_8044210(u8 a, s16 b, u8 c)
// TODO: make this a local variable
memcpy(str, gUnknown_0820A89C, sizeof(str));
- r4 = gSprites[a].data6;
+ r4 = gSprites[a].data[6];
if ((ewram17800[r4].unk0_4) == 0)
return;
ptr = str + 6;
@@ -940,14 +935,14 @@ 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;
- sub_80034D4((u8 *)0x02000000, str);
+ r4 = gSprites[a].data[5];
+ sub_80034D4(ewram0_9(0), str);
for (i = 0; i < r10; i++)
{
- CpuCopy32((void *)(0x02000020 + i * 0x40), r7[i] + gSprites[r4].oam.tileNum * 32, 0x20);
+ CpuCopy32((void *)(ewram0_9(1) + i * 0x40), r7[i] + gSprites[r4].oam.tileNum * 32, 0x20);
}
}
@@ -964,7 +959,7 @@ void sub_8044338(u8 a, struct Pokemon *pkmn)
// TODO: make this a local variable
memcpy(str, gUnknown_0820A864, sizeof(str));
- r6 = ewram520[GetBankIdentity(gSprites[a].data6)].filler0;
+ r6 = ewram520[GetBankIdentity(gSprites[a].data[6])].filler0;
r8 = 5;
nature = GetNature(pkmn);
StringCopy(str + 6, gNatureNames[nature]);
@@ -999,24 +994,24 @@ void sub_8044338(u8 a, struct Pokemon *pkmn)
r6 += 32;
}
//_08044486
- r5 = gSprites[a].data5;
- ConvertIntToDecimalStringN(str + 6, ewram[0x16089], 1, 2);
- ConvertIntToDecimalStringN(str + 9, ewram[0x16088], 1, 2);
+ r5 = gSprites[a].data[5];
+ ConvertIntToDecimalStringN(str + 6, ewram16089, 1, 2);
+ ConvertIntToDecimalStringN(str + 9, ewram16088, 1, 2);
str[5] = 0;
str[8] = 0xBA;
- sub_80034D4((u8 *)0x02000000, str);
+ sub_80034D4(ewram0_9(0), str);
for (r7 = 0; r7 < 5; r7++)
{
if (r7 <= 1)
{
int foo = (gSprites[r5].oam.tileNum + 2 + r7);
- CpuCopy32((u8 *)0x02000020 + r7 * 0x40, (u8 *)0x06010000 + foo * 32, 32);
+ CpuCopy32(ewram0_9(1) + r7 * 0x40, (u8 *)0x06010000 + foo * 32, 32);
}
else
{
int foo = (r7 + gSprites[r5].oam.tileNum);
- CpuCopy32((u8 *)0x02000020 + r7 * 0x40, (u8 *)0x060100C0 + foo * 32, 32);
+ CpuCopy32(ewram0_9(1) + r7 * 0x40, (u8 *)0x060100C0 + foo * 32, 32);
}
}
}
@@ -1054,7 +1049,7 @@ void sub_8044338(u8 a, struct Pokemon *pkmn)
lsls r1, r0, 1\n\
adds r1, r0\n\
lsls r1, 7\n\
- ldr r3, _080443D4 @ =0x02000520\n\
+ ldr r3, _080443D4 @ =gSharedMem + 0x520\n\
adds r6, r1, r3\n\
movs r0, 0x5\n\
mov r8, r0\n\
@@ -1099,7 +1094,7 @@ _080443C8:\n\
.align 2, 0\n\
_080443CC: .4byte gUnknown_0820A864\n\
_080443D0: .4byte gSprites\n\
-_080443D4: .4byte 0x02000520\n\
+_080443D4: .4byte gSharedMem + 0x520\n\
_080443D8: .4byte gNatureNames\n\
_080443DC:\n\
adds r0, r1, 0\n\
@@ -1198,7 +1193,7 @@ _08044486:\n\
ldrh r5, [r0, 0x38]\n\
lsls r5, 24\n\
lsrs r5, 24\n\
- ldr r4, _08044504 @ =0x02000000\n\
+ ldr r4, _08044504 @ =gSharedMem\n\
ldr r2, _08044508 @ =0x00016089\n\
adds r0, r4, r2\n\
ldrb r1, [r0]\n\
@@ -1227,7 +1222,7 @@ _08044486:\n\
adds r0, r5\n\
lsls r0, 2\n\
adds r5, r0, r6\n\
- ldr r4, _08044510 @ =0x02000020\n\
+ ldr r4, _08044510 @ =gSharedMem + 0x20\n\
_080444DA:\n\
cmp r7, 0x1\n\
bgt _08044514\n\
@@ -1247,10 +1242,10 @@ _080444DA:\n\
_080444F8: .4byte 0x04000008\n\
_080444FC: .4byte gSprites\n\
_08044500: .4byte 0x06010000\n\
-_08044504: .4byte 0x02000000\n\
+_08044504: .4byte gSharedMem\n\
_08044508: .4byte 0x00016089\n\
_0804450C: .4byte 0x00016088\n\
-_08044510: .4byte 0x02000020\n\
+_08044510: .4byte gSharedMem + 0x20\n\
_08044514:\n\
ldrh r1, [r5, 0x4]\n\
lsls r1, 22\n\
@@ -1307,9 +1302,9 @@ void sub_804454C(void)
if (r6 == 1)
{
- spriteId = gSprites[gHealthboxIDs[i]].data5;
+ spriteId = gSprites[gHealthboxIDs[i]].data[5];
- 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 +1312,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
@@ -1330,9 +1325,9 @@ void sub_804454C(void)
}
else
{
- spriteId = gSprites[gHealthboxIDs[i]].data5;
+ spriteId = gSprites[gHealthboxIDs[i]].data[5];
- 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);
}
@@ -1345,7 +1340,7 @@ void sub_804454C(void)
sub_8045A5C(gHealthboxIDs[i], &gEnemyParty[gBattlePartyID[i]], 4);
}
}
- gSprites[gHealthboxIDs[i]].data7 ^= 1;
+ gSprites[gHealthboxIDs[i]].data[7] ^= 1;
}
}
}
@@ -1418,7 +1413,7 @@ u8 sub_8044804(u8 a, const struct BattleInterfaceStruct2 *b, u8 c, u8 d)
sp18 = CreateSprite(&gSpriteTemplate_820A7A4[r7], x, y, 10);
SetSubspriteTables(&gSprites[sp18], gSubspriteTables_820A6E4);
gSprites[sp18].pos2.x = r8;
- gSprites[sp18].data0 = r5;
+ gSprites[sp18].data[0] = r5;
if (r7 != 0)
{
gSprites[sp18].pos1.x -= 96;
@@ -1443,22 +1438,22 @@ u8 sub_8044804(u8 a, const struct BattleInterfaceStruct2 *b, u8 c, u8 d)
gSprites[sp[i]].pos2.y = 0;
}
//_080449BE
- gSprites[sp[i]].data0 = sp18;
+ gSprites[sp[i]].data[0] = sp18;
if (r7 == 0)
{
gSprites[sp[i]].pos1.x += 10 * i + 24;
- gSprites[sp[i]].data1 = i * 7 + 10;
+ gSprites[sp[i]].data[1] = i * 7 + 10;
gSprites[sp[i]].pos2.x = 120;
}
//_08044A18
else
{
gSprites[sp[i]].pos1.x -= 10 * (5 - i) + 24;
- gSprites[sp[i]].data1 = (6 - i) * 7 + 10;
+ gSprites[sp[i]].data[1] = (6 - i) * 7 + 10;
gSprites[sp[i]].pos2.x = -120;
}
//_08044A56
- gSprites[sp[i]].data2 = r7;
+ gSprites[sp[i]].data[2] = r7;
}
//_08044A76
if (GetBankSide(a) == 0)
@@ -1471,7 +1466,7 @@ u8 sub_8044804(u8 a, const struct BattleInterfaceStruct2 *b, u8 c, u8 d)
{
//_08044AE6
gSprites[sp[i]].oam.tileNum += 1;
- gSprites[sp[i]].data7 = 1;
+ gSprites[sp[i]].data[7] = 1;
// to _08044B52
}
else if (b[i].unk0 == 0)
@@ -1491,7 +1486,7 @@ u8 sub_8044804(u8 a, const struct BattleInterfaceStruct2 *b, u8 c, u8 d)
{
//_08044AE6
gSprites[sp[i]].oam.tileNum += 1;
- gSprites[sp[i]].data7 = 1;
+ gSprites[sp[i]].data[7] = 1;
// to _08044B52
}
else if (b[i].unk0 == 0)
@@ -1518,7 +1513,7 @@ u8 sub_8044804(u8 a, const struct BattleInterfaceStruct2 *b, u8 c, u8 d)
if (b[i].unk0 == 0xFFFF)
{
gSprites[sp[5 - i]].oam.tileNum += 1;
- gSprites[sp[5 - i]].data7 = 1;
+ gSprites[sp[5 - i]].data[7] = 1;
}
else if (b[i].unk0 == 0)
{
@@ -1534,7 +1529,7 @@ u8 sub_8044804(u8 a, const struct BattleInterfaceStruct2 *b, u8 c, u8 d)
if (i >= sp14)
{
gSprites[sp[5 - i]].oam.tileNum += 1;
- gSprites[sp[5 - i]].data7 = 1;
+ gSprites[sp[5 - i]].data[7] = 1;
}
else if (b[i].unk0 == 0)
{
@@ -2179,21 +2174,21 @@ void sub_8044CA0(u8 taskId)
{
if (GetBankSide(sp8) != 0)
{
- gSprites[sp[5 - i]].data1 = 7 * i;
- gSprites[sp[5 - i]].data3 = 0;
- gSprites[sp[5 - i]].data4 = 0;
+ gSprites[sp[5 - i]].data[1] = 7 * i;
+ gSprites[sp[5 - i]].data[3] = 0;
+ gSprites[sp[5 - i]].data[4] = 0;
gSprites[sp[5 - i]].callback = sub_8045110;
}
else
{
- gSprites[sp[i]].data1 = 7 * i;
- gSprites[sp[i]].data3 = 0;
- gSprites[sp[i]].data4 = 0;
+ gSprites[sp[i]].data[1] = 7 * i;
+ gSprites[sp[i]].data[3] = 0;
+ gSprites[sp[i]].data[4] = 0;
gSprites[sp[i]].callback = sub_8045110;
}
}
- gSprites[r10].data0 /= 2;
- gSprites[r10].data1 = 0;
+ gSprites[r10].data[0] /= 2;
+ gSprites[r10].data[1] = 0;
gSprites[r10].callback = sub_8045048;
SetSubspriteTables(&gSprites[r10], gSubspriteTables_820A6EC);
gTasks[taskId].func = sub_8044E74;
@@ -2277,17 +2272,17 @@ static void sub_8044F70(u8 taskId)
void sub_8045030(struct Sprite *sprite)
{
if (sprite->pos2.x != 0)
- sprite->pos2.x += sprite->data0;
+ sprite->pos2.x += sprite->data[0];
}
static void sub_8045048(struct Sprite *sprite)
{
- sprite->data1 += 32;
- if (sprite->data0 > 0)
- sprite->pos2.x += sprite->data1 >> 4;
+ sprite->data[1] += 32;
+ if (sprite->data[0] > 0)
+ sprite->pos2.x += sprite->data[1] >> 4;
else
- sprite->pos2.x -= sprite->data1 >> 4;
- sprite->data1 &= 0xF;
+ sprite->pos2.x -= sprite->data[1] >> 4;
+ sprite->data[1] &= 0xF;
}
void sub_804507C(struct Sprite *sprite)
@@ -2296,15 +2291,15 @@ void sub_804507C(struct Sprite *sprite)
u16 r2;
s8 pan;
- if (sprite->data1 > 0)
+ if (sprite->data[1] > 0)
{
- sprite->data1--;
+ sprite->data[1]--;
return;
}
- r3 = sprite->data2;
- r2 = sprite->data3;
+ r3 = sprite->data[2];
+ r2 = sprite->data[3];
r2 += 56;
- sprite->data3 = r2 & 0xFFF0;
+ sprite->data[3] = r2 & 0xFFF0;
if (r3 != 0)
{
sprite->pos2.x += r2 >> 4;
@@ -2322,7 +2317,7 @@ void sub_804507C(struct Sprite *sprite)
pan = 63;
if (r3 != 0)
pan = -64;
- if (sprite->data7 != 0)
+ if (sprite->data[7] != 0)
PlaySE2WithPanning(SE_TB_KARA, pan);
else
PlaySE1WithPanning(SE_TB_KON, pan);
@@ -2335,15 +2330,15 @@ static void sub_8045110(struct Sprite *sprite)
u8 r0;
u16 r2;
- if (sprite->data1 > 0)
+ if (sprite->data[1] > 0)
{
- sprite->data1--;
+ sprite->data[1]--;
return;
}
- r0 = sprite->data2;
- r2 = sprite->data3;
+ r0 = sprite->data[2];
+ r2 = sprite->data[3];
r2 += 56;
- sprite->data3 = r2 & 0xFFF0;
+ sprite->data[3] = r2 & 0xFFF0;
if (r0 != 0)
sprite->pos2.x += r2 >> 4;
else
@@ -2358,7 +2353,7 @@ static void sub_8045110(struct Sprite *sprite)
void sub_8045180(struct Sprite *sprite)
{
- u8 spriteId = sprite->data0;
+ u8 spriteId = sprite->data[0];
sprite->pos2.x = gSprites[spriteId].pos2.x;
sprite->pos2.y = gSprites[spriteId].pos2.y;
@@ -2388,7 +2383,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)
{
@@ -2414,7 +2409,7 @@ static void sub_80451A0(u8 a, struct Pokemon *pkmn)
ptr[1] = 0x13;
ptr[2] = 0x37;
ptr[3] = EOS;
- ptr = (u8 *)0x02000520 + GetBankIdentity(gSprites[a].data6) * 0x180;
+ ptr = ewram520_2 + GetBankIdentity(gSprites[a].data[6]) * 0x180;
sub_80034D4(ptr, gDisplayedStringBattle);
i = 0;
@@ -2451,7 +2446,7 @@ static void sub_80451A0(u8 a, struct Pokemon *pkmn)
for (; i < _7; i++)
CpuCopy32(sub_8043CDC(0x2B), ptr + 64 * i, 32);
- if (GetBankSide(gSprites[a].data6) == 0 && !IsDoubleBattle())
+ if (GetBankSide(gSprites[a].data[6]) == 0 && !IsDoubleBattle())
{
r1 = (u8 *const *)gUnknown_0820A8B4;
for (i = 0; i < _7; i++)
@@ -2469,7 +2464,7 @@ static void sub_80451A0(u8 a, struct Pokemon *pkmn)
}
else
{
- if (GetBankSide(gSprites[a].data6) == 0)
+ if (GetBankSide(gSprites[a].data[6]) == 0)
r1 = (u8 *const *)gUnknown_0820A904;
else
r1 = (u8 *const *)gUnknown_0820A8DC;
@@ -2497,17 +2492,17 @@ static void sub_8045458(u8 a, u8 b)
if (gBattleTypeFlags & 8)
return;
- r4 = gSprites[a].data6;
+ r4 = gSprites[a].data[6];
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;
+ r4 = gSprites[a].data[5];
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);
}
}
}
@@ -2523,8 +2518,8 @@ static void draw_status_ailment_maybe(u8 a)
u8 r0;
s32 i;
- r7 = gSprites[a].data6;
- r10 = gSprites[a].data5;
+ r7 = gSprites[a].data[6];
+ r10 = gSprites[a].data[5];
if (GetBankSide(r7) == 0)
{
r4 = GetMonData(&gPlayerParty[gBattlePartyID[r7]], MON_DATA_STATUS);
@@ -2568,10 +2563,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 +2577,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);
@@ -2662,18 +2657,18 @@ static void sub_80458B0(u8 a)
s32 r7;
u8 *addr;
- r6 = (u8 *)0x02000520 + GetBankIdentity(gSprites[a].data6) * 0x180;
+ r6 = ewram520_2 + GetBankIdentity(gSprites[a].data[6]) * 0x180;
r8 = 7;
sub_80034D4(r6, BattleText_SafariBalls);
for (i = 0; i < r8; i++)
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;
}
@@ -2690,14 +2685,14 @@ static void sub_8045998(u8 a)
r7 = StringCopy(gDisplayedStringBattle, BattleText_SafariBallsLeft);
r7 = sub_8003504(r7, gNumSafariBalls, 10, 1);
StringAppend(r7, BattleText_HighlightRed);
- status = GetBankIdentity(gSprites[a].data6);
- r7 = (u8 *)0x02000520 + status * 0x180;
+ status = GetBankIdentity(gSprites[a].data[6]);
+ r7 = ewram520_2 + status * 0x180;
r6 = 5;
sub_80034D4(r7, gDisplayedStringBattle);
- r7 = (u8 *)0x02000520 + status * 0x180 + 32;
+ r7 = ewram520_2 + 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;
}
}
@@ -2708,7 +2703,7 @@ void sub_8045A5C(u8 a, struct Pokemon *pkmn, u8 c)
u32 maxhp;
u32 currhp;
- r10 = gSprites[a].data6;
+ r10 = gSprites[a].data[6];
if (GetBankSide(r10) == 0)
{
if (c == 3 || c == 0)
@@ -2819,11 +2814,11 @@ static void sub_8045D58(u8 a, u8 b)
}
for (i = 0; i < 6; i++)
{
- u8 r4 = gSprites[ewram17850[a].unk0].data5;
+ u8 r4 = gSprites[ewram17850[a].unk0].data[5];
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 +2832,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 +2967,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 +2982,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..d8efc09c5 100644
--- a/src/battle_message.c
+++ b/src/battle/battle_message.c
@@ -1,8 +1,10 @@
#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 "event_data.h"
+#include "constants/items.h"
#include "pokemon.h"
#include "data2.h"
#include "text.h"
@@ -10,12 +12,143 @@
#include "link.h"
#include "battle_setup.h"
#include "battle_tower.h"
-#include "flags.h"
+#include "constants/flags.h"
+#include "ewram.h"
#define BATTLESTRING_TO_SUB 12
#define BATTLESTRINGS_NO 351
#define BATTLESTRINGS_MAX BATTLESTRINGS_NO + BATTLESTRING_TO_SUB
+#ifdef GERMAN
+#include "../data/battle_strings_de.h" // TODO: German
+#else
+#include "../data/battle_strings_en.h"
+#endif
+
+const u16 gUnknown_084016BC[] =
+{
+ MOVE_SWORDS_DANCE,
+ MOVE_STRENGTH,
+ MOVE_GROWTH,
+ MOVE_HARDEN,
+ MOVE_MINIMIZE,
+ MOVE_SMOKESCREEN,
+ MOVE_WITHDRAW,
+ MOVE_DEFENSE_CURL,
+ MOVE_EGG_BOMB,
+ MOVE_SMOG,
+ MOVE_BONE_CLUB,
+ MOVE_FLASH,
+ MOVE_SPLASH,
+ MOVE_ACID_ARMOR,
+ MOVE_BONEMERANG,
+ MOVE_REST,
+ MOVE_SHARPEN,
+ MOVE_SUBSTITUTE,
+ MOVE_MIND_READER,
+ MOVE_SNORE,
+ MOVE_PROTECT,
+ MOVE_SPIKES,
+ MOVE_ENDURE,
+ MOVE_ROLLOUT,
+ MOVE_SWAGGER,
+ MOVE_SLEEP_TALK,
+ MOVE_HIDDEN_POWER,
+ MOVE_PSYCH_UP,
+ MOVE_EXTREME_SPEED,
+ MOVE_FOLLOW_ME,
+ MOVE_TRICK,
+ MOVE_ASSIST,
+ MOVE_INGRAIN,
+ MOVE_KNOCK_OFF,
+ MOVE_CAMOUFLAGE,
+ MOVE_ASTONISH,
+ MOVE_ODOR_SLEUTH,
+ MOVE_GRASS_WHISTLE,
+ MOVE_SHEER_COLD,
+ MOVE_MUDDY_WATER,
+ MOVE_IRON_DEFENSE,
+ MOVE_BOUNCE,
+ MOVE_NONE,
+ MOVE_TELEPORT,
+ MOVE_RECOVER,
+ MOVE_BIDE,
+ MOVE_AMNESIA,
+ MOVE_FLAIL,
+ MOVE_TAUNT,
+ MOVE_BULK_UP,
+ MOVE_NONE,
+ MOVE_MEDITATE,
+ MOVE_AGILITY,
+ MOVE_MIMIC,
+ MOVE_DOUBLE_TEAM,
+ MOVE_BARRAGE,
+ MOVE_TRANSFORM,
+ MOVE_STRUGGLE,
+ MOVE_SCARY_FACE,
+ MOVE_CHARGE,
+ MOVE_WISH,
+ MOVE_BRICK_BREAK,
+ MOVE_YAWN,
+ MOVE_FEATHER_DANCE,
+ MOVE_TEETER_DANCE,
+ MOVE_MUD_SPORT,
+ MOVE_FAKE_TEARS,
+ MOVE_WATER_SPORT,
+ MOVE_CALM_MIND,
+ MOVE_NONE,
+ MOVE_POUND,
+ MOVE_SCRATCH,
+ MOVE_VICE_GRIP,
+ MOVE_WING_ATTACK,
+ MOVE_FLY,
+ MOVE_BIND,
+ MOVE_SLAM,
+ MOVE_HORN_ATTACK,
+ MOVE_WRAP,
+ MOVE_THRASH,
+ MOVE_TAIL_WHIP,
+ MOVE_LEER,
+ MOVE_BITE,
+ MOVE_GROWL,
+ MOVE_ROAR,
+ MOVE_SING,
+ MOVE_PECK,
+ MOVE_ABSORB,
+ MOVE_STRING_SHOT,
+ MOVE_EARTHQUAKE,
+ MOVE_FISSURE,
+ MOVE_DIG,
+ MOVE_TOXIC,
+ MOVE_SCREECH,
+ MOVE_METRONOME,
+ MOVE_LICK,
+ MOVE_CLAMP,
+ MOVE_CONSTRICT,
+ MOVE_POISON_GAS,
+ MOVE_BUBBLE,
+ MOVE_SLASH,
+ MOVE_SPIDER_WEB,
+ MOVE_NIGHTMARE,
+ MOVE_CURSE,
+ MOVE_FORESIGHT,
+ MOVE_CHARM,
+ MOVE_ATTRACT,
+ MOVE_ROCK_SMASH,
+ MOVE_UPROAR,
+ MOVE_SPIT_UP,
+ MOVE_SWALLOW,
+ MOVE_TORMENT,
+ MOVE_FLATTER,
+ MOVE_ROLE_PLAY,
+ MOVE_ENDEAVOR,
+ MOVE_TICKLE,
+ MOVE_COVET,
+ MOVE_NONE,
+};
+
+const u8 gUnknown_084017A8[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // empty flags
+
extern const u8* const gBattleStringsTable[BATTLESTRINGS_NO];
extern u16 gLastUsedItem;
@@ -42,67 +175,6 @@ extern u16 gBattlePartyID[4];
extern struct BattleEnigmaBerry gEnigmaBerries[4];
extern u8 gBattleBufferA[4][0x200];
-extern const u8 gUnknown_084005DB[];
-extern const u8 gUnknown_084005C7[];
-extern const u8 gUnknown_084005AA[];
-extern const u8 gUnknown_08400568[];
-extern const u8 gUnknown_08400590[];
-extern const u8 gUnknown_0840057B[];
-extern const u8 gUnknown_08400555[];
-extern const u8 gUnknown_084006F1[];
-extern const u8 gUnknown_084006A4[];
-extern const u8 gUnknown_0840069C[];
-extern const u8 gUnknown_0840065C[];
-extern const u8 gUnknown_08400645[];
-extern const u8 gUnknown_08400608[];
-extern const u8 gUnknown_08400635[];
-extern const u8 gUnknown_084005F5[];
-extern const u8 gUnknown_08400709[];
-extern const u8 gUnknown_08400727[];
-extern const u8 gUnknown_08400736[];
-extern const u8 gUnknown_08400749[];
-extern const u8 gUnknown_08400781[];
-extern const u8 gUnknown_08400771[];
-extern const u8 gUnknown_0840075E[];
-extern const u8 gUnknown_084006B3[];
-extern const u8 gUnknown_084006BB[];
-extern const u8 gUnknown_084006C6[];
-extern const u8 gUnknown_084006D5[];
-extern const u8 gUnknown_0840068C[];
-extern const u8 gUnknown_0840067C[];
-extern const u8 gUnknown_08400622[];
-extern const u8 gUnknown_084007BD[];
-extern const u8 gUnknown_083FFEFC[];
-extern const u8 gUnknown_083FFFF7[];
-extern const u8 gUnknown_083FFFEA[];
-extern const u8 gUnknown_083FFF6A[];
-extern const u8 gUnknown_083FFF99[];
-extern const u8 gUnknown_083FFFCB[];
-extern const u8 gUnknown_083FFF56[];
-extern const u8 gUnknown_083FFF81[];
-extern const u8 gUnknown_083FFFB3[];
-extern const u8 gUnknown_08400A78[];
-extern const u8 gUnknown_08400A85[];
-extern const u8 gUnknown_08400797[];
-extern const u8 gUnknown_08400791[];
-extern const u8 gUnknown_084007B7[];
-extern const u8 gUnknown_084007B2[];
-extern const u8 gUnknown_0840079C[];
-extern const u8 gUnknown_084007A1[];
-extern const u8 gUnknown_084007A7[];
-extern const u8 gUnknown_084007AC[];
-extern const u8 gUnknown_084009ED[];
-extern const u8 gUnknown_084009F7[];
-extern const u8 gUnknown_084007C8[];
-extern const u8 gUnknown_084007CA[];
-extern const u8 gUnknown_084007CC[];
-extern const u8 gUnknown_084007CE[];
-extern const u8 gUnknown_084007D0[];
-extern const u8 gUnknown_08400E5E[];
-extern const u8 gUnknown_08400E62[];
-
-extern const u16 gUnknown_084016BC[]; // a table of moves
-
extern const u8* const gUnknown_08401674[]; // table of pointers to 'a -TYPE' strings
extern const u8* const gUnknown_08400F58[]; // table of pointers to stat strings
extern const u8* const gUnknown_08400F78[]; // table of pointers to flavour strings
@@ -114,7 +186,6 @@ struct StatusFlagString
};
extern const struct StatusFlagString gUnknown_081FA6D4[7]; // status flag/text
-extern const u8 gUnknown_084017A8[8]; // empty flags
extern struct StringInfoBattle* gSelectedOrderFromParty;
#define gStringInfo gSelectedOrderFromParty
@@ -127,9 +198,8 @@ 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 GetBankByIdentity(u8 ID);
u8 GetBankSide(u8 bank);
u8 GetBankIdentity(u8 bank);
#ifdef GERMAN
@@ -167,13 +237,13 @@ void BufferStringBattle(u16 stringID)
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
- stringPtr = gUnknown_084005DB;
+ stringPtr = BattleText_DoubleWantToBattle;
else
- stringPtr = gUnknown_084005C7;
+ stringPtr = BattleText_SingleWantToBattle2;
}
else
{
- stringPtr = gUnknown_084005AA;
+ stringPtr = BattleText_SingleWantToBattle1;
#ifdef GERMAN
stringPtr = de_sub_804110C(0xFFFF, stringPtr);
#endif
@@ -182,13 +252,13 @@ void BufferStringBattle(u16 stringID)
else
{
if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY)
- stringPtr = gUnknown_08400568;
+ stringPtr = BattleText_WildAppeared2;
else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) // interesting, looks like they had something planned for wild double battles
- stringPtr = gUnknown_08400590;
+ stringPtr = BattleText_WildDoubleAppeared;
else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL)
- stringPtr = gUnknown_0840057B;
+ stringPtr = BattleText_WildAppeared3;
else
- stringPtr = gUnknown_08400555;
+ stringPtr = BattleText_WildAppeared1;
}
break;
case 1: // poke first send-out
@@ -197,34 +267,34 @@ void BufferStringBattle(u16 stringID)
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
- stringPtr = gUnknown_084006F1;
+ stringPtr = BattleText_SentOutSingle11;
else
- stringPtr = gUnknown_084006A4;
+ stringPtr = BattleText_SentOutDouble4;
}
else
- stringPtr = gUnknown_0840069C;
+ stringPtr = BattleText_SentOutSingle6;
}
else
{
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
- stringPtr = gUnknown_0840065C;
+ stringPtr = BattleText_SentOutDouble3;
else if (gBattleTypeFlags & BATTLE_TYPE_LINK)
- stringPtr = gUnknown_08400645;
+ stringPtr = BattleText_SentOutDouble2;
else
{
- stringPtr = gUnknown_08400608;
+ stringPtr = BattleText_SentOutDouble1;
#ifdef GERMAN
stringPtr = de_sub_804110C(0xFFFF, stringPtr);
#endif
}
}
else if (gBattleTypeFlags & BATTLE_TYPE_LINK)
- stringPtr = gUnknown_08400635;
+ stringPtr = BattleText_SentOutSingle3;
else
{
- stringPtr = gUnknown_084005F5;
+ stringPtr = BattleText_SentOutSingle1;
#ifdef GERMAN
stringPtr = de_sub_804110C(0xFFFF, stringPtr);
#endif
@@ -235,26 +305,26 @@ void BufferStringBattle(u16 stringID)
if (GetBankSide(gActiveBank) == 0)
{
if (BATTLE_STRUCT->hpScale == 0)
- stringPtr = gUnknown_08400709;
+ stringPtr = BattleText_ComeBackSingle1;
else if (BATTLE_STRUCT->hpScale == 1 || gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
- stringPtr = gUnknown_08400727;
+ stringPtr = BattleText_ComeBackSingle2;
else if (BATTLE_STRUCT->hpScale == 2)
- stringPtr = gUnknown_08400736;
+ stringPtr = BattleText_ComeBackSingle3;
else
- stringPtr = gUnknown_08400749;
+ stringPtr = BattleText_ComeBackSingle4;
}
else
{
if (gTrainerBattleOpponent == 0x800)
{
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
- stringPtr = gUnknown_08400781;
+ stringPtr = BattleText_WithdrewPoke3;
else
- stringPtr = gUnknown_08400771;
+ stringPtr = BattleText_WithdrewPoke2;
}
else
{
- stringPtr = gUnknown_0840075E;
+ stringPtr = BattleText_WithdrewPoke1;
#ifdef GERMAN
stringPtr = de_sub_804110C(0xFFFF, stringPtr);
#endif
@@ -265,26 +335,26 @@ void BufferStringBattle(u16 stringID)
if (GetBankSide(BATTLE_STRUCT->scriptingActive) == 0)
{
if (BATTLE_STRUCT->hpScale == 0 || gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
- stringPtr = gUnknown_084006B3;
+ stringPtr = BattleText_SentOutSingle7;
else if (BATTLE_STRUCT->hpScale == 1)
- stringPtr = gUnknown_084006BB;
+ stringPtr = BattleText_SentOutSingle8;
else if (BATTLE_STRUCT->hpScale == 2)
- stringPtr = gUnknown_084006C6;
+ stringPtr = BattleText_SentOutSingle9;
else
- stringPtr = gUnknown_084006D5;
+ stringPtr = BattleText_SentOutSingle10;
}
else
{
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
- stringPtr = gUnknown_0840068C;
+ stringPtr = BattleText_SentOutSingle5;
else
- stringPtr = gUnknown_0840067C;
+ stringPtr = BattleText_SentOutSingle4;
}
else
{
- stringPtr = gUnknown_08400622;
+ stringPtr = BattleText_SentOutSingle2;
#ifdef GERMAN
stringPtr = de_sub_804110C(0xFFFF, stringPtr);
#endif
@@ -298,7 +368,7 @@ void BufferStringBattle(u16 stringID)
else
StringCopy(gBattleTextBuff2, gMoveNames[gStringInfo->currentMove]);
sub_8121D74(gBattleTextBuff2);
- stringPtr = gUnknown_084007BD;
+ stringPtr = BattleText_OpponentUsedMove;
break;
case 5: // battle end
if (gBattleTextBuff1[0] & 0x80)
@@ -307,13 +377,13 @@ void BufferStringBattle(u16 stringID)
if (GetBankSide(gActiveBank) == 1 && gBattleTextBuff1[0] != 3)
gBattleTextBuff1[0] ^= 3;
if (gBattleTextBuff1[0] == BATTLE_LOST || gBattleTextBuff1[0] == BATTLE_DREW)
- stringPtr = gUnknown_083FFEFC;
+ stringPtr = BattleText_GotAwaySafely;
else
{
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
- stringPtr = gUnknown_083FFFF7;
+ stringPtr = BattleText_FledDouble;
else
- stringPtr = gUnknown_083FFFEA;
+ stringPtr = BattleText_FledSingle;
}
}
else
@@ -325,13 +395,13 @@ void BufferStringBattle(u16 stringID)
switch (gBattleTextBuff1[0])
{
case BATTLE_WON:
- stringPtr = gUnknown_083FFF6A;
+ stringPtr = BattleText_PlayerDefeatedTrainers;
break;
case BATTLE_LOST:
- stringPtr = gUnknown_083FFF99;
+ stringPtr = BattleText_PlayerLostTrainers;
break;
case BATTLE_DREW:
- stringPtr = gUnknown_083FFFCB;
+ stringPtr = BattleText_PlayerTiedTrainers;
break;
}
}
@@ -340,13 +410,13 @@ void BufferStringBattle(u16 stringID)
switch (gBattleTextBuff1[0])
{
case BATTLE_WON:
- stringPtr = gUnknown_083FFF56;
+ stringPtr = BattleText_PlayerDefeatedTrainer;
break;
case BATTLE_LOST:
- stringPtr = gUnknown_083FFF81;
+ stringPtr = BattleText_PlayerLostTrainer;
break;
case BATTLE_DREW:
- stringPtr = gUnknown_083FFFB3;
+ stringPtr = BattleText_PlayerTiedTrainer;
break;
}
}
@@ -413,9 +483,9 @@ extern u8 *de_sub_8041024(s32, u32);
if (GetBankSide(bank) != 0) \
{ \
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) \
- toCpy = gUnknown_08400797; \
+ toCpy = BattleText_Foe; \
else \
- toCpy = gUnknown_08400791; \
+ toCpy = BattleText_Wild; \
while (*toCpy != EOS) \
{ \
dst[dstID] = *toCpy; \
@@ -444,9 +514,9 @@ extern u8 *de_sub_8041024(s32, u32);
toCpy++; \
} \
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) \
- toCpy = gUnknown_08400797; \
+ toCpy = BattleText_Foe; \
else \
- toCpy = gUnknown_08400791; \
+ toCpy = BattleText_Wild; \
} \
else \
{ \
@@ -502,22 +572,22 @@ u32 StrCpyDecodeBattle(const u8* src, u8* dst)
toCpy = gBattleTextBuff3;
break;
case 2: // first player poke name
- GetMonData(&gPlayerParty[gBattlePartyID[GetBankByPlayerAI(0)]], MON_DATA_NICKNAME, text);
+ GetMonData(&gPlayerParty[gBattlePartyID[GetBankByIdentity(0)]], MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
case 3: // first enemy poke name
- GetMonData(&gEnemyParty[gBattlePartyID[GetBankByPlayerAI(1)]], MON_DATA_NICKNAME, text);
+ GetMonData(&gEnemyParty[gBattlePartyID[GetBankByIdentity(1)]], MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
case 4: // second player poke name
- GetMonData(&gPlayerParty[gBattlePartyID[GetBankByPlayerAI(2)]], MON_DATA_NICKNAME, text);
+ GetMonData(&gPlayerParty[gBattlePartyID[GetBankByIdentity(2)]], MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
case 5: // second enemy poke name
- GetMonData(&gEnemyParty[gBattlePartyID[GetBankByPlayerAI(3)]], MON_DATA_NICKNAME, text);
+ GetMonData(&gEnemyParty[gBattlePartyID[GetBankByIdentity(3)]], MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
@@ -542,13 +612,13 @@ u32 StrCpyDecodeBattle(const u8* src, u8* dst)
toCpy = text;
break;
case 10: // attacker name with prefix, only bank 0/1
- HANDLE_NICKNAME_STRING_CASE(gBankAttacker, gBattlePartyID[GetBankByPlayerAI(GetBankIdentity(gBankAttacker) & 1)])
+ HANDLE_NICKNAME_STRING_CASE(gBankAttacker, gBattlePartyID[GetBankByIdentity(GetBankIdentity(gBankAttacker) & 1)])
break;
case 11: // attacker partner name, only bank 0/1
if (GetBankSide(gBankAttacker) == 0)
- GetMonData(&gPlayerParty[gBattlePartyID[GetBankByPlayerAI(GetBankIdentity(gBankAttacker) & 1) + 2]], MON_DATA_NICKNAME, text);
+ GetMonData(&gPlayerParty[gBattlePartyID[GetBankByIdentity(GetBankIdentity(gBankAttacker) & 1) + 2]], MON_DATA_NICKNAME, text);
else
- GetMonData(&gEnemyParty[gBattlePartyID[GetBankByPlayerAI(GetBankIdentity(gBankAttacker) & 1) + 2]], MON_DATA_NICKNAME, text);
+ GetMonData(&gEnemyParty[gBattlePartyID[GetBankByIdentity(GetBankIdentity(gBankAttacker) & 1) + 2]], MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
@@ -589,14 +659,14 @@ u32 StrCpyDecodeBattle(const u8* src, u8* dst)
{
StringCopy(text, gEnigmaBerries[gStringBank].name);
#ifdef ENGLISH
- StringAppend(text, gUnknown_08400A85);
+ StringAppend(text, BattleText_Berry);
#else
- de_sub_8073174(text, gUnknown_08400A85);
+ de_sub_8073174(text, BattleText_Berry);
#endif
toCpy = text;
}
else
- toCpy = gUnknown_08400A78;
+ toCpy = BattleText_EnigmaBerry;
}
else
{
@@ -632,7 +702,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;
@@ -651,7 +721,7 @@ u32 StrCpyDecodeBattle(const u8* src, u8* dst)
if (gTrainerBattleOpponent == 0x400)
{
memset(text, 0xFF, 8);
- memcpy(text, &ewram[0x17002], 7);
+ memcpy(text, ewram17002, 7);
toCpy = text;
}
else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER)
@@ -661,7 +731,7 @@ u32 StrCpyDecodeBattle(const u8* src, u8* dst)
}
else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER)
{
- sub_8135FF4(text);
+ SetEReaderTrainerName(text);
toCpy = text;
}
else
@@ -686,52 +756,52 @@ u32 StrCpyDecodeBattle(const u8* src, u8* dst)
toCpy = gSaveBlock2.playerName;
break;
case 33: // ?
- toCpy = sub_8082830();
+ toCpy = GetTrainerLoseText();
break;
case 34: // ?
HANDLE_NICKNAME_STRING_CASE(BATTLE_STRUCT->scriptingActive, BATTLE_STRUCT->unk1605E)
break;
case 35: // lanette pc
- if (FlagGet(SYS_PC_LANETTE))
- toCpy = gUnknown_084009F7;
+ if (FlagGet(FLAG_SYS_PC_LANETTE))
+ toCpy = BattleText_Lanette;
else
- toCpy = gUnknown_084009ED;
+ toCpy = BattleText_Someone;
break;
case 38:
if (GetBankSide(gBankAttacker) == 0)
- toCpy = gUnknown_084007AC;
+ toCpy = BattleText_Ally2;
else
- toCpy = gUnknown_084007A7;
+ toCpy = BattleText_Foe3;
break;
case 39:
if (GetBankSide(gBankTarget) == 0)
- toCpy = gUnknown_084007AC;
+ toCpy = BattleText_Ally2;
else
- toCpy = gUnknown_084007A7;
+ toCpy = BattleText_Foe3;
break;
case 36:
if (GetBankSide(gBankAttacker) == 0)
- toCpy = gUnknown_084007A1;
+ toCpy = BattleText_Ally;
else
- toCpy = gUnknown_0840079C;
+ toCpy = BattleText_Foe2;
break;
case 37:
if (GetBankSide(gBankTarget) == 0)
- toCpy = gUnknown_084007A1;
+ toCpy = BattleText_Ally;
else
- toCpy = gUnknown_0840079C;
+ toCpy = BattleText_Foe2;
break;
case 40:
if (GetBankSide(gBankAttacker) == 0)
- toCpy = gUnknown_084007B7;
+ toCpy = BattleText_Ally3;
else
- toCpy = gUnknown_084007B2;
+ toCpy = BattleText_Foe4;
break;
case 41:
if (GetBankSide(gBankTarget) == 0)
- toCpy = gUnknown_084007B7;
+ toCpy = BattleText_Ally3;
else
- toCpy = gUnknown_084007B2;
+ toCpy = BattleText_Foe4;
break;
}
//if (toCpy != NULL) really GF, why did you forget about this?
@@ -818,9 +888,9 @@ void StrCpyDecodeBattleTextBuff(u8* src, u8* dst)
else
{
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
- StringAppend(dst, gUnknown_08400797);
+ StringAppend(dst, BattleText_Foe);
else
- StringAppend(dst, gUnknown_08400791);
+ StringAppend(dst, BattleText_Wild);
GetMonData(&gEnemyParty[src[srcID + 2]], MON_DATA_NICKNAME, text);
}
StringGetEnd10(text);
@@ -838,9 +908,9 @@ void StrCpyDecodeBattleTextBuff(u8* src, u8* dst)
StringGetEnd10(text);
StringAppend(dst, text);
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
- StringAppend(dst, gUnknown_08400797);
+ StringAppend(dst, BattleText_Foe);
else
- StringAppend(dst, gUnknown_08400791);
+ StringAppend(dst, BattleText_Wild);
}
#endif
srcID += 3;
@@ -880,13 +950,13 @@ void StrCpyDecodeBattleTextBuff(u8* src, u8* dst)
{
StringCopy(dst, gEnigmaBerries[gStringBank].name);
#ifdef ENGLISH
- StringAppend(dst, gUnknown_08400A85);
+ StringAppend(dst, BattleText_Berry);
#else
- de_sub_8073174(dst, gUnknown_08400A85);
+ de_sub_8073174(dst, BattleText_Berry);
#endif
}
else
- StringAppend(dst, gUnknown_08400A78);
+ StringAppend(dst, BattleText_EnigmaBerry);
}
else
CopyItemName(hword, dst);
@@ -916,9 +986,9 @@ void sub_8121D1C(u8* textBuff)
if (counter >= 0)
{
if (counter <= 2)
- StringCopy(textBuff, gUnknown_08400E5E); // is
+ StringCopy(textBuff, BattleText_Format10); // is
else if (counter <= 4)
- StringCopy(textBuff, gUnknown_08400E62); // 's
+ StringCopy(textBuff, BattleText_Format11); // 's
}
}
@@ -941,19 +1011,19 @@ void sub_8121D74(u8* dst)
switch (counter)
{
case 0:
- StringCopy(dst, gUnknown_084007C8);
+ StringCopy(dst, BattleText_Exclamation2);
break;
case 1:
- StringCopy(dst, gUnknown_084007CA);
+ StringCopy(dst, BattleText_Exclamation3);
break;
case 2:
- StringCopy(dst, gUnknown_084007CC);
+ StringCopy(dst, BattleText_Exclamation4);
break;
case 3:
- StringCopy(dst, gUnknown_084007CE);
+ StringCopy(dst, BattleText_Exclamation5);
break;
case 4:
- StringCopy(dst, gUnknown_084007D0);
+ StringCopy(dst, BattleText_Exclamation);
break;
}
}
diff --git a/src/battle_party_menu.c b/src/battle/battle_party_menu.c
index 73b847713..7bce00d82 100644
--- a/src/battle_party_menu.c
+++ b/src/battle/battle_party_menu.c
@@ -12,48 +12,22 @@
#include "pokemon_summary_screen.h"
#include "rom_8077ABC.h"
#include "rom_8094928.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "string_util.h"
#include "strings.h"
#include "task.h"
#include "text.h"
+#include "ewram.h"
-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 u16 sub_806BD80();
-extern u8 sub_806CA38();
-extern void sub_806D5A4(void);
extern void sub_802E414(void);
extern void sub_80A6DCC(void);
-extern void sub_806AF4C();
-extern u8 sub_80F9344(void);
-extern u8 sub_806B124(void);
-extern void sub_806C994();
-extern void sub_806BF74();
-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 sub_806D538();
extern void nullsub_14();
-extern void OpenPartyMenu();
extern u8 sub_803FBBC(void);
extern u8 gPlayerPartyCount;
@@ -86,7 +60,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},
@@ -148,7 +122,7 @@ static void sub_8094998(u8 arg[3], u8 player_number)
if (!IsDoubleBattle())
{
pos = 1;
- *temp = gBattlePartyID[GetBankByPlayerAI(0)];
+ *temp = gBattlePartyID[GetBankByIdentity(0)];
for (i = 0; i <= 5; i++)
if (i != *temp)
temp[pos++] = i;
@@ -156,8 +130,8 @@ static void sub_8094998(u8 arg[3], u8 player_number)
else
{
pos = 2;
- *temp = gBattlePartyID[GetBankByPlayerAI(0)];
- temp[1] = gBattlePartyID[GetBankByPlayerAI(2)];
+ *temp = gBattlePartyID[GetBankByIdentity(0)];
+ temp[1] = gBattlePartyID[GetBankByIdentity(2)];
for (i = 0; i <= 5; i++)
if ((i != *temp) && (i != temp[1]))
temp[pos++] = i;
@@ -173,13 +147,13 @@ static void sub_8094A74(u8 arg[3], u8 player_number, u32 arg3)
u8 temp[6];
if (!GetBankSide(arg3))
{
- i = GetBankByPlayerAI(0);
- j = GetBankByPlayerAI(2);
+ i = GetBankByIdentity(0);
+ j = GetBankByIdentity(2);
}
else
{
- i = GetBankByPlayerAI(1);
- j = GetBankByPlayerAI(3);
+ i = GetBankByIdentity(1);
+ j = GetBankByIdentity(3);
}
if (IsLinkDoubleBattle() == TRUE)
{
@@ -230,7 +204,7 @@ void sub_8094B6C(u8 a, u8 b, u8 c)
if (IsLinkDoubleBattle())
{
- u8 *arr = ewram + 0x1606C + a * 3;
+ u8 *arr = &ewram1606Carr(0, a);
for (i = 0, j = 0; i < 3; i++)
{
@@ -349,7 +323,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;
}
}
@@ -361,7 +335,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)
@@ -369,93 +343,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;
+ if (GetItemEffectType(gSpecialVar_ItemId) == 10)
+ ewram1B000.promptTextId = 0xFF;
else
- ewram1B000.unk259 = 3;
+ ewram1B000.promptTextId = 3;
}
return TRUE;
}
@@ -468,55 +442,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)
+ if (gUnknown_02038473 == 3 && GetItemEffectType(gSpecialVar_ItemId) == 10)
{
- gUnknown_03004AE4(a, gScriptItemId, Task_80952E4);
+ gUnknown_03004AE4(taskId, gSpecialVar_ItemId, 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, gSpecialVar_ItemId, 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
@@ -525,12 +500,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;
@@ -578,7 +553,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);
}
@@ -586,14 +561,14 @@ static void Task_809538C(void)
{
do
{
- if (sub_806B124() == 1)
+ 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);
@@ -650,7 +625,7 @@ static void Task_ShowSummaryScreen(u8 taskId)
{
DestroyTask(taskId);
EWRAM_1B000.unk262 = 1;
- ShowPokemonSummaryScreen(gPlayerParty, partySelection, gPlayerPartyCount - 1, Task_809535C, 4);
+ ShowPokemonSummaryScreen(gPlayerParty, partySelection, gPlayerPartyCount - 1, Task_809535C, PSS_MODE_NO_MOVE_ORDER_EDIT);
}
}
@@ -667,7 +642,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))
{
@@ -742,15 +717,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 61dc09792..97740e3da 100644
--- a/src/battle_records.c
+++ b/src/battle/battle_records.c
@@ -1,9 +1,9 @@
#include "global.h"
#include "battle_records.h"
-#include "game_stat.h"
+#include "constants/game_stat.h"
#include "link.h"
#include "menu.h"
-#include "rom4.h"
+#include "overworld.h"
#include "string_util.h"
#include "strings2.h"
#include "trainer_card.h"
@@ -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/battle_setup.c b/src/battle/battle_setup.c
new file mode 100644
index 000000000..b4ff407fc
--- /dev/null
+++ b/src/battle/battle_setup.c
@@ -0,0 +1,1471 @@
+#include "global.h"
+#include "battle_setup.h"
+#include "battle.h"
+#include "battle_transition.h"
+#include "data2.h"
+#include "event_data.h"
+#include "field_control_avatar.h"
+#include "field_fadetransition.h"
+#include "field_map_obj_helpers.h"
+#include "field_message_box.h"
+#include "field_player_avatar.h"
+#include "field_weather.h"
+#include "fieldmap.h"
+#include "fldeff_poison.h"
+#include "main.h"
+#include "constants/maps.h"
+#include "metatile_behavior.h"
+#include "constants/opponents.h"
+#include "palette.h"
+#include "random.h"
+#include "overworld.h"
+#include "safari_zone.h"
+#include "script.h"
+#include "script_pokemon_80C4.h"
+#include "secret_base.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "constants/species.h"
+#include "starter_choose.h"
+#include "string_util.h"
+#include "strings.h"
+#include "task.h"
+#include "text.h"
+#include "trainer.h"
+
+extern u16 gSpecialVar_Result;
+
+extern void (*gFieldCallback)(void);
+
+EWRAM_DATA static u16 sTrainerBattleMode = 0;
+EWRAM_DATA u16 gTrainerBattleOpponent = 0;
+EWRAM_DATA static u16 sTrainerMapObjectLocalId = 0;
+EWRAM_DATA static u8 *sTrainerIntroSpeech = NULL;
+EWRAM_DATA static u8 *sTrainerDefeatSpeech = NULL;
+EWRAM_DATA static u8 *sTrainerVictorySpeech = NULL;
+EWRAM_DATA static u8 *sTrainerCannotBattleSpeech = NULL;
+EWRAM_DATA static u8 *sTrainerBattleScriptRetAddr = NULL;
+EWRAM_DATA static u8 *sTrainerBattleEndScript = NULL;
+
+extern u16 gBattleTypeFlags;
+extern u16 gSpecialVar_LastTalked;
+extern u8 gBattleOutcome;
+
+extern struct MapObject gMapObjects[];
+
+extern u8 gUnknown_0819F818[];
+extern u8 gUnknown_0819F840[];
+extern u8 gUnknown_0819F878[];
+extern u8 gUnknown_0819F887[];
+extern u8 gUnknown_0819F8AE[];
+
+extern u8 gUnknown_0819F80B[];
+extern u8 gUnknown_081C6C02[];
+
+// The first transition is used if the enemy pokemon are lower level than our pokemon.
+// Otherwise, the second transition is used.
+static const u8 gBattleTransitionTable_Wild[][2] =
+{
+ {B_TRANSITION_SLICE, B_TRANSITION_WHITEFADE}, // Normal
+ {B_TRANSITION_CLOCKWISE_BLACKFADE, B_TRANSITION_GRID_SQUARES}, // Cave
+ {B_TRANSITION_BLUR, B_TRANSITION_GRID_SQUARES}, // Cave with flash used
+ {B_TRANSITION_WAVE, B_TRANSITION_RIPPLE}, // Water
+};
+static const u8 gBattleTransitionTable_Trainer[][2] =
+{
+ {B_TRANSITION_POKEBALLS_TRAIL, B_TRANSITION_SHARDS}, // Normal
+ {B_TRANSITION_SHUFFLE, B_TRANSITION_BIG_POKEBALL}, // Cave
+ {B_TRANSITION_BLUR, B_TRANSITION_GRID_SQUARES}, // Cave with flash used
+ {B_TRANSITION_SWIRL, B_TRANSITION_RIPPLE}, // Water
+};
+
+enum
+{
+ TRAINER_PARAM_LOAD_VAL_8BIT,
+ TRAINER_PARAM_LOAD_VAL_16BIT,
+ TRAINER_PARAM_LOAD_VAL_32BIT,
+ TRAINER_PARAM_CLEAR_VAL_8BIT,
+ TRAINER_PARAM_CLEAR_VAL_16BIT,
+ TRAINER_PARAM_CLEAR_VAL_32BIT,
+ TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR,
+};
+
+struct TrainerBattleParameter
+{
+ void *varPtr;
+ u8 ptrType;
+};
+
+static const struct TrainerBattleParameter gTrainerBattleSpecs_0[] =
+{
+ {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT},
+ {&gTrainerBattleOpponent, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerMapObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerDefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
+ {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
+ {&sTrainerBattleEndScript, TRAINER_PARAM_CLEAR_VAL_32BIT},
+ {&sTrainerBattleScriptRetAddr, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR},
+};
+static const struct TrainerBattleParameter gTrainerBattleSpecs_1[] =
+{
+ {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT},
+ {&gTrainerBattleOpponent, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerMapObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerDefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
+ {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
+ {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerBattleScriptRetAddr, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR},
+};
+static const struct TrainerBattleParameter gTrainerBattleSpecs_2[] =
+{
+ {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT},
+ {&gTrainerBattleOpponent, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerMapObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerDefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
+ {&sTrainerCannotBattleSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerBattleEndScript, TRAINER_PARAM_CLEAR_VAL_32BIT},
+ {&sTrainerBattleScriptRetAddr, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR},
+};
+static const struct TrainerBattleParameter gTrainerBattleSpecs_3[] =
+{
+ {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT},
+ {&gTrainerBattleOpponent, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerMapObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerIntroSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
+ {&sTrainerDefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
+ {&sTrainerCannotBattleSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
+ {&sTrainerBattleEndScript, TRAINER_PARAM_CLEAR_VAL_32BIT},
+ {&sTrainerBattleScriptRetAddr, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR},
+};
+static const struct TrainerBattleParameter gTrainerBattleSpecs_4[] =
+{
+ {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT},
+ {&gTrainerBattleOpponent, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerMapObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT},
+ {&sTrainerIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerDefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT},
+ {&sTrainerCannotBattleSpeech, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_VAL_32BIT},
+ {&sTrainerBattleScriptRetAddr, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR},
+};
+
+const struct TrainerEyeTrainer gTrainerEyeTrainers[] =
+{
+ {
+ {OPPONENT_ROSE_1, OPPONENT_ROSE_2, OPPONENT_ROSE_3, OPPONENT_ROSE_4, OPPONENT_ROSE_5},
+ MAP_GROUP(ROUTE118),
+ MAP_NUM(ROUTE118),
+ },
+ {
+ {OPPONENT_DUSTY_1, OPPONENT_DUSTY_2, OPPONENT_DUSTY_3, OPPONENT_DUSTY_4, OPPONENT_DUSTY_5},
+ MAP_GROUP(ROUTE111),
+ MAP_NUM(ROUTE111),
+ },
+ {
+ {OPPONENT_LOLA_1, OPPONENT_LOLA_2, OPPONENT_LOLA_3, OPPONENT_LOLA_4, OPPONENT_LOLA_5},
+ MAP_GROUP(ROUTE109),
+ MAP_NUM(ROUTE109),
+ },
+ {
+ {OPPONENT_RICKY_1, OPPONENT_RICKY_2, OPPONENT_RICKY_3, OPPONENT_RICKY_4, OPPONENT_RICKY_5},
+ MAP_GROUP(ROUTE109),
+ MAP_NUM(ROUTE109),
+ },
+ {
+ {OPPONENT_RITA_AND_SAM_1, OPPONENT_RITA_AND_SAM_2, OPPONENT_RITA_AND_SAM_3, OPPONENT_RITA_AND_SAM_4, OPPONENT_RITA_AND_SAM_5},
+ MAP_GROUP(ROUTE124),
+ MAP_NUM(ROUTE124),
+ },
+ {
+ {OPPONENT_BROOKE_1, OPPONENT_BROOKE_2, OPPONENT_BROOKE_3, OPPONENT_BROOKE_4, OPPONENT_BROOKE_5},
+ MAP_GROUP(ROUTE111),
+ MAP_NUM(ROUTE111),
+ },
+ {
+ {OPPONENT_WILTON_1, OPPONENT_WILTON_2, OPPONENT_WILTON_3, OPPONENT_WILTON_4, OPPONENT_WILTON_5},
+ MAP_GROUP(ROUTE111),
+ MAP_NUM(ROUTE111),
+ },
+ {
+ {OPPONENT_VALERIE_1, OPPONENT_VALERIE_2, OPPONENT_VALERIE_3, OPPONENT_VALERIE_4, OPPONENT_VALERIE_5},
+ MAP_GROUP(MT_PYRE_6F),
+ MAP_NUM(MT_PYRE_6F),
+ },
+ {
+ {OPPONENT_CINDY_1, OPPONENT_CINDY_3, OPPONENT_CINDY_4, OPPONENT_CINDY_5, OPPONENT_CINDY_6},
+ MAP_GROUP(ROUTE104),
+ MAP_NUM(ROUTE104),
+ },
+ {
+ {OPPONENT_JESSICA_1, OPPONENT_JESSICA_2, OPPONENT_JESSICA_3, OPPONENT_JESSICA_4, OPPONENT_JESSICA_5},
+ MAP_GROUP(ROUTE121),
+ MAP_NUM(ROUTE121),
+ },
+ {
+ {OPPONENT_WINSTON_1, OPPONENT_WINSTON_2, OPPONENT_WINSTON_3, OPPONENT_WINSTON_4, OPPONENT_WINSTON_5},
+ MAP_GROUP(ROUTE104),
+ MAP_NUM(ROUTE104),
+ },
+ {
+ {OPPONENT_STEVE_1, OPPONENT_STEVE_2, OPPONENT_STEVE_3, OPPONENT_STEVE_4, OPPONENT_STEVE_5},
+ MAP_GROUP(ROUTE114),
+ MAP_NUM(ROUTE114),
+ },
+ {
+ {OPPONENT_TONY_1, OPPONENT_TONY_2, OPPONENT_TONY_3, OPPONENT_TONY_4, OPPONENT_TONY_5},
+ MAP_GROUP(ROUTE107),
+ MAP_NUM(ROUTE107),
+ },
+ {
+ {OPPONENT_NOB_1, OPPONENT_NOB_2, OPPONENT_NOB_3, OPPONENT_NOB_4, OPPONENT_NOB_5},
+ MAP_GROUP(ROUTE115),
+ MAP_NUM(ROUTE115),
+ },
+ {
+ {OPPONENT_DALTON_1, OPPONENT_DALTON_2, OPPONENT_DALTON_3, OPPONENT_DALTON_4, OPPONENT_DALTON_5},
+ MAP_GROUP(ROUTE118),
+ MAP_NUM(ROUTE118),
+ },
+ {
+ {OPPONENT_BERNIE_1, OPPONENT_BERNIE_2, OPPONENT_BERNIE_3, OPPONENT_BERNIE_4, OPPONENT_BERNIE_5},
+ MAP_GROUP(ROUTE114),
+ MAP_NUM(ROUTE114),
+ },
+ {
+ {OPPONENT_ETHAN_1, OPPONENT_ETHAN_2, OPPONENT_ETHAN_3, OPPONENT_ETHAN_4, OPPONENT_ETHAN_5},
+ MAP_GROUP(JAGGED_PASS),
+ MAP_NUM(JAGGED_PASS),
+ },
+ {
+ {OPPONENT_JOHN_AND_JAY_1, OPPONENT_JOHN_AND_JAY_2, OPPONENT_JOHN_AND_JAY_3, OPPONENT_JOHN_AND_JAY_4, OPPONENT_JOHN_AND_JAY_5},
+ MAP_GROUP(METEOR_FALLS_1F_2R),
+ MAP_NUM(METEOR_FALLS_1F_2R),
+ },
+ {
+ {OPPONENT_BRANDON_1, OPPONENT_BRANDON_2, OPPONENT_BRANDON_3, OPPONENT_BRANDON_4, OPPONENT_BRANDON_5},
+ MAP_GROUP(ROUTE120),
+ MAP_NUM(ROUTE120),
+ },
+ {
+ {OPPONENT_CAMERON_1, OPPONENT_CAMERON_2, OPPONENT_CAMERON_3, OPPONENT_CAMERON_4, OPPONENT_CAMERON_5},
+ MAP_GROUP(ROUTE123),
+ MAP_NUM(ROUTE123),
+ },
+ {
+ {OPPONENT_JACKI_1, OPPONENT_JACKI_2, OPPONENT_JACKI_3, OPPONENT_JACKI_4, OPPONENT_JACKI_5},
+ MAP_GROUP(ROUTE123),
+ MAP_NUM(ROUTE123),
+ },
+ {
+ {OPPONENT_WALTER_1, OPPONENT_WALTER_2, OPPONENT_WALTER_3, OPPONENT_WALTER_4, OPPONENT_WALTER_5},
+ MAP_GROUP(ROUTE121),
+ MAP_NUM(ROUTE121),
+ },
+ {
+ {OPPONENT_KAREN_1, OPPONENT_KAREN_2, OPPONENT_KAREN_3, OPPONENT_KAREN_4, OPPONENT_KAREN_5},
+ MAP_GROUP(ROUTE116),
+ MAP_NUM(ROUTE116),
+ },
+ {
+ {OPPONENT_JERRY_1, OPPONENT_JERRY_2, OPPONENT_JERRY_3, OPPONENT_JERRY_4, OPPONENT_JERRY_5},
+ MAP_GROUP(ROUTE116),
+ MAP_NUM(ROUTE116),
+ },
+ {
+ {OPPONENT_ANNA_AND_MEG_1, OPPONENT_ANNA_AND_MEG_2, OPPONENT_ANNA_AND_MEG_3, OPPONENT_ANNA_AND_MEG_4, OPPONENT_ANNA_AND_MEG_5},
+ MAP_GROUP(ROUTE117),
+ MAP_NUM(ROUTE117),
+ },
+ {
+ {OPPONENT_ISABEL_1, OPPONENT_ISABEL_2, OPPONENT_ISABEL_3, OPPONENT_ISABEL_4, OPPONENT_ISABEL_5},
+ MAP_GROUP(ROUTE110),
+ MAP_NUM(ROUTE110),
+ },
+ {
+ {OPPONENT_MIGUEL_1, OPPONENT_MIGUEL_2, OPPONENT_MIGUEL_3, OPPONENT_MIGUEL_4, OPPONENT_MIGUEL_5},
+ MAP_GROUP(ROUTE103),
+ MAP_NUM(ROUTE103),
+ },
+ {
+ {OPPONENT_TIMOTHY_1, OPPONENT_TIMOTHY_2, OPPONENT_TIMOTHY_3, OPPONENT_TIMOTHY_4, OPPONENT_TIMOTHY_5},
+ MAP_GROUP(ROUTE115),
+ MAP_NUM(ROUTE115),
+ },
+ {
+ {OPPONENT_SHELBY_1, OPPONENT_SHELBY_2, OPPONENT_SHELBY_3, OPPONENT_SHELBY_4, OPPONENT_SHELBY_5},
+ MAP_GROUP(MT_CHIMNEY),
+ MAP_NUM(MT_CHIMNEY),
+ },
+ {
+ {OPPONENT_CALVIN_1, OPPONENT_CALVIN_2, OPPONENT_CALVIN_3, OPPONENT_CALVIN_4, OPPONENT_CALVIN_5},
+ MAP_GROUP(ROUTE102),
+ MAP_NUM(ROUTE102),
+ },
+ {
+ {OPPONENT_ELLIOT_1, OPPONENT_ELLIOT_2, OPPONENT_ELLIOT_3, OPPONENT_ELLIOT_4, OPPONENT_ELLIOT_5},
+ MAP_GROUP(ROUTE106),
+ MAP_NUM(ROUTE106),
+ },
+ {
+ {OPPONENT_ABIGAIL_1, OPPONENT_ABIGAIL_2, OPPONENT_ABIGAIL_3, OPPONENT_ABIGAIL_4, OPPONENT_ABIGAIL_5},
+ MAP_GROUP(ROUTE110),
+ MAP_NUM(ROUTE110),
+ },
+ {
+ {OPPONENT_BENJAMIN_1, OPPONENT_BENJAMIN_2, OPPONENT_BENJAMIN_3, OPPONENT_BENJAMIN_4, OPPONENT_BENJAMIN_5},
+ MAP_GROUP(ROUTE110),
+ MAP_NUM(ROUTE110),
+ },
+ {
+ {OPPONENT_ISAIAH_1, OPPONENT_ISAIAH_2, OPPONENT_ISAIAH_3, OPPONENT_ISAIAH_4, OPPONENT_ISAIAH_5},
+ MAP_GROUP(ROUTE128),
+ MAP_NUM(ROUTE128),
+ },
+ {
+ {OPPONENT_KATELYN_1, OPPONENT_KATELYN_2, OPPONENT_KATELYN_3, OPPONENT_KATELYN_4, OPPONENT_KATELYN_5},
+ MAP_GROUP(ROUTE128),
+ MAP_NUM(ROUTE128),
+ },
+ {
+ {OPPONENT_MARIA_1, OPPONENT_MARIA_2, OPPONENT_MARIA_3, OPPONENT_MARIA_4, OPPONENT_MARIA_5},
+ MAP_GROUP(ROUTE117),
+ MAP_NUM(ROUTE117),
+ },
+ {
+ {OPPONENT_DYLAN_1, OPPONENT_DYLAN_2, OPPONENT_DYLAN_3, OPPONENT_DYLAN_4, OPPONENT_DYLAN_5},
+ MAP_GROUP(ROUTE117),
+ MAP_NUM(ROUTE117),
+ },
+ {
+ {OPPONENT_NICOLAS_1, OPPONENT_NICOLAS_2, OPPONENT_NICOLAS_3, OPPONENT_NICOLAS_4, OPPONENT_NICOLAS_5},
+ MAP_GROUP(METEOR_FALLS_1F_2R),
+ MAP_NUM(METEOR_FALLS_1F_2R),
+ },
+ {
+ {OPPONENT_ROBERT_1, OPPONENT_ROBERT_2, OPPONENT_ROBERT_3, OPPONENT_ROBERT_4, OPPONENT_ROBERT_5},
+ MAP_GROUP(ROUTE120),
+ MAP_NUM(ROUTE120),
+ },
+ {
+ {OPPONENT_LAO_1, OPPONENT_LAO_2, OPPONENT_LAO_3, OPPONENT_LAO_4, OPPONENT_LAO_5},
+ MAP_GROUP(ROUTE113),
+ MAP_NUM(ROUTE113),
+ },
+ {
+ {OPPONENT_CYNDY_1, OPPONENT_CYNDY_2, OPPONENT_CYNDY_3, OPPONENT_CYNDY_4, OPPONENT_CYNDY_5},
+ MAP_GROUP(ROUTE115),
+ MAP_NUM(ROUTE115),
+ },
+ {
+ {OPPONENT_MADELINE_1, OPPONENT_MADELINE_2, OPPONENT_MADELINE_3, OPPONENT_MADELINE_4, OPPONENT_MADELINE_5},
+ MAP_GROUP(ROUTE113),
+ MAP_NUM(ROUTE113),
+ },
+ {
+ {OPPONENT_JENNY_1, OPPONENT_JENNY_2, OPPONENT_JENNY_3, OPPONENT_JENNY_4, OPPONENT_JENNY_5},
+ MAP_GROUP(ROUTE124),
+ MAP_NUM(ROUTE124),
+ },
+ {
+ {OPPONENT_DIANA_1, OPPONENT_DIANA_2, OPPONENT_DIANA_3, OPPONENT_DIANA_4, OPPONENT_DIANA_5},
+ MAP_GROUP(JAGGED_PASS),
+ MAP_NUM(JAGGED_PASS),
+ },
+ {
+ {OPPONENT_AMY_AND_LIV_1, OPPONENT_AMY_AND_LIV_2, OPPONENT_AMY_AND_LIV_4, OPPONENT_AMY_AND_LIV_5, OPPONENT_AMY_AND_LIV_6},
+ MAP_GROUP(ROUTE103),
+ MAP_NUM(ROUTE103),
+ },
+ {
+ {OPPONENT_ERNEST_1, OPPONENT_ERNEST_2, OPPONENT_ERNEST_3, OPPONENT_ERNEST_4, OPPONENT_ERNEST_5},
+ MAP_GROUP(ROUTE125),
+ MAP_NUM(ROUTE125),
+ },
+ {
+ {OPPONENT_EDWIN_1, OPPONENT_EDWIN_2, OPPONENT_EDWIN_3, OPPONENT_EDWIN_4, OPPONENT_EDWIN_5},
+ MAP_GROUP(ROUTE110),
+ MAP_NUM(ROUTE110),
+ },
+ {
+ {OPPONENT_LYDIA_1, OPPONENT_LYDIA_2, OPPONENT_LYDIA_3, OPPONENT_LYDIA_4, OPPONENT_LYDIA_5},
+ MAP_GROUP(ROUTE117),
+ MAP_NUM(ROUTE117),
+ },
+ {
+ {OPPONENT_ISAAC_1, OPPONENT_ISAAC_2, OPPONENT_ISAAC_3, OPPONENT_ISAAC_4, OPPONENT_ISAAC_5},
+ MAP_GROUP(ROUTE117),
+ MAP_NUM(ROUTE117),
+ },
+ {
+ {OPPONENT_CATHERINE_1, OPPONENT_CATHERINE_2, OPPONENT_CATHERINE_3, OPPONENT_CATHERINE_4, OPPONENT_CATHERINE_5},
+ MAP_GROUP(ROUTE119),
+ MAP_NUM(ROUTE119),
+ },
+ {
+ {OPPONENT_JACKSON_1, OPPONENT_JACKSON_2, OPPONENT_JACKSON_3, OPPONENT_JACKSON_4, OPPONENT_JACKSON_5},
+ MAP_GROUP(ROUTE119),
+ MAP_NUM(ROUTE119),
+ },
+ {
+ {OPPONENT_HALEY_1, OPPONENT_HALEY_2, OPPONENT_HALEY_3, OPPONENT_HALEY_4, OPPONENT_HALEY_5},
+ MAP_GROUP(ROUTE104),
+ MAP_NUM(ROUTE104),
+ },
+ {
+ {OPPONENT_JAMES_1, OPPONENT_JAMES_2, OPPONENT_JAMES_3, OPPONENT_JAMES_4, OPPONENT_JAMES_5},
+ MAP_GROUP(PETALBURG_WOODS),
+ MAP_NUM(PETALBURG_WOODS),
+ },
+ {
+ {OPPONENT_TRENT_1, OPPONENT_TRENT_2, OPPONENT_TRENT_3, OPPONENT_TRENT_4, OPPONENT_TRENT_5},
+ MAP_GROUP(ROUTE112),
+ MAP_NUM(ROUTE112),
+ },
+ {
+ {OPPONENT_LOIS_AND_HAL_1, OPPONENT_LOIS_AND_HAL_2, OPPONENT_LOIS_AND_HAL_3, OPPONENT_LOIS_AND_HAL_4, OPPONENT_LOIS_AND_HAL_5},
+ MAP_GROUP(ABANDONED_SHIP_ROOMS2_1F),
+ MAP_NUM(ABANDONED_SHIP_ROOMS2_1F),
+ },
+ {
+ {OPPONENT_WALLY_3, OPPONENT_WALLY_4, OPPONENT_WALLY_5, OPPONENT_WALLY_6, OPPONENT_NONE},
+ MAP_GROUP(VICTORY_ROAD_1F),
+ MAP_NUM(VICTORY_ROAD_1F),
+ },
+};
+
+static const u16 sBadgeFlags[] =
+{
+ FLAG_BADGE01_GET,
+ FLAG_BADGE02_GET,
+ FLAG_BADGE03_GET,
+ FLAG_BADGE04_GET,
+ FLAG_BADGE05_GET,
+ FLAG_BADGE06_GET,
+ FLAG_BADGE07_GET,
+ FLAG_BADGE08_GET,
+};
+
+static void DoStandardWildBattle(void);
+static void DoSafariBattle(void);
+static void SetTrainerFlagsAfterTrainerEyeRematch(void);
+static void CB2_EndWildBattle(void);
+static void CB2_EndScriptedWildBattle(void);
+static u8 GetWildBattleTransition(void);
+static u8 GetTrainerBattleTransition(void);
+static void CB2_GiveStarter(void);
+static void CB2_StartFirstBattle(void);
+static void CB2_EndFirstBattle(void);
+static bool32 IsPlayerDefeated(u32 a1);
+
+#define tState data[0]
+#define tTransition data[1]
+
+static void Task_BattleStart(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ switch (tState)
+ {
+ case 0:
+ if (!FieldPoisonEffectIsRunning()) // is poison not active?
+ {
+ BattleTransition_StartOnField(tTransition);
+ tState++; // go to case 1.
+ }
+ break;
+ case 1:
+ if (IsBattleTransitionDone() == TRUE)
+ {
+ SetMainCallback2(sub_800E7C4);
+ prev_quest_postbuffer_cursor_backup_reset();
+ overworld_poison_timer_set();
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+static void CreateBattleStartTask(u8 transition, u16 song)
+{
+ u8 taskId = CreateTask(Task_BattleStart, 1);
+
+ gTasks[taskId].tTransition = transition;
+ current_map_music_set__default_for_battle(song);
+}
+
+#undef tState
+#undef tTransition
+
+void BattleSetup_StartWildBattle(void)
+{
+ if (GetSafariZoneFlag())
+ DoSafariBattle();
+ else
+ DoStandardWildBattle();
+}
+
+static void DoStandardWildBattle(void)
+{
+ ScriptContext2_Enable();
+ FreezeMapObjects();
+ sub_80597F4();
+ gMain.savedCallback = CB2_EndWildBattle;
+ gBattleTypeFlags = 0;
+ CreateBattleStartTask(GetWildBattleTransition(), 0);
+ IncrementGameStat(7);
+ IncrementGameStat(8);
+}
+
+void BattleSetup_StartRoamerBattle(void)
+{
+ ScriptContext2_Enable();
+ FreezeMapObjects();
+ sub_80597F4();
+ gMain.savedCallback = CB2_EndWildBattle;
+ gBattleTypeFlags = BATTLE_TYPE_ROAMER;
+ CreateBattleStartTask(GetWildBattleTransition(), 0);
+ IncrementGameStat(7);
+ IncrementGameStat(8);
+}
+
+static void DoSafariBattle(void)
+{
+ ScriptContext2_Enable();
+ FreezeMapObjects();
+ sub_80597F4();
+ gMain.savedCallback = sub_80C824C;
+ gBattleTypeFlags = BATTLE_TYPE_SAFARI;
+ CreateBattleStartTask(GetWildBattleTransition(), 0);
+}
+
+static void StartTheBattle(void)
+{
+ CreateBattleStartTask(GetTrainerBattleTransition(), 0);
+ IncrementGameStat(7);
+ IncrementGameStat(9);
+}
+
+//Initiates battle where Wally catches Ralts
+void ScrSpecial_StartWallyTutorialBattle(void)
+{
+ CreateMaleMon(&gEnemyParty[0], SPECIES_RALTS, 5);
+ ScriptContext2_Enable();
+ gMain.savedCallback = c2_exit_to_overworld_1_continue_scripts_restart_music;
+ gBattleTypeFlags = BATTLE_TYPE_WALLY_TUTORIAL;
+ CreateBattleStartTask(B_TRANSITION_SLICE, 0);
+}
+
+void BattleSetup_StartScriptedWildBattle(void)
+{
+ ScriptContext2_Enable();
+ gMain.savedCallback = CB2_EndScriptedWildBattle;
+ gBattleTypeFlags = 0;
+ CreateBattleStartTask(GetWildBattleTransition(), 0);
+ IncrementGameStat(7);
+ IncrementGameStat(8);
+}
+
+void ScrSpecial_StartSouthernIslandBattle(void)
+{
+ ScriptContext2_Enable();
+ gMain.savedCallback = CB2_EndScriptedWildBattle;
+ gBattleTypeFlags = BATTLE_TYPE_LEGENDARY;
+ CreateBattleStartTask(GetWildBattleTransition(), 0);
+ IncrementGameStat(7);
+ IncrementGameStat(8);
+}
+
+void ScrSpecial_StartRayquazaBattle(void)
+{
+ ScriptContext2_Enable();
+ gMain.savedCallback = CB2_EndScriptedWildBattle;
+ gBattleTypeFlags = BATTLE_TYPE_LEGENDARY;
+ CreateBattleStartTask(B_TRANSITION_BLUR, BGM_BATTLE34);
+ IncrementGameStat(7);
+ IncrementGameStat(8);
+}
+
+void ScrSpecial_StartGroudonKyogreBattle(void)
+{
+ ScriptContext2_Enable();
+ gMain.savedCallback = CB2_EndScriptedWildBattle;
+ gBattleTypeFlags = BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_KYOGRE_GROUDON;
+ if (gGameVersion == VERSION_RUBY)
+ CreateBattleStartTask(B_TRANSITION_SHARDS, BGM_BATTLE34); // GROUDON
+ else
+ CreateBattleStartTask(B_TRANSITION_RIPPLE, BGM_BATTLE34); // KYOGRE
+ IncrementGameStat(7);
+ IncrementGameStat(8);
+}
+
+void ScrSpecial_StartRegiBattle(void)
+{
+ ScriptContext2_Enable();
+ gMain.savedCallback = CB2_EndScriptedWildBattle;
+ gBattleTypeFlags = BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_REGI;
+ CreateBattleStartTask(B_TRANSITION_GRID_SQUARES, BGM_BATTLE36);
+ IncrementGameStat(7);
+ IncrementGameStat(8);
+}
+
+static void CB2_EndWildBattle(void)
+{
+ CpuFill16(0, (void *)BG_PLTT, BG_PLTT_SIZE);
+ ResetOamRange(0, 128);
+
+ if (IsPlayerDefeated(gBattleOutcome) == TRUE)
+ {
+ SetMainCallback2(CB2_WhiteOut);
+ }
+ else
+ {
+ SetMainCallback2(c2_exit_to_overworld_2_switch);
+ gFieldCallback = sub_8080E44;
+ }
+}
+
+void CB2_EndScriptedWildBattle(void)
+{
+ CpuFill16(0, (void *)BG_PLTT, BG_PLTT_SIZE);
+ ResetOamRange(0, 128);
+
+ if (IsPlayerDefeated(gBattleOutcome) == TRUE)
+ SetMainCallback2(CB2_WhiteOut);
+ else
+ SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music);
+}
+
+s8 BattleSetup_GetTerrain(void)
+{
+ u16 tileBehavior;
+ s16 x, y;
+
+ PlayerGetDestCoords(&x, &y);
+ tileBehavior = MapGridGetMetatileBehaviorAt(x, y);
+
+ if (MetatileBehavior_IsTallGrass(tileBehavior))
+ return BATTLE_TERRAIN_GRASS;
+ if (MetatileBehavior_IsLongGrass(tileBehavior))
+ return BATTLE_TERRAIN_LONG_GRASS;
+ if (MetatileBehavior_IsSandOrDeepSand(tileBehavior))
+ return BATTLE_TERRAIN_SAND;
+ switch (gMapHeader.mapType)
+ {
+ case MAP_TYPE_TOWN:
+ case MAP_TYPE_CITY:
+ case MAP_TYPE_ROUTE:
+ break;
+ case MAP_TYPE_UNDERGROUND:
+ if (sub_80574C4(tileBehavior))
+ return BATTLE_TERRAIN_BUILDING;
+ if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior))
+ return BATTLE_TERRAIN_POND;
+ return BATTLE_TERRAIN_CAVE;
+ case MAP_TYPE_INDOOR:
+ case MAP_TYPE_SECRET_BASE:
+ return BATTLE_TERRAIN_BUILDING;
+ case MAP_TYPE_UNDERWATER:
+ return BATTLE_TERRAIN_UNDERWATER;
+ case MAP_TYPE_6:
+ if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior))
+ return BATTLE_TERRAIN_WATER;
+ return BATTLE_TERRAIN_PLAIN;
+ }
+ if (sub_8057568(tileBehavior))
+ return BATTLE_TERRAIN_WATER;
+ if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior))
+ return BATTLE_TERRAIN_POND;
+ if (sub_80574D8(tileBehavior))
+ return BATTLE_TERRAIN_MOUNTAIN;
+ if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))
+ {
+ if (sub_8057450(tileBehavior))
+ return BATTLE_TERRAIN_POND;
+ if (MetatileBehavior_IsBridge(tileBehavior) == TRUE)
+ return BATTLE_TERRAIN_WATER;
+ }
+ if (gSaveBlock1.location.mapGroup == MAP_GROUP(ROUTE113) && gSaveBlock1.location.mapNum == MAP_NUM(ROUTE113))
+ return BATTLE_TERRAIN_SAND;
+ if (GetSav1Weather() == 8)
+ return BATTLE_TERRAIN_SAND;
+ return BATTLE_TERRAIN_PLAIN;
+}
+
+static s8 GetBattleTransitionTypeByMap(void)
+{
+ u16 tileBehavior;
+ s16 x, y;
+
+ PlayerGetDestCoords(&x, &y);
+ tileBehavior = MapGridGetMetatileBehaviorAt(x, y);
+ if (Overworld_GetFlashLevel())
+ return 2;
+ if (!MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior))
+ {
+ switch (gMapHeader.mapType)
+ {
+ case MAP_TYPE_UNDERGROUND:
+ return 1;
+ case MAP_TYPE_UNDERWATER:
+ return 3;
+ default:
+ return 0;
+ }
+ }
+ return 3;
+}
+
+static u16 GetSumOfPlayerPartyLevel(u8 numMons)
+{
+ u8 sum = 0;
+ int i;
+
+ for (i = 0; i < 6; i++)
+ {
+ u32 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
+
+ if (species != SPECIES_EGG && species != SPECIES_NONE && GetMonData(&gPlayerParty[i], MON_DATA_HP) != 0)
+ {
+ sum += GetMonData(&gPlayerParty[i], MON_DATA_LEVEL);
+ numMons--;
+ if (numMons == 0)
+ break;
+ }
+ }
+ return sum;
+}
+
+static u8 GetSumOfEnemyPartyLevel(u16 opponentId, u8 numMons)
+{
+ u8 i;
+ u8 sum;
+ u32 count = numMons;
+ void *party;
+
+ if (gTrainers[opponentId].partySize < count)
+ count = gTrainers[opponentId].partySize;
+
+ sum = 0;
+
+ switch (gTrainers[opponentId].partyFlags)
+ {
+ case 0:
+ party = gTrainers[opponentId].party;
+ for (i = 0; i < count; i++)
+ sum += ((struct TrainerPartyMember0 *)party)[i].level;
+ break;
+ case 1:
+ party = gTrainers[opponentId].party;
+ for (i = 0; i < count; i++)
+ sum += ((struct TrainerPartyMember1 *)party)[i].level;
+ break;
+ case 2:
+ party = gTrainers[opponentId].party;
+ for (i = 0; i < count; i++)
+ sum += ((struct TrainerPartyMember2 *)party)[i].level;
+ break;
+ case 3:
+ party = gTrainers[opponentId].party;
+ for (i = 0; i < count; i++)
+ sum += ((struct TrainerPartyMember3 *)party)[i].level;
+ break;
+ }
+
+ return sum;
+}
+
+static u8 GetWildBattleTransition(void)
+{
+ u8 transitionType = GetBattleTransitionTypeByMap();
+ u8 enemyLevel = GetMonData(&gEnemyParty[0], MON_DATA_LEVEL);
+ u8 playerLevel = GetSumOfPlayerPartyLevel(1);
+
+ if (enemyLevel < playerLevel)
+ return gBattleTransitionTable_Wild[transitionType][0];
+ else
+ return gBattleTransitionTable_Wild[transitionType][1];
+}
+
+static u8 GetTrainerBattleTransition(void)
+{
+ const struct Trainer *trainer;
+ u8 minPartyCount;
+ u8 transitionType;
+ u8 enemyLevel;
+ u8 playerLevel;
+
+ if (gTrainerBattleOpponent == SECRET_BASE_OPPONENT) // link battle?
+ return B_TRANSITION_STEVEN;
+
+ trainer = gTrainers;
+
+ if (trainer[gTrainerBattleOpponent].trainerClass == 24) // league?
+ {
+ if (gTrainerBattleOpponent == 261)
+ return B_TRANSITION_SYDNEY;
+ if (gTrainerBattleOpponent == 262)
+ return B_TRANSITION_PHOEBE;
+ if (gTrainerBattleOpponent == 263)
+ return B_TRANSITION_GLACIA;
+ if (gTrainerBattleOpponent == 264)
+ return B_TRANSITION_DRAKE;
+ return B_TRANSITION_STEVEN;
+ }
+
+ if (trainer[gTrainerBattleOpponent].trainerClass == 32) // team leader?
+ return B_TRANSITION_STEVEN;
+
+ if (trainer[gTrainerBattleOpponent].doubleBattle == TRUE)
+ minPartyCount = 2; // double battles always at least have 2 pokemon.
+ else
+ minPartyCount = 1;
+
+ transitionType = GetBattleTransitionTypeByMap();
+ enemyLevel = GetSumOfEnemyPartyLevel(gTrainerBattleOpponent, minPartyCount);
+ playerLevel = GetSumOfPlayerPartyLevel(minPartyCount);
+ if (enemyLevel < playerLevel) // is wild mon level than the player's mon level?
+ return gBattleTransitionTable_Trainer[transitionType][0];
+ else
+ return gBattleTransitionTable_Trainer[transitionType][1];
+}
+
+u8 BattleSetup_GetBattleTowerBattleTransition(void)
+{
+ u8 enemyLevel = GetMonData(&gEnemyParty[0], MON_DATA_LEVEL);
+ u8 playerLevel = GetSumOfPlayerPartyLevel(1);
+
+ if (enemyLevel < playerLevel)
+ return B_TRANSITION_POKEBALLS_TRAIL;
+ else
+ return B_TRANSITION_BIG_POKEBALL;
+}
+
+void ScrSpecial_ChooseStarter(void)
+{
+ SetMainCallback2(CB2_ChooseStarter);
+ gMain.savedCallback = CB2_GiveStarter;
+}
+
+static void CB2_GiveStarter(void)
+{
+ u16 starterPoke;
+
+ *GetVarPointer(VAR_STARTER_MON) = gSpecialVar_Result;
+ starterPoke = GetStarterPokemon(gSpecialVar_Result);
+ ScriptGiveMon(starterPoke, 5, 0, 0, 0, 0);
+ ResetTasks();
+ sub_80408BC();
+ SetMainCallback2(CB2_StartFirstBattle);
+ BattleTransition_Start(0);
+}
+
+static void CB2_StartFirstBattle(void)
+{
+ UpdatePaletteFade();
+ RunTasks();
+
+ if (IsBattleTransitionDone() == TRUE)
+ {
+ gBattleTypeFlags = BATTLE_TYPE_FIRST_BATTLE;
+ gMain.savedCallback = CB2_EndFirstBattle;
+ SetMainCallback2(sub_800E7C4);
+ prev_quest_postbuffer_cursor_backup_reset();
+ overworld_poison_timer_set();
+ IncrementGameStat(7);
+ IncrementGameStat(8);
+ }
+}
+
+static void CB2_EndFirstBattle(void)
+{
+ 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 T1_READ_32(ptr);
+}
+
+static u16 TrainerBattleLoadArg16(const u8 *ptr)
+{
+ return T1_READ_16(ptr);
+}
+
+static u8 TrainerBattleLoadArg8(const u8 *ptr)
+{
+ return T1_READ_8(ptr);
+}
+
+static u16 CurrentOpponentTrainerFlag(void)
+{
+ return TRAINER_FLAG_START + gTrainerBattleOpponent;
+}
+
+static bool32 IsPlayerDefeated(u32 battleOutcome)
+{
+ switch (battleOutcome)
+ {
+ case BATTLE_LOST:
+ case BATTLE_DREW:
+ return TRUE;
+ case BATTLE_WON:
+ case BATTLE_RAN:
+ case BATTLE_PLAYER_TELEPORTED:
+ case BATTLE_POKE_FLED:
+ case BATTLE_CAUGHT:
+ return FALSE;
+ default:
+ return FALSE;
+ }
+}
+
+static void ResetTrainerOpponentIds(void)
+{
+ sTrainerBattleMode = 0;
+ gTrainerBattleOpponent = 0;
+ sTrainerMapObjectLocalId = 0;
+ sTrainerIntroSpeech = 0;
+ sTrainerDefeatSpeech = 0;
+ sTrainerVictorySpeech = 0;
+ sTrainerCannotBattleSpeech = 0;
+ sTrainerBattleScriptRetAddr = 0;
+ sTrainerBattleEndScript = 0;
+}
+
+static void TrainerBattleLoadArgs(const struct TrainerBattleParameter *specs, const u8 *data)
+{
+ while (1)
+ {
+ switch (specs->ptrType)
+ {
+ case TRAINER_PARAM_LOAD_VAL_8BIT:
+ *(u8 *)specs->varPtr = TrainerBattleLoadArg8(data);
+ data += 1;
+ break;
+ case TRAINER_PARAM_LOAD_VAL_16BIT:
+ *(u16 *)specs->varPtr = TrainerBattleLoadArg16(data);
+ data += 2;
+ break;
+ case TRAINER_PARAM_LOAD_VAL_32BIT:
+ *(u32 *)specs->varPtr = TrainerBattleLoadArg32(data);
+ data += 4;
+ break;
+ case TRAINER_PARAM_CLEAR_VAL_8BIT:
+ *(u8 *)specs->varPtr = 0;
+ break;
+ case TRAINER_PARAM_CLEAR_VAL_16BIT:
+ *(u16 *)specs->varPtr = 0;
+ break;
+ case TRAINER_PARAM_CLEAR_VAL_32BIT:
+ *(u32 *)specs->varPtr = 0;
+ break;
+ case TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR:
+ *(const u8 **)specs->varPtr = data;
+ return;
+ }
+ specs++;
+ }
+}
+
+static void SetMapVarsToTrainer(void)
+{
+ if (sTrainerMapObjectLocalId)
+ {
+ gSpecialVar_LastTalked = sTrainerMapObjectLocalId;
+ gSelectedMapObject = GetFieldObjectIdByLocalIdAndMap(sTrainerMapObjectLocalId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup);
+ }
+}
+
+u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data)
+{
+ ResetTrainerOpponentIds();
+ sTrainerBattleMode = TrainerBattleLoadArg8(data);
+
+ switch (sTrainerBattleMode)
+ {
+ case 3:
+ TrainerBattleLoadArgs(gTrainerBattleSpecs_3, data);
+ return gUnknown_0819F878;
+ case 4:
+ TrainerBattleLoadArgs(gTrainerBattleSpecs_2, data);
+ SetMapVarsToTrainer();
+ return gUnknown_0819F840;
+ case 1:
+ case 2:
+ TrainerBattleLoadArgs(gTrainerBattleSpecs_1, data);
+ SetMapVarsToTrainer();
+ return gUnknown_0819F818;
+ case 6:
+ case 8:
+ TrainerBattleLoadArgs(gTrainerBattleSpecs_4, data);
+ SetMapVarsToTrainer();
+ return gUnknown_0819F840;
+ case 7:
+ TrainerBattleLoadArgs(gTrainerBattleSpecs_2, data);
+ SetMapVarsToTrainer();
+ gTrainerBattleOpponent = GetRematchTrainerId(gTrainerBattleOpponent);
+ return gUnknown_0819F8AE;
+ case 5:
+ TrainerBattleLoadArgs(gTrainerBattleSpecs_0, data);
+ SetMapVarsToTrainer();
+ gTrainerBattleOpponent = GetRematchTrainerId(gTrainerBattleOpponent);
+ return gUnknown_0819F887;
+ default:
+ TrainerBattleLoadArgs(gTrainerBattleSpecs_0, data);
+ SetMapVarsToTrainer();
+ return gUnknown_0819F818;
+ }
+}
+
+void TrainerWantsBattle(u8 trainerMapObjId, u8 *trainerScript)
+{
+ gSelectedMapObject = trainerMapObjId;
+ gSpecialVar_LastTalked = gMapObjects[trainerMapObjId].localId;
+ BattleSetup_ConfigureTrainerBattle(trainerScript + 1);
+ ScriptContext1_SetupScript(gUnknown_0819F80B);
+ ScriptContext2_Enable();
+}
+
+bool32 GetTrainerFlagFromScriptPointer(u8 *data)
+{
+ u32 flag = TrainerBattleLoadArg16(data + 2);
+ return FlagGet(TRAINER_FLAG_START + flag);
+}
+
+void sub_8082524(void)
+{
+ struct MapObject *mapObject = &gMapObjects[gSelectedMapObject];
+
+ npc_set_running_behaviour_etc(mapObject, npc_running_behaviour_by_direction(mapObject->mapobj_unk_18));
+}
+
+u8 ScrSpecial_GetTrainerBattleMode(void)
+{
+ return sTrainerBattleMode;
+}
+
+u8 ScrSpecial_HasTrainerBeenFought(void)
+{
+ return FlagGet(CurrentOpponentTrainerFlag());
+}
+
+void SetCurrentTrainerBattledFlag(void)
+{
+ FlagSet(CurrentOpponentTrainerFlag());
+}
+
+void unref_sub_8082590(void)
+{
+ FlagSet(CurrentOpponentTrainerFlag()); // duplicate function
+}
+
+u8 HasTrainerAlreadyBeenFought(u16 flag)
+{
+ return FlagGet(TRAINER_FLAG_START + flag);
+}
+
+void SetTrainerFlag(u16 flag)
+{
+ FlagSet(TRAINER_FLAG_START + flag);
+}
+
+void ClearTrainerFlag(u16 flag)
+{
+ FlagClear(TRAINER_FLAG_START + flag);
+}
+
+void BattleSetup_StartTrainerBattle(void)
+{
+ gBattleTypeFlags = BATTLE_TYPE_TRAINER;
+ gMain.savedCallback = CB2_EndTrainerBattle;
+ StartTheBattle();
+ ScriptContext1_Stop();
+}
+
+void CB2_EndTrainerBattle(void)
+{
+ if (gTrainerBattleOpponent == SECRET_BASE_OPPONENT)
+ {
+ SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); // link battle?
+ }
+ else if (IsPlayerDefeated(gBattleOutcome) == TRUE)
+ {
+ SetMainCallback2(CB2_WhiteOut);
+ }
+ else
+ {
+ SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music);
+ SetCurrentTrainerBattledFlag();
+ }
+}
+
+void CB2_EndTrainerEyeRematchBattle(void)
+{
+ if (gTrainerBattleOpponent == SECRET_BASE_OPPONENT)
+ {
+ SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); // link battle?
+ }
+ else if (IsPlayerDefeated(gBattleOutcome) == TRUE)
+ {
+ SetMainCallback2(CB2_WhiteOut);
+ }
+ else
+ {
+ SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music);
+ SetCurrentTrainerBattledFlag();
+ SetTrainerFlagsAfterTrainerEyeRematch();
+ }
+}
+
+void ScrSpecial_StartTrainerEyeRematch(void)
+{
+ gBattleTypeFlags = BATTLE_TYPE_TRAINER;
+ gMain.savedCallback = CB2_EndTrainerEyeRematchBattle;
+ StartTheBattle();
+ ScriptContext1_Stop();
+}
+
+static const u8 *GetTrainerIntroSpeech(void);
+static const u8 *GetTrainerNonBattlingSpeech(void);
+
+void ScrSpecial_ShowTrainerIntroSpeech(void)
+{
+ ShowFieldMessage(GetTrainerIntroSpeech());
+}
+
+u8 *BattleSetup_GetScriptAddrAfterBattle(void)
+{
+ if (sTrainerBattleScriptRetAddr)
+ return sTrainerBattleScriptRetAddr;
+ else
+ return gUnknown_081C6C02;
+}
+
+u8 *BattleSetup_GetTrainerPostBattleScript(void)
+{
+ if (sTrainerBattleEndScript)
+ return sTrainerBattleEndScript;
+ else
+ return gUnknown_081C6C02;
+}
+
+void ScrSpecial_ShowTrainerNonBattlingSpeech(void)
+{
+ ShowFieldMessage(GetTrainerNonBattlingSpeech());
+}
+
+void PlayTrainerEncounterMusic(void)
+{
+ u16 music;
+
+ if (sTrainerBattleMode != 1 && sTrainerBattleMode != 8)
+ {
+ switch (sub_803FC58(gTrainerBattleOpponent))
+ {
+ case TRAINER_ENCOUNTER_MUSIC_MALE:
+ music = BGM_BOYEYE;
+ break;
+ case TRAINER_ENCOUNTER_MUSIC_FEMALE:
+ music = BGM_GIRLEYE;
+ break;
+ case TRAINER_ENCOUNTER_MUSIC_GIRL:
+ music = BGM_SYOUJOEYE;
+ break;
+ case TRAINER_ENCOUNTER_MUSIC_INTENSE:
+ music = BGM_HAGESHII;
+ break;
+ case TRAINER_ENCOUNTER_MUSIC_COOL:
+ music = BGM_KAKKOII;
+ break;
+ case TRAINER_ENCOUNTER_MUSIC_AQUA:
+ music = BGM_AQA_0;
+ break;
+ case TRAINER_ENCOUNTER_MUSIC_MAGMA:
+ music = BGM_MGM0;
+ break;
+ case TRAINER_ENCOUNTER_MUSIC_SWIMMER:
+ music = BGM_SWIMEYE;
+ break;
+ case TRAINER_ENCOUNTER_MUSIC_TWINS:
+ music = BGM_HUTAGO;
+ break;
+ case TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR:
+ music = BGM_SITENNOU;
+ break;
+ case TRAINER_ENCOUNTER_MUSIC_HIKER:
+ music = BGM_YAMA_EYE;
+ break;
+ case TRAINER_ENCOUNTER_MUSIC_INTERVIEWER:
+ music = BGM_INTER_V;
+ break;
+ case TRAINER_ENCOUNTER_MUSIC_RICH:
+ music = BGM_TEST;
+ break;
+ default:
+ music = BGM_AYASII;
+ }
+ PlayNewMapMusic(music);
+ }
+}
+
+//Returns an empty string if a null pointer was passed, otherwise returns str
+static const u8 *SanitizeString(const u8 *str)
+{
+ if (str)
+ return str;
+ else
+ return gOtherText_CancelWithTerminator;
+}
+
+static const u8 *GetTrainerIntroSpeech(void)
+{
+ return SanitizeString(sTrainerIntroSpeech);
+}
+
+u8 *GetTrainerLoseText(void)
+{
+ const u8 *str;
+
+ if (gTrainerBattleOpponent == SECRET_BASE_OPPONENT)
+ str = GetSecretBaseTrainerLoseText();
+ else
+ str = sTrainerDefeatSpeech;
+
+ StringExpandPlaceholders(gStringVar4, SanitizeString(str));
+ return gStringVar4;
+}
+
+const u8 *unref_sub_808286C(void)
+{
+ return SanitizeString(sTrainerVictorySpeech);
+}
+
+static const u8 *GetTrainerNonBattlingSpeech(void)
+{
+ return SanitizeString(sTrainerCannotBattleSpeech);
+}
+
+s32 FirstBattleTrainerIdToRematchTableId(const struct TrainerEyeTrainer *trainers, u16 opponentId)
+{
+ s32 i;
+
+ for (i = 0; i < NUM_TRAINER_EYE_TRAINERS; i++)
+ {
+ if (trainers[i].opponentIDs[0] == opponentId)
+ return i;
+ }
+ return -1;
+}
+
+s32 TrainerIdToRematchTableId(const struct TrainerEyeTrainer *trainers, u16 opponentId)
+{
+ s32 i;
+ s32 j;
+
+ for (i = 0; i < NUM_TRAINER_EYE_TRAINERS; i++)
+ {
+ for (j = 0; j < 5 && trainers[i].opponentIDs[j] != 0; j++)
+ {
+ if (trainers[i].opponentIDs[j] == opponentId)
+ return i;
+ }
+ }
+ return -1;
+}
+
+bool32 UpdateRandomTrainerEyeRematches(const struct TrainerEyeTrainer *trainers, u16 mapGroup, u16 mapNum)
+{
+ int i;
+ bool32 ret = FALSE;
+
+ for (i = 0; i < NUM_TRAINER_EYE_TRAINERS; i++)
+ {
+ if (trainers[i].mapGroup == mapGroup && trainers[i].mapNum == mapNum)
+ {
+ if (gSaveBlock1.trainerRematches[i] != 0)
+ {
+ // Trainer already wants rematch. Don't bother updating it
+ ret = TRUE;
+ }
+ else if (HasTrainerAlreadyBeenFought(trainers[i].opponentIDs[0]) == TRUE
+ && (Random() % 100) <= 30) // 31% chance of getting a rematch
+ {
+ int rematches = 1;
+
+ while (rematches < 5 && trainers[i].opponentIDs[rematches] != 0
+ && HasTrainerAlreadyBeenFought(trainers[i].opponentIDs[rematches]))
+ rematches++;
+ gSaveBlock1.trainerRematches[i] = rematches;
+ ret = TRUE;
+ }
+ }
+ }
+ return ret;
+}
+
+s32 DoesSomeoneWantRematchIn_(const struct TrainerEyeTrainer *trainers, u16 mapGroup, u16 mapNum)
+{
+ s32 i;
+
+ for (i = 0; i < NUM_TRAINER_EYE_TRAINERS; i++)
+ {
+ if (trainers[i].mapGroup == mapGroup && trainers[i].mapNum == mapNum && gSaveBlock1.trainerRematches[i])
+ return 1;
+ }
+ return 0;
+}
+
+s32 IsRematchTrainerIn_(const struct TrainerEyeTrainer *trainers, u16 mapGroup, u16 mapNum)
+{
+ s32 i;
+
+ for (i = 0; i < NUM_TRAINER_EYE_TRAINERS; i++)
+ {
+ if (trainers[i].mapGroup == mapGroup && trainers[i].mapNum == mapNum)
+ return 1;
+ }
+ return 0;
+}
+
+bool8 IsFirstTrainerIdReadyForRematch(const struct TrainerEyeTrainer *trainers, u16 opponentId)
+{
+ s32 trainerEyeIndex = FirstBattleTrainerIdToRematchTableId(trainers, opponentId);
+
+ if (trainerEyeIndex != -1 && trainerEyeIndex < 100 && gSaveBlock1.trainerRematches[trainerEyeIndex])
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool8 GetTrainerEyeRematchFlag(const struct TrainerEyeTrainer *trainers, u16 opponentId)
+{
+ s32 trainerEyeIndex = TrainerIdToRematchTableId(trainers, opponentId);
+
+ if (trainerEyeIndex != -1 && trainerEyeIndex < 100 && gSaveBlock1.trainerRematches[trainerEyeIndex])
+ return TRUE;
+ else
+ return FALSE;
+}
+
+u16 GetRematchTrainerIdFromTable(const struct TrainerEyeTrainer *trainers, u16 opponentId)
+{
+ int i;
+ const struct TrainerEyeTrainer *trainer;
+ s32 trainerEyeIndex = FirstBattleTrainerIdToRematchTableId(trainers, opponentId);
+
+ if (trainerEyeIndex == -1)
+ return 0;
+ trainer = &trainers[trainerEyeIndex];
+ for (i = 1; i < 5; i++)
+ {
+ if (!trainer->opponentIDs[i])
+ return trainer->opponentIDs[i - 1];
+ if (!HasTrainerAlreadyBeenFought(trainer->opponentIDs[i]))
+ return trainer->opponentIDs[i];
+ }
+ return trainer->opponentIDs[4];
+}
+
+void ClearTrainerEyeRematchFlag(const struct TrainerEyeTrainer *trainers, u16 opponentId)
+{
+ s32 trainerEyeIndex = TrainerIdToRematchTableId(trainers, opponentId);
+
+ if (trainerEyeIndex != -1)
+ gSaveBlock1.trainerRematches[trainerEyeIndex] = 0;
+}
+
+bool8 WasSecondRematchWon(const struct TrainerEyeTrainer *trainers, u16 opponentId)
+{
+ s32 trainerEyeIndex = FirstBattleTrainerIdToRematchTableId(trainers, opponentId);
+
+ if (trainerEyeIndex != -1 && HasTrainerAlreadyBeenFought(trainers[trainerEyeIndex].opponentIDs[1]))
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool32 HasAtLeastFiveBadges(void)
+{
+ int badgeCount = 0;
+ u32 i;
+
+ for (i = 0; i < 8; i++)
+ {
+ if (FlagGet(sBadgeFlags[i]) == TRUE)
+ {
+ badgeCount++;
+ if (badgeCount >= 5)
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+void IncrementRematchStepCounter(void)
+{
+ if (HasAtLeastFiveBadges())
+ {
+ if (gSaveBlock1.trainerRematchStepCounter >= TRAINER_REMATCH_STEPS)
+ gSaveBlock1.trainerRematchStepCounter = TRAINER_REMATCH_STEPS;
+ else
+ gSaveBlock1.trainerRematchStepCounter++;
+ }
+}
+
+bool32 IsRematchStepCounterMaxed(void)
+{
+ if (HasAtLeastFiveBadges() && gSaveBlock1.trainerRematchStepCounter >= TRAINER_REMATCH_STEPS)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void TryUpdateRandomTrainerRematches(u16 mapGroup, u16 mapNum)
+{
+ if (IsRematchStepCounterMaxed() && UpdateRandomTrainerEyeRematches(gTrainerEyeTrainers, mapGroup, mapNum) == TRUE)
+ gSaveBlock1.trainerRematchStepCounter = 0;
+}
+
+s32 DoesSomeoneWantRematchIn(u16 mapGroup, u16 mapNum)
+{
+ return DoesSomeoneWantRematchIn_(gTrainerEyeTrainers, mapGroup, mapNum);
+}
+
+s32 IsRematchTrainerIn(u16 mapGroup, u16 mapNum)
+{
+ return IsRematchTrainerIn_(gTrainerEyeTrainers, mapGroup, mapNum);
+}
+
+u16 GetRematchTrainerId(u16 opponentId)
+{
+ return GetRematchTrainerIdFromTable(gTrainerEyeTrainers, opponentId);
+}
+
+bool8 ShouldTryRematchBattle(void)
+{
+ if (IsFirstTrainerIdReadyForRematch(gTrainerEyeTrainers, gTrainerBattleOpponent))
+ return 1;
+ else
+ return WasSecondRematchWon(gTrainerEyeTrainers, gTrainerBattleOpponent);
+}
+
+u8 ScrSpecial_GetTrainerEyeRematchFlag(void)
+{
+ return GetTrainerEyeRematchFlag(gTrainerEyeTrainers, gTrainerBattleOpponent);
+}
+
+void SetTrainerFlagsAfterTrainerEyeRematch(void)
+{
+ ClearTrainerEyeRematchFlag(gTrainerEyeTrainers, gTrainerBattleOpponent);
+ SetCurrentTrainerBattledFlag();
+}
diff --git a/src/battle_transition.c b/src/battle/battle_transition.c
index 1cacb8857..985f43945 100644
--- a/src/battle_transition.c
+++ b/src/battle/battle_transition.c
@@ -1,24 +1,24 @@
#include "global.h"
#include "battle_transition.h"
#include "main.h"
-#include "rom4.h"
+#include "overworld.h"
#include "task.h"
#include "palette.h"
#include "trig.h"
#include "field_effect.h"
-#include "rng.h"
+#include "random.h"
#include "sprite.h"
#include "sound.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "trainer.h"
#include "field_camera.h"
+#include "ewram.h"
+#include "unknown_task.h"
void sub_807DE10(void);
void dp12_8087EA4(void);
-extern u8 ewram[];
extern u16 gUnknown_03005560[];
-extern u16 gUnknown_03004DE0[][0x3C0];
extern const struct OamData gFieldOamData_32x32;
@@ -45,7 +45,6 @@ struct TransitionData
s16 data[11];
};
-#define TRANSITION_STRUCT (*(struct TransitionData *) (ewram + 0xC000))
typedef bool8 (*TransitionState)(struct Task* task);
typedef bool8 (*TransitionSpriteCallback)(struct Sprite* sprite);
@@ -530,13 +529,13 @@ static const u16 sMugshotsTilemap[] = INCBIN_U16("graphics/battle_transitions/el
// actual code starts here
-void sub_811AABC(u8 transitionID)
+void BattleTransition_StartOnField(u8 transitionID)
{
- gMain.callback2 = sub_8054398;
+ gMain.callback2 = CB2_OverworldBasic;
LaunchBattleTransitionTask(transitionID);
}
-void sub_811AAD8(u8 transitionID)
+void BattleTransition_Start(u8 transitionID)
{
LaunchBattleTransitionTask(transitionID);
}
@@ -994,10 +993,10 @@ static bool8 Phase2_Transition_PokeballsTrail_Func2(struct Task* task)
rand = Random() & 1;
for (i = 0; i <= 4; i++, rand ^= 1)
{
- gUnknown_0202FF84[0] = arr0[rand]; // x
- gUnknown_0202FF84[1] = (i * 32) + 16; // y
- gUnknown_0202FF84[2] = rand;
- gUnknown_0202FF84[3] = arr1[i];
+ gFieldEffectArguments[0] = arr0[rand]; // x
+ gFieldEffectArguments[1] = (i * 32) + 16; // y
+ gFieldEffectArguments[2] = rand;
+ gFieldEffectArguments[3] = arr1[i];
FieldEffectStart(FLDEFF_POKEBALL);
}
@@ -1017,14 +1016,14 @@ static bool8 Phase2_Transition_PokeballsTrail_Func3(struct Task* task)
bool8 FldEff_Pokeball(void)
{
- u8 spriteID = CreateSpriteAtEnd(&sSpriteTemplate_83FD98C, gUnknown_0202FF84[0], gUnknown_0202FF84[1], 0);
+ u8 spriteID = CreateSpriteAtEnd(&sSpriteTemplate_83FD98C, gFieldEffectArguments[0], gFieldEffectArguments[1], 0);
gSprites[spriteID].oam.priority = 0;
gSprites[spriteID].oam.affineMode = 1;
- gSprites[spriteID].data0 = gUnknown_0202FF84[2];
- gSprites[spriteID].data1 = gUnknown_0202FF84[3];
- gSprites[spriteID].data2 = -1;
+ gSprites[spriteID].data[0] = gFieldEffectArguments[2];
+ gSprites[spriteID].data[1] = gFieldEffectArguments[3];
+ gSprites[spriteID].data[2] = -1;
InitSpriteAffineAnim(&gSprites[spriteID]);
- StartSpriteAffineAnim(&gSprites[spriteID], gUnknown_0202FF84[2]);
+ StartSpriteAffineAnim(&gSprites[spriteID], gFieldEffectArguments[2]);
return FALSE;
}
@@ -1039,8 +1038,8 @@ static void sub_811B720(struct Sprite* sprite)
s16 arr0[2];
memcpy(arr0, sUnknown_083FD7F2, sizeof(sUnknown_083FD7F2));
- if (sprite->data1 != 0)
- sprite->data1--;
+ if (sprite->data[1] != 0)
+ sprite->data[1]--;
else
{
if (sprite->pos1.x >= 0 && sprite->pos1.x <= 240)
@@ -1048,12 +1047,12 @@ static void sub_811B720(struct Sprite* sprite)
s16 posX = sprite->pos1.x >> 3;
s16 posY = sprite->pos1.y >> 3;
- if (posX != sprite->data2)
+ if (posX != sprite->data[2])
{
u32 var;
u16 *ptr;
- sprite->data2 = posX;
+ sprite->data[2] = posX;
var = (((REG_BG0CNT >> 8) & 0x1F) << 11); // r2
ptr = (u16 *)(VRAM + var);
@@ -1063,7 +1062,7 @@ static void sub_811B720(struct Sprite* sprite)
SOME_VRAM_STORE(ptr, posY + 1, posX, 0xF001);
}
}
- sprite->pos1.x += arr0[sprite->data0];
+ sprite->pos1.x += arr0[sprite->data[0]];
if (sprite->pos1.x < -15 || sprite->pos1.x > 255)
FieldEffectStop(sprite, FLDEFF_POKEBALL);
}
@@ -1734,8 +1733,8 @@ static void Mugshots_CreateOpponentPlayerSprites(struct Task* task)
task->tMugshotOpponentID = CreateTrainerSprite(sMugshotsTrainerPicIDsTable[mugshotID],
sMugshotsOpponentCoords[mugshotID][0] - 32,
sMugshotsOpponentCoords[mugshotID][1] + 42,
- 0, &ewram[0xC03C]);
- task->tMugshotPlayerID = CreateTrainerSprite(gSaveBlock2.playerGender, 272, 106, 0, &ewram[0xC03C]);
+ 0, ewramC03C);
+ task->tMugshotPlayerID = CreateTrainerSprite(gSaveBlock2.playerGender, 272, 106, 0, ewramC03C);
opponentSprite = &gSprites[task->tMugshotOpponentID];
playerSprite = &gSprites[task->tMugshotPlayerID];
@@ -1764,7 +1763,7 @@ static void Mugshots_CreateOpponentPlayerSprites(struct Task* task)
static void sub_811C90C(struct Sprite* sprite)
{
- while (sUnknown_083FD880[sprite->data0](sprite));
+ while (sUnknown_083FD880[sprite->data[0]](sprite));
}
static bool8 sub_811C934(struct Sprite* sprite)
@@ -1780,57 +1779,57 @@ static bool8 sub_811C938(struct Sprite* sprite)
memcpy(arr0, sUnknown_083FD89C, sizeof(sUnknown_083FD89C));
memcpy(arr1, sUnknown_083FD8A0, sizeof(sUnknown_083FD8A0));
- sprite->data0++;
- sprite->data1 = arr0[sprite->data7];
- sprite->data2 = arr1[sprite->data7];
+ sprite->data[0]++;
+ sprite->data[1] = arr0[sprite->data[7]];
+ sprite->data[2] = arr1[sprite->data[7]];
return TRUE;
}
static bool8 sub_811C984(struct Sprite* sprite)
{
- sprite->pos1.x += sprite->data1;
- if (sprite->data7 && sprite->pos1.x < 133)
- sprite->data0++;
- else if (!sprite->data7 && sprite->pos1.x > 103)
- sprite->data0++;
+ sprite->pos1.x += sprite->data[1];
+ if (sprite->data[7] && sprite->pos1.x < 133)
+ sprite->data[0]++;
+ else if (!sprite->data[7] && sprite->pos1.x > 103)
+ sprite->data[0]++;
return FALSE;
}
static bool8 sub_811C9B8(struct Sprite* sprite)
{
- sprite->data1 += sprite->data2;
- sprite->pos1.x += sprite->data1;
- if (sprite->data1 == 0)
+ sprite->data[1] += sprite->data[2];
+ sprite->pos1.x += sprite->data[1];
+ if (sprite->data[1] == 0)
{
- sprite->data0++;
- sprite->data2 = -sprite->data2;
- sprite->data6 = 1;
+ sprite->data[0]++;
+ sprite->data[2] = -sprite->data[2];
+ sprite->data[6] = 1;
}
return FALSE;
}
static bool8 sub_811C9E4(struct Sprite* sprite)
{
- sprite->data1 += sprite->data2;
- sprite->pos1.x += sprite->data1;
+ sprite->data[1] += sprite->data[2];
+ sprite->pos1.x += sprite->data[1];
if (sprite->pos1.x < -31 || sprite->pos1.x > 271)
- sprite->data0++;
+ sprite->data[0]++;
return FALSE;
}
static void sub_811CA10(s16 spriteID, s16 value)
{
- gSprites[spriteID].data7 = value;
+ gSprites[spriteID].data[7] = value;
}
static void sub_811CA28(s16 spriteID)
{
- gSprites[spriteID].data0++;
+ gSprites[spriteID].data[0]++;
}
static s16 sub_811CA44(s16 spriteID)
{
- return gSprites[spriteID].data6;
+ return gSprites[spriteID].data[6];
}
#undef tMugshotOpponentID
@@ -1982,9 +1981,9 @@ static bool8 Phase2_Transition_WhiteFade_Func2(struct Task* task)
sprite = &gSprites[CreateInvisibleSprite(sub_811CFD0)];
sprite->pos1.x = 0xF0;
sprite->pos1.y = posY;
- sprite->data5 = arr1[i];
+ sprite->data[5] = arr1[i];
}
- sprite->data6++;
+ sprite->data[6]++;
task->tState++;
return FALSE;
@@ -2061,10 +2060,10 @@ static void HBlankCB_Phase2_Transition_WhiteFade(void)
static void sub_811CFD0(struct Sprite* sprite)
{
- if (sprite->data5)
+ if (sprite->data[5])
{
- sprite->data5--;
- if (sprite->data6)
+ sprite->data[5]--;
+ if (sprite->data[6])
TRANSITION_STRUCT.VBlank_DMA = 1;
}
else
@@ -2074,26 +2073,26 @@ static void sub_811CFD0(struct Sprite* sprite)
u16* ptr2 = &gUnknown_03004DE0[0][sprite->pos1.y + 160];
for (i = 0; i < 20; i++)
{
- ptr1[i] = sprite->data0 >> 8;
+ ptr1[i] = sprite->data[0] >> 8;
ptr2[i] = (u8)(sprite->pos1.x);
}
- if (sprite->pos1.x == 0 && sprite->data0 == 0x1000)
- sprite->data1 = 1;
+ if (sprite->pos1.x == 0 && sprite->data[0] == 0x1000)
+ sprite->data[1] = 1;
sprite->pos1.x -= 16;
- sprite->data0 += 0x80;
+ sprite->data[0] += 0x80;
if (sprite->pos1.x < 0)
sprite->pos1.x = 0;
- if (sprite->data0 > 0x1000)
- sprite->data0 = 0x1000;
+ if (sprite->data[0] > 0x1000)
+ sprite->data[0] = 0x1000;
- if (sprite->data6)
+ if (sprite->data[6])
TRANSITION_STRUCT.VBlank_DMA = 1;
- if (sprite->data1)
+ if (sprite->data[1])
{
- if (sprite->data6 == 0 || (TRANSITION_STRUCT.field_20 > 6 && sprite->data2++ > 7))
+ if (sprite->data[6] == 0 || (TRANSITION_STRUCT.field_20 > 6 && sprite->data[2]++ > 7))
{
TRANSITION_STRUCT.field_20++;
DestroySprite(sprite);
diff --git a/src/battle_3.c b/src/battle/battle_util.c
index f04e722c4..9dc030a1a 100644
--- a/src/battle_3.c
+++ b/src/battle/battle_util.c
@@ -1,18 +1,25 @@
#include "global.h"
-#include "abilities.h"
#include "battle.h"
-#include "moves.h"
+#include "battle_util.h"
+#include "data2.h"
+#include "event_data.h"
+#include "ewram.h"
#include "item.h"
-#include "items.h"
-#include "hold_effects.h"
-#include "species.h"
+#include "link.h"
#include "pokemon.h"
-#include "data2.h"
-#include "rng.h"
-#include "text.h"
-#include "battle_move_effects.h"
+#include "random.h"
+#include "rom_8077ABC.h"
#include "string_util.h"
-#include "flags.h"
+#include "text.h"
+#include "util.h"
+#include "constants/abilities.h"
+#include "constants/battle_move_effects.h"
+#include "constants/flags.h"
+#include "constants/hold_effects.h"
+#include "constants/items.h"
+#include "constants/moves.h"
+#include "constants/species.h"
+#include "constants/weather.h"
extern u8* gBattlescriptCurrInstr;
extern u8 gActiveBank;
@@ -30,7 +37,7 @@ extern u8 gNoOfAllBanks;
extern u32 gStatuses3[4];
extern u8 gBankAttacker;
extern u8 gBankTarget;
-extern u8 gTurnOrder[4];
+extern u8 gBanksByTurnOrder[4];
extern u16 gSideAffecting[2];
extern u16 gBattleWeather;
extern void (*gBattleMainFunc)(void);
@@ -47,7 +54,7 @@ extern u8 gTakenDmgBanks[4];
extern u8 gBattleMoveFlags;
extern u8 gLastUsedAbility;
extern u8 gBattleTextBuff2[];
-extern u8 gFightStateTracker;
+extern u8 gCurrentActionFuncId;
extern struct BattleEnigmaBerry gEnigmaBerries[4];
extern u8 gUnknown_02024BE5;
extern u8 gCurrMovePos;
@@ -55,6 +62,7 @@ extern u16 gRandomMove;
extern s32 gBattleMoveDamage;
extern u16 gDynamicBasePower;
extern u32 gBattleExecBuffer;
+extern u8 gSentPokesToOpponent[2];
extern const u16 gSoundMovesTable[];
extern const u8 gStatusConditionString_PoisonJpn[];
extern const u8 gStatusConditionString_SleepJpn[];
@@ -66,26 +74,20 @@ extern const u8 gStatusConditionString_LoveJpn[];
extern const BattleCmdFunc gBattleScriptingCommandsTable[];
u8 IsImprisoned(u8 bank, u16 move);
-u8 GetBankByPlayerAI(u8 ID);
+u8 GetBankByIdentity(u8 ID);
u8 GetBankIdentity(u8 bank);
u8 GetBankSide(u8 bank);
-void b_call_bc_move_exec(u8* BS_ptr);
-bool8 sub_8015660(u8 bank); //check if a move failed
void SetMoveEffect(bool8 primary, u8 certainArg);
bool8 UproarWakeUpCheck(u8 bank);
bool8 sub_8018018(u8 bank, u8, u8);
-void sub_8015740(u8 bank);
s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 a4, u16 powerOverride, u8 typeOverride, u8 bank_atk, u8 bank_def);
u8 CountTrailingZeroBits(u32 a);
u8 GetMoveTarget(u16 move, u8 useMoveTarget);
u8 sub_803FC34(u8 bank);
u16 sub_803FBFC(u8 a);
u8 weather_get_current(void);
-void b_push_move_exec(u8* BS_ptr);
void RecordAbilityBattle(u8 bank, u8 ability);
void RecordItemBattle(u8 bank, u8 holdEffect);
-void sub_8013F54(void);
-void sub_8013FBC(void);
s8 GetPokeFlavourRelation(u32 pid, u8 flavor);
extern u8 BattleScript_MoveSelectionDisabledMove[];
@@ -107,22 +109,22 @@ extern u8 BattleScript_WrapEnds[];
extern u8 BattleScript_DisabledNoMore[];
extern u8 BattleScript_EncoredNoMore[];
-extern u8 gUnknown_081D9030[];
-extern u8 gUnknown_081D8F62[];
-extern u8 gUnknown_081D8FFF[];
-extern u8 gUnknown_081D8F7D[];
-extern u8 gUnknown_081D9016[];
-extern u8 gUnknown_081D9008[];
-extern u8 gUnknown_081D9041[];
-extern u8 gUnknown_081D950F[]; //uproar wakeup BS
-extern u8 gUnknown_081D957E[]; //uproar BS
+extern u8 BattleScript_SideStatusWoreOff[];
+extern u8 BattleScript_RainContinuesOrEnds[];
+extern u8 BattleScript_SandStormHailEnds[];
+extern u8 BattleScript_DamagingWeatherContinues[];
+extern u8 BattleScript_SunlightFaded[];
+extern u8 BattleScript_SunlightContinues[];
+extern u8 BattleScript_SafeguardEnds[];
+extern u8 BattleScript_MonWokeUpInUproar[]; //uproar wakeup BS
+extern u8 BattleScript_PrintUproarOverTurns[]; //uproar BS
extern u8 BattleScript_ThrashConfuses[];
extern u8 BattleScript_YawnMakesAsleep[];
-extern u8 BattleScript_FutureSightHits[];
+extern u8 BattleScript_MonTookFutureAttack[];
extern u8 BattleScript_PerishSongHits[];
extern u8 BattleScript_PerishSongTimerGoesDown[];
-extern u8 gUnknown_081D8C72[];
-extern u8 gUnknown_081D8C7B[];
+extern u8 BattleScript_GiveExp[];
+extern u8 BattleScript_HandleFaintedMon[];
extern u8 BattleScript_MoveUsedIsAsleep[];
extern u8 BattleScript_MoveUsedWokeUp[];
@@ -143,7 +145,7 @@ extern u8 BattleScript_BideStoringEnergy[];
extern u8 BattleScript_BideAttack[];
extern u8 BattleScript_BideNoEnergyToAttack[];
-extern u8 gUnknown_081D901D[]; //load weather from overworld
+extern u8 BattleScript_OverworldWeatherStarts[]; //load weather from overworld
extern u8 BattleScript_DrizzleActivates[];
extern u8 BattleScript_SandstreamActivates[];
extern u8 BattleScript_DroughtActivates[];
@@ -162,7 +164,7 @@ extern u8 BattleScript_ColorChangeActivates[];
extern u8 BattleScript_RoughSkinActivates[];
extern u8 BattleScript_ApplySecondaryEffect[];
extern u8 BattleScript_CuteCharmActivates[];
-extern u8 gUnknown_081D9956[]; //ability status clear
+extern u8 BattleScript_AbilityCuredStatus[]; //ability status clear
extern u8 BattleScript_SynchronizeActivates[];
extern u8 gUnknown_081D978C[]; //intimidate1
extern u8 gUnknown_081D9795[]; //intimidate2
@@ -182,45 +184,292 @@ extern u8 BattleScript_BerryCureBrnEnd2[];
extern u8 BattleScript_BerryCureFrzEnd2[];
extern u8 BattleScript_BerryCureSlpEnd2[];
extern u8 BattleScript_BerryCureConfusionEnd2[];
-extern u8 gUnknown_081D9A44[]; //berry cure any status end2
+extern u8 BattleScript_BerryCureChosenStatusEnd2[]; //berry cure any status end2
extern u8 BattleScript_BerryCureParRet[];
extern u8 BattleScript_BerryCurePsnRet[];
extern u8 BattleScript_BerryCureBrnRet[];
extern u8 BattleScript_BerryCureFrzRet[];
extern u8 BattleScript_BerryCureSlpRet[];
extern u8 BattleScript_BerryCureConfusionRet[];
-extern u8 gUnknown_081D9A4A[]; //berry cure any status return
+extern u8 BattleScript_BerryCureChosenStatusRet[]; //berry cure any status return
extern u8 BattleScript_ItemHealHP_Ret[];
extern u8 gUnknown_081D995F[]; //disobedient while asleep
-extern u8 gUnknown_081D996F[]; //disobedient, uses a random move
-extern u8 gUnknown_081D9989[]; //disobedient, went to sleep
+extern u8 BattleScript_IgnoresAndUsesRandomMove[]; //disobedient, uses a random move
+extern u8 BattleScript_IgnoresAndFallsAsleep[]; //disobedient, went to sleep
extern u8 gUnknown_081D99A0[]; //disobedient, hits itself
-#define CHOICED_MOVE(bank)(((u16*)(&ewram[bank * 2 + 0x160e8])))
-
//array entries for battle communication
#define MOVE_EFFECT_BYTE 0x3
#define MULTISTRING_CHOOSER 0x5
#define MSG_DISPLAY 0x7
-void b_movescr_stack_push(u8* BS_ptr)
+u8 GetBattleBank(u8 caseId)
+{
+ u8 ret = 0;
+ switch (caseId)
+ {
+ case BS_GET_TARGET:
+ ret = gBankTarget;
+ break;
+ case BS_GET_ATTACKER:
+ ret = gBankAttacker;
+ break;
+ case BS_GET_EFFECT_BANK:
+ ret = gEffectBank;
+ break;
+ case BS_GET_BANK_0:
+ ret = 0;
+ break;
+ case BS_GET_SCRIPTING_BANK:
+ ret = ewram16003;
+ break;
+ case BS_GET_gBank1:
+ ret = gBank1;
+ break;
+ case 5:
+ ret = gBank1;
+ break;
+ }
+ return ret;
+}
+
+void PressurePPLose(u8 bankDef, u8 bankAtk, u16 move)
+{
+ s32 i;
+
+ if (gBattleMons[bankDef].ability != ABILITY_PRESSURE)
+ return;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (gBattleMons[bankAtk].moves[i] == move)
+ break;
+ }
+
+ if (i == 4) // mons don't share any moves
+ return;
+
+ if (gBattleMons[bankAtk].pp[i] != 0)
+ gBattleMons[bankAtk].pp[i]--;
+
+ if (!(gBattleMons[bankAtk].status2 & STATUS2_TRANSFORMED)
+ && !(gDisableStructs[bankAtk].unk18_b & gBitTable[i]))
+ {
+ gActiveBank = bankAtk;
+ EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + i, 0, 1, &gBattleMons[gActiveBank].pp[i]);
+ MarkBufferBankForExecution(gActiveBank);
+ }
+}
+
+void PressurePPLoseOnUsingImprision(u8 bankAtk)
+{
+ s32 i, j;
+ s32 imprisionPos = 4;
+ u8 atkSide = GetBankSide(bankAtk);
+
+ for (i = 0; i < gNoOfAllBanks; i++)
+ {
+ if (atkSide != GetBankSide(i) && gBattleMons[i].ability == ABILITY_PRESSURE)
+ {
+ for (j = 0; j < 4; j++)
+ {
+ if (gBattleMons[bankAtk].moves[j] == MOVE_IMPRISON)
+ break;
+ }
+ if (j != 4)
+ {
+ imprisionPos = j;
+ if (gBattleMons[bankAtk].pp[j] != 0)
+ gBattleMons[bankAtk].pp[j]--;
+ }
+ }
+ }
+
+ if (imprisionPos != 4
+ && !(gBattleMons[bankAtk].status2 & STATUS2_TRANSFORMED)
+ && !(gDisableStructs[bankAtk].unk18_b & gBitTable[imprisionPos]))
+ {
+ gActiveBank = bankAtk;
+ EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + imprisionPos, 0, 1, &gBattleMons[gActiveBank].pp[imprisionPos]);
+ MarkBufferBankForExecution(gActiveBank);
+ }
+}
+
+void PressurePPLoseOnUsingPerishSong(u8 bankAtk)
+{
+ s32 i, j;
+ s32 perishSongPos = 4;
+
+ for (i = 0; i < gNoOfAllBanks; i++)
+ {
+ if (gBattleMons[i].ability == ABILITY_PRESSURE && i != bankAtk)
+ {
+ for (j = 0; j < 4; j++)
+ {
+ if (gBattleMons[bankAtk].moves[j] == MOVE_PERISH_SONG)
+ break;
+ }
+ if (j != 4)
+ {
+ perishSongPos = j;
+ if (gBattleMons[bankAtk].pp[j] != 0)
+ gBattleMons[bankAtk].pp[j]--;
+ }
+ }
+ }
+
+ if (perishSongPos != 4
+ && !(gBattleMons[bankAtk].status2 & STATUS2_TRANSFORMED)
+ && !(gDisableStructs[bankAtk].unk18_b & gBitTable[perishSongPos]))
+ {
+ gActiveBank = bankAtk;
+ EmitSetMonData(0, REQUEST_PPMOVE1_BATTLE + perishSongPos, 0, 1, &gBattleMons[gActiveBank].pp[perishSongPos]);
+ MarkBufferBankForExecution(gActiveBank);
+ }
+}
+
+
+void MarkAllBufferBanksForExecution(void) // unused
+{
+ s32 i;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ {
+ for (i = 0; i < gNoOfAllBanks; i++)
+ gBattleExecBuffer |= gBitTable[i] << 0x1C;
+ }
+ else
+ {
+ for (i = 0; i < gNoOfAllBanks; i++)
+ gBattleExecBuffer |= gBitTable[i];
+ }
+}
+
+void MarkBufferBankForExecution(u8 bank)
+{
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ {
+ gBattleExecBuffer |= gBitTable[bank] << 0x1C;
+ }
+ else
+ {
+ gBattleExecBuffer |= gBitTable[bank];
+ }
+}
+
+void sub_80155A4(u8 arg0)
+{
+ s32 i;
+
+ for (i = 0; i < GetLinkPlayerCount(); i++)
+ gBattleExecBuffer |= gBitTable[arg0] << (i << 2);
+
+ gBattleExecBuffer &= ~(0x10000000 << arg0);
+}
+
+void CancelMultiTurnMoves(u8 bank)
+{
+ gBattleMons[bank].status2 &= ~(STATUS2_MULTIPLETURNS);
+ gBattleMons[bank].status2 &= ~(STATUS2_LOCK_CONFUSE);
+ gBattleMons[bank].status2 &= ~(STATUS2_UPROAR);
+ gBattleMons[bank].status2 &= ~(STATUS2_BIDE);
+
+ gStatuses3[bank] &= ~(STATUS3_SEMI_INVULNERABLE);
+
+ gDisableStructs[bank].rolloutTimer1 = 0;
+ gDisableStructs[bank].furyCutterCounter = 0;
+}
+
+bool8 WasUnableToUseMove(u8 bank)
+{
+ if (gProtectStructs[bank].prlzImmobility
+ || gProtectStructs[bank].notEffective
+ || gProtectStructs[bank].usedImprisionedMove
+ || gProtectStructs[bank].loveImmobility
+ || gProtectStructs[bank].usedDisabledMove
+ || gProtectStructs[bank].usedTauntedMove
+ || gProtectStructs[bank].flag2Unknown
+ || gProtectStructs[bank].flinchImmobility
+ || gProtectStructs[bank].confusionSelfDmg)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void PrepareStringBattle(u16 stringId, u8 bank)
+{
+ gActiveBank = bank;
+ EmitPrintString(0, stringId);
+ MarkBufferBankForExecution(gActiveBank);
+}
+
+void ResetSentPokesToOpponentValue(void)
+{
+ s32 i;
+ u32 bits = 0;
+
+ gSentPokesToOpponent[0] = 0;
+ gSentPokesToOpponent[1] = 0;
+
+ for (i = 0; i < gNoOfAllBanks; i += 2)
+ bits |= gBitTable[gBattlePartyID[i]];
+
+ for (i = 1; i < gNoOfAllBanks; i += 2)
+ gSentPokesToOpponent[(i & BIT_MON) >> 1] = bits;
+}
+
+void sub_8015740(u8 bank)
+{
+ s32 i = 0;
+ u32 bits = 0;
+
+ if (GetBankSide(bank) == SIDE_OPPONENT)
+ {
+ u8 id = ((bank & BIT_MON) >> 1);
+ gSentPokesToOpponent[id] = 0;
+
+ for (i = 0; i < gNoOfAllBanks; i += 2)
+ {
+ if (!(gAbsentBankFlags & gBitTable[i]))
+ bits |= gBitTable[gBattlePartyID[i]];
+ }
+
+ gSentPokesToOpponent[id] = bits;
+ }
+}
+
+void sub_80157C4(u8 bank)
+{
+ if (GetBankSide(bank) == SIDE_OPPONENT)
+ {
+ sub_8015740(bank);
+ }
+ else
+ {
+ s32 i;
+ for (i = 1; i < gNoOfAllBanks; i++)
+ gSentPokesToOpponent[(i & BIT_MON) >> 1] |= gBitTable[gBattlePartyID[bank]];
+ }
+}
+
+void BattleScriptPush(u8* BS_ptr)
{
B_BATTLESCRIPTS_STACK->ptr[B_BATTLESCRIPTS_STACK->size++] = BS_ptr;
}
-void b_movescr_stack_push_cursor(void)
+void BattleScriptPushCursor(void)
{
B_BATTLESCRIPTS_STACK->ptr[B_BATTLESCRIPTS_STACK->size++] = gBattlescriptCurrInstr;
}
-void b_movescr_stack_pop_cursor(void)
+void BattleScriptPop(void)
{
gBattlescriptCurrInstr = B_BATTLESCRIPTS_STACK->ptr[--B_BATTLESCRIPTS_STACK->size];
}
-u8 sub_8015894(void) //msg can't select a move
+u8 TrySetCantSelectMoveBattleScript(void) //msg can't select a move
{
u8 limitations = 0;
u16 move = gBattleMons[gActiveBank].moves[gBattleBufferB[gActiveBank][2]];
@@ -319,9 +568,9 @@ bool8 AreAllMovesUnusable(void)
gProtectStructs[gActiveBank].onlyStruggle = 1;
gUnknown_02024C1C[gActiveBank] = BattleScript_NoMovesLeft;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
- gBattleBufferB[gActiveBank][3] = GetBankByPlayerAI((GetBankIdentity(gActiveBank) ^ 1) | (Random() & 2));
+ gBattleBufferB[gActiveBank][3] = GetBankByIdentity((GetBankIdentity(gActiveBank) ^ 1) | (Random() & 2));
else
- gBattleBufferB[gActiveBank][3] = GetBankByPlayerAI(GetBankIdentity(gActiveBank) ^ 1);
+ gBattleBufferB[gActiveBank][3] = GetBankByIdentity(GetBankIdentity(gActiveBank) ^ 1);
}
else
gProtectStructs[gActiveBank].onlyStruggle = 0;
@@ -371,15 +620,15 @@ u8 UpdateTurnCounters(void)
case 0:
for (i = 0; i < gNoOfAllBanks; i++)
{
- gTurnOrder[i] = i;
+ gBanksByTurnOrder[i] = i;
}
for (i = 0; i < gNoOfAllBanks - 1; i++)
{
s32 j;
for (j = i + 1; j < gNoOfAllBanks; j++)
{
- if (b_first_side(gTurnOrder[i], gTurnOrder[j], 0))
- sub_8012FBC(i, j);
+ if (GetWhoStrikesFirst(gBanksByTurnOrder[i], gBanksByTurnOrder[j], 0))
+ SwapTurnOrder(i, j);
}
}
BATTLE_STRUCT->turncountersTracker++;
@@ -391,11 +640,11 @@ u8 UpdateTurnCounters(void)
if (gSideAffecting[sideBank] & SIDE_STATUS_REFLECT)
{
- if (--gSideTimer[sideBank].reflectTimer == 0)
+ if (--gSideTimers[sideBank].reflectTimer == 0)
{
gSideAffecting[sideBank] &= ~SIDE_STATUS_REFLECT;
- b_call_bc_move_exec(gUnknown_081D9030);
+ BattleScriptExecute(BattleScript_SideStatusWoreOff);
gBattleTextBuff1[0] = 0xFD;
gBattleTextBuff1[1] = 2;
gBattleTextBuff1[2] = MOVE_REFLECT;
@@ -420,10 +669,10 @@ u8 UpdateTurnCounters(void)
gActiveBank = gBankAttacker = sideBank = BATTLE_STRUCT->turnSideTracker;
if (gSideAffecting[sideBank] & SIDE_STATUS_LIGHTSCREEN)
{
- if (--gSideTimer[sideBank].lightscreenTimer == 0)
+ if (--gSideTimers[sideBank].lightscreenTimer == 0)
{
gSideAffecting[sideBank] &= ~SIDE_STATUS_LIGHTSCREEN;
- b_call_bc_move_exec(gUnknown_081D9030);
+ BattleScriptExecute(BattleScript_SideStatusWoreOff);
gBattleCommunication[MULTISTRING_CHOOSER] = sideBank;
gBattleTextBuff1[0] = 0xFD;
gBattleTextBuff1[1] = 2;
@@ -447,10 +696,10 @@ u8 UpdateTurnCounters(void)
while (BATTLE_STRUCT->turnSideTracker < 2)
{
gActiveBank = gBankAttacker = sideBank = BATTLE_STRUCT->turnSideTracker;
- if (gSideTimer[sideBank].mistTimer && --gSideTimer[sideBank].mistTimer == 0)
+ if (gSideTimers[sideBank].mistTimer && --gSideTimers[sideBank].mistTimer == 0)
{
gSideAffecting[sideBank] &= ~SIDE_STATUS_MIST;
- b_call_bc_move_exec(gUnknown_081D9030);
+ BattleScriptExecute(BattleScript_SideStatusWoreOff);
gBattleCommunication[MULTISTRING_CHOOSER] = sideBank;
gBattleTextBuff1[0] = 0xFD;
gBattleTextBuff1[1] = 2;
@@ -475,10 +724,10 @@ u8 UpdateTurnCounters(void)
gActiveBank = gBankAttacker = sideBank = BATTLE_STRUCT->turnSideTracker;
if (gSideAffecting[sideBank] & SIDE_STATUS_SAFEGUARD)
{
- if (--gSideTimer[sideBank].safeguardTimer == 0)
+ if (--gSideTimers[sideBank].safeguardTimer == 0)
{
gSideAffecting[sideBank] &= ~SIDE_STATUS_SAFEGUARD;
- b_call_bc_move_exec(gUnknown_081D9041);
+ BattleScriptExecute(BattleScript_SafeguardEnds);
effect++;
}
}
@@ -495,11 +744,11 @@ u8 UpdateTurnCounters(void)
case 5:
while (BATTLE_STRUCT->turnSideTracker < gNoOfAllBanks)
{
- gActiveBank = gTurnOrder[BATTLE_STRUCT->turnSideTracker];
+ gActiveBank = gBanksByTurnOrder[BATTLE_STRUCT->turnSideTracker];
if (gWishFutureKnock.wishCounter[gActiveBank] && --gWishFutureKnock.wishCounter[gActiveBank] == 0 && gBattleMons[gActiveBank].hp)
{
gBankTarget = gActiveBank;
- b_call_bc_move_exec(BattleScript_WishComesTrue);
+ BattleScriptExecute(BattleScript_WishComesTrue);
effect++;
}
BATTLE_STRUCT->turnSideTracker++;
@@ -531,7 +780,7 @@ u8 UpdateTurnCounters(void)
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
else
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
- b_call_bc_move_exec(gUnknown_081D8F62);
+ BattleScriptExecute(BattleScript_RainContinuesOrEnds);
effect++;
}
BATTLE_STRUCT->turncountersTracker++;
@@ -542,14 +791,14 @@ u8 UpdateTurnCounters(void)
if (!(gBattleWeather & WEATHER_SANDSTORM_PERMANENT) && --gWishFutureKnock.weatherDuration == 0)
{
gBattleWeather &= ~WEATHER_SANDSTORM_TEMPORARY;
- gBattlescriptCurrInstr = gUnknown_081D8FFF;
+ gBattlescriptCurrInstr = BattleScript_SandStormHailEnds;
}
else
- gBattlescriptCurrInstr = gUnknown_081D8F7D;
+ gBattlescriptCurrInstr = BattleScript_DamagingWeatherContinues;
- BATTLE_STRUCT->animArg1 = 0xC;
+ BATTLE_STRUCT->animArg1 = B_ANIM_SANDSTORM_CONTINUES;
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
- b_call_bc_move_exec(gBattlescriptCurrInstr);
+ BattleScriptExecute(gBattlescriptCurrInstr);
effect++;
}
BATTLE_STRUCT->turncountersTracker++;
@@ -560,12 +809,12 @@ u8 UpdateTurnCounters(void)
if (!(gBattleWeather & WEATHER_SUN_PERMANENT) && --gWishFutureKnock.weatherDuration == 0)
{
gBattleWeather &= ~WEATHER_SUN_TEMPORARY;
- gBattlescriptCurrInstr = gUnknown_081D9016;
+ gBattlescriptCurrInstr = BattleScript_SunlightFaded;
}
else
- gBattlescriptCurrInstr = gUnknown_081D9008;
+ gBattlescriptCurrInstr = BattleScript_SunlightContinues;
- b_call_bc_move_exec(gBattlescriptCurrInstr);
+ BattleScriptExecute(gBattlescriptCurrInstr);
effect++;
}
BATTLE_STRUCT->turncountersTracker++;
@@ -576,14 +825,14 @@ u8 UpdateTurnCounters(void)
if (--gWishFutureKnock.weatherDuration == 0)
{
gBattleWeather &= ~WEATHER_HAIL;
- gBattlescriptCurrInstr = gUnknown_081D8FFF;
+ gBattlescriptCurrInstr = BattleScript_SandStormHailEnds;
}
else
- gBattlescriptCurrInstr = gUnknown_081D8F7D;
+ gBattlescriptCurrInstr = BattleScript_DamagingWeatherContinues;
- BATTLE_STRUCT->animArg1 = 0xD;
+ BATTLE_STRUCT->animArg1 = B_ANIM_HAIL_CONTINUES;
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
- b_call_bc_move_exec(gBattlescriptCurrInstr);
+ BattleScriptExecute(gBattlescriptCurrInstr);
effect++;
}
BATTLE_STRUCT->turncountersTracker++;
@@ -605,7 +854,7 @@ u8 TurnBasedEffects(void)
gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_x20);
while (BATTLE_STRUCT->turnEffectsBank < gNoOfAllBanks && BATTLE_STRUCT->turnEffectsTracker <= TURNBASED_MAX_CASE)
{
- gActiveBank = gBankAttacker = gTurnOrder[BATTLE_STRUCT->turnEffectsBank];
+ gActiveBank = gBankAttacker = gBanksByTurnOrder[BATTLE_STRUCT->turnEffectsBank];
if (gAbsentBankFlags & gBitTable[gActiveBank])
{
BATTLE_STRUCT->turnEffectsBank++;
@@ -623,7 +872,7 @@ u8 TurnBasedEffects(void)
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
gBattleMoveDamage *= -1;
- b_call_bc_move_exec(BattleScript_IngrainTurnHeal);
+ BattleScriptExecute(BattleScript_IngrainTurnHeal);
effect++;
}
BATTLE_STRUCT->turnEffectsTracker++;
@@ -652,7 +901,7 @@ u8 TurnBasedEffects(void)
gBattleMoveDamage = 1;
BATTLE_STRUCT->animArg1 = gBankTarget;
BATTLE_STRUCT->animArg2 = gBankAttacker;
- b_call_bc_move_exec(BattleScript_LeechSeedTurnDrain);
+ BattleScriptExecute(BattleScript_LeechSeedTurnDrain);
effect++;
}
BATTLE_STRUCT->turnEffectsTracker++;
@@ -663,7 +912,7 @@ u8 TurnBasedEffects(void)
gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 8;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
- b_call_bc_move_exec(BattleScript_PoisonTurnDmg);
+ BattleScriptExecute(BattleScript_PoisonTurnDmg);
effect++;
}
BATTLE_STRUCT->turnEffectsTracker++;
@@ -677,7 +926,7 @@ u8 TurnBasedEffects(void)
if ((gBattleMons[gActiveBank].status1 & 0xF00) != 0xF00) //not 16 turns
gBattleMons[gActiveBank].status1 += 0x100;
gBattleMoveDamage *= (gBattleMons[gActiveBank].status1 & 0xF00) >> 8;
- b_call_bc_move_exec(BattleScript_PoisonTurnDmg);
+ BattleScriptExecute(BattleScript_PoisonTurnDmg);
effect++;
}
BATTLE_STRUCT->turnEffectsTracker++;
@@ -688,7 +937,7 @@ u8 TurnBasedEffects(void)
gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 8;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
- b_call_bc_move_exec(BattleScript_BurnTurnDmg);
+ BattleScriptExecute(BattleScript_BurnTurnDmg);
effect++;
}
BATTLE_STRUCT->turnEffectsTracker++;
@@ -700,7 +949,7 @@ u8 TurnBasedEffects(void)
gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 4;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
- b_call_bc_move_exec(BattleScript_NightmareTurnDmg);
+ BattleScriptExecute(BattleScript_NightmareTurnDmg);
effect++;
}
BATTLE_STRUCT->turnEffectsTracker++;
@@ -711,7 +960,7 @@ u8 TurnBasedEffects(void)
gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 4;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
- b_call_bc_move_exec(BattleScript_CurseTurnDmg);
+ BattleScriptExecute(BattleScript_CurseTurnDmg);
effect++;
}
BATTLE_STRUCT->turnEffectsTracker++;
@@ -722,12 +971,12 @@ u8 TurnBasedEffects(void)
gBattleMons[gActiveBank].status2 -= 0x2000;
if (gBattleMons[gActiveBank].status2 & STATUS2_WRAPPED) // damaged by wrap
{
- BATTLE_STRUCT->animArg1 = ewram[gActiveBank * 2 + 0x16004];
- BATTLE_STRUCT->animArg2 = ewram[gActiveBank * 2 + 0x16005];
+ BATTLE_STRUCT->animArg1 = ewram16004arr(0, gActiveBank);
+ BATTLE_STRUCT->animArg2 = ewram16004arr(1, gActiveBank);
gBattleTextBuff1[0] = 0xFD;
gBattleTextBuff1[1] = 2;
- gBattleTextBuff1[2] = ewram[gActiveBank * 2 + 0x16004];
- gBattleTextBuff1[3] = ewram[gActiveBank * 2 + 0x16005];
+ gBattleTextBuff1[2] = ewram16004arr(0, gActiveBank);
+ gBattleTextBuff1[3] = ewram16004arr(1, gActiveBank);
gBattleTextBuff1[4] = EOS;
gBattlescriptCurrInstr = BattleScript_WrapTurnDmg;
gBattleMoveDamage = gBattleMons[gActiveBank].maxHP / 16;
@@ -738,12 +987,12 @@ u8 TurnBasedEffects(void)
{
gBattleTextBuff1[0] = 0xFD;
gBattleTextBuff1[1] = 2;
- gBattleTextBuff1[2] = ewram[gActiveBank * 2 + 0x16004];
- gBattleTextBuff1[3] = ewram[gActiveBank * 2 + 0x16005];
+ gBattleTextBuff1[2] = ewram16004arr(0, gActiveBank);
+ gBattleTextBuff1[3] = ewram16004arr(1, gActiveBank);
gBattleTextBuff1[4] = EOS;
gBattlescriptCurrInstr = BattleScript_WrapEnds;
}
- b_call_bc_move_exec(gBattlescriptCurrInstr);
+ BattleScriptExecute(gBattlescriptCurrInstr);
effect++;
}
BATTLE_STRUCT->turnEffectsTracker++;
@@ -759,9 +1008,9 @@ u8 TurnBasedEffects(void)
gBattleMons[gBankAttacker].status1 &= ~(STATUS_SLEEP);
gBattleMons[gBankAttacker].status2 &= ~(STATUS2_NIGHTMARE);
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
- b_call_bc_move_exec(gUnknown_081D950F);
+ BattleScriptExecute(BattleScript_MonWokeUpInUproar);
gActiveBank = gBankAttacker;
- EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1);
+ EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1);
MarkBufferBankForExecution(gActiveBank);
break;
}
@@ -775,7 +1024,7 @@ u8 TurnBasedEffects(void)
{
gBankAttacker = gActiveBank;
gBattleMons[gActiveBank].status2 -= 0x10; // uproar timer goes down
- if (sub_8015660(gActiveBank))
+ if (WasUnableToUseMove(gActiveBank))
{
CancelMultiTurnMoves(gActiveBank);
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
@@ -790,7 +1039,7 @@ u8 TurnBasedEffects(void)
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
CancelMultiTurnMoves(gActiveBank);
}
- b_call_bc_move_exec(gUnknown_081D957E);
+ BattleScriptExecute(BattleScript_PrintUproarOverTurns);
effect = 1;
}
}
@@ -801,7 +1050,7 @@ u8 TurnBasedEffects(void)
if (gBattleMons[gActiveBank].status2 & STATUS2_LOCK_CONFUSE)
{
gBattleMons[gActiveBank].status2 -= 0x400;
- if (sub_8015660(gActiveBank))
+ if (WasUnableToUseMove(gActiveBank))
CancelMultiTurnMoves(gActiveBank);
else if (!(gBattleMons[gActiveBank].status2 & STATUS2_LOCK_CONFUSE)
&& (gBattleMons[gActiveBank].status2 & STATUS2_MULTIPLETURNS))
@@ -812,7 +1061,7 @@ u8 TurnBasedEffects(void)
gBattleCommunication[MOVE_EFFECT_BYTE] = 0x47;
SetMoveEffect(1, 0);
if (gBattleMons[gActiveBank].status2 & STATUS2_CONFUSION)
- b_call_bc_move_exec(BattleScript_ThrashConfuses);
+ BattleScriptExecute(BattleScript_ThrashConfuses);
effect++;
}
}
@@ -836,7 +1085,7 @@ u8 TurnBasedEffects(void)
else if (--gDisableStructs[gActiveBank].disableTimer1 == 0) // disable ends
{
gDisableStructs[gActiveBank].disabledMove = 0;
- b_call_bc_move_exec(BattleScript_DisabledNoMore);
+ BattleScriptExecute(BattleScript_DisabledNoMore);
effect++;
}
}
@@ -855,7 +1104,7 @@ u8 TurnBasedEffects(void)
{
gDisableStructs[gActiveBank].encoredMove = 0;
gDisableStructs[gActiveBank].encoreTimer1 = 0;
- b_call_bc_move_exec(BattleScript_EncoredNoMore);
+ BattleScriptExecute(BattleScript_EncoredNoMore);
effect++;
}
}
@@ -886,10 +1135,10 @@ u8 TurnBasedEffects(void)
{
CancelMultiTurnMoves(gActiveBank);
gBattleMons[gActiveBank].status1 |= (Random() & 3) + 2;
- EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1);
+ EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1);
MarkBufferBankForExecution(gActiveBank);
gEffectBank = gActiveBank;
- b_call_bc_move_exec(BattleScript_YawnMakesAsleep);
+ BattleScriptExecute(BattleScript_YawnMakesAsleep);
effect++;
}
}
@@ -908,7 +1157,7 @@ u8 TurnBasedEffects(void)
return 0;
}
-bool8 sub_80170DC(void) // handle future sight and perish song
+bool8 HandleWishPerishSongOnTurnEnd(void)
{
gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_x20);
switch (BATTLE_STRUCT->sub80170DC_Tracker)
@@ -937,7 +1186,7 @@ bool8 sub_80170DC(void) // handle future sight and perish song
gBankAttacker = gWishFutureKnock.futureSightAttacker[gActiveBank];
gBattleMoveDamage = gWishFutureKnock.futureSightDmg[gActiveBank];
gSpecialStatuses[gBankTarget].moveturnLostHP = 0xFFFF;
- b_call_bc_move_exec(BattleScript_FutureSightHits);
+ BattleScriptExecute(BattleScript_MonTookFutureAttack);
return 1;
}
}
@@ -947,7 +1196,7 @@ bool8 sub_80170DC(void) // handle future sight and perish song
case 1: // perish song
while (BATTLE_STRUCT->sub80170DC_Bank < gNoOfAllBanks)
{
- gActiveBank = gBankAttacker = gTurnOrder[BATTLE_STRUCT->sub80170DC_Bank];
+ gActiveBank = gBankAttacker = gBanksByTurnOrder[BATTLE_STRUCT->sub80170DC_Bank];
if (gAbsentBankFlags & gBitTable[gActiveBank])
BATTLE_STRUCT->sub80170DC_Bank++;
else
@@ -972,7 +1221,7 @@ bool8 sub_80170DC(void) // handle future sight and perish song
gDisableStructs[gActiveBank].perishSong1--;
gBattlescriptCurrInstr = BattleScript_PerishSongTimerGoesDown;
}
- b_call_bc_move_exec(gBattlescriptCurrInstr);
+ BattleScriptExecute(gBattlescriptCurrInstr);
return 1;
}
}
@@ -983,9 +1232,9 @@ bool8 sub_80170DC(void) // handle future sight and perish song
return 0;
}
-#define sub_80173A4_MAX_CASE 7
+#define HandleFaintedMonActions_MAX_CASE 7
-bool8 sub_80173A4(void)
+bool8 HandleFaintedMonActions(void)
{
if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
return 0;
@@ -1008,7 +1257,7 @@ bool8 sub_80173A4(void)
gBank1 = gBankTarget = BATTLE_STRUCT->unk1605A;
if (gBattleMons[BATTLE_STRUCT->unk1605A].hp == 0 && !(BATTLE_STRUCT->unk16113 & gBitTable[gBattlePartyID[BATTLE_STRUCT->unk1605A]]) && !(gAbsentBankFlags & gBitTable[BATTLE_STRUCT->unk1605A]))
{
- b_call_bc_move_exec(gUnknown_081D8C72);
+ BattleScriptExecute(BattleScript_GiveExp);
BATTLE_STRUCT->sub80173A4_Tracker = 2;
return 1;
}
@@ -1031,7 +1280,7 @@ bool8 sub_80173A4(void)
gBank1 = gBankTarget = BATTLE_STRUCT->unk1605A; //or should banks be switched?
if (gBattleMons[BATTLE_STRUCT->unk1605A].hp == 0 && !(gAbsentBankFlags & gBitTable[BATTLE_STRUCT->unk1605A]))
{
- b_call_bc_move_exec(gUnknown_081D8C7B);
+ BattleScriptExecute(BattleScript_HandleFaintedMon);
BATTLE_STRUCT->sub80173A4_Tracker = 5;
return 1;
}
@@ -1052,11 +1301,11 @@ bool8 sub_80173A4(void)
case 7:
break;
}
- } while (BATTLE_STRUCT->sub80173A4_Tracker != sub_80173A4_MAX_CASE);
+ } while (BATTLE_STRUCT->sub80173A4_Tracker != HandleFaintedMonActions_MAX_CASE);
return 0;
}
-void b_clear_atk_up_if_hit_flag_unless_enraged(void)
+void TryClearRageStatuses(void)
{
int i;
for (i = 0; i < gNoOfAllBanks; i++)
@@ -1088,7 +1337,7 @@ u8 AtkCanceller_UnableToUseMove(void)
{
gBattleMons[gBankAttacker].status1 &= ~(STATUS_SLEEP);
gBattleMons[gBankAttacker].status2 &= ~(STATUS2_NIGHTMARE);
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp;
effect = 2;
@@ -1116,7 +1365,7 @@ u8 AtkCanceller_UnableToUseMove(void)
else
{
gBattleMons[gBankAttacker].status2 &= ~(STATUS2_NIGHTMARE);
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp;
effect = 2;
@@ -1144,7 +1393,7 @@ u8 AtkCanceller_UnableToUseMove(void)
else // unfreeze
{
gBattleMons[gBankAttacker].status1 &= ~(STATUS_FREEZE);
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze;
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
}
@@ -1231,7 +1480,7 @@ u8 AtkCanceller_UnableToUseMove(void)
if (Random() & 1)
{
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
}
else // confusion dmg
{
@@ -1245,7 +1494,7 @@ u8 AtkCanceller_UnableToUseMove(void)
}
else // snapped out of confusion
{
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_MoveUsedIsConfusedNoMore;
}
effect = 1;
@@ -1268,10 +1517,10 @@ u8 AtkCanceller_UnableToUseMove(void)
{
BATTLE_STRUCT->scriptingActive = CountTrailingZeroBits((gBattleMons[gBankAttacker].status2 & STATUS2_INFATUATION) >> 0x10);
if (Random() & 1)
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
else
{
- b_movescr_stack_push(BattleScript_MoveUsedIsParalyzedCantAttack);
+ BattleScriptPush(BattleScript_MoveUsedIsParalyzedCantAttack);
gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;
gProtectStructs[gBankAttacker].loveImmobility = 1;
CancelMultiTurnMoves(gBankAttacker);
@@ -1312,7 +1561,7 @@ u8 AtkCanceller_UnableToUseMove(void)
if (gBattleMoves[gCurrentMove].effect == EFFECT_THAW_HIT)
{
gBattleMons[gBankAttacker].status1 &= ~(STATUS_FREEZE);
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze;
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
}
@@ -1329,7 +1578,7 @@ u8 AtkCanceller_UnableToUseMove(void)
if (effect == 2)
{
gActiveBank = gBankAttacker;
- EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1);
+ EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1);
MarkBufferBankForExecution(gActiveBank);
}
return effect;
@@ -1362,14 +1611,14 @@ bool8 sub_8018018(u8 bank, u8 r1, u8 r2)
{
if (GetBankSide(bank) == 1)
{
- r7 = GetBankByPlayerAI(1);
- r6 = GetBankByPlayerAI(3);
+ r7 = GetBankByIdentity(1);
+ r6 = GetBankByIdentity(3);
party = gEnemyParty;
}
else
{
- r7 = GetBankByPlayerAI(0);
- r6 = GetBankByPlayerAI(2);
+ r7 = GetBankByIdentity(0);
+ r6 = GetBankByIdentity(2);
party = gPlayerParty;
}
if (r1 == 6)
@@ -1378,7 +1627,7 @@ bool8 sub_8018018(u8 bank, u8 r1, u8 r2)
r2 = gBattlePartyID[r6];
for (i = 0; i < 6; i++)
{
- if (GetMonData(&party[i], MON_DATA_HP) && GetMonData(&party[i], MON_DATA_SPECIES2) && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG && i != r1 && i != r2 && i != ewram[r7 + 0x16068] && i != ewram[r6 + 0x16068])
+ if (GetMonData(&party[i], MON_DATA_HP) && GetMonData(&party[i], MON_DATA_SPECIES2) && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG && i != r1 && i != r2 && i != ewram16068arr(r7) && i != ewram16068arr(r6))
break;
}
return (i == 6);
@@ -1434,15 +1683,6 @@ u8 CastformDataTypeChange(u8 bank)
return formChange;
}
-#ifdef NONMATCHING
-
-struct Struct2017100
-{
- u32 arr[4];
-};
-
-#define ewram17100 (*(struct Struct2017100 *)(ewram + 0x17100))
-
u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
{
u8 effect = 0;
@@ -1475,13 +1715,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;
@@ -1511,31 +1749,31 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
//_08018586
switch (weather_get_current())
{
- case 3:
- case 5:
- case 13:
+ case WEATHER_RAIN_LIGHT:
+ case WEATHER_RAIN_MED:
+ case WEATHER_RAIN_HEAVY:
if (!(gBattleWeather & WEATHER_RAIN_ANY))
{
gBattleWeather = (WEATHER_RAIN_TEMPORARY | WEATHER_RAIN_PERMANENT);
- BATTLE_STRUCT->animArg1 = 0xA;
+ BATTLE_STRUCT->animArg1 = B_ANIM_RAIN_CONTINUES;
BATTLE_STRUCT->scriptingActive = bank;
effect++;
}
break;
- case 8:
+ case WEATHER_SANDSTORM:
if (!(gBattleWeather & WEATHER_SANDSTORM_ANY))
{
gBattleWeather = (WEATHER_SANDSTORM_PERMANENT | WEATHER_SANDSTORM_TEMPORARY);
- BATTLE_STRUCT->animArg1 = 0xC;
+ BATTLE_STRUCT->animArg1 = B_ANIM_SANDSTORM_CONTINUES;
BATTLE_STRUCT->scriptingActive = bank;
effect++;
}
break;
- case 12:
+ case WEATHER_DROUGHT:
if (!(gBattleWeather & WEATHER_SUN_ANY))
{
gBattleWeather = (WEATHER_SUN_PERMANENT | WEATHER_SUN_TEMPORARY);
- BATTLE_STRUCT->animArg1 = 0xB;
+ BATTLE_STRUCT->animArg1 = B_ANIM_SUN_CONTINUES;
BATTLE_STRUCT->scriptingActive = bank;
effect++;
}
@@ -1544,7 +1782,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
if (effect)
{
gBattleCommunication[MULTISTRING_CHOOSER] = weather_get_current();
- b_push_move_exec(gUnknown_081D901D);
+ BattleScriptPushCursorAndCallback(BattleScript_OverworldWeatherStarts);
}
break;
case ABILITY_DRIZZLE:
@@ -1552,7 +1790,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
if (!(gBattleWeather & WEATHER_RAIN_PERMANENT))
{
gBattleWeather = (WEATHER_RAIN_PERMANENT | WEATHER_RAIN_TEMPORARY);
- b_push_move_exec(BattleScript_DrizzleActivates);
+ BattleScriptPushCursorAndCallback(BattleScript_DrizzleActivates);
BATTLE_STRUCT->scriptingActive = bank;
effect++;
}
@@ -1562,7 +1800,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
if (!(gBattleWeather & WEATHER_SANDSTORM_PERMANENT))
{
gBattleWeather = (WEATHER_SANDSTORM_PERMANENT | WEATHER_SANDSTORM_TEMPORARY);
- b_push_move_exec(BattleScript_SandstreamActivates);
+ BattleScriptPushCursorAndCallback(BattleScript_SandstreamActivates);
BATTLE_STRUCT->scriptingActive = bank;
effect++;
}
@@ -1572,7 +1810,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
if (!(gBattleWeather & WEATHER_SUN_PERMANENT))
{
gBattleWeather = (WEATHER_SUN_PERMANENT | WEATHER_SUN_TEMPORARY);
- b_push_move_exec(BattleScript_DroughtActivates);
+ BattleScriptPushCursorAndCallback(BattleScript_DroughtActivates);
BATTLE_STRUCT->scriptingActive = bank;
effect++;
}
@@ -1590,7 +1828,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
effect = CastformDataTypeChange(bank);
if (effect != 0)
{
- b_push_move_exec(BattleScript_CastformChange);
+ BattleScriptPushCursorAndCallback(BattleScript_CastformChange);
BATTLE_STRUCT->scriptingActive = bank;
BATTLE_STRUCT->castformToChangeInto = effect - 1;
}
@@ -1607,17 +1845,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;
+ BattleScriptPushCursorAndCallback(BattleScript_CastformChange);
+ BATTLE_STRUCT->scriptingActive = target1;
BATTLE_STRUCT->castformToChangeInto = effect - 1;
break;
}
@@ -1637,8 +1872,8 @@ 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
- b_push_move_exec(BattleScript_RainDishActivates);
+ gLastUsedAbility = ABILITY_RAIN_DISH; // why
+ BattleScriptPushCursorAndCallback(BattleScript_RainDishActivates);
gBattleMoveDamage = gBattleMons[bank].maxHP / 16;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
@@ -1660,10 +1895,11 @@ 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);
+ BattleScriptPushCursorAndCallback(BattleScript_ShedSkinActivates);
+ EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[bank].status1);
MarkBufferBankForExecution(gActiveBank);
effect++;
}
@@ -1674,7 +1910,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
gBattleMons[bank].statStages[STAT_STAGE_SPEED]++;
BATTLE_STRUCT->animArg1 = 0x11;
BATTLE_STRUCT->animArg2 = 0;
- b_push_move_exec(BattleScript_SpeedBoostActivates);
+ BattleScriptPushCursorAndCallback(BattleScript_SpeedBoostActivates);
BATTLE_STRUCT->scriptingActive = bank;
effect++;
}
@@ -1732,14 +1968,14 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
case ABILITY_FLASH_FIRE:
if (moveType == TYPE_FIRE && !(gBattleMons[bank].status1 & STATUS_FREEZE))
{
- if (!(ewram17100.arr[bank] & 1))
+ if (!(eFlashFireArr.arr[bank] & 1))
{
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
if (gProtectStructs[gBankAttacker].notFirstStrike)
gBattlescriptCurrInstr = BattleScript_FlashFireBoost;
else
gBattlescriptCurrInstr = BattleScript_FlashFireBoost_PPLoss;
- ewram17100.arr[bank] |= 1;
+ eFlashFireArr.arr[bank] |= 1;
effect = 2;
}
else
@@ -1759,9 +1995,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
{
@@ -1793,7 +2029,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
gBattleTextBuff1[1] = 3;
gBattleTextBuff1[2] = moveType;
gBattleTextBuff1[3] = 0xFF;
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_ColorChangeActivates;
effect++;
}
@@ -1809,7 +2045,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
gBattleMoveDamage = gBattleMons[gBankAttacker].maxHP / 16;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_RoughSkinActivates;
effect++;
}
@@ -1830,7 +2066,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
if (gBattleCommunication[MOVE_EFFECT_BYTE] == 3)
gBattleCommunication[MOVE_EFFECT_BYTE] += 2;
gBattleCommunication[MOVE_EFFECT_BYTE] += 0x40;
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect;
gHitMarker |= HITMARKER_IGNORE_SAFEGUARD;
effect++;
@@ -1846,7 +2082,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
&& (Random() % 3) == 0)
{
gBattleCommunication[MOVE_EFFECT_BYTE] = 0x42;
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect;
gHitMarker |= HITMARKER_IGNORE_SAFEGUARD;
effect++;
@@ -1862,7 +2098,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
&& (Random() % 3) == 0)
{
gBattleCommunication[MOVE_EFFECT_BYTE] = 0x45;
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect;
gHitMarker |= HITMARKER_IGNORE_SAFEGUARD;
effect++;
@@ -1878,7 +2114,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
&& (Random() % 3) == 0)
{
gBattleCommunication[MOVE_EFFECT_BYTE] = 0x43;
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect;
gHitMarker |= HITMARKER_IGNORE_SAFEGUARD;
effect++;
@@ -1900,7 +2136,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
&& GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) != 0xFF)
{
gBattleMons[gBankAttacker].status2 |= (gBitTable[gBankTarget] << 0x10);
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_CuteCharmActivates;
effect++;
}
@@ -1910,27 +2146,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 +2173,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 +2207,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;
- EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1);
+ BattleScriptPushCursor();
+ gBattlescriptCurrInstr = BattleScript_AbilityCuredStatus;
+ BATTLE_STRUCT->scriptingActive = bank;
+ gActiveBank = bank;
+ EmitSetMonData(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;
+ BattleScriptPushCursorAndCallback(BattleScript_CastformChange);
+ BATTLE_STRUCT->scriptingActive = bank;
BATTLE_STRUCT->castformToChangeInto = effect - 1;
return effect;
}
}
}
- #undef i
}
break;
case ABILITYEFFECT_SYNCHRONIZE: // 7
@@ -2024,7 +2256,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
BATTLE_STRUCT->synchroniseEffect = 2;
gBattleCommunication[MOVE_EFFECT_BYTE] = BATTLE_STRUCT->synchroniseEffect + 0x40;
BATTLE_STRUCT->scriptingActive = gBankTarget;
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_SynchronizeActivates;
gHitMarker |= HITMARKER_IGNORE_SAFEGUARD;
effect++;
@@ -2040,7 +2272,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
BATTLE_STRUCT->synchroniseEffect = 2;
gBattleCommunication[MOVE_EFFECT_BYTE] = BATTLE_STRUCT->synchroniseEffect;
BATTLE_STRUCT->scriptingActive = gBankAttacker;
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_SynchronizeActivates;
gHitMarker |= HITMARKER_IGNORE_SAFEGUARD;
effect++;
@@ -2054,7 +2286,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
{
gLastUsedAbility = ABILITY_INTIMIDATE;
gStatuses3[i] &= ~(STATUS3_INTIMIDATE_POKES);
- b_push_move_exec(gUnknown_081D978C);
+ BattleScriptPushCursorAndCallback(gUnknown_081D978C);
BATTLE_STRUCT->intimidateBank = i;
effect++;
break;
@@ -2067,16 +2299,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 = GetBankByIdentity(side);
+ target2 = GetBankByIdentity(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 = GetBankByIdentity(((Random() & 1) * 2) | side);
gBattleMons[i].ability = gBattleMons[gActiveBank].ability;
gLastUsedAbility = gBattleMons[gActiveBank].ability;
effect++;
@@ -2111,7 +2344,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
if (effect)
{
- b_push_move_exec(BattleScript_TraceActivates);
+ BattleScriptPushCursorAndCallback(BattleScript_TraceActivates);
gStatuses3[i] &= ~(STATUS3_TRACE);
BATTLE_STRUCT->scriptingActive = i;
@@ -2138,7 +2371,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
{
gLastUsedAbility = ABILITY_INTIMIDATE;
gStatuses3[i] &= ~(STATUS3_INTIMIDATE_POKES);
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = gUnknown_081D9795;
BATTLE_STRUCT->intimidateBank = i;
effect++;
@@ -2266,3369 +2499,20 @@ 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)
+void BattleScriptExecute(u8* BS_ptr)
{
gBattlescriptCurrInstr = BS_ptr;
B_FUNCTION_STACK->ptr[B_FUNCTION_STACK->size++] = gBattleMainFunc;
- gBattleMainFunc = sub_8013F54;
- gFightStateTracker = 0;
+ gBattleMainFunc = RunBattleScriptCommands_PopCallbacksStack;
+ gCurrentActionFuncId = 0;
}
-void b_push_move_exec(u8* BS_ptr)
+void BattleScriptPushCursorAndCallback(u8* BS_ptr)
{
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BS_ptr;
B_FUNCTION_STACK->ptr[B_FUNCTION_STACK->size++] = gBattleMainFunc;
- gBattleMainFunc = sub_8013FBC;
+ gBattleMainFunc = RunBattleScriptCommands;
}
enum
@@ -5718,7 +2602,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
BATTLE_STRUCT->scriptingActive = bank;
gStringBank = bank;
gActiveBank = gBankAttacker = bank;
- b_call_bc_move_exec(BattleScript_WhiteHerbEnd2);
+ BattleScriptExecute(BattleScript_WhiteHerbEnd2);
}
break;
}
@@ -5735,7 +2619,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
if (gBattleMons[bank].hp + bankQuality > gBattleMons[bank].maxHP)
gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp;
gBattleMoveDamage *= -1;
- b_call_bc_move_exec(BattleScript_ItemHealHP_RemoveItem);
+ BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem);
effect = 4;
}
break;
@@ -5770,8 +2654,8 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
gBattleTextBuff1[2] = move;
gBattleTextBuff1[3] = move >> 8;
gBattleTextBuff1[4] = 0xFF;
- b_call_bc_move_exec(BattleScript_BerryPPHealEnd2);
- EmitSetAttributes(0, i + REQUEST_PPMOVE1_BATTLE, 0, 1, &changedPP);
+ BattleScriptExecute(BattleScript_BerryPPHealEnd2);
+ EmitSetMonData(0, i + REQUEST_PPMOVE1_BATTLE, 0, 1, &changedPP);
MarkBufferBankForExecution(gActiveBank);
effect = ITEM_PP_CHANGE;
}
@@ -5791,7 +2675,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
BATTLE_STRUCT->scriptingActive = bank;
gStringBank = bank;
gActiveBank = gBankAttacker = bank;
- b_call_bc_move_exec(BattleScript_WhiteHerbEnd2);
+ BattleScriptExecute(BattleScript_WhiteHerbEnd2);
}
break;
case HOLD_EFFECT_LEFTOVERS:
@@ -5803,7 +2687,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
if (gBattleMons[bank].hp + gBattleMoveDamage > gBattleMons[bank].maxHP)
gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp;
gBattleMoveDamage *= -1;
- b_call_bc_move_exec(BattleScript_ItemHealHP_End2);
+ BattleScriptExecute(BattleScript_ItemHealHP_End2);
effect = ITEM_HP_CHANGE;
RecordItemBattle(bank, bankHoldEffect);
}
@@ -5823,9 +2707,9 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp;
gBattleMoveDamage *= -1;
if (GetPokeFlavourRelation(gBattleMons[bank].personality, FLAVOR_SPICY) < 0)
- b_call_bc_move_exec(BattleScript_BerryConfuseHealEnd2);
+ BattleScriptExecute(BattleScript_BerryConfuseHealEnd2);
else
- b_call_bc_move_exec(BattleScript_ItemHealHP_RemoveItem);
+ BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem);
effect = ITEM_HP_CHANGE;
}
break;
@@ -5843,9 +2727,9 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp;
gBattleMoveDamage *= -1;
if (GetPokeFlavourRelation(gBattleMons[bank].personality, FLAVOR_DRY) < 0)
- b_call_bc_move_exec(BattleScript_BerryConfuseHealEnd2);
+ BattleScriptExecute(BattleScript_BerryConfuseHealEnd2);
else
- b_call_bc_move_exec(BattleScript_ItemHealHP_RemoveItem);
+ BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem);
effect = ITEM_HP_CHANGE;
}
break;
@@ -5863,9 +2747,9 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp;
gBattleMoveDamage *= -1;
if (GetPokeFlavourRelation(gBattleMons[bank].personality, FLAVOR_SWEET) < 0)
- b_call_bc_move_exec(BattleScript_BerryConfuseHealEnd2);
+ BattleScriptExecute(BattleScript_BerryConfuseHealEnd2);
else
- b_call_bc_move_exec(BattleScript_ItemHealHP_RemoveItem);
+ BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem);
effect = ITEM_HP_CHANGE;
}
break;
@@ -5883,9 +2767,9 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp;
gBattleMoveDamage *= -1;
if (GetPokeFlavourRelation(gBattleMons[bank].personality, FLAVOR_BITTER) < 0)
- b_call_bc_move_exec(BattleScript_BerryConfuseHealEnd2);
+ BattleScriptExecute(BattleScript_BerryConfuseHealEnd2);
else
- b_call_bc_move_exec(BattleScript_ItemHealHP_RemoveItem);
+ BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem);
effect = ITEM_HP_CHANGE;
}
break;
@@ -5903,9 +2787,9 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
gBattleMoveDamage = gBattleMons[bank].maxHP - gBattleMons[bank].hp;
gBattleMoveDamage *= -1;
if (GetPokeFlavourRelation(gBattleMons[bank].personality, FLAVOR_SOUR) < 0)
- b_call_bc_move_exec(BattleScript_BerryConfuseHealEnd2);
+ BattleScriptExecute(BattleScript_BerryConfuseHealEnd2);
else
- b_call_bc_move_exec(BattleScript_ItemHealHP_RemoveItem);
+ BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem);
effect = ITEM_HP_CHANGE;
}
break;
@@ -5928,7 +2812,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
BATTLE_STRUCT->statChanger = 0x10 + STAT_STAGE_ATK;
BATTLE_STRUCT->animArg1 = 0xE + STAT_STAGE_ATK;
BATTLE_STRUCT->animArg2 = 0;
- b_call_bc_move_exec(BattleScript_BerryStatRaiseEnd2);
+ BattleScriptExecute(BattleScript_BerryStatRaiseEnd2);
effect = ITEM_STATS_CHANGE;
}
break;
@@ -5944,7 +2828,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
BATTLE_STRUCT->statChanger = 0x10 + STAT_STAGE_DEF;
BATTLE_STRUCT->animArg1 = 0xE + STAT_STAGE_DEF;
BATTLE_STRUCT->animArg2 = 0;
- b_call_bc_move_exec(BattleScript_BerryStatRaiseEnd2);
+ BattleScriptExecute(BattleScript_BerryStatRaiseEnd2);
effect = ITEM_STATS_CHANGE;
}
break;
@@ -5960,7 +2844,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
BATTLE_STRUCT->statChanger = 0x10 + STAT_STAGE_SPEED;
BATTLE_STRUCT->animArg1 = 0xE + STAT_STAGE_SPEED;
BATTLE_STRUCT->animArg2 = 0;
- b_call_bc_move_exec(BattleScript_BerryStatRaiseEnd2);
+ BattleScriptExecute(BattleScript_BerryStatRaiseEnd2);
effect = ITEM_STATS_CHANGE;
}
break;
@@ -5976,7 +2860,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
BATTLE_STRUCT->statChanger = 0x10 + STAT_STAGE_SPATK;
BATTLE_STRUCT->animArg1 = 0xE + STAT_STAGE_SPATK;
BATTLE_STRUCT->animArg2 = 0;
- b_call_bc_move_exec(BattleScript_BerryStatRaiseEnd2);
+ BattleScriptExecute(BattleScript_BerryStatRaiseEnd2);
effect = ITEM_STATS_CHANGE;
}
break;
@@ -5992,7 +2876,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
BATTLE_STRUCT->statChanger = 0x10 + STAT_STAGE_SPDEF;
BATTLE_STRUCT->animArg1 = 0xE + STAT_STAGE_SPDEF;
BATTLE_STRUCT->animArg2 = 0;
- b_call_bc_move_exec(BattleScript_BerryStatRaiseEnd2);
+ BattleScriptExecute(BattleScript_BerryStatRaiseEnd2);
effect = ITEM_STATS_CHANGE;
}
break;
@@ -6000,7 +2884,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
if (gBattleMons[bank].hp <= gBattleMons[bank].maxHP / bankQuality && !moveTurn && !(gBattleMons[bank].status2 & STATUS2_FOCUS_ENERGY))
{
gBattleMons[bank].status2 |= STATUS2_FOCUS_ENERGY;
- b_call_bc_move_exec(BattleScript_BerryFocusEnergyEnd2);
+ BattleScriptExecute(BattleScript_BerryFocusEnergyEnd2);
effect = ITEM_EFFECT_OTHER;
}
break;
@@ -6037,7 +2921,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
BATTLE_STRUCT->statChanger = 0x21 + i;
BATTLE_STRUCT->animArg1 = 0x21 + i + 6;
BATTLE_STRUCT->animArg2 = 0;
- b_call_bc_move_exec(BattleScript_BerryStatRaiseEnd2);
+ BattleScriptExecute(BattleScript_BerryStatRaiseEnd2);
effect = ITEM_STATS_CHANGE;
}
}
@@ -6046,7 +2930,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
if (gBattleMons[bank].status1 & STATUS_PARALYSIS)
{
gBattleMons[bank].status1 &= ~(STATUS_PARALYSIS);
- b_call_bc_move_exec(BattleScript_BerryCurePrlzEnd2);
+ BattleScriptExecute(BattleScript_BerryCurePrlzEnd2);
effect = ITEM_STATUS_CHANGE;
}
break;
@@ -6054,7 +2938,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
if (gBattleMons[bank].status1 & STATUS_PSN_ANY)
{
gBattleMons[bank].status1 &= ~(STATUS_PSN_ANY | STATUS_TOXIC_COUNTER);
- b_call_bc_move_exec(BattleScript_BerryCurePsnEnd2);
+ BattleScriptExecute(BattleScript_BerryCurePsnEnd2);
effect = ITEM_STATUS_CHANGE;
}
break;
@@ -6062,7 +2946,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
if (gBattleMons[bank].status1 & STATUS_BURN)
{
gBattleMons[bank].status1 &= ~(STATUS_BURN);
- b_call_bc_move_exec(BattleScript_BerryCureBrnEnd2);
+ BattleScriptExecute(BattleScript_BerryCureBrnEnd2);
effect = ITEM_STATUS_CHANGE;
}
break;
@@ -6070,7 +2954,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
if (gBattleMons[bank].status1 & STATUS_FREEZE)
{
gBattleMons[bank].status1 &= ~(STATUS_FREEZE);
- b_call_bc_move_exec(BattleScript_BerryCureFrzEnd2);
+ BattleScriptExecute(BattleScript_BerryCureFrzEnd2);
effect = ITEM_STATUS_CHANGE;
}
break;
@@ -6079,7 +2963,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
{
gBattleMons[bank].status1 &= ~(STATUS_SLEEP);
gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE);
- b_call_bc_move_exec(BattleScript_BerryCureSlpEnd2);
+ BattleScriptExecute(BattleScript_BerryCureSlpEnd2);
effect = ITEM_STATUS_CHANGE;
}
break;
@@ -6087,7 +2971,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
if (gBattleMons[bank].status2 & STATUS2_CONFUSION)
{
gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION);
- b_call_bc_move_exec(BattleScript_BerryCureConfusionEnd2);
+ BattleScriptExecute(BattleScript_BerryCureConfusionEnd2);
effect = ITEM_EFFECT_OTHER;
}
break;
@@ -6132,7 +3016,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
gBattleMons[bank].status1 = 0;
gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION);
- b_call_bc_move_exec(gUnknown_081D9A44);
+ BattleScriptExecute(BattleScript_BerryCureChosenStatusEnd2);
effect = ITEM_STATUS_CHANGE;
}
break;
@@ -6141,7 +3025,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
{
gBattleMons[bank].status2 &= ~(STATUS2_INFATUATION);
StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn);
- b_call_bc_move_exec(gUnknown_081D9A44);
+ BattleScriptExecute(BattleScript_BerryCureChosenStatusEnd2);
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
effect = ITEM_EFFECT_OTHER;
}
@@ -6155,7 +3039,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
switch (effect)
{
case ITEM_STATUS_CHANGE:
- EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[bank].status1);
+ EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[bank].status1);
MarkBufferBankForExecution(gActiveBank);
break;
case ITEM_PP_CHANGE:
@@ -6188,7 +3072,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
if (gBattleMons[bank].status1 & STATUS_PARALYSIS)
{
gBattleMons[bank].status1 &= ~(STATUS_PARALYSIS);
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_BerryCureParRet;
effect = ITEM_STATUS_CHANGE;
}
@@ -6197,7 +3081,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
if (gBattleMons[bank].status1 & STATUS_PSN_ANY)
{
gBattleMons[bank].status1 &= ~(STATUS_PSN_ANY | STATUS_TOXIC_COUNTER);
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_BerryCurePsnRet;
effect = ITEM_STATUS_CHANGE;
}
@@ -6206,7 +3090,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
if (gBattleMons[bank].status1 & STATUS_BURN)
{
gBattleMons[bank].status1 &= ~(STATUS_BURN);
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_BerryCureBrnRet;
effect = ITEM_STATUS_CHANGE;
}
@@ -6215,7 +3099,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
if (gBattleMons[bank].status1 & STATUS_FREEZE)
{
gBattleMons[bank].status1 &= ~(STATUS_FREEZE);
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_BerryCureFrzRet;
effect = ITEM_STATUS_CHANGE;
}
@@ -6225,7 +3109,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
{
gBattleMons[bank].status1 &= ~(STATUS_SLEEP);
gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE);
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_BerryCureSlpRet;
effect = ITEM_STATUS_CHANGE;
}
@@ -6234,7 +3118,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
if (gBattleMons[bank].status2 & STATUS2_CONFUSION)
{
gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION);
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_BerryCureConfusionRet;
effect = ITEM_EFFECT_OTHER;
}
@@ -6244,9 +3128,9 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
{
gBattleMons[bank].status2 &= ~(STATUS2_INFATUATION);
StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn);
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
- gBattlescriptCurrInstr = gUnknown_081D9A4A;
+ gBattlescriptCurrInstr = BattleScript_BerryCureChosenStatusRet;
effect = ITEM_EFFECT_OTHER;
}
break;
@@ -6280,9 +3164,9 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
}
gBattleMons[bank].status1 = 0;
gBattleMons[bank].status2 &= ~(STATUS2_CONFUSION);
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
- gBattlescriptCurrInstr = gUnknown_081D9A4A;
+ gBattlescriptCurrInstr = BattleScript_BerryCureChosenStatusRet;
effect = ITEM_STATUS_CHANGE;
}
break;
@@ -6299,7 +3183,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
{
BATTLE_STRUCT->scriptingActive = bank;
gStringBank = bank;
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_WhiteHerbRet;
return effect; // unnecessary return
}
@@ -6310,7 +3194,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
BATTLE_STRUCT->scriptingActive = bank;
gStringBank = bank;
gActiveBank = bank;
- EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1);
+ EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1);
MarkBufferBankForExecution(gActiveBank);
break;
}
@@ -6329,9 +3213,9 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
&& gBattleMons[gBankTarget].hp)
{
gBattleCommunication[MOVE_EFFECT_BYTE] = 8;
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
SetMoveEffect(0, 0);
- b_movescr_stack_pop_cursor();
+ BattleScriptPop();
}
break;
case HOLD_EFFECT_SHELL_BELL:
@@ -6349,7 +3233,7 @@ u8 ItemBattleEffects(u8 caseID, u8 bank, bool8 moveTurn)
if (gBattleMoveDamage == 0)
gBattleMoveDamage = -1;
gSpecialStatuses[gBankTarget].moveturnLostHP = 0;
- b_movescr_stack_push_cursor();
+ BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_ItemHealHP_Ret;
effect++;
}
@@ -6392,14 +3276,14 @@ void unref_sub_801B40C(void)
{
if (sCombinedMoves[i].move1 == gChosenMovesByBanks[bank] && sCombinedMoves[i].move2 == gChosenMovesByBanks[bank + 2])
{
- gSideTimer[GetBankIdentity(bank) & 1].field3 = (bank) | ((bank + 2) << 4);
- gSideTimer[GetBankIdentity(bank) & 1].field4 = sCombinedMoves[i].newMove;
+ gSideTimers[GetBankIdentity(bank) & 1].field3 = (bank) | ((bank + 2) << 4);
+ gSideTimers[GetBankIdentity(bank) & 1].field4 = sCombinedMoves[i].newMove;
gSideAffecting[GetBankIdentity(bank) & 1] |= SIDE_STATUS_X4;
}
if (sCombinedMoves[i].move1 == gChosenMovesByBanks[bank + 2] && sCombinedMoves[i].move2 == gChosenMovesByBanks[bank])
{
- gSideTimer[GetBankIdentity(bank) & 1].field3 = (bank + 2) | ((bank) << 4);
- gSideTimer[GetBankIdentity(bank) & 1].field4 = sCombinedMoves[i].newMove;
+ gSideTimers[GetBankIdentity(bank) & 1].field3 = (bank + 2) | ((bank) << 4);
+ gSideTimers[GetBankIdentity(bank) & 1].field4 = sCombinedMoves[i].newMove;
gSideAffecting[GetBankIdentity(bank) & 1] |= SIDE_STATUS_X4;
}
bank++;
@@ -6431,8 +3315,8 @@ u8 GetMoveTarget(u16 move, u8 useMoveTarget) //get move target
{
case 0:
side = GetBankSide(gBankAttacker) ^ 1;
- if (gSideTimer[side].followmeTimer && gBattleMons[gSideTimer[side].followmeTarget].hp)
- targetBank = gSideTimer[side].followmeTarget;
+ if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp)
+ targetBank = gSideTimers[side].followmeTarget;
else
{
side = GetBankSide(gBankAttacker);
@@ -6454,46 +3338,46 @@ u8 GetMoveTarget(u16 move, u8 useMoveTarget) //get move target
case 8:
case 32:
case 64:
- targetBank = GetBankByPlayerAI((GetBankIdentity(gBankAttacker) & 1) ^ 1);
+ targetBank = GetBankByIdentity((GetBankIdentity(gBankAttacker) & 1) ^ 1);
if (gAbsentBankFlags & gBitTable[targetBank])
targetBank ^= 2;
break;
case 4:
side = GetBankSide(gBankAttacker) ^ 1;
- if (gSideTimer[side].followmeTimer && gBattleMons[gSideTimer[side].followmeTarget].hp)
- targetBank = gSideTimer[side].followmeTarget;
+ if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp)
+ targetBank = gSideTimers[side].followmeTarget;
else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && moveTarget & 4)
{
if (GetBankSide(gBankAttacker) == 0)
{
if (Random() & 1)
- targetBank = GetBankByPlayerAI(1);
+ targetBank = GetBankByIdentity(1);
else
- targetBank = GetBankByPlayerAI(3);
+ targetBank = GetBankByIdentity(3);
}
else
{
if (Random() & 1)
- targetBank = GetBankByPlayerAI(0);
+ targetBank = GetBankByIdentity(0);
else
- targetBank = GetBankByPlayerAI(2);
+ targetBank = GetBankByIdentity(2);
}
if (gAbsentBankFlags & gBitTable[targetBank])
targetBank ^= 2;
}
else
- targetBank = GetBankByPlayerAI((GetBankIdentity(gBankAttacker) & 1) ^ 1);
+ targetBank = GetBankByIdentity((GetBankIdentity(gBankAttacker) & 1) ^ 1);
break;
case 2:
case 16:
targetBank = gBankAttacker;
break;
}
- ewram[gBankAttacker + 0x16010] = targetBank;
+ ewram16010arr(gBankAttacker) = targetBank;
return targetBank;
}
-u8 IsPokeDisobedient(void)
+u8 IsMonDisobedient(void)
{
u8 obedienceLevel;
s32 rnd;
@@ -6502,15 +3386,15 @@ u8 IsPokeDisobedient(void)
if (gBattleTypeFlags & BATTLE_TYPE_LINK
|| GetBankSide(gBankAttacker) == 1
|| !IsOtherTrainer(gBattleMons[gBankAttacker].otId, gBattleMons[gBankAttacker].otName)
- || FlagGet(BADGE08_GET))
+ || FlagGet(FLAG_BADGE08_GET))
return 0;
obedienceLevel = 10;
- if (FlagGet(BADGE02_GET))
+ if (FlagGet(FLAG_BADGE02_GET))
obedienceLevel = 30;
- if (FlagGet(BADGE04_GET))
+ if (FlagGet(FLAG_BADGE04_GET))
obedienceLevel = 50;
- if (FlagGet(BADGE06_GET))
+ if (FlagGet(FLAG_BADGE06_GET))
obedienceLevel = 70;
if (gBattleMons[gBankAttacker].level <= obedienceLevel)
@@ -6550,7 +3434,7 @@ u8 IsPokeDisobedient(void)
gBattleCommunication[3] = 0;
gDynamicBasePower = 0;
BATTLE_STRUCT->dynamicMoveType = 0;
- gBattlescriptCurrInstr = gUnknown_081D996F;
+ gBattlescriptCurrInstr = BattleScript_IgnoresAndUsesRandomMove;
gBankTarget = GetMoveTarget(gRandomMove, 0);
gHitMarker |= HITMARKER_x200000;
return 2;
@@ -6572,7 +3456,7 @@ u8 IsPokeDisobedient(void)
}
if (i == gNoOfAllBanks)
{
- gBattlescriptCurrInstr = gUnknown_081D9989;
+ gBattlescriptCurrInstr = BattleScript_IgnoresAndFallsAsleep;
return 1;
}
}
diff --git a/src/calculate_base_damage.c b/src/battle/calculate_base_damage.c
index f5c679876..5c91b3657 100644
--- a/src/calculate_base_damage.c
+++ b/src/battle/calculate_base_damage.c
@@ -1,18 +1,18 @@
#include "global.h"
-#include "abilities.h"
+#include "constants/abilities.h"
#include "battle.h"
#include "berry.h"
#include "data2.h"
#include "event_data.h"
-#include "hold_effects.h"
+#include "constants/hold_effects.h"
#include "item.h"
-#include "items.h"
+#include "constants/items.h"
#include "pokemon.h"
-#include "species.h"
-#include "moves.h"
-#include "battle_move_effects.h"
+#include "constants/species.h"
+#include "constants/moves.h"
+#include "constants/battle_move_effects.h"
+#include "ewram.h"
-extern u32 dword_2017100[];
extern u16 gBattleTypeFlags;
extern struct BattlePokemon gBattleMons[4];
extern u16 gCurrentMove;
@@ -90,7 +90,7 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
{
if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER)
&& gTrainerBattleOpponent != 1024
- && FlagGet(BADGE01_GET)
+ && FlagGet(FLAG_BADGE01_GET)
&& !GetBankSide(bankAtk))
attack = (110 * attack) / 100;
}
@@ -98,7 +98,7 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
{
if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER)
&& gTrainerBattleOpponent != 1024
- && FlagGet(BADGE05_GET)
+ && FlagGet(FLAG_BADGE05_GET)
&& !GetBankSide(bankDef))
defense = (110 * defense) / 100;
}
@@ -106,7 +106,7 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
{
if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER)
&& gTrainerBattleOpponent != 1024
- && FlagGet(BADGE07_GET)
+ && FlagGet(FLAG_BADGE07_GET)
&& !GetBankSide(bankAtk))
spAttack = (110 * spAttack) / 100;
}
@@ -114,7 +114,7 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
{
if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER)
&& gTrainerBattleOpponent != 1024
- && FlagGet(BADGE07_GET)
+ && FlagGet(FLAG_BADGE07_GET)
&& !GetBankSide(bankDef))
spDefense = (110 * spDefense) / 100;
}
@@ -301,7 +301,7 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
}
// flash fire triggered
- if ((dword_2017100[bankAtk] & 1) && type == TYPE_FIRE)
+ if ((eFlashFireArr.arr[bankAtk] & 1) && type == TYPE_FIRE)
damage = (15 * damage) / 10;
}
diff --git a/src/contest_link_80C857C.c b/src/battle/contest_link_80C857C.c
index 0ae98af09..616a72d27 100644
--- a/src/contest_link_80C857C.c
+++ b/src/battle/contest_link_80C857C.c
@@ -3,52 +3,33 @@
#if GERMAN
-void de_sub_80C9274(bool32 arg0) {
- if (deUnkValue2 != 1)
- {
- return;
- }
-
- if (arg0)
- {
- deUnkValue2 = 3;
- }
- else
+void de_sub_80C9274(bool32 arg0)
+{
+ if (deUnkValue2 == 1)
{
- deUnkValue2 = 2;
+ if (arg0)
+ deUnkValue2 = 3;
+ else
+ deUnkValue2 = 2;
}
}
-void de_sub_80C9294(bool32 arg0) {
+void de_sub_80C9294(bool32 arg0)
+{
if (deUnkValue2 == 1)
{
if (arg0)
- {
deUnkValue2 = 3;
- }
else
- {
deUnkValue2 = 2;
- }
-
- return;
}
-
-
- if (deUnkValue2 == 2)
+ else if (deUnkValue2 == 2)
{
SendBlock(0, sBlockRequestLookupTable[deUnkValue1].address, sBlockRequestLookupTable[deUnkValue1].size);
-
if (arg0)
- {
deUnkValue2 = 0;
- }
else
- {
deUnkValue2 = 1;
- }
-
- return;
}
}
diff --git a/src/pokeball.c b/src/battle/pokeball.c
index ee3b95678..6f27469ce 100644
--- a/src/pokeball.c
+++ b/src/battle/pokeball.c
@@ -8,12 +8,13 @@
#include "pokeball.h"
#include "pokemon.h"
#include "rom_8077ABC.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "sprite.h"
#include "task.h"
#include "trig.h"
#include "util.h"
+#include "ewram.h"
extern struct MusicPlayerInfo gMPlay_BGM;
extern u16 gBattleTypeFlags;
@@ -363,9 +364,9 @@ static void sub_8046464(u8 taskId)
r4 = ball_number_to_ball_processing_index(ball);
sub_80478DC(r4);
spriteId = CreateSprite(&gBallSpriteTemplates[r4], 32, 80, 0x1D);
- gSprites[spriteId].data0 = 0x80;
- gSprites[spriteId].data1 = 0;
- gSprites[spriteId].data7 = r8;
+ gSprites[spriteId].data[0] = 0x80;
+ gSprites[spriteId].data[1] = 0;
+ gSprites[spriteId].data[7] = r8;
switch (r8)
{
case 0xFF:
@@ -375,27 +376,27 @@ static void sub_8046464(u8 taskId)
gSprites[spriteId].callback = sub_8047074;
break;
case 0xFE:
- gSprites[spriteId].pos1.x = sub_8077ABC(r5, 0);
- gSprites[spriteId].pos1.y = sub_8077ABC(r5, 1) + 24;
+ gSprites[spriteId].pos1.x = GetBankPosition(r5, 0);
+ gSprites[spriteId].pos1.y = GetBankPosition(r5, 1) + 24;
gBankTarget = r5;
- gSprites[spriteId].data0 = 0;
+ gSprites[spriteId].data[0] = 0;
gSprites[spriteId].callback = sub_8047254;
break;
default:
- gBankTarget = GetBankByPlayerAI(1);
+ gBankTarget = GetBankByIdentity(1);
sp0 = TRUE;
break;
}
- gSprites[spriteId].data6 = gBankTarget;
+ gSprites[spriteId].data[6] = gBankTarget;
if (!sp0)
{
DestroyTask(taskId);
return;
}
- gSprites[spriteId].data0 = 0x22;
- gSprites[spriteId].data2 = sub_8077ABC(gBankTarget, 0);
- gSprites[spriteId].data4 = sub_8077ABC(gBankTarget, 1) - 16;
- gSprites[spriteId].data5 = -40;
+ gSprites[spriteId].data[0] = 0x22;
+ gSprites[spriteId].data[2] = GetBankPosition(gBankTarget, 0);
+ gSprites[spriteId].data[4] = GetBankPosition(gBankTarget, 1) - 16;
+ gSprites[spriteId].data[5] = -40;
sub_80786EC(&gSprites[spriteId]);
gSprites[spriteId].oam.affineParam = taskId;
gTasks[taskId].data[4] = gBankTarget;
@@ -418,12 +419,12 @@ static void objc_0804ABD4(struct Sprite *sprite)
sprite->pos1.y += sprite->pos2.y;
sprite->pos2.x = 0;
sprite->pos2.y = 0;
- sprite->data5 = 0;
+ sprite->data[5] = 0;
r4 = ball_number_to_ball_processing_index(sub_8047978(r5));
sub_814086C(sprite->pos1.x, sprite->pos1.y - 5, 1, 0x1C, r4);
- sprite->data0 = sub_8141314(0, r5, 14, r4);
- sprite->data6 = r5;
- sprite->data7 = r8;
+ sprite->data[0] = sub_8141314(0, r5, 14, r4);
+ sprite->data[6] = r5;
+ sprite->data[7] = r8;
DestroyTask(taskId);
sprite->callback = sub_80466E8;
}
@@ -436,33 +437,33 @@ static void sub_80466E8(struct Sprite *sprite)
static void sub_80466F4(struct Sprite *sprite)
{
- sprite->data5++;
- if (sprite->data5 == 10)
+ sprite->data[5]++;
+ if (sprite->data[5] == 10)
{
- sprite->data5 = 0;
+ sprite->data[5] = 0;
sprite->callback = sub_8046760;
- StartSpriteAffineAnim(&gSprites[gObjectBankIDs[sprite->data6]], 2);
- AnimateSprite(&gSprites[gObjectBankIDs[sprite->data6]]);
- gSprites[gObjectBankIDs[sprite->data6]].data1 = 0;
+ StartSpriteAffineAnim(&gSprites[gObjectBankIDs[sprite->data[6]]], 2);
+ AnimateSprite(&gSprites[gObjectBankIDs[sprite->data[6]]]);
+ gSprites[gObjectBankIDs[sprite->data[6]]].data[1] = 0;
}
}
static void sub_8046760(struct Sprite *sprite)
{
- sprite->data5++;
- if (sprite->data5 == 11)
+ sprite->data[5]++;
+ if (sprite->data[5] == 11)
PlaySE(SE_SUIKOMU);
- if (gSprites[gObjectBankIDs[sprite->data6]].affineAnimEnded)
+ if (gSprites[gObjectBankIDs[sprite->data[6]]].affineAnimEnded)
{
StartSpriteAnim(sprite, 2);
- gSprites[gObjectBankIDs[sprite->data6]].invisible = TRUE;
- sprite->data5 = 0;
+ gSprites[gObjectBankIDs[sprite->data[6]]].invisible = TRUE;
+ sprite->data[5] = 0;
sprite->callback = sub_80467F8;
}
else
{
- gSprites[gObjectBankIDs[sprite->data6]].data1 += 0x60;
- gSprites[gObjectBankIDs[sprite->data6]].pos2.y = -gSprites[gObjectBankIDs[sprite->data6]].data1 >> 8;
+ gSprites[gObjectBankIDs[sprite->data[6]]].data[1] += 0x60;
+ gSprites[gObjectBankIDs[sprite->data[6]]].pos2.y = -gSprites[gObjectBankIDs[sprite->data[6]]].data[1] >> 8;
}
}
@@ -470,14 +471,14 @@ static void sub_80467F8(struct Sprite *sprite)
{
if (sprite->animEnded)
{
- sprite->data5++;
- if (sprite->data5 == 1)
+ sprite->data[5]++;
+ if (sprite->data[5] == 1)
{
- sprite->data3 = 0;
- sprite->data4 = 32;
- sprite->data5 = 0;
+ sprite->data[3] = 0;
+ sprite->data[4] = 32;
+ sprite->data[5] = 0;
sprite->pos1.y += Cos(0, 32);
- sprite->pos2.y = -Cos(0, sprite->data4);
+ sprite->pos2.y = -Cos(0, sprite->data[4]);
sprite->callback = sub_804684C;
}
}
@@ -487,18 +488,18 @@ static void sub_804684C(struct Sprite *sprite)
{
bool8 r5 = FALSE;
- switch (sprite->data3 & 0xFF)
+ switch (sprite->data[3] & 0xFF)
{
case 0:
- sprite->pos2.y = -Cos(sprite->data5, sprite->data4);
- sprite->data5 += 4 + (sprite->data3 >> 8);
- if (sprite->data5 >= 64)
+ sprite->pos2.y = -Cos(sprite->data[5], sprite->data[4]);
+ sprite->data[5] += 4 + (sprite->data[3] >> 8);
+ if (sprite->data[5] >= 64)
{
- sprite->data4 -= 10;
- sprite->data3 += 0x101;
- if (sprite->data3 >> 8 == 4)
+ sprite->data[4] -= 10;
+ sprite->data[3] += 0x101;
+ if (sprite->data[3] >> 8 == 4)
r5 = TRUE;
- switch (sprite->data3 >> 8)
+ switch (sprite->data[3] >> 8)
{
case 1:
PlaySE(SE_KON);
@@ -516,39 +517,39 @@ static void sub_804684C(struct Sprite *sprite)
}
break;
case 1:
- sprite->pos2.y = -Cos(sprite->data5, sprite->data4);
- sprite->data5 -= 4 + (sprite->data3 >> 8);
- if (sprite->data5 <= 0)
+ sprite->pos2.y = -Cos(sprite->data[5], sprite->data[4]);
+ sprite->data[5] -= 4 + (sprite->data[3] >> 8);
+ if (sprite->data[5] <= 0)
{
- sprite->data5 = 0;
- sprite->data3 &= 0xFF00;
+ sprite->data[5] = 0;
+ sprite->data[3] &= 0xFF00;
}
break;
}
if (r5)
{
- sprite->data3 = 0;
+ sprite->data[3] = 0;
sprite->pos1.y += Cos(64, 32);
sprite->pos2.y = 0;
- if (sprite->data7 == 0)
+ if (sprite->data[7] == 0)
{
sprite->callback = sub_8046C78;
}
else
{
sprite->callback = sub_8046944;
- sprite->data4 = 1;
- sprite->data5 = 0;
+ sprite->data[4] = 1;
+ sprite->data[5] = 0;
}
}
}
static void sub_8046944(struct Sprite *sprite)
{
- sprite->data3++;
- if (sprite->data3 == 31)
+ sprite->data[3]++;
+ if (sprite->data[3] == 31)
{
- sprite->data3 = 0;
+ sprite->data[3] = 0;
sprite->affineAnimPaused = TRUE;
StartSpriteAffineAnim(sprite, 1);
sprite->callback = sub_8046984;
@@ -558,28 +559,28 @@ static void sub_8046944(struct Sprite *sprite)
static void sub_8046984(struct Sprite *sprite)
{
- switch (sprite->data3 & 0xFF)
+ switch (sprite->data[3] & 0xFF)
{
case 0:
case 2:
- sprite->pos2.x += sprite->data4;
- sprite->data5 += sprite->data4;
+ sprite->pos2.x += sprite->data[4];
+ sprite->data[5] += sprite->data[4];
sprite->affineAnimPaused = FALSE;
- if (sprite->data5 > 3 || sprite->data5 < -3)
+ if (sprite->data[5] > 3 || sprite->data[5] < -3)
{
- sprite->data3++;
- sprite->data5 = 0;
+ sprite->data[3]++;
+ sprite->data[5] = 0;
}
break;
case 1:
- sprite->data5++;
- if (sprite->data5 == 1)
+ sprite->data[5]++;
+ if (sprite->data[5] == 1)
{
- sprite->data5 = 0;
- sprite->data4 = -sprite->data4;
- sprite->data3++;
+ sprite->data[5] = 0;
+ sprite->data[4] = -sprite->data[4];
+ sprite->data[3]++;
sprite->affineAnimPaused = FALSE;
- if (sprite->data4 < 0)
+ if (sprite->data[4] < 0)
ChangeSpriteAffineAnim(sprite, 2);
else
ChangeSpriteAffineAnim(sprite, 1);
@@ -590,34 +591,34 @@ static void sub_8046984(struct Sprite *sprite)
}
break;
case 3:
- sprite->data3 += 0x100;
- if (sprite->data3 >> 8 == sprite->data7)
+ sprite->data[3] += 0x100;
+ if (sprite->data[3] >> 8 == sprite->data[7])
{
sprite->callback = sub_8046C78;
}
else
{
- if (sprite->data7 == 4 && sprite->data3 >> 8 == 3)
+ if (sprite->data[7] == 4 && sprite->data[3] >> 8 == 3)
{
sprite->callback = sub_8046E7C;
sprite->affineAnimPaused = TRUE;
}
else
{
- sprite->data3++;
+ sprite->data[3]++;
sprite->affineAnimPaused = TRUE;
}
}
break;
case 4:
default:
- sprite->data5++;
- if (sprite->data5 == 31)
+ sprite->data[5]++;
+ if (sprite->data[5] == 31)
{
- sprite->data5 = 0;
- sprite->data3 &= 0xFF00;
+ sprite->data[5] = 0;
+ sprite->data[3] &= 0xFF00;
StartSpriteAffineAnim(sprite, 3);
- if (sprite->data4 < 0)
+ if (sprite->data[4] < 0)
StartSpriteAffineAnim(sprite, 2);
else
StartSpriteAffineAnim(sprite, 1);
@@ -694,13 +695,13 @@ static void sub_8046AD0(u8 taskId)
static void sub_8046C78(struct Sprite *sprite)
{
- u8 r5 = sprite->data6;
+ u8 r5 = sprite->data[6];
u32 r4; // not sure of this type
StartSpriteAnim(sprite, 1);
r4 = ball_number_to_ball_processing_index(sub_8047978(r5));
sub_814086C(sprite->pos1.x, sprite->pos1.y - 5, 1, 0x1C, r4);
- sprite->data0 = sub_8141314(1, sprite->data6, 14, r4);
+ sprite->data[0] = sub_8141314(1, sprite->data[6], 14, r4);
sprite->callback = sub_8046E9C;
if (gMain.inBattle)
{
@@ -721,7 +722,7 @@ static void sub_8046C78(struct Sprite *sprite)
r8 = -25;
}
species = GetMonData(pkmn, MON_DATA_SPECIES);
- if ((r5 == GetBankByPlayerAI(0) || r5 == GetBankByPlayerAI(1))
+ if ((r5 == GetBankByIdentity(0) || r5 == GetBankByIdentity(1))
&& IsDoubleBattle() && ewram17840.unk9_0)
{
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
@@ -736,7 +737,7 @@ static void sub_8046C78(struct Sprite *sprite)
}
if (!IsDoubleBattle() || !ewram17840.unk9_0)
r4_2 = 0;
- else if (r5 == GetBankByPlayerAI(0) || r5 == GetBankByPlayerAI(1))
+ else if (r5 == GetBankByIdentity(0) || r5 == GetBankByIdentity(1))
r4_2 = 1;
else
r4_2 = 2;
@@ -746,24 +747,24 @@ static void sub_8046C78(struct Sprite *sprite)
gTasks[taskId].data[2] = r4_2;
gTasks[taskId].data[15] = 0;
}
- StartSpriteAffineAnim(&gSprites[gObjectBankIDs[sprite->data6]], 1);
- AnimateSprite(&gSprites[gObjectBankIDs[sprite->data6]]);
- gSprites[gObjectBankIDs[sprite->data6]].data1 = 0x1000;
+ StartSpriteAffineAnim(&gSprites[gObjectBankIDs[sprite->data[6]]], 1);
+ AnimateSprite(&gSprites[gObjectBankIDs[sprite->data[6]]]);
+ gSprites[gObjectBankIDs[sprite->data[6]]].data[1] = 0x1000;
}
static void sub_8046E7C(struct Sprite *sprite)
{
sprite->animPaused = TRUE;
sprite->callback = sub_8046FBC;
- sprite->data3 = 0;
- sprite->data4 = 0;
- sprite->data5 = 0;
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+ sprite->data[5] = 0;
}
static void sub_8046E9C(struct Sprite *sprite)
{
bool8 r7 = FALSE;
- u8 r4 = sprite->data6;
+ u8 r4 = sprite->data[6];
gSprites[gObjectBankIDs[r4]].invisible = FALSE;
if (sprite->animEnded)
@@ -775,8 +776,8 @@ static void sub_8046E9C(struct Sprite *sprite)
}
else
{
- gSprites[gObjectBankIDs[r4]].data1 -= 288;
- gSprites[gObjectBankIDs[r4]].pos2.y = gSprites[gObjectBankIDs[r4]].data1 >> 8;
+ gSprites[gObjectBankIDs[r4]].data[1] -= 288;
+ gSprites[gObjectBankIDs[r4]].pos2.y = gSprites[gObjectBankIDs[r4]].data[1] >> 8;
}
if (sprite->animEnded && r7)
{
@@ -803,23 +804,23 @@ static void sub_8046E9C(struct Sprite *sprite)
static void sub_8046FBC(struct Sprite *sprite)
{
- u8 r7 = sprite->data6;
+ u8 r7 = sprite->data[6];
- sprite->data4++;
- if (sprite->data4 == 40)
+ sprite->data[4]++;
+ if (sprite->data[4] == 40)
{
return;
}
- else if (sprite->data4 == 95)
+ else if (sprite->data[4] == 95)
{
gDoingBattleAnim = 0;
m4aMPlayAllStop();
PlaySE(BGM_FANFA5);
}
- else if (sprite->data4 == 315)
+ else if (sprite->data[4] == 315)
{
- FreeOamMatrix(gSprites[gObjectBankIDs[sprite->data6]].oam.matrixNum);
- DestroySprite(&gSprites[gObjectBankIDs[sprite->data6]]);
+ FreeOamMatrix(gSprites[gObjectBankIDs[sprite->data[6]]].oam.matrixNum);
+ DestroySprite(&gSprites[gObjectBankIDs[sprite->data[6]]]);
DestroySpriteAndFreeResources(sprite);
if (gMain.inBattle)
ewram17810[r7].unk0_3 = 0;
@@ -828,11 +829,11 @@ static void sub_8046FBC(struct Sprite *sprite)
static void sub_8047074(struct Sprite *sprite)
{
- sprite->data0 = 25;
- sprite->data2 = sub_8077ABC(sprite->data6, 2);
- sprite->data4 = sub_8077ABC(sprite->data6, 3) + 24;
- sprite->data5 = -30;
- sprite->oam.affineParam = sprite->data6;
+ sprite->data[0] = 25;
+ sprite->data[2] = GetBankPosition(sprite->data[6], 2);
+ sprite->data[4] = GetBankPosition(sprite->data[6], 3) + 24;
+ sprite->data[5] = -30;
+ sprite->oam.affineParam = sprite->data[6];
sub_80786EC(sprite);
sprite->callback = sub_80470C4;
}
@@ -844,33 +845,33 @@ static void sub_80470C4(struct Sprite *sprite)
u32 r6;
u32 r7;
- if (HIBYTE(sprite->data7) >= 35 && HIBYTE(sprite->data7) < 80)
+ if (HIBYTE(sprite->data[7]) >= 35 && HIBYTE(sprite->data[7]) < 80)
{
s16 r4;
if ((sprite->oam.affineParam & 0xFF00) == 0)
{
- r6 = sprite->data1 & 1;
- r7 = sprite->data2 & 1;
- sprite->data1 = ((sprite->data1 / 3) & ~1) | r6;
- sprite->data2 = ((sprite->data2 / 3) & ~1) | r7;
+ r6 = sprite->data[1] & 1;
+ r7 = sprite->data[2] & 1;
+ sprite->data[1] = ((sprite->data[1] / 3) & ~1) | r6;
+ sprite->data[2] = ((sprite->data[2] / 3) & ~1) | r7;
StartSpriteAffineAnim(sprite, 4);
}
- r4 = sprite->data0;
+ r4 = sprite->data[0];
sub_8078B5C(sprite);
- sprite->data7 += sprite->data6 / 3;
- sprite->pos2.y += Sin(HIBYTE(sprite->data7), sprite->data5);
+ sprite->data[7] += sprite->data[6] / 3;
+ sprite->pos2.y += Sin(HIBYTE(sprite->data[7]), sprite->data[5]);
sprite->oam.affineParam += 0x100;
if ((sprite->oam.affineParam >> 8) % 3 != 0)
- sprite->data0 = r4;
+ sprite->data[0] = r4;
else
- sprite->data0 = r4 - 1;
- if (HIBYTE(sprite->data7) >= 80)
+ sprite->data[0] = r4 - 1;
+ if (HIBYTE(sprite->data[7]) >= 80)
{
- r6 = sprite->data1 & 1;
- r7 = sprite->data2 & 1;
- sprite->data1 = ((sprite->data1 * 3) & ~1) | r6;
- sprite->data2 = ((sprite->data2 * 3) & ~1) | r7;
+ r6 = sprite->data[1] & 1;
+ r7 = sprite->data[2] & 1;
+ sprite->data[1] = ((sprite->data[1] * 3) & ~1) | r6;
+ sprite->data[2] = ((sprite->data[2] * 3) & ~1) | r7;
}
}
else
@@ -881,10 +882,10 @@ static void sub_80470C4(struct Sprite *sprite)
sprite->pos1.y += sprite->pos2.y;
sprite->pos2.y = 0;
sprite->pos2.x = 0;
- sprite->data6 = sprite->oam.affineParam & 0xFF;
- sprite->data0 = 0;
+ sprite->data[6] = sprite->oam.affineParam & 0xFF;
+ sprite->data[0] = 0;
if (IsDoubleBattle() && ewram17840.unk9_0
- && sprite->data6 == GetBankByPlayerAI(2))
+ && sprite->data[6] == GetBankByIdentity(2))
sprite->callback = sub_8047230;
else
sprite->callback = sub_8046C78;
@@ -895,21 +896,21 @@ static void sub_80470C4(struct Sprite *sprite)
static void sub_8047230(struct Sprite *sprite)
{
- if (sprite->data0++ > 24)
+ if (sprite->data[0]++ > 24)
{
- sprite->data0 = 0;
+ sprite->data[0] = 0;
sprite->callback = sub_8046C78;
}
}
static void sub_8047254(struct Sprite *sprite)
{
- sprite->data0++;
- if (sprite->data0 > 15)
+ sprite->data[0]++;
+ if (sprite->data[0] > 15)
{
- sprite->data0 = 0;
+ sprite->data[0] = 0;
if (IsDoubleBattle() && ewram17840.unk9_0
- && sprite->data6 == GetBankByPlayerAI(3))
+ && sprite->data[6] == GetBankByIdentity(3))
sprite->callback = sub_8047230;
else
sprite->callback = sub_8046C78;
@@ -933,15 +934,15 @@ void CreatePokeballSprite(u8 a, u8 b, u8 x, u8 y, u8 e, u8 f, u8 g, u32 h)
LoadCompressedObjectPic(&sBallSpriteSheets[0]);
LoadCompressedObjectPalette(&sBallSpritePalettes[0]);
spriteId = CreateSprite(&gBallSpriteTemplates[0], x, y, f);
- gSprites[spriteId].data0 = a;
- gSprites[spriteId].data5 = gSprites[a].pos1.x;
- gSprites[spriteId].data6 = gSprites[a].pos1.y;
+ gSprites[spriteId].data[0] = a;
+ gSprites[spriteId].data[5] = gSprites[a].pos1.x;
+ gSprites[spriteId].data[6] = gSprites[a].pos1.y;
gSprites[a].pos1.x = x;
gSprites[a].pos1.y = y;
- gSprites[spriteId].data1 = g;
- gSprites[spriteId].data2 = b;
- gSprites[spriteId].data3 = h;
- gSprites[spriteId].data4 = h >> 16;
+ gSprites[spriteId].data[1] = g;
+ gSprites[spriteId].data[2] = b;
+ gSprites[spriteId].data[3] = h;
+ gSprites[spriteId].data[4] = h >> 16;
gSprites[spriteId].oam.priority = e;
gSprites[spriteId].callback = sub_80473D0;
gSprites[a].invisible = TRUE;
@@ -949,12 +950,12 @@ void CreatePokeballSprite(u8 a, u8 b, u8 x, u8 y, u8 e, u8 f, u8 g, u32 h)
static void sub_80473D0(struct Sprite *sprite)
{
- if (sprite->data1 == 0)
+ if (sprite->data[1] == 0)
{
u8 r5;
- u8 r7 = sprite->data0;
- u8 r8 = sprite->data2;
- u32 r4 = (u16)sprite->data3 | ((u16)sprite->data4 << 16);
+ u8 r7 = sprite->data[0];
+ u8 r8 = sprite->data[2];
+ u32 r4 = (u16)sprite->data[3] | ((u16)sprite->data[4] << 16);
if (sprite->subpriority != 0)
r5 = sprite->subpriority - 1;
@@ -962,17 +963,17 @@ static void sub_80473D0(struct Sprite *sprite)
r5 = 0;
StartSpriteAnim(sprite, 1);
sub_80472B0(sprite->pos1.x, sprite->pos1.y - 5, sprite->oam.priority, r5);
- sprite->data1 = sub_80472D8(1, r8, r4);
+ sprite->data[1] = sub_80472D8(1, r8, r4);
sprite->callback = sub_804748C;
gSprites[r7].invisible = FALSE;
StartSpriteAffineAnim(&gSprites[r7], 1);
AnimateSprite(&gSprites[r7]);
- gSprites[r7].data1 = 0x1000;
- sprite->data7 = 0;
+ gSprites[r7].data[1] = 0x1000;
+ sprite->data[7] = 0;
}
else
{
- sprite->data1--;
+ sprite->data[1]--;
}
}
@@ -980,7 +981,7 @@ static void sub_804748C(struct Sprite *sprite)
{
bool8 r12 = FALSE;
bool8 r6 = FALSE;
- u8 r3 = sprite->data0;
+ u8 r3 = sprite->data[0];
u16 var1;
u16 var2;
@@ -991,22 +992,22 @@ static void sub_804748C(struct Sprite *sprite)
StartSpriteAffineAnim(&gSprites[r3], 0);
r12 = TRUE;
}
- var1 = (sprite->data5 - sprite->pos1.x) * sprite->data7 / 128 + sprite->pos1.x;
- var2 = (sprite->data6 - sprite->pos1.y) * sprite->data7 / 128 + sprite->pos1.y;
+ var1 = (sprite->data[5] - sprite->pos1.x) * sprite->data[7] / 128 + sprite->pos1.x;
+ var2 = (sprite->data[6] - sprite->pos1.y) * sprite->data[7] / 128 + sprite->pos1.y;
gSprites[r3].pos1.x = var1;
gSprites[r3].pos1.y = var2;
- if (sprite->data7 < 128)
+ if (sprite->data[7] < 128)
{
- s16 sine = -(gSineTable[(u8)sprite->data7] / 8);
+ s16 sine = -(gSineTable[(u8)sprite->data[7]] / 8);
- sprite->data7 += 4;
+ sprite->data[7] += 4;
gSprites[r3].pos2.x = sine;
gSprites[r3].pos2.y = sine;
}
else
{
- gSprites[r3].pos1.x = sprite->data5;
- gSprites[r3].pos1.y = sprite->data6;
+ gSprites[r3].pos1.x = sprite->data[5];
+ gSprites[r3].pos1.y = sprite->data[6];
gSprites[r3].pos2.x = 0;
gSprites[r3].pos2.y = 0;
r6 = TRUE;
@@ -1022,11 +1023,11 @@ u8 sub_8047580(u8 a, u8 b, u8 x, u8 y, u8 e, u8 f, u8 g, u32 h)
LoadCompressedObjectPic(&sBallSpriteSheets[0]);
LoadCompressedObjectPalette(&sBallSpritePalettes[0]);
spriteId = CreateSprite(&gBallSpriteTemplates[0], x, y, f);
- gSprites[spriteId].data0 = a;
- gSprites[spriteId].data1 = g;
- gSprites[spriteId].data2 = b;
- gSprites[spriteId].data3 = h;
- gSprites[spriteId].data4 = h >> 16;
+ gSprites[spriteId].data[0] = a;
+ gSprites[spriteId].data[1] = g;
+ gSprites[spriteId].data[2] = b;
+ gSprites[spriteId].data[3] = h;
+ gSprites[spriteId].data[4] = h >> 16;
gSprites[spriteId].oam.priority = e;
gSprites[spriteId].callback = sub_8047638;
return spriteId;
@@ -1034,12 +1035,12 @@ u8 sub_8047580(u8 a, u8 b, u8 x, u8 y, u8 e, u8 f, u8 g, u32 h)
static void sub_8047638(struct Sprite *sprite)
{
- if (sprite->data1 == 0)
+ if (sprite->data[1] == 0)
{
u8 r6;
- u8 r7 = sprite->data0;
- u8 r8 = sprite->data2;
- u32 r5 = (u16)sprite->data3 | ((u16)sprite->data4 << 16);
+ u8 r7 = sprite->data[0];
+ u8 r8 = sprite->data[2];
+ u32 r5 = (u16)sprite->data[3] | ((u16)sprite->data[4] << 16);
if (sprite->subpriority != 0)
r6 = sprite->subpriority - 1;
@@ -1047,15 +1048,15 @@ static void sub_8047638(struct Sprite *sprite)
r6 = 0;
StartSpriteAnim(sprite, 1);
sub_80472B0(sprite->pos1.x, sprite->pos1.y - 5, sprite->oam.priority, r6);
- sprite->data1 = sub_80472D8(1, r8, r5);
+ sprite->data[1] = sub_80472D8(1, r8, r5);
sprite->callback = sub_80476E0;
StartSpriteAffineAnim(&gSprites[r7], 2);
AnimateSprite(&gSprites[r7]);
- gSprites[r7].data1 = 0;
+ gSprites[r7].data[1] = 0;
}
else
{
- sprite->data1--;
+ sprite->data[1]--;
}
}
@@ -1063,21 +1064,21 @@ static void sub_80476E0(struct Sprite *sprite)
{
u8 r1;
- sprite->data5++;
- if (sprite->data5 == 11)
+ sprite->data[5]++;
+ if (sprite->data[5] == 11)
PlaySE(SE_SUIKOMU);
- r1 = sprite->data0;
+ r1 = sprite->data[0];
if (gSprites[r1].affineAnimEnded)
{
StartSpriteAnim(sprite, 2);
gSprites[r1].invisible = TRUE;
- sprite->data5 = 0;
+ sprite->data[5] = 0;
sprite->callback = sub_8047754;
}
else
{
- gSprites[r1].data1 += 96;
- gSprites[r1].pos2.y = -gSprites[r1].data1 >> 8;
+ gSprites[r1].data[1] += 96;
+ gSprites[r1].pos2.y = -gSprites[r1].data[1] >> 8;
}
}
@@ -1096,37 +1097,37 @@ void sub_804777C(u8 a)
{
struct Sprite *sprite = &gSprites[gHealthboxIDs[a]];
- sprite->data0 = 5;
- sprite->data1 = 0;
+ sprite->data[0] = 5;
+ sprite->data[1] = 0;
sprite->pos2.x = 0x73;
sprite->pos2.y = 0;
sprite->callback = sub_8047830;
if (GetBankSide(a) != 0)
{
- sprite->data0 = -sprite->data0;
- sprite->data1 = -sprite->data1;
+ sprite->data[0] = -sprite->data[0];
+ sprite->data[1] = -sprite->data[1];
sprite->pos2.x = -sprite->pos2.x;
sprite->pos2.y = -sprite->pos2.y;
}
- gSprites[sprite->data5].callback(&gSprites[sprite->data5]);
+ gSprites[sprite->data[5]].callback(&gSprites[sprite->data[5]]);
if (GetBankIdentity(a) == 2)
sprite->callback = sub_804780C;
}
static void sub_804780C(struct Sprite *sprite)
{
- sprite->data1++;
- if (sprite->data1 == 20)
+ sprite->data[1]++;
+ if (sprite->data[1] == 20)
{
- sprite->data1 = 0;
+ sprite->data[1] = 0;
sprite->callback = sub_8047830;
}
}
static void sub_8047830(struct Sprite *sprite)
{
- sprite->pos2.x -= sprite->data0;
- sprite->pos2.y -= sprite->data1;
+ sprite->pos2.x -= sprite->data[0];
+ sprite->pos2.y -= sprite->data[1];
if (sprite->pos2.x == 0 && sprite->pos2.y == 0)
sprite->callback = SpriteCallbackDummy;
}
@@ -1136,19 +1137,19 @@ void sub_8047858(u8 a)
u8 spriteId;
spriteId = CreateInvisibleSpriteWithCallback(oamc_804BEB4);
- gSprites[spriteId].data0 = 1;
- gSprites[spriteId].data1 = gHealthboxIDs[a];
+ gSprites[spriteId].data[0] = 1;
+ gSprites[spriteId].data[1] = gHealthboxIDs[a];
gSprites[spriteId].callback = oamc_804BEB4;
}
static void oamc_804BEB4(struct Sprite *sprite)
{
- u8 r1 = sprite->data1;
+ u8 r1 = sprite->data[1];
- gSprites[r1].pos2.y = sprite->data0;
- sprite->data0 = -sprite->data0;
- sprite->data2++;
- if (sprite->data2 == 21)
+ gSprites[r1].pos2.y = sprite->data[0];
+ sprite->data[0] = -sprite->data[0];
+ sprite->data[2]++;
+ if (sprite->data[2] == 21)
{
gSprites[r1].pos2.x = 0;
gSprites[r1].pos2.y = 0;
diff --git a/src/post_battle_event_funcs.c b/src/battle/post_battle_event_funcs.c
index 8d85705c8..0617763f6 100644
--- a/src/post_battle_event_funcs.c
+++ b/src/battle/post_battle_event_funcs.c
@@ -4,7 +4,7 @@
#include "load_save.h"
#include "main.h"
#include "pokemon.h"
-#include "rom4.h"
+#include "overworld.h"
#include "script_pokemon_80C4.h"
extern u8 gUnknown_02039324;
@@ -14,16 +14,16 @@ int GameClear(void)
int i;
bool32 ribbonGet;
- HealPlayerParty();
+ ScrSpecial_HealPlayerParty();
- if (FlagGet(SYS_GAME_CLEAR) == TRUE)
+ if (FlagGet(FLAG_SYS_GAME_CLEAR) == TRUE)
{
gUnknown_02039324 = 1;
}
else
{
gUnknown_02039324 = 0;
- FlagSet(SYS_GAME_CLEAR);
+ FlagSet(FLAG_SYS_GAME_CLEAR);
}
if (!GetGameStat(1))
@@ -55,7 +55,7 @@ int GameClear(void)
if (ribbonGet == TRUE)
{
IncrementGameStat(42);
- FlagSet(SYS_RIBBON_GET);
+ FlagSet(FLAG_SYS_RIBBON_GET);
}
SetMainCallback2(sub_8141F90);
diff --git a/src/reshow_battle_screen.c b/src/battle/reshow_battle_screen.c
index 343c8f183..6a6d7a137 100644
--- a/src/reshow_battle_screen.c
+++ b/src/battle/reshow_battle_screen.c
@@ -7,17 +7,18 @@
#include "text.h"
#include "rom_8077ABC.h"
#include "data2.h"
+#include "ewram.h"
extern struct SpriteTemplate gUnknown_02024E8C;
extern struct Window gUnknown_03004210;
-extern u16 gUnknown_03004280;
-extern u16 gUnknown_03004288;
-extern u16 gUnknown_030042A4;
-extern u16 gUnknown_030042C0;
+extern u16 gBattle_BG2_Y;
+extern u16 gBattle_BG2_X;
+extern u16 gBattle_BG0_X;
+extern u16 gBattle_BG1_X;
extern u16 gUnknown_030041B0;
-extern u16 gUnknown_030041B4;
+extern u16 gBattle_BG1_Y;
extern u16 gUnknown_030041B8;
-extern u16 gUnknown_030042A0;
+extern u16 gBattle_BG0_Y;
extern u8 gReservedSpritePaletteCount;
extern u8 gActionSelectionCursor[4];
extern u8 gBankInMenu;
@@ -55,9 +56,6 @@ static void sub_807B184(u8 bank);
static void sub_807B508(u8 bank);
static void sub_807B06C(void);
-#define gReshowState ewram[0x1FFFF]
-#define gHelperState ewram[0x1FFFE]
-
void nullsub_14(void)
{
@@ -83,12 +81,12 @@ static void CB2_ReshowBattleScreenAfterMenu(void)
SetUpWindowConfig(&gWindowConfig_81E6C58);
ResetPaletteFade();
InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6C58);
- gUnknown_030042A4 = 0;
- gUnknown_030042A0 = 0;
- gUnknown_030042C0 = 0;
- gUnknown_030041B4 = 0;
- gUnknown_03004288 = 0;
- gUnknown_03004280 = 0;
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 0;
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ gBattle_BG2_X = 0;
+ gBattle_BG2_Y = 0;
gUnknown_030041B0 = 0;
gUnknown_030041B8 = 0;
break;
@@ -173,13 +171,13 @@ static void CB2_ReshowBattleScreenAfterMenu(void)
sub_80327CC();
- opponentBank = GetBankByPlayerAI(1);
+ opponentBank = GetBankByIdentity(1);
species = GetMonData(&gEnemyParty[gBattlePartyID[opponentBank]], MON_DATA_SPECIES);
sub_8032984(opponentBank, species);
if (IsDoubleBattle())
{
- opponentBank = GetBankByPlayerAI(3);
+ opponentBank = GetBankByIdentity(3);
species = GetMonData(&gEnemyParty[gBattlePartyID[opponentBank]], MON_DATA_SPECIES);
sub_8032984(opponentBank, species);
}
@@ -192,7 +190,7 @@ static void CB2_ReshowBattleScreenAfterMenu(void)
sub_807B06C();
BeginHardwarePaletteFade(0xFF, 0, 0x10, 0, 1);
gPaletteFade.bufferTransferDisabled = 0;
- SetMainCallback2(sub_800F808);
+ SetMainCallback2(BattleMainCB2);
break;
}
gReshowState++;
@@ -200,15 +198,9 @@ static void CB2_ReshowBattleScreenAfterMenu(void)
static void sub_807B06C(void)
{
- struct BGCntrlBitfield *regBgcnt1, *regBgcnt2;
-
sub_800D6D4();
-
- regBgcnt1 = (void*)(&REG_BG1CNT);
- regBgcnt1->charBaseBlock = 0;
-
- regBgcnt2 = (void*)(&REG_BG2CNT);
- regBgcnt2->charBaseBlock = 0;
+ ((vBgCnt *)&REG_BG1CNT)->charBaseBlock = 0;
+ ((vBgCnt *)&REG_BG2CNT)->charBaseBlock = 0;
}
static bool8 LoadAppropiateBankSprite(u8 bank)
@@ -251,11 +243,11 @@ static void sub_807B184(u8 bank)
if (GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_HP) == 0)
return;
GetMonSpriteTemplate_803C56C(GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES), GetBankIdentity(bank));
- gObjectBankIDs[bank] = CreateSprite(&gUnknown_02024E8C, sub_8077ABC(bank, 2), posY, sub_8079E90(bank));
+ gObjectBankIDs[bank] = CreateSprite(&gUnknown_02024E8C, GetBankPosition(bank, 2), posY, sub_8079E90(bank));
gSprites[gObjectBankIDs[bank]].oam.paletteNum = bank;
gSprites[gObjectBankIDs[bank]].callback = SpriteCallbackDummy;
- gSprites[gObjectBankIDs[bank]].data0 = bank;
- gSprites[gObjectBankIDs[bank]].data2 = GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES);
+ gSprites[gObjectBankIDs[bank]].data[0] = bank;
+ gSprites[gObjectBankIDs[bank]].data[2] = GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES);
StartSpriteAnim(&gSprites[gObjectBankIDs[bank]], gBattleMonForms[bank]);
}
else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && bank == 0)
@@ -266,7 +258,7 @@ static void sub_807B184(u8 bank)
sub_8079E90(0));
gSprites[gObjectBankIDs[bank]].oam.paletteNum = bank;
gSprites[gObjectBankIDs[bank]].callback = SpriteCallbackDummy;
- gSprites[gObjectBankIDs[bank]].data0 = bank;
+ gSprites[gObjectBankIDs[bank]].data[0] = bank;
}
else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && bank == 0)
{
@@ -276,18 +268,18 @@ static void sub_807B184(u8 bank)
sub_8079E90(0));
gSprites[gObjectBankIDs[bank]].oam.paletteNum = bank;
gSprites[gObjectBankIDs[bank]].callback = SpriteCallbackDummy;
- gSprites[gObjectBankIDs[bank]].data0 = bank;
+ gSprites[gObjectBankIDs[bank]].data[0] = bank;
}
else
{
if (GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_HP) == 0)
return;
GetMonSpriteTemplate_803C56C(GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES), GetBankIdentity(bank));
- gObjectBankIDs[bank] = CreateSprite(&gUnknown_02024E8C, sub_8077ABC(bank, 2), posY, sub_8079E90(bank));
+ gObjectBankIDs[bank] = CreateSprite(&gUnknown_02024E8C, GetBankPosition(bank, 2), posY, sub_8079E90(bank));
gSprites[gObjectBankIDs[bank]].oam.paletteNum = bank;
gSprites[gObjectBankIDs[bank]].callback = SpriteCallbackDummy;
- gSprites[gObjectBankIDs[bank]].data0 = bank;
- gSprites[gObjectBankIDs[bank]].data2 = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES);
+ gSprites[gObjectBankIDs[bank]].data[0] = bank;
+ gSprites[gObjectBankIDs[bank]].data[2] = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES);
StartSpriteAnim(&gSprites[gObjectBankIDs[bank]], gBattleMonForms[bank]);
}
gSprites[gObjectBankIDs[bank]].invisible = ewram17800[bank].invisible;
diff --git a/src/smokescreen.c b/src/battle/smokescreen.c
index 8345cb6ad..dc2887007 100644
--- a/src/smokescreen.c
+++ b/src/battle/smokescreen.c
@@ -22,28 +22,28 @@ u8 sub_8046234(s16 x, s16 y, u8 a3)
mainSpriteId = CreateInvisibleSpriteWithCallback(sub_8046388);
mainSprite = &gSprites[mainSpriteId];
- mainSprite->data1 = a3;
+ mainSprite->data[1] = a3;
spriteId1 = CreateSprite(&gSpriteTemplate_81FAF0C, x - 16, y - 16, 2);
- gSprites[spriteId1].data0 = mainSpriteId;
- mainSprite->data0++;
+ gSprites[spriteId1].data[0] = mainSpriteId;
+ mainSprite->data[0]++;
AnimateSprite(&gSprites[spriteId1]);
spriteId2 = CreateSprite(&gSpriteTemplate_81FAF0C, x, y - 16, 2);
- gSprites[spriteId2].data0 = mainSpriteId;
- mainSprite->data0++;
+ gSprites[spriteId2].data[0] = mainSpriteId;
+ mainSprite->data[0]++;
StartSpriteAnim(&gSprites[spriteId2], 1);
AnimateSprite(&gSprites[spriteId2]);
spriteId3 = CreateSprite(&gSpriteTemplate_81FAF0C, x - 16, y, 2);
- gSprites[spriteId3].data0 = mainSpriteId;
- mainSprite->data0++;
+ gSprites[spriteId3].data[0] = mainSpriteId;
+ mainSprite->data[0]++;
StartSpriteAnim(&gSprites[spriteId3], 2);
AnimateSprite(&gSprites[spriteId3]);
spriteId4 = CreateSprite(&gSpriteTemplate_81FAF0C, x, y, 2);
- gSprites[spriteId4].data0 = mainSpriteId;
- mainSprite->data0++;
+ gSprites[spriteId4].data[0] = mainSpriteId;
+ mainSprite->data[0]++;
StartSpriteAnim(&gSprites[spriteId4], 3);
AnimateSprite(&gSprites[spriteId4]);
@@ -52,11 +52,11 @@ u8 sub_8046234(s16 x, s16 y, u8 a3)
static void sub_8046388(struct Sprite *sprite)
{
- if (!sprite->data0)
+ if (!sprite->data[0])
{
FreeSpriteTilesByTag(gUnknown_081FAEA4.tag);
FreeSpritePaletteByTag(gUnknown_081FAEAC.tag);
- if (!sprite->data1)
+ if (!sprite->data[1])
DestroySprite(sprite);
else
sprite->callback = SpriteCallbackDummy;
@@ -67,7 +67,7 @@ void sub_80463CC(struct Sprite *sprite)
{
if (sprite->animEnded)
{
- gSprites[sprite->data0].data0--;
+ gSprites[sprite->data[0]].data[0]--;
DestroySprite(sprite);
}
}
diff --git a/src/battle_2.c b/src/battle_2.c
deleted file mode 100644
index 106d3333b..000000000
--- a/src/battle_2.c
+++ /dev/null
@@ -1,2441 +0,0 @@
-#include "global.h"
-#include "abilities.h"
-#include "battle.h"
-#include "battle_interface.h"
-#include "battle_setup.h"
-#include "data2.h"
-#include "item.h"
-#include "link.h"
-#include "main.h"
-#include "name_string_util.h"
-#include "palette.h"
-#include "party_menu.h"
-#include "pokeball.h"
-#include "pokedex.h"
-#include "pokemon.h"
-#include "rng.h"
-#include "rom3.h"
-#include "rom_8077ABC.h"
-#include "rom_8094928.h"
-#include "songs.h"
-#include "sound.h"
-#include "species.h"
-#include "sprite.h"
-#include "task.h"
-#include "text.h"
-#include "trig.h"
-#include "unknown_task.h"
-#include "util.h"
-#include "items.h"
-#include "hold_effects.h"
-#include "battle_move_effects.h"
-
-struct UnknownStruct6
-{
- u16 unk0[0xA0];
- u8 fillerA0[0x640];
- u16 unk780[0xA0];
-};
-
-struct UnknownStruct7
-{
- u8 unk0;
- u8 unk1;
- u8 unk2;
- u8 unk3;
-};
-
-struct UnknownStruct8
-{
- u8 unk0[7];
- u8 unk7;
- u8 unk8[18];
- 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;
- u8 filler4[0x54];
-};
-
-extern const u16 gUnknown_08D004E0[];
-extern const struct MonCoords gCastformFrontSpriteCoords[];
-
-extern u8 ewram[];
-#define ewram0 (*(struct UnknownStruct7 *)(ewram + 0x0))
-#define ewram4 (*(struct UnknownStruct8 *)(ewram + 0x4))
-#define ewram16000 (ewram[0x16000])
-#define ewram16001 (ewram[0x16001])
-#define ewram16002 (ewram[0x16002])
-#define ewram16003 (ewram[0x16003])
-#define ewram1600C (ewram[0x1600C])
-#define ewram1600E (ewram[0x1600E])
-#define ewram1601B (ewram[0x1601B])
-#define ewram16020 ((u8 *)(ewram + 0x16020))
-#define ewram16056 (ewram[0x16056])
-#define ewram16058 (ewram[0x16058])
-#define ewram16059 (ewram[0x16059])
-#define ewram16078 (ewram[0x16078])
-#define ewram16084 (ewram[0x16084])
-#define ewram16086 (ewram[0x16086])
-#define ewram16087 (ewram[0x16087])
-#define ewram16088 (ewram[0x16088])
-#define ewram16089 (ewram[0x16089])
-#define ewram160A1 (ewram[0x160A1])
-#define ewram160A6 (ewram[0x160A6])
-#define ewram160AC ((u8 *)(ewram + 0x160AC))
-#define ewram160BC ((u16 *)(ewram + 0x160BC)) // hp
-#define ewram160C8 (ewram[0x160C8])
-#define ewram160C9 (ewram[0x160C9])
-#define ewram160CB (ewram[0x160CB])
-#define ewram160CC ((u8 *)(ewram + 0x160CC))
-#define ewram160E6 (ewram[0x160E6])
-#define ewram160E8 ((u8 *)(ewram + 0x160E8))
-#define ewram160F0 ((u8 *)(ewram + 0x160F0))
-#define ewram160F9 (ewram[0x160F9])
-#define ewram16100 ((u8 *)(ewram + 0x16100))
-#define ewram16108 ((u8 *)(ewram + 0x16108))
-#define ewram16110 (ewram[0x16110])
-#define ewram16111 (ewram[0x16111])
-#define ewram16113 (ewram[0x16113])
-#define ewram17100 ((u32 *)(ewram + 0x17100))
-#define ewram17130 (ewram[0x17130])
-#define ewram17160 (ewram[0x17160])
-#define ewram1D000 ((struct Pokemon *)(ewram + 0x1D000))
-
-extern struct UnknownPokemonStruct2 gUnknown_02023A00[];
-extern u8 gBattleBufferB[][0x200];
-extern u8 gActiveBank;
-extern u32 gBattleExecBuffer;
-extern u8 gNoOfAllBanks;
-extern u16 gBattlePartyID[];
-extern u8 gFightStateTracker;
-extern u8 gTurnOrder[];
-extern struct UnknownStruct12 gUnknown_02024AD0[];
-extern u8 gObjectBankIDs[];
-extern u16 gCurrentMove;
-extern u8 gLastUsedAbility;
-extern u8 gStringBank;
-extern u8 gAbsentBankFlags;
-extern u8 gMultiHitCounter;
-extern u8 gActionForBanks[];
-extern u16 gUnknown_02024C2C[];
-extern u16 gLastUsedMove[];
-extern u16 gMoveHitWith[];
-extern u16 gUnknown_02024C44[];
-extern u16 gUnknown_02024C4C[];
-extern u16 gLockedMove[];
-extern u8 gUnknown_02024C5C[];
-extern u16 gChosenMovesByBanks[];
-extern u32 gHitMarker;
-extern u8 gUnknown_02024C70[];
-extern u16 gSideAffecting[];
-extern u32 gStatuses3[];
-//extern u8 gDisableStructs[][0x1C];
-extern u16 gPauseCounterBattle;
-extern u16 gPaydayMoney;
-extern u16 gRandomTurnNumber;
-extern u8 gBattleCommunication[];
-extern u8 gUnknown_02024D1F[]; // I don't actually know what type this is.
-extern u8 gBattleOutcome;
-extern u16 gUnknown_02024DE8;
-extern u8 gActionSelectionCursor[];
-extern u8 gMoveSelectionCursor[];
-extern u8 gUnknown_02038470[];
-extern u16 gUnknown_030041B0;
-extern u16 gUnknown_030041B4;
-extern u16 gUnknown_030041B8;
-extern struct Window gUnknown_030041D0;
-extern u16 gUnknown_03004200;
-extern struct Window gUnknown_03004210;
-extern u16 gUnknown_03004244;
-extern struct Window gUnknown_03004250;
-extern u16 gUnknown_03004240;
-extern u16 gUnknown_03004280;
-extern u32 gUnknown_03004284;
-extern u16 gUnknown_03004288;
-extern u16 gUnknown_030042A0;
-extern u16 gUnknown_030042A4;
-extern u16 gUnknown_030042C0;
-extern u16 gUnknown_030042C4;
-extern MainCallback gPreBattleCallback1;
-extern void (*gBattleMainFunc)(void);
-extern u8 gLeveledUpInBattle;
-extern void (*gBattleBankFunc[])(void);
-extern u8 gHealthboxIDs[];
-extern struct UnknownStruct6 gUnknown_03004DE0;
-//extern u16 gUnknown_03004DE0[][0xA0]; // possibly?
-extern u16 gBattleTypeFlags;
-extern s8 gBattleTerrain; // I'm not sure if this is supposed to be s8 or u8. Regardless, it must have the same type as the return value of GetBattleTerrain.
-extern u8 gReservedSpritePaletteCount;
-extern u16 gTrainerBattleOpponent;
-extern struct BattleEnigmaBerry gEnigmaBerries[];
-extern u16 gBlockRecvBuffer[MAX_LINK_PLAYERS][BLOCK_BUFFER_SIZE / 2];
-extern u8 gBattleMonForms[];
-extern u8 gBankAttacker;
-extern u8 gBankTarget;
-extern u16 gBattleWeather;
-extern u32 gBattleMoveDamage;
-extern struct BattlePokemon gBattleMons[];
-extern u8 gBattleMoveFlags;
-
-static void BattlePrepIntroSlide(void);
-
-void sub_800E7C4(void)
-{
- if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
- {
- sub_800B858();
- SetMainCallback2(sub_800F104);
- gBattleCommunication[0] = 0;
- }
- else
- {
- InitBattle();
- }
-}
-
-void InitBattle(void)
-{
- s32 i;
-
- SetHBlankCallback(NULL);
- SetVBlankCallback(NULL);
-
- CpuFill32(0, (void *)VRAM, VRAM_SIZE);
-
- REG_MOSAIC = 0;
- REG_WIN0H = 0xF0;
- REG_WIN0V = 0x5051;
- REG_WININ = 0;
- REG_WINOUT = 0;
- gUnknown_030042C4 = 0xF0;
- gUnknown_03004240 = 0x5051;
- dp12_8087EA4();
-
- for (i = 0; i < 80; i++)
- {
- gUnknown_03004DE0.unk0[i] = 0xF0;
- gUnknown_03004DE0.unk780[i] = 0xF0;
- }
- for (i = 80; i < 160; i++)
- {
- asm(""::"r"(i)); // Needed to stop the compiler from optimizing out the loop counter
- gUnknown_03004DE0.unk0[i] = 0xFF10;
- gUnknown_03004DE0.unk780[i] = 0xFF10;
- }
- sub_80895F8(gUnknown_081F9674.unk0, gUnknown_081F9674.unk4, gUnknown_081F9674.unk8);
- SetUpWindowConfig(&gWindowConfig_81E6C58);
- ResetPaletteFade();
- gUnknown_030042A4 = 0;
- gUnknown_030042A0 = 0;
- gUnknown_030042C0 = 0;
- gUnknown_030041B4 = 0;
- gUnknown_03004288 = 0;
- gUnknown_03004280 = 0;
- gUnknown_030041B0 = 0;
- gUnknown_030041B8 = 0;
- gBattleTerrain = GetBattleTerrain();
- InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6C58);
- InitWindowFromConfig(&gUnknown_030041D0, &gWindowConfig_81E71D0);
- InitWindowFromConfig(&gUnknown_03004250, &gWindowConfig_81E71EC);
- sub_800D6D4();
- sub_800DAB8();
- ResetSpriteData();
- ResetTasks();
- sub_800E23C();
- FreeAllSpritePalettes();
- gReservedSpritePaletteCount = 4;
- SetVBlankCallback(sub_800FCFC);
- setup_poochyena_battle();
- if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
- SetMainCallback2(sub_800F298);
- else
- SetMainCallback2(sub_800EC9C);
- if (!(gBattleTypeFlags & BATTLE_TYPE_LINK))
- {
- CreateNPCTrainerParty(gEnemyParty, gTrainerBattleOpponent);
- SetWildMonHeldItem();
- }
- gMain.inBattle = TRUE;
- for (i = 0; i < 6; i++)
- AdjustFriendship(&gPlayerParty[i], 3);
- gBattleCommunication[0] = 0;
-}
-
-void sub_800E9EC(void)
-{
- u16 r6 = 0;
- u16 species;
- u16 hp;
- u32 status;
- s32 i;
-
- for (i = 0; i < 6; i++)
- {
- species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
- hp = GetMonData(&gPlayerParty[i], MON_DATA_HP);
- status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS);
-
- if (species == 0)
- continue;
- if (species != SPECIES_EGG && hp != 0 && status == 0)
- r6 |= 1 << i * 2;
-
- if (species == 0)
- continue;
- if (hp != 0 && (species == SPECIES_EGG || status != 0))
- r6 |= 2 << i * 2;
-
- if (species == 0)
- continue;
- if (species != SPECIES_EGG && hp == 0)
- r6 |= 3 << i * 2;
- }
- ewram0.unk2 = r6;
- ewram0.unk3 = r6 >> 8;
-}
-
-void sub_800EAAC(void)
-{
- s32 i;
- struct UnknownStruct8 *_ewram4 = &ewram4;
-
- for (i = 0; i < 7; i++)
- _ewram4->unk0[i] = gSaveBlock1.enigmaBerry.berry.name[i];
- for (i = 0; i < 18; i++)
- _ewram4->unk8[i] = gSaveBlock1.enigmaBerry.itemEffect[i];
- _ewram4->unk7 = gSaveBlock1.enigmaBerry.holdEffect;
- _ewram4->unk1A = gSaveBlock1.enigmaBerry.holdEffectParam;
-}
-
-void sub_800EB08(void)
-{
- s32 i;
- s32 j;
-
- if (!(gBattleTypeFlags & BATTLE_TYPE_LINK))
- {
- for (i = 0; i < 7; i++)
- {
- gEnigmaBerries[0].name[i] = gSaveBlock1.enigmaBerry.berry.name[i];
- gEnigmaBerries[2].name[i] = gSaveBlock1.enigmaBerry.berry.name[i];
- }
- for (i = 0; i < 18; i++)
- {
- gEnigmaBerries[0].itemEffect[i] = gSaveBlock1.enigmaBerry.itemEffect[i];
- gEnigmaBerries[2].itemEffect[i] = gSaveBlock1.enigmaBerry.itemEffect[i];
- }
- gEnigmaBerries[0].holdEffect = gSaveBlock1.enigmaBerry.holdEffect;
- gEnigmaBerries[2].holdEffect = gSaveBlock1.enigmaBerry.holdEffect;
- gEnigmaBerries[0].holdEffectParam = gSaveBlock1.enigmaBerry.holdEffectParam;
- gEnigmaBerries[2].holdEffectParam = gSaveBlock1.enigmaBerry.holdEffectParam;
- }
- else
- {
- s32 numPlayers;
- struct BattleEnigmaBerry *src;
- u8 r4;
-
- if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
- numPlayers = 4;
- else
- numPlayers = 2;
- for (i = 0; i < numPlayers; i++)
- {
- src = (struct BattleEnigmaBerry *)(gBlockRecvBuffer[i] + 2);
- r4 = gLinkPlayers[i].lp_field_18;
-
- for (j = 0; j < 7; j++)
- gEnigmaBerries[r4].name[j] = src->name[j];
- for (j = 0; j < 18; j++)
- gEnigmaBerries[r4].itemEffect[j] = src->itemEffect[j];
- gEnigmaBerries[r4].holdEffect = src->holdEffect;
- gEnigmaBerries[r4].holdEffectParam = src->holdEffectParam;
- }
- }
-}
-
-void shedinja_something(struct Pokemon *pkmn)
-{
- u8 nickname[POKEMON_NAME_LENGTH + 1];
- u8 language = 1;
-
- if (GetMonData(pkmn, MON_DATA_SPECIES) == SPECIES_SHEDINJA
- && GetMonData(pkmn, MON_DATA_LANGUAGE) != language)
- {
- GetMonData(pkmn, MON_DATA_NICKNAME, nickname);
- if (StringCompareWithoutExtCtrlCodes(nickname, gUnknown_081F96C8) == 0)
- SetMonData(pkmn, MON_DATA_LANGUAGE, &language);
- }
-}
-
-void sub_800EC9C(void)
-{
- u8 playerId;
- u8 enemyId;
-
- RunTasks();
- AnimateSprites();
- BuildOamBuffer();
- playerId = GetMultiplayerId();
- ewram160CB = playerId;
- enemyId = playerId ^ 1;
-
- switch (gBattleCommunication[0])
- {
- case 0:
- if (gBattleTypeFlags & BATTLE_TYPE_LINK)
- {
- if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC())
- {
- ewram0.unk0 = 1;
- ewram0.unk1 = 1;
- sub_800E9EC();
- sub_800EAAC();
- SendBlock(bitmask_all_link_players_but_self(), &ewram0, 32);
- gBattleCommunication[0] = 1;
- }
- }
- else
- {
- gBattleTypeFlags |= BATTLE_TYPE_WILD;
- gBattleCommunication[0] = 8;
- sub_800EB08();
- }
- break;
- case 1:
- if ((GetBlockReceivedStatus() & 3) == 3)
- {
- s32 id;
- u8 taskId;
-
- ResetBlockReceivedFlags();
- id = 0;
- if (gBlockRecvBuffer[0][0] == 0x100)
- {
- if (playerId == 0)
- gBattleTypeFlags |= 12;
- else
- gBattleTypeFlags |= 8;
- id++;
- }
- if (id == 0)
- {
- if (gBlockRecvBuffer[0][0] == gBlockRecvBuffer[1][0])
- {
- if (playerId == 0)
- gBattleTypeFlags |= 12;
- else
- gBattleTypeFlags |= 8;
- id++;
- }
- if (id == 0)
- {
- while (id < 2)
- {
- if (gBlockRecvBuffer[id][0] > 0x0101 && id != playerId)
- break;
- id++;
- }
- if (id == 2)
- gBattleTypeFlags |= 12;
- else
- gBattleTypeFlags |= 8;
- }
- }
- sub_800EB08();
- taskId = CreateTask(sub_800DE30, 0);
- gTasks[taskId].data[1] = 0x10E;
- gTasks[taskId].data[2] = 0x5A;
- gTasks[taskId].data[5] = 0;
- gTasks[taskId].data[3] = ewram0.unk2 | (ewram0.unk3 << 8);
- gTasks[taskId].data[4] = gBlockRecvBuffer[enemyId][1];
- gBattleCommunication[0]++;
- }
- break;
- case 2:
- if (sub_8007ECC())
- {
- SendBlock(bitmask_all_link_players_but_self(), gPlayerParty, sizeof(*gPlayerParty) * 2);
- gBattleCommunication[0]++;
- }
- break;
- case 3:
- if ((GetBlockReceivedStatus() & 3) == 3)
- {
- ResetBlockReceivedFlags();
- memcpy(gEnemyParty, gBlockRecvBuffer[enemyId], sizeof(*gEnemyParty) * 2);
- gBattleCommunication[0]++;
- }
- break;
- case 4:
- if (sub_8007ECC())
- {
- SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 2, sizeof(*gPlayerParty) * 2);
- gBattleCommunication[0]++;
- }
- break;
- case 5:
- if ((GetBlockReceivedStatus() & 3) == 3)
- {
- ResetBlockReceivedFlags();
- memcpy(gEnemyParty + 2, gBlockRecvBuffer[enemyId], sizeof(*gEnemyParty) * 2);
- gBattleCommunication[0]++;
- }
- break;
- case 6:
- if (sub_8007ECC())
- {
- SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 4, sizeof(*gPlayerParty) * 2);
- gBattleCommunication[0]++;
- }
- break;
- case 7:
- if ((GetBlockReceivedStatus() & 3) == 3)
- {
- ResetBlockReceivedFlags();
- memcpy(gEnemyParty + 4, gBlockRecvBuffer[enemyId], sizeof(*gEnemyParty) * 2);
- shedinja_something(&gEnemyParty[0]);
- shedinja_something(&gEnemyParty[1]);
- shedinja_something(&gEnemyParty[2]);
- shedinja_something(&gEnemyParty[3]);
- shedinja_something(&gEnemyParty[4]);
- shedinja_something(&gEnemyParty[5]);
- gBattleCommunication[0]++;
- }
- break;
- case 8:
- sub_800B950();
- gBattleCommunication[0]++;
- gBattleCommunication[1] = 0;
- gBattleCommunication[2] = 0;
- break;
- case 9:
- if (battle_load_something(gUnknown_02024D1F, gUnknown_02024D1F + 1) != 0)
- {
- gPreBattleCallback1 = gMain.callback1;
- gMain.callback1 = sub_8010824;
- SetMainCallback2(sub_800F808);
- if (gBattleTypeFlags & BATTLE_TYPE_LINK)
- {
- gTrainerBattleOpponent = 0x800;
- gBattleTypeFlags |= BATTLE_TYPE_20;
- }
- }
- break;
- }
-}
-
-void sub_800F02C(void)
-{
- s32 i;
-
- for (i = 0; i < 3; i++)
- {
- u8 *nickname = gUnknown_02023A00[i].nickname;
-
- gUnknown_02023A00[i].species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES);
- gUnknown_02023A00[i].heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM);
- GetMonData(&gPlayerParty[i], MON_DATA_NICKNAME, nickname);
- gUnknown_02023A00[i].level = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL);
- gUnknown_02023A00[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP);
- gUnknown_02023A00[i].maxhp = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP);
- gUnknown_02023A00[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS);
- gUnknown_02023A00[i].personality = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY);
- gUnknown_02023A00[i].gender = GetMonGender(&gPlayerParty[i]);
- StripExtCtrlCodes(nickname);
- gUnknown_02023A00[i].language = GetMonData(&gPlayerParty[i], MON_DATA_LANGUAGE);
- if (gUnknown_02023A00[i].language != 1)
- PadNameString(nickname, 0);
- }
- memcpy(ewram, gUnknown_02023A00, 0x60);
-}
-
-void sub_800F104(void)
-{
- u8 playerId;
- MainCallback *pSavedCallback;
- u16 *pSavedBattleTypeFlags;
-
- playerId = GetMultiplayerId();
- ewram160CB = playerId;
- // Seriously, Game Freak?
- pSavedCallback = (MainCallback *)(ewram + 0x160C4);
- pSavedBattleTypeFlags = (u16 *)(ewram + 0x160C2);
- RunTasks();
- AnimateSprites();
- BuildOamBuffer();
-
- switch (gBattleCommunication[0])
- {
- case 0:
- if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC())
- {
- sub_800F02C();
- SendBlock(bitmask_all_link_players_but_self(), ewram, 0x60);
- gBattleCommunication[0]++;
- }
- break;
- case 1:
- if ((GetBlockReceivedStatus() & 0xF) == 0xF)
- {
- s32 i;
-
- ResetBlockReceivedFlags();
- for (i = 0; i < 4; i++)
- {
- if (i != playerId)
- {
- if ((!(gLinkPlayers[i].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1))
- || ((gLinkPlayers[i].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1)))
- memcpy(gUnknown_02023A00, gBlockRecvBuffer[i], 0x60);
- }
- }
- gBattleCommunication[0]++;
- *pSavedCallback = gMain.savedCallback;
- *pSavedBattleTypeFlags = gBattleTypeFlags;
- gMain.savedCallback = sub_800F104;
- OpenPartyMenu(5, 0);
- }
- break;
- case 2:
- if (!gPaletteFade.active)
- {
- gBattleCommunication[0] = 3;
- sub_800832C();
- }
- break;
- case 3:
- if (gReceivedRemoteLinkPlayers == 0)
- {
- gBattleTypeFlags = *pSavedBattleTypeFlags;
- gMain.savedCallback = *pSavedCallback;
- SetMainCallback2(InitBattle);
- }
- break;
- }
-}
-
-void sub_800F298(void)
-{
- u8 playerId;
- s32 id;
-
- playerId = GetMultiplayerId();
- ewram160CB = playerId;
- RunTasks();
- AnimateSprites();
- BuildOamBuffer();
- switch (gBattleCommunication[0])
- {
- case 0:
- if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC())
- {
- ewram0.unk0 = 1;
- ewram0.unk1 = 1;
- sub_800E9EC();
- sub_800EAAC();
- SendBlock(bitmask_all_link_players_but_self(), ewram, 0x20);
- gBattleCommunication[0]++;
- }
- break;
- case 1:
- if ((GetBlockReceivedStatus() & 0xF) == 0xF)
- {
- u8 taskId;
-
- ResetBlockReceivedFlags();
- id = 0;
- if (gBlockRecvBuffer[0][0] == 0x100)
- {
- if (playerId == 0)
- gBattleTypeFlags |= 12;
- else
- gBattleTypeFlags |= 8;
- id++;
- }
- if (id == 0)
- {
- s32 i;
-
- for (i = 0; i < MAX_LINK_PLAYERS; i++)
- {
- if (gBlockRecvBuffer[0][0] != gBlockRecvBuffer[i][0])
- break;
- }
- if (i == MAX_LINK_PLAYERS)
- {
- if (playerId == 0)
- gBattleTypeFlags |= 12;
- else
- gBattleTypeFlags |= 8;
- id++;
- }
- if (id == 0)
- {
- while (id < MAX_LINK_PLAYERS)
- {
- if (gBlockRecvBuffer[id][0] == 0x0101 && id != playerId)
- if (id < playerId)
- break;
- if (gBlockRecvBuffer[id][0] > 0x0101 && id != playerId)
- break;
- id++;
- }
- if (id == MAX_LINK_PLAYERS)
- gBattleTypeFlags |= 12;
- else
- gBattleTypeFlags |= 8;
- }
- }
- sub_800EB08();
- memcpy(ewram1D000, gPlayerParty, sizeof(struct Pokemon) * 3);
- taskId = CreateTask(sub_800DE30, 0);
- gTasks[taskId].data[1] = 0x10E;
- gTasks[taskId].data[2] = 0x5A;
- gTasks[taskId].data[5] = 0;
- gTasks[taskId].data[3] = 0;
- gTasks[taskId].data[4] = 0;
- for (id = 0; id < MAX_LINK_PLAYERS; id++)
- {
- switch (gLinkPlayers[id].lp_field_18)
- {
- case 0:
- gTasks[taskId].data[3] |= gBlockRecvBuffer[id][1] & 0x3F;
- break;
- case 1:
- gTasks[taskId].data[4] |= gBlockRecvBuffer[id][1] & 0x3F;
- break;
- case 2:
- gTasks[taskId].data[3] |= (gBlockRecvBuffer[id][1] & 0x3F) << 6;
- break;
- case 3:
- gTasks[taskId].data[4] |= (gBlockRecvBuffer[id][1] & 0x3F) << 6;
- break;
- }
- }
- ZeroPlayerPartyMons();
- ZeroEnemyPartyMons();
- gBattleCommunication[0]++;
- goto step_2;
- }
- break;
- case 2:
- step_2:
- if (sub_8007ECC())
- {
- SendBlock(bitmask_all_link_players_but_self(), ewram1D000, sizeof(struct Pokemon) * 2);
- gBattleCommunication[0]++;
- }
- break;
- case 3:
- if ((GetBlockReceivedStatus() & 0xF) == 0xF)
- {
- ResetBlockReceivedFlags();
- for (id = 0; id < MAX_LINK_PLAYERS; id++)
- {
- if (id == playerId)
- {
- switch (gLinkPlayers[id].lp_field_18)
- {
- case 0:
- case 3:
- memcpy(gPlayerParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
- break;
- case 1:
- case 2:
- memcpy(gPlayerParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
- break;
- }
- }
- else
- {
- if ((!(gLinkPlayers[id].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1))
- || ((gLinkPlayers[id].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1)))
- {
- switch (gLinkPlayers[id].lp_field_18)
- {
- case 0:
- case 3:
- memcpy(gPlayerParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
- break;
- case 1:
- case 2:
- memcpy(gPlayerParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
- break;
- }
- }
- else
- {
- switch (gLinkPlayers[id].lp_field_18)
- {
- case 0:
- case 3:
- memcpy(gEnemyParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
- break;
- case 1:
- case 2:
- memcpy(gEnemyParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
- break;
- }
- }
- }
- }
- gBattleCommunication[0]++;
- }
- break;
- case 4:
- if (sub_8007ECC())
- {
- SendBlock(bitmask_all_link_players_but_self(), ewram1D000 + 2, sizeof(struct Pokemon));
- gBattleCommunication[0]++;
- }
- break;
- case 5:
- if ((GetBlockReceivedStatus() & 0xF) == 0xF)
- {
- ResetBlockReceivedFlags();
- for (id = 0; id < MAX_LINK_PLAYERS; id++)
- {
- if (id == playerId)
- {
- switch (gLinkPlayers[id].lp_field_18)
- {
- case 0:
- case 3:
- memcpy(gPlayerParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon));
- break;
- case 1:
- case 2:
- memcpy(gPlayerParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon));
- break;
- }
- }
- else
- {
- if ((!(gLinkPlayers[id].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1))
- || ((gLinkPlayers[id].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1)))
- {
- switch (gLinkPlayers[id].lp_field_18)
- {
- case 0:
- case 3:
- memcpy(gPlayerParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon));
- break;
- case 1:
- case 2:
- memcpy(gPlayerParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon));
- break;
- }
- }
- else
- {
- switch (gLinkPlayers[id].lp_field_18)
- {
- case 0:
- case 3:
- memcpy(gEnemyParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon));
- break;
- case 1:
- case 2:
- memcpy(gEnemyParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon));
- break;
- }
- }
- }
- }
-
- shedinja_something(&gPlayerParty[0]);
- shedinja_something(&gPlayerParty[1]);
- shedinja_something(&gPlayerParty[2]);
- shedinja_something(&gPlayerParty[3]);
- shedinja_something(&gPlayerParty[4]);
- shedinja_something(&gPlayerParty[5]);
-
- shedinja_something(&gEnemyParty[0]);
- shedinja_something(&gEnemyParty[1]);
- shedinja_something(&gEnemyParty[2]);
- shedinja_something(&gEnemyParty[3]);
- shedinja_something(&gEnemyParty[4]);
- shedinja_something(&gEnemyParty[5]);
-
- gBattleCommunication[0]++;
- }
- break;
- case 6:
- sub_800B950();
- gBattleCommunication[0]++;
- gBattleCommunication[1] = 0;
- gBattleCommunication[2] = 0;
- break;
- case 7:
- if (battle_load_something(gUnknown_02024D1F, gUnknown_02024D1F + 1) != 0)
- {
- gPreBattleCallback1 = gMain.callback1;
- gMain.callback1 = sub_8010824;
- SetMainCallback2(sub_800F808);
- if (gBattleTypeFlags & BATTLE_TYPE_LINK)
- {
- gTrainerBattleOpponent = 0x800;
- gBattleTypeFlags |= BATTLE_TYPE_20;
- }
- }
- break;
- }
-}
-
-void sub_800F808(void)
-{
- AnimateSprites();
- BuildOamBuffer();
- sub_800374C(&gUnknown_03004210);
- UpdatePaletteFade();
- RunTasks();
-}
-
-void sub_800F828(struct Sprite *sprite)
-{
- sprite->data0 = 0;
- sprite->callback = sub_800F838;
-}
-
-void sub_800F838(struct Sprite *sprite)
-{
- u16 *arr = (u16 *)ewram;
-
- switch (sprite->data0)
- {
- case 0:
- sprite->data0++;
- sprite->data1 = 0;
- sprite->data2 = 0x281;
- sprite->data3 = 0;
- sprite->data4 = 1;
- // fall through
- case 1:
- sprite->data4--;
- if (sprite->data4 == 0)
- {
- s32 i;
- s32 r2;
- s32 r0;
-
- sprite->data4 = 2;
- r2 = sprite->data1 + sprite->data3 * 32;
- r0 = sprite->data2 - sprite->data3 * 32;
- for (i = 0; i < 29; i += 2)
- {
- arr[r2 + i] = 0x3D;
- arr[r0 + i] = 0x3D;
- }
- sprite->data3++;
- if (sprite->data3 == 21)
- {
- sprite->data0++;
- sprite->data1 = 32;
- }
- }
- break;
- case 2:
- sprite->data1--;
- if (sprite->data1 == 20)
- SetMainCallback2(sub_800E7C4);
- break;
- }
-}
-
-u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum)
-{
- u32 nameHash = 0;
- s32 i;
-
- if (trainerNum == 0x400)
- return 0;
-
- if ((gBattleTypeFlags & 0x908) == 8)
- {
- ZeroEnemyPartyMons();
- for (i = 0; i < gTrainers[trainerNum].partySize; i++)
- {
- u32 personalityValue;
- s32 j;
- u8 fixedIV;
-
- if (gTrainers[trainerNum].doubleBattle == TRUE)
- personalityValue = 0x80;
- else if (gTrainers[trainerNum].encounterMusic_gender & 0x80)
- personalityValue = 0x78;
- else
- personalityValue = 0x88;
-
- for (j = 0; gTrainers[trainerNum].trainerName[j] != 0xFF; j++)
- nameHash += gTrainers[trainerNum].trainerName[j];
-
- switch (gTrainers[trainerNum].partyFlags)
- {
- case 0:
- {
- struct TrainerPartyMember0 *partyData = gTrainers[trainerNum].party;
-
- for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++)
- nameHash += gSpeciesNames[partyData[i].species][j];
- personalityValue += nameHash << 8;
- fixedIV = partyData[i].iv * 31 / 255;
- CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0);
- break;
- }
- case 1:
- {
- struct TrainerPartyMember1 *partyData = gTrainers[trainerNum].party;
-
- for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++)
- nameHash += gSpeciesNames[partyData[i].species][j];
- personalityValue += nameHash << 8;
- fixedIV = partyData[i].iv * 31 / 255;
- CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0);
-
- for (j = 0; j < 4; j++)
- {
- SetMonData(&party[i], MON_DATA_MOVE1 + j, (u8 *)&partyData[i].moves[j]);
- SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp);
- }
- break;
- }
- case 2:
- {
- struct TrainerPartyMember2 *partyData = gTrainers[trainerNum].party;
-
- for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++)
- nameHash += gSpeciesNames[partyData[i].species][j];
- personalityValue += nameHash << 8;
- 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);
- break;
- }
- case 3:
- {
- struct TrainerPartyMember3 *partyData = gTrainers[trainerNum].party;
-
- for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++)
- nameHash += gSpeciesNames[partyData[i].species][j];
- personalityValue += nameHash << 8;
- 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);
- for (j = 0; j < 4; j++)
- {
- SetMonData(&party[i], MON_DATA_MOVE1 + j, (u8 *)&partyData[i].moves[j]);
- SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp);
- }
- break;
- }
- }
- }
- gBattleTypeFlags |= gTrainers[trainerNum].doubleBattle;
- }
- return gTrainers[trainerNum].partySize;
-}
-
-void sub_800FCD4(void)
-{
- if (REG_VCOUNT < 0xA0 && REG_VCOUNT >= 0x6F )
- REG_BG0CNT = 0x9800;
-}
-
-void sub_800FCFC(void)
-{
- Random(); // unused return value
- REG_BG0HOFS = gUnknown_030042A4;
- REG_BG0VOFS = gUnknown_030042A0;
- REG_BG1HOFS = gUnknown_030042C0;
- REG_BG1VOFS = gUnknown_030041B4;
- REG_BG2HOFS = gUnknown_03004288;
- REG_BG2VOFS = gUnknown_03004280;
- REG_BG3HOFS = gUnknown_030041B0;
- REG_BG3VOFS = gUnknown_030041B8;
- REG_WIN0H = gUnknown_030042C4;
- REG_WIN0V = gUnknown_03004240;
- REG_WIN1H = gUnknown_03004200;
- REG_WIN1V = gUnknown_03004244;
- LoadOam();
- ProcessSpriteCopyRequests();
- TransferPlttBuffer();
- sub_8089668();
-}
-
-void nullsub_36(struct Sprite *sprite)
-{
-}
-
-void sub_800FDB0(struct Sprite *sprite)
-{
- if (sprite->data0 != 0)
- sprite->pos1.x = sprite->data1 + ((sprite->data2 & 0xFF00) >> 8);
- else
- sprite->pos1.x = sprite->data1 - ((sprite->data2 & 0xFF00) >> 8);
- sprite->data2 += 0x180;
- if (sprite->affineAnimEnded)
- {
- FreeSpriteTilesByTag(0x2710);
- FreeSpritePaletteByTag(0x2710);
- FreeSpriteOamMatrix(sprite);
- DestroySprite(sprite);
- }
-}
-
-void sub_800FE20(struct Sprite *sprite)
-{
- StartSpriteAffineAnim(sprite, 1);
- sprite->callback = sub_800FDB0;
- PlaySE(SE_BT_START);
-}
-
-void sub_800FE40(u8 taskId)
-{
- struct Pokemon *sp4 = NULL;
- struct Pokemon *sp8 = NULL;
- u8 r2 = ewram160CB;
- u32 r7;
- s32 i;
-
- if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
- {
- switch (gLinkPlayers[r2].lp_field_18)
- {
- case 0:
- case 2:
- sp4 = gPlayerParty;
- sp8 = gEnemyParty;
- break;
- case 1:
- case 3:
- sp4 = gEnemyParty;
- sp8 = gPlayerParty;
- break;
- }
- }
- else
- {
- sp4 = gPlayerParty;
- sp8 = gEnemyParty;
- }
-
- r7 = 0;
- for (i = 0; i < 6; i++)
- {
- u16 species = GetMonData(&sp4[i], MON_DATA_SPECIES2);
- u16 hp = GetMonData(&sp4[i], MON_DATA_HP);
- u32 status = GetMonData(&sp4[i], MON_DATA_STATUS);
-
- if (species == 0)
- continue;
- if (species != SPECIES_EGG && hp != 0 && status == 0)
- r7 |= 1 << i * 2;
-
- if (species == 0)
- continue;
- if (hp != 0 && (species == SPECIES_EGG || status != 0))
- r7 |= 2 << i * 2;
-
- if (species == 0)
- continue;
- if (species != SPECIES_EGG && hp == 0)
- r7 |= 3 << i * 2;
- }
- gTasks[taskId].data[3] = r7;
-
- r7 = 0;
- for (i = 0; i < 6; i++)
- {
- u16 species = GetMonData(&sp8[i], MON_DATA_SPECIES2);
- u16 hp = GetMonData(&sp8[i], MON_DATA_HP);
- u32 status = GetMonData(&sp8[i], MON_DATA_STATUS);
-
- if (species == 0)
- continue;
- if (species != SPECIES_EGG && hp != 0 && status == 0)
- r7 |= 1 << i * 2;
-
- if (species == 0)
- continue;
- if (hp != 0 && (species == SPECIES_EGG || status != 0))
- r7 |= 2 << i * 2;
-
- if (species == 0)
- continue;
- if (species != SPECIES_EGG && hp == 0)
- r7 |= 3 << i * 2;
- }
- gTasks[taskId].data[4] = r7;
-}
-
-void c2_8011A1C(void)
-{
- s32 i;
- u8 taskId;
-
- SetHBlankCallback(NULL);
- SetVBlankCallback(NULL);
- CpuFill32(0, (void *)VRAM, VRAM_SIZE);
- REG_MOSAIC = 0;
- REG_WIN0H = 0xF0;
- REG_WIN0V = 0x5051;
- REG_WININ = 0;
- REG_WINOUT = 0;
- gUnknown_030042C4 = 0xF0;
- gUnknown_03004240 = 0x5051;
- dp12_8087EA4();
-
- for (i = 0; i < 80; i++)
- {
- gUnknown_03004DE0.unk0[i] = 0xF0;
- gUnknown_03004DE0.unk780[i] = 0xF0;
- }
- for (i = 80; i < 160; i++)
- {
- asm(""::"r"(i)); // Needed to stop the compiler from optimizing out the loop counter
- gUnknown_03004DE0.unk0[i] = 0xFF10;
- gUnknown_03004DE0.unk780[i] = 0xFF10;
- }
- SetUpWindowConfig(&gWindowConfig_81E6C58);
- ResetPaletteFade();
- gUnknown_030042A4 = 0;
- gUnknown_030042A0 = 0;
- gUnknown_030042C0 = 0;
- gUnknown_030041B4 = 0;
- gUnknown_03004288 = 0;
- gUnknown_03004280 = 0;
- gUnknown_030041B0 = 0;
- gUnknown_030041B8 = 0;
-
- InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6C58);
- InitWindowFromConfig(&gUnknown_030041D0, &gWindowConfig_81E71D0);
- InitWindowFromConfig(&gUnknown_03004250, &gWindowConfig_81E71EC);
- sub_800D6D4();
- LoadCompressedPalette(gUnknown_08D004E0, 0, 64);
- sub_800D74C();
- ResetSpriteData();
- ResetTasks();
- sub_800E23C();
- REG_WINOUT = 0x37;
- FreeAllSpritePalettes();
- gReservedSpritePaletteCount = 4;
- SetVBlankCallback(sub_800FCFC);
- taskId = CreateTask(sub_800DE30, 0);
- gTasks[taskId].data[1] = 0x10E;
- gTasks[taskId].data[2] = 0x5A;
- gTasks[taskId].data[5] = 1;
- sub_800FE40(taskId);
- SetMainCallback2(sub_80101B8);
- gBattleCommunication[0] = 0;
-}
-
-void sub_80101B8(void)
-{
- c2_081284E0();
- AnimateSprites();
- BuildOamBuffer();
- UpdatePaletteFade();
- RunTasks();
-}
-
-void c2_081284E0(void)
-{
- switch (gBattleCommunication[0])
- {
- case 0:
- gBattleCommunication[1] = 0xFF;
- gBattleCommunication[0]++;
- break;
- case 1:
- gBattleCommunication[1]--;
- if (gBattleCommunication[1] == 0)
- {
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
- gBattleCommunication[0]++;
- }
- break;
- case 2:
- if (!gPaletteFade.active)
- SetMainCallback2(gMain.savedCallback);
- break;
- }
-}
-
-void oac_poke_opponent(struct Sprite *sprite)
-{
- sprite->callback = sub_8010278;
- StartSpriteAnimIfDifferent(sprite, 0);
- BeginNormalPaletteFade(0x00020000, 0, 10, 10, 0x3DEF);
-}
-
-void sub_8010278(struct Sprite *sprite)
-{
- if ((gUnknown_02024DE8 & 1) == 0)
- {
- sprite->pos2.x += 2;
- if (sprite->pos2.x == 0)
- {
- sprite->callback = sub_80102AC;
- PlayCry1(sprite->data2, 25);
- }
- }
-}
-
-void sub_80102AC(struct Sprite *sprite)
-{
- if (sprite->animEnded)
- {
- sub_804777C(sprite->data0);
- sub_8043DFC(gHealthboxIDs[sprite->data0]);
- sprite->callback = nullsub_37;
- StartSpriteAnimIfDifferent(sprite, 0);
- BeginNormalPaletteFade(0x00020000, 0, 10, 0, 0x3DEF);
- }
-}
-
-void nullsub_37(struct Sprite *sprite)
-{
-}
-
-void unref_sub_801030C(struct Sprite *sprite)
-{
- sprite->data3 = 6;
- sprite->data4 = 1;
- sprite->callback = sub_8010320;
-}
-
-void sub_8010320(struct Sprite *sprite)
-{
- sprite->data4--;
- if (sprite->data4 == 0)
- {
- sprite->data4 = 8;
- sprite->invisible ^= 1;
- sprite->data3--;
- if (sprite->data3 == 0)
- {
- sprite->invisible = FALSE;
- sprite->callback = nullsub_37;
- gUnknown_03004284 = 0;
- }
- }
-}
-
-void sub_8010384(struct Sprite *sprite)
-{
- u8 r6 = sprite->data0;
- u16 species;
- u8 yOffset;
-
- if (ewram17800[r6].transformedSpecies != 0)
- species = ewram17800[r6].transformedSpecies;
- else
- species = sprite->data2;
-
- GetMonData(&gEnemyParty[gBattlePartyID[r6]], MON_DATA_PERSONALITY); // Unused return value
-
- if (species == SPECIES_UNOWN)
- {
- u32 personalityValue = GetMonData(&gEnemyParty[gBattlePartyID[r6]], MON_DATA_PERSONALITY);
- u16 unownForm = ((((personalityValue & 0x3000000) >> 18) | ((personalityValue & 0x30000) >> 12) | ((personalityValue & 0x300) >> 6) | (personalityValue & 3)) % 0x1C);
- u16 unownSpecies;
-
- if (unownForm == 0)
- unownSpecies = SPECIES_UNOWN; // Use the A Unown form
- else
- unownSpecies = NUM_SPECIES + unownForm; // Use one of the other Unown letters
-
- yOffset = gMonFrontPicCoords[unownSpecies].y_offset;
- }
- else if (species == SPECIES_CASTFORM)
- {
- yOffset = gCastformFrontSpriteCoords[gBattleMonForms[r6]].y_offset;
- }
- else if (species > NUM_SPECIES)
- {
- yOffset = gMonFrontPicCoords[SPECIES_NONE].y_offset;
- }
- else
- {
- yOffset = gMonFrontPicCoords[species].y_offset;
- }
-
- sprite->data3 = 8 - yOffset / 8;
- sprite->data4 = 1;
- sprite->callback = sub_8010494;
-}
-
-void sub_8010494(struct Sprite *sprite)
-{
- s32 i;
-
- sprite->data4--;
- if (sprite->data4 == 0)
- {
- sprite->data4 = 2;
- sprite->pos2.y += 8;
- sprite->data3--;
- if (sprite->data3 < 0)
- {
- FreeSpriteOamMatrix(sprite);
- DestroySprite(sprite);
- }
- else
- {
- u8 *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]);
- }
- }
-}
-
-void sub_8010520(struct Sprite *sprite)
-{
- sprite->data3 = 8;
- sprite->data4 = sprite->invisible;
- sprite->callback = sub_801053C;
-}
-
-void sub_801053C(struct Sprite *sprite)
-{
- sprite->data3--;
- if (sprite->data3 == 0)
- {
- sprite->invisible ^= 1;
- sprite->data3 = 8;
- }
-}
-
-void sub_8010574(struct Sprite *sprite)
-{
- sprite->invisible = sprite->data4;
- sprite->data4 = FALSE;
- sprite->callback = nullsub_37;
-}
-
-void sub_80105A0(struct Sprite *sprite)
-{
- sprite->callback = oac_poke_ally_;
-}
-
-void oac_poke_ally_(struct Sprite *sprite)
-{
- if ((gUnknown_02024DE8 & 1) == 0)
- {
- sprite->pos2.x -= 2;
- if (sprite->pos2.x == 0)
- {
- sprite->callback = nullsub_86;
- sprite->data1 = 0;
- }
- }
-}
-
-void sub_80105DC(struct Sprite *sprite)
-{
- sprite->callback = nullsub_86;
-}
-
-void nullsub_86(struct Sprite *sprite)
-{
-}
-
-void sub_80105EC(struct Sprite *sprite)
-{
- if ((gUnknown_02024DE8 & 1) == 0)
- {
- sprite->pos2.x += sprite->data1;
- sprite->pos2.y += sprite->data2;
- }
-}
-
-void dp11b_obj_instanciate(u8 bank, u8 b, s8 c, s8 d)
-{
- u8 spriteId;
- u8 objectID;
-
- if (b)
- {
- if (ewram17810[bank].unk0_1)
- return;
- }
- else
- {
- if (ewram17810[bank].unk0_2)
- return;
- }
-
- spriteId = CreateInvisibleSpriteWithCallback(objc_dp11b_pingpong);
- if (b == TRUE)
- {
- objectID = gHealthboxIDs[bank];
- ewram17810[bank].unk2 = spriteId;
- ewram17810[bank].unk0_1 = 1;
- gSprites[spriteId].data0 = 0x80;
- }
- else
- {
- objectID = gObjectBankIDs[bank];
- ewram17810[bank].unk3 = spriteId;
- ewram17810[bank].unk0_2 = 1;
- gSprites[spriteId].data0 = 0xC0;
- }
- gSprites[spriteId].data1 = c;
- gSprites[spriteId].data2 = d;
- gSprites[spriteId].data3 = objectID;
- gSprites[spriteId].data4 = b;
- gSprites[objectID].pos2.x = 0;
- gSprites[objectID].pos2.y = 0;
-}
-
-void dp11b_obj_free(u8 a, u8 b)
-{
- u8 r4;
-
- if (b == TRUE)
- {
- if (!ewram17810[a].unk0_1)
- return;
- r4 = gSprites[ewram17810[a].unk2].data3;
- DestroySprite(&gSprites[ewram17810[a].unk2]);
- ewram17810[a].unk0_1 = 0;
- }
- else
- {
- if (!ewram17810[a].unk0_2)
- return;
- r4 = gSprites[ewram17810[a].unk3].data3;
- DestroySprite(&gSprites[ewram17810[a].unk3]);
- ewram17810[a].unk0_2 = 0;
- }
- gSprites[r4].pos2.x = 0;
- gSprites[r4].pos2.y = 0;
-}
-
-void objc_dp11b_pingpong(struct Sprite *sprite)
-{
- u8 spriteId = sprite->data3;
- s32 var;
-
- if (sprite->data4 == 1)
- var = sprite->data0;
- else
- var = sprite->data0;
-
- gSprites[spriteId].pos2.y = Sin(var, sprite->data2) + sprite->data2;
- sprite->data0 = (sprite->data0 + sprite->data1) & 0xFF;
-}
-
-void nullsub_41(void)
-{
-}
-
-void sub_8010800(void)
-{
- sub_8010874();
- gBattleCommunication[1] = 0;
- gBattleMainFunc = bc_8012FAC;
-}
-
-void sub_8010824(void)
-{
- gBattleMainFunc();
-
- for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
- gBattleBankFunc[gActiveBank]();
-}
-
-void sub_8010874(void)
-{
- s32 i;
- u32 j;
- u8 *r4;
-
- TurnValuesCleanUp(0);
- SpecialStatusesClear();
-
- for (i = 0; i < 4; i++)
- {
- gStatuses3[i] = 0;
-
- r4 = (u8 *)&gDisableStructs[i];
- for (j = 0; j < (u32)0x1C; j++)
- r4[j] = 0;
-
- gDisableStructs[i].isFirstTurn= 2;
- gUnknown_02024C70[i] = 0;
- gLastUsedMove[i] = 0;
- gMoveHitWith[i] = 0;
- gUnknown_02024C44[i] = 0;
- gUnknown_02024C4C[i] = 0;
- gUnknown_02024C5C[i] = 0xFF;
- gLockedMove[i] = 0;
- gUnknown_02024C2C[i] = 0;
- ewram17100[i] = 0;
- }
-
- for (i = 0; i < 2; i++)
- {
- gSideAffecting[i] = 0;
-
- r4 = (u8 *)&gSideTimer[i];
- for (j = 0; j < 12; j++)
- r4[j] = 0;
- }
-
- gBankAttacker = 0;
- gBankTarget = 0;
- gBattleWeather = 0;
-
- r4 = (u8 *)&gWishFutureKnock;
- for (i = 0; i < (u32)0x2C; i++)
- r4[i] = 0;
-
- gHitMarker = 0;
- if ((gBattleTypeFlags & BATTLE_TYPE_LINK) == 0 && gSaveBlock2.optionsBattleSceneOff == TRUE)
- gHitMarker = HITMARKER_NO_ANIMATIONS;
- ewram16084 = gSaveBlock2.optionsBattleStyle;
- gMultiHitCounter = 0;
- gBattleOutcome = 0;
- gBattleExecBuffer = 0;
- gPaydayMoney = 0;
- ewram17130 = 0;
- ewram17160 = 0;
- for (i = 0; i < 8; i++)
- gBattleCommunication[i] = 0;
- gPauseCounterBattle = 0;
- gBattleMoveDamage = 0;
- gUnknown_02024DE8 = 0;
- ewram16002 = 0;
- ewram160A1 = 0;
- gLeveledUpInBattle = 0;
- gAbsentBankFlags = 0;
- ewram16078 = 0;
- ewram16086 = 0;
- ewram16087 = 0;
- ewram16089 = gBaseStats[GetMonData(&gEnemyParty[0], MON_DATA_SPECIES)].catchRate * 100 / 1275;
- ewram16088 = 3;
- ewram1601B = 0;
- ewram16056 = 1;
-
- for (i = 0; i < 8; i++)
- {
- ewram[i + 0x160AC] = 0;
- ewram[i + 0x160CC] = 0;
- ewram[i + 0x160E8] = 0;
- ewram[i + 0x160F0] = 0;
- ewram[i + 0x16100] = 0;
- ewram[i + 0x16108] = 0;
- }
-
- ewram160C8 = 6;
- ewram160C9 = 6;
- ewram16113 = 0;
- for (i = 0; i < 11; i++)
- gBattleResults.unk36[i] = 0;
- gBattleResults.battleTurnCounter = 0;
- gBattleResults.playerFaintCounter = 0;
- gBattleResults.opponentFaintCounter = 0;
- gBattleResults.unk2 = 0;
- gBattleResults.unk3 = 0;
- gBattleResults.unk4 = 0;
- gBattleResults.unk5_0 = 0;
- gBattleResults.unk5_1 = 0;
- gBattleResults.lastOpponentSpecies = 0;
- gBattleResults.lastUsedMove = 0;
- gBattleResults.opponentMove = 0;
- gBattleResults.poke1Species = 0;
- gBattleResults.opponentSpecies = 0;
- gBattleResults.caughtPoke = 0;
- for (i = 0; i < 10; i++)
- {
- gBattleResults.pokeString1[i] = 0;
- gBattleResults.pokeString2[i] = 0;
- gBattleResults.caughtNick[i] = 0;
- }
-}
-
-void SwitchInClearStructs(void)
-{
- struct DisableStruct sp0 = gDisableStructs[gActiveBank];
- s32 i;
- u8 *ptr;
- u32 *ptr2;
-
- if (gBattleMoves[gCurrentMove].effect != EFFECT_BATON_PASS)
- {
- for (i = 0; i < 8; i++)
- gBattleMons[gActiveBank].statStages[i] = 6;
- for (i = 0; i < gNoOfAllBanks; i++)
- {
- struct UnknownStruct12 *sp20 = &gUnknown_02024AD0[i];
-
- if ((sp20->unk0 & 0x04000000) && gDisableStructs[i].bankPreventingEscape == gActiveBank)
- sp20->unk0 &= ~0x04000000;
- if ((gStatuses3[i] & STATUS3_ALWAYS_HITS) && gDisableStructs[i].bankWithSureHit == gActiveBank)
- {
- gStatuses3[i] &= ~STATUS3_ALWAYS_HITS;
- gDisableStructs[i].bankWithSureHit = 0;
- }
- }
- }
- if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS)
- {
- gBattleMons[gActiveBank].status2 &= (STATUS2_CONFUSION | STATUS2_FOCUS_ENERGY | STATUS2_SUBSTITUTE | STATUS2_ESCAPE_PREVENTION | STATUS2_CURSED);
- gStatuses3[gActiveBank] &= (STATUS3_LEECHSEED_BANK | STATUS3_LEECHSEED | STATUS3_ALWAYS_HITS | STATUS3_PERISH_SONG | STATUS3_ROOTED | STATUS3_MUDSPORT | STATUS3_WATERSPORT);
-
- for (i = 0; i < gNoOfAllBanks; i++)
- {
- if (GetBankSide(gActiveBank) != GetBankSide(i)
- && (gStatuses3[i] & STATUS3_ALWAYS_HITS) != 0
- && (gDisableStructs[i].bankWithSureHit == gActiveBank))
- {
- gStatuses3[i] &= ~STATUS3_ALWAYS_HITS;
- gStatuses3[i] |= 0x10;
- }
- }
- }
- else
- {
- gBattleMons[gActiveBank].status2 = 0;
- gStatuses3[gActiveBank] = 0;
- }
-
- for (i = 0; i < gNoOfAllBanks; i++)
- {
- if (gUnknown_02024AD0[i].unk0 & (gBitTable[gActiveBank] << 16))
- gUnknown_02024AD0[i].unk0 &= ~(gBitTable[gActiveBank] << 16);
- if ((gUnknown_02024AD0[i].unk0 & 0xE000) && ewram[0x16020 + i] == gActiveBank)
- gUnknown_02024AD0[i].unk0 &= ~0xE000;
- }
-
- gActionSelectionCursor[gActiveBank] = 0;
- gMoveSelectionCursor[gActiveBank] = 0;
-
- ptr = (u8 *)&gDisableStructs[gActiveBank];
- for (i = 0; i < (u32)0x1C; i++)
- ptr[i] = 0;
-
- if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS)
- {
- gDisableStructs[gActiveBank].substituteHP = sp0.substituteHP;
- gDisableStructs[gActiveBank].bankWithSureHit = sp0.bankWithSureHit;
- gDisableStructs[gActiveBank].perishSong1 = sp0.perishSong1;
- gDisableStructs[gActiveBank].perishSong2 = sp0.perishSong2;
- }
-
- gDisableStructs[gActiveBank].isFirstTurn= 2;
- gLastUsedMove[gActiveBank] = 0;
- gMoveHitWith[gActiveBank] = 0;
- gUnknown_02024C44[gActiveBank] = 0;
- gUnknown_02024C4C[gActiveBank] = 0;
- gUnknown_02024C2C[gActiveBank] = 0;
- gUnknown_02024C5C[gActiveBank] = 0xFF;
-
- ewram[0x160AC + gActiveBank * 2 + 0] = 0;
- ewram[0x160AC + gActiveBank * 2 + 1] = 0;
- ewram[0x16100 + gActiveBank * 4 + 0] = 0;
- ewram[0x16100 + gActiveBank * 4 + 1] = 0;
- ewram[0x16100 + gActiveBank * 4 + 2] = 0;
- ewram[0x16100 + gActiveBank * 4 + 3] = 0;
- ewram[0x160E8 + gActiveBank * 2 + 0] = 0;
- ewram[0x160E8 + gActiveBank * 2 + 1] = 0;
-
- ptr2 = (u32 *)(ewram + 0x17100);
- ptr2[gActiveBank] = 0;
-
- gCurrentMove = 0;
-}
-
-void UndoEffectsAfterFainting(void)
-{
- s32 i;
- u8 *ptr;
- u32 *ptr2;
-
- for (i = 0; i < 8; i++)
- gBattleMons[gActiveBank].statStages[i] = 6;
- gBattleMons[gActiveBank].status2 = 0;
- gStatuses3[gActiveBank] = 0;
- for (i = 0; i < gNoOfAllBanks; i++)
- {
- if ((gBattleMons[i].status2 & STATUS2_ESCAPE_PREVENTION) && gDisableStructs[i].bankPreventingEscape == gActiveBank)
- gBattleMons[i].status2 &= ~STATUS2_ESCAPE_PREVENTION;
- if (gBattleMons[i].status2 & (gBitTable[gActiveBank] << 16))
- gBattleMons[i].status2 &= ~(gBitTable[gActiveBank] << 16);
- if ((gBattleMons[i].status2 & STATUS2_WRAPPED) && ewram[0x16020 + i] == gActiveBank)
- gBattleMons[i].status2 &= ~STATUS2_WRAPPED;
- }
- gActionSelectionCursor[gActiveBank] = 0;
- gMoveSelectionCursor[gActiveBank] = 0;
-
- ptr = (u8 *)&gDisableStructs[gActiveBank];
- for (i = 0; i < (u32)0x1C; i++)
- ptr[i] = 0;
- gProtectStructs[gActiveBank].protected = 0;
- gProtectStructs[gActiveBank].endured = 0;
- gProtectStructs[gActiveBank].onlyStruggle = 0;
- gProtectStructs[gActiveBank].helpingHand = 0;
- gProtectStructs[gActiveBank].bounceMove = 0;
- gProtectStructs[gActiveBank].stealMove = 0;
- gProtectStructs[gActiveBank].flag0Unknown = 0;
- gProtectStructs[gActiveBank].prlzImmobility = 0;
- gProtectStructs[gActiveBank].confusionSelfDmg = 0;
- gProtectStructs[gActiveBank].notEffective = 0;
- gProtectStructs[gActiveBank].chargingTurn = 0;
- gProtectStructs[gActiveBank].fleeFlag = 0;
- gProtectStructs[gActiveBank].usedImprisionedMove = 0;
- gProtectStructs[gActiveBank].loveImmobility = 0;
- gProtectStructs[gActiveBank].usedDisabledMove = 0;
- gProtectStructs[gActiveBank].usedTauntedMove = 0;
- gProtectStructs[gActiveBank].flag2Unknown = 0;
- gProtectStructs[gActiveBank].flinchImmobility = 0;
- gProtectStructs[gActiveBank].notFirstStrike = 0;
-
- gDisableStructs[gActiveBank].isFirstTurn= 2;
- gLastUsedMove[gActiveBank] = 0;
- gMoveHitWith[gActiveBank] = 0;
- gUnknown_02024C44[gActiveBank] = 0;
- gUnknown_02024C4C[gActiveBank] = 0;
- gUnknown_02024C2C[gActiveBank] = 0;
- gUnknown_02024C5C[gActiveBank] = 0xFF;
-
- ewram[0x160E8 + gActiveBank * 2 + 0] = 0;
- ewram[0x160E8 + gActiveBank * 2 + 1] = 0;
- ewram[0x160AC + gActiveBank * 2 + 0] = 0;
- ewram[0x160AC + gActiveBank * 2 + 1] = 0;
- ewram[0x16100 + gActiveBank * 4 + 0] = 0;
- ewram[0x16100 + gActiveBank * 4 + 1] = 0;
- ewram[0x16100 + gActiveBank * 4 + 2] = 0;
- ewram[0x16100 + gActiveBank * 4 + 3] = 0;
-
- ptr2 = (u32 *)(ewram + 0x17100);
- ptr2[gActiveBank] = 0;
-
- gBattleMons[gActiveBank].type1 = gBaseStats[gBattleMons[gActiveBank].species].type1;
- gBattleMons[gActiveBank].type2 = gBaseStats[gBattleMons[gActiveBank].species].type2;
-}
-
-void bc_8012FAC(void)
-{
- switch (gBattleCommunication[0])
- {
- case 0:
- gActiveBank = gBattleCommunication[1];
- EmitGetAttributes(0, 0, 0);
- MarkBufferBankForExecution(gActiveBank);
- gBattleCommunication[0]++;
- break;
- case 1:
- if (gBattleExecBuffer == 0)
- {
- gBattleCommunication[1]++;
- if (gBattleCommunication[1] == gNoOfAllBanks)
- gBattleMainFunc = BattlePrepIntroSlide;
- else
- gBattleCommunication[0] = 0;
- }
- break;
- }
-}
-
-static void BattlePrepIntroSlide(void)
-{
- if (gBattleExecBuffer == 0)
- {
- gActiveBank = GetBankByPlayerAI(0);
- EmitIntroSlide(0, gBattleTerrain);
- MarkBufferBankForExecution(gActiveBank);
- gBattleMainFunc = sub_8011384;
- gBattleCommunication[0] = 0;
- gBattleCommunication[1] = 0;
- }
-}
-
-void sub_8011384(void)
-{
- u8 *ptr;
- s32 i;
-
- if (gBattleExecBuffer == 0)
- {
- for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
- {
- if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI)
- && GetBankSide(gActiveBank) == 0)
- {
- ptr = (u8 *)&gBattleMons[gActiveBank];
- for (i = 0; i < (u32)0x58; i++)
- ptr[i] = 0;
- }
- else
- {
- u8 r0;
-
- ptr = (u8 *)&gBattleMons[gActiveBank];
- for (i = 0; i < (u32)0x58; i++)
- ptr[i] = gBattleBufferB[gActiveBank][4 + i];
-
- 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);
- r0 = GetBankSide(gActiveBank);
- ewram160BC[r0] = gBattleMons[gActiveBank].hp;
- for (i = 0; i < 8; i++)
- gBattleMons[gActiveBank].statStages[i] = 6;
- gBattleMons[gActiveBank].status2 = 0;
- }
-
- if (GetBankIdentity(gActiveBank) == 0)
- {
- EmitTrainerThrow(0);
- MarkBufferBankForExecution(gActiveBank);
- }
-
- if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
- {
- if (GetBankIdentity(gActiveBank) == 1)
- {
- EmitTrainerThrow(0);
- MarkBufferBankForExecution(gActiveBank);
- }
- if (GetBankSide(gActiveBank) == 1
- && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)))
- GetNationalPokedexFlag(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);
- EmitLoadPokeSprite(0);
- MarkBufferBankForExecution(gActiveBank);
- }
- }
-
- if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
- {
- if (GetBankIdentity(gActiveBank) == 2
- || GetBankIdentity(gActiveBank) == 3)
- {
- EmitTrainerThrow(0);
- MarkBufferBankForExecution(gActiveBank);
- }
- }
- }
- gBattleMainFunc = bc_801333C;
- }
-}
-
-void bc_801333C(void)
-{
- s32 i;
-
- if (gBattleExecBuffer == 0)
- {
- struct
- {
- u16 hp;
- u32 status;
- } sp0[6];
-
- if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
- {
- for (i = 0; i < 6; i++)
- {
- if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == 0
- || GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_EGG)
- {
- sp0[i].hp = 0xFFFF;
- sp0[i].status = 0;
- }
- else
- {
- sp0[i].hp = GetMonData(&gEnemyParty[i], MON_DATA_HP);
- sp0[i].status = GetMonData(&gEnemyParty[i], MON_DATA_STATUS);
- }
- }
- gActiveBank = GetBankByPlayerAI(1);
- Emitcmd48(0, (u8 *)sp0, 0x80);
- MarkBufferBankForExecution(gActiveBank);
-
- for (i = 0; i < 6; i++)
- {
- if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == 0
- || GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_EGG)
- {
- sp0[i].hp = 0xFFFF;
- sp0[i].status = 0;
- }
- else
- {
- sp0[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP);
- sp0[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS);
- }
- }
- gActiveBank = GetBankByPlayerAI(0);
- Emitcmd48(0, (u8 *)sp0, 0x80);
- MarkBufferBankForExecution(gActiveBank);
-
- gBattleMainFunc = bc_battle_begin_message;
- }
- else
- {
- // The array gets set here, but nothing is ever done with it.
- // Likely unfinished code.
-
- for (i = 0; i < 6; i++)
- {
- if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == 0
- || GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_EGG)
- {
- sp0[i].hp = 0xFFFF;
- sp0[i].status = 0;
- }
- else
- {
- sp0[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP);
- sp0[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS);
- }
- }
-
- gBattleMainFunc = bc_8013568;
- }
- }
-}
-
-void bc_battle_begin_message(void)
-{
- if (gBattleExecBuffer == 0)
- {
- gActiveBank = GetBankByPlayerAI(1);
- PrepareStringBattle(0, gActiveBank);
- gBattleMainFunc = sub_8011800;
- }
-}
-
-void bc_8013568(void)
-{
- if (gBattleExecBuffer == 0)
- {
- gBattleMainFunc = sub_8011970;
- PrepareStringBattle(0, 0);
- }
-}
-
-void sub_8011800(void)
-{
- if (gBattleExecBuffer == 0)
- {
- PrepareStringBattle(1, GetBankByPlayerAI(1));
- gBattleMainFunc = sub_8011834;
- }
-}
-
-void sub_8011834(void)
-{
- if (gBattleExecBuffer == 0)
- {
- for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
- {
- if (GetBankIdentity(gActiveBank) == 1)
- {
- EmitTrainerBallThrow(0);
- MarkBufferBankForExecution(gActiveBank);
- }
- if ((gBattleTypeFlags & BATTLE_TYPE_MULTI)
- && GetBankIdentity(gActiveBank) == 3)
- {
- EmitTrainerBallThrow(0);
- MarkBufferBankForExecution(gActiveBank);
- }
- }
- gBattleMainFunc = bc_801362C;
- }
-}
-
-void bc_801362C(void)
-{
- if (gBattleExecBuffer == 0)
- {
- for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
- {
- if (GetBankSide(gActiveBank) == 1
- && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)))
- GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBank].species), 2);
- }
- gBattleMainFunc = sub_8011970;
- }
-}
-
-void unref_sub_8011950(void)
-{
- if (gBattleExecBuffer == 0)
- gBattleMainFunc = sub_8011970;
-}
-
-void sub_8011970(void)
-{
- if (gBattleExecBuffer == 0)
- {
- if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI))
- PrepareStringBattle(1, GetBankByPlayerAI(0));
- gBattleMainFunc = sub_80119B4;
- }
-}
-
-void sub_80119B4(void)
-{
- if (gBattleExecBuffer == 0)
- {
- for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
- {
- if (GetBankIdentity(gActiveBank) == 0)
- {
- EmitTrainerBallThrow(0);
- MarkBufferBankForExecution(gActiveBank);
- }
- if ((gBattleTypeFlags & BATTLE_TYPE_MULTI)
- && GetBankIdentity(gActiveBank) == 2)
- {
- EmitTrainerBallThrow(0);
- MarkBufferBankForExecution(gActiveBank);
- }
- }
- ewram16058 = 0;
- ewram160F9 = 0;
- ewram160E6 = 0;
- gBattleMainFunc = BattleBeginFirstTurn;
- }
-}
-
-void unref_sub_8011A68(void)
-{
- if (gBattleExecBuffer == 0)
- {
- for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
- {
- if (GetBankSide(gActiveBank) == 0)
- {
- EmitSendOutPoke(0, gBattlePartyID[gActiveBank], 0);
- MarkBufferBankForExecution(gActiveBank);
- }
- }
- ewram16058 = 0;
- ewram160F9 = 0;
- ewram160E6 = 0;
- gBattleMainFunc = BattleBeginFirstTurn;
- }
-}
-
-void BattleBeginFirstTurn(void)
-{
- s32 i;
- s32 j;
- u8 r9 = 0;
-
- if (gBattleExecBuffer == 0)
- {
- if (ewram16058 == 0)
- {
- for (i = 0; i < gNoOfAllBanks; i++)
- gTurnOrder[i] = i;
- for (i = 0; i < gNoOfAllBanks - 1; i++)
- {
- for (j = i + 1; j < gNoOfAllBanks; j++)
- {
- if (b_first_side(gTurnOrder[i], gTurnOrder[j], 1) != 0)
- sub_8012FBC(i, j);
- }
- }
- }
- if (ewram160E6 == 0 && AbilityBattleEffects(0, 0, 0, 0xFF, 0) != 0)
- {
- ewram160E6 = 1;
- return;
- }
- while (ewram16058 < gNoOfAllBanks)
- {
- if (AbilityBattleEffects(0, gTurnOrder[ewram16058], 0, 0, 0) != 0)
- r9++;
- ewram16058++;
- if (r9 != 0)
- return;
- }
- if (AbilityBattleEffects(9, 0, 0, 0, 0) != 0)
- return;
- if (AbilityBattleEffects(11, 0, 0, 0, 0) != 0)
- return;
- while (ewram160F9 < gNoOfAllBanks)
- {
- if (ItemBattleEffects(0, gTurnOrder[ewram160F9], 0) != 0)
- r9++;
- ewram160F9++;
- if (r9 != 0)
- return;
- }
- // Absolutely pointless for-loop that somehow doesn't get optimized out
- for (i = 0; i < gNoOfAllBanks; i++)
- ;
- for (i = 0; i < 4; i++)
- {
- ewram[0x16068 + i] = 6;
- gActionForBanks[i] = 0xFF;
- gChosenMovesByBanks[i] = 0;
- }
- TurnValuesCleanUp(0);
- SpecialStatusesClear();
- ewram160A6 = gAbsentBankFlags;
- gBattleMainFunc = sub_8012324;
- sub_80156DC();
- for (i = 0; i < 8; i++)
- gBattleCommunication[i] = 0;
- for (i = 0; i < gNoOfAllBanks; i++)
- gBattleMons[i].status2 &= ~8;
- ewram16000 = 0;
- ewram16001 = 0;
- ewram16110 = 0;
- ewram16111 = 0;
- ewram1600C = 0;
- ewram16059 = 0;
- ewram1600E = 0;
- gBattleMoveFlags = 0;
- gRandomTurnNumber = Random();
- }
-}
-
-void bc_8013B1C(void)
-{
- s32 i;
-
- if (gBattleExecBuffer == 0)
- {
- gBattleMainFunc = BattleTurnPassed;
- for (i = 0; i < 8; i++)
- gBattleCommunication[i] = 0;
- for (i = 0; i < gNoOfAllBanks; i++)
- {
- gBattleMons[i].status2 &= ~8;
- if ((gBattleMons[i].status1 & 7) && (gBattleMons[i].status2 & 0x1000))
- CancelMultiTurnMoves(i);
- }
- ewram16000 = 0;
- ewram16001 = 0;
- ewram16110 = 0;
- ewram16111 = 0;
- ewram1600E = 0;
- gBattleMoveFlags = 0;
- }
-}
-
-void BattleTurnPassed(void)
-{
- s32 i;
-
- TurnValuesCleanUp(1);
- if (gBattleOutcome == 0)
- {
- if (UpdateTurnCounters() != 0)
- return;
- if (TurnBasedEffects() != 0)
- return;
- }
- if (sub_80173A4() != 0)
- return;
- ewram16059 = 0;
- if (sub_80170DC() != 0)
- return;
- TurnValuesCleanUp(0);
- gHitMarker &= ~HITMARKER_NO_ATTACKSTRING;
- gHitMarker &= ~0x80000;
- gHitMarker &= ~0x400000;
- gHitMarker &= ~0x100000;
- ewram16002 = 0;
- ewram160A1 = 0;
- ewram1600C = 0;
- gBattleMoveDamage = 0;
- gBattleMoveFlags = 0;
- for (i = 0; i < 5; i++)
- gBattleCommunication[i] = 0;
- if (gBattleOutcome != 0)
- {
- gFightStateTracker = 12;
- gBattleMainFunc = sub_80138F0;
- return;
- }
- if (gBattleResults.battleTurnCounter < 0xFF)
- gBattleResults.battleTurnCounter++;
- for (i = 0; i < gNoOfAllBanks; i++)
- {
- gActionForBanks[i] = 0xFF;
- gChosenMovesByBanks[i] = 0;
- }
- for (i = 0; i < 4; i++)
- ewram[0x16068 + i] = 6;
- ewram160A6 = gAbsentBankFlags;
- gBattleMainFunc = sub_8012324;
- gRandomTurnNumber = Random();
-}
-
-u8 CanRunFromBattle(void)
-{
- u8 r2;
- u8 r6;
- s32 i;
-
- if (gBattleMons[gActiveBank].item == ITEM_ENIGMA_BERRY)
- r2 = gEnigmaBerries[gActiveBank].holdEffect;
- else
- r2 = ItemId_GetHoldEffect(gBattleMons[gActiveBank].item);
- gStringBank = gActiveBank;
- if (r2 == HOLD_EFFECT_CAN_ALWAYS_RUN)
- return 0;
- if (gBattleTypeFlags & BATTLE_TYPE_LINK)
- return 0;
- if (gBattleMons[gActiveBank].ability == ABILITY_RUN_AWAY)
- return 0;
- r6 = GetBankSide(gActiveBank);
- for (i = 0; i < gNoOfAllBanks; i++)
- {
- if (r6 != GetBankSide(i)
- && gBattleMons[i].ability == ABILITY_SHADOW_TAG)
- {
- ewram16003 = i;
- gLastUsedAbility = gBattleMons[i].ability;
- gBattleCommunication[5] = 2;
- return 2;
- }
- if (r6 != GetBankSide(i)
- && gBattleMons[gActiveBank].ability != ABILITY_LEVITATE
- && gBattleMons[gActiveBank].type1 != 2
- && gBattleMons[gActiveBank].type2 != 2
- && gBattleMons[i].ability == ABILITY_ARENA_TRAP)
- {
- ewram16003 = i;
- gLastUsedAbility = gBattleMons[i].ability;
- gBattleCommunication[5] = 2;
- return 2;
- }
- }
- i = AbilityBattleEffects(15, gActiveBank, ABILITY_MAGNET_PULL, 0, 0);
- if (i != 0 && (gBattleMons[gActiveBank].type1 == 8 || gBattleMons[gActiveBank].type2 == 8))
- {
- ewram16003 = i - 1;
- gLastUsedAbility = gBattleMons[i - 1].ability;
- gBattleCommunication[5] = 2;
- return 2;
- }
- if ((gBattleMons[gActiveBank].status2 & (STATUS2_ESCAPE_PREVENTION | STATUS2_WRAPPED)) || (gStatuses3[gActiveBank] & STATUS3_ROOTED))
- {
- gBattleCommunication[5] = 0;
- return 1;
- }
- if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)
- {
- gBattleCommunication[5] = 1;
- return 1;
- }
- return 0;
-}
-
-void sub_8012258(u8 a)
-{
- s32 i;
- u8 r4;
- u8 r1;
-
- for (i = 0; i < 3; i++)
- gUnknown_02038470[i] = ewram[0x1606C + i + a * 3];
- r4 = pokemon_order_func(gBattlePartyID[a]);
- r1 = pokemon_order_func(ewram[0x16068 + a]);
- sub_8094C98(r4, r1);
- if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
- {
- for (i = 0; i < 3; i++)
- {
- ewram[0x1606C + i + a * 3] = gUnknown_02038470[i];
- ewram[0x1606C + i + (a ^ 2) * 3] = gUnknown_02038470[i];
- }
- }
- else
- {
- for (i = 0; i < 3; i++)
- {
- ewram[0x1606C + i + a * 3] = gUnknown_02038470[i];
- }
- }
-}
-
-/*
-void sub_8012324(void)
-{
- u8 r5;
-
- gBattleCommunication[4] = 0;
- // inverted loop
- //_0801234C
- for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
- {
- r5 = GetBankIdentity(gActiveBank);
- switch (gBattleCommunication[gActiveBank])
- {
- case 0:
- ewram[0x016068 + gActiveBank] = 6;
- if (!(gBattleTypeFlags & 0x40)
- && (r5 & 2)
- && !(ewram160A6 & gBitTable[GetBankByPlayerAI(r5 ^ 2)])
- && gBattleCommunication[GetBankByPlayerAI(r5)] != 4)
- break;
- //_080123F8
- if (ewram160A6 & gBitTable[gActiveBank])
- {
- gActionForBanks[gActiveBank] = 13;
- if (!(gBattleTypeFlags & 0x40))
- gBattleCommunication[gActiveBank] = 4;
- //_08012454
- else
- gBattleCommunication[gActiveBank] = 3;
- break;
- }
- //_08012468
- if ((gBattleMons[gActiveBank].status2 & 0x1000)
- || (gBattleMons[gActiveBank].status2 & 0x10000000))
- {
- gActionForBanks[gActiveBank] = 0;
- gBattleCommunication[gActiveBank] = 3;
- }
- else
- {
- Emitcmd18(0, gActionForBanks[0], gBattleBufferB[0][1] | (gBattleBufferB[0][2] << 8));
- MarkBufferBankForExecution(gActiveBank);
- gBattleCommunication[gActiveBank]++;
- }
- break;
- case 1:
- }
- }
-}
-*/
diff --git a/src/battle_anim.c b/src/battle_anim.c
deleted file mode 100644
index 6bd98099a..000000000
--- a/src/battle_anim.c
+++ /dev/null
@@ -1,2270 +0,0 @@
-#include "global.h"
-#include "battle_anim.h"
-#include "battle.h"
-#include "battle_anim_80CA710.h"
-#include "battle_interface.h"
-#include "contest.h"
-#include "decompress.h"
-#include "m4a.h"
-#include "main.h"
-#include "palette.h"
-#include "rom_8077ABC.h"
-#include "sound.h"
-#include "sprite.h"
-#include "task.h"
-
-// sprites start at 10000 and thus must be subtracted of 10000 to account for the true index.
-#define GET_TRUE_SPRITE_INDEX(i) (i - 10000)
-
-extern u8 unk_2000000[];
-extern u16 gBattlePartyID[4];
-extern u8 gObjectBankIDs[];
-extern u8 gBankAttacker;
-extern u8 gBankTarget;
-EWRAM_DATA const u8 *gBattleAnimScriptPtr = NULL;
-EWRAM_DATA const u8 *gBattleAnimScriptRetAddr = NULL;
-EWRAM_DATA void (*gAnimScriptCallback)(void) = NULL;
-EWRAM_DATA s8 gAnimFramesToWait = 0;
-EWRAM_DATA u8 gAnimScriptActive = FALSE;
-EWRAM_DATA u8 gAnimVisualTaskCount = 0;
-EWRAM_DATA u8 gAnimSoundTaskCount = 0;
-EWRAM_DATA u32 gDisableStructMoveAnim = 0;
-EWRAM_DATA u32 gMoveDmgMoveAnim = 0;
-EWRAM_DATA u16 gMovePowerMoveAnim = 0;
-EWRAM_DATA u8 gHappinessMoveAnim = 0;
-EWRAM_DATA u16 gWeatherMoveAnim = 0;
-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 u16 gUnknown_0202F7CA[4] = {0};
-EWRAM_DATA u8 gUnknown_0202F7D2 = 0;
-extern u16 gUnknown_030041B4;
-extern u16 gUnknown_03004200;
-extern u16 gUnknown_03004240;
-extern u16 gUnknown_03004244;
-extern u16 gUnknown_03004280;
-extern u16 gUnknown_03004288;
-extern u16 gUnknown_030042C0;
-extern u16 gUnknown_030042C4;
-
-u16 gSoundAnimFramesToWait;
-s16 gBattleAnimArgs[8];
-u16 gAnimSpriteIndexArray[8];
-
-extern struct MusicPlayerInfo gMPlay_BGM;
-extern struct MusicPlayerInfo gMPlay_SE1;
-extern struct MusicPlayerInfo gMPlay_SE2;
-
-extern const u16 gUnknown_081C7160[];
-extern const u8 *const gBattleAnims_Moves[];
-extern const struct CompressedSpriteSheet gBattleAnimPicTable[];
-extern const struct CompressedSpritePalette gBattleAnimPaletteTable[];
-extern const struct BattleAnimBackground gBattleAnimBackgroundTable[];
-
-static void RunAnimScriptCommand(void);
-static void ScriptCmd_loadsprite(void);
-static void ScriptCmd_unloadsprite(void);
-static void ScriptCmd_sprite(void);
-static void ScriptCmd_createtask(void);
-static void ScriptCmd_delay(void);
-static void ScriptCmd_waitforvisualfinish(void);
-static void ScriptCmd_hang1(void);
-static void ScriptCmd_hang2(void);
-static void ScriptCmd_end(void);
-static void ScriptCmd_playse(void);
-static void ScriptCmd_monbg(void);
-static void sub_8076380(void);
-static void task_pA_ma0A_obj_to_bg_pal(u8);
-static void ScriptCmd_clearmonbg(void);
-static void sub_807672C(u8);
-static void ScriptCmd_monbg_22(void);
-static void ScriptCmd_clearmonbg_23(void);
-static void sub_80769A4(u8);
-static void ScriptCmd_setalpha(void);
-static void ScriptCmd_setbldcnt(void);
-static void ScriptCmd_blendoff(void);
-static void ScriptCmd_call(void);
-static void ScriptCmd_return(void);
-static void ScriptCmd_setvar(void);
-static void ScriptCmd_ifelse(void);
-static void ScriptCmd_jumpif(void);
-static void ScriptCmd_jump(void);
-static void ScriptCmd_fadetobg(void);
-static void ScriptCmd_fadetobg_25(void);
-static void task_p5_load_battle_screen_elements(u8);
-static void sub_8076DB8(u16);
-static void dp01t_11_3_message_for_player_only(void);
-static void ScriptCmd_restorebg(void);
-static void ScriptCmd_waitbgfadeout(void);
-static void ScriptCmd_waitbgfadein(void);
-static void ScriptCmd_changebg(void);
-static void ScriptCmd_panse_19(void);
-static void ScriptCmd_setpan(void);
-static void ScriptCmd_panse_1B(void);
-static void c3_08073CEC(u8);
-static void ScriptCmd_panse_26(void);
-static void ScriptCmd_panse_27(void);
-static void ScriptCmd_panse_1C(void);
-static void sub_80774FC(u8);
-static void ScriptCmd_panse_1D(void);
-static void sub_80775CC(u8);
-static void ScriptCmd_createtask_1F(void);
-static void ScriptCmd_waitsound(void);
-static void ScriptCmd_jumpvareq(void);
-static void ScriptCmd_jumpunkcond(void);
-static void ScriptCmd_monbgprio_28(void);
-static void ScriptCmd_monbgprio_29(void);
-static void ScriptCmd_monbgprio_2A(void);
-static void ScriptCmd_invisible(void);
-static void ScriptCmd_visible(void);
-static void ScriptCmd_doublebattle_2D(void);
-static void ScriptCmd_doublebattle_2E(void);
-static void ScriptCmd_stopsound(void);
-
-static void (*const sScriptCmdTable[])(void) = {
- ScriptCmd_loadsprite,
- ScriptCmd_unloadsprite,
- ScriptCmd_sprite,
- ScriptCmd_createtask,
- ScriptCmd_delay,
- ScriptCmd_waitforvisualfinish,
- ScriptCmd_hang1,
- ScriptCmd_hang2,
- ScriptCmd_end,
- ScriptCmd_playse,
- ScriptCmd_monbg,
- ScriptCmd_clearmonbg,
- ScriptCmd_setalpha,
- ScriptCmd_blendoff,
- ScriptCmd_call,
- ScriptCmd_return,
- ScriptCmd_setvar,
- ScriptCmd_ifelse,
- ScriptCmd_jumpif,
- ScriptCmd_jump,
- ScriptCmd_fadetobg,
- ScriptCmd_restorebg,
- ScriptCmd_waitbgfadeout,
- ScriptCmd_waitbgfadein,
- ScriptCmd_changebg,
- ScriptCmd_panse_19,
- ScriptCmd_setpan,
- ScriptCmd_panse_1B,
- ScriptCmd_panse_1C,
- ScriptCmd_panse_1D,
- ScriptCmd_setbldcnt,
- ScriptCmd_createtask_1F,
- ScriptCmd_waitsound,
- ScriptCmd_jumpvareq,
- ScriptCmd_monbg_22,
- ScriptCmd_clearmonbg_23,
- ScriptCmd_jumpunkcond,
- ScriptCmd_fadetobg_25,
- ScriptCmd_panse_26,
- ScriptCmd_panse_27,
- ScriptCmd_monbgprio_28,
- ScriptCmd_monbgprio_29,
- ScriptCmd_monbgprio_2A,
- ScriptCmd_invisible,
- ScriptCmd_visible,
- ScriptCmd_doublebattle_2D,
- ScriptCmd_doublebattle_2E,
- ScriptCmd_stopsound,
-};
-
-void battle_anim_clear_some_data(void)
-{
- s32 i;
-
- gAnimFramesToWait = 0;
- gAnimScriptActive = FALSE;
- gAnimVisualTaskCount = 0;
- gAnimSoundTaskCount = 0;
- gDisableStructMoveAnim = 0;
- gMoveDmgMoveAnim = 0;
- gMovePowerMoveAnim = 0;
- gHappinessMoveAnim = 0;
-
- // clear index array.
- for (i = 0; i < 8; i++)
- gAnimSpriteIndexArray[i] |= 0xFFFF;
-
- // clear anim args.
- for (i = 0; i < 8; i++)
- gBattleAnimArgs[i] = 0;
-
- gMonAnimTaskIdArray[0] = 0xFF;
- gMonAnimTaskIdArray[1] = 0xFF;
- gUnknown_0202F7C4 = 0;
- gUnknown_0202F7C5 = 0;
- gAnimMoveIndex = 0;
- gBattleAnimPlayerMonIndex = 0;
- gBattleAnimEnemyMonIndex = 0;
- gUnknown_0202F7D2 = 0;
-}
-
-void ExecuteMoveAnim(u16 move)
-{
- gBattleAnimPlayerMonIndex = gBankAttacker;
- gBattleAnimEnemyMonIndex = gBankTarget;
- DoMoveAnim(gBattleAnims_Moves, move, 1);
-}
-
-void DoMoveAnim(const u8 *const moveAnims[], u16 move, u8 c)
-{
- s32 i;
-
- if (IsContest() == 0)
- {
- sub_8079E24();
- sub_8043EB4(0);
- for (i = 0; i < 4; i++)
- {
- if (GetBankSide(i) != 0)
- gUnknown_0202F7CA[i] = GetMonData(&gEnemyParty[gBattlePartyID[i]], MON_DATA_SPECIES);
- else
- gUnknown_0202F7CA[i] = GetMonData(&gPlayerParty[gBattlePartyID[i]], MON_DATA_SPECIES);
- }
- }
- else
- {
- for (i = 0; i < 4; i++)
- gUnknown_0202F7CA[i] = EWRAM_19348;
- }
-
- if (c == 0)
- gAnimMoveIndex = 0;
- else
- gAnimMoveIndex = move;
-
- for (i = 0; i < 8; i++)
- gBattleAnimArgs[i] = 0;
-
- gMonAnimTaskIdArray[0] = 0xFF;
- gMonAnimTaskIdArray[1] = 0xFF;
- gBattleAnimScriptPtr = moveAnims[move];
- gAnimScriptActive = TRUE;
- gAnimFramesToWait = 0;
- gAnimScriptCallback = RunAnimScriptCommand;
-
- for (i = 0; i < 8; i++)
- gAnimSpriteIndexArray[i] |= 0xFFFF;
-
- if (c != 0)
- {
- for (i = 0; gUnknown_081C7160[i] != 0xFFFF; i++)
- {
- if (move == gUnknown_081C7160[i])
- {
- m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 128);
- break;
- }
- }
- }
-
- gUnknown_030042C4 = 0;
- gUnknown_03004240 = 0;
- gUnknown_03004200 = 0;
- gUnknown_03004244 = 0;
-}
-
-void move_anim_8072740(struct Sprite *sprite)
-{
- FreeSpriteOamMatrix(sprite);
- DestroySprite(sprite);
- gAnimVisualTaskCount--;
-}
-
-void DestroyAnimVisualTask(u8 taskId)
-{
- DestroyTask(taskId);
- gAnimVisualTaskCount--;
-}
-
-void DestroyAnimSoundTask(u8 taskId)
-{
- DestroyTask(taskId);
- gAnimSoundTaskCount--;
-}
-
-static void AddSpriteIndex(u16 index)
-{
- s32 i;
-
- for (i = 0; i < 8; i++)
- {
- if (gAnimSpriteIndexArray[i] == 0xFFFF)
- {
- gAnimSpriteIndexArray[i] = index;
- return;
- }
- }
-}
-
-static void ClearSpriteIndex(u16 index)
-{
- s32 i;
-
- for (i = 0; i < 8; i++)
- {
- if (gAnimSpriteIndexArray[i] == index)
- {
- gAnimSpriteIndexArray[i] |= 0xFFFF;
- return;
- }
- }
-}
-
-static void WaitAnimFrameCount(void)
-{
- if (gAnimFramesToWait <= 0)
- {
- gAnimScriptCallback = RunAnimScriptCommand;
- gAnimFramesToWait = 0;
- }
- else
- {
- gAnimFramesToWait--;
- }
-}
-
-static void RunAnimScriptCommand(void)
-{
- do
- {
- sScriptCmdTable[SCRIPT_READ_8(gBattleAnimScriptPtr)]();
- } while (gAnimFramesToWait == 0 && gAnimScriptActive != FALSE);
-}
-
-static void ScriptCmd_loadsprite(void)
-{
- u16 index;
-
- gBattleAnimScriptPtr++;
- index = SCRIPT_READ_16(gBattleAnimScriptPtr);
- LoadCompressedObjectPic(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)]);
- LoadCompressedObjectPalette(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(index)]);
- gBattleAnimScriptPtr += 2;
- AddSpriteIndex(GET_TRUE_SPRITE_INDEX(index));
- gAnimFramesToWait = 1;
- gAnimScriptCallback = WaitAnimFrameCount;
-}
-
-static void ScriptCmd_unloadsprite(void)
-{
- u16 index;
-
- gBattleAnimScriptPtr++;
- index = SCRIPT_READ_16(gBattleAnimScriptPtr);
- FreeSpriteTilesByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag);
- FreeSpritePaletteByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag);
- gBattleAnimScriptPtr += 2;
- ClearSpriteIndex(GET_TRUE_SPRITE_INDEX(index));
-}
-
-#ifdef NONMATCHING
-static void ScriptCmd_sprite(void)
-{
- s32 i;
- struct SpriteTemplate *r7;
- u8 r4;
- u8 r0;
- u8 _r0;
- u16 r6;
- u8 r2;
- s8 r1;
-
- gBattleAnimScriptPtr++;
- r7 = (struct SpriteTemplate *)(SCRIPT_READ_32(gBattleAnimScriptPtr));
- gBattleAnimScriptPtr += 4;
- r4 = SCRIPT_READ_8(gBattleAnimScriptPtr);
- gBattleAnimScriptPtr++;
- r0 = SCRIPT_READ_8(gBattleAnimScriptPtr);
- gBattleAnimScriptPtr++;
- for (i = 0; i < r0; i++)
- {
- gBattleAnimArgs[i] = SCRIPT_READ_16(gBattleAnimScriptPtr);
- gBattleAnimScriptPtr += 2;
- }
- if (r4 & 0x80)
- {
- r4 ^= 0x80;
- if (r4 > 0x3F)
- r4 -= 0x40;
- else
- r4 = -r4;
- _r0 = sub_8079E90(gBattleAnimEnemyMonIndex);
- r1 = r4;
-
- }
- else
- {
- //_08075B44
- if (r4 > 0x3F)
- r4 -= 0x40;
- else
- r4 = -r4;
- _r0 = sub_8079E90(gBattleAnimPlayerMonIndex);
- r1 = r4;
- }
- r6 = _r0 + r1;
- if ((s16)r6 < 3)
- r6 = 3;
-
- r4 = sub_8077ABC(gBattleAnimEnemyMonIndex, 2);
- r2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 3);
- CreateSpriteAndAnimate(r7, r4, r2, r6);
- gAnimVisualTaskCount++;
-}
-#else
-__attribute__((naked))
-static void ScriptCmd_sprite(void)
-{
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- ldr r5, _08075B2C @ =gBattleAnimScriptPtr\n\
- ldr r1, [r5]\n\
- adds r3, r1, 0x1\n\
- str r3, [r5]\n\
- ldrb r2, [r1, 0x1]\n\
- ldrb r0, [r3, 0x1]\n\
- lsls r0, 8\n\
- adds r2, r0\n\
- ldrb r0, [r3, 0x2]\n\
- lsls r0, 16\n\
- adds r2, r0\n\
- ldrb r0, [r3, 0x3]\n\
- lsls r0, 24\n\
- adds r7, r2, r0\n\
- adds r0, r1, 0x5\n\
- str r0, [r5]\n\
- ldrb r4, [r1, 0x5]\n\
- adds r0, r1, 0x6\n\
- str r0, [r5]\n\
- ldrb r0, [r1, 0x6]\n\
- adds r1, 0x7\n\
- str r1, [r5]\n\
- cmp r0, 0\n\
- beq _08075B14\n\
- adds r6, r5, 0\n\
- ldr r5, _08075B30 @ =gBattleAnimArgs\n\
- adds r3, r0, 0\n\
-_08075AFC:\n\
- ldr r2, [r6]\n\
- ldrb r1, [r2]\n\
- ldrb r0, [r2, 0x1]\n\
- lsls r0, 8\n\
- orrs r1, r0\n\
- strh r1, [r5]\n\
- adds r2, 0x2\n\
- str r2, [r6]\n\
- adds r5, 0x2\n\
- subs r3, 0x1\n\
- cmp r3, 0\n\
- bne _08075AFC\n\
-_08075B14:\n\
- movs r0, 0x80\n\
- ands r0, r4\n\
- cmp r0, 0\n\
- beq _08075B44\n\
- movs r0, 0x80\n\
- eors r4, r0\n\
- cmp r4, 0x3F\n\
- bls _08075B34\n\
- adds r0, r4, 0\n\
- subs r0, 0x40\n\
- b _08075B36\n\
- .align 2, 0\n\
-_08075B2C: .4byte gBattleAnimScriptPtr\n\
-_08075B30: .4byte gBattleAnimArgs\n\
-_08075B34:\n\
- negs r0, r4\n\
-_08075B36:\n\
- lsls r0, 24\n\
- lsrs r4, r0, 24\n\
- ldr r0, _08075B40 @ =gBattleAnimEnemyMonIndex\n\
- b _08075B56\n\
- .align 2, 0\n\
-_08075B40: .4byte gBattleAnimEnemyMonIndex\n\
-_08075B44:\n\
- cmp r4, 0x3F\n\
- bls _08075B4E\n\
- adds r0, r4, 0\n\
- subs r0, 0x40\n\
- b _08075B50\n\
-_08075B4E:\n\
- negs r0, r4\n\
-_08075B50:\n\
- lsls r0, 24\n\
- lsrs r4, r0, 24\n\
- ldr r0, _08075BAC @ =gBattleAnimPlayerMonIndex\n\
-_08075B56:\n\
- ldrb r0, [r0]\n\
- bl sub_8079E90\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- lsls r1, r4, 24\n\
- asrs r1, 24\n\
- adds r0, r1\n\
- lsls r0, 16\n\
- lsrs r6, r0, 16\n\
- lsls r0, r6, 16\n\
- asrs r0, 16\n\
- cmp r0, 0x2\n\
- bgt _08075B74\n\
- movs r6, 0x3\n\
-_08075B74:\n\
- ldr r5, _08075BB0 @ =gBattleAnimEnemyMonIndex\n\
- ldrb r0, [r5]\n\
- movs r1, 0x2\n\
- bl sub_8077ABC\n\
- adds r4, r0, 0\n\
- lsls r4, 24\n\
- lsrs r4, 24\n\
- ldrb r0, [r5]\n\
- movs r1, 0x3\n\
- bl sub_8077ABC\n\
- adds r2, r0, 0\n\
- lsls r2, 24\n\
- lsrs r2, 24\n\
- lsls r3, r6, 24\n\
- lsrs r3, 24\n\
- adds r0, r7, 0\n\
- adds r1, r4, 0\n\
- bl CreateSpriteAndAnimate\n\
- ldr r1, _08075BB4 @ =gAnimVisualTaskCount\n\
- ldrb r0, [r1]\n\
- adds r0, 0x1\n\
- strb r0, [r1]\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_08075BAC: .4byte gBattleAnimPlayerMonIndex\n\
-_08075BB0: .4byte gBattleAnimEnemyMonIndex\n\
-_08075BB4: .4byte gAnimVisualTaskCount\n\
- .syntax divided\n");
-}
-#endif
-
-static void ScriptCmd_createtask(void)
-{
- TaskFunc taskFunc;
- u8 taskPriority;
- u8 taskId;
- u8 numArgs;
- s32 i;
-
- gBattleAnimScriptPtr++;
- taskFunc = (TaskFunc)SCRIPT_READ_32(gBattleAnimScriptPtr);
- gBattleAnimScriptPtr += 4;
- taskPriority = SCRIPT_READ_8(gBattleAnimScriptPtr);
- gBattleAnimScriptPtr++;
- numArgs = SCRIPT_READ_8(gBattleAnimScriptPtr);
- gBattleAnimScriptPtr++;
-
- for (i = 0; i < numArgs; i++)
- {
- gBattleAnimArgs[i] = SCRIPT_READ_16(gBattleAnimScriptPtr);
- gBattleAnimScriptPtr += 2;
- }
-
- taskId = CreateTask(taskFunc, taskPriority);
- taskFunc(taskId);
- gAnimVisualTaskCount++;
-}
-
-static void ScriptCmd_delay(void)
-{
- gBattleAnimScriptPtr++;
- gAnimFramesToWait = SCRIPT_READ_8(gBattleAnimScriptPtr);
- if (gAnimFramesToWait == 0)
- gAnimFramesToWait = -1;
- gBattleAnimScriptPtr++;
- gAnimScriptCallback = WaitAnimFrameCount;
-}
-
-// wait for visual tasks to finish.
-static void ScriptCmd_waitforvisualfinish(void)
-{
- if (gAnimVisualTaskCount == 0)
- {
- gBattleAnimScriptPtr++;
- gAnimFramesToWait = 0;
- }
- else
- {
- gAnimFramesToWait = 1;
- }
-}
-
-static void ScriptCmd_hang1(void)
-{
-}
-
-static void ScriptCmd_hang2(void)
-{
-}
-
-static void ScriptCmd_end(void)
-{
- s32 i;
- bool32 continuousAnim = FALSE;
-
- // keep waiting as long as there is animations to be done.
- if (gAnimVisualTaskCount != 0 || gAnimSoundTaskCount != 0
- || gMonAnimTaskIdArray[0] != 0xFF || gMonAnimTaskIdArray[1] != 0xFF)
- {
- gSoundAnimFramesToWait = 0;
- gAnimFramesToWait = 1;
- return;
- }
-
- // finish the sound effects.
- if (IsSEPlaying())
- {
- if (++gSoundAnimFramesToWait <= 90) // wait 90 frames, then halt the sound effect.
- {
- gAnimFramesToWait = 1;
- return;
- }
- else
- {
- m4aMPlayStop(&gMPlay_SE1);
- m4aMPlayStop(&gMPlay_SE2);
- }
- }
-
- // the SE has halted, so set the SE Frame Counter to 0 and continue.
- gSoundAnimFramesToWait = 0;
-
- for (i = 0; i < 8; i++)
- {
- if (gAnimSpriteIndexArray[i] != 0xFFFF)
- {
- FreeSpriteTilesByTag(gBattleAnimPicTable[gAnimSpriteIndexArray[i]].tag);
- FreeSpritePaletteByTag(gBattleAnimPicTable[gAnimSpriteIndexArray[i]].tag);
- gAnimSpriteIndexArray[i] |= 0xFFFF; // set terminator.
- }
- }
-
- if (continuousAnim == FALSE) // may have been used for debug?
- {
- m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 256);
- if (IsContest() == 0)
- {
- sub_8079E24();
- sub_8043EB4(1);
- }
- gAnimScriptActive = FALSE;
- }
-}
-
-static void ScriptCmd_playse(void)
-{
- gBattleAnimScriptPtr++;
- PlaySE(SCRIPT_READ_16(gBattleAnimScriptPtr));
- gBattleAnimScriptPtr += 2;
-}
-
-static void ScriptCmd_monbg(void)
-{
- u8 r6;
- u8 r5;
- u8 r0;
- u8 r7;
- u16 r4;
- u8 taskId;
-
- gBattleAnimScriptPtr++;
- r6 = SCRIPT_READ_8(gBattleAnimScriptPtr);
- if (r6 == 0)
- r6 = 2;
- else if (r6 == 1)
- r6 = 3;
- if (r6 == 0 || r6 == 2)
- r5 = gBattleAnimPlayerMonIndex;
- else
- r5 = gBattleAnimEnemyMonIndex;
- if (b_side_obj__get_some_boolean(r5))
- {
- r0 = GetBankIdentity(r5);
- r0 += 0xFF;
- if (r0 <= 1 || IsContest() != 0)
- r7 = 0;
- else
- r7 = 1;
- sub_8076034(r5, r7);
- r4 = gObjectBankIDs[r5];
- taskId = CreateTask(task_pA_ma0A_obj_to_bg_pal, 10);
- gTasks[taskId].data[0] = r4;
- gTasks[taskId].data[1] = gSprites[r4].pos1.x + gSprites[r4].pos2.x;
- gTasks[taskId].data[2] = gSprites[r4].pos1.y + gSprites[r4].pos2.y;
- if (r7 == 0)
- {
- gTasks[taskId].data[3] = gUnknown_030042C0;
- gTasks[taskId].data[4] = gUnknown_030041B4;
- }
- else
- {
- gTasks[taskId].data[3] = gUnknown_03004288;
- gTasks[taskId].data[4] = gUnknown_03004280;
- }
- gTasks[taskId].data[5] = r7;
- gTasks[taskId].data[6] = r5;
- gMonAnimTaskIdArray[0] = taskId;
-
- }
- r5 ^= 2;
- if (r6 > 1 && b_side_obj__get_some_boolean(r5))
- {
- r0 = GetBankIdentity(r5);
- r0 += 0xFF;
- if (r0 <= 1 || IsContest() != 0)
- r7 = 0;
- else
- r7 = 1;
- sub_8076034(r5, r7);
- r4 = gObjectBankIDs[r5];
- taskId = CreateTask(task_pA_ma0A_obj_to_bg_pal, 10);
- gTasks[taskId].data[0] = r4;
- gTasks[taskId].data[1] = gSprites[r4].pos1.x + gSprites[r4].pos2.x;
- gTasks[taskId].data[2] = gSprites[r4].pos1.y + gSprites[r4].pos2.y;
- if (r7 == 0)
- {
- gTasks[taskId].data[3] = gUnknown_030042C0;
- gTasks[taskId].data[4] = gUnknown_030041B4;
- }
- else
- {
- gTasks[taskId].data[3] = gUnknown_03004288;
- gTasks[taskId].data[4] = gUnknown_03004280;
- }
- gTasks[taskId].data[5] = r7;
- gTasks[taskId].data[6] = r5;
- gMonAnimTaskIdArray[1] = taskId;
- }
- gBattleAnimScriptPtr++;
-}
-
-#ifdef NONMATCHING
-bool8 b_side_obj__get_some_boolean(u8 a)
-{
- if (IsContest() != 0)
- {
- if (a == gBattleAnimPlayerMonIndex)
- return TRUE;
- else
- return FALSE;
- }
- if (sub_8078874(a) == 0)
- return FALSE;
- if (IsContest() != 0)
- return TRUE; // this line wont ever be reached.
- if ((EWRAM_17800[a].unk0 & 1) == 0)
- return TRUE;
- if (gSprites[gObjectBankIDs[a]].invisible)
- return FALSE;
- return TRUE;
-}
-#else
-__attribute__((naked))
-bool8 b_side_obj__get_some_boolean(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\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _08075FDC\n\
- ldr r0, _08075FD8 @ =gBattleAnimPlayerMonIndex\n\
- ldrb r0, [r0]\n\
- cmp r4, r0\n\
- beq _0807601C\n\
- b _0807602C\n\
- .align 2, 0\n\
-_08075FD8: .4byte gBattleAnimPlayerMonIndex\n\
-_08075FDC:\n\
- adds r0, r4, 0\n\
- bl sub_8078874\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _0807602C\n\
- bl IsContest\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- bne _0807601C\n\
- lsls r0, r5, 2\n\
- ldr r1, _08076020 @ =0x02017800\n\
- adds r0, r1\n\
- ldrb r1, [r0]\n\
- movs r0, 0x1\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0807601C\n\
- ldr r2, _08076024 @ =gSprites\n\
- ldr r0, _08076028 @ =gObjectBankIDs\n\
- adds r0, r5, r0\n\
- ldrb r1, [r0]\n\
- lsls r0, r1, 4\n\
- adds r0, r1\n\
- lsls r0, 2\n\
- adds r0, r2\n\
- adds r0, 0x3E\n\
- ldrb r0, [r0]\n\
- lsls r0, 29\n\
- cmp r0, 0\n\
- blt _0807602C\n\
-_0807601C:\n\
- movs r0, 0x1\n\
- b _0807602E\n\
- .align 2, 0\n\
-_08076020: .4byte 0x02017800\n\
-_08076024: .4byte gSprites\n\
-_08076028: .4byte gObjectBankIDs\n\
-_0807602C:\n\
- movs r0, 0\n\
-_0807602E:\n\
- pop {r4,r5}\n\
- pop {r1}\n\
- bx r1\n\
- .syntax divided\n");
-}
-#endif
-
-void sub_8076034(u8 a, u8 b)
-{
- volatile u8 pointlessZero;
- u16 *addr2;
- u8 spriteId;
-
- if (b == 0)
- {
- struct UnknownStruct2 s;
- u8 *addr;
- u32 size;
- u8 r2;
- u16 *addr3;
-
- sub_8078914(&s);
- addr = s.unk0;
- size = 0x2000;
- while (1)
- {
- DmaFill32(3, 0, addr, 0x1000);
- addr += 0x1000;
- size -= 0x1000;
- if (size <= 0x1000)
- {
- DmaFill32(3, 0, addr, size);
- break;
- }
- }
- pointlessZero = 0;
- pointlessZero = 0;
- addr2 = (void *)s.unk4;
- DmaFill16(3, 0xFF, addr2, 0x1000);
-
- REG_BG1CNT_BITFIELD.priority = 2;
- REG_BG1CNT_BITFIELD.screenSize = 1;
- REG_BG1CNT_BITFIELD.areaOverflowMode = 0;
-
- spriteId = gObjectBankIDs[a];
- gUnknown_030042C0 = -(gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x) + 32;
- if (IsContest() != 0 && sub_80AEB1C(EWRAM_19348) != 0)
- gUnknown_030042C0--;
- gUnknown_030041B4 = -(gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y) + 32;
- gSprites[gObjectBankIDs[a]].invisible = TRUE;
-
- REG_BG1HOFS = gUnknown_030042C0;
- REG_BG1VOFS = gUnknown_030041B4;
-
- LoadPalette(gPlttBufferUnfaded + 0x100 + a * 16, s.unk8 * 16, 32);
- addr3 = (u16 *)PLTT + s.unk8 * 16;
- DmaCopy32(3, gPlttBufferUnfaded + 0x100 + a * 16, addr3, 32);
-
- if (IsContest() != 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)
- sub_8076380();
- }
- else
- {
- u8 *addr;
- u32 size;
- u16 *addr3;
-
- addr = (void *)(VRAM + 0x6000);
- size = 0x2000;
- while (1)
- {
- DmaFill32(3, 0, addr, 0x1000);
- addr += 0x1000;
- size -= 0x1000;
- if (size <= 0x1000)
- {
- DmaFill32(3, 0, addr, size);
- break;
- }
- }
- pointlessZero = 0;
- pointlessZero = 0;
- addr2 = (void *)(VRAM + 0xF000);
- DmaFill32(3, 0, addr2, 0x800);
-
- REG_BG2CNT_BITFIELD.priority = 2;
- REG_BG2CNT_BITFIELD.screenSize = 1;
- REG_BG2CNT_BITFIELD.areaOverflowMode = 0;
-
- spriteId = gObjectBankIDs[a];
- gUnknown_03004288 = -(gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x) + 32;
- gUnknown_03004280 = -(gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y) + 32;
- gSprites[gObjectBankIDs[a]].invisible = TRUE;
-
- REG_BG2HOFS = gUnknown_03004288;
- REG_BG2VOFS = gUnknown_03004280;
-
- LoadPalette(gPlttBufferUnfaded + 0x100 + a * 16, 0x90, 32);
- addr3 = (void *)(PLTT + 0x120);
- DmaCopy32(3, gPlttBufferUnfaded + 0x100 + a * 16, addr3, 32);
-
- sub_80E4EF8(0, 0, GetBankIdentity(a), 9, 0x6000, 0x1E, REG_BG2CNT_BITFIELD.charBaseBlock);
- }
-}
-
-static void sub_8076380(void)
-{
- int i;
- int j;
- struct UnknownStruct2 s;
- u16 *ptr;
-
- if (sub_80AEB1C(EWRAM_19348) != 0)
- {
- sub_8078914(&s);
- ptr = s.unk4;
- for (i = 0; i < 8; i++)
- {
- for (j = 0; j < 4; j++)
- {
- u16 temp = ptr[j + i * 32];
-
- ptr[j + i * 32] = ptr[7 - j + i * 32];
- ptr[7 - j + i * 32] = temp;
- }
- }
- for (i = 0; i < 8; i++)
- {
- for (j = 0; j < 8; j++)
- ptr[j + i * 32] ^= 0x400;
- }
- }
-}
-
-void sub_80763FC(u16 a, u16 *b, u32 c, u8 d)
-{
- u8 i;
- u8 j;
- u32 r9;
-
- if (d == 0)
- r9 = 32;
- else
- r9 = 64;
- a <<= 12;
- for (i = 0; i < r9; i++)
- {
- for (j = 0; j < 32; j++)
- b[j + i * 32] = ((b[j + i * 32] & 0xFFF) | a) + c;
- }
-}
-
-void sub_8076464(u8 a)
-{
- u8 *addr;
- u32 size;
- volatile u8 pointlessZero;
- struct UnknownStruct2 s;
-
- sub_8078914(&s);
- if (a == 0 || IsContest() != 0)
- {
- u16 *addr2;
-
- addr = s.unk0;
- size = 0x2000;
- while (1)
- {
- DmaFill32(3, 0, addr, 0x1000);
- addr += 0x1000;
- size -= 0x1000;
- if (size <= 0x1000)
- {
- DmaFill32(3, 0, addr, size);
- break;
- }
- }
- pointlessZero = 0;
- pointlessZero = 0;
- addr2 = s.unk4;
- DmaFill32(3, 0, addr2, 0x800);
- gUnknown_030042C0 = 0;
- gUnknown_030041B4 = 0;
- }
- else
- {
- u16 *addr2;
-
- addr = (void *)(VRAM + 0x6000);
- size = 0x2000;
- while (1)
- {
- DmaFill32(3, 0, addr, 0x1000);
- addr += 0x1000;
- size -= 0x1000;
- if (size <= 0x1000)
- {
- DmaFill32(3, 0, addr, size);
- break;
- }
- }
- pointlessZero = 0;
- pointlessZero = 0;
- addr2 = (void *)(VRAM + 0xF000);
- DmaFill32(3, 0, addr2, 0x800);
- gUnknown_03004288 = 0;
- gUnknown_03004280 = 0;
- }
-}
-
-static void task_pA_ma0A_obj_to_bg_pal(u8 taskId)
-{
- u8 r4;
- u8 r6;
- s16 r3;
- s16 r2;
- struct UnknownStruct2 s;
-
- r4 = gTasks[taskId].data[0];
- r6 = gTasks[taskId].data[6];
- sub_8078914(&s);
- r3 = gTasks[taskId].data[1] - (gSprites[r4].pos1.x + gSprites[r4].pos2.x);
- r2 = gTasks[taskId].data[2] - (gSprites[r4].pos1.y + gSprites[r4].pos2.y);
- if (gTasks[taskId].data[5] == 0)
- {
- u16 *src;
- u16 *dst;
-
- gUnknown_030042C0 = r3 + gTasks[taskId].data[3];
- gUnknown_030041B4 = r2 + gTasks[taskId].data[4];
- src = gPlttBufferFaded + 0x100 + r6 * 16;
- dst = gPlttBufferFaded + 0x100 + s.unk8 * 16 - 256;
- DmaCopy32(3, src, dst, 32);
- }
- else
- {
- u16 *src;
- u16 *dst;
-
- gUnknown_03004288 = r3 + gTasks[taskId].data[3];
- gUnknown_03004280 = r2 + gTasks[taskId].data[4];
- src = gPlttBufferFaded + 0x100 + r6 * 16;
- dst = gPlttBufferFaded + 0x100 - 112;
- DmaCopy32(3, src, dst, 32);
- }
-}
-
-static void ScriptCmd_clearmonbg(void)
-{
- u8 r4;
- u8 r5;
- u8 taskId;
-
- gBattleAnimScriptPtr++;
- r4 = SCRIPT_READ_8(gBattleAnimScriptPtr);
- if (r4 == 0)
- r4 = 2;
- else if (r4 == 1)
- r4 = 3;
- if (r4 == 0 || r4 == 2)
- r5 = gBattleAnimPlayerMonIndex;
- else
- r5 = gBattleAnimEnemyMonIndex;
- if (gMonAnimTaskIdArray[0] != 0xFF)
- gSprites[gObjectBankIDs[r5]].invisible = FALSE;
- if (r4 > 1 && gMonAnimTaskIdArray[1] != 0xFF)
- gSprites[gObjectBankIDs[r5 ^ 2]].invisible = FALSE;
- else
- r4 = 0;
- taskId = CreateTask(sub_807672C, 5);
- gTasks[taskId].data[0] = r4;
- gTasks[taskId].data[2] = r5;
- gBattleAnimScriptPtr++;
-}
-
-static void sub_807672C(u8 taskId)
-{
- u8 var;
- u8 r4;
-
- gTasks[taskId].data[1]++;
- if (gTasks[taskId].data[1] != 1)
- {
- var = GetBankIdentity(gTasks[taskId].data[2]);
- var += 0xFF;
- if (var <= 1 || IsContest() != 0)
- r4 = 0;
- else
- r4 = 1;
- if (gMonAnimTaskIdArray[0] != 0xFF)
- {
- sub_8076464(r4);
- DestroyTask(gMonAnimTaskIdArray[0]);
- gMonAnimTaskIdArray[0] = 0xFF;
- }
- if (gTasks[taskId].data[0] > 1)
- {
- sub_8076464(r4 ^ 1);
- DestroyTask(gMonAnimTaskIdArray[1]);
- gMonAnimTaskIdArray[1] = 0xFF;
- }
- DestroyTask(taskId);
- }
-}
-
-static void ScriptCmd_monbg_22(void)
-{
- u8 r5;
- u8 r4;
- u8 r0;
- u8 r1;
-
- gBattleAnimScriptPtr++;
- r5 = SCRIPT_READ_8(gBattleAnimScriptPtr);
- if (r5 == 0)
- r5 = 2;
- else if (r5 == 1)
- r5 = 3;
- if (r5 == 0 || r5 == 2)
- r4 = gBattleAnimPlayerMonIndex;
- else
- r4 = gBattleAnimEnemyMonIndex;
- if (b_side_obj__get_some_boolean(r4))
- {
- r0 = GetBankIdentity(r4);
- r0 += 0xFF;
- if (r0 <= 1 || IsContest() != 0)
- r1 = 0;
- else
- r1 = 1;
- sub_8076034(r4, r1);
- gSprites[gObjectBankIDs[r4]].invisible = FALSE;
- }
- r4 ^= 2;
- if (r5 > 1 && b_side_obj__get_some_boolean(r4))
- {
- r0 = GetBankIdentity(r4);
- r0 += 0xFF;
- if (r0 <= 1 || IsContest() != 0)
- r1 = 0;
- else
- r1 = 1;
- sub_8076034(r4, r1);
- gSprites[gObjectBankIDs[r4]].invisible = FALSE;
- }
- gBattleAnimScriptPtr++;
-}
-
-static void ScriptCmd_clearmonbg_23(void)
-{
- u8 r5;
- u8 r6;
- u8 taskId;
-
- gBattleAnimScriptPtr++;
- r5 = SCRIPT_READ_8(gBattleAnimScriptPtr);
- if (r5 == 0)
- r5 = 2;
- else if (r5 == 1)
- r5 = 3;
- if (r5 == 0 || r5 == 2)
- r6 = gBattleAnimPlayerMonIndex;
- else
- r6 = gBattleAnimEnemyMonIndex;
- if (b_side_obj__get_some_boolean(r6))
- gSprites[gObjectBankIDs[r6]].invisible = FALSE;
- if (r5 > 1 && b_side_obj__get_some_boolean(r6 ^ 2))
- gSprites[gObjectBankIDs[r6 ^ 2]].invisible = FALSE;
- else
- r5 = 0;
- taskId = CreateTask(sub_80769A4, 5);
- gTasks[taskId].data[0] = r5;
- gTasks[taskId].data[2] = r6;
- gBattleAnimScriptPtr++;
-}
-
-static void sub_80769A4(u8 taskId)
-{
- u8 r0;
- u8 r4;
- u8 r5;
-
- gTasks[taskId].data[1]++;
- if (gTasks[taskId].data[1] != 1)
- {
- r4 = gTasks[taskId].data[2];
- r0 = GetBankIdentity(r4);
- r0 += 0xFF;
- if (r0 <= 1 || IsContest() != 0)
- r5 = 0;
- else
- r5 = 1;
- if (b_side_obj__get_some_boolean(r4))
- sub_8076464(r5);
- if (gTasks[taskId].data[0] > 1 && b_side_obj__get_some_boolean(r4 ^ 2))
- sub_8076464(r5 ^ 1);
- DestroyTask(taskId);
- }
-}
-
-static void ScriptCmd_setalpha(void)
-{
- u16 r3;
- u16 r1;
-
- gBattleAnimScriptPtr++;
- r3 = *(gBattleAnimScriptPtr++);
- r1 = *(gBattleAnimScriptPtr++) << 8;
- REG_BLDCNT = 0x3F40;
- REG_BLDALPHA = r3 | r1;
-}
-
-static void ScriptCmd_setbldcnt(void)
-{
- u16 r3;
- u16 r1;
-
- gBattleAnimScriptPtr++;
- r3 = *(gBattleAnimScriptPtr++);
- r1 = *(gBattleAnimScriptPtr++) << 8;
- REG_BLDCNT = r3 | r1;
-}
-
-static void ScriptCmd_blendoff(void)
-{
- gBattleAnimScriptPtr++;
- REG_BLDCNT = 0;
- REG_BLDALPHA = 0;
-}
-
-static void ScriptCmd_call(void)
-{
- u32 addr;
-
- gBattleAnimScriptPtr++;
- gBattleAnimScriptRetAddr = gBattleAnimScriptPtr + 4;
- addr = SCRIPT_READ_32(gBattleAnimScriptPtr);
- gBattleAnimScriptPtr = (u8 *)addr;
-}
-
-static void ScriptCmd_return(void)
-{
- gBattleAnimScriptPtr = gBattleAnimScriptRetAddr;
-}
-
-static void ScriptCmd_setvar(void)
-{
- const u8 *addr = gBattleAnimScriptPtr;
- u16 r4;
- u8 r2;
-
- gBattleAnimScriptPtr++;
- r2 = SCRIPT_READ_8(gBattleAnimScriptPtr);
- gBattleAnimScriptPtr++;
- r4 = SCRIPT_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;
-}
-
-static void ScriptCmd_jumpif(void)
-{
- u8 r1;
- u32 addr;
-
- gBattleAnimScriptPtr++;
- r1 = SCRIPT_READ_8(gBattleAnimScriptPtr);
- gBattleAnimScriptPtr++;
- if (r1 == gUnknown_0202F7C4)
- {
- addr = SCRIPT_READ_32(gBattleAnimScriptPtr);
- gBattleAnimScriptPtr = (u8 *)addr;
- }
- else
- {
- gBattleAnimScriptPtr += 4;
- }
-}
-
-static void ScriptCmd_jump(void)
-{
- u32 addr;
-
- gBattleAnimScriptPtr++;
- addr = SCRIPT_READ_32(gBattleAnimScriptPtr);
- gBattleAnimScriptPtr = (u8 *)addr;
-}
-
-// 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)
-{
- if (!gMain.inBattle)
- return TRUE;
- else
- return FALSE;
-}
-
-static void ScriptCmd_fadetobg(void)
-{
- u8 r4;
- u8 taskId;
-
- gBattleAnimScriptPtr++;
- r4 = SCRIPT_READ_8(gBattleAnimScriptPtr);
- gBattleAnimScriptPtr++;
- taskId = CreateTask(task_p5_load_battle_screen_elements, 5);
- gTasks[taskId].data[0] = r4;
- gUnknown_0202F7C5 = 1;
-}
-
-static void ScriptCmd_fadetobg_25(void)
-{
- u8 r8;
- u8 r7;
- u8 r6;
- u8 taskId;
-
- gBattleAnimScriptPtr++;
- r8 = gBattleAnimScriptPtr[0];
- r7 = gBattleAnimScriptPtr[1];
- r6 = gBattleAnimScriptPtr[2];
- gBattleAnimScriptPtr += 3;
- taskId = CreateTask(task_p5_load_battle_screen_elements, 5);
- if (IsContest() != 0)
- gTasks[taskId].data[0] = r6;
- else if (GetBankSide(gBattleAnimEnemyMonIndex) == 0)
- gTasks[taskId].data[0] = r7;
- else
- gTasks[taskId].data[0] = r8;
- gUnknown_0202F7C5 = 1;
-}
-
-static void task_p5_load_battle_screen_elements(u8 taskId)
-{
- if (gTasks[taskId].data[10] == 0)
- {
- BeginHardwarePaletteFade(0xE8, 0, 0, 16, 0);
- gTasks[taskId].data[10]++;
- return;
- }
- if (gPaletteFade.active)
- return;
- if (gTasks[taskId].data[10] == 1)
- {
- gTasks[taskId].data[10]++;
- gUnknown_0202F7C5 = 2;
- }
- else if (gTasks[taskId].data[10] == 2)
- {
- s16 data0 = (u16)gTasks[taskId].data[0];
-
- if (data0 == -1)
- dp01t_11_3_message_for_player_only();
- else
- sub_8076DB8(data0);
- BeginHardwarePaletteFade(0xE8, 0, 16, 0, 1);
- gTasks[taskId].data[10]++;
- return;
- }
- if (gPaletteFade.active)
- return;
- if (gTasks[taskId].data[10] == 3)
- {
- DestroyTask(taskId);
- gUnknown_0202F7C5 = 0;
- }
-}
-
-static void sub_8076DB8(u16 a)
-{
- if (IsContest())
- {
- 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;
- dmaDest = (void *)(VRAM + 0xD000);
- DmaCopy32(3, dmaSrc, dmaDest, 0x800);
- LZDecompressVram(gBattleAnimBackgroundTable[a].image, (void *)(VRAM + 0x2000));
- LoadCompressedPalette(gBattleAnimBackgroundTable[a].palette, sub_80789BC() * 16, 32);
- }
- else
- {
- LZDecompressVram(gBattleAnimBackgroundTable[a].tilemap, (void *)(VRAM + 0xD000));
- LZDecompressVram(gBattleAnimBackgroundTable[a].image, (void *)(VRAM + 0x8000));
- LoadCompressedPalette(gBattleAnimBackgroundTable[a].palette, 32, 32);
- }
-}
-
-static void dp01t_11_3_message_for_player_only(void)
-{
- if (IsContest())
- sub_80AB2AC();
- else
- sub_800D7B8();
-}
-
-static void ScriptCmd_restorebg(void)
-{
- u8 taskId;
-
- gBattleAnimScriptPtr++;
- taskId = CreateTask(task_p5_load_battle_screen_elements, 5);
- gTasks[taskId].data[0] = 0xFFFF;
- gUnknown_0202F7C5 = 1;
-}
-
-static void ScriptCmd_waitbgfadeout(void)
-{
- if (gUnknown_0202F7C5 == 2)
- {
- gBattleAnimScriptPtr++;
- gAnimFramesToWait = 0;
- }
- else
- {
- gAnimFramesToWait = 1;
- }
-}
-
-static void ScriptCmd_waitbgfadein(void)
-{
- if (gUnknown_0202F7C5 == 0)
- {
- gBattleAnimScriptPtr++;
- gAnimFramesToWait = 0;
- }
- else
- {
- gAnimFramesToWait = 1;
- }
-}
-
-static void ScriptCmd_changebg(void)
-{
- gBattleAnimScriptPtr++;
- sub_8076DB8(SCRIPT_READ_8(gBattleAnimScriptPtr));
- gBattleAnimScriptPtr++;
-}
-
-//Weird control flow
-/*
-s8 sub_8076F98(s8 a)
-{
- if (!IsContest() && (EWRAM_17810[gBattleAnimPlayerMonIndex].unk0 & 0x10))
- {
- a = GetBankSide(gBattleAnimPlayerMonIndex) ? 0xC0 : 0x3F;
- }
- //_08076FDC
- else
- {
- if (IsContest())
- {
- if (gBattleAnimPlayerMonIndex == gBattleAnimEnemyMonIndex && gBattleAnimPlayerMonIndex == 2
- && a == 0x3F)
- {
- //jump to _0807707A
- if (a < -0x40)
- a = 0xC0;
- return a;
- }
- }
- //_08077004
- else
- {
- if (GetBankSide(gBattleAnimPlayerMonIndex) == 0)
- {
- if (GetBankSide(gBattleAnimEnemyMonIndex) == 0)
- }
- //_08077042
- else
- {
-
- }
- //_0807706C
- }
- }
- //_0807706E
-}
-*/
-__attribute__((naked))
-s8 sub_8076F98(s8 a)
-{
- asm(".syntax unified\n\
- push {r4,lr}\n\
- lsls r0, 24\n\
- lsrs r4, r0, 24\n\
- bl IsContest\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- bne _08076FDC\n\
- ldr r0, _08076FD4 @ =gBattleAnimPlayerMonIndex\n\
- ldrb r2, [r0]\n\
- lsls r0, r2, 1\n\
- adds r0, r2\n\
- lsls r0, 2\n\
- ldr r1, _08076FD8 @ =0x02017810\n\
- adds r0, r1\n\
- ldrb r1, [r0]\n\
- movs r0, 0x10\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08076FDC\n\
- adds r0, r2, 0\n\
- bl GetBankSide\n\
- lsls r0, 24\n\
- movs r4, 0xC0\n\
- cmp r0, 0\n\
- beq _0807706E\n\
- movs r4, 0x3F\n\
- b _0807706E\n\
- .align 2, 0\n\
-_08076FD4: .4byte gBattleAnimPlayerMonIndex\n\
-_08076FD8: .4byte 0x02017810\n\
-_08076FDC:\n\
- bl IsContest\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _08077004\n\
- ldr r0, _08076FFC @ =gBattleAnimPlayerMonIndex\n\
- ldr r1, _08077000 @ =gBattleAnimEnemyMonIndex\n\
- ldrb r0, [r0]\n\
- ldrb r1, [r1]\n\
- cmp r0, r1\n\
- bne _08077068\n\
- cmp r0, 0x2\n\
- bne _08077068\n\
- cmp r4, 0x3F\n\
- beq _0807707A\n\
- b _08077068\n\
- .align 2, 0\n\
-_08076FFC: .4byte gBattleAnimPlayerMonIndex\n\
-_08077000: .4byte gBattleAnimEnemyMonIndex\n\
-_08077004:\n\
- ldr r0, _0807702C @ =gBattleAnimPlayerMonIndex\n\
- ldrb r0, [r0]\n\
- bl GetBankSide\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- bne _08077042\n\
- ldr r0, _08077030 @ =gBattleAnimEnemyMonIndex\n\
- ldrb r0, [r0]\n\
- bl GetBankSide\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- bne _0807706E\n\
- lsls r0, r4, 24\n\
- asrs r1, r0, 24\n\
- cmp r1, 0x3F\n\
- bne _08077034\n\
- movs r4, 0xC0\n\
- b _0807706E\n\
- .align 2, 0\n\
-_0807702C: .4byte gBattleAnimPlayerMonIndex\n\
-_08077030: .4byte gBattleAnimEnemyMonIndex\n\
-_08077034:\n\
- movs r0, 0x40\n\
- negs r0, r0\n\
- cmp r1, r0\n\
- beq _0807706E\n\
- negs r0, r1\n\
- lsls r0, 24\n\
- b _0807706C\n\
-_08077042:\n\
- ldr r0, _08077064 @ =gBattleAnimEnemyMonIndex\n\
- ldrb r0, [r0]\n\
- bl GetBankSide\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- cmp r0, 0x1\n\
- bne _08077068\n\
- lsls r0, r4, 24\n\
- asrs r0, 24\n\
- movs r1, 0x40\n\
- negs r1, r1\n\
- cmp r0, r1\n\
- bne _0807706E\n\
- movs r4, 0x3F\n\
- b _0807706E\n\
- .align 2, 0\n\
-_08077064: .4byte gBattleAnimEnemyMonIndex\n\
-_08077068:\n\
- lsls r0, r4, 24\n\
- negs r0, r0\n\
-_0807706C:\n\
- lsrs r4, r0, 24\n\
-_0807706E:\n\
- lsls r0, r4, 24\n\
- asrs r0, 24\n\
- cmp r0, 0x3F\n\
- ble _0807707A\n\
- movs r4, 0x3F\n\
- b _08077088\n\
-_0807707A:\n\
- lsls r0, r4, 24\n\
- asrs r0, 24\n\
- movs r1, 0x40\n\
- negs r1, r1\n\
- cmp r0, r1\n\
- bge _08077088\n\
- movs r4, 0xC0\n\
-_08077088:\n\
- lsls r0, r4, 24\n\
- asrs r0, 24\n\
- pop {r4}\n\
- pop {r1}\n\
- bx r1\n\
- .syntax divided\n");
-}
-
-s8 sub_8077094(s8 a)
-{
- if (!IsContest() && (EWRAM_17810[gBattleAnimPlayerMonIndex].unk0 & 0x10))
- {
- if (GetBankSide(gBattleAnimPlayerMonIndex) != 0)
- a = 0x3F;
- else
- a = 0xC0;
- }
- else
- {
- if (GetBankSide(gBattleAnimPlayerMonIndex) != 0 || IsContest() != 0)
- a = -a;
- }
- return a;
-}
-
-s16 sub_8077104(s16 a)
-{
- s16 var = a;
-
- if (var > 63)
- var = 63;
- else if (var < -64)
- var = -64;
- return var;
-}
-
-s16 sub_807712C(s16 a, s16 b, s16 c)
-{
- u16 var;
-
- if (a < b)
- var = ((c < 0) ? -c : c);
- else if (a > b)
- var = -((c < 0) ? -c : c);
- else
- var = 0;
- return var;
-}
-
-static void ScriptCmd_panse_19(void)
-{
- u16 r4;
- s8 r0;
-
- gBattleAnimScriptPtr++;
- r4 = SCRIPT_READ_16(gBattleAnimScriptPtr);
- r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2);
- PlaySE12WithPanning(r4, sub_8076F98(r0));
- gBattleAnimScriptPtr += 3;
-}
-
-static void ScriptCmd_setpan(void)
-{
- s8 r0;
-
- gBattleAnimScriptPtr++;
- r0 = SCRIPT_READ_8(gBattleAnimScriptPtr);
- SE12PanpotControl(sub_8076F98(r0));
- gBattleAnimScriptPtr++;
-}
-
-static void ScriptCmd_panse_1B(void)
-{
- u16 songNum;
- s8 r0;
- s8 r4;
- s8 r6;
- u8 r7;
- s8 panning;
- s8 r8;
- 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);
- panning = sub_8076F98(r0);
- r8 = sub_8076F98(r4);
- r4 = sub_807712C(panning, r8, r6);
- taskId = CreateTask(c3_08073CEC, 1);
- gTasks[taskId].data[0] = panning;
- gTasks[taskId].data[1] = r8;
- gTasks[taskId].data[2] = r4;
- gTasks[taskId].data[3] = r7;
- gTasks[taskId].data[4] = panning;
- PlaySE12WithPanning(songNum, panning);
- gAnimSoundTaskCount++;
- gBattleAnimScriptPtr += 6;
-}
-
-#ifdef NONMATCHING
-static void c3_08073CEC(u8 taskId)
-{
- u16 r7 = 0;
- s16 r0;
- s16 r6;
- s16 r3;
- s16 r4;
- int foo;
-
- r0 = gTasks[taskId].data[8];
- gTasks[taskId].data[8]++;
- if (r0 >= gTasks[taskId].data[3])
- {
- gTasks[taskId].data[8] = r7;
- r6 = gTasks[taskId].data[0];
- r3 = gTasks[taskId].data[1];
- foo = gTasks[taskId].data[4] + gTasks[taskId].data[2];
- r4 = foo;
- gTasks[taskId].data[4] = r4;
- if (gTasks[taskId].data[2] == 0)
- {
- r4 = r3;
- DestroyTask(taskId);
- gAnimSoundTaskCount--;
- }
- //_080772D8
- else
- {
- if (r6 < r3)
- {
- if (r4 < r3)
- goto check;
- DestroyTask(taskId);
- gAnimSoundTaskCount--;
- }
- else
- {
- if (r4 <= r3)
- r7 = 1;
- check:
- if (r7 != 0)
- {
- DestroyTask(taskId);
- gAnimSoundTaskCount--;
- }
- }
- }
- //_080772F8
- SE12PanpotControl(r4);
- }
- //_08077314
-}
-#else
-__attribute__((naked))
-static void c3_08073CEC(u8 taskId)
-{
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- lsls r0, 24\n\
- lsrs r5, r0, 24\n\
- movs r7, 0\n\
- ldr r1, _080772D4 @ =gTasks\n\
- lsls r0, r5, 2\n\
- adds r0, r5\n\
- lsls r0, 3\n\
- adds r2, r0, r1\n\
- ldrh r0, [r2, 0x18]\n\
- adds r1, r0, 0x1\n\
- strh r1, [r2, 0x18]\n\
- lsls r0, 16\n\
- asrs r0, 16\n\
- movs r3, 0xE\n\
- ldrsh r1, [r2, r3]\n\
- cmp r0, r1\n\
- blt _08077314\n\
- strh r7, [r2, 0x18]\n\
- ldrh r6, [r2, 0x8]\n\
- ldrh r3, [r2, 0xA]\n\
- movs r4, 0x10\n\
- ldrsh r0, [r2, r4]\n\
- movs r4, 0xC\n\
- ldrsh r1, [r2, r4]\n\
- adds r0, r1\n\
- lsls r0, 16\n\
- lsrs r4, r0, 16\n\
- strh r4, [r2, 0x10]\n\
- cmp r1, 0\n\
- bne _080772D8\n\
- lsls r2, r3, 16\n\
- b _080772FC\n\
- .align 2, 0\n\
-_080772D4: .4byte gTasks\n\
-_080772D8:\n\
- lsls r1, r6, 16\n\
- lsls r0, r3, 16\n\
- asrs r3, r0, 16\n\
- adds r2, r0, 0\n\
- cmp r1, r2\n\
- bge _080772EE\n\
- lsls r0, r4, 16\n\
- asrs r0, 16\n\
- cmp r0, r3\n\
- blt _080772F8\n\
- b _080772FC\n\
-_080772EE:\n\
- lsls r0, r4, 16\n\
- asrs r0, 16\n\
- cmp r0, r3\n\
- bgt _080772F8\n\
- movs r7, 0x1\n\
-_080772F8:\n\
- cmp r7, 0\n\
- beq _0807730C\n\
-_080772FC:\n\
- lsrs r4, r2, 16\n\
- adds r0, r5, 0\n\
- bl DestroyTask\n\
- ldr r1, _0807731C @ =gAnimSoundTaskCount\n\
- ldrb r0, [r1]\n\
- subs r0, 0x1\n\
- strb r0, [r1]\n\
-_0807730C:\n\
- lsls r0, r4, 24\n\
- asrs r0, 24\n\
- bl SE12PanpotControl\n\
-_08077314:\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_0807731C: .4byte gAnimSoundTaskCount\n\
- .syntax divided\n");
-}
-#endif
-
-static void ScriptCmd_panse_26(void)
-{
- u16 r8;
- s8 r4;
- s8 r5;
- s8 r6;
- u8 r10;
- 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);
- taskId = CreateTask(c3_08073CEC, 1);
- gTasks[taskId].data[0] = r4;
- gTasks[taskId].data[1] = r5;
- gTasks[taskId].data[2] = r6;
- gTasks[taskId].data[3] = r10;
- gTasks[taskId].data[4] = r4;
- PlaySE12WithPanning(r8, r4);
- gAnimSoundTaskCount++;
- gBattleAnimScriptPtr += 6;
-}
-
-static void ScriptCmd_panse_27(void)
-{
- u16 r9;
- u8 r4;
- u8 r8;
- u8 r7;
- u8 r0;
- s8 r6;
- s8 r5;
- s8 r4_2;
- 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);
- r6 = sub_8077094(r0);
- r5 = sub_8077094(r4);
- r4_2 = sub_8077094(r8);
- taskId = CreateTask(c3_08073CEC, 1);
- gTasks[taskId].data[0] = r6;
- gTasks[taskId].data[1] = r5;
- gTasks[taskId].data[2] = r4_2;
- gTasks[taskId].data[3] = r7;
- gTasks[taskId].data[4] = r6;
- PlaySE12WithPanning(r9, r6);
- gAnimSoundTaskCount++;
- gBattleAnimScriptPtr += 6;
-}
-
-static void ScriptCmd_panse_1C(void)
-{
- u16 r5;
- u8 r0;
- u8 r8;
- u8 r9;
- s8 r4;
- 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);
- r4 = sub_8076F98(r0);
- taskId = CreateTask(sub_80774FC, 1);
- gTasks[taskId].data[0] = r5;
- gTasks[taskId].data[1] = r4;
- gTasks[taskId].data[2] = r8;
- gTasks[taskId].data[3] = r9;
- gTasks[taskId].data[8] = r8;
- gTasks[taskId].func(taskId);
- gAnimSoundTaskCount++;
- gBattleAnimScriptPtr += 5;
-}
-
-static void sub_80774FC(u8 taskId)
-{
- s16 data8;
- u16 r0;
- s8 r1;
- u8 r4;
-
- data8 = gTasks[taskId].data[8];
- gTasks[taskId].data[8]++;
- if (data8 >= gTasks[taskId].data[2])
- {
- gTasks[taskId].data[8] = 0;
- r0 = gTasks[taskId].data[0];
- r1 = gTasks[taskId].data[1];
- gTasks[taskId].data[3]--;
- r4 = gTasks[taskId].data[3];
- PlaySE12WithPanning(r0, r1);
- if (r4 == 0)
- {
- DestroyTask(taskId);
- gAnimSoundTaskCount--;
- }
- }
-}
-
-static void ScriptCmd_panse_1D(void)
-{
- u16 r5;
- u8 r0;
- u8 r8;
- s8 r4;
- u8 taskId;
-
- gBattleAnimScriptPtr++;
- r5 = SCRIPT_READ_16(gBattleAnimScriptPtr);
- r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2);
- r8 = SCRIPT_READ_8(gBattleAnimScriptPtr + 3);
- r4 = sub_8076F98(r0);
- taskId = CreateTask(sub_80775CC, 1);
- gTasks[taskId].data[0] = r5;
- gTasks[taskId].data[1] = r4;
- gTasks[taskId].data[2] = r8;
- gAnimSoundTaskCount++;
- gBattleAnimScriptPtr += 4;
-}
-
-static void sub_80775CC(u8 taskId)
-{
- s16 r0;
-
- r0 = gTasks[taskId].data[2];
- gTasks[taskId].data[2]--;
- if (r0 <= 0)
- {
- PlaySE12WithPanning(gTasks[taskId].data[0], gTasks[taskId].data[1]);
- DestroyTask(taskId);
- gAnimSoundTaskCount--;
- }
-}
-
-static void ScriptCmd_createtask_1F(void)
-{
- TaskFunc func;
- u8 numArgs;
- int i;
- u8 taskId;
-
- gBattleAnimScriptPtr++;
- func = (TaskFunc)SCRIPT_READ_32(gBattleAnimScriptPtr);
- gBattleAnimScriptPtr += 4;
- numArgs = SCRIPT_READ_8(gBattleAnimScriptPtr);
- gBattleAnimScriptPtr++;
- for (i = 0; i < numArgs; i++)
- {
- gBattleAnimArgs[i] = SCRIPT_READ_16(gBattleAnimScriptPtr);
- gBattleAnimScriptPtr += 2;
- }
- taskId = CreateTask(func, 1);
- func(taskId);
- gAnimSoundTaskCount++;
-}
-
-static void ScriptCmd_waitsound(void)
-{
- if (gAnimSoundTaskCount != 0)
- {
- gSoundAnimFramesToWait = 0;
- gAnimFramesToWait = 1;
- }
- else if (IsSEPlaying())
- {
- if (++gSoundAnimFramesToWait > 90)
- {
- m4aMPlayStop(&gMPlay_SE1);
- m4aMPlayStop(&gMPlay_SE2);
- gSoundAnimFramesToWait = 0;
- }
- else
- {
- gAnimFramesToWait = 1;
- }
- }
- else
- {
- gSoundAnimFramesToWait = 0;
- gBattleAnimScriptPtr++;
- gAnimFramesToWait = 0;
- }
-}
-
-static void ScriptCmd_jumpvareq(void)
-{
- u8 r2;
- s16 r1;
- u8 *addr;
-
- gBattleAnimScriptPtr++;
- r2 = SCRIPT_READ_8(gBattleAnimScriptPtr);
- r1 = SCRIPT_READ_16(gBattleAnimScriptPtr + 1);
- if (r1 == gBattleAnimArgs[r2])
- {
- addr = (u8 *)SCRIPT_READ_32(gBattleAnimScriptPtr + 3);
- gBattleAnimScriptPtr = addr;
- }
- else
- {
- gBattleAnimScriptPtr += 7;
- }
-}
-
-static void ScriptCmd_jumpunkcond(void)
-{
- u8 *addr;
-
- gBattleAnimScriptPtr++;
- if (IsContest())
- {
- addr = (u8 *)SCRIPT_READ_32(gBattleAnimScriptPtr);
- gBattleAnimScriptPtr = addr;
- }
- else
- {
- gBattleAnimScriptPtr += 4;
- }
-}
-
-static void ScriptCmd_monbgprio_28(void)
-{
- u8 r2;
- u8 r0;
- u8 r4;
-
- r2 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1);
- gBattleAnimScriptPtr += 2;
- if (r2 != 0)
- r0 = gBattleAnimEnemyMonIndex;
- else
- r0 = gBattleAnimPlayerMonIndex;
- r4 = GetBankIdentity(r0);
- if (!IsContest() && (r4 == 0 || r4 == 3))
- {
- REG_BG1CNT_BITFIELD.priority = 1;
- REG_BG2CNT_BITFIELD.priority = 2;
- }
-}
-
-static void ScriptCmd_monbgprio_29(void)
-{
- gBattleAnimScriptPtr++;
- if (!IsContest())
- {
- REG_BG1CNT_BITFIELD.priority = 1;
- REG_BG2CNT_BITFIELD.priority = 2;
- }
-}
-
-static void ScriptCmd_monbgprio_2A(void)
-{
- u8 r6;
- u8 r4;
- u8 r0;
-
- r6 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1);
- gBattleAnimScriptPtr += 2;
- if (GetBankSide(gBattleAnimPlayerMonIndex) != GetBankSide(gBattleAnimEnemyMonIndex))
- {
- if (r6 != 0)
- r0 = gBattleAnimEnemyMonIndex;
- else
- r0 = gBattleAnimPlayerMonIndex;
- r4 = GetBankIdentity(r0);
- if (!IsContest() && (r4 == 0 || r4 == 3))
- {
- REG_BG1CNT_BITFIELD.priority = 1;
- REG_BG2CNT_BITFIELD.priority = 2;
- }
- }
-}
-
-static void ScriptCmd_invisible(void)
-{
- u8 r0;
- u8 spriteId;
-
- r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1);
- spriteId = obj_id_for_side_relative_to_move(r0);
- if (spriteId != 0xFF)
- {
- gSprites[spriteId].invisible = TRUE;
- }
- gBattleAnimScriptPtr += 2;
-}
-
-static void ScriptCmd_visible(void)
-{
- u8 r0;
- u8 spriteId;
-
- r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1);
- spriteId = obj_id_for_side_relative_to_move(r0);
- if (spriteId != 0xFF)
- {
- gSprites[spriteId].invisible = FALSE;
- }
- gBattleAnimScriptPtr += 2;
-}
-
-static void ScriptCmd_doublebattle_2D(void)
-{
- u8 r7;
- u8 r4;
- u8 spriteId;
-
- r7 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1);
- gBattleAnimScriptPtr += 2;
- if (!IsContest() && IsDoubleBattle()
- && GetBankSide(gBattleAnimPlayerMonIndex) == GetBankSide(gBattleAnimEnemyMonIndex))
- {
- if (r7 == 0)
- {
- r4 = GetBankIdentity_permutated(gBattleAnimPlayerMonIndex);
- spriteId = obj_id_for_side_relative_to_move(0);
- }
- else
- {
- r4 = GetBankIdentity_permutated(gBattleAnimEnemyMonIndex);
- spriteId = obj_id_for_side_relative_to_move(1);
- }
- if (spriteId != 0xFF)
- {
- gSprites[spriteId].invisible = FALSE;
- if (r4 == 2)
- gSprites[spriteId].oam.priority = 3;
- if (r4 == 1)
- sub_8076464(0);
- else
- sub_8076464(1);
- }
- }
-}
-
-static void ScriptCmd_doublebattle_2E(void)
-{
- u8 r7;
- u8 r4;
- u8 spriteId;
-
- r7 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1);
- gBattleAnimScriptPtr += 2;
- if (!IsContest() && IsDoubleBattle()
- && GetBankSide(gBattleAnimPlayerMonIndex) == GetBankSide(gBattleAnimEnemyMonIndex))
- {
- if (r7 == 0)
- {
- r4 = GetBankIdentity_permutated(gBattleAnimPlayerMonIndex);
- spriteId = obj_id_for_side_relative_to_move(0);
- }
- else
- {
- r4 = GetBankIdentity_permutated(gBattleAnimEnemyMonIndex);
- spriteId = obj_id_for_side_relative_to_move(1);
- }
- if (spriteId != 0xFF && r4 == 2)
- {
- gSprites[spriteId].oam.priority = 2;
- }
- }
-}
-
-static void ScriptCmd_stopsound(void)
-{
- m4aMPlayStop(&gMPlay_SE1);
- m4aMPlayStop(&gMPlay_SE2);
- gBattleAnimScriptPtr++;
-}
diff --git a/src/battle_controller_safari.c b/src/battle_controller_safari.c
deleted file mode 100644
index e84969b4f..000000000
--- a/src/battle_controller_safari.c
+++ /dev/null
@@ -1,173 +0,0 @@
-#include "global.h"
-#include "battle_anim_81258BC.h"
-#include "battle.h"
-#include "battle_message.h"
-#include "menu_cursor.h"
-#include "text.h"
-
-extern struct Window gUnknown_03004210;
-extern u8 gDisplayedStringBattle[];
-extern u8 gActionSelectionCursor[];
-
-extern const u8 gUnknown_08400CBB[];
-extern u8 gActiveBank;
-extern const u8 gUnknown_08400D15[];
-
-extern void *gBattleBankFunc[];
-extern u16 gUnknown_030042A0;
-extern u16 gUnknown_030042A4;
-
-#if ENGLISH
-#define SUB_812BB10_TILE_DATA_OFFSET 440
-#elif GERMAN
-#define SUB_812BB10_TILE_DATA_OFFSET 444
-#endif
-
-// this file's functions
-void SafariHandleGetAttributes(void);
-void SafariHandlecmd1(void);
-void SafariHandleSetAttributes(void);
-void SafariHandlecmd3(void);
-void SafariHandleLoadPokeSprite(void);
-void SafariHandleSendOutPoke(void);
-void SafariHandleReturnPokeToBall(void);
-void SafariHandleTrainerThrow(void);
-void SafariHandleTrainerSlide(void);
-void SafariHandleTrainerSlideBack(void);
-void SafariHandlecmd10(void);
-void SafariHandlecmd11(void);
-void SafariHandlecmd12(void);
-void SafariHandleBallThrow(void);
-void SafariHandlePuase(void);
-void SafariHandleMoveAnimation(void);
-void SafariHandlePrintString(void);
-void SafariHandlePrintStringPlayerOnly(void);
-void SafariHandlecmd18(void);
-void SafariHandlecmd19(void);
-void SafariHandlecmd20(void);
-void SafariHandleOpenBag(void);
-void SafariHandlecmd22(void);
-void SafariHandlecmd23(void);
-void SafariHandleHealthBarUpdate(void);
-void SafariHandleExpBarUpdate(void);
-void SafariHandleStatusIconUpdate(void);
-void SafariHandleStatusAnimation(void);
-void SafariHandleStatusXor(void);
-void SafariHandlecmd29(void);
-void SafariHandleDMATransfer(void);
-void SafariHandlecmd31(void);
-void SafariHandlecmd32(void);
-void SafariHandlecmd33(void);
-void SafariHandlecmd34(void);
-void SafariHandlecmd35(void);
-void SafariHandlecmd36(void);
-void SafariHandlecmd37(void);
-void SafariHandlecmd38(void);
-void SafariHandlecmd39(void);
-void SafariHandlecmd40(void);
-void SafariHandleHitAnimation(void);
-void SafariHandlecmd42(void);
-void SafariHandleEffectivenessSound(void);
-void SafariHandlecmd44(void);
-void SafariHandleFaintingCry(void);
-void SafariHandleIntroSlide(void);
-void SafariHandleTrainerBallThrow(void);
-void SafariHandlecmd48(void);
-void SafariHandlecmd49(void);
-void SafariHandlecmd50(void);
-void SafariHandleSpriteInvisibility(void);
-void SafariHandleBattleAnimation(void);
-void SafariHandleLinkStandbyMsg(void);
-void SafariHandleResetActionMoveSelection(void);
-void SafariHandlecmd55(void);
-void SafariHandlecmd56(void);
-
-// const data
-typedef void (*BattleBufferCmd) (void);
-const BattleBufferCmd gSafariBufferCommands[] =
-{
- SafariHandleGetAttributes,
- SafariHandlecmd1,
- SafariHandleSetAttributes,
- SafariHandlecmd3,
- SafariHandleLoadPokeSprite,
- SafariHandleSendOutPoke,
- SafariHandleReturnPokeToBall,
- SafariHandleTrainerThrow,
- SafariHandleTrainerSlide,
- SafariHandleTrainerSlideBack,
- SafariHandlecmd10,
- SafariHandlecmd11,
- SafariHandlecmd12,
- SafariHandleBallThrow,
- SafariHandlePuase,
- SafariHandleMoveAnimation,
- SafariHandlePrintString,
- SafariHandlePrintStringPlayerOnly,
- SafariHandlecmd18,
- SafariHandlecmd19,
- SafariHandlecmd20,
- SafariHandleOpenBag,
- SafariHandlecmd22,
- SafariHandlecmd23,
- SafariHandleHealthBarUpdate,
- SafariHandleExpBarUpdate,
- SafariHandleStatusIconUpdate,
- SafariHandleStatusAnimation,
- SafariHandleStatusXor,
- SafariHandlecmd29,
- SafariHandleDMATransfer,
- SafariHandlecmd31,
- SafariHandlecmd32,
- SafariHandlecmd33,
- SafariHandlecmd34,
- SafariHandlecmd35,
- SafariHandlecmd36,
- SafariHandlecmd37,
- SafariHandlecmd38,
- SafariHandlecmd39,
- SafariHandlecmd40,
- SafariHandleHitAnimation,
- SafariHandlecmd42,
- SafariHandleEffectivenessSound,
- SafariHandlecmd44,
- SafariHandleFaintingCry,
- SafariHandleIntroSlide,
- SafariHandleTrainerBallThrow,
- SafariHandlecmd48,
- SafariHandlecmd49,
- SafariHandlecmd50,
- SafariHandleSpriteInvisibility,
- SafariHandleBattleAnimation,
- SafariHandleLinkStandbyMsg,
- SafariHandleResetActionMoveSelection,
- SafariHandlecmd55,
- SafariHandlecmd56,
-};
-// code
-
-void SafariHandlecmd18(void) {
- int i;
-
- gUnknown_030042A4 = 0;
- gUnknown_030042A0 = 160;
- gUnknown_03004210.paletteNum = 0;
- FillWindowRect_DefaultPalette(&gUnknown_03004210, 10, 2, 15, 27, 18);
- FillWindowRect_DefaultPalette(&gUnknown_03004210, 10, 2, 35, 16, 36);
- gBattleBankFunc[gActiveBank] = bx_battle_menu_t6_2;
-
- InitWindow(&gUnknown_03004210, gUnknown_08400D15, 400, 18, 35);
- sub_8002F44(&gUnknown_03004210);
- sub_814A5C0(0, 0xFFFF, 12, 11679, 0);
-
- for (i = 0; i < 4; i++)
- {
- nullsub_8(i);
- }
-
- sub_802E3E4(gActionSelectionCursor[gActiveBank], 0);
- StrCpyDecodeToDisplayedStringBattle((u8 *) gUnknown_08400CBB);
-
- InitWindow(&gUnknown_03004210, gDisplayedStringBattle, SUB_812BB10_TILE_DATA_OFFSET, 2, 35);
- sub_8002F44(&gUnknown_03004210);
-}
diff --git a/src/battle_setup.c b/src/battle_setup.c
deleted file mode 100644
index 31c127416..000000000
--- a/src/battle_setup.c
+++ /dev/null
@@ -1,1416 +0,0 @@
-#include "global.h"
-#include "battle_setup.h"
-#include "battle.h"
-#include "battle_transition.h"
-#include "data2.h"
-#include "event_data.h"
-#include "field_control_avatar.h"
-#include "field_fadetransition.h"
-#include "field_map_obj_helpers.h"
-#include "field_message_box.h"
-#include "field_player_avatar.h"
-#include "field_weather.h"
-#include "fieldmap.h"
-#include "fldeff_80C5CD4.h"
-#include "main.h"
-#include "map_constants.h"
-#include "metatile_behavior.h"
-#include "opponent_constants.h"
-#include "palette.h"
-#include "rng.h"
-#include "rom4.h"
-#include "safari_zone.h"
-#include "script.h"
-#include "script_pokemon_80C4.h"
-#include "secret_base.h"
-#include "songs.h"
-#include "sound.h"
-#include "species.h"
-#include "starter_choose.h"
-#include "string_util.h"
-#include "strings.h"
-#include "task.h"
-#include "text.h"
-#include "trainer.h"
-
-extern u16 gScriptResult;
-
-extern void (*gFieldCallback)(void);
-
-EWRAM_DATA u16 gTrainerBattleMode = 0;
-EWRAM_DATA u16 gTrainerBattleOpponent = 0;
-EWRAM_DATA u16 gTrainerMapObjectLocalId = 0;
-EWRAM_DATA u8 *gTrainerIntroSpeech = NULL;
-EWRAM_DATA u8 *gTrainerDefeatSpeech = NULL;
-EWRAM_DATA u8 *gTrainerVictorySpeech = NULL;
-EWRAM_DATA u8 *gTrainerCannotBattleSpeech = NULL;
-EWRAM_DATA u8 *gTrainerBattleScriptReturnAddress = NULL;
-EWRAM_DATA u8 *gTrainerBattleEndScript = NULL;
-
-extern u16 gBattleTypeFlags;
-extern u16 gScriptLastTalked;
-extern u8 gBattleOutcome;
-
-extern struct MapObject gMapObjects[];
-
-extern u8 gUnknown_0819F818[];
-extern u8 gUnknown_0819F840[];
-extern u8 gUnknown_0819F878[];
-extern u8 gUnknown_0819F887[];
-extern u8 gUnknown_0819F8AE[];
-
-extern u8 gUnknown_0819F80B[];
-extern u8 gUnknown_081C6C02[];
-
-
-static const u8 gBattleTransitionTable_Wild[][2] =
-{
- {8, 9},
- {5, 10},
- {0, 10},
- {7, 6},
-};
-static const u8 gBattleTransitionTable_Trainer[][2] =
-{
- {4, 11},
- {2, 3},
- {0, 10},
- {1, 6},
-};
-static const struct TrainerBattleSpec gTrainerBattleSpecs_0[] =
-{
- {&gTrainerBattleMode, 0},
- {&gTrainerBattleOpponent, 1},
- {&gTrainerMapObjectLocalId, 1},
- {&gTrainerIntroSpeech, 2},
- {&gTrainerDefeatSpeech, 2},
- {&gTrainerVictorySpeech, 5},
- {&gTrainerCannotBattleSpeech, 5},
- {&gTrainerBattleEndScript, 5},
- {&gTrainerBattleScriptReturnAddress, 6},
-};
-static const struct TrainerBattleSpec gTrainerBattleSpecs_1[] =
-{
- {&gTrainerBattleMode, 0},
- {&gTrainerBattleOpponent, 1},
- {&gTrainerMapObjectLocalId, 1},
- {&gTrainerIntroSpeech, 2},
- {&gTrainerDefeatSpeech, 2},
- {&gTrainerVictorySpeech, 5},
- {&gTrainerCannotBattleSpeech, 5},
- {&gTrainerBattleEndScript, 2},
- {&gTrainerBattleScriptReturnAddress, 6},
-};
-static const struct TrainerBattleSpec gTrainerBattleSpecs_2[] =
-{
- {&gTrainerBattleMode, 0},
- {&gTrainerBattleOpponent, 1},
- {&gTrainerMapObjectLocalId, 1},
- {&gTrainerIntroSpeech, 2},
- {&gTrainerDefeatSpeech, 2},
- {&gTrainerVictorySpeech, 5},
- {&gTrainerCannotBattleSpeech, 2},
- {&gTrainerBattleEndScript, 5},
- {&gTrainerBattleScriptReturnAddress, 6},
-};
-static const struct TrainerBattleSpec gTrainerBattleSpecs_3[] =
-{
- {&gTrainerBattleMode, 0},
- {&gTrainerBattleOpponent, 1},
- {&gTrainerMapObjectLocalId, 1},
- {&gTrainerIntroSpeech, 5},
- {&gTrainerDefeatSpeech, 2},
- {&gTrainerVictorySpeech, 5},
- {&gTrainerCannotBattleSpeech, 5},
- {&gTrainerBattleEndScript, 5},
- {&gTrainerBattleScriptReturnAddress, 6},
-};
-static const struct TrainerBattleSpec gTrainerBattleSpecs_4[] =
-{
- {&gTrainerBattleMode, 0},
- {&gTrainerBattleOpponent, 1},
- {&gTrainerMapObjectLocalId, 1},
- {&gTrainerIntroSpeech, 2},
- {&gTrainerDefeatSpeech, 2},
- {&gTrainerVictorySpeech, 5},
- {&gTrainerCannotBattleSpeech, 2},
- {&gTrainerBattleEndScript, 2},
- {&gTrainerBattleScriptReturnAddress, 6},
-};
-
-const struct TrainerEyeTrainer gTrainerEyeTrainers[] =
-{
- {
- {OPPONENT_ROSE_1, OPPONENT_ROSE_2, OPPONENT_ROSE_3, OPPONENT_ROSE_4, OPPONENT_ROSE_5},
- MAP_GROUP_ROUTE118,
- MAP_ID_ROUTE118,
- },
- {
- {OPPONENT_DUSTY_1, OPPONENT_DUSTY_2, OPPONENT_DUSTY_3, OPPONENT_DUSTY_4, OPPONENT_DUSTY_5},
- MAP_GROUP_ROUTE111,
- MAP_ID_ROUTE111,
- },
- {
- {OPPONENT_LOLA_1, OPPONENT_LOLA_2, OPPONENT_LOLA_3, OPPONENT_LOLA_4, OPPONENT_LOLA_5},
- MAP_GROUP_ROUTE109,
- MAP_ID_ROUTE109,
- },
- {
- {OPPONENT_RICKY_1, OPPONENT_RICKY_2, OPPONENT_RICKY_3, OPPONENT_RICKY_4, OPPONENT_RICKY_5},
- MAP_GROUP_ROUTE109,
- MAP_ID_ROUTE109,
- },
- {
- {OPPONENT_RITA_AND_SAM_1, OPPONENT_RITA_AND_SAM_2, OPPONENT_RITA_AND_SAM_3, OPPONENT_RITA_AND_SAM_4, OPPONENT_RITA_AND_SAM_5},
- MAP_GROUP_ROUTE124,
- MAP_ID_ROUTE124,
- },
- {
- {OPPONENT_BROOKE_1, OPPONENT_BROOKE_2, OPPONENT_BROOKE_3, OPPONENT_BROOKE_4, OPPONENT_BROOKE_5},
- MAP_GROUP_ROUTE111,
- MAP_ID_ROUTE111,
- },
- {
- {OPPONENT_WILTON_1, OPPONENT_WILTON_2, OPPONENT_WILTON_3, OPPONENT_WILTON_4, OPPONENT_WILTON_5},
- MAP_GROUP_ROUTE111,
- MAP_ID_ROUTE111,
- },
- {
- {OPPONENT_VALERIE_1, OPPONENT_VALERIE_2, OPPONENT_VALERIE_3, OPPONENT_VALERIE_4, OPPONENT_VALERIE_5},
- MAP_GROUP_MT_PYRE_6F,
- MAP_ID_MT_PYRE_6F,
- },
- {
- {OPPONENT_CINDY_1, OPPONENT_CINDY_3, OPPONENT_CINDY_4, OPPONENT_CINDY_5, OPPONENT_CINDY_6},
- MAP_GROUP_ROUTE104,
- MAP_ID_ROUTE104,
- },
- {
- {OPPONENT_JESSICA_1, OPPONENT_JESSICA_2, OPPONENT_JESSICA_3, OPPONENT_JESSICA_4, OPPONENT_JESSICA_5},
- MAP_GROUP_ROUTE121,
- MAP_ID_ROUTE121,
- },
- {
- {OPPONENT_WINSTON_1, OPPONENT_WINSTON_2, OPPONENT_WINSTON_3, OPPONENT_WINSTON_4, OPPONENT_WINSTON_5},
- MAP_GROUP_ROUTE104,
- MAP_ID_ROUTE104,
- },
- {
- {OPPONENT_STEVE_1, OPPONENT_STEVE_2, OPPONENT_STEVE_3, OPPONENT_STEVE_4, OPPONENT_STEVE_5},
- MAP_GROUP_ROUTE114,
- MAP_ID_ROUTE114,
- },
- {
- {OPPONENT_TONY_1, OPPONENT_TONY_2, OPPONENT_TONY_3, OPPONENT_TONY_4, OPPONENT_TONY_5},
- MAP_GROUP_ROUTE107,
- MAP_ID_ROUTE107,
- },
- {
- {OPPONENT_NOB_1, OPPONENT_NOB_2, OPPONENT_NOB_3, OPPONENT_NOB_4, OPPONENT_NOB_5},
- MAP_GROUP_ROUTE115,
- MAP_ID_ROUTE115,
- },
- {
- {OPPONENT_DALTON_1, OPPONENT_DALTON_2, OPPONENT_DALTON_3, OPPONENT_DALTON_4, OPPONENT_DALTON_5},
- MAP_GROUP_ROUTE118,
- MAP_ID_ROUTE118,
- },
- {
- {OPPONENT_BERNIE_1, OPPONENT_BERNIE_2, OPPONENT_BERNIE_3, OPPONENT_BERNIE_4, OPPONENT_BERNIE_5},
- MAP_GROUP_ROUTE114,
- MAP_ID_ROUTE114,
- },
- {
- {OPPONENT_ETHAN_1, OPPONENT_ETHAN_2, OPPONENT_ETHAN_3, OPPONENT_ETHAN_4, OPPONENT_ETHAN_5},
- MAP_GROUP_JAGGED_PASS,
- MAP_ID_JAGGED_PASS,
- },
- {
- {OPPONENT_JOHN_AND_JAY_1, OPPONENT_JOHN_AND_JAY_2, OPPONENT_JOHN_AND_JAY_3, OPPONENT_JOHN_AND_JAY_4, OPPONENT_JOHN_AND_JAY_5},
- MAP_GROUP_METEOR_FALLS_1F_2R,
- MAP_ID_METEOR_FALLS_1F_2R,
- },
- {
- {OPPONENT_BRANDON_1, OPPONENT_BRANDON_2, OPPONENT_BRANDON_3, OPPONENT_BRANDON_4, OPPONENT_BRANDON_5},
- MAP_GROUP_ROUTE120,
- MAP_ID_ROUTE120,
- },
- {
- {OPPONENT_CAMERON_1, OPPONENT_CAMERON_2, OPPONENT_CAMERON_3, OPPONENT_CAMERON_4, OPPONENT_CAMERON_5},
- MAP_GROUP_ROUTE123,
- MAP_ID_ROUTE123,
- },
- {
- {OPPONENT_JACKI_1, OPPONENT_JACKI_2, OPPONENT_JACKI_3, OPPONENT_JACKI_4, OPPONENT_JACKI_5},
- MAP_GROUP_ROUTE123,
- MAP_ID_ROUTE123,
- },
- {
- {OPPONENT_WALTER_1, OPPONENT_WALTER_2, OPPONENT_WALTER_3, OPPONENT_WALTER_4, OPPONENT_WALTER_5},
- MAP_GROUP_ROUTE121,
- MAP_ID_ROUTE121,
- },
- {
- {OPPONENT_KAREN_1, OPPONENT_KAREN_2, OPPONENT_KAREN_3, OPPONENT_KAREN_4, OPPONENT_KAREN_5},
- MAP_GROUP_ROUTE116,
- MAP_ID_ROUTE116,
- },
- {
- {OPPONENT_JERRY_1, OPPONENT_JERRY_2, OPPONENT_JERRY_3, OPPONENT_JERRY_4, OPPONENT_JERRY_5},
- MAP_GROUP_ROUTE116,
- MAP_ID_ROUTE116,
- },
- {
- {OPPONENT_ANNA_AND_MEG_1, OPPONENT_ANNA_AND_MEG_2, OPPONENT_ANNA_AND_MEG_3, OPPONENT_ANNA_AND_MEG_4, OPPONENT_ANNA_AND_MEG_5},
- MAP_GROUP_ROUTE117,
- MAP_ID_ROUTE117,
- },
- {
- {OPPONENT_ISABEL_1, OPPONENT_ISABEL_2, OPPONENT_ISABEL_3, OPPONENT_ISABEL_4, OPPONENT_ISABEL_5},
- MAP_GROUP_ROUTE110,
- MAP_ID_ROUTE110,
- },
- {
- {OPPONENT_MIGUEL_1, OPPONENT_MIGUEL_2, OPPONENT_MIGUEL_3, OPPONENT_MIGUEL_4, OPPONENT_MIGUEL_5},
- MAP_GROUP_ROUTE103,
- MAP_ID_ROUTE103,
- },
- {
- {OPPONENT_TIMOTHY_1, OPPONENT_TIMOTHY_2, OPPONENT_TIMOTHY_3, OPPONENT_TIMOTHY_4, OPPONENT_TIMOTHY_5},
- MAP_GROUP_ROUTE115,
- MAP_ID_ROUTE115,
- },
- {
- {OPPONENT_SHELBY_1, OPPONENT_SHELBY_2, OPPONENT_SHELBY_3, OPPONENT_SHELBY_4, OPPONENT_SHELBY_5},
- MAP_GROUP_MT_CHIMNEY,
- MAP_ID_MT_CHIMNEY,
- },
- {
- {OPPONENT_CALVIN_1, OPPONENT_CALVIN_2, OPPONENT_CALVIN_3, OPPONENT_CALVIN_4, OPPONENT_CALVIN_5},
- MAP_GROUP_ROUTE102,
- MAP_ID_ROUTE102,
- },
- {
- {OPPONENT_ELLIOT_1, OPPONENT_ELLIOT_2, OPPONENT_ELLIOT_3, OPPONENT_ELLIOT_4, OPPONENT_ELLIOT_5},
- MAP_GROUP_ROUTE106,
- MAP_ID_ROUTE106,
- },
- {
- {OPPONENT_ABIGAIL_1, OPPONENT_ABIGAIL_2, OPPONENT_ABIGAIL_3, OPPONENT_ABIGAIL_4, OPPONENT_ABIGAIL_5},
- MAP_GROUP_ROUTE110,
- MAP_ID_ROUTE110,
- },
- {
- {OPPONENT_BENJAMIN_1, OPPONENT_BENJAMIN_2, OPPONENT_BENJAMIN_3, OPPONENT_BENJAMIN_4, OPPONENT_BENJAMIN_5},
- MAP_GROUP_ROUTE110,
- MAP_ID_ROUTE110,
- },
- {
- {OPPONENT_ISAIAH_1, OPPONENT_ISAIAH_2, OPPONENT_ISAIAH_3, OPPONENT_ISAIAH_4, OPPONENT_ISAIAH_5},
- MAP_GROUP_ROUTE128,
- MAP_ID_ROUTE128,
- },
- {
- {OPPONENT_KATELYN_1, OPPONENT_KATELYN_2, OPPONENT_KATELYN_3, OPPONENT_KATELYN_4, OPPONENT_KATELYN_5},
- MAP_GROUP_ROUTE128,
- MAP_ID_ROUTE128,
- },
- {
- {OPPONENT_MARIA_1, OPPONENT_MARIA_2, OPPONENT_MARIA_3, OPPONENT_MARIA_4, OPPONENT_MARIA_5},
- MAP_GROUP_ROUTE117,
- MAP_ID_ROUTE117,
- },
- {
- {OPPONENT_DYLAN_1, OPPONENT_DYLAN_2, OPPONENT_DYLAN_3, OPPONENT_DYLAN_4, OPPONENT_DYLAN_5},
- MAP_GROUP_ROUTE117,
- MAP_ID_ROUTE117,
- },
- {
- {OPPONENT_NICOLAS_1, OPPONENT_NICOLAS_2, OPPONENT_NICOLAS_3, OPPONENT_NICOLAS_4, OPPONENT_NICOLAS_5},
- MAP_GROUP_METEOR_FALLS_1F_2R,
- MAP_ID_METEOR_FALLS_1F_2R,
- },
- {
- {OPPONENT_ROBERT_1, OPPONENT_ROBERT_2, OPPONENT_ROBERT_3, OPPONENT_ROBERT_4, OPPONENT_ROBERT_5},
- MAP_GROUP_ROUTE120,
- MAP_ID_ROUTE120,
- },
- {
- {OPPONENT_LAO_1, OPPONENT_LAO_2, OPPONENT_LAO_3, OPPONENT_LAO_4, OPPONENT_LAO_5},
- MAP_GROUP_ROUTE113,
- MAP_ID_ROUTE113,
- },
- {
- {OPPONENT_CYNDY_1, OPPONENT_CYNDY_2, OPPONENT_CYNDY_3, OPPONENT_CYNDY_4, OPPONENT_CYNDY_5},
- MAP_GROUP_ROUTE115,
- MAP_ID_ROUTE115,
- },
- {
- {OPPONENT_MADELINE_1, OPPONENT_MADELINE_2, OPPONENT_MADELINE_3, OPPONENT_MADELINE_4, OPPONENT_MADELINE_5},
- MAP_GROUP_ROUTE113,
- MAP_ID_ROUTE113,
- },
- {
- {OPPONENT_JENNY_1, OPPONENT_JENNY_2, OPPONENT_JENNY_3, OPPONENT_JENNY_4, OPPONENT_JENNY_5},
- MAP_GROUP_ROUTE124,
- MAP_ID_ROUTE124,
- },
- {
- {OPPONENT_DIANA_1, OPPONENT_DIANA_2, OPPONENT_DIANA_3, OPPONENT_DIANA_4, OPPONENT_DIANA_5},
- MAP_GROUP_JAGGED_PASS,
- MAP_ID_JAGGED_PASS,
- },
- {
- {OPPONENT_AMY_AND_LIV_1, OPPONENT_AMY_AND_LIV_2, OPPONENT_AMY_AND_LIV_4, OPPONENT_AMY_AND_LIV_5, OPPONENT_AMY_AND_LIV_6},
- MAP_GROUP_ROUTE103,
- MAP_ID_ROUTE103,
- },
- {
- {OPPONENT_ERNEST_1, OPPONENT_ERNEST_2, OPPONENT_ERNEST_3, OPPONENT_ERNEST_4, OPPONENT_ERNEST_5},
- MAP_GROUP_ROUTE125,
- MAP_ID_ROUTE125,
- },
- {
- {OPPONENT_EDWIN_1, OPPONENT_EDWIN_2, OPPONENT_EDWIN_3, OPPONENT_EDWIN_4, OPPONENT_EDWIN_5},
- MAP_GROUP_ROUTE110,
- MAP_ID_ROUTE110,
- },
- {
- {OPPONENT_LYDIA_1, OPPONENT_LYDIA_2, OPPONENT_LYDIA_3, OPPONENT_LYDIA_4, OPPONENT_LYDIA_5},
- MAP_GROUP_ROUTE117,
- MAP_ID_ROUTE117,
- },
- {
- {OPPONENT_ISAAC_1, OPPONENT_ISAAC_2, OPPONENT_ISAAC_3, OPPONENT_ISAAC_4, OPPONENT_ISAAC_5},
- MAP_GROUP_ROUTE117,
- MAP_ID_ROUTE117,
- },
- {
- {OPPONENT_CATHERINE_1, OPPONENT_CATHERINE_2, OPPONENT_CATHERINE_3, OPPONENT_CATHERINE_4, OPPONENT_CATHERINE_5},
- MAP_GROUP_ROUTE119,
- MAP_ID_ROUTE119,
- },
- {
- {OPPONENT_JACKSON_1, OPPONENT_JACKSON_2, OPPONENT_JACKSON_3, OPPONENT_JACKSON_4, OPPONENT_JACKSON_5},
- MAP_GROUP_ROUTE119,
- MAP_ID_ROUTE119,
- },
- {
- {OPPONENT_HALEY_1, OPPONENT_HALEY_2, OPPONENT_HALEY_3, OPPONENT_HALEY_4, OPPONENT_HALEY_5},
- MAP_GROUP_ROUTE104,
- MAP_ID_ROUTE104,
- },
- {
- {OPPONENT_JAMES_1, OPPONENT_JAMES_2, OPPONENT_JAMES_3, OPPONENT_JAMES_4, OPPONENT_JAMES_5},
- MAP_GROUP_PETALBURG_WOODS,
- MAP_ID_PETALBURG_WOODS,
- },
- {
- {OPPONENT_TRENT_1, OPPONENT_TRENT_2, OPPONENT_TRENT_3, OPPONENT_TRENT_4, OPPONENT_TRENT_5},
- MAP_GROUP_ROUTE112,
- MAP_ID_ROUTE112,
- },
- {
- {OPPONENT_LOIS_AND_HAL_1, OPPONENT_LOIS_AND_HAL_2, OPPONENT_LOIS_AND_HAL_3, OPPONENT_LOIS_AND_HAL_4, OPPONENT_LOIS_AND_HAL_5},
- MAP_GROUP_ABANDONED_SHIP_ROOMS2_1F,
- MAP_ID_ABANDONED_SHIP_ROOMS2_1F,
- },
- {
- {OPPONENT_WALLY_3, OPPONENT_WALLY_4, OPPONENT_WALLY_5, OPPONENT_WALLY_6, OPPONENT_NONE},
- MAP_GROUP_VICTORY_ROAD_1F,
- MAP_ID_VICTORY_ROAD_1F,
- },
-};
-
-static const u16 sBadgeFlags[] = {BADGE01_GET, BADGE02_GET, BADGE03_GET, BADGE04_GET, BADGE05_GET, BADGE06_GET, BADGE07_GET, BADGE08_GET};
-
-void task01_battle_start(u8 taskId)
-{
- s16 *data = gTasks[taskId].data;
-
- switch (data[0])
- {
- case 0:
- if (!FieldPoisonEffectIsRunning()) // is poison not active?
- {
- sub_811AABC(data[1]);
- data[0]++; // go to case 1.
- }
- break;
- case 1:
- if (IsBattleTransitionDone() == TRUE)
- {
- SetMainCallback2(sub_800E7C4);
- prev_quest_postbuffer_cursor_backup_reset();
- overworld_poison_timer_set();
- DestroyTask(taskId);
- }
- break;
- }
-}
-
-void task_add_01_battle_start(u8 transition, u16 song)
-{
- u8 taskId = CreateTask(task01_battle_start, 1);
-
- gTasks[taskId].data[1] = transition;
- current_map_music_set__default_for_battle(song);
-}
-
-void CheckForSafariZoneAndProceed(void)
-{
- if (GetSafariZoneFlag())
- StartBattle_Safari();
- else
- StartBattle_StandardWild();
-}
-
-void StartBattle_StandardWild(void)
-{
- ScriptContext2_Enable();
- FreezeMapObjects();
- sub_80597F4();
- gMain.savedCallback = HandleWildBattleEnd;
- gBattleTypeFlags = 0;
- task_add_01_battle_start(GetWildBattleTransition(), 0);
- IncrementGameStat(7);
- IncrementGameStat(8);
-}
-
-void StartBattle_Roamer(void)
-{
- ScriptContext2_Enable();
- FreezeMapObjects();
- sub_80597F4();
- gMain.savedCallback = HandleWildBattleEnd;
- gBattleTypeFlags = BATTLE_TYPE_ROAMER;
- task_add_01_battle_start(GetWildBattleTransition(), 0);
- IncrementGameStat(7);
- IncrementGameStat(8);
-}
-
-void StartBattle_Safari(void)
-{
- ScriptContext2_Enable();
- FreezeMapObjects();
- sub_80597F4();
- gMain.savedCallback = sub_80C824C;
- gBattleTypeFlags = BATTLE_TYPE_SAFARI;
- task_add_01_battle_start(GetWildBattleTransition(), 0);
-}
-
-void task_add_01_battle_start_with_music_and_stats(void)
-{
- task_add_01_battle_start(GetTrainerBattleTransition(), 0);
- IncrementGameStat(7);
- IncrementGameStat(9);
-}
-
-//Initiates battle where Wally catches Ralts
-void StartBattle_WallyTutorial(void)
-{
- CreateMaleMon(&gEnemyParty[0], SPECIES_RALTS, 5);
- ScriptContext2_Enable();
- gMain.savedCallback = c2_exit_to_overworld_1_continue_scripts_restart_music;
- gBattleTypeFlags = BATTLE_TYPE_WALLY_TUTORIAL;
- task_add_01_battle_start(8, 0);
-}
-
-void StartBattle_ScriptedWild(void)
-{
- ScriptContext2_Enable();
- gMain.savedCallback = HandleScriptedWildBattleEnd;
- gBattleTypeFlags = 0;
- task_add_01_battle_start(GetWildBattleTransition(), 0);
- IncrementGameStat(7);
- IncrementGameStat(8);
-}
-
-void StartBattle_SouthernIsland(void)
-{
- ScriptContext2_Enable();
- gMain.savedCallback = HandleScriptedWildBattleEnd;
- gBattleTypeFlags = BATTLE_TYPE_LEGENDARY;
- task_add_01_battle_start(GetWildBattleTransition(), 0);
- IncrementGameStat(7);
- IncrementGameStat(8);
-}
-
-void StartBattle_Rayquaza(void)
-{
- ScriptContext2_Enable();
- gMain.savedCallback = HandleScriptedWildBattleEnd;
- gBattleTypeFlags = BATTLE_TYPE_LEGENDARY;
- task_add_01_battle_start(0, BGM_BATTLE34);
- IncrementGameStat(7);
- IncrementGameStat(8);
-}
-
-void StartBattle_GroudonKyogre(void)
-{
- ScriptContext2_Enable();
- gMain.savedCallback = HandleScriptedWildBattleEnd;
- gBattleTypeFlags = BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_KYOGRE_GROUDON;
- if (gGameVersion == 2)
- task_add_01_battle_start(0xB, BGM_BATTLE34); // KYOGRE
- else
- task_add_01_battle_start(0x6, BGM_BATTLE34); // GROUDON
- IncrementGameStat(7);
- IncrementGameStat(8);
-}
-
-void StartBattle_Regi(void)
-{
- ScriptContext2_Enable();
- gMain.savedCallback = HandleScriptedWildBattleEnd;
- gBattleTypeFlags = BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_REGI;
- task_add_01_battle_start(0xA, BGM_BATTLE36);
- IncrementGameStat(7);
- IncrementGameStat(8);
-}
-
-void HandleWildBattleEnd(void)
-{
- CpuFill16(0, (void *)BG_PLTT, BG_PLTT_SIZE);
- ResetOamRange(0, 128);
-
- if (battle_exit_is_player_defeat(gBattleOutcome) == TRUE)
- {
- SetMainCallback2(CB2_WhiteOut);
- }
- else
- {
- SetMainCallback2(c2_exit_to_overworld_2_switch);
- gFieldCallback = sub_8080E44;
- }
-}
-
-void HandleScriptedWildBattleEnd(void)
-{
- CpuFill16(0, (void *)BG_PLTT, BG_PLTT_SIZE);
- ResetOamRange(0, 128);
-
- if (battle_exit_is_player_defeat(gBattleOutcome) == TRUE)
- SetMainCallback2(CB2_WhiteOut);
- else
- SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music);
-}
-
-s8 GetBattleTerrain(void)
-{
- u16 tileBehavior;
- s16 x, y;
-
- PlayerGetDestCoords(&x, &y);
- tileBehavior = MapGridGetMetatileBehaviorAt(x, y);
-
- if (MetatileBehavior_IsTallGrass(tileBehavior))
- return 0;
- if (MetatileBehavior_IsLongGrass(tileBehavior))
- return 1;
- if (MetatileBehavior_IsSandOrDeepSand(tileBehavior))
- return 2;
- switch (gMapHeader.mapType)
- {
- case MAP_TYPE_TOWN:
- case MAP_TYPE_CITY:
- case MAP_TYPE_ROUTE:
- break;
- case MAP_TYPE_UNDERGROUND:
- if (sub_80574C4(tileBehavior))
- return 8;
- if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior))
- return 5;
- return 7;
- case MAP_TYPE_INDOOR:
- case MAP_TYPE_SECRET_BASE:
- return 8;
- case MAP_TYPE_UNDERWATER:
- return 3;
- case MAP_TYPE_6:
- if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior))
- return 4;
- return 9;
- }
- if (sub_8057568(tileBehavior))
- return 4;
- if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior))
- return 5;
- if (sub_80574D8(tileBehavior))
- return 6;
- if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))
- {
- if (sub_8057450(tileBehavior))
- return 5;
- if (MetatileBehavior_IsBridge(tileBehavior) == TRUE)
- return 4;
- }
- if (gSaveBlock1.location.mapGroup == 0 && gSaveBlock1.location.mapNum == 28)
- return 2;
- if (GetSav1Weather() == 8)
- return 2;
- return 9;
-}
-
-s8 GetBattleTransitionTypeByMap(void)
-{
- u8 flashUsed;
- u16 tileBehavior;
- s16 x, y;
-
- PlayerGetDestCoords(&x, &y);
- tileBehavior = MapGridGetMetatileBehaviorAt(x, y);
-
- flashUsed = sav1_get_flash_used_on_map();
-
- if (flashUsed)
- return 2;
-
- if (!MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior))
- {
- switch (gMapHeader.mapType)
- {
- case MAP_TYPE_UNDERGROUND:
- return 1;
- case MAP_TYPE_UNDERWATER:
- return 3;
- default:
- return 0;
- }
- }
- return 3;
-}
-
-u16 GetSumOfPartyMonLevel(u8 numMons)
-{
- u8 sum = 0;
- int i;
-
- for (i = 0; i < 6; i++)
- {
- u32 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
-
- if (species != SPECIES_EGG && species != SPECIES_NONE && GetMonData(&gPlayerParty[i], MON_DATA_HP) != 0)
- {
- sum += GetMonData(&gPlayerParty[i], MON_DATA_LEVEL);
- numMons--;
- if (numMons == 0)
- break;
- }
- }
- return sum;
-}
-
-u8 GetSumOfEnemyPartyLevel(u16 trainerNum, u8 numMons)
-{
- u8 i;
- u8 sum;
- u32 count = numMons;
- void *party;
-
- if (gTrainers[trainerNum].partySize < count)
- count = gTrainers[trainerNum].partySize;
-
- sum = 0;
-
- switch (gTrainers[trainerNum].partyFlags)
- {
- case 0:
- party = gTrainers[trainerNum].party;
- for (i = 0; i < count; i++)
- sum += ((struct TrainerPartyMember0 *)party)[i].level;
- break;
- case 1:
- party = gTrainers[trainerNum].party;
- for (i = 0; i < count; i++)
- sum += ((struct TrainerPartyMember1 *)party)[i].level;
- break;
- case 2:
- party = gTrainers[trainerNum].party;
- for (i = 0; i < count; i++)
- sum += ((struct TrainerPartyMember2 *)party)[i].level;
- break;
- case 3:
- party = gTrainers[trainerNum].party;
- for (i = 0; i < count; i++)
- sum += ((struct TrainerPartyMember3 *)party)[i].level;
- break;
- }
-
- return sum;
-}
-
-u8 GetWildBattleTransition(void)
-{
- u8 flashVar = GetBattleTransitionTypeByMap();
- u8 level = GetMonData(&gEnemyParty[0], MON_DATA_LEVEL);
-
- if (level < (u8)GetSumOfPartyMonLevel(1)) // is wild mon level than the player's mon level?
- return gBattleTransitionTable_Wild[flashVar][0];
- else
- return gBattleTransitionTable_Wild[flashVar][1]; // use a white fade in instead of normal transition.
-}
-
-u8 GetTrainerBattleTransition(void)
-{
- const struct Trainer *trainer;
- u8 minPartyCount;
- u8 flashVar;
- u8 level;
-
- if (gTrainerBattleOpponent == 1024) // link battle?
- return 16;
-
- trainer = gTrainers;
-
- if (trainer[gTrainerBattleOpponent].trainerClass == 24) // league?
- {
- if (gTrainerBattleOpponent == 261)
- return 12;
- if (gTrainerBattleOpponent == 262)
- return 13;
- if (gTrainerBattleOpponent == 263)
- return 14;
- if (gTrainerBattleOpponent == 264)
- return 15;
- return 16;
- }
-
- if (trainer[gTrainerBattleOpponent].trainerClass == 32) // team leader?
- return 16;
-
- if (trainer[gTrainerBattleOpponent].doubleBattle == TRUE)
- minPartyCount = 2; // double battles always at least have 2 pokemon.
- else
- minPartyCount = 1;
-
- flashVar = GetBattleTransitionTypeByMap();
- level = GetSumOfEnemyPartyLevel(gTrainerBattleOpponent, minPartyCount);
-
- if (level < (u8)GetSumOfPartyMonLevel(minPartyCount)) // is wild mon level than the player's mon level?
- return gBattleTransitionTable_Trainer[flashVar][0];
- else
- return gBattleTransitionTable_Trainer[flashVar][1];
-}
-
-u8 GetBattleTowerBattleTransition(void)
-{
- u8 monData = GetMonData(&gEnemyParty[0], MON_DATA_LEVEL);
-
- if (monData < (u8)GetSumOfPartyMonLevel(1))
- return 4;
- else
- return 3;
-}
-
-void ChooseStarter(void)
-{
- SetMainCallback2(CB2_ChooseStarter);
- gMain.savedCallback = CB2_GiveStarter;
-}
-
-void CB2_GiveStarter(void)
-{
- u16 starterPoke;
-
- *GetVarPointer(0x4023) = gScriptResult;
- starterPoke = GetStarterPokemon(gScriptResult);
- ScriptGiveMon(starterPoke, 5, 0, 0, 0, 0);
- ResetTasks();
- sub_80408BC();
- SetMainCallback2(CB2_StartFirstBattle);
- sub_811AAD8(0);
-}
-
-void CB2_StartFirstBattle(void)
-{
- UpdatePaletteFade();
- RunTasks();
-
- if (IsBattleTransitionDone() == TRUE)
- {
- gBattleTypeFlags = BATTLE_TYPE_FIRST_BATTLE;
- gMain.savedCallback = HandleFirstBattleEnd;
- SetMainCallback2(sub_800E7C4);
- prev_quest_postbuffer_cursor_backup_reset();
- overworld_poison_timer_set();
- IncrementGameStat(7);
- IncrementGameStat(8);
- }
-}
-
-void HandleFirstBattleEnd(void)
-{
- sav1_reset_battle_music_maybe();
- SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music);
-}
-
-u32 TrainerBattleLoadArg32(const u8 *ptr)
-{
- return ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24);
-}
-
-u16 TrainerBattleLoadArg16(const u8 *ptr)
-{
- return ptr[0] | (ptr[1] << 8);
-}
-
-u8 TrainerBattleLoadArg8(const u8 *ptr)
-{
- return ptr[0];
-}
-
-u16 trainerflag_opponent(void)
-{
- return TRAINER_FLAG_START + gTrainerBattleOpponent;
-}
-
-bool32 battle_exit_is_player_defeat(u32 a1)
-{
- switch (a1)
- {
- case 2:
- case 3:
- return TRUE;
- case 1:
- case 4:
- case 5:
- case 6:
- case 7:
- return FALSE;
- }
- return FALSE;
-}
-
-void sub_80822BC(void)
-{
- gTrainerBattleMode = 0;
- gTrainerBattleOpponent = 0;
- gTrainerMapObjectLocalId = 0;
- gTrainerIntroSpeech = 0;
- gTrainerDefeatSpeech = 0;
- gTrainerVictorySpeech = 0;
- gTrainerCannotBattleSpeech = 0;
- gTrainerBattleScriptReturnAddress = 0;
- gTrainerBattleEndScript = 0;
-}
-
-void TrainerBattleLoadArgs(const struct TrainerBattleSpec *specs, const u8 *data)
-{
- while (1)
- {
- switch (specs->ptrType)
- {
- case 0:
- *(u8 *)specs->ptr = TrainerBattleLoadArg8(data);
- data++;
- break;
- case 1:
- *(u16 *)specs->ptr = TrainerBattleLoadArg16(data);
- data += 2;
- break;
- case 2:
- *(u32 *)specs->ptr = TrainerBattleLoadArg32(data);
- data += 4;
- break;
- case 3:
- *(u8 *)specs->ptr = 0;
- break;
- case 4:
- *(u16 *)specs->ptr = 0;
- break;
- case 5:
- *(u32 *)specs->ptr = 0;
- break;
- case 6:
- *(const u8 **)specs->ptr = data;
- return;
- }
- specs++;
- }
-}
-
-void battle_80801F0(void)
-{
- if (gTrainerMapObjectLocalId)
- {
- gScriptLastTalked = gTrainerMapObjectLocalId;
- gSelectedMapObject = GetFieldObjectIdByLocalIdAndMap(gTrainerMapObjectLocalId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup);
- }
-}
-
-u8 *TrainerBattleConfigure(const u8 *data)
-{
- sub_80822BC();
- gTrainerBattleMode = TrainerBattleLoadArg8(data);
-
- switch (gTrainerBattleMode)
- {
- case 3:
- TrainerBattleLoadArgs(gTrainerBattleSpecs_3, data);
- return gUnknown_0819F878;
- case 4:
- TrainerBattleLoadArgs(gTrainerBattleSpecs_2, data);
- battle_80801F0();
- return gUnknown_0819F840;
- case 1:
- case 2:
- TrainerBattleLoadArgs(gTrainerBattleSpecs_1, data);
- battle_80801F0();
- return gUnknown_0819F818;
- case 6:
- case 8:
- TrainerBattleLoadArgs(gTrainerBattleSpecs_4, data);
- battle_80801F0();
- return gUnknown_0819F840;
- case 7:
- TrainerBattleLoadArgs(gTrainerBattleSpecs_2, data);
- battle_80801F0();
- gTrainerBattleOpponent = sub_8082C4C(gTrainerBattleOpponent);
- return gUnknown_0819F8AE;
- case 5:
- TrainerBattleLoadArgs(gTrainerBattleSpecs_0, data);
- battle_80801F0();
- gTrainerBattleOpponent = sub_8082C4C(gTrainerBattleOpponent);
- return gUnknown_0819F887;
- default:
- TrainerBattleLoadArgs(gTrainerBattleSpecs_0, data);
- battle_80801F0();
- return gUnknown_0819F818;
- }
-}
-
-void TrainerWantsBattle(u8 trainerMapObjId, u8 *trainerScript)
-{
- gSelectedMapObject = trainerMapObjId;
- gScriptLastTalked = gMapObjects[trainerMapObjId].localId;
- TrainerBattleConfigure(trainerScript + 1);
- ScriptContext1_SetupScript(gUnknown_0819F80B);
- ScriptContext2_Enable();
-}
-
-bool32 GetTrainerFlagFromScriptPointer(u8 *data)
-{
- u32 flag = TrainerBattleLoadArg16(data + 2);
- return FlagGet(TRAINER_FLAG_START + flag);
-}
-
-void sub_8082524(void)
-{
- struct MapObject *mapObject = &gMapObjects[gSelectedMapObject];
-
- npc_set_running_behaviour_etc(mapObject, npc_running_behaviour_by_direction(mapObject->mapobj_unk_18));
-}
-
-u8 sub_8082558(void)
-{
- return gTrainerBattleMode;
-}
-
-u8 sub_8082564(void)
-{
- return FlagGet(trainerflag_opponent());
-}
-
-void sub_808257C(void)
-{
- FlagSet(trainerflag_opponent());
-}
-
-void unref_sub_8082590(void)
-{
- FlagSet(trainerflag_opponent()); // duplicate function
-}
-
-u8 trainer_flag_check(u16 flag)
-{
- return FlagGet(TRAINER_FLAG_START + flag);
-}
-
-void trainer_flag_set(u16 flag)
-{
- FlagSet(TRAINER_FLAG_START + flag);
-}
-
-void trainer_flag_clear(u16 flag)
-{
- FlagReset(TRAINER_FLAG_START + flag);
-}
-
-void sub_80825E4(void)
-{
- gBattleTypeFlags = BATTLE_TYPE_TRAINER;
- gMain.savedCallback = sub_808260C;
- task_add_01_battle_start_with_music_and_stats();
- ScriptContext1_Stop();
-}
-
-void sub_808260C(void)
-{
- if (gTrainerBattleOpponent == 1024)
- {
- SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); // link battle?
- }
- else if (battle_exit_is_player_defeat(gBattleOutcome) == TRUE)
- {
- SetMainCallback2(CB2_WhiteOut);
- }
- else
- {
- SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music);
- sub_808257C();
- }
-}
-
-void do_choose_name_or_words_screen(void)
-{
- if (gTrainerBattleOpponent == 1024)
- {
- SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); // link battle?
- }
- else if (battle_exit_is_player_defeat(gBattleOutcome) == TRUE)
- {
- SetMainCallback2(CB2_WhiteOut);
- }
- else
- {
- SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music);
- sub_808257C();
- sub_8082CB8();
- }
-}
-
-void sub_80826B0(void)
-{
- gBattleTypeFlags = BATTLE_TYPE_TRAINER;
- gMain.savedCallback = do_choose_name_or_words_screen;
- task_add_01_battle_start_with_music_and_stats();
- ScriptContext1_Stop();
-}
-
-void sub_80826D8(void)
-{
- ShowFieldMessage(sub_808281C());
-}
-
-u8 *sub_80826E8(void)
-{
- if (gTrainerBattleScriptReturnAddress)
- return gTrainerBattleScriptReturnAddress;
- else
- return gUnknown_081C6C02;
-}
-
-u8 *sub_8082700(void)
-{
- if (gTrainerBattleEndScript)
- return gTrainerBattleEndScript;
- else
- return gUnknown_081C6C02;
-}
-
-void sub_8082718(void)
-{
- ShowFieldMessage(sub_8082880());
-}
-
-void PlayTrainerEncounterMusic(void)
-{
- u16 music;
-
- if (gTrainerBattleMode != 1 && gTrainerBattleMode != 8)
- {
- switch (sub_803FC58(gTrainerBattleOpponent))
- {
- case TRAINER_ENCOUNTER_MUSIC_MALE:
- music = BGM_BOYEYE;
- break;
- case TRAINER_ENCOUNTER_MUSIC_FEMALE:
- music = BGM_GIRLEYE;
- break;
- case TRAINER_ENCOUNTER_MUSIC_GIRL:
- music = BGM_SYOUJOEYE;
- break;
- case TRAINER_ENCOUNTER_MUSIC_INTENSE:
- music = BGM_HAGESHII;
- break;
- case TRAINER_ENCOUNTER_MUSIC_COOL:
- music = BGM_KAKKOII;
- break;
- case TRAINER_ENCOUNTER_MUSIC_AQUA:
- music = BGM_AQA_0;
- break;
- case TRAINER_ENCOUNTER_MUSIC_MAGMA:
- music = BGM_MGM0;
- break;
- case TRAINER_ENCOUNTER_MUSIC_SWIMMER:
- music = BGM_SWIMEYE;
- break;
- case TRAINER_ENCOUNTER_MUSIC_TWINS:
- music = BGM_HUTAGO;
- break;
- case TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR:
- music = BGM_SITENNOU;
- break;
- case TRAINER_ENCOUNTER_MUSIC_HIKER:
- music = BGM_YAMA_EYE;
- break;
- case TRAINER_ENCOUNTER_MUSIC_INTERVIEWER:
- music = BGM_INTER_V;
- break;
- case TRAINER_ENCOUNTER_MUSIC_RICH:
- music = BGM_TEST;
- break;
- default:
- music = BGM_AYASII;
- }
- PlayNewMapMusic(music);
- }
-}
-
-//Returns an empty string if a null pointer was passed, otherwise returns str
-u8 *SanitizeString(const u8 *str)
-{
- if (str)
- return (u8 *) str;
- else
- return (u8 *) gOtherText_CancelWithTerminator;
-}
-
-u8 *sub_808281C(void)
-{
- return SanitizeString(gTrainerIntroSpeech);
-}
-
-u8 *sub_8082830(void)
-{
- u8 *str;
-
- if (gTrainerBattleOpponent == 1024)
- str = sub_80BCCE8();
- else
- str = gTrainerDefeatSpeech;
-
- StringExpandPlaceholders(gStringVar4, SanitizeString(str));
- return gStringVar4;
-}
-
-u8 *unref_sub_808286C(void)
-{
- return SanitizeString(gTrainerVictorySpeech);
-}
-
-u8 *sub_8082880(void)
-{
- return SanitizeString(gTrainerCannotBattleSpeech);
-}
-
-s32 sub_8082894(const struct TrainerEyeTrainer *trainers, u16 trainerNum)
-{
- s32 i;
-
- for (i = 0; i < NUM_TRAINER_EYE_TRAINERS; i++)
- {
- if (trainers[i].trainerNums[0] == trainerNum)
- return i;
- }
- return -1;
-}
-
-s32 sub_80828B8(const struct TrainerEyeTrainer *trainers, u16 trainerNum)
-{
- s32 i;
- s32 j;
-
- for (i = 0; i < NUM_TRAINER_EYE_TRAINERS; i++)
- {
- for (j = 0; j < 5 && trainers[i].trainerNums[j] != 0; j++)
- {
- if (trainers[i].trainerNums[j] == trainerNum)
- return i;
- }
- }
- return -1;
-}
-
-bool32 sub_80828FC(const struct TrainerEyeTrainer *trainers, u16 mapGroup, u16 mapNum)
-{
- int i;
- bool32 ret = FALSE;
-
- for (i = 0; i < NUM_TRAINER_EYE_TRAINERS; i++)
- {
- if (trainers[i].mapGroup == mapGroup && trainers[i].mapNum == mapNum)
- {
- if (gSaveBlock1.trainerRematches[i] != 0)
- ret = TRUE;
- else if (trainer_flag_check(trainers[i].trainerNums[0]) == TRUE && (Random() % 100) <= 30)
- {
- int j = 1;
-
- while (j < 5 && trainers[i].trainerNums[j] != 0 && trainer_flag_check(trainers[i].trainerNums[j]))
- j++;
- gSaveBlock1.trainerRematches[i] = j;
- ret = TRUE;
- }
- }
- }
- return ret;
-}
-
-s32 sub_80829A8(const struct TrainerEyeTrainer *trainers, u16 mapGroup, u16 mapNum)
-{
- s32 i;
-
- for (i = 0; i < NUM_TRAINER_EYE_TRAINERS; i++)
- {
- if (trainers[i].mapGroup == mapGroup && trainers[i].mapNum == mapNum && gSaveBlock1.trainerRematches[i])
- return 1;
- }
- return 0;
-}
-
-s32 sub_80829E8(const struct TrainerEyeTrainer *trainers, u16 mapGroup, u16 mapNum)
-{
- s32 i;
-
- for (i = 0; i < NUM_TRAINER_EYE_TRAINERS; i++)
- {
- if (trainers[i].mapGroup == mapGroup && trainers[i].mapNum == mapNum)
- return 1;
- }
- return 0;
-}
-
-bool8 sub_8082A18(const struct TrainerEyeTrainer *trainers, u16 trainerNum)
-{
- s32 trainerEyeIndex = sub_8082894(trainers, trainerNum);
-
- if (trainerEyeIndex != -1 && trainerEyeIndex < 100 && gSaveBlock1.trainerRematches[trainerEyeIndex])
- return TRUE;
- else
- return FALSE;
-}
-
-bool8 sub_8082A54(const struct TrainerEyeTrainer *trainers, u16 trainerNum)
-{
- s32 trainerEyeIndex = sub_80828B8(trainers, trainerNum);
-
- if (trainerEyeIndex != -1 && trainerEyeIndex < 100 && gSaveBlock1.trainerRematches[trainerEyeIndex])
- return TRUE;
- else
- return FALSE;
-}
-
-u16 sub_8082A90(const struct TrainerEyeTrainer *trainers, u16 trainerNum)
-{
- int i;
- const struct TrainerEyeTrainer *trainer;
- s32 trainerEyeIndex = sub_8082894(trainers, trainerNum);
-
- if (trainerEyeIndex == -1)
- return 0;
- trainer = &trainers[trainerEyeIndex];
- for (i = 1; i < 5; i++)
- {
- if (!trainer->trainerNums[i])
- return trainer->trainerNums[i - 1];
- if (!trainer_flag_check(trainer->trainerNums[i]))
- return trainer->trainerNums[i];
- }
- return trainer->trainerNums[4];
-}
-
-void sub_8082AE4(const struct TrainerEyeTrainer *trainers, u16 trainerNum)
-{
- s32 trainerEyeIndex = sub_80828B8(trainers, trainerNum);
-
- if (trainerEyeIndex != -1)
- gSaveBlock1.trainerRematches[trainerEyeIndex] = 0;
-}
-
-bool8 sub_8082B10(const struct TrainerEyeTrainer *trainers, u16 trainerNum)
-{
- s32 trainerEyeIndex = sub_8082894(trainers, trainerNum);
-
- if (trainerEyeIndex != -1 && trainer_flag_check(trainers[trainerEyeIndex].trainerNums[1]))
- return TRUE;
- else
- return FALSE;
-}
-
-bool32 sub_8082B44(void)
-{
- int badgeCount = 0;
- u32 i;
-
- for (i = 0; i < 8; i++)
- {
- if (FlagGet(sBadgeFlags[i]) == TRUE)
- {
- badgeCount++;
- if (badgeCount >= 5)
- return TRUE;
- }
- }
- return FALSE;
-}
-
-void sub_8082B78(void)
-{
- if (sub_8082B44())
- {
- if (gSaveBlock1.trainerRematchStepCounter >= TRAINER_REMATCH_STEPS)
- gSaveBlock1.trainerRematchStepCounter = TRAINER_REMATCH_STEPS;
- else
- gSaveBlock1.trainerRematchStepCounter++;
- }
-}
-
-bool32 sub_8082BA4(void)
-{
- if (sub_8082B44() && gSaveBlock1.trainerRematchStepCounter >= TRAINER_REMATCH_STEPS)
- return TRUE;
- else
- return FALSE;
-}
-
-void sub_8082BD0(u16 mapGroup, u16 mapNum)
-{
- if (sub_8082BA4() && sub_80828FC(gTrainerEyeTrainers, mapGroup, mapNum) == TRUE)
- gSaveBlock1.trainerRematchStepCounter = 0;
-}
-
-s32 sub_8082C0C(u16 mapGroup, u16 mapNum)
-{
- return sub_80829A8(gTrainerEyeTrainers, mapGroup, mapNum);
-}
-
-s32 unref_sub_8082C2C(u16 mapGroup, u16 mapNum)
-{
- return sub_80829E8(gTrainerEyeTrainers, mapGroup, mapNum);
-}
-
-u16 sub_8082C4C(u16 trainerNum)
-{
- return sub_8082A90(gTrainerEyeTrainers, trainerNum);
-}
-
-s32 sub_8082C68(void)
-{
- if (sub_8082A18(gTrainerEyeTrainers, gTrainerBattleOpponent))
- return 1;
- else
- return sub_8082B10(gTrainerEyeTrainers, gTrainerBattleOpponent);
-}
-
-u8 sub_8082C9C(void)
-{
- return sub_8082A54(gTrainerEyeTrainers, gTrainerBattleOpponent);
-}
-
-void sub_8082CB8(void)
-{
- sub_8082AE4(gTrainerEyeTrainers, gTrainerBattleOpponent);
- sub_808257C();
-}
diff --git a/src/bike.c b/src/bike.c
deleted file mode 100644
index 58a4f38f4..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 "rom4.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);
- sub_8053FB0(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/cable_club.c b/src/cable_club.c
deleted file mode 100644
index 20b087f4e..000000000
--- a/src/cable_club.c
+++ /dev/null
@@ -1,317 +0,0 @@
-#include "global.h"
-#include "cable_club.h"
-#include "field_message_box.h"
-#include "link.h"
-#include "main.h"
-#include "script.h"
-#include "songs.h"
-#include "sound.h"
-#include "string_util.h"
-#include "task.h"
-#include "text.h"
-#include "trainer_card.h"
-
-extern u16 gScriptResult;
-extern struct TrainerCard gTrainerCards[4];
-
-extern u8 gUnknown_03004860;
-extern u8 gFieldLinkPlayerCount;
-
-extern u8 gUnknown_081A4932[];
-extern const u8 gUnknown_081A4975[];
-
-static void sub_80830E4(u8 taskId);
-static void sub_8083288(u8 taskId);
-static void sub_8083314(u8 taskId);
-
-void sub_808303C(u8 taskId) {
- s32 linkPlayerCount;
- s16 *taskData;
-
- taskData = gTasks[taskId].data;
-
- linkPlayerCount = GetLinkPlayerCount_2();
-
- if (sub_8082E28(taskId) == 1 ||
- sub_8082EB8(taskId) == 1 ||
- sub_8082DF4(taskId) == 1)
- {
- return;
- }
-
- sub_8082D60(taskId, linkPlayerCount);
-
- if (!(gMain.newKeys & A_BUTTON))
- {
- return;
- }
-
-#if ENGLISH
- if (linkPlayerCount < taskData[1])
- {
- return;
- }
-
- sub_80081C8(linkPlayerCount);
- sub_8082D4C();
- ConvertIntToDecimalStringN(gStringVar1, linkPlayerCount, STR_CONV_MODE_LEFT_ALIGN, 1); // r5
- ShowFieldAutoScrollMessage((u8 *) gUnknown_081A4975);
- gTasks[taskId].func = sub_80830E4;
-#elif GERMAN
- if ((gLinkType == 0x2255 && (u32) linkPlayerCount > 1) ||
- (gLinkType != 0x2255 && taskData[1] <= linkPlayerCount))
- {
- sub_80081C8(linkPlayerCount);
- sub_8082D4C();
- ConvertIntToDecimalStringN(gStringVar1, linkPlayerCount, STR_CONV_MODE_LEFT_ALIGN, 1); // r5
- ShowFieldAutoScrollMessage((u8 *) gUnknown_081A4975);
- gTasks[taskId].func = sub_80830E4;
- }
-#endif
-}
-
-#ifdef NONMATCHING
-static void sub_80830E4(u8 taskId) {
- if (sub_8082E28(taskId) == 1 ||
- sub_8082EB8(taskId) == 1 ||
- sub_8082DF4(taskId) == 1 ||
- GetFieldMessageBoxMode())
- {
- return;
- }
-
- if (sub_800820C() == GetLinkPlayerCount_2() &&
- !(gMain.heldKeys & B_BUTTON))
- {
- ShowFieldAutoScrollMessage(gUnknown_081A4932);
- gTasks[taskId].func = sub_8082FEC;
- return;
- }
-
- if (gMain.heldKeys & A_BUTTON)
- {
- PlaySE(SE_SELECT);
- sub_8007F4C();
- gTasks[(u32) taskId].func = sub_8083188;
- }
-}
-#else
-__attribute__((naked))
-static void sub_80830E4(u8 taskId) {
- asm(".syntax unified\n\
- push {r4-r6,lr}\n\
- lsls r0, 24\n\
- lsrs r5, r0, 24\n\
- adds r6, r5, 0\n\
- adds r0, r5, 0\n\
- bl sub_8082E28\n\
- cmp r0, 0x1\n\
- beq _08083178\n\
- adds r0, r5, 0\n\
- bl sub_8082EB8\n\
- cmp r0, 0x1\n\
- beq _08083178\n\
- adds r0, r5, 0\n\
- bl sub_8082DF4\n\
- cmp r0, 0x1\n\
- beq _08083178\n\
- bl GetFieldMessageBoxMode\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- bne _08083178\n\
- bl sub_800820C\n\
- adds r4, r0, 0\n\
- bl GetLinkPlayerCount_2\n\
- lsls r4, 24\n\
- lsls r0, 24\n\
- cmp r4, r0\n\
- bne _08083132\n\
- ldr r0, _08083148 @ =gMain\n\
- ldrh r1, [r0, 0x2C]\n\
- movs r0, 0x2\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08083158\n\
-_08083132:\n\
- ldr r0, _0808314C @ =gUnknown_081A4932\n\
- bl ShowFieldAutoScrollMessage\n\
- ldr r1, _08083150 @ =gTasks\n\
- lsls r0, r5, 2\n\
- adds r0, r5\n\
- lsls r0, 3\n\
- adds r0, r1\n\
- ldr r1, _08083154 @ =sub_8082FEC\n\
- str r1, [r0]\n\
- b _08083178\n\
- .align 2, 0\n\
-_08083148: .4byte gMain\n\
-_0808314C: .4byte gUnknown_081A4932\n\
-_08083150: .4byte gTasks\n\
-_08083154: .4byte sub_8082FEC\n\
-_08083158:\n\
- movs r0, 0x1\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08083178\n\
- movs r0, 0x5\n\
- bl PlaySE\n\
- bl sub_8007F4C\n\
- ldr r0, _08083180 @ =gTasks\n\
- lsls r1, r6, 2\n\
- adds r1, r6\n\
- lsls r1, 3\n\
- adds r1, r0\n\
- ldr r0, _08083184 @ =sub_8083188\n\
- str r0, [r1]\n\
-_08083178:\n\
- pop {r4-r6}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_08083180: .4byte gTasks\n\
-_08083184: .4byte sub_8083188\n\
- .syntax divided\n");
-}
-#endif
-
-void sub_8083188(u8 taskId) {
- u8 local1, local2;
- u16 *result;
-
- local1 = gTasks[taskId].data[1];
- local2 = gTasks[taskId].data[2];
-
-
- if (sub_8082DF4(taskId) == 1 ||
- sub_8083444(taskId) == 1)
- {
- return;
- }
-
- if (GetLinkPlayerCount_2() != sub_800820C())
- {
- gTasks[taskId].func = sub_8083418;
- return;
- }
-
- result = &gScriptResult;
- *result = sub_8082D9C(local1, local2);
- if (*result)
- {
- gTasks[taskId].func = sub_8083288;
- }
-}
-
-void sub_80831F8(u8 taskId) {
- u8 local1, local2;
- u16 *result;
-
- local1 = gTasks[taskId].data[1];
- local2 = gTasks[taskId].data[2];
-
- if (sub_8082E28(taskId) == 1 ||
- sub_8082DF4(taskId) == 1)
- {
- return;
- }
-
- result = &gScriptResult;
- *result = sub_8082D9C(local1, local2);
- if (*result == 0)
- {
- return;
- }
-
-
- if (*result == 3)
- {
- sub_800832C();
- HideFieldMessageBox();
- gTasks[taskId].func = sub_80833C4;
- }
- else
- {
- gFieldLinkPlayerCount = GetLinkPlayerCount_2();
- gUnknown_03004860 = GetMultiplayerId();
- sub_80081C8(gFieldLinkPlayerCount);
- sub_8093390((struct TrainerCard *) gBlockSendBuffer);
- gTasks[taskId].func = sub_8083314;
- }
-}
-
-static void sub_8083288(u8 taskId) {
- if (sub_8082DF4(taskId) == 1)
- {
- return;
- }
-
- if (gScriptResult == 3)
- {
- sub_800832C();
- HideFieldMessageBox();
- gTasks[taskId].func = sub_80833C4;
- }
- else
- {
- gFieldLinkPlayerCount = GetLinkPlayerCount_2();
- gUnknown_03004860 = GetMultiplayerId();
- sub_80081C8(gFieldLinkPlayerCount);
- sub_8093390((struct TrainerCard *) gBlockSendBuffer);
- gTasks[taskId].func = sub_8083314;
- sub_8007E9C(2);
- }
-}
-
-static void sub_8083314(u8 taskId) {
- u8 index;
-
- struct TrainerCard *trainerCards;
-
- if (sub_8082DF4(taskId) == 1)
- {
- return;
- }
-
- if (GetBlockReceivedStatus() != sub_8008198())
- {
- return;
- }
-
- index = 0;
- trainerCards = gTrainerCards;
- for (index = 0; index < GetLinkPlayerCount(); index++)
- {
- void *src;
- src = gBlockRecvBuffer[index];
- memcpy(&trainerCards[index], src, sizeof(struct TrainerCard));
- }
-
- SetSuppressLinkErrorMessage(FALSE);
- ResetBlockReceivedFlags();
- HideFieldMessageBox();
-
- if (gScriptResult == 1)
- {
-#if ENGLISH
- u16 linkType;
- linkType = gLinkType;
- // FIXME: sub_8082D4C doesn't take any arguments
- sub_8082D4C(0x00004411, linkType);
-#elif GERMAN
- if (gLinkType != 0x4411)
- {
- if (gLinkType == 0x6601)
- {
- deUnkValue2 = 1;
- }
- }
- sub_8082D4C();
-#endif
- EnableBothScriptContexts();
- DestroyTask(taskId);
- return;
- }
-
- sub_800832C();
- gTasks[taskId].func = sub_80833C4;
-}
diff --git a/src/contest.c b/src/contest.c
new file mode 100644
index 000000000..c32719648
--- /dev/null
+++ b/src/contest.c
@@ -0,0 +1,5377 @@
+#include "global.h"
+#include "constants/items.h"
+#include "constants/map_objects.h"
+#include "constants/moves.h"
+#include "constants/songs.h"
+#include "constants/species.h"
+#include "battle.h"
+#include "battle_anim.h"
+#include "blend_palette.h"
+#include "contest.h"
+#include "contest_link_80C857C.h"
+#include "data2.h"
+#include "decompress.h"
+#include "ewram.h"
+#include "graphics.h"
+#include "link.h"
+#include "m4a.h"
+#include "main.h"
+#include "menu.h"
+#include "menu_cursor.h"
+#include "overworld.h"
+#include "palette.h"
+#include "random.h"
+#include "rom_8077ABC.h"
+#include "script.h"
+#include "sound.h"
+#include "sprite.h"
+#include "string_util.h"
+#include "task.h"
+#include "text.h"
+#include "tv.h"
+#include "unknown_task.h"
+#include "util.h"
+
+extern u8 AreMovesContestCombo(u16, u16); // I don't think this is a bool
+extern void sub_80C8A38(u8);
+extern void sub_80C8AD0(u8);
+extern void sub_80C8C80(u8);
+extern void sub_81288F4();
+extern u8 sub_8128944(void);
+
+extern struct MusicPlayerInfo gMPlay_SE1;
+extern u16 gSpecialVar_ContestCategory;
+extern u16 gSpecialVar_ContestRank;
+extern u8 gBattleMonForms[];
+extern u8 gDisplayedStringBattle[];
+extern u16 gBattleTypeFlags;
+extern u8 gBankAttacker;
+extern u8 gBankTarget;
+extern u8 gBanksBySide[];
+extern u8 gObjectBankIDs[];
+extern u8 gIsLinkContest;
+extern u8 gContestPlayerMonIndex;
+extern u16 gUnknown_030041B0;
+extern s16 gBattle_BG1_Y;
+extern u16 gUnknown_030041B8;
+extern u16 gBattle_WIN1H;
+extern struct Window gUnknown_03004210;
+extern u16 gBattle_WIN0V;
+extern u16 gBattle_WIN1V;
+extern u16 gBattle_BG2_Y;
+extern u16 gBattle_BG2_X;
+extern u16 gBattle_BG0_Y;
+extern u16 gBattle_BG0_X;
+extern u16 gBattle_BG1_X;
+extern u16 gBattle_WIN0H;
+extern u32 gUnknown_03005D28; // saved RNG value
+
+extern s16 gUnknown_02038680[];
+extern u16 gUnknown_02038688[];
+extern u8 gUnknown_02038694;
+extern u8 gUnknown_02038696[];
+extern u8 gUnknown_0203869B;
+extern s16 gUnknown_02038670[];
+extern s16 gUnknown_02038678[];
+extern u8 gContestFinalStandings[]; // What "place" each participant came in.
+extern struct SpriteTemplate gUnknown_02024E8C;
+
+
+extern const struct ContestPokemon gContestOpponents[60];
+extern const u8 gUnknown_083CA308[][2];
+extern const u8 gUnknown_083CA310[][2];
+extern const u8 gUnknown_083CA318[][2];
+extern const u8 gUnknown_083CA330[][2];
+extern const u8 gUnknown_083CA338[];
+extern const u8 gUnknown_083CA33C[];
+extern const u8 gUnknown_083CA340[][4];
+extern const struct SpriteSheet gUnknown_083CA350;
+extern const struct SpriteTemplate gSpriteTemplate_83CA3AC;
+extern const struct CompressedSpriteSheet gUnknown_083CA3C4[];
+extern const struct SpritePalette gUnknown_083CA3E4;
+extern const struct SpriteTemplate gSpriteTemplate_83CA3F4[];
+extern const struct SubspriteTable gSubspriteTables_83CA464[];
+extern const struct CompressedSpriteSheet gUnknown_083CA46C;
+extern const struct SpritePalette gUnknown_083CA474;
+extern const struct SpriteTemplate gSpriteTemplate_83CA484;
+extern const struct SpriteTemplate gSpriteTemplate_83CA4A4;
+extern const struct CompressedSpriteSheet gUnknown_083CA4BC;
+extern const struct CompressedSpriteSheet gUnknown_083CA4C4;
+extern const struct CompressedSpritePalette gUnknown_083CA4CC;
+extern const struct SpriteTemplate gUnknown_083CA4D4;
+extern const struct CompressedSpriteSheet gUnknown_083CC3AC;
+extern const struct CompressedSpritePalette gUnknown_083CC3B4[];
+extern const struct SpriteTemplate gSpriteTemplate_83CC454[];
+extern const u8 gText_Contest_WhichMoveWillBePlayed[];
+extern const u8 gText_Contest_ButItCantParticipate[];
+extern const u8 gUnknown_083CAFD7[];
+extern const u8 gUnknown_083CB00D[];
+extern const u8 ContestString_JudgeExpectantly2[];
+extern const u8 ContestString_WentOverWell[];
+extern const u8 ContestString_WentOverVeryWell[];
+extern const u8 ContestString_AppealComboExcellently[];
+extern const u8 gUnknown_083CBF60[];
+extern const u8 gUnknown_083CB02C[];
+extern const u8 *const gContestStandOutStrings[];
+extern const u8 ContestString_DissapointedRepeat[];
+extern const u8 ContestString_WentOverGreat[];
+extern const u8 ContestString_DidntGoWell[];
+extern const u8 ContestString_GotCrowdGoing[];
+extern const u8 ContestString_CantAppealNextTurn[];
+extern const u8 ContestString_CrowdWatches[];
+extern const u8 ContestString_Ignored2[];
+extern const u8 *const gUnknown_083CC188[];
+extern const u8 gText_Contest_Shyness[];
+extern const u8 gText_Contest_Anxiety[];
+extern const u8 gText_Contest_Laziness[];
+extern const u8 gText_Contest_Hesitancy[];
+extern const u8 gText_Contest_Fear[];
+extern const u8 *const gContestCategoryStrings[];
+extern const u8 gUnknown_083CC2EC[];
+extern const u8 *const gUnknown_083CC330[];
+extern const u8 gUnknownText_UnknownFormatting2[];
+extern const u8 gUnknownText_UnknownFormatting3[];
+extern const u8 gUnknown_083CC59C[];
+extern const u8 gUnknown_083CC5A2[];
+extern const u16 gUnknown_083CC5A4[];
+extern const struct ContestWinner gUnknown_083CC5D0[];
+extern const u8 gUnknownText_MissedTurn[];
+extern const u8 gUnknownText_LinkStandbyAndWinner[];
+extern void (*const gContestEffectFuncs[])(void);
+extern const s8 gContestExcitementTable[][5];
+
+void sub_80AB350(void);
+void sub_80AB5D4(u8);
+void sub_80AB604(u8);
+void sub_80AB678(u8);
+void sub_80AB694(u8);
+void sub_80AB6B4(u8);
+u8 sub_80AB70C(u8 *);
+void sub_80AB960(u8);
+void sub_80AB9A0(u8);
+void ContestMainCallback2(void);
+void ContestVBlankCallback(void);
+void sub_80ABB70(u8);
+void sub_80ABC3C(u8);
+void sub_80ABC70(u8);
+void sub_80ABCDC(u8);
+void sub_80ABEA0(u8);
+void sub_80AC0AC(s8);
+void nullsub_17(s8);
+void sub_80AC0C8(u8);
+void sub_80AC15C(u8);
+void sub_80AC188(u8);
+void sub_80AC204(u8);
+void sub_80AC250(u8);
+void sub_80AC284(u8);
+void sub_80AC2CC(u8);
+void sub_80AD8DC(u8);
+void sub_80AD8FC(struct Sprite *);
+void sub_80AD92C(struct Sprite *);
+void sub_80AD960(u8);
+void sub_80ADA1C(u8);
+void sub_80ADA4C(u8);
+void sub_80ADAD8(u8);
+void sub_80ADB04(u8);
+void sub_80ADB48(u8);
+void sub_80ADB88(u8);
+void sub_80ADC10(u8);
+void sub_80ADC4C(u8);
+void sub_80ADC84(u8);
+void sub_80ADCB4(u8);
+void sub_80ADD04(u8);
+void sub_80ADD74(u8);
+void sub_80ADDA4(u8);
+void sub_80ADE54(u8);
+void sub_80ADEAC(u8);
+void sub_80ADEEC(u8);
+void sub_80ADF4C(u8);
+void sub_80ADF98(u8);
+void sub_80ADFD8(u8);
+void sub_80AE010(void);
+void InsertStringDigit(u8 *, s32);
+bool8 sub_80AE074(void);
+void sub_80AEB4C(void *);
+void sub_80AE5BC(u8);
+void sub_80AE5D4(u8, u8);
+void sub_80AE6CC(u8);
+void sub_80AE6E4(u8, u8);
+u8 CreateJudgeSprite(void);
+u8 sub_80AE8B4(void);
+u8 sub_80AE9FC(u16, u32, u32);
+bool8 IsSpeciesNotUnown(u16);
+void sub_80AEB30(void);
+void sub_80AEBEC(u16);
+void sub_80AED58(void);
+bool8 sub_80AEE54(u8, u8);
+bool8 sub_80AF038(u8);
+void sub_80AF120(void);
+void sub_80AF138(void);
+u16 GetChosenMove(u8);
+void sub_80AF1B8(void);
+void sub_80AF2A0(u8);
+void sub_80AF2FC(void);
+void sub_80AF3C0(void);
+bool8 Contest_IsMonsTurnDisabled(u8);
+s16 sub_80AF688(u8);
+void DetermineFinalStandings(void);
+bool8 sub_80AF828(s32, s32, struct UnknownContestStruct6 *);
+void sub_80AF860(void);
+void sub_80AF94C(u8);
+void sub_80AFA5C(void);
+u16 sub_80AFB40(u8);
+s8 sub_80AFB74(s16);
+u8 sub_80AFBA0(s16, s16, u8);
+void sub_80AFC74(u8);
+void sub_80AFE30(void);
+void sub_80AFF10(void);
+bool8 sub_80AFF28(void);
+void sub_80AFF60(struct Sprite *);
+void sub_80AFFE0(bool8);
+void sub_80B0034(void);
+void CreateApplauseMeterSprite(void);
+void nullsub_18(s8);
+void sub_80B0238(struct Sprite *);
+void sub_80B0280(struct Sprite *);
+void sub_80B02A8(struct Sprite *);
+void sub_80B02F4(struct Sprite *);
+void sub_80B0324(void);
+void sub_80B03A8(u8);
+void sub_80B03D8(u8);
+void sub_80B0458(u8);
+void sub_80B0518(void);
+void sub_80B0548(u8);
+void sub_80B05A4(u8);
+void nullsub_19(int);
+void sub_80B05FC(u8);
+void sub_80B0748(u8);
+void sub_80B09B0(u8);
+u8 sub_80B09E4(u8);
+void sub_80B0BC4(u8, bool8);
+void sub_80B0C5C(struct Sprite *);
+void sub_80B0CB0(struct Sprite *);
+void sub_80B0CDC(u8, int);
+void sub_80B0D7C(void);
+void sub_80B1118(void);
+void sub_80B114C(u8);
+void sub_80B146C(u8, u8);
+void sub_80B159C(void);
+void sub_80B1710(u8);
+void sub_80B1928(void);
+s8 Contest_GetMoveExcitement(u16);
+u8 sub_80B1A2C(void);
+void c3_08130B10(u8);
+void sub_80B1B14(void);
+void sub_80B1B68(u8);
+void sub_80B1BDC(void);
+void sub_80B1C34(u8);
+void sub_80B1CBC(s8);
+void sub_80B1CFC(u8);
+void sub_80B1DDC(void);
+void sub_80B1DFC(u8);
+void sub_80B1EA8(s8, s8);
+void sub_80B1F4C(u8);
+void sub_80B1FD0(bool8);
+const u8 *GetTurnOrderNumberGfx(u8);
+void sub_80B20C4(void);
+bool8 sub_80B214C(u8);
+void sub_80B2184(void);
+void sub_80B2280(void);
+void sub_80B237C(u8);
+void sub_80B23BC(u8);
+void sub_80B2400(u8);
+void sub_80B253C(u8);
+void sub_80B25A4(u8);
+void sub_80B25E4(u8);
+void sub_80B26C8(u8);
+u16 SanitizeMove(u16);
+u16 SanitizeSpecies(u16);
+void sub_80B2790(u8);
+void sub_80B28CC(int);
+void sub_80B28F0(u8);
+void sub_80B292C(void);
+void sub_80B2968(void);
+void SelectContestMoveBankTarget(u16);
+
+
+void nullsub_89(u8 taskId)
+{
+}
+
+void ResetLinkContestBoolean(void)
+{
+ gIsLinkContest = FALSE;
+}
+
+void ResetContestGpuRegs(void)
+{
+ u16 savedIme;
+
+ REG_DISPCNT = 0x40;
+ savedIme = REG_IME;
+ REG_IME = 0;
+ REG_IE |= INTR_FLAG_VBLANK;
+ REG_IME = savedIme;
+ REG_DISPSTAT = 8;
+ REG_BG0CNT = 0x9800;
+ REG_BG1CNT = 0x9E09;
+ REG_BG2CNT = 0x9C00;
+ REG_BG3CNT = 0x3A03;
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ REG_BLDY = 0;
+ REG_WININ = 0x3F3F;
+ REG_WINOUT = 0x3F3F;
+ REG_DISPCNT |= 0x7F00;
+
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 0;
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ gBattle_BG2_X = 0;
+ gBattle_BG2_Y = 0;
+ gUnknown_030041B0 = 0;
+ gUnknown_030041B8 = 0;
+ gBattle_WIN0H = 0;
+ gBattle_WIN0V = 0;
+ gBattle_WIN1H = 0;
+ gBattle_WIN1V = 0;
+}
+
+void LoadContestBgAfterMoveAnim(void)
+{
+ s32 i;
+
+ LZDecompressVram(gContestMiscGfx, (void *)VRAM);
+ LZDecompressVram(gContestAudienceGfx, (void *)(VRAM + 0x2000));
+ LZDecompressVram(gUnknown_08D1725C, (void *)(VRAM + 0xD000));
+ LoadCompressedPalette(gUnknown_08D17144, 0, 0x200);
+ sub_80AB350();
+ for (i = 0; i < 4; i++)
+ {
+ u32 var = 5 + i;
+
+ LoadPalette(shared18000.unk18004[var], 16 * (5 + gUnknown_02038696[i]), 16 * sizeof(u16));
+ }
+}
+
+void SetUpContestWindow(void)
+{
+ SetUpWindowConfig(&gWindowConfig_81E6FD8);
+ InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6FD8);
+ InitWindowFromConfig(&gMenuWindow, &gWindowConfig_81E6FF4);
+}
+
+void sub_80AB350(void)
+{
+ u8 i;
+
+ LoadFontDefaultPalette(&gWindowConfig_81E6FD8);
+ FillPalette(0, 0, 2);
+ for (i = 10; i < 14; i++)
+ LoadPalette(gPlttBufferUnfaded + 241, 240 + i, 2);
+ FillPalette(0x7E3F, 0xF3, 2);
+}
+
+void ClearContestVars(void)
+{
+ s32 i;
+
+ memset(&sContest, 0, sizeof(sContest));
+ for (i = 0; i < 4; i++)
+ sContest.unk19206[i] = 0xFF;
+
+ for (i = 0; i < 4; i++)
+ memset(&sContestantStatus[i], 0, sizeof(sContestantStatus[i]));
+ for (i = 0; i < 4; i++)
+ {
+ sContestantStatus[i].unkB_0 = 0;
+ sContestantStatus[i].unk13 = 0xFF;
+ sContestantStatus[i].unk14 = 0xFF;
+ }
+
+ memset(&shared192D0, 0, sizeof(shared192D0));
+ memset(shared192E4, 0, 0x44 * sizeof(*shared192E4));
+ memset(&shared19328, 0, sizeof(shared19328));
+ memset(shared19338, 0, 4 * sizeof(*shared19338));
+ if (!(gIsLinkContest & 1))
+ sub_80B0F28(0);
+ for (i = 0; i < 4; i++)
+ {
+ sContestantStatus[i].unk19 = 0xFF;
+ sContest.unk19218[i] = gUnknown_02038696[i];
+ }
+ sub_80B159C();
+}
+
+void CB2_StartContest(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ SetUpContestWindow();
+ ResetContestGpuRegs();
+ dp12_8087EA4();
+ ResetPaletteFade();
+ gPaletteFade.bufferTransferDisabled = TRUE;
+ DmaClearLarge32(3, (void *)VRAM, VRAM_SIZE, 0x1000);
+ ResetSpriteData();
+ ResetTasks();
+ FreeAllSpritePalettes();
+ gReservedSpritePaletteCount = 4;
+ //shared18000.unk18000 = 0;
+ gSharedMem[0x18000] = 0;
+ ClearBattleMonForms();
+ ClearContestVars();
+ gMain.state++;
+ break;
+ case 1:
+ sub_80AB350();
+ gMain.state++;
+ break;
+ case 2:
+ if (sub_80AB70C(&sContest.unk1925D) == 0)
+ break;
+ sContest.unk1925D = 0;
+ gMain.state++;
+ break;
+ case 3:
+ sub_80B2184();
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ BeginFastPaletteFade(2);
+ gPaletteFade.bufferTransferDisabled = FALSE;
+ SetVBlankCallback(ContestVBlankCallback);
+ sContest.mainTaskId = CreateTask(sub_80AB5D4, 10);
+ SetMainCallback2(ContestMainCallback2);
+ break;
+ }
+}
+
+void sub_80AB5D4(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ gTasks[taskId].func = sub_80AB604;
+}
+
+void sub_80AB604(u8 taskId)
+{
+ if (gIsLinkContest & 1)
+ {
+ if (!gPaletteFade.active)
+ {
+ gPaletteFade.bufferTransferDisabled = FALSE;
+ sub_80AF860();
+ CreateTask(sub_80AB678, 0);
+ gTasks[taskId].func = nullsub_89;
+ }
+ }
+ else
+ {
+ gTasks[taskId].func = sub_80AB960;
+ }
+}
+
+void sub_80AB678(u8 taskId)
+{
+ SetTaskFuncWithFollowupFunc(taskId, sub_80C89DC, sub_80AB694);
+}
+
+void sub_80AB694(u8 taskId)
+{
+ u16 one = 1;
+
+ gTasks[taskId].data[0] = one;
+ gTasks[taskId].func = sub_80AB6B4;
+}
+
+void sub_80AB6B4(u8 taskId)
+{
+ gTasks[taskId].data[0]--;
+ if (gTasks[taskId].data[0] <= 0)
+ {
+ GetMultiplayerId(); // unused return value
+ DestroyTask(taskId);
+ gTasks[sContest.mainTaskId].func = sub_80AB960;
+ gRngValue = gUnknown_03005D28;
+ }
+}
+
+u8 sub_80AB70C(u8 *a)
+{
+ u16 sp0[16];
+ u16 sp20[16];
+
+ switch (*a)
+ {
+ case 0:
+ gPaletteFade.bufferTransferDisabled = TRUE;
+ DmaClearLarge32(3, (void *)VRAM, VRAM_SIZE, 0x1000);
+ break;
+ case 1:
+ LZDecompressVram(gContestMiscGfx, (void *)VRAM);
+ break;
+ case 2:
+ LZDecompressVram(gContestAudienceGfx, (void *)(VRAM + 0x2000));
+ DmaCopyLarge32(3, (void *)(VRAM + 0x2000), shared15800, 0x2000, 0x1000);
+ break;
+ case 3:
+ LZDecompressVram(gUnknown_08D1725C, (void *)(VRAM + 0xD000));
+ break;
+ case 4:
+ LZDecompressVram(gUnknown_08D17424, (void *)(VRAM + 0xE000));
+ DmaCopy32Defvars(3, (void *)(VRAM + 0xE000), shared18000.unk18A04, 0x800);
+ break;
+ case 5:
+ LoadCompressedPalette(gUnknown_08D17144, 0, 0x200);
+ CpuCopy32(gPlttBufferUnfaded + 128, sp0, 16 * sizeof(u16));
+ CpuCopy32(gPlttBufferUnfaded + (5 + gContestPlayerMonIndex) * 16, sp20, 16 * sizeof(u16));
+ CpuCopy32(sp20, gPlttBufferUnfaded + 128, 16 * sizeof(u16));
+ CpuCopy32(sp0, gPlttBufferUnfaded + (5 + gContestPlayerMonIndex) * 16, 16 * sizeof(u16));
+ DmaCopy32Defvars(3, gPlttBufferUnfaded, shared18000.unk18004, 0x200);
+ sub_80AB350();
+ break;
+ case 6:
+ sub_80B1118();
+ sub_80AFA5C();
+ sub_80AEB30();
+ sContest.unk19216 = sub_80AE8B4();
+ sub_80AFE30();
+ sub_80B0034();
+ CreateApplauseMeterSprite();
+ sub_80B0324();
+ sub_80B0518();
+ gBanksBySide[0] = 0;
+ gBanksBySide[1] = 1;
+ gBanksBySide[2] = 3;
+ gBanksBySide[3] = 2;
+ gBattleTypeFlags = 0;
+ gBankAttacker = 2;
+ gBankTarget = 3;
+ gObjectBankIDs[gBankAttacker] = CreateJudgeSprite();
+ sub_80B292C();
+ break;
+ default:
+ *a = 0;
+ return 1;
+ }
+
+ (*a)++;
+ return 0;
+}
+
+void sub_80AB960(u8 taskId)
+{
+ gPaletteFade.bufferTransferDisabled = FALSE;
+ if (!gPaletteFade.active)
+ {
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].func = sub_80AB9A0;
+ }
+}
+
+void sub_80AB9A0(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (gTasks[taskId].data[1]++ <= 60)
+ break;
+ gTasks[taskId].data[1] = 0;
+ PlaySE12WithPanning(SE_C_MAKU_U, 0);
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ gBattle_BG1_Y += 7;
+ if (gBattle_BG1_Y <= 160)
+ break;
+ gTasks[taskId].data[0]++;
+ break;
+ case 2:
+ sub_80B2280();
+ gTasks[taskId].data[0]++;
+ break;
+ case 3:
+ REG_BG0CNT_BITFIELD.priority = 0;
+ REG_BG2CNT_BITFIELD.priority = 0;
+ sub_80B1B14();
+ gTasks[taskId].data[0]++;
+ break;
+ case 4:
+ default:
+ if (sContest.unk1920A_6)
+ break;
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].func = sub_80ABB70;
+ break;
+ }
+}
+
+void ContestMainCallback2(void)
+{
+ AnimateSprites();
+ RunTasks();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+void ContestVBlankCallback(void)
+{
+ REG_BG0HOFS = gBattle_BG0_X;
+ REG_BG0VOFS = gBattle_BG0_Y;
+ REG_BG1HOFS = gBattle_BG1_X;
+ REG_BG1VOFS = gBattle_BG1_Y;
+ REG_BG2HOFS = gBattle_BG2_X;
+ REG_BG2VOFS = gBattle_BG2_Y;
+ REG_BG3HOFS = gUnknown_030041B0;
+ REG_BG3VOFS = gUnknown_030041B8;
+ REG_WIN0H = gBattle_WIN0H;
+ REG_WIN0V = gBattle_WIN0V;
+ REG_WIN1H = gBattle_WIN1H;
+ REG_WIN1V = gBattle_WIN1V;
+ TransferPlttBuffer();
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ sub_8089668();
+}
+
+void sub_80ABB70(u8 taskId)
+{
+ gBattle_BG0_Y = 0;
+ gBattle_BG2_Y = 0;
+ sub_80B0D7C();
+ DmaCopy32Defvars(3, gPlttBufferUnfaded, shared18000.unk18204, 0x400);
+ if (!Contest_IsMonsTurnDisabled(gContestPlayerMonIndex))
+ StringCopy(gDisplayedStringBattle, gText_Contest_WhichMoveWillBePlayed);
+ else
+ StringCopy(gDisplayedStringBattle, gText_Contest_ButItCantParticipate);
+ InsertStringDigit(gDisplayedStringBattle, sContest.turnNumber + 1);
+ sub_80AF138();
+ StringExpandPlaceholders(gStringVar4, gDisplayedStringBattle);
+ sub_8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15);
+ gTasks[taskId].func = sub_80ABC3C;
+}
+
+void sub_80ABC3C(u8 taskId)
+{
+ if (sub_80037A0(&gMenuWindow) == 1)
+ gTasks[taskId].func = sub_80ABC70;
+}
+
+void sub_80ABC70(u8 taskId)
+{
+ if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys == B_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ if (!Contest_IsMonsTurnDisabled(gContestPlayerMonIndex))
+ {
+ sub_80AFFE0(TRUE);
+ gTasks[taskId].func = sub_80ABCDC;
+ }
+ else
+ {
+ gTasks[taskId].func = sub_80AC0C8;
+ }
+ }
+}
+
+// Print the move list
+void sub_80ABCDC(u8 taskId)
+{
+ u8 i;
+ u8 sp8[32];
+
+ gBattle_BG0_Y = 0xA0;
+ gBattle_BG2_Y = 0xA0;
+ FillWindowRect_DefaultPalette(
+ &gUnknown_03004210,
+ 0,
+ gUnknown_083CA340[0][0],
+ gUnknown_083CA340[0][1],
+ gUnknown_083CA340[0][2],
+ gUnknown_083CA340[0][3]);
+
+ for (i = 0; i < 4; i++)
+ {
+ u16 move = gContestMons[gContestPlayerMonIndex].moves[i];
+ u8 *r5 = sp8;
+
+ if (sContestantStatus[gContestPlayerMonIndex].prevMove != MOVE_NONE
+ && sub_80B214C(gContestPlayerMonIndex)
+ && AreMovesContestCombo(sContestantStatus[gContestPlayerMonIndex].prevMove, move) != 0
+ && sContestantStatus[gContestPlayerMonIndex].unk15_4)
+ {
+ r5 = StringCopy(sp8, gUnknownText_UnknownFormatting2);
+ }
+ else if (move != 0
+ && sContestantStatus[gContestPlayerMonIndex].prevMove == move
+ && gContestMoves[move].effect != CONTEST_EFFECT_REPEATABLE)
+ {
+ // Gray the text because it is a repeated move
+ r5 = StringCopy(sp8, gUnknownText_UnknownFormatting3);
+ }
+ r5 = StringCopy(r5, gMoveNames[move]);
+
+ sub_8002E4C(
+ &gUnknown_03004210,
+ sp8,
+ 776 + i * 20,
+ gUnknown_083CA340[i][0] * 8 + 4,
+ gUnknown_083CA340[i][1] * 8,
+ 1);
+ sub_8002F44(&gUnknown_03004210);
+ }
+
+ sub_814A5C0(0, 0xFFFF, 12, 0x2D9F, 72);
+ sub_80AC0AC(sContest.playerMoveChoice);
+ sub_80AEBEC(gContestMons[gContestPlayerMonIndex].moves[sContest.playerMoveChoice]);
+ gTasks[taskId].func = sub_80ABEA0;
+}
+
+// Handle move selection input
+void sub_80ABEA0(u8 taskId)
+{
+ u8 numMoves = 0;
+ s32 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (gContestMons[gContestPlayerMonIndex].moves[i] != MOVE_NONE)
+ numMoves++;
+ }
+
+ if (gMain.newKeys & A_BUTTON)
+ {
+ DestroyMenuCursor();
+ PlaySE(SE_SELECT);
+ gTasks[taskId].func = sub_80AC0C8;
+ }
+ else
+ {
+ switch (gMain.newAndRepeatedKeys)
+ {
+ case B_BUTTON:
+ sub_814A904();
+ PlaySE(SE_SELECT);
+ sub_80AFFE0(FALSE);
+ FillWindowRect_DefaultPalette(
+ &gUnknown_03004210,
+ 0,
+ gUnknown_083CA340[0][0],
+ gUnknown_083CA340[0][1],
+ gUnknown_083CA340[0][2],
+ gUnknown_083CA340[0][3]);
+ if (!Contest_IsMonsTurnDisabled(gContestPlayerMonIndex))
+ StringCopy(gDisplayedStringBattle, gText_Contest_WhichMoveWillBePlayed);
+ else
+ StringCopy(gDisplayedStringBattle, gText_Contest_ButItCantParticipate);
+ InsertStringDigit(gDisplayedStringBattle, sContest.turnNumber + 1);
+ sub_80AF138();
+ StringExpandPlaceholders(gStringVar4, gDisplayedStringBattle);
+ sub_8003460(&gMenuWindow, gStringVar4, 776, 1, 15);
+ gBattle_BG0_Y = 0;
+ gBattle_BG2_Y = 0;
+ gTasks[taskId].func = sub_80ABC70;
+ break;
+ case DPAD_LEFT:
+ case DPAD_RIGHT:
+ break;
+ case DPAD_UP:
+ nullsub_17(sContest.playerMoveChoice);
+ if (sContest.playerMoveChoice == 0)
+ sContest.playerMoveChoice = numMoves - 1;
+ else
+ sContest.playerMoveChoice--;
+ sub_80AC0AC(sContest.playerMoveChoice);
+ sub_80AED58();
+ sub_80AEBEC(gContestMons[gContestPlayerMonIndex].moves[sContest.playerMoveChoice]);
+ if (numMoves > 1)
+ PlaySE(SE_SELECT);
+ break;
+ case DPAD_DOWN:
+ nullsub_17(sContest.playerMoveChoice);
+ if (sContest.playerMoveChoice == numMoves - 1)
+ sContest.playerMoveChoice = 0;
+ else
+ sContest.playerMoveChoice++;
+ sub_80AC0AC(sContest.playerMoveChoice);
+ sub_80AED58();
+ sub_80AEBEC(gContestMons[gContestPlayerMonIndex].moves[sContest.playerMoveChoice]);
+ if (numMoves > 1)
+ PlaySE(SE_SELECT);
+ break;
+ }
+ }
+}
+
+void sub_80AC0AC(s8 a)
+{
+ sub_814A880(4, 88 + a * 16);
+}
+
+void nullsub_17(s8 a)
+{
+}
+
+void sub_80AC0C8(u8 taskId)
+{
+ if (gIsLinkContest & 1)
+ {
+ u16 var = GetChosenMove(gContestPlayerMonIndex);
+ u8 taskId2;
+
+ sContestantStatus[gContestPlayerMonIndex].currMove = var;
+ taskId2 = CreateTask(sub_80C8A38, 0);
+ SetTaskFuncWithFollowupFunc(taskId2, sub_80C8A38, sub_80AC15C);
+ gTasks[taskId].func = nullsub_89;
+ sub_80AF860();
+ sub_80AFFE0(FALSE);
+ }
+ else
+ {
+ sub_80AF1B8();
+ gTasks[taskId].func = sub_80AC188;
+ }
+}
+
+void sub_80AC15C(u8 taskId)
+{
+ DestroyTask(taskId);
+ gTasks[sContest.mainTaskId].func = sub_80AC188;
+}
+
+void sub_80AC188(u8 taskId)
+{
+ sub_80AF138();
+ gBattle_BG0_Y = 0;
+ gBattle_BG2_Y = 0;
+ sub_80AFFE0(FALSE);
+ DmaCopy32Defvars(3, gPlttBufferFaded, shared18000.unk18604, 0x400);
+ LoadPalette(shared18000.unk18204, 0, 0x400);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].func = sub_80AC204;
+}
+
+void sub_80AC204(u8 taskId)
+{
+ if (++gTasks[taskId].data[0] > 2)
+ {
+ gTasks[taskId].data[0] = 0;
+ if (++gTasks[taskId].data[1] == 2)
+ {
+ sub_80B1BDC();
+ sub_80B25E4(1);
+ gTasks[taskId].func = sub_80AC250;
+ }
+ }
+}
+
+void sub_80AC250(u8 taskId)
+{
+ if (!sContest.unk1920A_6 && !sContest.unk1920B_1)
+ gTasks[taskId].func = sub_80AC284;
+}
+
+void sub_80AC284(u8 taskId)
+{
+ if (++gTasks[taskId].data[0] > 19)
+ {
+ sContest.unk19214 = 0;
+ sContest.unk1921C = gRngValue;
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_80AC2CC;
+ }
+}
+
+void sub_80AC2CC(u8 taskId)
+{
+ u8 spriteId;
+ s32 i;
+ u8 r7 = sContest.unk19215;
+ s8 r4;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ sub_80B0D7C();
+ for (i = 0; sContest.unk19214 != shared192D0.unk0[i]; i++)
+ ;
+ sContest.unk19215 = i;
+ r7 = sContest.unk19215;
+ if (gIsLinkContest & 1)
+ {
+ u8 taskId2;
+
+ sContest.unk1920B_2 = 1;
+ if (sub_80AE074())
+ sub_80B114C(sContest.unk19215);
+ taskId2 = CreateTask(sub_80C8C80, 0);
+ SetTaskFuncWithFollowupFunc(taskId2, sub_80C8C80, sub_80AD8DC);
+ sub_80AF860();
+ gTasks[taskId].data[0] = 1;
+ }
+ else
+ {
+ sub_80B114C(sContest.unk19215);
+ gTasks[taskId].data[0] = 2;
+ }
+ return;
+ case 1:
+ if (!sContest.unk1920B_2)
+ gTasks[taskId].data[0] = 2;
+ return;
+ case 2:
+ if (sContestantStatus[r7].unkC_1 != 0
+ || sContestantStatus[r7].unkB_7)
+ {
+ gTasks[taskId].data[0] = 31;
+ }
+ else
+ {
+ sub_80AF138();
+ sub_80B0CDC(r7, 0);
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[0] = 3;
+ }
+ return;
+ case 3:
+ for (i = 0; i < 4; i++)
+ gBattleMonForms[i] = 0;
+ memset(&shared19348, 0, sizeof(shared19348));
+ sub_80B28F0(sContest.unk19215);
+ spriteId = sub_80AE9FC(
+ gContestMons[sContest.unk19215].species,
+ gContestMons[sContest.unk19215].otId,
+ gContestMons[sContest.unk19215].personality);
+ gSprites[spriteId].pos2.x = 120;
+ gSprites[spriteId].callback = sub_80AD8FC;
+ gTasks[taskId].data[2] = spriteId;
+ gObjectBankIDs[gBankAttacker] = spriteId;
+ sub_80B0BC4(sub_80B09E4(sContest.unk19215), FALSE);
+ gTasks[taskId].data[0] = 4;
+ return;
+ case 4:
+ spriteId = gTasks[taskId].data[2];
+ if (gSprites[spriteId].callback == SpriteCallbackDummy)
+ {
+ if (!shared19338[r7].unk2_1)
+ gTasks[taskId].data[0] = 5;
+ }
+ return;
+ case 5:
+ if (sContestantStatus[r7].unkC_0)
+ {
+ gTasks[taskId].data[0] = 33;
+ }
+ else
+ {
+ sub_80AF138();
+ StringCopy(gStringVar1, gContestMons[r7].nickname);
+ if (sContestantStatus[r7].currMove < NUM_MOVES)
+ StringCopy(gStringVar2, gMoveNames[sContestantStatus[r7].currMove]);
+ else
+ StringCopy(gStringVar2, gUnknown_083CC330[sContestantStatus[r7].moveCategory]);
+ StringExpandPlaceholders(gStringVar4, gUnknown_083CAFD7);
+ sub_8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15);
+ gTasks[taskId].data[0] = 6;
+ }
+ return;
+ case 6:
+ if (sub_80037A0(&gMenuWindow) != 0)
+ {
+ sContest.unk1925E = 0;
+ gTasks[taskId].data[0] = 7;
+ }
+ return;
+ case 7:
+ {
+ u16 move = SanitizeMove(sContestantStatus[sContest.unk19215].currMove);
+
+ sub_80B2790(sContest.unk19215);
+ sub_80B28F0(sContest.unk19215);
+ SelectContestMoveBankTarget(move);
+ DoMoveAnim(move);
+ gTasks[taskId].data[0] = 8;
+ }
+ return;
+ case 8:
+ gAnimScriptCallback();
+ if (!gAnimScriptActive)
+ {
+ sub_80B28CC(r7);
+ if (sContest.unk1925E != 0)
+ {
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[0] = 9;
+ }
+ else
+ {
+ if (!sContestantStatus[r7].unk15_4)
+ sub_80B03A8(r7);
+ sub_80B20C4();
+ gTasks[taskId].data[0] = 23;
+ }
+ }
+ return;
+ case 9:
+ if (gTasks[taskId].data[10]++ > 30)
+ {
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[0] = 7;
+ }
+ return;
+ case 23:
+ gTasks[taskId].data[1] = 0;
+ if (sContestantStatus[r7].unk13 != 0xFF)
+ {
+ sub_80B146C(r7, sContestantStatus[r7].unk13);
+ sContestantStatus[r7].unk13 = 0xFF;
+ gTasks[taskId].data[0] = 24;
+ }
+ else
+ {
+ if (sContestantStatus[r7].unk14 != 0xFF)
+ {
+ for (i = 0; i < 4; i++)
+ {
+ if (i != r7 && sContestantStatus[i].unk13 != 0xFF)
+ break;
+ }
+ if (i == 4)
+ {
+ sub_80B146C(r7, sContestantStatus[r7].unk14);
+ sContestantStatus[r7].unk14 = 0xFF;
+ gTasks[taskId].data[0] = 24;
+ }
+ else
+ {
+ gTasks[taskId].data[0] = 48;
+ }
+ }
+ else
+ {
+ gTasks[taskId].data[0] = 48;
+ }
+ }
+ return;
+ case 24:
+ if (sub_80037A0(&gMenuWindow) != 0)
+ gTasks[taskId].data[0] = 23;
+ return;
+ case 48:
+ if (sContestantStatus[r7].unk11_0 == 1)
+ {
+ sub_80B1710(5);
+ }
+ else if (sContestantStatus[r7].unk11_0 == 2)
+ {
+ sub_80B1710(6);
+ }
+ else if (sContestantStatus[r7].unk11_0 == 3)
+ {
+ sub_80B1710(7);
+ }
+ else
+ {
+ gTasks[taskId].data[0] = 47;
+ return;
+ }
+ gTasks[taskId].data[0] = 49;
+ return;
+ case 49:
+ if (!sContest.unk1920A_4)
+ gTasks[taskId].data[0] = 47;
+ return;
+ case 47:
+ sub_80B1FD0(TRUE);
+ gTasks[taskId].data[0] = 12;
+ return;
+ case 12:
+ sub_80AFBA0(0, sContestantStatus[r7].appeal2, r7);
+ gTasks[taskId].data[0] = 13;
+ return;
+ case 13:
+ if (!shared19338[sContest.unk19215].unk2_2)
+ gTasks[taskId].data[0] = 35;
+ return;
+ case 35:
+ if (sContestantStatus[r7].unk10_4 == 1)
+ sub_80B1710(8);
+ gTasks[taskId].data[0] = 36;
+ return;
+ case 36:
+ if (!sContest.unk1920A_4)
+ gTasks[taskId].data[0] = 37;
+ return;
+ case 37:
+ if (sub_80AEE54(r7, 1))
+ {
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[0] = 38;
+ }
+ else
+ {
+ gTasks[taskId].data[0] = 50;
+ }
+ return;
+ case 38:
+ if (++gTasks[taskId].data[10] > 20)
+ {
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[0] = 50;
+ }
+ return;
+ case 50:
+ if (sub_80AF038(r7))
+ PlaySE(SE_C_PASI);
+ gTasks[taskId].data[0] = 25;
+ return;
+ case 25:
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[0] = 26;
+ return;
+ case 26:
+ {
+ s32 r2 = 0;
+
+ r4 = 0;
+ for (i = gTasks[taskId].data[1]; i < 4; i++)
+ {
+ r4 = 0;
+ for (r2 = 0; r2 < 4; r2++)
+ {
+ if (r2 != r7 && gUnknown_02038696[r2] == i
+ && sContestantStatus[r2].unk13 != 0xFF)
+ {
+ r4 = 1;
+ break;
+ }
+ }
+ if (r4 != 0)
+ break;
+ }
+ if (r4)
+ {
+ gTasks[taskId].data[1] = gUnknown_02038696[r2];
+ sub_80B146C(r2, sContestantStatus[r2].unk13);
+ sContestantStatus[r2].unk13 = 0xFF;
+ gTasks[taskId].data[0] = 27;
+ }
+ else
+ {
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[0] = 51;
+ sub_80AF120();
+ }
+ }
+ return;
+ case 27:
+ if (sub_80037A0(&gMenuWindow) != 0)
+ gTasks[taskId].data[0] = 28;
+ return;
+ case 28:
+ for (i = 0; gTasks[taskId].data[1] != gUnknown_02038696[i]; i++)
+ ;
+ sub_80AFBA0(sContestantStatus[i].appeal2 + sContestantStatus[i].unkE, -sContestantStatus[i].unkE, i);
+ gTasks[taskId].data[0] = 29;
+ return;
+ case 29:
+ for (i = 0; gTasks[taskId].data[1] != gUnknown_02038696[i]; i++)
+ ;
+ if (!shared19338[i].unk2_2)
+ gTasks[taskId].data[0] = 39;
+ return;
+ case 39:
+ for (i = 0; gTasks[taskId].data[1] != gUnknown_02038696[i]; i++)
+ ;
+ if (sub_80AEE54(i, 1))
+ {
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[0] = 40;
+ }
+ else
+ {
+ gTasks[taskId].data[0] = 30;
+ }
+ return;
+ case 40:
+ if (++gTasks[taskId].data[10] > 20)
+ {
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[0] = 30;
+ }
+ return;
+ case 30:
+ for (i = 0; i < 4; i++)
+ {
+ if (gUnknown_02038696[i] == gTasks[taskId].data[1])
+ break;
+ }
+ if (sub_80AF038(i))
+ PlaySE(SE_C_PASI);
+ else
+ PlaySE(SE_C_SYU);
+ if (sContestantStatus[i].unk15_5)
+ {
+ sub_80B03A8(i);
+ sContestantStatus[i].unk15_5 = 0;
+ }
+ gTasks[taskId].data[1]++;
+ gTasks[taskId].data[0] = 26;
+ return;
+ case 51:
+ if (gTasks[taskId].data[10]++ > 9)
+ {
+ gTasks[taskId].data[10] = 0;
+ if (sContestantStatus[r7].unkC_1 != 0
+ || sContestantStatus[r7].unk11_2)
+ {
+ sub_80AF138();
+ StringCopy(gStringVar1, gContestMons[r7].nickname);
+ StringExpandPlaceholders(gStringVar4, ContestString_CantAppealNextTurn);
+ sub_8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15);
+ }
+ gTasks[taskId].data[0] = 52;
+ }
+ return;
+ case 52:
+ if (sub_80037A0(&gMenuWindow) != 0)
+ {
+ if (!sContestantStatus[r7].unk15_6)
+ gTasks[taskId].data[0] = 17;
+ else
+ gTasks[taskId].data[0] = 14;
+ }
+ return;
+ case 14:
+ r4 = sContestantStatus[r7].unk16;
+ if (sContestantStatus[r7].unk16 != 0)
+ {
+ sub_80AF138();
+ if (r4 == 1)
+ sub_8002EB0(&gMenuWindow, ContestString_WentOverWell, 776, 1, 15);
+ else if (r4 == 2)
+ sub_8002EB0(&gMenuWindow, ContestString_WentOverVeryWell, 776, 1, 15);
+ else
+ sub_8002EB0(&gMenuWindow, ContestString_AppealComboExcellently, 776, 1, 15);
+ sub_80B1710(3);
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[0] = 45;
+ }
+ else
+ {
+ sub_80AF138();
+ StringCopy(gStringVar1, gContestMons[r7].nickname);
+ StringExpandPlaceholders(gStringVar4, ContestString_JudgeExpectantly2);
+ sub_8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15);
+ sub_80B1710(2);
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[0] = 45;
+ }
+ return;
+ case 45:
+ if (!sContest.unk1920A_4)
+ {
+ sub_80B09B0(sContest.unk19215);
+ gTasks[taskId].data[0] = 15;
+ }
+ return;
+ case 15:
+ if (sub_80037A0(&gMenuWindow) != 0)
+ {
+ if (++gTasks[taskId].data[10] > 50)
+ {
+ if (!sContestantStatus[r7].unk15_4)
+ {
+ sub_80AFBA0(
+ sContestantStatus[r7].appeal2,
+ sContestantStatus[r7].unk17,
+ r7);
+ sContestantStatus[r7].appeal2 += sContestantStatus[r7].unk17;
+ }
+ gTasks[taskId].data[0] = 16;
+ }
+ }
+ return;
+ case 16:
+ if (!shared19338[r7].unk2_2)
+ {
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[0] = 17;
+ }
+ return;
+ case 17:
+ if (sContestantStatus[r7].disappointedRepeat)
+ {
+ sub_80AF138();
+ StringCopy(gStringVar1, gContestMons[r7].nickname);
+ StringExpandPlaceholders(gStringVar4, ContestString_DissapointedRepeat);
+ sub_8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15);
+ gTasks[taskId].data[10] = 0;
+ sub_80B1710(0);
+ gTasks[taskId].data[0] = 46;
+ }
+ else
+ {
+ gTasks[taskId].data[0] = 41;
+ }
+ return;
+ case 46:
+ if (!sContest.unk1920A_4)
+ gTasks[taskId].data[0] = 19;
+ return;
+ case 19:
+ if (sub_80037A0(&gMenuWindow) != 0)
+ {
+ sub_80AFBA0(sContestantStatus[r7].appeal2, -sContestantStatus[r7].unk18, r7);
+ sContestantStatus[r7].appeal2 -= sContestantStatus[r7].unk18;
+ gTasks[taskId].data[0] = 18;
+ }
+ return;
+ case 18:
+ sub_80B0D7C();
+ if (!shared19338[r7].unk2_2)
+ {
+ gTasks[taskId].data[10] = 0;
+ sub_80AF138();
+ gTasks[taskId].data[0] = 41;
+ }
+ return;
+ case 41:
+ if (shared19328.bits_8 && r7 != shared19328.bits_9)
+ {
+ gTasks[taskId].data[0] = 57;
+ }
+ else
+ {
+ r4 = shared19328.bits_0;
+ if (sContestantStatus[r7].unk11_4)
+ {
+ r4 = 1;
+ StringCopy(gStringVar3, gMoveNames[sContestantStatus[r7].currMove]);
+ }
+ else
+ {
+ StringCopy(gStringVar3, gContestCategoryStrings[gContestMoves[sContestantStatus[r7].currMove].contestCategory]);
+ }
+ if (r4 > 0)
+ {
+ if (sContestantStatus[r7].disappointedRepeat)
+ r4 = 0;
+ }
+ sub_80AF138();
+ StringCopy(gStringVar1, gContestMons[r7].nickname);
+ sContest.applauseLevel += r4;
+ if (sContest.applauseLevel < 0)
+ sContest.applauseLevel = 0;
+ if (r4 == 0)
+ {
+ gTasks[taskId].data[0] = 55;
+ }
+ else
+ {
+ if (r4 < 0)
+ StringExpandPlaceholders(gStringVar4, ContestString_DidntGoWell);
+ else if (r4 > 0 && sContest.applauseLevel <= 4)
+ StringExpandPlaceholders(gStringVar4, ContestString_WentOverGreat);
+ else
+ StringExpandPlaceholders(gStringVar4, ContestString_GotCrowdGoing);
+ sub_8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15);
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[11] = 0;
+ if (r4 < 0)
+ gTasks[taskId].data[0] = 53;
+ else
+ gTasks[taskId].data[0] = 54;
+ }
+ }
+ return;
+ case 53:
+ switch (gTasks[taskId].data[10])
+ {
+ case 0:
+ sub_80B1EA8(-1, 1);
+ PlayFanfare(BGM_ME_ZANNEN);
+ gTasks[taskId].data[10]++;
+ break;
+ case 1:
+ if (!sContest.unk1920B_0 && sub_80037A0(&gMenuWindow) != 0)
+ {
+ sub_80B1CBC(-1);
+ gTasks[taskId].data[10]++;
+ }
+ break;
+ case 2:
+ if (!sContest.unk1920A_5)
+ {
+ if (gTasks[taskId].data[11]++ > 29)
+ {
+ gTasks[taskId].data[11] = 0;
+ sub_80B1EA8(-1, -1);
+ gTasks[taskId].data[10]++;
+ }
+ }
+ break;
+ case 3:
+ if (!gPaletteFade.active)
+ {
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[11] = 0;
+ gTasks[taskId].data[0] = 43;
+ }
+ break;
+ }
+ return;
+ case 54:
+ switch (gTasks[taskId].data[10])
+ {
+ case 0:
+ if (sub_80037A0(&gMenuWindow) != 0)
+ {
+ sub_80B1EA8(1, 1);
+ gTasks[taskId].data[10]++;
+ }
+ break;
+ case 1:
+ if (!sContest.unk1920B_0)
+ {
+ sub_80B1DDC();
+ PlaySE(SE_W227B);
+ sub_80B1CBC(1);
+ gTasks[taskId].data[10]++;
+ }
+ break;
+ case 2:
+ if (!sContest.unk1920A_5)
+ {
+ if (gTasks[taskId].data[11]++ > 29)
+ {
+ gTasks[taskId].data[11] = 0;
+ sub_80AFBA0(sContestantStatus[r7].appeal2, shared19328.unk2, r7);
+ sContestantStatus[r7].appeal2 += shared19328.unk2;
+ gTasks[taskId].data[10]++;
+ }
+ }
+ break;
+ case 3:
+ if (!shared19338[r7].unk2_2)
+ {
+ if (!sContest.unk1920A_7)
+ {
+ sub_80B1EA8(1, -1);
+ gTasks[taskId].data[10]++;
+ }
+ }
+ break;
+ case 4:
+ if (!gPaletteFade.active)
+ {
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[11] = 0;
+ gTasks[taskId].data[0] = 43;
+ }
+ break;
+ }
+ return;
+ case 43:
+ if (!shared19338[r7].unk2_2)
+ {
+ sub_80AF138();
+ gTasks[taskId].data[0] = 55;
+ }
+ return;
+ case 57:
+ sub_80AF138();
+ StringCopy(gStringVar3, gContestMons[shared19328.bits_9].nickname);
+ StringCopy(gStringVar1, gContestMons[r7].nickname);
+ StringCopy(gStringVar2, gMoveNames[sContestantStatus[r7].currMove]);
+ StringExpandPlaceholders(gStringVar4, ContestString_CrowdWatches);
+ sub_8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15);
+ gTasks[taskId].data[0] = 58;
+ return;
+ case 58:
+ if (sub_80037A0(&gMenuWindow) != 0)
+ {
+ sub_80AF138();
+ StringExpandPlaceholders(gStringVar4, ContestString_Ignored2);
+ sub_8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15);
+ gTasks[taskId].data[0] = 59;
+ }
+ return;
+ case 59:
+ if (sub_80037A0(&gMenuWindow) != 0)
+ {
+ sub_80AF138();
+ gTasks[taskId].data[0] = 55;
+ }
+ return;
+ case 33:
+ if (sContestantStatus[r7].unk15_4)
+ sContestantStatus[r7].unk15_4 = 0;
+ sub_80B09B0(r7);
+ StringCopy(gStringVar1, gContestMons[r7].nickname);
+ StringCopy(gStringVar2, gMoveNames[sContestantStatus[r7].currMove]);
+ StringExpandPlaceholders(gStringVar4, gUnknown_083CBF60);
+ sub_8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15);
+ gTasks[taskId].data[0] = 34;
+ return;
+ case 34:
+ if (sub_80037A0(&gMenuWindow) != 0)
+ gTasks[taskId].data[0] = 55;
+ return;
+ case 55:
+ sub_80B1BDC();
+ gTasks[taskId].data[0] = 56;
+ return;
+ case 56:
+ if (!sContest.unk1920A_6)
+ {
+ if (sContest.applauseLevel > 4)
+ {
+ sContest.applauseLevel = 0;
+ sub_80B1928();
+ }
+ gTasks[taskId].data[0] = 10;
+ }
+ return;
+ case 10:
+ spriteId = gTasks[taskId].data[2];
+ gSprites[spriteId].callback = sub_80AD92C;
+ gTasks[taskId].data[0] = 11;
+ return;
+ case 11:
+ spriteId = gTasks[taskId].data[2];
+ if (gSprites[spriteId].invisible)
+ {
+ FreeSpriteOamMatrix(&gSprites[spriteId]);
+ DestroySprite(&gSprites[spriteId]);
+ gTasks[taskId].data[0] = 20;
+ }
+ return;
+ case 20:
+ for (i = 0; i < 4; i++)
+ sub_80B0CDC(i, 1);
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[0] = 21;
+ return;
+ case 31:
+ sub_80AF138();
+ StringCopy(gStringVar1, gContestMons[r7].nickname);
+ StringExpandPlaceholders(gStringVar4, gUnknown_083CB00D);
+ sub_8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15);
+ gTasks[taskId].data[0] = 32;
+ return;
+ case 32:
+ if (sub_80037A0(&gMenuWindow) != 0)
+ gTasks[taskId].data[0] = 21;
+ return;
+ case 21:
+ if (++gTasks[taskId].data[10] > 29)
+ {
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[0] = 22;
+ }
+ return;
+ case 22:
+ if (++sContest.unk19214 == 4)
+ {
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].func = sub_80AD960;
+ }
+ else
+ {
+ gTasks[taskId].data[0] = 0;
+ }
+ nullsub_18(0);
+ return;
+ }
+}
+
+void sub_80AD8DC(u8 taskId)
+{
+ sContest.unk1920B_2 = 0;
+ DestroyTask(taskId);
+}
+
+void sub_80AD8FC(struct Sprite *sprite)
+{
+ if (sprite->pos2.x != 0)
+ {
+ sprite->pos2.x -= 2;
+ }
+ else
+ {
+ if (++sprite->data[0] == 31)
+ {
+ sprite->data[0] = 0;
+ sprite->callback = SpriteCallbackDummy;
+ }
+ }
+}
+
+void sub_80AD92C(struct Sprite *sprite)
+{
+ sprite->pos2.x -= 6;
+ if (sprite->pos1.x + sprite->pos2.x < -32)
+ {
+ sprite->callback = SpriteCallbackDummy;
+ sprite->invisible = TRUE;
+ }
+}
+
+void sub_80AD960(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (gIsLinkContest & 1)
+ {
+ u8 taskId2;
+
+ sContest.unk1920B_2 = 1;
+ if (sub_80AE074())
+ {
+ sub_80AF2FC();
+ sub_80AF3C0();
+ }
+ taskId2 = CreateTask(sub_80C8C80, 0);
+ SetTaskFuncWithFollowupFunc(taskId2, sub_80C8C80, sub_80AD8DC);
+ sub_80AF860();
+ gTasks[taskId].data[0] = 1;
+ }
+ else
+ {
+ sub_80AF2FC();
+ sub_80AF3C0();
+ gTasks[taskId].data[0] = 2;
+ }
+ break;
+ case 1:
+ if (!sContest.unk1920B_2)
+ gTasks[taskId].data[0] = 2;
+ break;
+ case 2:
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_80ADA1C;
+ break;
+ }
+}
+
+void sub_80ADA1C(u8 taskId)
+{
+ sub_80B1FD0(FALSE);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].func = sub_80ADA4C;
+}
+
+void sub_80ADA4C(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (++gTasks[taskId].data[1] > 20)
+ {
+ sub_80B25E4(2);
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 1:
+ if (!sContest.unk1920B_1)
+ {
+ if (++gTasks[taskId].data[1] > 20)
+ {
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[0]++;
+ }
+ }
+ break;
+ case 2:
+ sub_80AFF10();
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].func = sub_80ADAD8;
+ break;
+ }
+}
+
+void sub_80ADAD8(u8 taskId)
+{
+ if (sub_80AFF28())
+ gTasks[taskId].func = sub_80ADB04;
+}
+
+void sub_80ADB04(u8 taskId)
+{
+ DmaCopy32Defvars(3, shared18000.unk18204, gPlttBufferUnfaded, 0x400);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = 2;
+ gTasks[taskId].func = sub_80ADB48;
+}
+
+void sub_80ADB48(u8 taskId)
+{
+ if (++gTasks[taskId].data[0] > 2)
+ {
+ gTasks[taskId].data[0] = 0;
+ if (--gTasks[taskId].data[1] == 0)
+ gTasks[taskId].func = sub_80ADB88;
+ }
+}
+
+void sub_80ADB88(u8 taskId)
+{
+ u8 r4 = sContestantStatus[gContestPlayerMonIndex].attentionLevel;
+
+ sub_80AF138();
+ StringCopy(gStringVar1, gContestMons[gContestPlayerMonIndex].nickname);
+ StringExpandPlaceholders(gStringVar4, gContestStandOutStrings[r4]);
+ sub_8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15);
+ gTasks[taskId].func = sub_80ADC10;
+}
+
+void sub_80ADC10(u8 taskId)
+{
+ if (sub_80037A0(&gMenuWindow) == 1)
+ {
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_80ADC4C;
+ sub_80B0D7C();
+ }
+}
+
+void sub_80ADC4C(u8 taskId)
+{
+ if (gTasks[taskId].data[0]++ > 29)
+ {
+ gTasks[taskId].data[0] = 0;
+ sub_80AFF10();
+ gTasks[taskId].func = sub_80ADC84;
+ }
+}
+
+void sub_80ADC84(u8 taskId)
+{
+ if (sub_80AFF28())
+ {
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_80ADCB4;
+ }
+}
+
+void sub_80ADCB4(u8 taskId)
+{
+ sub_80B2184();
+ gTasks[taskId].func = sub_80B237C;
+}
+
+void sub_80ADCDC(u8 taskId)
+{
+ sub_80B2280();
+ gTasks[taskId].func = sub_80ADD04;
+}
+
+void sub_80ADD04(u8 taskId)
+{
+ REG_BG0CNT_BITFIELD.priority = 0;
+ REG_BG2CNT_BITFIELD.priority = 0;
+ if (++sContest.turnNumber == 5)
+ {
+ gTasks[taskId].func = sub_80ADDA4;
+ }
+ else
+ {
+ sub_80B1B14();
+ gTasks[taskId].func = sub_80ADD74;
+ }
+}
+
+void sub_80ADD74(u8 taskId)
+{
+ if (!sContest.unk1920A_6)
+ gTasks[taskId].func = sub_80ABB70;
+}
+
+void sub_80ADDA4(u8 taskId)
+{
+ s32 i;
+
+ gBattle_BG0_Y = 0;
+ gBattle_BG2_Y = 0;
+ for (i = 0; i < 4; i++)
+ gUnknown_02038680[i] = sContestantStatus[i].unk4;
+ sub_80AF668();
+ sub_80AF138();
+ sub_80BE23C(sContestantStatus[gContestPlayerMonIndex].prevMove);
+ gUnknown_03005D28 = gRngValue;
+ StringExpandPlaceholders(gStringVar4, gUnknown_083CB02C);
+ sub_8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15);
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].func = sub_80ADE54;
+}
+
+void sub_80ADE54(u8 taskId)
+{
+ if (sub_80037A0(&gMenuWindow) == 1)
+ {
+ sub_80B2184();
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 160;
+ PlaySE12WithPanning(SE_C_MAKU_D, 0);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_80ADEAC;
+ }
+}
+
+void sub_80ADEAC(u8 taskId)
+{
+ gBattle_BG1_Y -= 7;
+ if (gBattle_BG1_Y < 0)
+ gBattle_BG1_Y = 0;
+ if (*(u16 *)&gBattle_BG1_Y == 0) // Why cast?
+ {
+ gTasks[taskId].func = sub_80ADEEC;
+ gTasks[taskId].data[0] = 0;
+ }
+}
+
+void sub_80ADEEC(u8 taskId)
+{
+ if (gTasks[taskId].data[0]++ >= 50)
+ {
+ gTasks[taskId].data[0] = 0;
+ if (gIsLinkContest & 1)
+ {
+ gTasks[taskId].func = sub_80ADF4C;
+ }
+ else
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ gTasks[taskId].func = sub_80ADFD8;
+ }
+ }
+}
+
+void sub_80ADF4C(u8 taskId)
+{
+ u8 taskId2 = CreateTask(sub_80C8AD0, 0);
+
+ SetTaskFuncWithFollowupFunc(taskId2, sub_80C8AD0, sub_80ADF98);
+ gTasks[taskId].func = nullsub_89;
+ sub_80AF860();
+ sub_80AFFE0(FALSE);
+}
+
+void sub_80ADF98(u8 taskId)
+{
+ DestroyTask(taskId);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ gTasks[sContest.mainTaskId].func = sub_80ADFD8;
+}
+
+void sub_80ADFD8(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ DestroyTask(taskId);
+ gFieldCallback = sub_80AE010;
+ SetMainCallback2(c2_exit_to_overworld_2_switch);
+ }
+}
+
+void sub_80AE010(void)
+{
+ // Why disable and re-enable again?
+ ScriptContext2_Disable();
+ EnableBothScriptContexts();
+}
+
+// Expands a one-digit number in the string
+void InsertStringDigit(u8 *str, s32 n)
+{
+ while (1)
+ {
+ if (*str == EOS)
+ break;
+ // Find the EXT_CTRL_CODE_BEGIN, 0 sequence, and place the number there
+ if (*str == EXT_CTRL_CODE_BEGIN && *(str + 1) == 0)
+ {
+ u8 *end;
+
+ end = ConvertIntToDecimalStringN(str, n, STR_CONV_MODE_LEFT_ALIGN, 1);
+ *end = EOS; // ConvertIntToDecimalStringN already does this.
+ StringAppend(end, str + 2); // Shift the rest of the string over.
+ break;
+ }
+ str++;
+ }
+}
+
+void sub_80AE054(void)
+{
+ if (!(gIsLinkContest & 1))
+ gContestPlayerMonIndex = 3;
+}
+
+bool8 sub_80AE074(void)
+{
+ if (gContestPlayerMonIndex == gUnknown_0203869B)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void Contest_CreatePlayerMon(u8 partyIndex)
+{
+ u8 name[20];
+ u16 heldItem;
+ s16 cool;
+ s16 beauty;
+ s16 cute;
+ s16 smart;
+ s16 tough;
+
+ StringCopy(name, gSaveBlock2.playerName);
+ StripExtCtrlCodes(name);
+ if (gIsLinkContest & 1)
+ {
+ u8 temp = name[5];
+
+ name[5] = EOS;
+ name[7] = temp;
+ }
+ memcpy(gContestMons[gContestPlayerMonIndex].trainerName, name, 8);
+ if (gSaveBlock2.playerGender == MALE)
+ gContestMons[gContestPlayerMonIndex].trainerGfxId = MAP_OBJ_GFX_LINK_BRENDAN;
+ else
+ gContestMons[gContestPlayerMonIndex].trainerGfxId = MAP_OBJ_GFX_LINK_MAY;
+ gContestMons[gContestPlayerMonIndex].flags = 0;
+ gContestMons[gContestPlayerMonIndex].unk2C = 0;
+ gContestMons[gContestPlayerMonIndex].species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES);
+ GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, name);
+ StringGetEnd10(name);
+ if (gIsLinkContest & 1)
+ {
+ StripExtCtrlCodes(name);
+ if (GetMonData(&gPlayerParty[partyIndex], MON_DATA_LANGUAGE) == LANGUAGE_JAPANESE)
+ {
+ name[5] = EOS;
+ name[10] = EXT_CTRL_CODE_BEGIN;
+ }
+ else
+ {
+ u8 temp = name[5];
+
+ name[5] = EOS;
+ name[10] = temp;
+ }
+ }
+ memcpy(gContestMons[gContestPlayerMonIndex].nickname, name, 11);
+ gContestMons[gContestPlayerMonIndex].cool = GetMonData(&gPlayerParty[partyIndex], MON_DATA_COOL);
+ gContestMons[gContestPlayerMonIndex].beauty = GetMonData(&gPlayerParty[partyIndex], MON_DATA_BEAUTY);
+ gContestMons[gContestPlayerMonIndex].cute = GetMonData(&gPlayerParty[partyIndex], MON_DATA_CUTE);
+ gContestMons[gContestPlayerMonIndex].smart = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SMART);
+ gContestMons[gContestPlayerMonIndex].tough = GetMonData(&gPlayerParty[partyIndex], MON_DATA_TOUGH);
+ gContestMons[gContestPlayerMonIndex].sheen = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SHEEN);
+ gContestMons[gContestPlayerMonIndex].moves[0] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MOVE1);
+ gContestMons[gContestPlayerMonIndex].moves[1] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MOVE2);
+ gContestMons[gContestPlayerMonIndex].moves[2] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MOVE3);
+ gContestMons[gContestPlayerMonIndex].moves[3] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MOVE4);
+ gContestMons[gContestPlayerMonIndex].personality = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PERSONALITY);
+ gContestMons[gContestPlayerMonIndex].otId = GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_ID);
+
+ heldItem = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HELD_ITEM);
+ cool = gContestMons[gContestPlayerMonIndex].cool;
+ beauty = gContestMons[gContestPlayerMonIndex].beauty;
+ cute = gContestMons[gContestPlayerMonIndex].cute;
+ smart = gContestMons[gContestPlayerMonIndex].smart;
+ tough = gContestMons[gContestPlayerMonIndex].tough;
+ if (heldItem == ITEM_RED_SCARF)
+ cool += 20;
+ else if (heldItem == ITEM_BLUE_SCARF)
+ beauty += 20;
+ else if (heldItem == ITEM_PINK_SCARF)
+ cute += 20;
+ else if (heldItem == ITEM_GREEN_SCARF)
+ smart += 20;
+ else if (heldItem == ITEM_YELLOW_SCARF)
+ tough += 20;
+ if (cool > 255)
+ cool = 255;
+ if (beauty > 255)
+ beauty = 255;
+ if (cute > 255)
+ cute = 255;
+ if (smart > 255)
+ smart = 255;
+ if (tough > 255)
+ tough = 255;
+ gContestMons[gContestPlayerMonIndex].cool = cool;
+ gContestMons[gContestPlayerMonIndex].beauty = beauty;
+ gContestMons[gContestPlayerMonIndex].cute = cute;
+ gContestMons[gContestPlayerMonIndex].smart = smart;
+ gContestMons[gContestPlayerMonIndex].tough = tough;
+}
+
+void Contest_InitAllPokemon(u8 a, u8 b)
+{
+ s32 i;
+ u8 opponentsCount = 0;
+ u8 opponents[64];
+
+ sub_80AE054();
+
+ // Find all suitable opponents
+ for (i = 0; i < 60; i++)
+ {
+ if (b == gContestOpponents[i].unk1C_0)
+ {
+ if (a == 0 && gContestOpponents[i].unk1C_2)
+ opponents[opponentsCount++] = i;
+ else if (a == 1 && gContestOpponents[i].unk1C_3)
+ opponents[opponentsCount++] = i;
+ else if (a == 2 && gContestOpponents[i].unk1C_4)
+ opponents[opponentsCount++] = i;
+ else if (a == 3 && gContestOpponents[i].unk1C_5)
+ opponents[opponentsCount++] = i;
+ else if (a == 4 && gContestOpponents[i].unk1C_6)
+ opponents[opponentsCount++] = i;
+ }
+ }
+ opponents[opponentsCount] = 0xFF;
+
+ // Choose three random opponents from the list
+ for (i = 0; i < 3; i++)
+ {
+ u16 rnd = Random() % opponentsCount;
+ s32 j;
+
+ gContestMons[i] = gContestOpponents[opponents[rnd]];
+ for (j = rnd; opponents[j] != 0xFF; j++)
+ opponents[j] = opponents[j + 1];
+ opponentsCount--;
+ }
+
+#ifndef NONMATCHING
+ // Compiler, please put i in r5. Thanks.
+ asm(""::"r"(i));
+ asm(""::"r"(i));
+ asm(""::"r"(i));
+ asm(""::"r"(i));
+ asm(""::"r"(i));
+#endif
+
+ Contest_CreatePlayerMon(gUnknown_02038694);
+}
+
+// GetContestAvailability?
+u8 sub_80AE47C(struct Pokemon *pkmn)
+{
+ u8 ribbon;
+ u8 retVal;
+
+ if (GetMonData(pkmn, MON_DATA_IS_EGG))
+ return 3;
+ if (GetMonData(pkmn, MON_DATA_HP) == 0)
+ return 4;
+ switch (gSpecialVar_ContestCategory)
+ {
+ case CONTEST_CATEGORY_COOL:
+ ribbon = GetMonData(pkmn, MON_DATA_COOL_RIBBON);
+ break;
+ case CONTEST_CATEGORY_BEAUTY:
+ ribbon = GetMonData(pkmn, MON_DATA_BEAUTY_RIBBON);
+ break;
+ case CONTEST_CATEGORY_CUTE:
+ ribbon = GetMonData(pkmn, MON_DATA_CUTE_RIBBON);
+ break;
+ case CONTEST_CATEGORY_SMART:
+ ribbon = GetMonData(pkmn, MON_DATA_SMART_RIBBON);
+ break;
+ case CONTEST_CATEGORY_TOUGH:
+ ribbon = GetMonData(pkmn, MON_DATA_TOUGH_RIBBON);
+ break;
+ default:
+ return 0;
+ }
+
+ // Couldn't get this to match any other way.
+ // Returns 2, 1, or 0 respectively if ribbon's rank is above, equal, or below
+ // the current contest rank.
+ if (ribbon > gSpecialVar_ContestRank)
+ retVal = 2;
+ else if (ribbon >= gSpecialVar_ContestRank)
+ retVal = 1;
+ else
+ retVal = 0;
+ return retVal;
+}
+
+void sub_80AE514(void)
+{
+ u8 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ FillWindowRect_DefaultPalette(
+ &gUnknown_03004210,
+ 0,
+ gUnknown_083CA308[gUnknown_02038696[i]][0],
+ gUnknown_083CA308[gUnknown_02038696[i]][1],
+ gUnknown_083CA310[gUnknown_02038696[i]][0] + 5,
+ gUnknown_083CA310[gUnknown_02038696[i]][1] + 1);
+ sub_80AE5BC(i);
+ sub_80AE6CC(i);
+ }
+}
+
+u8 *sub_80AE598(u8 *dest, const u8 *b, u8 c)
+{
+ dest = StringCopy(dest, gUnknown_083CC59C);
+ *dest++ = c;
+ dest = StringCopy(dest, b);
+ return dest;
+}
+
+void sub_80AE5BC(u8 a)
+{
+ sub_80AE5D4(a, a + 10);
+}
+
+void sub_80AE5D4(u8 p, u8 b)
+{
+ u8 *str = gDisplayedStringBattle;
+
+ str = sub_80AE598(str, gEmptyString_81E72B0, b);
+ str[0] = EXT_CTRL_CODE_BEGIN;
+ str[1] = 6;
+ str[2] = 4;
+ str += 3;
+
+ *str++ = CHAR_SLASH;
+
+ if ((gIsLinkContest & 1) && gLinkPlayers[p].language == LANGUAGE_JAPANESE)
+ {
+ StringCopy(str, gLinkPlayers[p].name);
+ sub_8004D04(
+ &gUnknown_03004210,
+ gDisplayedStringBattle,
+ 592 + gUnknown_02038696[p] * 22,
+ 251 + gUnknown_083CA310[gUnknown_02038696[p]][0] * 8,
+ gUnknown_083CA310[gUnknown_02038696[p]][1] * 8,
+ 1);
+ }
+ else
+ {
+ StringCopy(str, gContestMons[p].trainerName);
+ sub_8003460(
+ &gUnknown_03004210,
+ gDisplayedStringBattle,
+ 592 + gUnknown_02038696[p] * 22,
+ gUnknown_083CA310[gUnknown_02038696[p]][0],
+ gUnknown_083CA310[gUnknown_02038696[p]][1]);
+ }
+}
+
+void sub_80AE6CC(u8 a)
+{
+ sub_80AE6E4(a, a + 10);
+}
+
+void sub_80AE6E4(u8 a, u8 b)
+{
+ u8 *str = gDisplayedStringBattle;
+
+ str[0] = EXT_CTRL_CODE_BEGIN;
+ str[1] = 6;
+ str[2] = 4;
+ str += 3;
+
+ str = sub_80AE598(str, gContestMons[a].nickname, b);
+ *str = EOS;
+
+ sub_8004D04(
+ &gUnknown_03004210,
+ gDisplayedStringBattle,
+ 512 + gUnknown_02038696[a] * 20,
+ 253 + gUnknown_083CA308[gUnknown_02038696[a]][0] * 8,
+ gUnknown_083CA308[gUnknown_02038696[a]][1] * 8,
+ 1);
+}
+
+u16 sub_80AE770(u8 a, u8 b)
+{
+ u8 r5;
+ u8 r4;
+ u8 r3;
+
+ switch (b)
+ {
+ case 0:
+ r5 = gContestMons[a].cool;
+ r4 = gContestMons[a].tough;
+ r3 = gContestMons[a].beauty;
+ break;
+ case 1:
+ r5 = gContestMons[a].beauty;
+ r4 = gContestMons[a].cool;
+ r3 = gContestMons[a].cute;
+ break;
+ case 2:
+ r5 = gContestMons[a].cute;
+ r4 = gContestMons[a].beauty;
+ r3 = gContestMons[a].smart;
+ break;
+ case 3:
+ r5 = gContestMons[a].smart;
+ r4 = gContestMons[a].cute;
+ r3 = gContestMons[a].tough;
+ break;
+ case 4:
+ default:
+ r5 = gContestMons[a].tough;
+ r4 = gContestMons[a].smart;
+ r3 = gContestMons[a].cool;
+ break;
+ }
+ return r5 + (r4 + r3 + gContestMons[a].sheen) / 2;
+}
+
+void sub_80AE82C(u8 a)
+{
+ u8 i;
+
+ for (i = 0; i < 4; i++)
+ gUnknown_02038670[i] = sub_80AE770(i, a);
+}
+
+u8 CreateJudgeSprite(void)
+{
+ u8 spriteId;
+
+ LoadCompressedObjectPic(&gUnknown_083CA4BC);
+ LoadCompressedPalette(gContest2Pal, 0x110, 32);
+ spriteId = CreateSprite(&gSpriteTemplate_83CA4A4, 112, 36, 30);
+ gSprites[spriteId].oam.paletteNum = 1;
+ gSprites[spriteId].callback = SpriteCallbackDummy;
+ return spriteId;
+}
+
+u8 sub_80AE8B4(void)
+{
+ u8 spriteId;
+
+ LoadCompressedObjectPic(&gUnknown_083CA4C4);
+ LoadCompressedObjectPalette(&gUnknown_083CA4CC);
+ spriteId = CreateSprite(&gUnknown_083CA4D4, 96, 10, 29);
+ gSprites[spriteId].invisible = TRUE;
+ gSprites[spriteId].data[0] = gSprites[spriteId].oam.tileNum;
+ return spriteId;
+}
+
+u8 unref_sub_80AE908(void)
+{
+ u16 species = gContestMons[gContestPlayerMonIndex].species;
+ u8 spriteId;
+
+ DecompressPicFromTable_2(
+ &gMonFrontPicTable[species],
+ gMonFrontPicCoords[species].coords,
+ gMonFrontPicCoords[species].y_offset,
+ (void *)0x02000000,
+ gUnknown_081FAF4C[1],
+ species);
+ LoadCompressedPalette(gMonPaletteTable[species].data, 0x110, 32);
+ GetMonSpriteTemplate_803C56C(gContestMons[gContestPlayerMonIndex].species, 1);
+ spriteId = CreateSprite(
+ &gUnknown_02024E8C,
+ 112, 80 + (8 - gMonFrontPicCoords[gContestMons[gContestPlayerMonIndex].species].coords) * 4,
+ 30);
+ gSprites[spriteId].oam.paletteNum = 1;
+ gSprites[spriteId].callback = SpriteCallbackDummy;
+ gSprites[spriteId].affineAnims = gSpriteAffineAnimTable_81E7C18;
+ StartSpriteAffineAnim(&gSprites[spriteId], 0);
+ return spriteId;
+}
+
+u8 sub_80AE9FC(u16 species, u32 otId, u32 personality)
+{
+ const u8 *lzPaletteData;
+ u8 spriteId;
+
+ species = SanitizeSpecies(species);
+ HandleLoadSpecialPokePic(
+ &gMonBackPicTable[species],
+ gMonBackPicCoords[species].coords,
+ gMonBackPicCoords[species].y_offset,
+ 0x02000000,
+ gUnknown_081FAF4C[0],
+ species,
+ personality);
+ lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, otId, personality);
+ LoadCompressedPalette(lzPaletteData, 0x120, 32);
+ GetMonSpriteTemplate_803C56C(species, 0);
+ spriteId = CreateSprite(&gUnknown_02024E8C, 112, sub_8077E44(2, species, 0), 30);
+ gSprites[spriteId].oam.paletteNum = 2;
+ gSprites[spriteId].oam.priority = 2;
+ gSprites[spriteId].subpriority = sub_8079E90(2);
+ gSprites[spriteId].callback = SpriteCallbackDummy;
+ gSprites[spriteId].data[0] = gSprites[spriteId].oam.paletteNum;
+ gSprites[spriteId].data[2] = species;
+ if (IsSpeciesNotUnown(species))
+ gSprites[spriteId].affineAnims = gSpriteAffineAnimTable_81E7C18;
+ else
+ gSprites[spriteId].affineAnims = gSpriteAffineAnimTable_81E7BEC;
+ StartSpriteAffineAnim(&gSprites[spriteId], 0);
+ return spriteId;
+}
+
+bool8 IsSpeciesNotUnown(u16 species)
+{
+ if (species == SPECIES_UNOWN)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+void sub_80AEB30(void)
+{
+ sub_80AEB4C((void *)(VRAM + 0xC000));
+ sub_80AEB4C((void *)(VRAM + 0xE000));
+}
+
+void sub_80AEB4C(void *a)
+{
+ DmaCopy16Defvars(3, a, (u8 *)a + 0x500, 0x280);
+}
+
+u16 sub_80AEB68(u16 move, u8 b)
+{
+ u16 var;
+
+ switch (gContestEffects[gContestMoves[move].effect].effectType)
+ {
+ case 0:
+ case 1:
+ case 8:
+ var = 0x9082;
+ break;
+ case 2:
+ case 3:
+ var = 0x9088;
+ break;
+ default:
+ var = 0x9086;
+ break;
+ }
+ var += 0x9000 + (b << 12);
+ return var;
+}
+
+void sub_80AEBEC(u16 a)
+{
+ u8 category;
+ u16 categoryTile;
+ s32 i;
+ u8 numHearts;
+
+ FillWindowRect_DefaultPalette(&gUnknown_03004210, 0, 11, 31, 16, 34);
+
+ category = gContestMoves[a].contestCategory;
+ if (category == CONTEST_CATEGORY_COOL)
+ categoryTile = 0x4040;
+ else if (category == CONTEST_CATEGORY_BEAUTY)
+ categoryTile = 0x4045;
+ else if (category == CONTEST_CATEGORY_CUTE)
+ categoryTile = 0x404A;
+ else if (category == CONTEST_CATEGORY_SMART)
+ categoryTile = 0x406A;
+ else
+ categoryTile = 0x408A;
+
+ for (i = 0; i < 5; i++)
+ {
+ *(u16 *)(VRAM + 0xC7D6 + i * 2) = categoryTile;
+ *(u16 *)(VRAM + 0xC816 + i * 2) = categoryTile + 16;
+ categoryTile++;
+ }
+
+ if (gContestEffects[gContestMoves[a].effect].appeal == 0xFF)
+ numHearts = 0;
+ else
+ numHearts = gContestEffects[gContestMoves[a].effect].appeal / 10;
+ if (numHearts > 8)
+ numHearts = 8;
+ for (i = 0; i < 8; i++)
+ {
+ if (i < numHearts)
+ *(u16 *)(VRAM + 0xC7EA + i * 2) = 0x5012;
+ else
+ *(u16 *)(VRAM + 0xC7EA + i * 2) = 0x5035;
+ }
+
+ if (gContestEffects[gContestMoves[a].effect].jam == 0xFF)
+ numHearts = 0;
+ else
+ numHearts = gContestEffects[gContestMoves[a].effect].jam / 10;
+ if (numHearts > 8)
+ numHearts = 8;
+ for (i = 0; i < 8; i++)
+ {
+ if (i < numHearts)
+ *(u16 *)(VRAM + 0xC82A + i * 2) = 0x5014;
+ else
+ *(u16 *)(VRAM + 0xC82A + i * 2) = 0x5036;
+ }
+
+ sub_8003460(&gUnknown_03004210, gContestEffectStrings[gContestMoves[a].effect], 868, 11, 35);
+ sub_8003460(&gUnknown_03004210, gUnknown_083CC5A2, 866, 16, 31);
+}
+
+void sub_80AED58(void)
+{
+ FillWindowRect_DefaultPalette(&gUnknown_03004210, 0, 11, 35, 28, 40);
+}
+
+// unused
+void sub_80AED7C(u16 move, u8 b)
+{
+ u8 r5 = gUnknown_02038696[b] * 5 + 2;
+
+ if (!Contest_IsMonsTurnDisabled(b) && move != MOVE_NONE)
+ {
+ u16 tile = sub_80AEB68(move, b);
+
+ *(u16 *)(VRAM + 0xC028 + r5 * 64) = tile;
+ *(u16 *)(VRAM + 0xC028 + r5 * 64 + 2) = tile + 1;
+
+ *(u16 *)(VRAM + 0xC068 + r5 * 64) = tile + 16;
+ *(u16 *)(VRAM + 0xC068 + r5 * 64 + 2) = tile + 17;
+
+ }
+ else
+ {
+ *(u16 *)(VRAM + 0xC028 + r5 * 64) = 0;
+ *(u16 *)(VRAM + 0xC028 + r5 * 64 + 2) = 0;
+
+ *(u16 *)(VRAM + 0xC068 + r5 * 64) = 0;
+ *(u16 *)(VRAM + 0xC068 + r5 * 64 + 2) = 0;
+ }
+}
+
+void unref_sub_80AEE20(void)
+{
+ u8 i;
+
+ for (i = 0; i < 4; i++)
+ sub_80AED7C(sContestantStatus[i].currMove, i);
+}
+
+u16 sub_80AEE4C(u8 unused)
+{
+ return 0x2034;
+}
+
+bool8 sub_80AEE54(u8 a, u8 b)
+{
+ u8 r9;
+ u16 r8;
+ s32 r4;
+
+ if (sContestantStatus[a].unk10_4 == 0)
+ return FALSE;
+ r9 = gUnknown_02038696[a] * 5 + 2;
+ if (sContestantStatus[a].unk10_4 == 1)
+ {
+ r8 = sub_80AEE4C(a);
+ r4 = 0;
+ while (sContestantStatus[a].unkD / 10 > r4)
+ {
+ *(u16 *)(VRAM + 0xC026 + (r9 + r4) * 64) = r8;
+ r4++;
+ }
+ if (b != 0)
+ {
+ PlaySE(SE_EXPMAX);
+ sContestantStatus[a].unk10_4 = 0;
+ }
+ }
+ else
+ {
+ r8 = 0;
+ r4 = 3;
+ while (sContestantStatus[a].unkD / 10 < r4)
+ {
+ *(u16 *)(VRAM + 0xBFE6 + (r9 + r4) * 64) = r8;
+ r4--;
+ }
+ if (b != 0)
+ {
+ PlaySE(SE_FU_ZAKU2);
+ sContestantStatus[a].unk10_4 = 0;
+ }
+ }
+ return TRUE;
+}
+
+void sub_80AEF50(void)
+{
+ s32 i;
+ s32 r4;
+
+ for (i = 0; i < 4; i++)
+ {
+ u8 r8 = gUnknown_02038696[i] * 5 + 2;
+ u16 r6 = sub_80AEE4C(i);
+
+ r4 = 0;
+ while (r4 < sContestantStatus[i].unkD / 10)
+ {
+ *(u16 *)(VRAM + 0xC026 + (r8 + r4) * 64) = r6;
+ r4++;
+ }
+ r6 = 0;
+ while (r4 < 3)
+ {
+ *(u16 *)(VRAM + 0xC026 + (r8 + r4) * 64) = r6;
+ r4++;
+ }
+ }
+}
+
+u16 sub_80AEFE8(u8 unused, u8 b)
+{
+ u16 var = 0;
+
+ switch (b)
+ {
+ case 0:
+ var = 0x80;
+ break;
+ case 1:
+ var = 0x84;
+ break;
+ case 2:
+ var = 0x86;
+ break;
+ case 3:
+ var = 0x88;
+ break;
+ case 4:
+ var = 0x82;
+ break;
+ }
+ var += 0x9000;
+ return var;
+}
+
+bool8 sub_80AF038(u8 a)
+{
+ bool8 r5 = TRUE;
+ u16 r4 = 0;
+ u8 r6 = gUnknown_02038696[a] * 5 + 2;
+
+ if (sContestantStatus[a].unk10_0 != 0 || sContestantStatus[a].unk10_1 != 0 || sContestantStatus[a].unk12 != 0 || sContestantStatus[a].unkF != 0)
+ r4 = sub_80AEFE8(a, 0);
+ else if (sContestantStatus[a].unkC_0)
+ r4 = sub_80AEFE8(a, 1);
+ else if (sContestantStatus[a].unkC_1 != 0 || sContestantStatus[a].unkB_7)
+ r4 = sub_80AEFE8(a, 2);
+ else
+ r5 = FALSE;
+ if (r5)
+ {
+ *(u16 *)(VRAM + 0xC028 + r6 * 64) = r4;
+ *(u16 *)(VRAM + 0xC028 + r6 * 64 + 2) = r4 + 1;
+ *(u16 *)(VRAM + 0xC068 + r6 * 64) = r4 + 16;
+ *(u16 *)(VRAM + 0xC068 + r6 * 64 + 2) = r4 + 17;
+ }
+ else
+ {
+ *(u16 *)(VRAM + 0xC028 + r6 * 64) = 0;
+ *(u16 *)(VRAM + 0xC028 + r6 * 64 + 2) = 0;
+ *(u16 *)(VRAM + 0xC068 + r6 * 64) = 0;
+ *(u16 *)(VRAM + 0xC068 + r6 * 64 + 2) = 0;
+ }
+ return r5;
+}
+
+void sub_80AF120(void)
+{
+ s32 i;
+
+ for (i = 0; i < 4; i++)
+ sub_80AF038(i);
+}
+
+void sub_80AF138(void)
+{
+ FillWindowRect_DefaultPalette(&gUnknown_03004210, 0, 1, 15, 17, 18);
+}
+
+u16 GetChosenMove(u8 a)
+{
+ if (Contest_IsMonsTurnDisabled(a))
+ return 0;
+ if (a == gContestPlayerMonIndex)
+ {
+ return gContestMons[a].moves[sContest.playerMoveChoice];
+ }
+ else
+ {
+ u8 moveChoice;
+
+ sub_81288F4(a);
+ moveChoice = sub_8128944();
+ return gContestMons[a].moves[moveChoice];
+ }
+}
+
+void sub_80AF1B8(void)
+{
+ u8 i;
+
+ for (i = 0; i < 4; i++)
+ sContestantStatus[i].currMove = GetChosenMove(i);
+}
+
+void sub_80AF1E4(u8 a, u8 b)
+{
+ u8 r3;
+
+ if (b == 0)
+ r3 = a + 10;
+ else
+ r3 = 14;
+ if (sContestantStatus[a].currMove == MOVE_NONE)
+ sub_80AE598(gDisplayedStringBattle, gUnknownText_MissedTurn, r3);
+ else
+ sub_80AE598(gDisplayedStringBattle, gMoveNames[sContestantStatus[a].currMove], r3);
+ sub_80AF2A0(a);
+ sub_8003460(
+ &gUnknown_03004210,
+ gDisplayedStringBattle,
+ 696 + a * 20,
+ gUnknown_083CA318[a][0],
+ gUnknown_083CA318[a][1]);
+}
+
+void unref_sub_80AF280(u8 a)
+{
+ u8 i;
+
+ for (i = 0; i < 4; i++)
+ sub_80AF1E4(i, a);
+}
+
+void sub_80AF2A0(u8 a)
+{
+ FillWindowRect_DefaultPalette(
+ &gUnknown_03004210,
+ 0,
+ gUnknown_083CA318[a][0],
+ gUnknown_083CA318[a][1],
+ gUnknown_083CA318[a][0] + 7,
+ gUnknown_083CA318[a][1] + 1);
+}
+
+void unref_sub_80AF2E0(void)
+{
+ u8 i;
+
+ for (i = 0; i < 4; i++)
+ sub_80AF2A0(i);
+}
+
+void sub_80AF2FC(void)
+{
+ u8 i;
+ u8 j;
+ s16 arr[4];
+
+ for (i = 0; i < 4; i++)
+ {
+ sContestantStatus[i].unk4 += sContestantStatus[i].appeal2;
+ arr[i] = sContestantStatus[i].unk4;
+ }
+ for (i = 0; i < 3; i++)
+ {
+ for (j = 3; j > i; j--)
+ {
+ if (arr[j - 1] < arr[j])
+ {
+ u16 temp = arr[j];
+
+ arr[j] = arr[j - 1];
+ arr[j - 1] = temp;
+ }
+ }
+ }
+ for (i = 0; i < 4; i++)
+ {
+ for (j = 0; j < 4; j++)
+ {
+ if (sContestantStatus[i].unk4 == arr[j])
+ {
+ sContestantStatus[i].unkB_0 = j;
+ break;
+ }
+ }
+ }
+ sub_80B0F28(1);
+ sub_80B159C();
+}
+
+void sub_80AF3C0(void)
+{
+ s32 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ u8 attentionLevel;
+
+ if (sContestantStatus[i].currMove == MOVE_NONE)
+ attentionLevel = 5;
+ else if (sContestantStatus[i].appeal2 <= 0)
+ attentionLevel = 0;
+ else if (sContestantStatus[i].appeal2 < 30)
+ attentionLevel = 1;
+ else if (sContestantStatus[i].appeal2 < 60)
+ attentionLevel = 2;
+ else if (sContestantStatus[i].appeal2 < 80)
+ attentionLevel = 3;
+ else
+ attentionLevel = 4;
+
+ sContestantStatus[i].attentionLevel = attentionLevel;
+ }
+}
+
+bool8 sub_80AF404(u8 a)
+{
+ if (sContestantStatus[a].unkC_1 != 0 || sContestantStatus[a].unkB_7)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+void sub_80AF438(void)
+{
+ u8 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ // This is bitfield hell...
+ sContestantStatus[i].appeal2 = 0;
+ sContestantStatus[i].appeal1 = 0;
+ sContestantStatus[i].unk12 = 0;
+ if (sContestantStatus[i].unkC_1 > 0)
+ sContestantStatus[i].unkC_1--;
+ sContestantStatus[i].unkE = 0;
+ sContestantStatus[i].unk10_0 = 0;
+ sContestantStatus[i].unkF = 0;
+ sContestantStatus[i].unk10_1 = 0;
+ sContestantStatus[i].unk10_2 = 0;
+ sContestantStatus[i].unk10_3 = 0;
+ sContestantStatus[i].unkC_0 = 0;
+ sContestantStatus[i].unk13 = 0xFF;
+ sContestantStatus[i].unk14 = -1;
+ sContestantStatus[i].unk10_4 = 0;
+ sContestantStatus[i].unk15_2 = sContestantStatus[i].disappointedRepeat;
+ sContestantStatus[i].disappointedRepeat = FALSE;
+ sContestantStatus[i].unk11_0 = 0;
+ sContestantStatus[i].unk11_5 = 0;
+ if (sContestantStatus[i].unk11_2)
+ {
+ sContestantStatus[i].unkC_1 = 1;
+ sContestantStatus[i].unk11_2 = 0;
+ }
+ if (sContestantStatus[i].unk11_3)
+ {
+ sContestantStatus[i].unkB_7 = 1;
+ sContestantStatus[i].unk11_3 = 0;
+ }
+ sContestantStatus[i].unk11_4 = 0;
+ }
+ for (i = 0; i < 4; i++)
+ {
+ sContestantStatus[i].prevMove = sContestantStatus[i].currMove;
+ sContest.unk19220[sContest.turnNumber][i] = sContestantStatus[i].prevMove;
+ sContest.unk19248[sContest.turnNumber][i] = Contest_GetMoveExcitement(sContestantStatus[i].currMove);
+ sContestantStatus[i].currMove = MOVE_NONE;
+ }
+ shared19328.bits_8 = 0;
+}
+
+bool8 Contest_IsMonsTurnDisabled(u8 a)
+{
+ if (sContestantStatus[a].unkC_1 != 0 || sContestantStatus[a].unkB_7)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool8 unref_sub_80AF5D0(u8 a, u8 b)
+{
+ u8 i;
+
+ if (a != gContestPlayerMonIndex)
+ return TRUE;
+ for (i = 0; i < 4; i++)
+ {
+ if (b == 3)
+ {
+ sContest.unk1920A_0 = 1;
+ return TRUE;
+ }
+ if (b == 4)
+ {
+ sContest.unk1920A_1 = 1;
+ return TRUE;
+ }
+ if (sContest.unk19206[i] == b)
+ return TRUE;
+ if (sContest.unk19206[i] == 0xFF)
+ {
+ sContest.unk19206[i] = b;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+void sub_80AF630(u8 a)
+{
+ gUnknown_02038688[a] = sub_80AF688(a);
+ gUnknown_02038678[a] = gUnknown_02038670[a] + gUnknown_02038688[a];
+}
+
+void sub_80AF668(void)
+{
+ u8 i;
+
+ for (i = 0; i < 4; i++)
+ sub_80AF630(i);
+ DetermineFinalStandings();
+}
+
+s16 sub_80AF688(u8 a)
+{
+ return gUnknown_02038680[a] * 2;
+}
+
+// Determines standing order?
+void DetermineFinalStandings(void)
+{
+ u16 sp0[4] = {0};
+ struct UnknownContestStruct6 sp8[4];
+ s32 i;
+ s32 j;
+
+ for (i = 0; i < 4; i++)
+ {
+ s32 r2;
+
+ sp0[i] = Random();
+ for (r2 = 0; r2 < i; r2++)
+ {
+ if (sp0[i] == sp0[r2])
+ {
+ i--;
+ break;
+ }
+ }
+ }
+
+ for (i = 0; i < 4; i++)
+ {
+ sp8[i].unk0 = gUnknown_02038678[i];
+ sp8[i].unk4 = gUnknown_02038670[i];
+ sp8[i].unk8 = sp0[i];
+ sp8[i].unkC = i;
+ }
+
+ for (i = 0; i < 3; i++)
+ {
+ for (j = 3; j > i; j--)
+ {
+ if (sub_80AF828(j - 1, j, sp8))
+ {
+ struct UnknownContestStruct6 temp;
+
+ temp.unk0 = sp8[j - 1].unk0;
+ temp.unk4 = sp8[j - 1].unk4;
+ temp.unk8 = sp8[j - 1].unk8;
+ temp.unkC = sp8[j - 1].unkC;
+
+ sp8[j - 1].unk0 = sp8[j].unk0;
+ sp8[j - 1].unk4 = sp8[j].unk4;
+ sp8[j - 1].unk8 = sp8[j].unk8;
+ sp8[j - 1].unkC = sp8[j].unkC;
+
+ sp8[j].unk0 = temp.unk0;
+ sp8[j].unk4 = temp.unk4;
+ sp8[j].unk8 = temp.unk8;
+ sp8[j].unkC = temp.unkC;
+ }
+ }
+ }
+
+ for (i = 0; i < 4; i++)
+ gContestFinalStandings[sp8[i].unkC] = i;
+}
+
+bool8 sub_80AF828(s32 a, s32 b, struct UnknownContestStruct6 *c)
+{
+ bool8 retVal;
+
+ if (c[a].unk0 < c[b].unk0)
+ retVal = TRUE;
+ else if (c[a].unk0 > c[b].unk0)
+ retVal = FALSE;
+ else if (c[a].unk4 < c[b].unk4)
+ retVal = TRUE;
+ else if (c[a].unk4 > c[b].unk4)
+ retVal = FALSE;
+ else if (c[a].unk8 < c[b].unk8)
+ retVal = TRUE;
+ else
+ retVal = FALSE;
+ return retVal;
+}
+
+void sub_80AF860(void)
+{
+ gBattle_BG0_Y = 0;
+ gBattle_BG2_Y = 0;
+ sub_80AF138();
+ sub_8003460(&gMenuWindow, gUnknownText_LinkStandbyAndWinner, 776, 1, 15);
+}
+
+u8 unref_sub_80AF89C(s16 a, s16 b, u8 c, u8 d)
+{
+ u8 taskId;
+ u8 r5;
+ s8 r4;
+ u16 r0;
+
+ shared19338[d].unk2_2 = 1;
+ taskId = CreateTask(sub_80AF94C, 20);
+ r5 = sub_80AFB74(a);
+ r4 = sub_80AFB74(a + b) - r5;
+ r0 = sub_80AFB40(d);
+ gTasks[taskId].data[0] = r5;
+ gTasks[taskId].data[1] = r4;
+ gTasks[taskId].data[2] = r0 + c;
+ gTasks[taskId].data[3] = d;
+ if (b < 0)
+ nullsub_19(d);
+ return taskId;
+}
+
+void sub_80AF94C(u8 taskId)
+{
+ u8 r5 = gTasks[taskId].data[3];
+
+ if (gTasks[taskId].data[1] == 0)
+ {
+ nullsub_19(r5);
+ DestroyTask(taskId);
+ shared19338[r5].unk2_2 = 0;
+ }
+ else if (++gTasks[taskId].data[10] > 29)
+ {
+ u8 r6;
+
+ gTasks[taskId].data[10] = 0;
+ if (gTasks[taskId].data[1] < 0)
+ {
+ r6 = gTasks[taskId].data[0]--;
+ gTasks[taskId].data[1]++;
+ PlaySE(SE_BOO);
+ }
+ else
+ {
+ r6 = ++gTasks[taskId].data[0];
+ gTasks[taskId].data[1]--;
+ PlaySE(SE_PIN);
+ }
+ if ((u16)gTasks[taskId].data[2] != 0xFFFF)
+ {
+ RequestSpriteCopy(
+ &gTasks[taskId].data[2],
+ (void *)(VRAM + 0xC000 + (147 + r6 + r5 * 160) * 2),
+ 2);
+ }
+ else
+ {
+ u8 i;
+
+ for (i = 0; i < 3; i++)
+ {
+ if (gTasks[taskId].data[i + 4] < 0)
+ {
+ RequestSpriteCopy(
+ &gTasks[taskId].data[i + 7],
+ (void *)(VRAM + 0xC000 + (147 + r6 + r5 * 160) * 2),
+ 2);
+ gTasks[taskId].data[i + 4]++;
+ break;
+ }
+ }
+ }
+ }
+}
+
+void sub_80AFA5C(void)
+{
+ u8 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ DmaClear16(3, (void *)(VRAM + 0xC000 + (86 + i * 160) * 2), 16);
+ DmaClear16(3, (void *)(VRAM + 0xC000 + (118 + i * 160) * 2), 16);
+ }
+}
+
+void unref_sub_80AFAB8(s16 a, u8 b)
+{
+ u8 r5 = sub_80AFB74(a);
+ u16 r2;
+ u8 i;
+ u16 arr[9];
+
+ if (b == 0)
+ r2 = 0x50A2;
+ else if (b == 1)
+ r2 = 0x60A2;
+ else if (b == 2)
+ r2 = 0x70A2;
+ else
+ r2 = 0x80A2;
+
+ for (i = 0; i < 9; i++)
+ {
+ if (i < r5)
+ arr[i] = r2;
+ else
+ arr[i] = 0;
+ }
+
+ DmaCopy16Defvars(3, arr, (void *)(VRAM + 0xC000 + (148 + b * 160) * 2), sizeof(arr));
+}
+
+u16 sub_80AFB40(u8 a)
+{
+ u16 var;
+
+ if (a == 0)
+ var = 0x5011;
+ else if (a == 1)
+ var = 0x6011;
+ else if (a == 2)
+ var = 0x7011;
+ else
+ var = 0x8011;
+ return var + 1;
+}
+
+s8 sub_80AFB74(s16 a)
+{
+ s8 retVal = a / 10;
+
+ if (retVal > 16)
+ retVal = 16;
+ else if (retVal < -16)
+ retVal = -16;
+ return retVal;
+}
+
+u8 sub_80AFBA0(s16 a, s16 b, u8 c)
+{
+ u8 taskId;
+ s8 r4;
+ s8 r5;
+
+ shared19338[c].unk2_2 = 1;
+ taskId = CreateTask(sub_80AFC74, 20);
+ r4 = sub_80AFB74(a);
+ r5 = sub_80AFB74(a + b) - r4;
+ sub_80AFB40(c); // unused return value
+ gTasks[taskId].data[0] = abs(r4);
+ gTasks[taskId].data[1] = r5;
+ if (r4 > 0 || (r4 == 0 && r5 > 0))
+ gTasks[taskId].data[2] = 1;
+ else
+ gTasks[taskId].data[2] = -1;
+ gTasks[taskId].data[3] = c;
+ if (b < 0)
+ nullsub_19(c);
+ return taskId;
+}
+
+void sub_80AFC74(u8 taskId)
+{
+ u8 r7 = gTasks[taskId].data[3];
+ s16 r3 = gTasks[taskId].data[0];
+ s16 r1 = gTasks[taskId].data[1];
+
+ if (++gTasks[taskId].data[10] > 14)
+ {
+ u16 r6;
+ u8 r5;
+ u8 r10;
+
+ gTasks[taskId].data[10] = 0;
+ if (gTasks[taskId].data[1] == 0)
+ {
+ nullsub_19(r7);
+ DestroyTask(taskId);
+ shared19338[r7].unk2_2 = 0;
+ return;
+ }
+ else if (r3 == 0)
+ {
+ if (r1 < 0)
+ {
+ r6 = sub_80AFB40(r7) + 2;
+ gTasks[taskId].data[1]++;
+ }
+ else
+ {
+ r6 = sub_80AFB40(r7);
+ gTasks[taskId].data[1]--;
+ }
+ r5 = gTasks[taskId].data[0]++;
+ }
+ else
+ {
+ if (gTasks[taskId].data[2] < 0)
+ {
+ if (r1 < 0)
+ {
+ r5 = gTasks[taskId].data[0]++;
+ gTasks[taskId].data[1]++;
+ r6 = sub_80AFB40(r7) + 2;
+ }
+ else
+ {
+ r5 = --gTasks[taskId].data[0];
+ r6 = 0;
+ gTasks[taskId].data[1]--;
+ }
+ }
+ else
+ {
+ if (r1 < 0)
+ {
+ r5 = --gTasks[taskId].data[0];
+ r6 = 0;
+ gTasks[taskId].data[1]++;
+ }
+ else
+ {
+ r5 = gTasks[taskId].data[0]++;
+ gTasks[taskId].data[1]--;
+ r6 = sub_80AFB40(r7);
+ }
+ }
+ }
+ r10 = r5;
+ if (r5 > 7)
+ r5 += 24;
+ // Seriously, a 2-byte CpuFill? Why?
+ CpuFill16(r6, (void *)(VRAM + 0xC000 + (0x56 + r5 + gUnknown_02038696[r7] * 160) * 2), 2);
+ if (r1 > 0)
+ {
+ PlaySE(SE_C_GAJI);
+ m4aMPlayImmInit(&gMPlay_SE1);
+ m4aMPlayPitchControl(&gMPlay_SE1, 0xFFFF, r10 * 256);
+ }
+ else
+ {
+ PlaySE(SE_BOO);
+ }
+ if (r5 == 0 && r6 == 0)
+ gTasks[taskId].data[2] = -gTasks[taskId].data[2];
+ }
+}
+
+void sub_80AFE30(void)
+{
+ s32 i;
+
+ LoadSpriteSheet(&gUnknown_083CA350);
+ for (i = 0; i < 4; i++)
+ {
+ u8 y = gUnknown_083CA338[gUnknown_02038696[i]];
+
+ shared19338[i].unk0 = CreateSprite(&gSpriteTemplate_83CA3AC, 180, y, 1);
+ }
+}
+
+void sub_80AFE78(u8 a)
+{
+ u8 spriteId;
+ s16 r5;
+
+ shared19338[a].unk2_0 = 1;
+ spriteId = shared19338[a].unk0;
+ r5 = sContestantStatus[a].unk4 / 10 * 2;
+ if (r5 > 56)
+ r5 = 56;
+ else if (r5 < 0)
+ r5 = 0;
+ gSprites[spriteId].invisible = FALSE;
+ gSprites[spriteId].data[0] = a;
+ gSprites[spriteId].data[1] = r5;
+ if (gSprites[spriteId].data[1] > gSprites[spriteId].pos2.x)
+ gSprites[spriteId].data[2] = 1;
+ else
+ gSprites[spriteId].data[2] = -1;
+ gSprites[spriteId].callback = sub_80AFF60;
+}
+
+void sub_80AFF10(void)
+{
+ s32 i;
+
+ for (i = 0; i < 4; i++)
+ sub_80AFE78(i);
+}
+
+bool8 sub_80AFF28(void)
+{
+ s32 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (shared19338[i].unk2_0)
+ break;
+ }
+ if (i == 4)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void sub_80AFF60(struct Sprite *sprite)
+{
+ if (sprite->pos2.x == sprite->data[1])
+ {
+ shared19338[sprite->data[0]].unk2_0 = 0;
+ sprite->callback = SpriteCallbackDummy;
+ }
+ else
+ {
+ sprite->pos2.x += sprite->data[2];
+ }
+}
+
+void sub_80AFFA0(void)
+{
+ s32 i;
+
+ for (i = 0; i < 4; i++)
+ gSprites[shared19338[i].unk0].pos1.y = gUnknown_083CA338[gUnknown_02038696[i]];
+}
+
+void sub_80AFFE0(bool8 a)
+{
+ s32 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (gUnknown_02038696[i] > 1)
+ {
+ if (!a)
+ gSprites[shared19338[i].unk0].pos1.x = 180;
+ else
+ gSprites[shared19338[i].unk0].pos1.x = 256;
+ }
+ }
+}
+
+void sub_80B0034(void)
+{
+ s32 i;
+
+ LoadSpritePalette(&gUnknown_083CA3E4);
+ for (i = 0; i < 4; i++)
+ {
+ LoadCompressedObjectPic(&gUnknown_083CA3C4[i]);
+ shared19338[i].unk1 = CreateSprite(
+ &gSpriteTemplate_83CA3F4[i],
+ 204, gUnknown_083CA33C[gUnknown_02038696[i]],
+ 0);
+ SetSubspriteTables(&gSprites[shared19338[i].unk1], gSubspriteTables_83CA464);
+ gSprites[shared19338[i].unk1].invisible = TRUE;
+ }
+}
+
+void CreateApplauseMeterSprite(void)
+{
+ u8 spriteId;
+
+ LoadCompressedObjectPic(&gUnknown_083CA46C);
+ LoadSpritePalette(&gUnknown_083CA474);
+ spriteId = CreateSprite(&gSpriteTemplate_83CA484, 30, 44, 1);
+ gSprites[spriteId].invisible = TRUE;
+ sContest.applauseMeterSpriteId = spriteId;
+}
+
+void nullsub_18(s8 unused)
+{
+}
+
+void unref_sub_80B011C(void)
+{
+ u8 i;
+
+ LoadCompressedObjectPic(&gUnknown_083CC3AC);
+ for (i = 0; i < 4; i++)
+ LoadCompressedObjectPalette(&gUnknown_083CC3B4[i]);
+ for (i = 0; i < 4; i++)
+ {
+ u8 spriteId = CreateSprite(
+ &gSpriteTemplate_83CC454[i],
+ gUnknown_083CA330[i][0], gUnknown_083CA330[i][1],
+ 5);
+
+ gSprites[spriteId].invisible = TRUE;
+ gSprites[spriteId].data[0] = i;
+ sContest.unk1920D[i] = spriteId;
+ }
+}
+
+void unref_sub_80B01B0(void)
+{
+ s32 i;
+
+ for (i = 0; i < 4; i++)
+ gSprites[sContest.unk1920D[i]].callback = sub_80B0238;
+}
+
+bool8 unref_sub_80B01E0(void)
+{
+ s32 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (gSprites[sContest.unk1920D[i]].callback != SpriteCallbackDummy)
+ break;
+ }
+ if (i == 4)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void sub_80B0238(struct Sprite *sprite)
+{
+ sprite->oam.affineMode = 1;
+ InitSpriteAffineAnim(sprite);
+ if (sprite->invisible)
+ {
+ sprite->callback = sub_80B02A8;
+ }
+ else
+ {
+ StartSpriteAffineAnim(sprite, 1);
+ sprite->callback = sub_80B0280;
+ }
+}
+
+void sub_80B0280(struct Sprite *sprite)
+{
+ if (sprite->affineAnimEnded)
+ {
+ sprite->invisible = TRUE;
+ sprite->callback = sub_80B02A8;
+ }
+}
+
+void sub_80B02A8(struct Sprite *sprite)
+{
+ sprite->invisible = FALSE;
+ StartSpriteAnim(sprite, sContestantStatus[sprite->data[0]].unkB_0);
+ StartSpriteAffineAnim(sprite, 2);
+ sprite->callback = sub_80B02F4;
+ PlaySE(SE_JYUNI);
+}
+
+void sub_80B02F4(struct Sprite *sprite)
+{
+ if (sprite->affineAnimEnded)
+ {
+ FreeSpriteOamMatrix(sprite);
+ sprite->oam.affineMode = 0;
+ sprite->callback = SpriteCallbackDummy;
+ }
+}
+
+void sub_80B0324(void)
+{
+ u8 i;
+ u8 taskId = CreateTask(sub_80B0458, 30);
+
+ sContest.unk19211 = taskId;
+ for (i = 0; i < 4; i++)
+ gTasks[taskId].data[i * 4] = 0xFF;
+}
+
+void sub_80B0368(u8 a)
+{
+ gTasks[sContest.unk19211].data[a * 4 + 0] = 0;
+ gTasks[sContest.unk19211].data[a * 4 + 1] = 0;
+}
+
+void sub_80B03A8(u8 a)
+{
+ u8 taskId = CreateTask(sub_80B03D8, 31);
+
+ gTasks[taskId].data[0] = a;
+}
+
+void sub_80B03D8(u8 taskId)
+{
+ u8 r4 = gTasks[taskId].data[0];
+
+ if (gTasks[sContest.unk19211].data[r4 * 4 + 0] == 0
+ || gTasks[sContest.unk19211].data[r4 * 4 + 0] == 0xFF)
+ {
+ gTasks[sContest.unk19211].data[r4 * 4 + 0] = 0xFF;
+ gTasks[sContest.unk19211].data[r4 * 4 + 1] = 0;
+ BlendPalette((sContest.unk19218[r4] + 5) * 16 + 6, 2, 0, 0x4BFF);
+ DestroyTask(taskId);
+ }
+}
+
+void sub_80B0458(u8 taskId)
+{
+ u8 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ u8 r3 = i * 4;
+
+ if (gTasks[taskId].data[r3 + 0] != 0xFF)
+ {
+ if (gTasks[taskId].data[r3 + 1] == 0)
+ gTasks[taskId].data[r3 + 0]++;
+ else
+ gTasks[taskId].data[r3 + 0]--;
+
+ if (gTasks[taskId].data[r3 + 0] == 16
+ || gTasks[taskId].data[r3 + 0] == 0)
+ gTasks[taskId].data[r3 + 1] ^= 1;
+
+ BlendPalette(
+ (sContest.unk19218[i] + 5) * 16 + 6,
+ 2,
+ gTasks[taskId].data[r3 + 0],
+ 0x4BFF);
+ }
+ }
+}
+
+void sub_80B0518(void)
+{
+ u8 i;
+
+ sContest.unk19212 = CreateTask(sub_80B05FC, 30);
+ for (i = 0; i < 4; i++)
+ sub_80B0548(i);
+}
+
+void sub_80B0548(u8 a)
+{
+ gTasks[sContest.unk19212].data[a * 4 + 0] = 0xFF;
+ gTasks[sContest.unk19212].data[a * 4 + 1] = 0;
+}
+
+void sub_80B0588(void)
+{
+ u8 i;
+
+ for (i = 0; i < 4; i++)
+ sub_80B05A4(i);
+}
+
+// TODO: Try to write this better
+void sub_80B05A4(u8 a)
+{
+ u32 var;
+ u32 r0;
+
+ sub_80B0548(a);
+
+ // 2-byte DMA copy? Why?
+
+ r0 = a + 5;
+ DmaCopy16Defvars(
+ 3,
+ gPlttBufferUnfaded + r0 * 16 + 10,
+ gPlttBufferFaded + r0 * 16 + 10,
+ 2);
+
+ var = (a + 5) * 16 + 12 + a;
+ DmaCopy16Defvars(
+ 3,
+ gPlttBufferUnfaded + var,
+ gPlttBufferFaded + var,
+ 2);
+}
+
+void nullsub_19(int unused)
+{
+}
+
+void sub_80B05FC(u8 taskId)
+{
+ u8 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ u8 r3 = i * 4;
+
+ if (gTasks[taskId].data[r3 + 0] != 0xFF)
+ {
+ if (++gTasks[taskId].data[r3 + 2] > 2)
+ {
+ gTasks[taskId].data[r3 + 2] = 0;
+
+ if (gTasks[taskId].data[r3 + 1] == 0)
+ gTasks[taskId].data[r3 + 0]++;
+ else
+ gTasks[taskId].data[r3 + 0]--;
+
+ if (gTasks[taskId].data[r3 + 0] == 16
+ || gTasks[taskId].data[r3 + 0] == 0)
+ gTasks[taskId].data[r3 + 1] ^= 1;
+
+ BlendPalette((i + 5) * 16 + 10, 1, gTasks[taskId].data[r3 + 0], 0x4BFF);
+ BlendPalette((i + 5) * 16 + 12 + i, 1, gTasks[taskId].data[r3 + 0], 0x4BFF);
+ }
+ }
+ }
+}
+
+u8 unref_sub_80B06E0(u8 *a)
+{
+ u8 i;
+ u8 taskId = CreateTask(sub_80B0748, 10);
+
+ for (i = 0; i < 4; i++)
+ {
+ u8 r0 = i * 4;
+
+ gTasks[taskId].data[r0] = a[i];
+ if (a[i] != 0)
+ shared19338[i].unk2_1 = 1;
+ }
+ return taskId;
+}
+
+#ifdef NONMATCHING
+void sub_80B0748(u8 taskId)
+{
+ u8 i;
+ u8 r4_2;
+ u8 r1;
+ u8 r7;
+
+ for (i = 0; i < 4; i++)
+ {
+ //#define r4 r4_2
+ r4 = gUnknown_02038696[i];
+ r1 = r4 * 4;
+ r7 = gTasks[taskId].data[r1 + 0];
+
+ if (r7 != 0)
+ {
+ //_080B079C
+ u8 r8 = gTasks[taskId].data[r1 + 1];
+ u8 r5 = gTasks[taskId].data[r1 + 2];
+ u8 r6 = gTasks[taskId].data[r1 + 3];
+
+ if (r7 == 1)
+ {
+ r6++;
+ if (r6 == 1)
+ {
+ //_080B07D2
+ r6 = 0;
+ BlendPalette((r4 + 5) * 16 + 1, 3, r5, 0x7FFF);
+ if (r5 == 0 && r8 == 4)
+ {
+ gTasks[taskId].data[r1 + 0] = 0;
+ //asm("");
+ }
+ //_080B0800
+ else
+ {
+ r5 += 2;
+ if (r5 > 13)
+ {
+ r5 = 0;
+ r8++;
+ }
+ }
+ }
+ //to _080B08EA
+ }
+ //_080B0818
+ else if (r7 == 2 || r7 == 4)
+ {
+ r6++;
+ if (r6 == 3)
+ {
+ r6 = 0;
+ BlendPalette((r4 + 5) * 16 + 1, 3, r5, gUnknown_083CC5A4[r4]);
+ if (r5 == 0 && r8 == 2)
+ {
+ gTasks[taskId].data[r1 + 0] = 0;
+ }
+ //_080B0858
+ else
+ {
+ r5 += 1;
+ if (r5 == 14)
+ {
+ r5 = 0;
+ r8++;
+ if (r7 == 4 && r8 == 1)
+ {
+ BlendPalette((r4 + 9) * 16 + 2, 1, 4, 0);
+ BlendPalette((r4 + 9) * 16 + 5, 1, 4, 0);
+ }
+ }
+ }
+ }
+ //to _080B08EA
+ }
+ //_080B0896
+ else if (r7 == 3)
+ {
+ r6++;
+ if (r6 == 12)
+ {
+ r6 = 0;
+ BlendPalette((r4 + 5) * 16 + 1, 3, r5, 0);
+ r5 += 1;
+ if (r5 == 5)
+ {
+ // What the hell? These aren't pointers.
+ // This code would crash if run.
+ {
+ void *src = (void *)(u32)gPlttBufferFaded[(r4 + 5) * 16 + 1];
+ void *dest = (void *)(u32)gPlttBufferUnfaded[(r4 + 5) * 16 + 1];
+ u32 size = 6;
+ DmaCopy16(3, src, dest, size);
+ }
+ gTasks[taskId].data[r1 + 0] = 0;
+ }
+ }
+ }
+ //_080B08EA
+ gTasks[taskId].data[r1 + 1] = r8;
+ gTasks[taskId].data[r1 + 2] = r5;
+ gTasks[taskId].data[r1 + 3] = r6;
+ }
+ //_080B0910
+ }
+ //_080B0920
+
+ #define i r4_2
+ for (i = 0; i < 4; i++) // r4 is i
+ {
+ if (gTasks[taskId].data[i * 4 + 0] != 0)
+ break;
+ }
+ //_080B0958
+ if (i == 4)
+ {
+ for (i = 0; i < 4; i++)
+ shared19338[i].unk2_2 = 0;
+ DestroyTask(taskId);
+ }
+ #undef i
+}
+#else
+__attribute__((naked))
+void sub_80B0748(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\
+ sub sp, 0x20\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ str r0, [sp]\n\
+ movs r0, 0\n\
+ str r0, [sp, 0x4]\n\
+ ldr r2, _080B07F4 @ =gTasks\n\
+ movs r1, 0x8\n\
+ adds r1, r2\n\
+ mov r10, r1\n\
+ ldr r3, [sp]\n\
+ lsls r3, 2\n\
+ str r3, [sp, 0x1C]\n\
+ ldr r1, [sp]\n\
+ adds r0, r3, r1\n\
+ lsls r0, 3\n\
+ str r0, [sp, 0xC]\n\
+_080B0774:\n\
+ ldr r0, _080B07F8 @ =gUnknown_02038696\n\
+ ldr r3, [sp, 0x4]\n\
+ adds r0, r3, r0\n\
+ ldrb r4, [r0]\n\
+ lsls r0, r4, 26\n\
+ lsrs r1, r0, 24\n\
+ lsls r0, r1, 1\n\
+ str r0, [sp, 0x8]\n\
+ ldr r3, [sp]\n\
+ lsls r0, r3, 2\n\
+ adds r0, r3\n\
+ lsls r6, r0, 3\n\
+ ldr r3, [sp, 0x8]\n\
+ adds r0, r3, r6\n\
+ add r0, r10\n\
+ mov r9, r0\n\
+ ldrb r7, [r0]\n\
+ cmp r7, 0\n\
+ bne _080B079C\n\
+ b _080B0910\n\
+_080B079C:\n\
+ adds r3, r1, 0x1\n\
+ lsls r0, r3, 1\n\
+ adds r0, r6\n\
+ add r0, r10\n\
+ ldrb r0, [r0]\n\
+ mov r8, r0\n\
+ adds r2, r1, 0x2\n\
+ lsls r0, r2, 1\n\
+ adds r0, r6\n\
+ add r0, r10\n\
+ ldrb r5, [r0]\n\
+ adds r1, 0x3\n\
+ lsls r0, r1, 1\n\
+ adds r0, r6\n\
+ add r0, r10\n\
+ ldrb r6, [r0]\n\
+ str r3, [sp, 0x10]\n\
+ str r2, [sp, 0x14]\n\
+ str r1, [sp, 0x18]\n\
+ cmp r7, 0x1\n\
+ bne _080B0818\n\
+ adds r0, r6, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ cmp r6, 0x1\n\
+ beq _080B07D2\n\
+ b _080B08EA\n\
+_080B07D2:\n\
+ movs r6, 0\n\
+ adds r0, r4, 0x5\n\
+ lsls r0, 4\n\
+ adds r0, 0x1\n\
+ movs r1, 0x3\n\
+ adds r2, r5, 0\n\
+ ldr r3, _080B07FC @ =0x00007fff\n\
+ bl BlendPalette\n\
+ cmp r5, 0\n\
+ bne _080B0800\n\
+ mov r0, r8\n\
+ cmp r0, 0x4\n\
+ bne _080B0800\n\
+ mov r1, r9\n\
+ strh r6, [r1]\n\
+ b _080B08EA\n\
+ .align 2, 0\n\
+_080B07F4: .4byte gTasks\n\
+_080B07F8: .4byte gUnknown_02038696\n\
+_080B07FC: .4byte 0x00007fff\n\
+_080B0800:\n\
+ adds r0, r5, 0x2\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ cmp r5, 0xD\n\
+ bls _080B08EA\n\
+ movs r5, 0\n\
+ mov r0, r8\n\
+ adds r0, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r8, r0\n\
+ b _080B08EA\n\
+_080B0818:\n\
+ cmp r7, 0x2\n\
+ beq _080B0820\n\
+ cmp r7, 0x4\n\
+ bne _080B0896\n\
+_080B0820:\n\
+ adds r0, r6, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ cmp r6, 0x3\n\
+ bne _080B08EA\n\
+ movs r6, 0\n\
+ adds r0, r4, 0x5\n\
+ lsls r0, 4\n\
+ adds r0, 0x1\n\
+ ldr r2, _080B0854 @ =gUnknown_083CC5A4\n\
+ lsls r1, r4, 1\n\
+ adds r1, r2\n\
+ ldrh r3, [r1]\n\
+ movs r1, 0x3\n\
+ adds r2, r5, 0\n\
+ bl BlendPalette\n\
+ cmp r5, 0\n\
+ bne _080B0858\n\
+ mov r2, r8\n\
+ cmp r2, 0x2\n\
+ bne _080B0858\n\
+ mov r3, r9\n\
+ strh r6, [r3]\n\
+ b _080B08EA\n\
+ .align 2, 0\n\
+_080B0854: .4byte gUnknown_083CC5A4\n\
+_080B0858:\n\
+ adds r0, r5, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ cmp r5, 0xE\n\
+ bne _080B08EA\n\
+ movs r5, 0\n\
+ mov r0, r8\n\
+ adds r0, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r8, r0\n\
+ cmp r7, 0x4\n\
+ bne _080B08EA\n\
+ cmp r0, 0x1\n\
+ bne _080B08EA\n\
+ adds r4, 0x9\n\
+ lsls r4, 4\n\
+ adds r0, r4, 0x2\n\
+ movs r1, 0x1\n\
+ movs r2, 0x4\n\
+ movs r3, 0\n\
+ bl BlendPalette\n\
+ adds r4, 0x5\n\
+ adds r0, r4, 0\n\
+ movs r1, 0x1\n\
+ movs r2, 0x4\n\
+ movs r3, 0\n\
+ bl BlendPalette\n\
+ b _080B08EA\n\
+_080B0896:\n\
+ cmp r7, 0x3\n\
+ bne _080B08EA\n\
+ adds r0, r6, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ cmp r6, 0xC\n\
+ bne _080B08EA\n\
+ movs r6, 0\n\
+ adds r0, r4, 0x5\n\
+ lsls r0, 4\n\
+ adds r4, r0, 0x1\n\
+ adds r0, r4, 0\n\
+ movs r1, 0x3\n\
+ adds r2, r5, 0\n\
+ movs r3, 0\n\
+ bl BlendPalette\n\
+ adds r0, r5, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ cmp r5, 0x5\n\
+ bne _080B08EA\n\
+ ldr r0, _080B0930 @ =gPlttBufferFaded\n\
+ lsls r1, r4, 1\n\
+ adds r0, r1, r0\n\
+ ldrh r2, [r0]\n\
+ ldr r0, _080B0934 @ =gPlttBufferUnfaded\n\
+ adds r1, r0\n\
+ ldrh r0, [r1]\n\
+ ldr r1, _080B0938 @ =0x040000d4\n\
+ str r2, [r1]\n\
+ str r0, [r1, 0x4]\n\
+ movs r0, 0x80\n\
+ lsls r0, 24\n\
+ orrs r7, r0\n\
+ str r7, [r1, 0x8]\n\
+ ldr r0, [r1, 0x8]\n\
+ ldr r1, [sp, 0x8]\n\
+ ldr r2, [sp, 0xC]\n\
+ adds r0, r1, r2\n\
+ add r0, r10\n\
+ strh r6, [r0]\n\
+_080B08EA:\n\
+ ldr r3, [sp, 0x10]\n\
+ lsls r0, r3, 1\n\
+ ldr r1, [sp, 0xC]\n\
+ adds r0, r1\n\
+ add r0, r10\n\
+ mov r2, r8\n\
+ strh r2, [r0]\n\
+ ldr r3, [sp, 0x14]\n\
+ lsls r0, r3, 1\n\
+ adds r0, r1\n\
+ add r0, r10\n\
+ strh r5, [r0]\n\
+ ldr r1, [sp, 0x18]\n\
+ lsls r0, r1, 1\n\
+ ldr r2, [sp, 0xC]\n\
+ adds r0, r2\n\
+ add r0, r10\n\
+ strh r6, [r0]\n\
+ ldr r2, _080B093C @ =gTasks\n\
+_080B0910:\n\
+ ldr r0, [sp, 0x4]\n\
+ adds r0, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ str r0, [sp, 0x4]\n\
+ cmp r0, 0x3\n\
+ bhi _080B0920\n\
+ b _080B0774\n\
+_080B0920:\n\
+ movs r4, 0\n\
+ ldr r3, [sp, 0x1C]\n\
+ ldr r1, [sp]\n\
+ adds r0, r3, r1\n\
+ lsls r1, r0, 3\n\
+ adds r2, 0x8\n\
+ adds r0, r1, r2\n\
+ b _080B0950\n\
+ .align 2, 0\n\
+_080B0930: .4byte gPlttBufferFaded\n\
+_080B0934: .4byte gPlttBufferUnfaded\n\
+_080B0938: .4byte 0x040000d4\n\
+_080B093C: .4byte gTasks\n\
+_080B0940:\n\
+ adds r0, r4, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ cmp r4, 0x3\n\
+ bhi _080B0958\n\
+ lsls r0, r4, 3\n\
+ adds r0, r1\n\
+ adds r0, r2\n\
+_080B0950:\n\
+ movs r3, 0\n\
+ ldrsh r0, [r0, r3]\n\
+ cmp r0, 0\n\
+ beq _080B0940\n\
+_080B0958:\n\
+ cmp r4, 0x4\n\
+ bne _080B0980\n\
+ movs r4, 0\n\
+ ldr r3, _080B0990 @ =gSharedMem + 0x19338\n\
+ movs r5, 0x3\n\
+ negs r5, r5\n\
+_080B0964:\n\
+ lsls r1, r4, 2\n\
+ adds r1, r3\n\
+ ldrb r2, [r1, 0x2]\n\
+ adds r0, r5, 0\n\
+ ands r0, r2\n\
+ strb r0, [r1, 0x2]\n\
+ adds r0, r4, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ cmp r4, 0x3\n\
+ bls _080B0964\n\
+ ldr r0, [sp]\n\
+ bl DestroyTask\n\
+_080B0980:\n\
+ add sp, 0x20\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\
+_080B0990: .4byte gSharedMem + 0x19338\n\
+ .syntax divided\n");
+}
+#endif
+
+void unref_sub_80B0994(u8 a)
+{
+ if (a != 0)
+ sContest.unk1920A_2 = 1;
+}
+
+void sub_80B09B0(u8 a)
+{
+ if (sContestantStatus[a].unk15_4)
+ sub_80B0368(a);
+ else
+ sub_80B03A8(a);
+}
+
+extern const struct CompressedSpriteSheet gUnknown_083CC4B4[];
+extern const struct SpritePalette gUnknown_083CC4D4[];
+extern const struct SpriteTemplate gSpriteTemplate_83CC53C[];
+
+u8 sub_80B09E4(u8 a)
+{
+ u8 r5 = gUnknown_02038696[a] * 40 + 32;
+ u8 r8;
+ u8 r6;
+ volatile u8 zero;
+
+ LoadCompressedObjectPic(&gUnknown_083CC4B4[a]);
+ LoadSpritePalette(&gUnknown_083CC4D4[a]);
+ r8 = CreateSprite(&gSpriteTemplate_83CC53C[a], 184, r5, 29);
+ r6 = CreateSprite(&gSpriteTemplate_83CC53C[a], 248, r5, 29);
+ gSprites[r6].oam.tileNum += 64;
+
+ CopySpriteTiles(0, 3, (void *)VRAM, (u16 *)(VRAM + 0xE000 + gUnknown_02038696[a] * 5 * 64 + 0x26), (u8 *)(VRAM + 0x10000 + gSprites[r8].oam.tileNum * 32));
+ CopySpriteTiles(0, 3, (void *)VRAM, (u16 *)(VRAM + 0xE000 + gUnknown_02038696[a] * 5 * 64 + 0x36), (u8 *)(VRAM + 0x10000 + gSprites[r6].oam.tileNum * 32));
+
+ {
+ void *dest = (void *)(VRAM + 0x10000 + (0x28 + gSprites[r8].oam.tileNum) * 32);
+ u32 size = 0x300;
+ DmaFill32(3, 0, dest, size);
+ }
+
+ // What is this?
+ zero = 0;
+ zero = 0;
+
+ {
+ void *dest = (void *)(VRAM + 0x10000 + (0x28 + gSprites[r6].oam.tileNum) * 32);
+ u32 size = 0x300;
+ DmaFill32(3, 0, dest, size);
+ }
+
+ gSprites[r8].data[0] = r6;
+ gSprites[r6].data[0] = r8;
+ gSprites[r8].data[1] = a;
+ gSprites[r6].data[1] = a;
+ return r8;
+}
+
+void sub_80B0B5C(u8 spriteId)
+{
+ u8 spriteId2 = gSprites[spriteId].data[0];
+
+ FreeSpriteOamMatrix(&gSprites[spriteId2]);
+ DestroySprite(&gSprites[spriteId2]);
+ DestroySpriteAndFreeResources(&gSprites[spriteId]);
+}
+
+void sub_80B0B98(void)
+{
+ REG_BLDCNT = 0x3F40;
+ REG_BLDALPHA = 0x0907;
+}
+
+void sub_80B0BB4(void)
+{
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+}
+
+void sub_80B0BC4(u8 a, bool8 b)
+{
+ u8 r5;
+
+ sub_80B0B98();
+ shared19338[gSprites[a].data[1]].unk2_1 = 1;
+ r5 = gSprites[a].data[0];
+ StartSpriteAffineAnim(&gSprites[a], 1);
+ StartSpriteAffineAnim(&gSprites[r5], 1);
+ gSprites[a].callback = sub_80B0C5C;
+ gSprites[r5].callback = SpriteCallbackDummy;
+ if (b == FALSE)
+ PlaySE(SE_C_PIKON);
+ else
+ PlaySE(SE_PC_LOGON);
+}
+
+void sub_80B0C5C(struct Sprite *sprite)
+{
+ if (sprite->affineAnimEnded)
+ {
+ u8 r1 = sprite->data[0];
+
+ if (gSprites[r1].affineAnimEnded)
+ {
+ sprite->invisible = TRUE;
+ gSprites[r1].invisible = TRUE;
+ sprite->callback = sub_80B0CB0;
+ }
+ }
+}
+
+void sub_80B0CB0(struct Sprite *sprite)
+{
+ shared19338[sprite->data[1]].unk2_1 = 0;
+ sub_80B0B5C(sprite->data[0]);
+ sub_80B0BB4();
+}
+
+void sub_80B0CDC(u8 a, int unused)
+{
+ shared19338[a].unk2_1 = 0;
+}
+
+void unref_sub_80B0CF4(void)
+{
+ //shared18000.unk18000 ^= 1;
+ gSharedMem[0x18000] ^= 1;
+ //if (shared18000.unk18000 == 0)
+ if (gSharedMem[0x18000] == 0)
+ {
+ u8 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ FillWindowRect_DefaultPalette(
+ &gUnknown_03004210,
+ 0,
+ gUnknown_083CA308[i][0],
+ gUnknown_083CA308[i][1],
+ gUnknown_083CA310[i][0] + 5,
+ gUnknown_083CA310[i][1] + 1);
+ }
+ sub_80AE514();
+ sub_80AEB30();
+ }
+ else
+ {
+ sub_80B0D7C();
+ }
+}
+
+void sub_80B0D7C(void)
+{
+ u8 r5 = 0;
+ u8 sp8[8];
+
+ if (gSharedMem[0x18000] != 0)
+ {
+ u8 i;
+ s16 r2;
+
+ for (i = 0; i < 4; i++)
+ {
+ FillWindowRect_DefaultPalette(
+ &gUnknown_03004210,
+ 0,
+ gUnknown_083CA308[i][0],
+ gUnknown_083CA308[i][1],
+ gUnknown_083CA310[i][0] + 5,
+ gUnknown_083CA310[i][1] + 1);
+ }
+ for (i = 0; i < 4; i++)
+ {
+ r2 = sContestantStatus[i].unk4;
+ if (r2 < 0)
+ {
+ r2 = -r2;
+ sp8[0] = CHAR_HYPHEN;
+ r5++;
+ }
+ ConvertIntToDecimalStringN(sp8 + r5, r2, 0, 4);
+ sub_8003460(
+ &gUnknown_03004210,
+ sp8,
+ 592 + gUnknown_02038696[i] * 22,
+ gUnknown_083CA310[gUnknown_02038696[i]][0],
+ gUnknown_083CA310[gUnknown_02038696[i]][1]);
+ r5 = 0;
+ }
+ for (i = 0; i < 4; i++)
+ {
+ r2 = sContestantStatus[i].appeal2;
+ if (r2 < 0)
+ {
+ r2 = -r2;
+ sp8[0] = CHAR_HYPHEN;
+ r5++;
+ }
+ ConvertIntToDecimalStringN(sp8 + r5, r2, 0, 4);
+ sub_8003460(
+ &gUnknown_03004210,
+ sp8,
+ 512 + gUnknown_02038696[i] * 20,
+ gUnknown_083CA308[gUnknown_02038696[i]][0],
+ gUnknown_083CA308[gUnknown_02038696[i]][1]);
+ r5 = 0;
+ }
+ sub_80AEB30();
+ }
+}
+
+void unref_sub_80B0EE8(s32 *a, s32 b)
+{
+ s32 i;
+ s32 j;
+
+ for (i = 0; i < b - 1; i++)
+ {
+ for (j = b - 1; j > i; j--)
+ {
+ if (a[j - 1] > a[j])
+ {
+ s32 temp = a[j];
+
+ a[j] = a[j - 1];
+ a[j - 1] = temp;
+ }
+ }
+ }
+}
+
+// something to do with contest NPC opponents, I think.
+void sub_80B0F28(u8 a)
+{
+ u8 sp0[4];
+ u16 sp4[4] = {0};
+ s32 i;
+ s32 r2;
+ s32 r4;
+
+ for (i = 0; i < 4; i++)
+ {
+ sp4[i] = Random();
+ for (r2 = 0; r2 < i; r2++)
+ {
+ if (sp4[i] == sp4[r2])
+ {
+ i--;
+ break;
+ }
+ }
+ }
+
+ if (a == 0)
+ {
+ for (i = 0; i < 4; i++)
+ {
+ gUnknown_02038696[i] = i;
+ for (r4 = 0; r4 < i; r4++)
+ {
+ if (gUnknown_02038670[gUnknown_02038696[r4]] < gUnknown_02038670[i]
+ || (gUnknown_02038670[gUnknown_02038696[r4]] == gUnknown_02038670[i] && sp4[gUnknown_02038696[r4]] < sp4[i]))
+ {
+ for (r2 = i; r2 > r4; r2--)
+ gUnknown_02038696[r2] = gUnknown_02038696[r2 - 1];
+ gUnknown_02038696[r4] = i;
+ break;
+ }
+ }
+ if (r4 == i)
+ gUnknown_02038696[i] = i;
+ }
+ memcpy(sp0, gUnknown_02038696, sizeof(sp0));
+ for (i = 0; i < 4; i++)
+ gUnknown_02038696[sp0[i]] = i;
+ }
+ else
+ {
+ memset(sp0, 0xFF, sizeof(sp0));
+ for (i = 0; i < 4; i++)
+ {
+ u8 r2 = sContestantStatus[i].unkB_0;
+
+ while (1)
+ {
+ u8 *ptr = &sp0[r2];
+ if (*ptr == 0xFF)
+ {
+ *ptr = i;
+ gUnknown_02038696[i] = r2;
+ break;
+ }
+ r2++;
+ }
+ }
+ for (i = 0; i < 3; i++)
+ {
+ for (r4 = 3; r4 > i; r4--)
+ {
+ if (sContestantStatus[r4 - 1].unkB_0 == sContestantStatus[r4].unkB_0
+ && gUnknown_02038696[r4 - 1] < gUnknown_02038696[r4]
+ && sp4[r4 - 1] < sp4[r4])
+ {
+ u8 temp = gUnknown_02038696[r4];
+
+ gUnknown_02038696[r4] = gUnknown_02038696[r4 - 1];
+ gUnknown_02038696[r4 - 1] = temp;
+ }
+ }
+ }
+ }
+}
+
+void sub_80B1118(void)
+{
+ s32 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ //LoadPalette(shared18000.unk18004[5 + i], (gUnknown_02038696[i] + 5) * 16, 32);
+ LoadPalette(shared18004 + (i + 5) * 16, (gUnknown_02038696[i] + 5) * 16, 32);
+ }
+ sub_80AE514();
+}
+
+void sub_80B114C(u8 contestant)
+{
+ bool8 r8;
+ s32 i;
+
+ sContestantStatus[contestant].appeal2 = 0;
+ sContestantStatus[contestant].appeal1 = 0;
+ r8 = sub_80AF404(contestant);
+ if (r8)
+ {
+ u16 move = sContestantStatus[contestant].currMove;
+ u8 effect = gContestMoves[move].effect;
+ u8 rnd;
+
+ sContestantStatus[contestant].moveCategory = gContestMoves[sContestantStatus[contestant].currMove].contestCategory;
+ if (sContestantStatus[contestant].currMove == sContestantStatus[contestant].prevMove && sContestantStatus[contestant].currMove != MOVE_NONE)
+ {
+ sContestantStatus[contestant].disappointedRepeat = TRUE;
+ sContestantStatus[contestant].moveRepeatCount++;
+ }
+ else
+ {
+ sContestantStatus[contestant].moveRepeatCount = 0;
+ }
+ sContestantStatus[contestant].appeal1 = gContestEffects[effect].appeal;
+ sContestantStatus[contestant].appeal2 = gContestEffects[effect].appeal;
+ shared192D0.unk4 = gContestEffects[effect].jam;
+ shared192D0.unk6 = gContestEffects[effect].jam;
+ shared192D0.unk11 = contestant;
+ for (i = 0; i < 4; i++)
+ {
+ sContestantStatus[i].unkE = 0;
+ shared192D0.unkD[i] = 0;
+ }
+ if (sContestantStatus[contestant].unk15_4 && AreMovesContestCombo(sContestantStatus[contestant].prevMove, sContestantStatus[contestant].currMove) == 0)
+ sContestantStatus[contestant].unk15_4 = 0;
+ gContestEffectFuncs[effect]();
+ if (sContestantStatus[contestant].unk10_4 == 1)
+ sContestantStatus[contestant].appeal2 += sContestantStatus[contestant].unkD - 10;
+ else if (sContestantStatus[contestant].unk11_5)
+ sContestantStatus[contestant].appeal2 += sContestantStatus[contestant].unkD * 3;
+ else
+ sContestantStatus[contestant].appeal2 += sContestantStatus[contestant].unkD;
+ sContestantStatus[contestant].unk16 = 0;
+ sContestantStatus[contestant].unk15_6 = 0;
+ if (sub_80B214C(contestant))
+ {
+ u8 r2 = AreMovesContestCombo(sContestantStatus[contestant].prevMove, sContestantStatus[contestant].currMove);
+
+ if (r2 != 0 && sContestantStatus[contestant].unk15_4)
+ {
+ sContestantStatus[contestant].unk16 = r2;
+ sContestantStatus[contestant].unk15_6 = 1;
+ sContestantStatus[contestant].unk15_4 = 0;
+ sContestantStatus[contestant].unk17 = sContestantStatus[contestant].appeal1 * sContestantStatus[contestant].unk16;
+ sContestantStatus[contestant].unk15_3 = 1;
+ }
+ else
+ {
+ if (gContestMoves[sContestantStatus[contestant].currMove].comboStarterId != 0)
+ {
+ sContestantStatus[contestant].unk15_4 = 1;
+ sContestantStatus[contestant].unk15_6 = 1;
+ }
+ else
+ {
+ sContestantStatus[contestant].unk15_4 = 0;
+ }
+ }
+ }
+ if (sContestantStatus[contestant].disappointedRepeat)
+ sContestantStatus[contestant].unk18 = (sContestantStatus[contestant].moveRepeatCount + 1) * 10;
+ if (sContestantStatus[contestant].unkC_0)
+ {
+ sContestantStatus[contestant].unk15_4 = 0;
+ sContestantStatus[contestant].appeal2 = 0;
+ sContestantStatus[contestant].appeal1 = 0;
+ }
+ shared19328.bits_0 = Contest_GetMoveExcitement(sContestantStatus[contestant].currMove);
+ if (sContestantStatus[contestant].unk11_4)
+ shared19328.bits_0 = 1;
+ if (shared19328.bits_0 > 0)
+ {
+ if (sContest.applauseLevel + shared19328.bits_0 > 4)
+ shared19328.unk2 = 60;
+ else
+ shared19328.unk2 = 10;
+ }
+ else
+ {
+ shared19328.unk2 = 0;
+ }
+
+ rnd = Random() % 3;
+ for (i = 0; i < 4; i++)
+ {
+ if (i != contestant)
+ {
+ if (rnd == 0)
+ break;
+ rnd--;
+ }
+ }
+ sContestantStatus[contestant].unk1B = i;
+ }
+}
+
+void sub_80B13EC(u8 a, u8 b)
+{
+ sContestantStatus[a].unk13 = b;
+}
+
+void sub_80B1404(u8 a, u8 b)
+{
+ sContestantStatus[a].unk14 = b;
+}
+
+void sub_80B141C(u8 a, u8 b)
+{
+ if (b >= 60)
+ sub_80B13EC(a, 53);
+ else if (b >= 40)
+ sub_80B13EC(a, 52);
+ else if (b >= 30)
+ sub_80B13EC(a, 51);
+ else if (b >= 20)
+ sub_80B13EC(a, 50);
+ else if (b >= 10)
+ sub_80B13EC(a, 49);
+}
+
+void sub_80B146C(u8 a, u8 b)
+{
+ StringCopy(gStringVar1, gContestMons[a].nickname);
+ StringCopy(gStringVar2, gMoveNames[sContestantStatus[a].currMove]);
+ if (gContestMoves[sContestantStatus[shared192D0.unk11].currMove].contestCategory == CONTEST_CATEGORY_COOL)
+ StringCopy(gStringVar3, gText_Contest_Shyness);
+ else if (gContestMoves[sContestantStatus[shared192D0.unk11].currMove].contestCategory == CONTEST_CATEGORY_BEAUTY)
+ StringCopy(gStringVar3, gText_Contest_Anxiety);
+ else if (gContestMoves[sContestantStatus[shared192D0.unk11].currMove].contestCategory == CONTEST_CATEGORY_CUTE)
+ StringCopy(gStringVar3, gText_Contest_Laziness);
+ else if (gContestMoves[sContestantStatus[shared192D0.unk11].currMove].contestCategory == CONTEST_CATEGORY_SMART)
+ StringCopy(gStringVar3, gText_Contest_Hesitancy);
+ else
+ StringCopy(gStringVar3, gText_Contest_Fear);
+ StringExpandPlaceholders(gStringVar4, gUnknown_083CC188[b]);
+ sub_80AF138();
+ sub_8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15);
+}
+
+void sub_80B157C(u8 p)
+{
+ sContestantStatus[p].unkC_0 = 1;
+ sContestantStatus[p].currMove = MOVE_NONE;
+}
+
+// Determines turn order?
+void sub_80B159C(void)
+{
+ u8 r12 = 0;
+ s32 i;
+ s32 j;
+ u8 sp0[4];
+ u8 sp4[4];
+
+ for (i = 0; i < 4; i++)
+ {
+ sp0[i] = gUnknown_02038696[i];
+ sp4[i] = 0;
+ }
+
+ for (i = 0; i < 4; i++)
+ {
+ for (j = 0; j < 4; j++)
+ {
+ if (sContestantStatus[j].unk19 == i)
+ {
+ sp0[j] = i;
+ sp4[j] = 1;
+ break;
+ }
+ }
+ if (j == 4)
+ {
+ for (j = 0; j < 4; j++)
+ {
+ if (sp4[j] == 0 && sContestantStatus[j].unk19 == 0xFF)
+ {
+ r12 = j;
+ j++;
+ break;
+ }
+ }
+ for (; j < 4; j++)
+ {
+ if (sp4[j] == 0 && sContestantStatus[j].unk19 == 0xFF
+ && gUnknown_02038696[r12] > gUnknown_02038696[j])
+ r12 = j;
+ }
+ sp0[r12] = i;
+ sp4[r12] = 1;
+ }
+ }
+
+ for (i = 0; i < 4; i++)
+ {
+ shared192D0.unk0[i] = sp0[i];
+ sContestantStatus[i].unk19 = 0xFF;
+ sContestantStatus[i].unk10_6 = 0;
+ gUnknown_02038696[i] = sp0[i];
+ }
+}
+
+void sub_80B16D0(struct Sprite *sprite)
+{
+ if (sprite->data[1]++ > 84)
+ {
+ sprite->data[1] = 0;
+ sprite->invisible = TRUE;
+ sprite->callback = SpriteCallbackDummy;
+ sContest.unk1920A_4 = 0;
+ }
+}
+
+void sub_80B1710(u8 a)
+{
+ u8 spriteId = sContest.unk19216;
+
+ switch (a)
+ {
+ case 0:
+ case 1:
+ gSprites[spriteId].oam.tileNum = gSprites[spriteId].data[0];
+ PlaySE(SE_HAZURE);
+ break;
+ case 2:
+ gSprites[spriteId].oam.tileNum = gSprites[spriteId].data[0] + 4;
+ PlaySE(SE_SEIKAI);
+ break;
+ case 3:
+ gSprites[spriteId].oam.tileNum = gSprites[spriteId].data[0] + 8;
+ PlaySE(SE_SEIKAI);
+ break;
+ case 4:
+ gSprites[spriteId].oam.tileNum = gSprites[spriteId].data[0] + 12;
+ PlaySE(SE_TK_WARPIN);
+ break;
+ case 5: // exactly the same as case 4
+ gSprites[spriteId].oam.tileNum = gSprites[spriteId].data[0] + 12;
+ PlaySE(SE_TK_WARPIN);
+ break;
+ case 6:
+ gSprites[spriteId].oam.tileNum = gSprites[spriteId].data[0] + 16;
+ PlaySE(SE_TK_WARPIN);
+ break;
+ case 8:
+ gSprites[spriteId].oam.tileNum = gSprites[spriteId].data[0] + 24;
+ PlaySE(SE_W215);
+ break;
+ case 7:
+ default:
+ gSprites[spriteId].oam.tileNum = gSprites[spriteId].data[0] + 20;
+ PlaySE(SE_TK_WARPIN);
+ break;
+ }
+ gSprites[spriteId].data[1] = 0;
+ gSprites[spriteId].invisible = FALSE;
+ gSprites[spriteId].callback = sub_80B16D0;
+ sContest.unk1920A_4 = 1;
+}
+
+void sub_80B1928(void)
+{
+ s32 i;
+
+ for (i = 0; i < 5; i++)
+ {
+ const u8 *src;
+
+ if (i < sContest.applauseLevel)
+ src = gContestApplauseMeterGfx + 64;
+ else
+ src = gContestApplauseMeterGfx;
+ CpuCopy32(src, (void *)(VRAM + 0x10000 + (gSprites[sContest.applauseMeterSpriteId].oam.tileNum + 17 + i) * 32), 32);
+ CpuCopy32(src + 32, (void *)(VRAM + 0x10000 + (gSprites[sContest.applauseMeterSpriteId].oam.tileNum + 25 + i) * 32), 32);
+ if (sContest.applauseLevel > 4)
+ sub_80B1A2C();
+ }
+}
+
+void unref_sub_80B19D0(void)
+{
+ u8 str[20];
+ StringCopy(str, gUnknown_083CC2EC);
+ sub_8003460(&gUnknown_03004210, str, 680, 0, 0);
+}
+
+s8 Contest_GetMoveExcitement(u16 move)
+{
+ return gContestExcitementTable[gSpecialVar_ContestCategory][gContestMoves[move].contestCategory];
+}
+
+// Launches crowd movement task, maybe
+u8 sub_80B1A2C(void)
+{
+ u8 taskId = CreateTask(c3_08130B10, 10);
+
+ gTasks[taskId].data[1] = 1;
+ gTasks[taskId].data[2] = IndexOfSpritePaletteTag(0x0ABE2);
+ return taskId;
+}
+
+void c3_08130B10(u8 taskId)
+{
+ if (++gTasks[taskId].data[0] == 1)
+ {
+ gTasks[taskId].data[0] = 0;
+ if (gTasks[taskId].data[3] == 0)
+ gTasks[taskId].data[4]++;
+ else
+ gTasks[taskId].data[4]--;
+ BlendPalette(264 + gTasks[taskId].data[2] * 16, 1, gTasks[taskId].data[4], 0x7FFF);
+ if (gTasks[taskId].data[4] == 0 || gTasks[taskId].data[4] == 16)
+ {
+ gTasks[taskId].data[3] ^= 1;
+ if (sContest.applauseLevel < 5)
+ {
+ BlendPalette(264 + gTasks[taskId].data[2] * 16, 1, 0, 31);
+ DestroyTask(taskId);
+ }
+ }
+ }
+}
+
+void sub_80B1B14(void)
+{
+ CreateTask(sub_80B1B68, 10);
+ gSprites[sContest.applauseMeterSpriteId].pos2.x = -70;
+ gSprites[sContest.applauseMeterSpriteId].invisible = FALSE;
+ sContest.unk1920A_6 = 1;
+}
+
+void sub_80B1B68(u8 taskId)
+{
+ struct Sprite *sprite = &gSprites[sContest.applauseMeterSpriteId];
+
+ gTasks[taskId].data[10] += 1664;
+ sprite->pos2.x += gTasks[taskId].data[10] >> 8;
+ gTasks[taskId].data[10] = gTasks[taskId].data[10] & 0xFF;
+ if (sprite->pos2.x > 0)
+ sprite->pos2.x = 0;
+ if (sprite->pos2.x == 0)
+ {
+ sContest.unk1920A_6 = 0;
+ DestroyTask(taskId);
+ }
+}
+
+void sub_80B1BDC(void)
+{
+ if (gSprites[sContest.applauseMeterSpriteId].invisible == TRUE)
+ {
+ sContest.unk1920A_6 = 0;
+ }
+ else
+ {
+ CreateTask(sub_80B1C34, 10);
+ gSprites[sContest.applauseMeterSpriteId].pos2.x = 0;
+ sContest.unk1920A_6 = 1;
+ }
+}
+
+void sub_80B1C34(u8 taskId)
+{
+ struct Sprite *sprite = &gSprites[sContest.applauseMeterSpriteId];
+
+ gTasks[taskId].data[10] += 1664;
+ sprite->pos2.x -= gTasks[taskId].data[10] >> 8;
+ gTasks[taskId].data[10] = gTasks[taskId].data[10] & 0xFF;
+ if (sprite->pos2.x < -70)
+ sprite->pos2.x = -70;
+ if (sprite->pos2.x == -70)
+ {
+ sprite->invisible = TRUE;
+ sContest.unk1920A_6 = 0;
+ DestroyTask(taskId);
+ }
+}
+
+void sub_80B1CBC(s8 a)
+{
+ u8 taskId = CreateTask(sub_80B1CFC, 5);
+
+ gTasks[taskId].data[0] = a;
+ sContest.unk1920A_5 = 1;
+}
+
+void sub_80B1CFC(u8 taskId)
+{
+ switch (gTasks[taskId].data[10])
+ {
+ case 0:
+ sub_80B1B14();
+ gTasks[taskId].data[10]++;
+ break;
+ case 1:
+ if (!sContest.unk1920A_6)
+ {
+ nullsub_18(gTasks[taskId].data[0]);
+ gTasks[taskId].data[10]++;
+ }
+ break;
+ case 2:
+ if (gTasks[taskId].data[11]++ > 20)
+ {
+ gTasks[taskId].data[11] = 0;
+ sub_80B1928();
+ sContest.unk1920A_5 = 0;
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+void unref_sub_80B1D84(void)
+{
+ gSprites[sContest.applauseMeterSpriteId].pos2.x = 0;
+ gSprites[sContest.applauseMeterSpriteId].invisible = FALSE;
+}
+
+void unref_sub_80B1DB8(void)
+{
+ gSprites[sContest.applauseMeterSpriteId].invisible = TRUE;
+}
+
+void sub_80B1DDC(void)
+{
+ CreateTask(sub_80B1DFC, 15);
+ sContest.unk1920A_7 = 1;
+}
+
+void sub_80B1DFC(u8 taskId)
+{
+ if (gTasks[taskId].data[10]++ > 6)
+ {
+ register struct Task *task asm("r0");
+ register u32 r4 asm("r4") = taskId * 4;
+
+ gTasks[taskId].data[10] = 0;
+ if (gTasks[taskId].data[11] == 0)
+ {
+ DmaCopy32Defvars(3, shared16800, (void *)(VRAM + 0x2000), 0x1000);
+ }
+ else
+ {
+ DmaCopy32Defvars(3, shared15800, (void *)(VRAM + 0x2000), 0x1000);
+ gTasks[taskId].data[12]++;
+ }
+
+ // Why won't this match the normal way?
+ asm("add %0, %1, #0\n\t"
+ "add %0, %3\n\t"
+ "lsl %0, #3\n\t"
+ "add %0, %2\n\t"
+ : "=r"(task):"r"(r4),"r"(gTasks),"r"(taskId));
+
+ //gTasks[taskId].data[11] ^= 1;
+ task->data[11] ^= 1;
+
+ //if (gTasks[taskId].data[12] == 9)
+ if (task->data[12] == 9)
+ {
+ sContest.unk1920A_7 = 0;
+ DestroyTask(taskId);
+ }
+ }
+}
+
+#define tBlendColor data[0]
+#define tBlendCoeff data[1]
+
+void sub_80B1EA8(s8 a, s8 b)
+{
+ u8 taskId = CreateTask(sub_80B1F4C, 10);
+ u16 blendColor;
+ u8 blendCoeff;
+ u8 r3;
+
+ if (a > 0)
+ {
+ blendColor = RGB(30, 27, 8);
+ if (b > 0)
+ {
+ blendCoeff = 0;
+ r3 = sContest.applauseLevel * 3;
+ }
+ else
+ {
+ blendCoeff = sContest.applauseLevel * 3;
+ r3 = 0;
+ }
+ }
+ else
+ {
+ blendColor = 0;
+ if (b > 0)
+ {
+ blendCoeff = 0;
+ r3 = 12;
+ }
+ else
+ {
+ blendCoeff = 12;
+ r3 = 0;
+ }
+ }
+ gTasks[taskId].tBlendColor = blendColor;
+ gTasks[taskId].tBlendCoeff = blendCoeff;
+ gTasks[taskId].data[2] = b;
+ gTasks[taskId].data[3] = r3;
+ sContest.unk1920B_0 = 0;
+}
+
+void sub_80B1F4C(u8 taskId)
+{
+ if (gTasks[taskId].data[10]++ >= 0)
+ {
+ gTasks[taskId].data[10] = 0;
+ if (gTasks[taskId].data[2] > 0)
+ gTasks[taskId].tBlendCoeff++;
+ else
+ gTasks[taskId].tBlendCoeff--;
+ BlendPalette(17, 1, gTasks[taskId].tBlendCoeff, gTasks[taskId].tBlendColor);
+ BlendPalette(26, 1, gTasks[taskId].tBlendCoeff, gTasks[taskId].tBlendColor);
+ if (gTasks[taskId].tBlendCoeff == gTasks[taskId].data[3])
+ {
+ DestroyTask(taskId);
+ sContest.unk1920B_0 = 0;
+ }
+ }
+}
+
+#undef tBlendColor
+#undef tBlendCoeff
+
+void sub_80B1FD0(bool8 a)
+{
+ s32 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (sContestantStatus[i].unk10_6 != 0 && a)
+ {
+ CpuCopy32(
+ GetTurnOrderNumberGfx(i),
+ (void *)(VRAM + 0x10000 + (gSprites[shared19338[i].unk1].oam.tileNum + 5) * 32),
+ 64);
+ gSprites[shared19338[i].unk1].pos1.y = gUnknown_083CA33C[gUnknown_02038696[i]];
+ gSprites[shared19338[i].unk1].invisible = FALSE;
+ }
+ else
+ {
+ gSprites[shared19338[i].unk1].invisible = TRUE;
+ }
+ }
+}
+
+const u8 *GetTurnOrderNumberGfx(u8 contestant)
+{
+ if (sContestantStatus[contestant].unk10_6 != 1)
+ return gContestNextTurnRandomGfx;
+ else
+ return gContestNextTurnNumbersGfx + sContestantStatus[contestant].unk19 * 64;
+}
+
+void sub_80B20C4(void)
+{
+ s32 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (shared192D0.unkD[i] != 0 && !Contest_IsMonsTurnDisabled(i))
+ {
+ u8 r4 = gUnknown_02038696[i] * 5 + 2;
+ u16 r0 = sub_80AEFE8(i, 3);
+
+ *(u16 *)(VRAM + 0xC000 + r4 * 64 + 0x28) = r0;
+ *(u16 *)(VRAM + 0xC000 + r4 * 64 + 0x2A) = r0 + 1;
+ *(u16 *)(VRAM + 0xC000 + (r4 + 1) * 64 + 0x28) = r0 + 16;
+ *(u16 *)(VRAM + 0xC000 + (r4 + 1) * 64 + 0x2A) = r0 + 17;
+ PlaySE(SE_C_PASI);
+ }
+ }
+}
+
+bool8 sub_80B214C(u8 a)
+{
+ if (sContestantStatus[a].disappointedRepeat || sContestantStatus[a].unkC_0)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+void sub_80B2184(void)
+{
+ s32 i;
+
+ ((vBgCnt *)&REG_BG1CNT)->priority = 0;
+ ((vBgCnt *)&REG_BG1CNT)->screenSize = 1;
+ ((vBgCnt *)&REG_BG1CNT)->areaOverflowMode = 0;
+
+ gBattle_BG1_X = DISPLAY_WIDTH;
+ gBattle_BG1_Y = DISPLAY_HEIGHT;
+ REG_BG1HOFS = DISPLAY_WIDTH;
+ REG_BG1VOFS = DISPLAY_HEIGHT;
+
+ DmaClear32(3, (void *)(VRAM + 0xF000), 0x1000);
+ LZDecompressVram(gUnknown_08D17C3C, (void *)(VRAM + 0xF000));
+
+ ((vBgCnt *)&REG_BG1CNT)->charBaseBlock = 0;
+
+ for (i = 0; i < 4; i++)
+ {
+ gSprites[shared19338[i].unk0].oam.priority = 1;
+ gSprites[shared19338[i].unk1].oam.priority = 1;
+ }
+
+ ((vBgCnt *)&REG_BG2CNT)->priority = 1;
+ ((vBgCnt *)&REG_BG0CNT)->priority = 1;
+ ((vBgCnt *)&REG_BG1CNT)->screenSize = 2;
+}
+
+void sub_80B2280(void)
+{
+ s32 i;
+
+ DmaClearLarge32(3, (void *)(VRAM + 0x8000), 0x2000, 0x1000);
+ DmaClear32(3, (void *)(VRAM + 0xF000), 0x1000);
+
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+
+ ((vBgCnt *)&REG_BG1CNT)->priority = 1;
+ ((vBgCnt *)&REG_BG1CNT)->screenSize = 0;
+ ((vBgCnt *)&REG_BG1CNT)->areaOverflowMode = 0;
+ ((vBgCnt *)&REG_BG1CNT)->charBaseBlock = 2;
+
+ for (i = 0; i < 4; i++)
+ {
+ gSprites[shared19338[i].unk0].oam.priority = 0;
+ gSprites[shared19338[i].unk1].oam.priority = 0;
+ }
+}
+
+void sub_80B237C(u8 taskId)
+{
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = DISPLAY_HEIGHT;
+ PlaySE12WithPanning(SE_C_MAKU_D, 0);
+ gTasks[taskId].func = sub_80B23BC;
+}
+
+void sub_80B23BC(u8 taskId)
+{
+ gBattle_BG1_Y -= 7;
+ if (gBattle_BG1_Y < 0)
+ gBattle_BG1_Y = 0;
+ if (*(u16 *)&gBattle_BG1_Y == 0) // Why cast?
+ {
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].func = sub_80B2400;
+ }
+}
+
+void sub_80B2400(u8 taskId)
+{
+ s32 i;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ for (i = 0; i < 4; i++)
+ sContest.unk19218[i] = gUnknown_02038696[i];
+ sub_80AFA5C();
+ sub_80B0588();
+ sub_80AEF50();
+ sub_80B1118();
+ sub_80B1FD0(TRUE);
+ sub_80AFFA0();
+ gTasks[taskId].data[0] = 1;
+ break;
+ case 1:
+ if (gIsLinkContest & 1)
+ {
+ u8 taskId2;
+
+ sContest.unk1920B_2 = 1;
+ if (sub_80AE074())
+ sub_80AF438();
+ taskId2 = CreateTask(sub_80C8C80, 0);
+ SetTaskFuncWithFollowupFunc(taskId2, sub_80C8C80, sub_80AD8DC);
+ sub_80AF860();
+ gTasks[taskId].data[0] = 2;
+ }
+ else
+ {
+ sub_80AF438();
+ gTasks[taskId].data[0] = 3;
+ }
+ break;
+ case 2:
+ if (!sContest.unk1920B_2)
+ gTasks[taskId].data[0] = 3;
+ break;
+ case 3:
+ sub_80AF120();
+ sub_80AEB30();
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_80B253C;
+ break;
+ }
+}
+
+void sub_80B2508(u8 taskId)
+{
+ gBattle_BG1_Y += 7;
+ if (gBattle_BG1_Y > DISPLAY_HEIGHT)
+ gTasks[taskId].func = sub_80ADCDC;
+}
+
+void sub_80B253C(u8 taskId)
+{
+ if (gTasks[taskId].data[2] < 10)
+ {
+ gTasks[taskId].data[2]++;
+ }
+ else
+ {
+ if (gTasks[taskId].data[1] == 0)
+ {
+ if (gTasks[taskId].data[0] == 16)
+ gTasks[taskId].data[1]++;
+ else
+ gTasks[taskId].data[0]++;
+ }
+ else
+ {
+ if (gTasks[taskId].data[0] == 0)
+ {
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].func = sub_80B25A4;
+ }
+ else
+ {
+ gTasks[taskId].data[0]--;
+ }
+ }
+ }
+}
+
+void sub_80B25A4(u8 taskId)
+{
+ if (gTasks[taskId].data[2] < 10)
+ {
+ gTasks[taskId].data[2]++;
+ }
+ else
+ {
+ gTasks[taskId].data[2] = 0;
+ PlaySE12WithPanning(SE_C_MAKU_U, 0);
+ gTasks[taskId].func = sub_80B2508;
+ }
+}
+
+void sub_80B25E4(u8 a)
+{
+ s32 i;
+ u8 taskId;
+
+ for (i = 0; i < 4; i++)
+ {
+ gSprites[shared19338[i].unk0].oam.matrixNum = AllocOamMatrix();
+ gSprites[shared19338[i].unk0].oam.affineMode = 1;
+ StartSpriteAffineAnim(&gSprites[shared19338[i].unk0], a);
+ if (a == 2)
+ {
+ AnimateSprite(&gSprites[shared19338[i].unk0]);
+ gSprites[shared19338[i].unk0].invisible = FALSE;
+ }
+ }
+ taskId = CreateTask(sub_80B26C8, 5);
+ gTasks[taskId].data[0] = a;
+ sContest.unk1920B_1 = 1;
+}
+
+void sub_80B26C8(u8 taskId)
+{
+ s32 i;
+
+ if (gSprites[shared19338[0].unk0].affineAnimEnded)
+ {
+ if ((u8)gTasks[taskId].data[0] == 1)
+ {
+ for (i = 0; i < 4; i++)
+ gSprites[shared19338[i].unk0].invisible = TRUE;
+ }
+ for (i = 0; i < 4; i++)
+ FreeSpriteOamMatrix(&gSprites[shared19338[i].unk0]);
+ sContest.unk1920B_1 = 0;
+ DestroyTask(taskId);
+ }
+}
+
+u16 SanitizeMove(u16 move)
+{
+ if (move >= NUM_MOVES)
+ move = MOVE_POUND;
+ return move;
+}
+
+u16 SanitizeSpecies(u16 species)
+{
+ if (species >= NUM_SPECIES)
+ species = SPECIES_NONE;
+ return species;
+}
+
+void sub_80B2790(u8 a)
+{
+ s32 i;
+ u16 move = SanitizeMove(sContestantStatus[a].currMove);
+ u16 species = SanitizeSpecies(gContestMons[a].species);
+ u8 r5_2;
+
+ memset(&shared19348, 0, sizeof(shared19348));
+ ClearBattleAnimationVars();
+ for (i = 0; i < 4; i++)
+ gBattleMonForms[i] = 0;
+ switch (move)
+ {
+ case MOVE_CURSE:
+ if (gBaseStats[species].type1 == TYPE_GHOST || gBaseStats[species].type2 == TYPE_GHOST)
+ gAnimMoveTurn = 0;
+ else
+ gAnimMoveTurn = 1;
+ break;
+ case MOVE_TRANSFORM:
+ case MOVE_ROLE_PLAY:
+ r5_2 = sContestantStatus[a].unk1B;
+ shared19348.unk2 = SanitizeSpecies(gContestMons[r5_2].species);
+ shared19348.unk10 = gContestMons[r5_2].personality;
+ shared19348.unk4_0 = 1;
+ break;
+ case MOVE_RETURN:
+ gAnimFriendship = 0xFF;
+ break;
+ case MOVE_FRUSTRATION:
+ gAnimFriendship = 0;
+ break;
+ case MOVE_SOLAR_BEAM:
+ case MOVE_RAZOR_WIND:
+ case MOVE_SKULL_BASH:
+ case MOVE_SKY_ATTACK:
+ if (sContest.unk1925E == 0)
+ {
+ sContest.unk1925E = 2;
+ gAnimMoveTurn = 0;
+ }
+ else
+ {
+ gAnimMoveTurn = 1;
+ }
+ break;
+ }
+ sub_80B2968();
+}
+
+void sub_80B28CC(int unused)
+{
+ memset(&shared19348, 0, sizeof(shared19348));
+ if (sContest.unk1925E != 0)
+ sContest.unk1925E--;
+}
+
+void sub_80B28F0(u8 a)
+{
+ shared19348.unk5 = a;
+ shared19348.unk0 = SanitizeSpecies(gContestMons[a].species);
+ shared19348.unk8 = gContestMons[a].personality;
+ shared19348.unkC = gContestMons[a].otId;
+}
+
+void sub_80B292C(void)
+{
+ gObjectBankIDs[3] = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy);
+ InitSpriteAffineAnim(&gSprites[gObjectBankIDs[gBankTarget]]);
+ sub_80B2968();
+}
+
+void sub_80B2968(void)
+{
+ struct Sprite *sprite = &gSprites[gObjectBankIDs[3]];
+
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->pos1.x = GetBankPosition(3, 0);
+ sprite->pos1.y = GetBankPosition(3, 1);
+ sprite->invisible = TRUE;
+}
+
+void SelectContestMoveBankTarget(u16 move)
+{
+ switch (gBattleMoves[move].target)
+ {
+ case TARGET_UNK2:
+ case TARGET_USER:
+ gBankTarget = 2;
+ break;
+ case TARGET_SELECTED_POKEMON:
+ case TARGET_RANDOM:
+ case TARGET_BOTH_ENEMIES:
+ case TARGET_ALL_EXCEPT_USER:
+ default:
+ gBankTarget = 3;
+ break;
+ }
+}
+
+bool8 Contest_SaveWinner(u8 a)
+{
+ s32 i;
+ u8 r7 = Random() % 3;
+
+ for (i = 0; i < 3; i++)
+ {
+ if (gContestFinalStandings[i] == 0)
+ break;
+ }
+ if (a == 0xFF && i != gContestPlayerMonIndex)
+ return FALSE;
+ switch (gSpecialVar_ContestCategory)
+ {
+ case CONTEST_CATEGORY_COOL:
+ r7 += 0;
+ break;
+ case CONTEST_CATEGORY_BEAUTY:
+ r7 += 3;
+ break;
+ case CONTEST_CATEGORY_CUTE:
+ r7 += 6;
+ break;
+ case CONTEST_CATEGORY_SMART:
+ r7 += 9;
+ break;
+ case CONTEST_CATEGORY_TOUGH:
+ r7 += 12;
+ break;
+ }
+ if (a != 0xFE)
+ {
+ u8 r4 = sub_80B2C4C(a, 1);
+
+ gSaveBlock1.contestWinners[r4].personality = gContestMons[i].personality;
+ gSaveBlock1.contestWinners[r4].species = gContestMons[i].species;
+ gSaveBlock1.contestWinners[r4].otId = gContestMons[i].otId;
+ StringCopy(gSaveBlock1.contestWinners[r4].nickname, gContestMons[i].nickname);
+ StringCopy(gSaveBlock1.contestWinners[r4].trainerName, gContestMons[i].trainerName);
+ if (a != 0xFF)
+ gSaveBlock1.contestWinners[r4].contestCategory = gSpecialVar_ContestCategory;
+ else
+ gSaveBlock1.contestWinners[r4].contestCategory = r7;
+ }
+ else
+ {
+ shared15DE0.personality = gContestMons[i].personality;
+ shared15DE0.otId = gContestMons[i].otId;
+ shared15DE0.species = gContestMons[i].species;
+ StringCopy(shared15DE0.nickname, gContestMons[i].nickname);
+ if (gIsLinkContest & 1)
+ StringCopy(shared15DE0.trainerName, gLinkPlayers[i].name);
+ else
+ StringCopy(shared15DE0.trainerName, gContestMons[i].trainerName);
+ shared15DE0.contestCategory = r7;
+ }
+ return TRUE;
+}
+
+u8 sub_80B2C4C(u8 a, u8 b)
+{
+ s32 i;
+
+ switch (a)
+ {
+ case 0:
+ case 1:
+ return a;
+ case 2:
+ if (b != 0)
+ {
+ for (i = 4; i >= 3; i--)
+ memcpy(&gSaveBlock1.contestWinners[i], &gSaveBlock1.contestWinners[i - 1], sizeof(struct ContestWinner));
+ }
+ return 2;
+ case 3:
+ if (b != 0)
+ {
+ for (i = 7; i >= 6; i--)
+ memcpy(&gSaveBlock1.contestWinners[i], &gSaveBlock1.contestWinners[i - 1], sizeof(struct ContestWinner));
+ }
+ return 5;
+ default:
+ switch (gSpecialVar_ContestCategory)
+ {
+ case CONTEST_CATEGORY_COOL:
+ return 8;
+ case CONTEST_CATEGORY_BEAUTY:
+ return 9;
+ case CONTEST_CATEGORY_CUTE:
+ return 10;
+ case CONTEST_CATEGORY_SMART:
+ return 11;
+ case CONTEST_CATEGORY_TOUGH:
+ default:
+ return 12;
+ }
+ }
+}
+
+void Contest_ResetWinners(void)
+{
+ s32 i;
+
+ for (i = 0; i < 8; i++)
+ gSaveBlock1.contestWinners[i] = gUnknown_083CC5D0[i];
+}
diff --git a/src/coord_event_weather.c b/src/coord_event_weather.c
deleted file mode 100644
index 9c5a1ca4d..000000000
--- a/src/coord_event_weather.c
+++ /dev/null
@@ -1,118 +0,0 @@
-#include "global.h"
-#include "coord_event_weather.h"
-#include "field_weather.h"
-
-struct CoordEventWeather
-{
- u8 weather;
- void (*func)(void);
-};
-
-static void CoordEventWeather_Indoor(void);
-static void CoordEventWeather_Sunny(void);
-static void CoordEventWeather_Rain(void);
-static void CoordEventWeather_Snowflakes(void);
-static void CoordEventWeather_Thunderstorm(void);
-static void CoordEventWeather_Fog(void);
-static void CoordEventWeather_DiagonalFog(void);
-static void CoordEventWeather_Snow(void);
-static void CoordEventWeather_Sandstorm(void);
-static void CoordEventWeather_Cloudy(void);
-static void CoordEventWeather_Drought(void);
-static void CoordEventWeather_UnderwaterFog(void);
-static void CoordEventWeather_UnderwaterBubbles(void);
-
-static const struct CoordEventWeather sCoordEventWeatherFuncs[] =
-{
- { 0x1, CoordEventWeather_Indoor },
- { 0x2, CoordEventWeather_Sunny },
- { 0x3, CoordEventWeather_Rain },
- { 0x4, CoordEventWeather_Snowflakes },
- { 0x5, CoordEventWeather_Thunderstorm },
- { 0x6, CoordEventWeather_Fog },
- { 0x7, CoordEventWeather_DiagonalFog },
- { 0x8, CoordEventWeather_Snow },
- { 0x9, CoordEventWeather_Sandstorm },
- { 0xa, CoordEventWeather_Cloudy },
- { 0xb, CoordEventWeather_Drought },
- { 0x14, CoordEventWeather_UnderwaterFog },
- { 0x15, CoordEventWeather_UnderwaterBubbles },
-};
-
-static void CoordEventWeather_Indoor(void)
-{
- SetWeather(1);
-}
-
-static void CoordEventWeather_Sunny(void)
-{
- SetWeather(2);
-}
-
-static void CoordEventWeather_Rain(void)
-{
- SetWeather(3);
-}
-
-static void CoordEventWeather_Snowflakes(void)
-{
- SetWeather(4);
-}
-
-static void CoordEventWeather_Thunderstorm(void)
-{
- SetWeather(5);
-}
-
-static void CoordEventWeather_Fog(void)
-{
- SetWeather(6);
-}
-
-static void CoordEventWeather_DiagonalFog(void)
-{
- SetWeather(9);
-}
-
-static void CoordEventWeather_Snow(void)
-{
- SetWeather(7);
-}
-
-static void CoordEventWeather_Sandstorm(void)
-{
- SetWeather(8);
-}
-
-static void CoordEventWeather_Cloudy(void)
-{
- SetWeather(11);
-}
-
-static void CoordEventWeather_Drought(void)
-{
- SetWeather(12);
-}
-
-static void CoordEventWeather_UnderwaterFog(void)
-{
- SetWeather(20);
-}
-
-static void CoordEventWeather_UnderwaterBubbles(void)
-{
- SetWeather(21);
-}
-
-void DoCoordEventWeather(u8 n)
-{
- u8 i;
- for (i = 0; i < ARRAY_COUNT(sCoordEventWeatherFuncs); i++)
- {
- if (sCoordEventWeatherFuncs[i].weather == n)
- {
- sCoordEventWeatherFuncs[i].func();
- return;
- }
- }
-}
diff --git a/src/data/bard_music_de.h b/src/data/bard_music_de.h
new file mode 100644
index 000000000..262fe26a3
--- /dev/null
+++ b/src/data/bard_music_de.h
@@ -0,0 +1,3699 @@
+#ifndef GUARD_DATA_BARD_MUSIC_H
+#define GUARD_DATA_BARD_MUSIC_H
+
+static const struct BardSound BardMusic_POKEMON[][6] = {
+ { // ARMALDO
+ {0x02}, {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BEAUTIFLY
+ {0x02}, {0x11}, {0x0B}, {0x02}, {0xFF}, {0xFF}
+ }, { // MEDITITE
+ {0x0B}, {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SEAKING
+ {0x1A}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TORCHIC
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ANORITH
+ {0x02}, {0x1A}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ABSOL
+ {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SURSKIT
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MASQUERAIN
+ {0x02}, {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}
+ }, { // GEODUDE
+ {0x0B}, {0x11}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // ILLUMISE
+ {0x11}, {0x29}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // SKARMORY
+ {0x02}, {0x02}, {0x0B}, {0x1A}, {0xFF}, {0xFF}
+ }, { // SKITTY
+ {0x0B}, {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DELCATTY
+ {0x0B}, {0x0B}, {0x1A}, {0x1A}, {0xFF}, {0xFF}
+ }, { // SWELLOW
+ {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GLALIE
+ {0x11}, {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KYOGRE
+ {0x11}, {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MACHAMP
+ {0x02}, {0x1A}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // PINSIR
+ {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KECLEON
+ {0x0B}, {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHUPPET
+ {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SILCOON
+ {0x02}, {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BRELOOM
+ {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHROOMISH
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CARVANHA
+ {0x02}, {0x11}, {0x02}, {0x02}, {0xFF}, {0xFF}
+ }, { // TREECKO
+ {0x0B}, {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WINGULL
+ {0x11}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GYARADOS
+ {0x02}, {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NINETALES
+ {0x29}, {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GIRAFARIG
+ {0x11}, {0x02}, {0x02}, {0x11}, {0xFF}, {0xFF}
+ }, { // KIRLIA
+ {0x11}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BELLOSSOM
+ {0x29}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KINGDRA
+ {0x0B}, {0x0B}, {0x02}, {0x11}, {0xFF}, {0xFF}
+ }, { // GLOOM
+ {0x29}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAWILE
+ {0x29}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GROUDON
+ {0x1A}, {0x29}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MIGHTYENA
+ {0x02}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CROBAT
+ {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ABRA
+ {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SLAKING
+ {0x0B}, {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WURMPLE
+ {0x02}, {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAGIKARP
+ {0x02}, {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAGNEMITE
+ {0x02}, {0x0B}, {0x11}, {0x1A}, {0xFF}, {0xFF}
+ }, { // TORKOAL
+ {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MACHOKE
+ {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GULPIN
+ {0x29}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ARON
+ {0x1A}, {0x29}, {0x11}, {0x1A}, {0xFF}, {0xFF}
+ }, { // PSYDUCK
+ {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LAIRON
+ {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHISMUR
+ {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NUZLEAF
+ {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PHANPY
+ {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHELGON
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GOLDUCK
+ {0x0B}, {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GOLBAT
+ {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GOLEM
+ {0x0B}, {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GRAVELER
+ {0x0B}, {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GARDEVOIR
+ {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RHYDON
+ {0x11}, {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RHYHORN
+ {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GOREBYSS
+ {0x02}, {0x02}, {0x02}, {0x11}, {0xFF}, {0xFF}
+ }, { // CORSOLA
+ {0x1A}, {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CACNEA
+ {0x29}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DUSCLOPS
+ {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHARPEDO
+ {0x1A}, {0x02}, {0x11}, {0x1A}, {0xFF}, {0xFF}
+ }, { // ZANGOOSE
+ {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SANDSHREW
+ {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SANDSLASH
+ {0x02}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SEADRA
+ {0x0B}, {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RELICANTH
+ {0x0B}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ZIGZAGOON
+ {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CRAWDAUNT
+ {0x0B}, {0x29}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SCEPTILE
+ {0x0B}, {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GROVYLE
+ {0x0B}, {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BANETTE
+ {0x02}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // JIRACHI
+ {0x11}, {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STARMIE
+ {0x02}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ZUBAT
+ {0x29}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TAILLOW
+ {0x02}, {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WYNAUT
+ {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WOBBUFFET
+ {0x1A}, {0x11}, {0x0B}, {0x02}, {0x29}, {0xFF}
+ }, { // SOLROCK
+ {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHIFTRY
+ {0x0B}, {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HORSEA
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BAGON
+ {0x11}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SEEDOT
+ {0x02}, {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPHEAL
+ {0x0B}, {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BELDUM
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MEDICHAM
+ {0x0B}, {0x11}, {0x02}, {0x11}, {0xFF}, {0xFF}
+ }, { // CHINCHOU
+ {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHIMECHO
+ {0x02}, {0x11}, {0x02}, {0x11}, {0xFF}, {0xFF}
+ }, { // ALTARIA
+ {0x02}, {0x02}, {0x11}, {0x02}, {0xFF}, {0xFF}
+ }, { // SWABLU
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NINCADA
+ {0x11}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DEOXYS
+ {0x0B}, {0x1A}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NINJASK
+ {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DODUO
+ {0x1A}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DODRIO
+ {0x1A}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KOFFING
+ {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TENTACRUEL
+ {0x0B}, {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DUSTOX
+ {0x29}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOUDRED
+ {0x02}, {0x0B}, {0x0B}, {0x1A}, {0xFF}, {0xFF}
+ }, { // GOLDEEN
+ {0x1A}, {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BARBOACH
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SEALEO
+ {0x0B}, {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WALREIN
+ {0x02}, {0x02}, {0x11}, {0x02}, {0xFF}, {0xFF}
+ }, { // TROPIUS
+ {0x1A}, {0x11}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DONPHAN
+ {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NUMEL
+ {0x02}, {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ODDISH
+ {0x11}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TRAPINCH
+ {0x02}, {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SLAKOTH
+ {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHISCASH
+ {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHEDINJA
+ {0x11}, {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MARSHTOMP
+ {0x1A}, {0x1A}, {0x02}, {0x0B}, {0xFF}, {0xFF}
+ }, { // NATU
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // XATU
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CLAYDOL
+ {0x0B}, {0x29}, {0x0B}, {0x02}, {0xFF}, {0xFF}
+ }, { // CACTURNE
+ {0x1A}, {0x29}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NOSEPASS
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CLAMPERL
+ {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CAMERUPT
+ {0x02}, {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EXPLOUD
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BLAZIKEN
+ {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOMBRE
+ {0x1A}, {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOTAD
+ {0x1A}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPINDA
+ {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPOINK
+ {0x1A}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SEVIPER
+ {0x11}, {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HARIYAMA
+ {0x02}, {0x11}, {0x02}, {0x02}, {0xFF}, {0xFF}
+ }, { // VOLBEAT
+ {0x1A}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HUNTAIL
+ {0x02}, {0x02}, {0x02}, {0x11}, {0xFF}, {0xFF}
+ }, { // PIKACHU
+ {0x11}, {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PICHU
+ {0x11}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STARYU
+ {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VIBRAVA
+ {0x11}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VOLTORB
+ {0x1A}, {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FEEBAS
+ {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ALAKAZAM
+ {0x11}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GRUMPIG
+ {0x1A}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WIGGLYTUFF
+ {0x29}, {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IGGLYBUFF
+ {0x29}, {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FLYGON
+ {0x11}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PLUSLE
+ {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // JIGGLYPUFF
+ {0x29}, {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CORPHISH
+ {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GRIMER
+ {0x0B}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MUK
+ {0x0B}, {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HERACROSS
+ {0x02}, {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PELIPPER
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WAILORD
+ {0x02}, {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WAILMER
+ {0x02}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SALAMENCE
+ {0x29}, {0x02}, {0x02}, {0x02}, {0xFF}, {0xFF}
+ }, { // AGGRON
+ {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POOCHYENA
+ {0x11}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CASTFORM
+ {0x1A}, {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MINUN
+ {0x11}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAGCARGO
+ {0x02}, {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAKUHITA
+ {0x02}, {0x29}, {0x11}, {0x02}, {0xFF}, {0xFF}
+ }, { // SLUGMA
+ {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WEEZING
+ {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LINOONE
+ {0x0B}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CASCOON
+ {0x02}, {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MARILL
+ {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AZUMARILL
+ {0x02}, {0x29}, {0x02}, {0x11}, {0xFF}, {0xFF}
+ }, { // SWALOT
+ {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ELECTRODE
+ {0x0B}, {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MUDKIP
+ {0x11}, {0x1A}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MILOTIC
+ {0x11}, {0x1A}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // METAGROSS
+ {0x0B}, {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // METANG
+ {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TENTACOOL
+ {0x0B}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BALTOY
+ {0x29}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SABLEYE
+ {0x1A}, {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VIGOROTH
+ {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SNORUNT
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CRADILY
+ {0x11}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KADABRA
+ {0x02}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DUSKULL
+ {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RAICHU
+ {0x02}, {0x11}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MANECTRIC
+ {0x1A}, {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SWAMPERT
+ {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ELECTRIKE
+ {0x11}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LATIAS
+ {0x02}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LATIOS
+ {0x02}, {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LUVDISC
+ {0x11}, {0x11}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VILEPLUME
+ {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RALTS
+ {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LANTURN
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LILEEP
+ {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LUNATONE
+ {0x29}, {0x02}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // AZURILL
+ {0x02}, {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LUDICOLO
+ {0x02}, {0x02}, {0x1A}, {0x0B}, {0xFF}, {0xFF}
+ }, { // MAGNETON
+ {0x02}, {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // REGICE
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // REGISTEEL
+ {0x0B}, {0x11}, {0x0B}, {0x0B}, {0xFF}, {0xFF}
+ }, { // REGIROCK
+ {0x0B}, {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RAYQUAZA
+ {0x02}, {0x11}, {0x02}, {0x02}, {0xFF}, {0xFF}
+ }, { // VULPIX
+ {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ROSELIA
+ {0x1A}, {0x0B}, {0x11}, {0x02}, {0xFF}, {0xFF}
+ }, { // COMBUSKEN
+ {0x29}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MACHOP
+ {0x02}, {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+
+static const struct BardSound BardMusic_TRAINER[][6] = {
+ { // I CHOOSE YOU
+ {0x29}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GOTCHA
+ {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TRADE
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SAPPHIRE
+ {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EVOLVE
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ENCYCLOPEDIA
+ {0x0B}, {0x11}, {0x1A}, {0x0B}, {0x11}, {0xFF}
+ }, { // NATURE
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CENTER
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EGG
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LINK
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SP. ABILITY
+ {0x0B}, {0x11}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // TRAINER
+ {0x02}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VERSION
+ {0x0B}, {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POKéNAV
+ {0x1A}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POKéMON
+ {0x1A}, {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GET
+ {0x0B}, {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POKéDEX
+ {0x1A}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RUBY
+ {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LEVEL
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+
+static const struct BardSound BardMusic_STATUS[][6] = {
+ { // DARK
+ {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STENCH
+ {0x29}, {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THICK FAT
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RAIN DISH
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DRIZZLE
+ {0x11}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ARENA TRAP
+ {0x02}, {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // INTIMIDATE
+ {0x0B}, {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ROCK HEAD
+ {0x0B}, {0x11}, {0x02}, {0x29}, {0xFF}, {0xFF}
+ }, { // COLOR
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ALT. COLOR
+ {0x02}, {0x0B}, {0x02}, {0x0B}, {0xFF}, {0xFF}
+ }, { // ROCK
+ {0x0B}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BEAUTIFUL
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BEAUTY
+ {0x0B}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AIR LOCK
+ {0x11}, {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PSYCHIC
+ {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HYPER CUTTER
+ {0x0B}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FIGHTING
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHADOW TAG
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SMART
+ {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SMARTNESS
+ {0x29}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPEED BOOST
+ {0x0B}, {0x1A}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COOL
+ {0x29}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COOLNESS
+ {0x29}, {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BATTLE ARMOR
+ {0x02}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CUTE
+ {0x02}, {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CUTENESS
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STURDY
+ {0x1A}, {0x29}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // SUCTION CUPS
+ {0x02}, {0x29}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GRASS
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CLEAR BODY
+ {0x0B}, {0x29}, {0x02}, {0x1A}, {0x1A}, {0xFF}
+ }, { // TORRENT
+ {0x29}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GHOST
+ {0x02}, {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ICE
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GUTS
+ {0x02}, {0x0B}, {0x02}, {0x11}, {0xFF}, {0xFF}
+ }, { // ROUGH SKIN
+ {0x02}, {0x29}, {0x02}, {0x29}, {0xFF}, {0xFF}
+ }, { // SHELL ARMOR
+ {0x02}, {0x0B}, {0x02}, {0x29}, {0xFF}, {0xFF}
+ }, { // NATURAL CURE
+ {0x11}, {0x0B}, {0x0B}, {0x02}, {0xFF}, {0xFF}
+ }, { // DAMP
+ {0x0B}, {0x29}, {0x11}, {0x0B}, {0x11}, {0xFF}
+ }, { // GROUND
+ {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LIMBER
+ {0x0B}, {0x11}, {0x11}, {0x11}, {0x0B}, {0xFF}
+ }, { // MAGNET PULL
+ {0x02}, {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}
+ }, { // WHITE SMOKE
+ {0x29}, {0x0B}, {0x02}, {0x29}, {0xFF}, {0xFF}
+ }, { // SYNCHRONIZE
+ {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OVERGROW
+ {0x1A}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SWIFT SWIM
+ {0x02}, {0x0B}, {0x0B}, {0x1A}, {0xFF}, {0xFF}
+ }, { // SAND STREAM
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SAND VEIL
+ {0x02}, {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // KEEN EYE
+ {0x02}, {0x0B}, {0x02}, {0x29}, {0x0B}, {0xFF}
+ }, { // INNERFOCUS
+ {0x1A}, {0x0B}, {0x02}, {0x1A}, {0xFF}, {0xFF}
+ }, { // STATIC
+ {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TYPE
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TOUGH
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TOUGHNESS
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHED SKIN
+ {0x0B}, {0x11}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // HUGE POWER
+ {0x02}, {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VOLT ABSORB
+ {0x1A}, {0x02}, {0x1A}, {0x0B}, {0xFF}, {0xFF}
+ }, { // WATER ABSORB
+ {0x02}, {0x0B}, {0x11}, {0x1A}, {0x02}, {0x1A}
+ }, { // ELECTRIC
+ {0x0B}, {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FORECAST
+ {0x1A}, {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SERENE GRACE
+ {0x0B}, {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POISON
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POISON POINT
+ {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DRAGON
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TRACE
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OBLIVIOUS
+ {0x0B}, {0x11}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // TRUANT
+ {0x02}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RUN AWAY
+ {0x02}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STICKY HOLD
+ {0x0B}, {0x0B}, {0x02}, {0x0B}, {0xFF}, {0xFF}
+ }, { // CLOUD NINE
+ {0x1A}, {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // NORMAL
+ {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STEEL
+ {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ILLUMINATE
+ {0x0B}, {0x0B}, {0x29}, {0x29}, {0xFF}, {0xFF}
+ }, { // EARLY BIRD
+ {0x11}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HUSTLE
+ {0x11}, {0x0B}, {0x0B}, {0x11}, {0x0B}, {0xFF}
+ }, { // SHINE
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FLYING
+ {0x11}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DROUGHT
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LIGHTNINGROD
+ {0x11}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COMPOUNDEYES
+ {0x02}, {0x0B}, {0x0B}, {0x02}, {0x29}, {0xFF}
+ }, { // MARVEL SCALE
+ {0x1A}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WONDER GUARD
+ {0x29}, {0x0B}, {0x02}, {0x0B}, {0xFF}, {0xFF}
+ }, { // INSOMNIA
+ {0x11}, {0x1A}, {0x11}, {0x02}, {0xFF}, {0xFF}
+ }, { // LEVITATE
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PLUS
+ {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PRESSURE
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LIQUID OOZE
+ {0x1A}, {0x02}, {0x0B}, {0x1A}, {0x0B}, {0xFF}
+ }, { // COLOR CHANGE
+ {0x02}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SOUNDPROOF
+ {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EFFECT SPORE
+ {0x1A}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PKRS
+ {0x1A}, {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FIRE
+ {0x0B}, {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FLAME BODY
+ {0x02}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MINUS
+ {0x11}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OWN TEMPO
+ {0x0B}, {0x1A}, {0x02}, {0x0B}, {0xFF}, {0xFF}
+ }, { // MAGMA ARMOR
+ {0x02}, {0x02}, {0x02}, {0x0B}, {0xFF}, {0xFF}
+ }, { // WATER
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WATER VEIL
+ {0x02}, {0x02}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // BUG
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SWARM
+ {0x0B}, {0x02}, {0x02}, {0x02}, {0xFF}, {0xFF}
+ }, { // CUTE CHARM
+ {0x02}, {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IMMUNITY
+ {0x11}, {0x29}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // BLAZE
+ {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PICKUP
+ {0x11}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PATTERN
+ {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FLASH FIRE
+ {0x0B}, {0x29}, {0x0B}, {0x0B}, {0xFF}, {0xFF}
+ }, { // VITAL SPIRIT
+ {0x29}, {0x0B}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // CHLOROPHYLL
+ {0x1A}, {0x1A}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PURE POWER
+ {0x0B}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHIELD DUST
+ {0x29}, {0x0B}, {0x02}, {0x0B}, {0xFF}, {0xFF}
+ }
+};
+
+
+static const struct BardSound BardMusic_BATTLE[][6] = {
+ { // MATCH UP
+ {0x02}, {0x1A}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // GO
+ {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NO. 1
+ {0x29}, {0x0B}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // DECIDE
+ {0x0B}, {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // LET ME WIN
+ {0x11}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WINS
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WIN
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WON
+ {0x0B}, {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IF I WIN
+ {0x0B}, {0x11}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // WHEN I WIN
+ {0x11}, {0x0B}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // CAN’T WIN
+ {0x11}, {0x0B}, {0x29}, {0x0B}, {0x11}, {0xFF}
+ }, { // CAN WIN
+ {0x02}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NO MATCH
+ {0x29}, {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}
+ }, { // SPIRIT
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DECIDED
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TRUMP CARD
+ {0x29}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TAKE THAT
+ {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COME ON
+ {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ATTACK
+ {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SURRENDER
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GUTSY
+ {0x02}, {0x0B}, {0x02}, {0x11}, {0xFF}, {0xFF}
+ }, { // TALENT
+ {0x02}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STRATEGY
+ {0x02}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SMITE
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MATCH
+ {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VICTORY
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OFFENSIVE
+ {0x1A}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SENSE
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VERSUS
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FIGHTS
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POWER
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHALLENGE
+ {0x0B}, {0x02}, {0x29}, {0x1A}, {0x0B}, {0x29}
+ }, { // STRONG
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TOO STRONG
+ {0x29}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GO EASY
+ {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FOE
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GENIUS
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LEGEND
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ESCAPE
+ {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AIM
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BATTLE
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FIGHT
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RESUSCITATE
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POINTS
+ {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SERIOUS
+ {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GIVE UP
+ {0x02}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOSS
+ {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IF I LOSE
+ {0x0B}, {0x11}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // LOST
+ {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOSE
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GUARD
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PARTNER
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // REJECT
+ {0x02}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ACCEPT
+ {0x02}, {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // INVINCIBLE
+ {0x29}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RECEIVED
+ {0x0B}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EASY
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WEAK
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TOO WEAK
+ {0x29}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PUSHOVER
+ {0x02}, {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LEADER
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RULE
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MOVE
+ {0x02}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+
+static const struct BardSound BardMusic_GREETINGS[][6] = {
+ { // THANKS
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YES
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HERE GOES
+ {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HERE I COME
+ {0x11}, {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HERE IT IS
+ {0x11}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YEAH
+ {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WELCOME
+ {0x11}, {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OI
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HOW DO
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CONGRATS
+ {0x11}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GIVE ME
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SORRY
+ {0x1A}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // APOLOGIZE
+ {0x0B}, {0x0B}, {0x11}, {0x29}, {0xFF}, {0xFF}
+ }, { // FORGIVE
+ {0x1A}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HEY, THERE
+ {0x1A}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HELLO
+ {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GOOD-BYE
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THANK YOU
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // I’VE ARRIVED
+ {0x11}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PARDON
+ {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EXCUSE
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SEE YA
+ {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EXCUSE ME
+ {0x0B}, {0x29}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // WELL, THEN
+ {0x29}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GO AHEAD
+ {0x0B}, {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // APPRECIATE
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HEY?
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHAT’S UP?
+ {0x02}, {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HUH?
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NO
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HI
+ {0x02}, {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YEAH, YEAH
+ {0x0B}, {0x02}, {0x0B}, {0x02}, {0xFF}, {0xFF}
+ }, { // BYE-BYE
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MEET YOU
+ {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HEY
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SMELL
+ {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LISTENING
+ {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HOO-HAH
+ {0x29}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YAHOO
+ {0x29}, {0x29}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YO
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COME OVER
+ {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COUNT ON
+ {0x0B}, {0x0B}, {0x02}, {0x29}, {0xFF}, {0xFF}
+ }
+};
+
+
+static const struct BardSound BardMusic_PEOPLE[][6] = {
+ { // OPPONENT
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // I
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YOU
+ {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YOURS
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SON
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YOUR
+ {0x0B, 0xF7}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YOU’RE
+ {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YOU’VE
+ {0x29}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MOTHER
+ {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GRANDFATHER
+ {0x1A}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UNCLE
+ {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FATHER
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BOY
+ {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ADULT
+ {0x0B}, {0x02}, {0x0B}, {0x0B}, {0xFF}, {0xFF}
+ }, { // BROTHER
+ {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SISTER
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GRANDMOTHER
+ {0x1A}, {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AUNT
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PARENT
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAN
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ME
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GIRL
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BABE
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FAMILY
+ {0x02}, {0x11}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // HER
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HIM
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HE
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PLACE
+ {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DAUGHTER
+ {0x1A}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HIS
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HE’S
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AREN’T
+ {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SIBLINGS
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KID
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHILDREN
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MR.
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MRS.
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MYSELF
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // I WAS
+ {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TO ME
+ {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MY
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // I AM
+ {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // I’VE
+ {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHO
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SOMEONE
+ {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHO WAS
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TO WHOM
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHOSE
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHO IS
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IT’S
+ {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LADY
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FRIEND
+ {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ALLY
+ {0x0B}, {0x11}, {0x0B}, {0x0B}, {0xFF}, {0xFF}
+ }, { // PERSON
+ {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DUDE
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THEY
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THEY WERE
+ {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TO THEM
+ {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THEIR
+ {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THEY’RE
+ {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THEY’VE
+ {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WE
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BEEN
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TO US
+ {0x11}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OUR
+ {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WE’RE
+ {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RIVAL
+ {0x11}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WE’VE
+ {0x11}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WOMAN
+ {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHE
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHE WAS
+ {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TO HER
+ {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HER’S
+ {0x0B}, {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHE IS
+ {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SOME
+ {0x11}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+
+static const struct BardSound BardMusic_VOICES[][6] = {
+ { // !
+ {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // !!
+ {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ?!
+ {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ?
+ {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // …
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // …!
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ………
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // -
+ {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // - - -
+ {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UH-OH
+ {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WAAAH
+ {0x02, 0x05, 0x08}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AHAHA
+ {0x02}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OH?
+ {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NOPE
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // URGH
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HMM
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHOAH
+ {0x1A}, {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WROOOAAR!
+ {0x1A}, {0x1A}, {0x1A}, {0x02}, {0xFF}, {0xFF}
+ }, { // WOW
+ {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GIGGLE
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SIGH
+ {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UNBELIEVABLE
+ {0x29}, {0x02}, {0x29}, {0x11}, {0xFF}, {0xFF}
+ }, { // CRIES
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AGREE
+ {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EH?
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CRY
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EHEHE
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OI, OI, OI
+ {0x1A}, {0x0B}, {0x1A}, {0x0B}, {0x1A}, {0x0B}
+ }, { // OH, YEAH
+ {0x1A}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OH
+ {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OOPS
+ {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHOCKED
+ {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EEK
+ {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GRAAAH
+ {0x02}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GWAHAHAHA
+ {0x02}, {0x02}, {0x02}, {0x02}, {0xFF}, {0xFF}
+ }, { // WAY
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TCH
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HEHE
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HAH
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YUP
+ {0x02}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HAHAHA
+ {0x02}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AIYEEH
+ {0x02}, {0x11}, {0x11}, {0x0B}, {0x0B}, {0xFF}
+ }, { // HIYAH
+ {0x11}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FUFUFU
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOL
+ {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SNORT
+ {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HUMPH
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HEHEHE
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HEH
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HOHOHO
+ {0x1A}, {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UH-HUH
+ {0x29}, {0x11}, {0x29}, {0x11}, {0xFF}, {0xFF}
+ }, { // OH, DEAR
+ {0x0B}, {0x11}, {0x0B}, {0x11}, {0x0B}, {0xFF}
+ }, { // ARRGH
+ {0x02}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MUFUFU
+ {0x11}, {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MMM
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OH-KAY
+ {0x1A}, {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OKAY
+ {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LALALA
+ {0x02}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YAY
+ {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AWW
+ {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WOWEE
+ {0x29}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GWAH
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WAHAHAHA
+ {0x02}, {0x02}, {0x02}, {0x02}, {0xFF}, {0xFF}
+ }
+};
+
+
+static const struct BardSound BardMusic_SPEECH[][6] = {
+ { // LISTEN
+ {0x29}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NOT VERY
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MEAN
+ {0x0B}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LIE
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LAY
+ {0x0B}, {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RECOMMEND
+ {0x0B}, {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NITWIT
+ {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // QUITE
+ {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FROM
+ {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FEELING
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BUT
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HOWEVER
+ {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CASE
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THE
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MISS
+ {0x02}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HOW
+ {0x0B}, {0x02}, {0x29}, {0x11}, {0xFF}, {0xFF}
+ }, { // HIT
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ENOUGH
+ {0x0B}, {0x11}, {0x02}, {0x29}, {0xFF}, {0xFF}
+ }, { // A LOT
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // A LITTLE
+ {0x0B}, {0x11}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // ABSOLUTELY
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AND
+ {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ONLY
+ {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AROUND
+ {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PROBABLY
+ {0x0B}, {0x0B}, {0x29}, {0x0B}, {0xFF}, {0xFF}
+ }, { // IF
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VERY
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // A TINY BIT
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WILD
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THAT’S
+ {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // JUST
+ {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EVEN SO, {0x0C}, {0x0B}, {0x1A}, {0x33}, {0xFF}, {0xFF}
+ {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MUST BE
+ {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NATURALLY
+ {0x0B}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FOR NOW, {0x1A}, {0x23}, {0xFF}, {0x33}, {0xFF}, {0xFF}
+ {0x11}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UNDERSTOOD
+ {0x0B}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // JOKING
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // READY
+ {0x0B}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SOMETHING
+ {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SOMEHOW
+ {0x11}, {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // ALTHOUGH
+ {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ALSO
+ {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PERFECT
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AS MUCH AS
+ {0x1A}, {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // REALLY
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TRULY
+ {0x02}, {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SERIOUSLY
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TOTALLY
+ {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UNTIL
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AS IF
+ {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MOOD
+ {0x02}, {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RATHER
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AWFULLY
+ {0x29}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MODE
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MORE
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TOO LATE
+ {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FINALLY
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ANY
+ {0x11}, {0x0B}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // INSTEAD
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FANTASTIC
+ {0x02}, {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+
+static const struct BardSound BardMusic_ENDINGS[][6] = {
+ { // WILL
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WILL BE HERE
+ {0x11}, {0x02}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // OR
+ {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TIMES
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WONDER
+ {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IS IT?
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BE
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GIMME
+ {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COULD
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LIKELY TO
+ {0x0B}, {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WOULD
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IS
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ISN’T IT?
+ {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LET’S
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OTHER
+ {0x02}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ARE
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WAS
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WERE
+ {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THOSE
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ISN’T
+ {0x11}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WON’T
+ {0x0B}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CAN’T
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CAN
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DON’T
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DO
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DOES
+ {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHOM
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHICH
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WASN’T
+ {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WEREN’T
+ {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HAVE
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HAVEN’T
+ {0x02}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // A
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AN
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NOT
+ {0x11}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THERE
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OK?
+ {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SO
+ {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAYBE
+ {0x11}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ABOUT
+ {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OVER
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IT
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ALL
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FOR
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ON
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OFF
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AS
+ {0x0B}, {0x02}, {0x29}, {0x1A}, {0xFF}, {0xFF}
+ }, { // TO
+ {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WITH
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BETTER
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EVER
+ {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SINCE
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OF
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BELONGS TO
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AT
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IN
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OUT
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TOO
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LIKE
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DID
+ {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DIDN’T
+ {0x11}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DOESN’T
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WITHOUT
+ {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AFTER
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BEFORE
+ {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHILE
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THAN
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ONCE
+ {0x0B}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ANYWHERE
+ {0x11}, {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+
+static const struct BardSound BardMusic_FEELINGS[][6] = {
+ { // MEET
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PLAY
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HURRIED
+ {0x0B}, {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GOES
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GIDDY
+ {0x11}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HAPPY
+ {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HAPPINESS
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EXCITE
+ {0x0B}, {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // IMPORTANT
+ {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FUNNY
+ {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GOT
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GO HOME
+ {0x0B}, {0x11}, {0x0B}, {0x0B}, {0xFF}, {0xFF}
+ }, { // DISAPPOINTED
+ {0x0B}, {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DISAPPOINTS
+ {0x0B}, {0x0B}, {0x29}, {0x0B}, {0xFF}, {0xFF}
+ }, { // SAD
+ {0x02}, {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TRY
+ {0x29}, {0x29}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // TRIES
+ {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HEARS
+ {0x29}, {0x0B}, {0x02}, {0x29}, {0x0B}, {0xFF}
+ }, { // THINK
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HEAR
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WANTS
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MISHEARD
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DISLIKE
+ {0x11}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ANGRY
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ANGER
+ {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SCARY
+ {0x29}, {0x0B}, {0x11}, {0x11}, {0xFF}, {0xFF}
+ }, { // LONESOME
+ {0x0B}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DISAPPOINT
+ {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // JOY
+ {0x0B}, {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GETS
+ {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NEVER
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DARN
+ {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DOWNCAST
+ {0x0B}, {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // INCREDIBLE
+ {0x02}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LIKES
+ {0x1A}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DISLIKES
+ {0x02}, {0x0B}, {0x11}, {0x29}, {0xFF}, {0xFF}
+ }, { // BORING
+ {0x02}, {0x0B}, {0x11}, {0x11}, {0xFF}, {0xFF}
+ }, { // CARE
+ {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CARES
+ {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ALL RIGHT
+ {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ADORE
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DISASTER
+ {0x0B}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ENJOY
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ENJOYS
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EAT
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LACKING
+ {0x29}, {0x29}, {0x0B}, {0x11}, {0x0B}, {0xFF}
+ }, { // BAD
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HARD
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TERRIBLE
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHOULD
+ {0x11}, {0x0B}, {0x02}, {0x29}, {0x0B}, {0xFF}
+ }, { // NICE
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DRINK
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SURPRISE
+ {0x11}, {0x0B}, {0x02}, {0x29}, {0xFF}, {0xFF}
+ }, { // FEAR
+ {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WANT
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WAIT
+ {0x02}, {0x0B}, {0x0B}, {0x11}, {0x0B}, {0xFF}
+ }, { // SATISFIED
+ {0x29}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SEE
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RARE
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NEGATIVE
+ {0x0B}, {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DONE
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DANGER
+ {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DEFEATED
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BEAT
+ {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GREAT
+ {0x1A}, {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ROMANTIC
+ {0x1A}, {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // QUESTION
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UNDERSTAND
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UNDERSTANDS
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+
+static const struct BardSound BardMusic_CONDITIONS[][6] = {
+ { // HOT
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EXISTS
+ {0x0B}, {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EXCESS
+ {0x11}, {0x0B}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // APPROVED
+ {0x0B}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HAS
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GOOD
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LESS
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MOMENTUM
+ {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GOING
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WEIRD
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BUSY
+ {0x0B}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TOGETHER
+ {0x29}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FULL
+ {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ABSENT
+ {0x02}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BEING
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NEED
+ {0x02}, {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TASTY
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SKILLED
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NOISY
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BIG
+ {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LATE
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CLOSE
+ {0x02}, {0x0B}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // DOCILE
+ {0x02}, {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AMUSING
+ {0x02}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ENTERTAINING
+ {0x29}, {0x0B}, {0x02}, {0x02}, {0xFF}, {0xFF}
+ }, { // PERFECTION
+ {0x0B}, {0x0B}, {0x11}, {0x1A}, {0xFF}, {0xFF}
+ }, { // PRETTY
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HEALTHY
+ {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EXCELLENT
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UPSIDE DOWN
+ {0x29}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COLD
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // REFRESHING
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UNAVOIDABLE
+ {0x29}, {0x0B}, {0x0B}, {0x11}, {0x02}, {0xFF}
+ }, { // MUCH
+ {0x11}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OVERWHELMING
+ {0x11}, {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // FABULOUS
+ {0x02}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ELSE
+ {0x02}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EXPENSIVE
+ {0x0B}, {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CORRECT
+ {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IMPOSSIBLE
+ {0x29}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SMALL
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DIFFERENT
+ {0x0B}, {0x11}, {0x0B}, {0x0B}, {0xFF}, {0xFF}
+ }, { // TIRED
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SKILL
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TOP
+ {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NON-STOP
+ {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PREPOSTEROUS
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NONE
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NOTHING
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NATURAL
+ {0x02}, {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BECOMES
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LUKEWARM
+ {0x02}, {0x29}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FAST
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOW
+ {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AWFUL
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ALONE
+ {0x02}, {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // BORED
+ {0x0B}, {0x02}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // SECRET
+ {0x0B}, {0x0B}, {0x11}, {0x11}, {0xFF}, {0xFF}
+ }, { // MYSTERY
+ {0x0B}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LACKS
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BEST
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOUSY
+ {0x02}, {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MISTAKE
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KIND
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WELL
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WEAKENED
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SIMPLE
+ {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SEEMS
+ {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BADLY
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+
+static const struct BardSound BardMusic_ACTIONS[][6] = {
+ { // MEETS
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CONCEDE
+ {0x0B}, {0x11}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // GIVE
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GIVES
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PLAYED
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PLAYS
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COLLECT
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WALKING
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WALKS
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SAYS
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WENT
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SAID
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WAKE UP
+ {0x02}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WAKES UP
+ {0x02}, {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ANGERS
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TEACH
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TEACHES
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PLEASE
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LEARN
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHANGE
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STORY
+ {0x1A}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TRUST
+ {0x0B}, {0x02}, {0x29}, {0x0B}, {0xFF}, {0xFF}
+ }, { // LAVISH
+ {0x1A}, {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LISTENS
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HEARING
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TRAINS
+ {0x02}, {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHOOSE
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COME
+ {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CAME
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SEARCH
+ {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAKE
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CAUSE
+ {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KNOW
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KNOWS
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // REFUSE
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STORES
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BRAG
+ {0x02}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IGNORANT
+ {0x11}, {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THINKS
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BELIEVE
+ {0x02}, {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SLIDE
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EATS
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // USE
+ {0x0B}, {0x02}, {0x29}, {0x0B}, {0xFF}, {0xFF}
+ }, { // USES
+ {0x0B}, {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // USING
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COULDN’T
+ {0x0B}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CAPABLE
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DISAPPEAR
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // APPEAR
+ {0x0B}, {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // THROW
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WORRY
+ {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SLEPT
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SLEEP
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RELEASE
+ {0x0B}, {0x11}, {0x02}, {0x0B}, {0xFF}, {0xFF}
+ }, { // DRINKS
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RUNS
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RUN
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WORKS
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WORKING
+ {0x02}, {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // TALKING
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TALK
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SINK
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SMACK
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PRETEND
+ {0x1A}, {0x0B}, {0x29}, {0x0B}, {0xFF}, {0xFF}
+ }, { // PRAISE
+ {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OVERDO
+ {0x11}, {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // SHOW
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOOKS
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SEES
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SEEK
+ {0x0B}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OWN
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TAKE
+ {0x0B}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ALLOW
+ {0x0B}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FORGET
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FORGETS
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // APPEARS
+ {0x0B}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FAINT
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FAINTED
+ {0x02}, {0x29}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }
+};
+
+
+static const struct BardSound BardMusic_LIFESTYLE[][6] = {
+ { // CHORES
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HOME
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MONEY
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ALLOWANCE
+ {0x02}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BATH
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CONVERSATION
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SCHOOL
+ {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COMMEMORATE
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HABIT
+ {0x0B}, {0x1A}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // GROUP
+ {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WORD
+ {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STORE
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SERVICE
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WORK
+ {0x02}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SYSTEM
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TRAIN
+ {0x02}, {0x11}, {0x11}, {0x0B}, {0x0B}, {0xFF}
+ }, { // CLASS
+ {0x0B}, {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LESSONS
+ {0x29}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // INFORMATION
+ {0x11}, {0x1A}, {0x02}, {0x11}, {0x1A}, {0xFF}
+ }, { // LIVING
+ {0x0B}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TEACHER
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TOURNAMENT
+ {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LETTER
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EVENT
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DIGITAL
+ {0x11}, {0x11}, {0x02}, {0x0B}, {0xFF}, {0xFF}
+ }, { // TEST
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DEPT. STORE
+ {0x02}, {0x29}, {0x02}, {0x29}, {0xFF}, {0xFF}
+ }, { // TELEVISION
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PHONE
+ {0x0B}, {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ITEM
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NAME
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NEWS
+ {0x0B}, {0x29}, {0x11}, {0x0B}, {0x11}, {0x0B}
+ }, { // POPULAR
+ {0x1A}, {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PARTY
+ {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STUDY
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MACHINE
+ {0x02}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAIL
+ {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MESSAGE
+ {0x11}, {0x0B}, {0x11}, {0x29}, {0xFF}, {0xFF}
+ }, { // PROMISE
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DREAM
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KINDERGARTEN
+ {0x11}, {0x0B}, {0x02}, {0x0B}, {0xFF}, {0xFF}
+ }, { // LIFE
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RADIO
+ {0x02}, {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RENTAL
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WORLD
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+
+static const struct BardSound BardMusic_HOBBIES[][6] = {
+ { // IDOL
+ {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ANIME
+ {0x02}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SONG
+ {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MOVIE
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SWEETS
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHAT
+ {0x02}, {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHILD’S PLAY
+ {0x11}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TOYS
+ {0x11}, {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MUSIC
+ {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CARDS
+ {0x02}, {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // SHOPPING
+ {0x0B}, {0x11}, {0x02}, {0x29}, {0x0B}, {0xFF}
+ }, { // CAMERA
+ {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VIEWING
+ {0x0B}, {0x11}, {0x11}, {0x29}, {0xFF}, {0xFF}
+ }, { // SPECTATOR
+ {0x29}, {0x02}, {0x29}, {0x0B}, {0xFF}, {0xFF}
+ }, { // GOURMET
+ {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GAME
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RPG
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COLLECTION
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COMPLETE
+ {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAGAZINE
+ {0x02}, {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WALK
+ {0x02}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BIKE
+ {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HOBBY
+ {0x1A}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPORTS
+ {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SOFTWARE
+ {0x1A}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SONGS
+ {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DIET
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TREASURE
+ {0x1A}, {0x02}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // TRAVEL
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DANCE
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHANNEL
+ {0x02}, {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAKING
+ {0x0B}, {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FISHING
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DATE
+ {0x0B}, {0x02}, {0x0B}, {0x29}, {0xFF}, {0xFF}
+ }, { // DESIGN
+ {0x0B}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOCOMOTIVE
+ {0x1A}, {0x1A}, {0x1A}, {0x11}, {0x0B}, {0xFF}
+ }, { // PLUSH DOLL
+ {0x11}, {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PC
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FLOWERS
+ {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HERO
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NAP
+ {0x11}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HEROINE
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FASHION
+ {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ADVENTURE
+ {0x02}, {0x0B}, {0x0B}, {0x29}, {0x0B}, {0xFF}
+ }, { // BOARD
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BALL
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BOOK
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FESTIVAL
+ {0x0B}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COMICS
+ {0x1A}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HOLIDAY
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PLANS
+ {0x0B}, {0x02}, {0x02}, {0x0B}, {0xFF}, {0xFF}
+ }, { // TRENDY
+ {0x11}, {0x11}, {0x11}, {0x11}, {0xFF}, {0xFF}
+ }, { // VACATION
+ {0x29}, {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOOK
+ {0x02}, {0x29}, {0x0B}, {0x0B}, {0xFF}, {0xFF}
+ }
+};
+
+
+static const struct BardSound BardMusic_TIME[][6] = {
+ { // FALL
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MORNING
+ {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TOMORROW
+ {0x11}, {0x0B}, {0x1A}, {0x0B}, {0xFF}, {0xFF}
+ }, { // LAST
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DAY
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SOMETIME
+ {0x11}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ALWAYS
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CURRENT
+ {0x1A}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FOREVER
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DAYS
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // END
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TUESDAY
+ {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YESTERDAY
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TODAY
+ {0x0B}, {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FRIDAY
+ {0x0B}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MONDAY
+ {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LATER
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EARLIER
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ANOTHER
+ {0x02}, {0x02}, {0x0B}, {0x0B}, {0xFF}, {0xFF}
+ }, { // TIME
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FINISH
+ {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WEDNESDAY
+ {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SOON
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // START
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MONTH
+ {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STOP
+ {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NOW
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FINAL
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NEXT
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AGE
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SATURDAY
+ {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SUMMER
+ {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SUNDAY
+ {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BEGINNING
+ {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPRING
+ {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DAYTIME
+ {0x02}, {0x0B}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // WINTER
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DAILY
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OLDEN
+ {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ALMOST
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NEARLY
+ {0x0B}, {0x11}, {0x02}, {0x0B}, {0xFF}, {0xFF}
+ }, { // THURSDAY
+ {0x1A}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NIGHTTIME
+ {0x0B}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NIGHT
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WEEK
+ {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+
+static const struct BardSound BardMusic_MISC[][6] = {
+ { // HIGHS
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOWS
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UM
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // REAR
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THINGS
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THING
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BELOW
+ {0x29}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ABOVE
+ {0x1A}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BACK
+ {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HIGH
+ {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HERE
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // INSIDE
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OUTSIDE
+ {0x02}, {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BESIDE
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THIS IS IT!
+ {0x02}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THIS
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EVERY
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THESE
+ {0x11}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THESE WERE
+ {0x11}, {0x0B}, {0x02}, {0x0B}, {0xFF}, {0xFF}
+ }, { // DOWN
+ {0x11}, {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THAT
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THOSE ARE
+ {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THOSE WERE
+ {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THAT’S IT!
+ {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AM
+ {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THAT WAS
+ {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FRONT
+ {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UP
+ {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHOICE
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FAR
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AWAY
+ {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NEAR
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHERE
+ {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHEN
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHAT
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DEEP
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHALLOW
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHY
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CONFUSED
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OPPOSITE
+ {0x0B}, {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // LEFT
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RIGHT
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+
+static const struct BardSound BardMusic_ADJECTIVES[][6] = {
+ { // WANDERING
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RICKETY
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ROCK-SOLID
+ {0x0B}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HUNGRY
+ {0x02}, {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TIGHT
+ {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TICKLISH
+ {0x11}, {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // TWIRLING
+ {0x0B}, {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPIRALING
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THIRSTY
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOLLING
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SILKY
+ {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SADLY
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HOPELESS
+ {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // USELESS
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DROOLING
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EXCITING
+ {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THICK
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SMOOTH
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SLIMY
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THIN
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BREAK
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VORACIOUS
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SCATTER
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AWESOME
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WIMPY
+ {0x02}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WOBBLY
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHAKY
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RIPPED
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHREDDED
+ {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // INCREASING
+ {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YET
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DESTROYED
+ {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FIERY
+ {0x11}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOVEY-DOVEY
+ {0x29}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HAPPILY
+ {0x0B}, {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ANTICIPATION
+ {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+
+static const struct BardSound BardMusic_EVENTS[][6] = {
+ { // APPEAL
+ {0x02}, {0x29}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EVENTS
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STAY-AT-HOME
+ {0x02}, {0x11}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // BERRY
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CONTEST
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MC
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // JUDGE
+ {0x29}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SUPER
+ {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STAGE
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HALL OF FAME
+ {0x29}, {0x0B}, {0x02}, {0x0B}, {0xFF}, {0xFF}
+ }, { // EVOLUTION
+ {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HYPER
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BATTLE TOWER
+ {0x29}, {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LEADERS
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BATTLE ROOM
+ {0x02}, {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HIDDEN
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SECRET BASE
+ {0x0B}, {0x0B}, {0x11}, {0x02}, {0x11}, {0xFF}
+ }, { // BLEND
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POKEBLOCK
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MASTER
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RANK
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RIBBON
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+
+static const struct BardSound BardMusic_MOVE_1[][6] = {
+ { // THUNDERBOLT
+ {0x1A}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IRON_TAIL
+ {0x0B}, {0x0B}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // ICE_BALL
+ {0x1A}, {0x0B}, {0x29}, {0x0B}, {0xFF}, {0xFF}
+ }, { // YAWN
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOVELY_KISS
+ {0x1A}, {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NIGHTMARE
+ {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MORNING_SUN
+ {0x1A}, {0x0B}, {0x02}, {0x29}, {0x0B}, {0xFF}
+ }, { // VITAL_THROW
+ {0x11}, {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DIG
+ {0x02}, {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THRASH
+ {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SWEET_SCENT
+ {0x1A}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHARM
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RAIN_DANCE
+ {0x0B}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CONFUSE_RAY
+ {0x1A}, {0x29}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HAIL
+ {0x02}, {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AROMATHERAPY
+ {0x02}, {0x1A}, {0x02}, {0x29}, {0xFF}, {0xFF}
+ }, { // BUBBLE
+ {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ENCORE
+ {0x29}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CUT
+ {0x0B}, {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // RAGE
+ {0x02}, {0x0B}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // SUPER_FANG
+ {0x29}, {0x0B}, {0x02}, {0x02}, {0xFF}, {0xFF}
+ }, { // PAIN_SPLIT
+ {0x0B}, {0x11}, {0x0B}, {0x11}, {0x0B}, {0xFF}
+ }, { // TORMENT
+ {0x1A}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STRING_SHOT
+ {0x02}, {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SWAGGER
+ {0x02}, {0x0B}, {0x0B}, {0x0B}, {0x11}, {0xFF}
+ }, { // SNORE
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HEAL_BELL
+ {0x11}, {0x02}, {0x1A}, {0x0B}, {0xFF}, {0xFF}
+ }, { // SCREECH
+ {0x0B}, {0x11}, {0x0B}, {0x0B}, {0x11}, {0xFF}
+ }, { // ROCK_THROW
+ {0x0B}, {0x11}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ROCK_SMASH
+ {0x0B}, {0x11}, {0x0B}, {0x0B}, {0xFF}, {0xFF}
+ }, { // ROCK_SLIDE
+ {0x0B}, {0x11}, {0x02}, {0x0B}, {0xFF}, {0xFF}
+ }, { // WEATHER_BALL
+ {0x0B}, {0x0B}, {0x1A}, {0x1A}, {0x1A}, {0x0B}
+ }, { // WHIRLPOOL
+ {0x11}, {0x29}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FAKE_TEARS
+ {0x29}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SING
+ {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPITE
+ {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AIR_CUTTER
+ {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AEROBLAST
+ {0x29}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SMOKESCREEN
+ {0x02}, {0x29}, {0x1A}, {0x0B}, {0xFF}, {0xFF}
+ }, { // PURSUIT
+ {0x0B}, {0x1A}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DOUBLE_SLAP
+ {0x29}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MIRROR_MOVE
+ {0x11}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OVERHEAT
+ {0x11}, {0x0B}, {0x1A}, {0x0B}, {0xFF}, {0xFF}
+ }, { // AURORA_BEAM
+ {0x02}, {0x29}, {0x1A}, {0x02}, {0x02}, {0xFF}
+ }, { // MEMENTO
+ {0x0B}, {0x0B}, {0x1A}, {0x1A}, {0x11}, {0xFF}
+ }, { // OCTAZOOKA
+ {0x1A}, {0x02}, {0x29}, {0x29}, {0x02}, {0xFF}
+ }, { // FLATTER
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ASTONISH
+ {0x0B}, {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WILL_O_WISP
+ {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RETURN
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GRUDGE
+ {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STRENGTH
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COUNTER
+ {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FLAME_WHEEL
+ {0x02}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FLAMETHROWER
+ {0x02}, {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ODOR_SLEUTH
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHARPEN
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DOUBLE_TEAM
+ {0x1A}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GUST
+ {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HARDEN
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DISABLE
+ {0x02}, {0x29}, {0x0B}, {0x0B}, {0xFF}, {0xFF}
+ }, { // RAZOR_WIND
+ {0x11}, {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BIDE
+ {0x0B}, {0x02}, {0x29}, {0x0B}, {0xFF}, {0xFF}
+ }, { // CRUNCH
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BITE
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THUNDER
+ {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THUNDER_PUNCH
+ {0x1A}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ENDEAVOR
+ {0x1A}, {0x11}, {0x29}, {0x02}, {0x11}, {0x1A}
+ }, { // FACADE
+ {0x02}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KARATE_CHOP
+ {0x02}, {0x02}, {0x0B}, {0x02}, {0xFF}, {0xFF}
+ }, { // CLAMP
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WITHDRAW
+ {0x02}, {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CONSTRICT
+ {0x29}, {0x02}, {0x0B}, {0x29}, {0xFF}, {0xFF}
+ }, { // BRICK_BREAK
+ {0x29}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ROCK_TOMB
+ {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FOCUS_ENERGY
+ {0x0B}, {0x0B}, {0x11}, {0x1A}, {0x29}, {0xFF}
+ }, { // FOCUS_PUNCH
+ {0x02}, {0x29}, {0x0B}, {0x02}, {0xFF}, {0xFF}
+ }, { // GIGA_DRAIN
+ {0x11}, {0x02}, {0x02}, {0x29}, {0x0B}, {0xFF}
+ }, { // REVERSAL
+ {0x0B}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SMELLING_SALT
+ {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPORE
+ {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LEECH_LIFE
+ {0x29}, {0x02}, {0x29}, {0x0B}, {0xFF}, {0xFF}
+ }, { // SLASH
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SILVER_WIND
+ {0x11}, {0x0B}, {0x02}, {0x29}, {0xFF}, {0xFF}
+ }, { // METAL_SOUND
+ {0x0B}, {0x02}, {0x02}, {0x29}, {0xFF}, {0xFF}
+ }, { // GRASS_WHISTLE
+ {0x02}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TICKLE
+ {0x02}, {0x02}, {0x1A}, {0x0B}, {0xFF}, {0xFF}
+ }, { // SPIDER_WEB
+ {0x11}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CRABHAMMER
+ {0x02}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HAZE
+ {0x29}, {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}
+ }, { // MEAN_LOOK
+ {0x1A}, {0x1A}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CROSS_CHOP
+ {0x0B}, {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OUTRAGE
+ {0x29}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOW_KICK
+ {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ANCIENT_POWER
+ {0x02}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SYNTHESIS
+ {0x11}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AGILITY
+ {0x02}, {0x11}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // RAPID_SPIN
+ {0x29}, {0x1A}, {0x0B}, {0x0B}, {0xFF}, {0xFF}
+ }, { // ICY_WIND
+ {0x0B}, {0x11}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MIND_READER
+ {0x11}, {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}
+ }, { // COSMIC_POWER
+ {0x1A}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SKY_ATTACK
+ {0x11}, {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}
+ }, { // POWDER_SNOW
+ {0x29}, {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}
+ }, { // FOLLOW_ME
+ {0x1A}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // METEOR_MASH
+ {0x0B}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ENDURE
+ {0x02}, {0x29}, {0x02}, {0x29}, {0xFF}, {0xFF}
+ }, { // ROLLOUT
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SCARY_FACE
+ {0x11}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PSYBEAM
+ {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PSYWAVE
+ {0x11}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PSYCHIC
+ {0x11}, {0x1A}, {0x11}, {0x0B}, {0x0B}, {0xFF}
+ }, { // HYPNOSIS
+ {0x11}, {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UPROAR
+ {0x02}, {0x29}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WATER_SPOUT
+ {0x1A}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SIGNAL_BEAM
+ {0x02}, {0x0B}, {0x0B}, {0x29}, {0x0B}, {0xFF}
+ }, { // PSYCH_UP
+ {0x11}, {0x1A}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SUBMISSION
+ {0x11}, {0x0B}, {0x1A}, {0x0B}, {0xFF}, {0xFF}
+ }, { // RECOVER
+ {0x0B}, {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EARTHQUAKE
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NATURE_POWER
+ {0x02}, {0x29}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LICK
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FLAIL
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TAIL_WHIP
+ {0x29}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SELF_DESTRUCT
+ {0x11}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STUN_SPORE
+ {0x02}, {0x0B}, {0x1A}, {0x0B}, {0xFF}, {0xFF}
+ }, { // BIND
+ {0x02}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHADOW_PUNCH
+ {0x11}, {0x0B}, {0x02}, {0x29}, {0xFF}, {0xFF}
+ }, { // SHADOW_BALL
+ {0x29}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHARGE
+ {0x02}, {0x0B}, {0x1A}, {0x02}, {0xFF}, {0xFF}
+ }, { // MIST
+ {0x0B}, {0x11}, {0x0B}, {0x0B}, {0xFF}, {0xFF}
+ }, { // FISSURE
+ {0x0B}, {0x1A}, {0x11}, {0x29}, {0xFF}, {0xFF}
+ }, { // EXTREME_SPEED
+ {0x29}, {0x1A}, {0x0B}, {0x1A}, {0xFF}, {0xFF}
+ }, { // EXTRASENSORY
+ {0x1A}, {0x0B}, {0x0B}, {0x1A}, {0xFF}, {0xFF}
+ }, { // SAFEGUARD
+ {0x1A}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ABSORB
+ {0x02}, {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SKY_UPPERCUT
+ {0x11}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SKILL_SWAP
+ {0x0B}, {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}
+ }, { // SKETCH
+ {0x02}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HEADBUTT
+ {0x1A}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DOUBLE_EDGE
+ {0x11}, {0x11}, {0x1A}, {0x02}, {0x0B}, {0xFF}
+ }, { // SANDSTORM
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SAND_ATTACK
+ {0x02}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SAND_TOMB
+ {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPARK
+ {0x29}, {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SWIFT
+ {0x0B}, {0x02}, {0x29}, {0x0B}, {0xFF}, {0xFF}
+ }, { // KINESIS
+ {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SMOG
+ {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GROWTH
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SACRED_FIRE
+ {0x0B}, {0x29}, {0x0B}, {0x0B}, {0x29}, {0x0B}
+ }, { // SHEER_COLD
+ {0x0B}, {0x11}, {0x0B}, {0x0B}, {0x0B}, {0xFF}
+ }, { // SOLAR_BEAM
+ {0x1A}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SONIC_BOOM
+ {0x29}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FLY
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+
+static const struct BardSound BardMusic_MOVE_2[][6] = {
+ { // TACKLE
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EXPLOSION
+ {0x0B}, {0x1A}, {0x11}, {0x1A}, {0xFF}, {0xFF}
+ }, { // DIVE
+ {0x02}, {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FIRE_BLAST
+ {0x0B}, {0x29}, {0x0B}, {0x29}, {0xFF}, {0xFF}
+ }, { // WATERFALL
+ {0x02}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MUDDY_WATER
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STOCKPILE
+ {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SLAM
+ {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TWISTER
+ {0x11}, {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BULLET_SEED
+ {0x29}, {0x0B}, {0x02}, {0x02}, {0xFF}, {0xFF}
+ }, { // TWINEEDLE
+ {0x29}, {0x1A}, {0x02}, {0x0B}, {0xFF}, {0xFF}
+ }, { // SOFT_BOILED
+ {0x0B}, {0x11}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // EGG_BOMB
+ {0x0B}, {0x11}, {0x0B}, {0x1A}, {0x0B}, {0xFF}
+ }, { // FAINT_ATTACK
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BARRAGE
+ {0x02}, {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MINIMIZE
+ {0x1A}, {0x11}, {0x02}, {0x1A}, {0xFF}, {0xFF}
+ }, { // SEISMIC_TOSS
+ {0x0B}, {0x1A}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SUPERSONIC
+ {0x29}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TAUNT
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MOONLIGHT
+ {0x1A}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PECK
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ARM_THRUST
+ {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HORN_ATTACK
+ {0x1A}, {0x02}, {0x02}, {0x0B}, {0xFF}, {0xFF}
+ }, { // HORN_DRILL
+ {0x1A}, {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WING_ATTACK
+ {0x11}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AERIAL_ACE
+ {0x02}, {0x0B}, {0x1A}, {0x02}, {0xFF}, {0xFF}
+ }, { // SWORDS_DANCE
+ {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VINE_WHIP
+ {0x02}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CONVERSION
+ {0x29}, {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CONVERSION_2
+ {0x29}, {0x02}, {0x29}, {0x0B}, {0x11}, {0xFF}
+ }, { // HELPING_HAND
+ {0x0B}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IRON_DEFENSE
+ {0x0B}, {0x11}, {0x0B}, {0x02}, {0x0B}, {0xFF}
+ }, { // TELEPORT
+ {0x0B}, {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THUNDER_SHOCK
+ {0x1A}, {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHOCK_WAVE
+ {0x1A}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // QUICK_ATTACK
+ {0x29}, {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SWEET_KISS
+ {0x11}, {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THUNDER_WAVE
+ {0x1A}, {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}
+ }, { // ZAP_CANNON
+ {0x11}, {0x02}, {0x1A}, {0x0B}, {0xFF}, {0xFF}
+ }, { // BLOCK
+ {0x11}, {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HOWL
+ {0x02}, {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POISON_GAS
+ {0x11}, {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TOXIC
+ {0x1A}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POISON_FANG
+ {0x11}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POISON_POWDER
+ {0x11}, {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POISON_STING
+ {0x11}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPIKE_CANNON
+ {0x1A}, {0x02}, {0x1A}, {0x0B}, {0xFF}, {0xFF}
+ }, { // ACID_ARMOR
+ {0x0B}, {0x29}, {0x0B}, {0x02}, {0x0B}, {0xFF}
+ }, { // TAKE_DOWN
+ {0x1A}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // JUMP_KICK
+ {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BOUNCE
+ {0x29}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HI_JUMP_KICK
+ {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TRI_ATTACK
+ {0x11}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DRAGON_CLAW
+ {0x02}, {0x0B}, {0x02}, {0x29}, {0x0B}, {0xFF}
+ }, { // TRICK
+ {0x11}, {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TRIPLE_KICK
+ {0x0B}, {0x11}, {0x02}, {0x11}, {0xFF}, {0xFF}
+ }, { // DRILL_PECK
+ {0x1A}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MUD_SPORT
+ {0x0B}, {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MUD_SLAP
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THIEF
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AMNESIA
+ {0x02}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NIGHT_SHADE
+ {0x02}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GROWL
+ {0x0B}, {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SLACK_OFF
+ {0x02}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SURF
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ROLE_PLAY
+ {0x1A}, {0x0B}, {0x02}, {0x29}, {0xFF}, {0xFF}
+ }, { // NEEDLE_ARM
+ {0x11}, {0x0B}, {0x02}, {0x0B}, {0xFF}, {0xFF}
+ }, { // DOUBLE_KICK
+ {0x1A}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SUNNY_DAY
+ {0x1A}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LEER
+ {0x11}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WISH
+ {0x29}, {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FAKE_OUT
+ {0x1A}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SLEEP_TALK
+ {0x02}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PAY_DAY
+ {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ASSIST
+ {0x29}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HEAT_WAVE
+ {0x11}, {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}
+ }, { // SLEEP_POWDER
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // REST
+ {0x0B}, {0x1A}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // INGRAIN
+ {0x0B}, {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CONFUSION
+ {0x1A}, {0x29}, {0x11}, {0x1A}, {0xFF}, {0xFF}
+ }, { // BODY_SLAM
+ {0x1A}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SWALLOW
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CURSE
+ {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HYDRO_PUMP
+ {0x11}, {0x1A}, {0x29}, {0x0B}, {0xFF}, {0xFF}
+ }, { // HYPER_VOICE
+ {0x02}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HYPER_BEAM
+ {0x11}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SUPERPOWER
+ {0x02}, {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STEEL_WING
+ {0x02}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPIT_UP
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DYNAMIC_PUNCH
+ {0x29}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GUILLOTINE
+ {0x11}, {0x1A}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // VICE_GRIP
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KNOCK_OFF
+ {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POUND
+ {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RAZOR_LEAF
+ {0x02}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BATON_PASS
+ {0x02}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PETAL_DANCE
+ {0x0B}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPLASH
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BUBBLE_BEAM
+ {0x29}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BELLY_DRUM
+ {0x02}, {0x29}, {0x1A}, {0x0B}, {0xFF}, {0xFF}
+ }, { // BARRIER
+ {0x02}, {0x11}, {0x0B}, {0x0B}, {0xFF}, {0xFF}
+ }, { // LIGHT_SCREEN
+ {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SCRATCH
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HYPER_FANG
+ {0x11}, {0x0B}, {0x02}, {0x02}, {0xFF}, {0xFF}
+ }, { // EMBER
+ {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SECRET_POWER
+ {0x0B}, {0x0B}, {0x11}, {0x02}, {0x29}, {0x0B}
+ }, { // DIZZY_PUNCH
+ {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BULK_UP
+ {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IMPRISON
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FEATHER_DANCE
+ {0x02}, {0x29}, {0x0B}, {0x0B}, {0x11}, {0x0B}
+ }, { // WHIRLWIND
+ {0x11}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BEAT_UP
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BLIZZARD
+ {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STOMP
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FLASH
+ {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TEETER_DANCE
+ {0x02}, {0x29}, {0x0B}, {0x02}, {0xFF}, {0xFF}
+ }, { // CRUSH_CLAW
+ {0x0B}, {0x02}, {0x02}, {0x29}, {0x0B}, {0xFF}
+ }, { // BLAZE_KICK
+ {0x0B}, {0x29}, {0x0B}, {0x0B}, {0x0B}, {0xFF}
+ }, { // PRESENT
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ERUPTION
+ {0x0B}, {0x29}, {0x11}, {0x1A}, {0xFF}, {0xFF}
+ }, { // SLUDGE
+ {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SLUDGE_BOMB
+ {0x02}, {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GLARE
+ {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TRANSFORM
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POISON_TAIL
+ {0x11}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ROAR
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BONE_RUSH
+ {0x1A}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CAMOUFLAGE
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COVET
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TAIL_GLOW
+ {0x0B}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BONE_CLUB
+ {0x1A}, {0x0B}, {0x0B}, {0x29}, {0x0B}, {0xFF}
+ }, { // BONEMERANG
+ {0x1A}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FIRE_SPIN
+ {0x0B}, {0x29}, {0x0B}, {0x11}, {0x0B}, {0xFF}
+ }, { // FIRE_PUNCH
+ {0x0B}, {0x29}, {0x0B}, {0x02}, {0xFF}, {0xFF}
+ }, { // PERISH_SONG
+ {0x02}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WRAP
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPIKES
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAGNITUDE
+ {0x11}, {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // MAGICAL_LEAF
+ {0x02}, {0x29}, {0x0B}, {0x02}, {0xFF}, {0xFF}
+ }, { // MAGIC_COAT
+ {0x02}, {0x11}, {0x02}, {0x0B}, {0xFF}, {0xFF}
+ }, { // MUD_SHOT
+ {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MACH_PUNCH
+ {0x0B}, {0x1A}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PROTECT
+ {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DEFENSE_CURL
+ {0x0B}, {0x11}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // ROLLING_KICK
+ {0x0B}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SUBSTITUTE
+ {0x0B}, {0x0B}, {0x02}, {0x1A}, {0xFF}, {0xFF}
+ }, { // DETECT
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PIN_MISSILE
+ {0x02}, {0x0B}, {0x02}, {0x0B}, {0x0B}, {0xFF}
+ }, { // WATER_SPORT
+ {0x02}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WATER_GUN
+ {0x02}, {0x02}, {0x02}, {0x0B}, {0xFF}, {0xFF}
+ }, { // MIST_BALL
+ {0x0B}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WATER_PULSE
+ {0x02}, {0x02}, {0x0B}, {0x0B}, {0xFF}, {0xFF}
+ }, { // FURY_ATTACK
+ {0x29}, {0x11}, {0x0B}, {0x02}, {0xFF}, {0xFF}
+ }, { // FURY_SWIPES
+ {0x02}, {0x29}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // DESTINY_BOND
+ {0x02}, {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FALSE_SWIPE
+ {0x29}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FORESIGHT
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MIRROR_COAT
+ {0x11}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FUTURE_SIGHT
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MILK_DRINK
+ {0x11}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CALM_MIND
+ {0x0B}, {0x02}, {0x0B}, {0x29}, {0xFF}, {0xFF}
+ }, { // MEGA_DRAIN
+ {0x0B}, {0x02}, {0x02}, {0x29}, {0x0B}, {0xFF}
+ }, { // MEGA_KICK
+ {0x0B}, {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MEGA_PUNCH
+ {0x0B}, {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MEGAHORN
+ {0x11}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HIDDEN_POWER
+ {0x02}, {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}
+ }, { // METAL_CLAW
+ {0x0B}, {0x02}, {0x02}, {0x29}, {0x0B}, {0xFF}
+ }, { // ATTRACT
+ {0x02}, {0x11}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MIMIC
+ {0x11}, {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FRUSTRATION
+ {0x29}, {0x02}, {0x11}, {0x1A}, {0xFF}, {0xFF}
+ }, { // LEECH_SEED
+ {0x0B}, {0x0B}, {0x02}, {0x0B}, {0xFF}, {0xFF}
+ }, { // METRONOME
+ {0x0B}, {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DREAM_EATER
+ {0x02}, {0x29}, {0x0B}, {0x0B}, {0xFF}, {0xFF}
+ }, { // ACID
+ {0x0B}, {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MEDITATE
+ {0x0B}, {0x11}, {0x02}, {0x11}, {0x1A}, {0xFF}
+ }, { // SNATCH
+ {0x11}, {0x0B}, {0x02}, {0x0B}, {0xFF}, {0xFF}
+ }, { // LUSTER_PURGE
+ {0x0B}, {0x11}, {0x0B}, {0x0B}, {0xFF}, {0xFF}
+ }, { // LEAF_BLADE
+ {0x02}, {0x29}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // RECYCLE
+ {0x02}, {0x29}, {0x0B}, {0x0B}, {0x11}, {0x29}
+ }, { // REFLECT
+ {0x0B}, {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // REFRESH
+ {0x0B}, {0x11}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // REVENGE
+ {0x0B}, {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DRAGON_RAGE
+ {0x02}, {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DRAGON_BREATH
+ {0x0B}, {0x29}, {0x1A}, {0x0B}, {0xFF}, {0xFF}
+ }, { // DRAGON_DANCE
+ {0x02}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ICE_PUNCH
+ {0x0B}, {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ICE_BEAM
+ {0x0B}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FURY_CUTTER
+ {0x1A}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COMET_PUNCH
+ {0x1A}, {0x0B}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // SKULL_BASH
+ {0x0B}, {0x0B}, {0x29}, {0x0B}, {0xFF}, {0xFF}
+ }, { // LOCK_ON
+ {0x11}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ROCK_BLAST
+ {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COTTON_SPORE
+ {0x02}, {0x29}, {0x1A}, {0x02}, {0x02}, {0xFF}
+ }, { // STRUGGLE
+ {0x0B}, {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }
+};
+
+
+static const struct BardSound BardMusic_TRENDY_SAYING[][6] = {
+ { // KTHX, BYE.
+ {0x1A}, {0x29}, {0x11}, {0x02}, {0xFF}, {0xFF}
+ }, { // YES, SIR!
+ {0x0B}, {0x11}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // AVANT GARDE
+ {0x02}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COUPLE
+ {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MUCH OBLIGED
+ {0x11}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YEEHAW!
+ {0x11}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MEGA
+ {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // 1-HIT KO!
+ {0x29}, {0x11}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DESTINY
+ {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CANCEL
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NEW
+ {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FLATTEN
+ {0x0B}, {0x0B}, {0x0B}, {0x0B}, {0x0B}, {0xFF}
+ }, { // KIDDING
+ {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOSER
+ {0x29}, {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOSING
+ {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HAPPENING
+ {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HIP AND
+ {0x11}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHAKE
+ {0x02}, {0x02}, {0x0B}, {0x02}, {0xFF}, {0xFF}
+ }, { // SHADY
+ {0x1A}, {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UPBEAT
+ {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MODERN
+ {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SMELL YA
+ {0x11}, {0x0B}, {0x02}, {0x0B}, {0xFF}, {0xFF}
+ }, { // BANG
+ {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KNOCKOUT
+ {0x11}, {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HASSLE
+ {0x02}, {0x29}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WINNER
+ {0x0B}, {0x29}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // FEVER
+ {0x0B}, {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // WANNABE
+ {0x0B}, {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BABY
+ {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HEART
+ {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OLD
+ {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YOUNG
+ {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UGLY
+ {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+
+static const struct BardSound BardMusic_POKEMON_2[][6] = {
+ { // EKANS
+ {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ARBOK
+ {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SEAKING
+ {0x1A}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ARIADOS
+ {0x02}, {0x11}, {0x02}, {0x1A}, {0xFF}, {0xFF}
+ }, { // CROCONAW
+ {0x11}, {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UNOWN
+ {0x11}, {0x1A}, {0x11}, {0x1A}, {0xFF}, {0xFF}
+ }, { // EEVEE
+ {0x0B}, {0x1A}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GEODUDE
+ {0x0B}, {0x11}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // SPINARAK
+ {0x0B}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PILOSWINE
+ {0x0B}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ONIX
+ {0x1A}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ARCANINE
+ {0x02}, {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SUDOWOODO
+ {0x1A}, {0x0B}, {0x02}, {0x29}, {0xFF}, {0xFF}
+ }, { // WEEPINBELL
+ {0x29}, {0x11}, {0x02}, {0x11}, {0x02}, {0xFF}
+ }, { // VICTREEBEL
+ {0x02}, {0x0B}, {0x11}, {0x02}, {0xFF}, {0xFF}
+ }, { // WOOPER
+ {0x0B}, {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SWINUB
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SKARMORY
+ {0x02}, {0x02}, {0x0B}, {0x1A}, {0xFF}, {0xFF}
+ }, { // AIPOM
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ESPEON
+ {0x11}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HITMONCHAN
+ {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ELEKID
+ {0x0B}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ELECTABUZZ
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ENTEI
+ {0x0B}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FERALIGATR
+ {0x11}, {0x0B}, {0x02}, {0x1A}, {0xFF}, {0xFF}
+ }, { // FURRET
+ {0x11}, {0x0B}, {0x11}, {0x1A}, {0xFF}, {0xFF}
+ }, { // OCTILLERY
+ {0x1A}, {0x11}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // PRIMEAPE
+ {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SENTRET
+ {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STANTLER
+ {0x02}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPEAROW
+ {0x02}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FEAROW
+ {0x11}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OMASTAR
+ {0x02}, {0x1A}, {0x1A}, {0x1A}, {0xFF}, {0xFF}
+ }, { // OMANYTE
+ {0x02}, {0x1A}, {0x11}, {0x02}, {0xFF}, {0xFF}
+ }, { // GROWLITHE
+ {0x29}, {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MACHAMP
+ {0x02}, {0x1A}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // DRAGONITE
+ {0x02}, {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PINSIR
+ {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SNORLAX
+ {0x0B}, {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KABUTO
+ {0x02}, {0x29}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KABUTOPS
+ {0x02}, {0x29}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HITMONTOP
+ {0x02}, {0x1A}, {0x0B}, {0x02}, {0xFF}, {0xFF}
+ }, { // WARTORTLE
+ {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BLASTOISE
+ {0x29}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FARFETCHD
+ {0x1A}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CUBONE
+ {0x02}, {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAROWAK
+ {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KANGASKHAN
+ {0x02}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SUNFLORA
+ {0x1A}, {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CATERPIE
+ {0x02}, {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GYARADOS
+ {0x02}, {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RAPIDASH
+ {0x02}, {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NINETALES
+ {0x29}, {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GIRAFARIG
+ {0x11}, {0x02}, {0x02}, {0x11}, {0xFF}, {0xFF}
+ }, { // BELLOSSOM
+ {0x29}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KINGDRA
+ {0x0B}, {0x0B}, {0x02}, {0x11}, {0xFF}, {0xFF}
+ }, { // KINGLER
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GLOOM
+ {0x29}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PINECO
+ {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GLIGAR
+ {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KRABBY
+ {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GRANBULL
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CROBAT
+ {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ABRA
+ {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GENGAR
+ {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TAUROS
+ {0x02}, {0x29}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAGIKARP
+ {0x02}, {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAGNEMITE
+ {0x02}, {0x0B}, {0x11}, {0x1A}, {0xFF}, {0xFF}
+ }, { // GASTLY
+ {0x0B}, {0x29}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HAUNTER
+ {0x02}, {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MACHOKE
+ {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KAKUNA
+ {0x1A}, {0x29}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PSYDUCK
+ {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PHANPY
+ {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RATTATA
+ {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GOLDUCK
+ {0x0B}, {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GOLBAT
+ {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GOLEM
+ {0x0B}, {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GRAVELER
+ {0x0B}, {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VENONAT
+ {0x29}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RHYDON
+ {0x11}, {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RHYHORN
+ {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PUPITAR
+ {0x29}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CORSOLA
+ {0x1A}, {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HITMONLEE
+ {0x11}, {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ZAPDOS
+ {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // JOLTEON
+ {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SANDSHREW
+ {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SANDSLASH
+ {0x02}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SEADRA
+ {0x0B}, {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHELLDER
+ {0x29}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VAPOREON
+ {0x02}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DEWGONG
+ {0x29}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SUICUNE
+ {0x29}, {0x11}, {0x29}, {0x0B}, {0xFF}, {0xFF}
+ }, { // STARMIE
+ {0x02}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SCYTHER
+ {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ZUBAT
+ {0x29}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BEEDRILL
+ {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HYPNO
+ {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DROWZEE
+ {0x02}, {0x29}, {0x02}, {0x1A}, {0xFF}, {0xFF}
+ }, { // SQUIRTLE
+ {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CELEBI
+ {0x0B}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WOBBUFFET
+ {0x1A}, {0x11}, {0x0B}, {0x02}, {0x29}, {0xFF}
+ }, { // DUGTRIO
+ {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HORSEA
+ {0x0B}, {0x0B}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EXEGGCUTE
+ {0x1A}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHIKORITA
+ {0x0B}, {0x11}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // CHINCHOU
+ {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHUCKLE
+ {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DIGLETT
+ {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // REMORAID
+ {0x0B}, {0x1A}, {0x02}, {0x11}, {0xFF}, {0xFF}
+ }, { // DELIBIRD
+ {0x1A}, {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HOUNDOUR
+ {0x29}, {0x29}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AMPHAROS
+ {0x02}, {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DODUO
+ {0x1A}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DODRIO
+ {0x1A}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SMEARGLE
+ {0x02}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KOFFING
+ {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TENTACRUEL
+ {0x0B}, {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TOGETIC
+ {0x1A}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TOGEPI
+ {0x1A}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GOLDEEN
+ {0x1A}, {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // METAPOD
+ {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DONPHAN
+ {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ODDISH
+ {0x11}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EXEGGUTOR
+ {0x1A}, {0x1A}, {0x0B}, {0x11}, {0xFF}, {0xFF}
+ }, { // NIDOKING
+ {0x11}, {0x1A}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NIDOQUEEN
+ {0x11}, {0x1A}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NIDORAN_F
+ {0x11}, {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NIDORAN_M
+ {0x11}, {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NIDORINA
+ {0x11}, {0x1A}, {0x11}, {0x02}, {0xFF}, {0xFF}
+ }, { // NIDORINO
+ {0x11}, {0x1A}, {0x11}, {0x1A}, {0xFF}, {0xFF}
+ }, { // MEOWTH
+ {0x02}, {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SNEASEL
+ {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POLIWHIRL
+ {0x02}, {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POLITOED
+ {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POLIWRATH
+ {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POLIWAG
+ {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // QUAGSIRE
+ {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NATU
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // XATU
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DUNSPARCE
+ {0x29}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SEEL
+ {0x29}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STEELIX
+ {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TYPHLOSION
+ {0x1A}, {0x29}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DRAGONAIR
+ {0x02}, {0x1A}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BUTTERFREE
+ {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SCIZOR
+ {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HOPPIP
+ {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BLISSEY
+ {0x0B}, {0x11}, {0x0B}, {0x11}, {0x02}, {0xFF}
+ }, { // PARAS
+ {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PARASECT
+ {0x02}, {0x02}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // QWILFISH
+ {0x02}, {0x1A}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MR_MIME
+ {0x02}, {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TYROGUE
+ {0x02}, {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CLOYSTER
+ {0x02}, {0x29}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TYRANITAR
+ {0x0B}, {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CLEFFA
+ {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WEEDLE
+ {0x1A}, {0x11}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PIKACHU
+ {0x11}, {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CLEFABLE
+ {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PIDGEOT
+ {0x02}, {0x29}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PIDGEOTTO
+ {0x02}, {0x29}, {0x1A}, {0x02}, {0xFF}, {0xFF}
+ }, { // PICHU
+ {0x11}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CLEFAIRY
+ {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHARMANDER
+ {0x29}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STARYU
+ {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CYNDAQUIL
+ {0x0B}, {0x29}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // SUNKERN
+ {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TEDDIURSA
+ {0x0B}, {0x11}, {0x29}, {0x02}, {0xFF}, {0xFF}
+ }, { // VOLTORB
+ {0x1A}, {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MOLTRES
+ {0x02}, {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FLAREON
+ {0x02}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ALAKAZAM
+ {0x11}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAGMAR
+ {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FORRETRESS
+ {0x1A}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WIGGLYTUFF
+ {0x29}, {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IVYSAUR
+ {0x11}, {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BULBASAUR
+ {0x11}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VENUSAUR
+ {0x11}, {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AERODACTYL
+ {0x02}, {0x0B}, {0x1A}, {0x02}, {0x11}, {0xFF}
+ }, { // MAGBY
+ {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IGGLYBUFF
+ {0x29}, {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UMBREON
+ {0x02}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ARTICUNO
+ {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // JIGGLYPUFF
+ {0x29}, {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SNUBBULL
+ {0x29}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BAYLEEF
+ {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GRIMER
+ {0x0B}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MUK
+ {0x0B}, {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HERACROSS
+ {0x02}, {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HOUNDOOM
+ {0x29}, {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PERSIAN
+ {0x1A}, {0x11}, {0x11}, {0x02}, {0xFF}, {0xFF}
+ }, { // LICKITUNG
+ {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HO_OH
+ {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HOOTHOOT
+ {0x1A}, {0x1A}, {0x1A}, {0x1A}, {0xFF}, {0xFF}
+ }, { // PIDGEY
+ {0x02}, {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PONYTA
+ {0x1A}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SKIPLOOM
+ {0x29}, {0x0B}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PORYGON
+ {0x1A}, {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PORYGON2
+ {0x1A}, {0x11}, {0x1A}, {0x0B}, {0x11}, {0xFF}
+ }, { // MAGCARGO
+ {0x02}, {0x02}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SLUGMA
+ {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // QUILAVA
+ {0x11}, {0x0B}, {0x02}, {0x02}, {0xFF}, {0xFF}
+ }, { // BELLSPROUT
+ {0x1A}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WEEZING
+ {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MARILL
+ {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AZUMARILL
+ {0x02}, {0x29}, {0x02}, {0x11}, {0xFF}, {0xFF}
+ }, { // ELECTRODE
+ {0x0B}, {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MANKEY
+ {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MANTINE
+ {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DRATINI
+ {0x02}, {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MEW
+ {0x11}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MEWTWO
+ {0x11}, {0x29}, {0x29}, {0x29}, {0xFF}, {0xFF}
+ }, { // MILTANK
+ {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MISDREAVUS
+ {0x02}, {0x29}, {0x29}, {0x11}, {0xFF}, {0xFF}
+ }, { // SMOOCHUM
+ {0x29}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MEGANIUM
+ {0x0B}, {0x02}, {0x11}, {0x0B}, {0xFF}, {0xFF}
+ }, { // DITTO
+ {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TENTACOOL
+ {0x0B}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAREEP
+ {0x1A}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FLAAFFY
+ {0x02}, {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VENOMOTH
+ {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TANGELA
+ {0x02}, {0x0B}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SLOWKING
+ {0x02}, {0x1A}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SLOWBRO
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SLOWPOKE
+ {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MURKROW
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YANMA
+ {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KADABRA
+ {0x02}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LARVITAR
+ {0x02}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NOCTOWL
+ {0x1A}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RAIKOU
+ {0x02}, {0x11}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RAICHU
+ {0x02}, {0x11}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHANSEY
+ {0x02}, {0x0B}, {0x11}, {0x02}, {0xFF}, {0xFF}
+ }, { // RATICATE
+ {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LAPRAS
+ {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VILEPLUME
+ {0x11}, {0x1A}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LANTURN
+ {0x02}, {0x29}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHARMELEON
+ {0x29}, {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHARIZARD
+ {0x29}, {0x02}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // URSARING
+ {0x29}, {0x02}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // JYNX
+ {0x1A}, {0x02}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LUGIA
+ {0x29}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAGNETON
+ {0x02}, {0x0B}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LEDIAN
+ {0x0B}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LEDYBA
+ {0x0B}, {0x11}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VULPIX
+ {0x29}, {0x11}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // JUMPLUFF
+ {0x02}, {0x29}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TOTODILE
+ {0x02}, {0x11}, {0x02}, {0x11}, {0xFF}, {0xFF}
+ }, { // MACHOP
+ {0x02}, {0x1A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+#endif //GUARD_DATA_BARD_MUSIC_H
diff --git a/src/data/bard_music_en.h b/src/data/bard_music_en.h
new file mode 100644
index 000000000..98f4d4def
--- /dev/null
+++ b/src/data/bard_music_en.h
@@ -0,0 +1,3678 @@
+#ifndef GUARD_DATA_BARD_MUSIC_H
+#define GUARD_DATA_BARD_MUSIC_H
+
+/*static*/ const struct BardSound BardMusic_POKEMON[][6] = {
+ { // ARMALDO
+ {0x1B}, {0x1B}, {0x18}, {0x33}, {0xFF}, {0xFF}
+ }, { // BEAUTIFLY
+ {0x2D}, {0x09}, {0x12}, {0x33}, {0xFF}, {0xFF}
+ }, { // MEDITITE
+ {0x09}, {0x11}, {0x12}, {0x33}, {0xFF}, {0xFF}
+ }, { // SEAKING
+ {0x0C}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TORCHIC
+ {0x18}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ANORITH
+ {0x00}, {0x18}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ABSOL
+ {0x00}, {0x18}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SURSKIT
+ {0x30}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MASQUERAIN
+ {0x00}, {0x30}, {0x03}, {0x33}, {0xFF}, {0xFF}
+ }, { // GEODUDE
+ {0x0C}, {0x18}, {0x27}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ILLUMISE
+ {0x0C}, {0x27}, {0x0C}, {0x03}, {0xFF}, {0xFF}
+ }, { // SKARMORY
+ {0x1B}, {0x1A}, {0x0C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SKITTY
+ {0x11}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DELCATTY
+ {0x09}, {0x00}, {0x0C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SWELLOW
+ {0x09}, {0x18}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GLALIE
+ {0x05}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KYOGRE
+ {0x12}, {0x18}, {0x30}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MACHAMP
+ {0x2A}, {0x00}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PINSIR
+ {0x11}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KECLEON
+ {0x09}, {0x0C}, {0x1B}, {0x33}, {0xFF}, {0xFF}
+ }, { // SHUPPET
+ {0x2A}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SILCOON
+ {0x11}, {0x28}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BRELOOM
+ {0x09}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHROOMISH
+ {0x27}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CARVANHA
+ {0x1B}, {0x01}, {0x2A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TREECKO
+ {0x0C}, {0x18}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WINGULL
+ {0x0F}, {0x24}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GYARADOS
+ {0x1D}, {0x09}, {0x11}, {0x1D}, {0xFF}, {0xFF}
+ }, { // NINETALES
+ {0x12}, {0x05}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GIRAFARIG
+ {0x30}, {0x00}, {0x2A}, {0x11}, {0xFF}, {0xFF}
+ }, { // KIRLIA
+ {0x30}, {0x0C}, {0x2A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BELLOSSOM
+ {0x09}, {0x1B}, {0x2C}, {0x33}, {0xFF}, {0xFF}
+ }, { // KINGDRA
+ {0x0C}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GLOOM
+ {0x27}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAWILE
+ {0x1B}, {0x12}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GROUDON
+ {0x21}, {0x1B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MIGHTYENA
+ {0x12}, {0x0C}, {0x09}, {0x2C}, {0xFF}, {0xFF}
+ }, { // CROBAT
+ {0x18}, {0x00}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ABRA
+ {0x00}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SLAKING
+ {0x00}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WURMPLE
+ {0x30}, {0x24}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAGIKARP
+ {0x00}, {0x11}, {0x1B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAGNEMITE
+ {0x00}, {0x09}, {0x12}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TORKOAL
+ {0x18}, {0x1A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MACHOKE
+ {0x2A}, {0x1A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GULPIN
+ {0x24}, {0x0F}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ARON
+ {0x1B}, {0x1D}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PSYDUCK
+ {0x12}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LAIRON
+ {0x05}, {0x1B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHISMUR
+ {0x11}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NUZLEAF
+ {0x2C}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PHANPY
+ {0x00}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHELGON
+ {0x09}, {0x1B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GOLDUCK
+ {0x18}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GOLBAT
+ {0x1A}, {0x00}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GOLEM
+ {0x18}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GRAVELER
+ {0x00}, {0x09}, {0x30}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GARDEVOIR
+ {0x1B}, {0x09}, {0x1B}, {0x33}, {0xFF}, {0xFF}
+ }, { // RHYDON
+ {0x12}, {0x15}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RHYHORN
+ {0x14}, {0x1A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GOREBYSS
+ {0x1A}, {0x2C}, {0x11}, {0x33}, {0xFF}, {0xFF}
+ }, { // CORSOLA
+ {0x18}, {0x18}, {0x2A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CACNEA
+ {0x00}, {0x0C}, {0x2A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DUSCLOPS
+ {0x2A}, {0x1B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHARPEDO
+ {0x1D}, {0x0C}, {0x18}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ZANGOOSE
+ {0x03}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SANDSHREW
+ {0x00}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SANDSLASH
+ {0x00}, {0x00}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SEADRA
+ {0x0C}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RELICANTH
+ {0x09}, {0x11}, {0x00}, {0x33}, {0xFF}, {0xFF}
+ }, { // ZIGZAGOON
+ {0x11}, {0x00}, {0x27}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CRAWDAUNT
+ {0x1B}, {0x1B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SCEPTILE
+ {0x09}, {0x12}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GROVYLE
+ {0x18}, {0x12}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BANETTE
+ {0x03}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // JIRACHI
+ {0x30}, {0x1B}, {0x0C}, {0x33}, {0xFF}, {0xFF}
+ }, { // STARMIE
+ {0x1B}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ZUBAT
+ {0x27}, {0x00}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TAILLOW
+ {0x03}, {0x1A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WYNAUT
+ {0x12}, {0x1B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WOBBUFFET
+ {0x1D}, {0x2C}, {0x09}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SOLROCK
+ {0x18}, {0x1B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHIFTRY
+ {0x11}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HORSEA
+ {0x1A}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BAGON
+ {0x05}, {0x1B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SEEDOT
+ {0x0C}, {0x1B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPHEAL
+ {0x0E}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BELDUM
+ {0x09}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MEDICHAM
+ {0x09}, {0x11}, {0x00}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHINCHOU
+ {0x0F}, {0x21}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHIMECHO
+ {0x12}, {0x09}, {0x18}, {0x33}, {0xFF}, {0xFF}
+ }, { // ALTARIA
+ {0x06}, {0x1B}, {0x0C}, {0x2A}, {0xFF}, {0xFF}
+ }, { // SWABLU
+ {0x1B}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NINCADA
+ {0x0F}, {0x06}, {0x06}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DEOXYS
+ {0x0C}, {0x1B}, {0x11}, {0x33}, {0xFF}, {0xFF}
+ }, { // NINJASK
+ {0x0F}, {0x00}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DODUO
+ {0x1A}, {0x27}, {0x18}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DODRIO
+ {0x1A}, {0x0C}, {0x18}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KOFFING
+ {0x15}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TENTACRUEL
+ {0x09}, {0x2A}, {0x27}, {0x33}, {0xFF}, {0xFF}
+ }, { // DUSTOX
+ {0x2C}, {0x17}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOUDRED
+ {0x21}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GOLDEEN
+ {0x1A}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BARBOACH
+ {0x1B}, {0x18}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SEALEO
+ {0x0C}, {0x0C}, {0x18}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WALREIN
+ {0x1B}, {0x03}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TROPIUS
+ {0x18}, {0x0C}, {0x2A}, {0x33}, {0xFF}, {0xFF}
+ }, { // DONPHAN
+ {0x1B}, {0x00}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NUMEL
+ {0x2C}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ODDISH
+ {0x15}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TRAPINCH
+ {0x00}, {0x0F}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SLAKOTH
+ {0x00}, {0x1B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHISCASH
+ {0x11}, {0x00}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHEDINJA
+ {0x09}, {0x0F}, {0x2A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MARSHTOMP
+ {0x1B}, {0x1D}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NATU
+ {0x00}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // XATU
+ {0x00}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CLAYDOL
+ {0x03}, {0x1B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CACTURNE
+ {0x00}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NOSEPASS
+ {0x18}, {0x00}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CLAMPERL
+ {0x00}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CAMERUPT
+ {0x00}, {0x30}, {0x2A}, {0x33}, {0xFF}, {0xFF}
+ }, { // EXPLOUD
+ {0x09}, {0x21}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BLAZIKEN
+ {0x03}, {0x11}, {0x0F}, {0x33}, {0xFF}, {0xFF}
+ }, { // LOMBRE
+ {0x18}, {0x03}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOTAD
+ {0x18}, {0x00}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPINDA
+ {0x0F}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPOINK
+ {0x1E}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SEVIPER
+ {0x09}, {0x12}, {0x30}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HARIYAMA
+ {0x1B}, {0x0C}, {0x1B}, {0x2A}, {0xFF}, {0xFF}
+ }, { // VOLBEAT
+ {0x18}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HUNTAIL
+ {0x2A}, {0x05}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PIKACHU
+ {0x0C}, {0x2A}, {0x27}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PICHU
+ {0x0C}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STARYU
+ {0x1B}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VIBRAVA
+ {0x11}, {0x1B}, {0x2A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VOLTORB
+ {0x1A}, {0x18}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FEEBAS
+ {0x0E}, {0x00}, {0x33}, {0x33}, {0xFF}, {0xFF}
+ }, { // ALAKAZAM
+ {0x00}, {0x2C}, {0x2C}, {0x00}, {0xFF}, {0xFF}
+ }, { // GRUMPIG
+ {0x2C}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WIGGLYTUFF
+ {0x11}, {0x27}, {0x0C}, {0x2A}, {0x33}, {0xFF}
+ }, { // IGGLYBUFF
+ {0x11}, {0x2A}, {0x0C}, {0x2A}, {0xFF}, {0xFF}
+ }, { // FLYGON
+ {0x12}, {0x1B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PLUSLE
+ {0x2A}, {0x24}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // JIGGLYPUFF
+ {0x11}, {0x27}, {0x0C}, {0x2A}, {0x33}, {0xFF}
+ }, { // CORPHISH
+ {0x18}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GRIMER
+ {0x12}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MUK
+ {0x2A}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HERACROSS
+ {0x09}, {0x2A}, {0x1B}, {0x33}, {0xFF}, {0xFF}
+ }, { // PELIPPER
+ {0x09}, {0x0C}, {0x30}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WAILORD
+ {0x03}, {0x1A}, {0x33}, {0x33}, {0xFF}, {0xFF}
+ }, { // WAILMER
+ {0x05}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SALAMENCE
+ {0x00}, {0x00}, {0x09}, {0x33}, {0xFF}, {0xFF}
+ }, { // AGGRON
+ {0x00}, {0x1B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POOCHYENA
+ {0x27}, {0x0C}, {0x09}, {0x2C}, {0xFF}, {0xFF}
+ }, { // CASTFORM
+ {0x00}, {0x1A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MINUN
+ {0x12}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAGCARGO
+ {0x00}, {0x1B}, {0x18}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAKUHITA
+ {0x1B}, {0x27}, {0x0C}, {0x2A}, {0xFF}, {0xFF}
+ }, { // SLUGMA
+ {0x2C}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WEEZING
+ {0x0C}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LINOONE
+ {0x14}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CASCOON
+ {0x00}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MARILL
+ {0x08}, {0x10}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AZUMARILL
+ {0x08}, {0x27}, {0x2C}, {0x10}, {0xFF}, {0xFF}
+ }, { // SWALOT
+ {0x1B}, {0x1B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ELECTRODE
+ {0x0C}, {0x09}, {0x18}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MUDKIP
+ {0x2C}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MILOTIC
+ {0x12}, {0x18}, {0x11}, {0x33}, {0xFF}, {0xFF}
+ }, { // METAGROSS
+ {0x09}, {0x2A}, {0x18}, {0x33}, {0xFF}, {0xFF}
+ }, { // METANG
+ {0x09}, {0x00}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TENTACOOL
+ {0x09}, {0x2A}, {0x27}, {0x33}, {0xFF}, {0xFF}
+ }, { // BALTOY
+ {0x01}, {0x1E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SABLEYE
+ {0x03}, {0x0B}, {0x12}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VIGOROTH
+ {0x11}, {0x30}, {0x1B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SNORUNT
+ {0x18}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CRADILY
+ {0x03}, {0x11}, {0x0C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KADABRA
+ {0x2C}, {0x00}, {0x2C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DUSKULL
+ {0x2A}, {0x26}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RAICHU
+ {0x12}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MANECTRIC
+ {0x00}, {0x09}, {0x11}, {0x33}, {0xFF}, {0xFF}
+ }, { // SWAMPERT
+ {0x1B}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ELECTRIKE
+ {0x0C}, {0x09}, {0x12}, {0x33}, {0xFF}, {0xFF}
+ }, { // LATIAS
+ {0x00}, {0x0C}, {0x00}, {0x33}, {0xFF}, {0xFF}
+ }, { // LATIOS
+ {0x00}, {0x0C}, {0x18}, {0x33}, {0xFF}, {0xFF}
+ }, { // LUVDISC
+ {0x2C}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VILEPLUME
+ {0x14}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RALTS
+ {0x07}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LANTURN
+ {0x00}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LILEEP
+ {0x11}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LUNATONE
+ {0x27}, {0x2C}, {0x18}, {0x33}, {0xFF}, {0xFF}
+ }, { // AZURILL
+ {0x06}, {0x27}, {0x0F}, {0x33}, {0xFF}, {0xFF}
+ }, { // LUDICOLO
+ {0x27}, {0x09}, {0x1A}, {0x1A}, {0xFF}, {0xFF}
+ }, { // MAGNETON
+ {0x00}, {0x09}, {0x2A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // REGICE
+ {0x09}, {0x0C}, {0x12}, {0x33}, {0xFF}, {0xFF}
+ }, { // REGISTEEL
+ {0x09}, {0x0C}, {0x0E}, {0x33}, {0xFF}, {0xFF}
+ }, { // REGIROCK
+ {0x09}, {0x0C}, {0x1B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RAYQUAZA
+ {0x03}, {0x03}, {0x2A}, {0x33}, {0xFF}, {0xFF}
+ }, { // VULPIX
+ {0x24}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ROSELIA
+ {0x18}, {0x09}, {0x0C}, {0x2A}, {0xFF}, {0xFF}
+ }, { // COMBUSKEN
+ {0x2C}, {0x2C}, {0x0F}, {0x33}, {0xFF}, {0xFF}
+ }, { // MACHOP
+ {0x2A}, {0x15}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+/*static*/ const struct BardSound BardMusic_TRAINER[][6] = {
+ { // I CHOOSE YOU
+ {0x12}, {0x27}, {0x2D}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GOTCHA
+ {0x15}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TRADE
+ {0x03}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SAPPHIRE
+ {0x00}, {0x12}, {0x32}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EVOLVE
+ {0x0C}, {0x1B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ENCYCLOPEDIA
+ {0x09}, {0x12}, {0x18}, {0x0C}, {0x0C}, {0x06}
+ }, { // NATURE
+ {0x03}, {0x30}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CENTER
+ {0x09}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EGG
+ {0x09}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LINK
+ {0x0C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SP. ABILITY
+ {0x09}, {0x08}, {0x06}, {0x11}, {0x11}, {0x0C}
+ }, { // TRAINER
+ {0x03}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VERSION
+ {0x32}, {0x0F}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POKéNAV
+ {0x18}, {0x0C}, {0x00}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POKéMON
+ {0x18}, {0x0C}, {0x1B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GET
+ {0x09}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POKéDEX
+ {0x18}, {0x0C}, {0x09}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RUBY
+ {0x27}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LEVEL
+ {0x09}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+/*static*/ const struct BardSound BardMusic_STATUS[][6] = {
+ { // DARK
+ {0x08}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STENCH
+ {0x09}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THICK FAT
+ {0x11}, {0x00}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RAIN DISH
+ {0x03}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DRIZZLE
+ {0x11}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ARENA TRAP
+ {0x06}, {0x0C}, {0x06}, {0x00}, {0xFF}, {0xFF}
+ }, { // INTIMIDATE
+ {0x0F}, {0x11}, {0x2C}, {0x03}, {0xFF}, {0xFF}
+ }, { // ROCK HEAD
+ {0x15}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COLOR
+ {0x2C}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ALT. COLOR
+ {0x1B}, {0x32}, {0x01}, {0x2C}, {0x30}, {0xFF}
+ }, { // ROCK
+ {0x15}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BEAUTIFUL
+ {0x27}, {0x0C}, {0x24}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BEAUTY
+ {0x27}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AIR LOCK
+ {0x09}, {0x15}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PSYCHIC
+ {0x12}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HYPER CUTTER
+ {0x12}, {0x30}, {0x2C}, {0x30}, {0xFF}, {0xFF}
+ }, { // FIGHTING
+ {0x12}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHADOW TAG
+ {0x00}, {0x18}, {0x00}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SMART
+ {0x06}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SMARTNESS
+ {0x06}, {0x32}, {0x09}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPEED BOOST
+ {0x0C}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COOL
+ {0x29}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COOLNESS
+ {0x29}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BATTLE ARMOR
+ {0x00}, {0x09}, {0x06}, {0x30}, {0xFF}, {0xFF}
+ }, { // CUTE
+ {0x2D}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CUTENESS
+ {0x2D}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STURDY
+ {0x30}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SUCTION CUPS
+ {0x2A}, {0x0F}, {0x2A}, {0x33}, {0x33}, {0xFF}
+ }, { // GRASS
+ {0x00}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CLEAR BODY
+ {0x0E}, {0x17}, {0x0C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TORRENT
+ {0x1A}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GHOST
+ {0x15}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ICE
+ {0x12}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GUTS
+ {0x2C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ROUGH SKIN
+ {0x2C}, {0x0F}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHELL ARMOR
+ {0x09}, {0x06}, {0x30}, {0x33}, {0xFF}, {0xFF}
+ }, { // NATURAL CURE
+ {0x00}, {0x32}, {0x08}, {0x30}, {0x33}, {0xFF}
+ }, { // DAMP
+ {0x00}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GROUND
+ {0x21}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LIMBER
+ {0x0F}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAGNET PULL
+ {0x00}, {0x09}, {0x2C}, {0x33}, {0xFF}, {0xFF}
+ }, { // WHITE SMOKE
+ {0x12}, {0x18}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SYNCHRONIZE
+ {0x0F}, {0x18}, {0x12}, {0x33}, {0xFF}, {0xFF}
+ }, { // OVERGROW
+ {0x18}, {0x30}, {0x18}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SWIFT SWIM
+ {0x11}, {0x0F}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SAND STREAM
+ {0x02}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SAND VEIL
+ {0x02}, {0x03}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KEEN EYE
+ {0x0C}, {0x12}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // INNERFOCUS
+ {0x0F}, {0x30}, {0x18}, {0x2A}, {0xFF}, {0xFF}
+ }, { // STATIC
+ {0x00}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TYPE
+ {0x12}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TOUGH
+ {0x2C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TOUGHNESS
+ {0x2C}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHED SKIN
+ {0x09}, {0x0F}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HUGE POWER
+ {0x2D}, {0x21}, {0x30}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VOLT ABSORB
+ {0x24}, {0x2C}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WATER ABSORB
+ {0x06}, {0x30}, {0x2C}, {0x1A}, {0xFF}, {0xFF}
+ }, { // ELECTRIC
+ {0x0B}, {0x09}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FORECAST
+ {0x1A}, {0x02}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SERENE GRACE
+ {0x30}, {0x0E}, {0x03}, {0x33}, {0xFF}, {0xFF}
+ }, { // POISON
+ {0x20}, {0x1B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POISON POINT
+ {0x20}, {0x1B}, {0x1E}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DRAGON
+ {0x01}, {0x1B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TRACE
+ {0x04}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OBLIVIOUS
+ {0x2C}, {0x11}, {0x0C}, {0x2C}, {0x33}, {0xFF}
+ }, { // TRUANT
+ {0x27}, {0x00}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RUN AWAY
+ {0x2A}, {0x08}, {0x05}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STICKY HOLD
+ {0x11}, {0x0C}, {0x18}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CLOUD NINE
+ {0x21}, {0x12}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NORMAL
+ {0x1A}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STEEL
+ {0x0E}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ILLUMINATE
+ {0x11}, {0x27}, {0x0F}, {0x03}, {0xFF}, {0xFF}
+ }, { // EARLY BIRD
+ {0x30}, {0x0C}, {0x30}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HUSTLE
+ {0x2A}, {0x26}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHINE
+ {0x12}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FLYING
+ {0x12}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DROUGHT
+ {0x21}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LIGHTNINGROD
+ {0x12}, {0x11}, {0x15}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COMPOUNDEYES
+ {0x15}, {0x21}, {0x12}, {0x33}, {0xFF}, {0xFF}
+ }, { // MARVEL SCALE
+ {0x06}, {0x24}, {0x05}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WONDER GUARD
+ {0x2A}, {0x30}, {0x06}, {0xFF}, {0xFF}, {0xFF}
+ }, { // INSOMNIA
+ {0x0F}, {0x15}, {0x0C}, {0x06}, {0xFF}, {0xFF}
+ }, { // LEVITATE
+ {0x09}, {0x0C}, {0x03}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PLUS
+ {0x2A}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PRESSURE
+ {0x09}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LIQUID OOZE
+ {0x11}, {0x09}, {0x27}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COLOR CHANGE
+ {0x17}, {0x30}, {0x03}, {0x33}, {0xFF}, {0xFF}
+ }, { // SOUNDPROOF
+ {0x21}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EFFECT SPORE
+ {0x0C}, {0x09}, {0x1A}, {0x33}, {0xFF}, {0xFF}
+ }, { // PKRS
+ {0x18}, {0x0C}, {0x2A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FIRE
+ {0x14}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FLAME BODY
+ {0x03}, {0x15}, {0x0C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MINUS
+ {0x12}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OWN TEMPO
+ {0x18}, {0x09}, {0x18}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAGMA ARMOR
+ {0x01}, {0x2C}, {0x1B}, {0x30}, {0xFF}, {0xFF}
+ }, { // WATER
+ {0x06}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WATER VEIL
+ {0x06}, {0x30}, {0x04}, {0x33}, {0xFF}, {0xFF}
+ }, { // BUG
+ {0x2A}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SWARM
+ {0x07}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CUTE CHARM
+ {0x2D}, {0x07}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IMMUNITY
+ {0x11}, {0x27}, {0x11}, {0x0C}, {0xFF}, {0xFF}
+ }, { // BLAZE
+ {0x03}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PICKUP
+ {0x11}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PATTERN
+ {0x00}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FLASH FIRE
+ {0x00}, {0x14}, {0x30}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VITAL SPIRIT
+ {0x12}, {0x1B}, {0x30}, {0x11}, {0xFF}, {0xFF}
+ }, { // CHLOROPHYLL
+ {0x1A}, {0x2C}, {0x11}, {0x33}, {0xFF}, {0xFF}
+ }, { // PURE POWER
+ {0x2D}, {0x21}, {0x30}, {0x33}, {0xFF}, {0xFF}
+ }, { // SHIELD DUST
+ {0x0E}, {0x2B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+/*static*/ const struct BardSound BardMusic_BATTLE[][6] = {
+ { // MATCH UP
+ {0x02}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GO
+ {0x18}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NO. 1
+ {0x2A}, {0x30}, {0x2C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DECIDE
+ {0x0C}, {0x12}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LET ME WIN
+ {0x09}, {0x0C}, {0x0F}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WINS
+ {0x0F}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WIN
+ {0x0F}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WON
+ {0x17}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IF I WIN
+ {0x0F}, {0x12}, {0x0F}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHEN I WIN
+ {0x0F}, {0x12}, {0x0F}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CAN’T WIN
+ {0x02}, {0x0F}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CAN WIN
+ {0x00}, {0x0F}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NO MATCH
+ {0x18}, {0x00}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPIRIT
+ {0x09}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DECIDED
+ {0x0C}, {0x12}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TRUMP CARD
+ {0x2C}, {0x08}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TAKE THAT
+ {0x05}, {0x01}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COME ON
+ {0x2C}, {0x17}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ATTACK
+ {0x2A}, {0x02}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SURRENDER
+ {0x30}, {0x09}, {0x30}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GUTSY
+ {0x2C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TALENT
+ {0x01}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STRATEGY
+ {0x00}, {0x0B}, {0x0C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SMITE
+ {0x12}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MATCH
+ {0x00}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VICTORY
+ {0x11}, {0x32}, {0x0E}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OFFENSIVE
+ {0x15}, {0x0B}, {0x11}, {0x33}, {0xFF}, {0xFF}
+ }, { // SENSE
+ {0x0B}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VERSUS
+ {0x30}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FIGHTS
+ {0x12}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POWER
+ {0x23}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHALLENGE
+ {0x01}, {0x0A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STRONG
+ {0x1B}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TOO STRONG
+ {0x29}, {0x1D}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GO EASY
+ {0x18}, {0x0C}, {0x0E}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FOE
+ {0x1A}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GENIUS
+ {0x0E}, {0x0E}, {0x2C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LEGEND
+ {0x09}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ESCAPE
+ {0x09}, {0x05}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AIM
+ {0x03}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BATTLE
+ {0x00}, {0x26}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FIGHT
+ {0x12}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RESUSCITATE
+ {0x0C}, {0x09}, {0x11}, {0x05}, {0xFF}, {0xFF}
+ }, { // POINTS
+ {0x1E}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SERIOUS
+ {0x0C}, {0x0E}, {0x2C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GIVE UP
+ {0x11}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOSS
+ {0x17}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IF I LOSE
+ {0x0F}, {0x12}, {0x27}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOST
+ {0x16}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOSE
+ {0x27}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GUARD
+ {0x08}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PARTNER
+ {0x15}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // REJECT
+ {0x0C}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ACCEPT
+ {0x00}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // INVINCIBLE
+ {0x0F}, {0x11}, {0x2C}, {0x24}, {0xFF}, {0xFF}
+ }, { // RECEIVED
+ {0x0C}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EASY
+ {0x0C}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WEAK
+ {0x0C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TOO WEAK
+ {0x27}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PUSHOVER
+ {0x29}, {0x1A}, {0x30}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LEADER
+ {0x0C}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RULE
+ {0x26}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MOVE
+ {0x29}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+/*static*/ const struct BardSound BardMusic_GREETINGS[][6] = {
+ { // THANKS
+ {0x03}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YES
+ {0x0B}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HERE GOES
+ {0x30}, {0x18}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HERE I COME
+ {0x30}, {0x12}, {0x17}, {0x33}, {0xFF}, {0xFF}
+ }, { // HERE IT IS
+ {0x30}, {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YEAH
+ {0x02}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WELCOME
+ {0x09}, {0x17}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OI
+ {0x1E}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HOW DO
+ {0x21}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CONGRATS
+ {0x2C}, {0x02}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GIVE ME
+ {0x11}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SORRY
+ {0x1B}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // APOLOGIZE
+ {0x2C}, {0x06}, {0x17}, {0x12}, {0x33}, {0xFF}
+ }, { // FORGIVE
+ {0x1A}, {0x10}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HEY, THERE
+ {0x04}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HELLO
+ {0x09}, {0x18}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GOOD-BYE
+ {0x26}, {0x14}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THANK YOU
+ {0x03}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // I’VE ARRIVED
+ {0x12}, {0x06}, {0x12}, {0x33}, {0xFF}, {0xFF}
+ }, { // PARDON
+ {0x1D}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EXCUSE
+ {0x09}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SEE YA
+ {0x0E}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EXCUSE ME
+ {0x0B}, {0x28}, {0x0D}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WELL, THEN
+ {0x09}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GO AHEAD
+ {0x1A}, {0x2C}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // APPRECIATE
+ {0x00}, {0x0C}, {0x0E}, {0x05}, {0xFF}, {0xFF}
+ }, { // HEY?
+ {0x04}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHAT’S UP?
+ {0x2C}, {0x2B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HUH?
+ {0x2C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NO
+ {0x18}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HI
+ {0x12}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YEAH, YEAH
+ {0x0A}, {0x0A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BYE-BYE
+ {0x14}, {0x12}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MEET YOU
+ {0x0E}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HEY
+ {0x05}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SMELL
+ {0x0D}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LISTENING
+ {0x11}, {0x0B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HOO-HAH
+ {0x27}, {0x01}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YAHOO
+ {0x00}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YO
+ {0x18}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COME OVER
+ {0x2C}, {0x18}, {0x32}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COUNT ON
+ {0x23}, {0x17}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+/*static*/ const struct BardSound BardMusic_PEOPLE[][6] = {
+ { // OPPONENT
+ {0x2C}, {0x1A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // I
+ {0x13}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YOU
+ {0x2D}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YOURS
+ {0x1A}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SON
+ {0x27}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YOUR
+ {0x1A, 0xF7}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YOU’RE
+ {0x26}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YOU’VE
+ {0x2D}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MOTHER
+ {0x2C}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GRANDFATHER
+ {0x01}, {0x08}, {0x32}, {0x33}, {0xFF}, {0xFF}
+ }, { // UNCLE
+ {0x2C}, {0x26}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FATHER
+ {0x08}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BOY
+ {0x1E}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ADULT
+ {0x00}, {0x24}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BROTHER
+ {0x15}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SISTER
+ {0x11}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GRANDMOTHER
+ {0x01}, {0x2C}, {0x32}, {0x33}, {0xFF}, {0xFF}
+ }, { // AUNT
+ {0x07}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PARENT
+ {0x09}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAN
+ {0x00}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ME
+ {0x0D}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GIRL
+ {0x30}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BABE
+ {0x04}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FAMILY
+ {0x00}, {0x11}, {0x0E}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HER
+ {0x32}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HIM
+ {0x0F}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HE
+ {0x0C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PLACE
+ {0x03}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DAUGHTER
+ {0x27}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HIS
+ {0x10}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HE’S
+ {0x0C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AREN’T
+ {0x1C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SIBLINGS
+ {0x11}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KID
+ {0x11}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHILDREN
+ {0x11}, {0x0A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MR.
+ {0x11}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MRS.
+ {0x11}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MYSELF
+ {0x12}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // I WAS
+ {0x12}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TO ME
+ {0x27}, {0x0D}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MY
+ {0x12}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // I AM
+ {0x12}, {0x02}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // I’VE
+ {0x14}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHO
+ {0x29}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SOMEONE
+ {0x2A}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHO WAS
+ {0x27}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TO WHOM
+ {0x27}, {0x29}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHOSE
+ {0x27}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHO IS
+ {0x27}, {0x10}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IT’S
+ {0x10}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LADY
+ {0x05}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FRIEND
+ {0x09}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ALLY
+ {0x00}, {0x14}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PERSON
+ {0x32}, {0x1D}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DUDE
+ {0x28}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THEY
+ {0x05}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THEY WERE
+ {0x05}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TO THEM
+ {0x27}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THEIR
+ {0x31}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THEY’RE
+ {0x31}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THEY’VE
+ {0x03}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WE
+ {0x0C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BEEN
+ {0x0F}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TO US
+ {0x27}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OUR
+ {0x21}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WE’RE
+ {0x0C}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RIVAL
+ {0x12}, {0x24}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WE’VE
+ {0x0C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WOMAN
+ {0x26}, {0x02}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHE
+ {0x0C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHE WAS
+ {0x0C}, {0x2B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TO HER
+ {0x27}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HER’S
+ {0x30}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHE IS
+ {0x0C}, {0x10}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SOME
+ {0x0C}, {0x01}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+/*static*/ const struct BardSound BardMusic_VOICES[][6] = {
+ { // !
+ {0x12}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // !!
+ {0x12}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ?!
+ {0x12}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ?
+ {0x12}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // …
+ {0x0C}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // …!
+ {0x0C}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ………
+ {0x0C}, {0x30}, {0x33}, {0x0C}, {0x30}, {0xFF}
+ }, { // -
+ {0x12}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // - - -
+ {0x12}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UH-OH
+ {0x2C}, {0x1A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WAAAH
+ {0x1B, 0x05, 0x08}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AHAHA
+ {0x06}, {0x06}, {0x06}, {0x33}, {0x33}, {0xFF}
+ }, { // OH?
+ {0x18}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NOPE
+ {0x18}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // URGH
+ {0x31}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HMM
+ {0x28}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHOAH
+ {0x19}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WROOOAAR!
+ {0x1C}, {0x31}, {0x33}, {0x33}, {0xFF}, {0xFF}
+ }, { // WOW
+ {0x23}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GIGGLE
+ {0x11}, {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SIGH
+ {0x0A}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UNBELIEVABLE
+ {0x2C}, {0x0E}, {0x0C}, {0x02}, {0x24}, {0xFF}
+ }, { // CRIES
+ {0x13}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AGREE
+ {0x06}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EH?
+ {0x2A}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CRY
+ {0x12}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EHEHE
+ {0x0C}, {0x0C}, {0x0C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OI, OI, OI
+ {0x1E}, {0x1E}, {0x1E}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OH, YEAH
+ {0x18}, {0x01}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OH
+ {0x18}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OOPS
+ {0x27}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHOCKED
+ {0x17}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EEK
+ {0x0D}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GRAAAH
+ {0x06}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GWAHAHAHA
+ {0x06}, {0x06}, {0x06}, {0x17}, {0xFF}, {0xFF}
+ }, { // WAY
+ {0x05}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TCH
+ {0x09}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HEHE
+ {0x0C}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HAH
+ {0x06}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YUP
+ {0x2C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HAHAHA
+ {0x06}, {0x06}, {0x06}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AIYEEH
+ {0x13}, {0x0D}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HIYAH
+ {0x0C}, {0x07}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FUFUFU
+ {0x27}, {0x27}, {0x27}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOL
+ {0x18}, {0x1A}, {0x18}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SNORT
+ {0x1A}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HUMPH
+ {0x2A}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HEHEHE
+ {0x0C}, {0x0C}, {0x0C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HEH
+ {0x09}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HOHOHO
+ {0x18}, {0x18}, {0x18}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UH-HUH
+ {0x2A}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OH, DEAR
+ {0x18}, {0x0E}, {0x30}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ARRGH
+ {0x1C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MUFUFU
+ {0x27}, {0x27}, {0x27}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MMM
+ {0x0F}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OH-KAY
+ {0x18}, {0x04}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OKAY
+ {0x18}, {0x04}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LALALA
+ {0x06}, {0x06}, {0x06}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YAY
+ {0x04}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AWW
+ {0x07}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WOWEE
+ {0x22}, {0x0D}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GWAH
+ {0x07}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WAHAHAHA
+ {0x06}, {0x06}, {0x06}, {0x06}, {0xFF}, {0xFF}
+ }
+};
+
+/*static*/ const struct BardSound BardMusic_SPEECH[][6] = {
+ { // LISTEN
+ {0x09}, {0x10}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NOT VERY
+ {0x15}, {0x09}, {0x0C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MEAN
+ {0x0E}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LIE
+ {0x12}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LAY
+ {0x05}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RECOMMEND
+ {0x09}, {0x2C}, {0x0A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NITWIT
+ {0x0F}, {0x0F}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // QUITE
+ {0x14}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FROM
+ {0x2B}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FEELING
+ {0x0C}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BUT
+ {0x2C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HOWEVER
+ {0x21}, {0x09}, {0x30}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CASE
+ {0x0C}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THE
+ {0x2B}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MISS
+ {0x11}, {0xFF}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HOW
+ {0x21}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HIT
+ {0x11}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ENOUGH
+ {0x0E}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // A LOT
+ {0x03}, {0x17}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // A LITTLE
+ {0x03}, {0x11}, {0x26}, {0x33}, {0xFF}, {0xFF}
+ }, { // ABSOLUTELY
+ {0x00}, {0x2C}, {0x2D}, {0x0E}, {0x33}, {0xFF}
+ }, { // AND
+ {0x00}, {0xFF}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ONLY
+ {0x1A}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AROUND
+ {0x0A}, {0xFF}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PROBABLY
+ {0x15}, {0x2C}, {0x0E}, {0x33}, {0xFF}, {0xFF}
+ }, { // IF
+ {0x11}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VERY
+ {0x0A}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // A TINY BIT
+ {0x2C}, {0x14}, {0x0C}, {0x11}, {0xFF}, {0xFF}
+ }, { // WILD
+ {0x12}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THAT’S
+ {0x00}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // JUST
+ {0x2C}, {0xFF}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EVEN SO,
+ {0x0C}, {0x0B}, {0x1A}, {0x33}, {0xFF}, {0xFF}
+ }, { // MUST BE
+ {0x2C}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NATURALLY
+ {0x01}, {0x30}, {0x06}, {0x0E}, {0x33}, {0xFF}
+ }, { // FOR NOW,
+ {0x1A}, {0x23}, {0xFF}, {0x33}, {0xFF}, {0xFF}
+ }, { // UNDERSTOOD
+ {0x2C}, {0x32}, {0x27}, {0xFF}, {0xFF}, {0xFF}
+ }, { // JOKING
+ {0x18}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // READY
+ {0x09}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SOMETHING
+ {0x1B}, {0x0E}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SOMEHOW
+ {0x1B}, {0x23}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ALTHOUGH
+ {0x06}, {0x1A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ALSO
+ {0x06}, {0x1A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PERFECT
+ {0x32}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AS MUCH AS
+ {0x01}, {0x2C}, {0x01}, {0xFF}, {0xFF}, {0xFF}
+ }, { // REALLY
+ {0x0C}, {0x0A}, {0x0E}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TRULY
+ {0x27}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SERIOUSLY
+ {0x11}, {0x0E}, {0x26}, {0x0E}, {0x33}, {0xFF}
+ }, { // TOTALLY
+ {0x18}, {0x07}, {0x0E}, {0x33}, {0xFF}, {0xFF}
+ }, { // UNTIL
+ {0x2C}, {0x10}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AS IF
+ {0x01}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MOOD
+ {0x28}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RATHER
+ {0x00}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AWFULLY
+ {0x06}, {0x26}, {0x0E}, {0x33}, {0xFF}, {0xFF}
+ }, { // MODE
+ {0x1A}, {0xFF}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MORE
+ {0x1A}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TOO LATE
+ {0x27}, {0x05}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FINALLY
+ {0x12}, {0x06}, {0x0E}, {0x33}, {0xFF}, {0xFF}
+ }, { // ANY
+ {0x08}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // INSTEAD
+ {0x0F}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FANTASTIC
+ {0x2B}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+/*static*/ const struct BardSound BardMusic_ENDINGS[][6] = {
+ { // WILL
+ {0x10}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WILL BE HERE
+ {0x10}, {0x0C}, {0x30}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OR
+ {0x1A}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TIMES
+ {0x14}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WONDER
+ {0x2C}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IS IT?
+ {0x11}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BE
+ {0x0E}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GIMME
+ {0x11}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COULD
+ {0x26}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LIKELY TO
+ {0x14}, {0x0E}, {0x27}, {0x33}, {0xFF}, {0xFF}
+ }, { // WOULD
+ {0x26}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IS
+ {0x10}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ISN’T IT?
+ {0x11}, {0x09}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LET’S
+ {0x0B}, {0xFF}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OTHER
+ {0x2C}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ARE
+ {0x1C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WAS
+ {0x2C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WERE
+ {0x32}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THOSE
+ {0x18}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ISN’T
+ {0x0F}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WON’T
+ {0x1A}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CAN’T
+ {0x00}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CAN
+ {0x00}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DON’T
+ {0x1A}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DO
+ {0x27}, {0xFF}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DOES
+ {0x2C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHOM
+ {0x27}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHICH
+ {0x11}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WASN’T
+ {0x2C}, {0x0F}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WEREN’T
+ {0x32}, {0x0F}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HAVE
+ {0x00}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HAVEN’T
+ {0x00}, {0x0F}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // A
+ {0x03}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AN
+ {0x02}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NOT
+ {0x17}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THERE
+ {0x0B}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OK?
+ {0x1A}, {0x04}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SO
+ {0x1A}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAYBE
+ {0x03}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ABOUT
+ {0x2A}, {0x23}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OVER
+ {0x18}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IT
+ {0x11}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ALL
+ {0x06}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FOR
+ {0x26}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ON
+ {0x1C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OFF
+ {0x1D}, {0xFF}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AS
+ {0x01}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TO
+ {0x27}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WITH
+ {0x11}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BETTER
+ {0x09}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EVER
+ {0x09}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SINCE
+ {0x0F}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OF
+ {0x2A}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BELONGS TO
+ {0x27}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AT
+ {0x02}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IN
+ {0x0F}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OUT
+ {0x21}, {0xFF}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TOO
+ {0x27}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LIKE
+ {0x14}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DID
+ {0x11}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DIDN’T
+ {0x11}, {0x0F}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DOESN’T
+ {0x2C}, {0x0F}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WITHOUT
+ {0x11}, {0x23}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AFTER
+ {0x00}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BEFORE
+ {0x0C}, {0x26}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHILE
+ {0x14}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THAN
+ {0x02}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ONCE
+ {0x2C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ANYWHERE
+ {0x0E}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+/*static*/ const struct BardSound BardMusic_FEELINGS[][6] = {
+ { // MEET
+ {0x0C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PLAY
+ {0x04}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HURRIED
+ {0x32}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GOES
+ {0x19}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GIDDY
+ {0x11}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HAPPY
+ {0x00}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HAPPINESS
+ {0x00}, {0x0C}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EXCITE
+ {0x0B}, {0x14}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IMPORTANT
+ {0x0F}, {0x1A}, {0x00}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FUNNY
+ {0x2C}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GOT
+ {0x17}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GO HOME
+ {0x18}, {0x1A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DISAPPOINTED
+ {0x11}, {0x00}, {0x1E}, {0x0B}, {0xFF}, {0xFF}
+ }, { // DISAPPOINTS
+ {0x11}, {0x00}, {0x20}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SAD
+ {0x02}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TRY
+ {0x12}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TRIES
+ {0x14}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HEARS
+ {0x31}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THINK
+ {0x0D}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HEAR
+ {0x31}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WANTS
+ {0x08}, {0xFF}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MISHEARD
+ {0x11}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DISLIKE
+ {0x11}, {0x14}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ANGRY
+ {0x05}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ANGER
+ {0x05}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SCARY
+ {0x0B}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LONESOME
+ {0x18}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DISAPPOINT
+ {0x11}, {0x2A}, {0x20}, {0xFF}, {0xFF}, {0xFF}
+ }, { // JOY
+ {0x20}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GETS
+ {0x11}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NEVER
+ {0x0B}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DARN
+ {0x08}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DOWNCAST
+ {0x21}, {0x02}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // INCREDIBLE
+ {0x0F}, {0x0B}, {0x11}, {0x26}, {0xFF}, {0xFF}
+ }, { // LIKES
+ {0x14}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DISLIKES
+ {0x11}, {0x12}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BORING
+ {0x1A}, {0x11}, {0x33}, {0x33}, {0xFF}, {0xFF}
+ }, { // CARE
+ {0x31}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CARES
+ {0x31}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ALL RIGHT
+ {0x06}, {0x14}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ADORE
+ {0x2C}, {0x1A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DISASTER
+ {0x11}, {0x00}, {0x32}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ENJOY
+ {0x11}, {0x20}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ENJOYS
+ {0x11}, {0x20}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EAT
+ {0x0E}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LACKING
+ {0x02}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BAD
+ {0x02}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HARD
+ {0x1D}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TERRIBLE
+ {0x0B}, {0x2A}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHOULD
+ {0x29}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NICE
+ {0x14}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DRINK
+ {0x11}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SURPRISE
+ {0x32}, {0x14}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FEAR
+ {0x32}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WANT
+ {0x2C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WAIT
+ {0x03}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SATISFIED
+ {0x00}, {0x11}, {0x14}, {0x33}, {0xFF}, {0xFF}
+ }, { // SEE
+ {0x0C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RARE
+ {0x32}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NEGATIVE
+ {0x0B}, {0x2C}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DONE
+ {0x2C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DANGER
+ {0x03}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DEFEATED
+ {0x0E}, {0x0E}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BEAT
+ {0x0E}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GREAT
+ {0x04}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ROMANTIC
+ {0x1A}, {0x00}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // QUESTION
+ {0x0B}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UNDERSTAND
+ {0x2C}, {0x32}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UNDERSTANDS
+ {0x2C}, {0x32}, {0x02}, {0x33}, {0xFF}, {0xFF}
+ }
+};
+
+/*static*/ const struct BardSound BardMusic_CONDITIONS[][6] = {
+ { // HOT
+ {0x15}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EXISTS
+ {0x0B}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EXCESS
+ {0x0B}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // APPROVED
+ {0x06}, {0x29}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HAS
+ {0x01}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GOOD
+ {0x26}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LESS
+ {0x0B}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MOMENTUM
+ {0x1A}, {0x0B}, {0x2C}, {0x33}, {0xFF}, {0xFF}
+ }, { // GOING
+ {0x1A}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WEIRD
+ {0x18}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BUSY
+ {0x11}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TOGETHER
+ {0x29}, {0x0A}, {0x32}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FULL
+ {0x26}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ABSENT
+ {0x02}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BEING
+ {0x0F}, {0x12}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NEED
+ {0x0E}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TASTY
+ {0x05}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SKILLED
+ {0x11}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NOISY
+ {0x20}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BIG
+ {0x11}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LATE
+ {0x05}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CLOSE
+ {0x19}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DOCILE
+ {0x17}, {0x14}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AMUSING
+ {0x2C}, {0x27}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ENTERTAINING
+ {0x09}, {0x30}, {0x03}, {0x11}, {0x33}, {0xFF}
+ }, { // PERFECTION
+ {0x32}, {0x0B}, {0x2C}, {0x33}, {0xFF}, {0xFF}
+ }, { // PRETTY
+ {0x11}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HEALTHY
+ {0x0A}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EXCELLENT
+ {0x09}, {0x2C}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UPSIDE DOWN
+ {0x2C}, {0x14}, {0x23}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COLD
+ {0x18}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // REFRESHING
+ {0x0E}, {0x0A}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UNAVOIDABLE
+ {0x2C}, {0x2A}, {0x1E}, {0x2C}, {0x26}, {0xFF}
+ }, { // MUCH
+ {0x2C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OVERWHELMING
+ {0x1A}, {0x32}, {0x0B}, {0x11}, {0x33}, {0xFF}
+ }, { // FABULOUS
+ {0x00}, {0x27}, {0x2C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ELSE
+ {0x0A}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EXPENSIVE
+ {0x09}, {0x0A}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CORRECT
+ {0x1A}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IMPOSSIBLE
+ {0x0F}, {0x1D}, {0x2A}, {0x26}, {0xFF}, {0xFF}
+ }, { // SMALL
+ {0x1D}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DIFFERENT
+ {0x11}, {0x30}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TIRED
+ {0x14}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SKILL
+ {0x11}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TOP
+ {0x17}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NON-STOP
+ {0x17}, {0x16}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PREPOSTEROUS
+ {0x2A}, {0x16}, {0x32}, {0x2C}, {0x33}, {0xFF}
+ }, { // NONE
+ {0x2C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NOTHING
+ {0x2C}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NATURAL
+ {0x02}, {0x32}, {0x26}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BECOMES
+ {0x0E}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LUKEWARM
+ {0x29}, {0x1C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FAST
+ {0x02}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOW
+ {0x1A}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AWFUL
+ {0x08}, {0x26}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ALONE
+ {0x2C}, {0x18}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BORED
+ {0x1A}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SECRET
+ {0x0E}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MYSTERY
+ {0x11}, {0x30}, {0x0E}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LACKS
+ {0x02}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BEST
+ {0x0B}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOUSY
+ {0x21}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MISTAKE
+ {0x11}, {0x05}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KIND
+ {0x12}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WELL
+ {0x0B}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WEAKENED
+ {0x0E}, {0x0B}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SIMPLE
+ {0x0F}, {0x26}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SEEMS
+ {0x0D}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BADLY
+ {0x00}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+/*static*/ const struct BardSound BardMusic_ACTIONS[][6] = {
+ { // MEETS
+ {0x0E}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CONCEDE
+ {0x2C}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GIVE
+ {0x10}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GIVES
+ {0x10}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PLAYED
+ {0x04}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PLAYS
+ {0x05}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COLLECT
+ {0x2C}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WALKING
+ {0x06}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WALKS
+ {0x08}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SAYS
+ {0x0B}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WENT
+ {0x09}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SAID
+ {0x09}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WAKE UP
+ {0x05}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WAKES UP
+ {0x05}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ANGERS
+ {0x03}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TEACH
+ {0x0D}, {0xFF}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TEACHES
+ {0x0C}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PLEASE
+ {0x0D}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LEARN
+ {0x30}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHANGE
+ {0x03}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STORY
+ {0x1A}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TRUST
+ {0x0B}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LAVISH
+ {0x01}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LISTENS
+ {0x11}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HEARING
+ {0x11}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TRAINS
+ {0x03}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHOOSE
+ {0x27}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COME
+ {0x2C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CAME
+ {0x03}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SEARCH
+ {0x32}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAKE
+ {0x05}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CAUSE
+ {0x1D}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KNOW
+ {0x1A}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KNOWS
+ {0x18}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // REFUSE
+ {0x0C}, {0x2F}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STORES
+ {0x1A}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BRAG
+ {0x02}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IGNORANT
+ {0x11}, {0x1A}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THINKS
+ {0x0E}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BELIEVE
+ {0x0C}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SLIDE
+ {0x14}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EATS
+ {0x0E}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // USE
+ {0x2F}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // USES
+ {0x2F}, {0x0A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // USING
+ {0x2F}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COULDN’T
+ {0x26}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CAPABLE
+ {0x05}, {0x2C}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DISAPPEAR
+ {0x11}, {0x2C}, {0x30}, {0x33}, {0xFF}, {0xFF}
+ }, { // APPEAR
+ {0x2C}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THROW
+ {0x1A}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WORRY
+ {0x32}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SLEPT
+ {0x0B}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SLEEP
+ {0x0E}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RELEASE
+ {0x0C}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DRINKS
+ {0x0E}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RUNS
+ {0x2C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RUN
+ {0x2C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WORKS
+ {0x32}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WORKING
+ {0x32}, {0x0D}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TALKING
+ {0x1B}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TALK
+ {0x1B}, {0xFF}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SINK
+ {0x0E}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SMACK
+ {0x01}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PRETEND
+ {0x0E}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PRAISE
+ {0x05}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OVERDO
+ {0x18}, {0x30}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHOW
+ {0x1A}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOOKS
+ {0x26}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SEES
+ {0x0E}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SEEK
+ {0x0E}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OWN
+ {0x1A}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TAKE
+ {0x05}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ALLOW
+ {0x2C}, {0x23}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FORGET
+ {0x1A}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FORGETS
+ {0x1A}, {0x0A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // APPEARS
+ {0x2C}, {0x0D}, {0x33}, {0x33}, {0xFF}, {0xFF}
+ }, { // FAINT
+ {0x03}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FAINTED
+ {0x03}, {0x0A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+/*static*/ const struct BardSound BardMusic_LIFESTYLE[][6] = {
+ { // CHORES
+ {0x31}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HOME
+ {0x1A}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MONEY
+ {0x2C}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ALLOWANCE
+ {0x2A}, {0x23}, {0x02}, {0x33}, {0xFF}, {0xFF}
+ }, { // BATH
+ {0x02}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CONVERSATION
+ {0x2A}, {0x32}, {0x03}, {0x2C}, {0x33}, {0xFF}
+ }, { // SCHOOL
+ {0x29}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COMMEMORATE
+ {0x2C}, {0x0B}, {0x32}, {0x05}, {0xFF}, {0xFF}
+ }, { // HABIT
+ {0x00}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GROUP
+ {0x27}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WORD
+ {0x30}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STORE
+ {0x18}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SERVICE
+ {0x32}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WORK
+ {0x32}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SYSTEM
+ {0x11}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TRAIN
+ {0x30}, {0x03}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CLASS
+ {0x02}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LESSONS
+ {0x09}, {0x1D}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // INFORMATION
+ {0x0F}, {0x30}, {0x05}, {0x2C}, {0x33}, {0xFF}
+ }, { // LIVING
+ {0x11}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TEACHER
+ {0x0C}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TOURNAMENT
+ {0x32}, {0x2A}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LETTER
+ {0x0B}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EVENT
+ {0x0C}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DIGITAL
+ {0x11}, {0x11}, {0x2C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TEST
+ {0x0B}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DEPT. STORE
+ {0x0C}, {0x1B}, {0x0B}, {0x1A}, {0xFF}, {0xFF}
+ }, { // TELEVISION
+ {0x09}, {0x2C}, {0x11}, {0x1B}, {0x33}, {0xFF}
+ }, { // PHONE
+ {0x18}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ITEM
+ {0x12}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NAME
+ {0x03}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NEWS
+ {0x27}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POPULAR
+ {0x1D}, {0x27}, {0x32}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PARTY
+ {0x1C}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STUDY
+ {0x2C}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MACHINE
+ {0x2C}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAIL
+ {0x03}, {0x24}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MESSAGE
+ {0x0B}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PROMISE
+ {0x1D}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DREAM
+ {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KINDERGARTEN
+ {0x0F}, {0x32}, {0x17}, {0x0F}, {0x33}, {0xFF}
+ }, { // LIFE
+ {0x12}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RADIO
+ {0x03}, {0x0C}, {0x18}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RENTAL
+ {0x0B}, {0x26}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WORLD
+ {0x32}, {0x24}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+/*static*/ const struct BardSound BardMusic_HOBBIES[][6] = {
+ { // IDOL
+ {0x14}, {0x1A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ANIME
+ {0x00}, {0x2C}, {0x05}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SONG
+ {0x17}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MOVIE
+ {0x27}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SWEETS
+ {0x0E}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHAT
+ {0x01}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHILD’S PLAY
+ {0x14}, {0x26}, {0x04}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TOYS
+ {0x1E}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MUSIC
+ {0x2F}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CARDS
+ {0x17}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHOPPING
+ {0x15}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CAMERA
+ {0x00}, {0x32}, {0x2C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VIEWING
+ {0x2F}, {0x0C}, {0x33}, {0x33}, {0xFF}, {0xFF}
+ }, { // SPECTATOR
+ {0x0B}, {0x05}, {0x30}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GOURMET
+ {0x26}, {0x05}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GAME
+ {0x03}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RPG
+ {0x1B}, {0x0C}, {0x0C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COLLECTION
+ {0x2C}, {0x0B}, {0x1B}, {0x33}, {0x33}, {0xFF}
+ }, { // COMPLETE
+ {0x2C}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAGAZINE
+ {0x02}, {0x2C}, {0x0C}, {0x33}, {0xFF}, {0xFF}
+ }, { // WALK
+ {0x1B}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BIKE
+ {0x12}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HOBBY
+ {0x15}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPORTS
+ {0x1A}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SOFTWARE
+ {0x17}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SONGS
+ {0x17}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DIET
+ {0x14}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TREASURE
+ {0x0A}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TRAVEL
+ {0x00}, {0x26}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DANCE
+ {0x00}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHANNEL
+ {0x00}, {0x26}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAKING
+ {0x05}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FISHING
+ {0x11}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DATE
+ {0x05}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DESIGN
+ {0x0E}, {0x12}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOCOMOTIVE
+ {0x1A}, {0x2C}, {0x1A}, {0x11}, {0xFF}, {0xFF}
+ }, { // PLUSH DOLL
+ {0x2C}, {0x1D}, {0x33}, {0x33}, {0xFF}, {0xFF}
+ }, { // PC
+ {0x0E}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FLOWERS
+ {0x21}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HERO
+ {0x0C}, {0x1A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NAP
+ {0x02}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HEROINE
+ {0x0C}, {0x1A}, {0x0F}, {0x33}, {0xFF}, {0xFF}
+ }, { // FASHION
+ {0x01}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ADVENTURE
+ {0x00}, {0x0B}, {0x32}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BOARD
+ {0x1A}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BALL
+ {0x1B}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BOOK
+ {0x26}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FESTIVAL
+ {0x0B}, {0x0E}, {0x08}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COMICS
+ {0x1B}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HOLIDAY
+ {0x1D}, {0x11}, {0x05}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PLANS
+ {0x02}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TRENDY
+ {0x09}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VACATION
+ {0x03}, {0x05}, {0x1D}, {0x33}, {0xFF}, {0xFF}
+ }, { // LOOK
+ {0x26}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+/*static*/ const struct BardSound BardMusic_TIME[][6] = {
+ { // FALL
+ {0x1B}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MORNING
+ {0x1A}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TOMORROW
+ {0x27}, {0x1C}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LAST
+ {0x02}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DAY
+ {0x05}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SOMETIME
+ {0x2C}, {0x14}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ALWAYS
+ {0x1B}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CURRENT
+ {0x09}, {0x0F}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FOREVER
+ {0x18}, {0x09}, {0x2C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DAYS
+ {0x05}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // END
+ {0x0B}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TUESDAY
+ {0x27}, {0x05}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YESTERDAY
+ {0x0B}, {0x32}, {0x05}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TODAY
+ {0x27}, {0x05}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FRIDAY
+ {0x12}, {0x05}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MONDAY
+ {0x2C}, {0x05}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LATER
+ {0x05}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EARLIER
+ {0x30}, {0x0C}, {0x32}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ANOTHER
+ {0x2A}, {0x2C}, {0x32}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TIME
+ {0x14}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FINISH
+ {0x0F}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WEDNESDAY
+ {0x0A}, {0x05}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SOON
+ {0x28}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // START
+ {0x17}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MONTH
+ {0x2C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STOP
+ {0x1D}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NOW
+ {0x21}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FINAL
+ {0x12}, {0x24}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NEXT
+ {0x09}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AGE
+ {0x05}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SATURDAY
+ {0x00}, {0x30}, {0x05}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SUMMER
+ {0x2C}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SUNDAY
+ {0x2C}, {0x05}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BEGINNING
+ {0x0E}, {0x0F}, {0x0C}, {0x33}, {0xFF}, {0xFF}
+ }, { // SPRING
+ {0x0C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DAYTIME
+ {0x05}, {0x12}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WINTER
+ {0x0F}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DAILY
+ {0x05}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OLDEN
+ {0x1A}, {0x0A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ALMOST
+ {0x1B}, {0x1A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NEARLY
+ {0x0E}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THURSDAY
+ {0x30}, {0x05}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NIGHTTIME
+ {0x14}, {0x12}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NIGHT
+ {0x14}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WEEK
+ {0x0E}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+/*static*/ const struct BardSound BardMusic_MISC[][6] = {
+ { // HIGHS
+ {0x14}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOWS
+ {0x18}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UM
+ {0x2B}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // REAR
+ {0x2A}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THINGS
+ {0x0C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THING
+ {0x0C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BELOW
+ {0x0C}, {0x18}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ABOVE
+ {0x2A}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BACK
+ {0x00}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HIGH
+ {0x12}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HERE
+ {0x0C}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // INSIDE
+ {0x0F}, {0x12}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OUTSIDE
+ {0x21}, {0x12}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BESIDE
+ {0x0E}, {0x12}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THIS IS IT!
+ {0x11}, {0x11}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THIS
+ {0x11}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EVERY
+ {0x09}, {0x30}, {0x0E}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THESE
+ {0x0C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THESE WERE
+ {0x0E}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DOWN
+ {0x21}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THAT
+ {0x02}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THOSE ARE
+ {0x18}, {0x1B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THOSE WERE
+ {0x18}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THAT’S IT!
+ {0x01}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AM
+ {0x00}, {0x10}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THAT WAS
+ {0x00}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FRONT
+ {0x2B}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UP
+ {0x2A}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHOICE
+ {0x0F}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FAR
+ {0x1B}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AWAY
+ {0x2C}, {0x04}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NEAR
+ {0x0C}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHERE
+ {0x09}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHEN
+ {0x10}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHAT
+ {0x2C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DEEP
+ {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHALLOW
+ {0x01}, {0x1A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHY
+ {0x14}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CONFUSED
+ {0x2A}, {0x2E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OPPOSITE
+ {0x1D}, {0x1A}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LEFT
+ {0x09}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RIGHT
+ {0x12}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+/*static*/ const struct BardSound BardMusic_ADJECTIVES[][6] = {
+ { // WANDERING
+ {0x1D}, {0x32}, {0x0C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RICKETY
+ {0x11}, {0x09}, {0x0E}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ROCK-SOLID
+ {0x1B}, {0x1B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HUNGRY
+ {0x2A}, {0x30}, {0x0E}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TIGHT
+ {0x12}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TICKLISH
+ {0x11}, {0x24}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TWIRLING
+ {0x30}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPIRALING
+ {0x12}, {0x08}, {0x0E}, {0x33}, {0xFF}, {0xFF}
+ }, { // THIRSTY
+ {0x30}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOLLING
+ {0x2C}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SILKY
+ {0x11}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SADLY
+ {0x00}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HOPELESS
+ {0x18}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // USELESS
+ {0x2D}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DROOLING
+ {0x27}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EXCITING
+ {0x09}, {0x12}, {0x0C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THICK
+ {0x11}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SMOOTH
+ {0x27}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SLIMY
+ {0x12}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THIN
+ {0x0F}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BREAK
+ {0x05}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VORACIOUS
+ {0x32}, {0x05}, {0x2C}, {0x33}, {0xFF}, {0xFF}
+ }, { // SCATTER
+ {0x00}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AWESOME
+ {0x1B}, {0x2C}, {0x33}, {0x33}, {0xFF}, {0xFF}
+ }, { // WIMPY
+ {0x11}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WOBBLY
+ {0x1D}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHAKY
+ {0x03}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RIPPED
+ {0x11}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHREDDED
+ {0x09}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // INCREASING
+ {0x0F}, {0x0C}, {0x0C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YET
+ {0x09}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DESTROYED
+ {0x0C}, {0x1E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FIERY
+ {0x14}, {0x32}, {0x0E}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOVEY-DOVEY
+ {0x2C}, {0x0E}, {0x2C}, {0x0E}, {0xFF}, {0xFF}
+ }, { // HAPPILY
+ {0x00}, {0x2C}, {0x0E}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ANTICIPATION
+ {0x00}, {0x11}, {0x11}, {0x03}, {0x1D}, {0x33}
+ }
+};
+
+/*static*/ const struct BardSound BardMusic_EVENTS[][6] = {
+ { // APPEAL
+ {0x2C}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EVENTS
+ {0x0C}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STAY-AT-HOME
+ {0x03}, {0x00}, {0x18}, {0x33}, {0x33}, {0xFF}
+ }, { // BERRY
+ {0x09}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CONTEST
+ {0x1D}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MC
+ {0x09}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // JUDGE
+ {0x2B}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SUPER
+ {0x27}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STAGE
+ {0x05}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HALL OF FAME
+ {0x15}, {0x2C}, {0x04}, {0x33}, {0xFF}, {0xFF}
+ }, { // EVOLUTION
+ {0x1A}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HYPER
+ {0x12}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BATTLE TOWER
+ {0x02}, {0x2C}, {0x21}, {0x30}, {0xFF}, {0xFF}
+ }, { // LEADERS
+ {0x0C}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BATTLE ROOM
+ {0x00}, {0x2C}, {0x27}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HIDDEN
+ {0x11}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SECRET BASE
+ {0x0C}, {0x09}, {0x04}, {0x33}, {0xFF}, {0xFF}
+ }, { // BLEND
+ {0x0A}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POKEBLOCK
+ {0x18}, {0x0C}, {0x1D}, {0x33}, {0xFF}, {0xFF}
+ }, { // MASTER
+ {0x00}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RANK
+ {0x03}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RIBBON
+ {0x11}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+/*static*/ const struct BardSound BardMusic_MOVE_1[][6] = {
+ { // THUNDERBOLT
+ {0x2A}, {0x30}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IRON_TAIL
+ {0x12}, {0x1B}, {0x05}, {0x33}, {0xFF}, {0xFF}
+ }, { // ICE_BALL
+ {0x12}, {0x1B}, {0x33}, {0x33}, {0xFF}, {0xFF}
+ }, { // YAWN
+ {0x1B}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOVELY_KISS
+ {0x2C}, {0x2C}, {0x0C}, {0x11}, {0x33}, {0xFF}
+ }, { // NIGHTMARE
+ {0x12}, {0x05}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MORNING_SUN
+ {0x1A}, {0x0E}, {0x2C}, {0x33}, {0xFF}, {0xFF}
+ }, { // VITAL_THROW
+ {0x12}, {0x24}, {0x18}, {0x33}, {0xFF}, {0xFF}
+ }, { // DIG
+ {0x11}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THRASH
+ {0x30}, {0x02}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SWEET_SCENT
+ {0x0E}, {0x0B}, {0x33}, {0x33}, {0xFF}, {0xFF}
+ }, { // CHARM
+ {0x15}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RAIN_DANCE
+ {0x03}, {0x00}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CONFUSE_RAY
+ {0x1B}, {0x2D}, {0x03}, {0x33}, {0xFF}, {0xFF}
+ }, { // HAIL
+ {0x05}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AROMATHERAPY
+ {0x2A}, {0x18}, {0x2C}, {0x00}, {0x1B}, {0x0E}
+ }, { // BUBBLE
+ {0x2C}, {0x24}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ENCORE
+ {0x1B}, {0x18}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CUT
+ {0x2A}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RAGE
+ {0x03}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SUPER_FANG
+ {0x27}, {0x30}, {0x01}, {0x33}, {0xFF}, {0xFF}
+ }, { // PAIN_SPLIT
+ {0x03}, {0x0F}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TORMENT
+ {0x18}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STRING_SHOT
+ {0x32}, {0x0C}, {0x1B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SWAGGER
+ {0x02}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SNORE
+ {0x18}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HEAL_BELL
+ {0x0E}, {0x0A}, {0x33}, {0x33}, {0xFF}, {0xFF}
+ }, { // SCREECH
+ {0x30}, {0x0D}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ROCK_THROW
+ {0x1B}, {0x18}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ROCK_SMASH
+ {0x1B}, {0x00}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ROCK_SLIDE
+ {0x1B}, {0x12}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WEATHER_BALL
+ {0x09}, {0x30}, {0x1B}, {0x33}, {0xFF}, {0xFF}
+ }, { // WHIRLPOOL
+ {0x30}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FAKE_TEARS
+ {0x03}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SING
+ {0x0C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPITE
+ {0x12}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AIR_CUTTER
+ {0x05}, {0x2A}, {0x30}, {0x33}, {0xFF}, {0xFF}
+ }, { // AEROBLAST
+ {0x05}, {0x18}, {0x00}, {0x33}, {0xFF}, {0xFF}
+ }, { // SMOKESCREEN
+ {0x1A}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PURSUIT
+ {0x30}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DOUBLE_SLAP
+ {0x2A}, {0x0A}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MIRROR_MOVE
+ {0x0C}, {0x32}, {0x29}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OVERHEAT
+ {0x18}, {0x30}, {0x0C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AURORA_BEAM
+ {0x1B}, {0x1A}, {0x2C}, {0x0C}, {0x33}, {0xFF}
+ }, { // MEMENTO
+ {0x2A}, {0x09}, {0x18}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OCTAZOOKA
+ {0x1B}, {0x2C}, {0x28}, {0x2C}, {0xFF}, {0xFF}
+ }, { // FLATTER
+ {0x00}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ASTONISH
+ {0x2A}, {0x1B}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WILL_O_WISP
+ {0x11}, {0x18}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RETURN
+ {0x0C}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GRUDGE
+ {0x2B}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STRENGTH
+ {0x32}, {0x03}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COUNTER
+ {0x21}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FLAME_WHEEL
+ {0x03}, {0x0E}, {0x33}, {0x33}, {0xFF}, {0xFF}
+ }, { // FLAMETHROWER
+ {0x00}, {0x1A}, {0x30}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ODOR_SLEUTH
+ {0x18}, {0x30}, {0x27}, {0x33}, {0xFF}, {0xFF}
+ }, { // SHARPEN
+ {0x1B}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DOUBLE_TEAM
+ {0x2C}, {0x2C}, {0x0C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GUST
+ {0x2C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HARDEN
+ {0x1B}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DISABLE
+ {0x11}, {0x03}, {0x24}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RAZOR_WIND
+ {0x05}, {0x30}, {0x0F}, {0x33}, {0xFF}, {0xFF}
+ }, { // BIDE
+ {0x0B}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CRUNCH
+ {0x30}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BITE
+ {0x12}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THUNDER
+ {0x2A}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THUNDER_PUNCH
+ {0x2A}, {0x30}, {0x2C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ENDEAVOR
+ {0x09}, {0x09}, {0x30}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FACADE
+ {0x2C}, {0x1B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KARATE_CHOP
+ {0x2C}, {0x1D}, {0x0E}, {0x1D}, {0xFF}, {0xFF}
+ }, { // CLAMP
+ {0x00}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WITHDRAW
+ {0x11}, {0x1B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CONSTRICT
+ {0x1B}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BRICK_BREAK
+ {0x11}, {0x05}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ROCK_TOMB
+ {0x1B}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FOCUS_ENERGY
+ {0x1A}, {0x2C}, {0x0B}, {0x30}, {0x0C}, {0xFF}
+ }, { // FOCUS_PUNCH
+ {0x18}, {0x2C}, {0x2C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GIGA_DRAIN
+ {0x11}, {0x2A}, {0x03}, {0x33}, {0xFF}, {0xFF}
+ }, { // REVERSAL
+ {0x0C}, {0x30}, {0x24}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SMELLING_SALT
+ {0x09}, {0x0C}, {0x1B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPORE
+ {0x1A}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LEECH_LIFE
+ {0x0C}, {0x12}, {0x33}, {0x33}, {0xFF}, {0xFF}
+ }, { // SLASH
+ {0x00}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SILVER_WIND
+ {0x11}, {0x30}, {0x0F}, {0xFF}, {0xFF}, {0xFF}
+ }, { // METAL_SOUND
+ {0x09}, {0x1B}, {0x21}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GRASS_WHISTLE
+ {0x00}, {0x11}, {0x24}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TICKLE
+ {0x11}, {0x24}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPIDER_WEB
+ {0x12}, {0x30}, {0x09}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CRABHAMMER
+ {0x02}, {0x00}, {0x30}, {0x33}, {0xFF}, {0xFF}
+ }, { // HAZE
+ {0x03}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MEAN_LOOK
+ {0x0C}, {0x24}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CROSS_CHOP
+ {0x1B}, {0x1D}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OUTRAGE
+ {0x21}, {0x03}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOW_KICK
+ {0x18}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ANCIENT_POWER
+ {0x03}, {0x0C}, {0x21}, {0x32}, {0x33}, {0xFF}
+ }, { // SYNTHESIS
+ {0x0F}, {0x2A}, {0x0F}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AGILITY
+ {0x2A}, {0x11}, {0x11}, {0x0E}, {0xFF}, {0xFF}
+ }, { // RAPID_SPIN
+ {0x00}, {0x0F}, {0x0F}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ICY_WIND
+ {0x12}, {0x0C}, {0x0F}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MIND_READER
+ {0x12}, {0x0C}, {0x30}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COSMIC_POWER
+ {0x1B}, {0x11}, {0x21}, {0x30}, {0xFF}, {0xFF}
+ }, { // SKY_ATTACK
+ {0x12}, {0x2A}, {0x00}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POWDER_SNOW
+ {0x21}, {0x30}, {0x18}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FOLLOW_ME
+ {0x15}, {0x18}, {0x0C}, {0x33}, {0xFF}, {0xFF}
+ }, { // METEOR_MASH
+ {0x0C}, {0x0C}, {0x18}, {0x00}, {0x33}, {0x33}
+ }, { // ENDURE
+ {0x09}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ROLLOUT
+ {0x1A}, {0x21}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SCARY_FACE
+ {0x03}, {0x0C}, {0x03}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PSYBEAM
+ {0x12}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PSYWAVE
+ {0x12}, {0x03}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PSYCHIC
+ {0x12}, {0x0F}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HYPNOSIS
+ {0x11}, {0x18}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UPROAR
+ {0x2C}, {0x1A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WATER_SPOUT
+ {0x1B}, {0x30}, {0x21}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SIGNAL_BEAM
+ {0x11}, {0x1B}, {0x0C}, {0x33}, {0xFF}, {0xFF}
+ }, { // PSYCH_UP
+ {0x12}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SUBMISSION
+ {0x2A}, {0x11}, {0x0B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RECOVER
+ {0x0C}, {0x2C}, {0x30}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EARTHQUAKE
+ {0x30}, {0x05}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NATURE_POWER
+ {0x03}, {0x30}, {0x21}, {0x30}, {0xFF}, {0xFF}
+ }, { // LICK
+ {0x11}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FLAIL
+ {0x05}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TAIL_WHIP
+ {0x05}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SELF_DESTRUCT
+ {0x09}, {0x0C}, {0x2A}, {0x33}, {0xFF}, {0xFF}
+ }, { // STUN_SPORE
+ {0x2C}, {0x1A}, {0x33}, {0x33}, {0xFF}, {0xFF}
+ }, { // BIND
+ {0x14}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHADOW_PUNCH
+ {0x00}, {0x18}, {0x2C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHADOW_BALL
+ {0x00}, {0x18}, {0x1B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHARGE
+ {0x1B}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MIST
+ {0x11}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FISSURE
+ {0x11}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EXTREME_SPEED
+ {0x09}, {0x0C}, {0x0C}, {0x33}, {0xFF}, {0xFF}
+ }, { // EXTRASENSORY
+ {0x09}, {0x2A}, {0x09}, {0x18}, {0x0C}, {0xFF}
+ }, { // SAFEGUARD
+ {0x03}, {0x1B}, {0x33}, {0x33}, {0xFF}, {0xFF}
+ }, { // ABSORB
+ {0x2A}, {0x1A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SKY_UPPERCUT
+ {0x12}, {0x2C}, {0x30}, {0x2A}, {0xFF}, {0xFF}
+ }, { // SKILL_SWAP
+ {0x11}, {0x1B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SKETCH
+ {0x09}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HEADBUTT
+ {0x09}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DOUBLE_EDGE
+ {0x2C}, {0x24}, {0x0A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SANDSTORM
+ {0x00}, {0x1A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SAND_ATTACK
+ {0x00}, {0x2A}, {0x00}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SAND_TOMB
+ {0x00}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPARK
+ {0x1B}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SWIFT
+ {0x11}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KINESIS
+ {0x0F}, {0x0C}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SMOG
+ {0x1B}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GROWTH
+ {0x30}, {0x18}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SACRED_FIRE
+ {0x03}, {0x11}, {0x12}, {0x30}, {0x33}, {0xFF}
+ }, { // SHEER_COLD
+ {0x0E}, {0x30}, {0x18}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SOLAR_BEAM
+ {0x18}, {0x30}, {0x0C}, {0x33}, {0xFF}, {0xFF}
+ }, { // SONIC_BOOM
+ {0x1B}, {0x11}, {0x27}, {0x33}, {0xFF}, {0xFF}
+ }, { // FLY
+ {0x12}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+/*static*/ const struct BardSound BardMusic_MOVE_2[][6] = {
+ { // TACKLE
+ {0x00}, {0x24}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EXPLOSION
+ {0x09}, {0x18}, {0x2C}, {0x33}, {0x33}, {0xFF}
+ }, { // DIVE
+ {0x12}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FIRE_BLAST
+ {0x12}, {0x30}, {0x00}, {0x33}, {0xFF}, {0xFF}
+ }, { // WATERFALL
+ {0x1D}, {0x30}, {0x1D}, {0x33}, {0xFF}, {0xFF}
+ }, { // MUDDY_WATER
+ {0x2A}, {0x0C}, {0x1B}, {0x30}, {0xFF}, {0xFF}
+ }, { // STOCKPILE
+ {0x1B}, {0x14}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SLAM
+ {0x00}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TWISTER
+ {0x11}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BULLET_SEED
+ {0x2A}, {0x09}, {0x0C}, {0x33}, {0xFF}, {0xFF}
+ }, { // TWINEEDLE
+ {0x0F}, {0x0C}, {0x24}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SOFT_BOILED
+ {0x1B}, {0x1E}, {0x0B}, {0x33}, {0xFF}, {0xFF}
+ }, { // EGG_BOMB
+ {0x09}, {0x1B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FAINT_ATTACK
+ {0x03}, {0x2A}, {0x00}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BARRAGE
+ {0x30}, {0x1B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MINIMIZE
+ {0x0F}, {0x0F}, {0x12}, {0x33}, {0xFF}, {0xFF}
+ }, { // SEISMIC_TOSS
+ {0x12}, {0x11}, {0x1B}, {0x33}, {0xFF}, {0xFF}
+ }, { // SUPERSONIC
+ {0x27}, {0x30}, {0x1B}, {0x11}, {0xFF}, {0xFF}
+ }, { // TAUNT
+ {0x1B}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MOONLIGHT
+ {0x27}, {0x12}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PECK
+ {0x09}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ARM_THRUST
+ {0x1B}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HORN_ATTACK
+ {0x18}, {0x2A}, {0x00}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HORN_DRILL
+ {0x18}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WING_ATTACK
+ {0x0C}, {0x2A}, {0x00}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AERIAL_ACE
+ {0x03}, {0x0C}, {0x2A}, {0x03}, {0xFF}, {0xFF}
+ }, { // SWORDS_DANCE
+ {0x1A}, {0x30}, {0x01}, {0x33}, {0xFF}, {0xFF}
+ }, { // VINE_WHIP
+ {0x12}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CONVERSION
+ {0x2A}, {0x30}, {0x2C}, {0x33}, {0xFF}, {0xFF}
+ }, { // CONVERSION_2
+ {0x2A}, {0x30}, {0x2C}, {0x27}, {0x33}, {0xFF}
+ }, { // HELPING_HAND
+ {0x09}, {0x0C}, {0x00}, {0x33}, {0xFF}, {0xFF}
+ }, { // IRON_DEFENSE
+ {0x12}, {0x1B}, {0x0C}, {0x09}, {0xFF}, {0xFF}
+ }, { // TELEPORT
+ {0x09}, {0x0C}, {0x1A}, {0x33}, {0xFF}, {0xFF}
+ }, { // THUNDER_SHOCK
+ {0x2A}, {0x30}, {0x1B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHOCK_WAVE
+ {0x1B}, {0x03}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // QUICK_ATTACK
+ {0x27}, {0x11}, {0x2A}, {0x00}, {0xFF}, {0xFF}
+ }, { // SWEET_KISS
+ {0x0E}, {0x11}, {0x33}, {0x33}, {0xFF}, {0xFF}
+ }, { // THUNDER_WAVE
+ {0x2A}, {0x30}, {0x05}, {0x33}, {0xFF}, {0xFF}
+ }, { // ZAP_CANNON
+ {0x00}, {0x01}, {0x2C}, {0x33}, {0xFF}, {0xFF}
+ }, { // BLOCK
+ {0x1B}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HOWL
+ {0x21}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POISON_GAS
+ {0x1E}, {0x1B}, {0x00}, {0x33}, {0xFF}, {0xFF}
+ }, { // TOXIC
+ {0x1B}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POISON_FANG
+ {0x1E}, {0x2A}, {0x00}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POISON_POWDER
+ {0x1E}, {0x2C}, {0x21}, {0x30}, {0xFF}, {0xFF}
+ }, { // POISON_STING
+ {0x1E}, {0x2C}, {0x0E}, {0x33}, {0xFF}, {0xFF}
+ }, { // SPIKE_CANNON
+ {0x14}, {0x00}, {0x1D}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ACID_ARMOR
+ {0x00}, {0x11}, {0x1B}, {0x30}, {0xFF}, {0xFF}
+ }, { // TAKE_DOWN
+ {0x03}, {0x23}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // JUMP_KICK
+ {0x2C}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BOUNCE
+ {0x21}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HI_JUMP_KICK
+ {0x12}, {0x2C}, {0x11}, {0x33}, {0xFF}, {0xFF}
+ }, { // TRI_ATTACK
+ {0x12}, {0x2A}, {0x00}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DRAGON_CLAW
+ {0x00}, {0x1B}, {0x1D}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TRICK
+ {0x11}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TRIPLE_KICK
+ {0x11}, {0x24}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DRILL_PECK
+ {0x11}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MUD_SPORT
+ {0x2A}, {0x18}, {0x30}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MUD_SLAP
+ {0x2C}, {0x00}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // THIEF
+ {0x0C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AMNESIA
+ {0x02}, {0x0E}, {0x2C}, {0x33}, {0xFF}, {0xFF}
+ }, { // NIGHT_SHADE
+ {0x12}, {0x05}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GROWL
+ {0x21}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SLACK_OFF
+ {0x00}, {0x1B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SURF
+ {0x30}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ROLE_PLAY
+ {0x18}, {0x03}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NEEDLE_ARM
+ {0x0C}, {0x2A}, {0x1D}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DOUBLE_KICK
+ {0x2A}, {0x2C}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SUNNY_DAY
+ {0x2A}, {0x0E}, {0x05}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LEER
+ {0x0E}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WISH
+ {0x0F}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FAKE_OUT
+ {0x03}, {0x21}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SLEEP_TALK
+ {0x0E}, {0x1D}, {0x33}, {0x33}, {0xFF}, {0xFF}
+ }, { // PAY_DAY
+ {0x05}, {0x05}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ASSIST
+ {0x2A}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HEAT_WAVE
+ {0x0C}, {0x03}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SLEEP_POWDER
+ {0x0C}, {0x21}, {0x30}, {0xFF}, {0xFF}, {0xFF}
+ }, { // REST
+ {0x09}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // INGRAIN
+ {0x0F}, {0x03}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CONFUSION
+ {0x2C}, {0x29}, {0x2C}, {0x33}, {0xFF}, {0xFF}
+ }, { // BODY_SLAM
+ {0x1D}, {0x0C}, {0x02}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SWALLOW
+ {0x1B}, {0x18}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CURSE
+ {0x30}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HYDRO_PUMP
+ {0x12}, {0x18}, {0x2A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HYPER_VOICE
+ {0x12}, {0x30}, {0x1E}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HYPER_BEAM
+ {0x12}, {0x30}, {0x0C}, {0x33}, {0xFF}, {0xFF}
+ }, { // SUPERPOWER
+ {0x27}, {0x30}, {0x21}, {0x30}, {0xFF}, {0xFF}
+ }, { // STEEL_WING
+ {0x0E}, {0x0D}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPIT_UP
+ {0x11}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DYNAMIC_PUNCH
+ {0x12}, {0x00}, {0x11}, {0x2C}, {0xFF}, {0xFF}
+ }, { // GUILLOTINE
+ {0x0C}, {0x2C}, {0x0E}, {0x33}, {0xFF}, {0xFF}
+ }, { // VICE_GRIP
+ {0x14}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KNOCK_OFF
+ {0x1B}, {0x1D}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POUND
+ {0x21}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RAZOR_LEAF
+ {0x05}, {0x30}, {0x0C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BATON_PASS
+ {0x2A}, {0x1B}, {0x00}, {0x33}, {0xFF}, {0xFF}
+ }, { // PETAL_DANCE
+ {0x09}, {0x2C}, {0x02}, {0x33}, {0xFF}, {0xFF}
+ }, { // SPLASH
+ {0x00}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BUBBLE_BEAM
+ {0x2A}, {0x24}, {0x0C}, {0x33}, {0xFF}, {0xFF}
+ }, { // BELLY_DRUM
+ {0x09}, {0x0C}, {0x2A}, {0x33}, {0xFF}, {0xFF}
+ }, { // BARRIER
+ {0x05}, {0x0E}, {0x30}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LIGHT_SCREEN
+ {0x12}, {0x0C}, {0x33}, {0x33}, {0xFF}, {0xFF}
+ }, { // SCRATCH
+ {0x00}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HYPER_FANG
+ {0x12}, {0x30}, {0x00}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EMBER
+ {0x09}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SECRET_POWER
+ {0x0C}, {0x09}, {0x21}, {0x30}, {0xFF}, {0xFF}
+ }, { // DIZZY_PUNCH
+ {0x11}, {0x0E}, {0x2C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BULK_UP
+ {0x2C}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IMPRISON
+ {0x0F}, {0x0F}, {0x2C}, {0x33}, {0xFF}, {0xFF}
+ }, { // FEATHER_DANCE
+ {0x09}, {0x30}, {0x00}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WHIRLWIND
+ {0x2C}, {0x1D}, {0x0E}, {0x1D}, {0xFF}, {0xFF}
+ }, { // BEAT_UP
+ {0x0C}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BLIZZARD
+ {0x0F}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STOMP
+ {0x1D}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FLASH
+ {0x00}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TEETER_DANCE
+ {0x0C}, {0x30}, {0x00}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CRUSH_CLAW
+ {0x2C}, {0x1B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BLAZE_KICK
+ {0x05}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PRESENT
+ {0x09}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ERUPTION
+ {0x0C}, {0x2C}, {0x1D}, {0x33}, {0xFF}, {0xFF}
+ }, { // SLUDGE
+ {0x2C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SLUDGE_BOMB
+ {0x2B}, {0x1B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GLARE
+ {0x05}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TRANSFORM
+ {0x00}, {0x1A}, {0x33}, {0x33}, {0xFF}, {0xFF}
+ }, { // POISON_TAIL
+ {0x1E}, {0x2C}, {0x05}, {0x33}, {0xFF}, {0xFF}
+ }, { // ROAR
+ {0x1A}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BONE_RUSH
+ {0x18}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CAMOUFLAGE
+ {0x00}, {0x18}, {0x1B}, {0x33}, {0xFF}, {0xFF}
+ }, { // COVET
+ {0x2A}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TAIL_GLOW
+ {0x04}, {0x1A}, {0x33}, {0x33}, {0xFF}, {0xFF}
+ }, { // BONE_CLUB
+ {0x18}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BONEMERANG
+ {0x18}, {0x30}, {0x00}, {0x33}, {0xFF}, {0xFF}
+ }, { // FIRE_SPIN
+ {0x12}, {0x30}, {0x0F}, {0x33}, {0xFF}, {0xFF}
+ }, { // FIRE_PUNCH
+ {0x12}, {0x30}, {0x2A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PERISH_SONG
+ {0x09}, {0x11}, {0x1B}, {0x33}, {0xFF}, {0xFF}
+ }, { // WRAP
+ {0x00}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPIKES
+ {0x12}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAGNITUDE
+ {0x00}, {0x0F}, {0x27}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAGICAL_LEAF
+ {0x00}, {0x11}, {0x24}, {0x0C}, {0x33}, {0xFF}
+ }, { // MAGIC_COAT
+ {0x00}, {0x11}, {0x18}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MUD_SHOT
+ {0x2C}, {0x1D}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MACH_PUNCH
+ {0x1B}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PROTECT
+ {0x18}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DEFENSE_CURL
+ {0x0E}, {0x0B}, {0x32}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ROLLING_KICK
+ {0x18}, {0x0C}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SUBSTITUTE
+ {0x2A}, {0x11}, {0x27}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DETECT
+ {0x0C}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PIN_MISSILE
+ {0x0F}, {0x11}, {0x24}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WATER_SPORT
+ {0x1B}, {0x30}, {0x1A}, {0x33}, {0xFF}, {0xFF}
+ }, { // WATER_GUN
+ {0x1D}, {0x32}, {0x2C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MIST_BALL
+ {0x11}, {0x1B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WATER_PULSE
+ {0x1B}, {0x30}, {0x2C}, {0x33}, {0xFF}, {0xFF}
+ }, { // FURY_ATTACK
+ {0x30}, {0x0C}, {0x2A}, {0x02}, {0xFF}, {0xFF}
+ }, { // FURY_SWIPES
+ {0x30}, {0x0C}, {0x12}, {0x33}, {0xFF}, {0xFF}
+ }, { // DESTINY_BOND
+ {0x09}, {0x0F}, {0x0C}, {0x1B}, {0xFF}, {0xFF}
+ }, { // FALSE_SWIPE
+ {0x1B}, {0x12}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FORESIGHT
+ {0x1A}, {0x14}, {0x33}, {0x33}, {0xFF}, {0xFF}
+ }, { // MIRROR_COAT
+ {0x09}, {0x30}, {0x18}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FUTURE_SIGHT
+ {0x27}, {0x30}, {0x12}, {0x33}, {0xFF}, {0xFF}
+ }, { // MILK_DRINK
+ {0x11}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CALM_MIND
+ {0x1B}, {0x12}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MEGA_DRAIN
+ {0x03}, {0x2C}, {0x03}, {0x33}, {0xFF}, {0xFF}
+ }, { // MEGA_KICK
+ {0x03}, {0x2A}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MEGA_PUNCH
+ {0x03}, {0x2A}, {0x2C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MEGAHORN
+ {0x03}, {0x2A}, {0x1A}, {0x33}, {0xFF}, {0xFF}
+ }, { // HIDDEN_POWER
+ {0x0F}, {0x09}, {0x21}, {0x30}, {0xFF}, {0xFF}
+ }, { // METAL_CLAW
+ {0x09}, {0x24}, {0x1B}, {0x33}, {0xFF}, {0xFF}
+ }, { // ATTRACT
+ {0x2A}, {0x00}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MIMIC
+ {0x11}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FRUSTRATION
+ {0x2C}, {0x03}, {0x1B}, {0x33}, {0xFF}, {0xFF}
+ }, { // LEECH_SEED
+ {0x0C}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // METRONOME
+ {0x09}, {0x18}, {0x18}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DREAM_EATER
+ {0x0E}, {0x0C}, {0x30}, {0x33}, {0xFF}, {0xFF}
+ }, { // ACID
+ {0x00}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MEDITATE
+ {0x09}, {0x11}, {0x03}, {0x33}, {0xFF}, {0xFF}
+ }, { // SNATCH
+ {0x00}, {0xFF}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LUSTER_PURGE
+ {0x2A}, {0x30}, {0x32}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LEAF_BLADE
+ {0x0C}, {0x05}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RECYCLE
+ {0x0C}, {0x12}, {0x24}, {0xFF}, {0xFF}, {0xFF}
+ }, { // REFLECT
+ {0x0C}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // REFRESH
+ {0x0C}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // REVENGE
+ {0x0C}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DRAGON_RAGE
+ {0x00}, {0x1B}, {0x05}, {0x33}, {0x33}, {0xFF}
+ }, { // DRAGON_BREATH
+ {0x00}, {0x1B}, {0x0B}, {0x33}, {0x33}, {0xFF}
+ }, { // DRAGON_DANCE
+ {0x00}, {0x1B}, {0x00}, {0x33}, {0xFF}, {0xFF}
+ }, { // ICE_PUNCH
+ {0x2C}, {0x1D}, {0x0E}, {0x1D}, {0xFF}, {0xFF}
+ }, { // ICE_BEAM
+ {0x12}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FURY_CUTTER
+ {0x30}, {0x0C}, {0x2A}, {0x30}, {0xFF}, {0xFF}
+ }, { // COMET_PUNCH
+ {0x1D}, {0x0B}, {0x2C}, {0x33}, {0xFF}, {0xFF}
+ }, { // SKULL_BASH
+ {0x2A}, {0x33}, {0x00}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOCK_ON
+ {0x1B}, {0x1D}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ROCK_BLAST
+ {0x1B}, {0x00}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COTTON_SPORE
+ {0x1D}, {0x1D}, {0x1A}, {0x33}, {0xFF}, {0xFF}
+ }, { // STRUGGLE
+ {0x2A}, {0x24}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+/*static*/ const struct BardSound BardMusic_TRENDY_SAYING[][6] = {
+ { // KTHX, BYE.
+ {0x05}, {0x02}, {0x14}, {0x33}, {0xFF}, {0xFF}
+ }, { // YES, SIR!
+ {0x0B}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AVANT GARDE
+ {0x1B}, {0x1B}, {0x17}, {0xFF}, {0xFF}, {0xFF}
+ }, { // COUPLE
+ {0x2C}, {0x26}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MUCH OBLIGED
+ {0x2C}, {0x2C}, {0x12}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YEEHAW!
+ {0x0D}, {0x1D}, {0x33}, {0x33}, {0xFF}, {0xFF}
+ }, { // MEGA
+ {0x05}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // 1-HIT KO!
+ {0x2C}, {0x11}, {0x03}, {0x1A}, {0xFF}, {0xFF}
+ }, { // DESTINY
+ {0x0B}, {0x11}, {0x0E}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CANCEL
+ {0x00}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NEW
+ {0x27}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FLATTEN
+ {0x00}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KIDDING
+ {0x11}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOSER
+ {0x27}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LOSING
+ {0x27}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HAPPENING
+ {0x00}, {0x2C}, {0x0E}, {0x33}, {0xFF}, {0xFF}
+ }, { // HIP AND
+ {0x11}, {0x01}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHAKE
+ {0x05}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHADY
+ {0x05}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UPBEAT
+ {0x2C}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MODERN
+ {0x1D}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SMELL YA
+ {0x0A}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BANG
+ {0x03}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KNOCKOUT
+ {0x1D}, {0x23}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HASSLE
+ {0x2A}, {0x24}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WINNER
+ {0x0F}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FEVER
+ {0x0C}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WANNABE
+ {0x1D}, {0x2C}, {0x0C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BABY
+ {0x05}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HEART
+ {0x1C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OLD
+ {0x18}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YOUNG
+ {0x2B}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UGLY
+ {0x2A}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+/*static*/ const struct BardSound BardMusic_POKEMON_2[][6] = {
+ { // EKANS
+ {0x09}, {0x00}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ARBOK
+ {0x06}, {0x17}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SEAKING
+ {0x0C}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ARIADOS
+ {0x1B}, {0x0C}, {0x2A}, {0x18}, {0xFF}, {0xFF}
+ }, { // CROCONAW
+ {0x1B}, {0x18}, {0x1B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // UNOWN
+ {0x2A}, {0x1A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EEVEE
+ {0x0C}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GEODUDE
+ {0x0C}, {0x18}, {0x27}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPINARAK
+ {0x0F}, {0x30}, {0x00}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PILOSWINE
+ {0x11}, {0x1A}, {0x12}, {0x33}, {0xFF}, {0xFF}
+ }, { // ONIX
+ {0x15}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ARCANINE
+ {0x06}, {0x03}, {0x12}, {0x33}, {0xFF}, {0xFF}
+ }, { // SUDOWOODO
+ {0x27}, {0x18}, {0x27}, {0x18}, {0xFF}, {0xFF}
+ }, { // WEEPINBELL
+ {0x0C}, {0x0F}, {0x0B}, {0x33}, {0xFF}, {0xFF}
+ }, { // VICTREEBEL
+ {0x11}, {0x0C}, {0x09}, {0x33}, {0xFF}, {0xFF}
+ }, { // WOOPER
+ {0x27}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SWINUB
+ {0x11}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SKARMORY
+ {0x1B}, {0x1A}, {0x0C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AIPOM
+ {0x03}, {0x1B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ESPEON
+ {0x09}, {0x0C}, {0x1B}, {0x33}, {0xFF}, {0xFF}
+ }, { // HITMONCHAN
+ {0x11}, {0x15}, {0x00}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ELEKID
+ {0x0B}, {0x0B}, {0x11}, {0x33}, {0xFF}, {0xFF}
+ }, { // ELECTABUZZ
+ {0x0C}, {0x09}, {0x2C}, {0x2C}, {0xFF}, {0xFF}
+ }, { // ENTEI
+ {0x09}, {0x03}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FERALIGATR
+ {0x30}, {0x00}, {0x0F}, {0x03}, {0x30}, {0xFF}
+ }, { // FURRET
+ {0x30}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OCTILLERY
+ {0x1B}, {0x11}, {0x30}, {0x0C}, {0xFF}, {0xFF}
+ }, { // PRIMEAPE
+ {0x12}, {0x03}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SENTRET
+ {0x09}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STANTLER
+ {0x00}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SPEAROW
+ {0x0C}, {0x18}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FEAROW
+ {0x0C}, {0x18}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // OMASTAR
+ {0x18}, {0x00}, {0x15}, {0x33}, {0xFF}, {0xFF}
+ }, { // OMANYTE
+ {0x18}, {0x00}, {0x12}, {0x33}, {0xFF}, {0xFF}
+ }, { // GROWLITHE
+ {0x21}, {0x0F}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MACHAMP
+ {0x2A}, {0x00}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DRAGONITE
+ {0x00}, {0x15}, {0x12}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PINSIR
+ {0x11}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SNORLAX
+ {0x18}, {0x00}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KABUTO
+ {0x2A}, {0x27}, {0x1A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KABUTOPS
+ {0x2A}, {0x27}, {0x15}, {0x33}, {0xFF}, {0xFF}
+ }, { // HITMONTOP
+ {0x11}, {0x15}, {0x1D}, {0x33}, {0xFF}, {0xFF}
+ }, { // WARTORTLE
+ {0x08}, {0x30}, {0x24}, {0x33}, {0xFF}, {0xFF}
+ }, { // BLASTOISE
+ {0x00}, {0x1E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FARFETCHD
+ {0x06}, {0x0B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CUBONE
+ {0x2D}, {0x18}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAROWAK
+ {0x00}, {0x1A}, {0x00}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KANGASKHAN
+ {0x00}, {0x00}, {0x1B}, {0x33}, {0xFF}, {0xFF}
+ }, { // SUNFLORA
+ {0x2C}, {0x18}, {0x2C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CATERPIE
+ {0x00}, {0x30}, {0x0C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GYARADOS
+ {0x1D}, {0x09}, {0x11}, {0x1D}, {0xFF}, {0xFF}
+ }, { // RAPIDASH
+ {0x00}, {0x11}, {0x00}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NINETALES
+ {0x12}, {0x05}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GIRAFARIG
+ {0x30}, {0x00}, {0x2A}, {0x11}, {0xFF}, {0xFF}
+ }, { // BELLOSSOM
+ {0x09}, {0x1B}, {0x2C}, {0x33}, {0xFF}, {0xFF}
+ }, { // KINGDRA
+ {0x0C}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KINGLER
+ {0x0C}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GLOOM
+ {0x27}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PINECO
+ {0x12}, {0x18}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GLIGAR
+ {0x12}, {0x1B}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KRABBY
+ {0x00}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GRANBULL
+ {0x02}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CROBAT
+ {0x18}, {0x00}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ABRA
+ {0x00}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GENGAR
+ {0x09}, {0x08}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TAUROS
+ {0x1D}, {0x1A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAGIKARP
+ {0x00}, {0x11}, {0x1B}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAGNEMITE
+ {0x00}, {0x09}, {0x12}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GASTLY
+ {0x00}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HAUNTER
+ {0x15}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MACHOKE
+ {0x2A}, {0x1A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KAKUNA
+ {0x2A}, {0x27}, {0x2A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PSYDUCK
+ {0x12}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PHANPY
+ {0x00}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RATTATA
+ {0x00}, {0x00}, {0x2C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GOLDUCK
+ {0x18}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GOLBAT
+ {0x1A}, {0x00}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GOLEM
+ {0x18}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GRAVELER
+ {0x00}, {0x09}, {0x30}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VENONAT
+ {0x09}, {0x1A}, {0x00}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RHYDON
+ {0x12}, {0x15}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RHYHORN
+ {0x14}, {0x1A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PUPITAR
+ {0x27}, {0x11}, {0x1B}, {0x33}, {0xFF}, {0xFF}
+ }, { // CORSOLA
+ {0x18}, {0x18}, {0x2A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HITMONLEE
+ {0x11}, {0x15}, {0x0C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ZAPDOS
+ {0x00}, {0x18}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // JOLTEON
+ {0x1A}, {0x0C}, {0x15}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SANDSHREW
+ {0x00}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SANDSLASH
+ {0x00}, {0x00}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SEADRA
+ {0x0C}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHELLDER
+ {0x09}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VAPOREON
+ {0x03}, {0x18}, {0x0C}, {0x15}, {0xFF}, {0xFF}
+ }, { // DEWGONG
+ {0x27}, {0x15}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SUICUNE
+ {0x0C}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STARMIE
+ {0x1B}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SCYTHER
+ {0x12}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ZUBAT
+ {0x27}, {0x00}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BEEDRILL
+ {0x0C}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HYPNO
+ {0x11}, {0x18}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DROWZEE
+ {0x21}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SQUIRTLE
+ {0x30}, {0x24}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CELEBI
+ {0x09}, {0x09}, {0x0C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WOBBUFFET
+ {0x1D}, {0x2C}, {0x09}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DUGTRIO
+ {0x2C}, {0x0C}, {0x18}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HORSEA
+ {0x1A}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EXEGGCUTE
+ {0x09}, {0x2C}, {0x27}, {0x33}, {0xFF}, {0xFF}
+ }, { // CHIKORITA
+ {0x11}, {0x18}, {0x0C}, {0x2A}, {0xFF}, {0xFF}
+ }, { // CHINCHOU
+ {0x0F}, {0x21}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SHUCKLE
+ {0x2A}, {0x26}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DIGLETT
+ {0x11}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // REMORAID
+ {0x09}, {0x18}, {0x03}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DELIBIRD
+ {0x09}, {0x0C}, {0x30}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HOUNDOUR
+ {0x23}, {0x1A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AMPHAROS
+ {0x00}, {0x06}, {0x18}, {0x33}, {0xFF}, {0xFF}
+ }, { // DODUO
+ {0x1A}, {0x27}, {0x18}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DODRIO
+ {0x1A}, {0x0C}, {0x18}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SMEARGLE
+ {0x30}, {0x26}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KOFFING
+ {0x15}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TENTACRUEL
+ {0x09}, {0x2A}, {0x27}, {0x33}, {0xFF}, {0xFF}
+ }, { // TOGETIC
+ {0x18}, {0x09}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TOGEPI
+ {0x18}, {0x09}, {0x0C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GOLDEEN
+ {0x1A}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // METAPOD
+ {0x09}, {0x2A}, {0x15}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DONPHAN
+ {0x1B}, {0x00}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ODDISH
+ {0x15}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // EXEGGUTOR
+ {0x09}, {0x2C}, {0x09}, {0x32}, {0x33}, {0xFF}
+ }, { // NIDOKING
+ {0x12}, {0x18}, {0x0C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NIDOQUEEN
+ {0x12}, {0x18}, {0x0C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NIDORAN_F
+ {0x12}, {0x18}, {0x00}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NIDORAN_M
+ {0x12}, {0x18}, {0x00}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NIDORINA
+ {0x12}, {0x18}, {0x0C}, {0x2A}, {0xFF}, {0xFF}
+ }, { // NIDORINO
+ {0x12}, {0x18}, {0x0C}, {0x18}, {0xFF}, {0xFF}
+ }, { // MEOWTH
+ {0x0C}, {0x21}, {0x11}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SNEASEL
+ {0x0C}, {0x26}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POLIWHIRL
+ {0x15}, {0x0C}, {0x30}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POLITOED
+ {0x1B}, {0x0C}, {0x18}, {0x33}, {0xFF}, {0xFF}
+ }, { // POLIWRATH
+ {0x15}, {0x0C}, {0x00}, {0xFF}, {0xFF}, {0xFF}
+ }, { // POLIWAG
+ {0x15}, {0x0C}, {0x00}, {0xFF}, {0xFF}, {0xFF}
+ }, { // QUAGSIRE
+ {0x00}, {0x12}, {0x32}, {0xFF}, {0xFF}, {0xFF}
+ }, { // NATU
+ {0x00}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // XATU
+ {0x00}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DUNSPARCE
+ {0x2A}, {0x1C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SEEL
+ {0x0E}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // STEELIX
+ {0x0C}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TYPHLOSION
+ {0x12}, {0x18}, {0x1B}, {0x33}, {0x33}, {0xFF}
+ }, { // DRAGONAIR
+ {0x00}, {0x15}, {0x0B}, {0x33}, {0xFF}, {0xFF}
+ }, { // BUTTERFREE
+ {0x2A}, {0x30}, {0x0C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SCIZOR
+ {0x11}, {0x32}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HOPPIP
+ {0x1D}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BLISSEY
+ {0x11}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PARAS
+ {0x09}, {0x00}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PARASECT
+ {0x09}, {0x00}, {0x09}, {0xFF}, {0xFF}, {0xFF}
+ }, { // QWILFISH
+ {0x11}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MR_MIME
+ {0x11}, {0x30}, {0x12}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TYROGUE
+ {0x12}, {0x18}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CLOYSTER
+ {0x1E}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TYRANITAR
+ {0x12}, {0x00}, {0x11}, {0x1B}, {0xFF}, {0xFF}
+ }, { // CLEFFA
+ {0x09}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WEEDLE
+ {0x0E}, {0x26}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PIKACHU
+ {0x0C}, {0x2A}, {0x27}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CLEFABLE
+ {0x09}, {0x2A}, {0x24}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PIDGEOT
+ {0x11}, {0x0C}, {0x15}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PIDGEOTTO
+ {0x11}, {0x0C}, {0x18}, {0x18}, {0xFF}, {0xFF}
+ }, { // PICHU
+ {0x0C}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CLEFAIRY
+ {0x09}, {0x0B}, {0x0C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHARMANDER
+ {0x06}, {0x02}, {0x32}, {0x33}, {0xFF}, {0xFF}
+ }, { // STARYU
+ {0x1B}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CYNDAQUIL
+ {0x0F}, {0x2A}, {0x09}, {0x33}, {0xFF}, {0xFF}
+ }, { // SUNKERN
+ {0x2C}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TEDDIURSA
+ {0x09}, {0x0C}, {0x30}, {0x2C}, {0xFF}, {0xFF}
+ }, { // VOLTORB
+ {0x1A}, {0x18}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MOLTRES
+ {0x1A}, {0x09}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FLAREON
+ {0x03}, {0x0C}, {0x15}, {0xFF}, {0xFF}, {0xFF}
+ }, { // ALAKAZAM
+ {0x00}, {0x2C}, {0x2C}, {0x00}, {0xFF}, {0xFF}
+ }, { // MAGMAR
+ {0x00}, {0x1D}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FORRETRESS
+ {0x1A}, {0x09}, {0x09}, {0x33}, {0xFF}, {0xFF}
+ }, { // WIGGLYTUFF
+ {0x11}, {0x27}, {0x0C}, {0x2A}, {0x33}, {0xFF}
+ }, { // IVYSAUR
+ {0x14}, {0x0C}, {0x32}, {0x33}, {0xFF}, {0xFF}
+ }, { // BULBASAUR
+ {0x24}, {0x2A}, {0x30}, {0x33}, {0xFF}, {0xFF}
+ }, { // VENUSAUR
+ {0x0C}, {0x2C}, {0x30}, {0x33}, {0xFF}, {0xFF}
+ }, { // AERODACTYL
+ {0x03}, {0x18}, {0x00}, {0x18}, {0xFF}, {0xFF}
+ }, { // MAGBY
+ {0x00}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // IGGLYBUFF
+ {0x11}, {0x2A}, {0x0C}, {0x2A}, {0xFF}, {0xFF}
+ }, { // UMBREON
+ {0x2A}, {0x0C}, {0x1B}, {0x33}, {0xFF}, {0xFF}
+ }, { // ARTICUNO
+ {0x06}, {0x11}, {0x27}, {0x18}, {0xFF}, {0xFF}
+ }, { // JIGGLYPUFF
+ {0x11}, {0x27}, {0x0C}, {0x2A}, {0x33}, {0xFF}
+ }, { // SNUBBULL
+ {0x2C}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BAYLEEF
+ {0x03}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // GRIMER
+ {0x12}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MUK
+ {0x2A}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HERACROSS
+ {0x09}, {0x2A}, {0x1B}, {0x33}, {0xFF}, {0xFF}
+ }, { // HOUNDOOM
+ {0x21}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PERSIAN
+ {0x32}, {0x11}, {0x00}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LICKITUNG
+ {0x11}, {0x0C}, {0x2A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HO_OH
+ {0x18}, {0x18}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // HOOTHOOT
+ {0x27}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PIDGEY
+ {0x11}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PONYTA
+ {0x1A}, {0x0C}, {0x2A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SKIPLOOM
+ {0x11}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PORYGON
+ {0x18}, {0x0C}, {0x15}, {0xFF}, {0xFF}, {0xFF}
+ }, { // PORYGON2
+ {0x1A}, {0x0C}, {0x1B}, {0x27}, {0xFF}, {0xFF}
+ }, { // MAGCARGO
+ {0x00}, {0x1B}, {0x18}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SLUGMA
+ {0x2C}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // QUILAVA
+ {0x11}, {0x06}, {0x08}, {0xFF}, {0xFF}, {0xFF}
+ }, { // BELLSPROUT
+ {0x0B}, {0x21}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // WEEZING
+ {0x0C}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MARILL
+ {0x08}, {0x10}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // AZUMARILL
+ {0x08}, {0x27}, {0x2C}, {0x10}, {0xFF}, {0xFF}
+ }, { // ELECTRODE
+ {0x0C}, {0x09}, {0x18}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MANKEY
+ {0x00}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MANTINE
+ {0x00}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // DRATINI
+ {0x00}, {0x0C}, {0x0C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MEW
+ {0x2D}, {0xFF}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MEWTWO
+ {0x2D}, {0x27}, {0xFF}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MILTANK
+ {0x11}, {0x03}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MISDREAVUS
+ {0x11}, {0x0C}, {0x2C}, {0x33}, {0xFF}, {0xFF}
+ }, { // SMOOCHUM
+ {0x27}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MEGANIUM
+ {0x03}, {0x09}, {0x0C}, {0x2A}, {0xFF}, {0xFF}
+ }, { // DITTO
+ {0x11}, {0x18}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TENTACOOL
+ {0x09}, {0x2A}, {0x27}, {0x33}, {0xFF}, {0xFF}
+ }, { // MAREEP
+ {0x1D}, {0x0E}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // FLAAFFY
+ {0x00}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VENOMOTH
+ {0x09}, {0x1A}, {0x15}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TANGELA
+ {0x02}, {0x09}, {0x2A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SLOWKING
+ {0x18}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SLOWBRO
+ {0x18}, {0x18}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // SLOWPOKE
+ {0x18}, {0x18}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MURKROW
+ {0x30}, {0x18}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // YANMA
+ {0x00}, {0x2A}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // KADABRA
+ {0x2C}, {0x00}, {0x2C}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LARVITAR
+ {0x15}, {0x11}, {0x15}, {0x33}, {0xFF}, {0xFF}
+ }, { // NOCTOWL
+ {0x1B}, {0x21}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RAIKOU
+ {0x12}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RAICHU
+ {0x12}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHANSEY
+ {0x00}, {0x0C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // RATICATE
+ {0x00}, {0x0C}, {0x03}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LAPRAS
+ {0x2C}, {0x00}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VILEPLUME
+ {0x14}, {0x27}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LANTURN
+ {0x00}, {0x30}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // CHARMELEON
+ {0x06}, {0x0C}, {0x0C}, {0x15}, {0x33}, {0xFF}
+ }, { // CHARIZARD
+ {0x06}, {0x11}, {0x32}, {0x33}, {0x33}, {0xFF}
+ }, { // URSARING
+ {0x30}, {0x2C}, {0x0C}, {0x33}, {0xFF}, {0xFF}
+ }, { // JYNX
+ {0x0C}, {0x33}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LUGIA
+ {0x27}, {0x0C}, {0x2A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MAGNETON
+ {0x00}, {0x09}, {0x2A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LEDIAN
+ {0x09}, {0x0C}, {0x00}, {0xFF}, {0xFF}, {0xFF}
+ }, { // LEDYBA
+ {0x09}, {0x0C}, {0x2A}, {0xFF}, {0xFF}, {0xFF}
+ }, { // VULPIX
+ {0x24}, {0x11}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // JUMPLUFF
+ {0x2C}, {0x2C}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }, { // TOTODILE
+ {0x18}, {0x18}, {0x12}, {0xFF}, {0xFF}, {0xFF}
+ }, { // MACHOP
+ {0x2A}, {0x15}, {0x33}, {0xFF}, {0xFF}, {0xFF}
+ }
+};
+
+#endif //GUARD_DATA_BARD_MUSIC_H
diff --git a/src/data/battle_strings_de.h b/src/data/battle_strings_de.h
new file mode 100755
index 000000000..a3d51f2a5
--- /dev/null
+++ b/src/data/battle_strings_de.h
@@ -0,0 +1,1612 @@
+#include "constants/moves.h"
+
+enum
+{
+ BATTLE_TEXT_UnknownString = 12,
+ BATTLE_TEXT_GainExpPoints,
+ BATTLE_TEXT_GrewLevel,
+ BATTLE_TEXT_LearnedMove,
+ BATTLE_TEXT_TryingToLearnMove,
+ BATTLE_TEXT_CantLearnMore,
+ BATTLE_TEXT_DeleteMove,
+ BATTLE_TEXT_DeletedMove,
+ BATTLE_TEXT_StopLearning,
+ BATTLE_TEXT_DidNotLearn,
+ BATTLE_TEXT_LearnedMove2,
+ BATTLE_TEXT_AttackMissed,
+ BATTLE_TEXT_ProtectedItself,
+ BATTLE_TEXT_StatNoHigher,
+ BATTLE_TEXT_AvoidedDamage,
+ BATTLE_TEXT_DoesntAffect,
+ BATTLE_TEXT_AttackingFainted,
+ BATTLE_TEXT_DefendingFainted,
+ BATTLE_TEXT_WinningPrize,
+ BATTLE_TEXT_OutOfUsablePoke,
+ BATTLE_TEXT_WhitedOut,
+ BATTLE_TEXT_PreventEscape,
+ BATTLE_TEXT_HitMulti,
+ BATTLE_TEXT_FellAsleep,
+ BATTLE_TEXT_MadeAsleep,
+ BATTLE_TEXT_DefendingAsleep,
+ BATTLE_TEXT_AttackingAsleep,
+ BATTLE_TEXT_WasntAffected,
+ BATTLE_TEXT_Poisoned,
+ BATTLE_TEXT_Poisoned2,
+ BATTLE_TEXT_PoisonHurt,
+ BATTLE_TEXT_AlreadyPoisoned,
+ BATTLE_TEXT_BadlyPoisoned,
+ BATTLE_TEXT_EnergyDrained,
+ BATTLE_TEXT_Burned,
+ BATTLE_TEXT_Burned2,
+ BATTLE_TEXT_BurnHurt,
+ BATTLE_TEXT_Frozen,
+ BATTLE_TEXT_Frozen2,
+ BATTLE_TEXT_FrozenSolid,
+ BATTLE_TEXT_DefendingDefrosted,
+ BATTLE_TEXT_AttackingDefrosted,
+ BATTLE_TEXT_Defrosted,
+ BATTLE_TEXT_Paralyzed,
+ BATTLE_TEXT_Paralyzed2,
+ BATTLE_TEXT_Paralyzed3,
+ BATTLE_TEXT_AlreadyParalyzed,
+ BATTLE_TEXT_ParalysisHealed,
+ BATTLE_TEXT_DreamEaten,
+ BATTLE_TEXT_AttackingStatNoHigher,
+ BATTLE_TEXT_DefendingStatNoHigher,
+ BATTLE_TEXT_StoppedWorking,
+ BATTLE_TEXT_StoppedWorking2,
+ BATTLE_TEXT_Confused,
+ BATTLE_TEXT_ConfusionSnapOut,
+ BATTLE_TEXT_BecameConfused,
+ BATTLE_TEXT_AlreadyConfused,
+ BATTLE_TEXT_FellLove,
+ BATTLE_TEXT_InLoveWith,
+ BATTLE_TEXT_ImmobilizedBy,
+ BATTLE_TEXT_BlownAway,
+ BATTLE_TEXT_TypeTransform,
+ BATTLE_TEXT_Flinched,
+ BATTLE_TEXT_RegainedHealth,
+ BATTLE_TEXT_HPFull,
+ BATTLE_TEXT_RaisedSpDef,
+ BATTLE_TEXT_RaisedDefense,
+ BATTLE_TEXT_CoveredVeil,
+ BATTLE_TEXT_SafeguardActive,
+ BATTLE_TEXT_SafeguardFaded,
+ BATTLE_TEXT_WentToSleep,
+ BATTLE_TEXT_SpeltHealthy,
+ BATTLE_TEXT_WhipWhirlwind,
+ BATTLE_TEXT_TookSunlight,
+ BATTLE_TEXT_LoweredHead,
+ BATTLE_TEXT_IsGlowing,
+ BATTLE_TEXT_FlewHigh,
+ BATTLE_TEXT_DugHole,
+ BATTLE_TEXT_SqueezedBind,
+ BATTLE_TEXT_TrappedVortex,
+ BATTLE_TEXT_Wrapped,
+ BATTLE_TEXT_Clamped,
+ BATTLE_TEXT_HurtBy,
+ BATTLE_TEXT_FreedFrom,
+ BATTLE_TEXT_KeptGoingCrash,
+ BATTLE_TEXT_MistShroud,
+ BATTLE_TEXT_MistProtect,
+ BATTLE_TEXT_GetPumped,
+ BATTLE_TEXT_HitRecoil,
+ BATTLE_TEXT_ProtectedItself2,
+ BATTLE_TEXT_SandBuffeted,
+ BATTLE_TEXT_HailStricken,
+ BATTLE_TEXT_WasSeeded,
+ BATTLE_TEXT_EvadedAttack,
+ BATTLE_TEXT_HealthSapped,
+ BATTLE_TEXT_FastAsleep,
+ BATTLE_TEXT_WokeUp,
+ BATTLE_TEXT_UproarAwake,
+ BATTLE_TEXT_UproarWoke,
+ BATTLE_TEXT_UproarCaused,
+ BATTLE_TEXT_UproarMaking,
+ BATTLE_TEXT_CalmedDown,
+ BATTLE_TEXT_UproarCantSleep,
+ BATTLE_TEXT_Stockpiled,
+ BATTLE_TEXT_StockpiledCant,
+ BATTLE_TEXT_UproarCantSleep2,
+ BATTLE_TEXT_UproarKeptAwake,
+ BATTLE_TEXT_StayedAwake,
+ BATTLE_TEXT_StoringEnergy,
+ BATTLE_TEXT_UnleashedEnergy,
+ BATTLE_TEXT_FatigueConfuse,
+ BATTLE_TEXT_PickedUpYen,
+ BATTLE_TEXT_Unaffected,
+ BATTLE_TEXT_Transformed,
+ BATTLE_TEXT_SubMade,
+ BATTLE_TEXT_SubAlready,
+ BATTLE_TEXT_SubTookDamage,
+ BATTLE_TEXT_SubFaded,
+ BATTLE_TEXT_MustRecharge,
+ BATTLE_TEXT_RageBuilding,
+ BATTLE_TEXT_MoveWasDisabled,
+ BATTLE_TEXT_MoveIsDisabled,
+ BATTLE_TEXT_DisabledNoMore,
+ BATTLE_TEXT_EncoreGot,
+ BATTLE_TEXT_EncoreEnded,
+ BATTLE_TEXT_TookAim,
+ BATTLE_TEXT_SketchedMove,
+ BATTLE_TEXT_DestinyBondTake,
+ BATTLE_TEXT_DestinyBondTaken,
+ BATTLE_TEXT_ReducedBy,
+ BATTLE_TEXT_StoleSomething,
+ BATTLE_TEXT_CantEscapeNow,
+ BATTLE_TEXT_NightmareStart,
+ BATTLE_TEXT_NightmareLock,
+ BATTLE_TEXT_CurseLay,
+ BATTLE_TEXT_CurseAfflict,
+ BATTLE_TEXT_SpikesScattered,
+ BATTLE_TEXT_SpikesHurt,
+ BATTLE_TEXT_IdentifiedPoke,
+ BATTLE_TEXT_PerishSongFell,
+ BATTLE_TEXT_BracedItself,
+ BATTLE_TEXT_EnduredHit,
+ BATTLE_TEXT_MagnitudeCount,
+ BATTLE_TEXT_CutHPMaxATK,
+ BATTLE_TEXT_CopyStatChanges,
+ BATTLE_TEXT_GotFreeFrom,
+ BATTLE_TEXT_LeechShed,
+ BATTLE_TEXT_SpikesBlownAway,
+ BATTLE_TEXT_FledBattle,
+ BATTLE_TEXT_ForesawAttack,
+ BATTLE_TEXT_TookAttack,
+ BATTLE_TEXT_PokeAttack,
+ BATTLE_TEXT_CenterAttention,
+ BATTLE_TEXT_ChargingPower,
+ BATTLE_TEXT_NaturePower,
+ BATTLE_TEXT_StatusNormal,
+ BATTLE_TEXT_NoMovesLeft,
+ BATTLE_TEXT_TormentSubject,
+ BATTLE_TEXT_TormentNoUse,
+ BATTLE_TEXT_TightenFocus,
+ BATTLE_TEXT_TauntFell,
+ BATTLE_TEXT_TauntNoUse,
+ BATTLE_TEXT_ReadyToHelp,
+ BATTLE_TEXT_SwitchedItems,
+ BATTLE_TEXT_CopiedObject,
+ BATTLE_TEXT_WishMade,
+ BATTLE_TEXT_WishTrue,
+ BATTLE_TEXT_PlantedRoots,
+ BATTLE_TEXT_AbsorbNutrients,
+ BATTLE_TEXT_AnchoredItself,
+ BATTLE_TEXT_DrowsyMade,
+ BATTLE_TEXT_KnockedOffItem,
+ BATTLE_TEXT_AbilitySwap,
+ BATTLE_TEXT_SealedMove,
+ BATTLE_TEXT_SealedNoUse,
+ BATTLE_TEXT_GrudgeBear,
+ BATTLE_TEXT_GrudgeLosePP,
+ BATTLE_TEXT_ShroudedItself,
+ BATTLE_TEXT_MagicCoatBounce,
+ BATTLE_TEXT_AwaitMove,
+ BATTLE_TEXT_SnatchedMove,
+ BATTLE_TEXT_RainMade,
+ BATTLE_TEXT_SpeedRisen,
+ BATTLE_TEXT_ProtectedBy,
+ BATTLE_TEXT_PreventedBy,
+ BATTLE_TEXT_HPRestoredUsing,
+ BATTLE_TEXT_MadeType,
+ BATTLE_TEXT_PreventedPara,
+ BATTLE_TEXT_PreventedRomance,
+ BATTLE_TEXT_PreventedPoison,
+ BATTLE_TEXT_PreventedConfusion,
+ BATTLE_TEXT_RaisedFirePower,
+ BATTLE_TEXT_AnchorsItself,
+ BATTLE_TEXT_CutsAttack,
+ BATTLE_TEXT_PreventedStatLoss,
+ BATTLE_TEXT_HurtOther,
+ BATTLE_TEXT_Traced,
+ BATTLE_TEXT_Sharply,
+ BATTLE_TEXT_Rose,
+ BATTLE_TEXT_Harshly,
+ BATTLE_TEXT_Fell,
+ BATTLE_TEXT_UnknownString7,
+ BATTLE_TEXT_UnknownString3,
+ BATTLE_TEXT_UnknownString5,
+ BATTLE_TEXT_UnknownString6,
+ BATTLE_TEXT_Critical,
+ BATTLE_TEXT_GrandSlam,
+ BATTLE_TEXT_MoveForget123,
+ BATTLE_TEXT_MoveForgetAnd,
+ BATTLE_TEXT_NotEffective,
+ BATTLE_TEXT_SuperEffective,
+ BATTLE_TEXT_GotAwaySafely,
+ BATTLE_TEXT_FledWild,
+ BATTLE_TEXT_NoRunning,
+ BATTLE_TEXT_CantEscape2,
+ BATTLE_TEXT_BirchDontLeaveMe,
+ BATTLE_TEXT_Nothing,
+ BATTLE_TEXT_Failed,
+ BATTLE_TEXT_HurtItself,
+ BATTLE_TEXT_MirrorFail,
+ BATTLE_TEXT_RainStart,
+ BATTLE_TEXT_PourStart,
+ BATTLE_TEXT_RainCont1,
+ BATTLE_TEXT_PourCont,
+ BATTLE_TEXT_RainStop,
+ BATTLE_TEXT_SandBrewed,
+ BATTLE_TEXT_SandRages,
+ BATTLE_TEXT_SandSubsided,
+ BATTLE_TEXT_SunBright,
+ BATTLE_TEXT_SunStrong,
+ BATTLE_TEXT_SunFaded,
+ BATTLE_TEXT_HailStart,
+ BATTLE_TEXT_HailCont,
+ BATTLE_TEXT_HailStop,
+ BATTLE_TEXT_SpitUpFail,
+ BATTLE_TEXT_SwallowFail,
+ BATTLE_TEXT_WindHeatWave,
+ BATTLE_TEXT_StatElim,
+ BATTLE_TEXT_CoinScatter,
+ BATTLE_TEXT_SubWeak,
+ BATTLE_TEXT_PainSplit,
+ BATTLE_TEXT_BellChime,
+ BATTLE_TEXT_PerishSong,
+ BATTLE_TEXT_NoPP1,
+ BATTLE_TEXT_NoPP2,
+ BATTLE_TEXT_Used1,
+ BATTLE_TEXT_TutorialUsed,
+ BATTLE_TEXT_BlockBall,
+ BATTLE_TEXT_DontBeAThief,
+ BATTLE_TEXT_DodgeBall,
+ BATTLE_TEXT_MissPoke,
+ BATTLE_TEXT_BallBrokeOhNo,
+ BATTLE_TEXT_BallBrokeAppeared,
+ BATTLE_TEXT_BallBrokeAlmost,
+ BATTLE_TEXT_BallBrokeSoClose,
+ BATTLE_TEXT_BallCaught1,
+ BATTLE_TEXT_BallCaught2,
+ BATTLE_TEXT_GiveNickname,
+ BATTLE_TEXT_SentToPC,
+ BATTLE_TEXT_AddedToDex,
+ BATTLE_TEXT_Raining,
+ BATTLE_TEXT_Sandstorm,
+ BATTLE_TEXT_CantEscape,
+ BATTLE_TEXT_IgnoredOrdersSLP,
+ BATTLE_TEXT_IgnoredOrders,
+ BATTLE_TEXT_BeganNap,
+ BATTLE_TEXT_LoafingAround,
+ BATTLE_TEXT_WontObey,
+ BATTLE_TEXT_TurnedAway,
+ BATTLE_TEXT_NotNotice,
+ BATTLE_TEXT_WillSwitch,
+ BATTLE_TEXT_CreptCloser,
+ BATTLE_TEXT_CantGetCloser,
+ BATTLE_TEXT_WatchingCarefully,
+ BATTLE_TEXT_CuriousAbout,
+ BATTLE_TEXT_EnthralledBy,
+ BATTLE_TEXT_IgnoredThing,
+ BATTLE_TEXT_ThrewBlock,
+ BATTLE_TEXT_SafariOver,
+ BATTLE_TEXT_CuredParalysis,
+ BATTLE_TEXT_CuredPoison,
+ BATTLE_TEXT_CuredBurn,
+ BATTLE_TEXT_CuredFreeze,
+ BATTLE_TEXT_CuredSleep,
+ BATTLE_TEXT_CuredConfusion,
+ BATTLE_TEXT_CuredStatus,
+ BATTLE_TEXT_RestoredHealth,
+ BATTLE_TEXT_RestoredPP,
+ BATTLE_TEXT_RestoredStatus,
+ BATTLE_TEXT_RestoredHPLittle,
+ BATTLE_TEXT_ChoiceBand,
+ BATTLE_TEXT_FocusSash,
+ BATTLE_TEXT_Terminator2,
+ BATTLE_TEXT_PreventedBurn,
+ BATTLE_TEXT_BlocksOther,
+ BATTLE_TEXT_RestoredHPByItem,
+ BATTLE_TEXT_WhipSandstorm,
+ BATTLE_TEXT_PreventedLoss,
+ BATTLE_TEXT_InfatuatedPoke,
+ BATTLE_TEXT_MadeIneffective,
+ BATTLE_TEXT_CuredProblem,
+ BATTLE_TEXT_OozeSuckup,
+ BATTLE_TEXT_Transformed2,
+ BATTLE_TEXT_ElecWeakened,
+ BATTLE_TEXT_FireWeakened,
+ BATTLE_TEXT_HidUnderwater,
+ BATTLE_TEXT_SprangUp,
+ BATTLE_TEXT_CantForgetHM,
+ BATTLE_TEXT_FoundOne,
+ BATTLE_TEXT_PlayerDefeatedTrainer2,
+ BATTLE_TEXT_SoothingAroma,
+ BATTLE_TEXT_CantUseItems,
+ BATTLE_TEXT_UnknownString2,
+ BATTLE_TEXT_UnknownString4,
+ BATTLE_TEXT_HustleUse,
+ BATTLE_TEXT_MadeUseless,
+ BATTLE_TEXT_SandTombTrapped,
+ BATTLE_TEXT_Terminator,
+ BATTLE_TEXT_BoostedExp,
+ BATTLE_TEXT_SunIntensified,
+ BATTLE_TEXT_GroundMoveNegate,
+ BATTLE_TEXT_WallyBall,
+ BATTLE_TEXT_TookAttack2,
+ BATTLE_TEXT_ChoseDestiny,
+ BATTLE_TEXT_LostFocus,
+ BATTLE_TEXT_UseNext,
+ BATTLE_TEXT_FledUsingItem,
+ BATTLE_TEXT_FledUsingOther,
+ BATTLE_TEXT_DraggedOut,
+ BATTLE_TEXT_PreventedOther,
+ BATTLE_TEXT_NormalizedStatus,
+ BATTLE_TEXT_Used2,
+ BATTLE_TEXT_BoxFull,
+ BATTLE_TEXT_AvoidedAttack,
+ BATTLE_TEXT_MadeIneffective2,
+ BATTLE_TEXT_PreventedFlinching,
+ BATTLE_TEXT_AlreadyBurned,
+ BATTLE_TEXT_StatNoLower,
+ BATTLE_TEXT_BlocksOther2,
+ BATTLE_TEXT_WoreOff,
+ BATTLE_TEXT_RaisedDefenseLittle,
+ BATTLE_TEXT_RaisedSpDefLittle,
+ BATTLE_TEXT_BrokeWall,
+ BATTLE_TEXT_PreventedOther2,
+ BATTLE_TEXT_CuredOfProblem,
+ BATTLE_TEXT_AttackingCantEscape,
+ BATTLE_TEXT_Obtained1,
+ BATTLE_TEXT_Obtained2,
+ BATTLE_TEXT_Obtained3,
+ BATTLE_TEXT_NoEffect,
+ BATTLE_TEXT_NoEffectOn,
+};
+
+const u8 BattleText_UnknownString[] = _("{STRING 33}");
+const u8 BattleText_GainExpPoints[] = _("{STRING 0} erhält{PLAYER}\n{STRING 42} E-Punkte!\p");
+const u8 BattleText_Terminator[] = _("");
+const u8 BattleText_BoostedExp[] = _(" spezielle");
+const u8 BattleText_GrewLevel[] = _("{STRING 0} erreicht\nLv. {PLAYER}!{UNKNOWN_A}\p");
+const u8 BattleText_LearnedMove[] = _("{STRING 0} erlernt\n{PLAYER}!{UNKNOWN_A}\p");
+const u8 BattleText_TryingToLearnMove[] = _("{STRING 0} versucht,\n{PLAYER} zu lernen.\p");
+const u8 BattleText_CantLearnMore[] = _("Aber {STRING 0} kann nicht\nmehr als vier Attacken erlernen.\p");
+const u8 BattleText_DeleteMove[] = _("Soll eine Attacke zu Gunsten von\n{PLAYER} vergessen werden?");
+const u8 BattleText_DeletedMove[] = _("{STRING 0} hat\n{PLAYER} vergessen!\p");
+const u8 BattleText_StopLearning[] = _("{PAUSE 32}{PLAYER}\nnicht erlernen?");
+const u8 BattleText_DidNotLearn[] = _("{STRING 0} hat {PLAYER}\nnicht erlernt.\p");
+const u8 BattleText_UseNext[] = _("Nächstes POKéMON einsetzen?");
+const u8 BattleText_AttackMissed[] = _("Attacke von {EVIL_LEGENDARY}\nging daneben!");
+const u8 BattleText_ProtectedItself[] = _("{GOOD_LEGENDARY}\nschützt sich selbst!");
+const u8 BattleText_AvoidedDamage[] = _("{GOOD_LEGENDARY} vermeidet\nSchaden mit {STRING 22}!");
+const u8 BattleText_GroundMoveNegate[] = _("{GOOD_LEGENDARY} wehrt BODEN-\nAttacken mit {STRING 22} ab!");
+const u8 BattleText_AvoidedAttack[] = _("{GOOD_LEGENDARY} wehrt die\nAttacke ab!");
+const u8 BattleText_DoesntAffect[] = _("Es hat keine Wirkung auf\n{GOOD_LEGENDARY}...");
+const u8 BattleText_AttackingFainted[] = _("{EVIL_LEGENDARY}\nwurde besiegt!\p");
+const u8 BattleText_DefendingFainted[] = _("{GOOD_LEGENDARY}\nwurde besiegt!\p");
+const u8 BattleText_WinningPrize[] = _("{STRING 32} gewinnt ¥{STRING 0}!\p");
+const u8 BattleText_OutOfUsablePoke[] = _("{STRING 32} hat kein\nkampffähiges POKéMON mehr!\p");
+const u8 BattleText_WhitedOut[] = _("{STRING 32} fällt in Ohnmacht!{PAUSE_UNTIL_PRESS}");
+const u8 BattleText_PreventEscape[] = _("{STRING 16} verhindert\neine Flucht mit {STRING 23}!\p");
+const u8 BattleText_CantEscape[] = _("Flucht unmöglich!\p");
+const u8 BattleText_AttackingCantEscape[] = _("{EVIL_LEGENDARY}\nkann nicht fliehen!");
+const u8 BattleText_HitMulti[] = _("{STRING 0}-mal getroffen!");
+const u8 BattleText_FellAsleep[] = _("{STRING 14}\nist eingeschlafen!");
+const u8 BattleText_MadeAsleep[] = _("{STRING 23} von\n{STRING 16} lässt\l{STRING 14} einschlafen!");
+const u8 BattleText_DefendingAsleep[] = _("{GOOD_LEGENDARY} schläft\nbereits!");
+const u8 BattleText_AttackingAsleep[] = _("{EVIL_LEGENDARY} schläft\nbereits!");
+const u8 BattleText_WasntAffected[] = _("{GOOD_LEGENDARY}\nist unversehrt!");
+const u8 BattleText_Poisoned[] = _("{STRING 14}\nwurde vergiftet!");
+const u8 BattleText_Poisoned2[] = _("{STRING 23} von\n{STRING 16} vergiftete\l{STRING 14}!");
+const u8 BattleText_PoisonHurt[] = _("{EVIL_LEGENDARY} wurde durch\nGift verletzt!");
+const u8 BattleText_AlreadyPoisoned[] = _("{GOOD_LEGENDARY} ist bereits\nvergiftet.");
+const u8 BattleText_BadlyPoisoned[] = _("{STRING 14} wurde schwer\nvergiftet!");
+const u8 BattleText_EnergyDrained[] = _("{GOOD_LEGENDARY} wurde\nEnergie abgesaugt!");
+const u8 BattleText_Burned[] = _("{STRING 14} brennt!");
+const u8 BattleText_Burned2[] = _("{STRING 23} von\n{STRING 16} verbrennt\l{STRING 14}!");
+const u8 BattleText_BurnHurt[] = _("Die Verbrennung schadet\n{EVIL_LEGENDARY}!");
+const u8 BattleText_AlreadyBurned[] = _("{GOOD_LEGENDARY} brennt\nbereits.");
+const u8 BattleText_Frozen[] = _("{STRING 14} erstarrt\nzu Eis!");
+const u8 BattleText_Frozen2[] = _("{STRING 14} wurde durch\n{STRING 23} von\l{STRING 16} eingefroren!");
+const u8 BattleText_FrozenSolid[] = _("{EVIL_LEGENDARY} ist\neingefroren!");
+const u8 BattleText_DefendingDefrosted[] = _("{GOOD_LEGENDARY} wurde\naufgetaut!");
+const u8 BattleText_AttackingDefrosted[] = _("{EVIL_LEGENDARY} wurde\naufgetaut!");
+const u8 BattleText_Defrosted[] = _("{EVIL_LEGENDARY} wurde\ndurch {STRING 17} aufgetaut!");
+const u8 BattleText_Paralyzed[] = _("{STRING 14} ist\nparalysiert! Es greift\leventuell nicht an!");
+const u8 BattleText_Paralyzed2[] = _("{STRING 23} von\n{STRING 16} paralysierte\p{STRING 14}!\nEs greift eventuell nicht an!");
+const u8 BattleText_Paralyzed3[] = _("{EVIL_LEGENDARY} ist\nparalysiert! Es kann\lnicht angreifen!");
+const u8 BattleText_AlreadyParalyzed[] = _("{GOOD_LEGENDARY} ist\nbereits paralysiert!");
+const u8 BattleText_ParalysisHealed[] = _("{GOOD_LEGENDARY} wurde von der\nParalyse geheilt!");
+const u8 BattleText_DreamEaten[] = _("Der Traum von {GOOD_LEGENDARY}\nwurde gefressen!");
+const u8 BattleText_AttackingStatNoHigher[] = _("{STRING 0} von\n{EVIL_LEGENDARY} kann nicht\lmehr erhöht werden!");
+const u8 BattleText_DefendingStatNoHigher[] = _("{STRING 0} von\n{GOOD_LEGENDARY} kann nicht\lweiter gesenkt werden!");
+const u8 BattleText_StoppedWorking[] = _("{STRING 0} in deinem Team\nfunktioniert nicht mehr!");
+const u8 BattleText_StoppedWorking2[] = _("{STRING 0} des Gegners\nfunktioniert nicht mehr!");
+const u8 BattleText_Confused[] = _("{EVIL_LEGENDARY} ist\nverwirrt!");
+const u8 BattleText_ConfusionSnapOut[] = _("{EVIL_LEGENDARY} ist nicht\nmehr verwirrt!");
+const u8 BattleText_BecameConfused[] = _("{STRING 14} wurde\nverwirrt!");
+const u8 BattleText_AlreadyConfused[] = _("{GOOD_LEGENDARY} ist\nbereits verwirrt!");
+const u8 BattleText_FellLove[] = _("{GOOD_LEGENDARY}\nhat sich verliebt!");
+const u8 BattleText_InLoveWith[] = _("{EVIL_LEGENDARY} hat sich in\n{STRING 16} verliebt!");
+const u8 BattleText_ImmobilizedBy[] = _("{EVIL_LEGENDARY} ist starr\nvor Liebe!");
+const u8 BattleText_BlownAway[] = _("{GOOD_LEGENDARY} wurde\nweggeweht!");
+const u8 BattleText_TypeTransform[] = _("{EVIL_LEGENDARY} verwandelt\nsich zu Typ {STRING 0}!");
+const u8 BattleText_Flinched[] = _("{EVIL_LEGENDARY} schreckt\nzurück!");
+const u8 BattleText_RegainedHealth[] = _("{GOOD_LEGENDARY} erholt sich!");
+const u8 BattleText_HPFull[] = _("{GOOD_LEGENDARY} hat alle KP!");
+const u8 BattleText_RaisedSpDef[] = _("{STRING 17} von\n{STRING 38} erhöht\ldie SP. VER.");
+const u8 BattleText_RaisedSpDefLittle[] = _("Die SP. VER. wird etwas durch\n{STRING 17} von\l{STRING 38} erhöht.");
+const u8 BattleText_RaisedDefense[] = _("{STRING 17} von\n{STRING 38}\lerhöht die VERTEIDIGUNG!");
+const u8 BattleText_RaisedDefenseLittle[] = _("{STRING 17} von\n{STRING 38}\lerhöht etwas die VERTEIDIGUNG!");
+const u8 BattleText_CoveredVeil[] = _("{STRING 38} wird von\neinem Schleier umhüllt!");
+const u8 BattleText_SafeguardActive[] = _("{GOOD_LEGENDARY} wird durch\nBODYGUARD geschützt!");
+const u8 BattleText_SafeguardFaded[] = _("BODYGUARD von\n{STRING 40} lässt nach!");
+const u8 BattleText_WentToSleep[] = _("{EVIL_LEGENDARY} ist\neingeschlafen!");
+const u8 BattleText_SpeltHealthy[] = _("{EVIL_LEGENDARY} schläft und\nerholt sich!");
+const u8 BattleText_WhipWhirlwind[] = _("{EVIL_LEGENDARY} entfacht\neinen Wirbelwind!");
+const u8 BattleText_TookSunlight[] = _("{EVIL_LEGENDARY} absorbiert\nSonnenlicht!");
+const u8 BattleText_LoweredHead[] = _("{EVIL_LEGENDARY} zieht seinen\nKopf ein!");
+const u8 BattleText_IsGlowing[] = _("{EVIL_LEGENDARY} leuchtet!");
+const u8 BattleText_FlewHigh[] = _("{EVIL_LEGENDARY} fliegt\nhoch empor!");
+const u8 BattleText_DugHole[] = _("{EVIL_LEGENDARY} gräbt sich\nein!");
+const u8 BattleText_HidUnderwater[] = _("{EVIL_LEGENDARY} taucht\nunter!");
+const u8 BattleText_SprangUp[] = _("{EVIL_LEGENDARY} springt auf!");
+const u8 BattleText_SqueezedBind[] = _("{EVIL_LEGENDARY} setzt bei\n{GOOD_LEGENDARY}\lKLAMMERGRIFF ein!");
+const u8 BattleText_TrappedVortex[] = _("{GOOD_LEGENDARY} wurde in\neinem Strudel gefangen!");
+const u8 BattleText_SandTombTrapped[] = _("{GOOD_LEGENDARY} wurde durch\nSANDGRAB gefangen!");
+const u8 BattleText_Wrapped[] = _("{GOOD_LEGENDARY} wurde von\n{EVIL_LEGENDARY} umWICKELt!");
+const u8 BattleText_Clamped[] = _("{GOOD_LEGENDARY} wurde von\n{EVIL_LEGENDARY} geSCHNAPPT!");
+const u8 BattleText_HurtBy[] = _("{EVIL_LEGENDARY} wurde durch\n{STRING 0} verletzt!");
+const u8 BattleText_FreedFrom[] = _("{EVIL_LEGENDARY} wurde von\n{STRING 0} befreit!");
+const u8 BattleText_KeptGoingCrash[] = _("{EVIL_LEGENDARY} macht weiter\nund bricht zusammen!");
+const u8 BattleText_MistShroud[] = _("{STRING 38} wird in\nWEISSNEBEL gehüllt!");
+const u8 BattleText_MistProtect[] = _("{STRING 16} wird durch\nWEISSNEBEL geschützt!");
+const u8 BattleText_GetPumped[] = _("{EVIL_LEGENDARY} pumpt\nsich auf!");
+const u8 BattleText_HitRecoil[] = _("{EVIL_LEGENDARY} wurde vom\nRückstoß getroffen!");
+const u8 BattleText_ProtectedItself2[] = _("{EVIL_LEGENDARY} schützt\nsich selbst!");
+const u8 BattleText_SandBuffeted[] = _("{EVIL_LEGENDARY} wird vom\nSandsturm getroffen!");
+const u8 BattleText_HailStricken[] = _("{EVIL_LEGENDARY} wird vom\nHAGELSTURM getroffen!");
+const u8 BattleText_WoreOff[] = _("{STRING 0} von\n{STRING 36} lässt nach!");
+const u8 BattleText_WasSeeded[] = _("{GOOD_LEGENDARY} wurde\nbepflanzt!");
+const u8 BattleText_EvadedAttack[] = _("{GOOD_LEGENDARY} ist\nausgewichen!");
+const u8 BattleText_HealthSapped[] = _("EGELSAMEN schadet\n{EVIL_LEGENDARY}!");
+const u8 BattleText_FastAsleep[] = _("{EVIL_LEGENDARY} schläft tief\nund fest.");
+const u8 BattleText_WokeUp[] = _("{EVIL_LEGENDARY} ist\naufgewacht!");
+const u8 BattleText_UproarAwake[] = _("AUFRUHR von {STRING 16}\nhält es wach!");
+const u8 BattleText_UproarWoke[] = _("{EVIL_LEGENDARY} wird durch\nAUFRUHR wach!");
+const u8 BattleText_UproarCaused[] = _("{EVIL_LEGENDARY} verursacht\nAUFRUHR!");
+const u8 BattleText_UproarMaking[] = _("{EVIL_LEGENDARY} macht\neinen AUFRUHR!");
+const u8 BattleText_CalmedDown[] = _("{EVIL_LEGENDARY}\nberuhigt sich.");
+const u8 BattleText_UproarCantSleep[] = _("{GOOD_LEGENDARY} kann bei dem\nAUFRUHR nicht schlafen!");
+const u8 BattleText_Stockpiled[] = _("{EVIL_LEGENDARY} HORTET\n{STRING 0}!");
+const u8 BattleText_StockpiledCant[] = _("{EVIL_LEGENDARY} kann nicht\nweiter HORTEN!");
+const u8 BattleText_UproarCantSleep2[] = _("{GOOD_LEGENDARY} kann bei dem\nAUFRUHR nicht schlafen!");
+const u8 BattleText_UproarKeptAwake[] = _("Aber der AUFRUHR hält\n{GOOD_LEGENDARY} wach!");
+const u8 BattleText_StayedAwake[] = _("{GOOD_LEGENDARY} hält sich mit\n{STRING 22} wach!");
+const u8 BattleText_StoringEnergy[] = _("{EVIL_LEGENDARY} speichert\nEnergie!");
+const u8 BattleText_UnleashedEnergy[] = _("{EVIL_LEGENDARY} erzeugt\nEnergie!");
+const u8 BattleText_FatigueConfuse[] = _("{EVIL_LEGENDARY} ist vor\nErschöpfung verwirrt!");
+const u8 BattleText_PickedUpYen[] = _("{STRING 32} hebt\n¥{STRING 0} auf!\p");
+const u8 BattleText_Unaffected[] = _("{GOOD_LEGENDARY} ist\nunversehrt!");
+const u8 BattleText_Transformed[] = _("{EVIL_LEGENDARY} verwandelt\nsich in {STRING 0}!");
+const u8 BattleText_SubMade[] = _("{EVIL_LEGENDARY} setzt einen\nDELEGATOR ein!");
+const u8 BattleText_SubAlready[] = _("{EVIL_LEGENDARY} hat bereits\neinen DELEGATOR!");
+const u8 BattleText_SubTookDamage[] = _("Der DELEGATOR steckt den\nSchlag für {GOOD_LEGENDARY}\lein!\p");
+const u8 BattleText_SubFaded[] = _("DELEGATOR von\n{GOOD_LEGENDARY} lässt nach!\p");
+const u8 BattleText_MustRecharge[] = _("{EVIL_LEGENDARY} muss sich\nwieder aufladen!");
+const u8 BattleText_RageBuilding[] = _("{GOOD_LEGENDARY} verfällt in\nRASEREI!");
+const u8 BattleText_MoveWasDisabled[] = _("{STRING 0} von\n{GOOD_LEGENDARY}\lwurde blockiert!");
+const u8 BattleText_DisabledNoMore[] = _("{EVIL_LEGENDARY} ist nicht\nmehr blockiert!");
+const u8 BattleText_EncoreGot[] = _("{GOOD_LEGENDARY} gibt\neine ZUGABE!");
+const u8 BattleText_EncoreEnded[] = _("ZUGABE von {EVIL_LEGENDARY}\nist beendet!");
+const u8 BattleText_TookAim[] = _("{EVIL_LEGENDARY} zielt\nauf {GOOD_LEGENDARY}!");
+const u8 BattleText_SketchedMove[] = _("{EVIL_LEGENDARY} setzt\nNACHAHMER bei {STRING 0} ein!");
+const u8 BattleText_DestinyBondTake[] = _("{EVIL_LEGENDARY} versucht den\nGegner mit sich zu nehmen!");
+const u8 BattleText_DestinyBondTaken[] = _("{GOOD_LEGENDARY} nimmt\n{EVIL_LEGENDARY} mit sich!");
+const u8 BattleText_ReducedBy[] = _("{STRING 0} von\n{GOOD_LEGENDARY} wird um\l{PLAYER} reduziert!");
+const u8 BattleText_StoleSomething[] = _("{EVIL_LEGENDARY} stiehlt\n{STRING 19} von\l{GOOD_LEGENDARY}!");
+const u8 BattleText_CantEscapeNow[] = _("{GOOD_LEGENDARY} kann\nnicht fliehen!");
+const u8 BattleText_NightmareStart[] = _("{GOOD_LEGENDARY} bekommt\nNACHTMAHR!");
+const u8 BattleText_NightmareLock[] = _("{EVIL_LEGENDARY} ist in\nNACHTMAHR gefangen!");
+const u8 BattleText_CurseLay[] = _("{EVIL_LEGENDARY} nimmt einen\nTeil seiner KP und legt einen\lFLUCH auf {GOOD_LEGENDARY}!");
+const u8 BattleText_CurseAfflict[] = _("{EVIL_LEGENDARY} wurde durch\nFLUCH verletzt!");
+const u8 BattleText_SpikesScattered[] = _("POKéMON-Team von {STRING 37}\nverteilt STACHELN um sich!");
+const u8 BattleText_SpikesHurt[] = _("{STRING 16} wurde durch\nSTACHLER verletzt!");
+const u8 BattleText_IdentifiedPoke[] = _("{EVIL_LEGENDARY} erkennt\n{GOOD_LEGENDARY}!");
+const u8 BattleText_PerishSongFell[] = _("ABGESANG von {EVIL_LEGENDARY}\nsteht bei {STRING 0}!");
+const u8 BattleText_BracedItself[] = _("{EVIL_LEGENDARY} macht sich\nbereit!");
+const u8 BattleText_EnduredHit[] = _("{GOOD_LEGENDARY} setzt\nAUSDAUER ein!");
+const u8 BattleText_MagnitudeCount[] = _("INTENSITÄT {STRING 0}!");
+const u8 BattleText_CutHPMaxATK[] = _("{EVIL_LEGENDARY} nutzt seine\nKP und hebt den ANGR-Wert!");
+const u8 BattleText_CopyStatChanges[] = _("{EVIL_LEGENDARY} kopiert die\nStatusveränderungen\lvon {GOOD_LEGENDARY}!");
+const u8 BattleText_GotFreeFrom[] = _("{EVIL_LEGENDARY} befreit\nsich von {STRING 0}\lvon {GOOD_LEGENDARY}!");
+const u8 BattleText_LeechShed[] = _("{EVIL_LEGENDARY} befreit sich\nvon EGELSAMEN!");
+const u8 BattleText_SpikesBlownAway[] = _("{EVIL_LEGENDARY} blies den\nSTACHLER weg!");
+const u8 BattleText_FledBattle[] = _("{EVIL_LEGENDARY} ist\ngeflüchtet!");
+const u8 BattleText_ForesawAttack[] = _("{EVIL_LEGENDARY} sah eine\nAttacke voraus!");
+const u8 BattleText_TookAttack[] = _("{GOOD_LEGENDARY} wurde von\nder Attacke {STRING 0} getroffen!");
+const u8 BattleText_ChoseDestiny[] = _("{EVIL_LEGENDARY} wählte\n{STRING 17} als Vorhersehung aus!");
+const u8 BattleText_PokeAttack[] = _("Angriff von {STRING 0}!");
+const u8 BattleText_CenterAttention[] = _("{EVIL_LEGENDARY} zieht alle\nAufmerksamkeit auf sich!");
+const u8 BattleText_ChargingPower[] = _("{EVIL_LEGENDARY} lädt\nsich auf!");
+const u8 BattleText_NaturePower[] = _("NATUR-KRAFT wurde zu\n{STRING 17}!");
+const u8 BattleText_StatusNormal[] = _("Status von {EVIL_LEGENDARY}\nwird normal!");
+const u8 BattleText_TormentSubject[] = _("{GOOD_LEGENDARY} wird von\nFOLTERKNECHT unterworfen!");
+const u8 BattleText_TightenFocus[] = _("{EVIL_LEGENDARY} verstärkt\nseinen Fokus!");
+const u8 BattleText_TauntFell[] = _("{GOOD_LEGENDARY} fällt auf\nVERHÖHNER herein!");
+const u8 BattleText_ReadyToHelp[] = _("{EVIL_LEGENDARY} will\n{GOOD_LEGENDARY} helfen!");
+const u8 BattleText_SwitchedItems[] = _("{EVIL_LEGENDARY} tauscht\nItems mit anderem PKMN!");
+const u8 BattleText_Obtained1[] = _("{EVIL_LEGENDARY} erhält\n{STRING 0}.");
+const u8 BattleText_Obtained2[] = _("{GOOD_LEGENDARY} erhält\n{PLAYER}.");
+const u8 BattleText_Obtained3[] = _("{EVIL_LEGENDARY} erhält\n{STRING 0}.\p{GOOD_LEGENDARY} erhält\n{PLAYER}.");
+const u8 BattleText_CopiedObject[] = _("{EVIL_LEGENDARY}\nkopiert {STRING 22} von\l{GOOD_LEGENDARY}!");
+const u8 BattleText_WishMade[] = _("{EVIL_LEGENDARY} spricht einen\nWUNSCHTRAUM aus!");
+const u8 BattleText_WishTrue[] = _("WUNSCHTRAUM von\n{STRING 0} erfüllt sich!");
+const u8 BattleText_PlantedRoots[] = _("{EVIL_LEGENDARY} pflanzt seine\nWurzeln!");
+const u8 BattleText_AbsorbNutrients[] = _("{EVIL_LEGENDARY} nimmt über\nseine Wurzeln Nährstoffe auf!");
+const u8 BattleText_AnchoredItself[] = _("{GOOD_LEGENDARY}\nverankert sich mit seinen Wurzeln!");
+const u8 BattleText_DrowsyMade[] = _("{EVIL_LEGENDARY} macht\n{GOOD_LEGENDARY} schläfrig!");
+const u8 BattleText_KnockedOffItem[] = _("{EVIL_LEGENDARY}\nentreißt {STRING 19} von\l{GOOD_LEGENDARY}!");
+const u8 BattleText_AbilitySwap[] = _("{EVIL_LEGENDARY} tauscht die\nFähigkeiten mit einem PKMN!");
+const u8 BattleText_SealedMove[] = _("{EVIL_LEGENDARY} versiegelt\ndie Attacke/n des Gegners!");
+const u8 BattleText_GrudgeBear[] = _("{EVIL_LEGENDARY} möchte, dass\nder Gegner ein NACHSPIEL erträgt!");
+const u8 BattleText_GrudgeLosePP[] = _("{STRING 0} von\n{EVIL_LEGENDARY} hat aufgrund\lvon NACHSPIEL alle AP verloren!");
+const u8 BattleText_ShroudedItself[] = _("{EVIL_LEGENDARY} verhüllt sich\nselbst in {STRING 17}!");
+const u8 BattleText_MagicCoatBounce[] = _("{STRING 17} von\n{EVIL_LEGENDARY} prallte am\lMAGIEMANTEL ab!");
+const u8 BattleText_AwaitMove[] = _("{EVIL_LEGENDARY} wartet auf\neine gegnerische Attacke!");
+const u8 BattleText_SnatchedMove[] = _("{GOOD_LEGENDARY} ÜBERNAHM\nAttacke von {STRING 16}!");
+const u8 BattleText_ElecWeakened[] = _("Die Stärke der Elektrizität\nwurde geschwächt!");
+const u8 BattleText_FireWeakened[] = _("Die Stärke des Feuers\nwurde geschwächt!");
+const u8 BattleText_FoundOne[] = _("{EVIL_LEGENDARY} hat 1\n{STRING 19} gefunden!");
+const u8 BattleText_SoothingAroma[] = _("Ein wohltuendes Aroma\nbreitet sich aus!");
+const u8 BattleText_CantUseItems[] = _("Hier können Items nicht eingesetzt\nwerden.{PAUSE 64}");
+const u8 BattleText_UnknownString2[] = _("Für {STRING 16} war\n{STRING 19} {STRING 0}");
+const u8 BattleText_HustleUse[] = _("{STRING 16} setzt\n{STRING 19} ein, um zu drängeln!");
+const u8 BattleText_LostFocus[] = _("{EVIL_LEGENDARY} hat seinen\nFokus verloren und kann\lnicht angreifen!");
+const u8 BattleText_DraggedOut[] = _("{GOOD_LEGENDARY} wurde\nauserwählt!\p");
+const u8 BattleText_BrokeWall[] = _("Die Mauer brach zusammen!");
+const u8 BattleText_NoEffect[] = _("Es ist wirkungslos!");
+const u8 BattleText_NoMovesLeft[] = _("{STRING 15} hat keine\nAttacken mehr übrig!\p");
+const u8 BattleText_MoveIsDisabled[] = _("{STRING 17} von\n{STRING 15} ist blockiert!\p");
+const u8 BattleText_TormentNoUse[] = _("{STRING 15} kann\naufgrund von FOLTERKNECHT\pdie Attacke nicht 2-mal\nhintereinander einsetzen!");
+const u8 BattleText_TauntNoUse[] = _("{STRING 15} kann\n{STRING 17} nach VERHÖHNER\lnicht einsetzen!\p");
+const u8 BattleText_SealedNoUse[] = _("{STRING 15} kann die ver-\nsiegelte Attacke {STRING 17}\lnicht einsetzen!\p");
+const u8 BattleText_RainMade[] = _("{STRING 23} von\n{STRING 16} lässt\les regnen!");
+const u8 BattleText_SpeedRisen[] = _("{STRING 23} von\n{STRING 16} erhöht\lseine INIT.!");
+const u8 BattleText_ProtectedBy[] = _("{GOOD_LEGENDARY} wurde durch\n{STRING 22} geschützt!");
+const u8 BattleText_PreventedBy[] = _("{STRING 22} von\n{GOOD_LEGENDARY} hindert\p{EVIL_LEGENDARY} daran,\n{STRING 17} einzusetzen!");
+const u8 BattleText_HPRestoredUsing[] = _("{GOOD_LEGENDARY} füllt KP mit\nHilfe von {STRING 22} auf!");
+const u8 BattleText_MadeUseless[] = _("{STRING 22} von\n{GOOD_LEGENDARY} hebt die\lWirkung von {STRING 17} auf!");
+const u8 BattleText_MadeType[] = _("{STRING 22} von\n{GOOD_LEGENDARY} macht es zu\leinem {STRING 0}-Typ!");
+const u8 BattleText_PreventedPara[] = _("{STRING 22} von\n{STRING 14} verhindert\leine Paralyse!");
+const u8 BattleText_PreventedRomance[] = _("{STRING 22} von\n{GOOD_LEGENDARY} verhindert\leine Romanze!");
+const u8 BattleText_PreventedPoison[] = _("{STRING 22} von\n{STRING 14} verhindert\leine Vergiftung!");
+const u8 BattleText_PreventedConfusion[] = _("{STRING 22} von\n{GOOD_LEGENDARY} verhindert\lVerwirrung!");
+const u8 BattleText_RaisedFirePower[] = _("{STRING 22} von\n{GOOD_LEGENDARY} erhöht die\lFEUER-Kraft!");
+const u8 BattleText_AnchorsItself[] = _("{GOOD_LEGENDARY} verankert\nsich mit Hilfe von {STRING 22}!");
+const u8 BattleText_CutsAttack[] = _("{STRING 23} von\n{STRING 16} vermindert\lANGRIFF von {GOOD_LEGENDARY}!");
+const u8 BattleText_PreventedStatLoss[] = _("{STRING 23} von\n{STRING 16} verhindert\lStatusveränderungen!");
+const u8 BattleText_HurtOther[] = _("{STRING 22} von\n{GOOD_LEGENDARY} verletzt\l{EVIL_LEGENDARY}!");
+const u8 BattleText_Traced[] = _("FÄHRTE von\n{STRING 16}\perkennt {PLAYER}\nvon {STRING 0}!");
+const u8 BattleText_PreventedBurn[] = _("{STRING 24} von\n{STRING 14} verhindert\lVerbrennung!");
+const u8 BattleText_BlocksOther[] = _("{STRING 22} von\n{GOOD_LEGENDARY} blockiert\l{STRING 17}!");
+const u8 BattleText_BlocksOther2[] = _("{STRING 23} von\n{STRING 16} blockiert\l{STRING 17}!");
+const u8 BattleText_RestoredHPByItem[] = _("{STRING 21} von\n{EVIL_LEGENDARY} füllt\leinige KP auf!");
+const u8 BattleText_WhipSandstorm[] = _("{STRING 23} von\n{STRING 16} entfacht\leinen Sandsturm!");
+const u8 BattleText_SunIntensified[] = _("{STRING 23} von\n{STRING 16} intensiviert\ldie Sonnenstrahlen!");
+const u8 BattleText_PreventedLoss[] = _("{STRING 23} von\n{STRING 16} verhindert \lden Verlust von {STRING 0}!");
+const u8 BattleText_InfatuatedPoke[] = _("{EVIL_LEGENDARY} ist vernarrt\nin {STRING 22} von\l{GOOD_LEGENDARY}!");
+const u8 BattleText_MadeIneffective[] = _("{STRING 22} von\n{GOOD_LEGENDARY} macht\l{STRING 17} wirkungslos!");
+const u8 BattleText_CuredProblem[] = _("{STRING 23} von\n{STRING 16} heilte sein\lProblem mit {STRING 0}!");
+const u8 BattleText_OozeSuckup[] = _("Es saugte\nKLOAKENSOSSE auf!");
+const u8 BattleText_Transformed2[] = _("{STRING 16}\nverwandelte sich!");
+const u8 BattleText_TookAttack2[] = _("{STRING 22} von\n{GOOD_LEGENDARY} übernahm\lden Angriff!");
+const u8 BattleText_PreventedSwitch[] = _("{STRING 20} von\n{STRING 0} verhindert\pWechsel!\p");
+const u8 BattleText_PreventedOther[] = _("{STRING 22} von\n{GOOD_LEGENDARY} macht\p{STRING 0} von\n{STRING 16} wirkungslos!");
+const u8 BattleText_MadeIneffective2[] = _("{STRING 23} von\n{STRING 16} machte\les wirkungslos!");
+const u8 BattleText_PreventedFlinching[] = _("{STRING 24} von\n{STRING 14} verhindert\lein Zurückschrecken!");
+const u8 BattleText_PreventedOther2[] = _("{STRING 21} von\n{EVIL_LEGENDARY} macht\p{STRING 22} von\n{GOOD_LEGENDARY} wirkungslos!");
+const u8 BattleText_CuredOfProblem[] = _("{STRING 23} von\n{STRING 16} heilte sein\lProblem mit {STRING 0}!");
+const u8 BattleText_NoEffectOn[] = _("{STRING 23} von\n{STRING 16} hat keine\lWirkung auf {STRING 14}!");
+const u8 BattleText_Sharply[] = _("steigt stark!");
+const u8 BattleText_Rose[] = _("steigt.");
+const u8 BattleText_Harshly[] = _("sinkt stark!");
+const u8 BattleText_Fell[] = _("sinkt.");
+const u8 BattleText_UnknownString7[] = _("{STRING 0} von\n{EVIL_LEGENDARY} {PLAYER}");
+const u8 BattleText_UnknownString3[] = _("{STRING 0} von\n{GOOD_LEGENDARY} {PLAYER}");
+const u8 BattleText_UnknownString4[] = _("{STRING 19}: {STRING 0} von\n{STRING 16} {PLAYER}");
+const u8 BattleText_UnknownString5[] = _("{STRING 0} von\n{EVIL_LEGENDARY} {PLAYER}");
+const u8 BattleText_UnknownString6[] = _("{STRING 0} von\n{GOOD_LEGENDARY} {PLAYER}");
+const u8 BattleText_StatNoHigher[] = _("Status von {EVIL_LEGENDARY}\nkann nicht weiter erhöht werden!");
+const u8 BattleText_StatNoLower[] = _("Status von {GOOD_LEGENDARY}\nkann nicht weiter sinken!");
+const u8 BattleText_Critical[] = _("Ein Volltreffer!");
+const u8 BattleText_GrandSlam[] = _("Ein K.O.-Treffer!");
+const u8 BattleText_MoveForget123[] = _("{PAUSE 32}1, {PAUSE 15}2 und...{PAUSE 15} ...{PAUSE 15} ...{PAUSE 15}\n{PAUSE 15}{PLAY_SE 0x38 0x00}Schwupp!\p");
+const u8 BattleText_MoveForgetAnd[] = _("Und...\p");
+const u8 BattleText_CantForgetHM[] = _("VM-Attacken können jetzt \nnicht vergessen werden.\p");
+const u8 BattleText_NotEffective[] = _("Das ist nicht sehr effektiv...");
+const u8 BattleText_SuperEffective[] = _("Das ist sehr effektiv!");
+const u8 BattleText_GotAwaySafely[] = _("{PLAY_SE 0x11 0x00}Du bist entkommen!\p");
+const u8 BattleText_FledUsingItem[] = _("{PLAY_SE 0x11 0x00}{EVIL_LEGENDARY} floh\ndurch Einsatz von {STRING 19}!\p");
+const u8 BattleText_FledUsingOther[] = _("{PLAY_SE 0x11 0x00}{EVIL_LEGENDARY} floh\ndurch Einsatz von {STRING 21}!\p");
+const u8 BattleText_FledWild[] = _("{PLAY_SE 0x11 0x00}Wildes {STRING 0} floh!");
+const u8 BattleText_PlayerDefeatedTrainer[] = _("Spieler besiegte\n{STRING 29}!");
+const u8 BattleText_PlayerDefeatedTrainers[] = _("Spieler besiegte\n{STRING 30} und {STRING 29}!");
+const u8 BattleText_PlayerLostTrainer[] = _("Spieler verlor gegen\n{STRING 29}!");
+const u8 BattleText_PlayerLostTrainers[] = _("Spieler verlor gegen\n{STRING 30} und {STRING 29}!");
+const u8 BattleText_PlayerTiedTrainer[] = _("Patt zwischen Spieler und\n{STRING 29}!");
+const u8 BattleText_PlayerTiedTrainers[] = _("Patt zwischen Spieler, {STRING 30}\nund {STRING 29}!");
+const u8 BattleText_FledSingle[] = _("{PLAY_SE 0x11 0x00}{STRING 29} floh!");
+const u8 BattleText_FledDouble[] = _("{PLAY_SE 0x11 0x00}{STRING 29} und\n{STRING 30} flohen!");
+const u8 BattleText_NoRunning[] = _("Du kannst aus TRAINER-Kämpfen\nnicht fliehen!\p");
+const u8 BattleText_CantEscape2[] = _("Flucht unmöglich!\p");
+const u8 BattleText_BirchDontLeaveMe[] = _("PROF. BIRK: Du... Du kannst mich doch\nnicht einfach im Stich lassen!\p");
+const u8 BattleText_Nothing[] = _("Nichts geschieht!");
+const u8 BattleText_Failed[] = _("Es schlug fehl!");
+const u8 BattleText_HurtItself[] = _("Es hat sich vor Verwirrung\nselbst verletzt!");
+const u8 BattleText_MirrorFail[] = _("Der SPIEGELTRICK schlug fehl!");
+const u8 BattleText_RainStart[] = _("Es fängt an zu regnen!");
+const u8 BattleText_PourStart[] = _("Ein Wolkenbruch!");
+const u8 BattleText_RainCont1[] = _("Es regnet weiter.");
+const u8 BattleText_PourCont[] = _("Der Wolkenbruch hält an.");
+const u8 BattleText_RainStop[] = _("Es hat aufgehört zu regnen.");
+const u8 BattleText_SandBrewed[] = _("Ein Sandsturm kommt auf!");
+const u8 BattleText_SandRages[] = _("Der Sandsturm tobt.");
+const u8 BattleText_SandSubsided[] = _("Der Sandsturm legt sich.");
+const u8 BattleText_SunBright[] = _("Das Sonnenlicht wird stärker!");
+const u8 BattleText_SunStrong[] = _("Gleißendes Sonnenlicht!");
+const u8 BattleText_SunFaded[] = _("Das Sonnenlicht lässt nach!");
+const u8 BattleText_HailStart[] = _("Es fängt an zu hageln!");
+const u8 BattleText_HailCont[] = _("Es hagelt!");
+const u8 BattleText_HailStop[] = _("Es hat aufgehört zu hageln.");
+const u8 BattleText_SpitUpFail[] = _("Aber es konnte nichts\nENTFESSELN!");
+const u8 BattleText_SwallowFail[] = _("Aber es konnte nichts\nVERZEHREN!");
+const u8 BattleText_WindHeatWave[] = _("Der Wind wurde zu einer\nHITZEWELLE!");
+const u8 BattleText_StatElim[] = _("Alle Statusveränderungen wurden\nentfernt!");
+const u8 BattleText_CoinScatter[] = _("Es liegen überall Münzen verstreut!");
+const u8 BattleText_SubWeak[] = _("Zu schwach, um einen DELEGATOR\neinzusetzen!");
+const u8 BattleText_PainSplit[] = _("Die Kontrahenten teilen\nihr Leid!");
+const u8 BattleText_BellChime[] = _("Eine Glocke läutet!");
+const u8 BattleText_PerishSong[] = _("Alle betroffenen POKéMON werden\nin 3 Runden K.O. gehen!");
+const u8 BattleText_NoPP1[] = _("Es sind keine AP mehr für\ndiese Attacke übrig!\p");
+const u8 BattleText_NoPP2[] = _("Aber es waren keine AP mehr\nfür diese Attacke übrig!");
+const u8 BattleText_IgnoredOrdersSLP[] = _("{EVIL_LEGENDARY} ignoriert die\nBefehle. Es schläft!");
+const u8 BattleText_IgnoredOrders[] = _("{EVIL_LEGENDARY} ignoriert den\nBefehl!");
+const u8 BattleText_BeganNap[] = _("{EVIL_LEGENDARY} macht\nein Nickerchen!");
+const u8 BattleText_LoafingAround[] = _("{EVIL_LEGENDARY} faulenzt!");
+const u8 BattleText_WontObey[] = _("{EVIL_LEGENDARY} ist\nungehorsam!");
+const u8 BattleText_TurnedAway[] = _("{EVIL_LEGENDARY} wendet\nsich ab!");
+const u8 BattleText_NotNotice[] = _("{EVIL_LEGENDARY} gibt vor,\nnichts zu bemerken!");
+const u8 BattleText_WillSwitch[] = _("Als Nächstes wird {PLAYER} von\n{STRING 25} {STRING 26} eingesetzt.\pWird {STRING 32} das\nPOKéMON wechseln?");
+const u8 BattleText_LearnedMove2[] = _("{EVIL_LEGENDARY} hat\n{STRING 0} gelernt!");
+const u8 BattleText_PlayerDefeatedTrainer2[] = _("Spieler besiegte\n{STRING 25} {STRING 26}!\p");
+const u8 BattleText_CreptCloser[] = _("{STRING 32} schleicht sich näher an\n{STR_VAR_2} heran!");
+const u8 BattleText_CantGetCloser[] = _("{STRING 32} kann nicht näher herangehen!");
+const u8 BattleText_WatchingCarefully[] = _("{STR_VAR_2} beobachtet\nalles aufmerksam!");
+const u8 BattleText_CuriousAbout[] = _("{STR_VAR_2} ist\nneugierig auf {STRING 0}!");
+const u8 BattleText_EnthralledBy[] = _("{STR_VAR_2} ist begeistert\nvon {STRING 0}!");
+const u8 BattleText_IgnoredThing[] = _("{STR_VAR_2} ignoriert\n{STRING 0} völlig!");
+const u8 BattleText_ThrewBlock[] = _("{STRING 32} wirft {STR_VAR_2} einen\n{POKEBLOCK} zu!");
+const u8 BattleText_SafariOver[] = _("{PLAY_SE 0x49 0x00}ANSAGE: Du hast keine\nSAFARIBÄLLE mehr! Game over!\p");
+const u8 BattleText_WildAppeared1[] = _("Ein wildes {STR_VAR_2} erscheint!\p");
+const u8 BattleText_WildAppeared2[] = _("Ein wildes {STR_VAR_2} erscheint!\p");
+const u8 BattleText_WildAppeared3[] = _("Ein wildes {STR_VAR_2} erscheint!{PAUSE 127}");
+const u8 BattleText_WildDoubleAppeared[] = _("Ein wildes {KUN} und\nein wildes {STR_VAR_2} erscheinen!\p");
+const u8 BattleText_SingleWantToBattle1[] = _("Eine Herausforderung von\n{STRING 25} {STRING 26}!\p");
+const u8 BattleText_SingleWantToBattle2[] = _("Eine Herausforderung von\n{STRING 29}!");
+const u8 BattleText_DoubleWantToBattle[] = _("{STRING 29} und {STRING 30}\nmöchten kämpfen!");
+const u8 BattleText_SentOutSingle1[] = _("{STR_VAR_2} wird von\n{STRING 25} {STRING 26} in den\lKampf geschickt!");
+const u8 BattleText_SentOutDouble1[] = _("{STR_VAR_2} und {KUN}\nwerden von\p{STRING 25} {STRING 26}\nin den Kampf geschickt!");
+const u8 BattleText_SentOutSingle2[] = _("{STRING 0} wird von\n{STRING 25} {STRING 26}\lin den Kampf geschickt!");
+const u8 BattleText_SentOutSingle3[] = _("{STRING 29} schickt\n{STR_VAR_2} in den Kampf!");
+const u8 BattleText_SentOutDouble2[] = _("{STRING 29} schickt\n{STR_VAR_2} und {KUN}!");
+const u8 BattleText_SentOutDouble3[] = _("{STRING 29} schickt\n{VERSION}!\p{STRING 30} schickt\n{GOOD_TEAM}!");
+const u8 BattleText_SentOutSingle4[] = _("{STRING 29} schickt\n{STRING 0}!");
+const u8 BattleText_SentOutSingle5[] = _("{STRING 31} schickt\n{STRING 0}!");
+const u8 BattleText_SentOutSingle6[] = _("Los! {STR_VAR_1}!");
+const u8 BattleText_SentOutDouble4[] = _("Los! {STR_VAR_1} und\n{STR_VAR_3}!");
+const u8 BattleText_SentOutSingle7[] = _("Los! {STRING 0}!");
+const u8 BattleText_SentOutSingle8[] = _("Du schaffst es! {STRING 0}!");
+const u8 BattleText_SentOutSingle9[] = _("Streng dich an, {STRING 0}!");
+const u8 BattleText_SentOutSingle10[] = _("Mach es fertig!\nLos, {STRING 0}!");
+const u8 BattleText_SentOutSingle11[] = _("{STRING 28} schickt\n{EVIL_TEAM}!\pLos! {RIVAL}!");
+const u8 BattleText_ComeBackSingle1[] = _("{STRING 0}, genug!\nKomm zurück!");
+const u8 BattleText_ComeBackSingle2[] = _("{STRING 0}, komm zurück!");
+const u8 BattleText_ComeBackSingle3[] = _("{STRING 0}, O.K.!\nKomm zurück!");
+const u8 BattleText_ComeBackSingle4[] = _("{STRING 0}, gut!\nKomm zurück!");
+const u8 BattleText_WithdrewPoke1[] = _("{STRING 0} wurde\nvon {STRING 25} {STRING 26}\lzurückgerufen!");
+const u8 BattleText_WithdrewPoke2[] = _("{STRING 29} ruft\n{STRING 0} zurück!");
+const u8 BattleText_WithdrewPoke3[] = _("{STRING 31} ruft\n{STRING 0} zurück!");
+const u8 BattleText_Wild[] = _(" (Wild)");
+const u8 BattleText_Foe[] = _(" (Gegner)");
+const u8 BattleText_Foe2[] = _("Gegner");
+const u8 BattleText_Ally[] = _("Anwender");
+const u8 BattleText_Foe3[] = _("Gegner");
+const u8 BattleText_Ally2[] = _("Anwender");
+const u8 BattleText_Foe4[] = _("Gegner");
+const u8 BattleText_Ally3[] = _("Anwender");
+const u8 BattleText_OpponentUsedMove[] = _("{EVIL_LEGENDARY} setzt\n{PLAYER} ein!");
+const u8 BattleText_Exclamation2[] = _("");
+const u8 BattleText_Exclamation3[] = _("");
+const u8 BattleText_Exclamation4[] = _("");
+const u8 BattleText_Exclamation5[] = _("");
+const u8 BattleText_Exclamation[] = _("");
+const u8 BattleStatText_HP[] = _("KP");
+const u8 BattleStatText_Attack[] = _("ANGRIFF");
+const u8 BattleStatText_Defense[] = _("VERT.");
+const u8 BattleStatText_Speed[] = _("INIT.");
+const u8 BattleStatText_SpAtk[] = _("SP.ANG.");
+const u8 BattleStatText_SpDef[] = _("SP.VER.");
+const u8 BattleStatText_Accuracy[] = _("GENAUIGKEIT");
+const u8 BattleStatText_Evasion[] = _("FLUCHTWERT");
+const u8 ContestStatText_TooSpicy[] = _("zu scharf!");
+const u8 ContestStatText_TooDry[] = _("zu trocken!");
+const u8 ContestStatText_TooSweet[] = _("zu süß!");
+const u8 ContestStatText_TooBitter[] = _("zu bitter!");
+const u8 ContestStatText_TooSour[] = _("zu sauer!");
+const u8 BattleText_Used1[] = _("{STRING 32} setzt\n{STRING 19} ein!");
+const u8 BattleText_TutorialUsed[] = _("HEIKO setzt\n{STRING 19} ein!");
+const u8 BattleText_Used2[] = _("{STRING 19} wird von\n{STRING 25} {STRING 26} eingesetzt!");
+const u8 BattleText_BlockBall[] = _("Der TRAINER hat den BALL abgeblockt!");
+const u8 BattleText_DontBeAThief[] = _("Sei kein Dieb!");
+const u8 BattleText_DodgeBall[] = _("Es ist dem BALL ausgewichen! Dieses\nPOKéMON kann nicht gefangen werden!");
+const u8 BattleText_MissPoke[] = _("Du hast das POKéMON verfehlt!");
+const u8 BattleText_BallBrokeOhNo[] = _("Mist!\nDas POKéMON hat sich befreit!");
+const u8 BattleText_BallBrokeAppeared[] = _("Oh!\nFast hätte es geklappt!");
+const u8 BattleText_BallBrokeAlmost[] = _("Mist!\nDas war knapp!");
+const u8 BattleText_BallBrokeSoClose[] = _("Verflixt!\nEs hätte beinahe geklappt!");
+const u8 BattleText_BallCaught1[] = _("Toll!\n{STR_VAR_2} wurde gefangen!{UNKNOWN_A}{PLAY_BGM 0x60 0x01}\p");
+const u8 BattleText_BallCaught2[] = _("Toll!\n{STR_VAR_2} wurde gefangen!{UNKNOWN_A}{PLAY_BGM 0x60 0x01}{PAUSE 127}");
+const u8 BattleText_GiveNickname[] = _("Möchtest du dem {STR_VAR_2}\neinen Spitznamen geben?");
+const u8 BattleText_SentToPC[] = _("{STR_VAR_2} wurde auf\n{STRING 35} PC übertragen.");
+const u8 BattleText_Someone[] = _("einen");
+const u8 BattleText_Lanette[] = _("LANETTES");
+const u8 BattleText_AddedToDex[] = _("Für {STR_VAR_2} wurde ein Eintrag\nim POKéDEX angelegt.\p");
+const u8 BattleText_Raining[] = _("Es regnet.");
+const u8 BattleText_Sandstorm[] = _("Ein Sandsturm tobt.");
+const u8 BattleText_BoxFull[] = _("Die BOXEN sind voll!\nDu kannst keines mehr fangen!\p");
+const u8 BattleText_EnigmaBerry[] = _("ENIGMABEERE");
+const u8 BattleText_Berry[] = _("{STR_VAR_1}BEERE");
+const u8 BattleText_CuredParalysis[] = _("{STRING 19} von\n{STRING 16}\lheilte die Paralyse!");
+const u8 BattleText_CuredPoison[] = _("{STRING 19} von\n{STRING 16}\lheilte die Vergiftung!");
+const u8 BattleText_CuredBurn[] = _("{STRING 19} von\n{STRING 16}\lheilte die Verbrennung!");
+const u8 BattleText_CuredFreeze[] = _("{STRING 19} von\n{STRING 16} taute es auf!");
+const u8 BattleText_CuredSleep[] = _("{STRING 19} von\n{STRING 16} \lweckte es auf!");
+const u8 BattleText_CuredConfusion[] = _("{STRING 19} von\n{STRING 16}\lhebt die Verwirrung auf!");
+const u8 BattleText_CuredStatus[] = _("{STRING 19} von\n{STRING 16} \lheilte sein {STRING 0}-Problem!");
+const u8 BattleText_NormalizedStatus[] = _("{STRING 19} von\n{STRING 16} normalisierte\lseine Statuswerte!");
+const u8 BattleText_RestoredHealth[] = _("{STRING 19} füllte\nKP von {STRING 16} auf!");
+const u8 BattleText_RestoredPP[] = _("{STRING 19} von\n{STRING 16} füllte AP von\l{STRING 0} auf!");
+const u8 BattleText_RestoredStatus[] = _("{STRING 19} von\n{STRING 16}\pstellte seine\nStatuswerte wieder her!");
+const u8 BattleText_RestoredHPLittle[] = _("{STRING 19} von\n{STRING 16}\lfüllte einige KP auf!");
+const u8 BattleText_ChoiceBand[] = _("{STRING 19} erlaubt\nnur den Einsatz von {STRING 17}!\p");
+const u8 BattleText_FocusSash[] = _("{GOOD_LEGENDARY} hält\nmit Hilfe von\l{STRING 19} durch!");
+const u8 BattleText_Terminator2[] = _("");
+const u8 BattleText_WallyBall[] = _("Nun muss man einen BALL werfen, oder?\nIch... Ich werde mein Bestes geben!");
+const u8 BattleText_StartEvo[] = _("Hey?\n{STR_VAR_1} entwickelt sich!");
+const u8 BattleText_FinishEvo[] = _("Glückwunsch! Dein {STR_VAR_1}\nwurde zu {STR_VAR_2}!{UNKNOWN_A}\p");
+const u8 BattleText_StopEvo[] = _("Hm? Die Entwicklung\nwurde abgebrochen!\p");
+const u8 BattleText_OtherMenu[] = _("Was soll\n{STRING 15} tun?");
+const u8 BattleText_PlayerMenu[] = _("Was wird {STRING 32}\ntun?");
+const u8 BattleText_WallyMenu[] = _("Was wird\nHEIKO tun?");
+const u8 BattleText_LinkStandby[] = _("{PAUSE 16}Verbindung...");
+const u8 BattleText_MenuOptions[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW SKY_BLUE LIGHT_BLUE WHITE2}KAMPF{CLEAR_TO 46}BEUTEL\nPOKéMON{CLEAR_TO 46}FLUCHT");
+const u8 BattleText_MenuOptionsSafari[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW SKY_BLUE LIGHT_BLUE WHITE2}BALL{CLEAR_TO 46}{POKEBLOCK}\nNÄHER{CLEAR_TO 46}FLUCHT");
+const u8 BattleText_PP[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW SKY_BLUE LIGHT_BLUE WHITE2}AP\nTYP/");
+const u8 BattleText_Format[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW SKY_BLUE LIGHT_BLUE WHITE2}");
+const u8 BattleText_ForgetMove[] = _("{COLOR_HIGHLIGHT_SHADOW SKY_BLUE LIGHT_BLUE WHITE2}{PALETTE 5}Welche Attacke soll vergessen werden?");
+const u8 BattleText_YesNo[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW SKY_BLUE LIGHT_BLUE WHITE2}Ja\nNein");
+const u8 BattleText_SwitchWhich[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW SKY_BLUE LIGHT_BLUE WHITE2}\nWohin?");
+const u8 BattleText_Format2[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW SKY_BLUE LIGHT_BLUE WHITE2}");
+const u8 BattleText_RightArrow[] = _("{RIGHT_ARROW}");
+const u8 BattleText_Plus[] = _("+");
+const u8 BattleText_Dash[] = _("-");
+const u8 BattleText_HP[] = _("KP ");
+const u8 BattleText_Attack[] = _("ANGR. ");
+const u8 BattleText_Defense[] = _("VERT.");
+const u8 BattleText_SpAtk[] = _("SP.ANG.");
+const u8 BattleText_SpDef[] = _("SP.VER.");
+const u8 BattleText_SafariBalls[] = _("{HIGHLIGHT RED}SAFARIBÄLLE");
+const u8 BattleText_SafariBallsLeft[] = _("{HIGHLIGHT RED}Übrig: ");
+const u8 BattleText_HighlightRed[] = _("{HIGHLIGHT RED}");
+const u8 BattleText_Sleep[] = _("Schlaf");
+const u8 BattleText_PoisonStatus[] = _("Gift");
+const u8 BattleText_Burn[] = _("Verbrennung");
+const u8 BattleText_Paralysis[] = _("Paralyse");
+const u8 BattleText_IceStatus[] = _("Eis");
+const u8 BattleText_Confusion[] = _("Verwirrung");
+const u8 BattleText_Love[] = _("Liebe");
+const u8 BattleText_Format3[] = _(" und ");
+const u8 BattleText_Format4[] = _(", ");
+const u8 BattleText_Format5[] = _(" ");
+const u8 BattleText_Format6[] = _("\l");
+const u8 BattleText_Format7[] = _("\n");
+const u8 BattleText_Format8[] = _("sind");
+const u8 BattleText_Format9[] = _("sind");
+const u8 gBadEggNickname[] = _("Schl. EI");
+const u8 BattleText_Wally[] = _("HEIKO");
+const u8 BattleText_Win[] = _("{HIGHLIGHT TRANSPARENT}Sieg");
+const u8 BattleText_Loss[] = _("{HIGHLIGHT TRANSPARENT}Ndrl.");
+const u8 BattleText_Tie[] = _("{HIGHLIGHT TRANSPARENT}Patt");
+const u8 BattleText_Format10[] = _(" ist");
+const u8 BattleText_Format11[] = _("");
+const u8 BattleText_Normal[] = _("eine NORMALE Att.");
+const u8 BattleText_Fighting[] = _("eine KAMPF-Att.");
+const u8 BattleText_Flying[] = _("eine FLUG-Att.");
+const u8 BattleText_Poison[] = _("eine GIFT-Att.");
+const u8 BattleText_Ground[] = _("eine BODEN-Att.");
+const u8 BattleText_Rock[] = _("eine GESTEINS-Att.");
+const u8 BattleText_Bug[] = _("eine KÄFER-Att.");
+const u8 BattleText_Ghost[] = _("eine GEIST-Att.");
+const u8 BattleText_Steel[] = _("eine STAHL-Att.");
+const u8 BattleText_Typeless[] = _("eine ???-Attacke");
+const u8 BattleText_Fire[] = _("eine FEUER-Att.");
+const u8 BattleText_Water[] = _("eine WASSER-Att.");
+const u8 BattleText_Grass[] = _("eine PFLANZEN-Att.");
+const u8 BattleText_Electric[] = _("eine ELEKTRO-Att.");
+const u8 BattleText_Psychic[] = _("eine PSYCHO-Att.");
+const u8 BattleText_Ice[] = _("eine EIS-Att.");
+const u8 BattleText_Dragon[] = _("eine DRACHEN-Att.");
+const u8 BattleText_Dark[] = _("eine UNLICHT-Att.");
+
+const u8 *const gUnknown_08400F58[] =
+{
+ BattleStatText_HP,
+ BattleStatText_Attack,
+ BattleStatText_Defense,
+ BattleStatText_Speed,
+ BattleStatText_SpAtk,
+ BattleStatText_SpDef,
+ BattleStatText_Accuracy,
+ BattleStatText_Evasion,
+};
+
+const u8 *const gUnknown_08400F78[] =
+{
+ ContestStatText_TooSpicy,
+ ContestStatText_TooDry,
+ ContestStatText_TooSweet,
+ ContestStatText_TooBitter,
+ ContestStatText_TooSour,
+};
+
+const u8 *const gBattleStringsTable[] =
+{
+ BattleText_UnknownString,
+ BattleText_GainExpPoints,
+ BattleText_GrewLevel,
+ BattleText_LearnedMove,
+ BattleText_TryingToLearnMove,
+ BattleText_CantLearnMore,
+ BattleText_DeleteMove,
+ BattleText_DeletedMove,
+ BattleText_StopLearning,
+ BattleText_DidNotLearn,
+ BattleText_LearnedMove2,
+ BattleText_AttackMissed,
+ BattleText_ProtectedItself,
+ BattleText_StatNoHigher,
+ BattleText_AvoidedDamage,
+ BattleText_DoesntAffect,
+ BattleText_AttackingFainted,
+ BattleText_DefendingFainted,
+ BattleText_WinningPrize,
+ BattleText_OutOfUsablePoke,
+ BattleText_WhitedOut,
+ BattleText_PreventEscape,
+ BattleText_HitMulti,
+ BattleText_FellAsleep,
+ BattleText_MadeAsleep,
+ BattleText_DefendingAsleep,
+ BattleText_AttackingAsleep,
+ BattleText_WasntAffected,
+ BattleText_Poisoned,
+ BattleText_Poisoned2,
+ BattleText_PoisonHurt,
+ BattleText_AlreadyPoisoned,
+ BattleText_BadlyPoisoned,
+ BattleText_EnergyDrained,
+ BattleText_Burned,
+ BattleText_Burned2,
+ BattleText_BurnHurt,
+ BattleText_Frozen,
+ BattleText_Frozen2,
+ BattleText_FrozenSolid,
+ BattleText_DefendingDefrosted,
+ BattleText_AttackingDefrosted,
+ BattleText_Defrosted,
+ BattleText_Paralyzed,
+ BattleText_Paralyzed2,
+ BattleText_Paralyzed3,
+ BattleText_AlreadyParalyzed,
+ BattleText_ParalysisHealed,
+ BattleText_DreamEaten,
+ BattleText_AttackingStatNoHigher,
+ BattleText_DefendingStatNoHigher,
+ BattleText_StoppedWorking,
+ BattleText_StoppedWorking2,
+ BattleText_Confused,
+ BattleText_ConfusionSnapOut,
+ BattleText_BecameConfused,
+ BattleText_AlreadyConfused,
+ BattleText_FellLove,
+ BattleText_InLoveWith,
+ BattleText_ImmobilizedBy,
+ BattleText_BlownAway,
+ BattleText_TypeTransform,
+ BattleText_Flinched,
+ BattleText_RegainedHealth,
+ BattleText_HPFull,
+ BattleText_RaisedSpDef,
+ BattleText_RaisedDefense,
+ BattleText_CoveredVeil,
+ BattleText_SafeguardActive,
+ BattleText_SafeguardFaded,
+ BattleText_WentToSleep,
+ BattleText_SpeltHealthy,
+ BattleText_WhipWhirlwind,
+ BattleText_TookSunlight,
+ BattleText_LoweredHead,
+ BattleText_IsGlowing,
+ BattleText_FlewHigh,
+ BattleText_DugHole,
+ BattleText_SqueezedBind,
+ BattleText_TrappedVortex,
+ BattleText_Wrapped,
+ BattleText_Clamped,
+ BattleText_HurtBy,
+ BattleText_FreedFrom,
+ BattleText_KeptGoingCrash,
+ BattleText_MistShroud,
+ BattleText_MistProtect,
+ BattleText_GetPumped,
+ BattleText_HitRecoil,
+ BattleText_ProtectedItself2,
+ BattleText_SandBuffeted,
+ BattleText_HailStricken,
+ BattleText_WasSeeded,
+ BattleText_EvadedAttack,
+ BattleText_HealthSapped,
+ BattleText_FastAsleep,
+ BattleText_WokeUp,
+ BattleText_UproarAwake,
+ BattleText_UproarWoke,
+ BattleText_UproarCaused,
+ BattleText_UproarMaking,
+ BattleText_CalmedDown,
+ BattleText_UproarCantSleep,
+ BattleText_Stockpiled,
+ BattleText_StockpiledCant,
+ BattleText_UproarCantSleep2,
+ BattleText_UproarKeptAwake,
+ BattleText_StayedAwake,
+ BattleText_StoringEnergy,
+ BattleText_UnleashedEnergy,
+ BattleText_FatigueConfuse,
+ BattleText_PickedUpYen,
+ BattleText_Unaffected,
+ BattleText_Transformed,
+ BattleText_SubMade,
+ BattleText_SubAlready,
+ BattleText_SubTookDamage,
+ BattleText_SubFaded,
+ BattleText_MustRecharge,
+ BattleText_RageBuilding,
+ BattleText_MoveWasDisabled,
+ BattleText_MoveIsDisabled,
+ BattleText_DisabledNoMore,
+ BattleText_EncoreGot,
+ BattleText_EncoreEnded,
+ BattleText_TookAim,
+ BattleText_SketchedMove,
+ BattleText_DestinyBondTake,
+ BattleText_DestinyBondTaken,
+ BattleText_ReducedBy,
+ BattleText_StoleSomething,
+ BattleText_CantEscapeNow,
+ BattleText_NightmareStart,
+ BattleText_NightmareLock,
+ BattleText_CurseLay,
+ BattleText_CurseAfflict,
+ BattleText_SpikesScattered,
+ BattleText_SpikesHurt,
+ BattleText_IdentifiedPoke,
+ BattleText_PerishSongFell,
+ BattleText_BracedItself,
+ BattleText_EnduredHit,
+ BattleText_MagnitudeCount,
+ BattleText_CutHPMaxATK,
+ BattleText_CopyStatChanges,
+ BattleText_GotFreeFrom,
+ BattleText_LeechShed,
+ BattleText_SpikesBlownAway,
+ BattleText_FledBattle,
+ BattleText_ForesawAttack,
+ BattleText_TookAttack,
+ BattleText_PokeAttack,
+ BattleText_CenterAttention,
+ BattleText_ChargingPower,
+ BattleText_NaturePower,
+ BattleText_StatusNormal,
+ BattleText_NoMovesLeft,
+ BattleText_TormentSubject,
+ BattleText_TormentNoUse,
+ BattleText_TightenFocus,
+ BattleText_TauntFell,
+ BattleText_TauntNoUse,
+ BattleText_ReadyToHelp,
+ BattleText_SwitchedItems,
+ BattleText_CopiedObject,
+ BattleText_WishMade,
+ BattleText_WishTrue,
+ BattleText_PlantedRoots,
+ BattleText_AbsorbNutrients,
+ BattleText_AnchoredItself,
+ BattleText_DrowsyMade,
+ BattleText_KnockedOffItem,
+ BattleText_AbilitySwap,
+ BattleText_SealedMove,
+ BattleText_SealedNoUse,
+ BattleText_GrudgeBear,
+ BattleText_GrudgeLosePP,
+ BattleText_ShroudedItself,
+ BattleText_MagicCoatBounce,
+ BattleText_AwaitMove,
+ BattleText_SnatchedMove,
+ BattleText_RainMade,
+ BattleText_SpeedRisen,
+ BattleText_ProtectedBy,
+ BattleText_PreventedBy,
+ BattleText_HPRestoredUsing,
+ BattleText_MadeType,
+ BattleText_PreventedPara,
+ BattleText_PreventedRomance,
+ BattleText_PreventedPoison,
+ BattleText_PreventedConfusion,
+ BattleText_RaisedFirePower,
+ BattleText_AnchorsItself,
+ BattleText_CutsAttack,
+ BattleText_PreventedStatLoss,
+ BattleText_HurtOther,
+ BattleText_Traced,
+ BattleText_Sharply,
+ BattleText_Rose,
+ BattleText_Harshly,
+ BattleText_Fell,
+ BattleText_UnknownString7,
+ BattleText_UnknownString3,
+ BattleText_UnknownString5,
+ BattleText_UnknownString6,
+ BattleText_Critical,
+ BattleText_GrandSlam,
+ BattleText_MoveForget123,
+ BattleText_MoveForgetAnd,
+ BattleText_NotEffective,
+ BattleText_SuperEffective,
+ BattleText_GotAwaySafely,
+ BattleText_FledWild,
+ BattleText_NoRunning,
+ BattleText_CantEscape2,
+ BattleText_BirchDontLeaveMe,
+ BattleText_Nothing,
+ BattleText_Failed,
+ BattleText_HurtItself,
+ BattleText_MirrorFail,
+ BattleText_RainStart,
+ BattleText_PourStart,
+ BattleText_RainCont1,
+ BattleText_PourCont,
+ BattleText_RainStop,
+ BattleText_SandBrewed,
+ BattleText_SandRages,
+ BattleText_SandSubsided,
+ BattleText_SunBright,
+ BattleText_SunStrong,
+ BattleText_SunFaded,
+ BattleText_HailStart,
+ BattleText_HailCont,
+ BattleText_HailStop,
+ BattleText_SpitUpFail,
+ BattleText_SwallowFail,
+ BattleText_WindHeatWave,
+ BattleText_StatElim,
+ BattleText_CoinScatter,
+ BattleText_SubWeak,
+ BattleText_PainSplit,
+ BattleText_BellChime,
+ BattleText_PerishSong,
+ BattleText_NoPP1,
+ BattleText_NoPP2,
+ BattleText_Used1,
+ BattleText_TutorialUsed,
+ BattleText_BlockBall,
+ BattleText_DontBeAThief,
+ BattleText_DodgeBall,
+ BattleText_MissPoke,
+ BattleText_BallBrokeOhNo,
+ BattleText_BallBrokeAppeared,
+ BattleText_BallBrokeAlmost,
+ BattleText_BallBrokeSoClose,
+ BattleText_BallCaught1,
+ BattleText_BallCaught2,
+ BattleText_GiveNickname,
+ BattleText_SentToPC,
+ BattleText_AddedToDex,
+ BattleText_Raining,
+ BattleText_Sandstorm,
+ BattleText_CantEscape,
+ BattleText_IgnoredOrdersSLP,
+ BattleText_IgnoredOrders,
+ BattleText_BeganNap,
+ BattleText_LoafingAround,
+ BattleText_WontObey,
+ BattleText_TurnedAway,
+ BattleText_NotNotice,
+ BattleText_WillSwitch,
+ BattleText_CreptCloser,
+ BattleText_CantGetCloser,
+ BattleText_WatchingCarefully,
+ BattleText_CuriousAbout,
+ BattleText_EnthralledBy,
+ BattleText_IgnoredThing,
+ BattleText_ThrewBlock,
+ BattleText_SafariOver,
+ BattleText_CuredParalysis,
+ BattleText_CuredPoison,
+ BattleText_CuredBurn,
+ BattleText_CuredFreeze,
+ BattleText_CuredSleep,
+ BattleText_CuredConfusion,
+ BattleText_CuredStatus,
+ BattleText_RestoredHealth,
+ BattleText_RestoredPP,
+ BattleText_RestoredStatus,
+ BattleText_RestoredHPLittle,
+ BattleText_ChoiceBand,
+ BattleText_FocusSash,
+ BattleText_Terminator2,
+ BattleText_PreventedBurn,
+ BattleText_BlocksOther,
+ BattleText_RestoredHPByItem,
+ BattleText_WhipSandstorm,
+ BattleText_PreventedLoss,
+ BattleText_InfatuatedPoke,
+ BattleText_MadeIneffective,
+ BattleText_CuredProblem,
+ BattleText_OozeSuckup,
+ BattleText_Transformed2,
+ BattleText_ElecWeakened,
+ BattleText_FireWeakened,
+ BattleText_HidUnderwater,
+ BattleText_SprangUp,
+ BattleText_CantForgetHM,
+ BattleText_FoundOne,
+ BattleText_PlayerDefeatedTrainer2,
+ BattleText_SoothingAroma,
+ BattleText_CantUseItems,
+ BattleText_UnknownString2,
+ BattleText_UnknownString4,
+ BattleText_HustleUse,
+ BattleText_MadeUseless,
+ BattleText_SandTombTrapped,
+ BattleText_Terminator,
+ BattleText_BoostedExp,
+ BattleText_SunIntensified,
+ BattleText_GroundMoveNegate,
+ BattleText_WallyBall,
+ BattleText_TookAttack2,
+ BattleText_ChoseDestiny,
+ BattleText_LostFocus,
+ BattleText_UseNext,
+ BattleText_FledUsingItem,
+ BattleText_FledUsingOther,
+ BattleText_DraggedOut,
+ BattleText_PreventedOther,
+ BattleText_NormalizedStatus,
+ BattleText_Used2,
+ BattleText_BoxFull,
+ BattleText_AvoidedAttack,
+ BattleText_MadeIneffective2,
+ BattleText_PreventedFlinching,
+ BattleText_AlreadyBurned,
+ BattleText_StatNoLower,
+ BattleText_BlocksOther2,
+ BattleText_WoreOff,
+ BattleText_RaisedDefenseLittle,
+ BattleText_RaisedSpDefLittle,
+ BattleText_BrokeWall,
+ BattleText_PreventedOther2,
+ BattleText_CuredOfProblem,
+ BattleText_AttackingCantEscape,
+ BattleText_Obtained1,
+ BattleText_Obtained2,
+ BattleText_Obtained3,
+ BattleText_NoEffect,
+ BattleText_NoEffectOn,
+};
+
+// below are lists of battle string enums and NOT pointers to the strings.
+const u16 gMissStrings[] =
+{
+ BATTLE_TEXT_AttackMissed,
+ BATTLE_TEXT_ProtectedItself,
+ BATTLE_TEXT_AvoidedAttack,
+ BATTLE_TEXT_AvoidedDamage,
+ BATTLE_TEXT_GroundMoveNegate,
+};
+
+const u16 gNoEscapeStringIds[] =
+{
+ BATTLE_TEXT_CantEscape2,
+ BATTLE_TEXT_BirchDontLeaveMe,
+ BATTLE_TEXT_PreventEscape,
+ BATTLE_TEXT_CantEscape,
+ BATTLE_TEXT_AttackingCantEscape,
+};
+
+const u16 gMoveWeatherChangeStringIds[] =
+{
+ BATTLE_TEXT_RainStart,
+ BATTLE_TEXT_PourStart,
+ BATTLE_TEXT_Failed,
+ BATTLE_TEXT_SandBrewed,
+ BATTLE_TEXT_SunBright,
+ BATTLE_TEXT_HailStart,
+};
+
+const u16 gSandStormHailContinuesStringIds[] =
+{
+ BATTLE_TEXT_SandRages,
+ BATTLE_TEXT_HailCont,
+};
+
+const u16 gSandStormHailDmgStringIds[] =
+{
+ BATTLE_TEXT_SandBuffeted,
+ BATTLE_TEXT_HailStricken,
+};
+
+const u16 gSandStormHailEndStringIds[] =
+{
+ BATTLE_TEXT_SandSubsided,
+ BATTLE_TEXT_HailStop,
+};
+
+const u16 gRainContinuesStringIds[] =
+{
+ BATTLE_TEXT_RainCont1,
+ BATTLE_TEXT_PourCont,
+ BATTLE_TEXT_RainStop,
+};
+
+const u16 gProtectLikeUsedStringIds[] =
+{
+ BATTLE_TEXT_ProtectedItself2,
+ BATTLE_TEXT_BracedItself,
+ BATTLE_TEXT_Failed,
+};
+
+const u16 gReflectLightScreenSafeguardStringIds[] =
+{
+ BATTLE_TEXT_Failed,
+ BATTLE_TEXT_RaisedDefense,
+ BATTLE_TEXT_RaisedDefenseLittle,
+ BATTLE_TEXT_RaisedSpDef,
+ BATTLE_TEXT_RaisedSpDefLittle,
+ BATTLE_TEXT_CoveredVeil,
+};
+
+const u16 gLeechSeedStringIds[] =
+{
+ BATTLE_TEXT_WasSeeded,
+ BATTLE_TEXT_EvadedAttack,
+ BATTLE_TEXT_DoesntAffect,
+ BATTLE_TEXT_HealthSapped,
+ BATTLE_TEXT_OozeSuckup,
+};
+
+const u16 gRestUsedStringIds[] =
+{
+ BATTLE_TEXT_WentToSleep,
+ BATTLE_TEXT_SpeltHealthy,
+};
+
+const u16 gUproarOverTurnStringIds[] =
+{
+ BATTLE_TEXT_UproarMaking,
+ BATTLE_TEXT_CalmedDown,
+};
+
+const u16 gStockpileUsedStringIds[] =
+{
+ BATTLE_TEXT_Stockpiled,
+ BATTLE_TEXT_StockpiledCant,
+};
+
+const u16 gWokeUpStringIds[] =
+{
+ BATTLE_TEXT_WokeUp,
+ BATTLE_TEXT_UproarWoke,
+};
+
+const u16 gSwallowFailStringIds[] =
+{
+ BATTLE_TEXT_SwallowFail,
+ BATTLE_TEXT_HPFull,
+};
+
+const u16 gUproarAwakeStringIds[] =
+{
+ BATTLE_TEXT_UproarCantSleep2,
+ BATTLE_TEXT_UproarKeptAwake,
+ BATTLE_TEXT_StayedAwake,
+};
+
+const u16 gStatUpStringIds[] =
+{
+ BATTLE_TEXT_UnknownString7,
+ BATTLE_TEXT_UnknownString3,
+ BATTLE_TEXT_AttackingStatNoHigher,
+ BATTLE_TEXT_Terminator2,
+ BATTLE_TEXT_UnknownString4,
+ BATTLE_TEXT_HustleUse,
+};
+
+const u16 gStatDownStringIds[] =
+{
+ BATTLE_TEXT_UnknownString5,
+ BATTLE_TEXT_UnknownString6,
+ BATTLE_TEXT_DefendingStatNoHigher,
+ BATTLE_TEXT_Terminator2,
+};
+
+const u16 gFirstTurnOfTwoStringIds[] =
+{
+ BATTLE_TEXT_WhipWhirlwind,
+ BATTLE_TEXT_TookSunlight,
+ BATTLE_TEXT_LoweredHead,
+ BATTLE_TEXT_IsGlowing,
+ BATTLE_TEXT_FlewHigh,
+ BATTLE_TEXT_DugHole,
+ BATTLE_TEXT_HidUnderwater,
+ BATTLE_TEXT_SprangUp,
+};
+
+const u16 gWrappedStringIds[] =
+{
+ BATTLE_TEXT_SqueezedBind,
+ BATTLE_TEXT_Wrapped,
+ BATTLE_TEXT_TrappedVortex,
+ BATTLE_TEXT_Clamped,
+ BATTLE_TEXT_TrappedVortex,
+ BATTLE_TEXT_SandTombTrapped,
+};
+
+const u16 gMistUsedStringIds[] =
+{
+ BATTLE_TEXT_MistShroud,
+ BATTLE_TEXT_Failed,
+};
+
+const u16 gFocusEnergyUsedStringIds[] =
+{
+ BATTLE_TEXT_GetPumped,
+ BATTLE_TEXT_Failed,
+};
+
+const u16 gTransformUsedStringIds[] =
+{
+ BATTLE_TEXT_Transformed,
+ BATTLE_TEXT_Failed,
+};
+
+const u16 gSubsituteUsedStringIds[] =
+{
+ BATTLE_TEXT_SubMade,
+ BATTLE_TEXT_SubWeak,
+};
+
+const u16 gGotPoisonedStringIds[] =
+{
+ BATTLE_TEXT_Poisoned,
+ BATTLE_TEXT_Poisoned2,
+};
+
+const u16 gGotParalyzedStringIds[] =
+{
+ BATTLE_TEXT_Paralyzed,
+ BATTLE_TEXT_Paralyzed2,
+};
+
+const u16 gFellAsleepStringIds[] =
+{
+ BATTLE_TEXT_FellAsleep,
+ BATTLE_TEXT_MadeAsleep,
+};
+
+const u16 gGotBurnedStringIds[] =
+{
+ BATTLE_TEXT_Burned,
+ BATTLE_TEXT_Burned2,
+};
+
+const u16 gGotFrozenStringIds[] =
+{
+ BATTLE_TEXT_Frozen,
+ BATTLE_TEXT_Frozen2,
+};
+
+const u16 gGotDefrostedStringIds[] =
+{
+ BATTLE_TEXT_AttackingDefrosted,
+ BATTLE_TEXT_Defrosted,
+};
+
+const u16 gKOFailedStringIds[] =
+{
+ BATTLE_TEXT_AttackMissed,
+ BATTLE_TEXT_Unaffected,
+ BATTLE_TEXT_FellLove,
+ BATTLE_TEXT_InfatuatedPoke,
+};
+
+const u16 gLeechSeedDrainStringIds[] =
+{
+ BATTLE_TEXT_EnergyDrained,
+ BATTLE_TEXT_OozeSuckup,
+};
+
+const u16 gSportsUsedStringIds[] =
+{
+ BATTLE_TEXT_ElecWeakened,
+ BATTLE_TEXT_FireWeakened,
+};
+
+const u16 gPartyStatusHealStringIds[] =
+{
+ BATTLE_TEXT_BellChime,
+ BATTLE_TEXT_BellChime,
+ BATTLE_TEXT_BellChime,
+ BATTLE_TEXT_BellChime,
+ BATTLE_TEXT_SoothingAroma,
+};
+
+const u16 gFutureMoveUsedStringIds[] =
+{
+ BATTLE_TEXT_ForesawAttack,
+ BATTLE_TEXT_ChoseDestiny,
+};
+
+const u16 gBallEscapeStringIds[] =
+{
+ BATTLE_TEXT_BallBrokeOhNo,
+ BATTLE_TEXT_BallBrokeAppeared,
+ BATTLE_TEXT_BallBrokeAlmost,
+ BATTLE_TEXT_BallBrokeSoClose,
+};
+
+const u16 gWeatherContinuesStringIds[] =
+{
+ BATTLE_TEXT_Raining,
+ BATTLE_TEXT_Raining,
+ BATTLE_TEXT_Raining,
+ BATTLE_TEXT_Raining,
+ BATTLE_TEXT_Raining,
+ BATTLE_TEXT_Raining,
+ BATTLE_TEXT_Raining,
+ BATTLE_TEXT_Raining,
+ BATTLE_TEXT_Sandstorm,
+ BATTLE_TEXT_Raining,
+ BATTLE_TEXT_Raining,
+ BATTLE_TEXT_Raining,
+ BATTLE_TEXT_SunStrong,
+ BATTLE_TEXT_Raining,
+ BATTLE_TEXT_Raining,
+ BATTLE_TEXT_Raining,
+};
+
+const u16 gInobedientStringIds[] =
+{
+ BATTLE_TEXT_LoafingAround,
+ BATTLE_TEXT_WontObey,
+ BATTLE_TEXT_TurnedAway,
+ BATTLE_TEXT_NotNotice,
+};
+
+const u16 gSafariGetNearStringIds[] =
+{
+ BATTLE_TEXT_CreptCloser,
+ BATTLE_TEXT_CantGetCloser,
+};
+
+const u16 gSafariPokeblockResultStringIds[] =
+{
+ BATTLE_TEXT_CuriousAbout,
+ BATTLE_TEXT_EnthralledBy,
+ BATTLE_TEXT_IgnoredThing,
+};
+
+const u16 gTrainerItemCuredStatusStringIds[] =
+{
+ BATTLE_TEXT_CuredConfusion,
+ BATTLE_TEXT_CuredParalysis,
+ BATTLE_TEXT_CuredFreeze,
+ BATTLE_TEXT_CuredBurn,
+ BATTLE_TEXT_CuredPoison,
+ BATTLE_TEXT_CuredSleep,
+};
+
+const u16 gBerryEffectStringIds[] =
+{
+ BATTLE_TEXT_CuredStatus,
+ BATTLE_TEXT_NormalizedStatus,
+};
+
+const u16 gBRNPreventionStringIds[] =
+{
+ BATTLE_TEXT_PreventedBurn,
+ BATTLE_TEXT_PreventedOther2,
+ BATTLE_TEXT_NoEffectOn,
+};
+
+const u16 gPRLZPreventionStringIds[] =
+{
+ BATTLE_TEXT_PreventedPara,
+ BATTLE_TEXT_PreventedOther2,
+ BATTLE_TEXT_NoEffectOn,
+};
+
+const u16 gPSNPreventionStringIds[] =
+{
+ BATTLE_TEXT_PreventedPoison,
+ BATTLE_TEXT_PreventedOther2,
+ BATTLE_TEXT_NoEffectOn,
+};
+
+const u16 gItemSwapStringIds[] =
+{
+ BATTLE_TEXT_Obtained1,
+ BATTLE_TEXT_Obtained2,
+ BATTLE_TEXT_Obtained3,
+};
+
+const u16 gFlashFireStringIds[] =
+{
+ BATTLE_TEXT_RaisedFirePower,
+ BATTLE_TEXT_MadeIneffective,
+};
+
+const u16 gTrappingMoves[] =
+{
+ MOVE_BIND,
+ MOVE_WRAP,
+ MOVE_FIRE_SPIN,
+ MOVE_CLAMP,
+ MOVE_WHIRLPOOL,
+ MOVE_SAND_TOMB,
+ 0xFFFF,
+};
+
+const u8 *const gUnknown_0840165C[] =
+{
+ BattleText_HP,
+ BattleText_SpAtk,
+ BattleText_Attack,
+ BattleText_SpDef,
+ BattleText_Defense,
+ BattleStatText_Speed,
+};
+
+const u8 *const gUnknown_08401674[] =
+{
+ BattleText_Normal,
+ BattleText_Fighting,
+ BattleText_Flying,
+ BattleText_Poison,
+ BattleText_Ground,
+ BattleText_Rock,
+ BattleText_Bug,
+ BattleText_Ghost,
+ BattleText_Steel,
+ BattleText_Typeless,
+ BattleText_Fire,
+ BattleText_Water,
+ BattleText_Grass,
+ BattleText_Electric,
+ BattleText_Psychic,
+ BattleText_Ice,
+ BattleText_Dragon,
+ BattleText_Dark,
+};
diff --git a/src/data/battle_strings_en.h b/src/data/battle_strings_en.h
new file mode 100755
index 000000000..f29e48410
--- /dev/null
+++ b/src/data/battle_strings_en.h
@@ -0,0 +1,1612 @@
+#include "constants/moves.h"
+
+enum
+{
+ BATTLE_TEXT_UnknownString = 12,
+ BATTLE_TEXT_GainExpPoints,
+ BATTLE_TEXT_GrewLevel,
+ BATTLE_TEXT_LearnedMove,
+ BATTLE_TEXT_TryingToLearnMove,
+ BATTLE_TEXT_CantLearnMore,
+ BATTLE_TEXT_DeleteMove,
+ BATTLE_TEXT_DeletedMove,
+ BATTLE_TEXT_StopLearning,
+ BATTLE_TEXT_DidNotLearn,
+ BATTLE_TEXT_LearnedMove2,
+ BATTLE_TEXT_AttackMissed,
+ BATTLE_TEXT_ProtectedItself,
+ BATTLE_TEXT_StatNoHigher,
+ BATTLE_TEXT_AvoidedDamage,
+ BATTLE_TEXT_DoesntAffect,
+ BATTLE_TEXT_AttackingFainted,
+ BATTLE_TEXT_DefendingFainted,
+ BATTLE_TEXT_WinningPrize,
+ BATTLE_TEXT_OutOfUsablePoke,
+ BATTLE_TEXT_WhitedOut,
+ BATTLE_TEXT_PreventEscape,
+ BATTLE_TEXT_HitMulti,
+ BATTLE_TEXT_FellAsleep,
+ BATTLE_TEXT_MadeAsleep,
+ BATTLE_TEXT_DefendingAsleep,
+ BATTLE_TEXT_AttackingAsleep,
+ BATTLE_TEXT_WasntAffected,
+ BATTLE_TEXT_Poisoned,
+ BATTLE_TEXT_Poisoned2,
+ BATTLE_TEXT_PoisonHurt,
+ BATTLE_TEXT_AlreadyPoisoned,
+ BATTLE_TEXT_BadlyPoisoned,
+ BATTLE_TEXT_EnergyDrained,
+ BATTLE_TEXT_Burned,
+ BATTLE_TEXT_Burned2,
+ BATTLE_TEXT_BurnHurt,
+ BATTLE_TEXT_Frozen,
+ BATTLE_TEXT_Frozen2,
+ BATTLE_TEXT_FrozenSolid,
+ BATTLE_TEXT_DefendingDefrosted,
+ BATTLE_TEXT_AttackingDefrosted,
+ BATTLE_TEXT_Defrosted,
+ BATTLE_TEXT_Paralyzed,
+ BATTLE_TEXT_Paralyzed2,
+ BATTLE_TEXT_Paralyzed3,
+ BATTLE_TEXT_AlreadyParalyzed,
+ BATTLE_TEXT_ParalysisHealed,
+ BATTLE_TEXT_DreamEaten,
+ BATTLE_TEXT_AttackingStatNoHigher,
+ BATTLE_TEXT_DefendingStatNoHigher,
+ BATTLE_TEXT_StoppedWorking,
+ BATTLE_TEXT_StoppedWorking2,
+ BATTLE_TEXT_Confused,
+ BATTLE_TEXT_ConfusionSnapOut,
+ BATTLE_TEXT_BecameConfused,
+ BATTLE_TEXT_AlreadyConfused,
+ BATTLE_TEXT_FellLove,
+ BATTLE_TEXT_InLoveWith,
+ BATTLE_TEXT_ImmobilizedBy,
+ BATTLE_TEXT_BlownAway,
+ BATTLE_TEXT_TypeTransform,
+ BATTLE_TEXT_Flinched,
+ BATTLE_TEXT_RegainedHealth,
+ BATTLE_TEXT_HPFull,
+ BATTLE_TEXT_RaisedSpDef,
+ BATTLE_TEXT_RaisedDefense,
+ BATTLE_TEXT_CoveredVeil,
+ BATTLE_TEXT_SafeguardActive,
+ BATTLE_TEXT_SafeguardFaded,
+ BATTLE_TEXT_WentToSleep,
+ BATTLE_TEXT_SpeltHealthy,
+ BATTLE_TEXT_WhipWhirlwind,
+ BATTLE_TEXT_TookSunlight,
+ BATTLE_TEXT_LoweredHead,
+ BATTLE_TEXT_IsGlowing,
+ BATTLE_TEXT_FlewHigh,
+ BATTLE_TEXT_DugHole,
+ BATTLE_TEXT_SqueezedBind,
+ BATTLE_TEXT_TrappedVortex,
+ BATTLE_TEXT_Wrapped,
+ BATTLE_TEXT_Clamped,
+ BATTLE_TEXT_HurtBy,
+ BATTLE_TEXT_FreedFrom,
+ BATTLE_TEXT_KeptGoingCrash,
+ BATTLE_TEXT_MistShroud,
+ BATTLE_TEXT_MistProtect,
+ BATTLE_TEXT_GetPumped,
+ BATTLE_TEXT_HitRecoil,
+ BATTLE_TEXT_ProtectedItself2,
+ BATTLE_TEXT_SandBuffeted,
+ BATTLE_TEXT_HailStricken,
+ BATTLE_TEXT_WasSeeded,
+ BATTLE_TEXT_EvadedAttack,
+ BATTLE_TEXT_HealthSapped,
+ BATTLE_TEXT_FastAsleep,
+ BATTLE_TEXT_WokeUp,
+ BATTLE_TEXT_UproarAwake,
+ BATTLE_TEXT_UproarWoke,
+ BATTLE_TEXT_UproarCaused,
+ BATTLE_TEXT_UproarMaking,
+ BATTLE_TEXT_CalmedDown,
+ BATTLE_TEXT_UproarCantSleep,
+ BATTLE_TEXT_Stockpiled,
+ BATTLE_TEXT_StockpiledCant,
+ BATTLE_TEXT_UproarCantSleep2,
+ BATTLE_TEXT_UproarKeptAwake,
+ BATTLE_TEXT_StayedAwake,
+ BATTLE_TEXT_StoringEnergy,
+ BATTLE_TEXT_UnleashedEnergy,
+ BATTLE_TEXT_FatigueConfuse,
+ BATTLE_TEXT_PickedUpYen,
+ BATTLE_TEXT_Unaffected,
+ BATTLE_TEXT_Transformed,
+ BATTLE_TEXT_SubMade,
+ BATTLE_TEXT_SubAlready,
+ BATTLE_TEXT_SubTookDamage,
+ BATTLE_TEXT_SubFaded,
+ BATTLE_TEXT_MustRecharge,
+ BATTLE_TEXT_RageBuilding,
+ BATTLE_TEXT_MoveWasDisabled,
+ BATTLE_TEXT_MoveIsDisabled,
+ BATTLE_TEXT_DisabledNoMore,
+ BATTLE_TEXT_EncoreGot,
+ BATTLE_TEXT_EncoreEnded,
+ BATTLE_TEXT_TookAim,
+ BATTLE_TEXT_SketchedMove,
+ BATTLE_TEXT_DestinyBondTake,
+ BATTLE_TEXT_DestinyBondTaken,
+ BATTLE_TEXT_ReducedBy,
+ BATTLE_TEXT_StoleSomething,
+ BATTLE_TEXT_CantEscapeNow,
+ BATTLE_TEXT_NightmareStart,
+ BATTLE_TEXT_NightmareLock,
+ BATTLE_TEXT_CurseLay,
+ BATTLE_TEXT_CurseAfflict,
+ BATTLE_TEXT_SpikesScattered,
+ BATTLE_TEXT_SpikesHurt,
+ BATTLE_TEXT_IdentifiedPoke,
+ BATTLE_TEXT_PerishSongFell,
+ BATTLE_TEXT_BracedItself,
+ BATTLE_TEXT_EnduredHit,
+ BATTLE_TEXT_MagnitudeCount,
+ BATTLE_TEXT_CutHPMaxATK,
+ BATTLE_TEXT_CopyStatChanges,
+ BATTLE_TEXT_GotFreeFrom,
+ BATTLE_TEXT_LeechShed,
+ BATTLE_TEXT_SpikesBlownAway,
+ BATTLE_TEXT_FledBattle,
+ BATTLE_TEXT_ForesawAttack,
+ BATTLE_TEXT_TookAttack,
+ BATTLE_TEXT_PokeAttack,
+ BATTLE_TEXT_CenterAttention,
+ BATTLE_TEXT_ChargingPower,
+ BATTLE_TEXT_NaturePower,
+ BATTLE_TEXT_StatusNormal,
+ BATTLE_TEXT_NoMovesLeft,
+ BATTLE_TEXT_TormentSubject,
+ BATTLE_TEXT_TormentNoUse,
+ BATTLE_TEXT_TightenFocus,
+ BATTLE_TEXT_TauntFell,
+ BATTLE_TEXT_TauntNoUse,
+ BATTLE_TEXT_ReadyToHelp,
+ BATTLE_TEXT_SwitchedItems,
+ BATTLE_TEXT_CopiedObject,
+ BATTLE_TEXT_WishMade,
+ BATTLE_TEXT_WishTrue,
+ BATTLE_TEXT_PlantedRoots,
+ BATTLE_TEXT_AbsorbNutrients,
+ BATTLE_TEXT_AnchoredItself,
+ BATTLE_TEXT_DrowsyMade,
+ BATTLE_TEXT_KnockedOffItem,
+ BATTLE_TEXT_AbilitySwap,
+ BATTLE_TEXT_SealedMove,
+ BATTLE_TEXT_SealedNoUse,
+ BATTLE_TEXT_GrudgeBear,
+ BATTLE_TEXT_GrudgeLosePP,
+ BATTLE_TEXT_ShroudedItself,
+ BATTLE_TEXT_MagicCoatBounce,
+ BATTLE_TEXT_AwaitMove,
+ BATTLE_TEXT_SnatchedMove,
+ BATTLE_TEXT_RainMade,
+ BATTLE_TEXT_SpeedRisen,
+ BATTLE_TEXT_ProtectedBy,
+ BATTLE_TEXT_PreventedBy,
+ BATTLE_TEXT_HPRestoredUsing,
+ BATTLE_TEXT_MadeType,
+ BATTLE_TEXT_PreventedPara,
+ BATTLE_TEXT_PreventedRomance,
+ BATTLE_TEXT_PreventedPoison,
+ BATTLE_TEXT_PreventedConfusion,
+ BATTLE_TEXT_RaisedFirePower,
+ BATTLE_TEXT_AnchorsItself,
+ BATTLE_TEXT_CutsAttack,
+ BATTLE_TEXT_PreventedStatLoss,
+ BATTLE_TEXT_HurtOther,
+ BATTLE_TEXT_Traced,
+ BATTLE_TEXT_Sharply,
+ BATTLE_TEXT_Rose,
+ BATTLE_TEXT_Harshly,
+ BATTLE_TEXT_Fell,
+ BATTLE_TEXT_UnknownString7,
+ BATTLE_TEXT_UnknownString3,
+ BATTLE_TEXT_UnknownString5,
+ BATTLE_TEXT_UnknownString6,
+ BATTLE_TEXT_Critical,
+ BATTLE_TEXT_GrandSlam,
+ BATTLE_TEXT_MoveForget123,
+ BATTLE_TEXT_MoveForgetAnd,
+ BATTLE_TEXT_NotEffective,
+ BATTLE_TEXT_SuperEffective,
+ BATTLE_TEXT_GotAwaySafely,
+ BATTLE_TEXT_FledWild,
+ BATTLE_TEXT_NoRunning,
+ BATTLE_TEXT_CantEscape2,
+ BATTLE_TEXT_BirchDontLeaveMe,
+ BATTLE_TEXT_Nothing,
+ BATTLE_TEXT_Failed,
+ BATTLE_TEXT_HurtItself,
+ BATTLE_TEXT_MirrorFail,
+ BATTLE_TEXT_RainStart,
+ BATTLE_TEXT_PourStart,
+ BATTLE_TEXT_RainCont1,
+ BATTLE_TEXT_PourCont,
+ BATTLE_TEXT_RainStop,
+ BATTLE_TEXT_SandBrewed,
+ BATTLE_TEXT_SandRages,
+ BATTLE_TEXT_SandSubsided,
+ BATTLE_TEXT_SunBright,
+ BATTLE_TEXT_SunStrong,
+ BATTLE_TEXT_SunFaded,
+ BATTLE_TEXT_HailStart,
+ BATTLE_TEXT_HailCont,
+ BATTLE_TEXT_HailStop,
+ BATTLE_TEXT_SpitUpFail,
+ BATTLE_TEXT_SwallowFail,
+ BATTLE_TEXT_WindHeatWave,
+ BATTLE_TEXT_StatElim,
+ BATTLE_TEXT_CoinScatter,
+ BATTLE_TEXT_SubWeak,
+ BATTLE_TEXT_PainSplit,
+ BATTLE_TEXT_BellChime,
+ BATTLE_TEXT_PerishSong,
+ BATTLE_TEXT_NoPP1,
+ BATTLE_TEXT_NoPP2,
+ BATTLE_TEXT_Used1,
+ BATTLE_TEXT_TutorialUsed,
+ BATTLE_TEXT_BlockBall,
+ BATTLE_TEXT_DontBeAThief,
+ BATTLE_TEXT_DodgeBall,
+ BATTLE_TEXT_MissPoke,
+ BATTLE_TEXT_BallBrokeOhNo,
+ BATTLE_TEXT_BallBrokeAppeared,
+ BATTLE_TEXT_BallBrokeAlmost,
+ BATTLE_TEXT_BallBrokeSoClose,
+ BATTLE_TEXT_BallCaught1,
+ BATTLE_TEXT_BallCaught2,
+ BATTLE_TEXT_GiveNickname,
+ BATTLE_TEXT_SentToPC,
+ BATTLE_TEXT_AddedToDex,
+ BATTLE_TEXT_Raining,
+ BATTLE_TEXT_Sandstorm,
+ BATTLE_TEXT_CantEscape,
+ BATTLE_TEXT_IgnoredOrdersSLP,
+ BATTLE_TEXT_IgnoredOrders,
+ BATTLE_TEXT_BeganNap,
+ BATTLE_TEXT_LoafingAround,
+ BATTLE_TEXT_WontObey,
+ BATTLE_TEXT_TurnedAway,
+ BATTLE_TEXT_NotNotice,
+ BATTLE_TEXT_WillSwitch,
+ BATTLE_TEXT_CreptCloser,
+ BATTLE_TEXT_CantGetCloser,
+ BATTLE_TEXT_WatchingCarefully,
+ BATTLE_TEXT_CuriousAbout,
+ BATTLE_TEXT_EnthralledBy,
+ BATTLE_TEXT_IgnoredThing,
+ BATTLE_TEXT_ThrewBlock,
+ BATTLE_TEXT_SafariOver,
+ BATTLE_TEXT_CuredParalysis,
+ BATTLE_TEXT_CuredPoison,
+ BATTLE_TEXT_CuredBurn,
+ BATTLE_TEXT_CuredFreeze,
+ BATTLE_TEXT_CuredSleep,
+ BATTLE_TEXT_CuredConfusion,
+ BATTLE_TEXT_CuredStatus,
+ BATTLE_TEXT_RestoredHealth,
+ BATTLE_TEXT_RestoredPP,
+ BATTLE_TEXT_RestoredStatus,
+ BATTLE_TEXT_RestoredHPLittle,
+ BATTLE_TEXT_ChoiceBand,
+ BATTLE_TEXT_FocusSash,
+ BATTLE_TEXT_Terminator2,
+ BATTLE_TEXT_PreventedBurn,
+ BATTLE_TEXT_BlocksOther,
+ BATTLE_TEXT_RestoredHPByItem,
+ BATTLE_TEXT_WhipSandstorm,
+ BATTLE_TEXT_PreventedLoss,
+ BATTLE_TEXT_InfatuatedPoke,
+ BATTLE_TEXT_MadeIneffective,
+ BATTLE_TEXT_CuredProblem,
+ BATTLE_TEXT_OozeSuckup,
+ BATTLE_TEXT_Transformed2,
+ BATTLE_TEXT_ElecWeakened,
+ BATTLE_TEXT_FireWeakened,
+ BATTLE_TEXT_HidUnderwater,
+ BATTLE_TEXT_SprangUp,
+ BATTLE_TEXT_CantForgetHM,
+ BATTLE_TEXT_FoundOne,
+ BATTLE_TEXT_PlayerDefeatedTrainer2,
+ BATTLE_TEXT_SoothingAroma,
+ BATTLE_TEXT_CantUseItems,
+ BATTLE_TEXT_UnknownString2,
+ BATTLE_TEXT_UnknownString4,
+ BATTLE_TEXT_HustleUse,
+ BATTLE_TEXT_MadeUseless,
+ BATTLE_TEXT_SandTombTrapped,
+ BATTLE_TEXT_Terminator,
+ BATTLE_TEXT_BoostedExp,
+ BATTLE_TEXT_SunIntensified,
+ BATTLE_TEXT_GroundMoveNegate,
+ BATTLE_TEXT_WallyBall,
+ BATTLE_TEXT_TookAttack2,
+ BATTLE_TEXT_ChoseDestiny,
+ BATTLE_TEXT_LostFocus,
+ BATTLE_TEXT_UseNext,
+ BATTLE_TEXT_FledUsingItem,
+ BATTLE_TEXT_FledUsingOther,
+ BATTLE_TEXT_DraggedOut,
+ BATTLE_TEXT_PreventedOther,
+ BATTLE_TEXT_NormalizedStatus,
+ BATTLE_TEXT_Used2,
+ BATTLE_TEXT_BoxFull,
+ BATTLE_TEXT_AvoidedAttack,
+ BATTLE_TEXT_MadeIneffective2,
+ BATTLE_TEXT_PreventedFlinching,
+ BATTLE_TEXT_AlreadyBurned,
+ BATTLE_TEXT_StatNoLower,
+ BATTLE_TEXT_BlocksOther2,
+ BATTLE_TEXT_WoreOff,
+ BATTLE_TEXT_RaisedDefenseLittle,
+ BATTLE_TEXT_RaisedSpDefLittle,
+ BATTLE_TEXT_BrokeWall,
+ BATTLE_TEXT_PreventedOther2,
+ BATTLE_TEXT_CuredOfProblem,
+ BATTLE_TEXT_AttackingCantEscape,
+ BATTLE_TEXT_Obtained1,
+ BATTLE_TEXT_Obtained2,
+ BATTLE_TEXT_Obtained3,
+ BATTLE_TEXT_NoEffect,
+ BATTLE_TEXT_NoEffectOn,
+};
+
+const u8 BattleText_UnknownString[] = _("{STRING 33}");
+const u8 BattleText_GainExpPoints[] = _("{STRING 0} gained{STRING 1}\n{STRING 42} EXP. Points!\p");
+const u8 BattleText_Terminator[] = _("");
+const u8 BattleText_BoostedExp[] = _(" a boosted");
+const u8 BattleText_GrewLevel[] = _("{STRING 0} grew to\nLV. {STRING 1}!{UNKNOWN_A}\p");
+const u8 BattleText_LearnedMove[] = _("{STRING 0} learned\n{STRING 1}!{UNKNOWN_A}\p");
+const u8 BattleText_TryingToLearnMove[] = _("{STRING 0} is trying to\nlearn {STRING 1}.\p");
+const u8 BattleText_CantLearnMore[] = _("But, {STRING 0} can’t learn\nmore than four moves.\p");
+const u8 BattleText_DeleteMove[] = _("Delete a move to make\nroom for {STRING 1}?");
+const u8 BattleText_DeletedMove[] = _("{STRING 0} forgot\n{STRING 1}.\p");
+const u8 BattleText_StopLearning[] = _("{PAUSE 32}Stop learning\n{STRING 1}?");
+const u8 BattleText_DidNotLearn[] = _("{STRING 0} did not learn\n{STRING 1}.\p");
+const u8 BattleText_UseNext[] = _("Use next POKéMON?");
+const u8 BattleText_AttackMissed[] = _("{ATTACKING_MON}’s\nattack missed!");
+const u8 BattleText_ProtectedItself[] = _("{DEFENDING_MON}\nprotected itself!");
+const u8 BattleText_AvoidedDamage[] = _("{DEFENDING_MON} avoided\ndamage with {STRING 22}!");
+const u8 BattleText_GroundMoveNegate[] = _("{DEFENDING_MON} makes GROUND\nmoves miss with {STRING 22}!");
+const u8 BattleText_AvoidedAttack[] = _("{DEFENDING_MON} avoided\nthe attack!");
+const u8 BattleText_DoesntAffect[] = _("It doesn’t affect\n{DEFENDING_MON}...");
+const u8 BattleText_AttackingFainted[] = _("{ATTACKING_MON}\nfainted!\p");
+const u8 BattleText_DefendingFainted[] = _("{DEFENDING_MON}\nfainted!\p");
+const u8 BattleText_WinningPrize[] = _("{STRING 32} got ¥{STRING 0}\nfor winning!\p");
+const u8 BattleText_OutOfUsablePoke[] = _("{STRING 32} is out of\nuseable POKéMON!\p");
+const u8 BattleText_WhitedOut[] = _("{STRING 32} whited out!{PAUSE_UNTIL_PRESS}");
+const u8 BattleText_PreventEscape[] = _("{STRING 16} prevents\nescape with {STRING 23}!\p");
+const u8 BattleText_CantEscape[] = _("Can’t escape!\p");
+const u8 BattleText_AttackingCantEscape[] = _("{ATTACKING_MON}\ncan’t escape!");
+const u8 BattleText_HitMulti[] = _("Hit {STRING 0} time(s)!");
+const u8 BattleText_FellAsleep[] = _("{STRING 14}\nfell asleep!");
+const u8 BattleText_MadeAsleep[] = _("{STRING 16}’s {STRING 23}\nmade {STRING 14} sleep!");
+const u8 BattleText_DefendingAsleep[] = _("{DEFENDING_MON} is\nalready asleep!");
+const u8 BattleText_AttackingAsleep[] = _("{ATTACKING_MON} is\nalready asleep!");
+const u8 BattleText_WasntAffected[] = _("{DEFENDING_MON}\nwasn’t affected!");
+const u8 BattleText_Poisoned[] = _("{STRING 14}\nwas poisoned!");
+const u8 BattleText_Poisoned2[] = _("{STRING 16}’s {STRING 23}\npoisoned {STRING 14}!");
+const u8 BattleText_PoisonHurt[] = _("{ATTACKING_MON} is hurt\nby poison!");
+const u8 BattleText_AlreadyPoisoned[] = _("{DEFENDING_MON} is already\npoisoned.");
+const u8 BattleText_BadlyPoisoned[] = _("{STRING 14} is badly\npoisoned!");
+const u8 BattleText_EnergyDrained[] = _("{DEFENDING_MON} had its\nenergy drained!");
+const u8 BattleText_Burned[] = _("{STRING 14} was burned!");
+const u8 BattleText_Burned2[] = _("{STRING 16}’s {STRING 23}\nburned {STRING 14}!");
+const u8 BattleText_BurnHurt[] = _("{ATTACKING_MON} is hurt\nby its burn!");
+const u8 BattleText_AlreadyBurned[] = _("{DEFENDING_MON} already\nhas a burn.");
+const u8 BattleText_Frozen[] = _("{STRING 14} was\nfrozen solid!");
+const u8 BattleText_Frozen2[] = _("{STRING 16}’s {STRING 23}\nfroze {STRING 14} solid!");
+const u8 BattleText_FrozenSolid[] = _("{ATTACKING_MON} is\nfrozen solid!");
+const u8 BattleText_DefendingDefrosted[] = _("{DEFENDING_MON} was\ndefrosted!");
+const u8 BattleText_AttackingDefrosted[] = _("{ATTACKING_MON} was\ndefrosted!");
+const u8 BattleText_Defrosted[] = _("{ATTACKING_MON} was\ndefrosted by {STRING 17}!");
+const u8 BattleText_Paralyzed[] = _("{STRING 14} is paralyzed!\nIt may be unable to move!");
+const u8 BattleText_Paralyzed2[] = _("{STRING 16}’s {STRING 23}\nparalyzed {STRING 14}!\lIt may be unable to move!");
+const u8 BattleText_Paralyzed3[] = _("{ATTACKING_MON} is paralyzed!\nIt can’t move!");
+const u8 BattleText_AlreadyParalyzed[] = _("{DEFENDING_MON} is\nalready paralyzed!");
+const u8 BattleText_ParalysisHealed[] = _("{DEFENDING_MON} was\nhealed of paralysis!");
+const u8 BattleText_DreamEaten[] = _("{DEFENDING_MON}’s\ndream was eaten!");
+const u8 BattleText_AttackingStatNoHigher[] = _("{ATTACKING_MON}’s {STRING 0}\nwon’t go higher!");
+const u8 BattleText_DefendingStatNoHigher[] = _("{DEFENDING_MON}’s {STRING 0}\nwon’t go lower!");
+const u8 BattleText_StoppedWorking[] = _("Your team’s {STRING 0}\nstopped working!");
+const u8 BattleText_StoppedWorking2[] = _("The foe’s {STRING 0}\nstopped working!");
+const u8 BattleText_Confused[] = _("{ATTACKING_MON} is\nconfused!");
+const u8 BattleText_ConfusionSnapOut[] = _("{ATTACKING_MON} snapped\nout of confusion!");
+const u8 BattleText_BecameConfused[] = _("{STRING 14} became\nconfused!");
+const u8 BattleText_AlreadyConfused[] = _("{DEFENDING_MON} is\nalready confused!");
+const u8 BattleText_FellLove[] = _("{DEFENDING_MON}\nfell in love!");
+const u8 BattleText_InLoveWith[] = _("{ATTACKING_MON} is in love\nwith {STRING 16}!");
+const u8 BattleText_ImmobilizedBy[] = _("{ATTACKING_MON} is\nimmobilized by love!");
+const u8 BattleText_BlownAway[] = _("{DEFENDING_MON} was\nblown away!");
+const u8 BattleText_TypeTransform[] = _("{ATTACKING_MON} transformed\ninto the {STRING 0} type!");
+const u8 BattleText_Flinched[] = _("{ATTACKING_MON} flinched!");
+const u8 BattleText_RegainedHealth[] = _("{DEFENDING_MON} regained\nhealth!");
+const u8 BattleText_HPFull[] = _("{DEFENDING_MON}’s\nHP is full!");
+const u8 BattleText_RaisedSpDef[] = _("{STRING 38}’s {STRING 17}\nraised SP. DEF!");
+const u8 BattleText_RaisedSpDefLittle[] = _("{STRING 38}’s {STRING 17}\nraised SP. DEF a little!");
+const u8 BattleText_RaisedDefense[] = _("{STRING 38}’s {STRING 17}\nraised DEFENSE!");
+const u8 BattleText_RaisedDefenseLittle[] = _("{STRING 38}’s {STRING 17}\nraised DEFENSE a little!");
+const u8 BattleText_CoveredVeil[] = _("{STRING 38} is covered\nby a veil!");
+const u8 BattleText_SafeguardActive[] = _("{DEFENDING_MON} is protected\nby SAFEGUARD!");
+const u8 BattleText_SafeguardFaded[] = _("{STRING 40}’s SAFEGUARD\nfaded!");
+const u8 BattleText_WentToSleep[] = _("{ATTACKING_MON} went\nto sleep!");
+const u8 BattleText_SpeltHealthy[] = _("{ATTACKING_MON} slept and\nbecame healthy!");
+const u8 BattleText_WhipWhirlwind[] = _("{ATTACKING_MON} whipped\nup a whirlwind!");
+const u8 BattleText_TookSunlight[] = _("{ATTACKING_MON} took\nin sunlight!");
+const u8 BattleText_LoweredHead[] = _("{ATTACKING_MON} lowered\nits head!");
+const u8 BattleText_IsGlowing[] = _("{ATTACKING_MON} is glowing!");
+const u8 BattleText_FlewHigh[] = _("{ATTACKING_MON} flew\nup high!");
+const u8 BattleText_DugHole[] = _("{ATTACKING_MON} dug a hole!");
+const u8 BattleText_HidUnderwater[] = _("{ATTACKING_MON} hid\nunderwater!");
+const u8 BattleText_SprangUp[] = _("{ATTACKING_MON} sprang up!");
+const u8 BattleText_SqueezedBind[] = _("{DEFENDING_MON} was squeezed by\n{ATTACKING_MON}’s BIND!");
+const u8 BattleText_TrappedVortex[] = _("{DEFENDING_MON} was trapped\nin the vortex!");
+const u8 BattleText_SandTombTrapped[] = _("{DEFENDING_MON} was trapped\nby SAND TOMB!");
+const u8 BattleText_Wrapped[] = _("{DEFENDING_MON} was WRAPPED by\n{ATTACKING_MON}!");
+const u8 BattleText_Clamped[] = _("{ATTACKING_MON} CLAMPED\n{DEFENDING_MON}!");
+const u8 BattleText_HurtBy[] = _("{ATTACKING_MON} is hurt\nby {STRING 0}!");
+const u8 BattleText_FreedFrom[] = _("{ATTACKING_MON} was freed\nfrom {STRING 0}!");
+const u8 BattleText_KeptGoingCrash[] = _("{ATTACKING_MON} kept going\nand crashed!");
+const u8 BattleText_MistShroud[] = _("{STRING 38} became\nshrouded in MIST!");
+const u8 BattleText_MistProtect[] = _("{STRING 16} is protected\nby MIST!");
+const u8 BattleText_GetPumped[] = _("{ATTACKING_MON} is getting\npumped!");
+const u8 BattleText_HitRecoil[] = _("{ATTACKING_MON} is hit\nwith recoil!");
+const u8 BattleText_ProtectedItself2[] = _("{ATTACKING_MON} protected\nitself!");
+const u8 BattleText_SandBuffeted[] = _("{ATTACKING_MON} is buffeted\nby the sandstorm!");
+const u8 BattleText_HailStricken[] = _("{ATTACKING_MON} is stricken\nby HAIL!");
+const u8 BattleText_WoreOff[] = _("{STRING 36}’s {STRING 0}\nwore off!");
+const u8 BattleText_WasSeeded[] = _("{DEFENDING_MON} was seeded!");
+const u8 BattleText_EvadedAttack[] = _("{DEFENDING_MON} evaded\nthe attack!");
+const u8 BattleText_HealthSapped[] = _("{ATTACKING_MON}’s health is\nsapped by LEECH SEED!");
+const u8 BattleText_FastAsleep[] = _("{ATTACKING_MON} is fast\nasleep.");
+const u8 BattleText_WokeUp[] = _("{ATTACKING_MON} woke up!");
+const u8 BattleText_UproarAwake[] = _("But {STRING 16}’s UPROAR\nkept it awake!");
+const u8 BattleText_UproarWoke[] = _("{ATTACKING_MON} woke up\nin the UPROAR!");
+const u8 BattleText_UproarCaused[] = _("{ATTACKING_MON} caused\nan UPROAR!");
+const u8 BattleText_UproarMaking[] = _("{ATTACKING_MON} is making\nan UPROAR!");
+const u8 BattleText_CalmedDown[] = _("{ATTACKING_MON} calmed down.");
+const u8 BattleText_UproarCantSleep[] = _("But {DEFENDING_MON} can’t\nsleep in an UPROAR!");
+const u8 BattleText_Stockpiled[] = _("{ATTACKING_MON} STOCKPILED\n{STRING 0}!");
+const u8 BattleText_StockpiledCant[] = _("{ATTACKING_MON} can’t\nSTOCKPILE any more!");
+const u8 BattleText_UproarCantSleep2[] = _("But {DEFENDING_MON} can’t\nsleep in an UPROAR!");
+const u8 BattleText_UproarKeptAwake[] = _("But the UPROAR kept\n{DEFENDING_MON} awake!");
+const u8 BattleText_StayedAwake[] = _("{DEFENDING_MON} stayed awake\nusing its {STRING 22}!");
+const u8 BattleText_StoringEnergy[] = _("{ATTACKING_MON} is storing\nenergy!");
+const u8 BattleText_UnleashedEnergy[] = _("{ATTACKING_MON} unleashed\nenergy!");
+const u8 BattleText_FatigueConfuse[] = _("{ATTACKING_MON} became\nconfused out of fatigue!");
+const u8 BattleText_PickedUpYen[] = _("{STRING 32} picked up\n¥{STRING 0}!\p");
+const u8 BattleText_Unaffected[] = _("{DEFENDING_MON} is\nunaffected!");
+const u8 BattleText_Transformed[] = _("{ATTACKING_MON} transformed\ninto {STRING 0}!");
+const u8 BattleText_SubMade[] = _("{ATTACKING_MON} made\na SUBSTITUTE!");
+const u8 BattleText_SubAlready[] = _("{ATTACKING_MON} already\nhas a SUBSTITUTE!");
+const u8 BattleText_SubTookDamage[] = _("The SUBSTITUTE took damage\nfor {DEFENDING_MON}!\p");
+const u8 BattleText_SubFaded[] = _("{DEFENDING_MON}’s\nSUBSTITUTE faded!\p");
+const u8 BattleText_MustRecharge[] = _("{ATTACKING_MON} must\nrecharge!");
+const u8 BattleText_RageBuilding[] = _("{DEFENDING_MON}’s RAGE\nis building!");
+const u8 BattleText_MoveWasDisabled[] = _("{DEFENDING_MON}’s {STRING 0}\nwas disabled!");
+const u8 BattleText_DisabledNoMore[] = _("{ATTACKING_MON} is disabled\nno more!");
+const u8 BattleText_EncoreGot[] = _("{DEFENDING_MON} got\nan ENCORE!");
+const u8 BattleText_EncoreEnded[] = _("{ATTACKING_MON}’s ENCORE\nended!");
+const u8 BattleText_TookAim[] = _("{ATTACKING_MON} took aim\nat {DEFENDING_MON}!");
+const u8 BattleText_SketchedMove[] = _("{ATTACKING_MON} SKETCHED\n{STRING 0}!");
+const u8 BattleText_DestinyBondTake[] = _("{ATTACKING_MON} is trying\nto take its foe with it!");
+const u8 BattleText_DestinyBondTaken[] = _("{DEFENDING_MON} took\n{ATTACKING_MON} with it!");
+const u8 BattleText_ReducedBy[] = _("Reduced {DEFENDING_MON}’s\n{STRING 0} by {STRING 1}!");
+const u8 BattleText_StoleSomething[] = _("{ATTACKING_MON} stole\n{DEFENDING_MON}’s {STRING 19}!");
+const u8 BattleText_CantEscapeNow[] = _("{DEFENDING_MON} can’t\nescape now!");
+const u8 BattleText_NightmareStart[] = _("{DEFENDING_MON} fell into\na NIGHTMARE!");
+const u8 BattleText_NightmareLock[] = _("{ATTACKING_MON} is locked\nin a NIGHTMARE!");
+const u8 BattleText_CurseLay[] = _("{ATTACKING_MON} cut its own HP\nand laid a CURSE on\l{DEFENDING_MON}!");
+const u8 BattleText_CurseAfflict[] = _("{ATTACKING_MON} is afflicted\nby the CURSE!");
+const u8 BattleText_SpikesScattered[] = _("{STRING 37} POKéMON team had SPIKES\nscattered around it!");
+const u8 BattleText_SpikesHurt[] = _("{STRING 16} is hurt\nby SPIKES!");
+const u8 BattleText_IdentifiedPoke[] = _("{ATTACKING_MON} identified\n{DEFENDING_MON}!");
+const u8 BattleText_PerishSongFell[] = _("{ATTACKING_MON}’s PERISH count\nfell to {STRING 0}!");
+const u8 BattleText_BracedItself[] = _("{ATTACKING_MON} braced\nitself!");
+const u8 BattleText_EnduredHit[] = _("{DEFENDING_MON} ENDURED\nthe hit!");
+const u8 BattleText_MagnitudeCount[] = _("MAGNITUDE {STRING 0}!");
+const u8 BattleText_CutHPMaxATK[] = _("{ATTACKING_MON} cut its own HP\nand maximized ATTACK!");
+const u8 BattleText_CopyStatChanges[] = _("{ATTACKING_MON} copied\n{DEFENDING_MON}’s stat changes!");
+const u8 BattleText_GotFreeFrom[] = _("{ATTACKING_MON} got free of\n{DEFENDING_MON}’s {STRING 0}!");
+const u8 BattleText_LeechShed[] = _("{ATTACKING_MON} shed\nLEECH SEED!");
+const u8 BattleText_SpikesBlownAway[] = _("{ATTACKING_MON} blew away\nSPIKES!");
+const u8 BattleText_FledBattle[] = _("{ATTACKING_MON} fled from\nbattle!");
+const u8 BattleText_ForesawAttack[] = _("{ATTACKING_MON} foresaw\nan attack!");
+const u8 BattleText_TookAttack[] = _("{DEFENDING_MON} took\n{STRING 0}’s attack!");
+const u8 BattleText_ChoseDestiny[] = _("{ATTACKING_MON} chose\n{STRING 17} as its destiny!");
+const u8 BattleText_PokeAttack[] = _("{STRING 0}’s attack!");
+const u8 BattleText_CenterAttention[] = _("{ATTACKING_MON} became the\ncenter of attention!");
+const u8 BattleText_ChargingPower[] = _("{ATTACKING_MON} began\ncharging power!");
+const u8 BattleText_NaturePower[] = _("NATURE POWER turned into\n{STRING 17}!");
+const u8 BattleText_StatusNormal[] = _("{ATTACKING_MON}’s status\nreturned to normal!");
+const u8 BattleText_TormentSubject[] = _("{DEFENDING_MON} was subjected\nto TORMENT!");
+const u8 BattleText_TightenFocus[] = _("{ATTACKING_MON} is tightening\nits focus!");
+const u8 BattleText_TauntFell[] = _("{DEFENDING_MON} fell for\nthe TAUNT!");
+const u8 BattleText_ReadyToHelp[] = _("{ATTACKING_MON} is ready to\nhelp {DEFENDING_MON}!");
+const u8 BattleText_SwitchedItems[] = _("{ATTACKING_MON} switched\nitems with its opponent!");
+const u8 BattleText_Obtained1[] = _("{ATTACKING_MON} obtained\n{STRING 0}.");
+const u8 BattleText_Obtained2[] = _("{DEFENDING_MON} obtained\n{STRING 1}.");
+const u8 BattleText_Obtained3[] = _("{ATTACKING_MON} obtained\n{STRING 0}.\p{DEFENDING_MON} obtained\n{STRING 1}.");
+const u8 BattleText_CopiedObject[] = _("{ATTACKING_MON} copied\n{DEFENDING_MON}’s {STRING 22}!");
+const u8 BattleText_WishMade[] = _("{ATTACKING_MON} made a WISH!");
+const u8 BattleText_WishTrue[] = _("{STRING 0}’s WISH\ncame true!");
+const u8 BattleText_PlantedRoots[] = _("{ATTACKING_MON} planted its roots!");
+const u8 BattleText_AbsorbNutrients[] = _("{ATTACKING_MON} absorbed\nnutrients with its roots!");
+const u8 BattleText_AnchoredItself[] = _("{DEFENDING_MON} anchored\nitself with its roots!");
+const u8 BattleText_DrowsyMade[] = _("{ATTACKING_MON} made\n{DEFENDING_MON} drowsy!");
+const u8 BattleText_KnockedOffItem[] = _("{ATTACKING_MON} knocked off\n{DEFENDING_MON}’s {STRING 19}!");
+const u8 BattleText_AbilitySwap[] = _("{ATTACKING_MON} swapped abilities\nwith its opponent!");
+const u8 BattleText_SealedMove[] = _("{ATTACKING_MON} sealed the\nopponent’s move(s)!");
+const u8 BattleText_GrudgeBear[] = _("{ATTACKING_MON} wants the\nopponent to bear a GRUDGE!");
+const u8 BattleText_GrudgeLosePP[] = _("{ATTACKING_MON}’s {STRING 0}\nlost all its PP due to\lthe GRUDGE!");
+const u8 BattleText_ShroudedItself[] = _("{ATTACKING_MON} shrouded\nitself in {STRING 17}!");
+const u8 BattleText_MagicCoatBounce[] = _("{ATTACKING_MON}’s {STRING 17}\nwas bounced back by MAGIC COAT!");
+const u8 BattleText_AwaitMove[] = _("{ATTACKING_MON} awaits its foe\nto make a move!");
+const u8 BattleText_SnatchedMove[] = _("{DEFENDING_MON} SNATCHED\n{STRING 16}’s move!");
+const u8 BattleText_ElecWeakened[] = _("Electricity’s power was\nweakened!");
+const u8 BattleText_FireWeakened[] = _("Fire’s power was\nweakened!");
+const u8 BattleText_FoundOne[] = _("{ATTACKING_MON} found\none {STRING 19}!");
+const u8 BattleText_SoothingAroma[] = _("A soothing aroma wafted\nthrough the area!");
+const u8 BattleText_CantUseItems[] = _("Items can’t be used now.{PAUSE 64}");
+const u8 BattleText_UnknownString2[] = _("For {STRING 16},\n{STRING 19} {STRING 0}");
+const u8 BattleText_HustleUse[] = _("{STRING 16} used\n{STRING 19} to hustle!");
+const u8 BattleText_LostFocus[] = _("{ATTACKING_MON} lost its\nfocus and couldn’t move!");
+const u8 BattleText_DraggedOut[] = _("{DEFENDING_MON} was\ndragged out!\p");
+const u8 BattleText_BrokeWall[] = _("The wall shattered!");
+const u8 BattleText_NoEffect[] = _("But it had no effect!");
+const u8 BattleText_NoMovesLeft[] = _("{STRING 15} has no\nmoves left!\p");
+const u8 BattleText_MoveIsDisabled[] = _("{STRING 15}’s {STRING 17}\nis disabled!\p");
+const u8 BattleText_TormentNoUse[] = _("{STRING 15} can’t use the same\nmove twice in a row due to the TORMENT!\p");
+const u8 BattleText_TauntNoUse[] = _("{STRING 15} can’t use\n{STRING 17} after the TAUNT!\p");
+const u8 BattleText_SealedNoUse[] = _("{STRING 15} can’t use the\nsealed {STRING 17}!\p");
+const u8 BattleText_RainMade[] = _("{STRING 16}’s {STRING 23}\nmade it rain!");
+const u8 BattleText_SpeedRisen[] = _("{STRING 16}’s {STRING 23}\nraised its SPEED!");
+const u8 BattleText_ProtectedBy[] = _("{DEFENDING_MON} was protected\nby {STRING 22}!");
+const u8 BattleText_PreventedBy[] = _("{DEFENDING_MON}’s {STRING 22}\nprevents {ATTACKING_MON}\lfrom using {STRING 17}!");
+const u8 BattleText_HPRestoredUsing[] = _("{DEFENDING_MON} restored HP\nusing its {STRING 22}!");
+const u8 BattleText_MadeUseless[] = _("{DEFENDING_MON}’s {STRING 22}\nmade {STRING 17} useless!");
+const u8 BattleText_MadeType[] = _("{DEFENDING_MON}’s {STRING 22}\nmade it the {STRING 0} type!");
+const u8 BattleText_PreventedPara[] = _("{STRING 14}’s {STRING 22}\nprevents paralysis!");
+const u8 BattleText_PreventedRomance[] = _("{DEFENDING_MON}’s {STRING 22}\nprevents romance!");
+const u8 BattleText_PreventedPoison[] = _("{STRING 14}’s {STRING 22}\nprevents poisoning!");
+const u8 BattleText_PreventedConfusion[] = _("{DEFENDING_MON}’s {STRING 22}\nprevents confusion!");
+const u8 BattleText_RaisedFirePower[] = _("{DEFENDING_MON}’s {STRING 22}\nraised its FIRE power!");
+const u8 BattleText_AnchorsItself[] = _("{DEFENDING_MON} anchors\nitself with {STRING 22}!");
+const u8 BattleText_CutsAttack[] = _("{STRING 16}’s {STRING 23}\ncuts {DEFENDING_MON}’s ATTACK!");
+const u8 BattleText_PreventedStatLoss[] = _("{STRING 16}’s {STRING 23}\nprevents stat loss!");
+const u8 BattleText_HurtOther[] = _("{DEFENDING_MON}’s {STRING 22}\nhurt {ATTACKING_MON}!");
+const u8 BattleText_Traced[] = _("{STRING 16} TRACED\n{STRING 0}’s {STRING 1}!");
+const u8 BattleText_PreventedBurn[] = _("{STRING 14}’s {STRING 24}\nprevents burns!");
+const u8 BattleText_BlocksOther[] = _("{DEFENDING_MON}’s {STRING 22}\nblocks {STRING 17}!");
+const u8 BattleText_BlocksOther2[] = _("{STRING 16}’s {STRING 23}\nblocks {STRING 17}!");
+const u8 BattleText_RestoredHPByItem[] = _("{ATTACKING_MON}’s {STRING 21}\nrestored some HP!");
+const u8 BattleText_WhipSandstorm[] = _("{STRING 16}’s {STRING 23}\nwhipped up a sandstorm!");
+const u8 BattleText_SunIntensified[] = _("{STRING 16}’s {STRING 23}\nintensified the sun’s rays!");
+const u8 BattleText_PreventedLoss[] = _("{STRING 16}’s {STRING 23}\nprevents {STRING 0} loss!");
+const u8 BattleText_InfatuatedPoke[] = _("{DEFENDING_MON}’s {STRING 22}\ninfatuated {ATTACKING_MON}!");
+const u8 BattleText_MadeIneffective[] = _("{DEFENDING_MON}’s {STRING 22}\nmade {STRING 17} ineffective!");
+const u8 BattleText_CuredProblem[] = _("{STRING 16}’s {STRING 23}\ncured its {STRING 0} problem!");
+const u8 BattleText_OozeSuckup[] = _("It sucked up the\nLIQUID OOZE!");
+const u8 BattleText_Transformed2[] = _("{STRING 16} transformed!");
+const u8 BattleText_TookAttack2[] = _("{DEFENDING_MON}’s {STRING 22}\ntook the attack!");
+const u8 BattleText_PreventedSwitch[] = _("{STRING 0}’s {STRING 20}\nprevents switching!\p");
+const u8 BattleText_PreventedOther[] = _("{DEFENDING_MON}’s {STRING 22}\nprevented {STRING 16}’s\l{STRING 0} from working!");
+const u8 BattleText_MadeIneffective2[] = _("{STRING 16}’s {STRING 23}\nmade it ineffective!");
+const u8 BattleText_PreventedFlinching[] = _("{STRING 14}’s {STRING 24}\nprevents flinching!");
+const u8 BattleText_PreventedOther2[] = _("{ATTACKING_MON}’s {STRING 21}\nprevents {DEFENDING_MON}’s\l{STRING 22} from working!");
+const u8 BattleText_CuredOfProblem[] = _("{STRING 16}’s {STRING 23}\ncured its {STRING 0} problem!");
+const u8 BattleText_NoEffectOn[] = _("{STRING 16}’s {STRING 23}\nhad no effect on {STRING 14}!");
+const u8 BattleText_Sharply[] = _("sharply ");
+const u8 BattleText_Rose[] = _("rose!");
+const u8 BattleText_Harshly[] = _("harshly ");
+const u8 BattleText_Fell[] = _("fell!");
+const u8 BattleText_UnknownString7[] = _("{ATTACKING_MON}’s {STRING 0}\n{STRING 1}");
+const u8 BattleText_UnknownString3[] = _("{DEFENDING_MON}’s {STRING 0}\n{STRING 1}");
+const u8 BattleText_UnknownString4[] = _("Using {STRING 19}, the {STRING 0}\nof {STRING 16} {STRING 1}");
+const u8 BattleText_UnknownString5[] = _("{ATTACKING_MON}’s {STRING 0}\n{STRING 1}");
+const u8 BattleText_UnknownString6[] = _("{DEFENDING_MON}’s {STRING 0}\n{STRING 1}");
+const u8 BattleText_StatNoHigher[] = _("{ATTACKING_MON}’s stats won’t\ngo any higher!");
+const u8 BattleText_StatNoLower[] = _("{DEFENDING_MON}’s stats won’t\ngo any lower!");
+const u8 BattleText_Critical[] = _("A critical hit!");
+const u8 BattleText_GrandSlam[] = _("It’s a one-hit KO!");
+const u8 BattleText_MoveForget123[] = _("{PAUSE 32}1, {PAUSE 15}2 and...{PAUSE 15} ...{PAUSE 15} ...{PAUSE 15}\n{PAUSE 15}{PLAY_SE SE_KON}Poof!\p");
+const u8 BattleText_MoveForgetAnd[] = _("And...\p");
+const u8 BattleText_CantForgetHM[] = _("HM moves can’t be\nforgotten now.\p");
+const u8 BattleText_NotEffective[] = _("It’s not very effective...");
+const u8 BattleText_SuperEffective[] = _("It’s super effective!");
+const u8 BattleText_GotAwaySafely[] = _("{PLAY_SE SE_NIGERU}Got away safely!\p");
+const u8 BattleText_FledUsingItem[] = _("{PLAY_SE SE_NIGERU}{ATTACKING_MON} fled\nusing its {STRING 19}!\p");
+const u8 BattleText_FledUsingOther[] = _("{PLAY_SE SE_NIGERU}{ATTACKING_MON} fled\nusing {STRING 21}!\p");
+const u8 BattleText_FledWild[] = _("{PLAY_SE SE_NIGERU}Wild {STRING 0} fled!");
+const u8 BattleText_PlayerDefeatedTrainer[] = _("Player defeated\n{STRING 29}!");
+const u8 BattleText_PlayerDefeatedTrainers[] = _("Player beat {STRING 30}\nand {STRING 29}!");
+const u8 BattleText_PlayerLostTrainer[] = _("Player lost against\n{STRING 29}!");
+const u8 BattleText_PlayerLostTrainers[] = _("Player lost to {STRING 30}\nand {STRING 29}!");
+const u8 BattleText_PlayerTiedTrainer[] = _("Player tied against\n{STRING 29}!");
+const u8 BattleText_PlayerTiedTrainers[] = _("Player tied against {STRING 30}\nand {STRING 29}!");
+const u8 BattleText_FledSingle[] = _("{PLAY_SE SE_NIGERU}{STRING 29} fled!");
+const u8 BattleText_FledDouble[] = _("{PLAY_SE SE_NIGERU}{STRING 29} and\n{STRING 30} fled!");
+const u8 BattleText_NoRunning[] = _("No! There’s no running\nfrom a TRAINER battle!\p");
+const u8 BattleText_CantEscape2[] = _("Can’t escape!\p");
+const u8 BattleText_BirchDontLeaveMe[] = _("PROF. BIRCH: D-don’t leave\nme here like this!\p");
+const u8 BattleText_Nothing[] = _("But nothing happened!");
+const u8 BattleText_Failed[] = _("But it failed!");
+const u8 BattleText_HurtItself[] = _("It hurt itself in its\nconfusion!");
+const u8 BattleText_MirrorFail[] = _("The MIRROR MOVE failed!");
+const u8 BattleText_RainStart[] = _("It started to rain!");
+const u8 BattleText_PourStart[] = _("A downpour started!");
+const u8 BattleText_RainCont1[] = _("Rain continues to fall.");
+const u8 BattleText_PourCont[] = _("The downpour continues.");
+const u8 BattleText_RainStop[] = _("The rain stopped.");
+const u8 BattleText_SandBrewed[] = _("A sandstorm brewed!");
+const u8 BattleText_SandRages[] = _("The sandstorm rages.");
+const u8 BattleText_SandSubsided[] = _("The sandstorm subsided.");
+const u8 BattleText_SunBright[] = _("The sunlight got bright!");
+const u8 BattleText_SunStrong[] = _("The sunlight is strong.");
+const u8 BattleText_SunFaded[] = _("The sunlight faded.");
+const u8 BattleText_HailStart[] = _("It started to hail!");
+const u8 BattleText_HailCont[] = _("Hail continues to fall.");
+const u8 BattleText_HailStop[] = _("The hail stopped.");
+const u8 BattleText_SpitUpFail[] = _("But it failed to SPIT UP\na thing!");
+const u8 BattleText_SwallowFail[] = _("But it failed to SWALLOW\na thing!");
+const u8 BattleText_WindHeatWave[] = _("The wind turned into a\nHEAT WAVE!");
+const u8 BattleText_StatElim[] = _("All stat changes were\neliminated!");
+const u8 BattleText_CoinScatter[] = _("Coins scattered everywhere!");
+const u8 BattleText_SubWeak[] = _("It was too weak to make\na SUBSTITUTE!");
+const u8 BattleText_PainSplit[] = _("The battlers shared\ntheir pain!");
+const u8 BattleText_BellChime[] = _("A bell chimed!");
+const u8 BattleText_PerishSong[] = _("All affected POKéMON will\nfaint in 3 turns!");
+const u8 BattleText_NoPP1[] = _("There’s no PP left for\nthis move!\p");
+const u8 BattleText_NoPP2[] = _("But there was no PP left\nfor the move!");
+const u8 BattleText_IgnoredOrdersSLP[] = _("{ATTACKING_MON} ignored\norders while asleep!");
+const u8 BattleText_IgnoredOrders[] = _("{ATTACKING_MON} ignored\norders!");
+const u8 BattleText_BeganNap[] = _("{ATTACKING_MON} began to nap!");
+const u8 BattleText_LoafingAround[] = _("{ATTACKING_MON} is\nloafing around!");
+const u8 BattleText_WontObey[] = _("{ATTACKING_MON} won’t\nobey!");
+const u8 BattleText_TurnedAway[] = _("{ATTACKING_MON} turned away!");
+const u8 BattleText_NotNotice[] = _("{ATTACKING_MON} pretended\nto not notice!");
+const u8 BattleText_WillSwitch[] = _("{STRING 25} {STRING 26} is\nabout to use {STRING 1}.\pWill {STRING 32} change\nPOKéMON?");
+const u8 BattleText_LearnedMove2[] = _("{ATTACKING_MON} learned\n{STRING 0}!");
+const u8 BattleText_PlayerDefeatedTrainer2[] = _("Player defeated\n{STRING 25} {STRING 26}!\p");
+const u8 BattleText_CreptCloser[] = _("{STRING 32} crept closer to\n{STRING 3}!");
+const u8 BattleText_CantGetCloser[] = _("{STRING 32} can’t get any closer!");
+const u8 BattleText_WatchingCarefully[] = _("{STRING 3} is watching\ncarefully!");
+const u8 BattleText_CuriousAbout[] = _("{STRING 3} is curious about\nthe {STRING 0}!");
+const u8 BattleText_EnthralledBy[] = _("{STRING 3} is enthralled by\nthe {STRING 0}!");
+const u8 BattleText_IgnoredThing[] = _("{STRING 3} completely ignored\nthe {STRING 0}!");
+const u8 BattleText_ThrewBlock[] = _("{STRING 32} threw a {POKEBLOCK}\nat the {STRING 3}!");
+const u8 BattleText_SafariOver[] = _("{PLAY_SE SE_PINPON}ANNOUNCER: You’re out of\nSAFARI BALLS! Game over!\p");
+const u8 BattleText_WildAppeared1[] = _("Wild {STRING 3} appeared!\p");
+const u8 BattleText_WildAppeared2[] = _("Wild {STRING 3} appeared!\p");
+const u8 BattleText_WildAppeared3[] = _("Wild {STRING 3} appeared!{PAUSE 127}");
+const u8 BattleText_WildDoubleAppeared[] = _("Wild {STRING 5} and\n{STRING 3} appeared!\p");
+const u8 BattleText_SingleWantToBattle1[] = _("{STRING 25} {STRING 26}\nwould like to battle!\p");
+const u8 BattleText_SingleWantToBattle2[] = _("{STRING 29}\nwants to battle!");
+const u8 BattleText_DoubleWantToBattle[] = _("{STRING 29} and {STRING 30}\nwant to battle!");
+const u8 BattleText_SentOutSingle1[] = _("{STRING 25} {STRING 26} sent\nout {STRING 3}!");
+const u8 BattleText_SentOutDouble1[] = _("{STRING 25} {STRING 26} sent\nout {STRING 3} and {STRING 5}!");
+const u8 BattleText_SentOutSingle2[] = _("{STRING 25} {STRING 26} sent\nout {STRING 0}!");
+const u8 BattleText_SentOutSingle3[] = _("{STRING 29} sent\nout {STRING 3}!");
+const u8 BattleText_SentOutDouble2[] = _("{STRING 29} sent out\n{STRING 3} and {STRING 5}!");
+const u8 BattleText_SentOutDouble3[] = _("{STRING 29} sent out\n{STRING 7}!\p{STRING 30} sent out\n{STRING 9}!");
+const u8 BattleText_SentOutSingle4[] = _("{STRING 29} sent out\n{STRING 0}!");
+const u8 BattleText_SentOutSingle5[] = _("{STRING 31} sent out\n{STRING 0}!");
+const u8 BattleText_SentOutSingle6[] = _("Go! {STRING 2}!");
+const u8 BattleText_SentOutDouble4[] = _("Go! {STRING 2} and\n{STRING 4}!");
+const u8 BattleText_SentOutSingle7[] = _("Go! {STRING 0}!");
+const u8 BattleText_SentOutSingle8[] = _("Do it! {STRING 0}!");
+const u8 BattleText_SentOutSingle9[] = _("Go for it, {STRING 0}!");
+const u8 BattleText_SentOutSingle10[] = _("Your foe’s weak!\nGet’m, {STRING 0}!");
+const u8 BattleText_SentOutSingle11[] = _("{STRING 28} sent out\n{STRING 8}!\pGo! {STRING 6}!");
+const u8 BattleText_ComeBackSingle1[] = _("{STRING 0}, that’s enough!\nCome back!");
+const u8 BattleText_ComeBackSingle2[] = _("{STRING 0}, come back!");
+const u8 BattleText_ComeBackSingle3[] = _("{STRING 0}, OK!\nCome back!");
+const u8 BattleText_ComeBackSingle4[] = _("{STRING 0}, good!\nCome back!");
+const u8 BattleText_WithdrewPoke1[] = _("{STRING 25} {STRING 26}\nwithdrew {STRING 0}!");
+const u8 BattleText_WithdrewPoke2[] = _("{STRING 29} withdrew\n{STRING 0}!");
+const u8 BattleText_WithdrewPoke3[] = _("{STRING 31} withdrew\n{STRING 0}!");
+const u8 BattleText_Wild[] = _("Wild ");
+const u8 BattleText_Foe[] = _("Foe ");
+const u8 BattleText_Foe2[] = _("Foe ");
+const u8 BattleText_Ally[] = _("Ally ");
+const u8 BattleText_Foe3[] = _("Foe ");
+const u8 BattleText_Ally2[] = _("Ally ");
+const u8 BattleText_Foe4[] = _("Foe ");
+const u8 BattleText_Ally3[] = _("Ally ");
+const u8 BattleText_OpponentUsedMove[] = _("{ATTACKING_MON} used\n{STRING 1}");
+const u8 BattleText_Exclamation2[] = _("!");
+const u8 BattleText_Exclamation3[] = _("!");
+const u8 BattleText_Exclamation4[] = _("!");
+const u8 BattleText_Exclamation5[] = _("!");
+const u8 BattleText_Exclamation[] = _("!");
+const u8 BattleStatText_HP[] = _("HP");
+const u8 BattleStatText_Attack[] = _("ATTACK");
+const u8 BattleStatText_Defense[] = _("DEFENSE");
+const u8 BattleStatText_Speed[] = _("SPEED");
+const u8 BattleStatText_SpAtk[] = _("SP. ATK");
+const u8 BattleStatText_SpDef[] = _("SP. DEF");
+const u8 BattleStatText_Accuracy[] = _("accuracy");
+const u8 BattleStatText_Evasion[] = _("evasiveness");
+const u8 ContestStatText_TooSpicy[] = _("was too spicy!");
+const u8 ContestStatText_TooDry[] = _("was too dry!");
+const u8 ContestStatText_TooSweet[] = _("was too sweet!");
+const u8 ContestStatText_TooBitter[] = _("was too bitter!");
+const u8 ContestStatText_TooSour[] = _("was too sour!");
+const u8 BattleText_Used1[] = _("{STRING 32} used\n{STRING 19}!");
+const u8 BattleText_TutorialUsed[] = _("WALLY used\n{STRING 19}!");
+const u8 BattleText_Used2[] = _("{STRING 25} {STRING 26}\nused {STRING 19}!");
+const u8 BattleText_BlockBall[] = _("The TRAINER blocked the BALL!");
+const u8 BattleText_DontBeAThief[] = _("Don’t be a thief!");
+const u8 BattleText_DodgeBall[] = _("It dodged the thrown BALL!\nThis POKéMON can’t be caught!");
+const u8 BattleText_MissPoke[] = _("You missed the POKéMON!");
+const u8 BattleText_BallBrokeOhNo[] = _("Oh, no!\nThe POKéMON broke free!");
+const u8 BattleText_BallBrokeAppeared[] = _("Aww!\nIt appeared to be caught!");
+const u8 BattleText_BallBrokeAlmost[] = _("Aargh!\nAlmost had it!");
+const u8 BattleText_BallBrokeSoClose[] = _("Shoot!\nIt was so close, too!");
+const u8 BattleText_BallCaught1[] = _("Gotcha!\n{STRING 3} was caught!{UNKNOWN_A}{PLAY_BGM BGM_KACHI22}\p");
+const u8 BattleText_BallCaught2[] = _("Gotcha!\n{STRING 3} was caught!{UNKNOWN_A}{PLAY_BGM BGM_KACHI22}{PAUSE 127}");
+const u8 BattleText_GiveNickname[] = _("Give a nickname to the\ncaptured {STRING 3}?");
+const u8 BattleText_SentToPC[] = _("{STRING 3} was sent to\n{STRING 35} PC.");
+const u8 BattleText_Someone[] = _("someone’s");
+const u8 BattleText_Lanette[] = _("LANETTE’s");
+const u8 BattleText_AddedToDex[] = _("{STRING 3}’s data was\nadded to the POKéDEX.\p");
+const u8 BattleText_Raining[] = _("It is raining.");
+const u8 BattleText_Sandstorm[] = _("A sandstorm is raging.");
+const u8 BattleText_BoxFull[] = _("The BOX is full!\nYou can’t catch any more!\p");
+const u8 BattleText_EnigmaBerry[] = _("ENIGMA BERRY");
+const u8 BattleText_Berry[] = _(" BERRY");
+const u8 BattleText_CuredParalysis[] = _("{STRING 16}’s {STRING 19}\ncured paralysis!");
+const u8 BattleText_CuredPoison[] = _("{STRING 16}’s {STRING 19}\ncured poison!");
+const u8 BattleText_CuredBurn[] = _("{STRING 16}’s {STRING 19}\nhealed its burn!");
+const u8 BattleText_CuredFreeze[] = _("{STRING 16}’s {STRING 19}\ndefrosted it!");
+const u8 BattleText_CuredSleep[] = _("{STRING 16}’s {STRING 19}\nwoke it from its sleep!");
+const u8 BattleText_CuredConfusion[] = _("{STRING 16}’s {STRING 19}\nsnapped it out of confusion!");
+const u8 BattleText_CuredStatus[] = _("{STRING 16}’s {STRING 19}\ncured its {STRING 0} problem!");
+const u8 BattleText_NormalizedStatus[] = _("{STRING 16}’s {STRING 19}\nnormalized its status!");
+const u8 BattleText_RestoredHealth[] = _("{STRING 16}’s {STRING 19}\nrestored health!");
+const u8 BattleText_RestoredPP[] = _("{STRING 16}’s {STRING 19}\nrestored {STRING 0}’s PP!");
+const u8 BattleText_RestoredStatus[] = _("{STRING 16}’s {STRING 19}\nrestored its status!");
+const u8 BattleText_RestoredHPLittle[] = _("{STRING 16}’s {STRING 19}\nrestored its HP a little!");
+const u8 BattleText_ChoiceBand[] = _("{STRING 19} allows the\nuse of only {STRING 17}!\p");
+const u8 BattleText_FocusSash[] = _("{DEFENDING_MON} hung on\nusing its {STRING 19}!");
+const u8 BattleText_Terminator2[] = _("");
+const u8 BattleText_WallyBall[] = _("You throw a BALL now, right?\nI... I’ll do my best!");
+const u8 BattleText_StartEvo[] = _("What?\n{STRING 2} is evolving!");
+const u8 BattleText_FinishEvo[] = _("Congratulations! Your {STRING 2}\nevolved into {STRING 3}!{UNKNOWN_A}\p");
+const u8 BattleText_StopEvo[] = _("Huh? {STRING 2}\nstopped evolving!\p");
+const u8 BattleText_OtherMenu[] = _("What should\n{STRING 15} do?");
+const u8 BattleText_PlayerMenu[] = _("What will\n{STRING 32} do?");
+const u8 BattleText_WallyMenu[] = _("What will\nWALLY do?");
+const u8 BattleText_LinkStandby[] = _("{PAUSE 16}Link standby...");
+const u8 BattleText_MenuOptions[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW SKY_BLUE LIGHT_BLUE WHITE2}FIGHT{CLEAR_TO 0x2E}BAG\nPOKéMON{CLEAR_TO 0x2E}RUN");
+const u8 BattleText_MenuOptionsSafari[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW SKY_BLUE LIGHT_BLUE WHITE2}BALL{CLEAR_TO 0x2E}{POKEBLOCK}\nGO NEAR{CLEAR_TO 0x2E}RUN");
+const u8 BattleText_PP[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW SKY_BLUE LIGHT_BLUE WHITE2}PP\nTYPE/");
+const u8 BattleText_Format[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW SKY_BLUE LIGHT_BLUE WHITE2}"); // cant think of a better name
+const u8 BattleText_ForgetMove[] = _("{COLOR_HIGHLIGHT_SHADOW SKY_BLUE LIGHT_BLUE WHITE2}{PALETTE 5}Which move should\nbe forgotten?");
+const u8 BattleText_YesNo[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW SKY_BLUE LIGHT_BLUE WHITE2}Yes\nNo");
+const u8 BattleText_SwitchWhich[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW SKY_BLUE LIGHT_BLUE WHITE2}Switch\nwhich?");
+const u8 BattleText_Format2[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW SKY_BLUE LIGHT_BLUE WHITE2}");
+const u8 BattleText_RightArrow[] = _("{RIGHT_ARROW}");
+const u8 BattleText_Plus[] = _("+");
+const u8 BattleText_Dash[] = _("-");
+const u8 BattleText_HP[] = _("HP ");
+const u8 BattleText_Attack[] = _("ATTACK ");
+const u8 BattleText_Defense[] = _("DEFENSE");
+const u8 BattleText_SpAtk[] = _("SP. ATK");
+const u8 BattleText_SpDef[] = _("SP. DEF");
+const u8 BattleText_SafariBalls[] = _("{HIGHLIGHT RED}SAFARI BALLS");
+const u8 BattleText_SafariBallsLeft[] = _("{HIGHLIGHT RED}Left: ");
+const u8 BattleText_HighlightRed[] = _("{HIGHLIGHT RED}");
+const u8 BattleText_Sleep[] = _("sleep");
+const u8 BattleText_PoisonStatus[] = _("poison");
+const u8 BattleText_Burn[] = _("burn");
+const u8 BattleText_Paralysis[] = _("paralysis");
+const u8 BattleText_IceStatus[] = _("ice");
+const u8 BattleText_Confusion[] = _("confusion");
+const u8 BattleText_Love[] = _("love");
+const u8 BattleText_Format3[] = _(" and ");
+const u8 BattleText_Format4[] = _(", ");
+const u8 BattleText_Format5[] = _(" ");
+const u8 BattleText_Format6[] = _("\l");
+const u8 BattleText_Format7[] = _("\n");
+const u8 BattleText_Format8[] = _("are");
+const u8 BattleText_Format9[] = _("are");
+const u8 gBadEggNickname[] = _("Bad EGG"); // 8400E3A
+const u8 BattleText_Wally[] = _("WALLY");
+const u8 BattleText_Win[] = _("{HIGHLIGHT TRANSPARENT}Win"); // 8400E48
+const u8 BattleText_Loss[] = _("{HIGHLIGHT TRANSPARENT}Loss"); // 8400E4F
+const u8 BattleText_Tie[] = _("{HIGHLIGHT TRANSPARENT}Tie"); // 8400E57
+const u8 BattleText_Format10[] = _(" is");
+const u8 BattleText_Format11[] = _("’s");
+const u8 BattleText_Normal[] = _("a NORMAL move");
+const u8 BattleText_Fighting[] = _("a FIGHTING move");
+const u8 BattleText_Flying[] = _("a FLYING move");
+const u8 BattleText_Poison[] = _("a POISON move");
+const u8 BattleText_Ground[] = _("a GROUND move");
+const u8 BattleText_Rock[] = _("a ROCK move");
+const u8 BattleText_Bug[] = _("a BUG move");
+const u8 BattleText_Ghost[] = _("a GHOST move");
+const u8 BattleText_Steel[] = _("a STEEL move");
+const u8 BattleText_Typeless[] = _("a ??? move");
+const u8 BattleText_Fire[] = _("a FIRE move");
+const u8 BattleText_Water[] = _("a WATER move");
+const u8 BattleText_Grass[] = _("a GRASS move");
+const u8 BattleText_Electric[] = _("an ELECTRIC move");
+const u8 BattleText_Psychic[] = _("a PSYCHIC move");
+const u8 BattleText_Ice[] = _("an ICE move");
+const u8 BattleText_Dragon[] = _("a DRAGON move");
+const u8 BattleText_Dark[] = _("a DARK move");
+
+const u8 *const gUnknown_08400F58[] =
+{
+ BattleStatText_HP,
+ BattleStatText_Attack,
+ BattleStatText_Defense,
+ BattleStatText_Speed,
+ BattleStatText_SpAtk,
+ BattleStatText_SpDef,
+ BattleStatText_Accuracy,
+ BattleStatText_Evasion,
+};
+
+const u8 *const gUnknown_08400F78[] =
+{
+ ContestStatText_TooSpicy,
+ ContestStatText_TooDry,
+ ContestStatText_TooSweet,
+ ContestStatText_TooBitter,
+ ContestStatText_TooSour,
+};
+
+const u8 *const gBattleStringsTable[] =
+{
+ BattleText_UnknownString,
+ BattleText_GainExpPoints,
+ BattleText_GrewLevel,
+ BattleText_LearnedMove,
+ BattleText_TryingToLearnMove,
+ BattleText_CantLearnMore,
+ BattleText_DeleteMove,
+ BattleText_DeletedMove,
+ BattleText_StopLearning,
+ BattleText_DidNotLearn,
+ BattleText_LearnedMove2,
+ BattleText_AttackMissed,
+ BattleText_ProtectedItself,
+ BattleText_StatNoHigher,
+ BattleText_AvoidedDamage,
+ BattleText_DoesntAffect,
+ BattleText_AttackingFainted,
+ BattleText_DefendingFainted,
+ BattleText_WinningPrize,
+ BattleText_OutOfUsablePoke,
+ BattleText_WhitedOut,
+ BattleText_PreventEscape,
+ BattleText_HitMulti,
+ BattleText_FellAsleep,
+ BattleText_MadeAsleep,
+ BattleText_DefendingAsleep,
+ BattleText_AttackingAsleep,
+ BattleText_WasntAffected,
+ BattleText_Poisoned,
+ BattleText_Poisoned2,
+ BattleText_PoisonHurt,
+ BattleText_AlreadyPoisoned,
+ BattleText_BadlyPoisoned,
+ BattleText_EnergyDrained,
+ BattleText_Burned,
+ BattleText_Burned2,
+ BattleText_BurnHurt,
+ BattleText_Frozen,
+ BattleText_Frozen2,
+ BattleText_FrozenSolid,
+ BattleText_DefendingDefrosted,
+ BattleText_AttackingDefrosted,
+ BattleText_Defrosted,
+ BattleText_Paralyzed,
+ BattleText_Paralyzed2,
+ BattleText_Paralyzed3,
+ BattleText_AlreadyParalyzed,
+ BattleText_ParalysisHealed,
+ BattleText_DreamEaten,
+ BattleText_AttackingStatNoHigher,
+ BattleText_DefendingStatNoHigher,
+ BattleText_StoppedWorking,
+ BattleText_StoppedWorking2,
+ BattleText_Confused,
+ BattleText_ConfusionSnapOut,
+ BattleText_BecameConfused,
+ BattleText_AlreadyConfused,
+ BattleText_FellLove,
+ BattleText_InLoveWith,
+ BattleText_ImmobilizedBy,
+ BattleText_BlownAway,
+ BattleText_TypeTransform,
+ BattleText_Flinched,
+ BattleText_RegainedHealth,
+ BattleText_HPFull,
+ BattleText_RaisedSpDef,
+ BattleText_RaisedDefense,
+ BattleText_CoveredVeil,
+ BattleText_SafeguardActive,
+ BattleText_SafeguardFaded,
+ BattleText_WentToSleep,
+ BattleText_SpeltHealthy,
+ BattleText_WhipWhirlwind,
+ BattleText_TookSunlight,
+ BattleText_LoweredHead,
+ BattleText_IsGlowing,
+ BattleText_FlewHigh,
+ BattleText_DugHole,
+ BattleText_SqueezedBind,
+ BattleText_TrappedVortex,
+ BattleText_Wrapped,
+ BattleText_Clamped,
+ BattleText_HurtBy,
+ BattleText_FreedFrom,
+ BattleText_KeptGoingCrash,
+ BattleText_MistShroud,
+ BattleText_MistProtect,
+ BattleText_GetPumped,
+ BattleText_HitRecoil,
+ BattleText_ProtectedItself2,
+ BattleText_SandBuffeted,
+ BattleText_HailStricken,
+ BattleText_WasSeeded,
+ BattleText_EvadedAttack,
+ BattleText_HealthSapped,
+ BattleText_FastAsleep,
+ BattleText_WokeUp,
+ BattleText_UproarAwake,
+ BattleText_UproarWoke,
+ BattleText_UproarCaused,
+ BattleText_UproarMaking,
+ BattleText_CalmedDown,
+ BattleText_UproarCantSleep,
+ BattleText_Stockpiled,
+ BattleText_StockpiledCant,
+ BattleText_UproarCantSleep2,
+ BattleText_UproarKeptAwake,
+ BattleText_StayedAwake,
+ BattleText_StoringEnergy,
+ BattleText_UnleashedEnergy,
+ BattleText_FatigueConfuse,
+ BattleText_PickedUpYen,
+ BattleText_Unaffected,
+ BattleText_Transformed,
+ BattleText_SubMade,
+ BattleText_SubAlready,
+ BattleText_SubTookDamage,
+ BattleText_SubFaded,
+ BattleText_MustRecharge,
+ BattleText_RageBuilding,
+ BattleText_MoveWasDisabled,
+ BattleText_MoveIsDisabled,
+ BattleText_DisabledNoMore,
+ BattleText_EncoreGot,
+ BattleText_EncoreEnded,
+ BattleText_TookAim,
+ BattleText_SketchedMove,
+ BattleText_DestinyBondTake,
+ BattleText_DestinyBondTaken,
+ BattleText_ReducedBy,
+ BattleText_StoleSomething,
+ BattleText_CantEscapeNow,
+ BattleText_NightmareStart,
+ BattleText_NightmareLock,
+ BattleText_CurseLay,
+ BattleText_CurseAfflict,
+ BattleText_SpikesScattered,
+ BattleText_SpikesHurt,
+ BattleText_IdentifiedPoke,
+ BattleText_PerishSongFell,
+ BattleText_BracedItself,
+ BattleText_EnduredHit,
+ BattleText_MagnitudeCount,
+ BattleText_CutHPMaxATK,
+ BattleText_CopyStatChanges,
+ BattleText_GotFreeFrom,
+ BattleText_LeechShed,
+ BattleText_SpikesBlownAway,
+ BattleText_FledBattle,
+ BattleText_ForesawAttack,
+ BattleText_TookAttack,
+ BattleText_PokeAttack,
+ BattleText_CenterAttention,
+ BattleText_ChargingPower,
+ BattleText_NaturePower,
+ BattleText_StatusNormal,
+ BattleText_NoMovesLeft,
+ BattleText_TormentSubject,
+ BattleText_TormentNoUse,
+ BattleText_TightenFocus,
+ BattleText_TauntFell,
+ BattleText_TauntNoUse,
+ BattleText_ReadyToHelp,
+ BattleText_SwitchedItems,
+ BattleText_CopiedObject,
+ BattleText_WishMade,
+ BattleText_WishTrue,
+ BattleText_PlantedRoots,
+ BattleText_AbsorbNutrients,
+ BattleText_AnchoredItself,
+ BattleText_DrowsyMade,
+ BattleText_KnockedOffItem,
+ BattleText_AbilitySwap,
+ BattleText_SealedMove,
+ BattleText_SealedNoUse,
+ BattleText_GrudgeBear,
+ BattleText_GrudgeLosePP,
+ BattleText_ShroudedItself,
+ BattleText_MagicCoatBounce,
+ BattleText_AwaitMove,
+ BattleText_SnatchedMove,
+ BattleText_RainMade,
+ BattleText_SpeedRisen,
+ BattleText_ProtectedBy,
+ BattleText_PreventedBy,
+ BattleText_HPRestoredUsing,
+ BattleText_MadeType,
+ BattleText_PreventedPara,
+ BattleText_PreventedRomance,
+ BattleText_PreventedPoison,
+ BattleText_PreventedConfusion,
+ BattleText_RaisedFirePower,
+ BattleText_AnchorsItself,
+ BattleText_CutsAttack,
+ BattleText_PreventedStatLoss,
+ BattleText_HurtOther,
+ BattleText_Traced,
+ BattleText_Sharply,
+ BattleText_Rose,
+ BattleText_Harshly,
+ BattleText_Fell,
+ BattleText_UnknownString7,
+ BattleText_UnknownString3,
+ BattleText_UnknownString5,
+ BattleText_UnknownString6,
+ BattleText_Critical,
+ BattleText_GrandSlam,
+ BattleText_MoveForget123,
+ BattleText_MoveForgetAnd,
+ BattleText_NotEffective,
+ BattleText_SuperEffective,
+ BattleText_GotAwaySafely,
+ BattleText_FledWild,
+ BattleText_NoRunning,
+ BattleText_CantEscape2,
+ BattleText_BirchDontLeaveMe,
+ BattleText_Nothing,
+ BattleText_Failed,
+ BattleText_HurtItself,
+ BattleText_MirrorFail,
+ BattleText_RainStart,
+ BattleText_PourStart,
+ BattleText_RainCont1,
+ BattleText_PourCont,
+ BattleText_RainStop,
+ BattleText_SandBrewed,
+ BattleText_SandRages,
+ BattleText_SandSubsided,
+ BattleText_SunBright,
+ BattleText_SunStrong,
+ BattleText_SunFaded,
+ BattleText_HailStart,
+ BattleText_HailCont,
+ BattleText_HailStop,
+ BattleText_SpitUpFail,
+ BattleText_SwallowFail,
+ BattleText_WindHeatWave,
+ BattleText_StatElim,
+ BattleText_CoinScatter,
+ BattleText_SubWeak,
+ BattleText_PainSplit,
+ BattleText_BellChime,
+ BattleText_PerishSong,
+ BattleText_NoPP1,
+ BattleText_NoPP2,
+ BattleText_Used1,
+ BattleText_TutorialUsed,
+ BattleText_BlockBall,
+ BattleText_DontBeAThief,
+ BattleText_DodgeBall,
+ BattleText_MissPoke,
+ BattleText_BallBrokeOhNo,
+ BattleText_BallBrokeAppeared,
+ BattleText_BallBrokeAlmost,
+ BattleText_BallBrokeSoClose,
+ BattleText_BallCaught1,
+ BattleText_BallCaught2,
+ BattleText_GiveNickname,
+ BattleText_SentToPC,
+ BattleText_AddedToDex,
+ BattleText_Raining,
+ BattleText_Sandstorm,
+ BattleText_CantEscape,
+ BattleText_IgnoredOrdersSLP,
+ BattleText_IgnoredOrders,
+ BattleText_BeganNap,
+ BattleText_LoafingAround,
+ BattleText_WontObey,
+ BattleText_TurnedAway,
+ BattleText_NotNotice,
+ BattleText_WillSwitch,
+ BattleText_CreptCloser,
+ BattleText_CantGetCloser,
+ BattleText_WatchingCarefully,
+ BattleText_CuriousAbout,
+ BattleText_EnthralledBy,
+ BattleText_IgnoredThing,
+ BattleText_ThrewBlock,
+ BattleText_SafariOver,
+ BattleText_CuredParalysis,
+ BattleText_CuredPoison,
+ BattleText_CuredBurn,
+ BattleText_CuredFreeze,
+ BattleText_CuredSleep,
+ BattleText_CuredConfusion,
+ BattleText_CuredStatus,
+ BattleText_RestoredHealth,
+ BattleText_RestoredPP,
+ BattleText_RestoredStatus,
+ BattleText_RestoredHPLittle,
+ BattleText_ChoiceBand,
+ BattleText_FocusSash,
+ BattleText_Terminator2,
+ BattleText_PreventedBurn,
+ BattleText_BlocksOther,
+ BattleText_RestoredHPByItem,
+ BattleText_WhipSandstorm,
+ BattleText_PreventedLoss,
+ BattleText_InfatuatedPoke,
+ BattleText_MadeIneffective,
+ BattleText_CuredProblem,
+ BattleText_OozeSuckup,
+ BattleText_Transformed2,
+ BattleText_ElecWeakened,
+ BattleText_FireWeakened,
+ BattleText_HidUnderwater,
+ BattleText_SprangUp,
+ BattleText_CantForgetHM,
+ BattleText_FoundOne,
+ BattleText_PlayerDefeatedTrainer2,
+ BattleText_SoothingAroma,
+ BattleText_CantUseItems,
+ BattleText_UnknownString2,
+ BattleText_UnknownString4,
+ BattleText_HustleUse,
+ BattleText_MadeUseless,
+ BattleText_SandTombTrapped,
+ BattleText_Terminator,
+ BattleText_BoostedExp,
+ BattleText_SunIntensified,
+ BattleText_GroundMoveNegate,
+ BattleText_WallyBall,
+ BattleText_TookAttack2,
+ BattleText_ChoseDestiny,
+ BattleText_LostFocus,
+ BattleText_UseNext,
+ BattleText_FledUsingItem,
+ BattleText_FledUsingOther,
+ BattleText_DraggedOut,
+ BattleText_PreventedOther,
+ BattleText_NormalizedStatus,
+ BattleText_Used2,
+ BattleText_BoxFull,
+ BattleText_AvoidedAttack,
+ BattleText_MadeIneffective2,
+ BattleText_PreventedFlinching,
+ BattleText_AlreadyBurned,
+ BattleText_StatNoLower,
+ BattleText_BlocksOther2,
+ BattleText_WoreOff,
+ BattleText_RaisedDefenseLittle,
+ BattleText_RaisedSpDefLittle,
+ BattleText_BrokeWall,
+ BattleText_PreventedOther2,
+ BattleText_CuredOfProblem,
+ BattleText_AttackingCantEscape,
+ BattleText_Obtained1,
+ BattleText_Obtained2,
+ BattleText_Obtained3,
+ BattleText_NoEffect,
+ BattleText_NoEffectOn,
+};
+
+// below are lists of battle string enums and NOT pointers to the strings.
+const u16 gMissStrings[] =
+{
+ BATTLE_TEXT_AttackMissed,
+ BATTLE_TEXT_ProtectedItself,
+ BATTLE_TEXT_AvoidedAttack,
+ BATTLE_TEXT_AvoidedDamage,
+ BATTLE_TEXT_GroundMoveNegate,
+};
+
+const u16 gNoEscapeStringIds[] =
+{
+ BATTLE_TEXT_CantEscape2,
+ BATTLE_TEXT_BirchDontLeaveMe,
+ BATTLE_TEXT_PreventEscape,
+ BATTLE_TEXT_CantEscape,
+ BATTLE_TEXT_AttackingCantEscape,
+};
+
+const u16 gMoveWeatherChangeStringIds[] =
+{
+ BATTLE_TEXT_RainStart,
+ BATTLE_TEXT_PourStart,
+ BATTLE_TEXT_Failed,
+ BATTLE_TEXT_SandBrewed,
+ BATTLE_TEXT_SunBright,
+ BATTLE_TEXT_HailStart,
+};
+
+const u16 gSandStormHailContinuesStringIds[] =
+{
+ BATTLE_TEXT_SandRages,
+ BATTLE_TEXT_HailCont,
+};
+
+const u16 gSandStormHailDmgStringIds[] =
+{
+ BATTLE_TEXT_SandBuffeted,
+ BATTLE_TEXT_HailStricken,
+};
+
+const u16 gSandStormHailEndStringIds[] =
+{
+ BATTLE_TEXT_SandSubsided,
+ BATTLE_TEXT_HailStop,
+};
+
+const u16 gRainContinuesStringIds[] =
+{
+ BATTLE_TEXT_RainCont1,
+ BATTLE_TEXT_PourCont,
+ BATTLE_TEXT_RainStop,
+};
+
+const u16 gProtectLikeUsedStringIds[] =
+{
+ BATTLE_TEXT_ProtectedItself2,
+ BATTLE_TEXT_BracedItself,
+ BATTLE_TEXT_Failed,
+};
+
+const u16 gReflectLightScreenSafeguardStringIds[] =
+{
+ BATTLE_TEXT_Failed,
+ BATTLE_TEXT_RaisedDefense,
+ BATTLE_TEXT_RaisedDefenseLittle,
+ BATTLE_TEXT_RaisedSpDef,
+ BATTLE_TEXT_RaisedSpDefLittle,
+ BATTLE_TEXT_CoveredVeil,
+};
+
+const u16 gLeechSeedStringIds[] =
+{
+ BATTLE_TEXT_WasSeeded,
+ BATTLE_TEXT_EvadedAttack,
+ BATTLE_TEXT_DoesntAffect,
+ BATTLE_TEXT_HealthSapped,
+ BATTLE_TEXT_OozeSuckup,
+};
+
+const u16 gRestUsedStringIds[] =
+{
+ BATTLE_TEXT_WentToSleep,
+ BATTLE_TEXT_SpeltHealthy,
+};
+
+const u16 gUproarOverTurnStringIds[] =
+{
+ BATTLE_TEXT_UproarMaking,
+ BATTLE_TEXT_CalmedDown,
+};
+
+const u16 gStockpileUsedStringIds[] =
+{
+ BATTLE_TEXT_Stockpiled,
+ BATTLE_TEXT_StockpiledCant,
+};
+
+const u16 gWokeUpStringIds[] =
+{
+ BATTLE_TEXT_WokeUp,
+ BATTLE_TEXT_UproarWoke,
+};
+
+const u16 gSwallowFailStringIds[] =
+{
+ BATTLE_TEXT_SwallowFail,
+ BATTLE_TEXT_HPFull,
+};
+
+const u16 gUproarAwakeStringIds[] =
+{
+ BATTLE_TEXT_UproarCantSleep2,
+ BATTLE_TEXT_UproarKeptAwake,
+ BATTLE_TEXT_StayedAwake,
+};
+
+const u16 gStatUpStringIds[] =
+{
+ BATTLE_TEXT_UnknownString7,
+ BATTLE_TEXT_UnknownString3,
+ BATTLE_TEXT_AttackingStatNoHigher,
+ BATTLE_TEXT_Terminator2,
+ BATTLE_TEXT_UnknownString4,
+ BATTLE_TEXT_HustleUse,
+};
+
+const u16 gStatDownStringIds[] =
+{
+ BATTLE_TEXT_UnknownString5,
+ BATTLE_TEXT_UnknownString6,
+ BATTLE_TEXT_DefendingStatNoHigher,
+ BATTLE_TEXT_Terminator2,
+};
+
+const u16 gFirstTurnOfTwoStringIds[] =
+{
+ BATTLE_TEXT_WhipWhirlwind,
+ BATTLE_TEXT_TookSunlight,
+ BATTLE_TEXT_LoweredHead,
+ BATTLE_TEXT_IsGlowing,
+ BATTLE_TEXT_FlewHigh,
+ BATTLE_TEXT_DugHole,
+ BATTLE_TEXT_HidUnderwater,
+ BATTLE_TEXT_SprangUp,
+};
+
+const u16 gWrappedStringIds[] =
+{
+ BATTLE_TEXT_SqueezedBind,
+ BATTLE_TEXT_Wrapped,
+ BATTLE_TEXT_TrappedVortex,
+ BATTLE_TEXT_Clamped,
+ BATTLE_TEXT_TrappedVortex,
+ BATTLE_TEXT_SandTombTrapped,
+};
+
+const u16 gMistUsedStringIds[] =
+{
+ BATTLE_TEXT_MistShroud,
+ BATTLE_TEXT_Failed,
+};
+
+const u16 gFocusEnergyUsedStringIds[] =
+{
+ BATTLE_TEXT_GetPumped,
+ BATTLE_TEXT_Failed,
+};
+
+const u16 gTransformUsedStringIds[] =
+{
+ BATTLE_TEXT_Transformed,
+ BATTLE_TEXT_Failed,
+};
+
+const u16 gSubsituteUsedStringIds[] =
+{
+ BATTLE_TEXT_SubMade,
+ BATTLE_TEXT_SubWeak,
+};
+
+const u16 gGotPoisonedStringIds[] =
+{
+ BATTLE_TEXT_Poisoned,
+ BATTLE_TEXT_Poisoned2,
+};
+
+const u16 gGotParalyzedStringIds[] =
+{
+ BATTLE_TEXT_Paralyzed,
+ BATTLE_TEXT_Paralyzed2,
+};
+
+const u16 gFellAsleepStringIds[] =
+{
+ BATTLE_TEXT_FellAsleep,
+ BATTLE_TEXT_MadeAsleep,
+};
+
+const u16 gGotBurnedStringIds[] =
+{
+ BATTLE_TEXT_Burned,
+ BATTLE_TEXT_Burned2,
+};
+
+const u16 gGotFrozenStringIds[] =
+{
+ BATTLE_TEXT_Frozen,
+ BATTLE_TEXT_Frozen2,
+};
+
+const u16 gGotDefrostedStringIds[] =
+{
+ BATTLE_TEXT_AttackingDefrosted,
+ BATTLE_TEXT_Defrosted,
+};
+
+const u16 gKOFailedStringIds[] =
+{
+ BATTLE_TEXT_AttackMissed,
+ BATTLE_TEXT_Unaffected,
+ BATTLE_TEXT_FellLove,
+ BATTLE_TEXT_InfatuatedPoke,
+};
+
+const u16 gLeechSeedDrainStringIds[] =
+{
+ BATTLE_TEXT_EnergyDrained,
+ BATTLE_TEXT_OozeSuckup,
+};
+
+const u16 gSportsUsedStringIds[] =
+{
+ BATTLE_TEXT_ElecWeakened,
+ BATTLE_TEXT_FireWeakened,
+};
+
+const u16 gPartyStatusHealStringIds[] =
+{
+ BATTLE_TEXT_BellChime,
+ BATTLE_TEXT_BellChime,
+ BATTLE_TEXT_BellChime,
+ BATTLE_TEXT_BellChime,
+ BATTLE_TEXT_SoothingAroma,
+};
+
+const u16 gFutureMoveUsedStringIds[] =
+{
+ BATTLE_TEXT_ForesawAttack,
+ BATTLE_TEXT_ChoseDestiny,
+};
+
+const u16 gBallEscapeStringIds[] =
+{
+ BATTLE_TEXT_BallBrokeOhNo,
+ BATTLE_TEXT_BallBrokeAppeared,
+ BATTLE_TEXT_BallBrokeAlmost,
+ BATTLE_TEXT_BallBrokeSoClose,
+};
+
+const u16 gWeatherContinuesStringIds[] =
+{
+ BATTLE_TEXT_Raining,
+ BATTLE_TEXT_Raining,
+ BATTLE_TEXT_Raining,
+ BATTLE_TEXT_Raining,
+ BATTLE_TEXT_Raining,
+ BATTLE_TEXT_Raining,
+ BATTLE_TEXT_Raining,
+ BATTLE_TEXT_Raining,
+ BATTLE_TEXT_Sandstorm,
+ BATTLE_TEXT_Raining,
+ BATTLE_TEXT_Raining,
+ BATTLE_TEXT_Raining,
+ BATTLE_TEXT_SunStrong,
+ BATTLE_TEXT_Raining,
+ BATTLE_TEXT_Raining,
+ BATTLE_TEXT_Raining,
+};
+
+const u16 gInobedientStringIds[] =
+{
+ BATTLE_TEXT_LoafingAround,
+ BATTLE_TEXT_WontObey,
+ BATTLE_TEXT_TurnedAway,
+ BATTLE_TEXT_NotNotice,
+};
+
+const u16 gSafariGetNearStringIds[] =
+{
+ BATTLE_TEXT_CreptCloser,
+ BATTLE_TEXT_CantGetCloser,
+};
+
+const u16 gSafariPokeblockResultStringIds[] =
+{
+ BATTLE_TEXT_CuriousAbout,
+ BATTLE_TEXT_EnthralledBy,
+ BATTLE_TEXT_IgnoredThing,
+};
+
+const u16 gTrainerItemCuredStatusStringIds[] =
+{
+ BATTLE_TEXT_CuredConfusion,
+ BATTLE_TEXT_CuredParalysis,
+ BATTLE_TEXT_CuredFreeze,
+ BATTLE_TEXT_CuredBurn,
+ BATTLE_TEXT_CuredPoison,
+ BATTLE_TEXT_CuredSleep,
+};
+
+const u16 gBerryEffectStringIds[] =
+{
+ BATTLE_TEXT_CuredStatus,
+ BATTLE_TEXT_NormalizedStatus,
+};
+
+const u16 gBRNPreventionStringIds[] =
+{
+ BATTLE_TEXT_PreventedBurn,
+ BATTLE_TEXT_PreventedOther2,
+ BATTLE_TEXT_NoEffectOn,
+};
+
+const u16 gPRLZPreventionStringIds[] =
+{
+ BATTLE_TEXT_PreventedPara,
+ BATTLE_TEXT_PreventedOther2,
+ BATTLE_TEXT_NoEffectOn,
+};
+
+const u16 gPSNPreventionStringIds[] =
+{
+ BATTLE_TEXT_PreventedPoison,
+ BATTLE_TEXT_PreventedOther2,
+ BATTLE_TEXT_NoEffectOn,
+};
+
+const u16 gItemSwapStringIds[] =
+{
+ BATTLE_TEXT_Obtained1,
+ BATTLE_TEXT_Obtained2,
+ BATTLE_TEXT_Obtained3,
+};
+
+const u16 gFlashFireStringIds[] =
+{
+ BATTLE_TEXT_RaisedFirePower,
+ BATTLE_TEXT_MadeIneffective,
+};
+
+const u16 gTrappingMoves[] =
+{
+ MOVE_BIND,
+ MOVE_WRAP,
+ MOVE_FIRE_SPIN,
+ MOVE_CLAMP,
+ MOVE_WHIRLPOOL,
+ MOVE_SAND_TOMB,
+ 0xFFFF,
+};
+
+const u8 *const gUnknown_0840165C[] =
+{
+ BattleText_HP,
+ BattleText_SpAtk,
+ BattleText_Attack,
+ BattleText_SpDef,
+ BattleText_Defense,
+ BattleStatText_Speed,
+};
+
+const u8 *const gUnknown_08401674[] =
+{
+ BattleText_Normal,
+ BattleText_Fighting,
+ BattleText_Flying,
+ BattleText_Poison,
+ BattleText_Ground,
+ BattleText_Rock,
+ BattleText_Bug,
+ BattleText_Ghost,
+ BattleText_Steel,
+ BattleText_Typeless,
+ BattleText_Fire,
+ BattleText_Water,
+ BattleText_Grass,
+ BattleText_Electric,
+ BattleText_Psychic,
+ BattleText_Ice,
+ BattleText_Dragon,
+ BattleText_Dark,
+};
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..ae204f8ea
--- /dev/null
+++ b/src/data/battle_tower/trainers.h
@@ -0,0 +1,1503 @@
+const struct BattleTowerTrainer gBattleTowerTrainers[] =
+{
+ {
+ .trainerClass = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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..db226c6a6
--- /dev/null
+++ b/src/data/battle_tower/trainers_de.h
@@ -0,0 +1,1503 @@
+const struct BattleTowerTrainer gBattleTowerTrainers[] =
+{
+ {
+ .trainerClass = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_CLASS_LASS,
+ .name = _("JOSI"),
+ .teamFlags = 0x02,
+ .greeting = {
+ .easyChat = {
+ EC_WORD_BE,
+ EC_WORD_KIND,
+ EC_WORD_TO,
+ EC_WORD_GIRL,
+ 0xFFFF,
+ 0xFFFF,
+ },
+ },
+ },
+ {
+ .trainerClass = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_CLASS_DRAGON_TAMER,
+ .name = _("NATHAN"),
+ .teamFlags = 0x10,
+ .greeting = {
+ .easyChat = {
+ EC_WORD_DRAGON,
+ 0xFFFF,
+ EC_WORD_POKEMON,
+ EC_WORD_THOSE,
+ EC_WORD_FANTASTIC,
+ 0xFFFF,
+ },
+ },
+ },
+ {
+ .trainerClass = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_CLASS_EXPERT_M,
+ .name = _("MALTE"),
+ .teamFlags = 0x10,
+ .greeting = {
+ .easyChat = {
+ EC_WORD_LEARN,
+ EC_WORD_CORRECT,
+ EC_WORD_TO,
+ EC_WORD_FIGHT,
+ 0xFFFF,
+ 0xFFFF,
+ },
+ },
+ },
+ {
+ .trainerClass = FACILITY_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 = FACILITY_CLASS_GUITARIST,
+ .name = _("GAVIN"),
+ .teamFlags = 0x01,
+ .greeting = {
+ .easyChat = {
+ EC_WORD_SHADY,
+ EC_WORD_BABY,
+ EC_WORD_BABY,
+ EC_WORD_BABY,
+ 0xFFFF,
+ 0xFFFF,
+ },
+ },
+ },
+ {
+ .trainerClass = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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 = FACILITY_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/credits_de.h b/src/data/credits_de.h
new file mode 100755
index 000000000..570c0d4c5
--- /dev/null
+++ b/src/data/credits_de.h
@@ -0,0 +1,624 @@
+static const u8 Text_Version_Ruby[] = _("POKéMON RUBIN-EDITION");
+static const u8 Text_Version_Sapphire[] = _("POKéMON SAPHIR-EDITION");
+static const u8 Category_Credits[] = _("{PALETTE 9}Credits");
+static const u8 Category_ExecutiveDirector[] = _("{PALETTE 9}Executive Director");
+static const u8 Category_Director[] = _("{PALETTE 9}Director");
+static const u8 Category_ArtDirector[] = _("{PALETTE 9}Art Director");
+static const u8 Category_BattleDirector[] = _("{PALETTE 9}Battle Director");
+static const u8 Category_MainProgrammer[] = _("{PALETTE 9}Main Programmer");
+static const u8 Category_BattleSystemProgrammer[] = _("{PALETTE 9}Battle System Programmer");
+static const u8 Category_FieldSystemProgrammer[] = _("{PALETTE 9}Field System Programmer");
+static const u8 Category_Programmers[] = _("{PALETTE 9}Programmers");
+static const u8 Category_MainGraphicDesigner[] = _("{PALETTE 9}Main Graphic Designer");
+static const u8 Category_POKeMONGraphicDesigners[] = _("{PALETTE 9}POKéMON & Graphic Designers");
+static const u8 Category_POKeMONDesigners[] = _("{PALETTE 9}POKéMON Designers");
+static const u8 Category_MusicComposition[] = _("{PALETTE 9}Music Composition");
+static const u8 Category_SoundEffectsPOKeMONVoices[] = _("{PALETTE 9}Sound Effects & POKéMON Voices");
+static const u8 Category_GameDesigners[] = _("{PALETTE 9}Game Designers");
+static const u8 Category_PlotScenario[] = _("{PALETTE 9}Plot Scenario");
+static const u8 Category_GameScenario[] = _("{PALETTE 9}Game Scenario");
+static const u8 Category_ScriptDesigners[] = _("{PALETTE 9}Script Designers");
+static const u8 Category_MapDesigners[] = _("{PALETTE 9}Map Designers");
+static const u8 Category_MapDataDesigners[] = _("{PALETTE 9}Map Data Designers");
+static const u8 Category_ParametricDesigners[] = _("{PALETTE 9}Parametric Designers");
+static const u8 Category_POKeDEXText[] = _("{PALETTE 9}POKéDEX Text");
+static const u8 Category_EnvironmentToolProgrammers[] = _("{PALETTE 9}Environment & Tool Programmers");
+static const u8 Category_ProductTesting[] = _("{PALETTE 9}Product Testing");
+static const u8 Category_SpecialThanks[] = _("{PALETTE 9}Special Thanks");
+static const u8 Category_Coordinators[] = _("{PALETTE 9}Coordinators");
+static const u8 Category_Producers[] = _("{PALETTE 9}Producers");
+static const u8 Category_ExecutiveProducers[] = _("{PALETTE 9}Executive Producers");
+static const u8 Category_InformationSupervisors[] = _("{PALETTE 9}Information Supervisors");
+static const u8 Category_TaskManagers[] = _("{PALETTE 9}Task Managers");
+static const u8 Category_BrailleCodeCheck[] = _("{PALETTE 9}Braille Code Check");
+static const u8 Category_GermanVersionCoordinators[] = _("{PALETTE 9}German Version Coordinators");
+static const u8 Category_Translators[] = _("{PALETTE 9}Translators");
+static const u8 Category_ProductSupport[] = _("{PALETTE 9}Product Support");
+static const u8 Category_Artwork[] = _("{PALETTE 9}Artwork");
+static const u8 Category_TextEditor[] = _("{PALETTE 9}Text Editor");
+static const u8 Category_NOEProductTesting[] = _("{PALETTE 9}NOE Product Testing");
+static const u8 Category_GraphicDesigners[] = _("{PALETTE 9}Graphic Designers");
+static const u8 Text_SatoshiTajiri[] = _("Satoshi Tajiri");
+static const u8 Text_Masuda[] = _("Junichi Masuda");
+static const u8 Text_Sugimori[] = _("Ken Sugimori");
+static const u8 Text_Morimoto[] = _("Shigeki Morimoto");
+static const u8 Text_TetsuyaWatanabe[] = _("Tetsuya Watanabe");
+static const u8 Text_Sogabe[] = _("Hisashi Sogabe");
+static const u8 Text_Tamada[] = _("Sousuke Tamada");
+static const u8 Text_Mori[] = _("Akito Mori");
+static const u8 Text_Kagaya[] = _("Keita Kagaya");
+static const u8 Text_Matsuda[] = _("Yoshinori Matsuda");
+static const u8 Text_HiroyukiNakamura[] = _("Hiroyuki Nakamura");
+static const u8 Text_Taya[] = _("Masao Taya");
+static const u8 Text_Nohara[] = _("Satoshi Nohara");
+static const u8 Text_TomomichiOhta[] = _("Tomomichi Ohta");
+static const u8 Text_Iwasawa[] = _("Miyuki Iwasawa");
+static const u8 Text_TakenoriOhta[] = _("Takenori Ohta");
+static const u8 Text_Yoshida[] = _("Hironobu Yoshida");
+static const u8 Text_Fujiwara[] = _("Motofumi Fujiwara");
+static const u8 Text_SatoshiOhta[] = _("Satoshi Ohta");
+static const u8 Text_Iwashita[] = _("Asuka Iwashita");
+static const u8 Text_Tomita[] = _("Aimi Tomita");
+static const u8 Text_Unno[] = _("Takao Unno");
+static const u8 Text_Eo[] = _("Kanako Eo");
+static const u8 Text_Okutani[] = _("Jun Okutani");
+static const u8 Text_Nishida[] = _("Atsuko Nishida");
+static const u8 Text_Saito[] = _("Muneo Saito");
+static const u8 Text_Yoshikawa[] = _("Rena Yoshikawa");
+static const u8 Text_Ichinose[] = _("Go Ichinose");
+static const u8 Text_Aoki[] = _("Morikazu Aoki");
+static const u8 Text_Nishino[] = _("Koji Nishino");
+static const u8 Text_Matsushima[] = _("Kenji Matsushima");
+static const u8 Text_TetsujiOhta[] = _("Tetsuji Ohta");
+static const u8 Text_Sato[] = _("Hitomi Sato");
+static const u8 Text_Kawachimaru[] = _("Takeshi Kawachimaru");
+static const u8 Text_Shimoyamada[] = _("Teruyuki Shimoyamada");
+static const u8 Text_Ohmori[] = _("Shigeru Ohmori");
+static const u8 Text_Takahashi[] = _("Tadashi Takahashi");
+static const u8 Text_ToshinobuMatsumiya[] = _("Toshinobu Matsumiya");
+static const u8 Text_Tomisawa[] = _("Akihito Tomisawa");
+static const u8 Text_Enomoto[] = _("Hiroki Enomoto");
+static const u8 Text_Terada[] = _("Kazuyuki Terada");
+static const u8 Text_Sakurai[] = _("Yuri Sakurai");
+static const u8 Text_Sagawa[] = _("Hiromi Sagawa");
+static const u8 Text_Tominaga[] = _("Kenji Tominaga");
+static const u8 Text_YoshioTajiri[] = _("Yoshio Tajiri");
+static const u8 Text_Sasaki[] = _("Teiko Sasaki");
+static const u8 Text_Hamano[] = _("Sachiko Hamano");
+static const u8 Text_ChieMatsumiya[] = _("Chie Matsumiya");
+static const u8 Text_Shinozaki[] = _("Akiko Shinozaki");
+static const u8 Text_Fujii[] = _("Atsuko Fujii");
+static const u8 Text_SuperMarioClub[] = _("NCL Super Mario Club");
+static const u8 Text_Tada[] = _("Atsushi Tada");
+static const u8 Text_Ohnishi[] = _("Takahiro Ohnishi");
+static const u8 Text_Okamura[] = _("Norihide Okamura");
+static const u8 Text_HiroNakamura[] = _("Hiro Nakamura");
+static const u8 Text_Uesugi[] = _("Hiroyuki Uesugi");
+static const u8 Text_Murakawa[] = _("Teruki Murakawa");
+static const u8 Text_Kinashi[] = _("Akira Kinashi");
+static const u8 Text_Takizawa[] = _("Michiko Takizawa");
+static const u8 Text_Takada[] = _("Makiko Takada");
+static const u8 Text_Kondo[] = _("Takanao Kondo");
+static const u8 Text_Mashima[] = _("Ai Mashima");
+static const u8 Text_Nomoto[] = _("Gakuji Nomoto");
+static const u8 Text_Izushi[] = _("Takehiro Izushi");
+static const u8 Text_Yamagami[] = _("Hitoshi Yamagami");
+static const u8 Text_KyokoWatanabe[] = _("Kyoko Watanabe");
+static const u8 Text_Nakano[] = _("Takao Nakano");
+static const u8 Text_Jinnai[] = _("Hiroyuki Jinnai");
+static const u8 Text_Tsuru[] = _("Hiroaki Tsuru");
+static const u8 Text_Ishihara[] = _("Tsunekaz Ishihara");
+static const u8 Text_Iwata[] = _("Satoru Iwata");
+static const u8 Text_Suyama[] = _("Kazuya Suyama");
+static const u8 Text_Mitsuhara[] = _("Satoshi Mitsuhara");
+static const u8 Text_JapanBrailleLibrary[] = _("Japan Braille Library");
+static const u8 Text_Komura[] = _("Tomotaka Komura");
+static const u8 Text_Ohashi[] = _("Mikiko Ohashi");
+static const u8 Text_Yamamoto[] = _("Souichi Yamamoto");
+static const u8 Text_Funakoshi[] = _("Masanori Funakoshi");
+static const u8 Text_Nakamichi[] = _("Kimiko Nakamichi");
+static const u8 Text_Hara[] = _("Daisuke Hara");
+static const u8 Text_Ford[] = _("Sayoko Blodgett-Ford");
+static const u8 Text_Barlow[] = _("Nicola Pratt-Barlow");
+static const u8 Text_Uyama[] = _("Koji Uyama");
+static const u8 Text_EBU[] = _("European Blind Union");
+static const u8 Text_Saeki[] = _("Naoko Saeki");
+static const u8 Text_Sadahisa[] = _("Kayo Sadahisa");
+static const u8 Text_Schafer[] = _("Daniel Schäfers");
+static const u8 Text_Deimel[] = _("Martina Deimel");
+static const u8 Text_Jahn[] = _("Andrea Jähn");
+static const u8 Text_Victoria[] = _("Ángel Victoria");
+static const u8 Text_Mawer[] = _("Matthew Mawer");
+static const u8 Text_Danieli[] = _("Alessio Danieli");
+static const u8 Text_Schnitzer[] = _("Rudi Schnitzer");
+static const u8 Text_Pujos[] = _("Gabriera Pujós");
+static const u8 Text_CreditsTerminator[] = _("");
+
+static const struct CreditsEntry CreditsTerminator[] = {0, Text_CreditsTerminator};
+static const struct CreditsEntry CreditsCredits[] = {11, Category_Credits};
+static const struct CreditsEntry CreditsExecutiveDirector[] = {8, Category_ExecutiveDirector};
+static const struct CreditsEntry CreditsDirector[] = {12, Category_Director};
+static const struct CreditsEntry CreditsArtDirector[] = {10, Category_ArtDirector};
+static const struct CreditsEntry CreditsBattleDirector[] = {10, Category_BattleDirector};
+static const struct CreditsEntry CreditsMainProgrammer[] = {10, Category_MainProgrammer};
+static const struct CreditsEntry CreditsBattleSystemProgrammer[] = {8, Category_BattleSystemProgrammer};
+static const struct CreditsEntry CreditsFieldSystemProgrammer[] = {7, Category_FieldSystemProgrammer};
+static const struct CreditsEntry CreditsProgrammers[] = {12, Category_Programmers};
+static const struct CreditsEntry CreditsMainGraphicDesigner[] = {7, Category_MainGraphicDesigner};
+static const struct CreditsEntry CreditsPOKeMONGraphicDesigners[] = {6, Category_POKeMONGraphicDesigners};
+static const struct CreditsEntry CreditsPOKeMONDesigners[] = {10, Category_POKeMONDesigners};
+static const struct CreditsEntry CreditsMusicComposition[] = {13, Category_MusicComposition};
+static const struct CreditsEntry CreditsSoundEffectsPOKeMONVoices[] = {4, Category_SoundEffectsPOKeMONVoices};
+static const struct CreditsEntry CreditsGameDesigners[] = {11, Category_GameDesigners};
+static const struct CreditsEntry CreditsPlotScenario[] = {11, Category_PlotScenario};
+static const struct CreditsEntry CreditsGameScenario[] = {13, Category_GameScenario};
+static const struct CreditsEntry CreditsScriptDesigners[] = {10, Category_ScriptDesigners};
+static const struct CreditsEntry CreditsMapDesigners[] = {11, Category_MapDesigners};
+static const struct CreditsEntry CreditsMapDataDesigners[] = {9, Category_MapDataDesigners};
+static const struct CreditsEntry CreditsParametricDesigners[] = {9, Category_ParametricDesigners};
+static const struct CreditsEntry CreditsPOKeDEXText[] = {11, Category_POKeDEXText};
+static const struct CreditsEntry CreditsEnvironmentToolProgrammers[] = {6, Category_EnvironmentToolProgrammers};
+static const struct CreditsEntry CreditsProductTesting[] = {11, Category_ProductTesting};
+static const struct CreditsEntry CreditsSpecialThanks[] = {10, Category_SpecialThanks};
+static const struct CreditsEntry CreditsCoordinators[] = {11, Category_Coordinators};
+static const struct CreditsEntry CreditsProducers[] = {11, Category_Producers};
+static const struct CreditsEntry CreditsExecutiveProducers[] = {7, Category_ExecutiveProducers};
+static const struct CreditsEntry CreditsInformationSupervisors[] = {10, Category_InformationSupervisors};
+static const struct CreditsEntry CreditsTaskManagers[] = {8, Category_TaskManagers};
+static const struct CreditsEntry CreditsBrailleCodeCheck[] = {10, Category_BrailleCodeCheck};
+static const struct CreditsEntry CreditsSatoshiTajiri[] = {11, Text_SatoshiTajiri};
+static const struct CreditsEntry CreditsMasuda[] = {11, Text_Masuda};
+static const struct CreditsEntry CreditsSugimori[] = {11, Text_Sugimori};
+static const struct CreditsEntry CreditsMorimoto[] = {11, Text_Morimoto};
+static const struct CreditsEntry CreditsTetsuyaWatanabe[] = {11, Text_TetsuyaWatanabe};
+static const struct CreditsEntry CreditsSogabe[] = {11, Text_Sogabe};
+static const struct CreditsEntry CreditsTamada[] = {11, Text_Tamada};
+static const struct CreditsEntry CreditsMori[] = {11, Text_Mori};
+static const struct CreditsEntry CreditsKagaya[] = {11, Text_Kagaya};
+static const struct CreditsEntry CreditsMatsuda[] = {11, Text_Matsuda};
+static const struct CreditsEntry CreditsHiroyukiNakamura[] = {11, Text_HiroyukiNakamura};
+static const struct CreditsEntry CreditsTaya[] = {11, Text_Taya};
+static const struct CreditsEntry CreditsNohara[] = {11, Text_Nohara};
+static const struct CreditsEntry CreditsTomomichiOhta[] = {11, Text_TomomichiOhta};
+static const struct CreditsEntry CreditsIwasawa[] = {11, Text_Iwasawa};
+static const struct CreditsEntry CreditsTakenoriOhta[] = {11, Text_TakenoriOhta};
+static const struct CreditsEntry CreditsYoshida[] = {11, Text_Yoshida};
+static const struct CreditsEntry CreditsFujiwara[] = {11, Text_Fujiwara};
+static const struct CreditsEntry CreditsSatoshiOhta[] = {11, Text_SatoshiOhta};
+static const struct CreditsEntry CreditsIwashita[] = {11, Text_Iwashita};
+static const struct CreditsEntry CreditsTomita[] = {11, Text_Tomita};
+static const struct CreditsEntry CreditsUnno[] = {11, Text_Unno};
+static const struct CreditsEntry CreditsEo[] = {11, Text_Eo};
+static const struct CreditsEntry CreditsOkutani[] = {11, Text_Okutani};
+static const struct CreditsEntry CreditsNishida[] = {11, Text_Nishida};
+static const struct CreditsEntry CreditsSaito[] = {11, Text_Saito};
+static const struct CreditsEntry CreditsYoshikawa[] = {11, Text_Yoshikawa};
+static const struct CreditsEntry CreditsIchinose[] = {11, Text_Ichinose};
+static const struct CreditsEntry CreditsAoki[] = {11, Text_Aoki};
+static const struct CreditsEntry CreditsNishino[] = {11, Text_Nishino};
+static const struct CreditsEntry CreditsMatsushima[] = {11, Text_Matsushima};
+static const struct CreditsEntry CreditsTetsujiOhta[] = {11, Text_TetsujiOhta};
+static const struct CreditsEntry CreditsSato[] = {11, Text_Sato};
+static const struct CreditsEntry CreditsKawachimaru[] = {11, Text_Kawachimaru};
+static const struct CreditsEntry CreditsShimoyamada[] = {11, Text_Shimoyamada};
+static const struct CreditsEntry CreditsOhmori[] = {11, Text_Ohmori};
+static const struct CreditsEntry CreditsTakahashi[] = {11, Text_Takahashi};
+static const struct CreditsEntry CreditsToshinobuMatsumiya[] = {11, Text_ToshinobuMatsumiya};
+static const struct CreditsEntry CreditsTomisawa[] = {11, Text_Tomisawa};
+static const struct CreditsEntry CreditsEnomoto[] = {11, Text_Enomoto};
+static const struct CreditsEntry CreditsTerada[] = {11, Text_Terada};
+static const struct CreditsEntry CreditsSakurai[] = {11, Text_Sakurai};
+static const struct CreditsEntry CreditsSagawa[] = {11, Text_Sagawa};
+static const struct CreditsEntry CreditsTominaga[] = {11, Text_Tominaga};
+static const struct CreditsEntry CreditsYoshioTajiri[] = {11, Text_YoshioTajiri};
+static const struct CreditsEntry CreditsSasaki[] = {11, Text_Sasaki};
+static const struct CreditsEntry CreditsHamano[] = {11, Text_Hamano};
+static const struct CreditsEntry CreditsChieMatsumiya[] = {11, Text_ChieMatsumiya};
+static const struct CreditsEntry CreditsShinozaki[] = {11, Text_Shinozaki};
+static const struct CreditsEntry CreditsFujii[] = {11, Text_Fujii};
+static const struct CreditsEntry CreditsSuperMarioClub[] = {11, Text_SuperMarioClub};
+static const struct CreditsEntry CreditsTada[] = {11, Text_Tada};
+static const struct CreditsEntry CreditsOhnishi[] = {11, Text_Ohnishi};
+static const struct CreditsEntry CreditsOkamura[] = {11, Text_Okamura};
+static const struct CreditsEntry CreditsHiroNakamura[] = {11, Text_HiroNakamura};
+static const struct CreditsEntry CreditsUesugi[] = {11, Text_Uesugi};
+static const struct CreditsEntry CreditsMurakawa[] = {11, Text_Murakawa};
+static const struct CreditsEntry CreditsKinashi[] = {11, Text_Kinashi};
+static const struct CreditsEntry CreditsTakizawa[] = {11, Text_Takizawa};
+static const struct CreditsEntry CreditsTakada[] = {11, Text_Takada};
+static const struct CreditsEntry CreditsKondo[] = {11, Text_Kondo};
+static const struct CreditsEntry CreditsMashima[] = {11, Text_Mashima};
+static const struct CreditsEntry CreditsNomoto[] = {11, Text_Nomoto};
+static const struct CreditsEntry CreditsIzushi[] = {11, Text_Izushi};
+static const struct CreditsEntry CreditsYamagami[] = {11, Text_Yamagami};
+static const struct CreditsEntry CreditsKyokoWatanabe[] = {11, Text_KyokoWatanabe};
+static const struct CreditsEntry CreditsNakano[] = {11, Text_Nakano};
+static const struct CreditsEntry CreditsJinnai[] = {11, Text_Jinnai};
+static const struct CreditsEntry CreditsTsuru[] = {11, Text_Tsuru};
+static const struct CreditsEntry CreditsIshihara[] = {11, Text_Ishihara};
+static const struct CreditsEntry CreditsIwata[] = {11, Text_Iwata};
+static const struct CreditsEntry CreditsSuyama[] = {11, Text_Suyama};
+static const struct CreditsEntry CreditsMitsuhara[] = {11, Text_Mitsuhara};
+static const struct CreditsEntry CreditsJapanBrailleLibrary[] = {9, Text_JapanBrailleLibrary};
+static const struct CreditsEntry CreditsKomura[] = {11, Text_Komura};
+static const struct CreditsEntry CreditsOhashi[] = {11, Text_Ohashi};
+static const struct CreditsEntry CreditsTranslators[] = {0, Category_Translators};
+static const struct CreditsEntry CreditsProductSupport[] = {0, Category_ProductSupport};
+static const struct CreditsEntry CreditsArtwork[] = {0, Category_Artwork};
+static const struct CreditsEntry CreditsTextEditor[] = {0, Category_TextEditor};
+static const struct CreditsEntry CreditsGraphicDesigners[] = {0, Category_GraphicDesigners};
+static const struct CreditsEntry CreditsYamamoto[] = {0, Text_Yamamoto};
+static const struct CreditsEntry CreditsFunakoshi[] = {0, Text_Funakoshi};
+static const struct CreditsEntry CreditsNakamichi[] = {0, Text_Nakamichi};
+static const struct CreditsEntry CreditsHara[] = {0, Text_Hara};
+static const struct CreditsEntry CreditsFord[] = {0, Text_Ford};
+static const struct CreditsEntry CreditsBarlow[] = {0, Text_Barlow};
+static const struct CreditsEntry CreditsUyama[] = {0, Text_Uyama};
+static const struct CreditsEntry CreditsEBU[] = {0, Text_EBU};
+#ifdef SAPPHIRE
+static const struct CreditsEntry CreditsVersion[] = {0, Text_Version_Sapphire};
+#else
+static const struct CreditsEntry CreditsVersion[] = {0, Text_Version_Ruby};
+#endif
+static const struct CreditsEntry CreditsNOEProductTesting[] = {0, Category_NOEProductTesting};
+static const struct CreditsEntry CreditsSaeki[] = {0, Text_Saeki};
+static const struct CreditsEntry CreditsSadahisa[] = {0, Text_Sadahisa};
+static const struct CreditsEntry CreditsGermanVersionCoordinators[] = {0, Category_GermanVersionCoordinators};
+static const struct CreditsEntry CreditsSchafer[] = {0, Text_Schafer};
+static const struct CreditsEntry CreditsDeimel[] = {0, Text_Deimel};
+static const struct CreditsEntry CreditsJahn[] = {0, Text_Jahn};
+static const struct CreditsEntry CreditsVictoria[] = {0, Text_Victoria};
+static const struct CreditsEntry CreditsMawer[] = {0, Text_Mawer};
+static const struct CreditsEntry CreditsDanieli[] = {0, Text_Danieli};
+static const struct CreditsEntry CreditsSchnitzer[] = {0, Text_Schnitzer};
+static const struct CreditsEntry CreditsPujos[] = {0, Text_Pujos};
+
+#define LINES_PER_PAGE 5
+#define _ CreditsTerminator
+const struct CreditsEntry *const gCreditsEntryPointerTable[][LINES_PER_PAGE] =
+{
+ {
+ _,
+ CreditsVersion,
+ CreditsCredits,
+ _,
+ _
+ },
+ {
+ _,
+ CreditsDirector,
+ CreditsMasuda,
+ _,
+ _
+ },
+ {
+ _,
+ CreditsArtDirector,
+ CreditsSugimori,
+ _,
+ _
+ },
+ {
+ _,
+ CreditsBattleDirector,
+ CreditsMorimoto,
+ _,
+ _
+ },
+ {
+ _,
+ CreditsMainProgrammer,
+ CreditsTetsuyaWatanabe,
+ _,
+ _
+ },
+ {
+ CreditsBattleSystemProgrammer,
+ CreditsSogabe,
+ CreditsFieldSystemProgrammer,
+ CreditsTamada,
+ _
+ },
+ {
+ CreditsProgrammers,
+ CreditsMori,
+ CreditsKagaya,
+ CreditsMatsuda,
+ _
+ },
+ {
+ CreditsProgrammers,
+ CreditsHiroyukiNakamura,
+ CreditsTaya,
+ CreditsNohara,
+ _
+ },
+ {
+ CreditsProgrammers,
+ CreditsTomomichiOhta,
+ CreditsIwasawa,
+ CreditsTakenoriOhta,
+ _
+ },
+ {
+ _,
+ CreditsMainGraphicDesigner,
+ CreditsYoshida,
+ _,
+ _
+ },
+ {
+ CreditsPOKeMONGraphicDesigners,
+ CreditsSugimori,
+ CreditsYoshida,
+ _,
+ _
+ },
+ {
+ CreditsPOKeMONGraphicDesigners,
+ CreditsFujiwara,
+ CreditsSatoshiOhta,
+ CreditsIwashita,
+ _
+ },
+ {
+ CreditsPOKeMONGraphicDesigners,
+ CreditsTomita,
+ CreditsUnno,
+ CreditsEo,
+ _
+ },
+ {
+ CreditsPOKeMONDesigners,
+ CreditsMorimoto,
+ CreditsOkutani,
+ CreditsNishida,
+ _
+ },
+ {
+ CreditsPOKeMONDesigners,
+ CreditsSaito,
+ CreditsYoshikawa,
+ _,
+ _
+ },
+ {
+ CreditsMusicComposition,
+ CreditsIchinose,
+ CreditsAoki,
+ CreditsMasuda,
+ _
+ },
+ {
+ _,
+ CreditsSoundEffectsPOKeMONVoices,
+ CreditsAoki,
+ _,
+ _
+ },
+ {
+ CreditsGameDesigners,
+ CreditsMasuda,
+ CreditsMorimoto,
+ CreditsNishino,
+ _
+ },
+ {
+ CreditsGameDesigners,
+ CreditsMatsushima,
+ CreditsTetsujiOhta,
+ CreditsSato,
+ CreditsKawachimaru
+ },
+ {
+ CreditsGameDesigners,
+ CreditsShimoyamada,
+ CreditsOhmori,
+ CreditsTakahashi,
+ _
+ },
+ {
+ CreditsPlotScenario,
+ CreditsMasuda,
+ CreditsTomisawa,
+ CreditsNishino,
+ _
+ },
+ {
+ CreditsGameScenario,
+ CreditsToshinobuMatsumiya,
+ CreditsTomisawa,
+ _,
+ _
+ },
+ {
+ CreditsScriptDesigners,
+ CreditsNohara,
+ CreditsTetsujiOhta,
+ CreditsTomomichiOhta,
+ _
+ },
+ {
+ CreditsMapDesigners,
+ CreditsOhmori,
+ CreditsTetsujiOhta,
+ CreditsNishino,
+ _
+ },
+ {
+ CreditsMapDataDesigners,
+ CreditsTetsujiOhta,
+ CreditsTakahashi,
+ _,
+ _
+ },
+ {
+ CreditsParametricDesigners,
+ CreditsNishino,
+ CreditsMorimoto,
+ CreditsTetsujiOhta,
+ CreditsShimoyamada
+ },
+ {
+ _,
+ CreditsPOKeDEXText,
+ CreditsMatsushima,
+ _,
+ _
+ },
+ {
+ CreditsEnvironmentToolProgrammers,
+ CreditsSogabe,
+ CreditsTamada,
+ CreditsHiroyukiNakamura,
+ CreditsMori
+ },
+ {
+ CreditsProductTesting,
+ CreditsSuperMarioClub,
+ CreditsTada,
+ CreditsOhnishi,
+ CreditsOkamura
+ },
+ {
+ CreditsSpecialThanks,
+ CreditsTominaga,
+ CreditsYoshioTajiri,
+ CreditsSasaki,
+ _
+ },
+ {
+ CreditsSpecialThanks,
+ CreditsHamano,
+ CreditsChieMatsumiya,
+ CreditsShinozaki,
+ CreditsFujii
+ },
+ {
+ CreditsSpecialThanks,
+ CreditsSuyama,
+ CreditsMitsuhara,
+ CreditsKomura,
+ CreditsOhashi
+ },
+ {
+ CreditsSpecialThanks,
+ CreditsTakizawa,
+ CreditsTakada,
+ CreditsKondo,
+ CreditsMashima
+ },
+ {
+ CreditsInformationSupervisors,
+ CreditsEnomoto,
+ CreditsTerada,
+ CreditsSakurai,
+ CreditsSagawa
+ },
+ {
+ CreditsCoordinators,
+ CreditsKyokoWatanabe,
+ CreditsNakano,
+ _,
+ _
+ },
+ {
+ CreditsTaskManagers,
+ CreditsYamagami,
+ CreditsNomoto,
+ _,
+ _
+ },
+ {
+ CreditsProducers,
+ CreditsJinnai,
+ CreditsIzushi,
+ CreditsTsuru,
+ _
+ },
+ {
+ _,
+ CreditsExecutiveDirector,
+ CreditsSatoshiTajiri,
+ _,
+ _
+ },
+ {
+ _,
+ CreditsExecutiveProducers,
+ CreditsIwata,
+ _,
+ _
+ },
+ {
+ _,
+ CreditsExecutiveProducers,
+ CreditsIshihara,
+ _,
+ _
+ },
+ {
+ CreditsGermanVersionCoordinators,
+ CreditsUesugi,
+ CreditsSadahisa,
+ _,
+ _
+ },
+ {
+ CreditsTranslators,
+ CreditsSchafer,
+ CreditsDeimel,
+ CreditsJahn,
+ _
+ },
+ {
+ CreditsProgrammers,
+ CreditsMurakawa,
+ CreditsYamamoto,
+ CreditsKinashi,
+ _
+ },
+ {
+ CreditsGraphicDesigners,
+ CreditsYamamoto,
+ CreditsKinashi,
+ _,
+ _
+ },
+ {
+ CreditsProductSupport,
+ CreditsNakamichi,
+ CreditsSaeki,
+ CreditsHara,
+ _
+ },
+ {
+ CreditsNOEProductTesting,
+ CreditsVictoria,
+ CreditsMawer,
+ CreditsDanieli,
+ CreditsSchnitzer
+ },
+ {
+ _,
+ CreditsBrailleCodeCheck,
+ CreditsEBU,
+ _,
+ _
+ },
+ {
+ CreditsSpecialThanks,
+ CreditsHiroNakamura,
+ CreditsFord,
+ CreditsBarlow,
+ _
+ },
+ {
+ CreditsSpecialThanks,
+ CreditsUyama,
+ CreditsPujos,
+ _,
+ _
+ },
+};
+#undef _
diff --git a/src/data/credits_en.h b/src/data/credits_en.h
new file mode 100755
index 000000000..8ce0bad03
--- /dev/null
+++ b/src/data/credits_en.h
@@ -0,0 +1,654 @@
+const u8 Category_Credits[] = _("{PALETTE 9}Credits");
+const u8 Category_ExecutiveDirector[] = _("{PALETTE 9}Executive Director");
+const u8 Category_Director[] = _("{PALETTE 9}Director");
+const u8 Category_ArtDirector[] = _("{PALETTE 9}Art Director");
+const u8 Category_BattleDirector[] = _("{PALETTE 9}Battle Director");
+const u8 Category_MainProgrammer[] = _("{PALETTE 9}Main Programmer");
+const u8 Category_BattleSystemProgrammer[] = _("{PALETTE 9}Battle System Programmer");
+const u8 Category_FieldSystemProgrammer[] = _("{PALETTE 9}Field System Programmer");
+const u8 Category_Programmers[] = _("{PALETTE 9}Programmers");
+const u8 Category_MainGraphicDesigner[] = _("{PALETTE 9}Main Graphic Designer");
+const u8 Category_POKeMONGraphicDesigners[] = _("{PALETTE 9}POKéMON & Graphic Designers");
+const u8 Category_POKeMONDesigners[] = _("{PALETTE 9}POKéMON Designers");
+const u8 Category_MusicComposition[] = _("{PALETTE 9}Music Composition");
+const u8 Category_SoundEffectsPOKeMONVoices[] = _("{PALETTE 9}Sound Effects & POKéMON Voices");
+const u8 Category_GameDesigners[] = _("{PALETTE 9}Game Designers");
+const u8 Category_PlotScenario[] = _("{PALETTE 9}Plot Scenario");
+const u8 Category_GameScenario[] = _("{PALETTE 9}Game Scenario");
+const u8 Category_ScriptDesigners[] = _("{PALETTE 9}Script Designers");
+const u8 Category_MapDesigners[] = _("{PALETTE 9}Map Designers");
+const u8 Category_MapDataDesigners[] = _("{PALETTE 9}Map Data Designers");
+const u8 Category_ParametricDesigners[] = _("{PALETTE 9}Parametric Designers");
+const u8 Category_POKeDEXText[] = _("{PALETTE 9}POKéDEX Text");
+const u8 Category_EnvironmentToolProgrammers[] = _("{PALETTE 9}Environment & Tool Programmers");
+const u8 Category_ProductTesting[] = _("{PALETTE 9}Product Testing");
+const u8 Category_SpecialThanks[] = _("{PALETTE 9}Special Thanks");
+const u8 Category_Coordinators[] = _("{PALETTE 9}Coordinators");
+const u8 Category_Producers[] = _("{PALETTE 9}Producers");
+const u8 Category_ExecutiveProducers[] = _("{PALETTE 9}Executive Producers");
+const u8 Category_InformationSupervisors[] = _("{PALETTE 9}Information Supervisors");
+const u8 Category_TaskManagers[] = _("{PALETTE 9}Task Managers");
+const u8 Category_BrailleCodeCheck[] = _("{PALETTE 9}Braille Code Check");
+const u8 Category_EnglishVersionCoordinators[] = _("{PALETTE 9}English Version Coordinators");
+const u8 Category_Translator[] = _("{PALETTE 9}Translator");
+const u8 Category_ProductSupport[] = _("{PALETTE 9}Product Support");
+const u8 Category_Artwork[] = _("{PALETTE 9}Artwork");
+const u8 Category_TextEditor[] = _("{PALETTE 9}Text Editor");
+const u8 Category_NOAProductTesting[] = _("{PALETTE 9}NOA Product Testing");
+const u8 Category_GraphicDesigners[] = _("{PALETTE 9}Graphic Designers");
+const u8 Text_SatoshiTajiri[] = _("Satoshi Tajiri");
+const u8 Text_Masuda[] = _("Junichi Masuda");
+const u8 Text_Sugimori[] = _("Ken Sugimori");
+const u8 Text_Morimoto[] = _("Shigeki Morimoto");
+const u8 Text_TetsuyaWatanabe[] = _("Tetsuya Watanabe");
+const u8 Text_Sogabe[] = _("Hisashi Sogabe");
+const u8 Text_Tamada[] = _("Sousuke Tamada");
+const u8 Text_Mori[] = _("Akito Mori");
+const u8 Text_Kagaya[] = _("Keita Kagaya");
+const u8 Text_Matsuda[] = _("Yoshinori Matsuda");
+const u8 Text_HiroyukiNakamura[] = _("Hiroyuki Nakamura");
+const u8 Text_Taya[] = _("Masao Taya");
+const u8 Text_Nohara[] = _("Satoshi Nohara");
+const u8 Text_TomomichiOhta[] = _("Tomomichi Ohta");
+const u8 Text_Iwasawa[] = _("Miyuki Iwasawa");
+const u8 Text_TakenoriOhta[] = _("Takenori Ohta");
+const u8 Text_Yoshida[] = _("Hironobu Yoshida");
+const u8 Text_Fujiwara[] = _("Motofumi Fujiwara");
+const u8 Text_SatoshiOhta[] = _("Satoshi Ohta");
+const u8 Text_Iwashita[] = _("Asuka Iwashita");
+const u8 Text_Tomita[] = _("Aimi Tomita");
+const u8 Text_Unno[] = _("Takao Unno");
+const u8 Text_Eo[] = _("Kanako Eo");
+const u8 Text_Okutani[] = _("Jun Okutani");
+const u8 Text_Nishida[] = _("Atsuko Nishida");
+const u8 Text_Saito[] = _("Muneo Saito");
+const u8 Text_Yoshikawa[] = _("Rena Yoshikawa");
+const u8 Text_Ichinose[] = _("Go Ichinose");
+const u8 Text_Aoki[] = _("Morikazu Aoki");
+const u8 Text_Nishino[] = _("Koji Nishino");
+const u8 Text_Matsushima[] = _("Kenji Matsushima");
+const u8 Text_TetsujiOhta[] = _("Tetsuji Ohta");
+const u8 Text_Sato[] = _("Hitomi Sato");
+const u8 Text_Kawachimaru[] = _("Takeshi Kawachimaru");
+const u8 Text_Shimoyamada[] = _("Teruyuki Shimoyamada");
+const u8 Text_Ohmori[] = _("Shigeru Ohmori");
+const u8 Text_Takahashi[] = _("Tadashi Takahashi");
+const u8 Text_ToshinobuMatsumiya[] = _("Toshinobu Matsumiya");
+const u8 Text_Tomisawa[] = _("Akihito Tomisawa");
+const u8 Text_Enomoto[] = _("Hiroki Enomoto");
+const u8 Text_Terada[] = _("Kazuyuki Terada");
+const u8 Text_Sakurai[] = _("Yuri Sakurai");
+const u8 Text_Sagawa[] = _("Hiromi Sagawa");
+const u8 Text_Tominaga[] = _("Kenji Tominaga");
+const u8 Text_YoshioTajiri[] = _("Yoshio Tajiri");
+const u8 Text_Sasaki[] = _("Teiko Sasaki");
+const u8 Text_Hamano[] = _("Sachiko Hamano");
+const u8 Text_ChieMatsumiya[] = _("Chie Matsumiya");
+const u8 Text_Shinozaki[] = _("Akiko Shinozaki");
+const u8 Text_Fujii[] = _("Atsuko Fujii");
+const u8 Text_SuperMarioClub[] = _("NCL Super Mario Club");
+const u8 Text_Tada[] = _("Atsushi Tada");
+const u8 Text_Ohnishi[] = _("Takahiro Ohnishi");
+const u8 Text_Okamura[] = _("Norihide Okamura");
+const u8 Text_HiroNakamura[] = _("Hiro Nakamura");
+const u8 Text_Uesugi[] = _("Hiroyuki Uesugi");
+const u8 Text_Murakawa[] = _("Teruki Murakawa");
+const u8 Text_Kinashi[] = _("Akira Kinashi");
+const u8 Text_Takizawa[] = _("Michiko Takizawa");
+const u8 Text_Takada[] = _("Makiko Takada");
+const u8 Text_Kondo[] = _("Takanao Kondo");
+const u8 Text_Mashima[] = _("Ai Mashima");
+const u8 Text_Nomoto[] = _("Gakuji Nomoto");
+const u8 Text_Izushi[] = _("Takehiro Izushi");
+const u8 Text_Yamagami[] = _("Hitoshi Yamagami");
+const u8 Text_KyokoWatanabe[] = _("Kyoko Watanabe");
+const u8 Text_Nakano[] = _("Takao Nakano");
+const u8 Text_Jinnai[] = _("Hiroyuki Jinnai");
+const u8 Text_Tsuru[] = _("Hiroaki Tsuru");
+const u8 Text_Ishihara[] = _("Tsunekaz Ishihara");
+const u8 Text_Iwata[] = _("Satoru Iwata");
+const u8 Text_Suyama[] = _("Kazuya Suyama");
+const u8 Text_Mitsuhara[] = _("Satoshi Mitsuhara");
+const u8 Text_JapanBrailleLibrary[] = _("Japan Braille Library");
+const u8 Text_Komura[] = _("Tomotaka Komura");
+const u8 Text_Ohashi[] = _("Mikiko Ohashi");
+const u8 Text_McMahill[] = _("Seth McMahill");
+const u8 Text_Ogasawara[] = _("Nob Ogasawara");
+const u8 Text_Yamamoto[] = _("Souichi Yamamoto");
+const u8 Text_Funakoshi[] = _("Masanori Funakoshi");
+const u8 Text_Fujihara[] = _("Kazuhiro Fujihara");
+const u8 Text_Nakamichi[] = _("Kimiko Nakamichi");
+const u8 Text_Hara[] = _("Daisuke Hara");
+const u8 Text_Okada[] = _("Atsushi Okada");
+const u8 Text_Lillygren[] = _("Teresa Lillygren");
+const u8 Text_Hertzog[] = _("Thomas Hertzog");
+const u8 Text_Ridgeway[] = _("Ed Ridgeway");
+const u8 Text_NFotB[] = _("National Federation of the Blind");
+const u8 Text_Maurer[] = _("Patricia A. Maurer");
+const u8 Text_Ford[] = _("Sayoko Blodgett-Ford");
+const u8 Text_Barlow[] = _("Nicola Pratt-Barlow");
+const u8 Text_Uyama[] = _("Koji Uyama");
+const u8 Text_Howitt[] = _("Anthony Howitt");
+const u8 Text_Tilden[] = _("Gail Tilden");
+const u8 Text_EBU[] = _("European Blind Union");
+const u8 Text_ABA[] = _("Australian Braille Authority");
+const u8 Text_RNZFotB[] = _("Royal New Zealand Federation for the Blind");
+const u8 Text_CreditsTerminator[] = _("");
+#ifdef SAPPHIRE
+const u8 Text_Version[] = _("{PALETTE 9}POKéMON SAPPHIRE VERSION");
+#else
+const u8 Text_Version[] = _("{PALETTE 9}POKéMON RUBY VERSION");
+#endif
+
+const struct CreditsEntry CreditsTerminator[] = {0, Text_CreditsTerminator};
+#ifdef SAPPHIRE
+const struct CreditsEntry CreditsVersion[] = {7, Text_Version};
+#else
+const struct CreditsEntry CreditsVersion[] = {8, Text_Version};
+#endif
+const struct CreditsEntry CreditsCredits[] = {11, Category_Credits};
+const struct CreditsEntry CreditsExecutiveDirector[] = {8, Category_ExecutiveDirector};
+const struct CreditsEntry CreditsDirector[] = {12, Category_Director};
+const struct CreditsEntry CreditsArtDirector[] = {10, Category_ArtDirector};
+const struct CreditsEntry CreditsBattleDirector[] = {10, Category_BattleDirector};
+const struct CreditsEntry CreditsMainProgrammer[] = {10, Category_MainProgrammer};
+const struct CreditsEntry CreditsBattleSystemProgrammer[] = {8, Category_BattleSystemProgrammer};
+const struct CreditsEntry CreditsFieldSystemProgrammer[] = {7, Category_FieldSystemProgrammer};
+const struct CreditsEntry CreditsProgrammers[] = {12, Category_Programmers};
+const struct CreditsEntry CreditsMainGraphicDesigner[] = {7, Category_MainGraphicDesigner};
+const struct CreditsEntry CreditsPOKeMONGraphicDesigners[] = {6, Category_POKeMONGraphicDesigners};
+const struct CreditsEntry CreditsPOKeMONDesigners[] = {10, Category_POKeMONDesigners};
+const struct CreditsEntry CreditsMusicComposition[] = {13, Category_MusicComposition};
+const struct CreditsEntry CreditsSoundEffectsPOKeMONVoices[] = {4, Category_SoundEffectsPOKeMONVoices};
+const struct CreditsEntry CreditsGameDesigners[] = {11, Category_GameDesigners};
+const struct CreditsEntry CreditsPlotScenario[] = {11, Category_PlotScenario};
+const struct CreditsEntry CreditsGameScenario[] = {13, Category_GameScenario};
+const struct CreditsEntry CreditsScriptDesigners[] = {10, Category_ScriptDesigners};
+const struct CreditsEntry CreditsMapDesigners[] = {11, Category_MapDesigners};
+const struct CreditsEntry CreditsMapDataDesigners[] = {9, Category_MapDataDesigners};
+const struct CreditsEntry CreditsParametricDesigners[] = {9, Category_ParametricDesigners};
+const struct CreditsEntry CreditsPOKeDEXText[] = {11, Category_POKeDEXText};
+const struct CreditsEntry CreditsEnvironmentToolProgrammers[] = {6, Category_EnvironmentToolProgrammers};
+const struct CreditsEntry CreditsProductTesting[] = {11, Category_ProductTesting};
+const struct CreditsEntry CreditsSpecialThanks[] = {10, Category_SpecialThanks};
+const struct CreditsEntry CreditsCoordinators[] = {11, Category_Coordinators};
+const struct CreditsEntry CreditsProducers[] = {11, Category_Producers};
+const struct CreditsEntry CreditsExecutiveProducers[] = {7, Category_ExecutiveProducers};
+const struct CreditsEntry CreditsInformationSupervisors[] = {10, Category_InformationSupervisors};
+const struct CreditsEntry CreditsTaskManagers[] = {8, Category_TaskManagers};
+const struct CreditsEntry CreditsBrailleCodeCheck[] = {10, Category_BrailleCodeCheck};
+const struct CreditsEntry CreditsSatoshiTajiri[] = {11, Text_SatoshiTajiri};
+const struct CreditsEntry CreditsMasuda[] = {11, Text_Masuda};
+const struct CreditsEntry CreditsSugimori[] = {11, Text_Sugimori};
+const struct CreditsEntry CreditsMorimoto[] = {11, Text_Morimoto};
+const struct CreditsEntry CreditsTetsuyaWatanabe[] = {11, Text_TetsuyaWatanabe};
+const struct CreditsEntry CreditsSogabe[] = {11, Text_Sogabe};
+const struct CreditsEntry CreditsTamada[] = {11, Text_Tamada};
+const struct CreditsEntry CreditsMori[] = {11, Text_Mori};
+const struct CreditsEntry CreditsKagaya[] = {11, Text_Kagaya};
+const struct CreditsEntry CreditsMatsuda[] = {11, Text_Matsuda};
+const struct CreditsEntry CreditsHiroyukiNakamura[] = {11, Text_HiroyukiNakamura};
+const struct CreditsEntry CreditsTaya[] = {11, Text_Taya};
+const struct CreditsEntry CreditsNohara[] = {11, Text_Nohara};
+const struct CreditsEntry CreditsTomomichiOhta[] = {11, Text_TomomichiOhta};
+const struct CreditsEntry CreditsIwasawa[] = {11, Text_Iwasawa};
+const struct CreditsEntry CreditsTakenoriOhta[] = {11, Text_TakenoriOhta};
+const struct CreditsEntry CreditsYoshida[] = {11, Text_Yoshida};
+const struct CreditsEntry CreditsFujiwara[] = {11, Text_Fujiwara};
+const struct CreditsEntry CreditsSatoshiOhta[] = {11, Text_SatoshiOhta};
+const struct CreditsEntry CreditsIwashita[] = {11, Text_Iwashita};
+const struct CreditsEntry CreditsTomita[] = {11, Text_Tomita};
+const struct CreditsEntry CreditsUnno[] = {11, Text_Unno};
+const struct CreditsEntry CreditsEo[] = {11, Text_Eo};
+const struct CreditsEntry CreditsOkutani[] = {11, Text_Okutani};
+const struct CreditsEntry CreditsNishida[] = {11, Text_Nishida};
+const struct CreditsEntry CreditsSaito[] = {11, Text_Saito};
+const struct CreditsEntry CreditsYoshikawa[] = {11, Text_Yoshikawa};
+const struct CreditsEntry CreditsIchinose[] = {11, Text_Ichinose};
+const struct CreditsEntry CreditsAoki[] = {11, Text_Aoki};
+const struct CreditsEntry CreditsNishino[] = {11, Text_Nishino};
+const struct CreditsEntry CreditsMatsushima[] = {11, Text_Matsushima};
+const struct CreditsEntry CreditsTetsujiOhta[] = {11, Text_TetsujiOhta};
+const struct CreditsEntry CreditsSato[] = {11, Text_Sato};
+const struct CreditsEntry CreditsKawachimaru[] = {11, Text_Kawachimaru};
+const struct CreditsEntry CreditsShimoyamada[] = {11, Text_Shimoyamada};
+const struct CreditsEntry CreditsOhmori[] = {11, Text_Ohmori};
+const struct CreditsEntry CreditsTakahashi[] = {11, Text_Takahashi};
+const struct CreditsEntry CreditsToshinobuMatsumiya[] = {11, Text_ToshinobuMatsumiya};
+const struct CreditsEntry CreditsTomisawa[] = {11, Text_Tomisawa};
+const struct CreditsEntry CreditsEnomoto[] = {11, Text_Enomoto};
+const struct CreditsEntry CreditsTerada[] = {11, Text_Terada};
+const struct CreditsEntry CreditsSakurai[] = {11, Text_Sakurai};
+const struct CreditsEntry CreditsSagawa[] = {11, Text_Sagawa};
+const struct CreditsEntry CreditsTominaga[] = {11, Text_Tominaga};
+const struct CreditsEntry CreditsYoshiroTajiri[] = {11, Text_YoshioTajiri};
+const struct CreditsEntry CreditsSasaki[] = {11, Text_Sasaki};
+const struct CreditsEntry CreditsHamano[] = {11, Text_Hamano};
+const struct CreditsEntry CreditsChieMatsumiya[] = {11, Text_ChieMatsumiya};
+const struct CreditsEntry CreditsShinozaki[] = {11, Text_Shinozaki};
+const struct CreditsEntry CreditsFujii[] = {11, Text_Fujii};
+const struct CreditsEntry CreditsSuperMarioClub[] = {11, Text_SuperMarioClub};
+const struct CreditsEntry CreditsTada[] = {11, Text_Tada};
+const struct CreditsEntry CreditsOhnishi[] = {11, Text_Ohnishi};
+const struct CreditsEntry CreditsOkamura[] = {11, Text_Okamura};
+const struct CreditsEntry CreditsHiroNakamura[] = {11, Text_HiroNakamura};
+const struct CreditsEntry CreditsUesugi[] = {11, Text_Uesugi};
+const struct CreditsEntry CreditsMurakawa[] = {11, Text_Murakawa};
+const struct CreditsEntry CreditsKinashi[] = {11, Text_Kinashi};
+const struct CreditsEntry CreditsTakizawa[] = {11, Text_Takizawa};
+const struct CreditsEntry CreditsTakada[] = {11, Text_Takada};
+const struct CreditsEntry CreditsKondo[] = {11, Text_Kondo};
+const struct CreditsEntry CreditsMashima[] = {11, Text_Mashima};
+const struct CreditsEntry CreditsNomoto[] = {11, Text_Nomoto};
+const struct CreditsEntry CreditsIzushi[] = {11, Text_Izushi};
+const struct CreditsEntry CreditsYamagami[] = {11, Text_Yamagami};
+const struct CreditsEntry CreditsKyokoWatanabe[] = {11, Text_KyokoWatanabe};
+const struct CreditsEntry CreditsNakano[] = {11, Text_Nakano};
+const struct CreditsEntry CreditsJinnai[] = {11, Text_Jinnai};
+const struct CreditsEntry CreditsTsuru[] = {11, Text_Tsuru};
+const struct CreditsEntry CreditsIshihara[] = {11, Text_Ishihara};
+const struct CreditsEntry CreditsIwata[] = {11, Text_Iwata};
+const struct CreditsEntry CreditsSuyama[] = {11, Text_Suyama};
+const struct CreditsEntry CreditsMitsuhara[] = {11, Text_Mitsuhara};
+const struct CreditsEntry CreditsJapanBrailleLibrary[] = {9, Text_JapanBrailleLibrary};
+const struct CreditsEntry CreditsKomura[] = {11, Text_Komura};
+const struct CreditsEntry CreditsOhashi[] = {11, Text_Ohashi};
+const struct CreditsEntry CreditsEnglishVersionCoordinators[] = {0, Category_EnglishVersionCoordinators};
+const struct CreditsEntry CreditsTranslator[] = {0, Category_Translator};
+const struct CreditsEntry CreditsProductSupport[] = {0, Category_ProductSupport};
+const struct CreditsEntry CreditsArtwork[] = {0, Category_Artwork};
+const struct CreditsEntry CreditsTextEditor[] = {0, Category_TextEditor};
+const struct CreditsEntry CreditsNOAProductTesting[] = {0, Category_NOAProductTesting};
+const struct CreditsEntry CreditsGraphicDesigners[] = {0, Category_GraphicDesigners};
+const struct CreditsEntry CreditsMcMahill[] = {0, Text_McMahill};
+const struct CreditsEntry CreditsOgasawara[] = {0, Text_Ogasawara};
+const struct CreditsEntry CreditsYamamoto[] = {0, Text_Yamamoto};
+const struct CreditsEntry CreditsFunakoshi[] = {0, Text_Funakoshi};
+const struct CreditsEntry CreditsFujihara[] = {0, Text_Fujihara};
+const struct CreditsEntry CreditsNakamichi[] = {0, Text_Nakamichi};
+const struct CreditsEntry CreditsHara[] = {0, Text_Hara};
+const struct CreditsEntry CreditsOkada[] = {0, Text_Okada};
+const struct CreditsEntry CreditsLillygren[] = {0, Text_Lillygren};
+const struct CreditsEntry CreditsHertzog[] = {0, Text_Hertzog};
+const struct CreditsEntry CreditsRidgeway[] = {0, Text_Ridgeway};
+const struct CreditsEntry CreditsNFotB[] = {0, Text_NFotB};
+const struct CreditsEntry CreditsMaurer[] = {0, Text_Maurer};
+const struct CreditsEntry CreditsFord[] = {0, Text_Ford};
+const struct CreditsEntry CreditsBarlow[] = {0, Text_Barlow};
+const struct CreditsEntry CreditsUyama[] = {0, Text_Uyama};
+const struct CreditsEntry CreditsHowitt[] = {0, Text_Howitt};
+const struct CreditsEntry CreditsTilden[] = {0, Text_Tilden};
+const struct CreditsEntry CreditsEBU[] = {0, Text_EBU};
+const struct CreditsEntry CreditsABA[] = {0, Text_ABA};
+const struct CreditsEntry CreditsRNZFotB[] = {0, Text_RNZFotB};
+
+#define LINES_PER_PAGE 5
+#define _ CreditsTerminator
+const struct CreditsEntry *const gCreditsEntryPointerTable[][LINES_PER_PAGE] =
+{
+ {
+ _,
+ CreditsVersion,
+ CreditsCredits,
+ _,
+ _
+ },
+ {
+ _,
+ CreditsDirector,
+ CreditsMasuda,
+ _,
+ _,
+ },
+ {
+ _,
+ CreditsArtDirector,
+ CreditsSugimori,
+ _,
+ _,
+ },
+ {
+ _,
+ CreditsBattleDirector,
+ CreditsMorimoto,
+ _,
+ _,
+ },
+ {
+ _,
+ CreditsMainProgrammer,
+ CreditsTetsuyaWatanabe,
+ _,
+ _,
+ },
+ {
+ CreditsBattleSystemProgrammer,
+ CreditsSogabe,
+ CreditsFieldSystemProgrammer,
+ CreditsTamada,
+ _,
+ },
+ {
+ CreditsProgrammers,
+ CreditsMori,
+ CreditsKagaya,
+ CreditsMatsuda,
+ _,
+ },
+ {
+ CreditsProgrammers,
+ CreditsHiroyukiNakamura,
+ CreditsTaya,
+ CreditsNohara,
+ _,
+ },
+ {
+ CreditsProgrammers,
+ CreditsTomomichiOhta,
+ CreditsIwasawa,
+ CreditsTakenoriOhta,
+ _,
+ },
+ {
+ _,
+ CreditsMainGraphicDesigner,
+ CreditsYoshida,
+ _,
+ _,
+ },
+ {
+ CreditsPOKeMONGraphicDesigners,
+ CreditsSugimori,
+ CreditsYoshida,
+ _,
+ _,
+ },
+ {
+ CreditsPOKeMONGraphicDesigners,
+ CreditsFujiwara,
+ CreditsSatoshiOhta,
+ CreditsIwashita,
+ _,
+ },
+ {
+ CreditsPOKeMONGraphicDesigners,
+ CreditsTomita,
+ CreditsUnno,
+ CreditsEo,
+ _,
+ },
+ {
+ CreditsPOKeMONDesigners,
+ CreditsMorimoto,
+ CreditsOkutani,
+ CreditsNishida,
+ _,
+ },
+ {
+ CreditsPOKeMONDesigners,
+ CreditsSaito,
+ CreditsYoshikawa,
+ _,
+ _,
+ },
+ {
+ CreditsMusicComposition,
+ CreditsIchinose,
+ CreditsAoki,
+ CreditsMasuda,
+ _,
+ },
+ {
+ _,
+ CreditsSoundEffectsPOKeMONVoices,
+ CreditsAoki,
+ _,
+ _,
+ },
+ {
+ CreditsGameDesigners,
+ CreditsMasuda,
+ CreditsMorimoto,
+ CreditsNishino,
+ _,
+ },
+ {
+ CreditsGameDesigners,
+ CreditsMatsushima,
+ CreditsTetsujiOhta,
+ CreditsSato,
+ CreditsKawachimaru,
+ },
+ {
+ CreditsGameDesigners,
+ CreditsShimoyamada,
+ CreditsOhmori,
+ CreditsTakahashi,
+ _,
+ },
+ {
+ CreditsPlotScenario,
+ CreditsMasuda,
+ CreditsTomisawa,
+ CreditsNishino,
+ _,
+ },
+ {
+ CreditsGameScenario,
+ CreditsToshinobuMatsumiya,
+ CreditsTomisawa,
+ _,
+ _,
+ },
+ {
+ CreditsScriptDesigners,
+ CreditsNohara,
+ CreditsTetsujiOhta,
+ CreditsTomomichiOhta,
+ _,
+ },
+ {
+ CreditsMapDesigners,
+ CreditsOhmori,
+ CreditsTetsujiOhta,
+ CreditsNishino,
+ _,
+ },
+ {
+ CreditsMapDataDesigners,
+ CreditsTetsujiOhta,
+ CreditsTakahashi,
+ _,
+ _,
+ },
+ {
+ CreditsParametricDesigners,
+ CreditsNishino,
+ CreditsMorimoto,
+ CreditsTetsujiOhta,
+ CreditsShimoyamada,
+ },
+ {
+ _,
+ CreditsPOKeDEXText,
+ CreditsMatsushima,
+ _,
+ _,
+ },
+ {
+ CreditsEnvironmentToolProgrammers,
+ CreditsSogabe,
+ CreditsTamada,
+ CreditsHiroyukiNakamura,
+ CreditsMori,
+ },
+ {
+ CreditsProductTesting,
+ CreditsSuperMarioClub,
+ CreditsTada,
+ CreditsOhnishi,
+ CreditsOkamura,
+ },
+ {
+ CreditsSpecialThanks,
+ CreditsTominaga,
+ CreditsYoshiroTajiri,
+ CreditsSasaki,
+ _,
+ },
+ {
+ CreditsSpecialThanks,
+ CreditsHamano,
+ CreditsChieMatsumiya,
+ CreditsShinozaki,
+ CreditsFujii,
+ },
+ {
+ CreditsSpecialThanks,
+ CreditsSuyama,
+ CreditsMitsuhara,
+ CreditsKomura,
+ CreditsOhashi,
+ },
+ {
+ CreditsSpecialThanks,
+ CreditsTakizawa,
+ CreditsTakada,
+ CreditsKondo,
+ CreditsMashima,
+ },
+ {
+ CreditsInformationSupervisors,
+ CreditsEnomoto,
+ CreditsTerada,
+ CreditsSakurai,
+ CreditsSagawa,
+ },
+ {
+ CreditsCoordinators,
+ CreditsKyokoWatanabe,
+ CreditsNakano,
+ _,
+ _,
+ },
+ {
+ CreditsTaskManagers,
+ CreditsYamagami,
+ CreditsNomoto,
+ _,
+ _,
+ },
+ {
+ CreditsProducers,
+ CreditsJinnai,
+ CreditsIzushi,
+ CreditsTsuru,
+ _,
+ },
+ {
+ _,
+ CreditsExecutiveDirector,
+ CreditsSatoshiTajiri,
+ _,
+ _,
+ },
+ {
+ _,
+ CreditsExecutiveProducers,
+ CreditsIwata,
+ _,
+ _,
+ },
+ {
+ _,
+ CreditsExecutiveProducers,
+ CreditsIshihara,
+ _,
+ _,
+ },
+ {
+ CreditsEnglishVersionCoordinators,
+ CreditsHiroNakamura,
+ CreditsMcMahill,
+ _,
+ _,
+ },
+ {
+ _,
+ CreditsTranslator,
+ CreditsOgasawara,
+ _,
+ _,
+ },
+ {
+ CreditsProgrammers,
+ CreditsMurakawa,
+ CreditsYamamoto,
+ CreditsFunakoshi,
+ CreditsKinashi,
+ },
+ {
+ CreditsGraphicDesigners,
+ CreditsYamamoto,
+ CreditsKinashi,
+ _,
+ _,
+ },
+ {
+ CreditsProductSupport,
+ CreditsNakamichi,
+ CreditsHara,
+ _,
+ _,
+ },
+ {
+ _,
+ CreditsArtwork,
+ CreditsOkada,
+ _,
+ _,
+ },
+ {
+ _,
+ CreditsTextEditor,
+ CreditsLillygren,
+ _,
+ _,
+ },
+ {
+ CreditsNOAProductTesting,
+ CreditsHertzog,
+ CreditsRidgeway,
+ _,
+ _,
+ },
+ {
+ CreditsBrailleCodeCheck,
+ CreditsNFotB,
+ CreditsMaurer,
+ CreditsJapanBrailleLibrary,
+ CreditsEBU,
+ },
+ {
+ CreditsBrailleCodeCheck,
+ CreditsABA,
+ CreditsRNZFotB,
+ _,
+ _,
+ },
+ {
+ CreditsSpecialThanks,
+ CreditsFord,
+ CreditsBarlow,
+ CreditsUesugi,
+ CreditsUyama,
+ },
+ {
+ CreditsSpecialThanks,
+ CreditsHowitt,
+ CreditsTilden,
+ CreditsFujihara,
+ _,
+ },
+};
+#undef _
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/menu_cursor_de.h b/src/data/menu_cursor_de.h
new file mode 100644
index 000000000..cd56f51d9
--- /dev/null
+++ b/src/data/menu_cursor_de.h
@@ -0,0 +1,345 @@
+#ifndef GUARD_DATA_MENU_CURSOR_H
+#define GUARD_DATA_MENU_CURSOR_H
+
+const u8 OutlineCursorTiles_00[] = INCBIN_U8("graphics/interface/outline_cursor_00.4bpp");
+const u8 OutlineCursorTiles_01[] = INCBIN_U8("graphics/interface/outline_cursor_01.4bpp");
+const u8 OutlineCursorTiles_02[] = INCBIN_U8("graphics/interface/outline_cursor_02.4bpp");
+const u8 OutlineCursorTiles_03[] = INCBIN_U8("graphics/interface/outline_cursor_03.4bpp");
+const u8 OutlineCursorTiles_04[] = INCBIN_U8("graphics/interface/outline_cursor_04.4bpp");
+const u8 OutlineCursorTiles_05[] = INCBIN_U8("graphics/interface/outline_cursor_05.4bpp");
+const u8 OutlineCursorTiles_06[] = INCBIN_U8("graphics/interface/outline_cursor_06.4bpp");
+const u8 OutlineCursorTiles_07[] = INCBIN_U8("graphics/interface/outline_cursor_07.4bpp");
+const u8 OutlineCursorTiles_08[] = INCBIN_U8("graphics/interface/outline_cursor_08.4bpp");
+const u8 OutlineCursorTiles_09[] = INCBIN_U8("graphics/interface/outline_cursor_09.4bpp");
+const u8 OutlineCursorTiles_10[] = INCBIN_U8("graphics/interface/outline_cursor_10.4bpp");
+const u8 OutlineCursorTiles_11[] = INCBIN_U8("graphics/interface/outline_cursor_11.4bpp");
+const u8 OutlineCursorTiles_12[] = INCBIN_U8("graphics/interface/outline_cursor_12.4bpp");
+const u8 OutlineCursorTiles_13[] = INCBIN_U8("graphics/interface/outline_cursor_13.4bpp");
+const u8 OutlineCursorTiles_14[] = INCBIN_U8("graphics/interface/outline_cursor_14.4bpp");
+const u8 OutlineCursorTiles_15[] = INCBIN_U8("graphics/interface/outline_cursor_15.4bpp");
+
+const struct OamData gOamData_842F11C = {
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .shape = ST_OAM_V_RECTANGLE
+};
+const struct OamData gOamData_842F124 = {
+ .objMode = ST_OAM_OBJ_WINDOW,
+ .shape = ST_OAM_V_RECTANGLE
+};
+const struct OamData gOamData_842F12C = {
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .shape = ST_OAM_V_RECTANGLE
+};
+
+const union AnimCmd gSpriteAnim_842F134[] = {
+ ANIMCMD_FRAME(0, 63),
+ ANIMCMD_END
+};
+
+const union AnimCmd *const gSpriteAnimTable_842F13C[] = {
+ gSpriteAnim_842F134
+};
+
+const struct SpriteSheet gUnknown_0842F140[] = {
+ { OutlineCursorTiles_00, 0x380, 0xFFF0 },
+ { OutlineCursorTiles_01, 0x380, 0xFFF0 },
+ { OutlineCursorTiles_02, 0x380, 0xFFF0 },
+ { OutlineCursorTiles_03, 0x380, 0xFFF0 },
+ { OutlineCursorTiles_04, 0x380, 0xFFF0 },
+ { OutlineCursorTiles_05, 0x380, 0xFFF0 },
+ { OutlineCursorTiles_06, 0x380, 0xFFF0 },
+ { OutlineCursorTiles_07, 0x380, 0xFFF0 },
+ { OutlineCursorTiles_08, 0x380, 0xFFF0 },
+ { OutlineCursorTiles_09, 0x380, 0xFFF0 },
+ { OutlineCursorTiles_10, 0x380, 0xFFF0 },
+ { OutlineCursorTiles_11, 0x380, 0xFFF0 },
+ { OutlineCursorTiles_12, 0x380, 0xFFF0 },
+ { OutlineCursorTiles_13, 0x380, 0xFFF0 },
+ { OutlineCursorTiles_14, 0x380, 0xFFF0 },
+ { OutlineCursorTiles_15, 0x380, 0xFFF0 }
+};
+
+const struct SpriteSheet gUnknown_0842F1C0[] = {
+ { OutlineCursorTiles_00, 0x380, 0xFFF1 },
+ { OutlineCursorTiles_01, 0x380, 0xFFF1 },
+ { OutlineCursorTiles_02, 0x380, 0xFFF1 },
+ { OutlineCursorTiles_03, 0x380, 0xFFF1 },
+ { OutlineCursorTiles_04, 0x380, 0xFFF1 },
+ { OutlineCursorTiles_05, 0x380, 0xFFF1 },
+ { OutlineCursorTiles_06, 0x380, 0xFFF1 },
+ { OutlineCursorTiles_07, 0x380, 0xFFF1 },
+ { OutlineCursorTiles_08, 0x380, 0xFFF1 },
+ { OutlineCursorTiles_09, 0x380, 0xFFF1 },
+ { OutlineCursorTiles_10, 0x380, 0xFFF1 },
+ { OutlineCursorTiles_11, 0x380, 0xFFF1 },
+ { OutlineCursorTiles_12, 0x380, 0xFFF1 },
+ { OutlineCursorTiles_13, 0x380, 0xFFF1 },
+ { OutlineCursorTiles_14, 0x380, 0xFFF1 },
+ { OutlineCursorTiles_15, 0x380, 0xFFF1 }
+};
+
+const struct SpritePalette gUnknown_0842F240 = {
+ gUnknown_0203A360, 0xfff0
+};
+const struct SpritePalette gUnknown_0842F248 = {
+ gUnknown_0203A360, 0xfff1
+};
+
+const struct SpriteTemplate gSpriteTemplate_842F250[] = {
+ {
+ 0xfff0, 0xfff0, &gOamData_842F11C, gSpriteAnimTable_842F13C, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+ }, {
+ 0xfff0, 0xffff, &gOamData_842F11C, gSpriteAnimTable_842F13C, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+ }, {
+ 0xfff0, 0xffff, &gOamData_842F124, gSpriteAnimTable_842F13C, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+ }
+};
+const struct SpriteTemplate gSpriteTemplate_842F298[] = {
+ {
+ 0xfff1, 0xfff1, &gOamData_842F12C, gSpriteAnimTable_842F13C, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+ }, {
+ 0xfff1, 0xffff, &gOamData_842F12C, gSpriteAnimTable_842F13C, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+ }
+};
+
+
+const struct Subsprite gSubspriteTable_842F2C8[] = {
+ { -1, -1, ST_OAM_V_RECTANGLE, 1, 0, 0 },
+ { 1, -1, ST_OAM_V_RECTANGLE, 1, 8, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F2D8[] = {
+ { -1, -1, ST_OAM_V_RECTANGLE, 1, 0, 0 },
+ { 1, -1, ST_OAM_V_RECTANGLE, 1, 4, 0 },
+ { 9, -1, ST_OAM_V_RECTANGLE, 1, 8, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F2F0[] = {
+ { -1, -1, ST_OAM_V_RECTANGLE, 1, 0, 0 },
+ { 1, -1, ST_OAM_V_RECTANGLE, 1, 4, 0 },
+ { 9, -1, ST_OAM_V_RECTANGLE, 1, 4, 0 },
+ { 17, -1, ST_OAM_V_RECTANGLE, 1, 8, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F310[] = {
+ { -1, -1, ST_OAM_V_RECTANGLE, 1, 0, 0 },
+ { 1, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 25, -1, ST_OAM_V_RECTANGLE, 1, 8, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F328[] = {
+ { -1, -1, ST_OAM_V_RECTANGLE, 1, 0, 0 },
+ { 1, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 33, -1, ST_OAM_V_RECTANGLE, 1, 8, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F340[] = {
+ { -1, -1, ST_OAM_V_RECTANGLE, 1, 0, 0 },
+ { 1, -1, ST_OAM_V_RECTANGLE, 1, 4, 0 },
+ { 9, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 41, -1, ST_OAM_V_RECTANGLE, 1, 8, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F360[] = {
+ { -1, -1, ST_OAM_V_RECTANGLE, 1, 0, 0 },
+ { 1, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 17, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 49, -1, ST_OAM_V_RECTANGLE, 1, 8, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F380[] = {
+ { -1, -1, ST_OAM_V_RECTANGLE, 1, 0, 0 },
+ { 1, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 25, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 57, -1, ST_OAM_V_RECTANGLE, 1, 8, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F3A0[] = {
+ { -1, -1, ST_OAM_V_RECTANGLE, 1, 0, 0 },
+ { 1, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 33, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 65, -1, ST_OAM_V_RECTANGLE, 1, 8, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F3C0[] = {
+ { -1, -1, ST_OAM_V_RECTANGLE, 1, 0, 0 },
+ { 1, -1, ST_OAM_V_RECTANGLE, 1, 4, 0 },
+ { 9, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 41, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 73, -1, ST_OAM_V_RECTANGLE, 1, 8, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F3E8[] = {
+ { -1, -1, ST_OAM_V_RECTANGLE, 1, 0, 0 },
+ { 1, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 33, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 49, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 81, -1, ST_OAM_V_RECTANGLE, 1, 8, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F410[] = {
+ { -1, -1, ST_OAM_V_RECTANGLE, 1, 0, 0 },
+ { 1, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 33, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 57, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 89, -1, ST_OAM_V_RECTANGLE, 1, 8, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F438[] = {
+ { -1, -1, ST_OAM_V_RECTANGLE, 1, 0, 0 },
+ { 1, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 33, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 65, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 97, -1, ST_OAM_V_RECTANGLE, 1, 8, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F460[] = {
+ { -1, -1, ST_OAM_V_RECTANGLE, 1, 0, 0 },
+ { 1, -1, ST_OAM_V_RECTANGLE, 1, 4, 0 },
+ { 9, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 41, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 73, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 105, -1, ST_OAM_V_RECTANGLE, 1, 8, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F490[] = {
+ { -1, -1, ST_OAM_V_RECTANGLE, 1, 0, 0 },
+ { 1, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 33, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 65, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 81, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 113, -1, ST_OAM_V_RECTANGLE, 1, 8, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F4C0[] = {
+ { -1, -1, ST_OAM_V_RECTANGLE, 1, 0, 0 },
+ { 1, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 33, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 65, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 89, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 121, -1, ST_OAM_V_RECTANGLE, 1, 8, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F4F0[] = {
+ { -1, -1, ST_OAM_V_RECTANGLE, 1, 0, 0 },
+ { 1, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 33, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 65, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 97, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 129, -1, ST_OAM_V_RECTANGLE, 1, 8, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F520[] = {
+ { -1, -1, ST_OAM_V_RECTANGLE, 1, 0, 0 },
+ { 1, -1, ST_OAM_V_RECTANGLE, 1, 4, 0 },
+ { 9, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 41, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 73, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 105, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 137, -1, ST_OAM_V_RECTANGLE, 1, 8, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F558[] = {
+ { -1, -1, ST_OAM_V_RECTANGLE, 0, 0, 0 },
+ { 7, -1, ST_OAM_SQUARE, 2, 12, 0 },
+ { 35, -1, ST_OAM_V_RECTANGLE, 0, 8, 0 }
+};
+
+const struct Subsprite *const gUnknown_0842F5BC[] = {
+ gSubspriteTable_842F558
+};
+
+const struct SubspriteTable gSubspriteTables_842F5C0[] = {
+ {1, gMenuCursorSubsprites},
+ {1, gMenuCursorSubsprites},
+ {2, gMenuCursorSubsprites},
+ {3, gMenuCursorSubsprites},
+ {4, gMenuCursorSubsprites},
+ {5, gMenuCursorSubsprites},
+ {6, gMenuCursorSubsprites},
+ {7, gMenuCursorSubsprites},
+ {8, gMenuCursorSubsprites},
+ {9, gMenuCursorSubsprites},
+ {10, gMenuCursorSubsprites},
+ {11, gMenuCursorSubsprites},
+ {12, gMenuCursorSubsprites},
+ {13, gMenuCursorSubsprites},
+ {14, gMenuCursorSubsprites},
+ {15, gMenuCursorSubsprites},
+ {16, gMenuCursorSubsprites},
+ {17, gMenuCursorSubsprites},
+ {18, gMenuCursorSubsprites},
+ {19, gMenuCursorSubsprites},
+ {20, gMenuCursorSubsprites},
+ {21, gMenuCursorSubsprites},
+ {22, gMenuCursorSubsprites},
+ {23, gMenuCursorSubsprites},
+ {24, gMenuCursorSubsprites},
+ {25, gMenuCursorSubsprites},
+ {26, gMenuCursorSubsprites},
+ {27, gMenuCursorSubsprites},
+ {28, gMenuCursorSubsprites},
+ {29, gMenuCursorSubsprites},
+ {30, gMenuCursorSubsprites},
+ {31, gMenuCursorSubsprites}
+};
+
+const struct SubspriteTable gSubspriteTables_842F6C0[] = {
+ {2, gSubspriteTable_842F2C8},
+ {2, gSubspriteTable_842F2C8},
+ {3, gSubspriteTable_842F2D8},
+ {4, gSubspriteTable_842F2F0},
+ {3, gSubspriteTable_842F310},
+ {3, gSubspriteTable_842F328},
+ {4, gSubspriteTable_842F340},
+ {4, gSubspriteTable_842F360},
+ {4, gSubspriteTable_842F380},
+ {4, gSubspriteTable_842F3A0},
+ {5, gSubspriteTable_842F3C0},
+ {5, gSubspriteTable_842F3E8},
+ {5, gSubspriteTable_842F410},
+ {5, gSubspriteTable_842F438},
+ {6, gSubspriteTable_842F460},
+ {6, gSubspriteTable_842F490},
+ {6, gSubspriteTable_842F4C0},
+ {6, gSubspriteTable_842F4F0},
+ {7, gSubspriteTable_842F520}
+};
+
+const struct SubspriteTable gUnknown_0842F758[] = {
+ {3, gMenuCursorSubsprites}
+};
+
+const struct Subsprite gUnknown_0842F760 = {
+ .y = -1, .shape = ST_OAM_V_RECTANGLE, .size = 1
+};
+
+const struct Subsprite gUnknown_0842F768 = {
+ .y = -1, .shape = ST_OAM_V_RECTANGLE, .size = 1, .tileOffset = 8
+};
+
+const struct Subsprite gUnknown_0842F770 = {
+ .y = -1, .shape = ST_OAM_SQUARE, .size = 2, .tileOffset = 12
+};
+
+const struct Subsprite gUnknown_0842F778 = {
+ .y = -1, .shape = ST_OAM_V_RECTANGLE, .size = 1, .tileOffset = 4
+};
+
+const struct Subsprite gUnknown_0842F780 = {
+ .y = -1, .shape = ST_OAM_V_RECTANGLE, .size = 1
+};
+
+const struct Subsprite gUnknown_0842F788 = {
+ .y = -1, .shape = ST_OAM_SQUARE, .size = 2, .tileOffset = 12
+};
+
+const struct Subsprite gUnknown_0842F790 = {
+ .y = -1, .shape = ST_OAM_V_RECTANGLE, .size = 1, .tileOffset = 4
+};
+
+const struct Subsprite gUnknown_0842F798 = {
+ .y = -1, .shape = ST_OAM_V_RECTANGLE, .size = 1, .tileOffset = 8
+};
+
+#endif //GUARD_DATA_MENU_CURSOR_H
diff --git a/src/data/menu_cursor_en.h b/src/data/menu_cursor_en.h
new file mode 100644
index 000000000..a926f2629
--- /dev/null
+++ b/src/data/menu_cursor_en.h
@@ -0,0 +1,363 @@
+#ifndef GUARD_DATA_MENU_CURSOR_H
+#define GUARD_DATA_MENU_CURSOR_H
+
+const u8 OutlineCursorTiles_00[] = INCBIN_U8("graphics/interface/outline_cursor_00.4bpp");
+const u8 OutlineCursorTiles_01[] = INCBIN_U8("graphics/interface/outline_cursor_01.4bpp");
+const u8 OutlineCursorTiles_02[] = INCBIN_U8("graphics/interface/outline_cursor_02.4bpp");
+const u8 OutlineCursorTiles_03[] = INCBIN_U8("graphics/interface/outline_cursor_03.4bpp");
+const u8 OutlineCursorTiles_04[] = INCBIN_U8("graphics/interface/outline_cursor_04.4bpp");
+const u8 OutlineCursorTiles_05[] = INCBIN_U8("graphics/interface/outline_cursor_05.4bpp");
+const u8 OutlineCursorTiles_06[] = INCBIN_U8("graphics/interface/outline_cursor_06.4bpp");
+const u8 OutlineCursorTiles_07[] = INCBIN_U8("graphics/interface/outline_cursor_07.4bpp");
+const u8 OutlineCursorTiles_08[] = INCBIN_U8("graphics/interface/outline_cursor_08.4bpp");
+const u8 OutlineCursorTiles_09[] = INCBIN_U8("graphics/interface/outline_cursor_09.4bpp");
+const u8 OutlineCursorTiles_10[] = INCBIN_U8("graphics/interface/outline_cursor_10.4bpp");
+const u8 OutlineCursorTiles_11[] = INCBIN_U8("graphics/interface/outline_cursor_11.4bpp");
+const u8 OutlineCursorTiles_12[] = INCBIN_U8("graphics/interface/outline_cursor_12.4bpp");
+const u8 OutlineCursorTiles_13[] = INCBIN_U8("graphics/interface/outline_cursor_13.4bpp");
+const u8 OutlineCursorTiles_14[] = INCBIN_U8("graphics/interface/outline_cursor_14.4bpp");
+const u8 OutlineCursorTiles_15[] = INCBIN_U8("graphics/interface/outline_cursor_15.4bpp");
+
+const struct OamData gOamData_842F11C = {
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .shape = ST_OAM_V_RECTANGLE
+};
+const struct OamData gOamData_842F124 = {
+ .objMode = ST_OAM_OBJ_WINDOW,
+ .shape = ST_OAM_V_RECTANGLE
+};
+const struct OamData gOamData_842F12C = {
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .shape = ST_OAM_V_RECTANGLE
+};
+
+const union AnimCmd gSpriteAnim_842F134[] = {
+ ANIMCMD_FRAME(0, 63),
+ ANIMCMD_END
+};
+
+const union AnimCmd *const gSpriteAnimTable_842F13C[] = {
+ gSpriteAnim_842F134
+};
+
+const struct SpriteSheet gUnknown_0842F140[] = {
+ { OutlineCursorTiles_00, 0x1C0, 0xFFF0 },
+ { OutlineCursorTiles_01, 0x1C0, 0xFFF0 },
+ { OutlineCursorTiles_02, 0x1C0, 0xFFF0 },
+ { OutlineCursorTiles_03, 0x1C0, 0xFFF0 },
+ { OutlineCursorTiles_04, 0x1C0, 0xFFF0 },
+ { OutlineCursorTiles_05, 0x1C0, 0xFFF0 },
+ { OutlineCursorTiles_06, 0x1C0, 0xFFF0 },
+ { OutlineCursorTiles_07, 0x1C0, 0xFFF0 },
+ { OutlineCursorTiles_08, 0x1C0, 0xFFF0 },
+ { OutlineCursorTiles_09, 0x1C0, 0xFFF0 },
+ { OutlineCursorTiles_10, 0x1C0, 0xFFF0 },
+ { OutlineCursorTiles_11, 0x1C0, 0xFFF0 },
+ { OutlineCursorTiles_12, 0x1C0, 0xFFF0 },
+ { OutlineCursorTiles_13, 0x1C0, 0xFFF0 },
+ { OutlineCursorTiles_14, 0x1C0, 0xFFF0 },
+ { OutlineCursorTiles_15, 0x1C0, 0xFFF0 }
+};
+
+const struct SpriteSheet gUnknown_0842F1C0[] = {
+ { OutlineCursorTiles_00, 0x1C0, 0xFFF1 },
+ { OutlineCursorTiles_01, 0x1C0, 0xFFF1 },
+ { OutlineCursorTiles_02, 0x1C0, 0xFFF1 },
+ { OutlineCursorTiles_03, 0x1C0, 0xFFF1 },
+ { OutlineCursorTiles_04, 0x1C0, 0xFFF1 },
+ { OutlineCursorTiles_05, 0x1C0, 0xFFF1 },
+ { OutlineCursorTiles_06, 0x1C0, 0xFFF1 },
+ { OutlineCursorTiles_07, 0x1C0, 0xFFF1 },
+ { OutlineCursorTiles_08, 0x1C0, 0xFFF1 },
+ { OutlineCursorTiles_09, 0x1C0, 0xFFF1 },
+ { OutlineCursorTiles_10, 0x1C0, 0xFFF1 },
+ { OutlineCursorTiles_11, 0x1C0, 0xFFF1 },
+ { OutlineCursorTiles_12, 0x1C0, 0xFFF1 },
+ { OutlineCursorTiles_13, 0x1C0, 0xFFF1 },
+ { OutlineCursorTiles_14, 0x1C0, 0xFFF1 },
+ { OutlineCursorTiles_15, 0x1C0, 0xFFF1 }
+};
+
+const struct SpritePalette gUnknown_0842F240 = {
+ gUnknown_0203A360, 0xfff0
+};
+const struct SpritePalette gUnknown_0842F248 = {
+ gUnknown_0203A360, 0xfff1
+};
+
+const struct SpriteTemplate gSpriteTemplate_842F250[] = {
+ {
+ 0xfff0, 0xfff0, &gOamData_842F11C, gSpriteAnimTable_842F13C, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+ }, {
+ 0xfff0, 0xffff, &gOamData_842F11C, gSpriteAnimTable_842F13C, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+ }, {
+ 0xfff0, 0xffff, &gOamData_842F124, gSpriteAnimTable_842F13C, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+ }
+};
+const struct SpriteTemplate gSpriteTemplate_842F298[] = {
+ {
+ 0xfff1, 0xfff1, &gOamData_842F12C, gSpriteAnimTable_842F13C, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+ }, {
+ 0xfff1, 0xffff, &gOamData_842F12C, gSpriteAnimTable_842F13C, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+ }
+};
+
+
+const struct Subsprite gSubspriteTable_842F2C8[] = {
+ { -1, 0, ST_OAM_V_RECTANGLE, 0, 0, 0 },
+ { 1, 0, ST_OAM_V_RECTANGLE, 0, 4, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F2D8[] = {
+ { -1, 0, ST_OAM_V_RECTANGLE, 0, 0, 0 },
+ { 1, 0, ST_OAM_V_RECTANGLE, 0, 2, 0 },
+ { 9, 0, ST_OAM_V_RECTANGLE, 0, 4, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F2F0[] = {
+ { -1, 0, ST_OAM_V_RECTANGLE, 0, 0, 0 },
+ { 1, 0, ST_OAM_V_RECTANGLE, 0, 2, 0 },
+ { 9, 0, ST_OAM_V_RECTANGLE, 0, 2, 0 },
+ { 17, 0, ST_OAM_V_RECTANGLE, 0, 4, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F310[] = {
+ { -1, 0, ST_OAM_V_RECTANGLE, 0, 0, 0 },
+ { 1, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 25, 0, ST_OAM_V_RECTANGLE, 0, 4, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F328[] = {
+ { -1, 0, ST_OAM_V_RECTANGLE, 0, 0, 0 },
+ { 1, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 33, 0, ST_OAM_V_RECTANGLE, 0, 4, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F340[] = {
+ { -1, 0, ST_OAM_V_RECTANGLE, 0, 0, 0 },
+ { 1, 0, ST_OAM_V_RECTANGLE, 0, 2, 0 },
+ { 9, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 41, 0, ST_OAM_V_RECTANGLE, 0, 4, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F360[] = {
+ { -1, 0, ST_OAM_V_RECTANGLE, 0, 0, 0 },
+ { 1, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 17, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 49, 0, ST_OAM_V_RECTANGLE, 0, 4, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F380[] = {
+ { -1, 0, ST_OAM_V_RECTANGLE, 0, 0, 0 },
+ { 1, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 25, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 57, 0, ST_OAM_V_RECTANGLE, 0, 4, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F3A0[] = {
+ { -1, 0, ST_OAM_V_RECTANGLE, 0, 0, 0 },
+ { 1, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 33, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 65, 0, ST_OAM_V_RECTANGLE, 0, 4, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F3C0[] = {
+ { -1, 0, ST_OAM_V_RECTANGLE, 0, 0, 0 },
+ { 1, 0, ST_OAM_V_RECTANGLE, 0, 2, 0 },
+ { 9, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 41, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 73, 0, ST_OAM_V_RECTANGLE, 0, 4, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F3E8[] = {
+ { -1, 0, ST_OAM_V_RECTANGLE, 0, 0, 0 },
+ { 1, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 33, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 49, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 81, 0, ST_OAM_V_RECTANGLE, 0, 4, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F410[] = {
+ { -1, 0, ST_OAM_V_RECTANGLE, 0, 0, 0 },
+ { 1, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 33, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 57, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 89, 0, ST_OAM_V_RECTANGLE, 0, 4, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F438[] = {
+ { -1, 0, ST_OAM_V_RECTANGLE, 0, 0, 0 },
+ { 1, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 33, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 65, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 97, 0, ST_OAM_V_RECTANGLE, 0, 4, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F460[] = {
+ { -1, 0, ST_OAM_V_RECTANGLE, 0, 0, 0 },
+ { 1, 0, ST_OAM_V_RECTANGLE, 0, 2, 0 },
+ { 9, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 41, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 73, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 105, 0, ST_OAM_V_RECTANGLE, 0, 4, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F490[] = {
+ { -1, 0, ST_OAM_V_RECTANGLE, 0, 0, 0 },
+ { 1, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 33, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 65, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 81, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 113, 0, ST_OAM_V_RECTANGLE, 0, 4, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F4C0[] = {
+ { -1, 0, ST_OAM_V_RECTANGLE, 0, 0, 0 },
+ { 1, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 33, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 65, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 89, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 121, 0, ST_OAM_V_RECTANGLE, 0, 4, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F4F0[] = {
+ { -1, 0, ST_OAM_V_RECTANGLE, 0, 0, 0 },
+ { 1, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 33, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 65, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 97, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 129, 0, ST_OAM_V_RECTANGLE, 0, 4, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F520[] = {
+ { -1, 0, ST_OAM_V_RECTANGLE, 0, 0, 0 },
+ { 1, 0, ST_OAM_V_RECTANGLE, 0, 2, 0 },
+ { 9, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 41, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 73, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 105, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 137, 0, ST_OAM_V_RECTANGLE, 0, 4, 0 }
+};
+
+const struct Subsprite gSubspriteTable_842F558[] = {
+ { -1, 0, ST_OAM_V_RECTANGLE, 0, 0, 0 },
+ { 7, 0, ST_OAM_H_RECTANGLE, 2, 6, 0 },
+ { 35, 0, ST_OAM_V_RECTANGLE, 0, 4, 0 }
+};
+
+const struct Subsprite *const gUnknown_0842F570[] = {
+ gSubspriteTable_842F2C8,
+ gSubspriteTable_842F2C8,
+ gSubspriteTable_842F2D8,
+ gSubspriteTable_842F2F0,
+ gSubspriteTable_842F310,
+ gSubspriteTable_842F328,
+ gSubspriteTable_842F340,
+ gSubspriteTable_842F360,
+ gSubspriteTable_842F380,
+ gSubspriteTable_842F3A0,
+ gSubspriteTable_842F3C0,
+ gSubspriteTable_842F3E8,
+ gSubspriteTable_842F410,
+ gSubspriteTable_842F438,
+ gSubspriteTable_842F460,
+ gSubspriteTable_842F490,
+ gSubspriteTable_842F4C0,
+ gSubspriteTable_842F4F0,
+ gSubspriteTable_842F520
+};
+
+const struct Subsprite *const gUnknown_0842F5BC[] = {
+ gSubspriteTable_842F558
+};
+
+const struct SubspriteTable gSubspriteTables_842F5C0[] = {
+ {1, gMenuCursorSubsprites},
+ {1, gMenuCursorSubsprites},
+ {2, gMenuCursorSubsprites},
+ {3, gMenuCursorSubsprites},
+ {4, gMenuCursorSubsprites},
+ {5, gMenuCursorSubsprites},
+ {6, gMenuCursorSubsprites},
+ {7, gMenuCursorSubsprites},
+ {8, gMenuCursorSubsprites},
+ {9, gMenuCursorSubsprites},
+ {10, gMenuCursorSubsprites},
+ {11, gMenuCursorSubsprites},
+ {12, gMenuCursorSubsprites},
+ {13, gMenuCursorSubsprites},
+ {14, gMenuCursorSubsprites},
+ {15, gMenuCursorSubsprites},
+ {1, gMenuCursorSubsprites},
+ {17, gMenuCursorSubsprites},
+ {18, gMenuCursorSubsprites},
+ {19, gMenuCursorSubsprites},
+ {20, gMenuCursorSubsprites},
+ {21, gMenuCursorSubsprites},
+ {22, gMenuCursorSubsprites},
+ {23, gMenuCursorSubsprites},
+ {24, gMenuCursorSubsprites},
+ {25, gMenuCursorSubsprites},
+ {26, gMenuCursorSubsprites},
+ {27, gMenuCursorSubsprites},
+ {28, gMenuCursorSubsprites},
+ {29, gMenuCursorSubsprites},
+ {30, gMenuCursorSubsprites},
+ {31, gMenuCursorSubsprites}
+};
+
+const struct SubspriteTable gSubspriteTables_842F6C0[] = {
+ {2, gSubspriteTable_842F2C8},
+ {2, gSubspriteTable_842F2C8},
+ {3, gSubspriteTable_842F2D8},
+ {4, gSubspriteTable_842F2F0},
+ {3, gSubspriteTable_842F310},
+ {3, gSubspriteTable_842F328},
+ {4, gSubspriteTable_842F340},
+ {4, gSubspriteTable_842F360},
+ {4, gSubspriteTable_842F380},
+ {4, gSubspriteTable_842F3A0},
+ {5, gSubspriteTable_842F3C0},
+ {5, gSubspriteTable_842F3E8},
+ {5, gSubspriteTable_842F410},
+ {5, gSubspriteTable_842F438},
+ {6, gSubspriteTable_842F460},
+ {6, gSubspriteTable_842F490},
+ {6, gSubspriteTable_842F4C0},
+ {6, gSubspriteTable_842F4F0},
+ {7, gSubspriteTable_842F520}
+};
+
+const struct SubspriteTable gUnknown_0842F758[] = {
+ {3, gMenuCursorSubsprites}
+};
+
+const struct Subsprite gUnknown_0842F760 = {
+ .shape = ST_OAM_V_RECTANGLE
+};
+
+const struct Subsprite gUnknown_0842F768 = {
+ .shape = ST_OAM_V_RECTANGLE, .tileOffset = 4
+};
+
+const struct Subsprite gUnknown_0842F770 = {
+ .shape = ST_OAM_H_RECTANGLE, .size = 2, .tileOffset = 6
+};
+
+const struct Subsprite gUnknown_0842F778 = {
+ .shape = ST_OAM_V_RECTANGLE, .tileOffset = 2
+};
+
+const struct Subsprite gUnknown_0842F780 = {
+ .shape = ST_OAM_H_RECTANGLE, .size = 2, .tileOffset = 6
+};
+
+const struct Subsprite gUnknown_0842F788 = {
+ .shape = ST_OAM_V_RECTANGLE, .tileOffset = 2
+};
+
+const struct Subsprite gUnknown_0842F790 = {
+ .shape = ST_OAM_V_RECTANGLE, .tileOffset = 4
+};
+
+#endif //GUARD_DATA_MENU_CURSOR_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..9cffca632
--- /dev/null
+++ b/src/data/pokemon/trainer_class_lookups.h
@@ -0,0 +1,164 @@
+#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_AQUA_LEADER, // AQUA_LEADER
+ TRAINER_CLASS_TEAM_AQUA, // TEAM_AQUA_M
+ TRAINER_CLASS_TEAM_AQUA, // TEAM_AQUA_F
+ TRAINER_CLASS_AROMA_LADY, // AROMA_LADY
+ TRAINER_CLASS_RUIN_MANIAC, // RUIN_MANIAC
+ TRAINER_CLASS_INTERVIEWER, // INTERVIEWER
+ TRAINER_CLASS_TUBER_F, // TUBER_F
+ TRAINER_CLASS_TUBER_M, // TUBER_M
+ TRAINER_CLASS_COOL_TRAINER, // COOL_TRAINER_M
+ TRAINER_CLASS_COOL_TRAINER, // COOL_TRAINER_F
+ TRAINER_CLASS_HEX_MANIAC, // HEX_MANIAC
+ TRAINER_CLASS_LADY, // LADY
+ TRAINER_CLASS_BEAUTY, // BEAUTY
+ TRAINER_CLASS_RICH_BOY, // RICH_BOY
+ TRAINER_CLASS_POKEMANIAC, // POKEMANIAC
+ TRAINER_CLASS_SWIMMER_M, // SWIMMER_M
+ TRAINER_CLASS_BLACK_BELT, // BLACK_BELT
+ TRAINER_CLASS_GUITARIST, // GUITARIST
+ TRAINER_CLASS_KINDLER, // KINDLER
+ TRAINER_CLASS_CAMPER, // CAMPER
+ TRAINER_CLASS_BUG_MANIAC, // BUG_MANIAC
+ TRAINER_CLASS_PSYCHIC, // PSYCHIC_M
+ TRAINER_CLASS_PSYCHIC, // PSYCHIC_F
+ TRAINER_CLASS_GENTLEMAN, // GENTLEMAN
+ TRAINER_CLASS_ELITE_FOUR, // ELITE_FOUR_M
+ TRAINER_CLASS_ELITE_FOUR, // ELITE_FOUR_F
+ TRAINER_CLASS_LEADER, // LEADER_F
+ TRAINER_CLASS_LEADER, // LEADER_M
+ TRAINER_CLASS_LEADER, // LEADER_MF
+ TRAINER_CLASS_SCHOOL_KID, // SCHOOL_KID_M
+ TRAINER_CLASS_SCHOOL_KID, // SCHOOL_KID_F
+ TRAINER_CLASS_SR_AND_JR, // SR_AND_JR
+ TRAINER_CLASS_POKEFAN, // POKEFAN_M
+ TRAINER_CLASS_POKEFAN, // POKEFAN_F
+ TRAINER_CLASS_EXPERT, // EXPERT_M
+ TRAINER_CLASS_EXPERT, // EXPERT_F
+ TRAINER_CLASS_YOUNGSTER, // YOUNGSTER
+ TRAINER_CLASS_CHAMPION, // CHAMPION
+ TRAINER_CLASS_FISHERMAN, // FISHERMAN
+ TRAINER_CLASS_TRIATHLETE, // CYCLING_TRIATHLETE_M
+ TRAINER_CLASS_TRIATHLETE, // CYCLING_TRIATHLETE_F
+ TRAINER_CLASS_TRIATHLETE, // RUNNING_TRIATHLETE_M
+ TRAINER_CLASS_TRIATHLETE, // RUNNING_TRIATHLETE_F
+ TRAINER_CLASS_TRIATHLETE, // SWIMMING_TRIATHLETE_M
+ TRAINER_CLASS_TRIATHLETE, // SWIMMING_TRIATHLETE_F
+ TRAINER_CLASS_DRAGON_TAMER, // DRAGON_TAMER
+ TRAINER_CLASS_BIRD_KEEPER, // BIRD_KEEPER
+ TRAINER_CLASS_NINJA_BOY, // NINJA_BOY
+ TRAINER_CLASS_BATTLE_GIRL, // BATTLE_GIRL
+ TRAINER_CLASS_PARASOL_LADY, // PARASOL_LADY
+ TRAINER_CLASS_SWIMMER_F, // SWIMMER_F
+ TRAINER_CLASS_PICNICKER, // PICNICKER
+ TRAINER_CLASS_TWINS, // TWINS
+ TRAINER_CLASS_SAILOR, // SAILOR
+ TRAINER_CLASS_BOARDER, // BOARDER_1
+ TRAINER_CLASS_BOARDER, // BOARDER_2
+ TRAINER_CLASS_COLLECTOR, // COLLECTOR
+ TRAINER_CLASS_POKEMON_TRAINER_3, // WALLY
+ TRAINER_CLASS_POKEMON_TRAINER_3, // BRENDAN_1
+ TRAINER_CLASS_POKEMON_TRAINER_3, // BRENDAN_2
+ TRAINER_CLASS_POKEMON_TRAINER_3, // BRENDAN_3
+ TRAINER_CLASS_POKEMON_TRAINER_3, // MAY_1
+ TRAINER_CLASS_POKEMON_TRAINER_3, // MAY_2
+ TRAINER_CLASS_POKEMON_TRAINER_3, // MAY_3
+ TRAINER_CLASS_POKEMON_BREEDER, // POKEMON_BREEDER_M
+ TRAINER_CLASS_POKEMON_BREEDER, // POKEMON_BREEDER_F
+ TRAINER_CLASS_POKEMON_RANGER, // POKEMON_RANGER_M
+ TRAINER_CLASS_POKEMON_RANGER, // POKEMON_RANGER_F
+ TRAINER_CLASS_MAGMA_LEADER, // MAGMA_LEADER
+ TRAINER_CLASS_TEAM_MAGMA, // TEAM_MAGMA_M
+ TRAINER_CLASS_TEAM_MAGMA, // TEAM_MAGMA_F
+ TRAINER_CLASS_LASS, // LASS
+ TRAINER_CLASS_BUG_CATCHER, // BUG_CATCHER
+ TRAINER_CLASS_HIKER, // HIKER
+ TRAINER_CLASS_YOUNG_COUPLE, // YOUNG_COUPLE
+ TRAINER_CLASS_OLD_COUPLE, // OLD_COUPLE
+ TRAINER_CLASS_SIS_AND_BRO // SIS_AND_BRO
+};
+
+#endif //POKERUBY_TRAINER_CLASS_LOOKUPS_H
diff --git a/src/data/text/move_descriptions_de.h b/src/data/text/move_descriptions_de.h
new file mode 100644
index 000000000..854336295
--- /dev/null
+++ b/src/data/text/move_descriptions_de.h
@@ -0,0 +1,1771 @@
+static const u8 MoveDescription_Pound[] = _(
+ "Ein Hieb mit den Vorder-\n"
+ "beinen oder dem Schweif.");
+
+static const u8 MoveDescription_KarateChop[] = _(
+ "Gute Möglichkeit, einen\n"
+ "Volltreffer zu landen.");
+
+static const u8 MoveDescription_DoubleSlap[] = _(
+ "Trifft den Gegner 2 - 5-mal\n"
+ "hintereinander.");
+
+static const u8 MoveDescription_CometPunch[] = _(
+ "Trifft den Gegner 2 - 5-mal\n"
+ "hintereinander.");
+
+static const u8 MoveDescription_MegaPunch[] = _(
+ "Ein unglaublich kräftiger\n"
+ "Hieb.");
+
+static const u8 MoveDescription_PayDay[] = _(
+ "Wirft Münzen auf Gegner.\n"
+ "Geld wird erstattet.");
+
+static const u8 MoveDescription_FirePunch[] = _(
+ "Schlag, der dem Gegner evtl.\n"
+ "Verbrennungen zufügt.");
+
+static const u8 MoveDescription_IcePunch[] = _(
+ "Ein Schlag, der den Gegner\n"
+ "evtl. einfriert.");
+
+static const u8 MoveDescription_ThunderPunch[] = _(
+ "Schlag, der den Gegner evtl.\n"
+ "paralysiert.");
+
+static const u8 MoveDescription_Scratch[] = _(
+ "Der Gegner wird mit\n"
+ "scharfen Klauen zerkratzt.");
+
+static const u8 MoveDescription_ViceGrip[] = _(
+ "Umklammert den Gegner mit\n"
+ "großen, kräftigen Zangen.");
+
+static const u8 MoveDescription_Guillotine[] = _(
+ "Kräftige Scheren-Attacke.\n"
+ "Führt evtl. zum K.O.");
+
+static const u8 MoveDescription_RazorWind[] = _(
+ "Eine Attacke, die auf 2\n"
+ "Runden basiert.");
+
+static const u8 MoveDescription_SwordsDance[] = _(
+ "Erhöht den Angriffs-Wert\n"
+ "drastisch.");
+
+static const u8 MoveDescription_Cut[] = _(
+ "Trifft den Gegner mit\n"
+ "Klauen, Scheren o. ä.");
+
+static const u8 MoveDescription_Gust[] = _(
+ "Trifft den Gegner mit Wind-\n"
+ "stoß durch Flügelschlag.");
+
+static const u8 MoveDescription_WingAttack[] = _(
+ "Trifft den Gegner mit weit\n"
+ "gespreizten Flügeln.");
+
+static const u8 MoveDescription_Whirlwind[] = _(
+ "Weht Gegner weg und be-\n"
+ "endet den Kampf in Wildnis.");
+
+static const u8 MoveDescription_Fly[] = _(
+ "Steigt empor in der 1. Runde\n"
+ "und trifft Gegner in der 2.");
+
+static const u8 MoveDescription_Bind[] = _(
+ "Umklammert und trifft den\n"
+ "Gegner 2 - 5-mal.");
+
+static const u8 MoveDescription_Slam[] = _(
+ "Schlag mit einem langen\n"
+ "Schweif, einer Ranke o. ä.");
+
+static const u8 MoveDescription_VineWhip[] = _(
+ "Peitschenähnlicher Schlag\n"
+ "mit Ranken.");
+
+static const u8 MoveDescription_Stomp[] = _(
+ "Stampfen mit Fuß. Gegner\n"
+ "schreckt evtl. zurück.");
+
+static const u8 MoveDescription_DoubleKick[] = _(
+ "Doppeltritt. Der Gegner\n"
+ "wird zweimal getroffen.");
+
+static const u8 MoveDescription_MegaKick[] = _(
+ "Ein extrem heftiger Tritt.");
+
+static const u8 MoveDescription_JumpKick[] = _(
+ "Sprung-Tritt. Selbstschä-\n"
+ "digung bei Misserfolg.");
+
+static const u8 MoveDescription_RollingKick[] = _(
+ "Schneller Tritt aus der\n"
+ "Drehung.");
+
+static const u8 MoveDescription_SandAttack[] = _(
+ "Senkt Genauigkeit des Geg-\n"
+ "ners durch Sand.");
+
+static const u8 MoveDescription_Headbutt[] = _(
+ "Rammt den Gegner und lässt\n"
+ "ihn evtl. zurückschrecken.");
+
+static const u8 MoveDescription_HornAttack[] = _(
+ "Spießt den Gegner mit\n"
+ "spitzen Hörnern auf.");
+
+static const u8 MoveDescription_FuryAttack[] = _(
+ "Spießt den Gegner 2 - 5-mal\n"
+ "mit spitzen Hörnern auf.");
+
+static const u8 MoveDescription_HornDrill[] = _(
+ "K.O.-Attacke, die ein Horn\n"
+ "als Bohrer einsetzt.");
+
+static const u8 MoveDescription_Tackle[] = _(
+ "Trifft den Gegner mit vollem\n"
+ "Körpereinsatz.");
+
+static const u8 MoveDescription_BodySlam[] = _(
+ "Körper-Ramme, kann\n"
+ "Paralyse hervorrufen.");
+
+static const u8 MoveDescription_Wrap[] = _(
+ "Umwickelt Gegner 2 - 5-mal\n"
+ "mit Ranken o. ä.");
+
+static const u8 MoveDescription_TakeDown[] = _(
+ "Rücksichtslose Attacke,\n"
+ "mit Selbstschädigung.");
+
+static const u8 MoveDescription_Thrash[] = _(
+ "Attacke in 2 bis 3 Runden,\n"
+ "die Anwender verwirrt.");
+
+static const u8 MoveDescription_DoubleEdge[] = _(
+ "Lebensgefährlicher Angriff\n"
+ "mit Selbstschädigung.");
+
+static const u8 MoveDescription_TailWhip[] = _(
+ "Hieb mit dem Schweif, senkt\n"
+ "die VERT. des Gegners.");
+
+static const u8 MoveDescription_PoisonSting[] = _(
+ "Angriff mit Widerhaken,\n"
+ "kann Gegner vergiften.");
+
+static const u8 MoveDescription_Twineedle[] = _(
+ "Stacheln an den Vorderbei-\n"
+ "nen treffen Gegner 2-mal.");
+
+static const u8 MoveDescription_PinMissile[] = _(
+ "Spitze Nadeln treffen den\n"
+ "Gegner 2 - 5-mal.");
+
+static const u8 MoveDescription_Leer[] = _(
+ "Gegners VERT.-Wert wird\n"
+ "durch Blick gesenkt.");
+
+static const u8 MoveDescription_Bite[] = _(
+ "Beißt zu und lässt den Geg-\n"
+ "ner evtl. zurückschrecken.");
+
+static const u8 MoveDescription_Growl[] = _(
+ "Knurren, das den ANGR.-Wert\n"
+ "des Gegners senkt.");
+
+static const u8 MoveDescription_Roar[] = _(
+ "Verjagt den Gegner und be-\n"
+ "endet den Kampf in Wildnis.");
+
+static const u8 MoveDescription_Sing[] = _(
+ "Ein Lied, das den Gegner\n"
+ "in tiefen Schlaf versetzt.");
+
+static const u8 MoveDescription_Supersonic[] = _(
+ "Ausstoß bizarrer Schallwel-\n"
+ "len. Verwirrt Gegner evtl.");
+
+static const u8 MoveDescription_SonicBoom[] = _(
+ "Schockwellen. Richten immer\n"
+ "20 KP Schaden an.");
+
+static const u8 MoveDescription_Disable[] = _(
+ "Psycho-Attacke. Blockiert\n"
+ "eine Attacke des Gegners.");
+
+static const u8 MoveDescription_Acid[] = _(
+ "Versprüht ätzende Flüssig-\n"
+ "keit, senkt evtl. VERT.");
+
+static const u8 MoveDescription_Ember[] = _(
+ "Schwache Feuer-Attacke.\n"
+ "Verbrennt Gegner evtl.");
+
+static const u8 MoveDescription_Flamethrower[] = _(
+ "Starke Feuer-Attacke.\n"
+ "Verbrennt Gegner evtl.");
+
+static const u8 MoveDescription_Mist[] = _(
+ "Nebel, der die Änderung der\n"
+ "Werte verhindert.");
+
+static const u8 MoveDescription_WaterGun[] = _(
+ "Der Gegner wird mit Wasser\n"
+ "bespritzt.");
+
+static const u8 MoveDescription_HydroPump[] = _(
+ "Spritzt Wasser mit\n"
+ "Hochdruck auf den Gegner.");
+
+static const u8 MoveDescription_Surf[] = _(
+ "Eine riesige Welle bricht\n"
+ "über den Gegner herein.");
+
+static const u8 MoveDescription_IceBeam[] = _(
+ "Gegner wird von Eisstrahl\n"
+ "getroffen, friert evtl. ein.");
+
+static const u8 MoveDescription_Blizzard[] = _(
+ "Ein Schneesturm, der den\n"
+ "Gegner einfrieren kann.");
+
+static const u8 MoveDescription_Psybeam[] = _(
+ "Feuert einen Strahl ab, der\n"
+ "Gegner verwirren kann.");
+
+static const u8 MoveDescription_BubbleBeam[] = _(
+ "Versprüht Blasen, die den\n"
+ "INIT.-Wert evtl. senken.");
+
+static const u8 MoveDescription_AuroraBeam[] = _(
+ "Regenbogenfarbener Strahl,\n"
+ "senkt evtl. ANGR.-Wert.");
+
+static const u8 MoveDescription_HyperBeam[] = _(
+ "Starke Attacke. Angreifer\n"
+ "setzt eine Runde aus.");
+
+static const u8 MoveDescription_Peck[] = _(
+ "Greift Gegner mit dem\n"
+ "Schnabel an.");
+
+static const u8 MoveDescription_DrillPeck[] = _(
+ "Attacke, bei der der Schna-\n"
+ "bel als Bohrer dient.");
+
+static const u8 MoveDescription_Submission[] = _(
+ "Rücksichtsloser Rempler. \n"
+ "Schädigt auch Angreifer.");
+
+static const u8 MoveDescription_LowKick[] = _(
+ "Tritt, der massigen Gegnern\n"
+ "mehr Schaden zufügt.");
+
+static const u8 MoveDescription_Counter[] = _(
+ "Kontert physischen Tref-\n"
+ "fer mit doppelter Kraft.");
+
+static const u8 MoveDescription_SeismicToss[] = _(
+ "Richtet Schaden gemäß\n"
+ "Level d. Angreifers an.");
+
+static const u8 MoveDescription_Strength[] = _(
+ "Erzeugt enorme Kraft und\n"
+ "rammt den Gegner.");
+
+static const u8 MoveDescription_Absorb[] = _(
+ "Attacke, die die Hälfte des\n"
+ "Schadens absorbiert.");
+
+static const u8 MoveDescription_MegaDrain[] = _(
+ "Attacke, die die Hälfte des\n"
+ "Schadens absorbiert.");
+
+static const u8 MoveDescription_LeechSeed[] = _(
+ "Gegner wird bepflanzt und\n"
+ "verliert jede Runde KP.");
+
+static const u8 MoveDescription_Growth[] = _(
+ "Der Körper wächst und\n"
+ "SPEZ. ANGR. wird erhöht.");
+
+static const u8 MoveDescription_RazorLeaf[] = _(
+ "Trifft Gegner mit Blättern.\n"
+ "Hohe Volltrefferquote.");
+
+static const u8 MoveDescription_SolarBeam[] = _(
+ "Absorbiert Licht in der 1.\n"
+ "Runde, 2. Runde Angriff.");
+
+static const u8 MoveDescription_PoisonPowder[] = _(
+ "Verstreut giftigen Puder,\n"
+ "der Gegner vergiften kann.");
+
+static const u8 MoveDescription_StunSpore[] = _(
+ "Verstreut Puder, der den\n"
+ "Gegner evtl. paralysiert.");
+
+static const u8 MoveDescription_SleepPowder[] = _(
+ "Verstreut Puder, der Geg.\n"
+ "evtl. in Schlaf versetzt.");
+
+static const u8 MoveDescription_PetalDance[] = _(
+ "Angriff in 2-3 Runden.\n"
+ "Angreifer wird verwirrt.");
+
+static const u8 MoveDescription_StringShot[] = _(
+ "Umwickelt Gegner mit Faden\n"
+ "und senkt INIT.-Wert.");
+
+static const u8 MoveDescription_DragonRage[] = _(
+ "Stößt Schockwellen aus, die\n"
+ "40 KP Schaden anrichten.");
+
+static const u8 MoveDescription_FireSpin[] = _(
+ "Schließt Gegner für 2-5\n"
+ "Runden in Feuerkreis ein.");
+
+static const u8 MoveDescription_ThunderShock[] = _(
+ "Elektro-Attacke. Gegner\n"
+ "evtl. paralysiert.");
+
+static const u8 MoveDescription_Thunderbolt[] = _(
+ "Starke Elektro-Attacke,\n"
+ "Gegner evtl. paralysiert.");
+
+static const u8 MoveDescription_ThunderWave[] = _(
+ "Ein schwacher Stromstoß,\n"
+ "der den Gegner paralysiert.");
+
+static const u8 MoveDescription_Thunder[] = _(
+ "Elektro-Attacke, die den\n"
+ "Gegner evtl. paralysiert.");
+
+static const u8 MoveDescription_RockThrow[] = _(
+ "Wirft kleine Steine auf den\n"
+ "Gegner.");
+
+static const u8 MoveDescription_Earthquake[] = _(
+ "Mächtiges Beben. Ist bei\n"
+ "fliegenden Feinden nutzlos.");
+
+static const u8 MoveDescription_Fissure[] = _(
+ "Sofort-K.O. Wirft Gegner\n"
+ "in Gebirgsspalte.");
+
+static const u8 MoveDescription_Dig[] = _(
+ "Gräbt sich in der 1. Runde\n"
+ "ein und trifft in der 2.");
+
+static const u8 MoveDescription_Toxic[] = _(
+ "Vergiftet den Gegner mit \n"
+ "einem starken Toxin.");
+
+static const u8 MoveDescription_Confusion[] = _(
+ "Psycho-Attacke, die den\n"
+ "Gegner evtl. verwirrt.");
+
+static const u8 MoveDescription_Psychic[] = _(
+ "Starke Psycho-Attacke, die\n"
+ "evtl. SPEZ. VERT. senkt.");
+
+static const u8 MoveDescription_Hypnosis[] = _(
+ "Hypno-Attacke, die Gegner\n"
+ "evtl. in Schlaf versetzt.");
+
+static const u8 MoveDescription_Meditate[] = _(
+ "Friedliche Meditation, um\n"
+ "ANGR.-Wert zu steigern.");
+
+static const u8 MoveDescription_Agility[] = _(
+ "Entspannt den Körper, um\n"
+ "INIT.-Wert. zu steigern.");
+
+static const u8 MoveDescription_QuickAttack[] = _(
+ "Sehr schneller Angriff mit\n"
+ "Erstschlaggarantie.");
+
+static const u8 MoveDescription_Rage[] = _(
+ "Erhöht ANGR. des Anwenders\n"
+ "bei jedem gegn. Treffer.");
+
+static const u8 MoveDescription_Teleport[] = _(
+ "Psycho-Angriff, um sofort\n"
+ "aus einem Kampf zu fliehen.");
+
+static const u8 MoveDescription_NightShade[] = _(
+ "Richtet Schaden gemäß\n"
+ "Level d. Angreifers an.");
+
+static const u8 MoveDescription_Mimic[] = _(
+ "Kopiert eine zuvor ausge-\n"
+ "führte Attacke d. Gegners.");
+
+static const u8 MoveDescription_Screech[] = _(
+ "Stößt einen Schrei aus, um\n"
+ "gegn. VERT. zu senken.");
+
+static const u8 MoveDescription_DoubleTeam[] = _(
+ "Erzeugt Ebenbilder, um \n"
+ "Fluchtwert zu erhöhen.");
+
+static const u8 MoveDescription_Recover[] = _(
+ "Max. KP des Anwenders w.\n"
+ "bis zur Hälfte aufgefüllt.");
+
+static const u8 MoveDescription_Harden[] = _(
+ "Stärkt die Muskulatur und\n"
+ "erhöht VERT.-Wert.");
+
+static const u8 MoveDescription_Minimize[] = _(
+ "Anwender schrumpft, um\n"
+ "Fluchtwert zu erhöhen.");
+
+static const u8 MoveDescription_Smokescreen[] = _(
+ "Senkt Genauigkeit d. Geg-\n"
+ "ners mit Rauch, Tinte o. ä.");
+
+static const u8 MoveDescription_ConfuseRay[] = _(
+ "Ein fieser Strahl, der den\n"
+ "Gegner verwirrt.");
+
+static const u8 MoveDescription_Withdraw[] = _(
+ "Rückzug in den harten\n"
+ "Panzer. Erhöht VERT.-Wert.");
+
+static const u8 MoveDescription_DefenseCurl[] = _(
+ "Verbirgt Schwächen durch\n"
+ "Einrollen, VERT.-Wert hoch.");
+
+static const u8 MoveDescription_Barrier[] = _(
+ "Erzeugt Barriere, die den\n"
+ "VERT.-Wert stark erhöht.");
+
+static const u8 MoveDescription_LightScreen[] = _(
+ "Erzeugt Lichtwand u. senkt\n"
+ "SPEZ. ANGR.-Schaden.");
+
+static const u8 MoveDescription_Haze[] = _(
+ "Erzeugt dunklen Dunst.\n"
+ "Löscht alle Statusänder.");
+
+static const u8 MoveDescription_Reflect[] = _(
+ "Erzeugt Lichtwand, schützt\n"
+ "teilweise vor phys. Angr.");
+
+static const u8 MoveDescription_FocusEnergy[] = _(
+ "Bündelt Kraft. Volltreffer-\n"
+ "chance wird erhöht.");
+
+static const u8 MoveDescription_Bide[] = _(
+ "Erträgt 2 Runden Angriffe,\n"
+ "schlägt doppelt zurück.");
+
+static const u8 MoveDescription_Metronome[] = _(
+ "Bewegt Finger und wählt\n"
+ "PKMN-Attacke zufällig aus.");
+
+static const u8 MoveDescription_MirrorMove[] = _(
+ "Erwidert gegn. Angriff mit\n"
+ "derselben Attacke.");
+
+static const u8 MoveDescription_SelfDestruct[] = _(
+ "Richtet großen Schaden an.\n"
+ "Anwender wird besiegt.");
+
+static const u8 MoveDescription_EggBomb[] = _(
+ "Ein Ei wird auf den Gegner\n"
+ "abgefeuert.");
+
+static const u8 MoveDescription_Lick[] = _(
+ "Leck-Attacke mit Zunge.\n"
+ "Gegner evtl. paralysiert.");
+
+static const u8 MoveDescription_Smog[] = _(
+ "Angriff mit Gas. Gegner wird\n"
+ "evtl. vergiftet.");
+
+static const u8 MoveDescription_Sludge[] = _(
+ "Wirft Schlamm auf Gegner.\n"
+ "Evtl. Vergiftung.");
+
+static const u8 MoveDescription_BoneClub[] = _(
+ "Schlägt Gegner mit Keule\n"
+ "und verschreckt ihn evtl.");
+
+static const u8 MoveDescription_FireBlast[] = _(
+ "Feuersbrunst, die alles ver-\n"
+ "sengt. Verbrennt Geg. evtl.");
+
+static const u8 MoveDescription_Waterfall[] = _(
+ "Attacke basiert auf Tempo.\n"
+ "Erklimmt Wasserfälle.");
+
+static const u8 MoveDescription_Clamp[] = _(
+ "Fängt und drückt Gegner\n"
+ "für 2-5 Runden.");
+
+static const u8 MoveDescription_Swift[] = _(
+ "Verschießt sternförmige\n"
+ "Strahlen. Treffergarantie!");
+
+static const u8 MoveDescription_SkullBash[] = _(
+ "Zieht Kopf ein und greift in\n"
+ "der nächsten Runde an.");
+
+static const u8 MoveDescription_SpikeCannon[] = _(
+ "Verschießt spitze Stacheln\n"
+ "und trifft 2 - 5-mal.");
+
+static const u8 MoveDescription_Constrict[] = _(
+ "Schmerzvoller Klammergriff.\n"
+ "Senkt evtl. INIT.-Wert.");
+
+static const u8 MoveDescription_Amnesia[] = _(
+ "Gedächtnisverlust, der\n"
+ "SPEZ. VERT. deutlich erhöht.");
+
+static const u8 MoveDescription_Kinesis[] = _(
+ "Lenkt Gegner ab und senkt\n"
+ "evtl. seine Genauigkeit.");
+
+static const u8 MoveDescription_SoftBoiled[] = _(
+ "Max. KP des Anwenders w.\n"
+ "bis zur Hälfte aufgefüllt.");
+
+static const u8 MoveDescription_HiJumpKick[] = _(
+ "Sprung-Tritt mit Knie. Miss-\n"
+ "erfolg verletzt Anwender.");
+
+static const u8 MoveDescription_Glare[] = _(
+ "Schüchtert Gegner ein, so\n"
+ "dass er paralysiert ist.");
+
+static const u8 MoveDescription_DreamEater[] = _(
+ "Schlafendem Gegner wird\n"
+ "halber Schaden abgezogen.");
+
+static const u8 MoveDescription_PoisonGas[] = _(
+ "Hüllt Gegner in giftiges Gas\n"
+ "ein, kann vergiften.");
+
+static const u8 MoveDescription_Barrage[] = _(
+ "Wirft 2 - 5-mal runde Gegen-\n"
+ "stände auf den Gegner.");
+
+static const u8 MoveDescription_LeechLife[] = _(
+ "Ein Angriff, der die Hälfte\n"
+ "des Schadens saugt.");
+
+static const u8 MoveDescription_LovelyKiss[] = _(
+ "Fordert Kuss mit bösem\n"
+ "Blick. Evtl. Schlaf.");
+
+static const u8 MoveDescription_SkyAttack[] = _(
+ "Sucht nach Schwächen,\n"
+ "Treffer nächste Runde.");
+
+static const u8 MoveDescription_Transform[] = _(
+ "Ändert die Anwenderzellen\n"
+ "für ein Ebenbild d. Gegners.");
+
+static const u8 MoveDescription_Bubble[] = _(
+ "Angriff mit Blasen. INIT.-\n"
+ "Wert wird evtl. gesenkt.");
+
+static const u8 MoveDescription_DizzyPunch[] = _(
+ "Rhythmischer Schlag, der\n"
+ "den Gegner verwirren kann.");
+
+static const u8 MoveDescription_Spore[] = _(
+ "Erzeugt eine Wolke aus ein-\n"
+ "schläfernden Sporen.");
+
+static const u8 MoveDescription_Flash[] = _(
+ "Erzeugt helles Licht, das\n"
+ "gegn. Genauigkeit senkt.");
+
+static const u8 MoveDescription_Psywave[] = _(
+ "Psycho-Welle mit unter-\n"
+ "schiedlicher Intensität.");
+
+static const u8 MoveDescription_Splash[] = _(
+ "Nur ein Platscher..., der\n"
+ "überhaupt nichts bewirkt.");
+
+static const u8 MoveDescription_AcidArmor[] = _(
+ "Verflüssigt Körper d. An-\n"
+ "wenders. Erhört VERT.");
+
+static const u8 MoveDescription_Crabhammer[] = _(
+ "Schlägt mit Schere zu.\n"
+ "Volltrefferchance hoch.");
+
+static const u8 MoveDescription_Explosion[] = _(
+ "Richtet großen Schaden an.\n"
+ "Anwender wird besiegt.");
+
+static const u8 MoveDescription_FurySwipes[] = _(
+ "Beharkt Gegner 2 - 5-mal\n"
+ "mit scharfen Klauen o. ä.");
+
+static const u8 MoveDescription_Bonemerang[] = _(
+ "Ein Bumerang aus Knochen,\n"
+ "der zweimal trifft.");
+
+static const u8 MoveDescription_Rest[] = _(
+ "Anwender schläft 2 Runden,\n"
+ "KP und Status erneuert.");
+
+static const u8 MoveDescription_RockSlide[] = _(
+ "Schleudert riesige Felsen.\n"
+ "Verschreckt evtl. Gegner.");
+
+static const u8 MoveDescription_HyperFang[] = _(
+ "Angriff mit Zähnen.\n"
+ "Verschreckt evtl. Gegner.");
+
+static const u8 MoveDescription_Sharpen[] = _(
+ "Reduziert Polygonzahl und\n"
+ "erhöht ANGR.-Wert.");
+
+static const u8 MoveDescription_Conversion[] = _(
+ "Wandelt Typ d. Anwenders in\n"
+ "eigenen Attacken-Typ.");
+
+static const u8 MoveDescription_TriAttack[] = _(
+ "Feuert 3 Arten von Strahlen\n"
+ "gleichzeitig ab.");
+
+static const u8 MoveDescription_SuperFang[] = _(
+ "Greift mit scharfen Zähnen\n"
+ "an. Halbiert gegnerische KP.");
+
+static const u8 MoveDescription_Slash[] = _(
+ "Hieb mit Klauen o. ä. Hohe\n"
+ "Volltrefferquote.");
+
+static const u8 MoveDescription_Substitute[] = _(
+ "Lockvogel, der 1/4 der max.\n"
+ "KP des Anwenders besitzt.");
+
+static const u8 MoveDescription_Struggle[] = _(
+ "Einsatz nur bei verbrauch-\n"
+ "ten AP. Selbstschädigung!");
+
+static const u8 MoveDescription_Sketch[] = _(
+ "Kopiert stets den zuletzt\n"
+ "erlittenen Angriff.");
+
+static const u8 MoveDescription_TripleKick[] = _(
+ "Tritt Gegner 3-mal nach-\n"
+ "einander. Härte nimmt zu.");
+
+static const u8 MoveDescription_Thief[] = _(
+ "Kann das vom Gegner\n"
+ "gehaltene Item stehlen.");
+
+static const u8 MoveDescription_SpiderWeb[] = _(
+ "Wickelt Gegner ein. Flucht \n"
+ "oder Tausch unmöglich.");
+
+static const u8 MoveDescription_MindReader[] = _(
+ "Ahnt gegnerische Aktion.\n"
+ "Nächste Attacke trifft.");
+
+static const u8 MoveDescription_Nightmare[] = _(
+ "Bewirkt 1/4 Schaden pro\n"
+ "Zug bei schlafendem Gegner.");
+
+static const u8 MoveDescription_FlameWheel[] = _(
+ "Feuer-Attacke, die Gegner\n"
+ "evtl. verbrennt.");
+
+static const u8 MoveDescription_Snore[] = _(
+ "Laute Attacke. Kann nur im\n"
+ "Schlaf benutzt werden.");
+
+static const u8 MoveDescription_Curse[] = _(
+ "Ein Angriff, der bei GEIST-\n"
+ "PKMN anders funktioniert.");
+
+static const u8 MoveDescription_Flail[] = _(
+ "Richtet mehr Schaden an,\n"
+ "wenn eigene KP niedrig sind.");
+
+static const u8 MoveDescription_Conversion2[] = _(
+ "Anwender wird resistent\n"
+ "gegen letzten Angr.-Typ.");
+
+static const u8 MoveDescription_Aeroblast[] = _(
+ "Erzeugt ein Vakuum.\n"
+ "Hohe Volltrefferquote.");
+
+static const u8 MoveDescription_CottonSpore[] = _(
+ "Sporen heften sich an den\n"
+ "Gegner. Senkt INIT.-Wert.");
+
+static const u8 MoveDescription_Reversal[] = _(
+ "Richtet mehr Schaden an,\n"
+ "wenn eigene KP niedrig sind.");
+
+static const u8 MoveDescription_Spite[] = _(
+ "AP des letzten gegner.\n"
+ "Angriffs werden gesenkt.");
+
+static const u8 MoveDescription_PowderSnow[] = _(
+ "Schnee auf Gegner, der\n"
+ "evtl. eingefroren wird.");
+
+static const u8 MoveDescription_Protect[] = _(
+ "Weicht Angriff aus.\n"
+ "Scheitert evtl. bei Wdh.");
+
+static const u8 MoveDescription_MachPunch[] = _(
+ "Schneller Hieb, der stets\n"
+ "zuerst trifft.");
+
+static const u8 MoveDescription_ScaryFace[] = _(
+ "Erschreckt mit Grimasse. \n"
+ "INIT.-Wert sinkt deutlich.");
+
+static const u8 MoveDescription_FaintAttack[] = _(
+ "Zieht Gegner heran und\n"
+ "trifft mit Sicherheit.");
+
+static const u8 MoveDescription_SweetKiss[] = _(
+ "Fordert Kuss mit süßem\n"
+ "Blick. Verwirrt Gegner evtl.");
+
+static const u8 MoveDescription_BellyDrum[] = _(
+ "Erhöht ANGR.-Wert,\n"
+ "opfert jedoch KP.");
+
+static const u8 MoveDescription_SludgeBomb[] = _(
+ "Wirft Schlamm auf Gegner\n"
+ "und vergiftet ihn evtl.");
+
+static const u8 MoveDescription_MudSlap[] = _(
+ "Wirft Gegner Matsch ins Ge-\n"
+ "sicht. Genauigkeit sinkt.");
+
+static const u8 MoveDescription_Octazooka[] = _(
+ "Verschießt Tinte und senkt\n"
+ "dadurch Genauigkeit.");
+
+static const u8 MoveDescription_Spikes[] = _(
+ "Richtet bei Tausch Schaden\n"
+ "mit Stacheln an.");
+
+static const u8 MoveDescription_ZapCannon[] = _(
+ "Kräftige, ungenaue At-\n"
+ "tacke, die evtl. paralysiert.");
+
+static const u8 MoveDescription_Foresight[] = _(
+ "Verhindert Anstieg von\n"
+ "gegnerischem Fluchtwert.");
+
+static const u8 MoveDescription_DestinyBond[] = _(
+ "Wird der Angreifer besiegt,\n"
+ "gilt das auch für d. Gegner.");
+
+static const u8 MoveDescription_PerishSong[] = _(
+ "Wer dieses Lied hört, wird\n"
+ "nach 3 Runden besiegt.");
+
+static const u8 MoveDescription_IcyWind[] = _(
+ "Eis-Attacke, die den INIT.-\n"
+ "Wert des Gegners senkt.");
+
+static const u8 MoveDescription_Detect[] = _(
+ "Wendet Attacken ab, Erfolg\n"
+ "sinkt bei Wiederholung.");
+
+static const u8 MoveDescription_BoneRush[] = _(
+ "Greift Gegner 2 - 5-mal in\n"
+ "Folge mit einem Knochen an.");
+
+static const u8 MoveDescription_LockOn[] = _(
+ "Visiert Gegner an u. trifft\n"
+ "in der nächsten Runde.");
+
+static const u8 MoveDescription_Outrage[] = _(
+ "Wiederholt Angriff 2-3 Run-\n"
+ "den lang. Verwirrt Anwender.");
+
+static const u8 MoveDescription_Sandstorm[] = _(
+ "Erzeugt einen Sandsturm,\n"
+ "der mehrere Runden wütet.");
+
+static const u8 MoveDescription_GigaDrain[] = _(
+ "Absorbiert die Hälfte des\n"
+ "angerichteten Schadens.");
+
+static const u8 MoveDescription_Endure[] = _(
+ "Hält jeder Attacke 1 Runde\n"
+ "stand. 1 KP bleibt stets.");
+
+static const u8 MoveDescription_Charm[] = _(
+ "Betört den Gegner u. redu-\n"
+ "ziert seinen ANGR. deutlich.");
+
+static const u8 MoveDescription_Rollout[] = _(
+ "Attacke, die 5 Runden\n"
+ "dauert. Die Härte nimmt zu.");
+
+static const u8 MoveDescription_FalseSwipe[] = _(
+ "Ein Angriff, der dem Gegner\n"
+ "zumindest 1 KP lässt.");
+
+static const u8 MoveDescription_Swagger[] = _(
+ "Verwirrt den Gegner und\n"
+ "erhöht ANGR.-Wert deutlich.");
+
+static const u8 MoveDescription_MilkDrink[] = _(
+ "Füllt bis zur Hälfte der max.\n"
+ "KP des Benutzers auf.");
+
+static const u8 MoveDescription_Spark[] = _(
+ "Elektro-Hieb, der Gegner\n"
+ "paralysieren kann.");
+
+static const u8 MoveDescription_FuryCutter[] = _(
+ "Eine Attacke, deren Härte\n"
+ "bei jedem Treffer zunimmt.");
+
+static const u8 MoveDescription_SteelWing[] = _(
+ "Trifft den Gegner hart mit\n"
+ "ausgebreiteten Flügeln.");
+
+static const u8 MoveDescription_MeanLook[] = _(
+ "Böser Blick, der die Flucht\n"
+ "des Gegners vereitelt.");
+
+static const u8 MoveDescription_Attract[] = _(
+ "Angriff des anderen Ge-\n"
+ "schlechts unwahrscheinl.");
+
+static const u8 MoveDescription_SleepTalk[] = _(
+ "Benutzt per Zufall eine\n"
+ "Attacke im Schlaf.");
+
+static const u8 MoveDescription_HealBell[] = _(
+ "Läutet beruhigend, heilt\n"
+ "alle Status-Veränderungen.");
+
+static const u8 MoveDescription_Return[] = _(
+ "Angriff, dessen Kraft bei \n"
+ "Freundschaft größer wird.");
+
+static const u8 MoveDescription_Present[] = _(
+ "Eine Bombe als Geschenk. Es\n"
+ "kann KP wiederherstellen.");
+
+static const u8 MoveDescription_Frustration[] = _(
+ "Die Attacke ist stärker bei\n"
+ "verhassten TRAINERn.");
+
+static const u8 MoveDescription_Safeguard[] = _(
+ "Mystische Kraft, die alle\n"
+ "Statusprobleme verhindert.");
+
+static const u8 MoveDescription_PainSplit[] = _(
+ "Addiert KP v. Anwender u.\n"
+ "Gegner, teilt gerecht auf.");
+
+static const u8 MoveDescription_SacredFire[] = _(
+ "Mystische Feuer-Attacke, \n"
+ "die d. Geg. evtl. verbrennt.");
+
+static const u8 MoveDescription_Magnitude[] = _(
+ "Ein erdbebenartiger An-\n"
+ "griff von zufälliger Stärke.");
+
+static const u8 MoveDescription_DynamicPunch[] = _(
+ "Kräftige Attacke, die ver-\n"
+ "wirrt, aber ungenau ist.");
+
+static const u8 MoveDescription_Megahorn[] = _(
+ "Brutaler Frontalangriff\n"
+ "mit spitzen Hörnern.");
+
+static const u8 MoveDescription_DragonBreath[] = _(
+ "Fegt den Gegner mit zer-\n"
+ "störerisch heißem Atem weg.");
+
+static const u8 MoveDescription_BatonPass[] = _(
+ "Tauscht PKMN aus. Alle Än-\n"
+ "derungen bleiben bestehen.");
+
+static const u8 MoveDescription_Encore[] = _(
+ "Gegner wiederholt letzten\n"
+ "Angriff 2 - 6-mal.");
+
+static const u8 MoveDescription_Pursuit[] = _(
+ "Richtet großen Schaden bei\n"
+ "Austausch des Gegners an.");
+
+static const u8 MoveDescription_RapidSpin[] = _(
+ "Trifft den Gegner durch\n"
+ "Drehen mit max. Tempo.");
+
+static const u8 MoveDescription_SweetScent[] = _(
+ "Lockt Gegner an und senkt\n"
+ "seinen Fluchtwert.");
+
+static const u8 MoveDescription_IronTail[] = _(
+ "Att. mit hartem Schweif. \n"
+ "Senkt evtl. VERT.-Wert.");
+
+static const u8 MoveDescription_MetalClaw[] = _(
+ "Klauen-Attacke. Evtl. Er-\n"
+ "höhung d. ANGR.-Wert d. Anw.");
+
+static const u8 MoveDescription_VitalThrow[] = _(
+ "Attacke stets gleich, aber\n"
+ "mit Treffergarantie.");
+
+static const u8 MoveDescription_MorningSun[] = _(
+ "Füllt KP auf. Die Menge\n"
+ "hängt vom Wetter ab.");
+
+static const u8 MoveDescription_Synthesis[] = _(
+ "Füllt KP auf. Die Menge\n"
+ "hängt vom Wetter ab.");
+
+static const u8 MoveDescription_Moonlight[] = _(
+ "Füllt KP auf. Die Menge\n"
+ "hängt vom Wetter ab.");
+
+static const u8 MoveDescription_HiddenPower[] = _(
+ "Die Wirkung dieser Attacke\n"
+ "hängt vom Benutzer ab.");
+
+static const u8 MoveDescription_CrossChop[] = _(
+ "Doppelter Hieb. Hohe \n"
+ "Volltrefferquote.");
+
+static const u8 MoveDescription_Twister[] = _(
+ "Trifft Gegner mit\n"
+ "heftigem Wirbelsturm.");
+
+static const u8 MoveDescription_RainDance[] = _(
+ "Erhöht Stärke von WASSER-\n"
+ "Attacken 5 Runden lang.");
+
+static const u8 MoveDescription_SunnyDay[] = _(
+ "Erhöht Stärke von FEUER-\n"
+ "Attacken 5 Runden lang.");
+
+static const u8 MoveDescription_Crunch[] = _(
+ "Beißt mit Reißzähnen zu und\n"
+ "senkt evtl. SPEZ. VERT.");
+
+static const u8 MoveDescription_MirrorCoat[] = _(
+ "Kontert d. Spezial-Attacke\n"
+ "d. Geg. mit 2-facher Kraft.");
+
+static const u8 MoveDescription_PsychUp[] = _(
+ "Kopiert Effekte d. Gegners\n"
+ "u. gibt sie dem Angreifer.");
+
+static const u8 MoveDescription_ExtremeSpeed[] = _(
+ "Extrem schnelle und kraft-\n"
+ "volle Attacke.");
+
+static const u8 MoveDescription_AncientPower[] = _(
+ "Ein Angriff, der alle\n"
+ "Status-Werte erhöhen kann.");
+
+static const u8 MoveDescription_ShadowBall[] = _(
+ "Bewirft Gegner und senkt\n"
+ "evtl. SPEZ. VERT.");
+
+static const u8 MoveDescription_FutureSight[] = _(
+ "Stärkt innere Kraft. Trifft\n"
+ "2 Runden später.");
+
+static const u8 MoveDescription_RockSmash[] = _(
+ "Zertrümmernder Angriff, \n"
+ "der evtl. VERT.-Wert senkt.");
+
+static const u8 MoveDescription_Whirlpool[] = _(
+ "Hält Gegner 2-5 Züge in\n"
+ "einem Strudel gefangen.");
+
+static const u8 MoveDescription_BeatUp[] = _(
+ "Ruft POKéMON hinzu, um an\n"
+ "dem Angriff teilzuhaben.");
+
+static const u8 MoveDescription_FakeOut[] = _(
+ "Trifft schon mit dem ersten\n"
+ "Schlag. Verjagt Gegner evtl.");
+
+static const u8 MoveDescription_Uproar[] = _(
+ "Erzeugt für 2-5 Züge einen\n"
+ "Aufruhr. Verhindert Schlaf.");
+
+static const u8 MoveDescription_Stockpile[] = _(
+ "Lädt Kraft für bis zu 3\n"
+ "Runden auf.");
+
+static const u8 MoveDescription_SpitUp[] = _(
+ "Entlädt gehortete Kraft.\n"
+ "Je mehr, desto besser.");
+
+static const u8 MoveDescription_Swallow[] = _(
+ "Absorbiert gehortete\n"
+ "Kraft. Stellt KP wieder her.");
+
+static const u8 MoveDescription_HeatWave[] = _(
+ "Gegner wird von heißem Atem\n"
+ "getroffen. Verbrennt evtl.");
+
+static const u8 MoveDescription_Hail[] = _(
+ "Erzeugt Hagelsturm, der in\n"
+ "jeder Runde trifft.");
+
+static const u8 MoveDescription_Torment[] = _(
+ "Quält Gegner u. verhindert\n"
+ "Wdh. eines Angriffs.");
+
+static const u8 MoveDescription_Flatter[] = _(
+ "Verwirrt den Gegner, erhöht\n"
+ "aber dessen SPEZ. ANGR.");
+
+static const u8 MoveDescription_WillOWisp[] = _(
+ "Fügt dem Gegner \n"
+ "Verbrennungen zu.");
+
+static const u8 MoveDescription_Memento[] = _(
+ "Der Benutzer ist besiegt\n"
+ "und senkt die gegn. Werte.");
+
+static const u8 MoveDescription_Facade[] = _(
+ "Erhöht ANGR. nach Verbren-\n"
+ "nung, Paralyse o. Vergift.");
+
+static const u8 MoveDescription_FocusPunch[] = _(
+ "Angriff, der später trifft.\n"
+ "Ben. schreckt evtl. zurück.");
+
+static const u8 MoveDescription_SmellingSalt[] = _(
+ "Effektiv geg. paralysierte\n"
+ "Gegner. Heilt sie aber auch.");
+
+static const u8 MoveDescription_FollowMe[] = _(
+ "Zieht Aufmerksamkeit an.\n"
+ "Gegner greift nur Anw. an.");
+
+static const u8 MoveDescription_NaturePower[] = _(
+ "Die Elementklasse des\n"
+ "Angriffs hängt vom Ort ab.");
+
+static const u8 MoveDescription_Charge[] = _(
+ "Lädt Energie für den kom-\n"
+ "menden Elektro-Angr. auf.");
+
+static const u8 MoveDescription_Taunt[] = _(
+ "Legt den Gegner rein. Er\n"
+ "benutzt nur noch Angriffe.");
+
+static const u8 MoveDescription_HelpingHand[] = _(
+ "Steigert die Kraft der An-\n"
+ "griffe des Getroffenen.");
+
+static const u8 MoveDescription_Trick[] = _(
+ "Betrügt beim Handel\n"
+ "mit Gegenständen.");
+
+static const u8 MoveDescription_RolePlay[] = _(
+ "Parodiert Gegner u. kopiert\n"
+ "seine Spezialfähigkeiten.");
+
+static const u8 MoveDescription_Wish[] = _(
+ "Ein Wunsch, der KP auffüllt.\n"
+ "Die Erfüllung braucht Zeit.");
+
+static const u8 MoveDescription_Assist[] = _(
+ "Greift zufällig mit einem\n"
+ "Angriff d. Partners an.");
+
+static const u8 MoveDescription_Ingrain[] = _(
+ "Verwurzelung füllt KP auf.\n"
+ "Austausch unmöglich.");
+
+static const u8 MoveDescription_Superpower[] = _(
+ "Steigert Stärke deutlich,\n"
+ "senkt aber Status-Werte.");
+
+static const u8 MoveDescription_MagicCoat[] = _(
+ "Gibt Spezialeffekte zurück\n"
+ "an Benutzer.");
+
+static const u8 MoveDescription_Recycle[] = _(
+ "Recycling eines\n"
+ "verwendeten Items.");
+
+static const u8 MoveDescription_Revenge[] = _(
+ "Attacke wird stärker, wenn\n"
+ "Anwender Schaden nimmt.");
+
+static const u8 MoveDescription_BrickBreak[] = _(
+ "Durchbricht Barrieren und\n"
+ "verursacht Schaden.");
+
+static const u8 MoveDescription_Yawn[] = _(
+ "Gegner gähnt und schläft\n"
+ "in der nächsten Runde ein.");
+
+static const u8 MoveDescription_KnockOff[] = _(
+ "Schlägt Gegner Item weg.\n"
+ "Vereitelt so den Gebrauch.");
+
+static const u8 MoveDescription_Endeavor[] = _(
+ "Wird stärker, wenn Anw.-KP\n"
+ "geringer als Gegner-KP ist.");
+
+static const u8 MoveDescription_Eruption[] = _(
+ "Je höher KP des Benutzers,\n"
+ "desto mehr Schaden.");
+
+static const u8 MoveDescription_SkillSwap[] = _(
+ "Anw. tauscht Spezial-\n"
+ "fähigkeit mit POKéMON.");
+
+static const u8 MoveDescription_Imprison[] = _(
+ "Hindert Gegner an Atta-\n"
+ "cken, die d. Benutzer kennt.");
+
+static const u8 MoveDescription_Refresh[] = _(
+ "Kuriert Vergiftungen, Para-\n"
+ "lyse und Verbrennung.");
+
+static const u8 MoveDescription_Grudge[] = _(
+ "Wenn Anw. bes., werden AP\n"
+ "der Finalattacke gelöscht.");
+
+static const u8 MoveDescription_Snatch[] = _(
+ "Immunität geg. den Effekt\n"
+ "d. nächsten gegn. Angriffs.");
+
+static const u8 MoveDescription_SecretPower[] = _(
+ "Angriff, dessen Auswirkung\n"
+ "abhängig vom Ort ist.");
+
+static const u8 MoveDescription_Dive[] = _(
+ "Taucht in der 1. Runde\n"
+ "unter u. trifft in der 2.");
+
+static const u8 MoveDescription_ArmThrust[] = _(
+ "Schläge mit geradem Arm, die\n"
+ "Gegner 2 - 5-mal treffen.");
+
+static const u8 MoveDescription_Camouflage[] = _(
+ "Die Elementklasse des\n"
+ "POKéMON hängt vom Ort ab.");
+
+static const u8 MoveDescription_TailGlow[] = _(
+ "Ein blinkendes Licht. SPEZ.\n"
+ "ANGR. wird deutlich erhöht.");
+
+static const u8 MoveDescription_LusterPurge[] = _(
+ "Angriff mit grellem Licht.\n"
+ "Senkt evtl. SPEZ. VERT.");
+
+static const u8 MoveDescription_MistBall[] = _(
+ "Angriff m. Daunengestöber,\n"
+ "Senkt evtl. SPEZ. ANGR.");
+
+static const u8 MoveDescription_FeatherDance[] = _(
+ "Hüllt Gegner in Daunen und\n"
+ "senkt ANGR.-Wert deutlich.");
+
+static const u8 MoveDescription_TeeterDance[] = _(
+ "Verwirrt alle POKéMON im \n"
+ "Kampf.");
+
+static const u8 MoveDescription_BlazeKick[] = _(
+ "Hohe Volltrefferquote. Ver-\n"
+ "ursacht evtl. Verbrennung.");
+
+static const u8 MoveDescription_MudSport[] = _(
+ "Bedeckt Anw. mit Lehm u. er-\n"
+ "höht Schutz geg. Elek.-Att.");
+
+static const u8 MoveDescription_IceBall[] = _(
+ "Angriff für 5 Runden. \n"
+ "Stärker, wenn Treffer.");
+
+static const u8 MoveDescription_NeedleArm[] = _(
+ "Angriff mit dornigen Armen. \n"
+ "Geg. schreckt evtl. zurück.");
+
+static const u8 MoveDescription_SlackOff[] = _(
+ "Durch Müßiggang wird die\n"
+ "Hälfte d. max. KP aufgefüllt.");
+
+static const u8 MoveDescription_HyperVoice[] = _(
+ "Laute Attacke mit Schall-\n"
+ "wellen.");
+
+static const u8 MoveDescription_PoisonFang[] = _(
+ "Angriff mit Reißzähnen. \n"
+ "Gegner wird evtl. vergiftet.");
+
+static const u8 MoveDescription_CrushClaw[] = _(
+ "Angriff mit scharfen Klau-\n"
+ "en. Senkt evtl. VERT.-Wert.");
+
+static const u8 MoveDescription_BlastBurn[] = _(
+ "Starker Angriff. Angreifer\n"
+ "muss eine Runde aussetzen.");
+
+static const u8 MoveDescription_HydroCannon[] = _(
+ "Starker Angriff. Angreifer\n"
+ "muss eine Runde aussetzen.");
+
+static const u8 MoveDescription_MeteorMash[] = _(
+ "Ein Schlag wie ein Meteor.\n"
+ "Erhöht evtl. ANGR.-Wert.");
+
+static const u8 MoveDescription_Astonish[] = _(
+ "Angriff, der Gegner evtl.\n"
+ "zurückschrecken lässt.");
+
+static const u8 MoveDescription_WeatherBall[] = _(
+ "Elementkl. u. Stärke der At-\n"
+ "tacke sind wetterabhängig.");
+
+static const u8 MoveDescription_Aromatherapy[] = _(
+ "Heilt alle Status-Probleme\n"
+ "mit beruhigendem Duft.");
+
+static const u8 MoveDescription_FakeTears[] = _(
+ "Täuscht Weinen vor, um\n"
+ "gegn. SPEZ. VERT. zu senken.");
+
+static const u8 MoveDescription_AirCutter[] = _(
+ "Greift mit heftigem Wind an.\n"
+ "Hohe Volltrefferquote.");
+
+static const u8 MoveDescription_Overheat[] = _(
+ "Angriff mit voller Kraft.\n"
+ "SPEZ. ANGR. sinkt deutlich.");
+
+static const u8 MoveDescription_OdorSleuth[] = _(
+ "Hindert Gegner daran, ihren\n"
+ "Fluchtwert zu erhöhen.");
+
+static const u8 MoveDescription_RockTomb[] = _(
+ "Hält den Feind mit Steinen\n"
+ "auf u. senkt INIT.-Wert.");
+
+static const u8 MoveDescription_SilverWind[] = _(
+ "Pulver-Attacke, die evtl.\n"
+ "die Werte erhöht.");
+
+static const u8 MoveDescription_MetalSound[] = _(
+ "Stößt einen spitzen Schrei\n"
+ "aus. Senkt SPEZ. VERT.");
+
+static const u8 MoveDescription_GrassWhistle[] = _(
+ "Versetzt Gegner mit schö-\n"
+ "ner Melodie in den Schlaf.");
+
+static const u8 MoveDescription_Tickle[] = _(
+ "Bringt Gegner zum Lachen.\n"
+ "ANGR. u. VERT. sinken.");
+
+static const u8 MoveDescription_CosmicPower[] = _(
+ "Erhöht VERT. u. SPEZ. VERT.\n"
+ "durch mystische Kraft.");
+
+static const u8 MoveDescription_WaterSpout[] = _(
+ "Ist wirkungsvoller, wenn KP\n"
+ "des Benutzers hoch sind.");
+
+static const u8 MoveDescription_SignalBeam[] = _(
+ "Seltsame Strahlenattacke.\n"
+ "Verwirrt evtl. den Gegner.");
+
+static const u8 MoveDescription_ShadowPunch[] = _(
+ "Schattenhieb. Ausweichen\n"
+ "unmöglich.");
+
+static const u8 MoveDescription_Extrasensory[] = _(
+ "Besonderer Angriff. Gegner\n"
+ "schreckt evtl. zurück.");
+
+static const u8 MoveDescription_SkyUppercut[] = _(
+ "Kinnhaken, als würde man in\n"
+ "die Luft springen.");
+
+static const u8 MoveDescription_SandTomb[] = _(
+ "Gegner leidet für 2-5\n"
+ "Runden in Sandhose.");
+
+static const u8 MoveDescription_SheerCold[] = _(
+ "Eis-Attacke. Besiegt den\n"
+ "Gegner, wenn sie trifft.");
+
+static const u8 MoveDescription_MuddyWater[] = _(
+ "Greift mit Matsch an und\n"
+ "senkt evtl. Genauigkeit.");
+
+static const u8 MoveDescription_BulletSeed[] = _(
+ "Verschießt 2 bis 5 Samen\n"
+ "gleichzeitig auf Gegner.");
+
+static const u8 MoveDescription_AerialAce[] = _(
+ "Eine extrem schnelle und\n"
+ "unausweichbare Attacke.");
+
+static const u8 MoveDescription_IcicleSpear[] = _(
+ "Feuert 2-5 Eiszapfen auf\n"
+ "den Gegner.");
+
+static const u8 MoveDescription_IronDefense[] = _(
+ "Stärkt den Körper.\n"
+ "Erhöht VERT.-Wert deutlich.");
+
+static const u8 MoveDescription_Block[] = _(
+ "Versperrt den Fluchtweg\n"
+ "des Gegners.");
+
+static const u8 MoveDescription_Howl[] = _(
+ "Jault, um in sich zu gehen.\n"
+ "Erhöht ANGR.-Wert.");
+
+static const u8 MoveDescription_DragonClaw[] = _(
+ "Der Gegner wird mit\n"
+ "scharfen Klauen verletzt.");
+
+static const u8 MoveDescription_FrenzyPlant[] = _(
+ "Starker Angriff. Angreifer\n"
+ "muss eine Runde aussetzen.");
+
+static const u8 MoveDescription_BulkUp[] = _(
+ "Pumpt den Körper auf. ANGR.\n"
+ "u. VERT. werden erhöht.");
+
+static const u8 MoveDescription_Bounce[] = _(
+ "Springt hoch u. landet in\n"
+ "nächstem Zug. Evtl. Para.");
+
+static const u8 MoveDescription_MudShot[] = _(
+ "Bewirft den Gegner mit Lehm\n"
+ "und senkt INIT.-Wert.");
+
+static const u8 MoveDescription_PoisonTail[] = _(
+ "Hohe Volltrefferquote.\n"
+ "Gegner evtl. vergiftet.");
+
+static const u8 MoveDescription_Covet[] = _(
+ "Bittet charmant um das ge-\n"
+ "haltene Item des Gegners.");
+
+static const u8 MoveDescription_VoltTackle[] = _(
+ "Lebensgefährliche Attacke,\n"
+ "leichte Selbstschädigung.");
+
+static const u8 MoveDescription_MagicalLeaf[] = _(
+ "Magischer Blattangriff.\n"
+ "Ausweichen unmöglich.");
+
+static const u8 MoveDescription_WaterSport[] = _(
+ "Benutzer wird nass, so dass\n"
+ "er Feuer besser standhält.");
+
+static const u8 MoveDescription_CalmMind[] = _(
+ "Erhöht SPEZ. ANGR. u. SPEZ.\n"
+ "VERT. durch Konzentration.");
+
+static const u8 MoveDescription_LeafBlade[] = _(
+ "Hieb mit scharfkantigem\n"
+ "Blatt. Hohe Volltrefferqu.");
+
+static const u8 MoveDescription_DragonDance[] = _(
+ "Ein mystischer Tanz, der\n"
+ "ANGR.- u. INIT.-Wert erhöht.");
+
+static const u8 MoveDescription_RockBlast[] = _(
+ "Wirft 2 - 5-mal in Folge\n"
+ "Felsblöcke auf den Gegner.");
+
+static const u8 MoveDescription_ShockWave[] = _(
+ "Schnelle Elektro-Attacke\n"
+ "mit Treffergarantie.");
+
+static const u8 MoveDescription_WaterPulse[] = _(
+ "Ultraschallwellen, die den\n"
+ "Gegner verwirren können.");
+
+static const u8 MoveDescription_DoomDesire[] = _(
+ "Speichert Sonnenenergie.\n"
+ "Angriff 2 Runden später.");
+
+static const u8 MoveDescription_PsychoBoost[] = _(
+ "Angriff mit voller Kraft.\n"
+ "SPEZ. ANGR. sinkt deutlich.");
+
+const u8 * const gMoveDescriptions[] = {
+ MoveDescription_Pound,
+ MoveDescription_KarateChop,
+ MoveDescription_DoubleSlap,
+ MoveDescription_CometPunch,
+ MoveDescription_MegaPunch,
+ MoveDescription_PayDay,
+ MoveDescription_FirePunch,
+ MoveDescription_IcePunch,
+ MoveDescription_ThunderPunch,
+ MoveDescription_Scratch,
+ MoveDescription_ViceGrip,
+ MoveDescription_Guillotine,
+ MoveDescription_RazorWind,
+ MoveDescription_SwordsDance,
+ MoveDescription_Cut,
+ MoveDescription_Gust,
+ MoveDescription_WingAttack,
+ MoveDescription_Whirlwind,
+ MoveDescription_Fly,
+ MoveDescription_Bind,
+ MoveDescription_Slam,
+ MoveDescription_VineWhip,
+ MoveDescription_Stomp,
+ MoveDescription_DoubleKick,
+ MoveDescription_MegaKick,
+ MoveDescription_JumpKick,
+ MoveDescription_RollingKick,
+ MoveDescription_SandAttack,
+ MoveDescription_Headbutt,
+ MoveDescription_HornAttack,
+ MoveDescription_FuryAttack,
+ MoveDescription_HornDrill,
+ MoveDescription_Tackle,
+ MoveDescription_BodySlam,
+ MoveDescription_Wrap,
+ MoveDescription_TakeDown,
+ MoveDescription_Thrash,
+ MoveDescription_DoubleEdge,
+ MoveDescription_TailWhip,
+ MoveDescription_PoisonSting,
+ MoveDescription_Twineedle,
+ MoveDescription_PinMissile,
+ MoveDescription_Leer,
+ MoveDescription_Bite,
+ MoveDescription_Growl,
+ MoveDescription_Roar,
+ MoveDescription_Sing,
+ MoveDescription_Supersonic,
+ MoveDescription_SonicBoom,
+ MoveDescription_Disable,
+ MoveDescription_Acid,
+ MoveDescription_Ember,
+ MoveDescription_Flamethrower,
+ MoveDescription_Mist,
+ MoveDescription_WaterGun,
+ MoveDescription_HydroPump,
+ MoveDescription_Surf,
+ MoveDescription_IceBeam,
+ MoveDescription_Blizzard,
+ MoveDescription_Psybeam,
+ MoveDescription_BubbleBeam,
+ MoveDescription_AuroraBeam,
+ MoveDescription_HyperBeam,
+ MoveDescription_Peck,
+ MoveDescription_DrillPeck,
+ MoveDescription_Submission,
+ MoveDescription_LowKick,
+ MoveDescription_Counter,
+ MoveDescription_SeismicToss,
+ MoveDescription_Strength,
+ MoveDescription_Absorb,
+ MoveDescription_MegaDrain,
+ MoveDescription_LeechSeed,
+ MoveDescription_Growth,
+ MoveDescription_RazorLeaf,
+ MoveDescription_SolarBeam,
+ MoveDescription_PoisonPowder,
+ MoveDescription_StunSpore,
+ MoveDescription_SleepPowder,
+ MoveDescription_PetalDance,
+ MoveDescription_StringShot,
+ MoveDescription_DragonRage,
+ MoveDescription_FireSpin,
+ MoveDescription_ThunderShock,
+ MoveDescription_Thunderbolt,
+ MoveDescription_ThunderWave,
+ MoveDescription_Thunder,
+ MoveDescription_RockThrow,
+ MoveDescription_Earthquake,
+ MoveDescription_Fissure,
+ MoveDescription_Dig,
+ MoveDescription_Toxic,
+ MoveDescription_Confusion,
+ MoveDescription_Psychic,
+ MoveDescription_Hypnosis,
+ MoveDescription_Meditate,
+ MoveDescription_Agility,
+ MoveDescription_QuickAttack,
+ MoveDescription_Rage,
+ MoveDescription_Teleport,
+ MoveDescription_NightShade,
+ MoveDescription_Mimic,
+ MoveDescription_Screech,
+ MoveDescription_DoubleTeam,
+ MoveDescription_Recover,
+ MoveDescription_Harden,
+ MoveDescription_Minimize,
+ MoveDescription_Smokescreen,
+ MoveDescription_ConfuseRay,
+ MoveDescription_Withdraw,
+ MoveDescription_DefenseCurl,
+ MoveDescription_Barrier,
+ MoveDescription_LightScreen,
+ MoveDescription_Haze,
+ MoveDescription_Reflect,
+ MoveDescription_FocusEnergy,
+ MoveDescription_Bide,
+ MoveDescription_Metronome,
+ MoveDescription_MirrorMove,
+ MoveDescription_SelfDestruct,
+ MoveDescription_EggBomb,
+ MoveDescription_Lick,
+ MoveDescription_Smog,
+ MoveDescription_Sludge,
+ MoveDescription_BoneClub,
+ MoveDescription_FireBlast,
+ MoveDescription_Waterfall,
+ MoveDescription_Clamp,
+ MoveDescription_Swift,
+ MoveDescription_SkullBash,
+ MoveDescription_SpikeCannon,
+ MoveDescription_Constrict,
+ MoveDescription_Amnesia,
+ MoveDescription_Kinesis,
+ MoveDescription_SoftBoiled,
+ MoveDescription_HiJumpKick,
+ MoveDescription_Glare,
+ MoveDescription_DreamEater,
+ MoveDescription_PoisonGas,
+ MoveDescription_Barrage,
+ MoveDescription_LeechLife,
+ MoveDescription_LovelyKiss,
+ MoveDescription_SkyAttack,
+ MoveDescription_Transform,
+ MoveDescription_Bubble,
+ MoveDescription_DizzyPunch,
+ MoveDescription_Spore,
+ MoveDescription_Flash,
+ MoveDescription_Psywave,
+ MoveDescription_Splash,
+ MoveDescription_AcidArmor,
+ MoveDescription_Crabhammer,
+ MoveDescription_Explosion,
+ MoveDescription_FurySwipes,
+ MoveDescription_Bonemerang,
+ MoveDescription_Rest,
+ MoveDescription_RockSlide,
+ MoveDescription_HyperFang,
+ MoveDescription_Sharpen,
+ MoveDescription_Conversion,
+ MoveDescription_TriAttack,
+ MoveDescription_SuperFang,
+ MoveDescription_Slash,
+ MoveDescription_Substitute,
+ MoveDescription_Struggle,
+ MoveDescription_Sketch,
+ MoveDescription_TripleKick,
+ MoveDescription_Thief,
+ MoveDescription_SpiderWeb,
+ MoveDescription_MindReader,
+ MoveDescription_Nightmare,
+ MoveDescription_FlameWheel,
+ MoveDescription_Snore,
+ MoveDescription_Curse,
+ MoveDescription_Flail,
+ MoveDescription_Conversion2,
+ MoveDescription_Aeroblast,
+ MoveDescription_CottonSpore,
+ MoveDescription_Reversal,
+ MoveDescription_Spite,
+ MoveDescription_PowderSnow,
+ MoveDescription_Protect,
+ MoveDescription_MachPunch,
+ MoveDescription_ScaryFace,
+ MoveDescription_FaintAttack,
+ MoveDescription_SweetKiss,
+ MoveDescription_BellyDrum,
+ MoveDescription_SludgeBomb,
+ MoveDescription_MudSlap,
+ MoveDescription_Octazooka,
+ MoveDescription_Spikes,
+ MoveDescription_ZapCannon,
+ MoveDescription_Foresight,
+ MoveDescription_DestinyBond,
+ MoveDescription_PerishSong,
+ MoveDescription_IcyWind,
+ MoveDescription_Detect,
+ MoveDescription_BoneRush,
+ MoveDescription_LockOn,
+ MoveDescription_Outrage,
+ MoveDescription_Sandstorm,
+ MoveDescription_GigaDrain,
+ MoveDescription_Endure,
+ MoveDescription_Charm,
+ MoveDescription_Rollout,
+ MoveDescription_FalseSwipe,
+ MoveDescription_Swagger,
+ MoveDescription_MilkDrink,
+ MoveDescription_Spark,
+ MoveDescription_FuryCutter,
+ MoveDescription_SteelWing,
+ MoveDescription_MeanLook,
+ MoveDescription_Attract,
+ MoveDescription_SleepTalk,
+ MoveDescription_HealBell,
+ MoveDescription_Return,
+ MoveDescription_Present,
+ MoveDescription_Frustration,
+ MoveDescription_Safeguard,
+ MoveDescription_PainSplit,
+ MoveDescription_SacredFire,
+ MoveDescription_Magnitude,
+ MoveDescription_DynamicPunch,
+ MoveDescription_Megahorn,
+ MoveDescription_DragonBreath,
+ MoveDescription_BatonPass,
+ MoveDescription_Encore,
+ MoveDescription_Pursuit,
+ MoveDescription_RapidSpin,
+ MoveDescription_SweetScent,
+ MoveDescription_IronTail,
+ MoveDescription_MetalClaw,
+ MoveDescription_VitalThrow,
+ MoveDescription_MorningSun,
+ MoveDescription_Synthesis,
+ MoveDescription_Moonlight,
+ MoveDescription_HiddenPower,
+ MoveDescription_CrossChop,
+ MoveDescription_Twister,
+ MoveDescription_RainDance,
+ MoveDescription_SunnyDay,
+ MoveDescription_Crunch,
+ MoveDescription_MirrorCoat,
+ MoveDescription_PsychUp,
+ MoveDescription_ExtremeSpeed,
+ MoveDescription_AncientPower,
+ MoveDescription_ShadowBall,
+ MoveDescription_FutureSight,
+ MoveDescription_RockSmash,
+ MoveDescription_Whirlpool,
+ MoveDescription_BeatUp,
+ MoveDescription_FakeOut,
+ MoveDescription_Uproar,
+ MoveDescription_Stockpile,
+ MoveDescription_SpitUp,
+ MoveDescription_Swallow,
+ MoveDescription_HeatWave,
+ MoveDescription_Hail,
+ MoveDescription_Torment,
+ MoveDescription_Flatter,
+ MoveDescription_WillOWisp,
+ MoveDescription_Memento,
+ MoveDescription_Facade,
+ MoveDescription_FocusPunch,
+ MoveDescription_SmellingSalt,
+ MoveDescription_FollowMe,
+ MoveDescription_NaturePower,
+ MoveDescription_Charge,
+ MoveDescription_Taunt,
+ MoveDescription_HelpingHand,
+ MoveDescription_Trick,
+ MoveDescription_RolePlay,
+ MoveDescription_Wish,
+ MoveDescription_Assist,
+ MoveDescription_Ingrain,
+ MoveDescription_Superpower,
+ MoveDescription_MagicCoat,
+ MoveDescription_Recycle,
+ MoveDescription_Revenge,
+ MoveDescription_BrickBreak,
+ MoveDescription_Yawn,
+ MoveDescription_KnockOff,
+ MoveDescription_Endeavor,
+ MoveDescription_Eruption,
+ MoveDescription_SkillSwap,
+ MoveDescription_Imprison,
+ MoveDescription_Refresh,
+ MoveDescription_Grudge,
+ MoveDescription_Snatch,
+ MoveDescription_SecretPower,
+ MoveDescription_Dive,
+ MoveDescription_ArmThrust,
+ MoveDescription_Camouflage,
+ MoveDescription_TailGlow,
+ MoveDescription_LusterPurge,
+ MoveDescription_MistBall,
+ MoveDescription_FeatherDance,
+ MoveDescription_TeeterDance,
+ MoveDescription_BlazeKick,
+ MoveDescription_MudSport,
+ MoveDescription_IceBall,
+ MoveDescription_NeedleArm,
+ MoveDescription_SlackOff,
+ MoveDescription_HyperVoice,
+ MoveDescription_PoisonFang,
+ MoveDescription_CrushClaw,
+ MoveDescription_BlastBurn,
+ MoveDescription_HydroCannon,
+ MoveDescription_MeteorMash,
+ MoveDescription_Astonish,
+ MoveDescription_WeatherBall,
+ MoveDescription_Aromatherapy,
+ MoveDescription_FakeTears,
+ MoveDescription_AirCutter,
+ MoveDescription_Overheat,
+ MoveDescription_OdorSleuth,
+ MoveDescription_RockTomb,
+ MoveDescription_SilverWind,
+ MoveDescription_MetalSound,
+ MoveDescription_GrassWhistle,
+ MoveDescription_Tickle,
+ MoveDescription_CosmicPower,
+ MoveDescription_WaterSpout,
+ MoveDescription_SignalBeam,
+ MoveDescription_ShadowPunch,
+ MoveDescription_Extrasensory,
+ MoveDescription_SkyUppercut,
+ MoveDescription_SandTomb,
+ MoveDescription_SheerCold,
+ MoveDescription_MuddyWater,
+ MoveDescription_BulletSeed,
+ MoveDescription_AerialAce,
+ MoveDescription_IcicleSpear,
+ MoveDescription_IronDefense,
+ MoveDescription_Block,
+ MoveDescription_Howl,
+ MoveDescription_DragonClaw,
+ MoveDescription_FrenzyPlant,
+ MoveDescription_BulkUp,
+ MoveDescription_Bounce,
+ MoveDescription_MudShot,
+ MoveDescription_PoisonTail,
+ MoveDescription_Covet,
+ MoveDescription_VoltTackle,
+ MoveDescription_MagicalLeaf,
+ MoveDescription_WaterSport,
+ MoveDescription_CalmMind,
+ MoveDescription_LeafBlade,
+ MoveDescription_DragonDance,
+ MoveDescription_RockBlast,
+ MoveDescription_ShockWave,
+ MoveDescription_WaterPulse,
+ MoveDescription_DoomDesire,
+ MoveDescription_PsychoBoost,
+};
diff --git a/src/data/text/move_descriptions_en.h b/src/data/text/move_descriptions_en.h
new file mode 100644
index 000000000..3c3a961d1
--- /dev/null
+++ b/src/data/text/move_descriptions_en.h
@@ -0,0 +1,1772 @@
+static const u8 MoveDescription_Pound[] = _(
+ "Pounds the foe with\n"
+ "forelegs or tail.");
+
+static const u8 MoveDescription_KarateChop[] = _(
+ "A chopping attack with a\n"
+ "high critical-hit ratio.");
+
+static const u8 MoveDescription_DoubleSlap[] = _(
+ "Repeatedly slaps the foe\n"
+ "2 to 5 times.");
+
+static const u8 MoveDescription_CometPunch[] = _(
+ "Repeatedly punches the foe\n"
+ "2 to 5 times.");
+
+static const u8 MoveDescription_MegaPunch[] = _(
+ "A strong punch thrown with\n"
+ "incredible power.");
+
+static const u8 MoveDescription_PayDay[] = _(
+ "Throws coins at the foe.\n"
+ "Money is recovered after.");
+
+static const u8 MoveDescription_FirePunch[] = _(
+ "A fiery punch that may burn\n"
+ "the foe.");
+
+static const u8 MoveDescription_IcePunch[] = _(
+ "An icy punch that may\n"
+ "freeze the foe.");
+
+static const u8 MoveDescription_ThunderPunch[] = _(
+ "An electrified punch that\n"
+ "may paralyze the foe.");
+
+static const u8 MoveDescription_Scratch[] = _(
+ "Scratches the foe with\n"
+ "sharp claws.");
+
+static const u8 MoveDescription_ViceGrip[] = _(
+ "Grips the foe with large and\n"
+ "powerful pincers.");
+
+static const u8 MoveDescription_Guillotine[] = _(
+ "A powerful pincer attack\n"
+ "that may cause fainting.");
+
+static const u8 MoveDescription_RazorWind[] = _(
+ "A 2-turn move that strikes\n"
+ "the foe on the 2nd turn.");
+
+static const u8 MoveDescription_SwordsDance[] = _(
+ "A fighting dance that\n"
+ "sharply raises ATTACK.");
+
+static const u8 MoveDescription_Cut[] = _(
+ "Cuts the foe with sharp\n"
+ "scythes, claws, etc.");
+
+static const u8 MoveDescription_Gust[] = _(
+ "Strikes the foe with a gust\n"
+ "of wind whipped up by wings.");
+
+static const u8 MoveDescription_WingAttack[] = _(
+ "Strikes the foe with wings\n"
+ "spread wide.");
+
+static const u8 MoveDescription_Whirlwind[] = _(
+ "Blows away the foe with\n"
+ "wind and ends the battle.");
+
+static const u8 MoveDescription_Fly[] = _(
+ "Flies up on the first turn,\n"
+ "then strikes the next turn.");
+
+static const u8 MoveDescription_Bind[] = _(
+ "Binds and squeezes the foe\n"
+ "for 2 to 5 turns.");
+
+static const u8 MoveDescription_Slam[] = _(
+ "Slams the foe with a long\n"
+ "tail, vine, etc.");
+
+static const u8 MoveDescription_VineWhip[] = _(
+ "Strikes the foe with\n"
+ "slender, whiplike vines.");
+
+static const u8 MoveDescription_Stomp[] = _(
+ "Stomps the enemy with a big\n"
+ "foot. May cause flinching.");
+
+static const u8 MoveDescription_DoubleKick[] = _(
+ "A double-kicking attack\n"
+ "that strikes the foe twice.");
+
+static const u8 MoveDescription_MegaKick[] = _(
+ "An extremely powerful kick\n"
+ "with intense force.");
+
+static const u8 MoveDescription_JumpKick[] = _(
+ "A strong jumping kick. May\n"
+ "miss and hurt the kicker.");
+
+static const u8 MoveDescription_RollingKick[] = _(
+ "A fast kick delivered from\n"
+ "a rapid spin.");
+
+static const u8 MoveDescription_SandAttack[] = _(
+ "Reduces the foe’s accuracy\n"
+ "by hurling sand in its face.");
+
+static const u8 MoveDescription_Headbutt[] = _(
+ "A ramming attack that may\n"
+ "cause flinching.");
+
+static const u8 MoveDescription_HornAttack[] = _(
+ "Jabs the foe with sharp\n"
+ "horns.");
+
+static const u8 MoveDescription_FuryAttack[] = _(
+ "Jabs the foe 2 to 5 times\n"
+ "with sharp horns, etc.");
+
+static const u8 MoveDescription_HornDrill[] = _(
+ "A one-hit KO attack that\n"
+ "uses a horn like a drill.");
+
+static const u8 MoveDescription_Tackle[] = _(
+ "Charges the foe with a full-\n"
+ "body tackle.");
+
+static const u8 MoveDescription_BodySlam[] = _(
+ "A full-body slam that may\n"
+ "cause paralysis.");
+
+static const u8 MoveDescription_Wrap[] = _(
+ "Wraps and squeezes the foe\n"
+ "2 to 5 times with vines, etc.");
+
+static const u8 MoveDescription_TakeDown[] = _(
+ "A reckless charge attack\n"
+ "that also hurts the user.");
+
+static const u8 MoveDescription_Thrash[] = _(
+ "A rampage of 2 to 3 turns\n"
+ "that confuses the user.");
+
+static const u8 MoveDescription_DoubleEdge[] = _(
+ "A life-risking tackle that\n"
+ "also hurts the user.");
+
+static const u8 MoveDescription_TailWhip[] = _(
+ "Wags the tail to lower the\n"
+ "foe’s DEFENSE.");
+
+static const u8 MoveDescription_PoisonSting[] = _(
+ "A toxic attack with barbs,\n"
+ "etc., that may poison.");
+
+static const u8 MoveDescription_Twineedle[] = _(
+ "Stingers on the forelegs\n"
+ "jab the foe twice.");
+
+static const u8 MoveDescription_PinMissile[] = _(
+ "Sharp pins are fired to\n"
+ "strike 2 to 5 times.");
+
+static const u8 MoveDescription_Leer[] = _(
+ "Frightens the foe with a\n"
+ "leer to lower DEFENSE.");
+
+static const u8 MoveDescription_Bite[] = _(
+ "Bites with vicious fangs.\n"
+ "May cause flinching.");
+
+static const u8 MoveDescription_Growl[] = _(
+ "Growls cutely to reduce the\n"
+ "foe’s ATTACK.");
+
+static const u8 MoveDescription_Roar[] = _(
+ "Makes the foe flee to end\n"
+ "the battle.");
+
+static const u8 MoveDescription_Sing[] = _(
+ "A soothing song lulls the\n"
+ "foe into a deep slumber.");
+
+static const u8 MoveDescription_Supersonic[] = _(
+ "Emits bizarre sound waves\n"
+ "that may confuse the foe.");
+
+static const u8 MoveDescription_SonicBoom[] = _(
+ "Launches shock waves that\n"
+ "always inflict 20 HP damage.");
+
+static const u8 MoveDescription_Disable[] = _(
+ "Psychically disables one of\n"
+ "the foe’s moves.");
+
+static const u8 MoveDescription_Acid[] = _(
+ "Sprays a hide-melting acid.\n"
+ "May lower DEFENSE.");
+
+static const u8 MoveDescription_Ember[] = _(
+ "A weak fire attack that may\n"
+ "inflict a burn.");
+
+static const u8 MoveDescription_Flamethrower[] = _(
+ "A powerful fire attack that\n"
+ "may inflict a burn.");
+
+static const u8 MoveDescription_Mist[] = _(
+ "Creates a mist that stops\n"
+ "reduction of abilities.");
+
+static const u8 MoveDescription_WaterGun[] = _(
+ "Squirts water to attack\n"
+ "the foe.");
+
+static const u8 MoveDescription_HydroPump[] = _(
+ "Blasts water at high power\n"
+ "to strike the foe.");
+
+static const u8 MoveDescription_Surf[] = _(
+ "Creates a huge wave, then\n"
+ "crashes it down on the foe.");
+
+static const u8 MoveDescription_IceBeam[] = _(
+ "Blasts the foe with an icy\n"
+ "beam that may freeze it.");
+
+static const u8 MoveDescription_Blizzard[] = _(
+ "Hits the foe with an icy\n"
+ "storm that may freeze it.");
+
+static const u8 MoveDescription_Psybeam[] = _(
+ "Fires a peculiar ray that\n"
+ "may confuse the foe.");
+
+static const u8 MoveDescription_BubbleBeam[] = _(
+ "Forcefully sprays bubbles\n"
+ "that may lower SPEED.");
+
+static const u8 MoveDescription_AuroraBeam[] = _(
+ "Fires a rainbow-colored\n"
+ "beam that may lower ATTACK.");
+
+static const u8 MoveDescription_HyperBeam[] = _(
+ "Powerful, but leaves the\n"
+ "user immobile the next turn.");
+
+static const u8 MoveDescription_Peck[] = _(
+ "Attacks the foe with a\n"
+ "jabbing beak, etc.");
+
+static const u8 MoveDescription_DrillPeck[] = _(
+ "A corkscrewing attack with\n"
+ "the beak acting as a drill.");
+
+static const u8 MoveDescription_Submission[] = _(
+ "A reckless body slam that\n"
+ "also hurts the user.");
+
+static const u8 MoveDescription_LowKick[] = _(
+ "A kick that inflicts more\n"
+ "damage on heavier foes.");
+
+static const u8 MoveDescription_Counter[] = _(
+ "Retaliates any physical hit\n"
+ "with double the power.");
+
+static const u8 MoveDescription_SeismicToss[] = _(
+ "Inflicts damage identical\n"
+ "to the user’s level.");
+
+static const u8 MoveDescription_Strength[] = _(
+ "Builds enormous power,\n"
+ "then slams the foe.");
+
+static const u8 MoveDescription_Absorb[] = _(
+ "An attack that absorbs\n"
+ "half the damage inflicted.");
+
+static const u8 MoveDescription_MegaDrain[] = _(
+ "An attack that absorbs\n"
+ "half the damage inflicted.");
+
+static const u8 MoveDescription_LeechSeed[] = _(
+ "Plants a seed on the foe to\n"
+ "steal HP on every turn.");
+
+static const u8 MoveDescription_Growth[] = _(
+ "Forces the body to grow\n"
+ "and heightens SP. ATK.");
+
+static const u8 MoveDescription_RazorLeaf[] = _(
+ "Cuts the enemy with leaves.\n"
+ "High critical-hit ratio.");
+
+static const u8 MoveDescription_SolarBeam[] = _(
+ "Absorbs light in one turn,\n"
+ "then attacks next turn.");
+
+static const u8 MoveDescription_PoisonPowder[] = _(
+ "Scatters a toxic powder\n"
+ "that may poison the foe.");
+
+static const u8 MoveDescription_StunSpore[] = _(
+ "Scatters a powder that may\n"
+ "paralyze the foe.");
+
+static const u8 MoveDescription_SleepPowder[] = _(
+ "Scatters a powder that may\n"
+ "cause the foe to sleep.");
+
+static const u8 MoveDescription_PetalDance[] = _(
+ "A rampage of 2 to 3 turns\n"
+ "that confuses the user.");
+
+static const u8 MoveDescription_StringShot[] = _(
+ "Binds the foe with string\n"
+ "to reduce its SPEED.");
+
+static const u8 MoveDescription_DragonRage[] = _(
+ "Launches shock waves that\n"
+ "always inflict 40 HP damage.");
+
+static const u8 MoveDescription_FireSpin[] = _(
+ "Traps the foe in a ring of\n"
+ "fire for 2 to 5 turns.");
+
+static const u8 MoveDescription_ThunderShock[] = _(
+ "An electrical attack that\n"
+ "may paralyze the foe.");
+
+static const u8 MoveDescription_Thunderbolt[] = _(
+ "A strong electrical attack\n"
+ "that may paralyze the foe.");
+
+static const u8 MoveDescription_ThunderWave[] = _(
+ "A weak jolt of electricity\n"
+ "that paralyzes the foe.");
+
+static const u8 MoveDescription_Thunder[] = _(
+ "A lightning attack that may\n"
+ "cause paralysis.");
+
+static const u8 MoveDescription_RockThrow[] = _(
+ "Throws small rocks to\n"
+ "strike the foe.");
+
+static const u8 MoveDescription_Earthquake[] = _(
+ "A powerful quake, but has\n"
+ "no effect on flying foes.");
+
+static const u8 MoveDescription_Fissure[] = _(
+ "A one-hit KO move that\n"
+ "drops the foe in a fissure.");
+
+static const u8 MoveDescription_Dig[] = _(
+ "Digs underground the first\n"
+ "turn and strikes next turn.");
+
+static const u8 MoveDescription_Toxic[] = _(
+ "Poisons the foe with an\n"
+ "intensifying toxin.");
+
+static const u8 MoveDescription_Confusion[] = _(
+ "A psychic attack that may\n"
+ "cause confusion.");
+
+static const u8 MoveDescription_Psychic[] = _(
+ "A powerful psychic attack\n"
+ "that may lower SP. DEF.");
+
+static const u8 MoveDescription_Hypnosis[] = _(
+ "A hypnotizing move that\n"
+ "may induce sleep.");
+
+static const u8 MoveDescription_Meditate[] = _(
+ "Meditates in a peaceful\n"
+ "fashion to raise ATTACK.");
+
+static const u8 MoveDescription_Agility[] = _(
+ "Relaxes the body to sharply\n"
+ "boost SPEED.");
+
+static const u8 MoveDescription_QuickAttack[] = _(
+ "An extremely fast attack\n"
+ "that always strikes first.");
+
+static const u8 MoveDescription_Rage[] = _(
+ "Raises the user’s ATTACK\n"
+ "every time it is hit.");
+
+static const u8 MoveDescription_Teleport[] = _(
+ "A psychic move for fleeing\n"
+ "from battle instantly.");
+
+static const u8 MoveDescription_NightShade[] = _(
+ "Inflicts damage identical\n"
+ "to the user’s level.");
+
+static const u8 MoveDescription_Mimic[] = _(
+ "Copies a move used by the\n"
+ "foe during one battle.");
+
+static const u8 MoveDescription_Screech[] = _(
+ "Emits a screech to sharply\n"
+ "reduce the foe’s DEFENSE.");
+
+static const u8 MoveDescription_DoubleTeam[] = _(
+ "Creates illusory copies to\n"
+ "raise evasiveness.");
+
+static const u8 MoveDescription_Recover[] = _(
+ "Recovers up to half the\n"
+ "user’s maximum HP.");
+
+static const u8 MoveDescription_Harden[] = _(
+ "Stiffens the body’s \n"
+ "muscles to raise DEFENSE.");
+
+static const u8 MoveDescription_Minimize[] = _(
+ "Minimizes the user’s size\n"
+ "to raise evasiveness.");
+
+static const u8 MoveDescription_Smokescreen[] = _(
+ "Lowers the foe’s accuracy\n"
+ "using smoke, ink, etc.");
+
+static const u8 MoveDescription_ConfuseRay[] = _(
+ "A sinister ray that\n"
+ "confuses the foe.");
+
+static const u8 MoveDescription_Withdraw[] = _(
+ "Withdraws the body into its\n"
+ "hard shell to raise DEFENSE.");
+
+static const u8 MoveDescription_DefenseCurl[] = _(
+ "Curls up to conceal weak\n"
+ "spots and raise DEFENSE.");
+
+static const u8 MoveDescription_Barrier[] = _(
+ "Creates a barrier that\n"
+ "sharply raises DEFENSE.");
+
+static const u8 MoveDescription_LightScreen[] = _(
+ "Creates a wall of light that\n"
+ "lowers SP. ATK damage.");
+
+static const u8 MoveDescription_Haze[] = _(
+ "Creates a black haze that\n"
+ "eliminates all stat changes.");
+
+static const u8 MoveDescription_Reflect[] = _(
+ "Creates a wall of light that\n"
+ "weakens physical attacks.");
+
+static const u8 MoveDescription_FocusEnergy[] = _(
+ "Focuses power to raise the\n"
+ "critical-hit ratio.");
+
+static const u8 MoveDescription_Bide[] = _(
+ "Endures attack for 2\n"
+ "turns to retaliate double.");
+
+static const u8 MoveDescription_Metronome[] = _(
+ "Waggles a finger to use any\n"
+ "POKéMON move at random.");
+
+static const u8 MoveDescription_MirrorMove[] = _(
+ "Counters the foe’s attack\n"
+ "with the same move.");
+
+static const u8 MoveDescription_SelfDestruct[] = _(
+ "Inflicts severe damage but\n"
+ "makes the user faint.");
+
+static const u8 MoveDescription_EggBomb[] = _(
+ "An egg is forcibly hurled at\n"
+ "the foe.");
+
+static const u8 MoveDescription_Lick[] = _(
+ "Licks with a long tongue to\n"
+ "injure. May also paralyze.");
+
+static const u8 MoveDescription_Smog[] = _(
+ "An exhaust-gas attack\n"
+ "that may also poison.");
+
+static const u8 MoveDescription_Sludge[] = _(
+ "Sludge is hurled to inflict\n"
+ "damage. May also poison.");
+
+static const u8 MoveDescription_BoneClub[] = _(
+ "Clubs the foe with a bone.\n"
+ "May cause flinching.");
+
+static const u8 MoveDescription_FireBlast[] = _(
+ "A fiery blast that scorches\n"
+ "all. May cause a burn.");
+
+static const u8 MoveDescription_Waterfall[] = _(
+ "Charges the foe with speed\n"
+ "to climb waterfalls.");
+
+static const u8 MoveDescription_Clamp[] = _(
+ "Traps and squeezes the\n"
+ "foe for 2 to 5 turns.");
+
+static const u8 MoveDescription_Swift[] = _(
+ "Sprays star-shaped rays\n"
+ "that never miss.");
+
+static const u8 MoveDescription_SkullBash[] = _(
+ "Tucks in the head, then\n"
+ "attacks on the next turn.");
+
+static const u8 MoveDescription_SpikeCannon[] = _(
+ "Launches sharp spikes that\n"
+ "strike 2 to 5 times.");
+
+static const u8 MoveDescription_Constrict[] = _(
+ "Constricts to inflict pain.\n"
+ "May lower SPEED.");
+
+static const u8 MoveDescription_Amnesia[] = _(
+ "Forgets about something\n"
+ "and sharply raises SP. DEF.");
+
+static const u8 MoveDescription_Kinesis[] = _(
+ "Distracts the foe.\n"
+ "May lower accuracy.");
+
+static const u8 MoveDescription_SoftBoiled[] = _(
+ "Recovers up to half the\n"
+ "user’s maximum HP.");
+
+static const u8 MoveDescription_HiJumpKick[] = _(
+ "A jumping knee kick. If it\n"
+ "misses, the user is hurt.");
+
+static const u8 MoveDescription_Glare[] = _(
+ "Intimidates and frightens\n"
+ "the foe into paralysis.");
+
+static const u8 MoveDescription_DreamEater[] = _(
+ "Takes one half the damage\n"
+ "inflicted on a sleeping foe.");
+
+static const u8 MoveDescription_PoisonGas[] = _(
+ "Envelops the foe in a toxic\n"
+ "gas that may poison.");
+
+static const u8 MoveDescription_Barrage[] = _(
+ "Hurls round objects at the\n"
+ "foe 2 to 5 times.");
+
+static const u8 MoveDescription_LeechLife[] = _(
+ "An attack that steals half\n"
+ "the damage inflicted.");
+
+static const u8 MoveDescription_LovelyKiss[] = _(
+ "Demands a kiss with a scary\n"
+ "face that induces sleep.");
+
+static const u8 MoveDescription_SkyAttack[] = _(
+ "Searches out weak spots,\n"
+ "then strikes the next turn.");
+
+static const u8 MoveDescription_Transform[] = _(
+ "Alters the user’s cells to\n"
+ "become a copy of the foe.");
+
+static const u8 MoveDescription_Bubble[] = _(
+ "An attack using bubbles.\n"
+ "May lower the foe’s SPEED.");
+
+static const u8 MoveDescription_DizzyPunch[] = _(
+ "A rhythmic punch that may\n"
+ "confuse the foe.");
+
+static const u8 MoveDescription_Spore[] = _(
+ "Scatters a cloud of spores\n"
+ "that always induce sleep.");
+
+static const u8 MoveDescription_Flash[] = _(
+ "Looses a powerful blast of\n"
+ "light that cuts accuracy.");
+
+static const u8 MoveDescription_Psywave[] = _(
+ "Attacks with a psychic\n"
+ "wave of varying intensity.");
+
+static const u8 MoveDescription_Splash[] = _(
+ "It’s just a splash...\n"
+ "Has no effect whatsoever.");
+
+static const u8 MoveDescription_AcidArmor[] = _(
+ "Liquifies the user’s body\n"
+ "to sharply raise DEFENSE.");
+
+static const u8 MoveDescription_Crabhammer[] = _(
+ "Hammers with a pincer. Has a\n"
+ "high critical-hit ratio.");
+
+static const u8 MoveDescription_Explosion[] = _(
+ "Inflicts severe damage but\n"
+ "makes the user faint.");
+
+static const u8 MoveDescription_FurySwipes[] = _(
+ "Rakes the foe with sharp\n"
+ "claws, etc., 2 to 5 times.");
+
+static const u8 MoveDescription_Bonemerang[] = _(
+ "Throws a bone boomerang\n"
+ "that strikes twice.");
+
+static const u8 MoveDescription_Rest[] = _(
+ "The user sleeps for 2 turns,\n"
+ "restoring HP and status.");
+
+static const u8 MoveDescription_RockSlide[] = _(
+ "Large boulders are hurled.\n"
+ "May cause flinching.");
+
+static const u8 MoveDescription_HyperFang[] = _(
+ "Attacks with sharp fangs.\n"
+ "May cause flinching.");
+
+static const u8 MoveDescription_Sharpen[] = _(
+ "Reduces the polygon count\n"
+ "and raises ATTACK.");
+
+static const u8 MoveDescription_Conversion[] = _(
+ "Changes the user’s type\n"
+ "into an own move’s type.");
+
+static const u8 MoveDescription_TriAttack[] = _(
+ "Fires three types of beams\n"
+ "at the same time.");
+
+static const u8 MoveDescription_SuperFang[] = _(
+ "Attacks with sharp fangs\n"
+ "and cuts half the foe’s HP.");
+
+static const u8 MoveDescription_Slash[] = _(
+ "Slashes with claws, etc. Has\n"
+ "a high critical-hit ratio.");
+
+static const u8 MoveDescription_Substitute[] = _(
+ "Creates a decoy using 1/4\n"
+ "of the user’s maximum HP.");
+
+static const u8 MoveDescription_Struggle[] = _(
+ "Used only if all PP are gone.\n"
+ "Also hurts the user a little.");
+
+static const u8 MoveDescription_Sketch[] = _(
+ "Copies the foe’s last move\n"
+ "permanently.");
+
+static const u8 MoveDescription_TripleKick[] = _(
+ "Kicks the foe 3 times in a\n"
+ "row with rising intensity.");
+
+static const u8 MoveDescription_Thief[] = _(
+ "While attacking, it may\n"
+ "steal the foe’s held item.");
+
+static const u8 MoveDescription_SpiderWeb[] = _(
+ "Ensnares the foe to stop it\n"
+ "from fleeing or switching.");
+
+static const u8 MoveDescription_MindReader[] = _(
+ "Senses the foe’s action to\n"
+ "ensure the next move’s hit.");
+
+static const u8 MoveDescription_Nightmare[] = _(
+ "Inflicts 1/4 damage on a\n"
+ "sleeping foe every turn.");
+
+static const u8 MoveDescription_FlameWheel[] = _(
+ "A fiery charge attack that\n"
+ "may inflict a burn.");
+
+static const u8 MoveDescription_Snore[] = _(
+ "A loud attack that can be\n"
+ "used only while asleep.");
+
+static const u8 MoveDescription_Curse[] = _(
+ "A move that functions\n"
+ "differently for GHOSTS.");
+
+static const u8 MoveDescription_Flail[] = _(
+ "Inflicts more damage when\n"
+ "the user’s HP is down.");
+
+static const u8 MoveDescription_Conversion2[] = _(
+ "Makes the user resistant\n"
+ "to the last attack’s type.");
+
+static const u8 MoveDescription_Aeroblast[] = _(
+ "Launches a vacuumed blast.\n"
+ "High critical-hit ratio.");
+
+static const u8 MoveDescription_CottonSpore[] = _(
+ "Spores cling to the foe,\n"
+ "sharply reducing SPEED.");
+
+static const u8 MoveDescription_Reversal[] = _(
+ "Inflicts more damage when\n"
+ "the user’s HP is down.");
+
+static const u8 MoveDescription_Spite[] = _(
+ "Spitefully cuts the PP\n"
+ "of the foe’s last move.");
+
+static const u8 MoveDescription_PowderSnow[] = _(
+ "Blasts the foe with a snowy\n"
+ "gust. May cause freezing.");
+
+static const u8 MoveDescription_Protect[] = _(
+ "Evades attack, but may fail\n"
+ "if used in succession.");
+
+static const u8 MoveDescription_MachPunch[] = _(
+ "A punch is thrown at wicked\n"
+ "speed to strike first.");
+
+static const u8 MoveDescription_ScaryFace[] = _(
+ "Frightens with a scary face\n"
+ "to sharply reduce SPEED.");
+
+static const u8 MoveDescription_FaintAttack[] = _(
+ "Draws the foe close, then\n"
+ "strikes without fail.");
+
+static const u8 MoveDescription_SweetKiss[] = _(
+ "Demands a kiss with a cute\n"
+ "look. May cause confusion.");
+
+static const u8 MoveDescription_BellyDrum[] = _(
+ "Maximizes ATTACK while\n"
+ "sacrificing HP.");
+
+static const u8 MoveDescription_SludgeBomb[] = _(
+ "Sludge is hurled to inflict\n"
+ "damage. May also poison.");
+
+static const u8 MoveDescription_MudSlap[] = _(
+ "Hurls mud in the foe’s face\n"
+ "to reduce its accuracy.");
+
+static const u8 MoveDescription_Octazooka[] = _(
+ "Fires a lump of ink to\n"
+ "damage and cut accuracy.");
+
+static const u8 MoveDescription_Spikes[] = _(
+ "Sets spikes that hurt a \n"
+ "foe switching out.");
+
+static const u8 MoveDescription_ZapCannon[] = _(
+ "Powerful and sure to cause\n"
+ "paralysis, but inaccurate.");
+
+static const u8 MoveDescription_Foresight[] = _(
+ "Negates the foe’s efforts\n"
+ "to heighten evasiveness.");
+
+static const u8 MoveDescription_DestinyBond[] = _(
+ "If the user faints, the foe\n"
+ "is also made to faint.");
+
+static const u8 MoveDescription_PerishSong[] = _(
+ "Any POKéMON hearing this\n"
+ "song faints in 3 turns.");
+
+static const u8 MoveDescription_IcyWind[] = _(
+ "A chilling attack that\n"
+ "lowers the foe’s SPEED.");
+
+static const u8 MoveDescription_Detect[] = _(
+ "Evades attack, but may fail\n"
+ "if used in succession.");
+
+static const u8 MoveDescription_BoneRush[] = _(
+ "Strikes the foe with a bone\n"
+ "in hand 2 to 5 times.");
+
+static const u8 MoveDescription_LockOn[] = _(
+ "Locks on to the foe to\n"
+ "ensure the next move hits.");
+
+static const u8 MoveDescription_Outrage[] = _(
+ "A rampage of 2 to 3 turns\n"
+ "that confuses the user.");
+
+static const u8 MoveDescription_Sandstorm[] = _(
+ "Causes a sandstorm that\n"
+ "rages for several turns.");
+
+static const u8 MoveDescription_GigaDrain[] = _(
+ "An attack that steals half\n"
+ "the damage inflicted.");
+
+static const u8 MoveDescription_Endure[] = _(
+ "Endures any attack for\n"
+ "1 turn, leaving at least 1HP.");
+
+static const u8 MoveDescription_Charm[] = _(
+ "Charms the foe and sharply\n"
+ "reduces its ATTACK.");
+
+static const u8 MoveDescription_Rollout[] = _(
+ "An attack lasting 5 turns\n"
+ "with rising intensity.");
+
+static const u8 MoveDescription_FalseSwipe[] = _(
+ "An attack that leaves the\n"
+ "foe with at least 1 HP.");
+
+static const u8 MoveDescription_Swagger[] = _(
+ "Confuses the foe, but also\n"
+ "sharply raises ATTACK.");
+
+static const u8 MoveDescription_MilkDrink[] = _(
+ "Recovers up to half the\n"
+ "user’s maximum HP.");
+
+static const u8 MoveDescription_Spark[] = _(
+ "An electrified tackle that\n"
+ "may paralyze the foe.");
+
+static const u8 MoveDescription_FuryCutter[] = _(
+ "An attack that intensifies\n"
+ "on each successive hit.");
+
+static const u8 MoveDescription_SteelWing[] = _(
+ "Strikes the foe with hard\n"
+ "wings spread wide.");
+
+static const u8 MoveDescription_MeanLook[] = _(
+ "Fixes the foe with a mean\n"
+ "look that prevents escape.");
+
+static const u8 MoveDescription_Attract[] = _(
+ "Makes the opposite gender\n"
+ "less likely to attack.");
+
+static const u8 MoveDescription_SleepTalk[] = _(
+ "Uses an own move randomly\n"
+ "while asleep.");
+
+static const u8 MoveDescription_HealBell[] = _(
+ "Chimes soothingly to heal\n"
+ "all status abnormalities.");
+
+static const u8 MoveDescription_Return[] = _(
+ "An attack that increases\n"
+ "in power with friendship.");
+
+static const u8 MoveDescription_Present[] = _(
+ "A gift in the form of a\n"
+ "bomb. May restore HP.");
+
+static const u8 MoveDescription_Frustration[] = _(
+ "An attack that is stronger\n"
+ "if the TRAINER is disliked.");
+
+static const u8 MoveDescription_Safeguard[] = _(
+ "A mystical force prevents\n"
+ "all status problems.");
+
+static const u8 MoveDescription_PainSplit[] = _(
+ "Adds the user and foe’s HP,\n"
+ "then shares them equally.");
+
+static const u8 MoveDescription_SacredFire[] = _(
+ "A mystical fire attack that\n"
+ "may inflict a burn.");
+
+static const u8 MoveDescription_Magnitude[] = _(
+ "A ground-shaking attack\n"
+ "of random intensity.");
+
+static const u8 MoveDescription_DynamicPunch[] = _(
+ "Powerful and sure to cause\n"
+ "confusion, but inaccurate.");
+
+static const u8 MoveDescription_Megahorn[] = _(
+ "A brutal ramming attack\n"
+ "using out-thrust horns.");
+
+static const u8 MoveDescription_DragonBreath[] = _(
+ "Strikes the foe with an\n"
+ "incredible blast of breath.");
+
+static const u8 MoveDescription_BatonPass[] = _(
+ "Switches out the user while\n"
+ "keeping effects in play.");
+
+static const u8 MoveDescription_Encore[] = _(
+ "Makes the foe repeat its\n"
+ "last move over 2 to 6 turns.");
+
+static const u8 MoveDescription_Pursuit[] = _(
+ "Inflicts bad damage if used\n"
+ "on a foe switching out.");
+
+static const u8 MoveDescription_RapidSpin[] = _(
+ "Spins the body at high\n"
+ "speed to strike the foe.");
+
+static const u8 MoveDescription_SweetScent[] = _(
+ "Allures the foe to reduce\n"
+ "evasiveness.");
+
+static const u8 MoveDescription_IronTail[] = _(
+ "Attacks with a rock-hard\n"
+ "tail. May lower DEFENSE.");
+
+static const u8 MoveDescription_MetalClaw[] = _(
+ "A claw attack that may\n"
+ "raise the user’s ATTACK.");
+
+static const u8 MoveDescription_VitalThrow[] = _(
+ "Makes the user’s move last,\n"
+ "but it never misses.");
+
+static const u8 MoveDescription_MorningSun[] = _(
+ "Restores HP. The amount\n"
+ "varies with the weather.");
+
+static const u8 MoveDescription_Synthesis[] = _(
+ "Restores HP. The amount\n"
+ "varies with the weather.");
+
+static const u8 MoveDescription_Moonlight[] = _(
+ "Restores HP. The amount\n"
+ "varies with the weather.");
+
+static const u8 MoveDescription_HiddenPower[] = _(
+ "The effectiveness varies\n"
+ "with the user.");
+
+static const u8 MoveDescription_CrossChop[] = _(
+ "A double-chopping attack.\n"
+ "High critical-hit ratio.");
+
+static const u8 MoveDescription_Twister[] = _(
+ "Whips up a vicious twister\n"
+ "to tear at the foe.");
+
+static const u8 MoveDescription_RainDance[] = _(
+ "Boosts the power of WATER-\n"
+ "type moves for 5 turns.");
+
+static const u8 MoveDescription_SunnyDay[] = _(
+ "Boosts the power of FIRE-\n"
+ "type moves for 5 turns.");
+
+static const u8 MoveDescription_Crunch[] = _(
+ "Crunches with sharp fangs.\n"
+ "May lower SP. DEF.");
+
+static const u8 MoveDescription_MirrorCoat[] = _(
+ "Counters the foe’s special\n"
+ "attack at double the power.");
+
+static const u8 MoveDescription_PsychUp[] = _(
+ "Copies the foe’s effect(s)\n"
+ "and gives to the user.");
+
+static const u8 MoveDescription_ExtremeSpeed[] = _(
+ "An extremely fast and\n"
+ "powerful attack.");
+
+static const u8 MoveDescription_AncientPower[] = _(
+ "An attack that may raise\n"
+ "all stats.");
+
+static const u8 MoveDescription_ShadowBall[] = _(
+ "Hurls a black blob that may\n"
+ "lower the foe’s SP. DEF.");
+
+static const u8 MoveDescription_FutureSight[] = _(
+ "Heightens inner power to\n"
+ "strike 2 turns later.");
+
+static const u8 MoveDescription_RockSmash[] = _(
+ "A rock-crushing attack\n"
+ "that may lower DEFENSE.");
+
+static const u8 MoveDescription_Whirlpool[] = _(
+ "Traps and hurts the foe in\n"
+ "a whirlpool for 2 to 5 turns.");
+
+static const u8 MoveDescription_BeatUp[] = _(
+ "Summons party POKéMON to\n"
+ "join in the attack.");
+
+static const u8 MoveDescription_FakeOut[] = _(
+ "A 1st-turn, 1st-strike move\n"
+ "that causes flinching.");
+
+static const u8 MoveDescription_Uproar[] = _(
+ "Causes an uproar for 2 to 5\n"
+ "turns and prevents sleep.");
+
+static const u8 MoveDescription_Stockpile[] = _(
+ "Charges up power for up to\n"
+ "3 turns.");
+
+static const u8 MoveDescription_SpitUp[] = _(
+ "Releases stockpiled power\n"
+ "(the more the better).");
+
+static const u8 MoveDescription_Swallow[] = _(
+ "Absorbs stockpiled power\n"
+ "and restores HP.");
+
+static const u8 MoveDescription_HeatWave[] = _(
+ "Exhales a hot breath on the\n"
+ "foe. May inflict a burn.");
+
+static const u8 MoveDescription_Hail[] = _(
+ "Summons a hailstorm that\n"
+ "strikes every turn.");
+
+static const u8 MoveDescription_Torment[] = _(
+ "Torments the foe and stops\n"
+ "successive use of a move.");
+
+static const u8 MoveDescription_Flatter[] = _(
+ "Confuses the foe, but\n"
+ "raises its SP. ATK.");
+
+static const u8 MoveDescription_WillOWisp[] = _(
+ "Inflicts a burn on the foe\n"
+ "with intense fire.");
+
+static const u8 MoveDescription_Memento[] = _(
+ "The user faints and lowers\n"
+ "the foe’s abilities.");
+
+static const u8 MoveDescription_Facade[] = _(
+ "Boosts ATTACK when burned,\n"
+ "paralyzed, or poisoned.");
+
+static const u8 MoveDescription_FocusPunch[] = _(
+ "A powerful loyalty attack.\n"
+ "The user flinches if hit.");
+
+static const u8 MoveDescription_SmellingSalt[] = _(
+ "Powerful against paralyzed\n"
+ "foes, but also heals them.");
+
+static const u8 MoveDescription_FollowMe[] = _(
+ "Draws attention to make\n"
+ "foes attack only the user.");
+
+static const u8 MoveDescription_NaturePower[] = _(
+ "The type of attack varies\n"
+ "depending on the location.");
+
+static const u8 MoveDescription_Charge[] = _(
+ "Charges power to boost the\n"
+ "electric move used next.");
+
+static const u8 MoveDescription_Taunt[] = _(
+ "Taunts the foe into only\n"
+ "using attack moves.");
+
+static const u8 MoveDescription_HelpingHand[] = _(
+ "Boosts the power of the\n"
+ "recipient’s moves.");
+
+static const u8 MoveDescription_Trick[] = _(
+ "Tricks the foe into trading\n"
+ "held items.");
+
+static const u8 MoveDescription_RolePlay[] = _(
+ "Mimics the target and\n"
+ "copies its special ability.");
+
+static const u8 MoveDescription_Wish[] = _(
+ "A wish that restores HP.\n"
+ "It takes time to work.");
+
+static const u8 MoveDescription_Assist[] = _(
+ "Attacks randomly with one\n"
+ "of the partner’s moves.");
+
+static const u8 MoveDescription_Ingrain[] = _(
+ "Lays roots that restore HP.\n"
+ "The user can’t switch out.");
+
+static const u8 MoveDescription_Superpower[] = _(
+ "Boosts strength sharply,\n"
+ "but lowers abilities.");
+
+static const u8 MoveDescription_MagicCoat[] = _(
+ "Reflects special effects\n"
+ "back to the attacker.");
+
+static const u8 MoveDescription_Recycle[] = _(
+ "Recycles a used item for\n"
+ "one more use.");
+
+static const u8 MoveDescription_Revenge[] = _(
+ "An attack that gains power\n"
+ "if injured by the foe.");
+
+static const u8 MoveDescription_BrickBreak[] = _(
+ "Destroys barriers such as\n"
+ "REFLECT and causes damage.");
+
+static const u8 MoveDescription_Yawn[] = _(
+ "Lulls the foe into yawning,\n"
+ "then sleeping next turn.");
+
+static const u8 MoveDescription_KnockOff[] = _(
+ "Knocks down the foe’s held\n"
+ "item to prevent its use.");
+
+static const u8 MoveDescription_Endeavor[] = _(
+ "Gains power if the user’s HP\n"
+ "is lower than the foe’s HP.");
+
+static const u8 MoveDescription_Eruption[] = _(
+ "The higher the user’s HP,\n"
+ "the more damage caused.");
+
+static const u8 MoveDescription_SkillSwap[] = _(
+ "The user swaps special\n"
+ "abilities with the target.");
+
+static const u8 MoveDescription_Imprison[] = _(
+ "Prevents foes from using\n"
+ "moves known by the user.");
+
+static const u8 MoveDescription_Refresh[] = _(
+ "Heals poisoning, paralysis,\n"
+ "or a burn.");
+
+static const u8 MoveDescription_Grudge[] = _(
+ "If the user faints, deletes\n"
+ "the PP of the final move.");
+
+static const u8 MoveDescription_Snatch[] = _(
+ "Steals the effects of the\n"
+ "move the foe uses next.");
+
+static const u8 MoveDescription_SecretPower[] = _(
+ "An attack with effects\n"
+ "that vary by location.");
+
+static const u8 MoveDescription_Dive[] = _(
+ "Dives underwater the first\n"
+ "turn and strikes next turn.");
+
+static const u8 MoveDescription_ArmThrust[] = _(
+ "Straight-arm punches that\n"
+ "strike the foe 2 to 5 times.");
+
+static const u8 MoveDescription_Camouflage[] = _(
+ "Alters the POKéMON’s type\n"
+ "depending on the location.");
+
+static const u8 MoveDescription_TailGlow[] = _(
+ "Flashes a light that sharply\n"
+ "raises SP. ATK.");
+
+static const u8 MoveDescription_LusterPurge[] = _(
+ "Attacks with a burst of\n"
+ "light. May lower SP. DEF.");
+
+static const u8 MoveDescription_MistBall[] = _(
+ "Attacks with a flurry of\n"
+ "down. May lower SP. ATK.");
+
+static const u8 MoveDescription_FeatherDance[] = _(
+ "Envelops the foe with down\n"
+ "to sharply reduce ATTACK.");
+
+static const u8 MoveDescription_TeeterDance[] = _(
+ "Confuses all POKéMON on\n"
+ "the scene.");
+
+static const u8 MoveDescription_BlazeKick[] = _(
+ "A kick with a high critical-\n"
+ "hit ratio. May cause a burn.");
+
+static const u8 MoveDescription_MudSport[] = _(
+ "Covers the user in mud to\n"
+ "raise electrical resistance.");
+
+static const u8 MoveDescription_IceBall[] = _(
+ "A 5-turn attack that gains\n"
+ "power on successive hits.");
+
+static const u8 MoveDescription_NeedleArm[] = _(
+ "Attacks with thorny arms.\n"
+ "May cause flinching.");
+
+static const u8 MoveDescription_SlackOff[] = _(
+ "Slacks off and restores\n"
+ "half the maximum HP.");
+
+static const u8 MoveDescription_HyperVoice[] = _(
+ "A loud attack that uses\n"
+ "sound waves to injure.");
+
+static const u8 MoveDescription_PoisonFang[] = _(
+ "A sharp-fanged attack.\n"
+ "May badly poison the foe.");
+
+static const u8 MoveDescription_CrushClaw[] = _(
+ "Tears at the foe with sharp\n"
+ "claws. May lower DEFENSE.");
+
+static const u8 MoveDescription_BlastBurn[] = _(
+ "Powerful, but leaves the\n"
+ "user immobile the next turn.");
+
+static const u8 MoveDescription_HydroCannon[] = _(
+ "Powerful, but leaves the\n"
+ "user immobile the next turn.");
+
+static const u8 MoveDescription_MeteorMash[] = _(
+ "Fires a meteor-like punch.\n"
+ "May raise ATTACK.");
+
+static const u8 MoveDescription_Astonish[] = _(
+ "An attack that may shock\n"
+ "the foe into flinching.");
+
+static const u8 MoveDescription_WeatherBall[] = _(
+ "The move’s type and power\n"
+ "change with the weather.");
+
+static const u8 MoveDescription_Aromatherapy[] = _(
+ "Heals all status problems\n"
+ "with a soothing scent.");
+
+static const u8 MoveDescription_FakeTears[] = _(
+ "Feigns crying to sharply\n"
+ "lower the foe’s SP. DEF.");
+
+static const u8 MoveDescription_AirCutter[] = _(
+ "Hacks with razorlike wind.\n"
+ "High critical-hit ratio.");
+
+static const u8 MoveDescription_Overheat[] = _(
+ "Allows a full-power attack,\n"
+ "but sharply lowers SP. ATK.");
+
+static const u8 MoveDescription_OdorSleuth[] = _(
+ "Negates the foe’s efforts\n"
+ "to heighten evasiveness.");
+
+static const u8 MoveDescription_RockTomb[] = _(
+ "Stops the foe from moving\n"
+ "with rocks and cuts SPEED.");
+
+static const u8 MoveDescription_SilverWind[] = _(
+ "A powdery attack that may\n"
+ "raise abilities.");
+
+static const u8 MoveDescription_MetalSound[] = _(
+ "Emits a horrible screech\n"
+ "that sharply lowers SP. DEF.");
+
+static const u8 MoveDescription_GrassWhistle[] = _(
+ "Lulls the foe into sleep\n"
+ "with a pleasant melody.");
+
+static const u8 MoveDescription_Tickle[] = _(
+ "Makes the foe laugh to\n"
+ "lower ATTACK and DEFENSE.");
+
+static const u8 MoveDescription_CosmicPower[] = _(
+ "Raises DEFENSE and SP. DEF\n"
+ "with a mystic power.");
+
+static const u8 MoveDescription_WaterSpout[] = _(
+ "Inflicts more damage if the\n"
+ "user’s HP is high.");
+
+static const u8 MoveDescription_SignalBeam[] = _(
+ "A strange beam attack that\n"
+ "may confuse the foe.");
+
+static const u8 MoveDescription_ShadowPunch[] = _(
+ "An unavoidable punch that\n"
+ "is thrown from shadows.");
+
+static const u8 MoveDescription_Extrasensory[] = _(
+ "Attacks with a peculiar\n"
+ "power. May cause flinching.");
+
+static const u8 MoveDescription_SkyUppercut[] = _(
+ "An uppercut thrown as if\n"
+ "leaping into the sky.");
+
+static const u8 MoveDescription_SandTomb[] = _(
+ "Traps and hurts the foe in\n"
+ "quicksand for 2 to 5 turns.");
+
+static const u8 MoveDescription_SheerCold[] = _(
+ "A chilling attack that\n"
+ "causes fainting if it hits.");
+
+static const u8 MoveDescription_MuddyWater[] = _(
+ "Attacks with muddy water.\n"
+ "May lower accuracy.");
+
+static const u8 MoveDescription_BulletSeed[] = _(
+ "Shoots 2 to 5 seeds in a row\n"
+ "to strike the foe.");
+
+static const u8 MoveDescription_AerialAce[] = _(
+ "An extremely speedy and\n"
+ "unavoidable attack.");
+
+static const u8 MoveDescription_IcicleSpear[] = _(
+ "Attacks the foe by firing\n"
+ "2 to 5 icicles in a row.");
+
+static const u8 MoveDescription_IronDefense[] = _(
+ "Hardens the body’s surface\n"
+ "to sharply raise DEFENSE.");
+
+static const u8 MoveDescription_Block[] = _(
+ "Blocks the foe’s way to\n"
+ "prevent escape.");
+
+static const u8 MoveDescription_Howl[] = _(
+ "Howls to raise the spirit\n"
+ "and boosts ATTACK.");
+
+static const u8 MoveDescription_DragonClaw[] = _(
+ "Slashes the foe with sharp\n"
+ "claws.");
+
+static const u8 MoveDescription_FrenzyPlant[] = _(
+ "Powerful, but leaves the\n"
+ "user immobile the next turn.");
+
+static const u8 MoveDescription_BulkUp[] = _(
+ "Bulks up the body to boost\n"
+ "both ATTACK and DEFENSE.");
+
+static const u8 MoveDescription_Bounce[] = _(
+ "Bounces up, then down the\n"
+ "next turn. May paralyze.");
+
+static const u8 MoveDescription_MudShot[] = _(
+ "Hurls mud at the foe and\n"
+ "reduces SPEED.");
+
+static const u8 MoveDescription_PoisonTail[] = _(
+ "Has a high critical-hit\n"
+ "ratio. May also poison.");
+
+static const u8 MoveDescription_Covet[] = _(
+ "Cutely begs to obtain an\n"
+ "item held by the foe.");
+
+static const u8 MoveDescription_VoltTackle[] = _(
+ "A life-risking tackle that\n"
+ "slightly hurts the user.");
+
+static const u8 MoveDescription_MagicalLeaf[] = _(
+ "Attacks with a strange leaf\n"
+ "that cannot be evaded.");
+
+static const u8 MoveDescription_WaterSport[] = _(
+ "The user becomes soaked to\n"
+ "raise resistance to fire.");
+
+static const u8 MoveDescription_CalmMind[] = _(
+ "Raises SP. ATK and SP. DEF\n"
+ "by focusing the mind.");
+
+static const u8 MoveDescription_LeafBlade[] = _(
+ "Slashes with a sharp leaf.\n"
+ "High critical-hit ratio.");
+
+static const u8 MoveDescription_DragonDance[] = _(
+ "A mystical dance that ups\n"
+ "ATTACK and SPEED.");
+
+static const u8 MoveDescription_RockBlast[] = _(
+ "Hurls boulders at the foe\n"
+ "2 to 5 times in a row.");
+
+static const u8 MoveDescription_ShockWave[] = _(
+ "A fast and unavoidable\n"
+ "electric attack.");
+
+static const u8 MoveDescription_WaterPulse[] = _(
+ "Attacks with ultrasonic\n"
+ "waves. May confuse the foe");
+
+static const u8 MoveDescription_DoomDesire[] = _(
+ "Summons strong sunlight to\n"
+ "attack 2 turns later.");
+
+static const u8 MoveDescription_PsychoBoost[] = _(
+ "Allows a full-power attack,\n"
+ "but sharply lowers SP. ATK.");
+
+const u8 * const gMoveDescriptions[] = {
+ MoveDescription_Pound,
+ MoveDescription_KarateChop,
+ MoveDescription_DoubleSlap,
+ MoveDescription_CometPunch,
+ MoveDescription_MegaPunch,
+ MoveDescription_PayDay,
+ MoveDescription_FirePunch,
+ MoveDescription_IcePunch,
+ MoveDescription_ThunderPunch,
+ MoveDescription_Scratch,
+ MoveDescription_ViceGrip,
+ MoveDescription_Guillotine,
+ MoveDescription_RazorWind,
+ MoveDescription_SwordsDance,
+ MoveDescription_Cut,
+ MoveDescription_Gust,
+ MoveDescription_WingAttack,
+ MoveDescription_Whirlwind,
+ MoveDescription_Fly,
+ MoveDescription_Bind,
+ MoveDescription_Slam,
+ MoveDescription_VineWhip,
+ MoveDescription_Stomp,
+ MoveDescription_DoubleKick,
+ MoveDescription_MegaKick,
+ MoveDescription_JumpKick,
+ MoveDescription_RollingKick,
+ MoveDescription_SandAttack,
+ MoveDescription_Headbutt,
+ MoveDescription_HornAttack,
+ MoveDescription_FuryAttack,
+ MoveDescription_HornDrill,
+ MoveDescription_Tackle,
+ MoveDescription_BodySlam,
+ MoveDescription_Wrap,
+ MoveDescription_TakeDown,
+ MoveDescription_Thrash,
+ MoveDescription_DoubleEdge,
+ MoveDescription_TailWhip,
+ MoveDescription_PoisonSting,
+ MoveDescription_Twineedle,
+ MoveDescription_PinMissile,
+ MoveDescription_Leer,
+ MoveDescription_Bite,
+ MoveDescription_Growl,
+ MoveDescription_Roar,
+ MoveDescription_Sing,
+ MoveDescription_Supersonic,
+ MoveDescription_SonicBoom,
+ MoveDescription_Disable,
+ MoveDescription_Acid,
+ MoveDescription_Ember,
+ MoveDescription_Flamethrower,
+ MoveDescription_Mist,
+ MoveDescription_WaterGun,
+ MoveDescription_HydroPump,
+ MoveDescription_Surf,
+ MoveDescription_IceBeam,
+ MoveDescription_Blizzard,
+ MoveDescription_Psybeam,
+ MoveDescription_BubbleBeam,
+ MoveDescription_AuroraBeam,
+ MoveDescription_HyperBeam,
+ MoveDescription_Peck,
+ MoveDescription_DrillPeck,
+ MoveDescription_Submission,
+ MoveDescription_LowKick,
+ MoveDescription_Counter,
+ MoveDescription_SeismicToss,
+ MoveDescription_Strength,
+ MoveDescription_Absorb,
+ MoveDescription_MegaDrain,
+ MoveDescription_LeechSeed,
+ MoveDescription_Growth,
+ MoveDescription_RazorLeaf,
+ MoveDescription_SolarBeam,
+ MoveDescription_PoisonPowder,
+ MoveDescription_StunSpore,
+ MoveDescription_SleepPowder,
+ MoveDescription_PetalDance,
+ MoveDescription_StringShot,
+ MoveDescription_DragonRage,
+ MoveDescription_FireSpin,
+ MoveDescription_ThunderShock,
+ MoveDescription_Thunderbolt,
+ MoveDescription_ThunderWave,
+ MoveDescription_Thunder,
+ MoveDescription_RockThrow,
+ MoveDescription_Earthquake,
+ MoveDescription_Fissure,
+ MoveDescription_Dig,
+ MoveDescription_Toxic,
+ MoveDescription_Confusion,
+ MoveDescription_Psychic,
+ MoveDescription_Hypnosis,
+ MoveDescription_Meditate,
+ MoveDescription_Agility,
+ MoveDescription_QuickAttack,
+ MoveDescription_Rage,
+ MoveDescription_Teleport,
+ MoveDescription_NightShade,
+ MoveDescription_Mimic,
+ MoveDescription_Screech,
+ MoveDescription_DoubleTeam,
+ MoveDescription_Recover,
+ MoveDescription_Harden,
+ MoveDescription_Minimize,
+ MoveDescription_Smokescreen,
+ MoveDescription_ConfuseRay,
+ MoveDescription_Withdraw,
+ MoveDescription_DefenseCurl,
+ MoveDescription_Barrier,
+ MoveDescription_LightScreen,
+ MoveDescription_Haze,
+ MoveDescription_Reflect,
+ MoveDescription_FocusEnergy,
+ MoveDescription_Bide,
+ MoveDescription_Metronome,
+ MoveDescription_MirrorMove,
+ MoveDescription_SelfDestruct,
+ MoveDescription_EggBomb,
+ MoveDescription_Lick,
+ MoveDescription_Smog,
+ MoveDescription_Sludge,
+ MoveDescription_BoneClub,
+ MoveDescription_FireBlast,
+ MoveDescription_Waterfall,
+ MoveDescription_Clamp,
+ MoveDescription_Swift,
+ MoveDescription_SkullBash,
+ MoveDescription_SpikeCannon,
+ MoveDescription_Constrict,
+ MoveDescription_Amnesia,
+ MoveDescription_Kinesis,
+ MoveDescription_SoftBoiled,
+ MoveDescription_HiJumpKick,
+ MoveDescription_Glare,
+ MoveDescription_DreamEater,
+ MoveDescription_PoisonGas,
+ MoveDescription_Barrage,
+ MoveDescription_LeechLife,
+ MoveDescription_LovelyKiss,
+ MoveDescription_SkyAttack,
+ MoveDescription_Transform,
+ MoveDescription_Bubble,
+ MoveDescription_DizzyPunch,
+ MoveDescription_Spore,
+ MoveDescription_Flash,
+ MoveDescription_Psywave,
+ MoveDescription_Splash,
+ MoveDescription_AcidArmor,
+ MoveDescription_Crabhammer,
+ MoveDescription_Explosion,
+ MoveDescription_FurySwipes,
+ MoveDescription_Bonemerang,
+ MoveDescription_Rest,
+ MoveDescription_RockSlide,
+ MoveDescription_HyperFang,
+ MoveDescription_Sharpen,
+ MoveDescription_Conversion,
+ MoveDescription_TriAttack,
+ MoveDescription_SuperFang,
+ MoveDescription_Slash,
+ MoveDescription_Substitute,
+ MoveDescription_Struggle,
+ MoveDescription_Sketch,
+ MoveDescription_TripleKick,
+ MoveDescription_Thief,
+ MoveDescription_SpiderWeb,
+ MoveDescription_MindReader,
+ MoveDescription_Nightmare,
+ MoveDescription_FlameWheel,
+ MoveDescription_Snore,
+ MoveDescription_Curse,
+ MoveDescription_Flail,
+ MoveDescription_Conversion2,
+ MoveDescription_Aeroblast,
+ MoveDescription_CottonSpore,
+ MoveDescription_Reversal,
+ MoveDescription_Spite,
+ MoveDescription_PowderSnow,
+ MoveDescription_Protect,
+ MoveDescription_MachPunch,
+ MoveDescription_ScaryFace,
+ MoveDescription_FaintAttack,
+ MoveDescription_SweetKiss,
+ MoveDescription_BellyDrum,
+ MoveDescription_SludgeBomb,
+ MoveDescription_MudSlap,
+ MoveDescription_Octazooka,
+ MoveDescription_Spikes,
+ MoveDescription_ZapCannon,
+ MoveDescription_Foresight,
+ MoveDescription_DestinyBond,
+ MoveDescription_PerishSong,
+ MoveDescription_IcyWind,
+ MoveDescription_Detect,
+ MoveDescription_BoneRush,
+ MoveDescription_LockOn,
+ MoveDescription_Outrage,
+ MoveDescription_Sandstorm,
+ MoveDescription_GigaDrain,
+ MoveDescription_Endure,
+ MoveDescription_Charm,
+ MoveDescription_Rollout,
+ MoveDescription_FalseSwipe,
+ MoveDescription_Swagger,
+ MoveDescription_MilkDrink,
+ MoveDescription_Spark,
+ MoveDescription_FuryCutter,
+ MoveDescription_SteelWing,
+ MoveDescription_MeanLook,
+ MoveDescription_Attract,
+ MoveDescription_SleepTalk,
+ MoveDescription_HealBell,
+ MoveDescription_Return,
+ MoveDescription_Present,
+ MoveDescription_Frustration,
+ MoveDescription_Safeguard,
+ MoveDescription_PainSplit,
+ MoveDescription_SacredFire,
+ MoveDescription_Magnitude,
+ MoveDescription_DynamicPunch,
+ MoveDescription_Megahorn,
+ MoveDescription_DragonBreath,
+ MoveDescription_BatonPass,
+ MoveDescription_Encore,
+ MoveDescription_Pursuit,
+ MoveDescription_RapidSpin,
+ MoveDescription_SweetScent,
+ MoveDescription_IronTail,
+ MoveDescription_MetalClaw,
+ MoveDescription_VitalThrow,
+ MoveDescription_MorningSun,
+ MoveDescription_Synthesis,
+ MoveDescription_Moonlight,
+ MoveDescription_HiddenPower,
+ MoveDescription_CrossChop,
+ MoveDescription_Twister,
+ MoveDescription_RainDance,
+ MoveDescription_SunnyDay,
+ MoveDescription_Crunch,
+ MoveDescription_MirrorCoat,
+ MoveDescription_PsychUp,
+ MoveDescription_ExtremeSpeed,
+ MoveDescription_AncientPower,
+ MoveDescription_ShadowBall,
+ MoveDescription_FutureSight,
+ MoveDescription_RockSmash,
+ MoveDescription_Whirlpool,
+ MoveDescription_BeatUp,
+ MoveDescription_FakeOut,
+ MoveDescription_Uproar,
+ MoveDescription_Stockpile,
+ MoveDescription_SpitUp,
+ MoveDescription_Swallow,
+ MoveDescription_HeatWave,
+ MoveDescription_Hail,
+ MoveDescription_Torment,
+ MoveDescription_Flatter,
+ MoveDescription_WillOWisp,
+ MoveDescription_Memento,
+ MoveDescription_Facade,
+ MoveDescription_FocusPunch,
+ MoveDescription_SmellingSalt,
+ MoveDescription_FollowMe,
+ MoveDescription_NaturePower,
+ MoveDescription_Charge,
+ MoveDescription_Taunt,
+ MoveDescription_HelpingHand,
+ MoveDescription_Trick,
+ MoveDescription_RolePlay,
+ MoveDescription_Wish,
+ MoveDescription_Assist,
+ MoveDescription_Ingrain,
+ MoveDescription_Superpower,
+ MoveDescription_MagicCoat,
+ MoveDescription_Recycle,
+ MoveDescription_Revenge,
+ MoveDescription_BrickBreak,
+ MoveDescription_Yawn,
+ MoveDescription_KnockOff,
+ MoveDescription_Endeavor,
+ MoveDescription_Eruption,
+ MoveDescription_SkillSwap,
+ MoveDescription_Imprison,
+ MoveDescription_Refresh,
+ MoveDescription_Grudge,
+ MoveDescription_Snatch,
+ MoveDescription_SecretPower,
+ MoveDescription_Dive,
+ MoveDescription_ArmThrust,
+ MoveDescription_Camouflage,
+ MoveDescription_TailGlow,
+ MoveDescription_LusterPurge,
+ MoveDescription_MistBall,
+ MoveDescription_FeatherDance,
+ MoveDescription_TeeterDance,
+ MoveDescription_BlazeKick,
+ MoveDescription_MudSport,
+ MoveDescription_IceBall,
+ MoveDescription_NeedleArm,
+ MoveDescription_SlackOff,
+ MoveDescription_HyperVoice,
+ MoveDescription_PoisonFang,
+ MoveDescription_CrushClaw,
+ MoveDescription_BlastBurn,
+ MoveDescription_HydroCannon,
+ MoveDescription_MeteorMash,
+ MoveDescription_Astonish,
+ MoveDescription_WeatherBall,
+ MoveDescription_Aromatherapy,
+ MoveDescription_FakeTears,
+ MoveDescription_AirCutter,
+ MoveDescription_Overheat,
+ MoveDescription_OdorSleuth,
+ MoveDescription_RockTomb,
+ MoveDescription_SilverWind,
+ MoveDescription_MetalSound,
+ MoveDescription_GrassWhistle,
+ MoveDescription_Tickle,
+ MoveDescription_CosmicPower,
+ MoveDescription_WaterSpout,
+ MoveDescription_SignalBeam,
+ MoveDescription_ShadowPunch,
+ MoveDescription_Extrasensory,
+ MoveDescription_SkyUppercut,
+ MoveDescription_SandTomb,
+ MoveDescription_SheerCold,
+ MoveDescription_MuddyWater,
+ MoveDescription_BulletSeed,
+ MoveDescription_AerialAce,
+ MoveDescription_IcicleSpear,
+ MoveDescription_IronDefense,
+ MoveDescription_Block,
+ MoveDescription_Howl,
+ MoveDescription_DragonClaw,
+ MoveDescription_FrenzyPlant,
+ MoveDescription_BulkUp,
+ MoveDescription_Bounce,
+ MoveDescription_MudShot,
+ MoveDescription_PoisonTail,
+ MoveDescription_Covet,
+ MoveDescription_VoltTackle,
+ MoveDescription_MagicalLeaf,
+ MoveDescription_WaterSport,
+ MoveDescription_CalmMind,
+ MoveDescription_LeafBlade,
+ MoveDescription_DragonDance,
+ MoveDescription_RockBlast,
+ MoveDescription_ShockWave,
+ MoveDescription_WaterPulse,
+ MoveDescription_DoomDesire,
+ MoveDescription_PsychoBoost,
+};
diff --git a/src/data/text/nature_names_de.h b/src/data/text/nature_names_de.h
new file mode 100644
index 000000000..695b0b62c
--- /dev/null
+++ b/src/data/text/nature_names_de.h
@@ -0,0 +1,53 @@
+static const u8 NatureName_Hardy[] = _("ROBUST");
+static const u8 NatureName_Lonely[] = _("SOLO");
+static const u8 NatureName_Brave[] = _("MUTIG");
+static const u8 NatureName_Adamant[] = _("HART");
+static const u8 NatureName_Naughty[] = _("FRECH");
+static const u8 NatureName_Bold[] = _("KÜHN");
+static const u8 NatureName_Docile[] = _("SANFT");
+static const u8 NatureName_Relaxed[] = _("LOCKER");
+static const u8 NatureName_Impish[] = _("PFIFFIG");
+static const u8 NatureName_Lax[] = _("LASCH");
+static const u8 NatureName_Timid[] = _("SCHEU");
+static const u8 NatureName_Hasty[] = _("HASTIG");
+static const u8 NatureName_Serious[] = _("ERNST");
+static const u8 NatureName_Jolly[] = _("FROH");
+static const u8 NatureName_Naive[] = _("NAIV");
+static const u8 NatureName_Modest[] = _("MÄSSIG");
+static const u8 NatureName_Mild[] = _("MILD");
+static const u8 NatureName_Quiet[] = _("RUHIG");
+static const u8 NatureName_Bashful[] = _("ZAGHAFT");
+static const u8 NatureName_Rash[] = _("HITZIG");
+static const u8 NatureName_Calm[] = _("STILL");
+static const u8 NatureName_Gentle[] = _("ZART");
+static const u8 NatureName_Sassy[] = _("FORSCH");
+static const u8 NatureName_Careful[] = _("SACHT");
+static const u8 NatureName_Quirky[] = _("KAUZIG");
+
+const u8 * const gNatureNames[] = {
+ NatureName_Hardy,
+ NatureName_Lonely,
+ NatureName_Brave,
+ NatureName_Adamant,
+ NatureName_Naughty,
+ NatureName_Bold,
+ NatureName_Docile,
+ NatureName_Relaxed,
+ NatureName_Impish,
+ NatureName_Lax,
+ NatureName_Timid,
+ NatureName_Hasty,
+ NatureName_Serious,
+ NatureName_Jolly,
+ NatureName_Naive,
+ NatureName_Modest,
+ NatureName_Mild,
+ NatureName_Quiet,
+ NatureName_Bashful,
+ NatureName_Rash,
+ NatureName_Calm,
+ NatureName_Gentle,
+ NatureName_Sassy,
+ NatureName_Careful,
+ NatureName_Quirky,
+};
diff --git a/src/data/text/nature_names_en.h b/src/data/text/nature_names_en.h
new file mode 100644
index 000000000..305b43690
--- /dev/null
+++ b/src/data/text/nature_names_en.h
@@ -0,0 +1,53 @@
+static const u8 NatureName_Hardy[] = _("HARDY");
+static const u8 NatureName_Lonely[] = _("LONELY");
+static const u8 NatureName_Brave[] = _("BRAVE");
+static const u8 NatureName_Adamant[] = _("ADAMANT");
+static const u8 NatureName_Naughty[] = _("NAUGHTY");
+static const u8 NatureName_Bold[] = _("BOLD");
+static const u8 NatureName_Docile[] = _("DOCILE");
+static const u8 NatureName_Relaxed[] = _("RELAXED");
+static const u8 NatureName_Impish[] = _("IMPISH");
+static const u8 NatureName_Lax[] = _("LAX");
+static const u8 NatureName_Timid[] = _("TIMID");
+static const u8 NatureName_Hasty[] = _("HASTY");
+static const u8 NatureName_Serious[] = _("SERIOUS");
+static const u8 NatureName_Jolly[] = _("JOLLY");
+static const u8 NatureName_Naive[] = _("NAIVE");
+static const u8 NatureName_Modest[] = _("MODEST");
+static const u8 NatureName_Mild[] = _("MILD");
+static const u8 NatureName_Quiet[] = _("QUIET");
+static const u8 NatureName_Bashful[] = _("BASHFUL");
+static const u8 NatureName_Rash[] = _("RASH");
+static const u8 NatureName_Calm[] = _("CALM");
+static const u8 NatureName_Gentle[] = _("GENTLE");
+static const u8 NatureName_Sassy[] = _("SASSY");
+static const u8 NatureName_Careful[] = _("CAREFUL");
+static const u8 NatureName_Quirky[] = _("QUIRKY");
+
+const u8 * const gNatureNames[] = {
+ NatureName_Hardy,
+ NatureName_Lonely,
+ NatureName_Brave,
+ NatureName_Adamant,
+ NatureName_Naughty,
+ NatureName_Bold,
+ NatureName_Docile,
+ NatureName_Relaxed,
+ NatureName_Impish,
+ NatureName_Lax,
+ NatureName_Timid,
+ NatureName_Hasty,
+ NatureName_Serious,
+ NatureName_Jolly,
+ NatureName_Naive,
+ NatureName_Modest,
+ NatureName_Mild,
+ NatureName_Quiet,
+ NatureName_Bashful,
+ NatureName_Rash,
+ NatureName_Calm,
+ NatureName_Gentle,
+ NatureName_Sassy,
+ NatureName_Careful,
+ NatureName_Quirky,
+};
diff --git a/src/daycare.c b/src/daycare.c
deleted file mode 100644
index cded18207..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 word_2024E82;
-
-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 = sub_803B7C8(mon, r6)) != 0){
- r6 = 0;
- if(temp == 0xffff){
- DeleteFirstMoveAndGiveMoveToMon(mon, word_2024E82);
- }
- }
- }
-
- 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..c93ef74cd 100644
--- a/src/de_rom_8040FE0.c
+++ b/src/de_rom_8040FE0.c
@@ -1,56 +1,35 @@
#include "global.h"
#include "battle.h"
+#include "battle_tower.h"
+#include "ewram.h"
+#include "trainer.h"
#if GERMAN
-enum {
- TRAINER_CLASS_NAME_LEADER = 25,
- TRAINER_CLASS_NAME_SCHOOL_KID = 26,
- TRAINER_CLASS_NAME_EXPERT = 30,
- TRAINER_CLASS_NAME_POKEMON_TRAINER_3 = 46,
-};
-
-enum {
- TRAINER_CLASS_LEADER_F = 26,
- TRAINER_CLASS_ELITE_FOUR_F = 25,
- TRAINER_CLASS_SCHOOL_KID_F = 30,
- TRAINER_CLASS_BIRD_KEEPER = 46,
- TRAINER_CLASS_MAY_1 = 61,
- TRAINER_CLASS_MAY_2 = 62,
- TRAINER_CLASS_MAY_3 = 63,
-};
-
-extern struct SecretBaseRecord gSecretBaseRecord;
-
extern u8 gTrainerClassNames[][13];
extern struct Trainer gTrainers[];
-u8 *de_sub_8040FE0(u8 gender) {
+u8 *de_sub_8040FE0(u8 gender)
+{
if (gender)
- {
gender++;
-
- }
-
- gender = TRAINER_CLASS_NAME_SCHOOL_KID;
+ gender = TRAINER_CLASS_SCHOOL_KID;
return gTrainerClassNames[gender];
}
-u8 *de_sub_8040FF4(u8 gender) {
- if (gender) {
+u8 *de_sub_8040FF4(u8 gender)
+{
+ if (gender)
gender++;
- }
-
- gender = TRAINER_CLASS_NAME_POKEMON_TRAINER_3;
+ gender = TRAINER_CLASS_POKEMON_TRAINER_3;
return gTrainerClassNames[gender];
}
-u8 *de_sub_804100C(u8 gender) {
- if (gender) {
+u8 *de_sub_804100C(u8 gender)
+{
+ if (gender)
gender++;
- }
-
- gender = TRAINER_CLASS_NAME_LEADER;
+ gender = TRAINER_CLASS_LEADER;
return gTrainerClassNames[gender];
}
@@ -59,9 +38,9 @@ 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 *de_sub_8041024(s32 arg0, u32 arg1)
+{
u8 nameIndex, trainerClass, gender;
struct Trainer *trainer;
u8 local2;
@@ -70,70 +49,41 @@ u8 *de_sub_8041024(s32 arg0, u32 arg1) {
{
case 0x400:
nameIndex = GetSecretBaseTrainerNameIndex();
- gender = gSecretBaseRecord.gender;
- if (nameIndex == TRAINER_CLASS_NAME_SCHOOL_KID)
- {
+ gender = eSecretBaseRecord.gender;
+ if (nameIndex == TRAINER_CLASS_SCHOOL_KID)
return de_sub_8040FE0(gender);
- }
-
return gTrainerClassNames[nameIndex];
-
case 0x100:
trainerClass = de_sub_81364AC();
nameIndex = get_trainer_class_name_index();
- if (trainerClass == TRAINER_CLASS_SCHOOL_KID_F)
- {
+ if (trainerClass == FACILITY_CLASS_SCHOOL_KID_F)
return de_sub_8040FE0(FEMALE);
- }
- if (trainerClass == TRAINER_CLASS_MAY_1 || trainerClass == TRAINER_CLASS_MAY_2 || trainerClass == TRAINER_CLASS_MAY_3)
- {
+ if (trainerClass == FACILITY_CLASS_MAY_1 || trainerClass == FACILITY_CLASS_MAY_2 || trainerClass == FACILITY_CLASS_MAY_3)
return de_sub_8040FF4(FEMALE);
- }
-
return gTrainerClassNames[nameIndex];
-
case 0x800:
trainerClass = de_sub_81364F8();
- nameIndex = sub_8135FD8();
- if (trainerClass == TRAINER_CLASS_SCHOOL_KID_F)
- {
+ nameIndex = GetEReaderTrainerClassNameIndex();
+ if (trainerClass == FACILITY_CLASS_SCHOOL_KID_F)
return de_sub_8040FE0(FEMALE);
- }
- if (trainerClass == TRAINER_CLASS_MAY_1 || trainerClass == TRAINER_CLASS_MAY_2 || trainerClass == TRAINER_CLASS_MAY_3)
- {
+ if (trainerClass == FACILITY_CLASS_MAY_1 || trainerClass == FACILITY_CLASS_MAY_2 || trainerClass == FACILITY_CLASS_MAY_3)
return de_sub_8040FF4(FEMALE);
- }
-
return gTrainerClassNames[nameIndex];
-
default:
trainer = &gTrainers[arg1];
trainerClass = trainer->trainerClass;
local2 = sub_803FC58(arg1);
-
- if (trainerClass == TRAINER_CLASS_LEADER_F)
- {
+ if (trainerClass == FACILITY_CLASS_LEADER_F)
return de_sub_8040FE0(local2);
- }
-
- if (trainerClass == TRAINER_CLASS_BIRD_KEEPER && local2 == FEMALE)
- {
+ if (trainerClass == FACILITY_CLASS_BIRD_KEEPER && local2 == FEMALE)
return de_sub_8040FF4(FEMALE);
- }
-
- if (trainerClass == TRAINER_CLASS_ELITE_FOUR_F)
+ if (trainerClass == FACILITY_CLASS_ELITE_FOUR_F)
{
if (gTrainers[arg1].doubleBattle == TRUE)
- {
return de_sub_804100C(FEMALE);
- }
else
- {
return de_sub_804100C(MALE);
- }
}
-
-
return gTrainerClassNames[trainerClass];
}
}
@@ -166,7 +116,7 @@ _0804104A:\n\
bl GetSecretBaseTrainerNameIndex\n\
lsls r0, 24\n\
lsrs r5, r0, 24\n\
- ldr r0, _08041060 @ =0x02017000\n\
+ ldr r0, _08041060 @ =gSharedMem + 0x17000\n\
ldrb r0, [r0, 0x1]\n\
lsls r0, 27\n\
lsrs r2, r0, 31\n\
@@ -174,7 +124,7 @@ _0804104A:\n\
beq _080410B8\n\
b _080410F8\n\
.align 2, 0\n\
-_08041060: .4byte 0x02017000\n\
+_08041060: .4byte gSharedMem + 0x17000\n\
_08041064:\n\
bl de_sub_81364AC\n\
lsls r0, 24\n\
@@ -196,7 +146,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\
@@ -265,7 +215,8 @@ _08041108: .4byte gTrainerClassNames\n\
}
#endif
-u32 de_sub_804110C(u32 arg0, u32 arg1) {
+u32 de_sub_804110C(u32 arg0, u32 arg1)
+{
return arg1;
}
diff --git a/src/debug/matsuda_debug_menu.c b/src/debug/matsuda_debug_menu.c
new file mode 100644
index 000000000..49fe6864b
--- /dev/null
+++ b/src/debug/matsuda_debug_menu.c
@@ -0,0 +1,1094 @@
+#include "global.h"
+#include "matsuda_debug_menu.h"
+#include "contest.h"
+#include "contest_link_80C2020.h"
+#include "contest_link_80C857C.h"
+#include "data2.h"
+#include "link.h"
+#include "main.h"
+#include "menu.h"
+#include "palette.h"
+#include "overworld.h"
+#include "sprite.h"
+#include "start_menu.h"
+#include "string_util.h"
+#include "task.h"
+#include "text.h"
+#include "unknown_task.h"
+#include "ewram.h"
+
+extern u8 gUnknown_0203856C;
+extern s16 gUnknown_02038670[];
+extern s16 gUnknown_02038678[];
+extern s16 gUnknown_02038680[];
+extern u8 gContestFinalStandings[];
+extern u8 gUnknown_02038694;
+extern u8 gIsLinkContest;
+extern u8 gUnknown_0203869B;
+extern u8 gContestPlayerMonIndex;
+extern u16 gSpecialVar_ContestCategory;
+extern u16 gSpecialVar_ContestRank;
+
+extern u16 gBattle_BG0_X;
+extern u16 gBattle_BG0_Y;
+extern u16 gBattle_BG1_X;
+extern u16 gBattle_BG1_Y;
+extern u16 gBattle_BG2_X;
+extern u16 gBattle_BG2_Y;
+extern u16 gUnknown_030041B0;
+extern u16 gUnknown_030041B8;
+extern struct Window gUnknown_03004210;
+extern u8 (*gCallback_03004AE8)(void);
+
+extern bool8 gReceivedRemoteLinkPlayers;
+
+static bool8 sub_80A9B78(void);
+static void sub_80A9BE4(u8 taskId);
+static void sub_80A9C98(u8);
+static void sub_80A9CC0(u8);
+static void sub_80A9CDC(u8);
+static void sub_80A9D58(u8);
+static void sub_80A9DBC(u8);
+static void sub_80A9DD8(u8);
+static void sub_80A9E04(u8 taskId);
+static void sub_80A9E3C(u8 taskId);
+static void sub_80A9E80(u8);
+static void sub_80A9ED8(u8);
+static void sub_80A9F10(u8);
+static void sub_80AA10C(void);
+static void sub_80AA5BC(u8);
+static void sub_80AA614(u8, u8);
+static void sub_80AAD08(struct Sprite *, s8);
+
+// unused
+const u8 gText_Unused83C9150[] = _("テストです"); // "test"
+const u8 gMatsudaDebugMenu_ActionContestText[] = _("Contest");
+const u8 gMatsudaDebugMenu_ActionContestResultsText[] = _("Contest results");
+// unused
+const u8 gMatsudaDebugMenu_ActionChangePerimeterText[] = _("パラメータへんこう"); // "Change parameter"
+// unused
+const u8 gMatsudaDebugMenu_ActionChangeMoveText[] = _("わざ へんこう"); // "Change move"
+const u8 gMatsudaDebugMenu_ActionContestCommText[] = _("Contest (comm.)");
+const u8 gMatsudaDebugMenu_ActionCommTestText[] = _("Init comm. data");
+const u8 gMatsudaDebugMenu_ActionSetHighScoreText[] = _("Set highest score");
+const u8 gMatsudaDebugMenu_ActionResetHighScoreText[] = _("Reset highest score");
+const u8 gMatsudaDebugMenu_ActionSetAllArtMuseumText[] = _("Set all art museum items");
+
+const struct MenuAction gMatsudaDebugMenuActions[] =
+{
+ {gMatsudaDebugMenu_ActionContestText, MatsudaDebugMenu_Contest},
+ {gMatsudaDebugMenu_ActionContestResultsText, MatsudaDebugMenu_ContestResults},
+ {gMatsudaDebugMenu_ActionContestCommText, MatsudaDebugMenu_ContestComm},
+ {gMatsudaDebugMenu_ActionCommTestText, MatsudaDebugMenu_CommTest},
+ {gMatsudaDebugMenu_ActionSetHighScoreText, MatsudaDebugMenu_SetHighScore},
+ {gMatsudaDebugMenu_ActionResetHighScoreText, MatsudaDebugMenu_ResetHighScore},
+ {gMatsudaDebugMenu_ActionSetAllArtMuseumText, MatsudaDebugMenu_SetArtMuseumItems},
+};
+
+const u8 gMatsudaDebugMenu_UnknownByteArray[] = {0xFC, 0x02, 0x0F, 0x00, 0xFF};
+const u8 Unknown_083C922D[] = INCBIN_U8("graphics/unknown/ball.4bpp");
+const u16 Unknown_083C924E[] = INCBIN_U16("graphics/unknown/ball.gbapal");
+
+const u8 gUnknown_083C926E[][2] =
+{
+ {2, 0},
+ {17, 0},
+ {2, 2},
+ {17, 2},
+};
+
+const u8 gMatsudaDebugMenuContestTopLeft[][2] =
+{
+ {0, 6},
+ {15, 6},
+ {0, 8},
+ {15, 8},
+ {0, 10},
+ {15, 10},
+};
+
+const u8 gUnknown_083C9282[] =
+{
+ // TODO: 2d array?
+ 7, 6,
+ 22, 6,
+ 7, 8,
+ 22, 8,
+ 7, 10,
+ 22, 10,
+};
+
+const u8 gUnknown_083C928E[][2] =
+{
+ {2, 14},
+ {17, 14},
+ {2, 16},
+ {17, 16},
+};
+
+const u8 gUnknown_083C9296[] = {0x08, 0x80, 0x08, 0x80, 0x10, 0x10, 0x30, 0xA8, 0x30, 0xA8, 0x30, 0xA8, 0x08, 0x80, 0x08, 0x80, 0x10, 0x88};
+const u8 gUnknown_083C92A8[] = {0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x78, 0x88, 0x98};
+
+const struct SpriteSheet gUnknown_083C92B4[] = {Unknown_083C922D, 32, 0x4B0};
+const struct SpritePalette gUnknown_083C92BC[] = {Unknown_083C924E, 0x4B0};
+
+const struct OamData gOamData_83C92C4 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 0,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const struct SpriteTemplate gSpriteTemplate_83C92CC =
+{
+ .tileTag = 1200,
+ .paletteTag = 1200,
+ .oam = &gOamData_83C92C4,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80AA754,
+};
+
+static void (* const gUnknown_083C92E4[][2])(struct Sprite *, s8) =
+{
+ {sub_80AA8C8, sub_80AA8D8},
+ {sub_80AA8E8, sub_80AA8F8},
+ {sub_80AAC5C, sub_80AAC5C},
+ {sub_80AA930, sub_80AA974},
+ {sub_80AA9B8, sub_80AA9FC},
+ {sub_80AAA40, sub_80AAA84},
+ {sub_80AAAF0, sub_80AAB30},
+ {sub_80AAB70, sub_80AABB0},
+ {sub_80AABF0, sub_80AAD44},
+};
+
+static const u8 gMatsudaDebugMenu_StartText[] = _("{COLOR CYAN}{HIGHLIGHT RED}");
+static const u8 gMatsudaDebugMenu_StartJapText[] = _("かいし"); // because StartText is only called by StringCopy, this part appears to be unused.
+static const u8 gMatsudaDebugMenu_GoBackText[] = _("もどる");
+
+#ifdef GERMAN
+static const u8 gMatsudaDebugMenu_BattlePointsText[] = _("{COLOR MAGENTA}BP,");
+#else
+static const u8 gMatsudaDebugMenu_BattlePointsText[] = _("{COLOR MAGENTA}BP.");
+#endif
+
+static const u8 MatsudaDebugMenuText_Cool[] = _("かっこよさ"); // cool
+static const u8 MatsudaDebugMenuText_Cute[] = _("かわいさ"); // cute
+static const u8 MatsudaDebugMenuText_Beauty[] = _("うつくしさ"); // beauty
+static const u8 MatsudaDebugMenuText_Smart[] = _("かしこさ"); // smart
+static const u8 MatsudaDebugMenuText_Tough[] = _("たくましさ"); // tough
+static const u8 MatsudaDebugMenuText_Sheen[] = _("けづや"); // sheen
+
+static const u8 *const gMatsudaDebugMenuTextList1[] =
+{
+ MatsudaDebugMenuText_Cool,
+ MatsudaDebugMenuText_Cute,
+ MatsudaDebugMenuText_Beauty,
+ MatsudaDebugMenuText_Smart,
+ MatsudaDebugMenuText_Tough,
+ MatsudaDebugMenuText_Sheen,
+};
+
+static const u8 MatsudaDebugMenuText_CoolContest[] = _("かっこよさコンテスト");
+static const u8 MatsudaDebugMenuText_BeautyContest[] = _("うつくしさコンテスト");
+static const u8 MatsudaDebugMenuText_CuteContest[] = _("かわいさコンテスト ");
+static const u8 MatsudaDebugMenuText_SmartContest[] = _("かしこさコンテスト ");
+static const u8 MatsudaDebugMenuText_ToughContest[] = _("たくましさコンテスト");
+
+static const u8 *const gMatsudaDebugMenuTextList2[] =
+{
+ MatsudaDebugMenuText_CoolContest,
+ MatsudaDebugMenuText_BeautyContest,
+ MatsudaDebugMenuText_CuteContest,
+ MatsudaDebugMenuText_SmartContest,
+ MatsudaDebugMenuText_ToughContest,
+};
+
+static const u8 MatsudaDebugMenuText_Fallarbor[] = _("ハジツゲ/ノーマル"); // Fallarbor / Normal
+static const u8 MatsudaDebugMenuText_Verdanturf[] = _("シダケ/スーパー "); // Verdanturf / Super
+static const u8 MatsudaDebugMenuText_Slateport[] = _("カイナ/ハイパー "); // Slateport / Hyper
+static const u8 MatsudaDebugMenuText_Lilycove[] = _("ミナモ/マスター "); // Lilycove / Master
+
+static const u8 *const gMatsudaDebugMenuTextList3[] =
+{
+ MatsudaDebugMenuText_Fallarbor,
+ MatsudaDebugMenuText_Verdanturf,
+ MatsudaDebugMenuText_Slateport,
+ MatsudaDebugMenuText_Lilycove,
+};
+
+static const struct OamData gUnknown_083C9400 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 1023,
+ .priority = 0,
+ .paletteNum = 15,
+ .affineParam = 0,
+};
+
+u8 unref_sub_80A9B28(void)
+{
+ MenuZeroFillScreen();
+ MenuDrawTextWindow(0, 0, 17, 18);
+ PrintMenuItems(1, 1, 7, gMatsudaDebugMenuActions);
+ InitMenu(0, 1, 1, 7, 0, 16);
+ gCallback_03004AE8 = sub_80A9B78;
+ return 0;
+}
+
+static bool8 sub_80A9B78(void)
+{
+ s8 choice = ProcessMenuInput();
+
+ switch (choice)
+ {
+ case -2:
+ return FALSE;
+ default:
+ gCallback_03004AE8 = gMatsudaDebugMenuActions[choice].func;
+ return FALSE;
+ case -1:
+ CloseMenu();
+ return TRUE;
+ }
+}
+
+u8 MatsudaDebugMenu_ContestResults(void)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ CreateTask(sub_80A9BE4, 0xFF);
+ return 1;
+}
+
+static void sub_80A9BE4(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ DestroyTask(taskId);
+
+ if (!(gIsLinkContest & 1))
+ sub_80AF668();
+
+ sub_80C2358();
+ }
+}
+
+u8 MatsudaDebugMenu_Contest(void)
+{
+ gIsLinkContest = 0;
+ sub_80AA10C();
+ return 0;
+}
+
+u8 MatsudaDebugMenu_ContestComm(void)
+{
+ sub_80AA10C();
+ return 0;
+}
+
+u8 MatsudaDebugMenu_CommTest(void)
+{
+ u8 newTaskId;
+ u8 newTaskId2;
+
+ newTaskId = CreateTask(sub_80A9E3C, 0);
+ SetTaskFuncWithFollowupFunc(newTaskId, sub_80A9E3C, sub_80A9C98);
+ newTaskId2 = CreateTask(sub_80A9E04, 1);
+ gTasks[newTaskId2].data[10] = newTaskId;
+ gTasks[newTaskId].data[10] = newTaskId2;
+ return 1;
+}
+
+static void sub_80A9C98(u8 taskId)
+{
+ Contest_CreatePlayerMon(0);
+ SetTaskFuncWithFollowupFunc(taskId, sub_80C8734, sub_80A9CC0);
+}
+
+static void sub_80A9CC0(u8 taskId)
+{
+ SetTaskFuncWithFollowupFunc(taskId, sub_80C88AC, sub_80A9CDC);
+}
+
+static void sub_80A9CDC(u8 taskId)
+{
+ SetTaskFuncWithFollowupFunc(taskId, sub_80C8E1C, sub_80A9D58);
+}
+
+static void sub_80A9CF8(u8 taskId)
+{
+ if (gReceivedRemoteLinkPlayers == FALSE)
+ {
+ DestroyTask(gTasks[taskId].data[10]);
+ DestroyTask(taskId);
+ CloseMenu();
+ }
+}
+
+static void sub_80A9D30(u8 taskId)
+{
+ sub_800832C();
+ gTasks[taskId].func = sub_80A9CF8;
+}
+
+static void sub_80A9D58(u8 taskId)
+{
+ int i;
+ u8 dest[4];
+
+ for (i = 0; i < 4; i++)
+ dest[i] = gTasks[taskId].data[5 + i];
+
+ gUnknown_0203869B = sub_80C4B34(dest);
+ sub_80AE82C((u8)gSpecialVar_ContestCategory);
+ sub_80B0F28(0);
+ SetTaskFuncWithFollowupFunc(taskId, sub_80C8EBC, sub_80A9DBC);
+}
+
+static void sub_80A9DBC(u8 taskId)
+{
+ SetTaskFuncWithFollowupFunc(taskId, sub_80C8F34, sub_80A9DD8);
+}
+
+static void sub_80A9DD8(u8 taskId)
+{
+ DestroyTask(gTasks[taskId].data[10]);
+ DestroyTask(taskId);
+ CloseMenu();
+}
+
+static void sub_80A9E04(u8 taskId)
+{
+ if (gMain.newKeys == 2)
+ gTasks[(u8)gTasks[taskId].data[10]].func = sub_80A9D30;
+}
+
+static void sub_80A9E3C(u8 taskId)
+{
+ u8 i;
+
+ OpenLink();
+
+ for (i = 0; i < 4; i++)
+ gBlockRecvBuffer[i][0] = 255;
+
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_80A9E80;
+}
+
+static void sub_80A9E80(u8 taskId)
+{
+ TaskFunc func;
+
+ if (gTasks[taskId].data[0] < 10)
+ gTasks[taskId].data[0]++;
+ else
+ {
+ if (GetLinkPlayerCount_2() > 3)
+ {
+ gTasks[taskId].data[0] = 0;
+
+ if (IsLinkMaster())
+ {
+ func = sub_80A9ED8;
+ gTasks[taskId].func = (TaskFunc)func;
+ }
+ else
+ {
+ func = sub_80A9F10;
+ gTasks[taskId].func = (TaskFunc)func;
+ }
+ }
+ }
+}
+
+static void sub_80A9ED8(u8 taskId)
+{
+ gTasks[taskId].data[0] = gTasks[taskId].data[0] + 1;
+ if ((gTasks[taskId].data[0]) == 101)
+ {
+ sub_8007F4C();
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_80A9F10;
+ }
+}
+
+static void sub_80A9F10(u8 taskId)
+{
+ if (gReceivedRemoteLinkPlayers)
+ {
+ gContestPlayerMonIndex = GetMultiplayerId();
+ if (GetLinkPlayerCount() == 4)
+ {
+ gIsLinkContest = 1;
+ SwitchTaskToFollowupFunc(taskId);
+ }
+ }
+}
+
+static void sub_80A9F50(void)
+{
+ REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP;
+ REG_DISPCNT |= DISPCNT_OBJ_ON | DISPCNT_BG0_ON;
+ SetUpWindowConfig(&gWindowConfig_81E6C3C);
+ InitWindowFromConfig(&gMenuWindow, &gWindowConfig_81E6C3C);
+ REG_MOSAIC = 0;
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ REG_BLDY = 0;
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 0;
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ gBattle_BG2_X = 0;
+ gBattle_BG2_Y = 0;
+ gUnknown_030041B0 = 0;
+ gUnknown_030041B8 = 0;
+}
+
+static void sub_80A9FE4(void)
+{
+ u8 *addr;
+ u32 i;
+ u8 ptr[5];
+
+ memcpy(ptr, gMatsudaDebugMenu_UnknownByteArray, 5);
+
+ addr = (void *)VRAM;
+ i = VRAM_SIZE;
+
+ while (1)
+ {
+ DmaFill32(3, 0, addr, 0x1000);
+ addr += 0x1000;
+ i -= 0x1000;
+ if (i <= 0x1000)
+ {
+ DmaFill32(3, 0, addr, i);
+ break;
+ }
+ }
+ sub_80034D4((void *)VRAM, ptr);
+ LoadFontDefaultPalette(&gWindowConfig_81E6C3C);
+}
+
+static void sub_80AA064(void)
+{
+ AnimateSprites();
+ BuildOamBuffer();
+ RunTasks();
+ UpdatePaletteFade();
+ if (gMain.newKeys == 4)
+ SetMainCallback2(sub_805469C);
+}
+
+static void sub_80AA090(void)
+{
+ REG_BG0HOFS = gBattle_BG0_X;
+ REG_BG0VOFS = gBattle_BG0_Y;
+ REG_BG1HOFS = gBattle_BG1_X;
+ REG_BG1VOFS = gBattle_BG1_Y;
+ REG_BG2HOFS = gBattle_BG2_X;
+ REG_BG2VOFS = gBattle_BG2_Y;
+ REG_BG3HOFS = gUnknown_030041B0;
+ REG_BG3VOFS = gUnknown_030041B8;
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ sub_8089668();
+}
+
+static void sub_80AA10C(void)
+{
+ u8 i;
+ u8 zero;
+ u8 spriteId;
+
+ gPaletteFade.bufferTransferDisabled = 1;
+ SetVBlankCallback(0);
+ sub_80A9F50();
+ dp12_8087EA4();
+ ResetPaletteFade();
+ ResetSpriteData();
+ ResetTasks();
+ FreeAllSpritePalettes();
+ sub_80A9FE4();
+ SetVBlankCallback(sub_80AA090);
+ SetMainCallback2(sub_80AA064);
+ gPaletteFade.bufferTransferDisabled = 0;
+ gUnknown_02038694 = 0;
+
+ if (!(gContestMons[0].nickname[0]))
+ Contest_InitAllPokemon(0, 0);
+
+ Contest_CreatePlayerMon(gUnknown_02038694);
+
+ for (i = 0; i < 6; i++)
+ {
+ sub_8003460(&gMenuWindow, gMatsudaDebugMenuTextList1[i],
+ (0xA * i + 0x2A), gMatsudaDebugMenuContestTopLeft[i][0],
+ gMatsudaDebugMenuContestTopLeft[i][1]);
+ }
+
+ gSpecialVar_ContestCategory = gSpecialVar_ContestRank = 0;
+ zero = 0; // it's possible this was some assignment that matsuda used to quickly edit and test things without changing whats passed to the later functions.
+ sub_80AA5BC(zero);
+ sub_80AA5E8(gSpecialVar_ContestRank);
+ sub_8003460(&gMenuWindow, gMatsudaDebugMenu_GoBackText, 0xD6, 0x12, 0x12);
+ sub_8003460(&gMenuWindow, gMatsudaDebugMenu_BattlePointsText, 0xDC, zero, 0xC);
+ LoadSpriteSheet(gUnknown_083C92B4);
+ LoadSpritePalette(gUnknown_083C92BC);
+ sub_80AA280(3);
+ sub_80AA658(3);
+ sub_80AA614(3, zero);
+ spriteId = CreateSprite(&gSpriteTemplate_83C92CC, gUnknown_083C9296[3], gUnknown_083C92A8[1], 5);
+ gSprites[spriteId].data[0] = 1;
+ gSprites[spriteId].data[1] = 1;
+ gSprites[spriteId].data[2] = 3;
+ gSprites[spriteId].data[3] = zero; // only this assignment of zero is necessary. other replacements of 0 with zero do not change the asm, compiler will treat it the same.
+}
+
+void sub_80AA280(u8 var) // no?
+{
+ u8 i;
+
+ FillWindowRect_DefaultPalette(&gMenuWindow, 0, 0, 0, 0x1E, 3);
+ StringCopy(gSharedMem, gMatsudaDebugMenu_StartText);
+ StringAppend(gSharedMem, gContestMons[var].trainerName);
+
+ for (i = 0; i < 4; i++)
+ {
+ if (var == i)
+ sub_8003460(&gMenuWindow, gSharedMem, 10 * i + 2, gUnknown_083C926E[i][0], gUnknown_083C926E[i][1]);
+ else
+ sub_8003460(&gMenuWindow, gContestMons[i].trainerName, 10 * i + 2, gUnknown_083C926E[i][0], gUnknown_083C926E[i][1]);
+ }
+}
+
+static void sub_80AA340(u8 var)
+{
+ ConvertIntToDecimalStringN(gSharedMem, gContestMons[var].cool, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ sub_8003460(&gMenuWindow, gSharedMem, 0x66, gUnknown_083C9282[0], gUnknown_083C9282[1]);
+}
+
+static void sub_80AA388(u8 var)
+{
+ ConvertIntToDecimalStringN(gSharedMem, gContestMons[var].cute, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ sub_8003460(&gMenuWindow, gSharedMem, 0x6C, gUnknown_083C9282[2], gUnknown_083C9282[3]);
+}
+
+static void sub_80AA3D0(u8 var)
+{
+ ConvertIntToDecimalStringN(gSharedMem, gContestMons[var].beauty, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ sub_8003460(&gMenuWindow, gSharedMem, 0x72, gUnknown_083C9282[4], gUnknown_083C9282[5]);
+}
+
+static void sub_80AA418(u8 var)
+{
+ ConvertIntToDecimalStringN(gSharedMem, gContestMons[var].smart, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ sub_8003460(&gMenuWindow, gSharedMem, 0x78, gUnknown_083C9282[6], gUnknown_083C9282[7]);
+}
+
+static void sub_80AA460(u8 var)
+{
+ ConvertIntToDecimalStringN(gSharedMem, gContestMons[var].tough, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ sub_8003460(&gMenuWindow, gSharedMem, 0x7E, gUnknown_083C9282[8], gUnknown_083C9282[9]);
+}
+
+static void sub_80AA4A8(u8 var)
+{
+ ConvertIntToDecimalStringN(gSharedMem, gContestMons[var].sheen, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ sub_8003460(&gMenuWindow, gSharedMem, 0x84, gUnknown_083C9282[10], gUnknown_083C9282[11]);
+}
+
+static void sub_80AA4F0(u8 var1, u8 var2)
+{
+ FillWindowRect_DefaultPalette(&gMenuWindow, 0, gUnknown_083C928E[var2][0], gUnknown_083C928E[var2][1], gUnknown_083C928E[var2][0] + 7, gUnknown_083C928E[var2][1] + 1);
+ sub_8003460(&gMenuWindow, gMoveNames[gContestMons[var1].moves[var2]], 0x8A + var2 * 14, gUnknown_083C928E[var2][0], gUnknown_083C928E[var2][1]);
+ ConvertIntToDecimalStringN(gStringVar1, gContestMons[var1].moves[var2], STR_CONV_MODE_LEADING_ZEROS, 3);
+ sub_8003460(&gMenuWindow, gStringVar1, 0xFA + var2 * 6, gUnknown_083C928E[var2][0] + 7, gUnknown_083C928E[var2][1]);
+}
+
+static void sub_80AA5BC(u8 var)
+{
+ sub_8003460(&gMenuWindow, gMatsudaDebugMenuTextList2[var], 0xC2, 3, 0x12);
+}
+
+void sub_80AA5E8(u8 var)
+{
+ sub_8003460(&gMenuWindow, gMatsudaDebugMenuTextList3[var], 0xE8, 3, 4);
+}
+
+static void sub_80AA614(u8 var1, u8 var2)
+{
+ u16 var = sub_80AE770(var1, var2);
+
+ ConvertIntToDecimalStringN(gSharedMem, var, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ sub_8003460(&gMenuWindow, gSharedMem, 0xE2, 3, 0xC);
+}
+
+void sub_80AA658(u8 var)
+{
+ u8 i;
+
+ sub_80AA340(var);
+ sub_80AA388(var);
+ sub_80AA3D0(var);
+ sub_80AA418(var);
+ sub_80AA460(var);
+ sub_80AA4A8(var);
+
+ for (i = 0; i < 4; i++)
+ sub_80AA4F0(var, i);
+}
+
+void SetDebugMonForContest(void)
+{
+ SetMonData(&gPlayerParty[0], MON_DATA_COOL, &gContestMons[gContestPlayerMonIndex].cool);
+ SetMonData(&gPlayerParty[0], MON_DATA_CUTE, &gContestMons[gContestPlayerMonIndex].cute);
+ SetMonData(&gPlayerParty[0], MON_DATA_BEAUTY, &gContestMons[gContestPlayerMonIndex].beauty);
+ 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, &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)
+{
+ switch (gMain.newAndRepeatedKeys)
+ {
+ case DPAD_RIGHT:
+ case DPAD_LEFT:
+ sprite->data[0] ^= 1;
+ break;
+ case DPAD_UP:
+ if (sprite->data[1] == 0)
+ sprite->data[1] = 8;
+ else
+ sprite->data[1]--;
+ break;
+ case DPAD_DOWN:
+ if (sprite->data[1] == 8)
+ sprite->data[1] = 0;
+ else
+ sprite->data[1]++;
+ break;
+ case A_BUTTON:
+ gUnknown_083C92E4[sprite->data[1]][sprite->data[0]](sprite, 1);
+ sub_80AA614(sprite->data[2], sprite->data[3]);
+ break;
+ case B_BUTTON:
+ gUnknown_083C92E4[sprite->data[1]][sprite->data[0]](sprite, -1);
+ sub_80AA614(sprite->data[2], sprite->data[3]);
+ break;
+ case R_BUTTON:
+ gUnknown_083C92E4[sprite->data[1]][sprite->data[0]](sprite, 10);
+ sub_80AA614(sprite->data[2], sprite->data[3]);
+ break;
+ case L_BUTTON:
+ gUnknown_083C92E4[sprite->data[1]][sprite->data[0]](sprite, -10);
+ sub_80AA614(sprite->data[2], sprite->data[3]);
+ break;
+ case START_BUTTON:
+ sub_80AAD08(sprite, 1);
+ break;
+ }
+ sprite->pos1.x = gUnknown_083C9296[sprite->data[0] + sprite->data[1] * 2];
+ sprite->pos1.y = gUnknown_083C92A8[sprite->data[1]];
+}
+
+static void sub_80AA8A0(struct Sprite *sprite, s8 var1, u8 var2)
+{
+ if (var1 == 1)
+ {
+ sprite->data[2] = var2;
+ sub_80AA280(var2);
+ sub_80AA658(sprite->data[2]);
+ }
+}
+
+void sub_80AA8C8(struct Sprite *sprite, s8 var1)
+{
+ sub_80AA8A0(sprite, var1, 0);
+}
+
+void sub_80AA8D8(struct Sprite *sprite, s8 var1)
+{
+ sub_80AA8A0(sprite, var1, 1);
+}
+
+void sub_80AA8E8(struct Sprite *sprite, s8 var1)
+{
+ sub_80AA8A0(sprite, var1, 2);
+}
+
+void sub_80AA8F8(struct Sprite *sprite, s8 var1)
+{
+ sub_80AA8A0(sprite, var1, 3);
+}
+
+static u8 sub_80AA908(u32 a1, u8 a2, s8 a3) // first param is unused.
+{
+ s16 val = a2 + a3;
+
+ if (val > 255)
+ val = 255;
+ else if (val < 0)
+ val = 0;
+
+ return val;
+}
+
+void sub_80AA930(struct Sprite *sprite, s8 var2)
+{
+ u8 val = sprite->data[2];
+
+ gContestMons[sprite->data[2]].cool = sub_80AA908(val, gContestMons[sprite->data[2]].cool, var2);
+ sub_80AA340(sprite->data[2]);
+}
+
+void sub_80AA974(struct Sprite *sprite, s8 var2)
+{
+ u8 val = sprite->data[2];
+
+ gContestMons[sprite->data[2]].cute = sub_80AA908(val, gContestMons[sprite->data[2]].cute, var2);
+ sub_80AA388(sprite->data[2]);
+}
+
+void sub_80AA9B8(struct Sprite *sprite, s8 var2)
+{
+ u8 val = sprite->data[2];
+
+ gContestMons[sprite->data[2]].beauty = sub_80AA908(val, gContestMons[sprite->data[2]].beauty, var2);
+ sub_80AA3D0(sprite->data[2]);
+}
+
+void sub_80AA9FC(struct Sprite *sprite, s8 var2)
+{
+ u8 val = sprite->data[2];
+
+ gContestMons[sprite->data[2]].smart = sub_80AA908(val, gContestMons[sprite->data[2]].smart, var2);
+ sub_80AA418(sprite->data[2]);
+}
+
+void sub_80AAA40(struct Sprite *sprite, s8 var2)
+{
+ u8 val = sprite->data[2];
+
+ gContestMons[sprite->data[2]].tough = sub_80AA908(val, gContestMons[sprite->data[2]].tough, var2);
+ sub_80AA460(sprite->data[2]);
+}
+
+void sub_80AAA84(struct Sprite *sprite, s8 var2)
+{
+ u8 val = sprite->data[2];
+
+ gContestMons[sprite->data[2]].sheen = sub_80AA908(val, gContestMons[sprite->data[2]].sheen, var2);
+ sub_80AA4A8(sprite->data[2]);
+}
+
+// a similar function is at 0x80AA908, however, it apparently returns the wrong type (u8 vs u16).
+static u16 sub_80AAAC8(u32 a1, u16 a2, s8 a3) // first param is unused.
+{
+ s16 val = a2 + a3;
+
+ if (val > 354)
+ val = 1;
+ else if (val < 0)
+ val = 354;
+
+ return val;
+}
+
+void sub_80AAAF0(struct Sprite *sprite, s8 var2)
+{
+ u8 val = sprite->data[2];
+
+ gContestMons[sprite->data[2]].moves[0] = sub_80AAAC8(val, gContestMons[sprite->data[2]].moves[0], var2);
+ sub_80AA4F0(sprite->data[2], 0);
+}
+
+void sub_80AAB30(struct Sprite *sprite, s8 var2)
+{
+ u8 val = sprite->data[2];
+
+ gContestMons[sprite->data[2]].moves[1] = sub_80AAAC8(val, gContestMons[sprite->data[2]].moves[1], var2);
+ sub_80AA4F0(sprite->data[2], 1);
+}
+
+void sub_80AAB70(struct Sprite *sprite, s8 var2)
+{
+ u8 val = sprite->data[2];
+
+ gContestMons[sprite->data[2]].moves[2] = sub_80AAAC8(val, gContestMons[sprite->data[2]].moves[2], var2);
+ sub_80AA4F0(sprite->data[2], 2);
+}
+
+void sub_80AABB0(struct Sprite *sprite, s8 var2)
+{
+ u8 val = sprite->data[2];
+
+ gContestMons[sprite->data[2]].moves[3] = sub_80AAAC8(val, gContestMons[sprite->data[2]].moves[3], var2);
+ sub_80AA4F0(sprite->data[2], 3);
+}
+
+void sub_80AABF0(struct Sprite *sprite, s8 var2)
+{
+ s8 a = (var2 > 0) ? 1 : -1;
+ s8 r4 = sprite->data[3] + a;
+
+ if (r4 < 0)
+ r4 = 0;
+ else if (r4 > 4)
+ r4 = 4;
+ sub_80AA5BC(r4);
+ sprite->data[3] = r4;
+ gSpecialVar_ContestCategory = sprite->data[3];
+ Contest_InitAllPokemon(sprite->data[3], gSpecialVar_ContestRank);
+ sub_80AA280(sprite->data[2]);
+ sub_80AA658(sprite->data[2]);
+}
+
+void sub_80AAC5C(struct Sprite *sprite, s8 var2)
+{
+ if (var2 > 0)
+ gSpecialVar_ContestRank++;
+ else if (gSpecialVar_ContestRank != 0)
+ gSpecialVar_ContestRank--;
+ if (gSpecialVar_ContestRank > 3)
+ gSpecialVar_ContestRank = 3;
+ sub_80AA5E8(gSpecialVar_ContestRank);
+ Contest_InitAllPokemon(gSpecialVar_ContestCategory, gSpecialVar_ContestRank);
+ sub_80AA280(sprite->data[2]);
+ sub_80AA658(sprite->data[2]);
+}
+
+void sub_80AACC4(void)
+{
+ UpdatePaletteFade();
+ if (!gPaletteFade.active)
+ {
+ SetDebugMonForContest();
+ if (!(gIsLinkContest & 1))
+ sub_80AE82C(eMatsudaDebugVar);
+ SetMainCallback2(CB2_StartContest);
+ }
+}
+
+void sub_80AAD08(struct Sprite *sprite, s8 var2)
+{
+ if (var2 == 1)
+ {
+ eMatsudaDebugVar = sprite->data[3];
+ SetMainCallback2(sub_80AACC4);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ }
+}
+
+void sub_80AAD44(struct Sprite *sprite, s8 var2)
+{
+ if (var2 == 1)
+ {
+ int i;
+
+ SetDebugMonForContest();
+ for (i = 0; i < 4; i++)
+ gUnknown_02038670[i] = sub_80AE770(i, gSpecialVar_ContestCategory);
+ SetMainCallback2(sub_805469C);
+ }
+}
+
+void sub_80AAD84(u8 *string, u8 b, u8 c, u8 d)
+{
+ u16 len;
+ u8 r7;
+ s32 i;
+ u8 sp0[32];
+ u8 sp20[32];
+ u8 str2[2];
+
+ DmaClear32(3, (void *)(VRAM + 0x18000 - (d + 1) * 256), 0x100);
+
+ len = StringLength(string);
+ if (len > 8)
+ len = 8;
+
+ for (i = 0; i < len; i++)
+ {
+ str2[0] = string[i];
+ str2[1] = EOS;
+ sub_80034D4(sp0, str2);
+ DmaCopy32Defvars(3, sp20, (void *)(VRAM + 0x18000 - (d + 1) * 256 + i * 32), sizeof(sp0));
+ }
+
+ r7 = 124 - d * 2;
+
+ gMain.oamBuffer[r7] = gUnknown_083C9400;
+ gMain.oamBuffer[r7].tileNum = 1024 - (d + 1) * 8;
+ gMain.oamBuffer[r7].x = b;
+ gMain.oamBuffer[r7].y = c;
+
+ gMain.oamBuffer[r7 + 1] = gUnknown_083C9400;
+ gMain.oamBuffer[r7 + 1].tileNum = gMain.oamBuffer[r7].tileNum + 4;
+ gMain.oamBuffer[r7 + 1].x = b + 32;
+ gMain.oamBuffer[r7 + 1].y = c;
+}
+
+void unref_sub_80AAEE8(s32 a, u8 b, u8 c, u8 d)
+{
+ u8 string[12];
+ u8 offset = 0;
+
+ if (a < 0)
+ {
+ string[0] = 0xAE;
+ offset = 1;
+ }
+ ConvertIntToDecimalStringN(string + offset, (a < 0) ? -a : a, 0, 8);
+ sub_80AAD84(string, b, c, d);
+}
+
+void sub_80AAF30(void)
+{
+ s32 i;
+
+ gUnknown_0203856C = 1;
+ gContestPlayerMonIndex = 3;
+ Contest_CreatePlayerMon(0);
+
+ for (i = 3; i > -1; i--)
+ gContestFinalStandings[i] = 3 - i;
+
+ for (i = 0; i < 3; i++)
+ {
+ gUnknown_02038670[i] = 0;
+ gUnknown_02038680[i] = 0;
+ gUnknown_02038678[i] = 0;
+ memcpy(&gContestMons[i], &gContestMons[3], sizeof(struct ContestPokemon));
+ }
+
+ gUnknown_02038670[3] = 0x12C;
+ gUnknown_02038680[3] = 0x190;
+ gUnknown_02038678[3] = 0x190;
+ Contest_SaveWinner(0xFE);
+}
+
+u8 MatsudaDebugMenu_SetHighScore(void)
+{
+ sub_80AAF30();
+ CloseMenu();
+ return 1;
+}
+
+u8 MatsudaDebugMenu_ResetHighScore(void)
+{
+ s32 i;
+
+ gUnknown_0203856C = 0;
+ for (i = 0; i < 4; i++)
+ {
+ gUnknown_02038670[i] = 0;
+ gUnknown_02038680[i] = 0;
+ gUnknown_02038678[i] = 0;
+ }
+ CloseMenu();
+ return 1;
+}
+
+u8 MatsudaDebugMenu_SetArtMuseumItems(void)
+{
+ s32 i;
+
+ gContestPlayerMonIndex = 3;
+ Contest_CreatePlayerMon(0);
+ for (i = 3; i > -1; i--)
+ gContestFinalStandings[i] = 3 - i;
+ for (gSpecialVar_ContestCategory = 0; gSpecialVar_ContestCategory < 5; gSpecialVar_ContestCategory++)
+ Contest_SaveWinner(0xFF);
+ CloseMenu();
+ return 1;
+}
+
+void unref_sub_80AB084(u8 *text)
+{
+ u16 savedIme;
+ u8 *addr;
+ size_t size;
+
+ 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_WIN0H = 0;
+ REG_WIN0V = 0;
+ REG_WIN1H = 0;
+ REG_WIN1V = 0;
+ REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON;
+
+ savedIme = REG_IME;
+ REG_IME = 0;
+ REG_IE |= INTR_FLAG_VBLANK;
+ REG_IME = savedIme;
+ REG_DISPSTAT = 8;
+ ResetTasks();
+ ResetSpriteData();
+ SetMainCallback2(sub_80AB184);
+
+ addr = (void *)VRAM;
+ size = 0x18000;
+ while (1)
+ {
+ DmaFill32(3, 0, addr, 0x1000);
+ addr += 0x1000;
+ size -= 0x1000;
+ if (size <= 0x1000)
+ {
+ DmaFill32(3, 0, addr, size);
+ break;
+ }
+ }
+ SetUpWindowConfig(&gWindowConfig_81E6FD8);
+ InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6FD8);
+ LoadFontDefaultPalette(&gWindowConfig_81E6FD8);
+ sub_8003460(&gUnknown_03004210, text, 1, 9, 7);
+}
+
+void sub_80AB184(void)
+{
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BG2HOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG3HOFS = 0;
+ REG_BG3VOFS = 0;
+}
diff --git a/src/mori_debug_menu.c b/src/debug/mori_debug_menu.c
index 4eadaa78b..83dba8b73 100644
--- a/src/mori_debug_menu.c
+++ b/src/debug/mori_debug_menu.c
@@ -16,13 +16,50 @@ extern u8 (*gCallback_03004AE8)(void);
u8 gUnknown_03004DA0[0x20];
-extern u8 gUnknown_0839B22C[][3];
-extern u8 gUnknown_0839B24A[];
-extern u8 gUnknown_0839B24D[];
-extern u8 gUnknown_0839B255[];
-extern u8 gUnknown_0839B257[];
-
-extern const struct MenuAction gMoriDebugMenuActions[];
+const u8 gUnknown_0839B22C[][3] =
+{
+ _(" A"),
+ _(" B"),
+ _("SL"),
+ _("ST"),
+ _("RK"),
+ _("LK"),
+ _("UK"),
+ _("DK"),
+ _("RT"),
+ _("LT"),
+};
+
+const u8 gUnknown_0839B24A[] = _("ND");
+const u8 gUnknown_0839B24D[] = _("の こどもは\n"); // "'s child <topic-particle>"=
+const u8 gUnknown_0839B255[] = _(" ");
+const u8 gUnknown_0839B257[] = _("ながいなまえぽけもん"); // "long name pokemon" (used as test name)
+const u8 Text_39B262[] = _("Search a child");
+const u8 Text_39B271[] = _("Egg");
+const u8 Text_39B275[] = _("Egg (male)");
+const u8 Text_39B280[] = _("1000 steps");
+const u8 Text_39B28B[] = _("10000 steps");
+const u8 Text_39B297[] = _("MOVE TUTOR");
+const u8 Text_39B2A2[] = _("Breed an egg");
+const u8 Text_39B2AF[] = _("Long name");
+#ifdef GERMAN
+const u8 Text_39B2B9[] = _("Delete {POKEBLOCK}");
+#else
+const u8 Text_39B2B9[] = _("ポロックけす");
+#endif
+
+const struct MenuAction gMoriDebugMenuActions[] =
+{
+ {Text_39B262, (u8 (*) (void))MoriDebugMenu_SearchChild}, // ugly cast needed to stop complaints of u8 (*func)() not being compatible with this declaration (TODO: Make MenuAction a Callback union to allow a new definition.)
+ {Text_39B271, MoriDebugMenu_Egg},
+ {Text_39B275, MoriDebugMenu_MaleEgg},
+ {Text_39B280, MoriDebugMenu_1000Steps},
+ {Text_39B28B, MoriDebugMenu_10000Steps},
+ {Text_39B297, MoriDebugMenu_MoveTutor},
+ {Text_39B2A2, MoriDebugMenu_BreedEgg},
+ {Text_39B2AF, MoriDebugMenu_LongName},
+ {Text_39B2B9, MoriDebugMenu_PokeblockCase},
+};
void unref_sub_8083CF0(void)
{
@@ -50,13 +87,13 @@ u8 MoriDebugMenu_SearchChild(u8 a1, u8 a2, u8 *ptr)
{
u8 localPtr[52];
u16 monData;
- u16 var;
+ u16 eggSpecies;
- monData = GetMonData(gPlayerParty, 11, ptr);
- var = sub_8041870(monData);
+ monData = GetMonData(gPlayerParty, MON_DATA_SPECIES, ptr);
+ eggSpecies = GetEggSpecies(monData);
StringCopy(localPtr, gSpeciesNames[monData]);
StringAppend(localPtr, gUnknown_0839B24D);
- StringAppend(localPtr, gSpeciesNames[var]);
+ StringAppend(localPtr, gSpeciesNames[eggSpecies]);
StringAppend(localPtr, gUnknown_0839B255);
MenuZeroFillScreen();
MenuDrawTextWindow(0, 14, 30, 19);
@@ -65,46 +102,46 @@ u8 MoriDebugMenu_SearchChild(u8 a1, u8 a2, u8 *ptr)
return 0;
}
-s8 MoriDebugMenu_Egg(void)
+u8 MoriDebugMenu_Egg(void)
{
- if ( Daycare_CountPokemon(gSaveBlock1.daycareData) == 2 && daycare_relationship_score_from_savegame() )
- sub_8041940();
+ if (CountPokemonInDaycare(&gSaveBlock1.daycare) == 2 && GetDaycareCompatibilityScoreFromSave() )
+ TriggerPendingDaycareEgg();
CloseMenu();
return 1;
}
-s8 MoriDebugMenu_MaleEgg(void)
+u8 MoriDebugMenu_MaleEgg(void)
{
- if ( Daycare_CountPokemon(gSaveBlock1.daycareData) == 2 && daycare_relationship_score_from_savegame() )
- sub_8041950();
+ if (CountPokemonInDaycare(&gSaveBlock1.daycare) == 2 && GetDaycareCompatibilityScoreFromSave() )
+ TriggerPendingDaycareMaleEgg();
CloseMenu();
return 1;
}
-s8 MoriDebugMenu_1000Steps(void)
+u8 MoriDebugMenu_1000Steps(void)
{
- sub_8041790(1000);
+ Debug_AddDaycareSteps(1000);
CloseMenu();
return 1;
}
-s8 MoriDebugMenu_10000Steps(void)
+u8 MoriDebugMenu_10000Steps(void)
{
- sub_8041790(10000);
+ Debug_AddDaycareSteps(10000);
CloseMenu();
return 1;
}
-s8 MoriDebugMenu_MoveTutor(void)
+u8 MoriDebugMenu_MoveTutor(void)
{
- sub_8132670();
+ TeachMoveTutorMove();
CloseMenu();
return 1;
}
-s8 MoriDebugMenu_BreedEgg(void)
+u8 MoriDebugMenu_BreedEgg(void)
{
u8 loopCounter;
@@ -117,19 +154,19 @@ s8 MoriDebugMenu_BreedEgg(void)
SetMonData(&gPlayerParty[loopCounter], MON_DATA_FRIENDSHIP, &friendship);
}
}
- gSaveBlock1.filler_30B6 = -3;
+ gSaveBlock1.daycare.misc.countersEtc.eggCycleStepsRemaining = -3;
CloseMenu();
return 1;
}
-s8 MoriDebugMenu_LongName(void)
+u8 MoriDebugMenu_LongName(void)
{
SetMonData(gPlayerParty, MON_DATA_NICKNAME, gUnknown_0839B257);
CloseMenu();
return 1;
}
-s8 MoriDebugMenu_PokeblockCase(void)
+u8 MoriDebugMenu_PokeblockCase(void)
{
s32 loopCounter;
diff --git a/src/debug/sound_check_menu.c b/src/debug/sound_check_menu.c
new file mode 100644
index 000000000..968b047d9
--- /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 "constants/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/debug/unknown_debug_menu.c b/src/debug/unknown_debug_menu.c
new file mode 100644
index 000000000..a8c3ad16b
--- /dev/null
+++ b/src/debug/unknown_debug_menu.c
@@ -0,0 +1,73 @@
+#include "global.h"
+#include "battle_tower.h"
+#include "menu.h"
+
+extern u8 gBattleCommunication[];
+
+extern u8 (*gCallback_03004AE8)(void);
+
+static u8 sub_814A4B8(void);
+static u8 sub_814A464(void);
+
+const u8 UnknownString_1stRound[] = _("1st round");
+const u8 UnknownString_2ndRound[] = _("2nd round");
+const u8 UnknownString_3rdRound[] = _("3rd round");
+const u8 UnknownString_4thRound[] = _("4th round");
+const u8 UnknownString_5thRound[] = _("5th round");
+const u8 UnknownString_6thRound[] = _("6th round");
+const u8 UnknownString_7thRound[] = _("7th round");
+const u8 UnknownString_8thRound[] = _("8th round");
+
+
+const struct MenuAction gUnknown_0842C29C[] = {
+ {UnknownString_1stRound, sub_814A4B8},
+ {UnknownString_2ndRound, sub_814A4B8},
+ {UnknownString_3rdRound, sub_814A4B8},
+ {UnknownString_4thRound, sub_814A4B8},
+ {UnknownString_5thRound, sub_814A4B8},
+ {UnknownString_6thRound, sub_814A4B8},
+ {UnknownString_7thRound, sub_814A4B8},
+ {UnknownString_8thRound, sub_814A4B8}
+};
+
+int unref_sub_814A414(void)
+{
+ MenuZeroFillScreen();
+ MenuDrawTextWindow(0, 0, 16, 18);
+ PrintMenuItems(2, 1, 8, gUnknown_0842C29C);
+ InitMenu(0, 1, 1, 8, 0, 15);
+ gCallback_03004AE8 = sub_814A464;
+ return 0;
+}
+
+static u8 sub_814A464(void)
+{
+ s8 result = ProcessMenuInput();
+ if (result == -2)
+ {
+ return 0;
+ }
+ else if (result == -1)
+ {
+ CloseMenu();
+ return 1;
+ }
+ else
+ {
+ gBattleCommunication[0] = result;
+ gCallback_03004AE8 = gUnknown_0842C29C[result].func;
+ return 0;
+ }
+}
+
+static u8 sub_814A4B8(void)
+{
+ 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/easy_chat.c b/src/easy_chat.c
deleted file mode 100644
index cca8c1355..000000000
--- a/src/easy_chat.c
+++ /dev/null
@@ -1,442 +0,0 @@
-#include "global.h"
-#include "easy_chat.h"
-#include "data2.h"
-#include "event_data.h"
-#include "field_message_box.h"
-#include "pokedex.h"
-#include "rng.h"
-#include "string_util.h"
-#include "strings.h"
-#include "strings2.h"
-#include "text.h"
-
-static bool8 sub_80EB680(u16 *, u16, u16, u16);
-static u16 sub_80EB9D8(void);
-static u16 sub_80EB960(void);
-
-extern void *gEasyChatGroupWords[];
-extern const u8 gEasyChatGroupSizes[];
-
-extern u16 gSpecialVar_0x8004;
-
-
-u8 *sub_80EB3FC(u8 *dst, u16 word)
-{
- u16 group;
- u16 wordIndex;
- u8 *src;
- u16 i;
-
- if (sub_80EB37C(word))
- return StringCopy(dst, gOtherText_ThreeQuestions);
-
- if (word == 0xFFFF)
- {
- dst[0] = EOS;
- return dst;
- }
- else
- {
- group = word >> 9;
- wordIndex = word & 0x1FF;
- switch (group)
- {
- case EC_GROUP_POKEMON: // 0
- case EC_GROUP_POKEMON_2: // 21
- dst = StringCopy(dst, gSpeciesNames[wordIndex]);
- break;
- case EC_GROUP_MOVE_1: // 18
- case EC_GROUP_MOVE_2: // 19
- dst = StringCopy(dst, gMoveNames[wordIndex]);
- break;
- default:
- src = gEasyChatGroupWords[group];
- for (i = wordIndex - 1; i != 0xFFFF; i--)
- {
- while (*src++ != EOS)
- ;
- }
- dst = StringCopy(dst, src);
- break;
- }
- dst[0] = EOS;
- return dst;
- }
-}
-
-u8 *ConvertEasyChatWordsToString(u8 *dst, u16 *words, u16 arg2, u16 arg3)
-{
- u16 i;
- u16 n;
-
- const u16 i1 = arg2 - 1;
-
- for (i = 0; i < arg3; i++)
- {
- u16 word;
-
- for (n = 0; n < i1; n++)
- {
- dst = sub_80EB3FC(dst, words[0]);
-
- if (words[0] != 0xFFFF)
- {
- dst[0] = CHAR_SPACE;
- dst++;
- }
-
- words++;
- }
-
- word = words[0];
- words++;
- dst = sub_80EB3FC(dst, word);
-
- dst[0] = CHAR_NEWLINE;
- dst++;
- }
-
- dst--;
- dst[0] = EOS;
-
- return dst;
-}
-
-u8 *sub_80EB544(u8 *dst, u16 *words, u16 arg2, u16 arg3)
-{
- u16 i;
- u16 n;
-
- const u16 i1 = arg2 - 1;
-
- for (i = 0; i < arg3; i++)
- {
- u16 word;
-
- for (n = 0; n < i1; n++)
- {
- dst = sub_80EB3FC(dst, words[0]);
-
- if (words[0] != 0xFFFF)
- {
- dst[0] = CHAR_SPACE;
- dst++;
- }
-
- words++;
- }
-
- word = words[0];
- words++;
- dst = sub_80EB3FC(dst, word);
-
- // Only difference with ConvertEasyChatWordsToString
- dst[0] = (i == 0) ? CHAR_NEWLINE : CHAR_PROMPT_SCROLL;
- dst++;
- }
-
- dst--;
- dst[0] = EOS;
-
- return dst;
-}
-
-
-u16 unref_sub_80EB5E0(u16 arg0)
-{
- u8 *chars;
- u16 i;
- u16 length;
- int group, word;
-
-
- if (arg0 == 0xFFFF)
- return 0;
-
- group = arg0 >> 9;
- word = arg0 & 0x1FF;
- switch (group)
- {
- case EC_GROUP_POKEMON: // 0
- case EC_GROUP_POKEMON_2: // 21
- chars = (u8 *) gSpeciesNames[word];
- break;
- case EC_GROUP_MOVE_1: // 18
- case EC_GROUP_MOVE_2: // 19
- chars = gMoveNames[word];
- break;
- default:
- chars = gEasyChatGroupWords[group];
- for (i = word - 1; i != 0xFFFF; i--)
- {
- while (*chars++ != EOS)
- ;
- }
- break;
- }
-
- length = 0;
- while (*chars != EOS)
- {
- chars++;
- length++;
- }
-
- return length;
-}
-
-static bool8 sub_80EB680(u16 *arg0, u16 arg1, u16 arg2, u16 arg3)
-{
- return FALSE;
-}
-
-void unref_sub_80EB684(u8 arg0, u16 arg1)
-{
- u16 *ptr;
- u16 c;
-
- // FIXME: find actual tv shows used
- switch (arg0)
- {
- case 5:
- c = 6;
- ptr = (u16*)((void *)&gSaveBlock1.tvShows[arg1] + 0x04);
- break;
- case 7:
- c = 2;
- ptr = (u16*)((void *)&gSaveBlock1.tvShows[arg1] + 0x1C);
- break;
- case 8:
- c = 1;
- ptr = (u16*)((void *)&gSaveBlock1.tvShows[arg1] + 0x02);
- break;
- default:
- return;
- }
-
- c -= 1;
- while (c != 0xFFFF)
- {
- *ptr = -1;
- ptr++;
- c -= 1;
- }
-}
-
-void sub_80EB6FC(u16 *arg0, u16 arg1)
-{
- u16 i;
-
- for (i = arg1 - 1; i != 0xFFFF; i--)
- {
- *arg0 = 0xFFFF;
- arg0++;
- }
-
-}
-
-u16 sub_80EB72C(u16 group)
-{
- u16 local1 = Random() % gEasyChatGroupSizes[group];
-
- if (group == EC_GROUP_POKEMON
- || group == EC_GROUP_POKEMON_2
- || group == EC_GROUP_MOVE_1
- || group == EC_GROUP_MOVE_2)
- {
- local1 = ((u16 *) gEasyChatGroupWords[group])[local1];
- }
-
- return ((group & 0x7F) << 9) | (local1 & 0x1FF);
-}
-
-u16 sub_80EB784(u16 group)
-{
- if (!sub_80EAD7C(group))
- return -1;
-
- if (group != EC_GROUP_POKEMON)
- {
- if (group == EC_GROUP_TRENDY_SAYING)
- return sub_80EB960();
- }
- else
- {
- return sub_80EB9D8();
- }
-
- return sub_80EB72C(group);
-}
-
-void sub_80EB7C4(void)
-{
- u16 *words;
- u16 arg1, arg2;
-
- switch (gSpecialVar_0x8004)
- {
- case 0:
- words = gSaveBlock1.unk2B1C;
- arg1 = 2;
- arg2 = 2;
- break;
- case 1:
- words = gSaveBlock1.unk2B28;
- if (sub_80EB680(gSaveBlock1.unk2B28, 3, 2, 20))
- {
- arg1 = 2;
- arg2 = 3;
- }
- else
- {
- arg1 = 3;
- arg2 = 2;
- }
- break;
- case 2:
- words = gSaveBlock1.unk2B34;
- arg1 = 3;
- arg2 = 2;
- break;
- case 3:
- words = gSaveBlock1.unk2B40;
- arg1 = 3;
- arg2 = 2;
- break;
- default:
- return;
- }
-
- ConvertEasyChatWordsToString(gStringVar4, words, arg1, arg2);
- ShowFieldAutoScrollMessage(gStringVar4);
-}
-
-void sub_80EB83C(void)
-{
- u16 group, local2;
-
- if (Random() & 1)
- group = EC_GROUP_HOBBIES;
- else
- group = EC_GROUP_LIFESTYLE;
-
- local2 = sub_80EB784(group);
- sub_80EB3FC(gStringVar2, local2);
-}
-
-u8 sub_80EB868(u8 arg0)
-{
- int offset;
- int index;
-
- index = arg0 / 8;
- offset = arg0 % 8;
- return (gSaveBlock1.unk2D8C[index] >> offset) & 1;
-}
-
-void sub_80EB890(u8 arg0)
-{
- int offset;
- int index;
-
- if (arg0 < 33)
- {
- index = arg0 / 8;
- offset = arg0 % 8;
- gSaveBlock1.unk2D8C[index] |= 1 << offset;
- }
-}
-
-u8 sub_80EB8C0(void)
-{
- u8 i, count;
-
- for (i = 0, count = 0; i < 33; i++)
- {
- if (sub_80EB868(i))
- count++;
- }
- return count;
-}
-
-u16 sub_80EB8EC(void)
-{
- u16 i;
- u16 local1, local2;
-
- local1 = sub_80EB8C0();
- if (local1 == 33)
- return -1;
-
- local2 = Random() % (33 - local1);
- for (i = 0; i < 33; i++)
- {
- if (sub_80EB868(i) == 0)
- {
- if (local2 == 0)
- {
- sub_80EB890(i);
- return (i & 0x1FF) | 0x2800;
- }
- local2--;
- }
- }
- return -1;
-}
-
-static u16 sub_80EB960(void)
-{
- u16 i;
- u16 local1;
-
- local1 = sub_80EB8C0();
- if (local1 == 0)
- return -1;
-
- local1 = Random() % local1;
- for (i = 0; i < 33; i++)
- {
- if (sub_80EB868(i))
- {
- if (local1 == 0)
- return (i & 0x1FF) | 0x2800;
- local1--;
- }
- }
-
- return -1;
-}
-
-u8 sub_80EB9C8(void)
-{
- return IsNationalPokedexEnabled();
-}
-
-static u16 sub_80EB9D8(void)
-{
- u16 *speciesList;
- u16 local1;
- u16 i;
-
- local1 = sub_80EAE88(0);
-
- if (local1 == 0)
- return -1;
-
- local1 = Random() % local1;
- speciesList = (u16 *) gEasyChatGroupWords[EC_GROUP_POKEMON];
- for (i = 0; i < gEasyChatGroupSizes[EC_GROUP_POKEMON]; i++)
- {
- const u16 dexNum = SpeciesToNationalPokedexNum(*speciesList);
- const u8 local2 = GetNationalPokedexFlag(dexNum, 0);
-
- if (local2)
- {
- if (local1 == 0)
- return *speciesList & 0x1FF;
- local1--;
- }
- speciesList++;
- }
- return -1;
-}
diff --git a/src/easy_chat_1.c b/src/easy_chat_1.c
new file mode 100644
index 000000000..e5b6cf7c3
--- /dev/null
+++ b/src/easy_chat_1.c
@@ -0,0 +1,1742 @@
+#include "global.h"
+#include "constants/easy_chat.h"
+#include "constants/songs.h"
+#include "constants/species.h"
+#include "dewford_trend.h"
+#include "easy_chat.h"
+#include "event_data.h"
+#include "ewram.h"
+#include "graphics.h"
+#include "main.h"
+#include "menu.h"
+#include "palette.h"
+#include "sound.h"
+#include "sprite.h"
+#include "string_util.h"
+#include "strings.h"
+#include "unknown_task.h"
+
+extern const struct WindowConfig gWindowConfig_81E6D54;
+extern const struct WindowConfig gWindowConfig_81E6DA8;
+
+extern void sub_80546B8(void);
+
+const u16 gMysteryEventPhrase[] = {EC_WORD_MYSTERY, EC_WORD_EVENT, EC_WORD_IS, EC_WORD_EXCITING};
+
+const u16 gBerryMasterWifePhrases[][2] =
+{
+#if ENGLISH
+ {EC_WORD_GREAT, EC_WORD_BATTLE},
+ {EC_WORD_CHALLENGE, EC_WORD_CONTEST},
+ {EC_WORD_OVERWHELMING, EC_POKEMON(LATIAS)},
+ {EC_WORD_COOL, EC_POKEMON(LATIOS)},
+ {EC_WORD_SUPER, EC_WORD_HUSTLE},
+#else
+ {EC_WORD_GREAT, EC_WORD_FIGHT},
+ {EC_WORD_CONTEST, EC_WORD_CHALLENGE},
+ {EC_POKEMON(LATIAS), EC_WORD_OVERWHELMING},
+ {EC_POKEMON(LATIOS), EC_WORD_COOL},
+ {EC_WORD_SUPER, 0xFFFF},
+#endif
+};
+
+// const pointer to gEasyChatStruct-> easy_chat might be two separate files.
+struct Shared1000 *const gEasyChatStruct = (struct Shared1000 *)(gSharedMem + 0x1000);
+
+const struct UnknownTaskStruct gUnknown_083DB698 =
+{
+ &REG_BG3VOFS,
+ ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1,
+ 1
+};
+
+const u8 gUnknown_083DB6A4[] = {4, 0, 0, 0, 1, 5, 0, 2, 2, 3, 2, 2, 2, 3};
+
+// choose by alphabet keyboard
+const u8 gUnknown_083DB6B2[][16] =
+{
+ _("ABCDEF "),
+ _("GHIJKL"),
+ _("MNOPQRS"),
+ _("TUVWXYZ"),
+};
+
+struct EasyChatPrompt
+{
+ const u8 *text1;
+ const u8 *text2;
+ bool8 unk8;
+};
+
+const struct EasyChatPrompt gUnknown_083DB6F4[] =
+{
+ {OtherText_MakeProfilePage1, OtherText_MakeProfilePage2, TRUE},
+ {OtherText_MakeMessagePage1, OtherText_MakeMessagePage2, TRUE},
+ {OtherText_CombineNinePhrasesPage1, OtherText_CombineNinePhrasesPage2, TRUE},
+ {OtherText_DescribeFeelingsPage1, OtherText_DescribeFeelingsPage2, TRUE},
+ {OtherText_ImproveBardSongPage1, OtherText_ImproveBardSongPage2, TRUE},
+ {OtherText_CombineTwoPhrasesPage1, OtherText_CombineTwoPhrasesPage2, TRUE},
+ {OtherText_YourProfile, OtherText_ConfirmTrendyPage2, FALSE},
+ {OtherText_YourFeelingBattle, OtherText_ConfirmTrendyPage2, TRUE},
+ {OtherText_SetWinMessage, OtherText_ConfirmTrendyPage2, TRUE},
+ {OtherText_SetLossMessage, OtherText_ConfirmTrendyPage2, TRUE},
+ {OtherText_MailMessage, OtherText_ConfirmTrendyPage2, TRUE},
+ {OtherText_MailSalutation, OtherText_ConfirmTrendyPage2, TRUE},
+ {OtherText_NewSong, OtherText_ConfirmTrendyPage2, FALSE},
+ {OtherText_TheAnswer, OtherText_ConfirmTrendyPage2, FALSE},
+ {OtherText_ConfirmTrendyPage1, OtherText_ConfirmTrendyPage2, TRUE},
+ {OtherText_HipsterPage1, OtherText_HipsterPage2, TRUE},
+ {OtherText_WithFourPhrases, OtherText_CombineNinePhrasesPage2, TRUE},
+};
+
+const u8 gUnknown_083DB7C0[][2] =
+{
+ { 0, 6},
+ { 1, 7},
+ { 1, 8},
+ { 1, 9},
+ { 2, 10},
+ {16, 13},
+ { 4, 12},
+ { 3, 13},
+ { 3, 13},
+ { 5, 14},
+ { 3, 13},
+ { 3, 13},
+ { 3, 13},
+ {15, 13},
+};
+
+void sub_80E62F8(void);
+void sub_80E6424(void);
+void sub_80E6554(void);
+void sub_80E6630(void);
+void sub_80E6690(void);
+void sub_80E682C(void (*)(void));
+void sub_80E69F8(void);
+void sub_80E6A6C(void);
+void sub_80E6A88(void);
+void sub_80E6AA8(void);
+void sub_80E6AC4(void);
+void sub_80E6AE4(void);
+void sub_80E6BC0(void);
+void sub_80E6C84(void);
+void sub_80E6D7C(void);
+void sub_80E6F68(void);
+void sub_80E6FC8(void);
+void sub_80E7114(void);
+void sub_80E718C(void);
+void sub_80E7218(void);
+void sub_80E7294(void);
+void sub_80E7324(void);
+void sub_80E73D0(void);
+void sub_80E7458(void);
+void sub_80E752C(void);
+void sub_80E7574(void);
+bool8 sub_80E75D8(void);
+bool8 sub_80E77C8(void);
+void sub_80E7A98(void);
+void sub_80E7AD4(void);
+bool8 sub_80E7B40(void);
+void sub_80E7D30(void);
+void sub_80E7D6C(void);
+void sub_80E7D9C(void);
+bool8 sub_80E7DD0(void);
+void sub_80E7E50(void);
+void sub_80E7F00(u16, u16);
+u8 sub_80E7FA8(void);
+bool8 sub_80E8054(void);
+u8 sub_80E8094(void);
+u8 sub_80E810C(void);
+void sub_80E81C0(void);
+void sub_80E81FC(void);
+void sub_80E8218(void);
+
+void sub_80E8398();
+void sub_80E8420(void);
+void sub_80E8504(void);
+void sub_80E87CC();
+
+void sub_80E88F0(void);
+void sub_80E8958();
+
+void sub_80E8BF4();
+void sub_80E8CEC(void);
+void sub_80E8D54(void);
+void sub_80E8D8C();
+void sub_80E8DD8(void);
+void sub_80E91D4();
+void sub_80E9368();
+void sub_80E95A4(void);
+void sub_80E9744(void);
+void sub_80E98C4(void);
+void sub_80E9974(void);
+void sub_80E9A14(void);
+void sub_80E9A4C(void);
+void sub_80E9AD4(void);
+void sub_80E9C94(void);
+void sub_80E9D00(void);
+void sub_80E9D7C(void);
+void sub_80E9E08();
+bool8 sub_80E9E54(void);
+void sub_80E9E98(void);
+u8 sub_80E9EA8(void);
+u8 sub_80E9F50(void);
+u8 sub_80E9FD4(void);
+u8 sub_80EA014(void);
+u8 sub_80EA050(void);
+u8 sub_80EA0E4(void);
+u8 sub_80EA184(void);
+void sub_80EAC5C(void);
+void sub_80EAD08(void);
+u8 sub_80EAD7C(u8);
+void sub_80EAECC(void);
+void LoadEasyChatStrings(void);
+void sub_80EB0B0(void);
+u8 *sub_80EB218(u8 *, u16, u16);
+u16 sub_80EB2D4();
+bool8 sub_80EB680(u16 *, u16, u16, u16);
+
+void sub_80E60D8(void)
+{
+ u8 r4 = 3;
+ u16 *r1;
+
+ switch (gSpecialVar_0x8004)
+ {
+ case 0:
+ r1 = gSaveBlock1.easyChats.unk2B1C;
+ break;
+ case 1:
+ r1 = gSaveBlock1.easyChats.unk2B28;
+ break;
+ case 2:
+ r1 = gSaveBlock1.easyChats.unk2B34;
+ break;
+ case 3:
+ r1 = gSaveBlock1.easyChats.unk2B40;
+ break;
+ case 4:
+ r1 = gSaveBlock1.mail[gSpecialVar_0x8005].words;
+ break;
+ case 6:
+ {
+ struct MauvilleManBard *bard = &gSaveBlock1.mauvilleMan.bard;
+ u16 i;
+ for (i = 0; i < 6; i++)
+ bard->temporaryLyrics[i] = bard->songLyrics[i];
+ r1 = bard->temporaryLyrics;
+ }
+ break;
+ case 5:
+ // TODO: Is this the right TV show?
+ r1 = gSaveBlock1.tvShows[gSpecialVar_0x8005].fanclubLetter.pad04;
+ r4 = gSpecialVar_0x8006;
+ break;
+ case 7:
+ // TODO: Is this the right TV show?
+ r1 = &gSaveBlock1.tvShows[gSpecialVar_0x8005].fanclubOpinions.var1C[gSpecialVar_0x8006];
+ r4 = 1;
+ break;
+ case 8:
+ // TODO: Is this the right TV show?
+ r1 = &gSaveBlock1.tvShows[gSpecialVar_0x8005].fanclubOpinions.var02;
+ r4 = 0;
+ break;
+ case 9:
+ r1 = NULL;
+ break;
+ case 10:
+ r1 = &gSaveBlock1.gabbyAndTyData.quote;
+ *r1 = 0xFFFF;
+ r4 = 1;
+ break;
+ case 11:
+ // TODO: Is this the right TV show?
+ r1 = &gSaveBlock1.tvShows[gSpecialVar_0x8005].bravoTrainer.var04[gSpecialVar_0x8006];
+ r4 = 0;
+ break;
+ case 12:
+ // TODO: Is this the right TV show?
+ r1 = gSaveBlock1.tvShows[gSpecialVar_0x8005].bravoTrainerTower.var18;
+ r4 = 1;
+ break;
+ case 13:
+ gEasyChatStruct->unk9C7C = 0xFFFF;
+ gEasyChatStruct->unk9C7E = -1;
+ r1 = &gEasyChatStruct->unk9C7C;
+ break;
+ default:
+ return;
+ }
+ sub_80E62A0(gSpecialVar_0x8004, r1, sub_80546B8, r4);
+}
+
+void sub_80E62A0(u8 a, u16 *b, void (*c)(void), u8 d)
+{
+ gEasyChatStruct->unk0 = c;
+ gEasyChatStruct->unk4 = b;
+ gEasyChatStruct->unk8 = a;
+ gEasyChatStruct->unkB = d;
+ if (a == 9)
+ {
+ gEasyChatStruct->unk4 = &gEasyChatStruct->unk9C7C;
+ gEasyChatStruct->unk9C7C = gSaveBlock1.easyChatPairs[0].words[0];
+ gEasyChatStruct->unk9C7E = gSaveBlock1.easyChatPairs[0].words[1];
+ }
+ SetMainCallback2(sub_80E62F8);
+}
+
+void sub_80E62F8(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ default:
+ REG_DISPCNT = 0;
+ SetVBlankCallback(0);
+ ResetPaletteFade();
+ ResetSpriteData();
+ dp12_8087EA4();
+ remove_some_task();
+ sub_80EAD08();
+ sub_80895F8(gUnknown_083DB698);
+ FreeSpriteTileRanges();
+ FreeAllSpritePalettes();
+ break;
+ case 1:
+ SetUpWindowConfig(&gWindowConfig_81E6DA8);
+ break;
+ case 2:
+ InitMenuWindow(&gWindowConfig_81E6D54);
+ InitMenuWindow(&gWindowConfig_81E6DA8);
+ MenuZeroFillScreen();
+ break;
+ case 3:
+ sub_80E6424();
+ break;
+ case 4:
+ sub_80E8DD8();
+ break;
+ case 5:
+ sub_80E8218();
+ sub_80E8CEC();
+ break;
+ case 6:
+ sub_80E69F8();
+ sub_80E682C(sub_80E6AA8);
+ SetVBlankCallback(sub_80E6A6C);
+ break;
+ case 7:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
+ break;
+ case 8:
+ REG_DISPCNT = 0x1F40;
+ SetMainCallback2(sub_80E6A88);
+ FlagSet(FLAG_SYS_CHAT_USED);
+ break;
+ }
+ gMain.state++;
+}
+
+void sub_80E6424(void)
+{
+ gEasyChatStruct->unk9 = gUnknown_083DB6A4[gEasyChatStruct->unk8];
+ switch (gEasyChatStruct->unk9)
+ {
+ case 4:
+ gEasyChatStruct->unkA = 4;
+ gEasyChatStruct->unk83 = 2;
+ gEasyChatStruct->unk84 = 2;
+ gEasyChatStruct->unk88 = 5;
+ gEasyChatStruct->unk8A = 4;
+ break;
+ case 5:
+ gEasyChatStruct->unkA = 4;
+ gEasyChatStruct->unk83 = 1;
+ gEasyChatStruct->unk84 = 4;
+ gEasyChatStruct->unk88 = 16;
+ gEasyChatStruct->unk8A = 2;
+ break;
+ case 0:
+ gEasyChatStruct->unkA = 6;
+ gEasyChatStruct->unk83 = 2;
+ gEasyChatStruct->unk84 = 3;
+ gEasyChatStruct->unk88 = 4;
+ gEasyChatStruct->unk8A = 3;
+ break;
+ case 1:
+ gEasyChatStruct->unkA = 9;
+ gEasyChatStruct->unk83 = 2;
+ gEasyChatStruct->unk84 = 5;
+ gEasyChatStruct->unk88 = 4;
+ gEasyChatStruct->unk8A = 0;
+ break;
+ case 2:
+ gEasyChatStruct->unkA = 1;
+ gEasyChatStruct->unk83 = 1;
+ gEasyChatStruct->unk84 = 1;
+ gEasyChatStruct->unk88 = 16;
+ gEasyChatStruct->unk8A = 4;
+ break;
+ case 3:
+ gEasyChatStruct->unkA = 2;
+ gEasyChatStruct->unk83 = 2;
+ gEasyChatStruct->unk84 = 1;
+ gEasyChatStruct->unk88 = 5;
+ gEasyChatStruct->unk8A = 3;
+ break;
+ }
+ gEasyChatStruct->unk86 = 0;
+ gEasyChatStruct->unk85 = 0;
+ gEasyChatStruct->unk87 = 0;
+ gEasyChatStruct->unk26 = 0;
+ gEasyChatStruct->unk1BA = 0;
+ gEasyChatStruct->unk1BE = 2;
+ sub_80E6554();
+ sub_80EAECC();
+ LoadEasyChatStrings();
+ sub_80E7E50();
+ sub_80E6630();
+ sub_80E6690();
+}
+
+void sub_80E6554(void)
+{
+ u16 r4 = 0;
+ u16 r7;
+ u16 r5;
+
+ for (r7 = 0; ; r7++)
+ {
+ for (r5 = 0; r5 < 2; r5++)
+ {
+ gEasyChatStruct->unk2A[r7][r5] = r4++;
+ if (r4 == 17)
+ break;
+ }
+ if (r4 == 17)
+ break;
+ }
+ gEasyChatStruct->unk28 = 17;
+ while (r4 < 22)
+ {
+ if (sub_80EAD7C(r4) != 0)
+ {
+ r5++;
+ if (r5 > 1)
+ {
+ r7++;
+ r5 = 0;
+ }
+ gEasyChatStruct->unk2A[r7][r5] = r4;
+ gEasyChatStruct->unk78[r4 - 17] = 1; // hmm...
+ gEasyChatStruct->unk28++;
+ }
+ else
+ {
+ gEasyChatStruct->unk78[r4 - 17] = 0;
+ }
+ r4++;
+ }
+ gEasyChatStruct->unk1B6 = (gEasyChatStruct->unk28 + 1) / 2;
+}
+
+void sub_80E6630(void)
+{
+ u8 i;
+ u8 r3;
+
+ for (i = 0; i < 4; i++)
+ {
+ const u8 *row = gUnknown_083DB6B2[i];
+
+ for (r3 = 0; row[r3] != EOS; r3++)
+ {
+ if (row[r3] != CHAR_SPACE)
+ gEasyChatStruct->unk40[i][r3] = row[r3] + 0x46;
+ else
+ gEasyChatStruct->unk40[i][r3] = CHAR_SPACE;
+ }
+ }
+}
+
+void sub_80E6690(void)
+{
+ u8 *pointers[] =
+ {
+ gEasyChatStruct->unk9C80, gEasyChatStruct->unk9CC9,
+ gEasyChatStruct->unk9D12, gEasyChatStruct->unk9D5B,
+ };
+ u8 *r3;
+ u16 i;
+
+ for (i = 0; i < 2; i++)
+ {
+ const struct EasyChatPrompt *prompt = &gUnknown_083DB6F4[gUnknown_083DB7C0[gEasyChatStruct->unk8][i]];
+
+ r3 = StringCopy(pointers[i * 2 + 0], prompt->text1);
+ if (prompt->unk8)
+ {
+ StringCopy(pointers[i * 2 + 1], prompt->text2);
+ }
+ else
+ {
+ *r3++ = CHAR_SPACE;
+ StringCopy(r3, prompt->text2);
+ *pointers[i * 2 + 1] = EOS;
+ }
+ }
+
+ for (i = 0; i < 0x24; i++)
+ gEasyChatStruct->unk9DA4[i] = 0;
+ gEasyChatStruct->unk9DA4[i] = 0xFF;
+
+ r3 = gEasyChatStruct->unk9F6E;
+ r3[0] = EXT_CTRL_CODE_BEGIN;
+ r3[1] = 0x11;
+ r3[2] = 0xE0;
+ r3[3] = 0xFF;
+}
+
+// Default profile phrase
+const u16 gUnknown_083DB7EC[] =
+{
+#if ENGLISH
+ EC_WORD_I_AM,
+ EC_WORD_A,
+ EC_WORD_POKEMON,
+ EC_WORD_GREAT,
+#else
+ EC_WORD_I_AM,
+ EC_WORD_BIG,
+ EC_WORD_IN,
+ EC_WORD_POKEMON,
+#endif
+};
+
+const u16 gUnknown_083DB7F4[] =
+{
+ EC_WORD_ARE,
+ EC_WORD_YOU,
+ EC_WORD_READY,
+ EC_WORD_QUES,
+ EC_WORD_HERE_I_COME,
+ EC_WORD_EXCL,
+};
+
+// ResetDefaultEasyChatPhrases
+void InitEasyChatPhrases(void)
+{
+ u16 i;
+ u16 j;
+
+ for (i = 0; i < 4; i++)
+ gSaveBlock1.easyChats.unk2B1C[i] = gUnknown_083DB7EC[i];
+
+ for (i = 0; i < 6; i++)
+ gSaveBlock1.easyChats.unk2B28[i] = gUnknown_083DB7F4[i];
+
+ for (i = 0; i < 6; i++)
+ {
+ gSaveBlock1.easyChats.unk2B34[i] = 0xFFFF;
+ gSaveBlock1.easyChats.unk2B40[i] = 0xFFFF;
+ }
+
+ for (i = 0; i < 16; i++)
+ {
+ for (j = 0; j < 9; j++)
+ gSaveBlock1.mail[i].words[j] = 0xFFFF;
+ }
+
+ for (i = 0; i < 64; i++)
+ gSaveBlock1.unk2D8C[i] = 0;
+}
+
+void sub_80E682C(void (*func)(void))
+{
+ gEasyChatStruct->unk20 = func;
+ gEasyChatStruct->unk24 = 0;
+}
+
+void sub_80E683C(void)
+{
+ u16 i;
+
+ if (gEasyChatStruct->unk26 == 0)
+ {
+ for (i = 0; i < gEasyChatStruct->unk1B6; i++)
+ gEasyChatStruct->unk1AA[i] = 2;
+ gEasyChatStruct->unk1AA[i - 1] = gEasyChatStruct->unk28 % 2;
+ if (gEasyChatStruct->unk1AA[i - 1] == 0)
+ gEasyChatStruct->unk1AA[i - 1] = 2;
+ }
+ else
+ {
+ gEasyChatStruct->unk1AA[0] = 7;
+ gEasyChatStruct->unk1AA[1] = 6;
+ gEasyChatStruct->unk1AA[2] = 7;
+ gEasyChatStruct->unk1AA[3] = 7;
+ }
+ gEasyChatStruct->unk1A8 = 0;
+ gEasyChatStruct->unk1A9 = 0;
+ gEasyChatStruct->unk1B5 = 0;
+ gEasyChatStruct->unk1B7 = 0;
+ sub_80E9A4C();
+}
+
+void sub_80E68E8(void)
+{
+ sub_80EB0B0();
+ if (gEasyChatStruct->unk26 == 0)
+ {
+ u16 i;
+ u8 r6;
+
+ r6 = gEasyChatStruct->unk1B8;
+ gEasyChatStruct->unk9A28 = (gEasyChatStruct->unk4178[r6] + 1) / 2;
+ for (i = 0; i < gEasyChatStruct->unk9A28; i++)
+ gEasyChatStruct->unk99A6[i] = 2;
+ i--;
+ gEasyChatStruct->unk99A6[i] = gEasyChatStruct->unk4178[r6] % 2;
+ if (gEasyChatStruct->unk99A6[i] == 0)
+ gEasyChatStruct->unk99A6[i] = 2;
+ }
+ else
+ {
+ u16 i;
+ u8 r6;
+
+ r6 = gEasyChatStruct->unk1B8;
+ gEasyChatStruct->unk9A28 = (gEasyChatStruct->unk4142[r6] + 1) / 2;
+ for (i = 0; i < gEasyChatStruct->unk9A28; i++)
+ gEasyChatStruct->unk99A6[i] = 2;
+ i--;
+ gEasyChatStruct->unk99A6[i] = gEasyChatStruct->unk4142[r6] % 2;
+ if (gEasyChatStruct->unk99A6[i] == 0)
+ gEasyChatStruct->unk99A6[i] = 2;
+ }
+ gEasyChatStruct->unk99A4 = 0;
+ gEasyChatStruct->unk99A5 = 0;
+ gEasyChatStruct->unk9A29 = 0;
+ sub_80E9A4C();
+}
+
+void sub_80E69F8(void)
+{
+ switch (gEasyChatStruct->unk8)
+ {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 6:
+ case 9:
+ case 13:
+ default:
+ sub_80E9368(gEasyChatStruct->unk8);
+ break;
+ case 5:
+ case 7:
+ case 8:
+ case 10:
+ case 11:
+ case 12:
+ sub_80E9368(gEasyChatStruct->unk8);
+ sub_80E8BF4(gEasyChatStruct->unkB, gEasyChatStruct->unk9);
+ break;
+ }
+}
+
+void sub_80E6A6C(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ sub_80EAC5C();
+ TransferPlttBuffer();
+ sub_8089668();
+}
+
+void sub_80E6A88(void)
+{
+ gEasyChatStruct->unk20();
+ AnimateSprites();
+ BuildOamBuffer();
+ sub_80EAD08();
+}
+
+void sub_80E6AA8(void)
+{
+ if (!UpdatePaletteFade())
+ sub_80E682C(sub_80E6AC4);
+}
+
+void sub_80E6AC4(void)
+{
+ sub_80E88F0();
+ sub_80E8398(0);
+ sub_80E91D4(0);
+ sub_80E682C(sub_80E6AE4);
+}
+
+void sub_80E6AE4(void)
+{
+ gEasyChatStruct->unk87 = sub_80E75D8();
+ if (gEasyChatStruct->unk87)
+ PlaySE(SE_SELECT);
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ if (gEasyChatStruct->unk86 == gEasyChatStruct->unk84)
+ {
+ switch (gEasyChatStruct->unk85)
+ {
+ case 0:
+ sub_80E682C(sub_80E6BC0);
+ return;
+ case 1:
+ sub_80E682C(sub_80E6C84);
+ return;
+ case 2:
+ sub_80E682C(sub_80E6D7C);
+ return;
+ }
+ }
+ else
+ {
+ gEasyChatStruct->unk27 = gEasyChatStruct->unk86 * gEasyChatStruct->unk83 + gEasyChatStruct->unk85;
+ sub_80E7574();
+ sub_80E682C(sub_80E6F68);
+ return;
+ }
+ }
+ if (gMain.newKeys & B_BUTTON)
+ {
+ sub_80E682C(sub_80E6C84);
+ }
+}
+
+void sub_80E6BC0(void)
+{
+ switch (gEasyChatStruct->unk24)
+ {
+ case 0:
+ sub_80E8398(2);
+ if (gEasyChatStruct->unk8 == 6)
+ {
+ sub_80E91D4(6);
+ gEasyChatStruct->unk24 = 100;
+ }
+ else
+ {
+ sub_80E91D4(2);
+ DisplayYesNoMenu(23, 8, 1);
+ MoveMenuCursor(1);
+ gEasyChatStruct->unk24++;
+ }
+ break;
+ case 1:
+ switch (ProcessMenuInputNoWrap_())
+ {
+ case 0:
+ sub_80E7D6C();
+ sub_80E98C4();
+ sub_80E95A4();
+ gEasyChatStruct->unk24++;
+ break;
+ case -1:
+ case 1:
+ gEasyChatStruct->unk24++;
+ break;
+ }
+ break;
+ case 2:
+ sub_80E81FC();
+ sub_80E682C(sub_80E6AC4);
+ break;
+ case 100:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ sub_80E682C(sub_80E6AC4);
+ break;
+ }
+}
+
+void sub_80E6C84(void)
+{
+ switch (gEasyChatStruct->unk24)
+ {
+ case 0:
+ sub_80E8398(2);
+ sub_80E91D4(3);
+ DisplayYesNoMenu(23, 8, 0);
+ MoveMenuCursor(1);
+ if (gEasyChatStruct->unk8 == 9
+ || gEasyChatStruct->unk8 == 4
+ || gEasyChatStruct->unk8 == 7
+ || gEasyChatStruct->unk8 == 8
+ || gEasyChatStruct->unk8 == 10
+ || gEasyChatStruct->unk8 == 11
+ || gEasyChatStruct->unk8 == 12
+ || gEasyChatStruct->unk8 == 5
+ || gEasyChatStruct->unk8 == 13)
+ gEasyChatStruct->unk24 = 2;
+ else
+ gEasyChatStruct->unk24++;
+ break;
+ case 1:
+ switch (ProcessMenuInputNoWrap_())
+ {
+ case 0:
+ sub_80E91D4(4);
+ DisplayYesNoMenu(23, 8, 0);
+ MoveMenuCursor(1);
+ gEasyChatStruct->unk24++;
+ break;
+ case -1:
+ case 1:
+ gEasyChatStruct->unk24 = 0xFF;
+ break;
+ }
+ break;
+ case 2:
+ switch (ProcessMenuInputNoWrap_())
+ {
+ case 0:
+ gSpecialVar_Result = 0;
+ sub_80E682C(sub_80E752C);
+ break;
+ case -1:
+ case 1:
+ gEasyChatStruct->unk24 = 0xFF;
+ break;
+ }
+ break;
+ case 0xFF:
+ HandleDestroyMenuCursors();
+ sub_80E81FC();
+ sub_80E682C(sub_80E6AC4);
+ break;
+ }
+}
+
+void sub_80E6D7C(void)
+{
+ switch (gEasyChatStruct->unk24)
+ {
+ case 0:
+ sub_80E8398(2);
+ if (sub_80E8054())
+ {
+ sub_80E91D4(5);
+ gEasyChatStruct->unk24 = 10;
+ break;
+ }
+ if (gEasyChatStruct->unk8 == 9)
+ {
+ if (sub_80E7FA8() == 0)
+ {
+ sub_80E91D4(8);
+ gEasyChatStruct->unk24 = 10;
+ break;
+ }
+ if (gEasyChatStruct->unkC[0] == 0xFFFF || gEasyChatStruct->unkC[1] == 0xFFFF)
+ {
+ sub_80E91D4(9);
+ gEasyChatStruct->unk24 = 10;
+ break;
+ }
+ }
+ if (gEasyChatStruct->unk8 == 4 && sub_80E7FA8() == 0)
+ {
+ sub_80E682C(sub_80E6C84);
+ }
+ else
+ {
+ sub_80E91D4(1);
+ sub_80E9744();
+ DisplayYesNoMenu(23, 8, 0);
+ MoveMenuCursor(0);
+ gEasyChatStruct->unk24++;
+ }
+ break;
+ case 1:
+ switch (ProcessMenuInputNoWrap_())
+ {
+ case 0:
+ gSpecialVar_Result = (sub_80E7FA8() != 0);
+ sub_80E7D9C();
+ if (gEasyChatStruct->unk8 == 0)
+ gSpecialVar_0x8004 = sub_80E8094();
+ if (gEasyChatStruct->unk8 == 9) // dewford trend?
+ {
+ sub_80E81C0();
+ gSpecialVar_0x8004 = sub_80FA364(&gEasyChatStruct->unk9C7C);
+ }
+ if (gEasyChatStruct->unk8 == 13)
+ {
+ if (gEasyChatStruct->unkC[0] == 0xFFFF || gEasyChatStruct->unkC[1] == 0xFFFF)
+ gSpecialVar_Result = 0;
+ gSpecialVar_0x8004 = sub_80E810C();
+ }
+ sub_80E682C(sub_80E752C);
+ break;
+ case -1:
+ case 1:
+ HandleDestroyMenuCursors();
+ sub_80E81FC();
+ if (gEasyChatStruct->unk8 == 6 && sub_80E7FA8() != 0)
+ {
+ gEasyChatStruct->unk24 = 100;
+ }
+ else
+ {
+ sub_80E95A4();
+ sub_80E682C(sub_80E6AC4);
+ }
+ break;
+ }
+ break;
+ case 10:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ sub_80E682C(sub_80E6AC4);
+ break;
+ case 100:
+ sub_80E91D4(7);
+ gEasyChatStruct->unk24++;
+ // fall through
+ case 101:
+ if (gMain.newKeys & A_BUTTON)
+ gEasyChatStruct->unk24++;
+ break;
+ case 102:
+ sub_80E7E50();
+ sub_80E95A4();
+ sub_80E682C(sub_80E6AC4);
+ break;
+ }
+}
+
+void sub_80E6F68(void)
+{
+ switch (gEasyChatStruct->unk24)
+ {
+ case 0:
+ sub_80E8398(1);
+ sub_80E91D4(10);
+ sub_80E683C();
+ sub_80E9974();
+ sub_80E9E98();
+ gEasyChatStruct->unk24++;
+ break;
+ case 1:
+ if (sub_80E9EA8() != 0)
+ {
+ sub_80E8D8C(1);
+ sub_80E8420();
+ sub_80E8958(0);
+ sub_80E682C(sub_80E6FC8);
+ }
+ break;
+ }
+}
+
+void sub_80E6FC8(void)
+{
+ gEasyChatStruct->unk96 = sub_80E77C8();
+ if (gEasyChatStruct->unk1C0 != 0)
+ {
+ PlaySE(SE_SELECT);
+ gEasyChatStruct->unk1C4 = sub_80E6FC8;
+ sub_80E682C(sub_80E7458);
+ }
+ else
+ {
+ if (gEasyChatStruct->unk96)
+ PlaySE(SE_SELECT);
+ if (gMain.newKeys & A_BUTTON)
+ {
+ if (gEasyChatStruct->unk1B7 != 0)
+ {
+ PlaySE(SE_SELECT);
+ switch (gEasyChatStruct->unk1A8)
+ {
+ case 1:
+ sub_80E682C(sub_80E718C);
+ break;
+ case 2:
+ if (gEasyChatStruct->unk8 != 6)
+ {
+ sub_80E7F00(gEasyChatStruct->unk27, 0xFFFF);
+ sub_80E7574();
+ sub_80E95A4();
+ }
+ break;
+ case 3:
+ sub_80E682C(sub_80E7114);
+ break;
+ }
+ }
+ else
+ {
+ if (gEasyChatStruct->unk26 == 0
+ || gEasyChatStruct->unk4142[gEasyChatStruct->unk40[gEasyChatStruct->unk1A8][gEasyChatStruct->unk1A9]] != 0)
+ {
+ PlaySE(SE_SELECT);
+ sub_80E7AD4();
+ sub_80E682C(sub_80E7218);
+ }
+ }
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ sub_80E682C(sub_80E7114);
+ }
+ else if (gMain.newKeys & SELECT_BUTTON)
+ {
+ sub_80E682C(sub_80E718C);
+ }
+ }
+}
+
+void sub_80E7114(void)
+{
+ switch (gEasyChatStruct->unk24)
+ {
+ case 0:
+ sub_80E8504();
+ sub_80E9E98();
+ sub_80E88F0();
+ sub_80E8D8C(0);
+ gEasyChatStruct->unk24++;
+ break;
+ case 1:
+ case 2:
+ gEasyChatStruct->unk24++;
+ break;
+ case 3:
+ if (sub_80E9F50() != 0)
+ gEasyChatStruct->unk24++;
+ break;
+ case 4:
+ sub_80E682C(sub_80E6AC4);
+ break;
+ }
+}
+
+void sub_80E718C(void)
+{
+ switch (gEasyChatStruct->unk24)
+ {
+ case 0:
+ sub_80E8504();
+ sub_80E9E98();
+ sub_80E88F0();
+ gEasyChatStruct->unk24++;
+ sub_80E8D54();
+ break;
+ case 1:
+ if (sub_80E9FD4() != 0)
+ {
+ gEasyChatStruct->unk26 = !gEasyChatStruct->unk26;
+ sub_80E683C();
+ sub_80E9974();
+ sub_80E9E98();
+ gEasyChatStruct->unk24++;
+ }
+ break;
+ default:
+ gEasyChatStruct->unk24++;
+ break;
+ case 8:
+ if (sub_80EA014() != 0)
+ {
+ sub_80E8420();
+ sub_80E8958(0);
+ sub_80E682C(sub_80E6FC8);
+ }
+ break;
+ }
+}
+
+void sub_80E7218(void)
+{
+ switch (gEasyChatStruct->unk24)
+ {
+ default:
+ gEasyChatStruct->unk24++;
+ break;
+ case 8:
+ sub_80E8D8C(0);
+ sub_80E8504();
+ sub_80E9AD4();
+ sub_80E68E8();
+ sub_80E88F0();
+ sub_80E9E98();
+ gEasyChatStruct->unk24++;
+ break;
+ case 9:
+ if (sub_80EA050() != 0)
+ {
+ sub_80E9C94();
+ gEasyChatStruct->unk24++;
+ }
+ break;
+ case 10:
+ sub_80E87CC(1);
+ sub_80E8958(1);
+ sub_80E682C(sub_80E7294);
+ break;
+ case 11:
+ break;
+ }
+}
+
+void sub_80E7294(void)
+{
+ gEasyChatStruct->unk1B9 = sub_80E7B40();
+ if (gEasyChatStruct->unk1C0 != 0)
+ {
+ PlaySE(SE_SELECT);
+ gEasyChatStruct->unk1C4 = sub_80E7294;
+ sub_80E682C(sub_80E7458);
+ }
+ else
+ {
+ if (gEasyChatStruct->unk1B9)
+ PlaySE(SE_SELECT);
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_80E682C(sub_80E7324);
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ sub_80E682C(sub_80E73D0);
+ }
+ }
+}
+
+void sub_80E7324(void)
+{
+ switch (gEasyChatStruct->unk24)
+ {
+ case 0:
+ if (!sub_80E7DD0())
+ {
+ sub_80E682C(sub_80E7294);
+ }
+ else
+ {
+ sub_80E88F0();
+ sub_80E87CC(0);
+ gEasyChatStruct->unk24++;
+ }
+ break;
+ case 1:
+ gEasyChatStruct->unk24++;
+ break;
+ case 2:
+ sub_80E9E98();
+ gEasyChatStruct->unk24++;
+ break;
+ case 3:
+ if (sub_80EA184() != 0)
+ gEasyChatStruct->unk24++;
+ break;
+ case 4:
+ if (gEasyChatStruct->unk8 == 6 && sub_80E7FA8() != 0)
+ sub_80E682C(sub_80E6D7C);
+ else
+ sub_80E682C(sub_80E6AC4);
+ break;
+ }
+}
+
+void sub_80E73D0(void)
+{
+ switch (gEasyChatStruct->unk24)
+ {
+ case 0:
+ sub_80E87CC(0);
+ sub_80E88F0();
+ gEasyChatStruct->unk24++;
+ break;
+ case 1:
+ sub_80E9AD4();
+ sub_80E9E98();
+ gEasyChatStruct->unk24++;
+ break;
+ case 2:
+ if (sub_80EA0E4() != 0)
+ {
+ sub_80E8D8C(1);
+ sub_80E9A14();
+ gEasyChatStruct->unk24++;
+ }
+ break;
+ case 3:
+ sub_80E8420();
+ sub_80E8958(0);
+ gEasyChatStruct->unk24++;
+ break;
+ case 4:
+ sub_80E9974();
+ sub_80E682C(sub_80E6FC8);
+ break;
+ }
+}
+
+void sub_80E7458(void)
+{
+ switch (gEasyChatStruct->unk24)
+ {
+ case 0:
+ if (gEasyChatStruct->unk1C4 == sub_80E6FC8)
+ sub_80E9D7C();
+ else
+ sub_80E9D00();
+ sub_80E9E08(gEasyChatStruct->unk1BE);
+ gEasyChatStruct->unk24++;
+ break;
+ case 1:
+ if (sub_80E9E54())
+ {
+ if (gEasyChatStruct->unk1C4 == sub_80E6FC8)
+ {
+ sub_80E9D7C();
+ gEasyChatStruct->unk1B5 += gEasyChatStruct->unk1C0;
+ sub_80E7A98();
+ gEasyChatStruct->unk96 = TRUE;
+ }
+ else
+ {
+ gEasyChatStruct->unk9A29 += gEasyChatStruct->unk1C0;
+ sub_80E7D30();
+ gEasyChatStruct->unk1B9 = 1;
+ }
+ gEasyChatStruct->unk1BE = 2;
+ sub_80E682C(gEasyChatStruct->unk1C4);
+ }
+ break;
+ }
+}
+
+void sub_80E752C(void)
+{
+ switch (gEasyChatStruct->unk24)
+ {
+ case 0:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ gEasyChatStruct->unk24++;
+ break;
+ case 1:
+ if (!UpdatePaletteFade())
+ SetMainCallback2(gEasyChatStruct->unk0);
+ break;
+ }
+}
+
+void sub_80E7574(void)
+{
+ if (gEasyChatStruct->unk8 == 1
+ && gEasyChatStruct->unk7E[gEasyChatStruct->unk86] == 2
+ && sub_80EB2D4(gEasyChatStruct->unkC[gEasyChatStruct->unk27]) != 7)
+ gEasyChatStruct->unk7D = 1;
+ else
+ gEasyChatStruct->unk7D = 0;
+ gEasyChatStruct->unk7D = 0; // What the hell?
+}
+
+bool8 sub_80E75D8(void)
+{
+ bool8 pressedUpDown = FALSE;
+ u8 r0;
+
+ if (gMain.newKeys & START_BUTTON)
+ {
+ gEasyChatStruct->unk86 = gEasyChatStruct->unk84;
+ gEasyChatStruct->unk85 = 2;
+ return TRUE;
+ }
+
+ if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ gEasyChatStruct->unk86--;
+ if (gEasyChatStruct->unk86 < 0)
+ gEasyChatStruct->unk86 = gEasyChatStruct->unk84;
+ pressedUpDown = TRUE;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ gEasyChatStruct->unk86++;
+ if (gEasyChatStruct->unk86 > gEasyChatStruct->unk84)
+ gEasyChatStruct->unk86 = 0;
+ pressedUpDown = TRUE;
+ }
+
+ if (pressedUpDown)
+ {
+ if (gEasyChatStruct->unk9 == 2)
+ {
+ if (gEasyChatStruct->unk86 == gEasyChatStruct->unk84)
+ gEasyChatStruct->unk85 = 2;
+ else
+ gEasyChatStruct->unk85 = 0;
+ return TRUE;
+ }
+ else
+ {
+ if (gEasyChatStruct->unk85 >= gEasyChatStruct->unk83)
+ gEasyChatStruct->unk85 = gEasyChatStruct->unk83 - 1;
+ if (gEasyChatStruct->unk86 != gEasyChatStruct->unk84)
+ {
+ r0 = gEasyChatStruct->unk86 * gEasyChatStruct->unk83 + gEasyChatStruct->unk85;
+ if (r0 >= gEasyChatStruct->unkA)
+ gEasyChatStruct->unk85 = r0 - gEasyChatStruct->unkA;
+ }
+ return TRUE;
+ }
+ }
+ else
+ {
+ if (gMain.newAndRepeatedKeys & DPAD_LEFT)
+ {
+ if (--gEasyChatStruct->unk85 < 0)
+ {
+ if (gEasyChatStruct->unk86 == gEasyChatStruct->unk84)
+ {
+ gEasyChatStruct->unk85 = 2;
+ }
+ else
+ {
+ gEasyChatStruct->unk85 = gEasyChatStruct->unk83 - 1;
+ r0 = gEasyChatStruct->unk86 * gEasyChatStruct->unk83 + gEasyChatStruct->unk85;
+ if (r0 >= gEasyChatStruct->unkA)
+ gEasyChatStruct->unk85 = r0 - gEasyChatStruct->unkA;
+ }
+ }
+ return TRUE;
+ }
+ if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
+ {
+ if (gEasyChatStruct->unk86 == gEasyChatStruct->unk84)
+ {
+ if (++gEasyChatStruct->unk85 > 2)
+ gEasyChatStruct->unk85 = 0;
+ }
+ else
+ {
+ if (++gEasyChatStruct->unk85 >= gEasyChatStruct->unk83)
+ gEasyChatStruct->unk85 = 0;
+ r0 = gEasyChatStruct->unk86 * gEasyChatStruct->unk83 + gEasyChatStruct->unk85;
+ if (r0 >= gEasyChatStruct->unkA)
+ gEasyChatStruct->unk85 = r0 - gEasyChatStruct->unkA;
+ }
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+bool8 sub_80E77C8(void)
+{
+ bool8 pressedLeftRight = FALSE;
+ bool8 pressedUpDown;
+
+ if (gEasyChatStruct->unk1B7 != 0)
+ {
+ if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ gEasyChatStruct->unk1A8--;
+ if (gEasyChatStruct->unk1A8 < 1)
+ gEasyChatStruct->unk1A8 = 3;
+ return TRUE;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ gEasyChatStruct->unk1A8++;
+ if (gEasyChatStruct->unk1A8 > 3)
+ gEasyChatStruct->unk1A8 = 1;
+ return TRUE;
+ }
+ }
+ else
+ {
+ if (gEasyChatStruct->unk26 == 1)
+ {
+ pressedUpDown = FALSE;
+
+ if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ gEasyChatStruct->unk1A8--;
+ if (gEasyChatStruct->unk1A8 < 0)
+ gEasyChatStruct->unk1A8 = 3;
+ pressedUpDown = TRUE;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ gEasyChatStruct->unk1A8++;
+ if (gEasyChatStruct->unk1A8 > 3)
+ gEasyChatStruct->unk1A8 = 0;
+ pressedUpDown = TRUE;
+ }
+
+ if (pressedUpDown)
+ {
+ sub_80E7A98();
+ return TRUE;
+ }
+ }
+ else
+ {
+ pressedUpDown = FALSE;
+ gEasyChatStruct->unk1C0 = 0;
+
+ if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ if (gEasyChatStruct->unk1A8 == 0)
+ return FALSE;
+ gEasyChatStruct->unk1A8--;
+ if (gEasyChatStruct->unk1A8 < gEasyChatStruct->unk1B5)
+ gEasyChatStruct->unk1C0 = -1;
+ pressedUpDown = TRUE;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ if (gEasyChatStruct->unk1A8 >= gEasyChatStruct->unk1B6 - 1)
+ return FALSE;
+ gEasyChatStruct->unk1A8++;
+ if (gEasyChatStruct->unk1A8 > gEasyChatStruct->unk1B5 + 3)
+ gEasyChatStruct->unk1C0 = 1;
+ pressedUpDown = TRUE;
+ }
+
+ if (pressedUpDown)
+ {
+ if (gEasyChatStruct->unk1C0 == 0)
+ {
+ sub_80E7A98();
+ return TRUE;
+ }
+ return FALSE;
+ }
+ }
+ }
+
+ if (gMain.newAndRepeatedKeys & DPAD_LEFT)
+ {
+ if (gEasyChatStruct->unk1A9 != 0)
+ gEasyChatStruct->unk1A9--;
+ else
+ gEasyChatStruct->unk1A9 = gEasyChatStruct->unk1AA[gEasyChatStruct->unk1A8];
+ pressedLeftRight = TRUE;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
+ {
+ if (gEasyChatStruct->unk1B7 != 0
+ || gEasyChatStruct->unk1A9 == gEasyChatStruct->unk1AA[gEasyChatStruct->unk1A8])
+ gEasyChatStruct->unk1A9 = 0;
+ else
+ gEasyChatStruct->unk1A9++;
+ pressedLeftRight = TRUE;
+ }
+
+ if (pressedLeftRight)
+ {
+ s8 r9 = gEasyChatStruct->unk1B7;
+
+ gEasyChatStruct->unk1B7 = (gEasyChatStruct->unk1A9 == gEasyChatStruct->unk1AA[gEasyChatStruct->unk1A8]);
+ if (gEasyChatStruct->unk1B7 != 0)
+ {
+ gEasyChatStruct->unk1A8 -= gEasyChatStruct->unk1B5;
+ if (gEasyChatStruct->unk1A8 == 0)
+ {
+ gEasyChatStruct->unk1A8 = 1;
+ gEasyChatStruct->unk1A9 = gEasyChatStruct->unk1AA[gEasyChatStruct->unk1A8];
+ }
+ }
+ else if (r9 != 0)
+ {
+ gEasyChatStruct->unk1A8 += gEasyChatStruct->unk1B5;
+ if (gEasyChatStruct->unk1A9 != 0)
+ gEasyChatStruct->unk1A9 = gEasyChatStruct->unk1AA[gEasyChatStruct->unk1A8] - 1;
+ }
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void sub_80E7A98(void)
+{
+ if (gEasyChatStruct->unk1A9 >= gEasyChatStruct->unk1AA[gEasyChatStruct->unk1A8])
+ gEasyChatStruct->unk1A9 = gEasyChatStruct->unk1AA[gEasyChatStruct->unk1A8] - 1;
+}
+
+void sub_80E7AD4(void)
+{
+ if (gEasyChatStruct->unk26 == 0)
+ gEasyChatStruct->unk1B8 = gEasyChatStruct->unk2A[gEasyChatStruct->unk1A8][gEasyChatStruct->unk1A9];
+ else
+ gEasyChatStruct->unk1B8 = gEasyChatStruct->unk40[gEasyChatStruct->unk1A8][gEasyChatStruct->unk1A9];
+}
+
+bool8 sub_80E7B40(void)
+{
+ bool8 pressedUpDown = FALSE;
+
+ gEasyChatStruct->unk1C0 = 0;
+ if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ if (gEasyChatStruct->unk99A4 == 0)
+ return FALSE;
+ gEasyChatStruct->unk99A4--;
+ if (gEasyChatStruct->unk99A4 < gEasyChatStruct->unk9A29)
+ {
+ gEasyChatStruct->unk1C0 = -1;
+ return FALSE;
+ }
+ pressedUpDown = TRUE;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ if (gEasyChatStruct->unk99A4 >= gEasyChatStruct->unk9A28 - 1)
+ return FALSE;
+ gEasyChatStruct->unk99A4++;
+ if (gEasyChatStruct->unk99A4 >= gEasyChatStruct->unk9A29 + 4)
+ {
+ gEasyChatStruct->unk1C0 = 1;
+ return FALSE;
+ }
+ pressedUpDown = TRUE;
+ }
+
+ if (pressedUpDown)
+ {
+ sub_80E7D30();
+ return TRUE;
+ }
+
+ if (gMain.newAndRepeatedKeys & DPAD_LEFT)
+ {
+ gEasyChatStruct->unk99A5--;
+ if (gEasyChatStruct->unk99A5 < 0)
+ gEasyChatStruct->unk99A5 = gEasyChatStruct->unk99A6[gEasyChatStruct->unk99A4] - 1;
+ return TRUE;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
+ {
+ gEasyChatStruct->unk99A5++;
+ if (gEasyChatStruct->unk99A5 >= gEasyChatStruct->unk99A6[gEasyChatStruct->unk99A4])
+ gEasyChatStruct->unk99A5 = 0;
+ return TRUE;
+ }
+
+ if (gMain.newKeys & START_BUTTON)
+ {
+ if (gEasyChatStruct->unk9A29 != 0)
+ {
+ gEasyChatStruct->unk1C0 = -gEasyChatStruct->unk9A29;
+ if (gEasyChatStruct->unk1C0 < -4)
+ gEasyChatStruct->unk1C0 = -4;
+ }
+ gEasyChatStruct->unk99A4 += gEasyChatStruct->unk1C0;
+ gEasyChatStruct->unk1BE = 4;
+ }
+ else if (gMain.newKeys & SELECT_BUTTON)
+ {
+ if (gEasyChatStruct->unk9A29 < gEasyChatStruct->unk9A28 - 4)
+ {
+ gEasyChatStruct->unk1C0 = gEasyChatStruct->unk9A28 - 4 - gEasyChatStruct->unk9A29;
+ if (gEasyChatStruct->unk1C0 > 4)
+ gEasyChatStruct->unk1C0 = 4;
+ }
+ gEasyChatStruct->unk99A4 += gEasyChatStruct->unk1C0;
+ gEasyChatStruct->unk1BE = 4;
+ }
+
+ return FALSE;
+}
+
+void sub_80E7D30(void)
+{
+ if (gEasyChatStruct->unk99A5 >= gEasyChatStruct->unk99A6[gEasyChatStruct->unk99A4])
+ gEasyChatStruct->unk99A5 = gEasyChatStruct->unk99A6[gEasyChatStruct->unk99A4] - 1;
+}
+
+void sub_80E7D6C(void)
+{
+ u16 i;
+
+ for (i = 0; i < gEasyChatStruct->unkA; i++)
+ sub_80E7F00(i, 0xFFFF);
+}
+
+void sub_80E7D9C(void)
+{
+ u16 i;
+
+ for (i = 0; i < gEasyChatStruct->unkA; i++)
+ gEasyChatStruct->unk4[i] = gEasyChatStruct->unkC[i];
+}
+
+bool8 sub_80E7DD0(void)
+{
+ u16 r4 = gEasyChatStruct->unk9A2A[gEasyChatStruct->unk99A4][gEasyChatStruct->unk99A5];
+
+ if (gEasyChatStruct->unk7D != 0
+ && gEasyChatStruct->unk7E[gEasyChatStruct->unk86] > 1
+ && sub_80EB2D4(r4) == 7)
+ return FALSE;
+
+ sub_80E7F00(gEasyChatStruct->unk27, r4);
+ sub_80E95A4();
+ return TRUE;
+}
+
+void sub_80E7E50(void)
+{
+ u16 r5 = 0;
+ u16 i;
+ u16 j;
+
+ for (i = 0; i < gEasyChatStruct->unk84; i++)
+ {
+ gEasyChatStruct->unk7E[i] = 0;
+ for (j = 0; j < gEasyChatStruct->unk83; j++)
+ {
+ gEasyChatStruct->unkC[r5] = gEasyChatStruct->unk4[r5];
+ gEasyChatStruct->unk8C[i][j] = 0;
+ r5++;
+ }
+ }
+}
+
+void sub_80E7F00(u16 a, u16 b)
+{
+ u16 r5 = a / gEasyChatStruct->unk83;
+ u16 r8 = a % gEasyChatStruct->unk83;
+ u16 r4 = sub_80EB2D4(gEasyChatStruct->unkC[a]);
+ u16 r3 = sub_80EB2D4(b);
+
+ if (r4 == 7)
+ {
+ if (r3 != 7)
+ gEasyChatStruct->unk7E[r5]--;
+ }
+ else
+ {
+ if (r3 == 7)
+ gEasyChatStruct->unk7E[r5]++;
+ }
+ r3 = 0;
+ gEasyChatStruct->unk8C[r5][r8] = r3;
+ gEasyChatStruct->unkC[a] = b;
+}
+
+u8 sub_80E7FA8(void)
+{
+ u16 r8 = 0;
+ u16 i;
+ u8 *r1;
+ u8 *r2;
+
+ for (i = 0; i < gEasyChatStruct->unkA; i++)
+ {
+ sub_80EB218(gEasyChatStruct->unk9E14, gEasyChatStruct->unk4[i], 0);
+ sub_80EB218(gEasyChatStruct->unk9E41, gEasyChatStruct->unkC[i], 0);
+ r1 = gEasyChatStruct->unk9E14;
+ r2 = gEasyChatStruct->unk9E41;
+ while (*r1 == *r2 && *r1 != 0xFF)
+ {
+ r1++;
+ r2++;
+ }
+ if (*r1 != *r2)
+ r8++;
+ }
+ return r8;
+}
+
+bool8 sub_80E8054(void)
+{
+ u16 i;
+
+ for (i = 0; i < gEasyChatStruct->unkA; i++)
+ {
+ if (gEasyChatStruct->unkC[i] != 0xFFFF)
+ return FALSE;
+ }
+ return TRUE;
+}
+
+// CheckMysteryEventPhrase
+bool8 sub_80E8094(void)
+{
+ u16 i;
+ u8 *r3;
+ u8 *r4;
+
+ for (i = 0; i < 4; i++)
+ {
+ sub_80EB218(gEasyChatStruct->unk9E14, gEasyChatStruct->unkC[i], 0);
+ sub_80EB218(gEasyChatStruct->unk9E41, gMysteryEventPhrase[i], 0);
+ r3 = gEasyChatStruct->unk9E14;
+ r4 = gEasyChatStruct->unk9E41;
+ while (*r3 != 0xFF && *r4 != 0xFF)
+ {
+ if (*r3++ != *r4++)
+ return FALSE;
+ }
+ if (*r3 != 0xFF || *r4 != 0xFF)
+ return FALSE;
+ }
+ return TRUE;
+}
+
+u8 sub_80E810C(void)
+{
+ u16 i;
+
+ for (i = 0; i < 5; i++)
+ {
+ u8 *ptr;
+ u8 *r3;
+
+ ptr = sub_80EB218(gEasyChatStruct->unk9E6E, gEasyChatStruct->unkC[0], 0);
+ *ptr++ = CHAR_SPACE;
+ sub_80EB218(ptr, gEasyChatStruct->unkC[1], 0);
+
+ ptr = sub_80EB218(gEasyChatStruct->unk9EEE, gBerryMasterWifePhrases[i][0], 0);
+ *ptr++ = CHAR_SPACE;
+ sub_80EB218(ptr, gBerryMasterWifePhrases[i][1], 0);
+
+ ptr = gEasyChatStruct->unk9E6E;
+ r3 = gEasyChatStruct->unk9EEE;
+ while (*ptr != EOS && *r3 != EOS)
+ {
+ if (*ptr++ != *r3++)
+ break;
+ }
+ if (*ptr == EOS && *r3 == EOS)
+ return i + 1;
+ }
+ return 0;
+}
+
+void sub_80E81C0(void)
+{
+ u8 *ptr;
+
+ ptr = sub_80EB218(gStringVar2, gEasyChatStruct->unk9C7C, 0);
+ *ptr++ = CHAR_SPACE;
+ sub_80EB218(ptr, gEasyChatStruct->unk9C7E, 0);
+}
+
+void sub_80E81FC(void)
+{
+ PlaySE(SE_SELECT);
+ sub_80E95A4();
+ MenuZeroFillWindowRect(0, 0, 29, 13);
+}
diff --git a/src/easy_chat_2.c b/src/easy_chat_2.c
new file mode 100644
index 000000000..fe3aa7cc9
--- /dev/null
+++ b/src/easy_chat_2.c
@@ -0,0 +1,3034 @@
+#include "global.h"
+#include "constants/easy_chat.h"
+#include "constants/map_objects.h"
+#include "data2.h"
+#include "decompress.h"
+#include "easy_chat.h"
+#include "event_data.h"
+#include "field_map_obj.h"
+#include "field_message_box.h"
+#include "graphics.h"
+#include "menu.h"
+#include "palette.h"
+#include "pokedex.h"
+#include "random.h"
+#include "sprite.h"
+#include "string_util.h"
+#include "strings.h"
+#include "strings2.h"
+#include "trig.h"
+#include "unknown_task.h"
+
+extern void sub_8095C8C();
+extern void sub_809D104(void *, u16, u16, const void *, u16, u16, u16, u16);
+
+void sub_80E8268(void);
+void sub_80E82BC(struct Sprite *);
+void sub_80E8534(void);
+void sub_80E85F8(struct Sprite *);
+void sub_80E872C(struct Sprite *);
+void sub_80E8760(struct Sprite *);
+void sub_80E8818(void);
+void sub_80E8860(struct Sprite *);
+void sub_80E8A7C(void);
+void sub_80E8B78(struct Sprite *);
+void sub_80E8FA4(void);
+void sub_80E9198(u8);
+void sub_80E91D4(u8);
+void sub_80E948C(void);
+void sub_80E95A4(void);
+void sub_80E9620(u16, u16);
+void sub_80E97C0(u16, u16);
+void sub_80E9A4C(void);
+void sub_80E9A60(const u8 *, u16, u16);
+void sub_80E9A7C(u8 *, u16);
+void sub_80E9AD4(void);
+void sub_80E9C74(u16);
+u8 sub_80EA1E0(void);
+void sub_80EA24C(void);
+void sub_80EA348(void);
+void sub_80EA4A4(void);
+void sub_80EA5A0(void);
+void sub_80EA704(void);
+void sub_80EA764(void);
+void sub_80EA7F4(void);
+void sub_80EA8BC(void);
+void sub_80EA948(void);
+void sub_80EAA44(void);
+void sub_80EAAD4(void);
+void sub_80EABD4(u16 *, u16, u16, u16, u16, u16, u16, u16, u16);
+void sub_80EAC0C(u16 *);
+void sub_80EAC30(struct UnknownEasyChatStruct1 *, u16, u16, u16, u16, void *);
+void sub_80EAC48(struct UnknownEasyChatStruct1 *);
+void sub_80EACBC(void *, u16 *, struct UnknownEasyChatStruct1 *);
+u8 *CopyEasyChatGroupName(u8 *, u8, int);
+u8 *sub_80EB218(u8 *, u16, u16);
+u16 sub_80EB2D4(u16);
+bool8 sub_80EB37C(u16);
+bool8 sub_80EB868(u8);
+static u16 sub_80EB960(void);
+u8 sub_80EB9C8(void);
+static u16 sub_80EB9D8(void);
+
+static u8 gUnknown_03000740;
+
+const u16 InterviewPalette_0[] = INCBIN_U16("graphics/misc/interview_pal0.gbapal");
+const u16 InterviewPalette_1[] = INCBIN_U16("graphics/misc/interview_pal1.gbapal");
+const u8 InterviewArrowTiles[] = INCBIN_U8("graphics/misc/interview_arrow.4bpp");
+const u8 InterviewButtonTiles[] = INCBIN_U8("graphics/misc/interview_buttons.4bpp");
+const u16 gMenuInterviewFrame_Pal[] = INCBIN_U16("graphics/misc/interview_frame.gbapal");
+const u8 gMenuInterviewFrame_Gfx[] = INCBIN_U8("graphics/misc/interview_frame.4bpp.lz");
+const u8 InterviewTriangleCursorTiles[] = INCBIN_U8("graphics/misc/interview_triangle_cursor.4bpp");
+
+void sub_80E8218(void)
+{
+ struct SpriteSheet interviewSpriteSheets[] =
+ {
+ {InterviewTriangleCursorTiles, 0x20, 0},
+ {gInterviewOutlineCursorTiles, 0x700, 1},
+ {InterviewArrowTiles, 0x100, 2},
+ {InterviewButtonTiles, 0x100, 3},
+ {NULL, 0, 0},
+ };
+ struct SpritePalette interviewSpritePalettes[] =
+ {
+ {InterviewPalette_0, 0},
+ {InterviewPalette_1, 1},
+ {NULL, 0},
+ };
+
+ LoadSpriteSheets(interviewSpriteSheets);
+ LoadSpritePalettes(interviewSpritePalettes);
+ sub_80E8268();
+ sub_80E8818();
+ sub_80E8A7C();
+}
+
+const struct OamData gOamData_83DBBF4 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 0,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const struct SpriteTemplate gSpriteTemplate_83DBBFC =
+{
+ .tileTag = 0,
+ .paletteTag = 0,
+ .oam = &gOamData_83DBBF4,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80E82BC,
+};
+
+void sub_80E8268(void)
+{
+ u8 spriteId;
+
+ spriteId = CreateSprite(&gSpriteTemplate_83DBBFC, 0, 0, 0);
+ gSprites[spriteId].pos1.y = gEasyChatStruct->unk8A * 8 + 8;
+ gSprites[spriteId].pos1.x = gEasyChatStruct->unk88 * 8 + 4;
+ gSprites[spriteId].data[0] = 0;
+ gSprites[spriteId].data[1] = 0;
+ gEasyChatStruct->unk98 = &gSprites[spriteId];
+}
+
+void sub_80E82BC(struct Sprite *sprite)
+{
+ if (sprite->data[1] == 0)
+ {
+ if (gEasyChatStruct->unk87)
+ {
+ u16 r5 = gEasyChatStruct->unk86;
+ u16 r4 = gEasyChatStruct->unk85;
+ u16 r7 = 0;
+ u16 i;
+
+ for (i = 0; i < r4; i++)
+ r7 += gEasyChatStruct->unk8C[r5][i];
+
+ if (r5 == gEasyChatStruct->unk84)
+ {
+ sprite->pos1.y = 96;
+ sprite->pos1.x = (r4 * 7 + 3) * 8 + 4;
+ }
+ else
+ {
+ sprite->pos1.y = (gEasyChatStruct->unk8A + r5 * 2) * 8 + 8;
+ sprite->pos1.x = (gEasyChatStruct->unk88 + r7 + r4 * 11) * 8 + 4;
+ }
+
+ sprite->pos2.x = -6;
+ sprite->data[0] = 0;
+ }
+ else
+ {
+ if (++sprite->data[0] > 2)
+ {
+ sprite->data[0] = 0;
+ if (++sprite->pos2.x > 0)
+ sprite->pos2.x = -6;
+ }
+ }
+ }
+}
+
+void sub_80E8398(u8 a)
+{
+ switch (a)
+ {
+ case 0:
+ gEasyChatStruct->unk98->data[1] = a;
+ gEasyChatStruct->unk98->pos2.x = a;
+ gEasyChatStruct->unk98->invisible = FALSE;
+ break;
+ case 1:
+ gEasyChatStruct->unk98->data[1] = a;
+ gEasyChatStruct->unk98->pos2.x = 0;
+ gEasyChatStruct->unk98->invisible = FALSE;
+ break;
+ case 2:
+ gEasyChatStruct->unk98->data[1] = 1;
+ gEasyChatStruct->unk98->pos2.x = 0;
+ gEasyChatStruct->unk98->invisible = TRUE;
+ break;
+ }
+}
+
+const struct OamData gOamData_83DBC14 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 1,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const union AnimCmd gSpriteAnim_83DBC1C[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBC24[] =
+{
+#if ENGLISH
+ ANIMCMD_FRAME(8, 5),
+#else
+ ANIMCMD_FRAME(0, 5),
+#endif
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBC2C[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBC34[] =
+{
+ ANIMCMD_FRAME(24, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBC3C[] =
+{
+ ANIMCMD_FRAME(32, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBC44[] =
+{
+ ANIMCMD_FRAME(40, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBC4C[] =
+{
+ ANIMCMD_FRAME(40, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBC54[] =
+{
+ ANIMCMD_FRAME(40, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBC5C[] =
+{
+ ANIMCMD_FRAME(48, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBC64[] =
+{
+#if ENGLISH
+ ANIMCMD_FRAME(40, 5),
+#else
+ ANIMCMD_FRAME(16, 5),
+#endif
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBC6C[] =
+{
+ ANIMCMD_FRAME(48, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBC74[] =
+{
+ ANIMCMD_FRAME(40, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_83DBC7C[] =
+{
+ gSpriteAnim_83DBC1C,
+ gSpriteAnim_83DBC24,
+ gSpriteAnim_83DBC2C,
+ gSpriteAnim_83DBC34,
+};
+
+const union AnimCmd *const gSpriteAnimTable_83DBC8C[] =
+{
+ gSpriteAnim_83DBC3C,
+ gSpriteAnim_83DBC44,
+ gSpriteAnim_83DBC4C,
+ gSpriteAnim_83DBC54,
+};
+
+const union AnimCmd *const gSpriteAnimTable_83DBC9C[] =
+{
+ gSpriteAnim_83DBC5C,
+ gSpriteAnim_83DBC64,
+ gSpriteAnim_83DBC6C,
+ gSpriteAnim_83DBC74,
+};
+
+void sub_80E8420(void)
+{
+ struct SpriteTemplate spriteTemplate_83DBCAC =
+ {
+ .tileTag = 1,
+ .paletteTag = 1,
+ .oam = &gOamData_83DBC14,
+ .anims = gSpriteAnimTable_83DBC7C,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80E85F8,
+ };
+ u8 spriteId;
+
+ spriteId = CreateSprite(&spriteTemplate_83DBCAC, 0, 0, 3);
+ gEasyChatStruct->unk9C = &gSprites[spriteId];
+
+ spriteTemplate_83DBCAC.anims = gSpriteAnimTable_83DBC8C;
+ spriteTemplate_83DBCAC.callback = sub_80E872C;
+ spriteId = CreateSprite(&spriteTemplate_83DBCAC, 0, 0, 4);
+ gEasyChatStruct->unkA0 = &gSprites[spriteId];
+
+ spriteTemplate_83DBCAC.anims = gSpriteAnimTable_83DBC9C;
+ spriteTemplate_83DBCAC.callback = sub_80E8760;
+ spriteId = CreateSprite(&spriteTemplate_83DBCAC, 0, 0, 5);
+ gEasyChatStruct->unkA4 = &gSprites[spriteId];
+
+ gEasyChatStruct->unk9C->data[0] = 0;
+ gEasyChatStruct->unkA0->data[0] = 0;
+ gEasyChatStruct->unkA4->data[0] = 0;
+
+ gEasyChatStruct->unk9C->data[3] = 0x0101 + IndexOfSpritePaletteTag(1) * 16;
+ sub_80E8534();
+ gEasyChatStruct->unk96 = 1;
+ REG_BLDCNT = 0x3F40;
+}
+
+void sub_80E8504(void)
+{
+ DestroySprite(gEasyChatStruct->unk9C);
+ DestroySprite(gEasyChatStruct->unkA0);
+ DestroySprite(gEasyChatStruct->unkA4);
+}
+
+void sub_80E8534(void)
+{
+ if (gEasyChatStruct->unk1B7 != 0)
+ gUnknown_020388AC = 1;
+ else if (gEasyChatStruct->unk26 == 0)
+ gUnknown_020388AC = 0;
+ else if (gEasyChatStruct->unk1A8 == 0 && gEasyChatStruct->unk1A9 == 6)
+ gUnknown_020388AC = 2;
+ else
+ gUnknown_020388AC = 3;
+
+ gEasyChatStruct->unk9C->data[2] = gUnknown_020388AC;
+ gEasyChatStruct->unkA0->data[2] = gUnknown_020388AC;
+ gEasyChatStruct->unkA4->data[2] = gUnknown_020388AC;
+
+ StartSpriteAnim(gEasyChatStruct->unk9C, gUnknown_020388AC);
+ StartSpriteAnim(gEasyChatStruct->unkA0, gUnknown_020388AC);
+ StartSpriteAnim(gEasyChatStruct->unkA4, gUnknown_020388AC);
+
+ gEasyChatStruct->unk9C->data[5] = 8;
+ gEasyChatStruct->unk9C->data[6] = 8;
+ gEasyChatStruct->unk9C->data[1] = 0;
+}
+
+const s8 gUnknown_083DBCC4[][7] =
+{
+ {1, 3, 5, 8, 10, 12, 15},
+ {1, 3, 5, 8, 10, 12, 0},
+ {1, 3, 5, 8, 10, 12, 14},
+ {1, 3, 5, 8, 10, 12, 14},
+};
+
+void sub_80E85F8(struct Sprite *sprite)
+{
+ sprite->data[0]++;
+ if (sprite->data[0] & 1)
+ sprite->data[5] = 8 + (gSineTable[sprite->data[1]] >> 5);
+ else
+ sprite->data[6] = 8 - (gSineTable[sprite->data[1]] >> 5);
+
+ sprite->data[1] = (sprite->data[1] + 5) & 0xFF;
+
+ REG_BLDALPHA = (sprite->data[6] << 8) | sprite->data[5];
+
+ if (gEasyChatStruct->unk96 != 0)
+ {
+ sub_80E8534();
+
+ gEasyChatStruct->unk9C->data[5] = 8;
+ gEasyChatStruct->unk9C->data[6] = 8;
+ gEasyChatStruct->unk9C->data[1] = 0;
+
+ switch (sprite->data[2])
+ {
+ case 0:
+ sprite->pos1.x = gEasyChatStruct->unk1A9 * 88 + 32;
+ sprite->pos1.y = (gEasyChatStruct->unk1A8 - gEasyChatStruct->unk1B5) * 16 + 96;
+ break;
+ case 1:
+#if ENGLISH
+ sprite->pos1.x = 216;
+#else
+ sprite->pos1.x = 214;
+#endif
+ sprite->pos1.y = gEasyChatStruct->unk1A8 * 16 + 96;
+ break;
+ case 2:
+ sprite->pos1.x = 151;
+ sprite->pos1.y = 96;
+ break;
+ case 3:
+ sprite->pos1.x = gUnknown_083DBCC4[gEasyChatStruct->unk1A8][gEasyChatStruct->unk1A9] * 8 + 31;
+ sprite->pos1.y = (gEasyChatStruct->unk1A8 - gEasyChatStruct->unk1B5) * 16 + 96;
+ break;
+ }
+ }
+}
+
+
+void sub_80E872C(struct Sprite *sprite)
+{
+ if (gEasyChatStruct->unk96 != 0 && sprite->data[2] == 0)
+ {
+ sprite->pos1.x = gEasyChatStruct->unk9C->pos1.x + 32;
+ sprite->pos1.y = gEasyChatStruct->unk9C->pos1.y;
+ }
+}
+
+void sub_80E8760(struct Sprite *sprite)
+{
+ if (gEasyChatStruct->unk96 != 0)
+ {
+ switch (sprite->data[2])
+ {
+ case 0:
+ sprite->pos1.x = gEasyChatStruct->unk9C->pos1.x + 64;
+ sprite->pos1.y = gEasyChatStruct->unk9C->pos1.y;
+ break;
+#if GERMAN
+ case 1:
+ sprite->pos1.x = gEasyChatStruct->unk9C->pos1.x + 28;
+ sprite->pos1.y = gEasyChatStruct->unk9C->pos1.y;
+ break;
+#endif
+ case 2:
+ sprite->pos1.x = gEasyChatStruct->unk9C->pos1.x + 21;
+ sprite->pos1.y = gEasyChatStruct->unk9C->pos1.y;
+ break;
+ }
+ }
+}
+
+void sub_80E87A4(u8 a)
+{
+ gEasyChatStruct->unkA8->data[1] = (a == 0);
+ gEasyChatStruct->unkA8->pos2.x = 0;
+}
+
+void sub_80E87CC(u8 a)
+{
+ gEasyChatStruct->unkA8->invisible = (a == 0);
+ sub_80E87A4(a);
+ if (a != 0)
+ gEasyChatStruct->unk1B9 = 1;
+}
+
+void sub_80E8818(void)
+{
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83DBBFC, 0, 0, 0);
+
+ gSprites[spriteId].data[0] = 0;
+ gSprites[spriteId].data[1] = 0;
+ gEasyChatStruct->unkA8 = &gSprites[spriteId];
+ gEasyChatStruct->unkA8->callback = sub_80E8860;
+ sub_80E87CC(0);
+}
+
+void sub_80E8860(struct Sprite *sprite)
+{
+ if (sprite->data[1] == 0)
+ {
+ if (gEasyChatStruct->unk1B9 != 0)
+ {
+ sprite->pos1.x = gEasyChatStruct->unk99A5 * 88 + 44;
+ sprite->pos1.y = (gEasyChatStruct->unk99A4 - gEasyChatStruct->unk9A29) * 16 + 96;
+ sprite->pos2.x = -6;
+ sprite->data[0] = 0;
+ }
+ else
+ {
+ sprite->data[0]++;
+ if (sprite->data[0] > 2)
+ {
+ sprite->data[0] = 0;
+ sprite->pos2.x++;
+ if (sprite->pos2.x > 0)
+ sprite->pos2.x = -6;
+ }
+ }
+ }
+}
+
+void sub_80E88F0(void)
+{
+ u16 i;
+
+ for (i = 0; i < 2; i++)
+ {
+ gEasyChatStruct->unkAC[i]->invisible = TRUE;
+ gEasyChatStruct->unkAC[i]->data[1] = 0;
+ gEasyChatStruct->unkB4[i]->invisible = TRUE;
+ gEasyChatStruct->unkB4[i]->data[1] = 0;
+ }
+ gEasyChatStruct->unk9C70 = 0;
+}
+
+void sub_80E8958(u8 animNum)
+{
+ s16 r9;
+ u16 i;
+
+ if (animNum == 0)
+ {
+ r9 = 100;
+ gEasyChatStruct->unk9C6C = &gEasyChatStruct->unk1B5;
+ if (gEasyChatStruct->unk26 == 0)
+ gEasyChatStruct->unk9C71 = gEasyChatStruct->unk1B6 - 4;
+ else
+ gEasyChatStruct->unk9C71 = 0;
+ }
+ else
+ {
+ r9 = 120;
+ gEasyChatStruct->unk9C6C = &gEasyChatStruct->unk9A29;
+ gEasyChatStruct->unk9C71 = gEasyChatStruct->unk9A28 - 4;
+ for (i = 0; i < 2; i++)
+ {
+ gEasyChatStruct->unkB4[i]->invisible = FALSE;
+ gEasyChatStruct->unkB4[i]->data[1] = 1;
+ }
+ }
+
+ if (gEasyChatStruct->unk9C71 < 0)
+ gEasyChatStruct->unk9C71 = 0;
+
+ for (i = 0; i < 2; i++)
+ {
+ gEasyChatStruct->unkAC[i]->pos1.x = r9;
+ gEasyChatStruct->unkAC[i]->invisible = FALSE;
+ gEasyChatStruct->unkAC[i]->data[1] = 1;
+ StartSpriteAnim(gEasyChatStruct->unkAC[i], animNum);
+ }
+
+ gEasyChatStruct->unk9C70 = 1;
+}
+
+const struct OamData gOamData_83DBCE0 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const union AnimCmd gSpriteAnim_83DBCE8[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBCF0[] =
+{
+ ANIMCMD_FRAME(4, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_83DBCF8[] =
+{
+ gSpriteAnim_83DBCE8,
+ gSpriteAnim_83DBCF0,
+};
+
+const union AnimCmd gSpriteAnim_83DBD00[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBD08[] =
+{
+ ANIMCMD_FRAME(4, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_83DBD10[] =
+{
+ gSpriteAnim_83DBD00,
+ gSpriteAnim_83DBD08,
+};
+
+void sub_80E8A7C(void)
+{
+ struct SpriteTemplate spriteTemplate_83DBD18 =
+ {
+ .tileTag = 2,
+ .paletteTag = 0,
+ .oam = &gOamData_83DBCE0,
+ .anims = gSpriteAnimTable_83DBCF8,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80E8B78,
+ };
+ u16 i;
+ u8 spriteId;
+
+ for (i = 0; i < 2; i++)
+ {
+ spriteId = CreateSprite(&spriteTemplate_83DBD18, 0, 84 + i * 72 , 0);
+ gEasyChatStruct->unkAC[i] = &gSprites[spriteId];
+ gEasyChatStruct->unkAC[i]->data[0] = i;
+ gEasyChatStruct->unkAC[i]->vFlip = i;
+ }
+
+ spriteTemplate_83DBD18.tileTag = 3;
+ spriteTemplate_83DBD18.anims = gSpriteAnimTable_83DBD10;
+
+ for (i = 0; i < 2; i++)
+ {
+ spriteId = CreateSprite(&spriteTemplate_83DBD18, 142 + i * 40, 88, 0);
+ gEasyChatStruct->unkB4[i] = &gSprites[spriteId];
+ gEasyChatStruct->unkB4[i]->data[0] = i;
+ gEasyChatStruct->unkB4[i]->oam.shape = 1;
+ gEasyChatStruct->unkB4[i]->oam.size = 1;
+ StartSpriteAnim(gEasyChatStruct->unkB4[i], i);
+ }
+
+ sub_80E8958(0);
+ sub_80E88F0();
+}
+
+void sub_80E8B78(struct Sprite *sprite)
+{
+ bool8 invisible;
+
+ if (gEasyChatStruct->unk9C70 != 0 && sprite->data[1] != 0)
+ {
+ if (sprite->data[0] == 0)
+ {
+ invisible = FALSE;
+ if (*gEasyChatStruct->unk9C6C == 0)
+ invisible = TRUE;
+ sprite->invisible = invisible;
+ }
+ else
+ {
+ invisible = FALSE;
+ if (*gEasyChatStruct->unk9C6C == gEasyChatStruct->unk9C71)
+ invisible = TRUE;
+ sprite->invisible = invisible;
+ }
+ }
+}
+
+// defined below
+extern const struct SpriteTemplate gSpriteTemplate_83DBD48;
+
+void sub_80E8BF4(u8 reporter, u8 b)
+{
+ struct CompressedSpriteSheet gUnknown_083DBD30 = {gMenuInterviewFrame_Gfx, 2048, 0x0006};
+ struct SpritePalette gUnknown_083DBD38 = {gMenuInterviewFrame_Pal, 0x0004};
+ s16 x;
+ s16 y;
+ u16 gabbyTyGfxId;
+ u8 spriteId;
+
+ switch (b)
+ {
+ case 2:
+ default:
+ x = 64;
+ y = 40;
+ break;
+ case 5:
+ x = 36;
+ y = 48;
+ break;
+ }
+
+ switch (reporter)
+ {
+ case 0: // Gabby
+ default:
+ gabbyTyGfxId = MAP_OBJ_GFX_REPORTER_M;
+ break;
+ case 1: // Ty
+ gabbyTyGfxId = MAP_OBJ_GFX_REPORTER_F;
+ break;
+ }
+
+ LoadCompressedObjectPic(&gUnknown_083DBD30);
+ LoadSpritePalette(&gUnknown_083DBD38);
+ CreateSprite(&gSpriteTemplate_83DBD48, x, y, 1);
+
+ spriteId = AddPseudoFieldObject(
+ (gSaveBlock2.playerGender == MALE) ? MAP_OBJ_GFX_RIVAL_BRENDAN_NORMAL : MAP_OBJ_GFX_RIVAL_MAY_NORMAL,
+ SpriteCallbackDummy, x - 12, y, 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].oam.priority = 0;
+ StartSpriteAnim(&gSprites[spriteId], 3);
+ }
+
+ spriteId = AddPseudoFieldObject(gabbyTyGfxId, SpriteCallbackDummy, x + 12, y, 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].oam.priority = 0;
+ StartSpriteAnim(&gSprites[spriteId], 2);
+ }
+}
+
+const struct OamData gOamData_83DBD40 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const struct SpriteTemplate gSpriteTemplate_83DBD48 =
+{
+ .tileTag = 6,
+ .paletteTag = 4,
+ .oam = &gOamData_83DBD40,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+const struct CompressedSpriteSheet gUnknown_083DBD60 = {gMenuWordGroupIndicator_Gfx, 4096, 0x0007};
+
+const struct SpritePalette gUnknown_083DBD68 = {gMenuWordGroupIndicator_Pal, 0x0005};
+
+const struct OamData gOamData_83DBD70 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const union AnimCmd gSpriteAnim_83DBD78[] =
+{
+ ANIMCMD_FRAME(96, 3),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBD80[] =
+{
+ ANIMCMD_FRAME(64, 4),
+ ANIMCMD_FRAME(96, 4),
+ ANIMCMD_FRAME(64, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBD94[] =
+{
+ ANIMCMD_FRAME(64, 4),
+ ANIMCMD_FRAME(96, 4),
+ ANIMCMD_FRAME(64, 4),
+ ANIMCMD_FRAME(32, 4),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBDA8[] =
+{
+ ANIMCMD_FRAME(64, 2),
+ ANIMCMD_FRAME(32, 2),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBDB4[] =
+{
+ ANIMCMD_FRAME(64, 2),
+ ANIMCMD_FRAME(0, 2),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83DBDC0[] =
+{
+ ANIMCMD_FRAME(64, 2),
+ ANIMCMD_FRAME(96, 2),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_83DBDCC[] =
+{
+ gSpriteAnim_83DBD78,
+ gSpriteAnim_83DBD80,
+ gSpriteAnim_83DBD94,
+ gSpriteAnim_83DBDA8,
+ gSpriteAnim_83DBDB4,
+ gSpriteAnim_83DBDC0,
+};
+
+const struct SpriteTemplate gSpriteTemplate_83DBDE4 =
+{
+ .tileTag = 7,
+ .paletteTag = 5,
+ .oam = &gOamData_83DBD70,
+ .anims = gSpriteAnimTable_83DBDCC,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+void sub_80E8CEC(void)
+{
+ u8 spriteId;
+
+ LoadCompressedObjectPic(&gUnknown_083DBD60);
+ LoadSpritePalette(&gUnknown_083DBD68);
+
+ spriteId = CreateSprite(&gSpriteTemplate_83DBDE4, 224, 88, 0);
+ if (spriteId != MAX_SPRITES)
+ gEasyChatStruct->unk9C74 = &gSprites[spriteId];
+ else
+ gEasyChatStruct->unk9C74 = NULL;
+}
+
+void sub_80E8D54(void)
+{
+ if (gEasyChatStruct->unk9C74 != NULL)
+ {
+ if (gEasyChatStruct->unk26 == 0)
+ StartSpriteAnim(gEasyChatStruct->unk9C74, 1);
+ else
+ StartSpriteAnim(gEasyChatStruct->unk9C74, 2);
+ }
+}
+
+void sub_80E8D8C(u8 a)
+{
+ if (gEasyChatStruct->unk9C74 != NULL)
+ {
+ if (a != 0)
+ {
+ if (gEasyChatStruct->unk26 == 0)
+ StartSpriteAnim(gEasyChatStruct->unk9C74, 3);
+ else
+ StartSpriteAnim(gEasyChatStruct->unk9C74, 4);
+ }
+ else
+ {
+ StartSpriteAnim(gEasyChatStruct->unk9C74, 5);
+ }
+ }
+}
+
+const u16 gUnknown_083DBDFC[] = INCBIN_U16("graphics/unknown/unknown_3DBDFC.gbapal");
+
+const u16 gUnknown_083DBE1C[] =
+{
+ 0x300, 0x300, 0x300, 0x300, 0x300, 0x300, 0x300, 0x300, 0x300,
+ 0x301, 0x301, 0x301, 0x301, 0x301, 0x300, 0x300, 0x300, 0x300,
+};
+
+const u16 gUnknown_083DBE40[] = INCBIN_U16("graphics/unknown/unknown_3DBE40.gbapal");
+
+// unused tilemap?
+const u16 gUnused_083DBE60[] =
+{
+ 0x5036, 0x5037, 0x5038, 0x5039, 0x503A, 0x503B,
+ 0x5046, 0x5047, 0x5048, 0x5049, 0x504A, 0x504B,
+ 0x5056, 0x5057, 0x5058, 0x5059, 0x505A, 0x505B,
+ 0x5030, 0x5031, 0x5032, 0x5033, 0x5034, 0x5035,
+ 0x5040, 0x5041, 0x5042, 0x5043, 0x5044, 0x5045,
+ 0x5050, 0x5051, 0x5052, 0x5053, 0x5054, 0x5055,
+};
+
+const u8 gUnknown_083DBEA8[] = _("{CLEAR_TO 88}");
+
+void sub_80E8DD8(void)
+{
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG2HOFS = 0;
+ REG_BG3HOFS = 0;
+ REG_BG3VOFS = 0;
+
+ REG_BG0CNT = 0x8B00;
+ REG_BG1CNT = 0x0D09;
+
+ CpuCopy16(gUnknown_08E945D0, gEasyChatStruct->unk1C8, 0x500);
+ LZ77UnCompWram(gUnknown_08E953D0, gEasyChatStruct->unk6C8);
+ LZ77UnCompVram(gMenuWordGroupFrame_Gfx, (void *)(VRAM + 0x8000));
+ CpuCopy16(gEasyChatStruct->unk1C8, (void *)(VRAM + 0x6800), 0x500);
+ LoadPalette(gMenuWordGroupFrame1_Pal, 64, 64);
+
+ REG_BG2CNT = 0x0E02;
+
+ DmaClear16(3, (void *)(VRAM + 0x7000), 0x800);
+ DmaCopy16Defvars(3, gUnknown_08E9AB00, (void *)(VRAM + 0x6000), 64);
+ LZ77UnCompVram(gUnknown_08E9AB60, (void *)(VRAM + 0x7000));
+ LoadPalette(gUnknown_08E9AB40, 0, 32);
+ LoadPalette(gUnknown_083DBDFC, 16, 32);
+
+ REG_BG3CNT = 0x0F0F;
+
+ DmaClear32(3, (void *)(VRAM + 0x7800), 0x800);
+ LoadPalette(gUnknown_083DBE40, 32, 32);
+ gPlttBufferUnfaded[63] = RGB(31, 31, 31);
+ gPlttBufferUnfaded[49] = RGB(27, 26, 27);
+ gPlttBufferUnfaded[56] = RGB(28, 28, 28);
+ gPlttBufferFaded[63] = RGB(31, 31, 31);
+ gPlttBufferFaded[49] = RGB(27, 26, 27);
+ gPlttBufferFaded[56] = RGB(28, 28, 28);
+
+ gEasyChatStruct->unkBC = 0;
+ sub_80E8FA4();
+ sub_80E948C();
+ sub_80E9198(10);
+ sub_80E91D4(0);
+ sub_80E95A4();
+
+ REG_BLDCNT = 0;
+}
+
+// The components are ORed in the reverse order from the normal RGB macro
+#define RGB_(r, g, b) ((((b) & 0x1F) << 10) | (((g) & 0x1F) << 5) | ((r) & 0x1F))
+
+#define R_VAL(color) ((color) & 0x1F)
+#define G_VAL(color) (((color) >> 5) & 0x1F)
+#define B_VAL(color) (((color) >> 10) & 0x1F)
+
+void sub_80E8FA4(void)
+{
+ u16 i;
+ u16 r3;
+ u16 r4;
+ s32 sp0[3];
+ s32 spC[3];
+ s32 sp18[3];
+
+ for (i = 0; i < 3; i++)
+ {
+ sp0[0] = R_VAL(*(gMenuWordGroupFrame2_Pal + i + 1)) << 8;
+ spC[0] = R_VAL(*(gMenuWordGroupFrame2_Pal + i + 4)) << 8;
+ sp0[1] = G_VAL(*(gMenuWordGroupFrame2_Pal + i + 1)) << 8;
+ spC[1] = G_VAL(*(gMenuWordGroupFrame2_Pal + i + 4)) << 8;
+ sp0[2] = B_VAL(*(gMenuWordGroupFrame2_Pal + i + 1)) << 8;
+ spC[2] = B_VAL(*(gMenuWordGroupFrame2_Pal + i + 4)) << 8;
+
+ for (r3 = 0; r3 < 3; r3++)
+ sp18[r3] = (spC[r3] - sp0[r3]) / 8;
+
+ for (r4 = 0; r4 < 8; r4++)
+ {
+ gEasyChatStruct->unk9C34[i][r4] = RGB_(sp0[0] >> 8, sp0[1] >> 8, sp0[2] >> 8);
+ for (r3 = 0; r3 < 3; r3++)
+ sp0[r3] += sp18[r3];
+ }
+ gEasyChatStruct->unk9C34[i][r4] = RGB_(spC[0] >> 8, spC[1] >> 8, spC[2] >> 8);
+ }
+ gEasyChatStruct->unk9C32 = 0;
+}
+
+void sub_80E9108(s8 a)
+{
+ u16 i;
+
+ gEasyChatStruct->unk9C32 += a;
+ for (i = 0; i < 3; i++)
+ {
+ gPlttBufferUnfaded[81 + i] = gEasyChatStruct->unk9C34[i][gEasyChatStruct->unk9C32];
+ gPlttBufferFaded[81 + i] = gEasyChatStruct->unk9C34[i][gEasyChatStruct->unk9C32];
+ }
+}
+
+void sub_80E9178(void)
+{
+ gEasyChatStruct->unk9C32 = 0;
+ sub_80E9108(0);
+}
+
+void sub_80E9198(u8 a)
+{
+ gUnknown_03000740 = a;
+}
+
+u8 sub_80E91A4(void)
+{
+ return gUnknown_03000740;
+}
+
+void sub_80E91B0(const u8 *a, u8 b, u8 c, u8 d)
+{
+ sub_8072AB0(a, b * 8, c * 8, 176, d * 8, 1);
+}
+
+void sub_80E91D4(u8 a)
+{
+ BasicInitMenuWindow(&gWindowConfig_81E6DA8);
+
+ if (a == 10)
+ {
+ MenuZeroFillWindowRect(3, 14, 26, 19);
+ sub_80E9198(10);
+ return;
+ }
+
+ if (sub_80E91A4() == 10)
+ MenuDrawTextWindow(3, 14, 26, 19);
+
+ sub_80E9198(a);
+ switch (a)
+ {
+ case 0:
+ sub_80E91B0(gEasyChatStruct->unk9C80, 4, 15, 2);
+ sub_80E91B0(gEasyChatStruct->unk9CC9, 4, 17, 2);
+ break;
+ case 1:
+ sub_80E91B0(gEasyChatStruct->unk9D12, 4, 15, 2);
+ sub_80E91B0(gEasyChatStruct->unk9D5B, 4, 17, 2);
+ break;
+ case 2:
+ sub_80E91B0(gOtherText_TextDeletedConfirmPage1, 4, 15, 2);
+ sub_80E91B0(gOtherText_TextDeletedConfirmPage2, 4, 17, 2);
+ break;
+ case 3:
+ switch (gEasyChatStruct->unk8)
+ {
+ case 9:
+ sub_80E91B0(gOtherText_QuitGivingInfo, 4, 15, 4);
+ break;
+ case 4:
+ sub_80E91B0(gOtherText_StopGivingMail, 4, 15, 4);
+ break;
+ default:
+ sub_80E91B0(gOtherText_QuitEditing, 4, 15, 4);
+ break;
+ }
+ break;
+ case 4:
+ sub_80E91B0(gOtherText_EditedTextNoSavePage1, 4, 15, 2);
+ sub_80E91B0(gOtherText_EditedTextNoSavePage2, 4, 17, 2);
+ break;
+ case 5:
+ sub_80E91B0(gOtherText_EnterAPhraseOrWord, 4, 15, 4);
+ break;
+ case 6:
+ sub_80E91B0(gOtherText_TextNoDelete, 4, 15, 4);
+ break;
+ case 7:
+ sub_80E91B0(gOtherText_OnlyOnePhrase, 4, 15, 2);
+ sub_80E91B0(gOtherText_OriginalSongRestored, 4, 17, 2);
+ break;
+ case 8:
+ sub_80E91B0(gOtherText_TrendyAlready, 4, 15, 4);
+ break;
+ case 9:
+ sub_80E91B0(gOtherText_CombineTwoPhrases, 4, 15, 4);
+ break;
+ }
+}
+
+void sub_80E9368(u8 a)
+{
+ const u8 *r4;
+
+ switch (a)
+ {
+ case 0:
+ r4 = gOtherText_Profile;
+ break;
+ case 1:
+ r4 = gOtherText_AtBattleStart;
+ break;
+ case 2:
+ r4 = gOtherText_UponWinningBattle;
+ break;
+ case 3:
+ r4 = gOtherText_UponLosingBattle;
+ break;
+ case 6:
+ r4 = gOtherText_TheBardsSong;
+ break;
+ case 9:
+ r4 = gOtherText_WhatsHipHappening;
+ break;
+ case 5:
+ case 7:
+ case 8:
+ case 10:
+ case 11:
+ case 12:
+ r4 = gOtherText_Interview;
+ break;
+ case 13:
+ r4 = gOtherText_GoodSaying;
+ break;
+ default:
+ r4 = NULL;
+ break;
+ }
+
+ BasicInitMenuWindow(&gWindowConfig_81E6D8C);
+ gEasyChatStruct->unk9F8E[0] = EXT_CTRL_CODE_BEGIN;
+ gEasyChatStruct->unk9F8E[1] = 5;
+ gEasyChatStruct->unk9F8E[2] = 1;
+ if (r4 != NULL)
+ {
+ sub_8072C74(gEasyChatStruct->unk9F8E + 3, r4, 240, 2);
+ MenuPrint(gEasyChatStruct->unk9F8E, 0, 0);
+ }
+ else
+ {
+ u8 *str = gEasyChatStruct->unk9F8E + 3;
+
+ str[0] = EXT_CTRL_CODE_BEGIN;
+ str[1] = 0x11;
+ str[2] = 0x10;
+ str[3] = EOS;
+
+ MenuPrint(gEasyChatStruct->unk9F8E, 0, 0);
+ MenuPrint(gEasyChatStruct->unk9F8E, 28, 0);
+ }
+ BasicInitMenuWindow(&gWindowConfig_81E6DA8);
+}
+
+void sub_80E948C(void)
+{
+ switch (gEasyChatStruct->unk9)
+ {
+ case 4:
+ sub_809D104((void *)(VRAM + 0x6800), 3, 3, gUnknown_08E94AD0, 0, 26, 24, 6);
+ break;
+ case 5:
+ sub_809D104((void *)(VRAM + 0x6800), 14, 2, gUnknown_08E94AD0, 0, 18, 13, 8);
+ break;
+ case 0:
+ sub_809D104((void *)(VRAM + 0x6800), 2, 2, gUnknown_08E94AD0, 0, 10, 26, 8);
+ break;
+ case 1:
+ sub_809D104((void *)(VRAM + 0x6800), 2, 0, gUnknown_08E94AD0, 0, 0, 26, 10);
+ break;
+ case 2:
+ sub_809D104((void *)(VRAM + 0x6800), 14, 3, gUnknown_08E94AD0, 13, 18, 13, 4);
+ break;
+ case 3:
+ sub_809D104((void *)(VRAM + 0x6800), 3, 2, gUnknown_08E94AD0, 0, 32, 24, 4);
+ break;
+ }
+}
+
+void sub_80E95A4(void)
+{
+ BasicInitMenuWindow(&gWindowConfig_81E6D8C);
+ switch (gEasyChatStruct->unk9)
+ {
+ case 4:
+ sub_80E9620(4, 6);
+ break;
+ case 5:
+ sub_80E9620(2, 17);
+ break;
+ case 0:
+ sub_80E9620(3, 5);
+ break;
+ case 1:
+ sub_80E9620(0, 5);
+ break;
+ case 2:
+ sub_80E9620(4, 17);
+ break;
+ case 3:
+ sub_80E9620(3, 6);
+ break;
+ }
+ BasicInitMenuWindow(&gWindowConfig_81E6DA8);
+}
+
+void sub_80E9620(u16 a, u16 b)
+{
+ u16 i;
+ u16 j;
+ u16 r10 = 0;
+ u16 r7 = a;
+
+ for (i = 0; i < gEasyChatStruct->unk84; i++)
+ {
+ u16 r6 = b;
+
+ for (j = 0; j < gEasyChatStruct->unk83; j++)
+ {
+ if (r10 >= gEasyChatStruct->unkA)
+ {
+ MenuPrint(gUnknown_083DBEA8, r6, r7);
+ break;
+ }
+ if (gEasyChatStruct->unkC[r10] == 0xFFFF)
+ {
+ sub_8095C8C((void *)(VRAM + 0x7000), r6, r7, gUnknown_083DBE1C, 0, 0, 9, 2, 9);
+ r6 += 11;
+ }
+ else
+ {
+ sub_80EB218(gEasyChatStruct->unk9E14, gEasyChatStruct->unkC[r10], 11);
+ MenuPrint(gEasyChatStruct->unk9E14, r6, r7);
+ r6 += gEasyChatStruct->unk8C[i][j] + 11;
+ }
+ r10++;
+ }
+ r7 += 2;
+ }
+}
+
+void sub_80E9744(void)
+{
+ BasicInitMenuWindow(&gWindowConfig_81E6D8C);
+ switch (gEasyChatStruct->unk9)
+ {
+ case 4:
+ sub_80E97C0(4, 6);
+ break;
+ case 5:
+ sub_80E97C0(2, 17);
+ break;
+ case 0:
+ sub_80E97C0(3, 5);
+ break;
+ case 1:
+ sub_80E97C0(0, 5);
+ break;
+ case 2:
+ sub_80E97C0(4, 17);
+ break;
+ case 3:
+ sub_80E97C0(3, 6);
+ break;
+ }
+ BasicInitMenuWindow(&gWindowConfig_81E6DA8);
+}
+
+void sub_80E97C0(u16 a, u16 b)
+{
+ u8 i;
+ u8 r7 = 0;
+
+ asm("":::"r9");
+
+ for (i = 0; i < gEasyChatStruct->unk84; i++)
+ {
+ u8 r6;
+ u8 *r2 = gEasyChatStruct->unk9E6E;
+ u32 r1;
+
+ for (r6 = 0; r6 < gEasyChatStruct->unk83; r6++)
+ {
+ if (r7 >= gEasyChatStruct->unkA)
+ break;
+ if (gEasyChatStruct->unkC[r7] != 0xFFFF)
+ {
+ r2 = sub_80EB218(r2, gEasyChatStruct->unkC[r7], 0);
+ *r2++ = CHAR_SPACE;
+ }
+ r7++;
+ }
+
+ r1 = gEasyChatStruct->unk83 * 11;
+ r2[0] = EXT_CTRL_CODE_BEGIN;
+ r2[1] = 0x13;
+ r2[2] = r1 * 8;
+ r2[3] = EOS;
+
+ MenuPrint(gEasyChatStruct->unk9E6E, b, a);
+
+ a += 2;
+ }
+}
+
+void sub_80E98C4(void)
+{
+ u8 r1;
+ u8 r3;
+
+ BasicInitMenuWindow(&gWindowConfig_81E6D8C);
+ switch (gEasyChatStruct->unk9)
+ {
+ case 4:
+ r1 = 4;
+ r3 = 2;
+ break;
+ case 5:
+ r1 = 3;
+ r3 = 2;
+ break;
+ case 0:
+ r1 = 3;
+ r3 = 2;
+ break;
+ case 1:
+ r1 = 1;
+ r3 = 3;
+ break;
+ case 2:
+ r1 = 4;
+ r3 = 1;
+ break;
+ case 3:
+ r1 = 3;
+ r3 = 1;
+ break;
+ default:
+ return;
+ }
+ MenuFillWindowRectWithBlankTile(2, r1, 27, r3 * 2 + r1 - 1);
+ BasicInitMenuWindow(&gWindowConfig_81E6DA8);
+}
+
+void sub_80E9940(u8 *a, u8 b)
+{
+ u8 r4 = (b & 7);
+
+ MenuFillWindowRectWithBlankTile(2, r4 * 2, 31, r4 * 2 + 1);
+ sub_80E9A7C(a, b);
+ sub_80E9A60(a, 2, r4 * 2);
+}
+
+#if ENGLISH
+
+const u8 gUnknown_083DBEAC[][32] =
+{
+ _("{UNKNOWN_14 8} A B C D E F {UNKNOWN_14 0}others"),
+ _("{UNKNOWN_14 8} G H I J K L "),
+ _("{UNKNOWN_14 8} M N O P Q R S "),
+ _("{UNKNOWN_14 8} T U V W X Y Z "),
+};
+
+#else
+
+const u8 unk_83E7EB0[] = _("{UNKNOWN_14 8} A B C D E F {UNKNOWN_14 0}mehr");
+const u8 unk_83E7ECA[] = _("{UNKNOWN_14 8} G H I J K L ");
+const u8 unk_83E7EE1[] = _("{UNKNOWN_14 8} M N O P Q R S ");
+const u8 unk_83E7EF8[] = _("{UNKNOWN_14 8} T U V W X Y Z ");
+const u8 *const gUnknown_083DBEAC[] =
+{
+ unk_83E7EB0,
+ unk_83E7ECA,
+ unk_83E7EE1,
+ unk_83E7EF8,
+ unk_83E7EB0 + 21, // pointer to "mehr". What is this for?
+};
+
+#endif
+
+void sub_80E9974(void)
+{
+ BasicInitMenuWindow(&gWindowConfig_81E6D54);
+ if (gEasyChatStruct->unk26 == 0)
+ {
+ u16 i;
+
+ for (i = gEasyChatStruct->unk1B5; i < gEasyChatStruct->unk1B5 + 4; i++)
+ sub_80E9940(gEasyChatStruct->unk9DC9, i);
+ }
+ else
+ {
+ sub_80E9AD4();
+ sub_80E9A60(gUnknown_083DBEAC[0], 2, 0);
+ sub_80E9A60(gUnknown_083DBEAC[1], 2, 2);
+ sub_80E9A60(gUnknown_083DBEAC[2], 2, 4);
+ sub_80E9A60(gUnknown_083DBEAC[3], 2, 6);
+ }
+}
+
+void sub_80E9A14(void)
+{
+ sub_80E9A4C();
+ if (gEasyChatStruct->unk26 == 0)
+ gEasyChatStruct->unk1BA += gEasyChatStruct->unk1B5 * 16;
+}
+
+void sub_80E9A4C(void)
+{
+ gEasyChatStruct->unk1BA = 0;
+}
+
+void sub_80E9A60(const u8 *a, u16 b, u16 c)
+{
+ c &= 0xF;
+ MenuPrint(a, b, c);
+}
+
+void sub_80E9A7C(u8 *dest, u16 b)
+{
+ u16 i;
+ u16 r5 = b * 2;
+
+ for (i = 0; i < 2; i++)
+ {
+ dest[0] = EXT_CTRL_CODE_BEGIN;
+ dest[1] = 0x12;
+ dest[2] = 88 * i;
+ dest += 3;
+
+ dest = CopyEasyChatGroupName(dest, gEasyChatStruct->unk2A[b][i], 11);
+ r5++;
+ if (r5 >= gEasyChatStruct->unk28)
+ break;
+ }
+}
+
+void sub_80E9AD4(void)
+{
+ u16 i;
+
+ BasicInitMenuWindow(&gWindowConfig_81E6D54);
+ for (i = 0; i < 16; i++)
+ sub_80E9C74(i);
+}
+
+void sub_80E9AF8(u16 a)
+{
+ u8 *r8;
+ u16 i;
+
+ sub_80E9C74(a);
+
+ r8 = gEasyChatStruct->unk9E14;
+ r8[0] = EXT_CTRL_CODE_BEGIN;
+ r8[1] = 0x11;
+ r8[2] = 0x10;
+ r8 += 3;
+
+ if (gEasyChatStruct->unk7D != 0)
+ {
+ for (i = 0; i < gEasyChatStruct->unk99A6[a]; i++)
+ {
+ if (sub_80EB2D4(gEasyChatStruct->unk9A2A[a][i]) == 7)
+ BasicInitMenuWindow(&gWindowConfig_81E6D70);
+ else
+ BasicInitMenuWindow(&gWindowConfig_81E6D54);
+ sub_80EB218(r8, gEasyChatStruct->unk9A2A[a][i], 9);
+ sub_80E9A60(gEasyChatStruct->unk9E14, i * 11 + 4, a * 2);
+ }
+ }
+ else
+ {
+ BasicInitMenuWindow(&gWindowConfig_81E6D54);
+ for (i = 0; i < gEasyChatStruct->unk99A6[a]; i++)
+ {
+ sub_80EB218(r8, gEasyChatStruct->unk9A2A[a][i], 9);
+ sub_80E9A60(gEasyChatStruct->unk9E14, i * 11 + 4, a * 2);
+ }
+ }
+}
+
+void sub_80E9C74(u16 a)
+{
+ a &= 7;
+ MenuFillWindowRectWithBlankTile(0, a * 2, 29, a * 2 + 1);
+}
+
+void sub_80E9C94(void)
+{
+ u16 r5 = min(gEasyChatStruct->unk9A28, 4);
+ u16 i;
+
+ for (i = 0; i < r5; i++)
+ sub_80E9AF8(gEasyChatStruct->unk9A29 + i);
+ while (i < 4)
+ sub_80E9C74(i++);
+}
+
+void sub_80E9D00(void)
+{
+ u16 r4;
+ u16 r5;
+
+ if (gEasyChatStruct->unk1C0 > 0)
+ {
+ r4 = gEasyChatStruct->unk1C0;
+ r5 = gEasyChatStruct->unk9A29 + 4;
+ }
+ else
+ {
+ r4 = -gEasyChatStruct->unk1C0;
+ r5 = gEasyChatStruct->unk9A29 - r4;
+ }
+ while (--r4 != 0xFFFF)
+ sub_80E9AF8(r5++);
+}
+
+void sub_80E9D7C(void)
+{
+ u16 r6;
+ u16 r4;
+ u16 i;
+
+ BasicInitMenuWindow(&gWindowConfig_81E6D54);
+ if (gEasyChatStruct->unk1C0 < 0)
+ {
+ r6 = -gEasyChatStruct->unk1C0;
+ r4 = gEasyChatStruct->unk1B5 - r6;
+ }
+ else
+ {
+ r6 = gEasyChatStruct->unk1C0;
+ r4 = gEasyChatStruct->unk1B5 + 4;
+ }
+ for (i = 0; i < r6; i++)
+ {
+ sub_80E9940(gEasyChatStruct->unk9DC9, r4);
+ r4++;
+ }
+}
+
+void sub_80E9E08(u8 a)
+{
+ gEasyChatStruct->unk1BC = (gEasyChatStruct->unk1BA + gEasyChatStruct->unk1C0 * 16) & 0x7F;
+ gEasyChatStruct->unk1BF = (gEasyChatStruct->unk1C0 < 0) ? -a : a;
+}
+
+bool8 sub_80E9E54(void)
+{
+ gEasyChatStruct->unk1BA = (gEasyChatStruct->unk1BA + gEasyChatStruct->unk1BF) & 0x7F;
+ return (gEasyChatStruct->unk1BA == gEasyChatStruct->unk1BC);
+}
+
+void nullsub_23(void)
+{
+}
+
+void sub_80E9E98(void)
+{
+ gEasyChatStruct->unkBE = 0;
+}
+
+bool8 sub_80E9EA8(void)
+{
+ switch (gEasyChatStruct->unkBE)
+ {
+ case 0:
+ sub_80EA24C();
+ gEasyChatStruct->unkBE++;
+ // fall through
+ case 1:
+ if (sub_80EA1E0() != 0)
+ {
+ sub_80EA4A4();
+ gEasyChatStruct->unkBE++;
+ }
+ break;
+ case 2:
+ if (sub_80EA1E0() != 0)
+ {
+ sub_80EA704();
+ gEasyChatStruct->unkBE++;
+ }
+ break;
+ case 3:
+ if (sub_80EA1E0() != 0)
+ gEasyChatStruct->unkBE++;
+ break;
+ case 4:
+ gEasyChatStruct->unkBE++;
+ break;
+ case 5:
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_80E9F50(void)
+{
+ switch (gEasyChatStruct->unkBE)
+ {
+ case 0:
+ nullsub_23();
+ sub_80EA764();
+ gEasyChatStruct->unkBE++;
+ // fall through
+ case 1:
+ if (sub_80EA1E0() != 0)
+ gEasyChatStruct->unkBE++;
+ break;
+ case 2:
+ sub_80EA5A0();
+ gEasyChatStruct->unkBE++;
+ // fall through
+ case 3:
+ if (sub_80EA1E0() != 0)
+ gEasyChatStruct->unkBE++;
+ break;
+ case 4:
+ sub_80EA348();
+ gEasyChatStruct->unkBE++;
+ // fall through
+ case 5:
+ if (sub_80EA1E0() != 0)
+ gEasyChatStruct->unkBE++;
+ break;
+ case 6:
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_80E9FD4(void)
+{
+ switch (gEasyChatStruct->unkBE)
+ {
+ case 0:
+ nullsub_23();
+ sub_80EA5A0();
+ gEasyChatStruct->unkBE++;
+ // fall through
+ case 1:
+ if (sub_80EA1E0() != 0)
+ return TRUE;
+ break;
+ }
+ return FALSE;
+}
+
+bool8 sub_80EA014(void)
+{
+ switch (gEasyChatStruct->unkBE)
+ {
+ case 0:
+ sub_80EA4A4();
+ gEasyChatStruct->unkBE++;
+ // fall through
+ case 1:
+ if (sub_80EA1E0() != 0)
+ return TRUE;
+ break;
+ }
+ return FALSE;
+}
+
+bool8 sub_80EA050(void)
+{
+ switch (gEasyChatStruct->unkBE)
+ {
+ case 0:
+ nullsub_23();
+ sub_80EA764();
+ gEasyChatStruct->unkBE++;
+ break;
+ case 1:
+ if (sub_80EA1E0() != 0)
+ {
+ sub_80EA7F4();
+ gEasyChatStruct->unkBE++;
+ }
+ break;
+ case 2:
+ sub_80E9108(1);
+ if (sub_80EA1E0() != 0)
+ {
+ sub_80EA8BC();
+ gEasyChatStruct->unkBE++;
+ }
+ break;
+ case 3:
+ sub_80E9108(1);
+ if (sub_80EA1E0() != 0)
+ gEasyChatStruct->unkBE++;
+ break;
+ case 4:
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_80EA0E4(void)
+{
+ switch (gEasyChatStruct->unkBE)
+ {
+ case 0:
+ sub_80EA948();
+ gEasyChatStruct->unkBE++;
+ // fall through
+ case 1:
+ sub_80E9108(-1);
+ if (sub_80EA1E0() != 0)
+ {
+ sub_80EAA44();
+ gEasyChatStruct->unkBE++;
+ }
+ break;
+ case 2:
+ sub_80E9108(-1);
+ if (sub_80EA1E0() != 0)
+ {
+ sub_80EA704();
+ gEasyChatStruct->unkBE++;
+ }
+ break;
+ case 3:
+ if (sub_80EA1E0() != 0)
+ gEasyChatStruct->unkBE++;
+ break;
+ case 4:
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_80EA184(void)
+{
+ switch (gEasyChatStruct->unkBE)
+ {
+ case 0:
+ sub_80EAAD4();
+ gEasyChatStruct->unkBE++;
+ // fall through
+ case 1:
+ if (sub_80EA1E0() != 0)
+ gEasyChatStruct->unkBE++;
+ break;
+ case 2:
+ sub_80E9178();
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_80EA1E0(void)
+{
+ u16 i;
+
+ if (gEasyChatStruct->unkC4 != 0)
+ {
+ for (i = 0; i < gEasyChatStruct->unkC2; i++)
+ {
+ sub_80EAC0C(gEasyChatStruct->unkC8[i]);
+ sub_80EAC48(&gEasyChatStruct->unk148[i]);
+ }
+ gEasyChatStruct->unkBC = 1;
+ gEasyChatStruct->unkC4--;
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void sub_80EA24C(void)
+{
+ sub_80EABD4(gEasyChatStruct->unkC8[0], 13, 14, 13, 15, -2, 0, 0, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[0], 0, 0, 0, 0, gEasyChatStruct->unk6C8);
+
+ sub_80EABD4(gEasyChatStruct->unkC8[1], 12, 14, 12, 15, 0, 0, 2, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[1], 30, 0, -2, 0, gEasyChatStruct->unk6C8);
+
+ sub_80EABD4(gEasyChatStruct->unkC8[2], 13, 15, 13, 16, -2, 0, 0, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[2], 0, 9, 0, 0, gEasyChatStruct->unk6C8);
+
+ sub_80EABD4(gEasyChatStruct->unkC8[3], 12, 15, 12, 16, 0, 0, 2, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[3], 30, 9, -2, 0, gEasyChatStruct->unk6C8);
+
+ gEasyChatStruct->unkC2 = 4;
+ gEasyChatStruct->unkC4 = 6;
+}
+
+void sub_80EA348(void)
+{
+ sub_80EABD4(gEasyChatStruct->unkC8[0], 1, 14, 13, 15, 2, 0, 0, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[0], 0, 0, 0, 0, gEasyChatStruct->unk6C8);
+
+ sub_80EABD4(gEasyChatStruct->unkC8[1], 12, 14, 24, 15, 0, 0, -2, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[1], 18, 0, 2, 0, gEasyChatStruct->unk6C8);
+
+ sub_80EABD4(gEasyChatStruct->unkC8[2], 1, 15, 13, 16, 2, 0, 0, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[2], 0, 9, 0, 0, gEasyChatStruct->unk6C8);
+
+ sub_80EABD4(gEasyChatStruct->unkC8[3], 12, 15, 24, 16, 0, 0, -2, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[3], 18, 9, 2, 0, gEasyChatStruct->unk6C8);
+
+ sub_80EABD4(gEasyChatStruct->unkC8[4], 1, 14, 1, 16, 0, 0, 2, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[4], 1, 14, 0, 0, gEasyChatStruct->unk1C8);
+
+ sub_80EABD4(gEasyChatStruct->unkC8[5], 24, 14, 24, 16, -2, 0, 0, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[5], 24, 14, -2, 0, gEasyChatStruct->unk1C8);
+
+ gEasyChatStruct->unkC2 = 6;
+ gEasyChatStruct->unkC4 = 6;
+}
+
+void sub_80EA4A4(void)
+{
+ sub_80EABD4(gEasyChatStruct->unkC8[0], 1, 14, 13, 15, 0, -1, 0, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[0], 0, 0, 0, 0, gEasyChatStruct->unk6C8);
+
+ sub_80EABD4(gEasyChatStruct->unkC8[1], 12, 14, 24, 15, 0, -1, 0, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[1], 18, 0, 0, 0, gEasyChatStruct->unk6C8);
+
+ sub_80EABD4(gEasyChatStruct->unkC8[2], 1, 15, 13, 16, 0, 0, 0, 1);
+ sub_80EAC30(&gEasyChatStruct->unk148[2], 0, 9, 0, -1, gEasyChatStruct->unk6C8);
+
+ sub_80EABD4(gEasyChatStruct->unkC8[3], 12, 15, 24, 16, 0, 0, 0, 1);
+ sub_80EAC30(&gEasyChatStruct->unk148[3], 18, 9, 0, -1, gEasyChatStruct->unk6C8);
+
+ gEasyChatStruct->unkC2 = 4;
+ gEasyChatStruct->unkC4 = 4;
+}
+
+void sub_80EA5A0(void)
+{
+ sub_80EABD4(gEasyChatStruct->unkC8[0], 1, 10, 13, 15, 0, 1, 0, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[0], 0, 0, 0, 0, gEasyChatStruct->unk6C8);
+
+ sub_80EABD4(gEasyChatStruct->unkC8[1], 12, 10, 24, 15, 0, 1, 0, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[1], 18, 0, 0, 0, gEasyChatStruct->unk6C8);
+
+ sub_80EABD4(gEasyChatStruct->unkC8[2], 1, 15, 13, 20, 0, 0, 0, -1);
+ sub_80EAC30(&gEasyChatStruct->unk148[2], 0, 5, 0, 1, gEasyChatStruct->unk6C8);
+
+ sub_80EABD4(gEasyChatStruct->unkC8[3], 12, 15, 24, 20, 0, 0, 0, -1);
+ sub_80EAC30(&gEasyChatStruct->unk148[3], 18, 5, 0, 1, gEasyChatStruct->unk6C8);
+
+ sub_80EABD4(gEasyChatStruct->unkC8[4], 1, 10, 24, 10, 0, 0, 0, 1);
+ sub_80EAC30(&gEasyChatStruct->unk148[4], 1, 10, 0, 0, gEasyChatStruct->unk1C8);
+
+ sub_80EABD4(gEasyChatStruct->unkC8[5], 1, 20, 24, 20, 0, -1, 0, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[5], 1, 20, 0, -1, gEasyChatStruct->unk1C8);
+
+ gEasyChatStruct->unkC2 = 6;
+ gEasyChatStruct->unkC4 = 4;
+}
+
+void sub_80EA704(void)
+{
+ sub_80EABD4(gEasyChatStruct->unkC8[0], 24, 12, 25, 20, 0, 0, 1, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[0], 5, 10, -1, 0, gEasyChatStruct->unk6C8);
+
+ gEasyChatStruct->unkC2 = 1;
+ gEasyChatStruct->unkC4 = 5;
+}
+
+void sub_80EA764(void)
+{
+ sub_80EABD4(gEasyChatStruct->unkC8[0], 24, 12, 30, 20, 0, 0, -1, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[0], 0, 10, 1, 0, gEasyChatStruct->unk6C8);
+
+ sub_80EABD4(gEasyChatStruct->unkC8[1], 30, 12, 31, 20, -1, 0, 0, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[1], 30, 12, -1, 0, gEasyChatStruct->unk1C8);
+
+ gEasyChatStruct->unkC2 = 2;
+ gEasyChatStruct->unkC4 = 6;
+}
+
+void sub_80EA7F4(void)
+{
+ sub_80EABD4(gEasyChatStruct->unkC8[0], 20, 10, 25, 20, 0, 0, 1, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[0], 25, 0, -1, 0, gEasyChatStruct->unk6C8);
+
+ sub_80EABD4(gEasyChatStruct->unkC8[1], 0, 10, 1, 20, 0, 0, 1, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[1], 0, 10, 0, 0, gEasyChatStruct->unk1C8);
+
+ sub_80EABD4(gEasyChatStruct->unkC8[2], 1, 10, 4, 20, 1, 0, 0, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[2], 0, 0, 0, 0, gEasyChatStruct->unk6C8);
+
+ gEasyChatStruct->unkC2 = 3;
+ gEasyChatStruct->unkC4 = 2;
+}
+
+void sub_80EA8BC(void)
+{
+ sub_80EABD4(gEasyChatStruct->unkC8[0], 3, 10, 4, 20, 0, 0, 0, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[0], 0, 0, 0, 0, gEasyChatStruct->unk6C8);
+
+ sub_80EABD4(gEasyChatStruct->unkC8[1], 0, 10, 2, 20, 0, 0, 0, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[1], 0, 10, 0, 0, gEasyChatStruct->unk1C8);
+
+ gEasyChatStruct->unkC2 = 2;
+ gEasyChatStruct->unkC4 = 1;
+}
+
+void sub_80EA948(void)
+{
+ sub_80EABD4(gEasyChatStruct->unkC8[0], 0, 10, 2, 20, 0, 0, -1, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[0], 0, 10, 0, 0, gEasyChatStruct->unk1C8);
+
+ sub_80EABD4(gEasyChatStruct->unkC8[1], 3, 10, 5, 20, -1, 0, 0, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[1], 0, 0, 0, 0, gEasyChatStruct->unk6C8);
+
+ sub_80EABD4(gEasyChatStruct->unkC8[2], 26, 10, 30, 20, -1, 0, 0, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[2], 26, 10, -1, 0, gEasyChatStruct->unk1C8);
+
+ sub_80EABD4(gEasyChatStruct->unkC8[3], 25, 10, 26, 20, -1, 0, -1, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[3], 29, 0, 0, 0, gEasyChatStruct->unk6C8);
+
+ gEasyChatStruct->unkC2 = 4;
+ gEasyChatStruct->unkC4 = 2;
+}
+
+void sub_80EAA44(void)
+{
+ sub_80EABD4(gEasyChatStruct->unkC8[0], 24, 10, 30, 20, 0, 0, 0, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[0], 24, 10, 0, 0, gEasyChatStruct->unk1C8);
+
+ sub_80EABD4(gEasyChatStruct->unkC8[1], 23, 10, 24, 20, 0, 0, -1, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[1], 29, 0, 0, 0, gEasyChatStruct->unk6C8);
+
+ gEasyChatStruct->unkC2 = 2;
+ gEasyChatStruct->unkC4 = 1;
+}
+
+void sub_80EAAD4(void)
+{
+ sub_80EABD4(gEasyChatStruct->unkC8[0], 0, 10, 30, 15, 0, 1, 0, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[0], 0, 0, 0, 0, gEasyChatStruct->unk6C8);
+
+ sub_80EABD4(gEasyChatStruct->unkC8[1], 0, 15, 30, 20, 0, 0, 0, -1);
+ sub_80EAC30(&gEasyChatStruct->unk148[1], 0, 5, 0, 1, gEasyChatStruct->unk6C8);
+
+ sub_80EABD4(gEasyChatStruct->unkC8[2], 0, 10, 30, 10, 0, 0, 0, 1);
+ sub_80EAC30(&gEasyChatStruct->unk148[2], 0, 10, 0, 0, gEasyChatStruct->unk1C8);
+
+ sub_80EABD4(gEasyChatStruct->unkC8[3], 0, 20, 30, 20, 0, -1, 0, 0);
+ sub_80EAC30(&gEasyChatStruct->unk148[3], 0, 20, 0, -1, gEasyChatStruct->unk1C8);
+
+ gEasyChatStruct->unkC2 = 4;
+ gEasyChatStruct->unkC4 = 5;
+}
+
+void sub_80EABD4(u16 *a, u16 b, u16 c, u16 d, u16 e, u16 f, u16 g, u16 h, u16 i)
+{
+ a[0] = b;
+ a[1] = d;
+ a[2] = c;
+ a[3] = e;
+ a[4] = f;
+ a[5] = h;
+ a[6] = g;
+ a[7] = i;
+}
+
+void sub_80EAC0C(u16 *a)
+{
+ a[0] += a[4];
+ a[1] += a[5];
+ a[2] += a[6];
+ a[3] += a[7];
+}
+
+void sub_80EAC30(struct UnknownEasyChatStruct1 *a, u16 b, u16 c, u16 d, u16 e, void *f)
+{
+ a->unk0 = b;
+ a->unk2 = c;
+ a->unk4 = d;
+ a->unk6 = e;
+ a->unk8 = f;
+}
+
+void sub_80EAC48(struct UnknownEasyChatStruct1 *a)
+{
+ a->unk0 += a->unk4;
+ a->unk2 += a->unk6;
+}
+
+void sub_80EAC5C(void)
+{
+ u16 i;
+
+ if (gEasyChatStruct->unkBC != 0)
+ {
+ for (i = 0; i < gEasyChatStruct->unkC2; i++)
+ sub_80EACBC((void *)(VRAM + 0x6800), gEasyChatStruct->unkC8[i], &gEasyChatStruct->unk148[i]);
+ gEasyChatStruct->unkBC = 0;
+ }
+}
+
+void sub_80EACBC(void *a, u16 *b, struct UnknownEasyChatStruct1 *c)
+{
+ s16 r6 = b[1] - b[0];
+ s16 r5 = b[3] - b[2];
+
+ if (r6 > 0 && r5 > 0)
+ sub_809D104(a, b[0], b[2], c->unk8, c->unk0, c->unk2, r6, r5);
+}
+
+// Strange...
+void sub_80EAD08(void)
+{
+ u16 *r4;
+ u16 r2;
+ u16 i;
+
+ r4 = gUnknown_03004DE0[gUnknown_03004DC0.srcBank];
+ r4 += 88;
+ r2 = (gEasyChatStruct->unk1BA - 88) & 0xFF;
+
+ for (i = 0; i < 64; i++)
+ {
+ if (gEasyChatStruct->unk1BA + i == 128)
+ r2 = (-i - 88) & 0xFF;
+ *r4++ = r2;
+ }
+}
+
+extern const u8 *const gEasyChatGroupNames[];
+extern const u8 gEasyChatGroupSizes[];
+extern const u16 gEasyChatWordsByLetter[];
+extern const u16 gEasyChatWordsAlphabetized[];
+
+u8 *CopyEasyChatGroupName(u8 *dest, u8 group, int unused)
+{
+ return StringCopy(dest, gEasyChatGroupNames[group]);
+}
+
+bool8 sub_80EAD7C(u8 group)
+{
+ switch (group)
+ {
+ case EC_GROUP_TRENDY_SAYING:
+ return FlagGet(FLAG_SYS_HIPSTER_MEET);
+ case EC_GROUP_EVENTS:
+ case EC_GROUP_MOVE_1:
+ case EC_GROUP_MOVE_2:
+ return FlagGet(FLAG_SYS_GAME_CLEAR);
+ case EC_GROUP_POKEMON_2:
+ return sub_80EB9C8();
+ default:
+ return TRUE;
+ }
+}
+
+bool8 sub_80EADC0(u8 group, u16 word)
+{
+ switch (group)
+ {
+ case EC_GROUP_TRENDY_SAYING:
+ if (gEasyChatStruct->unk40[2][11 + group] == 0)
+ return FALSE;
+ return sub_80EB868(word);
+ case EC_GROUP_POKEMON_1:
+ return GetSetPokedexFlag(SpeciesToNationalPokedexNum(word), 0);
+ case EC_GROUP_EVENTS:
+ case EC_GROUP_MOVE_1:
+ case EC_GROUP_MOVE_2:
+ if (gEasyChatStruct->unk40[2][11 + group] == 0)
+ return FALSE;
+ return TRUE;
+ case EC_GROUP_POKEMON_2:
+ return sub_80EB9C8();
+ default:
+ return TRUE;
+ }
+}
+
+u16 sub_80EAE88(u8 group)
+{
+ switch (group)
+ {
+ case EC_GROUP_POKEMON_1:
+ return GetHoennPokedexCount(0);
+ case EC_GROUP_TRENDY_SAYING:
+ return sub_80EB8C0();
+ default:
+ if (sub_80EAD7C(group))
+ return gEasyChatGroupSizes[group];
+ return FALSE;
+ }
+}
+
+#if GERMAN
+__attribute__((naked))
+void sub_80EAECC(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, 0x10\n\
+ movs r7, 0\n\
+ ldr r1, _080EAF08 @ =gEasyChatStruct\n\
+ ldr r0, [r1]\n\
+ ldr r3, _080EAF0C @ =0x0000446c\n\
+ adds r3, r0, r3\n\
+ str r3, [sp, 0x4]\n\
+_080EAEE4:\n\
+ ldr r1, _080EAF10 @ =gEasyChatWordsByLetter\n\
+ lsls r2, r7, 1\n\
+ adds r0, r2, r1\n\
+ ldrh r4, [r0]\n\
+ adds r3, r7, 0x1\n\
+ lsls r0, r3, 1\n\
+ adds r0, r1\n\
+ ldrh r0, [r0]\n\
+ str r0, [sp]\n\
+ ldr r0, [sp, 0x4]\n\
+ adds r1, r0, r2\n\
+ movs r0, 0\n\
+ strh r0, [r1]\n\
+ mov r9, r0\n\
+ adds r6, r4, 0\n\
+ mov r10, r2\n\
+ str r3, [sp, 0x8]\n\
+ b _080EB00C\n\
+ .align 2, 0\n\
+_080EAF08: .4byte gEasyChatStruct\n\
+_080EAF0C: .4byte 0x0000446c\n\
+_080EAF10: .4byte gEasyChatWordsByLetter\n\
+_080EAF14:\n\
+ ldr r2, _080EAFAC @ =gEasyChatWordsAlphabetized\n\
+ adds r0, r6, 0\n\
+ adds r1, r0, 0x1\n\
+ lsls r1, 16\n\
+ lsrs r6, r1, 16\n\
+ lsls r0, 1\n\
+ adds r0, r2\n\
+ ldrh r1, [r0]\n\
+ adds r4, r1, 0\n\
+ ldr r0, _080EAFB0 @ =0x0000feff\n\
+ cmp r1, r0\n\
+ bls _080EAFC8\n\
+ movs r0, 0xFF\n\
+ ands r1, r0\n\
+ movs r3, 0\n\
+ subs r0, r1, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r5, r0, 16\n\
+ ldr r0, _080EAFB4 @ =0x0000ffff\n\
+ cmp r5, r0\n\
+ beq _080EB00C\n\
+ lsls r0, r7, 4\n\
+ adds r0, r7\n\
+ lsls r0, 3\n\
+ subs r0, r7\n\
+ lsls r0, 2\n\
+ mov r8, r0\n\
+_080EAF4A:\n\
+ adds r1, r6, 0\n\
+ adds r0, r1, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r6, r0, 16\n\
+ lsls r1, 1\n\
+ ldr r0, _080EAFAC @ =gEasyChatWordsAlphabetized\n\
+ adds r1, r0\n\
+ ldrh r4, [r1]\n\
+ lsrs r0, r4, 9\n\
+ ldr r1, _080EAFB8 @ =0x000001ff\n\
+ adds r2, r1, 0\n\
+ adds r1, r4, 0\n\
+ ands r1, r2\n\
+ str r3, [sp, 0xC]\n\
+ bl sub_80EADC0\n\
+ lsls r0, 24\n\
+ ldr r3, [sp, 0xC]\n\
+ cmp r0, 0\n\
+ beq _080EAF9E\n\
+ cmp r3, 0\n\
+ bne _080EAF9E\n\
+ ldr r3, _080EAFBC @ =gEasyChatStruct\n\
+ ldr r2, [r3]\n\
+ mov r1, r9\n\
+ adds r0, r1, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ mov r9, r0\n\
+ lsls r1, 1\n\
+ add r1, r8\n\
+ ldr r3, _080EAFC0 @ =0x00000b78\n\
+ adds r0, r2, r3\n\
+ adds r0, r1\n\
+ strh r4, [r0]\n\
+ ldr r0, _080EAFC4 @ =0x0000446c\n\
+ adds r2, r0\n\
+ add r2, r10\n\
+ ldrh r0, [r2]\n\
+ adds r0, 0x1\n\
+ strh r0, [r2]\n\
+ movs r3, 0x1\n\
+_080EAF9E:\n\
+ subs r0, r5, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r5, r0, 16\n\
+ ldr r1, _080EAFB4 @ =0x0000ffff\n\
+ cmp r5, r1\n\
+ bne _080EAF4A\n\
+ b _080EB00C\n\
+ .align 2, 0\n\
+_080EAFAC: .4byte gEasyChatWordsAlphabetized\n\
+_080EAFB0: .4byte 0x0000feff\n\
+_080EAFB4: .4byte 0x0000ffff\n\
+_080EAFB8: .4byte 0x000001ff\n\
+_080EAFBC: .4byte gEasyChatStruct\n\
+_080EAFC0: .4byte 0x00000b78\n\
+_080EAFC4: .4byte 0x0000446c\n\
+_080EAFC8:\n\
+ lsrs r0, r4, 9\n\
+ ldr r3, _080EB030 @ =0x000001ff\n\
+ adds r2, r3, 0\n\
+ adds r1, r4, 0\n\
+ ands r1, r2\n\
+ bl sub_80EADC0\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _080EB00C\n\
+ ldr r0, _080EB034 @ =gEasyChatStruct\n\
+ ldr r2, [r0]\n\
+ mov r1, r9\n\
+ adds r0, r1, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ mov r9, r0\n\
+ lsls r1, 1\n\
+ lsls r0, r7, 4\n\
+ adds r0, r7\n\
+ lsls r0, 3\n\
+ subs r0, r7\n\
+ lsls r0, 2\n\
+ adds r1, r0\n\
+ ldr r3, _080EB038 @ =0x00000b78\n\
+ adds r0, r2, r3\n\
+ adds r0, r1\n\
+ strh r4, [r0]\n\
+ ldr r0, _080EB03C @ =0x0000446c\n\
+ adds r2, r0\n\
+ add r2, r10\n\
+ ldrh r0, [r2]\n\
+ adds r0, 0x1\n\
+ strh r0, [r2]\n\
+_080EB00C:\n\
+ ldr r1, [sp]\n\
+ cmp r6, r1\n\
+ bcs _080EB014\n\
+ b _080EAF14\n\
+_080EB014:\n\
+ ldr r3, [sp, 0x8]\n\
+ lsls r0, r3, 16\n\
+ lsrs r7, r0, 16\n\
+ cmp r7, 0x1A\n\
+ bhi _080EB020\n\
+ b _080EAEE4\n\
+_080EB020:\n\
+ add sp, 0x10\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\
+_080EB030: .4byte 0x000001ff\n\
+_080EB034: .4byte gEasyChatStruct\n\
+_080EB038: .4byte 0x00000b78\n\
+_080EB03C: .4byte 0x0000446c\n\
+ .syntax divided\n");
+}
+#else
+void sub_80EAECC(void)
+{
+ u16 i;
+ u16 r9;
+ u16 r6;
+ u16 r5;
+ bool8 r7;
+
+ for (i = 0; i < 27; i++)
+ {
+ u16 word = gEasyChatWordsByLetter[i];
+ u16 sp0 = gEasyChatWordsByLetter[i + 1];
+
+ gEasyChatStruct->unk4142[i] = 0;
+ r9 = 0;
+ r6 = word;
+ while (r6 < sp0)
+ {
+ u16 word = gEasyChatWordsAlphabetized[r6++];
+
+ if (word > 0xFEFF)
+ {
+ r5 = word & 0xFF;
+ r7 = FALSE;
+ while (--r5 != 0xFFFF)
+ {
+ word = gEasyChatWordsAlphabetized[r6++];
+ if (sub_80EADC0(EC_GROUP(word), EC_INDEX(word)) && !r7)
+ {
+ gEasyChatStruct->unkB78[i][r9++] = word;
+ gEasyChatStruct->unk4142[i]++;
+ r7 = TRUE;
+ }
+ }
+ }
+ else
+ {
+ if (sub_80EADC0(EC_GROUP(word), EC_INDEX(word)))
+ {
+ gEasyChatStruct->unkB78[i][r9++] = word;
+ gEasyChatStruct->unk4142[i]++;
+ }
+ }
+ }
+ }
+}
+#endif
+
+extern const u8 *const gEasyChatGroupWords[];
+extern const u16 *const gEasyChatGroupOrders[];
+extern const u8 gEasyChatGroupSizes[];
+
+// loads strings of all easy chat words except for the species and move names.
+void LoadEasyChatStrings(void)
+{
+ u16 group;
+ u16 index;
+
+ for (group = 0; group <= EC_GROUP_POKEMON_2; group++)
+ {
+ if (group != EC_GROUP_POKEMON_1
+ && group != EC_GROUP_POKEMON_2
+ && group != EC_GROUP_MOVE_1
+ && group != EC_GROUP_MOVE_2)
+ {
+ const u8 *wordText = gEasyChatGroupWords[group];
+
+ index = 0;
+ while (*wordText != EOS)
+ {
+ gEasyChatStruct->ecWordStrings[group][index] = wordText;
+
+ // Find the end of the current word
+ while (*wordText != EOS)
+ wordText++;
+ // Skip over the EOS
+ wordText++;
+
+ index++;
+ }
+ }
+ }
+}
+
+void sub_80EB0B0(void)
+{
+ const u16 *sp0;
+ u16 r7;
+ u16 r9;
+ u16 r8;
+
+ if (gEasyChatStruct->unk26 == 0)
+ {
+ u16 group = gEasyChatStruct->unk1B8;
+
+ gEasyChatStruct->unk4178[group] = 0;
+ r7 = 0;
+ r9 = 0;
+ sp0 = gEasyChatGroupOrders[group];
+ for (r8 = 0; r8 < gEasyChatGroupSizes[gEasyChatStruct->unk1B8]; r8++)
+ {
+ if (sub_80EADC0(group, sp0[r8]))
+ {
+ gEasyChatStruct->unk9A2A[r9][r7] = ((group & 0x7F) << 9) | (sp0[r8] & 0x1FF);
+ gEasyChatStruct->unk4178[group]++;
+ r7++;
+ if (r7 > 1)
+ {
+ r7 = 0;
+ r9++;
+ }
+ }
+ }
+ }
+ else
+ {
+ u8 r2 = gEasyChatStruct->unk1B8;
+ u16 r3 = 0;
+ u16 r6 = 0;
+ u16 r5;
+
+ for (r5 = 0; r5 < gEasyChatStruct->unk4142[r2]; r5++)
+ {
+ gEasyChatStruct->unk9A2A[r6][r3] = gEasyChatStruct->unkB78[r2][r5];
+ r3++;
+ if (r3 > 1)
+ {
+ r3 = 0;
+ r6++;
+ }
+ }
+ }
+}
+
+u8 *sub_80EB218(u8 *dest, u16 word, u16 c)
+{
+ u8 *wordText;
+
+ if (sub_80EB37C(word))
+ {
+ wordText = StringCopy(dest, gOtherText_ThreeQuestions);
+ }
+ else if (word == 0xFFFF)
+ {
+ wordText = dest;
+ wordText[0] = EOS; // Why? It's going to get overwritten.
+ }
+ else
+ {
+ u16 group = EC_GROUP(word);
+ u16 index = EC_INDEX(word);
+
+ switch (group)
+ {
+ case EC_GROUP_POKEMON_1:
+ case EC_GROUP_POKEMON_2:
+ wordText = StringCopy(dest, gSpeciesNames[index]);
+ break;
+ case EC_GROUP_MOVE_1:
+ case EC_GROUP_MOVE_2:
+ wordText = StringCopy(dest, gMoveNames[index]);
+ break;
+ default:
+ wordText = StringCopy(dest, gEasyChatStruct->ecWordStrings[group][index]);
+ break;
+ }
+ }
+
+ wordText[0] = EXT_CTRL_CODE_BEGIN;
+ wordText[1] = 0x13;
+ wordText[2] = c * 8;
+ wordText += 3;
+
+ *wordText = EOS;
+
+ return wordText;
+}
+
+u16 sub_80EB2D4(u16 word)
+{
+ const u8 *wordText;
+ u16 length;
+
+ if (sub_80EB37C(word))
+ {
+ return StringLength(gOtherText_ThreeQuestions);
+ }
+ else if (word == 0xFFFF)
+ {
+ return 0;
+ }
+ else
+ {
+ u16 group = EC_GROUP(word);
+ u16 index = EC_INDEX(word);
+
+ switch (group)
+ {
+ case EC_GROUP_POKEMON_1:
+ case EC_GROUP_POKEMON_2:
+ wordText = gSpeciesNames[index];
+ break;
+ case EC_GROUP_MOVE_1:
+ case EC_GROUP_MOVE_2:
+ wordText = gMoveNames[index];
+ break;
+ default:
+ wordText = gEasyChatStruct->ecWordStrings[group][index];
+ break;
+ }
+ }
+
+ length = 0;
+ while (*wordText != EOS)
+ {
+ wordText++;
+ length++;
+ }
+ return length;
+}
+
+bool8 sub_80EB37C(u16 word)
+{
+ const u16 *r4;
+ u16 i;
+
+ if (word == 0xFFFF)
+ {
+ return FALSE;
+ }
+ else
+ {
+ u16 group = EC_GROUP(word);
+ u16 index = EC_INDEX(word);
+
+ if (group <= EC_GROUP_POKEMON_2)
+ {
+ switch (group)
+ {
+ case EC_GROUP_POKEMON_1:
+ case EC_GROUP_POKEMON_2:
+ case EC_GROUP_MOVE_1:
+ case EC_GROUP_MOVE_2:
+ r4 = (u16 *)gEasyChatGroupWords[group];
+ for (i = 0; i < gEasyChatGroupSizes[group]; i++)
+ {
+ if (index == r4[i])
+ return FALSE;
+ }
+ break;
+ default:
+ if (index < gEasyChatGroupSizes[group])
+ return FALSE;
+ break;
+ }
+ }
+ return TRUE;
+ }
+}
+
+#if GERMAN
+u32 de_sub_80EB748(s32 group, s32 index)
+{
+ s32 i;
+ u16 *words;
+ u32 r7 = 0;
+
+ switch (group)
+ {
+ case EC_GROUP_POKEMON_1:
+ case EC_GROUP_POKEMON_2:
+ case EC_GROUP_MOVE_1:
+ case EC_GROUP_MOVE_2:
+ words = (u16 *)gEasyChatGroupWords[group];
+ for (i = 0; i < gEasyChatGroupSizes[group]; i++)
+ {
+ if (index == words[i])
+ {
+ r7 = i;
+ break;
+ }
+ }
+ break;
+ default:
+ r7 = index;
+ break;
+ }
+
+ return r7;
+}
+#endif
+
+// returns the end of the destination buffer text
+u8 *EasyChat_GetWordText(u8 *dst, u16 word)
+{
+ u16 group;
+ u16 wordIndex;
+ const u8 *src;
+ u16 i;
+
+ if (sub_80EB37C(word))
+ return StringCopy(dst, gOtherText_ThreeQuestions);
+
+ if (word == 0xFFFF)
+ {
+ *dst = EOS;
+ return dst;
+ }
+ else
+ {
+ group = EC_GROUP(word);
+ wordIndex = EC_INDEX(word);
+ switch (group)
+ {
+ case EC_GROUP_POKEMON_1: // 0
+ case EC_GROUP_POKEMON_2: // 21
+ dst = StringCopy(dst, gSpeciesNames[wordIndex]);
+ break;
+ case EC_GROUP_MOVE_1: // 18
+ case EC_GROUP_MOVE_2: // 19
+ dst = StringCopy(dst, gMoveNames[wordIndex]);
+ break;
+ default:
+ src = gEasyChatGroupWords[group];
+ for (i = wordIndex - 1; i != 0xFFFF; i--)
+ {
+ while (*src++ != EOS)
+ ;
+ }
+ dst = StringCopy(dst, src);
+ break;
+ }
+ *dst = EOS;
+ return dst;
+ }
+}
+
+u8 *ConvertEasyChatWordsToString(u8 *dst, u16 *words, u16 arg2, u16 arg3)
+{
+ u16 i;
+ u16 n;
+
+ const u16 i1 = arg2 - 1;
+
+ for (i = 0; i < arg3; i++)
+ {
+ u16 word;
+
+ for (n = 0; n < i1; n++)
+ {
+ dst = EasyChat_GetWordText(dst, words[0]);
+
+ if (words[0] != 0xFFFF)
+ {
+ dst[0] = CHAR_SPACE;
+ dst++;
+ }
+
+ words++;
+ }
+
+ word = words[0];
+ words++;
+ dst = EasyChat_GetWordText(dst, word);
+
+ dst[0] = CHAR_NEWLINE;
+ dst++;
+ }
+
+ dst--;
+ dst[0] = EOS;
+
+ return dst;
+}
+
+u8 *sub_80EB544(u8 *dst, u16 *words, u16 arg2, u16 arg3)
+{
+ u16 i;
+ u16 n;
+
+ const u16 i1 = arg2 - 1;
+
+ for (i = 0; i < arg3; i++)
+ {
+ u16 word;
+
+ for (n = 0; n < i1; n++)
+ {
+ dst = EasyChat_GetWordText(dst, words[0]);
+
+ if (words[0] != 0xFFFF)
+ {
+ dst[0] = CHAR_SPACE;
+ dst++;
+ }
+
+ words++;
+ }
+
+ word = words[0];
+ words++;
+ dst = EasyChat_GetWordText(dst, word);
+
+ // Only difference with ConvertEasyChatWordsToString
+ dst[0] = (i == 0) ? CHAR_NEWLINE : CHAR_PROMPT_SCROLL;
+ dst++;
+ }
+
+ dst--;
+ dst[0] = EOS;
+
+ return dst;
+}
+
+
+u16 unref_sub_80EB5E0(u16 arg0)
+{
+ const u8 *chars;
+ u16 i;
+ u16 length;
+ int group, word;
+
+
+ if (arg0 == 0xFFFF)
+ return 0;
+
+ group = EC_GROUP(arg0);
+ word = EC_INDEX(arg0);
+ switch (group)
+ {
+ case EC_GROUP_POKEMON_1: // 0
+ case EC_GROUP_POKEMON_2: // 21
+ chars = gSpeciesNames[word];
+ break;
+ case EC_GROUP_MOVE_1: // 18
+ case EC_GROUP_MOVE_2: // 19
+ chars = gMoveNames[word];
+ break;
+ default:
+ chars = gEasyChatGroupWords[group];
+ for (i = word - 1; i != 0xFFFF; i--)
+ {
+ while (*chars++ != EOS)
+ ;
+ }
+ break;
+ }
+
+ length = 0;
+ while (*chars != EOS)
+ {
+ chars++;
+ length++;
+ }
+
+ return length;
+}
+
+bool8 sub_80EB680(u16 *arg0, u16 arg1, u16 arg2, u16 arg3)
+{
+ return FALSE;
+}
+
+void unref_sub_80EB684(u8 arg0, u16 arg1)
+{
+ u16 *ptr;
+ u16 c;
+
+ // FIXME: find actual tv shows used
+ switch (arg0)
+ {
+ case 5:
+ c = 6;
+ ptr = (u16*)((void *)&gSaveBlock1.tvShows[arg1] + 0x04);
+ break;
+ case 7:
+ c = 2;
+ ptr = (u16*)((void *)&gSaveBlock1.tvShows[arg1] + 0x1C);
+ break;
+ case 8:
+ c = 1;
+ ptr = (u16*)((void *)&gSaveBlock1.tvShows[arg1] + 0x02);
+ break;
+ default:
+ return;
+ }
+
+ c -= 1;
+ while (c != 0xFFFF)
+ {
+ *ptr = -1;
+ ptr++;
+ c -= 1;
+ }
+}
+
+void sub_80EB6FC(u16 *arg0, u16 arg1)
+{
+ u16 i;
+
+ for (i = arg1 - 1; i != 0xFFFF; i--)
+ {
+ *arg0 = 0xFFFF;
+ arg0++;
+ }
+
+}
+
+u16 sub_80EB72C(u16 group)
+{
+ u16 local1 = Random() % gEasyChatGroupSizes[group];
+
+ if (group == EC_GROUP_POKEMON_1
+ || group == EC_GROUP_POKEMON_2
+ || group == EC_GROUP_MOVE_1
+ || group == EC_GROUP_MOVE_2)
+ {
+ local1 = ((u16 *) gEasyChatGroupWords[group])[local1];
+ }
+
+ return ((group & 0x7F) << 9) | (local1 & 0x1FF);
+}
+
+u16 sub_80EB784(u16 group)
+{
+ if (!sub_80EAD7C(group))
+ return -1;
+
+ if (group != EC_GROUP_POKEMON_1)
+ {
+ if (group == EC_GROUP_TRENDY_SAYING)
+ return sub_80EB960();
+ }
+ else
+ {
+ return sub_80EB9D8();
+ }
+
+ return sub_80EB72C(group);
+}
+
+void sub_80EB7C4(void)
+{
+ u16 *words;
+ u16 arg1, arg2;
+
+ switch (gSpecialVar_0x8004)
+ {
+ case 0:
+ words = gSaveBlock1.easyChats.unk2B1C;
+ arg1 = 2;
+ arg2 = 2;
+ break;
+ case 1:
+ words = gSaveBlock1.easyChats.unk2B28;
+ if (sub_80EB680(gSaveBlock1.easyChats.unk2B28, 3, 2, 20))
+ {
+ arg1 = 2;
+ arg2 = 3;
+ }
+ else
+ {
+ arg1 = 3;
+ arg2 = 2;
+ }
+ break;
+ case 2:
+ words = gSaveBlock1.easyChats.unk2B34;
+ arg1 = 3;
+ arg2 = 2;
+ break;
+ case 3:
+ words = gSaveBlock1.easyChats.unk2B40;
+ arg1 = 3;
+ arg2 = 2;
+ break;
+ default:
+ return;
+ }
+
+ ConvertEasyChatWordsToString(gStringVar4, words, arg1, arg2);
+ ShowFieldAutoScrollMessage(gStringVar4);
+}
+
+void BufferRandomHobbyOrLifestyleString(void)
+{
+ u16 group, local2;
+
+ if (Random() & 1)
+ group = EC_GROUP_HOBBIES;
+ else
+ group = EC_GROUP_LIFESTYLE;
+
+ local2 = sub_80EB784(group);
+ EasyChat_GetWordText(gStringVar2, local2);
+}
+
+u8 sub_80EB868(u8 arg0)
+{
+ int offset;
+ int index;
+
+ index = arg0 / 8;
+ offset = arg0 % 8;
+ return (gSaveBlock1.unk2D8C[index] >> offset) & 1;
+}
+
+void sub_80EB890(u8 arg0)
+{
+ int offset;
+ int index;
+
+ if (arg0 < 33)
+ {
+ index = arg0 / 8;
+ offset = arg0 % 8;
+ gSaveBlock1.unk2D8C[index] |= 1 << offset;
+ }
+}
+
+u8 sub_80EB8C0(void)
+{
+ u8 i, count;
+
+ for (i = 0, count = 0; i < 33; i++)
+ {
+ if (sub_80EB868(i))
+ count++;
+ }
+ return count;
+}
+
+u16 sub_80EB8EC(void)
+{
+ u16 i;
+ u16 local1, local2;
+
+ local1 = sub_80EB8C0();
+ if (local1 == 33)
+ return -1;
+
+ local2 = Random() % (33 - local1);
+ for (i = 0; i < 33; i++)
+ {
+ if (sub_80EB868(i) == 0)
+ {
+ if (local2 == 0)
+ {
+ sub_80EB890(i);
+ return (i & 0x1FF) | 0x2800;
+ }
+ local2--;
+ }
+ }
+ return -1;
+}
+
+static u16 sub_80EB960(void)
+{
+ u16 i;
+ u16 local1;
+
+ local1 = sub_80EB8C0();
+ if (local1 == 0)
+ return -1;
+
+ local1 = Random() % local1;
+ for (i = 0; i < 33; i++)
+ {
+ if (sub_80EB868(i))
+ {
+ if (local1 == 0)
+ return (i & 0x1FF) | 0x2800;
+ local1--;
+ }
+ }
+
+ return -1;
+}
+
+u8 sub_80EB9C8(void)
+{
+ return IsNationalPokedexEnabled();
+}
+
+static u16 sub_80EB9D8(void)
+{
+ u16 *speciesList;
+ u16 local1;
+ u16 i;
+
+ local1 = sub_80EAE88(0);
+
+ if (local1 == 0)
+ return -1;
+
+ local1 = Random() % local1;
+ speciesList = (u16 *)gEasyChatGroupWords[EC_GROUP_POKEMON_1];
+ for (i = 0; i < gEasyChatGroupSizes[EC_GROUP_POKEMON_1]; i++)
+ {
+ const u16 dexNum = SpeciesToNationalPokedexNum(*speciesList);
+ const u8 local2 = GetSetPokedexFlag(dexNum, 0);
+
+ if (local2)
+ {
+ if (local1 == 0)
+ return *speciesList & 0x1FF;
+ local1--;
+ }
+ speciesList++;
+ }
+ 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/engine/cable_car_util.c b/src/engine/cable_car_util.c
new file mode 100644
index 000000000..02bfbc195
--- /dev/null
+++ b/src/engine/cable_car_util.c
@@ -0,0 +1,47 @@
+#include "global.h"
+#include "cable_car_util.h"
+
+// static types
+
+// static declarations
+
+// rodata
+
+// text
+
+void CableCarUtil_FillWrapped(void *dest, u16 value, u8 left, u8 top, u8 width, u8 height)
+{
+ u8 i;
+ u8 j;
+ u8 x;
+ u8 y;
+
+ for (i = 0, y = top; i < height; i++)
+ {
+ for (x = left, j = 0; j < width; j++)
+ {
+ *(u16 *)&((u8 *)dest)[y * 64 + x * 2] = value;
+ x = (x + 1) % 32;
+ }
+ y = (y + 1) % 32;
+ }
+}
+
+void CableCarUtil_CopyWrapped(void *dest, const u16 *src, u8 left, u8 top, u8 width, u8 height)
+{
+ u8 i;
+ u8 j;
+ u8 x;
+ u8 y;
+ const u16 *_src;
+
+ for (i = 0, _src = src, y = top; i < height; i++)
+ {
+ for (x = left, j = 0; j < width; j++)
+ {
+ *(u16 *)&((u8 *)dest)[y * 64 + x * 2] = *_src++;
+ x = (x + 1) % 32;
+ }
+ y = (y + 1) % 32;
+ }
+}
diff --git a/src/engine/cable_club.c b/src/engine/cable_club.c
new file mode 100644
index 000000000..3187de7ed
--- /dev/null
+++ b/src/engine/cable_club.c
@@ -0,0 +1,924 @@
+#include "global.h"
+#include "battle.h"
+#include "battle_records.h"
+#include "cable_club.h"
+#include "field_message_box.h"
+#include "field_weather.h"
+#include "link.h"
+#include "load_save.h"
+#include "m4a.h"
+#include "main.h"
+#include "menu.h"
+#include "palette.h"
+#include "record_mixing.h"
+#include "overworld.h"
+#include "script.h"
+#include "script_pokemon_80C4.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "start_menu.h"
+#include "string_util.h"
+#include "strings2.h"
+#include "task.h"
+#include "text.h"
+#include "trainer_card.h"
+
+extern u16 gSpecialVar_Result;
+extern struct TrainerCard gTrainerCards[4];
+extern u8 gUnknown_03004860;
+extern u8 gFieldLinkPlayerCount;
+extern u16 gSpecialVar_0x8004;
+extern u16 gSpecialVar_0x8005;
+extern u16 gSpecialVar_0x8006;
+extern u16 gBattleTypeFlags;
+extern const u8 gUnknown_081A4932[];
+extern const u8 gUnknown_081A4975[];
+extern const u8 gUnknown_081A49B6[];
+extern const u8 gUnknown_081A490C[];
+extern struct
+{
+ u8 field0;
+ u8 field1;
+} gUnknown_020297D8;
+
+static void sub_8082F20(u8 taskId);
+static void sub_8082F68(u8 taskId);
+static void sub_8082FEC(u8 taskId);
+static void sub_808303C(u8 taskId);
+static void sub_80830E4(u8 taskId);
+static void sub_8083188(u8 taskId);
+static void sub_8083288(u8 taskId);
+static void sub_8083314(u8 taskId);
+static void sub_80833C4(u8 taskId);
+static void sub_80833EC(u8 taskId);
+static void sub_8083418(u8 taskId);
+static bool8 sub_8083444(u8 taskId);
+static void sub_808353C(u8 taskId);
+static void sub_8083710(u8 taskId);
+static void sub_8083760(u8 taskId);
+static void sub_80837B4(u8 taskId);
+static void sub_80837EC(u8 taskId);
+static void sub_808382C(u8 taskId);
+static void sub_8083958(void);
+static void sub_80839DC(u8 taskId);
+static void sub_8083AAC(u8 taskId);
+static void sub_8083B44(u8 taskId);
+static void sub_8083B6C(void);
+static void sub_8083CA4(u8 taskId);
+
+extern void sub_80831F8(u8 taskId);
+extern void Overworld_ResetMapMusic(void);
+extern void sub_810FEFC(void);
+extern void sub_8047CD8(void);
+extern void sub_805559C(void);
+extern void sub_8055574(void);
+extern s32 sub_80554F8(void);
+extern void sub_805465C(void);
+
+#ifdef GERMAN
+const u8 TrainerCardColorName_Bronze[] = _("BRONZE");
+const u8 TrainerCardColorName_Copper[] = _("KUPFER");
+const u8 TrainerCardColorName_Silver[] = _("SILBER");
+const u8 TrainerCardColorName_Gold[] = _("GOLD");
+#else
+const u8 TrainerCardColorName_Bronze[] = _("BRONZE");
+const u8 TrainerCardColorName_Copper[] = _("COPPER");
+const u8 TrainerCardColorName_Silver[] = _("SILVER");
+const u8 TrainerCardColorName_Gold[] = _("GOLD");
+#endif
+
+const u8 *const gTrainerCardColorNames[] =
+{
+ TrainerCardColorName_Bronze,
+ TrainerCardColorName_Copper,
+ TrainerCardColorName_Silver,
+ TrainerCardColorName_Gold,
+};
+
+static void sub_8082CD4(u8 arg0, u8 arg1)
+{
+ if (FindTaskIdByFunc(sub_8082F20) == 0xFF)
+ {
+ u8 taskId = CreateTask(sub_8082F20, 80);
+
+ gTasks[taskId].data[1] = arg0;
+ gTasks[taskId].data[2] = arg1;
+ }
+}
+
+static void sub_8082D18(u32 value)
+{
+ ConvertIntToDecimalStringN(gStringVar1, value, STR_CONV_MODE_LEFT_ALIGN, 1);
+ MenuDrawTextWindow(18, 10, 28, 13);
+ sub_8072BD8(gOtherText_PLink, 19, 11, 72);
+}
+
+static void sub_8082D4C()
+{
+ MenuZeroFillWindowRect(18, 10, 28, 13);
+}
+
+static void sub_8082D60(u8 taskId, u8 arg1)
+{
+ s16 *data = &gTasks[taskId].data[3];
+
+ if (arg1 != *data)
+ {
+ if (arg1 <= 1)
+ sub_8082D4C();
+ else
+ sub_8082D18(arg1);
+ *data = arg1;
+ }
+}
+
+static u32 sub_8082D9C(u8 minPlayers, u8 maxPlayers)
+{
+ int playerCount;
+
+ switch (GetLinkPlayerDataExchangeStatusTimed())
+ {
+ case EXCHANGE_COMPLETE:
+ playerCount = GetLinkPlayerCount_2();
+ if (minPlayers <= playerCount && playerCount <= maxPlayers)
+ return 1;
+ ConvertIntToDecimalStringN(gStringVar1, playerCount, STR_CONV_MODE_LEFT_ALIGN, 1);
+ return 4;
+ case EXCHANGE_TIMED_OUT:
+ return 0;
+ case EXCHANGE_IN_PROGRESS:
+ return 3;
+ default:
+ return 0;
+ }
+}
+
+static bool32 sub_8082DF4(u8 taskId)
+{
+ if (HasLinkErrorOccurred() == TRUE)
+ {
+ gTasks[taskId].func = sub_8083418;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool32 sub_8082E28(u8 taskId)
+{
+ if ((gMain.newKeys & B_BUTTON)
+ && IsLinkConnectionEstablished() == FALSE)
+ {
+ gTasks[taskId].func = sub_80833EC;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool32 sub_8082E6C(u8 taskId)
+{
+ if (IsLinkConnectionEstablished())
+ SetSuppressLinkErrorMessage(TRUE);
+
+ if (gMain.newKeys & B_BUTTON)
+ {
+ gTasks[taskId].func = sub_80833EC;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool32 sub_8082EB8(u8 taskId)
+{
+ if (GetSioMultiSI() == 1)
+ {
+ gTasks[taskId].func = sub_8083418;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void unref_sub_8082EEC(u8 taskId)
+{
+ gTasks[taskId].data[0]++;
+ if (gTasks[taskId].data[0] == 10)
+ {
+ sub_8007E9C(2);
+ DestroyTask(taskId);
+ }
+}
+
+static void sub_8082F20(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ if (data[0] == 0)
+ {
+ OpenLinkTimed();
+ sub_80082EC();
+ ResetLinkPlayers();
+ }
+ else if (data[0] > 9)
+ {
+ gTasks[taskId].func = sub_8082F68;
+ }
+ data[0]++;
+}
+
+static void sub_8082F68(u8 taskId)
+{
+ u32 playerCount = GetLinkPlayerCount_2();
+
+ if (sub_8082E28(taskId) == TRUE
+ || sub_8082E6C(taskId) == TRUE
+ || playerCount < 2)
+ return;
+
+ SetSuppressLinkErrorMessage(TRUE);
+ gTasks[taskId].data[3] = 0;
+ if (IsLinkMaster() == TRUE)
+ {
+ PlaySE(SE_PIN);
+ ShowFieldAutoScrollMessage(gUnknown_081A4932);
+ gTasks[taskId].func = sub_8082FEC;
+ }
+ else
+ {
+ PlaySE(SE_BOO);
+ ShowFieldAutoScrollMessage(gUnknown_081A49B6);
+ gTasks[taskId].func = sub_80831F8;
+ }
+}
+
+static void sub_8082FEC(u8 taskId)
+{
+ if (sub_8082E28(taskId) == TRUE
+ || sub_8082EB8(taskId) == TRUE
+ || sub_8082DF4(taskId) == TRUE)
+ return;
+
+ if (GetFieldMessageBoxMode() == FIELD_MESSAGE_BOX_HIDDEN)
+ {
+ gTasks[taskId].data[3] = 0;
+ gTasks[taskId].func = sub_808303C;
+ }
+}
+
+static void sub_808303C(u8 taskId)
+{
+ s16 *taskData = gTasks[taskId].data;
+ s32 linkPlayerCount = GetLinkPlayerCount_2();
+
+ if (sub_8082E28(taskId) == TRUE
+ || sub_8082EB8(taskId) == TRUE
+ || sub_8082DF4(taskId) == TRUE)
+ return;
+
+ sub_8082D60(taskId, linkPlayerCount);
+
+ if (!(gMain.newKeys & A_BUTTON))
+ return;
+
+#if ENGLISH
+ if (linkPlayerCount < taskData[1])
+ return;
+
+ sub_80081C8(linkPlayerCount);
+ sub_8082D4C();
+ ConvertIntToDecimalStringN(gStringVar1, linkPlayerCount, STR_CONV_MODE_LEFT_ALIGN, 1);
+ ShowFieldAutoScrollMessage((u8 *)gUnknown_081A4975);
+ gTasks[taskId].func = sub_80830E4;
+#elif GERMAN
+ if ((gLinkType == 0x2255 && (u32)linkPlayerCount > 1)
+ || (gLinkType != 0x2255 && taskData[1] <= linkPlayerCount))
+ {
+ sub_80081C8(linkPlayerCount);
+ sub_8082D4C();
+ ConvertIntToDecimalStringN(gStringVar1, linkPlayerCount, STR_CONV_MODE_LEFT_ALIGN, 1);
+ ShowFieldAutoScrollMessage((u8 *)gUnknown_081A4975);
+ gTasks[taskId].func = sub_80830E4;
+ }
+#endif
+}
+
+static void sub_80830E4(u8 taskId)
+{
+ if (sub_8082E28(taskId) == TRUE
+ || sub_8082EB8(taskId) == TRUE
+ || sub_8082DF4(taskId) == TRUE)
+ return;
+
+ if (GetFieldMessageBoxMode() == FIELD_MESSAGE_BOX_HIDDEN)
+ {
+ if (sub_800820C() != GetLinkPlayerCount_2())
+ {
+ ShowFieldAutoScrollMessage(gUnknown_081A4932);
+ gTasks[taskId].func = sub_8082FEC;
+ }
+ else if (gMain.heldKeys & B_BUTTON)
+ {
+ ShowFieldAutoScrollMessage(gUnknown_081A4932);
+ gTasks[taskId].func = sub_8082FEC;
+ }
+ else if (gMain.heldKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_8007F4C();
+ gTasks[taskId].func = sub_8083188;
+ }
+ }
+}
+
+static void sub_8083188(u8 taskId)
+{
+ u8 local1 = gTasks[taskId].data[1];
+ u8 local2 = gTasks[taskId].data[2];
+
+ if (sub_8082DF4(taskId) == TRUE
+ || sub_8083444(taskId) == TRUE)
+ return;
+
+ if (GetLinkPlayerCount_2() != sub_800820C())
+ {
+ gTasks[taskId].func = sub_8083418;
+ }
+ else
+ {
+ gSpecialVar_Result = sub_8082D9C(local1, local2);
+ if (gSpecialVar_Result != 0)
+ gTasks[taskId].func = sub_8083288;
+ }
+}
+
+void sub_80831F8(u8 taskId)
+{
+ u8 local1, local2;
+
+ local1 = gTasks[taskId].data[1];
+ local2 = gTasks[taskId].data[2];
+
+ if (sub_8082E28(taskId) == TRUE
+ || sub_8082DF4(taskId) == TRUE)
+ return;
+
+ gSpecialVar_Result = sub_8082D9C(local1, local2);
+ if (gSpecialVar_Result == 0)
+ return;
+ if (gSpecialVar_Result == 3)
+ {
+ sub_800832C();
+ HideFieldMessageBox();
+ gTasks[taskId].func = sub_80833C4;
+ }
+ else
+ {
+ gFieldLinkPlayerCount = GetLinkPlayerCount_2();
+ gUnknown_03004860 = GetMultiplayerId();
+ sub_80081C8(gFieldLinkPlayerCount);
+ sub_8093390((struct TrainerCard *)gBlockSendBuffer);
+ gTasks[taskId].func = sub_8083314;
+ }
+}
+
+static void sub_8083288(u8 taskId)
+{
+ if (sub_8082DF4(taskId) == TRUE)
+ return;
+
+ if (gSpecialVar_Result == 3)
+ {
+ sub_800832C();
+ HideFieldMessageBox();
+ gTasks[taskId].func = sub_80833C4;
+ }
+ else
+ {
+ gFieldLinkPlayerCount = GetLinkPlayerCount_2();
+ gUnknown_03004860 = GetMultiplayerId();
+ sub_80081C8(gFieldLinkPlayerCount);
+ sub_8093390((struct TrainerCard *)gBlockSendBuffer);
+ gTasks[taskId].func = sub_8083314;
+ sub_8007E9C(2);
+ }
+}
+
+static void sub_8083314(u8 taskId)
+{
+ u8 index;
+ struct TrainerCard *trainerCards;
+
+ if (sub_8082DF4(taskId) == TRUE)
+ return;
+
+ if (GetBlockReceivedStatus() != sub_8008198())
+ return;
+
+ index = 0;
+ trainerCards = gTrainerCards;
+ for (index = 0; index < GetLinkPlayerCount(); index++)
+ {
+ void *src;
+ src = gBlockRecvBuffer[index];
+ memcpy(&trainerCards[index], src, sizeof(struct TrainerCard));
+ }
+
+ SetSuppressLinkErrorMessage(FALSE);
+ ResetBlockReceivedFlags();
+ HideFieldMessageBox();
+
+ if (gSpecialVar_Result == 1)
+ {
+#if ENGLISH
+ u16 linkType;
+ linkType = gLinkType;
+ // FIXME: sub_8082D4C doesn't take any arguments
+ sub_8082D4C(0x4411, linkType);
+#elif GERMAN
+ if (gLinkType != 0x4411)
+ {
+ if (gLinkType == 0x6601)
+ deUnkValue2 = 1;
+ }
+ sub_8082D4C();
+#endif
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ return;
+ }
+
+ sub_800832C();
+ gTasks[taskId].func = sub_80833C4;
+}
+
+static void sub_80833C4(u8 taskId)
+{
+ if (gReceivedRemoteLinkPlayers == FALSE)
+ {
+ sub_8082D4C();
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ }
+}
+
+static void sub_80833EC(u8 taskId)
+{
+ gSpecialVar_Result = 5;
+ sub_8082D4C();
+ HideFieldMessageBox();
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+}
+
+static void sub_8083418(u8 taskId)
+{
+ gSpecialVar_Result = 6;
+ sub_8082D4C();
+ HideFieldMessageBox();
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+}
+
+static bool8 sub_8083444(u8 taskId)
+{
+ gTasks[taskId].data[4]++;
+ if (gTasks[taskId].data[4] > 600)
+ {
+ gTasks[taskId].func = sub_8083418;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void sub_808347C(u8 arg0)
+{
+ u32 r3 = 2;
+ u32 r2 = 2;
+
+ switch (gSpecialVar_0x8004)
+ {
+ case 1:
+ r3 = 2;
+ gLinkType = 0x2233;
+ break;
+ case 2:
+ r3 = 2;
+ gLinkType = 0x2244;
+ break;
+ case 5:
+ r3 = 4;
+ r2 = 4;
+ gLinkType = 0x2255;
+ break;
+ }
+
+ sub_8082CD4(r3, r2);
+}
+
+void sub_80834E4(void)
+{
+ gLinkType = 0x1133;
+ gBattleTypeFlags = 0;
+ sub_8082CD4(2, 2);
+}
+
+void sub_808350C(void)
+{
+ gSpecialVar_Result = 0;
+ gLinkType = 0x3311;
+ gBattleTypeFlags = 0;
+ sub_8082CD4(2, 4);
+}
+
+static void sub_808353C(u8 taskId)
+{
+ int playerCount;
+ int i;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (gSpecialVar_Result == 1)
+ {
+ playerCount = GetLinkPlayerCount();
+ for (i = 0; i < playerCount; i++)
+ {
+ if (gLinkPlayers[i].language == LANGUAGE_JAPANESE)
+ {
+ gSpecialVar_Result = 7;
+ sub_8008480();
+ gTasks[taskId].data[0] = 1;
+ return;
+ }
+ }
+ }
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ break;
+ case 1:
+ if (gReceivedRemoteLinkPlayers == FALSE)
+ {
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+void sub_80835D8(void)
+{
+ int taskId = FindTaskIdByFunc(sub_808353C);
+
+ if (taskId == 0xFF)
+ {
+ taskId = CreateTask(sub_808353C, 80);
+ gTasks[taskId].data[0] = 0;
+ }
+}
+
+void sub_8083614(void)
+{
+ gLinkType = 0x4411;
+ gBattleTypeFlags = 0;
+ sub_8082CD4(2, 4);
+}
+
+void sub_808363C(void)
+{
+ gLinkType = 0x6601;
+ gBattleTypeFlags = 0;
+ sub_8082CD4(4, 4);
+}
+
+u8 sub_8083664(void)
+{
+ if (FuncIsActiveTask(sub_8083710) != FALSE)
+ return 0xFF;
+
+ switch (gSpecialVar_0x8004)
+ {
+ case 1:
+ gLinkType = 0x2233;
+ break;
+ case 2:
+ gLinkType = 0x2244;
+ break;
+ case 5:
+ gLinkType = 0x2255;
+ break;
+ case 3:
+ gLinkType = 0x1111;
+ break;
+ case 4:
+ gLinkType = 0x3322;
+ break;
+ }
+
+ return CreateTask(sub_8083710, 80);
+}
+
+static void sub_8083710(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ if (data[0] == 0)
+ {
+ OpenLink();
+ ResetLinkPlayers();
+ CreateTask(sub_8083C50, 80);
+ }
+ else if (data[0] >= 10)
+ {
+ gTasks[taskId].func = sub_8083760;
+ }
+ data[0]++;
+}
+
+static void sub_8083760(u8 taskId)
+{
+ if (GetLinkPlayerCount_2() >= 2)
+ {
+ if (IsLinkMaster() == TRUE)
+ gTasks[taskId].func = sub_80837B4;
+ else
+ gTasks[taskId].func = sub_80837EC;
+ }
+}
+
+static void sub_80837B4(u8 taskId)
+{
+ if (sub_800820C() == GetLinkPlayerCount_2())
+ {
+ sub_8007F4C();
+ gTasks[taskId].func = sub_80837EC;
+ }
+}
+
+static void sub_80837EC(u8 taskId)
+{
+ if (gReceivedRemoteLinkPlayers == TRUE
+ && IsLinkPlayerDataExchangeComplete() == TRUE)
+ {
+ sub_800826C();
+ sub_8007B14();
+ DestroyTask(taskId);
+ }
+}
+
+void sub_8083820(void)
+{
+ ScrSpecial_DoSaveDialog();
+}
+
+static void sub_808382C(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ fade_screen(1, 0);
+ gLinkType = 0x2211;
+ ClearLinkCallback_2();
+ task->data[0]++;
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ task->data[0]++;
+ break;
+ case 2:
+ task->data[1]++;
+ if (task->data[1] > 20)
+ task->data[0]++;
+ break;
+ case 3:
+ sub_800832C();
+ task->data[0]++;
+ break;
+ case 4:
+ if (!gReceivedRemoteLinkPlayers)
+ task->data[0]++;
+ break;
+ case 5:
+ if (gLinkPlayers[0].trainerId & 1)
+ current_map_music_set__default_for_battle(BGM_BATTLE32);
+ else
+ current_map_music_set__default_for_battle(BGM_BATTLE20);
+
+ switch (gSpecialVar_0x8004)
+ {
+ case 1:
+ gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK;
+ break;
+ case 2:
+ gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE;
+ break;
+ case 5:
+ ReducePlayerPartyToThree();
+ gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI;
+ break;
+ }
+
+ SetMainCallback2(sub_800E7C4);
+ gMain.savedCallback = sub_8083958;
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+static void sub_8083958(void)
+{
+ Overworld_ResetMapMusic();
+ LoadPlayerParty();
+ SavePlayerBag();
+ sub_810FEFC();
+
+ if (gSpecialVar_0x8004 != 5)
+ UpdateLinkBattleRecords(gUnknown_03004860 ^ 1);
+
+ gMain.savedCallback = sub_805465C;
+ SetMainCallback2(sub_8071B28);
+}
+
+void sub_80839A4(void)
+{
+ if (gSpecialVar_0x8004 == 1 || gSpecialVar_0x8004 == 2 || gSpecialVar_0x8004 == 5)
+ {
+ LoadPlayerParty();
+ SavePlayerBag();
+ }
+ copy_saved_warp2_bank_and_enter_x_to_warp1(0x7F);
+}
+
+void sub_80839D0(void)
+{
+ sub_805559C();
+}
+
+static void sub_80839DC(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ ShowFieldMessage(gUnknown_081A490C);
+ task->data[0] = 1;
+ break;
+ case 1:
+ if (IsFieldMessageBoxHidden())
+ {
+ sub_8055574();
+ sub_8007270(gSpecialVar_0x8005);
+ task->data[0] = 2;
+ }
+ break;
+ case 2:
+ switch (sub_80554F8())
+ {
+ case 0:
+ break;
+ case 1:
+ HideFieldMessageBox();
+ task->data[0] = 0;
+ SwitchTaskToFollowupFunc(taskId);
+ break;
+ case 2:
+ task->data[0] = 3;
+ break;
+ }
+ break;
+ case 3:
+ sub_8055588();
+ HideFieldMessageBox();
+ MenuZeroFillScreen();
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+ break;
+ }
+}
+
+void sub_8083A84(TaskFunc followupFunc)
+{
+ u8 taskId = CreateTask(sub_80839DC, 80);
+ SetTaskFuncWithFollowupFunc(taskId, sub_80839DC, followupFunc);
+ ScriptContext1_Stop();
+}
+
+static void sub_8083AAC(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ ScriptContext2_Enable();
+ fade_screen(1, 0);
+ ClearLinkCallback_2();
+ task->data[0]++;
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ task->data[0]++;
+ break;
+ case 2:
+ gUnknown_020297D8.field0 = 0;
+ gUnknown_020297D8.field1 = 0;
+ m4aMPlayAllStop();
+ sub_800832C();
+ task->data[0]++;
+ break;
+ case 3:
+ if (!gReceivedRemoteLinkPlayers)
+ {
+ SetMainCallback2(sub_8047CD8);
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+static void sub_8083B44(u8 taskId)
+{
+ sub_8083B6C();
+ DestroyTask(taskId);
+}
+
+void sub_8083B5C(void)
+{
+ sub_8083A84(sub_8083B44);
+}
+
+static void sub_8083B6C(void)
+{
+ CreateTask(sub_8083AAC, 80);
+}
+
+void sub_8083B80(void)
+{
+ sub_8083B6C();
+ ScriptContext1_Stop();
+}
+
+void sub_8083B90(void)
+{
+ gLinkType = 0x2211;
+ sub_8083A84(sub_808382C);
+}
+
+void unref_sub_8083BB0(void)
+{
+ u8 taskId = CreateTask(sub_80839DC, 80);
+ SetTaskFuncWithFollowupFunc(taskId, sub_80839DC, Task_RecordMixing_Main);
+ ScriptContext1_Stop();
+}
+
+void sub_8083BDC(void)
+{
+ sub_8093130(gSpecialVar_0x8006, c2_exit_to_overworld_1_continue_scripts_restart_music);
+}
+
+bool32 sub_8083BF4(u8 linkPlayerIndex)
+{
+ u32 trainerCardColorIndex;
+
+ gSpecialVar_0x8006 = linkPlayerIndex;
+ StringCopy(gStringVar1, gLinkPlayers[linkPlayerIndex].name);
+
+ trainerCardColorIndex = sub_80934C4(linkPlayerIndex);
+ if (trainerCardColorIndex == 0)
+ return FALSE;
+
+ StringCopy(gStringVar2, gTrainerCardColorNames[trainerCardColorIndex - 1]);
+ return TRUE;
+}
+
+void sub_8083C50(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ task->data[0]++;
+ if (task->data[0] > 300)
+ {
+ CloseLink();
+ SetMainCallback2(CB2_LinkError);
+ DestroyTask(taskId);
+ }
+
+ if (gReceivedRemoteLinkPlayers)
+ DestroyTask(taskId);
+}
+
+static void sub_8083CA4(u8 taskId)
+{
+ if (!gReceivedRemoteLinkPlayers)
+ {
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ }
+}
+
+void unref_sub_8083CC8(u8 taskId)
+{
+ sub_800832C();
+ gTasks[taskId].func = sub_8083CA4;
+} \ No newline at end of file
diff --git a/src/clear_save_data_menu.c b/src/engine/clear_save_data_menu.c
index 498562fe0..12cde22a7 100644
--- a/src/clear_save_data_menu.c
+++ b/src/engine/clear_save_data_menu.c
@@ -4,7 +4,7 @@
#include "menu.h"
#include "palette.h"
#include "save.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "sprite.h"
#include "strings2.h"
diff --git a/src/clock.c b/src/engine/clock.c
index 1f2aac9fd..416aaa6bb 100644
--- a/src/clock.c
+++ b/src/engine/clock.c
@@ -7,7 +7,7 @@
#include "field_weather.h"
#include "lottery_corner.h"
#include "main.h"
-#include "rom4.h"
+#include "overworld.h"
#include "rtc.h"
#include "time_events.h"
#include "tv.h"
@@ -20,7 +20,7 @@ static void ReturnFromStartWallClock(void);
static void InitTimeBasedEvents(void)
{
- FlagSet(SYS_CLOCK_SET);
+ FlagSet(FLAG_SYS_CLOCK_SET);
RtcCalcLocalTime();
gSaveBlock2.lastBerryTreeUpdate = gLocalTime;
VarSet(VAR_DAYS, gLocalTime.days);
@@ -28,7 +28,7 @@ static void InitTimeBasedEvents(void)
void DoTimeBasedEvents(void)
{
- if (FlagGet(SYS_CLOCK_SET))
+ if (FlagGet(FLAG_SYS_CLOCK_SET))
{
RtcCalcLocalTime();
UpdatePerDay(&gLocalTime);
@@ -45,7 +45,7 @@ static void UpdatePerDay(struct Time *time)
if (days != time->days && days <= time->days)
{
newDays = time->days - days;
- ClearUpperFlags();
+ ClearDailyFlags();
UpdateDewfordTrendPerDay(newDays);
UpdateTVShowsPerDay(newDays);
UpdateWeatherPerDay(newDays);
@@ -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..69edf01aa 100644
--- a/src/decompress.c
+++ b/src/engine/decompress.c
@@ -1,12 +1,13 @@
#include "global.h"
#include "decompress.h"
#include "data2.h"
-#include "species.h"
+#include "constants/species.h"
#include "text.h"
+#include "ewram.h"
-#define WRAM 0x02000000
+#define WRAM ewram_addr // using gSharedMem doesn't match
-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..28323207c 100644
--- a/src/link.c
+++ b/src/engine/link.c
@@ -7,14 +7,15 @@
#include "main.h"
#include "menu.h"
#include "palette.h"
-#include "rng.h"
+#include "random.h"
#include "save.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "sprite.h"
#include "strings2.h"
#include "task.h"
#include "text.h"
+#include "ewram.h"
#define SIO_MULTI_CNT ((struct SioMultiCnt *)REG_ADDR_SIOCNT)
@@ -35,8 +36,6 @@ struct LinkTestBGInfo
u32 dummy_C;
};
-extern u8 unk_2000000[];
-extern u8 unk_2004000[];
extern u16 gBattleTypeFlags;
extern u16 word_3004858;
@@ -404,7 +403,7 @@ static void LinkTestProcessKeyInput(void)
if (gMain.newKeys & A_BUTTON)
gShouldAdvanceLinkState = 1;
if (gMain.heldKeys & B_BUTTON)
- InitBlockSend(unk_2004000, 0x2004);
+ InitBlockSend(ewram4000, 0x2004);
if (gMain.newKeys & L_BUTTON)
BeginNormalPaletteFade(-1, 0, 0x10, 0, 2);
if (gMain.newKeys & START_BUTTON)
@@ -507,7 +506,7 @@ static void ProcessRecvCmds(u8 unusedParam)
case 0x8888:
if (sBlockRecv[i].size > BLOCK_BUFFER_SIZE)
{
- u16 *buffer = (u16 *)unk_2000000;
+ u16 *buffer = (u16 *)gSharedMem;
u16 j;
for (j = 0; j < CMD_LENGTH - 1; j++)
buffer[(sBlockRecv[i].pos / 2) + j] = gRecvCmds[j + 1][i];
@@ -636,7 +635,7 @@ static void BuildSendCmd(u16 code)
break;
case 0xAAAB:
gSendCmd[0] = 0xAAAB;
- gSendCmd[1] = gScriptItemId;
+ gSendCmd[1] = gSpecialVar_ItemId;
break;
case 0xCCCC:
gSendCmd[0] = 0xCCCC;
@@ -954,7 +953,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 730aea2b8..8424b1121 100644
--- a/src/load_save.c
+++ b/src/engine/load_save.c
@@ -3,7 +3,7 @@
#include "load_save.h"
#include "main.h"
#include "pokemon.h"
-#include "rom4.h"
+#include "overworld.h"
extern u8 gPlayerPartyCount;
diff --git a/src/main.c b/src/engine/main.c
index afaa0e77a..82a5fffb4 100644
--- a/src/main.c
+++ b/src/engine/main.c
@@ -7,9 +7,9 @@
#include "load_save.h"
#include "m4a.h"
#include "play_time.h"
-#include "rng.h"
+#include "random.h"
#include "rom3.h"
-#include "rom4.h"
+#include "overworld.h"
#include "rtc.h"
#include "siirtc.h"
#include "sound.h"
@@ -70,6 +70,7 @@ bool8 gLinkVSyncDisabled;
u32 IntrMain_Buffer[0x200];
u8 gPcmDmaCounter;
+EWRAM_DATA u8 gSharedMem[0x20000] = {0};
EWRAM_DATA void (**gFlashTimerIntrFunc)(void) = NULL;
static void UpdateLinkAndCallCallbacks(void);
diff --git a/src/main_menu.c b/src/engine/main_menu.c
index 3b616065b..909b5676b 100644
--- a/src/main_menu.c
+++ b/src/engine/main_menu.c
@@ -10,18 +10,19 @@
#include "option_menu.h"
#include "palette.h"
#include "pokeball.h"
-#include "rom4.h"
+#include "overworld.h"
#include "rtc.h"
#include "save_menu_util.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
-#include "species.h"
+#include "constants/species.h"
#include "string_util.h"
#include "strings.h"
#include "task.h"
#include "text.h"
#include "title_screen.h"
#include "unknown_task.h"
+#include "ewram.h"
#define BirchSpeechUpdateWindowText() ((u8)MenuUpdateWindowText_OverrideLineLength(24))
@@ -29,8 +30,6 @@ extern struct PaletteFadeControl gPaletteFade;
extern u16 gSaveFileStatus;
-extern u16 gMainMenuPalette[];
-
extern const u8 gBirchSpeech_Welcome[];
extern const u8 gBirchSpeech_ThisIsPokemon[];
extern const u8 gBirchSpeech_WorldInhabitedByPokemon[];
@@ -42,46 +41,22 @@ extern u8 gBirchSpeech_AhOkayYouArePlayer[];
extern u8 gBirchSpeech_AreYouReady[];
extern struct SpriteTemplate gUnknown_02024E8C;
-extern u16 gUnknown_081E795C[];
extern const struct MenuAction gUnknown_081E79B0[];
extern const struct MenuAction gMalePresetNames[];
extern const struct MenuAction gFemalePresetNames[];
-extern const u8 gUnknown_081E764C[];
-extern const u8 gBirchIntroShadowGfx[];
extern const u8 gUnknown_081E7834[];
-extern const u8 gUnknown_081E796C[];
extern const union AffineAnimCmd *const gSpriteAffineAnimTable_81E79AC[];
-extern u8 unk_2000000[];
-
-//Task data
-enum {
- TD_MENULAYOUT,
- TD_SELECTEDMENUITEM,
-};
-
//Menu layouts
-enum {
+enum
+{
HAS_NO_SAVED_GAME, //NEW GAME, OPTION
HAS_SAVED_GAME, //CONTINUE, NEW GAME, OPTION
HAS_MYSTERY_GIFT, //CONTINUE, NEW GAME, MYSTERY EVENTS, OPTION
};
-//Task data
-enum {
- TD_TRAINER_SPRITE_ID = 2, //Trainer sprite being displayed during gender menu
- TD_BGHOFS = 4, //Used to set REG_BG1HOFS and slide the platform around
- TD_SUBTASK_DONE, //Set to true if the spawned task has finished
- TD_GENDER_SELECTION,
- TD_COUNTER,
- TD_BIRCH_SPRITE_ID,
- TD_AZURILL_SPRITE_ID,
- TD_BRENDAN_SPRITE_ID,
- TD_MAY_SPRITE_ID
-};
-
static void CB2_MainMenu(void);
static void VBlankCB_MainMenu(void);
static void CB2_InitMainMenuFromOptions(void);
@@ -155,6 +130,53 @@ static void CreateNameMenu(u8 left, u8 top);
static s8 NameMenuProcessInput(void);
static void SetPresetPlayerName(u8 index);
+static const u16 gUnknown_081E764C[][16] =
+{
+ INCBIN_U16("graphics/birch_speech/bg0.gbapal"),
+ INCBIN_U16("graphics/birch_speech/bg1.gbapal"),
+};
+
+static const u8 gBirchIntroShadowGfx[] = INCBIN_U8("graphics/birch_speech/shadow.4bpp.lz");
+static const u8 gUnknown_081E7834[] = INCBIN_U8("graphics/birch_speech/map.bin.lz");
+static const u16 gUnknown_081E795C[] = INCBIN_U16("graphics/birch_speech/bg2.gbapal");
+static const u16 gUnknown_081E796C[] = INCBIN_U16("graphics/birch_speech/blank_pal.gbapal");
+static const u16 gMainMenuPalette[] = INCBIN_U16("graphics/misc/main_menu.gbapal");
+
+static const union AffineAnimCmd gSpriteAffineAnim_81E799C[] =
+{
+ AFFINEANIMCMD_FRAME(0xFFFE, 0xFFFE, 0, 48),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd *const gSpriteAffineAnimTable_81E79AC[] =
+{
+ gSpriteAffineAnim_81E799C,
+};
+
+static const struct MenuAction gUnknown_081E79B0[] =
+{
+ {gBirchText_Boy, NULL},
+ {gBirchText_Girl, NULL},
+};
+
+static const struct MenuAction gMalePresetNames[] =
+{
+ {gBirchText_NewName, NULL},
+ {gDefaultBoyName1, NULL},
+ {gDefaultBoyName2, NULL},
+ {gDefaultBoyName3, NULL},
+ {gDefaultBoyName4, NULL},
+};
+
+static const struct MenuAction gFemalePresetNames[] =
+{
+ {gBirchText_NewName, NULL},
+ {gDefaultGirlName1, NULL},
+ {gDefaultGirlName2, NULL},
+ {gDefaultGirlName3, NULL},
+ {gDefaultGirlName4, NULL},
+};
+
static void CB2_MainMenu(void)
{
RunTasks();
@@ -180,6 +202,9 @@ static void CB2_InitMainMenuFromOptions(void)
InitMainMenu(TRUE);
}
+#define tMenuLayout data[0]
+#define tMenuSelection data[1]
+
u32 InitMainMenu(u8 a1)
{
u16 savedIme;
@@ -239,7 +264,7 @@ u32 InitMainMenu(u8 a1)
| DISPCNT_WIN0_ON;
taskId = CreateTask(Task_MainMenuCheckSave, 0);
- gTasks[taskId].data[TD_SELECTEDMENUITEM] = 0;
+ gTasks[taskId].tMenuSelection = 0;
return 0;
}
@@ -261,9 +286,9 @@ void Task_MainMenuCheckSave(u8 taskId)
{
case 1:
if (IsMysteryGiftEnabled() == TRUE)
- gTasks[taskId].data[TD_MENULAYOUT] = HAS_MYSTERY_GIFT;
+ gTasks[taskId].tMenuLayout = HAS_MYSTERY_GIFT;
else
- gTasks[taskId].data[TD_MENULAYOUT] = HAS_SAVED_GAME;
+ gTasks[taskId].tMenuLayout = HAS_SAVED_GAME;
gTasks[taskId].func = Task_MainMenuCheckRtc;
break;
@@ -272,7 +297,7 @@ void Task_MainMenuCheckSave(u8 taskId)
MenuPrintMessage(gSaveFileDeletedMessage, 3, 15);
REG_WIN0H = WIN_RANGE(17, 223);
REG_WIN0V = WIN_RANGE(113, 159);
- gTasks[taskId].data[TD_MENULAYOUT] = HAS_NO_SAVED_GAME;
+ gTasks[taskId].tMenuLayout = HAS_NO_SAVED_GAME;
gTasks[taskId].func = Task_MainMenuWaitForSaveErrorAck;
break;
case 255:
@@ -280,17 +305,17 @@ void Task_MainMenuCheckSave(u8 taskId)
MenuPrintMessage(gSaveFileCorruptMessage, 3, 15);
REG_WIN0H = WIN_RANGE(17, 223);
REG_WIN0V = WIN_RANGE(113, 159);
- gTasks[taskId].data[TD_MENULAYOUT] = HAS_SAVED_GAME;
+ gTasks[taskId].tMenuLayout = HAS_SAVED_GAME;
gTasks[taskId].func = Task_MainMenuWaitForSaveErrorAck;
if (IsMysteryGiftEnabled() == TRUE)
- gTasks[taskId].data[TD_MENULAYOUT] = HAS_MYSTERY_GIFT;
+ gTasks[taskId].tMenuLayout = HAS_MYSTERY_GIFT;
else
- gTasks[taskId].data[TD_MENULAYOUT] = HAS_SAVED_GAME;
+ gTasks[taskId].tMenuLayout = HAS_SAVED_GAME;
break;
case 0:
default:
- gTasks[taskId].data[TD_MENULAYOUT] = HAS_NO_SAVED_GAME;
+ gTasks[taskId].tMenuLayout = HAS_NO_SAVED_GAME;
gTasks[taskId].func = Task_MainMenuCheckRtc;
break;
case 4:
@@ -298,7 +323,7 @@ void Task_MainMenuCheckSave(u8 taskId)
MenuPrintMessage(gBoardNotInstalledMessage, 3, 15);
REG_WIN0H = WIN_RANGE(17, 223);
REG_WIN0V = WIN_RANGE(113, 159);
- gTasks[taskId].data[TD_MENULAYOUT] = HAS_NO_SAVED_GAME;
+ gTasks[taskId].tMenuLayout = HAS_NO_SAVED_GAME;
gTasks[taskId].func = Task_MainMenuWaitForSaveErrorAck;
return;
}
@@ -383,7 +408,7 @@ void Task_MainMenuDraw(u8 taskId)
LoadPalette(&palette, 241, 2);
}
- switch (gTasks[taskId].data[TD_MENULAYOUT])
+ switch (gTasks[taskId].tMenuLayout)
{
case HAS_NO_SAVED_GAME:
default:
@@ -420,7 +445,7 @@ void Task_MainMenuDraw(u8 taskId)
void Task_MainMenuHighlight(u8 taskId)
{
- HighlightCurrentMenuItem(gTasks[taskId].data[TD_MENULAYOUT], gTasks[taskId].data[TD_SELECTEDMENUITEM]);
+ HighlightCurrentMenuItem(gTasks[taskId].tMenuLayout, gTasks[taskId].tMenuSelection);
gTasks[taskId].func = Task_MainMenuProcessKeyInput;
}
@@ -444,7 +469,7 @@ bool8 MainMenuProcessKeyInput(u8 taskId)
{
s32 menuItemCount;
- switch (gTasks[taskId].data[TD_MENULAYOUT])
+ switch (gTasks[taskId].tMenuLayout)
{
case HAS_NO_SAVED_GAME:
default:
@@ -460,17 +485,17 @@ bool8 MainMenuProcessKeyInput(u8 taskId)
if (gMain.newKeys & DPAD_UP)
{
- if (gTasks[taskId].data[TD_SELECTEDMENUITEM] > 0)
+ if (gTasks[taskId].tMenuSelection > 0)
{
- gTasks[taskId].data[TD_SELECTEDMENUITEM]--;
+ gTasks[taskId].tMenuSelection--;
return TRUE;
}
}
if (gMain.newKeys & DPAD_DOWN)
{
- if (gTasks[taskId].data[TD_SELECTEDMENUITEM] < menuItemCount - 1)
+ if (gTasks[taskId].tMenuSelection < menuItemCount - 1)
{
- gTasks[taskId].data[TD_SELECTEDMENUITEM]++;
+ gTasks[taskId].tMenuSelection++;
return TRUE;
}
}
@@ -499,11 +524,11 @@ void Task_MainMenuPressedA(u8 taskId)
if (gPaletteFade.active)
return;
- switch (gTasks[taskId].data[TD_MENULAYOUT])
+ switch (gTasks[taskId].tMenuLayout)
{
case HAS_NO_SAVED_GAME:
default:
- switch (gTasks[taskId].data[TD_SELECTEDMENUITEM])
+ switch (gTasks[taskId].tMenuSelection)
{
case 0:
default:
@@ -515,7 +540,7 @@ void Task_MainMenuPressedA(u8 taskId)
}
break;
case HAS_SAVED_GAME:
- switch (gTasks[taskId].data[TD_SELECTEDMENUITEM])
+ switch (gTasks[taskId].tMenuSelection)
{
case 0:
default:
@@ -530,7 +555,7 @@ void Task_MainMenuPressedA(u8 taskId)
}
break;
case HAS_MYSTERY_GIFT:
- switch (gTasks[taskId].data[TD_SELECTEDMENUITEM])
+ switch (gTasks[taskId].tMenuSelection)
{
case 0:
default:
@@ -584,6 +609,9 @@ void Task_MainMenuPressedB(u8 taskId)
}
}
+#undef tMenuLayout
+#undef tMenuSelection
+
void HighlightCurrentMenuItem(u8 layout, u8 menuItem)
{
REG_WIN0H = WIN_RANGE(9, 231);
@@ -710,6 +738,16 @@ void PrintBadgeCount(void)
MenuPrint_PixelCoords(buffer, 205, 40, 1);
}
+#define tTrainerSpriteId data[2]
+#define tBGhofs data[4]
+#define tSubtaskIsDone data[5]
+#define tGenderSelection data[6]
+#define tFrameCounter data[7]
+#define tBirchSpriteId data[8]
+#define tAzurillSpriteId data[9]
+#define tBrendanSpriteId data[10]
+#define tMaySpriteId data[11]
+
static void Task_NewGameSpeech1(u8 taskId)
{
SetUpWindowConfig(&gWindowConfig_81E6C3C);
@@ -732,25 +770,25 @@ static void Task_NewGameSpeech1(u8 taskId)
BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
REG_BG1CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256;
REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP;
- gTasks[taskId].data[TD_BGHOFS] = 0;
+ gTasks[taskId].tBGhofs = 0;
gTasks[taskId].func = Task_NewGameSpeech2;
- gTasks[taskId].data[TD_TRAINER_SPRITE_ID] = 0xFF;
+ gTasks[taskId].tTrainerSpriteId = 0xFF;
gTasks[taskId].data[3] = 0xFF;
- gTasks[taskId].data[TD_COUNTER] = 216; //Wait 3.6 seconds (216 frames) before starting speech
+ gTasks[taskId].tFrameCounter = 216; //Wait 3.6 seconds (216 frames) before starting speech
PlayBGM(BGM_DOORO_X4);
}
static void Task_NewGameSpeech2(u8 taskId)
{
- if (gTasks[taskId].data[TD_COUNTER] != 0)
+ if (gTasks[taskId].tFrameCounter != 0)
{
- gTasks[taskId].data[TD_COUNTER]--;
+ gTasks[taskId].tFrameCounter--;
}
else
{
//Initialize Birch sprite
- u8 spriteId = gTasks[taskId].data[TD_BIRCH_SPRITE_ID];
+ u8 spriteId = gTasks[taskId].tBirchSpriteId;
gSprites[spriteId].pos1.x = 136;
gSprites[spriteId].pos1.y = 60;
@@ -758,19 +796,19 @@ static void Task_NewGameSpeech2(u8 taskId)
gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND;
StartSpriteFadeIn(taskId, 10);
StartBackgroundFadeIn(taskId, 20);
- gTasks[taskId].data[TD_COUNTER] = 80;
+ gTasks[taskId].tFrameCounter = 80;
gTasks[taskId].func = Task_NewGameSpeech3;
}
}
static void Task_NewGameSpeech3(u8 taskId)
{
- if (gTasks[taskId].data[TD_SUBTASK_DONE] != FALSE)
+ if (gTasks[taskId].tSubtaskIsDone)
{
- gSprites[gTasks[taskId].data[TD_BIRCH_SPRITE_ID]].oam.objMode = ST_OAM_OBJ_NORMAL;
- if (gTasks[taskId].data[TD_COUNTER])
+ gSprites[gTasks[taskId].tBirchSpriteId].oam.objMode = ST_OAM_OBJ_NORMAL;
+ if (gTasks[taskId].tFrameCounter)
{
- gTasks[taskId].data[TD_COUNTER]--;
+ gTasks[taskId].tFrameCounter--;
}
else
{
@@ -801,15 +839,15 @@ static void Task_NewGameSpeech5(u8 taskId)
static void Task_NewGameSpeech6(u8 taskId)
{
- u8 spriteId = gTasks[taskId].data[TD_AZURILL_SPRITE_ID];
+ u8 spriteId = gTasks[taskId].tAzurillSpriteId;
gSprites[spriteId].pos1.x = 104;
gSprites[spriteId].pos1.y = 72;
gSprites[spriteId].invisible = 0;
- gSprites[spriteId].data0 = 0;
+ gSprites[spriteId].data[0] = 0;
CreatePokeballSprite(spriteId, gSprites[spriteId].oam.paletteNum, 0x70, 0x3A, 0, 0, 0x20, 0x0000FFFF);
gTasks[taskId].func = Task_NewGameSpeech7;
- gTasks[taskId].data[TD_COUNTER] = 0;
+ gTasks[taskId].tFrameCounter = 0;
}
static void Task_NewGameSpeech7(u8 taskId)
@@ -817,18 +855,18 @@ static void Task_NewGameSpeech7(u8 taskId)
if (IsCryFinished())
{
//Go on to next sentence after frame 95
- if (gTasks[taskId].data[TD_COUNTER] > 95)
+ if (gTasks[taskId].tFrameCounter > 95)
{
MenuSetText(gSystemText_NewPara);
gTasks[taskId].func = Task_NewGameSpeech8;
}
}
- if (gTasks[taskId].data[TD_COUNTER] < 16384)
+ if (gTasks[taskId].tFrameCounter < 16384)
{
- gTasks[taskId].data[TD_COUNTER]++;
+ gTasks[taskId].tFrameCounter++;
//Play Azurill cry at frame 32
- if (gTasks[taskId].data[TD_COUNTER] == 32)
+ if (gTasks[taskId].tFrameCounter == 32)
PlayCry1(SPECIES_AZURILL, 0);
}
}
@@ -859,11 +897,11 @@ static void Task_NewGameSpeech10(u8 taskId)
{
if (BirchSpeechUpdateWindowText())
{
- gSprites[gTasks[taskId].data[TD_BIRCH_SPRITE_ID]].oam.objMode = ST_OAM_OBJ_BLEND;
- gSprites[gTasks[taskId].data[TD_AZURILL_SPRITE_ID]].oam.objMode = ST_OAM_OBJ_BLEND;
+ gSprites[gTasks[taskId].tBirchSpriteId].oam.objMode = ST_OAM_OBJ_BLEND;
+ gSprites[gTasks[taskId].tAzurillSpriteId].oam.objMode = ST_OAM_OBJ_BLEND;
StartSpriteFadeOut(taskId, 2);
StartBackgroundFadeOut(taskId, 1);
- gTasks[taskId].data[TD_COUNTER] = 64;
+ gTasks[taskId].tFrameCounter = 64;
gTasks[taskId].func = Task_NewGameSpeech11;
}
}
@@ -871,41 +909,41 @@ static void Task_NewGameSpeech10(u8 taskId)
//Slide platform away to the right
static void Task_NewGameSpeech11(u8 taskId)
{
- if (gTasks[taskId].data[TD_BGHOFS] != -60)
+ if (gTasks[taskId].tBGhofs != -60)
{
- gTasks[taskId].data[TD_BGHOFS] -= 2;
- REG_BG1HOFS = gTasks[taskId].data[TD_BGHOFS];
+ gTasks[taskId].tBGhofs -= 2;
+ REG_BG1HOFS = gTasks[taskId].tBGhofs;
}
else
{
- gTasks[taskId].data[TD_BGHOFS] = -60;
+ gTasks[taskId].tBGhofs = -60;
gTasks[taskId].func = Task_NewGameSpeech12;
}
}
static void Task_NewGameSpeech12(u8 taskId)
{
- if (gTasks[taskId].data[TD_SUBTASK_DONE])
+ if (gTasks[taskId].tSubtaskIsDone)
{
//Hide Birch and Azurill
- gSprites[gTasks[taskId].data[TD_BIRCH_SPRITE_ID]].invisible = TRUE;
- gSprites[gTasks[taskId].data[TD_AZURILL_SPRITE_ID]].invisible = TRUE;
+ gSprites[gTasks[taskId].tBirchSpriteId].invisible = TRUE;
+ gSprites[gTasks[taskId].tAzurillSpriteId].invisible = TRUE;
- if (gTasks[taskId].data[TD_COUNTER])
+ if (gTasks[taskId].tFrameCounter)
{
- gTasks[taskId].data[TD_COUNTER]--;
+ gTasks[taskId].tFrameCounter--;
}
else
{
//Initialize Brendan sprite
- u8 spriteId = gTasks[taskId].data[TD_BRENDAN_SPRITE_ID];
+ u8 spriteId = gTasks[taskId].tBrendanSpriteId;
gSprites[spriteId].pos1.x = 180;
gSprites[spriteId].pos1.y = 60;
gSprites[spriteId].invisible = FALSE;
gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND;
- gTasks[taskId].data[TD_TRAINER_SPRITE_ID] = spriteId;
- gTasks[taskId].data[TD_GENDER_SELECTION] = 0;
+ gTasks[taskId].tTrainerSpriteId = spriteId;
+ gTasks[taskId].tGenderSelection = 0;
StartSpriteFadeIn(taskId, 2);
StartBackgroundFadeIn(taskId, 1);
gTasks[taskId].func = Task_NewGameSpeech13;
@@ -915,9 +953,9 @@ static void Task_NewGameSpeech12(u8 taskId)
static void Task_NewGameSpeech13(u8 taskId)
{
- if (gTasks[taskId].data[TD_SUBTASK_DONE])
+ if (gTasks[taskId].tSubtaskIsDone)
{
- gSprites[gTasks[taskId].data[TD_TRAINER_SPRITE_ID]].oam.objMode = ST_OAM_OBJ_NORMAL;
+ gSprites[gTasks[taskId].tTrainerSpriteId].oam.objMode = ST_OAM_OBJ_NORMAL;
gTasks[taskId].func = Task_NewGameSpeech14;
}
}
@@ -964,11 +1002,11 @@ static void Task_NewGameSpeech16(u8 taskId)
cursorPos = GetMenuCursorPos();
- if (cursorPos != gTasks[taskId].data[TD_GENDER_SELECTION])
+ if (cursorPos != gTasks[taskId].tGenderSelection)
{
//Menu selection changed. Slide Brendan or May out and slide the other in
- gTasks[taskId].data[TD_GENDER_SELECTION] = cursorPos;
- gSprites[gTasks[taskId].data[TD_TRAINER_SPRITE_ID]].oam.objMode = ST_OAM_OBJ_BLEND;
+ gTasks[taskId].tGenderSelection = cursorPos;
+ gSprites[gTasks[taskId].tTrainerSpriteId].oam.objMode = ST_OAM_OBJ_BLEND;
StartSpriteFadeOut(taskId, 0);
gTasks[taskId].func = Task_NewGameSpeech17;
}
@@ -977,9 +1015,9 @@ static void Task_NewGameSpeech16(u8 taskId)
//Slide old trainer sprite off right of screen
static void Task_NewGameSpeech17(u8 taskId)
{
- u8 spriteId = gTasks[taskId].data[TD_TRAINER_SPRITE_ID];
+ u8 spriteId = gTasks[taskId].tTrainerSpriteId;
- if (gTasks[taskId].data[TD_SUBTASK_DONE] == FALSE)
+ if (gTasks[taskId].tSubtaskIsDone == FALSE)
{
gSprites[spriteId].pos1.x += 4; //Move sprite right
}
@@ -988,14 +1026,14 @@ static void Task_NewGameSpeech17(u8 taskId)
gSprites[spriteId].invisible = TRUE;
//Set up new trainer sprite
- if (gTasks[taskId].data[TD_GENDER_SELECTION])
- spriteId = gTasks[taskId].data[TD_MAY_SPRITE_ID];
+ if (gTasks[taskId].tGenderSelection)
+ spriteId = gTasks[taskId].tMaySpriteId;
else
- spriteId = gTasks[taskId].data[TD_BRENDAN_SPRITE_ID];
+ spriteId = gTasks[taskId].tBrendanSpriteId;
gSprites[spriteId].pos1.x = 240;
gSprites[spriteId].pos1.y = 60;
gSprites[spriteId].invisible = FALSE;
- gTasks[taskId].data[TD_TRAINER_SPRITE_ID] = spriteId;
+ gTasks[taskId].tTrainerSpriteId = spriteId;
gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND;
StartSpriteFadeIn(taskId, 0);
gTasks[taskId].func = Task_NewGameSpeech18;
@@ -1005,7 +1043,7 @@ static void Task_NewGameSpeech17(u8 taskId)
//Slide new trainer sprite from right of screen
static void Task_NewGameSpeech18(u8 taskId)
{
- u8 spriteId = gTasks[taskId].data[TD_TRAINER_SPRITE_ID];
+ u8 spriteId = gTasks[taskId].tTrainerSpriteId;
if (gSprites[spriteId].pos1.x > 180)
{
@@ -1014,7 +1052,7 @@ static void Task_NewGameSpeech18(u8 taskId)
else
{
gSprites[spriteId].pos1.x = 180;
- if (gTasks[taskId].data[TD_SUBTASK_DONE])
+ if (gTasks[taskId].tSubtaskIsDone)
{
gSprites[spriteId].oam.objMode = ST_OAM_OBJ_NORMAL;
gTasks[taskId].func = Task_NewGameSpeech16; //Go back to gender menu
@@ -1106,7 +1144,7 @@ static void Task_NewGameSpeech25(u8 taskId)
case 0: //YES
PlaySE(SE_SELECT);
MenuZeroFillWindowRect(2, 1, 8, 7);
- gSprites[gTasks[taskId].data[TD_TRAINER_SPRITE_ID]].oam.objMode = ST_OAM_OBJ_BLEND;
+ gSprites[gTasks[taskId].tTrainerSpriteId].oam.objMode = ST_OAM_OBJ_BLEND;
StartSpriteFadeOut(taskId, 2);
StartBackgroundFadeOut(taskId, 1);
gTasks[taskId].func = Task_NewGameSpeech26; //Continue
@@ -1122,10 +1160,10 @@ static void Task_NewGameSpeech25(u8 taskId)
static void Task_NewGameSpeech26(u8 taskId)
{
- if (gTasks[taskId].data[TD_BGHOFS])
+ if (gTasks[taskId].tBGhofs)
{
- gTasks[taskId].data[TD_BGHOFS] += 2;
- REG_BG1HOFS = gTasks[taskId].data[TD_BGHOFS];
+ gTasks[taskId].tBGhofs += 2;
+ REG_BG1HOFS = gTasks[taskId].tBGhofs;
}
else
{
@@ -1135,23 +1173,23 @@ static void Task_NewGameSpeech26(u8 taskId)
static void Task_NewGameSpeech27(u8 taskId)
{
- if (gTasks[taskId].data[TD_SUBTASK_DONE])
+ if (gTasks[taskId].tSubtaskIsDone)
{
s16 spriteId;
//Hide Brendan and May sprites
- spriteId = gTasks[taskId].data[TD_BRENDAN_SPRITE_ID];
+ spriteId = gTasks[taskId].tBrendanSpriteId;
gSprites[spriteId].invisible = TRUE;
- spriteId = gTasks[taskId].data[TD_MAY_SPRITE_ID];
+ spriteId = gTasks[taskId].tMaySpriteId;
gSprites[spriteId].invisible = TRUE;
//Fade in Birch and Azurill
- spriteId = (u8)gTasks[taskId].data[TD_BIRCH_SPRITE_ID];
+ spriteId = (u8)gTasks[taskId].tBirchSpriteId;
gSprites[spriteId].pos1.x = 136;
gSprites[spriteId].pos1.y = 64;
gSprites[spriteId].invisible = FALSE;
gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND;
- spriteId = (u8)gTasks[taskId].data[TD_AZURILL_SPRITE_ID];
+ spriteId = (u8)gTasks[taskId].tAzurillSpriteId;
gSprites[spriteId].pos1.x = 104;
gSprites[spriteId].pos1.y = 72;
gSprites[spriteId].invisible = FALSE;
@@ -1170,27 +1208,27 @@ static void Task_NewGameSpeech27(u8 taskId)
static void Task_NewGameSpeech28(u8 taskId)
{
- if (gTasks[taskId].data[TD_SUBTASK_DONE])
+ if (gTasks[taskId].tSubtaskIsDone)
{
s16 spriteId;
- spriteId = gTasks[taskId].data[TD_BIRCH_SPRITE_ID];
+ spriteId = gTasks[taskId].tBirchSpriteId;
gSprites[spriteId].oam.objMode = ST_OAM_OBJ_NORMAL;
- spriteId = gTasks[taskId].data[TD_AZURILL_SPRITE_ID];
+ spriteId = gTasks[taskId].tAzurillSpriteId;
gSprites[spriteId].oam.objMode = ST_OAM_OBJ_NORMAL;
if (BirchSpeechUpdateWindowText())
{
//Fade out Birch and Azurill
- spriteId = gTasks[taskId].data[TD_BIRCH_SPRITE_ID];
+ spriteId = gTasks[taskId].tBirchSpriteId;
gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND;
- spriteId = gTasks[taskId].data[TD_AZURILL_SPRITE_ID];
+ spriteId = gTasks[taskId].tAzurillSpriteId;
gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND;
StartSpriteFadeOut(taskId, 2);
StartBackgroundFadeOut(taskId, 1);
- gTasks[taskId].data[TD_COUNTER] = 64;
+ gTasks[taskId].tFrameCounter = 64;
gTasks[taskId].func = Task_NewGameSpeech29;
}
}
@@ -1198,19 +1236,19 @@ static void Task_NewGameSpeech28(u8 taskId)
static void Task_NewGameSpeech29(u8 taskId)
{
- if (gTasks[taskId].data[TD_SUBTASK_DONE])
+ if (gTasks[taskId].tSubtaskIsDone)
{
s16 spriteId;
//Hide Birch and Azurill
- spriteId = gTasks[taskId].data[TD_BIRCH_SPRITE_ID];
+ spriteId = gTasks[taskId].tBirchSpriteId;
gSprites[spriteId].invisible = TRUE;
- spriteId = gTasks[taskId].data[TD_AZURILL_SPRITE_ID];
+ spriteId = gTasks[taskId].tAzurillSpriteId;
gSprites[spriteId].invisible = TRUE;
- if (gTasks[taskId].data[TD_COUNTER])
+ if (gTasks[taskId].tFrameCounter)
{
- gTasks[taskId].data[TD_COUNTER]--;
+ gTasks[taskId].tFrameCounter--;
}
else
{
@@ -1218,14 +1256,14 @@ static void Task_NewGameSpeech29(u8 taskId)
//Fade in trainer and background
if (gSaveBlock2.playerGender)
- spriteId = (u8)gTasks[taskId].data[TD_MAY_SPRITE_ID];
+ spriteId = (u8)gTasks[taskId].tMaySpriteId;
else
- spriteId = (u8)gTasks[taskId].data[TD_BRENDAN_SPRITE_ID];
+ spriteId = (u8)gTasks[taskId].tBrendanSpriteId;
gSprites[spriteId].pos1.x = 120;
gSprites[spriteId].pos1.y = 60;
gSprites[spriteId].invisible = FALSE;
gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND;
- gTasks[taskId].data[TD_TRAINER_SPRITE_ID] = spriteId;
+ gTasks[taskId].tTrainerSpriteId = spriteId;
StartSpriteFadeIn(taskId, 2);
StartBackgroundFadeIn(taskId, 1);
@@ -1238,18 +1276,18 @@ static void Task_NewGameSpeech29(u8 taskId)
static void Task_NewGameSpeech30(u8 taskId)
{
- if (gTasks[taskId].data[TD_SUBTASK_DONE])
+ if (gTasks[taskId].tSubtaskIsDone)
{
s16 spriteId;
- spriteId = gTasks[taskId].data[TD_TRAINER_SPRITE_ID];
+ spriteId = gTasks[taskId].tTrainerSpriteId;
gSprites[spriteId].oam.objMode = ST_OAM_OBJ_NORMAL;
if (BirchSpeechUpdateWindowText())
{
u8 spriteId;
- spriteId = gTasks[taskId].data[TD_TRAINER_SPRITE_ID];
+ spriteId = gTasks[taskId].tTrainerSpriteId;
gSprites[spriteId].oam.affineMode = 1;
gSprites[spriteId].affineAnims = gSpriteAffineAnimTable_81E79AC;
InitSpriteAffineAnim(&gSprites[spriteId]);
@@ -1264,7 +1302,7 @@ static void Task_NewGameSpeech30(u8 taskId)
static void Task_NewGameSpeech31(u8 taskId)
{
- u8 spriteId = gTasks[taskId].data[TD_TRAINER_SPRITE_ID];
+ u8 spriteId = gTasks[taskId].tTrainerSpriteId;
if (gSprites[spriteId].affineAnimEnded)
gTasks[taskId].func = Task_NewGameSpeech32;
@@ -1274,7 +1312,7 @@ static void Task_NewGameSpeech32(u8 taskId)
{
if (!gPaletteFade.active)
{
- u8 spriteId = gTasks[taskId].data[TD_TRAINER_SPRITE_ID];
+ u8 spriteId = gTasks[taskId].tTrainerSpriteId;
gSprites[spriteId].callback = nullsub_34;
REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON;
BeginNormalPaletteFade(0xFFFF0000, 0, 0, 0x10, 0xFFFF);
@@ -1328,7 +1366,7 @@ void CB_ContinueNewGameSpeechPart2()
taskId = CreateTask(Task_NewGameSpeech23, 0);
- gTasks[taskId].data[TD_BGHOFS] = -60;
+ gTasks[taskId].tBGhofs = -60;
remove_some_task();
ResetSpriteData();
@@ -1340,20 +1378,20 @@ void CB_ContinueNewGameSpeechPart2()
if (gSaveBlock2.playerGender != MALE)
{
- gTasks[taskId].data[TD_GENDER_SELECTION] = FEMALE;
- spriteId = gTasks[taskId].data[TD_MAY_SPRITE_ID];
+ gTasks[taskId].tGenderSelection = FEMALE;
+ spriteId = gTasks[taskId].tMaySpriteId;
}
else
{
- gTasks[taskId].data[TD_GENDER_SELECTION] = MALE;
- spriteId = gTasks[taskId].data[TD_BRENDAN_SPRITE_ID];
+ gTasks[taskId].tGenderSelection = MALE;
+ spriteId = gTasks[taskId].tBrendanSpriteId;
}
gSprites[spriteId].pos1.x = 180;
gSprites[spriteId].pos1.y = 60;
gSprites[spriteId].invisible = FALSE;
- gTasks[taskId].data[TD_TRAINER_SPRITE_ID] = spriteId;
+ gTasks[taskId].tTrainerSpriteId = spriteId;
REG_BG1HOFS = -60;
@@ -1385,9 +1423,9 @@ void nullsub_34(struct Sprite *sprite)
void ShrinkPlayerSprite(struct Sprite *sprite)
{
- u32 y = (sprite->pos1.y << 16) + sprite->data0 + 0xC000;
+ u32 y = (sprite->pos1.y << 16) + sprite->data[0] + 0xC000;
sprite->pos1.y = y >> 16;
- sprite->data0 = y;
+ sprite->data[0] = y;
}
u8 CreateAzurillSprite(u8 x, u8 y)
@@ -1412,56 +1450,67 @@ void AddBirchSpeechObjects(u8 taskId)
gSprites[spriteId].callback = nullsub_34;
gSprites[spriteId].oam.priority = 0;
gSprites[spriteId].invisible = 1;
- gTasks[taskId].data[TD_BIRCH_SPRITE_ID] = spriteId;
+ gTasks[taskId].tBirchSpriteId = spriteId;
spriteId = CreateAzurillSprite(0x68, 0x48);
gSprites[spriteId].callback = nullsub_34;
gSprites[spriteId].oam.priority = 0;
gSprites[spriteId].invisible = 1;
- gTasks[taskId].data[TD_AZURILL_SPRITE_ID] = spriteId;
+ gTasks[taskId].tAzurillSpriteId = spriteId;
//Create Brendan sprite
- spriteId = CreateTrainerSprite(0, 120, 60, 0, unk_2000000);
+ spriteId = CreateTrainerSprite(0, 120, 60, 0, eBrendanSprite);
gSprites[spriteId].callback = nullsub_34;
gSprites[spriteId].invisible = 1;
gSprites[spriteId].oam.priority = 0;
- gTasks[taskId].data[TD_BRENDAN_SPRITE_ID] = spriteId;
+ gTasks[taskId].tBrendanSpriteId = spriteId;
//Create May sprite
- spriteId = CreateTrainerSprite(1, 120, 60, 0, unk_2000000 + 0x800);
+ spriteId = CreateTrainerSprite(1, 120, 60, 0, eMaySprite);
gSprites[spriteId].callback = nullsub_34;
gSprites[spriteId].invisible = 1;
gSprites[spriteId].oam.priority = 0;
- gTasks[taskId].data[TD_MAY_SPRITE_ID] = spriteId;
+ gTasks[taskId].tMaySpriteId = spriteId;
}
-enum {
- TD_PARENT_TASK_ID,
- TD_EVA, //EVA coefficient of REG_BLDALPHA
- TD_EVB, //EVB coefficient of REG_BLDALPHA
- TD_INTERVAL,
- TD_FRAMECOUNTER
-};
+#undef tTrainerSpriteId
+#undef tBGhofs
+//#undef tSubtaskIsDone
+#undef tGenderSelection
+#undef tFrameCounter
+#undef tBirchSpriteId
+#undef tAzurillSpriteId
+#undef tBrendanSpriteId
+#undef tMaySpriteId
+
+
+// Sprite Fade task
+
+#define tMainTaskId data[0]
+#define tBlendEVA data[1]
+#define tBlendEVB data[2]
+#define tUpdateInterval data[3]
+#define tFrameCounter data[4]
static void Task_SpriteFadeOut(u8 taskId)
{
- if (gTasks[taskId].data[TD_EVA] == 0)
+ if (gTasks[taskId].tBlendEVA == 0)
{
- gTasks[gTasks[taskId].data[TD_PARENT_TASK_ID]].data[TD_SUBTASK_DONE] = TRUE;
+ gTasks[gTasks[taskId].tMainTaskId].tSubtaskIsDone = TRUE;
DestroyTask(taskId);
}
else
{
- if (gTasks[taskId].data[TD_FRAMECOUNTER])
+ if (gTasks[taskId].tFrameCounter)
{
- gTasks[taskId].data[TD_FRAMECOUNTER]--;
+ gTasks[taskId].tFrameCounter--;
}
else
{
- gTasks[taskId].data[TD_FRAMECOUNTER] = gTasks[taskId].data[TD_INTERVAL];
- gTasks[taskId].data[TD_EVA]--;
- gTasks[taskId].data[TD_EVB]++;
- REG_BLDALPHA = gTasks[taskId].data[TD_EVA] + (gTasks[taskId].data[TD_EVB] * 256);
+ gTasks[taskId].tFrameCounter = gTasks[taskId].tUpdateInterval;
+ gTasks[taskId].tBlendEVA--;
+ gTasks[taskId].tBlendEVB++;
+ REG_BLDALPHA = gTasks[taskId].tBlendEVA + (gTasks[taskId].tBlendEVB * 256);
}
}
}
@@ -1474,33 +1523,33 @@ static void StartSpriteFadeOut(u8 taskId, u8 interval)
REG_BLDCNT = 592;
REG_BLDALPHA = 16;
REG_BLDY = 0;
- gTasks[taskId].data[TD_SUBTASK_DONE] = FALSE;
+ gTasks[taskId].tSubtaskIsDone = FALSE;
newTaskId = CreateTask(Task_SpriteFadeOut, 0);
- gTasks[newTaskId].data[TD_PARENT_TASK_ID] = taskId;
- gTasks[newTaskId].data[TD_EVA] = 16;
- gTasks[newTaskId].data[TD_EVB] = 0;
- gTasks[newTaskId].data[TD_INTERVAL] = interval;
- gTasks[newTaskId].data[TD_FRAMECOUNTER] = interval;
+ gTasks[newTaskId].tMainTaskId = taskId;
+ gTasks[newTaskId].tBlendEVA = 16;
+ gTasks[newTaskId].tBlendEVB = 0;
+ gTasks[newTaskId].tUpdateInterval = interval;
+ gTasks[newTaskId].tFrameCounter = interval;
}
static void Task_SpriteFadeIn(u8 taskId)
{
- if (gTasks[taskId].data[TD_EVA] == 16)
+ if (gTasks[taskId].tBlendEVA == 16)
{
- gTasks[gTasks[taskId].data[TD_PARENT_TASK_ID]].data[TD_SUBTASK_DONE] = TRUE;
+ gTasks[gTasks[taskId].tMainTaskId].tSubtaskIsDone = TRUE;
DestroyTask(taskId);
}
- else if (gTasks[taskId].data[TD_FRAMECOUNTER])
+ else if (gTasks[taskId].tFrameCounter)
{
- gTasks[taskId].data[TD_FRAMECOUNTER]--;
+ gTasks[taskId].tFrameCounter--;
}
else
{
- gTasks[taskId].data[TD_FRAMECOUNTER] = gTasks[taskId].data[TD_INTERVAL];
- gTasks[taskId].data[TD_EVA]++;
- gTasks[taskId].data[TD_EVB]--;
- REG_BLDALPHA = gTasks[taskId].data[TD_EVA] + (gTasks[taskId].data[TD_EVB] * 256);
+ gTasks[taskId].tFrameCounter = gTasks[taskId].tUpdateInterval;
+ gTasks[taskId].tBlendEVA++;
+ gTasks[taskId].tBlendEVB--;
+ REG_BLDALPHA = gTasks[taskId].tBlendEVA + (gTasks[taskId].tBlendEVB * 256);
}
}
@@ -1512,36 +1561,49 @@ static void StartSpriteFadeIn(u8 taskId, u8 interval)
REG_BLDCNT = 592;
REG_BLDALPHA = 4096;
REG_BLDY = 0;
- gTasks[taskId].data[TD_SUBTASK_DONE] = FALSE;
+ gTasks[taskId].tSubtaskIsDone = FALSE;
newTaskId = CreateTask(Task_SpriteFadeIn, 0);
- gTasks[newTaskId].data[TD_PARENT_TASK_ID] = taskId;
- gTasks[newTaskId].data[TD_EVA] = 0;
- gTasks[newTaskId].data[TD_EVB] = 16;
- gTasks[newTaskId].data[TD_INTERVAL] = interval;
- gTasks[newTaskId].data[TD_FRAMECOUNTER] = interval;
+ gTasks[newTaskId].tMainTaskId = taskId;
+ gTasks[newTaskId].tBlendEVA = 0;
+ gTasks[newTaskId].tBlendEVB = 16;
+ gTasks[newTaskId].tUpdateInterval = interval;
+ gTasks[newTaskId].tFrameCounter = interval;
}
-enum {
- TD_FADELEVEL = 1,
- TD_DELAY,
-};
+#undef tMainTaskId
+#undef tBlendEVA
+#undef tBlendEVB
+#undef tUpdateInterval
+#undef tFrameCounter
+
+
+// Background fade task
+
+#define tMainTaskId data[0]
+#define tFadeLevel data[1]
+#define tDelay data[2]
+#define tUpdateInterval data[3]
+#define tFrameCounter data[4]
static void HandleFloorShadowFadeOut(u8 taskId)
{
- if (gTasks[taskId].data[TD_DELAY])
- gTasks[taskId].data[TD_DELAY]--;
+ if (gTasks[taskId].tDelay)
+ gTasks[taskId].tDelay--;
else
{
- if (gTasks[taskId].data[TD_FADELEVEL] == 8)
+ if (gTasks[taskId].tFadeLevel == 8)
DestroyTask(taskId);
- else if (gTasks[taskId].data[TD_FRAMECOUNTER])
- gTasks[taskId].data[TD_FRAMECOUNTER]--;
else
{
- gTasks[taskId].data[TD_FRAMECOUNTER] = gTasks[taskId].data[TD_INTERVAL];
- gTasks[taskId].data[TD_FADELEVEL]++;
- LoadPalette(&gUnknown_081E795C[gTasks[taskId].data[TD_FADELEVEL]], 1, 0x10);
+ if (gTasks[taskId].tFrameCounter)
+ gTasks[taskId].tFrameCounter--;
+ else
+ {
+ gTasks[taskId].tFrameCounter = gTasks[taskId].tUpdateInterval;
+ gTasks[taskId].tFadeLevel++;
+ LoadPalette(&gUnknown_081E795C[gTasks[taskId].tFadeLevel], 1, 0x10);
+ }
}
}
}
@@ -1550,30 +1612,30 @@ static void HandleFloorShadowFadeOut(u8 taskId)
static void StartBackgroundFadeOut(u8 taskId, u8 interval)
{
u8 newTaskId = CreateTask(HandleFloorShadowFadeOut, 0);
- gTasks[newTaskId].data[TD_PARENT_TASK_ID] = taskId;
- gTasks[newTaskId].data[TD_FADELEVEL] = 0;
- gTasks[newTaskId].data[TD_DELAY] = 8;
- gTasks[newTaskId].data[TD_INTERVAL] = interval;
- gTasks[newTaskId].data[TD_FRAMECOUNTER] = interval;
+ gTasks[newTaskId].tMainTaskId = taskId;
+ gTasks[newTaskId].tFadeLevel = 0;
+ gTasks[newTaskId].tDelay = 8;
+ gTasks[newTaskId].tUpdateInterval = interval;
+ gTasks[newTaskId].tFrameCounter = interval;
}
static void HandleFloorShadowFadeIn(u8 taskId)
{
- if (gTasks[taskId].data[TD_DELAY])
- gTasks[taskId].data[TD_DELAY]--;
+ if (gTasks[taskId].tDelay)
+ gTasks[taskId].tDelay--;
else
{
- if (gTasks[taskId].data[TD_FADELEVEL] == 0)
+ if (gTasks[taskId].tFadeLevel == 0)
DestroyTask(taskId);
else
{
- if (gTasks[taskId].data[TD_FRAMECOUNTER])
- gTasks[taskId].data[TD_FRAMECOUNTER]--;
+ if (gTasks[taskId].tFrameCounter)
+ gTasks[taskId].tFrameCounter--;
else
{
- gTasks[taskId].data[TD_FRAMECOUNTER] = gTasks[taskId].data[TD_INTERVAL];
- gTasks[taskId].data[TD_FADELEVEL]--;
- LoadPalette(&gUnknown_081E795C[gTasks[taskId].data[TD_FADELEVEL]], 1, 0x10);
+ gTasks[taskId].tFrameCounter = gTasks[taskId].tUpdateInterval;
+ gTasks[taskId].tFadeLevel--;
+ LoadPalette(&gUnknown_081E795C[gTasks[taskId].tFadeLevel], 1, 0x10);
}
}
}
@@ -1583,12 +1645,18 @@ static void HandleFloorShadowFadeIn(u8 taskId)
static void StartBackgroundFadeIn(u8 taskId, u8 interval)
{
u8 newTaskId = CreateTask(HandleFloorShadowFadeIn, 0);
- gTasks[newTaskId].data[TD_PARENT_TASK_ID] = taskId;
- gTasks[newTaskId].data[TD_FADELEVEL] = 8;
- gTasks[newTaskId].data[TD_DELAY] = 8;
- gTasks[newTaskId].data[TD_INTERVAL] = interval;
- gTasks[newTaskId].data[TD_FRAMECOUNTER] = interval;
-}
+ gTasks[newTaskId].tMainTaskId = taskId;
+ gTasks[newTaskId].tFadeLevel = 8;
+ gTasks[newTaskId].tDelay = 8;
+ gTasks[newTaskId].tUpdateInterval = interval;
+ gTasks[newTaskId].tFrameCounter = interval;
+}
+
+#undef tMainTaskId
+#undef tFadeLevel
+#undef tDelay
+#undef tUpdateInterval
+#undef tFrameCounter
static void CreateGenderMenu(u8 left, u8 top)
{
diff --git a/src/menu.c b/src/engine/menu.c
index 1096fa0bd..10988c1d7 100644
--- a/src/menu.c
+++ b/src/engine/menu.c
@@ -4,7 +4,7 @@
#include "map_obj_lock.h"
#include "menu_cursor.h"
#include "script.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "strings.h"
#include "text.h"
@@ -154,9 +154,9 @@ void MenuPrint(const u8 *str, u8 left, u8 top)
sub_8003460(gMenuWindowPtr, str, gMenuTextTileOffset, left, top);
}
-void MenuZeroFillWindowRect(u8 a1, u8 a2, u8 a3, u8 a4)
+void MenuZeroFillWindowRect(u8 left, u8 top, u8 right, u8 bottom)
{
- ZeroFillWindowRect(gMenuWindowPtr, a1, a2, a3, a4);
+ ZeroFillWindowRect(gMenuWindowPtr, left, top, right, bottom);
}
void MenuFillWindowRectWithBlankTile(u8 left, u8 top, u8 right, u8 bottom)
@@ -205,7 +205,7 @@ void MenuPrintMessage(const u8 *str, u8 left, u8 top)
sub_8002EB0(gMenuWindowPtr, str, gMenuTextTileOffset, left, top);
}
-void sub_8072044(const u8 *str)
+void MenuPrintMessageDefaultCoords(const u8 *str)
{
sub_8002EB0(gMenuWindowPtr, str, gMenuTextTileOffset, 2, 15);
}
@@ -571,7 +571,7 @@ void PrintMenuItems(u8 left, u8 top, u8 menuItemCount, const struct MenuAction m
MenuPrint(menuItems[i].text, left, top + 2 * i);
}
-void PrintMenuItemsReordered(u8 left, u8 top, u8 menuItemCount, const struct MenuAction menuItems[], const u8 *order)
+void PrintMenuItemsReordered(u8 left, u8 top, u8 menuItemCount, const struct MenuAction2 menuItems[], const u8 *order)
{
u8 i;
diff --git a/src/menu_cursor.c b/src/engine/menu_cursor.c
index d43be2a2f..960d3cc87 100644
--- a/src/menu_cursor.c
+++ b/src/engine/menu_cursor.c
@@ -3,25 +3,7 @@
#include "palette.h"
#include "sprite.h"
-extern const struct SpriteSheet gUnknown_0842F140[];
-extern const struct SpriteSheet gUnknown_0842F1C0[];
-extern const struct SpritePalette gUnknown_0842F240;
-extern const struct SpritePalette gUnknown_0842F248;
-extern const struct SpriteTemplate gSpriteTemplate_842F250[];
-extern const struct SpriteTemplate gSpriteTemplate_842F298[];
-
-extern struct Subsprite *const gUnknown_0842F5BC[];
-
-extern const struct SubspriteTable gSubspriteTables_842F5C0[];
-extern const struct SubspriteTable gSubspriteTables_842F6C0[];
-extern const struct SubspriteTable gUnknown_0842F758[];
-
-extern const struct Subsprite gUnknown_0842F780;
-extern const struct Subsprite gUnknown_0842F788;
-extern const struct Subsprite gUnknown_0842F790;
-
-extern u16 gUnknown_0203A360[];
-
+EWRAM_DATA u16 gUnknown_0203A360[0x10] = {};
EWRAM_DATA struct Subsprite gMenuCursorSubsprites[10] = {0};
EWRAM_DATA u8 gUnknown_0203A3D0 = 0;
EWRAM_DATA u8 gUnknown_0203A3D1 = 0;
@@ -29,6 +11,12 @@ EWRAM_DATA u8 gUnknown_0203A3D2 = 0;
EWRAM_DATA u8 gUnknown_0203A3D3 = 0;
EWRAM_DATA u8 gUnknown_0203A3D4 = 0;
+#if ENGLISH
+#include "../src/data/menu_cursor_en.h"
+#elif GERMAN
+#include "../src/data/menu_cursor_de.h"
+#endif // ENGLISH/GERMAN
+
void sub_814A590(void)
{
gUnknown_0203A3D0 = 0x40;
diff --git a/src/mystery_event_menu.c b/src/engine/mystery_event_menu.c
index 46b76fd88..b9c3d5ad8 100644
--- a/src/mystery_event_menu.c
+++ b/src/engine/mystery_event_menu.c
@@ -6,15 +6,14 @@
#include "mystery_event_script.h"
#include "palette.h"
#include "save.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "sprite.h"
#include "string_util.h"
#include "strings2.h"
#include "task.h"
#include "text.h"
-
-extern u8 unk_2000000[];
+#include "ewram.h"
static EWRAM_DATA u8 gUnknown_02039338 = 0;
@@ -94,7 +93,7 @@ static void CB2_MysteryEventMenu(void)
case 1:
if (gPaletteFade.active)
break;
- sub_8072044(gSystemText_LinkStandby);
+ MenuPrintMessageDefaultCoords(gSystemText_LinkStandby);
gMain.state++;
break;
case 2:
@@ -109,7 +108,7 @@ static void CB2_MysteryEventMenu(void)
if ((gLinkStatus & 0x20) && (gLinkStatus & 0x1C) > 4)
{
PlaySE(SE_PIN);
- sub_8072044(gSystemText_LoadEventPressA);
+ MenuPrintMessageDefaultCoords(gSystemText_LoadEventPressA);
gMain.state++;
}
if (gMain.newKeys & B_BUTTON)
@@ -128,7 +127,7 @@ static void CB2_MysteryEventMenu(void)
if (GetLinkPlayerCount_2() != 2)
{
GetEventLoadMessage(gStringVar4, 1);
- sub_8072044(gStringVar4);
+ MenuPrintMessageDefaultCoords(gStringVar4);
gMain.state = 13;
break;
}
@@ -158,13 +157,13 @@ static void CB2_MysteryEventMenu(void)
sub_800832C();
MenuZeroFillWindowRect(6, 5, 23, 8);
GetEventLoadMessage(gStringVar4, 1);
- sub_8072044(gStringVar4);
+ MenuPrintMessageDefaultCoords(gStringVar4);
gMain.state = 13;
break;
}
else if (CheckLanguageMatch())
{
- sub_8072044(gSystemText_DontCutLink);
+ MenuPrintMessageDefaultCoords(gSystemText_DontCutLink);
gMain.state++;
break;
}
@@ -173,7 +172,7 @@ static void CB2_MysteryEventMenu(void)
CloseLink();
MenuZeroFillWindowRect(6, 5, 23, 8);
GetEventLoadMessage(gStringVar4, 1);
- sub_8072044(gStringVar4);
+ MenuPrintMessageDefaultCoords(gStringVar4);
gMain.state = 13;
break;
}
@@ -222,7 +221,7 @@ static void CB2_MysteryEventMenu(void)
sub_800832C();
MenuZeroFillWindowRect(6, 5, 23, 8);
GetEventLoadMessage(gStringVar4, 1);
- sub_8072044(gStringVar4);
+ MenuPrintMessageDefaultCoords(gStringVar4);
ptr = (u8 *)&gMain;
offset1 = offsetof(struct Main, state);
asm("" ::: "r1");
@@ -234,7 +233,7 @@ static void CB2_MysteryEventMenu(void)
register u8 *ptr2 asm("r1");
register int offset3 asm("r0");
register int dummy asm("r2");
- sub_8072044(gSystemText_DontCutLink);
+ MenuPrintMessageDefaultCoords(gSystemText_DontCutLink);
ptr2 = (u8 *)&gMain;
offset3 = offsetof(struct Main, state);
if (dummy)
@@ -249,7 +248,7 @@ static void CB2_MysteryEventMenu(void)
MenuZeroFillWindowRect(6, 5, 23, 8);
label:
GetEventLoadMessage(gStringVar4, 1);
- sub_8072044(gStringVar4);
+ MenuPrintMessageDefaultCoords(gStringVar4);
ptr = (u8 *)&gMain;
offset2 = offsetof(struct Main, state);
ptr += offset2;
@@ -287,14 +286,14 @@ static void CB2_MysteryEventMenu(void)
case 11:
if (gReceivedRemoteLinkPlayers)
break;
- unkVal = RunMysteryEventScript(unk_2000000);
- CpuFill32(0, unk_2000000, 0x7D4);
+ unkVal = RunMysteryEventScript(gSharedMem);
+ CpuFill32(0, gSharedMem, 0x7D4);
if (!GetEventLoadMessage(gStringVar4, unkVal))
TrySavingData(NORMAL_SAVE);
gMain.state++;
break;
case 12:
- sub_8072044(gStringVar4);
+ MenuPrintMessageDefaultCoords(gStringVar4);
gMain.state++;
break;
case 13:
@@ -329,7 +328,7 @@ static void CB2_MysteryEventMenu(void)
CloseLink();
MenuZeroFillWindowRect(6, 5, 23, 8);
GetEventLoadMessage(gStringVar4, 1);
- sub_8072044(gStringVar4);
+ MenuPrintMessageDefaultCoords(gStringVar4);
gMain.state = 13;
}
}
diff --git a/src/engine/mystery_event_msg.c b/src/engine/mystery_event_msg.c
new file mode 100644
index 000000000..03ef22727
--- /dev/null
+++ b/src/engine/mystery_event_msg.c
@@ -0,0 +1,51 @@
+#include "global.h"
+
+#if ENGLISH
+
+const u8 gOtherText_BerryObtainedDadHasIt[] = _("Obtained a {STR_VAR_2} BERRY!\nDad has it at PETALBURG GYM.");
+
+const u8 gOtherText_BerryTransformed[] = _("The {STR_VAR_1} BERRY transformed into\none {STR_VAR_2} BERRY.");
+
+const u8 gOtherText_BerryAlreadyObtained[] = _("The {STR_VAR_1} BERRY has already been\nobtained.");
+
+const u8 gOtherText_SpecialRibbonReceived[] = _("A special RIBBON was awarded to your\nparty POKéMON.");
+
+const u8 gOtherText_DexUpgraded[] = _("The POKéDEX has been upgraded with\nthe NATIONAL MODE.");
+
+const u8 gOtherText_RareWordAdded[] = _("A rare word has been added.");
+
+const u8 gOtherText_PokeWasSentOver[] = _("{STR_VAR_1} was sent over!");
+
+const u8 gOtherText_PartyIsFull[] = _("Your party is full.\n{STR_VAR_1} could not be sent over.");
+
+const u8 gOtherText_NewTrainerInHoenn[] = _("A new TRAINER has arrived in HOENN.");
+
+const u8 gOtherText_NewAdversaryInBattleTower[] = _("A new adversary has arrived in the\nBATTLE TOWER.");
+
+const u8 gOtherText_DataCannotUseVersion[] = _("This data cannot be used in\nthis version.");
+
+#elif GERMAN
+
+const u8 gOtherText_BerryObtainedDadHasIt[] = _("Eine {STR_VAR_2}BEERE! Vater in der \nARENA von BLÜTENBURG CITY besitzt\lauch eine.");
+
+const u8 gOtherText_BerryTransformed[] = _("Die {STR_VAR_1}BEERE verwandelte\nsich in eine {STR_VAR_2}BEERE!");
+
+const u8 gOtherText_BerryAlreadyObtained[] = _("Du hast schon eine {STR_VAR_1}BEERE.");
+
+const u8 gOtherText_SpecialRibbonReceived[] = _("Ein besonderes BAND wurde deinem\nPOKéMON im Team verliehen.");
+
+const u8 gOtherText_DexUpgraded[] = _("Der POKéDEX wurde mit dem NATIONALEN\nMODUS ausgerüstet.");
+
+const u8 gOtherText_RareWordAdded[] = _("Ein seltenes Wort wurde hinzugefügt.");
+
+const u8 gOtherText_PokeWasSentOver[] = _("{STR_VAR_1} wurde gesendet!");
+
+const u8 gOtherText_PartyIsFull[] = _("Dein Team ist bereits vollständig.\n{STR_VAR_1} kann nicht gesendet\lwerden.");
+
+const u8 gOtherText_NewTrainerInHoenn[] = _("Ein neuer TRAINER ist in HOENN\nangekommen.");
+
+const u8 gOtherText_NewAdversaryInBattleTower[] = _("Ein neuer Widersacher ist im DUELLTURM\neingetroffen.");
+
+const u8 gOtherText_DataCannotUseVersion[] = _("Die Daten können in dieser Edition\nnicht eingesetzt werden.");
+
+#endif // ENGLISH/GERMAN
diff --git a/src/mystery_event_script.c b/src/engine/mystery_event_script.c
index f507942a7..6fcad66ac 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"
@@ -8,11 +9,12 @@
#include "pokemon.h"
#include "pokemon_size_record.h"
#include "script.h"
-#include "species.h"
+#include "constants/species.h"
#include "strings.h"
#include "string_util.h"
#include "text.h"
#include "util.h"
+#include "mystery_event_msg.h"
#if ENGLISH
#define LANGUAGE_MASK 0x2
@@ -27,22 +29,10 @@
#endif
extern void party_compaction(void);
-extern void sub_813601C(void);
extern ScrCmdFunc gMysteryEventScriptCmdTable[];
extern ScrCmdFunc gMysteryEventScriptCmdTableEnd[];
-extern const u8 gOtherText_BerryObtainedDadHasIt[];
-extern const u8 gOtherText_BerryTransformed[];
-extern const u8 gOtherText_BerryAlreadyObtained[];
-extern const u8 gOtherText_SpecialRibbonReceived[];
-extern const u8 gOtherText_DexUpgraded[];
-extern const u8 gOtherText_RareWordAdded[];
-extern const u8 gOtherText_PokeWasSentOver[];
-extern const u8 gOtherText_PartyIsFull[];
-extern const u8 gOtherText_NewTrainerInHoenn[];
-extern const u8 gOtherText_DataCannotUseVersion[];
-
static EWRAM_DATA struct ScriptContext sMysteryEventScriptContext = {0};
static bool32 CheckCompatibility(u16 a1, u32 a2, u16 a3, u32 a4)
@@ -317,7 +307,7 @@ bool8 MEScrCmd_setenigmaberry(struct ScriptContext *ctx)
ctx->data[2] = 2;
if (IsEnigmaBerryValid() == TRUE)
- VarSet(0x402D, 1);
+ VarSet(VAR_ENIGMA_BERRY_AVAILABLE, 1);
else
ctx->data[2] = 1;
@@ -401,8 +391,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 +410,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 6c107f022..440504d5a 100644
--- a/src/naming_screen.c
+++ b/src/engine/naming_screen.c
@@ -1,6 +1,7 @@
#include "global.h"
#include "naming_screen.h"
#include "data2.h"
+#include "graphics.h"
#include "field_effect.h"
#include "field_map_obj.h"
#include "field_player_avatar.h"
@@ -8,7 +9,7 @@
#include "menu.h"
#include "palette.h"
#include "pokemon_icon.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "sprite.h"
#include "string_util.h"
@@ -17,6 +18,7 @@
#include "text.h"
#include "trig.h"
#include "util.h"
+#include "ewram.h"
#ifdef ENGLISH
#define COLUMN_COUNT 9
@@ -26,20 +28,13 @@
extern u16 gKeyRepeatStartDelay;
-extern u8 unk_2000000[];
+extern u8 CreateMonIcon(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u32 personality);
-#define namingScreenData (*(struct NamingScreenData *)(unk_2000000))
+const u8 gSpriteImage_83CE094[] = INCBIN_U8("graphics/naming_screen/pc_icon/0.4bpp");
+const u8 gSpriteImage_83CE154[] = INCBIN_U8("graphics/naming_screen/pc_icon/1.4bpp");
-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");
+struct NamingScreenData *const namingScreenDataPtr = &namingScreenData;
-//Some unused pointer, perhaps.
-asm(".section .rodata\n\
-@ XXX: what is this?\n\
- .align 2\n\
- .4byte 0x2000000\n");
-
-extern u16 *const gUnknown_083CE28C[];
extern const struct SubspriteTable gSubspriteTables_83CE558[];
extern const struct SubspriteTable gSubspriteTables_83CE560[];
extern const struct SubspriteTable gSubspriteTables_83CE578[];
@@ -56,7 +51,6 @@ extern const struct SpriteTemplate gSpriteTemplate_83CE688;
extern const struct SpriteSheet gUnknown_083CE6A0[];
extern const struct SpritePalette gUnknown_083CE708[];
extern const u8 gNamingScreenMenu_Gfx[];
-extern const u16 gNamingScreenPalettes[];
extern const u16 gUnknown_083CE748[];
extern const u16 gUnknown_083CEBF8[];
extern const u16 gUnknown_083CF0A8[];
@@ -199,12 +193,12 @@ static void VBlankCB_NamingScreen(void)
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
- REG_BG1VOFS = namingScreenData.bg1vOffset;
- REG_BG2VOFS = namingScreenData.bg2vOffset;
+ REG_BG1VOFS = namingScreenDataPtr->bg1vOffset;
+ REG_BG2VOFS = namingScreenDataPtr->bg2vOffset;
REG_BG1CNT &= 0xFFFC;
- REG_BG1CNT |= namingScreenData.unk8;
+ REG_BG1CNT |= namingScreenDataPtr->unk8;
REG_BG2CNT &= 0xFFFC;
- REG_BG2CNT |= namingScreenData.unkA;
+ REG_BG2CNT |= namingScreenDataPtr->unkA;
}
static void StoreNamingScreenParameters(u8 templateNum, u8 *destBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback)
@@ -229,12 +223,12 @@ static void GetNamingScreenParameters(void)
taskId = FindTaskIdByFunc(Task_DoNothing);
task = &gTasks[taskId];
- namingScreenData.templateNum = task->data[0];
- namingScreenData.unk3E = task->data[1];
- namingScreenData.unk40 = task->data[2];
- namingScreenData.unk42 = (task->data[3] << 16) | (u16)task->data[4];
- LoadWordFromTwoHalfwords(&task->data[5], (u32 *)&namingScreenData.destBuffer);
- LoadWordFromTwoHalfwords(&task->data[7], (u32 *)&namingScreenData.returnCallback);
+ namingScreenDataPtr->templateNum = task->data[0];
+ namingScreenDataPtr->unk3E = task->data[1];
+ namingScreenDataPtr->unk40 = task->data[2];
+ namingScreenDataPtr->unk42 = (task->data[3] << 16) | (u16)task->data[4];
+ LoadWordFromTwoHalfwords(&task->data[5], (u32 *)&namingScreenDataPtr->destBuffer);
+ LoadWordFromTwoHalfwords(&task->data[7], (u32 *)&namingScreenDataPtr->returnCallback);
DestroyTask(taskId);
}
@@ -312,20 +306,20 @@ static const struct NamingScreenTemplate *const sNamingScreenTemplates[]; //for
static void NamingScreen_Init(void)
{
GetNamingScreenParameters();
- namingScreenData.state = 0;
- namingScreenData.bg1vOffset = 0;
- namingScreenData.bg2vOffset = 0;
- namingScreenData.unk8 = 1;
- namingScreenData.unkA = 2;
- namingScreenData.unkC = 0;
- namingScreenData.unkD = 1;
- namingScreenData.template = sNamingScreenTemplates[namingScreenData.templateNum];
- namingScreenData.currentPage = namingScreenData.template->unk4;
- namingScreenData.unk2 = 14 - namingScreenData.template->maxChars / 2;
- namingScreenData.unk3C = gKeyRepeatStartDelay;
- memset(namingScreenData.textBuffer, 0xFF, sizeof(namingScreenData.textBuffer));
- if (namingScreenData.template->unk0 != 0)
- StringCopy(namingScreenData.textBuffer, namingScreenData.destBuffer);
+ namingScreenDataPtr->state = 0;
+ namingScreenDataPtr->bg1vOffset = 0;
+ namingScreenDataPtr->bg2vOffset = 0;
+ namingScreenDataPtr->unk8 = 1;
+ namingScreenDataPtr->unkA = 2;
+ namingScreenDataPtr->unkC = 0;
+ namingScreenDataPtr->unkD = 1;
+ namingScreenDataPtr->template = sNamingScreenTemplates[namingScreenDataPtr->templateNum];
+ namingScreenDataPtr->currentPage = namingScreenDataPtr->template->unk4;
+ namingScreenDataPtr->unk2 = 14 - namingScreenDataPtr->template->maxChars / 2;
+ namingScreenDataPtr->unk3C = gKeyRepeatStartDelay;
+ memset(namingScreenDataPtr->textBuffer, 0xFF, sizeof(namingScreenDataPtr->textBuffer));
+ if (namingScreenDataPtr->template->unk0 != 0)
+ StringCopy(namingScreenDataPtr->textBuffer, namingScreenDataPtr->destBuffer);
gKeyRepeatStartDelay = 16;
}
@@ -409,14 +403,14 @@ static void sub_80B5E50(void)
static void Task_NamingScreenMain(u8 taskId)
{
- while (sMainStateFuncs[namingScreenData.state](&gTasks[taskId]) != 0)
+ while (sMainStateFuncs[namingScreenDataPtr->state](&gTasks[taskId]) != 0)
;
}
static bool8 MainState_BeginFadeIn(struct Task *task)
{
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
- namingScreenData.state++;
+ namingScreenDataPtr->state++;
return 0;
}
@@ -426,7 +420,7 @@ static bool8 MainState_WaitFadeIn(struct Task *task)
{
SetInputState(INPUT_STATE_ENABLED);
sub_80B68D8(1);
- namingScreenData.state++;
+ namingScreenDataPtr->state++;
}
return FALSE;
}
@@ -442,7 +436,7 @@ static bool8 MainState_MoveToOKButton(struct Task *task)
{
SetInputState(INPUT_STATE_ENABLED);
MoveCursorToOKButton();
- namingScreenData.state = MAIN_STATE_HANDLE_INPUT;
+ namingScreenDataPtr->state = MAIN_STATE_HANDLE_INPUT;
}
return FALSE;
}
@@ -455,7 +449,7 @@ static bool8 MainState_StartPageSwap(struct Task *task)
sub_80B6888(1);
sub_80B6460(0, 0, 1);
PlaySE(SE_WIN_OPEN);
- namingScreenData.state = MAIN_STATE_WAIT_PAGE_SWAP;
+ namingScreenDataPtr->state = MAIN_STATE_WAIT_PAGE_SWAP;
return FALSE;
}
@@ -466,18 +460,18 @@ static bool8 MainState_WaitPageSwap(struct Task *task)
if (IsPageSwapAnimNotInProgress())
{
- namingScreenData.state = MAIN_STATE_HANDLE_INPUT;
- namingScreenData.currentPage++;
- namingScreenData.currentPage %= 3;
+ namingScreenDataPtr->state = MAIN_STATE_HANDLE_INPUT;
+ namingScreenDataPtr->currentPage++;
+ namingScreenDataPtr->currentPage %= 3;
sub_80B7614();
sub_80B77F8();
SetInputState(INPUT_STATE_ENABLED);
GetCursorPos(&cursorX, &cursorY);
#if ENGLISH
- if (namingScreenData.currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7))
+ if (namingScreenDataPtr->currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7))
cursorX = 5;
#elif GERMAN
- if (namingScreenData.currentPage == PAGE_OTHERS && (cursorX == 7 || cursorX == 8))
+ if (namingScreenDataPtr->currentPage == PAGE_OTHERS && (cursorX == 7 || cursorX == 8))
cursorX = 6;
#endif
SetCursorPos(cursorX, cursorY);
@@ -492,17 +486,17 @@ static bool8 MainState_6(struct Task *task)
SetInputState(INPUT_STATE_DISABLED);
sub_80B68D8(0);
sub_80B6460(3, 0, 1);
- gKeyRepeatStartDelay = namingScreenData.unk3C;
- if (namingScreenData.templateNum == NAMING_SCREEN_TEMPLATE_MON_NAME
+ gKeyRepeatStartDelay = namingScreenDataPtr->unk3C;
+ if (namingScreenDataPtr->templateNum == NAMING_SCREEN_TEMPLATE_MON_NAME
&& CalculatePlayerPartyCount() >= 6)
{
DisplaySentToPCMessage();
- namingScreenData.state = MAIN_STATE_UPDATE_SENT_TO_PC_MESSAGE;
+ namingScreenDataPtr->state = MAIN_STATE_UPDATE_SENT_TO_PC_MESSAGE;
return FALSE;
}
else
{
- namingScreenData.state = MAIN_STATE_BEGIN_FADE_OUT;
+ namingScreenDataPtr->state = MAIN_STATE_BEGIN_FADE_OUT;
return TRUE; //Exit the naming screen
}
}
@@ -510,21 +504,21 @@ static bool8 MainState_6(struct Task *task)
static bool8 MainState_UpdateSentToPCMessage(struct Task *task)
{
if (MenuUpdateWindowText())
- namingScreenData.state++;
+ namingScreenDataPtr->state++;
return FALSE;
}
static bool8 MainState_BeginFadeInOut(struct Task *task)
{
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
- namingScreenData.state++;
+ namingScreenDataPtr->state++;
return FALSE;
}
static bool8 MainState_WaitFadeOutAndExit(struct Task *task)
{
if (!gPaletteFade.active)
- SetMainCallback2(namingScreenData.returnCallback);
+ SetMainCallback2(namingScreenDataPtr->returnCallback);
return FALSE;
}
@@ -585,7 +579,7 @@ static bool8 KeyboardKeyHandler_Character(u8 event)
if (var)
{
SetInputState(INPUT_STATE_DISABLED);
- namingScreenData.state = MAIN_STATE_MOVE_TO_OK_BUTTON;
+ namingScreenDataPtr->state = MAIN_STATE_MOVE_TO_OK_BUTTON;
}
}
return FALSE;
@@ -614,7 +608,7 @@ static bool8 KeyboardKeyHandler_OK(u8 event)
if (event == KBEVENT_PRESSED_A)
{
PlaySE(SE_SELECT);
- namingScreenData.state = MAIN_STATE_6;
+ namingScreenDataPtr->state = MAIN_STATE_6;
return TRUE;
}
else
@@ -623,7 +617,7 @@ static bool8 KeyboardKeyHandler_OK(u8 event)
static bool8 sub_80B61C8(void)
{
- namingScreenData.state = MAIN_STATE_START_PAGE_SWAP;
+ namingScreenDataPtr->state = MAIN_STATE_START_PAGE_SWAP;
return TRUE;
}
@@ -765,9 +759,9 @@ static void HandleDpadMovement(struct Task *task)
{
//The "others" page only has 5 columns
#if ENGLISH
- if (namingScreenData.currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7))
+ if (namingScreenDataPtr->currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7))
#elif GERMAN
- if (namingScreenData.currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7 || cursorX == 8))
+ if (namingScreenDataPtr->currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7 || cursorX == 8))
#endif
{
if (sDpadDeltaX[dpadDir] > 0)
@@ -949,8 +943,8 @@ static void Task_HandlePageSwapAnim(u8 taskId)
static bool8 PageSwapAnimState_Init(struct Task *task)
{
- namingScreenData.bg1vOffset = 0;
- namingScreenData.bg2vOffset = 0;
+ namingScreenDataPtr->bg1vOffset = 0;
+ namingScreenDataPtr->bg2vOffset = 0;
task->tState++;
return 0;
}
@@ -959,19 +953,19 @@ static bool8 PageSwapAnimState_1(struct Task *task)
{
u16 *const arr[] =
{
- &namingScreenData.bg2vOffset,
- &namingScreenData.bg1vOffset
+ &namingScreenDataPtr->bg2vOffset,
+ &namingScreenDataPtr->bg1vOffset
};
task->tFrameCount += 4;
- *arr[namingScreenData.unkC] = Sin(task->tFrameCount, 40);
- *arr[namingScreenData.unkD] = Sin((task->tFrameCount + 128) & 0xFF, 40);
+ *arr[namingScreenDataPtr->unkC] = Sin(task->tFrameCount, 40);
+ *arr[namingScreenDataPtr->unkD] = Sin((task->tFrameCount + 128) & 0xFF, 40);
if (task->tFrameCount >= 64)
{
- u8 temp = namingScreenData.unk8; //Why u8 and not u16?
+ u8 temp = namingScreenDataPtr->unk8; //Why u8 and not u16?
- namingScreenData.unk8 = namingScreenData.unkA;
- namingScreenData.unkA = temp;
+ namingScreenDataPtr->unk8 = namingScreenDataPtr->unkA;
+ namingScreenDataPtr->unkA = temp;
task->tState++;
}
return 0;
@@ -979,17 +973,17 @@ static bool8 PageSwapAnimState_1(struct Task *task)
static bool8 PageSwapAnimState_2(struct Task *task)
{
- u16 *const arr[] = {&namingScreenData.bg2vOffset, &namingScreenData.bg1vOffset};
+ u16 *const arr[] = {&namingScreenDataPtr->bg2vOffset, &namingScreenDataPtr->bg1vOffset};
task->tFrameCount += 4;
- *arr[namingScreenData.unkC] = Sin(task->tFrameCount, 40);
- *arr[namingScreenData.unkD] = Sin((task->tFrameCount + 128) & 0xFF, 40);
+ *arr[namingScreenDataPtr->unkC] = Sin(task->tFrameCount, 40);
+ *arr[namingScreenDataPtr->unkD] = Sin((task->tFrameCount + 128) & 0xFF, 40);
if (task->tFrameCount >= 128)
{
- u8 temp = namingScreenData.unkC;
+ u8 temp = namingScreenDataPtr->unkC;
- namingScreenData.unkC = namingScreenData.unkD;
- namingScreenData.unkD = temp;
+ namingScreenDataPtr->unkC = namingScreenDataPtr->unkD;
+ namingScreenDataPtr->unkD = temp;
task->tState++;
}
return 0;
@@ -1010,11 +1004,11 @@ static bool8 PageSwapAnimState_Done(struct Task *task)
static void CursorInit(void)
{
- namingScreenData.cursorSpriteId = CreateSprite(&gSpriteTemplate_83CE640, 0, 0, 0);
- gSprites[namingScreenData.cursorSpriteId].oam.priority = 1;
- gSprites[namingScreenData.cursorSpriteId].oam.objMode = 1;
- gSprites[namingScreenData.cursorSpriteId].data6 = 1;
- gSprites[namingScreenData.cursorSpriteId].data6 = 2;
+ namingScreenDataPtr->cursorSpriteId = CreateSprite(&gSpriteTemplate_83CE640, 0, 0, 0);
+ gSprites[namingScreenDataPtr->cursorSpriteId].oam.priority = 1;
+ gSprites[namingScreenDataPtr->cursorSpriteId].oam.objMode = 1;
+ gSprites[namingScreenDataPtr->cursorSpriteId].data[6] = 1;
+ gSprites[namingScreenDataPtr->cursorSpriteId].data[6] = 2;
SetCursorPos(0, 0);
}
@@ -1032,27 +1026,27 @@ static const u8 sKeyboardSymbolPositions[][COLUMN_COUNT] = {
static u8 CursorColToKeyboardCol(s16 x)
{
- return sKeyboardSymbolPositions[namingScreenData.currentPage][x];
+ return sKeyboardSymbolPositions[namingScreenDataPtr->currentPage][x];
}
static void SetCursorPos(s16 x, s16 y)
{
- struct Sprite *cursorSprite = &gSprites[namingScreenData.cursorSpriteId];
+ struct Sprite *cursorSprite = &gSprites[namingScreenDataPtr->cursorSpriteId];
cursorSprite->pos1.x = CursorColToKeyboardCol(x) * 8 + 27;
cursorSprite->pos1.y = y * 16 + 80;
- cursorSprite->data2 = cursorSprite->data0;
- cursorSprite->data3 = cursorSprite->data1;
- cursorSprite->data0 = x;
- cursorSprite->data1 = y;
+ cursorSprite->data[2] = cursorSprite->data[0];
+ cursorSprite->data[3] = cursorSprite->data[1];
+ cursorSprite->data[0] = x;
+ cursorSprite->data[1] = y;
}
static void GetCursorPos(s16 *x, s16 *y)
{
- struct Sprite *cursorSprite = &gSprites[namingScreenData.cursorSpriteId];
+ struct Sprite *cursorSprite = &gSprites[namingScreenDataPtr->cursorSpriteId];
- *x = cursorSprite->data0;
- *y = cursorSprite->data1;
+ *x = cursorSprite->data[0];
+ *y = cursorSprite->data[1];
}
static void MoveCursorToOKButton(void)
@@ -1062,25 +1056,25 @@ static void MoveCursorToOKButton(void)
static void sub_80B6888(u8 a)
{
- gSprites[namingScreenData.cursorSpriteId].data4 &= -256;
- gSprites[namingScreenData.cursorSpriteId].data4 |= a;
- StartSpriteAnim(&gSprites[namingScreenData.cursorSpriteId], 0);
+ gSprites[namingScreenDataPtr->cursorSpriteId].data[4] &= -256;
+ gSprites[namingScreenDataPtr->cursorSpriteId].data[4] |= a;
+ StartSpriteAnim(&gSprites[namingScreenDataPtr->cursorSpriteId], 0);
}
static void sub_80B68D8(u8 a)
{
- gSprites[namingScreenData.cursorSpriteId].data4 &= 0xFF;
- gSprites[namingScreenData.cursorSpriteId].data4 |= a << 8;
+ gSprites[namingScreenDataPtr->cursorSpriteId].data[4] &= 0xFF;
+ gSprites[namingScreenDataPtr->cursorSpriteId].data[4] |= a << 8;
}
static void sub_80B6914(void)
{
- StartSpriteAnim(&gSprites[namingScreenData.cursorSpriteId], 1);
+ StartSpriteAnim(&gSprites[namingScreenDataPtr->cursorSpriteId], 1);
}
static bool8 IsCursorAnimFinished(void)
{
- return gSprites[namingScreenData.cursorSpriteId].animEnded;
+ return gSprites[namingScreenDataPtr->cursorSpriteId].animEnded;
}
static u8 GetKeyRoleAtCursorPos(void)
@@ -1100,28 +1094,28 @@ void sub_80B6998(struct Sprite *sprite)
{
if (sprite->animEnded)
StartSpriteAnim(sprite, 0);
- sprite->invisible = (sprite->data4 & 0xFF);
- if (sprite->data0 == COLUMN_COUNT - 1)
+ sprite->invisible = (sprite->data[4] & 0xFF);
+ if (sprite->data[0] == COLUMN_COUNT - 1)
sprite->invisible = TRUE;
- if (sprite->invisible || (sprite->data4 & 0xFF00) == 0
- || sprite->data0 != sprite->data2 || sprite->data1 != sprite->data3)
+ if (sprite->invisible || (sprite->data[4] & 0xFF00) == 0
+ || sprite->data[0] != sprite->data[2] || sprite->data[1] != sprite->data[3])
{
- sprite->data5 = 0;
- sprite->data6 = 1;
- sprite->data7 = 2;
+ sprite->data[5] = 0;
+ sprite->data[6] = 1;
+ sprite->data[7] = 2;
}
- sprite->data7--;
- if (sprite->data7 == 0)
+ sprite->data[7]--;
+ if (sprite->data[7] == 0)
{
- sprite->data5 += sprite->data6;
- if (sprite->data5 == 16 || sprite->data5 == 0)
- sprite->data6 = -sprite->data6;
- sprite->data7 = 2;
+ sprite->data[5] += sprite->data[6];
+ if (sprite->data[5] == 16 || sprite->data[5] == 0)
+ sprite->data[6] = -sprite->data[6];
+ sprite->data[7] = 2;
}
- if ((sprite->data4 & 0xFF00) != 0)
+ if ((sprite->data[4] & 0xFF00) != 0)
{
- s8 gb = sprite->data5;
- s8 r = sprite->data5 >> 1;
+ s8 gb = sprite->data[5];
+ s8 r = sprite->data[5] >> 1;
u16 index = IndexOfSpritePaletteTag(5) * 16 + 0x0101;
MultiplyInvertedPaletteRGBComponents(index, r, gb, gb);
@@ -1135,24 +1129,24 @@ static void sub_80B6A80(void)
u8 spriteId3;
spriteId1 = CreateSprite(&gSpriteTemplate_83CE5C8, 0xCC, 0x50, 0);
- namingScreenData.unk10 = spriteId1;
+ namingScreenDataPtr->unk10 = spriteId1;
SetSubspriteTables(&gSprites[spriteId1], gSubspriteTables_83CE558);
spriteId2 = CreateSprite(&gSpriteTemplate_83CE5F8, 0xCC, 0x4C, 1);
- gSprites[spriteId1].data6 = spriteId2;
+ gSprites[spriteId1].data[6] = spriteId2;
SetSubspriteTables(&gSprites[spriteId2], gSubspriteTables_83CE560);
spriteId3 = CreateSprite(&gSpriteTemplate_83CE5E0, 0xCC, 0x4B, 2);
gSprites[spriteId3].oam.priority = 1;
- gSprites[spriteId1].data7 = spriteId3;
+ gSprites[spriteId1].data[7] = spriteId3;
}
static void sub_80B6B14(void)
{
- struct Sprite *sprite = &gSprites[namingScreenData.unk10];
+ struct Sprite *sprite = &gSprites[namingScreenDataPtr->unk10];
- sprite->data0 = 2;
- sprite->data1 = namingScreenData.currentPage;
+ sprite->data[0] = 2;
+ sprite->data[1] = namingScreenDataPtr->currentPage;
}
static u8 sub_80B6B5C(struct Sprite *);
@@ -1170,17 +1164,17 @@ static u8 (*const gUnknown_083CE2B4[])(struct Sprite *) =
void sub_80B6B34(struct Sprite *sprite)
{
- while (gUnknown_083CE2B4[sprite->data0](sprite) != 0)
+ while (gUnknown_083CE2B4[sprite->data[0]](sprite) != 0)
;
}
static u8 sub_80B6B5C(struct Sprite *sprite)
{
- struct Sprite *sprite1 = &gSprites[sprite->data6];
- struct Sprite *sprite2 = &gSprites[sprite->data7];
+ struct Sprite *sprite1 = &gSprites[sprite->data[6]];
+ struct Sprite *sprite2 = &gSprites[sprite->data[7]];
- sub_80B6C48(namingScreenData.currentPage, sprite1, sprite2);
- sprite->data0++;
+ sub_80B6C48(namingScreenDataPtr->currentPage, sprite1, sprite2);
+ sprite->data[0]++;
return 0;
}
@@ -1191,30 +1185,30 @@ static u8 sub_80B6B98(struct Sprite *sprite)
static u8 sub_80B6B9C(struct Sprite *sprite)
{
- struct Sprite *r4 = &gSprites[sprite->data6];
- struct Sprite *r5 = &gSprites[sprite->data7];
+ struct Sprite *r4 = &gSprites[sprite->data[6]];
+ struct Sprite *r5 = &gSprites[sprite->data[7]];
r4->pos2.y++;
if (r4->pos2.y > 7)
{
- sprite->data0++;
+ sprite->data[0]++;
r4->pos2.y = -4;
r4->invisible = TRUE;
- sub_80B6C48(((u8)sprite->data1 + 1) % 3, r4, r5);
+ sub_80B6C48(((u8)sprite->data[1] + 1) % 3, r4, r5);
}
return 0;
}
static u8 sub_80B6C08(struct Sprite *sprite)
{
- struct Sprite *r2 = &gSprites[sprite->data6];
+ struct Sprite *r2 = &gSprites[sprite->data[6]];
r2->invisible = FALSE;
r2->pos2.y++;
if (r2->pos2.y >= 0)
{
r2->pos2.y = 0;
- sprite->data0 = 1;
+ sprite->data[0] = 1;
}
return 0;
}
@@ -1248,15 +1242,15 @@ static void sub_80B6D04(void)
s16 r1;
u8 i;
- r1 = (namingScreenData.unk2 - 1) * 8 + 4;
+ r1 = (namingScreenDataPtr->unk2 - 1) * 8 + 4;
spriteId = CreateSprite(&gSpriteTemplate_83CE658, r1, 0x28, 0);
gSprites[spriteId].oam.priority = 3;
- r1 = namingScreenData.unk2 * 8 + 4;
- for (i = 0; i < namingScreenData.template->maxChars; i++, r1 += 8)
+ r1 = namingScreenDataPtr->unk2 * 8 + 4;
+ for (i = 0; i < namingScreenDataPtr->template->maxChars; i++, r1 += 8)
{
spriteId = CreateSprite(&gSpriteTemplate_83CE670, r1, 0x2C, 0);
gSprites[spriteId].oam.priority = 3;
- gSprites[spriteId].data0 = i;
+ gSprites[spriteId].data[0] = i;
}
}
@@ -1264,12 +1258,12 @@ void sub_80B6D9C(struct Sprite *sprite)
{
const s16 arr[] = {0, -4, -2, -1};
- if (sprite->data0 == 0 || --sprite->data0 == 0)
+ if (sprite->data[0] == 0 || --sprite->data[0] == 0)
{
- sprite->data0 = 8;
- sprite->data1 = (sprite->data1 + 1) & 3;
+ sprite->data[0] = 8;
+ sprite->data[1] = (sprite->data[1] + 1) & 3;
}
- sprite->pos2.x = arr[sprite->data1];
+ sprite->pos2.x = arr[sprite->data[1]];
}
void sub_80B6DE8(struct Sprite *sprite)
@@ -1278,20 +1272,20 @@ void sub_80B6DE8(struct Sprite *sprite)
u8 var;
var = GetTextCaretPosition();
- if (var != (u8)sprite->data0)
+ if (var != (u8)sprite->data[0])
{
sprite->pos2.y = 0;
- sprite->data1 = 0;
- sprite->data2 = 0;
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
}
else
{
- sprite->pos2.y = arr[sprite->data1];
- sprite->data2++;
- if (sprite->data2 > 8)
+ sprite->pos2.y = arr[sprite->data[1]];
+ sprite->data[2]++;
+ if (sprite->data[2] > 8)
{
- sprite->data1 = (sprite->data1 + 1) & 3;
- sprite->data2 = 0;
+ sprite->data[1] = (sprite->data[1] + 1) & 3;
+ sprite->data[2] = 0;
}
}
}
@@ -1313,7 +1307,7 @@ static void (*const gUnknown_083CE2E0[])(void) =
static void sub_80B6E44(void)
{
- gUnknown_083CE2E0[namingScreenData.template->unk2]();
+ gUnknown_083CE2E0[namingScreenDataPtr->template->unk2]();
}
static void nullsub_40(void)
@@ -1325,7 +1319,7 @@ static void sub_80B6E68(void)
u8 rivalGfxId;
u8 spriteId;
- rivalGfxId = GetRivalAvatarGraphicsIdByStateIdAndGender(0, namingScreenData.unk3E);
+ rivalGfxId = GetRivalAvatarGraphicsIdByStateIdAndGender(0, namingScreenDataPtr->unk3E);
spriteId = AddPseudoFieldObject(rivalGfxId, SpriteCallbackDummy, 0x38, 0x18, 0);
gSprites[spriteId].oam.priority = 3;
StartSpriteAnim(&gSprites[spriteId], 4);
@@ -1345,7 +1339,7 @@ static void sub_80B6EFC(void)
u8 spriteId;
sub_809D51C();
- spriteId = CreateMonIcon(namingScreenData.unk3E, SpriteCallbackDummy, 0x34, 0x18, 0, namingScreenData.unk42);
+ spriteId = CreateMonIcon(namingScreenDataPtr->unk3E, SpriteCallbackDummy, 0x34, 0x18, 0, namingScreenDataPtr->unk42);
gSprites[spriteId].oam.priority = 3;
}
@@ -1353,21 +1347,21 @@ static u8 GetTextCaretPosition(void)
{
u8 i;
- for (i = 0; i < namingScreenData.template->maxChars; i++)
+ for (i = 0; i < namingScreenDataPtr->template->maxChars; i++)
{
- if (namingScreenData.textBuffer[i] == EOS)
+ if (namingScreenDataPtr->textBuffer[i] == EOS)
return i;
}
- return namingScreenData.template->maxChars - 1;
+ return namingScreenDataPtr->template->maxChars - 1;
}
static u8 GetPreviousTextCaretPosition(void)
{
s8 i;
- for (i = namingScreenData.template->maxChars - 1; i > 0; i--)
+ for (i = namingScreenDataPtr->template->maxChars - 1; i > 0; i--)
{
- if (namingScreenData.textBuffer[i] != EOS)
+ if (namingScreenDataPtr->textBuffer[i] != EOS)
return i;
}
return 0;
@@ -1379,9 +1373,9 @@ static void DeleteTextCharacter(void)
u8 var2;
index = GetPreviousTextCaretPosition();
- namingScreenData.textBuffer[index] = 0;
+ namingScreenDataPtr->textBuffer[index] = 0;
sub_80B7960();
- namingScreenData.textBuffer[index] = EOS;
+ namingScreenDataPtr->textBuffer[index] = EOS;
var2 = GetKeyRoleAtCursorPos();
if (var2 == 0 || var2 == 2)
sub_80B6460(1, 0, 1);
@@ -1409,7 +1403,7 @@ static bool8 sub_80B7004(void)
PlaySE(SE_SELECT);
if (r4)
{
- if (GetPreviousTextCaretPosition() == namingScreenData.template->maxChars - 1)
+ if (GetPreviousTextCaretPosition() == namingScreenDataPtr->template->maxChars - 1)
return TRUE;
}
return FALSE;
@@ -1421,7 +1415,7 @@ static void sub_80B7090(void) // DoInput?
u8 r4;
r5 = GetPreviousTextCaretPosition();
- r4 = namingScreenData.textBuffer[r5];
+ r4 = namingScreenDataPtr->textBuffer[r5];
if (sub_80B7198(r4))
{
if (sub_80B7264(r4))
@@ -1446,7 +1440,7 @@ static bool8 sub_80B7104(void)
u8 r4;
r5 = GetPreviousTextCaretPosition();
- r4 = namingScreenData.textBuffer[r5];
+ r4 = namingScreenDataPtr->textBuffer[r5];
if (sub_80B720C(r4))
{
sub_80B72A4(r4, r5);
@@ -1461,7 +1455,7 @@ static bool8 sub_80B713C(void)
u8 r4;
r5 = GetPreviousTextCaretPosition();
- r4 = namingScreenData.textBuffer[r5];
+ r4 = namingScreenDataPtr->textBuffer[r5];
if (sub_80B7264(r4))
{
sub_80B7370(r4, r5);
@@ -1474,7 +1468,7 @@ static void AddTextCharacter(u8 ch)
{
u8 index = GetTextCaretPosition();
- namingScreenData.textBuffer[index] = ch;
+ namingScreenDataPtr->textBuffer[index] = ch;
}
static bool8 sub_80B7198(u8 a)
@@ -1546,7 +1540,7 @@ static void sub_80B72A4(u8 a, u8 b)
chr = a + 0x2C;
else if (a >= 155 && a <= 159)
chr = a + 0xFB;
- namingScreenData.textBuffer[b] = chr;
+ namingScreenDataPtr->textBuffer[b] = chr;
}
static void sub_80B7370(u8 a, u8 b)
@@ -1561,7 +1555,7 @@ static void sub_80B7370(u8 a, u8 b)
chr = a + 0x31;
else if (a >= 150 && a <= 154)
chr = a + 5;
- namingScreenData.textBuffer[b] = chr;
+ namingScreenDataPtr->textBuffer[b] = chr;
}
static void sub_80B73CC(u8 a, u8 b)
@@ -1584,7 +1578,7 @@ static void sub_80B73CC(u8 a, u8 b)
chr = a + 0xCF;
else if (a >= 150 && a <= 154)
chr = a + 0xD4;
- namingScreenData.textBuffer[b] = chr;
+ namingScreenDataPtr->textBuffer[b] = chr;
}
static void sub_80B7474(u8 a, u8 b)
@@ -1595,18 +1589,18 @@ static void sub_80B7474(u8 a, u8 b)
chr = a + 0xCF;
else if (a >= 155 && a <= 159)
chr = a + 0xCF;
- namingScreenData.textBuffer[b] = chr;
+ namingScreenDataPtr->textBuffer[b] = chr;
}
static void sub_80B74B0(void)
{
u8 i;
- for (i = 0; i < namingScreenData.template->maxChars; i++)
+ for (i = 0; i < namingScreenDataPtr->template->maxChars; i++)
{
- if (namingScreenData.textBuffer[i] != 0 && namingScreenData.textBuffer[i] != 0xFF)
+ if (namingScreenDataPtr->textBuffer[i] != 0 && namingScreenDataPtr->textBuffer[i] != 0xFF)
{
- StringCopyN(namingScreenData.destBuffer, namingScreenData.textBuffer, namingScreenData.template->maxChars + 1);
+ StringCopyN(namingScreenDataPtr->destBuffer, namingScreenDataPtr->textBuffer, namingScreenDataPtr->template->maxChars + 1);
break;
}
}
@@ -1614,11 +1608,11 @@ static void sub_80B74B0(void)
static void DisplaySentToPCMessage(void)
{
- StringCopy(gStringVar1, namingScreenData.destBuffer);
+ StringCopy(gStringVar1, namingScreenDataPtr->destBuffer);
StringExpandPlaceholders(gStringVar4, gOtherText_SentToPC);
BasicInitMenuWindow(&gWindowConfig_81E6E88);
MenuDisplayMessageBox();
- sub_8072044(gStringVar4);
+ MenuPrintMessageDefaultCoords(gStringVar4);
}
static void sub_80B753C(void)
@@ -1671,8 +1665,8 @@ static void sub_80B75C4(void)
(u16 *)(VRAM + 0xE800),
};
- gUnknown_083CE2F0[namingScreenData.currentPage][0](arr[namingScreenData.unkC]);
- gUnknown_083CE2F0[namingScreenData.currentPage][1](arr[namingScreenData.unkD]);
+ gUnknown_083CE2F0[namingScreenDataPtr->currentPage][0](arr[namingScreenDataPtr->unkC]);
+ gUnknown_083CE2F0[namingScreenDataPtr->currentPage][1](arr[namingScreenDataPtr->unkD]);
}
static void sub_80B7614(void)
@@ -1683,7 +1677,7 @@ static void sub_80B7614(void)
(u16 *)(VRAM + 0xE800),
};
- gUnknown_083CE2F0[namingScreenData.currentPage][1](arr[namingScreenData.unkD]);
+ gUnknown_083CE2F0[namingScreenDataPtr->currentPage][1](arr[namingScreenDataPtr->unkD]);
}
static void sub_80B7650(u16 *vramBuffer)
@@ -1737,12 +1731,12 @@ static void sub_80B76E0(u16 *vramBuffer, const u16 *src)
static void sub_80B772C(void)
{
- nullsub_20(namingScreenData.currentPage, namingScreenData.unkC);
+ nullsub_20(namingScreenDataPtr->currentPage, namingScreenDataPtr->unkC);
}
static void sub_80B7740(void)
{
- nullsub_20((namingScreenData.currentPage + 1) % 3, namingScreenData.unkD);
+ nullsub_20((namingScreenDataPtr->currentPage + 1) % 3, namingScreenDataPtr->unkD);
}
static void nullsub_20(u8 a, u8 b)
@@ -1803,23 +1797,23 @@ static const u8 sKeyboardCharacters[][4][20]; //forward declaration
static u8 GetCharAtKeyboardPos(s16 a, s16 b)
{
- return sKeyboardCharacters[namingScreenData.currentPage][b][a];
+ return sKeyboardCharacters[namingScreenDataPtr->currentPage][b][a];
}
static void sub_80B7794(void)
{
- BasicInitMenuWindow(gUnknown_083CE328[namingScreenData.currentPage][0][namingScreenData.unkC]);
- gUnknown_083CE310[namingScreenData.currentPage][0]();
- BasicInitMenuWindow(gUnknown_083CE328[namingScreenData.currentPage][1][namingScreenData.unkD]);
- gUnknown_083CE310[namingScreenData.currentPage][1]();
+ BasicInitMenuWindow(gUnknown_083CE328[namingScreenDataPtr->currentPage][0][namingScreenDataPtr->unkC]);
+ gUnknown_083CE310[namingScreenDataPtr->currentPage][0]();
+ BasicInitMenuWindow(gUnknown_083CE328[namingScreenDataPtr->currentPage][1][namingScreenDataPtr->unkD]);
+ gUnknown_083CE310[namingScreenDataPtr->currentPage][1]();
sub_80B772C();
sub_80B7740();
}
static void sub_80B77F8(void)
{
- BasicInitMenuWindow(gUnknown_083CE328[namingScreenData.currentPage][1][namingScreenData.unkD]);
- gUnknown_083CE310[namingScreenData.currentPage][1]();
+ BasicInitMenuWindow(gUnknown_083CE328[namingScreenDataPtr->currentPage][1][namingScreenDataPtr->unkD]);
+ gUnknown_083CE310[namingScreenDataPtr->currentPage][1]();
sub_80B7740();
}
@@ -1850,9 +1844,9 @@ static void PrintKeyboardCharacters(u8 page) //print letters on page
static void sub_80B78A8(void)
{
BasicInitMenuWindow(&gWindowConfig_81E6F4C);
- gUnknown_083CE358[namingScreenData.templateNum]();
- gUnknown_083CE368[namingScreenData.template->unk3]();
- MenuPrint(namingScreenData.template->title, 9, 2);
+ gUnknown_083CE358[namingScreenDataPtr->templateNum]();
+ gUnknown_083CE368[namingScreenDataPtr->template->unk3]();
+ MenuPrint(namingScreenDataPtr->template->title, 9, 2);
}
static void nullsub_61(void)
@@ -1861,7 +1855,7 @@ static void nullsub_61(void)
static void sub_80B78F8(void)
{
- StringCopy(gStringVar1, gSpeciesNames[(s16)namingScreenData.unk3E]);
+ StringCopy(gStringVar1, gSpeciesNames[(s16)namingScreenDataPtr->unk3E]);
}
static void nullsub_62(void)
@@ -1872,9 +1866,9 @@ static void sub_80B7924(void)
{
u8 genderSymbol[2] = _("♂");
- if ((s16)namingScreenData.unk40 != MON_GENDERLESS)
+ if ((s16)namingScreenDataPtr->unk40 != MON_GENDERLESS)
{
- if ((s16)namingScreenData.unk40 == MON_FEMALE)
+ if ((s16)namingScreenDataPtr->unk40 == MON_FEMALE)
genderSymbol[0] = 0xB6; //female symbol
MenuPrint(genderSymbol, 0x14, 4);
}
@@ -1891,9 +1885,9 @@ static void sub_80B7960(void)
string[4] = 0x11;
string[5] = 1;
string += 6;
- StringCopy(string, namingScreenData.textBuffer);
+ StringCopy(string, namingScreenDataPtr->textBuffer);
BasicInitMenuWindow(&gWindowConfig_81E6F4C);
- MenuPrint(gStringVar1, namingScreenData.unk2, 4);
+ MenuPrint(gStringVar1, namingScreenDataPtr->unk2, 4);
}
//--------------------------------------------------
@@ -2035,4 +2029,162 @@ const struct OamData gOamData_83CE4A8 =
.affineParam = 0,
};
-//TODO: dump sprite data
+
+const struct Subsprite gSubspriteTable_83CE4B0[] = {
+ { -20, -16, ST_OAM_H_RECTANGLE, 1, 0, 1 },
+ { 12, -16, ST_OAM_SQUARE, 0, 4, 1 },
+ { -20, -8, ST_OAM_H_RECTANGLE, 1, 5, 1 },
+ { 12, -8, ST_OAM_SQUARE, 0, 9, 1 },
+ { -20, 0, ST_OAM_H_RECTANGLE, 1, 10, 1 },
+ { 12, 0, ST_OAM_SQUARE, 0, 14, 1 },
+ { -20, 8, ST_OAM_H_RECTANGLE, 1, 15, 1 },
+ { 12, 8, ST_OAM_SQUARE, 0, 19, 1 }
+};
+
+const struct Subsprite gSubspriteTable_83CE4F0[] = {
+ { -12, -4, ST_OAM_SQUARE, 0, 0, 1 },
+ { 4, -4, ST_OAM_SQUARE, 0, 1, 1 }
+};
+
+const struct Subsprite gSubspriteTable_83CE500[] = {
+ { -12, -4, ST_OAM_H_RECTANGLE, 0, 0, 1 },
+ { 4, -4, ST_OAM_SQUARE, 0, 2, 1 }
+};
+
+const struct Subsprite gSubspriteTable_83CE510[] = {
+ { -20, -12, ST_OAM_H_RECTANGLE, 1, 0, 1 },
+ { 12, -12, ST_OAM_SQUARE, 0, 4, 1 },
+ { -20, -4, ST_OAM_H_RECTANGLE, 1, 5, 1 },
+ { 12, -4, ST_OAM_SQUARE, 0, 9, 1 },
+ { -20, 4, ST_OAM_H_RECTANGLE, 1, 10, 1 },
+ { 12, 4, ST_OAM_SQUARE, 0, 14, 1 }
+};
+
+const struct Subsprite gSubspriteTable_83CE540[] = {
+ { -8, -12, ST_OAM_H_RECTANGLE, 0, 0, 3 },
+ { -8, -4, ST_OAM_H_RECTANGLE, 0, 2, 3 },
+ { -8, 4, ST_OAM_H_RECTANGLE, 0, 4, 3 }
+};
+
+const struct SubspriteTable gSubspriteTables_83CE558[] = {
+ { 8, gSubspriteTable_83CE4B0 }
+};
+
+const struct SubspriteTable gSubspriteTables_83CE560[] = {
+ { 2, gSubspriteTable_83CE500 },
+ { 2, gSubspriteTable_83CE500 },
+ { 2, gSubspriteTable_83CE500 }
+};
+
+const struct SubspriteTable gSubspriteTables_83CE578[] = {
+ { 6, gSubspriteTable_83CE510 }
+};
+
+const struct SubspriteTable gSubspriteTables_83CE580[] = {
+ { 3, gSubspriteTable_83CE540 }
+};
+
+const struct SpriteFrameImage gSpriteImageTable_83CE588[] = {
+ { gSpriteImage_83CE094, 0xc0 },
+ { gSpriteImage_83CE154, 0xc0 }
+};
+
+const union AnimCmd gSpriteAnim_83CE598[] = {
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_JUMP(0)
+};
+
+const union AnimCmd gSpriteAnim_83CE5A0[] = {
+ ANIMCMD_FRAME(4, 8),
+ ANIMCMD_FRAME(8, 8),
+ ANIMCMD_END
+};
+
+const union AnimCmd gSpriteAnim_83CE5AC[] = {
+ ANIMCMD_FRAME(0, 2),
+ ANIMCMD_FRAME(1, 2),
+ ANIMCMD_JUMP(0)
+};
+
+const union AnimCmd *const gSpriteAnimTable_83CE5B8[] = {
+ gSpriteAnim_83CE598
+};
+
+const union AnimCmd *const gSpriteAnimTable_83CE5BC[] = {
+ gSpriteAnim_83CE598,
+ gSpriteAnim_83CE5A0
+};
+
+const union AnimCmd *const gSpriteAnimTable_83CE5C4[] = {
+ gSpriteAnim_83CE5AC
+};
+
+const struct SpriteTemplate gSpriteTemplate_83CE5C8 = {
+ 2, 4, &gOamData_83CE498, gSpriteAnimTable_83CE5B8, NULL, gDummySpriteAffineAnimTable, sub_80B6B34
+};
+
+const struct SpriteTemplate gSpriteTemplate_83CE5E0 = {
+ 3, 1, &gOamData_83CE4A8, gSpriteAnimTable_83CE5B8, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+const struct SpriteTemplate gSpriteTemplate_83CE5F8 = {
+ 4, 4, &gOamData_83CE498, gSpriteAnimTable_83CE5B8, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+const struct SpriteTemplate gSpriteTemplate_83CE610 = {
+ 0, 6, &gOamData_83CE498, gSpriteAnimTable_83CE5B8, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+const struct SpriteTemplate gSpriteTemplate_83CE628 = {
+ 1, 6, &gOamData_83CE498, gSpriteAnimTable_83CE5B8, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+const struct SpriteTemplate gSpriteTemplate_83CE640 = {
+ 7, 5, &gOamData_83CE4A0, gSpriteAnimTable_83CE5BC, NULL, gDummySpriteAffineAnimTable, sub_80B6998
+};
+
+const struct SpriteTemplate gSpriteTemplate_83CE658 = {
+ 10, 3, &gOamData_83CE498, gSpriteAnimTable_83CE5B8, NULL, gDummySpriteAffineAnimTable, sub_80B6D9C
+};
+
+const struct SpriteTemplate gSpriteTemplate_83CE670 = {
+ 11, 3, &gOamData_83CE498, gSpriteAnimTable_83CE5B8, NULL, gDummySpriteAffineAnimTable, sub_80B6DE8
+};
+
+const struct SpriteTemplate gSpriteTemplate_83CE688 = {
+ 0xFFFF, 0, &gOamData_83CE498, gSpriteAnimTable_83CE5C4, gSpriteImageTable_83CE588, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+const struct SpriteSheet gUnknown_083CE6A0[] = {
+ { gNamingScreenBackButtonTiles, 0x1E0, 0 },
+ { gNamingScreenOKButtonTiles, 0x1E0, 1 },
+ { gNamingScreenChangeKeyboardBoxTiles, 0x280, 2 },
+ { gNamingScreenChangeKeyboardButtonTiles, 0x100, 3 },
+ { gNamingScreenLowerTextTiles, 0x60, 4 },
+ { gNamingScreenUpperTextTiles, 0x60, 5 },
+ { gNamingScreenOthersTextTiles, 0x60, 6 },
+ { gNamingScreenCursorTiles, 0x80, 7 },
+ { gNamingScreenActiveCursorSmallTiles, 0x80, 8 },
+ { gNamingScreenActiveCursorBigTiles, 0x80, 9 },
+ { gNamingScreenRightPointingTriangleTiles, 0x20, 10 },
+ { gNamingScreenUnderscoreTiles, 0x20, 11 },
+ {}
+};
+
+const struct SpritePalette gUnknown_083CE708[] = {
+ {gNamingScreenPalettes[0], 0},
+ {gNamingScreenPalettes[1], 1},
+ {gNamingScreenPalettes[2], 2},
+ {gNamingScreenPalettes[3], 3},
+ {gNamingScreenPalettes[4], 4},
+ {gNamingScreenPalettes[5], 5},
+ {gNamingScreenPalettes[4], 6},
+ {}
+};
+
+const u16 gUnknown_083CE748[] = INCBIN_U16("graphics/naming_screen/lower_keyboard_map.bin");
+
+const u16 gUnknown_083CEBF8[] = INCBIN_U16("graphics/naming_screen/upper_keyboard_map.bin");
+
+const u16 gUnknown_083CF0A8[] = INCBIN_U16("graphics/naming_screen/others_keyboard_map.bin");
+
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/rng.c b/src/engine/random.c
index 7d4b5600e..8f82b722f 100644
--- a/src/rng.c
+++ b/src/engine/random.c
@@ -1,5 +1,5 @@
#include "global.h"
-#include "rng.h"
+#include "random.h"
// The number 1103515245 comes from the example implementation of rand and srand
// in the ISO C standard.
diff --git a/src/record_mixing.c b/src/engine/record_mixing.c
index d1083910c..c8e2e34d5 100644
--- a/src/record_mixing.c
+++ b/src/engine/record_mixing.c
@@ -5,31 +5,28 @@
#include "daycare.h"
#include "dewford_trend.h"
#include "event_data.h"
-#include "fldeff_80C5CD4.h"
+#include "fldeff_recordmixing.h"
#include "item.h"
-#include "items.h"
+#include "constants/items.h"
#include "load_save.h"
#include "link.h"
-#include "mauville_old_man.h"
+#include "mauville_man.h"
#include "menu.h"
#include "mystery_event_script.h"
-#include "rng.h"
-#include "rom4.h"
+#include "random.h"
+#include "overworld.h"
#include "save.h"
#include "script.h"
#include "secret_base.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "string_util.h"
#include "strings2.h"
#include "task.h"
#include "tv.h"
+#include "ewram.h"
-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;
@@ -39,11 +36,11 @@ static u8 gUnknown_0300071C[4];
void *recordMixingSecretBases = &gSaveBlock1.secretBases;
void *recordMixingTvShows = &gSaveBlock1.tvShows;
-void *gUnknown_083D0274 = &gSaveBlock1.unknown_2ABC;
-void *gUnknown_083D0278 = &gSaveBlock1.oldMan;
+void *gUnknown_083D0274 = &gSaveBlock1.pokeNews;
+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 +56,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];
};
@@ -69,31 +66,31 @@ void RecordMixing_PrepareExchangePacket(void)
sub_80BC300();
sub_80C045C();
- memcpy(unk_2018000.secretBases, recordMixingSecretBases, sizeof(unk_2018000.secretBases));
- memcpy(unk_2018000.tvShows, recordMixingTvShows, sizeof(unk_2018000.tvShows));
- 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));
+ memcpy(ewram_2018000.secretBases, recordMixingSecretBases, sizeof(ewram_2018000.secretBases));
+ memcpy(ewram_2018000.tvShows, recordMixingTvShows, sizeof(ewram_2018000.tvShows));
+ memcpy(ewram_2018000.filler1004, gUnknown_083D0274, sizeof(ewram_2008000.filler1004));
+ memcpy(ewram_2018000.filler1044, gUnknown_083D0278, sizeof(ewram_2008000.filler1044));
+ memcpy(ewram_2018000.easyChatPairs, recordMixingEasyChatPairs, sizeof(ewram_2018000.easyChatPairs));
+ gUnknown_02038738.mail[0] = gSaveBlock1.daycare.misc.mail[0];
+ gUnknown_02038738.mail[1] = gSaveBlock1.daycare.misc.mail[1];
+ InitDaycareMailRecordMixing(gSaveBlock1.daycare.mons, &gUnknown_02038738);
+ memcpy(&ewram_2018000.filler10AC, gUnknown_083D0280, sizeof(struct RecordMixingDayCareMail));
+ memcpy(&ewram_2018000.battleTowerRecord, gBattleTowerPlayerRecord, sizeof(struct BattleTowerRecord));
if (GetMultiplayerId() == 0)
- unk_2018000.filler11C8[0] = GetRecordMixingGift();
+ ewram_2018000.filler11C8[0] = GetRecordMixingGift();
}
void RecordMixing_ReceiveExchangePacket(u32 a)
{
- sub_80BD674(unk_2008000.secretBases, sizeof(struct PlayerRecords), a);
- sub_80BFD44((u8 *)unk_2008000.tvShows, sizeof(struct PlayerRecords), a);
- sub_80C0514(unk_2008000.filler1004, sizeof(struct PlayerRecords), 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_80B9F3C(unk_2008000.filler11C8, a);
+ sub_80BD674(ewram_2008000.secretBases, sizeof(struct PlayerRecords), a);
+ sub_80BFD44((u8 *)ewram_2008000.tvShows, sizeof(struct PlayerRecords), a);
+ sub_80C0514(ewram_2008000.filler1004, sizeof(struct PlayerRecords), a);
+ sub_80B9B1C(ewram_2008000.filler1044, sizeof(struct PlayerRecords), a);
+ sub_80FA4E4(ewram_2008000.easyChatPairs, sizeof(struct PlayerRecords), a);
+ sub_80B9C6C((u8 *)&ewram_2008000.filler10AC, sizeof(struct PlayerRecords), a, ewram_2008000.tvShows);
+ sub_80B9B70(&ewram_2008000.battleTowerRecord, sizeof(struct PlayerRecords), a);
+ sub_80B9F3C(ewram_2008000.filler11C8, a);
}
#define tCounter data[0]
@@ -122,7 +119,7 @@ void Task_RecordMixing_Main(u8 taskId)
{
case 0: // init
sub_8007270(gSpecialVar_0x8005);
- VarSet(VAR_0x4000, 1);
+ VarSet(VAR_TEMP_0, 1);
gUnknown_03000718 = 0;
RecordMixing_PrepareExchangePacket();
CreateRecordMixingSprite();
@@ -134,7 +131,7 @@ void Task_RecordMixing_Main(u8 taskId)
if (!gTasks[data[10]].isActive)
{
tState = 2;
- FlagSet(SYS_MIX_RECORD);
+ FlagSet(FLAG_SYS_MIX_RECORD);
DestroyRecordMixingSprite();
DestroyTask(tSndEffTaskId);
}
@@ -250,11 +247,11 @@ void sub_80B95F0(u8 taskId)
task->tState = 0;
task->data[5] = GetMultiplayerId_();
task->func = Task_RecordMixing_SendPacket;
- StorePtrInTaskData(&unk_2018000, &task->data[2]);
+ StorePtrInTaskData(&ewram_2018000, &task->data[2]);
subTaskId = CreateTask(Task_RecordMixing_CopyReceiveBuffer, 0x50);
task->data[10] = subTaskId;
gTasks[subTaskId].data[0] = taskId;
- StorePtrInTaskData((u8 *)&unk_2008000, &gTasks[subTaskId].data[5]);
+ StorePtrInTaskData((u8 *)&ewram_2008000, &gTasks[subTaskId].data[5]);
}
break;
case 5: // wait 60 frames
@@ -447,11 +444,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 +458,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 +508,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,12 +523,12 @@ 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);
- if (r6->unk70 != 0)
+ r6 = (struct DayCareMisc *)(a + b * i);
+ if (r6->numDaycareMons != 0)
{
- for (r7 = 0; r7 < r6->unk70; r7++)
+ for (r7 = 0; r7 < r6->numDaycareMons; r7++)
{
- if (r6->unk74[r7] == 0)
+ if (r6->itemsHeld[r7] == 0)
sp1C[i][r7] = 1;
}
}
@@ -540,7 +537,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 +593,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 +627,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);
@@ -1019,26 +1016,26 @@ void sub_80B9F3C(u16 *a, u8 b)
{
if (!CheckBagHasItem(*a, 1) && !CheckPCHasItem(*a, 1) && AddBagItem(*a, 1))
{
- VarSet(VAR_0x4001, *a);
+ VarSet(VAR_TEMP_1, *a);
StringCopy(gStringVar1, gLinkPlayers[0].name);
if (*a == ITEM_EON_TICKET)
- FlagSet(SYS_HAS_EON_TICKET);
+ FlagSet(FLAG_SYS_HAS_EON_TICKET);
}
else
{
- VarSet(VAR_0x4001, ITEM_NONE);
+ VarSet(VAR_TEMP_1, ITEM_NONE);
}
}
else
{
if (AddBagItem(*a, 1) == TRUE)
{
- VarSet(VAR_0x4001, *a);
+ VarSet(VAR_TEMP_1, *a);
StringCopy(gStringVar1, gLinkPlayers[0].name);
}
else
{
- VarSet(VAR_0x4001, ITEM_NONE);
+ VarSet(VAR_TEMP_1, ITEM_NONE);
}
}
}
diff --git a/src/reset_rtc_screen.c b/src/engine/reset_rtc_screen.c
index d052992ad..67e146899 100644
--- a/src/reset_rtc_screen.c
+++ b/src/engine/reset_rtc_screen.c
@@ -6,7 +6,7 @@
#include "rtc.h"
#include "save.h"
#include "sprite.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "string_util.h"
#include "strings.h"
@@ -27,21 +27,132 @@ struct ResetRtcStruct
extern u16 gSaveFileStatus;
-extern struct ResetRtcStruct gUnknown_08376420[];
-extern struct SpritePalette gUnknown_083764BC;
-extern struct SpriteTemplate gSpriteTemplate_83764E8;
-extern u8 gUnknown_08376500[];
-
void CB2_ResetRtcScreen(void);
void VBlankCB_ResetRtcScreen(void);
void Task_ResetRtcScreen(u8);
+static const struct ResetRtcStruct gUnknown_08376420[5] =
+{
+ {
+ .dataIndex = 3,
+ .minVal = 1,
+ .maxVal = 9999,
+ .left = 0,
+ .right = 2,
+ .unk8 = 0,
+ },
+ {
+ .dataIndex = 4,
+ .minVal = 0,
+ .maxVal = 23,
+ .left = 1,
+ .right = 3,
+ .unk8 = 0,
+ },
+ {
+ .dataIndex = 5,
+ .minVal = 0,
+ .maxVal = 59,
+ .left = 2,
+ .right = 4,
+ .unk8 = 0,
+ },
+ {
+ .dataIndex = 6,
+ .minVal = 0,
+ .maxVal = 59,
+ .left = 3,
+ .right = 5,
+ .unk8 = 0,
+ },
+ {
+ .dataIndex = 7,
+ .minVal = 0,
+ .maxVal = 0,
+ .left = 4,
+ .right = 0,
+ .unk8 = 6,
+ },
+};
+
+const struct OamData gOamData_837645C =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 0,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const u8 gSpriteImage_8376464[] = INCBIN_U8("graphics/unknown_sprites/83764AC/0.4bpp");
+const u8 gSpriteImage_8376484[] = INCBIN_U8("graphics/unknown_sprites/83764AC/1.4bpp");
+
+const u16 Palette_3764A4[] = INCBIN_U16("graphics/unknown/83764A4.gbapal");
+
+const struct SpriteFrameImage gSpriteImageTable_83764AC[] =
+{
+ { gSpriteImage_8376464, 0x20 },
+ { gSpriteImage_8376484, 0x20 },
+};
+
+const struct SpritePalette gUnknown_083764BC =
+{
+ .data = Palette_3764A4,
+ .tag = 0x1000,
+};
+
+const union AnimCmd gSpriteAnim_83764C4[] =
+{
+ ANIMCMD_FRAME(0, 30),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gSpriteAnim_83764CC[] =
+{
+ ANIMCMD_FRAME(0, 158, .vFlip = TRUE),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd gSpriteAnim_83764D4[] =
+{
+ ANIMCMD_FRAME(1, 30),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd *const gSpriteAnimTable_83764DC[] =
+{
+ gSpriteAnim_83764C4,
+ gSpriteAnim_83764CC,
+ gSpriteAnim_83764D4,
+};
+
+const struct SpriteTemplate gSpriteTemplate_83764E8 =
+{
+ .tileTag = 0xFFFF,
+ .paletteTag = 0x1000,
+ .oam = &gOamData_837645C,
+ .anims = gSpriteAnimTable_83764DC,
+ .images = gSpriteImageTable_83764AC,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+const u8 gUnknown_08376500[] = _(" : ");
+
void SpriteCB_ResetRtcCusor0(struct Sprite *sprite)
{
- int state = gTasks[sprite->data0].data[2];
- if (state != sprite->data1)
+ int state = gTasks[sprite->data[0]].data[2];
+ if (state != sprite->data[1])
{
- sprite->data1 = state;
+ sprite->data[1] = state;
switch (state)
{
case 1:
@@ -88,10 +199,10 @@ void SpriteCB_ResetRtcCusor0(struct Sprite *sprite)
void SpriteCB_ResetRtcCusor1(struct Sprite *sprite)
{
- int state = gTasks[sprite->data0].data[2];
- if (state != sprite->data1)
+ int state = gTasks[sprite->data[0]].data[2];
+ if (state != sprite->data[1])
{
- sprite->data1 = state;
+ sprite->data[1] = state;
switch (state)
{
case 1:
@@ -140,13 +251,13 @@ void ResetRtcScreen_CreateCursor(u8 taskId)
spriteId = CreateSpriteAtEnd(&gSpriteTemplate_83764E8, 53, 68, 0);
gSprites[spriteId].callback = SpriteCB_ResetRtcCusor0;
- gSprites[spriteId].data0 = taskId;
- gSprites[spriteId].data1 = -1;
+ gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].data[1] = -1;
spriteId = CreateSpriteAtEnd(&gSpriteTemplate_83764E8, 53, 68, 0);
gSprites[spriteId].callback = SpriteCB_ResetRtcCusor1;
- gSprites[spriteId].data0 = taskId;
- gSprites[spriteId].data1 = -1;
+ gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].data[1] = -1;
}
void ResetRtcScreen_FreeCursorPalette(void)
@@ -235,7 +346,7 @@ void Task_ResetRtc_1(u8 taskId)
{
s16 *data = gTasks[taskId].data;
u8 selection = data[2];
- struct ResetRtcStruct *selectionInfo = &gUnknown_08376420[selection - 1];
+ const struct ResetRtcStruct *selectionInfo = &gUnknown_08376420[selection - 1];
if (gMain.newKeys & B_BUTTON)
{
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 adf39268e..d5de2e408 100644
--- a/src/save.c
+++ b/src/engine/save.c
@@ -3,16 +3,15 @@
#include "gba/flash_internal.h"
#include "save.h"
#include "load_save.h"
-#include "rom4.h"
+#include "overworld.h"
#include "save_failed_screen.h"
+#include "ewram.h"
#define GETVALIDSTATUSBITFIELD ((1 << ARRAY_COUNT(gSaveSectionLocations)) - 1)
#define GETCHUNKSIZE(chunk, n) ((sizeof(chunk) - (0xF80 * (n - 1))) >= 0xF80 ? 0xF80 : (sizeof(chunk) - (0xF80 * (n - 1))))
#define GETBLOCKOFFSET(n) (0xF80 * (n - 1))
#define TOTALNUMSECTORS ((ARRAY_COUNT(gSaveSectionLocations) * 2) + (ARRAY_COUNT(gHallOfFameSaveSectionLocations) * 2)) // there are 2 slots, so double each array count and get the sum.
-extern struct SaveSection unk_2000000; // slow save RAM
-
u16 gLastWrittenSector;
u32 gLastSaveCounter;
u16 gLastKnownGoodSector;
@@ -24,7 +23,6 @@ u16 gSaveFileStatus;
u32 gGameContinueCallback;
extern struct PokemonStorage gPokemonStorage;
-extern struct HallOfFame gHallOfFame;
static EWRAM_DATA u32 gLastSaveSectorStatus = 0; // used but in an unferenced function, so unused
@@ -48,8 +46,8 @@ const struct SaveSectionLocation gSaveSectionLocations[] =
const struct SaveSectionLocation gHallOfFameSaveSectionLocations[] =
{
- {((u8 *) &gHallOfFame) + GETBLOCKOFFSET(1), GETCHUNKSIZE(struct HallOfFame, 1)}, // gHallOfFame is not a proper sym, so the struct must be used.
- {((u8 *) &gHallOfFame) + GETBLOCKOFFSET(2), GETCHUNKSIZE(struct HallOfFame, 2)}
+ {((u8 *) eHallOfFame) + GETBLOCKOFFSET(1), GETCHUNKSIZE(struct HallOfFame, 1)}, // eHallOfFame is not a proper sym, so the struct must be used.
+ {((u8 *) eHallOfFame) + GETBLOCKOFFSET(2), GETCHUNKSIZE(struct HallOfFame, 2)}
};
const u8 gFlashSectors[] = { 0x1E, 0x1F };
@@ -95,7 +93,7 @@ u8 save_write_to_flash(u16 a1, const struct SaveSectionLocation *location)
u32 retVal;
u16 i;
- gFastSaveSection = &unk_2000000;
+ gFastSaveSection = eSaveSection;
if (a1 != 0xFFFF) // for link
{
@@ -156,7 +154,7 @@ u8 HandleWriteSector(u16 a1, const struct SaveSectionLocation *location)
u8 HandleWriteSectorNBytes(u8 sector, u8 *data, u16 size)
{
u16 i;
- struct SaveSection *section = &unk_2000000;
+ struct SaveSection *section = eSaveSection;
for (i = 0; i < sizeof(struct SaveSection); i++)
((char *)section)[i] = 0;
@@ -186,7 +184,7 @@ u8 TryWriteSector(u8 sector, u8 *data)
u32 RestoreSaveBackupVarsAndIncrement(const struct SaveSectionLocation *location) // location is unused
{
- gFastSaveSection = &unk_2000000;
+ gFastSaveSection = eSaveSection;
gLastKnownGoodSector = gLastWrittenSector;
gLastSaveCounter = gSaveCounter;
gLastWrittenSector++;
@@ -199,7 +197,7 @@ u32 RestoreSaveBackupVarsAndIncrement(const struct SaveSectionLocation *location
u32 RestoreSaveBackupVars(const struct SaveSectionLocation *location) // only ever called once, and gSaveBlock2 is passed to this function. location is unused
{
- gFastSaveSection = &unk_2000000;
+ gFastSaveSection = eSaveSection;
gLastKnownGoodSector = gLastWrittenSector;
gLastSaveCounter = gSaveCounter;
gUnknown_03005EB4 = 0;
@@ -282,7 +280,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;
@@ -369,7 +367,7 @@ u8 sub_81257F0(u16 a1, const struct SaveSectionLocation *location)
u8 sub_812587C(u16 a1, const struct SaveSectionLocation *location)
{
u8 retVal;
- gFastSaveSection = &unk_2000000;
+ gFastSaveSection = eSaveSection;
if (a1 != 0xFFFF)
{
retVal = 0xFF;
@@ -402,7 +400,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];
}
}
@@ -537,7 +535,7 @@ u8 GetSaveValidStatus(const struct SaveSectionLocation *location)
u8 sub_8125B88(u8 a1, u8 *data, u16 size)
{
u16 i;
- struct SaveSection *section = &unk_2000000;
+ struct SaveSection *section = eSaveSection;
DoReadFlashWholeSection(a1, section);
if (section->security == UNKNOWN_CHECK_VALUE)
{
@@ -764,7 +762,7 @@ u8 unref_sub_8125FA0(void)
u8 unref_sub_8125FF0(u8 *data, u16 size)
{
u16 i;
- struct UnkSaveSection *section = (struct UnkSaveSection *)&unk_2000000;
+ struct UnkSaveSection *section = (struct UnkSaveSection *)eSaveSection;
for (i = 0; i < sizeof(struct SaveSection); i++)
((char *)section)[i] = 0;
@@ -774,7 +772,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..ba2d46546 100644
--- a/src/save_failed_screen.c
+++ b/src/engine/save_failed_screen.c
@@ -11,6 +11,7 @@
#include "strings.h"
#include "task.h"
#include "text.h"
+#include "ewram.h"
// In English 1.0, the text window is too small, causing text to overflow.
@@ -22,8 +23,6 @@
#define CLOCK_WIN_TOP (MSG_WIN_TOP - 4)
-extern u8 unk_2000000[];
-
static EWRAM_DATA u16 gSaveFailedType = 0;
static EWRAM_DATA u16 gSaveFailedClockInfo[9] = {0};
@@ -267,10 +266,10 @@ static void VBlankCB_UpdateClockGraphics(void)
static bool8 VerifySectorWipe(u16 sector)
{
- u32 *ptr = (u32 *)unk_2000000;
+ u32 *ptr = (u32 *)&gSharedMem;
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..771cb72c7 100644
--- a/src/save_menu_util.c
+++ b/src/engine/save_menu_util.c
@@ -15,7 +15,7 @@ void HandleDrawSaveWindowInfo(s16 left, s16 top)
if (IsResizeSaveWindowEnabled())
width = 13;
- if (FlagGet(SYS_POKEDEX_GET))
+ if (FlagGet(FLAG_SYS_POKEDEX_GET))
{
// print info + dex information.
MenuDrawTextWindow(left, top, left + width, top + 11);
@@ -44,7 +44,7 @@ void HandleCloseSaveWindow(u16 left, u16 top)
if (IsResizeSaveWindowEnabled())
width = 13;
- if (FlagGet(SYS_POKEDEX_GET))
+ if (FlagGet(FLAG_SYS_POKEDEX_GET))
MenuZeroFillWindowRect(left, top, left + width, top + 11);
else
MenuZeroFillWindowRect(left, top, left + width, top + 9);
@@ -106,7 +106,7 @@ u8 GetBadgeCount(void)
u8 badgeCount = 0;
int badgeFlag;
- for (badgeFlag = BADGE01_GET; badgeFlag <= BADGE08_GET; badgeFlag++)
+ for (badgeFlag = FLAG_BADGE01_GET; badgeFlag <= FLAG_BADGE08_GET; badgeFlag++)
if (FlagGet(badgeFlag))
badgeCount++;
diff --git a/src/script.c b/src/engine/script.c
index 8f12da437..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, void *ptr)
+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() == 1)
- ctx->mode = 1;
- return 1;
+ if (ctx->nativePtr() == TRUE)
+ 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;
}
@@ -228,16 +236,16 @@ void ScriptContext2_RunNewScript(const u8 *ptr)
;
}
-u8 *mapheader_get_tagged_pointer(u8 tag)
+static u8 *mapheader_get_tagged_pointer(u8 tag)
{
u8 *mapScripts = gMapHeader.mapScripts;
- if (!mapScripts)
+ if (mapScripts == NULL)
return NULL;
while (1)
{
- if (!*mapScripts)
+ if (*mapScripts == 0)
return NULL;
if (*mapScripts == tag)
{
@@ -248,14 +256,14 @@ u8 *mapheader_get_tagged_pointer(u8 tag)
}
}
-void mapheader_run_script_by_tag(u8 tag)
+static void mapheader_run_script_by_tag(u8 tag)
{
u8 *ptr = mapheader_get_tagged_pointer(tag);
if (ptr)
ScriptContext2_RunNewScript(ptr);
}
-u8 *mapheader_get_first_match_from_tagged_ptr_list(u8 tag)
+static u8 *mapheader_get_first_match_from_tagged_ptr_list(u8 tag)
{
u8 *ptr = mapheader_get_tagged_pointer(tag);
@@ -316,7 +324,7 @@ void mapheader_run_first_tag4_script_list_match(void)
ScriptContext2_RunNewScript(ptr);
}
-u32 CalculateRamScriptChecksum(void)
+static u32 CalculateRamScriptChecksum(void)
{
u32 i;
u32 sum = 0;
diff --git a/src/sound.c b/src/engine/sound.c
index 91f5e06a3..159ad3f70 100644
--- a/src/sound.c
+++ b/src/engine/sound.c
@@ -5,7 +5,7 @@
#include "m4a.h"
#include "main.h"
#include "pokemon.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "task.h"
struct Fanfare
@@ -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..cf35e12a3 100644
--- a/src/sprite.c
+++ b/src/engine/sprite.c
@@ -26,14 +26,6 @@
#define SPRITE_TILE_IS_ALLOCATED(n) ((gSpriteTileAllocBitmap[(n) / 8] >> ((n) % 8)) & 1)
-struct OamMatrix
-{
- s16 a;
- s16 b;
- s16 c;
- s16 d;
-};
-
struct SpriteCopyRequest
{
const u8 *src;
@@ -187,14 +179,7 @@ static const struct Sprite sDummySprite =
.animPaused = 0,
.affineAnimPaused = 0,
.animLoopCounter = 0,
- .data0 = 0,
- .data1 = 0,
- .data2 = 0,
- .data3 = 0,
- .data4 = 0,
- .data5 = 0,
- .data6 = 0,
- .data7 = 0,
+ .data = {0},
.inUse = 0,
.coordOffsetEnabled = 0,
.invisible = 0,
@@ -613,7 +598,7 @@ static u8 CreateSpriteAt(u8 index, const struct SpriteTemplate *template, s16 x,
return index;
}
-u8 CreateSpriteAndAnimate(struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority)
+u8 CreateSpriteAndAnimate(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority)
{
u8 i;
@@ -833,13 +818,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 +835,7 @@ void RequestSpriteCopy(const u8 *src, u8 *dest, u16 size)
}
}
+// these two functions are unused.
void CopyFromSprites(u8 *dest)
{
u32 i;
@@ -916,16 +902,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 +1465,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 +1503,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 +1589,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..1b158d979 100644
--- a/src/text.c
+++ b/src/engine/text.c
@@ -3,7 +3,7 @@
#include "battle.h"
#include "main.h"
#include "palette.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "string_util.h"
@@ -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..c001ddefc 100644
--- a/src/text_window.c
+++ b/src/engine/text_window.c
@@ -18,11 +18,83 @@ static void DrawMessageBox(struct Window *win, u8 left, u8 top, u8 width, u8 hei
static u16 sTextWindowBaseTileNum;
static u16 sMessageBoxBaseTileNum;
-extern const struct FrameGraphics gUnknown_083761F0[20];
+extern const u8 gTextWindowFrame1_Gfx[];
+extern const u8 gTextWindowFrame2_Gfx[];
+extern const u8 gTextWindowFrame3_Gfx[];
+extern const u8 gTextWindowFrame4_Gfx[];
+extern const u8 gTextWindowFrame5_Gfx[];
+extern const u8 gTextWindowFrame6_Gfx[];
+extern const u8 gTextWindowFrame7_Gfx[];
+extern const u8 gTextWindowFrame8_Gfx[];
+extern const u8 gTextWindowFrame9_Gfx[];
+extern const u8 gTextWindowFrame10_Gfx[];
+extern const u8 gTextWindowFrame11_Gfx[];
+extern const u8 gTextWindowFrame12_Gfx[];
+extern const u8 gTextWindowFrame13_Gfx[];
+extern const u8 gTextWindowFrame14_Gfx[];
+extern const u8 gTextWindowFrame15_Gfx[];
+extern const u8 gTextWindowFrame16_Gfx[];
+extern const u8 gTextWindowFrame17_Gfx[];
+extern const u8 gTextWindowFrame18_Gfx[];
+extern const u8 gTextWindowFrame19_Gfx[];
+extern const u8 gTextWindowFrame20_Gfx[];
+
+extern const u16 gTextWindowFrame1_Pal[];
+extern const u16 gTextWindowFrame2_Pal[];
+extern const u16 gTextWindowFrame3_Pal[];
+extern const u16 gTextWindowFrame4_Pal[];
+extern const u16 gTextWindowFrame5_Pal[];
+extern const u16 gTextWindowFrame6_Pal[];
+extern const u16 gTextWindowFrame7_Pal[];
+extern const u16 gTextWindowFrame8_Pal[];
+extern const u16 gTextWindowFrame9_Pal[];
+extern const u16 gTextWindowFrame10_Pal[];
+extern const u16 gTextWindowFrame11_Pal[];
+extern const u16 gTextWindowFrame12_Pal[];
+extern const u16 gTextWindowFrame13_Pal[];
+extern const u16 gTextWindowFrame14_Pal[];
+extern const u16 gTextWindowFrame15_Pal[];
+extern const u16 gTextWindowFrame16_Pal[];
+extern const u16 gTextWindowFrame17_Pal[];
+extern const u16 gTextWindowFrame18_Pal[];
+extern const u16 gTextWindowFrame19_Pal[];
+extern const u16 gTextWindowFrame20_Pal[];
-extern const u16 gMessageBoxTilemap[5][7];
extern const u8 gMessageBox_Gfx[];
+static const struct FrameGraphics gUnknown_083761F0[20] =
+{
+ {gTextWindowFrame1_Gfx, gTextWindowFrame1_Pal},
+ {gTextWindowFrame2_Gfx, gTextWindowFrame2_Pal},
+ {gTextWindowFrame3_Gfx, gTextWindowFrame3_Pal},
+ {gTextWindowFrame4_Gfx, gTextWindowFrame4_Pal},
+ {gTextWindowFrame5_Gfx, gTextWindowFrame5_Pal},
+ {gTextWindowFrame6_Gfx, gTextWindowFrame6_Pal},
+ {gTextWindowFrame7_Gfx, gTextWindowFrame7_Pal},
+ {gTextWindowFrame8_Gfx, gTextWindowFrame8_Pal},
+ {gTextWindowFrame9_Gfx, gTextWindowFrame9_Pal},
+ {gTextWindowFrame10_Gfx, gTextWindowFrame10_Pal},
+ {gTextWindowFrame11_Gfx, gTextWindowFrame11_Pal},
+ {gTextWindowFrame12_Gfx, gTextWindowFrame12_Pal},
+ {gTextWindowFrame13_Gfx, gTextWindowFrame13_Pal},
+ {gTextWindowFrame14_Gfx, gTextWindowFrame14_Pal},
+ {gTextWindowFrame15_Gfx, gTextWindowFrame15_Pal},
+ {gTextWindowFrame16_Gfx, gTextWindowFrame16_Pal},
+ {gTextWindowFrame17_Gfx, gTextWindowFrame17_Pal},
+ {gTextWindowFrame18_Gfx, gTextWindowFrame18_Pal},
+ {gTextWindowFrame19_Gfx, gTextWindowFrame19_Pal},
+ {gTextWindowFrame20_Gfx, gTextWindowFrame20_Pal},
+};
+
+static const u16 gMessageBoxTilemap[5][7] =
+{
+ {1, 3, 4, 4, 5, 6, 9},
+ {11, 9, 9, 9, 9, 0x040B, 9},
+ {7, 9, 9, 9, 9, 10, 9},
+ {0x080B, 9, 9, 9, 9, 0x0C0B, 9},
+ {0x0801, 0x0803, 0x0804, 0x0804, 0x0805, 0x0806, 9},
+};
+
u16 SetTextWindowBaseTileNum(u16 baseTileNum)
{
sTextWindowBaseTileNum = baseTileNum;
diff --git a/src/engine/tileset_anim.c b/src/engine/tileset_anim.c
new file mode 100644
index 000000000..abd38edad
--- /dev/null
+++ b/src/engine/tileset_anim.c
@@ -0,0 +1,991 @@
+#include "global.h"
+#include "tileset_anim.h"
+
+struct Dma
+{
+ const void *src;
+ const void *dest;
+ u16 size;
+};
+
+EWRAM_DATA static struct Dma gTilesetAnimDmas[20] = {0};
+
+static u8 gNumTilesetAnimDmas;
+static u16 gTileset1AnimFrame;
+static u16 gTileset1AnimLength;
+static u16 gTileset2AnimFrame;
+static u16 gTileset2AnimLength;
+static void (*gTileset1AnimCallback)(u16);
+static void (*gTileset2AnimCallback)(u16);
+
+static void StartTileset1Animation(void);
+static void StartTileset2Animation(void);
+
+static void sub_8073014(u16);
+static void sub_8073058(u16);
+
+static void sub_8073070(u16);
+static void sub_8073098(u16);
+static void sub_80730C0(u16);
+static void sub_80730E8(u16);
+static void sub_807361C(u16);
+
+static void sub_8073424(u16);
+static void sub_80734A0(u16);
+static void sub_8073514(u16);
+static void sub_8073540(u16);
+static void sub_80735B4(u16);
+static void sub_80735E4(u16);
+static void sub_80738A8(u16);
+static void sub_8073600(u16);
+static void sub_80738C0(u16);
+static void sub_8073890(u16);
+static void sub_80738EC(u16);
+
+static void sub_80737A4(u16, u8);
+static void sub_80737E0(u16);
+static void sub_8073704(u16, u8);
+static void sub_8073644(u8);
+static void sub_8073808(u16);
+static void sub_8073830(u16, u8);
+static void sub_807368C(u8);
+static void sub_80736DC(u8);
+static void sub_80736B4(u8);
+static void sub_8073868(u16);
+
+static void sub_8073904(u16);
+static void sub_80739C4(u16);
+static void sub_807392C(u16);
+static void sub_807399C(u16);
+static void sub_8073974(u16);
+static void sub_80739EC(u16);
+
+static const u8 TilesetAnimTiles_General_0_1[] = INCBIN_U8("data/tilesets/primary/general/anim/0/1.4bpp");
+static const u8 TilesetAnimTiles_General_0_0[] = INCBIN_U8("data/tilesets/primary/general/anim/0/0.4bpp");
+static const u8 TilesetAnimTiles_General_0_2[] = INCBIN_U8("data/tilesets/primary/general/anim/0/2.4bpp");
+asm(".space 32");
+
+static const u8 *const gTilesetAnimTable_General_0[] =
+{
+ TilesetAnimTiles_General_0_0,
+ TilesetAnimTiles_General_0_1,
+ TilesetAnimTiles_General_0_0,
+ TilesetAnimTiles_General_0_2,
+};
+
+static const u8 TilesetAnimTiles_General_1_0[] = INCBIN_U8("data/tilesets/primary/general/anim/1/0.4bpp");
+static const u8 TilesetAnimTiles_General_1_1[] = INCBIN_U8("data/tilesets/primary/general/anim/1/1.4bpp");
+static const u8 TilesetAnimTiles_General_1_2[] = INCBIN_U8("data/tilesets/primary/general/anim/1/2.4bpp");
+static const u8 TilesetAnimTiles_General_1_3[] = INCBIN_U8("data/tilesets/primary/general/anim/1/3.4bpp");
+static const u8 TilesetAnimTiles_General_1_4[] = INCBIN_U8("data/tilesets/primary/general/anim/1/4.4bpp");
+static const u8 TilesetAnimTiles_General_1_5[] = INCBIN_U8("data/tilesets/primary/general/anim/1/5.4bpp");
+static const u8 TilesetAnimTiles_General_1_6[] = INCBIN_U8("data/tilesets/primary/general/anim/1/6.4bpp");
+static const u8 TilesetAnimTiles_General_1_7[] = INCBIN_U8("data/tilesets/primary/general/anim/1/7.4bpp");
+
+static const u8 *const gTilesetAnimTable_General_1[] =
+{
+ TilesetAnimTiles_General_1_0,
+ TilesetAnimTiles_General_1_1,
+ TilesetAnimTiles_General_1_2,
+ TilesetAnimTiles_General_1_3,
+ TilesetAnimTiles_General_1_4,
+ TilesetAnimTiles_General_1_5,
+ TilesetAnimTiles_General_1_6,
+ TilesetAnimTiles_General_1_7,
+};
+
+static const u8 TilesetAnimTiles_General_2_0[] = INCBIN_U8("data/tilesets/primary/general/anim/2/0.4bpp");
+static const u8 TilesetAnimTiles_General_2_1[] = INCBIN_U8("data/tilesets/primary/general/anim/2/1.4bpp");
+static const u8 TilesetAnimTiles_General_2_2[] = INCBIN_U8("data/tilesets/primary/general/anim/2/2.4bpp");
+static const u8 TilesetAnimTiles_General_2_3[] = INCBIN_U8("data/tilesets/primary/general/anim/2/3.4bpp");
+static const u8 TilesetAnimTiles_General_2_4[] = INCBIN_U8("data/tilesets/primary/general/anim/2/4.4bpp");
+static const u8 TilesetAnimTiles_General_2_5[] = INCBIN_U8("data/tilesets/primary/general/anim/2/5.4bpp");
+static const u8 TilesetAnimTiles_General_2_6[] = INCBIN_U8("data/tilesets/primary/general/anim/2/6.4bpp");
+
+static const u8 *const gTilesetAnimTable_General_2[] =
+{
+ TilesetAnimTiles_General_2_0,
+ TilesetAnimTiles_General_2_1,
+ TilesetAnimTiles_General_2_2,
+ TilesetAnimTiles_General_2_3,
+ TilesetAnimTiles_General_2_4,
+ TilesetAnimTiles_General_2_5,
+ TilesetAnimTiles_General_2_6,
+ TilesetAnimTiles_General_2_0,
+};
+
+static const u8 TilesetAnimTiles_General_3_0[] = INCBIN_U8("data/tilesets/primary/general/anim/3/0.4bpp");
+static const u8 TilesetAnimTiles_General_3_1[] = INCBIN_U8("data/tilesets/primary/general/anim/3/1.4bpp");
+static const u8 TilesetAnimTiles_General_3_2[] = INCBIN_U8("data/tilesets/primary/general/anim/3/2.4bpp");
+static const u8 TilesetAnimTiles_General_3_3[] = INCBIN_U8("data/tilesets/primary/general/anim/3/3.4bpp");
+
+static const u8 *const gTilesetAnimTable_General_3[] =
+{
+ TilesetAnimTiles_General_3_0,
+ TilesetAnimTiles_General_3_1,
+ TilesetAnimTiles_General_3_2,
+ TilesetAnimTiles_General_3_3,
+};
+
+static const u8 TilesetAnimTiles_General_4_0[] = INCBIN_U8("data/tilesets/primary/general/anim/4/0.4bpp");
+static const u8 TilesetAnimTiles_General_4_1[] = INCBIN_U8("data/tilesets/primary/general/anim/4/1.4bpp");
+static const u8 TilesetAnimTiles_General_4_2[] = INCBIN_U8("data/tilesets/primary/general/anim/4/2.4bpp");
+static const u8 TilesetAnimTiles_General_4_3[] = INCBIN_U8("data/tilesets/primary/general/anim/4/3.4bpp");
+
+static const u8 *const gTilesetAnimTable_General_4[] =
+{
+ TilesetAnimTiles_General_4_0,
+ TilesetAnimTiles_General_4_1,
+ TilesetAnimTiles_General_4_2,
+ TilesetAnimTiles_General_4_3,
+};
+
+static const u8 TilesetAnimTiles_Lavaridge_0[] = INCBIN_U8("data/tilesets/secondary/lavaridge/anim/0.4bpp");
+static const u8 TilesetAnimTiles_Lavaridge_1[] = INCBIN_U8("data/tilesets/secondary/lavaridge/anim/1.4bpp");
+static const u8 TilesetAnimTiles_Lavaridge_2[] = INCBIN_U8("data/tilesets/secondary/lavaridge/anim/2.4bpp");
+static const u8 TilesetAnimTiles_Lavaridge_3[] = INCBIN_U8("data/tilesets/secondary/lavaridge/anim/3.4bpp");
+
+static const u8 *const gTilesetAnimTable_Lavaridge[] =
+{
+ TilesetAnimTiles_Lavaridge_0,
+ TilesetAnimTiles_Lavaridge_1,
+ TilesetAnimTiles_Lavaridge_2,
+ TilesetAnimTiles_Lavaridge_3,
+};
+
+static const u8 TilesetAnimTiles_Pacifidlog_0_0[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/0/0.4bpp");
+static const u8 TilesetAnimTiles_Pacifidlog_0_1[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/0/1.4bpp");
+static const u8 TilesetAnimTiles_Pacifidlog_0_2[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/0/2.4bpp");
+
+static const u8 *const gTilesetAnimTable_Pacifidlog_0[] =
+{
+ TilesetAnimTiles_Pacifidlog_0_0,
+ TilesetAnimTiles_Pacifidlog_0_1,
+ TilesetAnimTiles_Pacifidlog_0_2,
+ TilesetAnimTiles_Pacifidlog_0_1,
+};
+
+static const u8 TilesetAnimTiles_Underwater_0[] = INCBIN_U8("data/tilesets/secondary/underwater/anim/0.4bpp");
+static const u8 TilesetAnimTiles_Underwater_1[] = INCBIN_U8("data/tilesets/secondary/underwater/anim/1.4bpp");
+static const u8 TilesetAnimTiles_Underwater_2[] = INCBIN_U8("data/tilesets/secondary/underwater/anim/2.4bpp");
+static const u8 TilesetAnimTiles_Underwater_3[] = INCBIN_U8("data/tilesets/secondary/underwater/anim/3.4bpp");
+
+static const u8 *const gTilesetAnimTable_Underwater[] =
+{
+ TilesetAnimTiles_Underwater_0,
+ TilesetAnimTiles_Underwater_1,
+ TilesetAnimTiles_Underwater_2,
+ TilesetAnimTiles_Underwater_3,
+};
+
+static const u8 TilesetAnimTiles_Pacifidlog_1_0[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/1/0.4bpp");
+static const u8 TilesetAnimTiles_Pacifidlog_1_1[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/1/1.4bpp");
+static const u8 TilesetAnimTiles_Pacifidlog_1_2[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/1/2.4bpp");
+static const u8 TilesetAnimTiles_Pacifidlog_1_3[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/1/3.4bpp");
+static const u8 TilesetAnimTiles_Pacifidlog_1_4[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/1/4.4bpp");
+static const u8 TilesetAnimTiles_Pacifidlog_1_5[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/1/5.4bpp");
+static const u8 TilesetAnimTiles_Pacifidlog_1_6[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/1/6.4bpp");
+static const u8 TilesetAnimTiles_Pacifidlog_1_7[] = INCBIN_U8("data/tilesets/secondary/pacifidlog/anim/1/7.4bpp");
+
+static const u8 *const gTilesetAnimTable_Pacifidlog_1[] =
+{
+ TilesetAnimTiles_Pacifidlog_1_0,
+ TilesetAnimTiles_Pacifidlog_1_1,
+ TilesetAnimTiles_Pacifidlog_1_2,
+ TilesetAnimTiles_Pacifidlog_1_3,
+ TilesetAnimTiles_Pacifidlog_1_4,
+ TilesetAnimTiles_Pacifidlog_1_5,
+ TilesetAnimTiles_Pacifidlog_1_6,
+ TilesetAnimTiles_Pacifidlog_1_7,
+};
+
+static const u8 TilesetAnimTiles_Mauville_0_0[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/0/0.4bpp");
+static const u8 TilesetAnimTiles_Mauville_0_1[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/0/1.4bpp");
+static const u8 TilesetAnimTiles_Mauville_0_2[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/0/2.4bpp");
+static const u8 TilesetAnimTiles_Mauville_0_3[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/0/3.4bpp");
+static const u8 TilesetAnimTiles_Mauville_0_4[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/0/4.4bpp");
+
+static const u8 TilesetAnimTiles_Mauville_1_0[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/1/0.4bpp");
+static const u8 TilesetAnimTiles_Mauville_1_1[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/1/1.4bpp");
+static const u8 TilesetAnimTiles_Mauville_1_2[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/1/2.4bpp");
+static const u8 TilesetAnimTiles_Mauville_1_3[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/1/3.4bpp");
+static const u8 TilesetAnimTiles_Mauville_1_4[] = INCBIN_U8("data/tilesets/secondary/mauville/anim/1/4.4bpp");
+
+static const void *const gUnknown_0837BAE4[] =
+{
+ (void *)(VRAM + 0x4C00),
+ (void *)(VRAM + 0x4C80),
+ (void *)(VRAM + 0x4D00),
+ (void *)(VRAM + 0x4D80),
+ (void *)(VRAM + 0x4E00),
+ (void *)(VRAM + 0x4E80),
+ (void *)(VRAM + 0x4F00),
+ (void *)(VRAM + 0x4F80),
+};
+
+static const void *const gUnknown_0837BB04[] =
+{
+ (void *)(VRAM + 0x5000),
+ (void *)(VRAM + 0x5080),
+ (void *)(VRAM + 0x5100),
+ (void *)(VRAM + 0x5180),
+ (void *)(VRAM + 0x5200),
+ (void *)(VRAM + 0x5280),
+ (void *)(VRAM + 0x5300),
+ (void *)(VRAM + 0x5380),
+};
+
+static const u8 *const gTilesetAnimTable_Mauville_0A[] =
+{
+ TilesetAnimTiles_Mauville_0_0,
+ TilesetAnimTiles_Mauville_0_0,
+ TilesetAnimTiles_Mauville_0_1,
+ TilesetAnimTiles_Mauville_0_2,
+ TilesetAnimTiles_Mauville_0_3,
+ TilesetAnimTiles_Mauville_0_3,
+ TilesetAnimTiles_Mauville_0_3,
+ TilesetAnimTiles_Mauville_0_3,
+ TilesetAnimTiles_Mauville_0_3,
+ TilesetAnimTiles_Mauville_0_3,
+ TilesetAnimTiles_Mauville_0_2,
+ TilesetAnimTiles_Mauville_0_1,
+};
+
+static const u8 *const gTilesetAnimTable_Mauville_1A[] =
+{
+ TilesetAnimTiles_Mauville_1_0,
+ TilesetAnimTiles_Mauville_1_0,
+ TilesetAnimTiles_Mauville_1_1,
+ TilesetAnimTiles_Mauville_1_2,
+ TilesetAnimTiles_Mauville_1_3,
+ TilesetAnimTiles_Mauville_1_3,
+ TilesetAnimTiles_Mauville_1_3,
+ TilesetAnimTiles_Mauville_1_3,
+ TilesetAnimTiles_Mauville_1_3,
+ TilesetAnimTiles_Mauville_1_3,
+ TilesetAnimTiles_Mauville_1_2,
+ TilesetAnimTiles_Mauville_1_1,
+};
+
+static const u8 *const gTilesetAnimTable_Mauville_0B[] =
+{
+ TilesetAnimTiles_Mauville_0_0,
+ TilesetAnimTiles_Mauville_0_0,
+ TilesetAnimTiles_Mauville_0_4,
+ TilesetAnimTiles_Mauville_0_4,
+};
+
+static const u8 *const gTilesetAnimTable_Mauville_1B[] =
+{
+ TilesetAnimTiles_Mauville_1_0,
+ TilesetAnimTiles_Mauville_1_0,
+ TilesetAnimTiles_Mauville_1_4,
+ TilesetAnimTiles_Mauville_1_4,
+};
+
+static const u8 TilesetAnimTiles_Rustboro_0_0[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/0/0.4bpp");
+static const u8 TilesetAnimTiles_Rustboro_0_1[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/0/1.4bpp");
+static const u8 TilesetAnimTiles_Rustboro_0_2[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/0/2.4bpp");
+static const u8 TilesetAnimTiles_Rustboro_0_3[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/0/3.4bpp");
+static const u8 TilesetAnimTiles_Rustboro_0_4[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/0/4.4bpp");
+static const u8 TilesetAnimTiles_Rustboro_0_5[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/0/5.4bpp");
+static const u8 TilesetAnimTiles_Rustboro_0_6[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/0/6.4bpp");
+static const u8 TilesetAnimTiles_Rustboro_0_7[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/0/7.4bpp");
+
+static const void *const gUnknown_0837BFA4[] =
+{
+ (void *)(VRAM + 0x5000),
+ (void *)(VRAM + 0x5080),
+ (void *)(VRAM + 0x5100),
+ (void *)(VRAM + 0x5180),
+ (void *)(VRAM + 0x5200),
+ (void *)(VRAM + 0x5280),
+ (void *)(VRAM + 0x5300),
+ (void *)(VRAM + 0x5380),
+};
+
+static const u8 *const gTilesetAnimTable_Rustboro_0[] =
+{
+ TilesetAnimTiles_Rustboro_0_0,
+ TilesetAnimTiles_Rustboro_0_1,
+ TilesetAnimTiles_Rustboro_0_2,
+ TilesetAnimTiles_Rustboro_0_3,
+ TilesetAnimTiles_Rustboro_0_4,
+ TilesetAnimTiles_Rustboro_0_5,
+ TilesetAnimTiles_Rustboro_0_6,
+ TilesetAnimTiles_Rustboro_0_7,
+};
+
+static const u8 TilesetAnimTiles_Rustboro_1_0[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/1/0.4bpp");
+static const u8 TilesetAnimTiles_Rustboro_1_1[] = INCBIN_U8("data/tilesets/secondary/rustboro/anim/1/1.4bpp");
+
+static const u8 *const gTilesetAnimTable_Rustboro_1[] =
+{
+ TilesetAnimTiles_Rustboro_1_0,
+ TilesetAnimTiles_Rustboro_1_1,
+};
+
+static const u8 TilesetAnimTiles_Cave_0[] = INCBIN_U8("data/tilesets/secondary/cave/anim/0.4bpp");
+static const u8 TilesetAnimTiles_Cave_1[] = INCBIN_U8("data/tilesets/secondary/cave/anim/1.4bpp");
+static const u8 TilesetAnimTiles_Cave_2[] = INCBIN_U8("data/tilesets/secondary/cave/anim/2.4bpp");
+static const u8 TilesetAnimTiles_Cave_3[] = INCBIN_U8("data/tilesets/secondary/cave/anim/3.4bpp");
+// unused anim tiles for cave
+static const u8 TilesetAnimTiles_Cave_4[] = INCBIN_U8("data/tilesets/secondary/cave/anim/unused/0.4bpp");
+static const u8 TilesetAnimTiles_Cave_5[] = INCBIN_U8("data/tilesets/secondary/cave/anim/unused/1.4bpp");
+static const u8 TilesetAnimTiles_Cave_6[] = INCBIN_U8("data/tilesets/secondary/cave/anim/unused/2.4bpp");
+static const u8 TilesetAnimTiles_Cave_7[] = INCBIN_U8("data/tilesets/secondary/cave/anim/unused/3.4bpp");
+asm(".space 32");
+
+static const u8 *const gTilesetAnimTable_Cave[] =
+{
+ TilesetAnimTiles_Cave_0,
+ TilesetAnimTiles_Cave_1,
+ TilesetAnimTiles_Cave_2,
+ TilesetAnimTiles_Cave_3,
+};
+
+static const u8 TilesetAnimTiles_EverGrande_0[] = INCBIN_U8("data/tilesets/secondary/ever_grande/anim/0.4bpp");
+static const u8 TilesetAnimTiles_EverGrande_1[] = INCBIN_U8("data/tilesets/secondary/ever_grande/anim/1.4bpp");
+static const u8 TilesetAnimTiles_EverGrande_2[] = INCBIN_U8("data/tilesets/secondary/ever_grande/anim/2.4bpp");
+static const u8 TilesetAnimTiles_EverGrande_3[] = INCBIN_U8("data/tilesets/secondary/ever_grande/anim/3.4bpp");
+static const u8 TilesetAnimTiles_EverGrande_4[] = INCBIN_U8("data/tilesets/secondary/ever_grande/anim/4.4bpp");
+static const u8 TilesetAnimTiles_EverGrande_5[] = INCBIN_U8("data/tilesets/secondary/ever_grande/anim/5.4bpp");
+static const u8 TilesetAnimTiles_EverGrande_6[] = INCBIN_U8("data/tilesets/secondary/ever_grande/anim/6.4bpp");
+static const u8 TilesetAnimTiles_EverGrande_7[] = INCBIN_U8("data/tilesets/secondary/ever_grande/anim/7.4bpp");
+asm(".space 32");
+
+static const void *const gUnknown_0837C93C[] =
+{
+ (void *)(VRAM + 0x5C00),
+ (void *)(VRAM + 0x5C80),
+ (void *)(VRAM + 0x5D00),
+ (void *)(VRAM + 0x5D80),
+ (void *)(VRAM + 0x5E00),
+ (void *)(VRAM + 0x5E80),
+ (void *)(VRAM + 0x5F00),
+ (void *)(VRAM + 0x5F80),
+};
+
+static const u8 *const gTilesetAnimTable_EverGrande[] =
+{
+ TilesetAnimTiles_EverGrande_0,
+ TilesetAnimTiles_EverGrande_1,
+ TilesetAnimTiles_EverGrande_2,
+ TilesetAnimTiles_EverGrande_3,
+ TilesetAnimTiles_EverGrande_4,
+ TilesetAnimTiles_EverGrande_5,
+ TilesetAnimTiles_EverGrande_6,
+ TilesetAnimTiles_EverGrande_7,
+};
+
+static const u8 TilesetAnimTiles_Building_0[] = INCBIN_U8("data/tilesets/primary/building/anim/0.4bpp");
+static const u8 TilesetAnimTiles_Building_1[] = INCBIN_U8("data/tilesets/primary/building/anim/1.4bpp");
+
+static const u8 *const gTilesetAnimTable_Building[] =
+{
+ TilesetAnimTiles_Building_0,
+ TilesetAnimTiles_Building_1,
+};
+
+static const u8 TilesetAnimTiles_SootopolisGym_0_0[] = INCBIN_U8("data/tilesets/secondary/sootopolis_gym/anim/0/0.4bpp");
+static const u8 TilesetAnimTiles_SootopolisGym_0_1[] = INCBIN_U8("data/tilesets/secondary/sootopolis_gym/anim/0/1.4bpp");
+static const u8 TilesetAnimTiles_SootopolisGym_0_2[] = INCBIN_U8("data/tilesets/secondary/sootopolis_gym/anim/0/2.4bpp");
+static const u8 TilesetAnimTiles_SootopolisGym_1_0[] = INCBIN_U8("data/tilesets/secondary/sootopolis_gym/anim/1/0.4bpp");
+static const u8 TilesetAnimTiles_SootopolisGym_1_1[] = INCBIN_U8("data/tilesets/secondary/sootopolis_gym/anim/1/1.4bpp");
+static const u8 TilesetAnimTiles_SootopolisGym_1_2[] = INCBIN_U8("data/tilesets/secondary/sootopolis_gym/anim/1/2.4bpp");
+
+static const u8 *const gTilesetAnimTable_SootopolisGym_0[] =
+{
+ TilesetAnimTiles_SootopolisGym_0_0,
+ TilesetAnimTiles_SootopolisGym_0_1,
+ TilesetAnimTiles_SootopolisGym_0_2,
+};
+
+static const u8 *const gTilesetAnimTable_SootopolisGym_1[] =
+{
+ TilesetAnimTiles_SootopolisGym_1_0,
+ TilesetAnimTiles_SootopolisGym_1_1,
+ TilesetAnimTiles_SootopolisGym_1_2,
+};
+
+static const u8 TilesetAnimTiles_EliteFour_1_0[] = INCBIN_U8("data/tilesets/secondary/elite_four/anim/1/0.4bpp");
+static const u8 TilesetAnimTiles_EliteFour_1_1[] = INCBIN_U8("data/tilesets/secondary/elite_four/anim/1/1.4bpp");
+static const u8 TilesetAnimTiles_EliteFour_0_0[] = INCBIN_U8("data/tilesets/secondary/elite_four/anim/0/0.4bpp");
+static const u8 TilesetAnimTiles_EliteFour_0_1[] = INCBIN_U8("data/tilesets/secondary/elite_four/anim/0/1.4bpp");
+static const u8 TilesetAnimTiles_EliteFour_0_2[] = INCBIN_U8("data/tilesets/secondary/elite_four/anim/0/2.4bpp");
+static const u8 TilesetAnimTiles_EliteFour_0_3[] = INCBIN_U8("data/tilesets/secondary/elite_four/anim/0/3.4bpp");
+asm(".space 32");
+
+static const u8 *const gTilesetAnimTable_EliteFour_0[] =
+{
+ TilesetAnimTiles_EliteFour_0_0,
+ TilesetAnimTiles_EliteFour_0_1,
+ TilesetAnimTiles_EliteFour_0_2,
+ TilesetAnimTiles_EliteFour_0_3,
+};
+
+static const u8 *const gTilesetAnimTable_EliteFour_1[] =
+{
+ TilesetAnimTiles_EliteFour_1_0,
+ TilesetAnimTiles_EliteFour_1_1,
+};
+
+static const u8 TilesetAnimTiles_MauvilleGym_0[] = INCBIN_U8("data/tilesets/secondary/mauville_gym/anim/0.4bpp");
+static const u8 TilesetAnimTiles_MauvilleGym_1[] = INCBIN_U8("data/tilesets/secondary/mauville_gym/anim/1.4bpp");
+asm(".space 32");
+
+static const u8 *const gTilesetAnimTable_MauvilleGym[] =
+{
+ TilesetAnimTiles_MauvilleGym_0,
+ TilesetAnimTiles_MauvilleGym_1,
+};
+
+static const u8 TilesetAnimTiles_BikeShop_0[] = INCBIN_U8("data/tilesets/secondary/bike_shop/anim/0.4bpp");
+static const u8 TilesetAnimTiles_BikeShop_1[] = INCBIN_U8("data/tilesets/secondary/bike_shop/anim/1.4bpp");
+asm(".space 32");
+
+static const u8 *const gTilesetAnimTable_BikeShop[] =
+{
+ TilesetAnimTiles_BikeShop_0,
+ TilesetAnimTiles_BikeShop_1,
+};
+
+static void ClearTilesetAnimDmas(void)
+{
+ gNumTilesetAnimDmas = 0;
+ CpuFill32(0, &gTilesetAnimDmas, sizeof(gTilesetAnimDmas));
+}
+
+static void QueueTilesetAnimDma(const void *src, const void *dest, u16 size)
+{
+ if (gNumTilesetAnimDmas < 20)
+ {
+ gTilesetAnimDmas[gNumTilesetAnimDmas].src = src;
+ gTilesetAnimDmas[gNumTilesetAnimDmas].dest = dest;
+ gTilesetAnimDmas[gNumTilesetAnimDmas].size = size;
+ gNumTilesetAnimDmas++;
+ }
+}
+
+void sub_8072E74(void)
+{
+ int i;
+ for (i = 0; i < gNumTilesetAnimDmas; i++)
+ {
+ DmaCopy16(3,
+ gTilesetAnimDmas[i].src,
+ gTilesetAnimDmas[i].dest,
+ gTilesetAnimDmas[i].size);
+ }
+ gNumTilesetAnimDmas = 0;
+}
+
+void cur_mapheader_run_tileset_funcs_after_some_cpuset(void)
+{
+ ClearTilesetAnimDmas();
+ StartTileset1Animation();
+ StartTileset2Animation();
+}
+
+void sub_8072ED0(void)
+{
+ StartTileset2Animation();
+}
+
+void sub_8072EDC(void)
+{
+ ClearTilesetAnimDmas();
+ if (++gTileset1AnimFrame >= gTileset1AnimLength)
+ {
+ gTileset1AnimFrame = 0;
+ }
+ if (++gTileset2AnimFrame >= gTileset2AnimLength)
+ {
+ gTileset2AnimFrame = 0;
+ }
+ if (gTileset1AnimCallback)
+ {
+ gTileset1AnimCallback(gTileset1AnimFrame);
+ }
+ if (gTileset2AnimCallback)
+ {
+ gTileset2AnimCallback(gTileset2AnimFrame);
+ }
+}
+
+static void StartTileset1Animation(void)
+{
+ gTileset1AnimFrame = 0;
+ gTileset1AnimLength = 0;
+ gTileset1AnimCallback = 0;
+ if (gMapHeader.mapData->primaryTileset)
+ {
+ if (gMapHeader.mapData->primaryTileset->callback)
+ {
+ gMapHeader.mapData->primaryTileset->callback();
+ }
+ }
+}
+
+static void StartTileset2Animation(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = 0;
+ gTileset2AnimCallback = 0;
+ if (gMapHeader.mapData->secondaryTileset)
+ {
+ if (gMapHeader.mapData->secondaryTileset->callback)
+ {
+ gMapHeader.mapData->secondaryTileset->callback();
+ }
+ }
+}
+
+void TilesetCB_General(void)
+{
+ gTileset1AnimFrame = 0;
+ gTileset1AnimLength = 0x100;
+ gTileset1AnimCallback = sub_8073014;
+}
+
+void TilesetCB_Building(void)
+{
+ gTileset1AnimFrame = 0;
+ gTileset1AnimLength = 0x100;
+ gTileset1AnimCallback = sub_8073058;
+}
+
+static void sub_8073014(u16 a1)
+{
+ int v1;
+ v1 = a1 % 0x10;
+ if (v1 == 0) sub_8073070(a1 / 0x10);
+ if (v1 == 1) sub_8073098(a1 / 0x10);
+ if (v1 == 2) sub_80730C0(a1 / 0x10);
+ if (v1 == 3) sub_80730E8(a1 / 0x10);
+ if (v1 == 4) sub_807361C(a1 / 0x10);
+}
+
+static void sub_8073058(u16 a1)
+{
+ if (a1 % 8 == 0)
+ {
+ sub_8073904(a1 / 8);
+ }
+}
+
+static void sub_8073070(u16 a1)
+{
+ int v1;
+ v1 = a1 % 4;
+ 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], BG_TILE_ADDR(108), 0x3c0);
+}
+
+static void sub_80730C0(u16 a1)
+{
+ int v1;
+ v1 = a1 % 8;
+ 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], BG_TILE_ADDR(124), 0xc0);
+}
+
+void TilesetCB_Petalburg(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = 0;
+}
+
+void TilesetCB_Rustboro(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = sub_8073424;
+}
+
+void TilesetCB_Dewford(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = 0;
+}
+
+void TilesetCB_Slateport(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = 0;
+}
+
+void TilesetCB_Mauville(void)
+{
+ gTileset2AnimFrame = gTileset1AnimFrame;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = sub_80734A0;
+}
+
+void TilesetCB_Lavaridge(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = sub_8073514;
+}
+
+void TilesetCB_Fallarbor(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = 0;
+}
+
+void TilesetCB_Fortree(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = 0;
+}
+
+void TilesetCB_Lilycove(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = 0;
+}
+
+void TilesetCB_Mossdeep(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = 0;
+}
+
+void TilesetCB_EverGrande(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = sub_8073540;
+}
+
+void TilesetCB_Pacifidlog(void)
+{
+ gTileset2AnimFrame = gTileset1AnimFrame;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = sub_80735B4;
+}
+
+void TilesetCB_Sootopolis(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = 0;
+}
+
+void TilesetCB_Underwater(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = 0x80;
+ gTileset2AnimCallback = sub_80735E4;
+}
+
+void TilesetCB_SootopolisGym(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = 0xf0;
+ gTileset2AnimCallback = sub_80738A8;
+}
+
+void TilesetCB_Cave(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = sub_8073600;
+}
+
+void TilesetCB_EliteFour(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = 0x80;
+ gTileset2AnimCallback = sub_80738C0;
+}
+
+void TilesetCB_MauvilleGym(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = sub_8073890;
+}
+
+void TilesetCB_BikeShop(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = sub_80738EC;
+}
+
+static void sub_8073424(u16 a1)
+{
+ int v1;
+ v1 = a1 % 8;
+ if (v1 == 0)
+ {
+ sub_80737A4(a1 / 8, 0);
+ sub_80737E0(a1 / 8);
+ }
+ if (v1 == 1) sub_80737A4(a1 / 8, 1);
+ if (v1 == 2) sub_80737A4(a1 / 8, 2);
+ if (v1 == 3) sub_80737A4(a1 / 8, 3);
+ if (v1 == 4) sub_80737A4(a1 / 8, 4);
+ if (v1 == 5) sub_80737A4(a1 / 8, 5);
+ if (v1 == 6) sub_80737A4(a1 / 8, 6);
+ if (v1 == 7) sub_80737A4(a1 / 8, 7);
+}
+
+static void sub_80734A0(u16 a1)
+{
+ int v1;
+ v1 = a1 % 8;
+ if (v1 == 0) sub_8073704(a1 / 8, 0);
+ if (v1 == 1) sub_8073704(a1 / 8, 1);
+ if (v1 == 2) sub_8073704(a1 / 8, 2);
+ if (v1 == 3) sub_8073704(a1 / 8, 3);
+ if (v1 == 4) sub_8073704(a1 / 8, 4);
+ if (v1 == 5) sub_8073704(a1 / 8, 5);
+ if (v1 == 6) sub_8073704(a1 / 8, 6);
+ if (v1 == 7) sub_8073704(a1 / 8, 7);
+}
+
+static void sub_8073514(u16 a1)
+{
+ int v1;
+ v1 = a1 % 0x10;
+ if (v1 == 0) sub_8073644(a1 / 0x10);
+ if (v1 == 1) sub_8073808(a1 / 0x10);
+}
+
+static void sub_8073540(u16 a1)
+{
+ int v1;
+ v1 = a1 % 8;
+ if (v1 == 0) sub_8073830(a1 / 8, 0);
+ if (v1 == 1) sub_8073830(a1 / 8, 1);
+ if (v1 == 2) sub_8073830(a1 / 8, 2);
+ if (v1 == 3) sub_8073830(a1 / 8, 3);
+ if (v1 == 4) sub_8073830(a1 / 8, 4);
+ if (v1 == 5) sub_8073830(a1 / 8, 5);
+ if (v1 == 6) sub_8073830(a1 / 8, 6);
+ if (v1 == 7) sub_8073830(a1 / 8, 7);
+}
+
+static void sub_80735B4(u16 a1)
+{
+ int v1;
+ v1 = a1 % 0x10;
+ if (v1 == 0) sub_807368C(a1 / 0x10);
+ if (v1 == 1) sub_80736DC(a1 / 0x10);
+}
+
+static void sub_80735E4(u16 a1)
+{
+ int v1;
+ v1 = a1 % 0x10;
+ if (v1 == 0) sub_80736B4(a1 / 0x10);
+}
+
+static void sub_8073600(u16 a1)
+{
+ int v1;
+ v1 = a1 % 0x10;
+ if (v1 == 1) sub_8073868(a1 / 0x10);
+}
+
+static void sub_807361C(u16 a1)
+{
+ int v1;
+ v1 = a1 % 4;
+ 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], BG_TILE_ADDR(200), 0x80);
+ v1 = (a1 + 2) % 4;
+ 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], BG_TILE_ADDR(244), 0x3c0);
+}
+
+static void sub_80736B4(u8 a1)
+{
+ int v1;
+ v1 = a1 % 4;
+ 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], BG_TILE_ADDR(252), 0x100);
+}
+
+static void sub_8073704(u16 a1, u8 a2)
+{
+ int v1;
+ a1 -= a2;
+ if (a1 < 12)
+ {
+ v1 = a1 % 12;
+ QueueTilesetAnimDma(gTilesetAnimTable_Mauville_0A[v1], gUnknown_0837BAE4[a2], 0x80);
+ QueueTilesetAnimDma(gTilesetAnimTable_Mauville_1A[v1], gUnknown_0837BB04[a2], 0x80);
+ }
+ else
+ {
+ v1 = a1 % 4;
+ QueueTilesetAnimDma(gTilesetAnimTable_Mauville_0B[v1], gUnknown_0837BAE4[a2], 0x80);
+ QueueTilesetAnimDma(gTilesetAnimTable_Mauville_1B[v1], gUnknown_0837BB04[a2], 0x80);
+ }
+}
+
+static void sub_80737A4(u16 a1, u8 a2)
+{
+ int v1;
+ a1 -= a2;
+
+ v1 = a1 % 8;
+ if (gTilesetAnimTable_Rustboro_0[v1])
+ {
+ QueueTilesetAnimDma(gTilesetAnimTable_Rustboro_0[v1], gUnknown_0837BFA4[a2], 0x80);
+ }
+}
+
+static void sub_80737E0(u16 a1)
+{
+ int v1;
+ v1 = a1 % 2;
+ 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], BG_TILE_ADDR(168), 0x80);
+}
+
+static void sub_8073830(u16 a1, u8 a2)
+{
+ int v1;
+ a1 -= a2;
+ v1 = a1 % 8;
+ QueueTilesetAnimDma(gTilesetAnimTable_EverGrande[v1], gUnknown_0837C93C[a2], 0x80);
+}
+
+static void sub_8073868(u16 a1)
+{
+ int v1;
+ v1 = a1 % 4;
+ QueueTilesetAnimDma(gTilesetAnimTable_Cave[v1], BG_TILE_ADDR(232), 0x80);
+}
+
+static void sub_8073890(u16 a1)
+{
+ int v1;
+ v1 = a1 % 2;
+ if (!v1)
+ {
+ sub_80739C4(a1 / 2);
+ }
+}
+
+static void sub_80738A8(u16 a1)
+{
+ int v1;
+ v1 = a1 % 8;
+ if (!v1)
+ {
+ sub_807392C(a1 / 8);
+ }
+}
+
+static void sub_80738C0(u16 a1)
+{
+ if (a1 % 0x40 == 0)
+ {
+ sub_807399C(a1 / 0x40);
+ }
+ if (a1 % 8 == 1)
+ {
+ sub_8073974(a1 / 8);
+ }
+}
+
+static void sub_80738EC(u16 a1)
+{
+ if (a1 % 4 == 0)
+ {
+ sub_80739EC(a1 / 4);
+ }
+}
+
+static void sub_8073904(u16 a1)
+{
+ int v1;
+ v1 = a1 % 2;
+ 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], 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], BG_TILE_ADDR(254), 0x20);
+}
+
+static void sub_807399C(u16 a1)
+{
+ int v1;
+ v1 = a1 % 2;
+ 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], BG_TILE_ADDR(164), 0x200);
+}
+
+static void sub_80739EC(u16 a1)
+{
+ int v1;
+ v1 = a1 % 2;
+ QueueTilesetAnimDma(gTilesetAnimTable_BikeShop[v1], BG_TILE_ADDR(252), 0x120);
+}
diff --git a/src/time_events.c b/src/engine/time_events.c
index e1b9a2e9e..3e3054aa3 100644
--- a/src/time_events.c
+++ b/src/engine/time_events.c
@@ -3,8 +3,8 @@
#include "event_data.h"
#include "field_weather.h"
#include "pokemon.h"
-#include "rng.h"
-#include "rom4.h"
+#include "random.h"
+#include "overworld.h"
#include "rtc.h"
#include "script.h"
#include "task.h"
@@ -81,13 +81,13 @@ void UpdateShoalTideFlag(void)
1,
};
- if (is_light_level_1_2_3_5_or_6(get_map_light_from_warp0()))
+ if (is_map_type_1_2_3_5_or_6(get_map_type_from_warp0()))
{
RtcCalcLocalTime();
if (tide[gLocalTime.hours])
- FlagSet(SYS_SHOAL_TIDE);
+ FlagSet(FLAG_SYS_SHOAL_TIDE);
else
- FlagReset(SYS_SHOAL_TIDE);
+ FlagClear(FLAG_SYS_SHOAL_TIDE);
}
}
diff --git a/src/engine/trade.c b/src/engine/trade.c
new file mode 100644
index 000000000..0bc589ff4
--- /dev/null
+++ b/src/engine/trade.c
@@ -0,0 +1,5713 @@
+#include "global.h"
+#include "name_string_util.h"
+#include "string_util.h"
+#include "text.h"
+#include "main.h"
+#include "constants/species.h"
+#include "constants/items.h"
+#include "constants/moves.h"
+#include "constants/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 "constants/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"
+#include "ewram.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];
+
+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, PSS_MODE_NO_MOVE_ORDER_EDIT);
+ }
+ else
+ {
+ ShowPokemonSummaryScreen(gEnemyParty, gUnknown_03004824->tradeMenuCursorPosition - 6, gUnknown_03004824->partyCounts[1] - 1, sub_80484F4, PSS_MODE_NO_MOVE_ORDER_EDIT);
+ }
+ }
+}
+
+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]].data[0] = 20;
+ gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]].data[2] = (gTradeMonSpriteCoords[6 * whichParty + whichPokemon][0] + gTradeMonSpriteCoords[6 * whichParty + whichPokemon + 1][0]) / 2 * 8 + 14;
+ gSprites[gUnknown_03004824->partyIcons[whichParty][whichPokemon]].data[4] = gTradeMonSpriteCoords[6 * whichParty + whichPokemon][1] * 8 - 12;
+ StoreSpriteCallbackInData(&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 StoreSpriteCallbackInData\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->data[0] == 10)
+ {
+ PlaySE(SE_BOWA);
+ sprite->data[0] = 0;
+ }
+}
+
+static void sub_804B07C(struct Sprite *sprite)
+{
+ if (sprite->data[1] == 0)
+ {
+ if (++ sprite->data[0] == 12)
+ sprite->data[0] = 0;
+ LoadPalette(&gTradeGlow2PaletteAnimTable[sprite->data[0]], 16 * (sprite->oam.paletteNum + 16) + 4, 2);
+ }
+}
+
+static void sub_804B0BC(struct Sprite *sprite)
+{
+ sprite->data[0] ++;
+ sprite->pos2.y ++;
+ if (sprite->data[0] == 10)
+ DestroySprite(sprite);
+}
+
+static void sub_804B0E0(struct Sprite *sprite)
+{
+ sprite->data[0] ++;
+ sprite->pos2.y --;
+ if (sprite->data[0] == 10)
+ DestroySprite(sprite);
+}
+
+static void sub_804B104(struct Sprite *sprite)
+{
+ if (++ sprite->data[0] == 15)
+ {
+ PlaySE(SE_W107);
+ sprite->data[0] = 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)gSharedMem, 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 @ =gSharedMem + 0x1F000\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 gSharedMem + 0x1F000\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 *)gSharedMem, 0x1000);
+ LoadCompressedPalette(gUnknown_08D004E0, 0x70, 0x20);
+ FillPalette(0, 0, 2);
+ for (i = 0; i < 0x280; i ++)
+ buffer[i] |= 0x7000;
+ DmaCopy16Defvars(3, gSharedMem, 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].data[1] = 1;
+ gSprites[gUnknown_03004828->unk_00bb].data[1] = 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].data[1] = 0;
+ gSprites[gUnknown_03004828->unk_00bb].data[1] = 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].data[3] = 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->data[0] / 10;
+ sprite->data[5] += sprite->data[1];
+ sprite->pos1.x = sprite->data[5] / 10;
+ if (sprite->pos1.y > 0x4c)
+ {
+ sprite->pos1.y = 0x4c;
+ sprite->data[0] = -(sprite->data[0] * sprite->data[2]) / 100;
+ sprite->data[3] ++;
+ }
+ if (sprite->pos1.x == 0x78)
+ sprite->data[1] = 0;
+ sprite->data[0] += sprite->data[4];
+ if (sprite->data[3] == 4)
+ {
+ sprite->data[7] = 1;
+ sprite->callback = SpriteCallbackDummy;
+ }
+}
+
+static void sub_804D738(struct Sprite *sprite)
+{
+ sprite->pos2.y += gTradeBallVerticalVelocityTable[sprite->data[0]];
+ if (sprite->data[0] == 22)
+ PlaySE(SE_KON);
+ if (++ sprite->data[0] == 44)
+ {
+ PlaySE(SE_W025);
+ sprite->callback = sub_804D7AC;
+ sprite->data[0] = 0;
+ BeginNormalPaletteFade(1 << (16 + sprite->oam.paletteNum), -1, 0, 16, -1);
+ }
+}
+
+static void sub_804D7AC(struct Sprite *sprite)
+{
+ if (sprite->data[1] == 20)
+ StartSpriteAffineAnim(sprite, 1);
+ if (++ sprite->data[1] > 20)
+ {
+ sprite->pos2.y -= gTradeBallVerticalVelocityTable[sprite->data[0]];
+ if (++ sprite->data[0] == 23)
+ {
+ DestroySprite(sprite);
+ gUnknown_03004828->unk_00c4 = 14; // Resume the master trade animation
+ }
+ }
+}
+
+static void sub_804D80C(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ if ((sprite->pos1.y += 4) > sprite->data[3])
+ {
+ sprite->data[2] ++;
+ sprite->data[0] = 0x16;
+ PlaySE(SE_KON);
+ }
+ }
+ else
+ {
+ if (sprite->data[0] == 0x42)
+ PlaySE(SE_KON2);
+ if (sprite->data[0] == 0x5c)
+ PlaySE(SE_KON3);
+ if (sprite->data[0] == 0x6b)
+ PlaySE(SE_KON4);
+ sprite->pos2.y += gTradeBallVerticalVelocityTable[sprite->data[0]];
+ if (++sprite->data[0] == 0x6c)
+ sprite->callback = SpriteCallbackDummy;
+ }
+}
+
+u16 GetInGameTradeSpeciesInfo(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 _CreateInGameTradePokemon(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 GetTradeSpecies(void)
+{
+ if (GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_IS_EGG))
+ return SPECIES_NONE;
+ return GetMonData(&gPlayerParty[gSpecialVar_0x8005], MON_DATA_SPECIES);
+}
+
+void CreateInGameTradePokemon(void)
+{
+ _CreateInGameTradePokemon(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 DoInGameTradeScene(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(FLAG_SYS_RIBBON_GET);
+}
+
+void sub_804E22C(void)
+{
+ const u16 *src;
+ u16 *dest;
+ LZDecompressVram(gUnknown_08D00000, (void *)VRAM);
+ CpuCopy16(gUnknown_08D00524, gSharedMem, 0x1000);
+ src = (const u16 *)gSharedMem;
+ 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 626c5a7bf..ffa4cbd08 100644
--- a/src/trainer_card.c
+++ b/src/engine/trainer_card.c
@@ -10,9 +10,9 @@
#include "money.h"
#include "palette.h"
#include "pokedex.h"
-#include "rom4.h"
+#include "overworld.h"
#include "script_pokemon_80C4.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "sprite.h"
#include "string_util.h"
@@ -20,6 +20,7 @@
#include "task.h"
#include "unknown_task.h"
#include "util.h"
+#include "ewram.h"
typedef void (*Callback)(void);
@@ -47,20 +48,10 @@ struct Struct2000000
/*0x9C*/ u8 language; // 0x9C
};
-extern u8 ewram[];
-#define ewram0 (*(struct Struct2000000 *)(ewram))
-
extern struct LinkPlayerMapObject gLinkPlayerMapObjects[];
EWRAM_DATA struct TrainerCard gTrainerCards[4] = {0};
-struct UnknownStruct1
-{
- u16 filler0[0x3C0];
- u16 unk780[160];
-};
-extern struct UnknownStruct1 gUnknown_03004DE0;
-
extern const u8 gBadgesTiles[];
extern const u16 gUnknown_083B5F0C[];
extern const u16 gBadgesPalette[];
@@ -70,7 +61,7 @@ extern const u16 gUnknown_083B5F8C[][4];
const u8 gBadgesTiles[] = INCBIN_U8("graphics/trainer_card/badges.4bpp");
// XXX: what is this?
-u8 *const ewram_ = ewram;
+u8 *const ewram_ = gSharedMem;
bool8 sub_8093864(struct Task *);
bool8 sub_80938A8(struct Task *);
@@ -189,14 +180,14 @@ void sub_8093110(Callback arg1)
{
sub_80932AC(arg1);
SetMainCallback2(sub_8093174);
- ewram0.language = GAME_LANGUAGE;
+ ewram0_2.language = GAME_LANGUAGE;
}
void sub_8093130(u8 playerIndex, Callback arg2)
{
sub_80932E4(playerIndex, arg2);
SetMainCallback2(sub_8093174);
- ewram0.language = gLinkPlayers[gLinkPlayerMapObjects[playerIndex].linkPlayerId].language;
+ ewram0_2.language = gLinkPlayers[gLinkPlayerMapObjects[playerIndex].linkPlayerId].language;
}
static void sub_8093174(void)
@@ -258,14 +249,14 @@ static void sub_8093254(void)
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
- ewram0.var_6++;
- if (ewram0.var_6 >= 60)
+ ewram0_2.var_6++;
+ if (ewram0_2.var_6 >= 60)
{
- ewram0.var_6 = 0;
- ewram0.var_5 ^= 1;
+ ewram0_2.var_6 = 0;
+ ewram0_2.var_5 ^= 1;
}
- if (ewram0.var_4)
- DmaCopy16(3, gUnknown_03004DE0.filler0, gUnknown_03004DE0.unk780, sizeof(gUnknown_03004DE0.unk780));
+ if (ewram0_2.var_4)
+ DmaCopy16(3, &gUnknown_03004DE0[0], &gUnknown_03004DE0[1], 0x140);
}
static void sub_80932AC(Callback callBack)
@@ -290,20 +281,17 @@ void sub_8093324(void)
{
u8 taskId = FindTaskIdByFunc(nullsub_60);
struct Task *task = &gTasks[taskId];
- ewram0.var_1 = task->data[TD_0];
+ ewram0_2.var_1 = task->data[TD_0];
- LoadWordFromTwoHalfwords((u16 *)&task->data[TD_CALLBACK], (u32 *)&ewram0.var_60);
+ LoadWordFromTwoHalfwords((u16 *)&task->data[TD_CALLBACK], (u32 *)&ewram0_2.var_60);
- if (ewram0.var_1)
+ if (ewram0_2.var_1)
{
- struct TrainerCard(*trainerCards)[4] = &gTrainerCards;
- s16 var = task->data[TD_1];
- struct TrainerCard *dest = &(*trainerCards)[var];
- memcpy(&ewram0.var_64, dest, sizeof(struct TrainerCard));
+ ewram0_2.var_64 = gTrainerCards[task->data[TD_1]];
}
else
{
- sub_8093390(&ewram0.var_64);
+ sub_8093390(&ewram0_2.var_64);
}
}
@@ -311,16 +299,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 +316,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(FLAG_SYS_POKEDEX_GET);
+ trainerCard->var_3 = CompletedHoennPokedex();
+ 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 +356,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)
@@ -502,64 +490,64 @@ static void sub_8093688(void)
u8 i;
sub_8093324();
- ewram0.var_0 = 0;
- ewram0.var_3 = 0;
- ewram0.var_4 = FALSE;
- ewram0.var_2 = ewram0.var_64.stars;
- ewram0.var_5 = 0;
- ewram0.var_6 = 0;
+ ewram0_2.var_0 = 0;
+ ewram0_2.var_3 = 0;
+ ewram0_2.var_4 = FALSE;
+ ewram0_2.var_2 = ewram0_2.var_64.stars;
+ ewram0_2.var_5 = 0;
+ ewram0_2.var_6 = 0;
for (i = 0; i < 4; i++)
- sub_80EB3FC(ewram0.var_20[i], ewram0.var_64.var_28[i]);
+ EasyChat_GetWordText(ewram0_2.var_20[i], ewram0_2.var_64.var_28[i]);
sub_80936D4();
}
void sub_80936D4(void)
{
- ewram0.var_7 = 0;
- ewram0.var_8 = 0;
- ewram0.var_9 = 0;
- ewram0.var_a = 0;
- ewram0.var_b = 0;
- ewram0.var_c = 0;
- ewram0.var_d = 0;
- memset(ewram0.var_e, 0, sizeof(ewram0.var_e));
+ ewram0_2.var_7 = 0;
+ ewram0_2.var_8 = 0;
+ ewram0_2.var_9 = 0;
+ ewram0_2.var_a = 0;
+ ewram0_2.var_b = 0;
+ ewram0_2.var_c = 0;
+ ewram0_2.var_d = 0;
+ memset(ewram0_2.var_e, 0, sizeof(ewram0_2.var_e));
- if (ewram0.var_64.hasPokedex)
- ewram0.var_7++;
+ if (ewram0_2.var_64.hasPokedex)
+ ewram0_2.var_7++;
- if (ewram0.var_64.firstHallOfFameA != 0
- || ewram0.var_64.firstHallOfFameB != 0
- || ewram0.var_64.firstHallOfFameC != 0)
- ewram0.var_8++;
+ if (ewram0_2.var_64.firstHallOfFameA != 0
+ || ewram0_2.var_64.firstHallOfFameB != 0
+ || ewram0_2.var_64.firstHallOfFameC != 0)
+ ewram0_2.var_8++;
- if (ewram0.var_64.linkBattleWins != 0 || ewram0.var_64.linkBattleLosses != 0)
- ewram0.var_9++;
+ if (ewram0_2.var_64.linkBattleWins != 0 || ewram0_2.var_64.linkBattleLosses != 0)
+ ewram0_2.var_9++;
- if (ewram0.var_64.battleTowerWins != 0 || ewram0.var_64.battleTowerLosses != 0)
- ewram0.var_a++;
+ if (ewram0_2.var_64.battleTowerWins != 0 || ewram0_2.var_64.battleTowerLosses != 0)
+ ewram0_2.var_a++;
- if (ewram0.var_64.contestsWithFriends != 0)
- ewram0.var_b++;
+ if (ewram0_2.var_64.contestsWithFriends != 0)
+ ewram0_2.var_b++;
- if (ewram0.var_64.pokeblocksWithFriends != 0)
- ewram0.var_c++;
+ if (ewram0_2.var_64.pokeblocksWithFriends != 0)
+ ewram0_2.var_c++;
- if (ewram0.var_64.pokemonTrades != 0)
- ewram0.var_d++;
+ if (ewram0_2.var_64.pokemonTrades != 0)
+ ewram0_2.var_d++;
- if (!ewram0.var_1)
+ if (!ewram0_2.var_1)
{
u32 badgeFlag;
int i = 0;
- badgeFlag = BADGE01_GET;
+ badgeFlag = FLAG_BADGE01_GET;
while (1)
{
if (FlagGet(badgeFlag))
- ewram0.var_e[i]++;
+ ewram0_2.var_e[i]++;
badgeFlag++;
i++;
- if (badgeFlag > BADGE08_GET)
+ if (badgeFlag > FLAG_BADGE08_GET)
{
break;
}
@@ -613,24 +601,24 @@ static void sub_809380C()
static void sub_809382C(u8 taskId)
{
- while (gUnknown_083B5EBC[ewram0.var_0](&gTasks[taskId]) != 0)
+ while (gUnknown_083B5EBC[ewram0_2.var_0](&gTasks[taskId]) != 0)
;
}
bool8 sub_8093864(struct Task *task)
{
- ewram0.var_5 = gSaveBlock2.playTimeSeconds & 1;
- ewram0.var_6 = gSaveBlock2.playTimeVBlanks;
+ ewram0_2.var_5 = gSaveBlock2.playTimeSeconds & 1;
+ ewram0_2.var_6 = gSaveBlock2.playTimeVBlanks;
sub_80939A4();
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
- ewram0.var_0++;
+ ewram0_2.var_0++;
return FALSE;
}
bool8 sub_80938A8(struct Task *task)
{
if (!gPaletteFade.active)
- ewram0.var_0++;
+ ewram0_2.var_0++;
return FALSE;
}
@@ -638,19 +626,19 @@ bool8 sub_80938CC(struct Task *task)
{
if (gMain.newKeys & B_BUTTON)
{
- ewram0.var_0 = 5;
+ ewram0_2.var_0 = 5;
return TRUE;
}
else if (gMain.newKeys & A_BUTTON)
{
- if (ewram0.var_3 != 0)
+ if (ewram0_2.var_3 != 0)
{
- ewram0.var_0 = 5;
+ ewram0_2.var_0 = 5;
}
else
{
- ewram0.var_3 ^= 1;
- ewram0.var_0 = 3;
+ ewram0_2.var_3 ^= 1;
+ ewram0_2.var_0 = 3;
}
return TRUE;
}
@@ -661,14 +649,14 @@ bool8 sub_8093918(struct Task *task)
{
sub_8093A28();
PlaySE(SE_CARD);
- ewram0.var_0++;
+ ewram0_2.var_0++;
return FALSE;
}
bool8 sub_8093938(struct Task *task)
{
if (sub_8093A48())
- ewram0.var_0 = 2;
+ ewram0_2.var_0 = 2;
return FALSE;
}
@@ -676,14 +664,14 @@ bool8 sub_8093954(struct Task *task)
{
sub_80939C0();
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
- ewram0.var_0++;
+ ewram0_2.var_0++;
return FALSE;
}
bool8 sub_8093980(struct Task *task)
{
if (!gPaletteFade.active)
- SetMainCallback2((MainCallback)ewram0.var_60);
+ SetMainCallback2((MainCallback)ewram0_2.var_60);
return FALSE;
}
@@ -706,9 +694,9 @@ static void sub_80939DC(u8 taskId)
u8 buffer[32];
struct Task *task = &gTasks[taskId];
- if (ewram0.var_5 != task->data[TD_1])
+ if (ewram0_2.var_5 != task->data[TD_1])
{
- task->data[TD_1] = ewram0.var_5;
+ task->data[TD_1] = ewram0_2.var_5;
task->data[TD_0] ^= TRUE;
}
TrainerCard_Front_PrintPlayTime(buffer, task->data[TD_0]);
@@ -739,14 +727,14 @@ static void sub_8093A68(u8 taskId)
bool8 sub_8093AA0(struct Task *task)
{
- s32 i;
+ u32 i;
- ewram0.var_4 = FALSE;
+ ewram0_2.var_4 = FALSE;
dp12_8087EA4();
- for (i = 0; i < ARRAY_COUNT(gUnknown_03004DE0.unk780); i++)
- gUnknown_03004DE0.unk780[i] = -4;
+ for (i = 0; i < 0xA0; i++)
+ gUnknown_03004DE0[1][i] = -4;
SetHBlankCallback(sub_8093D7C);
- ewram0.var_4 = TRUE;
+ ewram0_2.var_4 = TRUE;
task->data[0]++;
return FALSE;
}
@@ -763,7 +751,7 @@ bool8 sub_8093AF0(struct Task *task)
u32 sp0;
s16 i;
- ewram0.var_4 = 0;
+ ewram0_2.var_4 = 0;
task->data[1] += 3;
if (task->data[1] > 79)
task->data[1] = 79;
@@ -792,7 +780,7 @@ bool8 sub_8093AF0(struct Task *task)
}
for (; i < 160; i++)
gUnknown_03004DE0.filler0[i] = -4 + (u16)(r10 >> 16);
- ewram0.var_4 = 1;
+ ewram0_2.var_4 = 1;
if (task->data[1] > 0x4A)
task->data[0]++;
return FALSE;
@@ -810,7 +798,7 @@ bool8 sub_8093AF0(struct Task *task)
push {r5-r7}\n\
sub sp, 0x4\n\
mov r8, r0\n\
- ldr r1, _08093BFC @ =0x02000000\n\
+ ldr r1, _08093BFC @ =gSharedMem\n\
movs r0, 0\n\
strb r0, [r1, 0x4]\n\
mov r2, r8\n\
@@ -923,7 +911,7 @@ _08093BBE:\n\
ble _08093BBE\n\
_08093BD4:\n\
movs r0, 0x1\n\
- ldr r1, _08093BFC @ =0x02000000\n\
+ ldr r1, _08093BFC @ =gSharedMem\n\
strb r0, [r1, 0x4]\n\
mov r2, r8\n\
movs r4, 0xA\n\
@@ -944,7 +932,7 @@ _08093BEA:\n\
pop {r1}\n\
bx r1\n\
.align 2, 0\n\
-_08093BFC: .4byte 0x02000000\n\
+_08093BFC: .4byte gSharedMem\n\
_08093C00: .4byte 0xffff0000\n\
_08093C04: .4byte gUnknown_03004DE0\n\
_08093C08: .4byte 0x0000fffc\n\
@@ -955,7 +943,7 @@ bool8 sub_8093C0C(struct Task *task)
{
sub_80939C0();
sub_8093DAC();
- if (!ewram0.var_3)
+ if (!ewram0_2.var_3)
sub_80939A4();
task->data[0]++;
return TRUE;
@@ -972,7 +960,7 @@ bool8 sub_8093C38(struct Task *task)
push {r5-r7}\n\
sub sp, 0x4\n\
mov r8, r0\n\
- ldr r1, _08093D40 @ =0x02000000\n\
+ ldr r1, _08093D40 @ =gSharedMem\n\
movs r2, 0\n\
strb r2, [r1, 0x4]\n\
ldrh r0, [r0, 0xA]\n\
@@ -1083,7 +1071,7 @@ _08093D02:\n\
ble _08093D02\n\
_08093D18:\n\
movs r0, 0x1\n\
- ldr r1, _08093D40 @ =0x02000000\n\
+ ldr r1, _08093D40 @ =gSharedMem\n\
strb r0, [r1, 0x4]\n\
mov r2, r8\n\
movs r3, 0xA\n\
@@ -1104,7 +1092,7 @@ _08093D2E:\n\
pop {r1}\n\
bx r1\n\
.align 2, 0\n\
-_08093D40: .4byte 0x02000000\n\
+_08093D40: .4byte gSharedMem\n\
_08093D44: .4byte 0xffff0000\n\
_08093D48: .4byte gUnknown_03004DE0\n\
_08093D4C: .4byte 0x0000fffc\n\
@@ -1115,7 +1103,7 @@ bool8 sub_8093D50(struct Task *task)
{
u8 taskId;
- ewram0.var_4 = FALSE;
+ ewram0_2.var_4 = FALSE;
SetHBlankCallback(NULL);
sub_8093E04();
taskId = FindTaskIdByFunc(sub_8093A68);
@@ -1125,7 +1113,7 @@ bool8 sub_8093D50(struct Task *task)
void sub_8093D7C(void)
{
- u16 bgVOffset = gUnknown_03004DE0.unk780[REG_VCOUNT & 0xFF];
+ u16 bgVOffset = gUnknown_03004DE0[1][REG_VCOUNT & 0xFF];
REG_BG0VOFS = bgVOffset;
REG_BG1VOFS = bgVOffset;
@@ -1134,7 +1122,7 @@ void sub_8093D7C(void)
static void sub_8093DAC(void)
{
- if (ewram0.var_3)
+ if (ewram0_2.var_3)
sub_8093DEC();
else
sub_8093DC8();
@@ -1203,23 +1191,23 @@ extern const u16 *const gUnknown_083B5EF8[];
void sub_8093EA0(void)
{
- LoadPalette(gUnknown_083B5EF8[ewram0.var_2], 0, 48 * 2);
+ LoadPalette(gUnknown_083B5EF8[ewram0_2.var_2], 0, 48 * 2);
LoadPalette(gBadgesPalette, 48, 16 * 2);
LoadPalette(gUnknown_083B5F4C, 64, 16 * 2);
- if (ewram0.var_64.gender != MALE)
+ if (ewram0_2.var_64.gender != MALE)
LoadPalette(gUnknown_083B5F0C, 16, 16 * 2);
}
static void sub_8093EF8(void)
{
- LoadTrainerGfx_TrainerCard(ewram0.var_64.gender, 80, (void *)(VRAM + 0x1880));
+ LoadTrainerGfx_TrainerCard(ewram0_2.var_64.gender, 80, (void *)(VRAM + 0x1880));
}
static void sub_8093F14(void)
{
const void *arr[] = {gUnknown_08E8CAC0, gUnknown_08E8D4C0};
- CpuFastSet(arr[ewram0.var_1], (void *)(VRAM + 0x4800), 0x140);
+ CpuFastSet(arr[ewram0_2.var_1], (void *)(VRAM + 0x4800), 0x140);
}
// I don't really know where to put the data. It's in such a weird order.
@@ -1269,7 +1257,7 @@ static void sub_8093FD0(void)
{
u16 *ptr = (u16 *)(VRAM + 0x4000);
s16 i = 15;
- s16 var = 15 + ewram0.var_2;
+ s16 var = 15 + ewram0_2.var_2;
while (i < var)
{
@@ -1285,7 +1273,7 @@ static void sub_8093FD0(void)
static void sub_8094038(void)
{
- if (ewram0.var_1 == 0)
+ if (ewram0_2.var_1 == 0)
{
u16 *ptr = (u16 *)(VRAM + 0x4000);
s16 i;
@@ -1293,7 +1281,7 @@ static void sub_8094038(void)
for (i = 0, r2 = 4; i < 8; i++, r2 += 3)
{
- if (ewram0.var_e[i] != 0)
+ if (ewram0_2.var_e[i] != 0)
{
ptr[15 * 32 + r2 + 0] = gUnknown_083B5F8C[i][0] | 0x3000;
ptr[15 * 32 + r2 + 1] = gUnknown_083B5F8C[i][1] | 0x3000;
@@ -1332,8 +1320,8 @@ static void sub_8094140(void)
BasicInitMenuWindow(&WindowConfig_TrainerCard_Back_Values);
buffer = gStringVar1;
- StringCopy(buffer, ewram0.var_64.playerName);
- ConvertInternationalString(buffer, ewram0.language);
+ StringCopy(buffer, ewram0_2.var_64.playerName);
+ ConvertInternationalString(buffer, ewram0_2.language);
MenuPrint(buffer, 7, 5);
TrainerCard_Front_PrintTrainerID();
@@ -1366,26 +1354,26 @@ static void TrainerCard_Front_PrintTrainerID(void)
{
u8 buffer[8];
- ConvertIntToDecimalStringN(buffer, ewram0.var_64.trainerId, STR_CONV_MODE_LEADING_ZEROS, 5);
+ ConvertIntToDecimalStringN(buffer, ewram0_2.var_64.trainerId, STR_CONV_MODE_LEADING_ZEROS, 5);
MenuPrint(buffer, 20, 2);
}
static void TrainerCard_Front_PrintMoney(void)
{
- sub_80B7AEC(ewram0.var_64.money, 16, 8);
+ sub_80B7AEC(ewram0_2.var_64.money, 16, 8);
}
static void TrainerCard_Front_PrintPokedexCount(void)
{
u8 buffer[16];
- if (ewram0.var_7 == FALSE)
+ if (ewram0_2.var_7 == FALSE)
{
sub_8094110();
}
else
{
- ConvertIntToDecimalStringN(buffer, ewram0.var_64.pokedexSeen, STR_CONV_MODE_LEFT_ALIGN, 3);
+ ConvertIntToDecimalStringN(buffer, ewram0_2.var_64.pokedexSeen, STR_CONV_MODE_LEFT_ALIGN, 3);
MenuPrint_RightAligned(buffer, 16, 10);
}
}
@@ -1398,10 +1386,10 @@ static void TrainerCard_Front_PrintPlayTime(u8 *arg1, s16 colon)
playTimeHours = gSaveBlock2.playTimeHours;
playTimeMinutes = gSaveBlock2.playTimeMinutes;
- if (ewram0.var_1 != 0)
+ if (ewram0_2.var_1 != 0)
{
- playTimeHours = ewram0.var_64.playTimeHours;
- playTimeMinutes = ewram0.var_64.playTimeMinutes;
+ playTimeHours = ewram0_2.var_64.playTimeHours;
+ playTimeMinutes = ewram0_2.var_64.playTimeMinutes;
}
FormatPlayTime(buffer, playTimeHours, playTimeMinutes, colon);
sub_8072C74(arg1, buffer, 48, 1);
@@ -1411,20 +1399,20 @@ static void sub_809429C(void)
{
u8 *str;
- if (ewram0.var_1 != 0)
+ if (ewram0_2.var_1 != 0)
{
str = gStringVar1;
- str = StringCopy(str, ewram0.var_20[0]);
+ str = StringCopy(str, ewram0_2.var_20[0]);
str[0] = 00;
str++;
- str = StringCopy(str, ewram0.var_20[1]);
+ str = StringCopy(str, ewram0_2.var_20[1]);
MenuPrint(gStringVar1, 2, 14);
str = gStringVar1;
- str = StringCopy(str, ewram0.var_20[2]);
+ str = StringCopy(str, ewram0_2.var_20[2]);
str[0] = 00;
str++;
- str = StringCopy(str, ewram0.var_20[3]);
+ str = StringCopy(str, ewram0_2.var_20[3]);
MenuPrint(gStringVar1, 2, 16);
}
}
@@ -1434,8 +1422,8 @@ static void TrainerCard_Back_PrintName(void)
u8 *str;
str = gStringVar1;
- StringCopy(str, ewram0.var_64.playerName);
- ConvertInternationalString(str, ewram0.language);
+ StringCopy(str, ewram0_2.var_64.playerName);
+ ConvertInternationalString(str, ewram0_2.language);
#if ENGLISH
StringAppend(str, gOtherText_TrainersTrainerCard);
@@ -1448,7 +1436,7 @@ static void TrainerCard_Back_PrintName(void)
static void TrainerCard_Back_PrintHallOfFameTime_Label(void)
{
- if (ewram0.var_8 != 0)
+ if (ewram0_2.var_8 != 0)
MenuPrint(gOtherText_FirstHOF, 3, 5);
}
@@ -1456,21 +1444,21 @@ static void TrainerCard_Back_PrintHallOfFameTime(void)
{
u8 *str;
- if (ewram0.var_8 != 0)
+ if (ewram0_2.var_8 != 0)
{
str = gStringVar1;
- str = ConvertIntToDecimalStringN(str, ewram0.var_64.firstHallOfFameA, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ str = ConvertIntToDecimalStringN(str, ewram0_2.var_64.firstHallOfFameA, STR_CONV_MODE_RIGHT_ALIGN, 3);
str = StringCopy(str, gUnknown_083B5EF4);
- str = ConvertIntToDecimalStringN(str, ewram0.var_64.firstHallOfFameB, STR_CONV_MODE_LEADING_ZEROS, 2);
+ str = ConvertIntToDecimalStringN(str, ewram0_2.var_64.firstHallOfFameB, STR_CONV_MODE_LEADING_ZEROS, 2);
str = StringCopy(str, gUnknown_083B5EF4);
- str = ConvertIntToDecimalStringN(str, ewram0.var_64.firstHallOfFameC, STR_CONV_MODE_LEADING_ZEROS, 2);
+ str = ConvertIntToDecimalStringN(str, ewram0_2.var_64.firstHallOfFameC, STR_CONV_MODE_LEADING_ZEROS, 2);
MenuPrint_RightAligned(gStringVar1, 28, 5);
}
}
static void TrainerCard_Back_PrintLinkBattlesLabel(void)
{
- if (ewram0.var_9 != 0)
+ if (ewram0_2.var_9 != 0)
MenuPrint(gOtherText_LinkCableBattles, 3, 7);
}
@@ -1478,19 +1466,19 @@ static void TrainerCard_Back_PrintLinkBattles(void)
{
u8 buffer[16];
- if (ewram0.var_9 != 0)
+ if (ewram0_2.var_9 != 0)
{
- ConvertIntToDecimalString(buffer, ewram0.var_64.linkBattleWins);
+ ConvertIntToDecimalString(buffer, ewram0_2.var_64.linkBattleWins);
MenuPrint_RightAligned(buffer, 22, 7);
- ConvertIntToDecimalString(buffer, ewram0.var_64.linkBattleLosses);
+ ConvertIntToDecimalString(buffer, ewram0_2.var_64.linkBattleLosses);
MenuPrint_RightAligned(buffer, 28, 7);
}
}
static void TrainerCard_Back_PrintBattleTower_Label(void)
{
- if (ewram0.var_a != 0)
+ if (ewram0_2.var_a != 0)
MenuPrint(gOtherText_BattleTowerWinRecord, 3, 15);
}
@@ -1498,19 +1486,19 @@ static void TrainerCard_Back_PrintBattleTower(void)
{
u8 buffer[16];
- if (ewram0.var_a != 0)
+ if (ewram0_2.var_a != 0)
{
- sub_8072C44(buffer, ewram0.var_64.battleTowerWins, 24, 1);
+ sub_8072C44(buffer, ewram0_2.var_64.battleTowerWins, 24, 1);
MenuPrint_PixelCoords(buffer, 112, 120, 0);
- sub_8072C44(buffer, ewram0.var_64.battleTowerLosses, 24, 1);
+ sub_8072C44(buffer, ewram0_2.var_64.battleTowerLosses, 24, 1);
MenuPrint_PixelCoords(buffer, 149, 120, 0);
}
}
static void TrainerCard_Back_PrintLinkContests_Label(void)
{
- if (ewram0.var_b != 0)
+ if (ewram0_2.var_b != 0)
MenuPrint(gOtherText_ContestRecord, 3, 13);
}
@@ -1518,16 +1506,16 @@ static void TrainerCard_Back_PrintLinkContests(void)
{
u8 buffer[8];
- if (ewram0.var_b != 0)
+ if (ewram0_2.var_b != 0)
{
- ConvertIntToDecimalStringN(buffer, ewram0.var_64.contestsWithFriends, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ ConvertIntToDecimalStringN(buffer, ewram0_2.var_64.contestsWithFriends, STR_CONV_MODE_RIGHT_ALIGN, 3);
MenuPrint_RightAligned(buffer, 28, 13);
}
}
static void TrainerCard_Back_PrintLinkPokeblocks_Label(void)
{
- if (ewram0.var_c != 0)
+ if (ewram0_2.var_c != 0)
MenuPrint(gOtherText_MixingRecord, 3, 11);
}
@@ -1535,16 +1523,16 @@ static void TrainerCard_Back_PrintLinkPokeblocks(void)
{
u8 buffer[8];
- if (ewram0.var_c != 0)
+ if (ewram0_2.var_c != 0)
{
- ConvertIntToDecimalStringN(buffer, ewram0.var_64.pokeblocksWithFriends, STR_CONV_MODE_RIGHT_ALIGN, 5);
+ ConvertIntToDecimalStringN(buffer, ewram0_2.var_64.pokeblocksWithFriends, STR_CONV_MODE_RIGHT_ALIGN, 5);
MenuPrint_RightAligned(buffer, 28, 11);
}
}
static void TrainerCard_Back_PrintPokemonTrades_Label(void)
{
- if (ewram0.var_d != 0)
+ if (ewram0_2.var_d != 0)
MenuPrint(gOtherText_TradeRecord, 3, 9);
}
@@ -1552,9 +1540,9 @@ static void TrainerCard_Back_PrintPokemonTrades(void)
{
u8 buffer[8];
- if (ewram0.var_d != 0)
+ if (ewram0_2.var_d != 0)
{
- ConvertIntToDecimalStringN(buffer, ewram0.var_64.pokemonTrades, STR_CONV_MODE_RIGHT_ALIGN, 5);
+ ConvertIntToDecimalStringN(buffer, ewram0_2.var_64.pokemonTrades, STR_CONV_MODE_RIGHT_ALIGN, 5);
MenuPrint_RightAligned(buffer, 28, 9);
}
}
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/field/bard_music.c b/src/field/bard_music.c
new file mode 100644
index 000000000..5c48749cf
--- /dev/null
+++ b/src/field/bard_music.c
@@ -0,0 +1,225 @@
+#include "global.h"
+#include "bard_music.h"
+#include "easy_chat.h"
+
+struct BardSound
+{
+ /*0x00*/ u8 var00;
+ /*0x01*/ s8 var01;
+ /*0x02*/ u16 var02;
+ /*0x04*/ u16 volume;
+ /*0x06*/ u16 var06;
+};
+
+static const s16 Unknown_8416F08[] = {-768, 6144};
+static const s16 Unknown_8416F0C[] = {2304, 6144};
+static const s16 Unknown_8416F10[] = {256, 6144};
+static const s16 Unknown_8416F14[] = {1024, 6144};
+static const s16 Unknown_8416F18[] = {2816, 6144};
+static const s16 Unknown_8416F1C[] = {-768, -256, 6144};
+static const s16 Unknown_8416F22[] = {-768, 512, 6144};
+static const s16 Unknown_8416F28[] = {512, 1024, 6144};
+static const s16 Unknown_8416F2E[] = {1536, 2048, 6144};
+static const s16 Unknown_8416F34[] = {2304, 2048, 6144};
+static const s16 Unknown_8416F3A[] = {-768, -256, -768, 6144};
+static const s16 Unknown_8416F42[] = {1024, -768, 1024, 6144};
+static const s16 Unknown_8416F4A[] = {2304, 2048, 1536, 6144};
+static const s16 Unknown_8416F52[] = {256, 512, 1024, 6144};
+static const s16 Unknown_8416F5A[] = {1536, 4096, 3328, 6144};
+static const s16 Unknown_8416F62[] = {1024, 2304, 1024, 2304, 6144};
+static const s16 Unknown_8416F6C[] = {2304, 1024, 3328, 1024, 6144};
+static const s16 Unknown_8416F76[] = {256, 512, 1024, 1536, 6144};
+static const s16 Unknown_8416F80[] = {2048, 1536, 1024, 512, 6144};
+static const s16 Unknown_8416F8A[] = {3840, 3328, 2816, 2560, 6144};
+static const s16 Unknown_8416F94[] = {-768, -256, 256, 512, 1024, 6144};
+static const s16 Unknown_8416FA0[] = {2304, 2048, 1536, 1024, 512, 6144};
+static const s16 Unknown_8416FAC[] = {256, 1024, 2304, 1024, 256, 6144};
+static const s16 Unknown_8416FB8[] = {2304, 1024, 2304, 1024, -768, 6144};
+static const s16 Unknown_8416FC4[] = {2816, 2048, 1024, 1024, 1536, 6144};
+static const s16 Unknown_8416FD0[] = {-768, -256, 256, 512, 1024, 1536, 6144};
+static const s16 Unknown_8416FDE[] = {2048, 1536, 1024, 512, 256, -256, 6144};
+static const s16 Unknown_8416FEC[] = {256, 512, 1024, 256, 512, 4096, 6144};
+static const s16 Unknown_8416FFA[] = {1024, -768, 2304, 1024, 2304, 1024, 6144};
+static const s16 Unknown_8417008[] = {2048, 2304, 2048, 2304, 2048, 2304, 6144};
+static const s16 Unknown_8417016[] = {512, 256, 512, 256, 512, 1024, 512, 6144};
+static const s16 Unknown_8417026[] = {256, 256, -256, -256, -768, 1024, -768, 6144};
+static const s16 Unknown_8417036[] = {2048, 2304, 2816, 3328, 3584, 3328, 2816, 6144};
+static const s16 Unknown_8417046[] = {2048, 1536, 1024, 512, 3328, 2816, 2304, 6144};
+static const s16 Unknown_8417056[] = {768, 1024, 1536, 2048, 1792, 2048, 1024, 6144};
+
+static const s16 *const sWordPitches[] = {
+ Unknown_8416F08,
+ Unknown_8416F0C,
+ Unknown_8416F10,
+ Unknown_8416F14,
+ Unknown_8416F18,
+ Unknown_8416F1C,
+ Unknown_8416F22,
+ Unknown_8416F28,
+ Unknown_8416F2E,
+ Unknown_8416F34,
+ Unknown_8416F3A,
+ Unknown_8416F42,
+ Unknown_8416F4A,
+ Unknown_8416F52,
+ Unknown_8416F5A,
+ Unknown_8416F62,
+ Unknown_8416F6C,
+ Unknown_8416F76,
+ Unknown_8416F80,
+ Unknown_8416F8A,
+ Unknown_8416F94,
+ Unknown_8416FA0,
+ Unknown_8416FAC,
+ Unknown_8416FB8,
+ Unknown_8416FC4,
+ Unknown_8416FD0,
+ Unknown_8416FDE,
+ Unknown_8416FEC,
+ Unknown_8416FFA,
+ Unknown_8417008,
+ Unknown_8417016,
+ Unknown_8417026,
+ Unknown_8417036,
+ Unknown_8417046,
+ Unknown_8417056
+};
+
+static const u32 sBardSoundLengthDeltas[] = {
+ 9,
+ 22,
+ 15,
+ 16,
+ 39,
+ 21,
+ 9,
+ 30,
+ 24,
+ 15,
+ 25,
+ 12,
+ 22,
+ 45,
+ 24,
+ 15,
+ 40,
+ 9,
+ 21,
+ 42,
+ 18,
+ 9,
+ 22,
+ 15,
+ 27,
+ 48,
+ 18,
+ 27,
+ 33,
+ 24,
+ 25,
+ 39,
+ 19,
+ 16,
+ 54,
+ 18,
+ 9,
+ 45,
+ 15,
+ 12,
+ 39,
+ 23,
+ 5,
+ 45,
+ 12,
+ 21,
+ 48,
+ 12,
+ 21,
+ 69,
+ 18,
+ 15
+};
+
+#if ENGLISH
+#include "../src/data/bard_music_en.h"
+#elif GERMAN
+#include "../src/data/bard_music_de.h"
+#endif // ENGLISH/GERMAN
+
+static const struct BardSound (*const gBardMusicTable[])[6] = {
+ BardMusic_POKEMON,
+ BardMusic_TRAINER,
+ BardMusic_STATUS,
+ BardMusic_BATTLE,
+ BardMusic_GREETINGS,
+ BardMusic_PEOPLE,
+ BardMusic_VOICES,
+ BardMusic_SPEECH,
+ BardMusic_ENDINGS,
+ BardMusic_FEELINGS,
+ BardMusic_CONDITIONS,
+ BardMusic_ACTIONS,
+ BardMusic_LIFESTYLE,
+ BardMusic_HOBBIES,
+ BardMusic_TIME,
+ BardMusic_MISC,
+ BardMusic_ADJECTIVES,
+ BardMusic_EVENTS,
+ BardMusic_MOVE_1,
+ BardMusic_MOVE_2,
+ BardMusic_TRENDY_SAYING,
+ BardMusic_POKEMON_2
+};
+
+static s16 CalcWordPitch(u32 arg0, u32 songPos)
+{
+ return sWordPitches[arg0][songPos];
+}
+
+#if ENGLISH
+const struct BardSound *GetWordSounds(u16 group, u16 word)
+{
+ const struct BardSound (*sounds)[6] = gBardMusicTable[group];
+
+ return sounds[word];
+}
+#elif GERMAN
+const struct BardSound *GetWordSounds(u16 group, u16 word)
+{
+ const struct BardSound (*sounds)[6] = gBardMusicTable[group];
+ u32 index = de_sub_80EB748(group, word);
+
+ return sounds[index];
+}
+#endif
+
+s32 GetWordPhonemes(struct BardSong *song, const struct BardSound *src, u16 arg2)
+{
+ s32 i;
+ s32 j;
+ s32 thirty;
+
+ for (i = 0; i < 6; i++)
+ {
+ song->phonemes[i].sound = src[i].var00;
+ if (src[i].var00 != 0xFF)
+ {
+ s32 length = src[i].var01 + sBardSoundLengthDeltas[src[i].var00];
+
+ song->phonemes[i].length = length;
+ song->phonemes[i].volume = src[i].volume;
+ song->var04 += length;
+ }
+ }
+
+ for (j = 0, thirty = 30; j < i; j++)
+ song->phonemes[j].pitch = CalcWordPitch(thirty + arg2, j);
+
+ song->currWord++;
+ song->currPhoneme = 0;
+ song->phonemeTimer = 0;
+ song->state = 0;
+ song->voiceInflection = 0;
+
+ //warning: no return statement in function returning non-void
+}
diff --git a/src/field/battle_tower.c b/src/field/battle_tower.c
new file mode 100644
index 000000000..11c05e478
--- /dev/null
+++ b/src/field/battle_tower.c
@@ -0,0 +1,2226 @@
+#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 "constants/easy_chat.h"
+#include "event_data.h"
+#include "item.h"
+#include "constants/items.h"
+#include "main.h"
+#include "constants/map_objects.h"
+#include "constants/moves.h"
+#include "new_game.h"
+#include "overworld.h"
+#include "pokedex.h"
+#include "random.h"
+#include "save.h"
+#include "script_pokemon_80C4.h"
+#include "constants/species.h"
+#include "string_util.h"
+#include "task.h"
+#include "text.h"
+#include "trainer.h"
+#include "tv.h"
+#include "constants/vars.h"
+#include "ewram.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[] = {
+ FACILITY_CLASS_RUIN_MANIAC,
+ FACILITY_CLASS_TUBER_M,
+ FACILITY_CLASS_COOL_TRAINER_M,
+ FACILITY_CLASS_RICH_BOY,
+ FACILITY_CLASS_POKEMANIAC,
+ FACILITY_CLASS_SWIMMER_M,
+ FACILITY_CLASS_BLACK_BELT,
+ FACILITY_CLASS_GUITARIST,
+ FACILITY_CLASS_KINDLER,
+ FACILITY_CLASS_CAMPER,
+ FACILITY_CLASS_BUG_MANIAC,
+ FACILITY_CLASS_PSYCHIC_M,
+ FACILITY_CLASS_GENTLEMAN,
+ FACILITY_CLASS_SCHOOL_KID_M,
+ FACILITY_CLASS_POKEFAN_M,
+ FACILITY_CLASS_EXPERT_M,
+ FACILITY_CLASS_YOUNGSTER,
+ FACILITY_CLASS_FISHERMAN,
+ FACILITY_CLASS_CYCLING_TRIATHLETE_M,
+ FACILITY_CLASS_RUNNING_TRIATHLETE_M,
+ FACILITY_CLASS_SWIMMING_TRIATHLETE_M,
+ FACILITY_CLASS_DRAGON_TAMER,
+ FACILITY_CLASS_BIRD_KEEPER,
+ FACILITY_CLASS_NINJA_BOY,
+ FACILITY_CLASS_SAILOR,
+ FACILITY_CLASS_COLLECTOR,
+ FACILITY_CLASS_POKEMON_BREEDER_M,
+ FACILITY_CLASS_POKEMON_RANGER_M,
+ FACILITY_CLASS_BUG_CATCHER,
+ FACILITY_CLASS_HIKER,
+};
+
+static const u8 sFemaleTrainerClasses[] = {
+ FACILITY_CLASS_AROMA_LADY,
+ FACILITY_CLASS_TUBER_F,
+ FACILITY_CLASS_COOL_TRAINER_F,
+ FACILITY_CLASS_HEX_MANIAC,
+ FACILITY_CLASS_LADY,
+ FACILITY_CLASS_BEAUTY,
+ FACILITY_CLASS_PSYCHIC_F,
+ FACILITY_CLASS_SCHOOL_KID_F,
+ FACILITY_CLASS_POKEFAN_F,
+ FACILITY_CLASS_EXPERT_F,
+ FACILITY_CLASS_CYCLING_TRIATHLETE_F,
+ FACILITY_CLASS_RUNNING_TRIATHLETE_F,
+ FACILITY_CLASS_SWIMMING_TRIATHLETE_F,
+ FACILITY_CLASS_BATTLE_GIRL,
+ FACILITY_CLASS_PARASOL_LADY,
+ FACILITY_CLASS_SWIMMER_F,
+ FACILITY_CLASS_PICNICKER,
+ FACILITY_CLASS_POKEMON_BREEDER_F,
+ FACILITY_CLASS_POKEMON_RANGER_F,
+ FACILITY_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);
+static void SaveCurrentWinStreak(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 BattleText_Format3[];
+extern const u8 BattleText_Format4[];
+extern const u8 BattleText_Format5[];
+extern const u8 BattleText_Format6[];
+extern const u8 BattleText_Format7[];
+extern const u8 BattleText_Format8[];
+extern const u8 BattleText_Format9[];
+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[];
+
+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_TEMP_0, 5);
+ }
+ break;
+ case 1:
+ ResetBattleTowerStreak(levelType);
+ VarSet(VAR_TEMP_0, 1);
+ var1++;
+ break;
+ case 4:
+ VarSet(VAR_TEMP_0, 2);
+ var1++;
+ break;
+ case 5:
+ VarSet(VAR_TEMP_0, 3);
+ var1++;
+ break;
+ case 2:
+ VarSet(VAR_TEMP_0, 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_TEMP_0, 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 (gSpecialVar_Result != 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(VAR_OBJ_GFX_ID_0, trainerObjectGfxId);
+ return;
+ }
+
+ for (i = 0; i < 20 && sFemaleTrainerClasses[i] != trainerClass; i++);
+ if (i != 20)
+ {
+ u8 trainerObjectGfxId = sFemaleTrainerGfxIds[i];
+ VarSet(VAR_OBJ_GFX_ID_0, trainerObjectGfxId);
+ return;
+ }
+
+ VarSet(VAR_OBJ_GFX_ID_0, 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, BattleText_Format3);
+ }
+ else if (numToAppend > curIndexToAppend)
+ {
+ StringAppend(gStringVar1, BattleText_Format4);
+ }
+ break;
+ case 1:
+ if (curIndexToAppend == numToAppend)
+ {
+ StringAppend(gStringVar1, BattleText_Format3);
+ }
+ else
+ {
+ StringAppend(gStringVar1, BattleText_Format4);
+ }
+
+ StringAppend(gStringVar1, BattleText_Format7);
+ break;
+ case 3:
+ case 5:
+ case 7:
+ case 9:
+ default:
+ if (curIndexToAppend == numToAppend)
+ {
+ StringAppend(gStringVar1, BattleText_Format3);
+ }
+ else
+ {
+ StringAppend(gStringVar1, BattleText_Format4);
+ }
+
+ StringAppend(gStringVar1, BattleText_Format6);
+ 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, gSpecialVar_Result, 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, BattleText_Format5);
+ StringAppend(gStringVar1, BattleText_Format8);
+ return;
+ }
+
+ if (1 & counter)
+ StringAppend(gStringVar1, BattleText_Format6);
+ else
+ StringAppend(gStringVar1, BattleText_Format5);
+
+ StringAppend(gStringVar1, BattleText_Format9);
+ }
+ else
+ {
+ gSpecialVar_0x8004 = 0;
+ gSaveBlock2.battleTower.battleTowerLevelType = gSpecialVar_Result;
+ }
+}
+
+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 StartSpecialBattle(void)
+{
+ s32 i;
+ u16 heldItem;
+ u8 transition;
+
+ switch (gSpecialVar_0x8004)
+ {
+ case 0: // battle tower battle
+ 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: // secret base battle
+ 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: // e-reader trainer battle
+ 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 SetBattleTowerProperty(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]++;
+ SaveCurrentWinStreak();
+ gSpecialVar_Result = 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]++;
+ }
+
+ SaveCurrentWinStreak();
+ gSpecialVar_Result = 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 BattleTowerUtil(void)
+{
+ u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType;
+
+ switch (gSpecialVar_0x8004)
+ {
+ case 0:
+ gSpecialVar_Result = gSaveBlock2.battleTower.var_4AE[battleTowerLevelType];
+ break;
+ case 1:
+ gSpecialVar_Result = gSaveBlock2.battleTower.battleTowerLevelType;
+ break;
+ case 2:
+ gSpecialVar_Result = gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType];
+ break;
+ case 3:
+ gSpecialVar_Result = gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType];
+ break;
+ case 4:
+ gSpecialVar_Result = gSaveBlock2.battleTower.battleTowerTrainerId;
+ break;
+ case 5:
+ case 6:
+ case 7:
+ break;
+ case 8:
+ gSpecialVar_Result = gSaveBlock2.battleTower.unk_554;
+ break;
+ case 9:
+ gSpecialVar_Result = 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 SetBattleTowerParty(void)
+{
+ s32 i;
+
+ for (i = 0; i < 3; i++)
+ {
+ gSelectedOrderFromParty[i] = gSaveBlock2.battleTower.selectedPartyMons[i];
+ }
+
+ ReducePlayerPartyToThree();
+}
+
+static void SaveCurrentWinStreak(void)
+{
+ u8 levelType = gSaveBlock2.battleTower.battleTowerLevelType;
+ u16 streak = GetCurrentBattleTowerWinStreak(levelType);
+
+ if (gSaveBlock2.battleTower.recordWinStreaks[levelType] < streak)
+ gSaveBlock2.battleTower.recordWinStreaks[levelType] = streak;
+
+ if (gSaveBlock2.battleTower.recordWinStreaks[0] > gSaveBlock2.battleTower.recordWinStreaks[1])
+ {
+ 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
+ {
+ 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;
+ }
+}
+
+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);
+ SaveCurrentWinStreak();
+}
+
+void SaveBattleTowerProgress(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_TEMP_0, 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;
+}
+
+void DetermineBattleTowerPrize(void)
+{
+ u8 levelType = gSaveBlock2.battleTower.battleTowerLevelType;
+
+ if (gSaveBlock2.battleTower.curStreakChallengesNum[levelType] - 1 > 5)
+ gSaveBlock2.battleTower.prizeItem = sLongStreakPrizes[Random() % ARRAY_COUNT(sLongStreakPrizes)];
+ else
+ gSaveBlock2.battleTower.prizeItem = sShortStreakPrizes[Random() % ARRAY_COUNT(sShortStreakPrizes)];
+}
+
+void GiveBattleTowerPrize(void)
+{
+ u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType;
+
+ if (AddBagItem(gSaveBlock2.battleTower.prizeItem, 1) == TRUE)
+ {
+ CopyItemName(gSaveBlock2.battleTower.prizeItem, gStringVar1);
+ gSpecialVar_Result = 1;
+ }
+ else
+ {
+ gSpecialVar_Result = 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;
+ }
+
+ gSpecialVar_Result = 0;
+
+ if (GetCurrentBattleTowerWinStreak(battleTowerLevelType) > 55)
+ {
+ for (i = 0; i < 3; i++)
+ {
+ partyIndex = gSaveBlock2.battleTower.selectedPartyMons[i] - 1;
+ pokemon = &gPlayerParty[partyIndex];
+ if (!GetMonData(pokemon, ribbonType))
+ {
+ gSpecialVar_Result = 1;
+ SetMonData(pokemon, ribbonType, &gSpecialVar_Result);
+ }
+ }
+ }
+
+ if (gSpecialVar_Result != 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;
+
+ gSpecialVar_Result = 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)
+ {
+ gSpecialVar_Result = 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);
+ gSpecialVar_Result = 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 TryEnableBravoTrainerBattleTower(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 fa15672e7..088267ad0 100644
--- a/src/berry.c
+++ b/src/field/berry.c
@@ -6,16 +6,22 @@
#include "item.h"
#include "item_menu.h"
#include "item_use.h"
-#include "items.h"
+#include "constants/items.h"
#include "main.h"
-#include "rng.h"
+#include "random.h"
#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,15 +978,29 @@ const struct Berry gBerries[] =
},
};
-const struct BerryTree gBlankBerryTree = {0};
+static const struct BerryTree gBlankBerryTree = {0};
-extern u8 BerryTreeScript;
-extern u16 gScriptLastTalked;
+extern u8 S_BerryTree[];
+extern u16 gSpecialVar_LastTalked;
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() == &BerryTreeScript
- && 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() != &BerryTreeScript)
+ 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 = gSpecialVar_LastTalked;
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,14 +1385,14 @@ void FieldObjectInteractionGetBerryTreeData(void)
GetBerryNameByBerryType(berry, gStringVar1);
}
-void sub_80B4EE4(void)
+void Berry_FadeAndGoToBerryBagMenu(void)
{
SetMainCallback2(sub_80A68CC);
}
void FieldObjectInteractionPlantBerryTree(void)
{
- u8 berry = ItemIdToBerryType(gScriptItemId);
+ u8 berry = ItemIdToBerryType(gSpecialVar_ItemId);
PlantBerryTree(FieldObjectGetBerryTreeId(gSelectedMapObject), berry, 1, TRUE);
FieldObjectInteractionGetBerryTreeData();
@@ -1344,14 +1409,16 @@ void FieldObjectInteractionPickBerryTree(void)
void FieldObjectInteractionRemoveBerryTree(void)
{
RemoveBerryTree(FieldObjectGetBerryTreeId(gSelectedMapObject));
- sub_8060288(gScriptLastTalked, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup);
+ sub_8060288(gSpecialVar_LastTalked, 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 a965f386c..960a163c1 100644
--- a/src/berry_tag_screen.c
+++ b/src/field/berry_tag_screen.c
@@ -4,14 +4,14 @@
#include "decompress.h"
#include "field_map_obj.h"
#include "item_menu.h"
-#include "items.h"
+#include "constants/items.h"
#include "item_use.h"
#include "main.h"
#include "menu.h"
#include "menu_helpers.h"
#include "palette.h"
-#include "rom4.h"
-#include "songs.h"
+#include "overworld.h"
+#include "constants/songs.h"
#include "sound.h"
#include "sprite.h"
#include "string_util.h"
@@ -28,8 +28,8 @@ struct Struct2000000
/*0x1FFFF*/ u8 var_1FFFF;
};
-extern struct Struct2000000 unk_2000000;
-extern u16 gUnknown_030041B4;
+extern struct Struct2000000 gSharedMem;
+extern u16 gBattle_BG1_Y;
static EWRAM_DATA u8 gUnknown_0203932C = 0;
static EWRAM_DATA s16 gUnknown_0203932E[5] = {0};
@@ -77,8 +77,8 @@ static void sub_8146014(void)
static void sub_814602C(void)
{
- REG_BG0VOFS = gUnknown_030041B4;
- REG_BG1VOFS = gUnknown_030041B4;
+ REG_BG0VOFS = gBattle_BG1_Y;
+ REG_BG1VOFS = gBattle_BG1_Y;
LoadOam();
ProcessSpriteCopyRequests();
@@ -119,13 +119,13 @@ static bool8 sub_8146058(void)
case 5:
if (!MultistepInitMenuWindowContinue())
break;
- unk_2000000.var_1FFFF = 0;
+ gSharedMem.var_1FFFF = 0;
gMain.state += 1;
break;
case 6:
if (!sub_81462B8())
break;
- unk_2000000.var_1FFFF = 0;
+ gSharedMem.var_1FFFF = 0;
gMain.state += 1;
break;
case 7:
@@ -133,12 +133,12 @@ static bool8 sub_8146058(void)
gMain.state += 1;
break;
case 8:
- berry = gScriptItemId + OFFSET_7B;
+ berry = gSpecialVar_ItemId + OFFSET_7B;
gUnknown_0203932C = CreateBerrySprite(berry, 56, 64);
gMain.state += 1;
break;
case 9:
- sub_8146600(gScriptItemId + OFFSET_7B);
+ sub_8146600(gSpecialVar_ItemId + OFFSET_7B);
gMain.state += 1;
break;
case 10:
@@ -183,7 +183,7 @@ static void sub_8146288(void)
REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(5) | BGCNT_16COLOR | BGCNT_TXT256x256;
REG_BG2CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(6) | BGCNT_16COLOR | BGCNT_TXT256x256;
REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256;
- gUnknown_030041B4 = 0;
+ gBattle_BG1_Y = 0;
}
bool8 sub_81462B8(void)
@@ -191,19 +191,19 @@ bool8 sub_81462B8(void)
u16 i;
void *addr;
- switch (unk_2000000.var_1FFFF)
+ switch (gSharedMem.var_1FFFF)
{
case 0:
LZDecompressVram(gBerryCheck_Gfx, (void *)VRAM);
- unk_2000000.var_1FFFF += 1;
+ gSharedMem.var_1FFFF += 1;
break;
case 1:
LZDecompressVram(gUnknown_08E788E4, (void *)VRAM + 0x2800);
- unk_2000000.var_1FFFF += 1;
+ gSharedMem.var_1FFFF += 1;
break;
case 2:
LZDecompressVram(gUnknown_08E78A84, (void *)VRAM + 0x3000);
- unk_2000000.var_1FFFF += 1;
+ gSharedMem.var_1FFFF += 1;
break;
case 3:
for (i = 0; i < 0x400; i++)
@@ -215,19 +215,19 @@ bool8 sub_81462B8(void)
}
addr = (void *)(VRAM + 0x3800);
DmaCopy16(3, gBGTilemapBuffers[2], addr, 0x800);
- unk_2000000.var_1FFFF += 1;
+ gSharedMem.var_1FFFF += 1;
break;
case 4:
LoadCompressedPalette(gBerryCheck_Pal, 0, 96 * 2);
- unk_2000000.var_1FFFF += 1;
+ gSharedMem.var_1FFFF += 1;
break;
case 5:
LoadCompressedObjectPic(&gUnknown_083C1F74);
- unk_2000000.var_1FFFF += 1;
+ gSharedMem.var_1FFFF += 1;
break;
case 6:
LoadCompressedObjectPalette(&gUnknown_083C1F7C);
- unk_2000000.var_1FFFF = 0;
+ gSharedMem.var_1FFFF = 0;
return TRUE;
}
@@ -277,9 +277,9 @@ static void sub_81464E4(void)
u8 buffer[16];
#endif
- berryInfo = GetBerryInfo(gScriptItemId + OFFSET_7B + 1);
+ berryInfo = GetBerryInfo(gSpecialVar_ItemId + OFFSET_7B + 1);
- ConvertIntToDecimalStringN(gStringVar1, gScriptItemId - FIRST_BERRY + 1, STR_CONV_MODE_LEADING_ZEROS, 2);
+ ConvertIntToDecimalStringN(gStringVar1, gSpecialVar_ItemId - FIRST_BERRY + 1, STR_CONV_MODE_LEADING_ZEROS, 2);
MenuPrint(gStringVar1, 12, 4);
#if ENGLISH
@@ -394,17 +394,17 @@ static void sub_8146798(u8 taskId)
{
s16 *taskData = gTasks[taskId].data;
- gUnknown_030041B4 = (gUnknown_030041B4 + taskData[0]) & 0xFF;
- if ((taskData[0] > 0 && gUnknown_030041B4 == 144)
- || (taskData[0] < 0 && gUnknown_030041B4 == 112))
+ gBattle_BG1_Y = (gBattle_BG1_Y + taskData[0]) & 0xFF;
+ if ((taskData[0] > 0 && gBattle_BG1_Y == 144)
+ || (taskData[0] < 0 && gBattle_BG1_Y == 112))
{
sub_8146810(gTasks[taskId].data[1]);
sub_81468BC();
}
- if (gUnknown_030041B4 == 0)
+ if (gBattle_BG1_Y == 0)
{
- gTasks[taskId].data[0] = gUnknown_030041B4;
- gTasks[taskId].data[1] = gUnknown_030041B4;
+ gTasks[taskId].data[0] = gBattle_BG1_Y;
+ gTasks[taskId].data[1] = gBattle_BG1_Y;
gTasks[taskId].func = sub_8146480;
}
}
@@ -437,7 +437,7 @@ static void sub_8146810(s8 berry)
gBagPocketScrollStates[berryPocket].cursorPos += berry;
}
}
- gScriptItemId = gCurrentBagPocketItemSlots[gBagPocketScrollStates[berryPocket].scrollTop + gBagPocketScrollStates[berryPocket].cursorPos].itemId;
+ gSpecialVar_ItemId = gCurrentBagPocketItemSlots[gBagPocketScrollStates[berryPocket].scrollTop + gBagPocketScrollStates[berryPocket].cursorPos].itemId;
DestroySprite(&gSprites[gUnknown_0203932C]);
sub_81466A0();
sub_80A7DD4();
@@ -449,7 +449,7 @@ static void sub_81468BC(void)
sub_81464E4();
// center of berry sprite
- gUnknown_0203932C = CreateBerrySprite(gScriptItemId + OFFSET_7B, 56, 64);
+ gUnknown_0203932C = CreateBerrySprite(gSpecialVar_ItemId + OFFSET_7B, 56, 64);
- sub_8146600(gScriptItemId + OFFSET_7B);
+ sub_8146600(gSpecialVar_ItemId + OFFSET_7B);
}
diff --git a/src/field/bike.c b/src/field/bike.c
new file mode 100644
index 000000000..8db01b4b4
--- /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 "constants/flags.h"
+#include "global.fieldmap.h"
+#include "metatile_behavior.h"
+#include "overworld.h"
+#include "constants/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..4b0025504 100644
--- a/src/birch_pc.c
+++ b/src/field/birch_pc.c
@@ -2,7 +2,7 @@
#include "event_data.h"
#include "field_message_box.h"
#include "pokedex.h"
-#include "species.h"
+#include "constants/species.h"
extern u16 gSpecialVar_0x8004;
extern u16 gSpecialVar_0x8005;
@@ -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 b8d7cd386..0d304714d 100644
--- a/src/braille_puzzles.c
+++ b/src/field/braille_puzzles.c
@@ -4,26 +4,29 @@
#include "field_camera.h"
#include "field_effect.h"
#include "fieldmap.h"
-#include "flags.h"
+#include "constants/flags.h"
#include "main.h"
+#include "constants/maps.h"
#include "map_obj_lock.h"
#include "menu.h"
#include "rom6.h"
#include "script.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
-#include "species.h"
+#include "constants/species.h"
#include "task.h"
#include "text.h"
extern u8 gPlayerPartyCount;
extern u8 gLastFieldPokeMenuOpened;
-extern u8 gIslandCave_EventScript_OpenRegiiceChamber[]; // regiice event script
+extern u8 S_OpenRegiceChamber[]; // regiice event script
bool8 ShouldDoBrailleDigEffect(void)
{
- if (!FlagGet(SYS_BRAILLE_DIG) && (gSaveBlock1.location.mapGroup == 0x18 && gSaveBlock1.location.mapNum == 0x47))
+ if (!FlagGet(FLAG_SYS_BRAILLE_DIG)
+ && (gSaveBlock1.location.mapGroup == MAP_GROUP(SEALED_CHAMBER_OUTER_ROOM)
+ && gSaveBlock1.location.mapNum == MAP_NUM(SEALED_CHAMBER_OUTER_ROOM)))
{
if (gSaveBlock1.pos.x == 10 && gSaveBlock1.pos.y == 3)
return TRUE;
@@ -46,16 +49,17 @@ void DoBrailleDigEffect(void)
MapGridSetMetatileIdAt(18, 9, 3636);
DrawWholeMapView();
PlaySE(SE_BAN);
- FlagSet(SYS_BRAILLE_DIG);
+ FlagSet(FLAG_SYS_BRAILLE_DIG);
ScriptContext2_Disable();
}
bool8 CheckRelicanthWailord(void)
{
+ // First comes Relicanth.
if (GetMonData(&gPlayerParty, MON_DATA_SPECIES2, 0) == SPECIES_RELICANTH)
{
CalculatePlayerPartyCount();
-
+ // Last comes Wailord
if (GetMonData(&gPlayerParty[gPlayerPartyCount - 1], MON_DATA_SPECIES2, 0) == SPECIES_WAILORD)
return TRUE;
}
@@ -64,7 +68,7 @@ bool8 CheckRelicanthWailord(void)
bool8 ShouldDoBrailleStrengthEffect(void)
{
- if (!FlagGet(SYS_BRAILLE_STRENGTH) && (gSaveBlock1.location.mapGroup == 0x18 && gSaveBlock1.location.mapNum == 0x6))
+ if (!FlagGet(FLAG_SYS_BRAILLE_STRENGTH) && (gSaveBlock1.location.mapGroup == MAP_GROUP(DESERT_RUINS) && gSaveBlock1.location.mapNum == MAP_NUM(DESERT_RUINS)))
{
if (gSaveBlock1.pos.x == 10 && gSaveBlock1.pos.y == 23)
return TRUE;
@@ -88,13 +92,13 @@ void DoBrailleStrengthEffect(void)
MapGridSetMetatileIdAt(16, 27, 3636);
DrawWholeMapView();
PlaySE(SE_BAN);
- FlagSet(SYS_BRAILLE_STRENGTH);
+ FlagSet(FLAG_SYS_BRAILLE_STRENGTH);
ScriptContext2_Disable();
}
bool8 ShouldDoBrailleFlyEffect(void)
{
- if (!FlagGet(SYS_BRAILLE_FLY) && (gSaveBlock1.location.mapGroup == 0x18 && gSaveBlock1.location.mapNum == 0x44))
+ if (!FlagGet(FLAG_SYS_BRAILLE_FLY) && (gSaveBlock1.location.mapGroup == MAP_GROUP(ANCIENT_TOMB) && gSaveBlock1.location.mapNum == MAP_NUM(ANCIENT_TOMB)))
{
if (gSaveBlock1.pos.x == 8 && gSaveBlock1.pos.y == 25)
return TRUE;
@@ -105,8 +109,8 @@ bool8 ShouldDoBrailleFlyEffect(void)
void DoBrailleFlyEffect(void)
{
- gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened;
- FieldEffectStart(0x3C);
+ gFieldEffectArguments[0] = gLastFieldPokeMenuOpened;
+ FieldEffectStart(FLDEFF_USE_FLY_ANCIENT_TOMB);
}
bool8 FldEff_UseFlyAncientTomb(void)
@@ -120,7 +124,7 @@ bool8 FldEff_UseFlyAncientTomb(void)
void UseFlyAncientTomb_Callback(void)
{
- FieldEffectActiveListRemove(0x3C);
+ FieldEffectActiveListRemove(FLDEFF_USE_FLY_ANCIENT_TOMB);
UseFlyAncientTomb_Finish();
}
@@ -134,13 +138,13 @@ void UseFlyAncientTomb_Finish(void)
MapGridSetMetatileIdAt(16, 27, 3636);
DrawWholeMapView();
PlaySE(SE_BAN);
- FlagSet(SYS_BRAILLE_FLY);
+ FlagSet(FLAG_SYS_BRAILLE_FLY);
ScriptContext2_Disable();
}
void DoBrailleWait(void)
{
- if (!FlagGet(SYS_BRAILLE_WAIT))
+ if (!FlagGet(FLAG_SYS_BRAILLE_WAIT))
CreateTask(Task_BrailleWait, 0x50);
}
@@ -158,7 +162,7 @@ void Task_BrailleWait(u8 taskId)
if (BrailleWait_CheckButtonPress() != FALSE)
{
MenuZeroFillScreen();
- PlaySE(5);
+ PlaySE(SE_SELECT);
data[0] = 2;
}
else
@@ -191,7 +195,7 @@ void Task_BrailleWait(u8 taskId)
break;
case 4:
sub_8064E2C();
- ScriptContext1_SetupScript(gIslandCave_EventScript_OpenRegiiceChamber);
+ ScriptContext1_SetupScript(S_OpenRegiceChamber);
DestroyTask(taskId);
break;
}
@@ -199,14 +203,14 @@ void Task_BrailleWait(u8 taskId)
bool32 BrailleWait_CheckButtonPress(void)
{
- u16 var = 0xFF;
+ u16 keyMask = A_BUTTON | B_BUTTON | START_BUTTON | SELECT_BUTTON | DPAD_ANY;
- if (gSaveBlock2.optionsButtonMode == 1)
- var |= 0x300;
- if (gSaveBlock2.optionsButtonMode == 2)
- var |= 0x200;
+ if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR)
+ keyMask |= L_BUTTON | R_BUTTON;
+ if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_L_EQUALS_A)
+ keyMask |= L_BUTTON;
- if ((var & gMain.newKeys) != FALSE)
+ if (gMain.newKeys & keyMask)
return TRUE;
else
return FALSE;
diff --git a/src/choose_party.c b/src/field/choose_party.c
index 7b2c833e1..d278eda4a 100644
--- a/src/choose_party.c
+++ b/src/field/choose_party.c
@@ -6,30 +6,18 @@
#include "name_string_util.h"
#include "palette.h"
#include "party_menu.h"
+#include "pokemon_menu.h"
#include "pokemon.h"
#include "pokemon_summary_screen.h"
-#include "rom4.h"
+#include "overworld.h"
#include "script.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "strings.h"
#include "string_util.h"
#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;
-};
+#include "ewram.h"
extern u8 gPlayerPartyCount;
extern u8 gLastFieldPokeMenuOpened;
@@ -37,55 +25,16 @@ 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 void sub_806D538();
-extern u16 sub_806BE38();
-extern u8 sub_806CA38();
-extern void sub_808B5B4();
-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);
-extern u16 sub_806BD80();
-extern void sub_806BF74();
+extern bool8 sub_80F9344(void);
static void ClearPartySelection(void);
static bool8 IsMonAllowedInBattleTower(struct Pokemon *);
@@ -109,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)
@@ -127,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++)
@@ -193,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;
}
@@ -227,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++;
}
@@ -276,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},
@@ -310,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)
@@ -352,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);
@@ -429,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
@@ -442,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;
}
}
@@ -453,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)
@@ -471,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);
}
@@ -480,11 +429,11 @@ static void sub_81225D4(u8 taskId)
{
if (!gPaletteFade.active)
{
- u8 r4 = gSprites[gTasks[taskId].data[3] >> 8].data0;
+ u8 r4 = gSprites[gTasks[taskId].data[3] >> 8].data[0];
DestroyTask(taskId);
ewram1B000.unk262 = 1;
- ShowPokemonSummaryScreen(gPlayerParty, r4, gPlayerPartyCount - 1, sub_81225A4, 0);
+ ShowPokemonSummaryScreen(gPlayerParty, r4, gPlayerPartyCount - 1, sub_81225A4, PSS_MODE_NORMAL);
}
}
@@ -506,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;
}
@@ -568,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)
@@ -578,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();
@@ -615,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);
}
}
@@ -654,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)
{
@@ -704,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);
}
}
@@ -726,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;
}
@@ -798,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},
@@ -819,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;
@@ -904,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)
@@ -922,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);
}
@@ -930,11 +879,11 @@ static void sub_8123034(u8 taskId)
{
if (!gPaletteFade.active)
{
- u8 r4 = gSprites[gTasks[taskId].data[3] >> 8].data0;
+ u8 r4 = gSprites[gTasks[taskId].data[3] >> 8].data[0];
DestroyTask(taskId);
ewram1B000.unk262 = 1;
- ShowPokemonSummaryScreen(gPlayerParty, r4, gPlayerPartyCount - 1, sub_8123004, 0);
+ ShowPokemonSummaryScreen(gPlayerParty, r4, gPlayerPartyCount - 1, sub_8123004, PSS_MODE_NORMAL);
}
}
@@ -949,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/field/coord_event_weather.c b/src/field/coord_event_weather.c
new file mode 100644
index 000000000..db4e9c161
--- /dev/null
+++ b/src/field/coord_event_weather.c
@@ -0,0 +1,119 @@
+#include "global.h"
+#include "constants/weather.h"
+#include "coord_event_weather.h"
+#include "field_weather.h"
+
+struct CoordEventWeather
+{
+ u8 coordEventWeather;
+ void (*func)(void);
+};
+
+static void CoordEventWeather_Clouds(void);
+static void CoordEventWeather_Sunny(void);
+static void CoordEventWeather_LightRain(void);
+static void CoordEventWeather_Snow(void);
+static void CoordEventWeather_Thunderstorm(void);
+static void CoordEventWeather_Fog(void);
+static void CoordEventWeather_DiagonalFog(void);
+static void CoordEventWeather_Ash(void);
+static void CoordEventWeather_Sandstorm(void);
+static void CoordEventWeather_Dark(void);
+static void CoordEventWeather_Drought(void);
+static void CoordEventWeather_Route119Cycle(void);
+static void CoordEventWeather_Route123Cycle(void);
+
+static const struct CoordEventWeather sCoordEventWeatherFuncs[] =
+{
+ { COORD_EVENT_WEATHER_CLOUDS, CoordEventWeather_Clouds },
+ { COORD_EVENT_WEATHER_SUNNY, CoordEventWeather_Sunny },
+ { COORD_EVENT_WEATHER_RAIN_LIGHT, CoordEventWeather_LightRain },
+ { COORD_EVENT_WEATHER_SNOW, CoordEventWeather_Snow },
+ { COORD_EVENT_WEATHER_RAIN_MED, CoordEventWeather_Thunderstorm },
+ { COORD_EVENT_WEATHER_FOG_1, CoordEventWeather_Fog },
+ { COORD_EVENT_WEATHER_FOG_2, CoordEventWeather_DiagonalFog },
+ { COORD_EVENT_WEATHER_ASH, CoordEventWeather_Ash },
+ { COORD_EVENT_WEATHER_SANDSTORM, CoordEventWeather_Sandstorm },
+ { COORD_EVENT_WEATHER_DARK, CoordEventWeather_Dark },
+ { COORD_EVENT_WEATHER_DROUGHT, CoordEventWeather_Drought },
+ { COORD_EVENT_WEATHER_ROUTE119_CYCLE, CoordEventWeather_Route119Cycle },
+ { COORD_EVENT_WEATHER_ROUTE123_CYCLE, CoordEventWeather_Route123Cycle },
+};
+
+static void CoordEventWeather_Clouds(void)
+{
+ SetWeather(WEATHER_CLOUDS);
+}
+
+static void CoordEventWeather_Sunny(void)
+{
+ SetWeather(WEATHER_SUNNY);
+}
+
+static void CoordEventWeather_LightRain(void)
+{
+ SetWeather(WEATHER_RAIN_LIGHT);
+}
+
+static void CoordEventWeather_Snow(void)
+{
+ SetWeather(WEATHER_SNOW);
+}
+
+static void CoordEventWeather_Thunderstorm(void)
+{
+ SetWeather(WEATHER_RAIN_MED);
+}
+
+static void CoordEventWeather_Fog(void)
+{
+ SetWeather(WEATHER_FOG_1);
+}
+
+static void CoordEventWeather_DiagonalFog(void)
+{
+ SetWeather(WEATHER_FOG_2);
+}
+
+static void CoordEventWeather_Ash(void)
+{
+ SetWeather(WEATHER_ASH);
+}
+
+static void CoordEventWeather_Sandstorm(void)
+{
+ SetWeather(WEATHER_SANDSTORM);
+}
+
+static void CoordEventWeather_Dark(void)
+{
+ SetWeather(WEATHER_DARK);
+}
+
+static void CoordEventWeather_Drought(void)
+{
+ SetWeather(WEATHER_DROUGHT);
+}
+
+static void CoordEventWeather_Route119Cycle(void)
+{
+ SetWeather(WEATHER_ROUTE119_CYCLE);
+}
+
+static void CoordEventWeather_Route123Cycle(void)
+{
+ SetWeather(WEATHER_ROUTE123_CYCLE);
+}
+
+void DoCoordEventWeather(u8 coordEventWeather)
+{
+ u8 i;
+ for (i = 0; i < ARRAY_COUNT(sCoordEventWeatherFuncs); i++)
+ {
+ if (sCoordEventWeatherFuncs[i].coordEventWeather == coordEventWeather)
+ {
+ sCoordEventWeatherFuncs[i].func();
+ return;
+ }
+ }
+}
diff --git a/src/field/daycare.c b/src/field/daycare.c
new file mode 100644
index 000000000..c28bc65ca
--- /dev/null
+++ b/src/field/daycare.c
@@ -0,0 +1,1792 @@
+#include "global.h"
+#include "daycare.h"
+#include "event_data.h"
+#include "field_effect.h"
+#include "constants/items.h"
+#include "mail_data.h"
+#include "main.h"
+#include "menu.h"
+#include "constants/moves.h"
+#include "name_string_util.h"
+#include "overworld.h"
+#include "party_menu.h"
+#include "pokemon.h"
+#include "pokemon_storage_system.h"
+#include "random.h"
+#include "script.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "constants/species.h"
+#include "string_util.h"
+#include "strings2.h"
+#include "text.h"
+#include "trade.h"
+
+// RAM buffers used to assist with BuildEggMoveset()
+IWRAM_DATA u16 gHatchedEggLevelUpMoves[52];
+IWRAM_DATA u16 gHatchedEggFatherMoves[4];
+IWRAM_DATA u16 gHatchedEggFinalMoves[4];
+IWRAM_DATA u16 gHatchedEggEggMoves[12];
+IWRAM_DATA u16 gHatchedEggMotherMoves[4];
+
+extern u16 gMoveToLearn;
+
+static void ClearDaycareMail(struct DayCareMail *);
+static void SetInitialEggData(struct Pokemon *, u16, struct DayCare *);
+static u8 GetDaycareCompatibilityScore(struct DayCare *);
+
+#include "../data/pokemon/egg_moves.h"
+
+static const u8 *const sCompatibilityMessages[] = {
+ DaycareText_GetAlongVeryWell,
+ DaycareText_GetAlong,
+ DaycareText_DontLikeOther,
+ DaycareText_PlayOther
+};
+
+const u8 sJapaneseEggNickname[] = _("タマゴ");
+
+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 CountPokemonInDaycare(struct DayCare *daycare)
+{
+ u8 i, count;
+ count = 0;
+
+ for (i = 0; i < 2; i++)
+ {
+ if (GetBoxMonData(&daycare->mons[i], MON_DATA_SPECIES) != 0)
+ count++;
+ }
+
+ return count;
+}
+
+void InitDaycareMailRecordMixing(struct BoxPokemon * daycareMons, struct RecordMixingDayCareMail * daycareMail)
+{
+ u8 i;
+ u8 numDaycareMons = 0;
+
+ for (i = 0; i < 2; i++)
+ {
+ if (GetBoxMonData(&daycareMons[i], MON_DATA_SPECIES) != SPECIES_NONE)
+ {
+ numDaycareMons++;
+ if (GetBoxMonData(&daycareMons[i], MON_DATA_HELD_ITEM) == ITEM_NONE)
+ {
+ daycareMail->itemsHeld[i] = 0;
+ }
+ else
+ {
+ daycareMail->itemsHeld[i] = 1;
+ }
+ }
+ else
+ {
+ daycareMail->itemsHeld[i] = 1;
+ }
+ }
+
+ daycareMail->numDaycareMons = numDaycareMons;
+}
+
+static s8 Daycare_FindEmptySpot(struct BoxPokemon * daycareMons)
+{
+ u8 i;
+
+ for (i = 0; i < 2; i++)
+ {
+ if (GetBoxMonData(&daycareMons[i], MON_DATA_SPECIES) == 0)
+ return i;
+ }
+
+ return -1;
+}
+
+static void StorePokemonInDaycare(struct Pokemon * mon, struct DayCare * daycare)
+{
+ s8 emptySlot;
+ u8 mail;
+ u8 *names;
+
+ emptySlot = Daycare_FindEmptySpot(daycare->mons);
+ if (MonHasMail(mon))
+ {
+ StringCopy((names = daycare->misc.mail[emptySlot].names), gSaveBlock2.playerName);
+ PadNameString(names, 0xFC);
+ names += 8;
+ GetMonNick(mon, names);
+ mail = GetMonData(mon, MON_DATA_MAIL);
+ daycare->misc.mail[emptySlot].message = gSaveBlock1.mail[mail];
+ TakeMailFromMon(mon);
+ }
+
+ daycare->mons[emptySlot] = mon->box;
+ BoxMonRestorePP(&daycare->mons[emptySlot]);
+ daycare->misc.countersEtc.steps[emptySlot] = 0;
+ ZeroMonData(mon);
+ party_compaction();
+ CalculatePlayerPartyCount();
+}
+
+void StoreSelectedPokemonInDaycare(void)
+{
+ StorePokemonInDaycare(&gPlayerParty[gLastFieldPokeMenuOpened], &gSaveBlock1.daycare);
+}
+
+// Shifts the second daycare pokemon slot into the first slot.
+static void ShiftDaycareSlots(struct DayCare * daycare)
+{
+ // This condition is only satisfied when the player takes out the first pokemon from the daycare.
+ if (GetBoxMonData(&daycare->mons[1], MON_DATA_SPECIES) != 0 && GetBoxMonData(&daycare->mons[0], MON_DATA_SPECIES) == 0)
+ {
+ daycare->mons[0] = daycare->mons[1];
+ ZeroBoxMonData(&daycare->mons[1]);
+
+ daycare->misc.mail[0] = daycare->misc.mail[1];
+ daycare->misc.countersEtc.steps[0] = daycare->misc.countersEtc.steps[1];
+ daycare->misc.countersEtc.steps[1] = 0;
+ ClearDaycareMail(&daycare->misc.mail[1]);
+ }
+}
+
+static void ApplyDaycareExperience(struct Pokemon * mon)
+{
+ s32 i;
+ bool8 firstMove;
+ u16 learnedMove;
+
+ for (i = 0; i < MAX_LEVEL; i++)
+ {
+ // Add the mon's gained daycare experience level by level until it can't level up anymore.
+ if (TryIncrementMonLevel(mon))
+ {
+ // Teach the mon new moves it learned while in the daycare.
+ firstMove = TRUE;
+ while ((learnedMove = MonTryLearningNewMove(mon, firstMove)) != 0)
+ {
+ firstMove = FALSE;
+ if (learnedMove == 0xffff)
+ {
+ // Mon already knows 4 moves.
+ DeleteFirstMoveAndGiveMoveToMon(mon, gMoveToLearn);
+ }
+ }
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ // Re-calculate the mons stats at its new level.
+ CalculateMonStats(mon);
+}
+
+static u16 TakeSelectedPokemonFromDaycare(struct DayCare * daycare, u8 slot)
+{
+ u16 species;
+ u32 experience;
+ struct Pokemon pokemon;
+
+ GetBoxMonNick(&daycare->mons[slot], gStringVar1);
+ species = GetBoxMonData(&daycare->mons[slot], MON_DATA_SPECIES);
+ sub_803B4B4(&daycare->mons[slot], &pokemon);
+
+ if (GetMonData(&pokemon, MON_DATA_LEVEL) != MAX_LEVEL)
+ {
+ experience = GetMonData(&pokemon, MON_DATA_EXP) + daycare->misc.countersEtc.steps[slot];
+ SetMonData(&pokemon, MON_DATA_EXP, &experience);
+ ApplyDaycareExperience(&pokemon);
+ }
+
+ gPlayerParty[PARTY_SIZE - 1] = pokemon;
+ if (daycare->misc.mail[slot].message.itemId)
+ {
+ GiveMailToMon2(&gPlayerParty[PARTY_SIZE - 1], &daycare->misc.mail[slot].message);
+ ClearDaycareMail(&daycare->misc.mail[slot]);
+ }
+
+ party_compaction();
+ ZeroBoxMonData(&daycare->mons[slot]);
+ daycare->misc.countersEtc.steps[slot] = 0;
+ ShiftDaycareSlots(daycare);
+ CalculatePlayerPartyCount();
+ return species;
+}
+
+u16 TakePokemonFromDaycare(void)
+{
+ return TakeSelectedPokemonFromDaycare(&gSaveBlock1.daycare, gSpecialVar_0x8004);
+}
+
+static u8 GetLevelAfterDaycareSteps(struct BoxPokemon * mon, u32 steps)
+{
+ struct BoxPokemon tempMon = *mon;
+
+ u32 experience = GetBoxMonData(mon, MON_DATA_EXP) + steps;
+ SetBoxMonData(&tempMon, MON_DATA_EXP, &experience);
+ return GetLevelFromBoxMonExp(&tempMon);
+}
+
+static u8 GetNumLevelsGainedFromSteps(struct DayCare *daycare, u8 slot)
+{
+ u8 levelBefore;
+ u8 levelAfter;
+
+ levelBefore = GetLevelFromBoxMonExp(&daycare->mons[slot]);
+ levelAfter = GetLevelAfterDaycareSteps(&daycare->mons[slot], daycare->misc.countersEtc.steps[slot]);
+ return levelAfter - levelBefore;
+}
+
+static u8 GetNumLevelsGainedForDaycareSlot(struct DayCare *daycare, u8 slot)
+{
+ u8 numLevelsGained = GetNumLevelsGainedFromSteps(daycare, slot);
+ GetBoxMonNick(&daycare->mons[slot], gStringVar1);
+ ConvertIntToDecimalStringN(gStringVar2, numLevelsGained, STR_CONV_MODE_LEFT_ALIGN, 2);
+ return numLevelsGained;
+}
+
+static u16 GetDaycareCostForSelectedMon(struct DayCare *daycare, u8 slot)
+{
+ u16 cost;
+
+ u8 numLevelsGained = GetNumLevelsGainedFromSteps(daycare, slot);
+ GetBoxMonNick(&daycare->mons[slot], gStringVar1);
+ cost = 100 + 100 * numLevelsGained;
+ ConvertIntToDecimalStringN(gStringVar2, cost, STR_CONV_MODE_LEFT_ALIGN, 5);
+ return cost;
+}
+
+void GetDaycareCost(void)
+{
+ gSpecialVar_0x8005 = GetDaycareCostForSelectedMon(&gSaveBlock1.daycare, gSpecialVar_0x8004);
+}
+
+void Debug_AddDaycareSteps(u16 numSteps)
+{
+ gSaveBlock1.daycare.misc.countersEtc.steps[0] += numSteps;
+ gSaveBlock1.daycare.misc.countersEtc.steps[1] += numSteps;
+}
+
+u8 GetNumLevelsGainedFromDaycare(void)
+{
+ if (GetBoxMonData(&gSaveBlock1.daycare.mons[gSpecialVar_0x8004], MON_DATA_SPECIES) != 0)
+ return GetNumLevelsGainedForDaycareSlot(&gSaveBlock1.daycare, gSpecialVar_0x8004);
+
+ return 0;
+}
+
+static void ClearDaycareMail(struct DayCareMail *mail)
+{
+ u8 *names;
+ u8 *names2;
+ s32 i;
+ u8 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 ((s32)names >= (s32)names2);
+ ClearMailStruct(&mail->message);
+}
+
+void unref_sub_8041824(struct DayCare *daycare)
+{
+ u8 slot;
+ for (slot = 0; slot < ARRAY_COUNT(daycare->mons); slot++)
+ {
+ ZeroBoxMonData(&daycare->mons[slot]);
+ daycare->misc.countersEtc.steps[slot] = 0;
+ ClearDaycareMail(&daycare->misc.mail[slot]);
+ }
+
+ daycare->misc.countersEtc.pendingEggPersonality = 0;
+ daycare->misc.countersEtc.eggCycleStepsRemaining = 0;
+}
+
+// Determines what the species of an Egg would be based on the given species.
+// It determines this by working backwards through the evolution chain of the
+// given species.
+u16 GetEggSpecies(u16 species)
+{
+ int i, j, k;
+ bool8 found;
+
+ // Working backwards up to 5 times seems arbitrary, since the maximum number
+ // of times would only be 3 for 3-stage evolutions.
+ 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 == NUM_SPECIES)
+ break;
+ }
+
+ return species;
+}
+
+static void _TriggerPendingDaycareEgg(struct DayCare *daycare)
+{
+ daycare->misc.countersEtc.pendingEggPersonality = (Random() % 0xfffe) + 1;
+ FlagSet(FLAG_PENDING_DAYCARE_EGG);
+}
+
+static void _TriggerPendingDaycareMaleEgg(struct DayCare *daycare)
+{
+ daycare->misc.countersEtc.pendingEggPersonality = Random() | 0x8000;
+ FlagSet(FLAG_PENDING_DAYCARE_EGG);
+}
+
+void TriggerPendingDaycareEgg(void)
+{
+ _TriggerPendingDaycareEgg(&gSaveBlock1.daycare);
+}
+
+void TriggerPendingDaycareMaleEgg(void)
+{
+ _TriggerPendingDaycareMaleEgg(&gSaveBlock1.daycare);
+}
+
+// Removes the selected index from the given IV list and shifts the remaining
+// elements to the left.
+static void RemoveIVIndexFromList(u8 *ivs, u8 selectedIv)
+{
+ s32 i, j;
+ u8 temp[NUM_STATS];
+
+ ivs[selectedIv] = 0xff;
+ for (i = 0; i < NUM_STATS; i++)
+ {
+ temp[i] = ivs[i];
+ }
+
+ j = 0;
+ for (i = 0; i < NUM_STATS; i++)
+ {
+ if (temp[i] != 0xff)
+ ivs[j++] = temp[i];
+ }
+}
+
+static void InheritIVs(struct Pokemon *egg, struct DayCare *daycare)
+{
+ u8 i;
+ u8 selectedIvs[3];
+ u8 availableIVs[NUM_STATS];
+ u8 whichParent[ARRAY_COUNT(selectedIvs)];
+ u8 iv;
+
+ // Initialize a list of IV indices.
+ for (i = 0; i < NUM_STATS; i++)
+ {
+ availableIVs[i] = i;
+ }
+
+ // Select the 3 IVs that will be inherited.
+ for (i = 0; i < ARRAY_COUNT(selectedIvs); i++)
+ {
+ // Randomly pick an IV from the available list.
+ selectedIvs[i] = availableIVs[Random() % (NUM_STATS - i)];
+
+ // Remove the selected IV index from the available IV indicies.
+ RemoveIVIndexFromList(availableIVs, selectedIvs[i]);
+ }
+
+ // Determine which parent each of the selected IVs should inherit from.
+ for (i = 0; i < ARRAY_COUNT(selectedIvs); i++)
+ {
+ whichParent[i] = Random() % 2;
+ }
+
+ // Set each of inherited IVs on the egg mon.
+ for (i = 0; i < ARRAY_COUNT(selectedIvs); i++)
+ {
+ switch (selectedIvs[i])
+ {
+ case 0:
+ iv = GetBoxMonData(&daycare->mons[whichParent[i]], MON_DATA_HP_IV);
+ SetMonData(egg, MON_DATA_HP_IV, &iv);
+ break;
+ case 1:
+ iv = GetBoxMonData(&daycare->mons[whichParent[i]], MON_DATA_ATK_IV);
+ SetMonData(egg, MON_DATA_ATK_IV, &iv);
+ break;
+ case 2:
+ iv = GetBoxMonData(&daycare->mons[whichParent[i]], MON_DATA_DEF_IV);
+ SetMonData(egg, MON_DATA_DEF_IV, &iv);
+ break;
+ case 3:
+ iv = GetBoxMonData(&daycare->mons[whichParent[i]], MON_DATA_SPEED_IV);
+ SetMonData(egg, MON_DATA_SPEED_IV, &iv);
+ break;
+ case 4:
+ iv = GetBoxMonData(&daycare->mons[whichParent[i]], MON_DATA_SPATK_IV);
+ SetMonData(egg, MON_DATA_SPATK_IV, &iv);
+ break;
+ case 5:
+ iv = GetBoxMonData(&daycare->mons[whichParent[i]], MON_DATA_SPDEF_IV);
+ SetMonData(egg, MON_DATA_SPDEF_IV, &iv);
+ break;
+ }
+ }
+}
+
+#ifdef NONMATCHING
+static
+#endif
+// Counts the number of egg moves a pokemon learns and stores the moves in
+// the given array.
+u8 GetEggMoves(struct Pokemon *pokemon, u16 *eggMoves)
+{
+ u16 eggMoveIdx;
+ u16 numEggMoves;
+ u16 species;
+ u16 i;
+
+ numEggMoves = 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)
+ {
+ // TODO: the curly braces around this if statement are required for a matching build.
+ break;
+ }
+
+ eggMoves[i] = gEggMoves[eggMoveIdx + i];
+ numEggMoves++;
+ }
+
+ return numEggMoves;
+}
+
+#ifdef NONMATCHING
+void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, struct BoxPokemon *mother)
+{
+ u16 numSharedParentMoves;
+ u8 numLevelUpMoves;
+ u16 numEggMoves;
+ u16 i, j;
+
+ numSharedParentMoves = 0;
+ for (i = 0; i < 4; i++)
+ {
+ gHatchedEggMotherMoves[i] = 0;
+ gHatchedEggFatherMoves[i] = 0;
+ gHatchedEggFinalMoves[i] = 0;
+ }
+ for (i = 0; i < 10; i++)
+ gHatchedEggEggMoves[i] = 0;
+ for (i = 0; i < 50; i++)
+ gHatchedEggLevelUpMoves[i] = 0;
+
+ numLevelUpMoves = GetLevelUpMovesBySpecies(GetMonData(egg, MON_DATA_SPECIES), gHatchedEggLevelUpMoves);
+ for (i = 0; i < 4; i++)
+ {
+ gHatchedEggFatherMoves[i] = GetBoxMonData(father, MON_DATA_MOVE1 + i);
+ gHatchedEggMotherMoves[i] = GetBoxMonData(mother, MON_DATA_MOVE1 + i);
+ }
+
+ numEggMoves = GetEggMoves(egg, gHatchedEggEggMoves);
+
+ for (i = 0; i < 4; i++)
+ {
+ if (gHatchedEggFatherMoves[i] != MOVE_NONE)
+ {
+ for (j = 0; j < (u32)numEggMoves; j++)
+ {
+ if (gHatchedEggFatherMoves[i] == gHatchedEggEggMoves[j])
+ {
+ if (GiveMoveToMon(egg, gHatchedEggFatherMoves[i]) == 0xffff)
+ DeleteFirstMoveAndGiveMoveToMon(egg, gHatchedEggFatherMoves[i]);
+ break;
+ }
+ }
+ }
+ else
+ break;
+ }
+ for (i = 0; i < 4; i++)
+ {
+ if (gHatchedEggFatherMoves[i] != MOVE_NONE)
+ {
+ for (j = 0; j < NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES; j++)
+ {
+ if (gHatchedEggFatherMoves[i] == ItemIdToBattleMoveId(ITEM_TM01 + j) && CanMonLearnTMHM(egg, j))
+ {
+ if (GiveMoveToMon(egg, gHatchedEggFatherMoves[i]) == 0xffff)
+ DeleteFirstMoveAndGiveMoveToMon(egg, gHatchedEggFatherMoves[i]);
+ }
+ }
+ }
+ }
+ for (i = 0; i < 4; i++)
+ {
+ if (gHatchedEggFatherMoves[i] == MOVE_NONE)
+ break;
+ for (j = 0; j < 4; j++)
+ {
+ if (gHatchedEggFatherMoves[i] == gHatchedEggMotherMoves[j] && gHatchedEggFatherMoves[i] != MOVE_NONE)
+ gHatchedEggFinalMoves[numSharedParentMoves++] = gHatchedEggFatherMoves[i];
+ }
+ }
+
+ for (i = 0; i < 4; i++)
+ {
+ if (gHatchedEggFinalMoves[i] == MOVE_NONE)
+ break;
+ for (j = 0; j < numLevelUpMoves; j++)
+ {
+ if (gHatchedEggLevelUpMoves[j] != MOVE_NONE && gHatchedEggFinalMoves[i] == gHatchedEggLevelUpMoves[j])
+ {
+ if (GiveMoveToMon(egg, gHatchedEggFinalMoves[i]) == 0xffff)
+ DeleteFirstMoveAndGiveMoveToMon(egg, gHatchedEggFinalMoves[i]);
+ break;
+ }
+ }
+ }
+}
+#else
+__attribute__((naked))
+void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, struct BoxPokemon *mother)
+{
+ 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 @ =gHatchedEggMotherMoves\n"
+ "\tmovs r2, 0\n"
+ "\tldr r4, _08041CCC @ =gHatchedEggFatherMoves\n"
+ "\tldr r3, _08041CD0 @ =gHatchedEggFinalMoves\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 @ =gHatchedEggEggMoves\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 @ =gHatchedEggLevelUpMoves\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 @ =gHatchedEggLevelUpMoves\n"
+ "\tbl GetLevelUpMovesBySpecies\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tstr r0, [sp, 0x4]\n"
+ "\tmovs r6, 0\n"
+ "\tldr r1, _08041CCC @ =gHatchedEggFatherMoves\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 @ =gHatchedEggMotherMoves\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 @ =gHatchedEggEggMoves\n"
+ "\tadds r0, r7, 0\n"
+ "\tbl GetEggMoves\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tmov r8, r0\n"
+ "\tmovs r6, 0\n"
+ "_08041C82:\n"
+ "\tldr r0, _08041CCC @ =gHatchedEggFatherMoves\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 @ =gHatchedEggEggMoves\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 gHatchedEggMotherMoves\n"
+ "_08041CCC: .4byte gHatchedEggFatherMoves\n"
+ "_08041CD0: .4byte gHatchedEggFinalMoves\n"
+ "_08041CD4: .4byte gHatchedEggEggMoves\n"
+ "_08041CD8: .4byte gHatchedEggLevelUpMoves\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 @ =gHatchedEggFatherMoves\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 @ =gHatchedEggFatherMoves\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 @ =gHatchedEggFinalMoves\n"
+ "\tmov r10, r3\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _08041DC6\n"
+ "\tmov r4, r9\n"
+ "\tldr r0, _08041E24 @ =gHatchedEggMotherMoves\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 @ =gHatchedEggLevelUpMoves\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 gHatchedEggFatherMoves\n"
+ "_08041E18: .4byte 0x0000ffff\n"
+ "_08041E1C: .4byte 0x00000121\n"
+ "_08041E20: .4byte gHatchedEggFinalMoves\n"
+ "_08041E24: .4byte gHatchedEggMotherMoves\n"
+ "_08041E28: .4byte gHatchedEggLevelUpMoves\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 @ =gHatchedEggFinalMoves\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 gHatchedEggFinalMoves");
+}
+#endif
+
+static void RemoveEggFromDayCare(struct DayCare *daycare)
+{
+ daycare->misc.countersEtc.pendingEggPersonality = 0;
+ daycare->misc.countersEtc.eggCycleStepsRemaining = 0;
+}
+
+void RejectEggFromDayCare(void)
+{
+ RemoveEggFromDayCare(&gSaveBlock1.daycare);
+}
+
+static void AlterEggSpeciesWithIncenseItem(u16 *species, struct DayCare *daycare)
+{
+ u16 motherItem, fatherItem;
+ if (*species == SPECIES_WYNAUT || *species == SPECIES_AZURILL)
+ {
+ motherItem = GetBoxMonData(&daycare->mons[0], MON_DATA_HELD_ITEM);
+ fatherItem = GetBoxMonData(&daycare->mons[1], MON_DATA_HELD_ITEM);
+ if (*species == SPECIES_WYNAUT && motherItem != ITEM_LAX_INCENSE && fatherItem != ITEM_LAX_INCENSE)
+ {
+ *species = SPECIES_WOBBUFFET;
+ }
+
+ if (*species == SPECIES_AZURILL && motherItem != ITEM_SEA_INCENSE && fatherItem != ITEM_SEA_INCENSE)
+ {
+ *species = SPECIES_MARILL;
+ }
+ }
+}
+
+static u16 DetermineEggSpeciesAndParentSlots(struct DayCare *daycare, u8 *parentSlots)
+{
+ u16 i;
+ u16 species[2];
+ u16 eggSpecies;
+
+ // Determine which of the daycare mons is the mother and father of the egg.
+ // The 0th index of the parentSlots array is considered the mother slot, and the
+ // 1st index is the father slot.
+ for (i = 0; i < 2; i++)
+ {
+ species[i] = GetBoxMonData(&daycare->mons[i], MON_DATA_SPECIES);
+ if (species[i] == SPECIES_DITTO)
+ {
+ parentSlots[0] = i ^ 1;
+ parentSlots[1] = i;
+ }
+ else if (GetBoxMonGender(&daycare->mons[i]) == MON_FEMALE)
+ {
+ parentSlots[0] = i;
+ parentSlots[1] = i ^ 1;
+ }
+ }
+
+ eggSpecies = GetEggSpecies(species[parentSlots[0]]);
+ if (eggSpecies == SPECIES_NIDORAN_F && daycare->misc.countersEtc.pendingEggPersonality & 0x8000)
+ {
+ eggSpecies = SPECIES_NIDORAN_M;
+ }
+ if (eggSpecies == SPECIES_ILLUMISE && daycare->misc.countersEtc.pendingEggPersonality & 0x8000)
+ {
+ eggSpecies = SPECIES_VOLBEAT;
+ }
+
+ // Make Ditto the "mother" slot if the other daycare mon is male.
+ if (species[parentSlots[1]] == SPECIES_DITTO && GetBoxMonGender(&daycare->mons[parentSlots[0]]) != MON_FEMALE)
+ {
+ u8 temp = parentSlots[1];
+ parentSlots[1] = parentSlots[0];
+ parentSlots[0] = temp;
+ }
+
+ return eggSpecies;
+}
+
+static void _GiveEggFromDaycare(struct DayCare *daycare) // give_egg
+{
+ struct Pokemon egg;
+ u16 species;
+ u8 parentSlots[2]; // 0th index is "mother" daycare slot, 1st is "father"
+ u8 isEgg;
+
+ species = DetermineEggSpeciesAndParentSlots(daycare, parentSlots);
+ AlterEggSpeciesWithIncenseItem(&species, daycare);
+ SetInitialEggData(&egg, species, daycare);
+ InheritIVs(&egg, daycare);
+ BuildEggMoveset(&egg, &daycare->mons[parentSlots[1]], &daycare->mons[parentSlots[0]]);
+ isEgg = TRUE;
+ SetMonData(&egg, MON_DATA_IS_EGG, &isEgg);
+ gPlayerParty[5] = egg;
+ party_compaction();
+ CalculatePlayerPartyCount();
+ RemoveEggFromDayCare(daycare);
+}
+
+
+void CreateEgg(struct Pokemon *mon, u16 species, bool8 setMetLocation)
+{
+ 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, sJapaneseEggNickname);
+ SetMonData(mon, MON_DATA_FRIENDSHIP, &gBaseStats[species].eggCycles);
+ SetMonData(mon, MON_DATA_MET_LEVEL, &metLevel);
+ SetMonData(mon, MON_DATA_LANGUAGE, &language);
+ if (setMetLocation)
+ {
+ metLocation = 253; // hot springs; see PokemonSummaryScreen_PrintEggTrainerMemo
+ SetMonData(mon, MON_DATA_MET_LOCATION, &metLocation);
+ }
+
+ isEgg = TRUE;
+ SetMonData(mon, MON_DATA_IS_EGG, &isEgg);
+}
+
+static void SetInitialEggData(struct Pokemon *mon, u16 species, struct DayCare *daycare)
+{
+ u32 personality;
+ u16 ball;
+ u8 metLevel;
+ u8 language;
+
+ personality = daycare->misc.countersEtc.pendingEggPersonality | (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, sJapaneseEggNickname);
+ SetMonData(mon, MON_DATA_FRIENDSHIP, &gBaseStats[species].eggCycles);
+ SetMonData(mon, MON_DATA_MET_LEVEL, &metLevel);
+ SetMonData(mon, MON_DATA_LANGUAGE, &language);
+}
+
+void GiveEggFromDaycare(void)
+{
+ _GiveEggFromDaycare(&gSaveBlock1.daycare);
+}
+
+#ifdef NONMATCHING
+static bool8 _ShouldEggHatch(struct DayCare *daycare)
+{
+ struct BoxPokemon *parent;
+ u32 i;
+ int v0;
+ int steps;
+ v0 = 0;
+ for (i=0, parent=&daycare->mons[0]; i<2; parent++, i++)
+ {
+ if (GetBoxMonData(parent, MON_DATA_SANITY_BIT2, v0))
+ {
+ daycare->misc.countersEtc.steps[i]++;
+ v0++;
+ }
+ }
+ if (daycare->misc.countersEtc.pendingEggPersonality == 0 && v0 == 2 && daycare->misc.extra.misc[4] == 0xff && GetDaycareCompatibilityScore(daycare) > (u32)((u32)(Random() * 100) / 0xffff))
+ {
+ TriggerPendingDaycareEgg();
+ }
+ if ((++daycare->misc.countersEtc.eggCycleStepsRemaining) == 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 _ShouldEggHatch(struct DayCare *daycare)
+{
+ 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 GetDaycareCompatibilityScore\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 TriggerPendingDaycareEgg\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 ShouldEggHatch(void)
+{
+ return _ShouldEggHatch(&gSaveBlock1.daycare);
+}
+
+static bool8 IsEggPending(struct DayCare *daycare)
+{
+ return (u32)((-daycare->misc.countersEtc.pendingEggPersonality) | daycare->misc.countersEtc.pendingEggPersonality) >> 31;
+}
+
+static void _GetDaycareMonNicknames(struct DayCare *daycare)
+{
+ u8 language;
+ if (GetBoxMonData(&daycare->mons[0], MON_DATA_SPECIES) != 0)
+ {
+ GetBoxMonNick(&daycare->mons[0], gStringVar1);
+ language = GetBoxMonData(&daycare->mons[0], MON_DATA_LANGUAGE);
+ GetBoxMonData(&daycare->mons[0], MON_DATA_OT_NAME, gStringVar3);
+ ConvertInternationalString(gStringVar3, language);
+ }
+
+ if (GetBoxMonData(&daycare->mons[1], MON_DATA_SPECIES) != 0)
+ {
+ GetBoxMonNick(&daycare->mons[1], gStringVar2);
+ }
+}
+
+u16 GetSelectedDaycareMonNickname(void)
+{
+ GetBoxMonNick(&gPlayerParty[gLastFieldPokeMenuOpened].box, gStringVar1);
+ return GetBoxMonData(&gPlayerParty[gLastFieldPokeMenuOpened].box, MON_DATA_SPECIES);
+}
+
+void GetDaycareMonNicknames(void)
+{
+ _GetDaycareMonNicknames(&gSaveBlock1.daycare);
+}
+
+u8 GetDaycareState(void)
+{
+ // The daycare can be in 4 possible states:
+ // 0: default state--no deposited mons, no egg
+ // 1: there is an egg waiting for the player to pick it up
+ // 2: there is a single pokemon in the daycare
+ // 3: there are two pokemon in the daycare, no egg
+
+ u8 numMons;
+ if (IsEggPending(&gSaveBlock1.daycare))
+ {
+ // There is an Egg waiting for the player.
+ return 1;
+ }
+
+ numMons = CountPokemonInDaycare(&gSaveBlock1.daycare);
+ if (numMons != 0)
+ {
+ return numMons + 1;
+ }
+
+ return 0;
+}
+
+#ifdef NONMATCHING
+static
+#endif
+bool8 EggGroupsOverlap(u16 *eggGroups1, u16 *eggGroups2)
+{
+ // Determine if the two given egg group lists contain any of the
+ // same egg groups.
+ s32 i, j;
+ u16 *v0, *v1, v2;
+
+ for (i = 0, v0 = eggGroups1; i < 2; v0++, i++)
+ {
+ for (j = 0, v2 = *v0, v1 = eggGroups2; j < 2; v1++, j++)
+ {
+ if (v2 == *v1)
+ {
+ return TRUE;
+ }
+ }
+ }
+
+ return FALSE;
+}
+
+#ifdef NONMATCHING
+static u8 GetDaycareCompatibilityScore(struct DayCare *daycare)
+{
+ 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=&daycare->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 (!EggGroupsOverlap(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 GetDaycareCompatibilityScore(struct DayCare *daycare)
+{
+ 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 EggGroupsOverlap\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 GetDaycareCompatibilityScoreFromSave(void)
+{
+ return GetDaycareCompatibilityScore(&gSaveBlock1.daycare);
+}
+
+void SetDaycareCompatibilityString(void)
+{
+ u8 whichString;
+ u8 relationshipScore;
+
+ relationshipScore = GetDaycareCompatibilityScoreFromSave();
+ whichString = 0;
+ if (relationshipScore == 0)
+ whichString = 3;
+ if (relationshipScore == 20)
+ whichString = 2;
+ if (relationshipScore == 50)
+ whichString = 1;
+ if (relationshipScore == 70)
+ whichString = 0;
+
+ StringCopy(gStringVar4, sCompatibilityMessages[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 *AppendMonGenderSymbol(u8 *name, struct BoxPokemon *boxMon)
+{
+ return AppendGenderSymbol(name, GetBoxMonGender(boxMon));
+}
+
+static void GetDaycareLevelMenuText(struct DayCare *daycare, u8 *dest)
+{
+ u8 monNames[2][20];
+ u8 i;
+
+ *dest = EOS;
+ for (i = 0; i < 2; i++)
+ {
+ GetBoxMonNick(&daycare->mons[i], monNames[i]);
+ AppendMonGenderSymbol(monNames[i], &daycare->mons[i]);
+ }
+
+ StringCopy(dest, monNames[0]);
+ StringAppend(dest, gOtherText_NewLine2);
+ StringAppend(dest, monNames[1]);
+ StringAppend(dest, gOtherText_NewLine2);
+ StringAppend(dest, gOtherText_CancelAndLv);
+}
+
+static void GetDaycareLevelMenuLevelText(struct DayCare *daycare, u8 *dest)
+{
+ u8 i;
+ u8 level;
+
+ *dest = EOS;
+ for (i = 0; i < 2; i++)
+ {
+ level = GetLevelAfterDaycareSteps(&daycare->mons[i], daycare->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 HandleDaycareLevelMenuInput(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 = gSpecialVar_Result = gTasks[taskId].data[0];
+ DestroyTask(taskId);
+ MenuZeroFillWindowRect(15, 6, 29, 13);
+ EnableBothScriptContexts();
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ HandleDestroyMenuCursors();
+ gLastFieldPokeMenuOpened = gSpecialVar_Result = 2;
+ DestroyTask(taskId);
+ MenuZeroFillWindowRect(15, 6, 29, 13);
+ EnableBothScriptContexts();
+ }
+}
+
+void ShowDaycareLevelMenu(void)
+{
+ u8 buffer[100];
+ MenuDrawTextWindow(15, 6, 29, 13);
+ GetDaycareLevelMenuText(&gSaveBlock1.daycare, buffer);
+ MenuPrint(buffer, 16, 7);
+ GetDaycareLevelMenuLevelText(&gSaveBlock1.daycare, buffer);
+ MenuPrint_PixelCoords(buffer, 0xce, 0x38, TRUE);
+ InitMenu(0, 16, 7, 3, 0, 13);
+ CreateTask(HandleDaycareLevelMenuInput, 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 da33b3ab7..87a9d8028 100644
--- a/src/decoration.c
+++ b/src/field/decoration.c
@@ -1,9 +1,10 @@
#include "global.h"
+#include "constants/decorations.h"
#include "main.h"
-#include "map_object_constants.h"
-#include "rom4.h"
+#include "constants/map_objects.h"
+#include "overworld.h"
#include "sound.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "string_util.h"
#include "menu.h"
#include "menu_helpers.h"
@@ -18,6 +19,7 @@
#include "event_data.h"
#include "field_weather.h"
#include "decoration.h"
+#include "ewram.h"
EWRAM_DATA u8 *gUnknown_020388D0 = NULL;
EWRAM_DATA u8 gUnknown_020388D4 = 0;
@@ -619,7 +621,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 +1391,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[] = {
@@ -1424,139 +1426,6 @@ const struct YesNoFuncTable gUnknown_083EC634[] = {
{sub_8109D04, sub_80FF058}
};
-const u16 gUnknown_083EC654[] = {0x6318, 0x739C, 0x7FFF};
-const u8 gUnknown_083EC65A[] = _("{PALETTE 13}{STR_VAR_1}");
-
-const u8 Unknown_3EC660[] = {0, 1, 2, 3};
-const u8 Unknown_3EC664[] = {0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13};
-const u8 Unknown_3EC670[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
-const u8 Unknown_3EC680[] = {0, 1, 4, 5, 8, 9, 12, 13, 16, 17, 20, 21};
-const u8 Unknown_3EC68C[] = {0, 1, 2, 3, 4, 5, 6, 7};
-const u8 Unknown_3EC694[] = {0, 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};
-const u8 Unknown_3EC6B4[] = {0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29, 32, 33, 34, 35, 36, 37, 40, 41, 42, 43, 44, 45};
-const u8 Unknown_3EC6D8[] = {0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29};
-
-const u8 Unknown_3EC6F0[] = {0, 0, 0, 0};
-const u8 Unknown_3EC6F4[] = {0, 0, 1, 1, 0, 0, 1, 1};
-const u8 Unknown_3EC6FC[] = {0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2};
-const u8 Unknown_3EC708[] = {0, 0, 1, 1, 2, 2, 3, 3, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 4, 4, 5, 5, 6, 6, 7, 7};
-const u8 Unknown_3EC728[] = {0, 0, 1, 1, 0, 0, 1, 1, 2, 2, 3, 3, 2, 2, 3, 3};
-const u8 Unknown_3EC738[] = {0, 0, 0, 0, 1, 1, 1, 1};
-const u8 Unknown_3EC740[] = {0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2};
-const u8 Unknown_3EC74C[] = {0, 0, 1, 1, 0, 0, 1, 1, 2, 2, 3, 3, 2, 2, 3, 3, 4, 4, 5, 5, 4, 4, 5, 5, 6, 6, 7, 7, 6, 6, 7, 7};
-const u8 Unknown_3EC76C[] = {0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 6, 6, 7, 7, 8, 8};
-const u8 Unknown_3EC790[] = {0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 3, 3, 4, 4, 5, 5};
-
-const u8 Unknown_3EC7A8[] = {4, 5, 6, 7};
-const u8 Unknown_3EC7AC[] = {4, 5, 4, 5, 6, 7, 6, 7};
-const u8 Unknown_3EC7B4[] = {4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7};
-const u8 Unknown_3EC7C0[] = {4, 5, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 6, 7, 4, 5, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 6, 7};
-const u8 Unknown_3EC7E0[] = {4, 5, 4, 5, 6, 7, 6, 7, 4, 5, 4, 5, 6, 7, 6, 7};
-const u8 Unknown_3EC7F0[] = {4, 5, 6, 7, 4, 5, 6, 7};
-const u8 Unknown_3EC7F8[] = {4, 5, 6, 7, 4, 5, 6, 7, 4, 5, 6, 7};
-const u8 Unknown_3EC804[] = {4, 5, 4, 5, 6, 7, 6, 7, 4, 5, 4, 5, 6, 7, 6, 7, 4, 5, 4, 5, 6, 7, 6, 7, 4, 5, 4, 5, 6, 7, 6, 7};
-const u8 Unknown_3EC824[] = {4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7};
-const u8 Unknown_3EC848[] = {4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7};
-
-const struct UnkStruct_803EC860 gUnknown_083EC860[] = {
- {Unknown_3EC660, Unknown_3EC6F0, Unknown_3EC7A8, 0x4},
- {Unknown_3EC68C, Unknown_3EC6F4, Unknown_3EC7AC, 0x8},
- {Unknown_3EC664, Unknown_3EC6FC, Unknown_3EC7B4, 0xc},
- {Unknown_3EC694, Unknown_3EC708, Unknown_3EC7C0, 0x20},
- {Unknown_3EC670, Unknown_3EC728, Unknown_3EC7E0, 0x10},
- {Unknown_3EC68C, Unknown_3EC738, Unknown_3EC7F0, 0x8},
- {Unknown_3EC680, Unknown_3EC740, Unknown_3EC7F8, 0xc},
- {Unknown_3EC694, Unknown_3EC74C, Unknown_3EC804, 0x20},
- {Unknown_3EC6B4, Unknown_3EC76C, Unknown_3EC824, 0x24},
- {Unknown_3EC6D8, Unknown_3EC790, Unknown_3EC848, 0x18}
-};
-
-const struct UnkStruct_083EC900 gUnknown_083EC900[] = {
- {0, 1, 0x78, 0x4e},
- {1, 2, 0x80, 0x4e},
- {1, 3, 0x90, 0x56},
- {1, 3, 0x90, 0x46},
- {0, 2, 0x80, 0x46},
- {2, 2, 0x78, 0x46},
- {2, 3, 0x80, 0x56},
- {2, 3, 0x80, 0x36},
- {0, 3, 0x90, 0x46},
- {1, 3, 0x90, 0x46}
-};
-
-const union AnimCmd gSpriteAnim_83EC928[] = {
- ANIMCMD_FRAME(.imageValue = 0, .duration = 0),
- ANIMCMD_END
-};
-
-const union AnimCmd *const gSpriteAnimTable_83EC930[] = {
- gSpriteAnim_83EC928
-};
-
-const struct SpriteFrameImage gSpriteImageTable_83EC934[] = {
- {.data = (u8 *)&gUnknown_02038900.image, .size = sizeof gUnknown_02038900.image}
-};
-
-const struct SpriteTemplate gSpriteTemplate_83EC93C = {
- .tileTag = 0xffff,
- .paletteTag = 3000,
- .oam = &gUnknown_020391AC,
- .anims = gSpriteAnimTable_83EC930,
- .images = gSpriteImageTable_83EC934,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_81009A8
-};
-
-const struct SpritePalette gUnknown_083EC954 = {.data = (u16 *)&gUnknown_02038900.palette, .tag = 3000};
-
-const struct YesNoFuncTable gUnknown_083EC95C = {.yesFunc = sub_81000C4, .noFunc = sub_810065C};
-const struct YesNoFuncTable gUnknown_083EC964 = {.yesFunc = sub_810026C, .noFunc = sub_810065C};
-const struct YesNoFuncTable gUnknown_083EC96C[] = {
- {.yesFunc = sub_80FFAB0, .noFunc = sub_80FFB08},
- {.yesFunc = sub_8100F88, .noFunc = sub_8100FB4}
-};
-
-const u8 gUnknown_083EC97C[] = {4, 4, 4, 4, 0, 3, 3, 0};
-const u8 gUnknown_083EC984[] = {4, 4, 4, 4, 0, 4, 3, 0};
-
-const u16 gUnknown_083EC98C[] = INCBIN_U16("graphics/unknown/83EC98C.gbapal");
-const u16 Unknown_3EC9AC[] = INCBIN_U16("graphics/unknown/83EC9AC.gbapal");
-const struct YesNoFuncTable gUnknown_083EC9CC = {.yesFunc = sub_810153C, .noFunc = sub_8100EEC};
-const struct YesNoFuncTable gUnknown_083EC9D4 = {.yesFunc = sub_8101590, .noFunc = sub_8100EEC};
-const u32 gSpriteImage_83EC9DC[] = INCBIN_U32("graphics/unknown_sprites/83EC9DC.4bpp");
-const struct SpritePalette gUnknown_083ECA5C = {.data = gUnknown_083EC98C, .tag = 8};
-const struct SpritePalette gUnknown_083ECA64 = {.data = Unknown_3EC9AC, .tag = 8};
-const struct OamData gOamData_83ECA6C = {
- .size = 1, .priority = 1
-};
-
-const union AnimCmd gSpriteAnim_83ECA74[] = {
- ANIMCMD_FRAME(.imageValue = 0, .duration = 0),
- ANIMCMD_END
-};
-
-const union AnimCmd *const gSpriteAnimTable_83ECA7C[] = {
- gSpriteAnim_83ECA74
-};
-
-const struct SpriteFrameImage gSpriteImageTable_83ECA80[] = {
- obj_frame_tiles(gSpriteImage_83EC9DC)
-};
-
-const struct SpriteTemplate gSpriteTemplate_83ECA88 = {
- .tileTag = 0xffff,
- .paletteTag = 8,
- .oam = &gOamData_83ECA6C,
- .anims = gSpriteAnimTable_83ECA7C,
- .images = gSpriteImageTable_83ECA80,
- .affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_8101698
-};
-
-const struct YesNoFuncTable gUnknown_083ECAA0 = {.yesFunc = sub_8101848, .noFunc = sub_80FED3C};
-
-u8 *const unref_label_083ECAA8[] = {ewram};
-
// text
extern u8 gUnknown_0815F399[];
@@ -1603,8 +1472,9 @@ void DoPlayerPCDecoration(u8 taskId)
void sub_80FE2B4(void)
{
- u16 palettes[3];
- memcpy(palettes, gUnknown_083EC654, sizeof gUnknown_083EC654);
+ u16 palettes[3] = {RGB(24, 24, 24),
+ RGB(28, 28, 28),
+ RGB(31, 31, 31)};
LoadPalette(&palettes[2], 0xdf, 2);
LoadPalette(&palettes[1], 0xd1, 2);
LoadPalette(&palettes[0], 0xd8, 2);
@@ -1906,6 +1776,8 @@ void sub_80FE948(u8 taskId)
}
}
+const u8 gUnknown_083EC65A[] = _("{PALETTE 13}{STR_VAR_1}");
+
void sub_80FEABC(u8 taskId, u8 dummy1)
{
u16 i;
@@ -2199,7 +2071,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)
@@ -2320,12 +2192,12 @@ void sub_80FF474(void)
u8 j;
for (i=0; i<14; i++)
{
- if (FlagGet(i + 0xae) == 1)
+ if (FlagGet(i + FLAG_DECORATION_2) == 1)
{
- FlagReset(i + 0xae);
+ FlagClear(i + FLAG_DECORATION_2);
for (j=0; j<gMapHeader.events->mapObjectCount; j++)
{
- if (gMapHeader.events->mapObjects[j].flagId == i + 0xae)
+ if (gMapHeader.events->mapObjects[j].flagId == i + FLAG_DECORATION_2)
{
break;
}
@@ -2438,11 +2310,11 @@ void AddDecorationIconObjectFromFieldObject(struct UnkStruct_02038900 * unk_0203
sub_8100874(unk_02038900);
sub_810070C(unk_02038900->palette, ((u16 *)gMapHeader.mapData->secondaryTileset->metatiles + 8 * unk_02038900->decoration->tiles[0])[7] >> 12);
LoadSpritePalette(&gUnknown_083EC954);
- gUnknown_020391A8 = gSprites[gUnknown_03004880.unk4].data0;
+ gUnknown_020391A8 = gSprites[gUnknown_03004880.unk4].data[0];
gUnknown_03004880.unk4 = CreateSprite(&gSpriteTemplate_83EC93C, gUnknown_083EC900[unk_02038900->decoration->shape].x, gUnknown_083EC900[unk_02038900->decoration->shape].y, 0);
} else
{
- gUnknown_020391A8 = gSprites[gUnknown_03004880.unk4].data0;
+ gUnknown_020391A8 = gSprites[gUnknown_03004880.unk4].data[0];
gUnknown_03004880.unk4 = AddPseudoFieldObject(unk_02038900->decoration->tiles[0], sub_81009A8, gUnknown_083EC900[unk_02038900->decoration->shape].x, gUnknown_083EC900[unk_02038900->decoration->shape].y, 1);
gSprites[gUnknown_03004880.unk4].oam.priority = 1;
}
@@ -2519,8 +2391,8 @@ void sub_80FF960(u8 taskId)
void sub_80FFAB0(u8 taskId)
{
gTasks[taskId].data[10] = 0;
- gSprites[gUnknown_020391A8].data7 = 1;
- gSprites[gUnknown_020391A9].data7 = 1;
+ gSprites[gUnknown_020391A8].data[7] = 1;
+ gSprites[gUnknown_020391A9].data[7] = 1;
sub_810045C();
sub_8100038(taskId);
}
@@ -2528,8 +2400,8 @@ void sub_80FFAB0(u8 taskId)
void sub_80FFB08(u8 taskId)
{
gTasks[taskId].data[10] = 0;
- gSprites[gUnknown_020391A8].data7 = 1;
- gSprites[gUnknown_020391A9].data7 = 1;
+ gSprites[gUnknown_020391A8].data[7] = 1;
+ gSprites[gUnknown_020391A9].data[7] = 1;
sub_810045C();
DisplayItemMessageOnField(taskId, gSecretBaseText_CancelDecorating, sub_8100248, 0);
}
@@ -3399,13 +3271,13 @@ bool8 sub_8100430(void)
void sub_810045C(void)
{
gUnknown_020391AA = 0;
- gSprites[gUnknown_020391A8].data2 = 0;
- gSprites[gUnknown_020391A8].data3 = 0;
+ gSprites[gUnknown_020391A8].data[2] = 0;
+ gSprites[gUnknown_020391A8].data[3] = 0;
}
void sub_8100494(u8 taskId)
{
- if (!gSprites[gUnknown_020391A8].data4)
+ if (!gSprites[gUnknown_020391A8].data[4])
{
if (gTasks[taskId].data[10] == 1)
{
@@ -3419,29 +3291,29 @@ void sub_8100494(u8 taskId)
if ((gMain.heldKeys & DPAD_ANY) == DPAD_UP)
{
gUnknown_020391AA = DIR_SOUTH;
- gSprites[gUnknown_020391A8].data2 = 0;
- gSprites[gUnknown_020391A8].data3 = -2;
+ gSprites[gUnknown_020391A8].data[2] = 0;
+ gSprites[gUnknown_020391A8].data[3] = -2;
gTasks[taskId].data[1]--;
}
if ((gMain.heldKeys & DPAD_ANY) == DPAD_DOWN)
{
gUnknown_020391AA = DIR_NORTH;
- gSprites[gUnknown_020391A8].data2 = 0;
- gSprites[gUnknown_020391A8].data3 = 2;
+ gSprites[gUnknown_020391A8].data[2] = 0;
+ gSprites[gUnknown_020391A8].data[3] = 2;
gTasks[taskId].data[1]++;
}
if ((gMain.heldKeys & DPAD_ANY) == DPAD_LEFT)
{
gUnknown_020391AA = DIR_WEST;
- gSprites[gUnknown_020391A8].data2 = -2;
- gSprites[gUnknown_020391A8].data3 = 0;
+ gSprites[gUnknown_020391A8].data[2] = -2;
+ gSprites[gUnknown_020391A8].data[3] = 0;
gTasks[taskId].data[0]--;
}
if ((gMain.heldKeys & DPAD_ANY) == DPAD_RIGHT)
{
gUnknown_020391AA = DIR_EAST;
- gSprites[gUnknown_020391A8].data2 = 2;
- gSprites[gUnknown_020391A8].data3 = 0;
+ gSprites[gUnknown_020391A8].data[2] = 2;
+ gSprites[gUnknown_020391A8].data[3] = 0;
gTasks[taskId].data[0]++;
}
if (!sub_8100430() || !sub_810038C(taskId))
@@ -3451,8 +3323,8 @@ void sub_8100494(u8 taskId)
}
if (gUnknown_020391AA)
{
- gSprites[gUnknown_020391A8].data4++;
- gSprites[gUnknown_020391A8].data4 &= 7;
+ gSprites[gUnknown_020391A8].data[4]++;
+ gSprites[gUnknown_020391A8].data[4] &= 7;
}
if (!gTasks[taskId].data[10])
{
@@ -3470,7 +3342,7 @@ void sub_8100494(u8 taskId)
void sub_810065C(u8 taskId)
{
MenuZeroFillWindowRect(0, 0, 29, 19);
- gSprites[gUnknown_020391A8].data7 = 0;
+ gSprites[gUnknown_020391A8].data[7] = 0;
gTasks[taskId].data[10] = 0;
gTasks[taskId].func = sub_8100494;
}
@@ -3566,6 +3438,136 @@ u16 sub_810089C(u16 a0)
return ((u16 *)gMapHeader.mapData->secondaryTileset->metatiles)[a0] & 0xfff;
}
+const u8 Unknown_3EC660[] = {0, 1, 2, 3};
+const u8 Unknown_3EC664[] = {0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13};
+const u8 Unknown_3EC670[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
+const u8 Unknown_3EC680[] = {0, 1, 4, 5, 8, 9, 12, 13, 16, 17, 20, 21};
+const u8 Unknown_3EC68C[] = {0, 1, 2, 3, 4, 5, 6, 7};
+const u8 Unknown_3EC694[] = {0, 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};
+const u8 Unknown_3EC6B4[] = {0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29, 32, 33, 34, 35, 36, 37, 40, 41, 42, 43, 44, 45};
+const u8 Unknown_3EC6D8[] = {0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29};
+
+const u8 Unknown_3EC6F0[] = {0, 0, 0, 0};
+const u8 Unknown_3EC6F4[] = {0, 0, 1, 1, 0, 0, 1, 1};
+const u8 Unknown_3EC6FC[] = {0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2};
+const u8 Unknown_3EC708[] = {0, 0, 1, 1, 2, 2, 3, 3, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 4, 4, 5, 5, 6, 6, 7, 7};
+const u8 Unknown_3EC728[] = {0, 0, 1, 1, 0, 0, 1, 1, 2, 2, 3, 3, 2, 2, 3, 3};
+const u8 Unknown_3EC738[] = {0, 0, 0, 0, 1, 1, 1, 1};
+const u8 Unknown_3EC740[] = {0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2};
+const u8 Unknown_3EC74C[] = {0, 0, 1, 1, 0, 0, 1, 1, 2, 2, 3, 3, 2, 2, 3, 3, 4, 4, 5, 5, 4, 4, 5, 5, 6, 6, 7, 7, 6, 6, 7, 7};
+const u8 Unknown_3EC76C[] = {0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 6, 6, 7, 7, 8, 8};
+const u8 Unknown_3EC790[] = {0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 3, 3, 4, 4, 5, 5};
+
+const u8 Unknown_3EC7A8[] = {4, 5, 6, 7};
+const u8 Unknown_3EC7AC[] = {4, 5, 4, 5, 6, 7, 6, 7};
+const u8 Unknown_3EC7B4[] = {4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7};
+const u8 Unknown_3EC7C0[] = {4, 5, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 6, 7, 4, 5, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 6, 7};
+const u8 Unknown_3EC7E0[] = {4, 5, 4, 5, 6, 7, 6, 7, 4, 5, 4, 5, 6, 7, 6, 7};
+const u8 Unknown_3EC7F0[] = {4, 5, 6, 7, 4, 5, 6, 7};
+const u8 Unknown_3EC7F8[] = {4, 5, 6, 7, 4, 5, 6, 7, 4, 5, 6, 7};
+const u8 Unknown_3EC804[] = {4, 5, 4, 5, 6, 7, 6, 7, 4, 5, 4, 5, 6, 7, 6, 7, 4, 5, 4, 5, 6, 7, 6, 7, 4, 5, 4, 5, 6, 7, 6, 7};
+const u8 Unknown_3EC824[] = {4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7};
+const u8 Unknown_3EC848[] = {4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7, 4, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 7};
+
+const struct UnkStruct_803EC860 gUnknown_083EC860[] = {
+ {Unknown_3EC660, Unknown_3EC6F0, Unknown_3EC7A8, 0x4},
+ {Unknown_3EC68C, Unknown_3EC6F4, Unknown_3EC7AC, 0x8},
+ {Unknown_3EC664, Unknown_3EC6FC, Unknown_3EC7B4, 0xc},
+ {Unknown_3EC694, Unknown_3EC708, Unknown_3EC7C0, 0x20},
+ {Unknown_3EC670, Unknown_3EC728, Unknown_3EC7E0, 0x10},
+ {Unknown_3EC68C, Unknown_3EC738, Unknown_3EC7F0, 0x8},
+ {Unknown_3EC680, Unknown_3EC740, Unknown_3EC7F8, 0xc},
+ {Unknown_3EC694, Unknown_3EC74C, Unknown_3EC804, 0x20},
+ {Unknown_3EC6B4, Unknown_3EC76C, Unknown_3EC824, 0x24},
+ {Unknown_3EC6D8, Unknown_3EC790, Unknown_3EC848, 0x18}
+};
+
+const struct UnkStruct_083EC900 gUnknown_083EC900[] = {
+ {0, 1, 0x78, 0x4e},
+ {1, 2, 0x80, 0x4e},
+ {1, 3, 0x90, 0x56},
+ {1, 3, 0x90, 0x46},
+ {0, 2, 0x80, 0x46},
+ {2, 2, 0x78, 0x46},
+ {2, 3, 0x80, 0x56},
+ {2, 3, 0x80, 0x36},
+ {0, 3, 0x90, 0x46},
+ {1, 3, 0x90, 0x46}
+};
+
+const union AnimCmd gSpriteAnim_83EC928[] = {
+ ANIMCMD_FRAME(.imageValue = 0, .duration = 0),
+ ANIMCMD_END
+};
+
+const union AnimCmd *const gSpriteAnimTable_83EC930[] = {
+ gSpriteAnim_83EC928
+};
+
+const struct SpriteFrameImage gSpriteImageTable_83EC934[] = {
+ {.data = gUnknown_02038900.image, .size = sizeof(gUnknown_02038900.image)}
+};
+
+const struct SpriteTemplate gSpriteTemplate_83EC93C = {
+ .tileTag = 0xffff,
+ .paletteTag = 3000,
+ .oam = &gUnknown_020391AC,
+ .anims = gSpriteAnimTable_83EC930,
+ .images = gSpriteImageTable_83EC934,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_81009A8
+};
+
+const struct SpritePalette gUnknown_083EC954 = {.data = (u16 *)&gUnknown_02038900.palette, .tag = 3000};
+
+const struct YesNoFuncTable gUnknown_083EC95C = {.yesFunc = sub_81000C4, .noFunc = sub_810065C};
+const struct YesNoFuncTable gUnknown_083EC964 = {.yesFunc = sub_810026C, .noFunc = sub_810065C};
+const struct YesNoFuncTable gUnknown_083EC96C[] = {
+ {.yesFunc = sub_80FFAB0, .noFunc = sub_80FFB08},
+ {.yesFunc = sub_8100F88, .noFunc = sub_8100FB4}
+};
+
+const u8 gUnknown_083EC97C[] = {4, 4, 4, 4, 0, 3, 3, 0};
+const u8 gUnknown_083EC984[] = {4, 4, 4, 4, 0, 4, 3, 0};
+
+const u16 gUnknown_083EC98C[] = INCBIN_U16("graphics/unknown/83EC98C.gbapal");
+const u16 Unknown_3EC9AC[] = INCBIN_U16("graphics/unknown/83EC9AC.gbapal");
+const struct YesNoFuncTable gUnknown_083EC9CC = {.yesFunc = sub_810153C, .noFunc = sub_8100EEC};
+const struct YesNoFuncTable gUnknown_083EC9D4 = {.yesFunc = sub_8101590, .noFunc = sub_8100EEC};
+const u32 gSpriteImage_83EC9DC[] = INCBIN_U32("graphics/unknown_sprites/83EC9DC.4bpp");
+const struct SpritePalette gUnknown_083ECA5C = {.data = gUnknown_083EC98C, .tag = 8};
+const struct SpritePalette gUnknown_083ECA64 = {.data = Unknown_3EC9AC, .tag = 8};
+const struct OamData gOamData_83ECA6C = {
+ .size = 1, .priority = 1
+};
+
+const union AnimCmd gSpriteAnim_83ECA74[] = {
+ ANIMCMD_FRAME(.imageValue = 0, .duration = 0),
+ ANIMCMD_END
+};
+
+const union AnimCmd *const gSpriteAnimTable_83ECA7C[] = {
+ gSpriteAnim_83ECA74
+};
+
+const struct SpriteFrameImage gSpriteImageTable_83ECA80[] = {
+ obj_frame_tiles(gSpriteImage_83EC9DC)
+};
+
+const struct SpriteTemplate gSpriteTemplate_83ECA88 = {
+ .tileTag = 0xffff,
+ .paletteTag = 8,
+ .oam = &gOamData_83ECA6C,
+ .anims = gSpriteAnimTable_83ECA7C,
+ .images = gSpriteImageTable_83ECA80,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_8101698
+};
+
+const struct YesNoFuncTable gUnknown_083ECAA0 = {.yesFunc = sub_8101848, .noFunc = sub_80FED3C};
+
+u8 *const unref_label_083ECAA8[] = {gSharedMem};
+
void sub_81008BC(struct UnkStruct_02038900 *unk_02038900)
{
u8 i;
@@ -3595,27 +3597,27 @@ void sub_8100930(u8 decoShape)
void sub_81009A8(struct Sprite *sprite)
{
- sprite->data2 = 0;
- sprite->data3 = 0;
- sprite->data4 = 0;
- sprite->data5 = 0;
- sprite->data6 = 0;
- sprite->data7 = 0;
+ sprite->data[2] = 0;
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+ sprite->data[5] = 0;
+ sprite->data[6] = 0;
+ sprite->data[7] = 0;
sprite->callback = sub_81009C0;
}
void sub_81009C0(struct Sprite *sprite)
{
- if (sprite->data7 == 0)
+ if (sprite->data[7] == 0)
{
- if (sprite->data6 < 15)
+ if (sprite->data[6] < 15)
{
sprite->invisible = 0;
} else
{
sprite->invisible = 1;
}
- sprite->data6 = (sprite->data6 + 1) & 0x1f;
+ sprite->data[6] = (sprite->data[6] + 1) & 0x1f;
} else
{
sprite->invisible = 0;
@@ -3645,10 +3647,10 @@ void sub_8100A7C(void)
{
u16 i;
gSpecialVar_0x8005 = 0;
- gScriptResult = 0;
+ gSpecialVar_Result = 0;
if (gSpecialVar_0x8004 == gUnknown_02039234)
{
- gScriptResult = 1;
+ gSpecialVar_Result = 1;
} else if (gDecorations[ewram_1f000.items[gUnknown_020391B4[gSpecialVar_0x8004].decorId]].permission == DECORPERM_SOLID_MAT)
{
gSpecialVar_0x8005 = gUnknown_020391B4[gSpecialVar_0x8004].flagId;
@@ -3759,7 +3761,7 @@ void SetUpPuttingAwayDecorationPlayerAvatar(void)
{
player_get_direction_lower_nybble();
MenuZeroFillWindowRect(0, 0, 29, 19);
- gUnknown_020391A8 = gSprites[gUnknown_03004880.unk4].data0;
+ gUnknown_020391A8 = gSprites[gUnknown_03004880.unk4].data[0];
sub_81016C8();
gUnknown_03004880.unk4 = CreateSprite(&gSpriteTemplate_83ECA88, 0x78, 0x50, 0);
if (gSaveBlock2.playerGender == MALE)
@@ -3809,7 +3811,7 @@ void sub_8100E70(u8 taskId)
void sub_8100EEC(u8 taskId)
{
MenuZeroFillWindowRect(0, 0, 29, 19);
- gSprites[gUnknown_020391A8].data7 = 0;
+ gSprites[gUnknown_020391A8].data[7] = 0;
gSprites[gUnknown_020391A8].invisible = 0;
gSprites[gUnknown_020391A8].callback = sub_8101698;
gSprites[gUnknown_020391A9].pos1.x = 0x88;
@@ -4197,8 +4199,8 @@ void sub_8101678(void)
void sub_8101698(struct Sprite *sprite)
{
- sprite->data0 = (sprite->data0 + 1) & 0x1f;
- if (sprite->data0 >= 16)
+ sprite->data[0] = (sprite->data[0] + 1) & 0x1f;
+ if (sprite->data[0] >= 16)
{
sprite->invisible = TRUE;
} else
diff --git a/src/decoration_inventory.c b/src/field/decoration_inventory.c
index 35ba7e228..dd0e972aa 100644
--- a/src/decoration_inventory.c
+++ b/src/field/decoration_inventory.c
@@ -1,14 +1,11 @@
-//
-// Created by Scott Norton on 6/5/17.
-//
-
#include "global.h"
+#include "constants/decorations.h"
#include "sprite.h"
#include "task.h"
#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..9afb7a16d 100644
--- a/src/dewford_trend.c
+++ b/src/field/dewford_trend.c
@@ -1,14 +1,14 @@
#include "global.h"
#include "dewford_trend.h"
#include "easy_chat.h"
+#include "constants/easy_chat.h"
#include "event_data.h"
#include "link.h"
-#include "rng.h"
+#include "random.h"
#include "text.h"
+#include "ewram.h"
-extern u8 unk_2000000[];
-
-extern u16 gScriptResult;
+extern u16 gSpecialVar_Result;
extern u16 gSpecialVar_0x8004;
static void sub_80FA46C(struct EasyChatPair *s, u16 b, u8 c);
@@ -101,10 +101,10 @@ bool8 sub_80FA364(u16 *a)
if (!SB1ContainsWords(a))
{
- if (!FlagGet(SYS_POPWORD_INPUT))
+ if (!FlagGet(FLAG_SYS_POPWORD_INPUT))
{
- FlagSet(SYS_POPWORD_INPUT);
- if (!FlagGet(SYS_MIX_RECORD))
+ FlagSet(FLAG_SYS_POPWORD_INPUT);
+ if (!FlagGet(FLAG_SYS_MIX_RECORD))
{
gSaveBlock1.easyChatPairs[0].words[0] = a[0];
gSaveBlock1.easyChatPairs[0].words[1] = a[1];
@@ -202,14 +202,14 @@ void sub_80FA4E4(void *a, u32 b, u8 unused)
*(dst++) = *(src++);
}
-void sub_80FA5BC(void)
+void BufferTrendyPhraseString(void)
{
struct EasyChatPair *s = &gSaveBlock1.easyChatPairs[gSpecialVar_0x8004];
ConvertEasyChatWordsToString(gStringVar1, s->words, 2, 1);
}
-void sub_80FA5E4(void)
+void TrendyPhraseIsOld(void)
{
u16 result = 0;
@@ -219,12 +219,12 @@ void sub_80FA5E4(void)
if (!gSaveBlock1.easyChatPairs[0].unk1_6 && gSaveBlock1.easyChatPairs[1].unk1_6)
result = 1;
}
- gScriptResult = result;
+ gSpecialVar_Result = result;
}
-void sub_80FA648(void)
+void GetDewfordHallPaintingNameIndex(void)
{
- gScriptResult = (gSaveBlock1.easyChatPairs[0].words[0] + gSaveBlock1.easyChatPairs[0].words[1]) & 7;
+ gSpecialVar_Result = (gSaveBlock1.easyChatPairs[0].words[0] + gSaveBlock1.easyChatPairs[0].words[1]) & 7;
}
static bool8 sub_80FA670(struct EasyChatPair *a, struct EasyChatPair *b, u8 c)
diff --git a/src/diploma.c b/src/field/diploma.c
index ba7de58aa..27601404c 100644
--- a/src/diploma.c
+++ b/src/field/diploma.c
@@ -4,7 +4,7 @@
#include "menu.h"
#include "palette.h"
#include "pokedex.h"
-#include "rom4.h"
+#include "overworld.h"
#include "sprite.h"
#include "string_util.h"
#include "strings2.h"
@@ -35,7 +35,7 @@ static void VBlankCB(void)
TransferPlttBuffer();
}
-void sub_8145D88(void)
+void CB2_ShowDiploma(void)
{
u32 savedIme;
diff --git a/src/event_data.c b/src/field/event_data.c
index 0484bae02..9d6d2372b 100644
--- a/src/event_data.c
+++ b/src/field/event_data.c
@@ -3,7 +3,7 @@
#include "pokedex.h"
#define TEMP_FLAGS_SIZE 0x4
-#define TEMP_UPPER_FLAGS_SIZE 0x8
+#define DAILY_FLAGS_SIZE 0x8
#define TEMP_VARS_SIZE 0x20
EWRAM_DATA u16 gSpecialVar_0x8000 = 0;
@@ -18,9 +18,9 @@ EWRAM_DATA u16 gSpecialVar_0x8008 = 0;
EWRAM_DATA u16 gSpecialVar_0x8009 = 0;
EWRAM_DATA u16 gSpecialVar_0x800A = 0;
EWRAM_DATA u16 gSpecialVar_0x800B = 0;
-EWRAM_DATA u16 gScriptResult = 0;
-EWRAM_DATA u16 gScriptLastTalked = 0;
-EWRAM_DATA u16 gScriptFacing = 0;
+EWRAM_DATA u16 gSpecialVar_Result = 0;
+EWRAM_DATA u16 gSpecialVar_LastTalked = 0;
+EWRAM_DATA u16 gSpecialVar_Facing = 0;
EWRAM_DATA u8 gUnknown_0202E8E2[16] = {0};
extern u16 *gSpecialVars[];
@@ -36,16 +36,16 @@ void ClearTempFieldEventData(void)
{
memset(gSaveBlock1.flags, 0, TEMP_FLAGS_SIZE);
memset(gSaveBlock1.vars, 0, TEMP_VARS_SIZE);
- FlagReset(SYS_ENC_UP_ITEM);
- FlagReset(SYS_ENC_DOWN_ITEM);
- FlagReset(SYS_USE_STRENGTH);
- FlagReset(SYS_CTRL_OBJ_DELETE);
+ FlagClear(FLAG_SYS_ENC_UP_ITEM);
+ FlagClear(FLAG_SYS_ENC_DOWN_ITEM);
+ FlagClear(FLAG_SYS_USE_STRENGTH);
+ FlagClear(FLAG_SYS_CTRL_OBJ_DELETE);
}
// probably had different flag splits at one point.
-void ClearUpperFlags(void)
+void ClearDailyFlags(void)
{
- memset(gSaveBlock1.flags + 0x118, 0, TEMP_UPPER_FLAGS_SIZE);
+ memset(gSaveBlock1.flags + (DAILY_FLAGS_START / 8), 0, DAILY_FLAGS_SIZE);
}
void DisableNationalPokedex(void)
@@ -53,7 +53,7 @@ void DisableNationalPokedex(void)
u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX);
gSaveBlock2.pokedex.nationalMagic = 0;
*nationalDexVar = 0;
- FlagReset(SYS_NATIONAL_DEX);
+ FlagClear(FLAG_SYS_NATIONAL_DEX);
}
void EnableNationalPokedex(void)
@@ -61,7 +61,7 @@ void EnableNationalPokedex(void)
u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX);
gSaveBlock2.pokedex.nationalMagic = 0xDA;
*nationalDexVar = 0x302;
- FlagSet(SYS_NATIONAL_DEX);
+ FlagSet(FLAG_SYS_NATIONAL_DEX);
gSaveBlock2.pokedex.unknown1 = 1;
gSaveBlock2.pokedex.order = 0;
sub_808C0A0();
@@ -69,7 +69,7 @@ void EnableNationalPokedex(void)
bool32 IsNationalPokedexEnabled(void)
{
- if (gSaveBlock2.pokedex.nationalMagic == 0xDA && VarGet(VAR_NATIONAL_DEX) == 0x302 && FlagGet(SYS_NATIONAL_DEX))
+ if (gSaveBlock2.pokedex.nationalMagic == 0xDA && VarGet(VAR_NATIONAL_DEX) == 0x302 && FlagGet(FLAG_SYS_NATIONAL_DEX))
return TRUE;
else
return FALSE;
@@ -77,34 +77,34 @@ bool32 IsNationalPokedexEnabled(void)
void DisableMysteryGift(void)
{
- FlagReset(SYS_EXDATA_ENABLE);
+ FlagClear(FLAG_SYS_EXDATA_ENABLE);
}
void EnableMysteryGift(void)
{
- FlagSet(SYS_EXDATA_ENABLE);
+ FlagSet(FLAG_SYS_EXDATA_ENABLE);
}
bool32 IsMysteryGiftEnabled(void)
{
- return FlagGet(SYS_EXDATA_ENABLE);
+ return FlagGet(FLAG_SYS_EXDATA_ENABLE);
}
void DisableResetRTC(void)
{
VarSet(VAR_RESET_RTC_ENABLE, 0);
- FlagReset(SYS_RESET_RTC_ENABLE);
+ FlagClear(FLAG_SYS_RESET_RTC_ENABLE);
}
void EnableResetRTC(void)
{
VarSet(VAR_RESET_RTC_ENABLE, 0x920);
- FlagSet(SYS_RESET_RTC_ENABLE);
+ FlagSet(FLAG_SYS_RESET_RTC_ENABLE);
}
bool32 CanResetRTC(void)
{
- if (FlagGet(SYS_RESET_RTC_ENABLE) && VarGet(VAR_RESET_RTC_ENABLE) == 0x920)
+ if (FlagGet(FLAG_SYS_RESET_RTC_ENABLE) && VarGet(VAR_RESET_RTC_ENABLE) == 0x920)
return TRUE;
else
return FALSE;
@@ -112,12 +112,10 @@ bool32 CanResetRTC(void)
u16 *GetVarPointer(u16 id)
{
- if (id < 0x4000)
+ if (id < VARS_START)
return NULL;
-
- if ((s16)id >= 0)
- return &gSaveBlock1.vars[id - 0x4000];
-
+ if (id < 0x8000)
+ return &gSaveBlock1.vars[id - VARS_START];
return gSpecialVars[id - 0x8000];
}
@@ -140,7 +138,7 @@ bool8 VarSet(u16 id, u16 value)
u8 VarGetFieldObjectGraphicsId(u8 id)
{
- return VarGet(0x4010 + id);
+ return VarGet(VAR_OBJ_GFX_ID_0 + id);
}
u8 *GetFlagPointer(u16 id)
@@ -162,7 +160,7 @@ u8 FlagSet(u16 id)
return 0;
}
-u8 FlagReset(u16 id)
+u8 FlagClear(u16 id)
{
u8 *ptr = GetFlagPointer(id);
if (ptr)
diff --git a/src/field_camera.c b/src/field/field_camera.c
index db51cf054..8384ad8d1 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
{
@@ -322,8 +322,8 @@ static void CameraUpdateCallback(struct CameraSomething *a)
{
if (a->unk4 != 0)
{
- a->unk8 = gSprites[a->unk4].data2;
- a->unkC = gSprites[a->unk4].data3;
+ a->unk8 = gSprites[a->unk4].data[2];
+ a->unkC = gSprites[a->unk4].data[3];
}
}
@@ -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 a8f6b6b9b..52e66f16e 100644
--- a/src/field_control_avatar.c
+++ b/src/field/field_control_avatar.c
@@ -10,18 +10,18 @@
#include "field_poison.h"
#include "field_specials.h"
#include "fieldmap.h"
-#include "flags.h"
+#include "constants/flags.h"
#include "item_menu.h"
#include "metatile_behavior.h"
-#include "rom4.h"
+#include "overworld.h"
#include "safari_zone.h"
#include "script.h"
#include "secret_base.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "start_menu.h"
#include "trainer_see.h"
-#include "vars.h"
+#include "constants/vars.h"
#include "wild_encounter.h"
struct Coords32
@@ -30,8 +30,8 @@ struct Coords32
s32 y;
};
-extern u16 gScriptLastTalked;
-extern u16 gScriptFacing;
+extern u16 gSpecialVar_LastTalked;
+extern u16 gSpecialVar_Facing;
extern struct LinkPlayerMapObject gLinkPlayerMapObjects[];
extern u16 gSpecialVar_0x8004;
extern u16 gSpecialVar_0x8005;
@@ -57,7 +57,7 @@ extern u8 gUnknown_081A4363[];
extern u8 gUnknown_081C346A[];
extern u8 gUnknown_081616E1[];
extern u8 Event_WorldMap[];
-extern u8 Event_RunningShoesManual[];
+extern u8 S_RunningShoesManual[];
extern u8 PictureBookShelfScript[];
extern u8 BookshelfScript[];
extern u8 PokemonCenterBookshelfScript[];
@@ -70,13 +70,13 @@ extern u8 gUnknown_0815F43A[];
extern u8 gUnknown_0815F523[];
extern u8 gUnknown_0815F528[];
extern u8 UseSurfScript[];
-extern u8 UseWaterfallScript[];
-extern u8 CannotUseWaterfallScript[];
+extern u8 S_UseWaterfall[];
+extern u8 S_CannotUseWaterfall[];
extern u8 UseDiveScript[];
-extern u8 UnderwaterUseDiveScript[];
-extern u8 GraniteCave_B1F_EventScript_1C6BC5[];
+extern u8 S_UseDiveUnderwater[];
+extern u8 S_FallDownHole[];
extern u8 gUnknown_081A14B8[];
-extern u8 Event_EggHatch[];
+extern u8 S_EggHatch[];
extern u8 gUnknown_0815FD0D[];
extern u8 gUnknown_081C6BDE[];
@@ -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)
@@ -295,8 +295,8 @@ u8 *sub_80682A8(struct MapPosition *position, u8 unused, u8 c)
return NULL;
}
gSelectedMapObject = r3;
- gScriptLastTalked = gMapObjects[r3].localId;
- gScriptFacing = c;
+ gSpecialVar_LastTalked = gMapObjects[r3].localId;
+ gSpecialVar_Facing = c;
return GetFieldObjectScriptPointerByFieldObjectId(r3);
}
@@ -316,10 +316,10 @@ static u8 *sub_8068364(struct MapPosition *position, u8 b, u8 c)
}
//_080683E8
gSelectedMapObject = r3;
- gScriptLastTalked = gMapObjects[r3].localId;
- gScriptFacing = c;
+ gSpecialVar_LastTalked = gMapObjects[r3].localId;
+ gSpecialVar_Facing = c;
script = GetFieldObjectScriptPointerByFieldObjectId(r3);
- script = GetRamScript(gScriptLastTalked, script);
+ script = GetRamScript(gSpecialVar_LastTalked, script);
return script;
}
@@ -355,7 +355,7 @@ static u8 *TryGetInvisibleMapObjectScript(struct MapPosition *position, u8 unuse
case 5:
case 6:
case 7:
- gSpecialVar_0x8004 = ((u32)bgEvent->bgUnion.script >> 16) + 0x258;
+ gSpecialVar_0x8004 = ((u32)bgEvent->bgUnion.script >> 16) + FLAG_HIDDEN_ITEMS_START;
gSpecialVar_0x8005 = (u32)bgEvent->bgUnion.script;
if (FlagGet(gSpecialVar_0x8004) == TRUE)
return NULL;
@@ -363,7 +363,7 @@ static u8 *TryGetInvisibleMapObjectScript(struct MapPosition *position, u8 unuse
case 8:
if (c == 2)
{
- gSpecialVar_0x8004 = (u32)bgEvent->bgUnion.script;
+ gSpecialVar_0x8004 = bgEvent->bgUnion.secretBaseId;
if (sub_80BC050())
return gUnknown_081A2C51;
}
@@ -391,7 +391,7 @@ static u8 *sub_8068500(struct MapPosition *position, u8 b, u8 c)
if (MetatileBehavior_IsRegionMap(b) == TRUE)
return Event_WorldMap;
if (sub_805791C(b) == TRUE)
- return Event_RunningShoesManual;
+ return S_RunningShoesManual;
if (MetatileBehavior_IsPictureBookShelf(b) == TRUE)
return PictureBookShelfScript;
if (MetatileBehavior_IsBookShelf(b) == TRUE)
@@ -423,21 +423,21 @@ static u8 *sub_8068500(struct MapPosition *position, u8 b, u8 c)
static u8 *TryGetFieldMoveScript(struct MapPosition *unused1, u8 b, u8 unused2)
{
- if (FlagGet(BADGE05_GET) == TRUE && PartyHasMonWithSurf() == TRUE && IsPlayerFacingSurfableFishableWater() == TRUE)
+ if (FlagGet(FLAG_BADGE05_GET) == TRUE && PartyHasMonWithSurf() == TRUE && IsPlayerFacingSurfableFishableWater() == TRUE)
return UseSurfScript;
if (MetatileBehavior_IsWaterfall(b) == TRUE)
{
- if (FlagGet(BADGE08_GET) == TRUE && IsPlayerSurfingNorth() == TRUE)
- return UseWaterfallScript;
+ if (FlagGet(FLAG_BADGE08_GET) == TRUE && IsPlayerSurfingNorth() == TRUE)
+ return S_UseWaterfall;
else
- return CannotUseWaterfallScript;
+ return S_CannotUseWaterfall;
}
return NULL;
}
static bool32 sub_8068770(void)
{
- if (FlagGet(BADGE07_GET) && sub_8068F18() == 2)
+ if (FlagGet(FLAG_BADGE07_GET) && sub_8068F18() == 2)
{
ScriptContext1_SetupScript(UseDiveScript);
return TRUE;
@@ -447,9 +447,9 @@ static bool32 sub_8068770(void)
static bool32 sub_80687A4(void)
{
- if (FlagGet(BADGE07_GET) && gMapHeader.mapType == 5 && sub_8068F18() == 1)
+ if (FlagGet(FLAG_BADGE07_GET) && gMapHeader.mapType == MAP_TYPE_UNDERWATER && sub_8068F18() == 1)
{
- ScriptContext1_SetupScript(UnderwaterUseDiveScript);
+ ScriptContext1_SetupScript(S_UseDiveUnderwater);
return TRUE;
}
return FALSE;
@@ -485,7 +485,7 @@ bool8 sub_8068870(u16 a)
{
if (MetatileBehavior_IsCrackedFloorHole(a))
{
- ScriptContext1_SetupScript(GraniteCave_B1F_EventScript_1C6BC5);
+ ScriptContext1_SetupScript(S_FallDownHole);
return TRUE;
}
return FALSE;
@@ -493,17 +493,17 @@ bool8 sub_8068870(u16 a)
bool8 sub_8068894(void)
{
- sub_8082B78();
+ IncrementRematchStepCounter();
happiness_algorithm_step();
if (overworld_poison_step() == TRUE)
{
ScriptContext1_SetupScript(gUnknown_081A14B8);
return TRUE;
}
- if (sub_80422A0())
+ if (ShouldEggHatch())
{
- IncrementGameStat(13);
- ScriptContext1_SetupScript(Event_EggHatch);
+ IncrementGameStat(GAME_STAT_HATCHED_EGGS);
+ ScriptContext1_SetupScript(S_EggHatch);
return TRUE;
}
if (SafariZoneTakeStep() == TRUE)
@@ -549,14 +549,14 @@ static bool8 overworld_poison_step(void)
{
u16 *ptr;
- if (gMapHeader.mapType != 9)
+ if (gMapHeader.mapType != MAP_TYPE_SECRET_BASE)
{
ptr = GetVarPointer(VAR_POISON_STEP_COUNTER);
(*ptr)++;
(*ptr) %= 4;
if (*ptr == 0)
{
- switch (overworld_poison())
+ switch (DoPoisonFieldEffect())
{
case 0:
return FALSE;
@@ -698,7 +698,7 @@ static void sub_8068C30(struct MapHeader *unused, s8 b, struct MapPosition *posi
warp1_set_2(warpEvent->unk7, warpEvent->mapNum, warpEvent->mapGroup);
sub_80535C4(position->x, position->y);
- mapHeader = get_mapheader_by_bank_and_number(warpEvent->unk7, warpEvent->mapNum);
+ mapHeader = Overworld_GetMapHeaderByGroupAndId(warpEvent->unk7, warpEvent->mapNum);
if (mapHeader->events->warps[warpEvent->mapGroup].mapNum == 0x7F)
saved_warp2_set(mapHeader->events->warps[b].mapGroup, gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, b);
}
@@ -730,7 +730,7 @@ static bool8 map_warp_consider_2_to_inside(struct MapPosition *position, u16 b,
return FALSE;
}
-static s8 map_warp_check(struct MapHeader *mapHeader, u16 b, u16 c, u8 d)
+static s8 map_warp_check(struct MapHeader *mapHeader, u16 x, u16 y, u8 warpId)
{
s32 i;
struct WarpEvent *warpEvent = mapHeader->events->warps;
@@ -738,9 +738,9 @@ static s8 map_warp_check(struct MapHeader *mapHeader, u16 b, u16 c, u8 d)
for (i = 0; i < warpCount; i++, warpEvent++)
{
- if ((u16)warpEvent->x == b && (u16)warpEvent->y == c)
+ if ((u16)warpEvent->x == x && (u16)warpEvent->y == y)
{
- if ((u8)warpEvent->warpId == d || (u8)warpEvent->warpId == 0)
+ if ((u8)warpEvent->warpId == warpId || (u8)warpEvent->warpId == 0)
return i;
}
}
@@ -767,7 +767,7 @@ static u8 *trigger_activate(struct CoordEvent *coordEvent)
return NULL;
}
-static u8 *mapheader_trigger_activate_at(struct MapHeader *mapHeader, u16 b, u16 c, u8 d)
+static u8 *mapheader_trigger_activate_at(struct MapHeader *mapHeader, u16 x, u16 y, u8 d)
{
s32 i;
struct CoordEvent *coordEvents = mapHeader->events->coordEvents;
@@ -776,7 +776,7 @@ static u8 *mapheader_trigger_activate_at(struct MapHeader *mapHeader, u16 b, u16
for (i = 0; i < coordEventCount; i++)
{
- if ((u16)coordEvents[i].x == b && (u16)coordEvents[i].y == c)
+ if ((u16)coordEvents[i].x == x && (u16)coordEvents[i].y == y)
{
if (coordEvents[i].unk4 == d || coordEvents[i].unk4 == 0)
{
@@ -813,7 +813,7 @@ static struct BgEvent *FindInvisibleMapObjectByPosition(struct MapHeader *mapHea
int dive_warp(struct MapPosition *position, u16 b)
{
- if (gMapHeader.mapType == 5 && sub_805750C(b) == 0)
+ if (gMapHeader.mapType == MAP_TYPE_UNDERWATER && sub_805750C(b) == 0)
{
if (sub_80538B0(position->x - 7, position->y - 7))
{
@@ -843,7 +843,7 @@ u8 sub_8068F18(void)
PlayerGetDestCoords(&x, &y);
r5 = MapGridGetMetatileBehaviorAt(x, y);
- if (gMapHeader.mapType == 5 && sub_805750C(r5) == 0)
+ if (gMapHeader.mapType == MAP_TYPE_UNDERWATER && sub_805750C(r5) == 0)
{
if (sub_80538B0(x - 7, y - 7) == TRUE)
return 1;
@@ -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/field_door.c b/src/field/field_door.c
new file mode 100644
index 000000000..89dae725c
--- /dev/null
+++ b/src/field/field_door.c
@@ -0,0 +1,603 @@
+#include "global.h"
+#include "field_door.h"
+#include "field_camera.h"
+#include "fieldmap.h"
+#include "metatile_behavior.h"
+#include "constants/songs.h"
+#include "task.h"
+
+const u8 DoorAnimTiles_04[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/04/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/04/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/04/2.4bpp"),
+};
+
+// TODO: Make these blank palette includes?
+asm(".space 32");
+
+const u8 DoorAnimTiles_05[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/05/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/05/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/05/2.4bpp"),
+};
+
+const u8 DoorAnimTiles_08[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/08/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/08/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/08/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_15[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/15/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/15/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/15/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_16[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/16/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/16/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/16/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_00[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/00/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/00/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/00/2.4bpp"),
+};
+
+const u8 DoorAnimTiles_01[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/01/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/01/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/01/2.4bpp"),
+};
+
+const u8 DoorAnimTiles_02[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/02/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/02/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/02/2.4bpp"),
+};
+
+const u8 DoorAnimTiles_03[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/03/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/03/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/03/2.4bpp"),
+};
+
+const u8 DoorAnimTiles_06[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/06/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/06/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/06/2.4bpp"),
+};
+
+const u8 DoorAnimTiles_07[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/07/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/07/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/07/2.4bpp"),
+};
+
+const u8 DoorAnimTiles_09[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/09/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/09/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/09/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_10[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/10/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/10/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/10/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_11[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/11/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/11/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/11/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_12[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/12/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/12/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/12/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_13[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/13/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/13/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/13/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_14[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/14/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/14/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/14/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_17[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/17/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/17/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/17/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_18[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/18/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/18/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/18/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_19[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/19/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/19/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/19/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_20[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/20/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/20/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/20/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_21[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/21/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/21/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/21/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_22[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/22/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/22/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/22/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_23[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/23/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/23/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/23/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_24[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/24/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/24/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/24/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_25[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/25/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/25/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/25/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_26[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/26/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/26/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/26/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_27[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/27/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/27/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/27/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_28[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/28/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/28/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/28/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_29[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/29/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/29/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/29/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_30[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/30/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/30/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/30/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_31[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/31/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/31/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/31/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_32[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/32/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/32/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/32/2.4bpp"),
+};
+
+asm(".space 32");
+
+const u8 DoorAnimTiles_33[][0x100] =
+{
+ INCBIN_U8("graphics/door_anims/33/0.4bpp"),
+ INCBIN_U8("graphics/door_anims/33/1.4bpp"),
+ INCBIN_U8("graphics/door_anims/33/2.4bpp"),
+};
+
+asm(".space 32");
+
+static const struct DoorAnimFrame gDoorOpenAnimFrames[] =
+{
+ {4, -1},
+ {4, 0},
+ {4, 0x100},
+ {4, 0x200},
+ {0, 0},
+};
+
+static const struct DoorAnimFrame gDoorCloseAnimFrames[] =
+{
+ {4, 0x200},
+ {4, 0x100},
+ {4, 0},
+ {4, -1},
+ {0, 0},
+};
+
+const u8 DoorAnimPalettes_830F8A4[] = {1, 1, 1, 1, 1, 1, 1, 1}; // door 00
+const u8 DoorAnimPalettes_830F8AC[] = {1, 1, 1, 1, 1, 1, 1, 1}; // door 01
+const u8 DoorAnimPalettes_830F8B4[] = {5, 5, 5, 5, 5, 5, 5, 5}; // door 02
+const u8 DoorAnimPalettes_830F8BC[] = {0, 0, 1, 1, 1, 1, 1, 1}; // door 03
+const u8 DoorAnimPalettes_830F8C4[] = {6, 6, 6, 6, 6, 6, 6, 6}; // door 04
+const u8 DoorAnimPalettes_830F8CC[] = {8, 8, 8, 8, 8, 8, 8, 8}; // door 05
+const u8 DoorAnimPalettes_830F8D4[] = {11, 11, 11, 11, 11, 11, 11, 11}; // door 06
+const u8 DoorAnimPalettes_830F8DC[] = {10, 10, 10, 10, 10, 10, 10, 10}; // door 07
+const u8 DoorAnimPalettes_830F8E4[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 08
+const u8 DoorAnimPalettes_830F8EC[] = {8, 8, 8, 8, 8, 8, 8, 8}; // door 09
+const u8 DoorAnimPalettes_830F8F4[] = {9, 9, 9, 9, 9, 9, 9, 9}; // door 10
+const u8 DoorAnimPalettes_830F8FC[] = {9, 9, 1, 1, 1, 1, 1, 1}; // door 11
+const u8 DoorAnimPalettes_830F904[] = {8, 8, 8, 8, 8, 8, 8, 8}; // door 12
+const u8 DoorAnimPalettes_830F90C[] = {9, 9, 9, 9, 9, 9, 9, 9}; // door 13
+const u8 DoorAnimPalettes_830F914[] = {6, 6, 6, 6, 6, 6, 6, 6}; // door 14
+const u8 DoorAnimPalettes_830F91C[] = {6, 6, 6, 6, 6, 6, 6, 6}; // door 15
+const u8 DoorAnimPalettes_830F924[] = {0, 0, 5, 5, 5, 5, 5, 5}; // door 16
+const u8 DoorAnimPalettes_830F92C[] = {6, 6, 1, 1, 1, 1, 1, 1}; // door 17
+const u8 DoorAnimPalettes_830F934[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 18
+const u8 DoorAnimPalettes_830F93C[] = {6, 6, 5, 5, 5, 5, 5, 5}; // door 19
+const u8 DoorAnimPalettes_830F944[] = {5, 5, 5, 5, 5, 5, 5, 5}; // door 20
+const u8 DoorAnimPalettes_830F94C[] = {1, 1, 1, 1, 1, 1, 1, 1}; // door 21
+const u8 DoorAnimPalettes_830F954[] = {6, 6, 7, 7, 7, 7, 7, 7}; // door 22
+const u8 DoorAnimPalettes_830F95C[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 23
+const u8 DoorAnimPalettes_830F964[] = {5, 5, 5, 5, 5, 5, 5, 5}; // door 24
+const u8 DoorAnimPalettes_830F96C[] = {9, 9, 9, 9, 9, 9, 9, 9}; // door 25
+const u8 DoorAnimPalettes_830F974[] = {8, 8, 8, 8, 8, 8, 8, 8}; // door 26
+const u8 DoorAnimPalettes_830F97C[] = {6, 6, 6, 6, 6, 6, 6, 6}; // door 27
+const u8 DoorAnimPalettes_830F984[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 28
+const u8 DoorAnimPalettes_830F98C[] = {11, 11, 7, 7, 7, 7, 7, 7}; // door 29
+const u8 DoorAnimPalettes_830F994[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 30
+const u8 DoorAnimPalettes_830F99C[] = {6, 6, 7, 7, 7, 7, 7, 7}; // door 31
+const u8 DoorAnimPalettes_830F9A4[] = {9, 9, 9, 9, 9, 9, 9, 9}; // door 32
+const u8 DoorAnimPalettes_830F9AC[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 33
+
+static const struct DoorGraphics gDoorAnimGraphicsTable[] =
+{
+ {0x021, 0, DoorAnimTiles_00, DoorAnimPalettes_830F8A4}, // door 00
+ {0x061, 1, DoorAnimTiles_01, DoorAnimPalettes_830F8AC}, // door 01
+ {0x1CD, 1, DoorAnimTiles_02, DoorAnimPalettes_830F8B4}, // door 02
+ {0x041, 1, DoorAnimTiles_03, DoorAnimPalettes_830F8BC}, // door 03
+ {0x248, 0, DoorAnimTiles_04, DoorAnimPalettes_830F8C4}, // door 04
+ {0x249, 0, DoorAnimTiles_05, DoorAnimPalettes_830F8CC}, // door 05
+ {0x22F, 0, DoorAnimTiles_06, DoorAnimPalettes_830F8D4}, // door 06
+ {0x21F, 0, DoorAnimTiles_07, DoorAnimPalettes_830F8DC}, // door 07
+ {0x2A5, 0, DoorAnimTiles_08, DoorAnimPalettes_830F8E4}, // door 08
+ {0x287, 0, DoorAnimTiles_09, DoorAnimPalettes_830F8F4}, // door 09
+ {0x2AC, 0, DoorAnimTiles_10, DoorAnimPalettes_830F934}, // door 10
+ {0x3A1, 0, DoorAnimTiles_11, DoorAnimPalettes_830F93C}, // door 11
+ {0x2DC, 0, DoorAnimTiles_12, DoorAnimPalettes_830F92C}, // door 12
+ {0x225, 0, DoorAnimTiles_13, DoorAnimPalettes_830F924}, // door 13
+ {0x1DB, 1, DoorAnimTiles_14, DoorAnimPalettes_830F94C}, // door 14
+ {0x246, 0, DoorAnimTiles_15, DoorAnimPalettes_830F8EC}, // door 15
+ {0x28E, 0, DoorAnimTiles_16, DoorAnimPalettes_830F944}, // door 16
+ {0x2A1, 0, DoorAnimTiles_17, DoorAnimPalettes_830F8FC}, // door 17
+ {0x21C, 0, DoorAnimTiles_18, DoorAnimPalettes_830F914}, // door 18
+ {0x21E, 0, DoorAnimTiles_19, DoorAnimPalettes_830F91C}, // door 19
+ {0x21D, 1, DoorAnimTiles_20, DoorAnimPalettes_830F904}, // door 20
+ {0x21A, 0, DoorAnimTiles_21, DoorAnimPalettes_830F90C}, // door 21
+ {0x224, 0, DoorAnimTiles_22, DoorAnimPalettes_830F954}, // door 22
+ {0x289, 0, DoorAnimTiles_23, DoorAnimPalettes_830F95C}, // door 23
+ {0x30C, 1, DoorAnimTiles_24, DoorAnimPalettes_830F964}, // door 24
+ {0x32D, 1, DoorAnimTiles_25, DoorAnimPalettes_830F96C}, // door 25
+ {0x2ED, 1, DoorAnimTiles_26, DoorAnimPalettes_830F974}, // door 26
+ {0x264, 1, DoorAnimTiles_27, DoorAnimPalettes_830F97C}, // door 27
+ {0x22B, 0, DoorAnimTiles_28, DoorAnimPalettes_830F984}, // door 28
+ {0x2F7, 0, DoorAnimTiles_29, DoorAnimPalettes_830F98C}, // door 29
+ {0x297, 0, DoorAnimTiles_30, DoorAnimPalettes_830F994}, // door 30
+ {0x285, 1, DoorAnimTiles_31, DoorAnimPalettes_830F99C}, // door 31
+ {0x25D, 1, DoorAnimTiles_32, DoorAnimPalettes_830F9A4}, // door 32
+ {0x20E, 1, DoorAnimTiles_33, DoorAnimPalettes_830F9AC}, // door 33
+ {0, 0, NULL, NULL},
+};
+
+static void CopyDoorTilesToVram(const void *src)
+{
+ CpuFastSet(src, (void *)(VRAM + 0x7F00), 0x40);
+}
+
+static void door_build_blockdef(u16 *a, u16 b, const u8 *c)
+{
+ int i;
+ u16 unk;
+
+ for (i = 0; i < 4; i++)
+ {
+ unk = *(c++) << 12;
+ a[i] = unk | (b + i);
+ }
+ for (; i < 8; i++)
+ {
+ unk = *(c++) << 12;
+ a[i] = unk;
+ }
+}
+
+static void DrawCurrentDoorAnimFrame(u32 x, u32 y, const u8 *c)
+{
+ u16 arr[8];
+
+ door_build_blockdef(arr, 0x3F8, c);
+ DrawDoorMetatileAt(x, y - 1, arr);
+ door_build_blockdef(arr, 0x3FC, c + 4);
+ DrawDoorMetatileAt(x, y, arr);
+}
+
+static void DrawClosedDoorTiles(u32 x, u32 y)
+{
+ CurrentMapDrawMetatileAt(x, y - 1);
+ CurrentMapDrawMetatileAt(x, y);
+}
+
+static void DrawDoor(const struct DoorGraphics *gfx, const struct DoorAnimFrame *frame, u32 x, u32 y)
+{
+ if (frame->offset == 0xFFFF)
+ DrawClosedDoorTiles(x, y);
+ else
+ {
+ CopyDoorTilesToVram(gfx->tiles + frame->offset);
+ DrawCurrentDoorAnimFrame(x, y, gfx->palette);
+ }
+}
+
+enum
+{
+ TD_FRAMELIST = 0,
+ TD_GFX = 2,
+ TD_FRAME = 4,
+ TD_COUNTER,
+ TD_X,
+ TD_Y
+};
+
+static bool32 sub_8058464(struct DoorGraphics *gfx, struct DoorAnimFrame *frames, s16 *taskData)
+{
+ if (taskData[TD_COUNTER] == 0)
+ DrawDoor(gfx, &frames[taskData[TD_FRAME]], taskData[TD_X], taskData[TD_Y]);
+ if (taskData[TD_COUNTER] == frames[taskData[TD_FRAME]].time)
+ {
+ taskData[TD_COUNTER] = 0;
+ taskData[TD_FRAME]++;
+ if (frames[taskData[TD_FRAME]].time == 0)
+ return FALSE;
+ else
+ return TRUE;
+ }
+ taskData[TD_COUNTER]++;
+ return TRUE;
+}
+
+static void Task_AnimateDoor(u8 taskId)
+{
+ u16 *taskData = gTasks[taskId].data;
+ struct DoorAnimFrame *frames = (struct DoorAnimFrame *)(taskData[TD_FRAMELIST] << 16 | taskData[TD_FRAMELIST + 1]);
+ struct DoorGraphics *gfx = (struct DoorGraphics *)(taskData[TD_GFX] << 16 | taskData[TD_GFX + 1]);
+
+ if (sub_8058464(gfx, frames, taskData) == FALSE)
+ DestroyTask(taskId);
+}
+
+static const struct DoorAnimFrame *GetLastDoorFrame(const struct DoorAnimFrame *frame, const void *unused)
+{
+ while (frame->time != 0)
+ frame++;
+ return frame - 1;
+}
+
+static const struct DoorGraphics *GetDoorGraphics(const struct DoorGraphics *gfx, u16 metatileNum)
+{
+ while (gfx->tiles != NULL)
+ {
+ if (gfx->metatileNum == metatileNum)
+ return gfx;
+ gfx++;
+ }
+ return NULL;
+}
+
+static s8 StartDoorAnimationTask(const struct DoorGraphics *gfx, const struct DoorAnimFrame *frames, u32 x, u32 y)
+{
+ if (FuncIsActiveTask(Task_AnimateDoor) == TRUE)
+ return -1;
+ else
+ {
+ u8 taskId = CreateTask(Task_AnimateDoor, 0x50);
+ s16 *taskData = gTasks[taskId].data;
+
+ taskData[TD_X] = x;
+ taskData[TD_Y] = y;
+
+ taskData[TD_FRAMELIST + 1] = (u32)frames;
+ taskData[TD_FRAMELIST] = (u32)frames >> 16;
+
+ taskData[TD_GFX + 1] = (u32)gfx;
+ taskData[TD_GFX] = (u32)gfx >> 16;
+
+ return taskId;
+ }
+}
+
+static void DrawClosedDoor(const struct DoorGraphics *unused, u32 x, u32 y)
+{
+ DrawClosedDoorTiles(x, y);
+}
+
+static void DrawOpenedDoor(const struct DoorGraphics *gfx, u32 x, u32 y)
+{
+ gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y));
+ if (gfx != NULL)
+ DrawDoor(gfx, GetLastDoorFrame(gDoorOpenAnimFrames, gDoorOpenAnimFrames), x, y);
+}
+
+static s8 StartDoorOpenAnimation(const struct DoorGraphics *gfx, u32 x, u32 y)
+{
+ gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y));
+ if (gfx == NULL)
+ return -1;
+ else
+ return StartDoorAnimationTask(gfx, gDoorOpenAnimFrames, x, y);
+}
+
+static s8 StartDoorCloseAnimation(const struct DoorGraphics *gfx, u32 x, u32 y)
+{
+ gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y));
+ if (gfx == NULL)
+ return -1;
+ else
+ return StartDoorAnimationTask(gfx, gDoorCloseAnimFrames, x, y);
+}
+
+static s8 cur_mapdata_get_door_x2_at(const struct DoorGraphics *gfx, u32 x, u32 y)
+{
+ gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y));
+ if (gfx == NULL)
+ return -1;
+ else
+ return gfx->unk2;
+}
+
+void unref_sub_805869C(u32 x, u32 y)
+{
+ StartDoorOpenAnimation(gDoorAnimGraphicsTable, x, y);
+}
+
+void FieldSetDoorOpened(u32 x, u32 y)
+{
+ if (MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y)))
+ DrawOpenedDoor(gDoorAnimGraphicsTable, x, y);
+}
+
+void FieldSetDoorClosed(u32 x, u32 y)
+{
+ if (MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y)))
+ DrawClosedDoor(gDoorAnimGraphicsTable, x, y);
+}
+
+s8 FieldAnimateDoorClose(u32 x, u32 y)
+{
+ if (!MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y)))
+ return -1;
+ else
+ return StartDoorCloseAnimation(gDoorAnimGraphicsTable, x, y);
+}
+
+s8 FieldAnimateDoorOpen(u32 x, u32 y)
+{
+ if (!MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y)))
+ return -1;
+ else
+ return StartDoorOpenAnimation(gDoorAnimGraphicsTable, x, y);
+}
+
+bool8 FieldIsDoorAnimationRunning(void)
+{
+ return FuncIsActiveTask(Task_AnimateDoor);
+}
+
+u32 GetDoorSoundEffect(u32 x, u32 y)
+{
+ if (cur_mapdata_get_door_x2_at(gDoorAnimGraphicsTable, x, y) == 0)
+ return SE_DOOR;
+ else
+ return SE_JIDO_DOA;
+}
diff --git a/src/field_effect.c b/src/field/field_effect.c
index cffed2614..1e2aaa4ed 100644
--- a/src/field_effect.c
+++ b/src/field/field_effect.c
@@ -9,10 +9,10 @@
#include "menu.h"
#include "palette.h"
#include "text.h"
-#include "rom4.h"
+#include "overworld.h"
#include "task.h"
#include "sound.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "decoration.h"
#include "field_player_avatar.h"
#include "field_map_obj_helpers.h"
@@ -28,7 +28,7 @@
#define subsprite_table(ptr) {.subsprites = ptr, .subspriteCount = (sizeof ptr) / (sizeof(struct Subsprite))}
-EWRAM_DATA u32 gUnknown_0202FF84[8] = {0};
+EWRAM_DATA s32 gFieldEffectArguments[8] = {0};
const u32 gSpriteImage_839DC14[] = INCBIN_U32("graphics/birch_speech/birch.4bpp");
const u16 gBirchPalette[16] = INCBIN_U16("graphics/birch_speech/birch.gbapal");
@@ -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[] = {
@@ -310,114 +310,6 @@ void (*const gUnknown_0839F378[])(struct Task *) = {
sub_8087914
};
-const u8 gUnknown_0839F380[] = {1, 3, 4, 2, 1};
-
-void (*const gUnknown_0839F388[])(struct Task *) = {
- sub_8087AA4,
- sub_8087AC8
-};
-
-void (*const gUnknown_0839F390[])(struct Task *) = {
- sub_8087BEC,
- sub_8087C14,
- sub_8087CA4,
- sub_8087D78
-};
-
-void (*const gUnknown_0839F3A0[])(struct Task *) = {
- sub_8087E4C,
- sub_8087ED8,
- sub_8087FDC
-};
-
-void (*const gUnknown_0839F3AC[])(struct Task *) = {
- sub_8088150,
- sub_80881C0,
- sub_8088228,
- sub_80882B4,
- sub_80882E4,
- sub_8088338,
- sub_8088380
-};
-
-void (*const gUnknown_0839F3C8[])(struct Task *) = {
- sub_80884AC,
- sub_80884E8,
- sub_8088554,
- sub_80885A8,
- sub_80885D8,
- sub_808860C,
- sub_808862C
-};
-
-void (*const gUnknown_0839F3E4[])(struct Task *) = {
- sub_8088984,
- sub_80889E4,
- sub_8088A30,
- sub_8088A78,
- sub_8088AF4
-};
-
-void (*const gUnknown_0839F3F8[])(struct Task *) = {
- sub_8088CA0,
- sub_8088CF8,
- sub_8088D3C,
- sub_8088D94,
- sub_8088DD8,
- sub_8088E2C,
- sub_8088EB4,
- sub_8088F10,
- sub_8088F30
-};
-
-const union AffineAnimCmd SpriteAffineAnim_839F41C[] = {
- AFFINEANIMCMD_FRAME(8, 8, -30, 0),
- AFFINEANIMCMD_FRAME(28, 28, 0, 30),
- AFFINEANIMCMD_END
-};
-
-const union AffineAnimCmd SpriteAffineAnim_839F434[] = {
- AFFINEANIMCMD_FRAME(256, 256, 64, 0),
- AFFINEANIMCMD_FRAME(-10, -10, 0, 22),
- AFFINEANIMCMD_END
-};
-
-const union AffineAnimCmd *const gSpriteAffineAnimTable_0839F44C[] = {
- SpriteAffineAnim_839F41C,
- SpriteAffineAnim_839F434
-};
-
-void (*const gUnknown_0839F454[])(struct Task *) = {
- sub_80892A0,
- sub_8089354,
- sub_80893C0,
- sub_8089414,
- sub_808948C,
- sub_80894C4,
- fishE
-};
-
-const s16 gUnknown_0839F470[] = {
- -2,
- -4,
- -5,
- -6,
- -7,
- -8,
- -8,
- -8,
- -7,
- -7,
- -6,
- -5,
- -3,
- -2,
- 0,
- 2,
- 4,
- 8
-};
-
static u8 sActiveList[32];
extern u8 *gFieldEffectScriptPointers[];
@@ -660,7 +552,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;
@@ -886,16 +778,16 @@ void PokecenterHealEffect_0(struct Task *task)
void PokecenterHealEffect_1(struct Task *task)
{
- if (gSprites[task->data[6]].data0 > 1)
+ if (gSprites[task->data[6]].data[0] > 1)
{
- gSprites[task->data[7]].data0++;
+ gSprites[task->data[7]].data[0]++;
task->data[0]++;
}
}
void PokecenterHealEffect_2(struct Task *task)
{
- if (gSprites[task->data[6]].data0 > 4)
+ if (gSprites[task->data[6]].data[0] > 4)
{
task->data[0]++;
}
@@ -903,7 +795,7 @@ void PokecenterHealEffect_2(struct Task *task)
void PokecenterHealEffect_3(struct Task *task)
{
- if (gSprites[task->data[6]].data0 > 6)
+ if (gSprites[task->data[6]].data[0] > 6)
{
DestroySprite(&gSprites[task->data[6]]);
FieldEffectActiveListRemove(FLDEFF_POKECENTER_HEAL);
@@ -949,7 +841,7 @@ void HallOfFameRecordEffect_0(struct Task *task)
void HallOfFameRecordEffect_1(struct Task *task)
{
- if (gSprites[task->data[6]].data0 > 1)
+ if (gSprites[task->data[6]].data[0] > 1)
{
task->data[15]++; // was this ever initialized? is this ever used?
task->data[0]++;
@@ -958,7 +850,7 @@ void HallOfFameRecordEffect_1(struct Task *task)
void HallOfFameRecordEffect_2(struct Task *task)
{
- if (gSprites[task->data[6]].data0 > 4)
+ if (gSprites[task->data[6]].data[0] > 4)
{
task->data[0]++;
}
@@ -966,7 +858,7 @@ void HallOfFameRecordEffect_2(struct Task *task)
void HallOfFameRecordEffect_3(struct Task *task)
{
- if (gSprites[task->data[6]].data0 > 6)
+ if (gSprites[task->data[6]].data[0] > 6)
{
DestroySprite(&gSprites[task->data[6]]);
FieldEffectActiveListRemove(FLDEFF_HALL_OF_FAME_RECORD);
@@ -984,46 +876,46 @@ u8 CreatePokeballGlowSprite(s16 data6, s16 x, s16 y, u16 data5)
sprite = &gSprites[spriteId];
sprite->pos2.x = x;
sprite->pos2.y = y;
- sprite->data5 = data5;
- sprite->data6 = data6;
- sprite->data7 = spriteId;
+ sprite->data[5] = data5;
+ sprite->data[6] = data6;
+ sprite->data[7] = spriteId;
return spriteId;
}
void SpriteCB_PokeballGlowEffect(struct Sprite *sprite)
{
- gUnknown_0839F288[sprite->data0](sprite);
+ gUnknown_0839F288[sprite->data[0]](sprite);
}
void PokeballGlowEffect_0(struct Sprite *sprite)
{
u8 endSpriteId;
- if (sprite->data1 == 0 || (--sprite->data1) == 0)
+ if (sprite->data[1] == 0 || (--sprite->data[1]) == 0)
{
- sprite->data1 = 25;
- endSpriteId = CreateSpriteAtEnd(&gSpriteTemplate_839F208, gUnknown_0839F2A8[sprite->data2].x + sprite->pos2.x, gUnknown_0839F2A8[sprite->data2].y + sprite->pos2.y, 0);
+ sprite->data[1] = 25;
+ endSpriteId = CreateSpriteAtEnd(&gSpriteTemplate_839F208, gUnknown_0839F2A8[sprite->data[2]].x + sprite->pos2.x, gUnknown_0839F2A8[sprite->data[2]].y + sprite->pos2.y, 0);
gSprites[endSpriteId].oam.priority = 2;
- gSprites[endSpriteId].data0 = sprite->data7;
- sprite->data2++;
- sprite->data6--;
+ gSprites[endSpriteId].data[0] = sprite->data[7];
+ sprite->data[2]++;
+ sprite->data[6]--;
PlaySE(SE_BOWA);
}
- if (sprite->data6 == 0)
+ if (sprite->data[6] == 0)
{
- sprite->data1 = 32;
- sprite->data0++;
+ sprite->data[1] = 32;
+ sprite->data[0]++;
}
}
void PokeballGlowEffect_1(struct Sprite *sprite)
{
- if ((--sprite->data1) == 0)
+ if ((--sprite->data[1]) == 0)
{
- sprite->data0++;
- sprite->data1 = 8;
- sprite->data2 = 0;
- sprite->data3 = 0;
- if (sprite->data5)
+ sprite->data[0]++;
+ sprite->data[1] = 8;
+ sprite->data[2] = 0;
+ sprite->data[3] = 0;
+ if (sprite->data[5])
{
PlayFanfare(BGM_ME_ASA);
}
@@ -1033,48 +925,48 @@ void PokeballGlowEffect_1(struct Sprite *sprite)
void PokeballGlowEffect_2(struct Sprite *sprite)
{
u8 phase;
- if ((--sprite->data1) == 0)
+ if ((--sprite->data[1]) == 0)
{
- sprite->data1 = 8;
- sprite->data2++;
- sprite->data2 &= 3;
- if (sprite->data2 == 0)
+ sprite->data[1] = 8;
+ sprite->data[2]++;
+ sprite->data[2] &= 3;
+ if (sprite->data[2] == 0)
{
- sprite->data3++;
+ sprite->data[3]++;
}
}
- phase = (sprite->data2 + 3) & 3;
+ phase = (sprite->data[2] + 3) & 3;
MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x108, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]);
- phase = (sprite->data2 + 2) & 3;
+ phase = (sprite->data[2] + 2) & 3;
MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x106, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]);
- phase = (sprite->data2 + 1) & 3;
+ phase = (sprite->data[2] + 1) & 3;
MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x102, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]);
- phase = sprite->data2;
+ phase = sprite->data[2];
MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x105, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]);
MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x103, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]);
- if (sprite->data3 > 2)
+ if (sprite->data[3] > 2)
{
- sprite->data0++;
- sprite->data1 = 8;
- sprite->data2 = 0;
+ sprite->data[0]++;
+ sprite->data[1] = 8;
+ sprite->data[2] = 0;
}
}
void PokeballGlowEffect_3(struct Sprite *sprite)
{
u8 phase;
- if ((--sprite->data1) == 0)
+ if ((--sprite->data[1]) == 0)
{
- sprite->data1 = 8;
- sprite->data2++;
- sprite->data2 &= 3;
- if (sprite->data2 == 3)
+ sprite->data[1] = 8;
+ sprite->data[2]++;
+ sprite->data[2] &= 3;
+ if (sprite->data[2] == 3)
{
- sprite->data0++;
- sprite->data1 = 30;
+ sprite->data[0]++;
+ sprite->data[1] = 30;
}
}
- phase = sprite->data2;
+ phase = sprite->data[2];
MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x108, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]);
MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x106, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]);
MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x102, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]);
@@ -1084,22 +976,22 @@ void PokeballGlowEffect_3(struct Sprite *sprite)
void PokeballGlowEffect_4(struct Sprite *sprite)
{
- if ((--sprite->data1) == 0)
+ if ((--sprite->data[1]) == 0)
{
- sprite->data0++;
+ sprite->data[0]++;
}
}
void PokeballGlowEffect_5(struct Sprite *sprite)
{
- sprite->data0++;
+ sprite->data[0]++;
}
void PokeballGlowEffect_6(struct Sprite *sprite)
{
- if (sprite->data5 == 0 || IsFanfareTaskInactive())
+ if (sprite->data[5] == 0 || IsFanfareTaskInactive())
{
- sprite->data0++;
+ sprite->data[0]++;
}
}
@@ -1109,7 +1001,7 @@ void PokeballGlowEffect_7(struct Sprite *sprite)
void SpriteCB_PokeballGlow(struct Sprite *sprite)
{
- if (gSprites[sprite->data0].data0 > 4)
+ if (gSprites[sprite->data[0]].data[0] > 4)
{
FieldEffectFreeGraphicsResources(sprite);
}
@@ -1129,9 +1021,9 @@ u8 PokecenterHealEffectHelper(s16 x, s16 y)
void SpriteCB_PokecenterMonitor(struct Sprite *sprite)
{
- if (sprite->data0 != 0)
+ if (sprite->data[0] != 0)
{
- sprite->data0 = 0;
+ sprite->data[0] = 0;
sprite->invisible = 0;
StartSpriteAnim(sprite, 1);
}
@@ -1153,21 +1045,21 @@ void HallOfFameRecordEffectHelper(s16 a0, s16 a1, s16 a2, u8 a3)
spriteIdAtEnd = CreateSpriteAtEnd(&gSpriteTemplate_839F250, a1, a2, 0);
}
gSprites[spriteIdAtEnd].invisible = 1;
- gSprites[spriteIdAtEnd].data0 = a0;
+ gSprites[spriteIdAtEnd].data[0] = a0;
}
void SpriteCB_HallOfFameMonitor(struct Sprite *sprite)
{
- if (gTasks[sprite->data0].data[15])
+ if (gTasks[sprite->data[0]].data[15])
{
- if (sprite->data1 == 0 || (--sprite->data1) == 0)
+ if (sprite->data[1] == 0 || (--sprite->data[1]) == 0)
{
- sprite->data1 = 16;
+ sprite->data[1] = 16;
sprite->invisible ^= 1;
}
- sprite->data2++;
+ sprite->data[2]++;
}
- if (sprite->data2 > 127)
+ if (sprite->data[2] > 127)
{
FieldEffectFreeGraphicsResources(sprite);
}
@@ -1203,17 +1095,17 @@ void task00_8084310(u8 taskId)
{
return;
}
- gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened;
- if ((int)gUnknown_0202FF84[0] > 5)
+ gFieldEffectArguments[0] = gLastFieldPokeMenuOpened;
+ if ((int)gFieldEffectArguments[0] > 5)
{
- gUnknown_0202FF84[0] = 0;
+ gFieldEffectArguments[0] = 0;
}
FieldEffectStart(FLDEFF_USE_FLY);
task->data[0]++;
}
if (!FieldEffectActiveListContains(FLDEFF_USE_FLY))
{
- flag_var_implications_of_teleport_();
+ Overworld_ResetStateAfterFly();
warp_in();
SetMainCallback2(CB2_LoadMap);
gFieldCallback = mapldr_08084390;
@@ -1223,7 +1115,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 +1156,7 @@ extern void CameraObjectReset1(void);
void sub_8086748(void)
{
- sub_8053E90();
+ Overworld_PlaySpecialMapMusic();
pal_fill_for_map_transition();
ScriptContext2_Enable();
FreezeMapObjects();
@@ -1287,7 +1179,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 +1274,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 +1425,7 @@ void sub_8086C40(void)
void sub_8086C94(void)
{
- sub_8053E90();
+ Overworld_PlaySpecialMapMusic();
pal_fill_for_map_transition();
ScriptContext2_Enable();
CreateTask(sub_8086CBC, 0);
@@ -1665,7 +1557,7 @@ bool8 FldEff_UseWaterfall(void)
{
u8 taskId;
taskId = CreateTask(sub_8086F64, 0xff);
- gTasks[taskId].data[1] = gUnknown_0202FF84[0];
+ gTasks[taskId].data[1] = gFieldEffectArguments[0];
sub_8086F64(taskId);
return FALSE;
}
@@ -1678,7 +1570,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;
}
@@ -1689,7 +1581,7 @@ bool8 waterfall_1_do_anim_probably(struct Task *task, struct MapObject *mapObjec
if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject))
{
FieldObjectClearAnimIfSpecialAnimFinished(mapObject);
- gUnknown_0202FF84[0] = task->data[1];
+ gFieldEffectArguments[0] = task->data[1];
FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
task->data[0]++;
}
@@ -1725,7 +1617,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;
@@ -1738,8 +1630,8 @@ bool8 FldEff_UseDive(void)
{
u8 taskId;
taskId = CreateTask(Task_Dive, 0xff);
- gTasks[taskId].data[15] = gUnknown_0202FF84[0];
- gTasks[taskId].data[14] = gUnknown_0202FF84[1];
+ gTasks[taskId].data[15] = gFieldEffectArguments[0];
+ gTasks[taskId].data[14] = gFieldEffectArguments[1];
Task_Dive(taskId);
return FALSE;
}
@@ -1751,7 +1643,7 @@ void Task_Dive(u8 taskId)
bool8 sub_8087124(struct Task *task)
{
- gPlayerAvatar.unk6 = 1;
+ gPlayerAvatar.preventStep = TRUE;
task->data[0]++;
return FALSE;
}
@@ -1759,7 +1651,7 @@ bool8 sub_8087124(struct Task *task)
bool8 dive_2_unknown(struct Task *task)
{
ScriptContext2_Enable();
- gUnknown_0202FF84[0] = task->data[15];
+ gFieldEffectArguments[0] = task->data[15];
FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
task->data[0]++;
return FALSE;
@@ -1796,7 +1688,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]++;
@@ -1820,10 +1712,10 @@ bool8 sub_8087298(struct Task *task, struct MapObject *mapObject, struct Sprite
{
sprite->pos2.y = 0;
task->data[3] = 1;
- gUnknown_0202FF84[0] = mapObject->coords2.x;
- gUnknown_0202FF84[1] = mapObject->coords2.y;
- gUnknown_0202FF84[2] = sprite->subpriority - 1;
- gUnknown_0202FF84[3] = sprite->oam.priority;
+ gFieldEffectArguments[0] = mapObject->coords2.x;
+ gFieldEffectArguments[1] = mapObject->coords2.y;
+ gFieldEffectArguments[2] = sprite->subpriority - 1;
+ gFieldEffectArguments[3] = sprite->oam.priority;
FieldEffectStart(FLDEFF_LAVARIDGE_GYM_WARP);
PlaySE(SE_W153);
task->data[0]++;
@@ -1894,11 +1786,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 +1805,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;
@@ -1924,10 +1815,10 @@ bool8 sub_80874FC(struct Task *task, struct MapObject *mapObject, struct Sprite
{
if (sub_807D770())
{
- gUnknown_0202FF84[0] = mapObject->coords2.x;
- gUnknown_0202FF84[1] = mapObject->coords2.y;
- gUnknown_0202FF84[2] = sprite->subpriority - 1;
- gUnknown_0202FF84[3] = sprite->oam.priority;
+ gFieldEffectArguments[0] = mapObject->coords2.x;
+ gFieldEffectArguments[1] = mapObject->coords2.y;
+ gFieldEffectArguments[2] = sprite->subpriority - 1;
+ gFieldEffectArguments[3] = sprite->oam.priority;
task->data[1] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH);
task->data[0]++;
}
@@ -1952,7 +1843,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));
@@ -1966,9 +1857,9 @@ extern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[36]
u8 FldEff_LavaridgeGymWarp(void)
{
u8 spriteId;
- sub_8060470((s16 *)&gUnknown_0202FF84[0], (s16 *)&gUnknown_0202FF84[1], 8, 8);
- spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[33], gUnknown_0202FF84[0], gUnknown_0202FF84[1], gUnknown_0202FF84[2]);
- gSprites[spriteId].oam.priority = gUnknown_0202FF84[3];
+ sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[33], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
+ gSprites[spriteId].oam.priority = gFieldEffectArguments[3];
gSprites[spriteId].coordOffsetEnabled = 1;
return spriteId;
}
@@ -1997,7 +1888,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;
@@ -2009,10 +1900,10 @@ bool8 sub_80876F8(struct Task *task, struct MapObject *mapObject, struct Sprite
{
if (task->data[1] > 3)
{
- gUnknown_0202FF84[0] = mapObject->coords2.x;
- gUnknown_0202FF84[1] = mapObject->coords2.y;
- gUnknown_0202FF84[2] = sprite->subpriority - 1;
- gUnknown_0202FF84[3] = sprite->oam.priority;
+ gFieldEffectArguments[0] = mapObject->coords2.x;
+ gFieldEffectArguments[1] = mapObject->coords2.y;
+ gFieldEffectArguments[2] = sprite->subpriority - 1;
+ gFieldEffectArguments[3] = sprite->oam.priority;
task->data[1] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH);
task->data[0]++;
} else
@@ -2064,9 +1955,9 @@ bool8 sub_80877D4(struct Task *task, struct MapObject *mapObject, struct Sprite
u8 FldEff_PopOutOfAsh(void)
{
u8 spriteId;
- sub_8060470((s16 *)&gUnknown_0202FF84[0], (s16 *)&gUnknown_0202FF84[1], 8, 8);
- spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[32], gUnknown_0202FF84[0], gUnknown_0202FF84[1], gUnknown_0202FF84[2]);
- gSprites[spriteId].oam.priority = gUnknown_0202FF84[3];
+ sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[32], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
+ gSprites[spriteId].oam.priority = gFieldEffectArguments[3];
gSprites[spriteId].coordOffsetEnabled = 1;
return spriteId;
}
@@ -2101,8 +1992,7 @@ void sub_80878F4(struct Task *task)
void sub_8087914(struct Task *task)
{
struct MapObject *mapObject;
- u8 unknown_0839F380[5];
- memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380);
+ u8 unknown_0839F380[5] = {1, 3, 4, 2, 1};
if (task->data[14] != 0 && (--task->data[14]) == 0)
{
sub_8053FF8();
@@ -2131,11 +2021,16 @@ void sub_8087914(struct Task *task)
}
}
+void (*const gUnknown_0839F388[])(struct Task *) = {
+ sub_8087AA4,
+ sub_8087AC8
+};
+
void sub_8087A74(u8);
void mapldr_080859D4(void)
{
- sub_8053E90();
+ Overworld_PlaySpecialMapMusic();
pal_fill_for_map_transition();
ScriptContext2_Enable();
FreezeMapObjects();
@@ -2160,10 +2055,8 @@ void sub_8087AA4(struct Task *task)
void sub_8087AC8(struct Task *task)
{
- struct MapObject *mapObject;
- u8 unknown_0839F380[5];
- memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380);
- mapObject = &gMapObjects[gPlayerAvatar.mapObjectId];
+ u8 unknown_0839F380[5] = {1, 3, 4, 2, 1};
+ struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId];
if (task->data[1] == 0 || (--task->data[1]) == 0)
{
if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) && !FieldObjectClearAnimIfSpecialAnimFinished(mapObject))
@@ -2196,6 +2089,13 @@ void sub_8087BA8(void)
CreateTask(sub_8087BBC, 0);
}
+void (*const gUnknown_0839F390[])(struct Task *) = {
+ sub_8087BEC,
+ sub_8087C14,
+ sub_8087CA4,
+ sub_8087D78
+};
+
void sub_8087BBC(u8 taskId)
{
gUnknown_0839F390[gTasks[taskId].data[0]](&gTasks[taskId]);
@@ -2212,10 +2112,8 @@ void sub_8087BEC(struct Task *task)
void sub_8087C14(struct Task *task)
{
- struct MapObject *mapObject;
- u8 unknown_0839F380[5];
- memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380);
- mapObject = &gMapObjects[gPlayerAvatar.mapObjectId];
+ u8 unknown_0839F380[5] = {1, 3, 4, 2, 1};
+ struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId];
if (task->data[1] == 0 || (--task->data[1]) == 0)
{
FieldObjectTurn(mapObject, unknown_0839F380[mapObject->mapobj_unk_18]);
@@ -2234,12 +2132,9 @@ void sub_8087C14(struct Task *task)
void sub_8087CA4(struct Task *task)
{
- struct MapObject *mapObject;
- struct Sprite *sprite;
- u8 unknown_0839F380[5];
- memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380);
- mapObject = &gMapObjects[gPlayerAvatar.mapObjectId];
- sprite = &gSprites[gPlayerAvatar.spriteId];
+ u8 unknown_0839F380[5] = {1, 3, 4, 2, 1};
+ struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId];
+ struct Sprite *sprite = &gSprites[gPlayerAvatar.spriteId];
if ((--task->data[1]) <= 0)
{
task->data[1] = 4;
@@ -2267,7 +2162,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 +2174,7 @@ void sub_8087E1C(u8);
void mapldr_08085D88(void)
{
- sub_8053E90();
+ Overworld_PlaySpecialMapMusic();
pal_fill_for_map_transition();
ScriptContext2_Enable();
FreezeMapObjects();
@@ -2289,6 +2184,12 @@ void mapldr_08085D88(void)
CreateTask(sub_8087E1C, 0);
}
+void (*const gUnknown_0839F3A0[])(struct Task *) = {
+ sub_8087E4C,
+ sub_8087ED8,
+ sub_8087FDC
+};
+
void sub_8087E1C(u8 taskId)
{
gUnknown_0839F3A0[gTasks[taskId].data[0]](&gTasks[taskId]);
@@ -2315,12 +2216,9 @@ void sub_8087E4C(struct Task *task)
void sub_8087ED8(struct Task *task)
{
- u8 unknown_0839F380[5];
- struct MapObject *mapObject;
- struct Sprite *sprite;
- memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380);
- mapObject = &gMapObjects[gPlayerAvatar.mapObjectId];
- sprite = &gSprites[gPlayerAvatar.spriteId];
+ u8 unknown_0839F380[5] = {1, 3, 4, 2, 1};
+ struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId];
+ struct Sprite *sprite = &gSprites[gPlayerAvatar.spriteId];
if ((sprite->pos2.y += task->data[1]) >= -8)
{
if (task->data[13] == 0)
@@ -2357,10 +2255,8 @@ void sub_8087ED8(struct Task *task)
void sub_8087FDC(struct Task *task)
{
- u8 unknown_0839F380[5];
- struct MapObject *mapObject;
- memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380);
- mapObject = &gMapObjects[gPlayerAvatar.mapObjectId];
+ u8 unknown_0839F380[5] = {1, 3, 4, 2, 1};
+ struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId];
if ((--task->data[1]) == 0)
{
FieldObjectTurn(mapObject, unknown_0839F380[mapObject->mapobj_unk_18]);
@@ -2385,31 +2281,41 @@ void sub_8088890(struct Sprite *);
bool8 FldEff_FieldMoveShowMon(void)
{
u8 taskId;
- if (is_light_level_1_2_3_5_or_6(sav1_map_get_light_level()) == TRUE)
+ if (is_map_type_1_2_3_5_or_6(Overworld_GetMapTypeOfSaveblockLocation()) == TRUE)
{
taskId = CreateTask(sub_8088120, 0xff);
} else
{
taskId = CreateTask(sub_808847C, 0xff);
}
- gTasks[taskId].data[15] = sub_8088830(gUnknown_0202FF84[0], gUnknown_0202FF84[1], gUnknown_0202FF84[2]);
+ gTasks[taskId].data[15] = sub_8088830(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]);
return FALSE;
}
bool8 FldEff_FieldMoveShowMonInit(void)
{
struct Pokemon *pokemon;
- u32 flag = gUnknown_0202FF84[0] & 0x80000000;
- pokemon = &gPlayerParty[(u8)gUnknown_0202FF84[0]];
- gUnknown_0202FF84[0] = GetMonData(pokemon, MON_DATA_SPECIES);
- gUnknown_0202FF84[1] = GetMonData(pokemon, MON_DATA_OT_ID);
- gUnknown_0202FF84[2] = GetMonData(pokemon, MON_DATA_PERSONALITY);
- gUnknown_0202FF84[0] |= flag;
+ u32 flag = gFieldEffectArguments[0] & 0x80000000;
+ pokemon = &gPlayerParty[(u8)gFieldEffectArguments[0]];
+ gFieldEffectArguments[0] = GetMonData(pokemon, MON_DATA_SPECIES);
+ gFieldEffectArguments[1] = GetMonData(pokemon, MON_DATA_OT_ID);
+ gFieldEffectArguments[2] = GetMonData(pokemon, MON_DATA_PERSONALITY);
+ gFieldEffectArguments[0] |= flag;
FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON);
FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
return FALSE;
}
+void (*const gUnknown_0839F3AC[])(struct Task *) = {
+ sub_8088150,
+ sub_80881C0,
+ sub_8088228,
+ sub_80882B4,
+ sub_80882E4,
+ sub_8088338,
+ sub_8088380
+};
+
void sub_8088120(u8 taskId)
{
gUnknown_0839F3AC[gTasks[taskId].data[0]](&gTasks[taskId]);
@@ -2481,7 +2387,7 @@ void sub_8088228(struct Task *task)
void sub_80882B4(struct Task *task)
{
task->data[5] -= 16;
- if (gSprites[task->data[15]].data7)
+ if (gSprites[task->data[15]].data[7])
{
task->data[0]++;
}
@@ -2566,6 +2472,16 @@ bool8 sub_8088708(struct Task *);
void sub_80886F8(struct Task *);
bool8 sub_80887C0(struct Task *);
+void (*const gUnknown_0839F3C8[])(struct Task *) = {
+ sub_80884AC,
+ sub_80884E8,
+ sub_8088554,
+ sub_80885A8,
+ sub_80885D8,
+ sub_808860C,
+ sub_808862C
+};
+
void sub_808847C(u8 taskId)
{
gUnknown_0839F3C8[gTasks[taskId].data[0]](&gTasks[taskId]);
@@ -2608,7 +2524,7 @@ void sub_8088554(struct Task *task)
void sub_80885A8(struct Task *task)
{
sub_80886F8(task);
- if (gSprites[task->data[15]].data7)
+ if (gSprites[task->data[15]].data[7])
{
task->data[0]++;
}
@@ -2828,8 +2744,8 @@ u8 sub_8088830(u32 a0, u32 a1, u32 a2)
sprite = &gSprites[monSprite];
sprite->callback = SpriteCallbackDummy;
sprite->oam.priority = 0;
- sprite->data0 = a0;
- sprite->data6 = v0;
+ sprite->data[0] = a0;
+ sprite->data[6] = v0;
return monSprite;
}
@@ -2840,14 +2756,14 @@ void sub_8088890(struct Sprite *sprite)
if ((sprite->pos1.x -= 20) <= 0x78)
{
sprite->pos1.x = 0x78;
- sprite->data1 = 30;
+ sprite->data[1] = 30;
sprite->callback = sub_80888D4;
- if (sprite->data6)
+ if (sprite->data[6])
{
- PlayCry2(sprite->data0, 0, 0x7d, 0xa);
+ PlayCry2(sprite->data[0], 0, 0x7d, 0xa);
} else
{
- PlayCry1(sprite->data0, 0);
+ PlayCry1(sprite->data[0], 0);
}
}
}
@@ -2856,7 +2772,7 @@ void sub_80888F0(struct Sprite *);
void sub_80888D4(struct Sprite *sprite)
{
- if ((--sprite->data1) == 0)
+ if ((--sprite->data[1]) == 0)
{
sprite->callback = sub_80888F0;
}
@@ -2866,7 +2782,7 @@ void sub_80888F0(struct Sprite *sprite)
{
if (sprite->pos1.x < -0x40)
{
- sprite->data7 = 1;
+ sprite->data[7] = 1;
} else
{
sprite->pos1.x -= 20;
@@ -2879,12 +2795,20 @@ u8 FldEff_UseSurf(void)
{
u8 taskId;
taskId = CreateTask(sub_8088954, 0xff);
- gTasks[taskId].data[15] = gUnknown_0202FF84[0];
- sav1_reset_battle_music_maybe();
- sub_8053FB0(0x016d);
+ gTasks[taskId].data[15] = gFieldEffectArguments[0];
+ Overworld_ClearSavedMusic();
+ Overworld_ChangeMusicTo(0x016d);
return FALSE;
}
+void (*const gUnknown_0839F3E4[])(struct Task *) = {
+ sub_8088984,
+ sub_80889E4,
+ sub_8088A30,
+ sub_8088A78,
+ sub_8088AF4
+};
+
void sub_8088954(u8 taskId)
{
gUnknown_0839F3E4[gTasks[taskId].data[0]](&gTasks[taskId]);
@@ -2894,7 +2818,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]);
@@ -2919,7 +2843,7 @@ void sub_8088A30(struct Task *task)
mapObject = &gMapObjects[gPlayerAvatar.mapObjectId];
if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(mapObject))
{
- gUnknown_0202FF84[0] = task->data[15] | 0x80000000;
+ gFieldEffectArguments[0] = task->data[15] | 0x80000000;
FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
task->data[0]++;
}
@@ -2934,9 +2858,9 @@ void sub_8088A78(struct Task *task)
sub_805B980(mapObject, GetPlayerAvatarGraphicsIdByStateId(3));
FieldObjectClearAnimIfSpecialAnimFinished(mapObject);
FieldObjectSetSpecialAnim(mapObject, sub_80608D0(mapObject->placeholder18));
- gUnknown_0202FF84[0] = task->data[1];
- gUnknown_0202FF84[1] = task->data[2];
- gUnknown_0202FF84[2] = gPlayerAvatar.mapObjectId;
+ gFieldEffectArguments[0] = task->data[1];
+ gFieldEffectArguments[1] = task->data[2];
+ gFieldEffectArguments[2] = gPlayerAvatar.mapObjectId;
mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_SURF_BLOB);
task->data[0]++;
}
@@ -2948,7 +2872,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);
@@ -2970,7 +2894,7 @@ u8 FldEff_NPCFlyOut(void)
sprite->oam.paletteNum = 0;
sprite->oam.priority = 1;
sprite->callback = sub_8088BC4;
- sprite->data1 = gUnknown_0202FF84[0];
+ sprite->data[1] = gFieldEffectArguments[0];
PlaySE(SE_W019);
return spriteId;
}
@@ -2978,19 +2902,19 @@ u8 FldEff_NPCFlyOut(void)
void sub_8088BC4(struct Sprite *sprite)
{
struct Sprite *npcSprite;
- sprite->pos2.x = Cos(sprite->data2, 0x8c);
- sprite->pos2.y = Sin(sprite->data2, 0x48);
- sprite->data2 = (sprite->data2 + 4) & 0xff;
- if (sprite->data0)
+ sprite->pos2.x = Cos(sprite->data[2], 0x8c);
+ sprite->pos2.y = Sin(sprite->data[2], 0x48);
+ sprite->data[2] = (sprite->data[2] + 4) & 0xff;
+ if (sprite->data[0])
{
- npcSprite = &gSprites[sprite->data1];
+ npcSprite = &gSprites[sprite->data[1]];
npcSprite->coordOffsetEnabled = 0;
npcSprite->pos1.x = sprite->pos1.x + sprite->pos2.x;
npcSprite->pos1.y = sprite->pos1.y + sprite->pos2.y - 8;
npcSprite->pos2.x = 0;
npcSprite->pos2.y = 0;
}
- if (sprite->data2 >= 0x80)
+ if (sprite->data[2] >= 0x80)
{
FieldEffectStop(sprite, FLDEFF_NPCFLY_OUT);
}
@@ -3009,10 +2933,22 @@ u8 FldEff_UseFly(void)
{
u8 taskId;
taskId = CreateTask(sub_8088C70, 0xfe);
- gTasks[taskId].data[1] = gUnknown_0202FF84[0];
+ gTasks[taskId].data[1] = gFieldEffectArguments[0];
return 0;
}
+void (*const gUnknown_0839F3F8[])(struct Task *) = {
+ sub_8088CA0,
+ sub_8088CF8,
+ sub_8088D3C,
+ sub_8088D94,
+ sub_8088DD8,
+ sub_8088E2C,
+ sub_8088EB4,
+ sub_8088F10,
+ sub_8088F30
+};
+
void sub_8088C70(u8 taskId)
{
gUnknown_0839F3F8[gTasks[taskId].data[0]](&gTasks[taskId]);
@@ -3025,7 +2961,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);
@@ -3040,7 +2976,7 @@ void sub_8088CF8(struct Task *task)
if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject))
{
task->data[0]++;
- gUnknown_0202FF84[0] = task->data[1];
+ gFieldEffectArguments[0] = task->data[1];
FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
}
}
@@ -3150,7 +3086,7 @@ u8 sub_8088F60(void)
u8 sub_8088FA4(u8 spriteId)
{
- return gSprites[spriteId].data7;
+ return gSprites[spriteId].data[7];
}
void sub_8088FC0(u8 spriteId)
@@ -3162,20 +3098,37 @@ void sub_8088FC0(u8 spriteId)
sprite->pos1.y = 0x00;
sprite->pos2.x = 0;
sprite->pos2.y = 0;
- memset(&sprite->data0, 0, 8 * sizeof(u16) /* zero all data cells */);
- sprite->data6 = 0x40;
+ memset(&sprite->data[0], 0, 8 * sizeof(u16) /* zero all data cells */);
+ sprite->data[6] = 0x40;
}
void sub_8088FFC(u8 a0, u8 a1)
{
- gSprites[a0].data6 = a1;
+ gSprites[a0].data[6] = a1;
}
+const union AffineAnimCmd SpriteAffineAnim_839F41C[] = {
+ AFFINEANIMCMD_FRAME(8, 8, -30, 0),
+ AFFINEANIMCMD_FRAME(28, 28, 0, 30),
+ AFFINEANIMCMD_END
+};
+
+const union AffineAnimCmd SpriteAffineAnim_839F434[] = {
+ AFFINEANIMCMD_FRAME(256, 256, 64, 0),
+ AFFINEANIMCMD_FRAME(-10, -10, 0, 22),
+ AFFINEANIMCMD_END
+};
+
+const union AffineAnimCmd *const gSpriteAffineAnimTable_0839F44C[] = {
+ SpriteAffineAnim_839F41C,
+ SpriteAffineAnim_839F434
+};
+
void sub_8089018(struct Sprite *sprite)
{
- if (sprite->data7 == 0)
+ if (sprite->data[7] == 0)
{
- if (sprite->data0 == 0)
+ if (sprite->data[0] == 0)
{
sprite->oam.affineMode = 3;
sprite->affineAnims = gSpriteAffineAnimTable_0839F44C;
@@ -3183,20 +3136,20 @@ void sub_8089018(struct Sprite *sprite)
StartSpriteAffineAnim(sprite, 0);
sprite->pos1.x = 0x76;
sprite->pos1.y = -0x30;
- sprite->data0++;
- sprite->data1 = 0x40;
- sprite->data2 = 0x100;
+ sprite->data[0]++;
+ sprite->data[1] = 0x40;
+ sprite->data[2] = 0x100;
}
- sprite->data1 += (sprite->data2 >> 8);
- sprite->pos2.x = Cos(sprite->data1, 0x78);
- sprite->pos2.y = Sin(sprite->data1, 0x78);
- if (sprite->data2 < 0x800)
+ sprite->data[1] += (sprite->data[2] >> 8);
+ sprite->pos2.x = Cos(sprite->data[1], 0x78);
+ sprite->pos2.y = Sin(sprite->data[1], 0x78);
+ if (sprite->data[2] < 0x800)
{
- sprite->data2 += 0x60;
+ sprite->data[2] += 0x60;
}
- if (sprite->data1 > 0x81)
+ if (sprite->data[1] > 0x81)
{
- sprite->data7++;
+ sprite->data[7]++;
sprite->oam.affineMode = 0;
FreeOamMatrix(sprite->oam.matrixNum);
CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, 0);
@@ -3207,29 +3160,29 @@ void sub_8089018(struct Sprite *sprite)
void sub_80890D8(struct Sprite *sprite)
{
struct Sprite *sprite1;
- sprite->pos2.x = Cos(sprite->data2, 0x8c);
- sprite->pos2.y = Sin(sprite->data2, 0x48);
- sprite->data2 = (sprite->data2 + 4) & 0xff;
- if (sprite->data6 != 0x40)
+ sprite->pos2.x = Cos(sprite->data[2], 0x8c);
+ sprite->pos2.y = Sin(sprite->data[2], 0x48);
+ sprite->data[2] = (sprite->data[2] + 4) & 0xff;
+ if (sprite->data[6] != 0x40)
{
- sprite1 = &gSprites[sprite->data6];
+ sprite1 = &gSprites[sprite->data[6]];
sprite1->coordOffsetEnabled = 0;
sprite1->pos1.x = sprite->pos1.x + sprite->pos2.x;
sprite1->pos1.y = sprite->pos1.y + sprite->pos2.y - 8;
sprite1->pos2.x = 0;
sprite1->pos2.y = 0;
}
- if (sprite->data2 >= 0x80)
+ if (sprite->data[2] >= 0x80)
{
- sprite->data7 = 1;
+ sprite->data[7] = 1;
}
}
void sub_808914C(struct Sprite *sprite)
{
- if (sprite->data7 == 0)
+ if (sprite->data[7] == 0)
{
- if (sprite->data0 == 0)
+ if (sprite->data[0] == 0)
{
sprite->oam.affineMode = 3;
sprite->affineAnims = gSpriteAffineAnimTable_0839F44C;
@@ -3237,31 +3190,31 @@ void sub_808914C(struct Sprite *sprite)
StartSpriteAffineAnim(sprite, 1);
sprite->pos1.x = 0x5e;
sprite->pos1.y = -0x20;
- sprite->data0++;
- sprite->data1 = 0xf0;
- sprite->data2 = 0x800;
- sprite->data4 = 0x80;
+ sprite->data[0]++;
+ sprite->data[1] = 0xf0;
+ sprite->data[2] = 0x800;
+ sprite->data[4] = 0x80;
}
- sprite->data1 += sprite->data2 >> 8;
- sprite->data3 += sprite->data2 >> 8;
- sprite->data1 &= 0xff;
- sprite->pos2.x = Cos(sprite->data1, 0x20);
- sprite->pos2.y = Sin(sprite->data1, 0x78);
- if (sprite->data2 > 0x100)
+ sprite->data[1] += sprite->data[2] >> 8;
+ sprite->data[3] += sprite->data[2] >> 8;
+ sprite->data[1] &= 0xff;
+ sprite->pos2.x = Cos(sprite->data[1], 0x20);
+ sprite->pos2.y = Sin(sprite->data[1], 0x78);
+ if (sprite->data[2] > 0x100)
{
- sprite->data2 -= sprite->data4;
+ sprite->data[2] -= sprite->data[4];
}
- if (sprite->data4 < 0x100)
+ if (sprite->data[4] < 0x100)
{
- sprite->data4 += 24;
+ sprite->data[4] += 24;
}
- if (sprite->data2 < 0x100)
+ if (sprite->data[2] < 0x100)
{
- sprite->data2 = 0x100;
+ sprite->data[2] = 0x100;
}
- if (sprite->data3 >= 60)
+ if (sprite->data[3] >= 60)
{
- sprite->data7++;
+ sprite->data[7]++;
sprite->oam.affineMode = 0;
FreeOamMatrix(sprite->oam.matrixNum);
sprite->invisible = 1;
@@ -3283,6 +3236,16 @@ u8 FldEff_FlyIn(void)
return 0;
}
+void (*const gUnknown_0839F454[])(struct Task *) = {
+ sub_80892A0,
+ sub_8089354,
+ sub_80893C0,
+ sub_8089414,
+ sub_808948C,
+ sub_80894C4,
+ fishE
+};
+
void sub_8089270(u8 taskId)
{
gUnknown_0839F454[gTasks[taskId].data[0]](&gTasks[taskId]);
@@ -3297,7 +3260,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)
{
@@ -3334,10 +3297,27 @@ void sub_8089354(struct Task *task)
void sub_80893C0(struct Task *task)
{
- s16 unknown_0839F470[18];
- struct Sprite *sprite;
- memcpy(unknown_0839F470, gUnknown_0839F470, sizeof gUnknown_0839F470);
- sprite = &gSprites[gPlayerAvatar.spriteId];
+ s16 unknown_0839F470[18] = {
+ -2,
+ -4,
+ -5,
+ -6,
+ -7,
+ -8,
+ -8,
+ -8,
+ -7,
+ -7,
+ -6,
+ -5,
+ -3,
+ -2,
+ 0,
+ 2,
+ 4,
+ 8
+ };
+ struct Sprite *sprite = &gSprites[gPlayerAvatar.spriteId];
sprite->pos2.y = unknown_0839F470[task->data[2]];
if ((++task->data[2]) >= 18)
{
@@ -3399,7 +3379,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..165829a55
--- /dev/null
+++ b/src/field/field_effect_helpers.c
@@ -0,0 +1,1606 @@
+#include "global.h"
+#include "sprite.h"
+#include "fieldmap.h"
+#include "metatile_behavior.h"
+#include "constants/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[] = _("タマゴ");
+
+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->data[0] = sprite->data[0];
+ newSprite->data[1] = mapObject->localId;
+ newSprite->data[7] = 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[] = {0x0c, 0x1c, 0x2c};
+ sprite->data[2] = 0;
+ if (!GetFieldObjectGraphicsInfo(mapObject->graphicsId)->disableReflectionPaletteLoad && ((whichElement = sub_8057450(mapObject->mapobj_unk_1F)) || (whichElement = sub_8057450(mapObject->mapobj_unk_1E))))
+ {
+ sprite->data[2] = 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->data[0]];
+ oldSprite = &gSprites[mapObject->spriteId];
+ if (!mapObject->active || !mapObject->mapobj_bit_17 || mapObject->localId != sprite->data[1])
+ {
+ 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->data[2];
+ 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->data[7] == 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->data[0] != x || sprite->data[1] != y)
+ {
+ sub_80603CC(x, y, &x2, &y2);
+ sprite = &gSprites[spriteId];
+ sprite->pos1.x = x2 + 8;
+ sprite->pos1.y = y2 + 8;
+ sprite->invisible = FALSE;
+ sprite->data[0] = x;
+ sprite->data[1] = y;
+ StartSpriteAnim(sprite, animNum - 1);
+ }
+}
+
+const u8 gUnknown_08401E32[] = {
+ 0,
+ 1,
+ 2,
+ 3
+};
+
+const u16 gUnknown_08401E36[] = {
+ 4,
+ 4,
+ 4,
+ 16
+};
+
+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].data[0] = gFieldEffectArguments[0];
+ gSprites[spriteId].data[1] = gFieldEffectArguments[1];
+ gSprites[spriteId].data[2] = gFieldEffectArguments[2];
+ gSprites[spriteId].data[3] = (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->data[0], sprite->data[1], sprite->data[2], &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->data[3];
+ 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->data[0] = gFieldEffectArguments[2];
+ sprite->data[1] = gFieldEffectArguments[0];
+ sprite->data[2] = gFieldEffectArguments[1];
+ sprite->data[3] = gFieldEffectArguments[4];
+ sprite->data[4] = gFieldEffectArguments[5];
+ sprite->data[5] = 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->data[5] >> 8;
+ mapGroup = sprite->data[5];
+ if (gCamera.field_0 && (gSaveBlock1.location.mapNum != mapNum || gSaveBlock1.location.mapGroup != mapGroup))
+ {
+ sprite->data[1] -= gCamera.x;
+ sprite->data[2] -= gCamera.y;
+ sprite->data[5] = ((u8)gSaveBlock1.location.mapNum << 8) | (u8)gSaveBlock1.location.mapGroup;
+ }
+ localId = sprite->data[3] >> 8;
+ mapNum = sprite->data[3];
+ mapGroup = sprite->data[4];
+ metatileBehavior = MapGridGetMetatileBehaviorAt(sprite->data[1], sprite->data[2]);
+ if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId) || !MetatileBehavior_IsTallGrass(metatileBehavior) || (sprite->data[7] && sprite->animEnded))
+ {
+ FieldEffectStop(sprite, FLDEFF_TALL_GRASS);
+ }
+ else
+ {
+ mapObject = &gMapObjects[mapObjectId];
+ if ((mapObject->coords2.x != sprite->data[1] || mapObject->coords2.y != sprite->data[2]) && (mapObject->coords3.x != sprite->data[1] || mapObject->coords3.y != sprite->data[2]))
+ {
+ sprite->data[7] = TRUE;
+ }
+ metatileBehavior = 0;
+ if (sprite->animCmdIndex == 0)
+ {
+ metatileBehavior = 4;
+ }
+ sub_806487C(sprite, 0);
+ sub_812882C(sprite, sprite->data[0], 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->data[0] = gFieldEffectArguments[2];
+ sprite->data[1] = 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->data[1] && y == sprite->data[2]) && (localId == (u8)(sprite->data[3] >> 8) && mapNum == (sprite->data[3] & 0xFF) && mapGroup == sprite->data[4]))
+ {
+ 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->data[0] = gFieldEffectArguments[2];
+ sprite->data[1] = gFieldEffectArguments[0];
+ sprite->data[2] = gFieldEffectArguments[1];
+ sprite->data[3] = gFieldEffectArguments[4];
+ sprite->data[4] = gFieldEffectArguments[5];
+ sprite->data[5] = 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->data[5] >> 8;
+ mapGroup = sprite->data[5];
+ if (gCamera.field_0 && (gSaveBlock1.location.mapNum != mapNum || gSaveBlock1.location.mapGroup != mapGroup))
+ {
+ sprite->data[1] -= gCamera.x;
+ sprite->data[2] -= gCamera.y;
+ sprite->data[5] = ((u8)gSaveBlock1.location.mapNum << 8) | (u8)gSaveBlock1.location.mapGroup;
+ }
+ localId = sprite->data[3] >> 8;
+ mapNum = sprite->data[3];
+ mapGroup = sprite->data[4];
+ metatileBehavior = MapGridGetMetatileBehaviorAt(sprite->data[1], sprite->data[2]);
+ if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId) || !MetatileBehavior_IsLongGrass(metatileBehavior) || (sprite->data[7] && sprite->animEnded))
+ {
+ FieldEffectStop(sprite, FLDEFF_LONG_GRASS);
+ }
+ else
+ {
+ mapObject = &gMapObjects[mapObjectId];
+ if ((mapObject->coords2.x != sprite->data[1] || mapObject->coords2.y != sprite->data[2]) && (mapObject->coords3.x != sprite->data[1] || mapObject->coords3.y != sprite->data[2]))
+ {
+ sprite->data[7] = TRUE;
+ }
+ sub_806487C(sprite, 0);
+ sub_812882C(sprite, sprite->data[0], 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->data[0] = gFieldEffectArguments[2];
+ sprite->data[1] = 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->data[0] = gFieldEffectArguments[0];
+ sprite->data[1] = gFieldEffectArguments[1];
+ sprite->data[2] = gFieldEffectArguments[2];
+ sprite->data[3] = gSprites[mapObject->spriteId].pos1.x;
+ sprite->data[4] = 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->data[0], sprite->data[1], sprite->data[2], &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->data[3] || y != sprite->data[4])
+ {
+ sprite->data[3] = x;
+ sprite->data[4] = 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->data[7] = 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->data[7] = 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->data[7] = FLDEFF_BIKE_TIRE_TRACKS;
+ StartSpriteAnim(sprite, gFieldEffectArguments[4]);
+ }
+ return spriteId;
+}
+
+void (*const gUnknown_08401E40[])(struct Sprite *) = {
+ sub_81275A0,
+ sub_81275C4
+};
+
+void sub_8127584(struct Sprite *sprite)
+{
+ gUnknown_08401E40[sprite->data[0]](sprite);
+}
+
+static void sub_81275A0(struct Sprite *sprite)
+{
+ if (++sprite->data[1] > 40)
+ {
+ sprite->data[0] = 1;
+ }
+ sub_806487C(sprite, FALSE);
+}
+
+static void sub_81275C4(struct Sprite *sprite)
+{
+ sprite->invisible ^= 1;
+ sprite->data[1] ++;
+ sub_806487C(sprite, sprite->invisible);
+ if (sprite->data[1] > 56)
+ {
+ FieldEffectStop(sprite, sprite->data[7]);
+ }
+}
+
+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->data[0] = gFieldEffectArguments[0];
+ sprite->data[1] = gFieldEffectArguments[1];
+ sprite->data[2] = 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->data[0], sprite->data[1], sprite->data[2], &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->data[0] = gFieldEffectArguments[2];
+ sprite->data[1] = 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->data[0] = gFieldEffectArguments[2];
+ sprite->data[1] = 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->data[0] = gFieldEffectArguments[0];
+ sprite->data[1] = gFieldEffectArguments[1];
+ sprite->data[2] = gFieldEffectArguments[2];
+ sprite->data[3] = -1;
+ sprite->data[4] = -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->data[0], sprite->data[1], sprite->data[2], &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->data[3] || mapObject->coords2.y != sprite->data[4])
+ {
+ sprite->data[3] = mapObject->coords2.x;
+ sprite->data[4] = 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->data[0] = 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->data[0] = gFieldEffectArguments[0];
+ sprite->data[1] = gFieldEffectArguments[1];
+ sprite->data[2] = gFieldEffectArguments[2];
+ sprite->data[3] = gSprites[mapObject->spriteId].pos1.x;
+ sprite->data[4] = 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->data[0], sprite->data[1], sprite->data[2], &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->data[0] = 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->data[0] = 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->data[0] = 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->data[0] = 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->data[1] = gFieldEffectArguments[0];
+ sprite->data[2] = gFieldEffectArguments[1];
+ sprite->data[3] = gFieldEffectArguments[4];
+ sprite->data[4] = gFieldEffectArguments[5];
+ }
+ return 0;
+}
+
+void (*const gUnknown_08401E48[])(struct Sprite *) = {
+ sub_8127DA0,
+ sub_8127DD0,
+ sub_8127E30
+};
+
+void sub_8127D84(struct Sprite *sprite)
+{
+ gUnknown_08401E48[sprite->data[0]](sprite);
+}
+
+static void sub_8127DA0(struct Sprite *sprite)
+{
+ sprite->invisible = TRUE;
+ sprite->animPaused = TRUE;
+ if (--sprite->data[4] == 0)
+ {
+ sprite->data[0] = 1;
+ }
+}
+
+static void sub_8127DD0(struct Sprite *sprite)
+{
+ sprite->invisible = FALSE;
+ sprite->animPaused = FALSE;
+ MapGridSetMetatileIdAt(sprite->data[1], sprite->data[2], sprite->data[3]);
+ CurrentMapDrawMetatileAt(sprite->data[1], sprite->data[2]);
+ gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_2 = TRUE;
+ sprite->data[0] = 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->data[2] = gFieldEffectArguments[2];
+ sprite->data[3] = -1;
+ sprite->data[6] = -1;
+ sprite->data[7] = -1;
+ }
+ FieldEffectActiveListRemove(FLDEFF_SURF_BLOB);
+ return spriteId;
+}
+
+void sub_8127ED0(u8 spriteId, u8 value)
+{
+ gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF) | (value & 0xF);
+}
+
+void sub_8127EFC(u8 spriteId, u8 value)
+{
+ gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF0) | ((value & 0xF) << 4);
+}
+
+void sub_8127F28(u8 spriteId, u8 value, s16 data1)
+{
+ gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF00) | ((value & 0xF) << 8);
+ gSprites[spriteId].data[1] = data1;
+}
+
+static u8 sub_8127F5C(struct Sprite *sprite)
+{
+ return sprite->data[0] & 0xF;
+}
+
+static u8 sub_8127F64(struct Sprite *sprite)
+{
+ return (sprite->data[0] & 0xF0) >> 4;
+}
+
+static u8 sub_8127F70(struct Sprite *sprite)
+{
+ return (sprite->data[0] & 0xF00) >> 8;
+}
+
+void sub_8127F7C(struct Sprite *sprite)
+{
+ struct MapObject *mapObject;
+ struct Sprite *linkedSprite;
+
+ mapObject = &gMapObjects[sprite->data[2]];
+ 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[] = {0, 0, 1, 2, 3};
+ 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->data[6] || y != sprite->data[7]))
+ {
+ sprite->data[5] = sprite->pos2.y;
+ for (sprite->data[6] = x, sprite->data[7] = y, i = DIR_SOUTH; i <= DIR_EAST; i ++, x = sprite->data[6], y = sprite->data[7])
+ {
+ MoveCoords(i, &x, &y);
+ if (MapGridGetZCoordAt(x, y) == 3)
+ {
+ sprite->data[5] ++;
+ 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[] = {3, 7};
+ u8 v0 = sub_8127F5C(sprite);
+ if (v0 != 0)
+ {
+ if (((u16)(++ sprite->data[4]) & unk_8401E5A[sprite->data[5]]) == 0)
+ {
+ sprite->pos2.y += sprite->data[3];
+ }
+ if ((sprite->data[4] & 0x0F) == 0)
+ {
+ sprite->data[3] = -sprite->data[3];
+ }
+ if (v0 != 2)
+ {
+ if (sub_8127F70(sprite) == 0)
+ {
+ linkedSprite->pos2.y = sprite->pos2.y;
+ }
+ else
+ {
+ linkedSprite->pos2.y = sprite->data[1] + 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->data[0] = oldSpriteId;
+ sprite->data[1] = 1;
+ return spriteId;
+}
+
+static void sub_8128174(struct Sprite *sprite)
+{
+ struct Sprite *oldSprite;
+
+ oldSprite = &gSprites[sprite->data[0]];
+ if (((sprite->data[2]++) & 0x03) == 0)
+ {
+ oldSprite->pos2.y += sprite->data[1];
+ }
+ if ((sprite->data[2] & 0x0F) == 0)
+ {
+ sprite->data[1] = -sprite->data[1];
+ }
+}
+
+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->data[0] = gFieldEffectArguments[2];
+ sprite->data[1] = 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->data[0] = gFieldEffectArguments[0];
+ sprite->data[1] = gFieldEffectArguments[1];
+ sprite->data[2] = gFieldEffectArguments[2];
+ sprite->data[3] = gSprites[mapObject->spriteId].pos1.x;
+ sprite->data[4] = 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->data[0], sprite->data[1], sprite->data[2], &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->data[3] || y != sprite->data[4])
+ {
+ sprite->data[3] = x;
+ sprite->data[4] = 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->data[0] += 0x80;
+ sprite->data[0] &= 0x100;
+ sprite->pos1.y -= sprite->data[0] >> 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->data[0] = 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->data[1] = fldEff;
+ sprite->data[2] = gFieldEffectArguments[0];
+ sprite->data[3] = gFieldEffectArguments[1];
+ sprite->data[4] = gFieldEffectArguments[2];
+ }
+ return spriteId;
+}
+
+void sub_81285AC(struct Sprite *sprite)
+{
+ u8 mapObjectId;
+ const struct MapObjectGraphicsInfo *graphicsInfo;
+ struct Sprite *linkedSprite;
+
+ if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data[2], sprite->data[3], sprite->data[4], &mapObjectId))
+ {
+ FieldEffectStop(sprite, sprite->data[1]);
+ }
+ // 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->data[0] == 1)
+ {
+ sprite->data[0] ++;
+ StartSpriteAnim(sprite, 1);
+ }
+ if (sprite->data[0] == 2 && sprite->animEnded)
+ {
+ sprite->data[7] = 1;
+ }
+ if (sprite->data[0] == 3)
+ {
+ FieldEffectStop(sprite, sprite->data[1]);
+ }
+ // }
+}
+
+void sub_812869C(struct MapObject *mapObject)
+{
+ if (mapObject->mapobj_unk_21 == 1)
+ {
+ gSprites[mapObject->mapobj_unk_1A].data[0] ++;
+ }
+}
+
+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->data[7])
+ {
+ mapObject->mapobj_unk_21 = 2;
+ sprite->data[0] ++;
+ 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->data[0] == 0)
+ {
+ if (sprite->animEnded)
+ {
+ sprite->invisible = TRUE;
+ sprite->data[0] ++;
+ }
+ if (sprite->data[0] == 0)
+ {
+ return;
+ }
+ }
+ if (++ sprite->data[1] >= 35)
+ {
+ FieldEffectStop(sprite, FLDEFF_SPARKLE);
+ }
+}
+
+void sub_81287C4(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ {
+ FieldEffectStop(sprite, sprite->data[1]);
+ }
+ else
+ {
+ sub_806487C(sprite, FALSE);
+ SetObjectSubpriorityByZCoord(sprite->data[0], sprite, 0);
+ }
+}
+
+void sub_8128800(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ {
+ FieldEffectStop(sprite, sprite->data[0]);
+ }
+ 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 e614d899a..5014e97e3 100644
--- a/src/field_fadetransition.c
+++ b/src/field/field_fadetransition.c
@@ -15,9 +15,9 @@
#include "map_obj_lock.h"
#include "metatile_behavior.h"
#include "palette.h"
-#include "rom4.h"
+#include "overworld.h"
#include "script.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "start_menu.h"
#include "task.h"
@@ -40,8 +40,8 @@ void palette_bg_fill_black(void)
void pal_fill_for_map_transition(void)
{
- u8 map_light = get_map_light_from_warp0();
- switch (fade_type_for_given_maplight_pair(map_light, sav1_map_get_light_level()))
+ u8 map_light = get_map_type_from_warp0();
+ switch (fade_type_for_given_maplight_pair(map_light, Overworld_GetMapTypeOfSaveblockLocation()))
{
case 0:
fade_screen(0, 0);
@@ -61,7 +61,7 @@ void pal_fill_black(void)
void fade_8080918(void)
{
- u8 light_level = sav1_map_get_light_level();
+ u8 light_level = Overworld_GetMapTypeOfSaveblockLocation();
switch (sub_810CDB8(light_level, warp1_get_mapheader()->mapType))
{
case 0:
@@ -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);
@@ -327,7 +327,7 @@ void sub_8080DC4(u8 taskId)
}
}
-void atk17_seteffectuser(void)
+void atk17_seteffectsecondary(void)
{
pal_fill_black();
CreateStartMenuTask(sub_8080DC4);
@@ -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);
}
@@ -547,7 +547,7 @@ void sub_808115C(u8 taskId)
case 0:
FreezeMapObjects();
PlayerGetDestCoords(x, y);
- PlaySE(sub_8058790(*x, *y - 1));
+ PlaySE(GetDoorSoundEffect(*x, *y - 1));
task->data[1] = FieldAnimateDoorOpen(*x, *y - 1);
task->data[0] = 1;
break;
diff --git a/src/field/field_ground_effect.c b/src/field/field_ground_effect.c
new file mode 100644
index 000000000..25b678ff9
--- /dev/null
+++ b/src/field/field_ground_effect.c
@@ -0,0 +1,772 @@
+#include "global.h"
+#include "field_ground_effect.h"
+#include "field_effect.h"
+#include "field_effect_helpers.h"
+#include "field_map_obj_helpers.h"
+#include "fieldmap.h"
+#include "metatile_behavior.h"
+
+static void nullsub(struct MapObject *mapObj, struct Sprite *sprite, u8);
+static void DoTracksGroundEffect_Footprints(struct MapObject *mapObj, struct Sprite *sprite, u8);
+static void DoTracksGroundEffect_BikeTireTracks(
+ struct MapObject *mapObj, struct Sprite *sprite, u8);
+void GroundEffect_SpawnOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite);
+void sub_8063E94(struct MapObject *mapObj, struct Sprite *sprite);
+void sub_8063EE0(struct MapObject *mapObj, struct Sprite *sprite);
+void sub_8063F2C(struct MapObject *mapObj, struct Sprite *sprite);
+void GroundEffect_WaterReflection(struct MapObject *mapObj, struct Sprite *sprite);
+void GroundEffect_IceReflection(struct MapObject *mapObj, struct Sprite *sprite);
+void GroundEffect_FlowingWater(struct MapObject *mapObj, struct Sprite *sprite);
+void sub_8063FA0(struct MapObject *mapObj, struct Sprite *sprite);
+void sub_8063FCC(struct MapObject *mapObj, struct Sprite *sprite);
+void GroundEffect_Ripple(struct MapObject *mapObj, struct Sprite *sprite);
+void GroundEffect_StepOnPuddle(struct MapObject *mapObj, struct Sprite *sprite);
+void GroundEffect_SandPile(struct MapObject *mapObj, struct Sprite *sprite);
+void GroundEffect_JumpOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite);
+void GroundEffect_JumpOnLongGrass(struct MapObject *mapObj, struct Sprite *sprite);
+void GroundEffect_JumpOnShallowWater(struct MapObject *mapObj, struct Sprite *sprite);
+void GroundEffect_JumpOnWater(struct MapObject *mapObj, struct Sprite *sprite);
+void GroundEffect_JumpLandingDust(struct MapObject *mapObj, struct Sprite *sprite);
+void GroundEffect_ShortGrass(struct MapObject *mapObj, struct Sprite *sprite);
+void GroundEffect_HotSprings(struct MapObject *mapObj, struct Sprite *sprite);
+void GroundEffect_Seaweed(struct MapObject *mapObj, struct Sprite *sprite);
+u8 GetReflectionTypeByMetatileBehavior(u32 behavior);
+
+static void GetAllGroundEffectFlags_OnSpawn(struct MapObject *mapObj, u32 *flags)
+{
+ FieldObjectUpdateMetatileBehaviors(mapObj);
+ GetGroundEffectFlags_Reflection(mapObj, flags);
+ GetGroundEffectFlags_TallGrassOnSpawn(mapObj, flags);
+ GetGroundEffectFlags_LongGrassOnSpawn(mapObj, flags);
+ GetGroundEffectFlags_SandPile(mapObj, flags);
+ GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags);
+ GetGroundEffectFlags_ShortGrass(mapObj, flags);
+ GetGroundEffectFlags_HotSprings(mapObj, flags);
+}
+
+static void GetAllGroundEffectFlags_OnBeginStep(struct MapObject *mapObj, u32 *flags)
+{
+ FieldObjectUpdateMetatileBehaviors(mapObj);
+ GetGroundEffectFlags_Reflection(mapObj, flags);
+ GetGroundEffectFlags_TallGrassOnBeginStep(mapObj, flags);
+ GetGroundEffectFlags_LongGrassOnBeginStep(mapObj, flags);
+ GetGroundEffectFlags_Tracks(mapObj, flags);
+ GetGroundEffectFlags_SandPile(mapObj, flags);
+ GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags);
+ GetGroundEffectFlags_Puddle(mapObj, flags);
+ GetGroundEffectFlags_ShortGrass(mapObj, flags);
+ GetGroundEffectFlags_HotSprings(mapObj, flags);
+}
+
+static void GetAllGroundEffectFlags_OnFinishStep(struct MapObject *mapObj, u32 *flags)
+{
+ FieldObjectUpdateMetatileBehaviors(mapObj);
+ GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags);
+ GetGroundEffectFlags_SandPile(mapObj, flags);
+ GetGroundEffectFlags_Puddle(mapObj, flags);
+ GetGroundEffectFlags_Ripple(mapObj, flags);
+ GetGroundEffectFlags_ShortGrass(mapObj, flags);
+ GetGroundEffectFlags_HotSprings(mapObj, flags);
+ GetGroundEffectFlags_Seaweed(mapObj, flags);
+ GetGroundEffectFlags_JumpLanding(mapObj, flags);
+}
+
+void FieldObjectUpdateMetatileBehaviors(struct MapObject *mapObj)
+{
+ mapObj->mapobj_unk_1F = MapGridGetMetatileBehaviorAt(mapObj->coords3.x, mapObj->coords3.y);
+ mapObj->mapobj_unk_1E = MapGridGetMetatileBehaviorAt(mapObj->coords2.x, mapObj->coords2.y);
+}
+
+void GetGroundEffectFlags_Reflection(struct MapObject *mapObj, u32 *flags)
+{
+ u32 reflectionFlags[2] = { 0x00000020, 0x00000010 };
+ u8 type = FieldObjectCheckForReflectiveSurface(mapObj);
+
+ if (type)
+ {
+ if (!mapObj->mapobj_bit_17)
+ {
+ mapObj->mapobj_bit_17 = 0;
+ mapObj->mapobj_bit_17 = 1;
+ *flags |= reflectionFlags[type - 1];
+ }
+ }
+ else
+ {
+ mapObj->mapobj_bit_17 = 0;
+ }
+}
+
+void GetGroundEffectFlags_TallGrassOnSpawn(struct MapObject *mapObj, u32 *flags)
+{
+ if (MetatileBehavior_IsTallGrass(mapObj->mapobj_unk_1E))
+ *flags |= 0x1;
+}
+
+void GetGroundEffectFlags_TallGrassOnBeginStep(struct MapObject *mapObj, u32 *flags)
+{
+ if (MetatileBehavior_IsTallGrass(mapObj->mapobj_unk_1E))
+ *flags |= 0x2;
+}
+
+void GetGroundEffectFlags_LongGrassOnSpawn(struct MapObject *mapObj, u32 *flags)
+{
+ if (MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E))
+ *flags |= 0x4;
+}
+
+void GetGroundEffectFlags_LongGrassOnBeginStep(struct MapObject *mapObj, u32 *flags)
+{
+ if (MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E))
+ *flags |= 0x8;
+}
+
+void GetGroundEffectFlags_Tracks(struct MapObject *mapObj, u32 *flags)
+{
+ if (MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1F))
+ {
+ *flags |= 0x100;
+ }
+ else if (MetatileBehavior_IsSandOrDeepSand(mapObj->mapobj_unk_1F)
+ || MetatileBehavior_IsUnusedFootprintMetatile(mapObj->mapobj_unk_1F))
+ {
+ *flags |= 0x80;
+ }
+}
+
+void GetGroundEffectFlags_SandPile(struct MapObject *mapObj, u32 *flags)
+{
+ if (MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1E)
+ && MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1F))
+ {
+ if (!mapObj->mapobj_bit_20)
+ {
+ mapObj->mapobj_bit_20 = 0;
+ mapObj->mapobj_bit_20 = 1;
+ *flags |= 0x800;
+ }
+ }
+ else
+ {
+ mapObj->mapobj_bit_20 = 0;
+ }
+}
+
+void GetGroundEffectFlags_ShallowFlowingWater(struct MapObject *mapObj, u32 *flags)
+{
+ if ((MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1E)
+ && MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1F))
+ || (MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1E)
+ && MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1F)))
+ {
+ if (!mapObj->mapobj_bit_19)
+ {
+ mapObj->mapobj_bit_19 = 0;
+ mapObj->mapobj_bit_19 = 1;
+ *flags |= 0x40;
+ }
+ }
+ else
+ {
+ mapObj->mapobj_bit_19 = 0;
+ }
+}
+
+void GetGroundEffectFlags_Puddle(struct MapObject *mapObj, u32 *flags)
+{
+ if (MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1E)
+ && MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1F))
+ {
+ *flags |= 0x400;
+ }
+}
+
+void GetGroundEffectFlags_Ripple(struct MapObject *mapObj, u32 *flags)
+{
+ if (MetatileBehavior_HasRipples(mapObj->mapobj_unk_1E))
+ *flags |= 0x200;
+}
+
+void GetGroundEffectFlags_ShortGrass(struct MapObject *mapObj, u32 *flags)
+{
+ if (MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1E)
+ && MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1F))
+ {
+ if (!mapObj->mapobj_bit_18)
+ {
+ mapObj->mapobj_bit_18 = 0;
+ mapObj->mapobj_bit_18 = 1;
+ *flags |= 0x20000;
+ }
+ }
+ else
+ {
+ mapObj->mapobj_bit_18 = 0;
+ }
+}
+
+void GetGroundEffectFlags_HotSprings(struct MapObject *mapObj, u32 *flags)
+{
+ if (MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1E)
+ && MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1F))
+ {
+ if (!mapObj->mapobj_bit_21)
+ {
+ mapObj->mapobj_bit_21 = 0;
+ mapObj->mapobj_bit_21 = 1;
+ *flags |= 0x40000;
+ }
+ }
+ else
+ {
+ mapObj->mapobj_bit_21 = 0;
+ }
+}
+
+void GetGroundEffectFlags_Seaweed(struct MapObject *mapObj, u32 *flags)
+{
+ if (MetatileBehavior_IsSeaweed(mapObj->mapobj_unk_1E))
+ *flags |= 0x80000;
+}
+
+void GetGroundEffectFlags_JumpLanding(struct MapObject *mapObj, u32 *flags)
+{
+ typedef bool8 (*MetatileFunc)(u8);
+
+ static const MetatileFunc metatileFuncs[] = {
+ MetatileBehavior_IsTallGrass,
+ MetatileBehavior_IsLongGrass,
+ MetatileBehavior_IsPuddle,
+ MetatileBehavior_IsSurfableWaterOrUnderwater,
+ MetatileBehavior_IsShallowFlowingWater,
+ MetatileBehavior_IsATile,
+ };
+
+ static const u32 jumpLandingFlags[] = {
+ 0x00001000, // Landing in tall grass
+ 0x00002000, // Landing in long grass
+ 0x00004000, // Landing on puddle
+ 0x00008000, // Landing on surfable water or underwater
+ 0x00004000, // Landing on shallow flowing water
+ 0x00010000, // Landing on any other type of ground
+ };
+
+ if (mapObj->mapobj_bit_5 && !mapObj->mapobj_bit_25)
+ {
+ u8 i;
+
+ for (i = 0; i < 6; i++)
+ {
+ if (metatileFuncs[i](mapObj->mapobj_unk_1E))
+ {
+ *flags |= jumpLandingFlags[i];
+ return;
+ }
+ }
+ }
+}
+
+u8 FieldObjectCheckForReflectiveSurface(struct MapObject *mapObj)
+{
+ const struct MapObjectGraphicsInfo *info = GetFieldObjectGraphicsInfo(mapObj->graphicsId);
+
+ // ceil div by tile width?
+ s16 width = (info->width + 8) >> 4;
+ s16 height = (info->height + 8) >> 4;
+ s16 i;
+ s16 j;
+ u8 result;
+ u8 b;
+ s16 one;
+
+#define RETURN_REFLECTION_TYPE_AT(x, y) \
+ b = MapGridGetMetatileBehaviorAt(x, y); \
+ result = GetReflectionTypeByMetatileBehavior(b); \
+ if (result != 0) \
+ return result;
+
+ for (i = 0, one = 1; i < height; i++)
+ {
+ RETURN_REFLECTION_TYPE_AT(mapObj->coords2.x, mapObj->coords2.y + one + i)
+ RETURN_REFLECTION_TYPE_AT(mapObj->coords3.x, mapObj->coords3.y + one + i)
+ for (j = 1; j < width; j++)
+ {
+ RETURN_REFLECTION_TYPE_AT(mapObj->coords2.x + j, mapObj->coords2.y + one + i)
+ RETURN_REFLECTION_TYPE_AT(mapObj->coords2.x - j, mapObj->coords2.y + one + i)
+ RETURN_REFLECTION_TYPE_AT(mapObj->coords3.x + j, mapObj->coords3.y + one + i)
+ RETURN_REFLECTION_TYPE_AT(mapObj->coords3.x - j, mapObj->coords3.y + one + i)
+ }
+ }
+ return 0;
+
+#undef RETURN_REFLECTION_TYPE_AT
+}
+
+u8 GetReflectionTypeByMetatileBehavior(u32 behavior)
+{
+ if (MetatileBehavior_IsIce(behavior))
+ return 1;
+ else if (MetatileBehavior_IsReflective(behavior))
+ return 2;
+ else
+ return 0;
+}
+
+u8 GetLedgeJumpDirection(s16 x, s16 y, u8 z)
+{
+ static bool8 (*const unknown_08376040[])(u8) = {
+ MetatileBehavior_IsJumpSouth,
+ MetatileBehavior_IsJumpNorth,
+ MetatileBehavior_IsJumpWest,
+ MetatileBehavior_IsJumpEast,
+ };
+
+ u8 b;
+ u8 index = z;
+
+ if (index == 0)
+ return 0;
+ else if (index > 4)
+ index -= 4;
+
+ index--;
+ b = MapGridGetMetatileBehaviorAt(x, y);
+
+ if (unknown_08376040[index](b) == 1)
+ return index + 1;
+
+ return 0;
+}
+
+void FieldObjectSetSpriteOamTableForLongGrass(struct MapObject *mapObj, struct Sprite *sprite)
+{
+ if (mapObj->mapobj_bit_4)
+ return;
+
+ if (!MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E))
+ return;
+
+ if (!MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1F))
+ return;
+
+ sprite->subspriteTableNum = 4;
+
+ if (ZCoordToPriority(mapObj->elevation) == 1)
+ sprite->subspriteTableNum = 5;
+}
+
+bool8 IsZCoordMismatchAt(u8 z, s16 x, s16 y)
+{
+ u8 mapZ;
+
+ if (z == 0)
+ return FALSE;
+
+ mapZ = MapGridGetZCoordAt(x, y);
+
+ if (mapZ == 0 || mapZ == 0xF)
+ return FALSE;
+
+ if (mapZ != z)
+ return TRUE;
+
+ return FALSE;
+}
+
+static const u8 sUnknown_08376050[] = {
+ 0x73, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x00, 0x00, 0x73
+};
+
+// Each byte corresponds to a sprite priority for a field object.
+// This is directly the inverse of gFieldObjectPriorities_08376070.
+static const u8 sFieldObjectPriorities_08376060[] = {
+ 2, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0, 2
+};
+
+// Each byte corresponds to a sprite priority for a field object.
+// This is the inverse of gFieldObjectPriorities_08376060.
+// 1 = Above player sprite
+// 2 = Below player sprite
+static const u8 sFieldObjectPriorities_08376070[] = {
+ 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 1,
+};
+
+void FieldObjectUpdateZCoordAndPriority(struct MapObject *mapObj, struct Sprite *sprite)
+{
+ if (mapObj->mapobj_bit_26)
+ return;
+
+ FieldObjectUpdateZCoord(mapObj);
+
+ sprite->subspriteTableNum = sFieldObjectPriorities_08376070[mapObj->elevation];
+ sprite->oam.priority = sFieldObjectPriorities_08376060[mapObj->elevation];
+}
+
+void InitObjectPriorityByZCoord(struct Sprite *sprite, u8 z)
+{
+ sprite->subspriteTableNum = sFieldObjectPriorities_08376070[z];
+ sprite->oam.priority = sFieldObjectPriorities_08376060[z];
+}
+
+u8 ZCoordToPriority(u8 z)
+{
+ return sFieldObjectPriorities_08376060[z];
+}
+
+void FieldObjectUpdateZCoord(struct MapObject *mapObj)
+{
+ u8 z = MapGridGetZCoordAt(mapObj->coords2.x, mapObj->coords2.y);
+ u8 z2 = MapGridGetZCoordAt(mapObj->coords3.x, mapObj->coords3.y);
+
+ if (z == 0xF || z2 == 0xF)
+ return;
+
+ mapObj->mapobj_unk_0B_0 = z;
+
+ if (z != 0 && z != 0xF)
+ mapObj->elevation = z;
+}
+
+void SetObjectSubpriorityByZCoord(u8 a, struct Sprite *sprite, u8 b)
+{
+ s32 tmp = sprite->centerToCornerVecY;
+ u32 tmpa = *(u16 *)&sprite->pos1.y;
+ u32 tmpb = *(u16 *)&gSpriteCoordOffsetY;
+ s32 tmp2 = (tmpa - tmp) + tmpb;
+ u16 tmp3 = (0x10 - ((((u32)tmp2 + 8) & 0xFF) >> 4)) * 2;
+ sprite->subpriority = tmp3 + sUnknown_08376050[a] + b;
+}
+
+void FieldObjectUpdateSubpriority(struct MapObject *mapObj, struct Sprite *sprite)
+{
+ if (mapObj->mapobj_bit_26)
+ return;
+
+ SetObjectSubpriorityByZCoord(mapObj->elevation, sprite, 1);
+}
+
+bool8 AreZCoordsCompatible(u8 a, u8 b)
+{
+ if (a == 0 || b == 0)
+ return TRUE;
+
+ if (a != b)
+ return FALSE;
+
+ return TRUE;
+}
+
+void GroundEffect_SpawnOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite)
+{
+ 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;
+ gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup;
+ gFieldEffectArguments[7] = 1;
+ FieldEffectStart(FLDEFF_TALL_GRASS);
+}
+
+void sub_8063E94(struct MapObject *mapObj, struct Sprite *sprite)
+{
+ 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;
+ gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup;
+ gFieldEffectArguments[7] = 0;
+ FieldEffectStart(FLDEFF_TALL_GRASS);
+}
+
+void sub_8063EE0(struct MapObject *mapObj, struct Sprite *sprite)
+{
+ 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;
+ gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup;
+ gFieldEffectArguments[7] = 1;
+ FieldEffectStart(FLDEFF_LONG_GRASS);
+}
+
+void sub_8063F2C(struct MapObject *mapObj, struct Sprite *sprite)
+{
+ 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;
+ gFieldEffectArguments[6] = (u8)gSaveBlock1.location.mapNum << 8 | (u8)gSaveBlock1.location.mapGroup;
+ gFieldEffectArguments[7] = 0;
+ FieldEffectStart(FLDEFF_LONG_GRASS);
+}
+
+void GroundEffect_WaterReflection(struct MapObject *mapObj, struct Sprite *sprite)
+{
+ SetUpReflection(mapObj, sprite, 0);
+}
+
+void GroundEffect_IceReflection(struct MapObject *mapObj, struct Sprite *sprite)
+{
+ SetUpReflection(mapObj, sprite, 1);
+}
+
+void GroundEffect_FlowingWater(struct MapObject *mapObj, struct Sprite *sprite)
+{
+ oe_exec_and_other_stuff(FLDEFF_FEET_IN_FLOWING_WATER, mapObj);
+}
+
+static void (*const gUnknown_08376080[])(struct MapObject *mapObj, struct Sprite *sprite, u8 a) = {
+ nullsub, DoTracksGroundEffect_Footprints, DoTracksGroundEffect_BikeTireTracks,
+};
+
+void sub_8063FA0(struct MapObject *mapObj, struct Sprite *sprite)
+{
+ const struct MapObjectGraphicsInfo *info = GetFieldObjectGraphicsInfo(mapObj->graphicsId);
+ gUnknown_08376080[info->tracks](mapObj, sprite, 0);
+}
+
+void sub_8063FCC(struct MapObject *mapObj, struct Sprite *sprite)
+{
+ const struct MapObjectGraphicsInfo *info = GetFieldObjectGraphicsInfo(mapObj->graphicsId);
+ gUnknown_08376080[info->tracks](mapObj, sprite, 1);
+}
+
+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] = {
+ FLDEFF_SAND_FOOTPRINTS,
+ FLDEFF_DEEP_SAND_FOOTPRINTS
+ };
+
+ gFieldEffectArguments[0] = mapObj->coords3.x;
+ gFieldEffectArguments[1] = mapObj->coords3.y;
+ gFieldEffectArguments[2] = 149;
+ gFieldEffectArguments[3] = 2;
+ gFieldEffectArguments[4] = mapObj->mapobj_unk_18;
+ FieldEffectStart(sandFootprints_FieldEffectData[a]);
+}
+
+static void DoTracksGroundEffect_BikeTireTracks(
+ struct MapObject *mapObj, struct Sprite *sprite, u8 a)
+{
+ // Specifies which bike track shape to show next.
+ // For example, when the bike turns from up to right, it will show
+ // a track that curves to the right.
+ // Each 4-byte row corresponds to the initial direction of the bike, and
+ // each byte in that row is for the next direction of the bike in the order
+ // of down, up, left, right.
+ static const u8 bikeTireTracks_Transitions[4][4] = {
+ 1, 2, 7, 8,
+ 1, 2, 6, 5,
+ 5, 8, 3, 4,
+ 6, 7, 3, 4,
+ };
+
+ if (mapObj->coords2.x != mapObj->coords3.x || mapObj->coords2.y != mapObj->coords3.y)
+ {
+ gFieldEffectArguments[0] = mapObj->coords3.x;
+ gFieldEffectArguments[1] = mapObj->coords3.y;
+ gFieldEffectArguments[2] = 149;
+ gFieldEffectArguments[3] = 2;
+ gFieldEffectArguments[4] =
+ bikeTireTracks_Transitions[mapObj->mapobj_unk_20][mapObj->mapobj_unk_18 - 5];
+ FieldEffectStart(FLDEFF_BIKE_TIRE_TRACKS);
+ }
+}
+
+void GroundEffect_Ripple(struct MapObject *mapObj, struct Sprite *sprite)
+{
+ DoRippleFieldEffect(mapObj, sprite);
+}
+
+void GroundEffect_StepOnPuddle(struct MapObject *mapObj, struct Sprite *sprite)
+{
+ oe_exec_and_other_stuff(FLDEFF_SPLASH, mapObj);
+}
+
+void GroundEffect_SandPile(struct MapObject *mapObj, struct Sprite *sprite)
+{
+ oe_exec_and_other_stuff(FLDEFF_SAND_PILE, mapObj);
+}
+
+void GroundEffect_JumpOnTallGrass(struct MapObject *mapObj, struct Sprite *sprite)
+{
+ u8 spriteId;
+
+ gFieldEffectArguments[0] = mapObj->coords2.x;
+ gFieldEffectArguments[1] = mapObj->coords2.y;
+ gFieldEffectArguments[2] = mapObj->elevation;
+ gFieldEffectArguments[3] = 2;
+ FieldEffectStart(FLDEFF_JUMP_TALL_GRASS);
+
+ spriteId = sub_8126FF0(
+ mapObj->localId, mapObj->mapNum, mapObj->mapGroup, mapObj->coords2.x, mapObj->coords2.y);
+
+ if (spriteId == MAX_SPRITES)
+ GroundEffect_SpawnOnTallGrass(mapObj, sprite);
+}
+
+void GroundEffect_JumpOnLongGrass(struct MapObject *mapObj, struct Sprite *sprite)
+{
+ gFieldEffectArguments[0] = mapObj->coords2.x;
+ gFieldEffectArguments[1] = mapObj->coords2.y;
+ gFieldEffectArguments[2] = mapObj->elevation;
+ gFieldEffectArguments[3] = 2;
+ FieldEffectStart(FLDEFF_JUMP_LONG_GRASS);
+}
+
+void GroundEffect_JumpOnShallowWater(struct MapObject *mapObj, struct Sprite *sprite)
+{
+ gFieldEffectArguments[0] = mapObj->coords2.x;
+ gFieldEffectArguments[1] = mapObj->coords2.y;
+ gFieldEffectArguments[2] = mapObj->elevation;
+ gFieldEffectArguments[3] = sprite->oam.priority;
+ FieldEffectStart(FLDEFF_JUMP_SMALL_SPLASH);
+}
+
+void GroundEffect_JumpOnWater(struct MapObject *mapObj, struct Sprite *sprite)
+{
+ gFieldEffectArguments[0] = mapObj->coords2.x;
+ gFieldEffectArguments[1] = mapObj->coords2.y;
+ gFieldEffectArguments[2] = mapObj->elevation;
+ gFieldEffectArguments[3] = sprite->oam.priority;
+ FieldEffectStart(FLDEFF_JUMP_BIG_SPLASH);
+}
+
+void GroundEffect_JumpLandingDust(struct MapObject *mapObj, struct Sprite *sprite)
+{
+ gFieldEffectArguments[0] = mapObj->coords2.x;
+ gFieldEffectArguments[1] = mapObj->coords2.y;
+ gFieldEffectArguments[2] = mapObj->elevation;
+ gFieldEffectArguments[3] = sprite->oam.priority;
+ FieldEffectStart(FLDEFF_DUST);
+}
+
+void GroundEffect_ShortGrass(struct MapObject *mapObj, struct Sprite *sprite)
+{
+ oe_exec_and_other_stuff(FLDEFF_SHORT_GRASS, mapObj);
+}
+
+void GroundEffect_HotSprings(struct MapObject *mapObj, struct Sprite *sprite)
+{
+ oe_exec_and_other_stuff(FLDEFF_HOT_SPRINGS_WATER, mapObj);
+}
+
+void GroundEffect_Seaweed(struct MapObject *mapObj, struct Sprite *sprite)
+{
+ gFieldEffectArguments[0] = mapObj->coords2.x;
+ gFieldEffectArguments[1] = mapObj->coords2.y;
+ FieldEffectStart(FLDEFF_BUBBLES);
+}
+
+static void (*const gUnknown_083760A0[])(struct MapObject *mapObj, struct Sprite *sprite) = {
+ GroundEffect_SpawnOnTallGrass,
+ sub_8063E94,
+ sub_8063EE0,
+ sub_8063F2C,
+ GroundEffect_WaterReflection,
+ GroundEffect_IceReflection,
+ GroundEffect_FlowingWater,
+ sub_8063FA0,
+ sub_8063FCC,
+ GroundEffect_Ripple,
+ GroundEffect_StepOnPuddle,
+ GroundEffect_SandPile,
+ GroundEffect_JumpOnTallGrass,
+ GroundEffect_JumpOnLongGrass,
+ GroundEffect_JumpOnShallowWater,
+ GroundEffect_JumpOnWater,
+ GroundEffect_JumpLandingDust,
+ GroundEffect_ShortGrass,
+ GroundEffect_HotSprings,
+ GroundEffect_Seaweed
+};
+
+void sub_8064218(struct MapObject *mapObj, struct Sprite *sprite, u32 flags)
+{
+ u8 i;
+ for (i = 0; i < ARRAY_COUNT(gUnknown_083760A0); i++, flags >>= 1)
+ if (flags & 1)
+ gUnknown_083760A0[i](mapObj, sprite);
+}
+
+void filters_out_some_ground_effects(struct MapObject *mapObj, u32 *flags)
+{
+ if (mapObj->mapobj_bit_4)
+ {
+ mapObj->mapobj_bit_18 = 0;
+ mapObj->mapobj_bit_20 = 0;
+ mapObj->mapobj_bit_19 = 0;
+ mapObj->mapobj_bit_21 = 0;
+ *flags &= 0xFFF9F7BD;
+ }
+}
+
+void FilterOutStepOnPuddleGroundEffectIfJumping(struct MapObject *mapObj, u32 *flags)
+{
+ if (mapObj->mapobj_bit_5)
+ *flags &= 0xFFFFFBFF;
+}
+
+void DoGroundEffects_OnSpawn(struct MapObject *mapObj, struct Sprite *sprite)
+{
+ u32 flags;
+
+ if (mapObj->mapobj_bit_2)
+ {
+ flags = 0;
+ FieldObjectUpdateZCoordAndPriority(mapObj, sprite);
+ GetAllGroundEffectFlags_OnSpawn(mapObj, &flags);
+ FieldObjectSetSpriteOamTableForLongGrass(mapObj, sprite);
+ sub_8064218(mapObj, sprite, flags);
+ mapObj->mapobj_bit_2 = 0;
+ mapObj->mapobj_bit_4 = 0;
+ }
+}
+
+void DoGroundEffects_OnBeginStep(struct MapObject *mapObj, struct Sprite *sprite)
+{
+ u32 flags;
+
+ if (mapObj->mapobj_bit_2)
+ {
+ flags = 0;
+ FieldObjectUpdateZCoordAndPriority(mapObj, sprite);
+ GetAllGroundEffectFlags_OnBeginStep(mapObj, &flags);
+ FieldObjectSetSpriteOamTableForLongGrass(mapObj, sprite);
+ filters_out_some_ground_effects(mapObj, &flags);
+ sub_8064218(mapObj, sprite, flags);
+ mapObj->mapobj_bit_2 = 0;
+ mapObj->mapobj_bit_4 = 0;
+ }
+}
+
+void DoGroundEffects_OnFinishStep(struct MapObject *mapObj, struct Sprite *sprite)
+{
+ u32 flags;
+
+ if (mapObj->mapobj_bit_3)
+ {
+ flags = 0;
+ FieldObjectUpdateZCoordAndPriority(mapObj, sprite);
+ GetAllGroundEffectFlags_OnFinishStep(mapObj, &flags);
+ FieldObjectSetSpriteOamTableForLongGrass(mapObj, sprite);
+ FilterOutStepOnPuddleGroundEffectIfJumping(mapObj, &flags);
+ sub_8064218(mapObj, sprite, flags);
+ mapObj->mapobj_bit_3 = 0;
+ mapObj->mapobj_bit_5 = 0;
+ }
+}
diff --git a/src/field_map_obj.c b/src/field/field_map_obj.c
index f60b1b233..77b4c8b5c 100644
--- a/src/field_map_obj.c
+++ b/src/field/field_map_obj.c
@@ -10,12 +10,12 @@
#include "field_player_avatar.h"
#include "fieldmap.h"
#include "palette.h"
-#include "rng.h"
-#include "rom4.h"
+#include "random.h"
+#include "overworld.h"
#include "sprite.h"
#include "metatile_behavior.h"
-#include "map_constants.h"
-#include "map_object_constants.h"
+#include "constants/maps.h"
+#include "constants/map_objects.h"
#include "trainer_see.h"
// rodata
@@ -1354,7 +1354,7 @@ const u32 gFieldEffectPic_ShadowMedium[] = INCBIN_U32("graphics/field_effect_obj
const u32 gFieldEffectPic_ShadowLarge[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_large.4bpp");
const u32 gFieldEffectPic_ShadowExtraLarge[] = INCBIN_U32("graphics/field_effect_objects/pics/shadow_extra_large.4bpp");
const u32 filler_8368A08[0x48] = {};
-const u32 gFieldEffectPic_CutGrass[] = INCBIN_U32("graphics/field_effect_objects/pics/cut_grass.4bpp");
+const u8 gFieldEffectPic_CutGrass[] = INCBIN_U8("graphics/field_effect_objects/pics/cut_grass.4bpp");
const u32 FieldEffectPic_CutGrass_Copy[] = INCBIN_U32("graphics/field_effect_objects/pics/cut_grass.4bpp");
const u16 gFieldEffectObjectPalette6[] = INCBIN_U16("graphics/field_effect_objects/palettes/06.gbapal");
const u32 gFieldEffectPic_Ripple_0[] = INCBIN_U32("graphics/field_effect_objects/pics/ripple/0.4bpp");
@@ -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;
@@ -2020,7 +2020,7 @@ u8 GetFieldObjectIdByLocalId(u8 localId)
#ifdef NONMATCHING
u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c)
{
- struct MapObject2 *mapObj; //TODO: resolve the mapobj_unk_19b weirdness
+ struct MapObject *mapObj; //TODO: resolve the mapobj_unk_19b weirdness
u8 var;
u16 r3;
u16 r2;
@@ -2029,8 +2029,8 @@ u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8
if (GetAvailableFieldObjectSlot(template->localId, b, c, &var) != 0)
return 16;
//_0805ACCE
- mapObj = (struct MapObject2 *)&gMapObjects[var];
- npc_clear_ids_and_state((struct MapObject *)mapObj);
+ mapObj = &gMapObjects[var];
+ npc_clear_ids_and_state(mapObj);
r3 = template->x + 7;
r2 = template->y + 7;
mapObj->active = TRUE;
@@ -2048,8 +2048,8 @@ u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8
mapObj->coords3.y = r2;
mapObj->mapobj_unk_0B_0 = template->elevation;
mapObj->elevation = template->elevation;
- mapObj->mapobj_unk_19 = template->unkA_0;
- mapObj->mapobj_unk_19b = template->unkA_4;
+ mapObj->range.as_nybbles.x = template->unkA_0;
+ mapObj->range.as_nybbles.y = template->unkA_4;
mapObj->trainerType = template->unkC;
mapObj->trainerRange_berryTreeId = template->unkE;
mapObj->mapobj_unk_20 = gUnknown_0836DC09[template->movementType];
@@ -2058,10 +2058,10 @@ u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8
//asm("":::"r5","r6");
if (gUnknown_0836DBBC[mapObj->animPattern] != 0)
{
- if (mapObj->mapobj_unk_19 == 0)
- mapObj->mapobj_unk_19++;
- if (mapObj->mapobj_unk_19b == 0)
- mapObj->mapobj_unk_19b++;
+ if (mapObj->range.as_nybbles.x == 0)
+ mapObj->range.as_nybbles.x++;
+ if (mapObj->range.as_nybbles.y == 0)
+ mapObj->range.as_nybbles.y++;
}
return var;
}
@@ -2343,7 +2343,7 @@ u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *
sprite->pos1.y += 16 + sprite->centerToCornerVecY;
sprite->oam.paletteNum = gfxInfo->paletteSlot;
sprite->coordOffsetEnabled = TRUE;
- sprite->data0 = mapObjectId;
+ sprite->data[0] = mapObjectId;
mapObject->spriteId = spriteId;
mapObject->mapobj_bit_12 = gfxInfo->inanimate;
if (!mapObject->mapobj_bit_12)
@@ -2440,7 +2440,7 @@ void MakeObjectTemplateFromFieldObjectTemplate(struct MapObjectTemplate *mapObjT
MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(mapObjTemplate->graphicsId, mapObjTemplate->movementType, sprTemplate, subspriteTables);
}
-u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 c, s16 d, u8 subpriority)
+u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority)
{
struct SpriteTemplate spriteTemplate;
const struct SubspriteTable *subspriteTables;
@@ -2449,7 +2449,7 @@ u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 c
MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, callback, &spriteTemplate, &subspriteTables);
if (spriteTemplate.paletteTag != 0xFFFF)
sub_805BDF8(spriteTemplate.paletteTag);
- spriteId = CreateSprite(&spriteTemplate, c, d, subpriority);
+ spriteId = CreateSprite(&spriteTemplate, x, y, subpriority);
if (spriteId != 64 && subspriteTables != NULL)
{
SetSubspriteTables(&gSprites[spriteId], subspriteTables);
@@ -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];
@@ -2489,8 +2489,8 @@ u8 sub_805B410(u8 a, u8 b, s16 c, s16 d, u8 e, u8 f)
sprite->pos1.y += sprite->centerToCornerVecY;
sprite->oam.paletteNum = gfxInfo->paletteSlot;
sprite->coordOffsetEnabled = TRUE;
- sprite->data0 = b;
- sprite->data1 = e;
+ sprite->data[0] = b;
+ sprite->data[1] = 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;
}
@@ -2640,7 +2640,7 @@ void sub_805B75C(u8 a, s16 b, s16 c)
SetSubspriteTables(sprite, subspriteTables);
sprite->oam.paletteNum = gfxInfo->paletteSlot;
sprite->coordOffsetEnabled = TRUE;
- sprite->data0 = a;
+ sprite->data[0] = a;
mapObject->spriteId = spriteId;
if (!mapObject->mapobj_bit_12 && mapObject->animPattern != 11)
StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18));
@@ -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;
}
}
}
@@ -3045,7 +3042,7 @@ u8 AddCameraObject(u8 a)
u8 spriteId = CreateSprite(&gSpriteTemplate_830FD24, 0, 0, 4);
gSprites[spriteId].invisible = TRUE;
- gSprites[spriteId].data0 = a;
+ gSprites[spriteId].data[0] = a;
return spriteId;
}
@@ -3053,35 +3050,35 @@ void ObjectCB_CameraObject(struct Sprite *sprite)
{
void (*cameraObjectFuncs[3])(struct Sprite *);
memcpy(cameraObjectFuncs, gCameraObjectFuncs, sizeof gCameraObjectFuncs);
- cameraObjectFuncs[sprite->data1](sprite);
+ cameraObjectFuncs[sprite->data[1]](sprite);
}
void CameraObject_0(struct Sprite *sprite)
{
- sprite->pos1.x = gSprites[sprite->data0].pos1.x;
- sprite->pos1.y = gSprites[sprite->data0].pos1.y;
+ sprite->pos1.x = gSprites[sprite->data[0]].pos1.x;
+ sprite->pos1.y = gSprites[sprite->data[0]].pos1.y;
sprite->invisible = TRUE;
- sprite->data1 = 1;
+ sprite->data[1] = 1;
CameraObject_1(sprite);
}
void CameraObject_1(struct Sprite *sprite)
{
- s16 x = gSprites[sprite->data0].pos1.x;
- s16 y = gSprites[sprite->data0].pos1.y;
+ s16 x = gSprites[sprite->data[0]].pos1.x;
+ s16 y = gSprites[sprite->data[0]].pos1.y;
- sprite->data2 = x - sprite->pos1.x;
- sprite->data3 = y - sprite->pos1.y;
+ sprite->data[2] = x - sprite->pos1.x;
+ sprite->data[3] = y - sprite->pos1.y;
sprite->pos1.x = x;
sprite->pos1.y = y;
}
void CameraObject_2(struct Sprite *sprite)
{
- sprite->pos1.x = gSprites[sprite->data0].pos1.x;
- sprite->pos1.y = gSprites[sprite->data0].pos1.y;
- sprite->data2 = 0;
- sprite->data3 = 0;
+ sprite->pos1.x = gSprites[sprite->data[0]].pos1.x;
+ sprite->pos1.y = gSprites[sprite->data[0]].pos1.y;
+ sprite->data[2] = 0;
+ sprite->data[3] = 0;
}
struct Sprite *FindCameraObject(void)
@@ -3102,7 +3099,7 @@ void CameraObjectReset1(void)
if (cameraSprite != NULL)
{
- cameraSprite->data1 = 0;
+ cameraSprite->data[1] = 0;
cameraSprite->callback(cameraSprite);
}
}
@@ -3113,7 +3110,7 @@ void CameraObjectSetFollowedObjectId(u8 spriteId)
if (cameraSprite != NULL)
{
- cameraSprite->data0 = spriteId;
+ cameraSprite->data[0] = spriteId;
CameraObjectReset1();
}
}
@@ -3125,14 +3122,14 @@ u8 CameraObjectGetFollowedObjectId(void)
if (cameraSprite == NULL)
return 64;
else
- return cameraSprite->data0;
+ return cameraSprite->data[0];
}
void CameraObjectReset2(void)
{
struct Sprite *cameraSprite = FindCameraObject();
- cameraSprite->data1 = 2;
+ cameraSprite->data[1] = 2;
}
u8 unref_sub_805C43C(struct Sprite *src, s16 x, s16 y, u8 subpriority)
@@ -3244,7 +3241,7 @@ struct MapObjectTemplate *GetFieldObjectTemplateByLocalIdAndMap(u8 localId, u8 m
return FindFieldObjectTemplateInArrayByLocalId(localId, gSaveBlock1.mapObjectTemplates, gMapHeader.events->mapObjectCount);
else
{
- struct MapHeader *mapHeader = get_mapheader_by_bank_and_number(mapGroup, mapNum);
+ struct MapHeader *mapHeader = Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum);
return FindFieldObjectTemplateInArrayByLocalId(localId, mapHeader->events->mapObjects, mapHeader->events->mapObjectCount);
}
@@ -3336,7 +3333,7 @@ fieldmap_object_cb(sub_805C8AC, sub_805C8D0, gUnknown_08375224);
u8 sub_805C8F0(struct MapObject *mapObject, struct Sprite *sprite)
{
npc_reset(mapObject, sprite);
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
@@ -3345,7 +3342,7 @@ extern void FieldObjectSetRegularAnim(struct MapObject *, struct Sprite *, u8);
u8 sub_805C904(struct MapObject *mapObject, struct Sprite *sprite)
{
FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 2;
+ sprite->data[1] = 2;
return 1;
}
@@ -3359,7 +3356,7 @@ u8 sub_805C930(struct MapObject *mapObject, struct Sprite *sprite)
return 0;
}
sub_8064820(sprite, gUnknown_0837520C[Random() & 3]);
- sprite->data1 = 3;
+ sprite->data[1] = 3;
return 1;
}
@@ -3369,7 +3366,7 @@ u8 sub_805C96C(struct MapObject *mapObject, struct Sprite *sprite)
{
if (sub_8064824(sprite) != 0)
{
- sprite->data1 = 4;
+ sprite->data[1] = 4;
return 1;
}
return 0;
@@ -3384,10 +3381,10 @@ u8 sub_805C98C(struct MapObject *mapObject, struct Sprite *sprite)
memcpy(directions, gUnknown_08375240, 4);
direction = directions[Random() & 3];
FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 5;
+ sprite->data[1] = 5;
if (sub_805FF20(mapObject, direction) != 0)
{
- sprite->data1 = 1;
+ sprite->data[1] = 1;
}
return 1;
}
@@ -3396,7 +3393,7 @@ u8 sub_805C9D8(struct MapObject *mapObject, struct Sprite *sprite)
{
FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18));
mapObject->mapobj_bit_1 = 1;
- sprite->data1 = 6;
+ sprite->data[1] = 6;
return 1;
}
@@ -3405,7 +3402,7 @@ u8 sub_805CA08(struct MapObject *mapObject, struct Sprite *sprite)
if (FieldObjectExecRegularAnim(mapObject, sprite) != 0)
{
mapObject->mapobj_bit_1 = 0;
- sprite->data1 = 1;
+ sprite->data[1] = 1;
}
return 0;
}
@@ -3652,14 +3649,14 @@ fieldmap_object_cb(sub_805CDE8, sub_805CE0c, gUnknown_08375270);
u8 sub_805CE2C(struct MapObject *mapObject, struct Sprite *sprite)
{
npc_reset(mapObject, sprite);
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
u8 sub_805CE40(struct MapObject *mapObject, struct Sprite *sprite)
{
FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 2;
+ sprite->data[1] = 2;
return 1;
}
@@ -3669,7 +3666,7 @@ u8 sub_805CE6C(struct MapObject *mapObject, struct Sprite *sprite)
{
sub_8064820(sprite, gUnknown_0837520C[Random() & 3]);
mapObject->mapobj_bit_1 = 0;
- sprite->data1 = 3;
+ sprite->data[1] = 3;
}
return 0;
}
@@ -3678,7 +3675,7 @@ u8 sub_805CEB0(struct MapObject *mapObject, struct Sprite *sprite)
{
if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
{
- sprite->data1 = 4;
+ sprite->data[1] = 4;
return 1;
}
return 0;
@@ -3695,7 +3692,7 @@ u8 sub_805CEE0(struct MapObject *mapObject, struct Sprite *sprite)
direction = directions[Random() & 3];
}
FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
@@ -3704,14 +3701,14 @@ fieldmap_object_cb(sub_805CF28, sub_805CF4C, gUnknown_08375284);
u8 sub_805CF6C(struct MapObject *mapObject, struct Sprite *sprite)
{
npc_reset(mapObject, sprite);
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
u8 sub_805CF80(struct MapObject *mapObject, struct Sprite *sprite)
{
FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 2;
+ sprite->data[1] = 2;
return 1;
}
@@ -3722,7 +3719,7 @@ u8 sub_805CFAC(struct MapObject *mapObject, struct Sprite *sprite)
return 0;
}
sub_8064820(sprite, gUnknown_0837520C[Random() & 3]);
- sprite->data1 = 3;
+ sprite->data[1] = 3;
return 1;
}
@@ -3730,7 +3727,7 @@ u8 sub_805CFE8(struct MapObject *mapObject, struct Sprite *sprite)
{
if (sub_8064824(sprite) != 0)
{
- sprite->data1 = 4;
+ sprite->data[1] = 4;
return 1;
}
return 0;
@@ -3743,10 +3740,10 @@ u8 sub_805D008(struct MapObject *mapObject, struct Sprite *sprite)
memcpy(directions, gUnknown_083752A0, 2);
direction = directions[Random() & 1];
FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 5;
+ sprite->data[1] = 5;
if (sub_805FF20(mapObject, direction) != 0)
{
- sprite->data1 = 1;
+ sprite->data[1] = 1;
}
return 1;
}
@@ -3755,7 +3752,7 @@ u8 sub_805D054(struct MapObject *mapObject, struct Sprite *sprite)
{
FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18));
mapObject->mapobj_bit_1 = 1;
- sprite->data1 = 6;
+ sprite->data[1] = 6;
return 1;
}
@@ -3764,7 +3761,7 @@ u8 sub_805D084(struct MapObject *mapObject, struct Sprite *sprite)
if (FieldObjectExecRegularAnim(mapObject, sprite) != 0)
{
mapObject->mapobj_bit_1 = 0;
- sprite->data1 = 1;
+ sprite->data[1] = 1;
}
return 0;
}
@@ -3774,14 +3771,14 @@ fieldmap_object_cb(sub_805D0AC, sub_805D0D0, gUnknown_083752A4);
u8 sub_805D0F0(struct MapObject *mapObject, struct Sprite *sprite)
{
npc_reset(mapObject, sprite);
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
u8 sub_805D104(struct MapObject *mapObject, struct Sprite *sprite)
{
FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 2;
+ sprite->data[1] = 2;
return 1;
}
@@ -3792,7 +3789,7 @@ u8 sub_805D130(struct MapObject *mapObject, struct Sprite *sprite)
return 0;
}
sub_8064820(sprite, gUnknown_0837520C[Random() & 3]);
- sprite->data1 = 3;
+ sprite->data[1] = 3;
return 1;
}
@@ -3800,7 +3797,7 @@ u8 sub_805D16C(struct MapObject *mapObject, struct Sprite *sprite)
{
if (sub_8064824(sprite) != 0)
{
- sprite->data1 = 4;
+ sprite->data[1] = 4;
return 1;
}
return 0;
@@ -3813,10 +3810,10 @@ u8 sub_805D18C(struct MapObject *mapObject, struct Sprite *sprite)
memcpy(directions, gUnknown_083752C0, 2);
direction = directions[Random() & 1];
FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 5;
+ sprite->data[1] = 5;
if (sub_805FF20(mapObject, direction) != 0)
{
- sprite->data1 = 1;
+ sprite->data[1] = 1;
}
return 1;
}
@@ -3825,7 +3822,7 @@ u8 sub_805D1D8(struct MapObject *mapObject, struct Sprite *sprite)
{
FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18));
mapObject->mapobj_bit_1 = 1;
- sprite->data1 = 6;
+ sprite->data[1] = 6;
return 1;
}
@@ -3834,7 +3831,7 @@ u8 sub_805D208(struct MapObject *mapObject, struct Sprite *sprite)
if (FieldObjectExecRegularAnim(mapObject, sprite) != 0)
{
mapObject->mapobj_bit_1 = 0;
- sprite->data1 = 1;
+ sprite->data[1] = 1;
}
return 0;
}
@@ -3845,7 +3842,7 @@ u8 sub_805D274(struct MapObject *mapObject, struct Sprite *sprite)
{
npc_reset(mapObject, sprite);
FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
@@ -3853,7 +3850,7 @@ u8 sub_805D2A0(struct MapObject *mapObject, struct Sprite *sprite)
{
if (FieldObjectExecRegularAnim(mapObject, sprite) != 0)
{
- sprite->data1 = 2;
+ sprite->data[1] = 2;
return 1;
}
return 0;
@@ -3870,18 +3867,18 @@ u8 sub_805D314(struct MapObject *mapObject, struct Sprite *sprite);
void FieldObjectCB_BerryTree(struct Sprite *sprite)
{
struct MapObject *mapObject;
- mapObject = &gMapObjects[sprite->data0];
- if (!(sprite->data7 & 1))
+ mapObject = &gMapObjects[sprite->data[0]];
+ if (!(sprite->data[7] & 1))
{
get_berry_tree_graphics(mapObject, sprite);
- sprite->data7 |= 1;
+ sprite->data[7] |= 1;
}
meta_step(mapObject, sprite, sub_805D314);
}
u8 sub_805D314(struct MapObject *mapObject, struct Sprite *sprite)
{
- return gUnknown_083752D0[sprite->data1](mapObject, sprite);
+ return gUnknown_083752D0[sprite->data[1]](mapObject, sprite);
}
u8 do_berry_tree_growth_sparkle_1(struct MapObject *mapObject, struct Sprite *sprite)
@@ -3893,13 +3890,13 @@ u8 do_berry_tree_growth_sparkle_1(struct MapObject *mapObject, struct Sprite *sp
berryTreeStage = GetStageByBerryTreeId(mapObject->trainerRange_berryTreeId);
if (!berryTreeStage)
{
- if (!(sprite->data7 & 4) && sprite->animNum == 4)
+ if (!(sprite->data[7] & 4) && sprite->animNum == 4)
{
- gUnknown_0202FF84[0] = mapObject->coords2.x;
- gUnknown_0202FF84[1] = mapObject->coords2.y;
- gUnknown_0202FF84[2] = sprite->subpriority - 1;
- gUnknown_0202FF84[3] = sprite->oam.priority;
- FieldEffectStart(0x17);
+ gFieldEffectArguments[0] = mapObject->coords2.x;
+ gFieldEffectArguments[1] = mapObject->coords2.y;
+ gFieldEffectArguments[2] = sprite->subpriority - 1;
+ gFieldEffectArguments[3] = sprite->oam.priority;
+ FieldEffectStart(FLDEFF_BERRY_TREE_GROWTH_SPARKLE);
sprite->animNum = 0;
}
return 0;
@@ -3909,12 +3906,12 @@ u8 do_berry_tree_growth_sparkle_1(struct MapObject *mapObject, struct Sprite *sp
berryTreeStage--;
if (sprite->animNum != berryTreeStage)
{
- sprite->data1 = 2;
+ sprite->data[1] = 2;
return 1;
}
get_berry_tree_graphics(mapObject, sprite);
FieldObjectSetRegularAnim(mapObject, sprite, 0x39);
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
@@ -3922,7 +3919,7 @@ u8 sub_805D3EC(struct MapObject *mapObject, struct Sprite *sprite)
{
if (FieldObjectExecRegularAnim(mapObject, sprite))
{
- sprite->data1 = 0;
+ sprite->data[1] = 0;
return 1;
}
return 0;
@@ -3931,27 +3928,27 @@ u8 sub_805D3EC(struct MapObject *mapObject, struct Sprite *sprite)
u8 do_berry_tree_growth_sparkle_2(struct MapObject *mapObject, struct Sprite *sprite)
{
mapObject->mapobj_bit_1 = 1;
- sprite->data1 = 3;
- sprite->data2 = 0;
- sprite->data7 |= 2;
- gUnknown_0202FF84[0] = mapObject->coords2.x;
- gUnknown_0202FF84[1] = mapObject->coords2.y;
- gUnknown_0202FF84[2] = sprite->subpriority - 1;
- gUnknown_0202FF84[3] = sprite->oam.priority;
- FieldEffectStart(0x17);
+ sprite->data[1] = 3;
+ sprite->data[2] = 0;
+ sprite->data[7] |= 2;
+ gFieldEffectArguments[0] = mapObject->coords2.x;
+ gFieldEffectArguments[1] = mapObject->coords2.y;
+ gFieldEffectArguments[2] = sprite->subpriority - 1;
+ gFieldEffectArguments[3] = sprite->oam.priority;
+ FieldEffectStart(FLDEFF_BERRY_TREE_GROWTH_SPARKLE);
return 1;
}
u8 sub_805D458(struct MapObject *mapObject, struct Sprite *sprite)
{
- sprite->data2++;
- mapObject->mapobj_bit_13 = ((sprite->data2 & 0x2) >> 1);
+ sprite->data[2]++;
+ mapObject->mapobj_bit_13 = ((sprite->data[2] & 0x2) >> 1);
sprite->animPaused = 1;
- if (sprite->data2 > 64)
+ if (sprite->data[2] > 64)
{
get_berry_tree_graphics(mapObject, sprite);
- sprite->data1 = 4;
- sprite->data2 = 0;
+ sprite->data[1] = 4;
+ sprite->data[2] = 0;
return 1;
}
return 0;
@@ -3959,13 +3956,13 @@ u8 sub_805D458(struct MapObject *mapObject, struct Sprite *sprite)
u8 sub_805D4A8(struct MapObject *mapObject, struct Sprite *sprite)
{
- sprite->data2++;
- mapObject->mapobj_bit_13 = ((sprite->data2 & 0x2) >> 1);
+ sprite->data[2]++;
+ mapObject->mapobj_bit_13 = ((sprite->data[2] & 0x2) >> 1);
sprite->animPaused = 1;
- if (sprite->data2 > 64)
+ if (sprite->data[2] > 64)
{
- sprite->data1 = 0;
- sprite->data7 &= (-3);
+ sprite->data[1] = 0;
+ sprite->data[7] &= (-3);
return 1;
}
return 0;
@@ -3976,14 +3973,14 @@ fieldmap_object_cb(sub_805D4F4, sub_805D518, gUnknown_083752E4);
u8 sub_805D538(struct MapObject *mapObject, struct Sprite *sprite)
{
npc_reset(mapObject, sprite);
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
u8 sub_805D54C(struct MapObject *mapObject, struct Sprite *sprite)
{
FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 2;
+ sprite->data[1] = 2;
return 1;
}
@@ -3993,7 +3990,7 @@ u8 sub_805D578(struct MapObject *mapObject, struct Sprite *sprite)
{
sub_8064820(sprite, gUnknown_0837520C[Random() & 3]);
mapObject->mapobj_bit_1 = 0;
- sprite->data1 = 3;
+ sprite->data[1] = 3;
}
return 0;
}
@@ -4002,7 +3999,7 @@ u8 sub_805D5BC(struct MapObject *mapObject, struct Sprite *sprite)
{
if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
{
- sprite->data1 = 4;
+ sprite->data[1] = 4;
return 1;
}
return 0;
@@ -4019,7 +4016,7 @@ u8 sub_805D5EC(struct MapObject *mapObject, struct Sprite *sprite)
direction = directions[Random() & 1];
}
FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
@@ -4028,14 +4025,14 @@ fieldmap_object_cb(sub_805D634, sub_805D658, gUnknown_083752F8);
u8 sub_805D678(struct MapObject *mapObject, struct Sprite *sprite)
{
npc_reset(mapObject, sprite);
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
u8 sub_805D68C(struct MapObject *mapObject, struct Sprite *sprite)
{
FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 2;
+ sprite->data[1] = 2;
return 1;
}
@@ -4045,7 +4042,7 @@ u8 sub_805D6B8(struct MapObject *mapObject, struct Sprite *sprite)
{
sub_8064820(sprite, gUnknown_0837520C[Random() & 3]);
mapObject->mapobj_bit_1 = 0;
- sprite->data1 = 3;
+ sprite->data[1] = 3;
}
return 0;
}
@@ -4054,7 +4051,7 @@ u8 sub_805D6FC(struct MapObject *mapObject, struct Sprite *sprite)
{
if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
{
- sprite->data1 = 4;
+ sprite->data[1] = 4;
return 1;
}
return 0;
@@ -4071,7 +4068,7 @@ u8 sub_805D72C(struct MapObject *mapObject, struct Sprite *sprite)
direction = directions[Random() & 1];
}
FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
@@ -4080,14 +4077,14 @@ fieldmap_object_cb(sub_805D774, sub_805D798, gUnknown_0837530C);
u8 sub_805D7B8(struct MapObject *mapObject, struct Sprite *sprite)
{
npc_reset(mapObject, sprite);
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
u8 sub_805D7CC(struct MapObject *mapObject, struct Sprite *sprite)
{
FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 2;
+ sprite->data[1] = 2;
return 1;
}
@@ -4097,7 +4094,7 @@ u8 sub_805D7F8(struct MapObject *mapObject, struct Sprite *sprite)
{
sub_8064820(sprite, gUnknown_0837521C[Random() & 3]);
mapObject->mapobj_bit_1 = 0;
- sprite->data1 = 3;
+ sprite->data[1] = 3;
}
return 0;
}
@@ -4106,7 +4103,7 @@ u8 sub_805D83C(struct MapObject *mapObject, struct Sprite *sprite)
{
if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
{
- sprite->data1 = 4;
+ sprite->data[1] = 4;
return 1;
}
return 0;
@@ -4123,7 +4120,7 @@ u8 sub_805D86C(struct MapObject *mapObject, struct Sprite *sprite)
direction = directions[Random() & 1];
}
FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
@@ -4132,14 +4129,14 @@ fieldmap_object_cb(sub_805D8B4, sub_805D8D8, gUnknown_08375324);
u8 sub_805D8F8(struct MapObject *mapObject, struct Sprite *sprite)
{
npc_reset(mapObject, sprite);
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
u8 sub_805D90C(struct MapObject *mapObject, struct Sprite *sprite)
{
FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 2;
+ sprite->data[1] = 2;
return 1;
}
@@ -4149,7 +4146,7 @@ u8 sub_805D938(struct MapObject *mapObject, struct Sprite *sprite)
{
sub_8064820(sprite, gUnknown_0837521C[Random() & 3]);
mapObject->mapobj_bit_1 = 0;
- sprite->data1 = 3;
+ sprite->data[1] = 3;
}
return 0;
}
@@ -4158,7 +4155,7 @@ u8 sub_805D97C(struct MapObject *mapObject, struct Sprite *sprite)
{
if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
{
- sprite->data1 = 4;
+ sprite->data[1] = 4;
return 1;
}
return 0;
@@ -4175,7 +4172,7 @@ u8 sub_805D9AC(struct MapObject *mapObject, struct Sprite *sprite)
direction = directions[Random() & 1];
}
FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
@@ -4184,14 +4181,14 @@ fieldmap_object_cb(sub_805D9F4, sub_805DA18, gUnknown_0837533C);
u8 sub_805DA38(struct MapObject *mapObject, struct Sprite *sprite)
{
npc_reset(mapObject, sprite);
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
u8 sub_805DA4C(struct MapObject *mapObject, struct Sprite *sprite)
{
FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 2;
+ sprite->data[1] = 2;
return 1;
}
@@ -4201,7 +4198,7 @@ u8 sub_805DA78(struct MapObject *mapObject, struct Sprite *sprite)
{
sub_8064820(sprite, gUnknown_0837521C[Random() & 3]);
mapObject->mapobj_bit_1 = 0;
- sprite->data1 = 3;
+ sprite->data[1] = 3;
}
return 0;
}
@@ -4210,7 +4207,7 @@ u8 sub_805DABC(struct MapObject *mapObject, struct Sprite *sprite)
{
if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
{
- sprite->data1 = 4;
+ sprite->data[1] = 4;
return 1;
}
return 0;
@@ -4227,7 +4224,7 @@ u8 sub_805DAEC(struct MapObject *mapObject, struct Sprite *sprite)
direction = directions[Random() & 1];
}
FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
@@ -4236,14 +4233,14 @@ fieldmap_object_cb(sub_805DB34, sub_805DB58, gUnknown_08375354);
u8 sub_805DB78(struct MapObject *mapObject, struct Sprite *sprite)
{
npc_reset(mapObject, sprite);
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
u8 sub_805DB8C(struct MapObject *mapObject, struct Sprite *sprite)
{
FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 2;
+ sprite->data[1] = 2;
return 1;
}
@@ -4253,7 +4250,7 @@ u8 sub_805DBB8(struct MapObject *mapObject, struct Sprite *sprite)
{
sub_8064820(sprite, gUnknown_0837521C[Random() & 3]);
mapObject->mapobj_bit_1 = 0;
- sprite->data1 = 3;
+ sprite->data[1] = 3;
}
return 0;
}
@@ -4262,7 +4259,7 @@ u8 sub_805DBFC(struct MapObject *mapObject, struct Sprite *sprite)
{
if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
{
- sprite->data1 = 4;
+ sprite->data[1] = 4;
return 1;
}
return 0;
@@ -4279,7 +4276,7 @@ u8 sub_805DC2C(struct MapObject *mapObject, struct Sprite *sprite)
direction = directions[Random() & 1];
}
FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
@@ -4288,14 +4285,14 @@ fieldmap_object_cb(sub_805DC74, sub_805DC98, gUnknown_0837536C);
u8 sub_805DCB8(struct MapObject *mapObject, struct Sprite *sprite)
{
npc_reset(mapObject, sprite);
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
u8 sub_805DCCC(struct MapObject *mapObject, struct Sprite *sprite)
{
FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 2;
+ sprite->data[1] = 2;
return 1;
}
@@ -4305,7 +4302,7 @@ u8 sub_805DCF8(struct MapObject *mapObject, struct Sprite *sprite)
{
sub_8064820(sprite, gUnknown_0837521C[Random() & 3]);
mapObject->mapobj_bit_1 = 0;
- sprite->data1 = 3;
+ sprite->data[1] = 3;
}
return 0;
}
@@ -4314,7 +4311,7 @@ u8 sub_805DD3C(struct MapObject *mapObject, struct Sprite *sprite)
{
if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
{
- sprite->data1 = 4;
+ sprite->data[1] = 4;
return 1;
}
return 0;
@@ -4331,7 +4328,7 @@ u8 sub_805DD6C(struct MapObject *mapObject, struct Sprite *sprite)
direction = directions[Random() & 3];
}
FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
@@ -4340,14 +4337,14 @@ fieldmap_object_cb(sub_805DDB4, sub_805DDD8, gUnknown_08375384);
u8 sub_805DDF8(struct MapObject *mapObject, struct Sprite *sprite)
{
npc_reset(mapObject, sprite);
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
u8 sub_805DE0C(struct MapObject *mapObject, struct Sprite *sprite)
{
FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 2;
+ sprite->data[1] = 2;
return 1;
}
@@ -4357,7 +4354,7 @@ u8 sub_805DE38(struct MapObject *mapObject, struct Sprite *sprite)
{
sub_8064820(sprite, gUnknown_0837521C[Random() & 3]);
mapObject->mapobj_bit_1 = 0;
- sprite->data1 = 3;
+ sprite->data[1] = 3;
}
return 0;
}
@@ -4366,7 +4363,7 @@ u8 sub_805DE7C(struct MapObject *mapObject, struct Sprite *sprite)
{
if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
{
- sprite->data1 = 4;
+ sprite->data[1] = 4;
return 1;
}
return 0;
@@ -4383,7 +4380,7 @@ u8 sub_805DEAC(struct MapObject *mapObject, struct Sprite *sprite)
direction = directions[Random() & 3];
}
FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
@@ -4392,14 +4389,14 @@ fieldmap_object_cb(sub_805DEF4, sub_805DF18, gUnknown_0837539C);
u8 sub_805DF38(struct MapObject *mapObject, struct Sprite *sprite)
{
npc_reset(mapObject, sprite);
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
u8 sub_805DF4C(struct MapObject *mapObject, struct Sprite *sprite)
{
FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 2;
+ sprite->data[1] = 2;
return 1;
}
@@ -4409,7 +4406,7 @@ u8 sub_805DF78(struct MapObject *mapObject, struct Sprite *sprite)
{
sub_8064820(sprite, gUnknown_0837521C[Random() & 3]);
mapObject->mapobj_bit_1 = 0;
- sprite->data1 = 3;
+ sprite->data[1] = 3;
}
return 0;
}
@@ -4418,7 +4415,7 @@ u8 sub_805DFBC(struct MapObject *mapObject, struct Sprite *sprite)
{
if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
{
- sprite->data1 = 4;
+ sprite->data[1] = 4;
return 1;
}
return 0;
@@ -4435,7 +4432,7 @@ u8 sub_805DFEC(struct MapObject *mapObject, struct Sprite *sprite)
direction = directions[Random() & 3];
}
FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
@@ -4444,14 +4441,14 @@ fieldmap_object_cb(sub_805E034, sub_805E058, gUnknown_083753B4);
u8 sub_805E078(struct MapObject *mapObject, struct Sprite *sprite)
{
npc_reset(mapObject, sprite);
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
u8 sub_805E08C(struct MapObject *mapObject, struct Sprite *sprite)
{
FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 2;
+ sprite->data[1] = 2;
return 1;
}
@@ -4461,7 +4458,7 @@ u8 sub_805E0B8(struct MapObject *mapObject, struct Sprite *sprite)
{
sub_8064820(sprite, gUnknown_0837521C[Random() & 3]);
mapObject->mapobj_bit_1 = 0;
- sprite->data1 = 3;
+ sprite->data[1] = 3;
}
return 0;
}
@@ -4470,7 +4467,7 @@ u8 sub_805E0FC(struct MapObject *mapObject, struct Sprite *sprite)
{
if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
{
- sprite->data1 = 4;
+ sprite->data[1] = 4;
return 1;
}
return 0;
@@ -4487,7 +4484,7 @@ u8 sub_805E12C(struct MapObject *mapObject, struct Sprite *sprite)
direction = directions[Random() & 3];
}
FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
@@ -4497,7 +4494,7 @@ u8 sub_805E1B8(struct MapObject *mapObject, struct Sprite *sprite)
{
npc_reset(mapObject, sprite);
FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
@@ -4506,7 +4503,7 @@ u8 sub_805E1E4(struct MapObject *mapObject, struct Sprite *sprite)
if (FieldObjectExecRegularAnim(mapObject, sprite))
{
sub_8064820(sprite, 0x30);
- sprite->data1 = 2;
+ sprite->data[1] = 2;
}
return 0;
}
@@ -4515,7 +4512,7 @@ u8 sub_805E208(struct MapObject *mapObject, struct Sprite *sprite)
{
if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
{
- sprite->data1 = 3;
+ sprite->data[1] = 3;
}
return 0;
}
@@ -4531,7 +4528,7 @@ u8 sub_805E234(struct MapObject *mapObject, struct Sprite *sprite)
direction = directions[mapObject->mapobj_unk_18];
}
FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 0;
+ sprite->data[1] = 0;
return 1;
}
@@ -4541,7 +4538,7 @@ u8 sub_805E2BC(struct MapObject *mapObject, struct Sprite *sprite)
{
npc_reset(mapObject, sprite);
FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
@@ -4550,7 +4547,7 @@ u8 sub_805E2E8(struct MapObject *mapObject, struct Sprite *sprite)
if (FieldObjectExecRegularAnim(mapObject, sprite))
{
sub_8064820(sprite, 0x30);
- sprite->data1 = 2;
+ sprite->data[1] = 2;
}
return 0;
}
@@ -4559,7 +4556,7 @@ u8 sub_805E30C(struct MapObject *mapObject, struct Sprite *sprite)
{
if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
{
- sprite->data1 = 3;
+ sprite->data[1] = 3;
}
return 0;
}
@@ -4575,7 +4572,7 @@ u8 sub_805E338(struct MapObject *mapObject, struct Sprite *sprite)
direction = directions[mapObject->mapobj_unk_18];
}
FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 0;
+ sprite->data[1] = 0;
return 1;
}
@@ -4584,7 +4581,7 @@ fieldmap_object_cb(sub_805E37C, sub_805E3A0, gUnknown_083753FC);
u8 sub_805E3C0(struct MapObject *mapObject, struct Sprite *sprite)
{
npc_reset(mapObject, sprite);
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
@@ -4597,7 +4594,7 @@ u8 sub_805E3D4(struct MapObject *mapObject, struct Sprite *sprite)
direction = GetOppositeDirection(direction);
}
FieldObjectSetDirection(mapObject, direction);
- sprite->data1 = 2;
+ sprite->data[1] = 2;
return 1;
}
@@ -4625,7 +4622,7 @@ u8 sub_805E40C(struct MapObject *mapObject, struct Sprite *sprite)
}
FieldObjectSetRegularAnim(mapObject, sprite, goSpeed0AnimId);
mapObject->mapobj_bit_1 = 1;
- sprite->data1 = 3;
+ sprite->data[1] = 3;
return 1;
}
@@ -4634,7 +4631,7 @@ u8 sub_805E4C4(struct MapObject *mapObject, struct Sprite *sprite)
if (FieldObjectExecRegularAnim(mapObject, sprite))
{
mapObject->mapobj_bit_1 = 0;
- sprite->data1 = 1;
+ sprite->data[1] = 1;
}
return 0;
}
@@ -4642,7 +4639,7 @@ u8 sub_805E4C4(struct MapObject *mapObject, struct Sprite *sprite)
u8 sub_805E4EC(struct MapObject *mapObject, struct Sprite *sprite)
{
npc_reset(mapObject, sprite);
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
@@ -4670,7 +4667,7 @@ u8 MoveFieldObjectInNextDirectionInSequence(struct MapObject *mapObject, struct
}
FieldObjectSetRegularAnim(mapObject, sprite, goSpeed0AnimId);
mapObject->mapobj_bit_1 = 1;
- sprite->data1 = 2;
+ sprite->data[1] = 2;
return 1;
}
@@ -4679,7 +4676,7 @@ u8 sub_805E5B4(struct MapObject *mapObject, struct Sprite *sprite)
if (FieldObjectExecRegularAnim(mapObject, sprite))
{
mapObject->mapobj_bit_1 = 0;
- sprite->data1 = 1;
+ sprite->data[1] = 1;
}
return 0;
}
@@ -5007,13 +5004,13 @@ u8 mss_npc_reset_oampriv3_1_unk2_unk3(struct MapObject *mapObject, struct Sprite
{
mapObject->mapobj_unk_21 = player_get_direction_lower_nybble();
}
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
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;
}
@@ -5025,53 +5022,157 @@ u8 sub_805F3C4(struct MapObject *mapObject, struct Sprite *sprite)
if (FieldObjectExecRegularAnim(mapObject, sprite))
{
mapObject->mapobj_bit_1 = 0;
- sprite->data1 = 1;
+ sprite->data[1] = 1;
}
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;
+ sprite->data[1] = 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));
}
mapObject->mapobj_bit_1 = 1;
- sprite->data1 = 2;
+ sprite->data[1] = 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->data[1] = 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->data[1] = 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->data[1] = 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->data[1] = 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->data[1] = 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->data[1] = 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;
}
@@ -5083,15 +5184,15 @@ u8 sub_805F9F8(struct MapObject *, struct Sprite *);
void FieldObjectCB_TreeDisguise(struct Sprite *sprite)
{
struct MapObject *mapObject;
- mapObject = &gMapObjects[sprite->data0];
- if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && sprite->data7 == 0))
+ mapObject = &gMapObjects[sprite->data[0]];
+ if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && sprite->data[7] == 0))
{
- FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gUnknown_0202FF84[0], (u8 *)&gUnknown_0202FF84[1], (u8 *)&gUnknown_0202FF84[2]);
- mapObject->mapobj_unk_1A = FieldEffectStart(0x1c);
+ FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
+ mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_TREE_DISGUISE);
mapObject->mapobj_unk_21 = 1;
- sprite->data7 ++;
+ sprite->data[7] ++;
}
- meta_step(&gMapObjects[sprite->data0], sprite, sub_805F9F8);
+ meta_step(&gMapObjects[sprite->data[0]], sprite, sub_805F9F8);
}
u8 sub_805F9F8(struct MapObject *mapObject, struct Sprite *sprite)
@@ -5103,34 +5204,34 @@ u8 sub_805F9F8(struct MapObject *mapObject, struct Sprite *sprite)
void FieldObjectCB_MountainDisguise(struct Sprite *sprite)
{
struct MapObject *mapObject;
- mapObject = &gMapObjects[sprite->data0];
- if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && sprite->data7 == 0))
+ mapObject = &gMapObjects[sprite->data[0]];
+ if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && sprite->data[7] == 0))
{
- FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gUnknown_0202FF84[0], (u8 *)&gUnknown_0202FF84[1], (u8 *)&gUnknown_0202FF84[2]);
- mapObject->mapobj_unk_1A = FieldEffectStart(0x1d);
+ FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
+ mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_MOUNTAIN_DISGUISE);
mapObject->mapobj_unk_21 = 1;
- sprite->data7 ++;
+ sprite->data[7] ++;
}
- meta_step(&gMapObjects[sprite->data0], sprite, sub_805F9F8);
+ meta_step(&gMapObjects[sprite->data[0]], sprite, sub_805F9F8);
}
u8 sub_805FAD8(struct MapObject *mapObject, struct Sprite *sprite);
void FieldObjectCB_Hidden1(struct Sprite *sprite)
{
- if (sprite->data7 == 0)
+ if (sprite->data[7] == 0)
{
- gMapObjects[sprite->data0].mapobj_bit_26 = 1;
+ gMapObjects[sprite->data[0]].mapobj_bit_26 = 1;
sprite->subspriteMode = 2;
sprite->oam.priority = 3;
- sprite->data7 ++;
+ sprite->data[7] ++;
}
- meta_step(&gMapObjects[sprite->data0], sprite, sub_805FAD8);
+ meta_step(&gMapObjects[sprite->data[0]], sprite, sub_805FAD8);
}
u8 sub_805FAD8(struct MapObject *mapObject, struct Sprite *sprite)
{
- return gUnknown_083755CC[sprite->data1](mapObject, sprite);
+ return gUnknown_083755CC[sprite->data[1]](mapObject, sprite);
}
u8 sub_805FAF8(struct MapObject *mapObject, struct Sprite *sprite)
@@ -5143,7 +5244,7 @@ u8 sub_805FB04(struct MapObject *mapObject, struct Sprite *sprite)
{
if (FieldObjectExecRegularAnim(mapObject, sprite))
{
- sprite->data1 = 0;
+ sprite->data[1] = 0;
}
return 0;
}
@@ -5154,7 +5255,7 @@ u8 sub_805FB64(struct MapObject *mapObject, struct Sprite *sprite)
{
npc_reset(mapObject, sprite);
FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
@@ -5164,7 +5265,7 @@ u8 sub_805FBD4(struct MapObject *mapObject, struct Sprite *sprite)
{
npc_reset(mapObject, sprite);
FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay8AnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
@@ -5174,7 +5275,7 @@ u8 sub_805FC44(struct MapObject *mapObject, struct Sprite *sprite)
{
npc_reset(mapObject, sprite);
FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay4AnimId(mapObject->mapobj_unk_18));
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
@@ -5185,7 +5286,7 @@ u8 sub_805FCB4(struct MapObject *mapObject, struct Sprite *sprite)
npc_reset(mapObject, sprite);
FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
mapObject->mapobj_bit_13 = 1;
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 1;
}
@@ -5193,7 +5294,7 @@ u8 sub_805FCE8(struct MapObject *mapObject, struct Sprite *sprite)
{
if (FieldObjectExecRegularAnim(mapObject, sprite))
{
- sprite->data1 = 2;
+ sprite->data[1] = 2;
return 1;
}
return 0;
@@ -5213,7 +5314,7 @@ void npc_reset(struct MapObject *mapObject, struct Sprite *sprite)
mapObject->mapobj_bit_6 = 0;
mapObject->mapobj_bit_7 = 0;
mapObject->mapobj_unk_1C = 0xff;
- sprite->data1 = 0;
+ sprite->data[1] = 0;
}
u8 FieldObjectDirectionToImageAnimId(u8 direction)
@@ -5345,7 +5446,7 @@ void npc_set_running_behaviour_etc(struct MapObject *mapObject, u8 animPattern)
mapObject->mapobj_unk_21 = 0;
mapObject->animId = 0;
gSprites[mapObject->spriteId].callback = gUnknown_0836DA88[animPattern];
- gSprites[mapObject->spriteId].data1 = 0;
+ gSprites[mapObject->spriteId].data[1] = 0;
}
u8 npc_running_behaviour_by_direction(u8 direction)
@@ -5363,80 +5464,62 @@ u8 sub_805FF20(struct MapObject *mapObject, u8 direction)
return npc_block_way(mapObject, x, y, direction);
}
-bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject2 *mapObject, s16 x, s16 y);
-bool8 CheckForCollisionBetweenFieldObjects(struct MapObject *mapObject, s16 x, s16 y);
+bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject *mapObject, s16 x, s16 y);
+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)
{
- if (IsCoordOutsideFieldObjectMovementRect((struct MapObject2 *)mapObject, x, y))
- {
+ u8 direction;
+ direction = dirn;
+ if (IsCoordOutsideFieldObjectMovementRect(mapObject, x, y))
return 1;
- }
- if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction))
- {
+ else if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction))
return 2;
- } else if (mapObject->mapobj_bit_15 && !CanCameraMoveInDirection(direction))
- {
+ else if (mapObject->mapobj_bit_15 && !CanCameraMoveInDirection(direction))
return 2;
- }
- if (IsZCoordMismatchAt(mapObject->mapobj_unk_0B_0, x, y))
- {
+ else if (IsZCoordMismatchAt(mapObject->mapobj_unk_0B_0, x, y))
return 3;
- }
- if (CheckForCollisionBetweenFieldObjects(mapObject, x, y))
- {
+ else if (DoesObjectCollideWithObjectAt(mapObject, x, y))
return 4;
- }
return 0;
}
u8 sub_8060024(struct MapObject *mapObject, s16 x, s16 y, u8 direction)
{
- u8 flags;
- flags = 0;
- if (IsCoordOutsideFieldObjectMovementRect((struct MapObject2 *)mapObject, x, y))
- {
+ u8 flags = 0;
+
+ if (IsCoordOutsideFieldObjectMovementRect(mapObject, x, y))
flags |= 1;
- }
if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction) || (mapObject->mapobj_bit_15 && !CanCameraMoveInDirection(direction)))
- {
flags |= 2;
- }
if (IsZCoordMismatchAt(mapObject->mapobj_unk_0B_0, x, y))
- {
flags |= 4;
- }
- if (CheckForCollisionBetweenFieldObjects(mapObject, x, y))
- {
+ if (DoesObjectCollideWithObjectAt(mapObject, x, y))
flags |= 8;
- }
return flags;
}
-bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject2 *mapObject, s16 x, s16 y)
+bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject *mapObject, s16 x, s16 y)
{
s16 minv;
s16 maxv;
- if (mapObject->mapobj_unk_19 != 0)
+
+ if (mapObject->range.as_nybbles.x != 0)
{
- minv = mapObject->coords1.x - (mapObject->mapobj_unk_19);
- maxv = mapObject->coords1.x + (mapObject->mapobj_unk_19);
+ minv = mapObject->coords1.x - (mapObject->range.as_nybbles.x);
+ maxv = mapObject->coords1.x + (mapObject->range.as_nybbles.x);
if (minv > x || maxv < x)
- {
- return 1;
- }
+ return TRUE;
}
- if (mapObject->mapobj_unk_19b != 0)
+ if (mapObject->range.as_nybbles.y != 0)
{
- minv = mapObject->coords1.y - (mapObject->mapobj_unk_19b);
- maxv = mapObject->coords1.y + (mapObject->mapobj_unk_19b);
+ minv = mapObject->coords1.y - (mapObject->range.as_nybbles.y);
+ maxv = mapObject->coords1.y + (mapObject->range.as_nybbles.y);
if (minv > y || maxv < y)
- {
- return 1;
- }
+ return TRUE;
}
- return 0;
+ return FALSE;
}
bool8 IsMetatileDirectionallyImpassable(struct MapObject *mapObject, s16 x, s16 y, u8 direction)
@@ -5448,39 +5531,34 @@ bool8 IsMetatileDirectionallyImpassable(struct MapObject *mapObject, s16 x, s16
return 0;
}
-bool8 CheckForCollisionBetweenFieldObjects(struct MapObject *mapObject, s16 x, s16 y)
+static bool8 DoesObjectCollideWithObjectAt(struct MapObject *mapObject, s16 x, s16 y)
{
- struct MapObject *mapObject2;
u8 i;
- for (i=0; i<16; i++)
+
+ for (i = 0; i < 16; i++)
{
- mapObject2 = &gMapObjects[i];
+ struct MapObject *mapObject2 = &gMapObjects[i];
+
if (mapObject2->active && mapObject2 != mapObject)
{
- if ((mapObject2->coords2.x != x || mapObject2->coords2.y != y) && (mapObject2->coords3.x != x || mapObject2->coords3.y != y))
- {
- continue;
- }
- if (AreZCoordsCompatible(mapObject->mapobj_unk_0B_0, mapObject2->mapobj_unk_0B_0))
- {
- return 1;
- }
+ if (((mapObject2->coords2.x == x && mapObject2->coords2.y == y) || (mapObject2->coords3.x == x && mapObject2->coords3.y == y))
+ && AreZCoordsCompatible(mapObject->mapobj_unk_0B_0, mapObject2->mapobj_unk_0B_0))
+ return TRUE;
}
}
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;
+ if (gSprites[gMapObjects[mapObjectId].spriteId].data[7] & 2)
+ return TRUE;
+
+ return FALSE;
}
void sub_8060288(u8 localId, u8 mapNum, u8 mapGroup)
@@ -5488,7 +5566,7 @@ void sub_8060288(u8 localId, u8 mapNum, u8 mapGroup)
u8 mapObjectId;
if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId))
{
- gSprites[gMapObjects[mapObjectId].spriteId].data7 |= 4;
+ gSprites[gMapObjects[mapObjectId].spriteId].data[7] |= 4;
}
}
@@ -5504,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;
}
}
@@ -5587,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)
@@ -5622,7 +5704,7 @@ bool8 FieldObjectSetSpecialAnim(struct MapObject *mapObject, u8 specialAnimId)
mapObject->mapobj_unk_1C = specialAnimId;
mapObject->mapobj_bit_6 = 1;
mapObject->mapobj_bit_7 = 0;
- gSprites[mapObject->spriteId].data2 = 0;
+ gSprites[mapObject->spriteId].data[2] = 0;
return FALSE;
}
@@ -5645,8 +5727,8 @@ void FieldObjectClearAnim(struct MapObject *mapObject)
mapObject->mapobj_unk_1C = 0xFF;
mapObject->mapobj_bit_6 = 0;
mapObject->mapobj_bit_7 = 0;
- gSprites[mapObject->spriteId].data1 = 0;
- gSprites[mapObject->spriteId].data2 = 0;
+ gSprites[mapObject->spriteId].data[1] = 0;
+ gSprites[mapObject->spriteId].data[2] = 0;
}
bool8 FieldObjectCheckIfSpecialAnimFinishedOrInactive(struct MapObject *mapObject)
@@ -5705,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)
{
@@ -6019,69 +5942,27 @@ 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)
{
- if (gUnknown_08375778[mapObject->mapobj_unk_1C][sprite->data2](mapObject, sprite))
+ if (gUnknown_08375778[mapObject->mapobj_unk_1C][sprite->data[2]](mapObject, sprite))
{
mapObject->mapobj_bit_7 = 1;
}
@@ -6089,10 +5970,10 @@ void FieldObjectExecSpecialAnim(struct MapObject *mapObject, struct Sprite *spri
bool8 FieldObjectExecRegularAnim(struct MapObject *mapObject, struct Sprite *sprite)
{
- if (gUnknown_08375778[mapObject->mapobj_unk_1C][sprite->data2](mapObject, sprite))
+ if (gUnknown_08375778[mapObject->mapobj_unk_1C][sprite->data[2]](mapObject, sprite))
{
mapObject->mapobj_unk_1C = 0xFF;
- sprite->data2 = 0;
+ sprite->data[2] = 0;
return 1;
}
return 0;
@@ -6101,7 +5982,7 @@ bool8 FieldObjectExecRegularAnim(struct MapObject *mapObject, struct Sprite *spr
void FieldObjectSetRegularAnim(struct MapObject *mapObject, struct Sprite *sprite, u8 animId)
{
mapObject->mapobj_unk_1C = animId;
- sprite->data2 = 0;
+ sprite->data[2] = 0;
}
void an_look_any(struct MapObject *mapObject, struct Sprite *sprite, u8 direction)
@@ -6110,7 +5991,7 @@ void an_look_any(struct MapObject *mapObject, struct Sprite *sprite, u8 directio
npc_coords_shift_still(mapObject);
sub_805FE64(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18));
sprite->animPaused = 1;
- sprite->data2 = 1;
+ sprite->data[2] = 1;
}
u8 sub_8060CE0(struct MapObject *mapObject, struct Sprite *sprite)
@@ -6149,7 +6030,7 @@ void sub_8060D20(struct MapObject *mapObject, struct Sprite *sprite, u8 directio
oamt_npc_ministep_reset(sprite, direction, a3);
sprite->animPaused = 0;
mapObject->mapobj_bit_2 = 1;
- sprite->data2 = 1;
+ sprite->data[2] = 1;
}
extern u8 (*const gUnknown_083759C0[5])(u8);
@@ -6194,7 +6075,7 @@ void sub_8060E68(struct MapObject *mapObject, struct Sprite *sprite, u8 directio
sub_806467C(sprite, direction);
sprite->animPaused = 0;
mapObject->mapobj_bit_2 = 1;
- sprite->data2 = 1;
+ sprite->data[2] = 1;
}
void sub_8060ED8(struct MapObject *mapObject, struct Sprite *sprite, u8 direction)
@@ -6227,7 +6108,7 @@ bool8 sub_8060F5C(struct MapObject *mapObject, struct Sprite *sprite)
{
if (an_walk_any_2(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -6245,7 +6126,7 @@ bool8 sub_8060F9C(struct MapObject *mapObject, struct Sprite *sprite)
{
if (an_walk_any_2(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -6263,7 +6144,7 @@ bool8 sub_8060FDC(struct MapObject *mapObject, struct Sprite *sprite)
{
if (an_walk_any_2(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -6281,7 +6162,7 @@ bool8 sub_806101C(struct MapObject *mapObject, struct Sprite *sprite)
{
if (an_walk_any_2(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -6299,7 +6180,7 @@ bool8 sub_806105C(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -6317,7 +6198,7 @@ bool8 sub_806109C(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -6335,7 +6216,7 @@ bool8 sub_80610DC(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -6353,7 +6234,7 @@ bool8 sub_806111C(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -6371,7 +6252,7 @@ void sub_806113C(struct MapObject *mapObject, struct Sprite *sprite, u8 directio
sub_8060320(direction, &x, &y, vSPp4[a4], vSPp4[a4]);
npc_coords_shift(mapObject, mapObject->coords2.x + x, mapObject->coords2.y + y);
sub_80646E4(sprite, direction, a4, a5);
- sprite->data2 = 1;
+ sprite->data[2] = 1;
sprite->animPaused = 0;
mapObject->mapobj_bit_2 = 1;
mapObject->mapobj_bit_4 = 1;
@@ -6392,11 +6273,11 @@ u8 sub_806123C(struct MapObject *mapObject, struct Sprite *sprite, u8 (*const ca
u8 retval;
memcpy(vSPp4, gUnknown_08375A3A, sizeof gUnknown_08375A3A);
retval = callback(sprite);
- if (retval == 1 && vSPp4[sprite->data4] != 0)
+ if (retval == 1 && vSPp4[sprite->data[4]] != 0)
{
x = 0;
y = 0;
- sub_8060320(mapObject->placeholder18, &x, &y, vSPp4[sprite->data4], vSPp4[sprite->data4]);
+ sub_8060320(mapObject->placeholder18, &x, &y, vSPp4[sprite->data[4]], vSPp4[sprite->data[4]]);
npc_coords_shift(mapObject, mapObject->coords2.x + x, mapObject->coords2.y + y);
mapObject->mapobj_bit_2 = 1;
mapObject->mapobj_bit_4 = 1;
@@ -6472,7 +6353,7 @@ bool8 sub_80613D4(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8061328(mapObject, sprite))
{
mapObject->mapobj_bit_22 = 0;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -6489,7 +6370,7 @@ bool8 sub_806142C(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8061328(mapObject, sprite))
{
mapObject->mapobj_bit_22 = 0;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -6506,7 +6387,7 @@ bool8 sub_8061484(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8061328(mapObject, sprite))
{
mapObject->mapobj_bit_22 = 0;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -6523,7 +6404,7 @@ bool8 sub_80614DC(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8061328(mapObject, sprite))
{
mapObject->mapobj_bit_22 = 0;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -6531,16 +6412,16 @@ bool8 sub_80614DC(struct MapObject *mapObject, struct Sprite *sprite)
void sub_8061508(struct Sprite *sprite, u16 duration)
{
- sprite->data2 = 1;
- sprite->data3 = duration;
+ sprite->data[2] = 1;
+ sprite->data[3] = duration;
}
bool8 sub_8061510(struct MapObject *mapObject, struct Sprite *sprite)
{
- sprite->data3--;
- if (!sprite->data3)
+ sprite->data[3]--;
+ if (!sprite->data[3])
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -6591,7 +6472,7 @@ bool8 sub_80615EC(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -6606,7 +6487,7 @@ bool8 sub_806162C(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -6621,7 +6502,7 @@ bool8 sub_806166C(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -6636,7 +6517,7 @@ bool8 sub_80616AC(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -6647,16 +6528,16 @@ void sub_80616CC(struct MapObject *mapObject, struct Sprite *sprite, u8 directio
FieldObjectSetDirection(mapObject, direction);
sub_805FE28(mapObject, sprite, animId);
sprite->animPaused = 0;
- sprite->data2 = 1;
- sprite->data3 = duration;
+ sprite->data[2] = 1;
+ sprite->data[3] = duration;
}
bool8 sub_8061714(struct MapObject *mapObject, struct Sprite *sprite)
{
- sprite->data3--;
- if (sprite->data3 == 0)
+ sprite->data[3]--;
+ if (sprite->data[3] == 0)
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
sprite->animPaused = 1;
return TRUE;
}
@@ -6665,7 +6546,7 @@ bool8 sub_8061714(struct MapObject *mapObject, struct Sprite *sprite)
bool8 sub_806173C(struct MapObject *mapObject, struct Sprite *sprite)
{
- if (sprite->data3 & 1)
+ if (sprite->data[3] & 1)
{
sprite->animDelayCounter++;
}
@@ -6780,7 +6661,7 @@ bool8 sub_8061B18(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -6799,7 +6680,7 @@ bool8 sub_8061B58(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -6818,7 +6699,7 @@ bool8 sub_8061B98(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -6837,7 +6718,7 @@ bool8 sub_8061BD8(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -6855,7 +6736,7 @@ bool8 sub_8061C18(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -6873,7 +6754,7 @@ bool8 sub_8061C58(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -6892,7 +6773,7 @@ bool8 sub_8061C98(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -6911,7 +6792,7 @@ bool8 sub_8061CD8(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -6929,7 +6810,7 @@ bool8 sub_8061D18(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -6947,7 +6828,7 @@ bool8 sub_8061D58(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -6966,7 +6847,7 @@ bool8 sub_8061D98(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -6985,7 +6866,7 @@ bool8 sub_8061DD8(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7003,7 +6884,7 @@ bool8 sub_8061E18(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7021,7 +6902,7 @@ bool8 sub_8061E58(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7039,7 +6920,7 @@ bool8 sub_8061E98(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7057,7 +6938,7 @@ bool8 sub_8061ED8(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7067,7 +6948,7 @@ void npc_set_direction_and_anim__an_proceed(struct MapObject *mapObject, struct
{
obj_anim_image_set_and_seek(sprite, animNum, 0);
FieldObjectSetDirection(mapObject, direction);
- sprite->data2 = 1;
+ sprite->data[2] = 1;
}
bool8 sub_8061F24(struct MapObject *mapObject, struct Sprite *sprite)
@@ -7082,7 +6963,7 @@ bool8 sub_8061F3C(struct MapObject *mapObject, struct Sprite *sprite)
{
if (sub_8064864(sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7106,7 +6987,7 @@ bool8 sub_8061FB0(struct MapObject *mapObject, struct Sprite *sprite)
{
if (sub_8061340(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
mapObject->mapobj_bit_5 = 0;
return TRUE;
}
@@ -7125,7 +7006,7 @@ bool8 sub_8061FF8(struct MapObject *mapObject, struct Sprite *sprite)
{
if (sub_8061340(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
mapObject->mapobj_bit_5 = 0;
return TRUE;
}
@@ -7144,7 +7025,7 @@ bool8 sub_8062040(struct MapObject *mapObject, struct Sprite *sprite)
{
if (sub_8061340(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
mapObject->mapobj_bit_5 = 0;
return TRUE;
}
@@ -7163,7 +7044,7 @@ bool8 sub_8062088(struct MapObject *mapObject, struct Sprite *sprite)
{
if (sub_8061340(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
mapObject->mapobj_bit_5 = 0;
return TRUE;
}
@@ -7173,36 +7054,36 @@ bool8 sub_8062088(struct MapObject *mapObject, struct Sprite *sprite)
bool8 sub_80620B0(struct MapObject *mapObject, struct Sprite *sprite)
{
u8 objectId;
- if (!TryGetFieldObjectIdByLocalIdAndMap(0xFF, MAP_GROUP_PETALBURG_CITY, MAP_ID_PETALBURG_CITY, &objectId))
+ if (!TryGetFieldObjectIdByLocalIdAndMap(0xFF, MAP_GROUP(PETALBURG_CITY), MAP_NUM(PETALBURG_CITY), &objectId))
{
an_look_any(mapObject, sprite, sub_805FE90(mapObject->coords2.x, mapObject->coords2.y, gMapObjects[objectId].coords2.x, gMapObjects[objectId].coords2.y));
}
- sprite->data2 = 1;
+ sprite->data[2] = 1;
return TRUE;
}
bool8 sub_806210C(struct MapObject *mapObject, struct Sprite *sprite)
{
u8 objectId;
- if (!TryGetFieldObjectIdByLocalIdAndMap(0xFF, MAP_GROUP_PETALBURG_CITY, MAP_ID_PETALBURG_CITY, &objectId))
+ if (!TryGetFieldObjectIdByLocalIdAndMap(0xFF, MAP_GROUP(PETALBURG_CITY), MAP_NUM(PETALBURG_CITY), &objectId))
{
an_look_any(mapObject, sprite, GetOppositeDirection(sub_805FE90(mapObject->coords2.x, mapObject->coords2.y, gMapObjects[objectId].coords2.x, gMapObjects[objectId].coords2.y)));
}
- sprite->data2 = 1;
+ sprite->data[2] = 1;
return TRUE;
}
bool8 sub_8062170(struct MapObject *mapObject, struct Sprite *sprite)
{
mapObject->mapobj_bit_9 = 1;
- sprite->data2 = 1;
+ sprite->data[2] = 1;
return TRUE;
}
bool8 sub_8062180(struct MapObject *mapObject, struct Sprite *sprite)
{
mapObject->mapobj_bit_9 = 0;
- sprite->data2 = 1;
+ sprite->data[2] = 1;
return TRUE;
}
@@ -7219,7 +7100,7 @@ bool8 sub_80621BC(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8061328(mapObject, sprite))
{
mapObject->mapobj_bit_22 = 0;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7238,7 +7119,7 @@ bool8 sub_8062214(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8061328(mapObject, sprite))
{
mapObject->mapobj_bit_22 = 0;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7257,7 +7138,7 @@ bool8 sub_806226C(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8061328(mapObject, sprite))
{
mapObject->mapobj_bit_22 = 0;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7276,7 +7157,7 @@ bool8 sub_80622C4(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8061328(mapObject, sprite))
{
mapObject->mapobj_bit_22 = 0;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7295,7 +7176,7 @@ bool8 sub_806231C(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8061328(mapObject, sprite))
{
mapObject->mapobj_bit_22 = 0;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7314,7 +7195,7 @@ bool8 sub_8062374(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8061328(mapObject, sprite))
{
mapObject->mapobj_bit_22 = 0;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7333,7 +7214,7 @@ bool8 sub_80623CC(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8061328(mapObject, sprite))
{
mapObject->mapobj_bit_22 = 0;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7352,7 +7233,7 @@ bool8 sub_8062424(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8061328(mapObject, sprite))
{
mapObject->mapobj_bit_22 = 0;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7371,7 +7252,7 @@ bool8 sub_806247C(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8061358(mapObject, sprite))
{
mapObject->mapobj_bit_22 = 0;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7390,7 +7271,7 @@ bool8 sub_80624D4(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8061358(mapObject, sprite))
{
mapObject->mapobj_bit_22 = 0;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7409,7 +7290,7 @@ bool8 sub_806252C(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8061358(mapObject, sprite))
{
mapObject->mapobj_bit_22 = 0;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7428,7 +7309,7 @@ bool8 sub_8062584(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8061358(mapObject, sprite))
{
mapObject->mapobj_bit_22 = 0;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7449,66 +7330,66 @@ bool8 sub_80625C8(struct MapObject *mapObject, struct Sprite *sprite)
bool8 sub_80625D8(struct MapObject *mapObject, struct Sprite *sprite)
{
mapObject->mapobj_bit_25 = 0;
- sprite->data2 = 1;
+ sprite->data[2] = 1;
return TRUE;
}
bool8 sub_80625E8(struct MapObject *mapObject, struct Sprite *sprite)
{
mapObject->mapobj_bit_25 = 1;
- sprite->data2 = 1;
+ sprite->data[2] = 1;
return TRUE;
}
bool8 sub_80625F8(struct MapObject *mapObject, struct Sprite *sprite)
{
mapObject->mapobj_bit_12 = 1;
- sprite->data2 = 1;
+ sprite->data[2] = 1;
return TRUE;
}
bool8 sub_8062608(struct MapObject *mapObject, struct Sprite *sprite)
{
mapObject->mapobj_bit_12 = GetFieldObjectGraphicsInfo(mapObject->graphicsId)->inanimate;
- sprite->data2 = 1;
+ sprite->data[2] = 1;
return TRUE;
}
bool8 sub_8062634(struct MapObject *mapObject, struct Sprite *sprite)
{
mapObject->mapobj_bit_13 = 1;
- sprite->data2 = 1;
+ sprite->data[2] = 1;
return TRUE;
}
bool8 sub_8062644(struct MapObject *mapObject, struct Sprite *sprite)
{
mapObject->mapobj_bit_13 = 0;
- sprite->data2 = 1;
+ sprite->data[2] = 1;
return TRUE;
}
bool8 do_exclamation_mark_bubble_1(struct MapObject *mapObject, struct Sprite *sprite)
{
- FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gUnknown_0202FF84[0], (u8 *)&gUnknown_0202FF84[1], (u8 *)&gUnknown_0202FF84[2]);
- FieldEffectStart(0x0);
- sprite->data2 = 1;
+ FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
+ FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_1);
+ sprite->data[2] = 1;
return TRUE;
}
bool8 do_exclamation_mark_bubble_2(struct MapObject *mapObject, struct Sprite *sprite)
{
- FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gUnknown_0202FF84[0], (u8 *)&gUnknown_0202FF84[1], (u8 *)&gUnknown_0202FF84[2]);
- FieldEffectStart(0x21);
- sprite->data2 = 1;
+ FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
+ FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_2);
+ sprite->data[2] = 1;
return TRUE;
}
bool8 do_heart_bubble(struct MapObject *mapObject, struct Sprite *sprite)
{
- FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gUnknown_0202FF84[0], (u8 *)&gUnknown_0202FF84[1], (u8 *)&gUnknown_0202FF84[2]);
- FieldEffectStart(0x2e);
- sprite->data2 = 1;
+ FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
+ FieldEffectStart(FLDEFF_HEART_ICON);
+ sprite->data[2] = 1;
return TRUE;
}
@@ -7523,13 +7404,13 @@ bool8 sub_80626C0(struct MapObject *mapObject, struct Sprite *sprite)
}
else if (mapObject->animPattern != 0x39 && mapObject->animPattern != 0x3A)
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
else
{
sub_812869C(mapObject);
- sprite->data2 = 1;
+ sprite->data[2] = 1;
return sub_8062704(mapObject, sprite);
}
}
@@ -7538,7 +7419,7 @@ bool8 sub_8062704(struct MapObject *mapObject, struct Sprite *sprite)
{
if (sub_81286C4(mapObject))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7547,7 +7428,7 @@ bool8 sub_8062704(struct MapObject *mapObject, struct Sprite *sprite)
bool8 sub_8062724(struct MapObject *mapObject, struct Sprite *sprite)
{
obj_anim_image_set_and_seek(sprite, 1, 0);
- sprite->data2 = 1;
+ sprite->data[2] = 1;
return FALSE;
}
@@ -7556,7 +7437,7 @@ bool8 sub_8062740(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8064864(sprite))
{
sub_8064820(sprite, 0x20);
- sprite->data2 = 2;
+ sprite->data[2] = 2;
}
return FALSE;
}
@@ -7567,7 +7448,7 @@ bool8 sub_8062764(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8064824(sprite))
{
mapObject->mapobj_bit_13 = 1;
- sprite->data2 = 3;
+ sprite->data[2] = 3;
}
return FALSE;
}
@@ -7575,7 +7456,7 @@ bool8 sub_8062764(struct MapObject *mapObject, struct Sprite *sprite)
bool8 sub_80627A0(struct MapObject *mapObject, struct Sprite *sprite)
{
obj_anim_image_set_and_seek(sprite, 1, 0);
- sprite->data2 = 1;
+ sprite->data[2] = 1;
return FALSE;
}
@@ -7584,7 +7465,7 @@ bool8 sub_80627BC(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8064864(sprite))
{
sub_8064820(sprite, 0x20);
- sprite->data2 = 2;
+ sprite->data[2] = 2;
}
return FALSE;
}
@@ -7595,7 +7476,7 @@ bool8 sub_80627E0(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8064824(sprite))
{
mapObject->mapobj_bit_13 = 1;
- sprite->data2 = 3;
+ sprite->data[2] = 3;
}
return FALSE;
}
@@ -7603,14 +7484,14 @@ bool8 sub_80627E0(struct MapObject *mapObject, struct Sprite *sprite)
bool8 sub_806281C(struct MapObject *mapObject, struct Sprite *sprite)
{
mapObject->mapobj_bit_26 = 1;
- sprite->data2 = 1;
+ sprite->data[2] = 1;
return TRUE;
}
bool8 sub_806282C(struct MapObject *mapObject, struct Sprite *sprite)
{
mapObject->mapobj_bit_26 = 0;
- sprite->data2 = 1;
+ sprite->data[2] = 1;
return TRUE;
}
@@ -7646,7 +7527,7 @@ bool8 sub_80628D0(struct MapObject *mapObject, struct Sprite *sprite)
if (an_walk_any_2(mapObject, sprite))
{
sprite->affineAnimPaused = 1;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7667,7 +7548,7 @@ bool8 sub_8062930(struct MapObject *mapObject, struct Sprite *sprite)
if (an_walk_any_2(mapObject, sprite))
{
sprite->affineAnimPaused = 1;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7679,7 +7560,7 @@ void sub_806295C(struct MapObject *mapObject, struct Sprite *sprite, u8 directio
npc_coords_shift_still(mapObject);
sub_805FE64(mapObject, sprite, sub_805FDD8(direction));
sprite->animPaused = 1;
- sprite->data2 = 1;
+ sprite->data[2] = 1;
}
bool8 sub_806299C(struct MapObject *mapObject, struct Sprite *sprite)
@@ -7798,7 +7679,7 @@ bool8 sub_8062BFC(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8061328(mapObject, sprite))
{
mapObject->mapobj_bit_22 = 0;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7817,7 +7698,7 @@ bool8 sub_8062C54(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8061328(mapObject, sprite))
{
mapObject->mapobj_bit_22 = 0;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7836,7 +7717,7 @@ bool8 sub_8062CAC(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8061328(mapObject, sprite))
{
mapObject->mapobj_bit_22 = 0;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7855,7 +7736,7 @@ bool8 sub_8062D04(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8061328(mapObject, sprite))
{
mapObject->mapobj_bit_22 = 0;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7874,7 +7755,7 @@ bool8 sub_8062D5C(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8061328(mapObject, sprite))
{
mapObject->mapobj_bit_22 = 0;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7893,7 +7774,7 @@ bool8 sub_8062DB4(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8061328(mapObject, sprite))
{
mapObject->mapobj_bit_22 = 0;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7912,7 +7793,7 @@ bool8 sub_8062E0C(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8061328(mapObject, sprite))
{
mapObject->mapobj_bit_22 = 0;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7931,7 +7812,7 @@ bool8 sub_8062E64(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8061328(mapObject, sprite))
{
mapObject->mapobj_bit_22 = 0;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7950,7 +7831,7 @@ bool8 sub_8062EBC(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8061328(mapObject, sprite))
{
mapObject->mapobj_bit_22 = 0;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7969,7 +7850,7 @@ bool8 sub_8062F14(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8061328(mapObject, sprite))
{
mapObject->mapobj_bit_22 = 0;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -7988,7 +7869,7 @@ bool8 sub_8062F6C(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8061328(mapObject, sprite))
{
mapObject->mapobj_bit_22 = 0;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -8007,7 +7888,7 @@ bool8 sub_8062FC4(struct MapObject *mapObject, struct Sprite *sprite)
if (sub_8061328(mapObject, sprite))
{
mapObject->mapobj_bit_22 = 0;
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -8056,7 +7937,7 @@ bool8 sub_8063128(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -8074,7 +7955,7 @@ bool8 sub_8063168(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -8092,7 +7973,7 @@ bool8 sub_80631A8(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -8110,7 +7991,7 @@ bool8 sub_80631E8(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -8134,7 +8015,7 @@ bool8 sub_8063258(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -8152,7 +8033,7 @@ bool8 sub_8063298(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -8170,7 +8051,7 @@ bool8 sub_80632D8(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -8188,7 +8069,7 @@ bool8 sub_8063318(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -8213,7 +8094,7 @@ bool8 sub_8063390(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -8231,7 +8112,7 @@ bool8 sub_80633D0(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -8249,7 +8130,7 @@ bool8 sub_8063410(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -8267,7 +8148,7 @@ bool8 sub_8063450(struct MapObject *mapObject, struct Sprite *sprite)
{
if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
{
- sprite->data2 = 2;
+ sprite->data[2] = 2;
return TRUE;
}
return FALSE;
@@ -8303,12 +8184,12 @@ void sub_80634A0(struct MapObject *mapObject, struct Sprite *sprite)
}
void sub_80634E8(struct MapObject *, struct Sprite *);
-void npc_update_obj_anim_flag(struct MapObject *, struct Sprite *);
+static void UpdateMapObjSpriteVisibility(struct MapObject *, struct Sprite *);
void sub_80634D0(struct MapObject *mapObject, struct Sprite *sprite)
{
sub_80634E8(mapObject, sprite);
- npc_update_obj_anim_flag(mapObject, sprite);
+ UpdateMapObjSpriteVisibility(mapObject, sprite);
}
#ifdef NONMATCHING
@@ -8464,7 +8345,7 @@ _080635C0:\n\
}
#endif
-void npc_update_obj_anim_flag(struct MapObject *mapObject, struct Sprite *sprite)
+void UpdateMapObjSpriteVisibility(struct MapObject *mapObject, struct Sprite *sprite)
{
sprite->invisible = 0;
if (mapObject->mapobj_bit_13 || mapObject->mapobj_bit_14)
diff --git a/src/field_map_obj_helpers.c b/src/field/field_map_obj_helpers.c
index 87be8e011..328b66ed2 100644
--- a/src/field_map_obj_helpers.c
+++ b/src/field/field_map_obj_helpers.c
@@ -7,13 +7,92 @@
typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 dir);
-extern s16 gUnknown_08376194[];
-extern SpriteStepFunc *gUnknown_08376180[];
-extern s8 *gUnknown_083761D0[];
-extern s16 gUnknown_083761DC[];
-extern u8 gUnknown_083761E2[];
-extern s16 gUnknown_083761E6[];
-extern u8 gUnknown_083761EC[];
+void Step1(struct Sprite *sprite, u8 dir);
+void Step2(struct Sprite *sprite, u8 dir);
+void Step3(struct Sprite *sprite, u8 dir);
+void Step4(struct Sprite *sprite, u8 dir);
+void Step8(struct Sprite *sprite, u8 dir);
+
+const SpriteStepFunc Unknown_83760F0[] = {
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1,
+ Step1
+};
+
+const SpriteStepFunc Unknown_8376130[] = {
+ Step2,
+ Step2,
+ Step2,
+ Step2,
+ Step2,
+ Step2,
+ Step2,
+ Step2
+};
+
+const SpriteStepFunc Unknown_8376150[] = {
+ Step2,
+ Step3,
+ Step3,
+ Step2,
+ Step3,
+ Step3
+};
+
+const SpriteStepFunc Unknown_8376168[] = {
+ Step4,
+ Step4,
+ Step4,
+ Step4
+};
+
+const SpriteStepFunc Unknown_8376178[] = {
+ Step8,
+ Step8
+};
+
+const SpriteStepFunc *const gUnknown_08376180[] = {
+ Unknown_83760F0,
+ Unknown_8376130,
+ Unknown_8376150,
+ Unknown_8376168,
+ Unknown_8376178
+};
+
+const s16 gUnknown_08376194[] = {
+ 16, 8, 6, 4, 2
+};
+
+const s8 Unknown_837619E[] = {
+ -4, -6, -8, -10, -11, -12, -12, -12, -11, -10, -9, -8, -6, -4, 0, 0
+};
+
+const s8 Unknown_83761AE[] = {
+ 0, -2, -3, -4, -5, -6, -6, -6, -5, -5, -4, -3, -2, 0, 0, 0
+};
+
+const s8 Unknown_83761BE[] = {
+ -2, -4, -6, -8, -9, -10, -10, -10, -9, -8, -6, -5, -3, -2, 0, 0
+};
+
+const s8 *const gUnknown_083761D0[] = {
+ Unknown_837619E,
+ Unknown_83761AE,
+ Unknown_83761BE
+};
bool8 FreezeMapObject(struct MapObject *mapObject)
{
@@ -98,21 +177,21 @@ void Step8(struct Sprite *sprite, u8 dir)
void oamt_npc_ministep_reset(struct Sprite *sprite, u8 a2, u8 a3)
{
- sprite->data3 = a2;
- sprite->data4 = a3;
- sprite->data5 = 0;
+ sprite->data[3] = a2;
+ sprite->data[4] = a3;
+ sprite->data[5] = 0;
}
bool8 obj_npc_ministep(struct Sprite *sprite)
{
- if (sprite->data5 >= gUnknown_08376194[sprite->data4])
+ if (sprite->data[5] >= gUnknown_08376194[sprite->data[4]])
return FALSE;
- gUnknown_08376180[sprite->data4][sprite->data5](sprite, sprite->data3);
+ gUnknown_08376180[sprite->data[4]][sprite->data[5]](sprite, sprite->data[3]);
- sprite->data5++;
+ sprite->data[5]++;
- if (sprite->data5 < gUnknown_08376194[sprite->data4])
+ if (sprite->data[5] < gUnknown_08376194[sprite->data[4]])
return FALSE;
return TRUE;
@@ -120,22 +199,22 @@ bool8 obj_npc_ministep(struct Sprite *sprite)
void sub_806467C(struct Sprite *sprite, u8 a2)
{
- sprite->data3 = a2;
- sprite->data4 = 0;
- sprite->data5 = 0;
+ sprite->data[3] = a2;
+ sprite->data[4] = 0;
+ sprite->data[5] = 0;
}
bool8 sub_806468C(struct Sprite *sprite)
{
- if (!(sprite->data4 & 1))
+ if (!(sprite->data[4] & 1))
{
- Step1(sprite, sprite->data3);
- sprite->data5++;
+ Step1(sprite, sprite->data[3]);
+ sprite->data[5]++;
}
- sprite->data4++;
+ sprite->data[4]++;
- if (sprite->data5 > 15)
+ if (sprite->data[5] > 15)
return TRUE;
else
return FALSE;
@@ -148,34 +227,29 @@ s16 sub_80646C8(s16 a1, u8 a2)
void sub_80646E4(struct Sprite *sprite, u8 a2, u8 a3, u8 a4)
{
- sprite->data3 = a2;
- sprite->data4 = a3;
- sprite->data5 = a4;
- sprite->data6 = 0;
+ sprite->data[3] = a2;
+ sprite->data[4] = a3;
+ sprite->data[5] = a4;
+ sprite->data[6] = 0;
}
u8 sub_8064704(struct Sprite *sprite)
{
- u8 v2;
- s16 v5[3];
- u8 v6[3];
+ s16 v5[3] = {0x10, 0x10, 0x20};
+ u8 v6[3] = {0, 0, 1};
+ u8 v2 = 0;
- memcpy(v5, gUnknown_083761DC, 6);
- memcpy(v6, gUnknown_083761E2, 3);
+ if (sprite->data[4])
+ Step1(sprite, sprite->data[3]);
- v2 = 0;
+ sprite->pos2.y = sub_80646C8(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]);
- if (sprite->data4)
- Step1(sprite, sprite->data3);
+ sprite->data[6]++;
- sprite->pos2.y = sub_80646C8(sprite->data6 >> v6[sprite->data4], sprite->data5);
-
- sprite->data6++;
-
- if (sprite->data6 == (v5[sprite->data4] >> 1))
+ if (sprite->data[6] == (v5[sprite->data[4]] >> 1))
v2 = 1;
- if (sprite->data6 >= v5[sprite->data4])
+ if (sprite->data[6] >= v5[sprite->data[4]])
{
sprite->pos2.y = 0;
v2 = -1;
@@ -186,26 +260,21 @@ u8 sub_8064704(struct Sprite *sprite)
u8 sub_806478C(struct Sprite *sprite)
{
- u8 v2;
- s16 v5[3];
- u8 v6[3];
-
- memcpy(v5, gUnknown_083761E6, 6);
- memcpy(v6, gUnknown_083761EC, 3);
-
- v2 = 0;
+ s16 v5[3] = {0x20, 0x20, 0x40};
+ u8 v6[3] = {1, 1, 2};
+ u8 v2 = 0;
- if (sprite->data4 && !(sprite->data6 & 1))
- Step1(sprite, sprite->data3);
+ if (sprite->data[4] && !(sprite->data[6] & 1))
+ Step1(sprite, sprite->data[3]);
- sprite->pos2.y = sub_80646C8(sprite->data6 >> v6[sprite->data4], sprite->data5);
+ sprite->pos2.y = sub_80646C8(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]);
- sprite->data6++;
+ sprite->data[6]++;
- if (sprite->data6 == (v5[sprite->data4] >> 1))
+ if (sprite->data[6] == (v5[sprite->data[4]] >> 1))
v2 = 1;
- if (sprite->data6 >= v5[sprite->data4])
+ if (sprite->data[6] >= v5[sprite->data[4]])
{
sprite->pos2.y = 0;
v2 = -1;
@@ -216,14 +285,14 @@ u8 sub_806478C(struct Sprite *sprite)
void sub_8064820(struct Sprite *sprite, u16 a2)
{
- sprite->data3 = a2;
+ sprite->data[3] = a2;
}
bool8 sub_8064824(struct Sprite *sprite)
{
- sprite->data3--;
+ sprite->data[3]--;
- if (sprite->data3 == 0)
+ if (sprite->data[3] == 0)
return TRUE;
else
return FALSE;
@@ -273,7 +342,7 @@ void sub_806487C(struct Sprite *sprite, bool8 invisible)
void sub_8064970(struct Sprite *sprite)
{
- SetObjectSubpriorityByZCoord(sprite->data1, sprite, 1);
+ SetObjectSubpriorityByZCoord(sprite->data[1], sprite, 1);
sub_806487C(sprite, 0);
}
@@ -283,7 +352,7 @@ void sub_8064990(u8 a1, u8 dir)
for (i = 0; i < MAX_SPRITES; i++)
{
struct Sprite *sprite = &gSprites[i];
- if (sprite->inUse && sprite->callback == sub_8064970 && (u8)sprite->data0 == a1)
+ if (sprite->inUse && sprite->callback == sub_8064970 && (u8)sprite->data[0] == a1)
{
u8 animNum = FieldObjectDirectionToImageAnimId(dir);
StartSpriteAnim(sprite, animNum);
@@ -294,7 +363,7 @@ void sub_8064990(u8 a1, u8 dir)
u32 oe_exec_and_other_stuff(u8 fieldEffectId, struct MapObject *mapObject)
{
- FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gUnknown_0202FF84[0], (u8 *)&gUnknown_0202FF84[1], (u8 *)&gUnknown_0202FF84[2]);
+ FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
return FieldEffectStart(fieldEffectId);
}
@@ -303,16 +372,16 @@ 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);
}
}
void DoRippleFieldEffect(struct MapObject *mapObject, struct Sprite *sprite)
{
const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId);
- gUnknown_0202FF84[0] = sprite->pos1.x;
- gUnknown_0202FF84[1] = sprite->pos1.y + (gfxInfo->height >> 1) - 2;
- gUnknown_0202FF84[2] = 151;
- gUnknown_0202FF84[3] = 3;
- FieldEffectStart(5);
+ gFieldEffectArguments[0] = sprite->pos1.x;
+ gFieldEffectArguments[1] = sprite->pos1.y + (gfxInfo->height >> 1) - 2;
+ gFieldEffectArguments[2] = 151;
+ gFieldEffectArguments[3] = 3;
+ FieldEffectStart(FLDEFF_RIPPLE);
}
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 2a7b2f3e0..d80076be4 100644
--- a/src/field_player_avatar.c
+++ b/src/field/field_player_avatar.c
@@ -9,15 +9,15 @@
#include "field_map_obj_helpers.h"
#include "fieldmap.h"
#include "main.h"
-#include "map_object_constants.h"
+#include "constants/map_objects.h"
#include "menu.h"
#include "metatile_behavior.h"
#include "party_menu.h"
-#include "rng.h"
-#include "rom4.h"
+#include "random.h"
+#include "overworld.h"
#include "rotating_gate.h"
#include "script.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "strings2.h"
#include "task.h"
@@ -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,10 +486,11 @@ 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)
+ if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_4) && (heldKeys & B_BUTTON) && FlagGet(FLAG_SYS_B_DASH)
&& IsRunningDisallowed(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E) == 0)
{
sub_805940C(direction);
@@ -497,7 +498,7 @@ void sub_8058D0C(u8 direction, u16 heldKeys)
}
else
{
- PlayerGoSpeed0(direction);
+ PlayerGoSpeed1(direction);
}
}
}
@@ -562,7 +563,7 @@ static bool8 ShouldJumpLedge(s16 a, s16 b, u8 c)
static u8 sub_8058F6C(s16 a, s16 b, u8 c)
{
- if (FlagGet(SYS_USE_STRENGTH))
+ if (FlagGet(FLAG_SYS_USE_STRENGTH))
{
u8 mapObjectId = GetFieldObjectIdByXY(a, b);
@@ -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)
@@ -666,10 +667,10 @@ void PlayerAvatarTransition_Surfing(struct MapObject *a)
sub_805B980(a, GetPlayerAvatarGraphicsIdByStateId(3));
FieldObjectTurn(a, a->placeholder18);
SetPlayerAvatarStateMask(8);
- gUnknown_0202FF84[0] = a->coords2.x;
- gUnknown_0202FF84[1] = a->coords2.y;
- gUnknown_0202FF84[2] = gPlayerAvatar.mapObjectId;
- unk = FieldEffectStart(8);
+ gFieldEffectArguments[0] = a->coords2.x;
+ gFieldEffectArguments[1] = a->coords2.y;
+ gFieldEffectArguments[2] = gPlayerAvatar.mapObjectId;
+ unk = FieldEffectStart(FLDEFF_SURF_BLOB);
a->mapobj_unk_1A = unk;
sub_8127ED0(unk, 1);
}
@@ -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,13 +1233,13 @@ 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]));
- gUnknown_0202FF84[0] = c->coords2.x;
- gUnknown_0202FF84[1] = c->coords2.y;
- gUnknown_0202FF84[2] = c->elevation;
- gUnknown_0202FF84[3] = gSprites[c->spriteId].oam.priority;
- FieldEffectStart(10);
+ 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;
+ gFieldEffectArguments[3] = gSprites[c->spriteId].oam.priority;
+ FieldEffectStart(FLDEFF_DUST);
PlaySE(SE_W070);
task->data[0]++;
}
@@ -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);
@@ -1406,7 +1414,7 @@ static void sub_805A2D0(u8 taskId)
/* Fishing */
-static u8 (*const gUnknown_0830FCB4[])(struct Task *) =
+static u8 (*const sFishingStateFuncs[])(struct Task *) =
{
Fishing1,
Fishing2,
@@ -1429,25 +1437,41 @@ static u8 (*const gUnknown_0830FCB4[])(struct Task *) =
static void Task_Fishing(u8 taskId);
static void sub_805A954(void);
-void StartFishing(u8 a)
+#define tStep data[0]
+#define tFrameCounter data[1]
+#define tNumDots data[2]
+#define tDotsRequired data[3]
+#define tRoundsPlayed data[12]
+#define tMinRoundsRequired data[13]
+#define tPlayerGfxId data[14]
+#define tFishingRod data[15]
+
+#define FISHING_START_ROUND 3
+#define FISHING_GOT_BITE 6
+#define FISHING_ON_HOOK 9
+#define FISHING_NO_BITE 11
+#define FISHING_GOT_AWAY 12
+#define FISHING_SHOW_RESULT 13
+
+void StartFishing(u8 rod)
{
u8 taskId = CreateTask(Task_Fishing, 0xFF);
- gTasks[taskId].data[15] = a;
+ gTasks[taskId].tFishingRod = rod;
Task_Fishing(taskId);
}
static void Task_Fishing(u8 taskId)
{
- while (gUnknown_0830FCB4[gTasks[taskId].data[0]](&gTasks[taskId]))
+ while (sFishingStateFuncs[gTasks[taskId].tStep](&gTasks[taskId]))
;
}
u8 Fishing1(struct Task *task)
{
ScriptContext2_Enable();
- gPlayerAvatar.unk6 = 1;
- task->data[0]++;
+ gPlayerAvatar.preventStep = TRUE;
+ task->tStep++;
return 0;
}
@@ -1457,23 +1481,25 @@ u8 Fishing2(struct Task *task)
const s16 arr1[] = {1, 1, 1};
const s16 arr2[] = {1, 3, 6};
- task->data[12] = 0;
- task->data[13] = arr1[task->data[15]] + (Random() % arr2[task->data[15]]);
- task->data[14] = gMapObjects[gPlayerAvatar.mapObjectId].graphicsId;
+ task->tRoundsPlayed = 0;
+ task->tMinRoundsRequired = arr1[task->tFishingRod] + (Random() % arr2[task->tFishingRod]);
+ task->tPlayerGfxId = gMapObjects[gPlayerAvatar.mapObjectId].graphicsId;
playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
FieldObjectClearAnimIfSpecialAnimActive(playerMapObj);
playerMapObj->mapobj_bit_11 = 1;
sub_8059C3C(playerMapObj->mapobj_unk_18);
- task->data[0]++;
+ task->tStep++;
return 0;
}
u8 Fishing3(struct Task *task)
{
sub_805A954();
- task->data[1]++;
- if (task->data[1] > 0x3B)
- task->data[0]++;
+
+ // Wait one second before starting dot game
+ task->tFrameCounter++;
+ if (task->tFrameCounter >= 60)
+ task->tStep++;
return 0;
}
@@ -1482,87 +1508,92 @@ u8 Fishing4(struct Task *task)
u32 randVal;
MenuDisplayMessageBox();
- task->data[0]++;
- task->data[1] = 0;
- task->data[2] = 0;
+ task->tStep++;
+ task->tFrameCounter = 0;
+ task->tNumDots = 0;
randVal = Random();
randVal %= 10;
- task->data[3] = randVal + 1;
- if (task->data[12] == 0)
- task->data[3] = randVal + 4;
- if (task->data[3] > 9)
- task->data[3] = 10;
+ task->tDotsRequired = randVal + 1;
+ if (task->tRoundsPlayed == 0)
+ task->tDotsRequired = randVal + 4;
+ if (task->tDotsRequired >= 10)
+ task->tDotsRequired = 10;
return 1;
}
+// Play a round of the dot game
u8 Fishing5(struct Task *task)
{
const u8 dot[] = _("·");
sub_805A954();
- task->data[1]++;
+ task->tFrameCounter++;
if (gMain.newKeys & A_BUTTON)
{
- task->data[0] = 11;
- if (task->data[12] != 0)
- task->data[0] = 12;
+ task->tStep = FISHING_NO_BITE;
+ if (task->tRoundsPlayed != 0)
+ task->tStep = FISHING_GOT_AWAY;
return 1;
}
else
{
- if (task->data[1] > 0x13)
+ if (task->tFrameCounter >= 20)
{
- task->data[1] = 0;
- if (task->data[2] >= task->data[3])
+ task->tFrameCounter = 0;
+ if (task->tNumDots >= task->tDotsRequired)
{
- task->data[0]++;
- if (task->data[12] != 0)
- task->data[0]++;
- task->data[12]++;
+ task->tStep++;
+ if (task->tRoundsPlayed != 0)
+ task->tStep++;
+ task->tRoundsPlayed++;
}
else
{
- MenuPrint(dot, task->data[2] + 4, 15);
- task->data[2]++;
+ MenuPrint(dot, task->tNumDots + 4, 15);
+ task->tNumDots++;
}
}
return 0;
}
}
+// Determine if fish bites
u8 Fishing6(struct Task *task)
{
sub_805A954();
- task->data[0]++;
- if (!GetFishingWildMonListHeader() || (Random() & 1))
- task->data[0] = 11;
+ task->tStep++;
+ if (!DoesCurrentMapHaveFishingMons() || (Random() & 1))
+ task->tStep = FISHING_NO_BITE;
else
StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], sub_805FE08(player_get_direction_lower_nybble()));
return 1;
}
+// Oh! A Bite!
u8 Fishing7(struct Task *task)
{
sub_805A954();
MenuPrint(gOtherText_OhABite, 4, 17);
- task->data[0]++;
- task->data[1] = 0;
+ task->tStep++;
+ task->tFrameCounter = 0;
return 0;
}
+// We have a bite. Now, wait for the player to press A, or the timer to expire.
u8 Fishing8(struct Task *task)
{
- const s16 arr[3] = {36, 33, 30};
+ const s16 reelTimeouts[3] = {36, 33, 30};
sub_805A954();
- task->data[1]++;
- if (task->data[1] >= arr[task->data[15]])
- task->data[0] = 12;
+ task->tFrameCounter++;
+ if (task->tFrameCounter >= reelTimeouts[task->tFishingRod])
+ task->tStep = FISHING_GOT_AWAY;
else if (gMain.newKeys & A_BUTTON)
- task->data[0]++;
+ task->tStep++;
return 0;
}
+// Determine if we're going to play the dot game again
u8 Fishing9(struct Task *task)
{
const s16 arr[][2] =
@@ -1573,17 +1604,18 @@ u8 Fishing9(struct Task *task)
};
sub_805A954();
- task->data[0]++;
- if (task->data[12] < task->data[13])
+ task->tStep++;
+ if (task->tRoundsPlayed < task->tMinRoundsRequired)
{
- task->data[0] = 3;
+ task->tStep = FISHING_START_ROUND;
}
- else if (task->data[12] < 2)
+ else if (task->tRoundsPlayed < 2)
{
- s16 randVal = Random() % 100;
+ // probability of having to play another round
+ s16 probability = Random() % 100;
- if (arr[task->data[15]][task->data[12]] > randVal)
- task->data[0] = 3;
+ if (arr[task->tFishingRod][task->tRoundsPlayed] > probability)
+ task->tStep = FISHING_START_ROUND;
}
return 0;
}
@@ -1591,72 +1623,73 @@ u8 Fishing9(struct Task *task)
u8 Fishing10(struct Task *task)
{
sub_805A954();
- sub_8072044(gOtherText_PokeOnHook);
+ MenuPrintMessageDefaultCoords(gOtherText_PokeOnHook);
MenuDisplayMessageBox();
- task->data[0]++;
- task->data[1] = 0;
+ task->tStep++;
+ task->tFrameCounter = 0;
return 0;
}
u8 Fishing11(struct Task *task)
{
- if (task->data[1] == 0)
- {
+ if (task->tFrameCounter == 0)
sub_805A954();
- if (task->data[1] == 0)
+
+ if (task->tFrameCounter == 0)
+ {
+ if (MenuUpdateWindowText())
{
- if (MenuUpdateWindowText())
- {
- struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
-
- sub_805B980(playerMapObj, task->data[14]);
- FieldObjectTurn(playerMapObj, playerMapObj->placeholder18);
- if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING)
- sub_8127F28(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1A, 0, 0);
- gSprites[gPlayerAvatar.spriteId].pos2.x = 0;
- gSprites[gPlayerAvatar.spriteId].pos2.y = 0;
- MenuZeroFillScreen();
- task->data[1]++;
- return 0;
- }
- else
- {
- if (task->data[1] == 0)
- return 0;
- }
+ struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
+
+ sub_805B980(playerMapObj, task->tPlayerGfxId);
+ FieldObjectTurn(playerMapObj, playerMapObj->placeholder18);
+ if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING)
+ sub_8127F28(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1A, 0, 0);
+ gSprites[gPlayerAvatar.spriteId].pos2.x = 0;
+ gSprites[gPlayerAvatar.spriteId].pos2.y = 0;
+ MenuZeroFillScreen();
+ task->tFrameCounter++;
+ return 0;
}
}
- gPlayerAvatar.unk6 = 0;
- ScriptContext2_Disable();
- FishingWildEncounter(task->data[15]);
- sub_80BE97C(1);
- DestroyTask(FindTaskIdByFunc(Task_Fishing));
+
+ if (task->tFrameCounter != 0)
+ {
+ gPlayerAvatar.preventStep = FALSE;
+ ScriptContext2_Disable();
+ FishingWildEncounter(task->tFishingRod);
+ sub_80BE97C(1);
+ DestroyTask(FindTaskIdByFunc(Task_Fishing));
+ }
return 0;
}
+// Not even a nibble
u8 Fishing12(struct Task *task)
{
sub_805A954();
StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], sub_805FDF8(player_get_direction_lower_nybble()));
- sub_8072044(gOtherText_NotEvenANibble);
- task->data[0] = 13;
+ MenuPrintMessageDefaultCoords(gOtherText_NotEvenANibble);
+ task->tStep = FISHING_SHOW_RESULT;
return 1;
}
+// It got away
u8 Fishing13(struct Task *task)
{
sub_805A954();
StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], sub_805FDF8(player_get_direction_lower_nybble()));
- sub_8072044(gOtherText_ItGotAway);
- task->data[0]++;
+ MenuPrintMessageDefaultCoords(gOtherText_ItGotAway);
+ task->tStep++;
return 1;
}
+// Display the message
u8 Fishing14(struct Task *task)
{
sub_805A954();
MenuDisplayMessageBox();
- task->data[0]++;
+ task->tStep++;
return 0;
}
@@ -1667,13 +1700,13 @@ u8 Fishing15(struct Task *task)
{
struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
- sub_805B980(playerMapObj, task->data[14]);
+ sub_805B980(playerMapObj, task->tPlayerGfxId);
FieldObjectTurn(playerMapObj, playerMapObj->placeholder18);
if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING)
sub_8127F28(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1A, 0, 0);
gSprites[gPlayerAvatar.spriteId].pos2.x = 0;
gSprites[gPlayerAvatar.spriteId].pos2.y = 0;
- task->data[0]++;
+ task->tStep++;
}
return 0;
}
@@ -1682,7 +1715,7 @@ u8 Fishing16(struct Task *task)
{
if (MenuUpdateWindowText())
{
- gPlayerAvatar.unk6 = 0;
+ gPlayerAvatar.preventStep = FALSE;
ScriptContext2_Disable();
UnfreezeMapObjects();
MenuZeroFillScreen();
@@ -1692,6 +1725,10 @@ u8 Fishing16(struct Task *task)
return 0;
}
+#undef tStep
+#undef tFrameCounter
+#undef tFishingRod
+
static void sub_805A954(void)
{
struct Sprite *playerSprite = &gSprites[gPlayerAvatar.spriteId];
diff --git a/src/field_poison.c b/src/field/field_poison.c
index 8c9e029e1..49678f269 100644
--- a/src/field_poison.c
+++ b/src/field/field_poison.c
@@ -1,7 +1,7 @@
#include "global.h"
#include "field_poison.h"
#include "field_message_box.h"
-#include "fldeff_80C5CD4.h"
+#include "fldeff_poison.h"
#include "pokemon.h"
#include "pokemon_summary_screen.h"
#include "script.h"
@@ -9,7 +9,7 @@
#include "task.h"
#include "text.h"
-extern u16 gScriptResult;
+extern u16 gSpecialVar_Result;
extern u8 fieldPoisonText_PokemonFainted[];
bool32 CheckMonIsValid(struct Pokemon *pkmn)
@@ -93,9 +93,9 @@ void Task_WhiteOut(u8 taskId)
break;
case 2: //Done checking Pokemon
if (AllMonsFainted())
- gScriptResult = 1;
+ gSpecialVar_Result = 1;
else
- gScriptResult = 0;
+ gSpecialVar_Result = 0;
EnableBothScriptContexts();
DestroyTask(taskId);
break;
@@ -108,7 +108,7 @@ void ExecuteWhiteOut(void)
ScriptContext1_Stop();
}
-s32 overworld_poison(void)
+s32 DoPoisonFieldEffect(void)
{
struct Pokemon *pkmn = &gPlayerParty[0];
u32 numPoisoned = 0;
@@ -128,7 +128,7 @@ s32 overworld_poison(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..73e101d8f 100644
--- a/src/field_region_map.c
+++ b/src/field/field_region_map.c
@@ -7,6 +7,7 @@
#include "sprite.h"
#include "strings2.h"
#include "text.h"
+#include "ewram.h"
struct RegionMapStruct
{
@@ -24,14 +25,11 @@ struct UnkStruct
u16 unk888;
};
-extern u8 ewram[];
-#define unk_2000000 (*(struct UnkStruct *)(ewram))
-
void FieldInitRegionMap(MainCallback callback)
{
SetVBlankCallback(NULL);
- unk_2000000.unk888 = 0;
- unk_2000000.callback = callback;
+ ewram0_5.unk888 = 0;
+ ewram0_5.callback = callback;
SetMainCallback2(CB2_FieldInitRegionMap);
}
@@ -49,7 +47,7 @@ void CB2_FieldInitRegionMap(void)
ResetSpriteData();
FreeAllSpritePalettes();
// TODO: remove this cast
- InitRegionMap((void *)&unk_2000000.unk8, 0);
+ InitRegionMap((void *)&ewram0_5.unk8, 0);
CreateRegionMapPlayerIcon(0, 0);
CreateRegionMapCursor(1, 1);
SetUpWindowConfig(&gWindowConfig_81E709C);
@@ -82,15 +80,15 @@ void CB2_FieldRegionMap(void)
void sub_813EFDC(void)
{
- switch (unk_2000000.unk888)
+ switch (ewram0_5.unk888)
{
case 0:
REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON;
- unk_2000000.unk888++;
+ ewram0_5.unk888++;
break;
case 1:
if (!gPaletteFade.active)
- unk_2000000.unk888++;
+ ewram0_5.unk888++;
break;
case 2:
switch (sub_80FAB60())
@@ -100,18 +98,18 @@ void sub_813EFDC(void)
break;
case 4:
case 5:
- unk_2000000.unk888++;
+ ewram0_5.unk888++;
}
break;
case 3:
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
- unk_2000000.unk888++;
+ ewram0_5.unk888++;
break;
case 4:
if (!gPaletteFade.active)
{
FreeRegionMapIconResources();
- SetMainCallback2(unk_2000000.callback);
+ SetMainCallback2(ewram0_5.callback);
}
break;
}
@@ -120,6 +118,6 @@ void sub_813EFDC(void)
void sub_813F0C8(void)
{
MenuFillWindowRectWithBlankTile(17, 17, 28, 18);
- if (unk_2000000.unk8.unk16)
- MenuPrint(unk_2000000.unk8.str, 17, 17);
+ if (ewram0_5.unk8.unk16)
+ MenuPrint(ewram0_5.unk8.str, 17, 17);
}
diff --git a/src/field_screen_effect.c b/src/field/field_screen_effect.c
index 79913e1c5..a472d5a9c 100644
--- a/src/field_screen_effect.c
+++ b/src/field/field_screen_effect.c
@@ -3,29 +3,19 @@
#include "field_camera.h"
#include "menu.h"
#include "palette.h"
-#include "rom4.h"
+#include "overworld.h"
#include "script.h"
#include "task.h"
#include "text.h"
#include "unknown_task.h"
-struct UnknownStruct1
-{
- u8 filler0[0x14];
- u8 unk14;
- u8 filler15[0xB];
-};
-extern struct UnknownStruct1 gUnknown_03004DC0;
-
-extern u16 gUnknown_03004DE0[][0x3C0];
-
const static u16 gUnknown_0839ACDC[] = { 0xC8, 0x48, 0x38, 0x28, 0x18, 0x0 };
-const s32 gUnknown_0839ACE8 = 4;
+const s32 gMaxFlashLevel = 4;
-const static u32 gUnknown_0839ACEC[3] =
+const static struct UnknownTaskStruct gUnknown_0839ACEC =
{
- REG_ADDR_WIN0H,
+ (void *)REG_ADDR_WIN0H,
((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1,
1
};
@@ -74,11 +64,11 @@ static void sub_8081424(u8 taskId)
switch (data[0])
{
case 0:
- sub_8081398(&gUnknown_03004DE0[gUnknown_03004DC0.unk14][0], data[1], data[2], data[3]);
+ sub_8081398(&gUnknown_03004DE0[gUnknown_03004DC0.srcBank][0], data[1], data[2], data[3]);
data[0] = 1;
break;
case 1:
- sub_8081398(&gUnknown_03004DE0[gUnknown_03004DC0.unk14][0], data[1], data[2], data[3]);
+ sub_8081398(&gUnknown_03004DE0[gUnknown_03004DC0.srcBank][0], data[1], data[2], data[3]);
data[0] = 0;
data[3] += data[5];
if (data[3] > data[4])
@@ -137,11 +127,11 @@ static u8 sub_8081534(s32 a1, s32 a2, s32 a3, s32 a4, s32 a5, u8 a6)
void sub_8081594(u8 a1)
{
- u8 index = sav1_get_flash_used_on_map();
+ u8 flashLevel = Overworld_GetFlashLevel();
u8 value = 0;
if (!a1)
value = 1;
- sub_8081534(120, 80, gUnknown_0839ACDC[index], gUnknown_0839ACDC[a1], value, 1);
+ sub_8081534(120, 80, gUnknown_0839ACDC[flashLevel], gUnknown_0839ACDC[a1], value, 1);
sub_8081510();
ScriptContext2_Enable();
}
@@ -220,7 +210,8 @@ static void sub_80816A8(u8 taskId)
REG_WINOUT = 30;
sub_8081398(&gUnknown_03004DE0[0][0], data[2], data[3], 1);
CpuFastSet(&gUnknown_03004DE0[0], &gUnknown_03004DE0[1], 480);
- sub_80895F8(gUnknown_0839ACEC[0], gUnknown_0839ACEC[1], gUnknown_0839ACEC[2]);
+ //sub_80895F8(gUnknown_0839ACEC[0], gUnknown_0839ACEC[1], gUnknown_0839ACEC[2]);
+ sub_80895F8(gUnknown_0839ACEC);
data[0] = 1;
break;
case 1:
@@ -292,17 +283,17 @@ void sub_80818A4(void)
u8 taskId = CreateTask(sub_80816A8, 80);
s16 *data = gTasks[taskId].data;
- if (gScriptResult == 0)
+ if (gSpecialVar_Result == 0)
{
data[1] = 0;
data[2] = 104;
}
- else if (gScriptResult == 1)
+ else if (gSpecialVar_Result == 1)
{
data[1] = 1;
data[2] = 104;
}
- else if (gScriptResult == 2)
+ else if (gSpecialVar_Result == 2)
{
data[1] = 0;
data[2] = 120;
@@ -326,7 +317,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 82a7a13e3..67b652a57 100644
--- a/src/field_special_scene.c
+++ b/src/field/field_special_scene.c
@@ -8,16 +8,62 @@
#include "fieldmap.h"
#include "main.h"
#include "palette.h"
-#include "rom4.h"
+#include "overworld.h"
#include "script.h"
#include "script_movement.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "sprite.h"
#include "task.h"
#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;
}
}
@@ -258,7 +291,7 @@ bool8 sub_80C7754(void)
void Task_HandlePorthole(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- u16 *var = GetVarPointer(VAR_PORTHOLE);
+ u16 *var = GetVarPointer(VAR_PORTHOLE_STATE);
struct WarpData *location = &gSaveBlock1.location;
switch (data[0])
@@ -273,7 +306,7 @@ void Task_HandlePorthole(u8 taskId)
case IDLE_CHECK: // idle and move.
if (gMain.newKeys & A_BUTTON)
data[1] = 1;
- if (!sub_80A212C(0xFF, location->mapNum, location->mapGroup))
+ if (!ScriptMovement_IsObjectMovementFinished(0xFF, location->mapNum, location->mapGroup))
return;
if (CountSSTidalStep(1) == TRUE)
{
@@ -294,18 +327,18 @@ void Task_HandlePorthole(u8 taskId)
// run this once.
if (*var == 2) // which direction?
{
- exec_movement(0xFF, location->mapNum, location->mapGroup, gUnknown_083D295F);
+ ScriptMovement_StartObjectMovementScript(0xFF, location->mapNum, location->mapGroup, gUnknown_083D295F);
data[0] = IDLE_CHECK; // run case 1.
}
else
{
- exec_movement(0xFF, location->mapNum, location->mapGroup, gUnknown_083D2961);
+ ScriptMovement_StartObjectMovementScript(0xFF, location->mapNum, location->mapGroup, gUnknown_083D2961);
data[0] = IDLE_CHECK; // run case 1.
}
break;
case EXIT_PORTHOLE: // exit porthole.
- FlagReset(0x4001);
- FlagReset(0x4000);
+ FlagClear(FLAG_SPECIAL_FLAG_1);
+ FlagClear(FLAG_SPECIAL_FLAG_0);
copy_saved_warp2_bank_and_enter_x_to_warp1(0);
sp13E_warp_to_last_warp();
DestroyTask(taskId);
@@ -319,7 +352,7 @@ void sub_80C78A0(void)
gSprites[spriteId].coordOffsetEnabled = FALSE;
- if (VarGet(0x40B4) == 2)
+ if (VarGet(VAR_PORTHOLE_STATE) == 2)
{
StartSpriteAnim(&gSprites[spriteId], FieldObjectDirectionToImageAnimId(4));
}
@@ -340,9 +373,9 @@ void sub_80C791C(void)
void sub_80C7958(void)
{
- FlagSet(SYS_CRUISE_MODE);
- FlagSet(0x4001);
- FlagSet(0x4000);
+ FlagSet(FLAG_SYS_CRUISE_MODE);
+ FlagSet(FLAG_SPECIAL_FLAG_1);
+ FlagSet(FLAG_SPECIAL_FLAG_0);
saved_warp2_set(0, gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1);
sub_80C7754();
sub_8080F9C();
diff --git a/src/field_specials.c b/src/field/field_specials.c
index 454bd8d96..fc6f690a3 100644
--- a/src/field_specials.c
+++ b/src/field/field_specials.c
@@ -11,22 +11,22 @@
#include "field_camera.h"
#include "field_player_avatar.h"
#include "main.h"
-#include "map_constants.h"
-#include "rom4.h"
+#include "constants/maps.h"
+#include "overworld.h"
#include "script.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "string_util.h"
#include "strings.h"
#include "pokeblock.h"
-#include "species.h"
-#include "abilities.h"
-#include "moves.h"
+#include "constants/species.h"
+#include "constants/abilities.h"
+#include "constants/moves.h"
#include "text.h"
#include "wallclock.h"
#include "tv.h"
#include "rtc.h"
#include "link.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "menu.h"
#include "starter_choose.h"
@@ -34,7 +34,7 @@
#include "battle_tower.h"
#include "field_weather.h"
#include "pokemon_summary_screen.h"
-#include "rng.h"
+#include "random.h"
#if ENGLISH
#define CHAR_DECIMAL_SEPARATOR CHAR_PERIOD
@@ -46,11 +46,13 @@ extern struct WarpData gUnknown_020297F0;
extern u8 gBattleOutcome;
extern u16 gSpecialVar_0x8004;
extern u16 gSpecialVar_0x8005;
-extern u16 gScriptResult;
+extern u16 gSpecialVar_Result;
-EWRAM_DATA u8 gUnknown_02039250 = 0;
-EWRAM_DATA u8 gUnknown_02039251 = 0;
-EWRAM_DATA u32 gUnknown_02039254 = 0;
+extern u8 *const gUnknown_083D1464[3];
+
+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;
@@ -61,49 +63,49 @@ static void RecordCyclingRoadResults(u32, u8);
static struct ElevatorMenu gUnknown_03000760[20];
-void sub_810D6A4(void) {
- SetMainCallback2(sub_8145D88);
+void ScrSpecial_ShowDiploma(void)
+{
+ SetMainCallback2(CB2_ShowDiploma);
ScriptContext2_Enable();
}
-void sub_810D6B8(void) {
+void ScrSpecial_ViewWallClock(void)
+{
gMain.savedCallback = c2_exit_to_overworld_2_switch;
SetMainCallback2(CB2_ViewWallClock);
ScriptContext2_Enable();
}
-void ResetCyclingRoadChallengeData(void) {
- gUnknown_02039250 = 0;
- gUnknown_02039251 = 0;
- gUnknown_02039254 = 0;
+void ResetCyclingRoadChallengeData(void)
+{
+ gBikeCyclingChallenge = FALSE;
+ gBikeCollisions = 0;
+ gBikeCyclingTimer = 0;
}
-void BeginCyclingRoadChallenge(void) {
- gUnknown_02039250 = 1;
- gUnknown_02039251 = 0;
- gUnknown_02039254 = gMain.vblankCounter1;
+void ScrSpecial_BeginCyclingRoadChallenge(void)
+{
+ gBikeCyclingChallenge = TRUE;
+ gBikeCollisions = 0;
+ gBikeCyclingTimer = gMain.vblankCounter1;
}
-u16 GetPlayerAvatarBike(void) {
+u16 GetPlayerAvatarBike(void)
+{
if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE))
- {
return 1;
- }
-
if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE))
- {
return 2;
- }
-
return 0;
}
-void DetermineCyclingRoadResults(u32 arg0, u8 arg1) {
+static void DetermineCyclingRoadResults(u32 numFrames, u8 numBikeCollisions)
+{
u8 result;
- if (arg1 <= 99)
+ if (numBikeCollisions <= 99)
{
- ConvertIntToDecimalStringN(gStringVar1, arg1, STR_CONV_MODE_LEFT_ALIGN, 2);
+ ConvertIntToDecimalStringN(gStringVar1, numBikeCollisions, STR_CONV_MODE_LEFT_ALIGN, 2);
StringAppend(gStringVar1, gOtherText_Times);
}
else
@@ -111,11 +113,11 @@ void DetermineCyclingRoadResults(u32 arg0, u8 arg1) {
StringCopy(gStringVar1, gOtherText_99Times);
}
- if (arg0 < 3600)
+ if (numFrames < 3600)
{
- ConvertIntToDecimalStringN(gStringVar2, arg0 / 60, STR_CONV_MODE_RIGHT_ALIGN, 2);
+ ConvertIntToDecimalStringN(gStringVar2, numFrames / 60, STR_CONV_MODE_RIGHT_ALIGN, 2);
gStringVar2[2] = CHAR_DECIMAL_SEPARATOR;
- ConvertIntToDecimalStringN(&gStringVar2[3], ((arg0 % 60) * 100) / 60, STR_CONV_MODE_LEADING_ZEROS, 2);
+ ConvertIntToDecimalStringN(&gStringVar2[3], ((numFrames % 60) * 100) / 60, STR_CONV_MODE_LEADING_ZEROS, 2);
StringAppend(gStringVar2, gOtherText_Seconds);
}
else
@@ -124,113 +126,113 @@ void DetermineCyclingRoadResults(u32 arg0, u8 arg1) {
}
result = 0;
- if (arg1 == 0)
+ if (numBikeCollisions == 0)
{
result = 5;
}
- else if (arg1 < 4)
+ else if (numBikeCollisions < 4)
{
result = 4;
}
- else if (arg1 < 10)
+ else if (numBikeCollisions < 10)
{
result = 3;
}
- else if (arg1 < 20)
+ else if (numBikeCollisions < 20)
{
result = 2;
}
- else if (arg1 < 100)
+ else if (numBikeCollisions < 100)
{
result = 1;
}
- if (arg0 / 60 <= 10)
+ if (numFrames / 60 <= 10)
{
result += 5;
}
- else if (arg0 / 60 <= 15)
+ else if (numFrames / 60 <= 15)
{
result += 4;
}
- else if (arg0 / 60 <= 20)
+ else if (numFrames / 60 <= 20)
{
result += 3;
}
- else if (arg0 / 60 <= 40)
+ else if (numFrames / 60 <= 40)
{
result += 2;
}
- else if (arg0 / 60 < 60)
+ else if (numFrames / 60 < 60)
{
result += 1;
}
- gScriptResult = result;
+ gSpecialVar_Result = result;
}
void FinishCyclingRoadChallenge(void) {
- const u32 time = gMain.vblankCounter1 - gUnknown_02039254;
+ const u32 numFrames = gMain.vblankCounter1 - gBikeCyclingTimer;
- DetermineCyclingRoadResults(time, gUnknown_02039251);
- RecordCyclingRoadResults(time, gUnknown_02039251);
+ DetermineCyclingRoadResults(numFrames, gBikeCollisions);
+ RecordCyclingRoadResults(numFrames, gBikeCollisions);
}
-static void RecordCyclingRoadResults(u32 arg0, u8 arg1) {
- u16 high = VarGet(0x4028);
- u16 low = VarGet(0x4029);
- u32 record = high + (low << 16);
+static void RecordCyclingRoadResults(u32 numFrames, u8 numBikeCollisions) {
+ u16 low = VarGet(VAR_CYCLING_ROAD_RECORD_TIME_L);
+ u16 high = VarGet(VAR_CYCLING_ROAD_RECORD_TIME_H);
+ u32 framesRecord = low + (high << 16);
- if (record > arg0 || record == 0)
+ if (framesRecord > numFrames || framesRecord == 0)
{
- VarSet(0x4028, arg0);
- VarSet(0x4029, arg0 >> 16);
- VarSet(0x4027, arg1);
+ VarSet(VAR_CYCLING_ROAD_RECORD_TIME_L, numFrames);
+ VarSet(VAR_CYCLING_ROAD_RECORD_TIME_H, numFrames >> 16);
+ VarSet(VAR_CYCLING_ROAD_RECORD_COLLISIONS, numBikeCollisions);
}
}
u16 GetRecordedCyclingRoadResults(void) {
- u16 high = VarGet(0x4028);
- u16 low = VarGet(0x4029);
- u32 record = high + (low << 16);
+ u16 low = VarGet(VAR_CYCLING_ROAD_RECORD_TIME_L);
+ u16 high = VarGet(VAR_CYCLING_ROAD_RECORD_TIME_H);
+ u32 framesRecord = low + (high << 16);
- if (record == 0)
+ if (framesRecord == 0)
{
return FALSE;
}
- DetermineCyclingRoadResults(record, VarGet(0x4027));
+ DetermineCyclingRoadResults(framesRecord, VarGet(VAR_CYCLING_ROAD_RECORD_COLLISIONS));
return TRUE;
}
void UpdateCyclingRoadState(void) {
- if (gUnknown_020297F0.mapNum == MAP_ID_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE && gUnknown_020297F0.mapGroup == MAP_GROUP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE)
+ if (gUnknown_020297F0.mapNum == MAP_NUM(ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE) && gUnknown_020297F0.mapGroup == MAP_GROUP(ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE))
{
return;
}
- if (VarGet(0x40a9) == 2 || VarGet(0x40a9) == 3)
+ if (VarGet(VAR_CYCLING_CHALLENGE_STATE) == 2 || VarGet(VAR_CYCLING_CHALLENGE_STATE) == 3)
{
- VarSet(0x40a9, 0);
- sav1_set_battle_music_maybe(SE_STOP);
+ VarSet(VAR_CYCLING_CHALLENGE_STATE, 0);
+ Overworld_SetSavedMusic(SE_STOP);
}
}
void SetSSTidalFlag(void)
{
- FlagSet(SYS_CRUISE_MODE);
+ FlagSet(FLAG_SYS_CRUISE_MODE);
*GetVarPointer(VAR_CRUISE_STEP_COUNT) = 0;
}
void ResetSSTidalFlag(void)
{
- FlagReset(SYS_CRUISE_MODE);
+ FlagClear(FLAG_SYS_CRUISE_MODE);
}
bool32 CountSSTidalStep(u16 delta)
{
- if (!FlagGet(SYS_CRUISE_MODE) || (*GetVarPointer(VAR_CRUISE_STEP_COUNT) += delta) <= 0xcc)
+ if (!FlagGet(FLAG_SYS_CRUISE_MODE) || (*GetVarPointer(VAR_CRUISE_STEP_COUNT) += delta) <= 0xcc)
{
return FALSE;
}
@@ -240,7 +242,7 @@ bool32 CountSSTidalStep(u16 delta)
u8 GetSSTidalLocation(s8 *mapGroup, s8 *mapNum, s16 *x, s16 *y)
{
u16 *varCruiseStepCount = GetVarPointer(VAR_CRUISE_STEP_COUNT);
- switch (*GetVarPointer(VAR_PORTHOLE))
+ switch (*GetVarPointer(VAR_PORTHOLE_STATE))
{
case 1:
case 8:
@@ -257,38 +259,38 @@ u8 GetSSTidalLocation(s8 *mapGroup, s8 *mapNum, s16 *x, s16 *y)
case 2:
if (*varCruiseStepCount < 60)
{
- *mapNum = MAP_ID_ROUTE134;
+ *mapNum = MAP_NUM(ROUTE134);
*x = *varCruiseStepCount + 19;
}
else if (*varCruiseStepCount < 140)
{
- *mapNum = MAP_ID_ROUTE133;
+ *mapNum = MAP_NUM(ROUTE133);
*x = *varCruiseStepCount - 60;
}
else
{
- *mapNum = MAP_ID_ROUTE132;
+ *mapNum = MAP_NUM(ROUTE132);
*x = *varCruiseStepCount - 140;
}
break;
case 7:
if (*varCruiseStepCount < 66)
{
- *mapNum = MAP_ID_ROUTE132;
+ *mapNum = MAP_NUM(ROUTE132);
*x = 65 - *varCruiseStepCount;
}
else if (*varCruiseStepCount < 146) {
- *mapNum = MAP_ID_ROUTE133;
+ *mapNum = MAP_NUM(ROUTE133);
*x = 145 - *varCruiseStepCount;
}
else
{
- *mapNum = MAP_ID_ROUTE134;
+ *mapNum = MAP_NUM(ROUTE134);
*x = 224 - *varCruiseStepCount;
}
break;
}
- *mapGroup = MAP_GROUP_ROUTE132;
+ *mapGroup = MAP_GROUP(ROUTE132);
*y = 20;
return 0;
}
@@ -310,28 +312,23 @@ u8 GetLinkPartnerNames(void)
return nLinkPlayers;
}
-const u8 gUnknown_083F8358[4] = {7, 9, 8, 10};
-const s8 gUnknown_083F835C[4][2] = {
- { 0, 1},
- { 1, 0},
- { 0, -1},
- {-1, 0}
-};
-
void SpawnBerryBlenderLinkPlayerSprites(void)
{
- u8 unknown_083F8358[4];
- u8 unknown_083F835C[4][2];
+ u8 j = 0;
+ s16 x = 0;
+ s16 y = 0;
+ u8 unknown_083F8358[] = {7, 9, 8, 10};
+ s8 unknown_083F835C[][2] = {
+ { 0, 1},
+ { 1, 0},
+ { 0, -1},
+ {-1, 0}
+ };
u8 myLinkPlayerNumber;
u8 playerDirectionLowerNybble;
u8 rivalAvatarGraphicsId;
u8 i;
- u8 j = 0;
- s16 x = 0;
- s16 y = 0;
- memcpy(unknown_083F8358, gUnknown_083F8358, sizeof gUnknown_083F8358);
- memcpy(unknown_083F835C, gUnknown_083F835C, sizeof gUnknown_083F835C);
myLinkPlayerNumber = sub_8008218();
playerDirectionLowerNybble = player_get_direction_lower_nybble();
switch (playerDirectionLowerNybble)
@@ -360,7 +357,7 @@ void SpawnBerryBlenderLinkPlayerSprites(void)
if (myLinkPlayerNumber != i)
{
rivalAvatarGraphicsId = GetRivalAvatarGraphicsIdByStateIdAndGender(0, gLinkPlayers[i].gender);
- SpawnSpecialFieldObjectParametrized(rivalAvatarGraphicsId, unknown_083F8358[j], 0xf0 - i, (s8)unknown_083F835C[j][0] + x + 7, (s8)unknown_083F835C[j][1] + y + 7, 0);
+ SpawnSpecialFieldObjectParametrized(rivalAvatarGraphicsId, unknown_083F8358[j], 0xf0 - i, unknown_083F835C[j][0] + x + 7, unknown_083F835C[j][1] + y + 7, 0);
j++;
if (j == 4)
{
@@ -691,7 +688,7 @@ void GetRivalSonDaughterString(void)
}
}
-u8 sub_810E300(void)
+u8 GetBattleOutcome(void)
{
return gBattleOutcome;
}
@@ -700,11 +697,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_NUM(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_NUM(MT_CHIMNEY_CABLE_CAR_STATION), -1, 6, 4);
}
}
@@ -961,11 +958,11 @@ void EndLotteryCornerComputerEffect(void)
}
static void sub_810E874(void);
-void sub_810E944(void);
+void DisplayCurrentElevatorFloor(void);
void sub_810E984(u8);
bool8 sub_810EAC8(u8, u8);
void sub_810EB90(u8, u8);
-void sub_810EBEC(void);
+void ShakeScreenInElevator(void);
void sub_810EC34(u8);
void sub_810EC9C(u8);
void sub_810ECB0(void);
@@ -999,22 +996,22 @@ void SetDepartmentStoreFloorVar(void)
u8 deptStoreFloor;
switch (gSaveBlock1.warp2.mapNum)
{
- case MAP_ID_LILYCOVE_CITY_DEPARTMENT_STORE_1F:
+ case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_1F):
deptStoreFloor = 0;
break;
- case MAP_ID_LILYCOVE_CITY_DEPARTMENT_STORE_2F:
+ case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_2F):
deptStoreFloor = 1;
break;
- case MAP_ID_LILYCOVE_CITY_DEPARTMENT_STORE_3F:
+ case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_3F):
deptStoreFloor = 2;
break;
- case MAP_ID_LILYCOVE_CITY_DEPARTMENT_STORE_4F:
+ case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_4F):
deptStoreFloor = 3;
break;
- case MAP_ID_LILYCOVE_CITY_DEPARTMENT_STORE_5F:
+ case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_5F):
deptStoreFloor = 4;
break;
- case MAP_ID_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP:
+ case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP):
deptStoreFloor = 15;
break;
default:
@@ -1077,11 +1074,11 @@ static void sub_810E874(void)
{
MenuPrint(gUnknown_083F8380[gUnknown_03000760[i].var0], 1, 2 * i + 1);
}
- sub_810E944();
+ DisplayCurrentElevatorFloor();
CreateTask(sub_810E984, 8);
}
-void sub_810E944(void)
+void DisplayCurrentElevatorFloor(void)
{
MenuDrawTextWindow(20, 0, 29, 5);
sub_8072BD8(gOtherText_NowOn, 21, 1, 64);
@@ -1110,17 +1107,17 @@ void sub_810E984(u8 taskId)
saved_warp2_set_2(0, gUnknown_03000760[gUnknown_0203925B].var1, gUnknown_03000760[gUnknown_0203925B].var2, -1, 2, 1);
if (gSpecialVar_0x8005 == gUnknown_0203925B)
{
- gScriptResult = 0;
+ gSpecialVar_Result = 0;
PlaySE(SE_SELECT);
MenuZeroFillWindowRect(0, 0, 29, 12);
sub_810EC9C(taskId);
}
else
{
- gScriptResult = 1;
+ gSpecialVar_Result = 1;
gSpecialVar_0x8005 = gUnknown_0203925B;
- sub_810EBEC();
- FieldObjectTurnByLocalIdAndMap(gScriptLastTalked, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, DIR_SOUTH);
+ ShakeScreenInElevator();
+ FieldObjectTurnByLocalIdAndMap(gSpecialVar_LastTalked, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, DIR_SOUTH);
sub_810EEDC();
MenuZeroFillScreen();
DestroyTask(taskId);
@@ -1128,7 +1125,7 @@ void sub_810E984(u8 taskId)
}
else if (gMain.newKeys & B_BUTTON)
{
- gScriptResult = 0;
+ gSpecialVar_Result = 0;
PlaySE(SE_SELECT);
sub_810EEDC();
MenuZeroFillWindowRect(0, 0, 29, 12);
@@ -1303,7 +1300,7 @@ void sub_810EB90(u8 newPos, u8 maxItems)
}
}
-void sub_810EBEC(void)
+void ShakeScreenInElevator(void)
{
u8 taskId = CreateTask(sub_810EC34, 9);
gTasks[taskId].data[0] = 1;
@@ -1453,7 +1450,7 @@ void ResetTrickHouseEndRoomFlag(void)
u16 *specVar = &gSpecialVar_0x8004;
u16 flag = 0x259;
*specVar = flag;
- FlagReset(flag);
+ FlagClear(flag);
}
bool8 CheckLeadMonCool(void)
@@ -1514,12 +1511,12 @@ void IsGrassTypeInParty(void)
species = GetMonData(pokemon, MON_DATA_SPECIES);
if (gBaseStats[species].type1 == TYPE_GRASS || gBaseStats[species].type2 == TYPE_GRASS)
{
- gScriptResult = TRUE;
+ gSpecialVar_Result = TRUE;
return;
}
}
}
- gScriptResult = FALSE;
+ gSpecialVar_Result = FALSE;
}
const u8 *const gUnknown_083F83C0[] = {
@@ -1577,7 +1574,7 @@ void sub_810F118(u8 taskId)
if (gMain.newKeys & A_BUTTON)
{
HandleDestroyMenuCursors();
- gScriptResult = gUnknown_0203925B;
+ gSpecialVar_Result = gUnknown_0203925B;
PlaySE(SE_SELECT);
sub_810EEDC();
MenuZeroFillWindowRect(0, 0, 29, 12);
@@ -1586,7 +1583,7 @@ void sub_810F118(u8 taskId)
if (gMain.newKeys & B_BUTTON)
{
HandleDestroyMenuCursors();
- gScriptResult = 0x7f;
+ gSpecialVar_Result = 0x7f;
PlaySE(SE_SELECT);
sub_810EEDC();
MenuZeroFillWindowRect(0, 0, 29, 12);
@@ -1782,21 +1779,21 @@ void GetSecretBaseNearbyMapName(void)
GetMapSectionName(gStringVar1, VarGet(VAR_SECRET_BASE_MAP), 0);
}
-u16 sub_810F404(void)
+u16 GetBestBattleTowerStreak(void)
{
return GetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK);
}
-void sub_810F414(void)
+void BufferEReaderTrainerName(void)
{
- sub_8135FF4(gStringVar1);
+ SetEReaderTrainerName(gStringVar1);
}
const u8 gUnknown_083F83E0[] = {12, 2, 4, 5, 1, 8, 7, 11, 3, 10, 9, 6};
const u8 gUnknown_083F83EC[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5};
const u8 gUnknown_083F83F8[] = {3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5};
-u8 sub_810F424(void)
+u8 GetSlotMachineId(void)
{
u32 v0 = gSaveBlock1.easyChatPairs[0].unk0_0 + gSaveBlock1.easyChatPairs[0].unk2 + gUnknown_083F83E0[gSpecialVar_0x8004];
if (GetPriceReduction(2))
@@ -1806,10 +1803,10 @@ u8 sub_810F424(void)
return gUnknown_083F83EC[v0 % 12];
}
-bool8 sub_810F488(void)
+bool8 FoundAbandonedShipRoom1Key(void)
{
u16 *specVar = &gSpecialVar_0x8004;
- u16 flag = 0x277;
+ u16 flag = FLAG_HIDDEN_ITEM_1F;
*specVar = flag;
if (!FlagGet(flag))
{
@@ -1818,10 +1815,10 @@ bool8 sub_810F488(void)
return TRUE;
}
-bool8 sub_810F4B0(void)
+bool8 FoundAbandonedShipRoom2Key(void)
{
u16 *specVar = &gSpecialVar_0x8004;
- u16 flag = 0x278;
+ u16 flag = FLAG_HIDDEN_ITEM_20;
*specVar = flag;
if (!FlagGet(flag))
{
@@ -1830,10 +1827,10 @@ bool8 sub_810F4B0(void)
return TRUE;
}
-bool8 sub_810F4D4(void)
+bool8 FoundAbandonedShipRoom4Key(void)
{
u16 *specVar = &gSpecialVar_0x8004;
- u16 flag = 0x279;
+ u16 flag = FLAG_HIDDEN_ITEM_21;
*specVar = flag;
if (!FlagGet(flag))
{
@@ -1842,10 +1839,10 @@ bool8 sub_810F4D4(void)
return TRUE;
}
-bool8 sub_810F4FC(void)
+bool8 FoundAbandonedShipRoom6Key(void)
{
u16 *specVar = &gSpecialVar_0x8004;
- u16 flag = 0x27a;
+ u16 flag = FLAG_HIDDEN_ITEM_22;
*specVar = flag;
if (!FlagGet(flag))
{
@@ -1863,12 +1860,12 @@ void GivLeadMonEffortRibbon(void)
{
bool8 ribbonSet;
IncrementGameStat(GAME_STAT_RECEIVED_RIBBONS);
- FlagSet(SYS_RIBBON_GET);
+ FlagSet(FLAG_SYS_RIBBON_GET);
ribbonSet = TRUE;
SetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_EFFORT_RIBBON, &ribbonSet);
}
-bool8 GetLeadMonEVCount(void)
+bool8 ScrSpecial_AreLeadMonEVsMaxedOut(void)
{
if (GetMonEVCount(&gPlayerParty[GetLeadMonIndex()]) >= 510)
{
@@ -1877,18 +1874,18 @@ bool8 GetLeadMonEVCount(void)
return FALSE;
}
-u8 sub_810F5BC(void)
+u8 TryUpdateRusturfTunnelState(void)
{
- if (!FlagGet(0xc7) && gSaveBlock1.location.mapGroup == MAP_GROUP_RUSTURF_TUNNEL && gSaveBlock1.location.mapNum == MAP_ID_RUSTURF_TUNNEL)
+ if (!FlagGet(FLAG_RUSTURF_TUNNEL_OPENED) && gSaveBlock1.location.mapGroup == MAP_GROUP(RUSTURF_TUNNEL) && gSaveBlock1.location.mapNum == MAP_NUM(RUSTURF_TUNNEL))
{
- if (FlagGet(0x3a3))
+ if (FlagGet(FLAG_HIDE_RUSTURF_TUNNEL_ROCK_1))
{
- VarSet(VAR_0x409a, 4);
+ VarSet(VAR_RUSTURF_TUNNEL_STATE, 4);
return TRUE;
}
- else if (FlagGet(0x3a4))
+ else if (FlagGet(FLAG_HIDE_RUSTURF_TUNNEL_ROCK_2))
{
- VarSet(VAR_0x409a, 5);
+ VarSet(VAR_RUSTURF_TUNNEL_STATE, 5);
return TRUE;
}
}
@@ -1905,21 +1902,21 @@ 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)
{
u8 i;
- u16 starter = GetStarterPokemon(VarGet(VAR_FIRST_POKE));
+ u16 starter = GetStarterPokemon(VarGet(VAR_STARTER_MON));
u8 partyCount = CalculatePlayerPartyCount();
- for (i=0; i<partyCount; i++)
+ for (i = 0; i < partyCount; i++)
{
if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL) == starter)
{
@@ -1998,14 +1995,14 @@ static void sub_810F814(u8 taskId)
EnableBothScriptContexts();
}
-bool8 sub_810F828(void)
+bool8 FoundBlackGlasses(void)
{
- return FlagGet(0x2b8);
+ return FlagGet(FLAG_HIDDEN_ITEM_BLACK_GLASSES);
}
void SetRoute119Weather(void)
{
- if (is_light_level_1_2_3_5_or_6(get_map_light_from_warp0()) != TRUE)
+ if (is_map_type_1_2_3_5_or_6(get_map_type_from_warp0()) != TRUE)
{
SetSav1Weather(0x14);
}
@@ -2013,7 +2010,7 @@ void SetRoute119Weather(void)
void SetRoute123Weather(void)
{
- if (is_light_level_1_2_3_5_or_6(get_map_light_from_warp0()) != TRUE)
+ if (is_map_type_1_2_3_5_or_6(get_map_type_from_warp0()) != TRUE)
{
SetSav1Weather(0x15);
}
@@ -2043,10 +2040,10 @@ void sub_810F8FC(void)
sub_805ADDC(6);
}
-u16 sub_810F908(void)
+u16 GetDaysUntilPacifidlogTMAvailable(void)
{
- u16 var40c2 = VarGet(VAR_0x40C2);
- if (gLocalTime.days - var40c2 >= 7)
+ u16 tmReceivedDay = VarGet(VAR_PACIFIDLOG_TM_RECEIVED_DAY);
+ if (gLocalTime.days - tmReceivedDay >= 7)
{
return 0;
}
@@ -2054,16 +2051,16 @@ u16 sub_810F908(void)
{
return 8;
}
- return 7 - (gLocalTime.days - var40c2);
+ return 7 - (gLocalTime.days - tmReceivedDay);
}
-u16 sub_810F950(void)
+u16 SetPacifidlogTMReceivedDay(void)
{
- VarSet(VAR_0x40C2, gLocalTime.days);
+ VarSet(VAR_PACIFIDLOG_TM_RECEIVED_DAY, gLocalTime.days);
return gLocalTime.days;
}
-bool8 sub_810F96C(void)
+bool8 MonOTNameMatchesPlayer(void)
{
GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_OT_NAME, gStringVar1);
if (!StringCompareWithoutExtCtrlCodes(gSaveBlock2.playerName, gStringVar1))
@@ -2073,29 +2070,29 @@ bool8 sub_810F96C(void)
return TRUE;
}
-void sub_810F9AC(void)
+void BufferLottoTicketNumber(void)
{
- if (gScriptResult >= 10000)
+ if (gSpecialVar_Result >= 10000)
{
- sub_80BF088(0, gScriptResult);
+ sub_80BF088(0, gSpecialVar_Result);
}
- else if (gScriptResult >= 1000)
+ else if (gSpecialVar_Result >= 1000)
{
gStringVar1[0] = CHAR_0;
- ConvertIntToDecimalStringN(gStringVar1 + 1, gScriptResult, 0, sub_80BF0B8(gScriptResult));
+ ConvertIntToDecimalStringN(gStringVar1 + 1, gSpecialVar_Result, 0, sub_80BF0B8(gSpecialVar_Result));
}
- else if (gScriptResult >= 100)
+ else if (gSpecialVar_Result >= 100)
{
gStringVar1[0] = CHAR_0;
gStringVar1[1] = CHAR_0;
- ConvertIntToDecimalStringN(gStringVar1 + 2, gScriptResult, 0, sub_80BF0B8(gScriptResult));
+ ConvertIntToDecimalStringN(gStringVar1 + 2, gSpecialVar_Result, 0, sub_80BF0B8(gSpecialVar_Result));
}
- else if (gScriptResult >= 10)
+ else if (gSpecialVar_Result >= 10)
{
gStringVar1[0] = CHAR_0;
gStringVar1[1] = CHAR_0;
gStringVar1[2] = CHAR_0;
- ConvertIntToDecimalStringN(gStringVar1 + 3, gScriptResult, 0, sub_80BF0B8(gScriptResult));
+ ConvertIntToDecimalStringN(gStringVar1 + 3, gSpecialVar_Result, 0, sub_80BF0B8(gSpecialVar_Result));
}
else
{
@@ -2103,7 +2100,7 @@ void sub_810F9AC(void)
gStringVar1[1] = CHAR_0;
gStringVar1[2] = CHAR_0;
gStringVar1[3] = CHAR_0;
- ConvertIntToDecimalStringN(gStringVar1 + 4, gScriptResult, 0, sub_80BF0B8(gScriptResult));
+ ConvertIntToDecimalStringN(gStringVar1 + 4, gSpecialVar_Result, 0, sub_80BF0B8(gSpecialVar_Result));
}
}
@@ -2112,64 +2109,64 @@ const u8 gUnknown_083F8408[] = {8, 9, 10, 11, 12, 13, 14, 15};
const u8 gUnknown_083F8410[] = {8, 13, 14, 11, 10, 12, 15, 9};
bool8 sub_810FF30(void);
-void sub_810FCE8(void);
+void UpdateMovedLilycoveFanClubMembers(void);
void sub_810FF48(void);
void sub_810FD80(void);
-u16 sub_810FCB0(void);
+u16 GetNumMovedLilycoveFanClubMembers(void);
int sub_810FB9C(void);
void ResetFanClub(void)
{
- gSaveBlock1.vars[0x41] = 0;
- gSaveBlock1.vars[0x42] = 0;
+ gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] = 0;
+ gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] = 0;
}
void sub_810FA74(void)
{
if (sub_810FF30())
{
- sub_810FCE8();
- gSaveBlock1.vars[0x42] = gSaveBlock2.playTimeHours;
+ UpdateMovedLilycoveFanClubMembers();
+ gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] = gSaveBlock2.playTimeHours;
}
}
void sub_810FAA0(void)
{
- if (!((gSaveBlock1.vars[0x41] >> 7) & 1))
+ if (!((gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> 7) & 1))
{
sub_810FF48();
sub_810FD80();
- gSaveBlock1.vars[0x42] = gSaveBlock2.playTimeHours;
- FlagReset(0x315);
- FlagReset(0x316);
- FlagReset(0x317);
- FlagReset(0x318);
- VarSet(VAR_0x4095, 1);
+ gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] = gSaveBlock2.playTimeHours;
+ FlagClear(FLAG_HIDE_FANCLUB_OLD_LADY);
+ FlagClear(FLAG_HIDE_FANCLUB_BOY);
+ FlagClear(FLAG_HIDE_FANCLUB_LITTLE_BOY);
+ FlagClear(FLAG_HIDE_FANCLUB_LADY);
+ VarSet(VAR_LILYCOVE_FAN_CLUB_STATE, 1);
}
}
u8 sub_810FB10(u8 a0)
{
- if (VarGet(VAR_0x4095) == 2)
+ if (VarGet(VAR_LILYCOVE_FAN_CLUB_STATE) == 2)
{
- if ((gSaveBlock1.vars[0x41] & 0x7f) + gUnknown_083F8404[a0] >= 20)
+ if ((gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] & 0x7f) + gUnknown_083F8404[a0] >= 20)
{
- if (sub_810FCB0() < 3)
+ if (GetNumMovedLilycoveFanClubMembers() < 3)
{
sub_810FB9C();
- gSaveBlock1.vars[0x41] &= 0xff80;
+ gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] &= 0xff80;
}
else
{
- gSaveBlock1.vars[0x41] = (gSaveBlock1.vars[0x41] & 0xff80) | 20;
+ gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] = (gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] & 0xff80) | 20;
}
}
else
{
- gSaveBlock1.vars[0x41] += gUnknown_083F8404[a0];
+ gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] += gUnknown_083F8404[a0];
}
}
- return gSaveBlock1.vars[0x41] & 0x7f;
+ return gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] & 0x7f;
}
int sub_810FB9C(void)
@@ -2178,17 +2175,17 @@ int sub_810FB9C(void)
int retval = 0;
for (i=0; i<8; i++)
{
- if (!((gSaveBlock1.vars[0x41] >> gUnknown_083F8408[i]) & 0x01))
+ if (!((gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> gUnknown_083F8408[i]) & 0x01))
{
retval = i;
if (Random() & 1)
{
- gSaveBlock1.vars[0x41] |= (1 << gUnknown_083F8408[i]);
+ gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= (1 << gUnknown_083F8408[i]);
return retval;
}
}
}
- gSaveBlock1.vars[0x41] |= (1 << gUnknown_083F8408[retval]);
+ gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= (1 << gUnknown_083F8408[retval]);
return retval;
}
@@ -2196,85 +2193,86 @@ int sub_810FC18(void)
{
u8 i;
int retval = 0;
- if (sub_810FCB0() == TRUE)
+ if (GetNumMovedLilycoveFanClubMembers() == 1)
{
return 0;
}
for (i=0; i<8; i++)
{
- if ((gSaveBlock1.vars[0x41] >> gUnknown_083F8410[i]) & 1)
+ if ((gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> gUnknown_083F8410[i]) & 1)
{
retval = i;
if (Random() & 1)
{
- gSaveBlock1.vars[0x41] ^= (1 << gUnknown_083F8410[i]);
+ gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] ^= (1 << gUnknown_083F8410[i]);
return retval;
}
}
}
- if ((gSaveBlock1.vars[0x41] >> gUnknown_083F8410[retval]) & 1)
+ if ((gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> gUnknown_083F8410[retval]) & 1)
{
- gSaveBlock1.vars[0x41] ^= (1 << gUnknown_083F8410[retval]);
+ gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] ^= (1 << gUnknown_083F8410[retval]);
}
return retval;
}
-u16 sub_810FCB0(void)
+u16 GetNumMovedLilycoveFanClubMembers(void)
{
u8 i;
u8 retval = 0;
- for (i=0; i<8; i++)
+ for (i = 0; i < 8; i++)
{
- if ((gSaveBlock1.vars[0x41] >> (i + 8)) & 1)
+ if ((gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> (i + 8)) & 1)
{
- retval ++;
+ retval++;
}
}
+
return retval;
}
-void sub_810FCE8(void)
+void UpdateMovedLilycoveFanClubMembers(void)
{
u8 i = 0;
if (gSaveBlock2.playTimeHours < 999)
{
while (1)
{
- if (sub_810FCB0() < 5)
+ if (GetNumMovedLilycoveFanClubMembers() < 5)
{
- gSaveBlock1.vars[0x42] = gSaveBlock2.playTimeHours;
+ gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] = gSaveBlock2.playTimeHours;
break;
}
else if (i == 8)
{
break;
}
- else if (gSaveBlock2.playTimeHours - gSaveBlock1.vars[0x42] < 12)
+ else if (gSaveBlock2.playTimeHours - gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] < 12)
{
return;
}
sub_810FC18();
- gSaveBlock1.vars[0x42] += 12;
+ gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] += 12;
i++;
}
}
}
-bool8 sub_810FD60(void)
+bool8 ShouldMoveLilycoveFanClubMember(void)
{
- return (gSaveBlock1.vars[0x41] >> gSpecialVar_0x8004) & 0x01;
+ return (gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> gSpecialVar_0x8004) & 0x01;
}
void sub_810FD80(void)
{
- gSaveBlock1.vars[0x41] |= 0x2000;
- gSaveBlock1.vars[0x41] |= 0x100;
- gSaveBlock1.vars[0x41] |= 0x400;
+ gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= 0x2000;
+ gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= 0x100;
+ gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= 0x400;
}
void sub_810FE1C(void *, u8, u8);
-void sub_810FDAC(void)
+void BufferStreakTrainerText(void)
{
u8 a = 0;
u8 b = 0;
@@ -2353,7 +2351,7 @@ void sub_810FE1C(void *linkRecords, u8 a, u8 b)
void sub_810FEFC(void)
{
- if (VarGet(VAR_0x4095) == 2)
+ if (VarGet(VAR_LILYCOVE_FAN_CLUB_STATE) == 2)
{
sub_810FA74();
if (gBattleOutcome == 1)
@@ -2369,12 +2367,12 @@ void sub_810FEFC(void)
bool8 sub_810FF30(void)
{
- return (gSaveBlock1.vars[0x41] >> 7) & 0x01;
+ return (gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> 7) & 0x01;
}
void sub_810FF48(void)
{
- gSaveBlock1.vars[0x41] |= 0x80;
+ gSaveBlock1.vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= 0x80;
}
u8 sub_810FF60(void)
diff --git a/src/field_tasks.c b/src/field/field_tasks.c
index caf2ce6b9..ce5fc6c0e 100644
--- a/src/field_tasks.c
+++ b/src/field/field_tasks.c
@@ -1,16 +1,12 @@
-//
-// Created by scott on 6/22/2017.
-//
-
#include "global.h"
#include "task.h"
#include "main.h"
-#include "vars.h"
+#include "constants/vars.h"
#include "bike.h"
#include "item.h"
-#include "items.h"
+#include "constants/items.h"
#include "event_data.h"
-#include "rom4.h"
+#include "overworld.h"
#include "clock.h"
#include "script.h"
#include "field_special_scene.h"
@@ -20,7 +16,7 @@
#include "fieldmap.h"
#include "field_player_avatar.h"
#include "field_camera.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "field_tasks.h"
@@ -48,21 +44,25 @@ void Task_RunPerStepCallback(u8 taskId)
gUnknown_08376364[idx](taskId);
}
-static void RunTimeBasedEvents(s16 *taskData)
+#define tState data[0]
+#define tAmbientCryState data[1]
+#define tAmbientCryDelay data[2]
+
+static void RunTimeBasedEvents(s16 *data)
{
- switch (*taskData)
+ switch (tState)
{
case 0:
if (gMain.vblankCounter1 & 0x1000)
{
DoTimeBasedEvents();
- (*taskData)++;
+ tState++;
}
break;
case 1:
if (!(gMain.vblankCounter1 & 0x1000))
{
- (*taskData)--;
+ tState--;
}
break;
}
@@ -70,14 +70,19 @@ static void RunTimeBasedEvents(s16 *taskData)
void Task_RunTimeBasedEvents(u8 taskId)
{
- s16 *taskData = gTasks[taskId].data;
+ s16 *data = gTasks[taskId].data;
+
if (!ScriptContext2_IsEnabled())
{
- RunTimeBasedEvents(taskData);
- sub_80540D0(taskData + 1, taskData + 2);
+ RunTimeBasedEvents(data);
+ UpdateAmbientCry(&tAmbientCryState, &tAmbientCryDelay);
}
}
+#undef tState
+#undef tAmbientCryState
+#undef tAmbientCryDelay
+
void Task_MuddySlope(u8);
void SetUpFieldTasks(void)
@@ -192,7 +197,7 @@ const struct MetatileOffset *sub_80695E0(const struct MetatileOffset a0[][2], s8
void sub_8069638(const struct MetatileOffset offsets[][2], s16 x, s16 y, bool32 flag)
{
const struct MetatileOffset *offsetData = sub_80695E0(offsets, MapGridGetMetatileBehaviorAt(x, y));
- const struct MetatileOffset *offsetData2 = offsetData;
+ const struct MetatileOffset *offsetdata2 = offsetData;
if (offsetData != NULL)
{
MapGridSetMetatileIdAt(x + offsetData[0].x, y + offsetData[0].y, offsetData[0].tileId);
@@ -200,10 +205,10 @@ void sub_8069638(const struct MetatileOffset offsets[][2], s16 x, s16 y, bool32
{
CurrentMapDrawMetatileAt(x + offsetData[0].x, y + offsetData[0].y);
}
- MapGridSetMetatileIdAt(x + offsetData2[1].x, y + offsetData2[1].y, offsetData2[1].tileId);
+ MapGridSetMetatileIdAt(x + offsetdata2[1].x, y + offsetdata2[1].y, offsetdata2[1].tileId);
if (flag)
{
- CurrentMapDrawMetatileAt(x + offsetData2[1].x, y + offsetData2[1].y);
+ CurrentMapDrawMetatileAt(x + offsetdata2[1].x, y + offsetdata2[1].y);
}
}
}
@@ -549,20 +554,20 @@ const u16 gUnknown_083763E4[] = {
0,
0,
0,
- VAR_0x4001,
- VAR_0x4002,
- VAR_0x4003,
- VAR_0x4004,
+ VAR_TEMP_1,
+ VAR_TEMP_2,
+ VAR_TEMP_3,
+ VAR_TEMP_4,
0,
0,
- VAR_0x4005,
- VAR_0x4006,
- VAR_0x4007,
+ VAR_TEMP_5,
+ VAR_TEMP_6,
+ VAR_TEMP_7,
0,
0,
- VAR_0x4008,
- VAR_0x4009,
- VAR_0x400A,
+ VAR_TEMP_8,
+ VAR_TEMP_9,
+ VAR_TEMP_A,
0,
0,
0,
@@ -603,14 +608,14 @@ bool32 sub_8069D34(s16 x, s16 y)
return FALSE;
}
-void sub_8069D78(void)
+void SetSootopolisGymCrackedIceMetatiles(void)
{
s32 x, y;
s32 width = gMapHeader.mapData->width;
s32 height = gMapHeader.mapData->height;
- for (x=0; x<width; x++)
+ for (x = 0; x < width; x++)
{
- for (y=0; y<height; y++)
+ for (y = 0; y < height; y++)
{
if (sub_8069D34(x, y) == TRUE)
{
@@ -836,11 +841,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/field_weather.c b/src/field/field_weather.c
new file mode 100644
index 000000000..c954242a1
--- /dev/null
+++ b/src/field/field_weather.c
@@ -0,0 +1,1163 @@
+#include "global.h"
+#include "blend_palette.h"
+#include "field_map_obj.h"
+#include "field_weather.h"
+#include "palette.h"
+#include "random.h"
+#include "script.h"
+#include "constants/weather.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+#include "trig.h"
+#include "ewram.h"
+
+#define MACRO1(a) ((((a) >> 1) & 0xF) | (((a) >> 2) & 0xF0) | (((a) >> 3) & 0xF00))
+
+struct RGBColor
+{
+ u16 r:5;
+ u16 g:5;
+ u16 b:5;
+};
+
+struct WeatherPaletteData
+{
+ u16 data[0][0x1000]; // unknown length
+};
+
+struct WeatherCallbacks
+{
+ void (*initVars)(void);
+ void (*main)(void);
+ void (*initAll)(void);
+ bool8 (*finish)(void);
+};
+
+extern struct Weather gWeather;
+extern u8 gUnknown_0202FF38[];
+extern u16 gUnknown_0202FF58;
+IWRAM_DATA const u8 *gUnknown_030006DC;
+
+const u8 DroughtPaletteData_0[] = INCBIN_U8("graphics/weather/drought0.bin.lz");
+const u8 DroughtPaletteData_1[] = INCBIN_U8("graphics/weather/drought1.bin.lz");
+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];
+
+static const u8 *const sCompressedDroughtPalettes[] =
+{
+ DroughtPaletteData_0,
+ DroughtPaletteData_1,
+ DroughtPaletteData_2,
+ DroughtPaletteData_3,
+ DroughtPaletteData_4,
+ DroughtPaletteData_5,
+ gSharedMem,
+};
+
+// This is a pointer to gWeather. All code in this file accesses gWeather directly,
+// while code in other field weather files accesses gWeather through this pointer.
+// This is likely the result of compiler optimization, since using the pointer in
+// this file produces the same result as accessing gWeather directly.
+struct Weather *const gWeatherPtr = &gWeather;
+
+void None_Init(void);
+void None_Main(void);
+bool8 None_Finish(void);
+void Clouds_InitVars(void);
+void Clouds_Main(void);
+void Clouds_InitAll(void);
+bool8 Clouds_Finish(void);
+void Weather2_InitVars(void);
+void Weather2_Main(void);
+void Weather2_InitAll(void);
+bool8 Weather2_Finish(void);
+void LightRain_InitVars(void);
+void LightRain_Main(void);
+void LightRain_InitAll(void);
+bool8 LightRain_Finish(void);
+void Snow_InitVars(void);
+void Snow_Main(void);
+void Snow_InitAll(void);
+bool8 Snow_Finish(void);
+void MedRain_InitVars(void);
+void Rain_Main(void);
+void MedRain_InitAll(void);
+bool8 Rain_Finish(void);
+void Fog1_InitVars(void);
+void Fog1_Main(void);
+void Fog1_InitAll(void);
+bool8 Fog1_Finish(void);
+void Ash_InitVars(void);
+void Ash_Main(void);
+void Ash_InitAll(void);
+bool8 Ash_Finish(void);
+void Sandstorm_InitVars(void);
+void Sandstorm_Main(void);
+void Sandstorm_InitAll(void);
+bool8 Sandstorm_Finish(void);
+void Fog2_InitVars(void);
+void Fog2_Main(void);
+void Fog2_InitAll(void);
+bool8 Fog2_Finish(void);
+void Fog1_InitVars(void);
+void Fog1_Main(void);
+void Fog1_InitAll(void);
+bool8 Fog1_Finish(void);
+void Weather11_InitVars(void);
+void Weather11_Main(void);
+void Weather11_InitAll(void);
+bool8 Weather11_Finish(void);
+void Drought_InitVars(void);
+void Drought_Main(void);
+void Drought_InitAll(void);
+bool8 Drought_Finish(void);
+void HeavyRain_InitVars(void);
+void Rain_Main(void);
+void HeavyRain_InitAll(void);
+bool8 Rain_Finish(void);
+void Bubbles_InitVars(void);
+void Bubbles_Main(void);
+void Bubbles_InitAll(void);
+bool8 Bubbles_Finish(void);
+
+static const struct WeatherCallbacks sWeatherFuncs[] =
+{
+ {None_Init, None_Main, None_Init, None_Finish},
+ {Clouds_InitVars, Clouds_Main, Clouds_InitAll, Clouds_Finish},
+ {Weather2_InitVars, Weather2_Main, Weather2_InitAll, Weather2_Finish},
+ {LightRain_InitVars, LightRain_Main, LightRain_InitAll, LightRain_Finish}, // light rain
+ {Snow_InitVars, Snow_Main, Snow_InitAll, Snow_Finish},
+ {MedRain_InitVars, Rain_Main, MedRain_InitAll, Rain_Finish},
+ {Fog1_InitVars, Fog1_Main, Fog1_InitAll, Fog1_Finish},
+ {Ash_InitVars, Ash_Main, Ash_InitAll, Ash_Finish},
+ {Sandstorm_InitVars, Sandstorm_Main, Sandstorm_InitAll, Sandstorm_Finish},
+ {Fog2_InitVars, Fog2_Main, Fog2_InitAll, Fog2_Finish},
+ {Fog1_InitVars, Fog1_Main, Fog1_InitAll, Fog1_Finish},
+ {Weather11_InitVars, Weather11_Main, Weather11_InitAll, Weather11_Finish},
+ {Drought_InitVars, Drought_Main, Drought_InitAll, Drought_Finish},
+ {HeavyRain_InitVars, Rain_Main, HeavyRain_InitAll, Rain_Finish},
+ {Bubbles_InitVars, Bubbles_Main, Bubbles_InitAll, Bubbles_Finish},
+};
+
+void (*const gUnknown_083970B8[])(void) =
+{
+ sub_807CC24,
+ sub_807CCAC,
+ nullsub_39,
+ nullsub_39,
+};
+
+const u8 gUnknown_083970C8[] =
+{
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 0,
+ 0,
+ 2,
+ 1,
+ 2,
+ 2,
+ 2,
+ 2,
+ 1,
+ 1,
+ 1,
+ 1,
+ 2,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+};
+
+const u16 gUnknown_083970E8[] = INCBIN_U16("graphics/weather/0.gbapal");
+
+void StartWeather(void)
+{
+ u8 index;
+ if (!FuncIsActiveTask(Task_WeatherMain))
+ {
+ index = AllocSpritePalette(0x1200);
+ CpuCopy32(gUnknown_083970E8, &gPlttBufferUnfaded[0x100 + index * 16], 32);
+ sub_807CB10();
+ gWeatherPtr->unknown_6D5 = index;
+ gWeatherPtr->unknown_6D4 = AllocSpritePalette(0x1201);
+ gWeatherPtr->rainSpriteCount = 0;
+ gWeatherPtr->unknown_6D8 = 0;
+ gWeatherPtr->cloudSpritesCreated = 0;
+ gWeatherPtr->snowflakeSpriteCount = 0;
+ gWeatherPtr->ashSpritesCreated = 0;
+ gWeatherPtr->fog1SpritesCreated = 0;
+ gWeatherPtr->fog2SpritesCreated = 0;
+ gWeatherPtr->sandstormSprites1Created = 0;
+ gWeatherPtr->sandstormSprites2Created = 0;
+ gWeatherPtr->unknown_72E = 0;
+ gWeatherPtr->unknown_6FA = 0;
+ Weather_SetBlendCoeffs(16, 0);
+ gWeatherPtr->currWeather = 0;
+ gWeatherPtr->unknown_6C6 = 3;
+ gWeatherPtr->unknown_6C8 = 0;
+ gWeatherPtr->unknown_6D3 = 1;
+ gWeatherPtr->unknown_6C9 = CreateTask(Task_WeatherInit, 80);
+ }
+}
+
+void DoWeatherEffect(u8 effect)
+{
+ if (effect != WEATHER_RAIN_LIGHT && effect != WEATHER_RAIN_MED && effect != WEATHER_RAIN_HEAVY)
+ {
+ PlayRainSoundEffect();
+ }
+ if (gWeatherPtr->nextWeather != effect && gWeatherPtr->currWeather == effect)
+ {
+ sWeatherFuncs[effect].initVars();
+ }
+ gWeatherPtr->unknown_6D3 = 0;
+ gWeatherPtr->nextWeather = effect;
+ gWeatherPtr->finishStep = 0;
+}
+
+void sub_807C988(u8 effect)
+{
+ PlayRainSoundEffect();
+ gWeatherPtr->currWeather = effect;
+ gWeatherPtr->nextWeather = effect;
+}
+
+void sub_807C9B4(u8 effect)
+{
+ PlayRainSoundEffect();
+ gWeatherPtr->currWeather = effect;
+ gWeatherPtr->nextWeather = effect;
+ gWeatherPtr->unknown_6C8 = 1;
+}
+
+void Task_WeatherInit(u8 taskId)
+{
+ if (gWeatherPtr->unknown_6C8)
+ {
+ sWeatherFuncs[gWeatherPtr->currWeather].initAll();
+ gTasks[taskId].func = Task_WeatherMain;
+ }
+}
+
+void Task_WeatherMain(u8 taskId)
+{
+ if (gWeatherPtr->currWeather != gWeatherPtr->nextWeather)
+ {
+ if (!sWeatherFuncs[gWeatherPtr->currWeather].finish())
+ {
+ sWeatherFuncs[gWeatherPtr->nextWeather].initVars();
+ gWeatherPtr->unknown_6C3 = 0;
+ gWeatherPtr->unknown_6C6 = 0;
+ gWeatherPtr->currWeather = gWeatherPtr->nextWeather;
+ gWeatherPtr->unknown_6D3 = 1;
+ }
+ }
+ else
+ {
+ sWeatherFuncs[gWeatherPtr->currWeather].main();
+ }
+ gUnknown_083970B8[gWeatherPtr->unknown_6C6]();
+}
+
+void None_Init(void)
+{
+ gWeatherPtr->unknown_6C1 = 0;
+ gWeatherPtr->unknown_6C2 = 0;
+}
+
+void None_Main(void)
+{
+}
+
+u8 None_Finish(void)
+{
+ return 0;
+}
+
+void sub_807CB10(void)
+{
+ u16 v0;
+ u8 (*v1)[32];
+ u16 v2;
+ u16 v4;
+ u16 v5;
+ u16 v6;
+ u16 v9;
+ u32 v10;
+ u16 v11;
+ s16 dunno;
+
+ gUnknown_030006DC = gUnknown_083970C8;
+ for (v0 = 0; v0 <= 1; v0++)
+ {
+ if (v0 == 0)
+ v1 = gWeatherPtr->unknown_200;
+ else
+ v1 = gWeatherPtr->unk460;
+
+ for (v2 = 0; (u16)v2 <= 0x1f; v2++)
+ {
+ v4 = v2 << 8;
+ if (v0 == 0)
+ v5 = (v2 << 8) / 16;
+ else
+ v5 = 0;
+ for (v6 = 0; v6 <= 2; v6++)
+ {
+ v4 = (v4 - v5);
+ v1[v6][v2] = v4 >> 8;
+ }
+ v9 = v4;
+ v10 = 0x1f00 - v4;
+ if ((0x1f00 - v4) < 0)
+ {
+ v10 += 0xf;
+ }
+ v11 = v10 >> 4;
+ if (v2 <= 0xb)
+ {
+ for (; v6 <= 0x12; v6++)
+ {
+ v4 += v11;
+ dunno = v4 - v9;
+ if (dunno > 0)
+ {
+ v4 -= (dunno + ((u16)dunno >> 15)) >> 1;
+ }
+ v1[v6][v2] = v4 >> 8;
+ if (v1[v6][v2] > 0x1f)
+ {
+ v1[v6][v2] = 0x1f;
+ }
+ }
+ }
+ else
+ {
+ for (; v6 <= 0x12; v6++)
+ {
+ v4 += v11;
+ v1[v6][v2] = v4 >> 8;
+ if (v1[v6][v2] > 0x1f)
+ {
+ v1[v6][v2] = 0x1f;
+ }
+ }
+ }
+ }
+ }
+}
+
+void sub_807CC24(void)
+{
+ if (gWeatherPtr->unknown_6C0 == gWeatherPtr->unknown_6C1)
+ {
+ gWeatherPtr->unknown_6C6 = 3;
+ }
+ else
+ {
+ if (++gWeatherPtr->unknown_6C3 >= gWeatherPtr->unknown_6C2)
+ {
+ gWeatherPtr->unknown_6C3 = 0;
+ if (gWeatherPtr->unknown_6C0 < gWeatherPtr->unknown_6C1)
+ gWeatherPtr->unknown_6C0++;
+ else
+ gWeatherPtr->unknown_6C0--;
+ sub_807CEBC(0, 0x20, gWeatherPtr->unknown_6C0);
+ }
+ }
+}
+
+void sub_807CCAC(void)
+{
+ if (++gWeatherPtr->unknown_6CB > 1)
+ gWeatherPtr->unknown_6CA = 0;
+ switch (gWeatherPtr->currWeather)
+ {
+ case WEATHER_RAIN_LIGHT:
+ case WEATHER_RAIN_MED:
+ case WEATHER_RAIN_HEAVY:
+ case WEATHER_SNOW:
+ case WEATHER_DARK:
+ if (sub_807CDC4() == 0)
+ {
+ gWeatherPtr->unknown_6C0 = 3;
+ gWeatherPtr->unknown_6C6 = 3;
+ }
+ break;
+ case WEATHER_DROUGHT:
+ if (sub_807CE24() == 0)
+ {
+ gWeatherPtr->unknown_6C0 = -6;
+ gWeatherPtr->unknown_6C6 = 3;
+ }
+ break;
+ case WEATHER_FOG_1:
+ if (sub_807CE7C() == 0)
+ {
+ gWeatherPtr->unknown_6C0 = 0;
+ gWeatherPtr->unknown_6C6 = 3;
+ }
+ break;
+ case WEATHER_ASH:
+ case WEATHER_SANDSTORM:
+ case WEATHER_FOG_2:
+ case WEATHER_FOG_3:
+ default:
+ if (!gPaletteFade.active)
+ {
+ gWeatherPtr->unknown_6C0 = gWeatherPtr->unknown_6C1;
+ gWeatherPtr->unknown_6C6 = 3;
+ }
+ break;
+ }
+}
+
+u8 sub_807CDC4(void)
+{
+ if (gWeatherPtr->unknown_6C7 == 0x10)
+ return 0;
+ if (++gWeatherPtr->unknown_6C7 >= 0x10)
+ {
+ sub_807CEBC(0, 0x20, 3);
+ gWeatherPtr->unknown_6C7 = 0x10;
+ return 0;
+ }
+ sub_807D1BC(0, 0x20, 3, 0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->unknown_6C4);
+ return 1;
+}
+
+u8 sub_807CE24(void)
+{
+ if (gWeatherPtr->unknown_6C7 == 0x10)
+ return 0;
+ if (++gWeatherPtr->unknown_6C7 >= 0x10)
+ {
+ sub_807CEBC(0, 0x20, -6);
+ gWeatherPtr->unknown_6C7 = 0x10;
+ return 0;
+ }
+ sub_807D304(-6, 0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->unknown_6C4);
+ return 1;
+}
+
+u8 sub_807CE7C(void)
+{
+ if (gWeatherPtr->unknown_6C7 == 0x10)
+ return 0;
+ ++gWeatherPtr->unknown_6C7;
+ sub_807D424(0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->unknown_6C4);
+ return 1;
+}
+
+void nullsub_39(void)
+{
+}
+
+void sub_807CEBC(u8 a, u8 b, s8 c)
+{
+ u16 r4;
+ u16 palOffset;
+ u8 *r6;
+ u16 i;
+
+ if (c > 0)
+ {
+ c = c - 1;
+ palOffset = a * 16;
+ b += a;
+ r4 = a;
+ while (r4 < b)
+ {
+ if (gUnknown_030006DC[r4] == 0)
+ {
+ CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16));
+ palOffset += 16;
+ }
+ else
+ {
+ u8 r, g, b;
+
+ if (gUnknown_030006DC[r4] == 2 || r4 - 16 == gWeatherPtr->unknown_6D5)
+ r6 = gWeatherPtr->unk460[c];
+ else
+ r6 = gWeatherPtr->unknown_200[c];
+ if (r4 == 16 || r4 > 0x1B)
+ {
+ for (i = 0; i < 16; i++)
+ {
+ if (gPlttBufferUnfaded[palOffset] == 0x2D9F)
+ {
+ palOffset++;
+ }
+ else
+ {
+ struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset];
+
+ r = r6[color.r];
+ g = r6[color.g];
+ b = r6[color.b];
+ gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r;
+ }
+ }
+ }
+ else
+ {
+ for (i = 0; i < 16; i++)
+ {
+ struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset];
+
+ r = r6[color.r];
+ g = r6[color.g];
+ b = r6[color.b];
+ gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r;
+ }
+ }
+ }
+ r4++;
+ }
+ }
+ else if (c < 0)
+ {
+ c = -c - 1;
+ palOffset = a * 16;
+ b += a;
+ r4 = a;
+ while (r4 < b)
+ {
+ if (gUnknown_030006DC[r4] == 0)
+ {
+ CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16));
+ palOffset += 16;
+ }
+ else
+ {
+ if (r4 == 16 || r4 > 0x1B)
+ {
+ for (i = 0; i < 16; i++)
+ {
+ if (gPlttBufferUnfaded[palOffset] != 0x2D9F)
+ gPlttBufferFaded[palOffset] = eWeatherPaletteData.data[c][MACRO1(gPlttBufferUnfaded[palOffset])];
+ palOffset++;
+ }
+ }
+ else
+ {
+ for (i = 0; i < 16; i++)
+ {
+ gPlttBufferFaded[palOffset] = eWeatherPaletteData.data[c][MACRO1(gPlttBufferUnfaded[palOffset])];
+ palOffset++;
+ }
+ }
+ }
+ r4++;
+ }
+ }
+ else
+ {
+ CpuFastCopy(gPlttBufferUnfaded + a * 16, gPlttBufferFaded + a * 16, b * 16 * sizeof(u16));
+ }
+}
+
+void sub_807D1BC(u8 a1, u8 a2, s8 c, u8 d, u16 e)
+{
+ u16 palOffset;
+ u16 r4;
+ u16 i;
+ struct RGBColor color = *(struct RGBColor *)&e;
+ u8 r_ = color.r;
+ u8 g_ = color.g;
+ u8 b_ = color.b;
+
+ palOffset = a1 * 16;
+ a2 += a1;
+ c = c - 1;
+ r4 = a1;
+ while (r4 < a2)
+ {
+ if (gUnknown_030006DC[r4] == 0)
+ {
+ BlendPalette(palOffset, 16, d, e);
+ palOffset += 16;
+ }
+ else
+ {
+ u8 *r5;
+
+ if (gUnknown_030006DC[r4] == 1)
+ r5 = gWeatherPtr->unknown_200[c];
+ else
+ r5 = gWeatherPtr->unk460[c];
+
+ for (i = 0; i < 16; i++)
+ {
+ struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset];
+ u8 r = r5[color.r];
+ u8 g = r5[color.g];
+ u8 b = r5[color.b];
+
+ r += ((r_ - r) * d) >> 4;
+ g += ((g_ - g) * d) >> 4;
+ b += ((b_ - b) * d) >> 4;
+ gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r;
+ }
+ }
+ r4++;
+ }
+}
+
+void sub_807D304(s8 a, u8 coeff, u16 c)
+{
+ struct RGBColor color;
+ u8 r_;
+ u8 g_;
+ u8 b_;
+ u16 r4;
+ u16 palOffset;
+ u16 r12;
+
+ a = -a - 1;
+ color = *(struct RGBColor *)&c;
+ r_ = color.r;
+ g_ = color.g;
+ b_ = color.b;
+ palOffset = 0;
+ for (r4 = 0; r4 < 32; r4++)
+ {
+ if (gUnknown_030006DC[r4] == 0)
+ {
+ BlendPalette(palOffset, 16, coeff, c);
+ palOffset += 16;
+ }
+ else
+ {
+ for (r12 = 0; r12 < 16; r12++)
+ {
+ u32 offset;
+ struct RGBColor color1;
+ struct RGBColor color2;
+ u8 r1, g1, b1;
+ u8 r2, g2, b2;
+
+ color1 = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset];
+ r1 = color1.r;
+ g1 = color1.g;
+ b1 = color1.b;
+
+ offset = ((b1 & 0x1E) << 7) | ((g1 & 0x1E) << 3) | ((r1 & 0x1E) >> 1);
+ color2 = *(struct RGBColor *)&eWeatherPaletteData.data[a][offset];
+ r2 = color2.r;
+ g2 = color2.g;
+ b2 = color2.b;
+
+ r2 += ((r_ - r2) * coeff) >> 4;
+ g2 += ((g_ - g2) * coeff) >> 4;
+ b2 += ((b_ - b2) * coeff) >> 4;
+
+ gPlttBufferFaded[palOffset++] = (b2 << 10) | (g2 << 5) | r2;
+ }
+ }
+ }
+}
+
+bool8 sub_807D574(u8);
+
+void sub_807D424(u8 a, u16 b)
+{
+ struct RGBColor color;
+ u8 r_;
+ u8 g_;
+ u8 b_;
+ u16 r4;
+
+ BlendPalette(0, 0x100, a, b);
+ color = *(struct RGBColor *)&b;
+ r_ = color.r;
+ g_ = color.g;
+ b_ = color.b;
+
+ r4 = 16;
+ while (r4 < 32)
+ {
+ if (sub_807D574(r4))
+ {
+ u16 r12 = (r4 + 1) * 16;
+ u16 r6 = r4 * 16;
+
+ while (r6 < r12)
+ {
+ struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[r6];
+ u8 r = color.r;
+ u8 g = color.g;
+ u8 b = color.b;
+
+ r += ((28 - r) * 3) >> 2;
+ g += ((31 - g) * 3) >> 2;
+ b += ((28 - b) * 3) >> 2;
+
+ r += ((r_ - r) * a) >> 4;
+ g += ((g_ - g) * a) >> 4;
+ b += ((b_ - b) * a) >> 4;
+
+ gPlttBufferFaded[r6] = (b << 10) | (g << 5) | r;
+ r6++;
+ }
+ }
+ else
+ {
+ BlendPalette(r4 * 16, 16, a, b);
+ }
+ r4++;
+ }
+}
+
+void sub_807D540(u8 a)
+{
+ if (gWeatherPtr->unknown_6FA < 6)
+ {
+ gWeatherPtr->unknown_6F4[gWeatherPtr->unknown_6FA] = a;
+ gWeatherPtr->unknown_6FA++;
+ }
+}
+
+bool8 sub_807D574(u8 a)
+{
+ u16 i;
+
+ for (i = 0; i < gWeatherPtr->unknown_6FA; i++)
+ {
+ if (gWeatherPtr->unknown_6F4[i] == a)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_807D5BC(s8 a)
+{
+ if (gWeatherPtr->unknown_6C6 == 3)
+ {
+ sub_807CEBC(0, 32, a);
+ gWeatherPtr->unknown_6C0 = a;
+ }
+}
+
+void sub_807D5F0(u8 a, u8 b, u8 c)
+{
+ if (gWeatherPtr->unknown_6C6 == 3)
+ {
+ gWeatherPtr->unknown_6C6 = 0;
+ gWeatherPtr->unknown_6C0 = a;
+ gWeatherPtr->unknown_6C1 = b;
+ gWeatherPtr->unknown_6C3 = 0;
+ gWeatherPtr->unknown_6C2 = c;
+ sub_807D5BC(a);
+ }
+}
+
+void fade_screen(u8 a, u8 delay)
+{
+ u32 fadeColor;
+ u32 r1;
+ u32 r2;
+
+ switch (a)
+ {
+ case 0:
+ fadeColor = 0;
+ r1 = 0;
+ break;
+ case 2:
+ fadeColor = 0xFFFF;
+ r1 = 0;
+ break;
+ case 1:
+ fadeColor = 0;
+ r1 = 1;
+ break;
+ case 3:
+ fadeColor = 0xFFFF;
+ r1 = 1;
+ break;
+ default:
+ return;
+ }
+
+ switch (gWeatherPtr->currWeather)
+ {
+ case WEATHER_RAIN_LIGHT:
+ case WEATHER_RAIN_MED:
+ case WEATHER_RAIN_HEAVY:
+ case WEATHER_SNOW:
+ case WEATHER_FOG_1:
+ case WEATHER_DARK:
+ case WEATHER_DROUGHT:
+ r2 = 1;
+ break;
+ default:
+ r2 = 0;
+ break;
+ }
+
+ if (r1 != 0)
+ {
+ if (r2 != 0)
+ CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, 0x400);
+ BeginNormalPaletteFade(0xFFFFFFFF, delay, 0, 16, fadeColor);
+ gWeatherPtr->unknown_6C6 = 2;
+ }
+ else
+ {
+ gWeatherPtr->unknown_6C4 = fadeColor;
+ if (r2 != 0)
+ gWeatherPtr->unknown_6C7 = 0;
+ else
+ BeginNormalPaletteFade(0xFFFFFFFF, delay, 16, 0, fadeColor);
+ gWeatherPtr->unknown_6C6 = 1;
+ gWeatherPtr->unknown_6CA = 1;
+ gWeatherPtr->unknown_6CB = 0;
+ Weather_SetBlendCoeffs(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB);
+ gWeatherPtr->unknown_6C8 = 1;
+ }
+}
+
+bool8 sub_807D770(void)
+{
+ return gWeatherPtr->unknown_6C6 ^ 1 ? TRUE : FALSE;
+}
+
+void sub_807D78C(u8 a)
+{
+ u16 r4 = 16 + a;
+ u16 i;
+
+ switch (gWeatherPtr->unknown_6C6)
+ {
+ case 1:
+ if (gWeatherPtr->unknown_6CA != 0)
+ {
+ if (gWeatherPtr->currWeather == WEATHER_FOG_1)
+ sub_807D540(r4);
+ r4 *= 16;
+ for (i = 0; i < 16; i++)
+ gPlttBufferFaded[r4 + i] = gWeatherPtr->unknown_6C4;
+ }
+ break;
+ case 2:
+ r4 *= 16;
+ CpuFastCopy(gPlttBufferFaded + r4, gPlttBufferUnfaded + r4, 32);
+ BlendPalette(r4, 16, gPaletteFade.y, gPaletteFade.blendColor);
+ break;
+ default:
+ if (gWeatherPtr->currWeather != WEATHER_FOG_1)
+ {
+ sub_807CEBC(r4, 1, gWeatherPtr->unknown_6C0);
+ }
+ else
+ {
+ r4 *= 16;
+ BlendPalette(r4, 16, 12, 0x73FC);
+ }
+ break;
+ }
+}
+
+void sub_807D874(u8 a)
+{
+ sub_807CEBC(a, 1, gWeatherPtr->unknown_6C0);
+}
+
+u8 unref_sub_807D894(void)
+{
+ if (gWeatherPtr->unknown_6C6 == 1)
+ return gWeatherPtr->unknown_6CA;
+ else
+ return 0;
+}
+
+void sub_807D8C0(const u16 *palette)
+{
+ LoadPalette(palette, 0x100 + gWeatherPtr->unknown_6D4 * 16, 32);
+ sub_807D78C(gWeatherPtr->unknown_6D4);
+}
+
+void sub_807D8F0(u8 *a, u8 *b)
+{
+ u8 r4 = *a;
+ u16 i;
+
+ if (r4 < 7)
+ {
+ r4--;
+ LZ77UnCompWram(sCompressedDroughtPalettes[r4], eWeatherPaletteData.data[r4]);
+ if (r4 == 0)
+ {
+ eWeatherPaletteData.data[r4][0] = 0x421;
+ for (i = 1; i < 0x1000; i++)
+ eWeatherPaletteData.data[r4][i] += eWeatherPaletteData.data[r4][i - 1];
+ }
+ else
+ {
+ for (i = 0; i < 0x1000; i++)
+ eWeatherPaletteData.data[r4][i] += eWeatherPaletteData.data[r4 - 1][i];
+ }
+ if (++(*a) == 7)
+ {
+ *a = 32;
+ *b = 32;
+ }
+ }
+}
+
+void sub_807D9A8(void)
+{
+ gWeatherPtr->unknown_74D = 1;
+ gWeatherPtr->unknown_74E = 1;
+}
+
+bool8 sub_807D9C8(void)
+{
+ if (gWeatherPtr->unknown_74D < 32)
+ {
+ sub_807D8F0(&gWeatherPtr->unknown_74D, &gWeatherPtr->unknown_74E);
+ if (gWeatherPtr->unknown_74D < 32)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_807DA04(s8 a)
+{
+ sub_807D5BC(-a - 1);
+}
+
+void sub_807DA14(void)
+{
+ gWeatherPtr->unknown_73C = 0;
+ gWeatherPtr->unknown_740 = 0;
+ gWeatherPtr->unknown_742 = 0;
+ gWeatherPtr->unknown_73E = 0;
+ gUnknown_0202FF58 = 5;
+}
+
+void sub_807DA4C(void)
+{
+ switch (gWeatherPtr->unknown_742)
+ {
+ case 0:
+ if (++gWeatherPtr->unknown_740 > gUnknown_0202FF58)
+ {
+ gWeatherPtr->unknown_740 = 0;
+ sub_807DA04(gWeatherPtr->unknown_73C++);
+ if (gWeatherPtr->unknown_73C > 5)
+ {
+ gWeatherPtr->unknown_73E = gWeatherPtr->unknown_73C;
+ gWeatherPtr->unknown_742 = 1;
+ gWeatherPtr->unknown_740 = 0x3C;
+ }
+ }
+ break;
+ case 1:
+ gWeatherPtr->unknown_740 = (gWeatherPtr->unknown_740 + 3) & 0x7F;
+ gWeatherPtr->unknown_73C = ((gSineTable[gWeatherPtr->unknown_740] - 1) >> 6) + 2;
+ if (gWeatherPtr->unknown_73C != gWeatherPtr->unknown_73E)
+ sub_807DA04(gWeatherPtr->unknown_73C);
+ gWeatherPtr->unknown_73E = gWeatherPtr->unknown_73C;
+ break;
+ case 2:
+ if (++gWeatherPtr->unknown_740 > gUnknown_0202FF58)
+ {
+ gWeatherPtr->unknown_740 = 0;
+ sub_807DA04(--gWeatherPtr->unknown_73C);
+ if (gWeatherPtr->unknown_73C == 3)
+ gWeatherPtr->unknown_742 = 0;
+ }
+ break;
+ }
+}
+
+void Weather_SetBlendCoeffs(u8 eva, u8 evb)
+{
+ gWeatherPtr->currBlendEVA = eva;
+ gWeatherPtr->currBlendEVB = evb;
+ gWeatherPtr->targetBlendEVA = eva;
+ gWeatherPtr->targetBlendEVB = evb;
+ REG_BLDALPHA = BLDALPHA_BLEND(eva, evb);
+}
+
+void Weather_SetTargetBlendCoeffs(u8 eva, u8 evb, int delay)
+{
+ gWeatherPtr->targetBlendEVA = eva;
+ gWeatherPtr->targetBlendEVB = evb;
+ gWeatherPtr->blendDelay = delay;
+ gWeatherPtr->unknown_739 = 0;
+ gWeatherPtr->unknown_738 = 0;
+}
+
+bool8 Weather_UpdateBlend(void)
+{
+ if (gWeatherPtr->currBlendEVA == gWeatherPtr->targetBlendEVA
+ && gWeatherPtr->currBlendEVB == gWeatherPtr->targetBlendEVB)
+ return TRUE;
+
+ if (++gWeatherPtr->unknown_739 > gWeatherPtr->blendDelay)
+ {
+ gWeatherPtr->unknown_739 = 0;
+ gWeatherPtr->unknown_738++;
+
+ // Update currBlendEVA and currBlendEVB on alternate frames
+ if (gWeatherPtr->unknown_738 & 1)
+ {
+ if (gWeatherPtr->currBlendEVA < gWeatherPtr->targetBlendEVA)
+ gWeatherPtr->currBlendEVA++;
+ else if (gWeatherPtr->currBlendEVA > gWeatherPtr->targetBlendEVA)
+ gWeatherPtr->currBlendEVA--;
+ }
+ else
+ {
+ if (gWeatherPtr->currBlendEVB < gWeatherPtr->targetBlendEVB)
+ gWeatherPtr->currBlendEVB++;
+ else if (gWeatherPtr->currBlendEVB > gWeatherPtr->targetBlendEVB)
+ gWeatherPtr->currBlendEVB--;
+ }
+ }
+
+ REG_BLDALPHA = BLDALPHA_BLEND(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB);
+
+ if (gWeatherPtr->currBlendEVA == gWeatherPtr->targetBlendEVA
+ && gWeatherPtr->currBlendEVB == gWeatherPtr->targetBlendEVB)
+ return TRUE;
+
+ return FALSE;
+}
+
+void unref_sub_807DCB4(u8 a)
+{
+ switch (a)
+ {
+ case 1:
+ SetWeather(1);
+ break;
+ case 2:
+ SetWeather(2);
+ break;
+ case 3:
+ SetWeather(3);
+ break;
+ case 4:
+ SetWeather(4);
+ break;
+ case 5:
+ SetWeather(5);
+ break;
+ case 6:
+ SetWeather(6);
+ break;
+ case 7:
+ SetWeather(9);
+ break;
+ case 8:
+ SetWeather(7);
+ break;
+ case 9:
+ SetWeather(8);
+ break;
+ case 10:
+ SetWeather(11);
+ break;
+ }
+}
+
+u8 weather_get_current(void)
+{
+ return gWeatherPtr->currWeather;
+}
+
+void SetRainStrengthFromSoundEffect(u16 sndEff)
+{
+ if (gWeatherPtr->unknown_6C6 != 2)
+ {
+ switch (sndEff)
+ {
+ case SE_T_KOAME:
+ gWeatherPtr->rainStrength = 0;
+ break;
+ case SE_T_OOAME:
+ gWeatherPtr->rainStrength = 1;
+ break;
+ case SE_T_AME:
+ gWeatherPtr->rainStrength = 2;
+ break;
+ default:
+ return;
+ }
+ PlaySE(sndEff);
+ }
+}
+
+void PlayRainSoundEffect(void)
+{
+ if (IsSpecialSEPlaying())
+ {
+ switch (gWeatherPtr->rainStrength)
+ {
+ case 0:
+ PlaySE(SE_T_KOAME_E);
+ break;
+ case 1:
+ PlaySE(SE_T_OOAME_E);
+ break;
+ case 2:
+ default:
+ PlaySE(SE_T_AME_E);
+ break;
+ }
+ }
+}
+
+u8 sub_807DDFC(void)
+{
+ return gWeatherPtr->unknown_6D3;
+}
+
+void sub_807DE10(void)
+{
+ gWeatherPtr->unknown_6C6 = 2;
+}
+
+void unref_sub_807DE24(void)
+{
+ gWeatherPtr->unknown_6C6 = 3;
+}
+
+void sub_807DE38(u8 a)
+{
+ CpuCopy16(gUnknown_083970C8, gUnknown_0202FF38, 32);
+ gUnknown_0202FF38[a] = 0;
+ gUnknown_030006DC = gUnknown_0202FF38;
+}
+
+void sub_807DE68(void)
+{
+ gUnknown_030006DC = gUnknown_083970C8;
+}
diff --git a/src/field/field_weather_effects.c b/src/field/field_weather_effects.c
new file mode 100644
index 000000000..5a59d6c2a
--- /dev/null
+++ b/src/field/field_weather_effects.c
@@ -0,0 +1,2384 @@
+#include "global.h"
+#include "field_map_obj.h"
+#include "field_weather.h"
+#include "overworld.h"
+#include "random.h"
+#include "script.h"
+#include "constants/weather.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+#include "trig.h"
+
+extern struct Weather *const gWeatherPtr;
+
+const u16 gUnknown_08397108[] = INCBIN_U16("graphics/weather/1.gbapal");
+const u16 gUnknown_08397128[] = INCBIN_U16("graphics/weather/2.gbapal");
+const u8 gWeatherFog2Tiles[] = INCBIN_U8("graphics/weather/fog2.4bpp");
+const u8 gWeatherFog1Tiles[] = INCBIN_U8("graphics/weather/fog1.4bpp");
+const u8 gWeatherCloudTiles[] = INCBIN_U8("graphics/weather/cloud.4bpp");
+const u8 gWeatherSnow1Tiles[] = INCBIN_U8("graphics/weather/snow0.4bpp");
+const u8 gWeatherSnow2Tiles[] = INCBIN_U8("graphics/weather/snow1.4bpp");
+const u8 gWeatherBubbleTiles[] = INCBIN_U8("graphics/weather/bubble.4bpp");
+const u8 gWeatherAshTiles[] = INCBIN_U8("graphics/weather/ash.4bpp");
+const u8 gWeatherRainTiles[] = INCBIN_U8("graphics/weather/rain.4bpp");
+const u8 gWeatherSandstormTiles[] = INCBIN_U8("graphics/weather/sandstorm.4bpp");
+
+static const struct Coords16 gUnknown_0839A9C8[] =
+{
+ { 0, 66},
+ { 5, 73},
+ {10, 78},
+};
+
+static const struct SpriteSheet sCloudSpriteSheet = {gWeatherCloudTiles, sizeof(gWeatherCloudTiles), 0x1200};
+
+static const struct OamData gOamData_839A9DC =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 1,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 3,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const union AnimCmd gSpriteAnim_839A9E4[] =
+{
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const gSpriteAnimTable_839A9EC[] =
+{
+ gSpriteAnim_839A9E4,
+};
+
+void sub_807E0F4(struct Sprite *);
+static const struct SpriteTemplate sCloudSpriteTemplate =
+{
+ .tileTag = 4608,
+ .paletteTag = 4609,
+ .oam = &gOamData_839A9DC,
+ .anims = gSpriteAnimTable_839A9EC,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_807E0F4,
+};
+
+extern void sub_807D5BC(s8 a);
+extern void sub_807D8C0(const u16 *palette);
+extern void sub_807D9A8(void);
+extern bool8 sub_807D9C8(void);
+extern void sub_807DA14(void);
+extern void sub_807DA4C(void);
+extern void Weather_SetTargetBlendCoeffs(u8 a, u8 b, int c);
+extern bool8 Weather_UpdateBlend(void);
+extern void SetRainStrengthFromSoundEffect(u16 sndEff);
+extern void sub_807D5F0(u8 a, u8 b, u8 c);
+
+//------------------------------------------------------------------------------
+// Clouds
+//------------------------------------------------------------------------------
+
+void Clouds_InitVars(void)
+{
+ gWeatherPtr->unknown_6C1 = 0;
+ gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->weatherGfxLoaded = FALSE;
+ gWeatherPtr->initStep = 0;
+ if (gWeatherPtr->cloudSpritesCreated == FALSE)
+ Weather_SetBlendCoeffs(0, 16);
+}
+
+void Clouds_Main(void);
+
+void Clouds_InitAll(void)
+{
+ Clouds_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Clouds_Main();
+}
+
+void CreateCloudSprites(void);
+
+void Clouds_Main(void)
+{
+ switch (gWeatherPtr->initStep)
+ {
+ case 0:
+ CreateCloudSprites();
+ gWeatherPtr->initStep++;
+ break;
+ case 1:
+ Weather_SetTargetBlendCoeffs(12, 8, 1);
+ gWeatherPtr->initStep++;
+ break;
+ case 2:
+ if (Weather_UpdateBlend())
+ {
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
+ }
+ break;
+ }
+}
+
+void sub_807E0A0(void);
+
+bool8 Clouds_Finish(void)
+{
+ switch (gWeatherPtr->finishStep)
+ {
+ case 0:
+ Weather_SetTargetBlendCoeffs(0, 16, 1);
+ gWeatherPtr->finishStep++;
+ return TRUE;
+ case 1:
+ if (Weather_UpdateBlend())
+ {
+ sub_807E0A0();
+ gWeatherPtr->finishStep++;
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+//------------------------------------------------------------------------------
+// Weather 2
+//------------------------------------------------------------------------------
+
+void Weather2_InitVars(void)
+{
+ gWeatherPtr->unknown_6C1 = 0;
+ gWeatherPtr->unknown_6C2 = 20;
+}
+
+void Weather2_InitAll(void)
+{
+ Weather2_InitVars();
+}
+
+void Weather2_Main(void)
+{
+}
+
+int Weather2_Finish(void)
+{
+ return 0;
+}
+
+void CreateCloudSprites(void)
+{
+ u16 i;
+
+ if (gWeatherPtr->cloudSpritesCreated == TRUE)
+ return;
+ LoadSpriteSheet(&sCloudSpriteSheet);
+ sub_807D8C0(gUnknown_08397108);
+ for (i = 0; i < 3; i++)
+ {
+ u8 spriteId = CreateSprite(&sCloudSpriteTemplate, 0, 0, 0xFF);
+
+ if (spriteId != 64)
+ {
+ struct Sprite *sprite;
+
+ gWeatherPtr->sprites.s1.cloudSprites[i] = &gSprites[spriteId];
+ sprite = gWeatherPtr->sprites.s1.cloudSprites[i];
+ sub_80603CC(gUnknown_0839A9C8[i].x + 7, gUnknown_0839A9C8[i].y + 7, &sprite->pos1.x, &sprite->pos1.y);
+ sprite->coordOffsetEnabled = TRUE;
+ }
+ else
+ {
+ gWeatherPtr->sprites.s1.cloudSprites[i] = NULL;
+ }
+ }
+ gWeatherPtr->cloudSpritesCreated = TRUE;
+}
+
+void sub_807E0A0(void)
+{
+ u16 i;
+
+ if (gWeatherPtr->cloudSpritesCreated == FALSE)
+ return;
+ for (i = 0; i < 3; i++)
+ {
+ if (gWeatherPtr->sprites.s1.cloudSprites[i] != NULL)
+ DestroySprite(gWeatherPtr->sprites.s1.cloudSprites[i]);
+ }
+ FreeSpriteTilesByTag(0x1200);
+ gWeatherPtr->cloudSpritesCreated = FALSE;
+}
+
+void sub_807E0F4(struct Sprite *sprite)
+{
+ sprite->data[0] = (sprite->data[0] + 1) & 1;
+ if (sprite->data[0] != 0)
+ sprite->pos1.x--;
+}
+
+//------------------------------------------------------------------------------
+// Drought
+//------------------------------------------------------------------------------
+
+void Drought_InitVars(void)
+{
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = FALSE;
+ gWeatherPtr->unknown_6C1 = 0;
+ gWeatherPtr->unknown_6C2 = 0;
+}
+
+void Drought_Main(void);
+
+void Drought_InitAll(void)
+{
+ Drought_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Drought_Main();
+}
+
+void Drought_Main(void)
+{
+ switch (gWeatherPtr->initStep)
+ {
+ case 0:
+ if (gWeatherPtr->unknown_6C6 != 0)
+ gWeatherPtr->initStep++;
+ break;
+ case 1:
+ sub_807D9A8();
+ gWeatherPtr->initStep++;
+ break;
+ case 2:
+ if (sub_807D9C8() == FALSE)
+ gWeatherPtr->initStep++;
+ break;
+ case 3:
+ sub_807DA14();
+ gWeatherPtr->initStep++;
+ break;
+ case 4:
+ sub_807DA4C();
+ if (gWeatherPtr->unknown_73C == 6)
+ {
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
+ }
+ break;
+ default:
+ sub_807DA4C();
+ break;
+ }
+}
+
+int Drought_Finish(void)
+{
+ return 0;
+}
+
+void task50_0807B6D4(u8);
+
+void sub_807E25C(void)
+{
+ CreateTask(task50_0807B6D4, 0x50);
+}
+
+#define tState data[0]
+#define tBlendY data[1]
+#define tBlendDelay data[2]
+#define tWinRange data[3]
+
+void task50_0807B6D4(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->tState)
+ {
+ case 0:
+ task->tBlendY = 0;
+ task->tBlendDelay = 0;
+ task->tWinRange = REG_WININ;
+ REG_WININ = WIN_RANGE(63, 63);
+ REG_BLDCNT = BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ
+ | BLDCNT_EFFECT_LIGHTEN;
+ REG_BLDY = 0;
+ task->tState++;
+ // fall through
+ case 1:
+ task->tBlendY += 3;
+ if (task->tBlendY > 16)
+ task->tBlendY = 16;
+ REG_BLDY = task->tBlendY;
+ if (task->tBlendY >= 16)
+ task->tState++;
+ break;
+ case 2:
+ task->tBlendDelay++;
+ if (task->tBlendDelay > 9)
+ {
+ task->tBlendDelay = 0;
+ task->tBlendY--;
+ if (task->tBlendY <= 0)
+ {
+ task->tBlendY = 0;
+ task->tState++;
+ }
+ REG_BLDY = task->tBlendY;
+ }
+ break;
+ case 3:
+ REG_BLDCNT = 0;
+ REG_BLDY = 0;
+ REG_WININ = task->tWinRange;
+ task->tState++;
+ break;
+ case 4:
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+#undef tState
+#undef tBlendY
+#undef tBlendDelay
+#undef tWinRange
+
+//------------------------------------------------------------------------------
+// Light Rain
+//------------------------------------------------------------------------------
+
+void LightRain_InitVars(void)
+{
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = FALSE;
+ gWeatherPtr->unknown_6D6 = 0;
+ gWeatherPtr->unknown_6DB = 8;
+ gWeatherPtr->unknown_6DC = 0;
+ gWeatherPtr->unknown_6D9 = 10;
+ gWeatherPtr->unknown_6C1 = 3;
+ gWeatherPtr->unknown_6C2 = 20;
+ SetRainStrengthFromSoundEffect(SE_T_KOAME);
+}
+
+void LightRain_Main(void);
+
+void LightRain_InitAll(void)
+{
+ LightRain_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ LightRain_Main();
+}
+
+void LoadRainSpriteSheet(void);
+u8 CreateRainSprite(void);
+u8 sub_807E8E8(void);
+
+void LightRain_Main(void)
+{
+ switch (gWeatherPtr->initStep)
+ {
+ case 0:
+ LoadRainSpriteSheet();
+ gWeatherPtr->initStep++;
+ break;
+ case 1:
+ if (CreateRainSprite() == 0)
+ gWeatherPtr->initStep++;
+ break;
+ case 2:
+ if (sub_807E8E8() == FALSE)
+ {
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
+ }
+ break;
+ }
+}
+
+void DestroyRainSprites(void);
+
+bool8 LightRain_Finish(void)
+{
+ switch (gWeatherPtr->finishStep)
+ {
+ case 0:
+ if (gWeatherPtr->nextWeather == WEATHER_RAIN_LIGHT
+ || gWeatherPtr->nextWeather == WEATHER_RAIN_MED
+ || gWeatherPtr->nextWeather == WEATHER_RAIN_HEAVY)
+ {
+ gWeatherPtr->finishStep = 0xFF;
+ return FALSE;
+ }
+ else
+ {
+ gWeatherPtr->unknown_6D9 = 0;
+ gWeatherPtr->finishStep++;
+ }
+ // fall through
+ case 1:
+ if (sub_807E8E8() == FALSE)
+ {
+ DestroyRainSprites();
+ gWeatherPtr->finishStep++;
+ return FALSE;
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+// defined below
+extern const s16 gUnknown_0839AABC[][2];
+extern const u16 gUnknown_0839AAC4[][2];
+
+void sub_807E4EC(struct Sprite *sprite)
+{
+ u32 randVal;
+ u16 r6;
+ s32 r4;
+ s32 r0;
+
+ if (sprite->data[1] == 0)
+ sprite->data[1] = 361;
+ randVal = sprite->data[1] * 1103515245 + 12345;
+ sprite->data[1] = ((randVal & 0x7FFF0000) >> 16) % 600;
+
+ r6 = gUnknown_0839AAC4[gWeatherPtr->unknown_6DC][0];
+
+ r4 = sprite->data[1] % 30;
+ sprite->data[2] = r4 * 8; // useless assignment
+
+ r0 = sprite->data[1] / 30;
+ sprite->data[3] = r0 * 8; // useless assignment
+
+ sprite->data[2] = r4;
+ sprite->data[2] <<= 7;
+
+ sprite->data[3] = r0;
+ sprite->data[3] <<= 7;
+
+ sprite->data[2] -= gUnknown_0839AABC[gWeatherPtr->unknown_6DC][0] * r6;
+ sprite->data[3] -= gUnknown_0839AABC[gWeatherPtr->unknown_6DC][1] * r6;
+
+ StartSpriteAnim(sprite, 0);
+ sprite->data[4] = 0;
+ sprite->coordOffsetEnabled = FALSE;
+ sprite->data[0] = r6;
+}
+
+void sub_807E5C0(struct Sprite *sprite)
+{
+ if (sprite->data[4] == 0)
+ {
+ sprite->data[2] += gUnknown_0839AABC[gWeatherPtr->unknown_6DC][0];
+ sprite->data[3] += gUnknown_0839AABC[gWeatherPtr->unknown_6DC][1];
+ sprite->pos1.x = sprite->data[2] >> 4;
+ sprite->pos1.y = sprite->data[3] >> 4;
+
+ if (sprite->data[5] != 0
+ && (sprite->pos1.x >= -8 && sprite->pos1.x <= 248)
+ && sprite->pos1.y >= -16 && sprite->pos1.y <= 176)
+ sprite->invisible = FALSE;
+ else
+ sprite->invisible = TRUE;
+
+ sprite->data[0]--;
+ if (sprite->data[0] == 0)
+ {
+ StartSpriteAnim(sprite, gWeatherPtr->unknown_6DC + 1);
+ sprite->data[4] = 1;
+ sprite->pos1.x -= gSpriteCoordOffsetX;
+ sprite->pos1.y -= gSpriteCoordOffsetY;
+ sprite->coordOffsetEnabled = TRUE;
+ }
+ }
+ else if (sprite->animEnded)
+ {
+ sprite->invisible = TRUE;
+ sub_807E4EC(sprite);
+ }
+}
+
+void sub_807E6C4(struct Sprite *sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sub_807E4EC(sprite);
+ sprite->callback = sub_807E5C0;
+ }
+ else
+ {
+ sprite->data[0]--;
+ }
+}
+
+void sub_807E6F0(struct Sprite *sprite, u16 b)
+{
+ u16 r8 = gUnknown_0839AAC4[gWeatherPtr->unknown_6DC][0];
+ u16 r6 = b / (gUnknown_0839AAC4[gWeatherPtr->unknown_6DC][1] + r8);
+ u16 r4 = b % (gUnknown_0839AAC4[gWeatherPtr->unknown_6DC][1] + r8);
+
+ while (--r6 != 0xFFFF)
+ sub_807E4EC(sprite);
+ if (r4 < r8)
+ {
+ while (--r4 != 0xFFFF)
+ sub_807E5C0(sprite);
+ sprite->data[6] = 0;
+ }
+ else
+ {
+ sprite->data[0] = r4 - r8;
+ sprite->invisible = TRUE;
+ sprite->data[6] = 1;
+ }
+}
+
+extern const struct SpriteSheet sRainSpriteSheet; // defined below
+
+void LoadRainSpriteSheet(void)
+{
+ LoadSpriteSheet(&sRainSpriteSheet);
+}
+
+static const struct Coords16 sRainSpriteCoords[] =
+{
+ { 0, 0},
+ { 0, 160},
+ { 0, 64},
+ {144, 224},
+ {144, 128},
+ { 32, 32},
+ { 32, 192},
+ { 32, 96},
+ { 72, 128},
+ { 72, 32},
+ { 72, 192},
+ {216, 96},
+ {216, 0},
+ {104, 160},
+ {104, 64},
+ {104, 224},
+ {144, 0},
+ {144, 160},
+ {144, 64},
+ { 32, 224},
+ { 32, 128},
+ { 72, 32},
+ { 72, 192},
+ { 48, 96},
+};
+
+static const struct OamData gOamData_839AA68 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 2,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 2,
+ .affineParam = 0,
+};
+
+static const union AnimCmd gSpriteAnim_839AA70[] =
+{
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd gSpriteAnim_839AA78[] =
+{
+ ANIMCMD_FRAME(8, 3),
+ ANIMCMD_FRAME(32, 2),
+ ANIMCMD_FRAME(40, 2),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gSpriteAnim_839AA88[] =
+{
+ ANIMCMD_FRAME(8, 3),
+ ANIMCMD_FRAME(16, 3),
+ ANIMCMD_FRAME(24, 4),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const gSpriteAnimTable_839AA98[] =
+{
+ gSpriteAnim_839AA70,
+ gSpriteAnim_839AA78,
+ gSpriteAnim_839AA88,
+};
+
+static const struct SpriteTemplate sRainSpriteTemplate =
+{
+ .tileTag = 4614,
+ .paletteTag = 4608,
+ .oam = &gOamData_839AA68,
+ .anims = gSpriteAnimTable_839AA98,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_807E5C0,
+};
+
+
+const s16 gUnknown_0839AABC[][2] =
+{
+ {-104, 208},
+ {-160, 320},
+};
+
+const u16 gUnknown_0839AAC4[][2] =
+{
+ {18, 7},
+ {12, 10},
+};
+
+static const struct SpriteSheet sRainSpriteSheet = {gWeatherRainTiles, sizeof(gWeatherRainTiles), 0x1206};
+
+static const struct OamData gOamData_839AAD4 =
+{
+ .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 struct SpriteFrameImage gSpriteImageTable_839AADC[] =
+{
+ {gWeatherSnow1Tiles, sizeof(gWeatherSnow1Tiles)},
+ {gWeatherSnow2Tiles, sizeof(gWeatherSnow2Tiles)},
+};
+
+static const union AnimCmd gSpriteAnim_839AAEC[] =
+{
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gSpriteAnim_839AAF4[] =
+{
+ ANIMCMD_FRAME(1, 16),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const gSpriteAnimTable_839AAFC[] =
+{
+ gSpriteAnim_839AAEC,
+ gSpriteAnim_839AAF4,
+};
+
+void sub_807ED48(struct Sprite *);
+static const struct SpriteTemplate sSnowflakeSpriteTemplate =
+{
+ .tileTag = 0xFFFF,
+ .paletteTag = 4608,
+ .oam = &gOamData_839AAD4,
+ .anims = gSpriteAnimTable_839AAFC,
+ .images = gSpriteImageTable_839AADC,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_807ED48,
+};
+
+// unused data
+static const u16 unusedData_839AB1C[] = {0, 6, 6, 12, 18, 42, 300, 300};
+
+static const struct OamData gOamData_839AB2C =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 1,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const union AnimCmd gSpriteAnim_839AB34[] =
+{
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gSpriteAnim_839AB3C[] =
+{
+ ANIMCMD_FRAME(32, 16),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gSpriteAnim_839AB44[] =
+{
+ ANIMCMD_FRAME(64, 16),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gSpriteAnim_839AB4C[] =
+{
+ ANIMCMD_FRAME(96, 16),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gSpriteAnim_839AB54[] =
+{
+ ANIMCMD_FRAME(128, 16),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gSpriteAnim_839AB5C[] =
+{
+ ANIMCMD_FRAME(160, 16),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const gSpriteAnimTable_839AB64[] =
+{
+ gSpriteAnim_839AB34,
+ gSpriteAnim_839AB3C,
+ gSpriteAnim_839AB44,
+ gSpriteAnim_839AB4C,
+ gSpriteAnim_839AB54,
+ gSpriteAnim_839AB5C,
+};
+
+static const union AffineAnimCmd gSpriteAffineAnim_839AB7C[] =
+{
+ AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd *const gSpriteAffineAnimTable_839AB8C[] =
+{
+ gSpriteAffineAnim_839AB7C,
+};
+
+static void Fog1SpriteCallback(struct Sprite *);
+static const struct SpriteTemplate sFog1SpriteTemplate =
+{
+ .tileTag = 4609,
+ .paletteTag = 4608,
+ .oam = &gOamData_839AB2C,
+ .anims = gSpriteAnimTable_839AB64,
+ .images = NULL,
+ .affineAnims = gSpriteAffineAnimTable_839AB8C,
+ .callback = Fog1SpriteCallback,
+};
+
+bool8 CreateRainSprite(void)
+{
+ u8 spriteNum;
+ u8 spriteId;
+
+ if (gWeatherPtr->rainSpriteCount == 24)
+ return FALSE;
+
+ spriteNum = gWeatherPtr->rainSpriteCount;
+ spriteId = CreateSpriteAtEnd(&sRainSpriteTemplate,
+ sRainSpriteCoords[spriteNum].x, sRainSpriteCoords[spriteNum].y, 78);
+ if (spriteId != 64)
+ {
+ gSprites[spriteId].data[5] = 0;
+ gSprites[spriteId].data[1] = spriteNum * 145;
+ while (gSprites[spriteId].data[1] >= 600)
+ gSprites[spriteId].data[1] -= 600;
+ sub_807E4EC(&gSprites[spriteId]);
+ sub_807E6F0(&gSprites[spriteId], spriteNum * 9);
+ gSprites[spriteId].invisible = TRUE;
+ gWeatherPtr->sprites.s1.rainSprites[spriteNum] = &gSprites[spriteId];
+ }
+ else
+ {
+ gWeatherPtr->sprites.s1.rainSprites[spriteNum] = NULL;
+ }
+
+ if (++gWeatherPtr->rainSpriteCount == 24)
+ {
+ u16 i;
+
+ for (i = 0; i < 24; i++)
+ {
+ if (gWeatherPtr->sprites.s1.rainSprites[i] != NULL)
+ {
+ if (gWeatherPtr->sprites.s1.rainSprites[i]->data[6] == 0)
+ gWeatherPtr->sprites.s1.rainSprites[i]->callback = sub_807E5C0;
+ else
+ gWeatherPtr->sprites.s1.rainSprites[i]->callback = sub_807E6C4;
+ }
+ }
+ return FALSE;
+ }
+ return TRUE;
+}
+
+bool8 sub_807E8E8(void)
+{
+ if (gWeatherPtr->unknown_6D8 == gWeatherPtr->unknown_6D9)
+ return FALSE;
+
+ if (++gWeatherPtr->unknown_6D6 > gWeatherPtr->unknown_6DB)
+ {
+ gWeatherPtr->unknown_6D6 = 0;
+ if (gWeatherPtr->unknown_6D8 < gWeatherPtr->unknown_6D9)
+ {
+ gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->unknown_6D8++]->data[5] = 1;
+ }
+ else
+ {
+ gWeatherPtr->unknown_6D8--;
+ gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->unknown_6D8]->data[5] = 0;
+ gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->unknown_6D8]->invisible = TRUE;
+ }
+ }
+ return TRUE;
+}
+
+void DestroyRainSprites(void)
+{
+ u16 i;
+
+ for (i = 0; i < gWeatherPtr->rainSpriteCount; i++)
+ {
+ if (gWeatherPtr->sprites.s1.rainSprites[i] != NULL)
+ DestroySprite(gWeatherPtr->sprites.s1.rainSprites[i]);
+ }
+ gWeatherPtr->rainSpriteCount = 0;
+ FreeSpriteTilesByTag(0x1206);
+}
+
+//------------------------------------------------------------------------------
+// Snow
+//------------------------------------------------------------------------------
+
+void Snow_InitVars(void)
+{
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = FALSE;
+ gWeatherPtr->unknown_6C1 = 3;
+ gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->unknown_6E5 = 16;
+ gWeatherPtr->unknown_6E0 = 0;
+}
+
+void Snow_Main(void);
+void sub_807ED48(struct Sprite *);
+
+void Snow_InitAll(void)
+{
+ Snow_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ {
+ u16 i;
+
+ Snow_Main();
+ for (i = 0; i < gWeatherPtr->snowflakeSpriteCount; i++)
+ {
+ sub_807ED48(gWeatherPtr->sprites.s1.snowflakeSprites[i]);
+ }
+ }
+}
+
+u8 snowflakes_progress(void);
+
+void Snow_Main(void)
+{
+ if (gWeatherPtr->initStep == 0 && snowflakes_progress() == FALSE)
+ {
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
+ }
+}
+
+bool8 Snow_Finish(void)
+{
+ switch (gWeatherPtr->finishStep)
+ {
+ case 0:
+ gWeatherPtr->unknown_6E5 = 0;
+ gWeatherPtr->unknown_6E0 = 0;
+ gWeatherPtr->finishStep++;
+ // fall through
+ case 1:
+ if (snowflakes_progress() == FALSE)
+ {
+ gWeatherPtr->finishStep++;
+ return FALSE;
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 CreateSnowflakeSprite(void);
+bool8 RemoveSnowflakeSprite(void);
+
+bool8 snowflakes_progress(void)
+{
+ if (gWeatherPtr->snowflakeSpriteCount == gWeatherPtr->unknown_6E5)
+ return FALSE;
+
+ gWeatherPtr->unknown_6E0++;
+ if (gWeatherPtr->unknown_6E0 > 36)
+ {
+ gWeatherPtr->unknown_6E0 = 0;
+ if (gWeatherPtr->snowflakeSpriteCount < gWeatherPtr->unknown_6E5)
+ CreateSnowflakeSprite();
+ else
+ RemoveSnowflakeSprite();
+ }
+ return (gWeatherPtr->snowflakeSpriteCount != gWeatherPtr->unknown_6E5);
+}
+
+void sub_807EC40(struct Sprite *);
+
+bool8 CreateSnowflakeSprite(void)
+{
+ u8 spriteId = CreateSpriteAtEnd(&sSnowflakeSpriteTemplate, 0, 0, 78);
+
+ if (spriteId == 64)
+ return FALSE;
+ gSprites[spriteId].data[4] = gWeatherPtr->snowflakeSpriteCount;
+ sub_807EC40(&gSprites[spriteId]);
+ gSprites[spriteId].coordOffsetEnabled = TRUE;
+ gWeatherPtr->sprites.s1.snowflakeSprites[gWeatherPtr->snowflakeSpriteCount++] = &gSprites[spriteId];
+ return TRUE;
+}
+
+bool8 RemoveSnowflakeSprite(void)
+{
+ if (gWeatherPtr->snowflakeSpriteCount != 0)
+ {
+ DestroySprite(gWeatherPtr->sprites.s1.snowflakeSprites[--gWeatherPtr->snowflakeSpriteCount]);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_807EC40(struct Sprite *sprite)
+{
+ u16 r4 = ((sprite->data[4] * 5) & 7) * 30 + (Random() % 30);
+ u16 r6;
+
+ sprite->pos1.y = -3 - (gSpriteCoordOffsetY + sprite->centerToCornerVecY);
+ sprite->pos1.x = r4 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX);
+ sprite->data[0] = sprite->pos1.y * 128;
+ sprite->pos2.x = 0;
+ r6 = Random();
+ sprite->data[1] = (r6 & 3) * 5 + 64;
+ sprite->data[7] = (r6 & 3) * 5 + 64;
+ StartSpriteAnim(sprite, (r6 & 1) ? 0 : 1);
+ sprite->data[3] = 0;
+ sprite->data[2] = ((r6 & 3) == 0) ? 2 : 1;
+ sprite->data[6] = (r6 & 0x1F) + 210;
+ sprite->data[5] = 0;
+}
+
+void sub_807ECEC(struct Sprite *sprite)
+{
+ if (gWeatherPtr->unknown_6E2 > 18)
+ {
+ sprite->invisible = FALSE;
+ sprite->callback = sub_807ED48;
+ sprite->pos1.y = 0xFA - (gSpriteCoordOffsetY + sprite->centerToCornerVecY);
+ sprite->data[0] = sprite->pos1.y * 128;
+ gWeatherPtr->unknown_6E2 = 0;
+ }
+}
+
+void sub_807ED48(struct Sprite *sprite)
+{
+ s16 r3;
+ s16 r2;
+
+ sprite->data[0] += sprite->data[1];
+ sprite->pos1.y = sprite->data[0] >> 7;
+ sprite->data[3] = (sprite->data[3] + sprite->data[2]) & 0xFF;
+ sprite->pos2.x = gSineTable[sprite->data[3]] / 64;
+
+ r3 = (sprite->pos1.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX) & 0x1FF;
+ if (r3 & 0x100)
+ r3 = -0x100 | r3; // hmm... what is this?
+ if (r3 < -3)
+ sprite->pos1.x = 242 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX);
+ else if (r3 > 242)
+ sprite->pos1.x = -3 - (gSpriteCoordOffsetX + sprite->centerToCornerVecX);
+
+ r2 = (sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY) & 0xFF;
+ if (r2 > 163 && r2 < 171)
+ {
+ sprite->pos1.y = 250 - (gSpriteCoordOffsetY + sprite->centerToCornerVecY);
+ sprite->data[0] = sprite->pos1.y * 128;
+ sprite->data[5] = 0;
+ sprite->data[6] = 220;
+ }
+ else if (r2 > 242 && r2 < 250)
+ {
+ sprite->pos1.y = 163;
+ sprite->data[0] = sprite->pos1.y * 128;
+ sprite->data[5] = 0;
+ sprite->data[6] = 220;
+ sprite->invisible = TRUE;
+ sprite->callback = sub_807ECEC;
+ }
+
+ sprite->data[5]++;
+ if (sprite->data[5] == sprite->data[6])
+ {
+ sub_807EC40(sprite);
+ sprite->pos1.y = 250;
+ sprite->invisible = TRUE;
+ sprite->callback = sub_807ECEC;
+ }
+}
+
+//------------------------------------------------------------------------------
+// Medium Rain
+//------------------------------------------------------------------------------
+
+void MedRain_InitVars(void)
+{
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = FALSE;
+ gWeatherPtr->unknown_6D6 = 0;
+ gWeatherPtr->unknown_6DB = 4;
+ gWeatherPtr->unknown_6DC = 0;
+ gWeatherPtr->unknown_6D9 = 16;
+ gWeatherPtr->unknown_6C1 = 3;
+ gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment
+ gWeatherPtr->unknown_6ED = 0;
+ SetRainStrengthFromSoundEffect(SE_T_AME);
+}
+
+void Rain_Main(void);
+
+void MedRain_InitAll(void)
+{
+ MedRain_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Rain_Main();
+}
+
+//------------------------------------------------------------------------------
+// Heavy Rain
+//------------------------------------------------------------------------------
+
+void HeavyRain_InitVars(void)
+{
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = FALSE;
+ gWeatherPtr->unknown_6D6 = 0;
+ gWeatherPtr->unknown_6DB = 4;
+ gWeatherPtr->unknown_6DC = 1;
+ gWeatherPtr->unknown_6D9 = 24;
+ gWeatherPtr->unknown_6C1 = 3;
+ gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment
+ SetRainStrengthFromSoundEffect(SE_T_OOAME);
+}
+
+void HeavyRain_InitAll(void)
+{
+ HeavyRain_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Rain_Main();
+}
+
+void UpdateThunderSound(void);
+void SetThunderCounter(u16);
+
+void Rain_Main(void)
+{
+ UpdateThunderSound();
+ switch (gWeatherPtr->initStep)
+ {
+ case 0:
+ LoadRainSpriteSheet();
+ gWeatherPtr->initStep++;
+ break;
+ case 1:
+ if (CreateRainSprite())
+ break;
+ gWeatherPtr->initStep++;
+ break;
+ case 2:
+ if (sub_807E8E8())
+ break;
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
+ break;
+ case 3:
+ if (gWeatherPtr->unknown_6C6 == 0)
+ break;
+ gWeatherPtr->initStep = 6;
+ break;
+ case 4:
+ gWeatherPtr->unknown_6EA = 1;
+ gWeatherPtr->unknown_6E6 = (Random() % 360) + 360;
+ gWeatherPtr->initStep++;
+ // fall through
+ case 5:
+ if (--gWeatherPtr->unknown_6E6 != 0)
+ break;
+ gWeatherPtr->initStep++;
+ break;
+ case 6:
+ gWeatherPtr->unknown_6EA = 1;
+ gWeatherPtr->unknown_6EB = Random() % 2;
+ gWeatherPtr->initStep++;
+ break;
+ case 7:
+ gWeatherPtr->unknown_6EC = (Random() & 1) + 1;
+ gWeatherPtr->initStep++;
+ // fall through
+ case 8:
+ sub_807D5BC(19);
+ if (gWeatherPtr->unknown_6EB == 0 && gWeatherPtr->unknown_6EC == 1)
+ SetThunderCounter(20);
+ gWeatherPtr->unknown_6E6 = (Random() % 3) + 6;
+ gWeatherPtr->initStep++;
+ break;
+ case 9:
+ if (--gWeatherPtr->unknown_6E6 != 0)
+ break;
+ sub_807D5BC(3);
+ gWeatherPtr->unknown_6EA = 1;
+ if (--gWeatherPtr->unknown_6EC != 0)
+ {
+ gWeatherPtr->unknown_6E6 = (Random() % 16) + 60;
+ gWeatherPtr->initStep = 10;
+ }
+ else if (gWeatherPtr->unknown_6EB == 0)
+ {
+ gWeatherPtr->initStep = 4;
+ }
+ else
+ {
+ gWeatherPtr->initStep = 11;
+ }
+ break;
+ case 10:
+ if (--gWeatherPtr->unknown_6E6 != 0)
+ break;
+ gWeatherPtr->initStep = 8;
+ break;
+ case 11:
+ gWeatherPtr->unknown_6E6 = (Random() % 16) + 60;
+ gWeatherPtr->initStep++;
+ break;
+ case 12:
+ if (--gWeatherPtr->unknown_6E6 != 0)
+ break;
+ SetThunderCounter(100);
+ sub_807D5BC(19);
+ // Why use "% 16" everywhere else and "& 0xF" here. So dumb.
+ gWeatherPtr->unknown_6E6 = (Random() & 0xF) + 30;
+ gWeatherPtr->initStep++;
+ break;
+ case 13:
+ if (--gWeatherPtr->unknown_6E6 != 0)
+ break;
+ sub_807D5F0(19, 3, 5);
+ gWeatherPtr->initStep++;
+ break;
+ case 14:
+ if (gWeatherPtr->unknown_6C6 != 3)
+ break;
+ gWeatherPtr->unknown_6EA = 1;
+ gWeatherPtr->initStep = 4;
+ break;
+ }
+}
+
+bool8 Rain_Finish(void)
+{
+ switch (gWeatherPtr->finishStep)
+ {
+ case 0:
+ gWeatherPtr->unknown_6EA = 0;
+ gWeatherPtr->finishStep++;
+ // fall through
+ case 1:
+ Rain_Main();
+ if (gWeatherPtr->unknown_6EA != 0)
+ {
+ if (gWeatherPtr->nextWeather == WEATHER_RAIN_LIGHT
+ || gWeatherPtr->nextWeather == WEATHER_RAIN_MED
+ || gWeatherPtr->nextWeather == WEATHER_RAIN_HEAVY)
+ return FALSE;
+ gWeatherPtr->unknown_6D9 = 0;
+ gWeatherPtr->finishStep++;
+ }
+ break;
+ case 2:
+ if (sub_807E8E8())
+ break;
+ DestroyRainSprites();
+ gWeatherPtr->unknown_6ED = 0;
+ gWeatherPtr->finishStep++;
+ return FALSE;
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void SetThunderCounter(u16 max)
+{
+ if (gWeatherPtr->unknown_6ED == 0)
+ {
+ gWeatherPtr->thunderCounter = Random() % max;
+ gWeatherPtr->unknown_6ED = 1;
+ }
+}
+
+void UpdateThunderSound(void)
+{
+ if (gWeatherPtr->unknown_6ED == 1)
+ {
+ if (gWeatherPtr->thunderCounter == 0)
+ {
+ if (IsSEPlaying())
+ return;
+ if (Random() & 1)
+ PlaySE(SE_T_KAMI);
+ else
+ PlaySE(SE_T_KAMI2);
+ gWeatherPtr->unknown_6ED = 0;
+ }
+ else
+ {
+ gWeatherPtr->thunderCounter--;
+ }
+ }
+}
+
+//------------------------------------------------------------------------------
+// Fog 1
+//------------------------------------------------------------------------------
+
+void Fog1_Main(void);
+static void CreateFog1Sprites(void);
+static void DestroyFog1Sprites(void);
+
+void Fog1_InitVars(void)
+{
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = FALSE;
+ gWeatherPtr->unknown_6C1 = 0;
+ gWeatherPtr->unknown_6C2 = 20;
+ if (gWeatherPtr->fog1SpritesCreated == 0)
+ {
+ gWeatherPtr->unknown_6F0 = 0;
+ gWeatherPtr->unknown_6F2 = 0;
+ gWeatherPtr->fog1ScrollPosX = 0;
+ Weather_SetBlendCoeffs(0, 16);
+ }
+}
+
+void Fog1_InitAll(void)
+{
+ Fog1_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Fog1_Main();
+}
+
+void Fog1_Main(void)
+{
+ gWeatherPtr->fog1ScrollPosX = (gSpriteCoordOffsetX - gWeatherPtr->unknown_6F2) & 0xFF;
+ if (++gWeatherPtr->unknown_6F0 > 3)
+ {
+ gWeatherPtr->unknown_6F0 = 0;
+ gWeatherPtr->unknown_6F2++;
+ }
+ switch (gWeatherPtr->initStep)
+ {
+ case 0:
+ CreateFog1Sprites();
+ if (gWeatherPtr->currWeather == WEATHER_FOG_1)
+ Weather_SetTargetBlendCoeffs(12, 8, 3);
+ else
+ Weather_SetTargetBlendCoeffs(4, 16, 0);
+ gWeatherPtr->initStep++;
+ break;
+ case 1:
+ if (Weather_UpdateBlend())
+ {
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
+ }
+ break;
+ }
+}
+
+bool8 Fog1_Finish(void)
+{
+ gWeatherPtr->fog1ScrollPosX = (gSpriteCoordOffsetX - gWeatherPtr->unknown_6F2) & 0xFF;
+ if (++gWeatherPtr->unknown_6F0 > 3)
+ {
+ gWeatherPtr->unknown_6F0 = 0;
+ gWeatherPtr->unknown_6F2++;
+ }
+ switch (gWeatherPtr->finishStep)
+ {
+ case 0:
+ Weather_SetTargetBlendCoeffs(0, 16, 3);
+ gWeatherPtr->finishStep++;
+ break;
+ case 1:
+ if (!Weather_UpdateBlend())
+ break;
+ gWeatherPtr->finishStep++;
+ break;
+ case 2:
+ DestroyFog1Sprites();
+ gWeatherPtr->finishStep++;
+ break;
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+#define sprColumn data[0]
+
+static void Fog1SpriteCallback(struct Sprite *sprite)
+{
+ sprite->pos2.y = (u8)gSpriteCoordOffsetY;
+ sprite->pos1.x = gWeatherPtr->fog1ScrollPosX + 32 + sprite->sprColumn * 64;
+ if (sprite->pos1.x > 0x10F)
+ {
+ sprite->pos1.x = 480 + gWeatherPtr->fog1ScrollPosX - (4 - sprite->sprColumn) * 64;
+ sprite->pos1.x &= 0x1FF;
+ }
+}
+
+static void CreateFog1Sprites(void)
+{
+ u16 i;
+
+ if (!gWeatherPtr->fog1SpritesCreated)
+ {
+ struct SpriteSheet fog1SpriteSheet = {gWeatherFog1Tiles, sizeof(gWeatherFog1Tiles), 0x1201};
+
+ LoadSpriteSheet(&fog1SpriteSheet);
+ for (i = 0; i < 20; i++)
+ {
+ u8 spriteId = CreateSpriteAtEnd(&sFog1SpriteTemplate, 0, 0, 0xFF);
+
+ if (spriteId != MAX_SPRITES)
+ {
+ struct Sprite *sprite = &gSprites[spriteId];
+
+ sprite->sprColumn = i % 5;
+ sprite->pos1.x = (i % 5) * 64 + 32;
+ sprite->pos1.y = (i / 5) * 64 + 32;
+ gWeatherPtr->sprites.s2.fog1Sprites[i] = sprite;
+ }
+ else
+ {
+ gWeatherPtr->sprites.s2.fog1Sprites[i] = NULL;
+ }
+ }
+ gWeatherPtr->fog1SpritesCreated = TRUE;
+ }
+}
+
+#undef sprColumn
+
+static void DestroyFog1Sprites(void)
+{
+ u16 i;
+
+ if (gWeatherPtr->fog1SpritesCreated)
+ {
+ for (i = 0; i < 20; i++)
+ {
+ if (gWeatherPtr->sprites.s2.fog1Sprites[i] != NULL)
+ DestroySprite(gWeatherPtr->sprites.s2.fog1Sprites[i]);
+ }
+ FreeSpriteTilesByTag(0x1201);
+ gWeatherPtr->fog1SpritesCreated = 0;
+ }
+}
+
+//------------------------------------------------------------------------------
+// Volcanic ash
+//------------------------------------------------------------------------------
+
+void Ash_Main(void);
+void LoadAshSpriteSheet(void);
+void CreateAshSprites(void);
+void DestroyAshSprites(void);
+
+void Ash_InitVars(void)
+{
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = FALSE;
+ gWeatherPtr->unknown_6C1 = 0;
+ gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->unknown_6FE = 20;
+ if (!gWeatherPtr->ashSpritesCreated)
+ {
+ Weather_SetBlendCoeffs(0, 16);
+ REG_BLDALPHA = BLDALPHA_BLEND(64, 63); // Those aren't even valid coefficients!
+ }
+}
+
+void Ash_InitAll(void)
+{
+ Ash_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Ash_Main();
+}
+
+void Ash_Main(void)
+{
+ gWeatherPtr->unknown_6FC = gSpriteCoordOffsetX & 0x1FF;
+ while (gWeatherPtr->unknown_6FC > 0xEF)
+ gWeatherPtr->unknown_6FC -= 0xF0;
+ switch (gWeatherPtr->initStep)
+ {
+ case 0:
+ LoadAshSpriteSheet();
+ gWeatherPtr->initStep++;
+ break;
+ case 1:
+ if (!gWeatherPtr->ashSpritesCreated)
+ CreateAshSprites();
+ Weather_SetTargetBlendCoeffs(16, 0, 1);
+ gWeatherPtr->initStep++;
+ break;
+ case 2:
+ if (!Weather_UpdateBlend())
+ break;
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
+ break;
+ default:
+ Weather_UpdateBlend();
+ break;
+ }
+}
+
+bool8 Ash_Finish(void)
+{
+ switch (gWeatherPtr->finishStep)
+ {
+ case 0:
+ Weather_SetTargetBlendCoeffs(0, 16, 1);
+ gWeatherPtr->finishStep++;
+ break;
+ case 1:
+ if (!Weather_UpdateBlend())
+ break;
+ DestroyAshSprites();
+ gWeatherPtr->finishStep++;
+ break;
+ case 2:
+ REG_BLDALPHA = 0;
+ gWeatherPtr->finishStep++;
+ return FALSE;
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static const struct SpriteSheet sAshSpriteSheet = {gWeatherAshTiles, sizeof(gWeatherAshTiles), 0x1202};
+
+void LoadAshSpriteSheet(void)
+{
+ LoadSpriteSheet(&sAshSpriteSheet);
+}
+
+const struct OamData gOamData_839ABB8 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 1,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 15,
+ .affineParam = 0,
+};
+
+const union AnimCmd gSpriteAnim_839ABC0[] =
+{
+ ANIMCMD_FRAME(0, 60),
+ ANIMCMD_FRAME(64, 60),
+ ANIMCMD_JUMP(0),
+};
+
+const union AnimCmd *const gSpriteAnimTable_839ABCC[] =
+{
+ gSpriteAnim_839ABC0,
+};
+
+void sub_807FAA8(struct Sprite *);
+static const struct SpriteTemplate sAshSpriteTemplate =
+{
+ .tileTag = 4610,
+ .paletteTag = 4608,
+ .oam = &gOamData_839ABB8,
+ .anims = gSpriteAnimTable_839ABCC,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_807FAA8,
+};
+
+void CreateAshSprites(void)
+{
+ u8 i;
+
+ if (!gWeatherPtr->ashSpritesCreated)
+ {
+ for (i = 0; i < 20; i++)
+ {
+ u8 spriteId = CreateSpriteAtEnd(&sAshSpriteTemplate, 0, 0, 0x4E);
+
+ if (spriteId != MAX_SPRITES)
+ {
+ struct Sprite *sprite = &gSprites[spriteId];
+
+ sprite->data[1] = 0;
+ sprite->data[2] = (u8)(i % 5);
+ sprite->data[3] = (u8)(i / 5);
+ sprite->data[0] = sprite->data[3] * 64 + 32;
+ gWeatherPtr->sprites.s2.ashSprites[i] = sprite;
+ }
+ else
+ {
+ gWeatherPtr->sprites.s2.ashSprites[i] = NULL;
+ }
+ }
+ gWeatherPtr->ashSpritesCreated = TRUE;
+ }
+}
+
+void DestroyAshSprites(void)
+{
+ u16 i;
+
+ if (gWeatherPtr->ashSpritesCreated)
+ {
+ for (i = 0; i < 20; i++)
+ {
+ if (gWeatherPtr->sprites.s2.ashSprites[i] != NULL)
+ DestroySprite(gWeatherPtr->sprites.s2.ashSprites[i]);
+ }
+ FreeSpriteTilesByTag(0x1202);
+ gWeatherPtr->ashSpritesCreated = FALSE;
+ }
+}
+
+void sub_807FAA8(struct Sprite *sprite)
+{
+ sprite->data[1]++;
+ if (sprite->data[1] > 5)
+ {
+ sprite->data[1] = 0;
+ sprite->data[0]++;
+ }
+ sprite->pos1.y = gSpriteCoordOffsetY + sprite->data[0];
+ sprite->pos1.x = gWeatherPtr->unknown_6FC + 32 + sprite->data[2] * 64;
+ if (sprite->pos1.x > 271)
+ {
+ sprite->pos1.x = gWeatherPtr->unknown_6FC + 0x1E0 - (4 - sprite->data[2]) * 64;
+ sprite->pos1.x &= 0x1FF;
+ }
+}
+
+//------------------------------------------------------------------------------
+// Fog 2
+//------------------------------------------------------------------------------
+
+void Fog2_InitVars(void)
+{
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = 0;
+ gWeatherPtr->unknown_6C1 = 0;
+ gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->unknown_6F0 = 0;
+ gWeatherPtr->unknown_6F2 = 1;
+ if (gWeatherPtr->fog2SpritesCreated == 0)
+ {
+ gWeatherPtr->unknown_71C = 0;
+ gWeatherPtr->unknown_71E = 0;
+ gWeatherPtr->unknown_720 = 0;
+ gWeatherPtr->unknown_722 = 0;
+ gWeatherPtr->unknown_718 = 0;
+ gWeatherPtr->unknown_71A = 0;
+ Weather_SetBlendCoeffs(0, 16);
+ }
+}
+
+void Fog2_Main(void);
+
+void Fog2_InitAll(void)
+{
+ Fog2_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Fog2_Main();
+}
+
+void sub_807FC9C(void);
+void CreateFog2Sprites(void);
+
+void Fog2_Main(void)
+{
+ sub_807FC9C();
+ switch (gWeatherPtr->initStep)
+ {
+ case 0:
+ CreateFog2Sprites();
+ gWeatherPtr->initStep++;
+ break;
+ case 1:
+ Weather_SetTargetBlendCoeffs(12, 8, 8);
+ gWeatherPtr->initStep++;
+ break;
+ case 2:
+ if (!Weather_UpdateBlend())
+ break;
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
+ break;
+ }
+}
+
+void DestroyFog2Sprites(void);
+
+bool8 Fog2_Finish(void)
+{
+ sub_807FC9C();
+ switch (gWeatherPtr->finishStep)
+ {
+ case 0:
+ Weather_SetTargetBlendCoeffs(0, 16, 1);
+ gWeatherPtr->finishStep++;
+ break;
+ case 1:
+ if (!Weather_UpdateBlend())
+ break;
+ gWeatherPtr->finishStep++;
+ break;
+ case 2:
+ DestroyFog2Sprites();
+ gWeatherPtr->finishStep++;
+ break;
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void sub_807FC9C(void)
+{
+ if (++gWeatherPtr->unknown_71C > 2)
+ {
+ gWeatherPtr->unknown_720++;
+ gWeatherPtr->unknown_71C = 0;
+ }
+
+ if (++gWeatherPtr->unknown_71E > 4)
+ {
+ gWeatherPtr->unknown_722++;
+ gWeatherPtr->unknown_71E = 0;
+ }
+
+ gWeatherPtr->unknown_718 = (gSpriteCoordOffsetX - gWeatherPtr->unknown_720) & 0xFF;
+ gWeatherPtr->unknown_71A = gSpriteCoordOffsetY + gWeatherPtr->unknown_722;
+}
+
+extern const struct SpriteTemplate sFog2SpriteTemplate; // defined below
+
+void CreateFog2Sprites(void)
+{
+ u16 i;
+
+ if (!gWeatherPtr->fog2SpritesCreated)
+ {
+ struct SpriteSheet fog2SpriteSheet = {gWeatherFog2Tiles, sizeof(gWeatherFog2Tiles), 0x1203};
+
+ LoadSpriteSheet(&fog2SpriteSheet);
+ for (i = 0; i < 20; i++)
+ {
+ u8 spriteId = CreateSpriteAtEnd(&sFog2SpriteTemplate, 0, (i / 5) * 64, 0xFF);
+
+ if (spriteId != MAX_SPRITES)
+ {
+ struct Sprite *sprite = &gSprites[spriteId];
+
+ sprite->data[0] = i % 5;
+ sprite->data[1] = i / 5;
+ gWeatherPtr->sprites.s2.fog2Sprites[i] = sprite;
+ }
+ else
+ {
+ gWeatherPtr->sprites.s2.fog2Sprites[i] = NULL;
+ }
+ }
+ gWeatherPtr->fog2SpritesCreated = TRUE;
+ }
+}
+
+const struct OamData gOamData_839ABF0 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 1,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const union AnimCmd gSpriteAnim_839ABF8[] =
+{
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_839AC00[] =
+{
+ gSpriteAnim_839ABF8,
+};
+
+void Fog2SpriteCallback(struct Sprite *);
+const struct SpriteTemplate sFog2SpriteTemplate =
+{
+ .tileTag = 4611,
+ .paletteTag = 4608,
+ .oam = &gOamData_839ABF0,
+ .anims = gSpriteAnimTable_839AC00,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = Fog2SpriteCallback,
+};
+
+void DestroyFog2Sprites(void)
+{
+ u16 i;
+
+ if (gWeatherPtr->fog2SpritesCreated)
+ {
+ for (i = 0; i < 20; i++)
+ {
+ if (gWeatherPtr->sprites.s2.fog2Sprites[i] != NULL)
+ DestroySprite(gWeatherPtr->sprites.s2.fog2Sprites[i]);
+ }
+ FreeSpriteTilesByTag(0x1203);
+ gWeatherPtr->fog2SpritesCreated = FALSE;
+ }
+}
+
+void Fog2SpriteCallback(struct Sprite *sprite)
+{
+ sprite->pos2.y = gWeatherPtr->unknown_71A;
+ sprite->pos1.x = gWeatherPtr->unknown_718 + 32 + sprite->data[0] * 64;
+ if (sprite->pos1.x > 271)
+ {
+ sprite->pos1.x = gWeatherPtr->unknown_718 + 0x1E0 - (4 - sprite->data[0]) * 64;
+ sprite->pos1.x &= 0x1FF;
+ }
+}
+
+//------------------------------------------------------------------------------
+// Sandstorm
+//------------------------------------------------------------------------------
+
+void Sandstorm_InitVars(void)
+{
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->weatherGfxLoaded = 0;
+ gWeatherPtr->unknown_6C1 = 0;
+ gWeatherPtr->unknown_6C2 = 20;
+ if (gWeatherPtr->sandstormSprites1Created == 0)
+ {
+ gWeatherPtr->unknown_704 = gWeatherPtr->unknown_708 = 0;
+ gWeatherPtr->unknown_712 = 8;
+ gWeatherPtr->unknown_714 = 0;
+ // Dead code. How does the compiler not optimize this out?
+ if (gWeatherPtr->unknown_712 > 0x5F)
+ gWeatherPtr->unknown_712 = 0x80 - gWeatherPtr->unknown_712;
+ Weather_SetBlendCoeffs(0, 16);
+ }
+}
+
+void Sandstorm_Main(void);
+
+void Sandstorm_InitAll(void)
+{
+ Sandstorm_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Sandstorm_Main();
+}
+
+void sub_808002C(void);
+void sub_8080064(void);
+void CreateSandstormSprites_1(void);
+void CreateSandstormSprites_2(void);
+
+void Sandstorm_Main(void)
+{
+ sub_8080064();
+ sub_808002C();
+ if (gWeatherPtr->unknown_712 > 0x5F)
+ gWeatherPtr->unknown_712 = 32;
+ switch (gWeatherPtr->initStep)
+ {
+ case 0:
+ CreateSandstormSprites_1();
+ CreateSandstormSprites_2();
+ gWeatherPtr->initStep++;
+ break;
+ case 1:
+ Weather_SetTargetBlendCoeffs(16, 0, 0);
+ gWeatherPtr->initStep++;
+ break;
+ case 2:
+ if (!Weather_UpdateBlend())
+ break;
+ gWeatherPtr->weatherGfxLoaded = TRUE;
+ gWeatherPtr->initStep++;
+ break;
+ }
+}
+
+void sub_80800E4(void);
+
+bool8 Sandstorm_Finish(void)
+{
+ sub_8080064();
+ sub_808002C();
+ switch (gWeatherPtr->finishStep)
+ {
+ case 0:
+ Weather_SetTargetBlendCoeffs(0, 16, 0);
+ gWeatherPtr->finishStep++;
+ break;
+ case 1:
+ if (!Weather_UpdateBlend())
+ break;
+ gWeatherPtr->finishStep++;
+ break;
+ case 2:
+ sub_80800E4();
+ gWeatherPtr->finishStep++;
+ break;
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void sub_808002C(void)
+{
+ if (gWeatherPtr->unknown_714++ > 4)
+ {
+ gWeatherPtr->unknown_712++;
+ gWeatherPtr->unknown_714 = 0;
+ }
+}
+
+void sub_8080064(void)
+{
+ gWeatherPtr->unknown_704 -= gSineTable[gWeatherPtr->unknown_712] * 4;
+ gWeatherPtr->unknown_708 -= gSineTable[gWeatherPtr->unknown_712];
+ gWeatherPtr->unknown_70E = (gSpriteCoordOffsetX + (gWeatherPtr->unknown_704 >> 8)) & 0xFF;
+ gWeatherPtr->unknown_710 = gSpriteCoordOffsetY + (gWeatherPtr->unknown_708 >> 8);
+}
+
+void sub_80800E4(void)
+{
+ u16 i;
+
+ if (gWeatherPtr->sandstormSprites1Created)
+ {
+ for (i = 0; i < 20; i++)
+ {
+ if (gWeatherPtr->sprites.s2.sandstormSprites1[i] != NULL)
+ DestroySprite(gWeatherPtr->sprites.s2.sandstormSprites1[i]);
+ }
+ gWeatherPtr->sandstormSprites1Created = FALSE;
+ FreeSpriteTilesByTag(0x1204);
+ }
+
+ if (gWeatherPtr->sandstormSprites2Created)
+ {
+ for (i = 0; i < 5; i++)
+ {
+ if (gWeatherPtr->sprites.s2.sandstormSprites2[i] != NULL)
+ DestroySprite(gWeatherPtr->sprites.s2.sandstormSprites2[i]);
+ }
+ gWeatherPtr->sandstormSprites2Created = FALSE;
+ }
+}
+
+const struct OamData gOamData_839AC1C =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 1,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const union AnimCmd gSpriteAnim_839AC24[] =
+{
+ ANIMCMD_FRAME(0, 3),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_839AC2C[] =
+{
+ ANIMCMD_FRAME(64, 3),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_839AC34[] =
+{
+ gSpriteAnim_839AC24,
+ gSpriteAnim_839AC2C,
+};
+
+void SandstormSpriteCallback1(struct Sprite *);
+const struct SpriteTemplate sSandstormSpriteTemplate =
+{
+ .tileTag = 4612,
+ .paletteTag = 4609,
+ .oam = &gOamData_839AC1C,
+ .anims = gSpriteAnimTable_839AC34,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SandstormSpriteCallback1,
+};
+
+static const struct SpriteSheet sSandstormSpriteSheet = {gWeatherSandstormTiles, sizeof(gWeatherSandstormTiles), 0x1204};
+
+void CreateSandstormSprites_1(void)
+{
+ u16 i;
+
+ if (!gWeatherPtr->sandstormSprites1Created)
+ {
+ LoadSpriteSheet(&sSandstormSpriteSheet);
+ sub_807D8C0(gUnknown_08397128);
+ for (i = 0; i < 20; i++)
+ {
+ u8 spriteId = CreateSpriteAtEnd(&sSandstormSpriteTemplate, 0, (i / 5) * 64, 1);
+
+ if (spriteId != MAX_SPRITES)
+ {
+ gWeatherPtr->sprites.s2.sandstormSprites1[i] = &gSprites[spriteId];
+ gWeatherPtr->sprites.s2.sandstormSprites1[i]->data[0] = i % 5;
+ gWeatherPtr->sprites.s2.sandstormSprites1[i]->data[1] = i / 5;
+ }
+ else
+ {
+ gWeatherPtr->sprites.s2.sandstormSprites1[i] = NULL;
+ }
+ }
+ gWeatherPtr->sandstormSprites1Created = TRUE;
+ }
+}
+
+const u16 gUnknown_0839AC5C[] = {0, 120, 80, 160, 40, 0};
+
+void SandstormSpriteCallback2(struct Sprite *);
+
+void CreateSandstormSprites_2(void)
+{
+ u16 i;
+
+ if (!gWeatherPtr->sandstormSprites2Created)
+ {
+ for (i = 0; i < 5; i++)
+ {
+ u8 spriteId = CreateSpriteAtEnd(&sSandstormSpriteTemplate, i * 48 + 0x18, 0xD0, 1);
+
+ if (spriteId != MAX_SPRITES)
+ {
+ gWeatherPtr->sprites.s2.sandstormSprites2[i] = &gSprites[spriteId];
+ gWeatherPtr->sprites.s2.sandstormSprites2[i]->oam.size = 2;
+ gWeatherPtr->sprites.s2.sandstormSprites2[i]->data[1] = i * 51;
+ gWeatherPtr->sprites.s2.sandstormSprites2[i]->data[0] = 8;
+ gWeatherPtr->sprites.s2.sandstormSprites2[i]->data[2] = 0;
+ gWeatherPtr->sprites.s2.sandstormSprites2[i]->data[4] = 0x6730;
+ gWeatherPtr->sprites.s2.sandstormSprites2[i]->data[3] = gUnknown_0839AC5C[i];
+ StartSpriteAnim(gWeatherPtr->sprites.s2.sandstormSprites2[i], 1);
+ CalcCenterToCornerVec(gWeatherPtr->sprites.s2.sandstormSprites2[i], 0, 2, 0);
+ gWeatherPtr->sprites.s2.sandstormSprites2[i]->callback = SandstormSpriteCallback2;
+ }
+ else
+ {
+ gWeatherPtr->sprites.s2.sandstormSprites2[i] = NULL;
+ }
+ gWeatherPtr->sandstormSprites2Created = TRUE;
+ }
+ }
+}
+
+void SandstormSpriteCallback1(struct Sprite *sprite)
+{
+ sprite->pos2.y = gWeatherPtr->unknown_710;
+ sprite->pos1.x = gWeatherPtr->unknown_70E + 32 + sprite->data[0] * 64;
+ if (sprite->pos1.x > 271)
+ {
+ sprite->pos1.x = gWeatherPtr->unknown_70E + 0x1E0 - (4 - sprite->data[0]) * 64;
+ sprite->pos1.x &= 0x1FF;
+ }
+}
+
+void SandstormSpriteCallback3(struct Sprite *);
+
+void SandstormSpriteCallback2(struct Sprite *sprite)
+{
+ if (--sprite->data[3] == -1)
+ sprite->callback = SandstormSpriteCallback3;
+}
+
+void SandstormSpriteCallback3(struct Sprite *sprite)
+{
+ u32 x;
+ u32 y;
+
+ if (--sprite->pos1.y < -48)
+ {
+ sprite->pos1.y = 208;
+ sprite->data[0] = 4;
+ }
+ x = sprite->data[0] * gSineTable[sprite->data[1]];
+ y = sprite->data[0] * gSineTable[sprite->data[1] + 64];
+ sprite->pos2.x = x >> 8;
+ sprite->pos2.y = y >> 8;
+ sprite->data[1] = (sprite->data[1] + 10) & 0xFF;
+ if (++sprite->data[2] > 8)
+ {
+ sprite->data[2] = 0;
+ sprite->data[0]++;
+ }
+}
+
+//------------------------------------------------------------------------------
+// Weather 11
+//------------------------------------------------------------------------------
+
+void Weather11_InitVars(void)
+{
+ gWeatherPtr->initStep = 0;
+ gWeatherPtr->unknown_6C1 = 3;
+ gWeatherPtr->unknown_6C2 = 20;
+}
+
+void Weather11_InitAll(void)
+{
+ Weather11_InitVars();
+}
+
+void Weather11_Main(void)
+{
+}
+
+bool8 Weather11_Finish(void)
+{
+ return FALSE;
+}
+
+//------------------------------------------------------------------------------
+// Weather 14
+//------------------------------------------------------------------------------
+
+const u8 gUnknown_0839AC68[] = {40, 90, 60, 90, 2, 60, 40, 30};
+
+const struct SpriteSheet gWeatherBubbleSpriteSheet = {gWeatherBubbleTiles, sizeof(gWeatherBubbleTiles), 0x1205};
+
+void Bubbles_InitVars(void)
+{
+ Fog1_InitVars();
+ if (gWeatherPtr->unknown_72E == 0)
+ {
+ LoadSpriteSheet(&gWeatherBubbleSpriteSheet);
+ gWeatherPtr->unknown_728 = 0;
+ gWeatherPtr->unknown_726 = gUnknown_0839AC68[0];
+ gWeatherPtr->unknown_72A = 0;
+ gWeatherPtr->unknown_72C = 0;
+ }
+}
+
+void Bubbles_Main(void);
+
+void Bubbles_InitAll(void)
+{
+ Bubbles_InitVars();
+ while (gWeatherPtr->weatherGfxLoaded == FALSE)
+ Bubbles_Main();
+}
+
+void sub_8080588(u16);
+
+void Bubbles_Main(void)
+{
+ Fog1_Main();
+ if (++gWeatherPtr->unknown_726 > gUnknown_0839AC68[gWeatherPtr->unknown_728])
+ {
+ gWeatherPtr->unknown_726 = 0;
+ if (++gWeatherPtr->unknown_728 > 7)
+ gWeatherPtr->unknown_728 = 0;
+ sub_8080588(gWeatherPtr->unknown_72A);
+ if (++gWeatherPtr->unknown_72A > 12)
+ gWeatherPtr->unknown_72A = 0;
+ }
+}
+
+void sub_8080610(void);
+
+bool8 Bubbles_Finish(void)
+{
+ if (!Fog1_Finish())
+ {
+ sub_8080610();
+ return FALSE;
+ }
+ return TRUE;
+}
+
+const s16 gUnknown_0839AC78[][2] =
+{
+ {120, 160},
+ {376, 160},
+ { 40, 140},
+ {296, 140},
+ {180, 130},
+ {436, 130},
+ { 60, 160},
+ {436, 160},
+ {220, 180},
+ {476, 180},
+ { 10, 90},
+ {266, 90},
+ {256, 160},
+};
+
+const union AnimCmd gSpriteAnim_839ACAC[] =
+{
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_FRAME(1, 16),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_839ACB8[] =
+{
+ gSpriteAnim_839ACAC,
+};
+
+extern const struct OamData gOamData_837DF24;
+
+void unc_0807DAB4(struct Sprite *);
+const struct SpriteTemplate gSpriteTemplate_839ACBC =
+{
+ .tileTag = 4613,
+ .paletteTag = 4608,
+ .oam = &gOamData_837DF24,
+ .anims = gSpriteAnimTable_839ACB8,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = unc_0807DAB4,
+};
+
+void sub_8080588(u16 a)
+{
+ s16 x = gUnknown_0839AC78[a][0];
+ s16 y = gUnknown_0839AC78[a][1] - gSpriteCoordOffsetY;
+ u8 spriteId = CreateSpriteAtEnd(
+ &gSpriteTemplate_839ACBC,
+ x,
+ y,
+ 0);
+
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].oam.priority = 1;
+ gSprites[spriteId].coordOffsetEnabled = TRUE;
+ gSprites[spriteId].data[0] = 0;
+ gSprites[spriteId].data[1] = 0;
+ gSprites[spriteId].data[2] = 0;
+ gWeatherPtr->unknown_72C++;
+ }
+}
+
+void sub_8080610(void)
+{
+ u16 i;
+
+ for (i = 0; i < 64; i++)
+ {
+ if (gSprites[i].template == &gSpriteTemplate_839ACBC)
+ DestroySprite(&gSprites[i]);
+ }
+ FreeSpriteTilesByTag(0x1205);
+}
+
+void unc_0807DAB4(struct Sprite *sprite)
+{
+ ++sprite->data[0];
+ if (++sprite->data[0] > 8) // double increment
+ {
+ sprite->data[0] = 0;
+ if (sprite->data[1] == 0)
+ {
+ if (++sprite->pos2.x > 4)
+ sprite->data[1] = 1;
+ }
+ else
+ {
+ if (--sprite->pos2.x <= 0)
+ sprite->data[1] = 0;
+ }
+ }
+ sprite->pos1.y -= 3;
+ if (++sprite->data[2] > 0x77)
+ DestroySprite(sprite);
+}
+
+//------------------------------------------------------------------------------
+
+u8 TranslateWeatherNum(u8);
+void UpdateRainCounter(u8, u8);
+
+void SetSav1Weather(u32 weather)
+{
+ u8 oldWeather = gSaveBlock1.weather;
+
+ gSaveBlock1.weather = TranslateWeatherNum(weather);
+ UpdateRainCounter(gSaveBlock1.weather, oldWeather);
+}
+
+u8 GetSav1Weather(void)
+{
+ return gSaveBlock1.weather;
+}
+
+void SetSav1WeatherFromCurrMapHeader(void)
+{
+ u8 oldWeather = gSaveBlock1.weather;
+
+ gSaveBlock1.weather = TranslateWeatherNum(gMapHeader.weather);
+ UpdateRainCounter(gSaveBlock1.weather, oldWeather);
+}
+
+void SetWeather(u32 weather)
+{
+ SetSav1Weather(weather);
+ DoWeatherEffect(GetSav1Weather());
+}
+
+void SetWeather_Unused(u32 weather)
+{
+ SetSav1Weather(weather);
+ sub_807C988(GetSav1Weather());
+}
+
+void DoCurrentWeather(void)
+{
+ DoWeatherEffect(GetSav1Weather());
+}
+
+void sub_8080750(void)
+{
+ sub_807C988(GetSav1Weather());
+}
+
+static const u8 sWeatherCycle1[] = {2, 3, 5, 3};
+static const u8 sWeatherCycle2[] = {2, 2, 3, 2};
+
+u8 TranslateWeatherNum(u8 weather)
+{
+ switch (weather)
+ {
+ case 0: return 0;
+ case 1: return 1;
+ case 2: return 2;
+ case 3: return 3;
+ case 4: return 4;
+ case 5: return 5;
+ case 6: return 6;
+ case 7: return 7;
+ case 8: return 8;
+ case 9: return 9;
+ case 10: return 10;
+ case 11: return 11;
+ case 12: return 12;
+ case 13: return 13;
+ case 14: return 14;
+ case 20: return sWeatherCycle1[gSaveBlock1.filler_2F];
+ case 21: return sWeatherCycle2[gSaveBlock1.filler_2F];
+ default: return 0;
+ }
+}
+
+void UpdateWeatherPerDay(u16 increment)
+{
+ u16 weatherStage = gSaveBlock1.filler_2F + increment;
+ weatherStage %= 4;
+ gSaveBlock1.filler_2F = weatherStage;
+}
+
+void UpdateRainCounter(u8 newWeather, u8 oldWeather)
+{
+ if (newWeather != oldWeather
+ && (newWeather == WEATHER_RAIN_LIGHT || newWeather == WEATHER_RAIN_MED))
+ IncrementGameStat(0x28);
+}
diff --git a/src/fieldmap.c b/src/field/fieldmap.c
index 0e0ec246c..7a31ae720 100644
--- a/src/fieldmap.c
+++ b/src/field/fieldmap.c
@@ -1,7 +1,7 @@
#include "global.h"
#include "fieldmap.h"
#include "palette.h"
-#include "rom4.h"
+#include "overworld.h"
#include "script.h"
#include "secret_base.h"
#include "tv.h"
@@ -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;
@@ -31,7 +31,7 @@ static const struct ConnectionFlags sDummyConnectionFlags = {0};
struct MapHeader *mapconnection_get_mapheader(struct MapConnection *connection)
{
- return get_mapheader_by_bank_and_number(connection->mapGroup, connection->mapNum);
+ return Overworld_GetMapHeaderByGroupAndId(connection->mapGroup, connection->mapNum);
}
void not_trainer_hill_battle_pyramid(void)
@@ -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/field/fldeff_berrytree.c b/src/field/fldeff_berrytree.c
new file mode 100644
index 000000000..0763c0314
--- /dev/null
+++ b/src/field/fldeff_berrytree.c
@@ -0,0 +1,56 @@
+#include "global.h"
+#include "field_map_obj.h"
+#include "field_player_avatar.h"
+#include "script.h"
+
+static void Task_WateringBerryTreeAnim_0(u8);
+static void Task_WateringBerryTreeAnim_1(u8);
+static void Task_WateringBerryTreeAnim_2(u8);
+static void Task_WateringBerryTreeAnim_3(u8);
+
+static void Task_WateringBerryTreeAnim_0(u8 taskId)
+{
+ gTasks[taskId].func = Task_WateringBerryTreeAnim_1;
+}
+
+static void Task_WateringBerryTreeAnim_1(u8 taskId)
+{
+ struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId];
+ if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject)
+ || FieldObjectClearAnimIfSpecialAnimFinished(mapObject))
+ {
+ sub_8059D08(player_get_direction_lower_nybble());
+ FieldObjectSetSpecialAnim(mapObject, GetStepInPlaceDelay16AnimId(player_get_direction_lower_nybble()));
+ gTasks[taskId].func = Task_WateringBerryTreeAnim_2;
+ }
+}
+
+static void Task_WateringBerryTreeAnim_2(u8 taskId)
+{
+ struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId];
+ if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject))
+ {
+ s16 value = gTasks[taskId].data[1]++;
+
+ if (value < 10)
+ {
+ FieldObjectSetSpecialAnim(mapObject, GetStepInPlaceDelay16AnimId(player_get_direction_lower_nybble()));
+ }
+ else
+ {
+ gTasks[taskId].func = Task_WateringBerryTreeAnim_3;
+ }
+ }
+}
+
+static void Task_WateringBerryTreeAnim_3(u8 taskId)
+{
+ SetPlayerAvatarTransitionFlags(sub_80597D0());
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+}
+
+void DoWateringBerryTreeAnim(void)
+{
+ CreateTask(Task_WateringBerryTreeAnim_0, 80);
+}
diff --git a/src/fldeff_cut.c b/src/field/fldeff_cut.c
index b394d1e4c..e4328acfc 100644
--- a/src/fldeff_cut.c
+++ b/src/field/fldeff_cut.c
@@ -2,33 +2,75 @@
#include "fldeff_cut.h"
#include "field_camera.h"
#include "field_effect.h"
+#include "field_map_obj.h"
#include "field_player_avatar.h"
#include "fieldmap.h"
#include "map_obj_lock.h"
#include "metatile_behavior.h"
#include "metatile_behaviors.h"
#include "pokemon_menu.h"
-#include "rom4.h"
+#include "overworld.h"
#include "rom6.h"
#include "script.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "sprite.h"
#include "task.h"
#include "trig.h"
-
-extern u8 gCutGrassSpriteArray[8]; // seems to be an array of 8 sprite IDs
+#include "ewram.h"
extern void (*gFieldCallback)(void);
extern void (*gUnknown_03005CE4)(void);
+extern u8 gLastFieldPokeMenuOpened;
-extern struct SpriteTemplate gSpriteTemplate_CutGrass;
+extern const u8 S_UseCut[];
-extern struct MapPosition gUnknown_0203923C;
+const struct OamData gOamData_CutGrass =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 0,
+ .tileNum = 1,
+ .priority = 1,
+ .paletteNum = 1,
+ .affineParam = 0,
+};
+
+const union AnimCmd gSpriteAnim_CutGrass[] =
+{
+ ANIMCMD_FRAME(0, 30),
+ ANIMCMD_JUMP(0),
+};
-extern u8 gLastFieldPokeMenuOpened;
+const union AnimCmd *const gSpriteAnimTable_CutGrass[] =
+{
+ gSpriteAnim_CutGrass,
+};
-extern u8 UseCutScript;
+const struct SpriteFrameImage gSpriteImageTable_CutGrass[] =
+{
+ {gFieldEffectPic_CutGrass, 0x20},
+};
+
+const struct SpritePalette gFieldEffectObjectPaletteInfo6 = {gFieldEffectObjectPalette6, 0x1000};
+
+static void sub_80A2A48(struct Sprite *);
+static const struct SpriteTemplate gSpriteTemplate_CutGrass =
+{
+ .tileTag = 0xFFFF,
+ .paletteTag = 0x1000,
+ .oam = &gOamData_CutGrass,
+ .anims = gSpriteAnimTable_CutGrass,
+ .images = gSpriteImageTable_CutGrass,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80A2A48,
+};
bool8 SetUpFieldMove_Cut(void)
{
@@ -38,7 +80,7 @@ bool8 SetUpFieldMove_Cut(void)
if(npc_before_player_of_type(0x52) == TRUE) // is in front of tree?
{
- gFieldCallback = sub_808AB90;
+ gFieldCallback = FieldCallback_Teleport;
gUnknown_03005CE4 = sub_80A2634;
return TRUE;
}
@@ -57,7 +99,7 @@ bool8 SetUpFieldMove_Cut(void)
if(MetatileBehavior_IsPokeGrass(tileBehavior) == TRUE
|| MetatileBehavior_IsAshGrass(tileBehavior) == TRUE)
{
- gFieldCallback = sub_808AB90;
+ gFieldCallback = FieldCallback_Teleport;
gUnknown_03005CE4 = sub_80A25E8;
return TRUE;
}
@@ -70,8 +112,8 @@ bool8 SetUpFieldMove_Cut(void)
void sub_80A25E8(void)
{
- FieldEffectStart(1);
- gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened;
+ FieldEffectStart(FLDEFF_USE_CUT_ON_GRASS);
+ gFieldEffectArguments[0] = gLastFieldPokeMenuOpened;
}
bool8 FldEff_UseCutOnGrass(void)
@@ -86,8 +128,8 @@ bool8 FldEff_UseCutOnGrass(void)
void sub_80A2634(void)
{
- gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened;
- ScriptContext1_SetupScript(&UseCutScript);
+ gFieldEffectArguments[0] = gLastFieldPokeMenuOpened;
+ ScriptContext1_SetupScript(S_UseCut);
}
bool8 FldEff_UseCutOnTree(void)
@@ -102,8 +144,8 @@ bool8 FldEff_UseCutOnTree(void)
void sub_80A2684(void)
{
- FieldEffectActiveListRemove(1);
- FieldEffectStart(0x3A);
+ FieldEffectActiveListRemove(FLDEFF_USE_CUT_ON_GRASS);
+ FieldEffectStart(FLDEFF_CUT_GRASS);
}
bool8 FldEff_CutGrass(void)
@@ -135,9 +177,9 @@ bool8 FldEff_CutGrass(void)
// populate sprite ID array
for(i = 0; i < 8; i++)
{
- gCutGrassSpriteArray[i] = CreateSprite((struct SpriteTemplate *)&gSpriteTemplate_CutGrass,
+ eCutGrassSpriteArray[i] = CreateSprite((struct SpriteTemplate *)&gSpriteTemplate_CutGrass,
gSprites[gPlayerAvatar.spriteId].oam.x + 8, gSprites[gPlayerAvatar.spriteId].oam.y + 20, 0);
- gSprites[gCutGrassSpriteArray[i]].data2 = 32 * i;
+ gSprites[eCutGrassSpriteArray[i]].data[2] = 32 * i;
}
return 0;
}
@@ -241,11 +283,11 @@ void sub_80A28F4(s16 x, s16 y)
}
}
-void sub_80A2A48(struct Sprite *sprite)
+static void sub_80A2A48(struct Sprite *sprite)
{
- sprite->data0 = 8;
- sprite->data1 = 0;
- sprite->data3 = 0;
+ sprite->data[0] = 8;
+ sprite->data[1] = 0;
+ sprite->data[3] = 0;
sprite->callback = (void *)objc_8097BBC;
}
@@ -254,16 +296,16 @@ void objc_8097BBC(struct Sprite *sprite)
u16 tempdata;
u16 tempdata2;
- sprite->pos2.x = Sin(sprite->data2, sprite->data0);
- sprite->pos2.y = Cos(sprite->data2, sprite->data0);
+ sprite->pos2.x = Sin(sprite->data[2], sprite->data[0]);
+ sprite->pos2.y = Cos(sprite->data[2], sprite->data[0]);
- sprite->data2 = (sprite->data2 + 8) & 0xFF;
- sprite->data0 += ((tempdata2 = sprite->data3) << 16 >> 18) + 1; // what?
- sprite->data3 = tempdata2 + 1;
+ sprite->data[2] = (sprite->data[2] + 8) & 0xFF;
+ sprite->data[0] += ((tempdata2 = sprite->data[3]) << 16 >> 18) + 1; // what?
+ sprite->data[3] = tempdata2 + 1;
- tempdata = sprite->data1;
+ tempdata = sprite->data[1];
if((s16)tempdata != 28) // done rotating the grass, execute clean up function
- sprite->data1++;
+ sprite->data[1]++;
else
sprite->callback = (void *)sub_80A2AB8;
}
@@ -272,19 +314,16 @@ void sub_80A2AB8(void)
{
u8 i;
- for(i = 1; i < 8; i++)
- {
- DestroySprite(&gSprites[gCutGrassSpriteArray[i]]);
- }
-
- FieldEffectStop(&gSprites[gCutGrassSpriteArray[0]], 0x3A);
+ for (i = 1; i < 8; i++)
+ DestroySprite(&gSprites[eCutGrassSpriteArray[i]]);
+ FieldEffectStop(&gSprites[eCutGrassSpriteArray[0]], FLDEFF_CUT_GRASS);
sub_8064E2C();
ScriptContext2_Disable();
}
void sub_80A2B00(void)
{
- PlaySE(0x80);
- FieldEffectActiveListRemove(2);
+ PlaySE(SE_W015);
+ FieldEffectActiveListRemove(FLDEFF_USE_CUT_ON_TREE);
EnableBothScriptContexts();
}
diff --git a/src/field/fldeff_decoration.c b/src/field/fldeff_decoration.c
new file mode 100644
index 000000000..37f024b9f
--- /dev/null
+++ b/src/field/fldeff_decoration.c
@@ -0,0 +1,364 @@
+#include "global.h"
+#include "event_data.h"
+#include "field_camera.h"
+#include "field_effect.h"
+#include "field_map_obj.h"
+#include "field_player_avatar.h"
+#include "fieldmap.h"
+#include "script.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "string_util.h"
+#include "strings.h"
+#include "task.h"
+#include "text.h"
+
+extern const u8 gSpriteImage_83D21EC[];
+extern const u8 gSpriteImage_83D22EC[];
+extern const u8 gSpriteImage_83D23EC[];
+extern const u16 gTilesetPalettes_SecretBase[][16];
+
+const struct OamData gOamData_83D266C =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 2,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const union AnimCmd gSpriteAnim_83D2674[] =
+{
+ ANIMCMD_FRAME(0, 6),
+ ANIMCMD_FRAME(1, 6),
+ ANIMCMD_FRAME(2, 6),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_83D2684[] =
+{
+ gSpriteAnim_83D2674,
+};
+
+const struct SpriteFrameImage gSpriteImageTable_83D2688[] =
+{
+ {gSpriteImage_83D21EC, 0x100},
+ {gSpriteImage_83D22EC, 0x100},
+ {gSpriteImage_83D23EC, 0x100},
+};
+
+void SpriteCB_SandPillar_0(struct Sprite *);
+void SpriteCB_SandPillar_1(struct Sprite *);
+void SpriteCB_SandPillar_2(struct Sprite *);
+const struct SpriteTemplate gSpriteTemplate_83D26A0 =
+{
+ .tileTag = 0xFFFF,
+ .paletteTag = 4110,
+ .oam = &gOamData_83D266C,
+ .anims = gSpriteAnimTable_83D2684,
+ .images = gSpriteImageTable_83D2688,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCB_SandPillar_0,
+};
+
+// This uses one of the secret base palettes, so there is no "09.pal" file.
+const struct SpritePalette gFieldEffectObjectPaletteInfo9 = {gTilesetPalettes_SecretBase[5], 0x100E};
+
+extern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[36];
+
+static void sub_80C68EC(u8);
+static void DoBalloonSoundEffect(s16);
+
+void sub_80C68A4(s16 metatileId, s16 x, s16 y)
+{
+ u8 taskId = CreateTask(sub_80C68EC, 0);
+
+ gTasks[taskId].data[0] = metatileId;
+ gTasks[taskId].data[1] = x;
+ gTasks[taskId].data[2] = y;
+ gTasks[taskId].data[3] = 0;
+ gTasks[taskId].data[4] = 1;
+}
+
+static void sub_80C68EC(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ if (data[3] == 6)
+ data[3] = 0;
+ else
+ data[3]++;
+
+ if (data[3] == 0)
+ {
+ if (data[4] == 2)
+ DoBalloonSoundEffect(data[0]);
+ MapGridSetMetatileIdAt(data[1], data[2], data[0] + data[4]);
+ CurrentMapDrawMetatileAt(data[1], data[2]);
+ if (data[4] == 3)
+ DestroyTask(taskId);
+ else
+ data[4]++;
+ }
+}
+
+static void DoBalloonSoundEffect(s16 metatileId)
+{
+ switch (metatileId)
+ {
+ case 824:
+ PlaySE(SE_FUUSEN1);
+ break;
+ case 828:
+ PlaySE(SE_FUUSEN2);
+ break;
+ case 832:
+ PlaySE(SE_FUUSEN3);
+ break;
+ case 552:
+ PlaySE(SE_TOY_DANGO);
+ break;
+ }
+}
+
+bool8 FldEff_Nop47(void)
+{
+ return FALSE;
+}
+
+bool8 FldEff_Nop48(void)
+{
+ return FALSE;
+}
+
+static void sub_80C69C4(s16 x, s16 y)
+{
+ PlaySE(SE_TOY_KABE);
+ MapGridSetMetatileIdAt(x, y, 630);
+ MapGridSetMetatileIdAt(x, y - 1, 622);
+ CurrentMapDrawMetatileAt(x, y);
+ CurrentMapDrawMetatileAt(x, y - 1);
+}
+
+static void sub_80C6A14(u8 taskId)
+{
+ if (gTasks[taskId].data[0] == 7)
+ {
+ sub_80C69C4(gTasks[taskId].data[1], gTasks[taskId].data[2]);
+ DestroyTask(taskId);
+ }
+ else
+ {
+ gTasks[taskId].data[0]++;
+ }
+}
+
+void sub_80C6A54(s16 x, s16 y)
+{
+ u8 dir = player_get_direction_lower_nybble();
+ if (dir == DIR_SOUTH)
+ {
+ sub_80C69C4(x, y);
+ }
+ else if (dir == DIR_NORTH)
+ {
+ u8 taskId = CreateTask(sub_80C6A14, 5);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = x;
+ gTasks[taskId].data[2] = y;
+ }
+}
+
+static void Task_DecorationSoundEffect(u8 taskId)
+{
+ if (gTasks[taskId].data[1] == 7)
+ {
+ switch (gTasks[taskId].data[0])
+ {
+ case 632:
+ PlaySE(SE_TOY_C);
+ break;
+ case 633:
+ PlaySE(SE_TOY_D);
+ break;
+ case 634:
+ PlaySE(SE_TOY_E);
+ break;
+ case 635:
+ PlaySE(SE_TOY_F);
+ break;
+ case 636:
+ PlaySE(SE_TOY_G);
+ break;
+ case 637:
+ PlaySE(SE_TOY_A);
+ break;
+ case 638:
+ PlaySE(SE_TOY_B);
+ break;
+ case 691:
+ PlaySE(SE_TOY_C1);
+ break;
+ }
+
+ DestroyTask(taskId);
+ }
+ else
+ {
+ gTasks[taskId].data[1]++;
+ }
+}
+
+void DoDecorationSoundEffect(s16 arg)
+{
+ u8 taskId = CreateTask(Task_DecorationSoundEffect, 5);
+ gTasks[taskId].data[0] = arg;
+ gTasks[taskId].data[1] = 0;
+}
+
+void SpriteCB_YellowCave4Sparkle(struct Sprite *sprite)
+{
+ sprite->data[0]++;
+ if (sprite->data[0] == 8)
+ PlaySE(SE_W215);
+ if (sprite->data[0] >= 32)
+ DestroySprite(sprite);
+}
+
+void DoYellowCave4Sparkle(void)
+{
+ s16 x = gMapObjects[gPlayerAvatar.mapObjectId].coords2.x;
+ s16 y = gMapObjects[gPlayerAvatar.mapObjectId].coords2.y;
+ u8 spriteId;
+
+ sub_8060470(&x, &y, 8, 4);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[22], x, y, 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].coordOffsetEnabled = TRUE;
+ gSprites[spriteId].oam.priority = 1;
+ gSprites[spriteId].oam.paletteNum = 5;
+ gSprites[spriteId].callback = SpriteCB_YellowCave4Sparkle;
+ gSprites[spriteId].data[0] = 0;
+ }
+}
+
+bool8 FldEff_SandPillar(void)
+{
+ s16 x, y;
+
+ ScriptContext2_Enable();
+ GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
+ gFieldEffectArguments[5] = x;
+ gFieldEffectArguments[6] = y;
+
+ switch (player_get_direction_lower_nybble())
+ {
+ case DIR_SOUTH:
+ CreateSprite(
+ &gSpriteTemplate_83D26A0,
+ gSprites[gPlayerAvatar.spriteId].oam.x + 8,
+ gSprites[gPlayerAvatar.spriteId].oam.y + 32,
+ 0);
+ break;
+ case DIR_NORTH:
+ CreateSprite(
+ &gSpriteTemplate_83D26A0,
+ gSprites[gPlayerAvatar.spriteId].oam.x + 8,
+ gSprites[gPlayerAvatar.spriteId].oam.y,
+ 148);
+ break;
+ case DIR_WEST:
+ CreateSprite(
+ &gSpriteTemplate_83D26A0,
+ gSprites[gPlayerAvatar.spriteId].oam.x - 8,
+ gSprites[gPlayerAvatar.spriteId].oam.y + 16,
+ 148);
+ break;
+ case DIR_EAST:
+ CreateSprite(
+ &gSpriteTemplate_83D26A0,
+ gSprites[gPlayerAvatar.spriteId].oam.x + 24,
+ gSprites[gPlayerAvatar.spriteId].oam.y + 16,
+ 148);
+ break;
+ }
+
+ return FALSE;
+}
+
+void SpriteCB_SandPillar_0(struct Sprite *sprite)
+{
+ PlaySE(SE_W088);
+ if (MapGridGetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1) == 646)
+ MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1, 3586);
+ else
+ MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1, 644);
+ MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6], 522);
+ CurrentMapDrawMetatileAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1);
+ CurrentMapDrawMetatileAt(gFieldEffectArguments[5], gFieldEffectArguments[6]);
+ sprite->data[0] = 0;
+ sprite->callback = SpriteCB_SandPillar_1;
+}
+
+void SpriteCB_SandPillar_1(struct Sprite *sprite)
+{
+ if (sprite->data[0] < 18)
+ {
+ sprite->data[0]++;
+ }
+ else
+ {
+ MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6], 3724);
+ CurrentMapDrawMetatileAt(gFieldEffectArguments[5], gFieldEffectArguments[6]);
+ sprite->data[0] = 0;
+ sprite->callback = SpriteCB_SandPillar_2;
+ }
+}
+
+void SpriteCB_SandPillar_2(struct Sprite *sprite)
+{
+ FieldEffectStop(sprite, FLDEFF_SAND_PILLAR);
+ EnableBothScriptContexts();
+}
+
+void GetShieldToyTVDecorationInfo(void)
+{
+ s16 x, y;
+ s32 metatileId;
+
+ GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
+
+ metatileId = MapGridGetMetatileIdAt(x, y);
+
+ switch (metatileId)
+ {
+ case 822:
+ ConvertIntToDecimalStringN(gStringVar1, 100, STR_CONV_MODE_LEFT_ALIGN, 3);
+ StringCopy(gStringVar2, gSecretBaseText_GoldRank);
+ gSpecialVar_Result = 0;
+ break;
+ case 734:
+ ConvertIntToDecimalStringN(gStringVar1, 50, STR_CONV_MODE_LEFT_ALIGN, 2);
+ StringCopy(gStringVar2, gSecretBaseText_SilverRank);
+ gSpecialVar_Result = 0;
+ break;
+ case 756:
+ gSpecialVar_Result = 1;
+ break;
+ case 757:
+ gSpecialVar_Result = 2;
+ break;
+ case 758:
+ gSpecialVar_Result = 3;
+ break;
+ }
+}
diff --git a/src/fldeff_flash.c b/src/field/fldeff_flash.c
index 6c2633567..22f170184 100644
--- a/src/fldeff_flash.c
+++ b/src/field/fldeff_flash.c
@@ -4,10 +4,10 @@
#include "main.h"
#include "palette.h"
#include "pokemon_menu.h"
-#include "rom4.h"
+#include "overworld.h"
#include "rom6.h"
#include "script.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "sprite.h"
#include "task.h"
@@ -21,14 +21,6 @@ struct FlashStruct
void (*func)(void);
};
-extern struct FlashStruct gUnknown_083F7FC4[];
-extern u16 gCaveTransitionPalette_White[];
-extern u16 gCaveTransitionPalette_Black[];
-extern u16 gUnknown_083F808C[];
-extern u16 gUnknown_083F809C[];
-extern u16 gCaveTransitionTilemap[];
-extern u8 gCaveTransitionTiles[];
-
extern u8 gLastFieldPokeMenuOpened;
extern void (*gUnknown_03005CE4)(void);
@@ -46,12 +38,44 @@ void sub_810D00C(u8);
void sub_810D028(u8);
void sub_810D0C4(u8);
void sub_810D128(u8);
+void sub_810CFF8(void);
+void sub_810CE48(void);
+
+static const struct FlashStruct gUnknown_083F7FC4[] =
+{
+ {1, 4, 1, 0, sub_810CFF8},
+ {2, 4, 1, 0, sub_810CFF8},
+ {3, 4, 1, 0, sub_810CFF8},
+ {5, 4, 1, 0, sub_810CFF8},
+ {6, 4, 1, 0, sub_810CFF8},
+ {7, 4, 1, 0, sub_810CFF8},
+ {8, 4, 1, 0, sub_810CFF8},
+ {9, 4, 1, 0, sub_810CFF8},
+ {4, 1, 0, 1, sub_810CE48},
+ {4, 2, 0, 1, sub_810CE48},
+ {4, 3, 0, 1, sub_810CE48},
+ {4, 5, 0, 1, sub_810CE48},
+ {4, 6, 0, 1, sub_810CE48},
+ {4, 7, 0, 1, sub_810CE48},
+ {4, 8, 0, 1, sub_810CE48},
+ {4, 9, 0, 1, sub_810CE48},
+ {0, 0, 0, 0, NULL},
+};
+
+// TODO: Make these extracted palettes?
+static const u16 gCaveTransitionPalette_White[] = {0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF};
+static const u16 gCaveTransitionPalette_Black[] = {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000};
+
+static const u16 gUnknown_083F808C[] = INCBIN_U16("graphics/misc/83F808C.gbapal");
+static const u16 gUnknown_083F809C[] = INCBIN_U16("graphics/misc/83F809C.gbapal");
+static const u16 gCaveTransitionTilemap[] = INCBIN_U16("graphics/misc/cave_transition_map.bin.lz");
+static const u8 gCaveTransitionTiles[] = INCBIN_U8("graphics/misc/cave_transition.4bpp.lz");
bool8 SetUpFieldMove_Flash(void)
{
- if (gMapHeader.cave == TRUE && !FlagGet(SYS_USE_FLASH))
+ if (gMapHeader.cave == TRUE && !FlagGet(FLAG_SYS_USE_FLASH))
{
- gFieldCallback = sub_808AB90;
+ gFieldCallback = FieldCallback_Teleport;
gUnknown_03005CE4 = sub_810CBFC;
return TRUE;
}
@@ -62,7 +86,7 @@ bool8 SetUpFieldMove_Flash(void)
void sub_810CBFC(void)
{
u8 taskId = oei_task_add();
- gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened;
+ gFieldEffectArguments[0] = gLastFieldPokeMenuOpened;
gTasks[taskId].data[8] = (uintptr_t)sub_810CC34 >> 16;
gTasks[taskId].data[9] = (uintptr_t)sub_810CC34;
}
@@ -70,7 +94,7 @@ void sub_810CBFC(void)
void sub_810CC34(void)
{
PlaySE(SE_W115);
- FlagSet(SYS_USE_FLASH);
+ FlagSet(FLAG_SYS_USE_FLASH);
ScriptContext1_SetupScript(gUnknown_081B694A);
}
@@ -123,8 +147,8 @@ void sub_810CC80(void)
bool8 sub_810CD5C(void)
{
u8 i;
- u8 v0 = get_map_light_from_warp0();
- u8 v1 = sav1_map_get_light_level();
+ u8 v0 = get_map_type_from_warp0();
+ u8 v1 = Overworld_GetMapTypeOfSaveblockLocation();
for (i = 0; gUnknown_083F7FC4[i].unk0; i++)
{
diff --git a/src/field/fldeff_poison.c b/src/field/fldeff_poison.c
new file mode 100644
index 000000000..b0052d59d
--- /dev/null
+++ b/src/field/fldeff_poison.c
@@ -0,0 +1,44 @@
+#include "global.h"
+#include "fldeff_poison.h"
+#include "task.h"
+#include "constants/songs.h"
+#include "sound.h"
+
+static void Task_FieldPoisonEffect(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ case 0:
+ data[1] += 2;
+ if (data[1] > 8)
+ {
+ data[0]++;
+ }
+ break;
+ case 1:
+ data[1] -= 2;
+ if (data[1] == 0)
+ {
+ data[0]++;
+ }
+ break;
+ case 2:
+ DestroyTask(taskId);
+ return;
+ }
+
+ REG_MOSAIC = (data[1] << 4) | data[1];
+}
+
+void DoFieldPoisonEffect(void)
+{
+ PlaySE(SE_DOKU);
+ CreateTask(Task_FieldPoisonEffect, 80);
+}
+
+bool32 FieldPoisonEffectIsRunning(void)
+{
+ return FuncIsActiveTask(Task_FieldPoisonEffect);
+}
diff --git a/src/field/fldeff_recordmixing.c b/src/field/fldeff_recordmixing.c
new file mode 100644
index 000000000..ec72885b5
--- /dev/null
+++ b/src/field/fldeff_recordmixing.c
@@ -0,0 +1,83 @@
+#include "global.h"
+#include "field_map_obj.h"
+#include "fldeff_recordmixing.h"
+#include "sprite.h"
+
+extern const struct OamData gFieldOamData_32x8;
+
+static const u8 sSpriteImage_83D26C0[] = INCBIN_U8("graphics/unknown_sprites/83D2860/0.4bpp");
+static const u8 sSpriteImage_83D2740[] = INCBIN_U8("graphics/unknown_sprites/83D2860/1.4bpp");
+static const u8 sSpriteImage_83D27C0[] = INCBIN_U8("graphics/unknown_sprites/83D2860/2.4bpp");
+static const u16 sPalette_3D2840[] = INCBIN_U16("graphics/unknown/unknown_3D2840.gbapal");
+
+
+static const struct SpriteFrameImage sSpriteImageTable_83FD950[] =
+{
+ { sSpriteImage_83D26C0, sizeof(sSpriteImage_83D26C0) },
+ { sSpriteImage_83D2740, sizeof(sSpriteImage_83D2740) },
+ { sSpriteImage_83D27C0, sizeof(sSpriteImage_83D27C0) },
+};
+
+static const struct SpritePalette sUnknown_083D2878 = { sPalette_3D2840, 0x1000 };
+
+static const union AnimCmd sSpriteAnim_83D2880[] =
+{
+ ANIMCMD_FRAME(0, 30),
+ ANIMCMD_FRAME(1, 30),
+ ANIMCMD_FRAME(2, 30),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd *const sSpriteAnimTable_83D2890[] =
+{
+ sSpriteAnim_83D2880,
+};
+
+static const struct SpriteTemplate sSpriteTemplate_83D2894 =
+{
+ .tileTag = 0xFFFF,
+ .paletteTag = 0x1000,
+ .oam = &gFieldOamData_32x8,
+ .anims = sSpriteAnimTable_83D2890,
+ .images = sSpriteImageTable_83FD950,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+u8 CreateRecordMixingSprite(void)
+{
+ u8 spriteId;
+
+ LoadSpritePalette(&sUnknown_083D2878);
+
+ spriteId = CreateSprite(&sSpriteTemplate_83D2894, 0, 0, 82);
+
+ if (spriteId == MAX_SPRITES)
+ {
+ return MAX_SPRITES;
+ }
+ else
+ {
+ struct Sprite *sprite = &gSprites[spriteId];
+ sub_8060388(16, 13, &sprite->pos1.x, &sprite->pos1.y);
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->pos1.x += 16;
+ sprite->pos1.y += 2;
+ }
+
+ return spriteId;
+}
+
+void DestroyRecordMixingSprite(void)
+{
+ int i;
+
+ for (i = 0; i < MAX_SPRITES; i++)
+ {
+ if (gSprites[i].template == &sSpriteTemplate_83D2894)
+ {
+ FreeSpritePalette(&gSprites[i]);
+ DestroySprite(&gSprites[i]);
+ }
+ }
+}
diff --git a/src/field/fldeff_secret_base_pc.c b/src/field/fldeff_secret_base_pc.c
new file mode 100644
index 000000000..394c4bc56
--- /dev/null
+++ b/src/field/fldeff_secret_base_pc.c
@@ -0,0 +1,69 @@
+#include "global.h"
+#include "event_data.h"
+#include "field_camera.h"
+#include "field_effect.h"
+#include "field_player_avatar.h"
+#include "fieldmap.h"
+#include "script.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "task.h"
+
+static void Task_SecretBasePCTurnOn(u8);
+
+u32 FldEff_SecretBasePCTurnOn(void)
+{
+ s16 x, y;
+ u8 taskId;
+
+ GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
+ taskId = CreateTask(Task_SecretBasePCTurnOn, 0);
+ gTasks[taskId].data[0] = x;
+ gTasks[taskId].data[1] = y;
+ gTasks[taskId].data[2] = 0;
+
+ return 0;
+}
+
+static void Task_SecretBasePCTurnOn(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ switch (data[2])
+ {
+ case 4:
+ case 12:
+ MapGridSetMetatileIdAt(data[0], data[1], 548);
+ CurrentMapDrawMetatileAt(data[0], data[1]);
+ break;
+ case 8:
+ case 16:
+ MapGridSetMetatileIdAt(data[0], data[1], 544);
+ CurrentMapDrawMetatileAt(data[0], data[1]);
+ break;
+ case 20:
+ MapGridSetMetatileIdAt(data[0], data[1], 548);
+ CurrentMapDrawMetatileAt(data[0], data[1]);
+ FieldEffectActiveListRemove(FLDEFF_SECRET_BASE_PC_TURN_ON);
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ return;
+ }
+
+ data[2]++;
+}
+
+void DoSecretBasePCTurnOffEffect(void)
+{
+ s16 x, y;
+
+ GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
+ PlaySE(SE_PC_OFF);
+
+ if (!VarGet(VAR_CURRENT_SECRET_BASE))
+ MapGridSetMetatileIdAt(x, y, 3616);
+ else
+ MapGridSetMetatileIdAt(x, y, 3617);
+
+ CurrentMapDrawMetatileAt(x, y);
+}
diff --git a/src/field/fldeff_secretpower.c b/src/field/fldeff_secretpower.c
new file mode 100644
index 000000000..bf8e98403
--- /dev/null
+++ b/src/field/fldeff_secretpower.c
@@ -0,0 +1,484 @@
+#include "global.h"
+#include "event_data.h"
+#include "fieldmap.h"
+#include "field_effect.h"
+#include "field_player_avatar.h"
+#include "metatile_behavior.h"
+#include "metatile_behaviors.h"
+#include "overworld.h"
+#include "pokemon_menu.h"
+#include "rom6.h"
+#include "script.h"
+#include "secret_base.h"
+#include "constants/songs.h"
+#include "sound.h"
+
+extern u8 gUnknown_081A2CE6[];
+extern u8 gUnknown_081A2D3E[];
+extern u8 gUnknown_081A2D96[];
+
+const u8 gSpriteImage_83D198C[] = INCBIN_U8("graphics/unknown_sprites/83D259C/0.4bpp");
+const u8 gSpriteImage_83D1A0C[] = INCBIN_U8("graphics/unknown_sprites/83D259C/1.4bpp");
+const u8 gSpriteImage_83D1A8C[] = INCBIN_U8("graphics/unknown_sprites/83D259C/2.4bpp");
+const u8 gSpriteImage_83D1B0C[] = INCBIN_U8("graphics/unknown_sprites/83D259C/3.4bpp");
+const u8 gSpriteImage_83D1B8C[] = INCBIN_U8("graphics/unknown_sprites/83D259C/4.4bpp");
+const u8 gUnusedEmptySpace_83D1C0C[32] = {0};
+const u16 gFieldEffectObjectPalette7[] = INCBIN_U16("graphics/field_effect_objects/palettes/07.gbapal");
+const u8 gSpriteImage_83D1C4C[] = INCBIN_U8("graphics/unknown_sprites/83D25EC/0.4bpp");
+const u8 gSpriteImage_83D1CCC[] = INCBIN_U8("graphics/unknown_sprites/83D25EC/1.4bpp");
+const u8 gSpriteImage_83D1D4C[] = INCBIN_U8("graphics/unknown_sprites/83D25EC/2.4bpp");
+const u8 gSpriteImage_83D1DCC[] = INCBIN_U8("graphics/unknown_sprites/83D25EC/3.4bpp");
+const u8 gSpriteImage_83D1E4C[] = INCBIN_U8("graphics/unknown_sprites/83D25EC/4.4bpp");
+const u8 gSpriteImage_83D1ECC[] = INCBIN_U8("graphics/unknown_sprites/83D25C4/0.4bpp");
+const u8 gSpriteImage_83D1F4C[] = INCBIN_U8("graphics/unknown_sprites/83D25C4/1.4bpp");
+const u8 gSpriteImage_83D1FCC[] = INCBIN_U8("graphics/unknown_sprites/83D25C4/2.4bpp");
+const u8 gSpriteImage_83D204C[] = INCBIN_U8("graphics/unknown_sprites/83D25C4/3.4bpp");
+const u8 gSpriteImage_83D20CC[] = INCBIN_U8("graphics/unknown_sprites/83D25C4/4.4bpp");
+const u8 gSpriteImage_83D214C[] = INCBIN_U8("graphics/unknown_sprites/83D25C4/5.4bpp"); // unused
+const u16 gFieldEffectObjectPalette8[] = INCBIN_U16("graphics/field_effect_objects/palettes/08.gbapal");
+const u8 gSpriteImage_83D21EC[] = INCBIN_U8("graphics/unknown_sprites/83D2688/0.4bpp");
+const u8 gSpriteImage_83D22EC[] = INCBIN_U8("graphics/unknown_sprites/83D2688/1.4bpp");
+const u8 gSpriteImage_83D23EC[] = INCBIN_U8("graphics/unknown_sprites/83D2688/2.4bpp");
+
+const struct OamData gOamData_83D24EC =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const union AnimCmd gSpriteAnim_83D24F4[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(1, 8),
+ ANIMCMD_FRAME(2, 8),
+ ANIMCMD_FRAME(3, 8),
+ ANIMCMD_FRAME(4, 8),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83D250C[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(1, 8),
+ ANIMCMD_FRAME(2, 8),
+ ANIMCMD_FRAME(3, 8),
+ ANIMCMD_FRAME(4, 8),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83D2524[] =
+{
+ ANIMCMD_FRAME(4, 8),
+ ANIMCMD_FRAME(3, 8),
+ ANIMCMD_FRAME(2, 8),
+ ANIMCMD_FRAME(1, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83D253C[] =
+{
+ ANIMCMD_FRAME(0, 8, .hFlip = TRUE),
+ ANIMCMD_FRAME(1, 8, .hFlip = TRUE),
+ ANIMCMD_FRAME(2, 8, .hFlip = TRUE),
+ ANIMCMD_FRAME(3, 8, .hFlip = TRUE),
+ ANIMCMD_FRAME(4, 8, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83D2554[] =
+{
+ ANIMCMD_FRAME(4, 8, .hFlip = TRUE),
+ ANIMCMD_FRAME(3, 8, .hFlip = TRUE),
+ ANIMCMD_FRAME(2, 8, .hFlip = TRUE),
+ ANIMCMD_FRAME(1, 8, .hFlip = TRUE),
+ ANIMCMD_FRAME(0, 8, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83D256C[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(1, 8),
+ ANIMCMD_FRAME(2, 8),
+ ANIMCMD_FRAME(3, 8),
+ ANIMCMD_FRAME(4, 8),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_83D2584[] =
+{
+ gSpriteAnim_83D24F4,
+};
+
+const union AnimCmd *const gSpriteAnimTable_83D2588[] =
+{
+ gSpriteAnim_83D250C,
+ gSpriteAnim_83D2524,
+ gSpriteAnim_83D253C,
+ gSpriteAnim_83D2554,
+};
+
+const union AnimCmd *const gSpriteAnimTable_83D2598[] =
+{
+ gSpriteAnim_83D256C,
+};
+
+const struct SpriteFrameImage gSpriteImageTable_83D259C[] =
+{
+ {gSpriteImage_83D198C, 0x80},
+ {gSpriteImage_83D1A0C, 0x80},
+ {gSpriteImage_83D1A8C, 0x80},
+ {gSpriteImage_83D1B0C, 0x80},
+ {gSpriteImage_83D1B8C, 0x80},
+};
+
+const struct SpriteFrameImage gSpriteImageTable_83D25C4[] =
+{
+ {gSpriteImage_83D1ECC, 0x80},
+ {gSpriteImage_83D1F4C, 0x80},
+ {gSpriteImage_83D1FCC, 0x80},
+ {gSpriteImage_83D204C, 0x80},
+ {gSpriteImage_83D20CC, 0x80},
+};
+
+const struct SpriteFrameImage gSpriteImageTable_83D25EC[] =
+{
+ {gSpriteImage_83D1C4C, 0x80},
+ {gSpriteImage_83D1CCC, 0x80},
+ {gSpriteImage_83D1D4C, 0x80},
+ {gSpriteImage_83D1DCC, 0x80},
+ {gSpriteImage_83D1E4C, 0x80},
+};
+
+void sub_80C644C(struct Sprite *);
+const struct SpriteTemplate gSpriteTemplate_83D2614 =
+{
+ .tileTag = 0xFFFF,
+ .paletteTag = 4099,
+ .oam = &gOamData_83D24EC,
+ .anims = gSpriteAnimTable_83D2584,
+ .images = gSpriteImageTable_83D259C,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80C644C,
+};
+
+void sub_80C6598(struct Sprite *);
+const struct SpriteTemplate gSpriteTemplate_83D262C =
+{
+ .tileTag = 0xFFFF,
+ .paletteTag = 4104,
+ .oam = &gOamData_83D24EC,
+ .anims = gSpriteAnimTable_83D2588,
+ .images = gSpriteImageTable_83D25C4,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80C6598,
+};
+
+void sub_80C66BC(struct Sprite *);
+const struct SpriteTemplate gSpriteTemplate_83D2644 =
+{
+ .tileTag = 0xFFFF,
+ .paletteTag = 4104,
+ .oam = &gOamData_83D24EC,
+ .anims = gSpriteAnimTable_83D2598,
+ .images = gSpriteImageTable_83D25EC,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80C66BC,
+};
+
+const struct SpritePalette gFieldEffectObjectPaletteInfo7 = {gFieldEffectObjectPalette7, 0x1003};
+const struct SpritePalette gFieldEffectObjectPaletteInfo8 = {gFieldEffectObjectPalette8, 0x1008};
+
+void sub_80C639C(void);
+void sub_80C63E8(void);
+void sub_80C6468(struct Sprite *);
+void sub_80C6498(struct Sprite *);
+void sub_80C64A8(void);
+void sub_80C64F4(void);
+void sub_80C65C4(struct Sprite *);
+void sub_80C65FC(struct Sprite *);
+void sub_80C660C(void);
+void sub_80C6658(void);
+void sub_80C66D8(struct Sprite *sprite);
+void sub_80C6708(struct Sprite *sprite);
+
+void sub_80C6264(void)
+{
+ sub_80BBFD8(&gUnknown_0203923C, gMapHeader.events);
+ sub_80BB5E4();
+}
+
+void sub_80C6280(void)
+{
+ switch (gFieldEffectArguments[1])
+ {
+ case 1:
+ gFieldEffectArguments[5] = 8;
+ gFieldEffectArguments[6] = 40;
+ break;
+ case 2:
+ gFieldEffectArguments[5] = 8;
+ gFieldEffectArguments[6] = 8;
+ break;
+ case 3:
+ gFieldEffectArguments[5] = -8;
+ gFieldEffectArguments[6] = 24;
+ break;
+ case 4:
+ gFieldEffectArguments[5] = 24;
+ gFieldEffectArguments[6] = 24;
+ break;
+ }
+}
+
+bool8 SetUpFieldMove_SecretPower(void)
+{
+ u8 behavior;
+
+ sub_80BB63C();
+
+ if (gSpecialVar_Result == 1 || player_get_direction_lower_nybble() != DIR_NORTH)
+ return FALSE;
+
+ GetXYCoordsOneStepInFrontOfPlayer(&gUnknown_0203923C.x, &gUnknown_0203923C.y);
+ behavior = MapGridGetMetatileBehaviorAt(gUnknown_0203923C.x, gUnknown_0203923C.y);
+
+ if (MetatileBehavior_IsSecretBaseCave(behavior) == TRUE)
+ {
+ sub_80C6264();
+ gFieldCallback = FieldCallback_Teleport;
+ gUnknown_03005CE4 = sub_80C639C;
+ return TRUE;
+ }
+
+ if (MetatileBehavior_IsSecretBaseTree(behavior) == TRUE)
+ {
+ sub_80C6264();
+ gFieldCallback = FieldCallback_Teleport;
+ gUnknown_03005CE4 = sub_80C64A8;
+ return TRUE;
+ }
+
+ if (MetatileBehavior_IsSecretBaseShrub(behavior) == TRUE)
+ {
+ sub_80C6264();
+ gFieldCallback = FieldCallback_Teleport;
+ gUnknown_03005CE4 = sub_80C660C;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void sub_80C639C(void)
+{
+ gFieldEffectArguments[0] = gLastFieldPokeMenuOpened;
+ ScriptContext1_SetupScript(gUnknown_081A2CE6);
+}
+
+bool8 FldEff_UseSecretPowerCave(void)
+{
+ u8 taskId = oei_task_add();
+
+ gTasks[taskId].data[8] = (uintptr_t)sub_80C63E8 >> 16;
+ gTasks[taskId].data[9] = (uintptr_t)sub_80C63E8;
+
+ return FALSE;
+}
+
+void sub_80C63E8(void)
+{
+ FieldEffectActiveListRemove(FLDEFF_USE_SECRET_POWER_CAVE);
+ FieldEffectStart(FLDEFF_SECRET_POWER_CAVE);
+}
+
+bool8 FldEff_SecretPowerCave(void)
+{
+ sub_80C6280();
+ CreateSprite(
+ &gSpriteTemplate_83D2614,
+ gSprites[gPlayerAvatar.spriteId].oam.x + gFieldEffectArguments[5],
+ gSprites[gPlayerAvatar.spriteId].oam.y + gFieldEffectArguments[6],
+ 148);
+ return FALSE;
+}
+
+void sub_80C644C(struct Sprite *sprite)
+{
+ PlaySE(SE_W088);
+ sprite->data[0] = 0;
+ sprite->callback = sub_80C6468;
+}
+
+void sub_80C6468(struct Sprite *sprite)
+{
+ if (sprite->data[0] < 40)
+ {
+ sprite->data[0]++;
+ if (sprite->data[0] == 20 )
+ sub_80BB800();
+ }
+ else
+ {
+ sprite->data[0] = 0;
+ sprite->callback = sub_80C6498;
+ }
+}
+
+void sub_80C6498(struct Sprite *sprite)
+{
+ FieldEffectStop(sprite, FLDEFF_SECRET_POWER_CAVE);
+ EnableBothScriptContexts();
+}
+
+void sub_80C64A8(void)
+{
+ gFieldEffectArguments[0] = gLastFieldPokeMenuOpened;
+ ScriptContext1_SetupScript(gUnknown_081A2D3E);
+}
+
+bool8 FldEff_UseSecretPowerTree(void)
+{
+ u8 taskId = oei_task_add();
+
+ gTasks[taskId].data[8] = (uintptr_t)sub_80C64F4 >> 16;
+ gTasks[taskId].data[9] = (uintptr_t)sub_80C64F4;
+
+ return FALSE;
+}
+
+void sub_80C64F4(void)
+{
+ FieldEffectActiveListRemove(FLDEFF_USE_SECRET_POWER_TREE);
+ FieldEffectStart(FLDEFF_SECRET_POWER_TREE);
+}
+
+bool8 FldEff_SecretPowerTree(void)
+{
+ s16 behavior = MapGridGetMetatileBehaviorAt(gUnknown_0203923C.x, gUnknown_0203923C.y) & 0xFFF;
+
+ if (behavior == MB_SECRET_BASE_SPOT_TREE_1)
+ {
+ gFieldEffectArguments[7] = 0;
+ }
+
+ if (behavior == MB_SECRET_BASE_SPOT_TREE_2)
+ {
+ gFieldEffectArguments[7] = 2;
+ }
+
+ sub_80C6280();
+
+ CreateSprite(
+ &gSpriteTemplate_83D262C,
+ gSprites[gPlayerAvatar.spriteId].oam.x + gFieldEffectArguments[5],
+ gSprites[gPlayerAvatar.spriteId].oam.y + gFieldEffectArguments[6],
+ 148);
+
+ if (gFieldEffectArguments[7] == 1 || gFieldEffectArguments[7] == 3)
+ sub_80BB800();
+
+ return FALSE;
+}
+
+void sub_80C6598(struct Sprite *sprite)
+{
+ PlaySE(SE_W010);
+ sprite->animNum = gFieldEffectArguments[7];
+ sprite->data[0] = 0;
+ sprite->callback = sub_80C65C4;
+}
+
+void sub_80C65C4(struct Sprite *sprite)
+{
+ sprite->data[0]++;
+
+ if (sprite->data[0] >= 40)
+ {
+ if (gFieldEffectArguments[7] == 0 || gFieldEffectArguments[7] == 2)
+ sub_80BB800();
+ sprite->data[0] = 0;
+ sprite->callback = sub_80C65FC;
+ }
+}
+
+
+void sub_80C65FC(struct Sprite *sprite)
+{
+ FieldEffectStop(sprite, FLDEFF_SECRET_POWER_TREE);
+ EnableBothScriptContexts();
+}
+
+void sub_80C660C(void)
+{
+ gFieldEffectArguments[0] = gLastFieldPokeMenuOpened;
+ ScriptContext1_SetupScript(gUnknown_081A2D96);
+}
+
+bool8 FldEff_UseSecretPowerShrub(void)
+{
+ u8 taskId = oei_task_add();
+
+ gTasks[taskId].data[8] = (uintptr_t)sub_80C6658 >> 16;
+ gTasks[taskId].data[9] = (uintptr_t)sub_80C6658;
+
+ return FALSE;
+}
+
+void sub_80C6658(void)
+{
+ FieldEffectActiveListRemove(FLDEFF_USE_SECRET_POWER_SHRUB);
+ FieldEffectStart(FLDEFF_SECRET_POWER_SHRUB);
+}
+
+bool8 FldEff_SecretPowerShrub(void)
+{
+ sub_80C6280();
+ CreateSprite(
+ &gSpriteTemplate_83D2644,
+ gSprites[gPlayerAvatar.spriteId].oam.x + gFieldEffectArguments[5],
+ gSprites[gPlayerAvatar.spriteId].oam.y + gFieldEffectArguments[6],
+ 148);
+ return FALSE;
+}
+
+void sub_80C66BC(struct Sprite *sprite)
+{
+ PlaySE(SE_W077);
+ sprite->data[0] = 0;
+ sprite->callback = sub_80C66D8;
+}
+
+void sub_80C66D8(struct Sprite *sprite)
+{
+ if (sprite->data[0] < 40)
+ {
+ sprite->data[0]++;
+ if (sprite->data[0] == 20 )
+ sub_80BB800();
+ }
+ else
+ {
+ sprite->data[0] = 0;
+ sprite->callback = sub_80C6708;
+ }
+}
+
+
+void sub_80C6708(struct Sprite *sprite)
+{
+ FieldEffectStop(sprite, FLDEFF_SECRET_POWER_SHRUB);
+ EnableBothScriptContexts();
+}
diff --git a/src/fldeff_softboiled.c b/src/field/fldeff_softboiled.c
index cb26d9966..a574232a8 100644
--- a/src/fldeff_softboiled.c
+++ b/src/field/fldeff_softboiled.c
@@ -4,11 +4,12 @@
#include "party_menu.h"
#include "pokemon.h"
#include "pokemon_menu.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "sprite.h"
#include "strings.h"
#include "task.h"
+#include "ewram.h"
struct Struct2001000 {
u8 unk0;
@@ -38,15 +39,9 @@ struct Struct201C000 {
#define WINDOW_RIGHT 29
#endif
-#define EWRAM_1000 (*(struct Struct2001000 *)(unk_2000000 + 0x1000))
-#define EWRAM_1B000_2 (*(struct Struct201B000 *)(unk_2000000 + 0x1B000))
-#define EWRAM_1C000 (*(struct Struct201C000 *)(unk_2000000 + 0x1C000))
-
// extern
extern u8 gUnknown_0202E8F6;
extern u8 gLastFieldPokeMenuOpened;
-
-extern u8 unk_2000000[];
extern u8 gUnknown_0202E8F4;
// Static
@@ -75,7 +70,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) {
@@ -87,8 +82,8 @@ static void sub_8133D50(u8 taskId) {
struct Sprite *sprites = gSprites;
- unk1 = sprites[EWRAM_1000.unk1].data0;
- unk2 = sprites[EWRAM_1000.unk2].data0;
+ unk1 = sprites[EWRAM_1000.unk1].data[0];
+ unk2 = sprites[EWRAM_1000.unk2].data[0];
if (unk1 > 5 || unk2 > 5)
{
@@ -96,7 +91,7 @@ static void sub_8133D50(u8 taskId) {
return;
}
- EWRAM_1C000.unk0 = &gPlayerParty[sprites[EWRAM_1000.unk2].data0];
+ EWRAM_1C000.unk0 = &gPlayerParty[sprites[EWRAM_1000.unk2].data[0]];
hp = GetMonData(EWRAM_1C000.unk0, MON_DATA_HP);
if (hp == 0 || unk1 == unk2 || GetMonData(EWRAM_1C000.unk0, MON_DATA_MAX_HP) == hp)
@@ -107,7 +102,7 @@ static void sub_8133D50(u8 taskId) {
PlaySE(SE_KAIFUKU);
- EWRAM_1C000.unk5 = gSprites[EWRAM_1000.unk1].data0;
+ EWRAM_1C000.unk5 = gSprites[EWRAM_1000.unk1].data[0];
pokemon = &gPlayerParty[EWRAM_1C000.unk5];
EWRAM_1C000.unk0 = pokemon;
@@ -132,8 +127,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 +143,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 81f4f63c6..565ac1651 100644
--- a/src/fldeff_strength.c
+++ b/src/field/fldeff_strength.c
@@ -14,26 +14,26 @@ static void sub_811AA38(void);
static void sub_811AA9C(void);
extern u8 gLastFieldPokeMenuOpened;
-extern u16 gScriptResult;
+extern u16 gSpecialVar_Result;
extern void (*gFieldCallback)(void);
extern void (*gUnknown_03005CE4)(void);
-extern u8 UseStrengthScript[];
+extern u8 S_UseStrength[];
bool8 SetUpFieldMove_Strength(void)
{
if (ShouldDoBrailleStrengthEffect())
{
- gScriptResult = gLastFieldPokeMenuOpened;
- gFieldCallback = sub_808AB90;
+ gSpecialVar_Result = gLastFieldPokeMenuOpened;
+ gFieldCallback = FieldCallback_Teleport;
gUnknown_03005CE4 = sub_811AA38;
}
else
{
if (npc_before_player_of_type(87) != TRUE)
return 0;
- gScriptResult = gLastFieldPokeMenuOpened;
- gFieldCallback = sub_808AB90;
+ gSpecialVar_Result = gLastFieldPokeMenuOpened;
+ gFieldCallback = FieldCallback_Teleport;
gUnknown_03005CE4 = sub_811AA18;
}
@@ -42,14 +42,14 @@ bool8 SetUpFieldMove_Strength(void)
static void sub_811AA18(void)
{
- gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened;
- ScriptContext1_SetupScript(UseStrengthScript);
+ gFieldEffectArguments[0] = gLastFieldPokeMenuOpened;
+ ScriptContext1_SetupScript(S_UseStrength);
}
static void sub_811AA38(void)
{
- gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened;
- FieldEffectStart(40);
+ gFieldEffectArguments[0] = gLastFieldPokeMenuOpened;
+ FieldEffectStart(FLDEFF_USE_STRENGTH);
}
bool8 FldEff_UseStrength(void)
@@ -58,7 +58,7 @@ bool8 FldEff_UseStrength(void)
gTasks[taskId].data[8] = (u32)sub_811AA9C >> 16;
gTasks[taskId].data[9] = (u32)sub_811AA9C;
- GetMonNickname(&gPlayerParty[gUnknown_0202FF84[0]], gStringVar1);
+ GetMonNickname(&gPlayerParty[gFieldEffectArguments[0]], gStringVar1);
return FALSE;
}
diff --git a/src/fldeff_sweetscent.c b/src/field/fldeff_sweetscent.c
index 4c3e6bf4a..b9dbf619d 100644
--- a/src/fldeff_sweetscent.c
+++ b/src/field/fldeff_sweetscent.c
@@ -23,15 +23,15 @@ extern u8 SweetScentNothingHereScript[];
bool8 SetUpFieldMove_SweetScent(void)
{
- gFieldCallback = sub_808AB90;
+ gFieldCallback = FieldCallback_Teleport;
gUnknown_03005CE4 = sub_812BFD4;
return TRUE;
}
static void sub_812BFD4(void)
{
- FieldEffectStart(51);
- gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened;
+ FieldEffectStart(FLDEFF_SWEET_SCENT);
+ gFieldEffectArguments[0] = gLastFieldPokeMenuOpened;
}
bool8 FldEff_SweetScent()
@@ -51,7 +51,7 @@ static void sub_812C01C(void)
BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarObjectId()].oam.paletteNum + 16)), 4, 0, 8, 0x1F);
taskId = CreateTask(sub_812C084, 0);
gTasks[taskId].data[0] = 0;
- FieldEffectActiveListRemove(51);
+ FieldEffectActiveListRemove(FLDEFF_SWEET_SCENT);
}
static void sub_812C084(u8 taskId)
diff --git a/src/fldeff_teleport.c b/src/field/fldeff_teleport.c
index 74e68df06..af48fb414 100644
--- a/src/fldeff_teleport.c
+++ b/src/field/fldeff_teleport.c
@@ -3,7 +3,7 @@
#include "field_effect.h"
#include "field_player_avatar.h"
#include "pokemon_menu.h"
-#include "rom4.h"
+#include "overworld.h"
#include "rom6.h"
#include "task.h"
@@ -13,9 +13,9 @@ extern void (*gUnknown_03005CE4)(void);
bool8 SetUpFieldMove_Teleport(void)
{
- if (is_light_level_1_2_3_or_6(gMapHeader.mapType) == TRUE)
+ if (Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType) == TRUE)
{
- gFieldCallback = sub_808AB90;
+ gFieldCallback = FieldCallback_Teleport;
gUnknown_03005CE4 = hm_teleport_run_dp02scr;
return TRUE;
}
@@ -25,9 +25,9 @@ bool8 SetUpFieldMove_Teleport(void)
void hm_teleport_run_dp02scr(void)
{
- new_game();
- FieldEffectStart(63);
- gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened;
+ Overworld_ResetStateAfterTeleport();
+ FieldEffectStart(FLDEFF_USE_TELEPORT);
+ gFieldEffectArguments[0] = gLastFieldPokeMenuOpened;
}
bool8 FldEff_UseTeleport(void)
@@ -41,6 +41,6 @@ bool8 FldEff_UseTeleport(void)
void sub_814A404(void)
{
- FieldEffectActiveListRemove(63);
+ FieldEffectActiveListRemove(FLDEFF_USE_TELEPORT);
sub_8087BA8();
}
diff --git a/src/field/heal_location.c b/src/field/heal_location.c
new file mode 100644
index 000000000..a10c7a7b8
--- /dev/null
+++ b/src/field/heal_location.c
@@ -0,0 +1,63 @@
+#include "global.h"
+#include "heal_location.h"
+#include "constants/maps.h"
+
+#define NUM_HEAL_LOCATIONS 22
+
+static const struct HealLocation sHealLocations[] =
+{
+ {MAP_GROUP(LITTLEROOT_TOWN_BRENDANS_HOUSE_2F), MAP_NUM(LITTLEROOT_TOWN_BRENDANS_HOUSE_2F), 4, 2},
+ {MAP_GROUP(LITTLEROOT_TOWN_MAYS_HOUSE_2F), MAP_NUM(LITTLEROOT_TOWN_MAYS_HOUSE_2F), 4, 2},
+ {MAP_GROUP(PETALBURG_CITY), MAP_NUM(PETALBURG_CITY), 20, 17},
+ {MAP_GROUP(SLATEPORT_CITY), MAP_NUM(SLATEPORT_CITY), 19, 20},
+ {MAP_GROUP(MAUVILLE_CITY), MAP_NUM(MAUVILLE_CITY), 22, 6},
+ {MAP_GROUP(RUSTBORO_CITY), MAP_NUM(RUSTBORO_CITY), 16, 39},
+ {MAP_GROUP(FORTREE_CITY), MAP_NUM(FORTREE_CITY), 5, 7},
+ {MAP_GROUP(LILYCOVE_CITY), MAP_NUM(LILYCOVE_CITY), 24, 15},
+ {MAP_GROUP(MOSSDEEP_CITY), MAP_NUM(MOSSDEEP_CITY), 28, 17},
+ {MAP_GROUP(SOOTOPOLIS_CITY), MAP_NUM(SOOTOPOLIS_CITY), 43, 32},
+ {MAP_GROUP(EVER_GRANDE_CITY), MAP_NUM(EVER_GRANDE_CITY), 27, 49},
+ {MAP_GROUP(LITTLEROOT_TOWN), MAP_NUM(LITTLEROOT_TOWN), 5, 9},
+ {MAP_GROUP(LITTLEROOT_TOWN), MAP_NUM(LITTLEROOT_TOWN), 14, 9},
+ {MAP_GROUP(OLDALE_TOWN), MAP_NUM(OLDALE_TOWN), 6, 17},
+ {MAP_GROUP(DEWFORD_TOWN), MAP_NUM(DEWFORD_TOWN), 2, 11},
+ {MAP_GROUP(LAVARIDGE_TOWN), MAP_NUM(LAVARIDGE_TOWN), 9, 7},
+ {MAP_GROUP(FALLARBOR_TOWN), MAP_NUM(FALLARBOR_TOWN), 14, 8},
+ {MAP_GROUP(VERDANTURF_TOWN), MAP_NUM(VERDANTURF_TOWN), 16, 4},
+ {MAP_GROUP(PACIFIDLOG_TOWN), MAP_NUM(PACIFIDLOG_TOWN), 8, 16},
+ {MAP_GROUP(EVER_GRANDE_CITY), MAP_NUM(EVER_GRANDE_CITY), 18, 6},
+ {MAP_GROUP(BATTLE_TOWER_OUTSIDE), MAP_NUM(BATTLE_TOWER_OUTSIDE), 14, 9},
+ {MAP_GROUP(SOUTHERN_ISLAND_EXTERIOR), MAP_NUM(SOUTHERN_ISLAND_EXTERIOR), 15, 20},
+};
+
+u32 GetHealLocationIndexByMap(u16 mapGroup, u16 mapNum)
+{
+ u32 i;
+
+ for (i = 0; i < NUM_HEAL_LOCATIONS; i++)
+ {
+ if (sHealLocations[i].group == mapGroup && sHealLocations[i].map == mapNum)
+ return i + 1;
+ }
+ return 0;
+}
+
+const struct HealLocation *GetHealLocationByMap(u16 mapGroup, u16 mapNum)
+{
+ u32 index = GetHealLocationIndexByMap(mapGroup, mapNum);
+
+ if (index == 0)
+ return NULL;
+ else
+ return &sHealLocations[index - 1];
+}
+
+const struct HealLocation *GetHealLocation(u32 index)
+{
+ if (index == 0)
+ return NULL;
+ else if (index > NUM_HEAL_LOCATIONS)
+ return NULL;
+ else
+ return &sHealLocations[index - 1];
+}
diff --git a/src/hof_pc.c b/src/field/hof_pc.c
index 4646d171c..267ed4274 100644
--- a/src/hof_pc.c
+++ b/src/field/hof_pc.c
@@ -2,7 +2,7 @@
#include "hall_of_fame.h"
#include "main.h"
#include "palette.h"
-#include "rom4.h"
+#include "overworld.h"
#include "script.h"
#include "script_menu.h"
#include "task.h"
@@ -28,10 +28,10 @@ void ReturnFromHallOfFamePC(void)
static void ReshowPCMenuAfterHallOfFamePC(void)
{
ScriptContext2_Enable();
- sub_8053E90();
+ Overworld_PlaySpecialMapMusic();
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
- TryCreatePCMenu();
- sub_80B5838();
+ ScrSpecial_CreatePCMenu();
+ ScriptMenu_DisplayPCStartupPrompt();
CreateTask(Task_WaitForPaletteFade, 10);
}
diff --git a/src/item.c b/src/field/item.c
index 36871285a..66d7d65df 100644
--- a/src/item.c
+++ b/src/field/item.c
@@ -1,7 +1,7 @@
#include "global.h"
-#include "hold_effects.h"
+#include "constants/hold_effects.h"
#include "item.h"
-#include "items.h"
+#include "constants/items.h"
#include "item_use.h"
#include "berry.h"
#include "string_util.h"
@@ -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 4436bdfbe..e9b8b24d3 100644
--- a/src/item_menu.c
+++ b/src/field/item_menu.c
@@ -8,7 +8,7 @@
#include "field_player_avatar.h"
#include "graphics.h"
#include "item.h"
-#include "items.h"
+#include "constants/items.h"
#include "item_menu.h"
#include "item_use.h"
#include "link.h"
@@ -23,9 +23,9 @@
#include "party_menu.h"
#include "player_pc.h"
#include "pokemon_menu.h"
-#include "rom4.h"
+#include "overworld.h"
#include "script.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "sprite.h"
#include "strings.h"
@@ -34,9 +34,9 @@
#include "task.h"
#include "text.h"
#include "unknown_task.h"
+#include "ewram.h"
// External stuff
-extern u8 ewram[];
extern void gpu_pal_allocator_reset__manage_upper_four(void);
extern void sub_80F9020(void);
extern void sub_80F9988();
@@ -138,7 +138,7 @@ EWRAM_DATA static s8 sCurrentBagPocket = 0;
EWRAM_DATA static u8 gUnknown_0203855A = 0;
EWRAM_DATA static s8 gUnknown_0203855B = 0;
EWRAM_DATA static s8 gUnknown_0203855C = 0;
-EWRAM_DATA u16 gScriptItemId = 0;
+EWRAM_DATA u16 gSpecialVar_ItemId = 0;
EWRAM_DATA u8 gUnknown_02038560 = 0;
EWRAM_DATA u8 gUnknown_02038561 = 0;
EWRAM_DATA static u8 gUnknown_02038562 = 0;
@@ -152,18 +152,12 @@ static u8 sReturnLocation;
static const u8 *sPopupMenuActionList;
// common
-void (*gUnknown_03005D00)(u8) = NULL;
-extern u16 gUnknown_030041B4;
+void (*gFieldItemUseCallback)(u8) = NULL;
+extern u16 gBattle_BG1_Y;
extern struct PocketScrollState gBagPocketScrollStates[];
extern struct ItemSlot *gCurrentBagPocketItemSlots; // selected pocket item slots
extern const u8 Event_NoRegisteredItem[];
-#define ewramBerryPic (ewram + 0)
-#define ewramBerryPicTemp (ewram + 0x1000)
-#define ewramSavedItemsPocket ((struct ItemSlot *)(ewram + 0x1E000)) // saved items pocket (for Wally battle)
-#define ewramSavedPokeballsPocket ((struct ItemSlot *)(ewram + 0x1F000)) // saved Pokeballs pocket (for Wally battle)
-#define ewramBagSetupStep (ewram[0x1FFFF])
-
extern const struct CompressedSpriteSheet sMaleBagSpriteSheet;
extern const struct CompressedSpriteSheet sFemaleBagSpriteSheet;
extern const struct CompressedSpritePalette sBagSpritePalette;
@@ -1668,7 +1662,7 @@ static void sub_80A4BF0(u16 *a)
const u8 *text;
if (i == 0)
- text = sub_80A4B90(gScriptItemId);
+ text = sub_80A4B90(gSpecialVar_ItemId);
else
text = sItemPopupMenuActions[sPopupMenuActionList[i]].text;
MenuPrint(text, 1 + (i / 2) * 6, 8 + (i % 2) * 2);
@@ -1855,7 +1849,7 @@ static void sub_80A50C8(u8 taskId)
{
if (r5[10] == 0)
{
- gScriptItemId = 0;
+ gSpecialVar_ItemId = 0;
gUnknown_083C16BC[sReturnLocation].onBagClose(taskId);
}
else
@@ -1870,7 +1864,7 @@ static void sub_80A50C8(u8 taskId)
{
PlaySE(SE_SELECT);
gUnknown_02038560 = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos;
- gScriptItemId = gCurrentBagPocketItemSlots[gUnknown_02038560].itemId;
+ gSpecialVar_ItemId = gCurrentBagPocketItemSlots[gUnknown_02038560].itemId;
gUnknown_083C16BC[sReturnLocation].onItemSelect(taskId);
sub_80F98A4(0);
sub_80F98A4(1);
@@ -1893,7 +1887,7 @@ static void sub_80A50C8(u8 taskId)
{
if (sReturnLocation != RETURN_TO_FIELD_5)
{
- gScriptItemId = 0;
+ gSpecialVar_ItemId = 0;
gUnknown_083C16BC[sReturnLocation].onBagClose(taskId);
}
}
@@ -2533,7 +2527,7 @@ static void sub_80A57C4(void)
gUnknown_02038564 = 1;
r5 = 9;
}
- else if (sub_80F92F4(gScriptItemId) == 0)
+ else if (sub_80F92F4(gSpecialVar_ItemId) == 0)
{
sPopupMenuActionList = gUnknown_083C16AE[4];
gUnknown_02038564 = 1;
@@ -2660,10 +2654,10 @@ void sub_80A5B40(void)
static void HandlePopupMenuAction_UseOnField(u8 taskId)
{
- if (ItemId_GetFieldFunc(gScriptItemId) != NULL)
+ if (ItemId_GetFieldFunc(gSpecialVar_ItemId) != NULL)
{
PlaySE(SE_SELECT);
- if (CalculatePlayerPartyCount() == 0 && ItemId_GetType(gScriptItemId) == 1)
+ if (CalculatePlayerPartyCount() == 0 && ItemId_GetType(gSpecialVar_ItemId) == 1)
{
sub_80A5BF8(taskId);
}
@@ -2671,7 +2665,7 @@ static void HandlePopupMenuAction_UseOnField(u8 taskId)
{
gTasks[taskId].data[2] = 0;
if (sCurrentBagPocket != BAG_POCKET_BERRIES)
- ItemId_GetFieldFunc(gScriptItemId)(taskId);
+ ItemId_GetFieldFunc(gSpecialVar_ItemId)(taskId);
else
sub_80C9C7C(taskId);
}
@@ -2718,7 +2712,7 @@ void ExecuteItemUseFromBlackPalette(void)
static void Task_CallItemUseOnFieldCallback(u8 taskId)
{
if (sub_807D770() == TRUE)
- gUnknown_03005D00(taskId);
+ gFieldItemUseCallback(taskId);
}
void sub_80A5D04(void)
@@ -2799,7 +2793,7 @@ static void sub_80A5EA0(u8 taskId)
if (gMain.newKeys & A_BUTTON)
{
PlaySE(SE_SELECT);
- sub_80A5DA0(gScriptItemId, gTasks[taskId].data[1]);
+ sub_80A5DA0(gSpecialVar_ItemId, gTasks[taskId].data[1]);
DoYesNoFuncWithChoice(taskId, &gUnknown_083C16F4);
}
else if (gMain.newKeys & B_BUTTON)
@@ -2833,7 +2827,7 @@ static void sub_80A5F80(u8 taskId)
static void HandlePopupMenuAction_Register(u8 taskId)
{
PlaySE(SE_SELECT);
- if (gSaveBlock1.registeredItem == gScriptItemId)
+ if (gSaveBlock1.registeredItem == gSpecialVar_ItemId)
{
// Un-register the registered item
RemoveSelectIconFromRegisteredItem();
@@ -2842,7 +2836,7 @@ static void HandlePopupMenuAction_Register(u8 taskId)
else
{
AddSelectIconToRegisteredItem();
- gSaveBlock1.registeredItem = gScriptItemId;
+ gSaveBlock1.registeredItem = gSpecialVar_ItemId;
}
sub_80A7528(0);
sub_80A41D4(taskId);
@@ -2871,7 +2865,7 @@ static void sub_80A6024(u8 taskId)
static void DisplayCannotBeHeldMessage(u8 taskId)
{
sub_80A73FC();
- CopyItemName(gScriptItemId, gStringVar1);
+ CopyItemName(gSpecialVar_ItemId, gStringVar1);
StringExpandPlaceholders(gStringVar4, gOtherText_CantBeHeld);
sub_80A7590();
DisplayCannotUseItemMessage(taskId, gStringVar4, sub_80A6024, 1);
@@ -2880,13 +2874,13 @@ static void DisplayCannotBeHeldMessage(u8 taskId)
static void HandlePopupMenuAction_Give(u8 taskId)
{
PlaySE(SE_SELECT);
- if (sub_80F931C(gScriptItemId) == 0)
+ if (sub_80F931C(gSpecialVar_ItemId) == 0)
{
sub_80A73FC();
sub_80A7590();
DisplayCannotUseItemMessage(taskId, gOtherText_CantWriteMail, sub_80A6024, 1);
}
- else if (ItemId_GetImportance(gScriptItemId) == 0)
+ else if (ItemId_GetImportance(gSpecialVar_ItemId) == 0)
{
if (CalculatePlayerPartyCount() == 0)
{
@@ -2937,21 +2931,21 @@ static void OnItemSelect_PkmnList(u8 taskId)
{
u8 r6 = sCurrentBagPocket + 1;
- if (sub_80F931C(gScriptItemId) == 0)
+ if (sub_80F931C(gSpecialVar_ItemId) == 0)
{
sub_80A73FC();
sub_80A7590();
DisplayCannotUseItemMessage(taskId, gOtherText_CantWriteMail, sub_80A6024, 1);
}
- else if (sub_80F92F4(gScriptItemId) == 0)
+ else if (sub_80F92F4(gSpecialVar_ItemId) == 0)
{
sub_80A73FC();
- CopyItemName(gScriptItemId, gStringVar1);
+ CopyItemName(gSpecialVar_ItemId, gStringVar1);
StringExpandPlaceholders(gStringVar4, gOtherText_CantBeHeldHere);
sub_80A7590();
DisplayCannotUseItemMessage(taskId, gStringVar4, sub_80A6024, 1);
}
- else if (r6 != 5 && ItemId_GetImportance(gScriptItemId) == 0)
+ else if (r6 != 5 && ItemId_GetImportance(gSpecialVar_ItemId) == 0)
{
gTasks[taskId].data[8] = (u32)sub_808A3F8 >> 16;
gTasks[taskId].data[9] = (u32)sub_808A3F8;
@@ -2989,8 +2983,8 @@ static void OnItemSelect_Shop(u8 taskId)
gTasks[taskId].data[10] = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos + 1;
sub_80A48E8(taskId, gBagPocketScrollStates[sCurrentBagPocket].cursorPos, gBagPocketScrollStates[sCurrentBagPocket].cursorPos);
sub_80A73FC();
- CopyItemName(gScriptItemId, gStringVar2);
- if (ItemId_GetPrice(gScriptItemId) == 0)
+ CopyItemName(gSpecialVar_ItemId, gStringVar2);
+ if (ItemId_GetPrice(gSpecialVar_ItemId) == 0)
{
StringExpandPlaceholders(gStringVar4, gOtherText_CantBuyThat);
DisplayCannotUseItemMessage(taskId, gStringVar4, sub_80A6444, 1);
@@ -3031,7 +3025,7 @@ static void sub_80A648C(u8 taskId)
sub_80A418C(1, 1, 1, 11, 3);
else
sub_80A418C(1, 1, 1, 11, 2);
- BuyMenuDisplayMessage(gScriptItemId, 1);
+ BuyMenuDisplayMessage(gSpecialVar_ItemId, 1);
sub_80A683C();
}
@@ -3053,7 +3047,7 @@ static void sub_80A6548(u8 taskId)
static void sub_80A6574(u8 taskId)
{
PlaySE(SE_REGI);
- sub_80A6870(gScriptItemId, gTasks[taskId].data[1]);
+ sub_80A6870(gSpecialVar_ItemId, gTasks[taskId].data[1]);
gTasks[taskId].func = sub_80A6548;
}
@@ -3061,7 +3055,7 @@ static void sub_80A65AC(u8 taskId)
{
MenuZeroFillWindowRect(7, 6, 13, 12);
sub_80A36B8(gBGTilemapBuffers[1], 7, 6, 6, 6);
- CopyItemName(gScriptItemId, gStringVar2);
+ CopyItemName(gSpecialVar_ItemId, gStringVar2);
StringExpandPlaceholders(gStringVar4, gOtherText_SoldItem);
DisplayCannotUseItemMessage(taskId, gStringVar4, sub_80A6574, 1);
sub_80A3D5C(taskId);
@@ -3085,14 +3079,14 @@ static void Task_BuyHowManyDialogueHandleInput(u8 taskId)
if (sub_80A5350(taskId) == TRUE)
{
MenuZeroFillWindowRect(6, 11, 12, 11);
- BuyMenuDisplayMessage(gScriptItemId, gTasks[taskId].data[1]);
+ BuyMenuDisplayMessage(gSpecialVar_ItemId, gTasks[taskId].data[1]);
}
else if (gMain.newKeys & A_BUTTON)
{
PlaySE(SE_SELECT);
MenuZeroFillWindowRect(0, 10, 13, 13);
sub_80A36B8(gBGTilemapBuffers[1], 0, 10, 13, 3);
- ConvertIntToDecimalStringN(gStringVar1, ItemId_GetPrice(gScriptItemId) / 2 * gTasks[taskId].data[1], STR_CONV_MODE_LEFT_ALIGN, 6);
+ ConvertIntToDecimalStringN(gStringVar1, ItemId_GetPrice(gSpecialVar_ItemId) / 2 * gTasks[taskId].data[1], STR_CONV_MODE_LEFT_ALIGN, 6);
StringExpandPlaceholders(gStringVar4, gOtherText_CanPay);
DisplayCannotUseItemMessage(taskId, gStringVar4, sub_80A6650, 1);
}
@@ -3115,7 +3109,7 @@ static void sub_80A6760(u8 taskId)
static void BuyMenuPrintItemQuantityAndPrice(u8 taskId)
{
sub_80A36B8(gBGTilemapBuffers[1], 0, 0, 31, 31);
- RemoveMoneyLabelObject(0, 0);
+ CloseMoneyWindow(0, 0);
MenuZeroFillWindowRect(0, 4, 13, 13);
MenuZeroFillWindowRect(0, 14, 29, 19);
gTasks[taskId].func = sub_80A6760;
@@ -3123,20 +3117,20 @@ static void BuyMenuPrintItemQuantityAndPrice(u8 taskId)
static void BuyMenuDisplayMessage(u16 itemId, u16 quantity)
{
- sub_80B7A94(ItemId_GetPrice(itemId) / 2 * quantity, 6, 6, 11);
+ PrintMoneyAmount(ItemId_GetPrice(itemId) / 2 * quantity, 6, 6, 11);
ConvertIntToDecimalStringN(gStringVar1, ItemId_GetPrice(itemId) / 2 * quantity, STR_CONV_MODE_LEFT_ALIGN, 6);
}
static void sub_80A683C(void)
{
- sub_80B7C14(gSaveBlock1.money, 0, 0);
+ OpenMoneyWindow(gSaveBlock1.money, 0, 0);
sub_80A4008(gBGTilemapBuffers[1], 1, 1, 12, 2);
}
static void sub_80A6870(u16 itemId, u8 quantity)
{
- sub_80B79B8(&gSaveBlock1.money, ItemId_GetPrice(itemId) / 2 * quantity);
- sub_80B7BEC(gSaveBlock1.money, 0, 0);
+ AddMoney(&gSaveBlock1.money, ItemId_GetPrice(itemId) / 2 * quantity);
+ UpdateMoneyWindow(gSaveBlock1.money, 0, 0);
}
static void sub_80A68A4(void)
@@ -3233,7 +3227,7 @@ static void sub_80A6A84(u8 taskId)
s16 *taskData = gTasks[taskId].data;
sub_80A4DA4(gBGTilemapBuffers[1]);
- CopyItemName(gScriptItemId, gStringVar1);
+ CopyItemName(gSpecialVar_ItemId, gStringVar1);
ConvertIntToDecimalStringN(gStringVar2, taskData[1], STR_CONV_MODE_LEFT_ALIGN, 3);
MenuZeroFillWindowRect(7, 6, 11, 13);
sub_80A7528(7);
@@ -3256,14 +3250,14 @@ static void sub_80A6B64(u8 taskId)
{
s16 *taskData = gTasks[taskId].data;
- if (ItemId_GetImportance(gScriptItemId) == 2)
+ if (ItemId_GetImportance(gSpecialVar_ItemId) == 2)
{
gTasks[taskId].func = sub_80A6B00;
sub_80A7528(9);
}
else
{
- if (AddPCItem(gScriptItemId, taskData[1]) == TRUE)
+ if (AddPCItem(gSpecialVar_ItemId, taskData[1]) == TRUE)
{
sub_80A6A84(taskId);
}
@@ -3331,7 +3325,7 @@ bool32 sub_80A6D1C(void)
FreezeMapObjects();
sub_80594C0();
sub_80597F4();
- gScriptItemId = gSaveBlock1.registeredItem;
+ gSpecialVar_ItemId = gSaveBlock1.registeredItem;
taskId = CreateTask(ItemId_GetFieldFunc(gSaveBlock1.registeredItem), 8);
gTasks[taskId].data[2] = 1;
return TRUE;
@@ -3421,7 +3415,7 @@ static const u8 gUnknown_083C170A[] = {5, 0};
static void sub_80A6FDC(void)
{
- if (ItemId_GetBattleUsage(gScriptItemId) != 0)
+ if (ItemId_GetBattleUsage(gSpecialVar_ItemId) != 0)
{
sPopupMenuActionList = gUnknown_083C1708;
gUnknown_02038564 = 2;
@@ -3460,10 +3454,10 @@ static void OnBagClose_Battle(u8 taskId)
static void HandlePopupMenuAction_UseInBattle(u8 taskId)
{
- if (ItemId_GetBattleFunc(gScriptItemId) != NULL)
+ if (ItemId_GetBattleFunc(gSpecialVar_ItemId) != NULL)
{
PlaySE(SE_SELECT);
- ItemId_GetBattleFunc(gScriptItemId)(taskId);
+ ItemId_GetBattleFunc(gSpecialVar_ItemId)(taskId);
}
}
@@ -3531,7 +3525,7 @@ static void sub_80A7230(u8 taskId)
PlaySE(SE_SELECT);
sub_80F98A4(2);
sub_80F98A4(3);
- gScriptItemId = ITEM_POKE_BALL;
+ gSpecialVar_ItemId = ITEM_POKE_BALL;
sPopupMenuActionList = gUnknown_083C1708;
gUnknown_02038564 = 2;
gTasks[taskId].data[10] = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos + 1;
@@ -3830,7 +3824,7 @@ static void sub_80A7768(void)
int var;
if (r4->unk1 == 1)
- text = sub_80A4B90(gScriptItemId);
+ text = sub_80A4B90(gSpecialVar_ItemId);
else
text = sItemPopupMenuActions[sPopupMenuActionList[r4->unk1 - 1]].text;
var = r4->unk1 - 1;
@@ -4086,11 +4080,11 @@ static const struct CompressedSpritePalette sBagSpritePalette = {gBagPalette, 30
static void sub_80A7998(struct Sprite *sprite)
{
sprite->animNum = 0;
- sprite->data0 = 0;
- sprite->data1 = 0;
- sprite->data2 = 0;
- sprite->data3 = 0;
- sprite->data4 = 0;
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
sprite->callback = sub_80A79B4;
}
@@ -4104,7 +4098,7 @@ static void sub_80A79B4(struct Sprite *sprite)
static void sub_80A79EC(struct Sprite *sprite)
{
- switch (sprite->data3)
+ switch (sprite->data[3])
{
case 0:
if (gUnknown_0203855B != 6)
@@ -4118,26 +4112,26 @@ static void sub_80A79EC(struct Sprite *sprite)
sprite->animBeginning = TRUE;
sprite->animNum = 0;
sprite->pos1.y -= 4;
- sprite->data0 = 4;
- sprite->data3 = 1;
+ sprite->data[0] = 4;
+ sprite->data[3] = 1;
sub_80A7AE4(sprite);
}
break;
case 1:
- if (sprite->data0 != 0)
+ if (sprite->data[0] != 0)
{
- if (sprite->data1 != 0)
+ if (sprite->data[1] != 0)
{
sprite->pos1.y++;
- sprite->data0--;
+ sprite->data[0]--;
}
- sprite->data1 = (sprite->data1 + 1) & 1;
+ sprite->data[1] = (sprite->data[1] + 1) & 1;
}
else
{
gUnknown_0203855B = -1;
- sprite->data1 = 0;
- sprite->data3 = 0;
+ sprite->data[1] = 0;
+ sprite->data[3] = 0;
}
break;
}
@@ -4145,17 +4139,17 @@ static void sub_80A79EC(struct Sprite *sprite)
static void sub_80A7A94(struct Sprite *sprite)
{
- switch (sprite->data4)
+ switch (sprite->data[4])
{
case 0:
sprite->oam.affineMode = 1;
sprite->affineAnims = sBagSpriteAffineAnimTable;
InitSpriteAffineAnim(sprite);
- sprite->data4 = 1;
+ sprite->data[4] = 1;
break;
case 1:
- sprite->data2++;
- if (sprite->data2 == 12)
+ sprite->data[2]++;
+ if (sprite->data[2] == 12)
sub_80A7AE4(sprite);
break;
}
@@ -4165,8 +4159,8 @@ static void sub_80A7AE4(struct Sprite *sprite)
{
gUnknown_0203855C = 0;
sprite->oam.affineMode = 0;
- sprite->data2 = 0;
- sprite->data4 = 0;
+ sprite->data[2] = 0;
+ sprite->data[4] = 0;
FreeOamMatrix(sprite->oam.matrixNum);
}
@@ -4234,45 +4228,45 @@ static const struct SpritePalette sPokeballSpritePalette = {gPalette_83C170C, 8}
static void sub_80A7B28(struct Sprite *sprite)
{
- sprite->data3 = 0;
- sprite->data0 = 0;
+ sprite->data[3] = 0;
+ sprite->data[0] = 0;
sub_80A7B6C(sprite);
sprite->callback = sub_80A7B6C;
}
static void sub_80A7B48(struct Sprite *sprite)
{
- sprite->centerToCornerVecX = sprite->data5 - ((sprite->data0 + 1) & 1);
- sprite->centerToCornerVecY = sprite->data6 - ((sprite->data0 + 1) & 1);
+ sprite->centerToCornerVecX = sprite->data[5] - ((sprite->data[0] + 1) & 1);
+ sprite->centerToCornerVecY = sprite->data[6] - ((sprite->data[0] + 1) & 1);
}
static void sub_80A7B6C(struct Sprite *sprite)
{
- if (sprite->data7 != 0)
+ if (sprite->data[7] != 0)
{
- switch (sprite->data3)
+ switch (sprite->data[3])
{
case 0:
sprite->oam.affineMode = 1;
- if (sprite->data7 == 1)
+ if (sprite->data[7] == 1)
sprite->affineAnims = gSpriteAffineAnimTable_83C1D20;
else
sprite->affineAnims = gSpriteAffineAnimTable_83C1D20 + 1;
InitSpriteAffineAnim(sprite);
- sprite->data3 = 1;
- sprite->data5 = sprite->centerToCornerVecX;
- sprite->data6 = sprite->centerToCornerVecY;
+ sprite->data[3] = 1;
+ sprite->data[5] = sprite->centerToCornerVecX;
+ sprite->data[6] = sprite->centerToCornerVecY;
sub_80A7B48(sprite);
break;
case 1:
- sprite->data0++;
+ sprite->data[0]++;
sub_80A7B48(sprite);
- if (sprite->data0 == 32)
+ if (sprite->data[0] == 32)
{
- sprite->data0 = 0;
- sprite->data3 = 0;
- sprite->centerToCornerVecX = sprite->data5;
- sprite->centerToCornerVecY = sprite->data6;
+ sprite->data[0] = 0;
+ sprite->data[3] = 0;
+ sprite->centerToCornerVecX = sprite->data[5];
+ sprite->centerToCornerVecY = sprite->data[6];
FreeOamMatrix(sprite->oam.matrixNum);
sprite->oam.affineMode = 0;
sprite->callback = SpriteCallbackDummy;
@@ -4297,7 +4291,7 @@ static void CreateBagPokeballSprite(u8 a)
{
LoadSpritePalette(&sPokeballSpritePalette);
sPokeballSpriteId = CreateSprite(&sPokeballSpriteTemplate, 16, 88, 0);
- gSprites[sPokeballSpriteId].data7 = a;
+ gSprites[sPokeballSpriteId].data[7] = a;
}
static void sub_80A7C64(void)
@@ -4492,7 +4486,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);
}
}
@@ -4505,7 +4499,7 @@ u8 CreateBerrySprite(u8 berryId, s16 x, s16 y)
static void SpriteCB_BerrySprite(struct Sprite *sprite)
{
- sprite->pos2.y = -gUnknown_030041B4;
+ sprite->pos2.y = -gBattle_BG1_Y;
}
void sub_80A7DD4(void)
diff --git a/src/item_use.c b/src/field/item_use.c
index 1750c1584..e1fdddce0 100644
--- a/src/item_use.c
+++ b/src/field/item_use.c
@@ -14,7 +14,8 @@
#include "fieldmap.h"
#include "item.h"
#include "item_menu.h"
-#include "items.h"
+#include "constants/flags.h"
+#include "constants/items.h"
#include "mail.h"
#include "main.h"
#include "map_obj_lock.h"
@@ -26,20 +27,20 @@
#include "pokeblock.h"
#include "pokemon_item_effect.h"
#include "pokemon_menu.h"
-#include "rom4.h"
+#include "overworld.h"
#include "rom_8094928.h"
#include "script.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "string_util.h"
#include "strings.h"
#include "task.h"
-#include "vars.h"
+#include "constants/vars.h"
-extern void (* gUnknown_03005D00)(u8);
-extern void (* gFieldCallback)(void);
-extern void (* gUnknown_0300485C)(void);
-extern void (* gUnknown_03004AE4)(u8, u16, TaskFunc);
+extern void (*gFieldItemUseCallback)(u8);
+extern void (*gFieldCallback)(void);
+extern void (*gUnknown_0300485C)(void);
+extern void (*gUnknown_03004AE4)(u8, u16, TaskFunc);
extern u8 gUnknown_02038561;
extern u8 gLastFieldPokeMenuOpened;
@@ -80,10 +81,10 @@ void ExecuteSwitchToOverworldFromItemUse(u8 taskId)
{
u8 taskData;
- if (gScriptItemId == 0xAF)
+ if (gSpecialVar_ItemId == 0xAF)
taskData = gTasks[taskId].data[15] - 1;
else
- taskData = ItemId_GetType(gScriptItemId) - 1;
+ taskData = ItemId_GetType(gSpecialVar_ItemId) - 1;
gTasks[taskId].data[8] = (u32)gExitToOverworldFuncList[taskData] >> 16;
gTasks[taskId].data[9] = (u32)gExitToOverworldFuncList[taskData];
@@ -106,11 +107,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)
@@ -155,7 +158,7 @@ void ItemMenu_ReadMail(u8 taskId)
if (!gPaletteFade.active)
{
- mailStruct.itemId = gScriptItemId;
+ mailStruct.itemId = gSpecialVar_ItemId;
HandleReadMail(&mailStruct, sub_80A5D04, 0);
DestroyTask(taskId);
}
@@ -175,7 +178,7 @@ void ItemUseOutOfBattle_Bike(u8 taskId)
PlayerGetDestCoords(&x, &y);
tileBehavior = MapGridGetMetatileBehaviorAt(x, y);
- if (FlagGet(SYS_CYCLING_ROAD) == TRUE // on cycling road?
+ if (FlagGet(FLAG_SYS_CYCLING_ROAD) == TRUE // on cycling road?
|| MetatileBehavior_IsVerticalRail(tileBehavior) == TRUE
|| MetatileBehavior_IsHorizontalRail(tileBehavior) == TRUE
|| MetatileBehavior_IsIsolatedVerticalRail(tileBehavior) == TRUE
@@ -185,9 +188,9 @@ void ItemUseOutOfBattle_Bike(u8 taskId)
}
else
{
- if (IsBikingAllowedByMap() == TRUE && IsBikingDisallowedByPlayer() == FALSE)
+ if (Overworld_IsBikingAllowed() == TRUE && IsBikingDisallowedByPlayer() == FALSE)
{
- gUnknown_03005D00 = (void *)ItemUseOnFieldCB_Bike;
+ gFieldItemUseCallback = (void *)ItemUseOnFieldCB_Bike;
SetUpItemUseOnFieldCallback(taskId);
}
else
@@ -197,9 +200,9 @@ void ItemUseOutOfBattle_Bike(u8 taskId)
void ItemUseOnFieldCB_Bike(u8 taskId)
{
- if (ItemId_GetSecondaryId(gScriptItemId) == 0)
+ if (ItemId_GetSecondaryId(gSpecialVar_ItemId) == 0)
GetOnOffBike(2);
- if (ItemId_GetSecondaryId(gScriptItemId) == 1)
+ if (ItemId_GetSecondaryId(gSpecialVar_ItemId) == 1)
GetOnOffBike(4);
sub_8064E2C();
@@ -241,7 +244,7 @@ void ItemUseOutOfBattle_Rod(u8 taskId)
{
if (CanFish() == TRUE)
{
- gUnknown_03005D00 = (void *)ItemUseOnFieldCB_Rod;
+ gFieldItemUseCallback = (void *)ItemUseOnFieldCB_Rod;
SetUpItemUseOnFieldCallback(taskId);
}
else
@@ -250,14 +253,14 @@ void ItemUseOutOfBattle_Rod(u8 taskId)
void ItemUseOnFieldCB_Rod(u8 taskId)
{
- StartFishing(ItemId_GetSecondaryId(gScriptItemId));
+ StartFishing(ItemId_GetSecondaryId(gSpecialVar_ItemId));
DestroyTask(taskId);
}
void ItemUseOutOfBattle_Itemfinder(u8 var)
{
IncrementGameStat(0x27);
- gUnknown_03005D00 = (void *)ItemUseOnFieldCB_Itemfinder;
+ gFieldItemUseCallback = (void *)ItemUseOnFieldCB_Itemfinder;
SetUpItemUseOnFieldCallback(var);
}
@@ -326,7 +329,7 @@ bool8 ItemfinderCheckForHiddenItems(struct MapEvents *events, u8 taskId)
for (i = 0; i < events->bgEventCount; i++)
{
- if ((events -> bgEvents[i].kind == 7) && !FlagGet(events -> bgEvents[i].bgUnion.hiddenItem.hiddenItemId + 600))
+ if ((events -> bgEvents[i].kind == 7) && !FlagGet(events -> bgEvents[i].bgUnion.hiddenItem.hiddenItemId + FLAG_HIDDEN_ITEMS_START))
{
// do a distance lookup of each item so long as the index remains less than the objects on the current map.
distanceX = (u16)events -> bgEvents[i].x + 7;
@@ -342,7 +345,7 @@ bool8 ItemfinderCheckForHiddenItems(struct MapEvents *events, u8 taskId)
sub_80C9720(taskId);
// hidden item detected?
- if(gTasks[taskId].data[2] == TRUE)
+ if (gTasks[taskId].data[2] == TRUE)
return TRUE;
else
return FALSE;
@@ -354,11 +357,11 @@ bool8 HiddenItemAtPos(struct MapEvents *events, s16 x, s16 y)
struct BgEvent *bgEvent = events->bgEvents;
int i;
- for(i = 0; i < bgEventCount; i++)
+ for (i = 0; i < bgEventCount; i++)
{
- if(bgEvent[i].kind == 7 && x == (u16)bgEvent[i].x && y == (u16)bgEvent[i].y) // hidden item and coordinates matches x and y passed?
+ if (bgEvent[i].kind == 7 && x == (u16)bgEvent[i].x && y == (u16)bgEvent[i].y) // hidden item and coordinates matches x and y passed?
{
- if(!FlagGet(bgEvent[i].bgUnion.hiddenItem.hiddenItemId + 600))
+ if (!FlagGet(bgEvent[i].bgUnion.hiddenItem.hiddenItemId + FLAG_HIDDEN_ITEMS_START))
return TRUE;
else
return FALSE;
@@ -376,7 +379,7 @@ bool8 sub_80C9688(struct MapConnection *connection, int x, int y)
mapHeader = mapconnection_get_mapheader(connection);
- switch(connection->direction)
+ switch (connection->direction)
{
// same weird temp variable behavior seen in HiddenItemAtPos
case 2:
@@ -592,7 +595,7 @@ void sub_80C9838(u8 taskId, s16 x, s16 y)
s16 *data = gTasks[taskId].data;
s16 var1, var2, var3, var4;
- if(data[2] == FALSE)
+ if (data[2] == FALSE)
{
data[0] = x;
data[1] = y;
@@ -602,34 +605,34 @@ void sub_80C9838(u8 taskId, s16 x, s16 y)
{
// data[0] and data[1] contain the player's coordinates.
// x and y contain the item's coordinates.
- if(data[0] < 0)
+ if (data[0] < 0)
var1 = data[0] * -1; // item is to the left
else
var1 = data[0]; // item is to the right
- if(data[1] < 0)
+ if (data[1] < 0)
var2 = data[1] * -1; // item is to the north
else
var2 = data[1]; // item is to the south
- if(x < 0)
+ if (x < 0)
var3 = x * -1;
else
var3 = x;
- if(y < 0)
+ if (y < 0)
var4 = y * -1;
else
var4 = y;
- if(var1 + var2 > var3 + var4)
+ if (var1 + var2 > var3 + var4)
{
data[0] = x;
data[1] = y;
}
else
{
- if(var1 + var2 == var3 + var4 && (var2 > var4 || (var2 == var4 && data[1] < y)))
+ if (var1 + var2 == var3 + var4 && (var2 > var4 || (var2 == var4 && data[1] < y)))
{
data[0] = x;
data[1] = y;
@@ -642,40 +645,40 @@ u8 GetPlayerDirectionTowardsHiddenItem(s16 itemX, s16 itemY)
{
s16 abX, abY;
- if(itemX == 0 && itemY == 0)
+ if (itemX == 0 && itemY == 0)
return DIR_NONE; // player is standing on the item.
// get absolute X distance.
- if(itemX < 0)
+ if (itemX < 0)
abX = itemX * -1;
else
abX = itemX;
// get absolute Y distance.
- if(itemY < 0)
+ if (itemY < 0)
abY = itemY * -1;
else
abY = itemY;
- if(abX > abY)
+ if (abX > abY)
{
- if(itemX < 0)
+ if (itemX < 0)
return DIR_EAST;
else
return DIR_NORTH;
}
else
{
- if(abX < abY)
+ if (abX < abY)
{
- if(itemY < 0)
+ if (itemY < 0)
return DIR_SOUTH;
else
return DIR_WEST;
}
- if(abX == abY)
+ if (abX == abY)
{
- if(itemY < 0)
+ if (itemY < 0)
return DIR_SOUTH;
else
return DIR_WEST;
@@ -694,7 +697,7 @@ void SetPlayerDirectionTowardsItem(u8 direction)
void DisplayItemRespondingMessageAndExitItemfinder(u8 taskId)
{
- if(FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE)
+ if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE)
DisplayItemMessageOnField(taskId, gOtherText_ItemfinderResponding, ExitItemfinder, 0);
}
@@ -702,7 +705,7 @@ void RotatePlayerAndExitItemfinder(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- if(FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE
+ if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE
|| data[2] == FALSE)
{
SetPlayerDirectionTowardsItem(gItemFinderDirections[data[5]]);
@@ -710,18 +713,18 @@ void RotatePlayerAndExitItemfinder(u8 taskId)
data[5] = (data[5] + 1) & 3;
data[3]++;
- if(data[3] == 4)
+ if (data[3] == 4)
DisplayItemMessageOnField(taskId, gOtherText_ItemfinderItemUnderfoot, ExitItemfinder, 0);
}
}
void ItemUseOutOfBattle_PokeblockCase(u8 taskId)
{
- if(sub_80F9344() == TRUE)
+ if (sub_80F9344() == TRUE)
{
DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]);
}
- else if(gTasks[taskId].data[2] != TRUE)
+ else if (gTasks[taskId].data[2] != TRUE)
{
sub_810BA7C(0);
ItemMenu_ConfirmNormalFade(taskId);
@@ -739,7 +742,7 @@ void ItemUseOutOfBattle_CoinCase(u8 taskId)
ConvertIntToDecimalStringN(gStringVar1, GetCoins(), 0, 4);
StringExpandPlaceholders(gStringVar4, gOtherText_Coins3);
- if(!gTasks[taskId].data[2])
+ if (!gTasks[taskId].data[2])
{
MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14);
DisplayItemMessageOnField(taskId, gStringVar4, CleanUpItemMenuMessage, 1);
@@ -752,35 +755,35 @@ void ItemUseOutOfBattle_CoinCase(u8 taskId)
void sub_80C9BB8(u8 var)
{
- if(gMain.newKeys & A_BUTTON)
+ if (gMain.newKeys & A_BUTTON)
CleanUpItemMenuMessage(var);
}
void sub_80C9BD8(u8 var)
{
- if(gMain.newKeys & A_BUTTON)
+ if (gMain.newKeys & A_BUTTON)
CleanUpOverworldMessage(var);
}
// unused
void ItemUseOutOfBattle_SSTicket(u8 taskId)
{
- if(gTasks[taskId].data[2] == 0)
+ if (gTasks[taskId].data[2] == 0)
{
MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14);
- DisplayItemMessageOnField(taskId, gUnknown_083D61DC[ItemId_GetSecondaryId(gScriptItemId)], sub_80C9BB8, 1);
+ DisplayItemMessageOnField(taskId, gUnknown_083D61DC[ItemId_GetSecondaryId(gSpecialVar_ItemId)], sub_80C9BB8, 1);
}
else
{
- DisplayItemMessageOnField(taskId, gUnknown_083D61DC[ItemId_GetSecondaryId(gScriptItemId)], sub_80C9BD8, 0);
+ DisplayItemMessageOnField(taskId, gUnknown_083D61DC[ItemId_GetSecondaryId(gSpecialVar_ItemId)], sub_80C9BD8, 0);
}
}
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;
@@ -789,13 +792,13 @@ void sub_80C9C7C(u8 taskId)
}
else
{
- ItemId_GetFieldFunc(gScriptItemId)(taskId);
+ ItemId_GetFieldFunc(gSpecialVar_ItemId)(taskId);
}
}
void sub_80C9D00(u8 taskId)
{
- RemoveBagItem(gScriptItemId, 1);
+ RemoveBagItem(gSpecialVar_ItemId, 1);
ScriptContext2_Enable();
ScriptContext1_SetupScript(gUnknown_081A1654);
DestroyTask(taskId);
@@ -803,9 +806,9 @@ void sub_80C9D00(u8 taskId)
void ItemUseOutOfBattle_WailmerPail(u8 taskId)
{
- if(TryToWaterBerryTree() == TRUE)
+ if (TryToWaterBerryTree() == TRUE)
{
- gUnknown_03005D00 = sub_80C9D74;
+ gFieldItemUseCallback = sub_80C9D74;
SetUpItemUseOnFieldCallback(taskId);
}
else
@@ -839,9 +842,9 @@ void ItemUseOutOfBattle_SacredAsh(u8 taskId)
gLastFieldPokeMenuOpened = 0;
- for(i = 0; i < 6; i++)
+ for (i = 0; i < 6; i++)
{
- if(GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != 0 && GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0)
+ if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != 0 && GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0)
{
gLastFieldPokeMenuOpened = i;
break;
@@ -874,7 +877,7 @@ void ItemUseOutOfBattle_TMHM(u8 taskId)
{
MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14);
- if(gScriptItemId >= ITEM_HM01)
+ if (gSpecialVar_ItemId >= ITEM_HM01)
DisplayItemMessageOnField(taskId, gOtherText_BootedHM, sub_80C9EE4, 1); // HM
else
DisplayItemMessageOnField(taskId, gOtherText_BootedTM, sub_80C9EE4, 1); // TM
@@ -882,15 +885,15 @@ void ItemUseOutOfBattle_TMHM(u8 taskId)
void sub_80C9EE4(u8 taskId)
{
- PlaySE(2);
+ PlaySE(SE_PC_LOGON);
gTasks[taskId].func = sub_80C9F10;
}
void sub_80C9F10(u8 taskId)
{
- if(gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON)
+ if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON)
{
- StringCopy(gStringVar1, gMoveNames[ItemIdToBattleMoveId(gScriptItemId)]);
+ StringCopy(gStringVar1, gMoveNames[ItemIdToBattleMoveId(gSpecialVar_ItemId)]);
StringExpandPlaceholders(gStringVar4, gOtherText_ContainsMove);
DisplayItemMessageOnField(taskId, gStringVar4, sub_80C9F80, 1);
}
@@ -909,20 +912,20 @@ void sub_80C9FC0(u8 var)
sub_80C9D98(var);
}
-void sub_80C9FDC(void)
+static void PrepareItemUseMessage(void)
{
- RemoveBagItem(gScriptItemId, 1);
+ RemoveBagItem(gSpecialVar_ItemId, 1);
sub_80A3E0C();
- CopyItemName(gScriptItemId, gStringVar2);
+ CopyItemName(gSpecialVar_ItemId, gStringVar2);
StringExpandPlaceholders(gStringVar4, gOtherText_UsedItem);
}
void ItemUseOutOfBattle_Repel(u8 var)
{
- if(VarGet(VAR_REPEL_STEP_COUNT) == FALSE)
+ if (VarGet(VAR_REPEL_STEP_COUNT) == 0)
{
- VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(gScriptItemId));
- sub_80C9FDC();
+ VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(gSpecialVar_ItemId));
+ PrepareItemUseMessage();
DisplayItemMessageOnField(var, gStringVar4, CleanUpItemMenuMessage, 1);
}
else
@@ -934,33 +937,33 @@ void ItemUseOutOfBattle_Repel(u8 var)
void sub_80CA07C(void)
{
sub_80A3E0C();
- CopyItemName(gScriptItemId, gStringVar2);
+ CopyItemName(gSpecialVar_ItemId, gStringVar2);
}
void sub_80CA098(u8 taskId)
{
if(++gTasks[taskId].data[15] > 7)
{
- PlaySE(0x75);
+ PlaySE(SE_BIDORO);
DisplayItemMessageOnField(taskId, gStringVar4, CleanUpItemMenuMessage, 1);
}
}
void ItemUseOutOfBattle_BlackWhiteFlute(u8 taskId)
{
- if(gScriptItemId == 43)
+ if (gSpecialVar_ItemId == ITEM_WHITE_FLUTE)
{
- FlagSet(SYS_ENC_UP_ITEM);
- FlagReset(SYS_ENC_DOWN_ITEM);
+ FlagSet(FLAG_SYS_ENC_UP_ITEM);
+ FlagClear(FLAG_SYS_ENC_DOWN_ITEM);
sub_80CA07C();
StringExpandPlaceholders(gStringVar4, gOtherText_UsedFlute);
gTasks[taskId].func = sub_80CA098;
gTasks[taskId].data[15] = 0;
}
- else if(gScriptItemId == 42)
+ else if (gSpecialVar_ItemId == ITEM_BLACK_FLUTE)
{
- FlagSet(SYS_ENC_DOWN_ITEM);
- FlagReset(SYS_ENC_UP_ITEM);
+ FlagSet(FLAG_SYS_ENC_DOWN_ITEM);
+ FlagClear(FLAG_SYS_ENC_UP_ITEM);
sub_80CA07C();
StringExpandPlaceholders(gStringVar4, gOtherText_UsedRepel);
gTasks[taskId].func = sub_80CA098;
@@ -975,17 +978,17 @@ 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);
}
-bool8 sub_80CA1C8(void)
+bool8 CanUseEscapeRopeOnCurrMap(void)
{
- if(gMapHeader.mapType == MAP_TYPE_UNDERGROUND)
+ if (gMapHeader.mapType == MAP_TYPE_UNDERGROUND)
return TRUE;
else
return FALSE;
@@ -993,9 +996,9 @@ bool8 sub_80CA1C8(void)
void ItemUseOutOfBattle_EscapeRope(u8 taskId)
{
- if(sub_80CA1C8() == TRUE) // is map type an area you can use escape rope?
+ if (CanUseEscapeRopeOnCurrMap() == TRUE)
{
- gUnknown_03005D00 = sub_80CA18C;
+ gFieldItemUseCallback = EscapeRopeCallback;
SetUpItemUseOnFieldCallback(taskId);
}
else
@@ -1012,9 +1015,9 @@ void ItemUseOutOfBattle_EvolutionStone(u8 var)
void ItemUseInBattle_PokeBall(u8 var)
{
- if(PlayerPartyAndPokemonStorageFull() == FALSE) // have room for mon?
+ if (PlayerPartyAndPokemonStorageFull() == FALSE) // have room for mon?
{
- RemoveBagItem(gScriptItemId, 1);
+ RemoveBagItem(gSpecialVar_ItemId, 1);
sub_80A7094(var);
}
else
@@ -1026,7 +1029,7 @@ void ItemUseInBattle_PokeBall(u8 var)
void sub_80CA294(u8 var)
{
- if(gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON)
+ if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON)
sub_80A7094(var);
}
@@ -1034,9 +1037,9 @@ void sub_80CA2BC(u8 taskId)
{
if(++gTasks[taskId].data[15] > 7)
{
- PlaySE(1);
- RemoveBagItem(gScriptItemId, 1);
- DisplayItemMessageOnField(taskId, sub_803F378(gScriptItemId), sub_80CA294, 1);
+ PlaySE(SE_KAIFUKU);
+ RemoveBagItem(gSpecialVar_ItemId, 1);
+ DisplayItemMessageOnField(taskId, sub_803F378(gSpecialVar_ItemId), sub_80CA294, 1);
}
}
@@ -1046,7 +1049,7 @@ void ItemUseInBattle_StatIncrease(u8 taskId)
MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14);
- if(ExecuteTableBasedItemEffect_(&gPlayerParty[partyId], gScriptItemId, partyId, 0) != FALSE)
+ if (ExecuteTableBasedItemEffect_(&gPlayerParty[partyId], gSpecialVar_ItemId, partyId, 0) != FALSE)
{
DisplayItemMessageOnField(taskId, gOtherText_WontHaveAnyEffect, CleanUpItemMenuMessage, 1);
}
@@ -1059,7 +1062,7 @@ void ItemUseInBattle_StatIncrease(u8 taskId)
void sub_80CA394(u8 taskId)
{
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
{
sub_8094E4C();
gpu_pal_allocator_reset__manage_upper_four();
@@ -1095,9 +1098,9 @@ void unref_sub_80CA448(u8 var)
{
MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14);
- if(ExecuteTableBasedItemEffect__(0, gScriptItemId, 0) == FALSE)
+ if (ExecuteTableBasedItemEffect__(0, gSpecialVar_ItemId, 0) == FALSE)
{
- RemoveBagItem(gScriptItemId, 1);
+ RemoveBagItem(gSpecialVar_ItemId, 1);
GetMonNickname(&gPlayerParty[0], gStringVar1);
StringExpandPlaceholders(gStringVar4, gOtherText_SnapConfusion);
DisplayItemMessageOnField(var, gStringVar4, sub_80A7094, 1);
@@ -1114,7 +1117,7 @@ void ItemUseInBattle_Escape(u8 taskId)
if((gBattleTypeFlags & BATTLE_TYPE_TRAINER) == FALSE)
{
- sub_80C9FDC();
+ PrepareItemUseMessage();
DisplayItemMessageOnField(taskId, gStringVar4, sub_80A7094, 1);
}
else
@@ -1125,7 +1128,7 @@ void ItemUseInBattle_Escape(u8 taskId)
void ItemUseOutOfBattle_EnigmaBerry(u8 taskId)
{
- switch(GetItemEffectType(gScriptItemId) - 1)
+ switch (GetItemEffectType(gSpecialVar_ItemId) - 1)
{
case 1:
case 2:
@@ -1168,7 +1171,7 @@ void ItemUseOutOfBattle_EnigmaBerry(u8 taskId)
void ItemUseInBattle_EnigmaBerry(u8 taskId)
{
- switch(GetItemEffectType(gScriptItemId))
+ switch (GetItemEffectType(gSpecialVar_ItemId))
{
case 0:
ItemUseInBattle_StatIncrease(taskId);
diff --git a/src/field/landmark.c b/src/field/landmark.c
new file mode 100644
index 000000000..476821ec6
--- /dev/null
+++ b/src/field/landmark.c
@@ -0,0 +1,417 @@
+#include "global.h"
+#include "landmark.h"
+#include "event_data.h"
+#include "region_map_sections.h"
+
+struct Landmark
+{
+ const u8 *name;
+ u16 flag;
+};
+
+struct LandmarkList
+{
+ u8 mapSection;
+ u8 id;
+ const struct Landmark *const *landmarks;
+};
+
+extern const u8 gLandmarkName_FlowerShop[];
+extern const u8 gLandmarkName_PetalburgWoods[];
+extern const u8 gLandmarkName_MrBrineysCottage[];
+extern const u8 gLandmarkName_AbandonedShip[];
+extern const u8 gLandmarkName_SeashoreHouse[];
+extern const u8 gLandmarkName_SlateportBeach[];
+extern const u8 gLandmarkName_CyclingRoad[];
+extern const u8 gLandmarkName_NewMauville[];
+extern const u8 gLandmarkName_TrickHouse[];
+extern const u8 gLandmarkName_OldLadysRestShop[];
+extern const u8 gLandmarkName_Desert[];
+extern const u8 gLandmarkName_WinstrateFamily[];
+extern const u8 gLandmarkName_CableCar[];
+extern const u8 gLandmarkName_GlassWorkshop[];
+extern const u8 gLandmarkName_WeatherInstitute[];
+extern const u8 gLandmarkName_MeteorFalls[];
+extern const u8 gLandmarkName_TunnelersRestHouse[];
+extern const u8 gLandmarkName_RusturfTunnel[];
+extern const u8 gLandmarkName_PokemonDayCare[];
+extern const u8 gLandmarkName_SafariZoneEntrance[];
+extern const u8 gLandmarkName_MtPyre[];
+extern const u8 gLandmarkName_ShoalCave[];
+extern const u8 gLandmarkName_SeafloorCavern[];
+extern const u8 gLandmarkName_GraniteCave[];
+extern const u8 gLandmarkName_OceanCurrent[];
+extern const u8 gLandmarkName_LanettesHouse[];
+extern const u8 gLandmarkName_FieryPath[];
+extern const u8 gLandmarkName_JaggedPass[];
+extern const u8 gLandmarkName_BerryMastersHouse[];
+extern const u8 gLandmarkName_IslandCave[];
+extern const u8 gLandmarkName_DesertRuins[];
+extern const u8 gLandmarkName_ScorchedSlab[];
+extern const u8 gLandmarkName_AncientTomb[];
+extern const u8 gLandmarkName_SealedChamber[];
+extern const u8 gLandmarkName_FossilManiacsHouse[];
+extern const u8 gLandmarkName_HuntersHouse[];
+extern const u8 gLandmarkName_SkyPillar[];
+
+static const struct Landmark Landmark_FlowerShop = {gLandmarkName_FlowerShop, FLAG_LANDMARK_FLOWER_SHOP};
+static const struct Landmark Landmark_PetalburgWoods = {gLandmarkName_PetalburgWoods, -1};
+static const struct Landmark Landmark_MrBrineysCottage = {gLandmarkName_MrBrineysCottage, FLAG_LANDMARK_MR_BRINEY_HOUSE};
+static const struct Landmark Landmark_AbandonedShip = {gLandmarkName_AbandonedShip, FLAG_LANDMARK_ABANDONED_SHIP};
+static const struct Landmark Landmark_SeashoreHouse = {gLandmarkName_SeashoreHouse, FLAG_LANDMARK_SEASHORE_HOUSE};
+static const struct Landmark Landmark_SlateportBeach = {gLandmarkName_SlateportBeach, -1};
+static const struct Landmark Landmark_CyclingRoad = {gLandmarkName_CyclingRoad, -1};
+static const struct Landmark Landmark_NewMauville = {gLandmarkName_NewMauville, FLAG_LANDMARK_NEW_MAUVILLE};
+static const struct Landmark Landmark_TrickHouse = {gLandmarkName_TrickHouse, FLAG_LANDMARK_TRICK_HOUSE};
+static const struct Landmark Landmark_OldLadysRestShop = {gLandmarkName_OldLadysRestShop, FLAG_LANDMARK_OLD_LADY_REST_SHOP};
+static const struct Landmark Landmark_Desert = {gLandmarkName_Desert, -1};
+static const struct Landmark Landmark_WinstrateFamily = {gLandmarkName_WinstrateFamily, FLAG_LANDMARK_WINSTRATE_FAMILY};
+static const struct Landmark Landmark_CableCar = {gLandmarkName_CableCar, -1};
+static const struct Landmark Landmark_GlassWorkshop = {gLandmarkName_GlassWorkshop, FLAG_LANDMARK_GLASS_WORKSHOP};
+static const struct Landmark Landmark_WeatherInstitute = {gLandmarkName_WeatherInstitute, -1};
+static const struct Landmark Landmark_MeteorFalls = {gLandmarkName_MeteorFalls, -1};
+static const struct Landmark Landmark_TunnelersRestHouse = {gLandmarkName_TunnelersRestHouse, FLAG_LANDMARK_TUNNELERS_REST_HOUSE};
+static const struct Landmark Landmark_RusturfTunnel = {gLandmarkName_RusturfTunnel, -1};
+static const struct Landmark Landmark_PokemonDayCare = {gLandmarkName_PokemonDayCare, FLAG_LANDMARK_POKEMON_DAYCARE};
+static const struct Landmark Landmark_SafariZoneEntrance = {gLandmarkName_SafariZoneEntrance, -1};
+static const struct Landmark Landmark_MtPyre = {gLandmarkName_MtPyre, -1};
+static const struct Landmark Landmark_ShoalCave = {gLandmarkName_ShoalCave, -1};
+static const struct Landmark Landmark_SeafloorCavern = {gLandmarkName_SeafloorCavern, FLAG_LANDMARK_SEAFLOOR_CAVERN};
+static const struct Landmark Landmark_GraniteCave = {gLandmarkName_GraniteCave, -1};
+static const struct Landmark Landmark_OceanCurrent = {gLandmarkName_OceanCurrent, -1};
+static const struct Landmark Landmark_LanettesHouse = {gLandmarkName_LanettesHouse, FLAG_LANDMARK_LANETTES_HOUSE};
+static const struct Landmark Landmark_FieryPath = {gLandmarkName_FieryPath, FLAG_LANDMARK_FIERY_PATH};
+static const struct Landmark Landmark_JaggedPass = {gLandmarkName_JaggedPass, -1};
+static const struct Landmark Landmark_BerryMastersHouse = {gLandmarkName_BerryMastersHouse, FLAG_LANDMARK_BERRY_MASTERS_HOUSE};
+static const struct Landmark Landmark_IslandCave = {gLandmarkName_IslandCave, FLAG_LANDMARK_ISLAND_CAVE};
+static const struct Landmark Landmark_DesertRuins = {gLandmarkName_DesertRuins, FLAG_LANDMARK_DESERT_RUINS};
+static const struct Landmark Landmark_ScorchedSlab = {gLandmarkName_ScorchedSlab, FLAG_LANDMARK_SCORCHED_SLAB};
+static const struct Landmark Landmark_AncientTomb = {gLandmarkName_AncientTomb, FLAG_LANDMARK_ANCIENT_TOMB};
+static const struct Landmark Landmark_SealedChamber = {gLandmarkName_SealedChamber, FLAG_LANDMARK_SEALED_CHAMBER};
+static const struct Landmark Landmark_FossilManiacsHouse = {gLandmarkName_FossilManiacsHouse, FLAG_LANDMARK_FOSSIL_MANIACS_HOUSE};
+static const struct Landmark Landmark_HuntersHouse = {gLandmarkName_HuntersHouse, FLAG_LANDMARK_HUNTERS_HOUSE};
+static const struct Landmark Landmark_SkyPillar = {gLandmarkName_SkyPillar, FLAG_LANDMARK_SKY_PILLAR};
+
+static const struct Landmark *const Landmarks_Route104_0[] =
+{
+ &Landmark_FlowerShop,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route104_1[] =
+{
+ &Landmark_PetalburgWoods,
+ &Landmark_MrBrineysCottage,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route105_0[] =
+{
+ &Landmark_IslandCave,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route106_1[] =
+{
+ &Landmark_GraniteCave,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route108_0[] =
+{
+ &Landmark_AbandonedShip,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route109_0[] =
+{
+ &Landmark_SeashoreHouse,
+ &Landmark_SlateportBeach,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route110_0[] =
+{
+ &Landmark_CyclingRoad,
+ &Landmark_NewMauville,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route110_1[] =
+{
+ &Landmark_CyclingRoad,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route110_2[] =
+{
+ &Landmark_CyclingRoad,
+ &Landmark_TrickHouse,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route111_0[] =
+{
+ &Landmark_OldLadysRestShop,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route111_1[] =
+{
+ &Landmark_Desert,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route111_3[] =
+{
+ &Landmark_DesertRuins,
+ &Landmark_Desert,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route111_4[] =
+{
+ &Landmark_WinstrateFamily,
+ &Landmark_Desert,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route112_0[] =
+{
+ &Landmark_FieryPath,
+ &Landmark_JaggedPass,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route112_1[] =
+{
+ &Landmark_CableCar,
+ &Landmark_FieryPath,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route113_1[] =
+{
+ &Landmark_GlassWorkshop,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route114_1[] =
+{
+ &Landmark_FossilManiacsHouse,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route114_2[] =
+{
+ &Landmark_LanettesHouse,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_MeteorFalls[] =
+{
+ &Landmark_MeteorFalls,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route116_1[] =
+{
+ &Landmark_TunnelersRestHouse,
+ &Landmark_RusturfTunnel,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route116_2[] =
+{
+ &Landmark_RusturfTunnel,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route117_2[] =
+{
+ &Landmark_PokemonDayCare,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route119_1[] =
+{
+ &Landmark_WeatherInstitute,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route120_0[] =
+{
+ &Landmark_ScorchedSlab,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route120_2[] =
+{
+ &Landmark_AncientTomb,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route121_2[] =
+{
+ &Landmark_SafariZoneEntrance,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route122_0[] =
+{
+ &Landmark_MtPyre,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route123_0[] =
+{
+ &Landmark_BerryMastersHouse,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route124_7[] =
+{
+ &Landmark_HuntersHouse,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route125_2[] =
+{
+ &Landmark_ShoalCave,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route128_1[] =
+{
+ &Landmark_SeafloorCavern,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route131_1[] =
+{
+ &Landmark_SkyPillar,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_OceanCurrent[] =
+{
+ &Landmark_OceanCurrent,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_Route134_2[] =
+{
+ &Landmark_SealedChamber,
+ &Landmark_OceanCurrent,
+ NULL,
+};
+
+static const struct Landmark *const Landmarks_MtChimney_2[] =
+{
+ &Landmark_CableCar,
+ &Landmark_JaggedPass,
+ NULL,
+};
+
+static const struct LandmarkList gLandmarkLists[] =
+{
+ {MAPSEC_Route104, 0, Landmarks_Route104_0},
+ {MAPSEC_Route104, 1, Landmarks_Route104_1},
+ {MAPSEC_Route105, 0, Landmarks_Route105_0},
+ {MAPSEC_Route106, 1, Landmarks_Route106_1},
+ {MAPSEC_Route108, 0, Landmarks_Route108_0},
+ {MAPSEC_Route109, 0, Landmarks_Route109_0},
+ {MAPSEC_Route110, 0, Landmarks_Route110_0},
+ {MAPSEC_Route110, 1, Landmarks_Route110_1},
+ {MAPSEC_Route110, 2, Landmarks_Route110_2},
+ {MAPSEC_Route111, 0, Landmarks_Route111_0},
+ {MAPSEC_Route111, 1, Landmarks_Route111_1},
+ {MAPSEC_Route111, 2, Landmarks_Route111_1},
+ {MAPSEC_Route111, 3, Landmarks_Route111_3},
+ {MAPSEC_Route111, 4, Landmarks_Route111_4},
+ {MAPSEC_Route112, 0, Landmarks_Route112_0},
+ {MAPSEC_Route112, 1, Landmarks_Route112_1},
+ {MAPSEC_Route113, 1, Landmarks_Route113_1},
+ {MAPSEC_Route114, 1, Landmarks_Route114_1},
+ {MAPSEC_Route114, 2, Landmarks_Route114_2},
+ {MAPSEC_Route114, 3, Landmarks_MeteorFalls},
+ {MAPSEC_Route115, 0, Landmarks_MeteorFalls},
+ {MAPSEC_Route115, 1, Landmarks_MeteorFalls},
+ {MAPSEC_Route116, 1, Landmarks_Route116_1},
+ {MAPSEC_Route116, 2, Landmarks_Route116_2},
+ {MAPSEC_Route117, 2, Landmarks_Route117_2},
+ {MAPSEC_Route119, 1, Landmarks_Route119_1},
+ {MAPSEC_Route120, 0, Landmarks_Route120_0},
+ {MAPSEC_Route120, 2, Landmarks_Route120_2},
+ {MAPSEC_Route121, 2, Landmarks_Route121_2},
+ {MAPSEC_Route122, 0, Landmarks_Route122_0},
+ {MAPSEC_Route123, 0, Landmarks_Route123_0},
+ {MAPSEC_Route122, 1, Landmarks_Route122_0},
+ {MAPSEC_Route124, 7, Landmarks_Route124_7},
+ {MAPSEC_Route125, 2, Landmarks_Route125_2},
+ {MAPSEC_Route128, 1, Landmarks_Route128_1},
+ {MAPSEC_Route131, 1, Landmarks_Route131_1},
+ {MAPSEC_Route132, 0, Landmarks_OceanCurrent},
+ {MAPSEC_Route132, 1, Landmarks_OceanCurrent},
+ {MAPSEC_Route133, 0, Landmarks_OceanCurrent},
+ {MAPSEC_Route133, 1, Landmarks_OceanCurrent},
+ {MAPSEC_Route133, 2, Landmarks_OceanCurrent},
+ {MAPSEC_Route134, 0, Landmarks_OceanCurrent},
+ {MAPSEC_Route134, 1, Landmarks_OceanCurrent},
+ {MAPSEC_Route134, 2, Landmarks_Route134_2},
+ {MAPSEC_MtChimney, 2, Landmarks_MtChimney_2},
+ {MAPSEC_Nothing, 0, NULL},
+};
+
+static const struct Landmark *const *GetLandmarks(u8 mapSection, u8 id);
+
+const u8 *GetLandmarkName(u8 mapSection, u8 id, u8 count)
+{
+ const struct Landmark *const *landmarks = GetLandmarks(mapSection, id);
+
+ if (!landmarks)
+ return NULL;
+
+ while (1)
+ {
+ const struct Landmark *landmark = *landmarks;
+
+ if (landmark->flag == 0xFFFF || FlagGet(landmark->flag) == TRUE)
+ {
+ if (count == 0)
+ break;
+ else
+ count--;
+ }
+
+ landmarks++;
+ if (!*landmarks)
+ return NULL;
+ }
+
+ return (*landmarks)->name;
+}
+
+static const struct Landmark *const *GetLandmarks(u8 mapSection, u8 id)
+{
+ u16 i = 0;
+
+ for (; gLandmarkLists[i].mapSection != MAPSEC_Nothing; i++)
+ {
+ if (gLandmarkLists[i].mapSection > mapSection)
+ return NULL;
+ if (gLandmarkLists[i].mapSection == mapSection)
+ break;
+ }
+
+ if (gLandmarkLists[i].mapSection == MAPSEC_Nothing)
+ return NULL;
+
+ for (; gLandmarkLists[i].mapSection == mapSection; i++)
+ {
+ if (gLandmarkLists[i].id == id)
+ return gLandmarkLists[i].landmarks;
+ }
+
+ return NULL;
+}
diff --git a/src/lottery_corner.c b/src/field/lottery_corner.c
index c2c25b9ac..03de26054 100644
--- a/src/lottery_corner.c
+++ b/src/field/lottery_corner.c
@@ -1,13 +1,13 @@
#include "global.h"
#include "lottery_corner.h"
#include "event_data.h"
-#include "items.h"
-#include "rng.h"
-#include "species.h"
+#include "constants/items.h"
+#include "random.h"
+#include "constants/species.h"
#include "string_util.h"
#include "text.h"
-extern u16 gScriptResult;
+extern u16 gSpecialVar_Result;
extern u16 gSpecialVar_0x8004;
extern struct PokemonStorage gPokemonStorage;
extern u16 gSpecialVar_0x8005;
@@ -30,7 +30,7 @@ void ResetLotteryCorner(void)
u16 rand = Random();
SetLotteryNumber((Random() << 16) | rand);
- VarSet(VAR_POKELOT_PRIZE, 0);
+ VarSet(VAR_LOTTERY_PRIZE, 0);
}
void SetRandomLotteryNumber(u16 i)
@@ -46,7 +46,7 @@ void SetRandomLotteryNumber(u16 i)
void RetrieveLotteryNumber(void)
{
u16 lottoNumber = GetLotteryNumber();
- gScriptResult = lottoNumber;
+ gSpecialVar_Result = lottoNumber;
}
void PickLotteryCornerTicket(void)
@@ -70,7 +70,7 @@ void PickLotteryCornerTicket(void)
if (!GetMonData(pkmn, MON_DATA_IS_EGG))
{
u32 otId = GetMonData(pkmn, MON_DATA_OT_ID);
- u8 numMatchingDigits = GetMatchingDigits(gScriptResult, otId);
+ u8 numMatchingDigits = GetMatchingDigits(gSpecialVar_Result, otId);
if (numMatchingDigits > gSpecialVar_0x8004 && numMatchingDigits > 1)
{
@@ -97,7 +97,7 @@ void PickLotteryCornerTicket(void)
!GetBoxMonData(pkmn, MON_DATA_IS_EGG))
{
u32 otId = GetBoxMonData(pkmn, MON_DATA_OT_ID);
- u8 numMatchingDigits = GetMatchingDigits(gScriptResult, otId);
+ u8 numMatchingDigits = GetMatchingDigits(gSpecialVar_Result, otId);
if (numMatchingDigits > gSpecialVar_0x8004 && numMatchingDigits > 1)
{
@@ -152,19 +152,19 @@ static u8 GetMatchingDigits(u16 winNumber, u16 otId)
// lottery numbers go from 0 to 99999, not 65535 (0xFFFF). interestingly enough, the function that calls GetLotteryNumber shifts to u16, so it cant be anything above 65535 anyway.
void SetLotteryNumber(u32 lotteryNum)
{
- u16 lowNum = lotteryNum >> 16;
- u16 highNum = lotteryNum;
+ u16 high = lotteryNum >> 16;
+ u16 low = lotteryNum;
- VarSet(VAR_POKELOT_RND1, highNum);
- VarSet(VAR_POKELOT_RND2, lowNum);
+ VarSet(VAR_LOTTERY_RND_L, low);
+ VarSet(VAR_LOTTERY_RND_H, high);
}
u32 GetLotteryNumber(void)
{
- u16 highNum = VarGet(VAR_POKELOT_RND1);
- u16 lowNum = VarGet(VAR_POKELOT_RND2);
+ u16 low = VarGet(VAR_LOTTERY_RND_L);
+ u16 high = VarGet(VAR_LOTTERY_RND_H);
- return (lowNum << 16) | highNum;
+ return (high << 16) | low;
}
// interestingly, this may have been the original lottery number set function, but GF tried to change it to 32-bit later but didnt finish changing all calls as one GetLotteryNumber still shifts to u16.
diff --git a/src/map_name_popup.c b/src/field/map_name_popup.c
index 01105d0db..2e2dfc72e 100644
--- a/src/map_name_popup.c
+++ b/src/field/map_name_popup.c
@@ -19,7 +19,7 @@ bool8 unref_sub_80A2F44(void)
void ShowMapNamePopup(void)
{
- if (FlagGet(0x4000) != TRUE)
+ if (FlagGet(FLAG_SPECIAL_FLAG_0) != TRUE)
{
if (!FuncIsActiveTask(Task_MapNamePopup))
{
diff --git a/src/map_obj_lock.c b/src/field/map_obj_lock.c
index bd40bcacc..954fcb446 100644
--- a/src/map_obj_lock.c
+++ b/src/field/map_obj_lock.c
@@ -6,11 +6,11 @@
#include "script_movement.h"
#include "task.h"
-extern u16 gScriptFacing;
+extern u16 gSpecialVar_Facing;
bool8 walkrun_is_standing_still(void)
{
- if (gPlayerAvatar.running1 == 1)
+ if (gPlayerAvatar.tileTransitionState == T_TILE_TRANSITION)
return FALSE;
else
return TRUE;
@@ -75,7 +75,7 @@ bool8 sub_8064DB4(void)
}
}
-void sub_8064DD8(void)
+void LockSelectedMapObject(void)
{
u8 taskId;
FreezeMapObjectsExceptOne(gSelectedMapObject);
@@ -109,7 +109,7 @@ void unref_sub_8064E5C(void)
void sub_8064EAC(void)
{
- FieldObjectFaceOppositeDirection(&gMapObjects[gSelectedMapObject], gScriptFacing);
+ FieldObjectFaceOppositeDirection(&gMapObjects[gSelectedMapObject], gSpecialVar_Facing);
}
void sub_8064ED4(void)
diff --git a/src/field/mauville_man.c b/src/field/mauville_man.c
new file mode 100644
index 000000000..4db513f65
--- /dev/null
+++ b/src/field/mauville_man.c
@@ -0,0 +1,1313 @@
+#include "global.h"
+#include "bard_music.h"
+#include "mauville_man.h"
+#include "easy_chat.h"
+#include "constants/easy_chat.h"
+#include "event_data.h"
+#include "field_message_box.h"
+#include "m4a.h"
+#include "menu.h"
+#include "overworld.h"
+#include "random.h"
+#include "script.h"
+#include "constants/map_objects.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "string_util.h"
+#include "strings.h"
+#include "task.h"
+#include "trader.h"
+
+#define MACRO1(a) (((a) % 4) + (((a) / 8) & 1))
+
+extern struct MusicPlayerInfo gMPlay_SE2;
+
+extern u16 gSpecialVar_Result;
+extern u16 gSpecialVar_0x8004;
+
+extern const u8 gTextStoryteller_Story1Title[];
+extern const u8 gTextStoryteller_Story1Action[];
+extern const u8 gTextStoryteller_Story1Text[];
+extern const u8 gTextStoryteller_Story2Title[];
+extern const u8 gTextStoryteller_Story2Action[];
+extern const u8 gTextStoryteller_Story2Text[];
+extern const u8 gTextStoryteller_Story3Title[];
+extern const u8 gTextStoryteller_Story3Action[];
+extern const u8 gTextStoryteller_Story3Text[];
+extern const u8 gTextStoryteller_Story4Title[];
+extern const u8 gTextStoryteller_Story4Action[];
+extern const u8 gTextStoryteller_Story4Text[];
+extern const u8 gTextStoryteller_Story5Title[];
+extern const u8 gTextStoryteller_Story5Action[];
+extern const u8 gTextStoryteller_Story5Text[];
+extern const u8 gTextStoryteller_Story6Title[];
+extern const u8 gTextStoryteller_Story6Action[];
+extern const u8 gTextStoryteller_Story6Text[];
+extern const u8 gTextStoryteller_Story7Title[];
+extern const u8 gTextStoryteller_Story7Action[];
+extern const u8 gTextStoryteller_Story7Text[];
+extern const u8 gTextStoryteller_Story8Title[];
+extern const u8 gTextStoryteller_Story8Action[];
+extern const u8 gTextStoryteller_Story8Text[];
+extern const u8 gTextStoryteller_Story9Title[];
+extern const u8 gTextStoryteller_Story9Action[];
+extern const u8 gTextStoryteller_Story9Text[];
+extern const u8 gTextStoryteller_Story10Title[];
+extern const u8 gTextStoryteller_Story10Action[];
+extern const u8 gTextStoryteller_Story10Text[];
+extern const u8 gTextStoryteller_Story11Title[];
+extern const u8 gTextStoryteller_Story11Action[];
+extern const u8 gTextStoryteller_Story11Text[];
+extern const u8 gTextStoryteller_Story12Title[];
+extern const u8 gTextStoryteller_Story12Action[];
+extern const u8 gTextStoryteller_Story12Text[];
+extern const u8 gTextStoryteller_Story13Title[];
+extern const u8 gTextStoryteller_Story13Action[];
+extern const u8 gTextStoryteller_Story13Text[];
+extern const u8 gTextStoryteller_Story14Title[];
+extern const u8 gTextStoryteller_Story14Action[];
+extern const u8 gTextStoryteller_Story14Text[];
+extern const u8 gTextStoryteller_Story15Title[];
+extern const u8 gTextStoryteller_Story15Action[];
+extern const u8 gTextStoryteller_Story15Text[];
+extern const u8 gTextStoryteller_Story16Title[];
+extern const u8 gTextStoryteller_Story16Action[];
+extern const u8 gTextStoryteller_Story16Text[];
+extern const u8 gTextStoryteller_Story17Title[];
+extern const u8 gTextStoryteller_Story17Action[];
+extern const u8 gTextStoryteller_Story17Text[];
+extern const u8 gTextStoryteller_Story18Title[];
+extern const u8 gTextStoryteller_Story18Action[];
+extern const u8 gTextStoryteller_Story18Text[];
+extern const u8 gTextStoryteller_Story19Title[];
+extern const u8 gTextStoryteller_Story19Action[];
+extern const u8 gTextStoryteller_Story19Text[];
+extern const u8 gTextStoryteller_Story20Title[];
+extern const u8 gTextStoryteller_Story20Action[];
+extern const u8 gTextStoryteller_Story20Text[];
+extern const u8 gTextStoryteller_Story21Title[];
+extern const u8 gTextStoryteller_Story21Action[];
+extern const u8 gTextStoryteller_Story21Text[];
+extern const u8 gTextStoryteller_Story22Title[];
+extern const u8 gTextStoryteller_Story22Action[];
+extern const u8 gTextStoryteller_Story22Text[];
+extern const u8 gTextStoryteller_Story23Title[];
+extern const u8 gTextStoryteller_Story23Action[];
+extern const u8 gTextStoryteller_Story23Text[];
+extern const u8 gTextStoryteller_Story24Title[];
+extern const u8 gTextStoryteller_Story24Action[];
+extern const u8 gTextStoryteller_Story24Text[];
+extern const u8 gTextStoryteller_Story25Title[];
+extern const u8 gTextStoryteller_Story25Action[];
+extern const u8 gTextStoryteller_Story25Text[];
+extern const u8 gTextStoryteller_Story26Title[];
+extern const u8 gTextStoryteller_Story26Action[];
+extern const u8 gTextStoryteller_Story26Text[];
+extern const u8 gTextStoryteller_Story27Title[];
+extern const u8 gTextStoryteller_Story27Action[];
+extern const u8 gTextStoryteller_Story27Text[];
+extern const u8 gTextStoryteller_Story28Title[];
+extern const u8 gTextStoryteller_Story28Action[];
+extern const u8 gTextStoryteller_Story28Text[];
+extern const u8 gTextStoryteller_Story29Title[];
+extern const u8 gTextStoryteller_Story29Action[];
+extern const u8 gTextStoryteller_Story29Text[];
+extern const u8 gTextStoryteller_Story30Title[];
+extern const u8 gTextStoryteller_Story30Action[];
+extern const u8 gTextStoryteller_Story30Text[];
+extern const u8 gTextStoryteller_Story31Title[];
+extern const u8 gTextStoryteller_Story31Action[];
+extern const u8 gTextStoryteller_Story31Text[];
+extern const u8 gTextStoryteller_Story32Title[];
+extern const u8 gTextStoryteller_Story32Action[];
+extern const u8 gTextStoryteller_Story32Text[];
+extern const u8 gTextStoryteller_Story33Title[];
+extern const u8 gTextStoryteller_Story33Action[];
+extern const u8 gTextStoryteller_Story33Text[];
+extern const u8 gTextStoryteller_Story34Title[];
+extern const u8 gTextStoryteller_Story34Action[];
+extern const u8 gTextStoryteller_Story34Text[];
+extern const u8 gTextStoryteller_Story35Title[];
+extern const u8 gTextStoryteller_Story35Action[];
+extern const u8 gTextStoryteller_Story35Text[];
+extern const u8 gTextStoryteller_Story36Title[];
+extern const u8 gTextStoryteller_Story36Action[];
+extern const u8 gTextStoryteller_Story36Text[];
+
+extern struct BardSong gUnknown_03005DA0;
+
+EWRAM_DATA static u16 gUnknown_020388BC = 0; // set but not used?
+
+static const u16 sDefaultBardSongLyrics[] =
+{
+#ifdef ENGLISH
+ EC_WORD_SISTER,
+ EC_WORD_EATS,
+ EC_WORD_SWEETS,
+ EC_WORD_VORACIOUS,
+ EC_WORD_AND,
+ EC_WORD_DROOLING,
+#else
+ EC_WORD_SISTER,
+ EC_WORD_MUST_BE,
+ EC_WORD_SWEETS,
+ EC_WORD_VORACIOUS,
+ EC_WORD_DROOLING,
+ EC_WORD_THICK,
+#endif
+};
+
+static const u8 *const sGiddyAdjectives[] =
+{
+ OtherText_SoPretty,
+ OtherText_SoDarling,
+ OtherText_SoRelaxed,
+ OtherText_SoSunny,
+ OtherText_SoDesirable,
+ OtherText_SoExciting,
+ OtherText_SoAmusing,
+ OtherText_SoMagical,
+};
+
+static const u8 *const sGiddyQuestions[] =
+{
+ OtherText_WantVacationNicePlace,
+ OtherText_BoughtCrayonsIsNice,
+ OtherText_IfWeCouldFloat,
+ OtherText_SandWashesAwayMakeSad,
+ OtherText_WhatsBottomSeaLike,
+ OtherText_SeeSettingSun,
+ OtherText_LyingInGreenGrass,
+ OtherText_SecretBasesWonderful,
+};
+
+static void sub_80F7DC0(void);
+static void Task_BardSong(u8);
+static void StartBardSong(u8);
+static void StorytellerSetup(void);
+static void sub_80F8428(void);
+
+static void SetupBard(void)
+{
+ u16 i;
+ struct MauvilleManBard *bard = &gSaveBlock1.mauvilleMan.bard;
+
+ bard->id = MAUVILLE_MAN_BARD;
+ bard->hasChangedSong = FALSE;
+ for (i = 0; i < 6; i++)
+ bard->songLyrics[i] = sDefaultBardSongLyrics[i];
+}
+
+static void SetupHipster(void)
+{
+ struct MauvilleManHipster *hipster = &gSaveBlock1.mauvilleMan.hipster;
+
+ hipster->id = MAUVILLE_MAN_HIPSTER;
+ hipster->alreadySpoken = FALSE;
+}
+
+static void SetupStoryteller(void)
+{
+ StorytellerSetup();
+}
+
+static void SetupGiddy(void)
+{
+ struct MauvilleManGiddy *giddy = &gSaveBlock1.mauvilleMan.giddy;
+
+ giddy->id = MAUVILLE_MAN_GIDDY;
+ giddy->taleCounter = 0;
+}
+
+static void SetupTrader(void)
+{
+ TraderSetup();
+}
+
+void SetupMauvilleOldMan(void)
+{
+ u16 trainerId = (gSaveBlock2.playerTrainerId[1] << 8) | gSaveBlock2.playerTrainerId[0];
+
+ // Determine man based on the last digit of the player's trainer ID.
+ switch ((trainerId % 10) / 2)
+ {
+ case MAUVILLE_MAN_BARD:
+ SetupBard();
+ break;
+ case MAUVILLE_MAN_HIPSTER:
+ SetupHipster();
+ break;
+ case MAUVILLE_MAN_TRADER:
+ SetupTrader();
+ break;
+ case MAUVILLE_MAN_STORYTELLER:
+ SetupStoryteller();
+ break;
+ case MAUVILLE_MAN_GIDDY:
+ SetupGiddy();
+ break;
+ }
+ sub_80F83D0();
+}
+
+static u8 GetCurrentMauvilleOldMan(void)
+{
+ struct MauvilleManCommon *common = &gSaveBlock1.mauvilleMan.common;
+
+ return common->id;
+}
+
+void ScrSpecial_GetCurrentMauvilleMan(void)
+{
+ gSpecialVar_Result = GetCurrentMauvilleOldMan();
+}
+
+void ScrSpecial_HasBardSongBeenChanged(void)
+{
+ u16 *scriptResult = &gSpecialVar_Result; // why??
+ struct MauvilleManBard *bard = &gSaveBlock1.mauvilleMan.bard;
+
+ *scriptResult = bard->hasChangedSong;
+}
+
+void ScrSpecial_SaveBardSongLyrics(void)
+{
+ u16 i;
+ struct MauvilleManBard *bard = &gSaveBlock1.mauvilleMan.bard;
+
+ StringCopy(bard->playerName, gSaveBlock2.playerName);
+
+ for (i = 0; i < 4; i++)
+ bard->playerTrainerId[i] = gSaveBlock2.playerTrainerId[i];
+
+ for (i = 0; i < 6; i++)
+ bard->songLyrics[i] = bard->temporaryLyrics[i];
+
+ bard->hasChangedSong = TRUE;
+}
+
+// Copies lyrics into gStringVar4
+void PrepareSongText(void)
+{
+ struct MauvilleManBard *bard = &gSaveBlock1.mauvilleMan.bard;
+ u16 specialVar = gSpecialVar_0x8004; // It's a bit odd to use this temp variable, but it seems needed to match.
+ u16 *lyrics;
+ u16 lineNum;
+ u8 *wordEnd;
+ u8 *str;
+
+ lyrics = bard->temporaryLyrics;
+ if (specialVar == 0)
+ lyrics = bard->songLyrics;
+ wordEnd = gStringVar4;
+ str = wordEnd;
+ // Put three words on each line
+ for (lineNum = 0; lineNum < 2; lineNum++)
+ {
+ wordEnd = EasyChat_GetWordText(wordEnd, *(lyrics++));
+ while (wordEnd != str)
+ {
+ if (*str == CHAR_SPACE)
+ *str = CHAR_SONG_WORD_SEPARATOR;
+ str++;
+ }
+
+ str++;
+ *(wordEnd++) = CHAR_SPACE;
+
+ wordEnd = EasyChat_GetWordText(wordEnd, *(lyrics++));
+ while (wordEnd != str)
+ {
+ if (*str == CHAR_SPACE)
+ *str = CHAR_SONG_WORD_SEPARATOR;
+ str++;
+ }
+
+ str++;
+ *(wordEnd++) = CHAR_NEWLINE;
+
+ wordEnd = EasyChat_GetWordText(wordEnd, *(lyrics++));
+ while (wordEnd != str)
+ {
+ if (*str == CHAR_SPACE)
+ *str = CHAR_SONG_WORD_SEPARATOR;
+ str++;
+ }
+
+ if (lineNum == 0)
+ {
+ *(wordEnd++) = EXT_CTRL_CODE_BEGIN;
+ *(wordEnd++) = 15;
+ }
+ }
+}
+
+void ScrSpecial_PlayBardSong(void)
+{
+ StartBardSong(gSpecialVar_0x8004);
+ MenuDisplayMessageBox();
+ ScriptContext1_Stop();
+}
+
+void ScrSpecial_GetHipsterSpokenFlag(void)
+{
+ u16 *scriptResult = &gSpecialVar_Result; // again??
+ struct MauvilleManHipster *hipster = &gSaveBlock1.mauvilleMan.hipster;
+
+ *scriptResult = hipster->alreadySpoken;
+}
+
+void ScrSpecial_SetHipsterSpokenFlag(void)
+{
+ struct MauvilleManHipster *hipster = &gSaveBlock1.mauvilleMan.hipster;
+
+ hipster->alreadySpoken = TRUE;
+}
+
+void ScrSpecial_HipsterTeachWord(void)
+{
+ u16 var = sub_80EB8EC();
+
+ if (var == 0xFFFF)
+ {
+ gSpecialVar_Result = FALSE;
+ }
+ else
+ {
+ EasyChat_GetWordText(gStringVar1, var);
+ gSpecialVar_Result = TRUE;
+ }
+}
+
+void ScrSpecial_GiddyShouldTellAnotherTale(void)
+{
+ struct MauvilleManGiddy *giddy = &gSaveBlock1.mauvilleMan.giddy;
+
+ if (giddy->taleCounter == 10)
+ {
+ gSpecialVar_Result = FALSE;
+ giddy->taleCounter = 0;
+ }
+ else
+ {
+ gSpecialVar_Result = TRUE;
+ }
+}
+
+void ScrSpecial_GenerateGiddyLine(void)
+{
+ struct MauvilleManGiddy *giddy = &gSaveBlock1.mauvilleMan.giddy;
+
+ if (giddy->taleCounter == 0)
+ sub_80F7DC0();
+
+ if (giddy->randomWords[giddy->taleCounter] != 0xFFFF) // is not the last element of the array?
+ {
+ u8 *stringPtr;
+ u32 adjective = Random();
+
+ adjective %= 8;
+ stringPtr = EasyChat_GetWordText(gStringVar4, giddy->randomWords[giddy->taleCounter]);
+ stringPtr = StringCopy(stringPtr, gOtherText_Is);
+ stringPtr = StringCopy(stringPtr, sGiddyAdjectives[adjective]);
+ StringCopy(stringPtr, gOtherText_DontYouAgree);
+ }
+ else
+ {
+ StringCopy(gStringVar4, sGiddyQuestions[giddy->questionList[giddy->questionNum++]]);
+ }
+
+ if (!(Random() % 10))
+ giddy->taleCounter = 10;
+ else
+ giddy->taleCounter++;
+
+ gSpecialVar_Result = TRUE;
+}
+
+#ifdef NONMATCHING
+static void sub_80F7DC0(void)
+{
+ u16 arr[][2] =
+ {
+ { 0x0, 0},
+ { 0xC, 0},
+ { 0xD, 0},
+ {0x12, 0},
+ {0x13, 0},
+ {0x15, 0},
+ };
+ u16 i;
+ u16 r10;
+ u16 r7;
+
+ for (i = 0; i < 8; i++)
+ {
+ struct MauvilleManGiddy *giddy = &gSaveBlock1.mauvilleMan.giddy;
+
+ //gSaveBlock1.mauvilleMan.giddy.questionList[i] = i;
+ giddy->questionList[i] = i;
+ }
+
+ // Scramble questions
+ for (i = 0; i < 8; i++)
+ {
+ struct MauvilleManGiddy *giddy = &gSaveBlock1.mauvilleMan.giddy;
+
+ /*
+ u16 r1 = Random() % (i + 1);
+ u8 r7 = gSaveBlock1.mauvilleMan.giddy.questionList[i];
+ gSaveBlock1.mauvilleMan.giddy.questionList[i] = gSaveBlock1.mauvilleMan.giddy.questionList[r1];
+ gSaveBlock1.mauvilleMan.giddy.questionList[r1] = r7;
+ */
+ u16 r1 = Random() % (i + 1);
+ u8 r7 = giddy->questionList[i];
+ giddy->questionList[i] = giddy->questionList[r1];
+ giddy->questionList[r1] = r7;
+ }
+
+ r10 = 0;
+ for (i = 0; i < 6; i++)
+ {
+ arr[i][1] = sub_80EAE88(arr[i][0]);
+ r10 += arr[i][1];
+ }
+
+ {
+ struct MauvilleManGiddy *giddy = &gSaveBlock1.mauvilleMan.giddy;
+ giddy->questionNum = 0;
+ }
+ //gSaveBlock1.mauvilleMan.giddy.questionNum = 0;
+
+ r7 = 0;
+ for (i = 0; i < 10; i++)
+ {
+ struct MauvilleManGiddy *giddy = &gSaveBlock1.mauvilleMan.giddy;
+
+ u16 var = Random() % 10;
+ if (var < 3 && r7 < 8)
+ {
+ //gSaveBlock1.mauvilleMan.giddy.randomWords[i] = 0xFFFF;
+ giddy->randomWords[i] = 0xFFFF;
+ r7++;
+ }
+ //_080F7E90
+ else
+ {
+ s16 r2 = Random() % r10;
+
+ u16 r1 = 0;
+
+ while (i < 6) // comparing the wrong variable
+ {
+ r2 = arr[r1][1] - r2;
+ if (r2 <= 0)
+ break;
+ r1++;
+ }
+
+ if (r1 == 6)
+ r1 = 0;
+ //gSaveBlock1.mauvilleMan.giddy.randomWords[i] = sub_80EB784(arr[r1][0]);
+ giddy->randomWords[i] = sub_80EB784(arr[r1][0]);
+ }
+ }
+}
+#else
+
+static const u16 gUnknown_083E53C8[][2] =
+{
+ { 0x0, 0},
+ { 0xC, 0},
+ { 0xD, 0},
+ {0x12, 0},
+ {0x13, 0},
+ {0x15, 0},
+};
+
+__attribute__((naked))
+static void sub_80F7DC0(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, 0x18\n\
+ ldr r1, _080F7E84 @ =gUnknown_083E53C8\n\
+ mov r0, sp\n\
+ movs r2, 0x18\n\
+ bl memcpy\n\
+ movs r5, 0\n\
+ movs r0, 0x2\n\
+ add r0, sp\n\
+ mov r8, r0\n\
+ ldr r1, _080F7E88 @ =gSaveBlock1 + 0x2D94\n\
+ adds r1, 0x18\n\
+ adds r3, r1, 0\n\
+_080F7DE4:\n\
+ adds r0, r3, r5\n\
+ strb r5, [r0]\n\
+ adds r0, r5, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r5, r0, 16\n\
+ cmp r5, 0x7\n\
+ bls _080F7DE4\n\
+ movs r5, 0\n\
+ ldr r2, _080F7E88 @ =gSaveBlock1 + 0x2D94\n\
+ adds r2, 0x4\n\
+ mov r9, r2\n\
+ adds r6, r1, 0\n\
+_080F7DFC:\n\
+ bl Random\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ adds r4, r5, 0x1\n\
+ adds r1, r4, 0\n\
+ bl __modsi3\n\
+ lsls r0, 16\n\
+ lsrs r1, r0, 16\n\
+ adds r2, r6, r5\n\
+ ldrb r7, [r2]\n\
+ adds r1, r6, r1\n\
+ ldrb r0, [r1]\n\
+ strb r0, [r2]\n\
+ strb r7, [r1]\n\
+ lsls r4, 16\n\
+ lsrs r5, r4, 16\n\
+ cmp r5, 0x7\n\
+ bls _080F7DFC\n\
+ movs r3, 0\n\
+ mov r10, r3\n\
+ movs r5, 0\n\
+_080F7E2A:\n\
+ lsls r4, r5, 2\n\
+ mov r1, sp\n\
+ adds r0, r1, r4\n\
+ ldrb r0, [r0]\n\
+ bl sub_80EAE88\n\
+ add r4, r8\n\
+ strh r0, [r4]\n\
+ add r0, r10\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ mov r10, r0\n\
+ adds r0, r5, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r5, r0, 16\n\
+ cmp r5, 0x5\n\
+ bls _080F7E2A\n\
+ movs r0, 0\n\
+ ldr r2, _080F7E88 @ =gSaveBlock1 + 0x2D94\n\
+ strb r0, [r2, 0x2]\n\
+ movs r7, 0\n\
+ movs r5, 0\n\
+_080F7E56:\n\
+ bl Random\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ movs r1, 0xA\n\
+ bl __umodsi3\n\
+ lsls r0, 16\n\
+ lsrs r1, r0, 16\n\
+ cmp r1, 0x2\n\
+ bhi _080F7E90\n\
+ cmp r7, 0x7\n\
+ bhi _080F7E90\n\
+ lsls r0, r5, 1\n\
+ add r0, r9\n\
+ ldr r1, _080F7E8C @ =0x0000ffff\n\
+ strh r1, [r0]\n\
+ adds r0, r7, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r7, r0, 16\n\
+ adds r4, r5, 0x1\n\
+ b _080F7EE2\n\
+ .align 2, 0\n\
+_080F7E84: .4byte gUnknown_083E53C8\n\
+_080F7E88: .4byte gSaveBlock1 + 0x2D94\n\
+_080F7E8C: .4byte 0x0000ffff\n\
+_080F7E90:\n\
+ bl Random\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ mov r1, r10\n\
+ bl __umodsi3\n\
+ lsls r0, 16\n\
+ lsrs r2, r0, 16\n\
+ movs r1, 0\n\
+ adds r4, r5, 0x1\n\
+ lsls r6, r5, 1\n\
+ cmp r5, 0x5\n\
+ bhi _080F7ECC\n\
+ mov r3, r8\n\
+ ldrh r0, [r3]\n\
+ b _080F7EC2\n\
+_080F7EB2:\n\
+ adds r0, r1, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r1, r0, 16\n\
+ cmp r5, 0x5\n\
+ bhi _080F7ECC\n\
+ lsls r0, r1, 2\n\
+ adds r0, r3, r0\n\
+ ldrh r0, [r0]\n\
+_080F7EC2:\n\
+ subs r0, r2, r0\n\
+ lsls r0, 16\n\
+ lsrs r2, r0, 16\n\
+ cmp r0, 0\n\
+ bgt _080F7EB2\n\
+_080F7ECC:\n\
+ cmp r1, 0x6\n\
+ bne _080F7ED2\n\
+ movs r1, 0\n\
+_080F7ED2:\n\
+ lsls r0, r1, 2\n\
+ add r0, sp\n\
+ ldrh r0, [r0]\n\
+ bl sub_80EB784\n\
+ mov r2, r9\n\
+ adds r1, r2, r6\n\
+ strh r0, [r1]\n\
+_080F7EE2:\n\
+ lsls r0, r4, 16\n\
+ lsrs r5, r0, 16\n\
+ cmp r5, 0x9\n\
+ bls _080F7E56\n\
+ add sp, 0x18\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");
+}
+#endif
+
+static void sub_80F7EFC(void)
+{
+ struct MauvilleManBard *bard = &gSaveBlock1.mauvilleMan.bard;
+
+ bard->hasChangedSong = FALSE;
+}
+
+static void sub_80F7F0C(void)
+{
+ struct MauvilleManHipster *hipster = &gSaveBlock1.mauvilleMan.hipster;
+
+ hipster->alreadySpoken = FALSE;
+}
+
+static void sub_80F7F18(void)
+{
+ sub_8109A20();
+}
+
+static void sub_80F7F24(void)
+{
+ sub_80F8428();
+}
+
+void sub_80F7F30(void)
+{
+ switch (GetCurrentMauvilleOldMan())
+ {
+ case MAUVILLE_MAN_BARD:
+ sub_80F7EFC();
+ break;
+ case MAUVILLE_MAN_HIPSTER:
+ sub_80F7F0C();
+ break;
+ case MAUVILLE_MAN_STORYTELLER:
+ sub_80F7F24();
+ break;
+ case MAUVILLE_MAN_TRADER:
+ sub_80F7F18();
+ break;
+ case MAUVILLE_MAN_GIDDY:
+ break;
+ }
+ sub_80F83D0();
+}
+
+#define tState data[0]
+#define tCharIndex data[3]
+#define tCurrWord data[4]
+#define tUseTemporaryLyrics data[5]
+
+static void StartBardSong(bool8 useTemporaryLyrics)
+{
+ u8 taskId = CreateTask(Task_BardSong, 0x50);
+
+ gTasks[taskId].tUseTemporaryLyrics = useTemporaryLyrics;
+}
+
+static void BardSing(struct Task *task, struct BardSong *song)
+{
+ switch (task->tState)
+ {
+ case 0: // Initialize song
+ {
+ struct MauvilleManBard *bard = &gSaveBlock1.mauvilleMan.bard;
+ u16 *lyrics;
+ s32 i;
+
+ // Copy lyrics
+ if (gSpecialVar_0x8004 == 0)
+ lyrics = bard->songLyrics;
+ else
+ lyrics = bard->temporaryLyrics;
+ for (i = 0; i < 6; i++)
+ song->lyrics[i] = lyrics[i];
+
+ // Clear phonemes
+ for (i = 0; i < 6; i++)
+ {
+ song->phonemes[i].sound = 0xFFFF;
+ song->phonemes[i].length = 0;
+ song->phonemes[i].pitch = 0;
+ song->phonemes[i].volume = 0;
+ }
+ song->currWord = 0;
+ song->currPhoneme = 0;
+ song->var04 = 0;
+ }
+ break;
+ case 1: // Wait for BGM to end
+ break;
+ case 2: // Initialize word
+ {
+ u16 word = song->lyrics[song->currWord];
+ const struct BardSound *sounds = GetWordSounds(EC_GROUP(word), EC_INDEX(word));
+
+ song->var04 = 0;
+ GetWordPhonemes(song, sounds, MACRO1(word));
+ }
+ break;
+ case 3:
+ case 4:
+ {
+ struct BardPhoneme *phoneme = &song->phonemes[song->currPhoneme];
+
+ switch (song->state)
+ {
+ case 0:
+ if (song->phonemeTimer == 0) // Timer has expired. Move to next phoneme
+ {
+ if (song->currPhoneme == 6 || phoneme->sound == 0xFF)
+ {
+ song->state = 0xFE;
+ break;
+ }
+ song->phonemeTimer = phoneme->length;
+ if (phoneme->sound <= 50)
+ {
+ u16 num = phoneme->sound / 3;
+
+ m4aSongNumStart(249 + num * 3);
+ }
+ song->state = 1;
+ }
+ else
+ {
+ if (song->voiceInflection > 10)
+ song->volume -= 2;
+ if (song->voiceInflection & 1)
+ song->pitch += 64;
+ else
+ song->pitch -= 64;
+ m4aMPlayVolumeControl(&gMPlay_SE2, 0xFFFF, song->volume);
+ m4aMPlayPitchControl(&gMPlay_SE2, 0xFFFF, song->pitch);
+ song->voiceInflection++;
+ }
+ song->phonemeTimer--;
+ break;
+ case 1:
+ song->currPhoneme++;
+ song->state = 0;
+ if (phoneme->sound <= 50)
+ {
+ song->volume = 0x100 + phoneme->volume * 16;
+ m4aMPlayVolumeControl(&gMPlay_SE2, 0xFFFF, song->volume);
+ song->pitch = 0x200 + phoneme->pitch;
+ m4aMPlayPitchControl(&gMPlay_SE2, 0xFFFF, song->pitch);
+ }
+ break;
+ case 0xFE:
+ m4aMPlayStop(&gMPlay_SE2);
+ song->state = 0xFF;
+ break;
+ }
+ }
+ break;
+ case 5:
+ break;
+ }
+}
+
+static void Task_BardSong(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId]; // r5
+
+ BardSing(task, &gUnknown_03005DA0);
+ switch (task->tState)
+ {
+ case 0: // Initialize song
+ PrepareSongText();
+ InitWindowFromConfig(gMenuWindowPtr, &gWindowConfig_81E6CE4);
+ sub_8002EB0(gMenuWindowPtr, gStringVar4, 2, 4, 15);
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->tCharIndex = 0;
+ task->tCurrWord = 0;
+ FadeOutBGMTemporarily(4);
+ task->tState = 1;
+ break;
+ case 1: // Wait for BGM to end
+ if (IsBGMPausedOrStopped())
+ task->tState = 2;
+ break;
+ case 2: // Initialize word
+ {
+ struct MauvilleManBard *bard = &gSaveBlock1.mauvilleMan.bard;
+ u8 *str = gStringVar4 + task->tCharIndex;
+ u16 wordLen = 0;
+ // Can't get it to match without hacking
+ u32 temp;
+ register s16 zero asm("r1");
+
+ while (*str != CHAR_SPACE
+ && *str != CHAR_NEWLINE
+ && *str != EXT_CTRL_CODE_BEGIN
+ && *str != EOS)
+ {
+ str++;
+ wordLen++;
+ }
+ if (!task->tUseTemporaryLyrics)
+ gUnknown_020388BC = MACRO1(bard->songLyrics[task->tCurrWord]);
+ else
+ gUnknown_020388BC = MACRO1(bard->temporaryLyrics[task->tCurrWord]);
+ temp = gUnknown_03005DA0.var04 / wordLen;
+ zero = 0;
+ gUnknown_03005DA0.var04 = temp;
+ if (gUnknown_03005DA0.var04 <= 0)
+ gUnknown_03005DA0.var04 = 1;
+ task->tCurrWord++;
+ if (task->data[2] == 0)
+ task->tState = 3;
+ else
+ task->tState = 5;
+ task->data[1] = zero;
+ }
+ break;
+ case 5:
+ if (task->data[2] == 0)
+ task->tState = 3;
+ else
+ task->data[2]--;
+ break;
+ case 3:
+ if (gStringVar4[task->tCharIndex] == EOS)
+ {
+ FadeInNewBGM(BGM_POKECEN, 6);
+ m4aMPlayFadeOutTemporarily(&gMPlay_SE2, 2);
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ }
+ else if (gStringVar4[task->tCharIndex] == CHAR_SPACE)
+ {
+ sub_8003418(gMenuWindowPtr);
+ task->tCharIndex++;
+ task->tState = 2;
+ task->data[2] = 0;
+ }
+ else if (gStringVar4[task->tCharIndex] == CHAR_NEWLINE)
+ {
+ task->tCharIndex++;
+ task->tState = 2;
+ task->data[2] = 0;
+ }
+ else if (gStringVar4[task->tCharIndex] == EXT_CTRL_CODE_BEGIN)
+ {
+ task->tCharIndex += 2; // skip over control codes
+ task->tState = 2;
+ task->data[2] = 8;
+ }
+ else if (gStringVar4[task->tCharIndex] == CHAR_SONG_WORD_SEPARATOR)
+ {
+ gStringVar4[task->tCharIndex] = CHAR_SPACE; // restore it back to a space
+ sub_8003418(gMenuWindowPtr);
+ task->tCharIndex++;
+ task->data[2] = 0;
+ }
+ else
+ {
+ switch (task->data[1])
+ {
+ case 0:
+ sub_8003418(gMenuWindowPtr);
+ task->data[1]++;
+ break;
+ case 1:
+ task->data[1]++;
+ break;
+ case 2:
+ task->tCharIndex++;
+ task->data[1] = 0;
+ task->data[2] = gUnknown_03005DA0.var04;
+ task->tState = 4;
+ break;
+ }
+ }
+ break;
+ case 4:
+ task->data[2]--;
+ if (task->data[2] == 0)
+ task->tState = 3;
+ break;
+ }
+}
+
+void sub_80F83D0(void)
+{
+ VarSet(VAR_OBJ_GFX_ID_0, MAP_OBJ_GFX_BARD + GetCurrentMauvilleOldMan());
+}
+
+struct Story
+{
+ u8 stat;
+ u8 minVal;
+ const u8 *title;
+ const u8 *action;
+ const u8 *fullText;
+};
+
+static const struct Story sStorytellerStories[] =
+{
+ {0x32, 1, gTextStoryteller_Story1Title, gTextStoryteller_Story1Action, gTextStoryteller_Story1Text},
+ {0x02, 1, gTextStoryteller_Story2Title, gTextStoryteller_Story2Action, gTextStoryteller_Story2Text},
+ {0x03, 1, gTextStoryteller_Story3Title, gTextStoryteller_Story3Action, gTextStoryteller_Story3Text},
+ {0x04, 1, gTextStoryteller_Story4Title, gTextStoryteller_Story4Action, gTextStoryteller_Story4Text},
+ {0x06, 1, gTextStoryteller_Story5Title, gTextStoryteller_Story5Action, gTextStoryteller_Story5Text},
+ {0x09, 1, gTextStoryteller_Story6Title, gTextStoryteller_Story6Action, gTextStoryteller_Story6Text},
+ {0x0B, 1, gTextStoryteller_Story7Title, gTextStoryteller_Story7Action, gTextStoryteller_Story7Text},
+ {0x0C, 1, gTextStoryteller_Story8Title, gTextStoryteller_Story8Action, gTextStoryteller_Story8Text},
+ {0x0D, 1, gTextStoryteller_Story9Title, gTextStoryteller_Story9Action, gTextStoryteller_Story9Text},
+ {0x0E, 1, gTextStoryteller_Story10Title, gTextStoryteller_Story10Action, gTextStoryteller_Story10Text},
+ {0x0F, 1, gTextStoryteller_Story11Title, gTextStoryteller_Story11Action, gTextStoryteller_Story11Text},
+ {0x10, 1, gTextStoryteller_Story12Title, gTextStoryteller_Story12Action, gTextStoryteller_Story12Text},
+ {0x11, 1, gTextStoryteller_Story13Title, gTextStoryteller_Story13Action, gTextStoryteller_Story13Text},
+ {0x12, 1, gTextStoryteller_Story14Title, gTextStoryteller_Story14Action, gTextStoryteller_Story14Text},
+ {0x13, 1, gTextStoryteller_Story15Title, gTextStoryteller_Story15Action, gTextStoryteller_Story15Text},
+ {0x14, 1, gTextStoryteller_Story16Title, gTextStoryteller_Story16Action, gTextStoryteller_Story16Text},
+ {0x1A, 1, gTextStoryteller_Story17Title, gTextStoryteller_Story17Action, gTextStoryteller_Story17Text},
+ {0x1B, 1, gTextStoryteller_Story18Title, gTextStoryteller_Story18Action, gTextStoryteller_Story18Text},
+ {0x1C, 1, gTextStoryteller_Story19Title, gTextStoryteller_Story19Action, gTextStoryteller_Story19Text},
+ {0x1D, 2, gTextStoryteller_Story20Title, gTextStoryteller_Story20Action, gTextStoryteller_Story20Text},
+ {0x1E, 1, gTextStoryteller_Story21Title, gTextStoryteller_Story21Action, gTextStoryteller_Story21Text},
+ {0x21, 1, gTextStoryteller_Story22Title, gTextStoryteller_Story22Action, gTextStoryteller_Story22Text},
+ {0x24, 1, gTextStoryteller_Story23Title, gTextStoryteller_Story23Action, gTextStoryteller_Story23Text},
+ {0x25, 1, gTextStoryteller_Story24Title, gTextStoryteller_Story24Action, gTextStoryteller_Story24Text},
+ {0x26, 1, gTextStoryteller_Story25Title, gTextStoryteller_Story25Action, gTextStoryteller_Story25Text},
+ {0x27, 1, gTextStoryteller_Story26Title, gTextStoryteller_Story26Action, gTextStoryteller_Story26Text},
+ {0x28, 1, gTextStoryteller_Story27Title, gTextStoryteller_Story27Action, gTextStoryteller_Story27Text},
+ {0x29, 1, gTextStoryteller_Story28Title, gTextStoryteller_Story28Action, gTextStoryteller_Story28Text},
+ {0x2A, 1, gTextStoryteller_Story29Title, gTextStoryteller_Story29Action, gTextStoryteller_Story29Text},
+ {0x2B, 1, gTextStoryteller_Story30Title, gTextStoryteller_Story30Action, gTextStoryteller_Story30Text},
+ {0x2C, 1, gTextStoryteller_Story31Title, gTextStoryteller_Story31Action, gTextStoryteller_Story31Text},
+ {0x2D, 1, gTextStoryteller_Story32Title, gTextStoryteller_Story32Action, gTextStoryteller_Story32Text},
+ {0x2E, 1, gTextStoryteller_Story33Title, gTextStoryteller_Story33Action, gTextStoryteller_Story33Text},
+ {0x2F, 1, gTextStoryteller_Story34Title, gTextStoryteller_Story34Action, gTextStoryteller_Story34Text},
+ {0x30, 1, gTextStoryteller_Story35Title, gTextStoryteller_Story35Action, gTextStoryteller_Story35Text},
+ {0x31, 1, gTextStoryteller_Story36Title, gTextStoryteller_Story36Action, gTextStoryteller_Story36Text},
+};
+
+static void StorytellerSetup(void)
+{
+ struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller;
+ s32 i;
+
+ storyteller->id = MAUVILLE_MAN_STORYTELLER;
+ storyteller->alreadyRecorded = FALSE;
+ for (i = 0; i < 4; i++)
+ {
+ storyteller->gameStatIDs[i] = 0;
+ storyteller->trainerNames[0][i] = EOS; // Maybe they meant storyteller->trainerNames[i][0] instead?
+ }
+}
+
+static void sub_80F8428(void)
+{
+ struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller;
+
+ storyteller->id = MAUVILLE_MAN_STORYTELLER;
+ storyteller->alreadyRecorded = FALSE;
+}
+
+static u32 StorytellerGetGameStat(u8 stat)
+{
+ if (stat == NUM_GAME_STATS)
+ stat = 0;
+ return GetGameStat(stat);
+}
+
+static const struct Story *GetStoryByStat(u32 stat)
+{
+ s32 i;
+
+ for (i = 0; i < 36; i++)
+ {
+ if (sStorytellerStories[i].stat == stat)
+ return &sStorytellerStories[i];
+ }
+ return &sStorytellerStories[35];
+}
+
+static const u8 *GetStoryTitleByStat(u32 stat)
+{
+ return GetStoryByStat(stat)->title;
+}
+
+static const u8 *GetStoryTextByStat(u32 stat)
+{
+ return GetStoryByStat(stat)->fullText;
+}
+
+static const u8 *GetStoryActionByStat(u32 stat)
+{
+ return GetStoryByStat(stat)->action;
+}
+
+static u8 GetFreeStorySlot(void)
+{
+ u8 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller;
+
+ if (storyteller->gameStatIDs[i] == 0)
+ break;
+ }
+ return i;
+}
+
+static u32 StorytellerGetRecordedTrainerStat(u32 trainer)
+{
+ u8 *ptr = gSaveBlock1.mauvilleMan.storyteller.statValues[trainer];
+
+ return ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24);
+}
+
+static void StorytellerSetRecordedTrainerStat(u32 trainer, u32 val)
+{
+ u8 *ptr = gSaveBlock1.mauvilleMan.storyteller.statValues[trainer];
+
+ ptr[0] = val;
+ ptr[1] = val >> 8;
+ ptr[2] = val >> 16;
+ ptr[3] = val >> 24;
+}
+
+static bool32 HasTrainerStatIncreased(u32 trainer)
+{
+ struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller;
+
+ if (StorytellerGetGameStat(storyteller->gameStatIDs[trainer]) > StorytellerGetRecordedTrainerStat(trainer))
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static void GetStoryByStattellerPlayerName(u32 player, void *dst)
+{
+ u8 *name = gSaveBlock1.mauvilleMan.storyteller.trainerNames[player];
+
+ memset(dst, EOS, 8);
+ memcpy(dst, name, 7);
+}
+
+static void StorytellerSetPlayerName(u32 player, const u8 *src)
+{
+ u8 *name = gSaveBlock1.mauvilleMan.storyteller.trainerNames[player];
+ u8 len = StringLength(src);
+
+ memset(name, EOS, 7);
+ StringCopyN(name, src, len);
+}
+
+static void StorytellerRecordNewStat(u32 player, u32 stat)
+{
+ struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller;
+
+ storyteller->gameStatIDs[player] = stat;
+ StorytellerSetPlayerName(player, gSaveBlock2.playerName);
+ StorytellerSetRecordedTrainerStat(player, StorytellerGetGameStat(stat));
+ ConvertIntToDecimalStringN(gStringVar1, StorytellerGetGameStat(stat), 0, 10);
+ StringCopy(gStringVar2, GetStoryActionByStat(stat));
+}
+
+static void ScrambleStatList(u8 *arr, s32 count)
+{
+ s32 i;
+
+ for (i = 0; i < count; i++)
+ arr[i] = i;
+ for (i = 0; i < count; i++)
+ {
+ u32 a = Random() % count;
+ u32 b = Random() % count;
+ u8 temp = arr[a];
+ arr[a] = arr[b];
+ arr[b] = temp;
+ }
+}
+
+// What purpose does this struct even serve? Only the length field is used.
+static const struct {u32 length; struct MauvilleManStoryteller *unused1; u32 unused2;} sStorytellerStuff =
+{
+ 36,
+ &gSaveBlock1.mauvilleMan.storyteller, // unused
+ 12, // unused
+};
+
+static bool8 StorytellerInitializeRandomStat(void)
+{
+ u8 arr[sStorytellerStuff.length];
+ s32 i;
+ s32 j;
+
+ ScrambleStatList(arr, 36);
+ for (i = 0; i < 36; i++)
+ {
+ u8 stat = sStorytellerStories[arr[i]].stat;
+ u8 minVal = sStorytellerStories[arr[i]].minVal;
+ struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller;
+
+ for (j = 0; j < 4; j++)
+ {
+ if (gSaveBlock1.mauvilleMan.storyteller.gameStatIDs[j] == stat)
+ break;
+ }
+ if (j == 4 && StorytellerGetGameStat(stat) >= minVal)
+ {
+ storyteller->alreadyRecorded = TRUE;
+ StorytellerRecordNewStat(GetFreeStorySlot(), stat);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static void StorytellerDisplayStory(u32 player)
+{
+ struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller;
+ u8 stat = storyteller->gameStatIDs[player];
+
+ ConvertIntToDecimalStringN(gStringVar1, StorytellerGetRecordedTrainerStat(player), 0, 10);
+ StringCopy(gStringVar2, GetStoryActionByStat(stat));
+ GetStoryByStattellerPlayerName(player, gStringVar3);
+ ShowFieldMessage(GetStoryTextByStat(stat));
+}
+
+static void PrintStoryList(void)
+{
+ s32 i;
+
+ MenuDrawTextWindow(0, 0, 25, 4 + GetFreeStorySlot() * 2);
+ for (i = 0; i < 4; i++)
+ {
+ struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller;
+ u8 stat = storyteller->gameStatIDs[i];
+
+ if (stat == 0)
+ break;
+ MenuPrint(GetStoryTitleByStat(stat), 1, 2 + i * 2);
+ }
+ MenuPrint(gPCText_Cancel, 1, 2 + i * 2);
+}
+
+static u8 gUnknown_03000748;
+
+static void Task_StoryListMenu(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ s32 selection;
+
+ switch (task->data[0])
+ {
+ case 0:
+ PrintStoryList();
+ InitMenu(0, 1, 2, GetFreeStorySlot() + 1, 0, 24);
+ task->data[0]++;
+ break;
+ case 1:
+ selection = ProcessMenuInput();
+ if (selection == -2)
+ break;
+ if (selection == -1 || selection == GetFreeStorySlot())
+ {
+ gSpecialVar_Result = 0;
+ }
+ else
+ {
+ gSpecialVar_Result = 1;
+ gUnknown_03000748 = selection;
+ }
+ HandleDestroyMenuCursors();
+ MenuZeroFillWindowRect(0, 0, 25, 12);
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+ break;
+ }
+}
+
+// Sets gSpecialVar_Result to TRUE if player selected a story
+void ScrSpecial_StorytellerStoryListMenu(void)
+{
+ CreateTask(Task_StoryListMenu, 0x50);
+}
+
+void ScrSpecial_StorytellerDisplayStory(void)
+{
+ StorytellerDisplayStory(gUnknown_03000748);
+}
+
+u8 ScrSpecial_StorytellerGetFreeStorySlot(void)
+{
+ return GetFreeStorySlot();
+}
+
+// Returns TRUE if stat has increased
+bool8 ScrSpecial_StorytellerUpdateStat(void)
+{
+ struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller;
+ u8 r4 = storyteller->gameStatIDs[gUnknown_03000748];
+
+ if (HasTrainerStatIncreased(gUnknown_03000748) == TRUE)
+ {
+ StorytellerRecordNewStat(gUnknown_03000748, r4);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 ScrSpecial_HasStorytellerAlreadyRecorded(void)
+{
+ struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller;
+
+ if (storyteller->alreadyRecorded == FALSE)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+bool8 ScrSpecial_StorytellerInitializeRandomStat(void)
+{
+ return StorytellerInitializeRandomStat();
+}
diff --git a/src/menu_helpers.c b/src/field/menu_helpers.c
index 9915d67ac..e3ef0c790 100644
--- a/src/menu_helpers.c
+++ b/src/field/menu_helpers.c
@@ -1,14 +1,14 @@
#include "global.h"
#include "item_menu.h"
-#include "items.h"
+#include "constants/items.h"
#include "link.h"
#include "mail_data.h"
#include "main.h"
-#include "map_constants.h"
+#include "constants/maps.h"
#include "menu.h"
#include "menu_helpers.h"
-#include "rom4.h"
-#include "songs.h"
+#include "overworld.h"
+#include "constants/songs.h"
#include "sound.h"
#include "sprite.h"
#include "task.h"
@@ -140,7 +140,7 @@ static void PrintMessage(const u8 *str, u16 tile)
{
sub_80A3FA0(&gBGTilemapBuffers[1][0], 2, 15, 26, 4, tile);
}
- sub_8072044(str);
+ MenuPrintMessageDefaultCoords(str);
}
static void sub_80F9090(u8 taskId)
@@ -261,7 +261,7 @@ bool8 sub_80F92F4(u16 itemId)
return TRUE;
}
- if (!(gSaveBlock1.location.mapGroup == MAP_GROUP_TRADE_CENTER && gSaveBlock1.location.mapNum == MAP_ID_TRADE_CENTER))
+ if (!(gSaveBlock1.location.mapGroup == MAP_GROUP(TRADE_CENTER) && gSaveBlock1.location.mapNum == MAP_NUM(TRADE_CENTER)))
{
return TRUE;
}
@@ -405,15 +405,15 @@ void CreateVerticalScrollIndicators(u8 id, u16 x, u16 y)
if (gUnknown_020388C0[0] == 0xFF)
{
gUnknown_020388C0[0] = CreateSprite(&gSpriteTemplate_83E59D0, x, y, 0);
- gSprites[gUnknown_020388C0[0]].data2 = -1;
+ gSprites[gUnknown_020388C0[0]].data[2] = -1;
if (gUnknown_020388C0[1] != 0xFF)
{
gSprites[gUnknown_020388C0[0]].pos2.y = gSprites[gUnknown_020388C0[1]].pos2.y * -1;
- gSprites[gUnknown_020388C0[0]].data3 = gSprites[gUnknown_020388C0[1]].data3;
+ gSprites[gUnknown_020388C0[0]].data[3] = gSprites[gUnknown_020388C0[1]].data[3];
}
else
{
- gSprites[gUnknown_020388C0[0]].data3 = 0;
+ gSprites[gUnknown_020388C0[0]].data[3] = 0;
}
}
break;
@@ -422,15 +422,15 @@ void CreateVerticalScrollIndicators(u8 id, u16 x, u16 y)
if (gUnknown_020388C0[1] == 0xFF)
{
gUnknown_020388C0[1] = CreateSprite(&gSpriteTemplate_83E59D0, x, y, 0);
- gSprites[gUnknown_020388C0[1]].data2 = 1;
+ gSprites[gUnknown_020388C0[1]].data[2] = 1;
if (gUnknown_020388C0[0] != 0xFF)
{
gSprites[gUnknown_020388C0[1]].pos2.y = gSprites[gUnknown_020388C0[0]].pos2.y * -1;
- gSprites[gUnknown_020388C0[1]].data3 = gSprites[gUnknown_020388C0[0]].data3;
+ gSprites[gUnknown_020388C0[1]].data[3] = gSprites[gUnknown_020388C0[0]].data[3];
}
else
{
- gSprites[gUnknown_020388C0[1]].data3 = 0;
+ gSprites[gUnknown_020388C0[1]].data[3] = 0;
}
}
break;
@@ -439,15 +439,15 @@ void CreateVerticalScrollIndicators(u8 id, u16 x, u16 y)
if (gUnknown_020388C0[2] == 0xFF)
{
gUnknown_020388C0[2] = CreateSprite(&gSpriteTemplate_83E59E8, x, y, 0);
- gSprites[gUnknown_020388C0[2]].data0 = -1;
+ gSprites[gUnknown_020388C0[2]].data[0] = -1;
if (gUnknown_020388C0[3] != 0xFF)
{
gSprites[gUnknown_020388C0[2]].pos2.x = gSprites[gUnknown_020388C0[3]].pos2.x * -1;
- gSprites[gUnknown_020388C0[2]].data1 = gSprites[gUnknown_020388C0[3]].data1;
+ gSprites[gUnknown_020388C0[2]].data[1] = gSprites[gUnknown_020388C0[3]].data[1];
}
else
{
- gSprites[gUnknown_020388C0[2]].data1 = 0;
+ gSprites[gUnknown_020388C0[2]].data[1] = 0;
}
}
break;
@@ -456,15 +456,15 @@ void CreateVerticalScrollIndicators(u8 id, u16 x, u16 y)
if (gUnknown_020388C0[3] == 0xFF)
{
gUnknown_020388C0[3] = CreateSprite(&gSpriteTemplate_83E59E8, x, y, 0);
- gSprites[gUnknown_020388C0[3]].data0 = 1;
+ gSprites[gUnknown_020388C0[3]].data[0] = 1;
if (gUnknown_020388C0[2] != 0xFF)
{
gSprites[gUnknown_020388C0[3]].pos2.x = gSprites[gUnknown_020388C0[2]].pos2.x * -1;
- gSprites[gUnknown_020388C0[3]].data1 = gSprites[gUnknown_020388C0[2]].data1;
+ gSprites[gUnknown_020388C0[3]].data[1] = gSprites[gUnknown_020388C0[2]].data[1];
}
else
{
- gSprites[gUnknown_020388C0[3]].data1 = 0;
+ gSprites[gUnknown_020388C0[3]].data[1] = 0;
}
}
break;
@@ -502,23 +502,23 @@ void BuyMenuFreeMemory(void)
static void sub_80F9834(struct Sprite *sprite)
{
- if (sprite->data1 == 0)
+ if (sprite->data[1] == 0)
{
- sprite->pos2.x += sprite->data0;
+ sprite->pos2.x += sprite->data[0];
}
- if (sprite->data3 == 0)
+ if (sprite->data[3] == 0)
{
- sprite->pos2.y += sprite->data2;
+ sprite->pos2.y += sprite->data[2];
}
- sprite->data1++;
- sprite->data3++;
- if (sprite->data1 > 2)
+ sprite->data[1]++;
+ sprite->data[3]++;
+ if (sprite->data[1] > 2)
{
- sprite->data1 = 0;
+ sprite->data[1] = 0;
}
- if (sprite->data3 > 2)
+ if (sprite->data[3] > 2)
{
- sprite->data3 = 0;
+ sprite->data[3] = 0;
}
if (sprite->pos2.x == 8 || sprite->pos2.x == -8)
{
@@ -552,8 +552,8 @@ static void sub_80F9914(u8 id)
{
gSprites[gUnknown_020388C0[id]].pos2.x = 0;
gSprites[gUnknown_020388C0[id]].pos2.y = 0;
- gSprites[gUnknown_020388C0[id]].data1 = 0;
- gSprites[gUnknown_020388C0[id]].data3 = 0;
+ gSprites[gUnknown_020388C0[id]].data[1] = 0;
+ gSprites[gUnknown_020388C0[id]].data[3] = 0;
}
}
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 67b7eb03f..d0f0ab1f6 100644
--- a/src/money.c
+++ b/src/field/money.c
@@ -4,6 +4,7 @@
#include "menu.h"
#include "sprite.h"
#include "string_util.h"
+#include "graphics.h"
#define SPRITE_TAG_MONEY (0x2722)
@@ -11,9 +12,47 @@ extern u16 gSpecialVar_0x8005;
static EWRAM_DATA u8 gUnknown_02038734 = 0;
-extern const struct CompressedSpriteSheet gUnknown_083CF584;
-extern const struct CompressedSpritePalette gUnknown_083CF58C;
-extern const struct SpriteTemplate gSpriteTemplate_83CF56C;
+static const struct OamData gOamData_83CF558 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const union AnimCmd gSpriteAnim_83CF560[] =
+{
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END
+};
+
+const union AnimCmd *const gSpriteAnimTable_83CF568[] =
+{
+ gSpriteAnim_83CF560,
+};
+
+const struct SpriteTemplate gSpriteTemplate_83CF56C =
+{
+ .tileTag = 10018,
+ .paletteTag = 10018,
+ .oam = &gOamData_83CF558,
+ .anims = gSpriteAnimTable_83CF568,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+const struct CompressedSpriteSheet gUnknown_083CF584[] = {gMenuMoneyGfx, 256, SPRITE_TAG_MONEY};
+const struct CompressedSpritePalette gUnknown_083CF58C[] = {gMenuMoneyPal, SPRITE_TAG_MONEY};
bool8 IsEnoughMoney(u32 budget, u32 cost)
{
@@ -25,7 +64,7 @@ bool8 IsEnoughMoney(u32 budget, u32 cost)
return FALSE;
}
-void sub_80B79B8(u32 *arg0, u32 arg1)
+void AddMoney(u32 *arg0, u32 arg1)
{
if (*arg0 > *arg0 + arg1)
{
@@ -40,7 +79,7 @@ void sub_80B79B8(u32 *arg0, u32 arg1)
}
}
-void sub_80B79E0(u32 *arg0, u32 arg1)
+void RemoveMoney(u32 *arg0, u32 arg1)
{
if (*arg0 < arg1)
{
@@ -52,39 +91,25 @@ void sub_80B79E0(u32 *arg0, u32 arg1)
}
}
-void sub_80B79F8(u8 *buffer, u32 arg1, u8 arg2)
+void GetMoneyAmountText(u8 *buffer, u32 amount, u8 arg2)
{
u8 width;
u8 i;
- if (arg1 > 999999)
- {
+ if (amount > 999999)
width = 7;
- }
- else if (arg1 > 99999)
- {
+ else if (amount > 99999)
width = 6;
- }
- else if (arg1 > 10000)
- {
+ else if (amount > 10000)
width = 5;
- }
- else if (arg1 > 999)
- {
+ else if (amount > 999)
width = 4;
- }
- else if (arg1 > 99)
- {
+ else if (amount > 99)
width = 3;
- }
- else if (arg1 > 9)
- {
+ else if (amount > 9)
width = 2;
- }
else
- {
width = 1;
- }
buffer[0] = EXT_CTRL_CODE_BEGIN;
buffer[1] = 0x14;
@@ -100,7 +125,7 @@ void sub_80B79F8(u8 *buffer, u32 arg1, u8 arg2)
buffer[0] = CHAR_CURRENCY;
buffer += 1;
- buffer = ConvertIntToDecimalString(buffer, arg1);
+ buffer = ConvertIntToDecimalString(buffer, amount);
buffer[0] = EXT_CTRL_CODE_BEGIN;
buffer[1] = 0x14;
@@ -108,16 +133,18 @@ void sub_80B79F8(u8 *buffer, u32 arg1, u8 arg2)
buffer[3] = EOS;
}
-void sub_80B7A94(u32 arg0, u8 size, u8 x, u8 y)
+void PrintMoneyAmount(u32 amount, u8 size, u8 x, u8 y)
{
u8 buffer[16];
u8 stringWidth;
- sub_80B79F8(buffer, arg0, size);
+ GetMoneyAmountText(buffer, amount, size);
stringWidth = sub_8072CA4(buffer);
if (stringWidth >= (size + 1) * 8)
+ {
MenuPrint(buffer, x, y);
+ }
else
{
int xPlusOne = x + 1;
@@ -241,35 +268,35 @@ _080B7BE8: .4byte 0x0600f840\n\
.syntax divided\n");
}
-void sub_80B7BEC(u32 arg0, u8 x, u8 y)
+void UpdateMoneyWindow(u32 amount, u8 x, u8 y)
{
- sub_80B7A94(arg0, 6, x + 6, y + 1);
+ PrintMoneyAmount(amount, 6, x + 6, y + 1);
}
-void sub_80B7C14(u32 arg0, u8 x, u8 y)
+void OpenMoneyWindow(u32 amount, u8 x, u8 y)
{
MenuDrawTextWindow(x, y, x + 13, y + 3);
- sub_80B7BEC(arg0, x, y);
+ UpdateMoneyWindow(amount, x, y);
- LoadCompressedObjectPic(&gUnknown_083CF584);
- LoadCompressedObjectPalette(&gUnknown_083CF58C);
+ LoadCompressedObjectPic(gUnknown_083CF584);
+ LoadCompressedObjectPalette(gUnknown_083CF58C);
gUnknown_02038734 = CreateSprite(&gSpriteTemplate_83CF56C, x * 8 + 19, y * 8 + 11, 0);
}
-void RemoveMoneyLabelObject(u8 x, u8 y)
+void CloseMoneyWindow(u8 x, u8 y)
{
DestroySpriteAndFreeResources(&gSprites[gUnknown_02038734]);
FreeSpritePaletteByTag(SPRITE_TAG_MONEY);
MenuZeroFillWindowRect(x, y, x + 13, y + 3);
}
-bool8 sub_80B7CE8(void)
+bool8 HasEnoughMoneyFor(void)
{
return IsEnoughMoney(gSaveBlock1.money, gSpecialVar_0x8005);
}
-void sub_80B7D0C(void)
+void PayMoneyFor(void)
{
- sub_80B79E0(&gSaveBlock1.money, gSpecialVar_0x8005);
+ RemoveMoney(&gSaveBlock1.money, gSpecialVar_0x8005);
}
diff --git a/src/rom4.c b/src/field/overworld.c
index f9006efba..e239daec7 100644
--- a/src/rom4.c
+++ b/src/field/overworld.c
@@ -1,5 +1,5 @@
#include "global.h"
-#include "rom4.h"
+#include "overworld.h"
#include "battle_setup.h"
#include "berry.h"
#include "cable_club.h"
@@ -25,21 +25,23 @@
#include "link.h"
#include "load_save.h"
#include "main.h"
+#include "constants/maps.h"
#include "map_name_popup.h"
#include "menu.h"
#include "metatile_behavior.h"
#include "new_game.h"
#include "palette.h"
#include "play_time.h"
-#include "rng.h"
+#include "random.h"
#include "roamer.h"
#include "rotating_gate.h"
#include "safari_zone.h"
#include "script.h"
#include "script_pokemon_80C4.h"
#include "secret_base.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
+#include "constants/species.h"
#include "start_menu.h"
#include "task.h"
#include "tileset_anim.h"
@@ -60,28 +62,10 @@ struct UnkTVStruct
u32 tv_field_4;
};
-EWRAM_DATA struct WarpData gUnknown_020297F0 = {0};
-EWRAM_DATA struct WarpData gUnknown_020297F8 = {0};
-EWRAM_DATA struct WarpData gUnknown_02029800 = {0};
-EWRAM_DATA struct WarpData gUnknown_02029808 = {0};
-EWRAM_DATA struct UnkPlayerStruct gUnknown_02029810 = {0};
-EWRAM_DATA u16 gUnknown_02029814 = 0;
-EWRAM_DATA bool8 gUnknown_02029816 = FALSE;
-EWRAM_DATA struct LinkPlayerMapObject gLinkPlayerMapObjects[4] = {0};
-
-static u8 gUnknown_03000580[4];
-static u16 (*gUnknown_03000584)(u32);
-static u8 gUnknown_03000588;
-
-u16 word_3004858;
-void (*gFieldCallback)(void);
-u8 gUnknown_03004860;
-u8 gFieldLinkPlayerCount;
-
extern u16 gUnknown_03004898;
extern u16 gUnknown_0300489C;
-extern u8 EventScript_LeagueWhiteOut[];
+extern u8 S_WhiteOut[];
extern u8 gUnknown_0819FC9F[];
extern u8 SingleBattleColosseum_EventScript_1A436F[];
extern u8 SingleBattleColosseum_EventScript_1A4379[];
@@ -102,71 +86,165 @@ extern u8 TradeRoom_PromptToCancelLink[];
extern u8 TradeRoom_TerminateLink[];
extern u8 gUnknown_081A4508[];
-extern u8 (*gUnknown_082166A0[])(struct LinkPlayerMapObject *, struct MapObject *, u8);
-extern u8 (*gUnknown_082166AC[])(struct LinkPlayerMapObject *, struct MapObject *, u8);
-extern void (*gUnknown_082166D8[])(struct LinkPlayerMapObject *, struct MapObject *);
-
extern struct MapData * const gMapAttributes[];
extern struct MapHeader * const * const gMapGroups[];
-extern const struct WarpData gDummyWarpData;
-extern s32 gUnknown_0839ACE8;
-extern u32 gUnknown_08216694[];
+extern s32 gMaxFlashLevel;
+
+EWRAM_DATA struct WarpData gUnknown_020297F0 = {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};
+EWRAM_DATA static u16 sAmbientCrySpecies = 0;
+EWRAM_DATA static bool8 sIsAmbientCryWaterMon = FALSE;
+EWRAM_DATA struct LinkPlayerMapObject gLinkPlayerMapObjects[4] = {0};
-void DoWhiteOut(void)
+static u8 gUnknown_03000580[4];
+static u16 (*gUnknown_03000584)(u32);
+static u8 gUnknown_03000588;
+
+u16 word_3004858;
+void (*gFieldCallback)(void);
+u8 gUnknown_03004860;
+u8 gFieldLinkPlayerCount;
+
+static const struct WarpData sDummyWarpData =
+{
+ .mapGroup = -1,
+ .mapNum = -1,
+ .warpId = -1,
+ .x = -1,
+ .y = -1,
+};
+
+static const u8 sUnusedData[] =
+{
+ 0xB0, 0x04, 0x00, 0x00,
+ 0x10, 0x0E, 0x00, 0x00,
+ 0xB0, 0x04, 0x00, 0x00,
+ 0x60, 0x09, 0x00, 0x00,
+ 0x32, 0x00, 0x00, 0x00,
+ 0x50, 0x00, 0x00, 0x00,
+ 0xD4, 0xFF, 0xFF, 0xFF,
+ 0x2C, 0x00, 0x00, 0x00,
+};
+
+const struct UCoords32 gUnknown_0821664C[] =
+{
+ { 0, 0},
+ { 0, 1},
+ { 0, -1},
+ {-1, 0},
+ { 1, 0},
+ {-1, 1},
+ { 1, 1},
+ {-1, -1},
+ { 1, -1},
+};
+
+const struct UnknownTaskStruct gUnknown_08216694 =
{
- ScriptContext2_RunNewScript(EventScript_LeagueWhiteOut);
+ (void *)REG_ADDR_WIN0H,
+ ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1,
+ 1,
+ 0,
+};
+
+static u8 sub_8055C68(struct LinkPlayerMapObject *, struct MapObject *, u8);
+static u8 sub_8055C88(struct LinkPlayerMapObject *, struct MapObject *, u8);
+static u8 sub_8055C8C(struct LinkPlayerMapObject *, struct MapObject *, u8);
+
+static u8 (*const gUnknown_082166A0[])(struct LinkPlayerMapObject *, struct MapObject *, u8) =
+{
+ sub_8055C68,
+ sub_8055C88,
+ sub_8055C8C,
+};
+
+static u8 sub_8055CAC(struct LinkPlayerMapObject *, struct MapObject *, u8);
+static u8 sub_8055CB0(struct LinkPlayerMapObject *, struct MapObject *, u8);
+static u8 sub_8055D18(struct LinkPlayerMapObject *, struct MapObject *, u8);
+
+static u8 (*const gUnknown_082166AC[])(struct LinkPlayerMapObject *, struct MapObject *, u8) =
+{
+ sub_8055CAC,
+ sub_8055CB0,
+ sub_8055CB0,
+ sub_8055CB0,
+ sub_8055CB0,
+ sub_8055CAC,
+ sub_8055CAC,
+ sub_8055D18,
+ sub_8055D18,
+ sub_8055D18,
+ sub_8055D18,
+};
+
+static void sub_8055D30(struct LinkPlayerMapObject *, struct MapObject *);
+static void sub_8055D38(struct LinkPlayerMapObject *, struct MapObject *);
+
+static void (*const gUnknown_082166D8[])(struct LinkPlayerMapObject *, struct MapObject *) =
+{
+ sub_8055D30,
+ sub_8055D38,
+};
+
+
+static void DoWhiteOut(void)
+{
+ ScriptContext2_RunNewScript(S_WhiteOut);
gSaveBlock1.money /= 2;
- HealPlayerParty();
- sub_8053050();
- sub_8053570();
+ ScrSpecial_HealPlayerParty();
+ Overworld_ResetStateAfterWhiteOut();
+ Overworld_SetWarpDestToLastHealLoc();
warp_in();
}
-void flag_var_implications_of_teleport_(void)
+void Overworld_ResetStateAfterFly(void)
{
player_avatar_init_params_reset();
- FlagReset(SYS_CYCLING_ROAD);
- FlagReset(SYS_CRUISE_MODE);
- FlagReset(SYS_SAFARI_MODE);
- FlagReset(SYS_USE_STRENGTH);
- FlagReset(SYS_USE_FLASH);
+ FlagClear(FLAG_SYS_CYCLING_ROAD);
+ FlagClear(FLAG_SYS_CRUISE_MODE);
+ FlagClear(FLAG_SYS_SAFARI_MODE);
+ FlagClear(FLAG_SYS_USE_STRENGTH);
+ FlagClear(FLAG_SYS_USE_FLASH);
}
-void new_game(void)
+void Overworld_ResetStateAfterTeleport(void)
{
player_avatar_init_params_reset();
- FlagReset(SYS_CYCLING_ROAD);
- FlagReset(SYS_CRUISE_MODE);
- FlagReset(SYS_SAFARI_MODE);
- FlagReset(SYS_USE_STRENGTH);
- FlagReset(SYS_USE_FLASH);
+ FlagClear(FLAG_SYS_CYCLING_ROAD);
+ FlagClear(FLAG_SYS_CRUISE_MODE);
+ FlagClear(FLAG_SYS_SAFARI_MODE);
+ FlagClear(FLAG_SYS_USE_STRENGTH);
+ FlagClear(FLAG_SYS_USE_FLASH);
ScriptContext2_RunNewScript(gUnknown_0819FC9F);
}
-void sub_8053014(void)
+void Overworld_ResetStateAfterDigEscRope(void)
{
player_avatar_init_params_reset();
- FlagReset(SYS_CYCLING_ROAD);
- FlagReset(SYS_CRUISE_MODE);
- FlagReset(SYS_SAFARI_MODE);
- FlagReset(SYS_USE_STRENGTH);
- FlagReset(SYS_USE_FLASH);
+ FlagClear(FLAG_SYS_CYCLING_ROAD);
+ FlagClear(FLAG_SYS_CRUISE_MODE);
+ FlagClear(FLAG_SYS_SAFARI_MODE);
+ FlagClear(FLAG_SYS_USE_STRENGTH);
+ FlagClear(FLAG_SYS_USE_FLASH);
}
-void sub_8053050(void)
+void Overworld_ResetStateAfterWhiteOut(void)
{
player_avatar_init_params_reset();
- FlagReset(SYS_CYCLING_ROAD);
- FlagReset(SYS_CRUISE_MODE);
- FlagReset(SYS_SAFARI_MODE);
- FlagReset(SYS_USE_STRENGTH);
- FlagReset(SYS_USE_FLASH);
+ FlagClear(FLAG_SYS_CYCLING_ROAD);
+ FlagClear(FLAG_SYS_CRUISE_MODE);
+ FlagClear(FLAG_SYS_SAFARI_MODE);
+ FlagClear(FLAG_SYS_USE_STRENGTH);
+ FlagClear(FLAG_SYS_USE_FLASH);
}
void sub_805308C(void)
{
- FlagReset(SYS_SAFARI_MODE);
- sub_8054164();
+ FlagClear(FLAG_SYS_SAFARI_MODE);
+ ChooseAmbientCrySpecies();
ResetCyclingRoadChallengeData();
UpdateLocationHistoryForRoamer();
RoamerMoveToOtherLocationSet();
@@ -205,23 +283,27 @@ 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));
}
-void sub_8053198(void)
+static void LoadSaveblockMapObjScripts(void)
{
struct MapObjectTemplate *mapObjectTemplates = gSaveBlock1.mapObjectTemplates;
s32 i;
+
for (i = 0; i < 64; i++)
mapObjectTemplates[i].script = gMapHeader.events->mapObjects[i].script;
}
-void update_saveblock1_field_object_coords(u8 localId, s16 x, s16 y)
+void Overworld_SetMapObjTemplateCoords(u8 localId, s16 x, s16 y)
{
s32 i;
for (i = 0; i < 64; i++)
@@ -231,28 +313,27 @@ void update_saveblock1_field_object_coords(u8 localId, s16 x, s16 y)
{
mapObjectTemplate->x = x;
mapObjectTemplate->y = y;
- break;
+ return;
}
}
}
-void update_saveblock1_field_object_movement_behavior(u8 localId, u8 movementType)
+void Overworld_SetMapObjTemplateMovementType(u8 localId, u8 movementType)
{
- s32 i = 0;
- struct MapObjectTemplate *mapObjectTemplate = gSaveBlock1.mapObjectTemplates;
- do
+ s32 i;
+
+ for (i = 0; i < 64; i++)
{
+ struct MapObjectTemplate *mapObjectTemplate = &gSaveBlock1.mapObjectTemplates[i];
if (mapObjectTemplate->localId == localId)
{
mapObjectTemplate->movementType = movementType;
- break;
+ return;
}
- mapObjectTemplate++;
- i++;
- } while (i < 64);
+ }
}
-void mapdata_load_assets_to_gpu_and_full_redraw(void)
+static void mapdata_load_assets_to_gpu_and_full_redraw(void)
{
move_tilemap_camera_to_upper_left_corner();
copy_map_tileset1_tileset2_to_vram(gMapHeader.mapData);
@@ -261,7 +342,7 @@ void mapdata_load_assets_to_gpu_and_full_redraw(void)
cur_mapheader_run_tileset_funcs_after_some_cpuset();
}
-struct MapData *get_mapdata_header(void)
+static struct MapData *get_mapdata_header(void)
{
u16 mapDataId = gSaveBlock1.mapDataId;
if (mapDataId)
@@ -269,15 +350,15 @@ struct MapData *get_mapdata_header(void)
return NULL;
}
-void warp_shift(void)
+static void ApplyCurrentWarp(void)
{
gUnknown_020297F0 = gSaveBlock1.location;
- gSaveBlock1.location = gUnknown_020297F8;
- gUnknown_02029800 = gDummyWarpData;
- gUnknown_02029808 = gDummyWarpData;
+ gSaveBlock1.location = gWarpDestination;
+ gUnknown_02029800 = sDummyWarpData;
+ gUnknown_02029808 = sDummyWarpData;
}
-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;
@@ -286,7 +367,7 @@ void warp_set(struct WarpData *warp, s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8
warp->y = y;
}
-bool32 warp_data_is_not_neg_1(struct WarpData *warp)
+static bool32 warp_data_is_not_neg_1(struct WarpData *warp)
{
if (warp->mapGroup != -1)
return FALSE;
@@ -301,31 +382,27 @@ bool32 warp_data_is_not_neg_1(struct WarpData *warp)
return TRUE;
}
-struct MapHeader * const get_mapheader_by_bank_and_number(u16 mapGroup, u16 mapNum)
+struct MapHeader *const Overworld_GetMapHeaderByGroupAndId(u16 mapGroup, u16 mapNum)
{
return gMapGroups[mapGroup][mapNum];
}
-struct MapHeader * const warp1_get_mapheader(void)
+struct MapHeader *const warp1_get_mapheader(void)
{
- return get_mapheader_by_bank_and_number(gUnknown_020297F8.mapGroup, gUnknown_020297F8.mapNum);
+ return Overworld_GetMapHeaderByGroupAndId(gWarpDestination.mapGroup, gWarpDestination.mapNum);
}
-void set_current_map_header_from_sav1_save_old_name(void)
+static void set_current_map_header_from_sav1_save_old_name(void)
{
- struct MapHeader *dest = &gMapHeader;
- struct MapHeader *src = get_mapheader_by_bank_and_number(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum);
- *dest = *src;
- gSaveBlock1.mapDataId = dest->mapDataId;
- dest->mapData = get_mapdata_header();
+ gMapHeader = *Overworld_GetMapHeaderByGroupAndId(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum);
+ gSaveBlock1.mapDataId = gMapHeader.mapDataId;
+ gMapHeader.mapData = get_mapdata_header();
}
-void sub_805338C(void)
+static void LoadSaveblockMapHeader(void)
{
- struct MapHeader *dest = &gMapHeader;
- struct MapHeader *src = get_mapheader_by_bank_and_number(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum);
- *dest = *src;
- dest->mapData = get_mapdata_header();
+ gMapHeader = *Overworld_GetMapHeaderByGroupAndId(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum);
+ gMapHeader.mapData = get_mapdata_header();
}
void sub_80533CC(void)
@@ -349,115 +426,117 @@ 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)
{
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 = sav1_map_get_light_level();
- u8 v5 = get_map_light_level_by_bank_and_number(gUnknown_020297F8.mapGroup, gUnknown_020297F8.mapNum);
- if (is_light_level_1_2_3_5_or_6(v4) && is_light_level_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()
@@ -465,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;
@@ -483,10 +562,11 @@ struct MapConnection *sub_8053818(u8 dir)
bool8 sub_8053850(u8 dir, u16 x, u16 y)
{
- struct MapConnection *connection = sub_8053818(dir);
- if (connection)
+ 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
{
@@ -512,20 +592,20 @@ 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();
- sub_8082BD0(mapGroup, mapNum);
+ TryUpdateRandomTrainerRematches(mapGroup, mapNum);
DoTimeBasedEvents();
- sub_80806E4();
- sub_8054164();
- sub_8053C98();
- sav1_reset_battle_music_maybe();
+ SetSav1WeatherFromCurrMapHeader();
+ ChooseAmbientCrySpecies();
+ SetDefaultFlashLevel();
+ Overworld_ClearSavedMusic();
mapheader_run_script_with_tag_x3();
not_trainer_hill_battle_pyramid();
sub_8056D38(gMapHeader.mapData);
@@ -549,21 +629,21 @@ void sub_8053994(u32 a1)
bool8 v3;
set_current_map_header_from_sav1_save_old_name();
- sub_8053154();
- v2 = is_light_level_1_2_3_5_or_6(gMapHeader.mapType);
- v3 = is_light_level_8_or_9(gMapHeader.mapType);
+ LoadMapObjTemplatesFromHeader();
+ v2 = is_map_type_1_2_3_5_or_6(gMapHeader.mapType);
+ v3 = Overworld_MapTypeIsIndoors(gMapHeader.mapType);
ClearTempFieldEventData();
ResetCyclingRoadChallengeData();
prev_quest_postbuffer_cursor_backup_reset();
- sub_8082BD0(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum);
+ TryUpdateRandomTrainerRematches(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum);
if (a1 != 1)
DoTimeBasedEvents();
- sub_80806E4();
- sub_8054164();
+ SetSav1WeatherFromCurrMapHeader();
+ ChooseAmbientCrySpecies();
if (v2)
- FlagReset(SYS_USE_FLASH);
- sub_8053C98();
- sav1_reset_battle_music_maybe();
+ FlagClear(FLAG_SYS_USE_FLASH);
+ SetDefaultFlashLevel();
+ Overworld_ClearSavedMusic();
mapheader_run_script_with_tag_x3();
UpdateLocationHistoryForRoamer();
RoamerMoveToOtherLocationSet();
@@ -600,24 +680,24 @@ void walkrun_find_lowest_active_bit_in_bitfield(void)
struct UnkPlayerStruct *sub_8053AA8(void)
{
struct UnkPlayerStruct playerStruct;
- u8 light = sav1_map_get_light_level();
+ u8 mapType = Overworld_GetMapTypeOfSaveblockLocation();
u16 v2 = cur_mapdata_block_role_at_screen_center_acc_to_sav1();
- u8 v4 = sub_8053B00(&gUnknown_02029810, v2, light);
+ u8 v4 = sub_8053B00(&gUnknown_02029810, v2, mapType);
playerStruct.player_field_0 = v4;
- playerStruct.player_field_1 = sub_8053B60(&gUnknown_02029810, v4, v2, light);
+ playerStruct.player_field_1 = sub_8053B60(&gUnknown_02029810, v4, v2, mapType);
gUnknown_02029810 = playerStruct;
return &gUnknown_02029810;
}
u8 sub_8053B00(struct UnkPlayerStruct *playerStruct, u16 a2, u8 a3)
{
- if (a3 != 8 && FlagGet(SYS_CRUISE_MODE))
+ if (a3 != 8 && FlagGet(FLAG_SYS_CRUISE_MODE))
return 1;
if (a3 == 5)
return 16;
if (MetatileBehavior_IsSurfableWaterOrUnderwater(a2) == 1)
return 8;
- if (IsBikingAllowedByMap() != TRUE)
+ if (Overworld_IsBikingAllowed() != TRUE)
return 1;
if (playerStruct->player_field_0 == 2)
return 2;
@@ -628,7 +708,7 @@ u8 sub_8053B00(struct UnkPlayerStruct *playerStruct, u16 a2, u8 a3)
u8 sub_8053B60(struct UnkPlayerStruct *playerStruct, u8 a2, u16 a3, u8 a4)
{
- if (FlagGet(SYS_CRUISE_MODE) && a4 == 6)
+ if (FlagGet(FLAG_SYS_CRUISE_MODE) && a4 == 6)
return 4;
if (MetatileBehavior_IsDeepSouthWarp(a3) == TRUE)
return 2;
@@ -655,10 +735,12 @@ u16 cur_mapdata_block_role_at_screen_center_acc_to_sav1(void)
return MapGridGetMetatileBehaviorAt(gSaveBlock1.pos.x + 7, gSaveBlock1.pos.y + 7);
}
-bool32 IsBikingAllowedByMap(void)
+bool32 Overworld_IsBikingAllowed(void)
{
// is player in cycling road entrance?
- if (gSaveBlock1.location.mapGroup == 29 && (gSaveBlock1.location.mapNum == 11 || gSaveBlock1.location.mapNum == 12))
+ if (gSaveBlock1.location.mapGroup == MAP_GROUP(ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE)
+ && (gSaveBlock1.location.mapNum == MAP_NUM(ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE)
+ || gSaveBlock1.location.mapNum == MAP_NUM(ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE)))
return TRUE;
// is player indoor, in a secret base, or underwater?
@@ -669,37 +751,37 @@ bool32 IsBikingAllowedByMap(void)
if (gMapHeader.mapType == MAP_TYPE_UNDERWATER)
return FALSE;
- // is player in SeafloorCavern_Room9?
- if (gSaveBlock1.location.mapGroup == 24 && gSaveBlock1.location.mapNum == 36)
+ // Thou shalt not bike on the sacred resting grounds of Kyogre/Groudon.
+ if (gSaveBlock1.location.mapGroup == MAP_GROUP(SEAFLOOR_CAVERN_ROOM9)
+ && gSaveBlock1.location.mapNum == MAP_NUM(SEAFLOOR_CAVERN_ROOM9))
return FALSE;
-
- // is player in CaveOfOrigin_B4F?
- if (gSaveBlock1.location.mapGroup == 24 && gSaveBlock1.location.mapNum == 42)
+ if (gSaveBlock1.location.mapGroup == MAP_GROUP(CAVE_OF_ORIGIN_B4F)
+ && gSaveBlock1.location.mapNum == MAP_NUM(CAVE_OF_ORIGIN_B4F))
return FALSE;
return TRUE;
}
-void sub_8053C98(void)
+void SetDefaultFlashLevel(void)
{
if (!gMapHeader.cave)
- gSaveBlock1.flashUsed = 0;
- else if (FlagGet(SYS_USE_FLASH))
- gSaveBlock1.flashUsed = 1;
+ gSaveBlock1.flashLevel = 0;
+ else if (FlagGet(FLAG_SYS_USE_FLASH))
+ gSaveBlock1.flashLevel = 1;
else
- gSaveBlock1.flashUsed = gUnknown_0839ACE8;
+ gSaveBlock1.flashLevel = gMaxFlashLevel;
}
-void sub_8053CE4(s32 a1)
+void Overworld_SetFlashLevel(s32 flashLevel)
{
- if (a1 < 0 || a1 > gUnknown_0839ACE8)
- a1 = 0;
- gSaveBlock1.flashUsed = a1;
+ if (flashLevel < 0 || flashLevel > gMaxFlashLevel)
+ flashLevel = 0;
+ gSaveBlock1.flashLevel = flashLevel;
}
-u8 sav1_get_flash_used_on_map(void)
+u8 Overworld_GetFlashLevel(void)
{
- return gSaveBlock1.flashUsed;
+ return gSaveBlock1.flashLevel;
}
void sub_8053D14(u16 mapDataId)
@@ -708,60 +790,63 @@ void sub_8053D14(u16 mapDataId)
gMapHeader.mapData = get_mapdata_header();
}
-bool16 sub_8053D30(struct WarpData *warp)
+static bool16 ShouldLegendaryMusicPlayAtLocation(struct WarpData *warp)
{
- if (!FlagGet(SYS_WEATHER_CTRL))
+ if (!FlagGet(FLAG_SYS_WEATHER_CTRL))
return FALSE;
- if (warp->mapGroup != 0)
- return FALSE;
- switch (warp->mapNum)
+ if (warp->mapGroup == 0)
{
- case 5:
- case 6:
- case 7:
- case 8:
- return TRUE;
- case 39:
- case 40:
- case 41:
- case 42:
- case 43:
- return TRUE;
+ switch (warp->mapNum)
+ {
+ case MAP_NUM(LILYCOVE_CITY):
+ case MAP_NUM(MOSSDEEP_CITY):
+ case MAP_NUM(SOOTOPOLIS_CITY):
+ case MAP_NUM(EVER_GRANDE_CITY):
+ return TRUE;
+ case MAP_NUM(ROUTE124):
+ case MAP_NUM(ROUTE125):
+ case MAP_NUM(ROUTE126):
+ case MAP_NUM(ROUTE127):
+ case MAP_NUM(ROUTE128):
+ return TRUE;
+ }
}
return FALSE;
}
-bool16 sub_8053D6C(struct WarpData *warp)
+static bool16 IsInfiltratedWeatherInstitute(struct WarpData *warp)
{
- if (VarGet(0x40B3))
+ if (VarGet(VAR_WEATHER_INSTITUTE_STATE))
return FALSE;
- if (warp->mapGroup != 32)
+ if (warp->mapGroup != MAP_GROUP(ROUTE119_WEATHER_INSTITUTE_1F))
return FALSE;
- if (warp->mapNum == 0 || warp->mapNum == 1)
+ if (warp->mapNum == MAP_NUM(ROUTE119_WEATHER_INSTITUTE_1F)
+ || warp->mapNum == MAP_NUM(ROUTE119_WEATHER_INSTITUTE_2F))
return TRUE;
return FALSE;
}
-u16 sub_8053D9C(struct WarpData *warp)
+static u16 GetLocationMusic(struct WarpData *warp)
{
- if (sub_8053D30(warp) == TRUE)
+ if (ShouldLegendaryMusicPlayAtLocation(warp) == TRUE)
return LEGENDARY_MUSIC;
- else if (sub_8053D6C(warp) == TRUE)
+ else if (IsInfiltratedWeatherInstitute(warp) == TRUE)
return BGM_TOZAN;
else
- return get_mapheader_by_bank_and_number(warp->mapGroup, warp->mapNum)->music;
+ return Overworld_GetMapHeaderByGroupAndId(warp->mapGroup, warp->mapNum)->music;
}
-u16 sav1_map_get_music(void)
+u16 GetCurrLocationDefaultMusic(void)
{
u16 music;
- if (gSaveBlock1.location.mapGroup == 0
- && gSaveBlock1.location.mapNum == 26
+ // Play the desert music only when the sandstorm is active on Route 111.
+ if (gSaveBlock1.location.mapGroup == MAP_GROUP(ROUTE111)
+ && gSaveBlock1.location.mapNum == MAP_NUM(ROUTE111)
&& GetSav1Weather() == 8)
return BGM_ASHROAD;
- music = sub_8053D9C(&gSaveBlock1.location);
+ music = GetLocationMusic(&gSaveBlock1.location);
if (music != 0x7FFF)
{
return music;
@@ -775,36 +860,37 @@ u16 sav1_map_get_music(void)
}
}
-u16 warp1_target_get_music(void)
+u16 GetWarpDestinationMusic(void)
{
- u16 music = sub_8053D9C(&gUnknown_020297F8);
+ u16 music = GetLocationMusic(&gWarpDestination);
if (music != 0x7FFF)
{
return music;
}
else
{
- if (gSaveBlock1.location.mapGroup == 0 && gSaveBlock1.location.mapNum == 2)
+ if (gSaveBlock1.location.mapGroup == MAP_GROUP(MAUVILLE_CITY)
+ && gSaveBlock1.location.mapNum == MAP_NUM(MAUVILLE_CITY))
return BGM_DOORO_X1;
else
return BGM_GRANROAD;
}
}
-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;
- else if (sav1_map_get_light_level() == 5)
+ if (gSaveBlock1.savedMusic)
+ music = gSaveBlock1.savedMusic;
+ else if (Overworld_GetMapTypeOfSaveblockLocation() == MAP_TYPE_UNDERWATER)
music = BGM_DEEPDEEP;
else if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))
music = BGM_NAMINORI;
@@ -814,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)
+ if (FlagGet(FLAG_SPECIAL_FLAG_1) != TRUE)
{
- u16 newMusic = warp1_target_get_music();
+ u16 newMusic = GetWarpDestinationMusic();
u16 currentMusic = GetCurrentMapMusic();
if (newMusic != LEGENDARY_MUSIC)
{
@@ -847,24 +933,24 @@ 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 sub_8053FB0(u16 music)
+void Overworld_ChangeMusicTo(u16 newMusic)
{
u16 currentMusic = GetCurrentMapMusic();
- if (currentMusic != music && currentMusic != LEGENDARY_MUSIC)
- FadeOutAndPlayNewMapMusic(music, 8);
+ if (currentMusic != newMusic && currentMusic != LEGENDARY_MUSIC)
+ FadeOutAndPlayNewMapMusic(newMusic, 8);
}
-u8 is_warp1_light_level_8_or_9(void)
+u8 GetMapMusicFadeoutSpeed(void)
{
struct MapHeader *mapHeader = warp1_get_mapheader();
- if (is_light_level_8_or_9(mapHeader->mapType) == TRUE)
+ if (Overworld_MapTypeIsIndoors(mapHeader->mapType) == TRUE)
return 2;
else
return 4;
@@ -872,10 +958,10 @@ u8 is_warp1_light_level_8_or_9(void)
void sub_8053FF8(void)
{
- u16 music = warp1_target_get_music();
- if (FlagGet(SPECIAL_FLAG_1) != TRUE && music != GetCurrentMapMusic())
+ u16 music = GetWarpDestinationMusic();
+ if (FlagGet(FLAG_SPECIAL_FLAG_1) != TRUE && music != GetCurrentMapMusic())
{
- u8 speed = is_warp1_light_level_8_or_9();
+ u8 speed = GetMapMusicFadeoutSpeed();
FadeOutMapMusic(speed);
}
}
@@ -885,48 +971,50 @@ bool8 sub_8054034(void)
return IsNotWaitingForBGMStop();
}
-void sub_8054044(void)
+void Overworld_FadeOutMapMusic(void)
{
FadeOutMapMusic(4);
}
-void sub_8054050(void)
+static void PlayAmbientCry(void)
{
s16 x, y;
- PlayerGetDestCoords((u16 *)&x, (u16 *)&y);
- if (gUnknown_02029816 != TRUE
- || MetatileBehavior_IsSurfableWaterOrUnderwater(MapGridGetMetatileBehaviorAt(x, y)))
- {
- s8 pan = (Random() % 88) + 212;
- s8 volume = (Random() % 30) + 50;
- PlayCry2(gUnknown_02029814, pan, volume, 1);
- }
+ s8 pan;
+ s8 volume;
+
+ PlayerGetDestCoords(&x, &y);
+ if (sIsAmbientCryWaterMon == TRUE
+ && !MetatileBehavior_IsSurfableWaterOrUnderwater(MapGridGetMetatileBehaviorAt(x, y)))
+ return;
+ pan = (Random() % 88) + 212;
+ volume = (Random() % 30) + 50;
+ PlayCry2(sAmbientCrySpecies, pan, volume, 1);
}
-void sub_80540D0(s16 *a1, u16 *a2)
+void UpdateAmbientCry(s16 *state, u16 *delayCounter)
{
- switch (*a1)
+ switch (*state)
{
case 0:
- if (!gUnknown_02029814)
- *a1 = 4;
+ if (sAmbientCrySpecies == SPECIES_NONE)
+ *state = 4;
else
- *a1 = 1;
+ *state = 1;
break;
case 1:
- *a2 = (Random() % 2400) + 1200;
- *a1 = 3;
+ *delayCounter = (Random() % 2400) + 1200;
+ *state = 3;
break;
case 2:
- *a2 = (Random() % 1200) + 1200;
- *a1 = 3;
+ *delayCounter = (Random() % 1200) + 1200;
+ *state = 3;
break;
case 3:
- (*a2)--;
- if (*a2 == 0)
+ (*delayCounter)--;
+ if (*delayCounter == 0)
{
- sub_8054050();
- *a1 = 2;
+ PlayAmbientCry();
+ *state = 2;
}
break;
case 4:
@@ -934,58 +1022,70 @@ void sub_80540D0(s16 *a1, u16 *a2)
}
}
-void sub_8054164(void)
+void ChooseAmbientCrySpecies(void)
{
- if ((gSaveBlock1.location.mapGroup == 0 && gSaveBlock1.location.mapNum == 45) && !IsMirageIslandPresent())
+ if ((gSaveBlock1.location.mapGroup == MAP_GROUP(ROUTE130)
+ && gSaveBlock1.location.mapNum == MAP_NUM(ROUTE130))
+ && !IsMirageIslandPresent())
{
- gUnknown_02029816 = TRUE;
- gUnknown_02029814 = GetMirageIslandMon();
+ // Only play water pokemon cries on this route
+ // when Mirage Island is not present
+ sIsAmbientCryWaterMon = TRUE;
+ sAmbientCrySpecies = GetLocalWaterMon();
}
else
{
- gUnknown_02029814 = GetLocalWildMon(&gUnknown_02029816);
+ sAmbientCrySpecies = GetLocalWildMon(&sIsAmbientCryWaterMon);
}
}
-u8 get_map_light_level_by_bank_and_number(s8 mapGroup, s8 mapNum)
+u8 GetMapTypeByGroupAndId(s8 mapGroup, s8 mapNum)
{
- return get_mapheader_by_bank_and_number(mapGroup, mapNum)->mapType;
+ return Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum)->mapType;
}
-u8 get_map_light_level_from_warp(struct WarpData *warp)
+u8 GetMapTypeByWarpData(struct WarpData *warp)
{
- return get_map_light_level_by_bank_and_number(warp->mapGroup, warp->mapNum);
+ return GetMapTypeByGroupAndId(warp->mapGroup, warp->mapNum);
}
-u8 sav1_map_get_light_level(void)
+u8 Overworld_GetMapTypeOfSaveblockLocation(void)
{
- return get_map_light_level_from_warp(&gSaveBlock1.location);
+ return GetMapTypeByWarpData(&gSaveBlock1.location);
}
-u8 get_map_light_from_warp0(void)
+u8 get_map_type_from_warp0(void)
{
- return get_map_light_level_from_warp(&gUnknown_020297F0);
+ return GetMapTypeByWarpData(&gUnknown_020297F0);
}
-bool8 is_light_level_1_2_3_5_or_6(u8 a1)
+bool8 is_map_type_1_2_3_5_or_6(u8 mapType)
{
- if (a1 == 3 || a1 == 1 || a1 == 5 || a1 == 2 || a1 == 6)
+ if (mapType == MAP_TYPE_ROUTE
+ || mapType == MAP_TYPE_TOWN
+ || mapType == MAP_TYPE_UNDERWATER
+ || mapType == MAP_TYPE_CITY
+ || mapType == MAP_TYPE_6)
return TRUE;
else
return FALSE;
}
-bool8 is_light_level_1_2_3_or_6(u8 a1)
+bool8 Overworld_MapTypeAllowsTeleportAndFly(u8 mapType)
{
- if (a1 == 3 || a1 == 1 || a1 == 6 || a1 == 2)
+ if (mapType == MAP_TYPE_ROUTE
+ || mapType == MAP_TYPE_TOWN
+ || mapType == MAP_TYPE_6
+ || mapType == MAP_TYPE_CITY)
return TRUE;
else
return FALSE;
}
-bool8 is_light_level_8_or_9(u8 a1)
+bool8 Overworld_MapTypeIsIndoors(u8 mapType)
{
- if (a1 == 8 || a1 == 9)
+ if (mapType == MAP_TYPE_INDOOR
+ || mapType == MAP_TYPE_SECRET_BASE)
return TRUE;
else
return FALSE;
@@ -993,17 +1093,17 @@ bool8 is_light_level_8_or_9(u8 a1)
u8 unref_sub_8054260(void)
{
- return get_mapheader_by_bank_and_number(gSaveBlock1.warp2.mapGroup, gSaveBlock1.warp2.mapNum)->regionMapSectionId;
+ return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1.warp2.mapGroup, gSaveBlock1.warp2.mapNum)->regionMapSectionId;
}
u8 sav1_map_get_name(void)
{
- return get_mapheader_by_bank_and_number(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum)->regionMapSectionId;
+ return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum)->regionMapSectionId;
}
u8 sav1_map_get_battletype(void)
{
- return get_mapheader_by_bank_and_number(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum)->battleType;
+ return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum)->battleType;
}
void ResetSafariZoneFlag_(void)
@@ -1046,7 +1146,7 @@ void c1_overworld(void)
c1_overworld_normal(gMain.newKeys, gMain.heldKeys);
}
-void c2_overworld_basic(void)
+void OverworldBasic(void)
{
ScriptContext2_RunScript();
RunTasks();
@@ -1058,9 +1158,10 @@ void c2_overworld_basic(void)
sub_8072EDC();
}
-void sub_8054398(void)
+// This CB2 is used when starting
+void CB2_OverworldBasic(void)
{
- c2_overworld_basic();
+ OverworldBasic();
}
void c2_overworld(void)
@@ -1068,7 +1169,7 @@ void c2_overworld(void)
int fading = (gPaletteFade.active != 0);
if (fading)
SetVBlankCallback(NULL);
- c2_overworld_basic();
+ OverworldBasic();
if (fading)
SetFieldVBlankCallback();
}
@@ -1085,7 +1186,7 @@ void sub_80543DC(u16 (*a1)(u32))
void sub_80543E8(void)
{
- if (gFieldCallback)
+ if (gFieldCallback != NULL)
gFieldCallback();
else
mapldr_default();
@@ -1228,7 +1329,7 @@ void sub_805465C(void)
void sub_805469C(void)
{
FieldClearVBlankHBlankCallbacks();
- gFieldCallback = atk17_seteffectuser;
+ gFieldCallback = atk17_seteffectsecondary;
c2_exit_to_overworld_2_switch();
}
@@ -1265,8 +1366,8 @@ void CB2_ContinueSavedGame(void)
FieldClearVBlankHBlankCallbacks();
StopMapMusic();
ResetSafariZoneFlag_();
- sub_805338C();
- sub_8053198();
+ LoadSaveblockMapHeader();
+ LoadSaveblockMapObjScripts();
UnfreezeMapObjects();
DoTimeBasedEvents();
sub_805308C();
@@ -1317,11 +1418,11 @@ void VBlankCB_Field(void)
void sub_8054814(void)
{
- u8 val = sav1_get_flash_used_on_map();
+ u8 val = Overworld_GetFlashLevel();
if (val)
{
sub_80815E0(val);
- sub_80895F8(gUnknown_08216694[0], gUnknown_08216694[1], gUnknown_08216694[2]);
+ sub_80895F8(gUnknown_08216694);
}
}
@@ -1636,7 +1737,7 @@ void sub_8054D4C(u32 a1)
sub_805C7C4(0);
FieldEffectActiveListClear();
InitFieldMessageBox();
- sub_807C828();
+ StartWeather();
sub_8080750();
if (!a1)
SetUpFieldTasks();
@@ -1886,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;
}
@@ -2329,7 +2430,7 @@ void SpawnLinkPlayerMapObject(u8 linkPlayerId, s16 x, s16 y, u8 a4)
mapObj->active = 1;
mapObj->mapobj_bit_1 = a4;
- mapObj->mapobj_unk_19 = 2;
+ mapObj->range.as_byte = 2;
mapObj->spriteId = 64;
InitLinkPlayerMapObjectPos(mapObj, x, y);
@@ -2352,7 +2453,7 @@ void unref_sub_8055A6C(u8 linkPlayerId, u8 a2)
{
u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId;
struct MapObject *mapObj = &gMapObjects[mapObjId];
- mapObj->mapobj_unk_19 = a2;
+ mapObj->range.as_byte = a2;
}
}
@@ -2386,7 +2487,7 @@ u8 sub_8055B30(u8 linkPlayerId)
{
u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId;
struct MapObject *mapObj = &gMapObjects[mapObjId];
- return mapObj->mapobj_unk_19;
+ return mapObj->range.as_byte;
}
u8 sub_8055B50(u8 linkPlayerId)
@@ -2434,34 +2535,34 @@ void sub_8055BFC(u8 linkPlayerId, u8 a2)
}
}
-u8 sub_8055C68(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3)
+static u8 sub_8055C68(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3)
{
return gUnknown_082166AC[a3](linkPlayerMapObj, mapObj, a3);
}
-u8 sub_8055C88(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3)
+static u8 sub_8055C88(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3)
{
return 1;
}
-u8 sub_8055C8C(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3)
+static u8 sub_8055C8C(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3)
{
return gUnknown_082166AC[a3](linkPlayerMapObj, mapObj, a3);
}
-u8 sub_8055CAC(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3)
+static u8 sub_8055CAC(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3)
{
return 0;
}
-u8 sub_8055CB0(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3)
+static u8 sub_8055CB0(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3)
{
s16 x, y;
- mapObj->mapobj_unk_19 = npc_something3(a3, mapObj->mapobj_unk_19);
- FieldObjectMoveDestCoords(mapObj, mapObj->mapobj_unk_19, &x, &y);
+ mapObj->range.as_byte = npc_something3(a3, mapObj->range.as_byte);
+ FieldObjectMoveDestCoords(mapObj, mapObj->range.as_byte, &x, &y);
- if (LinkPlayerDetectCollision(linkPlayerMapObj->mapObjId, mapObj->mapobj_unk_19, x, y))
+ if (LinkPlayerDetectCollision(linkPlayerMapObj->mapObjId, mapObj->range.as_byte, x, y))
{
return 0;
}
@@ -2474,22 +2575,22 @@ u8 sub_8055CB0(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *m
}
}
-u8 sub_8055D18(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3)
+static u8 sub_8055D18(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3)
{
- mapObj->mapobj_unk_19 = npc_something3(a3, mapObj->mapobj_unk_19);
+ mapObj->range.as_byte = npc_something3(a3, mapObj->range.as_byte);
return 0;
}
-void sub_8055D30(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj)
+static void sub_8055D30(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj)
{
linkPlayerMapObj->mode = 0;
}
-void sub_8055D38(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj)
+static void sub_8055D38(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj)
{
mapObj->mapobj_unk_21--;
linkPlayerMapObj->mode = 1;
- MoveCoords(mapObj->mapobj_unk_19, &mapObj->coords1.x, &mapObj->coords1.y);
+ MoveCoords(mapObj->range.as_byte, &mapObj->coords1.x, &mapObj->coords1.y);
if (!mapObj->mapobj_unk_21)
{
npc_coords_shift_still(mapObj);
@@ -2547,27 +2648,27 @@ void CreateLinkPlayerSprite(u8 linkPlayerId)
mapObj->spriteId = AddPseudoFieldObject(val, SpriteCB_LinkPlayer, 0, 0, 0);
sprite = &gSprites[mapObj->spriteId];
sprite->coordOffsetEnabled = TRUE;
- sprite->data0 = linkPlayerId;
+ sprite->data[0] = linkPlayerId;
mapObj->mapobj_bit_2 = 0;
}
}
void SpriteCB_LinkPlayer(struct Sprite *sprite)
{
- struct LinkPlayerMapObject *linkPlayerMapObj = &gLinkPlayerMapObjects[sprite->data0];
+ struct LinkPlayerMapObject *linkPlayerMapObj = &gLinkPlayerMapObjects[sprite->data[0]];
struct MapObject *mapObj = &gMapObjects[linkPlayerMapObj->mapObjId];
sprite->pos1.x = mapObj->coords1.x;
sprite->pos1.y = mapObj->coords1.y;
SetObjectSubpriorityByZCoord(mapObj->elevation, sprite, 1);
sprite->oam.priority = ZCoordToPriority(mapObj->elevation);
if (!linkPlayerMapObj->mode)
- StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObj->mapobj_unk_19));
+ StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObj->range.as_byte));
else
- StartSpriteAnimIfDifferent(sprite, get_go_image_anim_num(mapObj->mapobj_unk_19));
+ StartSpriteAnimIfDifferent(sprite, get_go_image_anim_num(mapObj->range.as_byte));
sub_806487C(sprite, 0);
if (mapObj->mapobj_bit_2)
{
- sprite->invisible = ((sprite->data7 & 4) >> 2);
- sprite->data7++;
+ sprite->invisible = ((sprite->data[7] & 4) >> 2);
+ sprite->data[7]++;
}
}
diff --git a/src/field/party_menu.c b/src/field/party_menu.c
new file mode 100644
index 000000000..790aede60
--- /dev/null
+++ b/src/field/party_menu.c
@@ -0,0 +1,5522 @@
+#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 "constants/items.h"
+#include "mail_data.h"
+#include "main.h"
+#include "menu.h"
+#include "menu_helpers.h"
+#include "constants/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 "constants/songs.h"
+#include "sound.h"
+#include "constants/species.h"
+#include "sprite.h"
+#include "string_util.h"
+#include "strings.h"
+#include "task.h"
+#include "unknown_task.h"
+#include "util.h"
+#include "script_pokemon_80F9.h"
+#include "ewram.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
+};
+
+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;
+};
+
+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
+
+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->xOffset * 8,
+ textSettings->yOffset * 8,
+ textSettings->oamSettings,
+ 0,
+ (i << 5) | 0x200);
+ textSettings++;
+ }
+
+ RunTasks();
+ UpdatePaletteFade();
+}
+
+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 @ =gSharedMem + 0x1B000\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 gSharedMem + 0x1B000\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 arr[12] = {
+ 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
+ 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
+ };
+ u16 *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 arr[12] = {
+ 0x2A, 0x0B, 0x0C, 0x0D, 0x0E, 0x2F,
+ 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
+ };
+ u16 *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);
+ }
+}
+
+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;
+ }
+
+ // Some dead code was likely optimized out, but the compiler still think r8 was used.
+ asm("":::"r8");
+}
+
+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)].data[0] == 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)].data[0] == 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].data[0];
+
+ 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].data[0] == 0 || gSprites[spriteId].data[0] == 2 || gSprites[spriteId].data[0] == 3)
+ sub_806BF24(&gUnknown_083769C0[gSprites[spriteId].data[0] * 2], gSprites[spriteId].data[0], 3, 1);
+ if (gSprites[spriteId].data[0] == 1 || gSprites[spriteId].data[0] == 4 || gSprites[spriteId].data[0] == 5)
+ sub_806BF24(&gUnknown_083769C0[gSprites[spriteId].data[0] * 2], gSprites[spriteId].data[0], 4, 1);
+ if (gSprites[spriteId].data[0] == 7)
+ sub_806BBEC(2);
+
+ ewram1B000.unk261 = 2;
+
+ gSprites[spriteId].pos1.x = gUnknown_083768B8[PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE][gSprites[spriteId].data[0]].x;
+ gSprites[spriteId].pos1.y = gUnknown_083768B8[PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE][gSprites[spriteId].data[0]].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].data[0] < PARTY_SIZE)
+ {
+ sub_806BF24(&gUnknown_083769A8[isDoubleBattle * 12 + gSprites[spriteId].data[0] * 2], gSprites[spriteId].data[0], 3, 1);
+ }
+ else
+ {
+ sub_806BBEC(2);
+ }
+
+ ewram1B000.unk261 = 2;
+
+ gSprites[spriteId].pos1.x = gUnknown_083768B8[isDoubleBattle][gSprites[spriteId].data[0]].x;
+ gSprites[spriteId].pos1.y = gUnknown_083768B8[isDoubleBattle][gSprites[spriteId].data[0]].y;
+ }
+
+ UpdateMonIconFrame_806DA44(taskId, gSprites[spriteId].data[0], 1);
+
+ if (menuIndex != gSprites[spriteId].data[0])
+ {
+ PlaySE(5);
+ }
+}
+
+void ChangeDefaultPartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed)
+{
+ u8 nextIndex;
+ s8 menuMovement = directionPressed + 2;
+
+ switch (menuMovement)
+ {
+ case 2: // no movement
+ gSprites[spriteId].data[1] = 0;
+ break;
+ case 1: // moving up
+ if (menuIndex == 0) {
+ gSprites[spriteId].data[0] = 7;
+ } else if (menuIndex == 7) {
+ gSprites[spriteId].data[0] = gPlayerPartyCount - 1;
+ } else {
+ s8 diff = directionPressed;
+ gSprites[spriteId].data[0] += diff;
+ }
+
+ gSprites[spriteId].data[1] = 0;
+ break;
+ case 3: // moving down
+ if (menuIndex == gPlayerPartyCount - 1) {
+ gSprites[spriteId].data[0] = 7;
+ } else if (menuIndex == 7) {
+ gSprites[spriteId].data[0] = 0;
+ } else {
+ s8 diff = directionPressed;
+ gSprites[spriteId].data[0] += diff;
+ }
+
+ gSprites[spriteId].data[1] = 0;
+ break;
+ case 4: // moving right
+ if (gPlayerPartyCount > 1 && menuIndex == 0)
+ {
+ if (gSprites[spriteId].data[1] == 0)
+ gSprites[spriteId].data[1] = 1;
+
+ gSprites[spriteId].data[0] = gSprites[spriteId].data[1];
+ }
+ 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].data[0] = 0;
+ gSprites[spriteId].data[1] = menuIndex;
+ }
+ break;
+ }
+}
+
+void ChangeDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed)
+{
+ u8 var1;
+ s8 menuMovement = directionPressed + 2;
+
+ switch(menuMovement)
+ {
+ case 2: // no movement
+ gSprites[spriteId].data[1] = 0;
+ break;
+ case 3: // moving down
+ if (menuIndex == 7) {
+ gSprites[spriteId].data[0] = 0;
+ } else if (menuIndex == gPlayerPartyCount - 1) {
+ gSprites[spriteId].data[0] = 7;
+ } else {
+ s8 diff = directionPressed;
+ gSprites[spriteId].data[0] += diff;
+ }
+
+ gSprites[spriteId].data[1] = 0;
+ break;
+ case 1: // moving up
+ if (menuIndex == 0) {
+ gSprites[spriteId].data[0] = 7;
+ } else if (menuIndex == 7) {
+ gSprites[spriteId].data[0] = gPlayerPartyCount - 1;
+ } else {
+ s8 diff = directionPressed;
+ gSprites[spriteId].data[0] += diff;
+ }
+
+ gSprites[spriteId].data[1] = 0;
+ break;
+ case 4: // moving right
+ if (menuIndex == 0) {
+ if (gPlayerPartyCount > 2) {
+ u16 var1 = gSprites[spriteId].data[1] - 2;
+ if (var1 > 1)
+ gSprites[spriteId].data[0] = 2;
+ else
+ gSprites[spriteId].data[0] = gSprites[spriteId].data[1];
+ }
+ }
+ else if (menuIndex == 1) {
+ if (gPlayerPartyCount > 4) {
+ u16 var1 = gSprites[spriteId].data[1] - 4;
+ if (var1 <= 1)
+ gSprites[spriteId].data[0] = gSprites[spriteId].data[1];
+ else
+ gSprites[spriteId].data[0] = 4;
+ }
+ }
+ break;
+ case 0: // moving left
+ var1 = menuIndex - 2;
+ if (var1 <= 1) {
+ gSprites[spriteId].data[0] = 0;
+ gSprites[spriteId].data[1] = menuIndex;
+ } else {
+ u8 var2 = menuIndex - 4;
+ if (var2 <= 1) {
+ gSprites[spriteId].data[0] = 1;
+ gSprites[spriteId].data[1] = 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].data[1] = 0;
+ break;
+ case 3: // moving down
+ if (menuIndex == 7) {
+ gSprites[spriteId].data[0] = 0;
+ } else {
+ while (menuIndex != PARTY_SIZE - 1) {
+ menuIndex++;
+ if (GetMonData(&gPlayerParty[menuIndex], MON_DATA_SPECIES))
+ {
+ gSprites[spriteId].data[0] = menuIndex;
+ gSprites[spriteId].data[1] = 0;
+ return;
+ }
+ }
+
+ gSprites[spriteId].data[0] = 7;
+ }
+
+ gSprites[spriteId].data[1] = 0;
+ break;
+ case 1: // moving up
+ while (menuIndex != 0) {
+ menuIndex--;
+ if (menuIndex != PARTY_SIZE && GetMonData(gPlayerParty[menuIndex], MON_DATA_SPECIES))
+ {
+ gSprites[spriteId].data[0] = menuIndex;
+ gSprites[spriteId].data[1] = 0;
+ return;
+ }
+ }
+
+ gSprites[spriteId].data[0] = 7;
+ gSprites[spriteId].data[1] = 0;
+ break;
+ case 4: // moving right
+ if (menuIndex == 0) {
+ var1 = gSprites[spriteId].data[1] - 2;
+ if (var1 > 1) {
+ if (GetMonData(&gPlayerParty[2], MON_DATA_SPECIES)) {
+ gSprites[spriteId].data[0] = 2;
+ } else if (GetMonData(&gPlayerParty[3], MON_DATA_SPECIES)) {
+ gSprites[spriteId].data[0] = 3;
+ }
+ } else {
+ gSprites[spriteId].data[0] = 1;
+ }
+ } else if (menuIndex == 1) {
+ var1 = gSprites[spriteId].data[1] - 4;
+ if (var1 <= 1) {
+ gSprites[spriteId].data[0] = gSprites[spriteId].data[1];
+ } else {
+ if (GetMonData(&gPlayerParty[4], MON_DATA_SPECIES)) {
+ gSprites[spriteId].data[0] = 4;
+ } else if (GetMonData(&gPlayerParty[5], MON_DATA_SPECIES)) {
+ gSprites[spriteId].data[0] = 5;
+ }
+ }
+ }
+ break;
+ case 0: // moving left
+ var2 = menuIndex - 2;
+ if (var2 <= 1) {
+ gSprites[spriteId].data[0] = 0;
+ gSprites[spriteId].data[1] = menuIndex;
+ } else {
+ var2 = menuIndex - 4;
+ if (var2 <= 1) {
+ gSprites[spriteId].data[0] = 1;
+ gSprites[spriteId].data[1] = 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].data[0];
+
+ 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].data[1] = 0;
+ break;
+ case 1: // moving up
+ if (menuIndex == 0) {
+ gSprites[spriteId].data[0] = 7;
+ } else if (menuIndex == PARTY_SIZE) {
+ gSprites[spriteId].data[0] = gPlayerPartyCount - 1;
+ } else {
+ gSprites[spriteId].data[0] += directionPressed;
+ }
+
+ gSprites[spriteId].data[1] = 0;
+ break;
+ case 3: // moving down
+ if (menuIndex == gPlayerPartyCount - 1) {
+ gSprites[spriteId].data[0] = 6;
+ } else if (menuIndex == 7) {
+ gSprites[spriteId].data[0] = 0;
+ } else {
+ gSprites[spriteId].data[0] += directionPressed;
+ }
+
+ gSprites[spriteId].data[1] = 0;
+ break;
+ case 4: // moving right
+ if (gPlayerPartyCount > 1 && menuIndex == 0)
+ {
+ if (gSprites[spriteId].data[1] == 0) {
+ gSprites[spriteId].data[1] = 1;
+ }
+
+ gSprites[spriteId].data[0] = gSprites[spriteId].data[1];
+ }
+ break;
+ case 0: // moving left
+ newMenuIndex3 = menuIndex - 1;
+ if (newMenuIndex3 <= 4)
+ {
+ gSprites[spriteId].data[0] = 0;
+ gSprites[spriteId].data[1] = menuIndex;
+ }
+ break;
+ }
+
+ gSprites[spriteId].pos1.x = gUnknown_083768B8[PARTY_MENU_LAYOUT_STANDARD][gSprites[spriteId].data[0]].x;
+ gSprites[spriteId].pos1.y = gUnknown_083768B8[PARTY_MENU_LAYOUT_STANDARD][gSprites[spriteId].data[0]].y;
+
+
+ newMenuIndex = gSprites[spriteId].data[0];
+ if (gSprites[spriteId].data[0] < PARTY_SIZE)
+ {
+ sub_806BF24(&gUnknown_083769A8[gSprites[spriteId].data[0] * 2], newMenuIndex, 3, 1);
+ }
+ else if (gSprites[spriteId].data[0] == PARTY_SIZE)
+ {
+ sub_806BB9C(2);
+ }
+ else
+ {
+ sub_806BBEC(2);
+ }
+
+ ewram1B000.unk261 = 2;
+
+ newMenuIndex2 = gSprites[spriteId].data[0];
+ UpdateMonIconFrame_806DA44(taskId, newMenuIndex2, 1);
+
+ if (menuIndex != gSprites[spriteId].data[0])
+ {
+ 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].data[0];
+ 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].data[1] = 0;
+ gSprites[spriteId].data[0] = 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].data[0];
+ u8 menuIndex2 = gSprites[spriteId].data[1];
+
+ 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].data[1] = menuIndex2;
+}
+
+void sub_806C994(u8 taskId, u8 b)
+{
+ u8 spriteId = sub_806CA00(taskId);
+
+ gSprites[spriteId].data[0] = 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].data[0] = gSprites[spriteId2].data[0];
+}
+
+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].data[0];
+}
+
+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].data[0] * 2], gSprites[ewram01000.unk1].data[0], 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->data[0] != sprite2->data[0])
+ {
+ sub_806BF24(&gUnknown_083769A8[sprite1->data[0] * 2], sprite1->data[0], 6, 1);
+ }
+ else
+ {
+ sub_806BF24(&gUnknown_083769A8[sprite1->data[0] * 2], sprite1->data[0], 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].data[0] * 2], gSprites[ewram01000.unk2].data[0], 3, 1);
+ sub_806BF24(&gUnknown_083769A8[gSprites[ewram01000.unk1].data[0] * 2], gSprites[ewram01000.unk1].data[0], 3, 0);
+ sub_806CC2C(taskId);
+}
+
+void sub_806CCE4()
+{
+ u8 monIndex1 = gSprites[ewram01000.unk1].data[0];
+ u8 monIndex2 = gSprites[ewram01000.unk2].data[0];
+
+ 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].data[0];
+ u8 monIndex2 = gSprites[ewram01000.unk2].data[0];
+
+ 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].data[0] = -8;
+ gSprites[ewram01000.unk3].data[2] = -0xA8;
+ ewram01000.unk8 = var1;
+ ewram01000.unkA = 11;
+
+ gTasks[taskId].func = sub_806D014;
+ ewram1B000.unk261 = 1;
+ }
+ else
+ {
+ gSprites[ewram01000.unk3].data[0] = 8;
+ gSprites[ewram01000.unk3].data[2] = 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].data[0] = 8;
+ gSprites[ewram01000.unk4].data[2] = 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].data[0], &gSprites[ewram01000.unk4].data[0]);
+
+ 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 @ =gSharedMem + 0x1000\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 gSharedMem + 0x1000\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].data[0]);
+ 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->data[2])
+ {
+ sprite->data[0] *= -1;
+ sprite->data[2] = 0;
+ sprite->callback = UpdateMonIconFrame_806DA38;
+ }
+ else
+ {
+ sprite->pos2.x += sprite->data[0];
+ }
+}
+
+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].data[0] = -8;
+ gSprites[spriteId].data[2] = 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].data[0] = 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->data[7];
+ 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].data[7] = 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].data[7] = monIconSpriteId;
+ gSprites[monIconSpriteId].data[7] = 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].data[7] = monIconSpriteId;
+ gSprites[monIconSpriteId].data[7] = 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->data[7];
+
+ 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].data[7];
+ 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)
+ {
+ ShowSelectMovePokemonSummaryScreen(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, gSpecialVar_ItemId, 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, gSpecialVar_ItemId, 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].data[0];
+ 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;
+}
+
+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,
+};
+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 @ =gSharedMem + 0x1C000\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 @ =gSharedMem + 0x1B264\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 gSharedMem + 0x1C000\n\
+_08070934: .4byte StatDataTypes\n\
+_08070938: .4byte gSharedMem + 0x1B264\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(FLAG_SYS_POKEDEX_GET);
+ FlagSet(FLAG_SYS_POKEMON_GET);
+ FlagSet(FLAG_SYS_POKENAV_GET);
+}
diff --git a/src/field/pc_screen_effect.c b/src/field/pc_screen_effect.c
new file mode 100644
index 000000000..364fca0aa
--- /dev/null
+++ b/src/field/pc_screen_effect.c
@@ -0,0 +1,128 @@
+#include "global.h"
+#include "main.h"
+#include "palette.h"
+#include "sprite.h"
+
+struct UnkStruct
+{
+ /*0x00*/ u16 tileTag;
+ /*0x02*/ u16 paletteTag;
+ /*0x04*/ u16 unk04;
+ /*0x06*/ u16 unk06;
+ /*0x08*/ u16 unk08;
+ /*0x0A*/ u16 unk0A;
+ /*0x0C*/ s16 unk0C;
+ /*0x10*/ u32 selectedPalettes;
+};
+
+void sub_80C603C(void);
+void sub_80C6078(void);
+void sub_80C60CC(struct Sprite *);
+void sub_80C6130(struct Sprite *);
+void sub_80C61B0(IntrFunc);
+void ClearGpuRegBits(void);
+
+extern const struct OamData gOamData_83D18D8;
+
+extern const union AnimCmd *const gSpriteAnimTable_83D18E8[];
+
+extern const u16 gUnknownPal_083D18EC[16];
+
+extern const u8 gUnknownGfx_083D190C[128];
+
+extern struct UnkStruct *gUnknown_020387EC;
+
+const struct SpriteSheet gUnknown_083D1898 = { gUnknownGfx_083D190C, sizeof(gUnknownGfx_083D190C), 0 };
+
+const struct SpritePalette gUnknown_083D18A0 = { gUnknownPal_083D18EC, 0 };
+
+const struct SpriteTemplate gSpriteTemplate_83D18A8 =
+{
+ 0,
+ 0,
+ &gOamData_83D18D8,
+ gSpriteAnimTable_83D18E8,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ sub_80C60CC,
+};
+
+const struct SpriteTemplate gSpriteTemplate_83D18C0 =
+{
+ 0,
+ 0,
+ &gOamData_83D18D8,
+ gSpriteAnimTable_83D18E8,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ sub_80C6130,
+};
+
+void sub_80C5CD4(struct UnkStruct *unkStruct)
+{
+ u16 i;
+
+ struct SpriteSheet sprSheet = gUnknown_083D1898;
+ struct SpritePalette sprPalette = gUnknown_083D18A0;
+ struct SpriteTemplate sprTemplate = gSpriteTemplate_83D18A8;
+
+ sprSheet.tag = unkStruct->tileTag;
+ sprTemplate.tileTag = unkStruct->tileTag;
+ sprPalette.tag = unkStruct->paletteTag;
+ sprTemplate.paletteTag = unkStruct->paletteTag;
+
+ LoadSpriteSheet(&sprSheet);
+ LoadSpritePalette(&sprPalette);
+
+ unkStruct->unk0C = 1;
+ unkStruct->unk0A = 0;
+ unkStruct->unk08 = 0;
+ unkStruct->selectedPalettes = ~(0x10000 << IndexOfSpritePaletteTag(unkStruct->paletteTag)) & 0xFFFF0000;
+
+ if (unkStruct->unk04 == 0)
+ unkStruct->unk04 = 16;
+
+ if (unkStruct->unk06 == 0)
+ unkStruct->unk06 = 20;
+
+ gUnknown_020387EC = unkStruct;
+
+ for (i = 0; i < 8; i++)
+ {
+ u8 spriteId = CreateSprite(&sprTemplate, 32 * i + 8, 80, 0);
+ if (spriteId == MAX_SPRITES)
+ break;
+ gSprites[spriteId].data[0] = (i < 4) ? -unkStruct->unk04 : unkStruct->unk04;
+ }
+
+ REG_BLDCNT = 191;
+ REG_BLDY = 16;
+}
+
+bool8 sub_80C5DCC(void)
+{
+ if (gUnknown_020387EC->unk08 == 0)
+ {
+ BlendPalettes(gUnknown_020387EC->selectedPalettes, 0x10, 0xFFFF);
+ sub_80C61B0(sub_80C603C);
+ gUnknown_020387EC->unk08++;
+ }
+
+ if (gUnknown_020387EC->unk0A < 8)
+ return FALSE;
+
+ gUnknown_020387EC->unk0C += gUnknown_020387EC->unk06;
+
+ if (gUnknown_020387EC->unk0C >= 80)
+ {
+ gUnknown_020387EC->unk0C = 80;
+ REG_BLDCNT = 0;
+ REG_BLDY = 0;
+ ClearGpuRegBits();
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
diff --git a/src/player_pc.c b/src/field/player_pc.c
index 6d52c560a..928cb9689 100644
--- a/src/player_pc.c
+++ b/src/field/player_pc.c
@@ -5,7 +5,7 @@
#include "field_weather.h"
#include "item.h"
#include "item_menu.h"
-#include "items.h"
+#include "constants/items.h"
#include "main.h"
#include "menu.h"
#include "menu_helpers.h"
@@ -15,11 +15,12 @@
#include "string_util.h"
#include "strings.h"
#include "task.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "name_string_util.h"
#include "mail.h"
-#include "rom4.h"
+#include "overworld.h"
#include "player_pc.h"
+#include "ewram.h"
extern void DisplayItemMessageOnField(u8, const u8*, TaskFunc, u16);
extern void DoPlayerPCDecoration(u8);
@@ -32,7 +33,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;
@@ -106,7 +107,7 @@ static const u8 *const gPCText_OptionDescList[] =
gMenuText_GoBackToPrev
};
-static const struct MenuAction2 gPCText_PlayerPCOptionsText[] =
+static const struct MenuAction2 sPlayerPCMenuActions[] =
{
{ SecretBaseText_ItemStorage, PlayerPC_ItemStorage },
{ gPCText_Mailbox, PlayerPC_Mailbox },
@@ -170,15 +171,6 @@ static const u8 gNonSelectedItemQuantityFormatText[] = _("{STR_VAR_1}");
static const u8 gSelectedItemQuantityFormatText[] = _("{COLOR RED}{STR_VAR_1}");
static const u8 gUnknown_08406330[] = _("{CLEAR_TO 32}");
-static const u16 gUnknown_08406334[3] =
-{
- 0x5294,
- 0x6B5A,
- 0x7FFF
-};
-
-static const u8 gHighlightedMoveToBagFormatText[] = _("{COLOR RED}{STR_VAR_1}");
-
extern u8 *gUnknown_02039314;
extern struct MenuAction gUnknown_08406298[];
@@ -204,21 +196,21 @@ void NewGameInitPCItems(void)
u8 i;
// because Game Freak don't know how to use a struct or a 2d array
- for(i = 0, ClearItemSlots(gSaveBlock1.pcItems, ARRAY_COUNT(gSaveBlock1.pcItems)); NEW_GAME_PC_ITEMS(i, ITEM_ID) && NEW_GAME_PC_ITEMS(i, QUANTITY) &&
- AddPCItem(NEW_GAME_PC_ITEMS(i, ITEM_ID), NEW_GAME_PC_ITEMS(i, QUANTITY)) == TRUE; i++)
+ for(i = 0, ClearItemSlots(gSaveBlock1.pcItems, ARRAY_COUNT(gSaveBlock1.pcItems)); NEW_GAME_PC_ITEMS(i, PC_ITEM_ID) && NEW_GAME_PC_ITEMS(i, PC_QUANTITY) &&
+ AddPCItem(NEW_GAME_PC_ITEMS(i, PC_ITEM_ID), NEW_GAME_PC_ITEMS(i, PC_QUANTITY)) == TRUE; i++)
;
}
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);
}
@@ -226,7 +218,7 @@ void PlayerPC(void)
static void InitPlayerPCMenu(u8 taskId)
{
MenuDrawTextWindow(0, 0, 10, gPcItemMenuOptionsNum * 2 + 1);
- PrintMenuItemsReordered(1, 1, gPcItemMenuOptionsNum, (struct MenuAction *)gPCText_PlayerPCOptionsText, gPcItemMenuOptionOrder);
+ PrintMenuItemsReordered(1, 1, gPcItemMenuOptionsNum, sPlayerPCMenuActions, gPcItemMenuOptionOrder);
InitMenu(0, 1, 1, gPcItemMenuOptionsNum, 0, 9);
TASK.FUNC = PlayerPCProcessMenuInput;
}
@@ -247,13 +239,13 @@ static void PlayerPCProcessMenuInput(u8 taskId)
{
HandleDestroyMenuCursors();
PlaySE(SE_SELECT);
- gPCText_PlayerPCOptionsText[gPcItemMenuOptionOrder[GetMenuCursorPos()]].func(taskId);
+ sPlayerPCMenuActions[gPcItemMenuOptionOrder[GetMenuCursorPos()]].func(taskId);
}
else if (gMain.newKeys & B_BUTTON)
{
HandleDestroyMenuCursors();
PlaySE(SE_SELECT);
- gPCText_PlayerPCOptionsText[gPcItemMenuOptionsNum[gPcItemMenuOptionOrder - 1]].func(taskId); // run EXIT.
+ sPlayerPCMenuActions[gPcItemMenuOptionsNum[gPcItemMenuOptionOrder - 1]].func(taskId); // run EXIT.
}
}
@@ -271,14 +263,14 @@ static void PlayerPC_ItemStorage(u8 taskId)
static void PlayerPC_Mailbox(u8 taskId)
{
MenuZeroFillWindowRect(0, 0, 10, 9);
- gMailboxInfo.count = GetMailboxMailCount();
+ eMailboxInfo.count = GetMailboxMailCount();
- if (gMailboxInfo.count == 0)
+ if (eMailboxInfo.count == 0)
DisplayItemMessageOnField(taskId, gOtherText_NoMailHere, ReshowPlayerPC, 0);
else
{
- gMailboxInfo.cursorPos = 0;
- gMailboxInfo.itemsAbove = 0;
+ eMailboxInfo.cursorPos = 0;
+ eMailboxInfo.itemsAbove = 0;
Mailbox_UpdateMailList();
ItemStorage_SetItemAndMailCount(taskId);
Mailbox_DrawMailboxMenu(taskId);
@@ -442,10 +434,10 @@ static void ItemStorage_SetItemAndMailCount(u8 taskId)
else
NUM_PAGE_ITEMS = NUM_ITEMS + 1; // there are not enough items to fill a full page; take the # of items and add 1 for the cancel button.
- if (gMailboxInfo.count > 7)
- gMailboxInfo.pageItems = 8;
+ if (eMailboxInfo.count > 7)
+ eMailboxInfo.pageItems = 8;
else
- gMailboxInfo.pageItems = gMailboxInfo.count + 1;
+ eMailboxInfo.pageItems = eMailboxInfo.count + 1;
}
static void ItemStorage_ProcessInput(u8 taskId)
@@ -874,58 +866,48 @@ static void ItemStorage_DrawItemList(u8 taskId)
u16 i;
u16 yCoord = 0;
- // r5 is i and is unsigned 16-bit.
-
- for(i = ITEMS_ABOVE_TOP; i < ITEMS_ABOVE_TOP + NUM_PAGE_ITEMS; i++)
+ for (i = ITEMS_ABOVE_TOP; i < ITEMS_ABOVE_TOP + NUM_PAGE_ITEMS; i++)
{
yCoord = (i - ITEMS_ABOVE_TOP) * 2;
- if(i != NUM_ITEMS)
+ if (i == NUM_ITEMS)
+ {
+ sub_8072A18(gOtherText_CancelNoTerminator, 0x80, (yCoord + 2) * 8, 0x68, 1);
+ break;
+ }
+ else
{
tempArg = 0;
- if(SWITCH_MODE_ACTIVE != FALSE && i == SWAP_ITEM_INDEX)
+ if (SWITCH_MODE_ACTIVE != FALSE && i == SWAP_ITEM_INDEX)
tempArg = 1;
- switch(GetPocketByItemId(gSaveBlock1.pcItems[i].itemId) - 1)
+ switch (GetPocketByItemId(gSaveBlock1.pcItems[i].itemId) - 1)
{
- case 0:
- case 1:
- case 3:
- ItemStorage_DrawNormalItemEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg);
- break;
- case 4:
- ItemStorage_DrawKeyItemEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg);
- break;
- case 2:
- ItemStorage_DrawTMHMEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg);
- break;
+ case 0:
+ case 1:
+ case 3:
+ ItemStorage_DrawNormalItemEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg);
+ break;
+ case 4:
+ ItemStorage_DrawKeyItemEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg);
+ break;
+ case 2:
+ ItemStorage_DrawTMHMEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg);
+ break;
}
}
- else
- {
- goto weirdCase; // what???
- }
}
-beforeLabel:
- if(i - ITEMS_ABOVE_TOP < 8)
+ if (i - ITEMS_ABOVE_TOP < 8)
MenuFillWindowRectWithBlankTile(16, yCoord + 4, 0x1C, 0x12);
- switch(ITEMS_ABOVE_TOP)
- {
- default:
+ if (ITEMS_ABOVE_TOP != 0)
CreateVerticalScrollIndicators(0, 0xB8, 8);
- break;
-weirdCase:
- sub_8072A18(gOtherText_CancelNoTerminator, 0x80, (yCoord + 2) * 8, 0x68, 1);
- goto beforeLabel;
- case 0:
+ else
DestroyVerticalScrollIndicator(0);
- break;
- }
- if(ITEMS_ABOVE_TOP + NUM_PAGE_ITEMS <= NUM_ITEMS)
+ if (ITEMS_ABOVE_TOP + NUM_PAGE_ITEMS <= NUM_ITEMS)
CreateVerticalScrollIndicators(1, 0xB8, 0x98);
else
DestroyVerticalScrollIndicator(1);
@@ -1006,9 +988,12 @@ static void ItemStorage_GoBackToItemPCMenu(u8 taskId, u8 var)
static void ItemStorage_LoadPalette(void)
{
- u16 arr[3];
+ u16 arr[] = {
+ 0x5294,
+ 0x6B5A,
+ 0x7FFF
+ };
- memcpy(arr, gUnknown_08406334, sizeof(arr));
LoadPalette(&arr[2], 0xDF, 2);
LoadPalette(&arr[1], 0xD1, 2);
LoadPalette(&arr[0], 0xD8, 2);
@@ -1044,55 +1029,37 @@ static void Mailbox_UpdateMailList(void)
}
}
-// WWHHHHHYYYYYYYY SOMEBODY PLEASE FIX THIS
static void Mailbox_DrawMailList(u8 taskId) // taskId is unused
{
u16 yCoord = 0;
- u16 i = gMailboxInfo.itemsAbove;
- register struct MailboxStruct *tempMailbox asm("r1") = &gMailboxInfo;
- register struct MailboxStruct *mailbox asm("r6");
+ u16 i;
- if(i < i + tempMailbox->pageItems)
+ for (i = eMailboxInfo.itemsAbove; i < eMailboxInfo.itemsAbove + eMailboxInfo.pageItems; i++)
{
- mailbox = tempMailbox;
- goto forJump;
- for(; i < mailbox->itemsAbove + mailbox->pageItems; i++)
- {
- forJump:
- yCoord = (i - mailbox->itemsAbove) * 2;
+ yCoord = (i - eMailboxInfo.itemsAbove) * 2;
MenuFillWindowRectWithBlankTile(0x15, yCoord + 2, 0x1C, yCoord + 3);
-
- if(i != mailbox->count)
+ if (i == eMailboxInfo.count)
{
- StringCopy(gStringVar1, (u8 *)gSaveBlock1.mail[i + 6].playerName);
- SanitizeNameString(gStringVar1);
- MenuPrint(gStringVar1, 0x15, yCoord + 2);
+ MenuPrint(gOtherText_CancelNoTerminator, 0x15, yCoord + 2);
+ break;
}
else
{
- goto weirdCase; // again, what???
+ StringCopy(gStringVar1, gSaveBlock1.mail[i + 6].playerName);
+ SanitizeNameString(gStringVar1);
+ MenuPrint(gStringVar1, 0x15, yCoord + 2);
}
}
- }
-beforeLabel:
- if(i - gMailboxInfo.itemsAbove != 8)
+ if (i - eMailboxInfo.itemsAbove != 8)
MenuFillWindowRectWithBlankTile(0x15, yCoord + 4, 0x1C, 0x12);
- switch(gMailboxInfo.itemsAbove)
- {
- default:
+ if (eMailboxInfo.itemsAbove != 0)
CreateVerticalScrollIndicators(0, 0xC8, 8);
- break;
-weirdCase:
- MenuPrint(gOtherText_CancelNoTerminator, 0x15, yCoord + 2);
- goto beforeLabel;
- case 0:
+ else
DestroyVerticalScrollIndicator(0);
- break;
- }
- if(gMailboxInfo.itemsAbove + gMailboxInfo.pageItems <= gMailboxInfo.count)
+ if (eMailboxInfo.itemsAbove + eMailboxInfo.pageItems <= eMailboxInfo.count)
CreateVerticalScrollIndicators(1, 0xC8, 0x98);
else
DestroyVerticalScrollIndicator(1);
@@ -1107,7 +1074,7 @@ static void Mailbox_DrawMailboxMenu(u8 taskId)
MenuPrint(gPCText_Mailbox, 1, 1);
MenuDrawTextWindow(0x14, 0, 0x1D, 0x13);
Mailbox_DrawMailList(taskId);
- InitMenu(0, 0x15, 2, gMailboxInfo.pageItems, gMailboxInfo.cursorPos, 8);
+ InitMenu(0, 0x15, 2, eMailboxInfo.pageItems, eMailboxInfo.cursorPos, 8);
}
// Mailbox_ProcessInput
@@ -1117,29 +1084,29 @@ static void Mailbox_ProcessInput(u8 taskId)
{
if(gMain.newAndRepeatedKeys & DPAD_UP)
{
- if(gMailboxInfo.cursorPos != 0)
+ if(eMailboxInfo.cursorPos != 0)
{
PlaySE(SE_SELECT);
- gMailboxInfo.cursorPos = MoveMenuCursor(-1);
+ eMailboxInfo.cursorPos = MoveMenuCursor(-1);
}
- else if(gMailboxInfo.itemsAbove != 0)
+ else if(eMailboxInfo.itemsAbove != 0)
{
PlaySE(SE_SELECT);
- gMailboxInfo.itemsAbove--;
+ eMailboxInfo.itemsAbove--;
Mailbox_DrawMailList(taskId);
}
}
else if(gMain.newAndRepeatedKeys & DPAD_DOWN)
{
- if(gMailboxInfo.cursorPos != gMailboxInfo.pageItems - 1)
+ if(eMailboxInfo.cursorPos != eMailboxInfo.pageItems - 1)
{
PlaySE(SE_SELECT);
- gMailboxInfo.cursorPos = MoveMenuCursor(1);
+ eMailboxInfo.cursorPos = MoveMenuCursor(1);
}
- else if(gMailboxInfo.itemsAbove + gMailboxInfo.cursorPos != gMailboxInfo.count)
+ else if(eMailboxInfo.itemsAbove + eMailboxInfo.cursorPos != eMailboxInfo.count)
{
PlaySE(SE_SELECT);
- gMailboxInfo.itemsAbove++;
+ eMailboxInfo.itemsAbove++;
Mailbox_DrawMailList(taskId);
}
}
@@ -1148,7 +1115,7 @@ static void Mailbox_ProcessInput(u8 taskId)
HandleDestroyMenuCursors();
PlaySE(SE_SELECT);
- if(gMailboxInfo.itemsAbove + gMailboxInfo.cursorPos == gMailboxInfo.count)
+ if(eMailboxInfo.itemsAbove + eMailboxInfo.cursorPos == eMailboxInfo.count)
{
Mailbox_TurnOff(taskId);
}
@@ -1177,7 +1144,7 @@ static void Mailbox_CloseScrollIndicators(void)
static void Mailbox_PrintWhatToDoWithPlayerMailText(u8 taskId)
{
MenuZeroFillWindowRect(0, 0, 0x1D, 0x13);
- StringCopy(gStringVar1, gSaveBlock1.mail[gMailboxInfo.itemsAbove + 6 + gMailboxInfo.cursorPos].playerName);
+ StringCopy(gStringVar1, gSaveBlock1.mail[eMailboxInfo.itemsAbove + 6 + eMailboxInfo.cursorPos].playerName);
SanitizeNameString(gStringVar1);
StringExpandPlaceholders(gStringVar4, gOtherText_WhatWillYouDoMail);
DisplayItemMessageOnField(taskId, gStringVar4, Mailbox_PrintMailOptions, 0);
@@ -1237,7 +1204,7 @@ static void Mailbox_FadeAndReadMail(u8 taskId)
{
if(!gPaletteFade.active)
{
- HandleReadMail(&gSaveBlock1.mail[gMailboxInfo.itemsAbove + 6 + gMailboxInfo.cursorPos], Mailbox_ReturnToFieldFromReadMail, 1);
+ HandleReadMail(&gSaveBlock1.mail[eMailboxInfo.itemsAbove + 6 + eMailboxInfo.cursorPos], Mailbox_ReturnToFieldFromReadMail, 1);
DestroyTask(taskId);
}
}
@@ -1260,6 +1227,8 @@ static void Mailbox_ReturnToFieldFromReadMail(void)
SetMainCallback2(c2_exit_to_overworld_2_switch);
}
+static const u8 gHighlightedMoveToBagFormatText[] = _("{COLOR RED}{STR_VAR_1}");
+
static void Mailbox_MoveToBag(u8 taskId)
{
HandleDestroyMenuCursors();
@@ -1276,7 +1245,7 @@ static void Mailbox_DrawYesNoBeforeMove(u8 taskId)
static void Mailbox_DoMailMoveToBag(u8 taskId)
{
- struct MailStruct *mail = &gSaveBlock1.mail[gMailboxInfo.itemsAbove + 6 + gMailboxInfo.cursorPos];
+ struct MailStruct *mail = &gSaveBlock1.mail[eMailboxInfo.itemsAbove + 6 + eMailboxInfo.cursorPos];
MenuZeroFillWindowRect(0x14, 8, 0x1A, 0xD);
@@ -1290,10 +1259,10 @@ static void Mailbox_DoMailMoveToBag(u8 taskId)
ClearMailStruct(mail);
Mailbox_UpdateMailList();
- gMailboxInfo.count--;
+ eMailboxInfo.count--;
- if(gMailboxInfo.count < gMailboxInfo.pageItems + gMailboxInfo.itemsAbove && gMailboxInfo.itemsAbove != 0)
- gMailboxInfo.itemsAbove--;
+ if(eMailboxInfo.count < eMailboxInfo.pageItems + eMailboxInfo.itemsAbove && eMailboxInfo.itemsAbove != 0)
+ eMailboxInfo.itemsAbove--;
ItemStorage_SetItemAndMailCount(taskId);
}
@@ -1329,13 +1298,13 @@ static void Mailbox_DoGiveMailPokeMenu(u8 taskId) // Mailbox_DoGiveMailPokeMenu
static void Mailbox_UpdateMailListAfterDeposit(void)
{
u8 taskId = CreateTask(Mailbox_HandleReturnToProcessInput, 0);
- u8 oldCount = gMailboxInfo.count;
+ u8 oldCount = eMailboxInfo.count;
- gMailboxInfo.count = GetMailboxMailCount();
+ eMailboxInfo.count = GetMailboxMailCount();
Mailbox_UpdateMailList();
- if(oldCount != gMailboxInfo.count && gMailboxInfo.count < gMailboxInfo.pageItems + gMailboxInfo.itemsAbove && gMailboxInfo.itemsAbove != 0) // did the count update?
- gMailboxInfo.itemsAbove--;
+ if(oldCount != eMailboxInfo.count && eMailboxInfo.count < eMailboxInfo.pageItems + eMailboxInfo.itemsAbove && eMailboxInfo.itemsAbove != 0) // did the count update?
+ eMailboxInfo.itemsAbove--;
ItemStorage_SetItemAndMailCount(taskId);
Mailbox_DrawMailboxMenu(taskId);
diff --git a/src/pokeblock.c b/src/field/pokeblock.c
index 029bb066f..640d4731f 100644
--- a/src/pokeblock.c
+++ b/src/field/pokeblock.c
@@ -1,9 +1,9 @@
//
-// Created by scott on 6/27/2017.
+
//
#include "global.h"
-#include "rom4.h"
+#include "overworld.h"
#include "sprite.h"
#include "script.h"
#include "strings.h"
@@ -21,12 +21,13 @@
#include "item_menu.h"
#include "item_use.h"
#include "item.h"
-#include "items.h"
+#include "constants/items.h"
#include "sound.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "safari_zone.h"
#include "event_data.h"
#include "pokeblock.h"
+#include "ewram.h"
struct UnkPokeblockStruct
{
@@ -36,9 +37,6 @@ struct UnkPokeblockStruct
u8 unk3;
};
-extern u8 ewram[];
-
-
static EWRAM_DATA u8 gUnknown_02039244 = 0;
static EWRAM_DATA struct UnkPokeblockStruct gUnknown_02039248 = {0};
static EWRAM_DATA u8 gUnknown_0203924C = 0;
@@ -301,7 +299,7 @@ static bool8 sub_810B6C0(void)
case 10:
if (MultistepInitMenuWindowContinue())
{
- ewram[0x1ffff] = 0;
+ ewram1FFFF = 0;
gMain.state++;
}
break;
@@ -319,7 +317,7 @@ static bool8 sub_810B6C0(void)
gMain.state++;
break;
case 13:
- ewram[0x1fffe] = sub_810BA50(0x38, 0x40, 0);
+ ewram1FFFE = sub_810BA50(0x38, 0x40, 0);
gMain.state++;
break;
case 14:
@@ -371,27 +369,27 @@ void sub_810B96C(void)
static bool8 sub_810B998(void)
{
- switch (ewram[0x1ffff])
+ switch (ewram1FFFF)
{
case 0:
- LZDecompressVram(gMenuPokeblock_Gfx, (u8 *)BG_CHAR_ADDR(2));
- ewram[0x1ffff]++;
+ LZDecompressVram(gMenuPokeblock_Gfx, BG_CHAR_ADDR(2));
+ ewram1FFFF++;
break;
case 1:
- sub_800D238(gMenuPokeblock_Tilemap, gBGTilemapBuffers[2]);
- ewram[0x1ffff]++;
+ LZDecompressWram(gMenuPokeblock_Tilemap, gBGTilemapBuffers[2]);
+ ewram1FFFF++;
break;
case 2:
LoadCompressedPalette(gMenuPokeblock_Pal, 0, 0xc0);
- ewram[0x1ffff]++;
+ ewram1FFFF++;
break;
case 3:
LoadCompressedObjectPic(&gUnknown_083F7F74);
- ewram[0x1ffff]++;
+ ewram1FFFF++;
break;
case 4:
LoadCompressedObjectPalette(&gUnknown_083F7F7C);
- ewram[0x1ffff] = 0;
+ ewram1FFFF = 0;
return TRUE;
}
return FALSE;
@@ -428,7 +426,7 @@ void sub_810BADC(void)
SetMainCallback2(sub_810B96C);
}
-void sub_810BAF4(void)
+void OpenPokeblockCaseOnFeeder(void)
{
sub_810BA7C(3);
SetMainCallback2(sub_810B96C);
@@ -613,7 +611,7 @@ static void sub_810BDAC(bool8 flag)
static void sub_810BF38(bool8 flag)
{
PlaySE(SE_SELECT);
- gSprites[ewram[0x1fffe]].callback = sub_810C8D4;
+ gSprites[ewram1FFFE].callback = sub_810C8D4;
sub_810BDAC(flag);
}
@@ -666,7 +664,7 @@ static void sub_810BF7C(u8 taskId)
PlaySE(SE_SELECT);
if (gUnknown_02039248.unk1 + gUnknown_02039248.unk0 == gUnknown_02039248.unk2)
{
- gScriptResult = 0xffff;
+ gSpecialVar_Result = 0xffff;
sub_810C31C(taskId);
}
else
@@ -677,7 +675,7 @@ static void sub_810BF7C(u8 taskId)
else if (gMain.newKeys & B_BUTTON)
{
PlaySE(SE_SELECT);
- gScriptResult = 0xffff;
+ gSpecialVar_Result = 0xffff;
sub_810C31C(taskId);
}
}
@@ -802,7 +800,7 @@ static void sub_810C31C(u8 taskId)
BeginNormalPaletteFade(-1, 0, 0, 16, 0);
if (gUnknown_02039244 > 1)
{
- gScriptItemId = ITEM_NONE;
+ gSpecialVar_ItemId = ITEM_NONE;
}
gTasks[taskId].func = sub_810C2C8;
}
@@ -816,9 +814,9 @@ static void sub_810C368(u8 taskId)
sub_80F98A4(1);
BasicInitMenuWindow(&gWindowConfig_81E6E50);
MenuDrawTextWindow(7, v0 + 4, 13, 11);
- PrintMenuItemsReordered(8, v0 + 5, gUnknown_0203924C, (const struct MenuAction *)gUnknown_083F7EF4, gUnknown_03000758);
+ PrintMenuItemsReordered(8, v0 + 5, gUnknown_0203924C, gUnknown_083F7EF4, gUnknown_03000758);
InitMenu(0, 8, v0 + 5, gUnknown_0203924C, 0, 5);
- gScriptItemId = gUnknown_02039248.unk0 + gUnknown_02039248.unk1;
+ gSpecialVar_ItemId = gUnknown_02039248.unk0 + gUnknown_02039248.unk1;
gTasks[taskId].func = sub_810C40C;
}
@@ -857,7 +855,7 @@ static void sub_810C4C4(u8 taskId)
if (!gPaletteFade.active)
{
sub_810C2B0();
- sub_8136130(&gSaveBlock1.pokeblocks[gScriptItemId], sub_810B96C);
+ sub_8136130(&gSaveBlock1.pokeblocks[gSpecialVar_ItemId], sub_810B96C);
DestroyTask(taskId);
}
}
@@ -941,21 +939,21 @@ static void sub_810C748(u8 taskId)
static void sub_810C788(u8 taskId)
{
- s16 v0 = PokeblockGetGain(GetNature(&gEnemyParty[0]), &gSaveBlock1.pokeblocks[gScriptItemId]);
- StringCopy(gBattleTextBuff1, gPokeblockNames[gSaveBlock1.pokeblocks[gScriptItemId].color]);
- PokeblockClearIfExists(gScriptItemId);
- gScriptItemId = gSaveBlock1.pokeblocks[gScriptItemId].color << 8;
+ s16 v0 = PokeblockGetGain(GetNature(&gEnemyParty[0]), &gSaveBlock1.pokeblocks[gSpecialVar_ItemId]);
+ StringCopy(gBattleTextBuff1, gPokeblockNames[gSaveBlock1.pokeblocks[gSpecialVar_ItemId].color]);
+ PokeblockClearIfExists(gSpecialVar_ItemId);
+ gSpecialVar_ItemId = gSaveBlock1.pokeblocks[gSpecialVar_ItemId].color << 8;
if (v0 == 0)
{
- gScriptItemId += 1;
+ gSpecialVar_ItemId += 1;
}
if (v0 > 0)
{
- gScriptItemId += 2;
+ gSpecialVar_ItemId += 2;
}
if (v0 < 0)
{
- gScriptItemId += 3;
+ gSpecialVar_ItemId += 3;
}
BeginNormalPaletteFade(-1, 0, 0, 16, 0);
gTasks[taskId].func = sub_810C2C8;
@@ -963,35 +961,35 @@ static void sub_810C788(u8 taskId)
static void sub_810C854(u8 taskId)
{
- SafariZoneActivatePokeblockFeeder(gScriptItemId);
- StringCopy(gStringVar1, gPokeblockNames[gSaveBlock1.pokeblocks[gScriptItemId].color]);
- gScriptResult = gScriptItemId;
- PokeblockClearIfExists(gScriptItemId);
+ SafariZoneActivatePokeblockFeeder(gSpecialVar_ItemId);
+ StringCopy(gStringVar1, gPokeblockNames[gSaveBlock1.pokeblocks[gSpecialVar_ItemId].color]);
+ gSpecialVar_Result = gSpecialVar_ItemId;
+ PokeblockClearIfExists(gSpecialVar_ItemId);
BeginNormalPaletteFade(-1, 0, 0, 16, 0);
gTasks[taskId].func = sub_810C2C8;
}
static void sub_810C8D4(struct Sprite *sprite)
{
- if (sprite->data0 > 1)
+ if (sprite->data[0] > 1)
{
- sprite->data0 = 0;
+ sprite->data[0] = 0;
}
- switch (sprite->data0)
+ switch (sprite->data[0])
{
case 0:
sprite->oam.affineMode = 1;
sprite->affineAnims = gSpriteAffineAnimTable_83F7F70;
InitSpriteAffineAnim(sprite);
- sprite->data0 = 1;
- sprite->data1 = 0;
+ sprite->data[0] = 1;
+ sprite->data[1] = 0;
break;
case 1:
- if (++sprite->data1 > 11)
+ if (++sprite->data[1] > 11)
{
sprite->oam.affineMode = 0;
- sprite->data0 = 0;
- sprite->data1 = 0;
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
FreeOamMatrix(sprite->oam.matrixNum);
sprite->callback = SpriteCallbackDummy;
}
@@ -1043,7 +1041,7 @@ u8 sub_810C9E8(struct Pokeblock *pokeblock)
return feel;
}
-s8 sub_810CA00(void)
+s8 GetFirstFreePokeblockSlot(void)
{
u8 i;
for (i=0; i<ARRAY_COUNT(gSaveBlock1.pokeblocks); i++)
@@ -1058,7 +1056,7 @@ s8 sub_810CA00(void)
bool8 sub_810CA34(struct Pokeblock *pokeblock)
{
- s8 idx = sub_810CA00();
+ s8 idx = GetFirstFreePokeblockSlot();
if (idx == -1)
{
return FALSE;
diff --git a/src/region_map.c b/src/field/region_map.c
index 076dfecec..07e77e389 100644
--- a/src/region_map.c
+++ b/src/field/region_map.c
@@ -4,19 +4,20 @@
#include "field_specials.h"
#include "m4a.h"
#include "main.h"
-#include "map_constants.h"
+#include "constants/maps.h"
#include "menu.h"
#include "palette.h"
#include "pokemon_menu.h"
#include "region_map.h"
-#include "rom4.h"
+#include "overworld.h"
#include "secret_base.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sprite.h"
#include "strings.h"
#include "string_util.h"
#include "text.h"
#include "trig.h"
+#include "ewram.h"
// Map Section IDs
#define MAPSEC_LITTLEROOT_TOWN 0
@@ -140,12 +141,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
@@ -336,9 +337,9 @@ bool8 sub_80FA940(void)
InitializeCursorPosition();
gRegionMap->unk74 = gRegionMap->cursorPosX;
gRegionMap->unk76 = gRegionMap->cursorPosY;
- gRegionMap->unk16 = sub_80FB758(gRegionMap->mapSecId);
- gRegionMap->mapSecId = sub_80FB9C0(gRegionMap->mapSecId);
- GetMapSectionName(gRegionMap->mapSecName, gRegionMap->mapSecId, 16);
+ gRegionMap->unk16 = sub_80FB758(gRegionMap->mapSectionId);
+ gRegionMap->mapSectionId = sub_80FB9C0(gRegionMap->mapSectionId);
+ GetMapSectionName(gRegionMap->mapSectionName, gRegionMap->mapSectionId, 16);
break;
case 6:
if (gRegionMap->zoomed == FALSE)
@@ -433,7 +434,7 @@ static u8 sub_80FAB78(void)
static u8 _swiopen(void)
{
- u16 mapSecId;
+ u16 mapSectionId;
if (gRegionMap->unk7A != 0)
return INPUT_EVENT_2;
@@ -450,12 +451,12 @@ static u8 _swiopen(void)
if (gRegionMap->cursorDeltaY < 0)
gRegionMap->cursorPosY--;
- mapSecId = GetRegionMapSectionAt(gRegionMap->cursorPosX, gRegionMap->cursorPosY);
- gRegionMap->unk16 = sub_80FB758(mapSecId);
- if (mapSecId != gRegionMap->mapSecId)
+ mapSectionId = GetRegionMapSectionAt(gRegionMap->cursorPosX, gRegionMap->cursorPosY);
+ gRegionMap->unk16 = sub_80FB758(mapSectionId);
+ if (mapSectionId != gRegionMap->mapSectionId)
{
- gRegionMap->mapSecId = mapSecId;
- GetMapSectionName(gRegionMap->mapSecName, gRegionMap->mapSecId, 16);
+ gRegionMap->mapSectionId = mapSectionId;
+ GetMapSectionName(gRegionMap->mapSectionName, gRegionMap->mapSectionId, 16);
}
sub_80FBA18();
gRegionMap->inputCallback = sub_80FAB78;
@@ -515,16 +516,16 @@ static u8 sub_80FADE4(void)
if (r3 != gRegionMap->unk64 || r1 != gRegionMap->unk66)
{
- u16 mapSecId;
+ u16 mapSectionId;
gRegionMap->unk64 = r3;
gRegionMap->unk66 = r1;
- mapSecId = GetRegionMapSectionAt(r3, r1);
- gRegionMap->unk16 = sub_80FB758(mapSecId);
- if (mapSecId != gRegionMap->mapSecId)
+ mapSectionId = GetRegionMapSectionAt(r3, r1);
+ gRegionMap->unk16 = sub_80FB758(mapSectionId);
+ if (mapSectionId != gRegionMap->mapSectionId)
{
- gRegionMap->mapSecId = mapSecId;
- GetMapSectionName(gRegionMap->mapSecName, gRegionMap->mapSecId, 16);
+ gRegionMap->mapSectionId = mapSectionId;
+ GetMapSectionName(gRegionMap->mapSectionName, gRegionMap->mapSectionId, 16);
}
sub_80FBA18();
}
@@ -706,15 +707,15 @@ static void InitializeCursorPosition(void)
u16 r9;
if (gSaveBlock1.location.mapGroup == 25
- && (gSaveBlock1.location.mapNum == MAP_ID_SS_TIDAL_CORRIDOR
- || gSaveBlock1.location.mapNum == MAP_ID_SS_TIDAL_LOWER_DECK
- || gSaveBlock1.location.mapNum == MAP_ID_SS_TIDAL_ROOMS))
+ && (gSaveBlock1.location.mapNum == MAP_NUM(SS_TIDAL_CORRIDOR)
+ || gSaveBlock1.location.mapNum == MAP_NUM(SS_TIDAL_LOWER_DECK)
+ || gSaveBlock1.location.mapNum == MAP_NUM(SS_TIDAL_ROOMS)))
{
sub_80FB600();
return;
}
- switch (get_map_light_level_by_bank_and_number(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum) - 1)
+ switch (GetMapTypeByGroupAndId(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum) - 1)
{
default:
case 0:
@@ -722,19 +723,19 @@ static void InitializeCursorPosition(void)
case 2:
case 4:
case 5:
- gRegionMap->mapSecId = gMapHeader.regionMapSectionId;
+ gRegionMap->mapSectionId = gMapHeader.regionMapSectionId;
gRegionMap->playerIsInCave = FALSE;
mapWidth = gMapHeader.mapData->width;
mapHeight = gMapHeader.mapData->height;
x = gSaveBlock1.pos.x;
y = gSaveBlock1.pos.y;
- if (gRegionMap->mapSecId == MAPSEC_UNDERWATER6)
+ if (gRegionMap->mapSectionId == MAPSEC_UNDERWATER6)
gRegionMap->playerIsInCave = TRUE;
break;
case 3:
case 6:
- mapHeader = get_mapheader_by_bank_and_number(gSaveBlock1.warp4.mapGroup, gSaveBlock1.warp4.mapNum);
- gRegionMap->mapSecId = mapHeader->regionMapSectionId;
+ mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1.warp4.mapGroup, gSaveBlock1.warp4.mapNum);
+ gRegionMap->mapSectionId = mapHeader->regionMapSectionId;
gRegionMap->playerIsInCave = TRUE;
mapWidth = mapHeader->mapData->width;
mapHeight = mapHeader->mapData->height;
@@ -742,8 +743,8 @@ static void InitializeCursorPosition(void)
y = gSaveBlock1.warp4.y;
break;
case 8:
- mapHeader = get_mapheader_by_bank_and_number(gSaveBlock1.warp2.mapGroup, gSaveBlock1.warp2.mapNum);
- gRegionMap->mapSecId = mapHeader->regionMapSectionId;
+ mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1.warp2.mapGroup, gSaveBlock1.warp2.mapNum);
+ gRegionMap->mapSectionId = mapHeader->regionMapSectionId;
gRegionMap->playerIsInCave = TRUE;
mapWidth = mapHeader->mapData->width;
mapHeight = mapHeader->mapData->height;
@@ -754,17 +755,17 @@ static void InitializeCursorPosition(void)
{
struct WarpData *r4;
- gRegionMap->mapSecId = gMapHeader.regionMapSectionId;
- if (gRegionMap->mapSecId != MAPSEC_UNK_0x57)
+ gRegionMap->mapSectionId = gMapHeader.regionMapSectionId;
+ if (gRegionMap->mapSectionId != MAPSEC_UNK_0x57)
{
r4 = &gSaveBlock1.warp4;
- mapHeader = get_mapheader_by_bank_and_number(r4->mapGroup, r4->mapNum);
+ mapHeader = Overworld_GetMapHeaderByGroupAndId(r4->mapGroup, r4->mapNum);
}
else
{
r4 = &gSaveBlock1.warp2;
- mapHeader = get_mapheader_by_bank_and_number(r4->mapGroup, r4->mapNum);
- gRegionMap->mapSecId = mapHeader->regionMapSectionId;
+ mapHeader = Overworld_GetMapHeaderByGroupAndId(r4->mapGroup, r4->mapNum);
+ gRegionMap->mapSectionId = mapHeader->regionMapSectionId;
}
gRegionMap->playerIsInCave = FALSE;
mapWidth = mapHeader->mapData->width;
@@ -777,21 +778,21 @@ static void InitializeCursorPosition(void)
r9 = x;
- r1 = mapWidth / gRegionMapLocations[gRegionMap->mapSecId].width;
+ r1 = mapWidth / gRegionMapLocations[gRegionMap->mapSectionId].width;
if (r1 == 0)
r1 = 1;
x /= r1;
- if (x >= gRegionMapLocations[gRegionMap->mapSecId].width)
- x = gRegionMapLocations[gRegionMap->mapSecId].width - 1;
+ if (x >= gRegionMapLocations[gRegionMap->mapSectionId].width)
+ x = gRegionMapLocations[gRegionMap->mapSectionId].width - 1;
- r1 = mapHeight / gRegionMapLocations[gRegionMap->mapSecId].height;
+ r1 = mapHeight / gRegionMapLocations[gRegionMap->mapSectionId].height;
if (r1 == 0)
r1 = 1;
y /= r1;
- if (y >= gRegionMapLocations[gRegionMap->mapSecId].height)
- y = gRegionMapLocations[gRegionMap->mapSecId].height - 1;
+ if (y >= gRegionMapLocations[gRegionMap->mapSectionId].height)
+ y = gRegionMapLocations[gRegionMap->mapSectionId].height - 1;
- switch (gRegionMap->mapSecId)
+ switch (gRegionMap->mapSectionId)
{
case MAPSEC_ROUTE_114:
if (y != 0)
@@ -820,8 +821,8 @@ static void InitializeCursorPosition(void)
x++;
break;
}
- gRegionMap->cursorPosX = gRegionMapLocations[gRegionMap->mapSecId].x + x + MAPCURSOR_X_MIN;
- gRegionMap->cursorPosY = gRegionMapLocations[gRegionMap->mapSecId].y + y + MAPCURSOR_Y_MIN;
+ gRegionMap->cursorPosX = gRegionMapLocations[gRegionMap->mapSectionId].x + x + MAPCURSOR_X_MIN;
+ gRegionMap->cursorPosY = gRegionMapLocations[gRegionMap->mapSectionId].y + y + MAPCURSOR_Y_MIN;
}
static void sub_80FB600(void)
@@ -836,48 +837,48 @@ static void sub_80FB600(void)
switch (GetSSTidalLocation(&mapGroup, &mapNum, &sp2, &sp4))
{
case 1:
- gRegionMap->mapSecId = MAPSEC_SLATEPORT_CITY;
+ gRegionMap->mapSectionId = MAPSEC_SLATEPORT_CITY;
break;
case 2:
- gRegionMap->mapSecId = MAPSEC_LILYCOVE_CITY;
+ gRegionMap->mapSectionId = MAPSEC_LILYCOVE_CITY;
break;
case 3:
- gRegionMap->mapSecId = MAPSEC_ROUTE_124;
+ gRegionMap->mapSectionId = MAPSEC_ROUTE_124;
break;
case 4:
- gRegionMap->mapSecId = MAPSEC_ROUTE_131;
+ gRegionMap->mapSectionId = MAPSEC_ROUTE_131;
break;
default:
case 0:
{
- struct MapHeader *mapHeader = get_mapheader_by_bank_and_number(mapGroup, mapNum);
+ struct MapHeader *mapHeader = Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum);
u16 r1;
- gRegionMap->mapSecId = mapHeader->regionMapSectionId;
- r1 = mapHeader->mapData->width / gRegionMapLocations[gRegionMap->mapSecId].width;
+ gRegionMap->mapSectionId = mapHeader->regionMapSectionId;
+ r1 = mapHeader->mapData->width / gRegionMapLocations[gRegionMap->mapSectionId].width;
if (r1 == 0)
r1 = 1;
x = sp2 / r1;
- if (x >= gRegionMapLocations[gRegionMap->mapSecId].width)
- x = gRegionMapLocations[gRegionMap->mapSecId].width - 1;
+ if (x >= gRegionMapLocations[gRegionMap->mapSectionId].width)
+ x = gRegionMapLocations[gRegionMap->mapSectionId].width - 1;
- r1 = mapHeader->mapData->height / gRegionMapLocations[gRegionMap->mapSecId].height;
+ r1 = mapHeader->mapData->height / gRegionMapLocations[gRegionMap->mapSectionId].height;
if (r1 == 0)
r1 = 1;
y = sp4 / r1;
- if (y >= gRegionMapLocations[gRegionMap->mapSecId].height)
- y = gRegionMapLocations[gRegionMap->mapSecId].height - 1;
+ if (y >= gRegionMapLocations[gRegionMap->mapSectionId].height)
+ y = gRegionMapLocations[gRegionMap->mapSectionId].height - 1;
}
break;
}
gRegionMap->playerIsInCave = FALSE;
- gRegionMap->cursorPosX = gRegionMapLocations[gRegionMap->mapSecId].x + x + MAPCURSOR_X_MIN;
- gRegionMap->cursorPosY = gRegionMapLocations[gRegionMap->mapSecId].y + y + MAPCURSOR_Y_MIN;
+ gRegionMap->cursorPosX = gRegionMapLocations[gRegionMap->mapSectionId].x + x + MAPCURSOR_X_MIN;
+ gRegionMap->cursorPosY = gRegionMapLocations[gRegionMap->mapSectionId].y + y + MAPCURSOR_Y_MIN;
}
-static u16 sub_80FB758(u16 mapSecId)
+static u16 sub_80FB758(u16 mapSectionId)
{
- switch (mapSecId)
+ switch (mapSectionId)
{
case MAPSEC_NONE:
return 0;
@@ -915,9 +916,9 @@ static u16 sub_80FB758(u16 mapSecId)
return FlagGet(FLAG_VISITED_EVER_GRANDE_CITY) ? 2 : 3;
case MAPSEC_BATTLE_TOWER:
- return FlagGet(FLAG_UNLOCK_BATTLE_TOWER) ? 4 : 0;
+ return FlagGet(FLAG_LANDMARK_BATTLE_TOWER) ? 4 : 0;
case MAPSEC_SOUTHERN_ISLAND:
- return FlagGet(FLAG_UNLOCK_SOUTHERN_ISLAND) ? 1 : 0;
+ return FlagGet(FLAG_LANDMARK_SOUTHERN_ISLAND) ? 1 : 0;
default:
return 1;
}
@@ -928,21 +929,21 @@ u16 GetRegionMapSectionAt_(u16 x, u16 y)
return GetRegionMapSectionAt(x, y);
}
-static u16 sub_80FB9C0(u16 mapSecId)
+static u16 sub_80FB9C0(u16 mapSectionId)
{
u16 i;
for (i = 0; gUnknown_083E7684[i][0] != MAPSEC_NONE; i++)
{
- if (gUnknown_083E7684[i][0] == mapSecId)
+ if (gUnknown_083E7684[i][0] == mapSectionId)
return gUnknown_083E7684[i][1];
}
- return mapSecId;
+ return mapSectionId;
}
-u16 sub_80FBA04(u16 mapSecId)
+u16 sub_80FBA04(u16 mapSectionId)
{
- return sub_80FB9C0(mapSecId);
+ return sub_80FB9C0(mapSectionId);
}
static void sub_80FBA18(void)
@@ -951,7 +952,7 @@ static void sub_80FBA18(void)
u16 y;
u16 i;
- if (gRegionMap->mapSecId == MAPSEC_NONE)
+ if (gRegionMap->mapSectionId == MAPSEC_NONE)
{
gRegionMap->everGrandeCityArea = 0;
return;
@@ -986,7 +987,7 @@ static void sub_80FBA18(void)
else
{
x--;
- if (GetRegionMapSectionAt(x, y) == gRegionMap->mapSecId)
+ if (GetRegionMapSectionAt(x, y) == gRegionMap->mapSectionId)
i++;
}
}
@@ -1005,7 +1006,7 @@ static bool8 sub_80FBAA0(u16 a)
for (x = MAPCURSOR_X_MIN; x <= MAPCURSOR_X_MAX; x++)
{
- if (GetRegionMapSectionAt(x, y) == gRegionMap->mapSecId)
+ if (GetRegionMapSectionAt(x, y) == gRegionMap->mapSectionId)
return TRUE;
}
return FALSE;
@@ -1120,9 +1121,9 @@ void CreateRegionMapCursor(u16 tileTag, u16 paletteTag)
gRegionMap->cursorSprite->pos1.x = gRegionMap->cursorPosX * 8 + 4;
gRegionMap->cursorSprite->pos1.y = gRegionMap->cursorPosY * 8 + 4;
}
- gRegionMap->cursorSprite->data1 = 2;
- gRegionMap->cursorSprite->data2 = IndexOfSpritePaletteTag(paletteTag) * 16 + 0x0101;
- gRegionMap->cursorSprite->data3 = 1;
+ gRegionMap->cursorSprite->data[1] = 2;
+ gRegionMap->cursorSprite->data[2] = IndexOfSpritePaletteTag(paletteTag) * 16 + 0x0101;
+ gRegionMap->cursorSprite->data[3] = 1;
}
}
@@ -1138,12 +1139,12 @@ static void sub_80FBCA0(void)
void unref_sub_80FBCD0(void)
{
- gRegionMap->cursorSprite->data3 = 1;
+ gRegionMap->cursorSprite->data[3] = 1;
}
void unref_sub_80FBCE0(void)
{
- gRegionMap->cursorSprite->data3 = 0;
+ gRegionMap->cursorSprite->data[3] = 0;
}
static const struct OamData sPlayerIconOamData =
@@ -1258,16 +1259,16 @@ static void SpriteCB_PlayerIconZoomedIn(struct Sprite *sprite)
{
sprite->pos2.x = -(gRegionMap->scrollX * 2);
sprite->pos2.y = -(gRegionMap->scrollY * 2);
- sprite->data0 = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY;
- sprite->data1 = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX;
+ sprite->data[0] = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY;
+ sprite->data[1] = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX;
// Determine if sprite is on screen
- if (sprite->data0 < -8 || sprite->data0 > 0xA8 || sprite->data1 < -8 || sprite->data1 > 0xF8)
- sprite->data2 = FALSE;
+ if (sprite->data[0] < -8 || sprite->data[0] > 0xA8 || sprite->data[1] < -8 || sprite->data[1] > 0xF8)
+ sprite->data[2] = FALSE;
else
- sprite->data2 = TRUE;
+ sprite->data[2] = TRUE;
- if (sprite->data2 == TRUE)
+ if (sprite->data[2] == TRUE)
UpdateIconBlink(sprite);
else
sprite->invisible = TRUE;
@@ -1283,10 +1284,10 @@ static void UpdateIconBlink(struct Sprite *sprite)
if (gRegionMap->blinkPlayerIcon)
{
// Toggle visibility every 16 frames
- sprite->data7++;
- if (sprite->data7 > 16)
+ sprite->data[7]++;
+ if (sprite->data[7] > 16)
{
- sprite->data7 = 0;
+ sprite->data[7] = 0;
sprite->invisible = !sprite->invisible;
}
}
@@ -1302,44 +1303,44 @@ void sub_80FBF94(void)
gRegionMap->blinkPlayerIcon = TRUE;
}
-const u8 *GetMapSectionName(u8 *dest, u16 mapSecId, u16 length)
+const u8 *GetMapSectionName(u8 *dest, u16 mapSectionId, u16 length)
{
- if (mapSecId == MAPSEC_SECRET_BASE)
+ if (mapSectionId == MAPSEC_SECRET_BASE)
return GetSecretBaseMapName(dest);
- if (mapSecId < MAPSEC_NONE)
- return StringCopy(dest, gRegionMapLocations[mapSecId].regionMapSectionId);
+ if (mapSectionId < MAPSEC_NONE)
+ return StringCopy(dest, gRegionMapLocations[mapSectionId].regionMapSectionId);
if (length == 0)
length = 18;
return StringFill(dest, CHAR_SPACE, length);
}
-const u8 *CopyMapName(u8 *dest, u16 mapSecId)
+const u8 *CopyMapName(u8 *dest, u16 mapSectionId)
{
- switch (mapSecId)
+ switch (mapSectionId)
{
case MAPSEC_UNK_0x57:
return StringCopy(dest, gOtherText_Ferry);
case MAPSEC_SECRET_BASE:
return StringCopy(dest, gOtherText_SecretBase);
default:
- return GetMapSectionName(dest, mapSecId, 0);
+ return GetMapSectionName(dest, mapSectionId, 0);
}
}
-const u8 *CopyLocationName(u8 *dest, u16 mapSecId)
+const u8 *CopyLocationName(u8 *dest, u16 mapSectionId)
{
- if (mapSecId == MAPSEC_EVIL_TEAM_HIDEOUT)
+ if (mapSectionId == MAPSEC_EVIL_TEAM_HIDEOUT)
return StringCopy(dest, gOtherText_Hideout);
else
- return CopyMapName(dest, mapSecId);
+ return CopyMapName(dest, mapSectionId);
}
-static void GetRegionMapLocationPosition(u16 mapSecId, u16 *x, u16 *y, u16 *width, u16 *height)
+static void GetRegionMapLocationPosition(u16 mapSectionId, u16 *x, u16 *y, u16 *width, u16 *height)
{
- *x = gRegionMapLocations[mapSecId].x;
- *y = gRegionMapLocations[mapSecId].y;
- *width = gRegionMapLocations[mapSecId].width;
- *height = gRegionMapLocations[mapSecId].height;
+ *x = gRegionMapLocations[mapSectionId].x;
+ *y = gRegionMapLocations[mapSectionId].y;
+ *width = gRegionMapLocations[mapSectionId].width;
+ *height = gRegionMapLocations[mapSectionId].height;
}
struct UnknownStruct3
@@ -1350,12 +1351,6 @@ struct UnknownStruct3
struct RegionMap regionMap;
};
-extern u8 ewram[];
-#define ewram0 (*(struct UnknownStruct3 *)(ewram + 0))
-#define ewram888 (ewram + 0x888)
-#define ewramA6E (ewram[0xA6E])
-#define ewramBlankMapName (ewram + 0xA48)
-
static const u16 sFlyRegionMapFrame_Pal[] = INCBIN_U16("graphics/pokenav/map_frame.gbapal");
static const u8 sFlyRegionMapFrame_ImageLZ[] = INCBIN_U8("graphics/pokenav/map_frame.4bpp.lz");
static const u8 sFlyRegionMapFrame_TilemapLZ[] = INCBIN_U8("graphics/pokenav/map_frame.bin.lz");
@@ -1419,7 +1414,7 @@ static const u8 sUnknown_083E7920[][3] =
struct UnknownStruct4
{
const u8 *const *unk0;
- u16 mapSecId;
+ u16 mapSectionId;
u16 flag;
};
@@ -1427,18 +1422,18 @@ static const u8 *const sEverGrandeCityAreaNames[] = {OtherText_PokeLeague, Other
static const struct UnknownStruct4 sUnknown_083E79C0[1] =
{
- {sEverGrandeCityAreaNames, MAPSEC_EVER_GRANDE_CITY, SYS_POKEMON_LEAGUE_FLY},
+ {sEverGrandeCityAreaNames, MAPSEC_EVER_GRANDE_CITY, FLAG_SYS_POKEMON_LEAGUE_FLY},
};
// XXX: what is this?
-static u8 *const ewram_ = ewram;
+static u8 *const ewram_ = gSharedMem;
static const struct SpritePalette sFlyTargetIconSpritePalette = {sFlyTargetIcons_Pal, 2};
// Fly targets that are not cities or towns
static const u16 sSpecialFlyAreas[][2] =
{
- // flag, mapSecId
+ // flag, mapSectionId
{0x848, MAPSEC_BATTLE_TOWER},
{0xFFFF, MAPSEC_NONE},
};
@@ -1552,10 +1547,10 @@ void CB2_InitFlyRegionMap(void)
MenuZeroFillScreen();
break;
case 3:
- InitRegionMap(&ewram0.regionMap, 0);
+ InitRegionMap(&ewram0_3.regionMap, 0);
CreateRegionMapCursor(0, 0);
CreateRegionMapPlayerIcon(1, 1);
- ewram0.unk6 = ewram0.regionMap.mapSecId;
+ ewram0_3.unk6 = ewram0_3.regionMap.mapSectionId;
StringFill(ewramBlankMapName, CHAR_SPACE, 12);
PrintFlyTargetName();
break;
@@ -1598,20 +1593,20 @@ static void VBlankCB_FlyRegionMap(void)
static void CB2_FlyRegionMap(void)
{
- ewram0.unk0();
+ ewram0_3.unk0();
AnimateSprites();
BuildOamBuffer();
}
static void sub_80FC244(void (*func)(void))
{
- ewram0.unk0 = func;
- ewram0.unk4 = 0;
+ ewram0_3.unk0 = func;
+ ewram0_3.unk4 = 0;
}
static void PrintFlyTargetName(void)
{
- if (ewram0.regionMap.unk16 == 2 || ewram0.regionMap.unk16 == 4)
+ if (ewram0_3.regionMap.unk16 == 2 || ewram0_3.regionMap.unk16 == 4)
{
u16 i = 0;
int zero;
@@ -1620,13 +1615,13 @@ static void PrintFlyTargetName(void)
{
const struct UnknownStruct4 *r4 = &sUnknown_083E79C0[i];
- if (ewram0.regionMap.mapSecId == r4->mapSecId)
+ if (ewram0_3.regionMap.mapSectionId == r4->mapSectionId)
{
if (FlagGet(r4->flag))
{
MenuDrawTextWindow(16, 14, 29, 19);
- MenuPrint(ewram0.regionMap.mapSecName, 17, 15);
- MenuPrint_RightAligned(r4->unk0[ewram0.regionMap.everGrandeCityArea], 29, 17);
+ MenuPrint(ewram0_3.regionMap.mapSectionName, 17, 15);
+ MenuPrint_RightAligned(r4->unk0[ewram0_3.regionMap.everGrandeCityArea], 29, 17);
return;
}
break;
@@ -1637,7 +1632,7 @@ static void PrintFlyTargetName(void)
if (zero == 0)
{
MenuDrawTextWindow(16, 16, 29, 19);
- MenuPrint(ewram0.regionMap.mapSecName, 17, 17);
+ MenuPrint(ewram0_3.regionMap.mapSectionName, 17, 17);
MenuZeroFillWindowRect(16, 14, 29, 15);
}
}
@@ -1696,7 +1691,7 @@ static void CreateCityTownFlyTargetIcons(void)
else
r7 += 3;
StartSpriteAnim(&gSprites[spriteId], r7);
- gSprites[spriteId].data0 = i;
+ gSprites[spriteId].data[0] = i;
}
canFlyFlag++;
}
@@ -1717,10 +1712,10 @@ static void CreateSpecialAreaFlyTargetIcons(void)
if (FlagGet(sSpecialFlyAreas[i][0]))
{
- u16 mapSecId = sSpecialFlyAreas[i][1];
+ u16 mapSectionId = sSpecialFlyAreas[i][1];
u8 spriteId;
- GetRegionMapLocationPosition(mapSecId, &x, &y, &width, &height);
+ GetRegionMapLocationPosition(mapSectionId, &x, &y, &width, &height);
x = (x + 1) * 8;
y = (y + 2) * 8;
spriteId = CreateSprite(&gFlyTargetSpriteTemplate, x, y, 10);
@@ -1729,7 +1724,7 @@ static void CreateSpecialAreaFlyTargetIcons(void)
gSprites[spriteId].oam.size = 1;
gSprites[spriteId].callback = SpriteCB_FlyTargetIcons;
StartSpriteAnim(&gSprites[spriteId], 6);
- gSprites[spriteId].data0 = mapSecId;
+ gSprites[spriteId].data[0] = mapSectionId;
}
}
}
@@ -1737,31 +1732,31 @@ static void CreateSpecialAreaFlyTargetIcons(void)
static void SpriteCB_FlyTargetIcons(struct Sprite *sprite)
{
- // Blink if our mapSecId is the one selected on the map
- if (ewram0.regionMap.mapSecId == sprite->data0)
+ // Blink if our mapSectionId is the one selected on the map
+ if (ewram0_3.regionMap.mapSectionId == sprite->data[0])
{
// Toggle visibility every 16 frames
- sprite->data1++;
- if (sprite->data1 > 16)
+ sprite->data[1]++;
+ if (sprite->data[1] > 16)
{
- sprite->data1 = 0;
+ sprite->data[1] = 0;
sprite->invisible = !sprite->invisible;
}
}
else
{
- sprite->data1 = 16;
+ sprite->data[1] = 16;
sprite->invisible = FALSE;
}
}
static void sub_80FC5B4(void)
{
- switch (ewram0.unk4)
+ switch (ewram0_3.unk4)
{
case 0:
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
- ewram0.unk4++;
+ ewram0_3.unk4++;
break;
case 1:
if (UpdatePaletteFade() != 0)
@@ -1773,7 +1768,7 @@ static void sub_80FC5B4(void)
static void sub_80FC600(void)
{
- if (ewram0.unk4 == 0)
+ if (ewram0_3.unk4 == 0)
{
switch (sub_80FAB60())
{
@@ -1785,7 +1780,7 @@ static void sub_80FC600(void)
PrintFlyTargetName();
break;
case INPUT_EVENT_A_BUTTON:
- if (ewram0.regionMap.unk16 == 2 || ewram0.regionMap.unk16 == 4)
+ if (ewram0_3.regionMap.unk16 == 2 || ewram0_3.regionMap.unk16 == 4)
{
m4aSongNumStart(SE_SELECT);
ewramA6E = 1;
@@ -1803,11 +1798,11 @@ static void sub_80FC600(void)
static void sub_80FC69C(void)
{
- switch (ewram0.unk4)
+ switch (ewram0_3.unk4)
{
case 0:
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
- ewram0.unk4++;
+ ewram0_3.unk4++;
break;
case 1:
if (UpdatePaletteFade() != 0)
@@ -1815,7 +1810,7 @@ static void sub_80FC69C(void)
FreeRegionMapIconResources();
if (ewramA6E != 0)
{
- switch (ewram0.regionMap.mapSecId)
+ switch (ewram0_3.regionMap.mapSectionId)
{
case MAPSEC_SOUTHERN_ISLAND:
sub_8053538(22);
@@ -1827,13 +1822,13 @@ static void sub_80FC69C(void)
sub_8053538((gSaveBlock2.playerGender == MALE) ? 12 : 13);
break;
case MAPSEC_EVER_GRANDE_CITY:
- sub_8053538((FlagGet(0x854) && ewram0.regionMap.everGrandeCityArea == 0) ? 20 : 11);
+ sub_8053538((FlagGet(FLAG_SYS_POKEMON_LEAGUE_FLY) && ewram0_3.regionMap.everGrandeCityArea == 0) ? 20 : 11);
break;
default:
- if (sUnknown_083E7920[ewram0.regionMap.mapSecId][2] != 0)
- sub_8053538(sUnknown_083E7920[ewram0.regionMap.mapSecId][2]);
+ if (sUnknown_083E7920[ewram0_3.regionMap.mapSectionId][2] != 0)
+ sub_8053538(sUnknown_083E7920[ewram0_3.regionMap.mapSectionId][2]);
else
- warp1_set_2(sUnknown_083E7920[ewram0.regionMap.mapSecId][0], sUnknown_083E7920[ewram0.regionMap.mapSecId][1], -1);
+ warp1_set_2(sUnknown_083E7920[ewram0_3.regionMap.mapSectionId][0], sUnknown_083E7920[ewram0_3.regionMap.mapSectionId][1], -1);
break;
}
sub_80865BC();
diff --git a/src/roamer.c b/src/field/roamer.c
index 948828d5e..2eb26ef9d 100644
--- a/src/roamer.c
+++ b/src/field/roamer.c
@@ -1,8 +1,8 @@
#include "global.h"
#include "roamer.h"
#include "pokemon.h"
-#include "rng.h"
-#include "species.h"
+#include "random.h"
+#include "constants/species.h"
#ifdef SAPPHIRE
#define ROAMER_SPECIES SPECIES_LATIAS
@@ -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..00008c69c 100644
--- a/src/rotating_gate.c
+++ b/src/field/rotating_gate.c
@@ -3,8 +3,8 @@
#include "event_data.h"
#include "field_map_obj.h"
#include "fieldmap.h"
-#include "map_constants.h"
-#include "songs.h"
+#include "constants/maps.h"
+#include "constants/songs.h"
#include "sound.h"
#include "sprite.h"
@@ -622,14 +622,14 @@ static EWRAM_DATA u8 gRotatingGate_PuzzleCount = 0;
static int GetCurrentMapRotatingGatePuzzleType(void)
{
- if (gSaveBlock1.location.mapGroup == MAP_GROUP_FORTREE_CITY_GYM &&
- gSaveBlock1.location.mapNum == MAP_ID_FORTREE_CITY_GYM)
+ if (gSaveBlock1.location.mapGroup == MAP_GROUP(FORTREE_CITY_GYM) &&
+ gSaveBlock1.location.mapNum == MAP_NUM(FORTREE_CITY_GYM))
{
return PUZZLE_FORTREE_CITY_GYM;
}
- if (gSaveBlock1.location.mapGroup == MAP_GROUP_ROUTE110_TRICK_HOUSE_PUZZLE6 &&
- gSaveBlock1.location.mapNum == MAP_ID_ROUTE110_TRICK_HOUSE_PUZZLE6)
+ if (gSaveBlock1.location.mapGroup == MAP_GROUP(ROUTE110_TRICK_HOUSE_PUZZLE6) &&
+ gSaveBlock1.location.mapNum == MAP_NUM(ROUTE110_TRICK_HOUSE_PUZZLE6))
{
return PUZZLE_ROUTE110_TRICK_HOUSE_PUZZLE6;
}
@@ -762,7 +762,7 @@ static u8 RotatingGate_CreateGate(u8 gateId, s16 deltaX, s16 deltaY)
y = gate->y + 7;
sprite = &gSprites[spriteId];
- sprite->data0 = gateId;
+ sprite->data[0] = gateId;
sprite->coordOffsetEnabled = 1;
sub_8060388(x + deltaX, y + deltaY, &sprite->pos1.x, &sprite->pos1.y);
@@ -778,8 +778,8 @@ static void SpriteCallback_RotatingGate(struct Sprite *sprite)
u8 orientation;
u8 affineAnimation;
- rotationDirection = sprite->data1;
- orientation = sprite->data2;
+ rotationDirection = sprite->data[1];
+ orientation = sprite->data[2];
RotatingGate_HideGatesOutsideViewport(sprite);
@@ -804,7 +804,7 @@ static void SpriteCallback_RotatingGate(struct Sprite *sprite)
StartSpriteAffineAnim(sprite, affineAnimation);
}
- sprite->data1 = ROTATE_NONE;
+ sprite->data[1] = ROTATE_NONE;
}
static void RotatingGate_HideGatesOutsideViewport(struct Sprite *sprite)
@@ -1065,8 +1065,8 @@ static void RotatingGate_TriggerRotationAnimation(u8 gateId, int rotationDirecti
if (gRotatingGate_GateSpriteIds[gateId] != MAX_SPRITES)
{
sprite = &gSprites[gRotatingGate_GateSpriteIds[gateId]];
- sprite->data1 = rotationDirection;
- sprite->data2 = RotatingGate_GetGateOrientation(gateId);
+ sprite->data[1] = rotationDirection;
+ sprite->data[2] = RotatingGate_GetGateOrientation(gateId);
}
}
diff --git a/src/safari_zone.c b/src/field/safari_zone.c
index a47c8e951..e9ca3a9f9 100644
--- a/src/safari_zone.c
+++ b/src/field/safari_zone.c
@@ -4,7 +4,7 @@
#include "field_fadetransition.h"
#include "field_player_avatar.h"
#include "main.h"
-#include "rom4.h"
+#include "overworld.h"
#include "script.h"
#include "string_util.h"
#include "text.h"
@@ -37,21 +37,21 @@ extern u8 gUnknown_081C3448;
extern u8 gUnknown_081C3459;
extern u8 *gPokeblockNames[];
-extern u16 gScriptResult;
+extern u16 gSpecialVar_Result;
bool32 GetSafariZoneFlag(void)
{
- return FlagGet(SYS_SAFARI_MODE);
+ return FlagGet(FLAG_SYS_SAFARI_MODE);
}
void SetSafariZoneFlag(void)
{
- FlagSet(SYS_SAFARI_MODE);
+ FlagSet(FLAG_SYS_SAFARI_MODE);
}
void ResetSafariZoneFlag(void)
{
- FlagReset(SYS_SAFARI_MODE);
+ FlagClear(FLAG_SYS_SAFARI_MODE);
}
void EnterSafariMode(void)
@@ -137,13 +137,13 @@ void SafariZoneGetPokeblockNameInFeeder(void)
&& gPokeblockFeeders[i].x == x
&& gPokeblockFeeders[i].y == y)
{
- gScriptResult = i;
+ gSpecialVar_Result = i;
StringCopy(gStringVar1, gPokeblockNames[gPokeblockFeeders[i].pokeblock.color]);
return;
}
}
- gScriptResult = -1;
+ gSpecialVar_Result = -1;
}
static void GetPokeblockFeederWithinRange(void)
@@ -166,23 +166,23 @@ static void GetPokeblockFeederWithinRange(void)
y *= -1;
if ((x + y) <= 5)
{
- gScriptResult = i;
+ gSpecialVar_Result = i;
return;
}
}
}
- gScriptResult = -1;
+ gSpecialVar_Result = -1;
}
struct Pokeblock *unref_sub_80C8418(void)
{
SafariZoneGetPokeblockNameInFeeder();
- if (gScriptResult == 0xFFFF)
+ if (gSpecialVar_Result == 0xFFFF)
return NULL;
else
- return &gPokeblockFeeders[gScriptResult].pokeblock;
+ return &gPokeblockFeeders[gSpecialVar_Result].pokeblock;
}
@@ -190,10 +190,10 @@ struct Pokeblock *SafariZoneGetActivePokeblock(void)
{
GetPokeblockFeederWithinRange();
- if (gScriptResult == 0xFFFF)
+ if (gSpecialVar_Result == 0xFFFF)
return NULL;
else
- return &gPokeblockFeeders[gScriptResult].pokeblock;
+ return &gPokeblockFeeders[gSpecialVar_Result].pokeblock;
}
@@ -240,13 +240,13 @@ bool8 unref_sub_80C853C(void)
{
SafariZoneGetPokeblockNameInFeeder();
- if (gScriptResult == 0xFFFF)
+ if (gSpecialVar_Result == 0xFFFF)
{
return FALSE;
}
ConvertIntToDecimalStringN(gStringVar2,
- gPokeblockFeeders[gScriptResult].stepCounter,
+ gPokeblockFeeders[gSpecialVar_Result].stepCounter,
STR_CONV_MODE_LEADING_ZEROS, 3);
return TRUE;
diff --git a/src/scrcmd.c b/src/field/scrcmd.c
index 66578f350..05a909e81 100644
--- a/src/scrcmd.c
+++ b/src/field/scrcmd.c
@@ -30,8 +30,8 @@
#include "palette.h"
#include "party_menu.h"
#include "pokemon.h"
-#include "rng.h"
-#include "rom4.h"
+#include "random.h"
+#include "overworld.h"
#include "rtc.h"
#include "script.h"
#include "script_menu.h"
@@ -50,20 +50,20 @@ typedef void (*NativeFunc)(void);
extern u32 gUnknown_0202E8AC;
static EWRAM_DATA u32 gUnknown_0202E8B0 = 0;
-static EWRAM_DATA u16 gUnknown_0202E8B4 = 0;
-static EWRAM_DATA u16 gUnknown_0202E8B6 = 0;
-static EWRAM_DATA u16 gUnknown_0202E8B8 = 0;
-static EWRAM_DATA u16 gUnknown_0202E8BA = 0;
-static EWRAM_DATA u16 gUnknown_0202E8BC = 0;
+static EWRAM_DATA u16 sPauseCounter = 0;
+static EWRAM_DATA u16 sMovingNpcId = 0;
+static EWRAM_DATA u16 sMovingNpcMapBank = 0;
+static EWRAM_DATA u16 sMovingNpcMapId = 0;
+static EWRAM_DATA u16 sFieldEffectScriptId = 0;
extern u16 gSpecialVar_0x8000;
extern u16 gSpecialVar_0x8001;
extern u16 gSpecialVar_0x8002;
extern u16 gSpecialVar_0x8004;
-extern u16 gScriptResult;
+extern u16 gSpecialVar_Result;
-extern u16 gScriptContestCategory;
+extern u16 gSpecialVar_ContestCategory;
extern SpecialFunc gSpecials[];
extern u8 *gStdScripts[];
@@ -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,30 +107,34 @@ bool8 ScrCmd_end(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_jumpasm(struct ScriptContext *ctx)
+bool8 ScrCmd_gotonative(struct ScriptContext *ctx)
{
- u32 addr = ScriptReadWord(ctx);
- SetupNativeScript(ctx, (void *)addr);
+ bool8 (*addr)(void) = (bool8 (*)(void))ScriptReadWord(ctx);
+
+ SetupNativeScript(ctx, addr);
return TRUE;
}
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,23 +478,26 @@ bool8 ScrCmd_subvar(struct ScriptContext *ctx)
bool8 ScrCmd_random(struct ScriptContext *ctx)
{
u16 max = VarGet(ScriptReadHalfword(ctx));
- gScriptResult = Random() % max;
+
+ gSpecialVar_Result = Random() % max;
return FALSE;
}
-bool8 ScrCmd_additem(struct ScriptContext *ctx)
+bool8 ScrCmd_giveitem(struct ScriptContext *ctx)
{
u16 itemId = VarGet(ScriptReadHalfword(ctx));
u32 quantity = VarGet(ScriptReadHalfword(ctx));
- gScriptResult = AddBagItem(itemId, (u8)quantity);
+
+ gSpecialVar_Result = AddBagItem(itemId, (u8)quantity);
return FALSE;
}
-bool8 ScrCmd_removeitem(struct ScriptContext *ctx)
+bool8 ScrCmd_takeitem(struct ScriptContext *ctx)
{
u16 itemId = VarGet(ScriptReadHalfword(ctx));
u32 quantity = VarGet(ScriptReadHalfword(ctx));
- gScriptResult = RemoveBagItem(itemId, (u8)quantity);
+
+ gSpecialVar_Result = RemoveBagItem(itemId, (u8)quantity);
return FALSE;
}
@@ -471,7 +505,8 @@ bool8 ScrCmd_checkitemspace(struct ScriptContext *ctx)
{
u16 itemId = VarGet(ScriptReadHalfword(ctx));
u32 quantity = VarGet(ScriptReadHalfword(ctx));
- gScriptResult = CheckBagHasSpace(itemId, (u8)quantity);
+
+ gSpecialVar_Result = CheckBagHasSpace(itemId, (u8)quantity);
return FALSE;
}
@@ -479,22 +514,25 @@ bool8 ScrCmd_checkitem(struct ScriptContext *ctx)
{
u16 itemId = VarGet(ScriptReadHalfword(ctx));
u32 quantity = VarGet(ScriptReadHalfword(ctx));
- gScriptResult = CheckBagHasItem(itemId, (u8)quantity);
+
+ gSpecialVar_Result = CheckBagHasItem(itemId, (u8)quantity);
return FALSE;
}
bool8 ScrCmd_checkitemtype(struct ScriptContext *ctx)
{
u16 itemId = VarGet(ScriptReadHalfword(ctx));
- gScriptResult = GetPocketByItemId(itemId);
+
+ gSpecialVar_Result = GetPocketByItemId(itemId);
return FALSE;
}
-bool8 ScrCmd_addpcitem(struct ScriptContext *ctx)
+bool8 ScrCmd_givepcitem(struct ScriptContext *ctx)
{
u16 itemId = VarGet(ScriptReadHalfword(ctx));
u16 quantity = VarGet(ScriptReadHalfword(ctx));
- gScriptResult = AddPCItem(itemId, quantity);
+
+ gSpecialVar_Result = AddPCItem(itemId, quantity);
return FALSE;
}
@@ -502,35 +540,40 @@ bool8 ScrCmd_checkpcitem(struct ScriptContext *ctx)
{
u16 itemId = VarGet(ScriptReadHalfword(ctx));
u16 quantity = VarGet(ScriptReadHalfword(ctx));
- gScriptResult = CheckPCHasItem(itemId, quantity);
+
+ gSpecialVar_Result = CheckPCHasItem(itemId, quantity);
return FALSE;
}
-bool8 ScrCmd_adddecor(struct ScriptContext *ctx)
+bool8 ScrCmd_givedecoration(struct ScriptContext *ctx)
{
- u32 decorId = VarGet(ScriptReadHalfword(ctx));
- gScriptResult = IsThereStorageSpaceForDecoration(decorId);
+ u32 decoration = VarGet(ScriptReadHalfword(ctx));
+
+ gSpecialVar_Result = IsThereStorageSpaceForDecoration(decoration);
return FALSE;
}
-bool8 ScrCmd_removedecor(struct ScriptContext *ctx)
+bool8 ScrCmd_takedecoration(struct ScriptContext *ctx)
{
- u32 decorId = VarGet(ScriptReadHalfword(ctx));
- gScriptResult = sub_81340A8(decorId);
+ u32 decoration = VarGet(ScriptReadHalfword(ctx));
+
+ gSpecialVar_Result = sub_81340A8(decoration);
return FALSE;
}
-bool8 ScrCmd_checkdecor(struct ScriptContext *ctx)
+bool8 ScrCmd_checkdecorspace(struct ScriptContext *ctx)
{
u32 decorId = VarGet(ScriptReadHalfword(ctx));
- gScriptResult = sub_8134074(decorId);
+
+ gSpecialVar_Result = sub_8134074(decorId);
return FALSE;
}
-bool8 ScrCmd_testdecor(struct ScriptContext *ctx)
+bool8 ScrCmd_checkdecor(struct ScriptContext *ctx)
{
u32 decorId = VarGet(ScriptReadHalfword(ctx));
- gScriptResult = sub_8133FE4(decorId);
+
+ gSpecialVar_Result = sub_8133FE4(decorId);
return FALSE;
}
@@ -542,7 +585,7 @@ bool8 ScrCmd_setflag(struct ScriptContext *ctx)
bool8 ScrCmd_clearflag(struct ScriptContext *ctx)
{
- FlagReset(ScriptReadHalfword(ctx));
+ FlagClear(ScriptReadHalfword(ctx));
return FALSE;
}
@@ -552,23 +595,24 @@ 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_animateflash(struct ScriptContext *ctx)
{
sub_8081594(ScriptReadByte(ctx));
ScriptContext1_Stop();
return TRUE;
}
-bool8 ScrCmd_darken(struct ScriptContext *ctx)
+bool8 ScrCmd_setflashradius(struct ScriptContext *ctx)
{
- u16 value = VarGet(ScriptReadHalfword(ctx));
- sub_8053CE4(value);
+ u16 flashLevel = VarGet(ScriptReadHalfword(ctx));
+
+ Overworld_SetFlashLevel(flashLevel);
return FALSE;
}
@@ -587,47 +631,49 @@ bool8 ScrCmd_fadescreen(struct ScriptContext *ctx)
return TRUE;
}
-bool8 ScrCmd_fadescreendelay(struct ScriptContext *ctx)
+bool8 ScrCmd_fadescreenspeed(struct ScriptContext *ctx)
{
u8 duration = ScriptReadByte(ctx);
u8 delay = ScriptReadByte(ctx);
+
fade_screen(duration, delay);
SetupNativeScript(ctx, IsPaletteNotActive);
return TRUE;
}
-bool8 s28_pause_asm()
+bool8 RunPauseTimer()
{
- gUnknown_0202E8B4--;
+ sPauseCounter--;
- if (gUnknown_0202E8B4 == 0)
+ if (sPauseCounter == 0)
return TRUE;
else
return FALSE;
}
-bool8 ScrCmd_pause(struct ScriptContext *ctx)
+bool8 ScrCmd_delay(struct ScriptContext *ctx)
{
- gUnknown_0202E8B4 = ScriptReadHalfword(ctx);
- SetupNativeScript(ctx, s28_pause_asm);
+ sPauseCounter = ScriptReadHalfword(ctx);
+ SetupNativeScript(ctx, RunPauseTimer);
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,14 +684,15 @@ 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;
}
bool8 ScrCmd_resetweather(struct ScriptContext *ctx)
{
- sub_80806E4();
+ SetSav1WeatherFromCurrMapHeader();
return FALSE;
}
@@ -655,53 +702,57 @@ bool8 ScrCmd_doweather(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_tileeffect(struct ScriptContext *ctx)
+bool8 ScrCmd_setstepcallback(struct ScriptContext *ctx)
{
ActivatePerStepCallback(ScriptReadByte(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,94 +777,101 @@ 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;
}
-bool8 ScrCmd_countpokemon(struct ScriptContext *ctx)
+bool8 ScrCmd_getpartysize(struct ScriptContext *ctx)
{
- gScriptResult = CalculatePlayerPartyCount();
+ gSpecialVar_Result = CalculatePlayerPartyCount();
return FALSE;
}
-bool8 ScrCmd_playsfx(struct ScriptContext *ctx)
+bool8 ScrCmd_playse(struct ScriptContext *ctx)
{
PlaySE(ScriptReadHalfword(ctx));
return FALSE;
}
-bool8 s30_music_check_asm()
+static bool8 WaitForSoundEffectFinish(void)
{
if (!IsSEPlaying())
return TRUE;
@@ -823,222 +879,238 @@ bool8 s30_music_check_asm()
return FALSE;
}
-bool8 ScrCmd_checksound(struct ScriptContext *ctx)
+bool8 ScrCmd_waitse(struct ScriptContext *ctx)
{
- SetupNativeScript(ctx, s30_music_check_asm);
+ SetupNativeScript(ctx, WaitForSoundEffectFinish);
return TRUE;
}
-bool8 ScrCmd_fanfare(struct ScriptContext *ctx)
+bool8 ScrCmd_playfanfare(struct ScriptContext *ctx)
{
PlayFanfare(ScriptReadHalfword(ctx));
return FALSE;
}
-bool8 s32_fanfare_wait_asm()
+static bool8 WaitForFanfareFinish(void)
{
return IsFanfareTaskInactive();
}
bool8 ScrCmd_waitfanfare(struct ScriptContext *ctx)
{
- SetupNativeScript(ctx, s32_fanfare_wait_asm);
+ SetupNativeScript(ctx, WaitForFanfareFinish);
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)
{
- sub_8053FB0(ScriptReadHalfword(ctx));
+ Overworld_ChangeMusicTo(ScriptReadHalfword(ctx));
return FALSE;
}
-bool8 ScrCmd_fadeout(struct ScriptContext *ctx)
+bool8 ScrCmd_fadeoutbgm(struct ScriptContext *ctx)
{
- u8 val = ScriptReadByte(ctx);
- if (val)
- FadeOutBGMTemporarily(4 * val);
+ u8 speed = ScriptReadByte(ctx);
+
+ if (speed != 0)
+ FadeOutBGMTemporarily(4 * speed);
else
FadeOutBGMTemporarily(4);
SetupNativeScript(ctx, IsBGMPausedOrStopped);
return TRUE;
}
-bool8 ScrCmd_fadein(struct ScriptContext *ctx)
+bool8 ScrCmd_fadeinbgm(struct ScriptContext *ctx)
{
- u8 val = ScriptReadByte(ctx);
- if (val)
- FadeInBGM(4 * val);
+ u8 speed = ScriptReadByte(ctx);
+
+ if (speed != 0)
+ FadeInBGM(4 * speed);
else
FadeInBGM(4);
return FALSE;
}
-bool8 ScrCmd_move(struct ScriptContext *ctx)
+bool8 ScrCmd_applymovement(struct ScriptContext *ctx)
{
- u16 v1 = VarGet(ScriptReadHalfword(ctx));
- void *v2 = (void *)ScriptReadWord(ctx);
- exec_movement(v1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, v2);
- gUnknown_0202E8B6 = v1;
+ u16 localId = VarGet(ScriptReadHalfword(ctx));
+ void *movementScript = (void *)ScriptReadWord(ctx);
+
+ ScriptMovement_StartObjectMovementScript(localId, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, movementScript);
+ sMovingNpcId = localId;
return FALSE;
}
-bool8 ScrCmd_movecoords(struct ScriptContext *ctx)
+bool8 ScrCmd_applymovement_at(struct ScriptContext *ctx)
{
- u16 v1 = VarGet(ScriptReadHalfword(ctx));
- void *v2 = (void *)ScriptReadWord(ctx);
- u8 v3 = ScriptReadByte(ctx);
- u8 v4 = ScriptReadByte(ctx);
- exec_movement(v1, v4, v3, v2);
- gUnknown_0202E8B6 = v1;
+ u16 localId = VarGet(ScriptReadHalfword(ctx));
+ void *movementScript = (void *)ScriptReadWord(ctx);
+ u8 mapGroup = ScriptReadByte(ctx);
+ u8 mapNum = ScriptReadByte(ctx);
+
+ ScriptMovement_StartObjectMovementScript(localId, mapNum, mapGroup, movementScript);
+ sMovingNpcId = localId;
return FALSE;
}
-bool8 s51a_0806B288(void)
+static bool8 WaitForMovementFinish(void)
{
- return sub_80A212C(gUnknown_0202E8B6, gUnknown_0202E8BA, gUnknown_0202E8B8);
+ return ScriptMovement_IsObjectMovementFinished(sMovingNpcId, sMovingNpcMapId, sMovingNpcMapBank);
}
-bool8 ScrCmd_waitmove(struct ScriptContext *ctx)
+bool8 ScrCmd_waitmovement(struct ScriptContext *ctx)
{
- u16 v1 = VarGet(ScriptReadHalfword(ctx));
- if (v1)
- gUnknown_0202E8B6 = v1;
- gUnknown_0202E8B8 = gSaveBlock1.location.mapGroup;
- gUnknown_0202E8BA = gSaveBlock1.location.mapNum;
- SetupNativeScript(ctx, s51a_0806B288);
+ u16 localId = VarGet(ScriptReadHalfword(ctx));
+
+ if (localId != 0)
+ sMovingNpcId = localId;
+ sMovingNpcMapBank = gSaveBlock1.location.mapGroup;
+ sMovingNpcMapId = gSaveBlock1.location.mapNum;
+ SetupNativeScript(ctx, WaitForMovementFinish);
return TRUE;
}
-bool8 ScrCmd_waitmovexy(struct ScriptContext *ctx)
+bool8 ScrCmd_waitmovement_at(struct ScriptContext *ctx)
{
- u16 v1 = VarGet(ScriptReadHalfword(ctx));
- u8 v2;
- u8 v3;
-
- if (v1)
- gUnknown_0202E8B6 = v1;
+ u16 localId = VarGet(ScriptReadHalfword(ctx));
+ u8 mapBank;
+ u8 mapId;
- v2 = ScriptReadByte(ctx);
- v3 = ScriptReadByte(ctx);
- gUnknown_0202E8B8 = v2;
- gUnknown_0202E8BA = v3;
- SetupNativeScript(ctx, s51a_0806B288);
+ if (localId != 0)
+ sMovingNpcId = localId;
+ mapBank = ScriptReadByte(ctx);
+ mapId = ScriptReadByte(ctx);
+ sMovingNpcMapBank = mapBank;
+ sMovingNpcMapId = mapId;
+ SetupNativeScript(ctx, WaitForMovementFinish);
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));
- update_saveblock1_field_object_coords(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_showobjectat(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_hideobjectat(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;
}
@@ -1052,39 +1124,43 @@ bool8 ScrCmd_faceplayer(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_spriteface(struct ScriptContext *ctx)
+bool8 ScrCmd_turnobject(struct ScriptContext *ctx)
{
- u16 v1 = VarGet(ScriptReadHalfword(ctx));
- u8 v2 = ScriptReadByte(ctx);
- FieldObjectTurnByLocalIdAndMap(v1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, v2);
+ 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);
- update_saveblock1_field_object_movement_behavior(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;
}
@@ -1112,7 +1188,7 @@ bool8 ScrCmd_lock(struct ScriptContext *ctx)
{
if (gMapObjects[gSelectedMapObject].active)
{
- sub_8064DD8();
+ LockSelectedMapObject();
SetupNativeScript(ctx, sub_8064DB4);
}
else
@@ -1120,7 +1196,6 @@ bool8 ScrCmd_lock(struct ScriptContext *ctx)
ScriptFreezeMapObjects();
SetupNativeScript(ctx, sub_8064CFC);
}
-
return TRUE;
}
}
@@ -1154,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;
@@ -1190,7 +1267,7 @@ bool8 WaitForAorBPress(void)
return FALSE;
}
-bool8 ScrCmd_waitbutton(struct ScriptContext *ctx)
+bool8 ScrCmd_waitbuttonpress(struct ScriptContext *ctx)
{
SetupNativeScript(ctx, WaitForAorBPress);
return TRUE;
@@ -1198,9 +1275,10 @@ bool8 ScrCmd_waitbutton(struct ScriptContext *ctx)
bool8 ScrCmd_yesnobox(struct ScriptContext *ctx)
{
- u8 v1 = ScriptReadByte(ctx);
- u8 v2 = ScriptReadByte(ctx);
- if (yes_no_box(v1, v2) == 1)
+ u8 left = ScriptReadByte(ctx);
+ u8 top = ScriptReadByte(ctx);
+
+ if (ScriptMenu_YesNo(left, top) == TRUE)
{
ScriptContext1_Stop();
return TRUE;
@@ -1213,11 +1291,12 @@ bool8 ScrCmd_yesnobox(struct ScriptContext *ctx)
bool8 ScrCmd_multichoice(struct ScriptContext *ctx)
{
- u8 v1 = ScriptReadByte(ctx);
- u8 v2 = ScriptReadByte(ctx);
- u8 v3 = ScriptReadByte(ctx);
- u8 v4 = ScriptReadByte(ctx);
- if (sub_80B5054(v1, v2, v3, v4) == 1)
+ u8 left = ScriptReadByte(ctx);
+ u8 top = ScriptReadByte(ctx);
+ u8 multichoiceId = ScriptReadByte(ctx);
+ u8 ignoreBPress = ScriptReadByte(ctx);
+
+ if (ScriptMenu_Multichoice(left, top, multichoiceId, ignoreBPress) == TRUE)
{
ScriptContext1_Stop();
return TRUE;
@@ -1228,14 +1307,15 @@ bool8 ScrCmd_multichoice(struct ScriptContext *ctx)
}
}
-bool8 ScrCmd_multichoicedef(struct ScriptContext *ctx)
+bool8 ScrCmd_multichoicedefault(struct ScriptContext *ctx)
{
- u8 v1 = ScriptReadByte(ctx);
- u8 v2 = ScriptReadByte(ctx);
- u8 v3 = ScriptReadByte(ctx);
- u8 v4 = ScriptReadByte(ctx);
- u8 v5 = ScriptReadByte(ctx);
- if (sub_80B50B0(v1, v2, v3, v5, v4) == 1)
+ 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();
return TRUE;
@@ -1246,24 +1326,26 @@ bool8 ScrCmd_multichoicedef(struct ScriptContext *ctx)
}
}
-bool8 ScrCmd_showbox(struct ScriptContext *ctx)
+bool8 ScrCmd_drawbox(struct ScriptContext *ctx)
{
- u8 v1 = ScriptReadByte(ctx);
- u8 v2 = ScriptReadByte(ctx);
- u8 v3 = ScriptReadByte(ctx);
- u8 v4 = ScriptReadByte(ctx);
- MenuDrawTextWindow(v1, v2, v3, v4);
+ 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 v1 = ScriptReadByte(ctx);
- u8 v2 = ScriptReadByte(ctx);
- u8 v3 = ScriptReadByte(ctx);
- u8 v4 = ScriptReadByte(ctx);
- u8 v5 = ScriptReadByte(ctx);
- if (sub_80B5578(v1, v2, v3, v5, v4) == 1)
+ 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();
return TRUE;
@@ -1274,23 +1356,26 @@ bool8 ScrCmd_multichoicerow(struct ScriptContext *ctx)
}
}
-bool8 ScrCmd_hidebox(struct ScriptContext *ctx)
+bool8 ScrCmd_erasebox(struct ScriptContext *ctx)
{
- u8 v1 = ScriptReadByte(ctx);
- u8 v2 = ScriptReadByte(ctx);
- u8 v3 = ScriptReadByte(ctx);
- u8 v4 = ScriptReadByte(ctx);
- MenuZeroFillWindowRect(v1, v2, v3, v4);
+ u8 left = ScriptReadByte(ctx);
+ u8 top = ScriptReadByte(ctx);
+ u8 right = ScriptReadByte(ctx);
+ u8 bottom = ScriptReadByte(ctx);
+
+ MenuZeroFillWindowRect(left, top, right, bottom);
return FALSE;
}
-bool8 ScrCmd_clearbox(struct ScriptContext *ctx)
+// unused
+bool8 ScrCmd_drawboxtext(struct ScriptContext *ctx)
{
- u8 v1 = ScriptReadByte(ctx);
- u8 v2 = ScriptReadByte(ctx);
- u8 v3 = ScriptReadByte(ctx);
- u8 v4 = ScriptReadByte(ctx);
- if (Multichoice(v1, v2, v3, v4) == 1)
+ 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();
return TRUE;
@@ -1301,28 +1386,30 @@ bool8 ScrCmd_clearbox(struct ScriptContext *ctx)
}
}
-bool8 ScrCmd_showpokepic(struct ScriptContext *ctx)
+bool8 ScrCmd_drawmonpic(struct ScriptContext *ctx)
{
- u16 v1 = VarGet(ScriptReadHalfword(ctx));
- u8 v2 = ScriptReadByte(ctx);
- u8 v3 = ScriptReadByte(ctx);
- sub_80B58C4(v1, v2, v3);
+ 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_erasemonpic(struct ScriptContext *ctx)
{
- void *func = picbox_close();
- if (!func)
- return FALSE;
+ bool8 (*func)(void) = ScriptMenu_GetPicboxWaitFunc();
+ if (func == NULL)
+ return FALSE;
SetupNativeScript(ctx, func);
return TRUE;
}
-bool8 ScrCmd_showcontestwinner(struct ScriptContext *ctx)
+bool8 ScrCmd_drawcontestwinner(struct ScriptContext *ctx)
{
u8 v1 = ScriptReadByte(ctx);
+
if (v1)
sub_8106630(v1);
ShowContestWinner();
@@ -1330,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];
@@ -1345,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_bufferspeciesname(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_bufferleadmonspeciesname(struct ScriptContext *ctx)
{
u8 stringVarIndex = ScriptReadByte(ctx);
+
u8 *dest = sScriptStringVars[stringVarIndex];
u8 partyIndex = GetLeadMonIndex();
u32 species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES, NULL);
@@ -1370,60 +1461,67 @@ bool8 ScrCmd_bufferfirstpoke(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_bufferpartypoke(struct ScriptContext *ctx)
+bool8 ScrCmd_bufferpartymonnick(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_bufferitemname(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_bufferdecorationname(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_buffermovename(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_buffernumberstring(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_bufferstdstring(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_bufferstring(struct ScriptContext *ctx)
{
u8 stringVarIndex = ScriptReadByte(ctx);
u8 *text = (u8 *)ScriptReadWord(ctx);
+
StringCopy(sScriptStringVars[stringVarIndex], text);
return FALSE;
}
@@ -1431,54 +1529,60 @@ bool8 ScrCmd_buffertext(struct ScriptContext *ctx)
bool8 ScrCmd_vloadptr(struct ScriptContext *ctx)
{
u8 *ptr = (u8 *)(ScriptReadWord(ctx) - gUnknown_0202E8B0);
+
StringExpandPlaceholders(gStringVar4, ptr);
return FALSE;
}
-bool8 ScrCmd_vbuffer(struct ScriptContext *ctx)
+bool8 ScrCmd_vbufferstring(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_givemon(struct ScriptContext *ctx)
{
- u16 v3 = VarGet(ScriptReadHalfword(ctx));
- u8 v5 = ScriptReadByte(ctx);
- u16 v7 = VarGet(ScriptReadHalfword(ctx));
- u32 v8 = ScriptReadWord(ctx);
- u32 v9 = ScriptReadWord(ctx);
- u8 v10 = ScriptReadByte(ctx);
- gScriptResult = ScriptGiveMon(v3, v5, v7, v8, v9, v10);
+ u16 species = VarGet(ScriptReadHalfword(ctx));
+ u8 level = ScriptReadByte(ctx);
+ u16 item = VarGet(ScriptReadHalfword(ctx));
+ u32 unkParam1 = ScriptReadWord(ctx);
+ u32 unkParam2 = ScriptReadWord(ctx);
+ u8 unkParam3 = ScriptReadByte(ctx);
+
+ gSpecialVar_Result = ScriptGiveMon(species, level, item, unkParam1, unkParam2, unkParam3);
return FALSE;
}
bool8 ScrCmd_giveegg(struct ScriptContext *ctx)
{
- u16 value = VarGet(ScriptReadHalfword(ctx));
- gScriptResult = ScriptGiveEgg(value);
+ u16 species = VarGet(ScriptReadHalfword(ctx));
+
+ gSpecialVar_Result = ScriptGiveEgg(species);
return FALSE;
}
-bool8 ScrCmd_setpokemove(struct ScriptContext *ctx)
+bool8 ScrCmd_setmonmove(struct ScriptContext *ctx)
{
- u8 v2 = ScriptReadByte(ctx);
- u8 v3 = ScriptReadByte(ctx);
- u16 v4 = ScriptReadHalfword(ctx);
- ScriptSetMonMoveSlot(v2, v4, v3);
+ 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_checkpartymove(struct ScriptContext *ctx)
{
u8 i;
u16 moveId = ScriptReadHalfword(ctx);
- gScriptResult = 6;
- for (i = 0; i < 6; i++)
+
+ gSpecialVar_Result = 6;
+ for (i = 0; i < PARTY_SIZE; i++)
{
u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL);
if (!species)
@@ -1486,7 +1590,7 @@ bool8 ScrCmd_checkattack(struct ScriptContext *ctx)
// UB: GetMonData() arguments don't match function definition
if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) && pokemon_has_move(&gPlayerParty[i], moveId) == TRUE)
{
- gScriptResult = i;
+ gSpecialVar_Result = i;
gSpecialVar_0x8004 = species;
break;
}
@@ -1498,17 +1602,19 @@ bool8 ScrCmd_givemoney(struct ScriptContext *ctx)
{
u32 amount = ScriptReadWord(ctx);
u8 ignore = ScriptReadByte(ctx);
+
if (!ignore)
- sub_80B79B8(&gSaveBlock1.money, amount);
+ 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)
- sub_80B79E0(&gSaveBlock1.money, amount);
+ RemoveMoney(&gSaveBlock1.money, amount);
return FALSE;
}
@@ -1516,120 +1622,131 @@ bool8 ScrCmd_checkmoney(struct ScriptContext *ctx)
{
u32 amount = ScriptReadWord(ctx);
u8 ignore = ScriptReadByte(ctx);
+
if (!ignore)
- gScriptResult = IsEnoughMoney(gSaveBlock1.money, amount);
+ gSpecialVar_Result = IsEnoughMoney(gSaveBlock1.money, amount);
return FALSE;
}
-bool8 ScrCmd_showmoney(struct ScriptContext *ctx)
+bool8 ScrCmd_showmoneybox(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)
- sub_80B7C14(gSaveBlock1.money, v2, v3);
+ OpenMoneyWindow(gSaveBlock1.money, x, y);
return FALSE;
}
-bool8 ScrCmd_hidemoney(struct ScriptContext *ctx)
+bool8 ScrCmd_hidemoneybox(struct ScriptContext *ctx)
{
- u8 v2 = ScriptReadByte(ctx);
- u8 v3 = ScriptReadByte(ctx);
- RemoveMoneyLabelObject(v2, v3);
+ 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)
- sub_80B7BEC(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;
}
bool8 ScrCmd_trainerbattle(struct ScriptContext *ctx)
{
- ctx->scriptPtr = TrainerBattleConfigure(ctx->scriptPtr);
+ ctx->scriptPtr = BattleSetup_ConfigureTrainerBattle(ctx->scriptPtr);
return FALSE;
}
-bool8 ScrCmd_reptrainerbattle(struct ScriptContext *ctx)
+bool8 ScrCmd_trainerbattlebegin(struct ScriptContext *ctx)
{
- sub_80825E4();
+ BattleSetup_StartTrainerBattle();
return TRUE;
}
-bool8 ScrCmd_endtrainerbattle(struct ScriptContext *ctx)
+bool8 ScrCmd_gotopostbattlescript(struct ScriptContext *ctx)
{
- ctx->scriptPtr = sub_80826E8();
+ ctx->scriptPtr = BattleSetup_GetScriptAddrAfterBattle();
return FALSE;
}
-bool8 ScrCmd_endtrainerbattle2(struct ScriptContext *ctx)
+bool8 ScrCmd_gotobeatenscript(struct ScriptContext *ctx)
{
- ctx->scriptPtr = sub_8082700();
+ ctx->scriptPtr = BattleSetup_GetTrainerPostBattleScript();
return FALSE;
}
bool8 ScrCmd_checktrainerflag(struct ScriptContext *ctx)
{
u16 index = VarGet(ScriptReadHalfword(ctx));
- ctx->comparisonResult = trainer_flag_check(index);
+
+ 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);
+
+ SetTrainerFlag(index);
return FALSE;
}
-bool8 ScrCmd_settrainerflag(struct ScriptContext *ctx)
+bool8 ScrCmd_cleartrainerflag(struct ScriptContext *ctx)
{
u16 index = VarGet(ScriptReadHalfword(ctx));
- trainer_flag_clear(index);
+
+ ClearTrainerFlag(index);
return FALSE;
}
bool8 ScrCmd_setwildbattle(struct ScriptContext *ctx)
{
- u16 v2 = ScriptReadHalfword(ctx);
- u8 v4 = ScriptReadByte(ctx);
- u16 v5 = ScriptReadHalfword(ctx);
- ScriptWildBattle(v2, v4, v5);
+ u16 species = ScriptReadHalfword(ctx);
+ u8 level = ScriptReadByte(ctx);
+ u16 item = ScriptReadHalfword(ctx);
+
+ CreateScriptedWildMon(species, level, item);
return FALSE;
}
bool8 ScrCmd_dowildbattle(struct ScriptContext *ctx)
{
- StartBattle_ScriptedWild();
+ BattleSetup_StartScriptedWildBattle();
ScriptContext1_Stop();
return TRUE;
}
@@ -1637,55 +1754,61 @@ bool8 ScrCmd_dowildbattle(struct ScriptContext *ctx)
bool8 ScrCmd_pokemart(struct ScriptContext *ctx)
{
void *ptr = (void *)ScriptReadWord(ctx);
+
CreatePokemartMenu(ptr);
ScriptContext1_Stop();
return TRUE;
}
-bool8 ScrCmd_pokemartdecor(struct ScriptContext *ctx)
+bool8 ScrCmd_pokemartdecoration(struct ScriptContext *ctx)
{
void *ptr = (void *)ScriptReadWord(ctx);
+
CreateDecorationShop1Menu(ptr);
ScriptContext1_Stop();
return TRUE;
}
-bool8 ScrCmd_pokemartbp(struct ScriptContext *ctx)
+bool8 ScrCmd_pokemartdecoration2(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_setberrytree(struct ScriptContext *ctx)
{
- u8 v2 = ScriptReadByte(ctx);
- u8 v3 = ScriptReadByte(ctx);
- u8 v4 = ScriptReadByte(ctx);
- if (!v3)
- PlantBerryTree(v2, 0, v4, FALSE);
+ u8 treeId = ScriptReadByte(ctx);
+ u8 berry = ScriptReadByte(ctx);
+ u8 growthStage = ScriptReadByte(ctx);
+
+ if (berry == 0)
+ PlantBerryTree(treeId, 0, growthStage, FALSE);
else
- PlantBerryTree(v2, v3, v4, FALSE);
+ PlantBerryTree(treeId, berry, growthStage, FALSE);
return FALSE;
}
-bool8 ScrCmd_event_96(struct ScriptContext *ctx)
+bool8 ScrCmd_getpricereduction(struct ScriptContext *ctx)
{
u16 value = VarGet(ScriptReadHalfword(ctx));
- gScriptResult = GetPriceReduction(value);
+
+ gSpecialVar_Result = GetPriceReduction(value);
return FALSE;
}
-bool8 ScrCmd_choosecontestpkmn(struct ScriptContext *ctx)
+bool8 ScrCmd_choosecontestmon(struct ScriptContext *ctx)
{
sub_80F99CC();
ScriptContext1_Stop();
@@ -1708,98 +1831,105 @@ bool8 ScrCmd_showcontestresults(struct ScriptContext *ctx)
bool8 ScrCmd_contestlinktransfer(struct ScriptContext *ctx)
{
- sub_80C4980(gScriptContestCategory);
+ sub_80C4980(gSpecialVar_ContestCategory);
ScriptContext1_Stop();
return TRUE;
}
-bool8 ScrCmd_doanimation(struct ScriptContext *ctx)
+bool8 ScrCmd_dofieldeffect(struct ScriptContext *ctx)
{
u16 effectId = VarGet(ScriptReadHalfword(ctx));
- gUnknown_0202E8BC = effectId;
- FieldEffectStart(gUnknown_0202E8BC);
+
+ sFieldEffectScriptId = effectId;
+ FieldEffectStart(sFieldEffectScriptId);
return FALSE;
}
-bool8 ScrCmd_setanimation(struct ScriptContext *ctx)
+bool8 ScrCmd_setfieldeffectargument(struct ScriptContext *ctx)
{
- u8 v2 = ScriptReadByte(ctx);
- gUnknown_0202FF84[v2] = (s16)VarGet(ScriptReadHalfword(ctx));
+ u8 argNum = ScriptReadByte(ctx);
+
+ gFieldEffectArguments[argNum] = (s16)VarGet(ScriptReadHalfword(ctx));
return FALSE;
}
static bool8 sub_8067B48()
{
- if (!FieldEffectActiveListContains(gUnknown_0202E8BC))
+ if (!FieldEffectActiveListContains(sFieldEffectScriptId))
return TRUE;
else
return FALSE;
}
-bool8 ScrCmd_checkanimation(struct ScriptContext *ctx)
+bool8 ScrCmd_waitfieldeffect(struct ScriptContext *ctx)
{
- gUnknown_0202E8BC = VarGet(ScriptReadHalfword(ctx));
+ sFieldEffectScriptId = VarGet(ScriptReadHalfword(ctx));
SetupNativeScript(ctx, sub_8067B48);
return TRUE;
}
-bool8 ScrCmd_sethealplace(struct ScriptContext *ctx)
+bool8 ScrCmd_setrespawn(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;
+ gSpecialVar_Result = gSaveBlock2.playerGender;
return FALSE;
}
-bool8 ScrCmd_pokecry(struct ScriptContext *ctx)
+bool8 ScrCmd_playmoncry(struct ScriptContext *ctx)
{
- u16 v3 = VarGet(ScriptReadHalfword(ctx));
- u16 v5 = VarGet(ScriptReadHalfword(ctx));
- PlayCry5(v3, v5);
+ u16 species = VarGet(ScriptReadHalfword(ctx));
+ u16 mode = VarGet(ScriptReadHalfword(ctx));
+
+ PlayCry5(species, mode);
return FALSE;
}
-bool8 ScrCmd_waitpokecry(struct ScriptContext *ctx)
+bool8 ScrCmd_waitmoncry(struct ScriptContext *ctx)
{
SetupNativeScript(ctx, IsCryFinished);
return TRUE;
}
-bool8 ScrCmd_setmaptile(struct ScriptContext *ctx)
+bool8 ScrCmd_setmetatile(struct ScriptContext *ctx)
{
- u16 v3 = VarGet(ScriptReadHalfword(ctx));
- u16 v5 = VarGet(ScriptReadHalfword(ctx));
- u16 v7 = VarGet(ScriptReadHalfword(ctx));
+ u16 x = VarGet(ScriptReadHalfword(ctx));
+ u16 y = VarGet(ScriptReadHalfword(ctx));
+ u16 metatileId = VarGet(ScriptReadHalfword(ctx));
u16 v8 = VarGet(ScriptReadHalfword(ctx));
- v3 += 7;
- v5 += 7;
+
+ x += 7;
+ y += 7;
if (!v8)
- MapGridSetMetatileIdAt(v3, v5, v7);
+ MapGridSetMetatileIdAt(x, y, metatileId);
else
- MapGridSetMetatileIdAt(v3, v5, v7 | 0xC00);
+ MapGridSetMetatileIdAt(x, y, metatileId | 0xC00);
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(sub_8058790(x, y));
+ PlaySE(GetDoorSoundEffect(x, y));
FieldAnimateDoorOpen(x, y);
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);
@@ -1814,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();
@@ -1867,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;
+ gSpecialVar_Result = 0;
else
- gScriptResult = 1;
-
+ gSpecialVar_Result = 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;
+ gSpecialVar_Result = 0;
else
- gScriptResult = 1;
-
+ gSpecialVar_Result = 1;
return FALSE;
}
diff --git a/src/field/script_menu.c b/src/field/script_menu.c
new file mode 100644
index 000000000..9f3ab75cc
--- /dev/null
+++ b/src/field/script_menu.c
@@ -0,0 +1,1178 @@
+#include "global.h"
+#include "script.h"
+#include "script_menu.h"
+#include "event_data.h"
+#include "field_effect.h"
+#include "menu.h"
+#include "palette.h"
+#include "script.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "sprite.h"
+#include "strings.h"
+#include "task.h"
+
+// multichoice lists
+const struct MenuAction MultichoiceList_00[] =
+{
+ {OtherText_Petalburg, NULL},
+ {OtherText_Slateport, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_02[] =
+{
+ {OtherText_Enter, NULL},
+ {OtherText_Info3, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_03[] =
+{
+ {OtherText_WhatsAContest, NULL},
+ {OtherText_TypesOfContest, NULL},
+ {OtherText_Ranks, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_04[] =
+{
+ {OtherText_CoolContest, NULL},
+ {OtherText_BeautyContest, NULL},
+ {OtherText_CuteContest, NULL},
+ {OtherText_SmartContest, NULL},
+ {OtherText_ToughContest, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_06[] =
+{
+ {OtherText_Decoration, NULL},
+ {OtherText_PackUp, NULL},
+ {OtherText_Registry, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_05[] =
+{
+ {OtherText_Decoration, NULL},
+ {OtherText_PackUp, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_07[] =
+{
+ {OtherText_Register, NULL},
+ {OtherText_Registry, NULL},
+ {OtherText_Information, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_12[] =
+{
+ {OtherText_Mach, NULL},
+ {OtherText_Acro, NULL},
+};
+
+const struct MenuAction MultichoiceList_13[] =
+{
+ {OtherText_Poison, NULL},
+ {OtherText_Paralysis, NULL},
+ {OtherText_Sleep, NULL},
+ {OtherText_Burn, NULL},
+ {OtherText_Frozen, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_14[] =
+{
+ {OtherText_Dewford, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_16[] =
+{
+ {OtherText_SawIt, NULL},
+ {OtherText_NotYet, NULL},
+};
+
+const struct MenuAction MultichoiceList_17[] =
+{
+ {OtherText_Yes, NULL},
+ {OtherText_No, NULL},
+ {OtherText_Info3, NULL},
+};
+
+const struct MenuAction MultichoiceList_18[] =
+{
+ {OtherText_SingleBattle, NULL},
+ {OtherText_DoubleBattle, NULL},
+ {OtherText_MultiBattle, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_19[] =
+{
+ {OtherText_Littleroot, NULL},
+ {OtherText_Slateport, NULL},
+ {OtherText_Lilycove, NULL},
+};
+
+const struct MenuAction MultichoiceList_20[] =
+{
+ {OtherText_Yes, NULL},
+ {OtherText_No, NULL},
+ {OtherText_Info3, NULL},
+};
+
+const struct MenuAction MultichoiceList_23[] =
+{
+ {OtherText_MakeAChallenge, NULL},
+ {OtherText_ObtainInformation, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_24[] =
+{
+ {OtherText_Lv50_2, NULL},
+ {OtherText_Lv100_2, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_25[] =
+{
+ {OtherText_Zigzagoon, NULL},
+ {OtherText_Nincada, NULL},
+ {OtherText_Poochyena, NULL},
+};
+
+const struct MenuAction MultichoiceList_26[] =
+{
+ {OtherText_Nincada2, NULL},
+ {OtherText_Lotad, NULL},
+ {OtherText_Roselia, NULL},
+};
+
+const struct MenuAction MultichoiceList_27[] =
+{
+ {OtherText_Shroomish, NULL},
+ {OtherText_Nincada3, NULL},
+ {OtherText_Surskit, NULL},
+};
+
+const struct MenuAction MultichoiceList_28[] =
+{
+ {OtherText_Treecko, NULL},
+ {OtherText_Torchic, NULL},
+ {OtherText_Mudkip, NULL},
+};
+
+const struct MenuAction MultichoiceList_29[] =
+{
+ {OtherText_Seedot, NULL},
+ {OtherText_Shroomish2, NULL},
+ {OtherText_Spinda, NULL},
+};
+
+const struct MenuAction MultichoiceList_30[] =
+{
+ {OtherText_Shroomish3, NULL},
+ {OtherText_Zigzagoon2, NULL},
+ {OtherText_Wurmple, NULL},
+};
+
+const struct MenuAction MultichoiceList_31[] =
+{
+ {OtherText_PokeBall, NULL},
+ {OtherText_SuperPotion, NULL},
+ {OtherText_SamePrice, NULL},
+};
+
+const struct MenuAction MultichoiceList_32[] =
+{
+ {OtherText_Yen135, NULL},
+ {OtherText_Yen155, NULL},
+ {OtherText_Yen175, NULL},
+};
+
+const struct MenuAction MultichoiceList_33[] =
+{
+ {OtherText_CostMore, NULL},
+ {OtherText_CostLess, NULL},
+ {OtherText_SamePrice2, NULL},
+};
+
+const struct MenuAction MultichoiceList_34[] =
+{
+ {OtherText_MaleSymbol, NULL},
+ {OtherText_FemaleSymbol, NULL},
+ {OtherText_Neither, NULL},
+};
+
+const struct MenuAction MultichoiceList_35[] =
+{
+ {OtherText_Males, NULL},
+ {OtherText_Females, NULL},
+ {OtherText_SameNumber, NULL},
+};
+
+const struct MenuAction MultichoiceList_36[] =
+{
+ {OtherText_Male, NULL},
+ {OtherText_Female, NULL},
+ {OtherText_ItDepends, NULL},
+};
+
+const struct MenuAction MultichoiceList_37[] =
+{
+ {OtherText_Six2, NULL},
+ {OtherText_Eight2, NULL},
+ {OtherText_Ten, NULL},
+};
+
+const struct MenuAction MultichoiceList_38[] =
+{
+ {OtherText_One, NULL},
+ {OtherText_Two, NULL},
+ {OtherText_Three, NULL},
+};
+
+const struct MenuAction MultichoiceList_39[] =
+{
+ {OtherText_Six, NULL},
+ {OtherText_Seven, NULL},
+ {OtherText_Eight, NULL},
+};
+
+const struct MenuAction MultichoiceList_42[] =
+{
+ {OtherText_FreshWater, NULL},
+ {OtherText_SodaPop, NULL},
+ {OtherText_Lemonade, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_43[] =
+{
+ {OtherText_HowToRide, NULL},
+ {OtherText_HowToTurn, NULL},
+ {OtherText_SandySlopes, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_44[] =
+{
+ {OtherText_Wheelies, NULL},
+ {OtherText_BunnyHops, NULL},
+ {OtherText_Jumping, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_45[] =
+{
+ {OtherText_Satisfied, NULL},
+ {OtherText_Dissatisfied, NULL},
+};
+
+const struct MenuAction MultichoiceList_46[] =
+{
+ {OtherText_Deepseatooth, NULL},
+ {OtherText_Deepseascale, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_47[] =
+{
+ {OtherText_BlueFlute2, NULL},
+ {OtherText_YellowFlute2, NULL},
+ {OtherText_RedFlute2, NULL},
+ {OtherText_WhiteFlute2, NULL},
+ {OtherText_BlackFlute2, NULL},
+ {OtherText_GlassChair, NULL},
+ {OtherText_GlassDesk, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_48[] =
+{
+ {OtherText_TreeckoDoll, NULL},
+ {OtherText_TorchicDoll, NULL},
+ {OtherText_MudkipDoll, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_55[] =
+{
+ {OtherText_TM32, NULL},
+ {OtherText_TM29, NULL},
+ {OtherText_TM35, NULL},
+ {OtherText_TM24, NULL},
+ {OtherText_TM13, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_49[] =
+{
+ {OtherText_50Coins, NULL},
+ {OtherText_500Coins, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_50[] =
+{
+ {OtherText_Excellent, NULL},
+ {OtherText_NotSoHot, NULL},
+};
+
+const struct MenuAction MultichoiceList_52[] =
+{
+ {OtherText_Lilycove, NULL},
+ {OtherText_BattleTower, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_53[] =
+{
+ {OtherText_Slateport, NULL},
+ {OtherText_Lilycove, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_54[] =
+{
+ {OtherText_Right, NULL},
+ {OtherText_Left, NULL},
+};
+
+const struct MenuAction MultichoiceList_56[] =
+{
+ {OtherText_Slateport, NULL},
+ {OtherText_BattleTower, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_57[] =
+{
+ {OtherText_1F_2, NULL},
+ {OtherText_2F_2, NULL},
+ {OtherText_3F_2, NULL},
+ {OtherText_4F_2, NULL},
+ {OtherText_5F_2, NULL},
+};
+
+const struct MenuAction MultichoiceList_58[] =
+{
+ {OtherText_RedShard, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_59[] =
+{
+ {OtherText_YellowShard, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_60[] =
+{
+ {OtherText_RedShard, NULL},
+ {OtherText_YellowShard, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_61[] =
+{
+ {OtherText_BlueShard, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_62[] =
+{
+ {OtherText_RedShard, NULL},
+ {OtherText_BlueShard, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_63[] =
+{
+ {OtherText_YellowShard, NULL},
+ {OtherText_BlueShard, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_64[] =
+{
+ {OtherText_RedShard, NULL},
+ {OtherText_YellowShard, NULL},
+ {OtherText_BlueShard, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_65[] =
+{
+ {OtherText_GreenShard, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_66[] =
+{
+ {OtherText_RedShard, NULL},
+ {OtherText_GreenShard, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_67[] =
+{
+ {OtherText_YellowShard, NULL},
+ {OtherText_GreenShard, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_68[] =
+{
+ {OtherText_RedShard, NULL},
+ {OtherText_YellowShard, NULL},
+ {OtherText_GreenShard, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_69[] =
+{
+ {OtherText_BlueShard, NULL},
+ {OtherText_GreenShard, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_70[] =
+{
+ {OtherText_RedShard, NULL},
+ {OtherText_BlueShard, NULL},
+ {OtherText_GreenShard, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_71[] =
+{
+ {OtherText_YellowShard, NULL},
+ {OtherText_BlueShard, NULL},
+ {OtherText_GreenShard, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_72[] =
+{
+ {OtherText_RedShard, NULL},
+ {OtherText_YellowShard, NULL},
+ {OtherText_BlueShard, NULL},
+ {OtherText_GreenShard, NULL},
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+const struct MenuAction MultichoiceList_01[] =
+{
+ {gOtherText_CancelNoTerminator, NULL},
+};
+
+struct MultichoiceListStruct
+{
+ const struct MenuAction *list;
+ u8 count;
+};
+
+const struct MultichoiceListStruct gMultichoiceLists[] =
+{
+ {MultichoiceList_00, ARRAY_COUNT(MultichoiceList_00)},
+ {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)},
+ {MultichoiceList_02, ARRAY_COUNT(MultichoiceList_02)},
+ {MultichoiceList_03, ARRAY_COUNT(MultichoiceList_03)},
+ {MultichoiceList_04, ARRAY_COUNT(MultichoiceList_04)},
+ {MultichoiceList_05, ARRAY_COUNT(MultichoiceList_05)},
+ {MultichoiceList_06, ARRAY_COUNT(MultichoiceList_06)},
+ {MultichoiceList_07, ARRAY_COUNT(MultichoiceList_07)},
+ {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)},
+ {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)},
+ {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)},
+ {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)},
+ {MultichoiceList_12, ARRAY_COUNT(MultichoiceList_12)},
+ {MultichoiceList_13, ARRAY_COUNT(MultichoiceList_13)},
+ {MultichoiceList_14, ARRAY_COUNT(MultichoiceList_14)},
+ {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)},
+ {MultichoiceList_16, ARRAY_COUNT(MultichoiceList_16)},
+ {MultichoiceList_17, ARRAY_COUNT(MultichoiceList_17)},
+ {MultichoiceList_18, ARRAY_COUNT(MultichoiceList_18)},
+ {MultichoiceList_19, ARRAY_COUNT(MultichoiceList_19)},
+ {MultichoiceList_20, ARRAY_COUNT(MultichoiceList_20)},
+ {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)},
+ {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)},
+ {MultichoiceList_23, ARRAY_COUNT(MultichoiceList_23)},
+ {MultichoiceList_24, ARRAY_COUNT(MultichoiceList_24)},
+ {MultichoiceList_25, ARRAY_COUNT(MultichoiceList_25)},
+ {MultichoiceList_26, ARRAY_COUNT(MultichoiceList_26)},
+ {MultichoiceList_27, ARRAY_COUNT(MultichoiceList_27)},
+ {MultichoiceList_28, ARRAY_COUNT(MultichoiceList_28)},
+ {MultichoiceList_29, ARRAY_COUNT(MultichoiceList_29)},
+ {MultichoiceList_30, ARRAY_COUNT(MultichoiceList_30)},
+ {MultichoiceList_31, ARRAY_COUNT(MultichoiceList_31)},
+ {MultichoiceList_32, ARRAY_COUNT(MultichoiceList_32)},
+ {MultichoiceList_33, ARRAY_COUNT(MultichoiceList_33)},
+ {MultichoiceList_34, ARRAY_COUNT(MultichoiceList_34)},
+ {MultichoiceList_35, ARRAY_COUNT(MultichoiceList_35)},
+ {MultichoiceList_36, ARRAY_COUNT(MultichoiceList_36)},
+ {MultichoiceList_37, ARRAY_COUNT(MultichoiceList_37)},
+ {MultichoiceList_38, ARRAY_COUNT(MultichoiceList_38)},
+ {MultichoiceList_39, ARRAY_COUNT(MultichoiceList_39)},
+ {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)},
+ {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)},
+ {MultichoiceList_42, ARRAY_COUNT(MultichoiceList_42)},
+ {MultichoiceList_43, ARRAY_COUNT(MultichoiceList_43)},
+ {MultichoiceList_44, ARRAY_COUNT(MultichoiceList_44)},
+ {MultichoiceList_45, ARRAY_COUNT(MultichoiceList_45)},
+ {MultichoiceList_46, ARRAY_COUNT(MultichoiceList_46)},
+ {MultichoiceList_47, ARRAY_COUNT(MultichoiceList_47)},
+ {MultichoiceList_48, ARRAY_COUNT(MultichoiceList_48)},
+ {MultichoiceList_49, ARRAY_COUNT(MultichoiceList_49)},
+ {MultichoiceList_50, ARRAY_COUNT(MultichoiceList_50)},
+ {MultichoiceList_01, ARRAY_COUNT(MultichoiceList_01)},
+ {MultichoiceList_52, ARRAY_COUNT(MultichoiceList_52)},
+ {MultichoiceList_53, ARRAY_COUNT(MultichoiceList_53)},
+ {MultichoiceList_54, ARRAY_COUNT(MultichoiceList_54)},
+ {MultichoiceList_55, ARRAY_COUNT(MultichoiceList_55)},
+ {MultichoiceList_56, ARRAY_COUNT(MultichoiceList_56)},
+ {MultichoiceList_57, ARRAY_COUNT(MultichoiceList_57)},
+ {MultichoiceList_58, ARRAY_COUNT(MultichoiceList_58)},
+ {MultichoiceList_59, ARRAY_COUNT(MultichoiceList_59)},
+ {MultichoiceList_60, ARRAY_COUNT(MultichoiceList_60)},
+ {MultichoiceList_61, ARRAY_COUNT(MultichoiceList_61)},
+ {MultichoiceList_62, ARRAY_COUNT(MultichoiceList_62)},
+ {MultichoiceList_63, ARRAY_COUNT(MultichoiceList_63)},
+ {MultichoiceList_64, ARRAY_COUNT(MultichoiceList_64)},
+ {MultichoiceList_65, ARRAY_COUNT(MultichoiceList_65)},
+ {MultichoiceList_66, ARRAY_COUNT(MultichoiceList_66)},
+ {MultichoiceList_67, ARRAY_COUNT(MultichoiceList_67)},
+ {MultichoiceList_68, ARRAY_COUNT(MultichoiceList_68)},
+ {MultichoiceList_69, ARRAY_COUNT(MultichoiceList_69)},
+ {MultichoiceList_70, ARRAY_COUNT(MultichoiceList_70)},
+ {MultichoiceList_71, ARRAY_COUNT(MultichoiceList_71)},
+ {MultichoiceList_72, ARRAY_COUNT(MultichoiceList_72)},
+};
+
+const u8 *const gUnknown_083CE048[] =
+{
+ OtherText_Cool2,
+ OtherText_Beauty3,
+ OtherText_Cute2,
+ OtherText_Smart2,
+ OtherText_Tough2,
+ OtherText_Normal,
+ OtherText_Super,
+ OtherText_Hyper,
+ OtherText_Master,
+ OtherText_Cool3,
+ OtherText_Beauty4,
+ OtherText_Cute3,
+ OtherText_Smart3,
+ OtherText_Tough3,
+ OtherText_Items,
+ OtherText_KeyItems,
+ OtherText_Balls,
+ OtherText_TMsHMs,
+ OtherText_Berries,
+};
+
+extern u8 gPCText_WhichPCShouldBeAccessed[];
+
+extern u16 gSpecialVar_Result;
+
+static void Task_HandleMultichoiceInput(u8);
+static void Task_HandleYesNoInput(u8);
+static void Task_HandleMultichoiceGridInput(u8);
+static u16 GetStringWidthInTilesForScriptMenu(const u8 *str);
+static void DrawMultichoiceMenu(u8, u8, u8, const struct MenuAction *list, u8, u8);
+static void StartScriptMenuTask(u8, u8, u8, u8, u8, u8);
+static void sub_80B53B4(u8, u8, u8, const struct MenuAction *list, u8);
+static bool8 IsPicboxClosed(void);
+
+bool8 ScriptMenu_Multichoice(u8 left, u8 top, u8 multichoiceId, u8 ignoreBPress)
+{
+ if (FuncIsActiveTask(Task_HandleMultichoiceInput) == TRUE)
+ {
+ return FALSE;
+ }
+ else
+ {
+ gSpecialVar_Result = 0xFF;
+ DrawMultichoiceMenu(left, top, gMultichoiceLists[multichoiceId].count, gMultichoiceLists[multichoiceId].list, ignoreBPress, 0);
+ return TRUE;
+ }
+}
+
+bool8 ScriptMenu_MultichoiceWithDefault(u8 left, u8 top, u8 multichoiceId, u8 ignoreBPress, u8 defaultChoice)
+{
+ if (FuncIsActiveTask(Task_HandleMultichoiceInput) == TRUE)
+ {
+ return FALSE;
+ }
+ else
+ {
+ gSpecialVar_Result = 0xFF;
+ DrawMultichoiceMenu(left, top, gMultichoiceLists[multichoiceId].count, gMultichoiceLists[multichoiceId].list, ignoreBPress, defaultChoice);
+ return TRUE;
+ }
+}
+
+static u16 GetStringWidthInTilesForScriptMenu(const u8 *str)
+{
+ // each tile on screen is 8x8, so it needs the number of tiles and not pixels, hence the division by 8.
+ return (GetStringWidthGivenWindowConfig((struct WindowConfig *)&gWindowConfig_81E6CE4, str) + 7) / 8;
+}
+
+static void DrawMultichoiceMenu(u8 left, u8 top, u8 count, const struct MenuAction *list, u8 ignoreBPress, u8 cursorPos)
+{
+ u16 width = GetStringWidthInTilesForScriptMenu(list[0].text);
+ u16 newWidth;
+ u8 i;
+ u8 right;
+ u8 bottom;
+
+ for (i = 1; i < count; i++)
+ {
+ newWidth = GetStringWidthInTilesForScriptMenu(list[i].text);
+ if (width < newWidth)
+ width = newWidth;
+ }
+
+ right = width;
+ right = (right + left) + 1;
+
+ if (right > 29)
+ {
+ left = left + (29 - right);
+ right = 29;
+ }
+
+ bottom = top + (2 * count + 1);
+
+ MenuDrawTextWindow(left, top, right, bottom);
+ PrintMenuItems(left + 1, top + 1, count, list);
+ InitMenu(0, left + 1, top + 1, count, cursorPos, right - left - 1);
+ StartScriptMenuTask(left, top, right, bottom, ignoreBPress, count);
+}
+
+#define tLeft data[0]
+#define tTop data[1]
+#define tRight data[2]
+#define tBottom data[3]
+#define tIgnoreBPress data[4]
+#define tDoWrap data[5]
+
+static void StartScriptMenuTask(u8 left, u8 top, u8 right, u8 bottom, u8 ignoreBPress, u8 count)
+{
+ u8 taskId = CreateTask(Task_HandleMultichoiceInput, 80);
+
+ gTasks[taskId].tLeft = left;
+ gTasks[taskId].tTop = top;
+ gTasks[taskId].tRight = right;
+ gTasks[taskId].tBottom = bottom;
+ gTasks[taskId].tIgnoreBPress = ignoreBPress;
+
+ if (count > 3)
+ gTasks[taskId].tDoWrap = TRUE;
+ else
+ gTasks[taskId].tDoWrap = FALSE;
+}
+
+static void Task_HandleMultichoiceInput(u8 taskId)
+{
+ s8 selection;
+
+ if (!gPaletteFade.active)
+ {
+ if (!gTasks[taskId].tDoWrap)
+ selection = ProcessMenuInputNoWrap();
+ else
+ selection = ProcessMenuInput();
+
+ if (selection != -2)
+ {
+ if (selection == -1)
+ {
+ if (gTasks[taskId].tIgnoreBPress)
+ return;
+ PlaySE(SE_SELECT);
+ gSpecialVar_Result = 127;
+ }
+ else
+ {
+ gSpecialVar_Result = selection;
+ }
+ HandleDestroyMenuCursors();
+ MenuZeroFillWindowRect(gTasks[taskId].tLeft, gTasks[taskId].tTop, gTasks[taskId].tRight, gTasks[taskId].tBottom);
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+ }
+ }
+}
+
+bool8 Multichoice(u8 left, u8 top, u8 multichoiceId, u8 ignoreBPress)
+{
+ if (FuncIsActiveTask(Task_HandleMultichoiceInput) == TRUE)
+ {
+ return FALSE;
+ }
+ else
+ {
+ gSpecialVar_Result = 0xFF;
+ sub_80B53B4(left, top, gMultichoiceLists[multichoiceId].count, gMultichoiceLists[multichoiceId].list, ignoreBPress);
+ return TRUE;
+ }
+}
+
+static void sub_80B53B4(u8 left, u8 top, u8 count, const struct MenuAction *list, u8 ignoreBPress)
+{
+ u16 width = GetStringWidthInTilesForScriptMenu(list[0].text);
+ u16 newWidth;
+ u8 i;
+ u8 right;
+ u8 bottom;
+
+ for (i = 1; i < count; i++)
+ {
+ newWidth = GetStringWidthInTilesForScriptMenu(list[i].text);
+ if (width < newWidth)
+ width = newWidth;
+ }
+
+ right = width;
+ right = (right + left) + 2;
+ bottom = top + (2 * count + 1);
+
+ PrintMenuItems(left, top, count, list);
+ InitMenu(0, left, top, count, 0, right - left - 1);
+ StartScriptMenuTask(left, top, right, bottom, ignoreBPress, count);
+}
+
+bool8 ScriptMenu_YesNo(u8 left, u8 top)
+{
+ u8 taskId;
+
+ if (FuncIsActiveTask(Task_HandleYesNoInput) == TRUE)
+ {
+ return FALSE;
+ }
+ else
+ {
+ gSpecialVar_Result = 0xFF;
+ DisplayYesNoMenu(left, top, 1);
+ taskId = CreateTask(Task_HandleYesNoInput, 0x50);
+ gTasks[taskId].tLeft = left;
+ gTasks[taskId].tTop = top;
+ return TRUE;
+ }
+}
+
+// unused
+bool8 IsScriptActive(void)
+{
+ if (gSpecialVar_Result == 0xFF)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+static void Task_HandleYesNoInput(u8 taskId)
+{
+ u8 left, top;
+
+ if (gTasks[taskId].tRight < 5)
+ {
+ gTasks[taskId].tRight++;
+ return;
+ }
+
+ switch (ProcessMenuInputNoWrap())
+ {
+ case -2:
+ return;
+ case -1:
+ case 1:
+ PlaySE(SE_SELECT);
+ gSpecialVar_Result = 0;
+ break;
+ case 0:
+ gSpecialVar_Result = 1;
+ break;
+ }
+
+ left = gTasks[taskId].tLeft;
+ top = gTasks[taskId].tTop;
+
+ MenuZeroFillWindowRect(left, top, left + 6, top + 5);
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+}
+
+bool8 ScriptMenu_MultichoiceGrid(u8 left, u8 top, u8 multichoiceId, u8 ignoreBPress, u8 columnCount)
+{
+ u8 bottom = 0;
+
+ if (FuncIsActiveTask(Task_HandleMultichoiceGridInput) == TRUE)
+ {
+ return FALSE;
+ }
+ else
+ {
+ u8 taskId;
+ u8 width;
+
+ gSpecialVar_Result = 0xFF;
+
+ sub_807274C(left, top, gMultichoiceLists[multichoiceId].count, 0, gMultichoiceLists[multichoiceId].list, columnCount, 0);
+
+ taskId = CreateTask(Task_HandleMultichoiceGridInput, 80);
+
+ if (!((gMultichoiceLists[multichoiceId].count >> 1) < columnCount || (gMultichoiceLists[multichoiceId].count & 1))
+ || columnCount == 1 || gMultichoiceLists[multichoiceId].count == columnCount)
+ {
+ bottom = (2 * (gMultichoiceLists[multichoiceId].count / columnCount)) + 1 + top;
+ }
+ else
+ {
+ bottom = (2 * (gMultichoiceLists[multichoiceId].count / columnCount)) + 3 + top;
+ }
+
+ width = sub_807288C(columnCount);
+ gTasks[taskId].tLeft = left;
+ gTasks[taskId].tTop = top;
+ gTasks[taskId].tRight = width + left + 2;
+ gTasks[taskId].tBottom = bottom;
+ gTasks[taskId].tIgnoreBPress = ignoreBPress;
+ return TRUE;
+ }
+}
+
+static void Task_HandleMultichoiceGridInput(u8 taskId)
+{
+ s8 selection = sub_80727CC();
+
+ if (selection != -2)
+ {
+ if (selection == -1)
+ {
+ if (gTasks[taskId].tIgnoreBPress)
+ return;
+ PlaySE(SE_SELECT);
+ gSpecialVar_Result = 127;
+ }
+ else
+ {
+ gSpecialVar_Result = selection;
+ }
+ HandleDestroyMenuCursors();
+ MenuZeroFillWindowRect(gTasks[taskId].tLeft, gTasks[taskId].tTop, gTasks[taskId].tRight, gTasks[taskId].tBottom);
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+ }
+}
+
+#undef tLeft
+#undef tTop
+#undef tRight
+#undef tBottom
+#undef tIgnoreBPress
+#undef tDoWrap
+
+bool8 ScrSpecial_CreatePCMenu(void)
+{
+ if (FuncIsActiveTask(Task_HandleMultichoiceInput) == TRUE)
+ {
+ return FALSE;
+ }
+ else
+ {
+ gSpecialVar_Result = 0xFF;
+ ScriptMenu_CreatePCMenu();
+ return TRUE;
+ }
+}
+
+#if ENGLISH
+void ScriptMenu_CreatePCMenu(void)
+{
+ u16 playersPCWidth = GetStringWidthInTilesForScriptMenu(gPCText_PlayersPC);
+ u8 width;
+ u8 numChoices;
+
+ if (playersPCWidth > GetStringWidthInTilesForScriptMenu(gPCText_SomeonesPC))
+ width = playersPCWidth;
+ else
+ width = 8;
+
+ if (FlagGet(FLAG_SYS_GAME_CLEAR)) // player has cleared game?
+ {
+ numChoices = 4;
+ MenuDrawTextWindow(0, 0, width + 2, 9);
+ MenuPrint(gPCText_HallOfFame, 1, 5);
+ MenuPrint(gPCText_LogOff, 1, 7);
+ }
+ else
+ {
+ numChoices = 3;
+ MenuDrawTextWindow(0, 0, width + 2, 7);
+ MenuPrint(gPCText_LogOff, 1, 5);
+ }
+
+ if (FlagGet(FLAG_SYS_PC_LANETTE)) // player met lanette?
+ MenuPrint(gPCText_LanettesPC, 1, 1);
+ else
+ MenuPrint(gPCText_SomeonesPC, 1, 1);
+
+ MenuPrint(gPCText_PlayersPC, 1, 3);
+ InitMenu(0, 1, 1, numChoices, 0, width + 1);
+ StartScriptMenuTask(0, 0, width + 2, 2 * numChoices + 1, 0, numChoices);
+}
+#elif GERMAN
+__attribute__((naked))
+void ScriptMenu_CreatePCMenu(void) {
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ sub sp, 0x18\n\
+ ldr r0, _080B5748 @ =0x0000084b\n\
+ bl FlagGet\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _080B5750\n\
+ ldr r0, _080B574C @ =gPCText_LanettesPC\n\
+ b _080B5752\n\
+ .align 2, 0\n\
+_080B5748: .4byte 0x0000084b\n\
+_080B574C: .4byte gPCText_LanettesPC\n\
+_080B5750:\n\
+ ldr r0, _080B57E8 @ =gPCText_SomeonesPC\n\
+_080B5752:\n\
+ bl GetStringWidthInTilesForScriptMenu\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ str r0, [sp, 0x8]\n\
+ movs r4, 0x1\n\
+ ldr r0, _080B57EC @ =gPCText_PlayersPC\n\
+ bl GetStringWidthInTilesForScriptMenu\n\
+ lsls r1, r4, 2\n\
+ add r1, sp\n\
+ adds r1, 0x8\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ str r0, [r1]\n\
+ ldr r0, _080B57F0 @ =gPCText_LogOff\n\
+ bl GetStringWidthInTilesForScriptMenu\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ str r0, [sp, 0x10]\n\
+ movs r4, 0x3\n\
+ ldr r0, _080B57F4 @ =0x00000804\n\
+ bl FlagGet\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _080B5798\n\
+ ldr r0, _080B57F8 @ =gPCText_HallOfFame\n\
+ bl GetStringWidthInTilesForScriptMenu\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ str r0, [sp, 0x14]\n\
+ movs r4, 0x4\n\
+_080B5798:\n\
+ movs r5, 0\n\
+ cmp r5, r4\n\
+ bge _080B57B4\n\
+ add r2, sp, 0x8\n\
+ adds r1, r4, 0\n\
+_080B57A2:\n\
+ ldr r0, [r2]\n\
+ cmp r5, r0\n\
+ bge _080B57AC\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+_080B57AC:\n\
+ adds r2, 0x4\n\
+ subs r1, 0x1\n\
+ cmp r1, 0\n\
+ bne _080B57A2\n\
+_080B57B4:\n\
+ ldr r0, _080B57F4 @ =0x00000804\n\
+ bl FlagGet\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _080B57FC\n\
+ movs r7, 0x4\n\
+ adds r4, r5, 0x2\n\
+ lsls r2, r4, 24\n\
+ lsrs r2, 24\n\
+ movs r0, 0\n\
+ movs r1, 0\n\
+ movs r3, 0x9\n\
+ bl MenuDrawTextWindow\n\
+ ldr r0, _080B57F8 @ =gPCText_HallOfFame\n\
+ movs r1, 0x1\n\
+ movs r2, 0x5\n\
+ bl MenuPrint\n\
+ ldr r0, _080B57F0 @ =gPCText_LogOff\n\
+ movs r1, 0x1\n\
+ movs r2, 0x7\n\
+ bl MenuPrint\n\
+ b _080B5818\n\
+ .align 2, 0\n\
+_080B57E8: .4byte gPCText_SomeonesPC\n\
+_080B57EC: .4byte gPCText_PlayersPC\n\
+_080B57F0: .4byte gPCText_LogOff\n\
+_080B57F4: .4byte 0x00000804\n\
+_080B57F8: .4byte gPCText_HallOfFame\n\
+_080B57FC:\n\
+ movs r7, 0x3\n\
+ adds r4, r5, 0x2\n\
+ lsls r2, r4, 24\n\
+ lsrs r2, 24\n\
+ movs r0, 0\n\
+ movs r1, 0\n\
+ movs r3, 0x7\n\
+ bl MenuDrawTextWindow\n\
+ ldr r0, _080B5834 @ =gPCText_LogOff\n\
+ movs r1, 0x1\n\
+ movs r2, 0x5\n\
+ bl MenuPrint\n\
+_080B5818:\n\
+ adds r6, r4, 0\n\
+ ldr r0, _080B5838 @ =0x0000084b\n\
+ bl FlagGet\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _080B5840\n\
+ ldr r0, _080B583C @ =gPCText_LanettesPC\n\
+ movs r1, 0x1\n\
+ movs r2, 0x1\n\
+ bl MenuPrint\n\
+ b _080B584A\n\
+ .align 2, 0\n\
+_080B5834: .4byte gPCText_LogOff\n\
+_080B5838: .4byte 0x0000084b\n\
+_080B583C: .4byte gPCText_LanettesPC\n\
+_080B5840:\n\
+ ldr r0, _080B5888 @ =gPCText_SomeonesPC\n\
+ movs r1, 0x1\n\
+ movs r2, 0x1\n\
+ bl MenuPrint\n\
+_080B584A:\n\
+ ldr r0, _080B588C @ =gPCText_PlayersPC\n\
+ movs r1, 0x1\n\
+ movs r2, 0x3\n\
+ bl MenuPrint\n\
+ movs r4, 0\n\
+ str r4, [sp]\n\
+ adds r0, r5, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ str r0, [sp, 0x4]\n\
+ movs r0, 0\n\
+ movs r1, 0x1\n\
+ movs r2, 0x1\n\
+ adds r3, r7, 0\n\
+ bl InitMenu\n\
+ lsls r2, r6, 24\n\
+ lsrs r2, 24\n\
+ lsls r3, r7, 1\n\
+ adds r3, 0x1\n\
+ str r4, [sp]\n\
+ str r7, [sp, 0x4]\n\
+ movs r0, 0\n\
+ movs r1, 0\n\
+ bl StartScriptMenuTask\n\
+ add sp, 0x18\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080B5888: .4byte gPCText_SomeonesPC\n\
+_080B588C: .4byte gPCText_PlayersPC\n\
+ .syntax divided\n");
+}
+#endif
+
+void ScriptMenu_DisplayPCStartupPrompt(void)
+{
+ MenuDisplayMessageBox();
+ MenuPrint(gPCText_WhichPCShouldBeAccessed, 2, 15);
+}
+
+#define tState data[0]
+#define tMonSpecies data[1]
+#define tMonSpriteId data[2]
+#define tWindowX data[3]
+#define tWindowY data[4]
+
+static void Task_PokemonPicWindow(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->tState)
+ {
+ case 0:
+ task->tState++;
+ break;
+ case 1:
+ break;
+ case 2:
+ FreeResourcesAndDestroySprite(&gSprites[task->tMonSpriteId]);
+ task->tState++;
+ break;
+ case 3:
+ MenuZeroFillWindowRect(task->tWindowX, task->tWindowY, task->tWindowX + 9, task->tWindowY + 10);
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+bool8 ScriptMenu_ShowPokemonPic(u16 species, u8 x, u8 y)
+{
+ u8 taskId;
+ u8 spriteId;
+
+ if (FindTaskIdByFunc(Task_PokemonPicWindow) != 0xFF)
+ {
+ return FALSE;
+ }
+ else
+ {
+ MenuDrawTextWindow(x, y, x + 9, y + 10);
+ taskId = CreateTask(Task_PokemonPicWindow, 0x50);
+ gTasks[taskId].tState = 0;
+ gTasks[taskId].tMonSpecies = species;
+ spriteId = CreateMonSprite_PicBox(species, x * 8 + 40, y * 8 + 40, 0);
+ gTasks[taskId].tMonSpriteId = spriteId;
+ gTasks[taskId].tWindowX = x;
+ gTasks[taskId].tWindowY = y;
+ gSprites[spriteId].callback = SpriteCallbackDummy;
+ gSprites[spriteId].oam.priority = 0;
+ return TRUE;
+ }
+}
+
+bool8 (*ScriptMenu_GetPicboxWaitFunc(void))(void)
+{
+ u8 taskId = FindTaskIdByFunc(Task_PokemonPicWindow);
+
+ if (taskId == 0xFF)
+ return NULL;
+ gTasks[taskId].tState++;
+ return IsPicboxClosed;
+}
+
+static bool8 IsPicboxClosed(void)
+{
+ if (FindTaskIdByFunc(Task_PokemonPicWindow) == 0xFF)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+#undef tState
+#undef tMonSpecies
+#undef tMonSpriteId
+#undef tWindowX
+#undef tWindowY
diff --git a/src/script_movement.c b/src/field/script_movement.c
index e25b60a3c..c7ce55171 100644
--- a/src/script_movement.c
+++ b/src/field/script_movement.c
@@ -5,41 +5,41 @@
#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_80A2408(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 exec_movement(u8 a, u8 b, u8 c, u8 *d)
+bool8 ScriptMovement_StartObjectMovementScript(u8 localId, u8 mapNum, u8 mapGroup, const u8 *movementScript)
{
u8 mapObjId;
- if (TryGetFieldObjectIdByLocalIdAndMap(a, b, c, &mapObjId))
+ if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjId))
return TRUE;
if (!FuncIsActiveTask(Task_80A244C))
sub_80A2198(50);
- return sub_80A21F4(sub_80A21E0(), mapObjId, d);
+ return sub_80A21F4(sub_80A21E0(), mapObjId, movementScript);
}
-bool8 sub_80A212C(u8 a, u8 b, u8 c)
+bool8 ScriptMovement_IsObjectMovementFinished(u8 localId, u8 mapNum, u8 mapBank)
{
u8 mapObjId;
u8 r4;
u8 r1;
- if (TryGetFieldObjectIdByLocalIdAndMap(a, b, c, &mapObjId))
- return 1;
+ if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapBank, &mapObjId))
+ return TRUE;
r4 = sub_80A21E0();
r1 = sub_80A2260(r4, mapObjId);
if (r1 == 16)
- return 1;
+ return TRUE;
return sub_80A2370(r4, r1);
}
@@ -50,7 +50,7 @@ void sub_80A2178(void)
taskId = sub_80A21E0();
if (taskId != 0xFF)
{
- sub_80A2408(taskId);
+ UnfreezeObjects(taskId);
DestroyTask(taskId);
}
}
@@ -70,27 +70,31 @@ static u8 sub_80A21E0(void)
return FindTaskIdByFunc(Task_80A244C);
}
-static bool8 sub_80A21F4(u8 taskId, u8 b, u8 *c)
+static bool8 sub_80A21F4(u8 taskId, u8 mapObjId, const u8 *movementScript)
{
u8 r4;
- r4 = sub_80A2260(taskId, b);
+ r4 = sub_80A2260(taskId, mapObjId);
if (r4 != 16)
{
if (sub_80A2370(taskId, r4) == 0)
+ {
return TRUE;
+ }
else
{
- sub_80A23C8(taskId, r4, b, c);
+ sub_80A23C8(taskId, r4, mapObjId, movementScript);
return FALSE;
}
}
r4 = sub_80A2260(taskId, 0xFF);
if (r4 == 16)
+ {
return TRUE;
+ }
else
{
- sub_80A23C8(taskId, r4, b, c);
+ sub_80A23C8(taskId, r4, mapObjId, movementScript);
return FALSE;
}
}
@@ -156,33 +160,33 @@ static bool8 sub_80A2370(u8 taskId, u8 b)
return FALSE;
}
-static void npc_obj_offscreen_culling_and_flag_update(u8 a, u8 *b)
+static void npc_obj_offscreen_culling_and_flag_update(u8 a, const u8 *movementScript)
{
- gUnknown_020384F8[a] = b;
+ 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 c, u8 *d)
+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, d);
- sub_80A22D0(taskId, b, c);
+ npc_obj_offscreen_culling_and_flag_update(b, movementScript);
+ sub_80A22D0(taskId, b, mapObjId);
}
-static void sub_80A2408(u8 a)
+static void UnfreezeObjects(u8 taskId)
{
- u8 *ptr;
+ u8 *pMapObjId;
u8 i;
- ptr = (u8 *)&gTasks[a].data[1];
- for (i = 0; i < 16; i++, ptr++)
+ pMapObjId = (u8 *)&gTasks[taskId].data[1];
+ for (i = 0; i < 16; i++, pMapObjId++)
{
- if (*ptr != 0xFF)
- UnfreezeMapObject(&gMapObjects[*ptr]);
+ if (*pMapObjId != 0xFF)
+ UnfreezeMapObject(&gMapObjects[*pMapObjId]);
}
}
@@ -199,23 +203,23 @@ static void Task_80A244C(u8 taskId)
}
}
-static void sub_80A2490(u8 taskId, u8 b, u8 c, u8 *d)
+static void sub_80A2490(u8 taskId, u8 b, u8 mapObjId, const u8 *d)
{
u8 var;
- if (FieldObjectIsSpecialAnimActive(&gMapObjects[c])
- && !FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[c]))
+ if (FieldObjectIsSpecialAnimActive(&gMapObjects[mapObjId])
+ && !FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[mapObjId]))
return;
var = *d;
if (var == 0xFE)
{
sub_80A2348(taskId, b);
- FreezeMapObject(&gMapObjects[c]);
+ FreezeMapObject(&gMapObjects[mapObjId]);
}
else
{
- if (!FieldObjectSetSpecialAnim(&gMapObjects[c], var))
+ if (!FieldObjectSetSpecialAnim(&gMapObjects[mapObjId], var))
{
d++;
npc_obj_offscreen_culling_and_flag_update(b, d);
diff --git a/src/field/secret_base.c b/src/field/secret_base.c
new file mode 100644
index 000000000..2e4138a3b
--- /dev/null
+++ b/src/field/secret_base.c
@@ -0,0 +1,1708 @@
+#include "global.h"
+#include "constants/decorations.h"
+#include "secret_base.h"
+#include "decoration.h"
+#include "constants/species.h"
+#include "constants/items.h"
+#include "constants/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 "fldeff_decoration.h"
+#include "link.h"
+#include "main.h"
+#include "sound.h"
+#include "constants/songs.h"
+#include "constants/maps.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 "constants/species.h"
+#include "string_util.h"
+#include "strings.h"
+#include "task.h"
+#include "text.h"
+#include "constants/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 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_NUM(SECRET_BASE_RED_CAVE1), 0, 1, 3,
+ MAP_NUM(SECRET_BASE_RED_CAVE2), 0, 5, 9,
+ MAP_NUM(SECRET_BASE_RED_CAVE3), 0, 1, 3,
+ MAP_NUM(SECRET_BASE_RED_CAVE4), 0, 7, 13,
+ MAP_NUM(SECRET_BASE_BROWN_CAVE1), 0, 2, 3,
+ MAP_NUM(SECRET_BASE_BROWN_CAVE2), 0, 9, 2,
+ MAP_NUM(SECRET_BASE_BROWN_CAVE3), 0, 13, 4,
+ MAP_NUM(SECRET_BASE_BROWN_CAVE4), 0, 1, 2,
+ MAP_NUM(SECRET_BASE_BLUE_CAVE1), 0, 1, 3,
+ MAP_NUM(SECRET_BASE_BLUE_CAVE2), 0, 1, 2,
+ MAP_NUM(SECRET_BASE_BLUE_CAVE3), 0, 3, 15,
+ MAP_NUM(SECRET_BASE_BLUE_CAVE4), 0, 3, 14,
+ MAP_NUM(SECRET_BASE_YELLOW_CAVE1), 0, 9, 3,
+ MAP_NUM(SECRET_BASE_YELLOW_CAVE2), 0, 8, 7,
+ MAP_NUM(SECRET_BASE_YELLOW_CAVE3), 0, 3, 6,
+ MAP_NUM(SECRET_BASE_YELLOW_CAVE4), 0, 5, 9,
+ MAP_NUM(SECRET_BASE_TREE1), 0, 2, 3,
+ MAP_NUM(SECRET_BASE_TREE2), 0, 5, 6,
+ MAP_NUM(SECRET_BASE_TREE3), 0, 15, 3,
+ MAP_NUM(SECRET_BASE_TREE4), 0, 4, 10,
+ MAP_NUM(SECRET_BASE_SHRUB1), 0, 3, 3,
+ MAP_NUM(SECRET_BASE_SHRUB2), 0, 1, 2,
+ MAP_NUM(SECRET_BASE_SHRUB3), 0, 7, 8,
+ MAP_NUM(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;
+ gSpecialVar_Result = 0;
+ for (i = 0; i < MAX_SECRET_BASES; i++) {
+ if (gUnknown_020387DC != gSaveBlock1.secretBases[i].secretBaseId)
+ continue;
+ gSpecialVar_Result = 1;
+ VarSet(VAR_CURRENT_SECRET_BASE, i);
+ break;
+ }
+}
+
+void sub_80BB63C(void) // 80bb63c
+{
+ if (gSaveBlock1.secretBases[0].secretBaseId)
+ gSpecialVar_Result = 1;
+ else
+ gSpecialVar_Result = 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_CURRENT_SECRET_BASE, 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_CURRENT_SECRET_BASE);
+ 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_NUM(SECRET_BASE_SHRUB4))
+ return TRUE;
+ return FALSE;
+}
+
+void sub_80BBCCC(u8 flagIn)
+{
+ u16 curBaseId;
+ u16 x, y;
+ if (CurrentMapIsSecretBase()) {
+ curBaseId = VarGet(VAR_CURRENT_SECRET_BASE);
+ 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_CURRENT_SECRET_BASE);
+ 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) {
+ gSpecialVar_Result = gMapHeader.events->mapObjects[objid].graphicsId + VAR_0x3F20;
+ VarSet(gSpecialVar_Result, gDecorations[roomdecor[decidx]].tiles[0]);
+ gSpecialVar_Result = gMapHeader.events->mapObjects[objid].localId;
+ FlagClear(gSpecialVar_0x8004 + 0xAE);
+ show_sprite(gSpecialVar_Result, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup);
+ sub_805C0F8(gSpecialVar_Result, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, gSpecialVar_0x8006, gSpecialVar_0x8007);
+ sub_805C78C(gSpecialVar_Result, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup);
+ gSpecialVar_0x8004 ++;
+ }
+ }
+ }
+ }
+}
+
+void sub_80BBFA4(void)
+{
+ int curBase = VarGet(VAR_CURRENT_SECRET_BASE);
+ VarSet(VAR_OBJ_GFX_ID_F, 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 (gSpecialVar_Result == 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)
+ gSpecialVar_Result = 1;
+ else
+ gSpecialVar_Result = 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_CURRENT_SECRET_BASE)].secretBaseId;
+ return sub_80BC190(dest, VarGet(VAR_CURRENT_SECRET_BASE));
+}
+
+void BufferSecretBaseOwnerName(void) {
+ u8 *var0 = gSaveBlock1.secretBases[(u8)VarGet(VAR_CURRENT_SECRET_BASE)].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 MoveSecretBase(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)
+ {
+ gSpecialVar_Result = 1;
+ }
+ else if (sub_80BC538() > 9)
+ {
+ gSpecialVar_Result = 2;
+ }
+ else
+ {
+ gSpecialVar_Result = 0;
+ }
+}
+
+void sub_80BC5BC(void)
+{
+ gSaveBlock1.secretBases[sub_80BC14C(gUnknown_020387DC)].sbr_field_1_6 ^= 1;
+ FlagSet(FLAG_DECORATION_16);
+}
+
+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_CURRENT_SECRET_BASE);
+
+ 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 *GetSecretBaseTrainerLoseText(void)
+{
+ u8 param = sub_80BCCA4(VarGet(VAR_CURRENT_SECRET_BASE));
+ 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_CURRENT_SECRET_BASE);
+ sub_810FB10(1);
+
+ CreateSecretBaseEnemyParty(&gSaveBlock1.secretBases[curBaseIndex]);
+}
+
+void sub_80BCE4C()
+{
+ gSaveBlock1.secretBases[VarGet(VAR_CURRENT_SECRET_BASE)].sbr_field_1_5 = gSpecialVar_Result;
+}
+
+void sub_80BCE90()
+{
+ u16 curBaseIndex = VarGet(VAR_CURRENT_SECRET_BASE);
+
+ if (!FlagGet(FLAG_DAILY_UNKNOWN_8C2))
+ {
+ u8 i;
+
+ for (i = 0; i < MAX_SECRET_BASES; i++)
+ {
+ gSaveBlock1.secretBases[i].sbr_field_1_5 = 0;
+ }
+
+ FlagSet(FLAG_DAILY_UNKNOWN_8C2);
+ }
+
+ gSpecialVar_0x8004 = sub_80BCCA4(curBaseIndex);
+ gSpecialVar_Result = 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(FLAG_RECEIVED_SECRET_POWER))
+ {
+ 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 6a88f1394..23d668fc7 100644
--- a/src/shop.c
+++ b/src/field/shop.c
@@ -21,18 +21,15 @@
#include "fieldmap.h"
#include "item.h"
#include "decoration.h"
-#include "items.h"
-#include "songs.h"
-#include "rom4.h"
+#include "constants/items.h"
+#include "constants/songs.h"
+#include "overworld.h"
#include "decoration_inventory.h"
#include "field_camera.h"
-
-#define ewram18000 ((u16 *)(ewram + 0x18000))
-#define ewram18300 ((u16 *)(ewram + 0x18300))
+#include "ewram.h"
extern bool8 sub_80A52C4(u8, u8);
-extern u8 ewram[];
extern u8 gBuyMenuFrame_Gfx[];
extern u16 gBuyMenuFrame_Tilemap[];
extern u16 gMenuMoneyPal[16];
@@ -54,13 +51,13 @@ static struct MartInfo gMartInfo;
// ewram
EWRAM_DATA u32 gMartTotalCost = 0;
-EWRAM_DATA s16 gUnknown_020386A4[16][4] = {0}; // game freak barely uses 2d arrays wtf?
+EWRAM_DATA s16 gUnknown_020386A4[16][4] = {0};
EWRAM_DATA struct ItemSlot gUnknown_02038724[3] = {0}; // tv.c uses this, so it cant be static
EWRAM_DATA u8 gUnknown_02038730 = 0;
EWRAM_DATA u8 gUnknown_02038731 = 0;
// rodata
-static const struct MenuAction2 gUnknown_083CC6D0[] =
+static const struct MenuAction2 sBuySellQuitMenuActions[] =
{
{ MartText_Buy, sub_80B2EFC },
{ MartText_Sell, sub_80B2F30 },
@@ -88,13 +85,13 @@ u8 CreateShopMenu(u8 martType)
{
gMartInfo.numChoices = 2;
MenuDrawTextWindow(0, 0, 10, 7);
- PrintMenuItemsReordered(1, 1, 3, (struct MenuAction *)gUnknown_083CC6D0, (u8 *)gUnknown_083CC6E8);
+ PrintMenuItemsReordered(1, 1, 3, sBuySellQuitMenuActions, gUnknown_083CC6E8);
}
else
{
gMartInfo.numChoices = 1;
MenuDrawTextWindow(0, 0, 10, 5);
- PrintMenuItemsReordered(1, 1, 2, (struct MenuAction *)gUnknown_083CC6D0, (u8 *)gUnknown_083CC6EB);
+ PrintMenuItemsReordered(1, 1, 2, sBuySellQuitMenuActions, gUnknown_083CC6EB);
}
InitMenu(0, 1, 1, gMartInfo.numChoices + 1, 0, 9); // add 1 for cancel
@@ -145,11 +142,11 @@ void sub_80B2E38(u8 var)
PlaySE(SE_SELECT);
if (gMartInfo.martType == MART_TYPE_0)
{
- gUnknown_083CC6D0[gUnknown_083CC6E8[gMartInfo.cursor]].func(local);
+ sBuySellQuitMenuActions[gUnknown_083CC6E8[gMartInfo.cursor]].func(local);
}
else
{
- gUnknown_083CC6D0[gUnknown_083CC6EB[gMartInfo.cursor]].func(local);
+ sBuySellQuitMenuActions[gUnknown_083CC6EB[gMartInfo.cursor]].func(local);
}
}
else if (gMain.newKeys & B_BUTTON)
@@ -282,7 +279,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, ewram18000_2);
LoadCompressedPalette(gMenuMoneyPal, 0xC0, sizeof(gMenuMoneyPal));
FreeAllSpritePalettes();
ResetPaletteFade();
@@ -294,7 +291,7 @@ void BuyMenuDrawGraphics(void)
gMartInfo.cursor = zero;
gMartInfo.choicesAbove = zero2;
MenuZeroFillWindowRect(0, 0, 0x20, 0x20);
- sub_80B7C14(gSaveBlock1.money, 0, 0);
+ OpenMoneyWindow(gSaveBlock1.money, 0, 0);
sub_80B3764(0, 7);
sub_80B37EC();
sub_80B3270();
@@ -530,7 +527,7 @@ void sub_80B37F8(u8 taskId)
u16 itemId = gMartInfo.itemList[itemListIndex];
u32 price = (ItemId_GetPrice(itemId) >> GetPriceReduction(1));
- sub_80B7A94(gTasks[taskId].data[1] * price, 6, 6, 11);
+ PrintMoneyAmount(gTasks[taskId].data[1] * price, 6, 6, 11);
gStringVar1[0] = EXT_CTRL_CODE_BEGIN;
gStringVar1[1] = 0x14;
gStringVar1[2] = 0x6;
@@ -559,7 +556,7 @@ void sub_80B389C(u16 itemId, u8 var2, bool32 hasControlCode)
if (hasControlCode != FALSE)
stringPtr = &gStringVar1[3];
- sub_80B79F8(stringPtr, (ItemId_GetPrice(itemId) >> GetPriceReduction(1)), 0x4);
+ GetMoneyAmountText(stringPtr, (ItemId_GetPrice(itemId) >> GetPriceReduction(1)), 0x4);
MenuPrint_PixelCoords(&gStringVar1[0], 0xCA, var2 << 3, 1);
}
@@ -588,7 +585,7 @@ void sub_80B3930(u16 itemId, u8 var2, bool32 hasControlCode)
}
else
{
- sub_80B79F8(stringPtr, gDecorations[itemId].price, 0x4);
+ GetMoneyAmountText(stringPtr, gDecorations[itemId].price, 0x4);
MenuPrint_PixelCoords(&gStringVar1[0], 0xCA, var2 << 3, 0x1);
}
}
@@ -648,9 +645,9 @@ void sub_80B3AEC(u8 taskId)
void sub_80B3B80(u8 taskId)
{
IncrementGameStat(0x26);
- sub_80B79E0(&gSaveBlock1.money, gMartTotalCost);
+ RemoveMoney(&gSaveBlock1.money, gMartTotalCost);
PlaySE(SE_REGI);
- sub_80B7BEC(gSaveBlock1.money, 0, 0);
+ UpdateMoneyWindow(gSaveBlock1.money, 0, 0);
gTasks[taskId].func = sub_80B3AEC;
}
@@ -1165,7 +1162,7 @@ void Task_ExitBuyMenu(u8 taskId)
{
if (!gPaletteFade.active)
{
- RemoveMoneyLabelObject(0, 0);
+ CloseMoneyWindow(0, 0);
BuyMenuFreeMemory();
SetMainCallback2(c2_exit_to_overworld_2_switch);
DestroyTask(taskId);
diff --git a/src/field/slot_machine.c b/src/field/slot_machine.c
new file mode 100644
index 000000000..a524790b4
--- /dev/null
+++ b/src/field/slot_machine.c
@@ -0,0 +1,5413 @@
+#include "global.h"
+#include "constants/songs.h"
+#include "strings2.h"
+#include "overworld.h"
+#include "menu_cursor.h"
+#include "field_effect.h"
+#include "random.h"
+#include "sound.h"
+#include "main.h"
+#include "slot_machine.h"
+#include "decompress.h"
+#include "trig.h"
+#include "graphics.h"
+#include "palette.h"
+#include "util.h"
+#include "text.h"
+#include "menu.h"
+#include "ewram.h"
+
+struct UnkStruct1 {
+ /*0x00*/ u8 unk00;
+ /*0x01*/ u8 unk01;
+ /*0x02*/ s16 unk02;
+};
+
+#if ENGLISH
+#define SLOTMACHINE_GFX_TILES 233
+#elif GERMAN
+#define SLOTMACHINE_GFX_TILES 236
+#endif
+
+
+static void CB2_SlotMachineSetup(void);
+static void CB2_SlotMachineLoop(void);
+static void PlaySlotMachine_Internal(u8 arg0, MainCallback cb);
+static void SlotMachineDummyTask(u8 taskId);
+static void SlotMachineSetup_0_0(void);
+static void SlotMachineSetup_6_2(void);
+static void SlotMachineSetup_1_0(void);
+static void SlotMachineSetup_2_0(void);
+static void SlotMachineSetup_2_1(void);
+static void SlotMachineSetup_0_1(void);
+static void SlotMachineSetup_3_0(void);
+static void SlotMachineSetup_4_0(void);
+static void SlotMachineSetup_5_0(void);
+static void SlotMachineSetup_6_0(void);
+static void SlotMachineSetup_6_1(void);
+static void sub_8101D04(void);
+static void sub_8101D24(u8 taskId);
+static bool8 sub_8101D5C(struct Task *task);
+static bool8 sub_8101D8C(struct Task *task);
+static bool8 sub_8101DB0(struct Task *task);
+static bool8 sub_8101DF4(struct Task *task);
+static bool8 sub_8101E10(struct Task *task);
+static bool8 sub_8101E3C(struct Task *task);
+static bool8 sub_8101F44(struct Task *task);
+static bool8 sub_8101F60(struct Task *task);
+static bool8 sub_8101F88(struct Task *task);
+static bool8 sub_8101FA4(struct Task *task);
+static bool8 sub_8102008(struct Task *task);
+static bool8 sub_8102034(struct Task *task);
+static bool8 sub_8102058(struct Task *task);
+static bool8 sub_8102090(struct Task *task);
+static bool8 sub_81020C8(struct Task *task);
+static bool8 sub_81021E0(struct Task *task);
+static bool8 sub_81021FC(struct Task *task);
+static bool8 sub_8102264(struct Task *task);
+static bool8 sub_81022A0(struct Task *task);
+static bool8 sub_81022CC(struct Task *task);
+static bool8 sub_81022F0(struct Task *task);
+static bool8 sub_8102318(struct Task *task);
+static bool8 sub_8102344(struct Task *task);
+static bool8 sub_810239C(struct Task *task);
+static bool8 sub_81023B8(struct Task *task);
+static bool8 sub_81023E0(struct Task *task);
+static bool8 sub_81023FC(struct Task *task);
+static bool8 sub_8102424(struct Task *task);
+static bool8 sub_8102460(struct Task *task);
+static void sub_8102484(void);
+static void sub_81024F0(void);
+static bool8 sub_8102540(void);
+static u8 sub_8102578(void);
+static u16 dp15_jump_random_unknown(void);
+static u8 sub_81025BC(void);
+static void CheckMatch(void);
+static void CheckMatch_CenterRow(void);
+static void CheckMatch_TopAndBottom(void);
+static void CheckMatch_Diagonals(void);
+static u8 GetMatchFromSymbolsInRow(u8 c1, u8 c2, u8 c3);
+static void sub_8102A24(void);
+static void sub_8102A64(u8 taskId);
+static bool8 sub_8102A44(void);
+static bool8 sub_8102A9C(struct Task *task);
+static bool8 sub_8102AD0(struct Task *task);
+static bool8 sub_8102B80(struct Task *task);
+static u8 GetTagOfReelSymbolOnScreenAtPos(u8 x, s16 y);
+static void sub_8102DA8(void);
+static void sub_8102DEC(u8 a0);
+static void sub_8102E1C(u8 a0);
+static bool8 sub_8102E40(u8 a0);
+static void sub_8102E68(u8 taskId);
+static bool8 sub_8102EA0(struct Task *task);
+static bool8 sub_8102EA4(struct Task *task);
+static bool8 sub_8102EC0(struct Task *task);
+static bool8 sub_8102F4C(struct Task *task);
+static bool8 sub_8103008(struct Task *task);
+static bool8 sub_810305C(void);
+static bool8 sub_8103154(u8 a0, u8 a1);
+static bool8 sub_81031B4(u8 a0, u8 a1);
+static bool8 sub_81032C0(void);
+static bool8 sub_81032E8(void);
+static bool8 sub_810333C(void);
+static bool8 sub_81033DC(void);
+static bool8 sub_810341C(u8 a0);
+static bool8 sub_810347C(u8 a0);
+static void sub_81034F4(void);
+static void sub_8103540(void);
+static void sub_8103564(void);
+static void j5_08111E84(void);
+static void sub_8103668(void);
+static void sub_810380C(void);
+static void sub_8103830(void);
+static void sub_8103910(void);
+static void sub_8103A78(void);
+static void sub_8103C14(u8 a0);
+static void sub_8103C48(u8 taskId);
+static void sub_8103D50(u8 a0);
+static void sub_8103C78(struct Task *task, u8 taskId);
+static void sub_8103CAC(struct Task *task, u8 taskId);
+static void sub_8103CC8(struct Task *task, u8 taskId);
+static void sub_8103D8C(u8 a0);
+static void sub_8103DC8(void);
+static void sub_8103E04(u8 a0);
+static bool8 sub_8103E38(void);
+static bool8 sub_8103E7C(void);
+static bool8 sub_8103EAC(u8 spriteId);
+static void sub_8103EE4(struct Sprite *sprite);
+static void sub_8103F70(void);
+static bool8 sub_8103FA0(void);
+static void sub_8103FE8(u8 taskId);
+static void sub_8104048(void);
+static void sub_8104064(u8 pikaPower);
+static bool8 sub_81040C8(void);
+static void sub_81040E8(u8 taskId);
+static void nullsub_68(struct Task *task);
+static void sub_810411C(struct Task *task);
+static void sub_8104144(struct Task *task);
+static void sub_81041AC(struct Task *task);
+static void sub_810421C(struct Task *task);
+static void sub_810423C(u8 pikaPower);
+static void sub_810430C(void);
+static bool8 sub_810432C(void);
+static void sub_810434C(u8 taskId);
+static void sub_810437C(struct Task *task);
+static void sub_81043EC(struct Task *task);
+static void sub_8104468(struct Task *task);
+static void sub_8104498(struct Task *task);
+static void sub_8104548(struct Task *task);
+static void sub_8104598(struct Task *task);
+static void sub_81045CC(struct Task *task);
+static void sub_810463C(struct Task *task);
+static void sub_81046C0(struct Task *task);
+static void sub_8104764(struct Task *task);
+static void sub_8104794(struct Task *task);
+static void sub_81047EC(struct Task *task);
+static void sub_8104860(struct Task *task);
+static void sub_81048A8(struct Task *task);
+static void sub_81048CC(struct Task *task);
+static void sub_8104940(struct Task *task);
+static void sub_81049C8(struct Task *task);
+static void sub_81049F8(struct Task *task);
+static void sub_8104A40(s16 a0, s16 a1);
+static void sub_8104A88(s16 a0);
+static void sub_8104AB8(u8 a0);
+static bool8 sub_8104AEC(void);
+static void sub_8104B0C(u8 taskId);
+static void sub_8104B3C(struct Task *task);
+static void sub_8104B60(struct Task *task);
+static void sub_8104B80(struct Task *task);
+static void sub_8104BC8(struct Task *task);
+static void sub_8104BFC(struct Task *task);
+static void sub_8104C44(struct Task *task);
+static void sub_8104C5C(void);
+static void sub_8104CAC(u8 arg0);
+static bool8 sub_8104E18(void);
+static void nullsub_69(struct Task *task);
+static void sub_8104E74(u8 taskId);
+static void sub_8104EA8(void);
+static void sub_8104F8C(void);
+static void sub_8104FF4(s16 x, s16 y, u8 a2, s16 a3);
+static void sub_81050C4(void);
+static void sub_8105100(void);
+static void sub_810514C(void);
+static void sub_81051C0(void);
+static void sub_8105284(void);
+static void sub_81052EC(void);
+static void sub_81053A0(void);
+static void sub_810545C(void);
+static void sub_81054B8(void);
+static void sub_8105524(void);
+static void sub_8105554(void);
+static void sub_8105578(void);
+static void sub_8105688(s16 a0);
+static void sub_81056C0(void);
+static void sub_81056F0(void);
+static void sub_81057E8(s16 a0);
+static void sub_8105804(void);
+static void sub_8105854(void);
+static void sub_81058A0(void);
+static void sub_81058C4(void);
+static void sub_81059B8(void);
+static void sub_81059E8(void);
+static bool8 sub_8105ACC(void);
+static void sub_8105AEC(void);
+static u8 sub_8105B1C(s16 x, s16 y);
+static void sub_8105B88(u8 spriteId);
+static u8 sub_8105BF8(u8 templateIdx, SpriteCallback callback, s16 x, s16 y, s16 a4);
+static void sub_81063C0(void);
+static void sub_8106404(void);
+static void sub_8106448(void);
+static void sub_81064B8(void);
+static void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4);
+static void sub_81065DC(void);
+
+static const struct UnkStruct1 *const gUnknown_083ED048[];
+static const u16 gPalette_83EDE24[];
+static const u8 gUnknown_083ECD04[][3];
+static const u8 gUnknown_083ECE3A[];
+static const u16 gUnknown_083ECE42[];
+static const u16 gUnknown_083ECE48[];
+
+void PlaySlotMachine(u8 arg0, MainCallback cb)
+{
+ PlaySlotMachine_Internal(arg0, cb);
+ SetMainCallback2(CB2_SlotMachineSetup);
+}
+
+static void CB2_SlotMachineSetup(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ SlotMachineSetup_0_0();
+ SlotMachineSetup_0_1();
+ gMain.state++;
+ break;
+ case 1:
+ SlotMachineSetup_1_0();
+ gMain.state++;
+ break;
+ case 2:
+ SlotMachineSetup_2_0();
+ SlotMachineSetup_2_1();
+ gMain.state++;
+ break;
+ case 3:
+ SlotMachineSetup_3_0();
+ gMain.state++;
+ break;
+ case 4:
+ SlotMachineSetup_4_0();
+ gMain.state++;
+ break;
+ case 5:
+ SlotMachineSetup_5_0();
+ gMain.state++;
+ break;
+ case 6:
+ SlotMachineSetup_6_0();
+ SlotMachineSetup_6_1();
+ SlotMachineSetup_6_2();
+ SetMainCallback2(CB2_SlotMachineLoop);
+ break;
+ }
+}
+
+static void CB2_SlotMachineLoop(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void SlotMachine_VBlankCallback(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ REG_WIN0H = eSlotMachine->win0h;
+ REG_WIN0V = eSlotMachine->win0v;
+ REG_WININ = eSlotMachine->winIn;
+ REG_WINOUT = eSlotMachine->winOut;
+}
+
+static void PlaySlotMachine_Internal(u8 arg0, MainCallback cb)
+{
+ struct Task *task = gTasks + CreateTask(SlotMachineDummyTask, 0xFF);
+ task->data[0] = arg0;
+ StoreWordInTwoHalfwords(task->data + 1, (intptr_t)cb);
+}
+
+static void sub_81019EC(void)
+{
+ struct Task *task = gTasks + FindTaskIdByFunc(SlotMachineDummyTask);
+ eSlotMachine->unk01 = task->data[0];
+ LoadWordFromTwoHalfwords((u16 *)(task->data + 1), (u32 *)&eSlotMachine->prevMainCb);
+}
+
+static void SlotMachineDummyTask(u8 taskId)
+{
+}
+
+static void SlotMachineSetup_0_0(void)
+{
+ SetVBlankCallback(NULL);
+ SetHBlankCallback(NULL);
+ REG_DISPCNT = 0;
+}
+
+static void SlotMachineSetup_6_2(void)
+{
+ u16 imeBak;
+ SetVBlankCallback(SlotMachine_VBlankCallback);
+ imeBak = REG_IME;
+ REG_IME = 0;
+ REG_IE |= INTR_FLAG_VBLANK;
+ REG_IME = imeBak;
+ REG_DISPSTAT |= DISPSTAT_VBLANK_INTR;
+ REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON;
+}
+
+static void SlotMachineSetup_1_0(void)
+{
+ DmaClearLarge16(3, (u16 *)(BG_VRAM), BG_VRAM_SIZE, 0x1000);
+}
+
+static void SlotMachineSetup_2_0(void)
+{
+ DmaClear16(3, (u16 *)OAM, OAM_SIZE);
+}
+
+static void SlotMachineSetup_2_1(void)
+{
+ REG_BG0CNT = 0;
+ REG_BG1CNT = 0;
+ REG_BG2CNT = 0;
+ REG_BG3CNT = 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_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_SCREENBASE(31) | BGCNT_CHARBASE(2);
+ REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(28);
+ REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(29);
+ REG_BG3CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(30);
+ REG_WININ = 0x3f;
+ REG_WINOUT = 0x3f;
+ REG_BLDCNT = BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_OBJ;
+ REG_BLDALPHA = 0x809;
+}
+
+static const s16 gUnknown_083ECCF8[][2];
+
+static void SlotMachineSetup_0_1(void)
+{
+ u8 i;
+
+ sub_81019EC();
+ eSlotMachine->state = 0;
+ eSlotMachine->pikaPower = 0;
+ eSlotMachine->unk03 = Random() & 1;
+ eSlotMachine->unk04 = 0;
+ eSlotMachine->matchedSymbols = 0;
+ eSlotMachine->unk0A = 0;
+ eSlotMachine->unk0B = 0;
+ eSlotMachine->coins = gSaveBlock1.coins;
+ eSlotMachine->payout = 0;
+ eSlotMachine->unk10 = 0;
+ eSlotMachine->bet = 0;
+ eSlotMachine->unk18 = 0;
+ eSlotMachine->unk1A = 8;
+ eSlotMachine->win0h = 0xf0;
+ eSlotMachine->win0v = 0xa0;
+ eSlotMachine->winIn = 0x3f;
+ eSlotMachine->winOut = 0x3f;
+ eSlotMachine->backupMapMusic = GetCurrentMapMusic();
+ for (i = 0; i < 3; i++)
+ {
+ eSlotMachine->unk22[i] = 0;
+ eSlotMachine->reelPositions[i] = gUnknown_083ECCF8[i][eSlotMachine->unk03] % 21;
+ eSlotMachine->unk1C[i] = 0x1f8 - eSlotMachine->reelPositions[i] * 24;
+ eSlotMachine->unk1C[i] %= 0x1f8;
+ }
+}
+
+static void SlotMachineSetup_3_0(void)
+{
+ SetUpWindowConfig(&gWindowConfig_81E7128);
+ InitMenuWindow(&gWindowConfig_81E7128);
+}
+
+static void SlotMachineSetup_4_0(void)
+{
+ ResetPaletteFade();
+ ResetSpriteData();
+ gOamLimit = 128;
+ FreeAllSpritePalettes();
+ ResetTasks();
+}
+
+static void SlotMachineSetup_5_0(void)
+{
+ sub_8106448();
+ sub_81064B8();
+ sub_81063C0();
+}
+
+static void SlotMachineSetup_6_0(void)
+{
+ sub_8104EA8();
+ sub_8104F8C();
+ sub_8103DC8();
+ sub_81050C4();
+}
+
+static void SlotMachineSetup_6_1(void)
+{
+ sub_8104048();
+ sub_8102DA8();
+ sub_8104C5C();
+ sub_8101D04();
+}
+
+static void sub_8101D04(void)
+{
+ sub_8101D24(CreateTask(sub_8101D24, 0));
+}
+
+static bool8 (*const gUnknown_083ECAAC[])(struct Task *task) = {
+ sub_8101D5C,
+ sub_8101D8C,
+ sub_8101DB0,
+ sub_8101DF4,
+ sub_8101E10,
+ sub_8101E3C,
+ sub_8101F44,
+ sub_8101F60,
+ sub_8101F88,
+ sub_8101FA4,
+ sub_8102008,
+ sub_8102034,
+ sub_8102058,
+ sub_8102090,
+ sub_81020C8,
+ sub_81021E0,
+ sub_81021FC,
+ sub_8102264,
+ sub_81022A0,
+ sub_81022CC,
+ sub_81022F0,
+ sub_8102318,
+ sub_8102344,
+ sub_810239C,
+ sub_81023B8,
+ sub_81023E0,
+ sub_81023FC,
+ sub_8102424,
+ sub_8102460
+};
+
+static void sub_8101D24(u8 taskId)
+{
+ while (gUnknown_083ECAAC[eSlotMachine->state](gTasks + taskId));
+}
+
+static bool8 sub_8101D5C(struct Task *task)
+{
+ BeginNormalPaletteFade(-1, 0, 16, 0, 0);
+ sub_810423C(eSlotMachine->pikaPower);
+ eSlotMachine->state++;
+ return FALSE;
+}
+
+static bool8 sub_8101D8C(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ eSlotMachine->state++;
+ }
+ return FALSE;
+}
+
+static bool8 sub_8101DB0(struct Task *task)
+{
+ eSlotMachine->payout = 0;
+ eSlotMachine->bet = 0;
+ eSlotMachine->unk18 = 0;
+ eSlotMachine->unk04 &= 0xc0;
+ eSlotMachine->state = 4;
+ if (eSlotMachine->coins <= 0)
+ {
+ eSlotMachine->state = 25;
+ }
+ else if (eSlotMachine->unk0A)
+ {
+ eSlotMachine->state = 3;
+ sub_8104CAC(4);
+ }
+ return TRUE;
+}
+
+static bool8 sub_8101DF4(struct Task *task)
+{
+ if (sub_8104E18())
+ {
+ eSlotMachine->state = 4;
+ }
+ return FALSE;
+}
+
+static bool8 sub_8101E10(struct Task *task)
+{
+ sub_8104CAC(0);
+ eSlotMachine->state = 5;
+ if (eSlotMachine->coins >= 9999)
+ {
+ eSlotMachine->state = 23;
+ }
+ return TRUE;
+}
+
+static bool8 sub_8101E3C(struct Task *task)
+{
+ s16 i;
+
+ if (gMain.newKeys & SELECT_BUTTON)
+ {
+ sub_8104AB8(0);
+ eSlotMachine->state = 8;
+ }
+ else if (gMain.newKeys & R_BUTTON)
+ {
+ if (eSlotMachine->coins - (3 - eSlotMachine->bet) >= 0)
+ {
+ for (i = eSlotMachine->bet; i < 3; i++)
+ {
+ sub_8103D50(i);
+ }
+ eSlotMachine->coins -= (3 - eSlotMachine->bet);
+ eSlotMachine->bet = 3;
+ eSlotMachine->state = 9;
+ PlaySE(SE_REGI);
+ }
+ else
+ {
+ eSlotMachine->state = 6;
+ }
+ }
+ else
+ {
+ if (gMain.newKeys & DPAD_DOWN && eSlotMachine->coins != 0)
+ {
+ PlaySE(SE_REGI);
+ sub_8103D50(eSlotMachine->bet);
+ eSlotMachine->coins--;
+ eSlotMachine->bet++;
+ }
+ if (eSlotMachine->bet >= 3 || (eSlotMachine->bet != 0 && gMain.newKeys & A_BUTTON))
+ {
+ eSlotMachine->state = 9;
+ }
+ if (gMain.newKeys & B_BUTTON)
+ {
+ eSlotMachine->state = 21;
+ }
+ }
+ return FALSE;
+}
+
+static void sub_8101F2C(const u8 *str)
+{
+ MenuDisplayMessageBox();
+ MenuPrint(str, 2, 15);
+}
+
+static bool8 sub_8101F44(struct Task *task)
+{
+ sub_8101F2C(gOtherText_DontHaveThreeCoins);
+ eSlotMachine->state = 7;
+ return FALSE;
+}
+
+static bool8 sub_8101F60(struct Task *task)
+{
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ MenuZeroFillScreen();
+ eSlotMachine->state = 5;
+ }
+ return FALSE;
+}
+
+static bool8 sub_8101F88(struct Task *task)
+{
+ if (sub_8104AEC())
+ {
+ eSlotMachine->state = 5;
+ }
+ return FALSE;
+}
+
+static bool8 sub_8101FA4(struct Task *task)
+{
+ sub_8102484();
+ sub_8104DA4();
+ sub_8102DEC(0);
+ sub_8102DEC(1);
+ sub_8102DEC(2);
+ task->data[0] = 0;
+ if (eSlotMachine->unk04 & 0x20)
+ {
+ sub_810430C();
+ eSlotMachine->state = 10;
+ }
+ else
+ {
+ sub_8104CAC(1);
+ eSlotMachine->state = 11;
+ }
+ eSlotMachine->unk1A = 8;
+ if (eSlotMachine->unk0A)
+ {
+ eSlotMachine->unk1A = dp15_jump_random_unknown();
+ }
+ return FALSE;
+}
+
+static bool8 sub_8102008(struct Task *task)
+{
+ if (sub_810432C())
+ {
+ sub_8104CAC(1);
+ eSlotMachine->unk04 &= 0xDF;
+ eSlotMachine->state = 11;
+ }
+ return FALSE;
+}
+
+static bool8 sub_8102034(struct Task *task)
+{
+ if (++task->data[0] >= 30)
+ {
+ sub_81024F0();
+ eSlotMachine->state = 12;
+ }
+ return FALSE;
+}
+
+static bool8 sub_8102058(struct Task *task)
+{
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_JYUNI);
+ sub_8102E1C(eSlotMachine->unk18);
+ sub_8103C14(eSlotMachine->unk18);
+ eSlotMachine->state = 13;
+ }
+ return FALSE;
+}
+
+static bool8 sub_8102090(struct Task *task)
+{
+ if (!sub_8102E40(eSlotMachine->unk18))
+ {
+ eSlotMachine->unk18++;
+ eSlotMachine->state = 12;
+ if (eSlotMachine->unk18 > 2)
+ {
+ eSlotMachine->state = 14;
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool8 sub_81020C8(struct Task *task)
+{
+ eSlotMachine->unk04 &= 0xc0;
+ CheckMatch();
+ if (eSlotMachine->unk0A)
+ {
+ eSlotMachine->unk0A--;
+ eSlotMachine->unk0B++;
+ }
+ if (eSlotMachine->matchedSymbols)
+ {
+ eSlotMachine->state = 15;
+ sub_8102A24();
+ sub_8103F70();
+ if ((eSlotMachine->unk10 -= eSlotMachine->payout) < 0)
+ {
+ eSlotMachine->unk10 = 0;
+ }
+ if (eSlotMachine->matchedSymbols & ((1 << SLOT_MACHINE_MATCHED_777_BLUE) | (1 << SLOT_MACHINE_MATCHED_777_RED)))
+ {
+ PlayFanfare(BGM_ME_B_BIG);
+ sub_8104CAC(6);
+ }
+ else if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_777_MIXED))
+ {
+ PlayFanfare(BGM_ME_B_BIG);
+ sub_8104CAC(5);
+ }
+ else
+ {
+ PlayFanfare(BGM_ME_B_SMALL);
+ sub_8104CAC(2);
+ }
+ if (eSlotMachine->matchedSymbols & ((1 << SLOT_MACHINE_MATCHED_777_MIXED) | (1 << SLOT_MACHINE_MATCHED_777_BLUE) | (1 << SLOT_MACHINE_MATCHED_777_RED)))
+ {
+ eSlotMachine->unk04 &= 0x3f;
+ if (eSlotMachine->matchedSymbols & ((1 << SLOT_MACHINE_MATCHED_777_BLUE) | (1 << SLOT_MACHINE_MATCHED_777_RED)))
+ {
+ eSlotMachine->unk0A = 0;
+ eSlotMachine->unk0B = 0;
+ eSlotMachine->unk03 = 0;
+ if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_777_BLUE))
+ {
+ eSlotMachine->unk03 = 1;
+ }
+ }
+ }
+ if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_POWER) && eSlotMachine->pikaPower < 16)
+ {
+ eSlotMachine->pikaPower++;
+ sub_8104064(eSlotMachine->pikaPower);
+ }
+ }
+ else
+ {
+ sub_8104CAC(3);
+ eSlotMachine->state = 20;
+ if ((eSlotMachine->unk10 += eSlotMachine->bet) > 9999)
+ {
+ eSlotMachine->unk10 = 9999;
+ }
+ }
+ return FALSE;
+}
+
+static bool8 sub_81021E0(struct Task *task)
+{
+ if (sub_8102A44())
+ {
+ eSlotMachine->state = 16;
+ }
+ return FALSE;
+}
+
+static bool8 sub_81021FC(struct Task *task)
+{
+ if (sub_8103FA0())
+ {
+ eSlotMachine->state = 19;
+ if (eSlotMachine->matchedSymbols & ((1 << SLOT_MACHINE_MATCHED_777_RED) | (1 << SLOT_MACHINE_MATCHED_777_BLUE)))
+ {
+ IncrementGameStat(GAME_STAT_SLOT_JACKPOTS);
+ }
+ if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_REPLAY))
+ {
+ eSlotMachine->unk18 = 0;
+ eSlotMachine->state = 9;
+ }
+ if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_POWER))
+ {
+ eSlotMachine->state = 17;
+ }
+ if (eSlotMachine->unk0A && eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_REPLAY))
+ {
+ sub_8104CAC(4);
+ eSlotMachine->state = 18;
+ }
+ }
+ return FALSE;
+}
+
+static bool8 sub_8102264(struct Task *task)
+{
+ if (!sub_81040C8())
+ {
+ eSlotMachine->state = 19;
+ if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_REPLAY))
+ {
+ eSlotMachine->state = 9;
+ if (eSlotMachine->unk0A)
+ {
+ sub_8104CAC(4);
+ eSlotMachine->state = 18;
+ }
+ }
+ }
+ return FALSE;
+}
+
+static bool8 sub_81022A0(struct Task *task)
+{
+ if (sub_8104E18())
+ {
+ eSlotMachine->state = 19;
+ if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_REPLAY))
+ {
+ eSlotMachine->state = 9;
+ }
+ }
+ return FALSE;
+}
+
+static bool8 sub_81022CC(struct Task *task)
+{
+ sub_8103D8C(0);
+ sub_8103D8C(1);
+ sub_8103D8C(2);
+ eSlotMachine->state = 2;
+ return FALSE;
+}
+
+static bool8 sub_81022F0(struct Task *task)
+{
+ if (++task->data[1] > 64)
+ {
+ task->data[1] = 0;
+ eSlotMachine->state = 19;
+ }
+ return FALSE;
+}
+
+static bool8 sub_8102318(struct Task *task)
+{
+ sub_8101F2C(gOtherText_QuitGamePrompt);
+ DisplayYesNoMenu(21, 7, 1);
+ sub_814AB84();
+ eSlotMachine->state = 22;
+ return FALSE;
+}
+
+static bool8 sub_8102344(struct Task *task)
+{
+ s8 input = ProcessMenuInputNoWrap_();
+ if (input == 0)
+ {
+ MenuZeroFillScreen();
+ sub_8103D8C(0);
+ sub_8103D8C(1);
+ sub_8103D8C(2);
+ eSlotMachine->coins += eSlotMachine->bet;
+ eSlotMachine->state = 27;
+ }
+ else if (input == 1 || input == -1)
+ {
+ MenuZeroFillScreen();
+ eSlotMachine->state = 5;
+ }
+ return FALSE;
+}
+
+static bool8 sub_810239C(struct Task *task)
+{
+ sub_8101F2C(gOtherText_MaxCoins);
+ eSlotMachine->state = 24;
+ return FALSE;
+}
+
+static bool8 sub_81023B8(struct Task *task)
+{
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ MenuZeroFillScreen();
+ eSlotMachine->state = 5;
+ }
+ return FALSE;
+}
+
+static bool8 sub_81023E0(struct Task *task)
+{
+ sub_8101F2C(gOtherText_OutOfCoins);
+ eSlotMachine->state = 26;
+ return FALSE;
+}
+
+static bool8 sub_81023FC(struct Task *task)
+{
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ MenuZeroFillScreen();
+ eSlotMachine->state = 27;
+ }
+ return FALSE;
+}
+
+static bool8 sub_8102424(struct Task *task)
+{
+ gSaveBlock1.coins = eSlotMachine->coins;
+ BeginNormalPaletteFade(-1, 0, 0, 16, 0);
+ eSlotMachine->state++;
+ return FALSE;
+}
+
+static bool8 sub_8102460(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ SetMainCallback2(eSlotMachine->prevMainCb);
+ }
+ return FALSE;
+}
+
+static void sub_8102484(void)
+{
+ u8 r3;
+
+ if (eSlotMachine->unk0A == 0 && !(eSlotMachine->unk04 & 0xc0))
+ {
+ if (sub_8102540())
+ {
+ r3 = sub_8102578();
+ if (r3 != 3)
+ {
+ eSlotMachine->unk04 |= gUnknown_083ECE42[r3];
+ if (r3 != 1)
+ {
+ return;
+ }
+ }
+ }
+ r3 = sub_81025BC();
+ if (r3 != 5)
+ {
+ eSlotMachine->unk04 |= gUnknown_083ECE48[r3];
+ }
+ }
+}
+
+static void sub_81024F0(void)
+{
+ eSlotMachine->unk06 = 0;
+ if (eSlotMachine->unk04)
+ {
+ eSlotMachine->unk06 = 1;
+ }
+}
+
+static u8 sub_810250C(u8 a0)
+{
+ u8 i;
+
+ for (i = 0; i < 8; i++)
+ {
+ if (a0 & 1)
+ {
+ return gUnknown_083ECE3A[i];
+ }
+ a0 >>= 1;
+ }
+ return 0;
+}
+
+static bool8 sub_8102540(void)
+{
+ u8 rval = Random();
+ if (gUnknown_083ECD04[eSlotMachine->unk01][eSlotMachine->bet - 1] > rval)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static const u8 gUnknown_083ECD16[][6];
+
+static u8 sub_8102578(void)
+{
+ s16 i;
+
+ for (i = 0; i < 3; i++)
+ {
+ s16 rval = Random() & 0xff;
+ s16 value = gUnknown_083ECD16[i][eSlotMachine->unk01];
+ if (value > rval)
+ {
+ break;
+ }
+ }
+ return i;
+}
+
+static const u8 gUnknown_083ECD28[][6];
+
+static u8 sub_81025BC(void)
+{
+ s16 i;
+
+ for (i = 0; i < 5; i++)
+ {
+ s16 rval = Random() & 0xff;
+ s16 r3 = gUnknown_083ECD28[i][eSlotMachine->unk01];
+ if (i == 0 && eSlotMachine->unk03 == 1)
+ {
+ r3 += 10;
+ if (r3 > 0x100)
+ {
+ r3 = 0x100;
+ }
+ }
+ else if (i == 4 && eSlotMachine->unk03 == 1)
+ {
+ r3 -= 10;
+ if (r3 < 0)
+ {
+ r3 = 0;
+ }
+ }
+ if (r3 > rval)
+ {
+ break;
+ }
+ }
+ return i;
+}
+
+static const u8 gUnknown_083ECD46[][17];
+static const u8 gUnknown_083ECDAC[][17];
+
+static u8 sub_810264C(u8 a0)
+{
+ if (eSlotMachine->unk03 == 0)
+ {
+ return gUnknown_083ECD46[a0][eSlotMachine->pikaPower];
+ }
+ return gUnknown_083ECDAC[a0][eSlotMachine->pikaPower];
+}
+
+static void sub_8102680(void)
+{
+ u8 rval;
+ s16 i;
+
+ eSlotMachine->unk05 = 0;
+ rval = Random();
+ if (rval < sub_810264C(0))
+ {
+ return;
+ }
+ for (i = 5; i > 0; i--)
+ {
+ rval = Random();
+ if (rval < sub_810264C(i))
+ {
+ break;
+ }
+ }
+ eSlotMachine->unk05 = i;
+}
+
+static const u16 gUnknown_083ECE12[];
+
+static bool8 sub_81026DC(u16 a0)
+{
+ u16 rval = Random() & 0xff;
+ if (rval < gUnknown_083ECE12[a0])
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static const u16 gUnknown_083ECE1C[][2];
+static const u16 gUnknown_083ECE30[];
+
+static u16 dp15_jump_random_unknown(void)
+{
+ u8 r4 = 0;
+ u8 rval;
+ u8 value;
+ if (eSlotMachine->unk10 >= 300)
+ {
+ r4 = 4;
+ }
+ else if (eSlotMachine->unk10 >= 250)
+ {
+ r4 = 3;
+ }
+ else if (eSlotMachine->unk10 >= 200)
+ {
+ r4 = 2;
+ }
+ else if (eSlotMachine->unk10 >= 150)
+ {
+ r4 = 1;
+ }
+ rval = Random() % 100;
+ value = gUnknown_083ECE1C[r4][0];
+ if (rval < value)
+ {
+ return 4;
+ }
+ rval = Random() % 100;
+ value = gUnknown_083ECE1C[r4][1] + gUnknown_083ECE30[eSlotMachine->unk0B];
+ if (rval < value)
+ {
+ return 2;
+ }
+ return 8;
+}
+
+static void CheckMatch(void)
+{
+ eSlotMachine->matchedSymbols = 0;
+ CheckMatch_CenterRow();
+ if (eSlotMachine->bet > 1)
+ {
+ CheckMatch_TopAndBottom();
+ }
+ if (eSlotMachine->bet > 2)
+ {
+ CheckMatch_Diagonals();
+ }
+}
+
+static const u16 sSlotMatchFlags[];
+static const u16 sSlotPayouts[];
+
+static void CheckMatch_CenterRow(void)
+{
+ u8 c1, c2, c3, match;
+
+ c1 = GetTagOfReelSymbolOnScreenAtPos(0, 2);
+ c2 = GetTagOfReelSymbolOnScreenAtPos(1, 2);
+ c3 = GetTagOfReelSymbolOnScreenAtPos(2, 2);
+ match = GetMatchFromSymbolsInRow(c1, c2, c3);
+ if (match != SLOT_MACHINE_MATCHED_NONE)
+ {
+ eSlotMachine->payout += sSlotPayouts[match];
+ eSlotMachine->matchedSymbols |= sSlotMatchFlags[match];
+ sub_8103E04(0);
+ }
+}
+
+static void CheckMatch_TopAndBottom(void)
+{
+ u8 c1, c2, c3, match;
+
+ c1 = GetTagOfReelSymbolOnScreenAtPos(0, 1);
+ c2 = GetTagOfReelSymbolOnScreenAtPos(1, 1);
+ c3 = GetTagOfReelSymbolOnScreenAtPos(2, 1);
+ match = GetMatchFromSymbolsInRow(c1, c2, c3);
+ if (match != SLOT_MACHINE_MATCHED_NONE)
+ {
+ if (match == SLOT_MACHINE_MATCHED_1CHERRY)
+ {
+ match = SLOT_MACHINE_MATCHED_2CHERRY;
+ }
+ eSlotMachine->payout += sSlotPayouts[match];
+ eSlotMachine->matchedSymbols |= sSlotMatchFlags[match];
+ sub_8103E04(1);
+ }
+ c1 = GetTagOfReelSymbolOnScreenAtPos(0, 3);
+ c2 = GetTagOfReelSymbolOnScreenAtPos(1, 3);
+ c3 = GetTagOfReelSymbolOnScreenAtPos(2, 3);
+ match = GetMatchFromSymbolsInRow(c1, c2, c3);
+ if (match != SLOT_MACHINE_MATCHED_NONE)
+ {
+ if (match == SLOT_MACHINE_MATCHED_1CHERRY)
+ {
+ match = SLOT_MACHINE_MATCHED_2CHERRY;
+ }
+ eSlotMachine->payout += sSlotPayouts[match];
+ eSlotMachine->matchedSymbols |= sSlotMatchFlags[match];
+ sub_8103E04(2);
+ }
+}
+
+static void CheckMatch_Diagonals(void)
+{
+ u8 c1, c2, c3, match;
+
+ c1 = GetTagOfReelSymbolOnScreenAtPos(0, 1);
+ c2 = GetTagOfReelSymbolOnScreenAtPos(1, 2);
+ c3 = GetTagOfReelSymbolOnScreenAtPos(2, 3);
+ match = GetMatchFromSymbolsInRow(c1, c2, c3);
+ if (match != SLOT_MACHINE_MATCHED_NONE)
+ {
+ if (match != SLOT_MACHINE_MATCHED_1CHERRY)
+ {
+ eSlotMachine->payout += sSlotPayouts[match];
+ eSlotMachine->matchedSymbols |= sSlotMatchFlags[match];
+ }
+ sub_8103E04(3);
+ }
+ c1 = GetTagOfReelSymbolOnScreenAtPos(0, 3);
+ c2 = GetTagOfReelSymbolOnScreenAtPos(1, 2);
+ c3 = GetTagOfReelSymbolOnScreenAtPos(2, 1);
+ match = GetMatchFromSymbolsInRow(c1, c2, c3);
+ if (match != SLOT_MACHINE_MATCHED_NONE)
+ {
+ if (match != SLOT_MACHINE_MATCHED_1CHERRY)
+ {
+ eSlotMachine->payout += sSlotPayouts[match];
+ eSlotMachine->matchedSymbols |= sSlotMatchFlags[match];
+ }
+ sub_8103E04(4);
+ }
+}
+
+static const u8 sSym2Match[];
+
+static u8 GetMatchFromSymbolsInRow(u8 c1, u8 c2, u8 c3)
+{
+ if (c1 == c2 && c1 == c3)
+ {
+ return sSym2Match[c1];
+ }
+ if (c1 == SLOT_MACHINE_TAG_7_RED && c2 == SLOT_MACHINE_TAG_7_RED && c3 == SLOT_MACHINE_TAG_7_BLUE)
+ {
+ return SLOT_MACHINE_MATCHED_777_MIXED;
+ }
+ if (c1 == SLOT_MACHINE_TAG_7_BLUE && c2 == SLOT_MACHINE_TAG_7_BLUE && c3 == SLOT_MACHINE_TAG_7_RED)
+ {
+ return SLOT_MACHINE_MATCHED_777_MIXED;
+ }
+ if (c1 == SLOT_MACHINE_TAG_CHERRY)
+ {
+ return SLOT_MACHINE_MATCHED_1CHERRY;
+ }
+ return SLOT_MACHINE_MATCHED_NONE;
+}
+
+static void sub_8102A24(void)
+{
+ sub_8102A64(CreateTask(sub_8102A64, 4));
+}
+
+static bool8 sub_8102A44(void)
+{
+ if (FindTaskIdByFunc(sub_8102A64) == 0xff)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool8 (*const gUnknown_083ECB20[])(struct Task *task) = {
+ sub_8102A9C,
+ sub_8102AD0,
+ sub_8102B80
+};
+
+static void sub_8102A64(u8 taskId)
+{
+ while (gUnknown_083ECB20[gTasks[taskId].data[0]](gTasks + taskId));
+}
+
+static bool8 sub_8102A9C(struct Task *task)
+{
+ if (sub_8103E38())
+ {
+ task->data[0]++;
+ if (eSlotMachine->payout == 0)
+ {
+ task->data[0] = 2;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static bool8 sub_8102AD0(struct Task *task)
+{
+ if (!task->data[1]--)
+ {
+ if (IsFanfareTaskInactive())
+ {
+ PlaySE(SE_PIN);
+ }
+ eSlotMachine->payout--;
+ if (eSlotMachine->coins < 9999)
+ {
+ eSlotMachine->coins++;
+ }
+ task->data[1] = 8;
+ if (gMain.heldKeys & A_BUTTON)
+ {
+ task->data[1] = 4;
+ }
+ }
+ if (IsFanfareTaskInactive() && gMain.newKeys & START_BUTTON)
+ {
+ PlaySE(SE_PIN);
+ eSlotMachine->coins += eSlotMachine->payout;
+ if (eSlotMachine->coins > 9999)
+ {
+ eSlotMachine->coins = 9999;
+ }
+ eSlotMachine->payout = 0;
+ }
+ if (eSlotMachine->payout == 0)
+ {
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+static bool8 sub_8102B80(struct Task *task)
+{
+ if (sub_8103E7C())
+ {
+ DestroyTask(FindTaskIdByFunc(sub_8102A64));
+ }
+ return FALSE;
+}
+
+static const u8 sReelSymbols[][21];
+
+static u8 GetTagOfReelSymbolOnScreenAtPos(u8 x, s16 y)
+{
+ s16 offset = (eSlotMachine->reelPositions[x] + y) % 21;
+ if (offset < 0)
+ {
+ offset += 21;
+ }
+ return sReelSymbols[x][offset];
+}
+
+static u8 GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(u8 x, s16 y)
+{
+ s16 r6 = 0;
+ if ((eSlotMachine->unk1C[x]) % 24)
+ r6 = -1;
+ return GetTagOfReelSymbolOnScreenAtPos(x, y + r6);
+}
+
+static const u8 gUnknown_083ECCF1[];
+
+static u8 sub_8102C48(s16 a0)
+{
+ s16 r1 = (eSlotMachine->unk16 + a0) % 6;
+ if (r1 < 0)
+ r1 += 6;
+ return gUnknown_083ECCF1[r1];
+}
+
+static void sub_8102C84(u8 a0, s16 a1)
+{
+ eSlotMachine->unk1C[a0] += a1;
+ eSlotMachine->unk1C[a0] %= 504;
+ eSlotMachine->reelPositions[a0] = 21 - eSlotMachine->unk1C[a0] / 24;
+}
+
+static s16 sub_8102CCC(u8 a0, s16 a1)
+{
+ s16 r1 = eSlotMachine->unk1C[a0] % 24;
+ if (r1 != 0)
+ {
+ if (r1 < a1)
+ a1 = r1;
+ sub_8102C84(a0, a1);
+ r1 = eSlotMachine->unk1C[a0] % 24;
+ }
+ return r1;
+}
+
+static void sub_8102D28(s16 a0)
+{
+ eSlotMachine->unk14 += a0;
+ eSlotMachine->unk14 %= 120;
+ eSlotMachine->unk16 = 6 - eSlotMachine->unk14 / 20;
+}
+
+static s16 sub_8102D5C(s16 a0)
+{
+ s16 r1 = eSlotMachine->unk14 % 20;
+ if (r1 != 0)
+ {
+ if (r1 < a0)
+ a0 = r1;
+ sub_8102D28(a0);
+ r1 = eSlotMachine->unk14 % 20;
+ }
+ return r1;
+}
+
+static void sub_8102DA8(void)
+{
+ u8 i;
+ for (i = 0; i < 3; i++)
+ {
+ u8 taskId = CreateTask(sub_8102E68, 2);
+ gTasks[taskId].data[15] = i;
+ eSlotMachine->reelTasks[i] = taskId;
+ sub_8102E68(taskId);
+ }
+}
+
+static void sub_8102DEC(u8 a0)
+{
+ gTasks[eSlotMachine->reelTasks[a0]].data[0] = 1;
+ gTasks[eSlotMachine->reelTasks[a0]].data[14] = 1;
+}
+
+static void sub_8102E1C(u8 a0)
+{
+ gTasks[eSlotMachine->reelTasks[a0]].data[0] = 2;
+}
+
+static bool8 sub_8102E40(u8 a0)
+{
+ return gTasks[eSlotMachine->reelTasks[a0]].data[14];
+}
+
+static bool8 (*const gUnknown_083ECB2C[])(struct Task *task) = {
+ sub_8102EA0,
+ sub_8102EA4,
+ sub_8102EC0,
+ sub_8102F4C,
+ sub_8103008
+};
+
+static void sub_8102E68(u8 taskId)
+{
+ while (gUnknown_083ECB2C[gTasks[taskId].data[0]](gTasks + taskId));
+}
+
+static bool8 sub_8102EA0(struct Task *task)
+{
+ return FALSE;
+}
+
+static bool8 sub_8102EA4(struct Task *task)
+{
+ sub_8102C84(task->data[15], eSlotMachine->unk1A);
+ return FALSE;
+}
+
+static bool8 (*const gUnknown_083ECB40[])(void) = {
+ sub_810305C,
+ sub_81032C0,
+ sub_81033DC
+};
+static void (*const gUnknown_083ECB4C[])(void) = {
+ sub_81034F4,
+ sub_8103540,
+ sub_810380C
+};
+
+static bool8 sub_8102EC0(struct Task *task)
+{
+ task->data[0]++;
+ eSlotMachine->unk34[task->data[15]] = 0;
+ eSlotMachine->unk2E[task->data[15]] = 0;
+ if (eSlotMachine->unk0A == 0 && (eSlotMachine->unk04 == 0 || eSlotMachine->unk06 == 0 || !gUnknown_083ECB40[task->data[15]]()))
+ {
+ eSlotMachine->unk06 = 0;
+ gUnknown_083ECB4C[task->data[15]]();
+ }
+ task->data[1] = eSlotMachine->unk2E[task->data[15]];
+ return TRUE;
+}
+
+static bool8 sub_8102F4C(struct Task *task)
+{
+ u16 sp[] = {2, 4, 4, 4, 8};
+ s16 r2 = eSlotMachine->unk1C[task->data[15]] % 24;
+ if (r2 != 0)
+ {
+ r2 = sub_8102CCC(task->data[15], eSlotMachine->unk1A);
+ }
+ else if (eSlotMachine->unk2E[task->data[15]])
+ {
+ eSlotMachine->unk2E[task->data[15]]--;
+ sub_8102C84(task->data[15], eSlotMachine->unk1A);
+ r2 = eSlotMachine->unk1C[task->data[15]] % 24;
+ }
+ if (r2 == 0 && eSlotMachine->unk2E[task->data[15]] == 0)
+ {
+ task->data[0]++;
+ task->data[1] = sp[task->data[1]];
+ task->data[2] = 0;
+ }
+ return FALSE;
+}
+
+static bool8 sub_8103008(struct Task *task)
+{
+ eSlotMachine->unk22[task->data[15]] = task->data[1];
+ task->data[1] = -task->data[1];
+ task->data[2]++;
+ if ((task->data[2] & 0x3) == 0)
+ {
+ task->data[1] >>= 1;
+ }
+ if (task->data[1] == 0)
+ {
+ task->data[0] = 0;
+ task->data[14] = 0;
+ eSlotMachine->unk22[task->data[15]] = 0;
+ }
+ return FALSE;
+}
+
+static bool8 (*const gUnknown_083ECB64[])(u8 a0, u8 a1) = {
+ sub_8103154,
+ sub_81031B4,
+ sub_81031B4
+};
+
+static bool8 sub_810305C(void)
+{
+ u8 r3 = sub_810250C(eSlotMachine->unk04);
+ u8 r5 = r3;
+ if (eSlotMachine->unk04 & 0xc0)
+ {
+ r5 = 0;
+ r3 = 1;
+ }
+ return gUnknown_083ECB64[eSlotMachine->bet - 1](r5, r3);
+}
+
+static bool8 sub_81030A4(s16 y, u8 tag1, u8 tag2)
+{
+ u8 tag = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, y);
+ if (tag == tag1 || tag == tag2)
+ {
+ eSlotMachine->unk07 = tag;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool8 sub_81030E0(s16 y)
+{
+ if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 1 - y) == 4 || GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 2 - y) == 4 || GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 3 - y) == 4)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool8 sub_8103134(void)
+{
+ if (eSlotMachine->unk04 & 0xc2)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool8 sub_8103154(u8 a0, u8 a1)
+{
+ s16 i;
+
+ for (i = 0; i < 5; i++)
+ {
+ if (sub_81030A4(2 - i, a0, a1))
+ {
+ eSlotMachine->unk34[0] = 2;
+ eSlotMachine->unk2E[0] = i;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static bool8 sub_81031B4(u8 tag1, u8 tag2)
+{
+ s16 i;
+ bool8 r6 = sub_8103134();
+ if (r6 || !sub_81030E0(0))
+ {
+ for (i = 1; i < 4; i++)
+ {
+ if (sub_81030A4(i, tag1, tag2))
+ {
+ eSlotMachine->unk34[0] = i;
+ eSlotMachine->unk2E[0] = 0;
+ return TRUE;
+ }
+ }
+ }
+ for (i = 1; i < 5; i++)
+ {
+ bool8 r7 = r6;
+ if (r7 || !sub_81030E0(i))
+ {
+ if (sub_81030A4(1 - i, tag1, tag2))
+ {
+ if (i == 1 && (r7 || !sub_81030E0(3)))
+ {
+ eSlotMachine->unk34[0] = 3;
+ eSlotMachine->unk2E[0] = 3;
+ return TRUE;
+ }
+ if (i < 4 && (r7 || !sub_81030E0(i + 1)))
+ {
+ eSlotMachine->unk34[0] = 2;
+ eSlotMachine->unk2E[0] = i + 1;
+ return TRUE;
+ }
+ eSlotMachine->unk34[0] = 1;
+ eSlotMachine->unk2E[0] = i;
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+static bool8 (*const gUnknown_083ECB70[])(void) = {
+ sub_81032E8,
+ sub_81032E8,
+ sub_810333C
+};
+
+static bool8 sub_81032C0(void)
+{
+ return gUnknown_083ECB70[eSlotMachine->bet - 1]();
+}
+
+static bool8 sub_81032E8(void)
+{
+ s16 i;
+ s16 unk34_0 = eSlotMachine->unk34[0];
+
+ for (i = 0; i < 5; i++)
+ {
+ if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, unk34_0 - i) == eSlotMachine->unk07)
+ {
+ eSlotMachine->unk34[1] = unk34_0;
+ eSlotMachine->unk2E[1] = i;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static bool8 sub_810333C(void)
+{
+ s16 i;
+ if (sub_81032E8())
+ {
+ if (eSlotMachine->unk34[0] != 2 && eSlotMachine->unk2E[1] > 1 && eSlotMachine->unk2E[1] != 4)
+ {
+ for (i = 0; i < 5; i++)
+ {
+ if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - i) == eSlotMachine->unk07)
+ {
+ eSlotMachine->unk34[1] = 2;
+ eSlotMachine->unk2E[1] = i;
+ break;
+ }
+ }
+ }
+ return TRUE;
+ }
+ if (eSlotMachine->unk34[0] != 2)
+ {
+ for (i = 0; i < 5; i++)
+ {
+ if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - i) == eSlotMachine->unk07)
+ {
+ eSlotMachine->unk34[1] = 2;
+ eSlotMachine->unk2E[1] = i;
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+static bool8 (*const gUnknown_083ECB7C[])(u8 a0) = {
+ sub_810341C,
+ sub_810341C,
+ sub_810347C
+};
+
+static bool8 sub_81033DC(void)
+{
+ u8 r3 = eSlotMachine->unk07;
+ if (eSlotMachine->unk04 & 0x40)
+ {
+ r3 = 0;
+ if (eSlotMachine->unk07 == 0)
+ {
+ r3 = 1;
+ }
+ }
+ return gUnknown_083ECB7C[eSlotMachine->bet - 1](r3);
+}
+
+static bool8 sub_810341C(u8 a0)
+{
+ s16 i;
+ s16 unk34_1 = eSlotMachine->unk34[1];
+
+ for (i = 0; i < 5; i++)
+ {
+ if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, unk34_1 - i) == a0)
+ {
+ eSlotMachine->unk34[2] = unk34_1;
+ eSlotMachine->unk2E[2] = i;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static bool8 sub_810347C(u8 a0)
+{
+ s16 i;
+ s16 r8;
+ if (eSlotMachine->unk34[0] == eSlotMachine->unk34[1])
+ {
+ return sub_810341C(a0);
+ }
+ r8 = 1;
+ if (eSlotMachine->unk34[0] == 1)
+ {
+ r8 = 3;
+ }
+ for (i = 0; i < 5; i++)
+ {
+ if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, r8 - i) == a0)
+ {
+ eSlotMachine->unk2E[2] = i;
+ eSlotMachine->unk34[2] = r8;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static void sub_81034F4(void)
+{
+ s16 i;
+ for (i = 0; sub_81030E0(i); i++);
+ eSlotMachine->unk2E[0] = i;
+}
+
+static bool8 sub_8103520(u8 *a0)
+{
+ if (*a0 == 0)
+ {
+ *a0 = 1;
+ return TRUE;
+ }
+ if (*a0 == 1)
+ {
+ *a0 = 0;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void (*const gUnknown_083ECB88[])(void) = {
+ sub_8103564,
+ j5_08111E84,
+ sub_8103668
+};
+
+static void sub_8103540(void)
+{
+ gUnknown_083ECB88[eSlotMachine->bet - 1]();
+}
+
+static void sub_8103564(void)
+{
+ if (eSlotMachine->unk34[0] != 0 && eSlotMachine->unk04 & 0x80)
+ {
+ u8 sp0 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 2 - eSlotMachine->unk2E[0]);
+ if (sub_8103520(&sp0))
+ {
+ s16 i;
+ for (i = 0; i < 5; i++)
+ {
+ if (sp0 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - i))
+ {
+ eSlotMachine->unk34[1] = 2;
+ eSlotMachine->unk2E[1] = i;
+ break;
+ }
+ }
+ }
+ }
+}
+
+static void j5_08111E84(void)
+{
+ if (eSlotMachine->unk34[0] != 0 && eSlotMachine->unk04 & 0x80)
+ {
+ u8 sp0 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, eSlotMachine->unk34[0] - eSlotMachine->unk2E[0]);
+ if (sub_8103520(&sp0))
+ {
+ s16 i;
+ for (i = 0; i < 5; i++)
+ {
+ if (sp0 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, eSlotMachine->unk34[0] - i))
+ {
+ eSlotMachine->unk34[1] = eSlotMachine->unk34[0];
+ eSlotMachine->unk2E[1] = i;
+ break;
+ }
+ }
+ }
+ }
+}
+
+static void sub_8103668(void)
+{
+ s16 i;
+ s16 j;
+ if (eSlotMachine->unk34[0] != 0 && eSlotMachine->unk04 & 0x80)
+ {
+ if (eSlotMachine->unk34[0] == 2)
+ {
+ j5_08111E84();
+ }
+ else
+ {
+ u8 sp0 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, eSlotMachine->unk34[0] - eSlotMachine->unk2E[0]);
+ if (sub_8103520(&sp0))
+ {
+ j = 2;
+ if (eSlotMachine->unk34[0] == 3)
+ j = 3;
+ for (i = 0; i < 2; i++, j--)
+ {
+ if (sp0 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, j))
+ {
+ eSlotMachine->unk34[1] = j;
+ eSlotMachine->unk2E[1] = 0;
+ return;
+ }
+ }
+ for (j = 1; j < 5; j++)
+ {
+ if (sp0 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, eSlotMachine->unk34[0] - j))
+ {
+ if (eSlotMachine->unk34[0] == 1)
+ {
+ if (j < 3)
+ {
+ eSlotMachine->unk34[1] = 2;
+ eSlotMachine->unk2E[1] = j + 1;
+ }
+ else
+ {
+ eSlotMachine->unk34[1] = 1;
+ eSlotMachine->unk2E[1] = j;
+ }
+ }
+ else
+ {
+ if (j < 3)
+ {
+ eSlotMachine->unk34[1] = 3;
+ eSlotMachine->unk2E[1] = j;
+ }
+ else
+ {
+ eSlotMachine->unk34[1] = 2;
+ eSlotMachine->unk2E[1] = j - 1;
+ }
+ }
+ return;
+ }
+ }
+ }
+ }
+ }
+}
+
+static bool8 sub_8103764(u8 a0, u8 a1)
+{
+ if ((a0 == 0 && a1 == 1) || (a0 == 1 && a1 == 0))
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool8 sub_810378C(u8 a0, u8 a1, u8 a2)
+{
+ if ((a0 == 0 && a1 == 1 && a2 == 0) || (a0 == 1 && a1 == 0 && a2 == 1))
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool8 sub_81037BC(u8 a0, u8 a1, u8 a2)
+{
+ if ((a0 == 0 && a1 == 1 && a2 == 0) ||
+ (a0 == 1 && a1 == 0 && a2 == 1) ||
+ (a0 == 0 && a1 == 0 && a2 == 1) ||
+ (a0 == 1 && a1 == 1 && a2 == 0) ||
+ (a0 == a1 && a0 == a2))
+ {
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static void (*const gUnknown_083ECB94[])(void) = {
+ sub_8103830,
+ sub_8103910,
+ sub_8103A78
+};
+
+static void sub_810380C(void)
+{
+ gUnknown_083ECB94[eSlotMachine->bet - 1]();
+}
+
+static void sub_8103830(void)
+{
+ s16 i = 0;
+ u8 r5 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 2 - eSlotMachine->unk2E[0]);
+ u8 r1 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - eSlotMachine->unk2E[1]);
+ if (r5 == r1)
+ {
+ while (1)
+ {
+ u8 r0;
+ if (!(r5 == (r0 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 2 - i)) || (r5 == 0 && r0 == 1) || (r5 == 1 && r0 == 0)))
+ {
+ break;
+ }
+ i++;
+ }
+ }
+ else if (sub_8103764(r5, r1))
+ {
+ if (eSlotMachine->unk04 & 0x80)
+ {
+ for (i = 0; i < 5; i++)
+ {
+ if (r5 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 2 - i))
+ {
+ eSlotMachine->unk2E[2] = i;
+ return;
+ }
+ }
+ }
+ i = 0;
+ while (1)
+ {
+ if (r5 != GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 2 - i))
+ {
+ break;
+ }
+ i++;
+ }
+ }
+ eSlotMachine->unk2E[2] = i;
+}
+
+static void sub_8103910(void)
+{
+ s16 sp0 = 0;
+ s16 i;
+ u8 r7;
+ u8 r6;
+ u8 r4;
+
+ if (eSlotMachine->unk34[1] != 0 && eSlotMachine->unk34[0] == eSlotMachine->unk34[1] && eSlotMachine->unk04 & 0x80)
+ {
+ r7 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, eSlotMachine->unk34[0] - eSlotMachine->unk2E[0]);
+ r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, eSlotMachine->unk34[1] - eSlotMachine->unk2E[1]);
+ if (sub_8103764(r7, r6))
+ {
+ for (i = 0; i < 5; i++)
+ {
+ r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, eSlotMachine->unk34[1] - i);
+ if (r7 == r4)
+ {
+ sp0 = i;
+ break;
+ }
+ }
+ }
+ }
+ while (1)
+ {
+ s16 r8;
+ for (i = 1, r8 = 0; i < 4; i++)
+ {
+ r7 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, i - eSlotMachine->unk2E[0]);
+ r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, i - eSlotMachine->unk2E[1]);
+ r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, i - sp0);
+ if (!sub_81037BC(r7, r6, r4) && (!sub_810378C(r7, r6, r4) || !(eSlotMachine->unk04 & 0x80)))
+ {
+ r8++;
+ break;
+ }
+ }
+ if (r8 == 0)
+ {
+ break;
+ }
+ sp0++;
+ }
+ eSlotMachine->unk2E[2] = sp0;
+}
+
+static void sub_8103A78(void)
+{
+ u8 r6;
+ u8 r5;
+ u8 r4;
+ s16 r8;
+ s16 i;
+
+ sub_8103910();
+ if (eSlotMachine->unk34[1] != 0 && eSlotMachine->unk34[0] != eSlotMachine->unk34[1] && eSlotMachine->unk04 & 0x80)
+ {
+ r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, eSlotMachine->unk34[0] - eSlotMachine->unk2E[0]);
+ r5 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, eSlotMachine->unk34[1] - eSlotMachine->unk2E[1]);
+ if (sub_8103764(r6, r5))
+ {
+ r8 = 1;
+ if (eSlotMachine->unk34[0] == 1)
+ r8 = 3;
+ for (i = 0; i < 5; i++)
+ {
+ r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, r8 - (eSlotMachine->unk2E[2] + i));
+ if (r6 == r4)
+ {
+ eSlotMachine->unk2E[2] += i;
+ break;
+ }
+ }
+ }
+ }
+ while (1)
+ {
+ r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 1 - eSlotMachine->unk2E[0]);
+ r5 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - eSlotMachine->unk2E[1]);
+ r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 3 - eSlotMachine->unk2E[2]);
+ if (sub_81037BC(r6, r5, r4) || (sub_810378C(r6, r5, r4) && eSlotMachine->unk04 & 0x80))
+ break;
+ eSlotMachine->unk2E[2]++;
+ }
+ while (1)
+ {
+ r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 3 - eSlotMachine->unk2E[0]);
+ r5 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - eSlotMachine->unk2E[1]);
+ r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 1 - eSlotMachine->unk2E[2]);
+ if (sub_81037BC(r6, r5, r4) || (sub_810378C(r6, r5, r4) && eSlotMachine->unk04 & 0x80))
+ break;
+ eSlotMachine->unk2E[2]++;
+ }
+}
+
+static void sub_8103C14(u8 a0)
+{
+ u8 taskId = CreateTask(sub_8103C48, 5);
+ gTasks[taskId].data[15] = a0;
+ sub_8103C48(taskId);
+}
+
+static void (*const gUnknown_083ECBA0[])(struct Task *task, u8 taskId) = {
+ sub_8103C78,
+ sub_8103CAC,
+ sub_8103CC8
+};
+
+static void sub_8103C48(u8 taskId)
+{
+ gUnknown_083ECBA0[gTasks[taskId].data[0]](gTasks + taskId, taskId);
+}
+
+static const s16 gUnknown_083ECBAC[] = {5, 10, 15};
+
+static void sub_8103C78(struct Task *task, u8 taskId)
+{
+ sub_81065A8(gUnknown_083ECBAC[task->data[15]], 0x62, 0x63, 0x72, 0x73);
+ task->data[0]++;
+}
+
+static void sub_8103CAC(struct Task *task, u8 taskId)
+{
+ if (++task->data[1] > 11)
+ task->data[0]++;
+}
+
+static void sub_8103CC8(struct Task *task, u8 taskId)
+{
+ sub_81065A8(gUnknown_083ECBAC[task->data[15]], 0x42, 0x43, 0x52, 0x53);
+ DestroyTask(taskId);
+}
+
+static const u16 *const gUnknown_083EDD08[];
+static const u16 *const gUnknown_083EDD1C[];
+static const u8 gUnknown_083EDD30[];
+
+static void sub_8103D00(u8 a0)
+{
+ LoadPalette(gUnknown_083EDD08[a0], gUnknown_083EDD30[a0], 2);
+}
+
+static void sub_8103D28(u8 a0)
+{
+ LoadPalette(gUnknown_083EDD1C[a0], gUnknown_083EDD30[a0], 2);
+}
+
+static const u8 gUnknown_083EDD35[][2];
+static const u8 gUnknown_083EDD3B[];
+
+static void sub_8103D50(u8 a0)
+{
+ u8 i;
+ for (i = 0; i < gUnknown_083EDD3B[a0]; i++)
+ {
+ sub_8103D00(gUnknown_083EDD35[a0][i]);
+ }
+}
+
+static void sub_8103D8C(u8 a0)
+{
+ u8 i;
+ for (i = 0; i < gUnknown_083EDD3B[a0]; i++)
+ {
+ sub_8103D28(gUnknown_083EDD35[a0][i]);
+ }
+}
+
+static void sub_8103DC8(void)
+{
+ u8 i;
+ for (i = 0; i < 5; i++)
+ {
+ u8 spriteId = CreateInvisibleSprite(sub_8103EE4);
+ gSprites[spriteId].data[0] = i;
+ eSlotMachine->unk44[i] = spriteId;
+ }
+}
+
+static void sub_8103E04(u8 a0)
+{
+ struct Sprite *sprite = gSprites + eSlotMachine->unk44[a0];
+ sprite->data[1] = 1;
+ sprite->data[2] = 4;
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+ sprite->data[5] = 2;
+ sprite->data[7] = 0;
+}
+
+static bool8 sub_8103E38(void)
+{
+ u8 i;
+ for (i = 0; i < 5; i++)
+ {
+ struct Sprite *sprite = gSprites + eSlotMachine->unk44[i];
+ if (sprite->data[1] && sprite->data[2])
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static bool8 sub_8103E7C(void)
+{
+ u8 i;
+ for (i = 0; i < 5; i++)
+ {
+ if (!sub_8103EAC(eSlotMachine->unk44[i]))
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static bool8 sub_8103EAC(u8 spriteId)
+{
+ struct Sprite *sprite = gSprites + spriteId;
+ if (!sprite->data[1])
+ return TRUE;
+ if (sprite->data[7])
+ sprite->data[1] = 0;
+ return sprite->data[7];
+}
+
+static void sub_8103EE4(struct Sprite *sprite)
+{
+ s16 r4;
+ if (sprite->data[1])
+ {
+ if (!sprite->data[3]--)
+ {
+ sprite->data[7] = 0;
+ sprite->data[3] = 1;
+ sprite->data[4] += sprite->data[5];
+ r4 = 4;
+ if (sprite->data[2])
+ r4 = 8;
+ if (sprite->data[4] <= 0)
+ {
+ sprite->data[7] = 1;
+ sprite->data[5] = -sprite->data[5];
+ if (sprite->data[2])
+ sprite->data[2]--;
+ }
+ else if (sprite->data[4] >= r4)
+ sprite->data[5] = -sprite->data[5];
+ if (sprite->data[2])
+ sprite->data[3] <<= 1;
+ }
+ MultiplyPaletteRGBComponents(gUnknown_083EDD30[sprite->data[0]], sprite->data[4], sprite->data[4], sprite->data[4]);
+ }
+}
+
+static void sub_8103F70(void)
+{
+ u8 taskId = CreateTask(sub_8103FE8, 6);
+ gTasks[taskId].data[3] = 1;
+ sub_8103FE8(taskId);
+}
+
+static const u16 *const gUnknown_083EDDA0[];
+static const u16 *const gUnknown_083EDDAC;
+
+static bool8 sub_8103FA0(void)
+{
+ u8 taskId = FindTaskIdByFunc(sub_8103FE8);
+ if (!gTasks[taskId].data[2])
+ {
+ DestroyTask(taskId);
+ LoadPalette(gUnknown_083EDDAC, 0x10, 0x20);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void sub_8103FE8(u8 taskId)
+{
+ struct Task *task = gTasks + taskId;
+ if (!task->data[1]--)
+ {
+ task->data[1] = 4;
+ task->data[2] += task->data[3];
+ if (task->data[2] == 0 || task->data[2] == 2)
+ {
+ task->data[3] = -task->data[3];
+ }
+ }
+ LoadPalette(gUnknown_083EDDA0[task->data[2]], 0x10, 0x20);
+}
+
+static void sub_8104048(void)
+{
+ eSlotMachine->unk3E = CreateTask(sub_81040E8, 8);
+}
+
+static void sub_8104064(u8 pikaPower)
+{
+ struct Task *task = gTasks + eSlotMachine->unk3E;
+ sub_810421C(task);
+ task->data[0] = 1;
+ task->data[1]++;
+ task->data[15] = 1;
+}
+
+static void sub_8104098(void)
+{
+ struct Task *task = gTasks + eSlotMachine->unk3E;
+ sub_810421C(task);
+ task->data[0] = 3;
+ task->data[15] = 1;
+}
+
+static bool8 sub_81040C8(void)
+{
+ return gTasks[eSlotMachine->unk3E].data[15];
+}
+
+static void (*const gUnknown_083ECBB4[])(struct Task *task) = {
+ nullsub_68,
+ sub_810411C,
+ sub_8104144,
+ sub_81041AC
+};
+
+static void sub_81040E8(u8 taskId)
+{
+ gUnknown_083ECBB4[gTasks[taskId].data[0]](gTasks + taskId);
+}
+
+static void nullsub_68(struct Task *task)
+{
+
+}
+
+static void sub_810411C(struct Task *task)
+{
+ task->data[2] = sub_8105B1C((task->data[1] << 3) + 20, 20);
+ task->data[0]++;
+}
+
+static const u16 gUnknown_083ECBC4[][2] = {
+ {0x9e, 0x6e},
+ {0x9f, 0x6f},
+ {0xaf, 0x7f}
+};
+
+static void sub_8104144(struct Task *task)
+{
+ u16 *vaddr = (u16 *)BG_SCREEN_ADDR(29);
+ if (gSprites[task->data[2]].data[7])
+ {
+ s16 r2 = task->data[1] + 2;
+ u8 r0 = 0;
+ if (task->data[1] == 1)
+ r0 = 1;
+ else if (task->data[1] == 16)
+ r0 = 2;
+ vaddr[r2 + 0x40] = gUnknown_083ECBC4[r0][0];
+ sub_8105B88(task->data[2]);
+ task->data[0] = 0;
+ task->data[15] = 0;
+ }
+}
+
+static void sub_81041AC(struct Task *task)
+{
+ u16 *vaddr = (u16 *)BG_SCREEN_ADDR(29);
+ s16 r4 = task->data[1] + 2;
+ u8 r2 = 0;
+ if (task->data[1] == 1)
+ r2 = 1;
+ else if (task->data[1] == 16)
+ r2 = 2;
+ if (task->data[2] == 0)
+ {
+ vaddr[r4 + 0x40] = gUnknown_083ECBC4[r2][1];
+ task->data[1]--;
+ }
+ if (++task->data[2] >= 20)
+ task->data[2] = 0;
+ if (task->data[1] == 0)
+ {
+ task->data[0] = 0;
+ task->data[15] = 0;
+ }
+}
+
+static void sub_810421C(struct Task *task)
+{
+ u8 i;
+
+ for (i = 2; i < 16; i++)
+ task->data[i] = 0;
+}
+
+static void sub_810423C(u8 pikaPower)
+{
+ s16 i;
+ u8 r3;
+ s16 r2 = 3;
+ u16 *vaddr = (u16 *)BG_SCREEN_ADDR(29);
+ for (i = 0; i < pikaPower; i++, r2++)
+ {
+ r3 = 0;
+ if (i == 0)
+ r3 = 1;
+ else if (i == 15)
+ r3 = 2;
+ vaddr[r2 + 0x40] = gUnknown_083ECBC4[r3][0];
+ }
+ for (; i < 16; i++, r2++)
+ {
+ r3 = 0;
+ if (i == 0)
+ r3 = 1;
+ else if (i == 15)
+ r3 = 2;
+ vaddr[r2 + 0x40] = gUnknown_083ECBC4[r3][1];
+ }
+ gTasks[eSlotMachine->unk3E].data[1] = pikaPower;
+}
+
+static void sub_810430C(void)
+{
+ u8 taskId = CreateTask(sub_810434C, 7);
+ sub_810434C(taskId);
+}
+
+static bool8 sub_810432C(void)
+{
+ if (FindTaskIdByFunc(sub_810434C) == 0xFF)
+ return TRUE;
+ return FALSE;
+}
+
+static void (*const gUnknown_083ECBD0[])(struct Task *task) = {
+ sub_810437C,
+ sub_81043EC,
+ sub_8104468,
+ sub_8104498,
+ sub_8104548,
+ sub_8104598,
+ sub_81045CC,
+ sub_810463C,
+ sub_81046C0,
+ sub_8104764,
+ sub_8104794,
+ sub_81047EC,
+ sub_8104860,
+ sub_81048A8,
+ sub_81048CC,
+ sub_8104940,
+ sub_81049C8,
+ sub_8104794,
+ sub_81049F8
+};
+
+static void sub_810434C(u8 taskId)
+{
+ gUnknown_083ECBD0[gTasks[taskId].data[0]](gTasks + taskId);
+}
+
+static void sub_810437C(struct Task *task)
+{
+ eSlotMachine->unk0A = 0;
+ eSlotMachine->unk14 = 0;
+ eSlotMachine->unk16 = 0;
+ task->data[0]++;
+ task->data[1] = 0;
+ task->data[2] = 30;
+ task->data[4] = 1280;
+ gSpriteCoordOffsetX = 0;
+ gSpriteCoordOffsetY = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ sub_8104A40(30, 0);
+ sub_81051C0();
+ sub_8105100();
+ sub_81052EC();
+ sub_81053A0();
+ sub_810545C();
+ sub_8102680();
+ StopMapMusic();
+ PlayNewMapMusic(BGM_BD_TIME);
+}
+
+static void sub_81043EC(struct Task *task)
+{
+ s16 r3;
+ gSpriteCoordOffsetX -= 8;
+ task->data[1] += 8;
+ r3 = ((task->data[1] + 240) & 0xff) >> 3;
+ REG_BG1HOFS = task->data[1] & 0x1ff;
+ if (r3 != task->data[2] && task->data[3] <= 18)
+ {
+ task->data[2] = r3;
+ task->data[3] = task->data[1] >> 3;
+ sub_8104A40(r3, task->data[3]);
+ }
+ if (task->data[1] >= 200)
+ {
+ task->data[0]++;
+ task->data[3] = 0;
+ }
+ sub_8102D28(task->data[4] >> 8);
+}
+
+static void sub_8104468(struct Task *task)
+{
+ sub_8102D28(task->data[4] >> 8);
+ if (++task->data[5] >= 60)
+ {
+ task->data[0]++;
+ sub_8105578();
+ sub_81056F0();
+ }
+}
+
+static void sub_8104498(struct Task *task)
+{
+ int r5;
+ u8 sp0[] = {1, 1, 2, 2};
+ s16 sp4[] = {0x40, 0x30, 0x18, 0x08};
+ s16 spC[] = {10, 8, 6, 4};
+
+ sub_8102D28(task->data[4] >> 8);
+ task->data[4] -= 4;
+ r5 = 4 - (task->data[4] >> 8);
+ sub_8105688(sp4[r5]);
+ sub_81057E8(spC[r5]);
+ StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, sp0[r5]);
+ if (task->data[4] <= 0x100)
+ {
+ task->data[0]++;
+ task->data[4] = 0x100;
+ task->data[5] = 0;
+ }
+}
+
+static void sub_8104548(struct Task *task)
+{
+ sub_8102D28(task->data[4] >> 8);
+ if (++task->data[5] >= 80)
+ {
+ task->data[0]++;
+ task->data[5] = 0;
+ sub_81057E8(2);
+ StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, 3);
+ }
+}
+
+static void sub_8104598(struct Task *task)
+{
+ sub_8102D28(task->data[4] >> 8);
+ task->data[4] = (u8)task->data[4] + 0x80;
+ if (++task->data[5] >= 80)
+ {
+ task->data[0]++;
+ task->data[5] = 0;
+ }
+}
+
+static void sub_81045CC(struct Task *task)
+{
+ sub_8102D28(task->data[4] >> 8);
+ task->data[4] = (u8)task->data[4] + 0x40;
+ if (++task->data[5] >= 40)
+ {
+ task->data[5] = 0;
+ if (eSlotMachine->unk05)
+ {
+ if (eSlotMachine->unk0A <= task->data[6])
+ {
+ task->data[0]++;
+ }
+ }
+ else if (task->data[6] > 3)
+ {
+ task->data[0]++;
+ }
+ else if (sub_81026DC(task->data[6]))
+ {
+ task->data[0] = 14;
+ }
+ task->data[6]++;
+ }
+}
+
+static void sub_810463C(struct Task *task)
+{
+ s16 r5 = eSlotMachine->unk14 % 20;
+ if (r5)
+ {
+ r5 = sub_8102D5C(task->data[4] >> 8);
+ task->data[4] = (u8)task->data[4] + 0x40;
+ }
+ else if (sub_8102C48(1) != eSlotMachine->unk05)
+ {
+ sub_8102D28(task->data[4] >> 8);
+ r5 = eSlotMachine->unk14 % 20;
+ task->data[4] = (u8)task->data[4] + 0x40;
+ }
+ if (r5 == 0 && sub_8102C48(1) == eSlotMachine->unk05)
+ {
+ task->data[4] = 0;
+ task->data[0]++;
+ }
+}
+
+static void sub_81046C0(struct Task *task)
+{
+ if (++task->data[4] >= 60)
+ {
+ StopMapMusic();
+ sub_81056C0();
+ sub_8105804();
+ task->data[0]++;
+ if(eSlotMachine->unk05 == 0)
+ {
+ task->data[4] = 0xa0;
+ StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, 5);
+ PlayFanfare(BGM_ME_ZANNEN);
+ }
+ else
+ {
+ task->data[4] = 0xc0;
+ StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, 4);
+ gSprites[eSlotMachine->unk3F].animCmdIndex = 0;
+ if (eSlotMachine->pikaPower)
+ {
+ sub_8104098();
+ eSlotMachine->pikaPower = 0;
+ }
+ PlayFanfare(BGM_ME_B_SMALL);
+ }
+ }
+}
+
+static void sub_8104764(struct Task *task)
+{
+ if ((task->data[4] == 0 || --task->data[4] == 0) && !sub_81040C8())
+ {
+ task->data[0]++;
+ }
+}
+
+static void sub_8104794(struct Task *task)
+{
+ s16 r4;
+ gSpriteCoordOffsetX -= 8;
+ task->data[1] += 8;
+ task->data[3] += 8;
+ r4 = ((task->data[1] - 8) & 0xff) >> 3;
+ REG_BG1HOFS = task->data[1] & 0x1ff;
+ if (task->data[3] >> 3 <= 25)
+ {
+ sub_8104A88(r4);
+ }
+ else
+ {
+ task->data[0]++;
+ }
+}
+
+static void sub_81047EC(struct Task *task)
+{
+ eSlotMachine->unk0B = 0;
+ eSlotMachine->unk0A = eSlotMachine->unk05;
+ gSpriteCoordOffsetX = 0;
+ REG_BG1HOFS = 0;
+ eSlotMachine->unk1A = 8;
+ sub_810514C();
+ sub_81054B8();
+ sub_8105524();
+ PlayNewMapMusic(eSlotMachine->backupMapMusic);
+ if (eSlotMachine->unk0A == 0)
+ {
+ DestroyTask(FindTaskIdByFunc(sub_810434C));
+ }
+ else
+ {
+ sub_8104CAC(4);
+ task->data[1] = dp15_jump_random_unknown();
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[0]++;
+ }
+}
+
+static void sub_8104860(struct Task *task)
+{
+ if (eSlotMachine->unk1A == task->data[1])
+ {
+ task->data[0]++;
+ }
+ else if (eSlotMachine->unk1C[0] % 24 == 0 && (++task->data[2]& 0x07) == 0)
+ {
+ eSlotMachine->unk1A >>= 1;
+ }
+}
+
+static void sub_81048A8(struct Task *task)
+{
+ if (sub_8104E18())
+ {
+ DestroyTask(FindTaskIdByFunc(sub_810434C));
+ }
+}
+
+static void sub_81048CC(struct Task *task)
+{
+ sub_81054B8();
+ sub_81056C0();
+ sub_8105804();
+ sub_8105854();
+ gSprites[eSlotMachine->unk4E[0]].invisible = TRUE;
+ StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, 5);
+ task->data[0]++;
+ task->data[4] = 4;
+ task->data[5] = 0;
+ StopMapMusic();
+ PlayFanfare(BGM_ME_ZANNEN);
+ PlaySE(SE_W153);
+}
+
+static void sub_8104940(struct Task *task)
+{
+ gSpriteCoordOffsetY = task->data[4];
+ REG_BG1VOFS = task->data[4];
+ if (task->data[5] & 0x01)
+ task->data[4] = -task->data[4];
+ if ((++task->data[5] & 0x1f) == 0)
+ task->data[4] >>= 1;
+ if (task->data[4] == 0)
+ {
+ sub_81058A0();
+ sub_81058C4();
+ sub_8105284();
+ sub_81059E8();
+ gSprites[eSlotMachine->unk4E[0]].invisible = FALSE;
+ task->data[0]++;
+ task->data[5] = 0;
+ }
+}
+
+static void sub_81049C8(struct Task *task)
+{
+ gSpriteCoordOffsetY = 0;
+ REG_BG1VOFS = 0;
+ if (sub_8105ACC())
+ {
+ task->data[0]++;
+ sub_8105AEC();
+ }
+}
+
+static void sub_81049F8(struct Task *task)
+{
+ gSpriteCoordOffsetX = 0;
+ REG_BG1HOFS = 0;
+ PlayNewMapMusic(eSlotMachine->backupMapMusic);
+ sub_810514C();
+ sub_8105554();
+ sub_8105524();
+ sub_81059B8();
+ DestroyTask(FindTaskIdByFunc(sub_810434C));
+}
+
+static const u16 sReelTimeWindowTilemap[];
+
+static void sub_8104A40(s16 a0, s16 a1)
+{
+ s16 i;
+
+ for (i = 4; i < 15; i++)
+ {
+ u16 tile = sReelTimeWindowTilemap[a1 + (i - 4) * 20];
+ ((u16 *)BG_SCREEN_ADDR(28))[32 * i + a0] = tile;
+ }
+}
+
+static void sub_8104A88(s16 a0)
+{
+ s16 i;
+
+ for (i = 4; i < 15; i++)
+ {
+ ((u16 *)BG_SCREEN_ADDR(28))[32 * i + a0] = 0;
+ }
+}
+
+static void sub_8104AB8(u8 a0)
+{
+ u8 taskId = CreateTask(sub_8104B0C, 1);
+ gTasks[taskId].data[1] = a0;
+ sub_8104B0C(taskId);
+}
+
+static bool8 sub_8104AEC(void)
+{
+ if (FindTaskIdByFunc(sub_8104B0C) == 0xFF)
+ return TRUE;
+ return FALSE;
+}
+
+static void (*const gUnknown_083ECC30[])(struct Task *task) = {
+ sub_8104B3C,
+ sub_8104B60,
+ sub_8104B80,
+ sub_8104B60,
+ sub_8104BC8,
+ sub_8104B60,
+ sub_8104BFC,
+ sub_8104B60,
+ sub_8104C44
+};
+
+static void sub_8104B0C(u8 taskId)
+{
+ gUnknown_083ECC30[gTasks[taskId].data[0]](gTasks + taskId);
+}
+
+static void sub_8104B3C(struct Task *task)
+{
+ BeginNormalPaletteFade(-1, 0, 0, 16, 0);
+ task->data[0]++;
+}
+
+static void sub_8104B60(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ task->data[0]++;
+ }
+}
+
+static void sub_8104B80(struct Task *task)
+{
+ sub_8104DA4();
+ sub_81065DC();
+ BasicInitMenuWindow(&gWindowConfig_81E7144);
+ MenuPrint_PixelCoords(gOtherText_ReelTime, 10, 32, 1);
+ BeginNormalPaletteFade(-1, 0, 16, 0, 0);
+ task->data[0]++;
+}
+
+static void sub_8104BC8(struct Task *task)
+{
+ if (gMain.newKeys & (B_BUTTON | SELECT_BUTTON))
+ {
+ BeginNormalPaletteFade(-1, 0, 0, 16, 0);
+ task->data[0]++;
+ }
+}
+
+static void sub_8104BFC(struct Task *task)
+{
+ MenuZeroFillScreen();
+ BasicInitMenuWindow(&gWindowConfig_81E7128);
+ sub_81064B8();
+ sub_8104CAC(task->data[1]);
+ sub_810423C(eSlotMachine->pikaPower);
+ BeginNormalPaletteFade(-1, 0, 16, 0, 0);
+ task->data[0]++;
+}
+
+static void sub_8104C44(struct Task *task)
+{
+ DestroyTask(FindTaskIdByFunc(sub_8104B0C));
+}
+
+static void sub_8104C5C(void)
+{
+ u8 i;
+ struct Task *task;
+ i = CreateTask(sub_8104E74, 3);
+ eSlotMachine->unk3D = i;
+ task = gTasks + i;
+ task->data[1] = -1;
+ for (i = 4; i < 16; i++)
+ {
+ task->data[i] = MAX_SPRITES;
+ }
+}
+
+static void LoadSlotMachineWheelOverlay(void);
+
+static void sub_8104CAC(u8 arg0) {
+ u8 i;
+ struct Task *task;
+
+ sub_8104DA4();
+
+ task = gTasks + eSlotMachine->unk3D;
+ task->data[1] = arg0;
+
+ for (i = 0; gUnknown_083ED048[arg0][i].unk00 != 0xFF; i++)
+ {
+ u8 spriteId;
+ spriteId = sub_8105BB4(
+ gUnknown_083ED048[arg0][i].unk00,
+ gUnknown_083ED048[arg0][i].unk01,
+ gUnknown_083ED048[arg0][i].unk02
+ );
+ task->data[4 + i] = spriteId;
+
+#ifdef GERMAN
+ if (arg0 == 5 && i <= 2)
+ {
+ gSprites[spriteId].invisible = TRUE;
+ }
+#endif
+ }
+}
+
+static void sub_8104D30(u8 a0, SpriteCallback a1, s16 a2, s16 a3, s16 a4)
+{
+ u8 i;
+ struct Task *task = gTasks + eSlotMachine->unk3D;
+ for (i = 4; i < 16; i++)
+ {
+ if (task->data[i] == MAX_SPRITES)
+ {
+ task->data[i] = sub_8105BF8(a0, a1, a2, a3, a4);
+ break;
+ }
+ }
+}
+
+static void (*const gUnknown_083ED064[])(void);
+
+void sub_8104DA4(void)
+{
+ u8 i;
+ struct Task *task = gTasks + eSlotMachine->unk3D;
+ if ((u16)task->data[1] != 0xFFFF)
+ gUnknown_083ED064[task->data[1]]();
+ for (i = 4; i < 16; i++)
+ {
+ if (task->data[i] != MAX_SPRITES)
+ {
+ DestroySprite(gSprites + task->data[i]);
+ task->data[i] = MAX_SPRITES;
+ }
+ }
+}
+
+static bool8 sub_8104E18(void)
+{
+ u8 i;
+ struct Task *task = gTasks + eSlotMachine->unk3D;
+ for (i = 4; i < 16; i++)
+ {
+ if (task->data[i] != MAX_SPRITES)
+ {
+ if (gSprites[task->data[i]].data[7])
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+static void (*const gUnknown_083ECC54[])(struct Task *task) = {
+ nullsub_69
+};
+
+static void sub_8104E74(u8 taskId)
+{
+ gUnknown_083ECC54[gTasks[taskId].data[0]](gTasks + taskId);
+}
+
+static void nullsub_69(struct Task *task)
+{
+
+}
+
+static const struct SpriteTemplate gSpriteTemplate_83ED414;
+
+static void sub_8104EA8(void)
+{
+ s16 i;
+ s16 j;
+ s16 x;
+ for (i = 0, x = 0x30; i < 3; i++, x += 0x28)
+ {
+ for (j = 0; j < 120; j += 24)
+ {
+ struct Sprite *sprite = gSprites + CreateSprite(&gSpriteTemplate_83ED414, x, 0, 14);
+ sprite->oam.priority = 3;
+ sprite->data[0] = i;
+ sprite->data[1] = j;
+ sprite->data[3] = -1;
+ }
+ }
+}
+
+static void sub_8104F18(struct Sprite *sprite)
+{
+ sprite->data[2] = eSlotMachine->unk1C[sprite->data[0]] + sprite->data[1];
+ sprite->data[2] %= 120;
+ sprite->pos1.y = eSlotMachine->unk22[sprite->data[0]] + 28 + sprite->data[2];
+ sprite->sheetTileStart = GetSpriteTileStartByTag(GetTagOfReelSymbolOnScreenAtPos(sprite->data[0], sprite->data[2] / 24));
+ SetSpriteSheetFrameTileNum(sprite);
+}
+
+static void sub_8104F8C(void)
+{
+ s16 i;
+ s16 x;
+ for (x = 203, i = 1; i < 10000; i *= 10, x -= 7)
+ {
+ sub_8104FF4(x, 23, 0, i);
+ }
+ for (x = 235, i = 1; i < 10000; i *= 10, x -= 7)
+ {
+ sub_8104FF4(x, 23, 1, i);
+ }
+}
+
+static const struct SpriteTemplate gSpriteTemplate_83ED42C;
+
+static void sub_8104FF4(s16 x, s16 y, u8 a2, s16 a3)
+{
+ struct Sprite *sprite = gSprites + CreateSprite(&gSpriteTemplate_83ED42C, x, y, 13);
+ sprite->oam.priority = 2;
+ sprite->data[0] = a2;
+ sprite->data[1] = a3;
+ sprite->data[2] = a3 * 10;
+ sprite->data[3] = -1;
+}
+
+static void sub_810506C(struct Sprite *sprite)
+{
+ u16 tag = eSlotMachine->coins;
+ if (sprite->data[0])
+ tag = eSlotMachine->payout;
+ if (sprite->data[3] != tag)
+ {
+ sprite->data[3] = tag;
+ tag %= (u16)sprite->data[2];
+ tag /= (u16)sprite->data[1];
+ tag += 7;
+ sprite->sheetTileStart = GetSpriteTileStartByTag(tag);
+ SetSpriteSheetFrameTileNum(sprite);
+ }
+}
+
+static const struct SpriteTemplate gSpriteTemplate_83ED444;
+static const struct SubspriteTable gSubspriteTables_83ED704[];
+
+static void sub_81050C4(void)
+{
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83ED444, 0x58, 0x48, 15);
+ gSprites[spriteId].oam.priority = 3;
+ SetSubspriteTables(gSprites + spriteId, gSubspriteTables_83ED704);
+}
+
+static const struct SpriteTemplate gSpriteTemplate_83ED45C;
+
+static void sub_8105100(void)
+{
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83ED45C, 0x118, 0x50, 1);
+ gSprites[spriteId].oam.priority = 1;
+ gSprites[spriteId].coordOffsetEnabled = TRUE;
+ eSlotMachine->unk3F = spriteId;
+}
+
+static void sub_810514C(void)
+{
+ DestroySprite(gSprites + eSlotMachine->unk3F);
+}
+
+static void sub_8105170(struct Sprite *sprite)
+{
+ sprite->pos2.y = sprite->pos2.x = 0;
+ if (sprite->animNum == 4)
+ {
+ sprite->pos2.y = sprite->pos2.x = 8;
+ if ((sprite->animCmdIndex != 0 && sprite->animDelayCounter != 0) || (sprite->animCmdIndex == 0 && sprite->animDelayCounter == 0))
+ {
+ sprite->pos2.y = -8;
+ }
+ }
+}
+
+static const struct SpriteTemplate gSpriteTemplate_83ED474;
+static const struct SpriteTemplate gSpriteTemplate_83ED48C;
+static const struct SubspriteTable gSubspriteTables_83ED73C[];
+static const struct SubspriteTable gSubspriteTables_83ED75C[];
+
+static void sub_81051C0(void)
+{
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83ED474, 0x170, 0x34, 7);
+ struct Sprite *sprite = gSprites + spriteId;
+ sprite->oam.priority = 1;
+ sprite->coordOffsetEnabled = TRUE;
+ SetSubspriteTables(sprite, gSubspriteTables_83ED73C);
+ eSlotMachine->unk49[0] = spriteId;
+
+ spriteId = CreateSprite(&gSpriteTemplate_83ED48C, 0x170, 0x54, 7);
+ sprite = gSprites + spriteId;
+ sprite->oam.priority = 1;
+ sprite->coordOffsetEnabled = TRUE;
+ SetSubspriteTables(sprite, gSubspriteTables_83ED75C);
+ eSlotMachine->unk49[1] = spriteId;
+}
+
+static const struct SpriteTemplate gSpriteTemplate_83ED4A4;
+static const struct SubspriteTable gSubspriteTables_83ED78C[];
+
+static void sub_8105284(void)
+{
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4A4, 0xa8 - gSpriteCoordOffsetX, 0x50, 7);
+ struct Sprite *sprite = gSprites + spriteId;
+ sprite->oam.priority = 1;
+ sprite->coordOffsetEnabled = TRUE;
+ SetSubspriteTables(sprite, gSubspriteTables_83ED78C);
+ eSlotMachine->unk42 = spriteId;
+}
+
+static const struct SpriteTemplate gSpriteTemplate_83ED4BC;
+
+static void sub_81052EC(void)
+{
+ u8 i;
+ s16 r5;
+ for (i = 0, r5 = 0; i < 3; i++, r5 += 20)
+ {
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4BC, 0x170, 0x00, 10);
+ struct Sprite *sprite = gSprites + spriteId;
+ sprite->oam.priority = 1;
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->data[7] = r5;
+ eSlotMachine->unk4B[i] = spriteId;
+ }
+}
+
+static void sub_810535C(struct Sprite *sprite)
+{
+ s16 r0 = (u16)(eSlotMachine->unk14 + sprite->data[7]);
+ r0 %= 40;
+ sprite->pos1.y = r0 + 59;
+ StartSpriteAnimIfDifferent(sprite, sub_8102C48(r0 / 20));
+}
+
+static const struct SpriteTemplate gSpriteTemplate_83ED4D4;
+static const struct SubspriteTable gSubspriteTables_83ED7B4[];
+
+static void sub_81053A0(void)
+{
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4D4, 0x170, 0x64, 9);
+ struct Sprite *sprite = gSprites + spriteId;
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->oam.priority = 1;
+ SetSubspriteTables(sprite, gSubspriteTables_83ED7B4);
+ eSlotMachine->unk4E[0] = spriteId;
+
+ spriteId = CreateSprite(&gSpriteTemplate_83ED4D4, 0x120, 0x68, 4);
+ sprite = gSprites + spriteId;
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->oam.priority = 1;
+ SetSubspriteTables(sprite, gSubspriteTables_83ED7B4);
+ eSlotMachine->unk4E[1] = spriteId;
+}
+
+static const struct SpriteTemplate gSpriteTemplate_83ED4EC;
+static const struct SubspriteTable gSubspriteTables_83ED7D4[];
+
+static void sub_810545C(void)
+{
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4EC, 0x170, 0x4c, 11);
+ struct Sprite *sprite = gSprites + spriteId;
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->oam.priority = 1;
+ SetSubspriteTables(sprite, gSubspriteTables_83ED7D4);
+ eSlotMachine->unk40 = spriteId;
+}
+
+static void sub_81054B8(void)
+{
+ u8 i;
+
+ DestroySprite(gSprites + eSlotMachine->unk40);
+ for (i = 0; i < 2; i++)
+ {
+ DestroySprite(gSprites + eSlotMachine->unk49[i]);
+ }
+ for (i = 0; i < 3; i++)
+ {
+ DestroySprite(gSprites + eSlotMachine->unk4B[i]);
+ }
+}
+
+static void sub_8105524(void)
+{
+ u8 i;
+ for (i = 0; i < 2; i++)
+ {
+ DestroySprite(gSprites + eSlotMachine->unk4E[i]);
+ }
+}
+
+static void sub_8105554(void)
+{
+ DestroySprite(gSprites + eSlotMachine->unk42);
+}
+
+static const struct SpriteTemplate gSpriteTemplate_83ED504;
+
+static void sub_8105578(void)
+{
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83ED504, 0x98, 0x20, 5);
+ struct Sprite *sprite = gSprites + spriteId;
+ sprite->oam.priority = 1;
+ sprite->hFlip = TRUE;
+ eSlotMachine->unk50[0] = spriteId;
+ sprite->data[0] = 8;
+ sprite->data[1] = -1;
+ sprite->data[2] = -1;
+ sprite->data[7] = 0x20;
+
+ spriteId = CreateSprite(&gSpriteTemplate_83ED504, 0xb8, 0x20, 5);
+ sprite = gSprites + spriteId;
+ sprite->oam.priority = 1;
+ eSlotMachine->unk50[1] = spriteId;
+ sprite->data[1] = 1;
+ sprite->data[2] = -1;
+ sprite->data[7] = 0x20;
+}
+
+static void sub_810562C(struct Sprite *sprite)
+{
+ if (sprite->data[0] != 0)
+ {
+ sprite->data[0]--;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->invisible = TRUE;
+ }
+ else
+ {
+ sprite->invisible = FALSE;
+ sprite->pos2.x += sprite->data[1];
+ sprite->pos2.y += sprite->data[2];
+ if (++sprite->data[3] >= 8)
+ {
+ sprite->data[0] = sprite->data[7];
+ sprite->data[3] = 0;
+ }
+ }
+}
+
+static void sub_8105688(s16 a0)
+{
+ gSprites[eSlotMachine->unk50[0]].data[7] = a0;
+ gSprites[eSlotMachine->unk50[1]].data[7] = a0;
+}
+
+static void sub_81056C0(void)
+{
+ u8 i;
+
+ for (i = 0; i < 2; i++)
+ {
+ DestroySprite(gSprites + eSlotMachine->unk50[i]);
+ }
+}
+
+static const struct SpriteTemplate gSpriteTemplate_83ED51C;
+
+static void sub_81056F0(void)
+{
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83ED51C, 0x48, 0x50, 3);
+ gSprites[spriteId].oam.priority = 1;
+ gSprites[spriteId].data[0] = 1;
+ gSprites[spriteId].data[5] = 0;
+ gSprites[spriteId].data[6] = 16;
+ gSprites[spriteId].data[7] = 8;
+ eSlotMachine->unk52[0] = spriteId;
+
+ spriteId = CreateSprite(&gSpriteTemplate_83ED51C, 0x68, 0x50, 3);
+ gSprites[spriteId].oam.priority = 1;
+ gSprites[spriteId].hFlip = TRUE;
+ eSlotMachine->unk52[1] = spriteId;
+}
+
+static const u8 gUnknown_083ECC58[2]; // don't remove this until decompiled through gUnknown_083ECCF8
+
+static void sub_8105784(struct Sprite *sprite)
+{
+ u8 sp[] = {16, 0};
+ if (sprite->data[0] && --sprite->data[6] <= 0)
+ {
+ MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(7) << 4) + 0x103, sp[sprite->data[5]], sp[sprite->data[5]], sp[sprite->data[5]]);
+ ++sprite->data[5];
+ sprite->data[5] &= 1;
+ sprite->data[6] = sprite->data[7];
+ }
+}
+
+static void sub_81057E8(s16 a0)
+{
+ gSprites[eSlotMachine->unk52[0]].data[7] = a0;
+}
+
+static void sub_8105804(void)
+{
+ u8 i;
+ MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(7) << 4) + 0x103, 0, 0, 0);
+ for (i = 0; i < 2; i++)
+ {
+ DestroySprite(gSprites + eSlotMachine->unk52[i]);
+ }
+}
+
+static const struct SpriteTemplate gSpriteTemplate_83ED534;
+
+static void sub_8105854(void)
+{
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83ED534, 0xa8, 0x50, 6);
+ gSprites[spriteId].oam.priority = 1;
+ eSlotMachine->unk41 = spriteId;
+}
+
+static void sub_8105894(struct Sprite *sprite)
+{
+ sprite->pos2.y = gSpriteCoordOffsetY;
+}
+
+static void sub_81058A0(void)
+{
+ DestroySprite(gSprites + eSlotMachine->unk41);
+}
+
+static const struct SpriteTemplate gSpriteTemplate_83ED54C;
+
+static void sub_81058C4(void)
+{
+ u8 i;
+ u16 sp[] = {0x0, 0x40, 0x80, 0xC0};
+ for (i = 0; i < 4; i++)
+ {
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83ED54C, 0x50 - gSpriteCoordOffsetX, 0x44, 0);
+ struct Sprite *sprite = gSprites + spriteId;
+ sprite->oam.priority = 1;
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->data[0] = sp[i];
+ eSlotMachine->unk54[i] = spriteId;
+ }
+}
+
+static void sub_810594C(struct Sprite *sprite)
+{
+ sprite->data[0] -= 2;
+ sprite->data[0] &= 0xff;
+ sprite->pos2.x = Cos(sprite->data[0], 20);
+ sprite->pos2.y = Sin(sprite->data[0], 6);
+ sprite->subpriority = 0;
+ if (sprite->data[0] >= 0x80)
+ {
+ sprite->subpriority = 2;
+ }
+ if (++sprite->data[1] >= 16)
+ {
+ sprite->hFlip ^= 1;
+ sprite->data[1] = 0;
+ }
+}
+
+static void sub_81059B8(void)
+{
+ u8 i;
+ for (i = 0; i < 4; i++)
+ {
+ DestroySprite(gSprites + eSlotMachine->unk54[i]);
+ }
+}
+
+static const struct SpriteTemplate gSpriteTemplate_83ED564;
+
+static void sub_81059E8(void)
+{
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83ED564, 0xa8, 0x3c, 8);
+ struct Sprite *sprite = gSprites + spriteId;
+ sprite->oam.priority = 1;
+ sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE;
+ InitSpriteAffineAnim(sprite);
+ eSlotMachine->unk43 = spriteId;
+}
+
+static void sub_8105A38(struct Sprite *sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ if (sprite->affineAnimEnded)
+ sprite->data[0]++;
+ }
+ else if (sprite->data[0] == 1)
+ {
+ sprite->invisible ^= 1;
+ if (++sprite->data[2] >= 24)
+ {
+ sprite->data[0]++;
+ sprite->data[2] = 0;
+ }
+ }
+ else
+ {
+ sprite->invisible = TRUE;
+ if (++sprite->data[2] >= 16)
+ sprite->data[7] = 1;
+ }
+ sprite->data[1] &= 0xff;
+ sprite->data[1] += 16;
+ sprite->pos2.y -= (sprite->data[1] >> 8);
+}
+
+u8 sub_8105ACC(void)
+{
+ return gSprites[eSlotMachine->unk43].data[7];
+}
+
+static void sub_8105AEC(void)
+{
+ struct Sprite *sprite = gSprites + eSlotMachine->unk43;
+ FreeOamMatrix(sprite->oam.matrixNum);
+ DestroySprite(sprite);
+}
+
+static const struct SpriteTemplate gSpriteTemplate_83ED6CC;
+
+static u8 sub_8105B1C(s16 x, s16 y)
+{
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83ED6CC, x, y, 12);
+ struct Sprite *sprite = gSprites + spriteId;
+ sprite->oam.priority = 2;
+ sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE;
+ InitSpriteAffineAnim(sprite);
+ return spriteId;
+}
+
+static void sub_8105B70(struct Sprite *sprite)
+{
+ if (sprite->affineAnimEnded)
+ sprite->data[7] = 1;
+}
+
+static void sub_8105B88(u8 spriteId)
+{
+ struct Sprite *sprite = gSprites + spriteId;
+ FreeOamMatrix(sprite->oam.matrixNum);
+ DestroySprite(sprite);
+}
+
+static const s16 gUnknown_083ECE7E[][2];
+static const SpriteCallback gUnknown_083ECF0C[];
+
+u8 sub_8105BB4(u8 templateIdx, u8 cbAndCoordsIdx, s16 a2)
+{
+ return sub_8105BF8(templateIdx, gUnknown_083ECF0C[cbAndCoordsIdx], gUnknown_083ECE7E[cbAndCoordsIdx][0], gUnknown_083ECE7E[cbAndCoordsIdx][1], a2);
+}
+
+static const struct SpriteTemplate *const gUnknown_083EDB5C[];
+static const struct SubspriteTable *const gUnknown_083EDBC4[];
+
+static u8 sub_8105BF8(u8 templateIdx, SpriteCallback callback, s16 x, s16 y, s16 a4)
+{
+ u8 spriteId = CreateSprite(gUnknown_083EDB5C[templateIdx], x, y, 16);
+ struct Sprite *sprite = gSprites + spriteId;
+ sprite->oam.priority = 3;
+ sprite->callback = callback;
+ sprite->data[6] = a4;
+ sprite->data[7] = 1;
+ if (gUnknown_083EDBC4[templateIdx])
+ SetSubspriteTables(sprite, gUnknown_083EDBC4[templateIdx]);
+ return spriteId;
+}
+
+static void sub_8105C64(struct Sprite *sprite)
+{
+ sprite->data[7] = 0;
+}
+
+static void sub_8105C6C(struct Sprite *sprite)
+{
+ s16 sp0[] = {4, -4, 4, -4};
+ s16 sp8[] = {4, 4, -4, -4};
+
+ if (sprite->data[1]++ >= 16)
+ {
+ sprite->subspriteTableNum ^= 1;
+ sprite->data[1] = 0;
+ }
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ if (sprite->subspriteTableNum != 0)
+ {
+ sprite->pos2.x = sp0[sprite->data[6]];
+ sprite->pos2.y = sp8[sprite->data[6]];
+ }
+}
+
+static void sub_8105CF0(struct Sprite *sprite)
+{
+ sprite->hFlip = TRUE;
+ sub_8105C6C(sprite);
+}
+
+static void sub_8105D08(struct Sprite *sprite)
+{
+ sprite->vFlip = TRUE;
+ sub_8105C6C(sprite);
+}
+
+static void sub_8105D20(struct Sprite *sprite)
+{
+ sprite->hFlip = TRUE;
+ sprite->vFlip = TRUE;
+ sub_8105C6C(sprite);
+}
+
+static void sub_8105D3C(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->pos1.x += 4;
+ if (sprite->pos1.x >= 0xd0)
+ {
+ sprite->pos1.x = 0xd0;
+ sprite->data[0]++;
+ }
+ break;
+ case 1:
+ if (++sprite->data[1] > 90)
+ {
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ sprite->pos1.x += 4;
+ if (sprite->pos1.x >= 0x110)
+ {
+ sprite->data[0]++;
+ }
+ break;
+ case 3:
+ sprite->data[7] = 0;
+ break;
+ }
+}
+
+static void sub_8105DA4(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->pos1.x -= 4;
+ if (sprite->pos1.x <= 0xd0)
+ {
+ sprite->pos1.x = 0xd0;
+ sprite->data[0]++;
+ }
+ break;
+ case 1:
+ if (++sprite->data[1] > 90)
+ {
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ sprite->pos1.x -= 4;
+ if (sprite->pos1.x <= 0x90)
+ {
+ sprite->data[0]++;
+ }
+ break;
+ case 3:
+ sprite->data[7] = 0;
+ break;
+ }
+}
+
+static void sub_8105E08(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ StartSpriteAnim(sprite, eSlotMachine->unk0A - 1);
+ sprite->data[0]++;
+ // fallthrough
+ case 1:
+ if (++sprite->data[1] >= 4)
+ {
+ sprite->data[0]++;
+ sprite->data[1] = 0;
+ }
+ break;
+ case 2:
+ sprite->pos1.x += 4;
+ if (sprite->pos1.x >= 0xd0)
+ {
+ sprite->pos1.x = 0xd0;
+ sprite->data[0]++;
+ }
+ break;
+ case 3:
+ if (++sprite->data[1] > 90)
+ {
+ sprite->data[0]++;
+ }
+ break;
+ case 4:
+ sprite->pos1.x += 4;
+ if (sprite->pos1.x >= 0xf8)
+ {
+ sprite->data[0]++;
+ }
+ break;
+ case 5:
+ sprite->data[7] = 0;
+ break;
+ }
+}
+
+static void sub_8105EB4(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->animPaused = TRUE;
+ sprite->data[0]++;
+ // fallthrough
+ case 1:
+ sprite->pos1.y += 8;
+ if (sprite->pos1.y >= 0x70)
+ {
+ sprite->pos1.y = 0x70;
+ sprite->data[1] = 16;
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ if (sprite->data[2] == 0)
+ {
+ sprite->pos1.y -= sprite->data[1];
+ sprite->data[1] = -sprite->data[1];
+ if (++sprite->data[3] >= 2)
+ {
+ sprite->data[1] >>= 2;
+ sprite->data[3] = 0;
+ if (sprite->data[1] == 0)
+ {
+ sprite->data[0]++;
+ sprite->data[7] = 0;
+ sprite->animPaused = FALSE;
+ }
+ }
+ }
+ sprite->data[2]++;
+ sprite->data[2] &= 0x07;
+ break;
+ }
+}
+
+static void sub_8105F54(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ if (++sprite->data[1] > 8)
+ {
+ sprite->data[0]++;
+ }
+ break;
+ case 1:
+ sprite->pos1.y += 2;
+ if (sprite->pos1.y >= 0x30)
+ {
+ sprite->pos1.y = 0x30;
+ sprite->data[0]++;
+ sprite->data[7] = 0;
+ }
+ break;
+ }
+}
+
+static void sub_8105F9C(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->invisible = TRUE;
+ if (++sprite->data[1] > 0x20)
+ {
+ sprite->data[0]++;
+ sprite->data[1] = 5;
+ sprite->oam.mosaic = TRUE;
+ sprite->invisible = FALSE;
+ StartSpriteAnim(sprite, 1);
+ REG_MOSAIC = ((sprite->data[1] << 4) | sprite->data[1]) << 8;
+ }
+ break;
+ case 1:
+ sprite->data[1] -= (sprite->data[2] >> 8);
+ if (sprite->data[1] < 0)
+ {
+ sprite->data[1] = 0;
+ }
+ REG_MOSAIC = ((sprite->data[1] << 4) | sprite->data[1]) << 8;
+ sprite->data[2] &= 0xff;
+ sprite->data[2] += 0x80;
+ if (sprite->data[1] == 0)
+ {
+ sprite->data[0]++;
+ sprite->data[7] = 0;
+ sprite->oam.mosaic = FALSE;
+ StartSpriteAnim(sprite, 0);
+ }
+ break;
+ }
+}
+
+static const u16 *const gUnknown_083EDE10[];
+
+static void sub_8106058(struct Sprite *sprite)
+{
+ if (sprite->data[1] < 3)
+ {
+ LoadPalette(gUnknown_083EDE10[sprite->data[1]], (IndexOfSpritePaletteTag(6) << 4) + 0x100, 0x20);
+ if (++sprite->data[2] >= 4)
+ {
+ sprite->data[1]++;
+ sprite->data[2] = 0;
+ }
+ }
+ else
+ {
+ LoadPalette(gUnknown_083EDE10[sprite->data[1]], (IndexOfSpritePaletteTag(6) << 4) + 0x100, 0x20);
+ if (++sprite->data[2] >= 25)
+ {
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ }
+ }
+ StartSpriteAnimIfDifferent(sprite, 1);
+ sprite->data[7] = 0;
+}
+
+static void sub_81060FC(struct Sprite *sprite)
+{
+ s16 sp00[] = {0, -40, 0, 0, 48, 0, 24, 0};
+ s16 sp10[] = {-32, 0, -32, -48, 0, -48, 0, -48};
+ s16 sp20[] = {16, 12, 16, 0, 0, 4, 8, 8};
+
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->pos2.x = sp00[sprite->data[6]];
+ sprite->pos2.y = sp10[sprite->data[6]];
+ sprite->data[1] = sp20[sprite->data[6]];
+ sprite->data[0]++;
+ // fallthrough
+ case 1:
+ if (sprite->data[1]-- == 0)
+ {
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ if (sprite->pos2.x > 0)
+ {
+ sprite->pos2.x -= 4;
+ }
+ else if (sprite->pos2.x < 0)
+ {
+ sprite->pos2.x += 4;
+ }
+ if (sprite->pos2.y > 0)
+ {
+ sprite->pos2.y -= 4;
+ }
+ else if (sprite->pos2.y < 0)
+ {
+ sprite->pos2.y += 4;
+ }
+ if (sprite->pos2.x == 0 && sprite->pos2.y == 0)
+ {
+ sprite->data[0]++;
+ }
+ break;
+ }
+}
+
+static void sub_81061C8(struct Sprite *sprite)
+{
+ s16 sp0[] = {160, 192, 224, 104, 80, 64, 48, 24};
+
+ if (sprite->data[0] == 0)
+ {
+ sprite->data[0]++;
+ sprite->data[1] = 12;
+ }
+ sprite->pos2.x = Cos(sp0[sprite->data[6]], sprite->data[1]);
+ sprite->pos2.y = Sin(sp0[sprite->data[6]], sprite->data[1]);
+ if (sprite->data[1])
+ {
+ sprite->data[1]--;
+ }
+}
+
+static void sub_8106230(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ eSlotMachine->winIn = 0x2f;
+ eSlotMachine->winOut = 0x3f;
+ eSlotMachine->win0v = 0x2088;
+ sprite->invisible = TRUE;
+ sprite->data[0]++;
+ // fallthrough
+ case 1:
+ sprite->data[1] += 2;
+ sprite->data[2] = sprite->data[1] + 0xb0;
+ sprite->data[3] = 0xf0 - sprite->data[1];
+ if (sprite->data[2] > 0xd0)
+ {
+ sprite->data[2] = 0xd0;
+ }
+ if (sprite->data[3] < 0xd0)
+ {
+ sprite->data[3] = 0xd0;
+ }
+ eSlotMachine->win0h = (sprite->data[2] << 8) | sprite->data[3];
+ if (sprite->data[1] > 0x33)
+ {
+ sprite->data[0]++;
+ eSlotMachine->winIn = 0x3f;
+ }
+ break;
+ case 2:
+ if (eSlotMachine->bet == 0)
+ {
+ break;
+ }
+ sub_8104D30(5, SpriteCallbackDummy, 0xd0, 0x74, 0);
+ eSlotMachine->win0h = 0xc0e0;
+ eSlotMachine->win0v = 0x6880;
+ eSlotMachine->winIn = 0x2f;
+ sprite->data[0]++;
+ sprite->data[1] = 0;
+ // fallthrough
+ case 3:
+ sprite->data[1] += 2;
+ sprite->data[2] = sprite->data[1] + 0xc0;
+ sprite->data[3] = 0xe0 - sprite->data[1];
+ if (sprite->data[2] > 0xd0)
+ {
+ sprite->data[2] = 0xd0;
+ }
+ if (sprite->data[3] < 0xd0)
+ {
+ sprite->data[3] = 0xd0;
+ }
+ eSlotMachine->win0h = (sprite->data[2] << 8) | sprite->data[3];
+ if (sprite->data[1] > 0x0f)
+ {
+ sprite->data[0]++;
+ eSlotMachine->winIn = 0x3f;
+ }
+ break;
+ }
+}
+
+static void nullsub_70(void)
+{
+
+}
+
+static void sub_8106364(void)
+{
+ REG_MOSAIC = 0;
+}
+
+static const u16 *const gUnknown_083EDE20;
+
+static void sub_8106370(void)
+{
+ LoadPalette(gUnknown_083EDE20, (IndexOfSpritePaletteTag(6) << 4) + 0x100, 0x20);
+}
+
+static void sub_810639C(void)
+{
+ eSlotMachine->win0h = 0xf0;
+ eSlotMachine->win0v = 0xa0;
+ eSlotMachine->winIn = 0x3f;
+ eSlotMachine->winOut = 0x3f;
+}
+
+static const u8 sReelTimeGfx[];
+static const struct SpriteSheet sSlotMachineSpriteSheets[];
+static const struct SpritePalette gSlotMachineSpritePalettes[];
+
+static void sub_81063C0(void)
+{
+ sub_8106404();
+ LZDecompressWram(gSlotMachineReelTimeLights_Gfx, eSlotMachineGfxBuffer);
+ LZDecompressWram(sReelTimeGfx, eSlotMachineReelTimeGfxBuffer);
+ LoadSpriteSheets(sSlotMachineSpriteSheets);
+ LoadSpritePalettes(gSlotMachineSpritePalettes);
+}
+
+static const u8 *const gUnknown_083EDCE4;
+static const struct SpriteSheet gUnknown_083EDCDC;
+
+static void sub_8106404(void)
+{
+ u8 *dest = eSlotMachineGfxBuffer;
+ u8 i = 0;
+ const struct SpriteSheet *sheet = &gUnknown_083EDCDC;
+ const u8 *src = gUnknown_083EDCE4;
+ for (i = 0; i < 0x40; i++)
+ {
+ u8 j;
+ for (j = 0; j < 0x20; j++, dest++)
+ {
+ *dest = src[j];
+ }
+ }
+ LoadSpriteSheet(sheet);
+}
+
+static void sub_8106448(void) {
+ u32 offsetRead, offsetWrite;
+ u32 size;
+
+ LZDecompressWram(gSlotMachine_Gfx, eSlotMachineGfxBuffer);
+
+ offsetRead = (u32)eSlotMachineGfxBuffer;
+ offsetWrite = BG_VRAM;
+ size = SLOTMACHINE_GFX_TILES * 32;
+ while (TRUE)
+ {
+ DmaCopy16(3, offsetRead, (void *) (offsetWrite), 0x1000);
+ offsetRead += 0x1000;
+ offsetWrite += 0x1000;
+ size -= 0x1000;
+ if (size <= 0x1000)
+ {
+ DmaCopy16(3, offsetRead, (void *) (offsetWrite), size);
+ break;
+ }
+ }
+
+ LoadPalette(gUnknown_08E95A18, 0, 160);
+ LoadPalette(gPalette_83EDE24, 208, 32);
+}
+
+static void sub_81064B8(void) {
+ CpuCopy16(gUnknown_08E95AB8, BG_SCREEN_ADDR(29), 20 * 32 * 2);
+ LoadSlotMachineWheelOverlay();
+}
+
+static void LoadSlotMachineWheelOverlay(void) {
+ s16 x, y, dx;
+ u16 *screen;
+
+ screen = BG_SCREEN_ADDR(30);
+
+ for (x = 4; x < 18; x += 5)
+ {
+ for (dx = 0; dx < 4; dx++)
+ {
+ screen[5 * 32 + dx + x] = 0x2051;
+ screen[13 * 32 + dx + x] = 0x2851;
+ screen[6 * 32 + dx + x] = 0x2061;
+ screen[12 * 32 + dx + x] = 0x2861;
+ }
+
+ screen[6 * 32 + x] = 0x20BE;
+ screen[12 * 32 + x] = 0x28BE;
+
+ for (y = 7; y <= 11; y++)
+ {
+ screen[y * 32 + x] = 0x20BF;
+ }
+ }
+}
+
+static void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4) {
+ u16 *vram = BG_SCREEN_ADDR(29);
+
+ vram[15 * 32 + arg0] = arg1;
+ vram[15 * 32 + 1 + arg0] = arg2;
+ vram[16 * 32 + arg0] = arg3;
+ vram[16 * 32 + 1 + arg0] = arg4;
+}
+
+static void sub_81065DC(void) {
+ s16 y, x;
+ u16 *screen;
+
+ CpuCopy16(gUnknown_08E95FB8, BG_SCREEN_ADDR(29), 20 * 32 * 2);
+
+ screen = BG_SCREEN_ADDR(30);
+ for (y = 0; y < 20; y++)
+ {
+ for (x = 0; x < 30; x++)
+ {
+ screen[x + y * 32] = 0;
+ }
+ }
+}
+
+static const u8 sReelSymbols[][21] = {
+ {
+ SLOT_MACHINE_TAG_7_RED,
+ SLOT_MACHINE_TAG_CHERRY,
+ SLOT_MACHINE_TAG_AZURILL,
+ SLOT_MACHINE_TAG_REPLAY,
+ SLOT_MACHINE_TAG_POWER,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_7_BLUE,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_CHERRY,
+ SLOT_MACHINE_TAG_POWER,
+ SLOT_MACHINE_TAG_REPLAY,
+ SLOT_MACHINE_TAG_AZURILL,
+ SLOT_MACHINE_TAG_7_RED,
+ SLOT_MACHINE_TAG_POWER,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_REPLAY,
+ SLOT_MACHINE_TAG_AZURILL,
+ SLOT_MACHINE_TAG_7_BLUE,
+ SLOT_MACHINE_TAG_POWER,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_REPLAY
+ }, {
+ SLOT_MACHINE_TAG_7_RED,
+ SLOT_MACHINE_TAG_CHERRY,
+ SLOT_MACHINE_TAG_REPLAY,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_AZURILL,
+ SLOT_MACHINE_TAG_CHERRY,
+ SLOT_MACHINE_TAG_REPLAY,
+ SLOT_MACHINE_TAG_POWER,
+ SLOT_MACHINE_TAG_POWER,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_7_BLUE,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_REPLAY,
+ SLOT_MACHINE_TAG_CHERRY,
+ SLOT_MACHINE_TAG_AZURILL,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_REPLAY,
+ SLOT_MACHINE_TAG_CHERRY,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_REPLAY,
+ SLOT_MACHINE_TAG_CHERRY
+ }, {
+ SLOT_MACHINE_TAG_7_RED,
+ SLOT_MACHINE_TAG_POWER,
+ SLOT_MACHINE_TAG_7_BLUE,
+ SLOT_MACHINE_TAG_REPLAY,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_AZURILL,
+ SLOT_MACHINE_TAG_REPLAY,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_POWER,
+ SLOT_MACHINE_TAG_AZURILL,
+ SLOT_MACHINE_TAG_REPLAY,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_AZURILL,
+ SLOT_MACHINE_TAG_POWER,
+ SLOT_MACHINE_TAG_REPLAY,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_AZURILL,
+ SLOT_MACHINE_TAG_POWER,
+ SLOT_MACHINE_TAG_REPLAY,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_CHERRY
+ }
+};
+
+static const u8 gUnknown_083ECCF1[] = {
+ 1, 0, 5, 4, 3, 2
+};
+
+static const s16 gUnknown_083ECCF8[][2] = {
+ {0, 6},
+ {0, 10},
+ {0, 2}
+};
+
+static const u8 gUnknown_083ECD04[][3] = {
+ {1, 1, 12},
+ {1, 1, 14},
+ {2, 2, 14},
+ {2, 2, 14},
+ {2, 3, 16},
+ {3, 3, 16}
+};
+
+static const u8 gUnknown_083ECD16[][6] = {
+ {25, 25, 30, 40, 40, 50},
+ {25, 25, 30, 30, 35, 35},
+ {25, 25, 30, 25, 25, 30}
+};
+
+static const u8 gUnknown_083ECD28[][6] = {
+ {20, 25, 25, 20, 25, 25},
+ {12, 15, 15, 18, 19, 22},
+ {25, 25, 25, 30, 30, 40},
+ {25, 25, 20, 20, 15, 15},
+ {40, 40, 35, 35, 40, 40}
+};
+
+static const u8 gUnknown_083ECD46[][17] = {
+ {243, 243, 243, 80, 80, 80, 80, 40, 40, 40, 40, 40, 40, 5, 5, 5, 5},
+ { 5, 5, 5, 150, 150, 150, 150, 130, 130, 130, 130, 130, 130, 100, 100, 100, 5},
+ { 4, 4, 4, 20, 20, 20, 20, 80, 80, 80, 80, 80, 80, 100, 100, 100, 40},
+ { 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 45, 45, 45, 100},
+ { 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 100},
+ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6}
+};
+
+static const u8 gUnknown_083ECDAC[][17] = {
+ { 243, 243, 243, 200, 200, 200, 200, 160, 160, 160, 160, 160, 160, 70, 70, 70, 5},
+ { 5, 5, 5, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 2, 2, 2, 6},
+ { 4, 4, 4, 25, 25, 25, 25, 30, 30, 30, 30, 30, 30, 40, 40, 40, 35},
+ { 2, 2, 2, 3, 3, 3, 3, 30, 30, 30, 30, 30, 30, 100, 100, 100, 50},
+ { 1, 1, 1, 2, 2, 2, 2, 30, 30, 30, 30, 30, 30, 40, 40, 40, 100},
+ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 60}
+};
+
+static const u16 gUnknown_083ECE12[] = {
+ 0x80, 0xaf, 0xc8, 0xe1, 0x100
+};
+
+static const u16 gUnknown_083ECE1C[][2] = {
+ {10, 5},
+ {10, 10},
+ {10, 15},
+ {10, 25},
+ {10, 35}
+};
+
+static const u16 gUnknown_083ECE30[] = {
+ 0, 5, 10, 15, 20
+};
+
+
+static const u8 gUnknown_083ECE3A[] = {
+ 6, 4, 3, 2, 5, 0, 0, 0
+};
+
+static const u16 gUnknown_083ECE42[] = {
+ 0x80, 0x20, 0x40
+};
+
+static const u16 gUnknown_083ECE48[] = {
+ 0x10, 0x08, 0x04, 0x02, 0x01
+};
+
+static const u8 sSym2Match[] = {
+ SLOT_MACHINE_MATCHED_777_RED,
+ SLOT_MACHINE_MATCHED_777_BLUE,
+ SLOT_MACHINE_MATCHED_AZURILL,
+ SLOT_MACHINE_MATCHED_LOTAD,
+ SLOT_MACHINE_MATCHED_1CHERRY,
+ SLOT_MACHINE_MATCHED_POWER,
+ SLOT_MACHINE_MATCHED_REPLAY
+};
+
+static const u16 sSlotMatchFlags[] = {
+ 1 << SLOT_MACHINE_MATCHED_1CHERRY,
+ 1 << SLOT_MACHINE_MATCHED_2CHERRY,
+ 1 << SLOT_MACHINE_MATCHED_REPLAY,
+ 1 << SLOT_MACHINE_MATCHED_LOTAD,
+ 1 << SLOT_MACHINE_MATCHED_AZURILL,
+ 1 << SLOT_MACHINE_MATCHED_POWER,
+ 1 << SLOT_MACHINE_MATCHED_777_MIXED,
+ 1 << SLOT_MACHINE_MATCHED_777_RED,
+ 1 << SLOT_MACHINE_MATCHED_777_BLUE
+};
+
+static const u16 sSlotPayouts[] = {
+ 2, 4, 0, 6, 12, 3, 90, 300, 300
+};
+
+static const s16 gUnknown_083ECE7E[][2] = {
+ { 0xd0, 0x38},
+ { 0xb8, 0x00},
+ { 0xc8, 0x08},
+ { 0xd8, 0x10},
+ { 0xe8, 0x18},
+ { 0xd0, 0x48},
+ { 0xd0, 0x08},
+ { 0xd0, 0x40},
+ { 0xd0, 0x38},
+ { 0xc0, 0x58},
+ { 0xe0, 0x58},
+ { 0xc0, 0x78},
+ { 0xe0, 0x78},
+ { 0x90, 0x38},
+ {0x110, 0x58},
+ { 0xa8, 0x70},
+ { 0xd0, 0x54},
+ { 0xd0, 0x70},
+ { 0xbc, 0x34},
+ { 0xd0, 0x34},
+ { 0xe4, 0x34},
+ { 0xb8, 0x48},
+ { 0xc4, 0x48},
+ { 0xd0, 0x48},
+ { 0xdc, 0x48},
+ { 0xe8, 0x48},
+ { 0xbc, 0x34},
+ { 0xd0, 0x34},
+ { 0xe4, 0x34},
+ { 0xb8, 0x48},
+ { 0xc4, 0x48},
+ { 0xd0, 0x48},
+ { 0xdc, 0x48},
+ { 0xe8, 0x48},
+ { 0x00, 0x00}
+};
+
+static const SpriteCallback gUnknown_083ECF0C[] = {
+ sub_8105C64,
+ sub_8105F54,
+ sub_8105F54,
+ sub_8105F54,
+ sub_8105F54,
+ sub_8105F9C,
+ sub_8105EB4,
+ sub_8105C64,
+ sub_8105C64,
+ sub_8105C6C,
+ sub_8105CF0,
+ sub_8105D08,
+ sub_8105D20,
+ sub_8105D3C,
+ sub_8105DA4,
+ sub_8105E08,
+ sub_8105C64,
+ sub_8106058,
+ sub_81060FC,
+ sub_81060FC,
+ sub_81060FC,
+ sub_81060FC,
+ sub_81060FC,
+ sub_81060FC,
+ sub_81060FC,
+ sub_81060FC,
+ sub_81061C8,
+ sub_81061C8,
+ sub_81061C8,
+ sub_81061C8,
+ sub_81061C8,
+ sub_81061C8,
+ sub_81061C8,
+ sub_81061C8,
+ sub_8106230
+};
+
+static const struct UnkStruct1 Unknown_83ECF98[] = {
+ {25, 34, 0},
+ {2, 0, 0},
+ {9, 16, 0},
+ {255, 0, 0}
+};
+
+static const struct UnkStruct1 Unknown_83ECFA8[] = {
+ {10, 1, 0},
+ {11, 2, 0},
+ {12, 3, 0},
+ {13, 4, 0},
+ {5, 5, 0},
+ {8, 6, 0},
+ {255, 0, 0}
+};
+
+static const struct UnkStruct1 Unknown_83ECFC4[] = {
+ {3, 7, 0},
+ {8, 17, 0},
+ {255, 0, 0}
+};
+
+static const struct UnkStruct1 Unknown_83ECFD0[] = {
+ {4, 8, 0},
+ {6, 9, 0},
+ {6, 10, 1},
+ {6, 11, 2},
+ {6, 12, 3},
+ {255, 0, 0}
+};
+
+static const struct UnkStruct1 Unknown_83ECFE8[] = {
+ {0, 13, 0},
+ {1, 14, 0},
+ {7, 15, 0},
+ {255, 0, 0}
+};
+
+static const struct UnkStruct1 Unknown_83ECFF8[] = {
+ {19, 26, 0},
+ {20, 27, 1},
+ {21, 28, 2},
+ {14, 29, 3},
+ {15, 30, 4},
+ {16, 31, 5},
+ {17, 32, 6},
+ {18, 33, 7},
+ {8, 17, 0},
+ {255, 0, 0}
+};
+
+static const struct UnkStruct1 Unknown_83ED020[] = {
+ {22, 18, 0},
+ {23, 19, 1},
+ {24, 20, 2},
+ {14, 21, 3},
+ {15, 22, 4},
+ {16, 23, 5},
+ {17, 24, 6},
+ {18, 25, 7},
+ {8, 17, 0},
+ {255, 0, 0}
+};
+
+static const struct UnkStruct1 *const gUnknown_083ED048[] = {
+ Unknown_83ECF98,
+ Unknown_83ECFA8,
+ Unknown_83ECFC4,
+ Unknown_83ECFD0,
+ Unknown_83ECFE8,
+ Unknown_83ED020,
+ Unknown_83ECFF8
+};
+
+static void (*const gUnknown_083ED064[])(void) = {
+ sub_810639C,
+ sub_8106364,
+ sub_8106370,
+ nullsub_70,
+ nullsub_70,
+ sub_8106370,
+ sub_8106370
+};
+
+
+static const struct OamData gOamData_83ED080 = {
+ .y = 0x0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = ST_OAM_SQUARE,
+ .x = 0x0,
+ .matrixNum = 0,
+ .size = 0,
+ .tileNum = 0x0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData gOamData_83ED088 = {
+ .y = 0x0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = ST_OAM_V_RECTANGLE,
+ .x = 0x0,
+ .matrixNum = 0,
+ .size = 0,
+ .tileNum = 0x0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData gOamData_83ED090 = {
+ .y = 0x0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = ST_OAM_SQUARE,
+ .x = 0x0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0x0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData gOamData_83ED098 = {
+ .y = 0x0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = ST_OAM_V_RECTANGLE,
+ .x = 0x0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0x0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData gOamData_83ED0A0 = {
+ .y = 0x0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = ST_OAM_SQUARE,
+ .x = 0x0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0x0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData gOamData_83ED0A8 = {
+ .y = 0x0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = ST_OAM_V_RECTANGLE,
+ .x = 0x0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0x0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData gOamData_83ED0B0 = {
+ .y = 0x0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = ST_OAM_H_RECTANGLE,
+ .x = 0x0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0x0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData gOamData_83ED0B8 = {
+ .y = 0x0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = FALSE,
+ .bpp = ST_OAM_4BPP,
+ .shape = ST_OAM_SQUARE,
+ .x = 0x0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0x0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED0C0[] = {
+ {eSlotMachineReelTimeGfxBuffer + 0x0000, 0x800},
+ {eSlotMachineReelTimeGfxBuffer + 0x0800, 0x800},
+ {eSlotMachineReelTimeGfxBuffer + 0x1000, 0x800},
+ {eSlotMachineReelTimeGfxBuffer + 0x1800, 0x800},
+ {eSlotMachineReelTimeGfxBuffer + 0x2000, 0x800}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED0E8[] = {
+ {eSlotMachineReelTimeGfxBuffer + 0x2800, 0x300}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED0F0[] = {
+ {eSlotMachineReelTimeGfxBuffer + 0x2B00, 0x500}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED0F8[] = {
+ {eSlotMachineReelTimeGfxBuffer + 0x3000, 0x600}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED100[] = {
+ {gSpriteImage_8E988E8, 0x80},
+ {gSpriteImage_8E98968, 0x80},
+ {gSpriteImage_8E989E8, 0x80},
+ {gSpriteImage_8E98A68, 0x80},
+ {gSpriteImage_8E98AE8, 0x80},
+ {gSpriteImage_8E98B68, 0x80}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED130[] = {
+ {gSpriteImage_8E991E8, 0x200}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED138[] = {
+ {gSpriteImage_8E99808, 0x40}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED140[] = {
+ {gSpriteImage_8E98BE8, 0x100},
+ {gSpriteImage_8E98CE8, 0x100}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED150[] = {
+ {gSpriteImage_8E993E8, 0x400}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED158[] = {
+ {gSpriteImage_8E98DE8, 0x200},
+ {gSpriteImage_8E98FE8, 0x200}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED168[] = {
+ {gSpriteImage_8E98848, 0x20}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED170[] = {
+ {gSpriteImage_8E98868, 0x80}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED178[] = {
+ {eSlotMachineGfxBuffer + 0x0000, 0x600}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED180[] = {
+ {eSlotMachineGfxBuffer + 0x0600, 0x200}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED188[] = {
+ {eSlotMachineGfxBuffer + 0x0800, 0x200}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED190[] = {
+ {eSlotMachineGfxBuffer + 0x0A00, 0x200}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED198[] = {
+ {eSlotMachineGfxBuffer + 0x0C00, 0x300}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED1A0[] = {
+ {eSlotMachineGfxBuffer + 0x1000, 0x400}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED1A8[] = {
+ {eSlotMachineGfxBuffer + 0x1400, 0x200}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED1B0[] = {
+ {eSlotMachineGfxBuffer + 0x1600, 0x300}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED1B8[] = {
+ {eSlotMachineGfxBuffer + 0x1900, 0x300}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED1C0[] = {
+ {eSlotMachineGfxBuffer + 0x1C00, 0x200},
+ {eSlotMachineGfxBuffer + 0x1E00, 0x200},
+ {eSlotMachineGfxBuffer + 0x1E00, 0x200} // is this a typo?
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED1D8[] = {
+ {eSlotMachineGfxBuffer + 0x2000, 0x280}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED1E0[] = {
+ {eSlotMachineGfxBuffer + 0x2280, 0x80},
+ {eSlotMachineGfxBuffer + 0x2300, 0x80},
+ {eSlotMachineGfxBuffer + 0x2380, 0x80},
+ {eSlotMachineGfxBuffer + 0x2400, 0x80},
+ {eSlotMachineGfxBuffer + 0x2480, 0x80}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED208[] = {
+ {eSlotMachineGfxBuffer + 0x2600, 0x480},
+ {eSlotMachineGfxBuffer + 0x2A80, 0x480}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED218[] = {
+ {eSlotMachineGfxBuffer + 0x2F00, 0x180},
+ {eSlotMachineGfxBuffer + 0x3080, 0x180}
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_83ED228[] = {
+ {gSpriteImage_8E98828, 0x20}
+};
+
+static const union AnimCmd gSpriteAnim_83ED230[] = {
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED238[] = {
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd gSpriteAnim_83ED240[] = {
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED248[] = {
+ ANIMCMD_FRAME(1, 16),
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd gSpriteAnim_83ED254[] = {
+ ANIMCMD_FRAME(1, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd gSpriteAnim_83ED260[] = {
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd gSpriteAnim_83ED26C[] = {
+ ANIMCMD_FRAME(2, 32),
+ ANIMCMD_FRAME(3, 32),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd gSpriteAnim_83ED278[] = {
+ ANIMCMD_FRAME(4, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED280[] = {
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED288[] = {
+ ANIMCMD_FRAME(1, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED290[] = {
+ ANIMCMD_FRAME(2, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED298[] = {
+ ANIMCMD_FRAME(3, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED2A0[] = {
+ ANIMCMD_FRAME(4, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED2A8[] = {
+ ANIMCMD_FRAME(5, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED2B0[] = {
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(1, 4),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd gSpriteAnim_83ED2BC[] = {
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_FRAME(1, 16),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd gSpriteAnim_83ED2C8[] = {
+ ANIMCMD_FRAME(0, 30),
+ ANIMCMD_FRAME(1, 30),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd gSpriteAnim_83ED2D4[] = {
+ ANIMCMD_FRAME(1, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED2DC[] = {
+ ANIMCMD_FRAME(0, 30),
+ ANIMCMD_FRAME(1, 30),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd gSpriteAnim_83ED2E8[] = {
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_FRAME(1, 16),
+ ANIMCMD_FRAME(0, 16),
+ ANIMCMD_FRAME(1, 16, .hFlip = TRUE),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd gSpriteAnim_83ED2FC[] = {
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED304[] = {
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED30C[] = {
+ ANIMCMD_FRAME(1, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED314[] = {
+ ANIMCMD_FRAME(2, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED31C[] = {
+ ANIMCMD_FRAME(3, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_83ED324[] = {
+ ANIMCMD_FRAME(4, 1),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const gSpriteAnimTable_83ED32C[] = {
+ gSpriteAnim_83ED230
+};
+
+static const union AnimCmd *const gSpriteAnimTable_83ED330[] = {
+ gSpriteAnim_83ED238
+};
+
+static const union AnimCmd *const gSpriteAnimTable_83ED334[] = {
+ gSpriteAnim_83ED240,
+ gSpriteAnim_83ED248,
+ gSpriteAnim_83ED254,
+ gSpriteAnim_83ED260,
+ gSpriteAnim_83ED26C,
+ gSpriteAnim_83ED278
+};
+
+static const union AnimCmd *const gSpriteAnimTable_83ED34C[] = {
+ gSpriteAnim_83ED280,
+ gSpriteAnim_83ED288,
+ gSpriteAnim_83ED290,
+ gSpriteAnim_83ED298,
+ gSpriteAnim_83ED2A0,
+ gSpriteAnim_83ED2A8
+};
+
+static const union AnimCmd *const gSpriteAnimTable_83ED364[] = {
+ gSpriteAnim_83ED2B0
+};
+
+static const union AnimCmd *const gSpriteAnimTable_83ED368[] = {
+ gSpriteAnim_83ED2BC
+};
+
+static const union AnimCmd *const gSpriteAnimTable_83ED36C[] = {
+ gSpriteAnim_83ED2C8,
+ gSpriteAnim_83ED2D4
+};
+
+static const union AnimCmd *const gSpriteAnimTable_83ED374[] = {
+ gSpriteAnim_83ED2DC
+};
+
+static const union AnimCmd *const gSpriteAnimTable_83ED378[] = {
+ gSpriteAnim_83ED2E8,
+ gSpriteAnim_83ED2FC
+};
+
+static const union AnimCmd *const gSpriteAnimTable_83ED380[] = {
+ gSpriteAnim_83ED304,
+ gSpriteAnim_83ED30C,
+ gSpriteAnim_83ED314,
+ gSpriteAnim_83ED31C,
+ gSpriteAnim_83ED324
+};
+
+static const union AffineAnimCmd gSpriteAffineAnim_83ED394[] = {
+ AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0),
+ AFFINEANIMCMD_LOOP(0),
+ AFFINEANIMCMD_FRAME(0x1, 0x1, 0, 1),
+ AFFINEANIMCMD_LOOP(255),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd *const gSpriteAffineAnimTable_83ED3BC[] = {
+ gSpriteAffineAnim_83ED394
+};
+
+static const union AffineAnimCmd gSpriteAffineAnim_83ED3C0[] = {
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 32),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 6, 32),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 12, 2),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -12, 4),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 12, 2),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 12, 2),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -12, 4),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 12, 2),
+ AFFINEANIMCMD_END
+};
+
+static const union AffineAnimCmd *const gSpriteAffineAnimTable_83ED410[] = {
+ gSpriteAffineAnim_83ED3C0
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED414 = {
+ 0, 0, &gOamData_83ED0A0, gSpriteAnimTable_83ED32C, NULL, gDummySpriteAffineAnimTable, sub_8104F18
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED42C = {
+ 7, 4, &gOamData_83ED088, gSpriteAnimTable_83ED32C, NULL, gDummySpriteAffineAnimTable, sub_810506C
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED444 = {
+ 17, 0, &gOamData_83ED0B8, gSpriteAnimTable_83ED32C, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED45C = {
+ 0xFFFF, 1, &gOamData_83ED0B8, gSpriteAnimTable_83ED334, gSpriteImageTable_83ED0C0, gDummySpriteAffineAnimTable, sub_8105170
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED474 = {
+ 0xFFFF, 2, &gOamData_83ED088, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED0E8, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED48C = {
+ 0xFFFF, 3, &gOamData_83ED088, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED0F0, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED4A4 = {
+ 0xFFFF, 3, &gOamData_83ED088, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED0F8, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED4BC = {
+ 0xFFFF, 4, &gOamData_83ED090, gSpriteAnimTable_83ED34C, gSpriteImageTable_83ED100, gDummySpriteAffineAnimTable, sub_810535C
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED4D4 = {
+ 0xFFFF, 4, &gOamData_83ED090, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED130, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED4EC = {
+ 0xFFFF, 4, &gOamData_83ED090, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED138, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED504 = {
+ 0xFFFF, 4, &gOamData_83ED098, gSpriteAnimTable_83ED364, gSpriteImageTable_83ED140, gDummySpriteAffineAnimTable, sub_810562C
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED51C = {
+ 0xFFFF, 7, &gOamData_83ED0A8, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED150, gDummySpriteAffineAnimTable, sub_8105784
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED534 = {
+ 0xFFFF, 5, &gOamData_83ED0A0, gSpriteAnimTable_83ED368, gSpriteImageTable_83ED158, gDummySpriteAffineAnimTable, sub_8105894
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED54C = {
+ 0xFFFF, 4, &gOamData_83ED080, gSpriteAnimTable_83ED330, gSpriteImageTable_83ED168, gDummySpriteAffineAnimTable, sub_810594C
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED564 = {
+ 0xFFFF, 4, &gOamData_83ED090, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED170, gSpriteAffineAnimTable_83ED3BC, sub_8105A38
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED57C = {
+ 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED178, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED594 = {
+ 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED180, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED5AC = {
+ 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED188, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED5C4 = {
+ 18, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED190, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED5DC = {
+ 0xFFFF, 6, &gOamData_83ED0B0, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED198, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED5F4 = {
+ 0xFFFF, 6, &gOamData_83ED0B0, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1A0, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED60C = {
+ 19, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1A8, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED624 = {
+ 20, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1B0, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED63C = {
+ 21, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1B8, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED654 = {
+ 0xFFFF, 6, &gOamData_83ED0A0, gSpriteAnimTable_83ED36C, gSpriteImageTable_83ED1C0, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED66C = {
+ 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1D8, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED684 = {
+ 0xFFFF, 6, &gOamData_83ED090, gSpriteAnimTable_83ED380, gSpriteImageTable_83ED1E0, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED69C = {
+ 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED378, gSpriteImageTable_83ED208, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED6B4 = {
+ 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED374, gSpriteImageTable_83ED218, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gSpriteTemplate_83ED6CC = {
+ 0xFFFF, 4, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED228, gSpriteAffineAnimTable_83ED410, sub_8105B70
+};
+
+static const struct Subsprite gSubspriteTable_83ED6E4[] = {
+ {-64, -64, ST_OAM_SQUARE, 3, 0x0, 3},
+ {0, -64, ST_OAM_SQUARE, 3, 0x0, 3},
+ {-64, 0, ST_OAM_SQUARE, 3, 0x0, 3},
+ {0, 0, ST_OAM_SQUARE, 3, 0x0, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED704[] = {
+ {4, gSubspriteTable_83ED6E4}
+};
+
+static const struct Subsprite gSubspriteTable_83ED70C[] = {
+ {-32, -12, ST_OAM_H_RECTANGLE, 1, 0x0, 1},
+ {0, -12, ST_OAM_H_RECTANGLE, 1, 0x4, 1},
+ {-32, -4, ST_OAM_H_RECTANGLE, 1, 0x8, 1},
+ {0, -4, ST_OAM_H_RECTANGLE, 1, 0xc, 1},
+ {-32, 4, ST_OAM_H_RECTANGLE, 1, 0x10, 1},
+ {0, 4, ST_OAM_H_RECTANGLE, 1, 0x14, 1}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED73C[] = {
+ {6, gSubspriteTable_83ED70C}
+};
+
+static const struct Subsprite gSubspriteTable_83ED744[] = {
+ {-32, -20, ST_OAM_H_RECTANGLE, 3, 0x0, 1},
+ {-32, 12, ST_OAM_H_RECTANGLE, 1, 0x20, 1},
+ {0, 12, ST_OAM_H_RECTANGLE, 1, 0x24, 1}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED75C[] = {
+ {3, gSubspriteTable_83ED744}
+};
+
+static const struct Subsprite gSubspriteTable_83ED764[] = {
+ {-32, -24, ST_OAM_H_RECTANGLE, 3, 0x0, 1},
+ {-32, 8, ST_OAM_H_RECTANGLE, 1, 0x20, 1},
+ {0, 8, ST_OAM_H_RECTANGLE, 1, 0x24, 1},
+ {-32, 16, ST_OAM_H_RECTANGLE, 1, 0x28, 1},
+ {0, 16, ST_OAM_H_RECTANGLE, 1, 0x2c, 1}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED78C[] = {
+ {5, gSubspriteTable_83ED764}
+};
+
+static const struct Subsprite gSubspriteTable_83ED794[] = {
+ {-32, -8, ST_OAM_H_RECTANGLE, 1, 0x0, 1},
+ {0, -8, ST_OAM_H_RECTANGLE, 1, 0x4, 1},
+ {-32, 0, ST_OAM_H_RECTANGLE, 1, 0x8, 1},
+ {0, 0, ST_OAM_H_RECTANGLE, 1, 0xc, 1}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED7B4[] = {
+ {4, gSubspriteTable_83ED794}
+};
+
+static const struct Subsprite gSubspriteTable_83ED7BC[] = {
+ {-8, -12, ST_OAM_H_RECTANGLE, 0, 0x0, 1},
+ {-8, -4, ST_OAM_H_RECTANGLE, 0, 0x0, 1},
+ {-8, 4, ST_OAM_H_RECTANGLE, 0, 0x0, 1}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED7D4[] = {
+ {3, gSubspriteTable_83ED7BC}
+};
+
+static const struct Subsprite gSubspriteTable_83ED7DC[] = {
+ {-32, -24, ST_OAM_H_RECTANGLE, 3, 0x0, 3},
+ {-32, 8, ST_OAM_H_RECTANGLE, 1, 0x20, 3},
+ {0, 8, ST_OAM_H_RECTANGLE, 1, 0x24, 3},
+ {-32, 16, ST_OAM_H_RECTANGLE, 1, 0x28, 3},
+ {0, 16, ST_OAM_H_RECTANGLE, 1, 0x2c, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED804[] = {
+ {5, gSubspriteTable_83ED7DC}
+};
+
+static const struct Subsprite gSubspriteTable_83ED80C[] = {
+ {-32, -8, ST_OAM_H_RECTANGLE, 1, 0x0, 3},
+ {0, -8, ST_OAM_H_RECTANGLE, 1, 0x4, 3},
+ {-32, 0, ST_OAM_H_RECTANGLE, 1, 0x8, 3},
+ {0, 0, ST_OAM_H_RECTANGLE, 1, 0xc, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED82C[] = {
+ {4, gSubspriteTable_83ED80C}
+};
+
+static const struct Subsprite gSubspriteTable_83ED834[] = {
+ {-32, -8, ST_OAM_H_RECTANGLE, 1, 0x0, 3},
+ {0, -8, ST_OAM_H_RECTANGLE, 1, 0x4, 3},
+ {-32, 0, ST_OAM_H_RECTANGLE, 1, 0x8, 3},
+ {0, 0, ST_OAM_H_RECTANGLE, 1, 0xc, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED854[] = {
+ {4, gSubspriteTable_83ED834}
+};
+
+static const struct Subsprite gSubspriteTable_83ED85C[] = {
+ {-32, -8, ST_OAM_H_RECTANGLE, 1, 0x0, 3},
+ {0, -8, ST_OAM_H_RECTANGLE, 1, 0x4, 3},
+ {-32, 0, ST_OAM_H_RECTANGLE, 1, 0x8, 3},
+ {0, 0, ST_OAM_H_RECTANGLE, 1, 0xc, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED87C[] = {
+ {4, gSubspriteTable_83ED85C}
+};
+
+static const struct Subsprite gSubspriteTable_83ED884[] = {
+ {-32, -12, ST_OAM_H_RECTANGLE, 1, 0x0, 3},
+ {0, -12, ST_OAM_H_RECTANGLE, 1, 0x4, 3},
+ {-32, -4, ST_OAM_H_RECTANGLE, 1, 0x8, 3},
+ {0, -4, ST_OAM_H_RECTANGLE, 1, 0xc, 3},
+ {-32, 4, ST_OAM_H_RECTANGLE, 1, 0x10, 3},
+ {0, 4, ST_OAM_H_RECTANGLE, 1, 0x14, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED8B4[] = {
+ {6, gSubspriteTable_83ED884}
+};
+
+static const struct Subsprite gSubspriteTable_83ED8BC[] = {
+ {-16, -16, ST_OAM_SQUARE, 2, 0x0, 3}
+};
+
+static const struct Subsprite gSubspriteTable_83ED8C4[] = {
+ {-8, -8, ST_OAM_SQUARE, 1, 0x10, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED8CC[] = {
+ {1, gSubspriteTable_83ED8BC},
+ {1, gSubspriteTable_83ED8C4}
+};
+
+static const struct Subsprite gSubspriteTable_83ED8DC[] = {
+ {-24, -24, ST_OAM_H_RECTANGLE, 1, 0x0, 3},
+ {8, -24, ST_OAM_H_RECTANGLE, 0, 0x4, 3},
+ {-24, -16, ST_OAM_H_RECTANGLE, 1, 0x6, 3},
+ {8, -16, ST_OAM_H_RECTANGLE, 0, 0xa, 3},
+ {-24, -8, ST_OAM_H_RECTANGLE, 1, 0xc, 3},
+ {8, -8, ST_OAM_H_RECTANGLE, 0, 0x10, 3},
+ {-24, 0, ST_OAM_H_RECTANGLE, 1, 0x12, 3},
+ {8, 0, ST_OAM_H_RECTANGLE, 0, 0x16, 3},
+ {-24, 8, ST_OAM_H_RECTANGLE, 1, 0x18, 3},
+ {8, 8, ST_OAM_H_RECTANGLE, 0, 0x1c, 3},
+ {-24, 16, ST_OAM_H_RECTANGLE, 1, 0x1e, 3},
+ {8, 16, ST_OAM_H_RECTANGLE, 0, 0x22, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED93C[] = {
+ 12, gSubspriteTable_83ED8DC
+};
+
+static const struct Subsprite gSubspriteTable_83ED944[] = {
+ {-16, -12, ST_OAM_H_RECTANGLE, 2, 0x0, 3},
+ {-16, 4, ST_OAM_H_RECTANGLE, 0, 0x8, 3},
+ {0, 4, ST_OAM_H_RECTANGLE, 0, 0xa, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED95C[] = {
+ {3, gSubspriteTable_83ED944}
+};
+
+static const struct Subsprite gSubspriteTable_83ED964[] = {
+ {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x0, 3},
+ {-8, 0, ST_OAM_H_RECTANGLE, 0, 0x8, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED974[] = {
+ {2, gSubspriteTable_83ED964}
+};
+
+static const struct Subsprite gSubspriteTable_83ED97C[] = {
+ {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x2, 3},
+ {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xa, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED98C[] = {
+ {2, gSubspriteTable_83ED97C}
+};
+
+static const struct Subsprite gSubspriteTable_83ED994[] = {
+ {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x4, 3},
+ {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xc, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED9A4[] = {
+ {2, gSubspriteTable_83ED994}
+};
+
+static const struct Subsprite gSubspriteTable_83ED9AC[] = {
+ {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x6, 3},
+ {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xe, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED9BC[] = {
+ {2, gSubspriteTable_83ED9AC}
+};
+
+static const struct Subsprite gSubspriteTable_83ED9C4[] = {
+ {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x0, 3},
+ {-8, 0, ST_OAM_H_RECTANGLE, 0, 0x8, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED9D4[] = {
+ {2, gSubspriteTable_83ED9C4}
+};
+
+static const struct Subsprite gSubspriteTable_83ED9DC[] = {
+ {-4, -8, ST_OAM_SQUARE, 0, 0x2, 3},
+ {-4, 0, ST_OAM_SQUARE, 0, 0xa, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83ED9EC[] = {
+ {2, gSubspriteTable_83ED9DC}
+};
+
+static const struct Subsprite gSubspriteTable_83ED9F4[] = {
+ {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x3, 3},
+ {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xb, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83EDA04[] = {
+ {2, gSubspriteTable_83ED9F4}
+};
+
+static const struct Subsprite gSubspriteTable_83EDA0C[] = {
+ {-4, -8, ST_OAM_SQUARE, 0, 0x5, 3},
+ {-4, 0, ST_OAM_SQUARE, 0, 0xd, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83EDA1C[] = {
+ {2, gSubspriteTable_83EDA0C}
+};
+
+static const struct Subsprite gSubspriteTable_83EDA24[] = {
+ {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x6, 3},
+ {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xe, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83EDA34[] = {
+ {2, gSubspriteTable_83EDA24}
+};
+
+static const struct Subsprite gSubspriteTable_83EDA3C[] = {
+ {-12, -12, ST_OAM_H_RECTANGLE, 0, 0x0, 3},
+ {4, -12, ST_OAM_SQUARE, 0, 0x2, 3},
+ {-12, -4, ST_OAM_H_RECTANGLE, 0, 0x8, 3},
+ {4, -4, ST_OAM_SQUARE, 0, 0xa, 3},
+ {-12, 4, ST_OAM_H_RECTANGLE, 0, 0x10, 3},
+ {4, 4, ST_OAM_SQUARE, 0, 0x12, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83EDA6C[] = {
+ {6, gSubspriteTable_83EDA3C}
+};
+
+static const struct Subsprite gSubspriteTable_83EDA74[] = {
+ {-8, -12, ST_OAM_H_RECTANGLE, 0, 0x3, 3},
+ {-8, -4, ST_OAM_H_RECTANGLE, 0, 0xb, 3},
+ {-8, 4, ST_OAM_H_RECTANGLE, 0, 0x13, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83EDA8C[] = {
+ {3, gSubspriteTable_83EDA74}
+};
+
+static const struct Subsprite gSubspriteTable_83EDA94[] = {
+ {-12, -12, ST_OAM_H_RECTANGLE, 0, 0x5, 3},
+ {4, -12, ST_OAM_SQUARE, 0, 0x7, 3},
+ {-12, -4, ST_OAM_H_RECTANGLE, 0, 0xd, 3},
+ {4, -4, ST_OAM_SQUARE, 0, 0xf, 3},
+ {-12, 4, ST_OAM_H_RECTANGLE, 0, 0x15, 3},
+ {4, 4, ST_OAM_SQUARE, 0, 0x17, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83EDAC4[] = {
+ {6, gSubspriteTable_83EDA94}
+};
+
+static const struct Subsprite gSubspriteTable_83EDACC[] = {
+ {-12, -12, ST_OAM_H_RECTANGLE, 0, 0x0, 3},
+ {4, -12, ST_OAM_SQUARE, 0, 0x2, 3},
+ {-12, -4, ST_OAM_H_RECTANGLE, 0, 0x8, 3},
+ {4, -4, ST_OAM_SQUARE, 0, 0xa, 3},
+ {-12, 4, ST_OAM_H_RECTANGLE, 0, 0x10, 3},
+ {4, 4, ST_OAM_SQUARE, 0, 0x12, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83EDAFC[] = {
+ {6, gSubspriteTable_83EDACC}
+};
+
+static const struct Subsprite gSubspriteTable_83EDB04[] = {
+ {-8, -12, ST_OAM_H_RECTANGLE, 0, 0x3, 3},
+ {-8, -4, ST_OAM_H_RECTANGLE, 0, 0xb, 3},
+ {-8, 4, ST_OAM_H_RECTANGLE, 0, 0x13, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83EDB1C[] = {
+ {3, gSubspriteTable_83EDB04}
+};
+
+static const struct Subsprite gSubspriteTable_83EDB24[] = {
+ {-12, -12, ST_OAM_H_RECTANGLE, 0, 0x5, 3},
+ {4, -12, ST_OAM_SQUARE, 0, 0x7, 3},
+ {-12, -4, ST_OAM_H_RECTANGLE, 0, 0xd, 3},
+ {4, -4, ST_OAM_SQUARE, 0, 0xf, 3},
+ {-12, 4, ST_OAM_H_RECTANGLE, 0, 0x15, 3},
+ {4, 4, ST_OAM_SQUARE, 0, 0x17, 3}
+};
+
+static const struct SubspriteTable gSubspriteTables_83EDB54[] = {
+ {6, gSubspriteTable_83EDB24}
+};
+
+static const struct SpriteTemplate *const gUnknown_083EDB5C[] = {
+ &gSpriteTemplate_83ED57C,
+ &gSpriteTemplate_83ED594,
+ &gSpriteTemplate_83ED5AC,
+ &gSpriteTemplate_83ED5DC,
+ &gSpriteTemplate_83ED5F4,
+ &gSpriteTemplate_83ED654,
+ &gSpriteTemplate_83ED66C,
+ &gSpriteTemplate_83ED684,
+ &gSpriteTemplate_83ED69C,
+ &gSpriteTemplate_83ED6B4,
+ &gSpriteTemplate_83ED5C4,
+ &gSpriteTemplate_83ED5C4,
+ &gSpriteTemplate_83ED5C4,
+ &gSpriteTemplate_83ED5C4,
+ &gSpriteTemplate_83ED60C,
+ &gSpriteTemplate_83ED60C,
+ &gSpriteTemplate_83ED60C,
+ &gSpriteTemplate_83ED60C,
+ &gSpriteTemplate_83ED60C,
+ &gSpriteTemplate_83ED624,
+ &gSpriteTemplate_83ED624,
+ &gSpriteTemplate_83ED624,
+ &gSpriteTemplate_83ED63C,
+ &gSpriteTemplate_83ED63C,
+ &gSpriteTemplate_83ED63C,
+ &gDummySpriteTemplate
+};
+
+static const struct SubspriteTable *const gUnknown_083EDBC4[] = {
+ gSubspriteTables_83ED804,
+ gSubspriteTables_83ED82C,
+ gSubspriteTables_83ED854,
+ gSubspriteTables_83ED8B4,
+ NULL,
+ NULL,
+ gSubspriteTables_83ED8CC,
+ NULL,
+ gSubspriteTables_83ED93C,
+ gSubspriteTables_83ED95C,
+ gSubspriteTables_83ED974,
+ gSubspriteTables_83ED98C,
+ gSubspriteTables_83ED9A4,
+ gSubspriteTables_83ED9BC,
+ gSubspriteTables_83ED9D4,
+ gSubspriteTables_83ED9EC,
+ gSubspriteTables_83EDA04,
+ gSubspriteTables_83EDA1C,
+ gSubspriteTables_83EDA34,
+ gSubspriteTables_83EDA6C,
+ gSubspriteTables_83EDA8C,
+ gSubspriteTables_83EDAC4,
+ gSubspriteTables_83EDAFC,
+ gSubspriteTables_83EDB1C,
+ gSubspriteTables_83EDB54,
+ NULL
+};
+
+static const struct SpriteSheet sSlotMachineSpriteSheets[] = {
+ {gSlotMachineReelSymbol1Tiles, 0x200, 0},
+ {gSlotMachineReelSymbol2Tiles, 0x200, 1},
+ {gSlotMachineReelSymbol3Tiles, 0x200, 2},
+ {gSlotMachineReelSymbol4Tiles, 0x200, 3},
+ {gSlotMachineReelSymbol5Tiles, 0x200, 4},
+ {gSlotMachineReelSymbol6Tiles, 0x200, 5},
+ {gSlotMachineReelSymbol7Tiles, 0x200, 6},
+ {gSlotMachineNumber0Tiles, 0x40, 7},
+ {gSlotMachineNumber1Tiles, 0x40, 8},
+ {gSlotMachineNumber2Tiles, 0x40, 9},
+ {gSlotMachineNumber3Tiles, 0x40, 10},
+ {gSlotMachineNumber4Tiles, 0x40, 11},
+ {gSlotMachineNumber5Tiles, 0x40, 12},
+ {gSlotMachineNumber6Tiles, 0x40, 13},
+ {gSlotMachineNumber7Tiles, 0x40, 14},
+ {gSlotMachineNumber8Tiles, 0x40, 15},
+ {gSlotMachineNumber9Tiles, 0x40, 16},
+ {eSlotMachineGfxBuffer + 0x0A00, 0x200, 18},
+ {eSlotMachineGfxBuffer + 0x1400, 0x200, 19},
+ {eSlotMachineGfxBuffer + 0x1600, 0x300, 20},
+ {eSlotMachineGfxBuffer + 0x1900, 0x300, 21},
+ {}
+};
+
+static const struct SpriteSheet gUnknown_083EDCDC = {
+ eSlotMachineGfxBuffer + 0x0000, 0x800, 17
+};
+
+static const u8 *const gUnknown_083EDCE4 = gUnknownPalette_08E997E8;
+
+#ifdef SAPPHIRE
+static const u16 UnknownPalette_83EDCE8[] = INCBIN_U16("graphics/unknown/sapphire_83EDD40.gbapal");
+#elif defined(RUBY)
+static const u16 UnknownPalette_83EDCE8[] = INCBIN_U16("graphics/unknown/ruby_83EDCE8.gbapal");
+#endif // RS
+
+static const u16 *const gUnknown_083EDD08[] = {
+ UnknownPalette_83EDCE8 + 10,
+ UnknownPalette_83EDCE8 + 11,
+ UnknownPalette_83EDCE8 + 12,
+ UnknownPalette_83EDCE8 + 13,
+ UnknownPalette_83EDCE8 + 14
+};
+
+static const u16 *const gUnknown_083EDD1C[] = {
+ gUnknown_08E95A18 + 74,
+ gUnknown_08E95A18 + 75,
+ gUnknown_08E95A18 + 76,
+ gUnknown_08E95A18 + 77,
+ gUnknown_08E95A18 + 78
+};
+
+static const u8 gUnknown_083EDD30[] = {
+ 0x4a, 0x4b, 0x4c, 0x4e, 0x4d
+};
+
+static const u8 gUnknown_083EDD35[][2] = {
+ {0, 0},
+ {1, 2},
+ {3, 4}
+};
+static const u8 gUnknown_083EDD3B[] = {1, 2, 2};
+
+#ifdef SAPPHIRE
+static const u16 Unknown_83EDD3E[] = INCBIN_U16("graphics/unknown/sapphire_83EDD96.gbapal");
+static const u16 Unknown_83EDD5E[] = INCBIN_U16("graphics/unknown/sapphire_83EDDB6.gbapal");
+static const u16 Unknown_83EDD7E[] = INCBIN_U16("graphics/unknown/sapphire_83EDDD6.gbapal");
+#elif defined (RUBY)
+static const u16 Unknown_83EDD3E[] = INCBIN_U16("graphics/unknown/ruby_83EDD3E.gbapal");
+static const u16 Unknown_83EDD5E[] = INCBIN_U16("graphics/unknown/ruby_83EDD5E.gbapal");
+static const u16 Unknown_83EDD7E[] = INCBIN_U16("graphics/unknown/ruby_83EDD7E.gbapal");
+#endif // RS
+
+static const u16 *const gUnknown_083EDDA0[] = {
+ Unknown_83EDD3E,
+ Unknown_83EDD5E,
+ Unknown_83EDD7E
+};
+
+static const u16 *const gUnknown_083EDDAC = gUnknown_08E95A18 + 16;
+
+static const u16 Palette_83EDDB0[] = INCBIN_U16("graphics/slot_machine/83EDDB0.gbapal");
+static const u16 Palette_83EDDD0[] = INCBIN_U16("graphics/slot_machine/83EDDD0.gbapal");
+static const u16 Palette_83EDDF0[] = INCBIN_U16("graphics/slot_machine/83EDDF0.gbapal");
+
+static const u16 *const gUnknown_083EDE10[] = {
+ Palette_83EDDB0,
+ Palette_83EDDD0,
+ Palette_83EDDF0,
+ gSlotMachineSpritePalette6
+};
+
+static const u16 *const gUnknown_083EDE20 = gSlotMachineSpritePalette6;
+
+static const u16 gPalette_83EDE24[] = INCBIN_U16("graphics/slot_machine/83EDE24_pal.bin");
+
+static const struct SpritePalette gSlotMachineSpritePalettes[] = {
+ {gSlotMachineSpritePalette0, 0},
+ {gSlotMachineSpritePalette1, 1},
+ {gSlotMachineSpritePalette2, 2},
+ {gSlotMachineSpritePalette3, 3},
+ {gSlotMachineSpritePalette4, 4},
+ {gSlotMachineSpritePalette5, 5},
+ {gSlotMachineSpritePalette6, 6},
+ {gSlotMachineSpritePalette4, 7},
+ {}
+};
+
+static const u8 sReelTimeGfx[] = INCBIN_U8("graphics/slot_machine/reel_time.4bpp.lz");
+
+static const u16 sReelTimeWindowTilemap[] = INCBIN_U16("graphics/slot_machine/reel_time_window_map.bin");
diff --git a/src/start_menu.c b/src/field/start_menu.c
index 411690aff..dccf1714e 100644
--- a/src/start_menu.c
+++ b/src/field/start_menu.c
@@ -15,12 +15,12 @@
#include "pokedex.h"
#include "pokemon_menu.h"
#include "pokenav.h"
-#include "rom4.h"
+#include "overworld.h"
#include "safari_zone.h"
#include "save.h"
#include "save_menu_util.h"
#include "script.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "sprite.h"
#include "string_util.h"
@@ -50,7 +50,7 @@ static bool8 savingComplete;
extern bool8 gDifferentSaveFile;
extern u16 gSaveFileStatus;
-extern u16 gScriptResult;
+extern u16 gSpecialVar_Result;
extern u8 gUnknown_03004860;
@@ -154,12 +154,12 @@ static void AddStartMenuAction(u8 action)
static void BuildStartMenuActions_Normal(void)
{
- if (FlagGet(SYS_POKEDEX_GET) == TRUE)
+ if (FlagGet(FLAG_SYS_POKEDEX_GET) == TRUE)
AddStartMenuAction(MENU_ACTION_POKEDEX);
- if (FlagGet(SYS_POKEMON_GET) == TRUE)
+ if (FlagGet(FLAG_SYS_POKEMON_GET) == TRUE)
AddStartMenuAction(MENU_ACTION_POKEMON);
AddStartMenuAction(MENU_ACTION_BAG);
- if (FlagGet(SYS_POKENAV_GET) == TRUE)
+ if (FlagGet(FLAG_SYS_POKENAV_GET) == TRUE)
AddStartMenuAction(MENU_ACTION_POKENAV);
AddStartMenuAction(MENU_ACTION_PLAYER);
AddStartMenuAction(MENU_ACTION_SAVE);
@@ -182,7 +182,7 @@ static void BuildStartMenuActions_Link(void)
{
AddStartMenuAction(MENU_ACTION_POKEMON);
AddStartMenuAction(MENU_ACTION_BAG);
- if (FlagGet(SYS_POKENAV_GET) == TRUE)
+ if (FlagGet(FLAG_SYS_POKENAV_GET) == TRUE)
AddStartMenuAction(MENU_ACTION_POKENAV);
AddStartMenuAction(MENU_ACTION_PLAYER_LINK);
AddStartMenuAction(MENU_ACTION_OPTION);
@@ -505,7 +505,7 @@ static u8 RunSaveDialogCallback(void)
return saveDialogCallback();
}
-void InitSaveDialog(void)
+void ScrSpecial_DoSaveDialog(void)
{
sub_807160C();
CreateTask(Task_SaveDialog, 0x50);
@@ -515,7 +515,7 @@ static void DisplaySaveMessageWithCallback(const u8 *ptr, u8 (*func)(void))
{
StringExpandPlaceholders(gStringVar4, ptr);
MenuDisplayMessageBox();
- sub_8072044(gStringVar4);
+ MenuPrintMessageDefaultCoords(gStringVar4);
savingComplete = TRUE;
saveDialogCallback = func;
}
@@ -528,10 +528,10 @@ static void Task_SaveDialog(u8 taskId)
{
case SAVE_CANCELED:
case SAVE_ERROR:
- gScriptResult = 0;
+ gSpecialVar_Result = 0;
break;
case SAVE_SUCCESS:
- gScriptResult = status;
+ gSpecialVar_Result = status;
break;
case SAVE_IN_PROGRESS:
return;
diff --git a/src/starter_choose.c b/src/field/starter_choose.c
index 2b28df4f0..701d4087a 100644
--- a/src/starter_choose.c
+++ b/src/field/starter_choose.c
@@ -6,9 +6,9 @@
#include "menu.h"
#include "palette.h"
#include "pokedex.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
-#include "species.h"
+#include "constants/species.h"
#include "sprite.h"
#include "string_util.h"
#include "strings.h"
@@ -16,7 +16,7 @@
#include "trig.h"
#include "unknown_task.h"
-extern u16 gScriptResult;
+extern u16 gSpecialVar_Result;
extern struct SpriteTemplate gUnknown_02024E8C;
//--------------------------------------------------
@@ -324,24 +324,24 @@ void CB2_ChooseStarter(void)
//Create hand sprite
spriteId = CreateSprite(&gSpriteTemplate_83F77CC, 120, 56, 2);
- gSprites[spriteId].data0 = taskId;
+ gSprites[spriteId].data[0] = taskId;
//Create three Pokeball sprites
spriteId = CreateSprite(
&gSpriteTemplate_83F77E4,
gStarterChoose_PokeballCoords[0][0], gStarterChoose_PokeballCoords[0][1], 2);
- gSprites[spriteId].data0 = taskId;
- gSprites[spriteId].data1 = 0;
+ gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].data[1] = 0;
spriteId = CreateSprite(
&gSpriteTemplate_83F77E4,
gStarterChoose_PokeballCoords[1][0], gStarterChoose_PokeballCoords[1][1], 2);
- gSprites[spriteId].data0 = taskId;
- gSprites[spriteId].data1 = 1;
+ gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].data[1] = 1;
spriteId = CreateSprite(
&gSpriteTemplate_83F77E4,
gStarterChoose_PokeballCoords[2][0], gStarterChoose_PokeballCoords[2][1], 2);
- gSprites[spriteId].data0 = taskId;
- gSprites[spriteId].data1 = 2;
+ gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].data[1] = 2;
}
static void MainCallback2(void)
@@ -439,7 +439,7 @@ static void Task_StarterChoose5(u8 taskId)
{
case 0: // YES
//Return the starter choice and exit.
- gScriptResult = gTasks[taskId].tStarterSelection;
+ gSpecialVar_Result = gTasks[taskId].tStarterSelection;
SetMainCallback2(gMain.savedCallback);
break;
case 1: // NO
@@ -727,16 +727,16 @@ static u8 CreatePokemonFrontSprite(u16 species, u8 x, u8 y)
//Sprite callback
static void sub_810A62C(struct Sprite *sprite)
{
- sprite->pos1.x = gUnknown_083F76E4[gTasks[sprite->data0].tStarterSelection][0];
- sprite->pos1.y = gUnknown_083F76E4[gTasks[sprite->data0].tStarterSelection][1];
- sprite->pos2.y = Sin(sprite->data1, 8);
- sprite->data1 = (u8)sprite->data1 + 4;
+ sprite->pos1.x = gUnknown_083F76E4[gTasks[sprite->data[0]].tStarterSelection][0];
+ sprite->pos1.y = gUnknown_083F76E4[gTasks[sprite->data[0]].tStarterSelection][1];
+ sprite->pos2.y = Sin(sprite->data[1], 8);
+ sprite->data[1] = (u8)sprite->data[1] + 4;
}
//Sprite callback
static void sub_810A68C(struct Sprite *sprite)
{
- if (gTasks[sprite->data0].tStarterSelection == sprite->data1)
+ if (gTasks[sprite->data[0]].tStarterSelection == sprite->data[1])
StartSpriteAnimIfDifferent(sprite, 1);
else
StartSpriteAnimIfDifferent(sprite, 0);
diff --git a/src/trader.c b/src/field/trader.c
index ea06058e9..61cb0b4a2 100644
--- a/src/trader.c
+++ b/src/field/trader.c
@@ -1,12 +1,14 @@
#include "global.h"
+#include "constants/decorations.h"
#include "decoration.h"
#include "decoration_inventory.h"
#include "event_data.h"
#include "main.h"
+#include "mauville_man.h"
#include "menu.h"
#include "menu_helpers.h"
#include "script.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "string_util.h"
#include "strings.h"
@@ -36,7 +38,7 @@ void sub_810993C(void)
{
u8 i, j;
u8 buffer[12];
- struct MauvilleOldManTrader *trader = &gSaveBlock1.oldMan.trader;
+ struct MauvilleManTrader *trader = &gSaveBlock1.mauvilleMan.trader;
for (i = 0; i < 3; i++)
{
@@ -55,13 +57,13 @@ void sub_810993C(void)
}
}
-void sub_81099CC(void)
+void TraderSetup(void)
{
u8 i;
- struct MauvilleOldManTrader *trader = &gSaveBlock1.oldMan.trader;
+ struct MauvilleManTrader *trader = &gSaveBlock1.mauvilleMan.trader;
- trader->unk0 = 2;
- trader->unk31 = 0;
+ trader->id = MAUVILLE_MAN_TRADER;
+ trader->alreadyTraded = FALSE;
for (i = 0; i < 4; i++)
{
@@ -74,8 +76,8 @@ void sub_81099CC(void)
void sub_8109A20(void)
{
- struct MauvilleOldManTrader *trader = &gSaveBlock1.oldMan.trader;
- trader->unk31 = 0;
+ struct MauvilleManTrader *trader = &gSaveBlock1.mauvilleMan.trader;
+ trader->alreadyTraded = FALSE;
}
void sub_8109A30(u8 value)
@@ -83,12 +85,12 @@ void sub_8109A30(u8 value)
VarSet(VAR_RECYCLE_GOODS, value);
}
-void sub_8109A48(u8 taskId)
+void CreateAvailableDecorationsMenu(u8 taskId)
{
u8 i;
u8 numChoices = 1;
u8 numDecorations = 0;
- struct MauvilleOldManTrader *trader = &gSaveBlock1.oldMan.trader;
+ struct MauvilleManTrader *trader = &gSaveBlock1.mauvilleMan.trader;
for (i = 0; i < 4; i++)
{
@@ -139,9 +141,9 @@ void sub_8109B34(u8 taskId, u8 decorationId)
EnableBothScriptContexts();
}
-void sub_8109B7C(u8 taskId)
+void Task_HandleGetDecorationMenuInput(u8 taskId)
{
- struct MauvilleOldManTrader *trader = &gSaveBlock1.oldMan.trader;
+ struct MauvilleManTrader *trader = &gSaveBlock1.mauvilleMan.trader;
if (gMain.newKeys & DPAD_UP)
{
@@ -174,13 +176,13 @@ void sub_8109B7C(u8 taskId)
}
}
-void sub_8109C44(void)
+void ScrSpecial_GetTraderTradedFlag(void)
{
- struct MauvilleOldManTrader *trader = &gSaveBlock1.oldMan.trader;
- gScriptResult = trader->unk31;
+ struct MauvilleManTrader *trader = &gSaveBlock1.mauvilleMan.trader;
+ gSpecialVar_Result = trader->alreadyTraded;
}
-void sub_8109C58(void)
+void ScrSpecial_DoesPlayerHaveNoDecorations(void)
{
u8 i;
@@ -188,25 +190,25 @@ void sub_8109C58(void)
{
if (sub_8134194(i))
{
- gScriptResult = FALSE;
+ gSpecialVar_Result = FALSE;
return;
}
}
- gScriptResult = TRUE;
+ gSpecialVar_Result = TRUE;
}
-void sub_8109C90(void)
+void ScrSpecial_IsDecorationFull(void)
{
- gScriptResult = FALSE;
+ gSpecialVar_Result = FALSE;
if (gDecorations[gSpecialVar_0x8004].category != gDecorations[gSpecialVar_0x8006].category
&& sub_8133F9C(gDecorations[gSpecialVar_0x8004].category) == -1)
{
sub_80FE7D4(gStringVar2, gDecorations[gSpecialVar_0x8004].category);
- gScriptResult = TRUE;
+ gSpecialVar_Result = TRUE;
}
}
-void sub_8109CF0(void)
+void ScrSpecial_TraderMenuGiveDecoration(void)
{
CreateTask(sub_80FE7A8, 0);
}
@@ -242,20 +244,20 @@ void sub_8109DAC(u8 taskId)
EnableBothScriptContexts();
}
-void sub_8109DE0(void)
+void ScrSpecial_TraderDoDecorationTrade(void)
{
- struct MauvilleOldManTrader *trader = &gSaveBlock1.oldMan.trader;
+ struct MauvilleManTrader *trader = &gSaveBlock1.mauvilleMan.trader;
sub_81340A8(gSpecialVar_0x8006);
IsThereStorageSpaceForDecoration(gSpecialVar_0x8004);
StringCopy(trader->unk5[gSpecialVar_0x8005], gSaveBlock2.playerName);
trader->unk1[gSpecialVar_0x8005] = gSpecialVar_0x8006;
sub_810993C();
- trader->unk31 = 1;
+ trader->alreadyTraded = TRUE;
}
-void sub_8109E34(void)
+void ScrSpecial_TraderMenuGetDecoration(void)
{
- u8 taskId = CreateTask(sub_8109B7C, 0);
- sub_8109A48(taskId);
+ u8 taskId = CreateTask(Task_HandleGetDecorationMenuInput, 0);
+ CreateAvailableDecorationsMenu(taskId);
}
diff --git a/src/field/trainer_see.c b/src/field/trainer_see.c
new file mode 100644
index 000000000..3034b2b65
--- /dev/null
+++ b/src/field/trainer_see.c
@@ -0,0 +1,559 @@
+#include "global.h"
+#include "trainer_see.h"
+#include "battle_setup.h"
+#include "field_effect.h"
+#include "field_map_obj.h"
+#include "field_player_avatar.h"
+#include "script.h"
+#include "sprite.h"
+#include "task.h"
+#include "util.h"
+
+static bool8 CheckTrainer(u8);
+static void sub_8084894(struct Sprite *sprite, u16 a2, u8 a3);
+static void objc_exclamation_mark_probably(struct Sprite *sprite);
+static bool8 TrainerCanApproachPlayer(struct MapObject *);
+static void sub_80842C8(struct MapObject *, u8);
+static bool8 CheckPathBetweenTrainerAndPlayer(struct MapObject *trainerObj, u8 approachDistance, u8 direction);
+static void RunTrainerSeeFuncList(u8 taskId);
+
+const u8 gSpriteImage_839B308[] = INCBIN_U8("graphics/unknown_sprites/839B4E0/0.4bpp");
+const u8 gSpriteImage_839B388[] = INCBIN_U8("graphics/unknown_sprites/839B4E0/1.4bpp");
+const u8 gSpriteImage_839B408[] = INCBIN_U8("graphics/unknown_sprites/839B408.4bpp");
+
+static u8 GetTrainerApproachDistanceSouth(struct MapObject *trainerObj, s16 range, s16 x, s16 y);
+static u8 GetTrainerApproachDistanceNorth(struct MapObject *trainerObj, s16 range, s16 x, s16 y);
+static u8 GetTrainerApproachDistanceWest(struct MapObject *trainerObj, s16 range, s16 x, s16 y);
+static u8 GetTrainerApproachDistanceEast(struct MapObject *trainerObj, s16 range, s16 x, s16 y);
+
+static u8 (*const sDirectionalApproachDistanceFuncs[])(struct MapObject *, s16, s16, s16) =
+{
+ GetTrainerApproachDistanceSouth,
+ GetTrainerApproachDistanceNorth,
+ GetTrainerApproachDistanceWest,
+ GetTrainerApproachDistanceEast,
+};
+
+bool8 CheckTrainers(void)
+{
+ u8 mapObjId;
+
+ for (mapObjId = 0; mapObjId < 16; mapObjId++)
+ {
+ if (gMapObjects[mapObjId].active
+ && (gMapObjects[mapObjId].trainerType == 1 || gMapObjects[mapObjId].trainerType == 3)
+ && CheckTrainer(mapObjId))
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool8 CheckTrainer(u8 mapObjId)
+{
+ u8 *scriptPtr = GetFieldObjectScriptPointerByFieldObjectId(mapObjId);
+
+ if (GetTrainerFlagFromScriptPointer(scriptPtr))
+ {
+ return FALSE;
+ }
+ else
+ {
+ struct MapObject *trainerObj = &gMapObjects[mapObjId];
+ bool8 canApproach = TrainerCanApproachPlayer(trainerObj);
+
+ if (canApproach)
+ {
+ TrainerWantsBattle(mapObjId, scriptPtr);
+ sub_80842C8(trainerObj, (canApproach - 1));
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+ }
+}
+
+static bool8 TrainerCanApproachPlayer(struct MapObject *trainerObj)
+{
+ s16 x, y;
+ u8 i;
+ u8 approachDistance;
+
+ PlayerGetDestCoords(&x, &y);
+ if (trainerObj->trainerType == 1) // can only see in one direction
+ {
+ approachDistance = sDirectionalApproachDistanceFuncs[trainerObj->mapobj_unk_18 - 1](trainerObj, trainerObj->trainerRange_berryTreeId, x, y);
+ return CheckPathBetweenTrainerAndPlayer(trainerObj, approachDistance, trainerObj->mapobj_unk_18);
+ }
+ else // can see in all directions
+ {
+ for (i = 0; i < 4; i++)
+ {
+ approachDistance = sDirectionalApproachDistanceFuncs[i](trainerObj, trainerObj->trainerRange_berryTreeId, x, y);
+ if (CheckPathBetweenTrainerAndPlayer(trainerObj, approachDistance, i + 1)) // directions are 1-4 instead of 0-3. south north west east
+ return approachDistance;
+ }
+ }
+ return FALSE;
+}
+
+// Returns how far south the player is from trainer. 0 if out of trainer's sight.
+static u8 GetTrainerApproachDistanceSouth(struct MapObject *trainerObj, s16 range, s16 x, s16 y)
+{
+ if (trainerObj->coords2.x == x
+ && y > trainerObj->coords2.y
+ && y <= trainerObj->coords2.y + range)
+ return (y - trainerObj->coords2.y);
+ else
+ return 0;
+}
+
+// Returns how far north the player is from trainer. 0 if out of trainer's sight.
+static u8 GetTrainerApproachDistanceNorth(struct MapObject *trainerObj, s16 range, s16 x, s16 y)
+{
+ if (trainerObj->coords2.x == x
+ && y < trainerObj->coords2.y
+ && y >= trainerObj->coords2.y - range)
+ return (trainerObj->coords2.y - y);
+ else
+ return 0;
+}
+
+// Returns how far west the player is from trainer. 0 if out of trainer's sight.
+static u8 GetTrainerApproachDistanceWest(struct MapObject *trainerObj, s16 range, s16 x, s16 y)
+{
+ if (trainerObj->coords2.y == y
+ && x < trainerObj->coords2.x
+ && x >= trainerObj->coords2.x - range)
+ return (trainerObj->coords2.x - x);
+ else
+ return 0;
+}
+
+// Returns how far east the player is from trainer. 0 if out of trainer's sight.
+static u8 GetTrainerApproachDistanceEast(struct MapObject *trainerObj, s16 range, s16 x, s16 y)
+{
+ if (trainerObj->coords2.y == y
+ && x > trainerObj->coords2.x
+ && x <= trainerObj->coords2.x + range)
+ return (x - trainerObj->coords2.x);
+ else
+ return 0;
+}
+
+#ifdef BUGFIX_TRAINERAPPROACH
+#define COLLISION_MASK ~1
+#else
+#define COLLISION_MASK 1
+#endif
+
+static bool8 CheckPathBetweenTrainerAndPlayer(struct MapObject *trainerObj, u8 approachDistance, u8 direction)
+{
+ s16 x, y;
+ u8 unk19_temp;
+ u8 unk19b_temp;
+ u8 i;
+ u8 collision;
+
+ if (approachDistance == 0)
+ return FALSE;
+
+ x = trainerObj->coords2.x;
+ y = trainerObj->coords2.y;
+
+ for (i = 0; i <= approachDistance - 1; i++, MoveCoords(direction, &x, &y))
+ {
+ collision = sub_8060024(trainerObj, x, y, direction);
+ if (collision != 0 && (collision & COLLISION_MASK))
+ return FALSE;
+ }
+
+ // preserve mapobj_unk_19 before clearing.
+ unk19_temp = trainerObj->range.as_nybbles.x;
+ unk19b_temp = trainerObj->range.as_nybbles.y;
+ trainerObj->range.as_nybbles.x = 0;
+ trainerObj->range.as_nybbles.y = 0;
+
+ collision = npc_block_way((struct MapObject *)trainerObj, x, y, direction);
+
+ trainerObj->range.as_nybbles.x = unk19_temp;
+ trainerObj->range.as_nybbles.y = unk19b_temp;
+ if (collision == 4)
+ return approachDistance;
+
+ return FALSE;
+}
+
+#define tTrainerObjHi data[1]
+#define tTrainerObjLo data[2]
+
+static void sub_80842C8(struct MapObject *trainerObj, u8 b)
+{
+ u8 taskId = CreateTask(RunTrainerSeeFuncList, 0x50);
+ struct Task *task = &gTasks[taskId];
+
+ task->tTrainerObjHi = (u32)(trainerObj) >> 16;
+ task->tTrainerObjLo = (u32)(trainerObj);
+ task->data[3] = b;
+}
+
+static void sub_80842FC(TaskFunc followupFunc)
+{
+ TaskFunc taskFunc = RunTrainerSeeFuncList;
+ u8 taskId = FindTaskIdByFunc(taskFunc);
+
+ SetTaskFuncWithFollowupFunc(taskId, taskFunc, followupFunc);
+ gTasks[taskId].data[0] = 1;
+ taskFunc(taskId);
+}
+
+static bool8 sub_8084394(u8 taskId, struct Task *task, struct MapObject *trainerObj);
+static bool8 sub_8084398(u8 taskId, struct Task *task, struct MapObject *trainerObj);
+static bool8 sub_80843DC(u8 taskId, struct Task *task, struct MapObject *trainerObj);
+static bool8 sub_808441C(u8 taskId, struct Task *task, struct MapObject *trainerObj);
+static bool8 sub_8084478(u8 taskId, struct Task *task, struct MapObject *trainerObj);
+static bool8 sub_8084534(u8 taskId, struct Task *task, struct MapObject *trainerObj);
+static bool8 sub_8084578(u8 taskId, struct Task *task, struct MapObject *trainerObj);
+static bool8 sub_80845AC(u8 taskId, struct Task *task, struct MapObject *trainerObj);
+static bool8 sub_80845C8(u8 taskId, struct Task *task, struct MapObject *trainerObj);
+static bool8 sub_80845FC(u8 taskId, struct Task *task, struct MapObject *trainerObj);
+static bool8 sub_8084654(u8 taskId, struct Task *task, struct MapObject *trainerObj);
+static bool8 sub_80846C8(u8 taskId, struct Task *task, struct MapObject *trainerObj);
+
+static bool8 (*const gTrainerSeeFuncList[])(u8 taskId, struct Task *task, struct MapObject *trainerObj) =
+{
+ sub_8084394,
+ sub_8084398,
+ sub_80843DC,
+ sub_808441C,
+ sub_8084478,
+ sub_8084534,
+ sub_8084578,
+ sub_80845AC,
+ sub_80845C8,
+ sub_80845FC,
+ sub_8084654,
+ sub_80846C8,
+};
+
+static void RunTrainerSeeFuncList(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ struct MapObject *trainerObj = (struct MapObject *)((task->tTrainerObjHi << 16) | (task->tTrainerObjLo));
+
+ if (!trainerObj->active)
+ {
+ SwitchTaskToFollowupFunc(taskId);
+ }
+ else
+ {
+ while (gTrainerSeeFuncList[task->data[0]](taskId, task, trainerObj))
+ ;
+ }
+}
+
+static bool8 sub_8084394(u8 taskId, struct Task *task, struct MapObject *trainerObj) // cant be void because it is called with RunTrainerSeeFuncList with arguments.
+{
+ return FALSE;
+}
+
+static bool8 sub_8084398(u8 taskId, struct Task *task, struct MapObject *trainerObj)
+{
+ u8 direction;
+
+ FieldObjectGetLocalIdAndMap(trainerObj, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
+ FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_1);
+ direction = GetFaceDirectionAnimId(trainerObj->mapobj_unk_18);
+ FieldObjectSetSpecialAnim(trainerObj, direction);
+ task->data[0]++;
+ return TRUE;
+}
+
+static bool8 sub_80843DC(u8 taskId, struct Task *task, struct MapObject *trainerObj)
+{
+ if (FieldEffectActiveListContains(0))
+ {
+ return FALSE;
+ }
+ else
+ {
+ task->data[0]++;
+ if (trainerObj->animPattern == 57 || trainerObj->animPattern == 58)
+ task->data[0] = 6;
+ if (trainerObj->animPattern == 63)
+ task->data[0] = 8;
+ return TRUE;
+ }
+}
+
+static bool8 sub_808441C(u8 taskId, struct Task *task, struct MapObject *trainerObj)
+{
+ if (!(FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj)) || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj))
+ {
+ if (task->data[3])
+ {
+ FieldObjectSetSpecialAnim(trainerObj, GetGoSpeed0AnimId(trainerObj->mapobj_unk_18));
+ task->data[3]--;
+ }
+ else
+ {
+ FieldObjectSetSpecialAnim(trainerObj, 0x3E);
+ task->data[0]++;
+ }
+ }
+ return FALSE;
+}
+
+static bool8 sub_8084478(u8 taskId, struct Task *task, struct MapObject *trainerObj)
+{
+ struct MapObject *playerObj;
+
+ if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj) && !FieldObjectClearAnimIfSpecialAnimFinished(trainerObj))
+ return FALSE;
+
+ npc_set_running_behaviour_etc(trainerObj, npc_running_behaviour_by_direction(trainerObj->mapobj_unk_18));
+ sub_805C774(trainerObj, npc_running_behaviour_by_direction(trainerObj->mapobj_unk_18));
+ sub_805C754(trainerObj);
+
+ playerObj = &gMapObjects[gPlayerAvatar.mapObjectId];
+ if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerObj) && !FieldObjectClearAnimIfSpecialAnimFinished(playerObj))
+ return FALSE;
+
+ sub_80597E8();
+ FieldObjectSetSpecialAnim(&gMapObjects[gPlayerAvatar.mapObjectId], GetFaceDirectionAnimId(GetOppositeDirection(trainerObj->mapobj_unk_18)));
+ task->data[0]++;
+ return FALSE;
+}
+
+static bool8 sub_8084534(u8 taskId, struct Task *task, struct MapObject *trainerObj) // technically only 1 parameter, but needs all 3 for TrainerSeeFuncList call.
+{
+ struct MapObject *playerObj = &gMapObjects[gPlayerAvatar.mapObjectId];
+
+ if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerObj)
+ || FieldObjectClearAnimIfSpecialAnimFinished(playerObj))
+ SwitchTaskToFollowupFunc(taskId);
+ return FALSE;
+}
+
+static bool8 sub_8084578(u8 taskId, struct Task *task, struct MapObject *trainerObj)
+{
+ if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj)
+ || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj))
+ {
+ FieldObjectSetSpecialAnim(trainerObj, 0x59);
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+static bool8 sub_80845AC(u8 taskId, struct Task *task, struct MapObject *trainerObj)
+{
+ if (FieldObjectClearAnimIfSpecialAnimFinished(trainerObj))
+ task->data[0] = 3;
+
+ return FALSE;
+}
+
+static bool8 sub_80845C8(u8 taskId, struct Task *task, struct MapObject *trainerObj)
+{
+ if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj)
+ || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj))
+ {
+ FieldObjectSetSpecialAnim(trainerObj, 0x3E);
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+static bool8 sub_80845FC(u8 taskId, struct Task *task, struct MapObject *trainerObj)
+{
+ if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(trainerObj))
+ {
+ gFieldEffectArguments[0] = trainerObj->coords2.x;
+ gFieldEffectArguments[1] = trainerObj->coords2.y;
+ gFieldEffectArguments[2] = gSprites[trainerObj->spriteId].subpriority - 1;
+ gFieldEffectArguments[3] = 2;
+ task->data[4] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH);
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+static bool8 sub_8084654(u8 taskId, struct Task *task, struct MapObject *trainerObj)
+{
+ struct Sprite *sprite;
+
+ if (gSprites[task->data[4]].animCmdIndex == 2)
+ {
+ trainerObj->mapobj_bit_26 = 0;
+ trainerObj->mapobj_bit_2 = 1;
+
+ sprite = &gSprites[trainerObj->spriteId];
+ sprite->oam.priority = 2;
+ FieldObjectClearAnimIfSpecialAnimFinished(trainerObj);
+ FieldObjectSetSpecialAnim(trainerObj, sub_806084C(trainerObj->mapobj_unk_18));
+ task->data[0]++;
+ }
+ return FALSE;
+}
+
+static bool8 sub_80846C8(u8 taskId, struct Task *task, struct MapObject *trainerObj)
+{
+ if (!FieldEffectActiveListContains(49))
+ task->data[0] = 3;
+
+ return FALSE;
+}
+
+static bool8 (*const gTrainerSeeFuncList2[])(u8, struct Task *, struct MapObject *) =
+{
+ sub_80845C8,
+ sub_80845FC,
+ sub_8084654,
+ sub_80846C8,
+};
+
+void sub_80846E4(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ struct MapObject *mapObj;
+
+ // another mapObj loaded into by loadword?
+ LoadWordFromTwoHalfwords(&task->data[1], (u32 *)&mapObj);
+ if (!task->data[7])
+ {
+ FieldObjectClearAnim(mapObj);
+ task->data[7]++;
+ }
+ gTrainerSeeFuncList2[task->data[0]](taskId, task, mapObj);
+ if (task->data[0] == 3 && !FieldEffectActiveListContains(49))
+ {
+ npc_set_running_behaviour_etc(mapObj, npc_running_behaviour_by_direction(mapObj->mapobj_unk_18));
+ sub_805C774(mapObj, npc_running_behaviour_by_direction(mapObj->mapobj_unk_18));
+ DestroyTask(taskId);
+ }
+ else
+ mapObj->mapobj_bit_7 = 0;
+}
+
+void sub_8084794(struct MapObject *var)
+{
+ StoreWordInTwoHalfwords(&gTasks[CreateTask(sub_80846E4, 0)].data[1], (u32)var);
+}
+
+static void Task_DestroyTrainerApproachTask(u8);
+
+void ScrSpecial_EndTrainerApproach(void)
+{
+ sub_80842FC(Task_DestroyTrainerApproachTask);
+}
+
+static void Task_DestroyTrainerApproachTask(u8 taskId)
+{
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+}
+
+static const struct OamData gOamData_839B4D8 = {
+ .size = 1, .priority = 1
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_839B4E0[] = {
+ { gSpriteImage_839B308, sizeof gSpriteImage_839B308 },
+ { gSpriteImage_839B388, sizeof gSpriteImage_839B388 }
+};
+
+static const struct SpriteFrameImage gSpriteImageTable_839B4F0[] = {
+ { gSpriteImage_839B408, sizeof gSpriteImage_839B408 }
+};
+
+static const union AnimCmd gSpriteAnim_839B4F8[] = {
+ ANIMCMD_FRAME(0, 60),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_839B500[] = {
+ ANIMCMD_FRAME(1, 60),
+ ANIMCMD_END
+};
+
+static const union AnimCmd *const gSpriteAnimTable_839B508[] = {
+ gSpriteAnim_839B4F8,
+ gSpriteAnim_839B500
+};
+
+static const struct SpriteTemplate gSpriteTemplate_839B510 = {
+ 0xffff, 0xffff, &gOamData_839B4D8, gSpriteAnimTable_839B508, gSpriteImageTable_839B4E0, gDummySpriteAffineAnimTable, objc_exclamation_mark_probably
+};
+static const struct SpriteTemplate gSpriteTemplate_839B528 = {
+ 0xffff, 4100, &gOamData_839B4D8, gSpriteAnimTable_839B508, gSpriteImageTable_839B4F0, gDummySpriteAffineAnimTable, objc_exclamation_mark_probably
+};
+
+u8 FldEff_ExclamationMarkIcon1(void)
+{
+ u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839B510, 0, 0, 0x53);
+
+ if (spriteId != 64)
+ sub_8084894(&gSprites[spriteId], 0, 0);
+
+ return 0;
+}
+
+u8 FldEff_ExclamationMarkIcon2(void)
+{
+ u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839B510, 0, 0, 0x52);
+
+ if (spriteId != 64)
+ sub_8084894(&gSprites[spriteId], 33, 1);
+
+ return 0;
+}
+
+u8 FldEff_HeartIcon(void)
+{
+ u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839B528, 0, 0, 0x52);
+
+ if (spriteId != 64)
+ sub_8084894(&gSprites[spriteId], 46, 0);
+
+ return 0;
+}
+
+static void sub_8084894(struct Sprite *sprite, u16 a2, u8 a3)
+{
+ sprite->oam.priority = 1;
+ sprite->coordOffsetEnabled = 1;
+
+ sprite->data[0] = gFieldEffectArguments[0];
+ sprite->data[1] = gFieldEffectArguments[1];
+ sprite->data[2] = gFieldEffectArguments[2];
+ sprite->data[3] = -5;
+ sprite->data[7] = a2;
+
+ StartSpriteAnim(sprite, a3);
+}
+
+static void objc_exclamation_mark_probably(struct Sprite *sprite)
+{
+ u8 mapObjId;
+
+ if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data[0], sprite->data[1], sprite->data[2], &mapObjId)
+ || sprite->animEnded)
+ {
+ FieldEffectStop(sprite, (u8)sprite->data[7]);
+ }
+ else
+ {
+ struct Sprite *mapObjSprite = &gSprites[gMapObjects[mapObjId].spriteId];
+ sprite->data[4] += sprite->data[3];
+ sprite->pos1.x = mapObjSprite->pos1.x;
+ sprite->pos1.y = mapObjSprite->pos1.y - 16;
+ sprite->pos2.x = mapObjSprite->pos2.x;
+ sprite->pos2.y = mapObjSprite->pos2.y + sprite->data[4];
+ if (sprite->data[4])
+ sprite->data[3]++;
+ else
+ sprite->data[3] = 0;
+ }
+}
diff --git a/src/tv.c b/src/field/tv.c
index a254bcd5f..e88e3c72b 100644
--- a/src/tv.c
+++ b/src/field/tv.c
@@ -8,36 +8,39 @@
#include "fieldmap.h"
#include "field_message_box.h"
#include "field_camera.h"
-#include "flags.h"
-#include "rng.h"
+#include "constants/flags.h"
+#include "random.h"
#include "string_util.h"
#include "text.h"
-#include "species.h"
+#include "constants/species.h"
#include "pokedex.h"
#include "naming_screen.h"
-#include "rom4.h"
-#include "map_constants.h"
+#include "overworld.h"
+#include "constants/maps.h"
#include "strings.h"
#include "battle.h"
#include "link.h"
-#include "easy_chat.h"
+#include "constants/easy_chat.h"
#include "field_map_obj.h"
#include "field_specials.h"
#include "item.h"
-#include "items.h"
+#include "constants/items.h"
#include "link.h"
-#include "map_constants.h"
+#include "constants/maps.h"
#include "naming_screen.h"
#include "pokedex.h"
#include "region_map.h"
-#include "rng.h"
-#include "rom4.h"
+#include "random.h"
+#include "overworld.h"
#include "rtc.h"
#include "script_menu.h"
-#include "species.h"
+#include "constants/species.h"
#include "string_util.h"
#include "strings.h"
#include "text.h"
+#include "ewram.h"
+#include "constants/moves.h"
+#include "region_map_sections.h"
struct UnkTvStruct
{
@@ -65,55 +68,376 @@ extern struct TVSaleItem gUnknown_02038724[3];
struct UnkTvStruct gUnknown_03005D38;
-extern u8 *gTVBravoTrainerTextGroup[];
-extern u8 *gTVBravoTrainerBattleTowerTextGroup[];
-extern u8 *gTVSmartShopperTextGroup[];
-extern u8 *gTVNameRaterTextGroup[];
-extern u8 *gTVPokemonTodayTextGroup[];
-extern u8 *gTVPokemonTodayFailedCaptureTextGroup[];
-extern u8 *gTVFanClubTextGroup[];
-extern u8 *gTVRecentHappeningsTextGroup[];
-extern u8 *gTVFanClubOpinionsTextGroup[];
-extern u8 *gTVPokemonOutbreakTextGroup[];
-extern u8 *gTVGabbyAndTyTextGroup[];
-extern u8 *gTVFishingGuruAdviceTextGroup[];
-extern u8 *gTVWorldOfMastersTextGroup[];
-extern struct OutbreakPokemon gPokeOutbreakSpeciesList[5];
-
-
-
-extern const u8 *gTVNewsTextGroup1[];
-extern const u8 *gTVNewsTextGroup2[];
-extern const u8 *gTVNewsTextGroup3[];
-
-extern u16 gScriptLastTalked;
+extern u16 gSpecialVar_LastTalked;
-extern u8 gScriptContestCategory;
-extern u8 gScriptContestRank;
+extern u8 gSpecialVar_ContestCategory;
+extern u8 gSpecialVar_ContestRank;
extern u8 gUnknown_03004316[11];
extern u8 gBattleOutcome;
extern u16 gLastUsedItem;
-extern u8 ewram[];
-#define gUnknown_02007000 (*(ewramStruct_02007000 *)(ewram + 0x7000))
-
static EWRAM_DATA u16 gUnknown_020387E0 = 0;
static EWRAM_DATA u16 gUnknown_020387E2 = 0;
static EWRAM_DATA u8 gUnknown_020387E4 = 0;
-static EWRAM_DATA ALIGNED(4) u8 gUnknown_020387E8 = 0; // why is this aligned to a 4-byte boundary?
+static EWRAM_DATA ALIGNED(4) u8 sTVShowState = 0; // why is this aligned to a 4-byte boundary?
static u8 gUnknown_03000720;
static u8 gUnknown_03000721;
static s8 gUnknown_03000722;
+const struct OutbreakPokemon gPokeOutbreakSpeciesList[5] =
+{
+ {
+ .species = SPECIES_SURSKIT,
+ .moves = {MOVE_BUBBLE, MOVE_QUICK_ATTACK, MOVE_NONE, MOVE_NONE},
+ .level = 3,
+ .location = MAPSEC_Route102,
+ },
+ {
+ .species = SPECIES_SURSKIT,
+ .moves = {MOVE_BUBBLE, MOVE_QUICK_ATTACK, MOVE_NONE, MOVE_NONE},
+ .level = 15,
+ .location = MAPSEC_Route114,
+ },
+ {
+ .species = SPECIES_SURSKIT,
+ .moves = {MOVE_BUBBLE, MOVE_QUICK_ATTACK, MOVE_NONE, MOVE_NONE},
+ .level = 15,
+ .location = MAPSEC_Route117,
+ },
+ {
+ .species = SPECIES_SURSKIT,
+ .moves = {MOVE_BUBBLE, MOVE_QUICK_ATTACK, MOVE_NONE, MOVE_NONE},
+ .level = 28,
+ .location = MAPSEC_Route120,
+ },
+ {
+ .species = SPECIES_SKITTY,
+ .moves = {MOVE_GROWL, MOVE_TACKLE, MOVE_NONE, MOVE_NONE},
+ .level = 15,
+ .location = MAPSEC_Route116,
+ },
+};
+
+extern const u8 gTVNewsText_EnergyGuru1[];
+extern const u8 gTVNewsText_GameCorner1[];
+extern const u8 gTVNewsText_LilycoveDepartment1[];
+extern const u8 gTVNewsText_EnergyGuru2[];
+extern const u8 gTVNewsText_GameCorner2[];
+extern const u8 gTVNewsText_LilycoveDepartment2[];
+extern const u8 gTVNewsText_EnergyGuru3[];
+extern const u8 gTVNewsText_GameCorner3[];
+extern const u8 gTVNewsText_LilycoveDepartment3[];
+extern const u8 gTVFanClubText1[];
+extern const u8 gTVFanClubText2[];
+extern const u8 gTVFanClubText3[];
+extern const u8 gTVFanClubText4[];
+extern const u8 gTVFanClubText5[];
+extern const u8 gTVFanClubText6[];
+extern const u8 gTVFanClubText7[];
+extern const u8 gTVFanClubText8[];
+extern const u8 gTVRecentHappeningsText1[];
+extern const u8 gTVRecentHappeningsText2[];
+extern const u8 gTVRecentHappeningsText3[];
+extern const u8 gTVRecentHappeningsText4[];
+extern const u8 gTVRecentHappeningsText5[];
+extern const u8 gTVRecentHappeningsText6[];
+extern const u8 gTVFanClubOpinionsText1[];
+extern const u8 gTVFanClubOpinionsText2[];
+extern const u8 gTVFanClubOpinionsText3[];
+extern const u8 gTVFanClubOpinionsText4[];
+extern const u8 gTVFanClubOpinionsText5[];
+extern const u8 gTVPokemonOutbreakText[];
+extern const u8 gTVPokemonTodayText1[];
+extern const u8 gTVPokemonTodayText2[];
+extern const u8 gTVPokemonTodayText3[];
+extern const u8 gTVPokemonTodayText4[];
+extern const u8 gTVPokemonTodayText5[];
+extern const u8 gTVPokemonTodayText6[];
+extern const u8 gTVPokemonTodayText7[];
+extern const u8 gTVPokemonTodayText8[];
+extern const u8 gTVPokemonTodayText9[];
+extern const u8 gTVPokemonTodayText10[];
+extern const u8 gTVPokemonTodayText11[];
+extern const u8 gTVPokemonTodayText12[];
+extern const u8 gTVSmartShopperText1[];
+extern const u8 gTVSmartShopperText2[];
+extern const u8 gTVSmartShopperText3[];
+extern const u8 gTVSmartShopperText4[];
+extern const u8 gTVSmartShopperText5[];
+extern const u8 gTVSmartShopperText6[];
+extern const u8 gTVSmartShopperText7[];
+extern const u8 gTVSmartShopperText8[];
+extern const u8 gTVSmartShopperText9[];
+extern const u8 gTVSmartShopperText10[];
+extern const u8 gTVSmartShopperText11[];
+extern const u8 gTVSmartShopperText12[];
+extern const u8 gTVSmartShopperText13[];
+extern const u8 gTVBravoTrainerText1[];
+extern const u8 gTVBravoTrainerText2[];
+extern const u8 gTVBravoTrainerText3[];
+extern const u8 gTVBravoTrainerText4[];
+extern const u8 gTVBravoTrainerText5[];
+extern const u8 gTVBravoTrainerText6[];
+extern const u8 gTVBravoTrainerText7[];
+extern const u8 gTVBravoTrainerText8[];
+extern const u8 gTVBravoTrainerText9[];
+extern const u8 gTVBravoTrainerBattleTowerText1[];
+extern const u8 gTVBravoTrainerBattleTowerText2[];
+extern const u8 gTVBravoTrainerBattleTowerText3[];
+extern const u8 gTVBravoTrainerBattleTowerText4[];
+extern const u8 gTVBravoTrainerBattleTowerText5[];
+extern const u8 gTVBravoTrainerBattleTowerText6[];
+extern const u8 gTVBravoTrainerBattleTowerText7[];
+extern const u8 gTVBravoTrainerBattleTowerText8[];
+extern const u8 gTVBravoTrainerBattleTowerText9[];
+extern const u8 gTVBravoTrainerBattleTowerText10[];
+extern const u8 gTVBravoTrainerBattleTowerText11[];
+extern const u8 gTVBravoTrainerBattleTowerText12[];
+extern const u8 gTVBravoTrainerBattleTowerText13[];
+extern const u8 gTVBravoTrainerBattleTowerText14[];
+extern const u8 gTVBravoTrainerBattleTowerText15[];
+extern const u8 gTVNameRaterText1[];
+extern const u8 gTVNameRaterText2[];
+extern const u8 gTVNameRaterText3[];
+extern const u8 gTVNameRaterText4[];
+extern const u8 gTVNameRaterText5[];
+extern const u8 gTVNameRaterText6[];
+extern const u8 gTVNameRaterText7[];
+extern const u8 gTVNameRaterText8[];
+extern const u8 gTVNameRaterText9[];
+extern const u8 gTVNameRaterText10[];
+extern const u8 gTVNameRaterText11[];
+extern const u8 gTVNameRaterText12[];
+extern const u8 gTVNameRaterText13[];
+extern const u8 gTVNameRaterText14[];
+extern const u8 gTVNameRaterText15[];
+extern const u8 gTVNameRaterText16[];
+extern const u8 gTVNameRaterText17[];
+extern const u8 gTVNameRaterText18[];
+extern const u8 gTVNameRaterText19[];
+extern const u8 gTVPokemonTodayFailedCaptureText1[];
+extern const u8 gTVPokemonTodayFailedCaptureText2[];
+extern const u8 gTVPokemonTodayFailedCaptureText3[];
+extern const u8 gTVPokemonTodayFailedCaptureText4[];
+extern const u8 gTVPokemonTodayFailedCaptureText5[];
+extern const u8 gTVPokemonTodayFailedCaptureText6[];
+extern const u8 gTVPokemonTodayFailedCaptureText7[];
+extern const u8 gTVFishingGuruAdviceText1[];
+extern const u8 gTVFishingGuruAdviceText2[];
+extern const u8 gTVWorldOfMastersText1[];
+extern const u8 gTVWorldOfMastersText2[];
+extern const u8 gTVWorldOfMastersText3[];
+extern const u8 gTVGabbyAndTyText1[];
+extern const u8 gTVGabbyAndTyText2[];
+extern const u8 gTVGabbyAndTyText3[];
+extern const u8 gTVGabbyAndTyText4[];
+extern const u8 gTVGabbyAndTyText5[];
+extern const u8 gTVGabbyAndTyText6[];
+extern const u8 gTVGabbyAndTyText7[];
+extern const u8 gTVGabbyAndTyText8[];
+extern const u8 gTVGabbyAndTyText9[];
+
+const u8 *const gTVNewsTextGroup1[] =
+{
+ NULL,
+ gTVNewsText_EnergyGuru1,
+ gTVNewsText_GameCorner1,
+ gTVNewsText_LilycoveDepartment1,
+};
+
+const u8 *const gTVNewsTextGroup2[] =
+{
+ NULL,
+ gTVNewsText_EnergyGuru2,
+ gTVNewsText_GameCorner2,
+ gTVNewsText_LilycoveDepartment2,
+};
+
+const u8 *const gTVNewsTextGroup3[] =
+{
+ NULL,
+ gTVNewsText_EnergyGuru3,
+ gTVNewsText_GameCorner3,
+ gTVNewsText_LilycoveDepartment3,
+};
+
+u8 *const gUnknown_083D1464[] =
+{
+ gStringVar1,
+ gStringVar2,
+ gStringVar3,
+};
+
+const u8 *const gTVFanClubTextGroup[] =
+{
+ gTVFanClubText1,
+ gTVFanClubText2,
+ gTVFanClubText3,
+ gTVFanClubText4,
+ gTVFanClubText5,
+ gTVFanClubText6,
+ gTVFanClubText7,
+ gTVFanClubText8,
+};
+
+const u8 *const gTVRecentHappeningsTextGroup[] =
+{
+ gTVRecentHappeningsText1,
+ gTVRecentHappeningsText2,
+ gTVRecentHappeningsText3,
+ gTVRecentHappeningsText4,
+ gTVRecentHappeningsText5,
+ gTVRecentHappeningsText6,
+};
+
+const u8 *const gTVFanClubOpinionsTextGroup[] =
+{
+ gTVFanClubOpinionsText1,
+ gTVFanClubOpinionsText2,
+ gTVFanClubOpinionsText3,
+ gTVFanClubOpinionsText4,
+ gTVFanClubOpinionsText5,
+};
+
+const u8 *const gTVPokemonOutbreakTextGroup[] =
+{
+ gTVPokemonOutbreakText,
+};
+
+const u8 *const gTVPokemonTodayTextGroup[] =
+{
+ gTVPokemonTodayText1,
+ gTVPokemonTodayText2,
+ gTVPokemonTodayText3,
+ gTVPokemonTodayText4,
+ gTVPokemonTodayText5,
+ gTVPokemonTodayText6,
+ gTVPokemonTodayText7,
+ gTVPokemonTodayText8,
+ gTVPokemonTodayText9,
+ gTVPokemonTodayText10,
+ gTVPokemonTodayText11,
+ gTVPokemonTodayText12,
+};
+
+const u8 *const gTVSmartShopperTextGroup[] =
+{
+ gTVSmartShopperText1,
+ gTVSmartShopperText2,
+ gTVSmartShopperText3,
+ gTVSmartShopperText4,
+ gTVSmartShopperText5,
+ gTVSmartShopperText6,
+ gTVSmartShopperText7,
+ gTVSmartShopperText8,
+ gTVSmartShopperText9,
+ gTVSmartShopperText10,
+ gTVSmartShopperText11,
+ gTVSmartShopperText12,
+ gTVSmartShopperText13,
+};
+
+const u8 *const gTVBravoTrainerTextGroup[] =
+{
+ gTVBravoTrainerText1,
+ gTVBravoTrainerText2,
+ gTVBravoTrainerText3,
+ gTVBravoTrainerText4,
+ gTVBravoTrainerText5,
+ gTVBravoTrainerText6,
+ gTVBravoTrainerText7,
+ gTVBravoTrainerText8,
+ gTVBravoTrainerText9,
+};
+
+const u8 *const gTVBravoTrainerBattleTowerTextGroup[] =
+{
+ gTVBravoTrainerBattleTowerText1,
+ gTVBravoTrainerBattleTowerText2,
+ gTVBravoTrainerBattleTowerText3,
+ gTVBravoTrainerBattleTowerText4,
+ gTVBravoTrainerBattleTowerText5,
+ gTVBravoTrainerBattleTowerText6,
+ gTVBravoTrainerBattleTowerText7,
+ gTVBravoTrainerBattleTowerText8,
+ gTVBravoTrainerBattleTowerText9,
+ gTVBravoTrainerBattleTowerText10,
+ gTVBravoTrainerBattleTowerText11,
+ gTVBravoTrainerBattleTowerText12,
+ gTVBravoTrainerBattleTowerText13,
+ gTVBravoTrainerBattleTowerText14,
+ gTVBravoTrainerBattleTowerText15,
+};
+
+const u8 *const gTVNameRaterTextGroup[] =
+{
+ gTVNameRaterText1,
+ gTVNameRaterText2,
+ gTVNameRaterText3,
+ gTVNameRaterText4,
+ gTVNameRaterText5,
+ gTVNameRaterText6,
+ gTVNameRaterText7,
+ gTVNameRaterText8,
+ gTVNameRaterText9,
+ gTVNameRaterText10,
+ gTVNameRaterText11,
+ gTVNameRaterText12,
+ gTVNameRaterText13,
+ gTVNameRaterText14,
+ gTVNameRaterText15,
+ gTVNameRaterText16,
+ gTVNameRaterText17,
+ gTVNameRaterText18,
+ gTVNameRaterText19,
+};
+
+const u8 *const gTVPokemonTodayFailedCaptureTextGroup[] =
+{
+ gTVPokemonTodayFailedCaptureText1,
+ gTVPokemonTodayFailedCaptureText2,
+ gTVPokemonTodayFailedCaptureText3,
+ gTVPokemonTodayFailedCaptureText4,
+ gTVPokemonTodayFailedCaptureText5,
+ gTVPokemonTodayFailedCaptureText6,
+ gTVPokemonTodayFailedCaptureText7,
+};
+
+const u8 *const gTVFishingGuruAdviceTextGroup[] =
+{
+ gTVFishingGuruAdviceText1,
+ gTVFishingGuruAdviceText2,
+};
+
+const u8 *const gTVWorldOfMastersTextGroup[] =
+{
+ gTVWorldOfMastersText1,
+ gTVWorldOfMastersText2,
+ gTVWorldOfMastersText3,
+};
+
+const u8 *const gTVGabbyAndTyTextGroup[] =
+{
+ gTVGabbyAndTyText1,
+ gTVGabbyAndTyText2,
+ gTVGabbyAndTyText3,
+ gTVGabbyAndTyText4,
+ gTVGabbyAndTyText5,
+ gTVGabbyAndTyText6,
+ gTVGabbyAndTyText7,
+ gTVGabbyAndTyText8,
+ gTVGabbyAndTyText9,
+};
+
void ClearTVShowData(void)
{
u8 showidx;
u8 extradataidx;
for (showidx=0; showidx<25; showidx++) {
- gSaveBlock1.tvShows[showidx].common.var00 = 0;
- gSaveBlock1.tvShows[showidx].common.var01 = 0;
+ gSaveBlock1.tvShows[showidx].common.kind = 0;
+ gSaveBlock1.tvShows[showidx].common.active = 0;
for (extradataidx=0; extradataidx<34; extradataidx++) {
gSaveBlock1.tvShows[showidx].common.pad02[extradataidx] = 0;
}
@@ -123,26 +447,25 @@ void ClearTVShowData(void)
bool8 sub_80BF1B4(u8);
void sub_80BF20C(void);
-extern u16 sub_8135D3C(u8);
-extern u8 gScriptContestCategory;
-extern u8 gScriptContestRank;
+extern u8 gSpecialVar_ContestCategory;
+extern u8 gSpecialVar_ContestRank;
extern u8 gUnknown_03004316[11];
extern u8 gBattleOutcome;
-void sub_80BF334(void);
-void sub_80BF3A4(void);
-void sub_80BF3DC(void);
-void sub_80BF46C(void);
-void sub_80BF478(void);
-void sub_80BF484(void);
-void sub_80BF4BC(void);
+void InterviewBefore_FanClubLetter(void);
+void InterviewBefore_RecentHappenings(void);
+void InterviewBefore_PkmnFanClubOpinions(void);
+void InterviewBefore_Dummy(void);
+void InterviewBefore_NameRater(void);
+void InterviewBefore_BravoTrainerPkmnProfile(void);
+void InterviewBefore_BravoTrainerBTProfile(void);
void sub_80BE028(void);
void sub_80BE074(void);
void sub_80BE778(void);
void sub_80BEB20(void);
-u8 sub_80BFB54(u8);
+u8 GetTVChannelByShowType(u8);
s8 sub_80BF74C(TVShow tvShow[]);
@@ -153,53 +476,62 @@ void sub_80BE138(TVShow *show);
void sub_80BE160(TVShow *show);
extern u16 gLastUsedItem;
-void sub_80BE5FC(void);
-void sub_80BE65C(void);
-void sub_80BE6A0(void);
-void nullsub_21(void);
-void sub_80BE188(void);
-void sub_80BE320(void);
+void InterviewAfter_FanClubLetter(void);
+void InterviewAfter_RecentHappenings(void);
+void InterviewAfter_PkmnFanClubOpinions(void);
+void InterviewAfter_DummyShow4(void);
+void InterviewAfter_BravoTrainerPokemonProfile(void);
+void InterviewAfter_BravoTrainerBattleTowerProfile(void);
u8 special_0x44(void)
{
u8 i;
u8 j;
+ u8 selIdx;
+ TVShow *show;
-#ifndef NONMATCHING
- asm("":::"r5");
-#endif
-
- for (i = 5; i < 24; i++)
+ for (i = 5; i < ARRAY_COUNT(gSaveBlock1.tvShows) - 1; i++)
{
- if (gSaveBlock1.tvShows[i].common.var00 == 0)
+ if (gSaveBlock1.tvShows[i].common.kind == 0)
+ {
break;
+ }
}
- i = Random() % i;
- j = i;
+
+ j = Random() % i;
+ selIdx = j;
+
do
{
- if (sub_80BFB54(gSaveBlock1.tvShows[i].common.var00) != 4)
+ if (GetTVChannelByShowType(gSaveBlock1.tvShows[j].common.kind) != 4)
{
- if (gSaveBlock1.tvShows[i].common.var01 == 1)
- return i;
+ if (gSaveBlock1.tvShows[j].common.active == TRUE)
+ {
+ return j;
+ }
}
else
{
- struct TVShowMassOutbreak *massOutbreak = &gSaveBlock1.tvShows[i].massOutbreak;
-
- if (massOutbreak->var16 == 0 && massOutbreak->var01 == 1)
- return i;
+ show = &gSaveBlock1.tvShows[j];
+ if (show->massOutbreak.daysLeft == 0 && show->massOutbreak.active == TRUE)
+ {
+ return j;
+ }
+ }
+ if (j == 0)
+ {
+ j = ARRAY_COUNT(gSaveBlock1.tvShows) - 2;
}
-
- if (i == 0)
- i = 23;
else
- i--;
- } while (i != j);
+ {
+ j--;
+ }
+ } while (j != selIdx);
+
return 0xFF;
}
-u8 sub_80BDA30(void);
+u8 FindNonMassOutbreakActiveTVShow(void);
u8 sub_80BD8B8(void)
{
@@ -207,19 +539,19 @@ u8 sub_80BD8B8(void)
if (retval == 0xff)
return 0xff;
- if (gSaveBlock1.outbreakPokemonSpecies != 0 && gSaveBlock1.tvShows[retval].common.var00 == TVSHOW_MASS_OUTBREAK)
- return sub_80BDA30();
+ if (gSaveBlock1.outbreakPokemonSpecies != 0 && gSaveBlock1.tvShows[retval].common.kind == TVSHOW_MASS_OUTBREAK)
+ return FindNonMassOutbreakActiveTVShow();
return retval;
}
u8 CheckForBigMovieOrEmergencyNewsOnTV(void);
void SetTVMetatilesOnMap(int, int, u16);
-bool8 sub_80BECA0(void);
+bool8 FindAnyTVNewsOnTheAir(void);
bool8 IsTVShowInSearchOfTrainersAiring(void);
void UpdateTVScreensOnMap(int width, int height)
{
- FlagSet(SYS_TV_WATCH);
+ FlagSet(FLAG_SYS_TV_WATCH);
switch (CheckForBigMovieOrEmergencyNewsOnTV())
{
case 1:
@@ -228,14 +560,14 @@ void UpdateTVScreensOnMap(int width, int height)
case 2:
break;
default:
- if (gSaveBlock1.location.mapGroup == MAP_GROUP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F
- && gSaveBlock1.location.mapNum == MAP_ID_LILYCOVE_CITY_COVE_LILY_MOTEL_1F)
+ if (gSaveBlock1.location.mapGroup == MAP_GROUP(LILYCOVE_CITY_COVE_LILY_MOTEL_1F)
+ && gSaveBlock1.location.mapNum == MAP_NUM(LILYCOVE_CITY_COVE_LILY_MOTEL_1F))
{
SetTVMetatilesOnMap(width, height, 0x3);
}
- else if (FlagGet(SYS_TV_START) && (sub_80BD8B8() != 0xff || sub_80BECA0() != 0xff || IsTVShowInSearchOfTrainersAiring()))
+ else if (FlagGet(FLAG_SYS_TV_START) && (sub_80BD8B8() != 0xff || FindAnyTVNewsOnTheAir() != 0xff || IsTVShowInSearchOfTrainersAiring()))
{
- FlagReset(SYS_TV_WATCH);
+ FlagClear(FLAG_SYS_TV_WATCH);
SetTVMetatilesOnMap(width, height, 0x3);
}
break;
@@ -263,28 +595,28 @@ void TurnOffTVScreen(void)
DrawWholeMapView();
}
-u8 sub_80BDA0C(void)
+u8 GetTVShowType(void)
{
- return gSaveBlock1.tvShows[gSpecialVar_0x8004].common.var00;
+ return gSaveBlock1.tvShows[gSpecialVar_0x8004].common.kind;
}
-u8 sub_80BDA30(void)
+u8 FindNonMassOutbreakActiveTVShow(void)
{
u8 showIdx;
for (showIdx=0; showIdx<24; showIdx++)
{
- if (gSaveBlock1.tvShows[showIdx].common.var00 != 0 && gSaveBlock1.tvShows[showIdx].common.var00 != TVSHOW_MASS_OUTBREAK && gSaveBlock1.tvShows[showIdx].common.var01 == 1)
+ if (gSaveBlock1.tvShows[showIdx].common.kind != 0 && gSaveBlock1.tvShows[showIdx].common.kind != TVSHOW_MASS_OUTBREAK && gSaveBlock1.tvShows[showIdx].common.active == 1)
return showIdx;
}
return 0xff;
}
-u8 special_0x4a(void)
+u8 GetNonMassOutbreakActiveTVShow(void)
{
TVShow *tvShow;
tvShow = &gSaveBlock1.tvShows[gSpecialVar_0x8004];
- if (tvShow->common.var00 == TVSHOW_MASS_OUTBREAK && gSaveBlock1.outbreakPokemonSpecies)
- return sub_80BDA30();
+ if (tvShow->common.kind == TVSHOW_MASS_OUTBREAK && gSaveBlock1.outbreakPokemonSpecies)
+ return FindNonMassOutbreakActiveTVShow();
return gSpecialVar_0x8004;
}
@@ -351,10 +683,10 @@ void GabbyAndTyBeforeInterview(void)
TakeTVShowInSearchOfTrainersOffTheAir();
if (gSaveBlock1.gabbyAndTyData.lastMove == 0)
- FlagSet(1);
+ FlagSet(FLAG_TEMP_1);
}
-void sub_80BDC14(void)
+void GabbyAndTyAfterInterview(void)
{
gSaveBlock1.gabbyAndTyData.valB_0 = gSaveBlock1.gabbyAndTyData.valA_0;
gSaveBlock1.gabbyAndTyData.valB_1 = gSaveBlock1.gabbyAndTyData.valA_1;
@@ -388,12 +720,12 @@ bool8 GabbyAndTyGetLastQuote(void)
if (gSaveBlock1.gabbyAndTyData.quote == 0xffff)
return FALSE;
- sub_80EB3FC(gStringVar1, gSaveBlock1.gabbyAndTyData.quote);
+ EasyChat_GetWordText(gStringVar1, gSaveBlock1.gabbyAndTyData.quote);
gSaveBlock1.gabbyAndTyData.quote |= 0xffff;
return TRUE;
}
-u8 sub_80BDD18(void)
+u8 GabbyAndTyGetLastBattleTrivia(void)
{
if (!gSaveBlock1.gabbyAndTyData.valB_0)
return 1;
@@ -445,27 +777,27 @@ void GabbyAndTySetScriptVarsToFieldObjectLocalIds(void)
}
}
-void sub_80BDE48(void)
+void InterviewAfter(void)
{
switch (gSpecialVar_0x8005)
{
case TVSHOW_FAN_CLUB_LETTER:
- sub_80BE5FC();
+ InterviewAfter_FanClubLetter();
break;
case TVSHOW_RECENT_HAPPENINGS:
- sub_80BE65C();
+ InterviewAfter_RecentHappenings();
break;
case TVSHOW_PKMN_FAN_CLUB_OPINIONS:
- sub_80BE6A0();
+ InterviewAfter_PkmnFanClubOpinions();
break;
case TVSHOW_UNKN_SHOWTYPE_04:
- nullsub_21();
+ InterviewAfter_DummyShow4();
break;
case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE:
- sub_80BE188();
+ InterviewAfter_BravoTrainerPokemonProfile();
break;
case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE:
- sub_80BE320();
+ InterviewAfter_BravoTrainerBattleTowerProfile();
break;
}
}
@@ -479,7 +811,7 @@ u8 sub_80BDEAC(u8 *a0)
return lang;
}
-void sub_80BDEC8(void)
+void PutPokemonTodayCaughtOnAir(void)
{
u8 i;
u16 total;
@@ -509,8 +841,8 @@ void sub_80BDEC8(void)
total = 0;
pokemonToday = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].pokemonToday;
- pokemonToday->var00 = TVSHOW_POKEMON_TODAY_CAUGHT;
- pokemonToday->var01 = total;
+ pokemonToday->kind = TVSHOW_POKEMON_TODAY_CAUGHT;
+ pokemonToday->active = total;
if (gBattleResults.unk5_1 != 0)
{
total = 1;
@@ -543,11 +875,11 @@ void sub_80BE028(void)
{
struct TVShowWorldOfMasters *worldOfMasters = &gSaveBlock1.tvShows[24].worldOfMasters;
- if (worldOfMasters->var00 != TVSHOW_WORLD_OF_MASTERS)
+ if (worldOfMasters->kind != TVSHOW_WORLD_OF_MASTERS)
{
sub_80BF55C(gSaveBlock1.tvShows, 24);
worldOfMasters->var06 = GetGameStat(GAME_STAT_STEPS);
- worldOfMasters->var00 = TVSHOW_WORLD_OF_MASTERS;
+ worldOfMasters->kind = TVSHOW_WORLD_OF_MASTERS;
}
worldOfMasters->var02++;
worldOfMasters->var04 = gBattleResults.caughtPoke;
@@ -575,8 +907,8 @@ void sub_80BE074(void)
struct TVShowPokemonTodayFailed *pokemonTodayFailed = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].pokemonTodayFailed;
zero = 0;
- pokemonTodayFailed->var00 = TVSHOW_POKEMON_TODAY_FAILED;
- pokemonTodayFailed->var01 = zero;
+ pokemonTodayFailed->kind = TVSHOW_POKEMON_TODAY_FAILED;
+ pokemonTodayFailed->active = zero;
pokemonTodayFailed->species = gBattleResults.poke1Species;
pokemonTodayFailed->species2 = gBattleResults.lastOpponentSpecies;
pokemonTodayFailed->var10 = total;
@@ -613,16 +945,16 @@ void sub_80BE160(TVShow *show)
show->common.trainerIdHi = playerId >> 8;
}
-void sub_80BE188(void)
+void InterviewAfter_BravoTrainerPokemonProfile(void)
{
struct TVShowBravoTrainerPokemonProfiles *bravoTrainerSrc = &gSaveBlock1.tvShows[24].bravoTrainer;
- if (bravoTrainerSrc->var00 == TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE)
+ if (bravoTrainerSrc->kind == TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE)
{
struct TVShowBravoTrainerPokemonProfiles *bravoTrainerNew = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].bravoTrainer;
- bravoTrainerNew->var00 = TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE;
- bravoTrainerNew->var01 = 1;
+ bravoTrainerNew->kind = TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE;
+ bravoTrainerNew->active = 1;
bravoTrainerNew->species = bravoTrainerSrc->species;
StringCopy(bravoTrainerNew->playerName, gSaveBlock2.playerName);
StringCopy(bravoTrainerNew->pokemonNickname, bravoTrainerSrc->pokemonNickname);
@@ -642,13 +974,13 @@ void sub_80BE23C(u16 a0)
{
struct TVShowBravoTrainerPokemonProfiles *bravoTrainer = &gSaveBlock1.tvShows[24].bravoTrainer;
- sub_80BF484();
+ InterviewBefore_BravoTrainerPkmnProfile();
gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows);
if (gUnknown_03005D38.var0 != -1)
{
sub_80BF55C(gSaveBlock1.tvShows, 24);
bravoTrainer->var14 = a0;
- bravoTrainer->var00 = TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE;
+ bravoTrainer->kind = TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE;
}
}
@@ -660,26 +992,26 @@ void sub_80BE284(u8 a0)
if (gUnknown_03005D38.var0 != -1)
{
bravoTrainer->contestResult = a0;
- bravoTrainer->contestCategory = gScriptContestCategory;
- bravoTrainer->contestRank = gScriptContestRank;
+ bravoTrainer->contestCategory = gSpecialVar_ContestCategory;
+ bravoTrainer->contestRank = gSpecialVar_ContestRank;
bravoTrainer->species = GetMonData(&gPlayerParty[gUnknown_02038694], MON_DATA_SPECIES, NULL);
GetMonData(&gPlayerParty[gUnknown_02038694], MON_DATA_NICKNAME, bravoTrainer->pokemonNickname);
}
}
-void sub_80BE320(void)
+void InterviewAfter_BravoTrainerBattleTowerProfile(void)
{
struct TVShowBravoTrainerBattleTowerSpotlight *bravoTrainerTower = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].bravoTrainerTower;
- bravoTrainerTower->var00 = TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE;
- bravoTrainerTower->var01 = 1;
+ bravoTrainerTower->kind = TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE;
+ bravoTrainerTower->active = 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;
@@ -704,8 +1036,8 @@ void sub_80BE3BC(void)
{
struct TVShowSmartShopper *smartShopper = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].smartshopperShow;
- smartShopper->var00 = TVSHOW_SMART_SHOPPER;
- smartShopper->var01 = rval;
+ smartShopper->kind = TVSHOW_SMART_SHOPPER;
+ smartShopper->active = rval;
smartShopper->shopLocation = gMapHeader.regionMapSectionId;
for (i=0; i<3; i++)
{
@@ -723,8 +1055,8 @@ void sub_80BE3BC(void)
void sub_80BE478(void)
{
- sub_80BF478();
- if (gScriptResult == 1)
+ InterviewBefore_NameRater();
+ if (gSpecialVar_Result == 1)
return;
GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar1);
@@ -732,8 +1064,8 @@ void sub_80BE478(void)
{
struct TVShowNameRaterShow *nameRaterShow = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].nameRaterShow;
- nameRaterShow->var00 = TVSHOW_NAME_RATER_SHOW;
- nameRaterShow->var01 = 1;
+ nameRaterShow->kind = TVSHOW_NAME_RATER_SHOW;
+ nameRaterShow->active = 1;
nameRaterShow->species = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_SPECIES, NULL);
nameRaterShow->random = Random() % 3;
nameRaterShow->random2 = Random() % 2;
@@ -766,37 +1098,37 @@ void StartMassOutbreak(void)
gSaveBlock1.outbreakUnk5 = 2;
}
-void sub_80BE5FC(void)
+void InterviewAfter_FanClubLetter(void)
{
struct TVShowFanClubLetter *fanclubLetter = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].fanclubLetter;
- fanclubLetter->var00 = TVSHOW_FAN_CLUB_LETTER;
- fanclubLetter->var01 = 1;
+ fanclubLetter->kind = TVSHOW_FAN_CLUB_LETTER;
+ fanclubLetter->active = 1;
StringCopy(fanclubLetter->playerName, gSaveBlock2.playerName);
fanclubLetter->species = GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL);
sub_80BE160((TVShow *)fanclubLetter);
fanclubLetter->language = GAME_LANGUAGE;
}
-void sub_80BE65C(void)
+void InterviewAfter_RecentHappenings(void)
{
struct TVShowRecentHappenings *recentHappenings = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].recentHappenings;
- recentHappenings->var00 = TVSHOW_RECENT_HAPPENINGS;
- recentHappenings->var01 = 1;
+ recentHappenings->kind = TVSHOW_RECENT_HAPPENINGS;
+ recentHappenings->active = 1;
StringCopy(recentHappenings->playerName, gSaveBlock2.playerName);
recentHappenings->var02 = 0;
sub_80BE160((TVShow *)recentHappenings);
recentHappenings->language = GAME_LANGUAGE;
}
-void sub_80BE6A0(void)
+void InterviewAfter_PkmnFanClubOpinions(void)
{
u8 monIndex;
struct TVShowFanclubOpinions *fanclubOpinions = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].fanclubOpinions;
- fanclubOpinions->var00 = TVSHOW_PKMN_FAN_CLUB_OPINIONS;
- fanclubOpinions->var01 = 1;
+ fanclubOpinions->kind = TVSHOW_PKMN_FAN_CLUB_OPINIONS;
+ fanclubOpinions->active = 1;
monIndex = GetLeadMonIndex();
fanclubOpinions->var04A = GetMonData(&gPlayerParty[monIndex], MON_DATA_FRIENDSHIP, NULL) / 16;
fanclubOpinions->var04B = gSpecialVar_0x8007;
@@ -809,19 +1141,19 @@ void sub_80BE6A0(void)
StripExtCtrlCodes(fanclubOpinions->var10);
}
-void nullsub_21(void)
+void InterviewAfter_DummyShow4(void)
{
}
void sub_80BE778(void)
{
- if (FlagGet(SYS_GAME_CLEAR))
+ if (FlagGet(FLAG_SYS_GAME_CLEAR))
{
u8 i;
for (i = 0; i < 24; i++)
{
- if (gSaveBlock1.tvShows[i].massOutbreak.var00 == TVSHOW_MASS_OUTBREAK)
+ if (gSaveBlock1.tvShows[i].massOutbreak.kind == TVSHOW_MASS_OUTBREAK)
return;
}
if (sub_80BF77C(0x147))
@@ -835,8 +1167,8 @@ void sub_80BE778(void)
s32 val2 = gUnknown_03005D38.var0;
struct TVShowMassOutbreak *massOutbreak = &gSaveBlock1.tvShows[val2].massOutbreak;
- massOutbreak->var00 = TVSHOW_MASS_OUTBREAK;
- massOutbreak->var01 = 1;
+ massOutbreak->kind = TVSHOW_MASS_OUTBREAK;
+ massOutbreak->active = 1;
massOutbreak->level = gPokeOutbreakSpeciesList[val].level;
massOutbreak->var02 = 0;
massOutbreak->var03 = 0;
@@ -851,7 +1183,7 @@ void sub_80BE778(void)
massOutbreak->var12 = 0;
massOutbreak->probability = 0x32;
massOutbreak->var15 = 0;
- massOutbreak->var16 = 0x01;
+ massOutbreak->daysLeft = 0x01;
sub_80BE160((TVShow *)massOutbreak);
massOutbreak->language = GAME_LANGUAGE;
}
@@ -891,15 +1223,15 @@ void sub_80BE8EC(u16 arg0)
{
for (showidx=0; showidx<24; showidx++)
{
- if (gSaveBlock1.tvShows[showidx].massOutbreak.var00 == TVSHOW_MASS_OUTBREAK
- && gSaveBlock1.tvShows[showidx].massOutbreak.var01 == 0x01)
+ if (gSaveBlock1.tvShows[showidx].massOutbreak.kind == TVSHOW_MASS_OUTBREAK
+ && gSaveBlock1.tvShows[showidx].massOutbreak.active == 0x01)
{
struct TVShowMassOutbreak *massOutbreak = &gSaveBlock1.tvShows[showidx].massOutbreak;
- if (massOutbreak->var16 < arg0)
- massOutbreak->var16 = 0;
+ if (massOutbreak->daysLeft < arg0)
+ massOutbreak->daysLeft = 0;
else
- massOutbreak->var16 -= arg0;
+ massOutbreak->daysLeft -= arg0;
break;
}
}
@@ -942,7 +1274,6 @@ void sub_80BE97C(bool8 flag)
void sub_80BE9D4(void)
{
- //TVShow *show;
gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows);
if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_FISHING_ADVICE) != 1)
{
@@ -950,8 +1281,8 @@ void sub_80BE9D4(void)
register u8 zero asm("r1") = 0;
asm(""::"r"(zero));
- pokemonAngler->var00 = TVSHOW_FISHING_ADVICE;
- pokemonAngler->var01 = zero;
+ pokemonAngler->kind = TVSHOW_FISHING_ADVICE;
+ pokemonAngler->active = zero;
pokemonAngler->var02 = gUnknown_020387E2 & 0xFF;
pokemonAngler->var03 = gUnknown_020387E2 >> 8;
pokemonAngler->var04 = gUnknown_020387E0;
@@ -972,7 +1303,7 @@ void sub_80BEA5C(u16 arg0)
{
struct TVShowWorldOfMasters *worldOfMasters = &gSaveBlock1.tvShows[24].worldOfMasters;
- if (worldOfMasters->var00 == TVSHOW_WORLD_OF_MASTERS)
+ if (worldOfMasters->kind == TVSHOW_WORLD_OF_MASTERS)
{
if (worldOfMasters->var02 < 20)
sub_80BF55C(gSaveBlock1.tvShows, 0x18);
@@ -991,8 +1322,8 @@ void sub_80BEA88(void)
{
struct TVShowWorldOfMasters *worldOfMastersDst = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].worldOfMasters;
- worldOfMastersDst->var00 = TVSHOW_WORLD_OF_MASTERS;
- worldOfMastersDst->var01 = 0;
+ worldOfMastersDst->kind = TVSHOW_WORLD_OF_MASTERS;
+ worldOfMastersDst->active = 0;
worldOfMastersDst->var02 = worldOfMastersSrc->var02;
worldOfMastersDst->var06 = GetGameStat(GAME_STAT_STEPS) - worldOfMastersSrc->var06;
worldOfMastersDst->var04 = worldOfMastersSrc->var04;
@@ -1009,29 +1340,29 @@ void sub_80BEB20(void)
{
u16 rval;
- if (FlagGet(SYS_GAME_CLEAR) != 0)
+ if (FlagGet(FLAG_SYS_GAME_CLEAR) != 0)
{
- gUnknown_03005D38.var0 = sub_80BEBC8(gSaveBlock1.unknown_2ABC);
+ gUnknown_03005D38.var0 = sub_80BEBC8(gSaveBlock1.pokeNews);
if (gUnknown_03005D38.var0 != -1 && sub_80BF77C(0x28f) != 1)
{
rval = (Random() % 3) + 1;
if (sub_80BEE48(rval) != 1)
{
- gSaveBlock1.unknown_2ABC[gUnknown_03005D38.var0].val0 = rval;
- gSaveBlock1.unknown_2ABC[gUnknown_03005D38.var0].val2 = 4;
- gSaveBlock1.unknown_2ABC[gUnknown_03005D38.var0].val1 = 1;
+ gSaveBlock1.pokeNews[gUnknown_03005D38.var0].kind = rval;
+ gSaveBlock1.pokeNews[gUnknown_03005D38.var0].days = 4;
+ gSaveBlock1.pokeNews[gUnknown_03005D38.var0].state = 1;
}
}
}
}
-int sub_80BEBC8(struct UnknownSaveStruct2ABC *arg0)
+int sub_80BEBC8(struct PokeNews *pokeNews)
{
s8 i;
for (i = 0; i < 16; i++)
{
- if (arg0[i].val0 == 0)
+ if (pokeNews[i].kind == 0)
return i;
}
return -1;
@@ -1047,9 +1378,9 @@ void sub_80BEBF4(void)
void sub_80BEC10(u8 arg0)
{
- gSaveBlock1.unknown_2ABC[arg0].val0 = 0;
- gSaveBlock1.unknown_2ABC[arg0].val1 = 0;
- gSaveBlock1.unknown_2ABC[arg0].val2 = 0;
+ gSaveBlock1.pokeNews[arg0].kind = 0;
+ gSaveBlock1.pokeNews[arg0].state = 0;
+ gSaveBlock1.pokeNews[arg0].days = 0;
}
void sub_80BEC40(void)
@@ -1058,13 +1389,13 @@ void sub_80BEC40(void)
for (i = 0; i < 15; i++)
{
- if (gSaveBlock1.unknown_2ABC[i].val0 == 0)
+ if (gSaveBlock1.pokeNews[i].kind == 0)
{
for (j = i + 1; j < 16; j++)
{
- if (gSaveBlock1.unknown_2ABC[j].val0 != 0)
+ if (gSaveBlock1.pokeNews[j].kind != 0)
{
- gSaveBlock1.unknown_2ABC[i] = gSaveBlock1.unknown_2ABC[j];
+ gSaveBlock1.pokeNews[i] = gSaveBlock1.pokeNews[j];
sub_80BEC10(j);
break;
}
@@ -1073,45 +1404,45 @@ void sub_80BEC40(void)
}
}
-u8 sub_80BECA0(void)
+u8 FindAnyTVNewsOnTheAir(void)
{
u8 i;
for (i = 0; i < 16; i++)
{
- if (gSaveBlock1.unknown_2ABC[i].val0 != 0
- && gSaveBlock1.unknown_2ABC[i].val1 == 1
- && gSaveBlock1.unknown_2ABC[i].val2 < 3)
+ if (gSaveBlock1.pokeNews[i].kind != 0
+ && gSaveBlock1.pokeNews[i].state == 1
+ && gSaveBlock1.pokeNews[i].days < 3)
return i;
}
return 0xFF;
}
-void sub_80BECE8(void)
+void DoPokeNews(void)
{
- u8 arg0;
- arg0 = sub_80BECA0();
- if (arg0 == 0xff)
+ u8 i;
+ i = FindAnyTVNewsOnTheAir();
+ if (i == 0xff)
{
- gScriptResult = 0;
+ gSpecialVar_Result = 0;
return;
}
- if (gSaveBlock1.unknown_2ABC[arg0].val2 == 0)
+ if (gSaveBlock1.pokeNews[i].days == 0)
{
- gSaveBlock1.unknown_2ABC[arg0].val1 = 2;
+ gSaveBlock1.pokeNews[i].state = 2;
if (gLocalTime.hours < 20)
- ShowFieldMessage(gTVNewsTextGroup2[gSaveBlock1.unknown_2ABC[arg0].val0]);
+ ShowFieldMessage(gTVNewsTextGroup2[gSaveBlock1.pokeNews[i].kind]);
else
- ShowFieldMessage(gTVNewsTextGroup3[gSaveBlock1.unknown_2ABC[arg0].val0]);
+ ShowFieldMessage(gTVNewsTextGroup3[gSaveBlock1.pokeNews[i].kind]);
}
else
{
- u16 value = gSaveBlock1.unknown_2ABC[arg0].val2;
+ u16 value = gSaveBlock1.pokeNews[i].days;
ConvertIntToDecimalStringN(gStringVar1, value, 0, 1);
- gSaveBlock1.unknown_2ABC[arg0].val1 = 0;
- ShowFieldMessage(gTVNewsTextGroup1[gSaveBlock1.unknown_2ABC[arg0].val0]);
+ gSaveBlock1.pokeNews[i].state = 0;
+ ShowFieldMessage(gTVNewsTextGroup1[gSaveBlock1.pokeNews[i].kind]);
}
- gScriptResult = 1;
+ gSpecialVar_Result = 1;
}
bool8 GetPriceReduction(u8 arg0)
@@ -1122,9 +1453,9 @@ bool8 GetPriceReduction(u8 arg0)
return FALSE;
for (i=0; i<16; i++)
{
- if (gSaveBlock1.unknown_2ABC[i].val0 == arg0)
+ if (gSaveBlock1.pokeNews[i].kind == arg0)
{
- if (gSaveBlock1.unknown_2ABC[i].val1 == 2 && IsPriceDiscounted(arg0) != 0)
+ if (gSaveBlock1.pokeNews[i].state == 2 && IsPriceDiscounted(arg0) != 0)
return TRUE;
else
return FALSE;
@@ -1138,16 +1469,16 @@ bool8 IsPriceDiscounted(u8 arg0)
switch (arg0)
{
case 1:
- if (gSaveBlock1.location.mapGroup == MAP_GROUP_SLATEPORT_CITY
- && gSaveBlock1.location.mapNum == MAP_ID_SLATEPORT_CITY
- && gScriptLastTalked == 0x1a)
+ if (gSaveBlock1.location.mapGroup == MAP_GROUP(SLATEPORT_CITY)
+ && gSaveBlock1.location.mapNum == MAP_NUM(SLATEPORT_CITY)
+ && gSpecialVar_LastTalked == 0x1a)
return TRUE;
else
return FALSE;
break;
case 3:
- if (gSaveBlock1.location.mapGroup == MAP_GROUP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP
- && gSaveBlock1.location.mapNum == MAP_ID_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP)
+ if (gSaveBlock1.location.mapGroup == MAP_GROUP(LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP)
+ && gSaveBlock1.location.mapNum == MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP))
return TRUE;
else
return FALSE;
@@ -1165,7 +1496,7 @@ bool8 sub_80BEE48(u8 arg0)
return TRUE;
for (i=0; i<16; i++)
{
- if (gSaveBlock1.unknown_2ABC[i].val0 == arg0)
+ if (gSaveBlock1.pokeNews[i].kind == arg0)
return TRUE;
}
return FALSE;
@@ -1177,17 +1508,17 @@ void sub_80BEE84(u16 var0)
for (i=0; i<16; i++)
{
- if (gSaveBlock1.unknown_2ABC[i].val0)
+ if (gSaveBlock1.pokeNews[i].kind)
{
- if (gSaveBlock1.unknown_2ABC[i].val2 < var0)
+ if (gSaveBlock1.pokeNews[i].days < var0)
{
sub_80BEC10(i);
}
else
{
- if (!gSaveBlock1.unknown_2ABC[i].val1 && FlagGet(SYS_GAME_CLEAR) == 1)
- gSaveBlock1.unknown_2ABC[i].val1 = 1;
- gSaveBlock1.unknown_2ABC[i].val2 -= var0;
+ if (!gSaveBlock1.pokeNews[i].state && FlagGet(FLAG_SYS_GAME_CLEAR) == 1)
+ gSaveBlock1.pokeNews[i].state = 1;
+ gSaveBlock1.pokeNews[i].days -= var0;
}
}
}
@@ -1297,7 +1628,7 @@ bool8 sub_80BF1B4(u8 showIdx)
for (i = 5; i < 24; i++)
{
- if (tvShows[i].common.var00 == showIdx)
+ if (tvShows[i].common.kind == showIdx)
{
if ((trainerId & 0xFF) == tvShows[i].common.trainerIdLo && ((trainerId >> 8) & 0xFF) == tvShows[i].common.trainerIdHi)
return TRUE;
@@ -1334,11 +1665,11 @@ void sub_80BF25C(u8 showType)
for (i = 0; i < 5; i++)
{
- if (gSaveBlock1.tvShows[i].common.var00 == showType)
+ if (gSaveBlock1.tvShows[i].common.kind == showType)
{
- if(gSaveBlock1.tvShows[i].common.var01 == 1)
+ if(gSaveBlock1.tvShows[i].common.active == 1)
{
- gScriptResult = 1;
+ gSpecialVar_Result = 1;
}
else
{
@@ -1352,41 +1683,41 @@ void sub_80BF25C(u8 showType)
sub_80BF6D8();
}
-void sub_80BF2C4(void)
+void InterviewBefore(void)
{
- gScriptResult = 0;
+ gSpecialVar_Result = FALSE;
switch (gSpecialVar_0x8005)
{
case TVSHOW_FAN_CLUB_LETTER:
- sub_80BF334();
+ InterviewBefore_FanClubLetter();
break;
case TVSHOW_RECENT_HAPPENINGS:
- sub_80BF3A4();
+ InterviewBefore_RecentHappenings();
break;
case TVSHOW_PKMN_FAN_CLUB_OPINIONS:
- sub_80BF3DC();
+ InterviewBefore_PkmnFanClubOpinions();
break;
case TVSHOW_UNKN_SHOWTYPE_04:
- sub_80BF46C();
+ InterviewBefore_Dummy();
break;
case TVSHOW_NAME_RATER_SHOW:
- sub_80BF478();
+ InterviewBefore_NameRater();
break;
case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE:
- sub_80BF484();
+ InterviewBefore_BravoTrainerPkmnProfile();
break;
case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE:
- sub_80BF4BC();
+ InterviewBefore_BravoTrainerBTProfile();
break;
}
}
-void sub_80BF334(void)
+void InterviewBefore_FanClubLetter(void)
{
struct TVShowFanClubLetter *fanclubLetter;
sub_80BF25C(TVSHOW_FAN_CLUB_LETTER);
- if (gScriptResult == 0)
+ if (gSpecialVar_Result == 0)
{
StringCopy(gStringVar1, gSpeciesNames[GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, 0)]);
fanclubLetter = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].fanclubLetter;
@@ -1394,24 +1725,24 @@ void sub_80BF334(void)
}
}
-void sub_80BF3A4(void)
+void InterviewBefore_RecentHappenings(void)
{
struct TVShowRecentHappenings *recentHappenings;
sub_80BF25C(TVSHOW_RECENT_HAPPENINGS);
- if (gScriptResult == 0)
+ if (gSpecialVar_Result == 0)
{
recentHappenings = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].recentHappenings;
sub_80EB6FC(recentHappenings->var04, 6);
}
}
-void sub_80BF3DC(void)
+void InterviewBefore_PkmnFanClubOpinions(void)
{
struct TVShowFanclubOpinions *fanclubOpinions;
sub_80BF25C(TVSHOW_PKMN_FAN_CLUB_OPINIONS);
- if (gScriptResult == 0)
+ if (gSpecialVar_Result == 0)
{
StringCopy(gStringVar1, gSpeciesNames[GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, 0)]);
GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_NICKNAME, gStringVar2);
@@ -1421,34 +1752,34 @@ void sub_80BF3DC(void)
}
}
-void sub_80BF46C(void)
+void InterviewBefore_Dummy(void)
{
- gScriptResult = 1;
+ gSpecialVar_Result = 1;
}
-void sub_80BF478(void)
+void InterviewBefore_NameRater(void)
{
sub_80BF25C(TVSHOW_NAME_RATER_SHOW);
}
-void sub_80BF484(void)
+void InterviewBefore_BravoTrainerPkmnProfile(void)
{
struct TVShowBravoTrainerPokemonProfiles *bravoTrainer;
sub_80BF25C(TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE);
- if (gScriptResult == 0)
+ if (gSpecialVar_Result == 0)
{
bravoTrainer = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].bravoTrainer;
sub_80EB6FC(bravoTrainer->var04, 2);
}
}
-void sub_80BF4BC(void)
+void InterviewBefore_BravoTrainerBTProfile(void)
{
struct TVShowBravoTrainerBattleTowerSpotlight *bravoTrainerTower;
sub_80BF25C(TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE);
- if (gScriptResult == 0)
+ if (gSpecialVar_Result == 0)
{
bravoTrainerTower = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].bravoTrainerTower;
sub_80EB6FC(bravoTrainerTower->var18, 1); // wrong struct ident, fix later
@@ -1456,32 +1787,32 @@ void sub_80BF4BC(void)
}
#if ENGLISH
-u8 sub_80BF4F4(u8 arg0)
+u8 NicknameDiffersFromSpeciesName(u8 monIndex)
{
u32 species;
- GetMonData(&gPlayerParty[arg0], MON_DATA_NICKNAME, &gStringVar1);
- species = GetMonData(&gPlayerParty[arg0], MON_DATA_SPECIES, NULL);
- if (StringCompareWithoutExtCtrlCodes(gSpeciesNames[species], gStringVar1) == FALSE)
+ GetMonData(&gPlayerParty[monIndex], MON_DATA_NICKNAME, &gStringVar1);
+ species = GetMonData(&gPlayerParty[monIndex], MON_DATA_SPECIES, NULL);
+ if (StringCompareWithoutExtCtrlCodes(gSpeciesNames[species], gStringVar1) == 0)
return FALSE;
return TRUE;
}
#elif GERMAN
-u8 sub_80BF4F4(u8 arg0)
+u8 NicknameDiffersFromSpeciesName(u8 monIndex)
{
u8 langData[4];
u32 species;
u8 *tmp;
- GetMonData(&gPlayerParty[arg0], MON_DATA_NICKNAME, &gStringVar1);
+ GetMonData(&gPlayerParty[monIndex], MON_DATA_NICKNAME, &gStringVar1);
tmp = langData;
- tmp[0] = GetMonData(&gPlayerParty[arg0], MON_DATA_LANGUAGE, &langData);
+ tmp[0] = GetMonData(&gPlayerParty[monIndex], MON_DATA_LANGUAGE, &langData);
if (tmp[0] != GAME_LANGUAGE)
return TRUE;
- species = GetMonData(&gPlayerParty[arg0], MON_DATA_SPECIES, NULL);
+ species = GetMonData(&gPlayerParty[monIndex], MON_DATA_SPECIES, NULL);
if (StringCompareWithoutExtCtrlCodes(gSpeciesNames[species], gStringVar1))
return TRUE;
@@ -1489,17 +1820,17 @@ u8 sub_80BF4F4(u8 arg0)
}
#endif
-u8 sub_80BF544(void)
+u8 LeadMonNicknamed(void)
{
- return sub_80BF4F4(GetLeadMonIndex());
+ return NicknameDiffersFromSpeciesName(GetLeadMonIndex());
}
void sub_80BF55C(TVShow tvShow[], u8 showidx)
{
u8 idx;
- tvShow[showidx].common.var00 = 0;
- tvShow[showidx].common.var01 = 0;
+ tvShow[showidx].common.kind = 0;
+ tvShow[showidx].common.active = 0;
for (idx = 0; idx < 34; idx++)
tvShow[showidx].common.pad02[idx] = 0;
}
@@ -1511,11 +1842,11 @@ void sub_80BF588(TVShow tvShow[])
for (showidx = 0; showidx < 4; showidx++)
{
- if (tvShow[showidx].common.var00 == 0)
+ if (tvShow[showidx].common.kind == 0)
{
for (showidx2 = showidx + 1; showidx2 < 5; showidx2++)
{
- if (tvShow[showidx2].common.var00 != 0)
+ if (tvShow[showidx2].common.kind != 0)
{
tvShow[showidx] = tvShow[showidx2];
sub_80BF55C(tvShow, showidx2);
@@ -1526,11 +1857,11 @@ void sub_80BF588(TVShow tvShow[])
}
for (showidx = 5; showidx < 24; showidx++)
{
- if (tvShow[showidx].common.var00 == 0)
+ if (tvShow[showidx].common.kind == 0)
{
for (showidx2 = showidx + 1; showidx2 < 24; showidx2++)
{
- if (tvShow[showidx2].common.var00 != 0)
+ if (tvShow[showidx2].common.kind != 0)
{
tvShow[showidx] = tvShow[showidx2];
sub_80BF55C(gSaveBlock1.tvShows, showidx2);
@@ -1556,7 +1887,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;
@@ -1576,9 +1907,9 @@ void sub_80BF6D8(void)
gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows);
gSpecialVar_0x8006 = gUnknown_03005D38.var0;
if (gUnknown_03005D38.var0 == -1)
- gScriptResult = 1;
+ gSpecialVar_Result = 1;
else
- gScriptResult = 0;
+ gSpecialVar_Result = 0;
}
s8 sub_80BF720(TVShow tvShow[])
@@ -1587,7 +1918,7 @@ s8 sub_80BF720(TVShow tvShow[])
for (idx = 0; idx < 5; idx++)
{
- if (tvShow[idx].common.var00 == 0)
+ if (tvShow[idx].common.kind == 0)
return idx;
}
return -1;
@@ -1599,7 +1930,7 @@ s8 sub_80BF74C(TVShow tvShow[])
for (idx = 5; idx < 24; idx++)
{
- if (tvShow[idx].common.var00 == 0)
+ if (tvShow[idx].common.kind == 0)
return idx;
}
return -1;
@@ -1624,7 +1955,7 @@ void sub_80BF79C(TVShow *arg0)
break;
i++;
}
- sub_80EB3FC(gStringVar3, arg0->recentHappenings.var04[i]);
+ EasyChat_GetWordText(gStringVar3, arg0->recentHappenings.var04[i]);
}
u8 sub_80BF7E8(struct TVShowNameRaterShow *arg0)
@@ -1721,19 +2052,19 @@ void sub_80BF820(u8 arg0, u8 arg1, u8 arg2, u16 arg3, u16 arg4, struct TVShowNam
StringCopy(gUnknown_083D1464[arg0], flags);
}
-bool8 sub_80BF974(void)
+bool8 TV_IsScriptShowKindAlreadyInQueue(void)
{
u8 i;
for (i = 0; i < 5; i++)
{
- if (gSaveBlock1.tvShows[i].common.var00 == gSpecialVar_0x8004)
+ if (gSaveBlock1.tvShows[i].common.kind == gSpecialVar_0x8004)
return TRUE;
}
return FALSE;
}
-bool8 sub_80BF9B4(void)
+bool8 TV_PutNameRaterShowOnTheAirIfNicnkameChanged(void)
{
GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, &gStringVar1);
if (!StringCompareWithoutExtCtrlCodes(gStringVar3, gStringVar1))
@@ -1742,9 +2073,9 @@ bool8 sub_80BF9B4(void)
return TRUE;
}
-void c2_080CC144(void);
+void ChangePokemonNickname_CB(void);
-void sub_80BF9F8(void)
+void ChangePokemonNickname(void)
{
u16 spec;
u16 gender;
@@ -1755,30 +2086,30 @@ void sub_80BF9F8(void)
spec = GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_SPECIES, 0);
gender = GetMonGender(&(gPlayerParty[gSpecialVar_0x8004]));
pval = GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_PERSONALITY, 0);
- DoNamingScreen(3, gStringVar2, spec, gender, pval, c2_080CC144);
+ DoNamingScreen(3, gStringVar2, spec, gender, pval, ChangePokemonNickname_CB);
}
-void c2_080CC144(void)
+void ChangePokemonNickname_CB(void)
{
SetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, gStringVar2);
c2_exit_to_overworld_1_continue_scripts_restart_music();
}
-void sub_80BFAE0(void)
+void TV_CopyNicknameToStringVar1AndEnsureTerminated(void)
{
GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, &gStringVar1);
StringGetEnd10(gStringVar1);
}
-void sub_80BFB10(void)
+void TV_CheckMonOTIDEqualsPlayerID(void)
{
if (GetPlayerTrainerId() == GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_OT_ID, 0))
- gScriptResult = 0;
+ gSpecialVar_Result = 0;
else
- gScriptResult = 1;
+ gSpecialVar_Result = 1;
}
-u8 sub_80BFB54(u8 arg0)
+u8 GetTVChannelByShowType(u8 arg0)
{
if (arg0 == 0)
return 0;
@@ -1799,57 +2130,57 @@ u32 GetPlayerTrainerId(void)
u8 CheckForBigMovieOrEmergencyNewsOnTV(void)
{
- if (gSaveBlock1.location.mapGroup != MAP_GROUP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)
+ if (gSaveBlock1.location.mapGroup != MAP_GROUP(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F))
return 0;
if (gSaveBlock2.playerGender == MALE)
{
- if (gSaveBlock1.location.mapNum != MAP_ID_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)
+ if (gSaveBlock1.location.mapNum != MAP_NUM(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F))
return 0;
}
else
{
- if (gSaveBlock1.location.mapNum != MAP_ID_LITTLEROOT_TOWN_MAYS_HOUSE_1F)
+ if (gSaveBlock1.location.mapNum != MAP_NUM(LITTLEROOT_TOWN_MAYS_HOUSE_1F))
return 0;
}
- if (FlagGet(SYS_TV_LATI) == 1)
+ if (FlagGet(FLAG_SYS_TV_LATI) == 1)
return 1;
- if (FlagGet(SYS_TV_HOME) == 1)
+ if (FlagGet(FLAG_SYS_TV_HOME) == 1)
return 2;
return 1;
}
void GetMomOrDadStringForTVMessage(void)
{
- if (gSaveBlock1.location.mapGroup == MAP_GROUP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)
+ if (gSaveBlock1.location.mapGroup == MAP_GROUP(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F))
{
if (gSaveBlock2.playerGender == MALE)
{
- if (gSaveBlock1.location.mapNum == MAP_ID_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)
+ if (gSaveBlock1.location.mapNum == MAP_NUM(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F))
{
StringCopy(gStringVar1, gOtherText_Mom);
- VarSet(VAR_0x4003, 1);
+ VarSet(VAR_TEMP_3, 1);
}
}
else
{
- if (gSaveBlock1.location.mapNum == MAP_ID_LITTLEROOT_TOWN_MAYS_HOUSE_1F)
+ if (gSaveBlock1.location.mapNum == MAP_NUM(LITTLEROOT_TOWN_MAYS_HOUSE_1F))
{
StringCopy(gStringVar1, gOtherText_Mom);
- VarSet(VAR_0x4003, 1);
+ VarSet(VAR_TEMP_3, 1);
}
}
}
- if (VarGet(VAR_0x4003) == 1)
+ if (VarGet(VAR_TEMP_3) == 1)
{
StringCopy(gStringVar1, gOtherText_Mom);
}
- else if (VarGet(VAR_0x4003) == 2)
+ else if (VarGet(VAR_TEMP_3) == 2)
{
StringCopy(gStringVar1, gOtherText_Dad);
}
- else if (VarGet(VAR_0x4003) > 2)
+ else if (VarGet(VAR_TEMP_3) > 2)
{
- if (VarGet(VAR_0x4003) % 2 == 0)
+ if (VarGet(VAR_TEMP_3) % 2 == 0)
StringCopy(gStringVar1, gOtherText_Mom);
else
StringCopy(gStringVar1, gOtherText_Dad);
@@ -1859,26 +2190,26 @@ void GetMomOrDadStringForTVMessage(void)
if (Random() % 2 != 0)
{
StringCopy(gStringVar1, gOtherText_Mom);
- VarSet(VAR_0x4003, 1);
+ VarSet(VAR_TEMP_3, 1);
}
else
{
StringCopy(gStringVar1, gOtherText_Dad);
- VarSet(VAR_0x4003, 2);
+ VarSet(VAR_TEMP_3, 2);
}
}
}
void sub_80BFD20(void)
{
- VarSet(VAR_0x40BC, 0);
+ VarSet(VAR_BRAVO_TRAINER_BATTLE_TOWER_ON, 0);
RemoveFieldObjectByLocalIdAndMap(5, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup);
}
typedef union ewramStruct_02007000
{
TVShow tvshows[4][25];
- struct UnknownSaveStruct2ABC unknown_2abc[4][16];
+ struct PokeNews pokeNews[4][16];
} ewramStruct_02007000;
void sub_80BFE24(TVShow arg0[25], TVShow arg1[25], TVShow arg2[25], TVShow arg3[25]);
@@ -1972,7 +2303,7 @@ bool8 sub_80BFF68(TVShow * arg1[25], TVShow * arg2[25], u8 idx)
tv1 = *arg1;
tv2 = *arg2;
value = FALSE;
- switchval = sub_80BFB54(tv2[gUnknown_03000722].common.var00);
+ switchval = GetTVChannelByShowType(tv2[gUnknown_03000722].common.kind);
switch (switchval)
{
case 2:
@@ -2007,7 +2338,7 @@ u8 sub_80C004C(TVShow *tv1, TVShow *tv2, u8 idx)
tv2->common.srcTrainerIdLo = linkTrainerId & 0xFF;
tv2->common.srcTrainerIdHi = linkTrainerId >> 8;
*tv1 = *tv2;
- tv1->common.var01 = 1;
+ tv1->common.active = 1;
return TRUE;
}
@@ -2023,7 +2354,7 @@ u8 sub_80C00B4(TVShow *tv1, TVShow *tv2, u8 idx)
tv2->common.srcTrainerId2Lo = linkTrainerId & 0xFF;
tv2->common.srcTrainerId2Hi = linkTrainerId >> 8;
*tv1 = *tv2;
- tv1->common.var01 = 1;
+ tv1->common.active = 1;
return TRUE;
}
@@ -2037,7 +2368,7 @@ u8 sub_80C0134(TVShow *tv1, TVShow *tv2, u8 idx)
tv2->common.srcTrainerIdLo = linkTrainerId & 0xFF;
tv2->common.srcTrainerIdHi = linkTrainerId >> 8;
*tv1 = *tv2;
- tv1->common.var01 = 1;
+ tv1->common.active = 1;
tv1->common.var16[0] = 1;
return TRUE;
}
@@ -2047,7 +2378,7 @@ s8 sub_80C019C(TVShow tvShows[])
u8 i;
for (i = 0; i < 24; i++)
{
- if (tvShows[i].common.var01 == 0 && (u8)(tvShows[i].common.var00 - 1) < 60)
+ if (tvShows[i].common.active == 0 && (u8)(tvShows[i].common.kind - 1) < 60)
return i;
}
return -1;
@@ -2059,7 +2390,7 @@ void sub_80C01D4(void)
u16 i;
for (i=0; i<24; i++)
{
- switch (gSaveBlock1.tvShows[i].common.var00)
+ switch (gSaveBlock1.tvShows[i].common.kind)
{
case 0:
case TVSHOW_RECENT_HAPPENINGS:
@@ -2315,27 +2646,27 @@ _080C03A0:\n\
void sub_80C03A8(u8 showidx)
{
- gSaveBlock1.tvShows[showidx].common.var01 = 0;
+ gSaveBlock1.tvShows[showidx].common.active = 0;
}
void sub_80C03C8(u16 species, u8 showidx)
{
- if (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(species), 0) == 0)
- gSaveBlock1.tvShows[showidx].common.var01 = 0;
+ if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), 0) == 0)
+ gSaveBlock1.tvShows[showidx].common.active = 0;
}
void sub_80C0408(void)
{
u16 i;
- if (FlagGet(SYS_GAME_CLEAR) == TRUE)
+ if (FlagGet(FLAG_SYS_GAME_CLEAR) == TRUE)
return;
for (i = 0; i < 24; i++)
{
- if (gSaveBlock1.tvShows[i].common.var00 == TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE)
- gSaveBlock1.tvShows[i].common.var01 = 0;
- else if (gSaveBlock1.tvShows[i].common.var00 == TVSHOW_MASS_OUTBREAK)
- gSaveBlock1.tvShows[i].common.var01 = 0;
+ if (gSaveBlock1.tvShows[i].common.kind == TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE)
+ gSaveBlock1.tvShows[i].common.active = 0;
+ else if (gSaveBlock1.tvShows[i].common.kind == TVSHOW_MASS_OUTBREAK)
+ gSaveBlock1.tvShows[i].common.active = 0;
}
}
@@ -2345,8 +2676,8 @@ void sub_80C045C(void)
for (i = 0; i < 5; i++)
{
- if (sub_80BFB54(gSaveBlock1.tvShows[i].common.var00) == 2)
- gSaveBlock1.tvShows[i].common.var01 = 0;
+ if (GetTVChannelByShowType(gSaveBlock1.tvShows[i].common.kind) == 2)
+ gSaveBlock1.tvShows[i].common.active = 0;
}
}
@@ -2358,18 +2689,18 @@ void sub_80C04A0(void)
for (showIdx = 5; showIdx < 24; showIdx++)
{
- if (gSaveBlock1.tvShows[showIdx].common.var00 == 0)
+ if (gSaveBlock1.tvShows[showIdx].common.kind == 0)
count++;
}
for (showIdx = 0; showIdx < 5 - count; showIdx++)
sub_80BF55C(gSaveBlock1.tvShows, showIdx+5);
}
-void sub_80C05C4(struct UnknownSaveStruct2ABC[16], struct UnknownSaveStruct2ABC[16], struct UnknownSaveStruct2ABC[16], struct UnknownSaveStruct2ABC[16]);
+void sub_80C05C4(struct PokeNews[16], struct PokeNews[16], struct PokeNews[16], struct PokeNews[16]);
void sub_80C0750(void);
void sub_80C0788(void);
-s8 sub_80C0730(struct UnknownSaveStruct2ABC[16], u8);
-void sub_80C06BC(struct UnknownSaveStruct2ABC *[16], struct UnknownSaveStruct2ABC *[16]);
+s8 sub_80C0730(struct PokeNews[16], u8);
+void sub_80C06BC(struct PokeNews *[16], struct PokeNews *[16]);
void sub_80C0514(void *a0, u32 a1, u8 a2)
{
@@ -2377,33 +2708,33 @@ void sub_80C0514(void *a0, u32 a1, u8 a2)
u8 i;
for (i = 0; i < 4; i++)
- memcpy(gUnknown_02007000.unknown_2abc[i], a0 + i * a1, 64);
+ memcpy(gUnknown_02007000.pokeNews[i], a0 + i * a1, 64);
struct02007000 = &gUnknown_02007000;
switch (a2)
{
case 0:
- sub_80C05C4(gSaveBlock1.unknown_2ABC, struct02007000->unknown_2abc[1], struct02007000->unknown_2abc[2], struct02007000->unknown_2abc[3]);
+ sub_80C05C4(gSaveBlock1.pokeNews, struct02007000->pokeNews[1], struct02007000->pokeNews[2], struct02007000->pokeNews[3]);
break;
case 1:
- sub_80C05C4(struct02007000->unknown_2abc[0], gSaveBlock1.unknown_2ABC, struct02007000->unknown_2abc[2], struct02007000->unknown_2abc[3]);
+ sub_80C05C4(struct02007000->pokeNews[0], gSaveBlock1.pokeNews, struct02007000->pokeNews[2], struct02007000->pokeNews[3]);
break;
case 2:
- sub_80C05C4(struct02007000->unknown_2abc[0], struct02007000->unknown_2abc[1], gSaveBlock1.unknown_2ABC, struct02007000->unknown_2abc[3]);
+ sub_80C05C4(struct02007000->pokeNews[0], struct02007000->pokeNews[1], gSaveBlock1.pokeNews, struct02007000->pokeNews[3]);
break;
case 3:
- sub_80C05C4(struct02007000->unknown_2abc[0], struct02007000->unknown_2abc[1], struct02007000->unknown_2abc[2], gSaveBlock1.unknown_2ABC);
+ sub_80C05C4(struct02007000->pokeNews[0], struct02007000->pokeNews[1], struct02007000->pokeNews[2], gSaveBlock1.pokeNews);
break;
}
sub_80C0750();
sub_80C0788();
}
-void sub_80C05C4(struct UnknownSaveStruct2ABC a0[16], struct UnknownSaveStruct2ABC a1[16], struct UnknownSaveStruct2ABC a2[16], struct UnknownSaveStruct2ABC a3[16])
+void sub_80C05C4(struct PokeNews a0[16], struct PokeNews a1[16], struct PokeNews a2[16], struct PokeNews a3[16])
{
u8 i;
u8 j;
u8 k;
- struct UnknownSaveStruct2ABC ** arglist[4];
+ struct PokeNews ** arglist[4];
arglist[0] = &a0;
arglist[1] = &a1;
@@ -2428,10 +2759,10 @@ void sub_80C05C4(struct UnknownSaveStruct2ABC a0[16], struct UnknownSaveStruct2A
}
}
-void sub_80C06BC(struct UnknownSaveStruct2ABC *arg0[16], struct UnknownSaveStruct2ABC *arg1[16])
+void sub_80C06BC(struct PokeNews *arg0[16], struct PokeNews *arg1[16])
{
- struct UnknownSaveStruct2ABC *str0;
- struct UnknownSaveStruct2ABC *str1;
+ struct PokeNews *str0;
+ struct PokeNews *str1;
str0 = arg0[0];
str1 = arg1[0];
@@ -2439,26 +2770,26 @@ void sub_80C06BC(struct UnknownSaveStruct2ABC *arg0[16], struct UnknownSaveStruc
sub_80C06E8(str0, str1, gUnknown_03005D38.var0);
}
-bool8 sub_80C06E8(struct UnknownSaveStruct2ABC *arg0, struct UnknownSaveStruct2ABC *arg1, s8 arg2)
+bool8 sub_80C06E8(struct PokeNews *arg0, struct PokeNews *arg1, s8 arg2)
{
u8 i;
- if (arg1->val0 == 0)
+ if (arg1->kind == 0)
return FALSE;
for (i = 0; i < 16; i++)
{
- if (arg0[i].val0 == arg1->val0)
+ if (arg0[i].kind == arg1->kind)
return FALSE;
}
- arg0[arg2].val0 = arg1->val0;
- arg0[arg2].val1 = 1;
- arg0[arg2].val2 = arg1->val2;
+ arg0[arg2].kind = arg1->kind;
+ arg0[arg2].state = 1;
+ arg0[arg2].days = arg1->days;
return TRUE;
}
-s8 sub_80C0730(struct UnknownSaveStruct2ABC *arg0, u8 arg1)
+s8 sub_80C0730(struct PokeNews *arg0, u8 arg1)
{
- if (arg0[arg1].val0 == 0)
+ if (arg0[arg1].kind == 0)
return -1;
return arg1;
}
@@ -2469,7 +2800,7 @@ void sub_80C0750(void)
for (i = 0; i < 16; i++)
{
- if (gSaveBlock1.unknown_2ABC[i].val0 > 3)
+ if (gSaveBlock1.pokeNews[i].kind > 3)
sub_80BEC10(i);
}
sub_80BEC40();
@@ -2479,18 +2810,18 @@ void sub_80C0788(void)
{
u8 i;
- if (FlagGet(SYS_GAME_CLEAR) != 1)
+ if (FlagGet(FLAG_SYS_GAME_CLEAR) != 1)
{
for (i = 0; i < 16; i++)
- gSaveBlock1.unknown_2ABC[i].val1 = 0;
+ gSaveBlock1.pokeNews[i].state = 0;
}
}
void DoTVShow(void)
{
- if (gSaveBlock1.tvShows[gSpecialVar_0x8004].common.var01 != 0)
+ if (gSaveBlock1.tvShows[gSpecialVar_0x8004].common.active != 0)
{
- switch (gSaveBlock1.tvShows[gSpecialVar_0x8004].common.var00)
+ switch (gSaveBlock1.tvShows[gSpecialVar_0x8004].common.kind)
{
case TVSHOW_FAN_CLUB_LETTER:
DoTVShowPokemonFanClubLetter();
@@ -2547,8 +2878,8 @@ void DoTVShowBravoTrainerPokemonProfile(void)
struct TVShowBravoTrainerPokemonProfiles *bravoTrainer = &gSaveBlock1.tvShows[gSpecialVar_0x8004].bravoTrainer;
u8 state;
- gScriptResult = 0;
- state = gUnknown_020387E8;
+ gSpecialVar_Result = 0;
+ state = sTVShowState;
switch(state)
{
case 0:
@@ -2556,49 +2887,49 @@ void DoTVShowBravoTrainerPokemonProfile(void)
CopyContestCategoryToStringVar(1, bravoTrainer->contestCategory);
sub_80BEF10(2, bravoTrainer->contestRank);
if (!StringCompareWithoutExtCtrlCodes(gSpeciesNames[bravoTrainer->species], bravoTrainer->pokemonNickname))
- gUnknown_020387E8 = 8;
+ sTVShowState = 8;
else
- gUnknown_020387E8 = 1;
+ sTVShowState = 1;
break;
case 1:
StringCopy(gStringVar1, gSpeciesNames[bravoTrainer->species]);
TVShowConvertInternationalString(gStringVar2, bravoTrainer->pokemonNickname, bravoTrainer->var1f);
CopyContestCategoryToStringVar(2, bravoTrainer->contestCategory);
- gUnknown_020387E8 = 2;
+ sTVShowState = 2;
break;
case 2:
TVShowConvertInternationalString(gStringVar1, bravoTrainer->playerName, bravoTrainer->language);
if (bravoTrainer->contestResult == 0) // placed first
- gUnknown_020387E8 = 3;
+ sTVShowState = 3;
else
- gUnknown_020387E8 = 4;
+ sTVShowState = 4;
break;
case 3:
TVShowConvertInternationalString(gStringVar1, bravoTrainer->playerName, bravoTrainer->language);
- sub_80EB3FC(gStringVar2, bravoTrainer->var04[0]);
+ EasyChat_GetWordText(gStringVar2, bravoTrainer->var04[0]);
sub_80BF088(2, bravoTrainer->contestResult + 1);
- gUnknown_020387E8 = 5;
+ sTVShowState = 5;
break;
case 4:
TVShowConvertInternationalString(gStringVar1, bravoTrainer->playerName, bravoTrainer->language);
- sub_80EB3FC(gStringVar2, bravoTrainer->var04[0]);
+ EasyChat_GetWordText(gStringVar2, bravoTrainer->var04[0]);
sub_80BF088(2, bravoTrainer->contestResult + 1);
- gUnknown_020387E8 = 5;
+ sTVShowState = 5;
break;
case 5:
TVShowConvertInternationalString(gStringVar1, bravoTrainer->playerName, bravoTrainer->language);
CopyContestCategoryToStringVar(1, bravoTrainer->contestCategory);
- sub_80EB3FC(gStringVar3, bravoTrainer->var04[1]);
+ EasyChat_GetWordText(gStringVar3, bravoTrainer->var04[1]);
if (bravoTrainer->var14)
- gUnknown_020387E8 = 6;
+ sTVShowState = 6;
else
- gUnknown_020387E8 = 7;
+ sTVShowState = 7;
break;
case 6:
StringCopy(gStringVar1, gSpeciesNames[bravoTrainer->species]);
StringCopy(gStringVar2, gMoveNames[bravoTrainer->var14]);
- sub_80EB3FC(gStringVar3, bravoTrainer->var04[1]);
- gUnknown_020387E8 = 7;
+ EasyChat_GetWordText(gStringVar3, bravoTrainer->var04[1]);
+ sTVShowState = 7;
break;
case 7:
TVShowConvertInternationalString(gStringVar1, bravoTrainer->playerName, bravoTrainer->language);
@@ -2607,7 +2938,7 @@ void DoTVShowBravoTrainerPokemonProfile(void)
break;
case 8:
StringCopy(gStringVar1, gSpeciesNames[bravoTrainer->species]);
- gUnknown_020387E8 = 2;
+ sTVShowState = 2;
break;
}
ShowFieldMessage(gTVBravoTrainerTextGroup[state]);
@@ -2618,80 +2949,80 @@ void DoTVShowBravoTrainerBattleTowerProfile(void)
struct TVShowBravoTrainerBattleTowerSpotlight *bravoTrainerTower = &gSaveBlock1.tvShows[gSpecialVar_0x8004].bravoTrainerTower;
u8 state;
- gScriptResult = 0;
- state = gUnknown_020387E8;
+ gSpecialVar_Result = 0;
+ state = sTVShowState;
switch(state)
{
case 0:
TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->trainerName, bravoTrainerTower->language);
StringCopy(gStringVar2, gSpeciesNames[bravoTrainerTower->species]);
if (bravoTrainerTower->var16 >= 7)
- gUnknown_020387E8 = 1;
+ sTVShowState = 1;
else
- gUnknown_020387E8 = 2;
+ sTVShowState = 2;
break;
case 1:
sub_80BF088(0, bravoTrainerTower->btLevel);
sub_80BF088(1, bravoTrainerTower->var16);
if (bravoTrainerTower->var1c == 1)
- gUnknown_020387E8 = 3;
+ sTVShowState = 3;
else
- gUnknown_020387E8 = 4;
+ sTVShowState = 4;
break;
case 2:
TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->pokemonName, bravoTrainerTower->language);
sub_80BF088(1, bravoTrainerTower->var16 + 1);
if (bravoTrainerTower->var1b == 0)
- gUnknown_020387E8 = 5;
+ sTVShowState = 5;
else
- gUnknown_020387E8 = 6;
+ sTVShowState = 6;
break;
case 3:
TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->pokemonName, bravoTrainerTower->language);
StringCopy(gStringVar2, gSpeciesNames[bravoTrainerTower->defeatedSpecies]);
if (bravoTrainerTower->var1b == 0)
- gUnknown_020387E8 = 5;
+ sTVShowState = 5;
else
- gUnknown_020387E8 = 6;
+ sTVShowState = 6;
break;
case 4:
TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->pokemonName, bravoTrainerTower->language);
StringCopy(gStringVar2, gSpeciesNames[bravoTrainerTower->defeatedSpecies]);
if (bravoTrainerTower->var1b == 0)
- gUnknown_020387E8 = 5;
+ sTVShowState = 5;
else
- gUnknown_020387E8 = 6;
+ sTVShowState = 6;
break;
case 5:
TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->pokemonName, bravoTrainerTower->language);
- gUnknown_020387E8 = 11;
+ sTVShowState = 11;
break;
case 6:
TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->pokemonName, bravoTrainerTower->language);
- gUnknown_020387E8 = 11;
+ sTVShowState = 11;
break;
case 7:
- gUnknown_020387E8 = 11;
+ sTVShowState = 11;
break;
case 8:
case 9:
case 10:
TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->trainerName, bravoTrainerTower->language);
- gUnknown_020387E8 = 11;
+ sTVShowState = 11;
break;
case 11:
- sub_80EB3FC(gStringVar1, bravoTrainerTower->var18[0]);
+ EasyChat_GetWordText(gStringVar1, bravoTrainerTower->var18[0]);
if (bravoTrainerTower->var1b == 0)
- gUnknown_020387E8 = 12;
+ sTVShowState = 12;
else
- gUnknown_020387E8 = 13;
+ sTVShowState = 13;
break;
case 12:
case 13:
- sub_80EB3FC(gStringVar1, bravoTrainerTower->var18[0]);
+ EasyChat_GetWordText(gStringVar1, bravoTrainerTower->var18[0]);
TVShowConvertInternationalString(gStringVar2, bravoTrainerTower->trainerName, bravoTrainerTower->language);
TVShowConvertInternationalString(gStringVar3, bravoTrainerTower->pokemonName, bravoTrainerTower->language);
- gUnknown_020387E8 = 14;
+ sTVShowState = 14;
break;
case 14:
TVShowConvertInternationalString(gStringVar1, bravoTrainerTower->trainerName, bravoTrainerTower->language);
@@ -2707,62 +3038,62 @@ void DoTVShowTodaysSmartShopper(void)
struct TVShowSmartShopper *smartShopper = &gSaveBlock1.tvShows[gSpecialVar_0x8004].smartshopperShow;
u8 state;
- gScriptResult = 0;
- state = gUnknown_020387E8;
+ gSpecialVar_Result = 0;
+ state = sTVShowState;
switch(state)
{
case 0:
TVShowConvertInternationalString(gStringVar1, smartShopper->playerName, smartShopper->language);
GetMapSectionName(gStringVar2, smartShopper->shopLocation, 0);
if (smartShopper->itemAmounts[0] >= 0xff)
- gUnknown_020387E8 = 11;
+ sTVShowState = 11;
else
- gUnknown_020387E8 = 1;
+ sTVShowState = 1;
break;
case 1:
TVShowConvertInternationalString(gStringVar1, smartShopper->playerName, smartShopper->language);
StringCopy(gStringVar2, ItemId_GetItem(smartShopper->itemIds[0])->name);
sub_80BF088(2, smartShopper->itemAmounts[0]);
- gUnknown_020387E8 += (Random() % 4) + 1;
+ sTVShowState += (Random() % 4) + 1;
break;
case 2:
case 4:
case 5:
if (smartShopper->itemIds[1] != 0)
- gUnknown_020387E8 = 6;
+ sTVShowState = 6;
else
- gUnknown_020387E8 = 10;
+ sTVShowState = 10;
break;
case 3:
sub_80BF088(2, smartShopper->itemAmounts[0] + 1);
if (smartShopper->itemIds[1] != 0)
- gUnknown_020387E8 = 6;
+ sTVShowState = 6;
else
- gUnknown_020387E8 = 10;
+ sTVShowState = 10;
break;
case 6:
StringCopy(gStringVar2, ItemId_GetItem(smartShopper->itemIds[1])->name);
sub_80BF088(2, smartShopper->itemAmounts[1]);
if (smartShopper->itemIds[2] != 0)
- gUnknown_020387E8 = 7;
+ sTVShowState = 7;
else if (smartShopper->priceReduced == 1)
- gUnknown_020387E8 = 8;
+ sTVShowState = 8;
else
- gUnknown_020387E8 = 9;
+ sTVShowState = 9;
break;
case 7:
StringCopy(gStringVar2, ItemId_GetItem(smartShopper->itemIds[2])->name);
sub_80BF088(2, smartShopper->itemAmounts[2]);
if (smartShopper->priceReduced == 1)
- gUnknown_020387E8 = 8;
+ sTVShowState = 8;
else
- gUnknown_020387E8 = 9;
+ sTVShowState = 9;
break;
case 8:
if (smartShopper->itemAmounts[0] < 0xff)
- gUnknown_020387E8 = 9;
+ sTVShowState = 9;
else
- gUnknown_020387E8 = 12;
+ sTVShowState = 12;
break;
case 9:
sub_80BF154(1, smartShopper);
@@ -2770,17 +3101,17 @@ void DoTVShowTodaysSmartShopper(void)
break;
case 10:
if (smartShopper->priceReduced == 1)
- gUnknown_020387E8 = 8;
+ sTVShowState = 8;
else
- gUnknown_020387E8 = 9;
+ sTVShowState = 9;
break;
case 11:
TVShowConvertInternationalString(gStringVar1, smartShopper->playerName, smartShopper->language);
StringCopy(gStringVar2, ItemId_GetItem(smartShopper->itemIds[0])->name);
if (smartShopper->priceReduced == 1)
- gUnknown_020387E8 = 8;
+ sTVShowState = 8;
else
- gUnknown_020387E8 = 12;
+ sTVShowState = 12;
break;
case 12:
TVShowConvertInternationalString(gStringVar1, smartShopper->playerName, smartShopper->language);
@@ -2795,15 +3126,15 @@ void DoTVShowTheNameRaterShow(void)
struct TVShowNameRaterShow *nameRaterShow = &gSaveBlock1.tvShows[gSpecialVar_0x8004].nameRaterShow;
u8 state;
- gScriptResult = 0;
- state = gUnknown_020387E8;
+ gSpecialVar_Result = 0;
+ state = sTVShowState;
switch (state)
{
case 0:
TVShowConvertInternationalString(gStringVar1, nameRaterShow->trainerName, nameRaterShow->language);
StringCopy(gStringVar2, gSpeciesNames[nameRaterShow->species]);
TVShowConvertInternationalString(gStringVar3, nameRaterShow->pokemonName, nameRaterShow->pokemonNameLanguage);
- gUnknown_020387E8 = sub_80BF7E8(nameRaterShow) + 1;
+ sTVShowState = sub_80BF7E8(nameRaterShow) + 1;
break;
case 1:
case 3:
@@ -2813,20 +3144,20 @@ void DoTVShowTheNameRaterShow(void)
case 7:
case 8:
if (nameRaterShow->random == 0)
- gUnknown_020387E8 = 9;
+ sTVShowState = 9;
else if (nameRaterShow->random == 1)
- gUnknown_020387E8 = 10;
+ sTVShowState = 10;
else if (nameRaterShow->random == 2)
- gUnknown_020387E8 = 11;
+ sTVShowState = 11;
break;
case 2:
TVShowConvertInternationalString(gStringVar1, nameRaterShow->trainerName, nameRaterShow->language);
if (nameRaterShow->random == 0)
- gUnknown_020387E8 = 9;
+ sTVShowState = 9;
else if (nameRaterShow->random == 1)
- gUnknown_020387E8 = 10;
+ sTVShowState = 10;
else if (nameRaterShow->random == 2)
- gUnknown_020387E8 = 11;
+ sTVShowState = 11;
break;
case 9:
case 10:
@@ -2836,7 +3167,7 @@ void DoTVShowTheNameRaterShow(void)
sub_80BF820(0, 0, 0, 1, 0, nameRaterShow);
TVShowConvertInternationalString(gStringVar2, gStringVar1, nameRaterShow->pokemonNameLanguage);
TVShowConvertInternationalString(gStringVar1, nameRaterShow->pokemonName, nameRaterShow->pokemonNameLanguage);
- gUnknown_020387E8 = 12;
+ sTVShowState = 12;
break;
case 13:
sub_80BF820(0, 0, 3, 1, 0, nameRaterShow);
@@ -2844,7 +3175,7 @@ void DoTVShowTheNameRaterShow(void)
sub_80BF820(0, 0, 2, 0, 0, nameRaterShow);
TVShowConvertInternationalString(gStringVar2, gStringVar1, nameRaterShow->language);
TVShowConvertInternationalString(gStringVar1, nameRaterShow->trainerName, nameRaterShow->language);
- gUnknown_020387E8 = 14;
+ sTVShowState = 14;
break;
case 14:
sub_80BF820(0, 0, 3, 0, 0, nameRaterShow);
@@ -2852,31 +3183,31 @@ void DoTVShowTheNameRaterShow(void)
sub_80BF820(0, 0, 2, 1, 0, nameRaterShow);
TVShowConvertInternationalString(gStringVar2, gStringVar1, nameRaterShow->pokemonNameLanguage);
TVShowConvertInternationalString(gStringVar1, nameRaterShow->trainerName, nameRaterShow->language);
- gUnknown_020387E8 = 18;
+ sTVShowState = 18;
break;
case 15:
sub_80BF820(1, 0, 2, 1, 0, nameRaterShow);
TVShowConvertInternationalString(gStringVar1, gStringVar2, nameRaterShow->pokemonNameLanguage);
StringCopy(gStringVar2, gSpeciesNames[nameRaterShow->species]);
sub_80BF820(2, 0, 3, 2, nameRaterShow->species, nameRaterShow);
- gUnknown_020387E8 = 16;
+ sTVShowState = 16;
break;
case 16:
sub_80BF820(0, 0, 3, 1, 0, nameRaterShow);
TVShowConvertInternationalString(gStringVar3, gStringVar1, nameRaterShow->pokemonNameLanguage);
sub_80BF820(0, 0, 2, 2, nameRaterShow->species, nameRaterShow);
- gUnknown_020387E8 = 17;
+ sTVShowState = 17;
break;
case 17:
sub_80BF820(1, 0, 2, 1, 0, nameRaterShow);
TVShowConvertInternationalString(gStringVar1, gStringVar2, nameRaterShow->pokemonNameLanguage);
sub_80BF820(2, 0, 3, 2, nameRaterShow->var1C, nameRaterShow);
StringCopy(gStringVar2, gSpeciesNames[nameRaterShow->var1C]);
- gUnknown_020387E8 = 18;
+ sTVShowState = 18;
break;
case 12:
state = 18;
- gUnknown_020387E8 = 18;
+ sTVShowState = 18;
case 18:
TVShowConvertInternationalString(gStringVar1, nameRaterShow->pokemonName, nameRaterShow->pokemonNameLanguage);
TVShowConvertInternationalString(gStringVar2, nameRaterShow->trainerName, nameRaterShow->language);
@@ -2891,8 +3222,8 @@ void DoTVShowPokemonTodaySuccessfulCapture(void)
struct TVShowPokemonToday *pokemonToday = &gSaveBlock1.tvShows[gSpecialVar_0x8004].pokemonToday;
u8 state;
- gScriptResult = 0;
- state = gUnknown_020387E8;
+ gSpecialVar_Result = 0;
+ state = sTVShowState;
switch (state)
{
case 0:
@@ -2900,53 +3231,53 @@ void DoTVShowPokemonTodaySuccessfulCapture(void)
StringCopy(gStringVar2, gSpeciesNames[pokemonToday->species]);
TVShowConvertInternationalString(gStringVar3, pokemonToday->nickname, pokemonToday->language2);
if (pokemonToday->ball == ITEM_MASTER_BALL)
- gUnknown_020387E8 = 5;
+ sTVShowState = 5;
else
- gUnknown_020387E8 = 1;
+ sTVShowState = 1;
break;
case 1:
- gUnknown_020387E8 = 2;
+ sTVShowState = 2;
break;
case 2:
StringCopy(gStringVar2, ItemId_GetItem(pokemonToday->ball)->name);
sub_80BF088(2, pokemonToday->var12);
if (pokemonToday->var12 < 4)
- gUnknown_020387E8 = 3;
+ sTVShowState = 3;
else
- gUnknown_020387E8 = 4;
+ sTVShowState = 4;
break;
case 3:
TVShowConvertInternationalString(gStringVar1, pokemonToday->playerName, pokemonToday->language);
StringCopy(gStringVar2, gSpeciesNames[pokemonToday->species]);
TVShowConvertInternationalString(gStringVar3, pokemonToday->nickname, pokemonToday->language2);
- gUnknown_020387E8 = 6;
+ sTVShowState = 6;
break;
case 4:
- gUnknown_020387E8 = 6;
+ sTVShowState = 6;
break;
case 5:
TVShowConvertInternationalString(gStringVar1, pokemonToday->playerName, pokemonToday->language);
StringCopy(gStringVar2, gSpeciesNames[pokemonToday->species]);
- gUnknown_020387E8 = 6;
+ sTVShowState = 6;
break;
case 6:
TVShowConvertInternationalString(gStringVar1, pokemonToday->playerName, pokemonToday->language);
StringCopy(gStringVar2, gSpeciesNames[pokemonToday->species]);
TVShowConvertInternationalString(gStringVar3, pokemonToday->nickname, pokemonToday->language2);
- gUnknown_020387E8 += (Random() % 4) + 1;
+ sTVShowState += (Random() % 4) + 1;
break;
case 7:
case 8:
StringCopy(gStringVar1, gSpeciesNames[pokemonToday->species]);
TVShowConvertInternationalString(gStringVar2, pokemonToday->nickname, pokemonToday->language2);
sub_80BF638(2, pokemonToday->species);
- gUnknown_020387E8 = 11;
+ sTVShowState = 11;
break;
case 9:
case 10:
StringCopy(gStringVar1, gSpeciesNames[pokemonToday->species]);
TVShowConvertInternationalString(gStringVar2, pokemonToday->nickname, pokemonToday->language2);
- gUnknown_020387E8 = 11;
+ sTVShowState = 11;
break;
case 11:
TVShowDone();
@@ -2960,37 +3291,37 @@ void DoTVShowPokemonTodayFailedCapture(void)
struct TVShowPokemonTodayFailed *pokemonTodayFailed = &gSaveBlock1.tvShows[gSpecialVar_0x8004].pokemonTodayFailed;
u8 state;
- gScriptResult = 0;
- state = gUnknown_020387E8;
+ gSpecialVar_Result = 0;
+ state = sTVShowState;
switch (state)
{
case 0:
TVShowConvertInternationalString(gStringVar1, pokemonTodayFailed->playerName, pokemonTodayFailed->language);
StringCopy(gStringVar2, gSpeciesNames[pokemonTodayFailed->species]);
- gUnknown_020387E8 = 1;
+ sTVShowState = 1;
break;
case 1:
TVShowConvertInternationalString(gStringVar1, pokemonTodayFailed->playerName, pokemonTodayFailed->language);
GetMapSectionName(gStringVar2, pokemonTodayFailed->var12, 0);
StringCopy(gStringVar3, gSpeciesNames[pokemonTodayFailed->species2]);
if (pokemonTodayFailed->var11 == 1)
- gUnknown_020387E8 = 3;
+ sTVShowState = 3;
else
- gUnknown_020387E8 = 2;
+ sTVShowState = 2;
break;
case 2:
case 3:
TVShowConvertInternationalString(gStringVar1, pokemonTodayFailed->playerName, pokemonTodayFailed->language);
sub_80BF088(1, pokemonTodayFailed->var10);
if ((Random() % 3) == 0)
- gUnknown_020387E8 = 5;
+ sTVShowState = 5;
else
- gUnknown_020387E8 = 4;
+ sTVShowState = 4;
break;
case 4:
case 5:
TVShowConvertInternationalString(gStringVar1, pokemonTodayFailed->playerName, pokemonTodayFailed->language);
- gUnknown_020387E8 = 6;
+ sTVShowState = 6;
break;
case 6:
TVShowDone();
@@ -3005,33 +3336,33 @@ void DoTVShowPokemonFanClubLetter(void)
u8 state;
u16 rval;
- gScriptResult = 0;
- state = gUnknown_020387E8;
+ gSpecialVar_Result = 0;
+ state = sTVShowState;
switch (state)
{
case 0:
TVShowConvertInternationalString(gStringVar1, fanclubLetter->playerName, fanclubLetter->language);
StringCopy(gStringVar2, gSpeciesNames[fanclubLetter->species]);
- gUnknown_020387E8 = 50;
+ sTVShowState = 50;
break;
case 1:
rval = (Random() % 4) + 1;
if (rval == 1)
- gUnknown_020387E8 = 2;
+ sTVShowState = 2;
else
- gUnknown_020387E8 = rval + 2;
+ sTVShowState = rval + 2;
break;
case 2:
- gUnknown_020387E8 = 51;
+ sTVShowState = 51;
break;
case 3:
- gUnknown_020387E8 += (Random() % 3) + 1;
+ sTVShowState += (Random() % 3) + 1;
break;
case 4:
case 5:
case 6:
sub_80BF79C((TVShow *)fanclubLetter);
- gUnknown_020387E8 = 7;
+ sTVShowState = 7;
break;
case 7:
rval = (Random() % 0x1f) + 0x46;
@@ -3041,12 +3372,12 @@ void DoTVShowPokemonFanClubLetter(void)
case 50:
ConvertEasyChatWordsToString(gStringVar4, fanclubLetter->pad04, 2, 2);
ShowFieldMessage(gStringVar4);
- gUnknown_020387E8 = 1;
+ sTVShowState = 1;
return;
case 51:
ConvertEasyChatWordsToString(gStringVar4, fanclubLetter->pad04, 2, 2);
ShowFieldMessage(gStringVar4);
- gUnknown_020387E8 = 3;
+ sTVShowState = 3;
return;
}
ShowFieldMessage(gTVFanClubTextGroup[state]);
@@ -3057,22 +3388,22 @@ void DoTVShowRecentHappenings(void)
struct TVShowRecentHappenings *recentHappenings = &gSaveBlock1.tvShows[gSpecialVar_0x8004].recentHappenings;
u8 state;
- gScriptResult = 0;
- state = gUnknown_020387E8;
+ gSpecialVar_Result = 0;
+ state = sTVShowState;
switch (state)
{
case 0:
TVShowConvertInternationalString(gStringVar1, recentHappenings->playerName, recentHappenings->language);
sub_80BF79C((TVShow *)recentHappenings);
- gUnknown_020387E8 = 50;
+ sTVShowState = 50;
break;
case 1:
- gUnknown_020387E8 += 1 + (Random() % 3);
+ sTVShowState += 1 + (Random() % 3);
break;
case 2:
case 3:
case 4:
- gUnknown_020387E8 = 5;
+ sTVShowState = 5;
break;
case 5:
TVShowDone();
@@ -3080,7 +3411,7 @@ void DoTVShowRecentHappenings(void)
case 50:
ConvertEasyChatWordsToString(gStringVar4, recentHappenings->var04, 2, 2);
ShowFieldMessage(gStringVar4);
- gUnknown_020387E8 = 1;
+ sTVShowState = 1;
return;
}
ShowFieldMessage(gTVRecentHappeningsTextGroup[state]);
@@ -3091,27 +3422,27 @@ void DoTVShowPokemonFanClubOpinions(void)
struct TVShowFanclubOpinions *fanclubOpinions = &gSaveBlock1.tvShows[gSpecialVar_0x8004].fanclubOpinions;
u8 state;
- gScriptResult = 0;
- state = gUnknown_020387E8;
+ gSpecialVar_Result = 0;
+ state = sTVShowState;
switch (state)
{
case 0:
TVShowConvertInternationalString(gStringVar1, fanclubOpinions->playerName, fanclubOpinions->language);
StringCopy(gStringVar2, gSpeciesNames[fanclubOpinions->var02]);
TVShowConvertInternationalString(gStringVar3, fanclubOpinions->var10, fanclubOpinions->var0E);
- gUnknown_020387E8 = fanclubOpinions->var04B + 1;
+ sTVShowState = fanclubOpinions->var04B + 1;
break;
case 1:
case 2:
case 3:
TVShowConvertInternationalString(gStringVar1, fanclubOpinions->playerName, fanclubOpinions->language);
StringCopy(gStringVar2, gSpeciesNames[fanclubOpinions->var02]);
- sub_80EB3FC(gStringVar3, fanclubOpinions->var1C[0]);
- gUnknown_020387E8 = 4;
+ EasyChat_GetWordText(gStringVar3, fanclubOpinions->var1C[0]);
+ sTVShowState = 4;
break;
case 4:
TVShowConvertInternationalString(gStringVar1, fanclubOpinions->playerName, fanclubOpinions->language);
- sub_80EB3FC(gStringVar3, fanclubOpinions->var1C[1]);
+ EasyChat_GetWordText(gStringVar3, fanclubOpinions->var1C[1]);
TVShowDone();
break;
}
@@ -3130,57 +3461,57 @@ void DoTVShowPokemonNewsMassOutbreak(void)
StringCopy(gStringVar2, gSpeciesNames[massOutbreak->species]);
TVShowDone();
StartMassOutbreak();
- ShowFieldMessage(gTVPokemonOutbreakTextGroup[gUnknown_020387E8]);
+ ShowFieldMessage(gTVPokemonOutbreakTextGroup[sTVShowState]);
}
void DoTVShowInSearchOfTrainers(void)
{
u8 state;
- gScriptResult = 0;
- state = gUnknown_020387E8;
+ gSpecialVar_Result = 0;
+ state = sTVShowState;
switch (state)
{
case 0:
GetMapSectionName(gStringVar1, gSaveBlock1.gabbyAndTyData.mapnum, 0);
if (gSaveBlock1.gabbyAndTyData.battleNum > 1)
- gUnknown_020387E8 = 1;
+ sTVShowState = 1;
else
- gUnknown_020387E8 = 2;
+ sTVShowState = 2;
break;
case 1:
- gUnknown_020387E8 = 2;
+ sTVShowState = 2;
break;
case 2:
if (gSaveBlock1.gabbyAndTyData.valA_0 == 0)
- gUnknown_020387E8 = 4;
+ sTVShowState = 4;
else if (gSaveBlock1.gabbyAndTyData.valA_3 != 0)
- gUnknown_020387E8 = 5;
+ sTVShowState = 5;
else if (gSaveBlock1.gabbyAndTyData.valA_2 != 0)
- gUnknown_020387E8 = 6;
+ sTVShowState = 6;
else if (gSaveBlock1.gabbyAndTyData.valA_1 != 0)
- gUnknown_020387E8 = 7;
+ sTVShowState = 7;
else
- gUnknown_020387E8 = 3;
+ sTVShowState = 3;
break;
case 3:
StringCopy(gStringVar1, gSpeciesNames[gSaveBlock1.gabbyAndTyData.mon1]);
StringCopy(gStringVar2, gMoveNames[gSaveBlock1.gabbyAndTyData.lastMove]);
StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1.gabbyAndTyData.mon2]);
- gUnknown_020387E8 = 8;
+ sTVShowState = 8;
break;
case 4:
case 5:
case 6:
case 7:
- gUnknown_020387E8 = 8;
+ sTVShowState = 8;
break;
case 8:
- sub_80EB3FC(gStringVar1, gSaveBlock1.gabbyAndTyData.quote);
+ EasyChat_GetWordText(gStringVar1, gSaveBlock1.gabbyAndTyData.quote);
StringCopy(gStringVar2, gSpeciesNames[gSaveBlock1.gabbyAndTyData.mon1]);
StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1.gabbyAndTyData.mon2]);
- gScriptResult = 1;
- gUnknown_020387E8 = 0;;
+ gSpecialVar_Result = 1;
+ sTVShowState = 0;;
TakeTVShowInSearchOfTrainersOffTheAir();
break;
}
@@ -3192,12 +3523,12 @@ void DoTVShowPokemonAngler(void)
struct TVShowPokemonAngler *pokemonAngler = &gSaveBlock1.tvShows[gSpecialVar_0x8004].pokemonAngler;
u8 state;
- gScriptResult = 0;
+ gSpecialVar_Result = 0;
if (pokemonAngler->var02 < pokemonAngler->var03)
- gUnknown_020387E8 = 0;
+ sTVShowState = 0;
else
- gUnknown_020387E8 = 1;
- state = gUnknown_020387E8;
+ sTVShowState = 1;
+ state = sTVShowState;
switch (state)
{
case 0:
@@ -3221,8 +3552,8 @@ void DoTVShowTheWorldOfMasters(void)
struct TVShowWorldOfMasters *worldOfMasters = &gSaveBlock1.tvShows[gSpecialVar_0x8004].worldOfMasters;
u8 state;
- gScriptResult = 0;
- state = gUnknown_020387E8;
+ gSpecialVar_Result = 0;
+ state = sTVShowState;
switch (state)
{
case 0:
@@ -3230,11 +3561,11 @@ void DoTVShowTheWorldOfMasters(void)
worldOfMasters->language);
sub_80BF088(1, worldOfMasters->var06);
sub_80BF088(2, worldOfMasters->var02);
- gUnknown_020387E8 = 1;
+ sTVShowState = 1;
break;
case 1:
StringCopy(gStringVar1, gSpeciesNames[worldOfMasters->var08]);
- gUnknown_020387E8 = 2;
+ sTVShowState = 2;
break;
case 2:
TVShowConvertInternationalString(gStringVar1, worldOfMasters->playerName,
@@ -3249,12 +3580,12 @@ void DoTVShowTheWorldOfMasters(void)
void TVShowDone(void)
{
- gScriptResult = 1;
- gUnknown_020387E8 = 0;
- gSaveBlock1.tvShows[gSpecialVar_0x8004].common.var01 = 0;
+ gSpecialVar_Result = 1;
+ sTVShowState = 0;
+ gSaveBlock1.tvShows[gSpecialVar_0x8004].common.active = 0;
}
-void sub_80C2014(void)
+void ResetTVShowState(void)
{
- gUnknown_020387E8 = 0;
+ sTVShowState = 0;
}
diff --git a/src/use_pokeblock.c b/src/field/use_pokeblock.c
index 0c8f59959..7253ac901 100644
--- a/src/use_pokeblock.c
+++ b/src/field/use_pokeblock.c
@@ -1,11 +1,11 @@
//
-// Created by Scott Norton on 5/31/17.
+
// Modified by Dizzy Egg on 8/15/17.
//
#include "global.h"
#include "main.h"
-#include "rom4.h"
+#include "overworld.h"
#include "string_util.h"
#include "strings.h"
#include "sprite.h"
@@ -15,17 +15,17 @@
#include "text.h"
#include "menu.h"
#include "sound.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "pokeblock.h"
#define GFX_TAG_CONDITIONUPDOWN 0
#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
};
@@ -105,7 +105,7 @@ EWRAM_DATA u8 gPokeblockMonID = 0;
EWRAM_DATA s16 gPokeblockGain = 0;
extern u16 gKeyRepeatStartDelay;
-extern u16 gScriptItemId; // FIXME: remove after merge of #349 Pokeblock
+extern u16 gSpecialVar_ItemId; // FIXME: remove after merge of #349 Pokeblock
static void launch_c3_walk_stairs_and_run_once(void (*const)(void));
static void sub_81361E4(void);
@@ -244,7 +244,7 @@ static void sub_8136294(void)
case 6:
gUnknown_083DFEC4->unk76AA = 0;
gUnknown_083DFEC4->unk87E0 = NULL;
- gUnknown_083DFEC4->unk030C = 0x20;
+ gUnknown_083DFEC4->unk030C.val = 0x20;
gUnknown_02039304->unk50++;
break;
case 7:
@@ -574,7 +574,7 @@ static void sub_81369CC(void)
case 5:
if (gMain.newKeys & (A_BUTTON | B_BUTTON) && !sub_8136D00())
{
- PokeblockClearIfExists((u8)gScriptItemId);
+ PokeblockClearIfExists((u8)gSpecialVar_ItemId);
launch_c3_walk_stairs_and_run_once(sub_8136B44);
}
break;
@@ -893,11 +893,11 @@ static void sub_8137138(void)
static void sub_81371DC(struct Sprite *sprite)
{
- if (sprite->data0 <= 5)
+ if (sprite->data[0] <= 5)
sprite->pos2.y -= 2;
- else if (sprite->data0 <= 11)
+ else if (sprite->data[0] <= 11)
sprite->pos2.y += 2;
- if ((++sprite->data0) > 60)
+ if ((++sprite->data[0]) > 60)
{
DestroySprite(sprite);
gUnknown_02039304->unk54--;
diff --git a/src/wallclock.c b/src/field/wallclock.c
index 8db13dc2d..2892d09f9 100644
--- a/src/wallclock.c
+++ b/src/field/wallclock.c
@@ -5,7 +5,7 @@
#include "menu.h"
#include "palette.h"
#include "rtc.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "strings2.h"
#include "task.h"
@@ -288,22 +288,22 @@ void CB2_StartWallClock(void)
gTasks[taskId].tHourHandAngle = 300;
spriteId = CreateSprite(&gSpriteTemplate_83F7AD8, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 1);
- gSprites[spriteId].data0 = taskId;
+ gSprites[spriteId].data[0] = taskId;
gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;
gSprites[spriteId].oam.matrixNum = 0;
spriteId = CreateSprite(&gSpriteTemplate_83F7AF0, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 0);
- gSprites[spriteId].data0 = taskId;
+ gSprites[spriteId].data[0] = taskId;
gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;
gSprites[spriteId].oam.matrixNum = 1;
spriteId = CreateSprite(&gSpriteTemplate_83F7B28, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 2);
- gSprites[spriteId].data0 = taskId;
- gSprites[spriteId].data1 = 45;
+ gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].data[1] = 45;
spriteId = CreateSprite(&gSpriteTemplate_83F7B40, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 2);
- gSprites[spriteId].data0 = taskId;
- gSprites[spriteId].data1 = 90;
+ gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].data[1] = 90;
WallClockInit();
}
@@ -333,22 +333,22 @@ void CB2_ViewWallClock(void)
}
spriteId = CreateSprite(&gSpriteTemplate_83F7AD8, 120, 80, 1);
- gSprites[spriteId].data0 = taskId;
+ gSprites[spriteId].data[0] = taskId;
gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;
gSprites[spriteId].oam.matrixNum = 0;
spriteId = CreateSprite(&gSpriteTemplate_83F7AF0, 120, 80, 0);
- gSprites[spriteId].data0 = taskId;
+ gSprites[spriteId].data[0] = taskId;
gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;
gSprites[spriteId].oam.matrixNum = 1;
spriteId = CreateSprite(&gSpriteTemplate_83F7B28, 120, 80, 2);
- gSprites[spriteId].data0 = taskId;
- gSprites[spriteId].data1 = angle1;
+ gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].data[1] = angle1;
spriteId = CreateSprite(&gSpriteTemplate_83F7B40, 120, 80, 2);
- gSprites[spriteId].data0 = taskId;
- gSprites[spriteId].data1 = angle2;
+ gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].data[1] = angle2;
WallClockInit();
}
@@ -968,7 +968,7 @@ static void sub_810B05C(struct Sprite *sprite)
u16 x;
u16 y;
- angle = gTasks[sprite->data0].tMinuteHandAngle;
+ angle = gTasks[sprite->data[0]].tMinuteHandAngle;
sin = Sin2(angle) / 16;
cos = Cos2(angle) / 16;
SetOamMatrix(0, cos, sin, -sin, cos);
@@ -993,7 +993,7 @@ static void sub_810B0F4(struct Sprite *sprite)
u16 x;
u16 y;
- angle = gTasks[sprite->data0].tHourHandAngle;
+ angle = gTasks[sprite->data[0]].tHourHandAngle;
sin = Sin2(angle) / 16;
cos = Cos2(angle) / 16;
SetOamMatrix(1, cos, sin, -sin, cos);
@@ -1015,23 +1015,23 @@ static void sub_810B18C(struct Sprite *sprite)
s16 sin;
s16 cos;
- if (gTasks[sprite->data0].tPeriod != PERIOD_AM)
+ if (gTasks[sprite->data[0]].tPeriod != PERIOD_AM)
{
- if (sprite->data1 >= 60 && sprite->data1 < 90)
- sprite->data1 += 5;
- if (sprite->data1 < 60)
- sprite->data1++;
+ if (sprite->data[1] >= 60 && sprite->data[1] < 90)
+ sprite->data[1] += 5;
+ if (sprite->data[1] < 60)
+ sprite->data[1]++;
}
else
{
- if (sprite->data1 > 45 && sprite->data1 <= 75)
- sprite->data1 -= 5;
- if (sprite->data1 > 75)
- sprite->data1--;
+ if (sprite->data[1] > 45 && sprite->data[1] <= 75)
+ sprite->data[1] -= 5;
+ if (sprite->data[1] > 75)
+ sprite->data[1]--;
}
- cos = Cos2((u16)sprite->data1);
+ cos = Cos2((u16)sprite->data[1]);
sprite->pos2.x = cos * 30 / 4096;
- sin = Sin2((u16)sprite->data1);
+ sin = Sin2((u16)sprite->data[1]);
sprite->pos2.y = sin * 30 / 4096;
}
@@ -1040,22 +1040,22 @@ static void sub_810B230(struct Sprite *sprite)
s16 sin;
s16 cos;
- if (gTasks[sprite->data0].tPeriod != PERIOD_AM)
+ if (gTasks[sprite->data[0]].tPeriod != PERIOD_AM)
{
- if (sprite->data1 >= 105 && sprite->data1 < 135)
- sprite->data1 += 5;
- if (sprite->data1 < 105)
- sprite->data1++;
+ if (sprite->data[1] >= 105 && sprite->data[1] < 135)
+ sprite->data[1] += 5;
+ if (sprite->data[1] < 105)
+ sprite->data[1]++;
}
else
{
- if (sprite->data1 > 90 && sprite->data1 <= 120)
- sprite->data1 -= 5;
- if (sprite->data1 > 120)
- sprite->data1--;
+ if (sprite->data[1] > 90 && sprite->data[1] <= 120)
+ sprite->data[1] -= 5;
+ if (sprite->data[1] > 120)
+ sprite->data[1]--;
}
- cos = Cos2((u16)sprite->data1);
+ cos = Cos2((u16)sprite->data[1]);
sprite->pos2.x = cos * 30 / 4096;
- sin = Sin2((u16)sprite->data1);
+ sin = Sin2((u16)sprite->data[1]);
sprite->pos2.y = sin * 30 / 4096;
}
diff --git a/src/wild_encounter.c b/src/field/wild_encounter.c
index 7001c2eaa..4bf83cad8 100644
--- a/src/wild_encounter.c
+++ b/src/field/wild_encounter.c
@@ -1,18 +1,19 @@
#include "global.h"
#include "wild_encounter.h"
-#include "abilities.h"
+#include "constants/abilities.h"
#include "battle_setup.h"
#include "event_data.h"
#include "field_player_avatar.h"
#include "fieldmap.h"
+#include "constants/maps.h"
#include "metatile_behavior.h"
#include "pokeblock.h"
-#include "rng.h"
+#include "random.h"
#include "roamer.h"
-#include "rom4.h"
+#include "overworld.h"
#include "safari_zone.h"
#include "script.h"
-#include "species.h"
+#include "constants/species.h"
#include "tv.h"
const struct WildPokemon PetalburgCity_WaterMons [] =
@@ -2897,11 +2898,805 @@ const struct WildPokemon Underwater2_WaterMons [] =
};
const struct WildPokemonInfo Underwater2_WaterMonsInfo = {4, Underwater2_WaterMons};
+const struct WildPokemonHeader gWildMonHeaders[] =
+{
+ {
+ .mapGroup = MAP_GROUP(PETALBURG_CITY),
+ .mapNum = MAP_NUM(PETALBURG_CITY),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &PetalburgCity_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &PetalburgCity_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(SLATEPORT_CITY),
+ .mapNum = MAP_NUM(SLATEPORT_CITY),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &SlateportCity_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &SlateportCity_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(LILYCOVE_CITY),
+ .mapNum = MAP_NUM(LILYCOVE_CITY),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &LilycoveCity_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &LilycoveCity_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(MOSSDEEP_CITY),
+ .mapNum = MAP_NUM(MOSSDEEP_CITY),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &MossdeepCity_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &MossdeepCity_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(SOOTOPOLIS_CITY),
+ .mapNum = MAP_NUM(SOOTOPOLIS_CITY),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &SootopolisCity_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &SootopolisCity_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(EVER_GRANDE_CITY),
+ .mapNum = MAP_NUM(EVER_GRANDE_CITY),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &EverGrandeCity_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &EverGrandeCity_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(METEOR_FALLS_1F_1R),
+ .mapNum = MAP_NUM(METEOR_FALLS_1F_1R),
+ .landMonsInfo = &MeteorFalls_1F_1R_LandMonsInfo,
+ .waterMonsInfo = &MeteorFalls_1F_1R_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &MeteorFalls_1F_1R_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(METEOR_FALLS_1F_2R),
+ .mapNum = MAP_NUM(METEOR_FALLS_1F_2R),
+ .landMonsInfo = &MeteorFalls_1F_2R_LandMonsInfo,
+ .waterMonsInfo = &MeteorFalls_1F_2R_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &MeteorFalls_1F_2R_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(METEOR_FALLS_B1F_1R),
+ .mapNum = MAP_NUM(METEOR_FALLS_B1F_1R),
+ .landMonsInfo = &MeteorFalls_B1F_1R_LandMonsInfo,
+ .waterMonsInfo = &MeteorFalls_B1F_1R_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &MeteorFalls_B1F_1R_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(METEOR_FALLS_B1F_2R),
+ .mapNum = MAP_NUM(METEOR_FALLS_B1F_2R),
+ .landMonsInfo = &MeteorFalls_B1F_2R_LandMonsInfo,
+ .waterMonsInfo = &MeteorFalls_B1F_2R_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &MeteorFalls_B1F_2R_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(RUSTURF_TUNNEL),
+ .mapNum = MAP_NUM(RUSTURF_TUNNEL),
+ .landMonsInfo = &RusturfTunnel_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(GRANITE_CAVE_1F),
+ .mapNum = MAP_NUM(GRANITE_CAVE_1F),
+ .landMonsInfo = &GraniteCave_1F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(GRANITE_CAVE_B1F),
+ .mapNum = MAP_NUM(GRANITE_CAVE_B1F),
+ .landMonsInfo = &GraniteCave_B1F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(GRANITE_CAVE_B2F),
+ .mapNum = MAP_NUM(GRANITE_CAVE_B2F),
+ .landMonsInfo = &GraniteCave_B2F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = &GraniteCave_B2F_RockSmashMonsInfo,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(GRANITE_CAVE_STEVENS_ROOM),
+ .mapNum = MAP_NUM(GRANITE_CAVE_STEVENS_ROOM),
+ .landMonsInfo = &GraniteCave_StevensRoom_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(PETALBURG_WOODS),
+ .mapNum = MAP_NUM(PETALBURG_WOODS),
+ .landMonsInfo = &PetalburgWoods_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(JAGGED_PASS),
+ .mapNum = MAP_NUM(JAGGED_PASS),
+ .landMonsInfo = &JaggedPass_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(FIERY_PATH),
+ .mapNum = MAP_NUM(FIERY_PATH),
+ .landMonsInfo = &FieryPath_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(MT_PYRE_1F),
+ .mapNum = MAP_NUM(MT_PYRE_1F),
+ .landMonsInfo = &MtPyre_1F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(MT_PYRE_2F),
+ .mapNum = MAP_NUM(MT_PYRE_2F),
+ .landMonsInfo = &MtPyre_2F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(MT_PYRE_3F),
+ .mapNum = MAP_NUM(MT_PYRE_3F),
+ .landMonsInfo = &MtPyre_3F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(MT_PYRE_4F),
+ .mapNum = MAP_NUM(MT_PYRE_4F),
+ .landMonsInfo = &MtPyre_4F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(MT_PYRE_5F),
+ .mapNum = MAP_NUM(MT_PYRE_5F),
+ .landMonsInfo = &MtPyre_5F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(MT_PYRE_6F),
+ .mapNum = MAP_NUM(MT_PYRE_6F),
+ .landMonsInfo = &MtPyre_6F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(MT_PYRE_EXTERIOR),
+ .mapNum = MAP_NUM(MT_PYRE_EXTERIOR),
+ .landMonsInfo = &MtPyre_Exterior_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(MT_PYRE_SUMMIT),
+ .mapNum = MAP_NUM(MT_PYRE_SUMMIT),
+ .landMonsInfo = &MtPyre_Summit_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ENTRANCE),
+ .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ENTRANCE),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &SeafloorCavern_Entrance_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &SeafloorCavern_Entrance_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM1),
+ .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM1),
+ .landMonsInfo = &SeafloorCavern_Room1_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM2),
+ .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM2),
+ .landMonsInfo = &SeafloorCavern_Room2_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM3),
+ .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM3),
+ .landMonsInfo = &SeafloorCavern_Room3_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM4),
+ .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM4),
+ .landMonsInfo = &SeafloorCavern_Room4_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM5),
+ .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM5),
+ .landMonsInfo = &SeafloorCavern_Room5_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM6),
+ .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM6),
+ .landMonsInfo = &SeafloorCavern_Room6_LandMonsInfo,
+ .waterMonsInfo = &SeafloorCavern_Room6_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &SeafloorCavern_Room6_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM7),
+ .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM7),
+ .landMonsInfo = &SeafloorCavern_Room7_LandMonsInfo,
+ .waterMonsInfo = &SeafloorCavern_Room7_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &SeafloorCavern_Room7_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(SEAFLOOR_CAVERN_ROOM8),
+ .mapNum = MAP_NUM(SEAFLOOR_CAVERN_ROOM8),
+ .landMonsInfo = &SeafloorCavern_Room8_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(CAVE_OF_ORIGIN_ENTRANCE),
+ .mapNum = MAP_NUM(CAVE_OF_ORIGIN_ENTRANCE),
+ .landMonsInfo = &CaveOfOrigin_Entrance_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(CAVE_OF_ORIGIN_1F),
+ .mapNum = MAP_NUM(CAVE_OF_ORIGIN_1F),
+ .landMonsInfo = &CaveOfOrigin_1F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(CAVE_OF_ORIGIN_B1F),
+ .mapNum = MAP_NUM(CAVE_OF_ORIGIN_B1F),
+ .landMonsInfo = &CaveOfOrigin_B1F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(CAVE_OF_ORIGIN_B2F),
+ .mapNum = MAP_NUM(CAVE_OF_ORIGIN_B2F),
+ .landMonsInfo = &CaveOfOrigin_B2F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(CAVE_OF_ORIGIN_B3F),
+ .mapNum = MAP_NUM(CAVE_OF_ORIGIN_B3F),
+ .landMonsInfo = &CaveOfOrigin_B3F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(VICTORY_ROAD_1F),
+ .mapNum = MAP_NUM(VICTORY_ROAD_1F),
+ .landMonsInfo = &VictoryRoad_1F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(VICTORY_ROAD_B1F),
+ .mapNum = MAP_NUM(VICTORY_ROAD_B1F),
+ .landMonsInfo = &VictoryRoad_B1F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = &VictoryRoad_B1F_RockSmashMonsInfo,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(VICTORY_ROAD_B2F),
+ .mapNum = MAP_NUM(VICTORY_ROAD_B2F),
+ .landMonsInfo = &VictoryRoad_B2F_LandMonsInfo,
+ .waterMonsInfo = &VictoryRoad_B2F_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &VictoryRoad_B2F_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM),
+ .mapNum = MAP_NUM(SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM),
+ .landMonsInfo = &ShoalCave_LowTideEntranceRoom_LandMonsInfo,
+ .waterMonsInfo = &ShoalCave_LowTideEntranceRoom_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &ShoalCave_LowTideEntranceRoom_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(SHOAL_CAVE_LOW_TIDE_INNER_ROOM),
+ .mapNum = MAP_NUM(SHOAL_CAVE_LOW_TIDE_INNER_ROOM),
+ .landMonsInfo = &ShoalCave_LowTideInnerRoom_LandMonsInfo,
+ .waterMonsInfo = &ShoalCave_LowTideInnerRoom_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &ShoalCave_LowTideInnerRoom_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM),
+ .mapNum = MAP_NUM(SHOAL_CAVE_LOW_TIDE_STAIRS_ROOM),
+ .landMonsInfo = &ShoalCave_LowTideStairsRoom_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(SHOAL_CAVE_LOW_TIDE_LOWER_ROOM),
+ .mapNum = MAP_NUM(SHOAL_CAVE_LOW_TIDE_LOWER_ROOM),
+ .landMonsInfo = &ShoalCave_LowTideLowerRoom_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(SHOAL_CAVE_LOW_TIDE_ICE_ROOM),
+ .mapNum = MAP_NUM(SHOAL_CAVE_LOW_TIDE_ICE_ROOM),
+ .landMonsInfo = &ShoalCave_LowTideIceRoom_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(NEW_MAUVILLE_ENTRANCE),
+ .mapNum = MAP_NUM(NEW_MAUVILLE_ENTRANCE),
+ .landMonsInfo = &NewMauville_Entrance_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(NEW_MAUVILLE_INSIDE),
+ .mapNum = MAP_NUM(NEW_MAUVILLE_INSIDE),
+ .landMonsInfo = &NewMauville_Inside_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(ABANDONED_SHIP_ROOMS_B1F),
+ .mapNum = MAP_NUM(ABANDONED_SHIP_ROOMS_B1F),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &AbandonedShip_Rooms_B1F_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &AbandonedShip_Rooms_B1F_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS),
+ .mapNum = MAP_NUM(ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &AbandonedShip_HiddenFloorCorridors_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &AbandonedShip_HiddenFloorCorridors_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(SKY_PILLAR_1F),
+ .mapNum = MAP_NUM(SKY_PILLAR_1F),
+ .landMonsInfo = &SkyPillar_1F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(SKY_PILLAR_3F),
+ .mapNum = MAP_NUM(SKY_PILLAR_3F),
+ .landMonsInfo = &SkyPillar_3F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(SKY_PILLAR_5F),
+ .mapNum = MAP_NUM(SKY_PILLAR_5F),
+ .landMonsInfo = &SkyPillar_5F_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE101),
+ .mapNum = MAP_NUM(ROUTE101),
+ .landMonsInfo = &Route101_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE102),
+ .mapNum = MAP_NUM(ROUTE102),
+ .landMonsInfo = &Route102_LandMonsInfo,
+ .waterMonsInfo = &Route102_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &Route102_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE103),
+ .mapNum = MAP_NUM(ROUTE103),
+ .landMonsInfo = &Route103_LandMonsInfo,
+ .waterMonsInfo = &Route103_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &Route103_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE104),
+ .mapNum = MAP_NUM(ROUTE104),
+ .landMonsInfo = &Route104_LandMonsInfo,
+ .waterMonsInfo = &Route104_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &Route104_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE105),
+ .mapNum = MAP_NUM(ROUTE105),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &Route105_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &Route105_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE106),
+ .mapNum = MAP_NUM(ROUTE106),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &Route106_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &Route106_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE107),
+ .mapNum = MAP_NUM(ROUTE107),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &Route107_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &Route107_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE108),
+ .mapNum = MAP_NUM(ROUTE108),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &Route108_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &Route108_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE109),
+ .mapNum = MAP_NUM(ROUTE109),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &Route109_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &Route109_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE110),
+ .mapNum = MAP_NUM(ROUTE110),
+ .landMonsInfo = &Route110_LandMonsInfo,
+ .waterMonsInfo = &Route110_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &Route110_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE111),
+ .mapNum = MAP_NUM(ROUTE111),
+ .landMonsInfo = &Route111_LandMonsInfo,
+ .waterMonsInfo = &Route111_WaterMonsInfo,
+ .rockSmashMonsInfo = &Route111_RockSmashMonsInfo,
+ .fishingMonsInfo = &Route111_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE112),
+ .mapNum = MAP_NUM(ROUTE112),
+ .landMonsInfo = &Route112_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE113),
+ .mapNum = MAP_NUM(ROUTE113),
+ .landMonsInfo = &Route113_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE114),
+ .mapNum = MAP_NUM(ROUTE114),
+ .landMonsInfo = &Route114_LandMonsInfo,
+ .waterMonsInfo = &Route114_WaterMonsInfo,
+ .rockSmashMonsInfo = &Route114_RockSmashMonsInfo,
+ .fishingMonsInfo = &Route114_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE115),
+ .mapNum = MAP_NUM(ROUTE115),
+ .landMonsInfo = &Route115_LandMonsInfo,
+ .waterMonsInfo = &Route115_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &Route115_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE116),
+ .mapNum = MAP_NUM(ROUTE116),
+ .landMonsInfo = &Route116_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE117),
+ .mapNum = MAP_NUM(ROUTE117),
+ .landMonsInfo = &Route117_LandMonsInfo,
+ .waterMonsInfo = &Route117_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &Route117_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE118),
+ .mapNum = MAP_NUM(ROUTE118),
+ .landMonsInfo = &Route118_LandMonsInfo,
+ .waterMonsInfo = &Route118_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &Route118_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE119),
+ .mapNum = MAP_NUM(ROUTE119),
+ .landMonsInfo = &Route119_LandMonsInfo,
+ .waterMonsInfo = &Route119_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &Route119_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE120),
+ .mapNum = MAP_NUM(ROUTE120),
+ .landMonsInfo = &Route120_LandMonsInfo,
+ .waterMonsInfo = &Route120_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &Route120_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE121),
+ .mapNum = MAP_NUM(ROUTE121),
+ .landMonsInfo = &Route121_LandMonsInfo,
+ .waterMonsInfo = &Route121_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &Route121_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE122),
+ .mapNum = MAP_NUM(ROUTE122),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &Route122_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &Route122_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE123),
+ .mapNum = MAP_NUM(ROUTE123),
+ .landMonsInfo = &Route123_LandMonsInfo,
+ .waterMonsInfo = &Route123_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &Route123_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE124),
+ .mapNum = MAP_NUM(ROUTE124),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &Route124_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &Route124_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE125),
+ .mapNum = MAP_NUM(ROUTE125),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &Route125_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &Route125_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE126),
+ .mapNum = MAP_NUM(ROUTE126),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &Route126_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &Route126_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE127),
+ .mapNum = MAP_NUM(ROUTE127),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &Route127_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &Route127_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE128),
+ .mapNum = MAP_NUM(ROUTE128),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &Route128_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &Route128_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE129),
+ .mapNum = MAP_NUM(ROUTE129),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &Route129_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &Route129_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE130),
+ .mapNum = MAP_NUM(ROUTE130),
+ .landMonsInfo = &Route130_LandMonsInfo,
+ .waterMonsInfo = &Route130_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &Route130_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE131),
+ .mapNum = MAP_NUM(ROUTE131),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &Route131_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &Route131_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE132),
+ .mapNum = MAP_NUM(ROUTE132),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &Route132_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &Route132_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE133),
+ .mapNum = MAP_NUM(ROUTE133),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &Route133_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &Route133_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(ROUTE134),
+ .mapNum = MAP_NUM(ROUTE134),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &Route134_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &Route134_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(SAFARI_ZONE_NORTHWEST),
+ .mapNum = MAP_NUM(SAFARI_ZONE_NORTHWEST),
+ .landMonsInfo = &SafariZone_Northwest_LandMonsInfo,
+ .waterMonsInfo = &SafariZone_Northwest_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &SafariZone_Northwest_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(SAFARI_ZONE_NORTHEAST),
+ .mapNum = MAP_NUM(SAFARI_ZONE_NORTHEAST),
+ .landMonsInfo = &SafariZone_Northeast_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = &SafariZone_Northeast_RockSmashMonsInfo,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(SAFARI_ZONE_SOUTHWEST),
+ .mapNum = MAP_NUM(SAFARI_ZONE_SOUTHWEST),
+ .landMonsInfo = &SafariZone_Southwest_LandMonsInfo,
+ .waterMonsInfo = &SafariZone_Southwest_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &SafariZone_Southwest_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(SAFARI_ZONE_SOUTHEAST),
+ .mapNum = MAP_NUM(SAFARI_ZONE_SOUTHEAST),
+ .landMonsInfo = &SafariZone_Southeast_LandMonsInfo,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(DEWFORD_TOWN),
+ .mapNum = MAP_NUM(DEWFORD_TOWN),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &DewfordTown_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &DewfordTown_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(PACIFIDLOG_TOWN),
+ .mapNum = MAP_NUM(PACIFIDLOG_TOWN),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &PacifidlogTown_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = &PacifidlogTown_FishingMonsInfo,
+ },
+ {
+ .mapGroup = MAP_GROUP(UNDERWATER1),
+ .mapNum = MAP_NUM(UNDERWATER1),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &Underwater1_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(UNDERWATER2),
+ .mapNum = MAP_NUM(UNDERWATER2),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = &Underwater2_WaterMonsInfo,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+ {
+ .mapGroup = MAP_GROUP(UNDEFINED),
+ .mapNum = MAP_NUM(UNDEFINED),
+ .landMonsInfo = NULL,
+ .waterMonsInfo = NULL,
+ .rockSmashMonsInfo = NULL,
+ .fishingMonsInfo = NULL,
+ },
+};
-extern u16 gRoute119WaterTileData[];
-extern u16 gScriptResult;
-extern struct WildPokemon gWildFeebasRoute119Data;
-extern u8 Event_RepelWoreOff[];
+const struct WildPokemon gWildFeebasRoute119Data = {20, 25, SPECIES_FEEBAS};
+
+const u16 gRoute119WaterTileData[] =
+{
+ 0, 0x2D, 0,
+ 0x2E, 0x5B, 0x83,
+ 0x5C, 0x8B, 0x12A,
+};
+
+extern u16 gSpecialVar_Result;
+extern u8 S_RepelWoreOff[];
EWRAM_DATA static u8 sWildEncountersDisabled = 0;
EWRAM_DATA static u32 sFeebasRngValue = 0;
@@ -2911,7 +3706,7 @@ EWRAM_DATA static u32 sFeebasRngValue = 0;
static u16 FeebasRandom(void);
static void FeebasSeedRng(u16 seed);
-static bool8 RepelCheck(u8 level);
+static bool8 IsWildLevelAllowedByRepel(u8 level);
static void ApplyFluteEncounterRateMod(u32 *encRate);
static void ApplyCleanseTagEncounterRateMod(u32 *encRate);
@@ -2952,7 +3747,8 @@ static bool8 CheckFeebas(void)
u8 route119section = 0;
u16 waterTileNum;
- if (gSaveBlock1.location.mapGroup == 0 && gSaveBlock1.location.mapNum == 0x22)
+ if (gSaveBlock1.location.mapGroup == MAP_GROUP(ROUTE119)
+ && gSaveBlock1.location.mapNum == MAP_NUM(ROUTE119))
{
GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
x -= 7;
@@ -2965,7 +3761,7 @@ static bool8 CheckFeebas(void)
route119section = 2;
#else
{
- register u16 *arr asm("r0");
+ register const u16 *arr asm("r0");
if (y >= (arr = gRoute119WaterTileData)[3 * 1 + 0] && y <= arr[3 * 1 + 1])
route119section = 1;
if (y >= arr[3 * 2 + 0] && y <= arr[3 * 2 + 1])
@@ -3175,7 +3971,7 @@ static void CreateWildMon(u16 species, u8 b)
CreateMonWithNature(&gEnemyParty[0], species, b, 0x20, PickWildMonNature());
}
-static bool8 GenerateWildMon(struct WildPokemonInfo *wildMonInfo, u8 area, bool8 checkRepel)
+static bool8 GenerateWildMon(const struct WildPokemonInfo *wildMonInfo, u8 area, bool8 checkRepel)
{
u8 wildMonIndex = 0;
u8 level;
@@ -3193,7 +3989,7 @@ static bool8 GenerateWildMon(struct WildPokemonInfo *wildMonInfo, u8 area, bool8
break;
}
level = ChooseWildMonLevel(&wildMonInfo->wildPokemon[wildMonIndex]);
- if (checkRepel == TRUE && RepelCheck(level) == FALSE)
+ if (checkRepel == TRUE && IsWildLevelAllowedByRepel(level) == FALSE)
return FALSE;
else
{
@@ -3202,7 +3998,7 @@ static bool8 GenerateWildMon(struct WildPokemonInfo *wildMonInfo, u8 area, bool8
}
}
-static u16 GenerateFishingWildMon(struct WildPokemonInfo *wildMonInfo, u8 rod)
+static u16 GenerateFishingWildMon(const struct WildPokemonInfo *wildMonInfo, u8 rod)
{
u8 wildMonIndex = ChooseWildMonIndex_Fishing(rod);
u8 level = ChooseWildMonLevel(&wildMonInfo->wildPokemon[wildMonIndex]);
@@ -3215,7 +4011,7 @@ static bool8 SetUpMassOutbreakEncounter(bool8 checkRepel)
{
u16 i;
- if (checkRepel == TRUE && RepelCheck(gSaveBlock1.outbreakPokemonLevel) == 0)
+ if (checkRepel == TRUE && IsWildLevelAllowedByRepel(gSaveBlock1.outbreakPokemonLevel) == FALSE)
return FALSE;
else
{
@@ -3302,9 +4098,9 @@ bool8 StandardWildEncounter(u16 a, u16 b)
if (TryStartRoamerEncounter() == TRUE)
{
roamer = &gSaveBlock1.roamer;
- if (RepelCheck(roamer->level))
+ if (IsWildLevelAllowedByRepel(roamer->level))
{
- StartBattle_Roamer();
+ BattleSetup_StartRoamerBattle();
return 1;
}
}
@@ -3312,7 +4108,7 @@ bool8 StandardWildEncounter(u16 a, u16 b)
{
if (DoMassOutbreakEncounterTest() == TRUE && SetUpMassOutbreakEncounter(1) == TRUE)
{
- CheckForSafariZoneAndProceed();
+ BattleSetup_StartWildBattle();
return 1;
}
if (GenerateWildMon(gWildMonHeaders[headerNum].landMonsInfo, 0, TRUE) == TRUE)
@@ -3336,9 +4132,9 @@ bool8 StandardWildEncounter(u16 a, u16 b)
if (TryStartRoamerEncounter() == TRUE)
{
roamer = &gSaveBlock1.roamer;
- if (RepelCheck(roamer->level))
+ if (IsWildLevelAllowedByRepel(roamer->level))
{
- StartBattle_Roamer();
+ BattleSetup_StartRoamerBattle();
return 1;
}
}
@@ -3349,7 +4145,7 @@ bool8 StandardWildEncounter(u16 a, u16 b)
{
label:
//_0808527A
- CheckForSafariZoneAndProceed();
+ BattleSetup_StartWildBattle();
return 1;
}
}
@@ -3361,28 +4157,28 @@ bool8 StandardWildEncounter(u16 a, u16 b)
return 0;
}
-void RockSmashWildEncounter(void)
+void ScrSpecial_RockSmashWildEncounter(void)
{
u16 headerNum = GetCurrentMapWildMonHeader();
if (headerNum != 0xFFFF)
{
- struct WildPokemonInfo *wildPokemonInfo = gWildMonHeaders[headerNum].rockSmashMonsInfo;
+ const struct WildPokemonInfo *wildPokemonInfo = gWildMonHeaders[headerNum].rockSmashMonsInfo;
if (wildPokemonInfo == NULL)
{
- gScriptResult = 0;
+ gSpecialVar_Result = 0;
return;
}
else if (DoWildEncounterTest(wildPokemonInfo->encounterRate, 1) == TRUE
&& GenerateWildMon(wildPokemonInfo, 2, TRUE) == TRUE)
{
- CheckForSafariZoneAndProceed();
- gScriptResult = 1;
+ BattleSetup_StartWildBattle();
+ gSpecialVar_Result = 1;
return;
}
}
- gScriptResult = 0;
+ gSpecialVar_Result = 0;
return;
}
@@ -3391,7 +4187,7 @@ bool8 SweetScentWildEncounter(void)
s16 x;
s16 y;
u16 headerNum;
- struct WildPokemonInfo *wildPokemonInfo;
+ const struct WildPokemonInfo *wildPokemonInfo;
PlayerGetDestCoords(&x, &y);
if ((headerNum = GetCurrentMapWildMonHeader()) != 0xFFFF)
@@ -3403,14 +4199,14 @@ bool8 SweetScentWildEncounter(void)
return FALSE;
if (TryStartRoamerEncounter() == TRUE)
{
- StartBattle_Roamer();
+ BattleSetup_StartRoamerBattle();
return TRUE;
}
if (DoMassOutbreakEncounterTest() == TRUE)
- SetUpMassOutbreakEncounter(0);
+ SetUpMassOutbreakEncounter(FALSE);
else
GenerateWildMon(wildPokemonInfo, 0, FALSE);
- CheckForSafariZoneAndProceed();
+ BattleSetup_StartWildBattle();
return TRUE;
}
else if (MetatileBehavior_IsWaterWildEncounter(MapGridGetMetatileBehaviorAt(x, y)) == 1)
@@ -3420,18 +4216,18 @@ bool8 SweetScentWildEncounter(void)
return FALSE;
if (TryStartRoamerEncounter() == TRUE)
{
- StartBattle_Roamer();
+ BattleSetup_StartRoamerBattle();
return TRUE;
}
GenerateWildMon(wildPokemonInfo, 1, FALSE);
- CheckForSafariZoneAndProceed();
+ BattleSetup_StartWildBattle();
return TRUE;
}
}
return FALSE;
}
-bool8 GetFishingWildMonListHeader(void)
+bool8 DoesCurrentMapHaveFishingMons(void)
{
u16 headerNum = GetCurrentMapWildMonHeader();
@@ -3460,14 +4256,14 @@ void FishingWildEncounter(u8 rod)
}
IncrementGameStat(12);
sub_80BEA50(species);
- CheckForSafariZoneAndProceed();
+ BattleSetup_StartWildBattle();
}
u16 GetLocalWildMon(bool8 *isWaterMon)
{
u16 headerNum;
- struct WildPokemonInfo *landMonsInfo;
- struct WildPokemonInfo *waterMonsInfo;
+ const struct WildPokemonInfo *landMonsInfo;
+ const struct WildPokemonInfo *waterMonsInfo;
*isWaterMon = FALSE;
headerNum = GetCurrentMapWildMonHeader();
@@ -3497,13 +4293,13 @@ u16 GetLocalWildMon(bool8 *isWaterMon)
}
}
-u16 GetMirageIslandMon(void)
+u16 GetLocalWaterMon(void)
{
u16 headerNum = GetCurrentMapWildMonHeader();
if (headerNum != 0xFFFF)
{
- struct WildPokemonInfo *waterMonsInfo = gWildMonHeaders[headerNum].waterMonsInfo;
+ const struct WildPokemonInfo *waterMonsInfo = gWildMonHeaders[headerNum].waterMonsInfo;
if (waterMonsInfo)
return waterMonsInfo->wildPokemon[ChooseWildMonIndex_Water()].species;
@@ -3521,20 +4317,21 @@ bool8 UpdateRepelCounter(void)
VarSet(VAR_REPEL_STEP_COUNT, steps);
if (steps == 0)
{
- ScriptContext1_SetupScript(Event_RepelWoreOff);
+ ScriptContext1_SetupScript(S_RepelWoreOff);
return TRUE;
}
}
return FALSE;
}
-//Returns FALSE if Repel prevents wild Pokemon at the specified level from appearing
-static bool8 RepelCheck(u8 level)
+static bool8 IsWildLevelAllowedByRepel(u8 wildLevel)
{
u8 i;
if (!VarGet(VAR_REPEL_STEP_COUNT))
+ {
return TRUE;
+ }
else
{
for (i = 0; i < 6; i++)
@@ -3542,7 +4339,9 @@ static bool8 RepelCheck(u8 level)
// UB: Too few arguments for function 'GetMonData'
if (GetMonData(&gPlayerParty[i], MON_DATA_HP) && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG))
{
- if (level < (u8)GetMonData(&gPlayerParty[i], MON_DATA_LEVEL))
+ u8 ourLevel = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL);
+
+ if (wildLevel < ourLevel)
return FALSE;
else
return TRUE;
@@ -3554,9 +4353,9 @@ static bool8 RepelCheck(u8 level)
static void ApplyFluteEncounterRateMod(u32 *encRate)
{
- if (FlagGet(SYS_ENC_UP_ITEM) == TRUE)
+ if (FlagGet(FLAG_SYS_ENC_UP_ITEM) == TRUE)
*encRate += *encRate / 2;
- else if (FlagGet(SYS_ENC_DOWN_ITEM) == TRUE)
+ else if (FlagGet(FLAG_SYS_ENC_DOWN_ITEM) == TRUE)
*encRate = *encRate / 2;
}
diff --git a/src/field_door.c b/src/field_door.c
deleted file mode 100644
index 791ed4c94..000000000
--- a/src/field_door.c
+++ /dev/null
@@ -1,221 +0,0 @@
-#include "global.h"
-#include "field_door.h"
-#include "field_camera.h"
-#include "fieldmap.h"
-#include "metatile_behavior.h"
-#include "task.h"
-
-extern struct DoorAnimFrame gDoorOpenAnimFrames[];
-extern struct DoorAnimFrame gDoorCloseAnimFrames[];
-extern struct DoorGraphics gDoorAnimGraphicsTable[];
-
-static void CopyDoorTilesToVram(void *src)
-{
- CpuFastSet(src, (void *)(VRAM + 0x7F00), 0x40);
-}
-
-static void door_build_blockdef(u16 *a, u16 b, u8 *c)
-{
- int i;
- u16 unk;
-
- for (i = 0; i < 4; i++)
- {
- unk = *(c++) << 12;
- a[i] = unk | (b + i);
- }
- for (; i < 8; i++)
- {
- unk = *(c++) << 12;
- a[i] = unk;
- }
-}
-
-static void DrawCurrentDoorAnimFrame(u32 x, u32 y, u8 *c)
-{
- u16 arr[8];
-
- door_build_blockdef(arr, 0x3F8, c);
- DrawDoorMetatileAt(x, y - 1, arr);
- door_build_blockdef(arr, 0x3FC, c + 4);
- DrawDoorMetatileAt(x, y, arr);
-}
-
-static void DrawClosedDoorTiles(u32 x, u32 y)
-{
- CurrentMapDrawMetatileAt(x, y - 1);
- CurrentMapDrawMetatileAt(x, y);
-}
-
-static void DrawDoor(struct DoorGraphics *gfx, struct DoorAnimFrame *frame, u32 x, u32 y)
-{
- if (frame->offset == 0xFFFF)
- DrawClosedDoorTiles(x, y);
- else
- {
- CopyDoorTilesToVram(gfx->tiles + frame->offset);
- DrawCurrentDoorAnimFrame(x, y, gfx->palette);
- }
-}
-
-enum
-{
- TD_FRAMELIST = 0,
- TD_GFX = 2,
- TD_FRAME = 4,
- TD_COUNTER,
- TD_X,
- TD_Y
-};
-
-static bool32 sub_8058464(struct DoorGraphics *gfx, struct DoorAnimFrame *frames, s16 *taskData)
-{
- if (taskData[TD_COUNTER] == 0)
- DrawDoor(gfx, &frames[taskData[TD_FRAME]], taskData[TD_X], taskData[TD_Y]);
- if (taskData[TD_COUNTER] == frames[taskData[TD_FRAME]].time)
- {
- taskData[TD_COUNTER] = 0;
- taskData[TD_FRAME]++;
- if (frames[taskData[TD_FRAME]].time == 0)
- return FALSE;
- else
- return TRUE;
- }
- taskData[TD_COUNTER]++;
- return TRUE;
-}
-
-static void Task_AnimateDoor(u8 taskId)
-{
- u16 *taskData = gTasks[taskId].data;
- struct DoorAnimFrame *frames = (struct DoorAnimFrame *)(taskData[TD_FRAMELIST] << 16 | taskData[TD_FRAMELIST + 1]);
- struct DoorGraphics *gfx = (struct DoorGraphics *)(taskData[TD_GFX] << 16 | taskData[TD_GFX + 1]);
-
- if (sub_8058464(gfx, frames, taskData) == FALSE)
- DestroyTask(taskId);
-}
-
-static struct DoorAnimFrame *GetLastDoorFrame(struct DoorAnimFrame *frame, void *unused)
-{
- while (frame->time != 0)
- frame++;
- return frame - 1;
-}
-
-static struct DoorGraphics *GetDoorGraphics(struct DoorGraphics *gfx, u16 metatileNum)
-{
- while (gfx->tiles != NULL)
- {
- if (gfx->metatileNum == metatileNum)
- return gfx;
- gfx++;
- }
- return NULL;
-}
-
-static s8 StartDoorAnimationTask(struct DoorGraphics *gfx, struct DoorAnimFrame *frames, u32 x, u32 y)
-{
- if (FuncIsActiveTask(Task_AnimateDoor) == TRUE)
- return -1;
- else
- {
- u8 taskId = CreateTask(Task_AnimateDoor, 0x50);
- s16 *taskData = gTasks[taskId].data;
-
- taskData[TD_X] = x;
- taskData[TD_Y] = y;
-
- taskData[TD_FRAMELIST + 1] = (u32)frames;
- taskData[TD_FRAMELIST] = (u32)frames >> 16;
-
- taskData[TD_GFX + 1] = (u32)gfx;
- taskData[TD_GFX] = (u32)gfx >> 16;
-
- return taskId;
- }
-}
-
-static void DrawClosedDoor(struct DoorGraphics *unused, u32 x, u32 y)
-{
- DrawClosedDoorTiles(x, y);
-}
-
-static void DrawOpenedDoor(struct DoorGraphics *gfx, u32 x, u32 y)
-{
- gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y));
- if (gfx != NULL)
- DrawDoor(gfx, GetLastDoorFrame(gDoorOpenAnimFrames, gDoorOpenAnimFrames), x, y);
-}
-
-static s8 StartDoorOpenAnimation(struct DoorGraphics *gfx, u32 x, u32 y)
-{
- gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y));
- if (gfx == NULL)
- return -1;
- else
- return StartDoorAnimationTask(gfx, gDoorOpenAnimFrames, x, y);
-}
-
-static s8 StartDoorCloseAnimation(struct DoorGraphics *gfx, u32 x, u32 y)
-{
- gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y));
- if (gfx == NULL)
- return -1;
- else
- return StartDoorAnimationTask(gfx, gDoorCloseAnimFrames, x, y);
-}
-
-static s8 cur_mapdata_get_door_x2_at(struct DoorGraphics *gfx, u32 x, u32 y)
-{
- gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y));
- if (gfx == NULL)
- return -1;
- else
- return gfx->unk2;
-}
-
-void unref_sub_805869C(u32 x, u32 y)
-{
- StartDoorOpenAnimation(gDoorAnimGraphicsTable, x, y);
-}
-
-void FieldSetDoorOpened(u32 x, u32 y)
-{
- if (MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y)))
- DrawOpenedDoor(gDoorAnimGraphicsTable, x, y);
-}
-
-void FieldSetDoorClosed(u32 x, u32 y)
-{
- if (MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y)))
- DrawClosedDoor(gDoorAnimGraphicsTable, x, y);
-}
-
-s8 FieldAnimateDoorClose(u32 x, u32 y)
-{
- if (!MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y)))
- return -1;
- else
- return StartDoorCloseAnimation(gDoorAnimGraphicsTable, x, y);
-}
-
-s8 FieldAnimateDoorOpen(u32 x, u32 y)
-{
- if (!MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y)))
- return -1;
- else
- return StartDoorOpenAnimation(gDoorAnimGraphicsTable, x, y);
-}
-
-bool8 FieldIsDoorAnimationRunning(void)
-{
- return FuncIsActiveTask(Task_AnimateDoor);
-}
-
-u32 sub_8058790(u32 x, u32 y)
-{
- if (cur_mapdata_get_door_x2_at(gDoorAnimGraphicsTable, x, y) == 0)
- return 8;
- else
- return 18;
-}
diff --git a/src/field_ground_effect.c b/src/field_ground_effect.c
deleted file mode 100644
index 42862d0ff..000000000
--- a/src/field_ground_effect.c
+++ /dev/null
@@ -1,240 +0,0 @@
-#include "global.h"
-#include "field_ground_effect.h"
-#include "fieldmap.h"
-#include "metatile_behavior.h"
-
-extern u32 gUnknown_08376008[];
-
-void GetAllGroundEffectFlags_OnSpawn(struct MapObject *mapObj, u32 *flags)
-{
- FieldObjectUpdateMetatileBehaviors(mapObj);
- GetGroundEffectFlags_Reflection(mapObj, flags);
- GetGroundEffectFlags_TallGrassOnSpawn(mapObj, flags);
- GetGroundEffectFlags_LongGrassOnSpawn(mapObj, flags);
- GetGroundEffectFlags_SandPile(mapObj, flags);
- GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags);
- GetGroundEffectFlags_ShortGrass(mapObj, flags);
- GetGroundEffectFlags_HotSprings(mapObj, flags);
-}
-
-void GetAllGroundEffectFlags_OnBeginStep(struct MapObject *mapObj, u32 *flags)
-{
- FieldObjectUpdateMetatileBehaviors(mapObj);
- GetGroundEffectFlags_Reflection(mapObj, flags);
- GetGroundEffectFlags_TallGrassOnBeginStep(mapObj, flags);
- GetGroundEffectFlags_LongGrassOnBeginStep(mapObj, flags);
- GetGroundEffectFlags_Tracks(mapObj, flags);
- GetGroundEffectFlags_SandPile(mapObj, flags);
- GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags);
- GetGroundEffectFlags_Puddle(mapObj, flags);
- GetGroundEffectFlags_ShortGrass(mapObj, flags);
- GetGroundEffectFlags_HotSprings(mapObj, flags);
-}
-
-void GetAllGroundEffectFlags_OnFinishStep(struct MapObject *mapObj, u32 *flags)
-{
- FieldObjectUpdateMetatileBehaviors(mapObj);
- GetGroundEffectFlags_ShallowFlowingWater(mapObj, flags);
- GetGroundEffectFlags_SandPile(mapObj, flags);
- GetGroundEffectFlags_Puddle(mapObj, flags);
- GetGroundEffectFlags_Ripple(mapObj, flags);
- GetGroundEffectFlags_ShortGrass(mapObj, flags);
- GetGroundEffectFlags_HotSprings(mapObj, flags);
- GetGroundEffectFlags_Seaweed(mapObj, flags);
- GetGroundEffectFlags_JumpLanding(mapObj, flags);
-}
-
-void FieldObjectUpdateMetatileBehaviors(struct MapObject *mapObj)
-{
- mapObj->mapobj_unk_1F = MapGridGetMetatileBehaviorAt(mapObj->coords3.x, mapObj->coords3.y);
- mapObj->mapobj_unk_1E = MapGridGetMetatileBehaviorAt(mapObj->coords2.x, mapObj->coords2.y);
-}
-
-void GetGroundEffectFlags_Reflection(struct MapObject *mapObj, u32 *flags)
-{
- u32 reflectionFlags[2] = { 0x00000020, 0x00000010 };
- u8 type = FieldObjectCheckForReflectiveSurface(mapObj);
-
- if (type)
- {
- if (!mapObj->mapobj_bit_17)
- {
- mapObj->mapobj_bit_17 = 0;
- mapObj->mapobj_bit_17 = 1;
- *flags |= reflectionFlags[type - 1];
- }
- }
- else
- {
- mapObj->mapobj_bit_17 = 0;
- }
-}
-
-void GetGroundEffectFlags_TallGrassOnSpawn(struct MapObject *mapObj, u32 *flags)
-{
- if (MetatileBehavior_IsTallGrass(mapObj->mapobj_unk_1E))
- *flags |= 0x1;
-}
-
-void GetGroundEffectFlags_TallGrassOnBeginStep(struct MapObject *mapObj, u32 *flags)
-{
- if (MetatileBehavior_IsTallGrass(mapObj->mapobj_unk_1E))
- *flags |= 0x2;
-}
-
-void GetGroundEffectFlags_LongGrassOnSpawn(struct MapObject *mapObj, u32 *flags)
-{
- if (MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E))
- *flags |= 0x4;
-}
-
-void GetGroundEffectFlags_LongGrassOnBeginStep(struct MapObject *mapObj, u32 *flags)
-{
- if (MetatileBehavior_IsLongGrass(mapObj->mapobj_unk_1E))
- *flags |= 0x8;
-}
-
-void GetGroundEffectFlags_Tracks(struct MapObject *mapObj, u32 *flags)
-{
- if (MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1F))
- {
- *flags |= 0x100;
- }
- else if (MetatileBehavior_IsSandOrDeepSand(mapObj->mapobj_unk_1F)
- || MetatileBehavior_IsUnusedFootprintMetatile(mapObj->mapobj_unk_1F))
- {
- *flags |= 0x80;
- }
-}
-
-void GetGroundEffectFlags_SandPile(struct MapObject *mapObj, u32 *flags)
-{
- if (MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1E)
- && MetatileBehavior_IsDeepSand(mapObj->mapobj_unk_1F))
- {
- if (!mapObj->mapobj_bit_20)
- {
- mapObj->mapobj_bit_20 = 0;
- mapObj->mapobj_bit_20 = 1;
- *flags |= 0x800;
- }
- }
- else
- {
- mapObj->mapobj_bit_20 = 0;
- }
-}
-
-void GetGroundEffectFlags_ShallowFlowingWater(struct MapObject *mapObj, u32 *flags)
-{
- if ((MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1E) && MetatileBehavior_IsShallowFlowingWater(mapObj->mapobj_unk_1F))
- || (MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1E) && MetatileBehavior_IsPacifidlogLog(mapObj->mapobj_unk_1F)))
- {
- if (!mapObj->mapobj_bit_19)
- {
- mapObj->mapobj_bit_19 = 0;
- mapObj->mapobj_bit_19 = 1;
- *flags |= 0x40;
- }
- }
- else
- {
- mapObj->mapobj_bit_19 = 0;
- }
-}
-
-void GetGroundEffectFlags_Puddle(struct MapObject *mapObj, u32 *flags)
-{
- if (MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1E)
- && MetatileBehavior_IsPuddle(mapObj->mapobj_unk_1F))
- {
- *flags |= 0x400;
- }
-}
-
-void GetGroundEffectFlags_Ripple(struct MapObject *mapObj, u32 *flags)
-{
- if (MetatileBehavior_HasRipples(mapObj->mapobj_unk_1E))
- *flags |= 0x200;
-}
-
-void GetGroundEffectFlags_ShortGrass(struct MapObject *mapObj, u32 *flags)
-{
- if (MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1E)
- && MetatileBehavior_IsShortGrass(mapObj->mapobj_unk_1F))
- {
- if (!mapObj->mapobj_bit_18)
- {
- mapObj->mapobj_bit_18 = 0;
- mapObj->mapobj_bit_18 = 1;
- *flags |= 0x20000;
- }
- }
- else
- {
- mapObj->mapobj_bit_18 = 0;
- }
-}
-
-void GetGroundEffectFlags_HotSprings(struct MapObject *mapObj, u32 *flags)
-{
- if (MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1E)
- && MetatileBehavior_IsHotSprings(mapObj->mapobj_unk_1F))
- {
- if (!mapObj->mapobj_bit_21)
- {
- mapObj->mapobj_bit_21 = 0;
- mapObj->mapobj_bit_21 = 1;
- *flags |= 0x40000;
- }
- }
- else
- {
- mapObj->mapobj_bit_21 = 0;
- }
-}
-
-void GetGroundEffectFlags_Seaweed(struct MapObject *mapObj, u32 *flags)
-{
- if (MetatileBehavior_IsSeaweed(mapObj->mapobj_unk_1E))
- *flags |= 0x80000;
-}
-
-void GetGroundEffectFlags_JumpLanding(struct MapObject *mapObj, u32 *flags)
-{
- typedef bool8 (*MetatileFunc)(u8);
-
- static const MetatileFunc metatileFuncs[] =
- {
- MetatileBehavior_IsTallGrass,
- MetatileBehavior_IsLongGrass,
- MetatileBehavior_IsPuddle,
- MetatileBehavior_IsSurfableWaterOrUnderwater,
- MetatileBehavior_IsShallowFlowingWater,
- MetatileBehavior_IsATile,
- };
-
- static const u32 jumpLandingFlags[] =
- {
- 0x00001000, // Landing in tall grass
- 0x00002000, // Landing in long grass
- 0x00004000, // Landing on puddle
- 0x00008000, // Landing on surfable water or underwater
- 0x00004000, // Landing on shallow flowing water
- 0x00010000, // Landing on any other type of ground
- };
-
- if (mapObj->mapobj_bit_5 && !mapObj->mapobj_bit_25)
- {
- u8 i;
-
- for (i = 0; i < 6; i++)
- {
- if (metatileFuncs[i](mapObj->mapobj_unk_1E))
- {
- *flags |= jumpLandingFlags[i];
- return;
- }
- }
- }
-}
diff --git a/src/field_weather.c b/src/field_weather.c
deleted file mode 100644
index 5ff2eddf9..000000000
--- a/src/field_weather.c
+++ /dev/null
@@ -1,367 +0,0 @@
-#include "global.h"
-#include "field_weather.h"
-#include "palette.h"
-#include "sprite.h"
-#include "task.h"
-
-struct Weather
-{
- u8 filler_000[0x200];
- u8 unknown_200[2][32];
- u8 filler_240[0x480];
- s8 unknown_6C0;
- s8 unknown_6C1;
- u8 unknown_6C2;
- u8 unknown_6C3;
- u16 unknown_6C4;
- u8 unknown_6C6;
- u8 unknown_6C7;
- u8 unknown_6C8;
- u8 unknown_6C9;
- u8 unknown_6CA;
- u8 unknown_6CB;
- u8 filler_6CC[2];
- u16 unknown_6CE;
- u8 unknown_6D0;
- u8 unknown_6D1;
- u8 filler_6D2[1];
- u8 unknown_6D3;
- u8 unknown_6D4;
- u8 unknown_6D5;
- u8 filler_6D6[2];
- u8 unknown_6D8;
- u8 filler_6D9[1];
- u8 unknown_6DA;
- u8 filler_6DB[3];
- u8 unknown_6DE;
- u8 filler_6DF[5];
- u8 unknown_6E4;
- u8 filler_6E5[0x15];
- u8 unknown_6FA;
- u8 unknown_6FB;
- u8 filler_6FC[4];
- u8 unknown_700;
- u8 filler_701[0x15];
- u8 unknown_716;
- u8 unknown_717;
- u8 filler_718[0xc];
- u8 unknown_724;
- u8 filler_725[9];
- u8 unknown_72E;
-};
-
-#define gWeather gUnknown_0202F7E8
-extern struct Weather gWeather;
-extern u8 *gUnknown_083970E8;
-extern u8 (*gUnknown_08396FC8[][4])(void);
-extern u8 (*gUnknown_083970B8[])(void);
-extern u8 *gUnknown_030006DC;
-extern u8 gUnknown_083970C8;
-extern u8 (*gUnknown_0202FC48)[32];
-extern u8 gUnknown_0202F9E8[32];
-
-
-void sub_807C828(void)
-{
- u8 index;
- if (!FuncIsActiveTask(&sub_807CA34))
- {
- index = AllocSpritePalette(0x1200);
- CpuCopy32(&gUnknown_083970E8, &gPlttBufferUnfaded[0x100 + index * 16], 32);
- sub_807CB10();
- gWeather.unknown_6D5 = index;
- gWeather.unknown_6D4 = AllocSpritePalette(0x1201);
- gWeather.unknown_6DA = 0;
- gWeather.unknown_6D8 = 0;
- gWeather.unknown_6DE = 0;
- gWeather.unknown_6E4 = 0;
- gWeather.unknown_700 = 0;
- gWeather.unknown_6FB = 0;
- gWeather.unknown_724 = 0;
- gWeather.unknown_716 = 0;
- gWeather.unknown_717 = 0;
- gWeather.unknown_72E = 0;
- gWeather.unknown_6FA = 0;
- sub_807DB64(16, 0);
- gWeather.unknown_6D0 = 0;
- gWeather.unknown_6C6 = 3;
- gWeather.unknown_6C8 = 0;
- gWeather.unknown_6D3 = 1;
- gWeather.unknown_6C9 = CreateTask(&sub_807C9E4, 80);
- }
-}
-
-void DoWeatherEffect(u8 effect)
-{
- if (effect != 3 && effect != 5 && effect != 13)
- {
- PlayRainSoundEffect();
- }
- if (gWeather.unknown_6D1 != effect && gWeather.unknown_6D0 == effect)
- {
- gUnknown_08396FC8[effect][0]();
- }
- gWeather.unknown_6D3 = 0;
- gWeather.unknown_6D1 = effect;
- gWeather.unknown_6CE = 0;
-}
-
-void sub_807C988(u8 effect)
-{
- PlayRainSoundEffect();
- gWeather.unknown_6D0 = effect;
- gWeather.unknown_6D1 = effect;
-}
-
-void sub_807C9B4(u8 effect)
-{
- PlayRainSoundEffect();
- gWeather.unknown_6D0 = effect;
- gWeather.unknown_6D1 = effect;
- gWeather.unknown_6C8 = 1;
-}
-
-void sub_807C9E4(u8 task)
-{
- if (gWeather.unknown_6C8)
- {
- gUnknown_08396FC8[gWeather.unknown_6D0][2]();
- gTasks[task].func = &sub_807CA34;
- }
-}
-
-void sub_807CA34(u8 task)
-{
- u8 v1;
- if (gWeather.unknown_6D0 != gWeather.unknown_6D1)
- {
- v1 = gUnknown_08396FC8[gWeather.unknown_6D0][3]();
- if (!v1)
- {
- gUnknown_08396FC8[gWeather.unknown_6D1][0]();
- gWeather.unknown_6C3 = 0; // compiler reuses v1
- gWeather.unknown_6C6 = 0; // compiler reuses v1
- gWeather.unknown_6D0 = gWeather.unknown_6D1;
- gWeather.unknown_6D3 = 1;
- }
- }
- else
- {
- gUnknown_08396FC8[gWeather.unknown_6D0][1]();
- }
- gUnknown_083970B8[gWeather.unknown_6C6]();
-}
-
-void sub_807CAE8(void)
-{
- gWeather.unknown_6C1 = 0;
- gWeather.unknown_6C2 = 0;
-}
-
-void nullsub_38(void)
-{
-}
-
-u32 sub_807CB0C(void)
-{
- return 0;
-}
-
-void sub_807CB10(void)
-{
- u16 v0;
- u8(*v1)[32];
- u16 v2;
- u16 v4;
- u16 v5;
- u16 v6;
- u16 v9;
- u32 v10;
- u16 v11;
- s16 dunno;
-
- gUnknown_030006DC = &gUnknown_083970C8;
- for (v0 = 0; v0 <= 1; v0++)
- {
- if (v0 == 0)
- {
- v1 = &gUnknown_0202F9E8;
- }
- else
- {
- v1 = &gUnknown_0202F9E8 + 19;
- }
- for (v2 = 0; (u16)v2 <= 0x1f; v2++)
- {
- v4 = v2 << 8;
- if (v0 == 0)
- {
- v5 = (v2 << 8) / 16;
- }
- else
- {
- v5 = 0;
- }
- v6 = 0;
- for (; v6 <= 2; v6++)
- {
- v4 = (v4 - v5);
- v1[v6][v2] = v4 >> 8;
- }
- v9 = v4;
- v10 = 0x1f00 - v4;
- if ((0x1f00 - v4) < 0)
- {
- v10 += 0xf;
- }
- v11 = v10 >> 4;
- if (v2 <= 0xb)
- {
- for (; v6 <= 0x12; v6++)
- {
- v4 += v11;
- dunno = v4 - v9;
- if (dunno > 0)
- {
- v4 -= (dunno + ((u16)dunno >> 15)) >> 1;
- }
- v1[v6][v2] = v4 >> 8;
- if (v1[v6][v2] > 0x1f)
- {
- v1[v6][v2] = 0x1f;
- }
- }
- }
- else
- {
- for (; v6 <= 0x12; v6++)
- {
- v4 += v11;
- v1[v6][v2] = v4 >> 8;
- if (v1[v6][v2] > 0x1f)
- {
- v1[v6][v2] = 0x1f;
- }
- }
- }
- }
- }
-}
-
-void sub_807CC24(void)
-{
- if (gWeather.unknown_6C0 == gWeather.unknown_6C1)
- {
- gWeather.unknown_6C6 = 3;
- }
- else
- {
- if (++gWeather.unknown_6C3 >= gWeather.unknown_6C2)
- {
- gWeather.unknown_6C3 = 0;
- if (gWeather.unknown_6C0 < gWeather.unknown_6C1)
- {
- gWeather.unknown_6C0++;
- }
- else
- {
- gWeather.unknown_6C0--;
- }
- sub_807CEBC(0, 0x20, gWeather.unknown_6C0);
- }
- }
-}
-
-void sub_807CCAC(void)
-{
- if (++gWeather.unknown_6CB > 1)
- {
- gWeather.unknown_6CA = 0;
- }
- switch (gWeather.unknown_6D0)
- {
- case 3:
- case 4:
- case 5:
- case 11:
- case 13:
- if (sub_807CDC4() == 0)
- {
- gWeather.unknown_6C0 = 3;
- gWeather.unknown_6C6 = 3;
- }
- break;
- case 12:
- if (sub_807CE24() == 0)
- {
- gWeather.unknown_6C0 = -6;
- gWeather.unknown_6C6 = 3;
- }
- break;
- case 6:
- if (sub_807CE7C() == 0)
- {
- gWeather.unknown_6C0 = 0;
- gWeather.unknown_6C6 = 3;
- }
- break;
- case 7:
- case 8:
- case 9:
- case 10:
- default:
- if (!gPaletteFade.active)
- {
- gWeather.unknown_6C0 = gWeather.unknown_6C1;
- gWeather.unknown_6C6 = 3;
- }
- break;
- }
-}
-
-u8 sub_807CDC4(void)
-{
- if (gWeather.unknown_6C7 == 0x10)
- {
- return 0;
- }
- if (++gWeather.unknown_6C7 >= 0x10)
- {
- sub_807CEBC(0, 0x20, 3);
- gWeather.unknown_6C7 = 0x10;
- return 0;
- }
- sub_807D1BC(0, 0x20, 3, 0x10 - gWeather.unknown_6C7, gWeather.unknown_6C4);
- return 1;
-}
-
-u8 sub_807CE24(void)
-{
- if (gWeather.unknown_6C7 == 0x10)
- {
- return 0;
- }
- if (++gWeather.unknown_6C7 >= 0x10)
- {
- sub_807CEBC(0, 0x20, -6);
- gWeather.unknown_6C7 = 0x10;
- return 0;
- }
- sub_807D304(-6, 0x10 - gWeather.unknown_6C7, gWeather.unknown_6C4);
- return 1;
-}
-
-u8 sub_807CE7C(void)
-{
- if (gWeather.unknown_6C7 == 0x10)
- {
- return 0;
- }
- ++gWeather.unknown_6C7;
- sub_807D424(0x10 - gWeather.unknown_6C7, gWeather.unknown_6C4);
- return 1;
-}
-
-void nullsub_39(void)
-{
-}
diff --git a/src/heal_location.c b/src/heal_location.c
deleted file mode 100644
index 42bc18567..000000000
--- a/src/heal_location.c
+++ /dev/null
@@ -1,63 +0,0 @@
-#include "global.h"
-#include "heal_location.h"
-#include "map_constants.h"
-
-#define NUM_HEAL_LOCATIONS 22
-
-static const struct HealLocation sHealLocations[] =
-{
- {MAP_GROUP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F, MAP_ID_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F, 4, 2},
- {MAP_GROUP_LITTLEROOT_TOWN_MAYS_HOUSE_2F, MAP_ID_LITTLEROOT_TOWN_MAYS_HOUSE_2F, 4, 2},
- {MAP_GROUP_PETALBURG_CITY, MAP_ID_PETALBURG_CITY, 20, 17},
- {MAP_GROUP_SLATEPORT_CITY, MAP_ID_SLATEPORT_CITY, 19, 20},
- {MAP_GROUP_MAUVILLE_CITY, MAP_ID_MAUVILLE_CITY, 22, 6},
- {MAP_GROUP_RUSTBORO_CITY, MAP_ID_RUSTBORO_CITY, 16, 39},
- {MAP_GROUP_FORTREE_CITY, MAP_ID_FORTREE_CITY, 5, 7},
- {MAP_GROUP_LILYCOVE_CITY, MAP_ID_LILYCOVE_CITY, 24, 15},
- {MAP_GROUP_MOSSDEEP_CITY, MAP_ID_MOSSDEEP_CITY, 28, 17},
- {MAP_GROUP_SOOTOPOLIS_CITY, MAP_ID_SOOTOPOLIS_CITY, 43, 32},
- {MAP_GROUP_EVER_GRANDE_CITY, MAP_ID_EVER_GRANDE_CITY, 27, 49},
- {MAP_GROUP_LITTLEROOT_TOWN, MAP_ID_LITTLEROOT_TOWN, 5, 9},
- {MAP_GROUP_LITTLEROOT_TOWN, MAP_ID_LITTLEROOT_TOWN, 14, 9},
- {MAP_GROUP_OLDALE_TOWN, MAP_ID_OLDALE_TOWN, 6, 17},
- {MAP_GROUP_DEWFORD_TOWN, MAP_ID_DEWFORD_TOWN, 2, 11},
- {MAP_GROUP_LAVARIDGE_TOWN, MAP_ID_LAVARIDGE_TOWN, 9, 7},
- {MAP_GROUP_FALLARBOR_TOWN, MAP_ID_FALLARBOR_TOWN, 14, 8},
- {MAP_GROUP_VERDANTURF_TOWN, MAP_ID_VERDANTURF_TOWN, 16, 4},
- {MAP_GROUP_PACIFIDLOG_TOWN, MAP_ID_PACIFIDLOG_TOWN, 8, 16},
- {MAP_GROUP_EVER_GRANDE_CITY, MAP_ID_EVER_GRANDE_CITY, 18, 6},
- {MAP_GROUP_BATTLE_TOWER_OUTSIDE, MAP_ID_BATTLE_TOWER_OUTSIDE, 14, 9},
- {MAP_GROUP_SOUTHERN_ISLAND_EXTERIOR, MAP_ID_SOUTHERN_ISLAND_EXTERIOR, 15, 20},
-};
-
-u32 GetHealLocationIndexByMap(u16 mapGroup, u16 mapNum)
-{
- u32 i;
-
- for (i = 0; i < NUM_HEAL_LOCATIONS; i++)
- {
- if (sHealLocations[i].group == mapGroup && sHealLocations[i].map == mapNum)
- return i + 1;
- }
- return 0;
-}
-
-const struct HealLocation *GetHealLocationByMap(u16 mapGroup, u16 mapNum)
-{
- u32 index = GetHealLocationIndexByMap(mapGroup, mapNum);
-
- if (index == 0)
- return NULL;
- else
- return &sHealLocations[index - 1];
-}
-
-const struct HealLocation *GetHealLocation(u32 index)
-{
- if (index == 0)
- return NULL;
- else if (index > NUM_HEAL_LOCATIONS)
- return NULL;
- else
- return &sHealLocations[index - 1];
-}
diff --git a/src/intro_credits_graphics.c b/src/intro_credits_graphics.c
deleted file mode 100755
index cd0589af8..000000000
--- a/src/intro_credits_graphics.c
+++ /dev/null
@@ -1,532 +0,0 @@
-#include "global.h"
-#include "gba/m4a_internal.h"
-#include "intro.h"
-#include "data2.h"
-#include "decompress.h"
-#include "hall_of_fame.h"
-#include "intro_credits_graphics.h"
-#include "libgncmultiboot.h"
-#include "link.h"
-#include "m4a.h"
-#include "main.h"
-#include "new_game.h"
-#include "palette.h"
-#include "rng.h"
-#include "save.h"
-#include "songs.h"
-#include "sound.h"
-#include "species.h"
-#include "task.h"
-#include "title_screen.h"
-#include "trig.h"
-#include "unknown_task.h"
-
-// define register constants for the inline asm
-asm(".include \"constants/gba_constants.inc\"\n");
-
-struct UnknownStruct1
-{
- u8 var0_0:4;
- u8 var0_4:2;
- u8 var0_6:2;
- u8 var1;
- u8 var2;
- u8 var3;
- u16 var4;
-};
-
-extern u8 gUnknown_0841225C;
-extern u8 gUnknown_084126DC;
-extern u8 gUnknown_084121FC;
-extern u8 gUnknown_084128D8;
-extern u8 gUnknown_08412EB4;
-extern u8 gUnknown_08412818;
-extern u8 gUnknown_08413184;
-extern u8 gUnknown_08413340;
-extern u8 gUnknown_084139C8;
-extern u8 gUnknown_08413300;
-extern u8 gUnknown_08413CCC;
-
-extern const struct SpriteTemplate gSpriteTemplate_8416B3C;
-const extern struct CompressedSpriteSheet gUnknown_08416B54;
-const extern struct CompressedSpriteSheet gUnknown_08416BDC;
-
-extern u16 gUnknown_02039358;
-extern s16 gUnknown_0203935A;
-extern s16 gUnknown_0203935C;
-extern u8 gReservedSpritePaletteCount;
-
-void sub_8149248();
-void sub_8149264();
-
-void load_intro_part2_graphics(u8 a)
-{
- LZ77UnCompVram(&gUnknown_0841225C, (void *)(VRAM + 0x4000));
- LZ77UnCompVram(&gUnknown_084126DC, (void *)(VRAM + 0x7800));
- LoadPalette(&gUnknown_084121FC, 240, 32);
- switch (a)
- {
- case 0:
- default:
- LZ77UnCompVram(&gUnknown_084128D8, (void *)(VRAM));
- LZ77UnCompVram(&gUnknown_08412EB4, (void *)(VRAM + 0x3000));
- LoadPalette(&gUnknown_08412818, 0, 96);
- LoadCompressedObjectPic(&gUnknown_08416B54);
- LoadPalette(&gUnknown_08413184, 256, 32);
- sub_8149248();
- break;
- case 1:
- LZ77UnCompVram(&gUnknown_08413340, (void *)(VRAM));
- LZ77UnCompVram(&gUnknown_084139C8, (void *)(VRAM + 0x3000));
- LoadPalette(&gUnknown_08413300, 0, 32);
- LoadCompressedObjectPic(&gUnknown_08416BDC);
- LoadPalette(&gUnknown_08413CCC, 256, 32);
- sub_8149264();
- break;
- }
- gUnknown_0203935C = 0;
- gReservedSpritePaletteCount = 8;
-}
-
-void sub_8148C78(u8 a)
-{
- if (a == 1)
- {
- REG_BG3CNT = 0x603;
- REG_BG2CNT = 0x702;
- REG_BG1CNT = 0xF05;
- REG_DISPCNT = 0x1E40;
- }
- else
- {
- REG_BG3CNT = 0x603;
- REG_BG2CNT = 0x702;
- REG_BG1CNT = 0xF05;
- REG_DISPCNT = 0x1E40;
- }
-}
-
-extern u8 gUnknown_084131C4;
-extern u8 gUnknown_084131A4;
-extern u8 gUnknown_0841221C;
-extern u8 gUnknown_08412878;
-extern u8 gUnknown_08413320;
-extern u8 gUnknown_0841223C;
-extern u8 gUnknown_08413E78;
-extern u8 gUnknown_08414084;
-extern u8 gUnknown_08413E38;
-const extern struct CompressedSpriteSheet gUnknown_08416C70;
-extern u8 gUnknown_08414064;
-extern struct UnknownStruct1 gUnknown_08416B94;
-extern struct UnknownStruct1 gUnknown_08416C10;
-extern struct UnknownStruct1 gUnknown_08416C8C;
-const extern union AnimCmd *const gSpriteAnimTable_8416B84;
-const extern union AnimCmd *const gSpriteAnimTable_8416C04;
-const extern union AnimCmd *const gSpriteAnimTable_8416C88;
-const extern struct SpriteTemplate gSpriteTemplate_8416CDC;
-const extern struct SpriteTemplate gSpriteTemplate_Brendan;
-const extern struct SpriteTemplate gSpriteTemplate_8416CF4;
-const extern struct SpriteTemplate gSpriteTemplate_May;
-const extern struct SpriteTemplate gSpriteTemplate_8416D7C;
-const extern struct SpriteTemplate gSpriteTemplate_8416D94;
-
-void sub_8149280();
-
-void sub_8148CB0(u8 a)
-{
- LZ77UnCompVram(&gUnknown_0841225C, (void *)(VRAM + 0x4000));
- LZ77UnCompVram(&gUnknown_084126DC, (void *)(VRAM + 0x7800));
- switch (a)
- {
- case 0:
- default:
- LoadPalette(&gUnknown_084121FC, 240, 32);
- LZ77UnCompVram(&gUnknown_084128D8, (void *)(VRAM));
- LZ77UnCompVram(&gUnknown_08412EB4, (void *)(VRAM + 0x3000));
- LoadPalette(&gUnknown_08412818, 0, 96);
- LoadCompressedObjectPic(&gUnknown_08416B54);
- LZ77UnCompVram(&gUnknown_084131C4, (void *)(VRAM + 0x10000));
- LoadPalette(&gUnknown_08413184, 256, 32);
- sub_8149248();
- break;
- case 1:
- LoadPalette(&gUnknown_0841221C, 240, 32);
- LZ77UnCompVram(&gUnknown_084128D8, (void *)(VRAM));
- LZ77UnCompVram(&gUnknown_08412EB4, (void *)(VRAM + 0x3000));
- LoadPalette(&gUnknown_08412878, 0, 96);
- LoadCompressedObjectPic(&gUnknown_08416B54);
- LZ77UnCompVram(&gUnknown_084131C4, (void *)(VRAM + 0x10000));
- LoadPalette(&gUnknown_084131A4, 256, 32);
- sub_8149248();
- break;
- case 2:
- case 3:
- LoadPalette(&gUnknown_0841221C, 240, 32);
- LZ77UnCompVram(&gUnknown_08413340, (void *)(VRAM));
- LZ77UnCompVram(&gUnknown_084139C8, (void *)(VRAM + 0x3000));
- LoadPalette(&gUnknown_08413320, 0, 32);
- LoadCompressedObjectPic(&gUnknown_08416BDC);
- LoadPalette(&gUnknown_08413320, 256, 32);
- sub_8149264();
- break;
- case 4:
- LoadPalette(&gUnknown_0841223C, 240, 32);
- LZ77UnCompVram(&gUnknown_08413E78, (void *)(VRAM));
- LZ77UnCompVram(&gUnknown_08414084, (void *)(VRAM + 0x3000));
- LoadPalette(&gUnknown_08413E38, 0, 64);
- LoadCompressedObjectPic(&gUnknown_08416C70);
- LoadPalette(&gUnknown_08414064, 256, 32);
- sub_8149280();
- break;
- }
- gReservedSpritePaletteCount = 8;
- gUnknown_0203935C = 0;
-}
-
-void sub_8148E90(u8 a)
-{
- REG_BG3CNT = 0x603;
- REG_BG2CNT = 0x702;
- REG_BG1CNT = 0xF05;
- REG_DISPCNT = 0x1F40;
-}
-
-u8 sub_8148EC0(u8 a, u16 b, u16 c, u16 d)
-{
- u8 taskId = CreateTask(&sub_8148F3C, 0);
-
- gTasks[taskId].data[0] = a;
- gTasks[taskId].data[1] = b;
- gTasks[taskId].data[2] = 0;
- gTasks[taskId].data[3] = 0;
- gTasks[taskId].data[4] = c;
- gTasks[taskId].data[5] = 0;
- gTasks[taskId].data[6] = 0;
- gTasks[taskId].data[7] = d;
- gTasks[taskId].data[8] = 8;
- gTasks[taskId].data[9] = 0;
- sub_8148F3C(taskId);
- return taskId;
-}
-
-#ifdef NONMATCHING
-void sub_8148F3C(u8 taskId)
-{
- register u32 r4 asm("r4");
- s32 r2;
-
- r4 = (u16)gTasks[taskId].data[1] << 16;
- if (r4 != 0)
- {
- r2 = (gTasks[taskId].data[2] << 16) + (u16)gTasks[taskId].data[3] - (r4 >> 12);
- gTasks[taskId].data[2] = r2 >> 16;
- gTasks[taskId].data[3] = r2;
- REG_BG1HOFS = gTasks[taskId].data[2];
- REG_BG1VOFS = gUnknown_0203935A + gUnknown_02039358;
- }
-
- r4 = (u16)gTasks[taskId].data[4] << 16;
- if (r4 != 0)
- {
- r2 = (gTasks[taskId].data[5] << 16) + (u16)gTasks[taskId].data[6] - (r4 >> 12);
- gTasks[taskId].data[5] = r2 >> 16;
- gTasks[taskId].data[3] = r2;
- REG_BG2HOFS = gTasks[taskId].data[5];
- if (gTasks[taskId].data[0] != 0)
- REG_BG2VOFS = gUnknown_0203935A + gUnknown_02039358;
- else
- REG_BG2VOFS = gUnknown_02039358;
- }
-
- r4 = (u16)gTasks[taskId].data[7] << 16;
- if (r4 != 0)
- {
- r2 = (gTasks[taskId].data[8] << 16) + (u16)gTasks[taskId].data[9] - (r4 >> 12);;
- gTasks[taskId].data[8] = r2 >> 16;
- gTasks[taskId].data[9] = r2;
- REG_BG3HOFS = gTasks[taskId].data[8];
- REG_BG3VOFS = gUnknown_02039358;
- }
-}
-#else
-__attribute__((naked))
-void sub_8148F3C(u8 taskId)
-{
- asm(".syntax unified\n\
- push {r4-r6,lr}\n\
- lsls r0, 24\n\
- lsrs r5, r0, 24\n\
- ldr r1, _08148FB4 @ =gTasks\n\
- lsls r0, r5, 2\n\
- adds r0, r5\n\
- lsls r0, 3\n\
- adds r3, r0, r1\n\
- ldrh r0, [r3, 0xA]\n\
- lsls r4, r0, 16\n\
- adds r6, r1, 0\n\
- cmp r4, 0\n\
- beq _08148F7C\n\
- movs r1, 0xC\n\
- ldrsh r0, [r3, r1]\n\
- lsls r0, 16\n\
- ldrh r1, [r3, 0xE]\n\
- adds r2, r0, r1\n\
- lsrs r0, r4, 12\n\
- subs r2, r0\n\
- asrs r1, r2, 16\n\
- strh r1, [r3, 0xC]\n\
- strh r2, [r3, 0xE]\n\
- ldr r0, _08148FB8 @ =REG_BG1HOFS\n\
- strh r1, [r0]\n\
- ldr r2, _08148FBC @ =REG_BG1VOFS\n\
- ldr r1, _08148FC0 @ =gUnknown_02039358\n\
- ldr r0, _08148FC4 @ =gUnknown_0203935A\n\
- ldrh r0, [r0]\n\
- ldrh r1, [r1]\n\
- adds r0, r1\n\
- strh r0, [r2]\n\
-_08148F7C:\n\
- ldrh r0, [r3, 0x10]\n\
- lsls r4, r0, 16\n\
- cmp r4, 0\n\
- beq _08148FD8\n\
- movs r1, 0x12\n\
- ldrsh r0, [r3, r1]\n\
- lsls r0, 16\n\
- ldrh r1, [r3, 0x14]\n\
- adds r2, r0, r1\n\
- lsrs r0, r4, 12\n\
- subs r2, r0\n\
- asrs r1, r2, 16\n\
- strh r1, [r3, 0x12]\n\
- strh r2, [r3, 0x14]\n\
- ldr r0, _08148FC8 @ =REG_BG2HOFS\n\
- strh r1, [r0]\n\
- movs r1, 0x8\n\
- ldrsh r0, [r3, r1]\n\
- cmp r0, 0\n\
- beq _08148FD0\n\
- ldr r2, _08148FCC @ =REG_BG2VOFS\n\
- ldr r1, _08148FC0 @ =gUnknown_02039358\n\
- ldr r0, _08148FC4 @ =gUnknown_0203935A\n\
- ldrh r0, [r0]\n\
- ldrh r1, [r1]\n\
- adds r0, r1\n\
- strh r0, [r2]\n\
- b _08148FD8\n\
- .align 2, 0\n\
-_08148FB4: .4byte gTasks\n\
-_08148FB8: .4byte REG_BG1HOFS\n\
-_08148FBC: .4byte REG_BG1VOFS\n\
-_08148FC0: .4byte gUnknown_02039358\n\
-_08148FC4: .4byte gUnknown_0203935A\n\
-_08148FC8: .4byte REG_BG2HOFS\n\
-_08148FCC: .4byte REG_BG2VOFS\n\
-_08148FD0:\n\
- ldr r0, _08149010 @ =REG_BG2VOFS\n\
- ldr r1, _08149014 @ =gUnknown_02039358\n\
- ldrh r1, [r1]\n\
- strh r1, [r0]\n\
-_08148FD8:\n\
- lsls r0, r5, 2\n\
- adds r0, r5\n\
- lsls r0, 3\n\
- adds r3, r0, r6\n\
- ldrh r0, [r3, 0x16]\n\
- lsls r4, r0, 16\n\
- cmp r4, 0\n\
- beq _08149008\n\
- movs r1, 0x18\n\
- ldrsh r0, [r3, r1]\n\
- lsls r0, 16\n\
- ldrh r1, [r3, 0x1A]\n\
- adds r2, r0, r1\n\
- lsrs r0, r4, 12\n\
- subs r2, r0\n\
- asrs r1, r2, 16\n\
- strh r1, [r3, 0x18]\n\
- strh r2, [r3, 0x1A]\n\
- ldr r0, _08149018 @ =REG_BG3HOFS\n\
- strh r1, [r0]\n\
- ldr r1, _0814901C @ =REG_BG3VOFS\n\
- ldr r0, _08149014 @ =gUnknown_02039358\n\
- ldrh r0, [r0]\n\
- strh r0, [r1]\n\
-_08149008:\n\
- pop {r4-r6}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_08149010: .4byte REG_BG2VOFS\n\
-_08149014: .4byte gUnknown_02039358\n\
-_08149018: .4byte REG_BG3HOFS\n\
-_0814901C: .4byte REG_BG3VOFS\n\
- .syntax divided\n");
-}
-#endif
-
-void sub_8149020(u8 mode)
-{
- u16 var1;
- u16 var2;
- switch (mode)
- {
- case 0:
- default:
- /* stuff */
- if (gMain.vblankCounter1 & 3 || gPaletteFade.active)
- break;
- if (gMain.vblankCounter1 & 4)
- {
- var1 = gPlttBufferUnfaded[9];
- var2 = gPlttBufferUnfaded[10];
- }
- else
- {
- var1 = gPlttBufferUnfaded[10];
- var2 = gPlttBufferUnfaded[9];
- }
- LoadPalette(&var1, 9, 2);
- LoadPalette(&var2, 10, 2);
- break;
- case 2:
- if (gMain.vblankCounter1 & 3 || gPaletteFade.active)
- break;
- if (gMain.vblankCounter1 & 4)
- {
- var1 = 0x3D27;
- var2 = 0x295;
- }
- else
- {
- var1 = 0x31C;
- var2 = 0x3D27;
- }
- LoadPalette(&var1, 12, 2);
- LoadPalette(&var2, 13, 2);
- break;
- case 1:
- break;
- }
-}
-
-void sub_814910C(struct Sprite *sprite)
-{
- if (gUnknown_0203935C)
- {
- DestroySprite(sprite);
- }
- else
- {
- s32 var = ((sprite->pos1.x << 16) | (u16)sprite->data2) + (u16)sprite->data1;
- sprite->pos1.x = var >> 16;
- sprite->data2 = var;
- if (sprite->pos1.x > 255) sprite->pos1.x = 0xFFE0;
- if (sprite->data0)
- {
- sprite->pos2.y = -(gUnknown_02039358 + gUnknown_0203935A);
- }
- else
- {
- sprite->pos2.y = -gUnknown_02039358;
- }
- }
-}
-
-void sub_8149174(u8 a, struct UnknownStruct1 *b, const union AnimCmd *const *c, u8 d)
-{
- u8 i;
-
- for(i = 0; i < d; i++)
- {
- u8 sprite = CreateSprite(&gSpriteTemplate_8416B3C, b[i].var1, b[i].var2, b[i].var3);
- CalcCenterToCornerVec(&gSprites[sprite], b[i].var0_4, b[i].var0_6, 0);
- gSprites[sprite].oam.priority = 3;
- gSprites[sprite].oam.shape = b[i].var0_4;
- gSprites[sprite].oam.size = b[i].var0_6;
- gSprites[sprite].oam.paletteNum = 0;
- gSprites[sprite].anims = c;
- StartSpriteAnim(&gSprites[sprite], b[i].var0_0);
- gSprites[sprite].data0 = a;
- gSprites[sprite].data1 = b[i].var4;
- gSprites[sprite].data2 = 0;
- }
-}
-
-void sub_8149248()
-{
- sub_8149174(0, &gUnknown_08416B94, &gSpriteAnimTable_8416B84, 9);
-}
-
-void sub_8149264()
-{
- sub_8149174(1, &gUnknown_08416C10, &gSpriteAnimTable_8416C04, 12);
-}
-
-void sub_8149280()
-{
- sub_8149174(1, &gUnknown_08416C8C, &gSpriteAnimTable_8416C88, 6);
-}
-
-void nullsub_82()
-{
-}
-
-void sub_81492A0(struct Sprite* sprite)
-{
- sprite->invisible = gSprites[sprite->data0].invisible;
- sprite->pos1.x = gSprites[sprite->data0].pos1.x;
- sprite->pos1.y = gSprites[sprite->data0].pos1.y + 8;
- sprite->pos2.x = gSprites[sprite->data0].pos2.x;
- sprite->pos2.y = gSprites[sprite->data0].pos2.y;
-}
-
-
-
-u8 intro_create_brendan_sprite(s16 a, s16 b)
-{
- u8 sprite = CreateSprite(&gSpriteTemplate_8416CDC, a, b, 0);
- u8 brendan = CreateSprite(&gSpriteTemplate_Brendan, a, b + 8, 1);
- gSprites[brendan].data0 = sprite;
- return sprite;
-}
-
-u8 intro_create_may_sprite(s16 a, s16 b)
-{
- u8 sprite = CreateSprite(&gSpriteTemplate_8416CF4, a, b, 0);
- u8 may = CreateSprite(&gSpriteTemplate_May, a, b + 8, 1);
- gSprites[may].data0 = sprite;
- return sprite;
-}
-
-void nullsub_83()
-{
-}
-
-void sub_81493C4(struct Sprite* sprite)
-{
- sprite->invisible = gSprites[sprite->data0].invisible;
- sprite->pos1.y = gSprites[sprite->data0].pos1.y;
- sprite->pos2.x = gSprites[sprite->data0].pos2.x;
- sprite->pos2.y = gSprites[sprite->data0].pos2.y;
-}
-
-u8 intro_create_latios_sprite(s16 a, s16 b)
-{
- u8 sprite = CreateSprite(&gSpriteTemplate_8416D7C, a - 32, b, 2);
- u8 latios = CreateSprite(&gSpriteTemplate_8416D7C, a + 32, b, 2);
- gSprites[latios].data0 = sprite;
- StartSpriteAnim(&gSprites[latios], 1);
- gSprites[latios].callback = &sub_81493C4;
- return sprite;
-}
-
-u8 intro_create_latias_sprite(s16 a, s16 b)
-{
- u8 sprite = CreateSprite(&gSpriteTemplate_8416D94, a - 32, b, 2);
- u8 latios = CreateSprite(&gSpriteTemplate_8416D94, a + 32, b, 2);
- gSprites[latios].data0 = sprite;
- StartSpriteAnim(&gSprites[latios], 1);
- gSprites[latios].callback = &sub_81493C4;
- return sprite;
-}
diff --git a/src/landmark.c b/src/landmark.c
deleted file mode 100644
index 6a53716bb..000000000
--- a/src/landmark.c
+++ /dev/null
@@ -1,73 +0,0 @@
-#include "global.h"
-#include "landmark.h"
-#include "event_data.h"
-
-#define MAPSEC_NONE 0x58
-
-struct Landmark
-{
- u8 *name;
- u16 flag;
-};
-
-struct LandmarkList
-{
- u8 mapSection;
- u8 id;
- const struct Landmark **landmarks;
-};
-
-extern const struct LandmarkList gLandmarkLists[];
-
-static const struct Landmark **GetLandmarks(u8 mapSection, u8 id);
-
-u8 *GetLandmarkName(u8 mapSection, u8 id, u8 count)
-{
- const struct Landmark **landmarks = GetLandmarks(mapSection, id);
-
- if (!landmarks)
- return NULL;
-
- while (1)
- {
- const struct Landmark *landmark = *landmarks;
-
- if (landmark->flag == 0xFFFF || FlagGet(landmark->flag) == TRUE)
- {
- if (count == 0)
- break;
- else
- count--;
- }
-
- landmarks++;
- if (!*landmarks)
- return NULL;
- }
-
- return (*landmarks)->name;
-}
-
-static const struct Landmark **GetLandmarks(u8 mapSection, u8 id)
-{
- u16 i = 0;
-
- for (; gLandmarkLists[i].mapSection != MAPSEC_NONE; i++)
- {
- if (gLandmarkLists[i].mapSection > mapSection)
- return NULL;
- if (gLandmarkLists[i].mapSection == mapSection)
- break;
- }
-
- if (gLandmarkLists[i].mapSection == MAPSEC_NONE)
- return NULL;
-
- for (; gLandmarkLists[i].mapSection == mapSection; i++)
- {
- if (gLandmarkLists[i].id == id)
- return gLandmarkLists[i].landmarks;
- }
-
- return NULL;
-}
diff --git a/src/libc.c b/src/libc.c
deleted file mode 100644
index 920673e3e..000000000
--- a/src/libc.c
+++ /dev/null
@@ -1,143 +0,0 @@
-#include "global.h"
-#include <stddef.h>
-
-#define LBLOCKSIZE (sizeof(long))
-
-// Nonzero if (long)X contains a NULL byte.
-#define CONTAINSNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080)
-
-// Nonzero if X is not aligned on a "long" boundary.
-#define UNALIGNED(X) ((long)X & (LBLOCKSIZE - 1))
-
-void *memcpy(void *dst0, const void *src0, size_t len0)
-{
- char *dst = dst0;
- const char *src = src0;
- long *aligned_dst;
- const long *aligned_src;
- unsigned int len = len0;
-
- // If the size is small, or either src or dst is unaligned,
- // then go to the byte copy loop. This should be rare.
- if (len >= 16 && !(UNALIGNED(src) | UNALIGNED(dst)))
- {
- aligned_dst = (long *)dst;
- aligned_src = (long *)src;
-
- // Copy 4X long words at a time if possible.
- while (len >= 16)
- {
- *aligned_dst++ = *aligned_src++;
- *aligned_dst++ = *aligned_src++;
- *aligned_dst++ = *aligned_src++;
- *aligned_dst++ = *aligned_src++;
- len -= 16;
- }
-
- // Copy one long word at a time if possible
- while (len >= 4)
- {
- *aligned_dst++ = *aligned_src++;
- len -= 4;
- }
-
- dst = (char *)aligned_dst;
- src = (char *)aligned_src;
- }
-
- // Pick up any remaining bytes with a byte copier.
- while (len--)
- *dst++ = *src++;
-
- return dst0;
-}
-
-void *memset(void *m, int c, size_t n)
-{
- char *s = (char *)m;
- int count, i;
- unsigned long buffer;
- unsigned long *aligned_addr;
- unsigned char *unaligned_addr;
-
- // If the size is small or m is unaligned,
- // then go to the byte copy loop. This should be rare.
- if (n >= LBLOCKSIZE && !UNALIGNED(m))
- {
- // We know that n is large and m is word-aligned.
- aligned_addr = (unsigned long *)m;
-
- // Store C into each char sized location in buffer so that
- // we can set large blocks quickly.
- c &= 0xFF;
- if (LBLOCKSIZE == 4)
- {
- buffer = (c << 8) | c;
- buffer |= (buffer << 16);
- }
- else
- {
- buffer = 0;
- for (i = 0; i < LBLOCKSIZE; i++)
- buffer = (buffer << 8) | c;
- }
-
- while (n >= LBLOCKSIZE * 4)
- {
- *aligned_addr++ = buffer;
- *aligned_addr++ = buffer;
- *aligned_addr++ = buffer;
- *aligned_addr++ = buffer;
- n -= LBLOCKSIZE * 4;
- }
- while (n >= LBLOCKSIZE)
- {
- *aligned_addr++ = buffer;
- n -= LBLOCKSIZE;
- }
-
- s = (char *)aligned_addr;
- }
-
- // Pick up the remainder with a bytewise loop.
- while (n--)
- *s++ = (char)c;
-
- return m;
-}
-
-int strcmp(const char *s1, const char *s2)
-{
- unsigned long *a1;
- unsigned long *a2;
-
- // If s1 or s2 are unaligned, then skip this and compare bytes.
- if (!(UNALIGNED(s1) | UNALIGNED(s2)))
- {
- // Compare them a word at a time.
- a1 = (unsigned long *)s1;
- a2 = (unsigned long *)s2;
- while (*a1 == *a2)
- {
- // If *a1 == *a2, and we find a null in *a1,
- // then the strings must be equal, so return zero.
- if (CONTAINSNULL(*a1))
- return 0;
-
- a1++;
- a2++;
- }
-
- s1 = (char *)a1;
- s2 = (char *)a2;
- }
-
- // Check the remaining few bytes.
- while (*s1 != '\0' && *s1 == *s2)
- {
- s1++;
- s2++;
- }
-
- return (*(unsigned char *) s1) - (*(unsigned char *) s2);
-}
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/m4a_2.c b/src/libs/m4a_2.c
index 2d3c65848..2e5956ef0 100644
--- a/src/m4a_2.c
+++ b/src/libs/m4a_2.c
@@ -85,7 +85,7 @@ void m4aSoundInit(void)
mplayInfo->memAccArea = gMPlayMemAccArea;
}
- memcpy(&gPokemonCrySong, &gPokemonCrySongTemplate, sizeof(struct PokemonCrySong));
+ gPokemonCrySong = gPokemonCrySongTemplate;
for (i = 0; i < MAX_POKEMON_CRIES; i++)
{
diff --git a/src/m4a_4.c b/src/libs/m4a_4.c
index 99195ec00..da5550252 100644
--- a/src/m4a_4.c
+++ b/src/libs/m4a_4.c
@@ -45,7 +45,7 @@ void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16
mplayInfo->ident = ID_NUMBER;
}
-void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 pitch)
+void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 pitch)
{
s32 i;
u32 bit;
@@ -445,7 +445,7 @@ start_song:
#define CRY ((s32)&gPokemonCrySongs + i * sizeof(struct PokemonCrySong))
#define CRY_OFS(field) offsetof(struct PokemonCrySong, field)
- memcpy((void *)CRY, &gPokemonCrySong, sizeof(struct PokemonCrySong));
+ *(struct PokemonCrySong *)CRY = gPokemonCrySong;
*(u32 *)(CRY + CRY_OFS(tone)) = (u32)tone;
*(u32 *)(CRY + CRY_OFS(part)) = CRY + CRY_OFS(part0);
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/mail.c b/src/mail.c
deleted file mode 100644
index 658d37976..000000000
--- a/src/mail.c
+++ /dev/null
@@ -1,437 +0,0 @@
-#include "global.h"
-#include "mail.h"
-#include "easy_chat.h"
-#include "items.h"
-#include "mail_data.h"
-#include "menu.h"
-#include "menu_helpers.h"
-#include "name_string_util.h"
-#include "palette.h"
-#include "pokemon_icon.h"
-#include "rom4.h"
-#include "sprite.h"
-#include "string_util.h"
-#include "strings2.h"
-#include "task.h"
-#include "text.h"
-#include "unknown_task.h"
-
-struct UnkMailStruct
-{
- u8 unk_0_0:2;
- u8 unk_0_2:2;
- u8 unk_0_4:4;
-};
-
-struct MailLayout
-{
- u8 var0;
- u8 var1;
- u8 var2;
- u8 var3_0:4;
- u8 var3_4:4;
- struct UnkMailStruct *var4;
-};
-
-struct Unk2000000
-{
- /* 0x00*/ u8 words[8][27];
- /* 0xD8*/ u8 varD8[20];
- /* 0xEC*/ MainCallback varEC;
- /* 0xF0*/ MainCallback varF0;
- /* 0xF4*/ struct MailStruct *varF4;
- /* 0xF8*/ u8 varF8;
- /* 0xF9*/ u8 varF9;
- /* 0xFA*/ u8 varFA;
- /* 0xFB*/ u8 varFB;
- /* 0xFC*/ u8 varFC;
- u8 padFD[1];
- /* 0xFE*/ u8 varFE;
- /* 0xFF*/ u8 varFF;
- /*0x100*/ u8 var100;
- u8 pad101[3];
- /*0x104*/ MainCallback var104;
- /*0x108*/ MainCallback var108;
- /*0x10C*/ struct MailLayout *var10C;
-};
-
-struct MailGraphics
-{
- u16 (*palette)[];
- u8 (*tiles)[];
- u8 (*tileMap)[];
- u16 var0C;
- u16 var0E;
- u16 color10;
- u16 color12;
-};
-
-extern u8 ewram[];
-#define ewram0 (*(struct Unk2000000 *)(ewram))
-
-extern struct MailGraphics gMailGraphicsTable[];
-extern u16 gUnknown_083E562C[][2];
-
-extern struct MailLayout gUnknown_083E5730[];
-extern struct MailLayout gUnknown_083E57A4[];
-
-static u8 sub_80F8A28(void);
-static void sub_80F8D50(void);
-static void sub_80F8DA0(void);
-static void sub_80F8E80(void);
-static void sub_80F8F18(void);
-static void sub_80F8F2C(void);
-static void sub_80F8F58(void);
-static void sub_80F8F78(void);
-static void sub_80F8FB4(void);
-
-void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2)
-{
- u16 mailDesign;
- u16 buffer[2];
-
- ewram0.varFF = GAME_LANGUAGE;
- ewram0.var100 = 1;
- ewram0.var104 = (MainCallback)sub_80EB3FC;
- ewram0.var108 = (MainCallback)ConvertEasyChatWordsToString;
-
- mailDesign = arg0->itemId - ITEM_ORANGE_MAIL;
-
- if (mailDesign <= 11)
- {
- ewram0.varFA = arg0->itemId - ITEM_ORANGE_MAIL;
- }
- else
- {
- ewram0.varFA = 0;
- arg2 = FALSE;
- }
-
- switch (ewram0.var100)
- {
- case 0:
- default:
- ewram0.var10C = &gUnknown_083E5730[ewram0.varFA];
- break;
-
- case 1:
- ewram0.var10C = &gUnknown_083E57A4[ewram0.varFA];
- break;
- }
-
- if (((MailSpeciesToSpecies(arg0->species, buffer) << 16) + 0xFFFF0000) <= (410 << 16))
- {
- switch (ewram0.varFA)
- {
- case 6:
- ewram0.varFB = 1;
- break;
-
- case 9:
- ewram0.varFB = 2;
- break;
-
- default:
- ewram0.varFB = 0;
- break;
- }
- }
- else
- {
- ewram0.varFB = 0;
- }
-
-
- ewram0.varF4 = arg0;
- ewram0.varEC = arg1;
- ewram0.varF8 = arg2;
-
- SetMainCallback2(sub_80F8D50);
-}
-
-#define RETURN_UP_STATE break
-#define RETURN_SKIP_STATE return FALSE
-
-static u8 sub_80F8A28(void)
-{
- switch (gMain.state)
- {
- case 0:
- SetVBlankCallback(NULL);
- remove_some_task();
- REG_DISPCNT = 0;
- RETURN_UP_STATE;
-
- case 1: CpuFill16(0, (void *)OAM, OAM_SIZE);
- RETURN_UP_STATE;
-
- case 2:
- ResetPaletteFade();
- RETURN_UP_STATE;
-
- case 3:
- ResetTasks();
- RETURN_UP_STATE;
-
- case 4:
- ResetSpriteData();
- RETURN_UP_STATE;
-
- case 5:
- FreeAllSpritePalettes();
- REG_BG0HOFS = 0;
- REG_BG0VOFS = 0;
- REG_BG1HOFS = 0;
- REG_BG1VOFS = 0;
- REG_BG2VOFS = 0;
- REG_BG2HOFS = 0;
- REG_BG3HOFS = 0;
- REG_BG3VOFS = 0;
- REG_BLDCNT = 0;
- REG_BLDALPHA = 0;
- RETURN_UP_STATE;
-
- case 6:
- SetUpWindowConfig(&gWindowConfig_81E6DFC);
- RETURN_UP_STATE;
-
- case 7:
- MultistepInitMenuWindowBegin(&gWindowConfig_81E6DFC);
- RETURN_UP_STATE;
-
- case 8:
- if (MultistepInitMenuWindowContinue() == 0)
- {
- return FALSE;
- }
- RETURN_UP_STATE;
-
- case 9:
- MenuZeroFillScreen();
- RETURN_UP_STATE;
-
- case 10: CpuFill16(1, (void *)(VRAM + 0x4800), 0x800);
- RETURN_UP_STATE;
-
- case 11:
- LoadPalette(gMailGraphicsTable[ewram0.varFA].palette, 0, 16 * 2);
- RETURN_UP_STATE;
-
- case 12:
- LZ77UnCompVram(gMailGraphicsTable[ewram0.varFA].tileMap, (void *)(VRAM + 0x4000));
- RETURN_UP_STATE;
-
- case 13:
- LZ77UnCompVram(gMailGraphicsTable[ewram0.varFA].tiles, (void *)(VRAM));
-
- gPlttBufferUnfaded[241] = gMailGraphicsTable[ewram0.varFA].color10;
- gPlttBufferUnfaded[248] = gMailGraphicsTable[ewram0.varFA].color12;
- gPlttBufferUnfaded[10] = gUnknown_083E562C[gSaveBlock2.playerGender][0];
- gPlttBufferUnfaded[11] = gUnknown_083E562C[gSaveBlock2.playerGender][1];
- RETURN_UP_STATE;
-
- case 14:
- if (ewram0.varF8 != 0)
- {
- sub_80F8DA0();
- }
- RETURN_UP_STATE;
-
- case 15:
- if (ewram0.varF8 != 0)
- {
- sub_80F8E80();
- }
-
- SetVBlankCallback(sub_80F8F18);
- gPaletteFade.bufferTransferDisabled = 1;
- RETURN_UP_STATE;
-
- case 16:
- {
- u16 local1;
-
- local1 = sub_809D4A8(ewram0.varF4->species);
-
- switch (ewram0.varFB)
- {
- case 1:
- sub_809D580(local1);
- ewram0.varFC = sub_809D3A4(local1, SpriteCallbackDummy, 96, 128, 0);
- break;
-
- case 2:
- sub_809D580(local1);
- ewram0.varFC = sub_809D3A4(local1, SpriteCallbackDummy, 40, 128, 0);
- break;
- }
- RETURN_UP_STATE;
- }
-
- case 17:
- if (sub_8055870() != TRUE)
- {
- RETURN_UP_STATE;
- }
- RETURN_SKIP_STATE;
-
- case 18:
- REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x512;
- REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(8) | BGCNT_16COLOR | BGCNT_TXT256x256;
- REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(9) | BGCNT_16COLOR | BGCNT_TXT256x256;
- REG_BLDCNT = 0;
- REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON;
- BeginNormalPaletteFade(-1, 0, 16, 0, 0);
- gPaletteFade.bufferTransferDisabled = 0;
- ewram0.varF0 = sub_80F8F58;
- return TRUE;
-
- default:
- return FALSE;
- }
-
- gMain.state += 1;
- return FALSE;
-}
-
-static void sub_80F8D50(void)
-{
- do
- {
- if (sub_80F8A28() == 1)
- {
- SetMainCallback2(sub_80F8F2C);
- return;
- }
- } while (sub_80F9344() != 1);
-}
-
-static u8 *sub_80F8D7C(u8 *dest, u8 *src)
-{
- u16 length;
-
- StringCopy(dest, src);
- SanitizeNameString(dest);
-
- length = StringLength(dest);
-
- return dest + length;
-}
-
-static void sub_80F8DA0(void)
-{
- u16 i;
- u8 r6;
- u8 *ptr;
-
- r6 = 0;
- for (i = 0; i < ewram0.var10C->var0; i++)
- {
- ConvertEasyChatWordsToString(ewram0.words[i], &ewram0.varF4->words[r6], ewram0.var10C->var4[i].unk_0_2, 1);
- r6 += ewram0.var10C->var4[i].unk_0_2;
- }
- ptr = ewram0.varD8;
- if (ewram0.var100 == 0)
- {
- ptr = sub_80F8D7C(ptr, ewram0.varF4->playerName);
- StringCopy(ptr, gOtherText_From);
- ewram0.varF9 = ewram0.var10C->var2 - StringLength(ewram0.varD8);
-
- }
- else
- {
- ptr = StringCopy(ptr, gOtherText_From);
- sub_80F8D7C(ptr, ewram0.varF4->playerName);
- ewram0.varF9 = ewram0.var10C->var2;
- }
-}
-
-static void sub_80F8E80(void)
-{
- u16 pos;
- u8 x;
- u8 y = 0;
-
- for (pos = 0; pos < ewram0.var10C->var0; pos++)
- {
- if (ewram0.words[pos][0] == 0xFF)
- {
- continue;
- }
-
- if (ewram0.words[pos][0] == 0x00)
- {
- continue;
- }
-
- x = ewram0.var10C->var4[pos].unk_0_4;
- y += ewram0.var10C->var4[pos].unk_0_0;
- MenuPrint(ewram0.words[pos], ewram0.var10C->var3_4 + x, ewram0.var10C->var3_0 + y);
- y += 2;
- }
-
- MenuPrint(ewram0.varD8, ewram0.varF9, ewram0.var10C->var1);
-}
-
-static void sub_80F8F18(void)
-{
- LoadOam();
- ProcessSpriteCopyRequests();
- TransferPlttBuffer();
-}
-
-static void sub_80F8F2C(void)
-{
- if (ewram0.varFB != 0)
- {
- AnimateSprites();
- BuildOamBuffer();
- }
-
- ewram0.varF0();
-}
-
-static void sub_80F8F58(void)
-{
- u8 local0;
-
- local0 = UpdatePaletteFade();
- if (local0 == 0)
- {
- ewram0.varF0 = sub_80F8F78;
- }
-}
-
-static void sub_80F8F78(void)
-{
- if (gMain.newKeys & (A_BUTTON | B_BUTTON))
- {
- BeginNormalPaletteFade(-1, 0, 0, 16, 0);
- ewram0.varF0 = sub_80F8FB4;
- }
-}
-
-static void sub_80F8FB4(void)
-{
- u16 local1;
-
- if (UpdatePaletteFade())
- {
- return;
- }
-
- SetMainCallback2(ewram0.varEC);
- switch (ewram0.varFB)
- {
- case 2:
- case 1:
- local1 = sub_809D4A8(ewram0.varF4->species);
- sub_809D608(local1);
-
- sub_809D510(&gSprites[ewram0.varFC]);
- break;
- }
-
- memset(&ewram0, 0, 0x110);
- ResetPaletteFade();
-}
diff --git a/src/matsuda_debug_menu.c b/src/matsuda_debug_menu.c
deleted file mode 100644
index 3665cabd8..000000000
--- a/src/matsuda_debug_menu.c
+++ /dev/null
@@ -1,1113 +0,0 @@
-#include "global.h"
-#include "matsuda_debug_menu.h"
-#include "contest.h"
-#include "contest_link_80C2020.h"
-#include "contest_link_80C857C.h"
-#include "data2.h"
-#include "link.h"
-#include "main.h"
-#include "menu.h"
-#include "palette.h"
-#include "rom4.h"
-#include "sprite.h"
-#include "start_menu.h"
-#include "string_util.h"
-#include "task.h"
-#include "text.h"
-#include "unknown_task.h"
-
-extern u8 gUnknown_0203856C;
-extern u8 gUnknown_0203857D[][64];
-extern u16 gUnknown_02038670[];
-extern u16 gUnknown_02038678[];
-extern u16 gUnknown_02038680[];
-extern u8 gUnknown_02038690[];
-extern u8 gUnknown_02038694;
-extern u8 gIsLinkContest;
-extern u8 gUnknown_0203869B;
-extern u8 gContestPlayerMonIndex;
-extern u16 gScriptContestCategory;
-extern u16 gScriptContestRank;
-
-extern u16 gUnknown_030042A4;
-extern u16 gUnknown_030042A0;
-extern u16 gUnknown_030042C0;
-extern u16 gUnknown_030041B4;
-extern u16 gUnknown_03004288;
-extern u16 gUnknown_03004280;
-extern u16 gUnknown_030041B0;
-extern u16 gUnknown_030041B8;
-extern struct Window gUnknown_03004210;
-extern u8 (*gCallback_03004AE8)(void);
-
-extern u8 gUnknown_083C926E[][2];
-extern u8 gUnknown_083C9282[];
-extern const u8 gUnknown_083C928E[][2];
-extern u8 gUnknown_083C9296[];
-extern u8 gUnknown_083C92A8[];
-extern u8 unk_2000000[];
-extern u8 gMatsudaDebugMenu_GoBackText[];
-extern u8 gMatsudaDebugMenu_BattlePointsText[];
-extern u8 gMatsudaDebugMenu_StartText[];
-
-extern struct SpritePalette gUnknown_083C92BC;
-extern struct SpriteSheet gUnknown_083C92B4;
-extern struct SpriteTemplate gSpriteTemplate_83C92CC;
-extern void (*gUnknown_083C92E4[][2])(struct Sprite *, s8);
-extern u32 gUnknown_083C9400[2];
-
-
-extern u8 gMatsudaDebugMenu_UnknownByteArray[];
-extern u8* gMatsudaDebugMenuTextList1[];
-extern u8* gMatsudaDebugMenuTextList2[];
-extern u8* gMatsudaDebugMenuTextList3[];
-extern u8 gMatsudaDebugMenuContestTopLeft[][2];
-
-extern bool8 gReceivedRemoteLinkPlayers;
-
-extern struct MenuAction gMatsudaDebugMenuActions[];
-
-static bool8 sub_80A9B78(void);
-static void sub_80A9BE4(u8 taskId);
-static void sub_80A9C98(u8);
-static void sub_80A9CC0(u8);
-static void sub_80A9CDC(u8);
-static void sub_80A9D58(u8);
-static void sub_80A9DBC(u8);
-static void sub_80A9DD8(u8);
-static void sub_80A9E04(u8 taskId);
-static void sub_80A9E3C(u8 taskId);
-static void sub_80A9E80(u8);
-static void sub_80A9ED8(u8);
-static void sub_80A9F10(u8);
-static void sub_80AA10C(void);
-static void sub_80AA5BC(u8);
-static void sub_80AA614(u8, u8);
-static void sub_80AAD08(struct Sprite *, s8);
-
-u8 unref_sub_80A9B28(void)
-{
- MenuZeroFillScreen();
- MenuDrawTextWindow(0, 0, 17, 18);
- PrintMenuItems(1, 1, 7, gMatsudaDebugMenuActions);
- InitMenu(0, 1, 1, 7, 0, 16);
- gCallback_03004AE8 = sub_80A9B78;
- return 0;
-}
-
-static bool8 sub_80A9B78(void)
-{
- s8 choice = ProcessMenuInput();
-
- switch (choice)
- {
- case -2:
- return FALSE;
- default:
- gCallback_03004AE8 = gMatsudaDebugMenuActions[choice].func;
- return FALSE;
- case -1:
- CloseMenu();
- return TRUE;
- }
-}
-
-s8 MatsudaDebugMenu_ContestResults(void)
-{
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
- CreateTask(sub_80A9BE4, 0xFF);
- return 1;
-}
-
-static void sub_80A9BE4(u8 taskId)
-{
- if (!gPaletteFade.active)
- {
- DestroyTask(taskId);
-
- if (!(gIsLinkContest & 1))
- sub_80AF668();
-
- sub_80C2358();
- }
-}
-
-s8 MatsudaDebugMenu_Contest(void)
-{
- gIsLinkContest = 0;
- sub_80AA10C();
- return 0;
-}
-
-s8 MatsudaDebugMenu_ContestComm(void)
-{
- sub_80AA10C();
- return 0;
-}
-
-s8 MatsudaDebugMenu_CommTest(void)
-{
- u8 newTaskId;
- u8 newTaskId2;
-
- newTaskId = CreateTask(sub_80A9E3C, 0);
- SetTaskFuncWithFollowupFunc(newTaskId, sub_80A9E3C, sub_80A9C98);
- newTaskId2 = CreateTask(sub_80A9E04, 1);
- gTasks[newTaskId2].data[10] = newTaskId;
- gTasks[newTaskId].data[10] = newTaskId2;
- return 1;
-}
-
-static void sub_80A9C98(u8 taskId)
-{
- sub_80AE098(0);
- SetTaskFuncWithFollowupFunc(taskId, sub_80C8734, sub_80A9CC0);
-}
-
-static void sub_80A9CC0(u8 taskId)
-{
- SetTaskFuncWithFollowupFunc(taskId, sub_80C88AC, sub_80A9CDC);
-}
-
-static void sub_80A9CDC(u8 taskId)
-{
- SetTaskFuncWithFollowupFunc(taskId, sub_80C8E1C, sub_80A9D58);
-}
-
-static void sub_80A9CF8(u8 taskId)
-{
- if (gReceivedRemoteLinkPlayers == FALSE)
- {
- DestroyTask(gTasks[taskId].data[10]);
- DestroyTask(taskId);
- CloseMenu();
- }
-}
-
-static void sub_80A9D30(u8 taskId)
-{
- sub_800832C();
- gTasks[taskId].func = sub_80A9CF8;
-}
-
-static void sub_80A9D58(u8 taskId)
-{
- int i;
- u8 dest[4];
-
- for (i = 0; i < 4; i++)
- dest[i] = gTasks[taskId].data[5 + i];
-
- gUnknown_0203869B = sub_80C4B34(dest);
- sub_80AE82C((u8)gScriptContestCategory);
- sub_80B0F28(0);
- SetTaskFuncWithFollowupFunc(taskId, sub_80C8EBC, sub_80A9DBC);
-}
-
-static void sub_80A9DBC(u8 taskId)
-{
- SetTaskFuncWithFollowupFunc(taskId, sub_80C8F34, sub_80A9DD8);
-}
-
-static void sub_80A9DD8(u8 taskId)
-{
- DestroyTask(gTasks[taskId].data[10]);
- DestroyTask(taskId);
- CloseMenu();
-}
-
-static void sub_80A9E04(u8 taskId)
-{
- if (gMain.newKeys == 2)
- gTasks[(u8)gTasks[taskId].data[10]].func = sub_80A9D30;
-}
-
-static void sub_80A9E3C(u8 taskId)
-{
- u8 i;
-
- OpenLink();
-
- for (i = 0; i < 4; i++)
- gBlockRecvBuffer[i][0] = 255;
-
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].func = sub_80A9E80;
-}
-
-static void sub_80A9E80(u8 taskId)
-{
- TaskFunc func;
-
- if (gTasks[taskId].data[0] < 10)
- gTasks[taskId].data[0]++;
- else
- {
- if (GetLinkPlayerCount_2() > 3)
- {
- gTasks[taskId].data[0] = 0;
-
- if (IsLinkMaster())
- {
- func = sub_80A9ED8;
- gTasks[taskId].func = (TaskFunc)func;
- }
- else
- {
- func = sub_80A9F10;
- gTasks[taskId].func = (TaskFunc)func;
- }
- }
- }
-}
-
-static void sub_80A9ED8(u8 taskId)
-{
- gTasks[taskId].data[0] = gTasks[taskId].data[0] + 1;
- if ((gTasks[taskId].data[0]) == 101)
- {
- sub_8007F4C();
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].func = sub_80A9F10;
- }
-}
-
-static void sub_80A9F10(u8 taskId)
-{
- if (gReceivedRemoteLinkPlayers)
- {
- gContestPlayerMonIndex = GetMultiplayerId();
- if (GetLinkPlayerCount() == 4)
- {
- gIsLinkContest = 1;
- SwitchTaskToFollowupFunc(taskId);
- }
- }
-}
-
-static void sub_80A9F50(void)
-{
- REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP;
- REG_DISPCNT |= DISPCNT_OBJ_ON | DISPCNT_BG0_ON;
- SetUpWindowConfig(&gWindowConfig_81E6C3C);
- InitWindowFromConfig(&gMenuWindow, &gWindowConfig_81E6C3C);
- REG_MOSAIC = 0;
- REG_BLDCNT = 0;
- REG_BLDALPHA = 0;
- REG_BLDY = 0;
- REG_BG0HOFS = 0;
- REG_BG0VOFS = 0;
- gUnknown_030042A4 = 0;
- gUnknown_030042A0 = 0;
- gUnknown_030042C0 = 0;
- gUnknown_030041B4 = 0;
- gUnknown_03004288 = 0;
- gUnknown_03004280 = 0;
- gUnknown_030041B0 = 0;
- gUnknown_030041B8 = 0;
-}
-
-static void sub_80A9FE4(void)
-{
- u8 *addr;
- u32 i;
- u8 ptr[5];
-
- memcpy(ptr, gMatsudaDebugMenu_UnknownByteArray, 5);
-
- addr = (void *)VRAM;
- i = VRAM_SIZE;
-
- while (1)
- {
- DmaFill32(3, 0, addr, 0x1000);
- addr += 0x1000;
- i -= 0x1000;
- if (i <= 0x1000)
- {
- DmaFill32(3, 0, addr, i);
- break;
- }
- }
- sub_80034D4((void *)VRAM, ptr);
- LoadFontDefaultPalette(&gWindowConfig_81E6C3C);
-}
-
-static void sub_80AA064(void)
-{
- AnimateSprites();
- BuildOamBuffer();
- RunTasks();
- UpdatePaletteFade();
- if (gMain.newKeys == 4)
- SetMainCallback2(sub_805469C);
-}
-
-static void sub_80AA090(void)
-{
- REG_BG0HOFS = gUnknown_030042A4;
- REG_BG0VOFS = gUnknown_030042A0;
- REG_BG1HOFS = gUnknown_030042C0;
- REG_BG1VOFS = gUnknown_030041B4;
- REG_BG2HOFS = gUnknown_03004288;
- REG_BG2VOFS = gUnknown_03004280;
- REG_BG3HOFS = gUnknown_030041B0;
- REG_BG3VOFS = gUnknown_030041B8;
- LoadOam();
- ProcessSpriteCopyRequests();
- TransferPlttBuffer();
- sub_8089668();
-}
-
-static void sub_80AA10C(void)
-{
- u8 i;
- u8 zero;
- u8 spriteId;
-
- gPaletteFade.bufferTransferDisabled = 1;
- SetVBlankCallback(0);
- sub_80A9F50();
- dp12_8087EA4();
- ResetPaletteFade();
- ResetSpriteData();
- ResetTasks();
- FreeAllSpritePalettes();
- sub_80A9FE4();
- SetVBlankCallback(sub_80AA090);
- SetMainCallback2(sub_80AA064);
- gPaletteFade.bufferTransferDisabled = 0;
- gUnknown_02038694 = 0;
-
- if (!(gContestMons[0].nickname[0]))
- sub_80AE398(0, 0);
-
- sub_80AE098(gUnknown_02038694);
-
- for (i = 0; i < 6; i++)
- {
- sub_8003460(&gMenuWindow, gMatsudaDebugMenuTextList1[i],
- (0xA * i + 0x2A), gMatsudaDebugMenuContestTopLeft[i][0],
- gMatsudaDebugMenuContestTopLeft[i][1]);
- }
-
- gScriptContestCategory = gScriptContestRank = 0;
- zero = 0; // it's possible this was some assignment that matsuda used to quickly edit and test things without changing whats passed to the later functions.
- sub_80AA5BC(zero);
- sub_80AA5E8(gScriptContestRank);
- sub_8003460(&gMenuWindow, gMatsudaDebugMenu_GoBackText, 0xD6, 0x12, 0x12);
- sub_8003460(&gMenuWindow, gMatsudaDebugMenu_BattlePointsText, 0xDC, zero, 0xC);
- LoadSpriteSheet(&gUnknown_083C92B4);
- LoadSpritePalette(&gUnknown_083C92BC);
- sub_80AA280(3);
- sub_80AA658(3);
- sub_80AA614(3, zero);
- spriteId = CreateSprite(&gSpriteTemplate_83C92CC, gUnknown_083C9296[3], gUnknown_083C92A8[1], 5);
- gSprites[spriteId].data0 = 1;
- gSprites[spriteId].data1 = 1;
- gSprites[spriteId].data2 = 3;
- gSprites[spriteId].data3 = zero; // only this assignment of zero is necessary. other replacements of 0 with zero do not change the asm, compiler will treat it the same.
-}
-
-void sub_80AA280(u8 var) // no?
-{
- u8 i;
-
- FillWindowRect_DefaultPalette(&gMenuWindow, 0, 0, 0, 0x1E, 3);
- StringCopy(unk_2000000, gMatsudaDebugMenu_StartText);
- StringAppend(unk_2000000, &gUnknown_0203857D[var][0]);
-
- for (i = 0; i < 4; i++)
- {
- if (var == i)
- {
- sub_8003460(&gMenuWindow, unk_2000000, (10 * i + 2), gUnknown_083C926E[i][0], gUnknown_083C926E[i][1]);
- }
- else
- {
- u8 *ptr = gUnknown_0203857D[i];
- sub_8003460(&gMenuWindow, ptr, (10 * i + 2), gUnknown_083C926E[i][0], gUnknown_083C926E[i][1]);
- }
- }
-}
-
-static void sub_80AA340(u8 var)
-{
- ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].cool, STR_CONV_MODE_RIGHT_ALIGN, 3);
- sub_8003460(&gMenuWindow, unk_2000000, 0x66, gUnknown_083C9282[0], gUnknown_083C9282[1]);
-}
-
-static void sub_80AA388(u8 var)
-{
- ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].cute, STR_CONV_MODE_RIGHT_ALIGN, 3);
- sub_8003460(&gMenuWindow, unk_2000000, 0x6C, gUnknown_083C9282[2], gUnknown_083C9282[3]);
-}
-
-static void sub_80AA3D0(u8 var)
-{
- ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].beauty, STR_CONV_MODE_RIGHT_ALIGN, 3);
- sub_8003460(&gMenuWindow, unk_2000000, 0x72, gUnknown_083C9282[4], gUnknown_083C9282[5]);
-}
-
-static void sub_80AA418(u8 var)
-{
- ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].smart, STR_CONV_MODE_RIGHT_ALIGN, 3);
- sub_8003460(&gMenuWindow, unk_2000000, 0x78, gUnknown_083C9282[6], gUnknown_083C9282[7]);
-}
-
-static void sub_80AA460(u8 var)
-{
- ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].tough, STR_CONV_MODE_RIGHT_ALIGN, 3);
- sub_8003460(&gMenuWindow, unk_2000000, 0x7E, gUnknown_083C9282[8], gUnknown_083C9282[9]);
-}
-
-static void sub_80AA4A8(u8 var)
-{
- ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].sheen, STR_CONV_MODE_RIGHT_ALIGN, 3);
- sub_8003460(&gMenuWindow, unk_2000000, 0x84, gUnknown_083C9282[10], gUnknown_083C9282[11]);
-}
-
-static void sub_80AA4F0(u8 var1, u8 var2)
-{
- FillWindowRect_DefaultPalette(&gMenuWindow, 0, gUnknown_083C928E[var2][0], gUnknown_083C928E[var2][1], gUnknown_083C928E[var2][0] + 7, gUnknown_083C928E[var2][1] + 1);
- sub_8003460(&gMenuWindow, gMoveNames[gContestMons[var1].moves[var2]], 0x8A + var2 * 14, gUnknown_083C928E[var2][0], gUnknown_083C928E[var2][1]);
- ConvertIntToDecimalStringN(gStringVar1, gContestMons[var1].moves[var2], STR_CONV_MODE_LEADING_ZEROS, 3);
- sub_8003460(&gMenuWindow, gStringVar1, 0xFA + var2 * 6, gUnknown_083C928E[var2][0] + 7, gUnknown_083C928E[var2][1]);
-}
-
-static void sub_80AA5BC(u8 var)
-{
- sub_8003460(&gMenuWindow, gMatsudaDebugMenuTextList2[var], 0xC2, 3, 0x12);
-}
-
-void sub_80AA5E8(u8 var)
-{
- sub_8003460(&gMenuWindow, gMatsudaDebugMenuTextList3[var], 0xE8, 3, 4);
-}
-
-static void sub_80AA614(u8 var1, u8 var2)
-{
- u16 var = sub_80AE770(var1, var2);
-
- ConvertIntToDecimalStringN(unk_2000000, var, STR_CONV_MODE_RIGHT_ALIGN, 3);
- sub_8003460(&gMenuWindow, unk_2000000, 0xE2, 3, 0xC);
-}
-
-void sub_80AA658(u8 var)
-{
- u8 i;
-
- sub_80AA340(var);
- sub_80AA388(var);
- sub_80AA3D0(var);
- sub_80AA418(var);
- sub_80AA460(var);
- sub_80AA4A8(var);
-
- for (i = 0; i < 4; i++)
- sub_80AA4F0(var, i);
-}
-
-void SetDebugMonForContest(void)
-{
- SetMonData(&gPlayerParty[0], MON_DATA_COOL, &gContestMons[gContestPlayerMonIndex].cool);
- SetMonData(&gPlayerParty[0], MON_DATA_CUTE, &gContestMons[gContestPlayerMonIndex].cute);
- SetMonData(&gPlayerParty[0], MON_DATA_BEAUTY, &gContestMons[gContestPlayerMonIndex].beauty);
- 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]);
-}
-
-void sub_80AA754(struct Sprite *sprite)
-{
- switch (gMain.newAndRepeatedKeys)
- {
- case DPAD_RIGHT:
- case DPAD_LEFT:
- sprite->data0 ^= 1;
- break;
- case DPAD_UP:
- if (sprite->data1 == 0)
- sprite->data1 = 8;
- else
- sprite->data1--;
- break;
- case DPAD_DOWN:
- if (sprite->data1 == 8)
- sprite->data1 = 0;
- else
- sprite->data1++;
- break;
- case A_BUTTON:
- gUnknown_083C92E4[sprite->data1][sprite->data0](sprite, 1);
- sub_80AA614(sprite->data2, sprite->data3);
- break;
- case B_BUTTON:
- gUnknown_083C92E4[sprite->data1][sprite->data0](sprite, -1);
- sub_80AA614(sprite->data2, sprite->data3);
- break;
- case R_BUTTON:
- gUnknown_083C92E4[sprite->data1][sprite->data0](sprite, 10);
- sub_80AA614(sprite->data2, sprite->data3);
- break;
- case L_BUTTON:
- gUnknown_083C92E4[sprite->data1][sprite->data0](sprite, -10);
- sub_80AA614(sprite->data2, sprite->data3);
- break;
- case START_BUTTON:
- sub_80AAD08(sprite, 1);
- break;
- }
- sprite->pos1.x = gUnknown_083C9296[sprite->data0 + sprite->data1 * 2];
- sprite->pos1.y = gUnknown_083C92A8[sprite->data1];
-}
-
-static void sub_80AA8A0(struct Sprite *sprite, s8 var1, u8 var2)
-{
- if (var1 == 1)
- {
- sprite->data2 = var2;
- sub_80AA280(var2);
- sub_80AA658(sprite->data2);
- }
-}
-
-void sub_80AA8C8(struct Sprite *sprite, s8 var1)
-{
- sub_80AA8A0(sprite, var1, 0);
-}
-
-void sub_80AA8D8(struct Sprite *sprite, s8 var1)
-{
- sub_80AA8A0(sprite, var1, 1);
-}
-
-void sub_80AA8E8(struct Sprite *sprite, s8 var1)
-{
- sub_80AA8A0(sprite, var1, 2);
-}
-
-void sub_80AA8F8(struct Sprite *sprite, s8 var1)
-{
- sub_80AA8A0(sprite, var1, 3);
-}
-
-static u8 sub_80AA908(u32 a1, u8 a2, s8 a3) // first param is unused.
-{
- s16 val = a2 + a3;
-
- if (val > 255)
- val = 255;
- else if (val < 0)
- val = 0;
-
- return val;
-}
-
-void sub_80AA930(struct Sprite *sprite, u8 var2)
-{
- u8 val = sprite->data2;
-
- gContestMons[sprite->data2].cool = sub_80AA908(val, gContestMons[sprite->data2].cool, var2);
- sub_80AA340(sprite->data2);
-}
-
-void sub_80AA974(struct Sprite *sprite, u8 var2)
-{
- u8 val = sprite->data2;
-
- gContestMons[sprite->data2].cute = sub_80AA908(val, gContestMons[sprite->data2].cute, var2);
- sub_80AA388(sprite->data2);
-}
-
-void sub_80AA9B8(struct Sprite *sprite, u8 var2)
-{
- u8 val = sprite->data2;
-
- gContestMons[sprite->data2].beauty = sub_80AA908(val, gContestMons[sprite->data2].beauty, var2);
- sub_80AA3D0(sprite->data2);
-}
-
-void sub_80AA9FC(struct Sprite *sprite, u8 var2)
-{
- u8 val = sprite->data2;
-
- gContestMons[sprite->data2].smart = sub_80AA908(val, gContestMons[sprite->data2].smart, var2);
- sub_80AA418(sprite->data2);
-}
-
-void sub_80AAA40(struct Sprite *sprite, u8 var2)
-{
- u8 val = sprite->data2;
-
- gContestMons[sprite->data2].tough = sub_80AA908(val, gContestMons[sprite->data2].tough, var2);
- sub_80AA460(sprite->data2);
-}
-
-void sub_80AAA84(struct Sprite *sprite, u8 var2)
-{
- u8 val = sprite->data2;
-
- gContestMons[sprite->data2].sheen = sub_80AA908(val, gContestMons[sprite->data2].sheen, var2);
- sub_80AA4A8(sprite->data2);
-}
-
-// a similar function is at 0x80AA908, however, it apparently returns the wrong type (u8 vs u16).
-static u16 sub_80AAAC8(u32 a1, u16 a2, s8 a3) // first param is unused.
-{
- s16 val = a2 + a3;
-
- if (val > 354)
- val = 1;
- else if (val < 0)
- val = 354;
-
- return val;
-}
-
-void sub_80AAAF0(struct Sprite *sprite, u8 var2)
-{
- u8 val = sprite->data2;
-
- gContestMons[sprite->data2].moves[0] = sub_80AAAC8(val, gContestMons[sprite->data2].moves[0], var2);
- sub_80AA4F0(sprite->data2, 0);
-}
-
-void sub_80AAB30(struct Sprite *sprite, u8 var2)
-{
- u8 val = sprite->data2;
-
- gContestMons[sprite->data2].moves[1] = sub_80AAAC8(val, gContestMons[sprite->data2].moves[1], var2);
- sub_80AA4F0(sprite->data2, 1);
-}
-
-void sub_80AAB70(struct Sprite *sprite, u8 var2)
-{
- u8 val = sprite->data2;
-
- gContestMons[sprite->data2].moves[2] = sub_80AAAC8(val, gContestMons[sprite->data2].moves[2], var2);
- sub_80AA4F0(sprite->data2, 2);
-}
-
-void sub_80AABB0(struct Sprite *sprite, u8 var2)
-{
- u8 val = sprite->data2;
-
- gContestMons[sprite->data2].moves[3] = sub_80AAAC8(val, gContestMons[sprite->data2].moves[3], var2);
- sub_80AA4F0(sprite->data2, 3);
-}
-
-void sub_80AABF0(struct Sprite *sprite, s8 var2)
-{
- s8 a = (var2 > 0) ? 1 : -1;
- s8 r4 = sprite->data3 + a;
-
- if (r4 < 0)
- r4 = 0;
- else if (r4 > 4)
- r4 = 4;
- sub_80AA5BC(r4);
- sprite->data3 = r4;
- gScriptContestCategory = sprite->data3;
- sub_80AE398(sprite->data3, gScriptContestRank);
- sub_80AA280(sprite->data2);
- sub_80AA658(sprite->data2);
-}
-
-void sub_80AAC5C(struct Sprite *sprite, s8 var2)
-{
- if (var2 > 0)
- gScriptContestRank++;
- else if (gScriptContestRank != 0)
- gScriptContestRank--;
- if (gScriptContestRank > 3)
- gScriptContestRank = 3;
- sub_80AA5E8(gScriptContestRank);
- sub_80AE398(gScriptContestCategory, gScriptContestRank);
- sub_80AA280(sprite->data2);
- sub_80AA658(sprite->data2);
-}
-
-void sub_80AACC4(void)
-{
- UpdatePaletteFade();
- if (!gPaletteFade.active)
- {
- SetDebugMonForContest();
- if (!(gIsLinkContest & 1))
- sub_80AE82C(unk_2000000[0]);
- SetMainCallback2(sub_80AB47C);
- }
-}
-
-void sub_80AAD08(struct Sprite *sprite, s8 var2)
-{
- if (var2 == 1)
- {
- unk_2000000[0] = sprite->data3;
- SetMainCallback2(sub_80AACC4);
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
- }
-}
-
-void sub_80AAD44(struct Sprite *sprite, s8 var2)
-{
- if (var2 == 1)
- {
- int i;
-
- SetDebugMonForContest();
- for (i = 0; i < 4; i++)
- gUnknown_02038670[i] = sub_80AE770(i, gScriptContestCategory);
- SetMainCallback2(sub_805469C);
- }
-}
-
-//Do this later
-/*
-void sub_80AAD84(u8 *string, u8 b, u8 c, u8 d)
-{
- u32 r5;
- u16 r7;
- u8 r7_2;
- //u32 sp44;
- //u32 sp48;
- u32 sp58;
-
- gMain.state = 0;
-
- r5 = d + 1;
- //Could also be DmaClear32
- DmaFill32(3, 0, (u8 *)VRAM + 0x18000 - r5 * 256, 0x100);
-
- r7 = StringLength(string);
- if (r7 > 8)
- r7 = 8;
- sp58 = d * 2;
-
- //More stuff
-
- r7_2 = 0x7C - sp58;
-
-}
-*/
-
-__attribute__((naked))
-void sub_80AAD84(u8 *string, u8 b, u8 c, u8 d)
-{
- 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, 0x64\n\
- mov r9, r0\n\
- lsls r1, 24\n\
- lsrs r1, 24\n\
- str r1, [sp, 0x48]\n\
- lsls r2, 24\n\
- lsrs r2, 24\n\
- str r2, [sp, 0x4C]\n\
- lsls r3, 24\n\
- lsrs r3, 24\n\
- mov r10, r3\n\
- mov r5, r10\n\
- adds r5, 0x1\n\
- lsls r1, r5, 8\n\
- ldr r0, _080AAEC4 @ =0x06018000\n\
- subs r1, r0, r1\n\
- movs r0, 0\n\
- str r0, [sp, 0x44]\n\
- ldr r4, _080AAEC8 @ =0x040000d4\n\
- add r0, sp, 0x44\n\
- str r0, [r4]\n\
- str r1, [r4, 0x4]\n\
- ldr r0, _080AAECC @ =0x85000040\n\
- str r0, [r4, 0x8]\n\
- ldr r0, [r4, 0x8]\n\
- mov r0, r9\n\
- bl StringLength\n\
- lsls r0, 16\n\
- lsrs r7, r0, 16\n\
- cmp r7, 0x8\n\
- bls _080AADD0\n\
- movs r7, 0x8\n\
-_080AADD0:\n\
- movs r6, 0\n\
- mov r8, r5\n\
- mov r1, r10\n\
- lsls r1, 1\n\
- str r1, [sp, 0x58]\n\
- ldr r2, [sp, 0x48]\n\
- adds r2, 0x20\n\
- str r2, [sp, 0x5C]\n\
- cmp r6, r7\n\
- bge _080AAE1E\n\
- add r5, sp, 0x40\n\
- add r0, sp, 0x20\n\
- mov r10, r0\n\
- ldr r2, _080AAEC4 @ =0x06018000\n\
-_080AADEC:\n\
- mov r1, r9\n\
- adds r0, r1, r6\n\
- ldrb r0, [r0]\n\
- strb r0, [r5]\n\
- movs r0, 0xFF\n\
- strb r0, [r5, 0x1]\n\
- mov r0, sp\n\
- adds r1, r5, 0\n\
- str r2, [sp, 0x60]\n\
- bl sub_80034D4\n\
- mov r1, r8\n\
- lsls r0, r1, 8\n\
- ldr r2, [sp, 0x60]\n\
- subs r0, r2, r0\n\
- mov r1, r10\n\
- str r1, [r4]\n\
- str r0, [r4, 0x4]\n\
- ldr r0, _080AAED0 @ =0x84000008\n\
- str r0, [r4, 0x8]\n\
- ldr r0, [r4, 0x8]\n\
- adds r2, 0x20\n\
- adds r6, 0x1\n\
- cmp r6, r7\n\
- blt _080AADEC\n\
-_080AAE1E:\n\
- movs r1, 0x7C\n\
- ldr r2, [sp, 0x58]\n\
- subs r1, r2\n\
- lsls r1, 24\n\
- lsrs r7, r1, 24\n\
- ldr r0, _080AAED4 @ =gMain\n\
- mov r9, r0\n\
- lsls r3, r7, 3\n\
- add r3, r9\n\
- ldr r0, _080AAED8 @ =gUnknown_083C9400\n\
- ldr r1, [r0]\n\
- ldr r2, [r0, 0x4]\n\
- str r1, [sp, 0x50]\n\
- str r2, [sp, 0x54]\n\
- str r1, [r3, 0x3C]\n\
- str r2, [r3, 0x40]\n\
- mov r2, r8\n\
- lsls r0, r2, 3\n\
- movs r1, 0x80\n\
- lsls r1, 3\n\
- adds r2, r1, 0\n\
- subs r2, r0\n\
- adds r6, r3, 0\n\
- adds r6, 0x40\n\
- ldr r0, _080AAEDC @ =0x000003ff\n\
- mov r8, r0\n\
- mov r1, r8\n\
- ands r2, r1\n\
- ldrh r5, [r6]\n\
- ldr r4, _080AAEE0 @ =0xfffffc00\n\
- adds r0, r4, 0\n\
- ands r0, r5\n\
- orrs r0, r2\n\
- strh r0, [r6]\n\
- ldrh r5, [r3, 0x3E]\n\
- ldr r2, _080AAEE4 @ =0xfffffe00\n\
- adds r0, r2, 0\n\
- ands r0, r5\n\
- ldr r1, [sp, 0x48]\n\
- orrs r0, r1\n\
- strh r0, [r3, 0x3E]\n\
- adds r3, 0x3C\n\
- add r0, sp, 0x4C\n\
- ldrb r0, [r0]\n\
- strb r0, [r3]\n\
- adds r1, r7, 0x1\n\
- lsls r1, 3\n\
- mov r0, r9\n\
- adds r7, r1, r0\n\
- ldr r0, [sp, 0x50]\n\
- ldr r1, [sp, 0x54]\n\
- str r0, [r7, 0x3C]\n\
- str r1, [r7, 0x40]\n\
- ldrh r0, [r6]\n\
- lsls r0, 22\n\
- lsrs r0, 22\n\
- adds r0, 0x4\n\
- adds r5, r7, 0\n\
- adds r5, 0x40\n\
- mov r1, r8\n\
- ands r0, r1\n\
- ldrh r3, [r5]\n\
- ands r4, r3\n\
- orrs r4, r0\n\
- strh r4, [r5]\n\
- ldrh r0, [r7, 0x3E]\n\
- ands r2, r0\n\
- ldr r0, [sp, 0x5C]\n\
- orrs r2, r0\n\
- strh r2, [r7, 0x3E]\n\
- adds r1, r7, 0\n\
- adds r1, 0x3C\n\
- add r2, sp, 0x4C\n\
- ldrb r2, [r2]\n\
- strb r2, [r1]\n\
- add sp, 0x64\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\
-_080AAEC4: .4byte 0x06018000\n\
-_080AAEC8: .4byte 0x040000d4\n\
-_080AAECC: .4byte 0x85000040\n\
-_080AAED0: .4byte 0x84000008\n\
-_080AAED4: .4byte gMain\n\
-_080AAED8: .4byte gUnknown_083C9400\n\
-_080AAEDC: .4byte 0x000003ff\n\
-_080AAEE0: .4byte 0xfffffc00\n\
-_080AAEE4: .4byte 0xfffffe00\n\
- .syntax divided\n");
-}
-
-void unref_sub_80AAEE8(s32 a, u8 b, u8 c, u8 d)
-{
- u8 string[12];
- u8 offset = 0;
-
- if (a < 0)
- {
- string[0] = 0xAE;
- offset = 1;
- }
- ConvertIntToDecimalStringN(string + offset, (a < 0) ? -a : a, 0, 8);
- sub_80AAD84(string, b, c, d);
-}
-
-void sub_80AAF30(void)
-{
- s32 i;
-
- gUnknown_0203856C = 1;
- gContestPlayerMonIndex = 3;
- sub_80AE098(0);
-
- for (i = 3; i > -1; i--)
- gUnknown_02038690[i] = 3 - i;
-
- for (i = 0; i < 3; i++)
- {
- gUnknown_02038670[i] = 0;
- gUnknown_02038680[i] = 0;
- gUnknown_02038678[i] = 0;
- memcpy(&gContestMons[i], &gContestMons[3], sizeof(struct ContestPokemon));
- }
-
- gUnknown_02038670[3] = 0x12C;
- gUnknown_02038680[3] = 0x190;
- gUnknown_02038678[3] = 0x190;
- sub_80B2A7C(0xFE);
-}
-
-//Don't know size of return type
-int MatsudaDebugMenu_SetHighScore(void)
-{
- sub_80AAF30();
- CloseMenu();
- return 1;
-}
-
-//Don't know size of return type
-int MatsudaDebugMenu_ResetHighScore(void)
-{
- s32 i;
-
- gUnknown_0203856C = 0;
- for (i = 0; i < 4; i++)
- {
- gUnknown_02038670[i] = 0;
- gUnknown_02038680[i] = 0;
- gUnknown_02038678[i] = 0;
- }
- CloseMenu();
- return 1;
-}
-
-//Don't know size of return type
-int MatsudaDebugMenu_SetArtMuseumItems(void)
-{
- s32 i;
-
- gContestPlayerMonIndex = 3;
- sub_80AE098(0);
- for (i = 3; i > -1; i--)
- gUnknown_02038690[i] = 3 - i;
- for (gScriptContestCategory = 0; gScriptContestCategory < 5; gScriptContestCategory++)
- sub_80B2A7C(0xFF);
- CloseMenu();
- return 1;
-}
-
-void unref_sub_80AB084(u8 *text)
-{
- u16 savedIme;
- u8 *addr;
- size_t size;
-
- 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_WIN0H = 0;
- REG_WIN0V = 0;
- REG_WIN1H = 0;
- REG_WIN1V = 0;
- REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON;
-
- savedIme = REG_IME;
- REG_IME = 0;
- REG_IE |= INTR_FLAG_VBLANK;
- REG_IME = savedIme;
- REG_DISPSTAT = 8;
- ResetTasks();
- ResetSpriteData();
- SetMainCallback2(sub_80AB184);
-
- addr = (void *)VRAM;
- size = 0x18000;
- while (1)
- {
- DmaFill32(3, 0, addr, 0x1000);
- addr += 0x1000;
- size -= 0x1000;
- if (size <= 0x1000)
- {
- DmaFill32(3, 0, addr, size);
- break;
- }
- }
- SetUpWindowConfig(&gWindowConfig_81E6FD8);
- InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6FD8);
- LoadFontDefaultPalette(&gWindowConfig_81E6FD8);
- sub_8003460(&gUnknown_03004210, text, 1, 9, 7);
-}
-
-void sub_80AB184(void)
-{
- REG_BG0HOFS = 0;
- REG_BG0VOFS = 0;
- REG_BG1HOFS = 0;
- REG_BG1VOFS = 0;
- REG_BG2HOFS = 0;
- REG_BG2VOFS = 0;
- REG_BG3HOFS = 0;
- REG_BG3VOFS = 0;
-}
diff --git a/src/mauville_old_man.c b/src/mauville_old_man.c
deleted file mode 100644
index 93684fc60..000000000
--- a/src/mauville_old_man.c
+++ /dev/null
@@ -1,247 +0,0 @@
-#include "global.h"
-#include "mauville_old_man.h"
-#include "easy_chat.h"
-#include "menu.h"
-#include "rng.h"
-#include "script.h"
-#include "string_util.h"
-#include "strings.h"
-#include "trader.h"
-
-extern u16 gScriptResult;
-extern u16 gSpecialVar_0x8004;
-
-extern u32 gUnknown_083E5388[];
-extern u32 gUnknown_083E53A8[];
-
-extern u16 gUnknown_083E537C[];
-
-void sub_80F7A34(void)
-{
- u16 i;
- OldMan *oldMan = &gSaveBlock1.oldMan;
-
- oldMan->oldMan1.unk_2D94 = 0;
- oldMan->oldMan1.unk_2DBD = 0;
-
- for(i = 0; i < 6; i++)
- oldMan->oldMan1.mauvilleOldMan_ecArray[i] = gUnknown_083E537C[i];
-}
-
-void sub_80F7A6C(void)
-{
- struct UnkMauvilleOldManStruct *bard = &gSaveBlock1.oldMan.oldMan1;
-
- bard->unk_2D94 = 1;
- bard->unk_2D95 = 0;
-}
-
-void sub_80F7A7C(void)
-{
- sub_80F83F8();
-}
-
-void sub_80F7A88(void)
-{
- OldMan *oldMan = &gSaveBlock1.oldMan;
-
- oldMan->oldMan1.unk_2D94 = 4;
- oldMan->oldMan1.unk_2D95 = 0;
-}
-
-void sub_80F7A98(void)
-{
- sub_81099CC();
-}
-
-void SetMauvilleOldMan(void)
-{
- u32 var = ((u16)((gSaveBlock2.playerTrainerId[1] << 8 | gSaveBlock2.playerTrainerId[0])) % 10) / 2;
-
- switch(var)
- {
- case 0:
- sub_80F7A34();
- break;
- case 1:
- sub_80F7A6C();
- break;
- case 2:
- sub_80F7A98();
- break;
- case 3:
- sub_80F7A7C();
- break;
- case 4:
- sub_80F7A88();
- break;
- }
- sub_80F83D0();
-}
-
-u8 GetCurrentMauvilleOldMan(void)
-{
- OldMan *oldMan = &gSaveBlock1.oldMan;
-
- return oldMan->oldMan1.unk_2D94;
-}
-
-void sub_80F7B14(void)
-{
- gScriptResult = GetCurrentMauvilleOldMan();
-}
-
-void sub_80F7B2C(void)
-{
- u16 *scriptPtr = &gScriptResult; // why??
- OldMan *oldMan = &gSaveBlock1.oldMan;
-
- *scriptPtr = oldMan->oldMan1.unk_2DBD;
-}
-
-void sub_80F7B40(void)
-{
- u16 i;
- OldMan *oldMan = &gSaveBlock1.oldMan;
- //struct UnkMauvilleOldManStruct *oldManStruct = &gSaveBlock1.oldManStruct;
-
- StringCopy(oldMan->oldMan1.playerName, gSaveBlock2.playerName);
-
- for(i = 0; i < 4; i++)
- oldMan->oldMan1.playerTrainerId[i] = gSaveBlock2.playerTrainerId[i];
-
- for(i = 0; i < 6; i++)
- oldMan->oldMan1.mauvilleOldMan_ecArray[i] = oldMan->oldMan1.mauvilleOldMan_ecArray2[i];
-
- oldMan->oldMan1.unk_2DBD = 1;
-}
-
-void sub_80F7BA0(void)
-{
- struct UnkMauvilleOldManStruct *oldMan = &gSaveBlock1.oldMan.oldMan1;
- u16 specialVar = gSpecialVar_0x8004; // It's a bit odd to use this temp variable, but it seems needed to match.
- u16 *r5;
- u16 i;
- u8 *ptr;
- u8 *r4;
-
- r5 = oldMan->mauvilleOldMan_ecArray2;
- if (specialVar == 0)
- r5 = oldMan->mauvilleOldMan_ecArray;
- ptr = gStringVar4;
- r4 = ptr;
- for (i = 0; i < 2; i++)
- {
- ptr = sub_80EB3FC(ptr, *(r5++));
- while (ptr != r4)
- {
- if (*r4 == 0)
- *r4 = 0x37;
- r4++;
- }
- r4++;
- *(ptr++) = 0;
- ptr = sub_80EB3FC(ptr, *(r5++));
- while (ptr != r4)
- {
- if (*r4 == 0)
- *r4 = 0x37;
- r4++;
- }
- r4++;
- *(ptr++) = 0xFE;
- ptr = sub_80EB3FC(ptr, *(r5++));
- while (ptr != r4)
- {
- if (*r4 == 0)
- *r4 = 0x37;
- r4++;
- }
- //_080F7C2A
- if (i == 0)
- {
- *(ptr++) = EXT_CTRL_CODE_BEGIN;
- *(ptr++) = 0xF;
- }
- }
-}
-
-void sub_80F7C54(void)
-{
- sub_80F7F80(gSpecialVar_0x8004);
- MenuDisplayMessageBox();
- ScriptContext1_Stop();
-}
-
-void sub_80F7C70(void)
-{
- u16 *scriptPtr = &gScriptResult; // again??
- OldMan *oldMan = &gSaveBlock1.oldMan;
-
- *scriptPtr = oldMan->oldMan1.unk_2D95;
-}
-
-void sub_80F7C84(void)
-{
- OldMan *oldMan = &gSaveBlock1.oldMan;
-
- oldMan->oldMan1.unk_2D95 = 1;
-}
-
-void sub_80F7C90(void)
-{
- u16 var = sub_80EB8EC();
-
- if(var == 0xFFFF)
- {
- gScriptResult = FALSE;
- }
- else
- {
- sub_80EB3FC(gStringVar1, var);
- gScriptResult = TRUE;
- }
-}
-
-void sub_80F7CC8(void)
-{
- OldMan *oldMan = &gSaveBlock1.oldMan;
-
- if(oldMan->oldMan1.unk_2D95 == 10)
- {
- gScriptResult = FALSE;
- oldMan->oldMan1.unk_2D95 = 0;
- }
- else
- gScriptResult = TRUE;
-}
-
-void sub_80F7CF4(void)
-{
- struct UnkMauvilleOldManStruct2 *oldMan = &gSaveBlock1.oldMan.oldMan2;
-
- if(oldMan->unk1 == 0)
- sub_80F7DC0();
-
- if(oldMan->mauvilleOldMan_ecArray[oldMan->unk1] != 0xFFFF) // is not the last element of the array?
- {
- u8 *stringPtr;
- u32 random = Random();
-
- random %= 8;
- stringPtr = sub_80EB3FC(gStringVar4, oldMan->mauvilleOldMan_ecArray[oldMan->unk1]);
- stringPtr = StringCopy(stringPtr, gOtherText_Is);
- stringPtr = StringCopy(stringPtr, (u8 *)gUnknown_083E5388[random]);
- StringCopy(stringPtr, gOtherText_DontYouAgree);
- }
- else
- {
- StringCopy(gStringVar4, (u8 *)gUnknown_083E53A8[oldMan->mauvilleOldMan_ecArray2[oldMan->unk2++]]);
- }
- if(!(Random() % 10))
- oldMan->unk1 = 10;
- else
- oldMan->unk1++;
-
- gScriptResult = TRUE;
-}
diff --git a/src/party_menu.c b/src/party_menu.c
deleted file mode 100644
index 1fcd2cdda..000000000
--- a/src/party_menu.c
+++ /dev/null
@@ -1,1505 +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"
-
-#define DATA_COUNT (6)
-
-struct Unk2001000
-{
- u8 unk0;
- u8 unk1;
- u8 unk2;
-};
-
-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;
-};
-
-extern u8 ewram[];
-#define ewram01000 (*(struct Unk2001000 *)(ewram + 0x01000))
-#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 51de68171..ef1d66349 100644
--- a/src/learn_move.c
+++ b/src/pokemon/learn_move.c
@@ -1,14 +1,17 @@
#include "global.h"
+#include "contest.h"
#include "data2.h"
#include "field_fadetransition.h"
#include "main.h"
#include "menu.h"
#include "menu_cursor.h"
+#include "learn_move.h"
#include "palette.h"
#include "pokemon.h"
-#include "rom4.h"
+#include "pokemon_summary_screen.h"
+#include "overworld.h"
#include "script.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "sprite.h"
#include "string_util.h"
@@ -16,32 +19,15 @@
#include "strings2.h"
#include "task.h"
#include "trig.h"
+#include "ewram.h"
-extern u8 ewram[];
extern u16 gSpecialVar_0x8004;
extern u16 gSpecialVar_0x8005;
extern u8 gTileBuffer[];
-struct ContestMove
-{
- u8 effect;
- u8 contestCategory:3;
- u8 comboStarterId;
- u8 comboMoves[4];
-};
-
-struct ContestEffect
-{
- u8 effectType;
- u8 appeal;
- u8 jam;
-};
-
-extern const struct ContestMove gContestMoves[];
-extern const struct ContestEffect gContestEffects[];
extern const struct WindowConfig gWindowConfig_81E6CE4;
extern const struct WindowConfig gWindowConfig_81E7240;
-extern const u8 *const gUnknown_083CADD4[];
+extern const u8 *const gContestEffectStrings[];
extern const u8 *const gMoveDescriptions[];
extern const u8 gTypeNames[][7];
extern const u8 *const gUnknown_083CAF70[];
@@ -50,7 +36,6 @@ extern const u8 *const gUnknown_083CAF70[];
extern const u8 deuOtherText_ForgotAndLearned[];
#endif
-extern void sub_809D9F0(struct Pokemon *, u8, u8, void *, u32);
struct LearnMoveStruct
{
@@ -254,7 +239,7 @@ void VBlankCB_LearnMove(void)
TransferPlttBuffer();
}
-void sub_8132670(void)
+void TeachMoveTutorMove(void)
{
ScriptContext2_Enable();
CreateTask(sub_813269C, 10);
@@ -277,7 +262,7 @@ void CB2_InitLearnMove(void)
ResetSpriteData();
FreeAllSpritePalettes();
ResetTasks();
- sLearnMoveStruct = (struct LearnMoveStruct *)(ewram + 0x17000);
+ sLearnMoveStruct = eLearnMoveStruct;
ClearLearnMoveVars();
sLearnMoveStruct->partyMon = gSpecialVar_0x8004;
sub_8133558();
@@ -312,7 +297,7 @@ void sub_81327A4(void)
ResetSpriteData();
FreeAllSpritePalettes();
ResetTasks();
- sLearnMoveStruct = (struct LearnMoveStruct *)(ewram + 0x17000);
+ sLearnMoveStruct = eLearnMoveStruct;
sub_8133558();
sLearnMoveStruct->unk2C6 = gSpecialVar_0x8005;
SetVBlankCallback(VBlankCB_LearnMove);
@@ -557,7 +542,7 @@ void LearnMoveMain(void)
case 20:
if (!gPaletteFade.active)
{
- sub_809D9F0(gPlayerParty, sLearnMoveStruct->partyMon, gPlayerPartyCount - 1, sub_81327A4, sLearnMoveStruct->movesToLearn[sLearnMoveStruct->menuSelection]);
+ ShowSelectMovePokemonSummaryScreen(gPlayerParty, sLearnMoveStruct->partyMon, gPlayerPartyCount - 1, sub_81327A4, sLearnMoveStruct->movesToLearn[sLearnMoveStruct->menuSelection]);
sLearnMoveStruct->state = 28;
}
break;
@@ -765,20 +750,20 @@ void ClearLearnMoveVars(void)
void sub_8133300(struct Sprite *sprite)
{
- s16 var = (sprite->data1 * 10) & 0xFF;
+ s16 var = (sprite->data[1] * 10) & 0xFF;
- switch (sprite->data0)
+ switch (sprite->data[0])
{
case 0:
break;
case 1:
- sprite->pos2.x = Sin(var, 3) * sprite->data2;
+ sprite->pos2.x = Sin(var, 3) * sprite->data[2];
break;
case 2:
- sprite->pos2.y = Sin(var, 1) * sprite->data2;
+ sprite->pos2.y = Sin(var, 1) * sprite->data[2];
break;
}
- sprite->data1++;
+ sprite->data[1]++;
}
void sub_8133358(void)
@@ -786,22 +771,22 @@ void sub_8133358(void)
s32 i;
sLearnMoveStruct->spriteIDs[0] = CreateSprite(&gSpriteTemplate_8402D90, 8, 16, 0);
- gSprites[sLearnMoveStruct->spriteIDs[0]].data0 = 1;
- gSprites[sLearnMoveStruct->spriteIDs[0]].data2 = -1;
+ gSprites[sLearnMoveStruct->spriteIDs[0]].data[0] = 1;
+ gSprites[sLearnMoveStruct->spriteIDs[0]].data[2] = -1;
sLearnMoveStruct->spriteIDs[1] = CreateSprite(&gSpriteTemplate_8402D90, 72, 16, 0);
StartSpriteAnim(&gSprites[sLearnMoveStruct->spriteIDs[1]], 1);
- gSprites[sLearnMoveStruct->spriteIDs[1]].data0 = 1;
- gSprites[sLearnMoveStruct->spriteIDs[1]].data2 = 1;
+ gSprites[sLearnMoveStruct->spriteIDs[1]].data[0] = 1;
+ gSprites[sLearnMoveStruct->spriteIDs[1]].data[2] = 1;
sLearnMoveStruct->spriteIDs[2] = CreateSprite(&gSpriteTemplate_8402DC0, 160, 4, 0);
StartSpriteAnim(&gSprites[sLearnMoveStruct->spriteIDs[2]], 1);
- gSprites[sLearnMoveStruct->spriteIDs[2]].data0 = 2;
- gSprites[sLearnMoveStruct->spriteIDs[2]].data2 = -1;
+ gSprites[sLearnMoveStruct->spriteIDs[2]].data[0] = 2;
+ gSprites[sLearnMoveStruct->spriteIDs[2]].data[2] = -1;
sLearnMoveStruct->spriteIDs[3] = CreateSprite(&gSpriteTemplate_8402DC0, 160, 60, 0);
- gSprites[sLearnMoveStruct->spriteIDs[3]].data0 = 2;
- gSprites[sLearnMoveStruct->spriteIDs[3]].data2 = 1;
+ gSprites[sLearnMoveStruct->spriteIDs[3]].data[0] = 2;
+ gSprites[sLearnMoveStruct->spriteIDs[3]].data[2] = 1;
for (i = 0; i < 8; i++)
{
@@ -1039,7 +1024,7 @@ void sub_8133AEC(bool8 contestInfo, int unused)
gSprites[sLearnMoveStruct->spriteIDs[i + 4]].invisible = FALSE;
for (i = 0; i < 3; i++)
PrintMoveInfo(moveId, gUnknown_08402E24[gUnknown_08402E3D[i]]);
- sub_8072AB0(gUnknown_083CADD4[gContestMoves[moveId].effect], 0x58, 0x48, 0x90, 32, 1);
+ sub_8072AB0(gContestEffectStrings[gContestMoves[moveId].effect], 0x58, 0x48, 0x90, 32, 1);
}
else
{
diff --git a/src/pokemon/mail.c b/src/pokemon/mail.c
new file mode 100644
index 000000000..2ab05ca2b
--- /dev/null
+++ b/src/pokemon/mail.c
@@ -0,0 +1,599 @@
+#include "global.h"
+#include "mail.h"
+#include "easy_chat.h"
+#include "constants/items.h"
+#include "graphics.h"
+#include "mail_data.h"
+#include "menu.h"
+#include "menu_helpers.h"
+#include "name_string_util.h"
+#include "palette.h"
+#include "pokemon_icon.h"
+#include "overworld.h"
+#include "sprite.h"
+#include "string_util.h"
+#include "strings2.h"
+#include "task.h"
+#include "text.h"
+#include "unknown_task.h"
+#include "ewram.h"
+
+struct UnkMailStruct
+{
+ u8 unk_0_0:2;
+ u8 unk_0_2:2;
+ u8 unk_0_4:4;
+};
+
+struct MailLayout
+{
+ u8 var0;
+ u8 var1;
+ u8 var2;
+ u8 var3_0:4;
+ u8 var3_4:4;
+ const struct UnkMailStruct *var4;
+};
+
+struct Unk2000000
+{
+ /* 0x00*/ u8 words[8][27];
+ /* 0xD8*/ u8 varD8[20];
+ /* 0xEC*/ MainCallback varEC;
+ /* 0xF0*/ MainCallback varF0;
+ /* 0xF4*/ struct MailStruct *varF4;
+ /* 0xF8*/ u8 varF8;
+ /* 0xF9*/ u8 varF9;
+ /* 0xFA*/ u8 varFA;
+ /* 0xFB*/ u8 varFB;
+ /* 0xFC*/ u8 varFC;
+ u8 padFD[1];
+ /* 0xFE*/ u8 varFE;
+ /* 0xFF*/ u8 varFF;
+ /*0x100*/ u8 var100;
+ u8 pad101[3];
+ /*0x104*/ MainCallback var104;
+ /*0x108*/ MainCallback var108;
+ /*0x10C*/ const struct MailLayout *var10C;
+};
+
+struct MailGraphics
+{
+ const u16 *palette;
+ const u8 *tiles;
+ const u8 *tileMap;
+ u16 var0C;
+ u16 var0E;
+ u16 color10;
+ u16 color12;
+};
+
+const u16 gUnknown_083E562C[][2] =
+{
+ {0x6ACD, 0x51A5},
+ {0x45FC, 0x38D4},
+};
+
+const struct MailGraphics gMailGraphicsTable[] =
+{
+ {
+ .palette = gMailPalette_Orange,
+ .tiles = gMailTiles_Orange,
+ .tileMap = gMailTilemap_Orange,
+ .var0C = 0x2C0,
+ .var0E = 0,
+ .color10 = 0x294A,
+ .color12 = 0x6739,
+ },
+ {
+ .palette = gMailPalette_Harbor,
+ .tiles = gMailTiles_Harbor,
+ .tileMap = gMailTilemap_Harbor,
+ .var0C = 0x2E0,
+ .var0E = 0,
+ .color10 = 0x7FFF,
+ .color12 = 0x4631,
+ },
+ {
+ .palette = gMailPalette_Glitter,
+ .tiles = gMailTiles_Glitter,
+ .tileMap = gMailTilemap_Glitter,
+ .var0C = 0x400,
+ .var0E = 0,
+ .color10 = 0x294A,
+ .color12 = 0x6739,
+ },
+ {
+ .palette = gMailPalette_Mech,
+ .tiles = gMailTiles_Mech,
+ .tileMap = gMailTilemap_Mech,
+ .var0C = 0x1E0,
+ .var0E = 0,
+ .color10 = 0x7FFF,
+ .color12 = 0x4631,
+ },
+ {
+ .palette = gMailPalette_Wood,
+ .tiles = gMailTiles_Wood,
+ .tileMap = gMailTilemap_Wood,
+ .var0C = 0x2E0,
+ .var0E = 0,
+ .color10 = 0x7FFF,
+ .color12 = 0x4631,
+ },
+ {
+ .palette = gMailPalette_Wave,
+ .tiles = gMailTiles_Wave,
+ .tileMap = gMailTilemap_Wave,
+ .var0C = 0x300,
+ .var0E = 0,
+ .color10 = 0x294A,
+ .color12 = 0x6739,
+ },
+ {
+ .palette = gMailPalette_Bead,
+ .tiles = gMailTiles_Bead,
+ .tileMap = gMailTilemap_Bead,
+ .var0C = 0x140,
+ .var0E = 0,
+ .color10 = 0x7FFF,
+ .color12 = 0x4631,
+ },
+ {
+ .palette = gMailPalette_Shadow,
+ .tiles = gMailTiles_Shadow,
+ .tileMap = gMailTilemap_Shadow,
+ .var0C = 0x300,
+ .var0E = 0,
+ .color10 = 0x7FFF,
+ .color12 = 0x4631,
+ },
+ {
+ .palette = gMailPalette_Tropic,
+ .tiles = gMailTiles_Tropic,
+ .tileMap = gMailTilemap_Tropic,
+ .var0C = 0x220,
+ .var0E = 0,
+ .color10 = 0x294A,
+ .color12 = 0x6739,
+ },
+ {
+ .palette = gMailPalette_Dream,
+ .tiles = gMailTiles_Dream,
+ .tileMap = gMailTilemap_Dream,
+ .var0C = 0x340,
+ .var0E = 0,
+ .color10 = 0x294A,
+ .color12 = 0x6739,
+ },
+ {
+ .palette = gMailPalette_Fab,
+ .tiles = gMailTiles_Fab,
+ .tileMap = gMailTilemap_Fab,
+ .var0C = 0x2A0,
+ .var0E = 0,
+ .color10 = 0x294A,
+ .color12 = 0x6739,
+ },
+ {
+ .palette = gMailPalette_Retro,
+ .tiles = gMailTiles_Retro,
+ .tileMap = gMailTilemap_Retro,
+ .var0C = 0x520,
+ .var0E = 0,
+ .color10 = 0x294A,
+ .color12 = 0x6739,
+ },
+};
+
+const struct UnkMailStruct Unknown_3E5724[] =
+{
+ {0, 3, 0},
+ {0, 3, 0},
+ {0, 3, 0},
+};
+
+const struct MailLayout gUnknown_083E5730[] =
+{
+ {3, 15, 27, 4, 3, Unknown_3E5724},
+ {3, 15, 27, 4, 3, Unknown_3E5724},
+ {3, 15, 27, 4, 3, Unknown_3E5724},
+ {3, 15, 27, 4, 3, Unknown_3E5724},
+ {3, 15, 27, 4, 3, Unknown_3E5724},
+ {3, 15, 27, 4, 3, Unknown_3E5724},
+ {3, 15, 27, 4, 3, Unknown_3E5724},
+ {3, 15, 27, 4, 3, Unknown_3E5724},
+ {3, 15, 27, 4, 3, Unknown_3E5724},
+ {3, 15, 27, 4, 3, Unknown_3E5724},
+ {3, 16, 27, 4, 3, Unknown_3E5724},
+ {3, 15, 27, 4, 3, Unknown_3E5724},
+};
+
+const struct UnkMailStruct Unknown_3E5790[] =
+{
+ {0, 2, 0},
+ {0, 2, 0},
+ {0, 2, 0},
+ {0, 2, 0},
+ {0, 1, 0},
+};
+
+const struct MailLayout gUnknown_083E57A4[] =
+{
+ {5, 15, 15, 4, 3, Unknown_3E5790},
+ {5, 15, 15, 4, 3, Unknown_3E5790},
+ {5, 15, 16, 4, 3, Unknown_3E5790},
+ {5, 15, 15, 4, 3, Unknown_3E5790},
+ {5, 15, 15, 4, 3, Unknown_3E5790},
+ {5, 15, 16, 4, 3, Unknown_3E5790},
+ {5, 15, 16, 4, 3, Unknown_3E5790},
+ {5, 15, 15, 4, 3, Unknown_3E5790},
+ {5, 15, 15, 4, 3, Unknown_3E5790},
+ {5, 15, 15, 4, 3, Unknown_3E5790},
+ {5, 16, 15, 4, 3, Unknown_3E5790},
+ {5, 15, 15, 4, 3, Unknown_3E5790},
+};
+
+// XXX: what is this?
+static u8 *const sSharedMemPtr = gSharedMem;
+
+static u8 sub_80F8A28(void);
+static void sub_80F8D50(void);
+static void sub_80F8DA0(void);
+static void sub_80F8E80(void);
+static void sub_80F8F18(void);
+static void sub_80F8F2C(void);
+static void sub_80F8F58(void);
+static void sub_80F8F78(void);
+static void sub_80F8FB4(void);
+
+void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2)
+{
+ u16 mailDesign;
+ u16 buffer[2];
+
+ ewram0_4.varFF = GAME_LANGUAGE;
+ ewram0_4.var100 = 1;
+ ewram0_4.var104 = (MainCallback)EasyChat_GetWordText;
+ ewram0_4.var108 = (MainCallback)ConvertEasyChatWordsToString;
+
+ mailDesign = arg0->itemId - ITEM_ORANGE_MAIL;
+
+ if (mailDesign <= 11)
+ {
+ ewram0_4.varFA = arg0->itemId - ITEM_ORANGE_MAIL;
+ }
+ else
+ {
+ ewram0_4.varFA = 0;
+ arg2 = FALSE;
+ }
+
+ switch (ewram0_4.var100)
+ {
+ case 0:
+ default:
+ ewram0_4.var10C = &gUnknown_083E5730[ewram0_4.varFA];
+ break;
+
+ case 1:
+ ewram0_4.var10C = &gUnknown_083E57A4[ewram0_4.varFA];
+ break;
+ }
+
+ if (((MailSpeciesToSpecies(arg0->species, buffer) << 16) + 0xFFFF0000) <= (410 << 16))
+ {
+ switch (ewram0_4.varFA)
+ {
+ case 6:
+ ewram0_4.varFB = 1;
+ break;
+
+ case 9:
+ ewram0_4.varFB = 2;
+ break;
+
+ default:
+ ewram0_4.varFB = 0;
+ break;
+ }
+ }
+ else
+ {
+ ewram0_4.varFB = 0;
+ }
+
+
+ ewram0_4.varF4 = arg0;
+ ewram0_4.varEC = arg1;
+ ewram0_4.varF8 = arg2;
+
+ SetMainCallback2(sub_80F8D50);
+}
+
+#define RETURN_UP_STATE break
+#define RETURN_SKIP_STATE return FALSE
+
+static u8 sub_80F8A28(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ remove_some_task();
+ REG_DISPCNT = 0;
+ RETURN_UP_STATE;
+
+ case 1: CpuFill16(0, (void *)OAM, OAM_SIZE);
+ RETURN_UP_STATE;
+
+ case 2:
+ ResetPaletteFade();
+ RETURN_UP_STATE;
+
+ case 3:
+ ResetTasks();
+ RETURN_UP_STATE;
+
+ case 4:
+ ResetSpriteData();
+ RETURN_UP_STATE;
+
+ case 5:
+ FreeAllSpritePalettes();
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG2HOFS = 0;
+ REG_BG3HOFS = 0;
+ REG_BG3VOFS = 0;
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ RETURN_UP_STATE;
+
+ case 6:
+ SetUpWindowConfig(&gWindowConfig_81E6DFC);
+ RETURN_UP_STATE;
+
+ case 7:
+ MultistepInitMenuWindowBegin(&gWindowConfig_81E6DFC);
+ RETURN_UP_STATE;
+
+ case 8:
+ if (MultistepInitMenuWindowContinue() == 0)
+ {
+ return FALSE;
+ }
+ RETURN_UP_STATE;
+
+ case 9:
+ MenuZeroFillScreen();
+ RETURN_UP_STATE;
+
+ case 10: CpuFill16(1, (void *)(VRAM + 0x4800), 0x800);
+ RETURN_UP_STATE;
+
+ case 11:
+ LoadPalette(gMailGraphicsTable[ewram0_4.varFA].palette, 0, 16 * 2);
+ RETURN_UP_STATE;
+
+ case 12:
+ LZ77UnCompVram(gMailGraphicsTable[ewram0_4.varFA].tileMap, (void *)(VRAM + 0x4000));
+ RETURN_UP_STATE;
+
+ case 13:
+ LZ77UnCompVram(gMailGraphicsTable[ewram0_4.varFA].tiles, (void *)(VRAM));
+
+ gPlttBufferUnfaded[241] = gMailGraphicsTable[ewram0_4.varFA].color10;
+ gPlttBufferUnfaded[248] = gMailGraphicsTable[ewram0_4.varFA].color12;
+ gPlttBufferUnfaded[10] = gUnknown_083E562C[gSaveBlock2.playerGender][0];
+ gPlttBufferUnfaded[11] = gUnknown_083E562C[gSaveBlock2.playerGender][1];
+ RETURN_UP_STATE;
+
+ case 14:
+ if (ewram0_4.varF8 != 0)
+ {
+ sub_80F8DA0();
+ }
+ RETURN_UP_STATE;
+
+ case 15:
+ if (ewram0_4.varF8 != 0)
+ {
+ sub_80F8E80();
+ }
+
+ SetVBlankCallback(sub_80F8F18);
+ gPaletteFade.bufferTransferDisabled = 1;
+ RETURN_UP_STATE;
+
+ case 16:
+ {
+ u16 local1;
+
+ local1 = sub_809D4A8(ewram0_4.varF4->species);
+
+ switch (ewram0_4.varFB)
+ {
+ case 1:
+ sub_809D580(local1);
+ ewram0_4.varFC = sub_809D3A4(local1, SpriteCallbackDummy, 96, 128, 0);
+ break;
+
+ case 2:
+ sub_809D580(local1);
+ ewram0_4.varFC = sub_809D3A4(local1, SpriteCallbackDummy, 40, 128, 0);
+ break;
+ }
+ RETURN_UP_STATE;
+ }
+
+ case 17:
+ if (sub_8055870() != TRUE)
+ {
+ RETURN_UP_STATE;
+ }
+ RETURN_SKIP_STATE;
+
+ case 18:
+ REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x512;
+ REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(8) | BGCNT_16COLOR | BGCNT_TXT256x256;
+ REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(9) | BGCNT_16COLOR | BGCNT_TXT256x256;
+ REG_BLDCNT = 0;
+ REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON;
+ BeginNormalPaletteFade(-1, 0, 16, 0, 0);
+ gPaletteFade.bufferTransferDisabled = 0;
+ ewram0_4.varF0 = sub_80F8F58;
+ return TRUE;
+
+ default:
+ return FALSE;
+ }
+
+ gMain.state += 1;
+ return FALSE;
+}
+
+static void sub_80F8D50(void)
+{
+ do
+ {
+ if (sub_80F8A28() == 1)
+ {
+ SetMainCallback2(sub_80F8F2C);
+ return;
+ }
+ } while (sub_80F9344() != 1);
+}
+
+static u8 *sub_80F8D7C(u8 *dest, u8 *src)
+{
+ u16 length;
+
+ StringCopy(dest, src);
+ SanitizeNameString(dest);
+
+ length = StringLength(dest);
+
+ return dest + length;
+}
+
+static void sub_80F8DA0(void)
+{
+ u16 i;
+ u8 r6;
+ u8 *ptr;
+
+ r6 = 0;
+ for (i = 0; i < ewram0_4.var10C->var0; i++)
+ {
+ ConvertEasyChatWordsToString(ewram0_4.words[i], &ewram0_4.varF4->words[r6], ewram0_4.var10C->var4[i].unk_0_2, 1);
+ r6 += ewram0_4.var10C->var4[i].unk_0_2;
+ }
+ ptr = ewram0_4.varD8;
+ if (ewram0_4.var100 == 0)
+ {
+ ptr = sub_80F8D7C(ptr, ewram0_4.varF4->playerName);
+ StringCopy(ptr, gOtherText_From);
+ ewram0_4.varF9 = ewram0_4.var10C->var2 - StringLength(ewram0_4.varD8);
+
+ }
+ else
+ {
+ ptr = StringCopy(ptr, gOtherText_From);
+ sub_80F8D7C(ptr, ewram0_4.varF4->playerName);
+ ewram0_4.varF9 = ewram0_4.var10C->var2;
+ }
+}
+
+static void sub_80F8E80(void)
+{
+ u16 pos;
+ u8 x;
+ u8 y = 0;
+
+ for (pos = 0; pos < ewram0_4.var10C->var0; pos++)
+ {
+ if (ewram0_4.words[pos][0] == 0xFF)
+ {
+ continue;
+ }
+
+ if (ewram0_4.words[pos][0] == 0x00)
+ {
+ continue;
+ }
+
+ x = ewram0_4.var10C->var4[pos].unk_0_4;
+ y += ewram0_4.var10C->var4[pos].unk_0_0;
+ MenuPrint(ewram0_4.words[pos], ewram0_4.var10C->var3_4 + x, ewram0_4.var10C->var3_0 + y);
+ y += 2;
+ }
+
+ MenuPrint(ewram0_4.varD8, ewram0_4.varF9, ewram0_4.var10C->var1);
+}
+
+static void sub_80F8F18(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+static void sub_80F8F2C(void)
+{
+ if (ewram0_4.varFB != 0)
+ {
+ AnimateSprites();
+ BuildOamBuffer();
+ }
+
+ ewram0_4.varF0();
+}
+
+static void sub_80F8F58(void)
+{
+ u8 local0;
+
+ local0 = UpdatePaletteFade();
+ if (local0 == 0)
+ {
+ ewram0_4.varF0 = sub_80F8F78;
+ }
+}
+
+static void sub_80F8F78(void)
+{
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ BeginNormalPaletteFade(-1, 0, 0, 16, 0);
+ ewram0_4.varF0 = sub_80F8FB4;
+ }
+}
+
+static void sub_80F8FB4(void)
+{
+ u16 local1;
+
+ if (UpdatePaletteFade())
+ {
+ return;
+ }
+
+ SetMainCallback2(ewram0_4.varEC);
+ switch (ewram0_4.varFB)
+ {
+ case 2:
+ case 1:
+ local1 = sub_809D4A8(ewram0_4.varF4->species);
+ sub_809D608(local1);
+
+ sub_809D510(&gSprites[ewram0_4.varFC]);
+ break;
+ }
+
+ memset(&ewram0_4, 0, 0x110);
+ ResetPaletteFade();
+}
diff --git a/src/mail_data.c b/src/pokemon/mail_data.c
index ae3f4b3e8..4249b9f48 100644
--- a/src/mail_data.c
+++ b/src/pokemon/mail_data.c
@@ -1,10 +1,10 @@
#include "global.h"
#include "mail_data.h"
-#include "items.h"
+#include "constants/items.h"
#include "name_string_util.h"
#include "pokemon.h"
#include "pokemon_icon.h"
-#include "species.h"
+#include "constants/species.h"
#include "text.h"
void ClearMailData(void)
diff --git a/src/mon_markings.c b/src/pokemon/mon_markings.c
index 0cad8db59..b4144ea34 100644
--- a/src/mon_markings.c
+++ b/src/pokemon/mon_markings.c
@@ -2,7 +2,7 @@
#include "main.h"
#include "menu_cursor.h"
#include "text_window.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "sprite.h"
@@ -24,8 +24,8 @@ struct PokemonMarkMenu
/*0x000C*/ struct Sprite *menuWindowSprites[2]; // upper and lower halves of menu window
/*0x0014*/ struct Sprite *menuMarkingSprites[4];
/*0x0024*/ struct Sprite *menuTextSprite;
- /*0x0028*/ u8 *frameTiles;
- /*0x002C*/ u16 *framePalette;
+ /*0x0028*/ const u8 *frameTiles;
+ /*0x002C*/ const u16 *framePalette;
/*0x0030*/ u8 menuWindowSpriteTiles[0x1000];
/*0x1030*/ u8 filler1030[0x80];
/*0x10B0*/ u8 tileLoadState;
@@ -34,22 +34,275 @@ struct PokemonMarkMenu
extern u8 gPokenavConditionMenuMisc_Gfx[];
extern u16 gUnknown_08E966B8[];
-extern u16 gUnknown_083E49F4[];
-extern u8 gUnknown_083E4A14[];
-extern struct OamData gOamData_83E5214;
-extern struct OamData gOamData_83E521C;
-extern const union AnimCmd *const gSpriteAnimTable_83E5274[];
-extern const union AnimCmd *const gSpriteAnimTable_83E52AC[];
-extern struct OamData gOamData_83E52B4;
-extern const union AnimCmd *const gSpriteAnimTable_83E533C[];
+const u16 gUnknown_083E49F4[] = INCBIN_U16("graphics/misc/mon_markings.gbapal");
+const u8 gUnknown_083E4A14[] = INCBIN_U8("graphics/misc/mon_markings.4bpp");
+
+const struct OamData gOamData_83E5214 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const struct OamData gOamData_83E521C =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 0,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const union AnimCmd gSpriteAnim_83E5224[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E522C[] =
+{
+ ANIMCMD_FRAME(1, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E5234[] =
+{
+ ANIMCMD_FRAME(2, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E523C[] =
+{
+ ANIMCMD_FRAME(3, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E5244[] =
+{
+ ANIMCMD_FRAME(4, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E524C[] =
+{
+ ANIMCMD_FRAME(5, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E5254[] =
+{
+ ANIMCMD_FRAME(6, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E525C[] =
+{
+ ANIMCMD_FRAME(7, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E5264[] =
+{
+ ANIMCMD_FRAME(8, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E526C[] =
+{
+ ANIMCMD_FRAME(9, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_83E5274[] =
+{
+ gSpriteAnim_83E5224,
+ gSpriteAnim_83E522C,
+ gSpriteAnim_83E5234,
+ gSpriteAnim_83E523C,
+ gSpriteAnim_83E5244,
+ gSpriteAnim_83E524C,
+ gSpriteAnim_83E5254,
+ gSpriteAnim_83E525C,
+ gSpriteAnim_83E5264,
+ gSpriteAnim_83E526C,
+};
+
+const union AnimCmd gSpriteAnim_83E529C[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E52A4[] =
+{
+ ANIMCMD_FRAME(64, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_83E52AC[] =
+{
+ gSpriteAnim_83E529C,
+ gSpriteAnim_83E52A4,
+};
+
+const struct OamData gOamData_83E52B4 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const union AnimCmd gSpriteAnim_83E52BC[] =
+{
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E52C4[] =
+{
+ ANIMCMD_FRAME(4, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E52CC[] =
+{
+ ANIMCMD_FRAME(8, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E52D4[] =
+{
+ ANIMCMD_FRAME(12, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E52DC[] =
+{
+ ANIMCMD_FRAME(16, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E52E4[] =
+{
+ ANIMCMD_FRAME(20, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E52EC[] =
+{
+ ANIMCMD_FRAME(24, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E52F4[] =
+{
+ ANIMCMD_FRAME(28, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E52FC[] =
+{
+ ANIMCMD_FRAME(32, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E5304[] =
+{
+ ANIMCMD_FRAME(36, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E530C[] =
+{
+ ANIMCMD_FRAME(40, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E5314[] =
+{
+ ANIMCMD_FRAME(44, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E531C[] =
+{
+ ANIMCMD_FRAME(48, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E5324[] =
+{
+ ANIMCMD_FRAME(52, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E532C[] =
+{
+ ANIMCMD_FRAME(56, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd gSpriteAnim_83E5334[] =
+{
+ ANIMCMD_FRAME(60, 5),
+ ANIMCMD_END,
+};
+
+const union AnimCmd *const gSpriteAnimTable_83E533C[] =
+{
+ gSpriteAnim_83E52BC,
+ gSpriteAnim_83E52C4,
+ gSpriteAnim_83E52CC,
+ gSpriteAnim_83E52D4,
+ gSpriteAnim_83E52DC,
+ gSpriteAnim_83E52E4,
+ gSpriteAnim_83E52EC,
+ gSpriteAnim_83E52F4,
+ gSpriteAnim_83E52FC,
+ gSpriteAnim_83E5304,
+ gSpriteAnim_83E530C,
+ gSpriteAnim_83E5314,
+ gSpriteAnim_83E531C,
+ gSpriteAnim_83E5324,
+ gSpriteAnim_83E532C,
+ gSpriteAnim_83E5334,
+};
static EWRAM_DATA struct PokemonMarkMenu *sMenu = NULL;
-void sub_80F761C(s16, s16, u16, u16);
-void nullsub_65(struct Sprite *);
-void sub_80F78CC(struct Sprite *);
-void sub_80F7908(struct Sprite *);
-struct Sprite *sub_80F7960(u16, u16, u16 *, u16);
+static void sub_80F761C(s16, s16, u16, u16);
+static void nullsub_65(struct Sprite *);
+static void sub_80F78CC(struct Sprite *);
+static void sub_80F7908(struct Sprite *);
+static struct Sprite *sub_80F7960(u16, u16, const u16 *, u16);
void sub_80F727C(struct PokemonMarkMenu *ptr)
{
@@ -284,7 +537,7 @@ void sub_80F761C(s16 x, s16 y, u16 baseTileTag, u16 basePaletteTag)
if (spriteId != 64)
{
sMenu->menuMarkingSprites[i] = &gSprites[spriteId];
- gSprites[spriteId].data0 = i;
+ gSprites[spriteId].data[0] = i;
}
else
{
@@ -324,10 +577,10 @@ void nullsub_65(struct Sprite *sprite)
void sub_80F78CC(struct Sprite *sprite)
{
- if (sMenu->markingsArray[sprite->data0])
- StartSpriteAnim(sprite, 2 * sprite->data0 + 1);
+ if (sMenu->markingsArray[sprite->data[0]])
+ StartSpriteAnim(sprite, 2 * sprite->data[0] + 1);
else
- StartSpriteAnim(sprite, 2 * sprite->data0);
+ StartSpriteAnim(sprite, 2 * sprite->data[0]);
}
void sub_80F7908(struct Sprite *sprite)
@@ -335,21 +588,21 @@ void sub_80F7908(struct Sprite *sprite)
sprite->pos1.y = 16 * sMenu->cursorPos + sMenu->cursorBaseY;
}
-struct Sprite *sub_80F7920(u16 tileTag, u16 paletteTag, u16 *palette)
+struct Sprite *sub_80F7920(u16 tileTag, u16 paletteTag, const u16 *palette)
{
if (!palette)
palette = gUnknown_083E49F4;
return sub_80F7960(tileTag, paletteTag, palette, 16);
}
-struct Sprite *sub_80F7940(u16 tileTag, u16 paletteTag, u16 *palette)
+struct Sprite *sub_80F7940(u16 tileTag, u16 paletteTag, const u16 *palette)
{
if (!palette)
palette = gUnknown_083E49F4;
return sub_80F7960(tileTag, paletteTag, palette, 1);
}
-struct Sprite *sub_80F7960(u16 tileTag, u16 paletteTag, u16 *palette, u16 size)
+struct Sprite *sub_80F7960(u16 tileTag, u16 paletteTag, const u16 *palette, u16 size)
{
u8 spriteId;
struct SpriteTemplate sprTemplate;
@@ -378,6 +631,6 @@ struct Sprite *sub_80F7960(u16 tileTag, u16 paletteTag, u16 *palette, u16 size)
void sub_80F7A10(u8 markings, void *dest)
{
- void *src = gUnknown_083E4A14 + markings * 0x80;
+ const void *src = gUnknown_083E4A14 + markings * 0x80;
DmaCopy16(3, src, dest, 0x80);
}
diff --git a/src/pokeblock_feed.c b/src/pokemon/pokeblock_feed.c
index db4db55a7..8e3adda12 100644
--- a/src/pokeblock_feed.c
+++ b/src/pokemon/pokeblock_feed.c
@@ -6,7 +6,7 @@
#include "text.h"
#include "text_window.h"
#include "menu.h"
-#include "rom4.h"
+#include "overworld.h"
#include "decompress.h"
#include "data2.h"
#include "sprite.h"
@@ -19,8 +19,8 @@
#include "field_effect.h"
#include "sound.h"
#include "trig.h"
+#include "ewram.h"
-extern u8 ewram[];
extern struct MusicPlayerInfo gMPlay_BGM;
extern u8 gPokeblockMonID;
extern s16 gPokeblockGain;
@@ -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);
@@ -540,7 +540,7 @@ static bool8 TransitionToPokeblockFeedScene(void)
case 6:
if (MultistepInitMenuWindowContinue())
{
- ewram[0x1FFFF] = 0;
+ ewram1FFFF = 0;
gMain.state++;
}
break;
@@ -551,11 +551,11 @@ static bool8 TransitionToPokeblockFeedScene(void)
}
break;
case 8:
- ewram[0x1FFFD] = sub_81480B4();
+ ewram1FFFD = sub_81480B4();
gMain.state++;
break;
case 9:
- ewram[0x1FFFE] = PokeblockFeed_CreatePokeSprite(&gPlayerParty[gPokeblockMonID]);
+ ewram1FFFE = PokeblockFeed_CreatePokeSprite(&gPlayerParty[gPokeblockMonID]);
gMain.state++;
break;
case 10:
@@ -611,13 +611,13 @@ static bool8 sub_8147B20(struct Pokemon* mon)
{
u16 species;
u32 PiD, TiD;
- switch (ewram[0x1FFFF])
+ switch (ewram1FFFF)
{
case 0:
species = GetMonData(mon, MON_DATA_SPECIES2);
PiD = GetMonData(mon, MON_DATA_PERSONALITY);
HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, 0x2000000, gUnknown_081FAF4C[1], species, PiD);
- ewram[0x1FFFF]++;
+ ewram1FFFF++;
break;
case 1:
{
@@ -626,40 +626,40 @@ 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]++;
+ ewram1FFFF++;
}
break;
case 2:
LoadCompressedObjectPic(&gUnknown_083F7F74);
- ewram[0x1FFFF]++;
+ ewram1FFFF++;
break;
case 3:
LoadCompressedObjectPalette(&gUnknown_083F7F7C);
- ewram[0x1FFFF]++;
+ ewram1FFFF++;
break;
case 4:
LoadCompressedObjectPic(&sUnknown_084121DC);
- ewram[0x1FFFF]++;
+ ewram1FFFF++;
break;
case 5:
- SetPokeblockFeedSpritePal(gScriptItemId);
+ SetPokeblockFeedSpritePal(gSpecialVar_ItemId);
LoadCompressedObjectPalette(&sPokeblockFeedSpritePal);
- ewram[0x1FFFF]++;
+ ewram1FFFF++;
break;
case 6:
LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM));
- ewram[0x1FFFF]++;
+ ewram1FFFF++;
break;
case 7:
LZDecompressVram(gUnknown_08E782FC, (void*)(VRAM + 0xE800));
- ewram[0x1FFFF]++;
+ ewram1FFFF++;
break;
case 8:
LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60);
- ewram[0x1FFFF] = 0;
+ ewram1FFFF = 0;
return TRUE;
}
return FALSE;
@@ -684,13 +684,13 @@ static void sub_8147CC8(u8 taskID)
sub_81481DC();
break;
case 255:
- sub_8148108(ewram[0x1FFFD], gTasks[taskID].data[1]);
+ sub_8148108(ewram1FFFD, gTasks[taskID].data[1]);
break;
case 269:
- ewram[0x1FFFC] = CreatePokeblockSprite();
+ ewram1FFFC = CreatePokeblockSprite();
break;
case 281:
- sub_8148044(ewram[0x1FFFE]);
+ sub_8148044(ewram1FFFE);
break;
case 297:
gTasks[taskID].func = Task_PrintAtePokeblockText;
@@ -722,7 +722,7 @@ static void Task_WaitForAtePokeblockText(u8 taskID)
static void Task_PrintAtePokeblockText(u8 taskID)
{
struct Pokemon* mon = &gPlayerParty[gPokeblockMonID];
- struct Pokeblock* pokeblock = &gSaveBlock1.pokeblocks[gScriptItemId];
+ struct Pokeblock* pokeblock = &gSaveBlock1.pokeblocks[gSpecialVar_ItemId];
gPokeblockGain = PokeblockGetGain(GetNature(mon), pokeblock);
GetMonNickname(mon, gStringVar1);
@@ -763,10 +763,10 @@ static u8 PokeblockFeed_CreatePokeSprite(struct Pokemon* mon)
gPokeblockFeedMonSpecies = species;
gPokeblockFeedMonSpriteID = spriteID;
gPokeblockFeedMonNature = GetNature(mon);
- gSprites[spriteID].data2 = species;
+ gSprites[spriteID].data[2] = species;
gSprites[spriteID].callback = SpriteCallbackDummy;
gPokeblockMonNotFlipped = 1;
- if (!sub_8040A3C(species))
+ if (!IsPokeSpriteNotFlipped(species))
{
gSprites[spriteID].affineAnims = sSpriteAffineAnimTable_84120EC;
gSprites[spriteID].oam.affineMode = 3;
@@ -780,19 +780,19 @@ static void sub_8148044(u8 spriteID)
{
gSprites[spriteID].pos1.x = 48;
gSprites[spriteID].pos1.y = 80;
- gSprites[spriteID].data0 = -8;
- gSprites[spriteID].data1 = 1;
+ gSprites[spriteID].data[0] = -8;
+ gSprites[spriteID].data[1] = 1;
gSprites[spriteID].callback = sub_8148078;
}
static void sub_8148078(struct Sprite* sprite)
{
sprite->pos1.x += 4;
- sprite->pos1.y += sprite->data0;
- sprite->data0 += sprite->data1;
- if (sprite->data0 == 0)
- PlayCry1(sprite->data2, 0);
- if (sprite->data0 == 9)
+ sprite->pos1.y += sprite->data[0];
+ sprite->data[0] += sprite->data[1];
+ if (sprite->data[0] == 0)
+ PlayCry1(sprite->data[2], 0);
+ if (sprite->data[0] == 9)
sprite->callback = SpriteCallbackDummy;
}
@@ -820,17 +820,17 @@ static void sub_8148108(u8 spriteID, bool8 a1)
static u8 CreatePokeblockSprite(void)
{
u8 spriteID = CreateSprite(&sThrownPokeblockSpriteTemplate, 174, 84, 1);
- gSprites[spriteID].data0 = -12;
- gSprites[spriteID].data1 = 1;
+ gSprites[spriteID].data[0] = -12;
+ gSprites[spriteID].data[1] = 1;
return spriteID;
}
static void SpriteCB_ThrownPokeblock(struct Sprite* sprite)
{
sprite->pos1.x -= 4;
- sprite->pos1.y += sprite->data0;
- sprite->data0 += sprite->data1;
- if (sprite->data0 == 10)
+ sprite->pos1.y += sprite->data[0];
+ sprite->data[0] += sprite->data[1];
+ if (sprite->data[0] == 10)
DestroySprite(sprite);
}
@@ -928,14 +928,11 @@ static bool8 sub_8148540(void)
}
}
-#define ewram1D000 ((u16 *)(ewram + 0x1D000))
-#define ewram1D400 ((u16 *)(ewram + 0x1D400))
-
static bool8 sub_81485CC(void)
{
u16 var = gUnknown_03005FA0[12] - gUnknown_03005FA0[4];
- gPokeblockFeedPokeSprite->pos2.x = ewram1D000[var];
+ gPokeblockFeedPokeSprite->pos2.x = ewram1D000_2[var];
gPokeblockFeedPokeSprite->pos2.y = ewram1D400[var];
if (--gUnknown_03005FA0[4] == 0)
@@ -960,7 +957,7 @@ static void sub_814862C(void)
for (i = 0; i < r7 - 1; i++)
{
- s16* r3 = &ewram1D000[r8 + i];
+ s16* r3 = &ewram1D000_2[r8 + i];
s16 r1 = *r3 - (var3);
s16* r5 = &ewram1D400[r8 + i];
@@ -970,7 +967,7 @@ static void sub_814862C(void)
*r5 -= r4 * (i + 1) / r7;
}
- ewram1D000[(r8 + r7) - 1] = var3;
+ ewram1D000_2[(r8 + r7) - 1] = var3;
ewram1D400[(r8 + r7) - 1] = r9;
}
@@ -999,12 +996,12 @@ void sub_8148710(void)
if (!var_24)
{
- ewram1D000[r4] = Sin(gUnknown_03005FA0[0], gUnknown_03005FA0[2] + r5 / 256) + r8;
+ ewram1D000_2[r4] = Sin(gUnknown_03005FA0[0], gUnknown_03005FA0[2] + r5 / 256) + r8;
ewram1D400[r4] = Cos(gUnknown_03005FA0[0], gUnknown_03005FA0[3] + r5 / 256) + r7;
}
else
{
- ewram1D000[r4] = Sin(gUnknown_03005FA0[0], gUnknown_03005FA0[2] - r5 / 256) + r8;
+ ewram1D000_2[r4] = Sin(gUnknown_03005FA0[0], gUnknown_03005FA0[2] - r5 / 256) + r8;
ewram1D400[r4] = Cos(gUnknown_03005FA0[0], gUnknown_03005FA0[3] - r5 / 256) + r7;
}
diff --git a/src/pokedex.c b/src/pokemon/pokedex.c
index c132635cb..1c1c71454 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"
@@ -15,16 +14,17 @@
#include "pokedex_area_screen.h"
#include "pokedex_cry_screen.h"
#include "pokemon.h"
-#include "rng.h"
-#include "rom4.h"
-#include "songs.h"
+#include "random.h"
+#include "overworld.h"
+#include "constants/songs.h"
#include "sound.h"
-#include "species.h"
+#include "constants/species.h"
#include "string_util.h"
#include "strings.h"
#include "task.h"
#include "trig.h"
#include "unknown_task.h"
+#include "ewram.h"
#define NATIONAL_DEX_COUNT 386
@@ -150,7 +150,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 +185,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 +514,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[] =
@@ -956,86 +955,86 @@ static const struct OamData gOamData_83B557C =
};
static void *const gUnknown_083B5584[] =
{
- (void *)0x02008000,
- (void *)0x0200C000,
- (void *)0x02010000,
- (void *)0x02014000,
+ ePokedexPalAddr1,
+ ePokedexPalAddr2,
+ ePokedexPalAddr3,
+ ePokedexPalAddr4,
};
static const struct SpriteFrameImage gSpriteImageTable_83B5594[] =
{
- {(u8 *)0x02008000, 0x800},
- {(u8 *)0x02008800, 0x800},
- {(u8 *)0x02009000, 0x800},
- {(u8 *)0x02009800, 0x800},
- {(u8 *)0x0200A000, 0x800},
- {(u8 *)0x0200A800, 0x800},
- {(u8 *)0x0200B000, 0x800},
- {(u8 *)0x0200B800, 0x800},
- {(u8 *)0x0200C000, 0x800},
- {(u8 *)0x0200C800, 0x800},
- {(u8 *)0x0200D000, 0x800},
- {(u8 *)0x0200D800, 0x800},
- {(u8 *)0x0200E000, 0x800},
- {(u8 *)0x0200E800, 0x800},
- {(u8 *)0x0200F000, 0x800},
- {(u8 *)0x0200F800, 0x800},
+ {ewram8000, 0x800},
+ {ewram8800, 0x800},
+ {ewram9000, 0x800},
+ {ewram9800, 0x800},
+ {ewramA000, 0x800},
+ {ewramA800, 0x800},
+ {ewramB000, 0x800},
+ {ewramB800, 0x800},
+ {ewramC000, 0x800},
+ {ewramC800, 0x800},
+ {ewramD000, 0x800},
+ {ewramD800, 0x800},
+ {ewramE000, 0x800},
+ {ewramE800, 0x800},
+ {ewramF000, 0x800},
+ {ewramF800, 0x800},
};
static const struct SpriteFrameImage gSpriteImageTable_83B5614[] =
{
- {(u8 *)0x0200C000, 0x800},
- {(u8 *)0x0200C800, 0x800},
- {(u8 *)0x0200D000, 0x800},
- {(u8 *)0x0200D800, 0x800},
- {(u8 *)0x0200E000, 0x800},
- {(u8 *)0x0200E800, 0x800},
- {(u8 *)0x0200F000, 0x800},
- {(u8 *)0x0200F800, 0x800},
- {(u8 *)0x02010000, 0x800},
- {(u8 *)0x02010800, 0x800},
- {(u8 *)0x02011000, 0x800},
- {(u8 *)0x02011800, 0x800},
- {(u8 *)0x02012000, 0x800},
- {(u8 *)0x02012800, 0x800},
- {(u8 *)0x02013000, 0x800},
- {(u8 *)0x02013800, 0x800},
+ {ewramC000, 0x800},
+ {ewramC800, 0x800},
+ {ewramD000, 0x800},
+ {ewramD800, 0x800},
+ {ewramE000, 0x800},
+ {ewramE800, 0x800},
+ {ewramF000, 0x800},
+ {ewramF800, 0x800},
+ {ewram10000, 0x800},
+ {ewram10800, 0x800},
+ {ewram11000, 0x800},
+ {ewram11800, 0x800},
+ {ewram12000, 0x800},
+ {ewram12800, 0x800},
+ {ewram13000, 0x800},
+ {ewram13800, 0x800},
};
static const struct SpriteFrameImage gSpriteImageTable_83B5694[] =
{
- {(u8 *)0x02010000, 0x800},
- {(u8 *)0x02010800, 0x800},
- {(u8 *)0x02011000, 0x800},
- {(u8 *)0x02011800, 0x800},
- {(u8 *)0x02012000, 0x800},
- {(u8 *)0x02012800, 0x800},
- {(u8 *)0x02013000, 0x800},
- {(u8 *)0x02013800, 0x800},
- {(u8 *)0x02014000, 0x800},
- {(u8 *)0x02014800, 0x800},
- {(u8 *)0x02015000, 0x800},
- {(u8 *)0x02015800, 0x800},
- {(u8 *)0x02016000, 0x800},
- {(u8 *)0x02016800, 0x800},
- {(u8 *)0x02017000, 0x800},
- {(u8 *)0x02017800, 0x800},
+ {ewram10000, 0x800},
+ {ewram10800, 0x800},
+ {ewram11000, 0x800},
+ {ewram11800, 0x800},
+ {ewram12000, 0x800},
+ {ewram12800, 0x800},
+ {ewram13000, 0x800},
+ {ewram13800, 0x800},
+ {ewram14000, 0x800},
+ {ewram14800, 0x800},
+ {ewram15000, 0x800},
+ {ewram15800, 0x800},
+ {ewram16000_2, 0x800},
+ {ewram16800, 0x800},
+ {ewram17000, 0x800},
+ {ewram17800_2, 0x800},
};
static const struct SpriteFrameImage gSpriteImageTable_83B5714[] =
{
- {(u8 *)0x02014000, 0x800},
- {(u8 *)0x02014800, 0x800},
- {(u8 *)0x02015000, 0x800},
- {(u8 *)0x02015800, 0x800},
- {(u8 *)0x02016000, 0x800},
- {(u8 *)0x02016800, 0x800},
- {(u8 *)0x02017000, 0x800},
- {(u8 *)0x02017800, 0x800},
- {(u8 *)0x02018000, 0x800},
- {(u8 *)0x02018800, 0x800},
- {(u8 *)0x02019000, 0x800},
- {(u8 *)0x02019800, 0x800},
- {(u8 *)0x0201A000, 0x800},
- {(u8 *)0x0201A800, 0x800},
- {(u8 *)0x0201B000, 0x800},
- {(u8 *)0x0201B800, 0x800},
+ {ewram14000, 0x800},
+ {ewram14800, 0x800},
+ {ewram15000, 0x800},
+ {ewram15800, 0x800},
+ {ewram16000_2, 0x800},
+ {ewram16800, 0x800},
+ {ewram17000, 0x800},
+ {ewram17800_2, 0x800},
+ {ewram18000_2, 0x800},
+ {ewram18800, 0x800},
+ {ewram19000, 0x800},
+ {ewram19800, 0x800},
+ {ewram1A000, 0x800},
+ {ewram1A800, 0x800},
+ {ewram1B000_2, 0x800},
+ {ewram1B800, 0x800},
};
static const struct SpriteFrameImage *const gUnknown_083B5794[] =
{
@@ -1277,8 +1276,8 @@ static void sub_8091564(u16 weight, u8 i, u8 i1);
static void sub_8091738(u16, u16, u16);
static void sub_80917CC(u16 i, u16 i1);
static u16 sub_8091818(u8, u16, u16, u16);
-static u16 sub_80918EC(u16 a, s16 b, s16 c, u16 d);
-static u8 sub_8091A4C(u16 gender, s16, s16, u16);
+u16 sub_80918EC(u16 a, s16 b, s16 c, u16 d);
+u8 sub_8091A4C(u16 gender, s16, s16, u16);
static void sub_8091E54(u8);
static void sub_809204C(u8);
static void sub_809207C(u8);
@@ -1320,8 +1319,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;
}
}
@@ -1435,16 +1434,16 @@ void CB2_InitPokedex(void)
{
case 0:
default:
- gPokedexView = (struct PokedexView *)0x02018000;
+ gPokedexView = ePokedexView1;
break;
case 1:
- gPokedexView = (struct PokedexView *)0x02018800;
+ gPokedexView = ePokedexView2;
break;
case 2:
- gPokedexView = (struct PokedexView *)0x02019000;
+ gPokedexView = ePokedexView3;
break;
case 3:
- gPokedexView = (struct PokedexView *)0x02019800;
+ gPokedexView = ePokedexView4;
break;
}
ClearPokedexView(gPokedexView);
@@ -2030,8 +2029,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 +2044,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 +2064,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 +2078,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 +2092,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 +2106,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 +2120,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;
@@ -2316,7 +2315,7 @@ static void sub_808E0CC(u16 a, u16 b)
{
spriteId = sub_808E8C8(unk, 0x60, 0x50);
gSprites[spriteId].callback = sub_808EE28;
- gSprites[spriteId].data5 = -32;
+ gSprites[spriteId].data[5] = -32;
}
unk = sub_808E888(a);
@@ -2324,7 +2323,7 @@ static void sub_808E0CC(u16 a, u16 b)
{
spriteId = sub_808E8C8(unk, 0x60, 0x50);
gSprites[spriteId].callback = sub_808EE28;
- gSprites[spriteId].data5 = 0;
+ gSprites[spriteId].data[5] = 0;
}
unk = sub_808E888(a + 1);
@@ -2332,7 +2331,7 @@ static void sub_808E0CC(u16 a, u16 b)
{
spriteId = sub_808E8C8(unk, 0x60, 0x50);
gSprites[spriteId].callback = sub_808EE28;
- gSprites[spriteId].data5 = 32;
+ gSprites[spriteId].data[5] = 32;
}
gPokedexView->unk630 = 0;
@@ -2353,7 +2352,7 @@ static bool8 sub_808E208(u8 a, u8 b, u8 c)
for (i = 0; i < 4; i++)
{
if (gPokedexView->unk61E[i] != 0xFFFF)
- gSprites[gPokedexView->unk61E[i]].data5 += b;
+ gSprites[gPokedexView->unk61E[i]].data[5] += b;
}
foo = 16 * (c - gPokedexView->unk62E) / c;
REG_BG2VOFS = gPokedexView->unk62D + gPokedexView->unk632 * 16 - foo;
@@ -2363,7 +2362,7 @@ static bool8 sub_808E208(u8 a, u8 b, u8 c)
for (i = 0; i < 4; i++)
{
if (gPokedexView->unk61E[i] != 0xFFFF)
- gSprites[gPokedexView->unk61E[i]].data5 -= b;
+ gSprites[gPokedexView->unk61E[i]].data[5] -= b;
}
foo = 16 * (c - gPokedexView->unk62E) / c;
REG_BG2VOFS = gPokedexView->unk62D + gPokedexView->unk632 * 16 + foo;
@@ -2393,7 +2392,7 @@ static void sub_808E398(u8 a, u16 b)
{
spriteId = sub_808E8C8(unk, 0x60, 0x50);
gSprites[spriteId].callback = sub_808EE28;
- gSprites[spriteId].data5 = -64;
+ gSprites[spriteId].data[5] = -64;
}
if (gPokedexView->unk630 > 0)
gPokedexView->unk630--;
@@ -2406,7 +2405,7 @@ static void sub_808E398(u8 a, u16 b)
{
spriteId = sub_808E8C8(unk, 0x60, 0x50);
gSprites[spriteId].callback = sub_808EE28;
- gSprites[spriteId].data5 = 0x40;
+ gSprites[spriteId].data[5] = 0x40;
}
if (gPokedexView->unk630 <= 0xE)
gPokedexView->unk630++;
@@ -2601,9 +2600,9 @@ static u32 sub_808E8C8(u16 a, s16 b, s16 c)
gSprites[spriteId].oam.affineMode = 1;
gSprites[spriteId].oam.priority = 3;
- gSprites[spriteId].data0 = 0;
- gSprites[spriteId].data1 = i;
- gSprites[spriteId].data2 = NationalPokedexNumToSpecies(a);
+ gSprites[spriteId].data[0] = 0;
+ gSprites[spriteId].data[1] = i;
+ gSprites[spriteId].data[2] = NationalPokedexNumToSpecies(a);
gPokedexView->unk61E[i] = spriteId;
return spriteId;
}
@@ -2617,10 +2616,10 @@ static void sub_808E978(u8 a)
u16 r5;
spriteId = CreateSprite(&gSpriteTemplate_83A053C, 184, 4, 0);
- gSprites[spriteId].data1 = 0;
+ gSprites[spriteId].data[1] = 0;
spriteId = CreateSprite(&gSpriteTemplate_83A053C, 184, 156, 0);
- gSprites[spriteId].data1 = 1;
+ gSprites[spriteId].data[1] = 1;
gSprites[spriteId].vFlip = TRUE;
CreateSprite(&gSpriteTemplate_83A0524, 234, 20, 0);
@@ -2631,7 +2630,7 @@ static void sub_808E978(u8 a)
spriteId = CreateSprite(&gSpriteTemplate_83A0554, 16, 158, 0);
StartSpriteAnim(&gSprites[spriteId], 2);
- gSprites[spriteId].data2 = 0x80;
+ gSprites[spriteId].data[2] = 0x80;
spriteId = CreateSprite(&gSpriteTemplate_83A0554, 48, 158, 0);
StartSpriteAnim(&gSprites[spriteId], 1);
@@ -2639,14 +2638,14 @@ static void sub_808E978(u8 a)
spriteId = CreateSprite(&gSpriteTemplate_83A056C, 0, 80, 2);
gSprites[spriteId].oam.affineMode = 1;
gSprites[spriteId].oam.matrixNum = 30;
- gSprites[spriteId].data0 = 0x1E;
- gSprites[spriteId].data1 = 0;
+ gSprites[spriteId].data[0] = 0x1E;
+ gSprites[spriteId].data[1] = 0;
spriteId = CreateSprite(&gSpriteTemplate_83A056C, 0, 80, 2);
gSprites[spriteId].oam.affineMode = 1;
gSprites[spriteId].oam.matrixNum = 31;
- gSprites[spriteId].data0 = 0x1F;
- gSprites[spriteId].data1 = 0x80;
+ gSprites[spriteId].data[0] = 0x1F;
+ gSprites[spriteId].data[1] = 0x80;
if (a == 0)
{
@@ -2744,7 +2743,7 @@ static void sub_808EDB8(struct Sprite *sprite)
static void sub_808EE28(struct Sprite *sprite)
{
- u8 data1 = sprite->data1;
+ u8 data1 = sprite->data[1];
if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3)
{
@@ -2755,24 +2754,24 @@ static void sub_808EE28(struct Sprite *sprite)
{
u32 var;
- sprite->pos2.y = gSineTable[(u8)sprite->data5] * 76 / 256;
- var = 0x10000 / gSineTable[sprite->data5 + 0x40];
+ sprite->pos2.y = gSineTable[(u8)sprite->data[5]] * 76 / 256;
+ var = 0x10000 / gSineTable[sprite->data[5] + 0x40];
if (var > 0xFFFF)
var = 0xFFFF;
- SetOamMatrix(sprite->data1 + 1, 0x100, 0, 0, var);
+ SetOamMatrix(sprite->data[1] + 1, 0x100, 0, 0, var);
sprite->oam.matrixNum = data1 + 1;
- if (sprite->data5 > -64 && sprite->data5 < 64)
+ if (sprite->data[5] > -64 && sprite->data[5] < 64)
{
sprite->invisible = FALSE;
- sprite->data0 = 1;
+ sprite->data[0] = 1;
}
else
{
sprite->invisible = TRUE;
}
- if ((sprite->data5 <= -64 || sprite->data5 >= 64) && sprite->data0 != 0)
+ if ((sprite->data[5] <= -64 || sprite->data[5] >= 64) && sprite->data[0] != 0)
{
DestroySprite(sprite);
gPokedexView->unk61E[data1] = 0xFFFF;
@@ -2798,13 +2797,13 @@ static void sub_808EF8C(struct Sprite *sprite)
{
u8 r0;
- if (sprite->data1 != 0)
+ if (sprite->data[1] != 0)
{
if (gPokedexView->selectedPokemon == gPokedexView->pokemonListCount - 1)
sprite->invisible = TRUE;
else
sprite->invisible = FALSE;
- r0 = sprite->data2;
+ r0 = sprite->data[2];
}
else
{
@@ -2812,10 +2811,10 @@ static void sub_808EF8C(struct Sprite *sprite)
sprite->invisible = TRUE;
else
sprite->invisible = FALSE;
- r0 = sprite->data2 - 128;
+ r0 = sprite->data[2] - 128;
}
sprite->pos2.y = gSineTable[r0] / 64;
- sprite->data2 = sprite->data2 + 8;
+ sprite->data[2] = sprite->data[2] + 8;
if (gPokedexView->menuIsOpen == 0 && gPokedexView->menuY == 0 && sprite->invisible == 0)
sprite->invisible = FALSE;
else
@@ -2841,12 +2840,12 @@ static void sub_808F0B4(struct Sprite *sprite)
s16 r3;
s16 r0;
- val = gPokedexView->unk62C + sprite->data1;
+ val = gPokedexView->unk62C + sprite->data[1];
r3 = gSineTable[val];
r0 = gSineTable[val + 0x40];
- SetOamMatrix(sprite->data0, r0, r3, -r3, r0);
+ SetOamMatrix(sprite->data[0], r0, r3, -r3, r0);
- val = gPokedexView->unk62C + (sprite->data1 + 0x40);
+ val = gPokedexView->unk62C + (sprite->data[1] + 0x40);
r3 = gSineTable[val];
r0 = gSineTable[val + 0x40];
sprite->pos2.x = r0 * 40 / 256;
@@ -2868,8 +2867,8 @@ static void sub_808F168(struct Sprite *sprite)
{
sprite->invisible = FALSE;
sprite->pos2.y = gPokedexView->menuCursorPos * 16;
- sprite->pos2.x = gSineTable[(u8)sprite->data2] / 64;
- sprite->data2 += 8;
+ sprite->pos2.x = gSineTable[(u8)sprite->data[2]] / 64;
+ sprite->data[2] += 8;
}
else
{
@@ -3946,7 +3945,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 +4007,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 +4087,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;
}
@@ -4110,13 +4109,13 @@ u16 GetHoennPokedexCount(u8 a)
return count;
}
-bool8 sub_8090FC0(void)
+bool8 CompletedHoennPokedex(void)
{
u16 i;
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 +4127,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;
@@ -4559,7 +4558,7 @@ u16 sub_80918EC(u16 num, s16 x, s16 y, u16 paletteNum)
&gMonFrontPicTable[num],
gMonFrontPicCoords[num].coords,
gMonFrontPicCoords[num].y_offset,
- (void *)0x02000000,
+ (void*)ewram_addr,
gUnknown_083B5584[paletteNum],
num);
break;
@@ -4568,7 +4567,7 @@ u16 sub_80918EC(u16 num, s16 x, s16 y, u16 paletteNum)
&gMonFrontPicTable[num],
gMonFrontPicCoords[num].coords,
gMonFrontPicCoords[num].y_offset,
- 0x02000000,
+ ewram_addr,
gUnknown_083B5584[paletteNum],
num,
gSaveBlock2.pokedex.spindaPersonality,
@@ -4579,7 +4578,7 @@ u16 sub_80918EC(u16 num, s16 x, s16 y, u16 paletteNum)
&gMonFrontPicTable[num],
gMonFrontPicCoords[num].coords,
gMonFrontPicCoords[num].y_offset,
- 0x02000000,
+ ewram_addr,
gUnknown_083B5584[paletteNum],
num,
gSaveBlock2.pokedex.unownPersonality,
@@ -4593,7 +4592,7 @@ u16 sub_80918EC(u16 num, s16 x, s16 y, u16 paletteNum)
return spriteId;
}
-static u8 sub_8091A4C(u16 gender, s16 x, s16 y, u16 paletteNum)
+u8 sub_8091A4C(u16 gender, s16 x, s16 y, u16 paletteNum)
{
u8 spriteId;
@@ -4601,7 +4600,7 @@ static u8 sub_8091A4C(u16 gender, s16 x, s16 y, u16 paletteNum)
&gTrainerFrontPicTable[gender],
gTrainerFrontPicCoords[gender].coords,
gTrainerFrontPicCoords[gender].y_offset,
- (void *)0x02000000,
+ (void*)ewram_addr,
gUnknown_083B5584[0],
gender);
sub_80918B0(gender, 0);
@@ -5483,27 +5482,27 @@ static bool8 sub_8092F8C(u8 taskId)
static void sub_8092FD8(struct Sprite *sprite)
{
- if (gTasks[sprite->data0].func == sub_8092644)
+ if (gTasks[sprite->data[0]].func == sub_8092644)
{
u8 val;
- if (sprite->data1 != 0)
+ if (sprite->data[1] != 0)
{
- if (sub_8092F8C(sprite->data0))
+ if (sub_8092F8C(sprite->data[0]))
sprite->invisible = TRUE;
else
sprite->invisible = FALSE;
}
else
{
- if (sub_8092F44(sprite->data0))
+ if (sub_8092F44(sprite->data[0]))
sprite->invisible = TRUE;
else
sprite->invisible = FALSE;
}
- val = sprite->data2 + sprite->data1 * 128;
+ val = sprite->data[2] + sprite->data[1] * 128;
sprite->pos2.y = gSineTable[val] / 128;
- sprite->data2 += 8;
+ sprite->data[2] += 8;
}
else
{
@@ -5516,13 +5515,13 @@ static void sub_809308C(u8 taskId)
u8 spriteId;
spriteId = CreateSprite(&gSpriteTemplate_83A053C, 184, 4, 0);
- gSprites[spriteId].data0 = taskId;
- gSprites[spriteId].data1 = 0;
+ gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].data[1] = 0;
gSprites[spriteId].callback = sub_8092FD8;
spriteId = CreateSprite(&gSpriteTemplate_83A053C, 184, 108, 0);
- gSprites[spriteId].data0 = taskId;
- gSprites[spriteId].data1 = 1;
+ gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].data[1] = 1;
gSprites[spriteId].vFlip = TRUE;
gSprites[spriteId].callback = sub_8092FD8;
}
diff --git a/src/pokedex_cry_screen.c b/src/pokemon/pokedex_cry_screen.c
index 92fd832fc..912b9aabd 100644
--- a/src/pokedex_cry_screen.c
+++ b/src/pokemon/pokedex_cry_screen.c
@@ -2,6 +2,7 @@
#include "pokedex_cry_screen.h"
#include "palette.h"
#include "sprite.h"
+#include "ewram.h"
struct Unk201C800 {
u8 unk_0;
@@ -11,10 +12,6 @@ struct Unk201C800 {
u16 unk_4;
};
-#define EWRAM_1C800 (*(struct Unk201C800 *)(unk_201C000 + 0x800))
-
-extern u8 unk_201C000[];
-
extern u8 gUnknown_03005E98;
// data/pokedex_cry_screen.o
@@ -49,7 +46,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 c65bfa185..f4d227f7f 100644
--- a/src/pokemon_1.c
+++ b/src/pokemon/pokemon_1.c
@@ -1,14 +1,15 @@
#include "global.h"
#include "data2.h"
-#include "items.h"
+#include "constants/items.h"
#include "main.h"
#include "pokemon.h"
-#include "rng.h"
-#include "rom4.h"
-#include "species.h"
+#include "random.h"
+#include "overworld.h"
+#include "constants/species.h"
#include "sprite.h"
#include "string_util.h"
#include "text.h"
+#include "ewram.h"
//Extracts the upper 16 bits of a 32-bit number
#define HIHALF(n) (((n) & 0xFFFF0000) >> 16)
@@ -16,10 +17,9 @@
//Extracts the lower 16 bits of a 32-bit number
#define LOHALF(n) ((n) & 0xFFFF)
-extern u8 unk_2000000[];
-extern u16 word_2024E82;
+extern u16 gMoveToLearn;
-static EWRAM_DATA u8 byte_2024E88 = 0;
+static EWRAM_DATA u8 sLearningMoveTableID = 0;
u8 gPlayerPartyCount;
struct Pokemon gPlayerParty[6];
@@ -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)
@@ -69,11 +69,12 @@ void ZeroEnemyPartyMons(void)
void CreateMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId)
{
u32 arg;
+
ZeroMonData(mon);
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);
}
@@ -91,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
@@ -115,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)
@@ -140,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);
}
@@ -150,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);
@@ -236,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);
}
@@ -246,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);
@@ -277,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;
}
@@ -296,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);
@@ -309,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;
@@ -325,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;
@@ -355,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);
@@ -400,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)
@@ -413,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);
@@ -423,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)
{
@@ -435,15 +436,15 @@ void CalculateMonStats(struct Pokemon *mon)
newMaxHP = (((n + hpEV / 4) * level) / 100) + level + 10;
}
- unk_2000000[0x160FA] = newMaxHP - oldMaxHP;
- if (unk_2000000[0x160FA] == 0)
- unk_2000000[0x160FA] = 1;
+ eStatHp = newMaxHP - oldMaxHP;
+ if (eStatHp == 0)
+ eStatHp = 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)
@@ -464,18 +465,18 @@ void CalculateMonStats(struct Pokemon *mon)
return;
}
- SetMonData(mon, MON_DATA_HP, (u8 *)&currentHP);
+ SetMonData(mon, MON_DATA_HP, &currentHP);
}
-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);
}
@@ -516,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;
}
@@ -545,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);
}
@@ -583,29 +584,33 @@ void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon)
}
}
-u16 sub_803B7C8(struct Pokemon *mon, u8 a2)
+u16 MonTryLearningNewMove(struct Pokemon *mon, bool8 firstMove)
{
u32 retVal = 0;
u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
u8 level = GetMonData(mon, MON_DATA_LEVEL, NULL);
- if (a2)
+ // since you can learn more than one move per level
+ // the game needs to know whether you decided to
+ // learn it or keep the old set to avoid asking
+ // you to learn the same move over and over again
+ if (firstMove)
{
- byte_2024E88 = retVal;
+ sLearningMoveTableID = 0;
- while ((gLevelUpLearnsets[species][byte_2024E88] & 0xFE00) != (level << 9))
+ while ((gLevelUpLearnsets[species][sLearningMoveTableID] & 0xFE00) != (level << 9))
{
- byte_2024E88++;
- if (gLevelUpLearnsets[species][byte_2024E88] == (u16)-1)
+ sLearningMoveTableID++;
+ if (gLevelUpLearnsets[species][sLearningMoveTableID] == 0xFFFF)
return 0;
}
}
- if ((gLevelUpLearnsets[species][byte_2024E88] & 0xFE00) == (level << 9))
+ if ((gLevelUpLearnsets[species][sLearningMoveTableID] & 0xFE00) == (level << 9))
{
- word_2024E82 = (gLevelUpLearnsets[species][byte_2024E88] & 0x1FF);
- byte_2024E88++;
- retVal = GiveMoveToMon(mon, word_2024E82);
+ gMoveToLearn = (gLevelUpLearnsets[species][sLearningMoveTableID] & 0x1FF);
+ sLearningMoveTableID++;
+ retVal = GiveMoveToMon(mon, gMoveToLearn);
}
return retVal;
@@ -631,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]);
}
@@ -658,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..eb56974cd 100644
--- a/src/pokemon_2.c
+++ b/src/pokemon/pokemon_2.c
@@ -1,24 +1,23 @@
#include "global.h"
#include "battle.h"
+#include "battle_util.h"
#include "data2.h"
#include "event_data.h"
#include "main.h"
#include "pokemon.h"
-#include "rng.h"
+#include "random.h"
#include "rom_8077ABC.h"
-#include "species.h"
+#include "constants/species.h"
#include "sprite.h"
#include "string_util.h"
#include "strings2.h"
#include "text.h"
#include "util.h"
+#include "ewram.h"
extern u8 gPlayerPartyCount;
extern u8 gEnemyPartyCount;
-extern u16 unk_20160BC[];
-extern struct SecretBaseRecord gSecretBaseRecord;
-extern u32 dword_2017100[];
extern u16 gBattleTypeFlags;
extern u8 gActiveBank;
extern struct BattlePokemon gBattleMons[4];
@@ -86,7 +85,7 @@ u8 sub_803C434(u8 a1)
status ^= 1;
if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
- return GetBankByPlayerAI(status);
+ return GetBankByIdentity(status);
if (CountAliveMons(0) > 1)
{
u8 val;
@@ -95,14 +94,14 @@ u8 sub_803C434(u8 a1)
val = status ^ 2;
else
val = status;
- return GetBankByPlayerAI(val);
+ return GetBankByIdentity(val);
}
else
{
if ((gAbsentBankFlags & gBitTable[status]))
- return GetBankByPlayerAI(status ^ 2);
+ return GetBankByIdentity(status ^ 2);
else
- return GetBankByPlayerAI(status);
+ return GetBankByIdentity(status);
}
}
@@ -278,7 +277,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 +421,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 +475,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 +652,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 +783,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 +843,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:
@@ -1062,30 +1061,31 @@ void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord)
s32 i, j;
ZeroEnemyPartyMons();
- memcpy(&gSecretBaseRecord, secretBaseRecord, sizeof(*secretBaseRecord));
+ *eSecretBaseRecord = *secretBaseRecord;
for (i = 0; i < 6; i++)
{
- if (gSecretBaseRecord.partySpecies[i])
+ if (eSecretBaseRecord->partySpecies[i])
{
CreateMon(&gEnemyParty[i],
- gSecretBaseRecord.partySpecies[i],
- gSecretBaseRecord.partyLevels[i],
+ eSecretBaseRecord->partySpecies[i],
+ eSecretBaseRecord->partyLevels[i],
15,
1,
- gSecretBaseRecord.partyPersonality[i],
+ eSecretBaseRecord->partyPersonality[i],
2,
0);
- SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, (u8 *)&gSecretBaseRecord.partyHeldItems[i]);
+ // these two SetMonData calls require the (u8 *) cast since SetMonData is declared in this function.
+ SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, (u8 *)&eSecretBaseRecord->partyHeldItems[i]);
for (j = 0; j < 6; j++)
- SetMonData(&gEnemyParty[i], MON_DATA_HP_EV + j, &gSecretBaseRecord.partyEVs[i]);
+ SetMonData(&gEnemyParty[i], MON_DATA_HP_EV + j, &eSecretBaseRecord->partyEVs[i]);
for (j = 0; j < 4; j++)
{
- SetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j, (u8 *)&gSecretBaseRecord.partyMoves[i * 4 + j]);
- SetMonData(&gEnemyParty[i], MON_DATA_PP1 + j, &gBattleMoves[gSecretBaseRecord.partyMoves[i * 4 + j]].pp);
+ SetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j, (u8 *)&eSecretBaseRecord->partyMoves[i * 4 + j]);
+ SetMonData(&gEnemyParty[i], MON_DATA_PP1 + j, &gBattleMoves[eSecretBaseRecord->partyMoves[i * 4 + j]].pp);
}
}
}
@@ -1096,13 +1096,13 @@ void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord)
u8 GetSecretBaseTrainerPicIndex(void)
{
- u8 trainerClass = gSecretBaseTrainerClasses[gSecretBaseRecord.gender][gSecretBaseRecord.trainerId[0] % 5];
+ u8 trainerClass = gSecretBaseTrainerClasses[eSecretBaseRecord->gender][eSecretBaseRecord->trainerId[0] % 5];
return gTrainerClassToPicIndex[trainerClass];
}
u8 GetSecretBaseTrainerNameIndex(void)
{
- u8 trainerClass = gSecretBaseTrainerClasses[gSecretBaseRecord.gender][gSecretBaseRecord.trainerId[0] % 5];
+ u8 trainerClass = gSecretBaseTrainerClasses[eSecretBaseRecord->gender][eSecretBaseRecord->trainerId[0] % 5];
return gTrainerClassToNameIndex[trainerClass];
}
@@ -1185,7 +1185,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 +1195,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);
@@ -1207,7 +1207,7 @@ void CopyPlayerPartyMonToBattleData(u8 battleIndex, u8 partyIndex)
GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, nickname);
StringCopy10(gBattleMons[battleIndex].nickname, nickname);
GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_NAME, gBattleMons[battleIndex].otName);
- *(unk_20160BC + GetBankSide(battleIndex)) = gBattleMons[battleIndex].hp;
+ ewram160BC[GetBankSide(battleIndex)] = gBattleMons[battleIndex].hp;
for (i = 0; i < 8; i++)
gBattleMons[battleIndex].statStages[i] = 6;
diff --git a/src/pokemon_3.c b/src/pokemon/pokemon_3.c
index d7cc39546..d659ed680 100644
--- a/src/pokemon_3.c
+++ b/src/pokemon/pokemon_3.c
@@ -3,25 +3,26 @@
#include "battle_message.h"
#include "data2.h"
#include "event_data.h"
-#include "hold_effects.h"
+#include "constants/hold_effects.h"
#include "item.h"
-#include "items.h"
+#include "constants/items.h"
#include "link.h"
#include "m4a.h"
#include "main.h"
#include "pokemon.h"
-#include "rng.h"
-#include "rom4.h"
+#include "random.h"
+#include "overworld.h"
#include "rom_8077ABC.h"
#include "rom_8094928.h"
#include "rtc.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
-#include "species.h"
+#include "constants/species.h"
#include "sprite.h"
#include "string_util.h"
#include "text.h"
#include "util.h"
+#include "ewram.h"
extern u8 gPlayerPartyCount;
extern u8 gEnemyPartyCount;
@@ -55,10 +56,10 @@ extern u16 gBattlePartyID[];
extern u8 gJapaneseNidoranNames[][11];
extern u8 gUnknown_082082F8[];
-extern u8 gUnknown_083FFDB3[];
-extern u8 gUnknown_083FFDD3[];
-extern u8 gUnknown_083FEE5D[];
-extern u8 gUnknown_083FEE92[];
+extern u8 BattleText_Rose[];
+extern u8 BattleText_UnknownString3[];
+extern u8 BattleText_MistShroud[];
+extern u8 BattleText_GetPumped[];
extern u8 *gUnknown_08400F58[];
bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId)
@@ -68,7 +69,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;
@@ -196,14 +197,14 @@ void sub_803F324(int stat)
{
gBankTarget = gBankInMenu;
StringCopy(gBattleTextBuff1, gUnknown_08400F58[gUnknown_082082F8[stat]]);
- StringCopy(gBattleTextBuff2, gUnknown_083FFDB3);
- StrCpyDecodeToDisplayedStringBattle(gUnknown_083FFDD3);
+ StringCopy(gBattleTextBuff2, BattleText_Rose);
+ StrCpyDecodeToDisplayedStringBattle(BattleText_UnknownString3);
}
u8 *sub_803F378(u16 itemId)
{
int i;
- u8 *itemEffect;
+ const u8 *itemEffect;
if (itemId == ITEM_ENIGMA_BERRY)
{
@@ -218,7 +219,7 @@ u8 *sub_803F378(u16 itemId)
}
else
{
- itemEffect = (u8 *) gItemEffectTable[itemId - 13];
+ itemEffect = gItemEffectTable[itemId - 13];
}
gStringBank = gBankInMenu;
@@ -236,7 +237,7 @@ u8 *sub_803F378(u16 itemId)
else
{
gBankAttacker = gBankInMenu;
- StrCpyDecodeToDisplayedStringBattle(gUnknown_083FEE92);
+ StrCpyDecodeToDisplayedStringBattle(BattleText_GetPumped);
}
}
}
@@ -244,7 +245,7 @@ u8 *sub_803F378(u16 itemId)
if (itemEffect[3] & 0x80)
{
gBankAttacker = gBankInMenu;
- StrCpyDecodeToDisplayedStringBattle(gUnknown_083FEE5D);
+ StrCpyDecodeToDisplayedStringBattle(BattleText_MistShroud);
}
return gDisplayedStringBattle;
@@ -278,7 +279,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 +356,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 +696,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 +1097,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 +1138,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 +1148,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 +1165,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 +1179,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;
@@ -1197,7 +1198,7 @@ const struct CompressedSpritePalette *sub_80409C8(u16 species, u32 otId , u32 pe
return &gMonPaletteTable[species];
}
-bool8 IsHMMove2(u16 move)
+bool32 IsHMMove2(u16 move)
{
int i = 0;
while (gHMMoves[i] != 0xFFFF)
@@ -1208,9 +1209,9 @@ bool8 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 +1300,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 +1338,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 +1363,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 +1377,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..031f2ea24 100644
--- a/src/pokemon_data.c
+++ b/src/pokemon/pokemon_data.c
@@ -1,26 +1,26 @@
#include "global.h"
#include "pokemon.h"
-#include "species.h"
+#include "constants/species.h"
#include "trainer.h"
-#include "abilities.h"
-#include "moves.h"
-#include "hold_effects.h"
-#include "items.h"
+#include "constants/abilities.h"
+#include "constants/moves.h"
+#include "constants/hold_effects.h"
+#include "constants/items.h"
#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
@@ -84,16 +84,16 @@ const struct SpriteTemplate gSpriteTemplate_8208288[] = {
const u8 gSecretBaseTrainerClasses[][5] = {
// male
- {TRAINER_CLASS_YOUNGSTER, TRAINER_CLASS_BUG_CATCHER, TRAINER_CLASS_RICH_BOY, TRAINER_CLASS_CAMPER, TRAINER_CLASS_COOL_TRAINER_M},
+ {FACILITY_CLASS_YOUNGSTER, FACILITY_CLASS_BUG_CATCHER, FACILITY_CLASS_RICH_BOY, FACILITY_CLASS_CAMPER, FACILITY_CLASS_COOL_TRAINER_M},
// female
- {TRAINER_CLASS_LASS, TRAINER_CLASS_SCHOOL_KID_F, TRAINER_CLASS_LADY, TRAINER_CLASS_PICNICKER, TRAINER_CLASS_COOL_TRAINER_F}
+ {FACILITY_CLASS_LASS, FACILITY_CLASS_SCHOOL_KID_F, FACILITY_CLASS_LADY, FACILITY_CLASS_PICNICKER, FACILITY_CLASS_COOL_TRAINER_F}
};
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..b1b462761 100644
--- a/src/pokemon_icon.c
+++ b/src/pokemon/pokemon_icon.c
@@ -1,7 +1,7 @@
#include "global.h"
#include "graphics.h"
#include "mail_data.h"
-#include "species.h"
+#include "constants/species.h"
#include "sprite.h"
#define POKE_ICON_BASE_PAL_TAG 56000
@@ -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/pokemon_menu.c b/src/pokemon/pokemon_menu.c
new file mode 100644
index 000000000..6c3c6c2b8
--- /dev/null
+++ b/src/pokemon/pokemon_menu.c
@@ -0,0 +1,1199 @@
+#include "global.h"
+#include "easy_chat.h"
+#include "pokemon.h"
+#include "pokemon_menu.h"
+#include "party_menu.h"
+#include "palette.h"
+#include "menu.h"
+#include "mail_data.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "main.h"
+#include "overworld.h"
+#include "menu_helpers.h"
+#include "pokemon_summary_screen.h"
+#include "constants/moves.h"
+#include "data2.h"
+#include "strings.h"
+#include "item_use.h"
+#include "item.h"
+#include "event_data.h"
+#include "mail.h"
+#include "field_player_avatar.h"
+#include "fldeff_softboiled.h"
+#include "braille_puzzles.h"
+#include "field_fadetransition.h"
+#include "field_weather.h"
+#include "field_effect.h"
+#include "field_control_avatar.h"
+#include "metatile_behavior.h"
+#include "fieldmap.h"
+#include "item_menu.h"
+#include "player_pc.h"
+#include "ewram.h"
+
+/*
+Pokemon menu:
+ The menu that appears when you
+ click on a pokemon in
+ overworld 'pokemon' menu
+*/
+
+struct PokeMenuFieldMoveFunc
+{
+ bool8 (*func)(void);
+ u8 field_1;
+};
+
+extern u8 gUnknown_020384F0;
+extern u8 gUnknown_0202E8F4;
+extern u8 gUnknown_0202E8F5;
+extern u8 gUnknown_0202E8F6;
+extern u8 gUnknown_02038561;
+extern u16 gUnknown_0202E8F8;
+extern void (*gUnknown_03004AE4)(u8 taskID, u16 itemID, TaskFunc func);
+extern TaskFunc gUnknown_03005CF0;
+
+void sub_808A520(void);
+void sub_80A61D0(void);
+void CB2_InitFlyRegionMap(void);
+bool8 SetUpFieldMove_Cut(void);
+bool8 SetUpFieldMove_Flash(void);
+bool8 SetUpFieldMove_RockSmash(void);
+bool8 SetUpFieldMove_Strength(void);
+bool8 SetUpFieldMove_Teleport(void);
+bool8 SetUpFieldMove_Dig(void);
+bool8 SetUpFieldMove_SecretPower(void);
+bool8 SetUpFieldMove_SoftBoiled(void);
+bool8 SetUpFieldMove_SoftBoiled(void);
+bool8 SetUpFieldMove_SweetScent(void);
+
+#define sFieldMovesTerminator 0xFF // note: should be changed to 0xFFFF, because currently it makes it impossible to add a field move with 0xFF index
+
+// this file's functions
+static void sub_808A8A8(void);
+static void sub_808B3EC(void);
+static void sub_8089D94(u8 taskID);
+static void sub_8089E4C(u8 taskID);
+static void sub_808A5BC(u8 taskID);
+static void sub_808A8D4(u8 taskID);
+static void sub_808A73C(u8 taskID);
+static void sub_808A848(u8 taskID);
+static void sub_808AAF0(u8 taskID);
+static void sub_808ABF4(u8 taskID);
+static void sub_808AB34(u8 taskID);
+static void sub_808ABA8(u8 taskID);
+static void sub_808B224(u8 taskID);
+static void sub_808B2EC(u8 taskID);
+static void sub_808B2B4(u8 taskID);
+static void sub_808B25C(u8 taskID);
+static void sub_808B1EC(u8 taskID);
+static void sub_808B338(u8 taskID);
+static void sub_808B4A4(u8 taskID);
+static void sub_808B4EC(u8 taskID);
+static void sub_808B5E4(u8 taskID);
+static void PokemonMenu_Summary(u8 taskID);
+static void PokemonMenu_Switch(u8 taskID);
+static void PokemonMenu_Item(u8 taskID);
+static void PokemonMenu_Cancel(u8 taskID);
+static void PokemonMenu_GiveItem(u8 taskID);
+static void PokemonMenu_TakeItem(u8 taskID);
+static void PokemonMenu_TakeMail(u8 taskID);
+static void PokemonMenu_Mail(u8 taskID);
+static void PokemonMenu_ReadMail(u8 taskID);
+static void PokemonMenu_CancelSubmenu(u8 taskID);
+static void PokemonMenu_FieldMove(u8 taskID);
+static bool8 SetUpFieldMove_Waterfall(void);
+static bool8 SetUpFieldMove_Surf(void);
+static bool8 SetUpFieldMove_Fly(void);
+static bool8 SetUpFieldMove_Dive(void);
+
+// ewram data
+
+EWRAM_DATA static u8 sPokeMenuCursorPos = 0;
+EWRAM_DATA static u8 sPokeMenuOptionsNo = 0;
+EWRAM_DATA static u8 sPokeMenuOptionsOrder[8] = {0}; // 4 possible field moves and 4 default options
+
+// iwram common
+u8 gLastFieldPokeMenuOpened;
+void (*gUnknown_03005CE4)(void);
+
+// const data
+
+static const struct MenuAction2 sPokemonMenuActions[] =
+{
+ {OtherText_Summary, PokemonMenu_Summary},
+ {OtherText_Switch2, PokemonMenu_Switch},
+ {OtherText_Item, PokemonMenu_Item},
+ {gOtherText_CancelNoTerminator, PokemonMenu_Cancel},
+ {OtherText_Give2, PokemonMenu_GiveItem},
+ {OtherText_Take2, PokemonMenu_TakeItem},
+ {OtherText_Take, PokemonMenu_TakeMail},
+ {OtherText_Mail, PokemonMenu_Mail},
+ {OtherText_Read2, PokemonMenu_ReadMail},
+ {gOtherText_CancelNoTerminator, PokemonMenu_CancelSubmenu},
+ {gMoveNames[MOVE_CUT], PokemonMenu_FieldMove},
+ {gMoveNames[MOVE_FLASH], PokemonMenu_FieldMove},
+ {gMoveNames[MOVE_ROCK_SMASH], PokemonMenu_FieldMove},
+ {gMoveNames[MOVE_STRENGTH], PokemonMenu_FieldMove},
+ {gMoveNames[MOVE_SURF], PokemonMenu_FieldMove},
+ {gMoveNames[MOVE_FLY], PokemonMenu_FieldMove},
+ {gMoveNames[MOVE_DIVE], PokemonMenu_FieldMove},
+ {gMoveNames[MOVE_WATERFALL], PokemonMenu_FieldMove},
+ {gMoveNames[MOVE_TELEPORT], PokemonMenu_FieldMove},
+ {gMoveNames[MOVE_DIG], PokemonMenu_FieldMove},
+ {gMoveNames[MOVE_SECRET_POWER], PokemonMenu_FieldMove},
+ {gMoveNames[MOVE_MILK_DRINK], PokemonMenu_FieldMove},
+ {gMoveNames[MOVE_SOFT_BOILED], PokemonMenu_FieldMove},
+ {gMoveNames[MOVE_SWEET_SCENT], PokemonMenu_FieldMove},
+};
+
+static const u16 sPokeMenuFieldMoves[] =
+{
+ MOVE_CUT, MOVE_FLASH, MOVE_ROCK_SMASH, MOVE_STRENGTH,
+ MOVE_SURF, MOVE_FLY, MOVE_DIVE, MOVE_WATERFALL,
+ MOVE_TELEPORT, MOVE_DIG, MOVE_SECRET_POWER, MOVE_MILK_DRINK,
+ MOVE_SOFT_BOILED, MOVE_SWEET_SCENT, sFieldMovesTerminator,
+};
+
+static const u8 sUnknown_39F572[] = {4, 5, 9, 0};
+static const struct PartyPopupMenu sUnknown_0839F578 = {3, 6, sUnknown_39F572};
+
+static const u8 sUnknown_39F580[] = {8, 6, 9, 0};
+static const struct PartyPopupMenu sUnknown_0839F584 = {3, 9, sUnknown_39F580};
+
+static const struct PokeMenuFieldMoveFunc sFieldMoveFuncs[] =
+{
+ {SetUpFieldMove_Cut, 0x6},
+ {SetUpFieldMove_Flash, 0x9},
+ {SetUpFieldMove_RockSmash, 0x9},
+ {SetUpFieldMove_Strength, 0x9},
+ {SetUpFieldMove_Surf, 0x7},
+ {SetUpFieldMove_Fly, 0x9},
+ {SetUpFieldMove_Dive, 0x9},
+ {SetUpFieldMove_Waterfall, 0x9},
+ {SetUpFieldMove_Teleport, 0x9},
+ {SetUpFieldMove_Dig, 0x9},
+ {SetUpFieldMove_SecretPower, 0x9},
+ {SetUpFieldMove_SoftBoiled, 0x10},
+ {SetUpFieldMove_SoftBoiled, 0x10},
+ {SetUpFieldMove_SweetScent, 0x9},
+};
+
+void sub_8089A70(void)
+{
+ gPaletteFade.bufferTransferDisabled = 1;
+ OpenPartyMenu(PARTY_MENU_TYPE_STANDARD, 0);
+}
+
+static void sub_8089A8C(void)
+{
+ sPokeMenuOptionsNo = 0;
+ // if checking pokemon is an egg, we can't give it an item and it doesn't know any move
+ if (GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_IS_EGG))
+ {
+ AppendToList(sPokeMenuOptionsOrder, &sPokeMenuOptionsNo, POKEMENU_SUMMARY);
+ AppendToList(sPokeMenuOptionsOrder, &sPokeMenuOptionsNo, POKEMENU_SWITCH);
+ AppendToList(sPokeMenuOptionsOrder, &sPokeMenuOptionsNo, POKEMENU_CANCEL);
+ }
+ else
+ {
+ u16 moveID, tableID;
+ for (moveID = 0; moveID < 4; moveID++) // 4, max number of possible field moves
+ {
+ for (tableID = 0; sPokeMenuFieldMoves[tableID] != sFieldMovesTerminator; tableID++)
+ {
+ if (GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_MOVE1 + moveID) == sPokeMenuFieldMoves[tableID])
+ {
+ u8 fieldID = tableID + POKEMENU_FIRST_FIELD_MOVE_ID;
+ AppendToList(sPokeMenuOptionsOrder, &sPokeMenuOptionsNo, fieldID);
+ break;
+ }
+ }
+ }
+ AppendToList(sPokeMenuOptionsOrder, &sPokeMenuOptionsNo, POKEMENU_SUMMARY);
+
+ // can't switch a pokemon if it's the only one in the party
+ if (GetMonData(&gPlayerParty[1], MON_DATA_SPECIES) != 0)
+ AppendToList(sPokeMenuOptionsOrder, &sPokeMenuOptionsNo, POKEMENU_SWITCH);
+
+ if (ItemIsMail(GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_HELD_ITEM)))
+ AppendToList(sPokeMenuOptionsOrder, &sPokeMenuOptionsNo, POKEMENU_MAIL);
+ else
+ AppendToList(sPokeMenuOptionsOrder, &sPokeMenuOptionsNo, POKEMENU_ITEM);
+
+ AppendToList(sPokeMenuOptionsOrder, &sPokeMenuOptionsNo, POKEMENU_CANCEL);
+ }
+}
+
+static void sub_8089BDC(u8 arg0, u8 arg1, u8 arg2, u8 noOfOptions, const struct MenuAction2 *menuActions, const u8 *order, u8 arg6)
+{
+ PrintPartyMenuPromptText(5, arg6);
+ MenuDrawTextWindow(arg0, arg1, arg0 + arg2, (noOfOptions * 2) + arg1 + 1);
+ PrintMenuItemsReordered(arg0 + 1, arg1 + 1, noOfOptions, menuActions, order);
+}
+
+void sub_8089C50(u8 arg0, u8 arg1, u8 arg2, u8 noOfOptions, const struct MenuAction2 *menuActions, const u8 *order)
+{
+ sub_8089BDC(arg0, arg1, arg2, noOfOptions, menuActions, order, 1);
+}
+
+static void sub_8089C7C(u8 arg0)
+{
+ u32 r4 = (u8)(18 - (sPokeMenuOptionsNo << 1));
+
+ sub_8089BDC(19, r4, 10, sPokeMenuOptionsNo, sPokemonMenuActions, sPokeMenuOptionsOrder, 3);
+ r4 |= 1;
+ InitMenu(0, 20, r4, sPokeMenuOptionsNo, arg0, 9);
+}
+
+void HandleDefaultPartyMenu(u8 taskID)
+{
+ if (!gPaletteFade.active)
+ {
+ switch (HandleDefaultPartyMenuInput(taskID))
+ {
+ case A_BUTTON:
+ PlaySE(SE_SELECT);
+ gLastFieldPokeMenuOpened = sub_806CA38(taskID);
+ GetMonNickname(&gPlayerParty[gLastFieldPokeMenuOpened], gStringVar1);
+ sub_8089A8C();
+ sPokeMenuCursorPos = 0;
+ sub_8089C7C(0);
+ gTasks[taskID].func = sub_8089D94;
+ sub_808B5B4(taskID);
+ break;
+ case B_BUTTON:
+ PlaySE(SE_SELECT);
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ gTasks[taskID].func = sub_8089E4C;
+ break;
+ }
+ }
+}
+
+static void sub_8089D94(u8 taskID)
+{
+ if (!gPaletteFade.active)
+ {
+ if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP)
+ {
+ PlaySE(SE_SELECT);
+ sPokeMenuCursorPos = MoveMenuCursor(-1);
+ sub_808B5B4(taskID);
+ }
+ else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN)
+ {
+ PlaySE(SE_SELECT);
+ sPokeMenuCursorPos = MoveMenuCursor(1);
+ sub_808B5B4(taskID);
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sPokemonMenuActions[sPokeMenuOptionsOrder[sPokeMenuCursorPos]].func(taskID);
+ sub_808B5B4(taskID);
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PokemonMenu_Cancel(taskID);
+ sub_808B5B4(taskID);
+ }
+ }
+}
+
+static void sub_8089E4C(u8 taskID)
+{
+ if (!gPaletteFade.active)
+ {
+ gLastFieldPokeMenuOpened = 0;
+ SetMainCallback2(sub_805469C);
+ DestroyTask(taskID);
+ }
+}
+
+static void sub_8089E84(void)
+{
+ GetMonNickname(&gPlayerParty[gLastFieldPokeMenuOpened], gStringVar1);
+ sub_8089A8C();
+ sPokeMenuCursorPos = 0;
+ sub_8089C7C(0);
+}
+
+static void sub_8089EBC(void)
+{
+ do
+ {
+ if (InitPartyMenu() == TRUE)
+ {
+ sub_806C994(EWRAM_1B000.menuHandlerTaskId, gUnknown_020384F0);
+ ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0);
+ gLastFieldPokeMenuOpened = gUnknown_020384F0;
+ sub_8089E84();
+ SetMainCallback2(CB2_PartyMenuMain);
+ break;
+ }
+ } while (sub_80F9344() != TRUE);
+}
+
+static void sub_8089F14(void)
+{
+ gPaletteFade.bufferTransferDisabled = 1;
+ SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0xFF, sub_8089D94, 5);
+ SetMainCallback2(sub_8089EBC);
+}
+
+static void sub_8089F44(u8 taskID)
+{
+ if (!gPaletteFade.active)
+ {
+ u8 spriteID = gSprites[gTasks[taskID].data[3] >> 8].data[0];
+ DestroyTask(taskID);
+ ewram1B000_alt.unk262 = 1;
+ ShowPokemonSummaryScreen(gPlayerParty, spriteID, gPlayerPartyCount - 1, sub_8089F14, PSS_MODE_NORMAL);
+ }
+}
+
+static void PokemonMenu_Summary(u8 taskID)
+{
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ gTasks[taskID].func = sub_8089F44;
+}
+
+void DoPokemonMenu_Switch(u8 taskID)
+{
+ SetTaskFuncWithFollowupFunc(taskID, SetupDefaultPartyMenuSwitchPokemon, HandleDefaultPartyMenu);
+ MenuZeroFillWindowRect(19, 0, 29, 19);
+}
+
+static void PokemonMenu_Switch(u8 taskID)
+{
+ HandleDestroyMenuCursors();
+ ewram01000.unkC = sub_806CD5C;
+ ewram01000.array[53553] = 1;
+ DoPokemonMenu_Switch(taskID);
+}
+
+static void sub_808A060(u8 taskID)
+{
+ if (gMain.newKeys == DPAD_UP && sPokeMenuCursorPos != 0)
+ {
+ sPokeMenuCursorPos = MoveMenuCursor(-1);
+ PlaySE(SE_SELECT);
+ }
+ if (gMain.newKeys == DPAD_DOWN && sPokeMenuCursorPos != 2)
+ {
+ sPokeMenuCursorPos = MoveMenuCursor(1);
+ PlaySE(SE_SELECT);
+ }
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ PartyMenuGetPopupMenuFunc(0, &sUnknown_0839F578, sPokemonMenuActions, sPokeMenuCursorPos)(taskID);
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ ClosePartyPopupMenu(0, &sUnknown_0839F578);
+ PokemonMenu_CancelSubmenu(taskID);
+ }
+}
+
+static void sub_808A100(u8 taskID)
+{
+ ShowPartyPopupMenu(0, &sUnknown_0839F578, (void*)(sPokemonMenuActions), 0);
+ PrintPartyMenuPromptText(0xD, 2);
+ gTasks[taskID].func = sub_808A060;
+}
+
+static void PokemonMenu_Item(u8 taskID)
+{
+ HandleDestroyMenuCursors();
+ sPokeMenuCursorPos = 0;
+ MenuZeroFillWindowRect(19, 0, 29, 19);
+ gTasks[taskID].func = sub_808A100;
+}
+
+static void sub_808A180(u8 taskID)
+{
+ if (!gPaletteFade.active)
+ {
+ u8 mailID = GetMonData(&gPlayerParty[sub_806CA38(taskID)], MON_DATA_MAIL);
+ DestroyTask(taskID);
+ sub_80E62A0(4, gSaveBlock1.mail[mailID].words, sub_808A520, 3);
+ }
+}
+
+static void sub_808A1E0(u8 taskID)
+{
+ if (gUnknown_0202E8F6 != 1)
+ {
+ SetHeldItemIconVisibility(taskID, sub_806CA38(taskID));
+ PrintPartyMenuPromptText(0, 0);
+ gTasks[taskID].func = HandleDefaultPartyMenu;
+ }
+}
+
+static void sub_808A228(u8 taskID)
+{
+ if (ItemIsMail(gSpecialVar_ItemId) && gUnknown_0202E8F4 != 0)
+ {
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ gTasks[taskID].func = sub_808A180;
+ }
+ else
+ {
+ MenuZeroFillWindowRect(0, 0, 29, 19);
+ PrintPartyMenuPromptText(0, 0);
+ gTasks[taskID].func = HandleDefaultPartyMenu;
+ }
+}
+
+static void sub_808A2AC(u8 taskID)
+{
+ if (!gPaletteFade.active)
+ PartyMenuTryGiveMonHeldItem(taskID, gSpecialVar_ItemId, sub_808A228);
+}
+
+static void sub_808A2DC(u8 taskID)
+{
+ u8 mailID = GetMonData(&gPlayerParty[sub_806CA38(taskID)], MON_DATA_MAIL);
+ DestroyTask(taskID);
+ sub_80E62A0(4, gSaveBlock1.mail[mailID].words, sub_808A520, 3);
+}
+
+static void sub_808A330(u8 taskID)
+{
+ PartyMenuTryGiveMonHeldItem(taskID, gSpecialVar_ItemId, sub_808A2DC);
+}
+
+static void sub_808A34C(void)
+{
+ RunTasks();
+}
+
+static void sub_808A358(void)
+{
+ while (1)
+ {
+ if (InitPartyMenu() == TRUE)
+ {
+ sub_806C994(EWRAM_1B000.menuHandlerTaskId, gLastFieldPokeMenuOpened);
+ ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0);
+ SetMainCallback2(CB2_PartyMenuMain);
+ break;
+ }
+ if (sub_80F9344() == TRUE)
+ break;
+ }
+}
+
+static void sub_808A3A4(void)
+{
+ while (1)
+ {
+ if (InitPartyMenu() == TRUE)
+ {
+ sub_806C994(EWRAM_1B000.menuHandlerTaskId, gLastFieldPokeMenuOpened);
+ ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0);
+ EWRAM_1B000.unk262 = 3;
+ sub_8089E84();
+ SetMainCallback2(CB2_PartyMenuMain);
+ break;
+ }
+ if (sub_80F9344() == TRUE)
+ break;
+ }
+}
+
+void sub_808A3F8(void)
+{
+ if (ItemIsMail(gSpecialVar_ItemId))
+ {
+ u8 taskID = CreateTask(sub_808A330, 0);
+ gPaletteFade.bufferTransferDisabled = 1;
+ sub_806BD58(taskID, 0);
+ sub_806C994(taskID, gLastFieldPokeMenuOpened);
+ ChangePartyMenuSelection(taskID, 0);
+ if (!(bool8)(GetMonData(&gPlayerParty[sub_806CA38(taskID)], MON_DATA_HELD_ITEM)))
+ {
+ SetMainCallback2(sub_808A34C);
+ return;
+ }
+ else
+ DestroyTask(taskID);
+ }
+ gPaletteFade.bufferTransferDisabled = 1;
+ if (gSpecialVar_ItemId)
+ {
+ SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0xFF, sub_808A2AC, 0xFF);
+ SetMainCallback2(sub_808A358);
+ }
+ else
+ {
+ SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0xFF, sub_8089D94, 5);
+ SetMainCallback2(sub_808A3A4);
+ }
+}
+
+static void sub_808A4D4(void)
+{
+ while (1)
+ {
+ if (InitPartyMenu() == TRUE)
+ {
+ sub_806C994(EWRAM_1B000.menuHandlerTaskId, gLastFieldPokeMenuOpened);
+ ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0);
+ SetMainCallback2(CB2_PartyMenuMain);
+ break;
+ }
+ if (sub_80F9344() == TRUE)
+ break;
+ }
+}
+
+void sub_808A520(void)
+{
+ gPaletteFade.bufferTransferDisabled = 1;
+ if (gSpecialVar_Result == 0)
+ {
+ if (gUnknown_0202E8F8)
+ RemoveBagItem(gUnknown_0202E8F8, 1);
+ AddBagItem(GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_HELD_ITEM), 1);
+ TakeMailFromMon(&gPlayerParty[gLastFieldPokeMenuOpened]);
+ SetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_HELD_ITEM, (void*) &gUnknown_0202E8F8);
+ SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0xFF, HandleDefaultPartyMenu, 0);
+ }
+ else
+ SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0xFF, sub_808A5BC, 0xFF);
+ SetMainCallback2(sub_808A4D4);
+}
+
+static void sub_808A5BC(u8 taskID)
+{
+ if (!gPaletteFade.active)
+ {
+ DisplayGiveHeldItemMessage(gLastFieldPokeMenuOpened, gSpecialVar_ItemId, 0);
+ gTasks[taskID].func = sub_808A1E0;
+ }
+}
+
+static void sub_808A604(u8 taskID)
+{
+ if (!gPaletteFade.active)
+ {
+ SetMainCallback2(sub_80A61D0);
+ DestroyTask(taskID);
+ }
+}
+
+static void PokemonMenu_GiveItem(u8 taskID)
+{
+ gUnknown_0202E8F5 = sub_806CA38(taskID);
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ gTasks[taskID].func = sub_808A604;
+}
+
+static void sub_808A678(u8 taskID)
+{
+ sub_808A8D4(taskID);
+}
+
+static void PokemonMenu_TakeItem(u8 taskID)
+{
+ HandleDestroyMenuCursors();
+ MenuZeroFillWindowRect(19, 0, 29, 19);
+ sub_806D5A4();
+ PartyMenuTryGiveMonHeldItem_806ECE8(taskID, sub_808A678);
+}
+
+static void PokemonMenu_TakeMail(u8 taskID)
+{
+ HandleDestroyMenuCursors();
+ MenuZeroFillWindowRect(19, 0, 29, 19);
+ sub_806D5A4();
+ DoTakeMail(taskID, sub_808A678);
+}
+
+static void PokemonMenu_Mail(u8 taskID)
+{
+ HandleDestroyMenuCursors();
+ sPokeMenuCursorPos = 0;
+ MenuZeroFillWindowRect(19, 0, 29, 19);
+ ShowPartyPopupMenu(0, &sUnknown_0839F584, (void*) sPokemonMenuActions, 0);
+ gTasks[taskID].func = sub_808A73C;
+}
+
+static void sub_808A73C(u8 taskID)
+{
+ if (gMain.newAndRepeatedKeys == DPAD_UP)
+ {
+ PlaySE(SE_SELECT);
+ if (sPokeMenuCursorPos == 0)
+ sPokeMenuCursorPos = MoveMenuCursor(sUnknown_0839F584.numChoices - 1);
+ else
+ sPokeMenuCursorPos = MoveMenuCursor(-1);
+ }
+ if (gMain.newAndRepeatedKeys == DPAD_DOWN)
+ {
+ PlaySE(SE_SELECT);
+ 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, sPokemonMenuActions, sPokeMenuCursorPos)(taskID);
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ ClosePartyPopupMenu(0, &sUnknown_0839F584);
+ PokemonMenu_Cancel(taskID);
+ }
+}
+
+static void PokemonMenu_ReadMail(u8 taskID)
+{
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ gTasks[taskID].func = sub_808A848;
+}
+
+static void sub_808A848(u8 taskID)
+{
+ if (!gPaletteFade.active)
+ {
+ u8 mailID = GetMonData(&gPlayerParty[sub_806CA38(taskID)], MON_DATA_MAIL);
+ DestroyTask(taskID);
+ HandleReadMail(&gSaveBlock1.mail[mailID], sub_808A8A8, 1);
+ }
+}
+
+static void sub_808A8A8(void)
+{
+ gUnknown_020384F0 = gLastFieldPokeMenuOpened;
+ ewram1B000.unk262 = 4;
+ sub_8089F14();
+}
+
+static void sub_808A8D4(u8 taskID)
+{
+ sPokeMenuCursorPos = 0;
+ MenuZeroFillWindowRect(19, 0, 29, 19);
+ PrintPartyMenuPromptText(0, 0);
+ gTasks[taskID].func = HandleDefaultPartyMenu;
+}
+
+static void PokemonMenu_Cancel(u8 taskID)
+{
+ HandleDestroyMenuCursors();
+ PlaySE(SE_SELECT);
+ sub_808A8D4(taskID);
+}
+
+static void PokemonMenu_CancelSubmenu(u8 taskID)
+{
+ HandleDestroyMenuCursors();
+ PlaySE(SE_SELECT);
+ MenuZeroFillWindowRect(19, 0, 29, 19);
+ sub_806D5A4();
+ sub_8089C7C(sPokeMenuCursorPos);
+ gTasks[taskID].func = sub_8089D94;
+}
+
+#define IS_SOFTBOILED_MILKDRINK(ID)((ID == (POKEMENU_MILK_DRINK - POKEMENU_FIRST_FIELD_MOVE_ID) || ID == (POKEMENU_SOFT_BOILED - POKEMENU_FIRST_FIELD_MOVE_ID)))
+#define IS_SURF(ID)((ID == (POKEMENU_SURF - POKEMENU_FIRST_FIELD_MOVE_ID)))
+#define IS_FLY(ID)((ID == (POKEMENU_FLY - POKEMENU_FIRST_FIELD_MOVE_ID)))
+
+#define tFieldMoveId data[11]
+
+static void PokemonMenu_FieldMove(u8 taskID)
+{
+ s16* data = gTasks[taskID].data;
+
+ HandleDestroyMenuCursors();
+ tFieldMoveId = sPokeMenuOptionsOrder[sPokeMenuCursorPos] - POKEMENU_FIRST_FIELD_MOVE_ID;
+ if (sub_80F9344() == TRUE)
+ {
+ MenuZeroFillWindowRect(19, 0, 29, 19);
+ if (IS_SOFTBOILED_MILKDRINK(tFieldMoveId))
+ PrintPartyMenuPromptText(9, 0);
+ else
+ PrintPartyMenuPromptText(sFieldMoveFuncs[tFieldMoveId].field_1, 0);
+ gTasks[taskID].func = sub_808ABF4;
+ }
+ else if (tFieldMoveId <= 7 && FlagGet(FLAG_BADGE01_GET + tFieldMoveId) != TRUE)
+ {
+ // can't use a field HM move without a proper badge
+ MenuZeroFillWindowRect(19, 0, 29, 19);
+ sub_806D5A4();
+ sub_806E834(gOtherText_CantBeUsedBadge, 1);
+ gTasks[taskID].func = sub_808AAF0;
+ }
+ else
+ {
+ if (sFieldMoveFuncs[tFieldMoveId].func() == TRUE)
+ {
+ sPokeMenuCursorPos = 0;
+ if (!IS_SOFTBOILED_MILKDRINK(tFieldMoveId))
+ {
+ gTasks[taskID].func = sub_808AB34;
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ }
+ else
+ sub_8133D28(taskID);
+ }
+ else
+ {
+ MenuZeroFillWindowRect(19, 0, 29, 19);
+ if (IS_SURF(tFieldMoveId) && TestPlayerAvatarFlags(8))
+ PrintPartyMenuPromptText(8, 0);
+ else
+ PrintPartyMenuPromptText(sFieldMoveFuncs[tFieldMoveId].field_1, 0);
+ gTasks[taskID].func = sub_808ABF4;
+ }
+ }
+}
+
+static void sub_808AAF0(u8 taskID)
+{
+ if (gUnknown_0202E8F6 != 1 && (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON))
+ {
+ MenuZeroFillWindowRect(0, 14, 29, 19);
+ PokemonMenu_Cancel(taskID);
+ }
+}
+
+static void sub_808AB34(u8 taskID)
+{
+ if (!gPaletteFade.active)
+ {
+ if (!IS_FLY(gTasks[taskID].tFieldMoveId) || ShouldDoBrailleFlyEffect())
+ SetMainCallback2(c2_exit_to_overworld_2_switch);
+ else
+ SetMainCallback2(CB2_InitFlyRegionMap);
+ DestroyTask(taskID);
+ }
+}
+
+#undef tFieldMoveId
+
+void FieldCallback_Teleport(void)
+{
+ pal_fill_black();
+ CreateTask(sub_808ABA8, 8);
+}
+
+static void sub_808ABA8(u8 taskID)
+{
+ if (sub_807D770() == TRUE)
+ {
+ gFieldEffectArguments[0] = GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_SPECIES);
+ gUnknown_03005CE4();
+ DestroyTask(taskID);
+ }
+}
+
+static void sub_808ABF4(u8 taskID)
+{
+ if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON)
+ {
+ MenuZeroFillWindowRect(1, 17, 28, 18);
+ PokemonMenu_Cancel(taskID);
+ }
+}
+
+static void sub_808AC2C(void)
+{
+ gFieldEffectArguments[0] = gLastFieldPokeMenuOpened;
+ FieldEffectStart(FLDEFF_USE_SURF);
+}
+
+static bool8 SetUpFieldMove_Surf(void)
+{
+ if (PartyHasMonWithSurf() == TRUE && IsPlayerFacingSurfableFishableWater() == TRUE)
+ {
+ gFieldCallback = FieldCallback_Teleport;
+ gUnknown_03005CE4 = sub_808AC2C;
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
+static void sub_808AC8C(void)
+{
+ gFieldEffectArguments[0] = gLastFieldPokeMenuOpened;
+ FieldEffectStart(FLDEFF_USE_FLY);
+}
+
+static bool8 SetUpFieldMove_Fly(void)
+{
+ if (ShouldDoBrailleFlyEffect())
+ {
+ gFieldCallback = FieldCallback_Teleport;
+ gUnknown_03005CE4 = DoBrailleFlyEffect;
+ return TRUE;
+ }
+ if (Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType) == TRUE)
+ {
+ gFieldCallback = FieldCallback_Teleport;
+ gUnknown_03005CE4 = sub_808AC8C;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void sub_808AD0C(void)
+{
+ while (1)
+ {
+ if (InitPartyMenu() == TRUE)
+ {
+ sub_806C994(EWRAM_1B000.menuHandlerTaskId, gLastFieldPokeMenuOpened);
+ ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0);
+ SetMainCallback2(CB2_PartyMenuMain);
+ break;
+ }
+ if (sub_80F9344() == TRUE)
+ break;
+ }
+}
+
+void sub_808AD58(void)
+{
+ gPaletteFade.bufferTransferDisabled = 1;
+ SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0xFF, HandleDefaultPartyMenu, 0);
+ SetMainCallback2(sub_808AD0C);
+}
+
+u16 unref_sub_808AD88(void)
+{
+ return GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_SPECIES);
+}
+
+static void sub_808ADAC(void)
+{
+ gFieldEffectArguments[0] = gLastFieldPokeMenuOpened;
+ FieldEffectStart(FLDEFF_USE_DIVE);
+}
+
+static bool8 SetUpFieldMove_Dive(void)
+{
+ gFieldEffectArguments[1] = sub_8068F18();
+ if (gFieldEffectArguments[1])
+ {
+ gFieldCallback = FieldCallback_Teleport;
+ gUnknown_03005CE4 = sub_808ADAC;
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
+static void sub_808AE08(void)
+{
+ gFieldEffectArguments[0] = gLastFieldPokeMenuOpened;
+ FieldEffectStart(FLDEFF_USE_WATERFALL);
+}
+
+static bool8 SetUpFieldMove_Waterfall(void)
+{
+ s16 x, y;
+ GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
+ if (MetatileBehavior_IsWaterfall(MapGridGetMetatileBehaviorAt(x, y)) == TRUE
+ && IsPlayerSurfingNorth() == TRUE)
+ {
+ gFieldCallback = FieldCallback_Teleport;
+ gUnknown_03005CE4 = sub_808AE08;
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
+static void sub_808AE8C(void)
+{
+ u8 i;
+ u8 arg = gSpecialVar_ItemId - 33;
+ for (i = 0; i < 6; i++)
+ {
+ if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES))
+ {
+ sub_806D668(i);
+ if (GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) || !CanMonLearnTMHM(&gPlayerParty[i], arg))
+ sub_806BC3C(i, 0x9A);
+ else if (pokemon_has_move(&gPlayerParty[i], ItemIdToBattleMoveId(gSpecialVar_ItemId)))
+ sub_806BC3C(i, 0xA8);
+ else
+ sub_806BC3C(i, 0x8C);
+ }
+ }
+}
+
+static void sub_808AF20(void)
+{
+ u8 i;
+ for (i = 0; i < 6; i++)
+ {
+ if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES))
+ {
+ if (GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) || !GetEvolutionTargetSpecies(&gPlayerParty[i], 3, gSpecialVar_ItemId))
+ {
+ sub_806D668(i);
+ sub_806BC3C(i, 0);
+ }
+ }
+ }
+}
+
+static void sub_808AF80(void)
+{
+ while (1)
+ {
+ if (InitPartyMenu() == TRUE)
+ {
+ if (gUnknown_02038561 == 0)
+ {
+ switch (CheckIfItemIsTMHMOrEvolutionStone(gSpecialVar_ItemId))
+ {
+ case 1:
+ sub_808AE8C();
+ break;
+ case 2:
+ sub_808AF20();
+ break;
+ }
+ }
+ if (gLastFieldPokeMenuOpened > 5 || !GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_SPECIES))
+ gLastFieldPokeMenuOpened = 0;
+ sub_806C994(ewram1B000.menuHandlerTaskId, gLastFieldPokeMenuOpened);
+ ChangePartyMenuSelection(ewram1B000.menuHandlerTaskId, 0);
+ SetMainCallback2(CB2_PartyMenuMain);
+ break;
+ }
+ if (sub_80F9344() == TRUE)
+ break;
+ }
+}
+
+void sub_808B020(void)
+{
+ gPaletteFade.bufferTransferDisabled = 1;
+ switch (gUnknown_02038561)
+ {
+ case 0:
+ if (CheckIfItemIsTMHMOrEvolutionStone(gSpecialVar_ItemId) == 1)
+ SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0, sub_808B0C0, 20);
+ else
+ SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0, sub_808B0C0, 3);
+ break;
+ case 4:
+ SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0, sub_808B1EC, 0xFF);
+ break;
+ case 1:
+ case 3:
+ SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0, sub_808B0C0, 4);
+ break;
+ }
+ SetMainCallback2(sub_808AF80);
+}
+
+void sub_808B0C0(u8 taskID)
+{
+ if (!gPaletteFade.active)
+ {
+ switch (HandleDefaultPartyMenuInput(taskID))
+ {
+ case A_BUTTON:
+ gLastFieldPokeMenuOpened = sub_806CA38(taskID);
+ if (GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_IS_EGG))
+ PlaySE(SE_HAZURE);
+ else
+ {
+ sub_806D5A4();
+ if (gUnknown_02038561 == 0)
+ gUnknown_03004AE4(taskID, gSpecialVar_ItemId, sub_808B224);
+ if (gUnknown_02038561 == 1)
+ {
+ PlaySE(SE_SELECT);
+ PartyMenuTryGiveMonHeldItem(taskID, gSpecialVar_ItemId, sub_808B2EC);
+ }
+ if (gUnknown_02038561 == 3)
+ {
+ PlaySE(SE_SELECT);
+ PartyMenuTryGiveMonMail(taskID, sub_808B2B4);
+ }
+ }
+ break;
+ case B_BUTTON:
+ gLastFieldPokeMenuOpened = sub_806CA38(taskID);
+ PlaySE(SE_SELECT);
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ if (gUnknown_02038561 == 0 || gUnknown_02038561 == 1)
+ gTasks[taskID].func = sub_808B25C;
+ if (gUnknown_02038561 == 3)
+ gTasks[taskID].func = sub_808B2B4;
+ break;
+ }
+ }
+}
+
+static void sub_808B1EC(u8 taskID)
+{
+ if (!gPaletteFade.active)
+ gUnknown_03004AE4(taskID, gSpecialVar_ItemId, sub_808B224);
+}
+
+static void sub_808B224(u8 taskID)
+{
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ gTasks[taskID].func = sub_808B25C;
+}
+
+static void sub_808B25C(u8 taskID)
+{
+ if (!gPaletteFade.active)
+ {
+ SetMainCallback2(sub_80A5B40);
+ DestroyTask(taskID);
+ }
+}
+
+static void sub_808B288(u8 taskID)
+{
+ if (!gPaletteFade.active)
+ {
+ SetMainCallback2(Mailbox_ReturnToMailListAfterDeposit);
+ DestroyTask(taskID);
+ }
+}
+
+static void sub_808B2B4(u8 taskID)
+{
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ gTasks[taskID].func = sub_808B288;
+}
+
+static void sub_808B2EC(u8 taskID)
+{
+ if (gUnknown_0202E8F4 == 2)
+ {
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ gTasks[taskID].func = sub_808B338;
+ }
+ else
+ sub_808B224(taskID);
+}
+
+static void sub_808B338(u8 taskID)
+{
+ if (!gPaletteFade.active)
+ {
+ u8 mailID;
+
+ gLastFieldPokeMenuOpened = sub_806CA38(taskID);
+ mailID = GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_MAIL);
+ DestroyTask(taskID);
+ sub_80E62A0(4, gSaveBlock1.mail[mailID].words, sub_808B3EC, 3);
+ }
+}
+
+static void sub_808B3A0(void)
+{
+ while (1)
+ {
+ if (InitPartyMenu() == TRUE)
+ {
+ sub_806C994(EWRAM_1B000.menuHandlerTaskId, gLastFieldPokeMenuOpened);
+ ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0);
+ SetMainCallback2(CB2_PartyMenuMain);
+ break;
+ }
+ if (sub_80F9344() == TRUE)
+ break;
+ }
+}
+
+static void sub_808B3EC(void)
+{
+ IntrCallback callback;
+
+ gPaletteFade.bufferTransferDisabled = 1;
+ if (gSpecialVar_Result == 0)
+ {
+ if (gUnknown_0202E8F8)
+ RemoveBagItem(gUnknown_0202E8F8, 1);
+ AddBagItem(GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_HELD_ITEM), 1);
+ TakeMailFromMon(&gPlayerParty[gLastFieldPokeMenuOpened]);
+ SetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_HELD_ITEM, (void*) &gUnknown_0202E8F8);
+ CreateTask(sub_808B25C, 5);
+ gPaletteFade.bufferTransferDisabled = 0;
+ callback = CB2_PartyMenuMain;
+ }
+ else
+ {
+ SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0, sub_808B4A4, 0xFF);
+ callback = sub_808B3A0;
+ }
+ SetMainCallback2(callback);
+}
+
+static void sub_808B4A4(u8 taskID)
+{
+ if (!gPaletteFade.active)
+ {
+ DisplayGiveHeldItemMessage(gLastFieldPokeMenuOpened, gSpecialVar_ItemId, 1);
+ gTasks[taskID].func = sub_808B4EC;
+ }
+}
+
+static void sub_808B4EC(u8 taskID)
+{
+ if (gUnknown_0202E8F6 != 1)
+ sub_808B224(taskID);
+}
+
+void sub_808B508(u8 taskID)
+{
+ sub_808B224(taskID);
+}
+
+static void sub_808B518(void)
+{
+ while (1)
+ {
+ if (InitPartyMenu() == TRUE)
+ {
+ sub_806C994(EWRAM_1B000.menuHandlerTaskId, gUnknown_020384F0);
+ ChangePartyMenuSelection(EWRAM_1B000.menuHandlerTaskId, 0);
+ SetMainCallback2(CB2_PartyMenuMain);
+ break;
+ }
+ if (sub_80F9344() == TRUE)
+ break;
+ }
+}
+
+void sub_808B564(void)
+{
+ gPaletteFade.bufferTransferDisabled = 1;
+ if (sub_809FA30() != 4)
+ SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0, TaughtMove, 0xFF);
+ else
+ SetPartyMenuSettings(PARTY_MENU_TYPE_STANDARD, 0, StopTryingToTeachMove_806F588, 0xFF);
+ SetMainCallback2(sub_808B518);
+}
+
+void sub_808B5B4(u32 taskID)
+{
+ gUnknown_03005CF0 = gTasks[taskID].func;
+ gTasks[taskID].func = sub_808B5E4;
+ sub_808B5E4(taskID);
+}
+
+static void sub_808B5E4(u8 taskID)
+{
+ if (sub_8055870() != TRUE)
+ gTasks[taskID].func = gUnknown_03005CF0;
+}
diff --git a/src/pokemon_size_record.c b/src/pokemon/pokemon_size_record.c
index f2222bd3b..f92a95bfb 100644
--- a/src/pokemon_size_record.c
+++ b/src/pokemon/pokemon_size_record.c
@@ -3,7 +3,7 @@
#include "data2.h"
#include "event_data.h"
#include "pokedex.h"
-#include "species.h"
+#include "constants/species.h"
#include "string_util.h"
#include "strings2.h"
#include "text.h"
@@ -15,7 +15,7 @@ struct UnknownStruct
u16 unk4;
};
-extern u16 gScriptResult;
+extern u16 gSpecialVar_Result;
static const struct UnknownStruct sBigMonSizeTable[] =
{
@@ -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);
@@ -104,13 +104,13 @@ static void FormatMonSizeRecord(u8 *string, u32 size)
static u8 CompareMonSize(u16 species, u16 *sizeRecord)
{
- if (gScriptResult == 0xFF)
+ if (gSpecialVar_Result == 0xFF)
{
return 0;
}
else
{
- struct Pokemon *pkmn = &gPlayerParty[gScriptResult];
+ struct Pokemon *pkmn = &gPlayerParty[gSpecialVar_Result];
// UB: Too few arguments for function 'GetMonData'
if (GetMonData(pkmn, MON_DATA_IS_EGG) == TRUE || GetMonData(pkmn, MON_DATA_SPECIES) != species)
@@ -169,7 +169,7 @@ void CompareShroomishSize(void)
{
u16 *sizeRecord = GetVarPointer(VAR_SHROOMISH_SIZE_RECORD);
- gScriptResult = CompareMonSize(SPECIES_SHROOMISH, sizeRecord);
+ gSpecialVar_Result = CompareMonSize(SPECIES_SHROOMISH, sizeRecord);
}
void InitBarboachSizeRecord(void)
@@ -188,7 +188,7 @@ void CompareBarboachSize(void)
{
u16 *sizeRecord = GetVarPointer(VAR_BARBOACH_SIZE_RECORD);
- gScriptResult = CompareMonSize(SPECIES_BARBOACH, sizeRecord);
+ gSpecialVar_Result = CompareMonSize(SPECIES_BARBOACH, sizeRecord);
}
void GiveGiftRibbonToParty(u8 index, u8 ribbonId)
@@ -212,6 +212,6 @@ void GiveGiftRibbonToParty(u8 index, u8 ribbonId)
}
}
if (gotRibbon)
- FlagSet(SYS_RIBBON_GET);
+ FlagSet(FLAG_SYS_RIBBON_GET);
}
}
diff --git a/src/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c
index 5e97523e2..4a68b846a 100644
--- a/src/pokemon_storage_system.c
+++ b/src/pokemon/pokemon_storage_system.c
@@ -2,6 +2,7 @@
#include "pokemon_storage_system.h"
#include "menu.h"
#include "string_util.h"
+#include "ewram.h"
struct StorageAction {
u8 *text;
@@ -10,15 +11,8 @@ struct StorageAction {
extern const struct StorageAction gUnknown_083B6DF4[];
-extern const u8 unk_2000000[];
-
EWRAM_DATA struct PokemonStorage gPokemonStorage = {0};
-#define gUnk2002694 (u8 *)(&unk_2000000[0x2694])
-#define gUnk20026A6 (u8 *)(&unk_2000000[0x26a6])
-#define gUnk20011fa (u8 *)(&unk_2000000[0x11fa])
-#define gUnk20026e4 (u8 *)(&unk_2000000[0x26e4])
-
void sub_8098898(u8 index) {
u8 *ptr;
diff --git a/src/pokemon/pokemon_summary_screen.c b/src/pokemon/pokemon_summary_screen.c
new file mode 100644
index 000000000..9563bc08f
--- /dev/null
+++ b/src/pokemon/pokemon_summary_screen.c
@@ -0,0 +1,5351 @@
+#include "global.h"
+#include "constants/items.h"
+#include "constants/songs.h"
+#include "constants/species.h"
+#include "battle.h"
+#include "contest.h"
+#include "data2.h"
+#include "decompress.h"
+#include "event_data.h"
+#include "ewram.h"
+#include "item.h"
+#include "learn_move.h"
+#include "link.h"
+#include "m4a.h"
+#include "main.h"
+#include "menu.h"
+#include "menu_helpers.h"
+#include "overworld.h"
+#include "palette.h"
+#include "party_menu.h"
+#include "pokeball.h"
+#include "pokemon.h"
+#include "pokemon_summary_screen.h"
+#include "region_map.h"
+#include "sound.h"
+#include "sprite.h"
+#include "string_util.h"
+#include "strings.h"
+#include "strings2.h"
+#include "task.h"
+#include "tv.h"
+#include "unknown_task.h"
+
+static void sub_809FC0C(void);
+static void sub_809FEB8(void);
+static void sub_809F63C(struct Pokemon *);
+static void sub_809F650(struct Pokemon *);
+static void sub_809F664(struct Pokemon *);
+static void sub_809FE6C(struct Pokemon *);
+static void sub_80A0090(struct Pokemon *);
+static void sub_80A015C(struct Pokemon *);
+static void sub_809DE44(void);
+static void sub_809EB40(u8);
+static void sub_809EBC4(void);
+static void sub_809E044(void);
+static void sub_80A1D84(struct Pokemon *);
+static void sub_80A18C4(void);
+static bool8 LoadPokemonSummaryScreenGraphics(void);
+static bool8 MonKnowsMultipleMoves(struct Pokemon *);
+static void PrintSummaryWindowHeaderText(void);
+static void sub_80A1DCC(struct Pokemon *);
+static void sub_809FE80(void);
+static void sub_80A00A4(void);
+static void sub_80A0390(void);
+extern u8 sub_80A1808(struct Pokemon *);
+static void sub_80A1F98(s32, u8, u8, u8, u8, u16, s32);
+static void sub_80A0958(struct Pokemon *);
+static void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *, u8, u8);
+static void PokemonSummaryScreen_PrintEggTrainerMemo(struct Pokemon *, u8, u8);
+static void sub_80A1EF8(const u8 *, u8, u8, u16, s32);
+static void sub_80A1F48(const u8 *, u8, u8, u8, u16);
+static void PrintHeldItemName(u16, u8, u8);
+static void PrintNumRibbons(struct Pokemon *);
+static void DrawExperienceProgressBar(struct Pokemon *, u8, u8);
+static void sub_809E13C(u8 taskId);
+static void sub_80A1950(void);
+static void sub_809DE64(void);
+static void SummaryScreenHandleAButton(u8);
+static void SummaryScreenHandleUpDownInput(u8, s8);
+static bool8 sub_809F7D0(u8);
+static void sub_809F9D0(u8, u8);
+static void sub_809EAC8(u8);
+static void sub_809E534(u8);
+static void sub_809E83C(u8, s8);
+static void sub_80A1B40(u8);
+static void sub_80A2078(int);
+static void sub_809E3FC(u8);
+static void SummaryScreenHandleKeyInput(u8);
+static void sub_80A1B1C(u8);
+static void sub_80A16CC(u8);
+static void sub_80A1A30(u8);
+static void DrawSummaryScreenNavigationDots(void);
+static void sub_80A00F4(u8);
+static void sub_80A029C(struct Pokemon *);
+static void sub_809FBE4(void);
+static void sub_80A1500(u8);
+static void sub_80A1334(u8);
+extern void sub_809F43C(u8);
+extern s8 sub_809F284(s8);
+extern s8 sub_809F3CC(s8);
+static bool8 sub_809F5F8(void);
+static void sub_80A1DE8(struct Pokemon *);
+static u8 sub_809F6B4(struct Pokemon *, u8 *);
+static void DrawPokerusSurvivorDot(struct Pokemon *);
+static void sub_80A12D0(s8);
+static void sub_809FAC8(struct Pokemon *);
+static void SummaryScreenHandleLeftRightInput(u8, s8);
+static void sub_809E8F0();
+static void sub_80A1654(s8, u8);
+static void sub_80A1488(s8, u8);
+static void sub_809FC34(struct Pokemon *);
+static void sub_809FF64(struct Pokemon *);
+static void sub_80A1918(u8, u8);
+static void sub_80A198C(u8, u8, u8, u8);
+static u16 GetMonMove(struct Pokemon *, u8);
+static void sub_80A04CC(u16);
+static void sub_80A057C(u16);
+static void sub_80A0498(u16);
+static void sub_80A046C(u16);
+static void sub_80A20A8(u8);
+static void sub_809F678(struct Pokemon *);
+static void sub_80A1BC0(struct Sprite *sprite);
+static void sub_80A1888(struct Sprite *);
+static void sub_80A0428(struct Pokemon *, u8 *);
+static void sub_80A18E4(u8);
+static u8 *sub_80A1E58(u8 *, u8);
+static void sub_80A0A2C(struct Pokemon *, u8, u8);
+static void sub_80A1FF8(const u8 *, u8, u8, u8);
+
+extern u8 ball_number_to_ball_processing_index(u16);
+extern u8 StorageSystemGetNextMonIndex(struct BoxPokemon *, u8, u8, u8);
+
+extern struct MusicPlayerInfo gMPlay_BGM;
+extern u8 gUnknown_020384F0;
+extern u8 gUnknown_08208238[];
+extern u16 gUnknown_030041B8;
+extern u16 gBattle_BG2_Y;
+extern u16 gBattle_BG1_Y;
+extern u16 gBattle_BG1_X;
+extern u16 gBattle_BG2_X;
+extern u16 gUnknown_030041B0;
+extern TaskFunc gUnknown_03005CF0;
+extern struct Sprite *gUnknown_020384F4;
+extern struct SpriteTemplate gUnknown_02024E8C;
+
+extern const u8 gStatusPal_Icons[];
+extern const u8 gStatusGfx_Icons[];
+extern const u8 gMenuSummaryPal[];
+extern const u8 gMenuSummaryGfx[];
+extern const u8 gMoveTypes_Gfx[];
+extern const u8 gMoveTypes_Pal[];
+extern const u8 gStatusScreen_Pal[];
+extern const u8 gStatusScreen_Tilemap[];
+extern const u8 gUnknown_08E74688[];
+extern const u8 gUnknown_08E74E88[];
+extern const u8 gUnknown_08E73508[];
+extern const u8 gStatusScreen_Gfx[];
+extern const u8 gFontDefaultPalette[];
+extern const u8 gUnknownPalette_81E6692[];
+extern const u8 gAbilityNames[][13];
+extern const u8 * const gAbilityDescriptions[];
+extern const u8 * const gContestEffectStrings[];
+extern const struct ContestMove gContestMoves[];
+extern const struct ContestEffect gContestEffects[];
+extern const u16 gUnknown_08E94510[];
+extern const u16 gUnknown_08E94550[];
+extern const u16 gUnknown_08E94590[];
+extern const u8 gUnknown_08E73E88[];
+
+#if ENGLISH
+#include "../data/text/move_descriptions_en.h"
+#include "../data/text/nature_names_en.h"
+#elif GERMAN
+#include "../data/text/move_descriptions_de.h"
+#include "../data/text/nature_names_de.h"
+#endif
+
+static const u8 * const sPageHeaderTexts[] = {
+ gEmptyString_81E72B0,
+ OtherText_PokeInfo,
+ OtherText_PokeSkills,
+ OtherText_BattleMoves,
+ OtherText_ContestMoves,
+ OtherText_Switch,
+ OtherText_Info,
+ gOtherText_CancelNoTerminator,
+};
+
+static const union AffineAnimCmd sUnusedSpriteAffineAnim[] = {
+ AFFINEANIMCMD_FRAME(0xFF00, 0x100, 0, 0),
+ AFFINEANIMCMD_END,
+};
+
+static const union AffineAnimCmd *const sUnsuedSpriteAffineAnimTable[] = {
+ sUnusedSpriteAffineAnim,
+};
+
+static const struct OamData sOamData_83C109C = {
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const union AnimCmd sSpriteAnim_83C10A4[] = {
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C10AC[] = {
+ ANIMCMD_FRAME(8, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C10B4[] = {
+ ANIMCMD_FRAME(16, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C10BC[] = {
+ ANIMCMD_FRAME(24, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C10C4[] = {
+ ANIMCMD_FRAME(32, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C10CC[] = {
+ ANIMCMD_FRAME(40, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C10D4[] = {
+ ANIMCMD_FRAME(48, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C10DC[] = {
+ ANIMCMD_FRAME(56, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C10E4[] = {
+ ANIMCMD_FRAME(64, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C10EC[] = {
+ ANIMCMD_FRAME(72, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C10F4[] = {
+ ANIMCMD_FRAME(80, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C10FC[] = {
+ ANIMCMD_FRAME(88, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1104[] = {
+ ANIMCMD_FRAME(96, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C110C[] = {
+ ANIMCMD_FRAME(104, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1114[] = {
+ ANIMCMD_FRAME(112, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C111C[] = {
+ ANIMCMD_FRAME(120, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1124[] = {
+ ANIMCMD_FRAME(128, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C112C[] = {
+ ANIMCMD_FRAME(136, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1134[] = {
+ ANIMCMD_FRAME(144, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C113C[] = {
+ ANIMCMD_FRAME(152, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1144[] = {
+ ANIMCMD_FRAME(160, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C114C[] = {
+ ANIMCMD_FRAME(168, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1154[] = {
+ ANIMCMD_FRAME(176, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sSpriteAnimTable_83C115C[] = {
+ sSpriteAnim_83C10A4,
+ sSpriteAnim_83C10AC,
+ sSpriteAnim_83C10B4,
+ sSpriteAnim_83C10BC,
+ sSpriteAnim_83C10C4,
+ sSpriteAnim_83C10CC,
+ sSpriteAnim_83C10D4,
+ sSpriteAnim_83C10DC,
+ sSpriteAnim_83C10E4,
+ sSpriteAnim_83C10EC,
+ sSpriteAnim_83C10F4,
+ sSpriteAnim_83C10FC,
+ sSpriteAnim_83C1104,
+ sSpriteAnim_83C110C,
+ sSpriteAnim_83C1114,
+ sSpriteAnim_83C111C,
+ sSpriteAnim_83C1124,
+ sSpriteAnim_83C112C,
+ sSpriteAnim_83C1134,
+ sSpriteAnim_83C113C,
+ sSpriteAnim_83C1144,
+ sSpriteAnim_83C114C,
+ sSpriteAnim_83C1154,
+};
+
+static const struct CompressedSpriteSheet sUnknown_083C11B8 = { gMoveTypes_Gfx, 0x1700, 30002 };
+
+static const struct SpriteTemplate sSpriteTemplate_83C11C0 = {
+ .tileTag = 30002,
+ .paletteTag = 30002,
+ .oam = &sOamData_83C109C,
+ .anims = sSpriteAnimTable_83C115C,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const u8 sUnknown_PaletteNums[] = { 0xD, 0xD, 0xE, 0xE, 0xD, 0xD, 0xF, 0xE, 0xD, 0xF, 0xD, 0xE, 0xF, 0xD, 0xE, 0xE, 0xF, 0xD, 0xD, 0xE, 0xE, 0xF, 0xD };
+
+static const struct OamData sOamData_83C11F0 = {
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const union AnimCmd sSpriteAnim_83C11F8[] = {
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1200[] = {
+ ANIMCMD_FRAME(4, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1208[] = {
+ ANIMCMD_FRAME(8, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1210[] = {
+ ANIMCMD_FRAME(12, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1218[] = {
+ ANIMCMD_FRAME(16, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1220[] = {
+ ANIMCMD_FRAME(16, 0, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1228[] = {
+ ANIMCMD_FRAME(20, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1230[] = {
+ ANIMCMD_FRAME(24, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1238[] = {
+ ANIMCMD_FRAME(24, 0, .hFlip = TRUE),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C1240[] = {
+ ANIMCMD_FRAME(28, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sSpriteAnimTable_83C1248[] = {
+ sSpriteAnim_83C11F8,
+ sSpriteAnim_83C1200,
+ sSpriteAnim_83C1208,
+ sSpriteAnim_83C1210,
+ sSpriteAnim_83C1218,
+ sSpriteAnim_83C1220,
+ sSpriteAnim_83C1228,
+ sSpriteAnim_83C1230,
+ sSpriteAnim_83C1238,
+ sSpriteAnim_83C1240,
+};
+
+static const struct CompressedSpriteSheet sUnknown_083C1270 = { gMenuSummaryGfx, 0x400, 30000 };
+static const struct CompressedSpritePalette sUnknown_083C1278 = { gMenuSummaryPal, 30000 };
+
+static const struct SpriteTemplate sSpriteTemplate_83C1280 = {
+ .tileTag = 30000,
+ .paletteTag = 30000,
+ .oam = &sOamData_83C11F0,
+ .anims = sSpriteAnimTable_83C1248,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const struct OamData sOamData_83C1298 = {
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 3,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const union AnimCmd sSpriteAnim_83C12A0[] = {
+ ANIMCMD_FRAME(0, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C12A8[] = {
+ ANIMCMD_FRAME(4, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C12B0[] = {
+ ANIMCMD_FRAME(8, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C12B8[] = {
+ ANIMCMD_FRAME(12, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C12C0[] = {
+ ANIMCMD_FRAME(16, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C12C8[] = {
+ ANIMCMD_FRAME(20, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd sSpriteAnim_83C12D0[] = {
+ ANIMCMD_FRAME(24, 0),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const sSpriteAnimTable_83C12D8[] = {
+ sSpriteAnim_83C12A0,
+ sSpriteAnim_83C12A8,
+ sSpriteAnim_83C12B0,
+ sSpriteAnim_83C12B8,
+ sSpriteAnim_83C12C0,
+ sSpriteAnim_83C12C8,
+ sSpriteAnim_83C12D0,
+};
+
+static const struct CompressedSpriteSheet sUnknown_083C12F4 = { gStatusGfx_Icons, 0x380, 30001 };
+static const struct CompressedSpritePalette sUnknown_083C12FC = { gStatusPal_Icons, 30001 };
+
+static const struct SpriteTemplate sSpriteTemplate_83C1304 = {
+ .tileTag = 30001,
+ .paletteTag = 30001,
+ .oam = &sOamData_83C1298,
+ .anims = sSpriteAnimTable_83C12D8,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+static const u16 sSummaryScreenMonMarkingsPalette[] = INCBIN_U16("graphics/summary_screen/mon_markings.gbapal");
+
+#if ENGLISH
+static const u16 gSummaryScreenTextTiles[] = INCBIN_U16("graphics/summary_screen/text.4bpp");
+#elif GERMAN
+extern const u16 gSummaryScreenTextTiles[];
+#endif
+
+static const u16 sSummaryScreenButtonTiles[] = INCBIN_U16("graphics/summary_screen/buttons.4bpp");
+
+static const u16 sUnknown_083C157C[] = { RGB(26, 26, 23) };
+static const u16 sUnknown_083C157E[] = { RGB(30, 30, 27) };
+
+static void (*const sUnknown_083C1580[])(void) = {
+ sub_809FC0C,
+ sub_809FEB8,
+};
+
+static void (*const sUnknown_083C1588[])(struct Pokemon *) = {
+ sub_809F63C,
+ sub_809F650,
+ sub_809F664,
+ sub_809F664,
+};
+
+static void (*const sUnknown_083C1598[])(struct Pokemon *) = {
+ sub_809FE6C,
+ sub_80A0090,
+ sub_80A015C,
+ sub_80A015C,
+};
+
+static const u8 sDoubleBattlePartyOrder[] = { 0, 2, 3, 1, 4, 5 };
+
+static const u8 sUnknown_083C15AE[] = _("{STR_VAR_1}{CLEAR_TO 64}");
+static const u8 sUnknown_083C15B4[] = _("{STR_VAR_1}{CLEAR_TO 72}");
+
+asm(".align 2"); // TODO: this array is probably not correctly-typed
+static const u8 sUnknown_083C15BC[] = {
+ 9, 1, 0, 2,
+ 10, 3, 0, 4,
+ 8, 5, 0, 6,
+ 11, 7, 0, 8,
+ 14, 9, 0, 10,
+ 12, 11, 0, 12,
+ 13, 13, 0, 14,
+ -1, 15, 0, 10,
+};
+
+
+void sub_809D844(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+void sub_809D85C(void)
+{
+ REG_BG1HOFS = gBattle_BG1_X;
+ REG_BG1VOFS = gBattle_BG1_Y;
+ REG_BG2HOFS = gBattle_BG2_X;
+ REG_BG2VOFS = gBattle_BG2_Y;
+ REG_BG3HOFS = gUnknown_030041B0;
+ REG_BG3VOFS = gUnknown_030041B8;
+
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void ShowPokemonSummaryScreen(struct Pokemon *party, u8 monIndex, u8 maxMonIndex, MainCallback callback, u8 mode)
+{
+ gPaletteFade.bufferTransferDisabled = 1;
+
+ pssData.monList.partyMons = party;
+ pssData.mode = mode;
+ pssData.monIndex = monIndex;
+ pssData.maxMonIndex = maxMonIndex;
+ pssData.callback = callback;
+ pssData.loadGfxState = 0;
+ pssData.selectedMoveIndex = 4;
+ pssData.moveToLearn = 0;
+ pssData.bgToggle = 0;
+ pssData.disableMoveOrderEditing = FALSE;
+
+ if (mode >= PSS_MODE_PC_NORMAL)
+ {
+ pssData.usingPC = TRUE;
+ }
+ else
+ {
+ pssData.usingPC = FALSE;
+ }
+
+ switch (mode)
+ {
+ case PSS_MODE_NORMAL:
+ case PSS_MODE_PC_NORMAL:
+ pssData.firstPage = PSS_PAGE_INFO;
+ pssData.lastPage = PSS_PAGE_CONTEST_MOVES;
+ pssData.unk77 = 0;
+ pssData.unk78 = 0;
+ pssData.headerTextId = 1;
+ pssData.headerActionTextId = 7;
+ break;
+ case PSS_MODE_NO_MOVE_ORDER_EDIT:
+ pssData.firstPage = PSS_PAGE_INFO;
+ pssData.lastPage = PSS_PAGE_CONTEST_MOVES;
+ pssData.unk77 = 0;
+ pssData.unk78 = 0;
+ pssData.headerTextId = 1;
+ pssData.headerActionTextId = 7;
+ pssData.disableMoveOrderEditing = TRUE;
+ break;
+ case PSS_MODE_SELECT_MOVE:
+ pssData.firstPage = PSS_PAGE_BATTLE_MOVES;
+ pssData.lastPage = PSS_PAGE_CONTEST_MOVES;
+ pssData.unk77 = 1;
+ pssData.unk78 = 1;
+ pssData.headerTextId = 3;
+ pssData.headerActionTextId = 0;
+ pssData.selectedMoveIndex = 0;
+ break;
+ case PSS_MODE_MOVES_ONLY:
+ case PSS_MODE_PC_MOVES_ONLY:
+ pssData.firstPage = PSS_PAGE_BATTLE_MOVES;
+ pssData.lastPage = PSS_PAGE_CONTEST_MOVES;
+ pssData.unk77 = 1;
+ pssData.unk78 = 1;
+ break;
+ }
+
+ pssData.page = pssData.firstPage;
+ SetMainCallback2(sub_809DE44);
+}
+
+void ShowSelectMovePokemonSummaryScreen(struct Pokemon *party, u8 monIndex, u8 maxMonIndex, MainCallback callback, u16 move)
+{
+ ShowPokemonSummaryScreen(party, monIndex, maxMonIndex, callback, PSS_MODE_SELECT_MOVE);
+ pssData.moveToLearn = move;
+}
+
+void sub_809DA1C(void)
+{
+ switch (pssData.mode)
+ {
+ case PSS_MODE_NORMAL:
+ case PSS_MODE_PC_NORMAL:
+ pssData.inputHandlingTaskId = CreateTask(SummaryScreenHandleKeyInput, 0);
+ break;
+ case PSS_MODE_NO_MOVE_ORDER_EDIT:
+ pssData.inputHandlingTaskId = CreateTask(SummaryScreenHandleKeyInput, 0);
+ break;
+ case PSS_MODE_SELECT_MOVE:
+ case PSS_MODE_UNKNOWN:
+ pssData.inputHandlingTaskId = CreateTask(sub_809EB40, 0);
+ break;
+ case PSS_MODE_MOVES_ONLY:
+ case PSS_MODE_PC_MOVES_ONLY:
+ pssData.inputHandlingTaskId = CreateTask(sub_809E3FC, 0);
+ break;
+ }
+}
+
+bool8 sub_809DA84(void)
+{
+ const u16 *src;
+ void *dest;
+
+ switch (gMain.state)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ ResetSpriteData();
+ gMain.state++;
+ break;
+ case 1:
+ remove_some_task();
+ gMain.state++;
+ break;
+ case 2:
+ FreeAllSpritePalettes();
+ gMain.state++;
+ break;
+ case 3:
+ dest = (void *)VRAM;
+ DmaClearLarge(3, dest, 0x10000, 0x1000, 32);
+ gMain.state++;
+ break;
+ case 4:
+ sub_809DE64();
+ gMain.state++;
+ break;
+ case 5:
+ SetUpWindowConfig(&gWindowConfig_81E6E6C);
+ gMain.state++;
+ break;
+ case 6:
+ MultistepInitMenuWindowBegin(&gWindowConfig_81E6E6C);
+ gMain.state++;
+ break;
+ case 7:
+ if (MultistepInitMenuWindowContinue())
+ {
+ gMain.state++;
+ }
+ break;
+ case 8:
+ sub_809DA1C();
+ gMain.state++;
+ break;
+ case 9:
+ src = gSummaryScreenTextTiles;
+ dest = (void *)VRAM + 0xD000;
+ DmaCopy16(3, src, dest, 320);
+
+ src = sSummaryScreenButtonTiles;
+ dest = (void *)VRAM + 0xD140;
+ DmaCopy16(3, src, dest, 256);
+
+ pssData.loadGfxState = 0;
+ gMain.state++;
+ break;
+ case 10:
+ if (LoadPokemonSummaryScreenGraphics())
+ {
+ pssData.loadGfxState = 0;
+ gMain.state++;
+ }
+ break;
+ case 11:
+ sub_80A18C4();
+ gMain.state++;
+ break;
+ case 12:
+ sub_809F678(&pssData.loadedMon);
+ if (!GetMonStatusAndPokerus(&pssData.loadedMon))
+ {
+ sub_80A12D0(0);
+ }
+ else
+ {
+ sub_80A12D0(10);
+ }
+
+ DrawPokerusSurvivorDot(&pssData.loadedMon);
+ gMain.state++;
+ break;
+ case 13:
+ sub_80A1950();
+ sub_80A1D84(&pssData.loadedMon);
+ gMain.state++;
+ break;
+ case 14:
+ sub_80A1DE8(&pssData.loadedMon);
+ pssData.loadGfxState = 0;
+ gMain.state++;
+ break;
+ case 15:
+ if ((pssData.monSpriteId = sub_809F6B4(&pssData.loadedMon, &pssData.loadGfxState)) != 0xFF)
+ {
+ pssData.loadGfxState = 0;
+ gMain.state++;
+ }
+ break;
+ case 16:
+ sub_809E044();
+ DrawSummaryScreenNavigationDots();
+ gMain.state++;
+ break;
+ case 17:
+ if (pssData.page <= PSS_PAGE_SKILLS)
+ {
+ sUnknown_083C1580[pssData.page]();
+ }
+
+ gMain.state++;
+ break;
+ case 18:
+ sub_809FAC8(&pssData.loadedMon);
+ gMain.state++;
+ break;
+ case 19:
+ sUnknown_083C1598[pssData.page](&pssData.loadedMon);
+ gMain.state++;
+ break;
+ case 20:
+ if (GetMonData(&pssData.loadedMon, MON_DATA_IS_EGG))
+ {
+ gUnknown_030041B0 = 256;
+ }
+ else
+ {
+ gUnknown_030041B0 = 0;
+ }
+
+ gMain.state++;
+ break;
+ case 21:
+ sub_809EBC4();
+ if (pssData.selectedMoveIndex != 0)
+ {
+ sub_80A1488(0, 0);
+ sub_80A1654(0, 0);
+ }
+ else
+ {
+ sub_80A1488(10, 0);
+ sub_80A1654(10, 0);
+ }
+
+ PrintSummaryWindowHeaderText();
+ gMain.state++;
+ break;
+ case 22:
+ if (sub_8055870() != TRUE)
+ {
+ gMain.state++;
+ }
+ break;
+ default:
+ SetVBlankCallback(sub_809D85C);
+ BeginHardwarePaletteFade(0xFF, 0, 16, 0, 1);
+ SetMainCallback2(sub_809D844);
+ gPaletteFade.bufferTransferDisabled = 0;
+ return TRUE;
+ break;
+ }
+
+ return FALSE;
+}
+
+static void sub_809DE44(void)
+{
+ while (sub_809DA84() != TRUE && sub_80F9344() != TRUE);
+}
+
+static void sub_809DE64(void)
+{
+ REG_BG0CNT = 0x1E08;
+ REG_BG1CNT = 0x4801;
+ REG_BG2CNT = 0x4A02;
+ REG_BG3CNT = 0x5C03;
+
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ gBattle_BG2_X = 0;
+ gBattle_BG2_Y = 0;
+ gUnknown_030041B0 = 0;
+ gUnknown_030041B8 = 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_BLDCNT = 0;
+ REG_DISPCNT = 0x1F40;
+}
+
+static bool8 LoadPokemonSummaryScreenGraphics(void)
+{
+ switch (pssData.loadGfxState)
+ {
+ case 0:
+ LZDecompressVram(gStatusScreen_Gfx, (void *)VRAM + 0);
+ break;
+ case 1:
+ CpuSet(gUnknown_08E73508, (void *)VRAM + 0xE000, 0x400);
+ break;
+ case 2:
+ LZDecompressVram(gUnknown_08E74E88, (void *)VRAM + 0xE800);
+ break;
+ case 3:
+ LZDecompressVram(gStatusScreen_Tilemap, (void *)VRAM + 0x4800);
+ break;
+ case 4:
+ CpuSet(gUnknown_08E73E88, (void *)VRAM + 0x5800, 0x400);
+ break;
+ case 5:
+ CpuSet(gUnknown_08E74688, (void *)VRAM + 0x6800, 0x400);
+ break;
+ case 6:
+ LoadCompressedPalette(gStatusScreen_Pal, 0, 160);
+ break;
+ case 7:
+ LoadCompressedObjectPic(&sUnknown_083C11B8);
+ break;
+ case 8:
+ LoadCompressedObjectPic(&sUnknown_083C1270);
+ break;
+ case 9:
+ LoadCompressedObjectPic(&sUnknown_083C12F4);
+ break;
+ case 10:
+ LoadCompressedObjectPalette(&sUnknown_083C12FC);
+ break;
+ case 11:
+ LoadCompressedObjectPalette(&sUnknown_083C1278);
+ break;
+ case 12:
+ LoadCompressedPalette(gMoveTypes_Pal, 464, 96);
+ pssData.loadGfxState = 0;
+ return TRUE;
+ }
+
+ pssData.loadGfxState++;
+ return FALSE;
+}
+
+static void sub_809E044(void)
+{
+ LoadPalette(&gUnknownPalette_81E6692[28], 129, 2);
+ LoadPalette(&gUnknownPalette_81E6692[30], 136, 2);
+ LoadPalette(&gUnknownPalette_81E6692[28], 143, 2);
+ LoadPalette(&gUnknownPalette_81E6692[30], 137, 2);
+ LoadPalette(&gUnknownPalette_81E6692[12], 209, 4);
+ LoadPalette(&gUnknownPalette_81E6692[20], 211, 4);
+ LoadPalette(&gUnknownPalette_81E6692[28], 213, 4);
+ LoadPalette(&gUnknownPalette_81E6692[12], 215, 4);
+ LoadPalette(&gUnknownPalette_81E6692[8], 217, 4);
+ LoadPalette(&gUnknownPalette_81E6692[16], 219, 4);
+ LoadPalette(&gUnknownPalette_81E6692[4], 221, 2);
+ LoadPalette(&gUnknownPalette_81E6692[6], 222, 2);
+ LoadPalette(&gUnknownPalette_81E6692[2], 223, 2);
+ LoadPalette(gFontDefaultPalette, 240, 32);
+ LoadPalette(&gUnknownPalette_81E6692[6], 249, 2);
+}
+
+static void SummaryScreenExit(u8 taskId)
+{
+ PlaySE(SE_SELECT);
+ BeginNormalPaletteFade(-1, 0, 0, 16, 0);
+ gTasks[taskId].func = sub_809E13C;
+}
+
+static void sub_809E13C(u8 taskId)
+{
+ if (sub_8055870() != TRUE && !gPaletteFade.active)
+ {
+ gUnknown_020384F0 = pssData.monIndex;
+
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ StopCryAndClearCrySongs();
+ m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100);
+ SetMainCallback2(pssData.callback);
+ DestroyTask(taskId);
+ }
+}
+
+static void SummaryScreenHandleKeyInput(u8 taskId)
+{
+ if (gPaletteFade.active)
+ return;
+
+ if (gMain.newKeys & DPAD_UP)
+ {
+ SummaryScreenHandleUpDownInput(taskId, -1);
+ }
+ else if (gMain.newKeys & DPAD_DOWN)
+ {
+ SummaryScreenHandleUpDownInput(taskId, 1);
+ }
+ else if ((gMain.newKeys & DPAD_LEFT) || sub_80F9284() == 1)
+ {
+ SummaryScreenHandleLeftRightInput(taskId, -1);
+ }
+ else if ((gMain.newKeys & DPAD_RIGHT) || sub_80F9284() == 2)
+ {
+ SummaryScreenHandleLeftRightInput(taskId, 1);
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ if (pssData.page >= PSS_PAGE_BATTLE_MOVES)
+ {
+ SummaryScreenHandleAButton(taskId);
+ }
+
+ if (pssData.page == PSS_PAGE_INFO)
+ {
+ SummaryScreenExit(taskId);
+ }
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ SummaryScreenExit(taskId);
+ }
+}
+
+static void sub_809E260(u8 taskId)
+{
+ if (gPaletteFade.active)
+ return;
+
+ if (gMain.newKeys & DPAD_UP)
+ {
+ gTasks[taskId].data[0] = 4;
+ sub_809E8F0(taskId, -1, &pssData.selectedMoveIndex);
+ }
+ else if (gMain.newKeys & DPAD_DOWN)
+ {
+ gTasks[taskId].data[0] = 4;
+ sub_809E8F0(taskId, 1, &pssData.selectedMoveIndex);
+ }
+ else if ((gMain.newKeys & DPAD_LEFT) || sub_80F9284() == 1)
+ {
+ if (pssData.page == PSS_PAGE_CONTEST_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0))
+ {
+ MenuZeroFillWindowRect(0, 14, 9, 18);
+ }
+
+ SummaryScreenHandleLeftRightInput(taskId, -1);
+ }
+ else if ((gMain.newKeys & DPAD_RIGHT) || sub_80F9284() == 2)
+ {
+ if (pssData.page != pssData.lastPage)
+ {
+ if (pssData.page == PSS_PAGE_BATTLE_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0))
+ {
+ MenuZeroFillWindowRect(0, 14, 9, 18);
+ }
+
+ SummaryScreenHandleLeftRightInput(taskId, 1);
+ }
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ if (sub_809F7D0(taskId) == TRUE || pssData.selectedMoveIndex == 4)
+ {
+ pssData.switchMoveIndex = pssData.selectedMoveIndex;
+ gSpecialVar_0x8005 = pssData.switchMoveIndex;
+ SummaryScreenExit(taskId);
+ }
+ else
+ {
+ PlaySE(SE_HAZURE);
+ sub_809F9D0(taskId, pssData.selectedMoveIndex);
+ }
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ pssData.switchMoveIndex = 4;
+ gSpecialVar_0x8005 = 4;
+ SummaryScreenExit(taskId);
+ }
+}
+
+static void sub_809E3FC(u8 taskId)
+{
+ if (gPaletteFade.active)
+ return;
+
+ if (gMain.newKeys & DPAD_UP)
+ {
+ gTasks[taskId].data[0] = 4;
+ sub_809E8F0(taskId, -1, &pssData.selectedMoveIndex);
+ }
+ else if (gMain.newKeys & DPAD_DOWN)
+ {
+ gTasks[taskId].data[0] = 4;
+ sub_809E8F0(taskId, 1, &pssData.selectedMoveIndex);
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ if (pssData.selectedMoveIndex != 4 && !pssData.disableMoveOrderEditing)
+ {
+ if (!MonKnowsMultipleMoves(&pssData.loadedMon))
+ {
+ PlaySE(SE_HAZURE);
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+
+ pssData.switchMoveIndex = pssData.selectedMoveIndex;
+ sub_80A1B40(1);
+ sub_80A1A30(19);
+
+ gTasks[taskId].func = sub_809E534;
+ }
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ sub_809EAC8(taskId);
+ }
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_809EAC8(taskId);
+ }
+
+}
+
+static bool8 MonKnowsMultipleMoves(struct Pokemon *mon)
+{
+ u8 i;
+
+ for (i = 1; i < 4; i++)
+ {
+ if (GetMonMove(mon, i))
+ {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static void sub_809E534(u8 taskId)
+{
+ if (gMain.newKeys & DPAD_UP)
+ {
+ gTasks[taskId].data[0] = 3;
+ sub_809E8F0(taskId, -1, &pssData.switchMoveIndex);
+ }
+ else if (gMain.newKeys & DPAD_DOWN)
+ {
+ gTasks[taskId].data[0] = 3;
+ sub_809E8F0(taskId, 1, &pssData.switchMoveIndex);
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ sub_809E83C(taskId, 1);
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ sub_809E83C(taskId, -1);
+ }
+}
+
+static void sub_809E5C4(void)
+{
+ struct Pokemon *party = pssData.monList.partyMons;
+ struct Pokemon *pkmn = &party[pssData.monIndex];
+ u8 moveIndex1 = pssData.selectedMoveIndex;
+ u8 moveIndex2 = pssData.switchMoveIndex;
+
+ u16 move1 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex1);
+ u16 move2 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex2);
+ u8 move1pp = GetMonData(pkmn, MON_DATA_PP1 + moveIndex1);
+ u8 move2pp = GetMonData(pkmn, MON_DATA_PP1 + moveIndex2);
+ u8 ppBonuses = GetMonData(pkmn, MON_DATA_PP_BONUSES);
+
+ // Calculate PP bonuses
+ u8 r9 = gUnknown_08208238[moveIndex1];
+ u8 r2 = (ppBonuses & r9) >> (moveIndex1 * 2);
+ u8 r3 = gUnknown_08208238[moveIndex2];
+ u8 r1 = (ppBonuses & r3) >> (moveIndex2 * 2);
+ ppBonuses &= ~r9;
+ ppBonuses &= ~r3;
+ ppBonuses |= (r2 << (moveIndex2 * 2)) + (r1 << (moveIndex1 * 2));
+
+ // Swap the moves
+ SetMonData(pkmn, MON_DATA_MOVE1 + moveIndex1, &move2);
+ SetMonData(pkmn, MON_DATA_MOVE1 + moveIndex2, &move1);
+ SetMonData(pkmn, MON_DATA_PP1 + moveIndex1, &move2pp);
+ SetMonData(pkmn, MON_DATA_PP1 + moveIndex2, &move1pp);
+ SetMonData(pkmn, MON_DATA_PP_BONUSES, &ppBonuses);
+}
+
+static void sub_809E6D8(void)
+{
+ struct BoxPokemon *boxMons = pssData.monList.boxMons;
+ struct BoxPokemon *pkmn = &boxMons[pssData.monIndex];
+ u8 moveIndex1 = pssData.selectedMoveIndex;
+ u8 moveIndex2 = pssData.switchMoveIndex;
+
+ u16 move1 = GetBoxMonData(pkmn, MON_DATA_MOVE1 + moveIndex1);
+ u16 move2 = GetBoxMonData(pkmn, MON_DATA_MOVE1 + moveIndex2);
+ u8 move1pp = GetBoxMonData(pkmn, MON_DATA_PP1 + moveIndex1);
+ u8 move2pp = GetBoxMonData(pkmn, MON_DATA_PP1 + moveIndex2);
+ u8 ppBonuses = GetBoxMonData(pkmn, MON_DATA_PP_BONUSES);
+
+ // Calculate PP bonuses
+ u8 r9 = gUnknown_08208238[moveIndex1];
+ u8 r2 = (ppBonuses & r9) >> (moveIndex1 * 2);
+ u8 r3 = gUnknown_08208238[moveIndex2];
+ u8 r1 = (ppBonuses & r3) >> (moveIndex2 * 2);
+ ppBonuses &= ~r9;
+ ppBonuses &= ~r3;
+ ppBonuses |= (r2 << (moveIndex2 * 2)) + (r1 << (moveIndex1 * 2));
+
+ // Swap the moves
+ SetBoxMonData(pkmn, MON_DATA_MOVE1 + moveIndex1, &move2);
+ SetBoxMonData(pkmn, MON_DATA_MOVE1 + moveIndex2, &move1);
+ SetBoxMonData(pkmn, MON_DATA_PP1 + moveIndex1, &move2pp);
+ SetBoxMonData(pkmn, MON_DATA_PP1 + moveIndex2, &move1pp);
+ SetBoxMonData(pkmn, MON_DATA_PP_BONUSES, &ppBonuses);
+}
+
+void sub_809E7F0(u8 taskId)
+{
+ if (sub_809F5F8())
+ {
+ pssData.loadGfxState = 0;
+ sub_80A0428(&pssData.loadedMon, &pssData.selectedMoveIndex);
+ gTasks[taskId].func = sub_809E3FC;
+ sub_80A2078(taskId);
+ }
+}
+
+static void sub_809E83C(u8 taskId, s8 b)
+{
+ PlaySE(SE_SELECT);
+
+ sub_80A1B1C(19);
+ sub_80A1B40(0);
+
+ if (b == 1)
+ {
+ if (pssData.selectedMoveIndex != pssData.switchMoveIndex)
+ {
+ if (pssData.usingPC == FALSE)
+ {
+ sub_809E5C4();
+ }
+ else
+ {
+ sub_809E6D8();
+ }
+
+ pssData.selectedMoveIndex = pssData.switchMoveIndex;
+ sub_809F678(&pssData.loadedMon);
+ pssData.loadGfxState = 1;
+
+ gTasks[taskId].func = sub_809E7F0;
+ return;
+ }
+ }
+ else
+ {
+ sub_80A0428(&pssData.loadedMon, &pssData.selectedMoveIndex);
+ }
+
+ gTasks[taskId].func = sub_809E3FC;
+ sub_80A2078(taskId);
+}
+
+__attribute__((naked))
+static void sub_809E8F0(/*u8 taskId, s8 direction, u8 *c*/)
+{
+ 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, 0x8\n\
+ adds r4, r1, 0\n\
+ mov r9, r2\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r8, r0\n\
+ lsls r4, 24\n\
+ lsrs r4, 24\n\
+ movs r0, 0x1\n\
+ str r0, [sp]\n\
+ movs r0, 0x5\n\
+ bl PlaySE\n\
+ mov r1, r9\n\
+ ldrb r6, [r1]\n\
+ ldr r1, _0809E944 @ =gTasks\n\
+ mov r2, r8\n\
+ lsls r0, r2, 2\n\
+ add r0, r8\n\
+ lsls r0, 3\n\
+ adds r0, r1\n\
+ ldrb r0, [r0, 0x8]\n\
+ movs r2, 0\n\
+ lsls r4, 24\n\
+ asrs r4, 24\n\
+ mov r10, r4\n\
+ lsls r7, r0, 24\n\
+_0809E930:\n\
+ lsls r0, r6, 24\n\
+ asrs r0, 24\n\
+ add r0, r10\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ asrs r1, r0, 24\n\
+ cmp r0, r7\n\
+ ble _0809E948\n\
+ movs r6, 0\n\
+ b _0809E94E\n\
+ .align 2, 0\n\
+_0809E944: .4byte gTasks\n\
+_0809E948:\n\
+ cmp r1, 0\n\
+ bge _0809E94E\n\
+ lsrs r6, r7, 24\n\
+_0809E94E:\n\
+ lsls r4, r6, 24\n\
+ lsrs r1, r4, 24\n\
+ ldr r0, _0809EA10 @ =gSharedMem + 0x18010\n\
+ str r2, [sp, 0x4]\n\
+ bl GetMonMove\n\
+ lsls r0, 16\n\
+ adds r5, r4, 0\n\
+ ldr r2, [sp, 0x4]\n\
+ cmp r0, 0\n\
+ bne _0809E97A\n\
+ asrs r0, r5, 24\n\
+ cmp r0, 0x4\n\
+ beq _0809E97A\n\
+ lsls r0, r2, 24\n\
+ movs r3, 0x80\n\
+ lsls r3, 17\n\
+ adds r0, r3\n\
+ lsrs r2, r0, 24\n\
+ asrs r0, 24\n\
+ cmp r0, 0x3\n\
+ ble _0809E930\n\
+_0809E97A:\n\
+ mov r1, r9\n\
+ ldrb r0, [r1]\n\
+ cmp r0, 0x4\n\
+ bne _0809E996\n\
+ asrs r0, r5, 24\n\
+ cmp r0, 0x4\n\
+ beq _0809E996\n\
+ ldr r0, _0809EA14 @ =gSharedMem + 0x18000\n\
+ adds r0, 0x7C\n\
+ ldrh r0, [r0]\n\
+ mov r2, r8\n\
+ lsls r7, r2, 2\n\
+ cmp r0, 0\n\
+ beq _0809E9AC\n\
+_0809E996:\n\
+ ldr r2, _0809EA18 @ =gTasks\n\
+ mov r3, r8\n\
+ lsls r1, r3, 2\n\
+ adds r0, r1, r3\n\
+ lsls r0, 3\n\
+ adds r0, r2\n\
+ movs r2, 0x22\n\
+ ldrsh r0, [r0, r2]\n\
+ adds r7, r1, 0\n\
+ cmp r0, 0x1\n\
+ bne _0809E9D0\n\
+_0809E9AC:\n\
+ lsrs r4, r5, 24\n\
+ movs r0, 0x2\n\
+ adds r1, r4, 0\n\
+ bl sub_80A1488\n\
+ movs r0, 0x2\n\
+ adds r1, r4, 0\n\
+ bl sub_80A1654\n\
+ ldr r1, _0809EA18 @ =gTasks\n\
+ mov r3, r8\n\
+ adds r0, r7, r3\n\
+ lsls r0, 3\n\
+ adds r0, r1\n\
+ movs r1, 0\n\
+ strh r1, [r0, 0x22]\n\
+ movs r0, 0\n\
+ str r0, [sp]\n\
+_0809E9D0:\n\
+ mov r1, r9\n\
+ ldrb r0, [r1]\n\
+ cmp r0, 0x4\n\
+ beq _0809E9FE\n\
+ asrs r0, r5, 24\n\
+ cmp r0, 0x4\n\
+ bne _0809E9FE\n\
+ ldr r0, _0809EA14 @ =gSharedMem + 0x18000\n\
+ adds r0, 0x7C\n\
+ ldrh r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _0809E9FE\n\
+ movs r4, 0x2\n\
+ negs r4, r4\n\
+ lsrs r5, 24\n\
+ adds r0, r4, 0\n\
+ adds r1, r5, 0\n\
+ bl sub_80A1488\n\
+ adds r0, r4, 0\n\
+ adds r1, r5, 0\n\
+ bl sub_80A1654\n\
+_0809E9FE:\n\
+ mov r2, r9\n\
+ strb r6, [r2]\n\
+ ldr r0, _0809EA1C @ =gSharedMem + 0x18079\n\
+ cmp r9, r0\n\
+ bne _0809EA20\n\
+ movs r0, 0\n\
+ bl sub_80A1C30\n\
+ b _0809EA26\n\
+ .align 2, 0\n\
+_0809EA10: .4byte gSharedMem + 0x18010\n\
+_0809EA14: .4byte gSharedMem + 0x18000\n\
+_0809EA18: .4byte gTasks\n\
+_0809EA1C: .4byte gSharedMem + 0x18079\n\
+_0809EA20:\n\
+ movs r0, 0x1\n\
+ bl sub_80A1C30\n\
+_0809EA26:\n\
+ ldr r3, [sp]\n\
+ cmp r3, 0\n\
+ beq _0809EA34\n\
+ ldr r0, _0809EA4C @ =gSharedMem + 0x18010\n\
+ mov r1, r9\n\
+ bl sub_80A0428\n\
+_0809EA34:\n\
+ mov r0, r8\n\
+ bl sub_80A2078\n\
+ add sp, 0x8\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\
+_0809EA4C: .4byte gSharedMem + 0x18010\n\
+ .syntax divided\n");
+}
+
+static void SummaryScreenHandleAButton(u8 taskId)
+{
+ PlaySE(SE_SELECT);
+
+ pssData.selectedMoveIndex = 0;
+ sub_80A1488(2, 0);
+ sub_80A1654(2, 0);
+
+ if (!pssData.disableMoveOrderEditing)
+ {
+ pssData.headerActionTextId = 5;
+ PrintSummaryWindowHeaderText();
+ }
+
+ sub_80A16CC(0);
+ sub_80A029C(&pssData.loadedMon);
+ sub_80A1A30(9);
+
+ gTasks[taskId].func = sub_809E3FC;
+ sub_80A2078(taskId);
+}
+
+static void sub_809EAC8(u8 taskId)
+{
+ if (pssData.selectedMoveIndex != 4)
+ {
+ sub_80A1488(-2, 0);
+ sub_80A1654(-2, 0);
+ }
+
+ sub_80A1B1C(9);
+ sub_80A16CC(1);
+
+ MenuZeroFillWindowRect(15, 12, 28, 13);
+ MenuZeroFillWindowRect(11, 15, 28, 18);
+
+ pssData.headerActionTextId = 6;
+ PrintSummaryWindowHeaderText();
+
+ gTasks[taskId].func = SummaryScreenHandleKeyInput;
+}
+
+static void sub_809EB40(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 5:
+ sub_80A1A30(9);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_809E260;
+ break;
+ case 0:
+ pssData.selectedMoveIndex = 0;
+ if (pssData.moveToLearn != 0)
+ {
+ sub_80A1488(10, 0);
+ sub_80A1654(10, pssData.selectedMoveIndex);
+ }
+
+ sub_80A16CC(0);
+ sub_80A029C(&pssData.loadedMon);
+ // fall through
+ default:
+ gTasks[taskId].data[0]++;
+ break;
+ }
+}
+
+static void sub_809EBC4(void)
+{
+ if (pssData.page != PSS_PAGE_INFO)
+ {
+ DrawSummaryScreenNavigationDots();
+ gBattle_BG1_X = 0x100;
+
+ if (pssData.page == PSS_PAGE_SKILLS)
+ REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0x800;
+
+ if (pssData.page == PSS_PAGE_BATTLE_MOVES)
+ REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0xA00;
+
+ if (pssData.page == PSS_PAGE_CONTEST_MOVES)
+ REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0xC00;
+ }
+}
+
+void sub_809EC38(u8 taskId)
+{
+ u8 minus2;
+ s16 *taskData = gTasks[taskId].data;
+
+ switch (taskData[0])
+ {
+ case 0:
+ if (pssData.bgToggle == 0)
+ {
+ if (pssData.page != PSS_PAGE_INFO)
+ {
+ gBattle_BG2_X = 0x100;
+ }
+
+ if (pssData.page == PSS_PAGE_SKILLS)
+ {
+ REG_BG2CNT = (REG_BG2CNT & 0xE0FF) + 0x800;
+ }
+
+ if (pssData.page == PSS_PAGE_BATTLE_MOVES)
+ {
+ REG_BG2CNT = (REG_BG2CNT & 0xE0FF) + 0xA00;
+ }
+ }
+ else
+ {
+ if (pssData.page != PSS_PAGE_INFO)
+ {
+ gBattle_BG1_X = 0x100;
+ }
+
+ if (pssData.page == PSS_PAGE_SKILLS)
+ {
+ REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0x800;
+ }
+
+ if (pssData.page == PSS_PAGE_BATTLE_MOVES)
+ {
+ REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0xA00;
+ }
+ }
+
+ taskData[0]++;
+ break;
+ case 1:
+ if (pssData.bgToggle == 0)
+ {
+ int var2 = gBattle_BG1_X - 0x20;
+ gBattle_BG1_X = var2;
+ if (var2 << 16 == 0)
+ {
+ REG_BG1CNT = (REG_BG1CNT & 0xFFFC) + 2;
+ REG_BG2CNT = (REG_BG2CNT & 0xFFFC) + 1;
+ taskData[0]++;
+ }
+ }
+ else
+ {
+ int var2 = gBattle_BG2_X - 0x20;
+ gBattle_BG2_X = var2;
+ if (var2 << 16 == 0)
+ {
+ REG_BG1CNT = (REG_BG1CNT & 0xFFFC) + 1;
+ REG_BG2CNT = (REG_BG2CNT & 0xFFFC) + 2;
+ taskData[0]++;
+ }
+ }
+ break;
+ case 2:
+ pssData.headerTextId = pssData.page + 1;
+ minus2 = pssData.mode - 2;
+ if (minus2 < 2)
+ {
+ pssData.headerActionTextId = 0;
+ sub_80A029C(&pssData.loadedMon);
+ sub_80A0428(&pssData.loadedMon, &pssData.selectedMoveIndex);
+ sub_80A00F4(pssData.selectedMoveIndex);
+ }
+ else
+ {
+ if (pssData.page >= PSS_PAGE_BATTLE_MOVES && (!pssData.disableMoveOrderEditing || pssData.mode == PSS_MODE_NO_MOVE_ORDER_EDIT))
+ {
+ pssData.headerActionTextId = 6;
+ }
+ else if (pssData.page == PSS_PAGE_INFO)
+ {
+ pssData.headerActionTextId = 7;
+ }
+ else
+ {
+ pssData.headerActionTextId = 0;
+ }
+ }
+
+ taskData[0]++;
+ break;
+ case 3:
+ DrawSummaryScreenNavigationDots();
+ PrintSummaryWindowHeaderText();
+ taskData[0]++;
+ break;
+ case 4:
+ sUnknown_083C1598[pssData.page](&pssData.loadedMon);
+ pssData.bgToggle ^= 1;
+ taskData[0]++;
+ break;
+ case 5:
+ if (sub_8055870() != TRUE)
+ {
+ gTasks[taskId].func = gUnknown_03005CF0;
+ }
+ break;
+ }
+}
+
+void sub_809EE74(u8 taskId)
+{
+ int var1;
+ u8 minus2;
+ s16 *taskData = gTasks[taskId].data;
+
+ switch (taskData[0])
+ {
+ case 0:
+ var1 = pssData.bgToggle;
+ if (var1 == 0)
+ {
+ gBattle_BG2_X = pssData.bgToggle;
+ taskData[0]++;
+ }
+ else
+ {
+ gBattle_BG1_X = 0;
+ taskData[0]++;
+ }
+ break;
+ case 1:
+ if (pssData.bgToggle == 0)
+ {
+ if (pssData.page == PSS_PAGE_SKILLS)
+ REG_BG2CNT = (REG_BG2CNT & 0xE0FC) + 0x801;
+
+ if (pssData.page == PSS_PAGE_BATTLE_MOVES)
+ REG_BG2CNT = (REG_BG2CNT & 0xE0FC) + 0xA01;
+
+ if (pssData.page == PSS_PAGE_CONTEST_MOVES)
+ REG_BG2CNT = (REG_BG2CNT & 0xE0FC) + 0xC01;
+
+ REG_BG1CNT = (REG_BG1CNT & 0xFFFC) + 2;
+ }
+ else
+ {
+ if (pssData.page == PSS_PAGE_SKILLS)
+ REG_BG1CNT = (REG_BG1CNT & 0xE0FC) + 0x801;
+
+ if (pssData.page == PSS_PAGE_BATTLE_MOVES)
+ REG_BG1CNT = (REG_BG1CNT & 0xE0FC) + 0xA01;
+
+ if (pssData.page == PSS_PAGE_CONTEST_MOVES)
+ REG_BG1CNT = (REG_BG1CNT & 0xE0FC) + 0xC01;
+
+ REG_BG2CNT = (REG_BG2CNT & 0xFFFC) + 2;
+ }
+
+ taskData[0]++;
+ break;
+ case 2:
+ if (pssData.bgToggle == 0)
+ {
+ int var2 = gBattle_BG2_X + 0x20;
+ gBattle_BG2_X = var2;
+ if ((var2 << 16) == 0x1000000)
+ {
+ taskData[0]++;
+ }
+ }
+ else
+ {
+ int var2 = gBattle_BG1_X + 0x20;
+ gBattle_BG1_X = var2;
+ if ((var2 << 16) == 0x1000000)
+ {
+ taskData[0]++;
+ }
+ }
+ break;
+ case 3:
+ pssData.headerTextId = pssData.page + 1;
+ minus2 = pssData.mode - 2;
+ if (minus2 < 2)
+ {
+ pssData.headerActionTextId = 0;
+ sub_80A029C(&pssData.loadedMon);
+ sub_80A0428(&pssData.loadedMon, &pssData.selectedMoveIndex);
+ sub_80A00F4(pssData.selectedMoveIndex);
+ }
+ else
+ {
+ if (pssData.page >= PSS_PAGE_BATTLE_MOVES && (!pssData.disableMoveOrderEditing || pssData.mode == PSS_MODE_NO_MOVE_ORDER_EDIT))
+ {
+ pssData.headerActionTextId = 6;
+ }
+ else if (pssData.page == PSS_PAGE_INFO)
+ {
+ pssData.headerActionTextId = 7;
+ }
+ else
+ {
+ pssData.headerActionTextId = 0;
+ }
+ }
+
+ taskData[0]++;
+ break;
+ case 4:
+ DrawSummaryScreenNavigationDots();
+ PrintSummaryWindowHeaderText();
+ taskData[0]++;
+ break;
+ case 5:
+ sUnknown_083C1598[pssData.page](&pssData.loadedMon);
+ pssData.bgToggle ^= 1;
+ taskData[0]++;
+ break;
+ case 6:
+ if (sub_8055870() != TRUE)
+ {
+ gTasks[taskId].func = gUnknown_03005CF0;
+ }
+ break;
+ }
+}
+
+void sub_809F0D0(u8 taskId, s8 direction)
+{
+ pssData.page += direction;
+ gUnknown_03005CF0 = gTasks[taskId].func;
+ sub_809FBE4();
+ gTasks[taskId].data[0] = 0;
+
+ if (direction == -1)
+ {
+ gTasks[taskId].func = sub_809EC38;
+ }
+ else
+ {
+ gTasks[taskId].func = sub_809EE74;
+ gTasks[taskId].func(taskId);
+ }
+}
+
+static void SummaryScreenHandleLeftRightInput(u8 taskId, s8 direction)
+{
+ if (!GetMonData(&pssData.loadedMon, MON_DATA_IS_EGG))
+ {
+ if (direction == -1 && pssData.page == pssData.firstPage) return;
+ if (direction == 1 && pssData.page == pssData.lastPage) return;
+
+ if (FindTaskIdByFunc(sub_80A1334) == 0xFF && FindTaskIdByFunc(sub_80A1500) == 0xFF)
+ {
+ PlaySE(SE_SELECT);
+ sub_809F0D0(taskId, direction);
+ }
+ }
+}
+
+#ifdef NONMATCHING
+static void SummaryScreenHandleUpDownInput(u8 taskId, s8 direction)
+{
+ s8 var3;
+ u8 var1 = direction;
+
+ if (pssData.usingPC == TRUE)
+ {
+ if (pssData.page != PSS_PAGE_INFO)
+ {
+ var1 = (direction == 1) ? 0 : 1;
+ }
+ else
+ {
+ var1 = (direction == 1) ? 2 : 3;
+ }
+
+ var3 = StorageSystemGetNextMonIndex(pssData.monList.boxMons, pssData.monIndex, pssData.maxMonIndex, var1);
+ }
+ else
+ {
+ if (sub_80F9344() == TRUE && IsLinkDoubleBattle() == TRUE)
+ {
+ var3 = sub_809F3CC(var1);
+ }
+ else
+ {
+ var3 = sub_809F284(var1);
+ }
+ }
+
+ if (var3 != -1)
+ {
+ PlaySE(SE_SELECT);
+ if (GetMonStatusAndPokerus(&pssData.loadedMon))
+ {
+ sub_80A12D0(-2);
+ }
+
+ pssData.monIndex = var3;
+ pssData.unk84 = gTasks[taskId].func;
+ gTasks[taskId].func = sub_809F43C;
+ }
+}
+#else
+__attribute__((naked))
+static void SummaryScreenHandleUpDownInput(u8 taskId, s8 direction)
+{
+ asm(".syntax unified\n\
+ push {r4-r6,lr}\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ lsls r1, 24\n\
+ lsrs r4, r1, 24\n\
+ ldr r0, _0809F1E4 @ =gSharedMem + 0x18000\n\
+ ldrb r1, [r0, 0xE]\n\
+ adds r2, r0, 0\n\
+ cmp r1, 0x1\n\
+ bne _0809F202\n\
+ ldrb r0, [r2, 0xB]\n\
+ cmp r0, 0\n\
+ beq _0809F1E8\n\
+ lsls r1, r4, 24\n\
+ asrs r1, 24\n\
+ movs r4, 0x1\n\
+ eors r1, r4\n\
+ negs r0, r1\n\
+ orrs r0, r1\n\
+ lsrs r4, r0, 31\n\
+ b _0809F1F4\n\
+ .align 2, 0\n\
+_0809F1E4: .4byte gSharedMem + 0x18000\n\
+_0809F1E8:\n\
+ lsls r0, r4, 24\n\
+ asrs r0, 24\n\
+ movs r4, 0x3\n\
+ cmp r0, 0x1\n\
+ bne _0809F1F4\n\
+ movs r4, 0x2\n\
+_0809F1F4:\n\
+ ldr r0, [r2]\n\
+ ldrb r1, [r2, 0x9]\n\
+ ldrb r2, [r2, 0xA]\n\
+ adds r3, r4, 0\n\
+ bl StorageSystemGetNextMonIndex\n\
+ b _0809F22C\n\
+_0809F202:\n\
+ bl sub_80F9344\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0x1\n\
+ bne _0809F224\n\
+ bl IsLinkDoubleBattle\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0x1\n\
+ bne _0809F224\n\
+ lsls r0, r4, 24\n\
+ asrs r0, 24\n\
+ bl sub_809F3CC\n\
+ b _0809F22C\n\
+_0809F224:\n\
+ lsls r0, r4, 24\n\
+ asrs r0, 24\n\
+ bl sub_809F284\n\
+_0809F22C:\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ lsls r0, r4, 24\n\
+ asrs r0, 24\n\
+ movs r1, 0x1\n\
+ negs r1, r1\n\
+ cmp r0, r1\n\
+ beq _0809F270\n\
+ movs r0, 0x5\n\
+ bl PlaySE\n\
+ ldr r5, _0809F278 @ =gSharedMem + 0x18010\n\
+ adds r0, r5, 0\n\
+ bl GetMonStatusAndPokerus\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _0809F258\n\
+ movs r0, 0x2\n\
+ negs r0, r0\n\
+ bl sub_80A12D0\n\
+_0809F258:\n\
+ adds r0, r5, 0\n\
+ subs r0, 0x10\n\
+ strb r4, [r0, 0x9]\n\
+ ldr r1, _0809F27C @ =gTasks\n\
+ lsls r0, r6, 2\n\
+ adds r0, r6\n\
+ lsls r0, 3\n\
+ adds r0, r1\n\
+ ldr r1, [r0]\n\
+ str r1, [r5, 0x74]\n\
+ ldr r1, _0809F280 @ =sub_809F43C\n\
+ str r1, [r0]\n\
+_0809F270:\n\
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_0809F278: .4byte gSharedMem + 0x18010\n\
+_0809F27C: .4byte gTasks\n\
+_0809F280: .4byte sub_809F43C\n\
+ .syntax divided\n");
+}
+#endif // NONMATCHING
+
+#ifdef NONMATCHING
+s8 sub_809F284(s8 a)
+{
+ struct Pokemon *mons = pssData.monList.partyMons;
+ s8 r6 = 0;
+
+ if (pssData.page == PSS_PAGE_INFO)
+ {
+ if (a == -1 && pssData.monIndex == 0)
+ return -1;
+ if (a == 1 && pssData.monIndex >= pssData.maxMonIndex)
+ return -1;
+ return pssData.monIndex + a;
+ }
+ else
+ {
+ do
+ {
+ r6 += a;
+ if (pssData.monIndex + r6 < 0 || pssData.monIndex + r6 > pssData.maxMonIndex)
+ return -1;
+ } while (GetMonData(&mons[pssData.monIndex + r6], MON_DATA_IS_EGG) != 0);
+ return pssData.monIndex + r6;
+ }
+}
+#else
+__attribute__((naked))
+s8 sub_809F284(s8 a)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ lsls r0, 24\n\
+ lsrs r3, r0, 24\n\
+ ldr r0, _0809F2C0 @ =gSharedMem + 0x18000\n\
+ ldr r7, [r0]\n\
+ movs r6, 0\n\
+ ldrb r1, [r0, 0xB]\n\
+ adds r4, r0, 0\n\
+ cmp r1, 0\n\
+ bne _0809F2C4\n\
+ lsls r0, r3, 24\n\
+ asrs r2, r0, 24\n\
+ movs r1, 0x1\n\
+ negs r1, r1\n\
+ adds r5, r0, 0\n\
+ cmp r2, r1\n\
+ bne _0809F2AC\n\
+ ldrb r0, [r4, 0x9]\n\
+ cmp r0, 0\n\
+ beq _0809F2E4\n\
+_0809F2AC:\n\
+ asrs r0, r5, 24\n\
+ cmp r0, 0x1\n\
+ bne _0809F2BA\n\
+ ldrb r0, [r4, 0x9]\n\
+ ldrb r1, [r4, 0xA]\n\
+ cmp r0, r1\n\
+ bcs _0809F2E4\n\
+_0809F2BA:\n\
+ ldrb r0, [r4, 0x9]\n\
+ adds r0, r3\n\
+ b _0809F304\n\
+ .align 2, 0\n\
+_0809F2C0: .4byte gSharedMem + 0x18000\n\
+_0809F2C4:\n\
+ lsls r5, r3, 24\n\
+_0809F2C6:\n\
+ lsls r0, r6, 24\n\
+ asrs r0, 24\n\
+ asrs r1, r5, 24\n\
+ adds r0, r1\n\
+ lsls r0, 24\n\
+ ldr r4, _0809F2EC @ =gSharedMem + 0x18000\n\
+ lsrs r6, r0, 24\n\
+ asrs r0, 24\n\
+ ldrb r2, [r4, 0x9]\n\
+ adds r1, r0, r2\n\
+ cmp r1, 0\n\
+ blt _0809F2E4\n\
+ ldrb r0, [r4, 0xA]\n\
+ cmp r1, r0\n\
+ ble _0809F2F0\n\
+_0809F2E4:\n\
+ movs r0, 0x1\n\
+ negs r0, r0\n\
+ b _0809F308\n\
+ .align 2, 0\n\
+_0809F2EC: .4byte gSharedMem + 0x18000\n\
+_0809F2F0:\n\
+ movs r0, 0x64\n\
+ muls r0, r1\n\
+ adds r0, r7, r0\n\
+ movs r1, 0x2D\n\
+ bl GetMonData\n\
+ cmp r0, 0\n\
+ bne _0809F2C6\n\
+ ldrb r0, [r4, 0x9]\n\
+ adds r0, r6\n\
+_0809F304:\n\
+ lsls r0, 24\n\
+ asrs r0, 24\n\
+_0809F308:\n\
+ pop {r4-r7}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .syntax divided\n");
+}
+#endif // NONMATCHING
+
+bool8 sub_809F310(struct Pokemon *mon)
+{
+ if (GetMonData(mon, MON_DATA_SPECIES))
+ {
+ if (pssData.page != PSS_PAGE_INFO || !GetMonData(mon, MON_DATA_IS_EGG))
+ {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+s8 sub_809F344(u8 partyIndex)
+{
+ while (1)
+ {
+ partyIndex++;
+ if (partyIndex == PARTY_SIZE)
+ {
+ return -1;
+ }
+
+ if (sub_809F310(&gPlayerParty[sDoubleBattlePartyOrder[partyIndex]]) == TRUE)
+ {
+ return sDoubleBattlePartyOrder[partyIndex];
+ }
+ }
+}
+
+s8 sub_809F388(u8 partyIndex)
+{
+ while (1)
+ {
+ if (partyIndex == 0)
+ {
+ return -1;
+ }
+
+ partyIndex--;
+ if (sub_809F310(&gPlayerParty[sDoubleBattlePartyOrder[partyIndex]]) == TRUE)
+ {
+ return sDoubleBattlePartyOrder[partyIndex];
+ }
+ }
+}
+
+s8 sub_809F3CC(s8 direction)
+{
+ u8 i;
+ u8 monIndex = 0;
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ if (sDoubleBattlePartyOrder[i] == pssData.monIndex)
+ {
+ monIndex = i;
+ break;
+ }
+ }
+
+ if ((direction == -1 && monIndex == 0) || (direction == 1 && monIndex == 5))
+ {
+ return -1;
+ }
+
+ if (direction != 1)
+ {
+ return sub_809F388(monIndex);
+ }
+ else if (monIndex != 5)
+ {
+ return sub_809F344(monIndex);
+ }
+
+ return -1;
+}
+
+void sub_809F43C(u8 taskId)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ StopCryAndClearCrySongs();
+ gMain.state++;
+ break;
+ case 1:
+ DestroySpriteAndFreeResources(&gSprites[pssData.monSpriteId]);
+ gMain.state++;
+ break;
+ case 2:
+ DestroySpriteAndFreeResources(&gSprites[pssData.ballSpriteId]);
+ gMain.state++;
+ break;
+ case 3:
+ pssData.loadGfxState = 0;
+ pssData.selectedMoveIndex = 0;
+ gMain.state++;
+ break;
+ case 4:
+ sub_809F678(&pssData.loadedMon);
+ if (GetMonStatusAndPokerus(&pssData.loadedMon))
+ {
+ sub_80A12D0(2);
+ }
+
+ DrawPokerusSurvivorDot(&pssData.loadedMon);
+ gMain.state++;
+ break;
+ case 5:
+ if ((pssData.monSpriteId = sub_809F6B4(&pssData.loadedMon, &pssData.loadGfxState)) != 0xFF)
+ {
+ pssData.loadGfxState = 0;
+ if (GetMonData(&pssData.loadedMon, MON_DATA_IS_EGG))
+ {
+ gUnknown_030041B0 = 256;
+ }
+ else
+ {
+ gUnknown_030041B0 = 0;
+ }
+
+ gMain.state++;
+ }
+ break;
+ case 6:
+ sub_80A1DCC(&pssData.loadedMon);
+ gMain.state++;
+ break;
+ case 7:
+ sub_80A1DE8(&pssData.loadedMon);
+ gMain.state++;
+ break;
+ case 8:
+ if (sub_809F5F8())
+ {
+ pssData.loadGfxState = 0;
+ gMain.state++;
+ }
+ break;
+ default:
+ if (sub_8055870() != TRUE)
+ {
+ gMain.state = 0;
+ gTasks[taskId].func = pssData.unk84;
+ }
+ break;
+ }
+}
+
+static bool8 sub_809F5F8(void)
+{
+ if (pssData.loadGfxState == 0)
+ {
+ sub_809FAC8(&pssData.loadedMon);
+ pssData.loadGfxState++;
+ return FALSE;
+ }
+ else
+ {
+ sUnknown_083C1588[pssData.page](&pssData.loadedMon);
+ return TRUE;
+ }
+}
+
+static void sub_809F63C(struct Pokemon *mon)
+{
+ sub_809FE80();
+ sub_809FC34(mon);
+}
+
+static void sub_809F650(struct Pokemon *mon)
+{
+ sub_80A00A4();
+ sub_809FF64(mon);
+}
+
+static void sub_809F664(struct Pokemon *mon)
+{
+ sub_80A0390();
+ sub_80A015C(mon);
+}
+
+static void sub_809F678(struct Pokemon *mon)
+{
+ if (pssData.usingPC == FALSE)
+ {
+ struct Pokemon *mons = pssData.monList.partyMons;
+ *mon = mons[pssData.monIndex];
+ }
+ else
+ {
+ struct BoxPokemon *mons = pssData.monList.boxMons;
+ sub_803B4B4(&mons[pssData.monIndex], mon);
+ }
+}
+
+static u8 sub_809F6B4(struct Pokemon *mon, u8 *b)
+{
+ u16 species;
+ u32 personality;
+ u32 otId;
+ const struct CompressedSpritePalette *palette;
+
+ switch (*b)
+ {
+ default:
+ return sub_80A1808(mon);
+ case 0:
+ species = GetMonData(mon, MON_DATA_SPECIES2);
+ personality = GetMonData(mon, MON_DATA_PERSONALITY);
+
+ HandleLoadSpecialPokePic(
+ &gMonFrontPicTable[species],
+ gMonFrontPicCoords[species].coords,
+ gMonFrontPicCoords[species].y_offset,
+ ewram_addr,
+ gUnknown_081FAF4C[1],
+ species,
+ personality);
+ *b += 1;
+ return 0xFF;
+ case 1:
+ species = GetMonData(mon, MON_DATA_SPECIES2);
+ personality = GetMonData(mon, MON_DATA_PERSONALITY);
+ otId = GetMonData(mon, MON_DATA_OT_ID);
+
+ palette = GetMonSpritePalStructFromOtIdPersonality(species, otId, personality);
+ LoadCompressedObjectPalette(palette);
+ GetMonSpriteTemplate_803C56C(palette->tag, 1);
+ *b += 1;
+ return 0xFF;
+ }
+}
+
+static u16 GetMonMove(struct Pokemon *mon, u8 moveId)
+{
+ switch (moveId)
+ {
+ case 0:
+ return GetMonData(mon, MON_DATA_MOVE1);
+ case 1:
+ return GetMonData(mon, MON_DATA_MOVE2);
+ case 2:
+ return GetMonData(mon, MON_DATA_MOVE3);
+ default:
+ return GetMonData(mon, MON_DATA_MOVE4);
+ }
+}
+
+static u16 GetMonMovePP(struct Pokemon *mon, u8 moveId)
+{
+ switch (moveId)
+ {
+ case 0:
+ return GetMonData(mon, MON_DATA_PP1);
+ case 1:
+ return GetMonData(mon, MON_DATA_PP2);
+ case 2:
+ return GetMonData(mon, MON_DATA_PP3);
+ default:
+ return GetMonData(mon, MON_DATA_PP4);
+ }
+}
+
+static bool8 sub_809F7D0(u8 taskId)
+{
+ struct Pokemon mon;
+ u16 move;
+
+ sub_809F678(&mon);
+ move = GetMonMove(&mon, pssData.selectedMoveIndex);
+ if (IsHMMove(move) == TRUE && pssData.mode != PSS_MODE_UNKNOWN)
+ {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+void sub_809F814(u8 taskId)
+{
+ s16 *taskData = gTasks[taskId].data;
+
+ if (taskData[14] < 4)
+ {
+ taskData[14]++;
+ }
+ else if (gMain.newKeys & DPAD_UP)
+ {
+ gTasks[taskId].func = sub_809E260;
+ taskData[0] = 4;
+ taskData[13] = 1;
+ pssData.selectedMoveIndex = taskData[15];
+ sub_809E8F0(taskId, -1, &pssData.selectedMoveIndex);
+ }
+ else if (gMain.newKeys & DPAD_DOWN)
+ {
+ gTasks[taskId].func = sub_809E260;
+ taskData[0] = 4;
+ taskData[13] = 1;
+ pssData.selectedMoveIndex = taskData[15];
+ sub_809E8F0(taskId, 1, &pssData.selectedMoveIndex);
+ }
+ else if ((gMain.newKeys & DPAD_LEFT) || sub_80F9284() == 1)
+ {
+ if (pssData.page != PSS_PAGE_BATTLE_MOVES)
+ {
+ if (pssData.page == PSS_PAGE_CONTEST_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0))
+ {
+ MenuZeroFillWindowRect(0, 14, 9, 18);
+ }
+
+ gTasks[taskId].func = sub_809E260;
+
+ SummaryScreenHandleLeftRightInput(taskId, -1);
+ sub_80A1488(1, taskData[15]);
+ sub_80A1654(1, taskData[15]);
+ }
+ }
+ else if ((gMain.newKeys & DPAD_RIGHT) || sub_80F9284() == 2)
+ {
+ if (pssData.page != pssData.lastPage)
+ {
+ if (pssData.page == PSS_PAGE_BATTLE_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0))
+ {
+ MenuZeroFillWindowRect(0, 14, 9, 18);
+ }
+
+ gTasks[taskId].func = sub_809E260;
+
+ SummaryScreenHandleLeftRightInput(taskId, 1);
+ sub_80A1488(1, taskData[15]);
+ sub_80A1654(1, taskData[15]);
+ }
+ }
+ else if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON))
+ {
+ sub_80A1488(2, taskData[15]);
+ sub_80A1654(2, taskData[15]);
+
+ gTasks[taskId].func = sub_809E260;
+ }
+}
+
+static void sub_809F9D0(u8 taskId, u8 b)
+{
+ s16 *taskData = gTasks[taskId].data;
+ taskData[14] = 0;
+ taskData[15] = b;
+
+ sub_80A1488(-2, 4);
+ sub_80A1654(-2, 4);
+ MenuZeroFillWindowRect(11, 15, 28, 18);
+ MenuPrint(gOtherText_CantForgetHMs, 11, 15);
+
+ gTasks[taskId].func = sub_809F814;
+}
+
+u8 sub_809FA30(void)
+{
+ return pssData.switchMoveIndex;
+}
+
+// void GetStringCenterAlignXOffsetWithLetterSpacing(u8 a, u8 b, u8 c, u8 d)
+// {
+// u16 *vramAddr = (u16 *)(VRAM + 0xF000);
+
+// vramAddr[(d * 32) + c] = (b * 0x1000) + (a * 2) + 0x200 + 0x80;
+// vramAddr[(d * 32) + c + 32] = (b * 0x1000) + (a * 2) + 0x200 + 0x81;
+// }
+__attribute__((naked))
+void GetStringCenterAlignXOffsetWithLetterSpacing(u8 a, u8 b, u8 c, u8 d)
+{
+ asm(".syntax unified\n\
+ push {r4,lr}\n\
+ lsls r0, 24\n\
+ lsls r1, 24\n\
+ lsls r2, 24\n\
+ lsls r3, 24\n\
+ lsrs r2, 23\n\
+ lsrs r3, 18\n\
+ ldr r4, _0809FA70 @ =0x0600f000\n\
+ adds r3, r4\n\
+ adds r2, r3\n\
+ lsrs r1, 12\n\
+ lsrs r0, 23\n\
+ movs r4, 0x80\n\
+ lsls r4, 2\n\
+ adds r3, r4, 0\n\
+ adds r0, r3\n\
+ adds r1, r0\n\
+ adds r0, r1, 0\n\
+ adds r0, 0x80\n\
+ strh r0, [r2]\n\
+ adds r2, 0x40\n\
+ adds r1, 0x81\n\
+ strh r1, [r2]\n\
+ pop {r4}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_0809FA70: .4byte 0x0600f000\n\
+ .syntax divided\n");
+}
+
+void GetStringCenterAlignXOffset(u8 a, u8 b, u8 c)
+{
+ GetStringCenterAlignXOffsetWithLetterSpacing(a, 15, b, c);
+}
+
+bool8 sub_809FA94(struct Pokemon *mon)
+{
+ if (!IsShiny(mon))
+ {
+ LoadPalette(sUnknown_083C157C, 4, 2);
+ return FALSE;
+ }
+ else
+ {
+ LoadPalette(sUnknown_083C157E, 4, 2);
+ return TRUE;
+ }
+}
+
+static void sub_809FAC8(struct Pokemon *mon)
+{
+ bool8 shinyDexNum;
+ u16 dexNum;
+ u8 *buffer;
+
+ if (GetMonData(mon, MON_DATA_IS_EGG))
+ {
+ MenuZeroFillWindowRect(1, 2, 4, 3);
+ MenuZeroFillWindowRect(3, 16, 9, 17);
+ MenuZeroFillWindowRect(0, 12, 11, 15);
+ GetMonNickname(mon, gStringVar1);
+ sub_80A1FF8(gStringVar1, 13, 3, 16);
+ LoadPalette(sUnknown_083C157C, 4, 2);
+ }
+ else
+ {
+ shinyDexNum = sub_809FA94(mon);
+ dexNum = SpeciesToPokedexNum(GetMonData(mon, MON_DATA_SPECIES));
+ if (dexNum != 0xFFFF)
+ {
+ if (!shinyDexNum)
+ {
+ GetStringCenterAlignXOffset(2, 1, 2);
+ sub_80A1F98(dexNum, 13, 3, 2, 17, 16, 1);
+ }
+ else
+ {
+ GetStringCenterAlignXOffsetWithLetterSpacing(2, 8, 1, 2);
+ sub_80A1F98(dexNum, 8, 3, 2, 17, 16, 1);
+ }
+ }
+ else
+ {
+ MenuZeroFillWindowRect(1, 2, 4, 3);
+ }
+
+ buffer = gStringVar1;
+ buffer = sub_80A1E58(buffer, 13);
+ buffer = GetMonNickname(mon, buffer);
+ buffer[0] = EXT_CTRL_CODE_BEGIN;
+ buffer[1] = 0x13;
+ buffer[2] = 0x3C;
+ buffer[3] = EOS;
+ MenuPrint(gStringVar1, 1, 12);
+
+ sub_80A0958(mon);
+ }
+}
+
+static void sub_809FBE4(void)
+{
+ u8 i;
+
+ for (i = 0; i < 28; i++)
+ {
+ sub_80A1918(i, 1);
+ }
+
+ MenuZeroFillWindowRect(11, 4, 29, 18);
+}
+
+static void sub_809FC0C(void)
+{
+ MenuPrint(gOtherText_Type2, 11, 6);
+ GetStringCenterAlignXOffset(0, 22, 4);
+ GetStringCenterAlignXOffset(2, 23, 4);
+}
+
+static void sub_809FC34(struct Pokemon *mon)
+{
+ u8 i;
+ u8 *buffer;
+ u16 friendship;
+ u8 language;
+ u16 species;
+ u8 ability;
+
+ for (i = 0; i < 5; i++)
+ {
+ sub_80A1918(i, 1);
+ }
+
+ MenuZeroFillWindowRect(11, 9, 28, 12);
+ if (GetMonData(mon, MON_DATA_IS_EGG))
+ {
+ buffer = gStringVar1;
+ buffer = sub_80A1E58(buffer, 13);
+ buffer = StringCopy(buffer, gOtherText_OriginalTrainer);
+ buffer = StringCopy(buffer, gOtherText_FiveQuestionsAndSlash);
+ buffer[0] = EXT_CTRL_CODE_BEGIN;
+ buffer[1] = 0x13;
+ buffer[2] = 0x4E;
+ buffer[3] = EOS;
+ MenuPrint(gStringVar1, 11, 4);
+
+ sub_80A1EF8(gOtherText_FiveQuestionsAndSlash, 13, 193, 32, 1);
+ sub_80A198C(9, 120, 48, 0);
+
+ friendship = GetMonData(mon, MON_DATA_FRIENDSHIP);
+ if (friendship < 6)
+ {
+ MenuPrint(gOtherText_EggAbout, 11, 9);
+ }
+ else if (friendship < 11)
+ {
+ MenuPrint(gOtherText_EggSoon, 11, 9);
+ }
+ else if (friendship < 41)
+ {
+ MenuPrint(gOtherText_EggSomeTime, 11, 9);
+ }
+ else
+ {
+ MenuPrint(gOtherText_EggLongTime, 11, 9);
+ }
+
+ PokemonSummaryScreen_PrintEggTrainerMemo(mon, 11, 14);
+ }
+ else
+ {
+ GetMonData(mon, MON_DATA_OT_NAME, gStringVar2);
+ language = GetMonData(mon, MON_DATA_LANGUAGE);
+ ConvertInternationalString(gStringVar2, language);
+
+ buffer = gStringVar1;
+ buffer = sub_80A1E58(buffer, 13);
+ buffer = StringCopy(buffer, gOtherText_OriginalTrainer);
+
+ if (GetMonData(mon, MON_DATA_OT_GENDER) == MALE)
+ {
+ buffer = sub_80A1E58(buffer, 9);
+ }
+ else
+ {
+ buffer = sub_80A1E58(buffer, 10);
+ }
+
+ buffer = StringCopy(buffer, gStringVar2);
+ buffer[0] = EXT_CTRL_CODE_BEGIN;
+ buffer[1] = 0x13;
+ buffer[2] = 0x4E;
+ buffer[3] = EOS;
+ MenuPrint(gStringVar1, 11, 4);
+
+ sub_80A1F98(GetMonData(mon, MON_DATA_OT_ID) & 0xFFFF, 13, 5, 2, 193, 32, 1);
+
+ species = GetMonData(mon, MON_DATA_SPECIES);
+ sub_80A198C(gBaseStats[species].type1, 120, 48, 0);
+ if (gBaseStats[species].type1 != gBaseStats[species].type2)
+ {
+ sub_80A198C(gBaseStats[species].type2, 160, 48, 1);
+ }
+
+ ability = GetAbilityBySpecies(GetMonData(mon, MON_DATA_SPECIES), GetMonData(mon, MON_DATA_ALT_ABILITY));
+ sub_80A1FF8(gAbilityNames[ability], 13, 11, 9);
+ MenuPrint(gAbilityDescriptions[ability], 11, 11);
+
+ PokemonSummaryScreen_PrintTrainerMemo(mon, 11, 14);
+ }
+}
+
+static void sub_809FE6C(struct Pokemon *mon)
+{
+ sub_809FC0C();
+ sub_809FC34(mon);
+}
+
+static void sub_809FE80(void)
+{
+ MenuZeroFillWindowRect(14, 4, 18, 5);
+ MenuZeroFillWindowRect(25, 4, 30, 5);
+ MenuZeroFillWindowRect(11, 9, 28, 12);
+ MenuZeroFillWindowRect(11, 14, 28, 17);
+}
+
+static void sub_809FEB8(void)
+{
+ sub_80A1FF8(gOtherText_ExpPoints, 13, 11, 14);
+ sub_80A1FF8(gOtherText_NextLv, 13, 11, 16);
+ MenuPrint(gOtherText_Terminator18, 21, 16);
+
+ sub_80A1F48(gOtherText_HP, 13, 11, 7, 42);
+ sub_80A1F48(gOtherText_Attack, 13, 11, 9, 42);
+ sub_80A1F48(gOtherText_Defense, 13, 11, 11, 42);
+ sub_80A1F48(gOtherText_SpAtk, 13, 22, 7, 36);
+ sub_80A1F48(gOtherText_SpDef, 13, 22, 9, 36);
+ sub_80A1F48(gOtherText_Speed, 13, 22, 11, 36);
+}
+
+static void sub_809FF64(struct Pokemon *mon)
+{
+ u8 i;
+ u16 heldItem;
+ u8 *buffer;
+
+ for (i = 0; i < 5; i++)
+ {
+ sub_80A1918(i, 1);
+ }
+
+ heldItem = GetMonData(mon, MON_DATA_HELD_ITEM);
+ PrintHeldItemName(heldItem, 11, 4);
+ PrintNumRibbons(mon);
+
+ buffer = gStringVar1;
+
+ ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_EXP));
+ MenuPrint_RightAligned(buffer, 29, 14);
+ DrawExperienceProgressBar(mon, 23, 16);
+
+ ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_ATK));
+ sub_8072BD8(buffer, 16, 9, 50);
+
+ ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_DEF));
+ sub_8072BD8(buffer, 16, 11, 50);
+
+ ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_SPATK));
+ sub_8072BD8(buffer, 27, 7, 18);
+
+ ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_SPDEF));
+ sub_8072BD8(buffer, 27, 9, 18);
+
+ ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_SPEED));
+ sub_8072BD8(buffer, 27, 11, 18);
+
+ buffer = sub_8072C14(buffer, GetMonData(mon, MON_DATA_HP), 24, 1);
+ *buffer++ = CHAR_SLASH;
+ buffer = sub_8072C14(buffer, GetMonData(mon, MON_DATA_MAX_HP), 48, 1);
+
+ MenuPrint_PixelCoords(gStringVar1, 126, 56, 1);
+}
+
+static void sub_80A0090(struct Pokemon *mon)
+{
+ sub_809FEB8();
+ sub_809FF64(mon);
+}
+
+static void sub_80A00A4(void)
+{
+ MenuZeroFillWindowRect(11, 4, 19, 5);
+ MenuZeroFillWindowRect(16, 7, 21, 8);
+ MenuZeroFillWindowRect(17, 9, 21, 12);
+ MenuZeroFillWindowRect(27, 7, 29, 12);
+ MenuZeroFillWindowRect(22, 14, 28, 15);
+ MenuZeroFillWindowRect(23, 16, 28, 17);
+}
+
+static void sub_80A00F4(u8 a)
+{
+ if (pssData.moveToLearn != 0 || a != 4)
+ {
+ if (pssData.page == PSS_PAGE_BATTLE_MOVES)
+ {
+ sub_80A1FF8(gOtherText_Power2, 13, 1, 15);
+ sub_80A1FF8(gOtherText_Accuracy2, 13, 1, 17);
+ }
+ else
+ {
+ sub_80A1FF8(gOtherText_Appeal2, 13, 1, 15);
+ sub_80A1FF8(gOtherText_Jam2, 13, 1, 17);
+ }
+ }
+}
+
+static void sub_80A015C(struct Pokemon *mon)
+{
+ u8 i;
+ u16 move;
+ u16 curPP;
+ u8 ppBonuses;
+ u8 maxPP;
+ u8 *buffer;
+
+ for (i = 0; i < 4; i++)
+ {
+ move = GetMonMove(mon, i);
+ curPP = GetMonMovePP(mon, i);
+
+ if (move == 0)
+ {
+ sub_80A1918(i, 1);
+ sub_80A1FF8(gOtherText_OneDash, 13, 15, (2 * i) + 4);
+ MenuPrint(gOtherText_TwoDashes, 26, (2 * i) + 4);
+ }
+ else
+ {
+ if (pssData.page == PSS_PAGE_BATTLE_MOVES)
+ {
+ sub_80A198C(gBattleMoves[move].type, 87, ((2 * i) + 4) * 8, i);
+ }
+ else
+ {
+ sub_80A198C(gContestMoves[move].contestCategory + 18, 87, ((2 * i) + 4) * 8, i);
+ }
+
+ sub_80A1FF8(gMoveNames[move], 13, 15, (2 * i) + 4);
+ GetStringCenterAlignXOffset(1, 24, (2 * i) + 4);
+
+ ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES);
+ maxPP = CalculatePPWithBonus(move, ppBonuses, i);
+
+ buffer = gStringVar1;
+ buffer = sub_8072C14(buffer, curPP, 14, 1);
+ *buffer++ = CHAR_SLASH;
+ sub_8072C14(buffer, maxPP, 32, 1);
+ MenuPrint(gStringVar1, 25, (2 * i) + 4);
+ }
+ }
+}
+
+static void sub_80A029C(struct Pokemon *mon)
+{
+ u8 *buffer;
+ u16 move;
+ u8 pp;
+
+ if (pssData.moveToLearn == 0)
+ {
+ sub_80A1FF8(gOtherText_CancelNoTerminator, 13, 15, 12);
+ return;
+ }
+
+ move = pssData.moveToLearn;
+
+ if (pssData.page == PSS_PAGE_BATTLE_MOVES)
+ sub_80A198C(gBattleMoves[move].type, 87, 96, 4);
+ else
+ sub_80A198C(gContestMoves[move].contestCategory + 18, 87, 96, 4);
+
+ if (pssData.page == PSS_PAGE_BATTLE_MOVES)
+ sub_80A1FF8(gMoveNames[move], 10, 15, 12);
+ else
+ sub_80A1FF8(gMoveNames[move], 9, 15, 12);
+
+ GetStringCenterAlignXOffset(1, 24, 12);
+
+ buffer = gStringVar1;
+ pp = gBattleMoves[move].pp;
+ buffer = sub_8072C14(buffer, pp, 14, 1);
+ *buffer++ = CHAR_SLASH;
+ buffer = sub_8072C14(buffer, pp, 32, 1);
+ MenuPrint(gStringVar1, 25, 12);
+}
+
+static void sub_80A0390(void)
+{
+ u8 i;
+
+ for (i = 0; i < MAX_MON_MOVES; i++)
+ {
+ MenuZeroFillWindowRect(15, (i * 2) + 4, 28, (i * 2) + 5);
+ }
+}
+
+u16 sub_80A03BC(struct Pokemon *mon, u8 selectedMoveIndex)
+{
+ u16 move;
+
+ if (selectedMoveIndex != MAX_MON_MOVES)
+ {
+ move = GetMonMove(mon, selectedMoveIndex);
+ }
+ else
+ {
+ if (pssData.moveToLearn != 0)
+ {
+ move = pssData.moveToLearn;
+ }
+ else
+ {
+ move = 0xFFFF;
+ }
+ }
+
+ return move;
+}
+
+void sub_80A03F0(struct Pokemon *mon, u8 *selectedMoveIndex)
+{
+ u16 move = sub_80A03BC(mon, *selectedMoveIndex);
+
+ if (pssData.page == PSS_PAGE_BATTLE_MOVES)
+ {
+ sub_80A04CC(move);
+ sub_80A057C(0xFFFF);
+ }
+ else
+ {
+ sub_80A057C(move);
+ }
+}
+
+static void sub_80A0428(struct Pokemon *mon, u8 *selectedMoveIndex)
+{
+ u16 move = sub_80A03BC(mon, *selectedMoveIndex);
+ MenuZeroFillWindowRect(11, 15, 28, 18);
+
+ if (pssData.page == PSS_PAGE_BATTLE_MOVES)
+ {
+ sub_80A046C(move);
+ }
+ else
+ {
+ sub_80A0498(move);
+ }
+
+ sub_80A03F0(mon, selectedMoveIndex);
+}
+
+static void sub_80A046C(u16 move)
+{
+ if (move == 0xFFFF) return;
+
+ MenuPrint(gMoveDescriptions[move - 1], 11, 15);
+}
+
+static void sub_80A0498(u16 move)
+{
+ if (move == 0xFFFF) return;
+
+ MenuPrint(gContestEffectStrings[gContestMoves[move].effect], 11, 15);
+}
+
+static void sub_80A04CC(u16 move)
+{
+ u8 *buffer;
+
+ if (move == 0xFFFF) return;
+
+ if (gBattleMoves[move].power <= 1)
+ {
+ buffer = gStringVar1;
+ buffer = sub_8072C74(buffer, gOtherText_ThreeDashes2, 21, 1);
+ MenuPrint(gStringVar1, 7, 15);
+ }
+ else
+ {
+ buffer = gStringVar1;
+ buffer = sub_8072C14(buffer, gBattleMoves[move].power, 21, 1);
+ MenuPrint(gStringVar1, 7, 15);
+ }
+
+ if (gBattleMoves[move].accuracy == 0)
+ {
+ buffer = gStringVar1;
+ buffer = sub_8072C74(buffer, gOtherText_ThreeDashes2, 21, 1);
+ MenuPrint(gStringVar1, 7, 17);
+ }
+ else
+ {
+ buffer = gStringVar1;
+ buffer = sub_8072C14(buffer, gBattleMoves[move].accuracy, 21, 1);
+ MenuPrint(gStringVar1, 7, 17);
+ }
+}
+
+#ifdef NONMATCHING // The two vramAddr lines are non-matching.
+static void sub_80A057C(u16 move)
+{
+ u8 appeal;
+ u8 jam;
+ u8 i;
+ u16 *vramAddr = (u16 *)(VRAM + 0x6800);
+
+ if (move == 0xFFFF) return;
+
+ appeal = gContestEffects[gContestMoves[move].effect].appeal;
+ if (appeal != 0xFF)
+ {
+ appeal = appeal / 10;
+ }
+
+ for (i = 0; i < 8; i++)
+ {
+ u16 tile = 0x1039;
+ int and = 3;
+ int offset = 0x3CC / 2;
+ if (appeal != 0xFF && i < appeal)
+ {
+ tile = 0x103A;
+ }
+
+ *(&vramAddr[(i >> 2 << 5) + (i & and)] + offset) = tile;
+ }
+
+ if (move == 0xFFFF) return;
+
+ jam = gContestEffects[gContestMoves[move].effect].jam;
+ if (jam != 0xFF)
+ {
+ jam = jam / 10;
+ }
+
+ for (i = 0; i < 8; i++)
+ {
+ u16 tile = 0x103D;
+ int and = 3;
+ int offset = 0x226;
+ if (jam != 0xFF && i < jam)
+ {
+ tile = 0x103C;
+ }
+
+ *(&vramAddr[(i >> 2 << 5) + (i & and)] + offset) = tile;
+ }
+}
+#else
+__attribute__((naked))
+static void sub_80A057C(u16 move)
+{
+ 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\
+ lsls r0, 16\n\
+ lsrs r5, r0, 16\n\
+ ldr r0, _080A0648 @ =0x06006800\n\
+ mov r8, r0\n\
+ ldr r0, _080A064C @ =0x0000ffff\n\
+ cmp r5, r0\n\
+ beq _080A063A\n\
+ ldr r1, _080A0650 @ =gContestEffects\n\
+ ldr r2, _080A0654 @ =gContestMoves\n\
+ lsls r3, r5, 3\n\
+ adds r0, r3, r2\n\
+ ldrb r0, [r0]\n\
+ lsls r0, 2\n\
+ adds r0, r1\n\
+ ldrb r4, [r0, 0x1]\n\
+ mov r10, r2\n\
+ mov r9, r3\n\
+ cmp r4, 0xFF\n\
+ beq _080A05B8\n\
+ adds r0, r4, 0\n\
+ movs r1, 0xA\n\
+ bl __udivsi3\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+_080A05B8:\n\
+ movs r2, 0\n\
+ movs r7, 0x3\n\
+ movs r6, 0xF3\n\
+ lsls r6, 2\n\
+_080A05C0:\n\
+ ldr r3, _080A0658 @ =0x00001039\n\
+ cmp r4, 0xFF\n\
+ beq _080A05CC\n\
+ cmp r2, r4\n\
+ bcs _080A05CC\n\
+ adds r3, 0x1\n\
+_080A05CC:\n\
+ lsrs r0, r2, 2\n\
+ lsls r0, 5\n\
+ adds r1, r2, 0\n\
+ ands r1, r7\n\
+ adds r1, r0\n\
+ lsls r1, 1\n\
+ add r1, r8\n\
+ adds r1, r6\n\
+ strh r3, [r1]\n\
+ adds r0, r2, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r2, r0, 24\n\
+ cmp r2, 0x7\n\
+ bls _080A05C0\n\
+ ldr r0, _080A064C @ =0x0000ffff\n\
+ cmp r5, r0\n\
+ beq _080A063A\n\
+ mov r0, r9\n\
+ add r0, r10\n\
+ ldrb r0, [r0]\n\
+ lsls r0, 2\n\
+ ldr r1, _080A0650 @ =gContestEffects\n\
+ adds r0, r1\n\
+ ldrb r4, [r0, 0x2]\n\
+ cmp r4, 0xFF\n\
+ beq _080A060C\n\
+ adds r0, r4, 0\n\
+ movs r1, 0xA\n\
+ bl __udivsi3\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+_080A060C:\n\
+ movs r2, 0\n\
+ movs r6, 0x3\n\
+ ldr r5, _080A065C @ =0x0000044c\n\
+_080A0612:\n\
+ ldr r3, _080A0660 @ =0x0000103d\n\
+ cmp r4, 0xFF\n\
+ beq _080A061E\n\
+ cmp r2, r4\n\
+ bcs _080A061E\n\
+ subs r3, 0x1\n\
+_080A061E:\n\
+ lsrs r0, r2, 2\n\
+ lsls r0, 5\n\
+ adds r1, r2, 0\n\
+ ands r1, r6\n\
+ adds r1, r0\n\
+ lsls r1, 1\n\
+ add r1, r8\n\
+ adds r1, r5\n\
+ strh r3, [r1]\n\
+ adds r0, r2, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r2, r0, 24\n\
+ cmp r2, 0x7\n\
+ bls _080A0612\n\
+_080A063A:\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\
+_080A0648: .4byte 0x06006800\n\
+_080A064C: .4byte 0x0000ffff\n\
+_080A0650: .4byte gContestEffects\n\
+_080A0654: .4byte gContestMoves\n\
+_080A0658: .4byte 0x00001039\n\
+_080A065C: .4byte 0x0000044c\n\
+_080A0660: .4byte 0x0000103d\n\
+ .syntax divided\n");
+}
+#endif // NONMATCHING
+
+bool8 PokemonSummaryScreen_CheckOT(struct Pokemon *mon)
+{
+ u32 trainerId;
+
+ if (ewram18000_3 == gEnemyParty)
+ {
+ u8 enemyId = GetMultiplayerId() ^ 1;
+ trainerId = gLinkPlayers[enemyId].trainerId & 0xFFFF;
+ StringCopy(gStringVar1, gLinkPlayers[enemyId].name);
+ StripExtCtrlCodes(gStringVar1);
+ }
+ else
+ {
+ trainerId = GetPlayerTrainerId() & 0xFFFF;
+ StringCopy(gStringVar1, gSaveBlock2.playerName);
+ }
+
+ if (trainerId != (GetMonData(mon, MON_DATA_OT_ID) & 0xFFFF))
+ return FALSE;
+
+ GetMonData(mon, MON_DATA_OT_NAME, gStringVar2);
+
+ if (!StringCompareWithoutExtCtrlCodes(gStringVar1, gStringVar2))
+ return TRUE;
+
+ return FALSE;
+}
+
+static void PokemonSummaryScreen_PrintEggTrainerMemo(struct Pokemon *mon, u8 left, u8 top)
+{
+ u8 locationMet;
+ u8 gameMet = GetMonData(mon, MON_DATA_MET_GAME);
+
+ if (!(gameMet == VERSION_RUBY || gameMet == VERSION_SAPPHIRE || gameMet == VERSION_EMERALD))
+ {
+ MenuPrint(gOtherText_EggObtainedInTrade, left, top);
+ return;
+ }
+
+ locationMet = GetMonData(mon, MON_DATA_MET_LOCATION);
+
+ if (locationMet == 255)
+ {
+ // Eggs received from Pokemon Box.
+ MenuPrint(gOtherText_EggNicePlace, left, top);
+ return;
+ }
+
+ if (!PokemonSummaryScreen_CheckOT(mon))
+ {
+ MenuPrint(gOtherText_EggObtainedInTrade, left, top);
+ return;
+ }
+
+ asm(""); // needed to match for some reason
+
+ if (locationMet == 253)
+ {
+ MenuPrint(gOtherText_EggHotSprings, left, top);
+ return;
+ }
+
+ MenuPrint(gOtherText_EggDayCare, left, top);
+}
+
+static void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *mon, u8 left, u8 top)
+{
+ u8 locationMet;
+ u8 gameMet;
+ u8 *ptr = gStringVar4;
+ u8 nature = GetNature(mon);
+
+#if ENGLISH
+ ptr = sub_80A1E9C(ptr, gNatureNames[nature], 14);
+
+ if (nature != NATURE_BOLD && nature != NATURE_GENTLE)
+ {
+ ptr = StringCopy(ptr, gOtherText_Terminator4);
+ }
+
+ ptr = StringCopy(ptr, gOtherText_Nature);
+#elif GERMAN
+ ptr = StringCopy(gStringVar4, gOtherText_Nature);
+ ptr = sub_80A1E9C(ptr, gNatureNames[nature], 14);
+ ptr = StringCopy(ptr, gOtherText_Terminator4);
+#endif
+
+ if (PokemonSummaryScreen_CheckOT(mon) == TRUE)
+ {
+ locationMet = GetMonData(mon, MON_DATA_MET_LOCATION);
+
+ if (GetMonData(mon, MON_DATA_MET_LEVEL) == 0)
+ {
+ ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, 5);
+ *ptr = CHAR_NEWLINE;
+ ptr++;
+
+ CopyLocationName(gStringVar1, locationMet);
+ ptr = sub_80A1E9C(ptr, gStringVar1, 14);
+ StringCopy(ptr, gOtherText_Egg2);
+ }
+ else if (locationMet >= 88)
+ {
+ *ptr = CHAR_NEWLINE;
+ ptr++;
+
+ StringCopy(ptr, gOtherText_ObtainedInTrade);
+ }
+ else
+ {
+ u8 levelMet = GetMonData(mon, MON_DATA_MET_LEVEL);
+
+ ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, levelMet);
+ *ptr = CHAR_NEWLINE;
+ ptr++;
+
+ CopyLocationName(gStringVar1, locationMet);
+ ptr = sub_80A1E9C(ptr, gStringVar1, 14);
+ StringCopy(ptr, gOtherText_Met);
+ }
+ }
+ else
+ {
+ gameMet = GetMonData(mon, MON_DATA_MET_GAME);
+
+ if (!(gameMet == VERSION_RUBY || gameMet == VERSION_SAPPHIRE || gameMet == VERSION_EMERALD))
+ {
+ *ptr = CHAR_NEWLINE;
+ ptr++;
+
+ StringCopy(ptr, gOtherText_ObtainedInTrade);
+ }
+ else
+ {
+ locationMet = GetMonData(mon, MON_DATA_MET_LOCATION);
+ if (locationMet == 0xFF)
+ {
+ u8 levelMet = GetMonData(mon, MON_DATA_MET_LEVEL);
+
+ ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, levelMet);
+ *ptr = CHAR_NEWLINE;
+ ptr++;
+
+ StringCopy(ptr, gOtherText_FatefulEncounter);
+ }
+ else if (locationMet >= 88)
+ {
+ *ptr = CHAR_NEWLINE;
+ ptr++;
+
+ StringCopy(ptr, gOtherText_ObtainedInTrade);
+ }
+ else
+ {
+ u8 levelMet = GetMonData(mon, MON_DATA_MET_LEVEL);
+
+ ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, levelMet);
+ *ptr = CHAR_NEWLINE;
+ ptr++;
+
+ CopyLocationName(gStringVar1, locationMet);
+ ptr = sub_80A1E9C(ptr, gStringVar1, 14);
+ StringCopy(ptr, gOtherText_Met2);
+ }
+ }
+ }
+
+ MenuPrint(gStringVar4, left++, top++);
+}
+
+static void sub_80A0958(struct Pokemon *mon)
+{
+ u16 species;
+ u8 *buffer;
+ u8 level;
+
+ species = GetMonData(mon, MON_DATA_SPECIES);
+
+ buffer = gStringVar1;
+ buffer = sub_80A1E58(buffer, 13);
+ buffer[0] = EXT_CTRL_CODE_BEGIN;
+ buffer[1] = 0x11;
+ buffer[2] = 0x7;
+ buffer[3] = CHAR_SLASH;
+ buffer += 4;
+ buffer = StringCopy(buffer, gSpeciesNames[species]);
+
+ buffer[0] = EXT_CTRL_CODE_BEGIN;
+ buffer[1] = 0x13;
+ buffer[2] = 0x50;
+ buffer[3] = EOS;
+
+ MenuPrint(gStringVar1, 0, 14);
+ MenuZeroFillWindowRect(3, 16, 9, 17);
+
+ level = GetMonData(mon, MON_DATA_LEVEL);
+
+ buffer = sub_80A1E58(gStringVar1, 13);
+ buffer[0] = 0x34;
+ buffer += 1;
+ buffer = ConvertIntToDecimalString(buffer, level);
+
+ buffer[0] = EXT_CTRL_CODE_BEGIN;
+ buffer[1] = 0x13;
+ buffer[2] = 0x20;
+ buffer[3] = EOS;
+
+ MenuPrint(gStringVar1, 3, 16);
+ sub_80A0A2C(mon, 7, 16);
+}
+
+static void sub_80A0A2C(struct Pokemon *mon, u8 left, u8 top)
+{
+ const u8 *genderSymbol;
+ u8 var1;
+ u8 bottom;
+ u16 species = GetMonData(mon, MON_DATA_SPECIES2);
+
+ if (species != SPECIES_NIDORAN_M && species != SPECIES_NIDORAN_F)
+ {
+ u8 gender = GetMonGender(mon);
+ switch (gender)
+ {
+ default:
+ bottom = top + 1;
+ MenuZeroFillWindowRect(left, top, left, bottom);
+ return;
+ case MON_MALE:
+ genderSymbol = gOtherText_MaleSymbol2;
+ var1 = 11;
+ break;
+ case MON_FEMALE:
+ genderSymbol = gOtherText_FemaleSymbolAndLv;
+ var1 = 12;
+ break;
+ }
+
+ sub_80A1FF8(genderSymbol, var1, left, top);
+ }
+}
+
+u8 GetNumRibbons(struct Pokemon *mon)
+{
+ u8 numRibbons = GetMonData(mon, MON_DATA_COOL_RIBBON);
+ numRibbons += GetMonData(mon, MON_DATA_BEAUTY_RIBBON);
+ numRibbons += GetMonData(mon, MON_DATA_CUTE_RIBBON);
+ numRibbons += GetMonData(mon, MON_DATA_SMART_RIBBON);
+ numRibbons += GetMonData(mon, MON_DATA_TOUGH_RIBBON);
+ numRibbons += GetMonData(mon, MON_DATA_CHAMPION_RIBBON);
+ numRibbons += GetMonData(mon, MON_DATA_WINNING_RIBBON);
+ numRibbons += GetMonData(mon, MON_DATA_VICTORY_RIBBON);
+ numRibbons += GetMonData(mon, MON_DATA_ARTIST_RIBBON);
+ numRibbons += GetMonData(mon, MON_DATA_EFFORT_RIBBON);
+ numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_1);
+ numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_2);
+ numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_3);
+ numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_4);
+ numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_5);
+ numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_6);
+ numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_7);
+
+ return numRibbons;
+}
+
+static void PrintNumRibbons(struct Pokemon *mon)
+{
+ u8 numRibbons = GetNumRibbons(mon);
+
+ if (numRibbons == 0)
+ {
+ StringCopy(gStringVar1, gOtherText_None);
+ }
+ else
+ {
+ u8 ribbonsStringLength;
+ u8 *text;
+
+ StringCopy(gStringVar1, gOtherText_Ribbons00);
+ ribbonsStringLength = StringLength(gStringVar1);
+
+ text = &gStringVar1[ribbonsStringLength - 2];
+
+ text[0] = EXT_CTRL_CODE_BEGIN;
+ text[1] = 0x14;
+ text[2] = 6;
+ ConvertIntToDecimalStringN(&text[3], numRibbons, 1, 2);
+ }
+
+ MenuPrint(sUnknown_083C15AE, 21, 4);
+}
+
+static void PrintHeldItemName(u16 itemId, u8 left, u8 top)
+{
+ if (itemId == ITEM_ENIGMA_BERRY
+ && sub_80F9344() == TRUE
+ && IsLinkDoubleBattle() == TRUE
+ && (pssData.monIndex == 1 || pssData.monIndex == 4 || pssData.monIndex == 5))
+ {
+ StringCopy(gStringVar1, ItemId_GetItem(itemId)->name);
+ }
+ else if (itemId == 0)
+ {
+ StringCopy(gStringVar1, gOtherText_None);
+ }
+ else
+ {
+ CopyItemName(itemId, gStringVar1);
+ }
+
+ MenuPrint(sUnknown_083C15B4, left, top);
+}
+
+static void DrawExperienceProgressBar(struct Pokemon *mon, u8 left, u8 top)
+{
+ u32 curExperience;
+ u8 level;
+ u16 species;
+ u8 i;
+ u16 *vramAddr;
+ u32 expToNextLevel = 0;
+ s64 numExpProgressBarTicks = 0;
+
+ curExperience = GetMonData(mon, MON_DATA_EXP);
+ level = GetMonData(mon, MON_DATA_LEVEL);
+ species = GetMonData(mon, MON_DATA_SPECIES);
+
+ // The experience progress bar is shown as empty when the Pokemon is already level 100.
+ if (level < 100)
+ {
+ u32 nextLevelExp;
+ u32 expSinceLastLevel;
+ u32 expBetweenLevels;
+ u32 curLevelExperience;
+
+ nextLevelExp = gExperienceTables[gBaseStats[species].growthRate][level + 1];
+ expToNextLevel = nextLevelExp - curExperience;
+ curLevelExperience = gExperienceTables[gBaseStats[species].growthRate][level];
+ expBetweenLevels = (nextLevelExp - curLevelExperience);
+ expSinceLastLevel = curExperience - curLevelExperience;
+
+ // Calculate the number of 1-pixel "ticks" to illuminate in the experience progress bar.
+ // There are 8 tiles that make up the bar, and each tile has 8 "ticks". Hence, the numerator
+ // is multiplied by 64.
+ numExpProgressBarTicks = (expSinceLastLevel * 64) / expBetweenLevels;
+ if (numExpProgressBarTicks == 0 && expSinceLastLevel != 0)
+ {
+ // Ensure sure some exp. gain is visible in the progress bar.
+ numExpProgressBarTicks = 1;
+ }
+ }
+
+ ConvertIntToDecimalString(gStringVar1, expToNextLevel);
+ MenuPrint_RightAligned(gStringVar1, left + 6, top);
+
+
+ // Draw each of the 8 tiles that make up the experience progress bar.
+ vramAddr = (u16 *)(VRAM + 0x4CAA);
+ for (i = 0; i < 8; i++)
+ {
+ u16 tile;
+ u16 baseTile = 0x2062;
+
+ if (numExpProgressBarTicks > 7)
+ {
+ tile = 0x206A; // full exp. bar block
+ }
+ else
+ {
+ tile = (numExpProgressBarTicks % 8) + baseTile;
+ }
+
+ vramAddr[i] = tile;
+
+ numExpProgressBarTicks -= 8;
+ if (numExpProgressBarTicks < 0)
+ {
+ numExpProgressBarTicks = 0;
+ }
+ }
+}
+
+// Prints the text displayed in the top-left or top-right of the screen.
+// Each of the 4 summary screens displays different text.
+static void PrintSummaryWindowHeaderText(void)
+{
+ u8 *buffer = gStringVar1;
+
+ buffer[0] = EXT_CTRL_CODE_BEGIN;
+ buffer[1] = 0x12;
+ buffer[2] = 0x2;
+
+ buffer += 3;
+ buffer = sub_80A1E58(buffer, 13);
+ buffer = StringCopy(buffer, sPageHeaderTexts[pssData.headerTextId]);
+
+ buffer[0] = EXT_CTRL_CODE_BEGIN;
+ buffer[1] = 0x13;
+ buffer[2] = 0x58;
+ buffer[3] = EOS;
+
+ MenuPrint(gStringVar1, 0, 0);
+
+ if (pssData.headerActionTextId != 0)
+ {
+ GetStringCenterAlignXOffset(5, 23, 0);
+ GetStringCenterAlignXOffset(6, 24, 0);
+ }
+ else
+ {
+ MenuZeroFillWindowRect(23, 0, 24, 1);
+ }
+
+ buffer = gStringVar1;
+ buffer = sub_80A1E58(buffer, 13);
+ buffer = StringCopy(buffer, sPageHeaderTexts[pssData.headerActionTextId]);
+
+ buffer[0] = EXT_CTRL_CODE_BEGIN;
+ buffer[1] = 0x13;
+ buffer[2] = 0x28;
+ buffer[3] = EOS;
+
+ MenuPrint(gStringVar1, 25, 0);
+}
+
+// If the given pokemon previously had the pokerus virus, a small
+// dot will be drawn in between the pokeball and the mon's level.
+static void DrawPokerusSurvivorDot(struct Pokemon *mon)
+{
+ u16 *vram1 = (u16 *)(VRAM + 0xE444);
+ u16 *vram2 = (u16 *)(VRAM + 0xEC44);
+
+ if (!CheckPartyPokerus(mon, 0) && CheckPartyHasHadPokerus(mon, 0))
+ {
+ *vram1 = 0x2C;
+ *vram2 = 0x2C;
+ }
+ else
+ {
+ *vram1 = 0x081A;
+ *vram2 = 0x081A;
+ }
+}
+
+// Draws the 4 small navigation circles at the top of the pokemon summary screen.
+#ifdef NONMATCHING
+static void DrawSummaryScreenNavigationDots(void)
+{
+ void *dest;
+ u16 arr[8];
+ u8 i = 0;
+ struct PokemonSummaryScreenStruct *SS = (struct PokemonSummaryScreenStruct *)(gSharedMem + 0x18000);
+ u16 var1 = 0x4040;
+ u16 var2 = 0x404A;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (i < SS->unk75)
+ {
+ arr[i * 2] = var1;
+ arr[(i * 2) + 1] = var1 + 1;
+ }
+ else if (i > SS->unk76)
+ {
+ arr[i * 2] = var2;
+ arr[(i * 2) + 1] = var2 + 1;
+ }
+ else
+ {
+ if (i < SS->unkB)
+ {
+ arr[i * 2] = 0x4046;
+ arr[(i * 2) + 1] = 0x4046 + 1;
+ }
+
+ if (i == SS->unkB)
+ {
+ if (i != SS->unk76)
+ {
+ arr[i * 2] = 0x4041;
+ arr[(i * 2) + 1] = 0x4041 + 1;
+ }
+ else
+ {
+ arr[i * 2] = 0x404B;
+ arr[(i * 2) + 1] = 0x404B + 1;
+ }
+ }
+
+ if (i > SS->unkB)
+ {
+ if (i != SS->unk76)
+ {
+ arr[i * 2] = 0x4043;
+ arr[(i * 2) + 1] = 0x4043 + 1;
+ }
+ else
+ {
+ arr[i * 2] = 0x4048;
+ arr[(i * 2) + 1] = 0x4048 + 1;
+ }
+ }
+ }
+ }
+
+ dest = (void *)(VRAM + 0xE016);
+ DmaCopy16(3, arr, dest, 16);
+
+ for (i = 0; i < 8; i++)
+ {
+ arr[i] += 0x10;
+ }
+
+ dest = (void *)(VRAM + 0xE056);
+ DmaCopy16(3, arr, dest, 16);
+}
+#else
+__attribute__((naked))
+static void DrawSummaryScreenNavigationDots(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, 0x10\n\
+ movs r3, 0\n\
+ ldr r6, _080A0F24 @ =gSharedMem + 0x18000\n\
+ adds r5, r6, 0\n\
+ ldr r1, _080A0F28 @ =0x00004040\n\
+ mov r8, r1\n\
+ ldr r2, _080A0F2C @ =0x0000404a\n\
+ mov r10, r2\n\
+_080A0F02:\n\
+ adds r0, r5, 0\n\
+ adds r0, 0x75\n\
+ ldrb r0, [r0]\n\
+ cmp r3, r0\n\
+ bcs _080A0F30\n\
+ lsls r1, r3, 1\n\
+ lsls r0, r3, 2\n\
+ add r0, sp\n\
+ mov r4, r8\n\
+ strh r4, [r0]\n\
+ adds r1, 0x1\n\
+ lsls r1, 1\n\
+ mov r7, sp\n\
+ adds r0, r7, r1\n\
+ strh r4, [r0]\n\
+ b _080A0FE2\n\
+ .align 2, 0\n\
+_080A0F24: .4byte gSharedMem + 0x18000\n\
+_080A0F28: .4byte 0x00004040\n\
+_080A0F2C: .4byte 0x0000404a\n\
+_080A0F30:\n\
+ movs r0, 0x76\n\
+ adds r0, r6\n\
+ mov r12, r0\n\
+ ldrb r1, [r0]\n\
+ cmp r3, r1\n\
+ bls _080A0F52\n\
+ lsls r1, r3, 1\n\
+ lsls r0, r3, 2\n\
+ add r0, sp\n\
+ mov r2, r10\n\
+ strh r2, [r0]\n\
+ adds r1, 0x1\n\
+ lsls r1, 1\n\
+ mov r4, sp\n\
+ adds r0, r4, r1\n\
+ strh r2, [r0]\n\
+ b _080A0FE2\n\
+_080A0F52:\n\
+ ldrb r4, [r5, 0xB]\n\
+ cmp r3, r4\n\
+ bcs _080A0F6E\n\
+ lsls r1, r3, 1\n\
+ lsls r0, r3, 2\n\
+ mov r7, sp\n\
+ adds r2, r7, r0\n\
+ ldr r0, _080A0F88 @ =0x00004046\n\
+ strh r0, [r2]\n\
+ adds r1, 0x1\n\
+ lsls r1, 1\n\
+ add r1, sp\n\
+ adds r0, 0x1\n\
+ strh r0, [r1]\n\
+_080A0F6E:\n\
+ cmp r3, r4\n\
+ bne _080A0FA6\n\
+ mov r0, r12\n\
+ ldrb r0, [r0]\n\
+ cmp r3, r0\n\
+ beq _080A0F90\n\
+ lsls r1, r3, 1\n\
+ lsls r0, r3, 2\n\
+ mov r4, sp\n\
+ adds r2, r4, r0\n\
+ ldr r0, _080A0F8C @ =0x00004041\n\
+ b _080A0F9A\n\
+ .align 2, 0\n\
+_080A0F88: .4byte 0x00004046\n\
+_080A0F8C: .4byte 0x00004041\n\
+_080A0F90:\n\
+ lsls r1, r3, 1\n\
+ lsls r0, r3, 2\n\
+ mov r7, sp\n\
+ adds r2, r7, r0\n\
+ ldr r0, _080A0FC4 @ =0x0000404b\n\
+_080A0F9A:\n\
+ strh r0, [r2]\n\
+ adds r1, 0x1\n\
+ lsls r1, 1\n\
+ add r1, sp\n\
+ adds r0, 0x1\n\
+ strh r0, [r1]\n\
+_080A0FA6:\n\
+ ldrb r0, [r5, 0xB]\n\
+ cmp r3, r0\n\
+ bls _080A0FE2\n\
+ adds r0, r6, 0\n\
+ adds r0, 0x76\n\
+ ldrb r0, [r0]\n\
+ cmp r3, r0\n\
+ beq _080A0FCC\n\
+ lsls r1, r3, 1\n\
+ lsls r0, r3, 2\n\
+ mov r4, sp\n\
+ adds r2, r4, r0\n\
+ ldr r0, _080A0FC8 @ =0x00004043\n\
+ b _080A0FD6\n\
+ .align 2, 0\n\
+_080A0FC4: .4byte 0x0000404b\n\
+_080A0FC8: .4byte 0x00004043\n\
+_080A0FCC:\n\
+ lsls r1, r3, 1\n\
+ lsls r0, r3, 2\n\
+ mov r7, sp\n\
+ adds r2, r7, r0\n\
+ ldr r0, _080A1034 @ =0x00004048\n\
+_080A0FD6:\n\
+ strh r0, [r2]\n\
+ adds r1, 0x1\n\
+ lsls r1, 1\n\
+ add r1, sp\n\
+ adds r0, 0x1\n\
+ strh r0, [r1]\n\
+_080A0FE2:\n\
+ adds r0, r3, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r3, r0, 24\n\
+ cmp r3, 0x3\n\
+ bls _080A0F02\n\
+ ldr r1, _080A1038 @ =0x0600e016\n\
+ ldr r0, _080A103C @ =0x040000d4\n\
+ mov r2, sp\n\
+ str r2, [r0]\n\
+ str r1, [r0, 0x4]\n\
+ ldr r1, _080A1040 @ =0x80000008\n\
+ str r1, [r0, 0x8]\n\
+ ldr r0, [r0, 0x8]\n\
+ movs r3, 0\n\
+_080A0FFE:\n\
+ lsls r0, r3, 1\n\
+ mov r4, sp\n\
+ adds r1, r4, r0\n\
+ ldrh r0, [r1]\n\
+ adds r0, 0x10\n\
+ strh r0, [r1]\n\
+ adds r0, r3, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r3, r0, 24\n\
+ cmp r3, 0x7\n\
+ bls _080A0FFE\n\
+ ldr r1, _080A1044 @ =0x0600e056\n\
+ ldr r0, _080A103C @ =0x040000d4\n\
+ str r4, [r0]\n\
+ str r1, [r0, 0x4]\n\
+ ldr r1, _080A1040 @ =0x80000008\n\
+ str r1, [r0, 0x8]\n\
+ ldr r0, [r0, 0x8]\n\
+ add sp, 0x10\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\
+_080A1034: .4byte 0x00004048\n\
+_080A1038: .4byte 0x0600e016\n\
+_080A103C: .4byte 0x040000d4\n\
+_080A1040: .4byte 0x80000008\n\
+_080A1044: .4byte 0x0600e056\n\
+ .syntax divided\n");
+}
+#endif // NONMATCHING
+
+__attribute__((naked))
+void sub_80A1048(u8 taskId)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r8\n\
+ push {r7}\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r8, r0\n\
+ lsls r0, 2\n\
+ add r0, r8\n\
+ lsls r0, 3\n\
+ ldr r1, _080A10A0 @ =gTasks + 0x8\n\
+ adds r6, r0, r1\n\
+ ldrh r0, [r6]\n\
+ ldrh r1, [r6, 0x2]\n\
+ adds r0, r1\n\
+ strh r0, [r6, 0x2]\n\
+ lsls r0, 16\n\
+ cmp r0, 0\n\
+ bne _080A106E\n\
+ b _080A1224\n\
+_080A106E:\n\
+ movs r5, 0x2\n\
+ ldrsh r2, [r6, r5]\n\
+ ldr r0, _080A10A4 @ =0x0000024a\n\
+ subs r0, r2\n\
+ lsls r0, 1\n\
+ ldr r1, _080A10A8 @ =gUnknown_08E73508\n\
+ adds r4, r0, r1\n\
+ ldr r5, _080A10AC @ =0x0600e480\n\
+ lsls r2, 1\n\
+ movs r0, 0x80\n\
+ lsls r0, 5\n\
+ adds r7, r1, 0\n\
+ cmp r2, r0\n\
+ bhi _080A10B4\n\
+ ldr r0, _080A10B0 @ =0x040000d4\n\
+ str r4, [r0]\n\
+ str r5, [r0, 0x4]\n\
+ lsrs r1, r2, 1\n\
+ movs r2, 0x80\n\
+ lsls r2, 24\n\
+ orrs r1, r2\n\
+ str r1, [r0, 0x8]\n\
+ ldr r0, [r0, 0x8]\n\
+ b _080A10E0\n\
+ .align 2, 0\n\
+_080A10A0: .4byte gTasks + 0x8\n\
+_080A10A4: .4byte 0x0000024a\n\
+_080A10A8: .4byte gUnknown_08E73508\n\
+_080A10AC: .4byte 0x0600e480\n\
+_080A10B0: .4byte 0x040000d4\n\
+_080A10B4:\n\
+ ldr r3, _080A110C @ =0x040000d4\n\
+ str r4, [r3]\n\
+ str r5, [r3, 0x4]\n\
+ ldr r0, _080A1110 @ =0x80000800\n\
+ str r0, [r3, 0x8]\n\
+ ldr r0, [r3, 0x8]\n\
+ movs r0, 0x80\n\
+ lsls r0, 5\n\
+ adds r4, r0\n\
+ adds r5, r0\n\
+ ldr r1, _080A1114 @ =0xfffff000\n\
+ adds r2, r1\n\
+ cmp r2, r0\n\
+ bhi _080A10B4\n\
+ str r4, [r3]\n\
+ str r5, [r3, 0x4]\n\
+ lsrs r0, r2, 1\n\
+ movs r1, 0x80\n\
+ lsls r1, 24\n\
+ orrs r0, r1\n\
+ str r0, [r3, 0x8]\n\
+ ldr r0, [r3, 0x8]\n\
+_080A10E0:\n\
+ movs r5, 0x2\n\
+ ldrsh r0, [r6, r5]\n\
+ ldr r1, _080A1118 @ =0x0000026a\n\
+ subs r1, r0\n\
+ lsls r1, 1\n\
+ adds r3, r1, r7\n\
+ ldr r4, _080A111C @ =0x0600e4c0\n\
+ lsls r1, r0, 1\n\
+ movs r0, 0x80\n\
+ lsls r0, 5\n\
+ cmp r1, r0\n\
+ bhi _080A1120\n\
+ ldr r0, _080A110C @ =0x040000d4\n\
+ str r3, [r0]\n\
+ str r4, [r0, 0x4]\n\
+ lsrs r1, 1\n\
+ movs r2, 0x80\n\
+ lsls r2, 24\n\
+ orrs r1, r2\n\
+ str r1, [r0, 0x8]\n\
+ ldr r0, [r0, 0x8]\n\
+ b _080A114C\n\
+ .align 2, 0\n\
+_080A110C: .4byte 0x040000d4\n\
+_080A1110: .4byte 0x80000800\n\
+_080A1114: .4byte 0xfffff000\n\
+_080A1118: .4byte 0x0000026a\n\
+_080A111C: .4byte 0x0600e4c0\n\
+_080A1120:\n\
+ ldr r2, _080A1178 @ =0x040000d4\n\
+ str r3, [r2]\n\
+ str r4, [r2, 0x4]\n\
+ ldr r0, _080A117C @ =0x80000800\n\
+ str r0, [r2, 0x8]\n\
+ ldr r0, [r2, 0x8]\n\
+ movs r0, 0x80\n\
+ lsls r0, 5\n\
+ adds r3, r0\n\
+ adds r4, r0\n\
+ ldr r5, _080A1180 @ =0xfffff000\n\
+ adds r1, r5\n\
+ cmp r1, r0\n\
+ bhi _080A1120\n\
+ str r3, [r2]\n\
+ str r4, [r2, 0x4]\n\
+ lsrs r0, r1, 1\n\
+ movs r1, 0x80\n\
+ lsls r1, 24\n\
+ orrs r0, r1\n\
+ str r0, [r2, 0x8]\n\
+ ldr r0, [r2, 0x8]\n\
+_080A114C:\n\
+ movs r1, 0x2\n\
+ ldrsh r0, [r6, r1]\n\
+ ldr r1, _080A1184 @ =0x0000024a\n\
+ subs r1, r0\n\
+ lsls r1, 1\n\
+ adds r3, r1, r7\n\
+ ldr r4, _080A1188 @ =0x0600ec80\n\
+ lsls r1, r0, 1\n\
+ movs r0, 0x80\n\
+ lsls r0, 5\n\
+ cmp r1, r0\n\
+ bhi _080A118C\n\
+ ldr r0, _080A1178 @ =0x040000d4\n\
+ str r3, [r0]\n\
+ str r4, [r0, 0x4]\n\
+ lsrs r1, 1\n\
+ movs r2, 0x80\n\
+ lsls r2, 24\n\
+ orrs r1, r2\n\
+ str r1, [r0, 0x8]\n\
+ ldr r0, [r0, 0x8]\n\
+ b _080A11B8\n\
+ .align 2, 0\n\
+_080A1178: .4byte 0x040000d4\n\
+_080A117C: .4byte 0x80000800\n\
+_080A1180: .4byte 0xfffff000\n\
+_080A1184: .4byte 0x0000024a\n\
+_080A1188: .4byte 0x0600ec80\n\
+_080A118C:\n\
+ ldr r2, _080A11E4 @ =0x040000d4\n\
+ str r3, [r2]\n\
+ str r4, [r2, 0x4]\n\
+ ldr r0, _080A11E8 @ =0x80000800\n\
+ str r0, [r2, 0x8]\n\
+ ldr r0, [r2, 0x8]\n\
+ movs r0, 0x80\n\
+ lsls r0, 5\n\
+ adds r3, r0\n\
+ adds r4, r0\n\
+ ldr r5, _080A11EC @ =0xfffff000\n\
+ adds r1, r5\n\
+ cmp r1, r0\n\
+ bhi _080A118C\n\
+ str r3, [r2]\n\
+ str r4, [r2, 0x4]\n\
+ lsrs r0, r1, 1\n\
+ movs r1, 0x80\n\
+ lsls r1, 24\n\
+ orrs r0, r1\n\
+ str r0, [r2, 0x8]\n\
+ ldr r0, [r2, 0x8]\n\
+_080A11B8:\n\
+ movs r1, 0x2\n\
+ ldrsh r0, [r6, r1]\n\
+ ldr r1, _080A11F0 @ =0x0000026a\n\
+ subs r1, r0\n\
+ lsls r1, 1\n\
+ adds r3, r1, r7\n\
+ ldr r4, _080A11F4 @ =0x0600ecc0\n\
+ lsls r1, r0, 1\n\
+ movs r0, 0x80\n\
+ lsls r0, 5\n\
+ cmp r1, r0\n\
+ bhi _080A11F8\n\
+ ldr r0, _080A11E4 @ =0x040000d4\n\
+ str r3, [r0]\n\
+ str r4, [r0, 0x4]\n\
+ lsrs r1, 1\n\
+ movs r2, 0x80\n\
+ lsls r2, 24\n\
+ orrs r1, r2\n\
+ str r1, [r0, 0x8]\n\
+ ldr r0, [r0, 0x8]\n\
+ b _080A1224\n\
+ .align 2, 0\n\
+_080A11E4: .4byte 0x040000d4\n\
+_080A11E8: .4byte 0x80000800\n\
+_080A11EC: .4byte 0xfffff000\n\
+_080A11F0: .4byte 0x0000026a\n\
+_080A11F4: .4byte 0x0600ecc0\n\
+_080A11F8:\n\
+ ldr r2, _080A12B0 @ =0x040000d4\n\
+ str r3, [r2]\n\
+ str r4, [r2, 0x4]\n\
+ ldr r0, _080A12B4 @ =0x80000800\n\
+ str r0, [r2, 0x8]\n\
+ ldr r0, [r2, 0x8]\n\
+ movs r0, 0x80\n\
+ lsls r0, 5\n\
+ adds r3, r0\n\
+ adds r4, r0\n\
+ ldr r5, _080A12B8 @ =0xfffff000\n\
+ adds r1, r5\n\
+ cmp r1, r0\n\
+ bhi _080A11F8\n\
+ str r3, [r2]\n\
+ str r4, [r2, 0x4]\n\
+ lsrs r0, r1, 1\n\
+ movs r1, 0x80\n\
+ lsls r1, 24\n\
+ orrs r0, r1\n\
+ str r0, [r2, 0x8]\n\
+ ldr r0, [r2, 0x8]\n\
+_080A1224:\n\
+ ldrb r4, [r6, 0x2]\n\
+ ldrh r7, [r6, 0x2]\n\
+ ldrh r0, [r6]\n\
+ mov r12, r0\n\
+ cmp r4, 0x9\n\
+ bhi _080A1272\n\
+ adds r3, r6, 0x4\n\
+ ldr r2, _080A12B0 @ =0x040000d4\n\
+ ldr r5, _080A12BC @ =0x80000001\n\
+_080A1236:\n\
+ lsls r1, r4, 1\n\
+ ldr r6, _080A12C0 @ =0x0600e480\n\
+ adds r0, r1, r6\n\
+ str r3, [r2]\n\
+ str r0, [r2, 0x4]\n\
+ str r5, [r2, 0x8]\n\
+ ldr r0, [r2, 0x8]\n\
+ adds r6, 0x40\n\
+ adds r0, r1, r6\n\
+ str r3, [r2]\n\
+ str r0, [r2, 0x4]\n\
+ str r5, [r2, 0x8]\n\
+ ldr r0, [r2, 0x8]\n\
+ ldr r6, _080A12C4 @ =0x0600ec80\n\
+ adds r0, r1, r6\n\
+ str r3, [r2]\n\
+ str r0, [r2, 0x4]\n\
+ str r5, [r2, 0x8]\n\
+ ldr r0, [r2, 0x8]\n\
+ ldr r0, _080A12C8 @ =0x0600ecc0\n\
+ adds r1, r0\n\
+ str r3, [r2]\n\
+ str r1, [r2, 0x4]\n\
+ str r5, [r2, 0x8]\n\
+ ldr r0, [r2, 0x8]\n\
+ adds r0, r4, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ cmp r4, 0x9\n\
+ bls _080A1236\n\
+_080A1272:\n\
+ mov r1, r12\n\
+ lsls r0, r1, 16\n\
+ cmp r0, 0\n\
+ beq _080A1286\n\
+ lsls r0, r7, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0\n\
+ ble _080A1286\n\
+ cmp r0, 0x9\n\
+ ble _080A12A4\n\
+_080A1286:\n\
+ lsls r0, r7, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0x9\n\
+ ble _080A129A\n\
+ ldr r0, _080A12CC @ =gOtherText_Status\n\
+ movs r1, 0xD\n\
+ movs r2, 0x1\n\
+ movs r3, 0x12\n\
+ bl sub_80A1FF8\n\
+_080A129A:\n\
+ bl sub_80A1D18\n\
+ mov r0, r8\n\
+ bl DestroyTask\n\
+_080A12A4:\n\
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080A12B0: .4byte 0x040000d4\n\
+_080A12B4: .4byte 0x80000800\n\
+_080A12B8: .4byte 0xfffff000\n\
+_080A12BC: .4byte 0x80000001\n\
+_080A12C0: .4byte 0x0600e480\n\
+_080A12C4: .4byte 0x0600ec80\n\
+_080A12C8: .4byte 0x0600ecc0\n\
+_080A12CC: .4byte gOtherText_Status\n\
+ .syntax divided\n");
+}
+
+static void sub_80A12D0(s8 a)
+{
+ u8 newTaskId;
+
+ MenuZeroFillWindowRect(1, 18, 5, 19);
+ sub_80A18E4(29);
+
+ newTaskId = CreateTask(sub_80A1048, 0);
+ gTasks[newTaskId].data[0] = a;
+
+ if (a < 0)
+ {
+ gTasks[newTaskId].data[1] = 10;
+ }
+ else
+ {
+ gTasks[newTaskId].data[1] = 0;
+ }
+
+ gTasks[newTaskId].data[2] = 1;
+}
+
+// void sub_80A1334(u8 taskId)
+// {
+// u8 i;
+// s16 var1;
+
+// gTasks[taskId].data[1] += gTasks[taskId].data[0];
+
+// var1 = 0;
+// if (gTasks[taskId].data[1] >= 0)
+// {
+// var1 = 10;
+// if (gTasks[taskId].data[1] < 10)
+// {
+// var1 = gTasks[taskId].data[1];
+// }
+// }
+
+// if (var1 > 0)
+// {
+// u8 *vramAddr = (u8 *)(VRAM + 0x5B40);
+// for (i = 0; i < 7; i++)
+// {
+// CpuSet(&gUnknown_08E73E88[(i + 13) * 64], vramAddr, var1 & 0x1FFFFF);
+// vramAddr += 64;
+// }
+// }
+
+// if (var1 <= 9)
+// {
+// u8 *vramAddr = (u8 *)(VRAM + 0x5B40);
+// for (i = 0; i < 64; i++)
+// {
+// u16 val = gTasks[taskId].data[2];
+// CpuSet(&val, vramAddr, ((10 - var1) & 0x1FFFFF) | 0x800000);
+// }
+// }
+// else
+// {
+// MenuZeroFillWindowRect(0, 19, 9, 19);
+// }
+
+// if (gTasks[taskId].data[0] == 0 || gTasks[taskId].data[1] < 0)
+// {
+// if (pssData.page == PSS_PAGE_BATTLE_MOVES)
+// {
+// MenuZeroFillWindowRect(0, 14, 9, 18);
+// sub_80A0958(pssData.loadedMon);
+
+// if (GetMonStatusAndPokerus(pssData.loadedMon))
+// {
+// sub_80A1FF8(gOtherText_Status, 13, 1, 18);
+// }
+
+// DestroyTask(taskId);
+// }
+// }
+
+// if (gTasks[taskId].data[1] > 9)
+// {
+// if (pssData.page == PSS_PAGE_BATTLE_MOVES)
+// {
+// sub_80A00F4(gTasks[taskId].data[3]);
+// }
+
+// sub_80A0428(pssData.loadedMon, &gTasks[taskId].data[3]);
+// DestroyTask(taskId);
+// }
+// }
+__attribute__((naked))
+static void sub_80A1334(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\
+ sub sp, 0x4\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r10, r0\n\
+ lsls r0, 2\n\
+ add r0, r10\n\
+ lsls r0, 3\n\
+ ldr r1, _080A13E4 @ =gTasks + 0x8\n\
+ adds r7, r0, r1\n\
+ ldrh r0, [r7]\n\
+ ldrh r1, [r7, 0x2]\n\
+ adds r0, r1\n\
+ strh r0, [r7, 0x2]\n\
+ lsls r0, 16\n\
+ asrs r1, r0, 16\n\
+ movs r0, 0\n\
+ cmp r1, 0\n\
+ blt _080A136A\n\
+ movs r0, 0xA\n\
+ cmp r1, 0xA\n\
+ bgt _080A136A\n\
+ ldrh r0, [r7, 0x2]\n\
+_080A136A:\n\
+ lsls r0, 16\n\
+ asrs r2, r0, 16\n\
+ mov r9, r0\n\
+ cmp r2, 0\n\
+ ble _080A13A6\n\
+ movs r0, 0xA\n\
+ subs r0, r2\n\
+ lsls r0, 1\n\
+ ldr r1, _080A13E8 @ =0x06005b40\n\
+ adds r4, r0, r1\n\
+ movs r5, 0\n\
+ adds r6, r2, 0\n\
+ ldr r0, _080A13EC @ =0x001fffff\n\
+ mov r8, r0\n\
+_080A1386:\n\
+ adds r0, r5, 0\n\
+ adds r0, 0xD\n\
+ lsls r0, 6\n\
+ ldr r1, _080A13F0 @ =gUnknown_08E73E88\n\
+ adds r0, r1\n\
+ adds r1, r4, 0\n\
+ mov r2, r8\n\
+ ands r2, r6\n\
+ bl CpuSet\n\
+ adds r4, 0x40\n\
+ adds r0, r5, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ cmp r5, 0x6\n\
+ bls _080A1386\n\
+_080A13A6:\n\
+ mov r1, r9\n\
+ asrs r2, r1, 16\n\
+ cmp r2, 0x9\n\
+ bgt _080A13F4\n\
+ ldr r4, _080A13E8 @ =0x06005b40\n\
+ movs r5, 0\n\
+ mov r8, sp\n\
+ movs r0, 0xA\n\
+ subs r6, r0, r2\n\
+ ldr r0, _080A13EC @ =0x001fffff\n\
+ ands r6, r0\n\
+ movs r0, 0x80\n\
+ lsls r0, 17\n\
+ mov r9, r0\n\
+_080A13C2:\n\
+ ldrh r0, [r7, 0x4]\n\
+ mov r1, r8\n\
+ strh r0, [r1]\n\
+ mov r0, sp\n\
+ adds r1, r4, 0\n\
+ mov r2, r9\n\
+ orrs r2, r6\n\
+ bl CpuSet\n\
+ adds r4, 0x40\n\
+ adds r0, r5, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ cmp r5, 0x6\n\
+ bls _080A13C2\n\
+ b _080A1400\n\
+ .align 2, 0\n\
+_080A13E4: .4byte gTasks + 0x8\n\
+_080A13E8: .4byte 0x06005b40\n\
+_080A13EC: .4byte 0x001fffff\n\
+_080A13F0: .4byte gUnknown_08E73E88\n\
+_080A13F4:\n\
+ movs r0, 0\n\
+ movs r1, 0x13\n\
+ movs r2, 0x9\n\
+ movs r3, 0x13\n\
+ bl MenuZeroFillWindowRect\n\
+_080A1400:\n\
+ movs r1, 0\n\
+ ldrsh r0, [r7, r1]\n\
+ cmp r0, 0\n\
+ beq _080A1410\n\
+ movs r1, 0x2\n\
+ ldrsh r0, [r7, r1]\n\
+ cmp r0, 0\n\
+ bge _080A144A\n\
+_080A1410:\n\
+ ldr r4, _080A1480 @ =gSharedMem + 0x18000\n\
+ ldrb r0, [r4, 0xB]\n\
+ cmp r0, 0x2\n\
+ bne _080A1444\n\
+ movs r0, 0\n\
+ movs r1, 0xE\n\
+ movs r2, 0x9\n\
+ movs r3, 0x12\n\
+ bl MenuZeroFillWindowRect\n\
+ adds r4, 0x10\n\
+ adds r0, r4, 0\n\
+ bl sub_80A0958\n\
+ adds r0, r4, 0\n\
+ bl GetMonStatusAndPokerus\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _080A1444\n\
+ ldr r0, _080A1484 @ =gOtherText_Status\n\
+ movs r1, 0xD\n\
+ movs r2, 0x1\n\
+ movs r3, 0x12\n\
+ bl sub_80A1FF8\n\
+_080A1444:\n\
+ mov r0, r10\n\
+ bl DestroyTask\n\
+_080A144A:\n\
+ movs r1, 0x2\n\
+ ldrsh r0, [r7, r1]\n\
+ cmp r0, 0x9\n\
+ ble _080A1470\n\
+ ldr r4, _080A1480 @ =gSharedMem + 0x18000\n\
+ ldrb r0, [r4, 0xB]\n\
+ cmp r0, 0x2\n\
+ bne _080A1460\n\
+ ldrb r0, [r7, 0x6]\n\
+ bl sub_80A00F4\n\
+_080A1460:\n\
+ adds r0, r4, 0\n\
+ adds r0, 0x10\n\
+ adds r1, r7, 0x6\n\
+ bl sub_80A0428\n\
+ mov r0, r10\n\
+ bl DestroyTask\n\
+_080A1470:\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\
+ .align 2, 0\n\
+_080A1480: .4byte gSharedMem + 0x18000\n\
+_080A1484: .4byte gOtherText_Status\n\
+ .syntax divided\n");
+}
+
+// Related to re-drawing the summary area underneath the pokemon's picture
+// in all of the summary screen tabs.
+static void sub_80A1488(s8 a, u8 b)
+{
+ u8 taskId;
+
+ if (pssData.page == PSS_PAGE_BATTLE_MOVES)
+ {
+ MenuZeroFillWindowRect(0, 14, 9, 19);
+ }
+
+ taskId = FindTaskIdByFunc(sub_80A1334);
+ if (taskId == 0xFF)
+ {
+ taskId = CreateTask(sub_80A1334, 0);
+ }
+
+ gTasks[taskId].data[0] = (s8)a;
+
+ if ((s8)a < 0)
+ {
+ gTasks[taskId].data[1] = 10;
+ }
+ else
+ {
+ gTasks[taskId].data[1] = 0;
+ }
+
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].data[3] = b;
+}
+
+__attribute__((naked))
+static void sub_80A1500(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\
+ sub sp, 0x4\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r10, r0\n\
+ lsls r0, 2\n\
+ add r0, r10\n\
+ lsls r0, 3\n\
+ ldr r1, _080A15B0 @ =gTasks + 0x8\n\
+ adds r7, r0, r1\n\
+ ldrh r0, [r7]\n\
+ ldrh r1, [r7, 0x2]\n\
+ adds r0, r1\n\
+ strh r0, [r7, 0x2]\n\
+ lsls r0, 16\n\
+ asrs r1, r0, 16\n\
+ movs r0, 0\n\
+ cmp r1, 0\n\
+ blt _080A1536\n\
+ movs r0, 0xA\n\
+ cmp r1, 0xA\n\
+ bgt _080A1536\n\
+ ldrh r0, [r7, 0x2]\n\
+_080A1536:\n\
+ lsls r0, 16\n\
+ asrs r2, r0, 16\n\
+ mov r9, r0\n\
+ cmp r2, 0\n\
+ ble _080A1572\n\
+ movs r0, 0xA\n\
+ subs r0, r2\n\
+ lsls r0, 1\n\
+ ldr r1, _080A15B4 @ =0x06006b40\n\
+ adds r4, r0, r1\n\
+ movs r5, 0\n\
+ adds r6, r2, 0\n\
+ ldr r0, _080A15B8 @ =0x001fffff\n\
+ mov r8, r0\n\
+_080A1552:\n\
+ adds r0, r5, 0\n\
+ adds r0, 0xD\n\
+ lsls r0, 6\n\
+ ldr r1, _080A15BC @ =gUnknown_08E74688\n\
+ adds r0, r1\n\
+ adds r1, r4, 0\n\
+ mov r2, r8\n\
+ ands r2, r6\n\
+ bl CpuSet\n\
+ adds r4, 0x40\n\
+ adds r0, r5, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ cmp r5, 0x6\n\
+ bls _080A1552\n\
+_080A1572:\n\
+ mov r1, r9\n\
+ asrs r2, r1, 16\n\
+ cmp r2, 0x9\n\
+ bgt _080A15C0\n\
+ ldr r4, _080A15B4 @ =0x06006b40\n\
+ movs r5, 0\n\
+ mov r8, sp\n\
+ movs r0, 0xA\n\
+ subs r6, r0, r2\n\
+ ldr r0, _080A15B8 @ =0x001fffff\n\
+ ands r6, r0\n\
+ movs r0, 0x80\n\
+ lsls r0, 17\n\
+ mov r9, r0\n\
+_080A158E:\n\
+ ldrh r0, [r7, 0x4]\n\
+ mov r1, r8\n\
+ strh r0, [r1]\n\
+ mov r0, sp\n\
+ adds r1, r4, 0\n\
+ mov r2, r9\n\
+ orrs r2, r6\n\
+ bl CpuSet\n\
+ adds r4, 0x40\n\
+ adds r0, r5, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ cmp r5, 0x6\n\
+ bls _080A158E\n\
+ b _080A15CC\n\
+ .align 2, 0\n\
+_080A15B0: .4byte gTasks + 0x8\n\
+_080A15B4: .4byte 0x06006b40\n\
+_080A15B8: .4byte 0x001fffff\n\
+_080A15BC: .4byte gUnknown_08E74688\n\
+_080A15C0:\n\
+ movs r0, 0\n\
+ movs r1, 0x13\n\
+ movs r2, 0x9\n\
+ movs r3, 0x13\n\
+ bl MenuZeroFillWindowRect\n\
+_080A15CC:\n\
+ movs r1, 0\n\
+ ldrsh r0, [r7, r1]\n\
+ cmp r0, 0\n\
+ beq _080A15DC\n\
+ movs r1, 0x2\n\
+ ldrsh r0, [r7, r1]\n\
+ cmp r0, 0\n\
+ bge _080A1616\n\
+_080A15DC:\n\
+ ldr r4, _080A164C @ =gSharedMem + 0x18000\n\
+ ldrb r0, [r4, 0xB]\n\
+ cmp r0, 0x3\n\
+ bne _080A1610\n\
+ movs r0, 0\n\
+ movs r1, 0xE\n\
+ movs r2, 0x9\n\
+ movs r3, 0x12\n\
+ bl MenuZeroFillWindowRect\n\
+ adds r4, 0x10\n\
+ adds r0, r4, 0\n\
+ bl sub_80A0958\n\
+ adds r0, r4, 0\n\
+ bl GetMonStatusAndPokerus\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _080A1610\n\
+ ldr r0, _080A1650 @ =gOtherText_Status\n\
+ movs r1, 0xD\n\
+ movs r2, 0x1\n\
+ movs r3, 0x12\n\
+ bl sub_80A1FF8\n\
+_080A1610:\n\
+ mov r0, r10\n\
+ bl DestroyTask\n\
+_080A1616:\n\
+ movs r1, 0x2\n\
+ ldrsh r0, [r7, r1]\n\
+ cmp r0, 0x9\n\
+ ble _080A163C\n\
+ ldr r4, _080A164C @ =gSharedMem + 0x18000\n\
+ ldrb r0, [r4, 0xB]\n\
+ cmp r0, 0x3\n\
+ bne _080A162C\n\
+ ldrb r0, [r7, 0x6]\n\
+ bl sub_80A00F4\n\
+_080A162C:\n\
+ adds r0, r4, 0\n\
+ adds r0, 0x10\n\
+ adds r1, r7, 0x6\n\
+ bl sub_80A0428\n\
+ mov r0, r10\n\
+ bl DestroyTask\n\
+_080A163C:\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\
+ .align 2, 0\n\
+_080A164C: .4byte gSharedMem + 0x18000\n\
+_080A1650: .4byte gOtherText_Status\n\
+ .syntax divided\n");
+}
+
+static void sub_80A1654(s8 a, u8 b)
+{
+ u8 taskId;
+
+ if (pssData.page == PSS_PAGE_CONTEST_MOVES)
+ {
+ MenuZeroFillWindowRect(0, 14, 9, 19);
+ }
+
+ taskId = FindTaskIdByFunc(sub_80A1500);
+ if (taskId == 0xFF)
+ {
+ taskId = CreateTask(sub_80A1500, 0);
+ }
+
+ gTasks[taskId].data[0] = (s8)a;
+
+ if ((s8)a < 0)
+ {
+ gTasks[taskId].data[1] = 10;
+ }
+ else
+ {
+ gTasks[taskId].data[1] = 0;
+ }
+
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].data[3] = b;
+}
+
+#ifdef NONMATCHING
+static void sub_80A16CC(u8 a)
+{
+ u8 i;
+ u16 *vramAddr = (u16 *)(VRAM + 0x6AD4);
+
+ if (a == 0)
+ {
+ for (i = 0; i < 20; i++)
+ {
+ vramAddr[i] = gUnknown_08E94510[i] + 0x1000;
+ vramAddr[i + 0x20] = gUnknown_08E94510[i] + 0x1000;
+ vramAddr[i + 0x40] = gUnknown_08E94550[i] + 0x1000;
+ }
+ }
+ else
+ {
+ i = 0;
+ for (i = 0; i < 20; i++)
+ {
+ vramAddr[i] = gUnknown_08E94550[i] + 0x1000;
+ vramAddr[i + 0x20] = gUnknown_08E94590[i] + 0x1000;
+ vramAddr[i + 0x40] = gUnknown_08E94590[i] + 0x1000;
+ }
+ }
+
+ vramAddr = (u16 *)(VRAM + 0x5AD4);
+
+ if (a == 0)
+ {
+ for (i = 0; i < 20; i++)
+ {
+ vramAddr[i] = gUnknown_08E94510[i] + 0x3000;
+ vramAddr[i + 0x20] = gUnknown_08E94510[i] + 0x3000;
+ vramAddr[i + 0x40] = gUnknown_08E94550[i] + 0x3000;
+ }
+ }
+ else
+ {
+ for (i = 0; i < 20; i++)
+ {
+ vramAddr[i] = gUnknown_08E94550[i] + 0x3000;
+ vramAddr[i + 0x20] = gUnknown_08E94590[i] + 0x3000;
+ vramAddr[i + 0x40] = gUnknown_08E94590[i] + 0x3000;
+ }
+ }
+}
+#else
+__attribute__((naked))
+static void sub_80A16CC(u8 a)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r9\n\
+ mov r6, r8\n\
+ push {r6,r7}\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r9, r0\n\
+ ldr r0, _080A1724 @ =0x06006ad4\n\
+ mov r12, r0\n\
+ mov r1, r9\n\
+ cmp r1, 0\n\
+ bne _080A172C\n\
+ movs r5, 0\n\
+ ldr r7, _080A1728 @ =gUnknown_08E94510\n\
+ movs r0, 0x80\n\
+ lsls r0, 5\n\
+ adds r6, r0, 0\n\
+ movs r1, 0x40\n\
+ adds r1, r7\n\
+ mov r8, r1\n\
+_080A16F4:\n\
+ lsls r2, r5, 1\n\
+ mov r0, r12\n\
+ adds r3, r2, r0\n\
+ adds r4, r2, r7\n\
+ ldrh r1, [r4]\n\
+ adds r0, r6, r1\n\
+ strh r0, [r3]\n\
+ adds r1, r3, 0\n\
+ adds r1, 0x40\n\
+ ldrh r4, [r4]\n\
+ adds r0, r6, r4\n\
+ strh r0, [r1]\n\
+ adds r3, 0x80\n\
+ add r2, r8\n\
+ ldrh r2, [r2]\n\
+ adds r0, r6, r2\n\
+ strh r0, [r3]\n\
+ adds r0, r5, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ cmp r5, 0x13\n\
+ bls _080A16F4\n\
+ b _080A1768\n\
+ .align 2, 0\n\
+_080A1724: .4byte 0x06006ad4\n\
+_080A1728: .4byte gUnknown_08E94510\n\
+_080A172C:\n\
+ movs r5, 0\n\
+ ldr r6, _080A17B0 @ =gUnknown_08E94550\n\
+ movs r7, 0x80\n\
+ lsls r7, 5\n\
+ adds r4, r7, 0\n\
+ movs r0, 0x40\n\
+ adds r0, r6\n\
+ mov r8, r0\n\
+_080A173C:\n\
+ lsls r1, r5, 1\n\
+ mov r7, r12\n\
+ adds r2, r1, r7\n\
+ adds r0, r1, r6\n\
+ ldrh r0, [r0]\n\
+ adds r0, r4, r0\n\
+ strh r0, [r2]\n\
+ adds r3, r2, 0\n\
+ adds r3, 0x40\n\
+ add r1, r8\n\
+ ldrh r7, [r1]\n\
+ adds r0, r4, r7\n\
+ strh r0, [r3]\n\
+ adds r2, 0x80\n\
+ ldrh r1, [r1]\n\
+ adds r0, r4, r1\n\
+ strh r0, [r2]\n\
+ adds r0, r5, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ cmp r5, 0x13\n\
+ bls _080A173C\n\
+_080A1768:\n\
+ ldr r0, _080A17B4 @ =0x06005ad4\n\
+ mov r12, r0\n\
+ mov r1, r9\n\
+ cmp r1, 0\n\
+ bne _080A17BC\n\
+ movs r5, 0\n\
+ ldr r7, _080A17B8 @ =gUnknown_08E94510\n\
+ movs r0, 0xC0\n\
+ lsls r0, 6\n\
+ adds r6, r0, 0\n\
+ movs r1, 0x40\n\
+ adds r1, r7\n\
+ mov r8, r1\n\
+_080A1782:\n\
+ lsls r2, r5, 1\n\
+ mov r0, r12\n\
+ adds r3, r2, r0\n\
+ adds r4, r2, r7\n\
+ ldrh r1, [r4]\n\
+ adds r0, r6, r1\n\
+ strh r0, [r3]\n\
+ adds r1, r3, 0\n\
+ adds r1, 0x40\n\
+ ldrh r4, [r4]\n\
+ adds r0, r6, r4\n\
+ strh r0, [r1]\n\
+ adds r3, 0x80\n\
+ add r2, r8\n\
+ ldrh r2, [r2]\n\
+ adds r0, r6, r2\n\
+ strh r0, [r3]\n\
+ adds r0, r5, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ cmp r5, 0x13\n\
+ bls _080A1782\n\
+ b _080A17F8\n\
+ .align 2, 0\n\
+_080A17B0: .4byte gUnknown_08E94550\n\
+_080A17B4: .4byte 0x06005ad4\n\
+_080A17B8: .4byte gUnknown_08E94510\n\
+_080A17BC:\n\
+ movs r5, 0\n\
+ ldr r6, _080A1804 @ =gUnknown_08E94550\n\
+ movs r7, 0xC0\n\
+ lsls r7, 6\n\
+ adds r4, r7, 0\n\
+ movs r0, 0x40\n\
+ adds r0, r6\n\
+ mov r8, r0\n\
+_080A17CC:\n\
+ lsls r1, r5, 1\n\
+ mov r7, r12\n\
+ adds r2, r1, r7\n\
+ adds r0, r1, r6\n\
+ ldrh r0, [r0]\n\
+ adds r0, r4, r0\n\
+ strh r0, [r2]\n\
+ adds r3, r2, 0\n\
+ adds r3, 0x40\n\
+ add r1, r8\n\
+ ldrh r7, [r1]\n\
+ adds r0, r4, r7\n\
+ strh r0, [r3]\n\
+ adds r2, 0x80\n\
+ ldrh r1, [r1]\n\
+ adds r0, r4, r1\n\
+ strh r0, [r2]\n\
+ adds r0, r5, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ cmp r5, 0x13\n\
+ bls _080A17CC\n\
+_080A17F8:\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\
+_080A1804: .4byte gUnknown_08E94550\n\
+ .syntax divided\n");
+}
+#endif // NONMATCHING
+
+u8 sub_80A1808(struct Pokemon *mon)
+{
+ u16 species;
+ u8 spriteId;
+
+ species = GetMonData(mon, MON_DATA_SPECIES2);
+ spriteId = CreateSprite(&gUnknown_02024E8C, 40, 64, 5);
+
+ FreeSpriteOamMatrix(&gSprites[spriteId]);
+
+ gSprites[spriteId].data[0] = species;
+ gSprites[spriteId].callback = sub_80A1888;
+
+ if (!IsPokeSpriteNotFlipped(species))
+ {
+ gSprites[spriteId].hFlip = 1;
+ }
+ else
+ {
+ gSprites[spriteId].hFlip = 0;
+ }
+
+ return spriteId;
+}
+
+static void sub_80A1888(struct Sprite *sprite)
+{
+ if (!gPaletteFade.active)
+ {
+ sprite->callback = SpriteCallbackDummy;
+
+ if (!GetMonData(&pssData.loadedMon, MON_DATA_IS_EGG))
+ {
+ PlayCry1(sprite->data[0], 0);
+ }
+ }
+}
+
+static void sub_80A18C4(void)
+{
+ u8 i;
+
+ for (i = 0; i < 30; i++)
+ {
+ ewram1A000[i] = 0xFF;
+ }
+}
+
+static void sub_80A18E4(u8 a)
+{
+ if (ewram1A000[a] != 0xFF)
+ {
+ DestroySprite(&gSprites[ewram1A000[a]]);
+ ewram1A000[a] = 0xFF;
+ }
+}
+
+static void sub_80A1918(u8 a, u8 invisible)
+{
+ gSprites[ewram1A000[a]].invisible = invisible;
+}
+
+static void sub_80A1950(void)
+{
+ u8 i;
+
+ for (i = 0; i < 5; i++)
+ {
+ if (ewram1A000[i] == 0xFF)
+ {
+ ewram1A000[i] = CreateSprite(&sSpriteTemplate_83C11C0, 0, 0, 2);
+ }
+
+ sub_80A1918(i, 1);
+ }
+}
+
+static void sub_80A198C(u8 animNum, u8 x, u8 y, u8 d)
+{
+ StartSpriteAnim(&gSprites[ewram1A000[d]], animNum);
+
+ gSprites[ewram1A000[d]].oam.paletteNum = sUnknown_PaletteNums[animNum];
+ gSprites[ewram1A000[d]].pos1.x = x + 16;
+ gSprites[ewram1A000[d]].pos1.y = y + 8;
+
+ sub_80A1918(d, 0);
+}
+
+static void sub_80A1A30(u8 a)
+{
+ u8 i;
+ s16 x;
+ u8 subPriority = 0;
+
+ if (pssData.page >= PSS_PAGE_BATTLE_MOVES)
+ {
+ if (a == 9)
+ {
+ subPriority = 1;
+ }
+
+ for (i = 0; i < 10; i++)
+ {
+ x = (i * 16) + 0x58;
+ ewram1A000[a + i] = CreateSprite(&sSpriteTemplate_83C1280, x, 40, subPriority);
+
+ if (i == 0)
+ {
+ StartSpriteAnim(&gSprites[ewram1A000[a]], 4);
+ }
+ else if (i == 9)
+ {
+ StartSpriteAnim(&gSprites[ewram1A000[a + i]], 5);
+ }
+ else
+ {
+ StartSpriteAnim(&gSprites[ewram1A000[a + i]], 6);
+ }
+
+ gSprites[ewram1A000[a + i]].callback = sub_80A1BC0;
+ gSprites[ewram1A000[a + i]].data[0] = a;
+ gSprites[ewram1A000[a + i]].data[1] = 0;
+ }
+ }
+}
+
+static void sub_80A1B1C(u8 a)
+{
+ u8 i;
+
+ for (i = 0; i < 10; i++)
+ {
+ sub_80A18E4(a + i);
+ }
+}
+
+static void sub_80A1B40(u8 a)
+{
+ u8 i;
+ a *= 3;
+
+ StartSpriteAnim(&gSprites[ewram1A000[9]], a + 4);
+
+ for (i = 0; i < 8; i++)
+ {
+ StartSpriteAnim(&gSprites[ewram1A000[10 + i]], a + 6);
+ }
+
+ StartSpriteAnim(&gSprites[ewram1A000[18]], a + 5);
+}
+
+static void sub_80A1BC0(struct Sprite *sprite)
+{
+ u8 animNum = sprite->animNum - 4;
+ if (animNum < 3)
+ {
+ sprite->data[1] = (sprite->data[1] + 1) & 0x1F;
+
+ if (sprite->data[1] > 24)
+ {
+ sprite->invisible = 1;
+ }
+ else
+ {
+ sprite->invisible = 0;
+ }
+ }
+ else
+ {
+ sprite->data[1] = 0;
+ sprite->invisible = 0;
+ }
+
+ if (sprite->data[0] == 9)
+ {
+ sprite->pos2.y = pssData.selectedMoveIndex * 16;
+ }
+ else
+ {
+ sprite->pos2.y = pssData.switchMoveIndex * 16;
+ }
+}
+
+__attribute__((naked))
+void sub_80A1C30(u8 a)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ lsls r0, r4, 2\n\
+ adds r0, r4\n\
+ lsls r0, 25\n\
+ lsrs r3, r0, 24\n\
+ adds r4, r3, 0\n\
+ adds r0, r3, 0\n\
+ adds r0, 0xA\n\
+ cmp r3, r0\n\
+ bge _080A1C82\n\
+ ldr r5, _080A1C88 @ =gSprites\n\
+ movs r7, 0x5\n\
+ negs r7, r7\n\
+ ldr r6, _080A1C8C @ =gSharedMem + 0x1A009\n\
+_080A1C50:\n\
+ adds r2, r3, r6\n\
+ ldrb r1, [r2]\n\
+ lsls r0, r1, 4\n\
+ adds r0, r1\n\
+ lsls r0, 2\n\
+ adds r0, r5\n\
+ movs r1, 0\n\
+ strh r1, [r0, 0x30]\n\
+ ldrb r0, [r2]\n\
+ lsls r1, r0, 4\n\
+ adds r1, r0\n\
+ lsls r1, 2\n\
+ adds r1, r5\n\
+ adds r1, 0x3E\n\
+ ldrb r2, [r1]\n\
+ adds r0, r7, 0\n\
+ ands r0, r2\n\
+ strb r0, [r1]\n\
+ adds r0, r3, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r3, r0, 24\n\
+ adds r0, r4, 0\n\
+ adds r0, 0xA\n\
+ cmp r3, r0\n\
+ blt _080A1C50\n\
+_080A1C82:\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080A1C88: .4byte gSprites\n\
+_080A1C8C: .4byte gSharedMem + 0x1A009\n\
+ .syntax divided\n");
+}
+
+u8 pokemon_ailments_get_primary(u32 status)
+{
+ if (status & 0x88)
+ return 1;
+ if (status & 0x40)
+ return 2;
+ if (status & 0x7)
+ return 3;
+ if (status & 0x20)
+ return 4;
+ if (status & 0x10)
+ return 5;
+
+ return 0;
+}
+
+u8 GetMonStatusAndPokerus(struct Pokemon *mon)
+{
+ u8 statusAilment;
+
+ if (GetMonData(mon, MON_DATA_HP) == 0)
+ {
+ return 7;
+ }
+
+ statusAilment = pokemon_ailments_get_primary(GetMonData(mon, MON_DATA_STATUS));
+ if (statusAilment == 0)
+ {
+ if (!CheckPartyPokerus(mon, 0))
+ {
+ return 0;
+ }
+ else
+ {
+ return 6;
+ }
+ }
+
+ return statusAilment;
+}
+
+#ifdef NONMATCHING
+void sub_80A1D18(void)
+{
+ struct Pokemon mon;
+ u8 statusAndPkrs;
+ u8 statusAndPkrs2;
+
+ sub_809F678(&mon);
+ statusAndPkrs = GetMonStatusAndPokerus(&mon);
+
+ if (statusAndPkrs)
+ {
+ statusAndPkrs2 = statusAndPkrs - 1;
+
+ if (ewram1A000[29] == 0xFF)
+ {
+ ewram1A000[29] = CreateSprite(&sSpriteTemplate_83C1304, 64, 152, 0);
+ }
+ }
+ else
+ {
+ sub_80A18E4(29);
+ return;
+ }
+
+ StartSpriteAnim(&gSprites[ewram1A000[29]], statusAndPkrs2);
+}
+#else
+__attribute__((naked))
+void sub_80A1D18(void)
+{
+ asm(".syntax unified\n\
+ push {r4,r5,lr}\n\
+ sub sp, 0x64\n\
+ mov r0, sp\n\
+ bl sub_809F678\n\
+ mov r0, sp\n\
+ bl GetMonStatusAndPokerus\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0\n\
+ beq _080A1D58\n\
+ subs r0, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ ldr r4, _080A1D50 @ =gSharedMem + 0x1A01D\n\
+ ldrb r0, [r4]\n\
+ cmp r0, 0xFF\n\
+ bne _080A1D60\n\
+ ldr r0, _080A1D54 @ =sSpriteTemplate_83C1304\n\
+ movs r1, 0x40\n\
+ movs r2, 0x98\n\
+ movs r3, 0\n\
+ bl CreateSprite\n\
+ strb r0, [r4]\n\
+ b _080A1D60\n\
+ .align 2, 0\n\
+_080A1D50: .4byte gSharedMem + 0x1A01D\n\
+_080A1D54: .4byte sSpriteTemplate_83C1304\n\
+_080A1D58:\n\
+ movs r0, 0x1D\n\
+ bl sub_80A18E4\n\
+ b _080A1D74\n\
+_080A1D60:\n\
+ ldr r0, _080A1D7C @ =gSharedMem + 0x1A01D\n\
+ ldrb r1, [r0]\n\
+ lsls r0, r1, 4\n\
+ adds r0, r1\n\
+ lsls r0, 2\n\
+ ldr r1, _080A1D80 @ =gSprites\n\
+ adds r0, r1\n\
+ adds r1, r5, 0\n\
+ bl StartSpriteAnim\n\
+_080A1D74:\n\
+ add sp, 0x64\n\
+ pop {r4,r5}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080A1D7C: .4byte gSharedMem + 0x1A01D\n\
+_080A1D80: .4byte gSprites\n\
+ .syntax divided\n");
+}
+#endif // NONMATCHING
+
+static void sub_80A1D84(struct Pokemon *mon)
+{
+ struct Sprite *sprite;
+
+ sprite = sub_80F7920(0x7533, 0x7533, sSummaryScreenMonMarkingsPalette);
+ gUnknown_020384F4 = sprite;
+
+ if (sprite != NULL)
+ {
+ u8 markings = GetMonData(mon, MON_DATA_MARKINGS);
+ StartSpriteAnim(sprite, markings);
+
+ gUnknown_020384F4->pos1.x = 60;
+ gUnknown_020384F4->pos1.y = 26;
+ }
+}
+
+static void sub_80A1DCC(struct Pokemon *mon)
+{
+ DestroySprite(gUnknown_020384F4);
+ sub_80A1D84(mon);
+}
+
+static void sub_80A1DE8(struct Pokemon *mon)
+{
+ u8 ball = ball_number_to_ball_processing_index(GetMonData(mon, MON_DATA_POKEBALL));
+ sub_80478DC(ball);
+
+ pssData.ballSpriteId = CreateSprite(&gBallSpriteTemplates[ball], 6, 136, 0);
+ gSprites[pssData.ballSpriteId].callback = SpriteCallbackDummy;
+ gSprites[pssData.ballSpriteId].oam.priority = 3;
+}
+
+static u8 *sub_80A1E58(u8 *text, u8 id)
+{
+ if (id != 0xFF)
+ {
+ const u8 *ptr = sUnknown_083C15BC;
+ while (*ptr != 0xFF && *ptr != id)
+ {
+ ptr += 4;
+ }
+
+ text[0] = EXT_CTRL_CODE_BEGIN;
+ text[1] = 4;
+ text[2] = ptr[1];
+ text[3] = ptr[2];
+ text[4] = ptr[3];
+
+ text += 5;
+ }
+
+ return text;
+}
+
+u8 *sub_80A1E9C(u8 *dest, const u8 *src, u8 id)
+{
+ u8 arr[3];
+
+ sub_8072CD4(&arr[0], &arr[1], &arr[2]);
+
+ dest = sub_80A1E58(dest, id);
+ dest = StringCopy(dest, src);
+
+ if (id != 0xFF)
+ {
+ dest[0] = EXT_CTRL_CODE_BEGIN;
+ dest[1] = 4;
+ dest[2] = arr[0];
+ dest[3] = arr[1];
+ dest[4] = arr[2];
+ dest[5] = 0xFF;
+
+ dest += 5;
+ }
+
+ return dest;
+}
+
+static void sub_80A1EF8(const u8 *text, u8 id, u8 left, u16 top, s32 e)
+{
+ sub_80A1E9C(gStringVar4, text, id);
+ MenuPrint_PixelCoords(gStringVar4, left, top, (bool8)e);
+}
+
+static void sub_80A1F48(const u8 *text, u8 id, u8 c, u8 d, u16 e)
+{
+ sub_80A1E9C(gStringVar4, text, id);
+ sub_8072BD8(gStringVar4, c, d, e);
+}
+
+static void sub_80A1F98(s32 value, u8 id, u8 n, u8 mode, u8 left, u16 top, s32 e)
+{
+ ConvertIntToDecimalStringN(gStringVar1, value, mode, n);
+ sub_80A1EF8(gStringVar1, id, left, top, e);
+}
+
+static void sub_80A1FF8(const u8 *text, u8 id, u8 left, u8 top)
+{
+ sub_80A1E9C(gStringVar4, text, id);
+ MenuPrint(gStringVar4, left, top);
+}
+
+u8 *PokemonSummaryScreen_CopyPokemonLevel(u8 *dest, u8 level)
+{
+ u8 buffer[12];
+
+ dest[0] = 0x34;
+ dest++;
+
+ if (level == 0)
+ {
+ level = 5;
+ }
+
+ ConvertIntToDecimalString(buffer, level);
+ dest = sub_80A1E9C(dest, buffer, 14);
+ dest = StringCopy(dest, gOtherText_Comma);
+
+ return dest;
+}
+
+static void sub_80A2078(int taskId)
+{
+ gUnknown_03005CF0 = gTasks[taskId].func;
+ gTasks[taskId].func = sub_80A20A8;
+ gTasks[taskId].func((u8)taskId);
+}
+
+static void sub_80A20A8(u8 taskId)
+{
+ if (sub_8055870() != TRUE)
+ {
+ gTasks[taskId].func = gUnknown_03005CF0;
+ }
+}
diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c
deleted file mode 100644
index 00a0bea29..000000000
--- a/src/pokemon_summary_screen.c
+++ /dev/null
@@ -1,180 +0,0 @@
-#include "global.h"
-#include "pokemon_summary_screen.h"
-#include "link.h"
-#include "menu.h"
-#include "pokemon.h"
-#include "region_map.h"
-#include "string_util.h"
-#include "strings2.h"
-#include "tv.h"
-
-extern struct Pokemon *unk_2018000;
-
-bool8 PokemonSummaryScreen_CheckOT(struct Pokemon *mon)
-{
- u32 trainerId;
-
- if (unk_2018000 == gEnemyParty)
- {
- u8 enemyId = GetMultiplayerId() ^ 1;
- trainerId = gLinkPlayers[enemyId].trainerId & 0xFFFF;
- StringCopy(gStringVar1, gLinkPlayers[enemyId].name);
- StripExtCtrlCodes(gStringVar1);
- }
- else
- {
- trainerId = GetPlayerTrainerId() & 0xFFFF;
- StringCopy(gStringVar1, gSaveBlock2.playerName);
- }
-
- if (trainerId != (GetMonData(mon, MON_DATA_OT_ID) & 0xFFFF))
- return FALSE;
-
- GetMonData(mon, MON_DATA_OT_NAME, gStringVar2);
-
- if (!StringCompareWithoutExtCtrlCodes(gStringVar1, gStringVar2))
- return TRUE;
-
- return FALSE;
-}
-
-void PokemonSummaryScreen_PrintEggTrainerMemo(struct Pokemon *mon, u8 left, u8 top)
-{
- u8 locationMet;
- u8 gameMet = GetMonData(mon, MON_DATA_MET_GAME);
-
- if (!(gameMet == VERSION_RUBY || gameMet == VERSION_SAPPHIRE || gameMet == VERSION_EMERALD))
- {
- MenuPrint(gOtherText_EggObtainedInTrade, left, top);
- return;
- }
-
- locationMet = GetMonData(mon, MON_DATA_MET_LOCATION);
-
- if (locationMet == 255)
- {
- MenuPrint(gOtherText_EggNicePlace, left, top);
- return;
- }
-
- if (!PokemonSummaryScreen_CheckOT(mon))
- {
- MenuPrint(gOtherText_EggObtainedInTrade, left, top);
- return;
- }
-
- asm(""); // needed to match for some reason
-
- if (locationMet == 253)
- {
- MenuPrint(gOtherText_EggHotSprings, left, top);
- return;
- }
-
- MenuPrint(gOtherText_EggDayCare, left, top);
-}
-
-void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *pokemon, u8 left, u8 top)
-{
- u8 locationMet;
- u8 gameMet;
- u8 *ptr = gStringVar4;
- u8 nature = GetNature(pokemon);
-
-#if ENGLISH
- ptr = sub_80A1E9C(ptr, gNatureNames[nature], 14);
-
- if (nature != NATURE_BOLD && nature != NATURE_GENTLE)
- {
- ptr = StringCopy(ptr, gOtherText_Terminator4);
- }
-
- ptr = StringCopy(ptr, gOtherText_Nature);
-#elif GERMAN
- ptr = StringCopy(gStringVar4, gOtherText_Nature);
- ptr = sub_80A1E9C(ptr, gNatureNames[nature], 14);
- ptr = StringCopy(ptr, gOtherText_Terminator4);
-#endif
-
- if (PokemonSummaryScreen_CheckOT(pokemon) == TRUE)
- {
- locationMet = GetMonData(pokemon, MON_DATA_MET_LOCATION);
-
- if (GetMonData(pokemon, MON_DATA_MET_LEVEL) == 0)
- {
- ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, 5);
- *ptr = CHAR_NEWLINE;
- ptr++;
-
- CopyLocationName(gStringVar1, locationMet);
- ptr = sub_80A1E9C(ptr, gStringVar1, 14);
- StringCopy(ptr, gOtherText_Egg2);
- }
- else if (locationMet >= 88)
- {
- *ptr = CHAR_NEWLINE;
- ptr++;
-
- StringCopy(ptr, gOtherText_ObtainedInTrade);
- }
- else
- {
- u8 levelMet = GetMonData(pokemon, MON_DATA_MET_LEVEL);
-
- ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, levelMet);
- *ptr = CHAR_NEWLINE;
- ptr++;
-
- CopyLocationName(gStringVar1, locationMet);
- ptr = sub_80A1E9C(ptr, gStringVar1, 14);
- StringCopy(ptr, gOtherText_Met);
- }
- }
- else
- {
- gameMet = GetMonData(pokemon, MON_DATA_MET_GAME);
-
- if (!(gameMet == VERSION_RUBY || gameMet == VERSION_SAPPHIRE || gameMet == VERSION_EMERALD))
- {
- *ptr = CHAR_NEWLINE;
- ptr++;
-
- StringCopy(ptr, gOtherText_ObtainedInTrade);
- }
- else
- {
- locationMet = GetMonData(pokemon, MON_DATA_MET_LOCATION);
- if (locationMet == 0xFF)
- {
- u8 levelMet = GetMonData(pokemon, MON_DATA_MET_LEVEL);
-
- ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, levelMet);
- *ptr = CHAR_NEWLINE;
- ptr++;
-
- StringCopy(ptr, gOtherText_FatefulEncounter);
- }
- else if (locationMet >= 88)
- {
- *ptr = CHAR_NEWLINE;
- ptr++;
-
- StringCopy(ptr, gOtherText_ObtainedInTrade);
- }
- else
- {
- u8 levelMet = GetMonData(pokemon, MON_DATA_MET_LEVEL);
-
- ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, levelMet);
- *ptr = CHAR_NEWLINE;
- ptr++;
-
- CopyLocationName(gStringVar1, locationMet);
- ptr = sub_80A1E9C(ptr, gStringVar1, 14);
- StringCopy(ptr, gOtherText_Met2);
- }
- }
- }
-
- MenuPrint(gStringVar4, left++, top++);
-}
diff --git a/src/pokenav.c b/src/pokenav_after.c
index 84ed7b14b..330305ea3 100644
--- a/src/pokenav.c
+++ b/src/pokenav_after.c
@@ -6,16 +6,10 @@
#include "de_rom_8040FE0.h"
#include "string_util.h"
-void sub_80F700C(u8 *arg0, u16 arg1) {
- struct Trainer *trainer;
- u8 *ptr;
-
-#if ENGLISH
- trainer = (struct Trainer *) &gTrainers[gUnknown_083DFEC4->unkCEE8[arg1].unk0];
-#elif GERMAN
- const u16 trainerIndex = gUnknown_083DFEC4->unkCEE8[arg1].unk0;
- trainer = (struct Trainer *) &gTrainers[trainerIndex];
-#endif
+void sub_80F700C(u8 *arg0, u16 arg1)
+{
+ const struct Trainer *trainer = &gTrainers[gUnknown_083DFEC4->unkCEE8[arg1].unk0];
+ u8 *ptr = arg0;
ptr = arg0;
if (arg1 < gUnknown_083DFEC4->unkD158)
@@ -23,7 +17,7 @@ void sub_80F700C(u8 *arg0, u16 arg1) {
#if ENGLISH
ptr = StringCopy(ptr, gTrainerClassNames[trainer->trainerClass]);
#elif GERMAN
- ptr = StringCopy(ptr, de_sub_8041024(0, trainerIndex));
+ ptr = StringCopy(ptr, de_sub_8041024(0, gUnknown_083DFEC4->unkCEE8[arg1].unk0));
#endif
ptr[0] = 0xFC;
diff --git a/src/pokenav_before.c b/src/pokenav_before.c
new file mode 100644
index 000000000..8a67390ad
--- /dev/null
+++ b/src/pokenav_before.c
@@ -0,0 +1,4610 @@
+#include "global.h"
+#include "main.h"
+#include "pokenav.h"
+#include "ewram.h"
+#include "battle.h"
+#include "data2.h"
+#include "de_rom_8040FE0.h"
+#include "event_data.h"
+#include "constants/flags.h"
+#include "landmark.h"
+#include "link.h"
+#include "menu.h"
+#include "overworld.h"
+#include "palette.h"
+#include "region_map.h"
+#include "constants/songs.h"
+#include "string_util.h"
+#include "sound.h"
+#include "task.h"
+#include "text.h"
+#include "unknown_task.h"
+
+extern u8 ewram[];
+
+struct UnknownPokenav0
+{
+ /* 0x0000 */ u8 var0[0x0300];
+ /* 0x0300 */ void (*var300)(void);
+ /* 0x0304 */ u16 var304;
+ /* 0x0306 */ u16 var306;
+ /* 0x0308 */ u32 var308;
+ /* 0x030C */ u8 fill030C[0x6a9f];
+ /* 0x6dab */ u8 var6dab;
+ /* 0x6dac */ u8 var6dac;
+ /* 0x6dad */ u8 var6dad;
+ /* 0x6dae */ u8 var6dae;
+ /* 0x6daf */ u8 fill6daf[0x3];
+ /* 0x6db2 */ u8 var6db2[5];
+ /* 0x6db7 */ u8 fill6db7[0x25];
+ /* 0x6ddc */ s8 var6ddc;
+ /* 0x6ddd */ u8 fill6ddd[0x13];
+ /* 0x6df0 */ s8 var6df0;
+ /* 0x6df1 */ u8 fill6df1[0xB];
+ /* 0x6dfc */ u8 var6dfc;
+ /* 0x6dfd */ u8 fill6dfd[0x17];
+ /* 0x6e14 */ u8 var6e14;
+ /* 0x6e15 */ u8 var6e15;
+ /* 0x6e16 */ u8 var6e16;
+ /* 0x6e17 */ u8 var6e17;
+ /* 0x6e18 */ u8 fill6e18[0x78];
+ /* 0x6e90 */ u8 var6e90;
+ /* 0x6e91 */ u8 fill6e91[0x4];
+ /* 0x6e95 */ u8 var6e95;
+ /* 0x6e96 */ u8 var6e96[0x814];
+ /* 0x76AA */ u8 var76aa;
+ /* 0x76AB */ u8 fill76AB[0x10BD];
+ /* 0x8768 */ u32 var8768;
+ /* 0x876C */ u8 fill876C[0x2];
+ /* 0x876E */ u8 var876E;
+ /* 0x876F */ u8 fill876F[0x5];
+ /* 0x8774 */ s16 var8774;
+ /* 0x8776 */ u8 fill8776[0x55];
+ /* 0x87CB */ u8 var87CB;
+ /* 0x87CC */ u8 fill87CC[0xC];
+ /* 0x87D8 */ u8 var87D8;
+ /* 0x87D9 */ u8 fill87D9[0x1];
+ /* 0x87DA */ s16 var87DA;
+ /* 0x87DC */ s16 var87DC;
+ /* 0x87DE */ u8 fill87DE[0x4a];
+ /* 0x8828 */ u8 playerPartyCount;
+ /* 0x8829 */ u8 fill8829[0x07bf];
+ /* 0x8FE8 */ s8 var8fe8;
+ /* 0x8FE9 */ u8 fill8FE9[0x16];
+ /* 0x8FFF */ u8 var8fff[5];
+ /* 0x9004 */ u8 fill9004[0x340];
+ /* 0x9344 */ u8 var9344;
+ /* 0x9345 */ u8 fill9345[0x3b8b];
+ /* 0xced0 */ u32 varCED0;
+ /* 0xced4 */ u8 fillCED4[0x284];
+ /* 0xD158 */ u16 varD158;
+ /* 0xD15A */ u8 fillD15A[0x8];
+ /* 0xD162 */ u8 varD162;
+};
+
+struct UnknownPokenav0_1 {
+ u8 fill6dad[0x6dad];
+ s8 var6dad;
+ s8 var6dae;
+};
+
+IWRAM_DATA void (*gUnknown_03000744)(void);
+
+extern const u8 gUnknown_083E0314[];
+extern const u16 gUnknown_08E9F9E8[];
+extern const u16 gUnknown_083E0274[];
+extern const u8 gUnknown_08E9FC64[];
+extern const u8 gUnknown_083E0354[];
+extern const u8 gUnknown_08E9FD64[];
+extern const u8 gUnknown_08E9FE54[];
+extern const u8 gUnknown_08E9FD1C[];
+extern const u16 gPokenavConditionSearch2_Pal[];
+extern const u8 gUnknown_083E0334[];
+extern const u16 gUnknown_083E02B4[];
+extern const u8 gPokenavConditionSearch2_Gfx[];
+extern const u8 gUnknownPalette_81E6692[];
+extern const u8 gUnknown_083E0254[];
+extern const u8 gUnknown_08E9FEB4[];
+extern const u8 gUnknown_083E01AC[];
+extern const u8 gUnknown_08E9AC4C[];
+extern const u8 gPokenavConditionMenu2_Pal[];
+extern const u8 gPokenavConditionView_Gfx[];
+extern const u8 gUnknown_08E9ABB4[];
+extern const u8 gUnknown_08E9AC2C[];
+extern const u8 *const gPokenavCityMaps[][2];
+extern const u8 gPokenavHoennMapSquares_Pal[];
+extern const u8 gPokenavHoennMapSquares_Gfx[];
+extern const u16 gUnknown_083E003C[];
+extern const u8 *const gUnknown_083E31B0[];
+extern const u8 *const gUnknown_083E31CC[];
+extern const u8 *const gUnknown_083E31D8[];
+extern u8 *gUnknown_083DFEC8;
+extern const u8 gUnknown_083DFEEC[];
+extern const u8 gUnknown_083E005C[];
+extern const u8 gUnknown_083E007C[];
+extern const u8 gPokenavOutlineTilemap[];
+extern const u8 gPokenavOutlineTiles[];
+extern const u8 gPokenavOutlinePalette[];
+extern const u8 gUnknown_083DFECC[];
+extern const u8 gUnknown_083DFF8C[];
+extern const u8 gPokenavHoennMapMisc_Gfx[];
+extern const u8 gUnknown_08E99FB0[];
+extern const u8 gUnknown_08E9A100[];
+extern const u16 gPokenavHoennMap1_Pal[];
+
+static void sub_80EBCA8();
+static void sub_80EEE20();
+static bool8 sub_80EEE54();
+static void sub_80EEE08();
+static void sub_80EED2C(u8);
+static void sub_80EC268();
+static void sub_80EED1C();
+static void sub_80EE9C0(u8, u8, u8);
+static bool8 sub_80EEA0C();
+static bool8 sub_80EEC10();
+static void sub_80EED9C();
+static void sub_80EDB88();
+static void sub_80EC4A0();
+static void sub_80EC81C();
+static void sub_80EE96C();
+static void sub_80EE3D8();
+static bool8 sub_80EEF34();
+static void sub_80EED0C();
+static void sub_80EC67C();
+static void sub_80EC86C();
+static bool8 sub_80EEC90();
+static void sub_80ED620();
+static void sub_80EC960();
+static void sub_80ED01C();
+static void sub_80ECC08();
+static void sub_80ED31C();
+static void sub_80ED4D8();
+static void sub_80ED858();
+static void sub_80EDDBC();
+static void sub_80EDE70();
+static void sub_80EDEE4();
+static void sub_80EE06C();
+static void sub_80EE294();
+static void sub_80EE58C();
+static void sub_80EE658();
+static void sub_80EE8F4();
+static void sub_80EEDC4();
+
+extern bool8 sub_80F0944(void);
+extern void sub_80F081C();
+extern void sub_80F0900(void);
+extern void sub_80F443C(u8 *, u16);
+extern bool8 sub_80F162C(u8);
+extern void sub_80F01E0(u16);
+extern void sub_80F01A4(void);
+extern void sub_80F1614(void);
+extern void sub_80EFD3C(void);
+extern void sub_8095C8C();
+extern void sub_80EFDA0(void);
+extern void sub_80EFD74(void);
+extern void sub_80F1A80(void);
+extern bool8 sub_80EFC64(void);
+extern void sub_80EFC3C(void);
+extern void sub_80EF624(const u16 *, const u16 *, u8, u8, u16 *);
+extern void sub_80EF7D4(void);
+extern void sub_80EF54C(u8);
+extern void sub_809D104(u16 *, u16, u16, const u8 *, u16, u16, u16, u16);
+extern void sub_80EF58C(u8);
+extern void sub_80F6FFC();
+extern void sub_80F3294();
+extern void sub_80F0B24();
+extern bool8 sub_80F0B44();
+extern void sub_80F0F64();
+extern bool8 sub_80F0FEC();
+extern void sub_80F6FB8();
+extern void sub_80F6DB8();
+extern void sub_80F0CD8();
+extern bool8 sub_80F6E9C();
+extern bool8 sub_80F0D5C();
+extern bool8 sub_80F6ED4();
+extern bool8 sub_80F0EF4();
+extern void sub_80F2FB0();
+extern void sub_80F0FA0();
+extern void sub_80F0C28();
+extern bool8 sub_80F0C48();
+extern bool8 sub_80F70FC();
+extern void sub_80F708C(u32);
+extern void sub_80F4394();
+extern void sub_80F0EC0();
+extern void sub_80F700C();
+extern void sub_80F42C4();
+extern void sub_80F0FFC();
+extern void sub_80F6F10();
+extern void sub_80F3C2C();
+extern void sub_80F15A8();
+extern void sub_80F6A4C();
+extern bool8 sub_80F6AF0();
+extern void sub_80F3B00();
+extern bool8 sub_80F3B58();
+extern void sub_80F1494();
+extern u8 sub_80F68E8();
+extern void sub_80F3B94();
+extern bool8 sub_80F3BD4();
+extern void sub_80F66E0();
+extern bool8 sub_80F1080();
+extern void sub_80F38B8();
+extern bool8 sub_80F38EC();
+extern void sub_80F638C();
+extern bool8 sub_80F63D0();
+extern void sub_80F4CF0();
+extern void sub_80EFF34();
+extern bool8 sub_80EFF68();
+extern void sub_80F35B4();
+extern void sub_80F6134();
+extern u8 sub_80F5DD4();
+extern void ShowMapNamePopUpWindow();
+extern bool8 sub_80F0718();
+extern bool8 sub_80F3264();
+extern void sub_80F4D44();
+extern bool8 sub_80F4D88();
+extern void sub_80F0264(u8);
+extern bool8 sub_80F02A0();
+extern void sub_80F3008();
+extern void sub_80F3130();
+extern void sub_80F2D6C(u32);
+extern bool8 sub_80F1E6C();
+extern void sub_80EF9F8(void);
+extern bool8 sub_80EFBDC(bool8);
+extern void sub_80EFBB0(void);
+extern void sub_80F2DF4();
+extern void sub_80F1E84();
+extern bool8 sub_80F1F10();
+extern void sub_80EEFBC(u8);
+extern void sub_80F2620();
+extern void sub_80EF814(void);
+extern void sub_80EF840(void);
+extern bool8 sub_80EF874(void);
+extern void sub_80F2DD8();
+extern bool8 sub_80F6250();
+extern void sub_80F6208();
+extern void sub_80F208C();
+extern void sub_80F6C20();
+extern void sub_80F3FF0();
+extern bool8 sub_80F4024();
+extern void sub_80F2598();
+extern void sub_80EF248(u8);
+extern bool8 sub_80EF284(u8);
+extern void sub_80F1B8C();
+extern bool8 sub_80F1BC8(u32 unk);
+extern void sub_80F1DF0();
+extern bool8 sub_80F1E50();
+extern void sub_80EF428(u8, u8);
+extern bool8 sub_80EEF78();
+extern void sub_80F1A90();
+extern void sub_80F2D04(u32);
+extern bool8 sub_80F1AC4();
+extern void sub_80F36F0();
+extern bool8 sub_80F3724();
+extern void sub_80EBC10();
+extern void sub_80EBDBC(void (*func)(void));
+extern void sub_80EBBE8();
+extern bool8 sub_80F26BC(void);
+extern void sub_80EBDD8();
+extern void sub_80EBD90();
+extern void sub_80EBD18();
+extern void sub_80F1A74();
+extern void sub_80F1FF0();
+extern void sub_80FB260();
+extern void sub_80EFE7C(void);
+extern void sub_80F5BF0();
+extern void sub_80F6F64();
+extern void sub_80F19FC();
+
+extern u16 gKeyRepeatStartDelay;
+
+
+void sub_80EBA5C()
+{
+ switch (gMain.state)
+ {
+ default:
+ gMain.state = 0;
+ case 0:
+ ewram0_10.var6dac = is_c1_link_related_active();
+ if (!ewram0_10.var6dac)
+ {
+ ewram0_10.var6dab = 0;
+ gMain.state++;
+ SetMainCallback2(&sub_80EBBE8);
+ }
+ break;
+ case 1:
+ SetVBlankCallback(NULL);
+ break;
+ case 2:
+ ResetPaletteFade();
+ break;
+ case 3:
+ ResetSpriteData();
+ break;
+ case 4:
+ FreeAllSpritePalettes();
+ break;
+ case 5:
+ ResetTasks();
+ break;
+ case 6:
+ remove_some_task();
+ break;
+ case 7:
+ sub_80F1A90();
+ gMain.state++;
+ case 8:
+ if (sub_80F1AC4())
+ return;
+ break;
+ case 9:
+ sub_80F2688();
+ gMain.state++;
+ // fall through
+ case 10:
+ if (sub_80F26BC())
+ return;
+ break;
+ case 11:
+ sub_80F36F0();
+ gMain.state++;
+ case 12:
+ if (sub_80F3724())
+ return;
+ break;
+ case 13:
+ sub_80EBC10();
+ sub_80EBDBC(&sub_80EBDD8);
+ break;
+ case 14:
+ ewram0_10.var6dab = 1;
+ PlaySE(SE_PN_ON);
+ SetMainCallback2(&sub_80EBD90);
+ SetVBlankCallback(&sub_80EBD18);
+ sub_80F1A74();
+ break;
+ }
+
+ gMain.state++;
+}
+
+void sub_80EBBE8()
+{
+ while (!ewram0_10.var6dab)
+ sub_80EBA5C();
+}
+
+void sub_80EBC10()
+{
+ u16 i;
+ u16 *var1;
+
+ gKeyRepeatStartDelay = 0x14;
+ ewram0_10.playerPartyCount = CalculatePlayerPartyCount();
+ ewram0_10.var6ddc = 0;
+ ewram0_10.var9344 = 0;
+ ewram0_10.var8768 = 0;
+ ewram0_10.varCED0 = 0;
+
+ for (i = 0; i < 5; ++i)
+ {
+ ewram0_10.var8fff[i] = 0;
+ var1 = (u16 *)ewram0_10.var0;
+ var1[i*2 + 0x4820] = 0x9B;
+ var1[i*2 + 0x4821] = 0x5B;
+ }
+
+ ewram0_10.var6e95 = 0;
+ sub_80EBCA8();
+}
+
+void sub_80EBCA8()
+{
+ ewram0_10.var6db2[0] = 1;
+ ewram0_10.var6db2[1] = 2;
+ ewram0_10.var6db2[2] = 3;
+
+ if (FlagGet(FLAG_SYS_RIBBON_GET))
+ ewram0_10.var6db2[3] = 4;
+ else
+ ewram0_10.var6db2[3] = 0;
+
+ ewram0_10.var6db2[4] = 5;
+}
+
+void sub_80EBD18()
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ sub_80F1FF0();
+}
+
+void sub_80EBD30()
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ UpdateRegionMapVideoRegs();
+ sub_80EFE7C();
+}
+
+void sub_80EBD4C()
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ sub_80F5BF0();
+ sub_8089668();
+}
+
+void sub_80EBD68()
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ sub_80F6F64();
+}
+
+void sub_80EBD80()
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+}
+
+void sub_80EBD90()
+{
+ ewram0_10.var300();
+ AnimateSprites();
+ BuildOamBuffer();
+ RunTasks();
+ UpdatePaletteFade();
+ sub_80F19FC();
+}
+
+void sub_80EBDBC(void (*func)(void))
+{
+ ewram0_10.var300 = func;
+ ewram0_10.var304 = 0;
+}
+
+void sub_80EBDD8()
+{
+ switch (ewram0_10.var304)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ REG_DISPCNT = 0;
+ ewram0_10.var6dad = ewram0_10.var6ddc;
+ ewram0_10.var6dae = 5;
+ ewram0_10.var304++;
+ break;
+ case 1:
+ sub_80F3FF0();
+ ewram0_10.var304++;
+ // fall through
+ case 2:
+ if (!sub_80F4024())
+ ewram0_10.var304++;
+ break;
+ case 3:
+ sub_80F2598();
+ ewram0_10.var304++;
+ break;
+ case 4:
+ sub_80EEE20();
+ ewram0_10.var304++;
+ // fall through
+ case 5:
+ if (!sub_80EEE54())
+ {
+ sub_80EEE08();
+ ewram0_10.var304++;
+ }
+ break;
+ case 6:
+ sub_80EF248(0);
+ ewram0_10.var304++;
+ // fall through
+ case 7:
+ if (!sub_80EF284(0))
+ ewram0_10.var304++;
+ break;
+ case 8:
+ sub_80F1B8C(0);
+ ewram0_10.var304++;
+ // fall through
+ case 9:
+ if (!sub_80F1BC8(0))
+ ewram0_10.var304++;
+ break;
+ case 10:
+ SetVBlankCallback(&sub_80EBD18);
+ ewram0_10.var304++;
+ break;
+ case 11:
+ BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
+ ewram0_10.var304++;
+ break;
+ case 12:
+ sub_80EED2C(0);
+ ewram0_10.var304++;
+ break;
+ case 13:
+ if (!gPaletteFade.active)
+ ewram0_10.var304++;
+ break;
+ case 14:
+ sub_80F2C80(0);
+ ewram0_10.var304++;
+ // fall through
+ case 15:
+ if (!sub_80F2CBC(0))
+ ewram0_10.var304++;
+ break;
+ case 16:
+ sub_80F1DF0();
+ ewram0_10.var304++;
+ break;
+ case 17:
+ if (!sub_80F1E50())
+ {
+ sub_80EF428(0, 0);
+ sub_80EBDBC(&sub_80EC268);
+ }
+ break;
+ }
+}
+
+void sub_80EC00C()
+{
+ switch (ewram0_10.var304)
+ {
+ case 0:
+ if (!sub_80EEF78())
+ {
+ SetVBlankCallback(&sub_80EBD80);
+ sub_80EED1C();
+ ewram0_10.var6dad = ewram0_10.var6ddc;
+ ewram0_10.var6dae = 5;
+ sub_80EEE08();
+ ewram0_10.var304++;
+ }
+ break;
+ case 1:
+ sub_80EF248(0);
+ ewram0_10.var304++;
+ // fall through
+ case 2:
+ if (!sub_80EF284(0))
+ ewram0_10.var304++;
+ break;
+ case 3:
+ sub_80F1B8C(0);
+ ewram0_10.var304++;
+ // fall through
+ case 4:
+ if (!sub_80F1BC8(0))
+ ewram0_10.var304++;
+ break;
+ case 5:
+ if (!sub_8055870())
+ ewram0_10.var304++;
+ break;
+ case 6:
+ BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0);
+ SetVBlankCallback(&sub_80EBD18);
+ ewram0_10.var304++;
+ break;
+ case 7:
+ sub_80EED2C(0);
+ ewram0_10.var304++;
+ break;
+ case 8:
+ if (!gPaletteFade.active)
+ ewram0_10.var304++;
+ break;
+ case 9:
+ sub_80F2598();
+ ewram0_10.var304++;
+ break;
+ case 10:
+ sub_80F2C80(0);
+ ewram0_10.var304++;
+ // fall through
+ case 11:
+ if (!sub_80F2CBC(0))
+ ewram0_10.var304++;
+ break;
+ case 12:
+ sub_80F1DF0();
+ ewram0_10.var304++;
+ break;
+ case 13:
+ if (!sub_80F1E50())
+ {
+ sub_80EF428(0, ewram0_10.var6dad);
+ sub_80EBDBC(&sub_80EC268);
+ }
+ break;
+ }
+}
+
+void sub_80EC210()
+{
+ switch (ewram0_10.var304)
+ {
+ case 0:
+ sub_80F2D04(1);
+ sub_80EE9C0(0, ewram0_10.var6ddc, 0);
+ ewram0_10.var304++;
+ break;
+ case 1:
+ if (!sub_80EEA0C())
+ sub_80EBDBC(&sub_80EC268);
+ break;
+ }
+}
+
+void sub_80EC268()
+{
+ u8 var1;
+
+ switch (ewram0_10.var304)
+ {
+ case 0:
+ if (sub_80EEC10() != 0)
+ {
+ PlaySE(SE_SELECT);
+ sub_80EF428(0, ewram0_10.var6dad);
+ sub_80EED9C();
+ }
+ else
+ {
+ if (gMain.newKeys & A_BUTTON)
+ {
+ ewram0_10.var6ddc = ewram0_10.var6dad;
+ switch (ewram0_10.var6db2[ewram0_10.var6ddc] - 1)
+ {
+ case 0:
+ PlaySE(SE_SELECT);
+ sub_80EBDBC(&sub_80EC4A0);
+ break;
+ case 1:
+ PlaySE(SE_SELECT);
+ sub_80EBDBC(&sub_80EC81C);
+ break;
+ case 4:
+ ewram0_10.var304 = 1;
+ break;
+ case 3:
+ ewram0_10.var304 = 2;
+ break;
+ case 2:
+ ewram0_10.var304 = 6;
+ break;
+ }
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ ewram0_10.var304 = 1;
+ }
+ }
+ break;
+ case 1:
+ sub_80F208C();
+ sub_80EBDBC(&sub_80EE96C);
+ break;
+ case 2:
+ sub_80F6208();
+ ewram0_10.var304++;
+ // fall through
+ case 3:
+ if (!sub_80F6250())
+ ewram0_10.var304++;
+ break;
+ case 4:
+ if (!sub_8055870())
+ {
+ if (ewram0_10.var8fe8 != 0)
+ {
+ PlaySE(SE_SELECT);
+ sub_80EBDBC(&sub_80EDB88);
+ }
+ else
+ {
+ PlaySE(0x20);
+ sub_80EF428(0, 5);
+ ewram0_10.var304 = 0xFF;
+ }
+ }
+ break;
+ case 6:
+ sub_80F6C20();
+ if (ewram0_10.varD158 != 0)
+ {
+ PlaySE(SE_SELECT);
+ sub_80EBDBC(&sub_80EE3D8);
+ }
+ else
+ {
+ PlaySE(0x20);
+ sub_80EF428(0, 6);
+ ewram0_10.var304 = 0xFF;
+ }
+ break;
+ case 0xFF:
+ if ((var1 = sub_80EEC10()) != 0)
+ {
+ PlaySE(SE_SELECT);
+ sub_80EF428(0, ewram0_10.var6dad);
+ ewram0_10.var304 = 0;
+ sub_80EED9C();
+ }
+ else if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ sub_80EF428(0, ewram0_10.var6dad);
+ ewram0_10.var304 = var1;
+ }
+ break;
+ }
+}
+
+void sub_80EC4A0()
+{
+ u32 var1;
+
+ switch (ewram0_10.var304)
+ {
+ case 0:
+ sub_80F1E84();
+ sub_80F2D04(0);
+ ewram0_10.var304++;
+ break;
+ case 1:
+ if (!sub_80F1F10())
+ {
+ if (gSaveBlock2.regionMapZoom)
+ var1 = 0x7;
+ else
+ var1 = 0x8;
+ sub_80EEFBC(var1);
+ ewram0_10.var304++;
+ }
+ break;
+ case 2:
+ if (!sub_80EEF34())
+ {
+ BeginNormalPaletteFade(ewram0_10.var308, -1, 0x0, 0x10, 0);
+ ewram0_10.var304++;
+ }
+ break;
+ case 3:
+ if (!gPaletteFade.active)
+ {
+ SetVBlankCallback(NULL);
+ sub_80EED0C();
+ ewram0_10.var304++;
+ }
+ break;
+ case 4:
+ sub_80F2620();
+ ewram0_10.var304++;
+ break;
+ case 5:
+ sub_80EF814();
+ ewram0_10.var304++;
+ break;
+ case 6:
+ sub_80EF840();
+ ewram0_10.var304++;
+ // fall through
+ case 7:
+ if (!sub_80EF874())
+ ewram0_10.var304++;
+ break;
+ case 8:
+ sub_80F2C80(0x4);
+ ewram0_10.var304++;
+ // fall through
+ case 9:
+ if (!sub_80F2CBC(0x4))
+ ewram0_10.var304++;
+ break;
+ case 0xA:
+ sub_80F2DD8();
+ SetVBlankCallback(&sub_80EBD30);
+ ewram0_10.var304++;
+ break;
+ case 0xB:
+ if (!sub_8055870())
+ ewram0_10.var304++;
+ break;
+ case 0xC:
+ BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0);
+ ewram0_10.var304++;
+ break;
+ case 0xD:
+ sub_80EED2C(0x1);
+ ewram0_10.var304++;
+ break;
+ case 0xE:
+ if (!gPaletteFade.active)
+ sub_80EBDBC(&sub_80EC67C);
+ break;
+ }
+}
+
+void sub_80EC67C()
+{
+ switch (ewram0_10.var304)
+ {
+ case 0:
+ switch (sub_80FAB60())
+ {
+ case 1:
+ sub_80EED9C();
+ break;
+ case 3:
+ sub_80EF9F8();
+ break;
+ case 4:
+ PlaySE(SE_SELECT);
+ ewram0_10.var304 = 1;
+ break;
+ case 5:
+ PlaySE(SE_SELECT);
+ ewram0_10.var304 = 4;
+ break;
+ }
+ break;
+ case 1:
+ if (!ewram0_10.var6e90)
+ {
+ sub_80FAEC4();
+ ewram0_10.var304++;
+ }
+ else if (!sub_80EFBDC(1))
+ {
+ sub_80FAEC4();
+ ewram0_10.var304++;
+ }
+ break;
+ case 2:
+ if (!sub_80FAFC0())
+ {
+ if (!ewram0_10.var6e90)
+ {
+ sub_80EFBB0();
+ ewram0_10.var304 = 0;
+ }
+ else
+ {
+ ewram0_10.var304++;
+ }
+ }
+ break;
+ case 3:
+ if (!sub_80EFBDC(0))
+ {
+ sub_80EFBB0();
+ ewram0_10.var304 = 0;
+ }
+ break;
+ case 4:
+ BeginNormalPaletteFade(ewram0_10.var308, -1, 0, 0x10, 0);
+ ewram0_10.var304++;
+ break;
+ case 5:
+ if (!gPaletteFade.active)
+ {
+ sub_80F2DF4();
+ sub_80F2D04(0x4);
+ gSaveBlock2.regionMapZoom = (ewram0_10.var6e90 == 1) ? 1 : 0;
+ sub_80EBDBC(&sub_80EC00C);
+ }
+ break;
+ }
+}
+
+void sub_80EC81C()
+{
+ switch (ewram0_10.var304)
+ {
+ case 0:
+ sub_80F2D04(0);
+ sub_80EE9C0(1, 0, 1);
+ ewram0_10.var304++;
+ break;
+ case 1:
+ if (!sub_80EEA0C())
+ sub_80EBDBC(&sub_80EC86C);
+ break;
+ }
+}
+
+void sub_80EC86C()
+{
+ switch (ewram0_10.var304)
+ {
+ case 0:
+ if (sub_80EEC90())
+ {
+ PlaySE(SE_SELECT);
+ sub_80EF428(1, ewram0_10.var6dad);
+ sub_80EED9C();
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ ewram0_10.var6df0 = ewram0_10.var6dad;
+ switch (ewram0_10.var6df0)
+ {
+ case 0:
+ sub_80EBDBC(&sub_80ED620);
+ break;
+ case 1:
+ sub_80EBDBC(&sub_80EC960);
+ break;
+ case 2:
+ sub_80EBDBC(&sub_80EC210);
+ break;
+ }
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ ewram0_10.var6df0 = 0x2;
+ ewram0_10.var6dad = 0x2;
+ ewram0_10.var304++;
+ }
+ break;
+ case 1:
+ if (!sub_80F1E6C())
+ sub_80EBDBC(&sub_80EC210);
+ break;
+ }
+}
+
+void sub_80EC960()
+{
+ switch (ewram0_10.var304)
+ {
+ case 0:
+ sub_80EE9C0(2, 0, 5);
+ ewram0_10.var304++;
+ break;
+ case 1:
+ if (!sub_80EEA0C())
+ sub_80EBDBC(&sub_80ECC08);
+ break;
+ }
+}
+
+void sub_80EC9A8()
+{
+ switch (ewram0_10.var304)
+ {
+ case 0:
+ sub_80F2D04(5);
+ sub_80EE9C0(1, ewram0_10.var6df0, 0xC);
+ ewram0_10.var304++;
+ break;
+ case 1:
+ if (!sub_80EEA0C())
+ {
+ sub_80EBDBC(&sub_80EC86C);
+ sub_80EF428(1, ewram0_10.var6dad);
+ }
+ break;
+ }
+}
+
+void sub_80ECA10()
+{
+ switch (ewram0_10.var304)
+ {
+ case 0:
+ if (!sub_80EEF78())
+ {
+ SetVBlankCallback(&sub_80EBD80);
+ sub_80EED1C();
+ ewram0_10.var6dad = ewram0_10.var6df0;
+ ewram0_10.var6dae = 0x3;
+ sub_80EEE08();
+ ewram0_10.var304++;
+ }
+ break;
+ case 1:
+ sub_80EF248(0x1);
+ ewram0_10.var304++;
+ case 2:
+ if (!sub_80EF284(0x1))
+ ewram0_10.var304++;
+ break;
+ case 3:
+ sub_80F1B8C(0x1);
+ ewram0_10.var304++;
+ case 4:
+ if (!sub_80F1BC8(0x1))
+ ewram0_10.var304++;
+ break;
+ case 5:
+ if (sub_8055870()) return;
+ ewram0_10.var304++;
+ break;
+ case 6:
+ BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0);
+ SetVBlankCallback(&sub_80EBD18);
+ ewram0_10.var304++;
+ break;
+ case 7:
+ sub_80EED2C(0);
+ ewram0_10.var304++;
+ break;
+ case 8:
+ sub_80F2598();
+ ewram0_10.var304++;
+ break;
+ case 9:
+ if (!gPaletteFade.active)
+ ewram0_10.var304++;
+ break;
+ case 0xA:
+ sub_80F2C80(0x1);
+ ewram0_10.var304++;
+ // fall through
+ case 0xB:
+ if (!sub_80F2CBC(0x1))
+ ewram0_10.var304++;
+ break;
+ case 0xC:
+ sub_80F1DF0();
+ ewram0_10.var304++;
+ break;
+ case 0xD:
+ if (!sub_80F1E50())
+ {
+ sub_80EF428(1, ewram0_10.var6dad);
+ sub_80EBDBC(&sub_80EC86C);
+ }
+ break;
+ }
+}
+
+void sub_80ECC08()
+{
+ switch (ewram0_10.var304)
+ {
+ case 0:
+ if (sub_80EEC90())
+ {
+ PlaySE(SE_SELECT);
+ sub_80EF428(2, ewram0_10.var6dad);
+ sub_80EED9C();
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ switch ((s8)ewram0_10.var6dad)
+ {
+ case 0:
+ ewram0_10.var87D8 = 22;
+ break;
+ case 1:
+ ewram0_10.var87D8 = 23;
+ break;
+ case 2:
+ ewram0_10.var87D8 = 24;
+ break;
+ case 3:
+ ewram0_10.var87D8 = 33;
+ break;
+ case 4:
+ ewram0_10.var87D8 = 47;
+ break;
+ case 5:
+ sub_80EBDBC(&sub_80EC9A8);
+ return;
+ }
+
+ ewram0_10.var6dfc = ewram0_10.var6dad;
+ ewram0_10.var76aa = 1;
+ sub_80EBDBC(&sub_80ED01C);
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ ewram0_10.var6dad = 0x5;
+ ewram0_10.var304++;
+ }
+ break;
+ case 1:
+ if (!sub_80F1E6C())
+ sub_80EBDBC(&sub_80EC9A8);
+ break;
+ }
+}
+
+void sub_80ECD80()
+{
+ switch (ewram0_10.var304)
+ {
+ case 0:
+ BeginNormalPaletteFade(ewram0_10.var308, -1, 0, 0x10, 0);
+ ewram0_10.var304++;
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ ewram0_10.var304++;
+ break;
+ case 2:
+ if (!sub_80EEF78())
+ {
+ SetVBlankCallback(&sub_80EBD80);
+ ewram0_10.var304++;
+ }
+ break;
+ case 3:
+ sub_80EED1C();
+ sub_80F3130();
+ ewram0_10.var304++;
+ break;
+ case 4:
+ sub_80F2D6C(0x1);
+ ewram0_10.var304++;
+ break;
+ case 5:
+ sub_80F2D6C(0x5);
+ ewram0_10.var304++;
+ break;
+ case 6:
+ ewram0_10.var6dad = ewram0_10.var6dfc;
+ ewram0_10.var6dae = 0x6;
+ sub_80EEE08();
+ ewram0_10.var304++;
+ break;
+ case 7:
+ sub_80EF248(0x2);
+ ewram0_10.var304++;
+ // fall through
+ case 8:
+ if (!sub_80EF284(0x2))
+ ewram0_10.var304++;
+ break;
+ case 9:
+ sub_80F1B8C(0x2);
+ ewram0_10.var304++;
+ // fall through
+ case 10:
+ if (!sub_80F1BC8(0x2))
+ ewram0_10.var304++;
+ break;
+ case 11:
+ if (!sub_8055870())
+ ewram0_10.var304++;
+ break;
+ case 12:
+ BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0);
+ SetVBlankCallback(&sub_80EBD18);
+ ewram0_10.var304++;
+ break;
+ case 13:
+ sub_80EED2C(0);
+ ewram0_10.var304++;
+ break;
+ case 14:
+ sub_80F2598();
+ ewram0_10.var304++;
+ break;
+ case 15:
+ if (!gPaletteFade.active)
+ ewram0_10.var304++;
+ break;
+ case 16:
+ sub_80F2C80(0x1);
+ ewram0_10.var304++;
+ // fall through
+ case 17:
+ if (!sub_80F2CBC(0x1))
+ {
+ ewram0_10.var306 = 0;
+ ewram0_10.var304++;
+ }
+ break;
+ case 18:
+ sub_80F2C80(0x5);
+ ewram0_10.var304++;
+ // fall through
+ case 19:
+ if (!sub_80F2CBC(0x5))
+ {
+ sub_80F1DF0();
+ ewram0_10.var304++;
+ }
+ break;
+ case 20:
+ if (!sub_80F1E50())
+ {
+ sub_80EF428(2, ewram0_10.var6dad);
+ sub_80EBDBC(&sub_80ECC08);
+ }
+ break;
+ }
+}
+
+void sub_80ED01C()
+{
+ switch (ewram0_10.var304)
+ {
+ case 0:
+ sub_80F1E84();
+ sub_80F2D04(0x1);
+ sub_80F2D04(0x5);
+ ewram0_10.var304++;
+ break;
+ case 1:
+ if (!sub_80F1F10())
+ {
+ sub_80EEFBC(0);
+ ewram0_10.var304++;
+ }
+ break;
+ case 2:
+ if (!sub_80EEF34())
+ {
+ BeginNormalPaletteFade(ewram0_10.var308, -1, 0x0, 0x10, 0);
+ ewram0_10.var304++;
+ }
+ break;
+ case 3:
+ if (!gPaletteFade.active)
+ {
+ SetVBlankCallback(NULL);
+ sub_80EED0C();
+ sub_80EF814();
+ ewram0_10.var304++;
+ }
+ break;
+ case 4:
+ sub_80F2620();
+ ewram0_10.var304++;
+ break;
+ case 5:
+ sub_80F4D44();
+ ewram0_10.var304++;
+ // fall through
+ case 6:
+ if (!sub_80F4D88())
+ ewram0_10.var304 += 2;
+ else
+ ewram0_10.var304 += 1;
+ break;
+ case 7:
+ if (!sub_8055870())
+ ewram0_10.var304--;
+ break;
+ case 8:
+ if (!sub_8055870())
+ ewram0_10.var304++;
+ break;
+ case 9:
+ sub_80F0264(0);
+ ewram0_10.var304++;
+ // fall through
+ case 10:
+ if (!sub_80F02A0())
+ ewram0_10.var304++;
+ break;
+ case 11:
+ sub_80F3008(0);
+ ewram0_10.var304++;
+ break;
+ case 12:
+ if (!sub_8055870())
+ ewram0_10.var304++;
+ break;
+ case 13:
+ BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0);
+ SetVBlankCallback(&sub_80EBD18);
+ ewram0_10.var304++;
+ break;
+ case 14:
+ sub_80EED2C(0x4);
+ ewram0_10.var304++;
+ break;
+ case 15:
+ if (!gPaletteFade.active)
+ {
+ ewram0_10.var306 = 0;
+ ewram0_10.var304++;
+ }
+ break;
+ case 16:
+ sub_80F2C80(0x1);
+ ewram0_10.var304++;
+ // fall through
+ case 17:
+ if (!sub_80F2CBC(0x1))
+ {
+ ewram0_10.var306 = 0;
+ ewram0_10.var304++;
+ }
+ break;
+ case 18:
+ sub_80F2C80(ewram0_10.var6dfc + 7);
+ ewram0_10.var304++;
+ // fall through
+ case 19:
+ if (!sub_80F2CBC(ewram0_10.var6dfc + 7))
+ sub_80EBDBC(&sub_80ED31C);
+ break;
+ }
+}
+
+void sub_80ED31C()
+{
+ switch (ewram0_10.var304)
+ {
+ case 0:
+ switch (sub_80F5DD4())
+ {
+ case 1:
+ PlaySE(SE_SELECT);
+ ShowMapNamePopUpWindow();
+ break;
+ case 2:
+ PlaySE(SE_SELECT);
+ ewram0_10.var304++;
+ break;
+ default:
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_80EBDBC(&sub_80ED4D8);
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_80EBDBC(&sub_80ECD80);
+ }
+ break;
+ }
+ break;
+ case 1:
+ if (!sub_80F0718())
+ {
+ ShowMapNamePopUpWindow();
+ sub_80F3264();
+ ewram0_10.var304++;
+ }
+ break;
+ case 2:
+ if (!sub_8055870())
+ ewram0_10.var304 = 0;
+ break;
+ }
+}
+
+void sub_80ED3D0()
+{
+ switch (ewram0_10.var304)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ ewram0_10.var304++;
+ break;
+ case 1:
+ sub_80EED0C();
+ sub_80F6134();
+ ewram0_10.var304++;
+ break;
+ case 2:
+ sub_80EEFBC(0);
+ ewram0_10.var304++;
+ break;
+ case 3:
+ sub_80F0264(0);
+ ewram0_10.var304++;
+ // fall through
+ case 4:
+ if (!sub_80F02A0())
+ ewram0_10.var304++;
+ break;
+ case 5:
+ if (!sub_8055870())
+ ewram0_10.var304++;
+ break;
+ case 6:
+ sub_80F3008(0);
+ BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0);
+ SetVBlankCallback(&sub_80EBD18);
+ ewram0_10.var304++;
+ break;
+ case 7:
+ sub_80EED2C(0x4);
+ ewram0_10.var304++;
+ break;
+ case 8:
+ if (!gPaletteFade.active)
+ sub_80EBDBC(&sub_80ED31C);
+ break;
+ }
+}
+
+void sub_80ED4D8()
+{
+ switch (ewram0_10.var304)
+ {
+ case 0:
+ BeginNormalPaletteFade(ewram0_10.var308, -1, 0, 0x10, 0);
+ ewram0_10.var304++;
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ {
+ SetVBlankCallback(NULL);
+ sub_80EED0C();
+ sub_80F3130();
+ ewram0_10.var304++;
+ }
+ break;
+ case 2:
+ if (!sub_8055870())
+ ewram0_10.var304++;
+ break;
+ case 3:
+ sub_80F4CF0();
+ ewram0_10.var304++;
+ break;
+ case 4:
+ sub_80EFF34();
+ ewram0_10.var304++;
+ // fall through
+ case 5:
+ if (!sub_80EFF68())
+ ewram0_10.var304++;
+ break;
+ case 6:
+ sub_80F35B4();
+ sub_80EEFBC(0x2);
+ BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0);
+ SetVBlankCallback(sub_80EBD4C);
+ ewram0_10.var304++;
+ break;
+ case 7:
+ sub_80EED2C(0x2);
+ ewram0_10.var304++;
+ break;
+ case 8:
+ if (!gPaletteFade.active)
+ sub_80EBDBC(&sub_80ED858);
+ break;
+ }
+}
+
+void sub_80ED620()
+{
+ switch (ewram0_10.var304)
+ {
+ case 0:
+ sub_80F1E84();
+ sub_80F2D04(0x1);
+ ewram0_10.var304++;
+ break;
+ case 1:
+ if (!sub_80F1F10())
+ {
+ sub_80EEFBC(0x1);
+ ewram0_10.var304++;
+ }
+ break;
+ case 2:
+ if (!sub_80EEF34())
+ {
+ BeginNormalPaletteFade(ewram0_10.var308, -1, 0x0, 0x10, 0);
+ ewram0_10.var304++;
+ }
+ break;
+ case 3:
+ if (!gPaletteFade.active)
+ {
+ SetVBlankCallback(NULL);
+ sub_80EED0C();
+ sub_80EF814();
+ ewram0_10.var76aa = 0;
+ ewram0_10.var304++;
+ }
+ break;
+ case 4:
+ sub_80F2620();
+ ewram0_10.var304++;
+ break;
+ case 5:
+ ewram0_10.varD162 = 0x2;
+ sub_80F4BD0();
+ ewram0_10.var304++;
+ break;
+ case 6:
+ sub_80EFF34();
+ ewram0_10.var304++;
+ // fall through
+ case 7:
+ if (!sub_80EFF68())
+ ewram0_10.var304++;
+ break;
+ case 8:
+ if (!sub_8055870())
+ ewram0_10.var304++;
+ break;
+ case 9:
+ if (!sub_8055870())
+ ewram0_10.var304++;
+ break;
+ case 10:
+ sub_80F33A8();
+ BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0);
+ SetVBlankCallback(&sub_80EBD4C);
+ ewram0_10.var304++;
+ break;
+ case 11:
+ sub_80EED2C(0x2);
+ ewram0_10.var304++;
+ break;
+ case 12:
+ if (!gPaletteFade.active)
+ ewram0_10.var304++;
+ break;
+ case 13:
+ sub_80F2C80(0x1);
+ ewram0_10.var304++;
+ case 14:
+ if (!sub_80F2CBC(0x1))
+ ewram0_10.var304++;
+ break;
+ case 15:
+ sub_80F2C80(0x6);
+ ewram0_10.var304++;
+ // fall through
+ case 16:
+ if (!sub_80F2CBC(0x6))
+ sub_80EBDBC(&sub_80ED858);
+ break;
+ }
+}
+
+#if 0
+void sub_80F4F78();
+void sub_80F0174(u32);
+bool8 sub_80F4FB4();
+void sub_80F3668();
+bool8 sub_80F7500();
+void sub_80F3698();
+bool8 sub_80F5038();
+void sub_80F2F48();
+void sub_80F3CE8();
+void sub_80F3614();
+void sub_80F357C();
+void sub_80F4FDC();
+
+void sub_80ED858() {
+ u8 var1;
+ switch (ewram0_10.var304) {
+ case 0:
+ sub_80F4F78();
+ sub_80F5B38();
+ ewram0_10.var304 = 0x1;
+ break;
+ case 1:
+ if (sub_80F5B50()) return;
+ ewram0_10.var304 = 0x2;
+ break;
+ case 2:
+ sub_80F0174(0x1);
+ ewram0_10.var304 = 0x3;
+ break;
+ case 3:
+ if (sub_80F4FB4()) return;
+ sub_80F3C94();
+ sub_80F3D00();
+ ewram0_10.var304 = 0x4;
+ break;
+ case 4:
+ if ( (gMain.heldKeys & 0x40) && (ewram0_10.var87CB) && (!(ewram0_10.var76aa) || (ewram0_10.var87DC)) ) {
+ PlaySE(SE_SELECT);
+ sub_80F5060(0x1);
+ move_anim_execute();
+ ewram0_10.var304 = 0x5;
+ }
+ else if ( (gMain.heldKeys & 0x80) && (ewram0_10.var87CB) && (!(ewram0_10.var76aa) || (ewram0_10.var76aa >= ewram0_10.var87DC)) ) {
+ PlaySE(SE_SELECT);
+ sub_80F5060(0);
+ move_anim_execute();
+ ewram0_10.var304 = 0x5;
+ }
+ if (gMain.newKeys & B_BUTTON) {
+ PlaySE(SE_SELECT);
+ sub_80F4FDC();
+ move_anim_execute();
+ ewram0_10.var304 = 0x9;
+ }
+ else if (gMain.newKeys & A_BUTTON) {
+ if (ewram0_10.var76aa) {
+ if (ewram0_10.var6dac) {
+ PlaySE(SE_SELECT);
+ ewram0_10.var304 = 0x7;
+ }
+ }
+ else if ((ewram0_10.var87DC == ewram0_10.var87DA - 1)) {
+ PlaySE(SE_SELECT);
+ ewram0_10.var304 = 0x9;
+ }
+ }
+
+/*
+ if (gMain.heldKeys & 0x40) {
+ if (ewram0_10.var87CB) {
+ if (ewram0_10.var76aa) {
+ if (!ewram0_10.var87DC) goto label1;
+ }
+ PlaySE(SE_SELECT);
+ sub_80F5060(0x1);
+ move_anim_execute();
+ ewram0_10.var304 = 0x5;
+
+ }
+ else goto label1;
+ }
+ else goto label1;
+ break;
+label1:
+ if (gMain.heldKeys & 0x80) {
+ if (ewram0_10.var87CB) {
+ if (ewram0_10.var76aa) {
+ if (!(ewram0_10.var76aa < ewram0_10.var87DC)) goto label2;
+ }
+ PlaySE(SE_SELECT);
+ sub_80F5060(0x1);
+ move_anim_execute();
+ ewram0_10.var304 = 0x5;
+ }
+ else goto label2;
+ }
+ else goto label2;
+ break;
+label2:
+ if (gMain.newKeys & B_BUTTON) {
+ PlaySE(SE_SELECT);
+ sub_80F4FDC();
+ move_anim_execute();
+ ewram0_10.var304 = 0x9;
+ }
+ else if (gMain.newKeys & A_BUTTON) {
+ if (!ewram0_10.var76aa) {
+ if ((ewram0_10.var87DC == ewram0_10.var87DA - 1)) {
+ PlaySE(SE_SELECT);
+ ewram0_10.var304 = 0x9;
+ }
+ }
+ else {
+ PlaySE(SE_SELECT);
+ ewram0_10.var304 = 0x9;
+ }
+ }
+*/
+ break;
+
+ case 5:
+ if (gpu_sync_bg_show()) return;
+ sub_80F3D00();
+ ewram0_10.var304 = 0x6;
+ break;
+ case 6:
+ if (sub_8055870()) return;
+ ewram0_10.var304 = 0x4;
+ break;
+ case 7:
+ sub_80EEFBC(0x3);
+ sub_80F3668();
+ ewram0_10.var304 = 0x8;
+ break;
+ case 8:
+ if (sub_80F7500()) return;
+ sub_80EEFBC(0x2);
+ sub_80F3698();
+ ewram0_10.var304 = 0x4;
+ break;
+ case 9:
+ if (!(var1 = sub_80F5038())) {
+ sub_80F0174(0);
+ sub_80F2F48();
+ BeginNormalPaletteFade(ewram0_10.var308, -1, 0x0, 0x10, var1);
+ ewram0_10.var304 = 0xB;
+ }
+ break;
+ case 0xA:
+ if (gPaletteFade.active) return;
+ sub_80F3CE8();
+ sub_80F5BDC();
+ if (!ewram0_10.var76aa) {
+ sub_80F357C();
+ sub_80F2D6C(0x1);
+ sub_80F2D6C(0x6);
+ sub_80EBDBC(&sub_80ECA10);
+ }
+ else {
+ sub_80F3614();
+ sub_80EBDBC(&sub_80ED3D0);
+ }
+ break;
+ }
+
+}
+#else
+__attribute__((naked))
+void sub_80ED858() {
+ asm_unified("push {r4,r5,lr}\n\
+ sub sp, 0x4\n\
+ ldr r1, _080ED878 @ =gSharedMem\n\
+ movs r2, 0xC1\n\
+ lsls r2, 2\n\
+ adds r0, r1, r2\n\
+ ldrh r0, [r0]\n\
+ adds r5, r1, 0\n\
+ cmp r0, 0xB\n\
+ bls _080ED86E\n\
+ b _080EDB7A\n\
+_080ED86E:\n\
+ lsls r0, 2\n\
+ ldr r1, _080ED87C @ =_080ED880\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .align 2, 0\n\
+_080ED878: .4byte gSharedMem\n\
+_080ED87C: .4byte _080ED880\n\
+ .align 2, 0\n\
+_080ED880:\n\
+ .4byte _080ED8B0\n\
+ .4byte _080ED8CC\n\
+ .4byte _080ED8EC\n\
+ .4byte _080ED904\n\
+ .4byte _080ED91A\n\
+ .4byte _080EDA68\n\
+ .4byte _080EDA8C\n\
+ .4byte _080EDAA4\n\
+ .4byte _080EDAC0\n\
+ .4byte _080EDAE8\n\
+ .4byte _080EDB7A\n\
+ .4byte _080EDB28\n\
+_080ED8B0:\n\
+ bl sub_80F4F78\n\
+ bl sub_80F5B38\n\
+ ldr r0, _080ED8C8 @ =gSharedMem\n\
+ movs r4, 0xC1\n\
+ lsls r4, 2\n\
+ adds r0, r4\n\
+ movs r1, 0x1\n\
+ strh r1, [r0]\n\
+ b _080EDB7A\n\
+ .align 2, 0\n\
+_080ED8C8: .4byte gSharedMem\n\
+_080ED8CC:\n\
+ bl sub_80F5B50\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _080ED8D8\n\
+ b _080EDB7A\n\
+_080ED8D8:\n\
+ ldr r0, _080ED8E8 @ =gSharedMem\n\
+ movs r1, 0xC1\n\
+ lsls r1, 2\n\
+ adds r0, r1\n\
+ movs r1, 0x2\n\
+ strh r1, [r0]\n\
+ b _080EDB7A\n\
+ .align 2, 0\n\
+_080ED8E8: .4byte gSharedMem\n\
+_080ED8EC:\n\
+ movs r0, 0x1\n\
+ bl sub_80F0174\n\
+ ldr r0, _080ED900 @ =gSharedMem\n\
+ movs r2, 0xC1\n\
+ lsls r2, 2\n\
+ adds r0, r2\n\
+ movs r1, 0x3\n\
+ strh r1, [r0]\n\
+ b _080EDB7A\n\
+ .align 2, 0\n\
+_080ED900: .4byte gSharedMem\n\
+_080ED904:\n\
+ bl sub_80F4FB4\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _080ED910\n\
+ b _080EDB7A\n\
+_080ED910:\n\
+ bl sub_80F3C94\n\
+ bl sub_80F3D00\n\
+ b _080EDAD4\n\
+_080ED91A:\n\
+ ldr r2, _080ED960 @ =gMain\n\
+ ldrh r1, [r2, 0x2C]\n\
+ movs r0, 0x40\n\
+ ands r0, r1\n\
+ adds r3, r2, 0\n\
+ cmp r0, 0\n\
+ beq _080ED970\n\
+ ldr r1, _080ED964 @ =0x000087cb\n\
+ adds r0, r5, r1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ beq _080ED970\n\
+ ldr r2, _080ED968 @ =0x000076aa\n\
+ adds r0, r5, r2\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ beq _080ED948\n\
+ ldr r4, _080ED96C @ =0x000087dc\n\
+ adds r0, r5, r4\n\
+ movs r1, 0\n\
+ ldrsh r0, [r0, r1]\n\
+ cmp r0, 0\n\
+ beq _080ED970\n\
+_080ED948:\n\
+ movs r0, 0x5\n\
+ bl PlaySE\n\
+ movs r0, 0x1\n\
+ bl sub_80F5060\n\
+ bl move_anim_execute\n\
+ movs r2, 0xC1\n\
+ lsls r2, 2\n\
+ adds r1, r5, r2\n\
+ b _080ED9B8\n\
+ .align 2, 0\n\
+_080ED960: .4byte gMain\n\
+_080ED964: .4byte 0x000087cb\n\
+_080ED968: .4byte 0x000076aa\n\
+_080ED96C: .4byte 0x000087dc\n\
+_080ED970:\n\
+ ldrh r1, [r3, 0x2C]\n\
+ movs r0, 0x80\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080ED9CC\n\
+ ldr r4, _080ED9C0 @ =0x000087cb\n\
+ adds r0, r5, r4\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ beq _080ED9CC\n\
+ ldr r1, _080ED9C4 @ =0x000076aa\n\
+ adds r0, r5, r1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ beq _080ED9A2\n\
+ ldr r2, _080ED9C8 @ =0x000087dc\n\
+ adds r0, r5, r2\n\
+ subs r4, 0x57\n\
+ adds r1, r5, r4\n\
+ movs r4, 0\n\
+ ldrsh r2, [r0, r4]\n\
+ movs r4, 0\n\
+ ldrsh r0, [r1, r4]\n\
+ cmp r2, r0\n\
+ bge _080ED9CC\n\
+_080ED9A2:\n\
+ movs r0, 0x5\n\
+ bl PlaySE\n\
+ movs r0, 0\n\
+ bl sub_80F5060\n\
+ bl move_anim_execute\n\
+ movs r0, 0xC1\n\
+ lsls r0, 2\n\
+ adds r1, r5, r0\n\
+_080ED9B8:\n\
+ movs r0, 0x5\n\
+ strh r0, [r1]\n\
+ b _080EDB7A\n\
+ .align 2, 0\n\
+_080ED9C0: .4byte 0x000087cb\n\
+_080ED9C4: .4byte 0x000076aa\n\
+_080ED9C8: .4byte 0x000087dc\n\
+_080ED9CC:\n\
+ ldrh r2, [r3, 0x2E]\n\
+ movs r0, 0x2\n\
+ ands r0, r2\n\
+ cmp r0, 0\n\
+ beq _080ED9F8\n\
+ movs r0, 0x5\n\
+ bl PlaySE\n\
+ bl sub_80F4FDC\n\
+ bl move_anim_execute\n\
+ ldr r0, _080ED9F4 @ =gSharedMem\n\
+ movs r1, 0xC1\n\
+ lsls r1, 2\n\
+ adds r0, r1\n\
+ movs r1, 0x9\n\
+ strh r1, [r0]\n\
+ b _080EDB7A\n\
+ .align 2, 0\n\
+_080ED9F4: .4byte gSharedMem\n\
+_080ED9F8:\n\
+ movs r0, 0x1\n\
+ ands r0, r2\n\
+ cmp r0, 0\n\
+ bne _080EDA02\n\
+ b _080EDB7A\n\
+_080EDA02:\n\
+ adds r4, r5, 0\n\
+ ldr r2, _080EDA38 @ =0x000076aa\n\
+ adds r0, r4, r2\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _080EDA44\n\
+ ldr r1, _080EDA3C @ =0x000087dc\n\
+ adds r0, r4, r1\n\
+ movs r2, 0\n\
+ ldrsh r1, [r0, r2]\n\
+ ldr r2, _080EDA40 @ =0x000087da\n\
+ adds r0, r4, r2\n\
+ movs r2, 0\n\
+ ldrsh r0, [r0, r2]\n\
+ subs r0, 0x1\n\
+ cmp r1, r0\n\
+ beq _080EDA26\n\
+ b _080EDB7A\n\
+_080EDA26:\n\
+ movs r0, 0x5\n\
+ bl PlaySE\n\
+ movs r0, 0xC1\n\
+ lsls r0, 2\n\
+ adds r1, r4, r0\n\
+ movs r0, 0x9\n\
+ strh r0, [r1]\n\
+ b _080EDB7A\n\
+ .align 2, 0\n\
+_080EDA38: .4byte 0x000076aa\n\
+_080EDA3C: .4byte 0x000087dc\n\
+_080EDA40: .4byte 0x000087da\n\
+_080EDA44:\n\
+ ldr r1, _080EDA64 @ =0x00006dac\n\
+ adds r0, r5, r1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ beq _080EDA50\n\
+ b _080EDB7A\n\
+_080EDA50:\n\
+ movs r0, 0x5\n\
+ bl PlaySE\n\
+ movs r2, 0xC1\n\
+ lsls r2, 2\n\
+ adds r1, r5, r2\n\
+ movs r0, 0x7\n\
+ strh r0, [r1]\n\
+ b _080EDB7A\n\
+ .align 2, 0\n\
+_080EDA64: .4byte 0x00006dac\n\
+_080EDA68:\n\
+ bl gpu_sync_bg_show\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _080EDA74\n\
+ b _080EDB7A\n\
+_080EDA74:\n\
+ bl sub_80F3D00\n\
+ ldr r0, _080EDA88 @ =gSharedMem\n\
+ movs r4, 0xC1\n\
+ lsls r4, 2\n\
+ adds r0, r4\n\
+ movs r1, 0x6\n\
+ strh r1, [r0]\n\
+ b _080EDB7A\n\
+ .align 2, 0\n\
+_080EDA88: .4byte gSharedMem\n\
+_080EDA8C:\n\
+ bl sub_8055870\n\
+ cmp r0, 0\n\
+ bne _080EDB7A\n\
+ ldr r0, _080EDAA0 @ =gSharedMem\n\
+ movs r1, 0xC1\n\
+ lsls r1, 2\n\
+ adds r0, r1\n\
+ b _080EDADC\n\
+ .align 2, 0\n\
+_080EDAA0: .4byte gSharedMem\n\
+_080EDAA4:\n\
+ movs r0, 0x3\n\
+ bl sub_80EEFBC\n\
+ bl sub_80F3668\n\
+ ldr r0, _080EDABC @ =gSharedMem\n\
+ movs r2, 0xC1\n\
+ lsls r2, 2\n\
+ adds r0, r2\n\
+ movs r1, 0x8\n\
+ strh r1, [r0]\n\
+ b _080EDB7A\n\
+ .align 2, 0\n\
+_080EDABC: .4byte gSharedMem\n\
+_080EDAC0:\n\
+ bl sub_80F7500\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _080EDB7A\n\
+ movs r0, 0x2\n\
+ bl sub_80EEFBC\n\
+ bl sub_80F3698\n\
+_080EDAD4:\n\
+ ldr r0, _080EDAE4 @ =gSharedMem\n\
+ movs r4, 0xC1\n\
+ lsls r4, 2\n\
+ adds r0, r4\n\
+_080EDADC:\n\
+ movs r1, 0x4\n\
+ strh r1, [r0]\n\
+ b _080EDB7A\n\
+ .align 2, 0\n\
+_080EDAE4: .4byte gSharedMem\n\
+_080EDAE8:\n\
+ bl sub_80F5038\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ cmp r4, 0\n\
+ bne _080EDB7A\n\
+ movs r0, 0\n\
+ bl sub_80F0174\n\
+ bl sub_80F2F48\n\
+ ldr r5, _080EDB24 @ =gSharedMem\n\
+ movs r1, 0xC2\n\
+ lsls r1, 2\n\
+ adds r0, r5, r1\n\
+ ldr r0, [r0]\n\
+ movs r1, 0x1\n\
+ negs r1, r1\n\
+ str r4, [sp]\n\
+ movs r2, 0\n\
+ movs r3, 0x10\n\
+ bl BeginNormalPaletteFade\n\
+ movs r2, 0xC1\n\
+ lsls r2, 2\n\
+ adds r1, r5, r2\n\
+ movs r0, 0xB\n\
+ strh r0, [r1]\n\
+ b _080EDB7A\n\
+ .align 2, 0\n\
+_080EDB24: .4byte gSharedMem\n\
+_080EDB28:\n\
+ ldr r0, _080EDB60 @ =gPaletteFade\n\
+ ldrb r1, [r0, 0x7]\n\
+ movs r0, 0x80\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _080EDB7A\n\
+ bl sub_80F3CE8\n\
+ bl sub_80F5BDC\n\
+ ldr r0, _080EDB64 @ =gSharedMem\n\
+ ldr r4, _080EDB68 @ =0x000076aa\n\
+ adds r0, r4\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _080EDB70\n\
+ bl sub_80F357C\n\
+ movs r0, 0x1\n\
+ bl sub_80F2D6C\n\
+ movs r0, 0x6\n\
+ bl sub_80F2D6C\n\
+ ldr r0, _080EDB6C @ =sub_80ECA10\n\
+ bl sub_80EBDBC\n\
+ b _080EDB7A\n\
+ .align 2, 0\n\
+_080EDB60: .4byte gPaletteFade\n\
+_080EDB64: .4byte gSharedMem\n\
+_080EDB68: .4byte 0x000076aa\n\
+_080EDB6C: .4byte sub_80ECA10\n\
+_080EDB70:\n\
+ bl sub_80F3614\n\
+ ldr r0, _080EDB84 @ =sub_80ED3D0\n\
+ bl sub_80EBDBC\n\
+_080EDB7A:\n\
+ add sp, 0x4\n\
+ pop {r4,r5}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080EDB84: .4byte sub_80ED3D0\n");
+}
+#endif
+
+void sub_80EDB88()
+{
+ switch (ewram0_10.var304)
+ {
+ case 0:
+ sub_80F1E84();
+ sub_80F2D04(0);
+ ewram0_10.var304++;
+ break;
+ case 1:
+ if (!sub_80F1F10())
+ {
+ sub_80EEFBC(0x4);
+ ewram0_10.var304++;
+ }
+ break;
+ case 2:
+ if (!sub_80EEF34())
+ {
+ BeginNormalPaletteFade(ewram0_10.var308, -1, 0x0, 0x10, 0);
+ ewram0_10.var304++;
+ }
+ break;
+ case 3:
+ if (!gPaletteFade.active)
+ {
+ SetVBlankCallback(NULL);
+ sub_80EED0C();
+ sub_80EF814();
+ ewram0_10.var304++;
+ }
+ break;
+ case 4:
+ sub_80F2620();
+ ewram0_10.var304++;
+ break;
+ case 5:
+ sub_80F638C();
+ ewram0_10.var304++;
+ case 6:
+ if (!sub_80F63D0())
+ ewram0_10.var304 += 2;
+ else
+ ewram0_10.var304 += 1;
+ break;
+ case 7:
+ if (!sub_8055870())
+ ewram0_10.var304--;
+ break;
+ case 8:
+ if (!sub_8055870())
+ ewram0_10.var304++;
+ break;
+ case 9:
+ sub_80F0264(0x1);
+ ewram0_10.var304++;
+ case 10:
+ if (!sub_80F02A0())
+ ewram0_10.var304++;
+ break;
+ case 11:
+ sub_80F2C80(0x2);
+ ewram0_10.var304++;
+ case 12:
+ if (!sub_80F2CBC(0x2))
+ ewram0_10.var304++;
+ break;
+ case 13:
+ sub_80F3008(0x1);
+ ewram0_10.var304++;
+ break;
+ case 14:
+ if (!sub_8055870())
+ ewram0_10.var304++;
+ break;
+ case 15:
+ BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0);
+ SetVBlankCallback(&sub_80EBD18);
+ ewram0_10.var304++;
+ break;
+ case 16:
+ sub_80EED2C(0x4);
+ ewram0_10.var304++;
+ break;
+ case 17:
+ if (!gPaletteFade.active)
+ sub_80EBDBC(&sub_80EDDBC);
+ break;
+ }
+}
+
+void sub_80EDDBC()
+{
+ switch (ewram0_10.var304)
+ {
+ case 0:
+ switch (sub_80F5DD4())
+ {
+ case 1:
+ PlaySE(SE_SELECT);
+ ShowMapNamePopUpWindow();
+ break;
+ case 2:
+ PlaySE(SE_SELECT);
+ ewram0_10.var304++;
+ break;
+ default:
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_80EBDBC(&sub_80EDEE4);
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_80EBDBC(&sub_80EDE70);
+ }
+ break;
+ }
+ break;
+ case 1:
+ if (!sub_80F0718())
+ {
+ ShowMapNamePopUpWindow();
+ sub_80F3264();
+ ewram0_10.var304++;
+ }
+ break;
+ case 2:
+ if (!sub_8055870())
+ ewram0_10.var304 = 0;
+ break;
+
+ }
+}
+
+void sub_80EDE70()
+{
+ switch (ewram0_10.var304)
+ {
+ case 0:
+ BeginNormalPaletteFade(ewram0_10.var308, -1, 0, 0x10, 0);
+ ewram0_10.var304++;
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ {
+ sub_80F3130();
+ sub_80F2D6C(0x2);
+ ewram0_10.var304++;
+ }
+ break;
+ case 2:
+ sub_80EBDBC(&sub_80EC00C);
+ break;
+ }
+
+}
+
+void sub_80EDEE4()
+{
+ switch (ewram0_10.var304)
+ {
+ case 0:
+ BeginNormalPaletteFade(ewram0_10.var308, -1, 0, 0x10, 0);
+ ewram0_10.var304++;
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ {
+ SetVBlankCallback(NULL);
+ sub_80EED0C();
+ sub_80F3130();
+ ewram0_10.var304++;
+ }
+ break;
+ case 2:
+ sub_80F66E0();
+ sub_80EEE08();
+ ewram0_10.var304++;
+ break;
+ case 3:
+ if (!sub_80F1080())
+ ewram0_10.var304++;
+ break;
+ case 4:
+ sub_80EEFBC(0x5);
+ sub_80F38B8();
+ ewram0_10.var304++;
+ case 5:
+ if (!sub_80F38EC())
+ ewram0_10.var304++;
+ break;
+ case 6:
+ if (!sub_8055870())
+ ewram0_10.var304++;
+ break;
+ case 7:
+ BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0);
+ SetVBlankCallback(&sub_80EBD18);
+ ewram0_10.var304++;
+ break;
+ case 8:
+ sub_80EED2C(0x3);
+ ewram0_10.var304++;
+ break;
+ case 9:
+ if (!gPaletteFade.active)
+ ewram0_10.var304++;
+ break;
+ case 10:
+ if (!sub_80F170C())
+ sub_80EBDBC(&sub_80EE06C);
+ break;
+ }
+}
+
+void sub_80EE06C()
+{
+ switch (ewram0_10.var304)
+ {
+ case 0:
+ sub_80F15A8();
+ ewram0_10.var304++;
+ break;
+ case 1:
+ if ((gMain.newAndRepeatedKeys & 0x40) && (ewram0_10.var87DC))
+ {
+ PlaySE(SE_SELECT);
+ sub_80F6A4C(-1);
+ ewram0_10.var304++;
+ }
+ else if ((gMain.newAndRepeatedKeys & 0x80) && ewram0_10.var87DC < ewram0_10.var8774)
+ {
+ PlaySE(SE_SELECT);
+ sub_80F6A4C(1);
+ ewram0_10.var304++;
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_80EEFBC(0xB);
+ ewram0_10.var304 = 0x4;
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_80EBDBC(&sub_80EE294);
+ }
+ break;
+ case 2:
+ if (!sub_80F6AF0())
+ ewram0_10.var304++;
+ break;
+ case 3:
+ if (!sub_8055870())
+ ewram0_10.var304 = 0;
+ break;
+ case 4:
+ sub_80F3B00();
+ ewram0_10.var304++;
+ break;
+ case 5:
+ if (!sub_80F3B58())
+ {
+ sub_80F1494();
+ ewram0_10.var304++;
+ sub_80EED9C();
+ }
+ break;
+ case 6:
+ switch (sub_80F68E8())
+ {
+ case 1:
+ PlaySE(SE_SELECT);
+ sub_80F3B94();
+ ewram0_10.var304 = 0x7;
+ break;
+ default:
+ case 0:
+ if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_80F3B94();
+ ewram0_10.var304 = 0x8;
+ }
+ break;
+ }
+ break;
+ case 7:
+ if (!sub_80F3BD4())
+ ewram0_10.var304 = 0x4;
+ break;
+ case 8:
+ if (!sub_80F3BD4())
+ {
+ sub_80EEFBC(0x5);
+ ewram0_10.var304 = 0;
+ }
+ break;
+ }
+}
+
+void sub_80EE294()
+{
+ switch (ewram0_10.var304)
+ {
+ case 0:
+ BeginNormalPaletteFade(ewram0_10.var308, -1, 0, 0x10, 0);
+ ewram0_10.var304++;
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ {
+ SetVBlankCallback(NULL);
+ sub_80EED0C();
+ sub_80F3C2C();
+ sub_80EEE08();
+ ewram0_10.var304++;
+ }
+ break;
+ case 2:
+ sub_80F6134();
+ sub_80F0264(0x1);
+ ewram0_10.var304++;
+ case 3:
+ if (!sub_80F02A0())
+ ewram0_10.var304++;
+ break;
+ case 4:
+ sub_80EEFBC(0x4);
+ sub_80F3008(0x1);
+ SetVBlankCallback(&sub_80EBD18);
+ ewram0_10.var304++;
+ break;
+ case 5:
+ if (!sub_8055870())
+ ewram0_10.var304++;
+ break;
+ case 6:
+ BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0);
+ ewram0_10.var304++;
+ break;
+ case 7:
+ sub_80EED2C(0x4);
+ ewram0_10.var304++;
+ break;
+ case 8:
+ if (!gPaletteFade.active)
+ sub_80EBDBC(&sub_80EDDBC);
+ break;
+ }
+}
+
+void sub_80EE3D8()
+{
+ switch (ewram0_10.var304)
+ {
+ case 0:
+ sub_80F1E84();
+ sub_80F2D04(0);
+ ewram0_10.var304++;
+ break;
+ case 1:
+ if (!sub_80F1F10())
+ {
+ sub_80EEFBC(0x9);
+ ewram0_10.var304++;
+ }
+ break;
+ case 2:
+ if (!sub_80EEF34())
+ {
+ BeginNormalPaletteFade(ewram0_10.var308, -1, 0x0, 0x10, 0);
+ ewram0_10.var304++;
+ }
+ break;
+ case 3:
+ if (!gPaletteFade.active)
+ {
+ SetVBlankCallback(NULL);
+ sub_80EED0C();
+ sub_80EF814();
+ sub_80EEE08();
+ ewram0_10.var304++;
+ }
+ break;
+ case 4:
+ sub_80F2620();
+ ewram0_10.var304++;
+ break;
+ case 5:
+ sub_80F0264(0x2);
+ ewram0_10.var304++;
+ case 6:
+ if (!sub_80F02A0())
+ ewram0_10.var304++;
+ break;
+ case 7:
+ sub_80F2C80(0x3);
+ ewram0_10.var304++;
+ case 8:
+ if (!sub_80F2CBC(0x3))
+ ewram0_10.var304++;
+ break;
+ case 9:
+ sub_80F3008(0x2);
+ ewram0_10.var304++;
+ break;
+ case 10:
+ if (!sub_8055870())
+ ewram0_10.var304++;
+ break;
+ case 11:
+ sub_80F6F10();
+ BeginNormalPaletteFade(ewram0_10.var308, -1, 0x10, 0, 0);
+ SetVBlankCallback(&sub_80EBD68);
+ ewram0_10.var304++;
+ break;
+ case 12:
+ sub_80EED2C(0x5);
+ ewram0_10.var304++;
+ break;
+ case 13:
+ if (!gPaletteFade.active)
+ sub_80EBDBC(&sub_80EE58C);
+ break;
+ }
+}
+
+void sub_80EE58C()
+{
+ switch (ewram0_10.var304)
+ {
+ case 0:
+ switch (sub_80F5DD4())
+ {
+ case 1:
+ PlaySE(SE_SELECT);
+ sub_80F0FFC(ewram0_10.var876E);
+ break;
+ case 2:
+ PlaySE(SE_SELECT);
+ ewram0_10.var304++;
+ break;
+ default:
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_80EBDBC(&sub_80EE658);
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_80EBDBC(&sub_80EE8F4);
+ }
+ break;
+ }
+ break;
+ case 1:
+ if (!sub_80F0718())
+ {
+ sub_80F0FFC(ewram0_10.var876E);
+ sub_80F3264();
+ ewram0_10.var304++;
+ }
+ break;
+ case 2:
+ if (!sub_8055870())
+ ewram0_10.var304 = 0;
+ break;
+ }
+}
+
+void sub_80EE658()
+{
+ switch (ewram0_10.var304)
+ {
+ case 0:
+ sub_80F3294(0x1);
+ sub_80EEFBC(0xA);
+ sub_80F0B24();
+ ewram0_10.var304++;
+ break;
+ case 1:
+ if (!sub_80F0B44())
+ ewram0_10.var304++;
+ break;
+ case 2:
+ sub_80F0F64();
+ ewram0_10.var304++;
+ break;
+ case 3:
+ if (!sub_80F0FEC())
+ {
+ sub_80F6FB8(0x1);
+ ewram0_10.var304++;
+ }
+ break;
+ case 4:
+ sub_80F6DB8();
+ ewram0_10.var304++;
+ break;
+ case 5:
+ sub_80F700C((u8 *)(gSharedMem + 0x8788), *(u16 *)(gSharedMem + 0x8788 - 0x1A));
+ sub_80F42C4((u8 *)(gSharedMem + 0x8788));
+ ewram0_10.var304++;
+ break;
+ case 6:
+ sub_80F0CD8();
+ ewram0_10.var304++;
+ case 7:
+ if (!sub_80F6E9C() && !sub_80F0D5C())
+ ewram0_10.var304++;
+ break;
+ case 8:
+ if ((gMain.heldKeys & 0x40) && ewram0_10.var87DC)
+ {
+ PlaySE(SE_SELECT);
+ sub_80F708C(-1);
+ ewram0_10.var304 = 0x10;
+ }
+ else if ((gMain.heldKeys & 0x80) && ewram0_10.var87DC < ewram0_10.var8774)
+ {
+ PlaySE(SE_SELECT);
+ sub_80F708C(1);
+ ewram0_10.var304 = 0x10;
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_80F4394();
+ sub_80F0EC0();
+ ewram0_10.var304++;
+ }
+ break;
+ case 9:
+ if (!sub_80F6ED4() && !sub_80F0EF4())
+ {
+ sub_80F6FB8(0);
+ sub_80F2FB0();
+ ewram0_10.var304++;
+ }
+ break;
+ case 10:
+ sub_80F6134();
+ ewram0_10.var304++;
+ break;
+ case 11:
+ sub_80F0FA0();
+ ewram0_10.var304++;
+ break;
+ case 12:
+ if (!sub_80F0FEC())
+ ewram0_10.var304++;
+ break;
+ case 13:
+ sub_80F0C28();
+ ewram0_10.var304++;
+ break;
+ case 14:
+ if (!sub_80F0C48())
+ ewram0_10.var304++;
+ break;
+ case 15:
+ sub_80EEFBC(0x9);
+ sub_80F3294(0);
+ sub_80EBDBC(&sub_80EE58C);
+ sub_80EED9C();
+ break;
+ case 16:
+ if (!sub_80F70FC())
+ ewram0_10.var304++;
+ break;
+ case 17:
+ if (!sub_8055870())
+ ewram0_10.var304 = 0x8;
+ break;
+ }
+}
+
+void sub_80EE8F4()
+{
+ switch (ewram0_10.var304)
+ {
+ case 0:
+ BeginNormalPaletteFade(ewram0_10.var308, -1, 0, 0x10, 0);
+ ewram0_10.var304++;
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ {
+ sub_80F3130();
+ sub_80F2D6C(0x2);
+ sub_80F6FFC();
+ ewram0_10.var304++;
+ }
+ break;
+ case 2:
+ sub_80EBDBC(&sub_80EC00C);
+ break;
+ }
+}
+
+void sub_80EE96C()
+{
+ if (!ewram0_10.var304)
+ {
+ PlaySE(0x6F);
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ ewram0_10.var304++;
+ }
+ else
+ {
+ if (!gPaletteFade.active)
+ {
+ sub_80F5BDC();
+ sub_805469C();
+ }
+ }
+}
+
+void sub_80EE9C0(u8 param1, u8 param2, u8 param3)
+{
+ sub_80F1E84();
+ ewram0_10.var6e14 = param1;
+ ewram0_10.var6e15 = param2;
+ ewram0_10.var6e16 = 0;
+ ewram0_10.var6e17 = param3;
+}
+
+#if 0
+bool8 sub_80EEA0C() {
+ switch (ewram0_10.var6e16) {
+ case 0:
+ if (sub_80F1F10()) return 1;
+ if (ewram0_10.var6e17 != 0xC) {
+ ewram0_10.var6e16 = 0x1;
+ return 1;
+ }
+ else {
+ ewram0_10.var6e16 = 0x3;
+ return 1;
+ }
+ case 1:
+ sub_80F2C80(ewram0_10.var6e17);
+ ewram0_10.var6e16++;
+ case 2:
+ if (sub_80F2CBC(ewram0_10.var6e17)) return 1;
+ ewram0_10.var6e16++;
+ case 3:
+
+ }
+}
+#else
+__attribute__((naked))
+bool8 sub_80EEA0C() {
+ asm_unified(
+ "push {r4,lr}\n\
+ ldr r1, _080EEA28 @ =gSharedMem\n\
+ ldr r2, _080EEA2C @ =0x00006e16\n\
+ adds r0, r1, r2\n\
+ ldrb r0, [r0]\n\
+ adds r3, r1, 0\n\
+ cmp r0, 0x8\n\
+ bls _080EEA1E\n\
+ b _080EEBFA\n\
+_080EEA1E:\n\
+ lsls r0, 2\n\
+ ldr r1, _080EEA30 @ =_080EEA34\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .align 2, 0\n\
+_080EEA28: .4byte gSharedMem\n\
+_080EEA2C: .4byte 0x00006e16\n\
+_080EEA30: .4byte _080EEA34\n\
+ .align 2, 0\n\
+_080EEA34:\n\
+ .4byte _080EEA58\n\
+ .4byte _080EEA98\n\
+ .4byte _080EEAAE\n\
+ .4byte _080EEAD4\n\
+ .4byte _080EEB3E\n\
+ .4byte _080EEB68\n\
+ .4byte _080EEB88\n\
+ .4byte _080EEBAC\n\
+ .4byte _080EEBE4\n\
+_080EEA58:\n\
+ bl sub_80F1F10\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _080EEA64\n\
+ b _080EEC08\n\
+_080EEA64:\n\
+ ldr r1, _080EEA7C @ =gSharedMem\n\
+ ldr r4, _080EEA80 @ =0x00006e17\n\
+ adds r0, r1, r4\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0xC\n\
+ beq _080EEA88\n\
+ ldr r0, _080EEA84 @ =0x00006e16\n\
+ adds r1, r0\n\
+ movs r0, 0x1\n\
+ strb r0, [r1]\n\
+ b _080EEC08\n\
+ .align 2, 0\n\
+_080EEA7C: .4byte gSharedMem\n\
+_080EEA80: .4byte 0x00006e17\n\
+_080EEA84: .4byte 0x00006e16\n\
+_080EEA88:\n\
+ ldr r2, _080EEA94 @ =0x00006e16\n\
+ adds r1, r2\n\
+ movs r0, 0x3\n\
+ strb r0, [r1]\n\
+ b _080EEC08\n\
+ .align 2, 0\n\
+_080EEA94: .4byte 0x00006e16\n\
+_080EEA98:\n\
+ ldr r4, _080EEAC8 @ =gSharedMem\n\
+ ldr r1, _080EEACC @ =0x00006e17\n\
+ adds r0, r4, r1\n\
+ ldrb r0, [r0]\n\
+ bl sub_80F2C80\n\
+ ldr r2, _080EEAD0 @ =0x00006e16\n\
+ adds r4, r2\n\
+ ldrb r0, [r4]\n\
+ adds r0, 0x1\n\
+ strb r0, [r4]\n\
+_080EEAAE:\n\
+ ldr r4, _080EEAC8 @ =gSharedMem\n\
+ ldr r1, _080EEACC @ =0x00006e17\n\
+ adds r0, r4, r1\n\
+ ldrb r0, [r0]\n\
+ bl sub_80F2CBC\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _080EEAC2\n\
+ b _080EEC08\n\
+_080EEAC2:\n\
+ ldr r2, _080EEAD0 @ =0x00006e16\n\
+ adds r1, r4, r2\n\
+ b _080EEB76\n\
+ .align 2, 0\n\
+_080EEAC8: .4byte gSharedMem\n\
+_080EEACC: .4byte 0x00006e17\n\
+_080EEAD0: .4byte 0x00006e16\n\
+_080EEAD4:\n\
+ adds r2, r3, 0\n\
+ ldr r4, _080EEAF8 @ =0x00006e15\n\
+ adds r0, r2, r4\n\
+ ldrb r1, [r0]\n\
+ subs r4, 0x68\n\
+ adds r0, r2, r4\n\
+ strb r1, [r0]\n\
+ ldr r1, _080EEAFC @ =0x00006e14\n\
+ adds r0, r2, r1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0x1\n\
+ beq _080EEB14\n\
+ cmp r0, 0x1\n\
+ bgt _080EEB00\n\
+ cmp r0, 0\n\
+ beq _080EEB06\n\
+ b _080EEB28\n\
+ .align 2, 0\n\
+_080EEAF8: .4byte 0x00006e15\n\
+_080EEAFC: .4byte 0x00006e14\n\
+_080EEB00:\n\
+ cmp r0, 0x2\n\
+ beq _080EEB20\n\
+ b _080EEB28\n\
+_080EEB06:\n\
+ ldr r4, _080EEB10 @ =0x00006dae\n\
+ adds r1, r2, r4\n\
+ movs r0, 0x5\n\
+ b _080EEB26\n\
+ .align 2, 0\n\
+_080EEB10: .4byte 0x00006dae\n\
+_080EEB14:\n\
+ ldr r0, _080EEB1C @ =0x00006dae\n\
+ adds r1, r2, r0\n\
+ movs r0, 0x3\n\
+ b _080EEB26\n\
+ .align 2, 0\n\
+_080EEB1C: .4byte 0x00006dae\n\
+_080EEB20:\n\
+ ldr r2, _080EEB58 @ =0x00006dae\n\
+ adds r1, r3, r2\n\
+ movs r0, 0x6\n\
+_080EEB26:\n\
+ strb r0, [r1]\n\
+_080EEB28:\n\
+ ldr r4, _080EEB5C @ =gSharedMem\n\
+ ldr r1, _080EEB60 @ =0x00006e14\n\
+ adds r0, r4, r1\n\
+ ldrb r0, [r0]\n\
+ bl sub_80F1B8C\n\
+ ldr r2, _080EEB64 @ =0x00006e16\n\
+ adds r4, r2\n\
+ ldrb r0, [r4]\n\
+ adds r0, 0x1\n\
+ strb r0, [r4]\n\
+_080EEB3E:\n\
+ ldr r4, _080EEB5C @ =gSharedMem\n\
+ ldr r1, _080EEB60 @ =0x00006e14\n\
+ adds r0, r4, r1\n\
+ ldrb r0, [r0]\n\
+ bl sub_80F1BC8\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _080EEC08\n\
+ ldr r2, _080EEB64 @ =0x00006e16\n\
+ adds r1, r4, r2\n\
+ b _080EEB76\n\
+ .align 2, 0\n\
+_080EEB58: .4byte 0x00006dae\n\
+_080EEB5C: .4byte gSharedMem\n\
+_080EEB60: .4byte 0x00006e14\n\
+_080EEB64: .4byte 0x00006e16\n\
+_080EEB68:\n\
+ bl sub_8055870\n\
+ cmp r0, 0\n\
+ bne _080EEC08\n\
+ ldr r1, _080EEB80 @ =gSharedMem\n\
+ ldr r4, _080EEB84 @ =0x00006e16\n\
+ adds r1, r4\n\
+_080EEB76:\n\
+ ldrb r0, [r1]\n\
+ adds r0, 0x1\n\
+ strb r0, [r1]\n\
+ b _080EEC08\n\
+ .align 2, 0\n\
+_080EEB80: .4byte gSharedMem\n\
+_080EEB84: .4byte 0x00006e16\n\
+_080EEB88:\n\
+ bl sub_80F1DF0\n\
+ ldr r4, _080EEBA0 @ =gSharedMem\n\
+ ldr r1, _080EEBA4 @ =0x00006e14\n\
+ adds r0, r4, r1\n\
+ ldrb r0, [r0]\n\
+ bl sub_80EF490\n\
+ ldr r2, _080EEBA8 @ =0x00006e16\n\
+ adds r4, r2\n\
+ b _080EEBCC\n\
+ .align 2, 0\n\
+_080EEBA0: .4byte gSharedMem\n\
+_080EEBA4: .4byte 0x00006e14\n\
+_080EEBA8: .4byte 0x00006e16\n\
+_080EEBAC:\n\
+ bl sub_80F1E50\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _080EEC08\n\
+ ldr r4, _080EEBD4 @ =gSharedMem\n\
+ ldr r1, _080EEBD8 @ =0x00006e14\n\
+ adds r0, r4, r1\n\
+ ldrb r0, [r0]\n\
+ ldr r2, _080EEBDC @ =0x00006dad\n\
+ adds r1, r4, r2\n\
+ ldrb r1, [r1]\n\
+ bl sub_80EF428\n\
+ ldr r0, _080EEBE0 @ =0x00006e16\n\
+ adds r4, r0\n\
+_080EEBCC:\n\
+ ldrb r0, [r4]\n\
+ adds r0, 0x1\n\
+ strb r0, [r4]\n\
+ b _080EEC08\n\
+ .align 2, 0\n\
+_080EEBD4: .4byte gSharedMem\n\
+_080EEBD8: .4byte 0x00006e14\n\
+_080EEBDC: .4byte 0x00006dad\n\
+_080EEBE0: .4byte 0x00006e16\n\
+_080EEBE4:\n\
+ bl sub_80EF4F8\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _080EEC08\n\
+ ldr r1, _080EEC00 @ =gSharedMem\n\
+ ldr r2, _080EEC04 @ =0x00006e16\n\
+ adds r1, r2\n\
+ ldrb r0, [r1]\n\
+ adds r0, 0x1\n\
+ strb r0, [r1]\n\
+_080EEBFA:\n\
+ movs r0, 0\n\
+ b _080EEC0A\n\
+ .align 2, 0\n\
+_080EEC00: .4byte gSharedMem\n\
+_080EEC04: .4byte 0x00006e16\n\
+_080EEC08:\n\
+ movs r0, 0x1\n\
+_080EEC0A:\n\
+ pop {r4}\n\
+ pop {r1}\n\
+ bx r1\n"
+
+ );
+}
+#endif
+
+// var6dad and var6dae must be s8 in this func
+bool8 sub_80EEC10()
+{
+ if (gMain.newKeys & 0x40)
+ {
+ do
+ {
+ if (--ewram0_11.var6dad < 0)
+ ewram0_11.var6dad = ewram0_11.var6dae - 1;
+ } while (!ewram0_10.var6db2[ewram0_11.var6dad]);
+ return TRUE;
+ }
+ if (gMain.newKeys & 0x80)
+ {
+ do
+ {
+ if (++ewram0_11.var6dad >= ewram0_11.var6dae)
+ ewram0_11.var6dad = 0;
+ } while (!ewram0_10.var6db2[ewram0_11.var6dad]);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_80EEC90()
+{
+ if (gMain.newKeys & 0x40)
+ {
+ if (--ewram0_11.var6dad < 0)
+ ewram0_11.var6dad = ewram0_11.var6dae - 1;
+ return TRUE;
+ }
+ if (gMain.newKeys & 0x80)
+ {
+ if (++ewram0_11.var6dad >= ewram0_11.var6dae)
+ ewram0_11.var6dad = 0;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_80EED0C()
+{
+ REG_DISPCNT = 512;
+}
+
+void sub_80EED1C()
+{
+ REG_DISPCNT = 0x92 << 5;
+}
+
+void sub_80EED2C(u8 param1)
+{
+ switch (param1) {
+ case 0:
+ REG_DISPCNT = 0xFA << 5;
+ break;
+ case 1:
+ REG_DISPCNT = 0x1741;
+ break;
+ case 3:
+ case 4:
+ REG_DISPCNT = 0xFA << 5;
+ break;
+ case 2:
+ REG_DISPCNT = 0x7b40;
+ break;
+ case 5:
+ REG_DISPCNT = 0xFD << 6;
+ break;
+ }
+}
+
+void sub_80EED9C(void)
+{
+ gUnknown_03000744 = ewram0_10.var300;
+ ewram0_10.var300 = &sub_80EEDC4;
+ ewram0_10.var300();
+}
+
+void sub_80EEDC4(void)
+{
+ if (sub_8055870() != 0x1)
+ ewram0_10.var300 = gUnknown_03000744;
+}
+
+void sub_80EEDE8(void)
+{
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG2HOFS = 0;
+ REG_BG3HOFS = 0;
+ REG_BG3VOFS = 0;
+}
+
+void sub_80EEE08(void)
+{
+ gUnknown_083DFEC4->unkD160 = 0;
+}
+
+void sub_80EEE20(void)
+{
+ gUnknown_083DFEC4->unkD160 = 0;
+ if (!gUnknown_083DFEC4->unk6DAC)
+ {
+ while (sub_80EEE54())
+ ;
+ }
+}
+
+bool8 sub_80EEE54(void)
+{
+ switch (gUnknown_083DFEC4->unkD160)
+ {
+ case 0:
+ LZ77UnCompVram(gPokenavHoennMapMisc_Gfx, (void *)VRAM + 0xC000);
+ break;
+ case 1:
+ LZ77UnCompVram(gUnknown_08E99FB0, (void *)VRAM + 0xD800);
+ break;
+ case 2:
+ LoadPalette(gPokenavHoennMap1_Pal, 0x10, 0x20);
+ break;
+ case 3:
+ sub_80EF58C(0);
+ sub_80EF58C(1);
+ sub_80EF58C(2);
+ break;
+ case 4:
+ gUnknown_083DFEC4->unk030C.unk030C.unk0 = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BG1CNT = 0x1B0C;
+ gUnknown_083DFEC4->unkD160++;
+ default:
+ return FALSE;
+ }
+ gUnknown_083DFEC4->unkD160++;
+ return TRUE;
+}
+
+bool8 sub_80EEF34(void)
+{
+ bool8 retVal = TRUE;
+
+ if (gUnknown_083DFEC4->unk030C.unk030C.unk0 == 32)
+ return FALSE;
+
+ gUnknown_083DFEC4->unk030C.unk030C.unk0 += 2;
+ if (gUnknown_083DFEC4->unk030C.unk030C.unk0 > 31)
+ {
+ gUnknown_083DFEC4->unk030C.unk030C.unk0 = 32;
+ retVal = FALSE;
+ }
+
+ REG_BG1VOFS = gUnknown_083DFEC4->unk030C.unk030C.unk0;
+ return retVal;
+}
+
+bool8 sub_80EEF78(void)
+{
+ bool8 retVal = TRUE;
+
+ if (gUnknown_083DFEC4->unk030C.unk030C.unk0 == 0)
+ return FALSE;
+
+ gUnknown_083DFEC4->unk030C.unk030C.unk0 -= 2;
+ if (gUnknown_083DFEC4->unk030C.unk030C.unk0 <= 0)
+ {
+ gUnknown_083DFEC4->unk030C.unk030C.unk0 = 0;
+ retVal = FALSE;
+ }
+
+ REG_BG1VOFS = gUnknown_083DFEC4->unk030C.unk030C.unk0;
+ return retVal;
+}
+
+void sub_80EEFBC(u8 a)
+{
+ u8 var1;
+
+ sub_809D104((void *)VRAM + 0xD800, 0, 22, gUnknown_08E9A100, 0, 0, 17, 2);
+
+ switch (a)
+ {
+ case 0:
+ sub_809D104((void *)VRAM + 0xD800, 0, 22, gUnknown_08E9A100, 17, 0, 10, 2);
+ sub_809D104((void *)VRAM + 0xD800, 10, 22, gUnknown_08E9A100, 0, 6, 7, 2);
+ break;
+ case 11:
+ sub_809D104((void *)VRAM + 0xD800, 8, 22, gUnknown_08E9A100, 0, 6, 7, 2);
+ break;
+ case 2:
+ var1 = gUnknown_083DFEC4->unk6DAC;
+ if (!var1)
+ {
+ sub_809D104((void *)VRAM + 0xD800, 0, 22, gUnknown_08E9A100, 10, 2, 10, 2);
+ sub_809D104((void *)VRAM + 0xD800, 10, 22, gUnknown_08E9A100, var1, 6, 7, 2);
+ }
+ else
+ {
+ sub_809D104((void *)VRAM + 0xD800, 10, 22, gUnknown_08E9A100, 0, 6, 7, 2);
+ }
+ break;
+ case 3:
+ sub_809D104((void *)VRAM + 0xD800, 0, 22, gUnknown_08E9A100, 0, 4, 10, 2);
+ sub_809D104((void *)VRAM + 0xD800, 10, 22, gUnknown_08E9A100, 0, 6, 7, 2);
+ break;
+ case 4:
+ sub_809D104((void *)VRAM + 0xD800, 0, 22, gUnknown_08E9A100, 20, 2, 10, 2);
+ sub_809D104((void *)VRAM + 0xD800, 10, 22, gUnknown_08E9A100, 0, 6, 7, 2);
+ break;
+ case 7:
+ sub_809D104((void *)VRAM + 0xD800, 0, 22, gUnknown_08E9A100, 10, 4, 10, 2);
+ sub_809D104((void *)VRAM + 0xD800, 7, 22, gUnknown_08E9A100, 0, 6, 7, 2);
+ break;
+ case 8:
+ sub_809D104((void *)VRAM + 0xD800, 0, 22, gUnknown_08E9A100, 20, 4, 10, 2);
+ sub_809D104((void *)VRAM + 0xD800, 7, 22, gUnknown_08E9A100, 0, 6, 7, 2);
+ break;
+ case 5:
+ case 9:
+ sub_809D104((void *)VRAM + 0xD800, 0, 22, gUnknown_08E9A100, 0, 2, 10, 2);
+ sub_809D104((void *)VRAM + 0xD800, 8, 22, gUnknown_08E9A100, 0, 6, 7, 2);
+ break;
+ case 10:
+ sub_809D104((void *)VRAM + 0xD800, 8, 22, gUnknown_08E9A100, 0, 6, 7, 2);
+ break;
+ }
+}
+
+void sub_80EF248(u8 a)
+{
+ gUnknown_083DFEC4->unkD160 = 0;
+
+ if (!gUnknown_083DFEC4->unk6DAC)
+ {
+ while (sub_80EF284(a))
+ ;
+ }
+}
+
+bool8 sub_80EF284(u8 a)
+{
+ switch (gUnknown_083DFEC4->unkD160)
+ {
+ case 0:
+ sub_80EEDE8();
+ break;
+ case 1:
+ SetUpWindowConfig(&gWindowConfig_81E7224);
+ break;
+ case 2:
+ MultistepInitMenuWindowBegin(&gWindowConfig_81E7224);
+ break;
+ case 3:
+ if (!MultistepInitMenuWindowContinue())
+ return TRUE;
+ break;
+ case 4:
+ DmaCopy16Defvars(3, gUnknown_083DFEEC, (void *)VRAM + 0x5000, 0xA0);
+ break;
+ case 5:
+ LZ77UnCompVram(gUnknown_083DFF8C, (void *)VRAM + 0xF800);
+ break;
+ case 6:
+ DmaCopy16Defvars(3, gUnknown_083E005C, (void *)VRAM + 0x8000, 0x20);
+ break;
+ case 7:
+ LZ77UnCompVram(gUnknown_083E007C, (void *)VRAM + 0xE000);
+ break;
+ case 8:
+ LZ77UnCompVram(gPokenavOutlineTilemap, (void *)VRAM + 0xE800);
+ break;
+ case 9:
+ LZ77UnCompVram(gPokenavOutlineTiles, (void *)VRAM + 0x8020);
+ break;
+ case 10:
+ sub_80EF54C(a);
+ LoadPalette(gUnknown_083DFECC, 0xF0, 0x20);
+ LoadPalette(gPokenavOutlinePalette, 0x40, 0x20);
+ sub_80EF7D4();
+ break;
+ case 11:
+ REG_BG0CNT = 0x1F01;
+ REG_BG2CNT = 0x1D0A;
+ REG_BG3CNT = 0x1C0B;
+ REG_BLDCNT = 0;
+
+ gUnknown_083DFEC4->unkD160++;
+ return FALSE;
+ default:
+ return FALSE;
+ }
+
+ gUnknown_083DFEC4->unkD160++;
+ return TRUE;
+}
+
+void sub_80EF428(u8 a, u8 b)
+{
+ u8 *tileBuffer;
+ const u8 *pcText = 0;
+
+ switch (a)
+ {
+ case 0:
+ pcText = gUnknown_083E31B0[b];
+ break;
+ case 1:
+ pcText = gUnknown_083E31CC[b];
+ break;
+ case 2:
+ pcText = gUnknown_083E31D8[b];
+ break;
+ }
+
+ tileBuffer = gUnknown_083DFEC8;
+ sub_8072C74(&tileBuffer[0x800], pcText, 0xC0, 2);
+ MenuPrint(&tileBuffer[0x800], 3, 17);
+}
+
+void sub_80EF490(u8 a)
+{
+ u16 var1, var2;
+
+ if (a == 2)
+ a = 1;
+
+ gUnknown_083DFEC4->unkCE4E = a * 30;
+ var1 = gUnknown_083DFEC4->unkCE4C;
+ var2 = a * 30;
+ if (var1 < var2)
+ gUnknown_083DFEC4->unkCE50 = 2;
+ else if (var1 > var2)
+ gUnknown_083DFEC4->unkCE50 = -2;
+ else
+ gUnknown_083DFEC4->unkCE50 = 0;
+}
+
+bool8 sub_80EF4F8(void)
+{
+ u16 *palettes;
+
+ if (gUnknown_083DFEC4->unkCE4C == gUnknown_083DFEC4->unkCE4E)
+ {
+ return FALSE;
+ }
+ else
+ {
+ gUnknown_083DFEC4->unkCE4C = gUnknown_083DFEC4->unkCE50 + gUnknown_083DFEC4->unkCE4C;
+
+ palettes = gUnknown_083DFEC4->palettesCE52;
+ LoadPalette(&palettes[gUnknown_083DFEC4->unkCE4C], 0x31, 4);
+ return TRUE;
+ }
+
+}
+
+void sub_80EF54C(u8 a)
+{
+ if (a == 2)
+ a = 1;
+
+ gUnknown_083DFEC4->unkCE4C = a * 30;
+ LoadPalette(&gUnknown_083DFEC4->palettesCE52[gUnknown_083DFEC4->unkCE4C], 0x31, 4);
+}
+
+void sub_80EF58C(u8 a)
+{
+ u16 i;
+ u16 * palettes;
+ const u16 *var1;
+
+ switch (a)
+ {
+ case 0:
+ for (i = 0; i < 62; i++)
+ gUnknown_083DFEC4->palettesCE52[i] = 0;
+ break;
+ case 1:
+ palettes = gUnknown_083DFEC4->palettesCE52;
+ var1 = gUnknown_083E003C;
+ sub_80EF624(&var1[1], &var1[3], 16, 2, palettes);
+ break;
+ case 2:
+ palettes = gUnknown_083DFEC4->palettesCE8E;
+ var1 = gUnknown_083E003C;
+ sub_80EF624(&var1[3], &var1[7], 16, 2, palettes);
+ break;
+ }
+}
+
+#ifdef NONMATCHING
+void sub_80EF624(const u16 *a, const u16 *b, u8 c, u8 d, u16 *palettes)
+{
+ u16 red1, green1, blue1;
+ u16 red2, green2, blue2;
+ s32 redDiv, greenDiv, blueDiv;
+ u16 *palettes2;
+ u16 i, j;
+
+ i = 0;
+ while (i < d)
+ {
+ red1 = (*a & 0x1F) << 8;
+ green1 = ((*a >> 5) & 0x1F) << 8;
+ blue1 = ((*a >> 10) & 0x1F) << 8;
+
+ red2 = (*b & 0x1F) << 8;
+ green2 = ((*b >> 5) & 0x1F) << 8;
+ blue2 = ((*b >> 10) & 0x1F) << 8;
+
+ redDiv = (red2 - red1) / c;
+ greenDiv = (green2 - green1) / c;
+ blueDiv = (blue2 - blue1) / c;
+
+ palettes2 = palettes;
+ for (j = 0; j < c - 1; j++)
+ {
+ *palettes2 = (((blue1 << 8) >> 16) << 10) | (((green1 << 8) >> 16) << 5) | ((red1 << 8) >> 16);
+ palettes2 += d;
+ red1 += redDiv;
+ green1 += greenDiv;
+ blue1 += blueDiv;
+ }
+
+ *palettes2 = (red2 >> 8) | (blue2 << 2) | (green2 >> 3);
+ palettes++;
+
+ a++;
+ b++;
+ i++;
+ }
+}
+#else
+__attribute__((naked))
+void sub_80EF624(const u16 *a, const u16 *b, u8 c, u8 d, u16 *palettes)
+{
+ 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, 0x38\n\
+ str r0, [sp]\n\
+ str r1, [sp, 0x4]\n\
+ ldr r4, [sp, 0x58]\n\
+ lsls r2, 24\n\
+ lsrs r2, 24\n\
+ str r2, [sp, 0x8]\n\
+ lsls r3, 24\n\
+ lsrs r3, 24\n\
+ str r3, [sp, 0xC]\n\
+ movs r0, 0\n\
+ str r0, [sp, 0x10]\n\
+ lsls r0, r3, 16\n\
+ ldr r1, [sp, 0x10]\n\
+ cmp r1, r3\n\
+ bcs _080EF72E\n\
+ subs r2, 0x1\n\
+ str r2, [sp, 0x20]\n\
+ str r0, [sp, 0x2C]\n\
+_080EF654:\n\
+ ldr r2, [sp]\n\
+ ldrh r1, [r2]\n\
+ movs r0, 0x1F\n\
+ ands r0, r1\n\
+ lsls r7, r0, 8\n\
+ lsls r1, 16\n\
+ lsrs r0, r1, 21\n\
+ movs r2, 0x1F\n\
+ ands r0, r2\n\
+ lsls r6, r0, 8\n\
+ lsrs r1, 26\n\
+ ands r1, r2\n\
+ lsls r5, r1, 8\n\
+ ldr r0, [sp, 0x4]\n\
+ ldrh r1, [r0]\n\
+ movs r0, 0x1F\n\
+ ands r0, r1\n\
+ lsls r0, 8\n\
+ str r0, [sp, 0x14]\n\
+ lsls r1, 16\n\
+ lsrs r0, r1, 21\n\
+ ands r0, r2\n\
+ lsls r0, 8\n\
+ str r0, [sp, 0x18]\n\
+ lsrs r1, 26\n\
+ ands r1, r2\n\
+ lsls r1, 8\n\
+ str r1, [sp, 0x1C]\n\
+ ldr r1, [sp, 0x14]\n\
+ subs r0, r1, r7\n\
+ ldr r1, [sp, 0x8]\n\
+ bl __divsi3\n\
+ mov r10, r0\n\
+ ldr r2, [sp, 0x18]\n\
+ subs r0, r2, r6\n\
+ ldr r1, [sp, 0x8]\n\
+ bl __divsi3\n\
+ mov r9, r0\n\
+ ldr r1, [sp, 0x1C]\n\
+ subs r0, r1, r5\n\
+ ldr r1, [sp, 0x8]\n\
+ bl __divsi3\n\
+ mov r8, r0\n\
+ adds r3, r4, 0\n\
+ movs r4, 0\n\
+ ldr r2, [sp]\n\
+ adds r2, 0x2\n\
+ str r2, [sp, 0x30]\n\
+ ldr r0, [sp, 0x4]\n\
+ adds r0, 0x2\n\
+ str r0, [sp, 0x34]\n\
+ adds r1, r3, 0x2\n\
+ str r1, [sp, 0x24]\n\
+ ldr r2, [sp, 0x10]\n\
+ adds r2, 0x1\n\
+ str r2, [sp, 0x28]\n\
+ ldr r0, [sp, 0x20]\n\
+ cmp r4, r0\n\
+ bge _080EF700\n\
+ ldr r1, [sp, 0xC]\n\
+ lsls r1, 1\n\
+ mov r12, r1\n\
+_080EF6D6:\n\
+ lsls r0, r7, 8\n\
+ lsrs r2, r0, 16\n\
+ lsls r0, r6, 8\n\
+ lsrs r1, r0, 16\n\
+ lsls r0, r5, 8\n\
+ lsrs r0, 16\n\
+ lsls r0, 10\n\
+ lsls r1, 5\n\
+ orrs r0, r1\n\
+ orrs r2, r0\n\
+ strh r2, [r3]\n\
+ add r3, r12\n\
+ add r7, r10\n\
+ add r6, r9\n\
+ add r5, r8\n\
+ adds r0, r4, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r4, r0, 16\n\
+ ldr r2, [sp, 0x20]\n\
+ cmp r4, r2\n\
+ blt _080EF6D6\n\
+_080EF700:\n\
+ ldr r4, [sp, 0x14]\n\
+ lsrs r2, r4, 8\n\
+ ldr r1, [sp, 0x1C]\n\
+ lsls r0, r1, 2\n\
+ ldr r4, [sp, 0x18]\n\
+ lsrs r1, r4, 3\n\
+ orrs r0, r1\n\
+ orrs r2, r0\n\
+ strh r2, [r3]\n\
+ ldr r0, [sp, 0x30]\n\
+ str r0, [sp]\n\
+ ldr r1, [sp, 0x34]\n\
+ str r1, [sp, 0x4]\n\
+ ldr r4, [sp, 0x24]\n\
+ ldr r2, [sp, 0x28]\n\
+ lsls r0, r2, 16\n\
+ lsrs r0, 16\n\
+ str r0, [sp, 0x10]\n\
+ ldr r1, [sp, 0x2C]\n\
+ lsrs r0, r1, 16\n\
+ ldr r2, [sp, 0x10]\n\
+ cmp r2, r0\n\
+ bcc _080EF654\n\
+_080EF72E:\n\
+ add sp, 0x38\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");
+}
+#endif // NONMATCHING
+
+void sub_80EF740(void)
+{
+ gUnknown_083DFEC4->unk6DA0 = (gUnknown_083DFEC4->unk6DA0 + 1) & 1;
+ if (gUnknown_083DFEC4->unk6DA0)
+ gUnknown_083DFEC4->unk6DA2++;
+
+ REG_BG3HOFS = gUnknown_083DFEC4->unk6DA2;
+}
+
+void sub_80EF780(u8 taskId)
+{
+ if (gTasks[taskId].data[0] == 0 || (gUnknown_083DFEC4->unk6DA2 & 0x7) != 0)
+ {
+ sub_80EF740();
+ }
+ else
+ {
+ u16 value = gUnknown_083DFEC4->unk6DA2 & 0x7;
+ gUnknown_083DFEC4->unk6DA2 = value;
+ gUnknown_083DFEC4->unk6DA0 = value;
+ REG_BG3HOFS = value;
+ }
+}
+
+void sub_80EF7D4(void)
+{
+ gUnknown_083DFEC4->unk6DA2 = 0;
+ gUnknown_083DFEC4->unk6DA0 = 0;
+ gUnknown_083DFEC4->taskId6DA4 = CreateTask(sub_80EF780, 80);
+}
+
+void sub_80EF814(void)
+{
+ if (FuncIsActiveTask(sub_80EF780))
+ DestroyTask(gUnknown_083DFEC4->taskId6DA4);
+}
+
+void sub_80EF840(void)
+{
+ gUnknown_083DFEC4->unkD160 = 0;
+
+ if (gUnknown_083DFEC4->unk6DAC == 0)
+ {
+ while (sub_80EF874() != 0)
+ ;
+ }
+}
+
+bool8 sub_80EF874(void)
+{
+ switch (gUnknown_083DFEC4->unkD160)
+ {
+ case 0:
+ sub_80EEDE8();
+ break;
+ case 1:
+ SetUpWindowConfig(&gWindowConfig_81E7224);
+ break;
+ case 2:
+ MultistepInitMenuWindowBegin(&gWindowConfig_81E7224);
+ break;
+ case 3:
+ if (!MultistepInitMenuWindowContinue())
+ return TRUE;
+ break;
+ case 4:
+ MenuZeroFillScreen();
+ break;
+ case 5:
+ sub_80FA904(&gUnknown_083DFEC4->regionMap, gSaveBlock2.regionMapZoom ? TRUE : FALSE);
+ break;
+ case 6:
+ if (sub_80FA940())
+ return TRUE;
+ break;
+ case 7:
+ LZ77UnCompVram(gPokenavHoennMapSquares_Gfx, (void *)VRAM + 0x5000);
+ break;
+ case 8:
+ LoadPalette(gPokenavHoennMapSquares_Pal, 0x30, 0x20);
+ sub_80EFC3C();
+ break;
+ case 9:
+ if (sub_80EFC64())
+ return TRUE;
+ break;
+ case 10:
+ MenuDrawTextWindow(13, 3, 29, 17);
+ sub_80EF9F8();
+ break;
+ case 11:
+ if (!gUnknown_083DFEC4->regionMap.zoomed)
+ {
+ gUnknown_083DFEC4->unk7698 = 160;
+ REG_BG0VOFS = 160;
+ }
+ else
+ {
+ gUnknown_083DFEC4->unk7698 = 256;
+ REG_BG0VOFS = 0;
+ }
+
+ REG_BG0CNT = REG_BG0CNT;
+ REG_BG0CNT |= 1;
+ REG_BLDCNT = 0;
+ break;
+ default:
+ return FALSE;
+ }
+
+ gUnknown_083DFEC4->unkD160++;
+ return TRUE;
+}
+
+asm(".include \"constants/gba_constants.inc\"\n");
+
+void sub_80EF9F8(void)
+{
+ bool8 someBool = FALSE;
+ u16 top = 4;
+ u16 mapSectionId;
+ u8 b;
+
+ switch (gUnknown_083DFEC4->regionMap.unk16)
+ {
+ case 0:
+ break;
+ case 1:
+ case 4:
+ sub_8072A18(gUnknown_083DFEC4->regionMap.mapSectionName, 0x70, top * 8, 0x78, 1);
+ top += 2;
+ if (gLinkOpen == TRUE)
+ {
+ sub_80F1A80();
+ someBool = TRUE;
+ }
+ else
+ {
+ u16 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ const u8 *secName = GetLandmarkName(
+ gUnknown_083DFEC4->regionMap.mapSectionId,
+ gUnknown_083DFEC4->regionMap.everGrandeCityArea,
+ i);
+
+ if (secName == NULL)
+ break;
+ sub_8072A18(secName, 0x70, top * 8, 0x78, 1);
+ top += 2;
+ }
+ }
+ break;
+ case 2:
+ sub_8072A18(gUnknown_083DFEC4->regionMap.mapSectionName, 0x70, top * 8, 0x78, 1);
+ top += 2;
+ mapSectionId = gUnknown_083DFEC4->regionMap.mapSectionId;
+ b = gUnknown_083DFEC4->regionMap.everGrandeCityArea;
+ if (gUnknown_083DFEC4->unkCDCC[mapSectionId][b] != NULL)
+ {
+ MenuFillWindowRectWithBlankTile(14, top, 15, 15);
+ MenuFillWindowRectWithBlankTile(26, top, 28, 15);
+ sub_8095C8C((void *)(VRAM + 0xF800), 16, 6, gUnknown_083DFEC4->unkCDCC[mapSectionId][b], 0, 0, 10, 10, 10);
+ top += 11;
+ }
+ break;
+ case 3:
+ sub_8072A18(gUnknown_083DFEC4->regionMap.mapSectionName, 0x70, top * 8, 0x78, 1);
+ top += 2;
+ break;
+ }
+
+ // Epic fail by the compiler at optimizing this.
+ if (!someBool && top < 16)
+ MenuFillWindowRectWithBlankTile(14, top, 28, 15);
+
+ if (gUnknown_083DFEC4->regionMap.unk16 == 2)
+ sub_80EFD74();
+ else
+ sub_80EFDA0();
+}
+
+void sub_80EFBB0(void)
+{
+ if (!gUnknown_083DFEC4->regionMap.zoomed)
+ sub_80EEFBC(8);
+ else
+ sub_80EEFBC(7);
+}
+
+bool8 sub_80EFBDC(bool8 a)
+{
+ bool8 retVal = TRUE;
+ u16 var1 = gUnknown_083DFEC4->unk7698;
+
+ if (a)
+ {
+ if (var1 > 168)
+ {
+ var1 = var1 - 8;
+ }
+ else
+ {
+ var1 = 160;
+ retVal = FALSE;
+ }
+ }
+ else
+ {
+ if (var1 < 248)
+ {
+ var1 = var1 + 8;
+ }
+ else
+ {
+ var1 = 256;
+ retVal = FALSE;
+ }
+ }
+
+ gUnknown_083DFEC4->unk7698 = var1;
+ REG_BG0VOFS = var1 & 0xFF;
+
+ return retVal;
+}
+
+void sub_80EFC3C(void)
+{
+ gUnknown_083DFEC4->unkBC9A = 0;
+ gUnknown_083DFEC4->unkBC9B = 0;
+ sub_80EFD3C();
+}
+
+bool8 sub_80EFC64(void)
+{
+ u16 i;
+ u8 var1;
+ u16 var2;
+
+ if (gUnknown_083DFEC4->unkBC9A >= 16)
+ return FALSE;
+
+ var1 = gUnknown_083DFEC4->unkBC9A;
+ var2 = gUnknown_083DFEC4->unkBC9B;
+ for (i = 0; i < 2; i++)
+ {
+ if (gPokenavCityMaps[var1][i] != 0)
+ {
+ LZ77UnCompVram(gPokenavCityMaps[var1][i], gUnknown_083DFEC4->unkBC9C[var2]);
+ gUnknown_083DFEC4->unkCDCC[var1][i] = gUnknown_083DFEC4->unkBC9C[var2];
+ var2++;
+ }
+ else
+ {
+ gUnknown_083DFEC4->unkCDCC[var1][i] = NULL;
+ }
+ }
+
+ if (++gUnknown_083DFEC4->unkBC9A >= 16)
+ return FALSE;
+
+ gUnknown_083DFEC4->unkBC9B = var2;
+ return TRUE;
+}
+
+void sub_80EFD3C(void)
+{
+ gUnknown_083DFEC4->unk769E = 0;
+ gUnknown_083DFEC4->unk769C = 47;
+ gUnknown_083DFEC4->unk769D = 0;
+ gUnknown_083DFEC4->unk769A = 0;
+}
+
+void sub_80EFD74(void)
+{
+ gUnknown_083DFEC4->unk769E = 1;
+ if (gUnknown_083DFEC4->unk769D == 1)
+ gUnknown_083DFEC4->unk769D = 2;
+}
+
+void sub_80EFDA0(void)
+{
+ sub_8095C8C((void *)VRAM + 0xF800, 14, 16, gUnknown_08E9AC2C, 0, 0, 15, 1, 15);
+ gUnknown_083DFEC4->unk769E = 0;
+}
+
+void sub_80EFDE4(u8 param0)
+{
+ u16 var1 = 60 - gUnknown_083DFEC4->unk769C;
+
+ if (var1 > 15)
+ var1 = 15;
+
+ if (gUnknown_083DFEC4->unk769E != 0)
+ {
+ sub_8095C8C((void *)VRAM + 0xF800, 14, 16, gUnknown_08E9ABB4, gUnknown_083DFEC4->unk769C, 0, var1, 1, 60);
+
+ if (var1 < 15)
+ {
+ u16 var2 = var1 + 14;
+
+ sub_8095C8C((void *)VRAM + 0xF800, var2, 16, gUnknown_08E9ABB4, 0, 0, (u16)(15 - var1), 1, 60);
+ }
+ }
+}
+
+void sub_80EFE7C(void)
+{
+ u16 var1;
+ u8 var2 = gUnknown_083DFEC4->unk769D;
+
+ switch (var2)
+ {
+ case 0:
+ var1 = ++gUnknown_083DFEC4->unk769C;
+
+ if (var1 > 59)
+ gUnknown_083DFEC4->unk769C = var2;
+
+ sub_80EFDE4(gUnknown_083DFEC4->unk769E);
+
+ switch (gUnknown_083DFEC4->unk769C)
+ {
+ case 0:
+ case 15:
+ case 30:
+ case 45:
+ gUnknown_083DFEC4->unk769D = 1;
+ gUnknown_083DFEC4->unk769A = 0;
+ break;
+ }
+ break;
+ case 1:
+ var1 = ++gUnknown_083DFEC4->unk769A;
+ if (var1 > 120)
+ {
+ gUnknown_083DFEC4->unk769A = 0;
+ gUnknown_083DFEC4->unk769D = 0;
+ }
+ break;
+ case 2:
+ sub_80EFDE4(1);
+ gUnknown_083DFEC4->unk769D = 1;
+ break;
+ }
+}
+
+void sub_80EFF34(void)
+{
+ gUnknown_083DFEC4->unkD160 = 0;
+
+ if (gUnknown_083DFEC4->unk6DAC == 0)
+ {
+ while (sub_80EFF68())
+ ;
+ }
+}
+
+bool8 sub_80EFF68(void)
+{
+ switch (gUnknown_083DFEC4->unkD160)
+ {
+ case 0:
+ sub_80EEDE8();
+ gUnknown_083DFEC4->unkD162[0] = 11;
+ break;
+ case 1:
+ SetUpWindowConfig(&gWindowConfig_81E7080);
+ break;
+ case 2:
+ MultistepInitMenuWindowBegin(&gWindowConfig_81E7080);
+ break;
+ case 3:
+ if (!MultistepInitMenuWindowContinue())
+ return TRUE;
+ break;
+ case 4:
+ MenuZeroFillScreen();
+ break;
+ case 5:
+ sub_80F1614();
+ break;
+ case 6:
+ if (sub_80F162C(0))
+ return TRUE;
+ break;
+ case 7:
+ LZ77UnCompVram(gPokenavConditionView_Gfx, (void *)VRAM + 0x5000);
+ break;
+ case 8:
+ LZ77UnCompVram(gUnknown_08E9AC4C, (void *)VRAM + 0xF000);
+ LoadPalette(gPokenavConditionMenu2_Pal, 0x20, 0x20);
+ break;
+ case 9:
+ if (gUnknown_083DFEC4->unk76AA == 1)
+ sub_8095C8C((void *)VRAM + 0xF000, 0, 5, gUnknown_083E01AC, 0, 0, 9, 4, 9);
+ break;
+ case 10:
+ LZ77UnCompVram(gUnknown_08E9FEB4, (void *)VRAM + 0xB800);
+ break;
+ case 11:
+ LoadPalette(gUnknown_083E0254, 0x30, 0x20);
+ LoadPalette(gUnknownPalette_81E6692, 0xB0, 0x20);
+ LoadPalette(&gPokenavConditionMenu2_Pal[2], 0xB1, 0x2);
+ LoadPalette(&gPokenavConditionMenu2_Pal[16], 0xB5, 0x2);
+ LoadPalette(&gPokenavConditionMenu2_Pal[30], 0xBF, 0x2);
+ sub_80F01A4();
+ break;
+ case 12:
+ sub_80F01E0((u16)gUnknown_083DFEC4->unk8fe9);
+ break;
+ case 13:
+ REG_BG3CNT = 0x1E03;
+ REG_BG2CNT = 0x1702;
+ REG_BLDCNT = 0x844;
+ REG_BLDALPHA = 0x40B;
+ break;
+ default:
+ return FALSE;
+ }
+
+ gUnknown_083DFEC4->unkD160++;
+ return TRUE;
+}
+
+void sub_80F0174(bool8 bg2on)
+{
+ if (bg2on)
+ REG_DISPCNT |= DISPCNT_BG2_ON;
+ else
+ REG_DISPCNT &= ~DISPCNT_BG2_ON;
+}
+
+void sub_80F01A4(void)
+{
+ REG_WIN0H = WIN_RANGE(0, 240);
+ REG_WIN1H = WIN_RANGE(0, 155);
+ REG_WIN0V = WIN_RANGE(56, 121);
+ REG_WIN1V = WIN_RANGE(56, 121);
+ REG_WININ = 0x3F3F;
+ REG_WINOUT = 0x001B;
+}
+
+void sub_80F01E0(u16 a)
+{
+ MenuPrint(gUnknown_083DFEC4->unk8829[a], 13, 1);
+
+ if (gUnknown_083DFEC4->unk76AA == 1)
+ {
+ MenuPrint(gUnknown_083DFEC4->unk88E9[a], 13, 3);
+ sub_80F443C(gUnknown_083DFEC4->unk8788, gUnknown_083DFEC4->unk893c[gUnknown_083DFEC4->unk87DC].unk2);
+ MenuPrint(gUnknown_083DFEC4->unk8788, 1, 6);
+ }
+}
+
+void sub_80F0264(u8 a)
+{
+ gUnknown_083DFEC4->unk306 = 0;
+ gUnknown_083DFEC4->unk87CA = a;
+
+ if (gUnknown_083DFEC4->unk6DAC == 0)
+ {
+ while (sub_80F02A0())
+ ;
+ }
+}
+
+#ifdef NONMATCHING // small nonmatching part is in the third else clause in case 7.
+bool8 sub_80F02A0(void)
+{
+ const u16 *pointer;
+
+ switch (gUnknown_083DFEC4->unk306)
+ {
+ case 0:
+ sub_80EEDE8();
+
+ gUnknown_083DFEC4->unk87C8 = gUnknown_083DFEC4->unk87CA == 1;
+ gUnknown_083DFEC4->unkD162[0] = 11;
+ break;
+ case 1:
+ SetUpWindowConfig(&gWindowConfig_81E70D4);
+ break;
+ case 2:
+ MultistepInitMenuWindowBegin(&gWindowConfig_81E70D4);
+ break;
+ case 3:
+ if (!MultistepInitMenuWindowContinue())
+ {
+ return TRUE;
+ }
+ break;
+ case 4:
+ MenuZeroFillScreen();
+ break;
+ case 5:
+ LZ77UnCompVram(gUnknown_08E9FC64, (void *)VRAM + 0xE800);
+ break;
+ case 6:
+ LZ77UnCompVram(gPokenavConditionSearch2_Gfx, (void *)VRAM + 0x8000);
+ break;
+ case 7:
+ LoadPalette(gUnknown_083E02B4, 0xB0, 0x20);
+ LoadPalette(gUnknown_083E02B4, 0xF0, 0x20);
+ LoadPalette(gUnknown_083E0334, 0x40, 0x20);
+
+ if (gUnknown_083DFEC4->unk87CA == 0)
+ {
+ LoadPalette(gPokenavConditionSearch2_Pal, 0x30, 0x20);
+ gPlttBufferUnfaded[0] = gPokenavConditionSearch2_Pal[5];
+ LoadPalette(gUnknownPalette_81E6692, 0xB0, 0x20);
+ LoadPalette(&gUnknown_083E02B4[1], 0xB1, 0x2);
+ LoadPalette(&gUnknown_083E02B4[8], 0xB5, 0x2);
+ LoadPalette(&gPokenavConditionSearch2_Pal[5], 0xBF, 0x2);
+ }
+ else if (gUnknown_083DFEC4->unk87CA == 1)
+ {
+ LoadPalette(gUnknown_083E0274, 0x30, 0x20);
+ gPlttBufferUnfaded[0] = gUnknown_083E0274[5];
+ LoadPalette(gUnknownPalette_81E6692, 0xB0, 0x20);
+ LoadPalette(&gUnknown_083E02B4[1], 0xB1, 0x2);
+ LoadPalette(&gUnknown_083E02B4[8], 0xB5, 0x2);
+ LoadPalette(&gUnknown_083E0274[5], 0xBF, 0x2);
+ }
+ else
+ {
+ LoadPalette(gUnknown_08E9F9E8, 0x30, 0x20);
+ pointer = &gUnknown_08E9F9E8[5];
+ gPlttBufferUnfaded[0] = gUnknown_08E9F9E8[5];
+ LoadPalette(gUnknown_083E0314, 0x50, 0x20);
+ LoadPalette(&gUnknown_083E02B4[1], 0xB1, 0x2);
+ LoadPalette(&gUnknown_083E02B4[8], 0xB5, 0x2);
+ LoadPalette(pointer, 0xBF, 0x2);
+ LoadPalette(pointer, 0x5F, 0x2);
+ }
+ break;
+ case 8:
+ if (gUnknown_083DFEC4->unk87CA != 2)
+ {
+ sub_8095C8C((void *)VRAM + 0xE800, 0, 5, gUnknown_08E9FD1C, 0, 0, 9, 4, 9);
+ }
+ else
+ {
+ sub_8095C8C((void *)VRAM + 0xE800, 0, 4, gUnknown_08E9FE54, 0, 0, 12, 10, 12);
+ sub_8095C8C((void *)VRAM + 0xE800, 0, 8, gUnknown_08E9FD64, 0, 0, 12, 10, 12);
+ }
+ break;
+ case 9:
+ LZ77UnCompVram(gUnknown_083E0354, (void *)VRAM + 0x5000);
+ break;
+ case 10:
+ DmaClear16(3, (void *)VRAM + 0xF800, 0x800);
+ break;
+ case 11:
+ sub_80F0900();
+ break;
+ case 12:
+ if (sub_80F0944())
+ {
+ return TRUE;
+ }
+ break;
+ case 13:
+ if (gUnknown_083DFEC4->unk87CA != 2)
+ {
+ ShowMapNamePopUpWindow();
+ }
+ else
+ {
+ sub_80F081C(0);
+ sub_80F0FFC(gUnknown_083DFEC4->unk876E);
+ }
+ break;
+ case 14:
+ REG_BG2CNT = 0x1D0A;
+ REG_BG3CNT = 0x1E03;
+ REG_BG0CNT = 0x1F01;
+ REG_BG3VOFS = 0xF8;
+
+ gUnknown_083DFEC4->unk8776 = 0xF8;
+ gUnknown_083DFEC4->unk8778 = 0;
+
+ REG_BLDCNT = 0;
+ gUnknown_083DFEC4->unkD160++;
+ return FALSE;
+ default:
+ return FALSE;
+ }
+
+ gUnknown_083DFEC4->unk306++;
+ return TRUE;
+}
+#else
+__attribute__((naked))
+bool8 sub_80F02A0(void)
+{
+ asm(".syntax unified\n\
+ push {r4-r6,lr}\n\
+ mov r6, r8\n\
+ push {r6}\n\
+ sub sp, 0x18\n\
+ ldr r1, _080F02C4 @ =gUnknown_083DFEC4\n\
+ ldr r0, [r1]\n\
+ ldr r2, _080F02C8 @ =0x00000306\n\
+ adds r0, r2\n\
+ ldrh r0, [r0]\n\
+ adds r2, r1, 0\n\
+ cmp r0, 0xE\n\
+ bls _080F02BA\n\
+ b _080F05FA\n\
+_080F02BA:\n\
+ lsls r0, 2\n\
+ ldr r1, _080F02CC @ =_080F02D0\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .align 2, 0\n\
+_080F02C4: .4byte gUnknown_083DFEC4\n\
+_080F02C8: .4byte 0x00000306\n\
+_080F02CC: .4byte _080F02D0\n\
+ .align 2, 0\n\
+_080F02D0:\n\
+ .4byte _080F030C\n\
+ .4byte _080F0344\n\
+ .4byte _080F0350\n\
+ .4byte _080F035C\n\
+ .4byte _080F0368\n\
+ .4byte _080F036E\n\
+ .4byte _080F0380\n\
+ .4byte _080F0394\n\
+ .4byte _080F04BC\n\
+ .4byte _080F053C\n\
+ .4byte _080F0550\n\
+ .4byte _080F0574\n\
+ .4byte _080F057A\n\
+ .4byte _080F0586\n\
+ .4byte _080F05BC\n\
+_080F030C:\n\
+ bl sub_80EEDE8\n\
+ ldr r0, _080F0334 @ =gUnknown_083DFEC4\n\
+ ldr r1, [r0]\n\
+ movs r2, 0\n\
+ ldr r3, _080F0338 @ =0x000087ca\n\
+ adds r0, r1, r3\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0x1\n\
+ bne _080F0322\n\
+ movs r2, 0x1\n\
+_080F0322:\n\
+ ldr r3, _080F033C @ =0x000087c8\n\
+ adds r0, r1, r3\n\
+ strb r2, [r0]\n\
+ ldr r0, _080F0340 @ =0x0000d162\n\
+ adds r1, r0\n\
+ movs r0, 0xB\n\
+ strb r0, [r1]\n\
+ b _080F0618\n\
+ .align 2, 0\n\
+_080F0334: .4byte gUnknown_083DFEC4\n\
+_080F0338: .4byte 0x000087ca\n\
+_080F033C: .4byte 0x000087c8\n\
+_080F0340: .4byte 0x0000d162\n\
+_080F0344:\n\
+ ldr r0, _080F034C @ =gWindowConfig_81E70D4\n\
+ bl SetUpWindowConfig\n\
+ b _080F0618\n\
+ .align 2, 0\n\
+_080F034C: .4byte gWindowConfig_81E70D4\n\
+_080F0350:\n\
+ ldr r0, _080F0358 @ =gWindowConfig_81E70D4\n\
+ bl MultistepInitMenuWindowBegin\n\
+ b _080F0618\n\
+ .align 2, 0\n\
+_080F0358: .4byte gWindowConfig_81E70D4\n\
+_080F035C:\n\
+ bl MultistepInitMenuWindowContinue\n\
+ cmp r0, 0\n\
+ beq _080F0366\n\
+ b _080F0618\n\
+_080F0366:\n\
+ b _080F0626\n\
+_080F0368:\n\
+ bl MenuZeroFillScreen\n\
+ b _080F0618\n\
+_080F036E:\n\
+ ldr r0, _080F0378 @ =gUnknown_08E9FC64\n\
+ ldr r1, _080F037C @ =0x0600e800\n\
+ bl LZ77UnCompVram\n\
+ b _080F0618\n\
+ .align 2, 0\n\
+_080F0378: .4byte gUnknown_08E9FC64\n\
+_080F037C: .4byte 0x0600e800\n\
+_080F0380:\n\
+ ldr r0, _080F038C @ =gPokenavConditionSearch2_Gfx\n\
+ ldr r1, _080F0390 @ =0x06008000\n\
+ bl LZ77UnCompVram\n\
+ b _080F0618\n\
+ .align 2, 0\n\
+_080F038C: .4byte gPokenavConditionSearch2_Gfx\n\
+_080F0390: .4byte 0x06008000\n\
+_080F0394:\n\
+ ldr r6, _080F03FC @ =gUnknown_083E02B4\n\
+ adds r0, r6, 0\n\
+ movs r1, 0xB0\n\
+ movs r2, 0x20\n\
+ bl LoadPalette\n\
+ adds r0, r6, 0\n\
+ movs r1, 0xF0\n\
+ movs r2, 0x20\n\
+ bl LoadPalette\n\
+ ldr r0, _080F0400 @ =gUnknown_083E0334\n\
+ movs r1, 0x40\n\
+ movs r2, 0x20\n\
+ bl LoadPalette\n\
+ ldr r0, _080F0404 @ =gUnknown_083DFEC4\n\
+ ldr r0, [r0]\n\
+ ldr r1, _080F0408 @ =0x000087ca\n\
+ adds r0, r1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _080F0418\n\
+ ldr r4, _080F040C @ =gPokenavConditionSearch2_Pal\n\
+ adds r0, r4, 0\n\
+ movs r1, 0x30\n\
+ movs r2, 0x20\n\
+ bl LoadPalette\n\
+ ldr r1, _080F0410 @ =gPlttBufferUnfaded\n\
+ ldrh r0, [r4, 0xA]\n\
+ strh r0, [r1]\n\
+ ldr r0, _080F0414 @ =gUnknownPalette_81E6692\n\
+ movs r1, 0xB0\n\
+ movs r2, 0x20\n\
+ bl LoadPalette\n\
+ adds r0, r6, 0x2\n\
+ movs r1, 0xB1\n\
+ movs r2, 0x2\n\
+ bl LoadPalette\n\
+ adds r0, r6, 0\n\
+ adds r0, 0x10\n\
+ movs r1, 0xB5\n\
+ movs r2, 0x2\n\
+ bl LoadPalette\n\
+ adds r4, 0xA\n\
+ adds r0, r4, 0\n\
+ movs r1, 0xBF\n\
+ b _080F04A8\n\
+ .align 2, 0\n\
+_080F03FC: .4byte gUnknown_083E02B4\n\
+_080F0400: .4byte gUnknown_083E0334\n\
+_080F0404: .4byte gUnknown_083DFEC4\n\
+_080F0408: .4byte 0x000087ca\n\
+_080F040C: .4byte gPokenavConditionSearch2_Pal\n\
+_080F0410: .4byte gPlttBufferUnfaded\n\
+_080F0414: .4byte gUnknownPalette_81E6692\n\
+_080F0418:\n\
+ cmp r0, 0x1\n\
+ bne _080F0464\n\
+ ldr r4, _080F0458 @ =gUnknown_083E0274\n\
+ adds r0, r4, 0\n\
+ movs r1, 0x30\n\
+ movs r2, 0x20\n\
+ bl LoadPalette\n\
+ ldr r1, _080F045C @ =gPlttBufferUnfaded\n\
+ ldrh r0, [r4, 0xA]\n\
+ strh r0, [r1]\n\
+ ldr r0, _080F0460 @ =gUnknownPalette_81E6692\n\
+ movs r1, 0xB0\n\
+ movs r2, 0x20\n\
+ bl LoadPalette\n\
+ adds r0, r6, 0x2\n\
+ movs r1, 0xB1\n\
+ movs r2, 0x2\n\
+ bl LoadPalette\n\
+ adds r0, r6, 0\n\
+ adds r0, 0x10\n\
+ movs r1, 0xB5\n\
+ movs r2, 0x2\n\
+ bl LoadPalette\n\
+ adds r4, 0xA\n\
+ adds r0, r4, 0\n\
+ movs r1, 0xBF\n\
+ b _080F04A8\n\
+ .align 2, 0\n\
+_080F0458: .4byte gUnknown_083E0274\n\
+_080F045C: .4byte gPlttBufferUnfaded\n\
+_080F0460: .4byte gUnknownPalette_81E6692\n\
+_080F0464:\n\
+ ldr r4, _080F04B0 @ =gUnknown_08E9F9E8\n\
+ adds r0, r4, 0\n\
+ movs r1, 0x30\n\
+ movs r2, 0x20\n\
+ bl LoadPalette\n\
+ ldr r1, _080F04B4 @ =gPlttBufferUnfaded\n\
+ adds r5, r4, 0\n\
+ adds r5, 0xA\n\
+ ldrh r0, [r4, 0xA]\n\
+ strh r0, [r1]\n\
+ ldr r0, _080F04B8 @ =gUnknown_083E0314\n\
+ movs r1, 0x50\n\
+ movs r2, 0x20\n\
+ bl LoadPalette\n\
+ adds r0, r6, 0x2\n\
+ movs r1, 0xB1\n\
+ movs r2, 0x2\n\
+ bl LoadPalette\n\
+ adds r0, r6, 0\n\
+ adds r0, 0x10\n\
+ movs r1, 0xB5\n\
+ movs r2, 0x2\n\
+ bl LoadPalette\n\
+ adds r0, r5, 0\n\
+ movs r1, 0xBF\n\
+ movs r2, 0x2\n\
+ bl LoadPalette\n\
+ adds r0, r5, 0\n\
+ movs r1, 0x5F\n\
+_080F04A8:\n\
+ movs r2, 0x2\n\
+ bl LoadPalette\n\
+ b _080F0618\n\
+ .align 2, 0\n\
+_080F04B0: .4byte gUnknown_08E9F9E8\n\
+_080F04B4: .4byte gPlttBufferUnfaded\n\
+_080F04B8: .4byte gUnknown_083E0314\n\
+_080F04BC:\n\
+ ldr r0, _080F04E8 @ =gUnknown_083DFEC4\n\
+ ldr r0, [r0]\n\
+ ldr r2, _080F04EC @ =0x000087ca\n\
+ adds r0, r2\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0x2\n\
+ beq _080F04F8\n\
+ ldr r0, _080F04F0 @ =0x0600e800\n\
+ ldr r3, _080F04F4 @ =gUnknown_08E9FD1C\n\
+ movs r1, 0\n\
+ str r1, [sp]\n\
+ str r1, [sp, 0x4]\n\
+ movs r2, 0x9\n\
+ str r2, [sp, 0x8]\n\
+ movs r1, 0x4\n\
+ str r1, [sp, 0xC]\n\
+ str r2, [sp, 0x10]\n\
+ movs r1, 0\n\
+ movs r2, 0x5\n\
+ bl sub_8095C8C\n\
+ b _080F0618\n\
+ .align 2, 0\n\
+_080F04E8: .4byte gUnknown_083DFEC4\n\
+_080F04EC: .4byte 0x000087ca\n\
+_080F04F0: .4byte 0x0600e800\n\
+_080F04F4: .4byte gUnknown_08E9FD1C\n\
+_080F04F8:\n\
+ ldr r3, _080F0530 @ =0x0600e800\n\
+ mov r8, r3\n\
+ ldr r3, _080F0534 @ =gUnknown_08E9FE54\n\
+ movs r4, 0\n\
+ str r4, [sp]\n\
+ str r4, [sp, 0x4]\n\
+ movs r5, 0xC\n\
+ str r5, [sp, 0x8]\n\
+ movs r6, 0xA\n\
+ str r6, [sp, 0xC]\n\
+ str r5, [sp, 0x10]\n\
+ mov r0, r8\n\
+ movs r1, 0\n\
+ movs r2, 0x4\n\
+ bl sub_8095C8C\n\
+ ldr r3, _080F0538 @ =gUnknown_08E9FD64\n\
+ str r4, [sp]\n\
+ str r4, [sp, 0x4]\n\
+ str r5, [sp, 0x8]\n\
+ str r6, [sp, 0xC]\n\
+ str r5, [sp, 0x10]\n\
+ mov r0, r8\n\
+ movs r1, 0\n\
+ movs r2, 0x8\n\
+ bl sub_8095C8C\n\
+ b _080F0618\n\
+ .align 2, 0\n\
+_080F0530: .4byte 0x0600e800\n\
+_080F0534: .4byte gUnknown_08E9FE54\n\
+_080F0538: .4byte gUnknown_08E9FD64\n\
+_080F053C:\n\
+ ldr r0, _080F0548 @ =gUnknown_083E0354\n\
+ ldr r1, _080F054C @ =0x06005000\n\
+ bl LZ77UnCompVram\n\
+ b _080F0618\n\
+ .align 2, 0\n\
+_080F0548: .4byte gUnknown_083E0354\n\
+_080F054C: .4byte 0x06005000\n\
+_080F0550:\n\
+ ldr r2, _080F0568 @ =0x0600f800\n\
+ add r1, sp, 0x14\n\
+ movs r0, 0\n\
+ strh r0, [r1]\n\
+ ldr r0, _080F056C @ =0x040000d4\n\
+ str r1, [r0]\n\
+ str r2, [r0, 0x4]\n\
+ ldr r1, _080F0570 @ =0x81000400\n\
+ str r1, [r0, 0x8]\n\
+ ldr r0, [r0, 0x8]\n\
+ b _080F0618\n\
+ .align 2, 0\n\
+_080F0568: .4byte 0x0600f800\n\
+_080F056C: .4byte 0x040000d4\n\
+_080F0570: .4byte 0x81000400\n\
+_080F0574:\n\
+ bl sub_80F0900\n\
+ b _080F0618\n\
+_080F057A:\n\
+ bl sub_80F0944\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _080F0618\n\
+ b _080F0626\n\
+_080F0586:\n\
+ ldr r0, _080F059C @ =gUnknown_083DFEC4\n\
+ ldr r4, [r0]\n\
+ ldr r1, _080F05A0 @ =0x000087ca\n\
+ adds r0, r4, r1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0x2\n\
+ beq _080F05A4\n\
+ bl ShowMapNamePopUpWindow\n\
+ b _080F0618\n\
+ .align 2, 0\n\
+_080F059C: .4byte gUnknown_083DFEC4\n\
+_080F05A0: .4byte 0x000087ca\n\
+_080F05A4:\n\
+ movs r0, 0\n\
+ bl sub_80F081C\n\
+ ldr r2, _080F05B8 @ =0x0000876e\n\
+ adds r0, r4, r2\n\
+ ldrb r0, [r0]\n\
+ bl sub_80F0FFC\n\
+ b _080F0618\n\
+ .align 2, 0\n\
+_080F05B8: .4byte 0x0000876e\n\
+_080F05BC:\n\
+ ldr r1, _080F0600 @ =REG_BG2CNT\n\
+ ldr r3, _080F0604 @ =0x00001d0a\n\
+ adds r0, r3, 0\n\
+ strh r0, [r1]\n\
+ adds r1, 0x2\n\
+ adds r3, 0xF9\n\
+ adds r0, r3, 0\n\
+ strh r0, [r1]\n\
+ subs r1, 0x6\n\
+ adds r3, 0xFE\n\
+ adds r0, r3, 0\n\
+ strh r0, [r1]\n\
+ adds r1, 0x16\n\
+ movs r0, 0xF8\n\
+ strh r0, [r1]\n\
+ ldr r1, [r2]\n\
+ ldr r0, _080F0608 @ =0x00008776\n\
+ adds r2, r1, r0\n\
+ movs r3, 0\n\
+ movs r0, 0xF8\n\
+ strh r0, [r2]\n\
+ ldr r2, _080F060C @ =0x00008778\n\
+ adds r0, r1, r2\n\
+ strh r3, [r0]\n\
+ ldr r0, _080F0610 @ =REG_BLDCNT\n\
+ strh r3, [r0]\n\
+ ldr r3, _080F0614 @ =0x0000d160\n\
+ adds r1, r3\n\
+ ldrh r0, [r1]\n\
+ adds r0, 0x1\n\
+ strh r0, [r1]\n\
+_080F05FA:\n\
+ movs r0, 0\n\
+ b _080F0628\n\
+ .align 2, 0\n\
+_080F0600: .4byte REG_BG2CNT\n\
+_080F0604: .4byte 0x00001d0a\n\
+_080F0608: .4byte 0x00008776\n\
+_080F060C: .4byte 0x00008778\n\
+_080F0610: .4byte REG_BLDCNT\n\
+_080F0614: .4byte 0x0000d160\n\
+_080F0618:\n\
+ ldr r0, _080F0634 @ =gUnknown_083DFEC4\n\
+ ldr r1, [r0]\n\
+ ldr r0, _080F0638 @ =0x00000306\n\
+ adds r1, r0\n\
+ ldrh r0, [r1]\n\
+ adds r0, 0x1\n\
+ strh r0, [r1]\n\
+_080F0626:\n\
+ movs r0, 0x1\n\
+_080F0628:\n\
+ add sp, 0x18\n\
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4-r6}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .align 2, 0\n\
+_080F0634: .4byte gUnknown_083DFEC4\n\
+_080F0638: .4byte 0x00000306\n\
+ .syntax divided\n");
+}
+#endif // NONMATCHING
diff --git a/src/rom3.c b/src/rom3.c
index 3b4b6a941..11239a681 100644
--- a/src/rom3.c
+++ b/src/rom3.c
@@ -5,22 +5,19 @@
#include "battle_anim.h"
#include "battle_anim_81258BC.h"
#include "battle_anim_8137220.h"
+#include "battle_util.h"
#include "cable_club.h"
-#include "items.h"
+#include "constants/items.h"
#include "link.h"
#include "pokemon.h"
#include "rom3.h"
#include "rom_8094928.h"
-#include "species.h"
+#include "constants/species.h"
#include "task.h"
#include "util.h"
#include "battle_message.h"
#include "data2.h"
-
-extern u8 unk_2000000[];
-
-#define EWRAM_14000 ((u8 *)(unk_2000000 + 0x14000))
-#define EWRAM_15000 ((u8 *)(unk_2000000 + 0x15000))
+#include "ewram.h"
extern u16 gBattleTypeFlags;
extern u16 gBattleWeather;
@@ -39,7 +36,7 @@ extern u8 gNoOfAllBanks;
extern u16 gBattlePartyID[];
extern u8 gBanksBySide[];
extern u16 gCurrentMove;
-extern u16 gUnknown_02024BE8;
+extern u16 gChosenMove;
extern u16 gLastUsedItem;
extern u8 gLastUsedAbility;
extern u8 gBankAttacker;
@@ -84,7 +81,7 @@ void setup_poochyena_battle(void)
}
sub_800B858();
gBattleExecBuffer = 0;
- battle_anim_clear_some_data();
+ ClearBattleAnimationVars();
ClearBattleMonForms();
BattleAI_HandleItemUseBeforeAISetup();
if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)
@@ -92,7 +89,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;
@@ -403,16 +400,18 @@ void PrepareBufferDataTransferLink(u8 a, u16 size, u8 *data)
gTasks[gUnknown_020238C4].data[12] = gTasks[gUnknown_020238C4].data[14];
gTasks[gUnknown_020238C4].data[14] = 0;
}
- unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14000] = a;
- unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14001] = gActiveBank;
- unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14002] = gBankAttacker;
- unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14003] = gBankTarget;
- unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14004] = r9;
- unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14005] = (r9 & 0x0000FF00) >> 8;
- unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14006] = gAbsentBankFlags;
- unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14007] = gEffectBank;
+
+ ewram14000arr(0, gTasks[gUnknown_020238C4].data[14]) = a;
+ ewram14000arr(1, gTasks[gUnknown_020238C4].data[14]) = gActiveBank;
+ ewram14000arr(2, gTasks[gUnknown_020238C4].data[14]) = gBankAttacker;
+ ewram14000arr(3, gTasks[gUnknown_020238C4].data[14]) = gBankTarget;
+ ewram14000arr(4, gTasks[gUnknown_020238C4].data[14]) = r9;
+ ewram14000arr(5, gTasks[gUnknown_020238C4].data[14]) = (r9 & 0x0000FF00) >> 8;
+ ewram14000arr(6, gTasks[gUnknown_020238C4].data[14]) = gAbsentBankFlags;
+ ewram14000arr(7, gTasks[gUnknown_020238C4].data[14]) = gEffectBank;
+
for (i = 0; i < size; i++)
- unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14008 + i] = data[i];
+ ewram14008arr(i, gTasks[gUnknown_020238C4].data[14]) = data[i];
gTasks[gUnknown_020238C4].data[14] = gTasks[gUnknown_020238C4].data[14] + r9 + 8;
}
@@ -452,8 +451,8 @@ void sub_800C1A8(u8 taskId)
gTasks[taskId].data[12] = 0;
gTasks[taskId].data[15] = 0;
}
- var = (unk_2000000[gTasks[taskId].data[15] + 0x14004] | (unk_2000000[gTasks[taskId].data[15] + 0x14005] << 8)) + 8;
- SendBlock(bitmask_all_link_players_but_self(), &unk_2000000[gTasks[taskId].data[15] + 0x14000], var);
+ var = (ewram14004arr(0, gTasks[taskId].data[15]) | (ewram14004arr(1, gTasks[taskId].data[15]) << 8)) + 8;
+ SendBlock(bitmask_all_link_players_but_self(), &ewram14000arr(0, gTasks[taskId].data[15]), var);
gTasks[taskId].data[11]++;
}
else
@@ -466,7 +465,7 @@ void sub_800C1A8(u8 taskId)
case 4:
if (sub_8007ECC())
{
- var = unk_2000000[gTasks[taskId].data[15] + 0x14004] | (unk_2000000[gTasks[taskId].data[15] + 0x14005] << 8);
+ var = (ewram14004arr(0, gTasks[taskId].data[15]) | (ewram14004arr(1, gTasks[taskId].data[15]) << 8));
gTasks[taskId].data[13] = 1;
gTasks[taskId].data[15] = gTasks[taskId].data[15] + var + 8;
gTasks[taskId].data[11] = 3;
@@ -489,7 +488,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 +499,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 +512,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;
@@ -537,28 +536,28 @@ void sub_800C47C(u8 taskId)
gTasks[taskId].data[12] = 0;
gTasks[taskId].data[15] = 0;
}
- r4 = unk_2000000[0x15000 + gTasks[taskId].data[15] + 1];
- r7 = unk_2000000[0x15000 + gTasks[taskId].data[15] + 4] | (unk_2000000[0x15000 + gTasks[taskId].data[15] + 5] << 8);
- switch (unk_2000000[0x15000 + gTasks[taskId].data[15] + 0])
+ r4 = ewram15000arr(1, gTasks[taskId].data[15]);
+ r7 = ewram15000arr(4, gTasks[taskId].data[15]) | (ewram15000arr(5, gTasks[taskId].data[15]) << 8);
+ switch (ewram15000arr(0, gTasks[taskId].data[15]))
{
case 0:
if (gBattleExecBuffer & gBitTable[r4])
return;
- memcpy(gBattleBufferA[r4], &unk_2000000[0x15000 + gTasks[taskId].data[15] + 8], r7);
+ memcpy(gBattleBufferA[r4], &ewram15000arr(8, gTasks[taskId].data[15]), r7);
sub_80155A4(r4);
if (!(gBattleTypeFlags & BATTLE_TYPE_WILD))
{
- gBankAttacker = unk_2000000[0x15000 + gTasks[taskId].data[15] + 2];
- gBankTarget = unk_2000000[0x15000 + gTasks[taskId].data[15] + 3];
- gAbsentBankFlags = unk_2000000[0x15000 + gTasks[taskId].data[15] + 6];
- gEffectBank = unk_2000000[0x15000 + gTasks[taskId].data[15] + 7];
+ gBankAttacker = ewram15000arr(2, gTasks[taskId].data[15]);
+ gBankTarget = ewram15000arr(3, gTasks[taskId].data[15]);
+ gAbsentBankFlags = ewram15000arr(6, gTasks[taskId].data[15]);
+ gEffectBank = ewram15000arr(7, gTasks[taskId].data[15]);
}
break;
case 1:
- memcpy(gBattleBufferB[r4], &unk_2000000[0x15000 + gTasks[taskId].data[15] + 8], r7);
+ memcpy(gBattleBufferB[r4], &ewram15000arr(8, gTasks[taskId].data[15]), r7);
break;
case 2:
- r2 = unk_2000000[0x15000 + gTasks[taskId].data[15] + 8];
+ r2 = ewram15000arr(8, gTasks[taskId].data[15]);
gBattleExecBuffer &= ~(gBitTable[r4] << (r2 * 4));
break;
}
@@ -584,7 +583,7 @@ void Emitcmd1(u8 a, u8 b, u8 c)
PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4);
}
-void EmitSetAttributes(u8 a, u8 b, u8 c, u8 d, void *e)
+void EmitSetMonData(u8 a, u8 b, u8 c, u8 d, void *e)
{
int i;
@@ -747,7 +746,7 @@ void EmitPrintString(u8 a, u16 stringID)
stringInfo = (struct StringInfoBattle*)(&gBattleBuffersTransferData[4]);
stringInfo->currentMove = gCurrentMove;
- stringInfo->lastMove = gUnknown_02024BE8;
+ stringInfo->lastMove = gChosenMove;
stringInfo->lastItem = gLastUsedItem;
stringInfo->lastAbility = gLastUsedAbility;
stringInfo->scrActive = BATTLE_STRUCT->scriptingActive;
@@ -779,7 +778,7 @@ void EmitPrintStringPlayerOnly(u8 a, u16 stringID)
stringInfo = (struct StringInfoBattle*)(&gBattleBuffersTransferData[4]);
stringInfo->currentMove = gCurrentMove;
- stringInfo->lastMove = gUnknown_02024BE8;
+ stringInfo->lastMove = gChosenMove;
stringInfo->lastItem = gLastUsedItem;
stringInfo->lastAbility = gLastUsedAbility;
stringInfo->scrActive = BATTLE_STRUCT->scriptingActive;
@@ -1081,10 +1080,10 @@ void EmitFaintingCry(u8 a)
PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 4);
}
-void EmitIntroSlide(u8 a, u8 b)
+void EmitIntroSlide(u8 a, u8 battleTerrain)
{
gBattleBuffersTransferData[0] = 46;
- gBattleBuffersTransferData[1] = b;
+ gBattleBuffersTransferData[1] = battleTerrain;
PrepareBufferDataTransfer(a, gBattleBuffersTransferData, 2);
}
@@ -1097,7 +1096,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 +1105,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 ff032b6c2..e71484b0a 100644
--- a/src/rom6.c
+++ b/src/rom6.c
@@ -6,18 +6,18 @@
#include "field_player_avatar.h"
#include "item_use.h"
#include "pokemon_menu.h"
-#include "rom4.h"
+#include "overworld.h"
#include "script.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
#include "sprite.h"
#include "task.h"
-extern u16 gScriptLastTalked;
+extern u16 gSpecialVar_LastTalked;
extern void (*gFieldCallback)(void);
extern u8 gLastFieldPokeMenuOpened;
extern void (*gUnknown_03005CE4)(void);
-extern u8 UseRockSmashScript[];
+extern u8 S_UseRockSmash[];
EWRAM_DATA struct MapPosition gUnknown_0203923C = {0};
@@ -43,7 +43,7 @@ bool8 npc_before_player_of_type(u8 a)
}
else
{
- gScriptLastTalked = gMapObjects[mapObjId].localId;
+ gSpecialVar_LastTalked = gMapObjects[mapObjId].localId;
return TRUE;
}
}
@@ -59,14 +59,14 @@ 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]))
{
- if (gMapHeader.mapType == 5)
+ if (gMapHeader.mapType == MAP_TYPE_UNDERWATER)
{
- FieldEffectStart(0x3B);
+ FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
gTasks[taskId].func = sub_810B428;
}
else
@@ -82,7 +82,7 @@ static void sub_810B3DC(u8 taskId)
{
if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[gPlayerAvatar.mapObjectId]) == TRUE)
{
- FieldEffectStart(0x3B);
+ FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
gTasks[taskId].func = sub_810B428;
}
}
@@ -91,17 +91,17 @@ static void sub_810B428(u8 taskId)
{
if (!FieldEffectActiveListContains(6))
{
- gUnknown_0202FF84[1] = player_get_direction_lower_nybble();
- if (gUnknown_0202FF84[1] == 1)
- gUnknown_0202FF84[2] = 0;
- if (gUnknown_0202FF84[1] == 2)
- gUnknown_0202FF84[2] = 1;
- if (gUnknown_0202FF84[1] == 3)
- gUnknown_0202FF84[2] = 2;
- if (gUnknown_0202FF84[1] == 4)
- gUnknown_0202FF84[2] = 3;
+ gFieldEffectArguments[1] = player_get_direction_lower_nybble();
+ if (gFieldEffectArguments[1] == 1)
+ gFieldEffectArguments[2] = 0;
+ if (gFieldEffectArguments[1] == 2)
+ gFieldEffectArguments[2] = 1;
+ if (gFieldEffectArguments[1] == 3)
+ gFieldEffectArguments[2] = 2;
+ if (gFieldEffectArguments[1] == 4)
+ gFieldEffectArguments[2] = 3;
sub_805B980(&gMapObjects[gPlayerAvatar.mapObjectId], GetPlayerAvatarGraphicsIdByCurrentState());
- StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], gUnknown_0202FF84[2]);
+ StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], gFieldEffectArguments[2]);
FieldEffectActiveListRemove(6);
gTasks[taskId].func = sub_810B4CC;
}
@@ -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);
}
@@ -120,7 +120,7 @@ bool8 SetUpFieldMove_RockSmash(void)
{
if (npc_before_player_of_type(0x56) == TRUE)
{
- gFieldCallback = sub_808AB90;
+ gFieldCallback = FieldCallback_Teleport;
gUnknown_03005CE4 = sub_810B53C;
return TRUE;
}
@@ -132,8 +132,8 @@ bool8 SetUpFieldMove_RockSmash(void)
static void sub_810B53C(void)
{
- gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened;
- ScriptContext1_SetupScript(UseRockSmashScript);
+ gFieldEffectArguments[0] = gLastFieldPokeMenuOpened;
+ ScriptContext1_SetupScript(S_UseRockSmash);
}
int FldEff_RockSmash(void)
@@ -149,15 +149,15 @@ int FldEff_RockSmash(void)
static void sub_810B58C(void)
{
PlaySE(SE_W088);
- FieldEffectActiveListRemove(0x25);
+ FieldEffectActiveListRemove(FLDEFF_USE_ROCK_SMASH);
EnableBothScriptContexts();
}
int SetUpFieldMove_Dig(void)
{
- if (sub_80CA1C8() == TRUE)
+ if (CanUseEscapeRopeOnCurrMap() == TRUE)
{
- gFieldCallback = sub_808AB90;
+ gFieldCallback = FieldCallback_Teleport;
gUnknown_03005CE4 = sub_810B5D8;
return TRUE;
}
@@ -169,9 +169,9 @@ int SetUpFieldMove_Dig(void)
static void sub_810B5D8(void)
{
- sub_8053014();
- FieldEffectStart(0x26);
- gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened;
+ Overworld_ResetStateAfterDigEscRope();
+ FieldEffectStart(FLDEFF_USE_DIG);
+ gFieldEffectArguments[0] = gLastFieldPokeMenuOpened;
}
int FldEff_UseDig(void)
@@ -189,7 +189,7 @@ static void sub_810B634(void)
{
u8 taskId;
- FieldEffectActiveListRemove(0x26);
+ FieldEffectActiveListRemove(FLDEFF_USE_DIG);
if (ShouldDoBrailleDigEffect())
{
DoBrailleDigEffect();
diff --git a/src/rom_800D42C.c b/src/rom_800D42C.c
index f51779e65..bf6d03fb7 100644
--- a/src/rom_800D42C.c
+++ b/src/rom_800D42C.c
@@ -2,6 +2,7 @@
#include "battle.h"
#include "link.h"
#include "text.h"
+#include "ewram.h"
extern u16 gBattleTypeFlags;
extern u8 gBattleOutcome;
diff --git a/src/rom_8077ABC.c b/src/rom_8077ABC.c
index 249146b37..2691da859 100644
--- a/src/rom_8077ABC.c
+++ b/src/rom_8077ABC.c
@@ -1,17 +1,19 @@
#include "global.h"
+#include "constants/species.h"
#include "rom_8077ABC.h"
#include "battle.h"
#include "battle_anim.h"
#include "blend_palette.h"
+#include "contest.h"
#include "data2.h"
#include "decompress.h"
#include "palette.h"
#include "pokemon_icon.h"
-#include "species.h"
#include "sprite.h"
#include "task.h"
#include "trig.h"
#include "util.h"
+#include "ewram.h"
#define GET_UNOWN_LETTER(personality) ((\
(((personality & 0x03000000) >> 24) << 6) \
@@ -27,94 +29,58 @@
#define gBattleMonPartyPositions gBattlePartyID
#define gCastformElevations gUnknownCastformData_0837F5A8
#define gCastformBackSpriteYCoords gUnknown_0837F5AC
-#define gTransformPersonalities gPID_perBank
+#define gTransformPersonalities gTransformedPersonalities
#define gBattleMonSprites gObjectBankIDs
-
-struct Struct_unk_2019348 {
- u16 field_0;
- u16 field_2;
- u8 field_4;
- u32 field_8;
- u32 field_c;
- u32 field_10;
-};
-
-struct TransformStatus {
+struct TransformStatus
+{
u16 unknown;
u16 species;
};
-struct Struct_gUnknown_0837F578 {
+struct Struct_gUnknown_0837F578
+{
u8 field_0;
u8 field_1;
};
-struct OamMatrix {
- s16 a;
- s16 b;
- s16 c;
- s16 d;
-};
-
-struct Struct_2017810 {
+struct Struct_2017810
+{
u8 filler_0[6];
u8 field_6;
u8 filler_7[5];
};
-struct Color {
- u16 r:5;
- u16 g:5;
- u16 b:5;
-};
-
-struct Struct_sub_8078914 {
- u8 *field_0;
- u8 *field_4;
- u8 field_8;
-};
-
-struct BGCnt {
- u16 priority:2;
- u16 charBase:2;
- u16 unused:2;
- u16 mosaic:1;
- u16 colorMode:1;
- u16 screenBase:5;
- u16 overflow:1;
- u16 size:2;
-};
-
-#define BG1CNT (*(volatile struct BGCnt*)REG_ADDR_BG1CNT)
-#define BG2CNT (*(volatile struct BGCnt*)REG_ADDR_BG2CNT)
-#define BG3CNT (*(volatile struct BGCnt*)REG_ADDR_BG3CNT)
+#define BG1CNT (*(vBgCnt *)REG_ADDR_BG1CNT)
+#define BG2CNT (*(vBgCnt *)REG_ADDR_BG2CNT)
+#define BG3CNT (*(vBgCnt *)REG_ADDR_BG3CNT)
extern struct OamData gOamData_837DF9C[];
extern const union AnimCmd *const gDummySpriteAnimTable[];
extern const union AffineAnimCmd *const gDummySpriteAffineAnimTable[];
-extern struct Struct_unk_2019348 unk_2019348;
-extern struct TransformStatus gTransformStatuses[];
extern u16 gBattleMonPartyPositions[];
extern u16 gBattleTypeFlags;
extern u32 gTransformPersonalities[NUM_BATTLE_SLOTS];
extern u8 gBattleMonForms[NUM_BATTLE_SLOTS];
-extern u16 gUnknown_0202F7CA[];
+extern u16 gAnimSpeciesByBanks[];
extern u8 gBattleMonSprites[NUM_BATTLE_SLOTS];
-extern u8 gBattleAnimPlayerMonIndex;
-extern u8 gBattleAnimEnemyMonIndex;
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
extern s16 gBattleAnimArgs[8];
extern u8 gBanksBySide[NUM_BATTLE_SLOTS];
extern u8 gNoOfAllBanks; // gNumBattleMons?
extern struct OamMatrix gOamMatrices[];
extern struct Struct_2017810 unk_2017810[];
-extern u8 gHappinessMoveAnim;
+extern u8 gAnimFriendship;
+
+extern u8 UpdateMonIconFrame(struct Sprite *sprite);
EWRAM_DATA union AffineAnimCmd *gUnknown_0202F7D4 = NULL;
EWRAM_DATA u32 filler_0202F7D8[3] = {0};
-const struct Struct_gUnknown_0837F578 gUnknown_0837F578[][4] = {
+const struct Struct_gUnknown_0837F578 gUnknown_0837F578[][4] =
+{
{
{ 72, 80 },
{ 176, 40 },
@@ -132,14 +98,16 @@ const struct Struct_gUnknown_0837F578 gUnknown_0837F578[][4] = {
// One entry for each of the four Castform forms.
// Coords are probably front pic coords or back pic coords, but this data does not seem to be
// used during battle, party summary, or pokedex screens.
-const struct MonCoords gCastformFrontSpriteCoords[] = {
+const struct MonCoords gCastformFrontSpriteCoords[] =
+{
{ 0x44, 17 }, // NORMAL
{ 0x66, 9 }, // SUN
{ 0x46, 9 }, // RAIN
{ 0x86, 8 }, // HAIL
};
-const u8 gCastformElevations[] = {
+const u8 gCastformElevations[] =
+{
13, // NORMAL
14, // SUN
13, // RAIN
@@ -147,14 +115,16 @@ const u8 gCastformElevations[] = {
};
// Y position of the backsprite for each of the four Castform forms.
-const u8 gCastformBackSpriteYCoords[] = {
+const u8 gCastformBackSpriteYCoords[] =
+{
0, // NORMAL
0, // SUN
0, // RAIN
0, // HAIL
};
-const struct SpriteTemplate gSpriteTemplate_837F5B0[] = {
+const struct SpriteTemplate gSpriteTemplate_837F5B0[] =
+{
{
.tileTag = 55125,
.paletteTag = 55125,
@@ -163,7 +133,8 @@ const struct SpriteTemplate gSpriteTemplate_837F5B0[] = {
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy,
- }, {
+ },
+ {
.tileTag = 55126,
.paletteTag = 55126,
.oam = gOamData_837DF9C,
@@ -174,23 +145,26 @@ const struct SpriteTemplate gSpriteTemplate_837F5B0[] = {
}
};
-const struct SpriteSheet gUnknown_0837F5E0[] = {
+const struct SpriteSheet gUnknown_0837F5E0[] =
+{
{ gMiscBlank_Gfx, 0x800, 55125, },
{ gMiscBlank_Gfx, 0x800, 55126, },
};
-u8 sub_8077ABC(u8 slot, u8 a2) {
+u8 GetBankPosition(u8 slot, u8 a2)
+{
u8 var;
u16 species;
struct TransformStatus *transform;
- if (IsContest()) {
- if (a2 == 3 && slot == 3) {
+ if (IsContest())
+ {
+ if (a2 == 3 && slot == 3)
a2 = 1;
- }
}
- switch (a2) {
+ switch (a2)
+ {
case 0:
case 2:
var = gUnknown_0837F578[IS_DOUBLE_BATTLE()][GetBankIdentity(slot)].field_0;
@@ -201,819 +175,971 @@ u8 sub_8077ABC(u8 slot, u8 a2) {
case 3:
case 4:
default:
- if (IsContest()) {
- if (unk_2019348.field_4 & 1) {
- species = unk_2019348.field_2;
- } else {
- species = unk_2019348.field_0;
- }
- } else {
- if (GetBankSide(slot)) {
- transform = &gTransformStatuses[slot];
- if (!transform->species) {
+ if (IsContest())
+ {
+ if (shared19348.unk4_0)
+ species = shared19348.unk2;
+ else
+ species = shared19348.unk0;
+ }
+ else
+ {
+ if (GetBankSide(slot))
+ {
+ transform = &eTransformStatuses[slot];
+ if (!transform->species)
species = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES);
- } else {
+ else
species = transform->species;
- }
- } else {
- transform = &gTransformStatuses[slot];
- if (!transform->species) {
+ }
+ else
+ {
+ transform = &eTransformStatuses[slot];
+ if (!transform->species)
species = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES);
- } else {
+ else
species = transform->species;
- }
}
}
- if (a2 == 3) {
+ if (a2 == 3)
var = sub_8077E44(slot, species, 1);
- } else {
+ else
var = sub_8077E44(slot, species, 0);
- }
break;
}
return var;
}
-u8 sub_8077BFC(u8 slot, u16 species) {
+u8 sub_8077BFC(u8 slot, u16 species)
+{
u16 letter;
u32 personality;
struct TransformStatus *transform;
u8 ret;
u16 var;
- if (!GetBankSide(slot) || IsContest()) {
- if (species == SPECIES_UNOWN) {
- if (IsContest()) {
- if (unk_2019348.field_4 & 1) {
- personality = unk_2019348.field_10;
- } else {
- personality = unk_2019348.field_8;
- }
- } else {
- transform = &gTransformStatuses[slot];
- if (!transform->species) {
+ if (GetBankSide(slot) == 0 || IsContest())
+ {
+ if (species == SPECIES_UNOWN)
+ {
+ if (IsContest())
+ {
+ if (shared19348.unk4_0)
+ personality = shared19348.unk10;
+ else
+ personality = shared19348.unk8;
+ }
+ else
+ {
+ transform = &eTransformStatuses[slot];
+ if (!transform->species)
personality = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_PERSONALITY);
- } else {
+ else
personality = gTransformPersonalities[slot];
- }
}
letter = GET_UNOWN_LETTER(personality);
- if (!letter) {
+ if (!letter)
var = species;
- } else {
+ else
var = letter + SPECIES_UNOWN_B - 1;
- }
ret = gMonBackPicCoords[var].y_offset;
- } else if (species == SPECIES_CASTFORM) {
+ }
+ else if (species == SPECIES_CASTFORM)
+ {
ret = gCastformBackSpriteYCoords[gBattleMonForms[slot]];
- } else if (species > NUM_SPECIES) {
+ }
+ else if (species > NUM_SPECIES)
+ {
ret = gMonBackPicCoords[0].y_offset;
- } else {
+ }
+ else
+ {
ret = gMonBackPicCoords[species].y_offset;
}
- } else {
- if (species == SPECIES_UNOWN) {
- transform = &gTransformStatuses[slot];
- if (!transform->species) {
+ }
+ else
+ {
+ if (species == SPECIES_UNOWN)
+ {
+ transform = &eTransformStatuses[slot];
+ if (!transform->species)
personality = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_PERSONALITY);
- } else {
+ else
personality = gTransformPersonalities[slot];
- }
letter = GET_UNOWN_LETTER(personality);
- if (!letter) {
+ if (!letter)
var = species;
- } else {
+ else
var = letter + SPECIES_UNOWN_B - 1;
- }
ret = gMonFrontPicCoords[var].y_offset;
- } else if (species == SPECIES_CASTFORM) {
+ }
+ else if (species == SPECIES_CASTFORM)
+ {
ret = gCastformFrontSpriteCoords[gBattleMonForms[slot]].y_offset;
- } else if (species > NUM_SPECIES) {
+ }
+ else if (species > NUM_SPECIES)
+ {
ret = gMonFrontPicCoords[0].y_offset;
- } else {
+ }
+ else
+ {
ret = gMonFrontPicCoords[species].y_offset;
}
}
return ret;
}
-u8 sub_8077DD8(u8 slot, u16 species) {
+u8 sub_8077DD8(u8 slot, u16 species)
+{
u8 ret = 0;
- if (GetBankSide(slot) == 1) {
- if (!IsContest()) {
- if (species == SPECIES_CASTFORM) {
+ if (GetBankSide(slot) == 1)
+ {
+ if (!IsContest())
+ {
+ if (species == SPECIES_CASTFORM)
ret = gCastformElevations[gBattleMonForms[slot]];
- } else if (species > NUM_SPECIES) {
+ else if (species > NUM_SPECIES)
ret = gEnemyMonElevation[0];
- } else {
+ else
ret = gEnemyMonElevation[species];
- }
}
}
return ret;
}
-u8 sub_8077E44(u8 slot, u16 species, u8 a3) {
+u8 sub_8077E44(u8 slot, u16 species, u8 a3)
+{
u16 offset;
u8 y;
- if (GetBankSide(slot) == 0 || IsContest()) {
+
+ if (GetBankSide(slot) == 0 || IsContest())
+ {
offset = sub_8077BFC(slot, species);
- } else {
+ }
+ else
+ {
offset = sub_8077BFC(slot, species);
offset -= sub_8077DD8(slot, species);
}
y = offset + gUnknown_0837F578[IS_DOUBLE_BATTLE()][GetBankIdentity(slot)].field_1;
- if (a3) {
- if (GetBankSide(slot) == 0) {
+ if (a3)
+ {
+ if (GetBankSide(slot) == 0)
y += 8;
- }
- if (y > 104) y = 104;
+ if (y > 104)
+ y = 104;
}
return y;
}
-u8 sub_8077EE4(u8 slot, u8 a2) {
+u8 sub_8077EE4(u8 slot, u8 a2)
+{
u16 species;
struct TransformStatus *transform;
- if (a2 == 3 || a2 == 4) {
- if (IsContest()) {
- if (unk_2019348.field_4 & 1) {
- species = unk_2019348.field_2;
- } else {
- species = unk_2019348.field_0;
- }
- } else {
- transform = &gTransformStatuses[slot];
- if (!transform->species) {
- species = gUnknown_0202F7CA[slot];
- } else {
+ if (a2 == 3 || a2 == 4)
+ {
+ if (IsContest())
+ {
+ if (shared19348.unk4_0)
+ species = shared19348.unk2;
+ else
+ species = shared19348.unk0;
+ }
+ else
+ {
+ transform = &eTransformStatuses[slot];
+ if (!transform->species)
+ species = gAnimSpeciesByBanks[slot];
+ else
species = transform->species;
- }
}
- if (a2 == 3) {
+ if (a2 == 3)
return sub_8077E44(slot, species, 1);
- } else {
+ else
return sub_8077E44(slot, species, 0);
- }
- } else {
- return sub_8077ABC(slot, a2);
+ }
+ else
+ {
+ return GetBankPosition(slot, a2);
}
}
-u8 sub_8077F68(u8 slot) {
- return sub_8077ABC(slot, 4);
+u8 sub_8077F68(u8 slot)
+{
+ return GetBankPosition(slot, 4);
}
-u8 sub_8077F7C(u8 slot) {
+u8 sub_8077F7C(u8 slot)
+{
u16 var;
- if (GetBankSide(slot)) {
- var = sub_8077ABC(slot, 1) + 16;
- } else {
- var = sub_8077ABC(slot, 1) + 17;
- }
+ if (GetBankSide(slot) != 0)
+ var = GetBankPosition(slot, 1) + 16;
+ else
+ var = GetBankPosition(slot, 1) + 17;
return var;
}
-u8 sub_8077FC0(u8 slot) {
+u8 sub_8077FC0(u8 slot)
+{
u16 var;
u8 r6;
struct TransformStatus *transform;
- r6 = sub_8077ABC(slot, 1);
- if (!IsContest()) {
- if (GetBankSide(slot)) {
- transform = &gTransformStatuses[slot];
+
+ r6 = GetBankPosition(slot, 1);
+ if (!IsContest())
+ {
+ if (GetBankSide(slot) != 0)
+ {
+ transform = &eTransformStatuses[slot];
if (!transform->species) {
var = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES);
} else {
var = transform->species;
}
- } else {
- transform = &gTransformStatuses[slot];
- if (!transform->species) {
+ }
+ else
+ {
+ transform = &eTransformStatuses[slot];
+ if (!transform->species)
var = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES);
- } else {
+ else
var = transform->species;
- }
}
- if (GetBankSide(slot)) {
+ if (GetBankSide(slot) != 0)
r6 -= sub_8077DD8(slot, var);
- }
}
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_ATTACKER)
+ {
+ if (IsBankSpritePresent(gAnimBankAttacker))
+ {
sprites = gBattleMonSprites;
- return sprites[gBattleAnimPlayerMonIndex];
- } else {
+ return sprites[gAnimBankAttacker];
+ }
+ else
+ {
return 0xff;
}
- } else if (a1 == 1) {
- if (sub_8078874(gBattleAnimEnemyMonIndex)) {
+ }
+ else if (whichBank == ANIM_BANK_TARGET)
+ {
+ if (IsBankSpritePresent(gAnimBankTarget))
+ {
sprites = gBattleMonSprites;
- return sprites[gBattleAnimEnemyMonIndex];
- } else {
- return 0xff;
+ return sprites[gAnimBankTarget];
}
- } else if (a1 == 2) {
- if (!b_side_obj__get_some_boolean(gBattleAnimPlayerMonIndex ^ 2)) {
+ else
+ {
return 0xff;
- } else {
- return gBattleMonSprites[gBattleAnimPlayerMonIndex ^ 2];
}
- } else {
- if (b_side_obj__get_some_boolean(gBattleAnimEnemyMonIndex ^ 2)) {
- return gBattleMonSprites[gBattleAnimEnemyMonIndex ^ 2];
- } else {
+ }
+ else if (whichBank == ANIM_BANK_ATK_PARTNER)
+ {
+ if (!IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2))
+ return 0xff;
+ else
+ return gBattleMonSprites[gAnimBankAttacker ^ 2];
+ }
+ else
+ {
+ if (IsAnimBankSpriteVisible(gAnimBankTarget ^ 2))
+ return gBattleMonSprites[gAnimBankTarget ^ 2];
+ else
return 0xff;
- }
}
}
-void oamt_set_x3A_32(struct Sprite *sprite, void (*callback)(struct Sprite*)) {
- sprite->data6 = (u32)(callback) & 0xffff;
- sprite->data7 = (u32)(callback) >> 16;
+void StoreSpriteCallbackInData(struct Sprite *sprite, void (*callback)(struct Sprite*))
+{
+ sprite->data[6] = (u32)(callback) & 0xffff;
+ sprite->data[7] = (u32)(callback) >> 16;
}
-void sub_8078104(struct Sprite *sprite) {
- u32 callback = (u16)sprite->data6 | (sprite->data7 << 16);
+void SetCallbackToStoredInData(struct Sprite *sprite)
+{
+ u32 callback = (u16)sprite->data[6] | (sprite->data[7] << 16);
sprite->callback = (void (*)(struct Sprite *))callback;
}
-void sub_8078114(struct Sprite *sprite) {
- if (sprite->data3) {
- sprite->pos2.x = Sin(sprite->data0, sprite->data1);
- sprite->pos2.y = Cos(sprite->data0, sprite->data1);
- sprite->data0 += sprite->data2;
- if (sprite->data0 >= 0x100) {
- sprite->data0 -= 0x100;
- } else if (sprite->data0 < 0) {
- sprite->data0 += 0x100;
- }
- sprite->data3--;
- } else {
- sub_8078104(sprite);
+void sub_8078114(struct Sprite *sprite)
+{
+ if (sprite->data[3])
+ {
+ sprite->pos2.x = Sin(sprite->data[0], sprite->data[1]);
+ sprite->pos2.y = Cos(sprite->data[0], sprite->data[1]);
+ sprite->data[0] += sprite->data[2];
+ if (sprite->data[0] >= 0x100)
+ sprite->data[0] -= 0x100;
+ else if (sprite->data[0] < 0)
+ sprite->data[0] += 0x100;
+ sprite->data[3]--;
+ }
+ else
+ {
+ SetCallbackToStoredInData(sprite);
}
}
-void sub_8078174(struct Sprite *sprite) {
- if (sprite->data3) {
- sprite->pos2.x = Sin(sprite->data0, (sprite->data5 >> 8) + sprite->data1);
- sprite->pos2.y = Cos(sprite->data0, (sprite->data5 >> 8) + sprite->data1);
- sprite->data0 += sprite->data2;
- sprite->data5 += sprite->data4;
- if (sprite->data0 >= 0x100) {
- sprite->data0 -= 0x100;
- } else if (sprite->data0 < 0) {
- sprite->data0 += 0x100;
- }
- sprite->data3--;
- } else {
- sub_8078104(sprite);
+void sub_8078174(struct Sprite *sprite)
+{
+ if (sprite->data[3])
+ {
+ sprite->pos2.x = Sin(sprite->data[0], (sprite->data[5] >> 8) + sprite->data[1]);
+ sprite->pos2.y = Cos(sprite->data[0], (sprite->data[5] >> 8) + sprite->data[1]);
+ sprite->data[0] += sprite->data[2];
+ sprite->data[5] += sprite->data[4];
+ if (sprite->data[0] >= 0x100)
+ sprite->data[0] -= 0x100;
+ else if (sprite->data[0] < 0)
+ sprite->data[0] += 0x100;
+ sprite->data[3]--;
+ }
+ else
+ {
+ SetCallbackToStoredInData(sprite);
}
}
-void unref_sub_80781F0(struct Sprite *sprite) {
- if (sprite->data3) {
- sprite->pos2.x = Sin(sprite->data0, sprite->data1);
- sprite->pos2.y = Cos(sprite->data4, sprite->data1);
- sprite->data0 += sprite->data2;
- sprite->data4 += sprite->data5;
- if (sprite->data0 >= 0x100) {
- sprite->data0 -= 0x100;
- } else if (sprite->data0 < 0) {
- sprite->data0 += 0x100;
- }
- if (sprite->data4 >= 0x100) {
- sprite->data4 -= 0x100;
- } else if (sprite->data4 < 0) {
- sprite->data4 += 0x100;
- }
- sprite->data3--;
- } else {
- sub_8078104(sprite);
+void unref_sub_80781F0(struct Sprite *sprite)
+{
+ if (sprite->data[3])
+ {
+ sprite->pos2.x = Sin(sprite->data[0], sprite->data[1]);
+ sprite->pos2.y = Cos(sprite->data[4], sprite->data[1]);
+ sprite->data[0] += sprite->data[2];
+ sprite->data[4] += sprite->data[5];
+ if (sprite->data[0] >= 0x100)
+ sprite->data[0] -= 0x100;
+ else if (sprite->data[0] < 0)
+ sprite->data[0] += 0x100;
+ if (sprite->data[4] >= 0x100)
+ sprite->data[4] -= 0x100;
+ else if (sprite->data[4] < 0)
+ sprite->data[4] += 0x100;
+ sprite->data[3]--;
+ }
+ else
+ {
+ SetCallbackToStoredInData(sprite);
}
}
-void sub_8078278(struct Sprite *sprite) {
- if (sprite->data3) {
- sprite->pos2.x = Sin(sprite->data0, sprite->data1);
- sprite->pos2.y = Cos(sprite->data0, sprite->data4);
- sprite->data0 += sprite->data2;
- if (sprite->data0 >= 0x100) {
- sprite->data0 -= 0x100;
- } else if (sprite->data0 < 0) {
- sprite->data0 += 0x100;
- }
- sprite->data3--;
- } else {
- sub_8078104(sprite);
+void sub_8078278(struct Sprite *sprite)
+{
+ if (sprite->data[3])
+ {
+ sprite->pos2.x = Sin(sprite->data[0], sprite->data[1]);
+ sprite->pos2.y = Cos(sprite->data[0], sprite->data[4]);
+ sprite->data[0] += sprite->data[2];
+ if (sprite->data[0] >= 0x100)
+ sprite->data[0] -= 0x100;
+ else if (sprite->data[0] < 0)
+ sprite->data[0] += 0x100;
+ sprite->data[3]--;
+ }
+ else
+ {
+ SetCallbackToStoredInData(sprite);
}
}
-void sub_80782D8(struct Sprite *sprite) {
- if (sprite->data0 > 0) {
- sprite->data0--;
- } else {
- sub_8078104(sprite);
- }
+void sub_80782D8(struct Sprite *sprite)
+{
+ if (sprite->data[0] > 0)
+ sprite->data[0]--;
+ else
+ SetCallbackToStoredInData(sprite);
}
-void sub_80782F8(struct Sprite *sprite) {
+void sub_80782F8(struct Sprite *sprite)
+{
sub_8078314(sprite);
sprite->callback = sub_8078364;
sprite->callback(sprite);
}
-void sub_8078314(struct Sprite *sprite) {
+void sub_8078314(struct Sprite *sprite)
+{
s16 old;
int v1;
- if (sprite->data1 > sprite->data2) {
- sprite->data0 = -sprite->data0;
- }
- v1 = sprite->data2 - sprite->data1;
- old = sprite->data0;
- sprite->data0 = abs(v1 / sprite->data0);
- sprite->data2 = (sprite->data4 - sprite->data3) / sprite->data0;
- sprite->data1 = old;
+
+ if (sprite->data[1] > sprite->data[2])
+ sprite->data[0] = -sprite->data[0];
+ v1 = sprite->data[2] - sprite->data[1];
+ old = sprite->data[0];
+ sprite->data[0] = abs(v1 / sprite->data[0]);
+ sprite->data[2] = (sprite->data[4] - sprite->data[3]) / sprite->data[0];
+ sprite->data[1] = old;
}
-void sub_8078364(struct Sprite *sprite) {
- if (sprite->data0 > 0) {
- sprite->data0--;
- sprite->pos2.x += sprite->data1;
- sprite->pos2.y += sprite->data2;
- } else {
- sub_8078104(sprite);
+void sub_8078364(struct Sprite *sprite)
+{
+ if (sprite->data[0] > 0)
+ {
+ sprite->data[0]--;
+ sprite->pos2.x += sprite->data[1];
+ sprite->pos2.y += sprite->data[2];
+ }
+ else
+ {
+ SetCallbackToStoredInData(sprite);
}
}
-void sub_8078394(struct Sprite *sprite) {
- if (sprite->data0 > 0) {
- sprite->data0--;
- sprite->data3 += sprite->data1;
- sprite->data4 += sprite->data2;
- sprite->pos2.x = sprite->data3 >> 8;
- sprite->pos2.y = sprite->data4 >> 8;
- } else {
- sub_8078104(sprite);
+void sub_8078394(struct Sprite *sprite)
+{
+ if (sprite->data[0] > 0)
+ {
+ sprite->data[0]--;
+ sprite->data[3] += sprite->data[1];
+ sprite->data[4] += sprite->data[2];
+ sprite->pos2.x = sprite->data[3] >> 8;
+ sprite->pos2.y = sprite->data[4] >> 8;
+ }
+ else
+ {
+ SetCallbackToStoredInData(sprite);
}
}
-void sub_80783D0(struct Sprite *sprite) {
- if (sprite->data0 > 0) {
- sprite->data0--;
- sprite->data3 += sprite->data1;
- sprite->data4 += sprite->data2;
- sprite->pos2.x = sprite->data3 >> 8;
- sprite->pos2.y = sprite->data4 >> 8;
- } else {
- sub_8078104(sprite);
+void sub_80783D0(struct Sprite *sprite)
+{
+ if (sprite->data[0] > 0)
+ {
+ sprite->data[0]--;
+ sprite->data[3] += sprite->data[1];
+ sprite->data[4] += sprite->data[2];
+ sprite->pos2.x = sprite->data[3] >> 8;
+ sprite->pos2.y = sprite->data[4] >> 8;
+ }
+ else
+ {
+ SetCallbackToStoredInData(sprite);
}
UpdateMonIconFrame(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);
+void unref_sub_8078414(struct Sprite *sprite)
+{
+ sprite->data[1] = sprite->pos1.x + sprite->pos2.x;
+ sprite->data[3] = sprite->pos1.y + sprite->pos2.y;
+ sprite->data[2] = GetBankPosition(gAnimBankTarget, 2);
+ sprite->data[4] = GetBankPosition(gAnimBankTarget, 3);
sprite->callback = sub_80782F8;
}
-void sub_8078458(struct Sprite *sprite) {
- if (sprite->data0 > 0) {
- sprite->data0--;
- gSprites[sprite->data3].pos2.x += sprite->data1;
- gSprites[sprite->data3].pos2.y += sprite->data2;
- } else {
- sub_8078104(sprite);
+void sub_8078458(struct Sprite *sprite)
+{
+ if (sprite->data[0] > 0)
+ {
+ sprite->data[0]--;
+ gSprites[sprite->data[3]].pos2.x += sprite->data[1];
+ gSprites[sprite->data[3]].pos2.y += sprite->data[2];
+ }
+ else
+ {
+ SetCallbackToStoredInData(sprite);
}
}
-void sub_80784A8(struct Sprite *sprite) {
- if (sprite->data0 > 0) {
- sprite->data0--;
- sprite->data3 += sprite->data1;
- sprite->data4 += sprite->data2;
- gSprites[sprite->data5].pos2.x = sprite->data3 >> 8;
- gSprites[sprite->data5].pos2.y = sprite->data4 >> 8;
- } else {
- sub_8078104(sprite);
+void sub_80784A8(struct Sprite *sprite)
+{
+ if (sprite->data[0] > 0)
+ {
+ sprite->data[0]--;
+ sprite->data[3] += sprite->data[1];
+ sprite->data[4] += sprite->data[2];
+ gSprites[sprite->data[5]].pos2.x = sprite->data[3] >> 8;
+ gSprites[sprite->data[5]].pos2.y = sprite->data[4] >> 8;
+ }
+ else
+ {
+ SetCallbackToStoredInData(sprite);
}
}
-void sub_8078504(struct Sprite *sprite) {
- if (sprite->data0 > 0) {
- sprite->data0--;
- sprite->pos2.x = sprite->data2 >> 8;
- sprite->data2 += sprite->data1;
- sprite->pos2.y = sprite->data4 >> 8;
- sprite->data4 += sprite->data3;
- if (sprite->data0 % sprite->data5 == 0) {
- if (sprite->data5) {
+void sub_8078504(struct Sprite *sprite)
+{
+ if (sprite->data[0] > 0)
+ {
+ sprite->data[0]--;
+ sprite->pos2.x = sprite->data[2] >> 8;
+ sprite->data[2] += sprite->data[1];
+ sprite->pos2.y = sprite->data[4] >> 8;
+ sprite->data[4] += sprite->data[3];
+ if (sprite->data[0] % sprite->data[5] == 0)
+ {
+ if (sprite->data[5])
sprite->invisible ^= 1;
- }
}
- } else {
- sub_8078104(sprite);
+ }
+ else
+ {
+ SetCallbackToStoredInData(sprite);
}
}
-void move_anim_8074EE0(struct Sprite *sprite) {
+void move_anim_8074EE0(struct Sprite *sprite)
+{
FreeSpriteOamMatrix(sprite);
- move_anim_8072740(sprite);
+ DestroyAnimSprite(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);
+void unref_sub_8078588(struct Sprite *sprite)
+{
+ sprite->data[1] = sprite->pos1.x + sprite->pos2.x;
+ sprite->data[3] = sprite->pos1.y + sprite->pos2.y;
+ sprite->data[2] = GetBankPosition(gAnimBankAttacker, 2);
+ sprite->data[4] = GetBankPosition(gAnimBankAttacker, 3);
sprite->callback = sub_80782F8;
}
-void unref_sub_80785CC(struct Sprite *sprite) {
- ResetPaletteStructByUid(sprite->data5);
+void unref_sub_80785CC(struct Sprite *sprite)
+{
+ ResetPaletteStructByUid(sprite->data[5]);
move_anim_8074EE0(sprite);
}
-void sub_80785E4(struct Sprite *sprite) {
- if (sprite->affineAnimEnded) {
- sub_8078104(sprite);
- }
+void sub_80785E4(struct Sprite *sprite)
+{
+ if (sprite->affineAnimEnded)
+ SetCallbackToStoredInData(sprite);
}
-void sub_8078600(struct Sprite *sprite) {
- if (sprite->animEnded) {
- sub_8078104(sprite);
- }
+void sub_8078600(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ SetCallbackToStoredInData(sprite);
}
-void sub_807861C(struct Sprite *sprite) {
+void sub_807861C(struct Sprite *sprite)
+{
REG_BLDCNT = 0;
REG_BLDALPHA = 0;
- move_anim_8072740(sprite);
+ DestroyAnimSprite(sprite);
}
-void sub_8078634(u8 task) {
+void sub_8078634(u8 task)
+{
REG_BLDCNT = 0;
REG_BLDALPHA = 0;
DestroyAnimVisualTask(task);
}
-void sub_8078650(struct Sprite *sprite) {
- sprite->pos1.x = sub_8077ABC(gBattleAnimPlayerMonIndex, 2);
- sprite->pos1.y = sub_8077ABC(gBattleAnimPlayerMonIndex, 3);
+void sub_8078650(struct Sprite *sprite)
+{
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2);
+ sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3);
}
-void sub_807867C(struct Sprite *sprite, s16 a2) {
- u16 v1 = sub_8077ABC(gBattleAnimPlayerMonIndex, 0);
- u16 v2 = sub_8077ABC(gBattleAnimEnemyMonIndex, 0);
- if (v1 > v2) {
+void sub_807867C(struct Sprite *sprite, s16 a2)
+{
+ u16 v1 = GetBankPosition(gAnimBankAttacker, 0);
+ u16 v2 = GetBankPosition(gAnimBankTarget, 0);
+
+ if (v1 > v2)
+ {
sprite->pos1.x -= a2;
- } else if (v1 < v2) {
+ }
+ else if (v1 < v2)
+ {
sprite->pos1.x += a2;
- } else {
- if (GetBankSide(gBattleAnimPlayerMonIndex)) {
+ }
+ else
+ {
+ if (GetBankSide(gAnimBankAttacker) != 0)
sprite->pos1.x -= a2;
- } else {
+ else
sprite->pos1.x += a2;
- }
}
}
-void sub_80786EC(struct Sprite *sprite) {
- sprite->data1 = sprite->pos1.x;
- sprite->data3 = sprite->pos1.y;
+void sub_80786EC(struct Sprite *sprite)
+{
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[3] = sprite->pos1.y;
obj_translate_based_on_private_1_2_3_4(sprite);
- sprite->data6 = 0x8000 / sprite->data0;
- sprite->data7 = 0;
+ sprite->data[6] = 0x8000 / sprite->data[0];
+ sprite->data[7] = 0;
}
-bool8 sub_8078718(struct Sprite *sprite) {
- if (sub_8078B5C(sprite)) {
+bool8 sub_8078718(struct Sprite *sprite)
+{
+ if (sub_8078B5C(sprite))
return TRUE;
- }
- sprite->data7 += sprite->data6;
- sprite->pos2.y += Sin((u8)(sprite->data7 >> 8), sprite->data5);
+ sprite->data[7] += sprite->data[6];
+ sprite->pos2.y += Sin((u8)(sprite->data[7] >> 8), sprite->data[5]);
return FALSE;
}
-void oamt_add_pos2_onto_pos1(struct Sprite *sprite) {
+void oamt_add_pos2_onto_pos1(struct Sprite *sprite)
+{
sprite->pos1.x += sprite->pos2.x;
sprite->pos1.y += sprite->pos2.y;
sprite->pos2.x = 0;
sprite->pos2.y = 0;
}
-void sub_8078764(struct Sprite *sprite, u8 a2) {
- if (!a2) {
- sprite->pos1.x = sub_8077EE4(gBattleAnimEnemyMonIndex, 0);
- sprite->pos1.y = sub_8077EE4(gBattleAnimEnemyMonIndex, 1);
+void sub_8078764(struct Sprite *sprite, u8 a2)
+{
+ if (!a2)
+ {
+ sprite->pos1.x = sub_8077EE4(gAnimBankTarget, 0);
+ sprite->pos1.y = sub_8077EE4(gAnimBankTarget, 1);
}
sub_807867C(sprite, gBattleAnimArgs[0]);
sprite->pos1.y += gBattleAnimArgs[1];
}
-void sub_80787B0(struct Sprite *sprite, u8 a2) {
- if (!a2) {
- sprite->pos1.x = sub_8077EE4(gBattleAnimPlayerMonIndex, 0);
- sprite->pos1.y = sub_8077EE4(gBattleAnimPlayerMonIndex, 1);
- } else {
- sprite->pos1.x = sub_8077EE4(gBattleAnimPlayerMonIndex, 2);
- sprite->pos1.y = sub_8077EE4(gBattleAnimPlayerMonIndex, 3);
+void sub_80787B0(struct Sprite *sprite, u8 a2)
+{
+ if (!a2)
+ {
+ sprite->pos1.x = sub_8077EE4(gAnimBankAttacker, 0);
+ sprite->pos1.y = sub_8077EE4(gAnimBankAttacker, 1);
+ }
+ else
+ {
+ sprite->pos1.x = sub_8077EE4(gAnimBankAttacker, 2);
+ sprite->pos1.y = sub_8077EE4(gAnimBankAttacker, 3);
}
sub_807867C(sprite, gBattleAnimArgs[0]);
sprite->pos1.y += gBattleAnimArgs[1];
}
-u8 GetBankSide(u8 slot) {
+u8 GetBankSide(u8 slot)
+{
return gBanksBySide[slot] & 1;
}
-u8 GetBankIdentity(u8 slot) {
+u8 GetBankIdentity(u8 slot)
+{
return gBanksBySide[slot];
}
-u8 GetBankByPlayerAI(u8 slot) {
+u8 GetBankByIdentity(u8 slot)
+{
u8 i;
- for (i = 0; i < gNoOfAllBanks; i++) {
- if (gBanksBySide[i] == slot) {
+
+ for (i = 0; i < gNoOfAllBanks; i++)
+ {
+ if (gBanksBySide[i] == slot)
break;
- }
}
return i;
}
-bool8 sub_8078874(u8 slot) {
- if (IsContest()) {
- if (gBattleAnimPlayerMonIndex == slot) {
+bool8 IsBankSpritePresent(u8 slot)
+{
+ if (IsContest())
+ {
+ if (gAnimBankAttacker == slot)
return TRUE;
- }
- if (gBattleAnimEnemyMonIndex == slot) {
+ if (gAnimBankTarget == slot)
return TRUE;
- }
return FALSE;
- } else {
- if (gBanksBySide[slot] == 0xff) {
+ }
+ else
+ {
+ if (gBanksBySide[slot] == 0xff)
return FALSE;
- }
- if (GetBankSide(slot)) {
- if (GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_HP) != 0) {
+ if (GetBankSide(slot))
+ {
+ if (GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_HP) != 0)
return TRUE;
- }
- } else {
- if (GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_HP) != 0) {
+ }
+ else
+ {
+ if (GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_HP) != 0)
return TRUE;
- }
}
return FALSE;
}
}
-bool8 IsDoubleBattle() {
+bool8 IsDoubleBattle()
+{
return IS_DOUBLE_BATTLE();
}
-void sub_8078914(struct Struct_sub_8078914 *unk) {
- if (IsContest()) {
- unk->field_0 = (u8 *)0x6008000;
- unk->field_4 = (u8 *)0x600f000;
+void sub_8078914(struct Struct_sub_8078914 *unk)
+{
+ if (IsContest())
+ {
+ unk->field_0 = (u8 *)(VRAM + 0x8000);
+ unk->field_4 = (u8 *)(VRAM + 0xf000);
unk->field_8 = 0xe;
- } else {
- unk->field_0 = (u8 *)0x6004000;
- unk->field_4 = (u8 *)0x600e000;
+ }
+ else
+ {
+ unk->field_0 = (u8 *)(VRAM + 0x4000);
+ unk->field_4 = (u8 *)(VRAM + 0xe000);
unk->field_8 = 0x8;
}
}
-void sub_8078954(struct Struct_sub_8078914 *unk) {
- if (IsContest()) {
- unk->field_0 = (u8 *)0x6008000;
- unk->field_4 = (u8 *)0x600f000;
+void sub_8078954(struct Struct_sub_8078914 *unk)
+{
+ if (IsContest())
+ {
+ unk->field_0 = (u8 *)(VRAM + 0x8000);
+ unk->field_4 = (u8 *)(VRAM + 0xf000);
unk->field_8 = 0xe;
- } else if (GetBankIdentity_permutated(gBattleAnimPlayerMonIndex) == 1) {
- unk->field_0 = (u8 *)0x6004000;
- unk->field_4 = (u8 *)0x600e000;
+ }
+ else if (GetBankIdentity_permutated(gAnimBankAttacker) == 1)
+ {
+ unk->field_0 = (u8 *)(VRAM + 0x4000);
+ unk->field_4 = (u8 *)(VRAM + 0xe000);
unk->field_8 = 0x8;
- } else {
- unk->field_0 = (u8 *)0x6006000;
- unk->field_4 = (u8 *)0x600f000;
+ }
+ else
+ {
+ unk->field_0 = (u8 *)(VRAM + 0x6000);
+ unk->field_4 = (u8 *)(VRAM + 0xf000);
unk->field_8 = 0x9;
}
}
-u8 sub_80789BC() {
- if (IsContest()) {
+u8 sub_80789BC()
+{
+ if (IsContest())
return 1;
- }
return 2;
}
-void sub_80789D4(bool8 a1) {
- if (!a1) {
- BG3CNT.size = 0;
- BG3CNT.overflow = 1;
- } else if (IsContest()) {
- BG3CNT.size = 0;
- BG3CNT.overflow = 1;
- } else {
- BG3CNT.size = 1;
- BG3CNT.overflow = 0;
+void sub_80789D4(bool8 a1)
+{
+ if (!a1)
+ {
+ BG3CNT.screenSize = 0;
+ BG3CNT.areaOverflowMode = 1;
+ }
+ else if (IsContest())
+ {
+ BG3CNT.screenSize = 0;
+ BG3CNT.areaOverflowMode = 1;
+ }
+ else
+ {
+ BG3CNT.screenSize = 1;
+ BG3CNT.areaOverflowMode = 0;
}
}
-void sub_8078A34(struct Sprite *sprite) {
- sprite->data1 = sprite->pos1.x;
- sprite->data3 = sprite->pos1.y;
+void sub_8078A34(struct Sprite *sprite)
+{
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[3] = sprite->pos1.y;
sub_8078A5C(sprite);
sprite->callback = sub_80783D0;
sprite->callback(sprite);
}
-void sub_8078A5C(struct Sprite *sprite) {
- s16 x = (sprite->data2 - sprite->data1) << 8;
- s16 y = (sprite->data4 - sprite->data3) << 8;
- sprite->data1 = x / sprite->data0;
- sprite->data2 = y / sprite->data0;
- sprite->data4 = 0;
- sprite->data3 = 0;
+void sub_8078A5C(struct Sprite *sprite)
+{
+ s16 x = (sprite->data[2] - sprite->data[1]) << 8;
+ s16 y = (sprite->data[4] - sprite->data[3]) << 8;
+ sprite->data[1] = x / sprite->data[0];
+ sprite->data[2] = y / sprite->data[0];
+ sprite->data[4] = 0;
+ sprite->data[3] = 0;
}
-void obj_translate_based_on_private_1_2_3_4(struct Sprite *sprite) {
- int x = sprite->data2 - sprite->data1;
- int y = sprite->data4 - sprite->data3;
+void obj_translate_based_on_private_1_2_3_4(struct Sprite *sprite)
+{
+ int x = sprite->data[2] - sprite->data[1];
+ int y = sprite->data[4] - sprite->data[3];
bool8 r8 = x < 0;
bool8 r9 = y < 0;
u16 x2 = abs(x) << 8;
u16 y2 = abs(y) << 8;
- x2 = x2 / sprite->data0;
- y2 = y2 / sprite->data0;
- if (r8) {
+
+ x2 = x2 / sprite->data[0];
+ y2 = y2 / sprite->data[0];
+
+ if (r8)
x2 |= 1;
- } else {
+ else
x2 &= ~1;
- }
- if (r9) {
+
+ if (r9)
y2 |= 1;
- } else {
+ else
y2 &= ~1;
- }
- sprite->data1 = x2;
- sprite->data2 = y2;
- sprite->data4 = 0;
- sprite->data3 = 0;
+
+ sprite->data[1] = x2;
+ sprite->data[2] = y2;
+ sprite->data[4] = 0;
+ sprite->data[3] = 0;
}
-void sub_8078B34(struct Sprite *sprite) {
- sprite->data1 = sprite->pos1.x;
- sprite->data3 = sprite->pos1.y;
+void sub_8078B34(struct Sprite *sprite)
+{
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[3] = sprite->pos1.y;
obj_translate_based_on_private_1_2_3_4(sprite);
sprite->callback = sub_8078BB8;
sprite->callback(sprite);
}
-bool8 sub_8078B5C(struct Sprite *sprite) {
+bool8 sub_8078B5C(struct Sprite *sprite)
+{
u16 v1, v2, x, y;
- if (!sprite->data0) {
+
+ if (!sprite->data[0])
return TRUE;
- }
- v1 = sprite->data1;
- v2 = sprite->data2;
- x = sprite->data3;
- y = sprite->data4;
+
+ v1 = sprite->data[1];
+ v2 = sprite->data[2];
+ x = sprite->data[3];
+ y = sprite->data[4];
x += v1;
y += v2;
- if (v1 & 1) {
+
+ if (v1 & 1)
sprite->pos2.x = -(x >> 8);
- } else {
+ else
sprite->pos2.x = x >> 8;
- }
- if (v2 & 1) {
+
+ if (v2 & 1)
sprite->pos2.y = -(y >> 8);
- } else {
+ else
sprite->pos2.y = y >> 8;
- }
- sprite->data3 = x;
- sprite->data4 = y;
- sprite->data0--;
+
+ sprite->data[3] = x;
+ sprite->data[4] = y;
+ sprite->data[0]--;
return FALSE;
}
-void sub_8078BB8(struct Sprite *sprite) {
- if (sub_8078B5C(sprite)) {
- sub_8078104(sprite);
- }
+void sub_8078BB8(struct Sprite *sprite)
+{
+ if (sub_8078B5C(sprite))
+ SetCallbackToStoredInData(sprite);
}
-void sub_8078BD4(struct Sprite *sprite) {
- int v1 = abs(sprite->data2 - sprite->data1) << 8;
- sprite->data0 = v1 / sprite->data0;
+void sub_8078BD4(struct Sprite *sprite)
+{
+ int v1 = abs(sprite->data[2] - sprite->data[1]) << 8;
+ sprite->data[0] = v1 / sprite->data[0];
obj_translate_based_on_private_1_2_3_4(sprite);
}
-void sub_8078C00(struct Sprite *sprite) {
- sprite->data1 = sprite->pos1.x;
- sprite->data3 = sprite->pos1.y;
+void sub_8078C00(struct Sprite *sprite)
+{
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[3] = sprite->pos1.y;
sub_8078BD4(sprite);
sprite->callback = sub_8078BB8;
sprite->callback(sprite);
}
-void sub_8078C28(struct Sprite *sprite) {
- int x = sprite->data2 - sprite->data1;
- int y = sprite->data4 - sprite->data3;
+void sub_8078C28(struct Sprite *sprite)
+{
+ int x = sprite->data[2] - sprite->data[1];
+ int y = sprite->data[4] - sprite->data[3];
bool8 x_sign = x < 0;
bool8 y_sign = y < 0;
u16 x2 = abs(x) << 4;
u16 y2 = abs(y) << 4;
- x2 /= sprite->data0;
- y2 /= sprite->data0;
- if (x_sign) {
+
+ x2 /= sprite->data[0];
+ y2 /= sprite->data[0];
+
+ if (x_sign)
x2 |= 1;
- } else {
+ else
x2 &= ~1;
- }
- if (y_sign) {
+
+ if (y_sign)
y2 |= 1;
- } else {
+ else
y2 &= ~1;
- }
- sprite->data1 = x2;
- sprite->data2 = y2;
- sprite->data4 = 0;
- sprite->data3 = 0;
+
+ sprite->data[1] = x2;
+ sprite->data[2] = y2;
+ sprite->data[4] = 0;
+ sprite->data[3] = 0;
}
-void sub_8078CC0(struct Sprite *sprite) {
- sprite->data1 = sprite->pos1.x;
- sprite->data3 = sprite->pos1.y;
+void sub_8078CC0(struct Sprite *sprite)
+{
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[3] = sprite->pos1.y;
sub_8078C28(sprite);
sprite->callback = sub_8078D44;
sprite->callback(sprite);
}
-bool8 sub_8078CE8(struct Sprite *sprite) {
+bool8 sub_8078CE8(struct Sprite *sprite)
+{
u16 v1, v2, x, y;
- if (!sprite->data0) {
+
+ if (!sprite->data[0])
return TRUE;
- }
- v1 = sprite->data1;
- v2 = sprite->data2;
- x = sprite->data3;
- y = sprite->data4;
+
+ v1 = sprite->data[1];
+ v2 = sprite->data[2];
+ x = sprite->data[3];
+ y = sprite->data[4];
x += v1;
y += v2;
- if (v1 & 1) {
+
+ if (v1 & 1)
sprite->pos2.x = -(x >> 4);
- } else {
+ else
sprite->pos2.x = x >> 4;
- }
- if (v2 & 1) {
+
+ if (v2 & 1)
sprite->pos2.y = -(y >> 4);
- } else {
+ else
sprite->pos2.y = y >> 4;
- }
- sprite->data3 = x;
- sprite->data4 = y;
- sprite->data0--;
+
+ sprite->data[3] = x;
+ sprite->data[4] = y;
+ sprite->data[0]--;
return FALSE;
}
-void sub_8078D44(struct Sprite *sprite) {
- if (sub_8078CE8(sprite)) {
- sub_8078104(sprite);
- }
+void sub_8078D44(struct Sprite *sprite)
+{
+ if (sub_8078CE8(sprite))
+ SetCallbackToStoredInData(sprite);
}
-void sub_8078D60(struct Sprite *sprite) {
- int v1 = abs(sprite->data2 - sprite->data1) << 4;
- sprite->data0 = v1 / sprite->data0;
+void sub_8078D60(struct Sprite *sprite)
+{
+ int v1 = abs(sprite->data[2] - sprite->data[1]) << 4;
+ sprite->data[0] = v1 / sprite->data[0];
sub_8078C28(sprite);
}
-void sub_8078D8C(struct Sprite *sprite) {
- sprite->data1 = sprite->pos1.x;
- sprite->data3 = sprite->pos1.y;
+void sub_8078D8C(struct Sprite *sprite)
+{
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[3] = sprite->pos1.y;
sub_8078D60(sprite);
sprite->callback = sub_8078D44;
sprite->callback(sprite);
}
-void obj_id_set_rotscale(u8 sprite, s16 xScale, s16 yScale, u16 rotation) {
+void obj_id_set_rotscale(u8 sprite, s16 xScale, s16 yScale, u16 rotation)
+{
int i;
struct ObjAffineSrcData src;
struct OamMatrix matrix;
+
src.xScale = xScale;
src.yScale = yScale;
src.rotation = rotation;
- if (sub_8078E38()) {
+ if (sub_8078E38())
src.xScale = -src.xScale;
- }
i = gSprites[sprite].oam.matrixNum;
ObjAffineSet(&src, &matrix, 1, 2);
gOamMatrices[i].a = matrix.a;
@@ -1022,33 +1148,33 @@ void obj_id_set_rotscale(u8 sprite, s16 xScale, s16 yScale, u16 rotation) {
gOamMatrices[i].d = matrix.d;
}
-bool8 sub_8078E38() {
- if (IsContest()) {
- if (gSprites[obj_id_for_side_relative_to_move(0)].data2 == 0xc9 /* XXX SPECIES_UNOWN? */) {
+bool8 sub_8078E38()
+{
+ if (IsContest())
+ {
+ if (gSprites[GetAnimBankSpriteId(0)].data[2] == 0xc9 /* XXX SPECIES_UNOWN? */)
return FALSE;
- }
return TRUE;
}
return FALSE;
}
-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)) {
+void sub_8078E70(u8 sprite, u8 a2)
+{
+ u8 r7 = gSprites[sprite].data[0];
+
+ if (IsContest() || IsAnimBankSpriteVisible(r7))
gSprites[sprite].invisible = FALSE;
- }
gSprites[sprite].oam.objMode = a2;
gSprites[sprite].affineAnimPaused = TRUE;
- if (!IsContest() && !gSprites[sprite].oam.affineMode) {
- unk = &unk_2017810[r7];
- gSprites[sprite].oam.matrixNum = unk->field_6;
- }
+ if (!IsContest() && !gSprites[sprite].oam.affineMode)
+ gSprites[sprite].oam.matrixNum = ewram17810[r7].unk6;
gSprites[sprite].oam.affineMode = 3;
CalcCenterToCornerVec(&gSprites[sprite], gSprites[sprite].oam.shape, gSprites[sprite].oam.size, gSprites[sprite].oam.affineMode);
}
-void sub_8078F40(u8 sprite) {
+void sub_8078F40(u8 sprite)
+{
obj_id_set_rotscale(sprite, 0x100, 0x100, 0);
gSprites[sprite].oam.affineMode = 1;
gSprites[sprite].oam.objMode = 0;
@@ -1056,31 +1182,33 @@ void sub_8078F40(u8 sprite) {
CalcCenterToCornerVec(&gSprites[sprite], gSprites[sprite].oam.shape, gSprites[sprite].oam.size, gSprites[sprite].oam.affineMode);
}
-void sub_8078F9C(u8 sprite) {
+void sub_8078F9C(u8 sprite)
+{
u16 matrix = gSprites[sprite].oam.matrixNum;
s16 c = gOamMatrices[matrix].c;
- if (c < 0) {
+
+ if (c < 0)
c = -c;
- }
gSprites[sprite].pos2.y = c >> 3;
}
// related to obj_id_set_rotscale
-void sub_8078FDC(struct Sprite *sprite, bool8 a2, s16 xScale, s16 yScale, u16 rotation) {
+void sub_8078FDC(struct Sprite *sprite, bool8 a2, s16 xScale, s16 yScale, u16 rotation)
+{
int i;
struct ObjAffineSrcData src;
struct OamMatrix matrix;
- if (sprite->oam.affineMode & 1) {
+
+ if (sprite->oam.affineMode & 1)
+ {
sprite->affineAnimPaused = TRUE;
- if (a2) {
+ if (a2)
CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode);
- }
src.xScale = xScale;
src.yScale = yScale;
src.rotation = rotation;
- if (sub_8078E38()) {
+ if (sub_8078E38())
src.xScale = -src.xScale;
- }
i = sprite->oam.matrixNum;
ObjAffineSet(&src, &matrix, 1, 2);
gOamMatrices[i].a = matrix.a;
@@ -1090,119 +1218,138 @@ void sub_8078FDC(struct Sprite *sprite, bool8 a2, s16 xScale, s16 yScale, u16 ro
}
}
-void sub_8079098(struct Sprite *sprite) {
+void sub_8079098(struct Sprite *sprite)
+{
sub_8078FDC(sprite, TRUE, 0x100, 0x100, 0);
sprite->affineAnimPaused = FALSE;
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 sub_80790F0(s16 a, s16 b)
+{
+ u16 var = ArcTan2_(a, b);
return -var;
}
-void sub_8079108(u16 a1, bool8 a2) {
+void sub_8079108(u16 a1, bool8 a2)
+{
int i;
- struct Color *c;
- struct Color *c2;
+ struct PlttData *c;
+ struct PlttData *c2;
u16 average;
a1 *= 0x10;
- if (!a2) {
- for (i = 0; i < 0x10; i++) {
- c = (struct Color *)&gPlttBufferUnfaded[a1 + i];
+ if (!a2)
+ {
+ for (i = 0; i < 0x10; i++)
+ {
+ c = (struct PlttData *)&gPlttBufferUnfaded[a1 + i];
average = c->r + c->g + c->b;
average /= 3;
- c2 = (struct Color *)&gPlttBufferFaded[a1 + i];
+ c2 = (struct PlttData *)&gPlttBufferFaded[a1 + i];
c2->r = average;
c2->g = average;
c2->b = average;
}
- } else {
+ }
+ else
+ {
CpuCopy32(&gPlttBufferUnfaded[a1], &gPlttBufferFaded[a1], 0x20);
}
}
-u32 sub_80791A8(u8 a1, u8 a2, u8 a3, u8 a4, u8 a5, u8 a6, u8 a7) {
+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 (a1)
+ {
+ if (!IsContest())
var = 0xe;
- } else {
+ else
var = 1 << sub_80789BC();
- }
}
- if (a2) {
- shift = gBattleAnimPlayerMonIndex + 16;
+ if (a2)
+ {
+ shift = gAnimBankAttacker + 16;
var |= 1 << shift;
}
if (a3) {
- shift = gBattleAnimEnemyMonIndex + 16;
+ shift = gAnimBankTarget + 16;
var |= 1 << shift;
}
- if (a4) {
- if (b_side_obj__get_some_boolean(gBattleAnimPlayerMonIndex ^ 2)) {
- shift = (gBattleAnimPlayerMonIndex ^ 2) + 16;
+ if (a4)
+ {
+ if (IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2))
+ {
+ shift = (gAnimBankAttacker ^ 2) + 16;
var |= 1 << shift;
}
}
- if (a5) {
- if (b_side_obj__get_some_boolean(gBattleAnimEnemyMonIndex ^ 2)) {
- shift = (gBattleAnimEnemyMonIndex ^ 2) + 16;
+ if (a5)
+ {
+ if (IsAnimBankSpriteVisible(gAnimBankTarget ^ 2))
+ {
+ shift = (gAnimBankTarget ^ 2) + 16;
var |= 1 << shift;
}
}
- if (a6) {
- if (!IsContest()) {
+ if (a6)
+ {
+ if (!IsContest())
var |= 0x100;
- } else {
+ else
var |= 0x4000;
- }
}
- if (a7) {
- if (!IsContest()) {
+ if (a7)
+ {
+ if (!IsContest())
var |= 0x200;
- }
}
return var;
}
-u32 sub_80792C0(u8 a1, u8 a2, u8 a3, u8 a4) {
+u32 sub_80792C0(u8 a1, u8 a2, u8 a3, u8 a4)
+{
u32 var = 0;
u32 shift;
- if (IsContest()) {
- if (a1) {
+
+ if (IsContest())
+ {
+ if (a1)
+ {
var |= 1 << 18;
return var;
}
} else {
if (a1) {
- if (b_side_obj__get_some_boolean(GetBankByPlayerAI(0))) {
- var |= 1 << (GetBankByPlayerAI(0) + 16);
+ if (IsAnimBankSpriteVisible(GetBankByIdentity(0))) {
+ var |= 1 << (GetBankByIdentity(0) + 16);
}
}
if (a2) {
- if (b_side_obj__get_some_boolean(GetBankByPlayerAI(2))) {
- shift = GetBankByPlayerAI(2) + 16;
+ if (IsAnimBankSpriteVisible(GetBankByIdentity(2))) {
+ shift = GetBankByIdentity(2) + 16;
var |= 1 << shift;
}
}
if (a3) {
- if (b_side_obj__get_some_boolean(GetBankByPlayerAI(1))) {
- shift = GetBankByPlayerAI(1) + 16;
+ if (IsAnimBankSpriteVisible(GetBankByIdentity(1))) {
+ shift = GetBankByIdentity(1) + 16;
var |= 1 << shift;
}
}
if (a4) {
- if (b_side_obj__get_some_boolean(GetBankByPlayerAI(3))) {
- shift = GetBankByPlayerAI(3) + 16;
+ if (IsAnimBankSpriteVisible(GetBankByIdentity(3))) {
+ shift = GetBankByIdentity(3) + 16;
var |= 1 << shift;
}
}
@@ -1210,141 +1357,158 @@ u32 sub_80792C0(u8 a1, u8 a2, u8 a3, u8 a4) {
return var;
}
-u8 sub_80793A8(u8 a1) {
+u8 sub_80793A8(u8 a1)
+{
return a1;
}
-u8 unref_sub_80793B0(u8 a1) {
- return GetBankByPlayerAI(a1);
+u8 unref_sub_80793B0(u8 a1)
+{
+ return GetBankByIdentity(a1);
}
-void sub_80793C4(struct Sprite *sprite) {
+void sub_80793C4(struct Sprite *sprite)
+{
bool8 var;
- if (!sprite->data0) {
- if (!gBattleAnimArgs[3]) {
+
+ if (!sprite->data[0])
+ {
+ if (!gBattleAnimArgs[3])
var = TRUE;
- } else {
+ else
var = FALSE;
- }
- if (!gBattleAnimArgs[2]) {
+ if (!gBattleAnimArgs[2])
sub_80787B0(sprite, var);
- } else {
+ else
sub_8078764(sprite, var);
- }
- sprite->data0++;
+ sprite->data[0]++;
- } else if (sprite->animEnded || sprite->affineAnimEnded) {
+ }
+ else if (sprite->animEnded || sprite->affineAnimEnded)
+ {
move_anim_8074EE0(sprite);
}
}
-void sub_807941C(struct Sprite *sprite) {
+void sub_807941C(struct Sprite *sprite)
+{
bool8 v1;
u8 v2;
- if (!(gBattleAnimArgs[5] & 0xff00)) {
+
+ if (!(gBattleAnimArgs[5] & 0xff00))
v1 = TRUE;
- } else {
+ else
v1 = FALSE;
- }
- if (!(gBattleAnimArgs[5] & 0xff)) {
+
+ if (!(gBattleAnimArgs[5] & 0xff))
v2 = 3;
- } else {
+ else
v2 = 1;
- }
+
sub_80787B0(sprite, v1);
- if (GetBankSide(gBattleAnimPlayerMonIndex)) {
+ if (GetBankSide(gAnimBankAttacker))
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->data[0] = gBattleAnimArgs[4];
+ sprite->data[2] = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[2];
+ sprite->data[4] = GetBankPosition(gAnimBankTarget, v2) + gBattleAnimArgs[3];
sprite->callback = sub_8078B34;
- oamt_set_x3A_32(sprite, move_anim_8072740);
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
}
-void sub_80794A8(struct Sprite *sprite) {
+void sub_80794A8(struct Sprite *sprite)
+{
sub_80787B0(sprite, 1);
- if (GetBankSide(gBattleAnimPlayerMonIndex)) {
+ if (GetBankSide(gAnimBankAttacker))
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->data5 = gBattleAnimArgs[5];
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[2] = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[2];
+ sprite->data[4] = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[3];
+ sprite->data[5] = gBattleAnimArgs[5];
sub_80786EC(sprite);
sprite->callback = sub_8079518;
}
-void sub_8079518(struct Sprite *sprite) {
- if (sub_8078718(sprite)) {
- move_anim_8072740(sprite);
- }
+void sub_8079518(struct Sprite *sprite)
+{
+ if (sub_8078718(sprite))
+ DestroyAnimSprite(sprite);
}
-void sub_8079534(struct Sprite *sprite) {
+void sub_8079534(struct Sprite *sprite)
+{
u8 r4, slot, r7;
- if (!gBattleAnimArgs[6]) {
+
+ if (!gBattleAnimArgs[6])
+ {
r4 = 1;
r7 = 3;
- } else {
+ }
+ else
+ {
r4 = 0;
r7 = 1;
}
- if (!gBattleAnimArgs[5]) {
+ if (!gBattleAnimArgs[5])
+ {
sub_80787B0(sprite, r4);
- slot = gBattleAnimPlayerMonIndex;
- } else {
+ slot = gAnimBankAttacker;
+ }
+ else
+ {
sub_8078764(sprite, r4);
- slot = gBattleAnimEnemyMonIndex;
+ slot = gAnimBankTarget;
}
- if (GetBankSide(gBattleAnimPlayerMonIndex)) {
+ if (GetBankSide(gAnimBankAttacker))
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
- }
sub_8078764(sprite, r4);
- sprite->data0 = gBattleAnimArgs[4];
- sprite->data2 = sub_8077ABC(slot, 2) + gBattleAnimArgs[2];
- sprite->data4 = sub_8077ABC(slot, r7) + gBattleAnimArgs[3];
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[2] = GetBankPosition(slot, 2) + gBattleAnimArgs[2];
+ sprite->data[4] = GetBankPosition(slot, r7) + gBattleAnimArgs[3];
sprite->callback = sub_8078B34;
- oamt_set_x3A_32(sprite, move_anim_8072740);
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
}
-s16 duplicate_obj_of_side_rel2move_in_transparent_mode(u8 a1) {
+s16 duplicate_obj_of_side_rel2move_in_transparent_mode(u8 a1)
+{
u16 i;
- u8 sprite = obj_id_for_side_relative_to_move(a1);
- if (sprite != 0xff) {
- for (i = 0; i < 0x40; i++) {
- if (gSprites[i].inUse) {
- continue;
+ u8 sprite = GetAnimBankSpriteId(a1);
+
+ if (sprite != 0xff)
+ {
+ for (i = 0; i < 0x40; i++)
+ {
+ if (!gSprites[i].inUse)
+ {
+ gSprites[i] = gSprites[sprite];
+ gSprites[i].oam.objMode = 1;
+ gSprites[i].invisible = FALSE;
+ return i;
}
- gSprites[i] = gSprites[sprite];
- gSprites[i].oam.objMode = 1;
- gSprites[i].invisible = FALSE;
- return i;
}
}
return -1;
}
-void obj_delete_but_dont_free_vram(struct Sprite *sprite) {
+void obj_delete_but_dont_free_vram(struct Sprite *sprite)
+{
sprite->usingSheet = TRUE;
DestroySprite(sprite);
}
-void sub_8079670(u8 task) {
+void sub_8079670(u8 task)
+{
s16 v1 = 0;
s16 v2 = 0;
- if (gBattleAnimArgs[2] > gBattleAnimArgs[0]) {
+
+ if (gBattleAnimArgs[2] > gBattleAnimArgs[0])
v2 = 1;
- }
- if (gBattleAnimArgs[2] < gBattleAnimArgs[0]) {
+ if (gBattleAnimArgs[2] < gBattleAnimArgs[0])
v2 = -1;
- }
- if (gBattleAnimArgs[3] > gBattleAnimArgs[1]) {
+ if (gBattleAnimArgs[3] > gBattleAnimArgs[1])
v1 = 1;
- }
- if (gBattleAnimArgs[3] < gBattleAnimArgs[1]) {
+ if (gBattleAnimArgs[3] < gBattleAnimArgs[1])
v1 = -1;
- }
+
gTasks[task].data[0] = 0;
gTasks[task].data[1] = gBattleAnimArgs[4];
gTasks[task].data[2] = 0;
@@ -1358,30 +1522,38 @@ void sub_8079670(u8 task) {
gTasks[task].func = sub_80796F8;
}
-void sub_80796F8(u8 taskId) {
+void sub_80796F8(u8 taskId)
+{
struct Task *task = &gTasks[taskId];
- if (++task->data[0] > task->data[1]) {
+
+ if (++task->data[0] > task->data[1])
+ {
task->data[0] = 0;
- if (++task->data[2] & 1) {
- if (task->data[3] != task->data[7]) {
+ if (++task->data[2] & 1)
+ {
+ if (task->data[3] != task->data[7])
task->data[3] += task->data[5];
- }
- } else {
- if (task->data[4] != task->data[8]) {
+ }
+ else
+ {
+ if (task->data[4] != task->data[8])
task->data[4] += task->data[6];
- }
}
REG_BLDALPHA = (task->data[4] << 8) | task->data[3];
- if (task->data[3] == task->data[7] && task->data[4] == task->data[8]) {
+ if (task->data[3] == task->data[7] && task->data[4] == task->data[8])
+ {
DestroyAnimVisualTask(taskId);
return;
}
}
}
-void sub_8079790(u8 task) {
- u8 sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]);
- if (sprite == 0xff) {
+void sub_8079790(u8 task)
+{
+ u8 sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]);
+
+ if (sprite == 0xff)
+ {
DestroyAnimVisualTask(task);
return;
}
@@ -1389,7 +1561,8 @@ void sub_8079790(u8 task) {
sub_80797EC(&gTasks[task]);
}
-void sub_80797EC(struct Task *task) {
+void sub_80797EC(struct Task *task)
+{
task->data[1] = gBattleAnimArgs[1];
task->data[2] = 0;
task->data[3] = gBattleAnimArgs[2];
@@ -1400,24 +1573,33 @@ void sub_80797EC(struct Task *task) {
task->func = sub_8079814;
}
-void sub_8079814(u8 taskId) {
+void sub_8079814(u8 taskId)
+{
struct Task *task = &gTasks[taskId];
- if (++task->data[4] >= task->data[5]) {
+
+ if (++task->data[4] >= task->data[5])
+ {
task->data[4] = 0;
- if (!task->data[6]) {
+ if (!task->data[6])
+ {
task->data[2]++;
BlendPalette(task->data[0], 0xf, task->data[2], task->data[1]);
- if (task->data[2] == task->data[3]) {
+ if (task->data[2] == task->data[3])
task->data[6] = 1;
- }
- } else {
+ }
+ else
+ {
task->data[2]--;
BlendPalette(task->data[0], 0xf, task->data[2], task->data[1]);
- if (!task->data[2]) {
- if (--task->data[7]) {
+ if (!task->data[2])
+ {
+ if (--task->data[7])
+ {
task->data[4] = 0;
task->data[6] = 0;
- } else {
+ }
+ else
+ {
DestroyAnimVisualTask(taskId);
return;
}
@@ -1426,9 +1608,12 @@ void sub_8079814(u8 taskId) {
}
}
-void sub_80798AC(u8 task) {
+void sub_80798AC(u8 task)
+{
u8 palette = IndexOfSpritePaletteTag(gBattleAnimArgs[0]);
- if (palette == 0xff) {
+
+ if (palette == 0xff)
+ {
DestroyAnimVisualTask(task);
return;
}
@@ -1436,7 +1621,8 @@ void sub_80798AC(u8 task) {
sub_80797EC(&gTasks[task]);
}
-void sub_80798F4(struct Task *task, u8 a2, void *a3) {
+void sub_80798F4(struct Task *task, u8 a2, const void *a3)
+{
task->data[7] = 0;
task->data[8] = 0;
task->data[9] = 0;
@@ -1448,11 +1634,14 @@ void sub_80798F4(struct Task *task, u8 a2, void *a3) {
sub_8078E70(a2, 0);
}
-bool8 sub_807992C(struct Task *task) {
+bool8 sub_807992C(struct Task *task)
+{
gUnknown_0202F7D4 = sub_8079BFC(task->data[13], task->data[14]) + (task->data[7] << 3);
- switch (gUnknown_0202F7D4->type) {
+ switch (gUnknown_0202F7D4->type)
+ {
default:
- if (!gUnknown_0202F7D4->frame.duration) {
+ if (!gUnknown_0202F7D4->frame.duration)
+ {
task->data[10] = gUnknown_0202F7D4->frame.xScale;
task->data[11] = gUnknown_0202F7D4->frame.yScale;
task->data[12] = gUnknown_0202F7D4->frame.rotation;
@@ -1464,44 +1653,49 @@ bool8 sub_807992C(struct Task *task) {
task->data[12] += gUnknown_0202F7D4->frame.rotation;
obj_id_set_rotscale(task->data[15], task->data[10], task->data[11], task->data[12]);
sub_8079A64(task->data[15]);
- if (++task->data[8] >= gUnknown_0202F7D4->frame.duration) {
+ if (++task->data[8] >= gUnknown_0202F7D4->frame.duration)
+ {
task->data[8] = 0;
task->data[7]++;
}
break;
-
case AFFINEANIMCMDTYPE_JUMP:
task->data[7] = gUnknown_0202F7D4->jump.target;
break;
-
case AFFINEANIMCMDTYPE_LOOP:
- if (gUnknown_0202F7D4->loop.count) {
- if (task->data[9]) {
- if (!--task->data[9]) {
+ if (gUnknown_0202F7D4->loop.count)
+ {
+ if (task->data[9])
+ {
+ if (!--task->data[9])
+ {
task->data[7]++;
break;
}
- } else {
+ }
+ else
+ {
task->data[9] = gUnknown_0202F7D4->loop.count;
}
- if (!task->data[7]) {
+ if (!task->data[7])
+ {
break;
}
- for (;;) {
+ for (;;)
+ {
task->data[7]--;
gUnknown_0202F7D4--;
- if (gUnknown_0202F7D4->type == AFFINEANIMCMDTYPE_LOOP) {
+ if (gUnknown_0202F7D4->type == AFFINEANIMCMDTYPE_LOOP)
+ {
task->data[7]++;
return TRUE;
}
- if (!task->data[7]) {
+ if (!task->data[7])
return TRUE;
- }
}
}
task->data[7]++;
break;
-
case 0x7fff:
gSprites[task->data[15]].pos2.y = 0;
sub_8078F40(task->data[15]);
@@ -1511,52 +1705,62 @@ bool8 sub_807992C(struct Task *task) {
return TRUE;
}
-void sub_8079A64(u8 sprite) {
+void sub_8079A64(u8 sprite)
+{
int var = 0x40 - sub_8079B10(sprite) * 2;
u16 matrix = gSprites[sprite].oam.matrixNum;
int var2 = (var << 8) / gOamMatrices[matrix].d;
- if (var2 > 0x80) {
+
+ if (var2 > 0x80)
var2 = 0x80;
- }
gSprites[sprite].pos2.y = (var - var2) / 2;
}
-void sub_8079AB8(u8 sprite, u8 sprite2) {
+void sub_8079AB8(u8 sprite, u8 sprite2)
+{
int var = 0x40 - sub_8079B10(sprite2) * 2;
u16 matrix = gSprites[sprite].oam.matrixNum;
int var2 = (var << 8) / gOamMatrices[matrix].d;
- if (var2 > 0x80) {
+
+ if (var2 > 0x80)
var2 = 0x80;
- }
gSprites[sprite].pos2.y = (var - var2) / 2;
}
-u16 sub_8079B10(u8 sprite) {
+u16 sub_8079B10(u8 sprite)
+{
struct TransformStatus *transform;
- u8 slot = gSprites[sprite].data0;
+ u8 slot = gSprites[sprite].data[0];
u16 species;
u16 i;
- for (i = 0; i < (sizeof(gBattleMonSprites) / sizeof(u8)); i++) {
- if (gBattleMonSprites[i] == sprite) {
- if (IsContest()) {
- species = unk_2019348.field_0;
+
+ for (i = 0; i < (sizeof(gBattleMonSprites) / sizeof(u8)); i++)
+ {
+ if (gBattleMonSprites[i] == sprite)
+ {
+ if (IsContest())
+ {
+ species = shared19348.unk0;
return gMonBackPicCoords[species].y_offset;
- } else {
- if (!GetBankSide(i)) {
- transform = &gTransformStatuses[slot];
- if (!transform->species) {
+ }
+ else
+ {
+ if (!GetBankSide(i))
+ {
+ transform = &eTransformStatuses[slot];
+ if (!transform->species)
species = GetMonData(&gPlayerParty[gBattleMonPartyPositions[i]], MON_DATA_SPECIES);
- } else {
+ else
species = transform->species;
- }
return gMonBackPicCoords[species].y_offset;
- } else {
- transform = &gTransformStatuses[slot];
- if (!transform->species) {
+ }
+ else
+ {
+ transform = &eTransformStatuses[slot];
+ if (!transform->species)
species = GetMonData(&gEnemyParty[gBattleMonPartyPositions[i]], MON_DATA_SPECIES);
- } else {
+ else
species = transform->species;
- }
return gMonFrontPicCoords[species].y_offset;
}
}
@@ -1565,21 +1769,24 @@ u16 sub_8079B10(u8 sprite) {
return 0x40;
}
-void sub_8079BF4(s16 *bottom, s16 *top, void *ptr) {
+void sub_8079BF4(s16 *bottom, s16 *top, const void *ptr)
+{
*bottom = ((intptr_t) ptr) & 0xffff;
*top = (((intptr_t) ptr) >> 16) & 0xffff;
}
-void *sub_8079BFC(s16 bottom, s16 top) {
+void *sub_8079BFC(s16 bottom, s16 top)
+{
return (void *)((u16)bottom | ((u16)top << 16));
}
// possible new file
-void sub_8079C08(struct Task *task, u8 a2, s16 a3, s16 a4, s16 a5, s16 a6, u16 a7) {
+void sub_8079C08(struct Task *task, u8 a2, s16 a3, s16 a4, s16 a5, s16 a6, u16 a7)
+{
task->data[8] = a7;
- task->data[15] = a2;
+ task->data[15] = a2; // spriteId
task->data[9] = a3;
task->data[10] = a4;
task->data[13] = a5;
@@ -1588,125 +1795,134 @@ void sub_8079C08(struct Task *task, u8 a2, s16 a3, s16 a4, s16 a5, s16 a6, u16 a
task->data[12] = (a6 - a4) / a7;
}
-u8 sub_8079C74(struct Task *task) {
- if (!task->data[8]) {
+u8 sub_8079C74(struct Task *task)
+{
+ if (!task->data[8])
return 0;
- }
- if (--task->data[8]) {
+
+ if (--task->data[8] != 0)
+ {
task->data[9] += task->data[11];
task->data[10] += task->data[12];
- } else {
+ }
+ else
+ {
task->data[9] = task->data[13];
task->data[10] = task->data[14];
}
obj_id_set_rotscale(task->data[15], task->data[9], task->data[10], 0);
- if (task->data[8]) {
+ if (task->data[8])
sub_8079A64(task->data[15]);
- } else {
+ else
gSprites[task->data[15]].pos2.y = 0;
- }
return task->data[8];
}
-void sub_8079CEC(u8 task) {
+void sub_8079CEC(u8 task)
+{
u16 v1;
- if (gHappinessMoveAnim <= 30) {
+
+ if (gAnimFriendship <= 30)
v1 = 0;
- } else if (gHappinessMoveAnim <= 100) {
+ else if (gAnimFriendship <= 100)
v1 = 1;
- } else if (gHappinessMoveAnim <= 200) {
+ else if (gAnimFriendship <= 200)
v1 = 2;
- } else {
+ else
v1 = 3;
- }
gBattleAnimArgs[7] = v1;
DestroyAnimVisualTask(task);
}
-void unref_sub_8079D20(u8 priority) {
- if (b_side_obj__get_some_boolean(gBattleAnimEnemyMonIndex)) {
- gSprites[gBattleMonSprites[gBattleAnimEnemyMonIndex]].oam.priority = priority;
- }
- if (b_side_obj__get_some_boolean(gBattleAnimPlayerMonIndex)) {
- gSprites[gBattleMonSprites[gBattleAnimPlayerMonIndex]].oam.priority = priority;
- }
- if (b_side_obj__get_some_boolean(gBattleAnimEnemyMonIndex ^ 2)) {
- gSprites[gBattleMonSprites[gBattleAnimEnemyMonIndex ^ 2]].oam.priority = priority;
- }
- if (b_side_obj__get_some_boolean(gBattleAnimPlayerMonIndex ^ 2)) {
- gSprites[gBattleMonSprites[gBattleAnimPlayerMonIndex ^ 2]].oam.priority = priority;
- }
+void unref_sub_8079D20(u8 priority)
+{
+ if (IsAnimBankSpriteVisible(gAnimBankTarget))
+ gSprites[gBattleMonSprites[gAnimBankTarget]].oam.priority = priority;
+ if (IsAnimBankSpriteVisible(gAnimBankAttacker))
+ gSprites[gBattleMonSprites[gAnimBankAttacker]].oam.priority = priority;
+ if (IsAnimBankSpriteVisible(gAnimBankTarget ^ 2))
+ gSprites[gBattleMonSprites[gAnimBankTarget ^ 2]].oam.priority = priority;
+ if (IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2))
+ gSprites[gBattleMonSprites[gAnimBankAttacker ^ 2]].oam.priority = priority;
}
-void sub_8079E24() {
+void sub_8079E24()
+{
int i;
- for (i = 0; i < gNoOfAllBanks; i++) {
- if (b_side_obj__get_some_boolean(i)) {
+
+ for (i = 0; i < gNoOfAllBanks; i++)
+ {
+ if (IsAnimBankSpriteVisible(i))
+ {
gSprites[gBattleMonSprites[i]].subpriority = sub_8079E90(i);
gSprites[gBattleMonSprites[i]].oam.priority = 2;
}
}
}
-u8 sub_8079E90(u8 slot) {
+u8 sub_8079E90(u8 slot)
+{
u8 status;
u8 ret;
- if (IsContest()) {
- if (slot == 2) {
+
+ if (IsContest())
+ {
+ if (slot == 2)
return 30;
- } else {
+ else
return 40;
- }
- } else {
+ }
+ else
+ {
status = GetBankIdentity(slot);
- if (status == 0) {
+ if (status == 0)
ret = 30;
- } else if (status == 2) {
+ else if (status == 2)
ret = 20;
- } else if (status == 1) {
+ else if (status == 1)
ret = 40;
- } else {
+ else
ret = 50;
- }
}
return ret;
}
-u8 sub_8079ED4(u8 slot) {
+u8 sub_8079ED4(u8 slot)
+{
u8 status = GetBankIdentity(slot);
- if (IsContest()) {
+
+ if (IsContest())
return 2;
- }
- if (status == 0 || status == 3) {
+ if (status == 0 || status == 3)
return BG2CNT.priority;
- } else {
+ else
return BG1CNT.priority;
- }
}
-u8 GetBankIdentity_permutated(u8 slot) {
+u8 GetBankIdentity_permutated(u8 slot)
+{
u8 status;
- if (!IsContest()) {
+
+ if (!IsContest())
+ {
status = GetBankIdentity(slot);
- if (status == 0 || status == 3) {
+ if (status == 0 || status == 3)
return 2;
- } else {
+ else
return 1;
- }
}
return 1;
}
-u8 sub_8079F44(u16 species, u8 isBackpic, u8 a3, s16 a4, s16 a5, u8 a6, u32 a7, u32 a8) {
- void *src;
- void *dest;
- int size;
-
+u8 sub_8079F44(u16 species, u8 isBackpic, u8 a3, s16 a4, s16 a5, u8 a6, u32 a7, u32 a8)
+{
u8 sprite;
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);
+
+ if (!isBackpic)
+ {
+ LoadCompressedPalette(GetMonSpritePalFromOtIdPersonality(species, a8, a7), (palette * 0x10) + 0x100, 0x20);
LoadSpecialPokePic(
&gMonFrontPicTable[species],
gMonFrontPicCoords[species].coords,
@@ -1717,9 +1933,10 @@ u8 sub_8079F44(u16 species, u8 isBackpic, u8 a3, s16 a4, s16 a5, u8 a6, u32 a7,
a7,
1
);
- } else {
- LoadCompressedPalette(
- species_and_otid_get_pal(species, a8, a7), (palette * 0x10) + 0x100, 0x20);
+ }
+ else
+ {
+ LoadCompressedPalette(GetMonSpritePalFromOtIdPersonality(species, a8, a7), (palette * 0x10) + 0x100, 0x20);
LoadSpecialPokePic(
&gMonBackPicTable[species],
gMonBackPicCoords[species].coords,
@@ -1732,28 +1949,28 @@ u8 sub_8079F44(u16 species, u8 isBackpic, u8 a3, s16 a4, s16 a5, u8 a6, u32 a7,
);
}
- src = (void *)0x2000000;
- dest = (void *)(0x6010000 + (sheet * 0x20));
- size = 0x800;
- DmaCopy32(3, src, dest, size);
+ DmaCopy32Defvars(3, (void *)0x2000000, (void *)(VRAM + 0x10000 + (sheet * 0x20)), 0x800);
- if (!isBackpic) {
+ if (!isBackpic)
sprite = CreateSprite(&gSpriteTemplate_837F5B0[a3], a4, a5 + gMonFrontPicCoords[species].y_offset, a6);
- } else {
+ else
sprite = CreateSprite(&gSpriteTemplate_837F5B0[a3], a4, a5 + gMonBackPicCoords[species].y_offset, a6);
- }
- if (IsContest()) {
- gSprites[sprite].affineAnims = &gSpriteAffineAnimTable_81E7C18;
+
+ if (IsContest())
+ {
+ gSprites[sprite].affineAnims = gSpriteAffineAnimTable_81E7C18;
StartSpriteAffineAnim(&gSprites[sprite], 0);
}
return sprite;
}
-void sub_807A0F4(struct Sprite *sprite) {
+void sub_807A0F4(struct Sprite *sprite)
+{
DestroySpriteAndFreeResources(sprite);
}
-int sub_807A100(u8 slot, u8 a2) {
+int sub_807A100(u8 slot, u8 a2)
+{
u16 species;
u32 personality;
u16 letter;
@@ -1761,117 +1978,158 @@ int sub_807A100(u8 slot, u8 a2) {
int ret;
const struct MonCoords *coords;
struct TransformStatus *transform;
- if (IsContest()) {
- if (unk_2019348.field_4 & 1) {
- species = unk_2019348.field_2;
- personality = unk_2019348.field_10;
- } else {
- species = unk_2019348.field_0;
- personality = unk_2019348.field_8;
+
+ if (IsContest())
+ {
+ if (shared19348.unk4_0)
+ {
+ species = shared19348.unk2;
+ personality = shared19348.unk10;
}
- if (species == SPECIES_UNOWN) {
+ else
+ {
+ species = shared19348.unk0;
+ personality = shared19348.unk8;
+ }
+ if (species == SPECIES_UNOWN)
+ {
letter = GET_UNOWN_LETTER(personality);
- if (!letter) {
+ if (!letter)
var = SPECIES_UNOWN;
- } else {
+ else
var = letter + SPECIES_UNOWN_B - 1;
- }
coords = &gMonBackPicCoords[var];
- } else if (species == SPECIES_CASTFORM) {
+ }
+ else if (species == SPECIES_CASTFORM)
+ {
coords = &gCastformFrontSpriteCoords[gBattleMonForms[slot]];
- } else if (species <= SPECIES_EGG) {
+ }
+ else if (species <= SPECIES_EGG)
+ {
coords = &gMonBackPicCoords[species];
- } else {
+ }
+ else
+ {
coords = &gMonBackPicCoords[0];
}
- } else {
- if (!GetBankSide(slot)) {
- transform = &gTransformStatuses[slot];
- if (!transform->species) {
+ }
+ else
+ {
+ if (!GetBankSide(slot))
+ {
+ transform = &eTransformStatuses[slot];
+ if (!transform->species)
+ {
species = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES);
personality = GetMonData(&gPlayerParty[gBattleMonPartyPositions[slot]], MON_DATA_PERSONALITY);
- } else {
+ }
+ else
+ {
species = transform->species;
personality = gTransformPersonalities[slot];
}
- if (species == SPECIES_UNOWN) {
+ if (species == SPECIES_UNOWN)
+ {
letter = GET_UNOWN_LETTER(personality);
- if (!letter) {
+ if (!letter)
var = SPECIES_UNOWN;
- } else {
+ else
var = letter + SPECIES_UNOWN_B - 1;
- }
coords = &gMonBackPicCoords[var];
- } else if (species > SPECIES_EGG) {
+ }
+ else if (species > SPECIES_EGG)
+ {
coords = &gMonBackPicCoords[0];
- } else {
+ }
+ else
+ {
coords = &gMonBackPicCoords[species];
}
- } else {
- transform = &gTransformStatuses[slot];
- if (!transform->species) {
+ }
+ else
+ {
+ transform = &eTransformStatuses[slot];
+ if (!transform->species)
+ {
species = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_SPECIES);
personality = GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_PERSONALITY);
- } else {
+ }
+ else
+ {
species = transform->species;
personality = gTransformPersonalities[slot];
}
- if (species == SPECIES_UNOWN) {
+ if (species == SPECIES_UNOWN)
+ {
letter = GET_UNOWN_LETTER(personality);
- if (!letter) {
+ if (!letter)
var = SPECIES_UNOWN;
- } else {
+ else
var = letter + SPECIES_UNOWN_B - 1;
- }
coords = &gMonFrontPicCoords[var];
- } else if (species == SPECIES_CASTFORM) {
+ }
+ else if (species == SPECIES_CASTFORM)
+ {
coords = &gCastformFrontSpriteCoords[gBattleMonForms[slot]];
- } else if (species > SPECIES_EGG) {
+ }
+ else if (species > SPECIES_EGG)
+ {
coords = &gMonFrontPicCoords[0];
- } else {
+ }
+ else
+ {
coords = &gMonFrontPicCoords[species];
}
}
}
- switch (a2) {
+ switch (a2)
+ {
case 0:
return (coords->coords & 0xf) * 8;
case 1:
return (coords->coords >> 4) * 8;
case 4:
- return sub_8077ABC(slot, 2) - ((coords->coords >> 4) * 4);
+ return GetBankPosition(slot, 2) - ((coords->coords >> 4) * 4);
case 5:
- return sub_8077ABC(slot, 2) + ((coords->coords >> 4) * 4);
+ return GetBankPosition(slot, 2) + ((coords->coords >> 4) * 4);
case 2:
- return sub_8077ABC(slot, 3) - ((coords->coords & 0xf) * 4);
+ return GetBankPosition(slot, 3) - ((coords->coords & 0xf) * 4);
case 3:
- return sub_8077ABC(slot, 3) + ((coords->coords & 0xf) * 4);
+ return GetBankPosition(slot, 3) + ((coords->coords & 0xf) * 4);
case 6:
- ret = sub_8077ABC(slot, 1) + 0x1f;
+ ret = GetBankPosition(slot, 1) + 0x1f;
return ret - coords->y_offset;
default:
return 0;
}
}
-void sub_807A3FC(u8 slot, u8 a2, s16 *a3, s16 *a4) {
+void sub_807A3FC(u8 slot, u8 a2, s16 *a3, s16 *a4)
+{
u8 v1, v2;
s16 v3, v4;
s16 v5, v6;
- if (!a2) {
+
+ if (!a2)
+ {
v1 = 0;
v2 = 1;
- } else {
+ }
+ else
+ {
v1 = 2;
v2 = 3;
}
- v3 = sub_8077ABC(slot, v1);
- v4 = sub_8077ABC(slot, v2);
- if (IsDoubleBattle() && !IsContest()) {
- v5 = sub_8077ABC(slot ^ 2, v1);
- v6 = sub_8077ABC(slot ^ 2, v2);
- } else {
+ v3 = GetBankPosition(slot, v1);
+ v4 = GetBankPosition(slot, v2);
+ if (IsDoubleBattle() && !IsContest())
+ {
+ v5 = GetBankPosition(slot ^ 2, v1);
+ v6 = GetBankPosition(slot ^ 2, v2);
+ }
+ else
+ {
v5 = v3;
v6 = v4;
}
@@ -1879,7 +2137,8 @@ void sub_807A3FC(u8 slot, u8 a2, s16 *a3, s16 *a4) {
*a4 = (v4 + v6) / 2;
}
-u8 sub_807A4A0(int a1, u8 sprite, int a3) {
+u8 sub_807A4A0(int a1, u8 sprite, int a3)
+{
u8 new_sprite = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy);
gSprites[new_sprite] = gSprites[sprite];
gSprites[new_sprite].usingSheet = TRUE;
@@ -1890,59 +2149,68 @@ u8 sub_807A4A0(int a1, u8 sprite, int a3) {
return new_sprite;
}
-void sub_807A544(struct Sprite *sprite) {
+void sub_807A544(struct Sprite *sprite)
+{
sub_8078650(sprite);
- if (GetBankSide(gBattleAnimPlayerMonIndex)) {
+ if (GetBankSide(gAnimBankAttacker))
+ {
sprite->pos1.x -= gBattleAnimArgs[0];
gBattleAnimArgs[3] = -gBattleAnimArgs[3];
sprite->hFlip = TRUE;
- } else {
+ }
+ else
+ {
sprite->pos1.x += gBattleAnimArgs[0];
}
sprite->pos1.y += gBattleAnimArgs[1];
- sprite->data0 = gBattleAnimArgs[2];
- sprite->data1 = gBattleAnimArgs[3];
- sprite->data3 = gBattleAnimArgs[4];
- sprite->data5 = gBattleAnimArgs[5];
- oamt_set_x3A_32(sprite, move_anim_8074EE0);
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->data[3] = gBattleAnimArgs[4];
+ sprite->data[5] = gBattleAnimArgs[5];
+ StoreSpriteCallbackInData(sprite, move_anim_8074EE0);
sprite->callback = sub_8078504;
}
-void sub_807A5C4(struct Sprite *sprite) {
- if (GetBankSide(gBattleAnimPlayerMonIndex)) {
+void sub_807A5C4(struct Sprite *sprite)
+{
+ if (GetBankSide(gAnimBankAttacker))
+ {
sprite->pos1.x -= gBattleAnimArgs[0];
gBattleAnimArgs[3] *= -1;
- } else {
+ }
+ else
+ {
sprite->pos1.x += gBattleAnimArgs[0];
}
sprite->pos1.y += gBattleAnimArgs[1];
- sprite->data0 = gBattleAnimArgs[2];
- sprite->data1 = gBattleAnimArgs[3];
- sprite->data3 = gBattleAnimArgs[4];
- sprite->data5 = gBattleAnimArgs[5];
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->data[3] = gBattleAnimArgs[4];
+ sprite->data[5] = gBattleAnimArgs[5];
StartSpriteAnim(sprite, gBattleAnimArgs[6]);
- oamt_set_x3A_32(sprite, move_anim_8074EE0);
+ StoreSpriteCallbackInData(sprite, move_anim_8074EE0);
sprite->callback = sub_8078504;
}
-void sub_807A63C(struct Sprite *sprite) {
+void sub_807A63C(struct Sprite *sprite)
+{
sub_8078650(sprite);
- if (GetBankSide(gBattleAnimPlayerMonIndex)) {
+ if (GetBankSide(gAnimBankAttacker))
sprite->pos1.x -= gBattleAnimArgs[0];
- } else {
+ else
sprite->pos1.x += gBattleAnimArgs[0];
- }
sprite->pos1.y += gBattleAnimArgs[1];
sprite->callback = sub_8078600;
- oamt_set_x3A_32(sprite, move_anim_8072740);
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
}
-void sub_807A69C(u8 taskId) {
+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(gAnimBankAttacker)) ? -8 : 8;
task->data[2] = 0;
task->data[3] = 0;
gSprites[task->data[0]].pos2.x -= task->data[0];
@@ -1951,24 +2219,26 @@ 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);
- if (task->data[6] == 20 || task->data[6] == 40) {
+ task->data[6] = sub_8079E90(gAnimBankAttacker);
+ if (task->data[6] == 20 || task->data[6] == 40)
task->data[6] = 2;
- } else {
+ else
task->data[6] = 3;
- }
CpuCopy32(&gPlttBufferUnfaded[src], &gPlttBufferFaded[dest], 0x20);
BlendPalette(dest, 0x10, gBattleAnimArgs[1], gBattleAnimArgs[0]);
task->func = sub_807A784;
}
-void sub_807A784(u8 taskId) {
+void sub_807A784(u8 taskId)
+{
struct Task *task = &gTasks[taskId];
- switch (task->data[2]) {
+ switch (task->data[2])
+ {
case 0:
sub_807A850(task, taskId);
gSprites[task->data[0]].pos2.x += task->data[1];
- if (++task->data[3] == 5) {
+ if (++task->data[3] == 5)
+ {
task->data[3]--;
task->data[2]++;
}
@@ -1976,13 +2246,15 @@ void sub_807A784(u8 taskId) {
case 1:
sub_807A850(task, taskId);
gSprites[task->data[0]].pos2.x -= task->data[1];
- if (--task->data[3] == 0) {
+ if (--task->data[3] == 0)
+ {
gSprites[task->data[0]].pos2.x = 0;
task->data[2]++;
}
break;
case 2:
- if (!task->data[5]) {
+ if (!task->data[5])
+ {
FreeSpritePaletteByTag(10097);
DestroyAnimVisualTask(taskId);
}
@@ -1990,66 +2262,72 @@ void sub_807A784(u8 taskId) {
}
}
-void sub_807A850(struct Task *task, u8 taskId) {
+void sub_807A850(struct Task *task, u8 taskId)
+{
s16 sprite = duplicate_obj_of_side_rel2move_in_transparent_mode(0);
- if (sprite >= 0) {
+ if (sprite >= 0)
+ {
gSprites[sprite].oam.priority = task->data[6];
gSprites[sprite].oam.paletteNum = task->data[4];
- gSprites[sprite].data0 = 8;
- gSprites[sprite].data1 = taskId;
- gSprites[sprite].data2 = sprite;
+ gSprites[sprite].data[0] = 8;
+ gSprites[sprite].data[1] = taskId;
+ gSprites[sprite].data[2] = sprite;
gSprites[sprite].pos2.x = gSprites[task->data[0]].pos2.x;
gSprites[sprite].callback = sub_807A8D4;
task->data[5]++;
}
}
-void sub_807A8D4(struct Sprite *sprite) {
- if (--sprite->data0 == 0) {
- gTasks[sprite->data1].data[5]--;
+void sub_807A8D4(struct Sprite *sprite)
+{
+ if (--sprite->data[0] == 0)
+ {
+ gTasks[sprite->data[1]].data[5]--;
obj_delete_but_dont_free_vram(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->data0 = 5;
- } else {
- sprite->data0 = -10;
- }
- sprite->data1 = -40;
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2);
+ sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3);
+ if (!GetBankSide(gAnimBankAttacker))
+ sprite->data[0] = 5;
+ else
+ sprite->data[0] = -10;
+ sprite->data[1] = -40;
sprite->callback = sub_807A960;
}
-void sub_807A960(struct Sprite *sprite) {
- sprite->data2 += sprite->data0;
- sprite->data3 += sprite->data1;
- sprite->pos2.x = sprite->data2 / 10;
- sprite->pos2.y = sprite->data3 / 10;
- if (sprite->data1 < -20) {
- sprite->data1++;
- }
- if ((sprite->pos1.y + sprite->pos2.y) < -32) {
- move_anim_8072740(sprite);
- }
+void sub_807A960(struct Sprite *sprite)
+{
+ sprite->data[2] += sprite->data[0];
+ sprite->data[3] += sprite->data[1];
+ sprite->pos2.x = sprite->data[2] / 10;
+ sprite->pos2.y = sprite->data[3] / 10;
+ if (sprite->data[1] < -20)
+ sprite->data[1]++;
+ if (sprite->pos1.y + sprite->pos2.y < -32)
+ DestroyAnimSprite(sprite);
}
-void sub_807A9BC(struct Sprite *sprite) {
+void sub_807A9BC(struct Sprite *sprite)
+{
int x;
- sprite->data0 = gBattleAnimArgs[2];
- sprite->data2 = sprite->pos1.x + gBattleAnimArgs[4];
- sprite->data4 = sprite->pos1.y + gBattleAnimArgs[5];
- if (!GetBankSide(gBattleAnimEnemyMonIndex)) {
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[4];
+ sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[5];
+ if (!GetBankSide(gAnimBankTarget))
+ {
x = (u16)gBattleAnimArgs[4] + 30;
sprite->pos1.x += x;
sprite->pos1.y = gBattleAnimArgs[5] - 20;
- } else {
+ }
+ else
+ {
x = (u16)gBattleAnimArgs[4] - 30;
sprite->pos1.x += x;
sprite->pos1.y = gBattleAnimArgs[5] - 80;
}
sprite->callback = sub_8078B34;
- oamt_set_x3A_32(sprite, move_anim_8072740);
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
}
diff --git a/src/roulette.c b/src/roulette.c
new file mode 100644
index 000000000..1d612d071
--- /dev/null
+++ b/src/roulette.c
@@ -0,0 +1,4637 @@
+#include "global.h"
+#include "ewram.h"
+#include "field_fadetransition.h"
+#include "constants/game_stat.h"
+#include "m4a.h"
+#include "main.h"
+#include "menu.h"
+#include "menu_cursor.h"
+#include "menu_helpers.h"
+#include "overworld.h"
+#include "palette.h"
+#include "pokemon.h"
+#include "roulette.h"
+#include "roulette_util.h"
+#include "rtc.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "script.h"
+#include "constants/species.h"
+#include "sprite.h"
+#include "strings2.h"
+#include "string_util.h"
+#include "task.h"
+#include "text.h"
+#include "trig.h"
+#include "unknown_task.h"
+
+asm(".include \"constants/gba_constants.inc\"");
+
+struct Roulette /* ewram + 0x19000 */
+{
+ u8 var00;
+ u8 var01;
+ u8 var02;
+ u8 var03_0:5;
+ u8 var03_5:1;
+ u8 var03_6:1;
+ u8 var03_7:1;
+ u8 var04_0:2;
+ u8 var04_2:5;
+ u8 var04_7:1;
+ u32 var08;
+ u8 var0C[0x6];
+ u8 var12[0x4];
+ u8 var16[0x3];
+ u8 var19;
+ u8 var1A_0:4;
+ u8 var1A_4:4;
+ u8 var1B[0x6];
+ u8 var21;
+ u8 var22;
+ u8 var23;
+ s16 var24;
+ s16 var26;
+ s16 var28;
+ s16 var2A;
+ struct OamMatrix var2C;
+ u16 var34;
+ struct Sprite *var38;
+ u8 var3C[0x40]; // Sprite IDs
+ u8 var7C;
+ u8 var7D;
+ u8 var7E;
+ u8 var7F;
+ s16 var80;
+ s16 var82;
+ s16 var84;
+ s16 var86;
+ float var88;
+ float var8C;
+ float var90;
+ float var94;
+ float var98;
+ float var9C;
+ float varA0;
+ u8 varA4;
+ u8 varA5;
+ u8 v51[0x2];
+ u16 varA8;
+ u16 varAA;
+ TaskFunc varAC;
+ u8 v46[0x4];
+ TaskFunc varB4;
+ struct UnkStruct0 varB8;
+};
+
+struct StructgUnknown_083F8DF4
+{
+ u8 var00;
+ u8 var01;
+ u8 var02;
+ u8 var03;
+ u8 var04;
+ u8 v[0x3];
+ u16 var08;
+ u16 var0A;
+ u16 var0C;
+ u16 v13[0x1];
+ u16 var10;
+ u16 var12;
+ u16 var14;
+ u8 v1[0x2];
+ u16 var18;
+ u16 var1A;
+ float var1C;
+};
+
+struct StructgUnknown_083F8C00
+{
+ u8 var00;
+ u8 var01_0:4;
+ u8 var01_4:4;
+ u8 var02;
+ u8 var03;
+ u8 var04;
+ u8 var05;
+ u8 var06;
+ u8 var07;
+ u32 var08;
+ u32 var0C;
+ u16 var10;
+ u16 var12;
+};
+
+struct StructgUnknown_083F8D90
+{
+ u8 var00;
+ u8 var01;
+ u8 var02;
+ u8 var03;
+ u32 var04;
+};
+
+static void sub_81150FC(void);
+static void sub_8115124(void);
+static void sub_8115238(void);
+static void sub_8115384(void);
+static void sub_8115634(u8);
+static void sub_81156BC(u8);
+static void sub_8115734(u8);
+void sub_811577C(u8);
+void sub_81157AC(u8);
+static void sub_81157D0(u8);
+static void sub_8115928(u8, u8);
+static void sub_811597C(u8);
+static void sub_81159BC(u8);
+static u8 sub_8115A94(s16 *, u8);
+void sub_8115B58(u8);
+static void sub_8115DA0(u8);
+static void sub_8115E14(u8);
+static void sub_8115ECC(u8);
+u8 sub_8115F58(u16, u16);
+static void sub_8116100(u8);
+void sub_8116308(u8);
+static void sub_811637C(u8);
+static void sub_8116474(u8);
+static void sub_8116514(u8);
+static void sub_811659C(u8);
+static void sub_8116638(u8);
+static void sub_81166E8(u8);
+static void sub_811677C(u8);
+static void sub_81167F4(u8);
+static void sub_8116880(u8);
+static void dp01t_12_3_battle_menu(u8);
+static void sub_8116AB0(u8);
+static void sub_8116B40(u8);
+static void sub_8116BC0(u8);
+static void sub_8116C34(u8, TaskFunc, u16, u16);
+static void sub_8116CAC(u8);
+static void sub_8116CF8(void);
+static u8 sub_8116D54(u8, u8);
+static u8 sub_8116E5C(u8, u8);
+static void sub_8116EF8(u8);
+static void sub_8117158(u8);
+static u8 sub_8117380(u8);
+static void sub_8117434(void);
+static void sub_81174F8(u8);
+static void sub_8117528(u8);
+void sub_811755C(u8);
+void sub_81175C0(u8);
+static void sub_81175DC(u8);
+static void sub_8117630(u8);
+static void Task_Roulette_0(u8);
+static void sub_8117838(u8);
+static u8 sub_8117890(const struct SpriteTemplate *, u8, u16 *);
+static void sub_8117900(void);
+void unref_sub_8117A74(void);
+static void sub_8117AA8(u8, u8);
+static void sub_8117BBC(void);
+static void sub_8117C60(u8, u8);
+static void sub_8117D68(u8);
+static void sub_8117DF4(void);
+void sub_8117E98(struct Sprite *);
+static void sub_8117F2C(void);
+static void sub_81180F4(u16);
+static u8 sub_81181E8(u8);
+static void sub_811829C(u8);
+static void sub_81182F8(u8);
+void sub_81184CC(struct Sprite *);
+static void sub_81184D8(void);
+void sub_8118554(struct Sprite *);
+static void sub_811857C(void);
+static void sub_81185E8(void);
+static s16 sub_811866C(struct Sprite *);
+static u8 sub_81186B8(struct Sprite *);
+static s16 sub_81186E8(struct Sprite *);
+static void sub_8118724(struct Sprite *);
+static void sub_8118834(struct Sprite *);
+static void sub_811889C(struct Sprite *);
+static void sub_81189A8(struct Sprite *);
+static void sub_8118B30(struct Sprite *);
+static void sub_8118BD8(struct Sprite *);
+static void sub_8118CAC(struct Sprite *);
+void sub_8118CEC(struct Sprite *);
+void sub_8118D2C(struct Sprite *);
+static void sub_8118DE4(struct Sprite *);
+static void sub_8118F8C(struct Sprite *);
+static void sub_8119088(struct Sprite *);
+static void sub_8119134(struct Sprite *);
+static void sub_81191F4(struct Sprite *);
+static void sub_8119224(struct Sprite *);
+static void sub_81193D4(struct Sprite *);
+static void sub_811952C(struct Sprite *);
+static void sub_8119780(struct Sprite *);
+static void sub_81197D8(struct Sprite *);
+static void sub_8119898(struct Sprite *);
+void sub_8119964(struct Sprite *);
+static void sub_8119A90(struct Sprite *);
+static void sub_8119AAC(struct Sprite *);
+static void sub_8119B24(struct Sprite *);
+static void sub_8119BCC(struct Sprite *);
+static void sub_8119D08(struct Sprite *);
+void sub_8119D80(struct Sprite *);
+
+extern u8 gUnknown_02019000[];
+extern u16 gSpecialVar_0x8004;
+extern struct StructgUnknown_083F8DF4 gUnknown_083F8DF4[];
+extern u8 gUnknown_083F8EC4;
+extern u8 gUnknown_083F8DF0[];
+extern u8 gUnknown_083F8E34[];
+extern const u8 gUnknown_08E8096C[];
+extern const u8 gRouletteWheelTiles[];
+extern const u8 gRouletteCenter_Gfx[];
+extern const u8 gRouletteHeadersTiles[];
+extern const u8 gRouletteCreditTiles[];
+extern const u8 gRouletteNumbersTiles[];
+extern const u8 gRouletteMultiplierTiles[];
+extern const u16 gUnknown_083F86BC[];
+extern const u8 gUnknown_083F88BC[];
+extern const u8 gUnknown_083F8A60[];
+extern u16 gPlttBufferFaded[];
+extern u16 gPlttBufferUnfaded[];
+extern const u8 gUnknown_081C4157[];
+extern const struct YesNoFuncTable gUnknown_083F8EBC;
+extern const u8 gUnknown_081C41E3;
+extern const u16 gUnknown_083F8ECE;
+extern const struct StructgUnknown_083F8C00 gUnknown_083F8C00[];
+const extern u8 gUnknown_083F8ECA[];
+const extern u8 gUnknown_081C41A5;
+const extern u8 gUnknown_081C4199;
+const extern u8 gUnknown_081C41AE;
+const extern u8 gUnknown_081C41BD;
+const extern u8 gUnknown_081C41F1;
+const extern u8 gUnknown_081C4231;
+const extern u8 gUnknown_081C41D2;
+extern const struct StructgUnknown_083F8D90 gUnknown_083F8D90[];
+extern const u32 gUnknown_083F8ED8[];
+extern const u32 gUnknown_083F8EE8[];
+extern const struct UnkStruct1 gUnknown_083F8E9C[];
+extern const u8 gUnknown_083F8EF4[];
+extern const struct YesNoFuncTable gUnknown_083F8EB4;
+extern const u8 gUnknown_081C40DF;
+extern const u8 gUnknown_081C4139;
+extern const u8 gUnknown_081C411C;
+extern const u8 gUnknown_083F92A8[];
+extern const u8 gUnknown_083F90FC[];
+extern const u8 gUnknown_083F9D3C[];
+extern const struct SpritePalette gUnknown_083F9E30;
+extern const struct SpriteSheet gUnknown_083F9F54;
+extern const struct SpriteSheet gUnknown_083F9F5C;
+extern const struct SpriteTemplate gSpriteTemplate_83FA07C[];
+extern const struct SpriteTemplate gSpriteTemplate_83F9FD4[];
+extern const struct SpriteTemplate gSpriteTemplate_83FA034[];
+extern const struct SpriteTemplate gSpriteTemplate_83FA40C;
+extern const struct SpriteSheet gUnknown_083F9EE8;
+extern const struct SpriteTemplate gSpriteTemplate_83FA0DC[];
+extern struct OamMatrix gOamMatrices[];
+extern const struct SpriteSheet gUnknown_083FA21C[];
+extern const struct SpriteTemplate gSpriteTemplate_83FA2B0;
+extern const struct SpriteTemplate gSpriteTemplate_83FA2C8;
+extern const struct SpriteTemplate gSpriteTemplate_83FA2E0;
+extern const struct SpriteTemplate gSpriteTemplate_83FA2F8;
+extern const struct SpriteTemplate gSpriteTemplate_83FA310;
+extern const u8 gUnknown_083FA608[0x5];
+extern const struct SpriteSheet gUnknown_083FA42C;
+extern const struct SpriteTemplate gSpriteTemplate_83FA434;
+extern void (*gFieldCallback)(void);
+extern struct MusicPlayerInfo gMPlay_SE1;
+extern struct MusicPlayerInfo gMPlay_SE2;
+extern const u16 gUnknown_083FA60E[0x2][0x2];
+extern const struct SpriteTemplate gSpriteTemplate_83FA50C;
+extern const struct SpriteTemplate gSpriteTemplate_83FA5C0[];
+extern const u16 gUnknown_083FA616[0x2][0x2];
+extern const struct SpriteTemplate gSpriteTemplate_83FA524;
+extern const struct SpriteTemplate gSpriteTemplate_83FA5F0;
+extern const u16 gUnknown_083FA61E[0xA];
+extern const u16 gUnknown_083FA632[];
+extern const s8 gUnknown_083FA64A[0x2];
+extern const s8 gUnknown_083FA64C[0x8][0x2];
+
+
+
+
+void sub_81150FC(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ if (eRoulette->varB8.var00)
+ task_tutorial_controls_fadein(&eRoulette->varB8);
+}
+
+void sub_8115124(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ sub_8117434();
+ REG_BG1HOFS = 0x200 - eRoulette->var26;
+ if (eRoulette->var01)
+ REG_BLDALPHA = eRoulette->var34;
+ if (eRoulette->var2A != 0)
+ {
+ DmaCopy16(3, &gBGTilemapBuffers[1][0xE0], (void *)(VRAM + 0x21C0), 0x340);
+ eRoulette->var2A = 0x0;
+ }
+ switch (eRoulette->var28)
+ {
+ case 0x1:
+ REG_BG0CNT = (0x20 * 0xF8);
+ DmaCopy16(3, &gBGTilemapBuffers[2][0xE0], (void *)(VRAM + 0xF9C0), 0x340);
+ eRoulette->var28 = 0x2;
+ break;
+ case 0x2:
+ DmaCopy16(3, &gBGTilemapBuffers[2][0xE0], (void *)(VRAM + 0xF9C0), 0x340);
+ break;
+ case 0xFF:
+ REG_BG0CNT = 0x1F08;
+ DmaFill16(3, 0x0, (void *)(VRAM + 0xF9C0), 0x340);
+ eRoulette->var28 = 0x0;
+ break;
+ case 0x0:
+ }
+}
+#ifdef NONMATCHING
+
+void sub_8115238(void)
+{
+ u8 i;
+ u32 temp;
+ struct PlttData t;
+ struct PlttData *unfaded;
+ struct PlttData *faded;
+ struct StructgUnknown_083F8DF4 *s0;
+ struct PlttData arr[0x3]; // the third is never used ?
+ memcpy(&arr, &gUnknown_083F8EC4, 0x6);
+ memset(eRoulette, 0x0, 0x17C);
+ eRoulette->var04_0 = (gSpecialVar_0x8004 & 0x1);
+ if (gSpecialVar_0x8004 & 0x80)
+ eRoulette->var04_7 = 0x1;
+ s0 = &gUnknown_083F8DF4[0];
+ eRoulette->var22 = s0[eRoulette->var04_0].var03;
+ eRoulette->var23 = s0[eRoulette->var04_0].var04;
+ temp = gUnknown_083F8DF0[eRoulette->var04_0 + eRoulette->var04_7 * 2];
+ eRoulette->var19 = temp;
+ eRoulette->var1A_4 = 0x1;
+ if (temp == 0x1)
+ {
+ unfaded = (struct PlttData *)&gPlttBufferUnfaded[0];
+ faded = (struct PlttData *)&gPlttBufferFaded[0];
+ t = arr[0];
+ }
+ else
+ {
+ unfaded = (struct PlttData *)&gPlttBufferUnfaded[0];
+ faded = (struct PlttData *)&gPlttBufferFaded[0];
+ t = arr[1];
+ }
+ faded[0x51] = t;
+ faded[0x0] = faded[0x51];
+ unfaded[0x51] = t;
+ unfaded[0x0] = t;
+ sub_8124918((&eRoulette->varB8));
+ for (i = 0; i < 0xD; i++)
+ sub_812492C((&eRoulette->varB8), i, (struct UnkStruct1 *)&gUnknown_083F8E34[i * 8]);
+ for (i = 0; i < 0x6; i++)
+ {
+ switch (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2))
+ {
+ case SPECIES_TAILLOW:
+ eRoulette->var02 |= 0x2;
+ break;
+ case SPECIES_SHROOMISH:
+ eRoulette->var02 |= 0x1;
+ break;
+ }
+ }
+ RtcCalcLocalTime();
+}
+#else
+__attribute__((naked))
+void sub_8115238(void)
+{
+ asm(".syntax unified\n\
+ push {r4-r6,lr}\n\
+ sub sp, 0x8\n\
+ ldr r1, _081152C0 @ =gUnknown_083F8EC4\n\
+ mov r0, sp\n\
+ movs r2, 0x6\n\
+ bl memcpy\n\
+ ldr r5, _081152C4 @ =0x02019000\n\
+ movs r2, 0xBE\n\
+ lsls r2, 1\n\
+ adds r0, r5, 0\n\
+ movs r1, 0\n\
+ bl memset\n\
+ ldr r0, _081152C8 @ =gSpecialVar_0x8004\n\
+ ldrh r2, [r0]\n\
+ movs r0, 0x1\n\
+ ands r0, r2\n\
+ ldrb r1, [r5, 0x4]\n\
+ movs r3, 0x4\n\
+ negs r3, r3\n\
+ ands r3, r1\n\
+ orrs r3, r0\n\
+ strb r3, [r5, 0x4]\n\
+ movs r0, 0x80\n\
+ ands r0, r2\n\
+ cmp r0, 0\n\
+ beq _08115276\n\
+ movs r0, 0x80\n\
+ orrs r3, r0\n\
+ strb r3, [r5, 0x4]\n\
+ _08115276:\n\
+ ldr r3, _081152CC @ =gUnknown_083F8DF4\n\
+ ldrb r2, [r5, 0x4]\n\
+ lsls r1, r2, 30\n\
+ lsrs r0, r1, 25\n\
+ adds r0, r3\n\
+ ldrb r0, [r0, 0x3]\n\
+ adds r4, r5, 0\n\
+ adds r4, 0x22\n\
+ strb r0, [r4]\n\
+ lsrs r0, r1, 25\n\
+ adds r0, r3\n\
+ ldrb r0, [r0, 0x4]\n\
+ adds r3, r5, 0\n\
+ adds r3, 0x23\n\
+ strb r0, [r3]\n\
+ ldr r0, _081152D0 @ =gUnknown_083F8DF0\n\
+ lsrs r1, 30\n\
+ lsls r2, 24\n\
+ lsrs r2, 31\n\
+ lsls r2, 1\n\
+ adds r1, r2\n\
+ adds r1, r0\n\
+ ldrb r2, [r1]\n\
+ strb r2, [r5, 0x19]\n\
+ ldrb r1, [r5, 0x1A]\n\
+ movs r0, 0xF\n\
+ ands r0, r1\n\
+ movs r1, 0x10\n\
+ orrs r0, r1\n\
+ strb r0, [r5, 0x1A]\n\
+ cmp r2, 0x1\n\
+ bne _081152DC\n\
+ ldr r4, _081152D4 @ =gPlttBufferUnfaded\n\
+ ldr r3, _081152D8 @ =gPlttBufferFaded\n\
+ mov r0, sp\n\
+ ldrh r2, [r0]\n\
+ b _081152E4\n\
+ .align 2, 0\n\
+ _081152C0: .4byte gUnknown_083F8EC4\n\
+ _081152C4: .4byte 0x02019000\n\
+ _081152C8: .4byte gSpecialVar_0x8004\n\
+ _081152CC: .4byte gUnknown_083F8DF4\n\
+ _081152D0: .4byte gUnknown_083F8DF0\n\
+ _081152D4: .4byte gPlttBufferUnfaded\n\
+ _081152D8: .4byte gPlttBufferFaded\n\
+ _081152DC:\n\
+ ldr r4, _08115348 @ =gPlttBufferUnfaded\n\
+ ldr r3, _0811534C @ =gPlttBufferFaded\n\
+ mov r0, sp\n\
+ ldrh r2, [r0, 0x2]\n\
+ _081152E4:\n\
+ adds r0, r3, 0\n\
+ adds r0, 0xA2\n\
+ strh r2, [r0]\n\
+ ldr r1, _08115350 @ =0x0000ffff\n\
+ adds r0, r1, 0\n\
+ ands r0, r2\n\
+ strh r0, [r3]\n\
+ ands r0, r1\n\
+ adds r2, r4, 0\n\
+ adds r2, 0xA2\n\
+ strh r0, [r2]\n\
+ ands r0, r1\n\
+ strh r0, [r4]\n\
+ ldr r0, _08115354 @ =0x020190b8\n\
+ bl sub_8124918\n\
+ movs r4, 0\n\
+ ldr r5, _08115358 @ =gUnknown_083F8E34\n\
+ _08115308:\n\
+ lsls r2, r4, 3\n\
+ adds r2, r5\n\
+ ldr r0, _08115354 @ =0x020190b8\n\
+ adds r1, r4, 0\n\
+ bl sub_812492C\n\
+ adds r0, r4, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ cmp r4, 0xC\n\
+ bls _08115308\n\
+ movs r4, 0\n\
+ ldr r5, _0811535C @ =0x02019000\n\
+ _08115322:\n\
+ movs r0, 0x64\n\
+ muls r0, r4\n\
+ ldr r1, _08115360 @ =gPlayerParty\n\
+ adds r0, r1\n\
+ movs r1, 0x41\n\
+ bl GetMonData\n\
+ adds r1, r0, 0\n\
+ movs r0, 0x98\n\
+ lsls r0, 1\n\
+ cmp r1, r0\n\
+ beq _08115364\n\
+ adds r0, 0x2\n\
+ cmp r1, r0\n\
+ bne _0811536C\n\
+ ldrb r0, [r5, 0x2]\n\
+ movs r1, 0x1\n\
+ b _08115368\n\
+ .align 2, 0\n\
+ _08115348: .4byte gPlttBufferUnfaded\n\
+ _0811534C: .4byte gPlttBufferFaded\n\
+ _08115350: .4byte 0x0000ffff\n\
+ _08115354: .4byte 0x020190b8\n\
+ _08115358: .4byte gUnknown_083F8E34\n\
+ _0811535C: .4byte 0x02019000\n\
+ _08115360: .4byte gPlayerParty\n\
+ _08115364:\n\
+ ldrb r0, [r5, 0x2]\n\
+ movs r1, 0x2\n\
+ _08115368:\n\
+ orrs r0, r1\n\
+ strb r0, [r5, 0x2]\n\
+ _0811536C:\n\
+ adds r0, r4, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ cmp r4, 0x5\n\
+ bls _08115322\n\
+ bl RtcCalcLocalTime\n\
+ add sp, 0x8\n\
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .syntax divided\n");
+}
+#endif
+
+void sub_8115384(void)
+{
+ u32 temp_IME;
+ u8 taskid;
+ switch (gMain.state)
+ {
+ case 0x0:
+ SetVBlankCallback(NULL);
+ remove_some_task();
+ sub_80F9438();
+ sub_80F9368();
+ REG_BG2CNT = 0x4686;
+ REG_BG1CNT = 0x4401;
+ REG_BLDCNT = 0x2400;
+ REG_BLDALPHA = 0x060A;
+ LZ77UnCompVram(&gUnknown_08E8096C, (void *)VRAM);
+ LZ77UnCompVram(&gRouletteWheelTiles, (void *)(VRAM + 0x4000));
+ gMain.state++;
+ break;
+ case 0x1:
+ ResetPaletteFade();
+ ResetSpriteData();
+ ResetTasks();
+ gMain.state++;
+ break;
+ case 0x2:
+ SetUpWindowConfig(&gWindowConfig_81E6C3C);
+ InitMenuWindow(&gWindowConfig_81E6CE4);
+ LoadPalette(&gUnknown_083F86BC, 0x0, 0x1C0);
+ gMain.state++;
+ break;
+ case 0x3:
+ sub_8115238();
+ sub_80F9020();
+ LZ77UnCompWram(&gUnknown_083F88BC, (void *)(ewram18800));
+ LZ77UnCompVram(&gUnknown_083F8A60, (void *)(VRAM + 0x3000));
+ gMain.state++;
+ break;
+ case 0x4:
+ sub_8117838(0x0);
+ sub_811857C();
+ sub_81184D8();
+ sub_8117F2C();
+ sub_8117900();
+ sub_8117BBC();
+ sub_8117DF4();
+ gMain.state++;
+ break;
+ case 0x5:
+ AnimateSprites();
+ BuildOamBuffer();
+ sub_81180F4(gSaveBlock1.coins);
+ sub_81182F8(0x6);
+ sub_811829C(0x0);
+ sub_8117158(0x0);
+ MenuDrawTextWindow(0x0, 0xE, 0x1D, 0x13);
+ MenuPrint(&gUnknown_081C4157[0], 0x1, 0xF);
+ gSpriteCoordOffsetX = -0x3C;
+ gSpriteCoordOffsetY = 0x0;
+ gMain.state++;
+ break;
+ case 0x6:
+ REG_DISPCNT = 0x1741;
+ gMain.state++;
+ break;
+ case 0x7:
+ temp_IME = REG_IME;
+ REG_IME = 0x0; //disable interrupts
+ REG_IE |= 0x1; //enable VBlank interrupt
+ REG_IME = temp_IME; //reenable interrupts
+ REG_DISPSTAT |= 0x8;
+ SetVBlankCallback(&sub_8115124);
+ BeginHardwarePaletteFade(0xFF, 0x0, 0x10, 0x0 , 0x1);
+ taskid = eRoulette->varA4 = CreateTask(&sub_81156BC, 0x0);
+ gTasks[taskid].data[0x6] = 0x6;
+ gTasks[taskid].data[0xD] = gSaveBlock1.coins;
+ eRoulette->varA5 = CreateTask(&sub_8115634, 0x1);
+ SetMainCallback2(&sub_81150FC);
+ break;
+ }
+}
+
+void sub_8115634(u8 unused)
+{
+ s16 sin;
+ s16 cos;
+ s32 cos32;
+ if (eRoulette->var21++ == eRoulette->var23)
+ {
+ eRoulette->var21 = 0x0;
+ if ((eRoulette->var24 -= eRoulette->var22) < 0)
+ eRoulette->var24 = 0x168 - eRoulette->var22;
+ }
+ sin = Sin2(eRoulette->var24);
+ cos = Cos2(eRoulette->var24);
+ sin = sin / 16;
+ cos32 = cos / 16;
+ eRoulette->var2C.d = cos32;
+ eRoulette->var2C.a = cos32;
+ eRoulette->var2C.b = sin;
+ eRoulette->var2C.c = -sin;
+}
+
+void sub_81156BC(u8 taskid)
+{
+ if (UpdatePaletteFade() == 0)
+ {
+ REG_BLDCNT |= 0x2400;
+ REG_BLDALPHA = 0x0808;
+ gTasks[taskid].data[0x6] = 0;
+ sub_8116CAC(taskid);
+ sub_8116CF8();
+ sub_81185E8();
+ sub_8117158(0);
+ sub_81182F8(0x6);
+ sub_8116C34(taskid, &sub_81159BC, 0xFFFF, 0x3);
+ }
+}
+
+void sub_8115734(u8 taskid)
+{
+ DisplayYesNoMenu(0x14, 0x8, 0x1);
+ sub_814AAF8(0x2D9E);
+ MenuDrawTextWindow(0x0, 0xE, 0x1D, 0x13);
+ MenuPrint(&gUnknown_081C41E3, 0x1, 0xF);
+ DoYesNoFuncWithChoice(taskid, &gUnknown_083F8EBC);
+}
+
+void sub_811577C(u8 taskid)
+{
+ MenuZeroFillWindowRect(0x14, 0x8, 0x1A, 0xD);
+ gTasks[taskid].func = &sub_81159BC;
+}
+
+void sub_81157AC(u8 taskid)
+{
+ DestroyTask(eRoulette->varA5);
+ sub_8116AB0(taskid);
+}
+
+void sub_81157D0(u8 r0)
+{
+ u8 temp0, temp1;
+ switch (r0)
+ {
+ case 0x0:
+ sub_8124DDC(&gBGTilemapBuffers[2][0], 0x0, 0xE, 0x7, 0x10, 0xD);
+ break;
+ case 0x1:
+ case 0x2:
+ case 0x3:
+ case 0x4:
+ temp0 = (r0 * 3 + 0xE);
+ sub_8124DDC(&gBGTilemapBuffers[2][0], 0x0, 0xE, 0x7, 0x10, 0xD);
+ sub_8124E2C(&gBGTilemapBuffers[2][0], ewram18a32, temp0, 0x7, 0x3, 0xD);
+ break;
+ case 0x5:
+ case 0xA:
+ case 0xF:
+ temp1 = ((r0 - 1) / 5 * 3 + 0xA);
+ sub_8124DDC(&gBGTilemapBuffers[2][0], 0x0, 0xE, 0x7, 0x10, 0xD);
+ sub_8124E2C(&gBGTilemapBuffers[2][0], ewram18a80, 0xE, temp1, 0x10, 0x3);
+ break;
+ default:
+ temp0 = ((r0 % 5) * 3 + 0xE);
+ temp1 = ((r0 - 1) / 5 * 3 + 0x7);
+ sub_8124DDC(&gBGTilemapBuffers[2][0], 0x0, 0xE, 0x7, 0x10, 0xD);
+ sub_8124E2C(&gBGTilemapBuffers[2][0], ewram18a20, temp0, temp1, 0x3, 0x3);
+ }
+}
+
+void sub_8115928(u8 taskid, u8 r1)
+{
+ if (!r1)
+ sub_811829C(gTasks[taskid].data[0x4]);
+ else
+ sub_811829C(eRoulette->var1B[eRoulette->var1A_0]);
+ sub_81157D0(gTasks[taskid].data[0x4]);
+}
+
+void sub_811597C(u8 taskid)
+{
+ eRoulette->var28 = 0x1;
+ sub_81157D0(gTasks[taskid].data[0x4]);
+ eRoulette->var23 = 0x2;
+ eRoulette->var21 = 0x0;
+ gTasks[taskid].func = &sub_8115E14;
+}
+
+void sub_81159BC(u8 taskid)
+{
+ s16 i;
+ if(eRoulette->var08 & 0x20)
+ {
+ for (i = 0xB; (i < 0xE); i++)
+ if ((eRoulette->var08 & gUnknown_083F8C00[i].var08) == 0)
+ break;
+ }
+ else
+ {
+ for (i = 0x6; (i < 0xA); i++)
+ if ((eRoulette->var08 & gUnknown_083F8C00[i].var08) == 0)
+ break;
+ }
+ gTasks[taskid].data[0x4] = i;
+ sub_8116CAC(taskid);
+ sub_8117158(gTasks[taskid].data[0x4]);
+ sub_811829C(gTasks[taskid].data[0x4]);
+ sub_8116EF8(gTasks[taskid].data[0x4]);
+ gTasks[taskid].data[0x1] = 0x0;
+ gTasks[taskid].func = &sub_811597C;
+}
+
+u8 sub_8115A94(s16 *r0, u8 r1)
+{
+ s8 temp1 = 0;
+ s8 temp = 0;
+ s8 arr[0x4];
+ s8 t;
+ memcpy(&arr, gUnknown_083F8ECA, 0x4);
+ t = (u8)*r0;
+ switch (r1)
+ {
+ case 0x0:
+ case 0x1:
+ temp1 = (*r0 % 5);
+ temp = temp1 + 0xF;
+ if (temp1 == 0)
+ temp1 = 0x5;
+ break;
+ case 0x2:
+ case 0x3:
+ temp1 = (s16)(*r0 / 5) * 5;
+ temp = temp1 + 0x4;
+ if (temp1 == 0)
+ temp1 = 0x1;
+ break;
+ }
+ *r0 += arr[r1];
+ if (*r0 < temp1)
+ *r0 = temp;
+ if (*r0 > temp)
+ *r0 = temp1;
+ if (*r0 != t)
+ return TRUE;
+ return FALSE;
+}
+
+void sub_8115B58(u8 r0)
+{
+ u8 z = 0x0;
+ bool8 var0 = FALSE;
+ if (!(gMain.newKeys & DPAD_UP) || ((var0 = TRUE), sub_8115A94(&gTasks[r0].data[0x4], 0x0)))
+ if (!(gMain.newKeys & DPAD_DOWN) || ((var0 = TRUE), sub_8115A94(&gTasks[r0].data[0x4], 0x1)))
+ if (!(gMain.newKeys & DPAD_LEFT) || ((var0 = TRUE), sub_8115A94(&gTasks[r0].data[0x4], 0x2)))
+ if (!(gMain.newKeys & DPAD_RIGHT) || ((var0 = TRUE), sub_8115A94(&gTasks[r0].data[0x4], 0x3)))
+ if (var0)
+ {
+ u8 i;
+ sub_8117158(gTasks[r0].data[0x4]);
+ sub_8115928(r0, FALSE);
+ gTasks[r0].data[0x1] = z;
+ PlaySE(SE_SELECT);
+ sub_8124D3C((&eRoulette->varB8), 0xFFFF);
+ (&eRoulette->varB8)->var04[0xF].var00_7 = 0x0;
+ (&eRoulette->varB8)->var04[0xE].var00_7 = 0x0;
+ (&eRoulette->varB8)->var04[0xD].var00_7 = 0x0;
+ sub_8116EF8(gTasks[r0].data[0x4]);
+ for (i = 0; i < 0x4; i++)
+ {
+ gSprites[eRoulette->var3C[i + 0x29]].oam.tileNum =
+ gSprites[eRoulette->var3C[i + 0x29]].sheetTileStart
+ + (*gSprites[eRoulette->var3C[i + 0x29]].anims)->type;
+ }
+ if ((u16)(gTasks[r0].data[0x4] - 1) < 0x4 && !(eRoulette->var08 & gUnknown_083F8C00[gTasks[r0].data[0x4]].var08) )
+ {
+ z = gTasks[r0].data[0x4] - 1;
+ gSprites[eRoulette->var3C[z + 0x29]].oam.tileNum =
+ gSprites[eRoulette->var3C[z + 0x29]].sheetTileStart
+ + (*gSprites[eRoulette->var3C[z + 0x29]].anims + 1)->type;
+ }
+ }
+}
+
+void sub_8115D58(u8 r0)
+{
+ eRoulette->var28 = 0xFF;
+ if (eRoulette->var19 == 1)
+ eRoulette->var23 = 1;
+ else
+ eRoulette->var23 = 0;
+ eRoulette->var21 = 0;
+ gTasks[r0].data[0x1] = 0x20;
+ gTasks[r0].func = &sub_8115ECC;
+}
+
+void sub_8115DA0(u8 taskid)
+{
+ eRoulette->var1B[eRoulette->var1A_0] = gTasks[taskid].data[0x4];
+ gTasks[taskid].data[0x2] = sub_8117380(eRoulette->var1B[eRoulette->var1A_0]);
+ sub_811829C(eRoulette->var1B[eRoulette->var1A_0]);
+ if ((gTasks[taskid].data[0xD] -= eRoulette->var19) < 0)
+ gTasks[taskid].data[0xD] = 0;
+ sub_81180F4(gTasks[taskid].data[0xD]);
+ gTasks[taskid].func = &sub_8115D58;
+}
+
+void sub_8115E14(u8 taskid)
+{
+ sub_8115B58(taskid);
+ switch (gTasks[taskid].data[0x1])
+ {
+ case 0x0:
+ sub_81157D0(gTasks[taskid].data[0x4]);
+ gTasks[taskid].data[0x1]+= 1;
+ break;
+ case 0x1E:
+ sub_81157D0(0);
+ gTasks[taskid].data[0x1]+= 1;
+ break;
+ case 0x3B:
+ gTasks[taskid].data[0x1] = 0;
+ break;
+ default:
+ gTasks[taskid].data[0x1]++;
+ }
+ if (gMain.newKeys & A_BUTTON)
+ {
+ if ((eRoulette->var08 & gUnknown_083F8C00[gTasks[taskid].data[0x4]].var08))
+ PlaySE(SE_BOO);
+ else
+ {
+ m4aSongNumStart(SE_REGI);
+ gTasks[taskid].func = &sub_8115DA0;
+ }
+ }
+}
+
+void sub_8115ECC(u8 taskid)
+{
+ if (gTasks[taskid].data[0x1]-- > 0)
+ {
+ if (gTasks[taskid].data[0x1] > 0x2)
+ gSpriteCoordOffsetX += 0x2;
+ if ((eRoulette->var26 += 0x4) == 0x68)
+ gSprites[eRoulette->var3C[0x19]].callback = &SpriteCallbackDummy;
+ }
+ else
+ {
+ sub_8117AA8(0x1, 0xFF);
+ sub_8117C60(0x1, 0xFF);
+ gTasks[taskid].func = &sub_8116100;
+ gTasks[taskid].data[0x1] = 0;
+ }
+}
+
+u8 sub_8115F58(u16 r0, u16 r1)
+{
+ u8 timeh;
+ switch (eRoulette->var02)
+ {
+ case 0x1: // SHROOMISH
+ case 0x2: // TAILLOW
+ // one of the two is in party
+ timeh = gLocalTime.hours - 0x4;
+ if (!(timeh > 0x5))
+ {
+ if (!(r0 < 0xC || (r1 & 0x1)))
+ return 0x1;
+ else
+ {
+ struct StructgUnknown_083F8DF4 *p = &gUnknown_083F8DF4[0];
+ return p[eRoulette->var04_0].var02 / 2;
+ }
+ }
+ else if (!(r1 & 0x3))
+ {
+ struct StructgUnknown_083F8DF4 *p = &gUnknown_083F8DF4[0];
+ return p[eRoulette->var04_0].var02 / 2;
+ }
+ else
+ {
+ struct StructgUnknown_083F8DF4 *p = &gUnknown_083F8DF4[0];
+ return p[eRoulette->var04_0].var02;
+ }
+ break;
+ case 0x3:
+ // both are in party
+ timeh = gLocalTime.hours - 0x4;
+ if (!(timeh > 0x6))
+ {
+ if (r0 < 0x6 || (r1 & 0x1))
+ {
+ struct StructgUnknown_083F8DF4 *p = &gUnknown_083F8DF4[0];
+ return p[eRoulette->var04_0].var02 / 2;
+ }
+ else
+ {
+ return 0x1;
+ }
+ }
+ else if ((r1 & 0x1) && !(r0 < 0x7))
+ {
+ struct StructgUnknown_083F8DF4 *p = &gUnknown_083F8DF4[0];
+ return p[eRoulette->var04_0].var02 / 4;
+ }
+ else
+ {
+ struct StructgUnknown_083F8DF4 *p = &gUnknown_083F8DF4[0];
+ return p[eRoulette->var04_0].var02 / 2;
+ }
+ break;
+ case 0:
+ default:
+ // neither is in party
+ timeh = gLocalTime.hours - 0x4;
+ if (!(timeh > 5))
+ {
+ if (!(r1 & 0x3))
+ {
+ return 0x1;
+ }
+ else
+ {
+ struct StructgUnknown_083F8DF4 *p = &gUnknown_083F8DF4[0];
+ return p[eRoulette->var04_0].var02 / 2;
+ }
+ }
+ else if (!(r1 & 0x3))
+ {
+ if (!(r0 < 0xD))
+ {
+ struct StructgUnknown_083F8DF4 *p = &gUnknown_083F8DF4[0];
+ return p[eRoulette->var04_0].var02 / 2;
+ }
+ else
+ {
+ struct StructgUnknown_083F8DF4 *p = &gUnknown_083F8DF4[0];
+ return p[eRoulette->var04_0].var02;
+ }
+ }
+ else if (r1 & (0x80 << 8))
+ {
+ if (!(r0 < 0xD))
+ {
+ struct StructgUnknown_083F8DF4 *p = &gUnknown_083F8DF4[0];
+ return p[eRoulette->var04_0].var02;
+ }
+ else
+ {
+ struct StructgUnknown_083F8DF4 *p = &gUnknown_083F8DF4[0];
+ return p[eRoulette->var04_0].var01;
+ }
+ }
+ else
+ {
+ struct StructgUnknown_083F8DF4 *p = &gUnknown_083F8DF4[0];
+ return p[eRoulette->var04_0].var01 * 2;
+ }
+ }
+}
+
+#ifdef NONMATCHING
+void sub_8116100(u8 taskid)
+{
+ u8 randf;
+ s8 randfinal;
+ s8 r5;
+ u16 g;
+ u16 rand;
+ u16 randmod;
+ u16 angles[0x4]; // angles in 90 degree steps
+ u8 zero = 0x0;
+ memcpy(angles, &gUnknown_083F8ECE, 0x8);
+ rand = Random();
+ randmod = rand % 0x64;
+ eRoulette->var7C = gTasks[taskid].data[0x6];
+ eRoulette->var7F = zero;
+ eRoulette->var7E = zero;
+ eRoulette->var7D = zero;
+ randf = sub_8115F58(gTasks[taskid].data[0x8], rand);
+ randfinal = (rand % randf) - (randf / 2);
+ if (gLocalTime.hours < 0xD)
+ r5 = 0x0;
+ else
+ r5 = 0x1;
+ if (randmod < 0x50)
+ r5 *= 2;
+ else
+ r5 = (1 - r5) * 2;
+ g = (&gUnknown_083F8DF4[eRoulette->var04_0])->var1A;
+ eRoulette->var80 = (g + randfinal);
+ //
+ g = ((float)(u16)(g + randfinal)) / 5.0f;
+ eRoulette->var82 = g * 3;
+ eRoulette->var84 = g;
+ eRoulette->var86 = g;
+ //
+ eRoulette->var88 = (float)(angles[(rand & 0x1) + r5]);
+ eRoulette->var8C = (float)((&gUnknown_083F8DF4[eRoulette->var04_0])->var18);
+ eRoulette->var90 = ((eRoulette->var8C * 0.5f) - eRoulette->var8C) / (float)(u16)(g * 3);
+ eRoulette->var94 = 68.0f;
+ eRoulette->var9C = 0.0f;
+ eRoulette->var98 = -(8.0f / (float)(u16)(g * 3));
+ eRoulette->varA0 = 36.0f;
+ gTasks[taskid].func = &sub_8116308;
+}
+#else
+__attribute__((naked))
+void sub_8116100(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\
+sub sp, 0x8\n\
+lsls r0, 24\n\
+lsrs r0, 24\n\
+mov r9, r0\n\
+movs r4, 0\n\
+ldr r1, _08116188 @ =gUnknown_083F8ECE\n\
+mov r0, sp\n\
+movs r2, 0x8\n\
+bl memcpy\n\
+bl Random\n\
+lsls r0, 16\n\
+lsrs r7, r0, 16\n\
+adds r0, r7, 0\n\
+movs r1, 0x64\n\
+bl __umodsi3\n\
+lsls r0, 16\n\
+lsrs r6, r0, 16\n\
+ldr r3, _0811618C @ =0x02019000\n\
+ldr r1, _08116190 @ =gTasks\n\
+mov r2, r9\n\
+lsls r0, r2, 2\n\
+add r0, r9\n\
+lsls r0, 3\n\
+adds r0, r1\n\
+ldrh r2, [r0, 0x14]\n\
+adds r1, r3, 0\n\
+adds r1, 0x7C\n\
+strb r2, [r1]\n\
+adds r1, 0x3\n\
+strb r4, [r1]\n\
+subs r1, 0x1\n\
+strb r4, [r1]\n\
+subs r1, 0x1\n\
+strb r4, [r1]\n\
+ldrh r0, [r0, 0x18]\n\
+adds r1, r7, 0\n\
+bl sub_8115F58\n\
+adds r4, r0, 0\n\
+lsls r4, 24\n\
+lsrs r1, r4, 24\n\
+adds r0, r7, 0\n\
+bl __modsi3\n\
+lsrs r4, 25\n\
+subs r0, r4\n\
+lsls r0, 24\n\
+lsrs r4, r0, 24\n\
+ldr r0, _08116194 @ =gLocalTime\n\
+ldrb r0, [r0, 0x2]\n\
+lsls r0, 24\n\
+asrs r0, 24\n\
+movs r5, 0x1\n\
+cmp r0, 0xC\n\
+bgt _08116180\n\
+movs r5, 0\n\
+_08116180:\n\
+cmp r6, 0x4F\n\
+bhi _08116198\n\
+lsls r0, r5, 25\n\
+b _081161A2\n\
+.align 2, 0\n\
+_08116188: .4byte gUnknown_083F8ECE\n\
+_0811618C: .4byte 0x02019000\n\
+_08116190: .4byte gTasks\n\
+_08116194: .4byte gLocalTime\n\
+_08116198:\n\
+lsls r1, r5, 24\n\
+asrs r1, 24\n\
+movs r0, 0x1\n\
+subs r0, r1\n\
+lsls r0, 25\n\
+_081161A2:\n\
+lsrs r5, r0, 24\n\
+ldr r6, _081162D8 @ =0x02019000\n\
+ldrb r0, [r6, 0x4]\n\
+lsls r0, 30\n\
+mov r10, r0\n\
+lsrs r0, 25\n\
+ldr r1, _081162DC @ =gUnknown_083F8DF4\n\
+adds r0, r1\n\
+lsls r4, 24\n\
+asrs r4, 24\n\
+ldrh r0, [r0, 0x1A]\n\
+adds r4, r0\n\
+adds r0, r6, 0\n\
+adds r0, 0x80\n\
+strh r4, [r0]\n\
+lsls r4, 16\n\
+asrs r4, 16\n\
+adds r0, r4, 0\n\
+bl __floatsisf\n\
+cmp r4, 0\n\
+bge _081161D4\n\
+ldr r1, _081162E0 @ =0x47800000\n\
+bl __addsf3\n\
+_081161D4:\n\
+ldr r1, _081162E4 @ =0x40a00000\n\
+bl __divsf3\n\
+bl __fixunssfsi\n\
+lsls r0, 16\n\
+lsrs r4, r0, 16\n\
+lsls r0, r4, 1\n\
+adds r0, r4\n\
+mov r8, r0\n\
+adds r0, r6, 0\n\
+adds r0, 0x82\n\
+mov r2, r8\n\
+strh r2, [r0]\n\
+adds r0, 0x2\n\
+strh r4, [r0]\n\
+adds r0, 0x2\n\
+strh r4, [r0]\n\
+movs r0, 0x1\n\
+ands r0, r7\n\
+lsls r1, r5, 24\n\
+asrs r1, 24\n\
+adds r0, r1\n\
+lsls r0, 1\n\
+add r0, sp\n\
+movs r1, 0\n\
+ldrsh r4, [r0, r1]\n\
+adds r0, r4, 0\n\
+bl __floatsisf\n\
+cmp r4, 0\n\
+bge _0811621A\n\
+ldr r1, _081162E0 @ =0x47800000\n\
+bl __addsf3\n\
+_0811621A:\n\
+ldr r2, _081162E8 @ =0x02019088\n\
+str r0, [r2]\n\
+adds r7, r6, 0\n\
+adds r7, 0x8C\n\
+mov r1, r10\n\
+lsrs r0, r1, 25\n\
+ldr r2, _081162DC @ =gUnknown_083F8DF4\n\
+adds r0, r2\n\
+movs r1, 0x18\n\
+ldrsh r4, [r0, r1]\n\
+adds r0, r4, 0\n\
+bl __floatsisf\n\
+adds r5, r0, 0\n\
+cmp r4, 0\n\
+bge _08116242\n\
+ldr r1, _081162E0 @ =0x47800000\n\
+bl __addsf3\n\
+adds r5, r0, 0\n\
+_08116242:\n\
+str r5, [r7]\n\
+adds r7, r6, 0\n\
+adds r7, 0x90\n\
+ldr r1, _081162EC @ =0x3f000000\n\
+adds r0, r5, 0\n\
+bl __mulsf3\n\
+adds r1, r5, 0\n\
+bl __subsf3\n\
+adds r5, r0, 0\n\
+mov r2, r8\n\
+lsls r0, r2, 16\n\
+asrs r4, r0, 16\n\
+adds r0, r4, 0\n\
+bl __floatsisf\n\
+adds r2, r0, 0\n\
+cmp r4, 0\n\
+bge _08116272\n\
+ldr r1, _081162E0 @ =0x47800000\n\
+bl __addsf3\n\
+adds r2, r0, 0\n\
+_08116272:\n\
+adds r0, r5, 0\n\
+adds r1, r2, 0\n\
+bl __divsf3\n\
+str r0, [r7]\n\
+adds r1, r6, 0\n\
+adds r1, 0x94\n\
+ldr r0, _081162F0 @ =0x42880000\n\
+str r0, [r1]\n\
+adds r1, 0x8\n\
+ldr r0, _081162F4 @ =0x00000000\n\
+str r0, [r1]\n\
+adds r5, r6, 0\n\
+adds r5, 0x98\n\
+adds r0, r4, 0\n\
+bl __floatsisf\n\
+adds r2, r0, 0\n\
+cmp r4, 0\n\
+bge _081162A2\n\
+ldr r1, _081162E0 @ =0x47800000\n\
+bl __addsf3\n\
+adds r2, r0, 0\n\
+_081162A2:\n\
+ldr r0, _081162F8 @ =0x41000000\n\
+adds r1, r2, 0\n\
+bl __divsf3\n\
+bl __negsf2\n\
+str r0, [r5]\n\
+adds r1, r6, 0\n\
+adds r1, 0xA0\n\
+ldr r0, _081162FC @ =0x42100000\n\
+str r0, [r1]\n\
+ldr r1, _08116300 @ =gTasks\n\
+mov r2, r9\n\
+lsls r0, r2, 2\n\
+add r0, r9\n\
+lsls r0, 3\n\
+adds r0, r1\n\
+ldr r1, _08116304 @ =sub_8116308\n\
+str r1, [r0]\n\
+add sp, 0x8\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\
+_081162D8: .4byte 0x02019000\n\
+_081162DC: .4byte gUnknown_083F8DF4\n\
+_081162E0: .4byte 0x47800000\n\
+_081162E4: .4byte 0x40a00000\n\
+_081162E8: .4byte 0x02019088\n\
+_081162EC: .4byte 0x3f000000\n\
+_081162F0: .4byte 0x42880000\n\
+_081162F4: .4byte 0x00000000\n\
+_081162F8: .4byte 0x41000000\n\
+_081162FC: .4byte 0x42100000\n\
+_08116300: .4byte gTasks\n\
+_08116304: .4byte sub_8116308\n\
+.syntax divided\n");
+}
+#endif
+
+void sub_8116308(u8 taskid)
+{
+ u8 index;
+ eRoulette->var03_7 = 1;
+ index = eRoulette->var3C[eRoulette->var7C];
+ eRoulette->var38 = &gSprites[index];
+ (&gSprites[index])->callback = &sub_81191F4;
+ gTasks[taskid].data[0x6]++;
+ gTasks[taskid].data[0x8]++;
+ sub_81182F8(0x6 - gTasks[taskid].data[0x6]);
+ m4aSongNumStart(SE_TAMAKORO);
+ gTasks[taskid].func = &sub_811637C;
+}
+
+void sub_811637C(u8 taskid)
+{
+ if (eRoulette->var7D)
+ {
+ if (eRoulette->var03_5)
+ {
+ if (eRoulette->var03_6)
+ {
+ eRoulette->var03_6 = FALSE;
+ eRoulette->var03_5 = FALSE;
+ }
+ }
+ else
+ {
+ if (!gTasks[taskid].data[0x1])
+ {
+ u8 temp = sub_8116E5C(sub_8116D54(taskid, eRoulette->var7E), eRoulette->var1B[eRoulette->var1A_0]);
+ gTasks[taskid].data[0x5] = temp;
+ if (temp == 1)
+ sub_8124CE8((&eRoulette->varB8), 0x1000);
+ }
+ if (gTasks[taskid].data[0x1] < 0x3D)
+ {
+ if (gMain.newKeys & A_BUTTON)
+ gTasks[taskid].data[0x1] = 0x3C;
+ gTasks[taskid].data[0x1]++;
+ }
+ else
+ {
+ sub_8117158(eRoulette->var1B[eRoulette->var1A_0]);
+ sub_8117AA8(0x0, (u8)gTasks[taskid].data[0xC]);
+ sub_8117C60(0x0, (u8)gTasks[taskid].data[0x6] - 0x1);
+ gTasks[taskid].data[0x1] = 0x20;
+ gTasks[taskid].func = &sub_8116474;
+ }
+ }
+ }
+}
+
+void sub_8116474(u8 taskid)
+{
+ if (gTasks[taskid].data[0x1]-- > 0x0)
+ {
+ if(gTasks[taskid].data[0x1] > 0x2)
+ gSpriteCoordOffsetX -= 0x2;
+ if((eRoulette->var26 -= 0x4) == 0x68)
+ gSprites[eRoulette->var3C[0x19]].callback = &sub_81184CC;
+ }
+ else
+ {
+ sub_8117D68(gTasks[taskid].data[0xC]);
+ if (gTasks[taskid].data[0x5] == 1)
+ gTasks[taskid].data[0x1] = 0x79;
+ else
+ gTasks[taskid].data[0x1] = 0x3D;
+ gTasks[taskid].func = &sub_8116514;
+ }
+}
+
+void sub_8116514(u8 taskid)
+{
+ if (gTasks[taskid].data[0x1]-- > 0x1)
+ {
+ switch(gTasks[taskid].data[0x1] % 0x10)
+ {
+ case 0x8:
+ sub_8117AA8(0x0, 0xFF);
+ sub_8117C60(0x0, 0xFF);
+ break;
+ case 0x0:
+ sub_8117AA8(0x0, (u8)gTasks[taskid].data[0xC]);
+ sub_8117C60(0x0, (u8)gTasks[taskid].data[0x6] - 0x1);
+ break;
+ }
+ }
+ else
+ {
+ sub_8116C34(taskid, &sub_8116638, 0x1E, 0x0);
+ }
+}
+
+void sub_811659C(u8 taskid)
+{
+ switch(gTasks[taskid].data[0x5])
+ {
+ case 0x1:
+ case 0x2:
+ if (IsFanfareTaskInactive())
+ {
+ u32 wins = GetGameStat(GAME_STAT_CONSECUTIVE_ROULETTE_WINS);
+ if(wins < ++gTasks[taskid].data[0xB])
+ SetGameStat(GAME_STAT_CONSECUTIVE_ROULETTE_WINS, gTasks[taskid].data[0xB]);
+ sub_8116C34(taskid, &sub_811677C, 0xFFFF, 0x3);
+ }
+ break;
+ case 0:
+ default:
+ if (!IsSEPlaying())
+ {
+ gTasks[taskid].data[0xB] = FALSE;
+ sub_8116C34(taskid, &sub_81167F4, 0xFFFF, 0x3);
+ }
+ }
+}
+
+void sub_8116638(u8 taskid)
+{
+ switch(gTasks[taskid].data[0x5])
+ {
+ case 0x1:
+ case 0x2:
+ if (gTasks[taskid].data[0x2] == 0xC)
+ {
+ PlayFanfare(BGM_ME_B_BIG);
+ MenuDrawTextWindow(0x0, 0xE, 0x1D, 0x13);
+ MenuPrint(&gUnknown_081C41A5, 0x1, 0xF);
+ }
+ else
+ {
+ PlayFanfare(BGM_ME_B_SMALL);
+ MenuDrawTextWindow(0x0, 0xE, 0x1D, 0x13);
+ MenuPrint(&gUnknown_081C4199, 0x1, 0xF);
+ }
+ break;
+ case 0:
+ default:
+ m4aSongNumStart(SE_HAZURE);
+ MenuDrawTextWindow(0x0, 0xE, 0x1D, 0x13);
+ MenuPrint(&gUnknown_081C41AE, 0x1, 0xF);
+ }
+ gTasks[taskid].data[0x1] = 0x0;
+ gTasks[taskid].func = &sub_811659C;
+}
+
+void sub_81166E8(u8 taskid)
+{
+ s32 r0 = gTasks[taskid].data[0x7];
+ switch(r0)
+ {
+ case 0x0:
+ gTasks[taskid].data[0xD]++;
+ m4aSongNumStart(SE_PIN);
+ sub_81180F4(gTasks[taskid].data[0xD]);
+ if (gTasks[taskid].data[0xD] > 0x270E)
+ {
+ gTasks[taskid].data[0x1] = r0;
+ }
+ else
+ {
+ gTasks[taskid].data[0x1]--;
+ gTasks[taskid].data[0x7]++;
+ }
+ break;
+ case 0x3:
+ m4aSongNumStop(SE_PIN);
+ gTasks[taskid].data[0x7] = 0x0;
+ break;
+ default:
+ gTasks[taskid].data[0x7]++;
+ }
+ if (gTasks[taskid].data[0x1] == 0x0)
+ sub_8116C34(taskid, &sub_81167F4, 0xFFFF, 0x3);
+}
+
+void sub_811677C(u8 taskid)
+{
+ ConvertIntToDecimalStringN((u8 *)&gStringVar1, (eRoulette->var19 * gTasks[taskid].data[0x2]), STR_CONV_MODE_LEFT_ALIGN, 0x2);
+ StringExpandPlaceholders((u8 *)&gStringVar4, &gUnknown_081C41BD);
+ MenuDrawTextWindow(0x0, 0xE, 0x1D, 0x13);
+ MenuPrint((u8 *)&gStringVar4, 0x1, 0xF);
+ gTasks[taskid].data[0x1] = (eRoulette->var19 * gTasks[taskid].data[0x2]);
+ gTasks[taskid].data[0x7] = 0x0;
+ gTasks[taskid].func = &sub_81166E8;
+}
+
+void sub_81167F4(u8 taskid)
+{
+ sub_8124D3C((&eRoulette->varB8), 0xFFFF);
+ (&eRoulette->varB8)->var04[0xF].var00_7 = 0x0;
+ (&eRoulette->varB8)->var04[0xE].var00_7 = 0x0;
+ (&eRoulette->varB8)->var04[0xD].var00_7 = 0x0;
+ gSprites[eRoulette->var3C[0x7 + gUnknown_083F8C00[gTasks[taskid].data[0xC]].var00]].invisible = TRUE;
+ gTasks[taskid].func = &sub_8116880;
+}
+
+void sub_8116880(u8 taskid)
+{
+ u8 i = 0;
+ gTasks[taskid].data[0x4] = i;
+ eRoulette->var1B[eRoulette->var1A_0] = 0x0;
+ sub_8117158(0x0);
+ gSprites[eRoulette->var3C[0x30]].invisible = TRUE;
+ for (i = 0; i < 0x4; i++)
+ {
+ gSprites[eRoulette->var3C[i + 0x29]].oam.tileNum =
+ gSprites[eRoulette->var3C[i + 0x29]].sheetTileStart
+ + (*gSprites[eRoulette->var3C[i + 0x29]].anims)->type;
+ }
+ if (!(gTasks[taskid].data[0xD] < eRoulette->var19))
+ {
+ if (gTasks[taskid].data[0x6] == 0x6)
+ {
+ MenuDrawTextWindow(0x0, 0xE, 0x1D, 0x13);
+ MenuPrint(&gUnknown_081C41F1, 0x1, 0xF);
+ sub_8116C34(taskid, &dp01t_12_3_battle_menu, 0xFFFF, 0x3);
+ }
+ else if (gTasks[taskid].data[0xD] == 0x270F)
+ {
+ MenuDrawTextWindow(0x0, 0xE, 0x1D, 0x13);
+ MenuPrint(&gUnknown_081C4231, 0x1, 0xF);
+ sub_8116C34(taskid, &sub_8115734, 0xFFFF, 0x3);
+ }
+ else
+ {
+ gTasks[taskid].func = &sub_8115734;
+ }
+ }
+ else
+ {
+ MenuDrawTextWindow(0x0, 0xE, 0x1D, 0x13);
+ MenuPrint(&gUnknown_081C41D2, 0x1, 0xF);
+ sub_8116C34(taskid, &sub_81157AC, 0x3C, 0x3);
+ }
+}
+
+void dp01t_12_3_battle_menu(u8 taskid)
+{
+ u8 i = 0x0;
+ gTasks[taskid].data[0x6] = 0x0;
+ sub_8116CAC(taskid);
+ sub_8116CF8();
+ sub_81185E8();
+ sub_8117158(0x0);
+ sub_81182F8(0x6);
+ for (i = 0; i < 0xC; i++)
+ gSprites[eRoulette->var3C[i + 0x7]].invisible = FALSE;
+ if (gTasks[taskid].data[0xD] == 0x270F)
+ {
+ MenuDrawTextWindow(0x0, 0xE, 0x1D, 0x13);
+ MenuPrint(&gUnknown_081C4231, 0x1, 0xF);
+ sub_8116C34(taskid, &sub_8115734, 0xFFFF, 0x3);
+ }
+ else
+ {
+ gTasks[taskid].func = &sub_8115734;
+ }
+}
+
+void sub_8116AB0(u8 taskid)
+{
+ sub_8124D3C((&eRoulette->varB8), 0xFFFF);
+ sub_8124918((&eRoulette->varB8));
+ gSaveBlock1.coins = gTasks[taskid].data[0xD];
+ if (gSaveBlock1.coins < eRoulette->var19)
+ gSpecialVar_0x8004 = TRUE;
+ else
+ gSpecialVar_0x8004 = FALSE;
+ BeginHardwarePaletteFade(0xFF, 0x0, 0x0, 0x10, 0x0);
+ gTasks[taskid].func = &sub_8116B40;
+}
+
+void sub_8116B40(u8 taskid) // end oulette ?
+{
+ if (UpdatePaletteFade() == 0)
+ {
+ SetVBlankCallback(0x0);
+ memset(eRoulette, 0x0, 0x17C);
+ gSpriteCoordOffsetX = gSpriteCoordOffsetY = 0x0;
+ sub_80F9368();
+ FreeAllSpritePalettes();
+ ResetPaletteFade();
+ ResetSpriteData();
+ sub_80F9020();
+ REG_BLDCNT = 0x0;
+ REG_BLDALPHA = 0x0;
+ REG_BLDY = 0x0;
+ gFieldCallback = &sub_8080990;
+ SetMainCallback2(&c2_exit_to_overworld_2_switch);
+ DestroyTask(taskid);
+ }
+}
+
+void sub_8116BC0(u8 taskid)
+{
+ if(eRoulette->varA8 == 0 || gMain.newKeys & eRoulette->varAA)
+ {
+ gTasks[taskid].func = eRoulette->varAC;
+ if (eRoulette->varAA > 0)
+ PlaySE(SE_SELECT);
+ eRoulette->varAC = NULL;
+ eRoulette->varAA = 0x0;
+ eRoulette->varA8 = 0x0;
+ }
+ if (eRoulette->varA8 != 0xFFFF)
+ eRoulette->varA8--;
+}
+
+void sub_8116C34(u8 taskid, TaskFunc r1, u16 r2, u16 r3)
+{
+ eRoulette->varB4 = gTasks[taskid].func;
+ if(r1 == NULL)
+ r1 = eRoulette->varB4;
+ eRoulette->varAC = r1;
+ eRoulette->varA8 = r2;
+ if (r2 == 0xFFFF && r3 == 0)
+ eRoulette->varAA = 0xFFFF;
+ else
+ eRoulette->varAA = r3;
+ gTasks[taskid].func = &sub_8116BC0;
+}
+
+void sub_8116CAC(u8 taskid)
+{
+ u8 i = 0;
+ eRoulette->var00 = i;
+ eRoulette->var03_0 = 0x0;
+ eRoulette->var03_5 = 0x0;
+ eRoulette->var03_6 = 0x0;
+ eRoulette->var03_7 = 0x0;
+ for (i = 0; i < 0x6; i++)
+ eRoulette->var1B[i] = 0x0;
+ eRoulette->var1A_0 = 0x0;
+ gTasks[taskid].data[0x1] = 0x0;
+}
+
+void sub_8116CF8(void)
+{
+ u8 i;
+ eRoulette->var08 = 0x0;
+ for (i = 0; i < 0x6; i++)
+ eRoulette->var0C[i] = 0x0;
+ for (i = 0; i < 0x4; i++)
+ eRoulette->var12[i] = 0x0;
+ for (i = 0; i < 0x3; i++)
+ eRoulette->var16[i] = 0x0;
+ sub_8117C60(0x1, 0xFF);
+}
+
+u8 sub_8116D54(u8 taskid, u8 r1)
+{
+ u32 t0[0x4];
+ u32 t1[0x3];
+ memcpy(t0, gUnknown_083F8ED8, 0x10);
+ memcpy(t1, gUnknown_083F8EE8, 0xC);
+ if (r1 > 0xB)
+ {
+ return 0x0;
+ }
+ else
+ {
+ u8 i;
+ u8 z;
+ eRoulette->var0C[gTasks[taskid].data[0x6] - 1] = gUnknown_083F8D90[r1].var02;
+ gTasks[taskid].data[0xC] = gUnknown_083F8D90[r1].var02;
+ eRoulette->var08 |= gUnknown_083F8D90[r1].var04;
+ for (i = 0; i < 0x4; i++)
+ {
+ if (gUnknown_083F8D90[r1].var04 & t0[i])
+ eRoulette->var12[i]++;
+ if (eRoulette->var12[i] > 0x2)
+ eRoulette->var08 |= t0[i];
+ }
+ for (z = 0; z < 0x3; z++)
+ {
+ if (gUnknown_083F8D90[r1].var04 & t1[z])
+ eRoulette->var16[z]++;
+ if (eRoulette->var16[z] > 0x3)
+ eRoulette->var08 |= t1[z];
+ }
+ return gUnknown_083F8D90[r1].var02;
+ }
+}
+
+u8 sub_8116E5C(u8 r0, u8 r1)
+{
+ u8 t = r0;
+ if (--r0 < 0x13)
+ {
+ switch(r1)
+ {
+ case 0x0:
+ return 0x3;
+ break;
+ case 0x1 ... 0x4:
+ if (t == r1 + 5 || t == r1 + 10 || t == r1 + 15)
+ return 0x1;
+ break;
+ case 0x5:
+ case 0xA:
+ case 0xF:
+ if (!(t < r1 + 1) && !(t > r1 + 4))
+ return 0x1;
+ break;
+ default:
+ if (t == r1)
+ return 0x1;
+ }
+ }
+ return 0x0;
+}
+
+#ifdef NONMATCHING // stack variable switched with a register variable
+void sub_8116EF8(u8 r0)
+{
+
+ u32 var0 = 0x0;
+ struct UnkStruct1 var1[0x3];
+ u32 var2;
+ u16 var3;
+ u32 var4;
+ u8 i;
+ switch(r0)
+ {
+ case 0x5:
+ case 0xA:
+ case 0xF:
+ for (i = (r0 + 0x1); i < (r0 + 0x5); i++)
+ if (!(eRoulette->var08 & gUnknown_083F8C00[i].var08))
+ var0 |= gUnknown_083F8C00[i].var10;
+ var0 &= 0xDFFF;
+ sub_8124CE8(&eRoulette->varB8, var0);
+ break;
+ default:
+ memcpy(var1, gUnknown_083F8E9C, 0x18);
+ if ((u8)(r0 - 0x1) < 0x4)
+ var2 = 0x3;
+ else
+ var2 = 0x1;
+ var3 = ((r0 / 0x5) - 0x1);
+ switch((u8)r0 % 0x5)
+ {
+ case 0x1:
+ var3 = gSprites[eRoulette->var3C[0x7 + 0x0]].oam.paletteNum * 0x10;
+ break;
+ case 0x2:
+ var3 = gSprites[eRoulette->var3C[0x7 + 0x1]].oam.paletteNum * 0x10;
+ break;
+ case 0x3:
+ var3 = gSprites[eRoulette->var3C[0x7 + 0x2]].oam.paletteNum * 0x10;
+ break;
+ case 0x4:
+ var3 = gSprites[eRoulette->var3C[0x7 + 0x3]].oam.paletteNum * 0x10;
+ break;
+ }
+ if (var2 == 0x1)
+ {
+ if (!(eRoulette->var08 & gUnknown_083F8C00[r0].var08))
+ {
+ var4 = (r0 / 0x5);
+ var1[var4 - 0x1].var02 += var3;
+ sub_812492C(&eRoulette->varB8, 0xD, &var1[var4 - 0x2]);
+ sub_8124CE8(&eRoulette->varB8, var0 |= gUnknown_083F8C00[r0].var10);
+ }
+ }
+ else
+ {
+ for (i = 0; i < 0x3; i++)
+ {
+ u8 var4 = i * 0x5 + r0 + 0x5;
+ if (!(eRoulette->var08 & gUnknown_083F8C00[var4].var08))
+ {
+ u8 var5 = (var4 / 0x5);
+ var1[var5 - 0x1].var02 += var3;
+ sub_812492C(&eRoulette->varB8, (u8)(0xD + i), &var1[var5 - 0x2]);
+ if (var2 == 0x3)
+ var0 = gUnknown_083F8C00[var4].var10;
+ var2--;
+ }
+ }
+ if (var2 != 0x2)
+ var0 = 0x0;
+ sub_8124CE8(&eRoulette->varB8, var0 |= gUnknown_083F8C00[r0].var10);
+ }
+ }
+}
+
+#else
+__attribute__((naked))
+void sub_8116EF8(u8 r0)
+{
+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, 0x20\n\
+lsls r0, 24\n\
+lsrs r6, r0, 24\n\
+movs r0, 0\n\
+str r0, [sp, 0x18]\n\
+cmp r6, 0xA\n\
+beq _08116F1E\n\
+cmp r6, 0xA\n\
+bgt _08116F1A\n\
+cmp r6, 0x5\n\
+beq _08116F1E\n\
+b _08116F7C\n\
+_08116F1A:\n\
+cmp r6, 0xF\n\
+bne _08116F7C\n\
+_08116F1E:\n\
+adds r0, r6, 0x1\n\
+lsls r0, 24\n\
+lsrs r4, r0, 24\n\
+adds r0, r6, 0x5\n\
+ldr r7, _08116F70 @ =0x020190b8\n\
+cmp r4, r0\n\
+bge _08116F5E\n\
+adds r1, r7, 0\n\
+subs r1, 0xB8\n\
+ldr r3, _08116F74 @ =gUnknown_083F8C00\n\
+ldr r5, [r1, 0x8]\n\
+adds r6, r3, 0\n\
+adds r6, 0x8\n\
+adds r2, r0, 0\n\
+_08116F3A:\n\
+lsls r0, r4, 2\n\
+adds r0, r4\n\
+lsls r1, r0, 2\n\
+adds r0, r1, r6\n\
+ldr r0, [r0]\n\
+ands r0, r5\n\
+cmp r0, 0\n\
+bne _08116F54\n\
+adds r0, r1, r3\n\
+ldrh r0, [r0, 0x10]\n\
+ldr r1, [sp, 0x18]\n\
+orrs r1, r0\n\
+str r1, [sp, 0x18]\n\
+_08116F54:\n\
+adds r0, r4, 0x1\n\
+lsls r0, 24\n\
+lsrs r4, r0, 24\n\
+cmp r4, r2\n\
+blt _08116F3A\n\
+_08116F5E:\n\
+ldr r0, _08116F78 @ =0x0000dfff\n\
+ldr r2, [sp, 0x18]\n\
+ands r2, r0\n\
+str r2, [sp, 0x18]\n\
+adds r0, r7, 0\n\
+adds r1, r2, 0\n\
+bl sub_8124CE8\n\
+b _0811713C\n\
+.align 2, 0\n\
+_08116F70: .4byte 0x020190b8\n\
+_08116F74: .4byte gUnknown_083F8C00\n\
+_08116F78: .4byte 0x0000dfff\n\
+_08116F7C:\n\
+mov r0, sp\n\
+ldr r1, _08116FC8 @ =gUnknown_083F8E9C\n\
+ldm r1!, {r2-r4}\n\
+stm r0!, {r2-r4}\n\
+ldm r1!, {r2-r4}\n\
+stm r0!, {r2-r4}\n\
+subs r0, r6, 0x1\n\
+lsls r0, 24\n\
+lsrs r0, 24\n\
+movs r3, 0x1\n\
+mov r10, r3\n\
+cmp r0, 0x3\n\
+bhi _08116F9A\n\
+movs r4, 0x3\n\
+mov r10, r4\n\
+_08116F9A:\n\
+adds r0, r6, 0\n\
+movs r1, 0x5\n\
+bl __udivsi3\n\
+lsls r0, 24\n\
+lsrs r0, 8\n\
+ldr r1, _08116FCC @ =0xffff0000\n\
+adds r0, r1\n\
+lsrs r7, r0, 16\n\
+adds r0, r6, 0\n\
+movs r1, 0x5\n\
+bl __umodsi3\n\
+lsls r0, 24\n\
+lsrs r0, 24\n\
+cmp r0, 0x2\n\
+beq _08116FF8\n\
+cmp r0, 0x2\n\
+bgt _08116FD4\n\
+cmp r0, 0x1\n\
+beq _08116FE4\n\
+ldr r4, _08116FD0 @ =0x02019000\n\
+b _0811703A\n\
+.align 2, 0\n\
+_08116FC8: .4byte gUnknown_083F8E9C\n\
+_08116FCC: .4byte 0xffff0000\n\
+_08116FD0: .4byte 0x02019000\n\
+_08116FD4:\n\
+cmp r0, 0x3\n\
+beq _0811700C\n\
+cmp r0, 0x4\n\
+beq _08117020\n\
+ldr r4, _08116FE0 @ =0x02019000\n\
+b _0811703A\n\
+.align 2, 0\n\
+_08116FE0: .4byte 0x02019000\n\
+_08116FE4:\n\
+ldr r3, _08116FF0 @ =gSprites\n\
+ldr r2, _08116FF4 @ =0x02019000\n\
+adds r0, r2, 0\n\
+adds r0, 0x43\n\
+b _08117028\n\
+.align 2, 0\n\
+_08116FF0: .4byte gSprites\n\
+_08116FF4: .4byte 0x02019000\n\
+_08116FF8:\n\
+ldr r3, _08117004 @ =gSprites\n\
+ldr r2, _08117008 @ =0x02019000\n\
+adds r0, r2, 0\n\
+adds r0, 0x44\n\
+b _08117028\n\
+.align 2, 0\n\
+_08117004: .4byte gSprites\n\
+_08117008: .4byte 0x02019000\n\
+_0811700C:\n\
+ldr r3, _08117018 @ =gSprites\n\
+ldr r2, _0811701C @ =0x02019000\n\
+adds r0, r2, 0\n\
+adds r0, 0x45\n\
+b _08117028\n\
+.align 2, 0\n\
+_08117018: .4byte gSprites\n\
+_0811701C: .4byte 0x02019000\n\
+_08117020:\n\
+ldr r3, _08117088 @ =gSprites\n\
+ldr r2, _0811708C @ =0x02019000\n\
+adds r0, r2, 0\n\
+adds r0, 0x46\n\
+_08117028:\n\
+ldrb r1, [r0]\n\
+lsls r0, r1, 4\n\
+adds r0, r1\n\
+lsls r0, 2\n\
+adds r0, r3\n\
+ldrb r0, [r0, 0x5]\n\
+lsrs r0, 4\n\
+lsls r7, r0, 4\n\
+adds r4, r2, 0\n\
+_0811703A:\n\
+mov r2, r10\n\
+cmp r2, 0x1\n\
+bne _08117094\n\
+ldr r1, _08117090 @ =gUnknown_083F8C00\n\
+lsls r2, r6, 2\n\
+adds r0, r2, r6\n\
+lsls r0, 2\n\
+adds r1, 0x8\n\
+adds r0, r1\n\
+ldr r1, [r4, 0x8]\n\
+ldr r0, [r0]\n\
+ands r1, r0\n\
+str r2, [sp, 0x1C]\n\
+cmp r1, 0\n\
+bne _0811713C\n\
+adds r0, r6, 0\n\
+movs r1, 0x5\n\
+bl __udivsi3\n\
+lsls r0, 24\n\
+lsrs r0, 24\n\
+subs r1, r0, 0x1\n\
+lsls r1, 3\n\
+mov r3, sp\n\
+adds r2, r3, r1\n\
+ldrh r1, [r2, 0x2]\n\
+adds r1, r7, r1\n\
+strh r1, [r2, 0x2]\n\
+adds r1, r4, 0\n\
+adds r1, 0xB8\n\
+lsls r0, 3\n\
+subs r0, 0x8\n\
+adds r2, r3, r0\n\
+adds r0, r1, 0\n\
+movs r1, 0xD\n\
+bl sub_812492C\n\
+b _08117122\n\
+.align 2, 0\n\
+_08117088: .4byte gSprites\n\
+_0811708C: .4byte 0x02019000\n\
+_08117090: .4byte gUnknown_083F8C00\n\
+_08117094:\n\
+movs r4, 0\n\
+lsls r0, r6, 2\n\
+str r0, [sp, 0x1C]\n\
+ldr r1, _0811714C @ =0x02019000\n\
+mov r8, r1\n\
+ldr r2, _08117150 @ =gUnknown_083F8C00\n\
+mov r9, r2\n\
+_081170A2:\n\
+lsls r0, r4, 2\n\
+adds r0, r4\n\
+adds r0, r6, r0\n\
+adds r0, 0x5\n\
+lsls r0, 24\n\
+lsrs r2, r0, 24\n\
+lsls r0, r2, 2\n\
+adds r0, r2\n\
+lsls r5, r0, 2\n\
+mov r0, r9\n\
+adds r0, 0x8\n\
+adds r0, r5, r0\n\
+mov r3, r8\n\
+ldr r1, [r3, 0x8]\n\
+ldr r0, [r0]\n\
+ands r1, r0\n\
+cmp r1, 0\n\
+bne _0811710E\n\
+adds r0, r2, 0\n\
+movs r1, 0x5\n\
+bl __udivsi3\n\
+lsls r0, 24\n\
+lsrs r0, 24\n\
+subs r1, r0, 0x1\n\
+lsls r1, 3\n\
+mov r3, sp\n\
+adds r2, r3, r1\n\
+ldrh r1, [r2, 0x2]\n\
+adds r1, r7, r1\n\
+strh r1, [r2, 0x2]\n\
+adds r1, r4, 0\n\
+adds r1, 0xD\n\
+lsls r1, 24\n\
+lsrs r1, 24\n\
+lsls r0, 3\n\
+subs r0, 0x8\n\
+adds r2, r3, r0\n\
+mov r0, r8\n\
+adds r0, 0xB8\n\
+bl sub_812492C\n\
+mov r0, r10\n\
+cmp r0, 0x3\n\
+bne _08117104\n\
+mov r1, r9\n\
+adds r0, r5, r1\n\
+ldrh r0, [r0, 0x10]\n\
+str r0, [sp, 0x18]\n\
+_08117104:\n\
+mov r0, r10\n\
+subs r0, 0x1\n\
+lsls r0, 24\n\
+lsrs r0, 24\n\
+mov r10, r0\n\
+_0811710E:\n\
+adds r0, r4, 0x1\n\
+lsls r0, 24\n\
+lsrs r4, r0, 24\n\
+cmp r4, 0x2\n\
+bls _081170A2\n\
+mov r2, r10\n\
+cmp r2, 0x2\n\
+beq _08117122\n\
+movs r3, 0\n\
+str r3, [sp, 0x18]\n\
+_08117122:\n\
+ldr r0, _08117154 @ =0x020190b8\n\
+ldr r2, _08117150 @ =gUnknown_083F8C00\n\
+ldr r4, [sp, 0x1C]\n\
+adds r1, r4, r6\n\
+lsls r1, 2\n\
+adds r1, r2\n\
+ldrh r1, [r1, 0x10]\n\
+ldr r2, [sp, 0x18]\n\
+orrs r2, r1\n\
+str r2, [sp, 0x18]\n\
+adds r1, r2, 0\n\
+bl sub_8124CE8\n\
+_0811713C:\n\
+add sp, 0x20\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\
+_0811714C: .4byte 0x02019000\n\
+_08117150: .4byte gUnknown_083F8C00\n\
+_08117154: .4byte 0x020190b8\n\
+.syntax divided\n");
+}
+#endif
+
+#ifdef NONMATCHING //not enough stack usage
+void sub_8117158(u8 r0)
+{
+ u8 i;
+ u8 l;
+ u8 v[0x5];
+ u8 z;
+ u8 var0;
+ u8 var1;
+ u16 var2;
+ eRoulette->var2A = 0x1;
+ sub_8117AA8(0x0, 0x0);
+ sub_8124E2C(&gBGTilemapBuffers[2][0], ewram18800, 0xE, 0x7, 0x10, 0xD);
+ switch(r0)
+ {
+ case 0x0:
+ return;
+ case 0x1 ... 0x4:
+ l = 0x4;
+ for (i = 0x0; i < l; i++)
+ v[i] = i * 0x5 + r0;
+ break;
+ case 0x5:
+ case 0xA:
+ case 0xF:
+ l = 0x5;
+ for (i = 0x0; i < l; i++)
+ v[i] = i + r0;
+ break;
+ default:
+ l = 0x1;
+ v[0] = r0;
+ }
+ for (i = 0x0; i < l; i++)
+ {
+ //_0811727C
+ var0 = gUnknown_083F8C00[v[i]].var06;
+ var1 = gUnknown_083F8C00[v[i]].var03;
+ for (z = 0; z < 0x3; z++)
+ {
+ var2 = (gUnknown_083F8C00[v[i]].var04 + z) * 0x20;
+ gBGTilemapBuffers[2][var2 + var1 + 0x0] = ewram189a0[(var0 + z) * 0x3 + 0x0];
+ gBGTilemapBuffers[2][var2 + var1 + 0x1] = ewram189a0[(var0 + z) * 0x3 + 0x1];
+ gBGTilemapBuffers[2][var2 + var1 + 0x2] = ewram189a0[(var0 + z) * 0x3 + 0x2];
+ }
+ //_08117350
+ }
+}
+#else
+__attribute__((naked))
+void sub_8117158(u8 r0)
+{
+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, 0x24\n\
+lsls r0, 24\n\
+lsrs r5, r0, 24\n\
+ldr r4, _0811719C @ =0x02019000\n\
+movs r0, 0x1\n\
+strh r0, [r4, 0x2A]\n\
+movs r0, 0\n\
+movs r1, 0\n\
+bl sub_8117AA8\n\
+ldr r0, _081171A0 @ =gBGTilemapBuffers + 0x800\n\
+ldr r1, _081171A4 @ =0xfffff800\n\
+adds r4, r1\n\
+movs r1, 0x10\n\
+str r1, [sp]\n\
+movs r1, 0xD\n\
+str r1, [sp, 0x4]\n\
+adds r1, r4, 0\n\
+movs r2, 0xE\n\
+movs r3, 0x7\n\
+bl sub_8124E2C\n\
+cmp r5, 0xF\n\
+bhi _08117250\n\
+lsls r0, r5, 2\n\
+ldr r1, _081171A8 @ =_081171AC\n\
+adds r0, r1\n\
+ldr r0, [r0]\n\
+mov pc, r0\n\
+.align 2, 0\n\
+_0811719C: .4byte 0x02019000\n\
+_081171A0: .4byte gBGTilemapBuffers + 0x800\n\
+_081171A4: .4byte 0xfffff800\n\
+_081171A8: .4byte _081171AC\n\
+.align 2, 0\n\
+_081171AC:\n\
+.4byte _08117360\n\
+.4byte _081171EC\n\
+.4byte _081171EC\n\
+.4byte _081171EC\n\
+.4byte _081171EC\n\
+.4byte _08117220\n\
+.4byte _08117250\n\
+.4byte _08117250\n\
+.4byte _08117250\n\
+.4byte _08117250\n\
+.4byte _08117220\n\
+.4byte _08117250\n\
+.4byte _08117250\n\
+.4byte _08117250\n\
+.4byte _08117250\n\
+.4byte _08117220\n\
+_081171EC:\n\
+movs r0, 0x4\n\
+str r0, [sp, 0x18]\n\
+add r1, sp, 0x8\n\
+movs r0, 0\n\
+strb r0, [r1]\n\
+adds r0, r1, 0\n\
+ldrb r0, [r0]\n\
+cmp r0, 0x3\n\
+bhi _08117258\n\
+add r4, sp, 0x10\n\
+adds r3, r1, 0\n\
+_08117202:\n\
+ldrb r2, [r3]\n\
+adds r2, r4\n\
+ldrb r1, [r3]\n\
+lsls r0, r1, 2\n\
+adds r0, r1\n\
+adds r0, r5, r0\n\
+strb r0, [r2]\n\
+ldrb r0, [r3]\n\
+adds r0, 0x1\n\
+strb r0, [r3]\n\
+ldrb r0, [r3]\n\
+ldr r1, [sp, 0x18]\n\
+cmp r0, r1\n\
+bcc _08117202\n\
+b _08117258\n\
+_08117220:\n\
+movs r0, 0x5\n\
+str r0, [sp, 0x18]\n\
+add r1, sp, 0x8\n\
+movs r0, 0\n\
+strb r0, [r1]\n\
+adds r0, r1, 0\n\
+ldrb r0, [r0]\n\
+cmp r0, 0x4\n\
+bhi _08117258\n\
+add r3, sp, 0x10\n\
+adds r2, r1, 0\n\
+_08117236:\n\
+ldrb r1, [r2]\n\
+adds r1, r3\n\
+ldrb r0, [r2]\n\
+adds r0, r5, r0\n\
+strb r0, [r1]\n\
+ldrb r0, [r2]\n\
+adds r0, 0x1\n\
+strb r0, [r2]\n\
+ldrb r0, [r2]\n\
+ldr r1, [sp, 0x18]\n\
+cmp r0, r1\n\
+bcc _08117236\n\
+b _08117258\n\
+_08117250:\n\
+movs r0, 0x1\n\
+str r0, [sp, 0x18]\n\
+add r0, sp, 0x10\n\
+strb r5, [r0]\n\
+_08117258:\n\
+add r1, sp, 0x8\n\
+movs r0, 0\n\
+strb r0, [r1]\n\
+adds r0, r1, 0\n\
+ldrb r0, [r0]\n\
+ldr r1, [sp, 0x18]\n\
+cmp r0, r1\n\
+bcs _08117360\n\
+mov r0, sp\n\
+adds r0, 0xE\n\
+str r0, [sp, 0x1C]\n\
+add r1, sp, 0x10\n\
+mov r9, r1\n\
+add r0, sp, 0x8\n\
+mov r12, r0\n\
+mov r1, sp\n\
+adds r1, 0xA\n\
+str r1, [sp, 0x20]\n\
+_0811727C:\n\
+mov r1, r12\n\
+ldrb r0, [r1]\n\
+add r0, r9\n\
+ldrb r1, [r0]\n\
+lsls r0, r1, 2\n\
+adds r0, r1\n\
+lsls r0, 2\n\
+ldr r1, _08117370 @ =gUnknown_083F8C00\n\
+adds r0, r1\n\
+ldrb r0, [r0, 0x6]\n\
+ldr r1, [sp, 0x1C]\n\
+strb r0, [r1]\n\
+mov r1, r12\n\
+ldrb r0, [r1]\n\
+add r0, r9\n\
+ldrb r1, [r0]\n\
+lsls r0, r1, 2\n\
+adds r0, r1\n\
+lsls r0, 2\n\
+ldr r1, _08117370 @ =gUnknown_083F8C00\n\
+adds r0, r1\n\
+ldrb r0, [r0, 0x3]\n\
+ldr r1, [sp, 0x20]\n\
+strh r0, [r1]\n\
+mov r4, sp\n\
+adds r4, 0x9\n\
+movs r0, 0\n\
+strb r0, [r4]\n\
+ldrb r0, [r4]\n\
+cmp r0, 0x2\n\
+bhi _08117350\n\
+add r5, sp, 0xC\n\
+ldr r7, [sp, 0x20]\n\
+ldr r0, _08117374 @ =gBGTilemapBuffers + 0x800\n\
+mov r8, r0\n\
+ldr r6, [sp, 0x1C]\n\
+ldr r1, _08117378 @ =0x020189a0\n\
+mov r10, r1\n\
+_081172C8:\n\
+mov r1, r12\n\
+ldrb r0, [r1]\n\
+add r0, r9\n\
+ldrb r0, [r0]\n\
+lsls r1, r0, 2\n\
+adds r1, r0\n\
+lsls r1, 2\n\
+ldr r0, _08117370 @ =gUnknown_083F8C00\n\
+adds r1, r0\n\
+adds r3, r4, 0\n\
+ldrb r0, [r4]\n\
+ldrb r1, [r1, 0x4]\n\
+adds r0, r1\n\
+lsls r0, 5\n\
+strh r0, [r5]\n\
+ldrh r0, [r7]\n\
+ldrh r2, [r5]\n\
+adds r2, r0\n\
+lsls r2, 1\n\
+add r2, r8\n\
+ldrb r0, [r6]\n\
+ldrb r1, [r4]\n\
+adds r1, r0\n\
+lsls r0, r1, 1\n\
+adds r0, r1\n\
+lsls r0, 1\n\
+add r0, r10\n\
+ldrh r0, [r0]\n\
+strh r0, [r2]\n\
+ldrh r0, [r7]\n\
+ldrh r2, [r5]\n\
+adds r2, r0\n\
+adds r2, 0x1\n\
+lsls r2, 1\n\
+add r2, r8\n\
+ldrb r0, [r6]\n\
+ldrb r1, [r4]\n\
+adds r1, r0\n\
+lsls r0, r1, 1\n\
+adds r0, r1\n\
+lsls r0, 1\n\
+mov r1, r10\n\
+adds r1, 0x2\n\
+adds r0, r1\n\
+ldrh r0, [r0]\n\
+strh r0, [r2]\n\
+ldrh r0, [r7]\n\
+ldrh r2, [r5]\n\
+adds r2, r0\n\
+adds r2, 0x2\n\
+lsls r2, 1\n\
+add r2, r8\n\
+ldrb r0, [r6]\n\
+ldrb r1, [r4]\n\
+adds r1, r0\n\
+lsls r0, r1, 1\n\
+adds r0, r1\n\
+lsls r0, 1\n\
+ldr r1, _0811737C @ =0x020189a4\n\
+adds r0, r1\n\
+ldrh r0, [r0]\n\
+strh r0, [r2]\n\
+ldrb r0, [r4]\n\
+adds r0, 0x1\n\
+strb r0, [r4]\n\
+ldrb r0, [r3]\n\
+cmp r0, 0x2\n\
+bls _081172C8\n\
+_08117350:\n\
+mov r1, r12\n\
+ldrb r0, [r1]\n\
+adds r0, 0x1\n\
+strb r0, [r1]\n\
+ldrb r0, [r1]\n\
+ldr r1, [sp, 0x18]\n\
+cmp r0, r1\n\
+bcc _0811727C\n\
+_08117360:\n\
+add sp, 0x24\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\
+_08117370: .4byte gUnknown_083F8C00\n\
+_08117374: .4byte gBGTilemapBuffers + 0x800\n\
+_08117378: .4byte 0x020189a0\n\
+_0811737C: .4byte 0x020189a4\n\
+.syntax divided\n");
+}
+#endif
+
+#ifdef NONMATCHING
+u8 sub_8117380(u8 r0)
+{
+ u8 var0[0x5];
+ u8 t;
+ u8 z;
+ memcpy(var0, gUnknown_083F8EF4, 0x5);
+ if (r0 > 0x13)
+ r0 = 0x0;
+ switch (gUnknown_083F8C00[r0].var01_0)
+ {
+ case 0x3:
+ z = r0 / 0x5 - 0x1;
+ if (eRoulette->var16[z] > 0x3)
+ return 0x0;
+ return var0[eRoulette->var16[z] + 0x1];
+ case 0x4:
+ t = r0 - 0x1;
+ if (eRoulette->var12[t] > 0x2)
+ return 0x0;
+ return var0[eRoulette->var12[t] + 0x2];
+ case 0xC:
+ if (eRoulette->var08 & gUnknown_083F8C00[r0].var08)
+ return 0x0;
+ return var0[0x4];
+ default:
+ }
+ return 0x0;
+}
+#else
+__attribute__((naked))
+u8 sub_8117380(u8 r0)
+{
+asm(".syntax unified\n\
+push {r4,lr}\n\
+sub sp, 0x8\n\
+lsls r0, 24\n\
+lsrs r4, r0, 24\n\
+ldr r1, _081173B8 @ =gUnknown_083F8EF4\n\
+mov r0, sp\n\
+movs r2, 0x5\n\
+bl memcpy\n\
+cmp r4, 0x13\n\
+bls _08117398\n\
+movs r4, 0\n\
+_08117398:\n\
+ldr r3, _081173BC @ =gUnknown_083F8C00\n\
+lsls r0, r4, 2\n\
+adds r0, r4\n\
+lsls r2, r0, 2\n\
+adds r0, r2, r3\n\
+ldrb r0, [r0, 0x1]\n\
+lsls r0, 28\n\
+lsrs r0, 28\n\
+cmp r0, 0x4\n\
+beq _081173EC\n\
+cmp r0, 0x4\n\
+bgt _081173C0\n\
+cmp r0, 0x3\n\
+beq _081173C6\n\
+b _08117428\n\
+.align 2, 0\n\
+_081173B8: .4byte gUnknown_083F8EF4\n\
+_081173BC: .4byte gUnknown_083F8C00\n\
+_081173C0:\n\
+cmp r0, 0xC\n\
+beq _0811740C\n\
+b _08117428\n\
+_081173C6:\n\
+adds r0, r4, 0\n\
+movs r1, 0x5\n\
+bl __udivsi3\n\
+subs r0, 0x1\n\
+lsls r0, 24\n\
+lsrs r4, r0, 24\n\
+ldr r0, _081173E8 @ =0x02019000\n\
+adds r0, 0x16\n\
+adds r1, r4, r0\n\
+ldrb r0, [r1]\n\
+cmp r0, 0x3\n\
+bhi _08117428\n\
+ldrb r0, [r1]\n\
+adds r0, 0x1\n\
+b _08117402\n\
+.align 2, 0\n\
+_081173E8: .4byte 0x02019000\n\
+_081173EC:\n\
+subs r0, r4, 0x1\n\
+lsls r0, 24\n\
+lsrs r4, r0, 24\n\
+ldr r0, _08117408 @ =0x02019000\n\
+adds r0, 0x12\n\
+adds r1, r4, r0\n\
+ldrb r0, [r1]\n\
+cmp r0, 0x2\n\
+bhi _08117428\n\
+ldrb r0, [r1]\n\
+adds r0, 0x2\n\
+_08117402:\n\
+add r0, sp\n\
+ldrb r0, [r0]\n\
+b _0811742A\n\
+.align 2, 0\n\
+_08117408: .4byte 0x02019000\n\
+_0811740C:\n\
+ldr r1, _08117424 @ =0x02019000\n\
+adds r0, r3, 0\n\
+adds r0, 0x8\n\
+adds r0, r2, r0\n\
+ldr r1, [r1, 0x8]\n\
+ldr r0, [r0]\n\
+ands r1, r0\n\
+cmp r1, 0\n\
+bne _08117428\n\
+mov r0, sp\n\
+ldrb r0, [r0, 0x4]\n\
+b _0811742A\n\
+.align 2, 0\n\
+_08117424: .4byte 0x02019000\n\
+_08117428:\n\
+movs r0, 0\n\
+_0811742A:\n\
+add sp, 0x8\n\
+pop {r4}\n\
+pop {r1}\n\
+bx r1\n\
+.syntax divided\n");
+}
+#endif
+
+void sub_8117434(void)
+{
+ s32 x1;
+ s32 x2;
+ REG_BG2PA = eRoulette->var2C.a;
+ REG_BG2PB = eRoulette->var2C.b;
+ REG_BG2PC = eRoulette->var2C.c;
+ REG_BG2PD = eRoulette->var2C.d;
+ x1 = 0x7400 - eRoulette->var2C.a * (gSpriteCoordOffsetX + 0x74)
+ - eRoulette->var2C.b * (gSpriteCoordOffsetY + 0x50);
+ x2 = 0x5400 - eRoulette->var2C.c * (gSpriteCoordOffsetX + 0x74)
+ - eRoulette->var2C.d * (gSpriteCoordOffsetY + 0x50);
+ REG_BG2X_L = x1;
+ REG_BG2X_H = (x1 & 0x0fff0000) >> 16;
+ REG_BG2Y_L = x2;
+ REG_BG2Y_H = (x2 & 0x0fff0000) >> 16;
+}
+
+s16 sub_81174C4(s16 r0, s16 r1)
+{
+ s32 t = r0 * r1;
+ t /= 0x100;
+ return t;
+}
+
+s16 sub_81174E0(s16 r0)
+{
+ s32 t = 0x10000;
+ return t / r0;
+}
+
+void sub_81174F8(u8 r0)
+{
+ DisplayYesNoMenu(0x14, 0x8, 0x1);
+ sub_814AAF8(0x2D9E);
+ DoYesNoFuncWithChoice(r0, &gUnknown_083F8EB4);
+}
+
+void sub_8117528(u8 taskid)
+{
+ if (!gPaletteFade.active)
+ {
+ SetVBlankCallback(NULL);
+ SetMainCallback2(&sub_8115384);
+ DestroyTask(taskid);
+ }
+}
+
+void sub_811755C(u8 taskid)
+{
+ MenuZeroFillWindowRect(0x14, 0x8, 0x1A, 0xD);
+ MenuZeroFillScreen();
+ BeginNormalPaletteFade(-0x1, 0x0, 0x0, 0x10, 0x0);
+ gPaletteFade.delayCounter = gPaletteFade.multipurpose2;
+ UpdatePaletteFade();
+ gTasks[taskid].func = &sub_8117528;
+}
+
+void sub_81175C0(u8 taskid)
+{
+ MenuZeroFillScreen();
+ ScriptContext2_Disable();
+ DestroyTask(taskid);
+}
+
+void sub_81175DC(u8 taskid)
+{
+ gTasks[taskid].data[0]++;
+ if (!(gMain.newKeys & (A_BUTTON | B_BUTTON)) && gTasks[taskid].data[0] < 0x3D)
+ return;
+ gSpecialVar_0x8004 = 0x1;
+ MenuZeroFillScreen();
+ ScriptContext2_Disable();
+ DestroyTask(taskid);
+}
+
+void sub_8117630(u8 taskid)
+{
+ u32 temp = gUnknown_083F8DF0[(gSpecialVar_0x8004 & 0x1) + (gSpecialVar_0x8004 >> 0x7 << 0x1)];
+ ConvertIntToDecimalStringN(gStringVar1, temp, 0x2, 0x1);
+ StringExpandPlaceholders(gStringVar4, &gUnknown_081C40DF);
+ MenuDrawTextWindow(0x0, 0xE, 0x1D, 0x13);
+ MenuPrint(gStringVar4, 0x1, 0xF);
+ gTasks[taskid].func = &sub_81174F8;
+}
+
+void Task_Roulette_0(u8 taskid)
+{
+ s32 temp;
+ ConvertIntToDecimalStringN(gStringVar1, gTasks[taskid].data[0xD], 0x1, 0x4);
+ StringExpandPlaceholders(gStringVar4, gOtherText_Coins);
+ MenuDrawTextWindow(0x0, 0x0, 0x9, 0x3);
+ MenuPrint_RightAligned(gStringVar4, 0x9, 0x1);
+ temp = gUnknown_083F8DF0[(gSpecialVar_0x8004 & 0x1) + (gSpecialVar_0x8004 >> 0x7 << 0x1)];
+ ConvertIntToDecimalStringN(gStringVar1, temp, 0x2, 0x1);
+ if (gTasks[taskid].data[0xD] >= temp)
+ {
+ if ((gSpecialVar_0x8004 & 0x80) && (gSpecialVar_0x8004 & 0x1))
+ {
+ MenuDrawTextWindow(0x0, 0xE, 0x1D, 0x13);
+ MenuPrint(&gUnknown_081C4139, 0x1, 0xF);
+ sub_8116C34(taskid , &sub_8117630, 0xFFFF, 0x3);
+ }
+ else
+ {
+ StringExpandPlaceholders(gStringVar4, &gUnknown_081C40DF);
+ MenuDrawTextWindow(0x0, 0xE, 0x1D, 0x13);
+ MenuPrint(gStringVar4, 0x1, 0xF);
+ gTasks[taskid].func = &sub_81174F8;
+ }
+ }
+ else
+ {
+ StringExpandPlaceholders(gStringVar4, &gUnknown_081C411C);
+ MenuDrawTextWindow(0x0, 0xE, 0x1D, 0x13);
+ MenuPrint(gStringVar4, 0x1, 0xF);
+ gTasks[taskid].func = &sub_81175DC;
+ gTasks[taskid].data[0xD] = 0x0;
+ gTasks[taskid].data[0x0] = 0x0;
+ }
+}
+
+void PlayRoulette(void)
+{
+ u8 taskid;
+ ScriptContext2_Enable();
+ taskid = CreateTask(&Task_Roulette_0, 0x0);
+ gTasks[taskid].data[0xD] = gSaveBlock1.coins;
+}
+
+void sub_8117838(u8 r0)
+{
+ if (!r0)
+ {
+ FreeAllSpritePalettes();
+ LoadSpritePalettes(&gUnknown_083F9E30);
+ LZ77UnCompWram(gUnknown_083F92A8, ewram17000);
+ LZ77UnCompWram(gUnknown_083F90FC, ewram17E00);
+ LZ77UnCompWram(gUnknown_083F9D3C, ewram18000);
+ }
+ else
+ {
+ FreeAllSpritePalettes();
+ }
+}
+
+u8 sub_8117890(const struct SpriteTemplate *r0, u8 r1, u16 *r2)
+{
+ u16 temp;
+ u8 spriteid = CreateSprite(r0, 0x74, 0x50, r0->oam->y);
+ gSprites[spriteid].data[0] = *r2;
+ gSprites[spriteid].data[1] = r1;
+ gSprites[spriteid].coordOffsetEnabled = TRUE;
+ gSprites[spriteid].animPaused = TRUE;
+ gSprites[spriteid].affineAnimPaused = TRUE;
+ temp = *r2;
+ *r2 += 0x1E;
+ if (*r2 > 0x167)
+ *r2 = temp - 0x14A;
+ return spriteid;
+}
+
+void sub_8117900(void)
+{
+ u8 i, j;
+ u8 spriteid;
+ struct SpriteSheet s;
+ LZ77UnCompWram(gUnknown_083F9F54.data, gSharedMem);
+ s.data = gSharedMem;
+ s.size = gUnknown_083F9F54.size;
+ s.tag = gUnknown_083F9F54.tag;
+ LoadSpriteSheet(&s);
+ LZ77UnCompWram(gUnknown_083F9F5C.data, gSharedMem);
+ s.data = gSharedMem;
+ s.size = gUnknown_083F9F5C.size;
+ s.tag = gUnknown_083F9F5C.tag;
+ LoadSpriteSheet(&s);
+ for (i = 0; i < 0x3; i++)
+ {
+ u8 o = i * 0x18;
+ for (j = 0; j < 0x4; j++)
+ {
+ spriteid = eRoulette->var3C[0x1D + i * 0x4 + j] =
+ CreateSprite(&gSpriteTemplate_83FA07C[j], j * 0x18 + 0x94, o + 0x5C, 0x1E);
+ gSprites[spriteid].animPaused = TRUE;
+ o += 0x18;
+ if (o > 0x47)
+ o = 0x0;
+ }
+ }
+ for (i = 0x0; i < 0x4; i++)
+ {
+ spriteid = eRoulette->var3C[0x29 + i] =
+ CreateSprite(&gSpriteTemplate_83F9FD4[i], (s16)(i * 0x18 + 0x94), 0x46, 0x1E);
+ gSprites[spriteid].animPaused = TRUE;
+ }
+ for (i = 0x0; i < 0x3; i++)
+ {
+ spriteid = eRoulette->var3C[0x2D + i] =
+ CreateSprite(&gSpriteTemplate_83FA034[i], 0x7E, (s16)(i * 0x18 + 0x5C), 0x1E);
+ gSprites[spriteid].animPaused = TRUE;
+ }
+}
+
+void unref_sub_8117A74(void) //destroy all sprites at 0x1D
+{
+ u8 i;
+ for (i = 0x0; i < 0xC; i++)
+ DestroySprite(&gSprites[eRoulette->var3C[0x1D + i]]);
+}
+
+void sub_8117AA8(u8 r0, u8 r1)
+{
+ u8 i;
+ switch(r0)
+ {
+ case 0x1:
+ for (i = 0x0; i < 0x13; i++)
+ gSprites[eRoulette->var3C[0x1D + i]].invisible = TRUE;
+ break;
+ case 0x0:
+ for (i = 0x0; i < 0xC; i++)
+ {
+ if (!(eRoulette->var08 & gUnknown_083F8D90[i].var04))
+ gSprites[eRoulette->var3C[0x1D + i]].invisible = FALSE;
+ else if(!(gUnknown_083F8D90[i].var02 == r1))
+ gSprites[eRoulette->var3C[0x1D + i]].invisible = TRUE;
+ else
+ gSprites[eRoulette->var3C[0x1D + i]].invisible = FALSE;
+ }
+ for ( ; i < 0x13; i++)
+ gSprites[eRoulette->var3C[0x1D + i]].invisible = FALSE;
+ break;
+ }
+}
+
+void sub_8117BBC(void)
+{
+ u8 i;
+ for (i = 0x0; i < 0x6; i++)
+ {
+ eRoulette->var3C[0x31 + i] = CreateSprite(&gSpriteTemplate_83FA40C, 0x74, 0x14, 0xA);
+ gSprites[eRoulette->var3C[0x31 + i]].invisible = TRUE;
+ gSprites[eRoulette->var3C[0x31 + i]].data[0] = 0x1;
+ gSprites[eRoulette->var3C[0x31 + i]].callback = &sub_81184CC;
+ gSprites[eRoulette->var3C[0x31 + i]].oam.priority = 0x1;
+ StartSpriteAnim(&gSprites[eRoulette->var3C[0x31 + i]], 0x8);
+ }
+}
+
+void sub_8117C60(u8 r0, u8 r1)
+{
+ u8 i = 0x0;
+ if (r0)
+ {
+ for ( ; i < 0x6; i++)
+ gSprites[eRoulette->var3C[0x31 + i]].invisible = TRUE;
+ }
+ else
+ {
+ for ( ; i < 0x6; i++)
+ {
+ if (!(eRoulette->var0C[i]) || (i == r1))
+ {
+ gSprites[eRoulette->var3C[0x31 + i]].invisible = TRUE;
+ }
+ else
+ {
+ gSprites[eRoulette->var3C[0x31 + i]].invisible = FALSE;
+ gSprites[eRoulette->var3C[0x31 + i]].pos1.x = (gUnknown_083F8C00[eRoulette->var0C[i]].var03 + 0x1) * 0x8 + 0x4;
+ gSprites[eRoulette->var3C[0x31 + i]].pos1.y = (gUnknown_083F8C00[eRoulette->var0C[i]].var04 + 0x1) * 0x8 + 0x3;
+ }
+ }
+ }
+}
+
+void sub_8117D68(u8 r0)
+{
+ if (!r0)
+ {
+ gSprites[eRoulette->var3C[0x30]].invisible = TRUE;
+ }
+ else
+ {
+ gSprites[eRoulette->var3C[0x30]].invisible = FALSE;
+ gSprites[eRoulette->var3C[0x30]].pos1.x = (gUnknown_083F8C00[r0].var03 + 0x2) * 0x8;
+ gSprites[eRoulette->var3C[0x30]].pos1.y = (gUnknown_083F8C00[r0].var04 + 0x2) * 0x8;
+ }
+}
+
+void sub_8117DF4(void)
+{
+ u8 i, j;
+ u16 k;
+ struct SpriteSheet s;
+ LZ77UnCompWram(gUnknown_083F9EE8.data, gSharedMem);
+ s.data = gSharedMem;
+ s.size = gUnknown_083F9EE8.size;
+ s.tag = gUnknown_083F9EE8.tag;
+ LoadSpriteSheet(&s);
+ k = 0xF;
+ for (i = 0x0; i < 0x3; i++)
+ {
+ for (j = 0x0; j < 0x4; j++)
+ {
+ u8 spriteid;
+ spriteid =
+ eRoulette->var3C[0x7 + i * 0x4 + j] = sub_8117890(&gSpriteTemplate_83FA0DC[i * 0x4 + j], 0x28, &k);
+ gSprites[spriteid].animPaused = TRUE;
+ gSprites[spriteid].affineAnimPaused = TRUE;
+ }
+ }
+}
+
+#ifdef NONMATCHING
+void sub_8117E98(struct Sprite *sprite)
+{
+ struct OamMatrix *m;
+ u8 p;
+ u16 angle;
+ s16 cos, sin, z;
+ u32 cos32;
+ angle = eRoulette->var24 + sprite->data[0x0];
+ z = angle;
+ if (z > 359)
+ angle = z - 360;
+ sin = Sin2(angle);
+ cos = Cos2(angle);
+ sprite->pos2.x = sin * sprite->data[0x1] >> 0xC;
+ sprite->pos2.y = -cos * sprite->data[0x1] >> 0xC;
+ p = sprite->oam.matrixNum;
+ sin = sin / 0x10;
+ m = &gOamMatrices[p];
+ cos32 = cos / 0x10;
+
+ m->d = cos32;
+ m->a = cos32;
+ m->b = sin;
+ m->c = -sin;
+}
+#else
+__attribute__((naked))
+void sub_8117E98(struct Sprite *r0)
+{
+asm(".syntax unified\n\
+push {r4-r6,lr}\n\
+adds r6, r0, 0\n\
+ldr r0, _08117F1C @ =0x02019000\n\
+ldrh r1, [r6, 0x2E]\n\
+ldrh r0, [r0, 0x24]\n\
+adds r1, r0\n\
+lsls r1, 16\n\
+lsrs r4, r1, 16\n\
+asrs r1, 16\n\
+ldr r0, _08117F20 @ =0x00000167\n\
+cmp r1, r0\n\
+ble _08117EB8\n\
+ldr r2, _08117F24 @ =0xfffffe98\n\
+adds r0, r1, r2\n\
+lsls r0, 16\n\
+lsrs r4, r0, 16\n\
+_08117EB8:\n\
+adds r0, r4, 0\n\
+bl Sin2\n\
+lsls r0, 16\n\
+lsrs r5, r0, 16\n\
+adds r0, r4, 0\n\
+bl Cos2\n\
+lsls r2, r5, 16\n\
+asrs r2, 16\n\
+movs r3, 0x30\n\
+ldrsh r1, [r6, r3]\n\
+muls r1, r2\n\
+asrs r1, 12\n\
+strh r1, [r6, 0x24]\n\
+lsls r0, 16\n\
+asrs r4, r0, 16\n\
+negs r1, r4\n\
+movs r3, 0x30\n\
+ldrsh r0, [r6, r3]\n\
+muls r0, r1\n\
+asrs r0, 12\n\
+strh r0, [r6, 0x26]\n\
+ldrb r0, [r6, 0x3]\n\
+lsls r0, 26\n\
+lsrs r3, r0, 27\n\
+cmp r2, 0\n\
+bge _08117EF2\n\
+adds r2, 0xF\n\
+_08117EF2:\n\
+lsls r0, r2, 12\n\
+lsrs r5, r0, 16\n\
+ldr r1, _08117F28 @ =gOamMatrices\n\
+lsls r0, r3, 3\n\
+adds r1, r0, r1\n\
+adds r0, r4, 0\n\
+cmp r0, 0\n\
+bge _08117F04\n\
+adds r0, 0xF\n\
+_08117F04:\n\
+asrs r0, 4\n\
+strh r0, [r1, 0x6]\n\
+strh r0, [r1]\n\
+strh r5, [r1, 0x2]\n\
+lsls r0, r5, 16\n\
+asrs r0, 16\n\
+negs r0, r0\n\
+strh r0, [r1, 0x4]\n\
+pop {r4-r6}\n\
+pop {r0}\n\
+bx r0\n\
+.align 2, 0\n\
+_08117F1C: .4byte 0x02019000\n\
+_08117F20: .4byte 0x00000167\n\
+_08117F24: .4byte 0xfffffe98\n\
+_08117F28: .4byte gOamMatrices\n\
+.syntax divided\n");
+}
+#endif
+
+void sub_8117F2C(void)
+{
+ u8 i;
+ for (i = 0x0; i < 0x5; i++)
+ {
+ struct SpriteSheet s;
+ LZ77UnCompWram(gUnknown_083FA21C[i].data, gSharedMem);
+ s.data = gSharedMem;
+ s.size = gUnknown_083FA21C[i].size;
+ s.tag = gUnknown_083FA21C[i].tag;
+ LoadSpriteSheet(&s);
+ }
+ eRoulette->var3C[0x14] = CreateSprite(&gSpriteTemplate_83FA2B0, 0xD0, 0x10, 0x4);
+ gSprites[eRoulette->var3C[0x14]].animPaused = TRUE;
+ for (i = 0x0; i < 0x4; i++)
+ {
+ eRoulette->var3C[0x15 + i] = CreateSprite(&gSpriteTemplate_83FA2C8, (s16)(i * 0x8 + 0xC4), 0x18, 0x0);
+ gSprites[eRoulette->var3C[0x15 + i]].invisible = TRUE;
+ gSprites[eRoulette->var3C[0x15 + i]].animPaused = TRUE;
+ }
+ eRoulette->var3C[0x19] = CreateSprite(&gSpriteTemplate_83FA2E0, 0x78, 0x44, 0x4);
+ gSprites[eRoulette->var3C[0x19]].animPaused = TRUE;
+ for (i = 0x0; i < 0x3; i++)
+ {
+ eRoulette->var3C[0x1A + i] = CreateSprite(&gSpriteTemplate_83FA2F8, (s16)(i * 0x10 + 0xC0), 0x24, 0x4);
+ gSprites[eRoulette->var3C[0x1A + i]].invisible = TRUE;
+ gSprites[eRoulette->var3C[0x1A + i]].animPaused = TRUE;
+ }
+ eRoulette->var3C[0x30] = CreateSprite(&gSpriteTemplate_83FA310, 0x98, 0x60, 0x9);
+ gSprites[eRoulette->var3C[0x30]].oam.priority = 0x1;
+ gSprites[eRoulette->var3C[0x30]].animPaused = TRUE;
+ gSprites[eRoulette->var3C[0x30]].invisible = TRUE;
+}
+
+void sub_81180F4(u16 r0)
+{
+ u8 i;
+ u16 d = 1000;
+ bool8 v = FALSE;
+ for (i = 0x0; i < 0x4; i++)
+ {
+ u8 t = r0 / d;
+ gSprites[eRoulette->var3C[0x15 + i]].invisible = TRUE;
+ if (t > 0x0 || v || i == 0x3)
+ {
+ gSprites[eRoulette->var3C[0x15 + i]].invisible = FALSE;
+ gSprites[eRoulette->var3C[0x15 + i]].oam.tileNum =
+ gSprites[eRoulette->var3C[0x15 + i]].sheetTileStart
+ + (*gSprites[eRoulette->var3C[0x15 + i]].anims + t)->type;
+ v = TRUE;
+ }
+ r0 = r0 % d;
+ d = d / 10;
+ }
+}
+
+#ifdef NONMATCHING
+u8 sub_81181E8(u8 r0)
+{
+ u8 t[0x5];
+ memcpy(&t, &gUnknown_083FA608, 0x5);
+ if (r0 > 0x13)
+ r0 = 0x0;
+ switch(gUnknown_083F8C00[r0].var01_0)
+ {
+ case 0x3:
+ r0 = r0 / 0x5 - 0x1;
+ if ((u32)eRoulette->var16[r0] < 0x4)
+ return t[0x1 + eRoulette->var16[r0]]; // couldn't recreate redundant loads
+ break;
+ case 0x4:
+ r0 = r0 - 0x1;
+ if (eRoulette->var12[r0] < 0x3)
+ return t[0x2 + eRoulette->var12[r0]];
+ break;
+ case 0xC:
+ if (!(eRoulette->var08 & gUnknown_083F8C00[r0].var08))
+ return t[0x4];
+ break;
+ }
+ return 0x0;
+}
+#else
+__attribute__((naked))
+u8 sub_81181E8(u8 r0)
+{
+asm(".syntax unified\n\
+push {r4,lr}\n\
+sub sp, 0x8\n\
+lsls r0, 24\n\
+lsrs r4, r0, 24\n\
+ldr r1, _08118220 @ =gUnknown_083FA608\n\
+mov r0, sp\n\
+movs r2, 0x5\n\
+bl memcpy\n\
+cmp r4, 0x13\n\
+bls _08118200\n\
+movs r4, 0\n\
+_08118200:\n\
+ldr r3, _08118224 @ =gUnknown_083F8C00\n\
+lsls r0, r4, 2\n\
+adds r0, r4\n\
+lsls r2, r0, 2\n\
+adds r0, r2, r3\n\
+ldrb r0, [r0, 0x1]\n\
+lsls r0, 28\n\
+lsrs r0, 28\n\
+cmp r0, 0x4\n\
+beq _08118254\n\
+cmp r0, 0x4\n\
+bgt _08118228\n\
+cmp r0, 0x3\n\
+beq _0811822E\n\
+b _08118290\n\
+.align 2, 0\n\
+_08118220: .4byte gUnknown_083FA608\n\
+_08118224: .4byte gUnknown_083F8C00\n\
+_08118228:\n\
+cmp r0, 0xC\n\
+beq _08118274\n\
+b _08118290\n\
+_0811822E:\n\
+adds r0, r4, 0\n\
+movs r1, 0x5\n\
+bl __udivsi3\n\
+subs r0, 0x1\n\
+lsls r0, 24\n\
+lsrs r4, r0, 24\n\
+ldr r0, _08118250 @ =0x02019000\n\
+adds r0, 0x16\n\
+adds r1, r4, r0\n\
+ldrb r0, [r1]\n\
+cmp r0, 0x3\n\
+bhi _08118290\n\
+ldrb r0, [r1]\n\
+adds r0, 0x1\n\
+b _0811826A\n\
+.align 2, 0\n\
+_08118250: .4byte 0x02019000\n\
+_08118254:\n\
+subs r0, r4, 0x1\n\
+lsls r0, 24\n\
+lsrs r4, r0, 24\n\
+ldr r0, _08118270 @ =0x02019000\n\
+adds r0, 0x12\n\
+adds r1, r4, r0\n\
+ldrb r0, [r1]\n\
+cmp r0, 0x2\n\
+bhi _08118290\n\
+ldrb r0, [r1]\n\
+adds r0, 0x2\n\
+_0811826A:\n\
+add r0, sp\n\
+ldrb r0, [r0]\n\
+b _08118292\n\
+.align 2, 0\n\
+_08118270: .4byte 0x02019000\n\
+_08118274:\n\
+ldr r1, _0811828C @ =0x02019000\n\
+adds r0, r3, 0\n\
+adds r0, 0x8\n\
+adds r0, r2, r0\n\
+ldr r1, [r1, 0x8]\n\
+ldr r0, [r0]\n\
+ands r1, r0\n\
+cmp r1, 0\n\
+bne _08118290\n\
+mov r0, sp\n\
+ldrb r0, [r0, 0x4]\n\
+b _08118292\n\
+.align 2, 0\n\
+_0811828C: .4byte 0x02019000\n\
+_08118290:\n\
+movs r0, 0\n\
+_08118292:\n\
+add sp, 0x8\n\
+pop {r4}\n\
+pop {r1}\n\
+bx r1\n\
+.syntax divided\n");
+}
+#endif
+
+void sub_811829C(u8 r0)
+{
+ struct Sprite *s = &gSprites[eRoulette->var3C[0x19]];
+ s->animCmdIndex = sub_81181E8(r0);
+ s->oam.tileNum =
+ s->sheetTileStart
+ + (*s->anims + s->animCmdIndex)->type;
+}
+
+void sub_81182F8(u8 r0)
+{
+ u8 i;
+ u8 t = 0x0;
+ if (eRoulette->var19 == 0x1)
+ t = 0x2;
+ switch(r0)
+ {
+ case 0x6:
+ for (i = 0x0; i < 0x3; i++)
+ {
+ gSprites[eRoulette->var3C[0x1A + i]].invisible = FALSE;
+ gSprites[eRoulette->var3C[0x1A + i]].oam.tileNum =
+ gSprites[eRoulette->var3C[0x1A + i]].sheetTileStart
+ + (*gSprites[eRoulette->var3C[0x1A + i]].anims)->type;
+ }
+ break;
+ case 0x5:
+ gSprites[eRoulette->var3C[0x1C]].oam.tileNum =
+ gSprites[eRoulette->var3C[0x1C]].sheetTileStart
+ + (*gSprites[eRoulette->var3C[0x1C]].anims + t + 0x1)->type;
+ break;
+ case 0x4:
+ gSprites[eRoulette->var3C[0x1C]].oam.tileNum =
+ gSprites[eRoulette->var3C[0x1C]].sheetTileStart
+ + (*gSprites[eRoulette->var3C[0x1C]].anims + t + 0x2)->type;
+ break;
+ case 0x3:
+ gSprites[eRoulette->var3C[0x1B]].oam.tileNum =
+ gSprites[eRoulette->var3C[0x1B]].sheetTileStart
+ + (*gSprites[eRoulette->var3C[0x1B]].anims + t + 0x1)->type;
+ break;
+ case 0x2:
+ gSprites[eRoulette->var3C[0x1B]].oam.tileNum =
+ gSprites[eRoulette->var3C[0x1B]].sheetTileStart
+ + (*gSprites[eRoulette->var3C[0x1B]].anims + t + 0x2)->type;
+ break;
+ case 0x1:
+ gSprites[eRoulette->var3C[0x1A]].oam.tileNum =
+ gSprites[eRoulette->var3C[0x1A]].sheetTileStart
+ + (*gSprites[eRoulette->var3C[0x1A]].anims + t + 0x1)->type;
+ break;
+ case 0x0:
+ default:
+ for (i = 0x0; i < 0x3; i++)
+ {
+ gSprites[eRoulette->var3C[0x1A + i]].oam.tileNum =
+ gSprites[eRoulette->var3C[0x1A + i]].sheetTileStart
+ + (*gSprites[eRoulette->var3C[0x1A + i]].anims + t + 2)->type;
+ }
+ }
+}
+
+void sub_81184CC(struct Sprite *sprite)
+{
+ sprite->pos2.x = eRoulette->var26;
+}
+
+void sub_81184D8(void)
+{
+ u8 spriteid;
+ struct SpriteSheet s;
+ LZ77UnCompWram(gUnknown_083FA42C.data, gSharedMem);
+ s.data = gSharedMem;
+ s.size = gUnknown_083FA42C.size;
+ s.tag = gUnknown_083FA42C.tag;
+ LoadSpriteSheet(&s);
+ spriteid = CreateSprite(&gSpriteTemplate_83FA434, 0x74, 0x50, 0x51);
+ gSprites[spriteid].data[0] = eRoulette->var24;
+ gSprites[spriteid].data[1] = 0x0;
+ gSprites[spriteid].animPaused = TRUE;
+ gSprites[spriteid].affineAnimPaused = TRUE;
+ gSprites[spriteid].coordOffsetEnabled = TRUE;
+}
+
+void sub_8118554(struct Sprite *sprite)
+{
+ u32 t = sprite->oam.matrixNum;
+ struct OamMatrix *m = &gOamMatrices[0];
+ m[t].d = eRoulette->var2C.a;
+ m[t].a = eRoulette->var2C.a;
+ m[t].b = eRoulette->var2C.b;
+ m[t].c = eRoulette->var2C.c;
+}
+
+void sub_811857C(void)
+{
+ u8 i;
+ for (i = 0x0; i < 0x6; i++)
+ {
+ u8 spriteid =
+ eRoulette->var3C[i] = CreateSprite(&gSpriteTemplate_83FA40C, 0x74, 0x50, 0x39 - i);
+ if (spriteid != 0x40)
+ {
+ gSprites[eRoulette->var3C[i]].invisible = TRUE;
+ gSprites[eRoulette->var3C[i]].coordOffsetEnabled = TRUE;
+ }
+ }
+}
+
+void sub_81185E8(void)
+{
+ u8 t = eRoulette->var3C[0x0];
+ u8 i;
+ for (i = 0x0; i < 0x6; i++)
+ {
+ u8 j;
+ gSprites[t].invisible = TRUE;
+ gSprites[t].callback = &SpriteCallbackDummy;
+ StartSpriteAnim(&gSprites[t], 0x0);
+ for (j = 0x0; j < 0x8; j++)
+ gSprites[t].data[j] = 0x0;
+ t++;
+ }
+}
+
+s16 sub_811866C(struct Sprite *sprite)
+{
+ if (eRoulette->var24 > sprite->data[0x3])
+ {
+ sprite->data[0x6] = 360 - eRoulette->var24 + sprite->data[0x3];
+ if (sprite->data[0x6] > 359)
+ sprite->data[0x6] -=360;
+ }
+ else
+ sprite->data[0x6] = sprite->data[0x3] - eRoulette->var24;
+ return sprite->data[0x6];
+}
+
+u8 sub_81186B8(struct Sprite *sprite)
+{
+ eRoulette->var7E = (u8)(((float)(s16)sub_811866C(sprite)) / 30.0f);
+ return eRoulette->var7E;
+}
+
+s16 sub_81186E8(struct Sprite *sprite)
+{
+ s16 t = sub_811866C(sprite) % 30;
+ u16 z;
+ if (t == 0xE)
+ {
+ z = 0x0;
+ return sprite->data[0x2] = z;
+ }
+ else if (t > 0xD)
+ {
+ z = (u16)(0x2B - t);
+ return sprite->data[0x2] = z;
+ }
+ else
+ {
+ z = (u16)(0xE - t);
+ return sprite->data[0x2] = z;
+ }
+}
+
+void sub_8118724(struct Sprite *sprite)
+{
+ s16 sin, cos;
+ eRoulette->var8C += eRoulette->var90;
+ eRoulette->var88 += eRoulette->var8C;
+ if (eRoulette->var88 >= 360)
+ eRoulette->var88 -= 360.0f;
+ else
+ if (eRoulette->var88 < 0.0f)
+ eRoulette->var88 += 360.0f;
+ sprite->data[0x3] = eRoulette->var88;
+ eRoulette->var98 += eRoulette->var9C;
+ eRoulette->var94 += eRoulette->var98;
+ sprite->data[0x4] = eRoulette->var94;
+ sin = Sin2(sprite->data[0x3]);
+ cos = Cos2(sprite->data[0x3]);
+ sprite->pos2.x = sin * sprite->data[0x4] >> 0xC;
+ sprite->pos2.y = -cos * sprite->data[0x4] >> 0xC;
+ if (IsSEPlaying())
+ {
+ m4aMPlayPanpotControl(&gMPlay_SE1, 0xFFFF, sprite->pos2.x);
+ m4aMPlayPanpotControl(&gMPlay_SE2, 0xFFFF, sprite->pos2.x);
+ }
+}
+
+void sub_8118834(struct Sprite *sprite)
+{
+ s16 sin, cos;
+ sprite->data[0x3] = eRoulette->var24 + sprite->data[0x6];
+ if (sprite->data[0x3] > 359)
+ sprite->data[0x3] -= 360;
+ sin = Sin2(sprite->data[0x3]);
+ cos = Cos2(sprite->data[0x3]);
+ sprite->pos2.x = sin * sprite->data[0x4] >> 0xC;
+ sprite->pos2.y = -cos * sprite->data[0x4] >> 0xC;
+ sprite->pos2.y += gSpriteCoordOffsetY;
+}
+
+void sub_811889C(struct Sprite *sprite)
+{
+ sub_8118724(sprite);
+ sprite->data[0x2]++;
+ if ((u16)(sprite->data[0x4] + 0x84) > 0xD4)
+ sprite->invisible = TRUE;
+ else
+ sprite->invisible = FALSE;
+ if (!(sprite->data[0x2] < 30))
+ {
+ if (!sprite->data[0x0])
+ {
+ if (eRoulette->var94 <= eRoulette->varA0 - 2.0f)
+ {
+ eRoulette->var7D = 0xFF;
+ eRoulette->var03_7 = 0x0;
+ StartSpriteAnim(sprite, sprite->animCmdIndex + 0x3);
+ sub_81186B8(sprite);
+ sprite->data[0x4] = 30;
+ sub_811866C(sprite);
+ sprite->data[0x6] = (sprite->data[0x6] / 30) * 30 + 0xF;
+ sprite->callback = &sub_8118834;
+ m4aSongNumStartOrChange(0x47);
+ eRoulette->var9C = eRoulette->var98 = 0.0f;
+ eRoulette->var8C = -1.0f;
+ }
+ }
+ else
+ {
+ if (eRoulette->var94 >= eRoulette->varA0 - 2.0f)
+ {
+ eRoulette->var7D = 0xFF;
+ eRoulette->var03_7 = 0x0;
+ StartSpriteAnim(sprite, sprite->animCmdIndex + 0x3);
+ sub_81186B8(sprite);
+ sprite->data[0x4] = 30;
+ sub_811866C(sprite);
+ sprite->data[0x6] = (sprite->data[0x6] / 30) * 30 + 0xF;
+ sprite->callback = &sub_8118834;
+ m4aSongNumStartOrChange(0x47);
+ eRoulette->var9C = eRoulette->var98 = 0.0f;
+ eRoulette->var8C = -1.0f;
+ }
+ }
+ }
+}
+
+void sub_81189A8(struct Sprite *sprite)
+{
+ float f0, f1, f2;
+ struct StructgUnknown_083F8DF4 *p;
+ sub_8118724(sprite);
+ switch(sprite->data[0x3])
+ {
+ case 0:
+ if (sprite->data[0x0] != 0x1)
+ {
+ f0 = ((float)sprite->data[0x7]);
+ p = &gUnknown_083F8DF4[0];
+ f1 = (f0 * ((float)(s32)p[eRoulette->var04_0].var01) + (float)((s32)p[eRoulette->var04_0].var02 - 0x1));
+ f2 = (f0 / ((float)(s32)p[eRoulette->var04_0].var0C));
+ }
+ else
+ {
+ return;
+ }
+ break;
+ case 180:
+ if (sprite->data[0x0] != 0x0)
+ {
+ f0 = ((float)sprite->data[0x7]);
+ p = &gUnknown_083F8DF4[0];
+ f1 = (f0 * ((float)(s32)p[eRoulette->var04_0].var01) + (float)((s32)p[eRoulette->var04_0].var02 - 0x1));
+ f2 = -(f0 / ((float)(s32)p[eRoulette->var04_0].var0C));
+ }
+ else
+ {
+ return;
+ }
+ break;
+ default: return;
+ }
+ eRoulette->varA0 = eRoulette->var94;
+ eRoulette->var98 = f2;
+ eRoulette->var9C = -((f2 + f2) / f1 + (2.0f / (f1 * f1)));
+ eRoulette->var8C = 0.0f;
+ sprite->animPaused = FALSE;
+ sprite->animNum = 0x0;
+ sprite->animBeginning = TRUE;
+ sprite->animEnded = FALSE;
+ sprite->callback = &sub_811889C;
+ sprite->data[0x2] = 0x0;
+}
+
+void sub_8118B30(struct Sprite *sprite)
+{
+ sprite->pos2.y = (s32)(((float)sprite->data[0x2]) * 0.05f * ((float)sprite->data[0x2])) - 45;
+ sprite->data[0x2]++;
+ if (sprite->data[0x2] > 29 && sprite->pos2.y >= 0)
+ {
+ eRoulette->var7D = 0xFF;
+ eRoulette->var03_7 = FALSE;
+ StartSpriteAnim(sprite, sprite->animCmdIndex + 0x3);
+ sub_81186B8(sprite);
+ sprite->data[0x4] = 30;
+ sub_811866C(sprite);
+ sprite->data[0x6] = (sprite->data[0x6] / 30) * 30 + 0xF;
+ sprite->callback = &sub_8118834;
+ m4aSongNumStartOrChange(0x47);
+ eRoulette->var03_6 = TRUE;
+ }
+}
+
+void sub_8118BD8(struct Sprite *sprite)
+{
+ if (sprite->data[0x2]++ < 45)
+ {
+ sprite->pos2.y--;
+ if(sprite->data[0x2] == 45)
+ {
+ if (gSprites[eRoulette->var3C[0x37]].animCmdIndex == 0x1)
+ sprite->pos2.y++;
+ }
+ }
+ else
+ {
+ if (sprite->data[0x2] < sprite->data[0x7])
+ {
+ if (gSprites[eRoulette->var3C[0x37]].animDelayCounter == 0x0)
+ {
+ if (gSprites[eRoulette->var3C[0x37]].animCmdIndex == 0x1)
+ sprite->pos2.y++;
+ else
+ sprite->pos2.y--;
+ }
+ }
+ else
+ {
+ sprite->animPaused = FALSE;
+ sprite->animNum = 0x1;
+ sprite->animBeginning = TRUE;
+ sprite->animEnded = FALSE;
+ sprite->data[0x2] = 0x0;
+ sprite->callback = &sub_8118B30;
+ m4aSongNumStart(0x3D);
+ }
+ }
+}
+
+void sub_8118CAC(struct Sprite *sprite)
+{
+ sub_8118724(sprite);
+ switch(sprite->data[0x3])
+ {
+ case 90:
+ if (sprite->data[0x0] != 0x1)
+ {
+ sprite->callback = &sub_8118BD8;
+ sprite->data[0x2] = 0x0;
+ }
+ break;
+ case 270:
+ if (sprite->data[0x0] != 0x0)
+ {
+ sprite->callback = &sub_8118BD8;
+ sprite->data[0x2] = 0x0;
+ }
+ break;
+ }
+}
+
+void sub_8118CEC(struct Sprite *sprite)
+{
+ sub_8118724(sprite);
+ switch(eRoulette->var03_0)
+ {
+ default:
+ case 0x0:
+ sub_8119224(sprite);
+ sprite->callback = &sub_81189A8;
+ break;
+ case 0x1:
+ sub_81193D4(sprite);
+ sprite->callback = &sub_8118CAC;
+ break;
+ }
+}
+
+void sub_8118D2C(struct Sprite *sprite)
+{
+ sub_8118724(sprite);
+ if (sprite->data[0x2]-- == 0x10)
+ eRoulette->var98 *= -1.0f;
+ if (sprite->data[0x2] == 0x0)
+ {
+ if (!sprite->data[0x0])
+ {
+ eRoulette->var7D = 0xFF;
+ eRoulette->var03_7 = 0x0;
+ StartSpriteAnim(sprite, sprite->animCmdIndex + 0x3);
+ sub_81186B8(sprite);
+ sprite->data[0x4] = 30;
+ sub_811866C(sprite);
+ sprite->data[0x6] = (sprite->data[0x6] / 30) * 30 + 15;
+ sprite->callback = &sub_8118834;
+ m4aSongNumStartOrChange(0x47);
+ }
+ else
+ {
+ sprite->animPaused = TRUE;
+ m4aSongNumStart(0x38);
+ sub_811952C(sprite);
+ }
+ }
+}
+
+#ifdef NONMATCHING
+void sub_8118DE4(struct Sprite *sprite)
+{
+ sub_8118724(sprite);
+ sprite->data[0x2] = 0x0;
+ sub_81186B8(sprite);
+ if (!(gUnknown_083F8D90[eRoulette->var7E].var04 & eRoulette->var08))
+ {
+ eRoulette->var7D = 0xFF;
+ eRoulette->var03_7 = 0x0;
+ StartSpriteAnim(sprite, sprite->animCmdIndex + 0x3);
+ sub_81186B8(sprite);
+ sprite->data[0x4] = 30;
+ sub_811866C(sprite);
+ sprite->data[0x6] = (sprite->data[0x6] / 30) * 30 + 15;
+ sprite->callback = &sub_8118834;
+ m4aSongNumStartOrChange(0x47);
+ }
+ else
+ {
+ u8 t;
+ u32 z;
+ m4aSongNumStart(0x38);
+ if ((z = (Random() & 0x1)))
+ {
+ u32 o;
+ eRoulette->var8C = 0.0f;
+ o = (eRoulette->var7E + 0x1) % 0xC;
+ t = o;
+ eRoulette->var7F = o;
+ }
+ else
+ {
+ eRoulette->var8C = gUnknown_083F8DF4[eRoulette->var04_0].var1C * 2; // couldn't replicate loads
+ t = (eRoulette->var7E + 0xB) % 0xC;
+ eRoulette->var7F = eRoulette->var7E;
+ }
+ if (gUnknown_083F8D90[t].var04 & eRoulette->var08)
+ {
+ sprite->data[0x0] = 0x1;
+ sprite->data[0x2] = (&gUnknown_083F8DF4[eRoulette->var04_0])->var02;
+ }
+ else
+ {
+ sprite->data[0x0] = gUnknown_083F8D90[t].var04 & eRoulette->var08;
+ if (eRoulette->var04_0)
+ {
+ sprite->data[0x2] = (&gUnknown_083F8DF4[eRoulette->var04_0])->var01;
+ }
+ else
+ {
+ sprite->data[0x2] = (&gUnknown_083F8DF4[eRoulette->var04_0])->var02;
+ if (z)
+ {
+ eRoulette->var8C = 1.5f;
+ }
+ else
+ {
+ eRoulette->var8C = -1.5f;
+ }
+ }
+ }
+ eRoulette->var98 = 0.085f;
+ sprite->callback = &sub_8118D2C;
+ sprite->data[0x1] = 0x5;
+ }
+}
+#else
+__attribute__((naked))
+void sub_8118DE4(struct Sprite *sprite)
+{
+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\
+bl sub_8118724\n\
+movs r0, 0\n\
+strh r0, [r7, 0x32]\n\
+adds r0, r7, 0\n\
+bl sub_81186B8\n\
+ldr r1, _08118E70 @ =gUnknown_083F8D90\n\
+ldr r6, _08118E74 @ =gSharedMem + 0x19000\n\
+movs r0, 0x7E\n\
+adds r0, r6\n\
+mov r8, r0\n\
+ldrb r0, [r0]\n\
+lsls r0, 3\n\
+adds r1, 0x4\n\
+adds r0, r1\n\
+ldr r0, [r0]\n\
+ldr r1, [r6, 0x8]\n\
+ands r0, r1\n\
+cmp r0, 0\n\
+bne _08118E7C\n\
+adds r1, r6, 0\n\
+adds r1, 0x7D\n\
+movs r0, 0xFF\n\
+strb r0, [r1]\n\
+ldrb r1, [r6, 0x3]\n\
+movs r0, 0x7F\n\
+ands r0, r1\n\
+strb r0, [r6, 0x3]\n\
+adds r0, r7, 0\n\
+adds r0, 0x2B\n\
+ldrb r1, [r0]\n\
+adds r1, 0x3\n\
+lsls r1, 24\n\
+lsrs r1, 24\n\
+adds r0, r7, 0\n\
+bl StartSpriteAnim\n\
+adds r0, r7, 0\n\
+bl sub_81186B8\n\
+movs r0, 0x1E\n\
+strh r0, [r7, 0x36]\n\
+adds r0, r7, 0\n\
+bl sub_811866C\n\
+movs r1, 0x3A\n\
+ldrsh r0, [r7, r1]\n\
+movs r1, 0x1E\n\
+bl __divsi3\n\
+lsls r0, 16\n\
+asrs r0, 16\n\
+lsls r1, r0, 4\n\
+subs r1, r0\n\
+lsls r1, 1\n\
+adds r1, 0xF\n\
+strh r1, [r7, 0x3A]\n\
+ldr r0, _08118E78 @ =sub_8118834\n\
+str r0, [r7, 0x1C]\n\
+movs r0, 0x47\n\
+bl m4aSongNumStartOrChange\n\
+b _08118F74\n\
+.align 2, 0\n\
+_08118E70: .4byte gUnknown_083F8D90\n\
+_08118E74: .4byte gSharedMem + 0x19000\n\
+_08118E78: .4byte sub_8118834\n\
+_08118E7C:\n\
+movs r0, 0x38\n\
+bl m4aSongNumStart\n\
+bl Random\n\
+movs r2, 0x1\n\
+mov r9, r2\n\
+mov r1, r9\n\
+ands r1, r0\n\
+mov r9, r1\n\
+cmp r1, 0\n\
+beq _08118EC0\n\
+adds r1, r6, 0\n\
+adds r1, 0x8C\n\
+ldr r0, _08118EB8 @ =0x00000000\n\
+str r0, [r1]\n\
+mov r2, r8\n\
+ldrb r0, [r2]\n\
+adds r0, 0x1\n\
+movs r1, 0xC\n\
+bl __modsi3\n\
+lsls r1, r0, 24\n\
+lsrs r2, r1, 24\n\
+adds r1, r6, 0\n\
+adds r1, 0x7F\n\
+strb r0, [r1]\n\
+ldr r5, _08118EBC @ =gUnknown_083F8DF4\n\
+b _08118EF4\n\
+.align 2, 0\n\
+_08118EB8: .4byte 0x00000000\n\
+_08118EBC: .4byte gUnknown_083F8DF4\n\
+_08118EC0:\n\
+adds r4, r6, 0\n\
+adds r4, 0x8C\n\
+ldr r5, _08118F1C @ =gUnknown_083F8DF4\n\
+ldrb r0, [r6, 0x4]\n\
+lsls r0, 30\n\
+lsrs r0, 25\n\
+adds r1, r5, 0\n\
+adds r1, 0x1C\n\
+adds r0, r1\n\
+ldr r1, [r0]\n\
+adds r0, r1, 0\n\
+bl __addsf3\n\
+str r0, [r4]\n\
+mov r0, r8\n\
+ldrb r4, [r0]\n\
+adds r0, r4, 0\n\
+adds r0, 0xB\n\
+movs r1, 0xC\n\
+bl __modsi3\n\
+lsls r0, 24\n\
+lsrs r2, r0, 24\n\
+adds r0, r6, 0\n\
+adds r0, 0x7F\n\
+strb r4, [r0]\n\
+_08118EF4:\n\
+ldr r0, _08118F20 @ =gUnknown_083F8D90\n\
+lsls r1, r2, 3\n\
+adds r0, 0x4\n\
+adds r1, r0\n\
+ldr r2, _08118F24 @ =gSharedMem + 0x19000\n\
+ldr r1, [r1]\n\
+ldr r0, [r2, 0x8]\n\
+ands r1, r0\n\
+cmp r1, 0\n\
+beq _08118F28\n\
+movs r0, 0x1\n\
+strh r0, [r7, 0x2E]\n\
+ldrb r0, [r2, 0x4]\n\
+lsls r0, 30\n\
+lsrs r0, 25\n\
+adds r0, r5\n\
+ldrb r0, [r0, 0x2]\n\
+strh r0, [r7, 0x32]\n\
+b _08118F64\n\
+.align 2, 0\n\
+_08118F1C: .4byte gUnknown_083F8DF4\n\
+_08118F20: .4byte gUnknown_083F8D90\n\
+_08118F24: .4byte gSharedMem + 0x19000\n\
+_08118F28:\n\
+strh r1, [r7, 0x2E]\n\
+ldrb r1, [r2, 0x4]\n\
+movs r0, 0x3\n\
+ands r0, r1\n\
+cmp r0, 0\n\
+beq _08118F40\n\
+lsls r0, r1, 30\n\
+lsrs r0, 25\n\
+adds r0, r5\n\
+ldrb r0, [r0, 0x1]\n\
+strh r0, [r7, 0x32]\n\
+b _08118F64\n\
+_08118F40:\n\
+lsls r0, r1, 30\n\
+lsrs r0, 25\n\
+adds r0, r5\n\
+ldrb r0, [r0, 0x2]\n\
+strh r0, [r7, 0x32]\n\
+mov r1, r9\n\
+cmp r1, 0\n\
+beq _08118F5C\n\
+adds r1, r2, 0\n\
+adds r1, 0x8C\n\
+ldr r0, _08118F58 @ =0x3f000000\n\
+b _08118F62\n\
+.align 2, 0\n\
+_08118F58: .4byte 0x3f000000\n\
+_08118F5C:\n\
+adds r1, r2, 0\n\
+adds r1, 0x8C\n\
+ldr r0, _08118F80 @ =0xbfc00000\n\
+_08118F62:\n\
+str r0, [r1]\n\
+_08118F64:\n\
+adds r1, r2, 0\n\
+adds r1, 0x98\n\
+ldr r0, _08118F84 @ =0x3dae147b\n\
+str r0, [r1]\n\
+ldr r0, _08118F88 @ =sub_8118D2C\n\
+str r0, [r7, 0x1C]\n\
+movs r0, 0x5\n\
+strh r0, [r7, 0x30]\n\
+_08118F74:\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\
+_08118F80: .4byte 0xbfc00000\n\
+_08118F84: .4byte 0x3dae147b\n\
+_08118F88: .4byte sub_8118D2C\n\
+.syntax divided\n");
+}
+#endif
+
+void sub_8118F8C(struct Sprite *sprite)
+{
+ sub_8118724(sprite);
+ if (!(eRoulette->var8C > 0.5f))
+ {
+ sub_81186B8(sprite);
+ if (sub_81186E8(sprite) == 0x0)
+ {
+ struct StructgUnknown_083F8DF4 *p;
+ eRoulette->var90 = 0.0f;
+ p = &gUnknown_083F8DF4[0];
+ eRoulette->var8C -= ((float)p[eRoulette->var04_0].var03)
+ / ((float)(s16)((&p[eRoulette->var04_0])->var04 + 0x1));
+ sprite->data[0x1] = 0x4;
+ sprite->callback = &sub_8118DE4;
+ }
+ else
+ {
+ if (eRoulette->var90 != 0.0f)
+ {
+ if (eRoulette->var8C < 0.0f)
+ {
+ eRoulette->var90 = 0.0f;
+ eRoulette->var8C = 0.0f;
+ eRoulette->var98 /= 1.2;
+ }
+ }
+ }
+ }
+}
+
+void sub_8119088(struct Sprite *sprite)
+{
+ sub_8118724(sprite);
+ if (!(eRoulette->var94 > 40.f))
+ {
+ eRoulette->var98 = - ( 4.0f / (float)(u16)eRoulette->var86);
+ eRoulette->var90 = - (eRoulette->var8C / (float)(u16)eRoulette->var86);
+ sprite->animNum = 0x2;
+ sprite->animBeginning = TRUE;
+ sprite->animEnded = FALSE;
+ sprite->data[0x1] = 0x3;
+ sprite->callback = &sub_8118F8C;
+ }
+}
+
+void sub_8119134(struct Sprite *sprite)
+{
+ sub_8118724(sprite);
+ if (!(eRoulette->var94 > 60.0f))
+ {
+ m4aSongNumStartOrChange(0x5D);
+ eRoulette->var98 = - ( 20.0f / (float)(u16)eRoulette->var84);
+ eRoulette->var90 = ((1.0f - eRoulette->var8C) / (float)(u16)eRoulette->var84);
+ sprite->animNum = 0x1;
+ sprite->animBeginning = TRUE;
+ sprite->animEnded = FALSE;
+ sprite->data[0x1] = 0x2;
+ sprite->callback = &sub_8119088;
+ }
+}
+
+void sub_81191F4(struct Sprite *sprite)
+{
+ sprite->data[0x1] = 0x1;
+ sprite->data[0x2] = 0x0;
+ sub_8118724(sprite);
+ sprite->invisible = FALSE;
+ sprite->callback = &sub_8119134;
+}
+
+void sub_8119224(struct Sprite *sprite)
+{
+ u16 t;
+ u8 i;
+ s16 s[0x2][0x2];
+ struct Roulette *p;
+ memcpy(s, &gUnknown_083FA60E, 0x8);
+ t = sprite->data[0x7] - 0x2;
+ p = eRoulette;
+ p->var3C[0x37] = CreateSprite(&gSpriteTemplate_83FA50C, 0x24, -0xC, 0x32);
+ p->var3C[0x38] = CreateSprite(&gSpriteTemplate_83FA5C0[0x0], s[sprite->data[0x0]][0x0], s[sprite->data[0x0]][0x1], 0x3B);
+ p->var3C[0x39] = CreateSprite(&gSpriteTemplate_83FA5C0[0x1], 0x24, 0x8C, 0x33);
+ gSprites[eRoulette->var3C[0x39]].oam.objMode = 0x1;
+ for (i = 0x0; i < 0x3; i++)
+ {
+ gSprites[eRoulette->var3C[0x37 + i]].coordOffsetEnabled = FALSE;
+ gSprites[eRoulette->var3C[0x37 + i]].invisible = TRUE;
+ gSprites[eRoulette->var3C[0x37 + i]].animPaused = TRUE;
+ gSprites[eRoulette->var3C[0x37 + i]].affineAnimPaused = TRUE;
+ gSprites[eRoulette->var3C[0x37 + i]].data[0x4] = eRoulette->var3C[0x37];
+ gSprites[eRoulette->var3C[0x37 + i]].data[0x5] = eRoulette->var3C[0x38];
+ gSprites[eRoulette->var3C[0x37 + i]].data[0x6] = eRoulette->var3C[0x39];
+ gSprites[eRoulette->var3C[0x37 + i]].data[0x2] = t;
+ gSprites[eRoulette->var3C[0x37 + i]].data[0x3] = (sprite->data[0x7] * (&gUnknown_083F8DF4[eRoulette->var04_0])->var01) +
+ ((&gUnknown_083F8DF4[eRoulette->var04_0])->var02 + 0xFFFF);
+ }
+ gSprites[eRoulette->var3C[0x38]].coordOffsetEnabled = TRUE;
+ eRoulette->var38 = sprite;
+}
+
+void sub_81193D4(struct Sprite *sprite)
+{
+ u8 i = 0;
+ s16 t;
+ s16 s[0x2][0x2];
+ struct StructgUnknown_083F8DF4 *p;
+ memcpy(s, &gUnknown_083FA616, 0x8);
+ t = sprite->data[0x7] - 0x2;
+ eRoulette->var3C[0x37] = CreateSprite(&gSpriteTemplate_83FA524, s[sprite->data[0x0]][0x0], s[sprite->data[0x0]][0x1], 0x32);
+ StartSpriteAnim(&gSprites[eRoulette->var3C[0x37]], sprite->data[0x0]);
+ eRoulette->var3C[0x38] = CreateSprite(&gSpriteTemplate_83FA5F0, s[sprite->data[0x0]][0x0], s[sprite->data[0x0]][0x1], 0x33);
+ gSprites[eRoulette->var3C[0x38]].affineAnimPaused = TRUE;
+ gSprites[eRoulette->var3C[0x38]].animPaused = TRUE;
+ sprite->data[0x7] = (t * (p = &gUnknown_083F8DF4[0])[eRoulette->var04_0].var01) + (p[eRoulette->var04_0].var10 + 0x2D);
+ for (; i < 0x2; i++)
+ {
+ gSprites[eRoulette->var3C[0x37 + i]].data[0x4] = eRoulette->var3C[0x37];
+ gSprites[eRoulette->var3C[0x37 + i]].data[0x5] = eRoulette->var3C[0x38];
+ gSprites[eRoulette->var3C[0x37 + i]].data[0x6] = eRoulette->var3C[0x38];
+ gSprites[eRoulette->var3C[0x37 + i]].data[0x2] = t;
+ gSprites[eRoulette->var3C[0x37 + i]].data[0x3] = sprite->data[0x7] - 0x2D;
+ }
+ eRoulette->var38 = sprite;
+}
+
+#ifdef NONMATCHING
+void sub_811952C(struct Sprite *sprite)
+{
+ u8 z;
+ register u8 h asm("r10") = 0x0;
+ u8 j = 0x5;
+ u32 p = 0x0;
+ u16 o;
+ u8 i;
+ u8 s[0xA] = (u8[]){0,0,0,0,0,0,0,0,0,0};
+ u16 t = Random();
+ eRoulette->var7D = 0x1;
+ eRoulette->var03_5 = TRUE;
+ eRoulette->var03_6 = FALSE;
+ eRoulette->var7E = 0xFF;
+ eRoulette->var88 = sprite->data[0x3];
+ eRoulette->var98 = 0.0f;
+ eRoulette->var8C = (&gUnknown_083F8DF4[eRoulette->var04_0])->var1C; //couldn't replicate load, same as sub_8118DE4
+ o = (eRoulette->var04_0 * 30 + 33) + (0x1 - eRoulette->var03_0) * 15;
+ for (i = 0x0; i < 0x4; i++)
+ {
+ if (o < sprite->data[0x3] && !(sprite->data[0x3] > o + 90))
+ {
+ sprite->data[0x0] = i * 0x2;
+ eRoulette->var03_0 = 0x1 & i;
+ break;
+ }
+ if (i == 0x3)
+ {
+ sprite->data[0x0] = 0x1;
+ eRoulette->var03_0 = 0x1;
+ break;
+ }
+ o += 90;
+ }
+ if (eRoulette->var03_0)
+ {
+ if (sprite->data[0x0])
+ {
+ PlayCry1(0x130, -0x3F);
+ }
+ else
+ {
+ PlayCry1(0x130, 0x3F);
+ }
+ }
+ else
+ {
+ PlayCry1(0x132, -0x3F);
+ }
+ i = 0x2;
+ z = (eRoulette->var7F + 0x2) % 0xC;
+ if (eRoulette->var03_0 == 0x1 && eRoulette->var04_0 == 0x1)
+ j += 0x6;
+ else
+ j += i;
+ for (; i < j; i++)
+ {
+ if (!(eRoulette->var08 & gUnknown_083F8D90[z].var04))
+ {
+ s[h++] = i;
+ if (!p && (gUnknown_083F8D90[z].var04 & gUnknown_083F8C00[eRoulette->var1B[eRoulette->var1A_0]].var00))
+ {
+ p = i;
+ }
+ }
+ z = (z + 0x1) % 0xC;
+ }
+ if ((eRoulette->var03_0 + 0x1) & eRoulette->var02)
+ {
+ if (p && (t & 0xFF) <= 0xBF)
+ {
+ sprite->data[0x7] = p;
+ }
+ else
+ {
+ sprite->data[0x7] = s[t % h];
+ }
+ }
+ else
+ {
+ sprite->data[0x7] = s[t % h];
+ }
+ sprite->callback = &sub_8118CEC;
+}
+#else
+__attribute__((naked))
+void sub_811952C(struct Sprite *sprite)
+{
+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\
+mov r8, r0\n\
+movs r0, 0\n\
+mov r10, r0\n\
+movs r1, 0x5\n\
+mov r9, r1\n\
+movs r2, 0\n\
+str r2, [sp, 0xC]\n\
+mov r0, sp\n\
+movs r1, 0\n\
+movs r2, 0xA\n\
+bl memset\n\
+bl Random\n\
+lsls r0, 16\n\
+lsrs r0, 16\n\
+str r0, [sp, 0x10]\n\
+ldr r7, _08119610 @ =gSharedMem + 0x19000\n\
+adds r0, r7, 0\n\
+adds r0, 0x7D\n\
+movs r6, 0x1\n\
+strb r6, [r0]\n\
+ldrb r4, [r7, 0x3]\n\
+movs r0, 0x20\n\
+orrs r4, r0\n\
+movs r0, 0x41\n\
+negs r0, r0\n\
+ands r4, r0\n\
+strb r4, [r7, 0x3]\n\
+adds r1, r7, 0\n\
+adds r1, 0x7E\n\
+movs r0, 0xFF\n\
+strb r0, [r1]\n\
+adds r5, r7, 0\n\
+adds r5, 0x88\n\
+mov r3, r8\n\
+movs r1, 0x34\n\
+ldrsh r0, [r3, r1]\n\
+bl __floatsisf\n\
+str r0, [r5]\n\
+adds r1, r7, 0\n\
+adds r1, 0x98\n\
+ldr r0, _08119614 @ =0x00000000\n\
+str r0, [r1]\n\
+adds r3, r7, 0\n\
+adds r3, 0x8C\n\
+ldr r2, _08119618 @ =gUnknown_083F8DF4\n\
+ldrb r0, [r7, 0x4]\n\
+lsls r0, 30\n\
+lsrs r1, r0, 25\n\
+adds r2, 0x1C\n\
+adds r1, r2\n\
+ldr r1, [r1]\n\
+str r1, [r3]\n\
+lsrs r0, 30\n\
+lsls r1, r0, 4\n\
+subs r1, r0\n\
+lsls r1, 1\n\
+adds r1, 0x21\n\
+lsls r4, 27\n\
+lsrs r4, 27\n\
+subs r6, r4\n\
+lsls r0, r6, 4\n\
+subs r0, r6\n\
+adds r1, r0\n\
+lsls r1, 16\n\
+lsrs r1, 16\n\
+mov r5, r10\n\
+mov r3, r8\n\
+movs r0, 0x34\n\
+ldrsh r2, [r3, r0]\n\
+_081195C8:\n\
+cmp r1, r2\n\
+bge _081195D4\n\
+adds r0, r1, 0\n\
+adds r0, 0x5A\n\
+cmp r2, r0\n\
+ble _08119638\n\
+_081195D4:\n\
+cmp r5, 0x3\n\
+beq _0811961C\n\
+adds r0, r1, 0\n\
+adds r0, 0x5A\n\
+lsls r0, 16\n\
+lsrs r1, r0, 16\n\
+adds r0, r5, 0x1\n\
+lsls r0, 24\n\
+lsrs r5, r0, 24\n\
+cmp r5, 0x3\n\
+bls _081195C8\n\
+_081195EA:\n\
+ldr r0, _08119610 @ =gSharedMem + 0x19000\n\
+ldrb r1, [r0, 0x3]\n\
+movs r0, 0x1F\n\
+ands r0, r1\n\
+cmp r0, 0\n\
+beq _08119664\n\
+mov r1, r8\n\
+movs r2, 0x2E\n\
+ldrsh r0, [r1, r2]\n\
+cmp r0, 0\n\
+beq _08119658\n\
+movs r0, 0x98\n\
+lsls r0, 1\n\
+movs r1, 0x3F\n\
+negs r1, r1\n\
+bl PlayCry1\n\
+b _08119670\n\
+.align 2, 0\n\
+_08119610: .4byte gSharedMem + 0x19000\n\
+_08119614: .4byte 0x00000000\n\
+_08119618: .4byte gUnknown_083F8DF4\n\
+_0811961C:\n\
+movs r0, 0x1\n\
+mov r3, r8\n\
+strh r0, [r3, 0x2E]\n\
+ldr r2, _08119634 @ =gSharedMem + 0x19000\n\
+ldrb r1, [r2, 0x3]\n\
+subs r0, 0x21\n\
+ands r0, r1\n\
+movs r1, 0x1\n\
+orrs r0, r1\n\
+strb r0, [r2, 0x3]\n\
+b _081195EA\n\
+.align 2, 0\n\
+_08119634: .4byte gSharedMem + 0x19000\n\
+_08119638:\n\
+lsrs r0, r5, 1\n\
+mov r1, r8\n\
+strh r0, [r1, 0x2E]\n\
+ldr r3, _08119654 @ =gSharedMem + 0x19000\n\
+movs r1, 0x1\n\
+ands r1, r5\n\
+ldrb r2, [r3, 0x3]\n\
+movs r0, 0x20\n\
+negs r0, r0\n\
+ands r0, r2\n\
+orrs r0, r1\n\
+strb r0, [r3, 0x3]\n\
+b _081195EA\n\
+.align 2, 0\n\
+_08119654: .4byte gSharedMem + 0x19000\n\
+_08119658:\n\
+movs r0, 0x98\n\
+lsls r0, 1\n\
+movs r1, 0x3F\n\
+bl PlayCry1\n\
+b _08119670\n\
+_08119664:\n\
+movs r0, 0x99\n\
+lsls r0, 1\n\
+movs r1, 0x3F\n\
+negs r1, r1\n\
+bl PlayCry1\n\
+_08119670:\n\
+movs r5, 0x2\n\
+ldr r4, _081196A0 @ =gSharedMem + 0x19000\n\
+adds r0, r4, 0\n\
+adds r0, 0x7F\n\
+ldrb r0, [r0]\n\
+adds r0, 0x2\n\
+movs r1, 0xC\n\
+bl __modsi3\n\
+lsls r0, 24\n\
+lsrs r3, r0, 24\n\
+ldrb r1, [r4, 0x3]\n\
+movs r0, 0x1F\n\
+ands r0, r1\n\
+cmp r0, 0x1\n\
+bne _081196A4\n\
+ldrb r1, [r4, 0x4]\n\
+movs r0, 0x3\n\
+ands r0, r1\n\
+cmp r0, 0x1\n\
+bne _081196A4\n\
+mov r0, r9\n\
+adds r0, 0x6\n\
+b _081196A8\n\
+.align 2, 0\n\
+_081196A0: .4byte gSharedMem + 0x19000\n\
+_081196A4:\n\
+mov r2, r9\n\
+adds r0, r2, r5\n\
+_081196A8:\n\
+lsls r0, 24\n\
+lsrs r0, 24\n\
+mov r9, r0\n\
+cmp r5, r9\n\
+bcs _0811970E\n\
+ldr r6, _08119734 @ =gSharedMem + 0x19000\n\
+ldr r7, _08119738 @ =gUnknown_083F8C00 + 0xC\n\
+_081196B6:\n\
+lsls r0, r3, 3\n\
+ldr r1, _0811973C @ =gUnknown_083F8D90 + 0x4\n\
+adds r0, r1\n\
+ldr r1, [r6, 0x8]\n\
+ldr r2, [r0]\n\
+ands r1, r2\n\
+cmp r1, 0\n\
+bne _081196F8\n\
+mov r0, r10\n\
+adds r1, r0, 0x1\n\
+lsls r1, 24\n\
+lsrs r1, 24\n\
+mov r10, r1\n\
+add r0, sp\n\
+strb r5, [r0]\n\
+ldr r0, [sp, 0xC]\n\
+cmp r0, 0\n\
+bne _081196F8\n\
+ldrb r0, [r6, 0x1A]\n\
+lsls r0, 28\n\
+lsrs r0, 28\n\
+ldr r1, _08119740 @ =gSharedMem + 0x1901B\n\
+adds r0, r1\n\
+ldrb r1, [r0]\n\
+lsls r0, r1, 2\n\
+adds r0, r1\n\
+lsls r0, 2\n\
+adds r0, r7\n\
+ldr r0, [r0]\n\
+ands r2, r0\n\
+cmp r2, 0\n\
+beq _081196F8\n\
+str r5, [sp, 0xC]\n\
+_081196F8:\n\
+adds r0, r3, 0x1\n\
+movs r1, 0xC\n\
+bl __modsi3\n\
+lsls r0, 24\n\
+lsrs r3, r0, 24\n\
+adds r0, r5, 0x1\n\
+lsls r0, 24\n\
+lsrs r5, r0, 24\n\
+cmp r5, r9\n\
+bcc _081196B6\n\
+_0811970E:\n\
+ldrb r0, [r4, 0x3]\n\
+lsls r0, 27\n\
+lsrs r0, 27\n\
+adds r0, 0x1\n\
+ldrb r1, [r4, 0x2]\n\
+ands r0, r1\n\
+cmp r0, 0\n\
+beq _08119756\n\
+ldr r2, [sp, 0xC]\n\
+cmp r2, 0\n\
+beq _08119744\n\
+movs r0, 0xFF\n\
+ldr r3, [sp, 0x10]\n\
+ands r0, r3\n\
+cmp r0, 0xBF\n\
+bhi _08119744\n\
+mov r0, r8\n\
+strh r2, [r0, 0x3C]\n\
+b _08119766\n\
+.align 2, 0\n\
+_08119734: .4byte gSharedMem + 0x19000\n\
+_08119738: .4byte gUnknown_083F8C00 + 0xC\n\
+_0811973C: .4byte gUnknown_083F8D90 + 0x4\n\
+_08119740: .4byte gSharedMem + 0x1901B\n\
+_08119744:\n\
+ldr r0, [sp, 0x10]\n\
+mov r1, r10\n\
+bl __modsi3\n\
+add r0, sp\n\
+ldrb r0, [r0]\n\
+mov r1, r8\n\
+strh r0, [r1, 0x3C]\n\
+b _08119766\n\
+_08119756:\n\
+ldr r0, [sp, 0x10]\n\
+mov r1, r10\n\
+bl __modsi3\n\
+add r0, sp\n\
+ldrb r0, [r0]\n\
+mov r2, r8\n\
+strh r0, [r2, 0x3C]\n\
+_08119766:\n\
+ldr r3, _0811977C @ =sub_8118CEC\n\
+mov r0, r8\n\
+str r3, [r0, 0x1C]\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\
+_0811977C: .4byte sub_8118CEC\n\
+.syntax divided\n");
+}
+#endif
+
+void sub_8119780(struct Sprite *sprite)
+{
+ if (!(sprite->data[0x1]++ < sprite->data[0x3]))
+ {
+ if ((sprite->pos1.x -= 0x2) < -0x10)
+ {
+ if (!eRoulette->var03_6)
+ {
+ eRoulette->var03_6 = TRUE;
+ }
+ DestroySprite(sprite);
+ eRoulette->var01 = 0x0;
+ eRoulette->var34 = gUnknown_083FA61E[0x0];
+ }
+ }
+}
+
+void sub_81197D8(struct Sprite *sprite)
+{
+ u16 t[0x3][0x4];
+ s32 p, z;
+ memcpy(t, &gUnknown_083FA632, 0x18);
+ if (sprite->data[0x1]++ < sprite->data[0x3])
+ {
+ if(sprite->data[0x1] & 0x1)
+ {
+ gSpriteCoordOffsetY = t[sprite->data[0x2] / 0x2][sprite->data[0x7]];
+ p = z = sprite->data[0x7] + 0x1;
+ if (z < 0)
+ p += 0x3;
+ sprite->data[0x7] = z - ((p >> 2) * 4);
+ }
+ sprite->invisible ^= 0x1;
+ }
+ else
+ {
+ gSpriteCoordOffsetY = 0x0;
+ gSprites[eRoulette->var3C[0x37]].animPaused = FALSE;
+ DestroySprite(sprite);
+ }
+}
+
+void sub_8119898(struct Sprite *sprite)
+{
+ float t;
+ sprite->data[0x1]++;
+ t = sprite->data[0x1];
+ sprite->pos2.y = t * 0.039f * t;
+ eRoulette->var34 = gUnknown_083FA61E[(eRoulette->var01 - 0x1) / 2];
+ if (eRoulette->var01 < 0x13)
+ eRoulette->var01++;
+ if (sprite->data[0x1] > 0x3C)
+ {
+ sprite->data[0x1] = 0x0;
+ sprite->callback = &sub_8119780;
+ gSprites[sprite->data[0x6]].callback = &sub_8119780;
+ gSprites[sprite->data[0x6]].data[0x1] = -0x2;
+ gSprites[sprite->data[0x5]].invisible = FALSE;
+ gSprites[sprite->data[0x5]].callback = &sub_81197D8;
+ m4aSongNumStart(0xD6);
+ }
+}
+
+void sub_8119964(struct Sprite *sprite)
+{
+ if(sprite->data[0x7] == 0x0)
+ {
+ register u32 t asm("r2");
+ u32 z ;
+ if (eRoulette->var38->data[0x0] == 0x0)
+ {
+ t = eRoulette->var38->data[0x3];
+ z = gUnknown_083F8DF4[eRoulette->var04_0].var08;
+ }
+ else
+ {
+ t = eRoulette->var38->data[0x3];
+ z = gUnknown_083F8DF4[eRoulette->var04_0].var08;
+ z += 0xB4;
+ }
+ if (t == z)
+ {
+ sprite->invisible = FALSE;
+ sprite->data[0x7]++;
+ m4aSongNumStart(0x2B);
+ eRoulette->var01 = 0x1;
+ eRoulette->var34 = gUnknown_083FA61E[0x0];
+ }
+ }
+ else
+ {
+ u32 t, z;
+ eRoulette->var34 = gUnknown_083FA61E[(eRoulette->var01 - 0x1) / 2];
+ if (eRoulette->var01 < 0x13)
+ eRoulette->var01++;
+ if (eRoulette->var38->data[0x0] == 0x0)
+ {
+ t = eRoulette->var38->data[0x3];
+ z = gUnknown_083F8DF4[eRoulette->var04_0].var0A;
+ }
+ else
+ {
+ t = eRoulette->var38->data[0x3];
+ z = gUnknown_083F8DF4[eRoulette->var04_0].var0A ;
+ z += 0xB4;
+ }
+ if (t == z)
+ {
+ gSprites[sprite->data[0x4]].callback = &sub_8119898;
+ gSprites[sprite->data[0x4]].invisible = FALSE;
+ sprite->callback = &SpriteCallbackDummy;
+ sprite->data[0x7] = 0x0;
+ }
+ }
+}
+
+void sub_8119A90(struct Sprite *sprite)
+{
+ sprite->invisible ^= 0x1;
+}
+
+void sub_8119AAC(struct Sprite *sprite)
+{
+ if (sprite->pos1.y > -0x10)
+ {
+ sprite->pos1.y--;
+ }
+ else
+ {
+ sprite->callback = &SpriteCallbackDummy;
+ sprite->invisible = TRUE;
+ sprite->animPaused = TRUE;
+ m4aSongNumStop(0x5E);
+ DestroySprite(sprite);
+ FreeOamMatrix(gSprites[eRoulette->var3C[0x38]].oam.matrixNum);
+ DestroySprite(&gSprites[eRoulette->var3C[0x38]]);
+ }
+}
+
+void sub_8119B24(struct Sprite *sprite)
+{
+ if (!(sprite->data[0x1] < 0x0))
+ {
+ sprite->data[0x1]--;
+ sprite->pos1.y--;
+ if (sprite->data[0x1] == 0x0 && sprite->animCmdIndex == 0x1)
+ sprite->pos2.y++;
+ }
+ else
+ {
+ if (!(sprite->data[0x3] < 0x0))
+ {
+ sprite->data[0x3]--;
+ if (sprite->animDelayCounter == 0x0)
+ {
+ if (sprite->animCmdIndex == 0x1)
+ sprite->pos2.y++;
+ else
+ sprite->pos2.y--;
+ }
+ }
+ else
+ {
+ m4aSongNumStart(0x2B);
+ StartSpriteAnim(sprite, eRoulette->var38->data[0x0] + 0x4);
+ sprite->callback = &sub_8119AAC;
+ gSprites[sprite->data[0x6]].affineAnimPaused = FALSE;
+ }
+ }
+}
+
+void sub_8119BCC(struct Sprite *sprite)
+{
+ s8 t[0x2]; //sign
+ s8 z[0x8][0x2];
+ memcpy(t, &gUnknown_083FA64A, 0x2);
+ memcpy(z, &gUnknown_083FA64C, 0x10);
+ if (sprite->data[0x1]-- > 0x7)
+ {
+ sprite->pos1.x += t[eRoulette->var38->data[0x0]] * 0x2;
+ if (IsSEPlaying())
+ {
+ s8 u = -((0x74 - sprite->pos1.x) / 0x2);
+ m4aMPlayPanpotControl(&gMPlay_SE1, 0xFFFF,u);
+ m4aMPlayPanpotControl(&gMPlay_SE2, 0xFFFF, u);
+ }
+ }
+ else
+ {
+ if (!(sprite->data[0x1] < 0x0))
+ {
+ sprite->pos1.x += t[eRoulette->var38->data[0x0]] * z[0x7 - sprite->data[0x1]][0x0];
+ sprite->pos1.y += z[0x7 - sprite->data[0x1]][0x1];
+ }
+ else
+ {
+ m4aSongNumStartOrChange(0x5E);
+ if(eRoulette->var38->data[0x0] == 0x0)
+ PlayCry1(0x130, 0x3F);
+ else
+ PlayCry1(0x130, -0x3F);
+ StartSpriteAnim(sprite, eRoulette->var38->data[0x0] + 0x2);
+ sprite->data[0x1] = 45;
+ sprite->callback = &sub_8119B24;
+ }
+ }
+}
+
+void sub_8119D08(struct Sprite *sprite)
+{
+ s8 t[0x2]; //sign
+ memcpy(t, &gUnknown_083FA64A, 0x2);
+ if (!(sprite->data[0x1]-- < 0x0))
+ {
+ sprite->pos1.x += t[eRoulette->var38->data[0x0]] * 0x2;
+ gSprites[sprite->data[0x6]].invisible ^= 0x1;
+ }
+ else
+ {
+ sprite->callback = &sub_8119A90;
+ }
+}
+
+void sub_8119D80(struct Sprite *sprite)
+{
+ if (eRoulette->var38->data[0x0] == 0x0)
+ {
+ if (eRoulette->var38->data[0x3] == gUnknown_083F8DF4[eRoulette->var04_0].var12 + 90)
+ {
+ gSprites[sprite->data[0x6]].data[0x1] = 0x34;
+ gSprites[sprite->data[0x4]].data[0x1] = 0x34;
+ }
+ else
+ {
+ return;
+ }
+ }
+ else
+ {
+ if (eRoulette->var38->data[0x3] == gUnknown_083F8DF4[eRoulette->var04_0].var14 + 270)
+ {
+ gSprites[sprite->data[0x6]].data[0x1] = 0x2E;
+ gSprites[sprite->data[0x4]].data[0x1] = 0x2E;
+ }
+ else
+ {
+ return;
+ }
+ }
+ gSprites[sprite->data[0x6]].callback = &sub_8119D08;
+ gSprites[sprite->data[0x4]].callback = &sub_8119BCC;
+ m4aSongNumStart(0x2B);
+}
diff --git a/src/roulette_util.c b/src/roulette_util.c
new file mode 100644
index 000000000..3d5b03a5c
--- /dev/null
+++ b/src/roulette_util.c
@@ -0,0 +1,280 @@
+#include "global.h"
+#include "roulette_util.h"
+#include "roulette.h"
+
+static u8 sub_81249E4(struct UnkStruct3 *);
+static u8 sub_8124BEC(struct UnkStruct3 *);
+u8 unref_sub_81249B0(struct UnkStruct0 *, u8);
+
+extern u16 gPlttBufferFaded[];
+extern u16 gPlttBufferUnfaded[];
+
+void sub_8124918(struct UnkStruct0 *r0)
+{
+ r0->var00 = 0;
+ r0->var02 = 0;
+ memset((&r0->var04), 0, 0xC0);
+}
+
+u8 sub_812492C(struct UnkStruct0 *r0, u8 r1, struct UnkStruct1 *r2)
+{
+ if (!(r1 < 0x10) || (r0->var04[r1].var00_7))
+ return 0xFF;
+
+ r0->var04[r1].var04.var00 = r2->var00;
+ r0->var04[r1].var04.var02 = r2->var02;
+ r0->var04[r1].var04.var04 = r2->var04;
+ r0->var04[r1].var04.var05 = r2->var05;
+ r0->var04[r1].var04.var06 = r2->var06;
+ r0->var04[r1].var04.var07_0 = r2->var07_0;
+ r0->var04[r1].var04.var07_5 = r2->var07_5;
+ r0->var04[r1].var04.var07_7 = r2->var07_7;
+
+
+ r0->var04[r1].var00_0 = 0x0;
+ r0->var04[r1].var00_7 = 0x1;
+
+ r0->var04[r1].var02 = 0x0;
+ r0->var04[r1].var01 = 0x0;
+ if (r0->var04[r1].var04.var07_7 < 0)
+ r0->var04[r1].var03 = 0xFF;
+ else
+ r0->var04[r1].var03 = 0x1;
+ return r1;
+}
+
+#ifdef NONMATCHING
+u8 unref_sub_81249B0(struct UnkStruct0 *r0, u8 r1)
+{
+ if (r1 < 0x10)
+ {
+ if (r0->var04[r1].var00_7)
+ {
+ r0->var04[r1] = (struct UnkStruct3){0};
+ return r1;
+ }
+ }
+ return 0xFF;
+}
+#else
+__attribute__((naked))
+u8 unref_sub_81249B0(struct UnkStruct0 *r0 , u8 r1)
+{
+ asm(".syntax unified\n\
+ push {r4,lr}\n\
+ adds r2, r0, 0\n\
+ lsls r1, 24\n\
+ lsrs r1, 24\n\
+ adds r4, r1, 0\n\
+ cmp r4, 0xF\n\
+ bhi _081249DC\n\
+ lsls r0, r4, 1\n\
+ adds r0, r4\n\
+ lsls r0, 2\n\
+ adds r1, r2, r0\n\
+ ldrb r0, [r1, 0x4]\n\
+ lsrs r0, 7\n\
+ cmp r0, 0\n\
+ beq _081249DC\n\
+ adds r0, r1, 0x4\n\
+ movs r1, 0\n\
+ movs r2, 0xC\n\
+ bl memset\n\
+ adds r0, r4, 0\n\
+ b _081249DE\n\
+ _081249DC:\n\
+ movs r0, 0xFF\n\
+ _081249DE:\n\
+ pop {r4}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .syntax divided\n");
+}
+#endif
+
+u8 sub_81249E4(struct UnkStruct3 *r0)
+{
+ u8 i;
+ u8 returnval;
+ for (i = 0; i < r0->var04.var04; i++)
+ {
+ u32 offset = r0->var04.var02 + i;
+ struct PlttData *faded = (struct PlttData *)&gPlttBufferFaded[offset];
+ struct PlttData *unfaded = (struct PlttData *)&gPlttBufferUnfaded[offset];
+ switch(r0->var00_0)
+ {
+ case 0x1:
+ if ((u32)(faded->r + r0->var03) < 0x20)
+ faded->r += r0->var03;
+ if ((u32)(faded->g + r0->var03) < 0x20)
+ faded->g += r0->var03;
+ if ((u32)(faded->b + r0->var03) < 0x20)
+ faded->b += r0->var03;
+ break;
+ case 0x2:
+ if (r0->var03 < 0)
+ {
+ if (!(faded->r + r0->var03 < unfaded->r))
+ faded->r += r0->var03;
+ if (!(faded->g + r0->var03 < unfaded->g))
+ faded->g += r0->var03;
+ if (!(faded->b + r0->var03 < unfaded->b))
+ faded->b += r0->var03;
+ }
+ else
+ {
+ if (!(faded->r + r0->var03 > unfaded->r))
+ faded->r += r0->var03;
+ if (!(faded->g + r0->var03 > unfaded->g))
+ faded->g += r0->var03;
+ if (!(faded->b + r0->var03 > unfaded->b))
+ faded->b += r0->var03;
+ }
+ break;
+ }
+ }
+ if (((u32)r0->var02++) != r0->var04.var07_0)
+ {
+ returnval = 0x0;
+ }
+ else
+ {
+ r0->var02 = 0x0;
+ r0->var03 = r0->var03 * -1;
+ if (r0->var00_0 == 0x1)
+ r0->var00_0++;
+ else
+ r0->var00_0--;
+ returnval = 0x1;
+ }
+ return returnval;
+}
+
+u8 sub_8124BEC(struct UnkStruct3 *r0)
+{
+ u8 rg2 = 0;
+ switch (r0->var00_0)
+ {
+ case 0x1:
+ for (rg2 = 0; rg2 < r0->var04.var04; rg2++)
+ gPlttBufferFaded[r0->var04.var02 + rg2] = r0->var04.var00;
+ r0->var00_0++;
+ break;
+ case 0x2:
+ for (rg2 = 0; rg2 < r0->var04.var04; rg2++)
+ gPlttBufferFaded[r0->var04.var02 + rg2] = gPlttBufferUnfaded[r0->var04.var02 + rg2];
+ r0->var00_0--;
+ break;
+ }
+ return 0x1;
+}
+
+void task_tutorial_controls_fadein(struct UnkStruct0 *r0)
+{
+ u8 i = 0;
+ if (r0->var00)
+ {
+ for (i = 0; i < 0x10; i++)
+ {
+ if ((r0->var02 >> i) & 0x1)
+ {
+ if (((u8)--r0->var04[i].var01) == 0xFF) // if underflow ?
+ {
+ if (r0->var04[i].var04.var00 & (0x80 << 8)) // PlttData->unused_15 ?
+ sub_81249E4(&r0->var04[i]);
+ else
+ sub_8124BEC(&r0->var04[i]);
+ r0->var04[i].var01 = r0->var04[i].var04.var05;
+ }
+ }
+ }
+ }
+}
+
+void sub_8124CE8(struct UnkStruct0 *r0, u16 r1)
+{
+ u8 i = 0;
+ r0->var00++;
+ for (i = 0; i < 0x10; i++)
+ {
+ if ((r1 >> i) & 0x1)
+ {
+ if (r0->var04[i].var00_7)
+ {
+ r0->var02 |= 0x1 << i;
+ r0->var04[i].var00_0 = 0x1;
+ }
+ }
+ }
+}
+
+void sub_8124D3C(struct UnkStruct0 *r0, u16 r1)
+{
+ u8 i;
+ for (i = 0; i < 0x10; i++)
+ {
+ if ((r0->var02 >> i) & 0x1)
+ {
+ if (r0->var04[i].var00_7)
+ {
+ if ((r1 >> i) & 0x1)
+ {
+ u32 offset = r0->var04[i].var04.var02;
+ u16 *faded = &gPlttBufferFaded[offset];
+ u16 *unfaded = &gPlttBufferUnfaded[offset];
+ memcpy(faded, unfaded, r0->var04[i].var04.var04 * 2);
+ r0->var04[i].var00_0 = 0x0;
+ r0->var04[i].var02 = 0x0;
+ r0->var04[i].var01 = 0x0;
+ if (r0->var04[i].var04.var07_7 < 0)
+ r0->var04[i].var03 = 0xFF;
+ else
+ r0->var04[i].var03 = 0x1;
+ }
+ }
+ }
+ }
+ if (r1 == 0xFFFF)
+ {
+ r0->var00 = 0x0;
+ r0->var02 = 0x0;
+ }
+ else
+ {
+ r0->var02 = r0->var02 & ~r1;
+ }
+}
+void sub_8124DDC(u16 *dest, u16 src, u8 left, u8 top, u8 width, u8 height)
+{
+
+ u16 *_dest;
+ u8 i;
+ u8 j;
+ i = 0x0;
+ dest = &dest[top * 32 + left];
+ for (; i < height; i++)
+ {
+ _dest = dest + i * 32;
+ for (j = 0; j < width; j++)
+ {
+ *_dest++ = src;
+ }
+ }
+}
+void sub_8124E2C(u16 *dest, u16 *src, u8 left, u8 top, u8 width, u8 height)
+{
+ u16 *_dest;
+ u16 *_src = src;
+ u8 i;
+ u8 j;
+ i = 0x0;
+ dest = &dest[top * 32 + left];
+ for (; i < height; i++)
+ {
+ _dest = dest + i * 32;
+ for (j = 0; j < width; j++)
+ {
+ *_dest++ = *_src++;
+ }
+ }
+}
diff --git a/src/berry_blender.c b/src/scene/berry_blender.c
index 029d352df..53308e856 100644
--- a/src/berry_blender.c
+++ b/src/scene/berry_blender.c
@@ -7,19 +7,20 @@
#include "menu.h"
#include "strings2.h"
#include "sound.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "berry.h"
#include "string_util.h"
#include "link.h"
#include "task.h"
-#include "rom4.h"
+#include "overworld.h"
#include "item.h"
-#include "items.h"
-#include "rng.h"
+#include "constants/items.h"
+#include "random.h"
#include "save.h"
#include "menu_cursor.h"
#include "trig.h"
#include "pokeblock.h"
+#include "ewram.h"
//needed to match Blender_ControlHitPitch
struct MusicPlayerInfo
@@ -199,7 +200,7 @@ void sub_80A6978(void);
u8 sub_80A7DEC(u8 berryId, u8 x, u8 y, bool8 animate);
void sub_814A880(u8 a1, u8 a2);
u8 sub_814A5C0(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5);
-s8 sub_810CA00(void);
+s8 GetFirstFreePokeblockSlot(void);
bool8 sub_810CA34(struct Pokeblock *pokeblock);
#ifdef GERMAN
extern void de_sub_8073110();
@@ -207,8 +208,7 @@ extern void de_sub_8073110();
extern struct MusicPlayerInfo gMPlay_SE2;
extern struct MusicPlayerInfo gMPlay_BGM;
-extern u8 ewram[];
-extern u16 gScriptItemId;
+extern u16 gSpecialVar_ItemId;
extern u8 gUnknown_020297ED;
extern u8 byte_3002A68;
@@ -828,7 +828,7 @@ static bool8 sub_804E2EC(void)
switch (gBerryBlenderData->field_1)
{
case 0:
- sub_800D238(gUnknown_08E6C100, &ewram[0x10000]);
+ LZDecompressWram(gUnknown_08E6C100, ewram10000);
gBerryBlenderData->field_1++;
break;
case 1:
@@ -843,7 +843,7 @@ static bool8 sub_804E2EC(void)
break;
case 2:
{
- void* offsetRead = &ewram[0x10000];
+ void* offsetRead = ewram10000;
void* offsetWrite = (void*)(VRAM);
u32 size = 0x2000;
while (TRUE)
@@ -862,16 +862,16 @@ static bool8 sub_804E2EC(void)
}
break;
case 3:
- sub_800D238(gUnknown_08E6C920, &ewram[0x10000]);
+ LZDecompressWram(gUnknown_08E6C920, ewram10000);
gBerryBlenderData->field_1++;
break;
case 4:
- sub_800D238(gUnknown_08E6D354, &ewram[0x13000]);
+ LZDecompressWram(gUnknown_08E6D354, ewram13000);
gBerryBlenderData->field_1++;
break;
case 5:
{
- void* offsetRead = &ewram[0x10000];
+ void* offsetRead = ewram10000;
void* offsetWrite = (void*)(VRAM + 0xE000);
DmaCopy16(3, offsetRead, offsetWrite, 0x1000);
@@ -880,7 +880,7 @@ static bool8 sub_804E2EC(void)
break;
case 6:
{
- void* offsetRead = &ewram[0x11000];
+ void* offsetRead = ewram11000;
void* offsetWrite = (void*)(VRAM + 0xF000);
DmaCopy16(3, offsetRead, offsetWrite, 0x1000);
@@ -890,7 +890,7 @@ static bool8 sub_804E2EC(void)
case 7:
{
u16 i;
- u16* palStore = (u16*)(&ewram[0x13000]);
+ u16* palStore = (u16*)(ewram13000);
void* offsetRead;
void* offsetWrite;
@@ -898,7 +898,7 @@ static bool8 sub_804E2EC(void)
{
*(palStore + i) |= 0x100;
}
- offsetRead = &ewram[0x13000];
+ offsetRead = ewram13000;
offsetWrite = (void*)(VRAM + 0x6000);
DmaCopy16(3, offsetRead, offsetWrite, 0x500);
LoadPalette(sBlenderOuterPal, 0x80, 0x20);
@@ -933,11 +933,11 @@ static void sub_804E4FC(void)
REG_BG1VOFS = 0;
}
-void sub_804E538(void)
+void DoBerryBlending(void)
{
u8* field6F; //this temp value is needed to match
- gBerryBlenderData = (struct BerryBlenderData*)(&ewram[0x18000]);
+ gBerryBlenderData = eBerryBlenderData;
field6F = &gBerryBlenderData->field_6F;
gBerryBlenderData->field_0 = 0;
@@ -1019,34 +1019,34 @@ static void sub_804E56C(void)
void sub_804E738(struct Sprite* sprite)
{
- sprite->data1 += sprite->data6;
- sprite->data2 -= sprite->data4;
- sprite->data2 += sprite->data7;
- sprite->data0 += sprite->data7;
- sprite->data4--;
+ sprite->data[1] += sprite->data[6];
+ sprite->data[2] -= sprite->data[4];
+ sprite->data[2] += sprite->data[7];
+ sprite->data[0] += sprite->data[7];
+ sprite->data[4]--;
- if (sprite->data0 < sprite->data2)
+ if (sprite->data[0] < sprite->data[2])
{
- sprite->data3 = sprite->data4 = sprite->data3 - 1;
- if (++sprite->data5 > 3)
+ sprite->data[3] = sprite->data[4] = sprite->data[3] - 1;
+ if (++sprite->data[5] > 3)
DestroySprite(sprite);
else
PlaySE(SE_TB_KARA);
}
- sprite->pos1.x = sprite->data1;
- sprite->pos1.y = sprite->data2;
+ sprite->pos1.x = sprite->data[1];
+ sprite->pos1.y = sprite->data[2];
}
void sub_804E794(struct Sprite* sprite, s16 a2, s16 a3, s16 a4, s16 a5, s16 a6)
{
- sprite->data0 = a3;
- sprite->data1 = a2;
- sprite->data2 = a3;
- sprite->data3 = a4;
- sprite->data4 = 10;
- sprite->data5 = 0;
- sprite->data6 = a5;
- sprite->data7 = a6;
+ sprite->data[0] = a3;
+ sprite->data[1] = a2;
+ sprite->data[2] = a3;
+ sprite->data[3] = a4;
+ sprite->data[4] = 10;
+ sprite->data[5] = 0;
+ sprite->data[6] = a5;
+ sprite->data[7] = a6;
sprite->callback = sub_804E738;
}
@@ -1111,7 +1111,7 @@ void sub_804E990(void)
s32 i;
REG_DISPCNT = 0;
- gBerryBlenderData = (struct BerryBlenderData*)(&ewram[0x18000]);
+ gBerryBlenderData = eBerryBlenderData;
gBerryBlenderData->field_0 = 0;
gBerryBlenderData->field_134 = 0;
for (i = 0; i < BLENDER_MAX_PLAYERS; i++)
@@ -1192,7 +1192,7 @@ static void sub_804E9F8(void)
case 8:
gBerryBlenderData->field_0++;
gBerryBlenderData->field_13C = 0;
- Blender_CopyBerryData(&gBerryBlenderData->blendedBerries[0], gScriptItemId);
+ Blender_CopyBerryData(&gBerryBlenderData->blendedBerries[0], gSpecialVar_ItemId);
memcpy(gBlockSendBuffer, &gBerryBlenderData->blendedBerries[0], sizeof(struct BlenderBerry));
sub_80084A4();
gBerryBlenderData->framesToWait = 0;
@@ -1438,9 +1438,9 @@ static void sub_804F378(void)
{
case 0:
sub_804F0F4();
- Blender_SetBankBerryData(0, gScriptItemId);
- Blender_CopyBerryData(&gBerryBlenderData->blendedBerries[0], gScriptItemId);
- sub_804F1BC(gScriptItemId, gBerryBlenderData->playersNo, &gBerryBlenderData->blendedBerries[0]);
+ Blender_SetBankBerryData(0, gSpecialVar_ItemId);
+ Blender_CopyBerryData(&gBerryBlenderData->blendedBerries[0], gSpecialVar_ItemId);
+ sub_804F1BC(gSpecialVar_ItemId, gBerryBlenderData->playersNo, &gBerryBlenderData->blendedBerries[0]);
for (i = 0; i < BLENDER_MAX_PLAYERS; i++)
{
gBerryBlenderData->field_70[i] = 0;
@@ -2621,7 +2621,7 @@ static void sub_8050954(void)
gBerryBlenderData->field_7C = 2;
gSendCmd[1] = 0x9999;
}
- else if (sub_810CA00() == -1)
+ else if (GetFirstFreePokeblockSlot() == -1)
{
gBerryBlenderData->field_7C = 3;
gSendCmd[1] = 0xAAAA;
@@ -2816,7 +2816,7 @@ static void sub_8050E30(void)
if (!gPaletteFade.active)
{
if (gBerryBlenderData->field_70[0] == 0x2222)
- SetMainCallback2(sub_804E538);
+ SetMainCallback2(DoBerryBlending);
else
{
gBerryBlenderData->framesToWait = 0;
@@ -2880,7 +2880,7 @@ static void sub_80510E8(void)
if (!gPaletteFade.active)
{
if (gBerryBlenderData->field_7C == 0)
- SetMainCallback2(sub_804E538);
+ SetMainCallback2(DoBerryBlending);
else
SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music);
}
@@ -3012,10 +3012,10 @@ static void sub_80514F0(void)
void sub_8051524(struct Sprite* sprite)
{
- sprite->data2 += sprite->data0;
- sprite->data3 += sprite->data1;
- sprite->pos2.x = sprite->data2 / 8;
- sprite->pos2.y = sprite->data3 / 8;
+ sprite->data[2] += sprite->data[0];
+ sprite->data[3] += sprite->data[1];
+ sprite->pos2.x = sprite->data[2] / 8;
+ sprite->pos2.y = sprite->data[3] / 8;
if (sprite->animEnded)
DestroySprite(sprite);
}
@@ -3037,8 +3037,8 @@ static void sub_805156C(void)
y = gSineTable[(rand & 0xFF)] / 4;
spriteID = CreateSprite(&sSpriteTemplate_82164FC, x + 120, y + 80, 1);
- gSprites[spriteID].data0 = 16 - (Random() % 32);
- gSprites[spriteID].data1 = 16 - (Random() % 32);
+ gSprites[spriteID].data[0] = 16 - (Random() % 32);
+ gSprites[spriteID].data[1] = 16 - (Random() % 32);
gSprites[spriteID].callback = sub_8051524;
}
@@ -3046,16 +3046,16 @@ static void sub_805156C(void)
static void sub_8051650(struct Sprite* sprite)
{
- sprite->data0++;
- sprite->pos2.y = -(sprite->data0 / 3);
+ sprite->data[0]++;
+ sprite->pos2.y = -(sprite->data[0] / 3);
if (sprite->animEnded)
DestroySprite(sprite);
}
void sub_8051684(struct Sprite* sprite)
{
- sprite->data0++;
- sprite->pos2.y = -(sprite->data0 * 2);
+ sprite->data[0]++;
+ sprite->pos2.y = -(sprite->data[0] * 2);
if (sprite->pos2.y < -12)
sprite->pos2.y = -12;
if (sprite->animEnded)
@@ -3110,74 +3110,74 @@ void unref_sub_80516F8(u8 taskID)
static void sub_805181C(struct Sprite* sprite)
{
- switch (sprite->data0)
+ switch (sprite->data[0])
{
case 0:
- sprite->data1 += 8;
- if (sprite->data1 > 88)
+ sprite->data[1] += 8;
+ if (sprite->data[1] > 88)
{
- sprite->data1 = 88;
- sprite->data0++;
+ sprite->data[1] = 88;
+ sprite->data[0]++;
PlaySE(SE_KON);
}
break;
case 1:
- sprite->data2 += 1;
- if (sprite->data2 > 20)
+ sprite->data[2] += 1;
+ if (sprite->data[2] > 20)
{
- sprite->data0++;
- sprite->data2 = 0;
+ sprite->data[0]++;
+ sprite->data[2] = 0;
}
break;
case 2:
- sprite->data1 += 4;
- if (sprite->data1 > 176)
+ sprite->data[1] += 4;
+ if (sprite->data[1] > 176)
{
- if (++sprite->data3 == 3)
+ if (++sprite->data[3] == 3)
{
DestroySprite(sprite);
CreateSprite(&sSpriteTemplate_821657C, 120, -20, 2);
}
else
{
- sprite->data0 = 0;
- sprite->data1 = -16;
- StartSpriteAnim(sprite, sprite->data3);
+ sprite->data[0] = 0;
+ sprite->data[1] = -16;
+ StartSpriteAnim(sprite, sprite->data[3]);
}
}
break;
}
- sprite->pos2.y = sprite->data1;
+ sprite->pos2.y = sprite->data[1];
}
static void sub_80518CC(struct Sprite* sprite)
{
- switch (sprite->data0)
+ switch (sprite->data[0])
{
case 0:
- sprite->data1 += 8;
- if (sprite->data1 > 92)
+ sprite->data[1] += 8;
+ if (sprite->data[1] > 92)
{
- sprite->data1 = 92;
- sprite->data0++;
+ sprite->data[1] = 92;
+ sprite->data[0]++;
PlaySE(SE_PIN);
}
break;
case 1:
- sprite->data2 += 1;
- if (sprite->data2 > 20)
- sprite->data0++;
+ sprite->data[2] += 1;
+ if (sprite->data[2] > 20)
+ sprite->data[0]++;
break;
case 2:
- sprite->data1 += 4;
- if (sprite->data1 > 176)
+ sprite->data[1] += 4;
+ if (sprite->data[1] > 176)
{
gBerryBlenderData->field_0++;
DestroySprite(sprite);
}
break;
}
- sprite->pos2.y = sprite->data1;
+ sprite->pos2.y = sprite->data[1];
}
static void sub_805194C(u16 a0, u16 a1)
@@ -3431,7 +3431,7 @@ static bool8 Blender_PrintBlendingResults(void)
Blender_PrintMadePokeblockString(&pokeblock, gBerryBlenderData->stringVar);
CreateTask(sub_8052BD0, 6);
MenuPrintMessage(gBerryBlenderData->stringVar, 1, 15);
- RemoveBagItem(gScriptItemId, 1);
+ RemoveBagItem(gSpecialVar_ItemId, 1);
sub_810CA34(&pokeblock);
gBerryBlenderData->field_0++;
break;
@@ -3710,7 +3710,7 @@ static void sub_80527BC(void)
gUnknown_020297E0 = 0;
gUnknown_020297DC = 2;
for (i = 0; i < 200; i++)
- ewram[i] = 0;
+ gSharedMem[i] = 0;
gUnknown_020297E8 = 0;
}
for (i = 0; i < 100; i++)
@@ -3719,7 +3719,7 @@ static void sub_80527BC(void)
gUnknown_020297E0++;
else
{
- u16* ewramPtr = ((u16*)(ewram));
+ u16* ewramPtr = ((u16*)(gSharedMem));
ewramPtr[gUnknown_020297E4] = gUnknown_020297E0;
gUnknown_020297E4++;
gUnknown_020297E0 = 0;
diff --git a/src/scene/cable_car.c b/src/scene/cable_car.c
new file mode 100644
index 000000000..52a0aeebf
--- /dev/null
+++ b/src/scene/cable_car.c
@@ -0,0 +1,979 @@
+
+// Includes
+#include "global.h"
+#include "ewram.h"
+#include "overworld.h"
+#include "palette.h"
+#include "random.h"
+#include "main.h"
+#include "script.h"
+#include "task.h"
+#include "sound.h"
+#include "graphics.h"
+#include "constants/songs.h"
+#include "decompress.h"
+#include "field_weather.h"
+#include "field_map_obj.h"
+#include "unknown_task.h"
+#include "event_data.h"
+#include "cable_car_util.h"
+#include "constants/map_objects.h"
+
+// Static type declarations
+
+// Credits to Made (dolphin emoji)
+#define S16TOPOSFLOAT(val) \
+({ \
+ s16 v = (val); \
+ float f = (float)v; \
+ if(v < 0) f += 65536.0f; \
+ f; \
+})
+
+struct CableCarEwramStruct1 {
+ u8 unk_0000;
+ u8 unk_0001;
+ u8 unk_0002;
+ u8 unk_0003;
+ u16 unk_0004;
+ u16 unk_0006;
+ u8 unk_0008;
+ u8 unk_0009;
+ u8 filler_000a[2];
+ u8 unk_000c;
+ u8 unk_000d;
+ u8 filler_0000e[6];
+ u8 unk_0014;
+ u8 unk_0015;
+ u8 unk_0016;
+ u8 unk_0017;
+ u8 unk_0018;
+ u8 unk_0019;
+ u8 unk_001a;
+ u8 unk_001b;
+ u8 unk_001c;
+ u8 unk_001d;
+ u8 unk_001e;
+ u8 unk_001f;
+ u8 unk_0020;
+ u16 unk_0022[9][12];
+ u8 filler_00fa[2];
+ u16 unk_00fc[0x20][0x20];
+ u16 unk_08fc[0x20][0x20];
+}; // size 0x10FC
+
+struct CableCarEwramStruct2 {
+ /* 0x000 */ u16 mtChimneyTilemap[0xb4];
+ /* 0x168 */ u16 treeTilemap[0x1e0];
+ /* 0x528 */ u16 mountainTilemap[0x258];
+ /* 0x9d8 */ u16 pylonStemTilemap[0x628]; // size not actually known
+};
+
+// Static RAM declarations
+
+EWRAM_DATA struct CableCarEwramStruct1 *sCableCarPtr = NULL;
+EWRAM_DATA u8 gUnknown_02039278 = 0;
+EWRAM_DATA u8 gUnknown_02039279 = 0;
+EWRAM_DATA u8 gUnknown_0203927A = 0;
+EWRAM_DATA u8 gUnknown_0203927B = 0;
+EWRAM_DATA u8 gUnknown_0203927C = 0;
+EWRAM_DATA u8 gUnknown_0203927D = 0;
+EWRAM_DATA u32 filler_02039280 = 0;
+
+// Static ROM declarations
+
+static void CableCarMainCallback_Setup(void);
+static void CableCarMainCallback_Run(void);
+static void sub_8123878(u8 taskId);
+static void sub_81239E4(u8 taskId);
+static void sub_8123AF8(u8 taskId);
+static void CableCarVblankCallback(void);
+static void nullsub_76(struct Sprite *sprite);
+static void sub_8123CB8(struct Sprite *sprite);
+static void sub_8123EB8(struct Sprite *sprite);
+static void sub_8123F44(struct Sprite *sprite);
+static void sub_8123FBC(u8);
+static void LoadSprites(void);
+static void sub_812453C(void);
+static void sub_8124598(void);
+static void sub_81245F4(void);
+static void sub_812476C(void);
+static void sub_81248AC(u8);
+
+// .rodata
+
+static const u8 gCableCarMtChimneyTilemap[] = INCBIN_U8("graphics/misc/cable_car_mt_chimney_map.bin.lz");
+
+static const u8 gCableCarTreeTilemap[] = INCBIN_U8("graphics/misc/cable_car_tree_map.bin.lz");
+
+static const u8 gCableCarMountainTilemap[] = INCBIN_U8("graphics/misc/cable_car_mountain_map.bin.lz");
+
+static const u16 gCableCarPylonHookTilemapEntries[] = {
+ 0x3000,
+ 0x3001,
+ 0x3002,
+ 0x3003,
+ 0x3004,
+ 0x3005,
+ 0x3006,
+ 0x3007,
+ 0x3008,
+ 0x3009
+};
+
+static const u8 gCableCarPylonStemTilemap[] = INCBIN_U8("graphics/misc/cable_car_pylon_stem_map.bin.lz");
+
+static const struct CompressedSpriteSheet gUnknown_08401CF8[] = {
+ { gCableCar_Gfx, 0x800, 1 },
+ { gCableCarDoor_Gfx, 0x40, 2 },
+ { gCableCarCord_Gfx, 0x80, 3 },
+ { }
+};
+static const struct SpritePalette gUnknown_08401D18[] = {
+ { gCableCar_Pal, 1 },
+ { }
+};
+
+static const struct OamData gOamData_8401D28 = {
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .size = 3,
+ .priority = 2
+};
+
+static const struct OamData gOamData_8401D30 = {
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .shape = ST_OAM_H_RECTANGLE,
+ .priority = 2
+};
+
+static const struct OamData gOamData_8401D38 = {
+ .affineMode = ST_OAM_AFFINE_DOUBLE,
+ .size = 1,
+ .priority = 2
+};
+
+static const struct SpriteTemplate gSpriteTemplate_8401D40[] = {
+ {
+ 1,
+ 1,
+ &gOamData_8401D28,
+ gDummySpriteAnimTable,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ sub_8123CB8
+ }, {
+ 2,
+ 1,
+ &gOamData_8401D30,
+ gDummySpriteAnimTable,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ sub_8123CB8
+ }, {
+ 3,
+ 1,
+ &gOamData_8401D38,
+ gDummySpriteAnimTable,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ nullsub_76
+ }
+};
+
+// .text
+
+static void CableCarTask1(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ SetMainCallback2(CableCarMainCallback_Setup);
+ DestroyTask(taskId);
+ }
+}
+
+void CableCar(void)
+{
+ ScriptContext2_Enable();
+ CreateTask(CableCarTask1, 1);
+ BeginNormalPaletteFade(-1, 0, 0, 16, 0);
+}
+
+static void CableCarMainCallback_Setup(void)
+{
+ u8 i;
+ u16 imebak;
+
+ switch (gMain.state)
+ {
+ case 0:
+ default:
+ SetVBlankCallback(NULL);
+ remove_some_task();
+ DmaFill16Large(3, 0, VRAM, VRAM_SIZE, 0x1000);
+ DmaFill32Defvars(3, 0, OAM, OAM_SIZE);
+ DmaFill16Defvars(3, 0, PLTT, PLTT_SIZE);
+ sCableCarPtr = eCableCar1;
+ DmaFill16Large(3, 0, eCableCar1, 0x10FC, 0x1000);
+ gMain.state++;
+ break;
+ case 1:
+ ResetSpriteData();
+ ResetTasks();
+ FreeAllSpritePalettes();
+ ResetPaletteFade();
+ StartWeather();
+ for (i = 0; i < 20; i++)
+ {
+ gWeatherPtr->sprites.s2.ashSprites[i] = NULL;
+ }
+ InitMapMusic();
+ ResetMapMusic();
+ gSpriteCoordOffsetX = gSpriteCoordOffsetY = 0;
+ gMain.state++;
+ break;
+ case 2:
+ for (i = 0; i < 3; i++)
+ {
+ LoadCompressedObjectPic(&gUnknown_08401CF8[i]);
+ }
+ LoadSpritePalettes(gUnknown_08401D18);
+ LZDecompressWram(gCableCarMtChimneyTilemap, eCableCar2->mtChimneyTilemap);
+ LZDecompressWram(gCableCarTreeTilemap, eCableCar2->treeTilemap);
+ LZDecompressWram(gCableCarMountainTilemap, eCableCar2->mountainTilemap);
+ LZDecompressWram(gCableCarPylonStemTilemap, eCableCar2->pylonStemTilemap);
+ LoadPalette(gCableCarBG_Pal, 0, 0x80);
+ LZ77UnCompVram(gCableCarBG_Gfx, (u16 *)BG_VRAM);
+ gMain.state++;
+ break;
+ case 3:
+ LoadSprites();
+ RunTasks();
+ gMain.state++;
+ break;
+ case 4:
+ if (sCableCarPtr->unk_0002 == 7)
+ {
+ gMain.state++;
+ }
+ else if (gWeatherPtr->sprites.s2.ashSprites[0] != NULL)
+ {
+ for (i = 0; i < 20; i++)
+ {
+ if (gWeatherPtr->sprites.s2.ashSprites[i] != NULL)
+ {
+ gWeatherPtr->sprites.s2.ashSprites[i]->oam.priority = 0;
+ }
+ }
+ gMain.state++;
+ }
+ break;
+ case 5:
+ CableCarUtil_CopyWrapped((void *)BG_SCREEN_ADDR(29), eCableCar2->treeTilemap, 0, 17, 32, 15);
+ CableCarUtil_CopyWrapped((void *)BG_SCREEN_ADDR(30), eCableCar2->mountainTilemap, 0, 0, 30, 20);
+ CableCarUtil_CopyWrapped(sCableCarPtr->unk_08fc, gCableCarPylonHookTilemapEntries, 0, 0, 5, 2);
+ CableCarUtil_CopyWrapped(sCableCarPtr->unk_08fc, eCableCar2->pylonStemTilemap, 0, 2, 2, 20);
+ gMain.state++;
+ break;
+ case 6:
+ sub_81248AC(gSpecialVar_0x8004);
+ CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x48, 0, 14, 12, 3);
+ CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x6C, 12, 17, 12, 3);
+ CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x90, 24, 20, 12, 3);
+ CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x00, 0, 17, 12, 3);
+ CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x24, 0, 20, 12, 3);
+ CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x00, 12, 20, 12, 3);
+ CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x24, 12, 23, 12, 3);
+ CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x00, 24, 23, 12, 3);
+ gMain.state++;
+ break;
+ case 7:
+ BeginNormalPaletteFade(-1, 3, 16, 0, 0);
+ FadeInNewBGM(BGM_ROPEWAY, 1);
+ sub_8123FBC(1);
+ gMain.state++;
+ break;
+ case 8:
+ imebak = REG_IME;
+ REG_IME = 0;
+ REG_IE |= INTR_FLAG_VBLANK;
+ REG_IME = imebak;
+ SetVBlankCallback(CableCarVblankCallback);
+ SetMainCallback2(CableCarMainCallback_Run);
+ CreateTask(sub_8123878, 0);
+ if (gSpecialVar_0x8004 == 0)
+ {
+ sCableCarPtr->unk_0000 = CreateTask(sub_81239E4, 1);
+ }
+ else
+ {
+ sCableCarPtr->unk_0000 = CreateTask(sub_8123AF8, 1);
+ }
+ break;
+ }
+}
+
+static void CableCarMainCallback_Run(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+ MapMusicMain();
+}
+
+static void sub_8123740(void)
+{
+ u8 i;
+
+ i = 0;
+ sub_8123FBC(0);
+ gSpriteCoordOffsetX = 0;
+ sub_807C9B4(0);
+ for (; i < 20; i++)
+ {
+ gWeatherPtr->sprites.s2.ashSprites[i] = NULL;
+ }
+ ResetTasks();
+ ResetSpriteData();
+ ResetPaletteFade();
+ DmaFill32Large(3, 0, gSharedMem, 0x20000, 0x1000);
+ sCableCarPtr = NULL;
+ DmaFill16Large(3, 0, VRAM, VRAM_SIZE, 0x1000);
+ DmaFill32Defvars(3, 0, OAM, OAM_SIZE);
+ DmaFill16Defvars(3, 0, PLTT, PLTT_SIZE);
+ warp_in();
+ gFieldCallback = NULL;
+ SetMainCallback2(CB2_LoadMap);
+}
+
+static void sub_8123878(u8 taskId)
+{
+ u8 i;
+
+ i = 0;
+ sCableCarPtr->unk_0006++;
+ switch (sCableCarPtr->unk_0001)
+ {
+ case 0:
+ if (sCableCarPtr->unk_0006 == sCableCarPtr->unk_0004)
+ {
+ DoWeatherEffect(sCableCarPtr->unk_0002);
+ sCableCarPtr->unk_0001 = 1;
+ }
+ break;
+ case 1:
+ switch (sCableCarPtr->unk_0002)
+ {
+ case 7:
+ if (gWeatherPtr->sprites.s2.ashSprites[0] != NULL && gWeatherPtr->sprites.s2.ashSprites[0]->oam.priority != 0)
+ {
+ for (; i < 20; i++)
+ {
+ if (gWeatherPtr->sprites.s2.ashSprites[i] != NULL)
+ {
+ gWeatherPtr->sprites.s2.ashSprites[i]->oam.priority = 0;
+ }
+ }
+ sCableCarPtr->unk_0001 = 2;
+ }
+ break;
+ case 2:
+ if (gWeatherPtr->currWeather == 2)
+ {
+ sCableCarPtr->unk_0001 = 2;
+ }
+ else if (sCableCarPtr->unk_0006 >= sCableCarPtr->unk_0004 + 8)
+ {
+ for (; i < 20; i++)
+ {
+ if (gWeatherPtr->sprites.s2.ashSprites[i] != NULL)
+ {
+ gWeatherPtr->sprites.s2.ashSprites[i]->invisible ^= TRUE;
+ }
+ }
+ }
+ break;
+ }
+ break;
+ case 2:
+ if (sCableCarPtr->unk_0006 == 570)
+ {
+ sCableCarPtr->unk_0001 = 3;
+ BeginNormalPaletteFade(-1, 3, 0, 16, 0);
+ FadeOutBGM(4);
+ }
+ break;
+ case 3:
+ if (!gPaletteFade.active)
+ {
+ sCableCarPtr->unk_0001 = 255;
+ }
+ break;
+ case 255:
+ SetVBlankCallback(NULL);
+ DestroyTask(taskId);
+ DestroyTask(sCableCarPtr->unk_0000);
+ SetMainCallback2(sub_8123740);
+ break;
+ }
+}
+
+static void sub_81239E4(u8 taskId)
+{
+ if (sCableCarPtr->unk_0001 != 255)
+ {
+ sCableCarPtr->unk_0014--;
+ if ((sCableCarPtr->unk_0006 % 2) == 0)
+ {
+ sCableCarPtr->unk_0015--;
+ }
+ if ((sCableCarPtr->unk_0006 % 8) == 0)
+ {
+ sCableCarPtr->unk_000c--;
+ sCableCarPtr->unk_000d--;
+ }
+ switch (sCableCarPtr->unk_0014)
+ {
+ case 175:
+ CableCarUtil_FillWrapped(sCableCarPtr->unk_08fc, 0, 0, 22, 2, 10);
+ break;
+ case 40:
+ CableCarUtil_FillWrapped(sCableCarPtr->unk_08fc, 0, 3, 0, 2, 2);
+ break;
+ case 32:
+ CableCarUtil_FillWrapped(sCableCarPtr->unk_08fc, 0, 2, 0, 1, 2);
+ break;
+ case 16:
+ CableCarUtil_CopyWrapped(sCableCarPtr->unk_08fc, gCableCarPylonHookTilemapEntries, 0, 0, 5, 2);
+ CableCarUtil_CopyWrapped(sCableCarPtr->unk_08fc, eCableCar2->pylonStemTilemap, 0, 2, 2, 30);
+ sCableCarPtr->unk_0015 = 64;
+ break;
+ }
+ }
+ sub_812453C();
+ gSpriteCoordOffsetX = (gSpriteCoordOffsetX + 1) % 128;
+}
+
+static void sub_8123AF8(u8 taskId)
+{
+ if (sCableCarPtr->unk_0001 != 255)
+ {
+ sCableCarPtr->unk_0014++;
+ if ((sCableCarPtr->unk_0006 % 2) == 0)
+ {
+ sCableCarPtr->unk_0015++;
+ }
+ if ((sCableCarPtr->unk_0006 % 8) == 0)
+ {
+ sCableCarPtr->unk_000c++;
+ sCableCarPtr->unk_000d++;
+ }
+ switch (sCableCarPtr->unk_0014)
+ {
+ case 176:
+ CableCarUtil_CopyWrapped(sCableCarPtr->unk_08fc, eCableCar2->pylonStemTilemap, 0, 2, 2, 30);
+ break;
+ case 16:
+ CableCarUtil_FillWrapped(sCableCarPtr->unk_08fc, 0, 2, 0, 3, 2);
+ CableCarUtil_FillWrapped(sCableCarPtr->unk_08fc, 0, 0, 22, 2, 10);
+ sCableCarPtr->unk_0015 = 192;
+ break;
+ case 32:
+ sCableCarPtr->unk_08fc[0][2] = (gCableCarPylonHookTilemapEntries + 2)[0];
+ sCableCarPtr->unk_08fc[0][3] = (gCableCarPylonHookTilemapEntries + 2)[1];
+ sCableCarPtr->unk_08fc[1][2] = (gCableCarPylonHookTilemapEntries + 2)[5];
+ sCableCarPtr->unk_08fc[1][3] = (gCableCarPylonHookTilemapEntries + 2)[6];
+ break;
+ case 40:
+ sCableCarPtr->unk_08fc[0][4] = (gCableCarPylonHookTilemapEntries + 4)[0];
+ sCableCarPtr->unk_08fc[1][4] = (gCableCarPylonHookTilemapEntries + 4)[5];
+ break;
+ }
+ }
+ sub_8124598();
+ if (sCableCarPtr->unk_0006 < sCableCarPtr->unk_0004) {
+ gSpriteCoordOffsetX = (gSpriteCoordOffsetX + 247) % 248;
+ }
+ else
+ {
+ gWeatherPtr->unknown_6FC = (gWeatherPtr->unknown_6FC + 247) % 248;
+ }
+}
+
+static void CableCarVblankCallback(void)
+{
+ DmaCopy16(3, sCableCarPtr->unk_00fc, BG_SCREEN_ADDR(28), 0x800);
+ DmaCopy16(3, sCableCarPtr->unk_08fc, BG_SCREEN_ADDR(31), 0x800);
+ REG_BG3HOFS = sCableCarPtr->unk_0014;
+ REG_BG3VOFS = sCableCarPtr->unk_0015;
+ REG_BG1HOFS = sCableCarPtr->unk_000c;
+ REG_BG1VOFS = sCableCarPtr->unk_000d;
+ REG_BG0HOFS = sCableCarPtr->unk_0008;
+ REG_BG0VOFS = sCableCarPtr->unk_0009;
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+static void nullsub_76(struct Sprite *sprite)
+{
+
+}
+
+static void sub_8123CB8(struct Sprite *sprite)
+{
+ if (sCableCarPtr->unk_0001 != 255)
+ {
+ if (gSpecialVar_0x8004 == 0)
+ {
+ sprite->pos1.x = sprite->data[0] - (u8)(0.14f * S16TOPOSFLOAT(sCableCarPtr->unk_0006));
+ sprite->pos1.y = sprite->data[1] - (u8)(0.067f * S16TOPOSFLOAT(sCableCarPtr->unk_0006));
+ }
+ else
+ {
+ sprite->pos1.x = sprite->data[0] + (u8)(0.14f * S16TOPOSFLOAT(sCableCarPtr->unk_0006));
+ sprite->pos1.y = sprite->data[1] + (u8)(0.067f * S16TOPOSFLOAT(sCableCarPtr->unk_0006));
+ }
+ }
+}
+
+static void sub_8123D98(struct Sprite *sprite)
+{
+ if (sCableCarPtr->unk_0001 != 255)
+ {
+ if (gSpecialVar_0x8004 == 0)
+ {
+ sprite->pos1.x = sprite->data[0] - (u8)(0.14f * S16TOPOSFLOAT(sCableCarPtr->unk_0006));
+ sprite->pos1.y = sprite->data[1] - (u8)(0.067f * S16TOPOSFLOAT(sCableCarPtr->unk_0006));
+ }
+ else
+ {
+ sprite->pos1.x = sprite->data[0] + (u8)(0.14f * S16TOPOSFLOAT(sCableCarPtr->unk_0006));
+ sprite->pos1.y = sprite->data[1] + (u8)(0.067f * S16TOPOSFLOAT(sCableCarPtr->unk_0006));
+ }
+ switch (sprite->data[2])
+ {
+ case 0:
+ sprite->pos2.y = 17;
+ if (sprite->data[3] ++ > 9)
+ {
+ sprite->data[3] = 0;
+ sprite->data[2] ++;
+ }
+ break;
+ default:
+ sprite->pos2.y = 16;
+ if (sprite->data[3] ++ > 9)
+ {
+ sprite->data[3] = 0;
+ sprite->data[2] = 0;
+ }
+ break;
+ }
+ }
+}
+
+static void sub_8123EB8(struct Sprite *sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sprite->pos1.x += 2 * sprite->centerToCornerVecX;
+ sprite->pos1.y += 16 + sprite->centerToCornerVecY;
+ }
+ if (++sprite->data[0] >= sprite->data[2])
+ {
+ switch (sprite->data[1])
+ {
+ case 0:
+ sprite->pos1.x++;
+ if ((sprite->data[0] % 4) == 0)
+ {
+ sprite->pos1.y++;
+ }
+ break;
+ case 1:
+ if ((sprite->data[0] % 2) != 0)
+ {
+ sprite->pos1.x++;
+ if ((sprite->pos1.x % 4) == 0)
+ {
+ sprite->pos1.y++;
+ }
+ }
+ break;
+ }
+ if (sprite->pos1.y > 0xa0)
+ {
+ DestroySprite(sprite);
+ }
+ }
+}
+
+static void sub_8123F44(struct Sprite *sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sprite->pos1.y += 16 + sprite->centerToCornerVecY;
+ }
+ if (++sprite->data[0] >= sprite->data[2])
+ {
+ switch (sprite->data[1])
+ {
+ case 0:
+ sprite->pos1.x--;
+ if ((sprite->data[0] % 4) == 0)
+ {
+ sprite->pos1.y--;
+ }
+ break;
+ case 1:
+ if ((sprite->data[0] % 2) != 0)
+ {
+ sprite->pos1.x--;
+ if ((sprite->pos1.x % 4) == 0)
+ {
+ sprite->pos1.y--;
+ }
+ }
+ break;
+ }
+ if (sprite->pos1.y < 0x50)
+ {
+ DestroySprite(sprite);
+ }
+ }
+}
+
+static void sub_8123FBC(bool8 which)
+{
+ switch (which)
+ {
+ case FALSE:
+ default:
+ REG_WININ = 0;
+ REG_WINOUT = 0;
+ REG_WIN0H = 0;
+ REG_WIN1H = 0;
+ REG_WIN0V = 0;
+ REG_WIN1V = 0;
+ REG_DISPCNT = 0;
+ REG_BG3CNT = 0;
+ REG_BG2CNT = 0;
+ REG_BG1CNT = 0;
+ REG_BG0CNT = 0;
+ REG_BG3HOFS = 0;
+ REG_BG3VOFS = 0;
+ REG_BG2HOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ REG_BLDCNT = 0;
+ break;
+ case TRUE:
+ REG_WININ = 0;
+ REG_WINOUT = 0;
+ REG_WIN0H = 0;
+ REG_WIN1H = 0;
+ REG_WIN0V = 0;
+ REG_WIN1V = 0;
+ if (gSpecialVar_0x8004 == 0)
+ {
+ sCableCarPtr->unk_0014 = 0xb0;
+ sCableCarPtr->unk_0015 = 0x10;
+ sCableCarPtr->unk_000c = 0x00;
+ sCableCarPtr->unk_000d = 0x50;
+ sCableCarPtr->unk_0009 = 0;
+ sCableCarPtr->unk_0009 = 0;
+ }
+ else
+ {
+ sCableCarPtr->unk_0014 = 0x60;
+ sCableCarPtr->unk_0015 = 0xe8;
+ sCableCarPtr->unk_000c = 0x00;
+ sCableCarPtr->unk_000d = 0x04;
+ sCableCarPtr->unk_0009 = 0;
+ sCableCarPtr->unk_0009 = 0;
+ }
+ REG_BG3HOFS = sCableCarPtr->unk_0014;
+ REG_BG3VOFS = sCableCarPtr->unk_0015;
+ REG_BG2HOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG1HOFS = sCableCarPtr->unk_000c;
+ REG_BG1VOFS = sCableCarPtr->unk_000d;
+ REG_BG0HOFS = sCableCarPtr->unk_0008;
+ REG_BG0VOFS = sCableCarPtr->unk_0009;
+ REG_BG0CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(28) | BGCNT_WRAP;
+ REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(29) | BGCNT_WRAP;
+ REG_BG2CNT = BGCNT_PRIORITY(3) | BGCNT_SCREENBASE(30) | BGCNT_WRAP;
+ REG_BG3CNT = BGCNT_PRIORITY(0) | BGCNT_SCREENBASE(31) | BGCNT_WRAP;
+ REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON;
+ REG_BLDCNT = 0x3f00;
+ break;
+ }
+}
+
+static void LoadSprites(void)
+{
+ u8 spriteId;
+ u8 i;
+
+ u8 playerGraphicsIds[2] = {
+ MAP_OBJ_GFX_RIVAL_BRENDAN_NORMAL,
+ MAP_OBJ_GFX_RIVAL_MAY_NORMAL
+ };
+ u16 rval = Random();
+ u8 hikerGraphicsIds[4] = {
+ MAP_OBJ_GFX_HIKER,
+ MAP_OBJ_GFX_CAMPER,
+ MAP_OBJ_GFX_PICNICKER,
+ MAP_OBJ_GFX_POOCHYENA
+ };
+ s16 hikerCoords[2][2] = {
+ { 0, 80 },
+ { 240, 146 }
+ };
+ u8 hikerMovementDelayTable[4] = {
+ 0,
+ 60,
+ 120,
+ 170
+ };
+ void (*callbacks[2])(struct Sprite *) = {
+ sub_8123EB8,
+ sub_8123F44
+ };
+
+ switch (gSpecialVar_0x8004)
+ {
+ case 0:
+ default:
+ spriteId = AddPseudoFieldObject(playerGraphicsIds[gSaveBlock2.playerGender], sub_8123D98, 0xc8, 0x49, 0x66);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].oam.priority = 2;
+ gSprites[spriteId].pos2.x = 0x08;
+ gSprites[spriteId].pos2.y = 0x10;
+ gSprites[spriteId].data[0] = 0xc8;
+ gSprites[spriteId].data[1] = 0x49;
+ }
+ spriteId = CreateSprite(&gSpriteTemplate_8401D40[0], 0xb0, 0x2b, 0x67);
+ gSprites[spriteId].pos2.x = gSprites[spriteId].pos2.y = 0x20;
+ gSprites[spriteId].data[0] = 0xb0;
+ gSprites[spriteId].data[1] = 0x2b;
+ spriteId = CreateSprite(&gSpriteTemplate_8401D40[1], 0xc8, 0x63, 0x65);
+ gSprites[spriteId].pos2.x = 8;
+ gSprites[spriteId].pos2.y = 4;
+ gSprites[spriteId].data[0] = 0xc8;
+ gSprites[spriteId].data[1] = 0x63;
+ sCableCarPtr->unk_0002 = 7;
+ sCableCarPtr->unk_0004 = 0x15e;
+ sub_807C9B4(2);
+ break;
+ case 1:
+ CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x24, 0x18, 0x1a, 0x0c, 0x03);
+ spriteId = AddPseudoFieldObject(playerGraphicsIds[gSaveBlock2.playerGender], sub_8123D98, 0x80, 0x27, 0x66);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].oam.priority = 2;
+ gSprites[spriteId].pos2.x = 0x08;
+ gSprites[spriteId].pos2.y = 0x10;
+ gSprites[spriteId].data[0] = 0x80;
+ gSprites[spriteId].data[1] = 0x27;
+ }
+ spriteId = CreateSprite(&gSpriteTemplate_8401D40[0], 0x68, 0x09, 0x67);
+ gSprites[spriteId].pos2.x = gSprites[spriteId].pos2.y = 0x20;
+ gSprites[spriteId].data[0] = 0x68;
+ gSprites[spriteId].data[1] = 0x09;
+ spriteId = CreateSprite(&gSpriteTemplate_8401D40[1], 0x80, 0x41, 0x65);
+ gSprites[spriteId].pos2.x = 8;
+ gSprites[spriteId].pos2.y = 4;
+ gSprites[spriteId].data[0] = 0x80;
+ gSprites[spriteId].data[1] = 0x41;
+ sCableCarPtr->unk_0002 = 2;
+ sCableCarPtr->unk_0004 = 0x109;
+ sub_807C9B4(7);
+ break;
+ }
+ for (i = 0; i < 9; i++)
+ {
+ spriteId = CreateSprite(&gSpriteTemplate_8401D40[2], 16 * i + 0x60, 8 * i - 8, 0x68);
+ gSprites[spriteId].pos2.x = 8;
+ gSprites[spriteId].pos2.y = 8;
+ }
+ if ((rval % 64) == 0)
+ {
+ spriteId = AddPseudoFieldObject(hikerGraphicsIds[rval % 3], callbacks[gSpecialVar_0x8004], hikerCoords[gSpecialVar_0x8004][0], hikerCoords[gSpecialVar_0x8004][1], 0x6a);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].oam.priority = 2;
+ gSprites[spriteId].pos2.x = -gSprites[spriteId].centerToCornerVecX;
+ gSprites[spriteId].pos2.y = -gSprites[spriteId].centerToCornerVecY;
+ if (gSpecialVar_0x8004 == 0)
+ {
+ if (rval % 2)
+ {
+ StartSpriteAnim(&gSprites[spriteId], 6);
+ gSprites[spriteId].data[1] = 1;
+ gSprites[spriteId].pos1.y += 2;
+ }
+ else
+ {
+ StartSpriteAnim(&gSprites[spriteId], 7);
+ gSprites[spriteId].data[1] = 0;
+ }
+ }
+ else
+ {
+ if (rval % 2)
+ {
+ StartSpriteAnim(&gSprites[spriteId], 7);
+ gSprites[spriteId].data[1] = 1;
+ gSprites[spriteId].pos1.y += 2;
+ }
+ else
+ {
+ StartSpriteAnim(&gSprites[spriteId], 6);
+ gSprites[spriteId].data[1] = 0;
+ }
+ }
+ gSprites[spriteId].data[2] = hikerMovementDelayTable[rval % 4];
+ }
+ }
+}
+
+static void sub_812446C(void)
+{
+ u8 i;
+ u8 j;
+ u8 k;
+ u8 offset;
+
+ for (i = 0, k = 0, offset = 0x24 * (sCableCarPtr->unk_001b + 2); i < 3; i++)
+ {
+ for (j = 0; j < 12; j++)
+ {
+ sCableCarPtr->unk_0022[i][j] = *(eCableCar2->mtChimneyTilemap + (offset++));
+ sCableCarPtr->unk_0022[i + 3][j] = eCableCar2->mtChimneyTilemap[k];
+ sCableCarPtr->unk_0022[i + 6][j] = (eCableCar2->mtChimneyTilemap + 0x24)[k];
+ k++;
+ }
+ }
+ sCableCarPtr->unk_001b = (sCableCarPtr->unk_001b + 1) % 3;
+}
+
+static void sub_812453C(void)
+{
+ sCableCarPtr->unk_001c = (sCableCarPtr->unk_001c + 1) % 0x60;
+ sCableCarPtr->unk_0008 = sCableCarPtr->unk_001f - sCableCarPtr->unk_001d;
+ sCableCarPtr->unk_0009 = sCableCarPtr->unk_0020 - sCableCarPtr->unk_001e;
+ sCableCarPtr->unk_001d++;
+ if ((sCableCarPtr->unk_001d % 4) == 0)
+ {
+ sCableCarPtr->unk_001e++;
+ }
+ if (sCableCarPtr->unk_001d > 16)
+ {
+ sub_81245F4();
+ }
+}
+
+static void sub_8124598(void)
+{
+ sCableCarPtr->unk_001c = (sCableCarPtr->unk_001c + 1) % 0x60;
+ sCableCarPtr->unk_0008 = sCableCarPtr->unk_001f + sCableCarPtr->unk_001d;
+ sCableCarPtr->unk_0009 = sCableCarPtr->unk_0020 + sCableCarPtr->unk_001e;
+ sCableCarPtr->unk_001d++;
+ if ((sCableCarPtr->unk_001d % 4) == 0)
+ {
+ sCableCarPtr->unk_001e++;
+ }
+ if (sCableCarPtr->unk_001d > 16)
+ {
+ sub_812476C();
+ }
+}
+
+static void sub_81245F4(void)
+{
+ u8 i = 0;
+
+ sCableCarPtr->unk_001d = sCableCarPtr->unk_001e = 0;
+ sCableCarPtr->unk_001f = sCableCarPtr->unk_0008;
+ sCableCarPtr->unk_0020 = sCableCarPtr->unk_0009;
+ sCableCarPtr->unk_0019 = (sCableCarPtr->unk_0019 + 30) % 32;
+ sCableCarPtr->unk_0018 -= 2;
+ gUnknown_0203927A = (sCableCarPtr->unk_001a + 23) % 32;
+ for (i = 0; i < 9; i++)
+ {
+ gUnknown_02039278 = sCableCarPtr->unk_0019;
+ gUnknown_02039279 = (gUnknown_0203927A + i) % 32;
+ sCableCarPtr->unk_00fc[gUnknown_02039279][gUnknown_02039278] = sCableCarPtr->unk_0022[i][sCableCarPtr->unk_0018];
+ gUnknown_02039278 = (gUnknown_02039278 + 1) % 32;
+ sCableCarPtr->unk_00fc[gUnknown_02039279][gUnknown_02039278] = sCableCarPtr->unk_0022[i][sCableCarPtr->unk_0018 + 1];
+ }
+ gUnknown_02039278 = (sCableCarPtr->unk_0019 + 30) % 32;
+ CableCarUtil_FillWrapped(sCableCarPtr->unk_00fc, 0, gUnknown_02039278, 0, 2, 32);
+ if (sCableCarPtr->unk_0018 == 0)
+ {
+ sCableCarPtr->unk_001a = (sCableCarPtr->unk_001a + 29) % 32;
+ sCableCarPtr->unk_0018 = 12;
+ sub_812446C();
+ gUnknown_02039278 = (sCableCarPtr->unk_001a + 1) % 32;
+ CableCarUtil_FillWrapped(sCableCarPtr->unk_00fc, 0, 0, gUnknown_02039278, 32, 9);
+ }
+}
+
+static void sub_812476C(void)
+{
+ u8 i = 0;
+
+ sCableCarPtr->unk_001d = sCableCarPtr->unk_001e = 0;
+ sCableCarPtr->unk_001f = sCableCarPtr->unk_0008;
+ sCableCarPtr->unk_0020 = sCableCarPtr->unk_0009;
+ sCableCarPtr->unk_0019 = (sCableCarPtr->unk_0019 + 2) % 32;
+ sCableCarPtr->unk_0018 += 2;
+ gUnknown_0203927D = sCableCarPtr->unk_001a;
+ for (i = 0; i < 9; i++)
+ {
+ gUnknown_0203927B = sCableCarPtr->unk_0019;
+ gUnknown_0203927C = (gUnknown_0203927D + i) % 32;
+ sCableCarPtr->unk_00fc[gUnknown_0203927C][gUnknown_0203927B] = sCableCarPtr->unk_0022[i][sCableCarPtr->unk_0018];
+ gUnknown_0203927B = (gUnknown_0203927B + 1) % 32;
+ sCableCarPtr->unk_00fc[gUnknown_0203927C][gUnknown_0203927B] = sCableCarPtr->unk_0022[i][sCableCarPtr->unk_0018 + 1];
+ }
+ gUnknown_0203927C = (sCableCarPtr->unk_001a + 23) % 32;
+ CableCarUtil_FillWrapped(sCableCarPtr->unk_00fc, 0, sCableCarPtr->unk_0019, gUnknown_0203927C, 2, 9);
+ if (sCableCarPtr->unk_0018 == 10)
+ {
+ sCableCarPtr->unk_001a = (sCableCarPtr->unk_001a + 3) % 32;
+ sCableCarPtr->unk_0018 = 0xfe;
+ sub_812446C();
+ }
+}
+
+static void sub_81248AC(u8 a0)
+{
+ switch (a0)
+ {
+ case 0:
+ default:
+ sCableCarPtr->unk_001b = 2;
+ sCableCarPtr->unk_0019 = 0;
+ sCableCarPtr->unk_001a = 20;
+ sCableCarPtr->unk_0018 = 12;
+ sub_812446C();
+ sub_81245F4();
+ break;
+ case 1:
+ sCableCarPtr->unk_001b = 2;
+ sCableCarPtr->unk_0019 = 28;
+ sCableCarPtr->unk_001a = 20;
+ sCableCarPtr->unk_0018 = 4;
+ sub_812446C();
+ sub_812476C();
+ break;
+ }
+ sCableCarPtr->unk_001c = 0;
+}
diff --git a/src/contest_painting.c b/src/scene/contest_painting.c
index 391cbdfaa..442d8ec26 100644
--- a/src/contest_painting.c
+++ b/src/scene/contest_painting.c
@@ -6,14 +6,13 @@
#include "main.h"
#include "menu.h"
#include "palette.h"
-#include "rng.h"
+#include "random.h"
#include "sprite.h"
#include "string_util.h"
#include "strings.h"
#include "text.h"
#include "unknown_task.h"
-
-extern u8 unk_2000000[];
+#include "ewram.h"
static u8 gUnknown_03000750;
static u16 gUnknown_03000752;
@@ -26,9 +25,6 @@ u8 gUnknown_03005E40[0x4C];
struct ContestEntry *gUnknown_03005E8C;
u16 (*gUnknown_03005E90)[];
-extern struct ContestEntry unk_2015de0;
-extern struct Unk2015E00 unk_2015e00;
-
static const u16 gPictureFramePalettes[][16] =
{
INCBIN_U16("graphics/picture_frame/bg0.gbapal"),
@@ -113,7 +109,7 @@ void sub_8106630(u32 arg0)
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
- ldr r2, _0810665C @ =0x02015de0\n\
+ ldr r2, _0810665C @ =gSharedMem + 0x15DE0\n\
subs r4, r2, 0x2\n\
subs r5, r2, 0x1\n\
ldr r3, _08106660 @ =gSaveBlock1\n\
@@ -135,7 +131,7 @@ void sub_8106630(u32 arg0)
pop {r0}\n\
bx r0\n\
.align 2, 0\n\
-_0810665C: .4byte 0x02015de0\n\
+_0810665C: .4byte gSharedMem + 0x15DE0\n\
_08106660: .4byte gSaveBlock1\n\
_08106664: .4byte 0x00002dfc\n\
.syntax divided\n");
@@ -153,7 +149,7 @@ static void ShowContestPainting(void)
case 0:
remove_some_task();
SetVBlankCallback(NULL);
- gUnknown_03005E8C = &unk_2015de0;
+ gUnknown_03005E8C = &ewram15DE0;
ContestPaintingInitVars(TRUE);
ContestPaintingInitBG();
gMain.state++;
@@ -184,15 +180,15 @@ static void ShowContestPainting(void)
case 2:
SeedRng(gMain.vblankCounter1);
InitKeys();
- ContestPaintingInitWindow(unk_2000000[0x15DDF]);
+ ContestPaintingInitWindow(ewram15DDF);
gMain.state++;
break;
case 3:
- sub_8107090(unk_2000000[0x15DDE], unk_2000000[0x15DDF]);
+ sub_8107090(ewram15DDE, ewram15DDF);
gMain.state++;
break;
case 4:
- ContestPaintingPrintCaption(unk_2000000[0x15DDE], unk_2000000[0x15DDF]);
+ ContestPaintingPrintCaption(ewram15DDE, ewram15DDF);
LoadPalette(gUnknown_083F6140, 0, 1 * 2);
DmaClear32(3, PLTT, 0x400);
BeginFastPaletteFade(2);
@@ -353,7 +349,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 +398,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\
@@ -753,8 +749,8 @@ static u8 sub_8106EE0(u8 arg0)
static void sub_8106F4C(void)
{
- gUnknown_03005E90 = &unk_2015e00.unk2017e00;
- gUnknown_03005E10 = &unk_2015e00.unk2015e00;
+ gUnknown_03005E90 = &ewram15E00.unk2017e00;
+ gUnknown_03005E10 = &ewram15E00.unk2015e00;
}
static void sub_8106F6C(u8 arg0)
diff --git a/src/credits.c b/src/scene/credits.c
index df70674b6..17c1bf263 100644
--- a/src/credits.c
+++ b/src/scene/credits.c
@@ -9,13 +9,14 @@
#include "menu.h"
#include "palette.h"
#include "pokedex.h"
-#include "rng.h"
-#include "songs.h"
+#include "random.h"
+#include "constants/songs.h"
#include "sound.h"
-#include "species.h"
+#include "constants/species.h"
#include "starter_choose.h"
#include "task.h"
#include "trig.h"
+#include "ewram.h"
asm(".set REG_BASE, 0x4000000");
asm(".set OFFSET_REG_BLDCNT, 0x50");
@@ -159,21 +160,11 @@ struct Unk201C000
struct CreditsEntry
{
u8 var_0;
- u8 *text;
+ const u8 *text;
};
-extern u8 ewram[];
-
-#define EWRAM_1F800 ((u16 *)(ewram + 0x1F800))
-#define HALL_OF_FAME_SHEET_0 ((u8 *)(ewram + 0x1E000))
-#define HALL_OF_FAME_SHEET_1 ((u8 *)(ewram + 0x1E800))
-#define HALL_OF_FAME_SHEET_2 ((u8 *)(ewram + 0x1F000))
-#define ewram1c000 (*(struct Unk201C000 *)(ewram + 0x1C000))
-
-extern struct HallOfFame gHallOfFame;
extern u8 unk_201e800[0x800];
extern u8 unk_201f000[0x800];
-extern u16 unk_201f800[];
extern struct SpriteTemplate gUnknown_02024E8C;
@@ -194,18 +185,208 @@ extern void *gUnknown_0840B5A0[];
// data/credits
const u16 gUnknown_0840B7BC[] = INCBIN_U16("graphics/credits/palette_1.gbapal");
const u8 gUnknown_0840B7FC[] = INCBIN_U8("graphics/credits/ampersand.4bpp");
-extern u8 gUnknown_0840B83C[];
-extern u8 gUnknown_0840B84B[];
-extern u8 gUnknown_0840B85A[];
-extern u8 gUnknown_0840B869[];
-extern u8 gUnknown_0840B878[];
-extern struct CreditsEntry *gCreditsEntryPointerTable[][5];
-extern u8 gUnknown_0840CA00[][2];
-extern struct SpriteSheet gUnknown_0840CAA0;
-extern struct SpritePalette gUnknown_0840CAB0;
-extern const union AnimCmd *const gSpriteAnimTable_0840CA54[];
-extern const union AnimCmd *const gSpriteAnimTable_0840CA94[];
-extern struct SpriteTemplate gSpriteTemplate_840CAEC;
+
+void spritecb_814580C(struct Sprite *sprite);
+
+const u8 gUnknown_0840B83C[] =
+{
+ 0, 1, 0,
+ 0xFF, 1, 0xFF,
+ 0xFF, 1, 0xFF,
+ 0xFF, 1, 0xFF,
+ 0xFF, 1, 0xFF,
+};
+
+const u8 gUnknown_0840B84B[] =
+{
+ 1, 0xFF, 1,
+ 1, 0xFF, 1,
+ 1, 2, 1,
+ 1, 0xFF, 1,
+ 1, 0xFF, 1,
+};
+
+const u8 gUnknown_0840B85A[] =
+{
+ 1, 0, 0,
+ 1, 0xFF, 0xFF,
+ 1, 2, 2,
+ 1, 0xFF, 0xFF,
+ 1, 0x80, 0x80,
+};
+
+const u8 gUnknown_0840B869[] =
+{
+ 1, 3, 1,
+ 1, 4, 1,
+ 1, 5, 1,
+ 1, 0xC4, 1,
+ 1, 0xC3, 1,
+};
+
+const u8 gUnknown_0840B878[] =
+{
+ 1, 6, 7,
+ 1, 8, 9,
+ 1, 0xFF, 1,
+ 1, 0x88, 0x89,
+ 1, 0x86, 0x87,
+#ifdef GERMAN
+ 1, 0, 0,
+ 1, 0xFF, 0xFF,
+ 1, 0x80, 0x8A,
+ 1, 0xFF, 0xFF,
+ 1, 0xFF, 0xFF,
+ 0, 1, 0,
+ 0xFF, 1, 0xFF,
+ 0xFF, 1, 0xFF,
+ 0xFF, 1, 0xFF,
+ 0x80, 1, 0x80,
+#endif
+};
+
+#ifdef GERMAN
+#include "../data/credits_de.h"
+#else
+#include "../data/credits_en.h"
+#endif
+
+const u8 gUnknown_0840CA00[][2] =
+{
+ {104, 36},
+ {120, 36},
+ {136, 36},
+};
+
+static const union AnimCmd gSpriteAnim_840CA08[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(64, 8),
+ ANIMCMD_FRAME(128, 8),
+ ANIMCMD_FRAME(192, 8),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd gSpriteAnim_840CA1C[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(64, 4),
+ ANIMCMD_FRAME(128, 4),
+ ANIMCMD_FRAME(192, 4),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd gSpriteAnim_840CA30[] =
+{
+ ANIMCMD_FRAME(256, 4),
+ ANIMCMD_FRAME(320, 4),
+ ANIMCMD_FRAME(384, 4),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gSpriteAnim_840CA40[] =
+{
+ ANIMCMD_FRAME(384, 30),
+ ANIMCMD_FRAME(320, 30),
+ ANIMCMD_FRAME(256, 30),
+ ANIMCMD_FRAME(256, 30),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const gSpriteAnimTable_0840CA54[] =
+{
+ gSpriteAnim_840CA08,
+ gSpriteAnim_840CA1C,
+ gSpriteAnim_840CA30,
+ gSpriteAnim_840CA40,
+};
+
+static const union AnimCmd gSpriteAnim_840CA64[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(64, 8),
+ ANIMCMD_FRAME(128, 8),
+ ANIMCMD_FRAME(192, 8),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd gSpriteAnim_840CA78[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(64, 4),
+ ANIMCMD_FRAME(128, 4),
+ ANIMCMD_FRAME(192, 4),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd gSpriteAnim_840CA8C[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const gSpriteAnimTable_0840CA94[] =
+{
+ gSpriteAnim_840CA64,
+ gSpriteAnim_840CA78,
+ gSpriteAnim_840CA8C,
+};
+
+static const struct SpriteSheet gUnknown_0840CAA0[] = {{ewram1E000_2, 6144, 1001}, {0}};
+static const struct SpritePalette gUnknown_0840CAB0[] = {{ewram_1F800_2, 1001}, {0}};
+
+static const struct OamData gOamData_840CAC0 =
+{
+ .y = 160,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const union AnimCmd gSpriteAnim_840CAC8[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gSpriteAnim_840CAD0[] =
+{
+ ANIMCMD_FRAME(64, 8),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd gSpriteAnim_840CAD8[] =
+{
+ ANIMCMD_FRAME(128, 8),
+ ANIMCMD_END,
+};
+
+static const union AnimCmd *const gSpriteAnimTable_840CAE0[] =
+{
+ gSpriteAnim_840CAC8,
+ gSpriteAnim_840CAD0,
+ gSpriteAnim_840CAD8,
+};
+
+static const struct SpriteTemplate gSpriteTemplate_840CAEC =
+{
+ .tileTag = 1001,
+ .paletteTag = 1001,
+ .oam = &gOamData_840CAC0,
+ .anims = gSpriteAnimTable_840CAE0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = spritecb_814580C,
+};
// graphics
extern u8 gCreditsCopyrightEnd_Gfx[];
@@ -339,7 +520,7 @@ static void task_a_8143B38(u8 taskIdA)
static void task_a_8143B68(u8 taskIdA)
{
- u16 data11;
+ u16 data1;
if (gTasks[taskIdA].data[TDA_4])
{
@@ -354,18 +535,18 @@ static void task_a_8143B68(u8 taskIdA)
}
gUnknown_02039320 = 0;
- data11 = gTasks[taskIdA].data[TDA_11];
+ data1 = gTasks[taskIdA].data[TDA_11];
if (gTasks[taskIdA].data[TDA_11] == 1)
{
- gTasks[taskIdA].data[TDA_13] = data11;
+ gTasks[taskIdA].data[TDA_13] = data1;
gTasks[taskIdA].data[TDA_11] = 0;
BeginNormalPaletteFade(-1, 0, 0, 16, 0);
gTasks[taskIdA].func = task_a_8143BFC;
}
else if (gTasks[taskIdA].data[TDA_11] == 2)
{
- gTasks[taskIdA].data[TDA_13] = data11;
+ gTasks[taskIdA].data[TDA_13] = data1;
gTasks[taskIdA].data[TDA_11] = 0;
BeginNormalPaletteFade(-1, 0, 0, 16, 0);
gTasks[taskIdA].func = task_a_8143CC0;
@@ -441,8 +622,8 @@ void task_a_8143D04(u8 taskIdA)
EWRAM_1F800[2] = 0x529F; // light red
EWRAM_1F800[3] = 0x7E94; // light blue
- LoadSpriteSheet(&gUnknown_0840CAA0);
- LoadSpritePalette(&gUnknown_0840CAB0);
+ LoadSpriteSheet(gUnknown_0840CAA0);
+ LoadSpritePalette(gUnknown_0840CAB0);
gMain.state += 1;
break;
@@ -775,12 +956,12 @@ static void task_d_8144514(u8 taskIdD)
if (r6->unk8C < r6->unk8E - 1)
{
r6->unk8C++;
- gSprites[r2].data3 = 50;
+ gSprites[r2].data[3] = 50;
}
else
{
r6->unk8C = 0;
- gSprites[r2].data3 = 512;
+ gSprites[r2].data[3] = 512;
}
r6->unk88++;
if (r6->unk8A == 2)
@@ -815,7 +996,7 @@ void task_c_8144664(u8 taskIdC)
}
else
{
- gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 2;
+ gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 2;
gTasks[taskIdC].data[TDC_5] = 0;
gTasks[taskIdC].data[TDC_0]++;
}
@@ -832,8 +1013,8 @@ void task_c_8144664(u8 taskIdC)
}
break;
case 3:
- gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 3;
- gSprites[gTasks[taskIdC].data[TDC_3]].data0 = 1;
+ gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 3;
+ gSprites[gTasks[taskIdC].data[TDC_3]].data[0] = 1;
gTasks[taskIdC].data[TDC_4] = 120;
gTasks[taskIdC].data[TDC_0]++;
break;
@@ -856,7 +1037,7 @@ void task_c_8144664(u8 taskIdC)
}
else
{
- gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 1;
+ gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 1;
gTasks[taskIdC].data[TDC_0]++;
}
break;
@@ -864,16 +1045,16 @@ void task_c_8144664(u8 taskIdC)
gTasks[taskIdC].data[TDC_0] = 50;
break;
case 10:
- gSprites[gTasks[taskIdC].data[TDC_3]].data0 = 2;
+ gSprites[gTasks[taskIdC].data[TDC_3]].data[0] = 2;
gTasks[taskIdC].data[TDC_0] = 50;
break;
case 20:
- gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 4;
+ gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 4;
gTasks[taskIdC].data[TDC_0] = 50;
break;
case 30:
- gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 5;
- gSprites[gTasks[taskIdC].data[TDC_3]].data0 = 3;
+ gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 5;
+ gSprites[gTasks[taskIdC].data[TDC_3]].data[0] = 3;
gTasks[taskIdC].data[TDC_0] = 50;
break;
case 50:
@@ -951,8 +1132,8 @@ static void sub_8144A68(u8 data, u8 taskIdA)
gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 272;
gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46;
gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46;
- gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data0 = 0;
- gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data0 = 0;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data[0] = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0;
gTasks[taskIdA].data[TDA_0] = sub_8148EC0(0, 0x2000, 0x20, 8);
break;
case 1:
@@ -962,8 +1143,8 @@ static void sub_8144A68(u8 data, u8 taskIdA)
gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 272;
gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46;
gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46;
- gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data0 = 0;
- gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data0 = 0;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data[0] = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0;
gTasks[taskIdA].data[TDA_0] = sub_8148EC0(0, 0x2000, 0x20, 8);
break;
case 2:
@@ -973,8 +1154,8 @@ static void sub_8144A68(u8 data, u8 taskIdA)
gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 272;
gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46;
gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46;
- gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data0 = 0;
- gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data0 = 0;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data[0] = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0;
gTasks[taskIdA].data[TDA_0] = sub_8148EC0(1, 0x2000, 0x200, 8);
break;
case 3:
@@ -984,8 +1165,8 @@ static void sub_8144A68(u8 data, u8 taskIdA)
gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = -32;
gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46;
gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46;
- gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data0 = 0;
- gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data0 = 0;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data[0] = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0;
gTasks[taskIdA].data[TDA_0] = sub_8148EC0(1, 0x2000, 0x200, 8);
break;
case 4:
@@ -995,8 +1176,8 @@ static void sub_8144A68(u8 data, u8 taskIdA)
gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 152;
gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46;
gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46;
- gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data0 = 0;
- gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data0 = 0;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data[0] = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0;
gTasks[taskIdA].data[TDA_0] = sub_8148EC0(2, 0x2000, 0x200, 8);
break;
}
@@ -1047,9 +1228,9 @@ static bool8 sub_8144ECC(u8 data, u8 taskIdA)
case 2:
if (gSaveBlock2.playerGender == MALE)
{
- LoadCompressedObjectPic(&gIntro2BrendanSpriteSheet);
- LoadCompressedObjectPic(&gUnknown_08416E34);
- LoadCompressedObjectPic(&gIntro2BicycleSpriteSheet);
+ LoadCompressedObjectPic(gIntro2BrendanSpriteSheet);
+ LoadCompressedObjectPic(gUnknown_08416E34);
+ LoadCompressedObjectPic(gIntro2BicycleSpriteSheet);
LoadSpritePalettes(gIntro2SpritePalettes);
spriteId = intro_create_brendan_sprite(120, 46);
@@ -1064,9 +1245,9 @@ static bool8 sub_8144ECC(u8 data, u8 taskIdA)
}
else
{
- LoadCompressedObjectPic(&gIntro2MaySpriteSheet);
- LoadCompressedObjectPic(&gUnknown_08416E24);
- LoadCompressedObjectPic(&gIntro2BicycleSpriteSheet);
+ LoadCompressedObjectPic(gIntro2MaySpriteSheet);
+ LoadCompressedObjectPic(gUnknown_08416E24);
+ LoadCompressedObjectPic(gIntro2BicycleSpriteSheet);
LoadSpritePalettes(gIntro2SpritePalettes);
spriteId = intro_create_may_sprite(120, 46);
@@ -1160,7 +1341,7 @@ u16 sub_8145208(u8 arg0)
return out;
}
-void sub_814524C(u8 arg0[], u8 baseX, u8 baseY, u16 arg3, u16 palette)
+void sub_814524C(const u8 arg0[], u8 baseX, u8 baseY, u16 arg3, u16 palette)
{
u8 y, x;
const u16 tileOffset = (palette / 16) << 12;
@@ -1203,7 +1384,7 @@ static void spritecb_player_8145378(struct Sprite *sprite)
return;
}
- switch (sprite->data0)
+ switch (sprite->data[0])
{
case 0:
StartSpriteAnimIfDifferent(sprite, 0);
@@ -1240,7 +1421,7 @@ static void spritecb_rival_8145420(struct Sprite *sprite)
return;
}
- switch (sprite->data0)
+ switch (sprite->data[0])
{
case 0:
sprite->pos2.y = 0;
@@ -1256,9 +1437,9 @@ static void spritecb_rival_8145420(struct Sprite *sprite)
sprite->pos2.y = -gUnknown_0203935A;
break;
case 2:
- sprite->data7 += 1;
+ sprite->data[7] += 1;
StartSpriteAnimIfDifferent(sprite, 0);
- if ((sprite->data7 & 3) == 0)
+ if ((sprite->data[7] & 3) == 0)
sprite->pos1.x += 1;
break;
case 3:
@@ -1277,74 +1458,74 @@ void spritecb_81454E0(struct Sprite *sprite)
return;
}
- sprite->data7 += 1;
- switch (sprite->data0)
+ sprite->data[7] += 1;
+ switch (sprite->data[0])
{
case 0:
default:
sprite->oam.affineMode = 1;
- sprite->oam.matrixNum = sprite->data1;
- sprite->data2 = 16;
- SetOamMatrix(sprite->data1, 0x10000 / sprite->data2, 0, 0, 0x10000 / sprite->data2);
+ sprite->oam.matrixNum = sprite->data[1];
+ sprite->data[2] = 16;
+ SetOamMatrix(sprite->data[1], 0x10000 / sprite->data[2], 0, 0, 0x10000 / sprite->data[2]);
sprite->invisible = FALSE;
- sprite->data0 = 1;
+ sprite->data[0] = 1;
break;
case 1:
- if (sprite->data2 < 256)
+ if (sprite->data[2] < 256)
{
- sprite->data2 += 8;
- SetOamMatrix(sprite->data1, 0x10000 / sprite->data2, 0, 0, 0x10000 / sprite->data2);
+ sprite->data[2] += 8;
+ SetOamMatrix(sprite->data[1], 0x10000 / sprite->data[2], 0, 0, 0x10000 / sprite->data[2]);
}
else
{
- sprite->data0 += 1;
+ sprite->data[0] += 1;
}
- switch (sprite->data1)
+ switch (sprite->data[1])
{
case 1:
- if ((sprite->data7 & 3) == 0)
+ if ((sprite->data[7] & 3) == 0)
sprite->pos1.y += 1;
sprite->pos1.x -= 2;
break;
case 2:
break;
case 3:
- if ((sprite->data7 & 3) == 0)
+ if ((sprite->data[7] & 3) == 0)
sprite->pos1.y += 1;
sprite->pos1.x += 2;
break;
}
break;
case 2:
- if (sprite->data3 != 0)
+ if (sprite->data[3] != 0)
{
- sprite->data3 -= 1;
+ sprite->data[3] -= 1;
}
else
{
REG_BLDCNT = 0xF40;
REG_BLDALPHA = 0x10;
sprite->oam.objMode = 1;
- sprite->data3 = 16;
- sprite->data0 += 1;
+ sprite->data[3] = 16;
+ sprite->data[0] += 1;
}
break;
case 3:
- if (sprite->data3 != 0)
+ if (sprite->data[3] != 0)
{
int data3;
vu16 *reg;
- sprite->data3 -= 1;
+ sprite->data[3] -= 1;
reg = &REG_BLDALPHA;
- data3 = 16 - sprite->data3;
- *reg = (data3 << 8) + sprite->data3;
+ data3 = 16 - sprite->data[3];
+ *reg = (data3 << 8) + sprite->data[3];
}
else
{
sprite->invisible = TRUE;
- sprite->data0 = 10;
+ sprite->data[0] = 10;
}
break;
case 10:
@@ -1387,19 +1568,19 @@ 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);
spriteId = CreateSprite(&gUnknown_02024E8C, x, y, 0);
gSprites[spriteId].oam.paletteNum = position;
gSprites[spriteId].oam.priority = 1;
- gSprites[spriteId].data1 = position + 1;
+ gSprites[spriteId].data[1] = position + 1;
gSprites[spriteId].invisible = TRUE;
gSprites[spriteId].callback = spritecb_81454E0;
spriteId2 = CreateSprite(&gSpriteTemplate_840CAEC, gSprites[spriteId].pos1.x, gSprites[spriteId].pos1.y, 1);
- gSprites[spriteId2].data0 = spriteId;
+ gSprites[spriteId2].data[0] = spriteId;
StartSpriteAnimIfDifferent(&gSprites[spriteId2], position);
@@ -1408,24 +1589,24 @@ static u8 sub_81456B4(u16 species, u16 x, u16 y, u16 position)
void spritecb_814580C(struct Sprite *sprite)
{
- if (gSprites[sprite->data0].data0 == 10 || gUnknown_0203935C)
+ if (gSprites[sprite->data[0]].data[0] == 10 || gUnknown_0203935C)
{
DestroySprite(sprite);
return;
}
- sprite->invisible = gSprites[sprite->data0].invisible;
- sprite->oam.objMode = gSprites[sprite->data0].oam.objMode;
- sprite->oam.affineMode = gSprites[sprite->data0].oam.affineMode;
- sprite->oam.matrixNum = gSprites[sprite->data0].oam.matrixNum;
- sprite->pos1.x = gSprites[sprite->data0].pos1.x;
- sprite->pos1.y = gSprites[sprite->data0].pos1.y;
+ sprite->invisible = gSprites[sprite->data[0]].invisible;
+ sprite->oam.objMode = gSprites[sprite->data[0]].oam.objMode;
+ sprite->oam.affineMode = gSprites[sprite->data[0]].oam.affineMode;
+ sprite->oam.matrixNum = gSprites[sprite->data[0]].oam.matrixNum;
+ sprite->pos1.x = gSprites[sprite->data[0]].pos1.x;
+ sprite->pos1.y = gSprites[sprite->data[0]].pos1.y;
}
static void sub_81458DC(void)
{
struct Unk201C000 *unk201C000 = &ewram1c000;
- u16 starter = SpeciesToNationalPokedexNum(GetStarterPokemon(VarGet(VAR_FIRST_POKE)));
+ u16 starter = SpeciesToNationalPokedexNum(GetStarterPokemon(VarGet(VAR_STARTER_MON)));
u16 seenTypesCount;
u16 page;
u16 dexNum;
@@ -1433,7 +1614,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 aa3d45250..c0111de7d 100644
--- a/src/egg_hatch.c
+++ b/src/scene/egg_hatch.c
@@ -1,26 +1,28 @@
#include "global.h"
-#include "pokemon.h"
-#include "items.h"
-#include "decompress.h"
#include "data2.h"
-#include "task.h"
-#include "script.h"
-#include "palette.h"
-#include "rom4.h"
-#include "main.h"
+#include "daycare.h"
+#include "decompress.h"
#include "event_data.h"
+#include "ewram.h"
+#include "constants/items.h"
+#include "main.h"
+#include "menu.h"
+#include "naming_screen.h"
+#include "overworld.h"
+#include "palette.h"
+#include "pokemon.h"
+#include "random.h"
+#include "script.h"
+#include "constants/songs.h"
#include "sound.h"
-#include "songs.h"
-#include "text.h"
-#include "text_window.h"
#include "string_util.h"
#include "strings2.h"
-#include "menu.h"
-#include "naming_screen.h"
+#include "task.h"
+#include "text.h"
+#include "text_window.h"
#include "trig.h"
-#include "rng.h"
+#include "trade.h"
-extern u8 ewram[];
extern struct SpriteTemplate gUnknown_02024E8C;
struct EggHatchData
@@ -40,18 +42,14 @@ 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);
-u8* GetMonNick(struct Pokemon* mon, u8* dst);
+bool8 GetSetPokedexFlag(u16 nationalNum, u8 caseID);
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);
@@ -393,7 +391,7 @@ _08042B42:\n\
bool8 sub_8042B4C(void)
{
- return sub_8042ABC(&gSaveBlock1.daycareData, gSpecialVar_0x8004);
+ return sub_8042ABC(&gSaveBlock1.daycare, gSpecialVar_0x8004);
}
static u8 EggHatchCreateMonSprite(u8 a0, u8 switchID, u8 pokeID)
@@ -418,12 +416,12 @@ 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));
+ HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, ewram0_6, gUnknown_081FAF4C[2 * a0 + 1], species, pid);
+ 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;
@@ -462,7 +460,7 @@ static void CB2_EggHatch_0(void)
{
case 0:
REG_DISPCNT = 0;
- gEggHatchData = (struct EggHatchData*)(&ewram[0x18000]);
+ gEggHatchData = eEggHatchData;
gEggHatchData->eggPartyID = gSpecialVar_0x8004;
gEggHatchData->eggShardVelocityID = 0;
ResetTasks();
@@ -481,8 +479,8 @@ static void CB2_EggHatch_0(void)
break;
case 2:
LZDecompressVram(&gUnknown_08D00000, (void*)(VRAM));
- CpuSet(&gUnknown_08D00524, &ewram[0], 0x800);
- DmaCopy16(3, &ewram[0], (void*)(VRAM + 0x2800), 0x500);
+ CpuSet(&gUnknown_08D00524, ewram0_7, 0x800);
+ DmaCopy16(3, ewram0_7, (void*)(VRAM + 0x2800), 0x500);
LoadCompressedPalette(&gUnknown_08D004E0, 0, 0x20);
gMain.state++;
break;
@@ -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);
@@ -671,16 +669,16 @@ static void CB2_EggHatch_1(void)
static void SpriteCB_Egg_0(struct Sprite* sprite)
{
- if (++sprite->data0 > 20)
+ if (++sprite->data[0] > 20)
{
sprite->callback = SpriteCB_Egg_1;
- sprite->data0 = 0;
+ sprite->data[0] = 0;
}
else
{
- sprite->data1 = (sprite->data1 + 20) & 0xFF;
- sprite->pos2.x = Sin(sprite->data1, 1);
- if (sprite->data0 == 15)
+ sprite->data[1] = (sprite->data[1] + 20) & 0xFF;
+ sprite->pos2.x = Sin(sprite->data[1], 1);
+ if (sprite->data[0] == 15)
{
PlaySE(SE_BOWA);
StartSpriteAnim(sprite, 1);
@@ -691,19 +689,19 @@ static void SpriteCB_Egg_0(struct Sprite* sprite)
static void SpriteCB_Egg_1(struct Sprite* sprite)
{
- if (++sprite->data2 > 30)
+ if (++sprite->data[2] > 30)
{
- if (++sprite->data0 > 20)
+ if (++sprite->data[0] > 20)
{
sprite->callback = SpriteCB_Egg_2;
- sprite->data0 = 0;
- sprite->data2 = 0;
+ sprite->data[0] = 0;
+ sprite->data[2] = 0;
}
else
{
- sprite->data1 = (sprite->data1 + 20) & 0xFF;
- sprite->pos2.x = Sin(sprite->data1, 2);
- if (sprite->data0 == 15)
+ sprite->data[1] = (sprite->data[1] + 20) & 0xFF;
+ sprite->pos2.x = Sin(sprite->data[1], 2);
+ if (sprite->data[0] == 15)
{
PlaySE(SE_BOWA);
StartSpriteAnim(sprite, 2);
@@ -714,30 +712,30 @@ static void SpriteCB_Egg_1(struct Sprite* sprite)
static void SpriteCB_Egg_2(struct Sprite* sprite)
{
- if (++sprite->data2 > 30)
+ if (++sprite->data[2] > 30)
{
- if (++sprite->data0 > 38)
+ if (++sprite->data[0] > 38)
{
u16 species;
sprite->callback = SpriteCB_Egg_3;
- sprite->data0 = 0;
+ sprite->data[0] = 0;
species = GetMonData(&gPlayerParty[gEggHatchData->eggPartyID], MON_DATA_SPECIES);
gSprites[gEggHatchData->pokeSpriteID].pos2.x = 0;
gSprites[gEggHatchData->pokeSpriteID].pos2.y = gMonFrontPicCoords[species].y_offset;
}
else
{
- sprite->data1 = (sprite->data1 + 20) & 0xFF;
- sprite->pos2.x = Sin(sprite->data1, 2);
- if (sprite->data0 == 15)
+ sprite->data[1] = (sprite->data[1] + 20) & 0xFF;
+ sprite->pos2.x = Sin(sprite->data[1], 2);
+ if (sprite->data[0] == 15)
{
PlaySE(SE_BOWA);
StartSpriteAnim(sprite, 2);
CreateRandomEggShardSprite();
CreateRandomEggShardSprite();
}
- if (sprite->data0 == 30)
+ if (sprite->data[0] == 30)
PlaySE(SE_BOWA);
}
}
@@ -745,60 +743,60 @@ static void SpriteCB_Egg_2(struct Sprite* sprite)
static void SpriteCB_Egg_3(struct Sprite* sprite)
{
- if (++sprite->data0 > 50)
+ if (++sprite->data[0] > 50)
{
sprite->callback = SpriteCB_Egg_4;
- sprite->data0 = 0;
+ sprite->data[0] = 0;
}
}
static void SpriteCB_Egg_4(struct Sprite* sprite)
{
s16 i;
- if (sprite->data0 == 0)
+ if (sprite->data[0] == 0)
BeginNormalPaletteFade(-1, -1, 0, 0x10, 0xFFFF);
- if (sprite->data0 < 4u)
+ if (sprite->data[0] < 4u)
{
for (i = 0; i <= 3; i++)
CreateRandomEggShardSprite();
}
- sprite->data0++;
+ sprite->data[0]++;
if (!gPaletteFade.active)
{
PlaySE(SE_TAMAGO);
sprite->invisible = 1;
sprite->callback = SpriteCB_Egg_5;
- sprite->data0 = 0;
+ sprite->data[0] = 0;
}
}
static void SpriteCB_Egg_5(struct Sprite* sprite)
{
- if (sprite->data0 == 0)
+ if (sprite->data[0] == 0)
{
gSprites[gEggHatchData->pokeSpriteID].invisible = 0;
StartSpriteAffineAnim(&gSprites[gEggHatchData->pokeSpriteID], 1);
}
- if (sprite->data0 == 8)
+ if (sprite->data[0] == 8)
BeginNormalPaletteFade(-1, -1, 0x10, 0, 0xFFFF);
- if (sprite->data0 <= 9)
+ if (sprite->data[0] <= 9)
gSprites[gEggHatchData->pokeSpriteID].pos1.y -= 1;
- if (sprite->data0 > 40)
+ if (sprite->data[0] > 40)
sprite->callback = SpriteCallbackDummy;
- sprite->data0++;
+ sprite->data[0]++;
}
static void SpriteCB_EggShard(struct Sprite* sprite)
{
- sprite->data4 += sprite->data1;
- sprite->data5 += sprite->data2;
+ sprite->data[4] += sprite->data[1];
+ sprite->data[5] += sprite->data[2];
- sprite->pos2.x = sprite->data4 / 256;
- sprite->pos2.y = sprite->data5 / 256;
+ sprite->pos2.x = sprite->data[4] / 256;
+ sprite->pos2.y = sprite->data[5] / 256;
- sprite->data2 += sprite->data3;
+ sprite->data[2] += sprite->data[3];
- if (sprite->pos1.y + sprite->pos2.y > sprite->pos1.y + 20 && sprite->data2 > 0)
+ if (sprite->pos1.y + sprite->pos2.y > sprite->pos1.y + 20 && sprite->data[2] > 0)
DestroySprite(sprite);
}
@@ -842,9 +840,9 @@ static void CreateRandomEggShardSprite(void)
static void CreateEggShardSprite(u8 x, u8 y, s16 data1, s16 data2, s16 data3, u8 spriteAnimIndex)
{
u8 spriteID = CreateSprite(&sSpriteTemplate_820A418, x, y, 4);
- gSprites[spriteID].data1 = data1;
- gSprites[spriteID].data2 = data2;
- gSprites[spriteID].data3 = data3;
+ gSprites[spriteID].data[1] = data1;
+ gSprites[spriteID].data[2] = data2;
+ gSprites[spriteID].data[3] = data3;
StartSpriteAnim(&gSprites[spriteID], spriteAnimIndex);
}
diff --git a/src/evolution_graphics.c b/src/scene/evolution_graphics.c
index a47e63a59..b9ef5b402 100644
--- a/src/evolution_graphics.c
+++ b/src/scene/evolution_graphics.c
@@ -1,11 +1,12 @@
#include "global.h"
+#include "evolution_graphics.h"
#include "sprite.h"
#include "trig.h"
-#include "rng.h"
+#include "random.h"
#include "decompress.h"
#include "task.h"
#include "sound.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "palette.h"
// this file's functions
@@ -114,18 +115,18 @@ static void SpriteCB_PreEvoSparkleSet1(struct Sprite* sprite)
{
u8 matrixNum;
- sprite->pos1.y = 88 - (sprite->data7 * sprite->data7) / 80;
- sprite->pos2.y = Sin((u8)(sprite->data6), sprite->data5) / 4;
- sprite->pos2.x = Cos((u8)(sprite->data6), sprite->data5);
- sprite->data6 += 4;
- if (sprite->data7 & 1)
- sprite->data5--;
- sprite->data7++;
+ sprite->pos1.y = 88 - (sprite->data[7] * sprite->data[7]) / 80;
+ sprite->pos2.y = Sin((u8)(sprite->data[6]), sprite->data[5]) / 4;
+ sprite->pos2.x = Cos((u8)(sprite->data[6]), sprite->data[5]);
+ sprite->data[6] += 4;
+ if (sprite->data[7] & 1)
+ sprite->data[5]--;
+ sprite->data[7]++;
if (sprite->pos2.y > 0)
sprite->subpriority = 1;
else
sprite->subpriority = 20;
- matrixNum = sprite->data5 / 4 + 20;
+ matrixNum = sprite->data[5] / 4 + 20;
if (matrixNum > 31)
matrixNum = 31;
sprite->oam.matrixNum = matrixNum;
@@ -139,9 +140,9 @@ static void CreatePreEvoSparkleSet1(u8 arg0)
u8 spriteID = CreateSprite(&sEvoSparkleSpriteTemplate, 120, 88, 0);
if (spriteID != MAX_SPRITES)
{
- gSprites[spriteID].data5 = 48;
- gSprites[spriteID].data6 = arg0;
- gSprites[spriteID].data7 = 0;
+ gSprites[spriteID].data[5] = 48;
+ gSprites[spriteID].data[6] = arg0;
+ gSprites[spriteID].data[7] = 0;
gSprites[spriteID].oam.affineMode = 1;
gSprites[spriteID].oam.matrixNum = 31;
gSprites[spriteID].callback = SpriteCB_PreEvoSparkleSet1;
@@ -152,11 +153,11 @@ static void SpriteCB_PreEvoSparkleSet2(struct Sprite* sprite)
{
if (sprite->pos1.y < 88)
{
- sprite->pos1.y = 8 + (sprite->data7 * sprite->data7) / 5;
- sprite->pos2.y = Sin((u8)(sprite->data6), sprite->data5) / 4;
- sprite->pos2.x = Cos((u8)(sprite->data6), sprite->data5);
- sprite->data5 = 8 + Sin((u8)(sprite->data7 * 4), 40);
- sprite->data7++;
+ sprite->pos1.y = 8 + (sprite->data[7] * sprite->data[7]) / 5;
+ sprite->pos2.y = Sin((u8)(sprite->data[6]), sprite->data[5]) / 4;
+ sprite->pos2.x = Cos((u8)(sprite->data[6]), sprite->data[5]);
+ sprite->data[5] = 8 + Sin((u8)(sprite->data[7] * 4), 40);
+ sprite->data[7]++;
}
else
DestroySprite(sprite);
@@ -167,9 +168,9 @@ static void CreatePreEvoSparkleSet2(u8 arg0)
u8 spriteID = CreateSprite(&sEvoSparkleSpriteTemplate, 120, 8, 0);
if (spriteID != MAX_SPRITES)
{
- gSprites[spriteID].data5 = 8;
- gSprites[spriteID].data6 = arg0;
- gSprites[spriteID].data7 = 0;
+ gSprites[spriteID].data[5] = 8;
+ gSprites[spriteID].data[6] = arg0;
+ gSprites[spriteID].data[7] = 0;
gSprites[spriteID].oam.affineMode = 1;
gSprites[spriteID].oam.matrixNum = 25;
gSprites[spriteID].subpriority = 1;
@@ -179,12 +180,12 @@ static void CreatePreEvoSparkleSet2(u8 arg0)
static void SpriteCB_PostEvoSparkleSet1(struct Sprite* sprite)
{
- if (sprite->data5 > 8)
+ if (sprite->data[5] > 8)
{
- sprite->pos2.y = Sin((u8)(sprite->data6), sprite->data5);
- sprite->pos2.x = Cos((u8)(sprite->data6), sprite->data5);
- sprite->data5 -= sprite->data3;
- sprite->data6 += 4;
+ sprite->pos2.y = Sin((u8)(sprite->data[6]), sprite->data[5]);
+ sprite->pos2.x = Cos((u8)(sprite->data[6]), sprite->data[5]);
+ sprite->data[5] -= sprite->data[3];
+ sprite->data[6] += 4;
}
else
DestroySprite(sprite);
@@ -195,10 +196,10 @@ static void CreatePostEvoSparkleSet1(u8 arg0, u8 arg1)
u8 spriteID = CreateSprite(&sEvoSparkleSpriteTemplate, 120, 56, 0);
if (spriteID != MAX_SPRITES)
{
- gSprites[spriteID].data3 = arg1;
- gSprites[spriteID].data5 = 120;
- gSprites[spriteID].data6 = arg0;
- gSprites[spriteID].data7 = 0;
+ gSprites[spriteID].data[3] = arg1;
+ gSprites[spriteID].data[5] = 120;
+ gSprites[spriteID].data[6] = arg0;
+ gSprites[spriteID].data[7] = 0;
gSprites[spriteID].oam.affineMode = 1;
gSprites[spriteID].oam.matrixNum = 31;
gSprites[spriteID].subpriority = 1;
@@ -208,29 +209,29 @@ static void CreatePostEvoSparkleSet1(u8 arg0, u8 arg1)
static void SpriteCB_PostEvoSparkleSet2(struct Sprite* sprite)
{
- if (!(sprite->data7 & 3))
+ if (!(sprite->data[7] & 3))
sprite->pos1.y++;
- if (sprite->data6 < 128)
+ if (sprite->data[6] < 128)
{
u8 matrixNum;
- sprite->pos2.y = -Sin((u8)(sprite->data6), sprite->data5);
- sprite->pos1.x = 120 + (sprite->data3 * sprite->data7) / 3;
- sprite->data6++;
- matrixNum = 31 - (sprite->data6 * 12 / 128);
- if (sprite->data6 > 64)
+ sprite->pos2.y = -Sin((u8)(sprite->data[6]), sprite->data[5]);
+ sprite->pos1.x = 120 + (sprite->data[3] * sprite->data[7]) / 3;
+ sprite->data[6]++;
+ matrixNum = 31 - (sprite->data[6] * 12 / 128);
+ if (sprite->data[6] > 64)
sprite->subpriority = 1;
else
{
sprite->invisible = 0;
sprite->subpriority = 20;
- if (sprite->data6 > 112 && sprite->data6 & 1)
+ if (sprite->data[6] > 112 && sprite->data[6] & 1)
sprite->invisible = 1;
}
if (matrixNum < 20)
matrixNum = 20;
sprite->oam.matrixNum = matrixNum;
- sprite->data7++;
+ sprite->data[7]++;
}
else
DestroySprite(sprite);
@@ -241,9 +242,9 @@ static void CreatePostEvoSparkleSet2(u8 arg0)
u8 spriteID = CreateSprite(&sEvoSparkleSpriteTemplate, 120, 56, 0);
if (spriteID != MAX_SPRITES)
{
- gSprites[spriteID].data3 = 3 - (Random() % 7);
- gSprites[spriteID].data5 = 48 + (Random() & 0x3F);
- gSprites[spriteID].data7 = 0;
+ gSprites[spriteID].data[3] = 3 - (Random() % 7);
+ gSprites[spriteID].data[5] = 48 + (Random() & 0x3F);
+ gSprites[spriteID].data[7] = 0;
gSprites[spriteID].oam.affineMode = 1;
gSprites[spriteID].oam.matrixNum = 31;
gSprites[spriteID].subpriority = 20;
@@ -376,10 +377,10 @@ static void EvoTask_DestroyPostSet1Task(u8 taskID)
DestroyTask(taskID);
}
-u8 LaunchTask_PostEvoSparklesSet2AndFlash(u16 arg0)
+u8 LaunchTask_PostEvoSparklesSet2AndFlash(u16 species)
{
u8 taskID = CreateTask(EvoTask_BeginPostSparklesSet2_AndFlash, 0);
- gTasks[taskID].data[2] = arg0;
+ gTasks[taskID].data[2] = species;
return taskID;
}
@@ -424,10 +425,10 @@ static void EvoTask_DestroyPostSet2AndFlashTask(u8 taskID)
DestroyTask(taskID);
}
-u8 LaunchTask_PostEvoSparklesSet2AndFlash_Trade(u16 arg0)
+u8 LaunchTask_PostEvoSparklesSet2AndFlash_Trade(u16 species)
{
u8 taskID = CreateTask(EvoTask_BeginPostSparklesSet2_AndFlash_Trade, 0);
- gTasks[taskID].data[2] = arg0;
+ gTasks[taskID].data[2] = species;
return taskID;
}
diff --git a/src/scene/evolution_scene.c b/src/scene/evolution_scene.c
new file mode 100644
index 000000000..4ee601360
--- /dev/null
+++ b/src/scene/evolution_scene.c
@@ -0,0 +1,3964 @@
+#include "global.h"
+#include "task.h"
+#include "evolution_scene.h"
+#include "evolution_graphics.h"
+#include "palette.h"
+#include "main.h"
+#include "text.h"
+#include "text_window.h"
+#include "pokemon.h"
+#include "string_util.h"
+#include "battle.h"
+#include "unknown_task.h"
+#include "data2.h"
+#include "decompress.h"
+#include "m4a.h"
+#include "trade.h"
+#include "menu.h"
+#include "pokedex.h"
+#include "constants/species.h"
+#include "sound.h"
+#include "constants/songs.h"
+#include "overworld.h"
+#include "battle_message.h"
+#include "pokemon_summary_screen.h"
+#include "menu_cursor.h"
+#include "strings2.h"
+#include "ewram.h"
+
+struct EvoInfo
+{
+ u8 preEvoSpriteID;
+ u8 postEvoSpriteID;
+ u8 evoTaskID;
+ u8 field_3;
+
+ u8 unk4[0x40];
+ u8 unk44[0x40];
+ u8 unk84[0x40];
+
+ u8 unkC4[0x40][0x20]; // 0x20148C4
+ u8 unk8C4[0x40][0x20]; // 0x20150C4
+ u8 unk10C4[0x40][0x20]; // 0x20158C4
+ u8 unk18C4[0x40][0x20]; // 0x20160C4
+ u8 unk20C4[0x40][0x20]; // 0x20168C4
+ u8 unk28C4[0x40][0x20]; // 0x20170C4
+ u8 unk30C4[0x40][0x20]; // 0x20178C4
+ u8 unk38C4[0x40][0x20]; // 0x20180C4
+
+ u8 *unk40C4[0x40][0x20]; // 0x20188C4
+
+ u16 unk60C4[0x40][0x20]; // 0x201A8C4
+ u16 unk70C4[0x40][0x20]; // 0x201B8C4
+ u16 unk80C4[0x40][0x20]; // 0x201C8C4
+ u16 unk90C4[0x40][0x20]; // 0x201D8C4
+
+ u8 unkA0C4; // 0x201E8C4
+};
+
+void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies);
+void sub_8024CEC(void);
+void sub_8023A80(void);
+void sub_802BC6C(void);
+void sub_8023AD8(void);
+void nullsub_6(void);
+bool32 IsHMMove2(u16 move);
+
+extern struct Window gUnknown_03004210;
+extern u16 gBattle_BG0_X;
+extern u16 gBattle_BG0_Y;
+extern u16 gBattle_BG1_X;
+extern u16 gBattle_BG1_Y;
+extern u16 gBattle_BG2_X;
+extern u16 gBattle_BG2_Y;
+extern u16 gUnknown_030041B0;
+extern u16 gUnknown_030041B8;
+extern u8 gBattleTerrain;
+extern u8 gReservedSpritePaletteCount;
+extern u16 gMoveToLearn;
+extern struct SpriteTemplate gUnknown_02024E8C;
+extern bool8 gAffineAnimsDisabled;
+extern u8 gDisplayedStringBattle[];
+extern u8 gBattleTextBuff2[];
+
+extern u8 gBattleCommunication[];
+#define sEvoCursorPos gBattleCommunication[1] // when learning a new move
+#define sEvoGraphicsTaskID gBattleCommunication[2]
+
+extern const u8 BattleText_StartEvo[];
+extern const u8 BattleText_FinishEvo[];
+extern const u8 BattleText_StopEvo[];
+extern void * const gUnknown_081FAF4C[];
+extern const u8* const gBattleStringsTable[];
+
+// this file's functions
+static void Task_EvolutionScene(u8 taskID);
+static void Task_TradeEvolutionScene(u8 taskID);
+static void CB2_EvolutionSceneUpdate(void);
+static void CB2_TradeEvolutionSceneUpdate(void);
+static void EvoDummyFunc(void);
+static void EvoDummyFunc2(void);
+static void VBlankCB_EvolutionScene(void);
+static void VBlankCB_TradeEvolutionScene(void);
+static void sub_81150D8(void);
+
+// iwram common
+MainCallback gCB2_AfterEvolution;
+
+// const data
+static const u8 sUnknownShedinjaJpnString[] = _("ヌケニン");
+static const u8 sUnusedString0[] = _("{COLOR DARK_GREY}{HIGHLIGHT WHITE2}{SHADOW LIGHT_GREY}");
+static const u8 sUnusedString1[] = _("▶\n ");
+static const u8 sUnusedString2[] = _(" \n▶");
+static const u8 sUnusedString3[] = _(" \n ");
+static const u8 sPadding[9] = {0};
+
+// code
+
+static void CB2_BeginEvolutionScene(void)
+{
+ UpdatePaletteFade();
+ RunTasks();
+}
+
+#define tState data[0]
+#define tMonPtrHI data[1]
+#define tMonPtrLO data[2]
+#define tPreEvoSpecies data[3]
+#define tPostEvoSpecies data[4]
+#define tCanStop data[5] // in first fast data[5] only checks that
+#define tBits data[5] // in the second task, it works as a bitfield
+#define tLearnsFirstMove data[6]
+#define tLearnMoveState data[8]
+#define tData9 data[9]
+#define tdata10 data[10]
+#define tEvoWasStopped data[11]
+#define tPartyID data[12]
+
+#define TASK_BIT_CAN_STOP 0x1
+#define TASK_BIT_LEARN_MOVE 0x80
+
+static void Task_BeginEvolutionScene(u8 taskID)
+{
+ struct Pokemon* mon = NULL;
+ switch (gTasks[taskID].tState)
+ {
+ case 0:
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ gTasks[taskID].tState++;
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ {
+ u16 speciesToEvolve;
+ bool8 canStopEvo;
+ u8 partyID;
+
+ mon = (struct Pokemon*)(gTasks[taskID].tMonPtrHI | (gTasks[taskID].tMonPtrLO << 0x10));
+ speciesToEvolve = gTasks[taskID].tPostEvoSpecies;
+ canStopEvo = gTasks[taskID].tCanStop;
+ partyID = gTasks[taskID].tPartyID;
+
+ DestroyTask(taskID);
+ EvolutionScene(mon, speciesToEvolve, canStopEvo, partyID);
+ }
+ break;
+ }
+}
+
+void BeginEvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, bool8 canStopEvo, u8 partyID)
+{
+ u8 taskID = CreateTask(Task_BeginEvolutionScene, 0);
+ gTasks[taskID].tState = 0;
+ gTasks[taskID].tMonPtrHI = (u32)(mon);
+ gTasks[taskID].tMonPtrLO = (u32)(mon) >> 0x10;
+ gTasks[taskID].tPostEvoSpecies = speciesToEvolve;
+ gTasks[taskID].tCanStop = canStopEvo;
+ gTasks[taskID].tPartyID = partyID;
+ SetMainCallback2(CB2_BeginEvolutionScene);
+}
+
+void EvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, bool8 canStopEvo, u8 partyID)
+{
+ u8 name[20];
+ u16 currSpecies;
+ u32 TiD, PiD;
+ const struct CompressedSpritePalette** pokePal;
+ u8 ID;
+ SetHBlankCallback(NULL);
+ SetVBlankCallback(NULL);
+ CpuFill32(0, (void*)(VRAM), VRAM_SIZE);
+
+ REG_MOSAIC = 0;
+ REG_WIN0H = 0;
+ REG_WIN0V = 0;
+ REG_WIN1H = 0;
+ REG_WIN1V = 0;
+ REG_WININ = 0;
+ REG_WINOUT = 0;
+
+ SetUpWindowConfig(&gWindowConfig_81E6C58);
+ ResetPaletteFade();
+
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 0;
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ gBattle_BG2_X = 0;
+ gBattle_BG2_Y = 0;
+ gUnknown_030041B0 = 256;
+ gUnknown_030041B8 = 0;
+
+ InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6C58);
+ gBattleTerrain = BATTLE_TERRAIN_PLAIN;
+
+ sub_800D6D4();
+ sub_800DAB8();
+ ResetSpriteData();
+ remove_some_task();
+ ResetTasks();
+ FreeAllSpritePalettes();
+
+ gReservedSpritePaletteCount = 4;
+
+ GetMonData(mon, MON_DATA_NICKNAME, name);
+ StringCopy10(gStringVar1, name);
+ StringCopy(gStringVar2, gSpeciesNames[speciesToEvolve]);
+
+ // preEvo sprite
+ currSpecies = GetMonData(mon, MON_DATA_SPECIES);
+ TiD = GetMonData(mon, MON_DATA_OT_ID);
+ PiD = GetMonData(mon, MON_DATA_PERSONALITY);
+ DecompressPicFromTable_2(&gMonFrontPicTable[currSpecies],
+ gMonFrontPicCoords[currSpecies].coords,
+ gMonFrontPicCoords[currSpecies].y_offset,
+ (void*)(0x2000000),
+ gUnknown_081FAF4C[1], currSpecies);
+ pokePal = (void*) GetMonSpritePalStructFromOtIdPersonality(currSpecies, TiD, PiD);
+ LoadCompressedPalette(*pokePal, 0x110, 0x20);
+
+ GetMonSpriteTemplate_803C56C(currSpecies, 1);
+ gUnknown_02024E8C.affineAnims = gDummySpriteAffineAnimTable;
+ sEvoInfo.preEvoSpriteID = ID = CreateSprite(&gUnknown_02024E8C, 120, 64, 30);
+
+ gSprites[ID].callback = nullsub_37;
+ gSprites[ID].oam.paletteNum = 1;
+ gSprites[ID].invisible = 1;
+
+ // postEvo sprite
+ DecompressPicFromTable_2(&gMonFrontPicTable[speciesToEvolve],
+ gMonFrontPicCoords[speciesToEvolve].coords,
+ gMonFrontPicCoords[speciesToEvolve].y_offset,
+ (void*)(0x2000000),
+ gUnknown_081FAF4C[3], speciesToEvolve);
+ pokePal = (void*) GetMonSpritePalStructFromOtIdPersonality(speciesToEvolve, TiD, PiD);
+ LoadCompressedPalette(*pokePal, 0x120, 0x20);
+
+ GetMonSpriteTemplate_803C56C(speciesToEvolve, 3);
+ gUnknown_02024E8C.affineAnims = gDummySpriteAffineAnimTable;
+ sEvoInfo.postEvoSpriteID = ID = CreateSprite(&gUnknown_02024E8C, 120, 64, 30);
+ gSprites[ID].callback = nullsub_37;
+ gSprites[ID].oam.paletteNum = 2;
+ gSprites[ID].invisible = 1;
+
+ LoadEvoSparkleSpriteAndPal();
+
+ sEvoInfo.evoTaskID = ID = CreateTask(Task_EvolutionScene, 0);
+ gTasks[ID].tState = 0;
+ gTasks[ID].tPreEvoSpecies = currSpecies;
+ gTasks[ID].tPostEvoSpecies = speciesToEvolve;
+ gTasks[ID].tMonPtrHI = (u32)(mon);
+ gTasks[ID].tMonPtrLO = (u32)(mon) >> 0x10;
+ gTasks[ID].tCanStop = canStopEvo;
+ gTasks[ID].tLearnsFirstMove = TRUE;
+ gTasks[ID].tEvoWasStopped = FALSE;
+ gTasks[ID].tPartyID = partyID;
+
+ memcpy(ewram9000_hack, &gPlttBufferUnfaded[0x20], 0x60);
+
+ REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_1D_MAP;
+ SetHBlankCallback(EvoDummyFunc);
+ SetVBlankCallback(VBlankCB_EvolutionScene);
+ m4aMPlayAllStop();
+ SetMainCallback2(CB2_EvolutionSceneUpdate);
+}
+
+static void CB2_EvolutionSceneLoadGraphics(void)
+{
+ u8 ID;
+ const struct CompressedSpritePalette** pokePal;
+ u16 postEvoSpecies;
+ u32 TiD, PiD;
+ struct Pokemon* Mon = &gPlayerParty[gTasks[sEvoInfo.evoTaskID].tPartyID];
+
+ postEvoSpecies = gTasks[sEvoInfo.evoTaskID].tPostEvoSpecies;
+ TiD = GetMonData(Mon, MON_DATA_OT_ID);
+ PiD = GetMonData(Mon, MON_DATA_PERSONALITY);
+
+ SetHBlankCallback(NULL);
+ SetVBlankCallback(NULL);
+ CpuFill32(0, (void*)(VRAM), VRAM_SIZE);
+
+ REG_MOSAIC = 0;
+ REG_WIN0H = 0;
+ REG_WIN0V = 0;
+ REG_WIN1H = 0;
+ REG_WIN1V = 0;
+ REG_WININ = 0;
+ REG_WINOUT = 0;
+ SetUpWindowConfig(&gWindowConfig_81E6C58);
+ ResetPaletteFade();
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 0;
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ gBattle_BG2_X = 0;
+ gBattle_BG2_Y = 0;
+ gUnknown_030041B0 = 256;
+ gUnknown_030041B8 = 0;
+
+ InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6C58);
+ gBattleTerrain = BATTLE_TERRAIN_PLAIN;
+
+ sub_800D6D4();
+ sub_800DAB8();
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ gReservedSpritePaletteCount = 4;
+
+ DecompressPicFromTable_2(&gMonFrontPicTable[postEvoSpecies],
+ gMonFrontPicCoords[postEvoSpecies].coords,
+ gMonFrontPicCoords[postEvoSpecies].y_offset,
+ (void*)(0x2000000),
+ gUnknown_081FAF4C[3], postEvoSpecies);
+ pokePal = (void*) GetMonSpritePalStructFromOtIdPersonality(postEvoSpecies, TiD, PiD);
+ LoadCompressedPalette(*pokePal, 0x120, 0x20);
+
+ GetMonSpriteTemplate_803C56C(postEvoSpecies, 3);
+ gUnknown_02024E8C.affineAnims = gDummySpriteAffineAnimTable;
+ sEvoInfo.postEvoSpriteID = ID = CreateSprite(&gUnknown_02024E8C, 120, 64, 30);
+
+ gSprites[ID].callback = nullsub_37;
+ gSprites[ID].oam.paletteNum = 2;
+
+ REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_1D_MAP;
+ SetHBlankCallback(EvoDummyFunc);
+ SetVBlankCallback(VBlankCB_EvolutionScene);
+ SetMainCallback2(CB2_EvolutionSceneUpdate);
+ BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
+}
+
+static void CB2_TradeEvolutionSceneLoadGraphics(void)
+{
+ struct Pokemon* Mon = &gPlayerParty[gTasks[sEvoInfo.evoTaskID].tPartyID];
+ u16 postEvoSpecies = gTasks[sEvoInfo.evoTaskID].tPostEvoSpecies;
+
+ switch (gMain.state)
+ {
+ case 0:
+ REG_DISPCNT = 0;
+ SetHBlankCallback(NULL);
+ SetVBlankCallback(NULL);
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ gReservedSpritePaletteCount = 4;
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 0;
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ gBattle_BG2_X = 0;
+ gBattle_BG2_Y = 0;
+ gUnknown_030041B0 = 256;
+ gUnknown_030041B8 = 0;
+ gMain.state++;
+ break;
+ case 1:
+ SetUpWindowConfig(&gWindowConfig_81E6F84);
+ InitWindowFromConfig(&gUnknown_03004828->window, &gWindowConfig_81E6F84);
+ gMain.state++;
+ break;
+ case 2:
+ LoadTextWindowGraphics(&gUnknown_03004828->window);
+ gUnknown_03004828->textWindowBaseTileNum = SetTextWindowBaseTileNum(2);
+ LoadTextWindowGraphics(&gUnknown_03004828->window);
+ MenuZeroFillScreen();
+ ResetPaletteFade();
+ gMain.state++;
+ SetHBlankCallback(EvoDummyFunc);
+ SetVBlankCallback(VBlankCB_TradeEvolutionScene);
+ break;
+ case 3:
+ sub_804E22C();
+ gMain.state++;
+ break;
+ case 4:
+ {
+ const struct CompressedSpritePalette** pokePal;
+ u32 TiD = GetMonData(Mon, MON_DATA_OT_ID);
+ u32 PiD = GetMonData(Mon, MON_DATA_PERSONALITY);
+ DecompressPicFromTable_2(&gMonFrontPicTable[postEvoSpecies],
+ gMonFrontPicCoords[postEvoSpecies].coords,
+ gMonFrontPicCoords[postEvoSpecies].y_offset,
+ (void*)(0x2000000),
+ gUnknown_081FAF4C[3], postEvoSpecies);
+ pokePal = (void*) GetMonSpritePalStructFromOtIdPersonality(postEvoSpecies, TiD, PiD);
+ LoadCompressedPalette(*pokePal, 0x120, 0x20);
+ gMain.state++;
+ }
+ break;
+ case 5:
+ {
+ u8 ID;
+
+ GetMonSpriteTemplate_803C56C(postEvoSpecies, 3);
+ gUnknown_02024E8C.affineAnims = gDummySpriteAffineAnimTable;
+ sEvoInfo.postEvoSpriteID = ID = CreateSprite(&gUnknown_02024E8C, 120, 64, 30);
+
+ gSprites[ID].callback = nullsub_37;
+ gSprites[ID].oam.paletteNum = 2;
+ gMain.state++;
+ }
+ break;
+ case 6:
+ BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
+ SetMainCallback2(CB2_TradeEvolutionSceneUpdate);
+ REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_1D_MAP;
+ break;
+ }
+}
+
+void TradeEvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, u8 preEvoSpriteID, u8 partyID)
+{
+ u8 name[20];
+ u16 currSpecies;
+ u32 TiD, PiD;
+ const struct CompressedSpritePalette** pokePal;
+ u8 ID;
+
+ GetMonData(mon, MON_DATA_NICKNAME, name);
+ StringCopy10(gStringVar1, name);
+ StringCopy(gStringVar2, gSpeciesNames[speciesToEvolve]);
+
+ gAffineAnimsDisabled = TRUE;
+
+ // preEvo sprite
+ currSpecies = GetMonData(mon, MON_DATA_SPECIES);
+ PiD = GetMonData(mon, MON_DATA_PERSONALITY);
+ TiD = GetMonData(mon, MON_DATA_OT_ID);
+ sEvoInfo.preEvoSpriteID = preEvoSpriteID;
+ DecompressPicFromTable_2(&gMonFrontPicTable[speciesToEvolve],
+ gMonFrontPicCoords[speciesToEvolve].coords,
+ gMonFrontPicCoords[speciesToEvolve].y_offset,
+ (void*)(0x2000000),
+ gUnknown_081FAF4C[1], speciesToEvolve);
+ pokePal = (void*) GetMonSpritePalStructFromOtIdPersonality(speciesToEvolve, TiD, PiD);
+ LoadCompressedPalette(*pokePal, 0x120, 0x20);
+
+ GetMonSpriteTemplate_803C56C(speciesToEvolve, 1);
+ gUnknown_02024E8C.affineAnims = gDummySpriteAffineAnimTable;
+ sEvoInfo.postEvoSpriteID = ID = CreateSprite(&gUnknown_02024E8C, 120, 64, 30);
+
+ gSprites[ID].callback = nullsub_37;
+ gSprites[ID].oam.paletteNum = 2;
+ gSprites[ID].invisible = 1;
+
+ LoadEvoSparkleSpriteAndPal();
+
+ sEvoInfo.evoTaskID = ID = CreateTask(Task_TradeEvolutionScene, 0);
+ gTasks[ID].tState = 0;
+ gTasks[ID].tPreEvoSpecies = currSpecies;
+ gTasks[ID].tPostEvoSpecies = speciesToEvolve;
+ gTasks[ID].tMonPtrHI = (u32)(mon);
+ gTasks[ID].tMonPtrLO = (u32)(mon) >> 0x10;
+ gTasks[ID].tLearnsFirstMove = TRUE;
+ gTasks[ID].tEvoWasStopped = FALSE;
+ gTasks[ID].tPartyID = partyID;
+
+ SetMainCallback2(CB2_TradeEvolutionSceneUpdate);
+}
+
+static void CB2_EvolutionSceneUpdate(void)
+{
+ AnimateSprites();
+ BuildOamBuffer();
+ sub_800374C(&gUnknown_03004210);
+ UpdatePaletteFade();
+ RunTasks();
+}
+
+static void CB2_TradeEvolutionSceneUpdate(void)
+{
+ AnimateSprites();
+ BuildOamBuffer();
+ sub_80035AC(&gUnknown_03004828->window);
+ UpdatePaletteFade();
+ RunTasks();
+}
+
+static void CreateShedinja(u16 preEvoSpecies, struct Pokemon* mon)
+{
+ u32 data = 0;
+ if (gEvolutionTable[preEvoSpecies].evolutions[0].method == EVO_LEVEL_NINJASK && gPlayerPartyCount < 6)
+ {
+ s32 i;
+ struct Pokemon* Shedinja = &gPlayerParty[gPlayerPartyCount];
+ const struct EvolutionData* EvoTable;
+ const struct EvolutionData* Evos;
+
+ CopyMon(Shedinja, mon, sizeof(struct Pokemon));
+ SetMonData(Shedinja, MON_DATA_SPECIES, (void*)(&gEvolutionTable[preEvoSpecies].evolutions[1].targetSpecies));
+ SetMonData(Shedinja, MON_DATA_NICKNAME, (void*)(gSpeciesNames[gEvolutionTable[preEvoSpecies].evolutions[1].targetSpecies]));
+ SetMonData(Shedinja, MON_DATA_HELD_ITEM, (void*)(&data));
+ SetMonData(Shedinja, MON_DATA_MARKINGS, (void*)(&data));
+ SetMonData(Shedinja, MON_DATA_10, (void*)(&data));
+ for (i = MON_DATA_COOL_RIBBON; i < MON_DATA_COOL_RIBBON + 5; i++)
+ SetMonData(Shedinja, i, (void*)(&data));
+ for (i = MON_DATA_CHAMPION_RIBBON; i <= MON_DATA_FATEFUL_ENCOUNTER; i++)
+ SetMonData(Shedinja, i, (void*)(&data));
+ SetMonData(Shedinja, MON_DATA_STATUS, (void*)(&data));
+ data = 0xFF;
+ SetMonData(Shedinja, MON_DATA_MAIL, (void*)(&data));
+
+ CalculateMonStats(Shedinja);
+ CalculatePlayerPartyCount();
+
+ // can't match it otherwise, ehh
+ EvoTable = gEvolutionTable;
+ Evos = EvoTable + preEvoSpecies;
+ 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
+ && GetMonData(mon, MON_DATA_SPECIES) == SPECIES_NINJASK)
+ SetMonData(Shedinja, MON_DATA_NICKNAME, sUnknownShedinjaJpnString);
+ }
+}
+
+static void Task_EvolutionScene(u8 taskID)
+{
+ u32 var;
+ struct Pokemon* mon = (struct Pokemon*)(gTasks[taskID].tMonPtrHI | (gTasks[taskID].tMonPtrLO << 0x10));
+
+ // check if B Button was held, so the evolution gets stopped
+ if (gMain.heldKeys == B_BUTTON && gTasks[taskID].tState == 8 && gTasks[taskID].tBits & TASK_BIT_CAN_STOP)
+ {
+ gTasks[taskID].tState = 16;
+ if (gTasks[sEvoGraphicsTaskID].isActive)
+ gTasks[sEvoGraphicsTaskID].EvoGraphicsTaskEvoStop = TRUE;
+ }
+ switch (gTasks[taskID].tState)
+ {
+ case 0:
+ BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
+ gSprites[sEvoInfo.preEvoSpriteID].invisible = 0;
+ gTasks[taskID].tState++;
+ break;
+ case 1: // print 'whoa, poke is evolving!!!' msg
+ if (!gPaletteFade.active)
+ {
+ StringExpandPlaceholders(gStringVar4, BattleText_StartEvo);
+ sub_8002EB0(&gUnknown_03004210, gStringVar4, 144, 2, 15);
+ gTasks[taskID].tState++;
+ }
+ break;
+ case 2: // wait for string, play cry
+ if (gUnknown_03004210.state == 0)
+ {
+ PlayCry1(gTasks[taskID].tPreEvoSpecies, 0);
+ gTasks[taskID].tState++;
+ }
+ break;
+ case 3: // wait for cry, play tu du SE
+ if (IsCryFinished())
+ {
+ PlaySE(BGM_ME_SHINKA);
+ gTasks[taskID].tState++;
+ }
+ break;
+ case 4: // play evolution music and fade screen black
+ if (!IsSEPlaying())
+ {
+ PlayNewMapMusic(BGM_SHINKA);
+ gTasks[taskID].tState++;
+ BeginNormalPaletteFade(0x1C, 4, 0, 0x10, 0);
+ }
+ break;
+ case 5: // after screen fade, preapre evo sparkles
+ if (!gPaletteFade.active)
+ {
+ sEvoGraphicsTaskID = LaunchTask_PreEvoSparklesSet1(17);
+ gTasks[taskID].tState++;
+ }
+ break;
+ case 6: // another set of evo sparkles
+ if (!gTasks[sEvoGraphicsTaskID].isActive)
+ {
+ gTasks[taskID].tState++;
+ sEvoInfo.field_3 = 1;
+ sEvoGraphicsTaskID = LaunchTask_PreEvoSparklesSet2();
+ }
+ break;
+ case 7: // launch task that flashes pre evo with post evo sprites
+ if (!gTasks[sEvoGraphicsTaskID].isActive)
+ {
+ sEvoGraphicsTaskID = sub_8149E7C(sEvoInfo.preEvoSpriteID, sEvoInfo.postEvoSpriteID);
+ gTasks[taskID].tState++;
+ }
+ break;
+ case 8: // wait for the above task to finish
+ if (--sEvoInfo.field_3 == 0)
+ {
+ sEvoInfo.field_3 = 3;
+ if (!gTasks[sEvoGraphicsTaskID].isActive)
+ gTasks[taskID].tState++;
+ }
+ break;
+ case 9: // post evo sparkles
+ sEvoGraphicsTaskID = LaunchTask_PostEvoSparklesSet1();
+ gTasks[taskID].tState++;
+ break;
+ case 10:
+ if (!gTasks[sEvoGraphicsTaskID].isActive)
+ {
+ sEvoGraphicsTaskID = LaunchTask_PostEvoSparklesSet2AndFlash(gTasks[taskID].tPostEvoSpecies);
+ gTasks[taskID].tState++;
+ }
+ break;
+ case 11: // play tu du sound after evolution
+ if (!gTasks[sEvoGraphicsTaskID].isActive)
+ {
+ PlaySE(SE_EXP);
+ gTasks[taskID].tState++;
+ }
+ break;
+ case 12: // play poke cry after evolution and return screed to pre-fade state
+ if (IsSEPlaying())
+ {
+ m4aMPlayAllStop();
+ PlayCry1(gTasks[taskID].tPostEvoSpecies, 0);
+ memcpy(&gPlttBufferUnfaded[0x20], ewram9000_hack, 0x60);
+ BeginNormalPaletteFade(0x1C, 0, 0x10, 0, 0);
+ gTasks[taskID].tState++;
+ }
+ break;
+ case 13: // congratulations string and rename prompt
+ if (IsCryFinished() && !gPaletteFade.active)
+ {
+ StringExpandPlaceholders(gStringVar4, BattleText_FinishEvo);
+ sub_8002EB0(&gUnknown_03004210, gStringVar4, 144, 2, 15);
+ PlayBGM(BGM_FANFA5);
+ gTasks[taskID].tState++;
+ SetMonData(mon, MON_DATA_SPECIES, (void*)(&gTasks[taskID].tPostEvoSpecies));
+ CalculateMonStats(mon);
+ EvolutionRenameMon(mon, gTasks[taskID].tPreEvoSpecies, gTasks[taskID].tPostEvoSpecies);
+ GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskID].tPostEvoSpecies), 2);
+ GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskID].tPostEvoSpecies), 3);
+ IncrementGameStat(14);
+ }
+ break;
+ case 14: // check if it wants to learn a new move
+ if (gUnknown_03004210.state == 0)
+ {
+ var = MonTryLearningNewMove(mon, gTasks[taskID].tLearnsFirstMove);
+ if (var != 0 && !gTasks[taskID].tEvoWasStopped)
+ {
+ u8 text[20];
+
+ Overworld_PlaySpecialMapMusic();
+ gTasks[taskID].tBits |= TASK_BIT_LEARN_MOVE;
+ gTasks[taskID].tLearnsFirstMove = FALSE;
+ gTasks[taskID].tLearnMoveState = 0;
+ GetMonData(mon, MON_DATA_NICKNAME, text);
+ StringCopy10(gBattleTextBuff1, text);
+ if (var == 0xFFFF) // no place to learn it
+ gTasks[taskID].tState = 21;
+ else if (var == 0xFFFE) // it already knows that move
+ break;
+ else
+ gTasks[taskID].tState = 19; // has less than 4 moves, so it's been learned
+ }
+ else // no move to learn
+ {
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ gTasks[taskID].tState++;
+ }
+ }
+ break;
+ case 15: // task has finished, return
+ if (!gPaletteFade.active)
+ {
+ if (!(gTasks[taskID].tBits & TASK_BIT_LEARN_MOVE))
+ Overworld_PlaySpecialMapMusic();
+ if (!gTasks[taskID].tEvoWasStopped)
+ CreateShedinja(gTasks[taskID].tPreEvoSpecies, mon);
+ DestroyTask(taskID);
+ SetMainCallback2(gCB2_AfterEvolution);
+ }
+ break;
+ case 16: // evolution has been canceled, stop music and re-fade palette
+ if (!gTasks[sEvoGraphicsTaskID].isActive)
+ {
+ m4aMPlayAllStop();
+ BeginNormalPaletteFade(0x6001C, 0, 0x10, 0, 0x7FFF);
+ gTasks[taskID].tState++;
+ }
+ break;
+ case 17: // play cry of the pokemon trying to evolve again, evolution has been stopped
+ if (!gPaletteFade.active)
+ {
+ PlayCry1(gTasks[taskID].tPreEvoSpecies, 0);
+ gTasks[taskID].tState++;
+ }
+ break;
+ case 18: // after the cry, print the string 'WHOA IT DID NOT EVOLVE!!!'
+ if (IsCryFinished())
+ {
+ StringExpandPlaceholders(gStringVar4, BattleText_StopEvo);
+ sub_8002EB0(&gUnknown_03004210, gStringVar4, 144, 2, 15);
+ gTasks[taskID].tEvoWasStopped = TRUE;
+ gTasks[taskID].tState = 14;
+ }
+ break;
+ case 19: // pokemon learned a new move, print string and play a fanfare
+ if (gUnknown_03004210.state == 0 && !IsSEPlaying())
+ {
+ sub_8024CEC();
+ PlayFanfare(BGM_FANFA1);
+ StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[3]);
+ sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15);
+ gTasks[taskID].tLearnsFirstMove = 0x40; // re-used as a counter
+ gTasks[taskID].tState++;
+ }
+ break;
+ case 20: // wait a bit and check if can learn another move
+ if (gUnknown_03004210.state == 0 && !IsSEPlaying() && --gTasks[taskID].tLearnsFirstMove == 0)
+ gTasks[taskID].tState = 14;
+ break;
+ case 21: // try to learn a new move
+ switch (gTasks[taskID].tLearnMoveState)
+ {
+ case 0:
+ if (gUnknown_03004210.state == 0 && !IsSEPlaying())
+ {
+ sub_8024CEC();
+ StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[4]);
+ sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15);
+ gTasks[taskID].tLearnMoveState++;
+ }
+ break;
+ case 1:
+ if (gUnknown_03004210.state == 0 && !IsSEPlaying())
+ {
+ StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[5]);
+ sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15);
+ gTasks[taskID].tLearnMoveState++;
+ }
+ break;
+ case 2:
+ if (gUnknown_03004210.state != 0)
+ break;
+ if (!IsSEPlaying())
+ {
+ StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[6]);
+ sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15);
+ gTasks[taskID].tData9 = 5;
+ gTasks[taskID].tdata10 = 9;
+ gTasks[taskID].tLearnMoveState++;
+ }
+ case 3:
+ if (gUnknown_03004210.state == 0 && !IsSEPlaying())
+ {
+ sub_8023A80();
+ gTasks[taskID].tLearnMoveState++;
+ sEvoCursorPos = 0;
+ sub_802BC6C();
+ }
+ break;
+ case 4:
+ if (gMain.newKeys & DPAD_UP && sEvoCursorPos != 0)
+ {
+ PlaySE(SE_SELECT);
+ nullsub_6();
+ sEvoCursorPos = 0;
+ sub_802BC6C();
+ }
+ if (gMain.newKeys & DPAD_DOWN && sEvoCursorPos == 0)
+ {
+ PlaySE(SE_SELECT);
+ nullsub_6();
+ sEvoCursorPos = 1;
+ sub_802BC6C();
+ }
+ if (gMain.newKeys & A_BUTTON)
+ {
+ sub_8023AD8();
+ StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[292]);
+ sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15);
+ PlaySE(SE_SELECT);
+ if (sEvoCursorPos != 0)
+ gTasks[taskID].tLearnMoveState = gTasks[taskID].tdata10;
+ else
+ {
+ gTasks[taskID].tLearnMoveState = gTasks[taskID].tData9;
+ if (gTasks[taskID].tLearnMoveState == 5)
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ }
+ }
+ if (gMain.newKeys & B_BUTTON)
+ {
+ sub_8023AD8();
+ StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[292]);
+ sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15);
+ PlaySE(SE_SELECT);
+ gTasks[taskID].tLearnMoveState = gTasks[taskID].tdata10;
+ }
+ break;
+ case 5:
+ if (!gPaletteFade.active)
+ {
+ ShowSelectMovePokemonSummaryScreen(gPlayerParty, gTasks[taskID].tPartyID,
+ gPlayerPartyCount - 1, CB2_EvolutionSceneLoadGraphics,
+ gMoveToLearn);
+ gTasks[taskID].tLearnMoveState++;
+ }
+ break;
+ case 6:
+ if (!gPaletteFade.active && gMain.callback2 == CB2_EvolutionSceneUpdate)
+ {
+ var = sub_809FA30(); // moveID
+ if (var == 4)
+ gTasks[taskID].tLearnMoveState = 9;
+ else
+ {
+ u16 move = GetMonData(mon, var + MON_DATA_MOVE1);
+ if (IsHMMove2(move))
+ {
+ StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[307]);
+ sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15);
+ gTasks[taskID].tLearnMoveState = 11;
+ }
+ else
+ {
+ gBattleTextBuff2[0] = 0xFD;
+ gBattleTextBuff2[1] = 2;
+ gBattleTextBuff2[2] = move;
+ gBattleTextBuff2[3] = (move & 0xFF00) >> 8;
+ gBattleTextBuff2[4] = EOS;
+ RemoveMonPPBonus(mon, var);
+ SetMonMoveSlot(mon, gMoveToLearn, var);
+ StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[207]);
+ sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15);
+ gTasks[taskID].tLearnMoveState++;
+ }
+ }
+ }
+ break;
+ case 7:
+ if (gUnknown_03004210.state == 0 && !IsSEPlaying())
+ {
+ StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[7]);
+ sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15);
+ gTasks[taskID].tLearnMoveState++;
+ }
+ break;
+ case 8:
+ if (gUnknown_03004210.state == 0 && !IsSEPlaying())
+ {
+ StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[208]);
+ sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15);
+ gTasks[taskID].tState = 19;
+ }
+ break;
+ case 9:
+ StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[8]);
+ sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15);
+ gTasks[taskID].tData9 = 10;
+ gTasks[taskID].tdata10 = 0;
+ gTasks[taskID].tLearnMoveState = 3;
+ break;
+ case 10:
+ StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[9]);
+ sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 144, 2, 15);
+ gTasks[taskID].tState = 14;
+ break;
+ case 11:
+ if (gUnknown_03004210.state == 0 && !IsSEPlaying())
+ gTasks[taskID].tLearnMoveState = 5;
+ break;
+ }
+ break;
+ }
+}
+
+static void Task_TradeEvolutionScene(u8 taskID)
+{
+ u32 var;
+ struct Pokemon* mon = (struct Pokemon*)(gTasks[taskID].tMonPtrHI | (gTasks[taskID].tMonPtrLO << 0x10));
+
+ switch (gTasks[taskID].tState)
+ {
+ case 0:
+ StringExpandPlaceholders(gStringVar4, BattleText_StartEvo);
+ sub_8002EB0(&gUnknown_03004828->window, gStringVar4, gUnknown_03004828->textWindowBaseTileNum, 2, 15);
+ gTasks[taskID].tState++;
+ break;
+ case 1:
+ if (gUnknown_03004828->window.state == 0)
+ {
+ PlayCry1(gTasks[taskID].tPreEvoSpecies, 0);
+ gTasks[taskID].tState++;
+ }
+ break;
+ case 2:
+ if (IsCryFinished())
+ {
+ m4aSongNumStop(BGM_SHINKA);
+ PlaySE(BGM_ME_SHINKA);
+ gTasks[taskID].tState++;
+ }
+ break;
+ case 3:
+ if (!IsSEPlaying())
+ {
+ PlayBGM(BGM_SHINKA);
+ gTasks[taskID].tState++;
+ BeginNormalPaletteFade(0x1C, 4, 0, 0x10, 0);
+ }
+ break;
+ case 4:
+ if (!gPaletteFade.active)
+ {
+ REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_1D_MAP;
+ sEvoGraphicsTaskID = LaunchTask_PreEvoSparklesSet1(17);
+ gTasks[taskID].tState++;
+ }
+ break;
+ case 5:
+ if (!gTasks[sEvoGraphicsTaskID].isActive)
+ {
+ gTasks[taskID].tState++;
+ sEvoInfo.field_3 = 1;
+ sEvoGraphicsTaskID = LaunchTask_PreEvoSparklesSet2();
+ }
+ break;
+ case 6:
+ if (!gTasks[sEvoGraphicsTaskID].isActive)
+ {
+ sEvoGraphicsTaskID = sub_8149E7C(sEvoInfo.preEvoSpriteID, sEvoInfo.postEvoSpriteID);
+ gTasks[taskID].tState++;
+ }
+ break;
+ case 7:
+ if (--sEvoInfo.field_3 == 0)
+ {
+ sEvoInfo.field_3 = 3;
+ if (!gTasks[sEvoGraphicsTaskID].isActive)
+ gTasks[taskID].tState++;
+ }
+ break;
+ case 8:
+ sEvoGraphicsTaskID = LaunchTask_PostEvoSparklesSet1();
+ gTasks[taskID].tState++;
+ break;
+ case 9:
+ if (!gTasks[sEvoGraphicsTaskID].isActive)
+ {
+ sEvoGraphicsTaskID = LaunchTask_PostEvoSparklesSet2AndFlash_Trade(gTasks[taskID].tPostEvoSpecies);
+ gTasks[taskID].tState++;
+ }
+ break;
+ case 10:
+ if (!gTasks[sEvoGraphicsTaskID].isActive)
+ {
+ PlaySE(SE_EXP);
+ gTasks[taskID].tState++;
+ }
+ break;
+ case 11:
+ if (IsSEPlaying())
+ {
+ PlayCry1(gTasks[taskID].tPostEvoSpecies, 0);
+ memcpy(&gPlttBufferUnfaded[0x20], ewram9000_hack, 0x60);
+ BeginNormalPaletteFade(1, 0, 0x10, 0, 0);
+ gTasks[taskID].tState++;
+ }
+ break;
+ case 12:
+ if (IsCryFinished() && !gPaletteFade.active)
+ {
+ StringExpandPlaceholders(gStringVar4, BattleText_FinishEvo);
+ 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);
+ GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskID].tPostEvoSpecies), 2);
+ GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskID].tPostEvoSpecies), 3);
+ IncrementGameStat(14);
+ }
+ break;
+ case 13:
+ if (gUnknown_03004828->window.state == 0 && IsFanfareTaskInactive() == TRUE)
+ {
+ var = MonTryLearningNewMove(mon, gTasks[taskID].tLearnsFirstMove);
+ if (var != 0 && !gTasks[taskID].tEvoWasStopped)
+ {
+ u8 text[20];
+
+ gTasks[taskID].tBits |= TASK_BIT_LEARN_MOVE;
+ gTasks[taskID].tLearnsFirstMove = FALSE;
+ gTasks[taskID].tLearnMoveState = 0;
+ GetMonData(mon, MON_DATA_NICKNAME, text);
+ StringCopy10(gBattleTextBuff1, text);
+ if (var == 0xFFFF)
+ gTasks[taskID].tState = 17;
+ else if (var == 0xFFFE)
+ break;
+ else
+ gTasks[taskID].tState = 15;
+ }
+ else
+ {
+ PlayBGM(BGM_SHINKA);
+ sub_8002EB0(&gUnknown_03004828->window, gOtherText_LinkStandby2, gUnknown_03004828->textWindowBaseTileNum, 2, 15);
+ gTasks[taskID].tState++;
+ }
+ }
+ break;
+ case 14:
+ if (gUnknown_03004828->window.state == 0)
+ {
+ DestroyTask(taskID);
+ SetMainCallback2(gCB2_AfterEvolution);
+ }
+ break;
+ case 15:
+ if (gUnknown_03004828->window.state == 0 && !IsSEPlaying())
+ {
+ sub_8024CEC();
+ PlayFanfare(BGM_FANFA1);
+ StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[3]);
+ 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->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->window.state == 0 && !IsSEPlaying())
+ {
+ sub_8024CEC();
+ StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[4]);
+ sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15);
+ gTasks[taskID].tLearnMoveState++;
+ }
+ break;
+ case 1:
+ if (gUnknown_03004828->window.state == 0 && !IsSEPlaying())
+ {
+ StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[5]);
+ sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15);
+ gTasks[taskID].tLearnMoveState++;
+ }
+ break;
+ case 2:
+ if (gUnknown_03004828->window.state != 0)
+ break;
+ if (!IsSEPlaying())
+ {
+ StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[6]);
+ 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->window.state == 0 && !IsSEPlaying())
+ {
+ DrawTextWindow(&gUnknown_03004828->window, 24, 8, 29, 13);
+ sEvoCursorPos = 0;
+ 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++;
+ sEvoCursorPos = 0;
+ }
+ break;
+ case 4:
+ if (gMain.newKeys & DPAD_UP && sEvoCursorPos != 0)
+ {
+ PlaySE(SE_SELECT);
+ EvoDummyFunc2();
+ sEvoCursorPos = 0;
+ sub_81150D8();
+ }
+ if (gMain.newKeys & DPAD_DOWN && sEvoCursorPos == 0)
+ {
+ PlaySE(SE_SELECT);
+ EvoDummyFunc2();
+ sEvoCursorPos = 1;
+ sub_81150D8();
+ }
+ if (gMain.newKeys & A_BUTTON)
+ {
+ ZeroFillWindowRect(&gUnknown_03004828->window, 0x18, 8, 0x1D, 0xD);
+ DestroyMenuCursor();
+ StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[292]);
+ sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15);
+ PlaySE(SE_SELECT);
+ if (sEvoCursorPos != 0)
+ gTasks[taskID].tLearnMoveState = gTasks[taskID].tdata10;
+ else
+ {
+ gTasks[taskID].tLearnMoveState = gTasks[taskID].tData9;
+ if (gTasks[taskID].tLearnMoveState == 5)
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ }
+ }
+ if (gMain.newKeys & B_BUTTON)
+ {
+ ZeroFillWindowRect(&gUnknown_03004828->window, 0x18, 8, 0x1D, 0xD);
+ DestroyMenuCursor();
+ StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[292]);
+ sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15);
+ PlaySE(SE_SELECT);
+ gTasks[taskID].tLearnMoveState = gTasks[taskID].tdata10;
+ }
+ break;
+ case 5:
+ if (!gPaletteFade.active)
+ {
+ ShowSelectMovePokemonSummaryScreen(gPlayerParty, gTasks[taskID].tPartyID,
+ gPlayerPartyCount - 1, CB2_TradeEvolutionSceneLoadGraphics,
+ gMoveToLearn);
+ gTasks[taskID].tLearnMoveState++;
+ }
+ break;
+ case 6:
+ if (!gPaletteFade.active && gMain.callback2 == CB2_TradeEvolutionSceneUpdate)
+ {
+ var = sub_809FA30(); // moveID
+ if (var == 4)
+ gTasks[taskID].tLearnMoveState = 9;
+ else
+ {
+ u16 move = GetMonData(mon, var + MON_DATA_MOVE1);
+ if (IsHMMove2(move))
+ {
+ StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[307]);
+ sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15);
+ gTasks[taskID].tLearnMoveState = 11;
+ }
+ else
+ {
+ gBattleTextBuff2[0] = 0xFD;
+ gBattleTextBuff2[1] = 2;
+ gBattleTextBuff2[2] = move;
+ gBattleTextBuff2[3] = (move & 0xFF00) >> 8;
+ gBattleTextBuff2[4] = EOS;
+ RemoveMonPPBonus(mon, var);
+ SetMonMoveSlot(mon, gMoveToLearn, var);
+ StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[207]);
+ sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15);
+ gTasks[taskID].tLearnMoveState++;
+ }
+ }
+ }
+ break;
+ case 7:
+ if (gUnknown_03004828->window.state == 0 && !IsSEPlaying())
+ {
+ StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[7]);
+ sub_8002EB0(&gUnknown_03004828->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15);
+ gTasks[taskID].tLearnMoveState++;
+ }
+ break;
+ case 8:
+ if (gUnknown_03004828->window.state == 0 && !IsSEPlaying())
+ {
+ StrCpyDecodeToDisplayedStringBattle(gBattleStringsTable[208]);
+ 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->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->window, gDisplayedStringBattle, gUnknown_03004828->textWindowBaseTileNum, 2, 15);
+ gTasks[taskID].tState = 13;
+ break;
+ case 11:
+ if (gUnknown_03004828->window.state == 0 && !IsSEPlaying())
+ gTasks[taskID].tLearnMoveState = 5;
+ break;
+ }
+ break;
+ }
+}
+
+/*
+DizzyEgg, 27.08.2017
+NOTE:
+ Functions below are all unused.
+ What's more, they do NOT exist in Emerald.
+ That's why I think there is no reason to decompile those,
+ as they probably were prototypes for the evolution
+ functions.
+*/
+
+/*
+void unref_sub_8113B50(u8 *a, u8 *b)
+{
+ //u8 *sp0 = a;
+ //u8 *sp4 = b;
+#define sp0 a
+#define sp4 b
+ s32 sp8;
+ s32 spC = 0;
+ u32 sp10 = 0;
+ s32 sp14;
+ s32 r6;
+ u32 r8;
+
+ for (sp8 = 0; sp8 < 64; sp8++)
+ {
+ sEvoInfo.unk84[sp8] = 0;
+ sEvoInfo.unk4[sp8] = 0;
+ sEvoInfo.unk44[sp8] = 0;
+ for (r6 = 0; r6 < 32; r6++)
+ {
+ sEvoInfo.unk10C4[sp8][r6] = 0;
+ sEvoInfo.unk18C4[sp8][r6] = 0;
+ sEvoInfo.unk20C4[sp8][r6] = 0;
+ sEvoInfo.unk28C4[sp8][r6] = 0;
+ sEvoInfo.unkC4[sp8][r6] = 0;
+ sEvoInfo.unk8C4[sp8][r6] = 0;
+ sEvoInfo.unk30C4[sp8][r6] = 0;
+ sEvoInfo.unk38C4[sp8][r6] = 0;
+
+ sEvoInfo.unk60C4[sp8][r6] = 0;
+ sEvoInfo.unk70C4[sp8][r6] = 0;
+ sEvoInfo.unk80C4[sp8][r6] = 0;
+ sEvoInfo.unk90C4[sp8][r6] = 0;
+ }
+ }
+
+ sEvoInfo.unkA0C4 = 64;
+ r8 = 0;
+ for (sp8 = 0; sp8 < 64; sp8++)
+ {
+ //_08113C32
+ u32 r3 = 0;
+ u8 *r2 = sp0 + r8;
+
+ for (r6 = 0; r6 < 64; r6++)
+ {
+ sEvoInfo.unk40C4[sp8][r6 >> 1] = r2;
+ switch (r3)
+ {
+ case 0:
+ switch (r6 & 1)
+ {
+ case 0:
+ if (*r2 & 0xF)
+ {
+ sEvoInfo.unk10C4[sp8][sEvoInfo.unk4[sp8]] = r6;
+ r3 = 1;
+ }
+ break;
+ case 1:
+ if (*r2 & 0xF0)
+ {
+ sEvoInfo.unk10C4[sp8][sEvoInfo.unk4[sp8]] = r6;
+ r3 = 1;
+ }
+ break;
+ }
+ break;
+ case 1:
+ switch (r6 & r3)
+ {
+ case 0:
+ if (*r2 & 0xF)
+ {
+ sEvoInfo.unk18C4[sp8][sEvoInfo.unk4[sp8]] = r6 - 1;
+ sEvoInfo.unk4[sp8]++;
+ r3 = 0;
+ }
+ break;
+ case 1:
+ if (*r2 & 0xF0)
+ {
+ sEvoInfo.unk18C4[sp8][sEvoInfo.unk4[sp8]] = r6 - 1;
+ sEvoInfo.unk4[sp8]++;
+ r3 = 0;
+ }
+ break;
+ }
+ }
+ //if (!((r6 + 1) & 7))
+ if ((r6 + 1) % 8 == 0)
+ r2 += 0x1D;
+ else if (r6 & 1)
+ r2 += 1;
+ }
+ if (r3)
+ {
+ sEvoInfo.unk18C4[sp8][sEvoInfo.unk4[sp8]] = r6;
+ sEvoInfo.unk4[sp8]++;
+ }
+ //_08113D26
+ if (!((sp8 + 1) & 7))
+ r8 += 0xE4;
+ else
+ r8 += 4;
+ }
+ //_08113D4A
+ r8 = 0;
+ for (sp8 = 0; sp8 < 64; sp8++)
+ {
+ //_08113D6A
+ u32 r3 = 0;
+ u8 *r2 = sp4 + r8;
+
+ for (r6 = 0; r6 < 64; r6++)
+ {
+ switch (r3)
+ {
+ case 0:
+ switch (r6 & 1)
+ {
+ case 0:
+ if (*r2 & 0xF)
+ {
+ sEvoInfo.unk20C4[sp8][sEvoInfo.unk44[sp8]] = r6;
+ r3 = 1;
+ }
+ break;
+ case 1:
+ if (*r2 & 0xF0)
+ {
+ sEvoInfo.unk20C4[sp8][sEvoInfo.unk44[sp8]] = r6;
+ r3 = 1;
+ }
+ break;
+ }
+ break;
+ case 1:
+ switch (r6 & r3)
+ {
+ case 0:
+ if (*r2 & 0xF)
+ {
+ sEvoInfo.unk28C4[sp8][sEvoInfo.unk44[sp8]] = r6 - 1;
+ sEvoInfo.unk44[sp8]++;
+ r3 = 0;
+ }
+ break;
+ case 1:
+ if (*r2 & 0xF0)
+ {
+ sEvoInfo.unk28C4[sp8][sEvoInfo.unk44[sp8]] = r6 - 1;
+ sEvoInfo.unk44[sp8]++;
+ r3 = 0;
+ }
+ break;
+ }
+ }
+ //_08113DE4
+ if (!((r6 + 1) & 7))
+ r2 += 0x1D;
+ else if (r6 & 1)
+ r2 += 1;
+
+ }
+ if (r3)
+ {
+ sEvoInfo.unk28C4[sp8][sEvoInfo.unk44[sp8]] = r6;
+ sEvoInfo.unk44[sp8]++;
+ }
+ //if (!((sp8 + 1) & 7))
+ if ((sp8 + 1) % 8 == 0)
+ r8 += 0xE4;
+ else
+ r8 += 4;
+ }
+
+ for (sp8 = 0; sp8 < 0x40; sp8++) //_08113E3A
+ {
+ if (sEvoInfo.unk4[sp8] < sEvoInfo.unk44[sp8])
+ {
+ for (spC = 0; spC < sEvoInfo.unk4[sp8]; spC++)
+ {
+ sp14 = 0x100;
+
+ for (r6 = 0; r6 < sEvoInfo.unk44[sp8]; r6++)
+ {
+ s32 r3;
+
+ //_08113EA4
+ if (sEvoInfo.unk10C4[sp8][spC] > sEvoInfo.unk20C4[sp8][r6])
+ r3 = sEvoInfo.unk10C4[sp8][spC] - sEvoInfo.unk20C4[sp8][r6];
+ else
+ r3 = sEvoInfo.unk20C4[sp8][r6] - sEvoInfo.unk10C4[sp8][spC];
+
+ if (sEvoInfo.unk18C4[sp8][spC] > sEvoInfo.unk28C4[sp8][spC])
+ r3 += sEvoInfo.unk18C4[sp8][spC] - sEvoInfo.unk28C4[sp8][spC];
+ else
+ r3 += sEvoInfo.unk28C4[sp8][spC] - sEvoInfo.unk18C4[sp8][spC];
+
+ if (sp14 >= r3 && sEvoInfo.unkC4[sp8][r6] == 0 && sEvoInfo.unk8C4[sp8][r6] == 0)
+ {
+ sp10 = r6;
+ sp14 = r3;
+ }
+ }
+ //_08113F3E
+ sub_81141F0(spC, sp10, sp8);
+ }
+ //_08113F54
+
+ for (r6 = 0; r6 < sEvoInfo.unk44[sp8]; r6++)
+ {
+ if (sEvoInfo.unkC4[sp8][r6] == 0 && sEvoInfo.unk8C4[sp8][r6] == 0)
+ sub_811430C(r6, sp8);
+ }
+ }
+ //_08113F9E
+ if (sEvoInfo.unk4[sp8] == sEvoInfo.unk44[sp8])
+ {
+ for (r6 = 0; r6 < sEvoInfo.unk4[sp8]; r6++)
+ sub_81141F0(r6, r6, sp8);
+ }
+ //_08113FCC
+ if (sEvoInfo.unk4[sp8] > sEvoInfo.unk44[sp8])
+ {
+ for (sp10 = 0; sp10 < sEvoInfo.unk44[sp8]; sp10++)
+ {
+ sp14 = 0x100;
+
+ for (r6 = 0; r6 < sEvoInfo.unk4[sp8]; r6++)
+ {
+ s32 r3;
+
+ if (sEvoInfo.unk10C4[sp8][r6] > sEvoInfo.unk20C4[sp8][sp10])
+ r3 = sEvoInfo.unk10C4[sp8][r6] - sEvoInfo.unk20C4[sp8][sp10];
+ else
+ r3 = sEvoInfo.unk20C4[sp8][sp10] - sEvoInfo.unk10C4[sp8][r6];
+
+ if (sEvoInfo.unk18C4[sp8][r6] > sEvoInfo.unk28C4[sp8][sp10])
+ r3 += sEvoInfo.unk18C4[sp8][r6] - sEvoInfo.unk28C4[sp8][sp10];
+ else
+ r3 += sEvoInfo.unk28C4[sp8][sp10] - sEvoInfo.unk18C4[sp8][r6];
+
+ //r3 = abs(sEvoInfo.unk10C4[sp8][r6] - sEvoInfo.unk20C4[sp8][sp10]);
+ //r3 += abs(sEvoInfo.unk18C4[sp8][r6] - sEvoInfo.unk28C4[sp8][sp10]);
+
+ if (sp14 > r3 && sEvoInfo.unkC4[sp8][r6] == 0)
+ {
+ spC = r6;
+ sp14 = r3;
+ }
+ }
+ //_081140C4
+ sEvoInfo.unk30C4[sp8][spC] = sEvoInfo.unk20C4[sp8][sp10];
+ sEvoInfo.unk38C4[sp8][spC] = sEvoInfo.unk28C4[sp8][sp10];
+ sEvoInfo.unkC4[sp8][spC] = 1;
+ }
+ //_08114104
+ for (r6 = 0; r6 < sEvoInfo.unk4[sp8]; r6++)
+ {
+ sEvoInfo.unk20C4[sp8][r6] = sEvoInfo.unk30C4[sp8][r6];
+ sEvoInfo.unk28C4[sp8][r6] = sEvoInfo.unk38C4[sp8][r6];
+ if (sEvoInfo.unkC4[sp8][r6] != 0)
+ {
+ sEvoInfo.unkC4[sp8][r6] = 0;
+ sub_81141F0(r6, r6, sp8);
+ }
+ else
+ {
+ // Ugh, can't get this part right
+ //u8 *ptr1 = &sEvoInfo.unk10C4[sp8][r6];
+ //u8 *ptr2 = &sEvoInfo.unk18C4[sp8][r6];
+ //s32 r2 = *ptr1 + (*ptr2 - *ptr1) / 2;
+
+ //u8 r0_ = sEvoInfo.unk10C4[sp8][r6];
+ //u8 r2_ = sEvoInfo.unk18C4[sp8][r6];
+ //s32 r2 = (r0_ - r2_) / 2;
+
+ s32 r2 = (sEvoInfo.unk18C4[sp8][r6] - sEvoInfo.unk10C4[sp8][r6]);
+ s32 r2_ = sEvoInfo.unk10C4[sp8][r6];
+
+ sEvoInfo.unk20C4[sp8][r6] = sEvoInfo.unk28C4[sp8][r6] = r2_ + r2 / 2;
+ sEvoInfo.unk28C4[sp8][r6]++;
+ sub_81141F0(r6, r6, sp8);
+ }
+ }
+ }
+ //_081141C4
+ }
+#undef sp0
+#undef sp4
+}
+*/
+__attribute__((naked))
+void unref_sub_8113B50()
+{
+ 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, 0x3C\n\
+ str r0, [sp]\n\
+ str r1, [sp, 0x4]\n\
+ movs r0, 0\n\
+ str r0, [sp, 0xC]\n\
+ movs r1, 0\n\
+ str r1, [sp, 0x10]\n\
+ movs r2, 0\n\
+ str r2, [sp, 0x8]\n\
+ ldr r3, _08113C60 @ =gSharedMem + 0x14800\n\
+ mov r12, r3\n\
+ ldr r4, _08113C64 @ =0x000018c4\n\
+ add r4, r12\n\
+ mov r10, r4\n\
+ ldr r5, _08113C68 @ =0x000020c4\n\
+ add r5, r12\n\
+ mov r8, r5\n\
+_08113B7C:\n\
+ adds r0, r3, 0\n\
+ adds r0, 0x84\n\
+ ldr r1, [sp, 0x8]\n\
+ adds r0, r1, r0\n\
+ strb r2, [r0]\n\
+ adds r0, r3, 0x4\n\
+ adds r0, r1, r0\n\
+ strb r2, [r0]\n\
+ ldr r4, _08113C6C @ =gSharedMem + 0x14844\n\
+ adds r0, r1, r4\n\
+ strb r2, [r0]\n\
+ movs r6, 0\n\
+ lsls r1, 5\n\
+ mov r9, r1\n\
+ ldr r5, [sp, 0x8]\n\
+ lsls r4, r5, 6\n\
+_08113B9C:\n\
+ mov r0, r9\n\
+ adds r1, r6, r0\n\
+ ldr r5, _08113C70 @ =gSharedMem + 0x158C4\n\
+ adds r0, r1, r5\n\
+ strb r2, [r0]\n\
+ mov r5, r10\n\
+ adds r0, r1, r5\n\
+ strb r2, [r0]\n\
+ mov r5, r8\n\
+ adds r0, r1, r5\n\
+ strb r2, [r0]\n\
+ ldr r5, _08113C74 @ =gSharedMem + 0x170C4\n\
+ adds r0, r1, r5\n\
+ strb r2, [r0]\n\
+ adds r7, r3, 0\n\
+ adds r7, 0xC4\n\
+ adds r0, r1, r7\n\
+ strb r2, [r0]\n\
+ ldr r5, _08113C78 @ =0x000008c4\n\
+ adds r0, r3, r5\n\
+ adds r0, r1, r0\n\
+ strb r2, [r0]\n\
+ ldr r5, _08113C7C @ =0x000030c4\n\
+ adds r0, r3, r5\n\
+ adds r0, r1, r0\n\
+ strb r2, [r0]\n\
+ ldr r5, _08113C80 @ =0x000038c4\n\
+ adds r0, r3, r5\n\
+ adds r1, r0\n\
+ strb r2, [r1]\n\
+ lsls r1, r6, 1\n\
+ adds r1, r4\n\
+ ldr r5, _08113C84 @ =0x000060c4\n\
+ adds r0, r3, r5\n\
+ adds r0, r1, r0\n\
+ strh r2, [r0]\n\
+ ldr r5, _08113C88 @ =0x000070c4\n\
+ adds r0, r3, r5\n\
+ adds r0, r1, r0\n\
+ strh r2, [r0]\n\
+ ldr r5, _08113C8C @ =0x000080c4\n\
+ adds r0, r3, r5\n\
+ adds r0, r1, r0\n\
+ strh r2, [r0]\n\
+ ldr r5, _08113C90 @ =0x000090c4\n\
+ adds r0, r3, r5\n\
+ adds r1, r0\n\
+ strh r2, [r1]\n\
+ adds r6, 0x1\n\
+ cmp r6, 0x1F\n\
+ ble _08113B9C\n\
+ ldr r0, [sp, 0x8]\n\
+ adds r0, 0x1\n\
+ str r0, [sp, 0x8]\n\
+ cmp r0, 0x3F\n\
+ ble _08113B7C\n\
+ ldr r1, _08113C94 @ =0x0000a0c4\n\
+ add r1, r12\n\
+ movs r0, 0x40\n\
+ strb r0, [r1]\n\
+ movs r1, 0\n\
+ mov r8, r1\n\
+ movs r2, 0\n\
+ str r2, [sp, 0x8]\n\
+ movs r3, 0x80\n\
+ lsls r3, 5\n\
+ adds r3, r7\n\
+ mov r12, r3\n\
+ movs r4, 0xC0\n\
+ lsls r4, 5\n\
+ adds r4, r7\n\
+ mov r9, r4\n\
+ movs r5, 0\n\
+ adds r4, r7, 0\n\
+ subs r4, 0xC0\n\
+_08113C32:\n\
+ movs r3, 0\n\
+ ldr r2, [sp]\n\
+ add r2, r8\n\
+ movs r6, 0\n\
+ ldr r0, [sp, 0x8]\n\
+ adds r0, 0x1\n\
+ str r0, [sp, 0x30]\n\
+ ldr r1, [sp, 0x8]\n\
+ lsls r1, 7\n\
+ mov r10, r1\n\
+ movs r7, 0x1\n\
+ negs r7, r7\n\
+_08113C4A:\n\
+ asrs r0, r6, 1\n\
+ lsls r0, 2\n\
+ add r0, r10\n\
+ ldr r1, _08113C98 @ =gSharedMem + 0x188C4\n\
+ adds r0, r1\n\
+ str r2, [r0]\n\
+ cmp r3, 0\n\
+ beq _08113C9C\n\
+ cmp r3, 0x1\n\
+ beq _08113CC6\n\
+ b _08113CF4\n\
+ .align 2, 0\n\
+_08113C60: .4byte gSharedMem + 0x14800\n\
+_08113C64: .4byte 0x000018c4\n\
+_08113C68: .4byte 0x000020c4\n\
+_08113C6C: .4byte gSharedMem + 0x14844\n\
+_08113C70: .4byte gSharedMem + 0x158C4\n\
+_08113C74: .4byte gSharedMem + 0x170C4\n\
+_08113C78: .4byte 0x000008c4\n\
+_08113C7C: .4byte 0x000030c4\n\
+_08113C80: .4byte 0x000038c4\n\
+_08113C84: .4byte 0x000060c4\n\
+_08113C88: .4byte 0x000070c4\n\
+_08113C8C: .4byte 0x000080c4\n\
+_08113C90: .4byte 0x000090c4\n\
+_08113C94: .4byte 0x0000a0c4\n\
+_08113C98: .4byte gSharedMem + 0x188C4\n\
+_08113C9C:\n\
+ movs r0, 0x1\n\
+ ands r0, r6\n\
+ cmp r0, 0\n\
+ beq _08113CAA\n\
+ cmp r0, 0x1\n\
+ beq _08113CB0\n\
+ b _08113CF4\n\
+_08113CAA:\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0xF\n\
+ b _08113CB4\n\
+_08113CB0:\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0xF0\n\
+_08113CB4:\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08113CF4\n\
+ ldrb r0, [r4]\n\
+ adds r0, r5\n\
+ add r0, r12\n\
+ strb r6, [r0]\n\
+ movs r3, 0x1\n\
+ b _08113CF4\n\
+_08113CC6:\n\
+ adds r0, r6, 0\n\
+ ands r0, r3\n\
+ cmp r0, 0\n\
+ beq _08113CD4\n\
+ cmp r0, 0x1\n\
+ beq _08113CDA\n\
+ b _08113CF4\n\
+_08113CD4:\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0xF\n\
+ b _08113CDE\n\
+_08113CDA:\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0xF0\n\
+_08113CDE:\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _08113CF4\n\
+ ldrb r0, [r4]\n\
+ adds r0, r5\n\
+ add r0, r9\n\
+ strb r7, [r0]\n\
+ ldrb r0, [r4]\n\
+ adds r0, 0x1\n\
+ strb r0, [r4]\n\
+ movs r3, 0\n\
+_08113CF4:\n\
+ adds r0, r6, 0x1\n\
+ movs r1, 0x7\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _08113D02\n\
+ adds r2, 0x1D\n\
+ b _08113D0C\n\
+_08113D02:\n\
+ movs r0, 0x1\n\
+ ands r0, r6\n\
+ cmp r0, 0\n\
+ beq _08113D0C\n\
+ adds r2, 0x1\n\
+_08113D0C:\n\
+ adds r7, 0x1\n\
+ adds r6, 0x1\n\
+ cmp r6, 0x3F\n\
+ ble _08113C4A\n\
+ cmp r3, 0\n\
+ beq _08113D26\n\
+ ldrb r0, [r4]\n\
+ adds r0, r5\n\
+ add r0, r9\n\
+ strb r6, [r0]\n\
+ ldrb r0, [r4]\n\
+ adds r0, 0x1\n\
+ strb r0, [r4]\n\
+_08113D26:\n\
+ movs r0, 0x7\n\
+ ldr r2, [sp, 0x30]\n\
+ ands r2, r0\n\
+ cmp r2, 0\n\
+ bne _08113D36\n\
+ movs r3, 0xE4\n\
+ add r8, r3\n\
+ b _08113D3A\n\
+_08113D36:\n\
+ movs r0, 0x4\n\
+ add r8, r0\n\
+_08113D3A:\n\
+ adds r5, 0x20\n\
+ adds r4, 0x1\n\
+ ldr r1, [sp, 0x8]\n\
+ adds r1, 0x1\n\
+ str r1, [sp, 0x8]\n\
+ cmp r1, 0x3F\n\
+ bgt _08113D4A\n\
+ b _08113C32\n\
+_08113D4A:\n\
+ movs r2, 0\n\
+ mov r8, r2\n\
+ movs r3, 0\n\
+ str r3, [sp, 0x8]\n\
+ ldr r0, _08113D84 @ =gSharedMem + 0x14844\n\
+ movs r4, 0x82\n\
+ lsls r4, 6\n\
+ adds r4, r0\n\
+ mov r10, r4\n\
+ movs r5, 0xA2\n\
+ lsls r5, 6\n\
+ adds r7, r0, r5\n\
+ movs r5, 0\n\
+ adds r4, r0, 0\n\
+ movs r0, 0x1\n\
+ mov r9, r0\n\
+_08113D6A:\n\
+ movs r3, 0\n\
+ ldr r2, [sp, 0x4]\n\
+ add r2, r8\n\
+ movs r6, 0\n\
+ ldr r1, [sp, 0x8]\n\
+ adds r1, 0x1\n\
+ str r1, [sp, 0x30]\n\
+_08113D78:\n\
+ cmp r3, 0\n\
+ beq _08113D88\n\
+ cmp r3, 0x1\n\
+ beq _08113DB4\n\
+ b _08113DE4\n\
+ .align 2, 0\n\
+_08113D84: .4byte gSharedMem + 0x14844\n\
+_08113D88:\n\
+ adds r0, r6, 0\n\
+ mov r1, r9\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08113D98\n\
+ cmp r0, 0x1\n\
+ beq _08113D9E\n\
+ b _08113DE4\n\
+_08113D98:\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0xF\n\
+ b _08113DA2\n\
+_08113D9E:\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0xF0\n\
+_08113DA2:\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08113DE4\n\
+ ldrb r0, [r4]\n\
+ adds r0, r5\n\
+ add r0, r10\n\
+ strb r6, [r0]\n\
+ movs r3, 0x1\n\
+ b _08113DE4\n\
+_08113DB4:\n\
+ adds r0, r6, 0\n\
+ ands r0, r3\n\
+ cmp r0, 0\n\
+ beq _08113DC2\n\
+ cmp r0, 0x1\n\
+ beq _08113DC8\n\
+ b _08113DE4\n\
+_08113DC2:\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0xF\n\
+ b _08113DCC\n\
+_08113DC8:\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0xF0\n\
+_08113DCC:\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _08113DE4\n\
+ ldrb r0, [r4]\n\
+ adds r0, r5\n\
+ adds r0, r7\n\
+ subs r1, r6, 0x1\n\
+ strb r1, [r0]\n\
+ ldrb r0, [r4]\n\
+ adds r0, 0x1\n\
+ strb r0, [r4]\n\
+ movs r3, 0\n\
+_08113DE4:\n\
+ adds r1, r6, 0x1\n\
+ movs r0, 0x7\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _08113DF2\n\
+ adds r2, 0x1D\n\
+ b _08113DFC\n\
+_08113DF2:\n\
+ mov r0, r9\n\
+ ands r6, r0\n\
+ cmp r6, 0\n\
+ beq _08113DFC\n\
+ adds r2, 0x1\n\
+_08113DFC:\n\
+ adds r6, r1, 0\n\
+ cmp r6, 0x3F\n\
+ ble _08113D78\n\
+ cmp r3, 0\n\
+ beq _08113E14\n\
+ ldrb r0, [r4]\n\
+ adds r0, r5\n\
+ adds r0, r7\n\
+ strb r6, [r0]\n\
+ ldrb r0, [r4]\n\
+ adds r0, 0x1\n\
+ strb r0, [r4]\n\
+_08113E14:\n\
+ movs r0, 0x7\n\
+ ldr r1, [sp, 0x30]\n\
+ ands r1, r0\n\
+ cmp r1, 0\n\
+ bne _08113E24\n\
+ movs r2, 0xE4\n\
+ add r8, r2\n\
+ b _08113E28\n\
+_08113E24:\n\
+ movs r3, 0x4\n\
+ add r8, r3\n\
+_08113E28:\n\
+ adds r5, 0x20\n\
+ adds r4, 0x1\n\
+ ldr r0, [sp, 0x8]\n\
+ adds r0, 0x1\n\
+ str r0, [sp, 0x8]\n\
+ cmp r0, 0x3F\n\
+ ble _08113D6A\n\
+ movs r1, 0\n\
+ str r1, [sp, 0x8]\n\
+_08113E3A:\n\
+ ldr r3, [sp, 0x8]\n\
+ ldr r4, _08113EBC @ =gSharedMem + 0x14804\n\
+ adds r2, r3, r4\n\
+ ldr r5, _08113EC0 @ =gSharedMem + 0x14844\n\
+ adds r1, r3, r5\n\
+ ldrb r0, [r2]\n\
+ adds r3, 0x1\n\
+ str r3, [sp, 0x30]\n\
+ ldrb r1, [r1]\n\
+ cmp r0, r1\n\
+ bcc _08113E52\n\
+ b _08113F9E\n\
+_08113E52:\n\
+ movs r0, 0\n\
+ str r0, [sp, 0xC]\n\
+ ldrb r2, [r2]\n\
+ cmp r0, r2\n\
+ bge _08113F54\n\
+ ldr r0, _08113EC4 @ =gSharedMem + 0x14800\n\
+ adds r0, 0x4\n\
+ ldr r1, [sp, 0x8]\n\
+ adds r0, r1, r0\n\
+ str r0, [sp, 0x18]\n\
+_08113E66:\n\
+ movs r2, 0x80\n\
+ lsls r2, 1\n\
+ str r2, [sp, 0x14]\n\
+ movs r6, 0\n\
+ ldr r3, [sp, 0x8]\n\
+ ldr r4, _08113EC0 @ =gSharedMem + 0x14844\n\
+ adds r0, r3, r4\n\
+ ldr r5, [sp, 0xC]\n\
+ adds r5, 0x1\n\
+ str r5, [sp, 0x34]\n\
+ ldrb r0, [r0]\n\
+ cmp r6, r0\n\
+ bge _08113F3E\n\
+ ldr r0, _08113EC4 @ =gSharedMem + 0x14800\n\
+ mov r10, r0\n\
+ lsls r0, r3, 5\n\
+ ldr r2, [sp, 0xC]\n\
+ adds r1, r2, r0\n\
+ mov r9, r0\n\
+ ldr r0, _08113EC4 @ =gSharedMem + 0x14800\n\
+ adds r0, 0xC4\n\
+ mov r3, r9\n\
+ adds r7, r3, r0\n\
+ mov r5, r9\n\
+ ldr r4, _08113EC4 @ =gSharedMem + 0x14800\n\
+ ldr r2, _08113EC8 @ =0x000010c4\n\
+ adds r0, r4, r2\n\
+ adds r1, r0\n\
+ mov r8, r1\n\
+ ldrb r3, [r1]\n\
+ str r3, [sp, 0x1C]\n\
+_08113EA4:\n\
+ ldr r0, _08113ECC @ =0x000020c4\n\
+ add r0, r10\n\
+ adds r0, r5, r0\n\
+ ldr r4, [sp, 0x1C]\n\
+ ldrb r1, [r0]\n\
+ cmp r4, r1\n\
+ bls _08113ED0\n\
+ mov r2, r8\n\
+ ldrb r1, [r2]\n\
+ ldrb r0, [r0]\n\
+ b _08113ED6\n\
+ .align 2, 0\n\
+_08113EBC: .4byte gSharedMem + 0x14804\n\
+_08113EC0: .4byte gSharedMem + 0x14844\n\
+_08113EC4: .4byte gSharedMem + 0x14800\n\
+_08113EC8: .4byte 0x000010c4\n\
+_08113ECC: .4byte 0x000020c4\n\
+_08113ED0:\n\
+ ldrb r1, [r0]\n\
+ mov r3, r8\n\
+ ldrb r0, [r3]\n\
+_08113ED6:\n\
+ subs r3, r1, r0\n\
+ ldr r1, [sp, 0xC]\n\
+ add r1, r9\n\
+ ldr r0, _08113EFC @ =0x000018c4\n\
+ add r0, r10\n\
+ adds r4, r1, r0\n\
+ ldr r0, _08113F00 @ =0x000028c4\n\
+ add r0, r10\n\
+ adds r2, r5, r0\n\
+ ldrb r0, [r4]\n\
+ ldr r1, _08113F04 @ =gSharedMem + 0x14800\n\
+ mov r12, r1\n\
+ ldrb r1, [r2]\n\
+ cmp r0, r1\n\
+ bls _08113F08\n\
+ adds r1, r0, 0\n\
+ ldrb r0, [r2]\n\
+ b _08113F0C\n\
+ .align 2, 0\n\
+_08113EFC: .4byte 0x000018c4\n\
+_08113F00: .4byte 0x000028c4\n\
+_08113F04: .4byte gSharedMem + 0x14800\n\
+_08113F08:\n\
+ ldrb r1, [r2]\n\
+ ldrb r0, [r4]\n\
+_08113F0C:\n\
+ subs r1, r0\n\
+ adds r3, r1\n\
+ ldr r2, [sp, 0x14]\n\
+ cmp r2, r3\n\
+ ble _08113F2C\n\
+ ldrb r0, [r7]\n\
+ cmp r0, 0\n\
+ bne _08113F2C\n\
+ ldr r0, _08114050 @ =0x000008c4\n\
+ add r0, r12\n\
+ adds r0, r5, r0\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _08113F2C\n\
+ str r6, [sp, 0x10]\n\
+ str r3, [sp, 0x14]\n\
+_08113F2C:\n\
+ adds r7, 0x1\n\
+ adds r5, 0x1\n\
+ adds r6, 0x1\n\
+ ldr r3, [sp, 0x8]\n\
+ ldr r4, _08114054 @ =gSharedMem + 0x14844\n\
+ adds r0, r3, r4\n\
+ ldrb r0, [r0]\n\
+ cmp r6, r0\n\
+ blt _08113EA4\n\
+_08113F3E:\n\
+ ldr r0, [sp, 0xC]\n\
+ ldr r1, [sp, 0x10]\n\
+ ldr r2, [sp, 0x8]\n\
+ bl sub_81141F0\n\
+ ldr r5, [sp, 0x34]\n\
+ str r5, [sp, 0xC]\n\
+ ldr r0, [sp, 0x18]\n\
+ ldrb r0, [r0]\n\
+ cmp r5, r0\n\
+ blt _08113E66\n\
+_08113F54:\n\
+ movs r6, 0\n\
+ ldr r2, _08114058 @ =gSharedMem + 0x14800\n\
+ ldr r1, [sp, 0x8]\n\
+ ldr r3, _08114054 @ =gSharedMem + 0x14844\n\
+ adds r0, r1, r3\n\
+ adds r4, r2, 0\n\
+ mov r12, r4\n\
+ ldrb r0, [r0]\n\
+ cmp r6, r0\n\
+ bge _08113F9E\n\
+ mov r0, r12\n\
+ adds r0, 0x44\n\
+ adds r4, r1, r0\n\
+_08113F6E:\n\
+ ldr r5, [sp, 0x8]\n\
+ lsls r0, r5, 5\n\
+ adds r1, r6, r0\n\
+ adds r0, r2, 0\n\
+ adds r0, 0xC4\n\
+ adds r0, r1, r0\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _08113F94\n\
+ ldr r3, _08114050 @ =0x000008c4\n\
+ adds r0, r2, r3\n\
+ adds r0, r1, r0\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _08113F94\n\
+ adds r0, r6, 0\n\
+ adds r1, r5, 0\n\
+ bl sub_811430C\n\
+_08113F94:\n\
+ adds r6, 0x1\n\
+ ldr r2, _08114058 @ =gSharedMem + 0x14800\n\
+ ldrb r5, [r4]\n\
+ cmp r6, r5\n\
+ blt _08113F6E\n\
+_08113F9E:\n\
+ ldr r0, [sp, 0x8]\n\
+ ldr r1, _0811405C @ =gSharedMem + 0x14804\n\
+ adds r2, r0, r1\n\
+ ldr r3, _08114054 @ =gSharedMem + 0x14844\n\
+ adds r1, r0, r3\n\
+ ldrb r0, [r2]\n\
+ ldrb r1, [r1]\n\
+ cmp r0, r1\n\
+ bne _08113FCC\n\
+ movs r6, 0\n\
+ ldrb r4, [r2]\n\
+ cmp r6, r4\n\
+ bge _08113FCC\n\
+ adds r4, r2, 0\n\
+_08113FBA:\n\
+ adds r0, r6, 0\n\
+ adds r1, r6, 0\n\
+ ldr r2, [sp, 0x8]\n\
+ bl sub_81141F0\n\
+ adds r6, 0x1\n\
+ ldrb r5, [r4]\n\
+ cmp r6, r5\n\
+ blt _08113FBA\n\
+_08113FCC:\n\
+ ldr r0, [sp, 0x8]\n\
+ ldr r1, _0811405C @ =gSharedMem + 0x14804\n\
+ adds r2, r0, r1\n\
+ ldr r3, _08114054 @ =gSharedMem + 0x14844\n\
+ adds r1, r0, r3\n\
+ ldrb r0, [r2]\n\
+ ldr r4, _08114058 @ =gSharedMem + 0x14800\n\
+ ldrb r5, [r1]\n\
+ cmp r0, r5\n\
+ bhi _08113FE2\n\
+ b _081141C4\n\
+_08113FE2:\n\
+ movs r0, 0\n\
+ str r0, [sp, 0x10]\n\
+ ldrb r1, [r1]\n\
+ cmp r0, r1\n\
+ blt _08113FEE\n\
+ b _08114104\n\
+_08113FEE:\n\
+ str r2, [sp, 0x2C]\n\
+ ldr r1, [sp, 0x8]\n\
+ lsls r1, 5\n\
+ mov r9, r1\n\
+ adds r0, r4, 0\n\
+ adds r0, 0x44\n\
+ ldr r2, [sp, 0x8]\n\
+ adds r0, r2, r0\n\
+ str r0, [sp, 0x20]\n\
+ mov r3, r9\n\
+ str r3, [sp, 0x24]\n\
+_08114004:\n\
+ movs r4, 0x80\n\
+ lsls r4, 1\n\
+ str r4, [sp, 0x14]\n\
+ movs r6, 0\n\
+ ldr r5, [sp, 0x10]\n\
+ adds r5, 0x1\n\
+ str r5, [sp, 0x38]\n\
+ ldr r0, [sp, 0x2C]\n\
+ ldrb r0, [r0]\n\
+ cmp r6, r0\n\
+ bge _081140C4\n\
+ ldr r1, [sp, 0x10]\n\
+ ldr r2, [sp, 0x24]\n\
+ adds r1, r2\n\
+ mov r10, r1\n\
+ ldr r0, _08114058 @ =gSharedMem + 0x14800\n\
+ adds r0, 0xC4\n\
+ adds r2, r0\n\
+ mov r8, r2\n\
+ ldr r7, [sp, 0x24]\n\
+ ldr r3, _08114058 @ =gSharedMem + 0x14800\n\
+ ldr r4, _08114060 @ =0x000010c4\n\
+ adds r0, r3, r4\n\
+ adds r5, r7, r0\n\
+ ldr r0, _08114064 @ =gSharedMem + 0x168C4\n\
+ add r0, r10\n\
+ mov r12, r0\n\
+ ldrb r1, [r0]\n\
+ str r1, [sp, 0x28]\n\
+_0811403E:\n\
+ ldrb r0, [r5]\n\
+ ldr r2, [sp, 0x28]\n\
+ cmp r0, r2\n\
+ bls _08114068\n\
+ adds r1, r0, 0\n\
+ mov r3, r12\n\
+ ldrb r0, [r3]\n\
+ b _0811406E\n\
+ .align 2, 0\n\
+_08114050: .4byte 0x000008c4\n\
+_08114054: .4byte gSharedMem + 0x14844\n\
+_08114058: .4byte gSharedMem + 0x14800\n\
+_0811405C: .4byte gSharedMem + 0x14804\n\
+_08114060: .4byte 0x000010c4\n\
+_08114064: .4byte gSharedMem + 0x168C4\n\
+_08114068:\n\
+ mov r4, r12\n\
+ ldrb r1, [r4]\n\
+ ldrb r0, [r5]\n\
+_0811406E:\n\
+ subs r3, r1, r0\n\
+ ldr r1, _0811408C @ =gSharedMem + 0x14800\n\
+ ldr r2, _08114090 @ =0x000018c4\n\
+ adds r0, r1, r2\n\
+ adds r4, r7, r0\n\
+ ldr r2, _08114094 @ =gSharedMem + 0x170C4\n\
+ add r2, r10\n\
+ ldrb r0, [r4]\n\
+ ldrb r1, [r2]\n\
+ cmp r0, r1\n\
+ bls _08114098\n\
+ adds r1, r0, 0\n\
+ ldrb r0, [r2]\n\
+ b _0811409C\n\
+ .align 2, 0\n\
+_0811408C: .4byte gSharedMem + 0x14800\n\
+_08114090: .4byte 0x000018c4\n\
+_08114094: .4byte gSharedMem + 0x170C4\n\
+_08114098:\n\
+ ldrb r1, [r2]\n\
+ ldrb r0, [r4]\n\
+_0811409C:\n\
+ subs r1, r0\n\
+ adds r3, r1\n\
+ ldr r2, [sp, 0x14]\n\
+ cmp r2, r3\n\
+ ble _081140B2\n\
+ mov r4, r8\n\
+ ldrb r0, [r4]\n\
+ cmp r0, 0\n\
+ bne _081140B2\n\
+ str r6, [sp, 0xC]\n\
+ str r3, [sp, 0x14]\n\
+_081140B2:\n\
+ movs r0, 0x1\n\
+ add r8, r0\n\
+ adds r7, 0x1\n\
+ adds r5, 0x1\n\
+ adds r6, 0x1\n\
+ ldr r1, [sp, 0x2C]\n\
+ ldrb r1, [r1]\n\
+ cmp r6, r1\n\
+ blt _0811403E\n\
+_081140C4:\n\
+ ldr r3, [sp, 0xC]\n\
+ add r3, r9\n\
+ ldr r2, _08114164 @ =gSharedMem + 0x14800\n\
+ ldr r4, _08114168 @ =0x000030c4\n\
+ adds r1, r2, r4\n\
+ adds r1, r3, r1\n\
+ ldr r2, [sp, 0x10]\n\
+ add r2, r9\n\
+ ldr r5, _0811416C @ =gSharedMem + 0x168C4\n\
+ adds r0, r2, r5\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r1]\n\
+ ldr r0, _08114164 @ =gSharedMem + 0x14800\n\
+ ldr r4, _08114170 @ =0x000038c4\n\
+ adds r1, r0, r4\n\
+ adds r1, r3, r1\n\
+ ldr r5, _08114174 @ =gSharedMem + 0x170C4\n\
+ adds r2, r5\n\
+ ldrb r0, [r2]\n\
+ strb r0, [r1]\n\
+ ldr r0, _08114164 @ =gSharedMem + 0x14800\n\
+ adds r0, 0xC4\n\
+ adds r3, r0\n\
+ movs r0, 0x1\n\
+ strb r0, [r3]\n\
+ ldr r0, [sp, 0x38]\n\
+ str r0, [sp, 0x10]\n\
+ ldr r1, [sp, 0x20]\n\
+ ldrb r1, [r1]\n\
+ cmp r0, r1\n\
+ bge _08114104\n\
+ b _08114004\n\
+_08114104:\n\
+ movs r6, 0\n\
+ ldr r4, _08114164 @ =gSharedMem + 0x14800\n\
+ ldr r2, [sp, 0x8]\n\
+ ldr r3, _08114178 @ =gSharedMem + 0x14804\n\
+ adds r0, r2, r3\n\
+ ldrb r0, [r0]\n\
+ cmp r6, r0\n\
+ bge _081141C4\n\
+ adds r7, r4, 0\n\
+ mov r9, r6\n\
+ movs r5, 0xC4\n\
+ adds r5, r7\n\
+ mov r8, r5\n\
+_0811411E:\n\
+ ldr r1, [sp, 0x8]\n\
+ lsls r0, r1, 5\n\
+ adds r2, r6, r0\n\
+ ldr r3, _0811417C @ =0x000020c4\n\
+ adds r0, r7, r3\n\
+ adds r0, r2\n\
+ mov r10, r0\n\
+ ldr r5, _08114168 @ =0x000030c4\n\
+ adds r0, r7, r5\n\
+ adds r0, r2, r0\n\
+ ldrb r0, [r0]\n\
+ mov r1, r10\n\
+ strb r0, [r1]\n\
+ ldr r3, _08114180 @ =0x000028c4\n\
+ adds r0, r7, r3\n\
+ adds r3, r2, r0\n\
+ ldr r5, _08114170 @ =0x000038c4\n\
+ adds r0, r7, r5\n\
+ adds r0, r2, r0\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r3]\n\
+ mov r0, r8\n\
+ adds r1, r2, r0\n\
+ ldrb r0, [r1]\n\
+ cmp r0, 0\n\
+ beq _08114184\n\
+ mov r2, r9\n\
+ strb r2, [r1]\n\
+ adds r0, r6, 0\n\
+ adds r1, r6, 0\n\
+ ldr r2, [sp, 0x8]\n\
+ bl sub_81141F0\n\
+ b _081141B4\n\
+ .align 2, 0\n\
+_08114164: .4byte gSharedMem + 0x14800\n\
+_08114168: .4byte 0x000030c4\n\
+_0811416C: .4byte gSharedMem + 0x168C4\n\
+_08114170: .4byte 0x000038c4\n\
+_08114174: .4byte gSharedMem + 0x170C4\n\
+_08114178: .4byte gSharedMem + 0x14804\n\
+_0811417C: .4byte 0x000020c4\n\
+_08114180: .4byte 0x000028c4\n\
+_08114184:\n\
+ ldr r5, _081141E0 @ =0x000010c4\n\
+ adds r1, r4, r5\n\
+ adds r1, r2, r1\n\
+ ldr r5, _081141E4 @ =0x000018c4\n\
+ adds r0, r4, r5\n\
+ adds r0, r2, r0\n\
+ ldrb r0, [r0]\n\
+ ldrb r2, [r1]\n\
+ subs r0, r2\n\
+ lsrs r1, r0, 31\n\
+ adds r0, r1\n\
+ asrs r0, 1\n\
+ adds r2, r0\n\
+ strb r2, [r3]\n\
+ mov r0, r10\n\
+ strb r2, [r0]\n\
+ ldrb r0, [r3]\n\
+ subs r0, 0x1\n\
+ strb r0, [r3]\n\
+ adds r0, r6, 0\n\
+ adds r1, r6, 0\n\
+ ldr r2, [sp, 0x8]\n\
+ bl sub_81141F0\n\
+_081141B4:\n\
+ adds r6, 0x1\n\
+ ldr r4, _081141E8 @ =gSharedMem + 0x14800\n\
+ ldr r1, [sp, 0x8]\n\
+ ldr r2, _081141EC @ =gSharedMem + 0x14804\n\
+ adds r0, r1, r2\n\
+ ldrb r0, [r0]\n\
+ cmp r6, r0\n\
+ blt _0811411E\n\
+_081141C4:\n\
+ ldr r3, [sp, 0x30]\n\
+ str r3, [sp, 0x8]\n\
+ cmp r3, 0x3F\n\
+ bgt _081141CE\n\
+ b _08113E3A\n\
+_081141CE:\n\
+ add sp, 0x3C\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\
+_081141E0: .4byte 0x000010c4\n\
+_081141E4: .4byte 0x000018c4\n\
+_081141E8: .4byte gSharedMem + 0x14800\n\
+_081141EC: .4byte gSharedMem + 0x14804\n\
+ .syntax divided");
+}
+
+void sub_81141F0(s32 a, s32 b, s32 c)
+{
+ u32 r7;
+
+ sEvoInfo.unk30C4[c][b] = sEvoInfo.unk10C4[c][a];
+ sEvoInfo.unk38C4[c][b] = sEvoInfo.unk18C4[c][a];
+
+ r7 = 0;
+ if (sEvoInfo.unk10C4[c][a] < sEvoInfo.unk20C4[c][b])
+ {
+ sEvoInfo.unkC4[c][b] = 4;
+ r7 = sEvoInfo.unk20C4[c][b] - sEvoInfo.unk10C4[c][a];
+ }
+ else if (sEvoInfo.unk10C4[c][a] > sEvoInfo.unk20C4[c][b])
+ {
+ sEvoInfo.unkC4[c][b] = 1;
+ r7 = sEvoInfo.unk10C4[c][a] - sEvoInfo.unk20C4[c][b];
+ }
+ sEvoInfo.unk80C4[c][b] = r7 * 16;
+
+ r7 = 0;
+ if (sEvoInfo.unk18C4[c][a] < sEvoInfo.unk28C4[c][b])
+ {
+ sEvoInfo.unk8C4[c][b] = 3;
+ r7 = sEvoInfo.unk28C4[c][b] - sEvoInfo.unk18C4[c][a];
+ }
+ else if (sEvoInfo.unk18C4[c][a] > sEvoInfo.unk28C4[c][b])
+ {
+ sEvoInfo.unk8C4[c][b] = 2;
+ r7 = sEvoInfo.unk18C4[c][a] - sEvoInfo.unk28C4[c][b];
+ }
+ sEvoInfo.unk90C4[c][b] = r7 * 16;
+
+ sEvoInfo.unk84[c]++;
+}
+
+void sub_811430C(u32 a, u32 b)
+{
+ u8 r2 = sEvoInfo.unk28C4[b][a];
+ u8 r3 = sEvoInfo.unk20C4[b][a];
+ s32 r7 = r2 - r3;
+
+ sEvoInfo.unk30C4[b][a] = sEvoInfo.unk38C4[b][a] = r3 + r7 / 2;
+ sEvoInfo.unkC4[b][a] = 5;
+ sEvoInfo.unk8C4[b][a] = 7;
+ sEvoInfo.unk84[b]++;
+ r7 = sEvoInfo.unk30C4[b][a] - sEvoInfo.unk20C4[b][a];
+ sEvoInfo.unk80C4[b][a] = r7 * 16;
+ r7 = sEvoInfo.unk28C4[b][a] - sEvoInfo.unk38C4[b][a];
+ sEvoInfo.unk90C4[b][a] = r7 * 16;
+}
+
+__attribute__((naked))
+void unref_sub_81143CC()
+{
+ 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\
+ movs r0, 0x1\n\
+ str r0, [sp, 0x4]\n\
+ ldr r0, _08114408 @ =gSharedMem + 0x14800\n\
+ ldr r2, _0811440C @ =0x0000a0c4\n\
+ adds r1, r0, r2\n\
+ ldrb r3, [r1]\n\
+ adds r4, r0, 0\n\
+ cmp r3, 0\n\
+ beq _081143EE\n\
+ subs r0, r3, 0x1\n\
+ strb r0, [r1]\n\
+_081143EE:\n\
+ movs r5, 0\n\
+ str r5, [sp]\n\
+_081143F2:\n\
+ movs r3, 0\n\
+ adds r2, r4, 0\n\
+ adds r0, r4, 0\n\
+ adds r0, 0x84\n\
+ ldr r1, [sp]\n\
+ adds r0, r1, r0\n\
+ adds r1, 0x1\n\
+ str r1, [sp, 0x8]\n\
+ bl _08114D84\n\
+ .align 2, 0\n\
+_08114408: .4byte gSharedMem + 0x14800\n\
+_0811440C: .4byte 0x0000a0c4\n\
+_08114410:\n\
+ ldr r5, [sp]\n\
+ lsls r0, r5, 5\n\
+ adds r1, r3, r0\n\
+ adds r2, 0xC4\n\
+ adds r1, r2\n\
+ ldrb r2, [r1]\n\
+ mov r8, r0\n\
+ adds r0, r3, 0x1\n\
+ mov r10, r0\n\
+ cmp r2, 0xC\n\
+ bls _08114428\n\
+ b _081148D2\n\
+_08114428:\n\
+ lsls r0, r2, 2\n\
+ ldr r1, _08114434 @ =_08114438\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .align 2, 0\n\
+_08114434: .4byte _08114438\n\
+ .align 2, 0\n\
+_08114438:\n\
+ .4byte _081148D2\n\
+ .4byte _0811446C\n\
+ .4byte _081144F0\n\
+ .4byte _0811457C\n\
+ .4byte _08114600\n\
+ .4byte _0811468C\n\
+ .4byte _081146C8\n\
+ .4byte _08114704\n\
+ .4byte _08114740\n\
+ .4byte _0811477C\n\
+ .4byte _081147D0\n\
+ .4byte _08114810\n\
+ .4byte _08114858\n\
+_0811446C:\n\
+ movs r1, 0\n\
+ str r1, [sp, 0x4]\n\
+ lsls r0, r3, 1\n\
+ ldr r2, [sp]\n\
+ lsls r1, r2, 6\n\
+ adds r0, r1\n\
+ ldr r5, _081144E0 @ =0x000060c4\n\
+ adds r2, r4, r5\n\
+ adds r2, r0, r2\n\
+ ldr r5, _081144E4 @ =0x000080c4\n\
+ adds r1, r4, r5\n\
+ adds r0, r1\n\
+ ldrh r1, [r0]\n\
+ ldrh r0, [r2]\n\
+ adds r1, r0\n\
+ movs r0, 0xFF\n\
+ lsls r0, 8\n\
+ ands r0, r1\n\
+ lsrs r5, r0, 8\n\
+ movs r0, 0xFF\n\
+ ands r1, r0\n\
+ strh r1, [r2]\n\
+ movs r6, 0\n\
+ adds r1, r3, 0x1\n\
+ mov r10, r1\n\
+ ldr r2, [sp, 0x4]\n\
+ cmp r2, r5\n\
+ blt _081144A6\n\
+ b _081148D2\n\
+_081144A6:\n\
+ mov r9, r4\n\
+ mov r4, r8\n\
+ adds r7, r3, r4\n\
+ ldr r0, _081144E8 @ =0x000030c4\n\
+ add r0, r9\n\
+ adds r4, r7, r0\n\
+ ldr r0, _081144EC @ =0x000020c4\n\
+ add r0, r9\n\
+ adds r2, r7, r0\n\
+_081144B8:\n\
+ ldrb r0, [r4]\n\
+ subs r0, 0x1\n\
+ strb r0, [r4]\n\
+ ldrb r1, [r4]\n\
+ ldr r0, [sp]\n\
+ str r2, [sp, 0xC]\n\
+ str r3, [sp, 0x10]\n\
+ bl sub_8114DB4\n\
+ ldrb r0, [r4]\n\
+ ldr r2, [sp, 0xC]\n\
+ ldr r3, [sp, 0x10]\n\
+ ldrb r1, [r2]\n\
+ cmp r0, r1\n\
+ bne _081144D8\n\
+ b _081148A0\n\
+_081144D8:\n\
+ adds r6, 0x1\n\
+ cmp r6, r5\n\
+ blt _081144B8\n\
+ b _081148D2\n\
+ .align 2, 0\n\
+_081144E0: .4byte 0x000060c4\n\
+_081144E4: .4byte 0x000080c4\n\
+_081144E8: .4byte 0x000030c4\n\
+_081144EC: .4byte 0x000020c4\n\
+_081144F0:\n\
+ movs r2, 0\n\
+ str r2, [sp, 0x4]\n\
+ ldr r4, _08114568 @ =gSharedMem + 0x14800\n\
+ lsls r0, r3, 1\n\
+ ldr r5, [sp]\n\
+ lsls r1, r5, 6\n\
+ adds r0, r1\n\
+ ldr r1, _0811456C @ =0x000060c4\n\
+ adds r2, r4, r1\n\
+ adds r2, r0, r2\n\
+ ldr r5, _08114570 @ =0x000080c4\n\
+ adds r1, r4, r5\n\
+ adds r0, r1\n\
+ ldrh r1, [r0]\n\
+ ldrh r0, [r2]\n\
+ adds r1, r0\n\
+ movs r0, 0xFF\n\
+ lsls r0, 8\n\
+ ands r0, r1\n\
+ lsrs r5, r0, 8\n\
+ movs r0, 0xFF\n\
+ ands r1, r0\n\
+ strh r1, [r2]\n\
+ movs r6, 0\n\
+ adds r1, r3, 0x1\n\
+ mov r10, r1\n\
+ ldr r2, [sp, 0x4]\n\
+ cmp r2, r5\n\
+ blt _0811452C\n\
+ b _081148D2\n\
+_0811452C:\n\
+ mov r9, r4\n\
+ mov r4, r8\n\
+ adds r7, r3, r4\n\
+ ldr r0, _08114574 @ =0x000030c4\n\
+ add r0, r9\n\
+ adds r4, r7, r0\n\
+ ldr r0, _08114578 @ =0x000020c4\n\
+ add r0, r9\n\
+ adds r2, r7, r0\n\
+_0811453E:\n\
+ ldrb r0, [r4]\n\
+ ldrb r1, [r2]\n\
+ cmp r0, r1\n\
+ bne _08114548\n\
+ b _081148B8\n\
+_08114548:\n\
+ adds r1, r0, 0\n\
+ ldr r0, [sp]\n\
+ str r2, [sp, 0xC]\n\
+ str r3, [sp, 0x10]\n\
+ bl sub_8114DF0\n\
+ ldrb r0, [r4]\n\
+ subs r0, 0x1\n\
+ strb r0, [r4]\n\
+ adds r6, 0x1\n\
+ ldr r2, [sp, 0xC]\n\
+ ldr r3, [sp, 0x10]\n\
+ cmp r6, r5\n\
+ blt _0811453E\n\
+ b _081148D2\n\
+ .align 2, 0\n\
+_08114568: .4byte gSharedMem + 0x14800\n\
+_0811456C: .4byte 0x000060c4\n\
+_08114570: .4byte 0x000080c4\n\
+_08114574: .4byte 0x000030c4\n\
+_08114578: .4byte 0x000020c4\n\
+_0811457C:\n\
+ movs r2, 0\n\
+ str r2, [sp, 0x4]\n\
+ lsls r0, r3, 1\n\
+ ldr r5, [sp]\n\
+ lsls r1, r5, 6\n\
+ adds r0, r1\n\
+ ldr r1, _081145F0 @ =0x000060c4\n\
+ adds r2, r4, r1\n\
+ adds r2, r0, r2\n\
+ ldr r5, _081145F4 @ =0x000080c4\n\
+ adds r1, r4, r5\n\
+ adds r0, r1\n\
+ ldrh r1, [r0]\n\
+ ldrh r0, [r2]\n\
+ adds r1, r0\n\
+ movs r0, 0xFF\n\
+ lsls r0, 8\n\
+ ands r0, r1\n\
+ lsrs r5, r0, 8\n\
+ movs r0, 0xFF\n\
+ ands r1, r0\n\
+ strh r1, [r2]\n\
+ movs r6, 0\n\
+ adds r1, r3, 0x1\n\
+ mov r10, r1\n\
+ ldr r2, [sp, 0x4]\n\
+ cmp r2, r5\n\
+ blt _081145B6\n\
+ b _081148D2\n\
+_081145B6:\n\
+ mov r9, r4\n\
+ mov r4, r8\n\
+ adds r7, r3, r4\n\
+ ldr r0, _081145F8 @ =0x000030c4\n\
+ add r0, r9\n\
+ adds r4, r7, r0\n\
+ ldr r0, _081145FC @ =0x000020c4\n\
+ add r0, r9\n\
+ adds r2, r7, r0\n\
+_081145C8:\n\
+ ldrb r0, [r4]\n\
+ adds r0, 0x1\n\
+ strb r0, [r4]\n\
+ ldrb r1, [r4]\n\
+ ldr r0, [sp]\n\
+ str r2, [sp, 0xC]\n\
+ str r3, [sp, 0x10]\n\
+ bl sub_8114DB4\n\
+ ldrb r0, [r4]\n\
+ ldr r2, [sp, 0xC]\n\
+ ldr r3, [sp, 0x10]\n\
+ ldrb r1, [r2]\n\
+ cmp r0, r1\n\
+ bne _081145E8\n\
+ b _081148AC\n\
+_081145E8:\n\
+ adds r6, 0x1\n\
+ cmp r6, r5\n\
+ blt _081145C8\n\
+ b _081148D2\n\
+ .align 2, 0\n\
+_081145F0: .4byte 0x000060c4\n\
+_081145F4: .4byte 0x000080c4\n\
+_081145F8: .4byte 0x000030c4\n\
+_081145FC: .4byte 0x000020c4\n\
+_08114600:\n\
+ movs r2, 0\n\
+ str r2, [sp, 0x4]\n\
+ ldr r4, _08114678 @ =gSharedMem + 0x14800\n\
+ lsls r0, r3, 1\n\
+ ldr r5, [sp]\n\
+ lsls r1, r5, 6\n\
+ adds r0, r1\n\
+ ldr r1, _0811467C @ =0x000060c4\n\
+ adds r2, r4, r1\n\
+ adds r2, r0, r2\n\
+ ldr r5, _08114680 @ =0x000080c4\n\
+ adds r1, r4, r5\n\
+ adds r0, r1\n\
+ ldrh r1, [r0]\n\
+ ldrh r0, [r2]\n\
+ adds r1, r0\n\
+ movs r0, 0xFF\n\
+ lsls r0, 8\n\
+ ands r0, r1\n\
+ lsrs r5, r0, 8\n\
+ movs r0, 0xFF\n\
+ ands r1, r0\n\
+ strh r1, [r2]\n\
+ movs r6, 0\n\
+ adds r1, r3, 0x1\n\
+ mov r10, r1\n\
+ ldr r2, [sp, 0x4]\n\
+ cmp r2, r5\n\
+ blt _0811463C\n\
+ b _081148D2\n\
+_0811463C:\n\
+ mov r9, r4\n\
+ mov r4, r8\n\
+ adds r7, r3, r4\n\
+ ldr r0, _08114684 @ =0x000030c4\n\
+ add r0, r9\n\
+ adds r4, r7, r0\n\
+ ldr r0, _08114688 @ =0x000020c4\n\
+ add r0, r9\n\
+ adds r2, r7, r0\n\
+_0811464E:\n\
+ ldrb r0, [r4]\n\
+ ldrb r1, [r2]\n\
+ cmp r0, r1\n\
+ bne _08114658\n\
+ b _081148B8\n\
+_08114658:\n\
+ adds r1, r0, 0\n\
+ ldr r0, [sp]\n\
+ str r2, [sp, 0xC]\n\
+ str r3, [sp, 0x10]\n\
+ bl sub_8114DF0\n\
+ ldrb r0, [r4]\n\
+ adds r0, 0x1\n\
+ strb r0, [r4]\n\
+ adds r6, 0x1\n\
+ ldr r2, [sp, 0xC]\n\
+ ldr r3, [sp, 0x10]\n\
+ cmp r6, r5\n\
+ blt _0811464E\n\
+ b _081148D2\n\
+ .align 2, 0\n\
+_08114678: .4byte gSharedMem + 0x14800\n\
+_0811467C: .4byte 0x000060c4\n\
+_08114680: .4byte 0x000080c4\n\
+_08114684: .4byte 0x000030c4\n\
+_08114688: .4byte 0x000020c4\n\
+_0811468C:\n\
+ movs r2, 0\n\
+ str r2, [sp, 0x4]\n\
+ ldr r5, _081146C0 @ =gSharedMem + 0x14800\n\
+ mov r0, r8\n\
+ adds r4, r3, r0\n\
+ ldr r1, _081146C4 @ =0x000030c4\n\
+ adds r0, r5, r1\n\
+ adds r0, r4, r0\n\
+ ldrb r1, [r0]\n\
+ ldr r0, [sp]\n\
+ str r3, [sp, 0x10]\n\
+ bl sub_8114E48\n\
+ lsls r0, 24\n\
+ ldr r3, [sp, 0x10]\n\
+ adds r2, r3, 0x1\n\
+ mov r10, r2\n\
+ cmp r0, 0\n\
+ bne _081146B4\n\
+ b _081148D2\n\
+_081146B4:\n\
+ adds r0, r5, 0\n\
+ adds r0, 0xC4\n\
+ adds r0, r4, r0\n\
+ movs r1, 0x9\n\
+ strb r1, [r0]\n\
+ b _081148D2\n\
+ .align 2, 0\n\
+_081146C0: .4byte gSharedMem + 0x14800\n\
+_081146C4: .4byte 0x000030c4\n\
+_081146C8:\n\
+ movs r4, 0\n\
+ str r4, [sp, 0x4]\n\
+ ldr r5, _081146FC @ =gSharedMem + 0x14800\n\
+ mov r0, r8\n\
+ adds r4, r3, r0\n\
+ ldr r1, _08114700 @ =0x000030c4\n\
+ adds r0, r5, r1\n\
+ adds r0, r4, r0\n\
+ ldrb r1, [r0]\n\
+ ldr r0, [sp]\n\
+ str r3, [sp, 0x10]\n\
+ bl sub_8114E48\n\
+ lsls r0, 24\n\
+ ldr r3, [sp, 0x10]\n\
+ adds r2, r3, 0x1\n\
+ mov r10, r2\n\
+ cmp r0, 0\n\
+ bne _081146F0\n\
+ b _081148D2\n\
+_081146F0:\n\
+ adds r0, r5, 0\n\
+ adds r0, 0xC4\n\
+ adds r0, r4, r0\n\
+ movs r1, 0xA\n\
+ strb r1, [r0]\n\
+ b _081148D2\n\
+ .align 2, 0\n\
+_081146FC: .4byte gSharedMem + 0x14800\n\
+_08114700: .4byte 0x000030c4\n\
+_08114704:\n\
+ movs r4, 0\n\
+ str r4, [sp, 0x4]\n\
+ ldr r5, _08114738 @ =gSharedMem + 0x14800\n\
+ mov r0, r8\n\
+ adds r4, r3, r0\n\
+ ldr r1, _0811473C @ =0x000030c4\n\
+ adds r0, r5, r1\n\
+ adds r0, r4, r0\n\
+ ldrb r1, [r0]\n\
+ ldr r0, [sp]\n\
+ str r3, [sp, 0x10]\n\
+ bl sub_8114E48\n\
+ lsls r0, 24\n\
+ ldr r3, [sp, 0x10]\n\
+ adds r2, r3, 0x1\n\
+ mov r10, r2\n\
+ cmp r0, 0\n\
+ bne _0811472C\n\
+ b _081148D2\n\
+_0811472C:\n\
+ adds r0, r5, 0\n\
+ adds r0, 0xC4\n\
+ adds r0, r4, r0\n\
+ movs r1, 0xB\n\
+ strb r1, [r0]\n\
+ b _081148D2\n\
+ .align 2, 0\n\
+_08114738: .4byte gSharedMem + 0x14800\n\
+_0811473C: .4byte 0x000030c4\n\
+_08114740:\n\
+ movs r4, 0\n\
+ str r4, [sp, 0x4]\n\
+ ldr r5, _08114774 @ =gSharedMem + 0x14800\n\
+ mov r0, r8\n\
+ adds r4, r3, r0\n\
+ ldr r1, _08114778 @ =0x000030c4\n\
+ adds r0, r5, r1\n\
+ adds r0, r4, r0\n\
+ ldrb r1, [r0]\n\
+ ldr r0, [sp]\n\
+ str r3, [sp, 0x10]\n\
+ bl sub_8114E48\n\
+ lsls r0, 24\n\
+ ldr r3, [sp, 0x10]\n\
+ adds r2, r3, 0x1\n\
+ mov r10, r2\n\
+ cmp r0, 0\n\
+ bne _08114768\n\
+ b _081148D2\n\
+_08114768:\n\
+ adds r0, r5, 0\n\
+ adds r0, 0xC4\n\
+ adds r0, r4, r0\n\
+ movs r1, 0xC\n\
+ strb r1, [r0]\n\
+ b _081148D2\n\
+ .align 2, 0\n\
+_08114774: .4byte gSharedMem + 0x14800\n\
+_08114778: .4byte 0x000030c4\n\
+_0811477C:\n\
+ movs r4, 0\n\
+ str r4, [sp, 0x4]\n\
+ ldr r6, _081147B4 @ =gSharedMem + 0x14800\n\
+ mov r0, r8\n\
+ adds r5, r3, r0\n\
+ ldr r1, _081147B8 @ =0x000030c4\n\
+ adds r4, r6, r1\n\
+ adds r4, r5, r4\n\
+ ldrb r1, [r4]\n\
+ ldr r0, [sp]\n\
+ str r3, [sp, 0x10]\n\
+ bl sub_8114DB4\n\
+ ldr r2, _081147BC @ =0x000020c4\n\
+ adds r0, r6, r2\n\
+ adds r0, r5, r0\n\
+ ldrb r1, [r4]\n\
+ ldr r3, [sp, 0x10]\n\
+ ldrb r0, [r0]\n\
+ cmp r1, r0\n\
+ bne _081147C0\n\
+ adds r0, r6, 0\n\
+ adds r0, 0xC4\n\
+ adds r0, r5, r0\n\
+ mov r4, sp\n\
+ ldrb r4, [r4, 0x4]\n\
+ strb r4, [r0]\n\
+ b _08114844\n\
+ .align 2, 0\n\
+_081147B4: .4byte gSharedMem + 0x14800\n\
+_081147B8: .4byte 0x000030c4\n\
+_081147BC: .4byte 0x000020c4\n\
+_081147C0:\n\
+ adds r0, r6, 0\n\
+ adds r0, 0xC4\n\
+ adds r0, r5, r0\n\
+ movs r1, 0x1\n\
+ strb r1, [r0]\n\
+ adds r0, r3, 0x1\n\
+ mov r10, r0\n\
+ b _081148D2\n\
+_081147D0:\n\
+ movs r1, 0\n\
+ str r1, [sp, 0x4]\n\
+ ldr r6, _08114804 @ =gSharedMem + 0x14800\n\
+ mov r2, r8\n\
+ adds r5, r3, r2\n\
+ ldr r0, _08114808 @ =0x000030c4\n\
+ adds r4, r6, r0\n\
+ adds r4, r5, r4\n\
+ ldrb r1, [r4]\n\
+ ldr r0, [sp]\n\
+ str r3, [sp, 0x10]\n\
+ bl sub_8114DF0\n\
+ ldr r1, _0811480C @ =0x000020c4\n\
+ adds r0, r6, r1\n\
+ adds r0, r5, r0\n\
+ ldrb r1, [r4]\n\
+ ldr r3, [sp, 0x10]\n\
+ ldrb r0, [r0]\n\
+ cmp r1, r0\n\
+ beq _08114882\n\
+ adds r0, r6, 0\n\
+ adds r0, 0xC4\n\
+ adds r0, r5, r0\n\
+ movs r1, 0x2\n\
+ b _08114842\n\
+ .align 2, 0\n\
+_08114804: .4byte gSharedMem + 0x14800\n\
+_08114808: .4byte 0x000030c4\n\
+_0811480C: .4byte 0x000020c4\n\
+_08114810:\n\
+ movs r0, 0\n\
+ str r0, [sp, 0x4]\n\
+ ldr r6, _0811484C @ =gSharedMem + 0x14800\n\
+ mov r1, r8\n\
+ adds r5, r3, r1\n\
+ ldr r2, _08114850 @ =0x000030c4\n\
+ adds r4, r6, r2\n\
+ adds r4, r5, r4\n\
+ ldrb r1, [r4]\n\
+ ldr r0, [sp]\n\
+ str r3, [sp, 0x10]\n\
+ bl sub_8114DB4\n\
+ ldr r1, _08114854 @ =0x000020c4\n\
+ adds r0, r6, r1\n\
+ adds r0, r5, r0\n\
+ ldrb r1, [r4]\n\
+ ldr r3, [sp, 0x10]\n\
+ ldrb r0, [r0]\n\
+ cmp r1, r0\n\
+ beq _08114882\n\
+ adds r0, r6, 0\n\
+ adds r0, 0xC4\n\
+ adds r0, r5, r0\n\
+ movs r1, 0x3\n\
+_08114842:\n\
+ strb r1, [r0]\n\
+_08114844:\n\
+ adds r5, r3, 0x1\n\
+ mov r10, r5\n\
+ b _081148D2\n\
+ .align 2, 0\n\
+_0811484C: .4byte gSharedMem + 0x14800\n\
+_08114850: .4byte 0x000030c4\n\
+_08114854: .4byte 0x000020c4\n\
+_08114858:\n\
+ movs r0, 0\n\
+ str r0, [sp, 0x4]\n\
+ ldr r6, _08114894 @ =gSharedMem + 0x14800\n\
+ mov r1, r8\n\
+ adds r5, r3, r1\n\
+ ldr r2, _08114898 @ =0x000030c4\n\
+ adds r4, r6, r2\n\
+ adds r4, r5, r4\n\
+ ldrb r1, [r4]\n\
+ ldr r0, [sp]\n\
+ str r3, [sp, 0x10]\n\
+ bl sub_8114DF0\n\
+ ldr r1, _0811489C @ =0x000020c4\n\
+ adds r0, r6, r1\n\
+ adds r0, r5, r0\n\
+ ldrb r1, [r4]\n\
+ ldr r3, [sp, 0x10]\n\
+ ldrb r0, [r0]\n\
+ cmp r1, r0\n\
+ bne _081148C4\n\
+_08114882:\n\
+ adds r0, r6, 0\n\
+ adds r0, 0xC4\n\
+ adds r0, r5, r0\n\
+ mov r2, sp\n\
+ ldrb r2, [r2, 0x4]\n\
+ strb r2, [r0]\n\
+ adds r4, r3, 0x1\n\
+ mov r10, r4\n\
+ b _081148D2\n\
+ .align 2, 0\n\
+_08114894: .4byte gSharedMem + 0x14800\n\
+_08114898: .4byte 0x000030c4\n\
+_0811489C: .4byte 0x000020c4\n\
+_081148A0:\n\
+ mov r0, r9\n\
+ adds r0, 0xC4\n\
+ adds r0, r7, r0\n\
+ movs r5, 0\n\
+ strb r5, [r0]\n\
+ b _081148D2\n\
+_081148AC:\n\
+ mov r0, r9\n\
+ adds r0, 0xC4\n\
+ adds r0, r7, r0\n\
+ movs r1, 0\n\
+ strb r1, [r0]\n\
+ b _081148D2\n\
+_081148B8:\n\
+ mov r0, r9\n\
+ adds r0, 0xC4\n\
+ adds r0, r7, r0\n\
+ movs r1, 0\n\
+ strb r1, [r0]\n\
+ b _081148D2\n\
+_081148C4:\n\
+ adds r0, r6, 0\n\
+ adds r0, 0xC4\n\
+ adds r0, r5, r0\n\
+ movs r1, 0x4\n\
+ strb r1, [r0]\n\
+ adds r2, r3, 0x1\n\
+ mov r10, r2\n\
+_081148D2:\n\
+ ldr r0, _081148F4 @ =gSharedMem + 0x14800\n\
+ mov r4, r8\n\
+ adds r1, r3, r4\n\
+ ldr r5, _081148F8 @ =0x000008c4\n\
+ adds r2, r0, r5\n\
+ adds r1, r2\n\
+ ldrb r1, [r1]\n\
+ adds r4, r0, 0\n\
+ cmp r1, 0xC\n\
+ bls _081148E8\n\
+ b _08114D76\n\
+_081148E8:\n\
+ lsls r0, r1, 2\n\
+ ldr r1, _081148FC @ =_08114900\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .align 2, 0\n\
+_081148F4: .4byte gSharedMem + 0x14800\n\
+_081148F8: .4byte 0x000008c4\n\
+_081148FC: .4byte _08114900\n\
+ .align 2, 0\n\
+_08114900:\n\
+ .4byte _08114D76\n\
+ .4byte _08114934\n\
+ .4byte _081149B8\n\
+ .4byte _08114A3C\n\
+ .4byte _08114AC0\n\
+ .4byte _08114B44\n\
+ .4byte _08114B7C\n\
+ .4byte _08114BB4\n\
+ .4byte _08114BEC\n\
+ .4byte _08114C24\n\
+ .4byte _08114C78\n\
+ .4byte _08114CB8\n\
+ .4byte _08114CF8\n\
+_08114934:\n\
+ movs r0, 0\n\
+ str r0, [sp, 0x4]\n\
+ lsls r0, r3, 1\n\
+ ldr r2, [sp]\n\
+ lsls r1, r2, 6\n\
+ adds r0, r1\n\
+ ldr r5, _081149A8 @ =0x000070c4\n\
+ adds r2, r4, r5\n\
+ adds r2, r0, r2\n\
+ ldr r5, _081149AC @ =0x000090c4\n\
+ adds r1, r4, r5\n\
+ adds r0, r1\n\
+ ldrh r1, [r0]\n\
+ ldrh r0, [r2]\n\
+ adds r1, r0\n\
+ movs r0, 0xFF\n\
+ lsls r0, 8\n\
+ ands r0, r1\n\
+ lsrs r5, r0, 8\n\
+ movs r0, 0xFF\n\
+ ands r1, r0\n\
+ strh r1, [r2]\n\
+ movs r6, 0\n\
+ ldr r1, [sp, 0x4]\n\
+ cmp r1, r5\n\
+ blt _0811496A\n\
+ b _08114D76\n\
+_0811496A:\n\
+ mov r9, r4\n\
+ mov r2, r8\n\
+ adds r7, r3, r2\n\
+ ldr r0, _081149B0 @ =0x000038c4\n\
+ add r0, r9\n\
+ adds r4, r7, r0\n\
+ movs r3, 0\n\
+ ldr r0, _081149B4 @ =0x000028c4\n\
+ add r0, r9\n\
+ adds r2, r7, r0\n\
+_0811497E:\n\
+ ldrb r0, [r4]\n\
+ subs r0, 0x1\n\
+ strb r0, [r4]\n\
+ ldrb r1, [r4]\n\
+ ldr r0, [sp]\n\
+ str r2, [sp, 0xC]\n\
+ str r3, [sp, 0x10]\n\
+ bl sub_8114DB4\n\
+ ldrb r0, [r4]\n\
+ ldr r2, [sp, 0xC]\n\
+ ldr r3, [sp, 0x10]\n\
+ ldrb r1, [r2]\n\
+ cmp r0, r1\n\
+ bne _0811499E\n\
+ b _08114D4C\n\
+_0811499E:\n\
+ adds r6, 0x1\n\
+ cmp r6, r5\n\
+ blt _0811497E\n\
+ b _08114D76\n\
+ .align 2, 0\n\
+_081149A8: .4byte 0x000070c4\n\
+_081149AC: .4byte 0x000090c4\n\
+_081149B0: .4byte 0x000038c4\n\
+_081149B4: .4byte 0x000028c4\n\
+_081149B8:\n\
+ movs r2, 0\n\
+ str r2, [sp, 0x4]\n\
+ ldr r4, _08114A28 @ =gSharedMem + 0x14800\n\
+ lsls r0, r3, 1\n\
+ ldr r5, [sp]\n\
+ lsls r1, r5, 6\n\
+ adds r0, r1\n\
+ ldr r1, _08114A2C @ =0x000070c4\n\
+ adds r2, r4, r1\n\
+ adds r2, r0, r2\n\
+ ldr r5, _08114A30 @ =0x000090c4\n\
+ adds r1, r4, r5\n\
+ adds r0, r1\n\
+ ldrh r1, [r0]\n\
+ ldrh r0, [r2]\n\
+ adds r1, r0\n\
+ movs r0, 0xFF\n\
+ lsls r0, 8\n\
+ ands r0, r1\n\
+ lsrs r5, r0, 8\n\
+ movs r0, 0xFF\n\
+ ands r1, r0\n\
+ strh r1, [r2]\n\
+ movs r6, 0\n\
+ ldr r1, [sp, 0x4]\n\
+ cmp r1, r5\n\
+ blt _081149F0\n\
+ b _08114D76\n\
+_081149F0:\n\
+ mov r9, r4\n\
+ mov r2, r8\n\
+ adds r7, r3, r2\n\
+ ldr r0, _08114A34 @ =0x000038c4\n\
+ add r0, r9\n\
+ adds r4, r7, r0\n\
+ ldr r0, _08114A38 @ =0x000028c4\n\
+ add r0, r9\n\
+ adds r2, r7, r0\n\
+_08114A02:\n\
+ ldrb r0, [r4]\n\
+ ldrb r1, [r2]\n\
+ cmp r0, r1\n\
+ bne _08114A0C\n\
+ b _08114D3C\n\
+_08114A0C:\n\
+ adds r1, r0, 0\n\
+ ldr r0, [sp]\n\
+ str r2, [sp, 0xC]\n\
+ bl sub_8114DF0\n\
+ ldrb r0, [r4]\n\
+ subs r0, 0x1\n\
+ strb r0, [r4]\n\
+ adds r6, 0x1\n\
+ ldr r2, [sp, 0xC]\n\
+ cmp r6, r5\n\
+ blt _08114A02\n\
+ b _08114D76\n\
+ .align 2, 0\n\
+_08114A28: .4byte gSharedMem + 0x14800\n\
+_08114A2C: .4byte 0x000070c4\n\
+_08114A30: .4byte 0x000090c4\n\
+_08114A34: .4byte 0x000038c4\n\
+_08114A38: .4byte 0x000028c4\n\
+_08114A3C:\n\
+ movs r2, 0\n\
+ str r2, [sp, 0x4]\n\
+ lsls r0, r3, 1\n\
+ ldr r5, [sp]\n\
+ lsls r1, r5, 6\n\
+ adds r0, r1\n\
+ ldr r1, _08114AB0 @ =0x000070c4\n\
+ adds r2, r4, r1\n\
+ adds r2, r0, r2\n\
+ ldr r5, _08114AB4 @ =0x000090c4\n\
+ adds r1, r4, r5\n\
+ adds r0, r1\n\
+ ldrh r1, [r0]\n\
+ ldrh r0, [r2]\n\
+ adds r1, r0\n\
+ movs r0, 0xFF\n\
+ lsls r0, 8\n\
+ ands r0, r1\n\
+ lsrs r5, r0, 8\n\
+ movs r0, 0xFF\n\
+ ands r1, r0\n\
+ strh r1, [r2]\n\
+ movs r6, 0\n\
+ ldr r1, [sp, 0x4]\n\
+ cmp r1, r5\n\
+ blt _08114A72\n\
+ b _08114D76\n\
+_08114A72:\n\
+ mov r9, r4\n\
+ mov r2, r8\n\
+ adds r7, r3, r2\n\
+ ldr r0, _08114AB8 @ =0x000038c4\n\
+ add r0, r9\n\
+ adds r4, r7, r0\n\
+ movs r3, 0\n\
+ ldr r0, _08114ABC @ =0x000028c4\n\
+ add r0, r9\n\
+ adds r2, r7, r0\n\
+_08114A86:\n\
+ ldrb r0, [r4]\n\
+ adds r0, 0x1\n\
+ strb r0, [r4]\n\
+ ldrb r1, [r4]\n\
+ ldr r0, [sp]\n\
+ str r2, [sp, 0xC]\n\
+ str r3, [sp, 0x10]\n\
+ bl sub_8114DB4\n\
+ ldrb r0, [r4]\n\
+ ldr r2, [sp, 0xC]\n\
+ ldr r3, [sp, 0x10]\n\
+ ldrb r1, [r2]\n\
+ cmp r0, r1\n\
+ bne _08114AA6\n\
+ b _08114D4C\n\
+_08114AA6:\n\
+ adds r6, 0x1\n\
+ cmp r6, r5\n\
+ blt _08114A86\n\
+ b _08114D76\n\
+ .align 2, 0\n\
+_08114AB0: .4byte 0x000070c4\n\
+_08114AB4: .4byte 0x000090c4\n\
+_08114AB8: .4byte 0x000038c4\n\
+_08114ABC: .4byte 0x000028c4\n\
+_08114AC0:\n\
+ movs r2, 0\n\
+ str r2, [sp, 0x4]\n\
+ ldr r4, _08114B30 @ =gSharedMem + 0x14800\n\
+ lsls r0, r3, 1\n\
+ ldr r5, [sp]\n\
+ lsls r1, r5, 6\n\
+ adds r0, r1\n\
+ ldr r1, _08114B34 @ =0x000070c4\n\
+ adds r2, r4, r1\n\
+ adds r2, r0, r2\n\
+ ldr r5, _08114B38 @ =0x000090c4\n\
+ adds r1, r4, r5\n\
+ adds r0, r1\n\
+ ldrh r1, [r0]\n\
+ ldrh r0, [r2]\n\
+ adds r1, r0\n\
+ movs r0, 0xFF\n\
+ lsls r0, 8\n\
+ ands r0, r1\n\
+ lsrs r5, r0, 8\n\
+ movs r0, 0xFF\n\
+ ands r1, r0\n\
+ strh r1, [r2]\n\
+ movs r6, 0\n\
+ ldr r1, [sp, 0x4]\n\
+ cmp r1, r5\n\
+ blt _08114AF8\n\
+ b _08114D76\n\
+_08114AF8:\n\
+ mov r9, r4\n\
+ mov r2, r8\n\
+ adds r7, r3, r2\n\
+ ldr r0, _08114B3C @ =0x000038c4\n\
+ add r0, r9\n\
+ adds r4, r7, r0\n\
+ ldr r0, _08114B40 @ =0x000028c4\n\
+ add r0, r9\n\
+ adds r2, r7, r0\n\
+_08114B0A:\n\
+ ldrb r0, [r4]\n\
+ ldrb r1, [r2]\n\
+ cmp r0, r1\n\
+ bne _08114B14\n\
+ b _08114D5C\n\
+_08114B14:\n\
+ adds r1, r0, 0\n\
+ ldr r0, [sp]\n\
+ str r2, [sp, 0xC]\n\
+ bl sub_8114DF0\n\
+ ldrb r0, [r4]\n\
+ adds r0, 0x1\n\
+ strb r0, [r4]\n\
+ adds r6, 0x1\n\
+ ldr r2, [sp, 0xC]\n\
+ cmp r6, r5\n\
+ blt _08114B0A\n\
+ b _08114D76\n\
+ .align 2, 0\n\
+_08114B30: .4byte gSharedMem + 0x14800\n\
+_08114B34: .4byte 0x000070c4\n\
+_08114B38: .4byte 0x000090c4\n\
+_08114B3C: .4byte 0x000038c4\n\
+_08114B40: .4byte 0x000028c4\n\
+_08114B44:\n\
+ movs r2, 0\n\
+ str r2, [sp, 0x4]\n\
+ ldr r5, _08114B70 @ =gSharedMem + 0x14800\n\
+ mov r0, r8\n\
+ adds r4, r3, r0\n\
+ ldr r1, _08114B74 @ =0x000038c4\n\
+ adds r0, r5, r1\n\
+ adds r0, r4, r0\n\
+ ldrb r1, [r0]\n\
+ ldr r0, [sp]\n\
+ bl sub_8114E48\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _08114B64\n\
+ b _08114D76\n\
+_08114B64:\n\
+ ldr r2, _08114B78 @ =0x000008c4\n\
+ adds r0, r5, r2\n\
+ adds r0, r4, r0\n\
+ movs r1, 0x9\n\
+ b _08114D74\n\
+ .align 2, 0\n\
+_08114B70: .4byte gSharedMem + 0x14800\n\
+_08114B74: .4byte 0x000038c4\n\
+_08114B78: .4byte 0x000008c4\n\
+_08114B7C:\n\
+ movs r4, 0\n\
+ str r4, [sp, 0x4]\n\
+ ldr r5, _08114BA8 @ =gSharedMem + 0x14800\n\
+ mov r0, r8\n\
+ adds r4, r3, r0\n\
+ ldr r1, _08114BAC @ =0x000038c4\n\
+ adds r0, r5, r1\n\
+ adds r0, r4, r0\n\
+ ldrb r1, [r0]\n\
+ ldr r0, [sp]\n\
+ bl sub_8114E48\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _08114B9C\n\
+ b _08114D76\n\
+_08114B9C:\n\
+ ldr r2, _08114BB0 @ =0x000008c4\n\
+ adds r0, r5, r2\n\
+ adds r0, r4, r0\n\
+ movs r1, 0xA\n\
+ b _08114D74\n\
+ .align 2, 0\n\
+_08114BA8: .4byte gSharedMem + 0x14800\n\
+_08114BAC: .4byte 0x000038c4\n\
+_08114BB0: .4byte 0x000008c4\n\
+_08114BB4:\n\
+ movs r4, 0\n\
+ str r4, [sp, 0x4]\n\
+ ldr r5, _08114BE0 @ =gSharedMem + 0x14800\n\
+ mov r0, r8\n\
+ adds r4, r3, r0\n\
+ ldr r1, _08114BE4 @ =0x000038c4\n\
+ adds r0, r5, r1\n\
+ adds r0, r4, r0\n\
+ ldrb r1, [r0]\n\
+ ldr r0, [sp]\n\
+ bl sub_8114E48\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _08114BD4\n\
+ b _08114D76\n\
+_08114BD4:\n\
+ ldr r2, _08114BE8 @ =0x000008c4\n\
+ adds r0, r5, r2\n\
+ adds r0, r4, r0\n\
+ movs r1, 0xB\n\
+ b _08114D74\n\
+ .align 2, 0\n\
+_08114BE0: .4byte gSharedMem + 0x14800\n\
+_08114BE4: .4byte 0x000038c4\n\
+_08114BE8: .4byte 0x000008c4\n\
+_08114BEC:\n\
+ movs r4, 0\n\
+ str r4, [sp, 0x4]\n\
+ ldr r5, _08114C18 @ =gSharedMem + 0x14800\n\
+ mov r0, r8\n\
+ adds r4, r3, r0\n\
+ ldr r1, _08114C1C @ =0x000038c4\n\
+ adds r0, r5, r1\n\
+ adds r0, r4, r0\n\
+ ldrb r1, [r0]\n\
+ ldr r0, [sp]\n\
+ bl sub_8114E48\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _08114C0C\n\
+ b _08114D76\n\
+_08114C0C:\n\
+ ldr r2, _08114C20 @ =0x000008c4\n\
+ adds r0, r5, r2\n\
+ adds r0, r4, r0\n\
+ movs r1, 0xC\n\
+ b _08114D74\n\
+ .align 2, 0\n\
+_08114C18: .4byte gSharedMem + 0x14800\n\
+_08114C1C: .4byte 0x000038c4\n\
+_08114C20: .4byte 0x000008c4\n\
+_08114C24:\n\
+ movs r4, 0\n\
+ str r4, [sp, 0x4]\n\
+ ldr r6, _08114C58 @ =gSharedMem + 0x14800\n\
+ mov r0, r8\n\
+ adds r5, r3, r0\n\
+ ldr r1, _08114C5C @ =0x000038c4\n\
+ adds r4, r6, r1\n\
+ adds r4, r5, r4\n\
+ ldrb r1, [r4]\n\
+ ldr r0, [sp]\n\
+ bl sub_8114DB4\n\
+ ldr r2, _08114C60 @ =0x000028c4\n\
+ adds r0, r6, r2\n\
+ adds r0, r5, r0\n\
+ ldrb r1, [r4]\n\
+ ldrb r0, [r0]\n\
+ cmp r1, r0\n\
+ bne _08114C68\n\
+ ldr r4, _08114C64 @ =0x000008c4\n\
+ adds r0, r6, r4\n\
+ adds r0, r5, r0\n\
+ mov r5, sp\n\
+ ldrb r5, [r5, 0x4]\n\
+ strb r5, [r0]\n\
+ b _08114D76\n\
+ .align 2, 0\n\
+_08114C58: .4byte gSharedMem + 0x14800\n\
+_08114C5C: .4byte 0x000038c4\n\
+_08114C60: .4byte 0x000028c4\n\
+_08114C64: .4byte 0x000008c4\n\
+_08114C68:\n\
+ ldr r1, _08114C74 @ =0x000008c4\n\
+ adds r0, r6, r1\n\
+ adds r0, r5, r0\n\
+ movs r1, 0x1\n\
+ b _08114D74\n\
+ .align 2, 0\n\
+_08114C74: .4byte 0x000008c4\n\
+_08114C78:\n\
+ movs r2, 0\n\
+ str r2, [sp, 0x4]\n\
+ ldr r6, _08114CA8 @ =gSharedMem + 0x14800\n\
+ mov r4, r8\n\
+ adds r5, r3, r4\n\
+ ldr r0, _08114CAC @ =0x000038c4\n\
+ adds r4, r6, r0\n\
+ adds r4, r5, r4\n\
+ ldrb r1, [r4]\n\
+ ldr r0, [sp]\n\
+ bl sub_8114DF0\n\
+ ldr r1, _08114CB0 @ =0x000028c4\n\
+ adds r0, r6, r1\n\
+ adds r0, r5, r0\n\
+ ldrb r1, [r4]\n\
+ ldrb r0, [r0]\n\
+ cmp r1, r0\n\
+ beq _08114D1E\n\
+ ldr r1, _08114CB4 @ =0x000008c4\n\
+ adds r0, r6, r1\n\
+ adds r0, r5, r0\n\
+ movs r1, 0x2\n\
+ b _08114D74\n\
+ .align 2, 0\n\
+_08114CA8: .4byte gSharedMem + 0x14800\n\
+_08114CAC: .4byte 0x000038c4\n\
+_08114CB0: .4byte 0x000028c4\n\
+_08114CB4: .4byte 0x000008c4\n\
+_08114CB8:\n\
+ movs r2, 0\n\
+ str r2, [sp, 0x4]\n\
+ ldr r6, _08114CE8 @ =gSharedMem + 0x14800\n\
+ mov r4, r8\n\
+ adds r5, r3, r4\n\
+ ldr r0, _08114CEC @ =0x000038c4\n\
+ adds r4, r6, r0\n\
+ adds r4, r5, r4\n\
+ ldrb r1, [r4]\n\
+ ldr r0, [sp]\n\
+ bl sub_8114DB4\n\
+ ldr r1, _08114CF0 @ =0x000028c4\n\
+ adds r0, r6, r1\n\
+ adds r0, r5, r0\n\
+ ldrb r1, [r4]\n\
+ ldrb r0, [r0]\n\
+ cmp r1, r0\n\
+ beq _08114D1E\n\
+ ldr r1, _08114CF4 @ =0x000008c4\n\
+ adds r0, r6, r1\n\
+ adds r0, r5, r0\n\
+ movs r1, 0x3\n\
+ b _08114D74\n\
+ .align 2, 0\n\
+_08114CE8: .4byte gSharedMem + 0x14800\n\
+_08114CEC: .4byte 0x000038c4\n\
+_08114CF0: .4byte 0x000028c4\n\
+_08114CF4: .4byte 0x000008c4\n\
+_08114CF8:\n\
+ movs r2, 0\n\
+ str r2, [sp, 0x4]\n\
+ ldr r6, _08114D2C @ =gSharedMem + 0x14800\n\
+ mov r4, r8\n\
+ adds r5, r3, r4\n\
+ ldr r0, _08114D30 @ =0x000038c4\n\
+ adds r4, r6, r0\n\
+ adds r4, r5, r4\n\
+ ldrb r1, [r4]\n\
+ ldr r0, [sp]\n\
+ bl sub_8114DF0\n\
+ ldr r1, _08114D34 @ =0x000028c4\n\
+ adds r0, r6, r1\n\
+ adds r0, r5, r0\n\
+ ldrb r1, [r4]\n\
+ ldrb r0, [r0]\n\
+ cmp r1, r0\n\
+ bne _08114D6C\n\
+_08114D1E:\n\
+ ldr r2, _08114D38 @ =0x000008c4\n\
+ adds r0, r6, r2\n\
+ adds r0, r5, r0\n\
+ mov r4, sp\n\
+ ldrb r4, [r4, 0x4]\n\
+ strb r4, [r0]\n\
+ b _08114D76\n\
+ .align 2, 0\n\
+_08114D2C: .4byte gSharedMem + 0x14800\n\
+_08114D30: .4byte 0x000038c4\n\
+_08114D34: .4byte 0x000028c4\n\
+_08114D38: .4byte 0x000008c4\n\
+_08114D3C:\n\
+ ldr r0, _08114D48 @ =0x000008c4\n\
+ add r0, r9\n\
+ adds r0, r7, r0\n\
+ movs r1, 0\n\
+ b _08114D74\n\
+ .align 2, 0\n\
+_08114D48: .4byte 0x000008c4\n\
+_08114D4C:\n\
+ ldr r0, _08114D58 @ =0x000008c4\n\
+ add r0, r9\n\
+ adds r0, r7, r0\n\
+ strb r3, [r0]\n\
+ b _08114D76\n\
+ .align 2, 0\n\
+_08114D58: .4byte 0x000008c4\n\
+_08114D5C:\n\
+ ldr r0, _08114D68 @ =0x000008c4\n\
+ add r0, r9\n\
+ adds r0, r7, r0\n\
+ movs r1, 0\n\
+ b _08114D74\n\
+ .align 2, 0\n\
+_08114D68: .4byte 0x000008c4\n\
+_08114D6C:\n\
+ ldr r1, _08114DAC @ =0x000008c4\n\
+ adds r0, r6, r1\n\
+ adds r0, r5, r0\n\
+ movs r1, 0x4\n\
+_08114D74:\n\
+ strb r1, [r0]\n\
+_08114D76:\n\
+ mov r3, r10\n\
+ ldr r2, _08114DB0 @ =gSharedMem + 0x14800\n\
+ adds r0, r2, 0\n\
+ adds r0, 0x84\n\
+ ldr r4, [sp]\n\
+ adds r0, r4, r0\n\
+ adds r4, r2, 0\n\
+_08114D84:\n\
+ ldrb r0, [r0]\n\
+ cmp r3, r0\n\
+ bge _08114D8E\n\
+ bl _08114410\n\
+_08114D8E:\n\
+ ldr r5, [sp, 0x8]\n\
+ str r5, [sp]\n\
+ cmp r5, 0x3F\n\
+ bgt _08114D9A\n\
+ bl _081143F2\n\
+_08114D9A:\n\
+ ldr r0, [sp, 0x4]\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\
+_08114DAC: .4byte 0x000008c4\n\
+_08114DB0: .4byte gSharedMem + 0x14800\n\
+ .syntax divided");
+}
+
+void sub_8114DB4(u32 a, u8 b)
+{
+ u8 *r2 = sEvoInfo.unk40C4[a][b / 2];
+
+ if (b % 2 != 0)
+ *r2 |= 0xF0;
+ else
+ *r2 |= 0x0F;
+}
+
+void sub_8114DF0(u32 a, u8 b)
+{
+ u8 *r2 = sEvoInfo.unk40C4[a][b / 2];
+ u8 *r1 = r2 + 0x6000;
+
+ if (b % 2 != 0)
+ {
+ if (!(*r1 & 0xF0))
+ *r2 &= 0x0F;
+ }
+ else
+ {
+ if (!(*r1 & 0x0F))
+ *r2 &= 0xF0;
+ }
+}
+
+__attribute__((naked))
+void sub_8114E48()
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ adds r4, r0, 0\n\
+ lsls r1, 24\n\
+ lsrs r6, r1, 24\n\
+ ldr r1, _08114E6C @ =gSharedMem + 0x14800\n\
+ ldr r2, _08114E70 @ =0x0000a0c4\n\
+ adds r0, r1, r2\n\
+ ldrb r0, [r0]\n\
+ adds r5, r1, 0\n\
+ cmp r0, 0\n\
+ bne _08114E60\n\
+ b _08114F5E\n\
+_08114E60:\n\
+ movs r1, 0\n\
+ movs r3, 0\n\
+ cmp r4, 0\n\
+ bne _08114E74\n\
+ movs r1, 0x1\n\
+ b _08114EA6\n\
+ .align 2, 0\n\
+_08114E6C: .4byte gSharedMem + 0x14800\n\
+_08114E70: .4byte 0x0000a0c4\n\
+_08114E74:\n\
+ subs r0, r4, 0x1\n\
+ lsls r0, 5\n\
+ adds r2, r3, r0\n\
+ adds r0, r5, 0\n\
+ adds r0, 0xC4\n\
+ adds r0, r2, r0\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _08114EA6\n\
+ ldr r7, _08114EC4 @ =0x000008c4\n\
+ adds r0, r5, r7\n\
+ adds r0, r2, r0\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _08114EA6\n\
+ adds r3, 0x1\n\
+ cmp r3, 0x1F\n\
+ bgt _08114EA6\n\
+ cmp r4, 0\n\
+ bne _08114E74\n\
+ lsls r0, r1, 24\n\
+ movs r1, 0x80\n\
+ lsls r1, 17\n\
+ adds r0, r1\n\
+ lsrs r1, r0, 24\n\
+_08114EA6:\n\
+ cmp r3, 0x20\n\
+ bne _08114EB4\n\
+ lsls r0, r1, 24\n\
+ movs r2, 0x80\n\
+ lsls r2, 17\n\
+ adds r0, r2\n\
+ lsrs r1, r0, 24\n\
+_08114EB4:\n\
+ movs r3, 0\n\
+ cmp r4, 0x3F\n\
+ bne _08114EC8\n\
+ lsls r0, r1, 24\n\
+ movs r7, 0x80\n\
+ lsls r7, 17\n\
+ adds r0, r7\n\
+ b _08114EF8\n\
+ .align 2, 0\n\
+_08114EC4: .4byte 0x000008c4\n\
+_08114EC8:\n\
+ adds r0, r4, 0x1\n\
+ lsls r0, 5\n\
+ adds r2, r3, r0\n\
+ adds r0, r5, 0\n\
+ adds r0, 0xC4\n\
+ adds r0, r2, r0\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _08114EFA\n\
+ ldr r7, _08114F64 @ =0x000008c4\n\
+ adds r0, r5, r7\n\
+ adds r0, r2, r0\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _08114EFA\n\
+ adds r3, 0x1\n\
+ cmp r3, 0x1F\n\
+ bgt _08114EFA\n\
+ cmp r4, 0x3F\n\
+ bne _08114EC8\n\
+ lsls r0, r1, 24\n\
+ movs r1, 0x80\n\
+ lsls r1, 17\n\
+ adds r0, r1\n\
+_08114EF8:\n\
+ lsrs r1, r0, 24\n\
+_08114EFA:\n\
+ cmp r3, 0x20\n\
+ bne _08114F08\n\
+ lsls r0, r1, 24\n\
+ movs r2, 0x80\n\
+ lsls r2, 17\n\
+ adds r0, r2\n\
+ lsrs r1, r0, 24\n\
+_08114F08:\n\
+ cmp r1, 0x2\n\
+ beq _08114F5E\n\
+ subs r0, r6, 0x2\n\
+ lsls r0, 24\n\
+ lsrs r1, r0, 24\n\
+ cmp r0, 0\n\
+ bge _08114F18\n\
+ movs r1, 0\n\
+_08114F18:\n\
+ adds r0, r6, 0x2\n\
+ lsls r0, 24\n\
+ lsrs r2, r0, 24\n\
+ asrs r0, 24\n\
+ cmp r0, 0x3F\n\
+ ble _08114F26\n\
+ movs r2, 0x3F\n\
+_08114F26:\n\
+ lsls r1, 24\n\
+ asrs r3, r1, 24\n\
+ lsls r0, r2, 24\n\
+ asrs r2, r0, 24\n\
+ adds r6, r1, 0\n\
+ adds r7, r0, 0\n\
+ cmp r3, r2\n\
+ bge _08114F7C\n\
+ cmp r4, 0\n\
+ beq _08114F7C\n\
+ subs r0, r4, 0x1\n\
+ lsls r5, r0, 7\n\
+ ldr r0, _08114F68 @ =gSharedMem + 0x188C4\n\
+ mov r12, r0\n\
+_08114F42:\n\
+ asrs r0, r3, 1\n\
+ lsls r0, 2\n\
+ adds r0, r5\n\
+ add r0, r12\n\
+ ldr r1, [r0]\n\
+ movs r0, 0x1\n\
+ ands r0, r3\n\
+ cmp r0, 0\n\
+ beq _08114F6C\n\
+ ldrb r1, [r1]\n\
+ movs r0, 0xF0\n\
+_08114F58:\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08114F72\n\
+_08114F5E:\n\
+ movs r0, 0x1\n\
+ b _08114FCA\n\
+ .align 2, 0\n\
+_08114F64: .4byte 0x000008c4\n\
+_08114F68: .4byte gSharedMem + 0x188C4\n\
+_08114F6C:\n\
+ ldrb r1, [r1]\n\
+ movs r0, 0xF\n\
+ b _08114F58\n\
+_08114F72:\n\
+ adds r3, 0x1\n\
+ cmp r3, r2\n\
+ bge _08114F7C\n\
+ cmp r4, 0\n\
+ bne _08114F42\n\
+_08114F7C:\n\
+ asrs r3, r6, 24\n\
+ asrs r1, r7, 24\n\
+ cmp r3, r1\n\
+ bge _08114FC8\n\
+ cmp r4, 0x3F\n\
+ beq _08114FC8\n\
+ adds r0, r4, 0x1\n\
+ lsls r5, r0, 7\n\
+ ldr r6, _08114FB0 @ =gSharedMem + 0x188C4\n\
+ adds r2, r1, 0\n\
+_08114F90:\n\
+ asrs r0, r3, 1\n\
+ lsls r0, 2\n\
+ adds r0, r5\n\
+ adds r0, r6\n\
+ ldr r1, [r0]\n\
+ movs r0, 0x1\n\
+ ands r0, r3\n\
+ cmp r0, 0\n\
+ beq _08114FB4\n\
+ ldrb r1, [r1]\n\
+ movs r0, 0xF0\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08114FBE\n\
+ b _08114F5E\n\
+ .align 2, 0\n\
+_08114FB0: .4byte gSharedMem + 0x188C4\n\
+_08114FB4:\n\
+ ldrb r1, [r1]\n\
+ movs r0, 0xF\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _08114F5E\n\
+_08114FBE:\n\
+ adds r3, 0x1\n\
+ cmp r3, r2\n\
+ bge _08114FC8\n\
+ cmp r4, 0x3F\n\
+ bne _08114F90\n\
+_08114FC8:\n\
+ movs r0, 0\n\
+_08114FCA:\n\
+ pop {r4-r7}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .syntax divided");
+}
+
+// Functions below are vblank callbacks and are used
+
+static void EvoDummyFunc(void)
+{
+
+}
+
+static void VBlankCB_EvolutionScene(void)
+{
+ REG_BG0CNT = BGCNT_SCREENBASE(24) | BGCNT_16COLOR | BGCNT_TXT256x256 | BGCNT_AFF512x512 | BGCNT_PRIORITY(3); // 0x9803
+ REG_BG0HOFS = gBattle_BG0_X;
+ REG_BG0VOFS = gBattle_BG0_Y;
+ REG_BG1HOFS = gBattle_BG1_X;
+ REG_BG1VOFS = gBattle_BG1_Y;
+ REG_BG2HOFS = gBattle_BG2_X;
+ REG_BG2VOFS = gBattle_BG2_Y;
+ REG_BG3HOFS = gUnknown_030041B0;
+ REG_BG3VOFS = gUnknown_030041B8;
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ sub_8089668();
+}
+
+static void VBlankCB_TradeEvolutionScene(void)
+{
+ REG_BG0HOFS = gBattle_BG0_X;
+ REG_BG0VOFS = gBattle_BG0_Y;
+ REG_BG1HOFS = gBattle_BG1_X;
+ REG_BG1VOFS = gBattle_BG1_Y;
+ REG_BG2HOFS = gBattle_BG2_X;
+ REG_BG2VOFS = gBattle_BG2_Y;
+ REG_BG3HOFS = gUnknown_030041B0;
+ REG_BG3VOFS = gUnknown_030041B8;
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ sub_8089668();
+}
+
+static void sub_81150D8(void)
+{
+ sub_814A880(200, 72 + (sEvoCursorPos * 16));
+}
+
+static void EvoDummyFunc2(void)
+{
+
+}
diff --git a/src/hall_of_fame.c b/src/scene/hall_of_fame.c
index 78909e289..1751ee99c 100644
--- a/src/hall_of_fame.c
+++ b/src/scene/hall_of_fame.c
@@ -3,24 +3,24 @@
#include "task.h"
#include "palette.h"
#include "sound.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "pokemon.h"
#include "text.h"
#include "strings.h"
#include "string_util.h"
#include "menu.h"
#include "save.h"
-#include "species.h"
-#include "rom4.h"
+#include "constants/species.h"
+#include "overworld.h"
#include "m4a.h"
#include "data2.h"
#include "decompress.h"
-#include "rng.h"
+#include "random.h"
#include "trig.h"
+#include "ewram.h"
static EWRAM_DATA u32 sUnknown_0203931C = 0;
-extern u8 ewram[];
extern bool8 gUnknown_02039324; // has hall of fame records
extern void (*gGameContinueCallback)(void);
extern struct MusicPlayerInfo gMPlay_BGM;
@@ -156,69 +156,69 @@ static const struct OamData sOamData_840B598 =
void* const gUnknown_0840B5A0[] =
{
- &ewram[0x08000],
- &ewram[0x0A000],
- &ewram[0x0C000],
- &ewram[0x0E000],
- &ewram[0x10000],
- &ewram[0x14000],
- &ewram[0x18000]
+ ewram8000,
+ ewramA000,
+ ewramC000,
+ ewramE000,
+ ewram10000,
+ ewram14000,
+ ewram18000_2
};
static const struct SpriteFrameImage sSpriteImageTable_840B5BC[] =
{
- {&ewram[0x8000], 0x800},
- {&ewram[0x8800], 0x800},
- {&ewram[0x9000], 0x800},
- {&ewram[0x9800], 0x800}
+ {ewram8000, 0x800},
+ {ewram8800, 0x800},
+ {ewram9000, 0x800},
+ {ewram9800, 0x800}
};
static const struct SpriteFrameImage sSpriteImageTable_840B5DC[] =
{
- {&ewram[0xA000], 0x800},
- {&ewram[0xA800], 0x800},
- {&ewram[0xB000], 0x800},
- {&ewram[0xB800], 0x800}
+ {ewramA000, 0x800},
+ {ewramA800, 0x800},
+ {ewramB000, 0x800},
+ {ewramB800, 0x800}
};
static const struct SpriteFrameImage sSpriteImageTable_840B5FC[] =
{
- {&ewram[0xC000], 0x800},
- {&ewram[0xC800], 0x800},
- {&ewram[0xD000], 0x800},
- {&ewram[0xD800], 0x800}
+ {ewramC000, 0x800},
+ {ewramC800, 0x800},
+ {ewramD000, 0x800},
+ {ewramD800, 0x800}
};
static const struct SpriteFrameImage sSpriteImageTable_840B61C[] =
{
- {&ewram[0xE000], 0x800},
- {&ewram[0xE800], 0x800},
- {&ewram[0xF000], 0x800},
- {&ewram[0xF800], 0x800}
+ {ewramE000, 0x800},
+ {ewramE800, 0x800},
+ {ewramF000, 0x800},
+ {ewramF800, 0x800}
};
static const struct SpriteFrameImage sSpriteImageTable_840B63C[] =
{
- {&ewram[0x10000], 0x800},
- {&ewram[0x10800], 0x800},
- {&ewram[0x11000], 0x800},
- {&ewram[0x11800], 0x800}
+ {ewram10000, 0x800},
+ {ewram10800, 0x800},
+ {ewram11000, 0x800},
+ {ewram11800, 0x800}
};
static const struct SpriteFrameImage sSpriteImageTable_840B65C[] =
{
- {&ewram[0x14000], 0x800},
- {&ewram[0x14800], 0x800},
- {&ewram[0x15000], 0x800},
- {&ewram[0x15800], 0x800}
+ {ewram14000, 0x800},
+ {ewram14800, 0x800},
+ {ewram15000, 0x800},
+ {ewram15800, 0x800}
};
static const struct SpriteFrameImage sSpriteImageTable_840B67C[] =
{
- {&ewram[0x18000], 0x800},
- {&ewram[0x18800], 0x800},
- {&ewram[0x19000], 0x800},
- {&ewram[0x19800], 0x800}
+ {ewram18000_2, 0x800},
+ {ewram18800, 0x800},
+ {ewram19000, 0x800},
+ {ewram19800, 0x800}
};
static const struct SpriteFrameImage* const sUnknown_0840B69C[7] =
@@ -486,7 +486,7 @@ static void sub_8141FC4(void)
static void sub_8141FF8(u8 taskID)
{
u16 i, j;
- struct HallofFameMons* fameMons = (struct HallofFameMons*)(&ewram[0x1C000]);
+ struct HallofFameMons* fameMons = eHallOfFameMons1;
gTasks[taskID].tPokesNumber = 0; // valid pokes
for (i = 0; i < 6; i++)
@@ -530,13 +530,13 @@ static void sub_8141FF8(u8 taskID)
static void sub_814217C(u8 taskID)
{
u16 i;
- struct HallofFameMons* fameMons = (struct HallofFameMons*)(&ewram[0x1C000]);
- struct HallofFameMons* lastSavedTeam = (struct HallofFameMons*)(&ewram[0x1E000]);
+ struct HallofFameMons* fameMons = eHallOfFameMons1;
+ struct HallofFameMons* lastSavedTeam = eHallOfFameMons2;
if (gUnknown_02039324 == FALSE)
{
for (i = 0; i < 0x2000; i++)
- ewram[i + 0x1E000] = 0;
+ ewram1E000(i) = 0;
}
else
sub_8125EC8(3);
@@ -548,8 +548,8 @@ static void sub_814217C(u8 taskID)
}
if (i >= HALL_OF_FAME_MAX_TEAMS)
{
- struct HallofFameMons* r5 = (struct HallofFameMons*)(&ewram[0x1E000]);
- struct HallofFameMons* r6 = (struct HallofFameMons*)(&ewram[0x1E000]);
+ struct HallofFameMons* r5 = eHallOfFameMons2;
+ struct HallofFameMons* r6 = eHallOfFameMons2;
r5++;
for (i = 0; i < HALL_OF_FAME_MAX_TEAMS - 1; i++, r6++, r5++)
{
@@ -592,7 +592,7 @@ static void sub_8142320(u8 taskID)
u8 spriteID;
s16 xPos, yPos, field4, field6;
- struct HallofFameMons* fameMons = (struct HallofFameMons*)(&ewram[0x1C000]);
+ struct HallofFameMons* fameMons = eHallOfFameMons1;
u16 currPokeID = gTasks[taskID].tDisplayedPoke;
struct HallofFameMon* currMon = &fameMons->mons[currPokeID];
@@ -612,9 +612,9 @@ static void sub_8142320(u8 taskID)
}
spriteID = HallOfFame_LoadPokemonPic(currMon->species, xPos, yPos, currPokeID, currMon->tid, currMon->personality);
- gSprites[spriteID].data1 = field4;
- gSprites[spriteID].data2 = field6;
- gSprites[spriteID].data0 = 0;
+ gSprites[spriteID].data[1] = field4;
+ gSprites[spriteID].data[2] = field6;
+ gSprites[spriteID].data[0] = 0;
gSprites[spriteID].callback = sub_81435DC;
gTasks[taskID].tMonSpriteID(currPokeID) = spriteID;
MenuZeroFillWindowRect(0, 14, 29, 19);
@@ -623,11 +623,11 @@ static void sub_8142320(u8 taskID)
static void sub_8142404(u8 taskID)
{
- struct HallofFameMons* fameMons = (struct HallofFameMons*)(&ewram[0x1C000]);
+ struct HallofFameMons* fameMons = eHallOfFameMons1;
u16 currPokeID = gTasks[taskID].tDisplayedPoke;
struct HallofFameMon* currMon = &fameMons->mons[currPokeID];
- if (gSprites[gTasks[taskID].tMonSpriteID(currPokeID)].data0 != 0)
+ if (gSprites[gTasks[taskID].tMonSpriteID(currPokeID)].data[0] != 0)
{
if (currMon->species != SPECIES_EGG)
PlayCry1(currMon->species, 0);
@@ -639,7 +639,7 @@ static void sub_8142404(u8 taskID)
static void sub_8142484(u8 taskID)
{
- struct HallofFameMons* fameMons = (struct HallofFameMons*)(&ewram[0x1C000]);
+ struct HallofFameMons* fameMons = eHallOfFameMons1;
u16 currPokeID = gTasks[taskID].tDisplayedPoke;
struct HallofFameMon* currMon = &fameMons->mons[currPokeID];
@@ -808,7 +808,7 @@ void sub_81428CC(void)
REG_BLDY = 0;
sub_81435B8();
- fameMons = (struct HallofFameMons*)(&ewram[0x1C000]);
+ fameMons = eHallOfFameMons1;
fameMons->mons[0] = sDummyFameMon;
sub_80C5CD4(fameMons);
@@ -847,7 +847,7 @@ static void sub_8142A28(u8 taskID)
u16 *vram1, *vram2;
u16 i;
- struct HallofFameMons* savedTeams = (struct HallofFameMons*)(&ewram[0x1E000]);
+ struct HallofFameMons* savedTeams = eHallOfFameMons2;
for (i = 0; i < HALL_OF_FAME_MAX_TEAMS; i++, savedTeams++)
{
if (savedTeams->mons[0].species == 0)
@@ -872,7 +872,7 @@ static void sub_8142A28(u8 taskID)
static void sub_8142B04(u8 taskID)
{
- struct HallofFameMons* savedTeams = (struct HallofFameMons*)(&ewram[0x1E000]);
+ struct HallofFameMons* savedTeams = eHallOfFameMons2;
struct HallofFameMon* currMon;
u16 i;
u8* stringPtr;
@@ -937,7 +937,7 @@ static void sub_8142B04(u8 taskID)
static void sub_8142CC8(u8 taskID)
{
- struct HallofFameMons* savedTeams = (struct HallofFameMons*)(&ewram[0x1E000]);
+ struct HallofFameMons* savedTeams = eHallOfFameMons2;
struct HallofFameMon* currMon;
u16 i;
u16 currMonID;
@@ -1025,7 +1025,7 @@ static void sub_8142F78(u8 taskID)
struct HallofFameMons* fameMons;
CpuSet(gPlttBufferFaded, gPlttBufferUnfaded, 0x200);
- fameMons = (struct HallofFameMons*)(&ewram[0x1C000]);
+ fameMons = eHallOfFameMons1;
fameMons->mons[0] = sDummyFameMon;
sub_80C5E38(fameMons);
gTasks[taskID].func = sub_8142FCC;
@@ -1258,7 +1258,7 @@ static void sub_81433E0(void)
*((u16*)(VRAM + 0x3000) + i) = 2;
}
- offsetWrite4 = (u32)(&ewram[0]);
+ offsetWrite4 = ewram0_6;
size4 = 0x4000;
while (TRUE)
{
@@ -1299,22 +1299,22 @@ static void sub_81435B8(void)
static void sub_81435DC(struct Sprite* sprite)
{
u32 spritePos = *(u32*)(&sprite->pos1);
- u32 dataPos = *(u32*)(&sprite->data1);
+ u32 dataPos = *(u32*)(&sprite->data[1]);
if (spritePos != dataPos)
{
- if (sprite->pos1.x < sprite->data1)
+ if (sprite->pos1.x < sprite->data[1])
sprite->pos1.x += 15;
- if (sprite->pos1.x > sprite->data1)
+ if (sprite->pos1.x > sprite->data[1])
sprite->pos1.x -= 15;
- if (sprite->pos1.y < sprite->data2)
+ if (sprite->pos1.y < sprite->data[2])
sprite->pos1.y += 10;
- if (sprite->pos1.y > sprite->data2)
+ if (sprite->pos1.y > sprite->data[2])
sprite->pos1.y -= 10;
}
else
{
- sprite->data0 = 1;
+ sprite->data[0] = 1;
sprite->callback = SpriteCB_HallOfFame_Dummy;
}
}
@@ -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);
@@ -1381,13 +1381,13 @@ static void sub_814386C(struct Sprite* sprite)
u8 tableID;
sprite->pos2.y++;
- sprite->pos2.y += sprite->data1;
+ sprite->pos2.y += sprite->data[1];
- tableID = sprite->data0;
+ tableID = sprite->data[0];
rand = (Random() % 4) + 8;
sprite->pos2.x = rand * gSineTable[tableID] / 256;
- sprite->data0 += 4;
+ sprite->data[0] += 4;
}
}
@@ -1405,9 +1405,9 @@ static bool8 sub_81438C4(void)
StartSpriteAnim(sprite, Random() % 17);
if (Random() & 3)
- sprite->data1 = 0;
+ sprite->data[1] = 0;
else
- sprite->data1 = 1;
+ sprite->data[1] = 1;
return 0;
}
diff --git a/src/intro.c b/src/scene/intro.c
index a43e0356c..4dc6cc91c 100644
--- a/src/intro.c
+++ b/src/scene/intro.c
@@ -11,15 +11,16 @@
#include "main.h"
#include "new_game.h"
#include "palette.h"
-#include "rng.h"
+#include "random.h"
#include "save.h"
-#include "songs.h"
+#include "constants/songs.h"
#include "sound.h"
-#include "species.h"
+#include "constants/species.h"
#include "task.h"
#include "title_screen.h"
#include "trig.h"
#include "unknown_task.h"
+#include "ewram.h"
extern struct SpriteTemplate gUnknown_02024E8C;
extern u16 gUnknown_02039358;
@@ -765,10 +766,14 @@ const struct SpritePalette gIntro3MiscPal_Table[] =
{gIntro3Misc2Palette, 2004},
{NULL},
};
-const u32 unusedData = 0x02000000;
+
+// Game Freak probably used the raw address here.
+// Treating this like a u8 * causes the compiler
+// to remove it at link time.
+const u32 unusedSharedMemPtr = (u32)gSharedMem;
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 +943,7 @@ void CB2_InitCopyrightScreenAfterTitleScreen(void)
SetUpCopyrightScreen();
}
-static void Task_IntroLoadPart1Graphics(u8 taskId)
+void Task_IntroLoadPart1Graphics(u8 taskId)
{
SetVBlankCallback(NULL);
gUnknown_02039318 = Random() & 1;
@@ -990,11 +995,11 @@ static void Task_IntroWaterDrops(u8 taskId)
{
//start moving rock
if (gIntroFrameCounter == 76)
- gSprites[gTasks[taskId].data[0]].data0 = 1;
+ gSprites[gTasks[taskId].data[0]].data[0] = 1;
//drop rock
if (gIntroFrameCounter == 251)
- gSprites[gTasks[taskId].data[0]].data0 = 2;
+ gSprites[gTasks[taskId].data[0]].data[0] = 2;
if (gIntroFrameCounter == 368)
CreateWaterDrop(48, 0, 0x400, 5, 0x70, TRUE);
@@ -1082,14 +1087,14 @@ static void Task_IntroStartBikeRide(u8 taskId)
u8 spriteId;
if (gUnknown_02039318 == 0)
- LoadCompressedObjectPic(&gIntro2BrendanSpriteSheet);
+ LoadCompressedObjectPic(gIntro2BrendanSpriteSheet);
else
- LoadCompressedObjectPic(&gIntro2MaySpriteSheet);
- LoadCompressedObjectPic(&gIntro2BicycleSpriteSheet);
+ LoadCompressedObjectPic(gIntro2MaySpriteSheet);
+ LoadCompressedObjectPic(gIntro2BicycleSpriteSheet);
#ifdef SAPPHIRE
- LoadCompressedObjectPic(&gIntro2LatiasSpriteSheet);
+ LoadCompressedObjectPic(gIntro2LatiasSpriteSheet);
#else
- LoadCompressedObjectPic(&gIntro2LatiosSpriteSheet);
+ LoadCompressedObjectPic(gIntro2LatiosSpriteSheet);
#endif
LoadSpritePalettes(gIntro2SpritePalettes);
if (gUnknown_02039318 == 0)
@@ -1129,17 +1134,17 @@ static void Task_IntroHandleBikeAndEonMovement(u8 taskId)
gTasks[taskId].func = Task_IntroWaitToSetupPart3;
}
if (gIntroFrameCounter == 1109)
- gSprites[gTasks[taskId].data[1]].data0 = 1;
+ gSprites[gTasks[taskId].data[1]].data[0] = 1;
if (gIntroFrameCounter == 1214)
- gSprites[gTasks[taskId].data[1]].data0 = 0;
+ gSprites[gTasks[taskId].data[1]].data[0] = 0;
if (gIntroFrameCounter == 1394)
- gSprites[gTasks[taskId].data[2]].data0 = 1;
+ gSprites[gTasks[taskId].data[2]].data[0] = 1;
if (gIntroFrameCounter == 1398)
- gSprites[gTasks[taskId].data[1]].data0 = 2;
+ gSprites[gTasks[taskId].data[1]].data[0] = 2;
if (gIntroFrameCounter == 1586)
- gSprites[gTasks[taskId].data[1]].data0 = 3;
+ gSprites[gTasks[taskId].data[1]].data[0] = 3;
if (gIntroFrameCounter == 1727)
- gSprites[gTasks[taskId].data[1]].data0 = 4;
+ gSprites[gTasks[taskId].data[1]].data[0] = 4;
//TODO: Clean this up
a = (((u16)gTasks[taskId].data[3] << 16) >> 18) & 0x7F;
@@ -1207,7 +1212,7 @@ static void Task_IntroWaitToSetupPart3DoubleFight(u8 taskId)
gTasks[taskId].func = Task_IntroLoadPart3Streaks;
}
-extern u8 unk_2000000[][32];
+//extern u8 gSharedMem[][32];
static void Task_IntroLoadPart3Streaks(u8 taskId)
{
@@ -1217,12 +1222,12 @@ static void Task_IntroLoadPart3Streaks(u8 taskId)
intro_reset_and_hide_bgs();
for (i = 0; i < 32; i++)
{
- unk_2000000[0][i] = 0;
- unk_2000000[1][i] = 17;
- unk_2000000[2][i] = 34;
+ ewram0arr[0][i] = 0;
+ ewram0arr[1][i] = 17;
+ ewram0arr[2][i] = 34;
}
vram = (void *)VRAM;
- DmaCopy16(3, unk_2000000, vram, 0x60);
+ DmaCopy16(3, gSharedMem, vram, 0x60);
for (i = 0; i < 0x280; i++)
((u16 *)(VRAM + 0x3000))[i] = 0xF001;
for (i = 0; i < 0x80; i++)
@@ -1309,15 +1314,15 @@ static void Task_IntroPokemonBattle(u8 taskId)
{
spriteId = sub_813CE88(SPECIES_SHARPEDO, 0xF0, 0xA0, 5, 1);
gSprites[spriteId].callback = sub_813DB9C;
- gSprites[spriteId].data1 = 1;
- gSprites[spriteId].data2 = 0;
+ gSprites[spriteId].data[1] = 1;
+ gSprites[spriteId].data[2] = 0;
}
if (gIntroFrameCounter == 152)
{
spriteId = sub_813CE88(SPECIES_DUSKULL, 0, 0xA0, 4, 1);
gSprites[spriteId].callback = sub_813DB9C;
- gSprites[spriteId].data1 = 2;
- gSprites[spriteId].data2 = 1;
+ gSprites[spriteId].data[1] = 2;
+ gSprites[spriteId].data[2] = 1;
}
if (gIntroFrameCounter == 219)
{
@@ -1329,12 +1334,12 @@ static void Task_IntroPokemonBattle(u8 taskId)
if (gIntroFrameCounter == 304)
{
gTasks[gTasks[taskId].data[15]].data[0] = 4;
- gSprites[gTasks[taskId].data[1]].data0 = 2;
+ gSprites[gTasks[taskId].data[1]].data[0] = 2;
}
if (gIntroFrameCounter == 384)
{
gTasks[gTasks[taskId].data[15]].data[0] = 0;
- gSprites[gTasks[taskId].data[1]].data0 = 4;
+ gSprites[gTasks[taskId].data[1]].data[0] = 4;
}
if (gIntroFrameCounter == 400)
{
@@ -1342,11 +1347,11 @@ static void Task_IntroPokemonBattle(u8 taskId)
}
if (gIntroFrameCounter == 432)
{
- gSprites[gTasks[taskId].data[1]].data0 = 5;
+ gSprites[gTasks[taskId].data[1]].data[0] = 5;
}
if (gIntroFrameCounter == 462)
{
- gSprites[gTasks[taskId].data[1]].data0 = 6;
+ gSprites[gTasks[taskId].data[1]].data[0] = 6;
gTasks[gTasks[taskId].data[15]].data[0] = 2;
}
if (gIntroFrameCounter == 463)
@@ -1366,8 +1371,8 @@ static void Task_IntroPokemonBattle(u8 taskId)
}
if (gIntroFrameCounter == 623)
{
- gSprites[gTasks[taskId].data[2]].data0 = 2;
- gSprites[gTasks[taskId].data[3]].data0 = 2;
+ gSprites[gTasks[taskId].data[2]].data[0] = 2;
+ gSprites[gTasks[taskId].data[3]].data[0] = 2;
gTasks[gTasks[taskId].data[15]].data[0] = 3;
}
if (gIntroFrameCounter == 624)
@@ -1388,17 +1393,17 @@ static void Task_IntroPokemonBattle(u8 taskId)
if (gIntroFrameCounter == 776)
{
gUnknown_0203931A = 1;
- gSprites[gTasks[taskId].data[4]].data0 = 2;
- gSprites[gTasks[taskId].data[5]].data0 = 2;
+ gSprites[gTasks[taskId].data[4]].data[0] = 2;
+ gSprites[gTasks[taskId].data[5]].data[0] = 2;
gTasks[gTasks[taskId].data[15]].data[0] = 0;
}
if (gIntroFrameCounter == 781)
{
sub_813D084(2);
- gSprites[gTasks[taskId].data[2]].data0 = 3;
- gSprites[gTasks[taskId].data[3]].data0 = 3;
- gSprites[gTasks[taskId].data[4]].data0 = 3;
- gSprites[gTasks[taskId].data[5]].data0 = 3;
+ gSprites[gTasks[taskId].data[2]].data[0] = 3;
+ gSprites[gTasks[taskId].data[3]].data[0] = 3;
+ gSprites[gTasks[taskId].data[4]].data[0] = 3;
+ gSprites[gTasks[taskId].data[5]].data[0] = 3;
spriteId = CreateSprite(&gSpriteTemplate_840B1F4, 0x78, 0x50, 15);
gSprites[spriteId].invisible = 1;
}
@@ -1785,7 +1790,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);
@@ -1833,18 +1838,18 @@ static void sub_813D0CC(struct Sprite *sprite)
{
u8 r0;
- if (sprite->data2 >= 192)
+ if (sprite->data[2] >= 192)
{
- if (sprite->data3 != 0)
+ if (sprite->data[3] != 0)
{
- sprite->data3--;
+ sprite->data[3]--;
}
else
{
sprite->invisible = FALSE;
- SetOamMatrix(sprite->data1, sprite->data2, 0, 0, sprite->data2);
- sprite->data2 = (sprite->data2 * 95) / 100;
- r0 = (sprite->data2 - 192) / 128 + 9;
+ SetOamMatrix(sprite->data[1], sprite->data[2], 0, 0, sprite->data[2]);
+ sprite->data[2] = (sprite->data[2] * 95) / 100;
+ r0 = (sprite->data[2] - 192) / 128 + 9;
if (r0 > 15)
r0 = 15;
sprite->oam.paletteNum = r0;
@@ -1858,14 +1863,14 @@ static void sub_813D0CC(struct Sprite *sprite)
static void sub_813D158(struct Sprite *sprite)
{
- if (gSprites[sprite->data7].data7 != 0)
+ if (gSprites[sprite->data[7]].data[7] != 0)
{
sprite->invisible = TRUE;
sprite->pos1.x += sprite->pos2.x;
sprite->pos1.y += sprite->pos2.y;
StartSpriteAnim(sprite, 3);
- sprite->data2 = 1024;
- sprite->data3 = 8 * (sprite->data1 & 3);
+ sprite->data[2] = 1024;
+ sprite->data[3] = 8 * (sprite->data[1] & 3);
sprite->callback = sub_813D0CC;
sprite->oam.shape = 1;
sprite->oam.size = 3;
@@ -1873,16 +1878,16 @@ static void sub_813D158(struct Sprite *sprite)
}
else
{
- sprite->pos2.x = gSprites[sprite->data7].pos2.x;
- sprite->pos2.y = gSprites[sprite->data7].pos2.y;
- sprite->pos1.x = gSprites[sprite->data7].pos1.x;
- sprite->pos1.y = gSprites[sprite->data7].pos1.y;
+ sprite->pos2.x = gSprites[sprite->data[7]].pos2.x;
+ sprite->pos2.y = gSprites[sprite->data[7]].pos2.y;
+ sprite->pos1.x = gSprites[sprite->data[7]].pos1.x;
+ sprite->pos1.y = gSprites[sprite->data[7]].pos1.y;
}
}
static void sub_813D208(struct Sprite *sprite)
{
- if (sprite->data0 != 0)
+ if (sprite->data[0] != 0)
sprite->callback = sub_813D220;
}
@@ -1894,7 +1899,7 @@ static void sub_813D220(struct Sprite *sprite)
sprite->pos2.y = 0;
sprite->pos1.x += 4;
sprite->pos2.x = -4;
- sprite->data4 = 128;
+ sprite->data[4] = 128;
sprite->callback = sub_813D368;
}
else
@@ -1912,58 +1917,58 @@ static void sub_813D220(struct Sprite *sprite)
s16 var4;
s16 temp;
- data4 = sprite->data4;
+ data4 = sprite->data[4];
sin1 = gSineTable[(u8)data4];
sin2 = gSineTable[(u8)(data4 + 64)];
- sprite->data4 += 2;
+ sprite->data[4] += 2;
sprite->pos2.y = sin1 / 32;
sprite->pos1.x--;
if (sprite->pos1.x & 1)
sprite->pos1.y++;
temp = -sin2 / 16;
- data2 = sprite->data2;
- data3 = sprite->data3;
+ data2 = sprite->data[2];
+ data3 = sprite->data[3];
sin3 = gSineTable[(u8)(temp - 16)];
sin4 = gSineTable[(u8)(temp + 48)];
var1 = sin4 * data2 / 256;
var2 = -sin3 * data3 / 256;
var3 = sin3 * data2 / 256;
var4 = sin4 * data3 / 256;
- SetOamMatrix(sprite->data1, data2, 0, 0, data3);
- SetOamMatrix(sprite->data1 + 1, var1, var3, var2, var4);
- SetOamMatrix(sprite->data1 + 2, var1, var3, var2 * 2, var4 * 2);
+ SetOamMatrix(sprite->data[1], data2, 0, 0, data3);
+ SetOamMatrix(sprite->data[1] + 1, var1, var3, var2, var4);
+ SetOamMatrix(sprite->data[1] + 2, var1, var3, var2 * 2, var4 * 2);
}
}
static void sub_813D368(struct Sprite *sprite)
{
- SetOamMatrix(sprite->data1, sprite->data6 + 64, 0, 0, sprite->data6 + 64);
- SetOamMatrix(sprite->data1 + 1, sprite->data6 + 64, 0, 0, sprite->data6 + 64);
- SetOamMatrix(sprite->data1 + 2, sprite->data6 + 64, 0, 0, sprite->data6 + 64);
- if (sprite->data4 != 64)
+ SetOamMatrix(sprite->data[1], sprite->data[6] + 64, 0, 0, sprite->data[6] + 64);
+ SetOamMatrix(sprite->data[1] + 1, sprite->data[6] + 64, 0, 0, sprite->data[6] + 64);
+ SetOamMatrix(sprite->data[1] + 2, sprite->data[6] + 64, 0, 0, sprite->data[6] + 64);
+ if (sprite->data[4] != 64)
{
u16 data4;
- sprite->data4 -= 8;
- data4 = sprite->data4;
+ sprite->data[4] -= 8;
+ data4 = sprite->data[4];
sprite->pos2.x = gSineTable[(u8)(data4 + 64)] / 64;
sprite->pos2.y = gSineTable[(u8)data4] / 64;
}
else
{
- sprite->data4 = 0;
+ sprite->data[4] = 0;
sprite->callback = sub_813D414;
}
}
static void sub_813D414(struct Sprite *sprite)
{
- if (sprite->data0 != 2)
+ if (sprite->data[0] != 2)
{
s16 r2;
- sprite->data4 += 8;
- r2 = gSineTable[(u8)sprite->data4] / 16 + 64;
+ sprite->data[4] += 8;
+ r2 = gSineTable[(u8)sprite->data[4]] / 16 + 64;
sprite->pos2.x = gSineTable[(u8)(r2 + 64)] / 64;
sprite->pos2.y = gSineTable[(u8)r2] / 64;
}
@@ -1975,19 +1980,19 @@ static void sub_813D414(struct Sprite *sprite)
static void SpriteCB_WaterDropFall(struct Sprite *sprite)
{
- if (sprite->pos1.y < sprite->data5)
+ if (sprite->pos1.y < sprite->data[5])
{
sprite->pos1.y += 4;
}
else
{
- sprite->data7 = 1;
+ sprite->data[7] = 1;
sprite->invisible = TRUE;
sprite->pos1.x += sprite->pos2.x;
sprite->pos1.y += sprite->pos2.y;
StartSpriteAnim(sprite, 3);
- sprite->data2 = 1024;
- sprite->data3 = 8 * (sprite->data1 & 3);
+ sprite->data[2] = 1024;
+ sprite->data[3] = 8 * (sprite->data[1] & 3);
sprite->callback = sub_813D0CC;
sprite->oam.shape = 1;
sprite->oam.size = 3;
@@ -1998,19 +2003,19 @@ static void SpriteCB_WaterDropFall(struct Sprite *sprite)
//Duplicate function
static void SpriteCB_WaterDropFall_2(struct Sprite *sprite)
{
- if (sprite->pos1.y < sprite->data5)
+ if (sprite->pos1.y < sprite->data[5])
{
sprite->pos1.y += 4;
}
else
{
- sprite->data7 = 1;
+ sprite->data[7] = 1;
sprite->invisible = TRUE;
sprite->pos1.x += sprite->pos2.x;
sprite->pos1.y += sprite->pos2.y;
StartSpriteAnim(sprite, 3);
- sprite->data2 = 1024;
- sprite->data3 = 8 * (sprite->data1 & 3);
+ sprite->data[2] = 1024;
+ sprite->data[3] = 8 * (sprite->data[1] & 3);
sprite->callback = sub_813D0CC;
sprite->oam.shape = 1;
sprite->oam.size = 3;
@@ -2024,13 +2029,13 @@ static u8 CreateWaterDrop(s16 x, s16 y, u16 c, u16 d, u16 e, u8 fallImmediately)
u8 oldSpriteId;
spriteId = CreateSprite(&gSpriteTemplate_840AE20, x, y, 0);
- gSprites[spriteId].data0 = 0;
- gSprites[spriteId].data7 = 0;
- gSprites[spriteId].data1 = d;
- gSprites[spriteId].data2 = c;
- gSprites[spriteId].data3 = c;
- gSprites[spriteId].data5 = e;
- gSprites[spriteId].data6 = c;
+ gSprites[spriteId].data[0] = 0;
+ gSprites[spriteId].data[7] = 0;
+ gSprites[spriteId].data[1] = d;
+ gSprites[spriteId].data[2] = c;
+ gSprites[spriteId].data[3] = c;
+ gSprites[spriteId].data[5] = e;
+ gSprites[spriteId].data[6] = c;
gSprites[spriteId].oam.affineMode = 3;
gSprites[spriteId].oam.matrixNum = d;
CalcCenterToCornerVec(&gSprites[spriteId], 0, 2, 2);
@@ -2042,16 +2047,16 @@ static u8 CreateWaterDrop(s16 x, s16 y, u16 c, u16 d, u16 e, u8 fallImmediately)
oldSpriteId = spriteId;
spriteId = CreateSprite(&gSpriteTemplate_840AE20, x, y, 0);
- gSprites[spriteId].data7 = oldSpriteId;
- gSprites[spriteId].data1 = d + 1;
+ gSprites[spriteId].data[7] = oldSpriteId;
+ gSprites[spriteId].data[1] = d + 1;
gSprites[spriteId].oam.affineMode = 3;
gSprites[spriteId].oam.matrixNum = d + 1;
CalcCenterToCornerVec(&gSprites[spriteId], 0, 2, 2);
gSprites[spriteId].callback = sub_813D158;
spriteId = CreateSprite(&gSpriteTemplate_840AE20, x, y, 0);
- gSprites[spriteId].data7 = oldSpriteId;
- gSprites[spriteId].data1 = d + 2;
+ gSprites[spriteId].data[7] = oldSpriteId;
+ gSprites[spriteId].data[1] = d + 2;
StartSpriteAnim(&gSprites[spriteId], 1);
gSprites[spriteId].oam.affineMode = 3;
gSprites[spriteId].oam.matrixNum = d + 2;
@@ -2067,7 +2072,7 @@ static u8 CreateWaterDrop(s16 x, s16 y, u16 c, u16 d, u16 e, u8 fallImmediately)
static void sub_813D788(struct Sprite *sprite)
{
- switch (sprite->data0)
+ switch (sprite->data[0])
{
case 0:
StartSpriteAnimIfDifferent(sprite, 0);
@@ -2119,7 +2124,7 @@ static void sub_813D788(struct Sprite *sprite)
static void sub_813D880(struct Sprite *sprite)
{
- switch (sprite->data0)
+ switch (sprite->data[0])
{
case 0:
break;
@@ -2127,30 +2132,30 @@ static void sub_813D880(struct Sprite *sprite)
if (sprite->pos2.x + sprite->pos1.x < 304)
sprite->pos2.x += 8;
else
- sprite->data0 = 2;
+ sprite->data[0] = 2;
break;
case 2:
if (sprite->pos2.x + sprite->pos1.x > 120)
sprite->pos2.x -= 1;
else
- sprite->data0 = 3;
+ sprite->data[0] = 3;
break;
case 3:
if (sprite->pos2.x > 0)
sprite->pos2.x -= 2;
break;
}
- sprite->pos2.y = Sin((u8)sprite->data1, 8) - gUnknown_0203935A;
- sprite->data1 += 4;
+ sprite->pos2.y = Sin((u8)sprite->data[1], 8) - gUnknown_0203935A;
+ sprite->data[1] += 4;
}
static void sub_813D908(struct Sprite *sprite)
{
- if (gTasks[sprite->data0].data[0] == 0)
+ if (gTasks[sprite->data[0]].data[0] == 0)
{
sprite->invisible = TRUE;
}
- else if (gTasks[sprite->data0].data[0] != 4)
+ else if (gTasks[sprite->data[0]].data[0] != 4)
{
sprite->invisible = FALSE;
}
@@ -2168,17 +2173,17 @@ static u8 CreateGameFreakLogo(s16 a, s16 b, u8 c)
for (i = 0; i < 9; i++)
{
spriteId = CreateSprite(&gSpriteTemplate_840AF94, gUnknown_0840AF50[i][1] + a, b - 4, 0);
- gSprites[spriteId].data0 = c;
+ gSprites[spriteId].data[0] = c;
StartSpriteAnim(&gSprites[spriteId], gUnknown_0840AF50[i][0]);
}
for (i = 0; i < 8; i++)
{
spriteId = CreateSprite(&gSpriteTemplate_840AFAC, gUnknown_0840AF74[i][1] + a, b + 12, 0);
- gSprites[spriteId].data0 = c;
+ gSprites[spriteId].data[0] = c;
StartSpriteAnim(&gSprites[spriteId], gUnknown_0840AF74[i][0]);
}
spriteId = CreateSprite(&gSpriteTemplate_840AFC4, 120, b - 4, 0);
- gSprites[spriteId].data0 = c;
+ gSprites[spriteId].data[0] = c;
return spriteId;
}
@@ -2186,9 +2191,9 @@ static u8 CreateGameFreakLogo(s16 a, s16 b, u8 c)
#ifdef NONMATCHING
static void sub_813DA64(struct Sprite *sprite)
{
- sprite->data7++;
+ sprite->data[7]++;
- switch (sprite->data0)
+ switch (sprite->data[0])
{
case 0:
default:
@@ -2196,10 +2201,10 @@ static void sub_813DA64(struct Sprite *sprite)
sprite->oam.matrixNum = 1;
CalcCenterToCornerVec(sprite, 1, 3, 3);
sprite->invisible = FALSE;
- sprite->data0 = 1;
- sprite->data1 = 128;
- sprite->data2 = -24;
- sprite->data3 = 0;
+ sprite->data[0] = 1;
+ sprite->data[1] = 128;
+ sprite->data[2] = -24;
+ sprite->data[3] = 0;
break;
case 1:
{
@@ -2211,33 +2216,33 @@ static void sub_813DA64(struct Sprite *sprite)
s16 r2;
//_0813DAC0
- if (sprite->data3 < 0x50)
+ if (sprite->data[3] < 0x50)
{
- sprite->pos2.y = -Sin((u8)sprite->data3, 0x78);
- sprite->pos2.x = -Sin((u8)sprite->data3, 0x8C);
- if (sprite->data3 > 64)
+ sprite->pos2.y = -Sin((u8)sprite->data[3], 0x78);
+ sprite->pos2.x = -Sin((u8)sprite->data[3], 0x8C);
+ if (sprite->data[3] > 64)
sprite->oam.priority = 3;
}
//_0813DAF8
- r3 = gSineTable[(u8)sprite->data2];
- sin1 = gSineTable[(u8)(sprite->data2 + 64)];
- r6 = sin1 * sprite->data1 / 256;
- foo = sin1 * sprite->data1 / 256;
- r5 = -r3 * sprite->data1 / 256;
- r2 = r3 * sprite->data1 / 256;
+ r3 = gSineTable[(u8)sprite->data[2]];
+ sin1 = gSineTable[(u8)(sprite->data[2] + 64)];
+ r6 = sin1 * sprite->data[1] / 256;
+ foo = sin1 * sprite->data[1] / 256;
+ r5 = -r3 * sprite->data[1] / 256;
+ r2 = r3 * sprite->data[1] / 256;
SetOamMatrix(1, r6, r2, r5, foo);
- if (sprite->data1 < 0x100)
- sprite->data1 += 8;
+ if (sprite->data[1] < 0x100)
+ sprite->data[1] += 8;
else
- sprite->data1 += 32;
- if (sprite->data2 < 0x18)
- sprite->data2 += 1;
- if (sprite->data3 < 64)
- sprite->data3 += 2;
- else if (!(sprite->data7 & 3))
- sprite->data3 += 1;
+ sprite->data[1] += 32;
+ if (sprite->data[2] < 0x18)
+ sprite->data[2] += 1;
+ if (sprite->data[3] < 64)
+ sprite->data[3] += 2;
+ else if (!(sprite->data[7] & 3))
+ sprite->data[3] += 1;
break;
}
}
@@ -2418,72 +2423,72 @@ _0813DB94:\n\
static void sub_813DB9C(struct Sprite *sprite)
{
- switch (sprite->data0)
+ switch (sprite->data[0])
{
case 0:
default:
- if (sprite->data2 != 0)
+ if (sprite->data[2] != 0)
sprite->hFlip = TRUE;
else
sprite->hFlip = FALSE;
- sprite->data0 = 1;
+ sprite->data[0] = 1;
//fall through
case 1:
if (sprite->pos1.y > 96)
{
sprite->pos1.y -= 4;
- if (sprite->data2 != 0)
+ if (sprite->data[2] != 0)
sprite->pos1.x += 2;
else
sprite->pos1.x -= 2;
}
else
{
- sprite->data0++;
- sprite->data3 = 8;
+ sprite->data[0]++;
+ sprite->data[3] = 8;
}
break;
case 2:
- if (sprite->data3 != 0)
+ if (sprite->data[3] != 0)
{
- sprite->data3--;
+ sprite->data[3]--;
}
else
{
- sprite->data0++;
- sprite->data3 = 0; //redundant?
+ sprite->data[0]++;
+ sprite->data[3] = 0; //redundant?
}
break;
case 3:
sprite->oam.affineMode = 3;
- sprite->oam.matrixNum = sprite->data1;
+ sprite->oam.matrixNum = sprite->data[1];
CalcCenterToCornerVec(sprite, 0, 3, 3);
- if (sprite->data2 != 0)
- SetOamMatrix(sprite->data1, -256, 0, 0, 256);
+ if (sprite->data[2] != 0)
+ SetOamMatrix(sprite->data[1], -256, 0, 0, 256);
else
- SetOamMatrix(sprite->data1, 256, 0, 0, 256);
- sprite->data0++;
- sprite->data4 = 0;
+ SetOamMatrix(sprite->data[1], 256, 0, 0, 256);
+ sprite->data[0]++;
+ sprite->data[4] = 0;
break;
case 4:
- sprite->data4++;
+ sprite->data[4]++;
if (sprite->pos1.y + sprite->pos2.y > -32
&& sprite->pos1.x + sprite->pos2.x > -64)
{
u16 r2;
- sprite->pos2.y = -(sprite->data4 * sprite->data4) / 8;
- if (sprite->data2 != 0)
- sprite->pos2.x += sprite->data4;
+ sprite->pos2.y = -(sprite->data[4] * sprite->data[4]) / 8;
+ if (sprite->data[2] != 0)
+ sprite->pos2.x += sprite->data[4];
else
- sprite->pos2.x -= sprite->data4;
- if (sprite->data3 < 128)
- sprite->data3 += 8;
- r2 = 256 - sprite->data3;
- if (sprite->data2 != 0)
- SetOamMatrix(sprite->data1, -r2, 0, 0, r2);
+ sprite->pos2.x -= sprite->data[4];
+ if (sprite->data[3] < 128)
+ sprite->data[3] += 8;
+ r2 = 256 - sprite->data[3];
+ if (sprite->data[2] != 0)
+ SetOamMatrix(sprite->data[1], -r2, 0, 0, r2);
else
- SetOamMatrix(sprite->data1, r2, 0, 0, r2);
+ SetOamMatrix(sprite->data[1], r2, 0, 0, r2);
}
else
{
@@ -2494,50 +2499,50 @@ static void sub_813DB9C(struct Sprite *sprite)
static void sub_813DD58(struct Sprite *sprite)
{
- switch (sprite->data0)
+ switch (sprite->data[0])
{
case 0:
default:
sprite->invisible = FALSE;
sprite->oam.affineMode = 1;
- sprite->oam.matrixNum = sprite->data1;
- sprite->data3 = 2048;
- sprite->data0 = 1;
+ sprite->oam.matrixNum = sprite->data[1];
+ sprite->data[3] = 2048;
+ sprite->data[0] = 1;
//fall through
case 1:
- if (sprite->data3 > 256)
+ if (sprite->data[3] > 256)
{
- sprite->data3 -= 128;
- if (sprite->data2 != 0)
- SetOamMatrix(sprite->data1, -sprite->data3, 0, 0, sprite->data3);
+ sprite->data[3] -= 128;
+ if (sprite->data[2] != 0)
+ SetOamMatrix(sprite->data[1], -sprite->data[3], 0, 0, sprite->data[3]);
else
- SetOamMatrix(sprite->data1, sprite->data3, 0, 0, sprite->data3);
+ SetOamMatrix(sprite->data[1], sprite->data[3], 0, 0, sprite->data[3]);
}
else
{
- if (sprite->data2 != 0)
- SetOamMatrix(sprite->data1, -256, 0, 0, 256);
+ if (sprite->data[2] != 0)
+ SetOamMatrix(sprite->data[1], -256, 0, 0, 256);
else
- SetOamMatrix(sprite->data1, 256, 0, 0, 256);
- sprite->data0++;
+ SetOamMatrix(sprite->data[1], 256, 0, 0, 256);
+ sprite->data[0]++;
}
break;
case 2:
break;
case 3:
- sprite->data4++;
- sprite->pos2.y = sprite->data4 * sprite->data4 / 32;
- if (sprite->data2 != 0)
- sprite->pos2.x = sprite->data4 / 4;
+ sprite->data[4]++;
+ sprite->pos2.y = sprite->data[4] * sprite->data[4] / 32;
+ if (sprite->data[2] != 0)
+ sprite->pos2.x = sprite->data[4] / 4;
else
- sprite->pos2.x = -(sprite->data4 / 4);
+ sprite->pos2.x = -(sprite->data[4] / 4);
break;
}
}
static void sub_813DE70(struct Sprite *sprite)
{
- switch (sprite->data0)
+ switch (sprite->data[0])
{
case 0:
default:
@@ -2548,24 +2553,24 @@ static void sub_813DE70(struct Sprite *sprite)
else
{
StartSpriteAnim(sprite, 1);
- sprite->data6 = CreateSprite(&gSpriteTemplate_840B084, 16, 104, 100);
- sprite->data7 = CreateSprite(&gSpriteTemplate_840B084, 12, 106, 101);
- sprite->data0 = 1;
+ sprite->data[6] = CreateSprite(&gSpriteTemplate_840B084, 16, 104, 100);
+ sprite->data[7] = CreateSprite(&gSpriteTemplate_840B084, 12, 106, 101);
+ sprite->data[0] = 1;
}
break;
case 1:
break;
case 2:
StartSpriteAnim(sprite, 2);
- gSprites[sprite->data6].data0 = 1;
- gSprites[sprite->data7].data0 = 2;
- sprite->data0++;
+ gSprites[sprite->data[6]].data[0] = 1;
+ gSprites[sprite->data[7]].data[0] = 2;
+ sprite->data[0]++;
break;
case 3:
if (sprite->pos1.y > 160)
{
sprite->invisible = 1;
- sprite->data0 = 1;
+ sprite->data[0] = 1;
}
else
{
@@ -2577,37 +2582,37 @@ static void sub_813DE70(struct Sprite *sprite)
{
s16 r4, r5;
- r5 = gSprites[sprite->data6].pos1.x + gSprites[sprite->data6].pos2.x;
- r4 = gSprites[sprite->data6].pos1.y + gSprites[sprite->data6].pos2.y;
- DestroySprite(&gSprites[sprite->data6]);
- sprite->data6 = sub_813CE88(SPECIES_TORCHIC, r5, r4, 2, 1);
- gSprites[sprite->data6].callback = sub_813DD58;
- gSprites[sprite->data6].invisible = TRUE;
- gSprites[sprite->data6].data1 = 1;
- gSprites[sprite->data6].data2 = 1;
+ r5 = gSprites[sprite->data[6]].pos1.x + gSprites[sprite->data[6]].pos2.x;
+ r4 = gSprites[sprite->data[6]].pos1.y + gSprites[sprite->data[6]].pos2.y;
+ DestroySprite(&gSprites[sprite->data[6]]);
+ sprite->data[6] = sub_813CE88(SPECIES_TORCHIC, r5, r4, 2, 1);
+ gSprites[sprite->data[6]].callback = sub_813DD58;
+ gSprites[sprite->data[6]].invisible = TRUE;
+ gSprites[sprite->data[6]].data[1] = 1;
+ gSprites[sprite->data[6]].data[2] = 1;
sub_813E580(r5, r4);
- r5 = gSprites[sprite->data7].pos1.x + gSprites[sprite->data7].pos2.x;
- r4 = gSprites[sprite->data7].pos1.y + gSprites[sprite->data7].pos2.y;
- DestroySprite(&gSprites[sprite->data7]);
- sprite->data7 = sub_813CE88(SPECIES_MUDKIP, r5, r4, 3, 1);
- gSprites[sprite->data7].callback = sub_813DD58;
- gSprites[sprite->data7].invisible = TRUE;
- gSprites[sprite->data7].data1 = 2;
- gSprites[sprite->data7].data2 = 0;
+ r5 = gSprites[sprite->data[7]].pos1.x + gSprites[sprite->data[7]].pos2.x;
+ r4 = gSprites[sprite->data[7]].pos1.y + gSprites[sprite->data[7]].pos2.y;
+ DestroySprite(&gSprites[sprite->data[7]]);
+ sprite->data[7] = sub_813CE88(SPECIES_MUDKIP, r5, r4, 3, 1);
+ gSprites[sprite->data[7]].callback = sub_813DD58;
+ gSprites[sprite->data[7]].invisible = TRUE;
+ gSprites[sprite->data[7]].data[1] = 2;
+ gSprites[sprite->data[7]].data[2] = 0;
sub_813E580(r5, r4);
BeginNormalPaletteFade(0xFF0000, 0, 16, 16, RGB(31, 23, 31));
- sprite->data0 = 1;
+ sprite->data[0] = 1;
break;
}
case 5:
- gSprites[sprite->data6].data0 = 3;
- gSprites[sprite->data7].data0 = 3;
+ gSprites[sprite->data[6]].data[0] = 3;
+ gSprites[sprite->data[7]].data[0] = 3;
break;
case 6:
- DestroySprite(&gSprites[sprite->data6]);
- DestroySprite(&gSprites[sprite->data7]);
+ DestroySprite(&gSprites[sprite->data[6]]);
+ DestroySprite(&gSprites[sprite->data[7]]);
DestroySprite(sprite);
break;
}
@@ -2615,7 +2620,7 @@ static void sub_813DE70(struct Sprite *sprite)
static void sub_813E10C(struct Sprite *sprite)
{
- switch (sprite->data0)
+ switch (sprite->data[0])
{
case 0:
default:
@@ -2626,20 +2631,20 @@ static void sub_813E10C(struct Sprite *sprite)
}
else
{
- sprite->data6 = sprite->pos1.x;
- sprite->data7 = sprite->pos1.y;
+ sprite->data[6] = sprite->pos1.x;
+ sprite->data[7] = sprite->pos1.y;
sprite->pos1.x += sprite->pos2.x;
sprite->pos1.y += sprite->pos2.y;
sprite->pos2.x = 0;
sprite->pos2.y = 0;
- sprite->data0 = 1;
- sprite->data1 = 0;
+ sprite->data[0] = 1;
+ sprite->data[1] = 0;
}
break;
case 1:
- if (!(sprite->data1 & 1))
+ if (!(sprite->data[1] & 1))
{
- if (sprite->data1 & 2)
+ if (sprite->data[1] & 2)
{
sprite->pos2.x = -1;
sprite->pos2.y = 1;
@@ -2650,18 +2655,18 @@ static void sub_813E10C(struct Sprite *sprite)
sprite->pos2.y = 0;
}
}
- sprite->data1++;
+ sprite->data[1]++;
break;
case 2:
sprite->invisible = TRUE;
- sprite->pos1.x = sprite->data6;
- sprite->pos1.y = sprite->data7;
+ sprite->pos1.x = sprite->data[6];
+ sprite->pos1.y = sprite->data[7];
sprite->pos2.x = 0;
sprite->pos2.y = 0;
break;
case 3:
sprite->invisible = FALSE;
- sprite->data1++;
+ sprite->data[1]++;
//fall through
case 4:
if (sprite->pos2.x > -56)
@@ -2675,7 +2680,7 @@ static void sub_813E10C(struct Sprite *sprite)
sprite->pos1.y += sprite->pos2.y;
sprite->pos2.x = 0;
sprite->pos2.y = 0;
- sprite->data0 = 1;
+ sprite->data[0] = 1;
}
break;
}
@@ -2683,7 +2688,7 @@ static void sub_813E10C(struct Sprite *sprite)
static void sub_813E210(struct Sprite *sprite)
{
- switch (sprite->data0)
+ switch (sprite->data[0])
{
case 0:
default:
@@ -2694,20 +2699,20 @@ static void sub_813E210(struct Sprite *sprite)
}
else
{
- sprite->data6 = sprite->pos1.x;
- sprite->data7 = sprite->pos1.y;
+ sprite->data[6] = sprite->pos1.x;
+ sprite->data[7] = sprite->pos1.y;
sprite->pos1.x += sprite->pos2.x;
sprite->pos1.y += sprite->pos2.y;
sprite->pos2.x = 0;
sprite->pos2.y = 0;
- sprite->data0 = 1;
- sprite->data1 = 0;
+ sprite->data[0] = 1;
+ sprite->data[1] = 0;
}
break;
case 1:
- if (!(sprite->data1 & 1))
+ if (!(sprite->data[1] & 1))
{
- if (sprite->data1 & 2)
+ if (sprite->data[1] & 2)
{
sprite->pos2.x = 1;
sprite->pos2.y = -1;
@@ -2718,18 +2723,18 @@ static void sub_813E210(struct Sprite *sprite)
sprite->pos2.y = 0;
}
}
- sprite->data1++;
+ sprite->data[1]++;
break;
case 2:
sprite->invisible = TRUE;
- sprite->pos1.x = sprite->data6;
- sprite->pos1.y = sprite->data7;
+ sprite->pos1.x = sprite->data[6];
+ sprite->pos1.y = sprite->data[7];
sprite->pos2.x = 0;
sprite->pos2.y = 0;
break;
case 3:
sprite->invisible = FALSE;
- sprite->data1++;
+ sprite->data[1]++;
//fall through
case 4:
if (sprite->pos2.x < 56)
@@ -2743,7 +2748,7 @@ static void sub_813E210(struct Sprite *sprite)
sprite->pos1.y += sprite->pos2.y;
sprite->pos2.x = 0;
sprite->pos2.y = 0;
- sprite->data0 = 1;
+ sprite->data[0] = 1;
}
break;
}
@@ -2753,8 +2758,8 @@ static void sub_813E30C(struct Sprite *sprite)
{
u16 r4, r1;
- sprite->data7++;
- switch (sprite->data0)
+ sprite->data[7]++;
+ switch (sprite->data[0])
{
case 0:
default:
@@ -2762,43 +2767,43 @@ static void sub_813E30C(struct Sprite *sprite)
case 1:
sprite->oam.affineMode = 1;
sprite->oam.matrixNum = 1;
- sprite->data0 = 10;
- sprite->data4 = 36;
+ sprite->data[0] = 10;
+ sprite->data[4] = 36;
//fall through
case 10:
if (sprite->pos1.x <= 144)
{
sprite->pos1.x += 4;
sprite->pos1.y -= 1;
- sprite->pos2.y = -Sin((u8)sprite->data2, 24);
- sprite->data2 += 4;
+ sprite->pos2.y = -Sin((u8)sprite->data[2], 24);
+ sprite->data[2] += 4;
}
- sprite->data3 -= sprite->data4;
- if ((sprite->data7 & 1) && sprite->data4 != 0)
- sprite->data4--;
- r4 = gSineTable[(u8)sprite->data3];
- r1 = gSineTable[(u8)(sprite->data3 + 64)];
+ sprite->data[3] -= sprite->data[4];
+ if ((sprite->data[7] & 1) && sprite->data[4] != 0)
+ sprite->data[4]--;
+ r4 = gSineTable[(u8)sprite->data[3]];
+ r1 = gSineTable[(u8)(sprite->data[3] + 64)];
SetOamMatrix(1, r1, r4, -r4, r1);
break;
case 2:
sprite->oam.affineMode = 1;
sprite->oam.matrixNum = 2;
- sprite->data0 = 20;
- sprite->data4 = 36;
+ sprite->data[0] = 20;
+ sprite->data[4] = 36;
//fall through
case 20:
if (sprite->pos1.x <= 96)
{
sprite->pos1.x += 3;
sprite->pos1.y -= 1;
- sprite->pos2.y = -Sin((u8)sprite->data2, 24);
- sprite->data2 += 4;
+ sprite->pos2.y = -Sin((u8)sprite->data[2], 24);
+ sprite->data[2] += 4;
}
- sprite->data3 -= sprite->data4;
- if ((sprite->data7 & 1) && sprite->data4 != 0)
- sprite->data4--;
- r4 = gSineTable[(u8)sprite->data3];
- r1 = gSineTable[(u8)(sprite->data3 + 64)];
+ sprite->data[3] -= sprite->data[4];
+ if ((sprite->data[7] & 1) && sprite->data[4] != 0)
+ sprite->data[4]--;
+ r4 = gSineTable[(u8)sprite->data[3]];
+ r1 = gSineTable[(u8)(sprite->data[3] + 64)];
SetOamMatrix(2, r1, r4, -r4, r1);
break;
}
@@ -2810,27 +2815,27 @@ static void sub_813E4B8(struct Sprite *sprite)
u16 r2;
u16 r1;
- sprite->data7++;
- if (sprite->data7 & 1)
+ sprite->data[7]++;
+ if (sprite->data[7] & 1)
sprite->invisible = FALSE;
else
sprite->invisible = TRUE;
- if (sprite->data2 >= 64)
+ if (sprite->data[2] >= 64)
{
DestroySprite(sprite);
return;
}
- sprite->data2 += 2;
- r4 = Sin((u8)sprite->data2, 40);
- sprite->pos2.x = Cos((u8)(sprite->data0 * 32), r4);
- sprite->pos2.y = Sin((u8)(sprite->data0 * 32), r4);
- if (sprite->data0 == 0)
- {
- sprite->data3 -= sprite->data1;
- if ((sprite->data7 & 1) && sprite->data1 != 0)
- sprite->data1--;
- r2 = gSineTable[(u8)sprite->data3];
- r1 = gSineTable[(u8)(sprite->data3 + 64)];
+ sprite->data[2] += 2;
+ r4 = Sin((u8)sprite->data[2], 40);
+ sprite->pos2.x = Cos((u8)(sprite->data[0] * 32), r4);
+ sprite->pos2.y = Sin((u8)(sprite->data[0] * 32), r4);
+ if (sprite->data[0] == 0)
+ {
+ sprite->data[3] -= sprite->data[1];
+ if ((sprite->data[7] & 1) && sprite->data[1] != 0)
+ sprite->data[1]--;
+ r2 = gSineTable[(u8)sprite->data[3]];
+ r1 = gSineTable[(u8)(sprite->data[3] + 64)];
SetOamMatrix(16, r1, r2, -r2, r1);
}
}
@@ -2845,8 +2850,8 @@ static void sub_813E580(u16 x, u16 y)
spriteId = CreateSprite(&gSpriteTemplate_840B0B0, x, y, 0);
gSprites[spriteId].oam.affineMode = 1;
gSprites[spriteId].oam.matrixNum = 16;
- gSprites[spriteId].data0 = i;
- gSprites[spriteId].data1 = 32;
+ gSprites[spriteId].data[0] = i;
+ gSprites[spriteId].data[1] = 32;
}
}
@@ -2858,16 +2863,16 @@ static void sub_813E5E0(struct Sprite *sprite)
}
else
{
- sprite->invisible = gSprites[sprite->data0].invisible;
- if (sprite->data7 < 12)
- sprite->data7++;
- sprite->data6 += 4;
- sprite->pos1.x = sprite->data4 + gSineTable[(u8)(sprite->data3 + 64)] * sprite->data6 / 256;
+ sprite->invisible = gSprites[sprite->data[0]].invisible;
+ if (sprite->data[7] < 12)
+ sprite->data[7]++;
+ sprite->data[6] += 4;
+ sprite->pos1.x = sprite->data[4] + gSineTable[(u8)(sprite->data[3] + 64)] * sprite->data[6] / 256;
//This useless '+ 0' is needed to make the asm match
- sprite->pos1.y = sprite->data5 + gSineTable[(u8)(sprite->data3 + 0)] * sprite->data6 / 256;
- sprite->pos2.y = gSineTable[(u8)(sprite->data1 + 0)] * sprite->data7 / 256;
- sprite->data1 += 16;
- if (sprite->pos1.y > sprite->data2)
+ sprite->pos1.y = sprite->data[5] + gSineTable[(u8)(sprite->data[3] + 0)] * sprite->data[6] / 256;
+ sprite->pos2.y = gSineTable[(u8)(sprite->data[1] + 0)] * sprite->data[7] / 256;
+ sprite->data[1] += 16;
+ if (sprite->pos1.y > sprite->data[2])
DestroySprite(sprite);
}
}
@@ -2885,15 +2890,15 @@ static void sub_813E6C0(struct Sprite *sprite)
}
else
{
- sprite->data7++;
+ sprite->data[7]++;
sprite->invisible = TRUE;
- if (gSprites[sprite->data0].data0 == 1 && !(sprite->data7 & 3))
+ if (gSprites[sprite->data[0]].data[0] == 1 && !(sprite->data[7] & 3))
{
- var1 = sprite->data1 + gSprites[sprite->data0].pos1.x;
- var2 = sprite->data2 + gSprites[sprite->data0].pos1.y;
+ var1 = sprite->data[1] + gSprites[sprite->data[0]].pos1.x;
+ var2 = sprite->data[2] + gSprites[sprite->data[0]].pos1.y;
for (i = 0; i < 3; i++)
{
- u8 r3 = gSprites[sprite->data0].subpriority - 1;
+ u8 r3 = gSprites[sprite->data[0]].subpriority - 1;
//Make redundant copies of these variables to get the asm to match
s16 _var1 = var1;
s16 _var2 = var2;
@@ -2901,13 +2906,13 @@ static void sub_813E6C0(struct Sprite *sprite)
spriteId = CreateSprite(&gSpriteTemplate_840B0DC, _var1, _var2, r3);
if (spriteId != 64)
{
- gSprites[spriteId].data0 = sprite->data0;
- gSprites[spriteId].data1 = (((sprite->data7 >> 2) & 7) << 5) + i * 85;
- gSprites[spriteId].data2 = sprite->data3;
- gSprites[spriteId].data3 = 104;
- gSprites[spriteId].data4 = var1;
- gSprites[spriteId].data5 = var2;
- gSprites[spriteId].data6 = 0;
+ gSprites[spriteId].data[0] = sprite->data[0];
+ gSprites[spriteId].data[1] = (((sprite->data[7] >> 2) & 7) << 5) + i * 85;
+ gSprites[spriteId].data[2] = sprite->data[3];
+ gSprites[spriteId].data[3] = 104;
+ gSprites[spriteId].data[4] = var1;
+ gSprites[spriteId].data[5] = var2;
+ gSprites[spriteId].data[6] = 0;
}
}
}
@@ -2921,10 +2926,10 @@ static void sub_813E7C0(u8 a)
spriteId = CreateSprite(&gSpriteTemplate_840B0F4, 0, 0, 0);
if (spriteId != 64)
{
- gSprites[spriteId].data0 = a;
- gSprites[spriteId].data1 = -12;
- gSprites[spriteId].data2 = 0;
- gSprites[spriteId].data3 = 136;
+ gSprites[spriteId].data[0] = a;
+ gSprites[spriteId].data[1] = -12;
+ gSprites[spriteId].data[2] = 0;
+ gSprites[spriteId].data[3] = 136;
}
}
@@ -2936,20 +2941,20 @@ static void sub_813E804(struct Sprite *sprite)
}
else
{
- sprite->invisible = gSprites[sprite->data0].invisible;
- sprite->data7++;
- if (sprite->data3 < 40)
- sprite->data3 += 2;
+ sprite->invisible = gSprites[sprite->data[0]].invisible;
+ sprite->data[7]++;
+ if (sprite->data[3] < 40)
+ sprite->data[3] += 2;
//This useless '+ 0' is needed to make the asm match
- sprite->pos1.x = gSprites[sprite->data0].pos1.x + gSprites[sprite->data0].pos2.x + gSineTable[(u8)(sprite->data1 + 64)] * sprite->data3 / 256;
- sprite->pos1.y = gSprites[sprite->data0].pos1.y + gSprites[sprite->data0].pos2.y + gSineTable[(u8)(sprite->data1 + 0)] * sprite->data3 / 512;
- sprite->data1 += 2;
- sprite->pos2.y = gSineTable[(u8)(sprite->data2 + 0)] / 32;
- sprite->data2 += 8;
- if ((sprite->data1 & 0xFF) < 128)
- sprite->subpriority = gSprites[sprite->data0].subpriority - 1;
+ sprite->pos1.x = gSprites[sprite->data[0]].pos1.x + gSprites[sprite->data[0]].pos2.x + gSineTable[(u8)(sprite->data[1] + 64)] * sprite->data[3] / 256;
+ sprite->pos1.y = gSprites[sprite->data[0]].pos1.y + gSprites[sprite->data[0]].pos2.y + gSineTable[(u8)(sprite->data[1] + 0)] * sprite->data[3] / 512;
+ sprite->data[1] += 2;
+ sprite->pos2.y = gSineTable[(u8)(sprite->data[2] + 0)] / 32;
+ sprite->data[2] += 8;
+ if ((sprite->data[1] & 0xFF) < 128)
+ sprite->subpriority = gSprites[sprite->data[0]].subpriority - 1;
else
- sprite->subpriority = gSprites[sprite->data0].subpriority + 1;
+ sprite->subpriority = gSprites[sprite->data[0]].subpriority + 1;
}
}
@@ -2963,8 +2968,8 @@ static void sub_813E930(u8 a)
spriteId = CreateSprite(&gSpriteTemplate_840B124, gSprites[a].pos1.x, gSprites[a].pos1.y, 0);
if (spriteId != 64)
{
- gSprites[spriteId].data0 = a;
- gSprites[spriteId].data1 = i * 32;
+ gSprites[spriteId].data[0] = a;
+ gSprites[spriteId].data[1] = i * 32;
}
}
}
@@ -2980,17 +2985,17 @@ static void sub_813E980(struct Sprite *sprite)
u8 r0;
u16 matrixNum;
- sprite->invisible = gSprites[sprite->data0].invisible;
- sprite->data7++;
- sprite->data6 += 8;
- sprite->pos1.x = sprite->data4 + gSineTable[(u8)(sprite->data3 + 64)] * sprite->data6 / 256;
- sprite->pos1.y = sprite->data5 + gSineTable[(u8)(sprite->data3 + 0)] * sprite->data6 / 256;
- r0 = sprite->data6 / 16;
+ sprite->invisible = gSprites[sprite->data[0]].invisible;
+ sprite->data[7]++;
+ sprite->data[6] += 8;
+ sprite->pos1.x = sprite->data[4] + gSineTable[(u8)(sprite->data[3] + 64)] * sprite->data[6] / 256;
+ sprite->pos1.y = sprite->data[5] + gSineTable[(u8)(sprite->data[3] + 0)] * sprite->data[6] / 256;
+ r0 = sprite->data[6] / 16;
if (r0 > 9)
r0 = 9;
matrixNum = (r0 + 18) & 31;
sprite->oam.matrixNum = matrixNum;
- if (sprite->data6 > 160)
+ if (sprite->data[6] > 160)
DestroySprite(sprite);
}
}
@@ -3007,26 +3012,26 @@ static void sub_813EA60(struct Sprite *sprite)
}
else
{
- sprite->data7++;
+ sprite->data[7]++;
sprite->invisible = TRUE;
- if (gSprites[sprite->data0].data0 == 1)
+ if (gSprites[sprite->data[0]].data[0] == 1)
{
- r6 = (sprite->data7 & 1);
+ r6 = (sprite->data[7] & 1);
if (!r6)
{
- r1 = sprite->data1 + gSprites[sprite->data0].pos1.x;
- r2 = sprite->data2 + gSprites[sprite->data0].pos1.y;
- spriteId = CreateSprite(&gSpriteTemplate_840B150, r1, r2, gSprites[sprite->data0].subpriority + 1);
+ r1 = sprite->data[1] + gSprites[sprite->data[0]].pos1.x;
+ r2 = sprite->data[2] + gSprites[sprite->data[0]].pos1.y;
+ spriteId = CreateSprite(&gSpriteTemplate_840B150, r1, r2, gSprites[sprite->data[0]].subpriority + 1);
if (spriteId != 64)
{
gSprites[spriteId].oam.affineMode = 3;
gSprites[spriteId].oam.matrixNum = 18;
CalcCenterToCornerVec(&gSprites[spriteId], 0, 1, 3);
- gSprites[spriteId].data0 = sprite->data0;
- gSprites[spriteId].data3 = gUnknown_0840B168[(sprite->data7 >> 1) & 7];
- gSprites[spriteId].data4 = r1;
- gSprites[spriteId].data5 = r2;
- gSprites[spriteId].data6 = r6;
+ gSprites[spriteId].data[0] = sprite->data[0];
+ gSprites[spriteId].data[3] = gUnknown_0840B168[(sprite->data[7] >> 1) & 7];
+ gSprites[spriteId].data[4] = r1;
+ gSprites[spriteId].data[5] = r2;
+ gSprites[spriteId].data[6] = r6;
}
}
}
@@ -3041,10 +3046,10 @@ static void InitIntroTorchicAttackAnim(u8 a)
spriteId = CreateSprite(&gSpriteTemplate_840B170, 0, 0, 0);
if (spriteId != 64)
{
- gSprites[spriteId].data0 = a;
- gSprites[spriteId].data1 = 0;
- gSprites[spriteId].data2 = 8;
- gSprites[spriteId].data3 = 24;
+ gSprites[spriteId].data[0] = a;
+ gSprites[spriteId].data[1] = 0;
+ gSprites[spriteId].data[2] = 8;
+ gSprites[spriteId].data[3] = 24;
}
for (i = 0; i < 10; i++)
{
@@ -3060,14 +3065,14 @@ static void sub_813EBBC(struct Sprite *sprite)
}
else
{
- sprite->invisible = gSprites[sprite->data0].invisible;
- sprite->data7 += 1;
- sprite->data6 += 8;
- sprite->pos1.x = sprite->data4 + gSineTable[(u8)(sprite->data3 + 64)] * sprite->data6 / 256;
- sprite->pos1.y = sprite->data5 + gSineTable[(u8)(sprite->data3 + 0)] * sprite->data6 / 256;
- sprite->pos2.y = gSineTable[(u8)(sprite->data1 + 0)] / 64;
- sprite->data1 += 16;
- if (sprite->pos1.y < sprite->data2)
+ sprite->invisible = gSprites[sprite->data[0]].invisible;
+ sprite->data[7] += 1;
+ sprite->data[6] += 8;
+ sprite->pos1.x = sprite->data[4] + gSineTable[(u8)(sprite->data[3] + 64)] * sprite->data[6] / 256;
+ sprite->pos1.y = sprite->data[5] + gSineTable[(u8)(sprite->data[3] + 0)] * sprite->data[6] / 256;
+ sprite->pos2.y = gSineTable[(u8)(sprite->data[1] + 0)] / 64;
+ sprite->data[1] += 16;
+ if (sprite->pos1.y < sprite->data[2])
DestroySprite(sprite);
}
}
@@ -3085,34 +3090,34 @@ static void sub_813EC90(struct Sprite *sprite)
}
else
{
- sprite->data7++;
+ sprite->data[7]++;
sprite->invisible = TRUE;
- if (gSprites[sprite->data0].data0 == 1)
+ if (gSprites[sprite->data[0]].data[0] == 1)
{
- r6 = sprite->data7 & 1;
+ r6 = sprite->data[7] & 1;
if (!r6)
{
- r1 = sprite->data1 + gSprites[sprite->data0].pos1.x;
- r2 = sprite->data2 + gSprites[sprite->data0].pos1.y;
- spriteId = CreateSprite(&gSpriteTemplate_840B1B0, r1, r2, gSprites[sprite->data0].subpriority + 1);
+ r1 = sprite->data[1] + gSprites[sprite->data[0]].pos1.x;
+ r2 = sprite->data[2] + gSprites[sprite->data[0]].pos1.y;
+ spriteId = CreateSprite(&gSpriteTemplate_840B1B0, r1, r2, gSprites[sprite->data[0]].subpriority + 1);
if (spriteId != 64)
{
gSprites[spriteId].oam.affineMode = 3;
gSprites[spriteId].oam.matrixNum = 17;
CalcCenterToCornerVec(&gSprites[spriteId], 0, 1, 3);
- gSprites[spriteId].data0 = sprite->data0;
- gSprites[spriteId].data1 = ((sprite->data7 >> 2) & 7) << 5;
- gSprites[spriteId].data2 = sprite->data3;
- gSprites[spriteId].data3 = 232;
- gSprites[spriteId].data4 = r1;
- gSprites[spriteId].data5 = r2;
- gSprites[spriteId].data6 = r6;
+ gSprites[spriteId].data[0] = sprite->data[0];
+ gSprites[spriteId].data[1] = ((sprite->data[7] >> 2) & 7) << 5;
+ gSprites[spriteId].data[2] = sprite->data[3];
+ gSprites[spriteId].data[3] = 232;
+ gSprites[spriteId].data[4] = r1;
+ gSprites[spriteId].data[5] = r2;
+ gSprites[spriteId].data[6] = r6;
}
}
- if (sprite->data6 < 112)
- sprite->data6 += 4;
+ if (sprite->data[6] < 112)
+ sprite->data[6] += 4;
}
- foo = 256 - gSineTable[(u8)sprite->data6] / 2;
+ foo = 256 - gSineTable[(u8)sprite->data[6]] / 2;
SetOamMatrix(17, foo, 0, 0, foo);
}
}
@@ -3124,10 +3129,10 @@ static void InitIntroMudkipAttackAnim(u8 a)
spriteId = CreateSprite(&gSpriteTemplate_840B1C8, 0, 0, 0);
if (spriteId != 64)
{
- gSprites[spriteId].data0 = a;
- gSprites[spriteId].data1 = 0;
- gSprites[spriteId].data2 = 12;
- gSprites[spriteId].data3 = 24;
+ gSprites[spriteId].data[0] = a;
+ gSprites[spriteId].data[1] = 0;
+ gSprites[spriteId].data[2] = 12;
+ gSprites[spriteId].data[3] = 24;
}
}
@@ -3136,8 +3141,8 @@ static void sub_813EDFC(struct Sprite *sprite)
u16 foo;
//I'm not sure why a switch statement was used here.
- //if (sprite->data0 != 1) would have been more appropriate.
- switch (sprite->data0)
+ //if (sprite->data[0] != 1) would have been more appropriate.
+ switch (sprite->data[0])
{
case 0:
default:
@@ -3145,23 +3150,23 @@ static void sub_813EDFC(struct Sprite *sprite)
sprite->oam.affineMode = 3;
sprite->oam.matrixNum = 18;
CalcCenterToCornerVec(sprite, 0, 3, 3);
- sprite->data1 = 0;
- sprite->data0 = 1;
+ sprite->data[1] = 0;
+ sprite->data[0] = 1;
//fall through
case 1:
break;
}
- sprite->data7++;
- if (sprite->data7 & 1)
+ sprite->data[7]++;
+ if (sprite->data[7] & 1)
{
sprite->invisible = TRUE;
}
else
{
sprite->invisible = FALSE;
- if (sprite->data1 < 64)
- sprite->data1++;
+ if (sprite->data[1] < 64)
+ sprite->data[1]++;
}
- foo = 256 - gSineTable[(u8)sprite->data1] / 2;
+ foo = 256 - gSineTable[(u8)sprite->data[1]] / 2;
SetOamMatrix(18, foo, 0, 0, foo);
}
diff --git a/src/scene/intro_credits_graphics.c b/src/scene/intro_credits_graphics.c
new file mode 100755
index 000000000..6cee74cce
--- /dev/null
+++ b/src/scene/intro_credits_graphics.c
@@ -0,0 +1,758 @@
+#include "global.h"
+#include "gba/m4a_internal.h"
+#include "intro.h"
+#include "data2.h"
+#include "decompress.h"
+#include "hall_of_fame.h"
+#include "intro_credits_graphics.h"
+#include "libgncmultiboot.h"
+#include "link.h"
+#include "m4a.h"
+#include "main.h"
+#include "new_game.h"
+#include "palette.h"
+#include "random.h"
+#include "save.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "constants/species.h"
+#include "task.h"
+#include "title_screen.h"
+#include "trig.h"
+#include "unknown_task.h"
+
+// define register constants for the inline asm
+asm(".include \"constants/gba_constants.inc\"\n");
+
+struct IntroCreditsSpriteMetadata
+{
+ u8 animNum:4;
+ u8 shape:2;
+ u8 size:2;
+ u8 x;
+ u8 y;
+ u8 subpriority;
+ u16 xOff;
+};
+
+const u16 gUnknown_084121FC[] = INCBIN_U16("graphics/intro/intro2_grass.gbapal");
+const u16 gUnknown_0841221C[] = INCBIN_U16("graphics/intro/intro2_grass_afternoon.gbapal");
+const u16 gUnknown_0841223C[] = INCBIN_U16("graphics/intro/intro2_grass_night.gbapal");
+const u8 gUnknown_0841225C[] = INCBIN_U8("graphics/intro/intro2_grass.4bpp.lz");
+const u8 gUnknown_084126DC[] = INCBIN_U8("graphics/intro/intro2_grass_map.bin.lz");
+const u16 gUnknown_08412818[] = INCBIN_U16("graphics/intro/8412818.gbapal");
+const u16 gUnknown_08412878[] = INCBIN_U16("graphics/intro/8412878.gbapal");
+const u8 gUnknown_084128D8[] = INCBIN_U8("graphics/intro/intro2_bgclouds.4bpp.lz");
+const u8 gUnknown_08412EB4[] = INCBIN_U8("graphics/intro/intro2_bgclouds_map.bin.lz");
+const u16 gUnknown_08413184[] = INCBIN_U16("graphics/intro/intro2_bgclouds.gbapal");
+const u16 gUnknown_084131A4[] = INCBIN_U16("graphics/intro/intro2_bgclouds_afternoon.gbapal");
+const u8 gUnknown_084131C4[] = INCBIN_U8("graphics/intro/intro2_bgclouds2.4bpp.lz");
+const u16 gUnknown_08413300[] = INCBIN_U16("graphics/intro/intro2_bgtrees2.gbapal");
+const u16 gUnknown_08413320[] = INCBIN_U16("graphics/intro/intro2_bgtrees2_afternoon.gbapal");
+const u8 gUnknown_08413340[] = INCBIN_U8("graphics/intro/intro2_bgtrees.4bpp.lz");
+const u8 gUnknown_084139C8[] = INCBIN_U8("graphics/intro/intro2_bgtrees_map.bin.lz");
+const u16 gUnknown_08413CCC[] = INCBIN_U16("graphics/intro/intro2_bgtrees.gbapal");
+const u8 gIntro2TreeTiles[] = INCBIN_U8("graphics/intro/intro2_bgtreessmall.4bpp.lz");
+const u16 gUnknown_08413E38[] = INCBIN_U16("graphics/intro/8413E38.gbapal");
+const u8 gUnknown_08413E78[] = INCBIN_U8("graphics/intro/intro2_bgnight.4bpp.lz"); // only used in credits, coupled with intro because bicycle sequence
+const u16 gUnknown_08414064[] = INCBIN_U16("graphics/intro/intro2_bgnight.gbapal");
+const u8 gUnknown_08414084[] = INCBIN_U8("graphics/intro/intro2_bgnight_map.bin.lz");
+const u8 gIntro2NightTiles[] = INCBIN_U8("graphics/intro/intro2_night.4bpp.lz");
+const u16 gIntro2BrendanPalette[] = INCBIN_U16("graphics/intro/intro2_brendan.gbapal");
+const u8 gIntro2BrendanTiles[] = INCBIN_U8("graphics/intro/intro2_brendan.4bpp.lz");
+const u16 gIntro2MayPalette[] = INCBIN_U16("graphics/intro/intro2_may.gbapal");
+const u16 gUnknown_08414F90[0xF0] = {0};
+const u8 gIntro2MayTiles[] = INCBIN_U8("graphics/intro/intro2_may.4bpp.lz");
+const u8 gIntro2BicycleTiles[] = INCBIN_U8("graphics/intro/intro2_bicycle.4bpp.lz");
+const u16 gIntro2LatiosPalette[] = INCBIN_U16("graphics/intro/intro2_latios.gbapal");
+const u8 gIntro2LatiosTiles[] = INCBIN_U8("graphics/intro/intro2_latios.4bpp.lz");
+const u16 gIntro2LatiasPalette[] = INCBIN_U16("graphics/intro/intro2_latias.gbapal");
+const u8 gIntro2LatiasTiles[] = INCBIN_U8("graphics/intro/intro2_latias.4bpp.lz");
+
+void sub_814910C(struct Sprite *sprite);
+void nullsub_82(struct Sprite *sprite);
+void sub_81492A0(struct Sprite *sprite);
+void nullsub_83(struct Sprite *sprite);
+
+const struct SpriteTemplate gSpriteTemplate_8416B3C = {
+ 2000, 0xFFFF, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_814910C
+};
+
+const struct CompressedSpriteSheet gUnknown_08416B54[] = {
+ { gUnknown_084131C4, 0x400, 2000 },
+ {}
+};
+
+const union AnimCmd gSpriteAnim_8416B64[] = {
+ ANIMCMD_FRAME( 0, 30),
+ ANIMCMD_END
+};
+
+const union AnimCmd gSpriteAnim_8416B6C[] = {
+ ANIMCMD_FRAME(16, 30),
+ ANIMCMD_END
+};
+
+const union AnimCmd gSpriteAnim_8416B74[] = {
+ ANIMCMD_FRAME(20, 30),
+ ANIMCMD_END
+};
+
+const union AnimCmd gSpriteAnim_8416B7C[] = {
+ ANIMCMD_FRAME(22, 30),
+ ANIMCMD_END
+};
+
+const union AnimCmd *const gSpriteAnimTable_8416B84[] = {
+ gSpriteAnim_8416B64,
+ gSpriteAnim_8416B6C,
+ gSpriteAnim_8416B74,
+ gSpriteAnim_8416B7C
+};
+
+const struct IntroCreditsSpriteMetadata gUnknown_08416B94[] = {
+ { 0, ST_OAM_SQUARE, 2, 72, 32, 100, 0xc00 },
+ { 0, ST_OAM_SQUARE, 2, 158, 32, 100, 0xc00 },
+ { 1, ST_OAM_SQUARE, 1, 192, 40, 101, 0x800 },
+ { 1, ST_OAM_SQUARE, 1, 56, 40, 101, 0x800 },
+ { 2, ST_OAM_H_RECTANGLE, 0, 100, 44, 102, 0x400 },
+ { 2, ST_OAM_H_RECTANGLE, 0, 152, 44, 102, 0x400 },
+ { 3, ST_OAM_H_RECTANGLE, 0, 8, 46, 103, 0x100 },
+ { 3, ST_OAM_H_RECTANGLE, 0, 56, 46, 103, 0x100 },
+ { 3, ST_OAM_H_RECTANGLE, 0, 240, 46, 103, 0x100 },
+};
+
+const struct CompressedSpriteSheet gUnknown_08416BDC[] = {
+ { gIntro2TreeTiles, 0x400, 2000 },
+ {}
+};
+
+const union AnimCmd gSpriteAnim_8416BEC[] = {
+ ANIMCMD_FRAME( 0, 30),
+ ANIMCMD_END
+};
+
+const union AnimCmd gSpriteAnim_8416BF4[] = {
+ ANIMCMD_FRAME(16, 30),
+ ANIMCMD_END
+};
+
+const union AnimCmd gSpriteAnim_8416BFC[] = {
+ ANIMCMD_FRAME(24, 30),
+ ANIMCMD_END
+};
+
+const union AnimCmd *const gSpriteAnimTable_8416C04[] = {
+ gSpriteAnim_8416BEC,
+ gSpriteAnim_8416BF4,
+ gSpriteAnim_8416BFC
+};
+
+const struct IntroCreditsSpriteMetadata gUnknown_08416C10[] = {
+ { 0, ST_OAM_SQUARE, 2, 16, 88, 100, 0x2000 },
+ { 0, ST_OAM_SQUARE, 2, 80, 88, 100, 0x2000 },
+ { 0, ST_OAM_SQUARE, 2, 144, 88, 100, 0x2000 },
+ { 0, ST_OAM_SQUARE, 2, 208, 88, 100, 0x2000 },
+ { 1, ST_OAM_V_RECTANGLE, 2, 40, 88, 101, 0x1000 },
+ { 1, ST_OAM_V_RECTANGLE, 2, 104, 88, 101, 0x1000 },
+ { 1, ST_OAM_V_RECTANGLE, 2, 168, 88, 101, 0x1000 },
+ { 1, ST_OAM_V_RECTANGLE, 2, 232, 88, 101, 0x1000 },
+ { 2, ST_OAM_V_RECTANGLE, 2, 56, 88, 102, 0x800 },
+ { 2, ST_OAM_V_RECTANGLE, 2, 120, 88, 102, 0x800 },
+ { 2, ST_OAM_V_RECTANGLE, 2, 184, 88, 102, 0x800 },
+ { 2, ST_OAM_V_RECTANGLE, 2, 248, 88, 102, 0x800 },
+};
+
+const struct CompressedSpriteSheet gUnknown_08416C70[] = {
+ { gIntro2NightTiles, 0x400, 2000 },
+ {}
+};
+
+const union AnimCmd gSpriteAnim_8416C80[] = {
+ ANIMCMD_FRAME(0, 30),
+ ANIMCMD_END
+};
+
+const union AnimCmd *const gSpriteAnimTable_8416C88[] = {
+ gSpriteAnim_8416C80
+};
+
+const struct IntroCreditsSpriteMetadata gUnknown_08416C8C[] = {
+ { 0, ST_OAM_SQUARE, 2, 24, 88, 100, 0x1000 },
+ { 0, ST_OAM_SQUARE, 2, 64, 88, 100, 0x1000 },
+ { 0, ST_OAM_SQUARE, 2, 104, 88, 100, 0x1000 },
+ { 0, ST_OAM_SQUARE, 2, 144, 88, 100, 0x1000 },
+ { 0, ST_OAM_SQUARE, 2, 184, 88, 100, 0x1000 },
+ { 0, ST_OAM_SQUARE, 2, 224, 88, 100, 0x1000 },
+};
+
+const struct OamData gOamData_8416CBC = {
+ .y = 160, .shape = ST_OAM_SQUARE, .size = 3, .priority = 1
+};
+
+const union AnimCmd gSpriteAnim_8416CC4[] = {
+ ANIMCMD_FRAME( 0, 8),
+ ANIMCMD_FRAME( 64, 8),
+ ANIMCMD_FRAME(128, 8),
+ ANIMCMD_FRAME(192, 8),
+ ANIMCMD_JUMP(0)
+};
+
+const union AnimCmd *const gSpriteAnimTable_8416CD8[] = {
+ gSpriteAnim_8416CC4
+};
+
+const struct SpriteTemplate gSpriteTemplate_8416CDC = {
+ 1002, 1002, &gOamData_8416CBC, gSpriteAnimTable_8416CD8, NULL, gDummySpriteAffineAnimTable, nullsub_82
+};
+
+const struct SpriteTemplate gSpriteTemplate_8416CF4 = {
+ 1003, 1003, &gOamData_8416CBC, gSpriteAnimTable_8416CD8, NULL, gDummySpriteAffineAnimTable, nullsub_82
+};
+
+const struct OamData gOamData_8416D0C = {
+ .y = 160, .shape = ST_OAM_H_RECTANGLE, .size = 3, .priority = 1
+};
+
+const union AnimCmd gSpriteAnim_8416D14[] = {
+ ANIMCMD_FRAME( 0, 8),
+ ANIMCMD_FRAME( 32, 8),
+ ANIMCMD_FRAME( 64, 8),
+ ANIMCMD_FRAME( 96, 8),
+ ANIMCMD_JUMP(0)
+};
+
+const union AnimCmd *const gSpriteAnimTable_8416D28[] = {
+ gSpriteAnim_8416D14
+};
+
+const struct SpriteTemplate gSpriteTemplate_Brendan = {
+ 1001, 1002, &gOamData_8416D0C, gSpriteAnimTable_8416D28, NULL, gDummySpriteAffineAnimTable, sub_81492A0
+};
+
+const struct SpriteTemplate gSpriteTemplate_May = {
+ 1001, 1003, &gOamData_8416D0C, gSpriteAnimTable_8416D28, NULL, gDummySpriteAffineAnimTable, sub_81492A0
+};
+
+const struct OamData gOamData_8416D5C = {
+ .y = 160, .shape = ST_OAM_SQUARE, .size = 3, .priority = 1
+};
+
+const union AnimCmd gSpriteAnim_8416D64[] = {
+ ANIMCMD_FRAME( 0, 16),
+ ANIMCMD_END
+};
+
+const union AnimCmd gSpriteAnim_8416D6C[] = {
+ ANIMCMD_FRAME( 64, 16),
+ ANIMCMD_END
+};
+
+const union AnimCmd *const gSpriteAnimTable_8416D74[] = {
+ gSpriteAnim_8416D64,
+ gSpriteAnim_8416D6C
+};
+
+const struct SpriteTemplate gSpriteTemplate_8416D7C = {
+ 1004, 1004, &gOamData_8416D5C, gSpriteAnimTable_8416D74, NULL, gDummySpriteAffineAnimTable, nullsub_83
+};
+
+const struct SpriteTemplate gSpriteTemplate_8416D94 = {
+ 1005, 1005, &gOamData_8416D5C, gSpriteAnimTable_8416D74, NULL, gDummySpriteAffineAnimTable, nullsub_83
+};
+
+const struct CompressedSpriteSheet gIntro2BrendanSpriteSheet[] = {
+ { gIntro2BrendanTiles, 0x3800, 1002 },
+ {}
+};
+const struct CompressedSpriteSheet gIntro2MaySpriteSheet[] = {
+ { gIntro2MayTiles, 0x3800, 1003 },
+ {}
+};
+const struct CompressedSpriteSheet gIntro2BicycleSpriteSheet[] = {
+ { gIntro2BicycleTiles, 0x1000, 1001 },
+ {}
+};
+const struct CompressedSpriteSheet gIntro2LatiosSpriteSheet[] = {
+ { gIntro2LatiosTiles, 0x1000, 1004 },
+ {}
+};
+const struct CompressedSpriteSheet gIntro2LatiasSpriteSheet[] = {
+ { gIntro2LatiasTiles, 0x1000, 1005 },
+ {}
+};
+
+const struct SpritePalette gIntro2SpritePalettes[] = {
+ {gIntro2BrendanPalette, 1002},
+ {gIntro2MayPalette, 1003},
+ {gIntro2LatiosPalette, 1004},
+ {gIntro2LatiasPalette, 1005},
+ {}
+};
+
+const struct CompressedSpriteSheet gUnknown_08416E24[] = {
+ { gIntro2BrendanTiles, 0x2000, 1002},
+ {}
+};
+
+const struct CompressedSpriteSheet gUnknown_08416E34[] = {
+ { gIntro2MayTiles, 0x2000, 1003},
+ {}
+};
+
+
+extern u16 gUnknown_02039358;
+extern s16 gUnknown_0203935A;
+extern s16 gUnknown_0203935C;
+extern u8 gReservedSpritePaletteCount;
+
+void sub_8149248();
+void sub_8149264();
+
+void load_intro_part2_graphics(u8 a)
+{
+ LZ77UnCompVram(&gUnknown_0841225C, (void *)(VRAM + 0x4000));
+ LZ77UnCompVram(&gUnknown_084126DC, (void *)(VRAM + 0x7800));
+ LoadPalette(&gUnknown_084121FC, 240, 32);
+ switch (a)
+ {
+ case 0:
+ default:
+ LZ77UnCompVram(&gUnknown_084128D8, (void *)(VRAM));
+ LZ77UnCompVram(&gUnknown_08412EB4, (void *)(VRAM + 0x3000));
+ LoadPalette(&gUnknown_08412818, 0, 96);
+ LoadCompressedObjectPic(gUnknown_08416B54);
+ LoadPalette(&gUnknown_08413184, 256, 32);
+ sub_8149248();
+ break;
+ case 1:
+ LZ77UnCompVram(&gUnknown_08413340, (void *)(VRAM));
+ LZ77UnCompVram(&gUnknown_084139C8, (void *)(VRAM + 0x3000));
+ LoadPalette(&gUnknown_08413300, 0, 32);
+ LoadCompressedObjectPic(gUnknown_08416BDC);
+ LoadPalette(&gUnknown_08413CCC, 256, 32);
+ sub_8149264();
+ break;
+ }
+ gUnknown_0203935C = 0;
+ gReservedSpritePaletteCount = 8;
+}
+
+void sub_8148C78(u8 a)
+{
+ if (a == 1)
+ {
+ REG_BG3CNT = 0x603;
+ REG_BG2CNT = 0x702;
+ REG_BG1CNT = 0xF05;
+ REG_DISPCNT = 0x1E40;
+ }
+ else
+ {
+ REG_BG3CNT = 0x603;
+ REG_BG2CNT = 0x702;
+ REG_BG1CNT = 0xF05;
+ REG_DISPCNT = 0x1E40;
+ }
+}
+
+void sub_8149280();
+
+void sub_8148CB0(u8 a)
+{
+ LZ77UnCompVram(&gUnknown_0841225C, (void *)(VRAM + 0x4000));
+ LZ77UnCompVram(&gUnknown_084126DC, (void *)(VRAM + 0x7800));
+ switch (a)
+ {
+ case 0:
+ default:
+ LoadPalette(&gUnknown_084121FC, 240, 32);
+ LZ77UnCompVram(&gUnknown_084128D8, (void *)(VRAM));
+ LZ77UnCompVram(&gUnknown_08412EB4, (void *)(VRAM + 0x3000));
+ LoadPalette(&gUnknown_08412818, 0, 96);
+ LoadCompressedObjectPic(gUnknown_08416B54);
+ LZ77UnCompVram(&gUnknown_084131C4, (void *)(VRAM + 0x10000));
+ LoadPalette(&gUnknown_08413184, 256, 32);
+ sub_8149248();
+ break;
+ case 1:
+ LoadPalette(&gUnknown_0841221C, 240, 32);
+ LZ77UnCompVram(&gUnknown_084128D8, (void *)(VRAM));
+ LZ77UnCompVram(&gUnknown_08412EB4, (void *)(VRAM + 0x3000));
+ LoadPalette(&gUnknown_08412878, 0, 96);
+ LoadCompressedObjectPic(gUnknown_08416B54);
+ LZ77UnCompVram(&gUnknown_084131C4, (void *)(VRAM + 0x10000));
+ LoadPalette(&gUnknown_084131A4, 256, 32);
+ sub_8149248();
+ break;
+ case 2:
+ case 3:
+ LoadPalette(&gUnknown_0841221C, 240, 32);
+ LZ77UnCompVram(&gUnknown_08413340, (void *)(VRAM));
+ LZ77UnCompVram(&gUnknown_084139C8, (void *)(VRAM + 0x3000));
+ LoadPalette(&gUnknown_08413320, 0, 32);
+ LoadCompressedObjectPic(gUnknown_08416BDC);
+ LoadPalette(&gUnknown_08413320, 256, 32);
+ sub_8149264();
+ break;
+ case 4:
+ LoadPalette(&gUnknown_0841223C, 240, 32);
+ LZ77UnCompVram(&gUnknown_08413E78, (void *)(VRAM));
+ LZ77UnCompVram(&gUnknown_08414084, (void *)(VRAM + 0x3000));
+ LoadPalette(&gUnknown_08413E38, 0, 64);
+ LoadCompressedObjectPic(gUnknown_08416C70);
+ LoadPalette(&gUnknown_08414064, 256, 32);
+ sub_8149280();
+ break;
+ }
+ gReservedSpritePaletteCount = 8;
+ gUnknown_0203935C = 0;
+}
+
+void sub_8148E90(u8 a)
+{
+ REG_BG3CNT = 0x603;
+ REG_BG2CNT = 0x702;
+ REG_BG1CNT = 0xF05;
+ REG_DISPCNT = 0x1F40;
+}
+
+u8 sub_8148EC0(u8 a, u16 b, u16 c, u16 d)
+{
+ u8 taskId = CreateTask(&sub_8148F3C, 0);
+
+ gTasks[taskId].data[0] = a;
+ gTasks[taskId].data[1] = b;
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].data[3] = 0;
+ gTasks[taskId].data[4] = c;
+ gTasks[taskId].data[5] = 0;
+ gTasks[taskId].data[6] = 0;
+ gTasks[taskId].data[7] = d;
+ gTasks[taskId].data[8] = 8;
+ gTasks[taskId].data[9] = 0;
+ sub_8148F3C(taskId);
+ return taskId;
+}
+
+#ifdef NONMATCHING
+void sub_8148F3C(u8 taskId)
+{
+ register u32 r4 asm("r4");
+ s32 r2;
+
+ r4 = (u16)gTasks[taskId].data[1] << 16;
+ if (r4 != 0)
+ {
+ r2 = (gTasks[taskId].data[2] << 16) + (u16)gTasks[taskId].data[3] - (r4 >> 12);
+ gTasks[taskId].data[2] = r2 >> 16;
+ gTasks[taskId].data[3] = r2;
+ REG_BG1HOFS = gTasks[taskId].data[2];
+ REG_BG1VOFS = gUnknown_0203935A + gUnknown_02039358;
+ }
+
+ r4 = (u16)gTasks[taskId].data[4] << 16;
+ if (r4 != 0)
+ {
+ r2 = (gTasks[taskId].data[5] << 16) + (u16)gTasks[taskId].data[6] - (r4 >> 12);
+ gTasks[taskId].data[5] = r2 >> 16;
+ gTasks[taskId].data[3] = r2;
+ REG_BG2HOFS = gTasks[taskId].data[5];
+ if (gTasks[taskId].data[0] != 0)
+ REG_BG2VOFS = gUnknown_0203935A + gUnknown_02039358;
+ else
+ REG_BG2VOFS = gUnknown_02039358;
+ }
+
+ r4 = (u16)gTasks[taskId].data[7] << 16;
+ if (r4 != 0)
+ {
+ r2 = (gTasks[taskId].data[8] << 16) + (u16)gTasks[taskId].data[9] - (r4 >> 12);;
+ gTasks[taskId].data[8] = r2 >> 16;
+ gTasks[taskId].data[9] = r2;
+ REG_BG3HOFS = gTasks[taskId].data[8];
+ REG_BG3VOFS = gUnknown_02039358;
+ }
+}
+#else
+__attribute__((naked))
+void sub_8148F3C(u8 taskId)
+{
+ asm(".syntax unified\n\
+ push {r4-r6,lr}\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ ldr r1, _08148FB4 @ =gTasks\n\
+ lsls r0, r5, 2\n\
+ adds r0, r5\n\
+ lsls r0, 3\n\
+ adds r3, r0, r1\n\
+ ldrh r0, [r3, 0xA]\n\
+ lsls r4, r0, 16\n\
+ adds r6, r1, 0\n\
+ cmp r4, 0\n\
+ beq _08148F7C\n\
+ movs r1, 0xC\n\
+ ldrsh r0, [r3, r1]\n\
+ lsls r0, 16\n\
+ ldrh r1, [r3, 0xE]\n\
+ adds r2, r0, r1\n\
+ lsrs r0, r4, 12\n\
+ subs r2, r0\n\
+ asrs r1, r2, 16\n\
+ strh r1, [r3, 0xC]\n\
+ strh r2, [r3, 0xE]\n\
+ ldr r0, _08148FB8 @ =REG_BG1HOFS\n\
+ strh r1, [r0]\n\
+ ldr r2, _08148FBC @ =REG_BG1VOFS\n\
+ ldr r1, _08148FC0 @ =gUnknown_02039358\n\
+ ldr r0, _08148FC4 @ =gUnknown_0203935A\n\
+ ldrh r0, [r0]\n\
+ ldrh r1, [r1]\n\
+ adds r0, r1\n\
+ strh r0, [r2]\n\
+_08148F7C:\n\
+ ldrh r0, [r3, 0x10]\n\
+ lsls r4, r0, 16\n\
+ cmp r4, 0\n\
+ beq _08148FD8\n\
+ movs r1, 0x12\n\
+ ldrsh r0, [r3, r1]\n\
+ lsls r0, 16\n\
+ ldrh r1, [r3, 0x14]\n\
+ adds r2, r0, r1\n\
+ lsrs r0, r4, 12\n\
+ subs r2, r0\n\
+ asrs r1, r2, 16\n\
+ strh r1, [r3, 0x12]\n\
+ strh r2, [r3, 0x14]\n\
+ ldr r0, _08148FC8 @ =REG_BG2HOFS\n\
+ strh r1, [r0]\n\
+ movs r1, 0x8\n\
+ ldrsh r0, [r3, r1]\n\
+ cmp r0, 0\n\
+ beq _08148FD0\n\
+ ldr r2, _08148FCC @ =REG_BG2VOFS\n\
+ ldr r1, _08148FC0 @ =gUnknown_02039358\n\
+ ldr r0, _08148FC4 @ =gUnknown_0203935A\n\
+ ldrh r0, [r0]\n\
+ ldrh r1, [r1]\n\
+ adds r0, r1\n\
+ strh r0, [r2]\n\
+ b _08148FD8\n\
+ .align 2, 0\n\
+_08148FB4: .4byte gTasks\n\
+_08148FB8: .4byte REG_BG1HOFS\n\
+_08148FBC: .4byte REG_BG1VOFS\n\
+_08148FC0: .4byte gUnknown_02039358\n\
+_08148FC4: .4byte gUnknown_0203935A\n\
+_08148FC8: .4byte REG_BG2HOFS\n\
+_08148FCC: .4byte REG_BG2VOFS\n\
+_08148FD0:\n\
+ ldr r0, _08149010 @ =REG_BG2VOFS\n\
+ ldr r1, _08149014 @ =gUnknown_02039358\n\
+ ldrh r1, [r1]\n\
+ strh r1, [r0]\n\
+_08148FD8:\n\
+ lsls r0, r5, 2\n\
+ adds r0, r5\n\
+ lsls r0, 3\n\
+ adds r3, r0, r6\n\
+ ldrh r0, [r3, 0x16]\n\
+ lsls r4, r0, 16\n\
+ cmp r4, 0\n\
+ beq _08149008\n\
+ movs r1, 0x18\n\
+ ldrsh r0, [r3, r1]\n\
+ lsls r0, 16\n\
+ ldrh r1, [r3, 0x1A]\n\
+ adds r2, r0, r1\n\
+ lsrs r0, r4, 12\n\
+ subs r2, r0\n\
+ asrs r1, r2, 16\n\
+ strh r1, [r3, 0x18]\n\
+ strh r2, [r3, 0x1A]\n\
+ ldr r0, _08149018 @ =REG_BG3HOFS\n\
+ strh r1, [r0]\n\
+ ldr r1, _0814901C @ =REG_BG3VOFS\n\
+ ldr r0, _08149014 @ =gUnknown_02039358\n\
+ ldrh r0, [r0]\n\
+ strh r0, [r1]\n\
+_08149008:\n\
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_08149010: .4byte REG_BG2VOFS\n\
+_08149014: .4byte gUnknown_02039358\n\
+_08149018: .4byte REG_BG3HOFS\n\
+_0814901C: .4byte REG_BG3VOFS\n\
+ .syntax divided\n");
+}
+#endif
+
+void sub_8149020(u8 mode)
+{
+ u16 x;
+ u16 y;
+ switch (mode)
+ {
+ case 0:
+ default:
+ /* stuff */
+ if (gMain.vblankCounter1 & 3 || gPaletteFade.active)
+ break;
+ if (gMain.vblankCounter1 & 4)
+ {
+ x = gPlttBufferUnfaded[9];
+ y = gPlttBufferUnfaded[10];
+ }
+ else
+ {
+ x = gPlttBufferUnfaded[10];
+ y = gPlttBufferUnfaded[9];
+ }
+ LoadPalette(&x, 9, 2);
+ LoadPalette(&y, 10, 2);
+ break;
+ case 2:
+ if (gMain.vblankCounter1 & 3 || gPaletteFade.active)
+ break;
+ if (gMain.vblankCounter1 & 4)
+ {
+ x = 0x3D27;
+ y = 0x295;
+ }
+ else
+ {
+ x = 0x31C;
+ y = 0x3D27;
+ }
+ LoadPalette(&x, 12, 2);
+ LoadPalette(&y, 13, 2);
+ break;
+ case 1:
+ break;
+ }
+}
+
+void sub_814910C(struct Sprite *sprite)
+{
+ if (gUnknown_0203935C)
+ {
+ DestroySprite(sprite);
+ }
+ else
+ {
+ s32 var = ((sprite->pos1.x << 16) | (u16)sprite->data[2]) + (u16)sprite->data[1];
+ sprite->pos1.x = var >> 16;
+ sprite->data[2] = var;
+ if (sprite->pos1.x > 255) sprite->pos1.x = 0xFFE0;
+ if (sprite->data[0])
+ {
+ sprite->pos2.y = -(gUnknown_02039358 + gUnknown_0203935A);
+ }
+ else
+ {
+ sprite->pos2.y = -gUnknown_02039358;
+ }
+ }
+}
+
+void sub_8149174(u8 a, const struct IntroCreditsSpriteMetadata *b, const union AnimCmd *const *c, u8 d)
+{
+ u8 i;
+
+ for(i = 0; i < d; i++)
+ {
+ u8 sprite = CreateSprite(&gSpriteTemplate_8416B3C, b[i].x, b[i].y, b[i].subpriority);
+ CalcCenterToCornerVec(&gSprites[sprite], b[i].shape, b[i].size, 0);
+ gSprites[sprite].oam.priority = 3;
+ gSprites[sprite].oam.shape = b[i].shape;
+ gSprites[sprite].oam.size = b[i].size;
+ gSprites[sprite].oam.paletteNum = 0;
+ gSprites[sprite].anims = c;
+ StartSpriteAnim(&gSprites[sprite], b[i].animNum);
+ gSprites[sprite].data[0] = a;
+ gSprites[sprite].data[1] = b[i].xOff;
+ gSprites[sprite].data[2] = 0;
+ }
+}
+
+void sub_8149248()
+{
+ sub_8149174(0, gUnknown_08416B94, gSpriteAnimTable_8416B84, 9);
+}
+
+void sub_8149264()
+{
+ sub_8149174(1, gUnknown_08416C10, gSpriteAnimTable_8416C04, 12);
+}
+
+void sub_8149280()
+{
+ sub_8149174(1, gUnknown_08416C8C, gSpriteAnimTable_8416C88, 6);
+}
+
+void nullsub_82(struct Sprite *sprite)
+{
+}
+
+void sub_81492A0(struct Sprite* sprite)
+{
+ sprite->invisible = gSprites[sprite->data[0]].invisible;
+ sprite->pos1.x = gSprites[sprite->data[0]].pos1.x;
+ sprite->pos1.y = gSprites[sprite->data[0]].pos1.y + 8;
+ sprite->pos2.x = gSprites[sprite->data[0]].pos2.x;
+ sprite->pos2.y = gSprites[sprite->data[0]].pos2.y;
+}
+
+
+
+u8 intro_create_brendan_sprite(s16 a, s16 b)
+{
+ u8 sprite = CreateSprite(&gSpriteTemplate_8416CDC, a, b, 0);
+ u8 brendan = CreateSprite(&gSpriteTemplate_Brendan, a, b + 8, 1);
+ gSprites[brendan].data[0] = sprite;
+ return sprite;
+}
+
+u8 intro_create_may_sprite(s16 a, s16 b)
+{
+ u8 sprite = CreateSprite(&gSpriteTemplate_8416CF4, a, b, 0);
+ u8 may = CreateSprite(&gSpriteTemplate_May, a, b + 8, 1);
+ gSprites[may].data[0] = sprite;
+ return sprite;
+}
+
+void nullsub_83(struct Sprite *sprite)
+{
+}
+
+void sub_81493C4(struct Sprite* sprite)
+{
+ sprite->invisible = gSprites[sprite->data[0]].invisible;
+ sprite->pos1.y = gSprites[sprite->data[0]].pos1.y;
+ sprite->pos2.x = gSprites[sprite->data[0]].pos2.x;
+ sprite->pos2.y = gSprites[sprite->data[0]].pos2.y;
+}
+
+u8 intro_create_latios_sprite(s16 a, s16 b)
+{
+ u8 sprite = CreateSprite(&gSpriteTemplate_8416D7C, a - 32, b, 2);
+ u8 latios = CreateSprite(&gSpriteTemplate_8416D7C, a + 32, b, 2);
+ gSprites[latios].data[0] = sprite;
+ StartSpriteAnim(&gSprites[latios], 1);
+ gSprites[latios].callback = &sub_81493C4;
+ return sprite;
+}
+
+u8 intro_create_latias_sprite(s16 a, s16 b)
+{
+ u8 sprite = CreateSprite(&gSpriteTemplate_8416D94, a - 32, b, 2);
+ u8 latios = CreateSprite(&gSpriteTemplate_8416D94, a + 32, b, 2);
+ gSprites[latios].data[0] = sprite;
+ StartSpriteAnim(&gSprites[latios], 1);
+ gSprites[latios].callback = &sub_81493C4;
+ return sprite;
+}
diff --git a/src/new_game.c b/src/scene/new_game.c
index 226ac9bb7..0279f99c6 100644
--- a/src/new_game.c
+++ b/src/scene/new_game.c
@@ -11,19 +11,20 @@
#include "item_menu.h"
#include "lottery_corner.h"
#include "mail_data.h"
-#include "mauville_old_man.h"
+#include "mauville_man.h"
#include "play_time.h"
#include "player_pc.h"
#include "pokeblock.h"
#include "pokedex.h"
#include "pokemon_size_record.h"
#include "pokemon_storage_system.h"
-#include "rng.h"
+#include "random.h"
#include "roamer.h"
-#include "rom4.h"
+#include "overworld.h"
#include "rtc.h"
#include "script.h"
#include "secret_base.h"
+#include "text.h"
#include "tv.h"
EWRAM_DATA u8 gDifferentSaveFile = 0;
@@ -35,14 +36,10 @@ extern u16 gSaveFileStatus;
extern u8 gUnknown_0819FA81[];
-const struct SB1_2EFC_Struct gUnknown_08216604 =
+static const struct ContestWinner sEmptyMuseumPortrait =
{
- 0x0000,
- {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- }
+ .nickname = {EOS},
+ .trainerName = {EOS},
};
void write_word_to_mem(u32 var, u8 *dataPtr)
@@ -83,23 +80,23 @@ void ClearPokedexFlags(void)
memset(&gSaveBlock2.pokedex.seen, 0, sizeof(gSaveBlock2.pokedex.seen));
}
-void sub_8052DA8(void)
+void ResetContestAndMuseumWinners(void)
{
s32 i;
- sub_80B2D1C();
+ Contest_ResetWinners();
for (i = 0; i < 5; i++)
- gSaveBlock1.sbStruct.unkSB1.sb1_2EFC_struct[i] = gUnknown_08216604;
+ gSaveBlock1.museumPortraits[i] = sEmptyMuseumPortrait;
}
-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 +124,7 @@ void NewGameInitData(void)
ZeroPlayerPartyMons();
ZeroEnemyPartyMons();
ResetPokedex();
- sub_8052DE4();
+ ZeroBattleTowerData();
memset(&gSaveBlock1, 0, sizeof(gSaveBlock1));
ClearMailData();
gSaveBlock2.specialSaveWarp = 0;
@@ -142,7 +139,7 @@ void NewGameInitData(void)
gSaveBlock1.money = 3000;
ResetLinkContestBoolean();
ResetGameStats();
- sub_8052DA8();
+ ResetContestAndMuseumWinners();
InitLinkBattleRecords();
InitShroomishSizeRecord();
InitBarboachSizeRecord();
@@ -157,7 +154,7 @@ void NewGameInitData(void)
ClearPokeblocks();
ClearDecorationInventories();
InitEasyChatPhrases();
- SetMauvilleOldMan();
+ SetupMauvilleOldMan();
InitDewfordTrend();
ResetFanClub();
ResetLotteryCorner();
diff --git a/src/title_screen.c b/src/scene/title_screen.c
index 2503b0654..26fe088d5 100644
--- a/src/title_screen.c
+++ b/src/scene/title_screen.c
@@ -41,8 +41,8 @@
extern u8 gReservedSpritePaletteCount;
extern struct MusicPlayerInfo gMPlay_BGM;
-extern u16 gUnknown_030041B4;
-extern u16 gUnknown_030042C0;
+extern u16 gBattle_BG1_Y;
+extern u16 gBattle_BG1_X;
extern const u8 gUnknown_08E9D8CC[];
extern const u16 gUnknown_08E9F624[];
extern const u8 gUnknown_08E9F7E4[];
@@ -360,7 +360,7 @@ static void UpdateLegendaryMarkingColor(u8);
void SpriteCallback_VersionBannerLeft(struct Sprite *sprite)
{
- struct Task *task = &gTasks[sprite->data1];
+ struct Task *task = &gTasks[sprite->data[1]];
if (task->data[1] != 0)
{
@@ -384,7 +384,7 @@ void SpriteCallback_VersionBannerLeft(struct Sprite *sprite)
void SpriteCallback_VersionBannerRight(struct Sprite *sprite)
{
- struct Task *task = &gTasks[sprite->data1];
+ struct Task *task = &gTasks[sprite->data[1]];
if (task->data[1] != 0)
{
@@ -405,11 +405,11 @@ void SpriteCallback_VersionBannerRight(struct Sprite *sprite)
void SpriteCallback_PressStartCopyrightBanner(struct Sprite *sprite)
{
- if (sprite->data0 == 1)
+ if (sprite->data[0] == 1)
{
- sprite->data1++;
+ sprite->data[1]++;
//Alternate between hidden and shown every 16th frame
- if (sprite->data1 & 16)
+ if (sprite->data[1] & 16)
sprite->invisible = FALSE;
else
sprite->invisible = TRUE;
@@ -429,7 +429,7 @@ static void CreatePressStartBanner(s16 x, s16 y)
{
spriteId = CreateSprite(&sStartCopyrightBannerSpriteTemplate, x, y, 0);
StartSpriteAnim(&gSprites[spriteId], i);
- gSprites[spriteId].data0 = 1;
+ gSprites[spriteId].data[0] = 1;
}
}
#elif GERMAN
@@ -554,27 +554,27 @@ void SpriteCallback_PokemonLogoShine(struct Sprite *sprite)
{
if (gTasks[gUnknown_0202F7E4].data[1] == 0 && sprite->pos1.x < 272)
{
- if (sprite->data0) //Flash background
+ if (sprite->data[0]) //Flash background
{
u16 backgroundColor;
if (sprite->pos1.x < DISPLAY_WIDTH / 2)
{
//Brighten background color
- if (sprite->data1 < 31)
- sprite->data1++;
- if (sprite->data1 < 31)
- sprite->data1++;
+ if (sprite->data[1] < 31)
+ sprite->data[1]++;
+ if (sprite->data[1] < 31)
+ sprite->data[1]++;
}
else
{
//Darken background color
- if (sprite->data1 != 0)
- sprite->data1--;
- if (sprite->data1 != 0)
- sprite->data1--;
+ if (sprite->data[1] != 0)
+ sprite->data[1]--;
+ if (sprite->data[1] != 0)
+ sprite->data[1]--;
}
- backgroundColor = _RGB(sprite->data1, sprite->data1, sprite->data1);
+ backgroundColor = _RGB(sprite->data[1], sprite->data[1], sprite->data[1]);
gPlttBufferFaded[0] = backgroundColor;
gPlttBufferFaded[PLTT_BUFFER_INDEX] = backgroundColor;
}
@@ -593,7 +593,7 @@ static void StartPokemonLogoShine(bool8 flashBackground)
u8 spriteId = CreateSprite(&sPokemonLogoShineSpriteTemplate, 0, 68, 0);
gSprites[spriteId].oam.objMode = 2;
- gSprites[spriteId].data0 = flashBackground;
+ gSprites[spriteId].data[0] = flashBackground;
}
static void VBlankCB(void)
@@ -602,7 +602,7 @@ static void VBlankCB(void)
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
- REG_BG1VOFS = gUnknown_030041B4;
+ REG_BG1VOFS = gBattle_BG1_Y;
}
@@ -758,12 +758,12 @@ static void Task_TitleScreenPhase1(u8 taskId)
//Create left side of version banner
spriteId = CreateSprite(&sVersionBannerLeftSpriteTemplate, VERSION_BANNER_LEFT_X, VERSION_BANNER_Y, 0);
gSprites[spriteId].invisible = TRUE;
- gSprites[spriteId].data1 = taskId;
+ gSprites[spriteId].data[1] = taskId;
//Create right side of version banner
spriteId = CreateSprite(&sVersionBannerRightSpriteTemplate, VERSION_BANNER_RIGHT_X, VERSION_BANNER_Y, 0);
gSprites[spriteId].invisible = TRUE;
- gSprites[spriteId].data1 = taskId;
+ gSprites[spriteId].data[1] = taskId;
gTasks[taskId].data[5] = 88;
gTasks[taskId].tCounter = 144;
@@ -836,8 +836,8 @@ static void Task_TitleScreenPhase3(u8 taskId)
if (gTasks[taskId].tCounter & 1)
{
gTasks[taskId].data[4]++;
- gUnknown_030041B4 = gTasks[taskId].data[4];
- gUnknown_030042C0 = 0;
+ gBattle_BG1_Y = gTasks[taskId].data[4];
+ gBattle_BG1_X = 0;
}
UpdateLegendaryMarkingColor(gTasks[taskId].tCounter);
if ((gMPlay_BGM.status & 0xFFFF) == 0)
diff --git a/src/script_menu.c b/src/script_menu.c
deleted file mode 100644
index 6e1a12a60..000000000
--- a/src/script_menu.c
+++ /dev/null
@@ -1,1134 +0,0 @@
-#include "global.h"
-#include "script_menu.h"
-#include "event_data.h"
-#include "field_effect.h"
-#include "menu.h"
-#include "palette.h"
-#include "script.h"
-#include "sound.h"
-#include "sprite.h"
-#include "strings.h"
-#include "task.h"
-
-// multichoice lists
-const struct MenuAction MultichoiceList_00[] =
-{
- {(u8 *)OtherText_Petalburg, 0},
- {(u8 *)OtherText_Slateport, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_02[] =
-{
- {(u8 *)OtherText_Enter, 0},
- {(u8 *)OtherText_Info3, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_03[] =
-{
- {(u8 *)OtherText_WhatsAContest, 0},
- {(u8 *)OtherText_TypesOfContest, 0},
- {(u8 *)OtherText_Ranks, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_04[] =
-{
- {(u8 *)OtherText_CoolContest, 0},
- {(u8 *)OtherText_BeautyContest, 0},
- {(u8 *)OtherText_CuteContest, 0},
- {(u8 *)OtherText_SmartContest, 0},
- {(u8 *)OtherText_ToughContest, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_06[] =
-{
- {(u8 *)OtherText_Decoration, 0},
- {(u8 *)OtherText_PackUp, 0},
- {(u8 *)OtherText_Registry, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_05[] =
-{
- {(u8 *)OtherText_Decoration, 0},
- {(u8 *)OtherText_PackUp, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_07[] =
-{
- {(u8 *)OtherText_Register, 0},
- {(u8 *)OtherText_Registry, 0},
- {(u8 *)OtherText_Information, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_12[] =
-{
- {(u8 *)OtherText_Mach, 0},
- {(u8 *)OtherText_Acro, 0},
-};
-
-const struct MenuAction MultichoiceList_13[] =
-{
- {(u8 *)OtherText_Poison, 0},
- {(u8 *)OtherText_Paralysis, 0},
- {(u8 *)OtherText_Sleep, 0},
- {(u8 *)OtherText_Burn, 0},
- {(u8 *)OtherText_Frozen, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_14[] =
-{
- {(u8 *)OtherText_Dewford, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_16[] =
-{
- {(u8 *)OtherText_SawIt, 0},
- {(u8 *)OtherText_NotYet, 0},
-};
-
-const struct MenuAction MultichoiceList_17[] =
-{
- {(u8 *)OtherText_Yes, 0},
- {(u8 *)OtherText_No, 0},
- {(u8 *)OtherText_Info3, 0},
-};
-
-const struct MenuAction MultichoiceList_18[] =
-{
- {(u8 *)OtherText_SingleBattle, 0},
- {(u8 *)OtherText_DoubleBattle, 0},
- {(u8 *)OtherText_MultiBattle, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_19[] =
-{
- {(u8 *)OtherText_Littleroot, 0},
- {(u8 *)OtherText_Slateport, 0},
- {(u8 *)OtherText_Lilycove, 0},
-};
-
-const struct MenuAction MultichoiceList_20[] =
-{
- {(u8 *)OtherText_Yes, 0},
- {(u8 *)OtherText_No, 0},
- {(u8 *)OtherText_Info3, 0},
-};
-
-const struct MenuAction MultichoiceList_23[] =
-{
- {(u8 *)OtherText_MakeAChallenge, 0},
- {(u8 *)OtherText_ObtainInformation, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_24[] =
-{
- {(u8 *)OtherText_Lv50_2, 0},
- {(u8 *)OtherText_Lv100_2, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_25[] =
-{
- {(u8 *)OtherText_Zigzagoon, 0},
- {(u8 *)OtherText_Nincada, 0},
- {(u8 *)OtherText_Poochyena, 0},
-};
-
-const struct MenuAction MultichoiceList_26[] =
-{
- {(u8 *)OtherText_Nincada2, 0},
- {(u8 *)OtherText_Lotad, 0},
- {(u8 *)OtherText_Roselia, 0},
-};
-
-const struct MenuAction MultichoiceList_27[] =
-{
- {(u8 *)OtherText_Shroomish, 0},
- {(u8 *)OtherText_Nincada3, 0},
- {(u8 *)OtherText_Surskit, 0},
-};
-
-const struct MenuAction MultichoiceList_28[] =
-{
- {(u8 *)OtherText_Treecko, 0},
- {(u8 *)OtherText_Torchic, 0},
- {(u8 *)OtherText_Mudkip, 0},
-};
-
-const struct MenuAction MultichoiceList_29[] =
-{
- {(u8 *)OtherText_Seedot, 0},
- {(u8 *)OtherText_Shroomish2, 0},
- {(u8 *)OtherText_Spinda, 0},
-};
-
-const struct MenuAction MultichoiceList_30[] =
-{
- {(u8 *)OtherText_Shroomish3, 0},
- {(u8 *)OtherText_Zigzagoon2, 0},
- {(u8 *)OtherText_Wurmple, 0},
-};
-
-const struct MenuAction MultichoiceList_31[] =
-{
- {(u8 *)OtherText_PokeBall, 0},
- {(u8 *)OtherText_SuperPotion, 0},
- {(u8 *)OtherText_SamePrice, 0},
-};
-
-const struct MenuAction MultichoiceList_32[] =
-{
- {(u8 *)OtherText_Yen135, 0},
- {(u8 *)OtherText_Yen155, 0},
- {(u8 *)OtherText_Yen175, 0},
-};
-
-const struct MenuAction MultichoiceList_33[] =
-{
- {(u8 *)OtherText_CostMore, 0},
- {(u8 *)OtherText_CostLess, 0},
- {(u8 *)OtherText_SamePrice2, 0},
-};
-
-const struct MenuAction MultichoiceList_34[] =
-{
- {(u8 *)OtherText_MaleSymbol, 0},
- {(u8 *)OtherText_FemaleSymbol, 0},
- {(u8 *)OtherText_Neither, 0},
-};
-
-const struct MenuAction MultichoiceList_35[] =
-{
- {(u8 *)OtherText_Males, 0},
- {(u8 *)OtherText_Females, 0},
- {(u8 *)OtherText_SameNumber, 0},
-};
-
-const struct MenuAction MultichoiceList_36[] =
-{
- {(u8 *)OtherText_Male, 0},
- {(u8 *)OtherText_Female, 0},
- {(u8 *)OtherText_ItDepends, 0},
-};
-
-const struct MenuAction MultichoiceList_37[] =
-{
- {(u8 *)OtherText_Six2, 0},
- {(u8 *)OtherText_Eight2, 0},
- {(u8 *)OtherText_Ten, 0},
-};
-
-const struct MenuAction MultichoiceList_38[] =
-{
- {(u8 *)OtherText_One, 0},
- {(u8 *)OtherText_Two, 0},
- {(u8 *)OtherText_Three, 0},
-};
-
-const struct MenuAction MultichoiceList_39[] =
-{
- {(u8 *)OtherText_Six, 0},
- {(u8 *)OtherText_Seven, 0},
- {(u8 *)OtherText_Eight, 0},
-};
-
-const struct MenuAction MultichoiceList_42[] =
-{
- {(u8 *)OtherText_FreshWater, 0},
- {(u8 *)OtherText_SodaPop, 0},
- {(u8 *)OtherText_Lemonade, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_43[] =
-{
- {(u8 *)OtherText_HowToRide, 0},
- {(u8 *)OtherText_HowToTurn, 0},
- {(u8 *)OtherText_SandySlopes, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_44[] =
-{
- {(u8 *)OtherText_Wheelies, 0},
- {(u8 *)OtherText_BunnyHops, 0},
- {(u8 *)OtherText_Jumping, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_45[] =
-{
- {(u8 *)OtherText_Satisfied, 0},
- {(u8 *)OtherText_Dissatisfied, 0},
-};
-
-const struct MenuAction MultichoiceList_46[] =
-{
- {(u8 *)OtherText_Deepseatooth, 0},
- {(u8 *)OtherText_Deepseascale, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_47[] =
-{
- {(u8 *)OtherText_BlueFlute2, 0},
- {(u8 *)OtherText_YellowFlute2, 0},
- {(u8 *)OtherText_RedFlute2, 0},
- {(u8 *)OtherText_WhiteFlute2, 0},
- {(u8 *)OtherText_BlackFlute2, 0},
- {(u8 *)OtherText_GlassChair, 0},
- {(u8 *)OtherText_GlassDesk, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_48[] =
-{
- {(u8 *)OtherText_TreeckoDoll, 0},
- {(u8 *)OtherText_TorchicDoll, 0},
- {(u8 *)OtherText_MudkipDoll, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_55[] =
-{
- {(u8 *)OtherText_TM32, 0},
- {(u8 *)OtherText_TM29, 0},
- {(u8 *)OtherText_TM35, 0},
- {(u8 *)OtherText_TM24, 0},
- {(u8 *)OtherText_TM13, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_49[] =
-{
- {(u8 *)OtherText_50Coins, 0},
- {(u8 *)OtherText_500Coins, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_50[] =
-{
- {(u8 *)OtherText_Excellent, 0},
- {(u8 *)OtherText_NotSoHot, 0},
-};
-
-const struct MenuAction MultichoiceList_52[] =
-{
- {(u8 *)OtherText_Lilycove, 0},
- {(u8 *)OtherText_BattleTower, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_53[] =
-{
- {(u8 *)OtherText_Slateport, 0},
- {(u8 *)OtherText_Lilycove, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_54[] =
-{
- {(u8 *)OtherText_Right, 0},
- {(u8 *)OtherText_Left, 0},
-};
-
-const struct MenuAction MultichoiceList_56[] =
-{
- {(u8 *)OtherText_Slateport, 0},
- {(u8 *)OtherText_BattleTower, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_57[] =
-{
- {(u8 *)OtherText_1F_2, 0},
- {(u8 *)OtherText_2F_2, 0},
- {(u8 *)OtherText_3F_2, 0},
- {(u8 *)OtherText_4F_2, 0},
- {(u8 *)OtherText_5F_2, 0},
-};
-
-const struct MenuAction MultichoiceList_58[] =
-{
- {(u8 *)OtherText_RedShard, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_59[] =
-{
- {(u8 *)OtherText_YellowShard, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_60[] =
-{
- {(u8 *)OtherText_RedShard, 0},
- {(u8 *)OtherText_YellowShard, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_61[] =
-{
- {(u8 *)OtherText_BlueShard, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_62[] =
-{
- {(u8 *)OtherText_RedShard, 0},
- {(u8 *)OtherText_BlueShard, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_63[] =
-{
- {(u8 *)OtherText_YellowShard, 0},
- {(u8 *)OtherText_BlueShard, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_64[] =
-{
- {(u8 *)OtherText_RedShard, 0},
- {(u8 *)OtherText_YellowShard, 0},
- {(u8 *)OtherText_BlueShard, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_65[] =
-{
- {(u8 *)OtherText_GreenShard, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_66[] =
-{
- {(u8 *)OtherText_RedShard, 0},
- {(u8 *)OtherText_GreenShard, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_67[] =
-{
- {(u8 *)OtherText_YellowShard, 0},
- {(u8 *)OtherText_GreenShard, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_68[] =
-{
- {(u8 *)OtherText_RedShard, 0},
- {(u8 *)OtherText_YellowShard, 0},
- {(u8 *)OtherText_GreenShard, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_69[] =
-{
- {(u8 *)OtherText_BlueShard, 0},
- {(u8 *)OtherText_GreenShard, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_70[] =
-{
- {(u8 *)OtherText_RedShard, 0},
- {(u8 *)OtherText_BlueShard, 0},
- {(u8 *)OtherText_GreenShard, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_71[] =
-{
- {(u8 *)OtherText_YellowShard, 0},
- {(u8 *)OtherText_BlueShard, 0},
- {(u8 *)OtherText_GreenShard, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_72[] =
-{
- {(u8 *)OtherText_RedShard, 0},
- {(u8 *)OtherText_YellowShard, 0},
- {(u8 *)OtherText_BlueShard, 0},
- {(u8 *)OtherText_GreenShard, 0},
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MenuAction MultichoiceList_01[] =
-{
- {(u8 *)gOtherText_CancelNoTerminator, 0},
-};
-
-const struct MultichoiceListStruct gMultichoiceLists[] =
-{
- {(struct MenuAction *)MultichoiceList_00, 3},
- {(struct MenuAction *)MultichoiceList_01, 1},
- {(struct MenuAction *)MultichoiceList_02, 3},
- {(struct MenuAction *)MultichoiceList_03, 4},
- {(struct MenuAction *)MultichoiceList_04, 6},
- {(struct MenuAction *)MultichoiceList_05, 3},
- {(struct MenuAction *)MultichoiceList_06, 4},
- {(struct MenuAction *)MultichoiceList_07, 4},
- {(struct MenuAction *)MultichoiceList_01, 1},
- {(struct MenuAction *)MultichoiceList_01, 1},
- {(struct MenuAction *)MultichoiceList_01, 1},
- {(struct MenuAction *)MultichoiceList_01, 1},
- {(struct MenuAction *)MultichoiceList_12, 2},
- {(struct MenuAction *)MultichoiceList_13, 6},
- {(struct MenuAction *)MultichoiceList_14, 2},
- {(struct MenuAction *)MultichoiceList_01, 1},
- {(struct MenuAction *)MultichoiceList_16, 2},
- {(struct MenuAction *)MultichoiceList_17, 3},
- {(struct MenuAction *)MultichoiceList_18, 4},
- {(struct MenuAction *)MultichoiceList_19, 3},
- {(struct MenuAction *)MultichoiceList_20, 3},
- {(struct MenuAction *)MultichoiceList_01, 1},
- {(struct MenuAction *)MultichoiceList_01, 1},
- {(struct MenuAction *)MultichoiceList_23, 3},
- {(struct MenuAction *)MultichoiceList_24, 3},
- {(struct MenuAction *)MultichoiceList_25, 3},
- {(struct MenuAction *)MultichoiceList_26, 3},
- {(struct MenuAction *)MultichoiceList_27, 3},
- {(struct MenuAction *)MultichoiceList_28, 3},
- {(struct MenuAction *)MultichoiceList_29, 3},
- {(struct MenuAction *)MultichoiceList_30, 3},
- {(struct MenuAction *)MultichoiceList_31, 3},
- {(struct MenuAction *)MultichoiceList_32, 3},
- {(struct MenuAction *)MultichoiceList_33, 3},
- {(struct MenuAction *)MultichoiceList_34, 3},
- {(struct MenuAction *)MultichoiceList_35, 3},
- {(struct MenuAction *)MultichoiceList_36, 3},
- {(struct MenuAction *)MultichoiceList_37, 3},
- {(struct MenuAction *)MultichoiceList_38, 3},
- {(struct MenuAction *)MultichoiceList_39, 3},
- {(struct MenuAction *)MultichoiceList_01, 1},
- {(struct MenuAction *)MultichoiceList_01, 1},
- {(struct MenuAction *)MultichoiceList_42, 4},
- {(struct MenuAction *)MultichoiceList_43, 4},
- {(struct MenuAction *)MultichoiceList_44, 4},
- {(struct MenuAction *)MultichoiceList_45, 2},
- {(struct MenuAction *)MultichoiceList_46, 3},
- {(struct MenuAction *)MultichoiceList_47, 8},
- {(struct MenuAction *)MultichoiceList_48, 4},
- {(struct MenuAction *)MultichoiceList_49, 3},
- {(struct MenuAction *)MultichoiceList_50, 2},
- {(struct MenuAction *)MultichoiceList_01, 1},
- {(struct MenuAction *)MultichoiceList_52, 3},
- {(struct MenuAction *)MultichoiceList_53, 3},
- {(struct MenuAction *)MultichoiceList_54, 2},
- {(struct MenuAction *)MultichoiceList_55, 6},
- {(struct MenuAction *)MultichoiceList_56, 3},
- {(struct MenuAction *)MultichoiceList_57, 5},
- {(struct MenuAction *)MultichoiceList_58, 2},
- {(struct MenuAction *)MultichoiceList_59, 2},
- {(struct MenuAction *)MultichoiceList_60, 3},
- {(struct MenuAction *)MultichoiceList_61, 2},
- {(struct MenuAction *)MultichoiceList_62, 3},
- {(struct MenuAction *)MultichoiceList_63, 3},
- {(struct MenuAction *)MultichoiceList_64, 4},
- {(struct MenuAction *)MultichoiceList_65, 2},
- {(struct MenuAction *)MultichoiceList_66, 3},
- {(struct MenuAction *)MultichoiceList_67, 3},
- {(struct MenuAction *)MultichoiceList_68, 4},
- {(struct MenuAction *)MultichoiceList_69, 3},
- {(struct MenuAction *)MultichoiceList_70, 4},
- {(struct MenuAction *)MultichoiceList_71, 4},
- {(struct MenuAction *)MultichoiceList_72, 5}
-};
-
-const u8 *const gUnknown_083CE048[] =
-{
- OtherText_Cool2,
- OtherText_Beauty3,
- OtherText_Cute2,
- OtherText_Smart2,
- OtherText_Tough2,
- OtherText_Normal,
- OtherText_Super,
- OtherText_Hyper,
- OtherText_Master,
- OtherText_Cool3,
- OtherText_Beauty4,
- OtherText_Cute3,
- OtherText_Smart3,
- OtherText_Tough3,
- OtherText_Items,
- OtherText_KeyItems,
- OtherText_Balls,
- OtherText_TMsHMs,
- OtherText_Berries,
-};
-
-extern u8 gPCText_WhichPCShouldBeAccessed[];
-
-extern u16 gScriptResult;
-
-bool8 sub_80B5054(u8 left, u8 top, u8 var3, u8 var4)
-{
- if (FuncIsActiveTask(sub_80B52B4) == 1)
- return FALSE;
- else
- {
- gScriptResult = 0xFF;
- DrawMultichoiceMenu(left, top, gMultichoiceLists[var3].count, gMultichoiceLists[var3].list, var4, 0);
- return TRUE;
- }
-}
-
-bool8 sub_80B50B0(u8 left, u8 top, u8 var3, u8 var4, u8 var5)
-{
- if (FuncIsActiveTask(sub_80B52B4) == 1)
- return FALSE;
- else
- {
- gScriptResult = 0xFF;
- DrawMultichoiceMenu(left, top, gMultichoiceLists[var3].count, gMultichoiceLists[var3].list, var4, var5);
- return TRUE;
- }
-}
-
-u16 GetStringWidthInTilesForScriptMenu(const u8 *str)
-{
- // each tile on screen is 8x8, so it needs the number of tiles and not pixels, hence the division by 8.
- return (GetStringWidthGivenWindowConfig((struct WindowConfig *)&gWindowConfig_81E6CE4, str) + 7) / 8;
-}
-
-void DrawMultichoiceMenu(u8 left, u8 top, u8 count, struct MenuAction *list, u8 var4, u8 cursorPos)
-{
- u16 width = GetStringWidthInTilesForScriptMenu(list[0].text);
- u16 newWidth;
- u8 i;
- u8 right;
- u8 bottom;
-
- for (i = 1; i < count; i++)
- {
- newWidth = GetStringWidthInTilesForScriptMenu(list[i].text);
- if (width < newWidth)
- width = newWidth;
- }
-
- right = width;
- right = (right + left) + 1;
-
- if (right > 29)
- {
- left = left + (29 - right);
- right = 29;
- }
-
- bottom = top + (2 * count + 1);
-
- MenuDrawTextWindow(left, top, right, bottom);
- PrintMenuItems(left + 1, top + 1, count, list);
- InitMenu(0, left + 1, top + 1, count, cursorPos, right - left - 1);
- sub_80B5230(left, top, right, bottom, var4, count);
-}
-
-void sub_80B5230(u8 left, u8 top, u8 right, u8 bottom, u8 unkVar, u8 count)
-{
- u8 taskId = CreateTask(sub_80B52B4, 80);
-
- gTasks[taskId].data[0] = left;
- gTasks[taskId].data[1] = top;
- gTasks[taskId].data[2] = right;
- gTasks[taskId].data[3] = bottom;
- gTasks[taskId].data[4] = unkVar;
-
- if (count > 3)
- gTasks[taskId].data[5] = TRUE;
- else
- gTasks[taskId].data[5] = FALSE;
-}
-
-void sub_80B52B4(u8 taskId)
-{
- s8 var;
-
- if (!gPaletteFade.active)
- {
- if (!gTasks[taskId].data[5])
- var = ProcessMenuInputNoWrap();
- else
- var = ProcessMenuInput();
-
- if (var != -2)
- {
- if (var == -1)
- {
- if (!gTasks[taskId].data[4])
- {
- PlaySE(5);
- gScriptResult = 127;
- }
- else
- {
- return;
- }
- }
- else
- {
- gScriptResult = var;
- }
- HandleDestroyMenuCursors();
- MenuZeroFillWindowRect(gTasks[taskId].data[0], gTasks[taskId].data[1], gTasks[taskId].data[2], gTasks[taskId].data[3]);
- DestroyTask(taskId);
- EnableBothScriptContexts();
- }
- }
-}
-
-bool8 Multichoice(u8 var1, u8 var2, u8 var3, u8 var4)
-{
- if (FuncIsActiveTask(sub_80B52B4) == 1)
- return FALSE;
- else
- {
- gScriptResult = 0xFF;
- sub_80B53B4(var1, var2, gMultichoiceLists[var3].count, gMultichoiceLists[var3].list, var4);
- return TRUE;
- }
-}
-
-void sub_80B53B4(u8 left, u8 top, u8 count, struct MenuAction *list, u8 var4)
-{
- u16 width = GetStringWidthInTilesForScriptMenu(list[0].text);
- u16 newWidth;
- u8 i;
- u8 right;
- u8 bottom;
-
- for (i = 1; i < count; i++)
- {
- newWidth = GetStringWidthInTilesForScriptMenu(list[i].text);
- if (width < newWidth)
- width = newWidth;
- }
-
- right = width;
- right = (right + left) + 2;
- bottom = top + (2 * count + 1);
-
- PrintMenuItems(left, top, count, list);
- InitMenu(0, left, top, count, 0, right - left - 1);
- sub_80B5230(left, top, right, bottom, var4, count);
-}
-
-bool8 yes_no_box(u8 var1, u8 var2)
-{
- u8 taskId;
-
- if (FuncIsActiveTask(task_yes_no_maybe) == 1)
- return FALSE;
- else
- {
- gScriptResult = 0xFF;
- DisplayYesNoMenu(var1, var2, 1);
- taskId = CreateTask(task_yes_no_maybe, 0x50);
- gTasks[taskId].data[0] = var1;
- gTasks[taskId].data[1] = var2;
- return TRUE;
- }
-}
-
-// unused
-bool8 IsScriptActive(void)
-{
- if (gScriptResult == 0xFF)
- return FALSE;
- else
- return TRUE;
-}
-
-void task_yes_no_maybe(u8 taskId)
-{
- u8 left, top;
-
- if (gTasks[taskId].data[2] < 5)
- {
- gTasks[taskId].data[2]++;
- return;
- }
-
- switch (ProcessMenuInputNoWrap())
- {
- case -2:
- return;
- case -1:
- case 1:
- PlaySE(5);
- gScriptResult = 0;
- break;
- case 0:
- gScriptResult = 1;
- break;
- }
-
- left = gTasks[taskId].data[0];
- top = gTasks[taskId].data[1];
-
- MenuZeroFillWindowRect(left, top, left + 6, top + 5);
- DestroyTask(taskId);
- EnableBothScriptContexts();
-}
-
-bool8 sub_80B5578(u8 left, u8 top, u8 multichoiceId, u8 a4, u8 columnCount)
-{
- u8 bottom = 0;
-
- if (FuncIsActiveTask(sub_80B5684) == TRUE)
- {
- return FALSE;
- }
- else
- {
- u8 taskId;
- u8 width;
-
- gScriptResult = 0xFF;
-
- sub_807274C(left, top, gMultichoiceLists[multichoiceId].count, 0, gMultichoiceLists[multichoiceId].list, columnCount, 0);
-
- taskId = CreateTask(sub_80B5684, 80);
-
- if (!((gMultichoiceLists[multichoiceId].count >> 1) < columnCount || (gMultichoiceLists[multichoiceId].count & 1))
- || columnCount == 1 || gMultichoiceLists[multichoiceId].count == columnCount)
- {
- bottom = (2 * (gMultichoiceLists[multichoiceId].count / columnCount)) + 1 + top;
- }
- else
- {
- bottom = (2 * (gMultichoiceLists[multichoiceId].count / columnCount)) + 3 + top;
- }
-
- width = sub_807288C(columnCount);
- gTasks[taskId].data[0] = left;
- gTasks[taskId].data[1] = top;
- gTasks[taskId].data[2] = width + left + 2;
- gTasks[taskId].data[3] = bottom;
- gTasks[taskId].data[4] = a4;
- return TRUE;
- }
-}
-
-void sub_80B5684(u8 taskId)
-{
- s8 var = sub_80727CC();
-
- if (var != -2)
- {
- if (var == -1)
- {
- if (!gTasks[taskId].data[4])
- {
- PlaySE(5);
- gScriptResult = 127;
- }
- else
- {
- return;
- }
- }
- else
- {
- gScriptResult = var;
- }
- HandleDestroyMenuCursors();
- MenuZeroFillWindowRect(gTasks[taskId].data[0], gTasks[taskId].data[1], gTasks[taskId].data[2], gTasks[taskId].data[3]);
- DestroyTask(taskId);
- EnableBothScriptContexts();
- }
-}
-
-bool8 TryCreatePCMenu(void)
-{
- if (FuncIsActiveTask(sub_80B52B4) == 1)
- return FALSE;
- else
- {
- gScriptResult = 0xFF;
- CreatePCMenu();
- return TRUE;
- }
-}
-
-#if ENGLISH
-void CreatePCMenu(void)
-{
- u16 playersPCWidth = GetStringWidthInTilesForScriptMenu(gPCText_PlayersPC);
- u8 width;
- u8 numChoices;
-
- if (playersPCWidth > GetStringWidthInTilesForScriptMenu(gPCText_SomeonesPC))
- width = playersPCWidth;
- else
- width = 8;
-
- if (FlagGet(SYS_GAME_CLEAR)) // player has cleared game?
- {
- numChoices = 4;
- MenuDrawTextWindow(0, 0, width + 2, 9);
- MenuPrint(gPCText_HallOfFame, 1, 5);
- MenuPrint(gPCText_LogOff, 1, 7);
- }
- else
- {
- numChoices = 3;
- MenuDrawTextWindow(0, 0, width + 2, 7);
- MenuPrint(gPCText_LogOff, 1, 5);
- }
-
- if (FlagGet(SYS_PC_LANETTE)) // player met lanette?
- MenuPrint(gPCText_LanettesPC, 1, 1);
- else
- MenuPrint(gPCText_SomeonesPC, 1, 1);
-
- MenuPrint(gPCText_PlayersPC, 1, 3);
- InitMenu(0, 1, 1, numChoices, 0, width + 1);
- sub_80B5230(0, 0, width + 2, 2 * numChoices + 1, 0, numChoices);
-}
-#elif GERMAN
-__attribute__((naked))
-void CreatePCMenu(void) {
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- sub sp, 0x18\n\
- ldr r0, _080B5748 @ =0x0000084b\n\
- bl FlagGet\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _080B5750\n\
- ldr r0, _080B574C @ =gPCText_LanettesPC\n\
- b _080B5752\n\
- .align 2, 0\n\
-_080B5748: .4byte 0x0000084b\n\
-_080B574C: .4byte gPCText_LanettesPC\n\
-_080B5750:\n\
- ldr r0, _080B57E8 @ =gPCText_SomeonesPC\n\
-_080B5752:\n\
- bl GetStringWidthInTilesForScriptMenu\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- str r0, [sp, 0x8]\n\
- movs r4, 0x1\n\
- ldr r0, _080B57EC @ =gPCText_PlayersPC\n\
- bl GetStringWidthInTilesForScriptMenu\n\
- lsls r1, r4, 2\n\
- add r1, sp\n\
- adds r1, 0x8\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- str r0, [r1]\n\
- ldr r0, _080B57F0 @ =gPCText_LogOff\n\
- bl GetStringWidthInTilesForScriptMenu\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- str r0, [sp, 0x10]\n\
- movs r4, 0x3\n\
- ldr r0, _080B57F4 @ =0x00000804\n\
- bl FlagGet\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _080B5798\n\
- ldr r0, _080B57F8 @ =gPCText_HallOfFame\n\
- bl GetStringWidthInTilesForScriptMenu\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- str r0, [sp, 0x14]\n\
- movs r4, 0x4\n\
-_080B5798:\n\
- movs r5, 0\n\
- cmp r5, r4\n\
- bge _080B57B4\n\
- add r2, sp, 0x8\n\
- adds r1, r4, 0\n\
-_080B57A2:\n\
- ldr r0, [r2]\n\
- cmp r5, r0\n\
- bge _080B57AC\n\
- lsls r0, 24\n\
- lsrs r5, r0, 24\n\
-_080B57AC:\n\
- adds r2, 0x4\n\
- subs r1, 0x1\n\
- cmp r1, 0\n\
- bne _080B57A2\n\
-_080B57B4:\n\
- ldr r0, _080B57F4 @ =0x00000804\n\
- bl FlagGet\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _080B57FC\n\
- movs r7, 0x4\n\
- adds r4, r5, 0x2\n\
- lsls r2, r4, 24\n\
- lsrs r2, 24\n\
- movs r0, 0\n\
- movs r1, 0\n\
- movs r3, 0x9\n\
- bl MenuDrawTextWindow\n\
- ldr r0, _080B57F8 @ =gPCText_HallOfFame\n\
- movs r1, 0x1\n\
- movs r2, 0x5\n\
- bl MenuPrint\n\
- ldr r0, _080B57F0 @ =gPCText_LogOff\n\
- movs r1, 0x1\n\
- movs r2, 0x7\n\
- bl MenuPrint\n\
- b _080B5818\n\
- .align 2, 0\n\
-_080B57E8: .4byte gPCText_SomeonesPC\n\
-_080B57EC: .4byte gPCText_PlayersPC\n\
-_080B57F0: .4byte gPCText_LogOff\n\
-_080B57F4: .4byte 0x00000804\n\
-_080B57F8: .4byte gPCText_HallOfFame\n\
-_080B57FC:\n\
- movs r7, 0x3\n\
- adds r4, r5, 0x2\n\
- lsls r2, r4, 24\n\
- lsrs r2, 24\n\
- movs r0, 0\n\
- movs r1, 0\n\
- movs r3, 0x7\n\
- bl MenuDrawTextWindow\n\
- ldr r0, _080B5834 @ =gPCText_LogOff\n\
- movs r1, 0x1\n\
- movs r2, 0x5\n\
- bl MenuPrint\n\
-_080B5818:\n\
- adds r6, r4, 0\n\
- ldr r0, _080B5838 @ =0x0000084b\n\
- bl FlagGet\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _080B5840\n\
- ldr r0, _080B583C @ =gPCText_LanettesPC\n\
- movs r1, 0x1\n\
- movs r2, 0x1\n\
- bl MenuPrint\n\
- b _080B584A\n\
- .align 2, 0\n\
-_080B5834: .4byte gPCText_LogOff\n\
-_080B5838: .4byte 0x0000084b\n\
-_080B583C: .4byte gPCText_LanettesPC\n\
-_080B5840:\n\
- ldr r0, _080B5888 @ =gPCText_SomeonesPC\n\
- movs r1, 0x1\n\
- movs r2, 0x1\n\
- bl MenuPrint\n\
-_080B584A:\n\
- ldr r0, _080B588C @ =gPCText_PlayersPC\n\
- movs r1, 0x1\n\
- movs r2, 0x3\n\
- bl MenuPrint\n\
- movs r4, 0\n\
- str r4, [sp]\n\
- adds r0, r5, 0x1\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- str r0, [sp, 0x4]\n\
- movs r0, 0\n\
- movs r1, 0x1\n\
- movs r2, 0x1\n\
- adds r3, r7, 0\n\
- bl InitMenu\n\
- lsls r2, r6, 24\n\
- lsrs r2, 24\n\
- lsls r3, r7, 1\n\
- adds r3, 0x1\n\
- str r4, [sp]\n\
- str r7, [sp, 0x4]\n\
- movs r0, 0\n\
- movs r1, 0\n\
- bl sub_80B5230\n\
- add sp, 0x18\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_080B5888: .4byte gPCText_SomeonesPC\n\
-_080B588C: .4byte gPCText_PlayersPC\n\
- .syntax divided\n");
-}
-#endif
-
-void sub_80B5838(void)
-{
- MenuDisplayMessageBox();
- MenuPrint(gPCText_WhichPCShouldBeAccessed, 2, 15);
-}
-
-void task_picbox(u8 taskId)
-{
- struct Task *task = &gTasks[taskId];
-
- switch (task->data[0])
- {
- case 0:
- task->data[0]++;
- break;
- case 1:
- break;
- case 2:
- FreeResourcesAndDestroySprite(&gSprites[task->data[2]]);
- task->data[0]++;
- break;
- case 3:
- MenuZeroFillWindowRect(task->data[3], task->data[4], task->data[3] + 9, task->data[4] + 10);
- DestroyTask(taskId);
- break;
- }
-}
-
-bool8 sub_80B58C4(u16 var1, u8 var2, u8 var3)
-{
- u8 taskId;
- u8 var;
-
- if (FindTaskIdByFunc(task_picbox) != 0xFF)
- return FALSE;
- else
- {
- MenuDrawTextWindow(var2, var3, var2 + 9, var3 + 10);
- taskId = CreateTask(task_picbox, 0x50);
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].data[1] = var1;
- var = CreateMonSprite_PicBox(var1, var2 * 8 + 40, var3 * 8 + 40, 0);
- gTasks[taskId].data[2] = var;
- gTasks[taskId].data[3] = var2;
- gTasks[taskId].data[4] = var3;
- gSprites[var].callback = SpriteCallbackDummy;
- gSprites[var].oam.priority = 0;
- return TRUE;
- }
-}
-
-void *picbox_close(void)
-{
- u8 taskId = FindTaskIdByFunc(task_picbox);
-
- if (taskId == 0xFF)
- return NULL;
-
- gTasks[taskId].data[0]++;
- return (void *)sub_80B59AC;
-}
-
-bool8 sub_80B59AC(void)
-{
- if (FindTaskIdByFunc(task_picbox) == 0xFF)
- return TRUE;
- else
- return FALSE;
-}
diff --git a/src/script_pokemon_util_80C4BF0.c b/src/script_pokemon_util_80C4BF0.c
index cbca07011..f397e5ebb 100644
--- a/src/script_pokemon_util_80C4BF0.c
+++ b/src/script_pokemon_util_80C4BF0.c
@@ -10,18 +10,22 @@
#include "debug.h"
#include "decompress.h"
#include "event_data.h"
-#include "items.h"
+#include "constants/items.h"
#include "link.h"
#include "load_save.h"
#include "main.h"
#include "menu.h"
#include "pokedex.h"
#include "pokemon.h"
-#include "rng.h"
-#include "rom4.h"
+#include "random.h"
+#include "overworld.h"
#include "script_pokemon_80C4.h"
-#include "species.h"
+#include "constants/species.h"
#include "task.h"
+#include "ewram.h"
+
+extern void sub_80C4674();
+extern void sub_80C4698(u8 *, u8);
#define CONTEST_ENTRY_PIC_LEFT 10
#define CONTEST_ENTRY_PIC_TOP 3
@@ -37,22 +41,23 @@ extern u16 gSpecialVar_0x8004;
extern u16 gSpecialVar_0x8005;
extern u16 gSpecialVar_0x8006;
-extern u16 gScriptContestCategory;
-extern u16 gScriptContestRank;
-extern u16 gScriptResult;
+extern u16 gSpecialVar_ContestCategory;
+extern u16 gSpecialVar_ContestRank;
+extern u16 gSpecialVar_Result;
extern u32 gUnknown_03005D28;
extern u8 gUnknown_02038694;
extern u8 gUnknown_0203856C;
-extern u8 gUnknown_02038690[];
-extern u16 gUnknown_02038678[];
+extern u8 gContestFinalStandings[];
+extern s16 gUnknown_02038670[];
+extern s16 gUnknown_02038678[];
-void sub_80C4BF0(void)
+void SetContestTrainerGfxIds(void)
{
- gSaveBlock1.vars[0x10] = gContestMons[0].unk16;
- gSaveBlock1.vars[0x11] = gContestMons[1].unk16;
- gSaveBlock1.vars[0x12] = gContestMons[2].unk16;
+ gSaveBlock1.vars[VAR_OBJ_GFX_ID_0 - VARS_START] = gContestMons[0].trainerGfxId;
+ gSaveBlock1.vars[VAR_OBJ_GFX_ID_1 - VARS_START] = gContestMons[1].trainerGfxId;
+ gSaveBlock1.vars[VAR_OBJ_GFX_ID_2 - VARS_START] = gContestMons[2].trainerGfxId;
}
void sub_80C4C28(void)
@@ -90,7 +95,7 @@ void sub_80C4C78(void)
u16 var;
u16 returnVar;
- switch(gScriptContestCategory)
+ switch(gSpecialVar_ContestCategory)
{
case 0:
var = 8;
@@ -110,7 +115,7 @@ void sub_80C4C78(void)
break;
}
- returnVar = gSaveBlock1.sbStruct.unkSB2.sb1_2EFC_struct2[var].var;
+ returnVar = gSaveBlock1.contestWinners[var].species;
if(returnVar == 0)
gSpecialVar_0x8004 = returnVar;
@@ -120,14 +125,14 @@ void sub_80C4C78(void)
void sub_80C4CEC(void)
{
- sub_80B2A7C(0xFF);
+ Contest_SaveWinner(0xFF);
}
void sub_80C4CF8(void)
{
- if(!gUnknown_02038690[gContestPlayerMonIndex]
- && gScriptContestRank == 3
- && (s16)gUnknown_02038678[gContestPlayerMonIndex] >= 800)
+ if(!gContestFinalStandings[gContestPlayerMonIndex]
+ && gSpecialVar_ContestRank == 3
+ && gUnknown_02038678[gContestPlayerMonIndex] >= 800)
{
gSpecialVar_0x8004 = 1;
}
@@ -143,215 +148,84 @@ u8 sub_80C4D50(void)
int i;
for (i = 0; i < 5; i++)
- if (gSaveBlock1.sbStruct.unkSB2.sb1_2EFC_struct2[i + 8].var)
+ if (gSaveBlock1.museumPortraits[i].species != 0)
retVar++;
return retVar;
}
-// nope. too hard
-__attribute__((naked))
void sub_80C4D80(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, 0x8\n\
- ldr r0, _080C4EA0 @ =gUnknown_02038670\n\
- mov r12, r0\n\
- ldr r1, _080C4EA4 @ =gSpecialVar_0x8006\n\
- mov r8, r1\n\
- ldr r2, _080C4EA8 @ =gStringVar1\n\
- mov r9, r2\n\
- mov r2, r12\n\
- mov r1, sp\n\
- movs r6, 0x3\n\
-_080C4D9E:\n\
- ldrh r0, [r2]\n\
- strh r0, [r1]\n\
- adds r2, 0x2\n\
- adds r1, 0x2\n\
- subs r6, 0x1\n\
- cmp r6, 0\n\
- bge _080C4D9E\n\
- movs r6, 0\n\
-_080C4DAE:\n\
- movs r1, 0x3\n\
- cmp r1, r6\n\
- ble _080C4DD8\n\
-_080C4DB4:\n\
- subs r4, r1, 0x1\n\
- lsls r0, r4, 1\n\
- mov r5, sp\n\
- adds r3, r5, r0\n\
- lsls r0, r1, 1\n\
- adds r2, r5, r0\n\
- ldrh r5, [r3]\n\
- movs r7, 0\n\
- ldrsh r1, [r3, r7]\n\
- movs r7, 0\n\
- ldrsh r0, [r2, r7]\n\
- cmp r1, r0\n\
- bge _080C4DD2\n\
- strh r5, [r2]\n\
- strh r0, [r3]\n\
-_080C4DD2:\n\
- adds r1, r4, 0\n\
- cmp r1, r6\n\
- bgt _080C4DB4\n\
-_080C4DD8:\n\
- adds r6, 0x1\n\
- cmp r6, 0x2\n\
- ble _080C4DAE\n\
- mov r2, r8\n\
- ldrh r0, [r2]\n\
- lsls r0, 1\n\
- add r0, sp\n\
- ldrh r0, [r0]\n\
- movs r2, 0\n\
- movs r7, 0\n\
- movs r6, 0\n\
- lsls r0, 16\n\
- asrs r4, r0, 16\n\
- adds r3, r0, 0\n\
- mov r1, sp\n\
-_080C4DF6:\n\
- movs r5, 0\n\
- ldrsh r0, [r1, r5]\n\
- cmp r0, r4\n\
- bne _080C4E12\n\
- lsls r0, r2, 24\n\
- movs r2, 0x80\n\
- lsls r2, 17\n\
- adds r0, r2\n\
- lsrs r2, r0, 24\n\
- mov r5, r8\n\
- ldrh r5, [r5]\n\
- cmp r6, r5\n\
- bne _080C4E12\n\
- adds r7, r2, 0\n\
-_080C4E12:\n\
- adds r1, 0x2\n\
- adds r6, 0x1\n\
- cmp r6, 0x3\n\
- ble _080C4DF6\n\
- movs r6, 0\n\
- mov r0, sp\n\
- movs r1, 0\n\
- ldrsh r0, [r0, r1]\n\
- asrs r1, r3, 16\n\
- lsls r2, 24\n\
- mov r10, r2\n\
- cmp r0, r1\n\
- beq _080C4E40\n\
- adds r2, r1, 0\n\
- mov r1, sp\n\
-_080C4E30:\n\
- adds r1, 0x2\n\
- adds r6, 0x1\n\
- cmp r6, 0x3\n\
- bgt _080C4E40\n\
- movs r4, 0\n\
- ldrsh r0, [r1, r4]\n\
- cmp r0, r2\n\
- bne _080C4E30\n\
-_080C4E40:\n\
- lsls r0, r6, 24\n\
- lsrs r4, r0, 24\n\
- adds r2, r7, 0\n\
- movs r6, 0\n\
- asrs r5, r3, 16\n\
- mov r8, r5\n\
- mov r1, r12\n\
- movs r5, 0\n\
- ldrsh r0, [r1, r5]\n\
- cmp r8, r0\n\
- bne _080C4E60\n\
- cmp r7, 0x1\n\
- beq _080C4E78\n\
-_080C4E5A:\n\
- subs r0, r2, 0x1\n\
- lsls r0, 24\n\
- lsrs r2, r0, 24\n\
-_080C4E60:\n\
- adds r6, 0x1\n\
- cmp r6, 0x3\n\
- bgt _080C4E78\n\
- lsls r0, r6, 1\n\
- add r0, r12\n\
- asrs r1, r3, 16\n\
- movs r5, 0\n\
- ldrsh r0, [r0, r5]\n\
- cmp r1, r0\n\
- bne _080C4E60\n\
- cmp r2, 0x1\n\
- bne _080C4E5A\n\
-_080C4E78:\n\
- lsls r1, r6, 24\n\
- lsrs r1, 24\n\
- mov r0, r9\n\
- bl sub_80C4698\n\
- ldr r0, _080C4EAC @ =gIsLinkContest\n\
- ldrb r1, [r0]\n\
- movs r0, 0x1\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _080C4EB8\n\
- ldr r0, _080C4EB0 @ =gStringVar2\n\
- lsls r1, r6, 3\n\
- subs r1, r6\n\
- lsls r1, 2\n\
- ldr r2, _080C4EB4 @ =gLinkPlayers + 0x8\n\
- adds r1, r2\n\
- bl sub_80C4674\n\
- b _080C4EC4\n\
- .align 2, 0\n\
-_080C4EA0: .4byte gUnknown_02038670\n\
-_080C4EA4: .4byte gSpecialVar_0x8006\n\
-_080C4EA8: .4byte gStringVar1\n\
-_080C4EAC: .4byte gIsLinkContest\n\
-_080C4EB0: .4byte gStringVar2\n\
-_080C4EB4: .4byte gLinkPlayers + 0x8\n\
-_080C4EB8:\n\
- ldr r0, _080C4ED8 @ =gStringVar2\n\
- lsls r1, r6, 6\n\
- ldr r2, _080C4EDC @ =gUnknown_0203857D\n\
- adds r1, r2\n\
- bl sub_80C4674\n\
-_080C4EC4:\n\
- mov r1, r10\n\
- asrs r0, r1, 24\n\
- cmp r0, 0x1\n\
- beq _080C4ED0\n\
- cmp r7, r0\n\
- bne _080C4EE4\n\
-_080C4ED0:\n\
- ldr r0, _080C4EE0 @ =gSpecialVar_0x8006\n\
- strh r4, [r0]\n\
- b _080C4EEA\n\
- .align 2, 0\n\
-_080C4ED8: .4byte gStringVar2\n\
-_080C4EDC: .4byte gUnknown_0203857D\n\
-_080C4EE0: .4byte gSpecialVar_0x8006\n\
-_080C4EE4:\n\
- ldr r1, _080C4EFC @ =gSpecialVar_0x8006\n\
- adds r0, r4, 0x4\n\
- strh r0, [r1]\n\
-_080C4EEA:\n\
- add sp, 0x8\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\
-_080C4EFC: .4byte gSpecialVar_0x8006\n\
- .syntax divided");
+ s16 sp0[4];
+ s32 i;
+ s32 j;
+ s16 r4;
+ u8 r2;
+ u8 r7;
+ s8 r10;
+ u8 r4_;
+
+ for (i = 0; i < 4; i++)
+ sp0[i] = gUnknown_02038670[i];
+
+ for (i = 0; i < 3; i++)
+ {
+ for (j = 3; j > i; j--)
+ {
+ if (sp0[j - 1] < sp0[j])
+ {
+ s32 temp = sp0[j];
+
+ sp0[j] = sp0[j - 1];
+ sp0[j - 1] = temp;
+ }
+ }
+ }
+
+ r4 = sp0[gSpecialVar_0x8006];
+ r10 = 0;
+ r7 = 0;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (sp0[i] == r4)
+ {
+ r10++;
+ if (i == gSpecialVar_0x8006)
+ r7 = r10;
+ }
+ }
+
+ for (i = 0; i < 4; i++)
+ {
+ if (sp0[i] == r4)
+ break;
+ }
+
+ r4_ = i;
+ r2 = r7;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (r4 == gUnknown_02038670[i])
+ {
+ if (r2 == 1)
+ break;
+ r2--;
+ }
+ }
+
+ sub_80C4698(gStringVar1, i);
+
+ if (gIsLinkContest & 1)
+ sub_80C4674(gStringVar2, gLinkPlayers[i].name);
+ else
+ sub_80C4674(gStringVar2, gContestMons[i].trainerName);
+
+ if (r10 == 1 || r7 == r10)
+ gSpecialVar_0x8006 = r4_;
+ else
+ gSpecialVar_0x8006 = r4_ + 4;
}
void ShowContestWinnerCleanup(void)
@@ -366,7 +240,7 @@ void ShowContestWinner(void)
sub_80AAF30();
BATTLE_STRUCT->unk15DDF = 1;
BATTLE_STRUCT->unk15DDE = sub_80B2C4C(254, 0);
- sub_80B2A7C(3);
+ Contest_SaveWinner(3);
gUnknown_0203856C = 0;
}
SetMainCallback2(CB2_ContestPainting);
@@ -375,10 +249,10 @@ void ShowContestWinner(void)
void sub_80C4F70(void)
{
- VarSet(0x4010, gContestMons[0].unk16);
- VarSet(0x4011, gContestMons[1].unk16);
- VarSet(0x4012, gContestMons[2].unk16);
- VarSet(0x4013, gContestMons[3].unk16);
+ VarSet(VAR_OBJ_GFX_ID_0, gContestMons[0].trainerGfxId);
+ VarSet(VAR_OBJ_GFX_ID_1, gContestMons[1].trainerGfxId);
+ VarSet(VAR_OBJ_GFX_ID_2, gContestMons[2].trainerGfxId);
+ VarSet(VAR_OBJ_GFX_ID_3, gContestMons[3].trainerGfxId);
}
bool8 GiveMonArtistRibbon(void)
@@ -386,9 +260,9 @@ bool8 GiveMonArtistRibbon(void)
u8 ribbon = GetMonData(&gPlayerParty[gUnknown_02038694], MON_DATA_ARTIST_RIBBON);
if(ribbon == FALSE
- && gUnknown_02038690[gContestPlayerMonIndex] == 0
- && gScriptContestRank == 3
- && (s16)gUnknown_02038678[gContestPlayerMonIndex] >= 800)
+ && gContestFinalStandings[gContestPlayerMonIndex] == 0
+ && gSpecialVar_ContestRank == 3
+ && gUnknown_02038678[gContestPlayerMonIndex] >= 800)
{
ribbon = TRUE;
SetMonData(&gPlayerParty[gUnknown_02038694], MON_DATA_ARTIST_RIBBON, &ribbon);
@@ -420,8 +294,8 @@ void ShowContestEntryMonPic(void)
MenuDrawTextWindow(left, top, 19, 13);
species = gContestMons[gSpecialVar_0x8006].species;
- var1 = gContestMons[gSpecialVar_0x8006].unk38; // v2
- var2 = gContestMons[gSpecialVar_0x8006].unk3C; // v3
+ var1 = gContestMons[gSpecialVar_0x8006].personality;
+ var2 = gContestMons[gSpecialVar_0x8006].otId;
taskId = CreateTask(sub_80C5190, 0x50);
gTasks[taskId].data[0] = 0;
gTasks[taskId].data[1] = species;
@@ -433,7 +307,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;
@@ -487,9 +361,9 @@ void sub_80C5190(u8 taskId)
void ScriptGetMultiplayerId(void)
{
if(gIsLinkContest & 1)
- gScriptResult = GetMultiplayerId();
+ gSpecialVar_Result = GetMultiplayerId();
else
- gScriptResult = 4;
+ gSpecialVar_Result = 4;
}
void ScriptRandom(void)
@@ -501,17 +375,17 @@ void ScriptRandom(void)
{
gUnknown_03005D28 = 1103515245 * gUnknown_03005D28 + 24691;
random = gUnknown_03005D28 >> 16;
- scriptPtr = &gScriptResult;
+ scriptPtr = &gSpecialVar_Result;
}
else
{
- scriptPtr = &gScriptResult;
+ scriptPtr = &gSpecialVar_Result;
random = Random();
}
*scriptPtr = random % *scriptPtr;
}
-void HealPlayerParty(void)
+void ScrSpecial_HealPlayerParty(void)
{
u8 i, j;
u8 ppBonuses;
@@ -542,41 +416,39 @@ void HealPlayerParty(void)
}
}
-u8 ScriptGiveMon(u16 species, u8 var, u16 item, u32 var3, u32 var4, u8 var5)
+u8 ScriptGiveMon(u16 species, u8 level, u16 item, u32 unused1, u32 unused2, u8 unused3)
{
- u16 nationalSpecies;
+ u16 nationalDexNum;
int sentToPc;
- u8 array[2];
+ u8 heldItem[2];
struct Pokemon mon;
- CreateMon(&mon, species, var, 32, 0, 0, 0, 0);
- array[0] = item;
- array[1] = item >> 8;
- SetMonData(&mon, MON_DATA_HELD_ITEM, array);
+ CreateMon(&mon, species, level, 32, 0, 0, 0, 0);
+ heldItem[0] = item;
+ heldItem[1] = item >> 8;
+ SetMonData(&mon, MON_DATA_HELD_ITEM, heldItem);
sentToPc = GiveMonToPlayer(&mon);
- nationalSpecies = SpeciesToNationalPokedexNum(species);
+ nationalDexNum = SpeciesToNationalPokedexNum(species);
- // nested if check to fool compiler
switch(sentToPc)
{
- case 0:
- case 1:
- GetNationalPokedexFlag(nationalSpecies, 2);
- GetNationalPokedexFlag(nationalSpecies, 3);
- return sentToPc;
- default:
- return sentToPc;
+ case 0:
+ case 1:
+ GetSetPokedexFlag(nationalDexNum, 2);
+ GetSetPokedexFlag(nationalDexNum, 3);
+ break;
}
+ return sentToPc;
}
-u8 ScriptGiveEgg(u16 value)
+u8 ScriptGiveEgg(u16 species)
{
struct Pokemon mon;
- u8 data;
+ u8 isEgg;
- sub_8042044(&mon, value, 1);
- data = 1;
- SetMonData(&mon, MON_DATA_IS_EGG, &data);
+ CreateEgg(&mon, species, TRUE);
+ isEgg = TRUE;
+ SetMonData(&mon, MON_DATA_IS_EGG, &isEgg);
return GiveMonToPlayer(&mon);
}
@@ -588,13 +460,13 @@ void CheckForAlivePartyMons(void)
switch(var)
{
case 1:
- gScriptResult = var;
+ gSpecialVar_Result = var;
break;
case 0:
- gScriptResult = var;
+ gSpecialVar_Result = var;
break;
case 2:
- gScriptResult = var;
+ gSpecialVar_Result = var;
break;
}
}
@@ -622,18 +494,18 @@ bool8 GetNameOfEnigmaBerryInPlayerParty(void)
return hasItem;
}
-void ScriptWildBattle(u16 species, u8 level, u16 item)
+void CreateScriptedWildMon(u16 species, u8 level, u16 item)
{
- u8 data[2];
+ u8 heldItem[2];
ZeroEnemyPartyMons();
CreateMon(&gEnemyParty[0], species, level, 0x20, 0, 0, 0, 0);
if(item)
{
- data[0] = item;
- data[1] = item >> 8;
- SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, data);
+ heldItem[0] = item;
+ heldItem[1] = item >> 8;
+ SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, heldItem);
}
}
@@ -658,10 +530,10 @@ void sub_80C5580(void)
switch(var)
{
case 0:
- gScriptResult = 0;
+ gSpecialVar_Result = 0;
break;
default:
- gScriptResult = 1;
+ gSpecialVar_Result = 1;
break;
}
@@ -682,11 +554,11 @@ void SetBattleTowerPlayerParty(void)
{
case 0: // player quit battle tower?
LoadPlayerParty();
- gScriptResult = 0;
+ gSpecialVar_Result = 0;
break;
default: // load battle tower.
ReducePlayerPartyToThree();
- gScriptResult = 1;
+ gSpecialVar_Result = 1;
break;
}
diff --git a/src/script_pokemon_util_80F99CC.c b/src/script_pokemon_util_80F99CC.c
index 2b48cc0d8..df83d3e2d 100644
--- a/src/script_pokemon_util_80F99CC.c
+++ b/src/script_pokemon_util_80F99CC.c
@@ -9,21 +9,23 @@
#include "party_menu.h"
#include "pokemon.h"
#include "pokemon_summary_screen.h"
-#include "rom4.h"
+#include "overworld.h"
#include "script.h"
#include "script_pokemon_80F9.h"
+#include "constants/songs.h"
#include "sound.h"
#include "string_util.h"
#include "task.h"
#include "text.h"
+#include "ewram.h"
-
+extern const u8 gUnknown_08208238[];
extern u8 gPlayerPartyCount;
extern u16 gSpecialVar_0x8004;
extern u16 gSpecialVar_0x8005;
extern u8 gUnknown_02038694;
-extern u16 gScriptResult;
+extern u16 gSpecialVar_Result;
extern void (*gFieldCallback)(void);
@@ -32,34 +34,34 @@ 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);
}
-void sub_80F9A0C(void)
+void SelectMonForNPCTrade(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);
}
-void sub_80F9A4C(void)
+void SelectMoveTutorMon(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)
+ if (!gPaletteFade.active)
{
gPaletteFade.bufferTransferDisabled = 1;
OpenPartyMenu((u8) gTasks[taskId].data[0], 0);
@@ -67,64 +69,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;
}
}
@@ -135,9 +137,9 @@ void sub_80F9C00(void)
{
u8 i;
- for(i = 0; i < gPlayerPartyCount; i++)
+ for (i = 0; i < gPlayerPartyCount; i++)
{
- switch(sub_80AE47C(&gPlayerParty[i]))
+ switch (sub_80AE47C(&gPlayerParty[i]))
{
case 0:
case 3:
@@ -152,20 +154,20 @@ void sub_80F9C00(void)
}
}
-void sub_80F9C6C(u8 var)
+void HandleSelectPartyMenu(u8 var)
{
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
{
- switch(sub_806BD80(var))
+ switch (HandleDefaultPartyMenuInput(var))
{
- case 1:
- PlaySE(5);
+ case A_BUTTON:
+ PlaySE(SE_SELECT);
gUnknown_02038694 = sub_806CA38(var);
gSpecialVar_0x8004 = gUnknown_02038694;
sub_8123138(var);
break;
- case 2:
- PlaySE(5);
+ case B_BUTTON:
+ PlaySE(SE_SELECT);
gUnknown_02038694 = 0xFF;
gSpecialVar_0x8004 = 0xFF;
sub_8123138(var);
@@ -174,67 +176,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;
}
@@ -242,204 +243,100 @@ void sub_80F9E1C(void)
{
u8 i;
- for(i = 0; i < gPlayerPartyCount; i++)
+ for (i = 0; i < gPlayerPartyCount; i++)
{
- if(!sub_8040574(&gPlayerParty[i]))
+ if (!sub_8040574(&gPlayerParty[i]))
sub_806BC3C(i, 0x9A);
else
sub_806BC3C(i, 0x8C);
}
}
-void sub_80F9E64(u8 var)
+void HandleMoveTutorPartyMenu(u8 var)
{
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
{
- switch(sub_806BD80(var))
+ switch (HandleDefaultPartyMenuInput(var))
{
- case 1:
- PlaySE(5);
+ case A_BUTTON:
+ PlaySE(SE_SELECT);
gSpecialVar_0x8004 = sub_806CA38(var);
gSpecialVar_0x8005 = sub_8040574(&gPlayerParty[gSpecialVar_0x8004]);
sub_8123138(var);
break;
- case 2:
- PlaySE(5);
+ case B_BUTTON:
+ PlaySE(SE_SELECT);
gSpecialVar_0x8004 = 0xFF;
sub_8123138(var);
}
}
}
-void sub_80F9EEC(void)
+void SelectMove(void)
{
- sub_809D9F0(&gPlayerParty[0], gSpecialVar_0x8004, gPlayerPartyCount - 1, c2_exit_to_overworld_2_switch, 0);
- unk_2018000.unk8 = 3;
+ ShowSelectMovePokemonSummaryScreen(&gPlayerParty[0], gSpecialVar_0x8004, gPlayerPartyCount - 1, c2_exit_to_overworld_2_switch, 0);
+ UNK_2018000_STRUCT.unk8 = 3;
gFieldCallback = sub_8080990;
}
-void sub_80F9F3C(void) // count pokemon moves
+void ScrSpecial_CountPokemonMoves(void) // count pokemon moves
{
u8 i;
- gScriptResult = 0;
+ gSpecialVar_Result = 0;
- for(i = 0; i < 4; i++) // checks MOVE1-MOVE4
- if(GetMonData(&gPlayerParty[gSpecialVar_0x8004], i + 13))
- gScriptResult++;
+ for (i = 0; i < 4; i++) // checks MOVE1-MOVE4
+ if (GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_MOVE1 + i))
+ gSpecialVar_Result++;
}
-void sub_80F9F84(void)
+void ScrSpecial_GetPokemonNicknameAndMoveName(void)
{
- struct Pokemon *party = &gPlayerParty[gSpecialVar_0x8004];
- u16 data = GetMonData(party, gSpecialVar_0x8005 + 13);
+ struct Pokemon *pkmn = &gPlayerParty[gSpecialVar_0x8004];
+ u16 data = GetMonData(pkmn, MON_DATA_MOVE1 + gSpecialVar_0x8005);
- GetMonNickname(party, gStringVar1);
+ GetMonNickname(pkmn, gStringVar1);
StringCopy(gStringVar2, gMoveNames[data]);
}
-// no. hard
-__attribute__((naked))
-void sub_80F9FDC(struct Pokemon *party, u8 var, u8 var2)
+void sub_80F9FDC(struct Pokemon *pkmn, u8 moveIndex1, u8 moveIndex2)
{
- 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, 0x20\n\
- mov r8, r0\n\
- adds r5, r1, 0\n\
- adds r4, r2, 0\n\
- lsls r5, 24\n\
- lsrs r5, 24\n\
- lsls r4, 24\n\
- lsrs r4, 24\n\
- adds r0, r5, 0\n\
- adds r0, 0xD\n\
- str r0, [sp, 0x8]\n\
- mov r0, r8\n\
- ldr r1, [sp, 0x8]\n\
- bl GetMonData\n\
- mov r1, sp\n\
- adds r1, 0x2\n\
- str r1, [sp, 0x14]\n\
- strh r0, [r1]\n\
- adds r3, r4, 0\n\
- adds r3, 0xD\n\
- str r3, [sp, 0xC]\n\
- mov r0, r8\n\
- adds r1, r3, 0\n\
- bl GetMonData\n\
- mov r1, sp\n\
- strh r0, [r1]\n\
- adds r7, r5, 0\n\
- adds r7, 0x11\n\
- str r7, [sp, 0x10]\n\
- mov r0, r8\n\
- adds r1, r7, 0\n\
- bl GetMonData\n\
- mov r1, sp\n\
- adds r1, 0x5\n\
- str r1, [sp, 0x18]\n\
- strb r0, [r1]\n\
- adds r3, r4, 0\n\
- adds r3, 0x11\n\
- str r3, [sp, 0x1C]\n\
- mov r0, r8\n\
- adds r1, r3, 0\n\
- bl GetMonData\n\
- add r7, sp, 0x4\n\
- mov r10, r7\n\
- strb r0, [r7]\n\
- mov r0, r8\n\
- movs r1, 0x15\n\
- bl GetMonData\n\
- mov r6, sp\n\
- adds r6, 0x6\n\
- strb r0, [r6]\n\
- ldr r1, _080FA0D8 @ =gUnknown_08208238\n\
- adds r0, r5, r1\n\
- ldrb r0, [r0]\n\
- mov r9, r0\n\
- ldrb r0, [r6]\n\
- adds r2, r0, 0\n\
- mov r3, r9\n\
- ands r2, r3\n\
- lsls r5, 1\n\
- asrs r2, r5\n\
- lsls r2, 24\n\
- lsrs r2, 24\n\
- adds r1, r4, r1\n\
- ldrb r3, [r1]\n\
- adds r1, r0, 0\n\
- ands r1, r3\n\
- lsls r4, 1\n\
- asrs r1, r4\n\
- lsls r1, 24\n\
- lsrs r1, 24\n\
- mov r7, r9\n\
- bics r0, r7\n\
- strb r0, [r6]\n\
- ldrb r0, [r6]\n\
- bics r0, r3\n\
- strb r0, [r6]\n\
- lsls r2, r4\n\
- lsls r1, r5\n\
- adds r2, r1\n\
- ldrb r0, [r6]\n\
- orrs r0, r2\n\
- strb r0, [r6]\n\
- mov r0, r8\n\
- ldr r1, [sp, 0x8]\n\
- mov r2, sp\n\
- bl SetMonData\n\
- mov r0, r8\n\
- ldr r1, [sp, 0xC]\n\
- ldr r2, [sp, 0x14]\n\
- bl SetMonData\n\
- mov r0, r8\n\
- ldr r1, [sp, 0x10]\n\
- mov r2, r10\n\
- bl SetMonData\n\
- mov r0, r8\n\
- ldr r1, [sp, 0x1C]\n\
- ldr r2, [sp, 0x18]\n\
- bl SetMonData\n\
- mov r0, r8\n\
- movs r1, 0x15\n\
- adds r2, r6, 0\n\
- bl SetMonData\n\
- add sp, 0x20\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\
-_080FA0D8: .4byte gUnknown_08208238\n\
- .syntax divided");
+ u16 move1 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex1);
+ u16 move2 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex2);
+ u8 pp1 = GetMonData(pkmn, MON_DATA_PP1 + moveIndex1);
+ u8 pp2 = GetMonData(pkmn, MON_DATA_PP1 + moveIndex2);
+ u8 bonuses = GetMonData(pkmn, MON_DATA_PP_BONUSES);
+
+ u8 r2 = (bonuses & gUnknown_08208238[moveIndex1]) >> (moveIndex1 * 2);
+ u8 r1 = (bonuses & gUnknown_08208238[moveIndex2]) >> (moveIndex2 * 2);
+
+ bonuses &= ~gUnknown_08208238[moveIndex1];
+ bonuses &= ~gUnknown_08208238[moveIndex2];
+ bonuses |= (r2 << (moveIndex2 * 2)) + (r1 << (moveIndex1 * 2));
+
+ SetMonData(pkmn, MON_DATA_MOVE1 + moveIndex1, &move2);
+ SetMonData(pkmn, MON_DATA_MOVE1 + moveIndex2, &move1);
+ SetMonData(pkmn, MON_DATA_PP1 + moveIndex1, &pp2);
+ SetMonData(pkmn, MON_DATA_PP1 + moveIndex2, &pp1);
+ SetMonData(pkmn, MON_DATA_PP_BONUSES, &bonuses);
}
-void sub_80FA0DC(void)
+void DeleteMonMove(void)
{
u16 i;
SetMonMoveSlot(&gPlayerParty[gSpecialVar_0x8004], 0, gSpecialVar_0x8005);
RemoveMonPPBonus(&gPlayerParty[gSpecialVar_0x8004], gSpecialVar_0x8005);
- for(i = gSpecialVar_0x8005; i < 3; i++)
+ for (i = gSpecialVar_0x8005; i < 3; i++)
sub_80F9FDC(&gPlayerParty[gSpecialVar_0x8004], i, i + 1);
}
-void sub_80FA148(void)
+void IsSelectedMonEgg(void)
{
struct Pokemon *party = &gPlayerParty[gSpecialVar_0x8004];
- gScriptResult = 0;
+ gSpecialVar_Result = 0;
- if(GetMonData(party, MON_DATA_IS_EGG))
- gScriptResult = 1;
+ if (GetMonData(party, MON_DATA_IS_EGG))
+ gSpecialVar_Result = 1;
}
diff --git a/src/secret_base.c b/src/secret_base.c
deleted file mode 100644
index 4e8331f5c..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 "rom4.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 == 9 && 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;
- FlagReset(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 FlagReset\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/slot_machine.c b/src/slot_machine.c
deleted file mode 100644
index c9a06a758..000000000
--- a/src/slot_machine.c
+++ /dev/null
@@ -1,150 +0,0 @@
-#include "global.h"
-#include "slot_machine.h"
-#include "decompress.h"
-#include "palette.h"
-#include "task.h"
-
-struct UnkStruct2000000 {
- /*0x00*/ u8 filler00[61];
- /*0x3D*/ u8 unk3D;
-};
-
-struct UnkStruct1 {
- /*0x00*/ u8 unk00;
- /*0x01*/ u8 unk01;
- /*0x02*/ s16 unk02;
-};
-
-extern struct UnkStruct2000000 unk_2000000;
-
-extern struct UnkStruct1 *gUnknown_083ED048[];
-extern const u16 gPalette_83EDE24[];
-
-extern const u8 gSlotMachine_Gfx[];
-#if ENGLISH
-#define SLOTMACHINE_GFX_TILES 233
-#elif GERMAN
-#define SLOTMACHINE_GFX_TILES 236
-#endif
-
-extern const u16 gUnknown_08E95A18[];
-
-extern u16 gUnknown_08E95AB8[];
-extern u16 gUnknown_08E95FB8[];
-
-static void LoadSlotMachineWheelOverlay(void);
-
-void sub_8104CAC(u8 arg0) {
- u8 i;
- struct Task *task;
-
- sub_8104DA4();
-
- task = &gTasks[unk_2000000.unk3D];
- task->data[1] = arg0;
-
- i = 0;
- while (gUnknown_083ED048[arg0][i].unk00 != 0xFF)
- {
- u8 spriteId;
- spriteId = sub_8105BB4(
- gUnknown_083ED048[arg0][i].unk00,
- gUnknown_083ED048[arg0][i].unk01,
- gUnknown_083ED048[arg0][i].unk02
- );
- task->data[4 + i] = spriteId;
-
-#ifdef GERMAN
- if (arg0 == 5 && i <= 2)
- {
- gSprites[spriteId].invisible = TRUE;
- }
-#endif
-
- i += 1;
- }
-}
-
-asm(".section .text_b");
-
-void sub_8106448(void) {
- u32 offsetRead, offsetWrite;
- u32 size;
-
- sub_800D238(gSlotMachine_Gfx, (void *) 0x02010000);
-
- offsetRead = 0x02010000;
- offsetWrite = BG_VRAM;
- size = SLOTMACHINE_GFX_TILES * 32;
- while (TRUE)
- {
- DmaCopy16(3, offsetRead, (void *) (offsetWrite), 0x1000);
- offsetRead += 0x1000;
- offsetWrite += 0x1000;
- size -= 0x1000;
- if (size <= 0x1000)
- {
- DmaCopy16(3, offsetRead, (void *) (offsetWrite), size);
- break;
- }
- }
-
- LoadPalette(gUnknown_08E95A18, 0, 160);
- LoadPalette(gPalette_83EDE24, 208, 32);
-}
-
-void sub_81064B8(void) {
- CpuCopy16(gUnknown_08E95AB8, (void *) BG_SCREEN_ADDR(29), 20 * 32 * 2);
- LoadSlotMachineWheelOverlay();
-}
-
-static void LoadSlotMachineWheelOverlay(void) {
- s16 x, y, dx;
- u16 *screen;
-
- screen = (u16 *) BG_SCREEN_ADDR(30);
-
- for (x = 4; x < 18; x += 5)
- {
- for (dx = 0; dx < 4; dx++)
- {
- screen[5 * 32 + dx + x] = 0x2051;
- screen[13 * 32 + dx + x] = 0x2851;
- screen[6 * 32 + dx + x] = 0x2061;
- screen[12 * 32 + dx + x] = 0x2861;
- }
-
- screen[6 * 32 + x] = 0x20BE;
- screen[12 * 32 + x] = 0x28BE;
-
- for (y = 7; y <= 11; y++)
- {
- screen[y * 32 + x] = 0x20BF;
- }
- }
-}
-
-void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4) {
- u16 *vram = (u16 *) BG_SCREEN_ADDR(29);
-
- vram[15 * 32 + arg0] = arg1;
- vram[15 * 32 + 1 + arg0] = arg2;
- vram[16 * 32 + arg0] = arg3;
- vram[16 * 32 + 1 + arg0] = arg4;
-}
-
-void sub_81065DC(void) {
- s16 y, x;
- u16 *screen;
-
- CpuCopy16(gUnknown_08E95FB8, (void *) BG_SCREEN_ADDR(29), 20 * 32 * 2);
-
- screen = (u16 *) BG_SCREEN_ADDR(30);
- for (y = 0; y < 20; y++)
- {
- for (x = 0; x < 30; x++)
- {
- screen[x + y * 32] = 0;
- }
- }
-}
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/strings.c b/src/strings.c
index 219c5bec1..06bbadb8f 100644
--- a/src/strings.c
+++ b/src/strings.c
@@ -409,7 +409,7 @@ const u8 OtherText_Switch[] = _("SWITCH");
const u8 OtherText_PokeInfo[] = _("POKéMON INFO");
const u8 OtherText_PokeSkills[] = _("POKéMON SKILLS");
const u8 OtherText_BattleMoves[] = _("BATTLE MOVES");
-const u8 OtherText_ContestMoves[] = _("C0NTEST MOVES"); // why the l33t 0, that's stupid
+const u8 OtherText_ContestMoves[] = _("C0NTEST MOVES"); // The "O" in "CONTEST" is actually a 0.
const u8 OtherText_Info[] = _("INFO");
const u8 gOtherText_EggLongTime[] = _("It looks like this EGG will\ntake a long time to hatch.");
@@ -861,7 +861,7 @@ const u8 gOtherText_AtBattleStart[] = _("At the battle’s start.");
const u8 gOtherText_UponWinningBattle[] = _("Upon winning a battle.");
const u8 gOtherText_UponLosingBattle[] = _("Upon losing a battle.");
-// mauville_old_man?
+// mauville_man?
const u8 gOtherText_TheBardsSong[] = _("The BARD’s Song");
const u8 gOtherText_WhatsHipHappening[] = _("What’s hip and happening?");
const u8 gOtherText_Interview[] = _("Interview");
@@ -1781,7 +1781,7 @@ const u8 gOtherText_AtBattleStart[] = _("Zum Kampfbeginn");
const u8 gOtherText_UponWinningBattle[] = _("Über den Sieg");
const u8 gOtherText_UponLosingBattle[] = _("Über die Niederlage");
-// mauville_old_man?
+// mauville_man?
const u8 gOtherText_TheBardsSong[] = _("Das BARDEN-Lied");
const u8 gOtherText_WhatsHipHappening[] = _("Was ist hip? Was ist top?");
const u8 gOtherText_Interview[] = _("Interview");
diff --git a/src/tileset_anim.c b/src/tileset_anim.c
deleted file mode 100644
index 34685381d..000000000
--- a/src/tileset_anim.c
+++ /dev/null
@@ -1,630 +0,0 @@
-#include "global.h"
-#include "tileset_anim.h"
-
-extern u8 *gTilesetAnimTable_General_0[];
-extern u8 *gTilesetAnimTable_General_1[];
-extern u8 *gTilesetAnimTable_General_2[];
-extern u8 *gTilesetAnimTable_General_3[];
-extern u8 *gTilesetAnimTable_General_4[];
-extern u8 *gTilesetAnimTable_Lavaridge[];
-extern u8 *gTilesetAnimTable_Pacifidlog_0[];
-extern u8 *gTilesetAnimTable_Underwater[];
-extern u8 *gTilesetAnimTable_Pacifidlog_1[];
-extern u8 *gUnknown_0837BAE4[];
-extern u8 *gUnknown_0837BB04[];
-extern u8 *gTilesetAnimTable_Mauville_0A[];
-extern u8 *gTilesetAnimTable_Mauville_1A[];
-extern u8 *gTilesetAnimTable_Mauville_0B[];
-extern u8 *gTilesetAnimTable_Mauville_1B[];
-extern u8 *gUnknown_0837BFA4[];
-extern u8 *gTilesetAnimTable_Rustboro_0[];
-extern u8 *gTilesetAnimTable_Rustboro_1[];
-extern u8 *gTilesetAnimTable_Cave[];
-extern u8 *gUnknown_0837C93C[];
-extern u8 *gTilesetAnimTable_EverGrande[];
-extern u8 *gTilesetAnimTable_Building[];
-extern u8 *gTilesetAnimTable_SootopolisGym_0[];
-extern u8 *gTilesetAnimTable_SootopolisGym_1[];
-extern u8 *gTilesetAnimTable_EliteFour_0[];
-extern u8 *gTilesetAnimTable_EliteFour_1[];
-extern u8 *gTilesetAnimTable_MauvilleGym[];
-extern u8 *gTilesetAnimTable_BikeShop[];
-
-struct Dma
-{
- u8 *src;
- u8 *dest;
- u16 size;
-};
-
-EWRAM_DATA static struct Dma gTilesetAnimDmas[20] = {0};
-
-static u8 gNumTilesetAnimDmas;
-static u16 gTileset1AnimFrame;
-static u16 gTileset1AnimLength;
-static u16 gTileset2AnimFrame;
-static u16 gTileset2AnimLength;
-static void (*gTileset1AnimCallback)(u16);
-static void (*gTileset2AnimCallback)(u16);
-
-static void StartTileset1Animation(void);
-static void StartTileset2Animation(void);
-
-static void sub_8073014(u16);
-static void sub_8073058(u16);
-
-static void sub_8073070(u16);
-static void sub_8073098(u16);
-static void sub_80730C0(u16);
-static void sub_80730E8(u16);
-static void sub_807361C(u16);
-
-static void sub_8073424(u16);
-static void sub_80734A0(u16);
-static void sub_8073514(u16);
-static void sub_8073540(u16);
-static void sub_80735B4(u16);
-static void sub_80735E4(u16);
-static void sub_80738A8(u16);
-static void sub_8073600(u16);
-static void sub_80738C0(u16);
-static void sub_8073890(u16);
-static void sub_80738EC(u16);
-
-static void sub_80737A4(u16, u8);
-static void sub_80737E0(u16);
-static void sub_8073704(u16, u8);
-static void sub_8073644(u8);
-static void sub_8073808(u16);
-static void sub_8073830(u16, u8);
-static void sub_807368C(u8);
-static void sub_80736DC(u8);
-static void sub_80736B4(u8);
-static void sub_8073868(u16);
-
-static void sub_8073904(u16);
-static void sub_80739C4(u16);
-static void sub_807392C(u16);
-static void sub_807399C(u16);
-static void sub_8073974(u16);
-static void sub_80739EC(u16);
-
-static void ClearTilesetAnimDmas(void)
-{
- gNumTilesetAnimDmas = 0;
- CpuFill32(0, &gTilesetAnimDmas, sizeof(gTilesetAnimDmas));
-}
-
-static void QueueTilesetAnimDma(u8 *src, u8 *dest, u16 size)
-{
- if (gNumTilesetAnimDmas < 20)
- {
- gTilesetAnimDmas[gNumTilesetAnimDmas].src = src;
- gTilesetAnimDmas[gNumTilesetAnimDmas].dest = dest;
- gTilesetAnimDmas[gNumTilesetAnimDmas].size = size;
- gNumTilesetAnimDmas++;
- }
-}
-
-void sub_8072E74(void)
-{
- int i;
- for (i = 0; i < gNumTilesetAnimDmas; i++)
- {
- DmaCopy16(3,
- gTilesetAnimDmas[i].src,
- gTilesetAnimDmas[i].dest,
- gTilesetAnimDmas[i].size);
- }
- gNumTilesetAnimDmas = 0;
-}
-
-void cur_mapheader_run_tileset_funcs_after_some_cpuset(void)
-{
- ClearTilesetAnimDmas();
- StartTileset1Animation();
- StartTileset2Animation();
-}
-
-void sub_8072ED0(void)
-{
- StartTileset2Animation();
-}
-
-void sub_8072EDC(void)
-{
- ClearTilesetAnimDmas();
- if (++gTileset1AnimFrame >= gTileset1AnimLength)
- {
- gTileset1AnimFrame = 0;
- }
- if (++gTileset2AnimFrame >= gTileset2AnimLength)
- {
- gTileset2AnimFrame = 0;
- }
- if (gTileset1AnimCallback)
- {
- gTileset1AnimCallback(gTileset1AnimFrame);
- }
- if (gTileset2AnimCallback)
- {
- gTileset2AnimCallback(gTileset2AnimFrame);
- }
-}
-
-static void StartTileset1Animation(void)
-{
- gTileset1AnimFrame = 0;
- gTileset1AnimLength = 0;
- gTileset1AnimCallback = 0;
- if (gMapHeader.mapData->primaryTileset)
- {
- if (gMapHeader.mapData->primaryTileset->callback)
- {
- gMapHeader.mapData->primaryTileset->callback();
- }
- }
-}
-
-static void StartTileset2Animation(void)
-{
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = 0;
- gTileset2AnimCallback = 0;
- if (gMapHeader.mapData->secondaryTileset)
- {
- if (gMapHeader.mapData->secondaryTileset->callback)
- {
- gMapHeader.mapData->secondaryTileset->callback();
- }
- }
-}
-
-void TilesetCB_General(void)
-{
- gTileset1AnimFrame = 0;
- gTileset1AnimLength = 0x100;
- gTileset1AnimCallback = sub_8073014;
-}
-
-void TilesetCB_Building(void)
-{
- gTileset1AnimFrame = 0;
- gTileset1AnimLength = 0x100;
- gTileset1AnimCallback = sub_8073058;
-}
-
-static void sub_8073014(u16 a1)
-{
- int v1;
- v1 = a1 % 0x10;
- if (v1 == 0) sub_8073070(a1 / 0x10);
- if (v1 == 1) sub_8073098(a1 / 0x10);
- if (v1 == 2) sub_80730C0(a1 / 0x10);
- if (v1 == 3) sub_80730E8(a1 / 0x10);
- if (v1 == 4) sub_807361C(a1 / 0x10);
-}
-
-static void sub_8073058(u16 a1)
-{
- if (a1 % 8 == 0)
- {
- sub_8073904(a1 / 8);
- }
-}
-
-static void sub_8073070(u16 a1)
-{
- int v1;
- v1 = a1 % 4;
- QueueTilesetAnimDma(gTilesetAnimTable_General_0[v1], (u8 *)(BG_VRAM + 0x3f80), 0x80);
-}
-
-static void sub_8073098(u16 a1)
-{
- u8 v1;
- v1 = a1 % 8;
- QueueTilesetAnimDma(gTilesetAnimTable_General_1[v1], (u8 *)(BG_VRAM + 0x3600), 0x3c0);
-}
-
-static void sub_80730C0(u16 a1)
-{
- int v1;
- v1 = a1 % 8;
- QueueTilesetAnimDma(gTilesetAnimTable_General_2[v1], (u8 *)(BG_VRAM + 0x3a00), 0x140);
-}
-
-static void sub_80730E8(u16 a1)
-{
- int v1;
- v1 = a1 % 4;
- QueueTilesetAnimDma(gTilesetAnimTable_General_3[v1], (u8 *)(BG_VRAM + 0x3e00), 0xc0);
-}
-
-void TilesetCB_Petalburg(void)
-{
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = 0;
-}
-
-void TilesetCB_Rustboro(void)
-{
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = sub_8073424;
-}
-
-void TilesetCB_Dewford(void)
-{
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = 0;
-}
-
-void TilesetCB_Slateport(void)
-{
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = 0;
-}
-
-void TilesetCB_Mauville(void)
-{
- gTileset2AnimFrame = gTileset1AnimFrame;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = sub_80734A0;
-}
-
-void TilesetCB_Lavaridge(void)
-{
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = sub_8073514;
-}
-
-void TilesetCB_Fallarbor(void)
-{
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = 0;
-}
-
-void TilesetCB_Fortree(void)
-{
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = 0;
-}
-
-void TilesetCB_Lilycove(void)
-{
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = 0;
-}
-
-void TilesetCB_Mossdeep(void)
-{
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = 0;
-}
-
-void TilesetCB_EverGrande(void)
-{
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = sub_8073540;
-}
-
-void TilesetCB_Pacifidlog(void)
-{
- gTileset2AnimFrame = gTileset1AnimFrame;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = sub_80735B4;
-}
-
-void TilesetCB_Sootopolis(void)
-{
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = 0;
-}
-
-void TilesetCB_Underwater(void)
-{
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = 0x80;
- gTileset2AnimCallback = sub_80735E4;
-}
-
-void TilesetCB_SootopolisGym(void)
-{
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = 0xf0;
- gTileset2AnimCallback = sub_80738A8;
-}
-
-void TilesetCB_Cave(void)
-{
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = sub_8073600;
-}
-
-void TilesetCB_EliteFour(void)
-{
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = 0x80;
- gTileset2AnimCallback = sub_80738C0;
-}
-
-void TilesetCB_MauvilleGym(void)
-{
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = sub_8073890;
-}
-
-void TilesetCB_BikeShop(void)
-{
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = sub_80738EC;
-}
-
-static void sub_8073424(u16 a1)
-{
- int v1;
- v1 = a1 % 8;
- if (v1 == 0)
- {
- sub_80737A4(a1 / 8, 0);
- sub_80737E0(a1 / 8);
- }
- if (v1 == 1) sub_80737A4(a1 / 8, 1);
- if (v1 == 2) sub_80737A4(a1 / 8, 2);
- if (v1 == 3) sub_80737A4(a1 / 8, 3);
- if (v1 == 4) sub_80737A4(a1 / 8, 4);
- if (v1 == 5) sub_80737A4(a1 / 8, 5);
- if (v1 == 6) sub_80737A4(a1 / 8, 6);
- if (v1 == 7) sub_80737A4(a1 / 8, 7);
-}
-
-static void sub_80734A0(u16 a1)
-{
- int v1;
- v1 = a1 % 8;
- if (v1 == 0) sub_8073704(a1 / 8, 0);
- if (v1 == 1) sub_8073704(a1 / 8, 1);
- if (v1 == 2) sub_8073704(a1 / 8, 2);
- if (v1 == 3) sub_8073704(a1 / 8, 3);
- if (v1 == 4) sub_8073704(a1 / 8, 4);
- if (v1 == 5) sub_8073704(a1 / 8, 5);
- if (v1 == 6) sub_8073704(a1 / 8, 6);
- if (v1 == 7) sub_8073704(a1 / 8, 7);
-}
-
-static void sub_8073514(u16 a1)
-{
- int v1;
- v1 = a1 % 0x10;
- if (v1 == 0) sub_8073644(a1 / 0x10);
- if (v1 == 1) sub_8073808(a1 / 0x10);
-}
-
-static void sub_8073540(u16 a1)
-{
- int v1;
- v1 = a1 % 8;
- if (v1 == 0) sub_8073830(a1 / 8, 0);
- if (v1 == 1) sub_8073830(a1 / 8, 1);
- if (v1 == 2) sub_8073830(a1 / 8, 2);
- if (v1 == 3) sub_8073830(a1 / 8, 3);
- if (v1 == 4) sub_8073830(a1 / 8, 4);
- if (v1 == 5) sub_8073830(a1 / 8, 5);
- if (v1 == 6) sub_8073830(a1 / 8, 6);
- if (v1 == 7) sub_8073830(a1 / 8, 7);
-}
-
-static void sub_80735B4(u16 a1)
-{
- int v1;
- v1 = a1 % 0x10;
- if (v1 == 0) sub_807368C(a1 / 0x10);
- if (v1 == 1) sub_80736DC(a1 / 0x10);
-}
-
-static void sub_80735E4(u16 a1)
-{
- int v1;
- v1 = a1 % 0x10;
- if (v1 == 0) sub_80736B4(a1 / 0x10);
-}
-
-static void sub_8073600(u16 a1)
-{
- int v1;
- v1 = a1 % 0x10;
- if (v1 == 1) sub_8073868(a1 / 0x10);
-}
-
-static void sub_807361C(u16 a1)
-{
- int v1;
- v1 = a1 % 4;
- QueueTilesetAnimDma(gTilesetAnimTable_General_4[v1], (u8 *)(BG_VRAM + 0x3c00), 0x140);
-}
-
-static void sub_8073644(u8 a1)
-{
- u8 v1;
- v1 = a1 % 4;
- QueueTilesetAnimDma(gTilesetAnimTable_Lavaridge[v1], (u8 *)(BG_VRAM + 0x6400), 0x80);
- v1 = (a1 + 2) % 4;
- QueueTilesetAnimDma(gTilesetAnimTable_Lavaridge[v1], (u8 *)(BG_VRAM + 0x6480), 0x80);
-}
-
-static void sub_807368C(u8 a1)
-{
- int v1;
- v1 = a1 % 4;
- QueueTilesetAnimDma(gTilesetAnimTable_Pacifidlog_0[v1], (u8 *)(BG_VRAM + 0x7a00), 0x3c0);
-}
-
-static void sub_80736B4(u8 a1)
-{
- int v1;
- v1 = a1 % 4;
- QueueTilesetAnimDma(gTilesetAnimTable_Underwater[v1], (u8 *)(BG_VRAM + 0x7e00), 0x80);
-}
-
-static void sub_80736DC(u8 a1)
-{
- int v1;
- v1 = a1 % 8;
- QueueTilesetAnimDma(gTilesetAnimTable_Pacifidlog_1[v1], (u8 *)(BG_VRAM + 0x7e00), 0x100);
-}
-
-static void sub_8073704(u16 a1, u8 a2)
-{
- int v1;
- a1 -= a2;
- if (a1 < 12)
- {
- v1 = a1 % 12;
- QueueTilesetAnimDma(gTilesetAnimTable_Mauville_0A[v1], gUnknown_0837BAE4[a2], 0x80);
- QueueTilesetAnimDma(gTilesetAnimTable_Mauville_1A[v1], gUnknown_0837BB04[a2], 0x80);
- }
- else
- {
- v1 = a1 % 4;
- QueueTilesetAnimDma(gTilesetAnimTable_Mauville_0B[v1], gUnknown_0837BAE4[a2], 0x80);
- QueueTilesetAnimDma(gTilesetAnimTable_Mauville_1B[v1], gUnknown_0837BB04[a2], 0x80);
- }
-}
-
-static void sub_80737A4(u16 a1, u8 a2)
-{
- int v1;
- a1 -= a2;
-
- v1 = a1 % 8;
- if (gTilesetAnimTable_Rustboro_0[v1])
- {
- QueueTilesetAnimDma(gTilesetAnimTable_Rustboro_0[v1], gUnknown_0837BFA4[a2], 0x80);
- }
-}
-
-static void sub_80737E0(u16 a1)
-{
- int v1;
- v1 = a1 % 2;
- QueueTilesetAnimDma(gTilesetAnimTable_Rustboro_1[v1], (u8 *)(BG_VRAM + 0x7800), 0x80);
-}
-
-static void sub_8073808(u16 a1)
-{
- int v1;
- v1 = a1 % 4;
- QueueTilesetAnimDma(gTilesetAnimTable_Cave[v1], (u8 *)(BG_VRAM + 0x5400), 0x80);
-}
-
-static void sub_8073830(u16 a1, u8 a2)
-{
- int v1;
- a1 -= a2;
- v1 = a1 % 8;
- QueueTilesetAnimDma(gTilesetAnimTable_EverGrande[v1], gUnknown_0837C93C[a2], 0x80);
-}
-
-static void sub_8073868(u16 a1)
-{
- int v1;
- v1 = a1 % 4;
- QueueTilesetAnimDma(gTilesetAnimTable_Cave[v1], (u8 *)(BG_VRAM + 0x7400), 0x80);
-}
-
-static void sub_8073890(u16 a1)
-{
- int v1;
- v1 = a1 % 2;
- if (!v1)
- {
- sub_80739C4(a1 / 2);
- }
-}
-
-static void sub_80738A8(u16 a1)
-{
- int v1;
- v1 = a1 % 8;
- if (!v1)
- {
- sub_807392C(a1 / 8);
- }
-}
-
-static void sub_80738C0(u16 a1)
-{
- if (a1 % 0x40 == 0)
- {
- sub_807399C(a1 / 0x40);
- }
- if (a1 % 8 == 1)
- {
- sub_8073974(a1 / 8);
- }
-}
-
-static void sub_80738EC(u16 a1)
-{
- if (a1 % 4 == 0)
- {
- sub_80739EC(a1 / 4);
- }
-}
-
-static void sub_8073904(u16 a1)
-{
- int v1;
- v1 = a1 % 2;
- QueueTilesetAnimDma(gTilesetAnimTable_Building[v1], (u8 *)(BG_VRAM + 0x3e00), 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);
-}
-
-static void sub_8073974(u16 a1)
-{
- int v1;
- v1 = a1 % 4;
- QueueTilesetAnimDma(gTilesetAnimTable_EliteFour_0[v1], (u8 *)(BG_VRAM + 0x7f00), 0x20);
-}
-
-static void sub_807399C(u16 a1)
-{
- int v1;
- v1 = a1 % 2;
- QueueTilesetAnimDma(gTilesetAnimTable_EliteFour_1[v1], (u8 *)(BG_VRAM + 0x7c00), 0x80);
-}
-
-static void sub_80739C4(u16 a1)
-{
- int v1;
- v1 = a1 % 2;
- QueueTilesetAnimDma(gTilesetAnimTable_MauvilleGym[v1], (u8 *)(BG_VRAM + 0x5200), 0x200);
-}
-
-static void sub_80739EC(u16 a1)
-{
- int v1;
- v1 = a1 % 2;
- QueueTilesetAnimDma(gTilesetAnimTable_BikeShop[v1], (u8 *)(BG_VRAM + 0x7e00), 0x120);
-}
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/trainer_see.c b/src/trainer_see.c
deleted file mode 100644
index feb35c67c..000000000
--- a/src/trainer_see.c
+++ /dev/null
@@ -1,455 +0,0 @@
-#include "global.h"
-#include "trainer_see.h"
-#include "battle_setup.h"
-#include "field_effect.h"
-#include "field_map_obj.h"
-#include "field_player_avatar.h"
-#include "script.h"
-#include "sprite.h"
-#include "task.h"
-#include "util.h"
-
-extern bool8 (*gIsTrainerInRange[])(struct MapObject *, u16, s16, s16);
-extern bool8 (*gTrainerSeeFuncList[])(u8, struct Task *, struct MapObject *);
-extern bool8 (*gTrainerSeeFuncList2[])(u8, struct Task *, struct MapObject *);
-
-extern struct SpriteTemplate gSpriteTemplate_839B510;
-extern struct SpriteTemplate gSpriteTemplate_839B528;
-
-bool8 CheckTrainers(void)
-{
- u8 i;
-
- for (i = 0; i < 16; i++)
- {
- if ( gMapObjects[i].active )
- if ( gMapObjects[i].trainerType == 1 || gMapObjects[i].trainerType == 3 )
- if ( CheckTrainer(i) )
- return TRUE;
- }
- return FALSE;
-}
-
-bool8 CheckTrainer(u8 trainer)
-{
- u8 *scriptPtr = GetFieldObjectScriptPointerByFieldObjectId(trainer);
-
- if (GetTrainerFlagFromScriptPointer(scriptPtr))
- return FALSE;
- else
- {
- struct MapObject *trainerObj = &gMapObjects[trainer];
- u8 canApproach = TrainerCanApproachPlayer(trainerObj);
-
- if (canApproach != 0)
- {
- TrainerWantsBattle(trainer, scriptPtr);
- sub_80842C8(trainerObj, (canApproach - 1));
- return TRUE;
- }
- else
- {
- return FALSE;
- }
- }
-}
-
-bool8 TrainerCanApproachPlayer(struct MapObject *trainerObj)
-{
- s16 x, y;
- u8 i;
- u8 playerCoord;
-
- PlayerGetDestCoords(&x, &y);
- if ( trainerObj->trainerType == 1 ) // trainers that don't spin
- {
- playerCoord = gIsTrainerInRange[trainerObj->mapobj_unk_18 - 1](trainerObj, trainerObj->trainerRange_berryTreeId, x, y);
- return CheckPathBetweenTrainerAndPlayer((struct MapObject2 *)trainerObj, playerCoord, trainerObj->mapobj_unk_18);
- }
- else // spinners
- {
- for (i = 0; i < 4; i++)
- {
- playerCoord = gIsTrainerInRange[i](trainerObj, trainerObj->trainerRange_berryTreeId, x, y);
- if ( CheckPathBetweenTrainerAndPlayer((struct MapObject2 *)trainerObj, playerCoord, i + 1) ) // directions are 1-4 instead of 0-3. south north west east
- return playerCoord;
- }
- return FALSE;
- }
-}
-
-bool8 IsTrainerInRangeSouth(struct MapObject *trainerObj, s16 vision, s16 x, s16 y)
-{
- if ( trainerObj->coords2.x == x
- && y > trainerObj->coords2.y
- && y <= trainerObj->coords2.y + vision )
- return (y - trainerObj->coords2.y);
- else
- return FALSE;
-}
-
-bool8 IsTrainerInRangeNorth(struct MapObject *trainerObj, s16 vision, s16 x, s16 y)
-{
- if ( trainerObj->coords2.x == x
- && y < trainerObj->coords2.y
- && y >= trainerObj->coords2.y - vision )
- return (trainerObj->coords2.y - y);
- else
- return FALSE;
-}
-
-bool8 IsTrainerInRangeWest(struct MapObject *trainerObj, s16 vision, s16 x, s16 y)
-{
- if ( trainerObj->coords2.y == y
- && x < trainerObj->coords2.x
- && x >= trainerObj->coords2.x - vision )
- return (trainerObj->coords2.x - x);
- else
- return FALSE;
-}
-
-bool8 IsTrainerInRangeEast(struct MapObject *trainerObj, s16 vision, s16 x, s16 y)
-{
- if ( trainerObj->coords2.y == y
- && x > trainerObj->coords2.x
- && x <= trainerObj->coords2.x + vision )
- return (x - trainerObj->coords2.x);
- else
- return FALSE;
-}
-
-#ifdef BUGFIX_TRAINERAPPROACH
-#define COLLISION_MASK ~1
-#else
-#define COLLISION_MASK 1
-#endif
-
-bool8 CheckPathBetweenTrainerAndPlayer(struct MapObject2 *trainerObj, u8 playerCoord, u8 direction)
-{
- s16 x, y;
- u8 unk19_temp;
- u8 unk19b_temp;
- u8 i;
- u8 var;
-
- if (!playerCoord)
- return FALSE;
-
- x = trainerObj->coords2.x;
- y = trainerObj->coords2.y;
-
- for (i = 0; i <= playerCoord - 1; i++, MoveCoords(direction, &x, &y))
- {
- var = sub_8060024((struct MapObject *)trainerObj, x, y, direction);
-
- if (var && (var & COLLISION_MASK))
- return FALSE;
- }
-
- // preserve mapobj_unk_19 before clearing.
- unk19_temp = trainerObj->mapobj_unk_19;
- unk19b_temp = trainerObj->mapobj_unk_19b;
- trainerObj->mapobj_unk_19 = 0;
- trainerObj->mapobj_unk_19b = 0;
-
- var = npc_block_way((struct MapObject *)trainerObj, x, y, direction);
-
- trainerObj->mapobj_unk_19 = unk19_temp;
- trainerObj->mapobj_unk_19b = unk19b_temp;
- if (var == 4)
- return playerCoord;
-
- return FALSE;
-}
-
-void sub_80842C8(struct MapObject *trainerObj, u8 taskId)
-{
- struct Task *task = &gTasks[CreateTask(RunTrainerSeeFuncList, 0x50)];
-
- task->data[1] = (u32)(trainerObj) >> 16;
- task->data[2] = (u32)(trainerObj);
- task->data[3] = taskId;
-}
-
-void sub_80842FC(TaskFunc func)
-{
- TaskFunc func2 = RunTrainerSeeFuncList;
- u8 taskId = FindTaskIdByFunc(func2);
-
- SetTaskFuncWithFollowupFunc(taskId, RunTrainerSeeFuncList, func);
- gTasks[taskId].data[0] = 1;
- func2(taskId);
-}
-
-void RunTrainerSeeFuncList(u8 taskId)
-{
- struct Task *task = &gTasks[taskId];
- struct MapObject *trainerObj = (struct MapObject *)((task->data[1] << 16) | (task->data[2]));
-
- if (!trainerObj->active)
- SwitchTaskToFollowupFunc(taskId);
- else
- while (gTrainerSeeFuncList[task->data[0]](taskId, task, trainerObj));
-}
-
-u8 sub_8084394() // cant be void because it is called with RunTrainerSeeFuncList with arguments.
-{
- return 0;
-}
-
-s8 sub_8084398(u8 taskId, struct Task *task, struct MapObject *trainerObj)
-{
- u8 direction;
-
- FieldObjectGetLocalIdAndMap(trainerObj, (u8 *)&gUnknown_0202FF84[0], (u8 *)&gUnknown_0202FF84[1], (u8 *)&gUnknown_0202FF84[2]);
- FieldEffectStart(0);
-
- direction = GetFaceDirectionAnimId(trainerObj->mapobj_unk_18);
-
- FieldObjectSetSpecialAnim(trainerObj, direction);
- task->data[0]++;
- return 1;
-}
-
-s8 sub_80843DC(u8 taskId, struct Task *task, struct MapObject *trainerObj)
-{
- if (FieldEffectActiveListContains(0))
- return 0;
- else
- {
- task->data[0]++;
- if ((u8)(trainerObj->animPattern - 57) <= 1)
- task->data[0] = 6;
- if (trainerObj->animPattern == 63)
- task->data[0] = 8;
- return 1;
- }
-}
-
-s8 sub_808441C(u8 taskId, struct Task *task, struct MapObject *trainerObj)
-{
- if (!(FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj)) || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj))
- {
- if (task->data[3])
- {
- FieldObjectSetSpecialAnim(trainerObj, GetGoSpeed0AnimId(trainerObj->mapobj_unk_18));
- task->data[3]--;
- }
- else
- {
- FieldObjectSetSpecialAnim(trainerObj, 0x3E);
- task->data[0]++;
- }
- }
- return 0;
-}
-
-s8 sub_8084478(u8 taskId, struct Task *task, struct MapObject *trainerObj)
-{
- struct MapObject *playerObj;
-
- if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj) && !FieldObjectClearAnimIfSpecialAnimFinished(trainerObj))
- return 0;
-
- npc_set_running_behaviour_etc(trainerObj, npc_running_behaviour_by_direction(trainerObj->mapobj_unk_18));
- sub_805C774(trainerObj, npc_running_behaviour_by_direction(trainerObj->mapobj_unk_18));
- sub_805C754(trainerObj);
-
- playerObj = &gMapObjects[gPlayerAvatar.mapObjectId];
- if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerObj)
- && !FieldObjectClearAnimIfSpecialAnimFinished(playerObj))
- return 0;
-
- sub_80597E8();
- FieldObjectSetSpecialAnim(&gMapObjects[gPlayerAvatar.mapObjectId], GetFaceDirectionAnimId(GetOppositeDirection(trainerObj->mapobj_unk_18)));
- task->data[0]++;
- return 0;
-}
-
-s8 sub_8084534(u8 taskId, struct Task *task, struct MapObject *trainerObj) // technically only 1 parameter, but needs all 3 for TrainerSeeFuncList call.
-{
- struct MapObject *playerObj = &gMapObjects[gPlayerAvatar.mapObjectId];
-
- if ( !FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerObj)
- || FieldObjectClearAnimIfSpecialAnimFinished(playerObj) )
- SwitchTaskToFollowupFunc(taskId);
-
- return 0;
-}
-
-s8 sub_8084578(u8 taskId, struct Task *task, struct MapObject *trainerObj)
-{
- if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj)
- || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj))
- {
- FieldObjectSetSpecialAnim(trainerObj, 0x59);
- task->data[0]++;
- }
- return 0;
-}
-
-s8 sub_80845AC(u8 taskId, struct Task *task, struct MapObject *trainerObj)
-{
- if ( FieldObjectClearAnimIfSpecialAnimFinished(trainerObj) )
- task->data[0] = 3;
-
- return 0;
-}
-
-s8 sub_80845C8(u8 taskId, struct Task *task, struct MapObject *trainerObj)
-{
- if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj)
- || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj))
- {
- FieldObjectSetSpecialAnim(trainerObj, 0x3E);
- task->data[0]++;
- }
- return 0;
-}
-
-s8 sub_80845FC(u8 taskId, struct Task *task, struct MapObject *trainerObj)
-{
- if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(trainerObj))
- {
- gUnknown_0202FF84[0] = trainerObj->coords2.x;
- gUnknown_0202FF84[1] = trainerObj->coords2.y;
- gUnknown_0202FF84[2] = gSprites[trainerObj->spriteId].subpriority - 1;
- gUnknown_0202FF84[3] = 2;
- task->data[4] = FieldEffectStart(49);
- task->data[0]++;
- }
- return 0;
-}
-
-s8 sub_8084654(u8 taskId, struct Task *task, struct MapObject *trainerObj)
-{
- struct Sprite *sprite;
-
- if (gSprites[task->data[4]].animCmdIndex == 2)
- {
- trainerObj->mapobj_bit_26 = 0;
- trainerObj->mapobj_bit_2 = 1;
-
- sprite = &gSprites[trainerObj->spriteId];
- sprite->oam.priority = 2;
- FieldObjectClearAnimIfSpecialAnimFinished(trainerObj);
- FieldObjectSetSpecialAnim(trainerObj, sub_806084C(trainerObj->mapobj_unk_18));
- task->data[0]++;
- }
- return 0;
-}
-
-s8 sub_80846C8(u8 taskId, struct Task *task, struct MapObject *trainerObj)
-{
- if (!FieldEffectActiveListContains(49))
- task->data[0] = 3;
-
- return 0;
-}
-
-void sub_80846E4(u8 taskId)
-{
- struct Task *task = &gTasks[taskId];
- struct MapObject *mapObj;
-
- // another mapObj loaded into by loadword?
- LoadWordFromTwoHalfwords(&task->data[1], (u32 *)&mapObj);
- if (!task->data[7])
- {
- FieldObjectClearAnim(mapObj);
- task->data[7]++;
- }
- gTrainerSeeFuncList2[task->data[0]](taskId, task, mapObj);
- if (task->data[0] == 3 && !FieldEffectActiveListContains(49))
- {
- npc_set_running_behaviour_etc(mapObj, npc_running_behaviour_by_direction(mapObj->mapobj_unk_18));
- sub_805C774(mapObj, npc_running_behaviour_by_direction(mapObj->mapobj_unk_18));
- DestroyTask(taskId);
- }
- else
- mapObj->mapobj_bit_7 = 0;
-}
-
-void sub_8084794(struct MapObject *var)
-{
- StoreWordInTwoHalfwords(&gTasks[CreateTask(sub_80846E4, 0)].data[1], (u32)var);
-}
-
-void sub_80847C8(void)
-{
- sub_80842FC(sub_80847D8);
-}
-
-void sub_80847D8(u8 taskId)
-{
- DestroyTask(taskId);
- EnableBothScriptContexts();
-}
-
-u8 FldEff_ExclamationMarkIcon1(void)
-{
- u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839B510, 0, 0, 0x53);
-
- if (spriteId != 64)
- sub_8084894(&gSprites[spriteId], 0, 0);
-
- return 0;
-}
-
-u8 FldEff_ExclamationMarkIcon2(void)
-{
- u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839B510, 0, 0, 0x52);
-
- if (spriteId != 64)
- sub_8084894(&gSprites[spriteId], 33, 1);
-
- return 0;
-}
-
-u8 FldEff_HeartIcon(void)
-{
- u8 spriteId = CreateSpriteAtEnd(&gSpriteTemplate_839B528, 0, 0, 0x52);
-
- if (spriteId != 64)
- sub_8084894(&gSprites[spriteId], 46, 0);
-
- return 0;
-}
-
-void sub_8084894(struct Sprite *sprite, u16 a2, u8 a3)
-{
- sprite->oam.priority = 1;
- sprite->coordOffsetEnabled = 1;
-
- sprite->data0 = gUnknown_0202FF84[0];
- sprite->data1 = gUnknown_0202FF84[1];
- sprite->data2 = gUnknown_0202FF84[2];
- sprite->data3 = -5;
- sprite->data7 = a2;
-
- StartSpriteAnim(sprite, a3);
-}
-
-void objc_exclamation_mark_probably(struct Sprite *sprite)
-{
- u8 mapObjId;
-
- if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data0, sprite->data1, sprite->data2, &mapObjId)
- || sprite->animEnded)
- {
- FieldEffectStop(sprite, (u8)sprite->data7);
- }
- else
- {
- struct Sprite *mapObjSprite = &gSprites[gMapObjects[mapObjId].spriteId];
- sprite->data4 += sprite->data3;
- sprite->pos1.x = mapObjSprite->pos1.x;
- sprite->pos1.y = mapObjSprite->pos1.y - 16;
- sprite->pos2.x = mapObjSprite->pos2.x;
- sprite->pos2.y = mapObjSprite->pos2.y + sprite->data4;
- if (sprite->data4)
- sprite->data3++;
- else
- sprite->data3 = 0;
- }
-}
diff --git a/src/unknown_debug_menu.c b/src/unknown_debug_menu.c
deleted file mode 100644
index a81625f2a..000000000
--- a/src/unknown_debug_menu.c
+++ /dev/null
@@ -1,52 +0,0 @@
-#include "global.h"
-#include "menu.h"
-
-extern u8 gBattleCommunication[];
-
-extern u8 (*gCallback_03004AE8)(void);
-
-extern const struct MenuAction gUnknown_0842C29C[];
-
-static u8 sub_814A464(void);
-
-int unref_sub_814A414(void)
-{
- MenuZeroFillScreen();
- MenuDrawTextWindow(0, 0, 16, 18);
- PrintMenuItems(2, 1, 8, gUnknown_0842C29C);
- InitMenu(0, 1, 1, 8, 0, 15);
- gCallback_03004AE8 = sub_814A464;
- return 0;
-}
-
-static u8 sub_814A464(void)
-{
- s8 result = ProcessMenuInput();
- if (result == -2)
- {
- return 0;
- }
- else if (result == -1)
- {
- CloseMenu();
- return 1;
- }
- else
- {
- gBattleCommunication[0] = result;
- gCallback_03004AE8 = gUnknown_0842C29C[result].func;
- return 0;
- }
-}
-
-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;
- CloseMenu();
- return 1;
-}
diff --git a/src/unknown_task.c b/src/unknown_task.c
index 81b89ef92..2c71bfb08 100644
--- a/src/unknown_task.c
+++ b/src/unknown_task.c
@@ -2,45 +2,25 @@
#include "data2.h"
#include "task.h"
#include "trig.h"
-
-struct UnknownStruct1
-{
- void *src[2];
- void *dest;
- u32 unkC;
- void (*unk10)(void);
- u8 srcBank;
- u8 unk15;
- u8 unk16;
- u8 unk17;
- u8 taskId;
- u8 filler19[0x7];
-};
-
-struct UnknownStruct2
-{
- void *dest;
- u32 control;
- u8 unk8;
- u8 unk9;
-};
+#include "unknown_task.h"
static void sub_80896F4(void);
static void sub_8089714(void);
extern u16 gUnknown_030041B0;
-extern u16 gUnknown_030041B4;
+extern u16 gBattle_BG1_Y;
extern u16 gUnknown_030041B8;
-extern u16 gUnknown_03004280;
-extern u16 gUnknown_03004288;
-extern u16 gUnknown_030042A0;
-extern u16 gUnknown_030042A4;
-extern u16 gUnknown_030042C0;
+extern u16 gBattle_BG2_Y;
+extern u16 gBattle_BG2_X;
+extern u16 gBattle_BG0_Y;
+extern u16 gBattle_BG0_X;
+extern u16 gBattle_BG1_X;
extern u8 gUnknown_0202FFA4;
-extern struct UnknownStruct1 gUnknown_03004DC0;
+extern struct UnknownTaskStruct2 gUnknown_03004DC0;
+// Is this a struct?
extern u16 gUnknown_03004DE0[][0x3C0];
void remove_some_task(void)
@@ -68,7 +48,7 @@ void dp12_8087EA4(void)
gUnknown_03004DC0.taskId = 0xFF;
}
-void sub_80895F8(struct UnknownStruct2 unk)
+void sub_80895F8(struct UnknownTaskStruct unk)
{
if (unk.control == (((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1))
{
@@ -140,22 +120,22 @@ static void task00_for_dp12(u8 taskId)
switch (gTasks[taskId].data[6])
{
case 0x0:
- value = gUnknown_030042A4;
+ value = gBattle_BG0_X;
break;
case 0x2:
- value = gUnknown_030042A0;
+ value = gBattle_BG0_Y;
break;
case 0x4:
- value = gUnknown_030042C0;
+ value = gBattle_BG1_X;
break;
case 0x6:
- value = gUnknown_030041B4;
+ value = gBattle_BG1_Y;
break;
case 0x8:
- value = gUnknown_03004288;
+ value = gBattle_BG2_X;
break;
case 0xA:
- value = gUnknown_03004280;
+ value = gBattle_BG2_Y;
break;
case 0xC:
value = gUnknown_030041B0;
@@ -214,7 +194,7 @@ u8 sub_8089944(u8 a1, u8 a2, u8 a3, u8 a4, u8 a5, u8 a6, u8 a7)
{
int i;
int offset;
- struct UnknownStruct2 unk;
+ struct UnknownTaskStruct unk;
u8 taskId;
dp12_8087EA4();
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)
diff --git a/src/unused_81258BC.c b/src/unused_81258BC.c
new file mode 100644
index 000000000..c509ea4c9
--- /dev/null
+++ b/src/unused_81258BC.c
@@ -0,0 +1,36 @@
+#include "constants/songs.h"
+#include "global.h"
+#include "menu.h"
+#include "mystery_event_script.h"
+#include "sound.h"
+#include "text.h"
+
+void sub_812AF10(void);
+
+bool8 unref_sub_812AECC(u8 *script)
+{
+ u8 result = RunMysteryEventScript(script);
+ switch (result)
+ {
+ case 0:
+ return FALSE;
+ case 1:
+ PlaySE(SE_BOO);
+ return TRUE;
+ case 2:
+ sub_812AF10();
+ return FALSE;
+ case 3:
+ PlaySE(SE_BOO);
+ sub_812AF10();
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
+void sub_812AF10(void)
+{
+ MenuDrawTextWindow(2, 14, 27, 19);
+ MenuPrint(gStringVar4, 3, 15);
+} \ No newline at end of file