summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarcus Huderle <huderlem@gmail.com>2018-04-05 18:28:16 -0700
committerMarcus Huderle <huderlem@gmail.com>2018-04-05 18:28:16 -0700
commitd975a85c84616155e226b2d5120aee9adcae16b5 (patch)
tree0668eb03388e9404e134e24b3dcd753f7bc47050 /src
parent37396ce835e702248b9e8fa1bbaec07b8b64ab4f (diff)
parent62388f3bfd5b1abd9fa369628b805e683e64c302 (diff)
Merge remote-tracking branch 'upstream/master' into various_data
Diffstat (limited to 'src')
-rw-r--r--src/bard_music.c (renamed from src/field/bard_music.c)4
-rw-r--r--src/battle/anim/aurora.c6
-rw-r--r--src/battle/anim/blow_kiss.c6
-rw-r--r--src/battle/anim/bubble.c6
-rw-r--r--src/battle/anim/bug.c59
-rw-r--r--src/battle/anim/bullet.c4
-rw-r--r--src/battle/anim/cutter.c60
-rw-r--r--src/battle/anim/cyclone.c2
-rw-r--r--src/battle/anim/dark.c898
-rw-r--r--src/battle/anim/dragon.c4
-rw-r--r--src/battle/anim/draw.c116
-rw-r--r--src/battle/anim/drum.c2
-rw-r--r--src/battle/anim/egg.c2
-rw-r--r--src/battle/anim/energy_wave.c10
-rw-r--r--src/battle/anim/fight.c664
-rw-r--r--src/battle/anim/fire_2.c75
-rw-r--r--src/battle/anim/flying_hearts.c2
-rw-r--r--src/battle/anim/flying_path.c28
-rw-r--r--src/battle/anim/glitter.c2
-rw-r--r--src/battle/anim/grip.c2
-rw-r--r--src/battle/anim/guard.c7
-rw-r--r--src/battle/anim/guillotine.c6
-rw-r--r--src/battle/anim/heart_1.c2
-rw-r--r--src/battle/anim/heated_rock.c92
-rw-r--r--src/battle/anim/homing.c2
-rw-r--r--src/battle/anim/hop.c2
-rw-r--r--src/battle/anim/lunge_1.c14
-rw-r--r--src/battle/anim/lunge_2.c4
-rw-r--r--src/battle/anim/money.c4
-rw-r--r--src/battle/anim/note_rain.c4
-rw-r--r--src/battle/anim/note_scatter_2.c4
-rw-r--r--src/battle/anim/orbit.c12
-rw-r--r--src/battle/anim/orbit_fast.c17
-rw-r--r--src/battle/anim/orbit_scatter.c14
-rw-r--r--src/battle/anim/orbs.c18
-rw-r--r--src/battle/anim/perceive.c2
-rw-r--r--src/battle/anim/poison.c36
-rw-r--r--src/battle/anim/powder.c17
-rw-r--r--src/battle/anim/psychic.c900
-rw-r--r--src/battle/anim/ring.c22
-rw-r--r--src/battle/anim/rock.c602
-rw-r--r--src/battle/anim/scan.c12
-rw-r--r--src/battle/anim/seed.c31
-rw-r--r--src/battle/anim/shadow_minimize.c13
-rw-r--r--src/battle/anim/slash.c2
-rw-r--r--src/battle/anim/slice.c20
-rw-r--r--src/battle/anim/sonic.c38
-rw-r--r--src/battle/anim/sonic_task.c2
-rw-r--r--src/battle/anim/sunlight.c2
-rw-r--r--src/battle/anim/sword.c4
-rw-r--r--src/battle/anim/tile_out.c2
-rw-r--r--src/battle/anim/unused_4.c4
-rw-r--r--src/battle/anim/unused_7.c4
-rw-r--r--src/battle/anim/unused_8.c6
-rw-r--r--src/battle/anim/unused_9.c19
-rw-r--r--src/battle/anim/water.c4
-rw-r--r--src/battle/anim/wisp_fire.c4
-rw-r--r--src/battle/anim/wisp_orb.c4
-rw-r--r--src/battle/anim/withdraw.c6
-rw-r--r--src/battle/battle_2.c2163
-rw-r--r--src/battle/battle_4.c204
-rw-r--r--src/battle/battle_7.c30
-rw-r--r--src/battle/battle_ai.c8
-rw-r--r--src/battle/battle_anim.c113
-rw-r--r--src/battle/battle_anim_807B69C.c4
-rw-r--r--src/battle/battle_anim_80A7E7C.c480
-rw-r--r--src/battle/battle_bg.c763
-rw-r--r--src/battle/battle_controller_linkopponent.c108
-rw-r--r--src/battle/battle_controller_linkpartner.c112
-rw-r--r--src/battle/battle_controller_opponent.c468
-rw-r--r--src/battle/battle_controller_player.c341
-rw-r--r--src/battle/battle_controller_safari.c26
-rw-r--r--src/battle/battle_controller_wally.c76
-rw-r--r--src/battle/battle_interface.c31
-rw-r--r--src/battle/battle_records.c53
-rw-r--r--src/battle/battle_setup.c21
-rw-r--r--src/battle/battle_transition.c4
-rw-r--r--src/battle/battle_util.c330
-rw-r--r--src/battle/contest_link_80C857C.c723
-rw-r--r--src/battle/pokeball.c52
-rw-r--r--src/battle/reshow_battle_screen.c48
-rw-r--r--src/battle_tower.c (renamed from src/field/battle_tower.c)247
-rw-r--r--src/berry.c (renamed from src/field/berry.c)136
-rw-r--r--src/berry_blender.c (renamed from src/scene/berry_blender.c)351
-rw-r--r--src/berry_tag_screen.c (renamed from src/field/berry_tag_screen.c)4
-rw-r--r--src/bike.c (renamed from src/field/bike.c)22
-rw-r--r--src/birch_pc.c (renamed from src/field/birch_pc.c)0
-rw-r--r--src/blend_palette.c (renamed from src/engine/blend_palette.c)0
-rw-r--r--src/braille_puzzles.c (renamed from src/field/braille_puzzles.c)0
-rw-r--r--src/cable_car.c (renamed from src/scene/cable_car.c)182
-rw-r--r--src/cable_car_util.c (renamed from src/engine/cable_car_util.c)0
-rw-r--r--src/cable_club.c (renamed from src/engine/cable_club.c)155
-rw-r--r--src/choose_party.c (renamed from src/field/choose_party.c)35
-rw-r--r--src/clear_save_data_menu.c (renamed from src/engine/clear_save_data_menu.c)0
-rw-r--r--src/clock.c (renamed from src/engine/clock.c)3
-rw-r--r--src/coins.c (renamed from src/field/coins.c)0
-rw-r--r--src/contest.c226
-rw-r--r--src/contest_ai.c1
-rw-r--r--src/contest_painting.c (renamed from src/scene/contest_painting.c)11
-rw-r--r--src/coord_event_weather.c (renamed from src/field/coord_event_weather.c)4
-rw-r--r--src/credits.c (renamed from src/scene/credits.c)4
-rw-r--r--src/cute_sketch.c (renamed from src/scene/cute_sketch.c)0
-rw-r--r--src/data/battle_tower/trainers.h2800
-rw-r--r--src/data/battle_tower/trainers_de.h2800
-rw-r--r--src/data/pokedex_entries_de.h3
-rw-r--r--src/data/pokedex_entries_en.h2
-rw-r--r--src/daycare.c (renamed from src/field/daycare.c)93
-rw-r--r--src/debug/kagaya_debug_menu.c183
-rw-r--r--src/debug/matsuda_debug_menu.c335
-rw-r--r--src/debug/nakamura_debug_menu.c189
-rw-r--r--src/debug/nohara_debug_menu.c12
-rw-r--r--src/debug/start_menu_debug.c6051
-rw-r--r--src/debug/taya_debug_window.c6
-rw-r--r--src/debug/tomomichi_debug_menu.c4483
-rw-r--r--src/debug/watanabe_debug_menu.c11
-rw-r--r--src/decompress.c (renamed from src/engine/decompress.c)0
-rw-r--r--src/decoration.c (renamed from src/field/decoration.c)24
-rw-r--r--src/decoration_inventory.c (renamed from src/field/decoration_inventory.c)11
-rw-r--r--src/dewford_trend.c (renamed from src/field/dewford_trend.c)0
-rw-r--r--src/diploma.c (renamed from src/field/diploma.c)0
-rw-r--r--src/easy_chat_2.c2
-rw-r--r--src/egg_hatch.c (renamed from src/scene/egg_hatch.c)12
-rw-r--r--src/event_data.c (renamed from src/field/event_data.c)0
-rw-r--r--src/event_object_movement.c (renamed from src/field/field_map_obj.c)1458
-rw-r--r--src/evolution_graphics.c (renamed from src/scene/evolution_graphics.c)0
-rw-r--r--src/evolution_scene.c (renamed from src/scene/evolution_scene.c)4
-rw-r--r--src/field/field_ground_effect.c772
-rw-r--r--src/field/field_map_obj_helpers.c387
-rw-r--r--src/field/field_weather.c1161
-rw-r--r--src/field_camera.c (renamed from src/field/field_camera.c)0
-rw-r--r--src/field_control_avatar.c (renamed from src/field/field_control_avatar.c)74
-rw-r--r--src/field_door.c (renamed from src/field/field_door.c)0
-rw-r--r--src/field_effect.c (renamed from src/field/field_effect.c)23
-rw-r--r--src/field_effect_helpers.c (renamed from src/field/field_effect_helpers.c)10
-rw-r--r--src/field_fadetransition.c (renamed from src/field/field_fadetransition.c)35
-rw-r--r--src/field_message_box.c (renamed from src/field/field_message_box.c)0
-rw-r--r--src/field_player_avatar.c (renamed from src/field/field_player_avatar.c)38
-rw-r--r--src/field_poison.c (renamed from src/field/field_poison.c)47
-rw-r--r--src/field_region_map.c (renamed from src/field/field_region_map.c)0
-rw-r--r--src/field_screen_effect.c (renamed from src/field/field_screen_effect.c)0
-rw-r--r--src/field_special_scene.c (renamed from src/field/field_special_scene.c)2
-rw-r--r--src/field_specials.c (renamed from src/field/field_specials.c)2
-rw-r--r--src/field_tasks.c (renamed from src/field/field_tasks.c)0
-rw-r--r--src/field_weather.c1310
-rw-r--r--src/field_weather_effects.c (renamed from src/field/field_weather_effects.c)151
-rw-r--r--src/fieldmap.c (renamed from src/field/fieldmap.c)0
-rw-r--r--src/fldeff_berrytree.c (renamed from src/field/fldeff_berrytree.c)2
-rw-r--r--src/fldeff_cut.c (renamed from src/field/fldeff_cut.c)44
-rw-r--r--src/fldeff_decoration.c (renamed from src/field/fldeff_decoration.c)2
-rw-r--r--src/fldeff_escalator.c (renamed from src/field/fldeff_escalator.c)0
-rw-r--r--src/fldeff_flash.c (renamed from src/field/fldeff_flash.c)12
-rw-r--r--src/fldeff_poison.c (renamed from src/field/fldeff_poison.c)4
-rw-r--r--src/fldeff_recordmixing.c (renamed from src/field/fldeff_recordmixing.c)2
-rw-r--r--src/fldeff_secret_base_pc.c (renamed from src/field/fldeff_secret_base_pc.c)0
-rw-r--r--src/fldeff_secretpower.c (renamed from src/field/fldeff_secretpower.c)42
-rw-r--r--src/fldeff_softboiled.c (renamed from src/field/fldeff_softboiled.c)0
-rw-r--r--src/fldeff_strength.c (renamed from src/field/fldeff_strength.c)23
-rw-r--r--src/fldeff_sweetscent.c (renamed from src/field/fldeff_sweetscent.c)0
-rw-r--r--src/fldeff_teleport.c (renamed from src/field/fldeff_teleport.c)0
-rw-r--r--src/hall_of_fame.c (renamed from src/scene/hall_of_fame.c)44
-rw-r--r--src/heal_location.c (renamed from src/field/heal_location.c)0
-rw-r--r--src/hof_pc.c (renamed from src/field/hof_pc.c)0
-rw-r--r--src/intro.c (renamed from src/scene/intro.c)408
-rw-r--r--src/intro_credits_graphics.c (renamed from src/scene/intro_credits_graphics.c)148
-rw-r--r--src/item.c (renamed from src/field/item.c)343
-rw-r--r--src/item_menu.c (renamed from src/field/item_menu.c)62
-rw-r--r--src/item_use.c (renamed from src/field/item_use.c)3
-rw-r--r--src/landmark.c (renamed from src/field/landmark.c)0
-rw-r--r--src/learn_move.c (renamed from src/pokemon/learn_move.c)0
-rw-r--r--src/libs/m4a_1.s6
-rw-r--r--src/link.c (renamed from src/engine/link.c)108
-rw-r--r--src/load_save.c (renamed from src/engine/load_save.c)0
-rw-r--r--src/lottery_corner.c (renamed from src/field/lottery_corner.c)0
-rw-r--r--src/mail.c1159
-rw-r--r--src/mail_data.c (renamed from src/pokemon/mail_data.c)0
-rw-r--r--src/main.c (renamed from src/engine/main.c)0
-rw-r--r--src/main_menu.c (renamed from src/engine/main_menu.c)0
-rw-r--r--src/map_name_popup.c (renamed from src/field/map_name_popup.c)0
-rw-r--r--src/map_obj_lock.c (renamed from src/field/map_obj_lock.c)3
-rw-r--r--src/mauville_man.c (renamed from src/field/mauville_man.c)34
-rw-r--r--src/menu.c (renamed from src/engine/menu.c)0
-rw-r--r--src/menu_cursor.c (renamed from src/engine/menu_cursor.c)4
-rw-r--r--src/menu_helpers.c (renamed from src/field/menu_helpers.c)0
-rw-r--r--src/metatile_behavior.c (renamed from src/field/metatile_behavior.c)0
-rw-r--r--src/mon_markings.c (renamed from src/pokemon/mon_markings.c)20
-rw-r--r--src/money.c (renamed from src/field/money.c)0
-rw-r--r--src/mystery_event_menu.c (renamed from src/engine/mystery_event_menu.c)154
-rw-r--r--src/mystery_event_msg.c (renamed from src/engine/mystery_event_msg.c)0
-rw-r--r--src/mystery_event_script.c (renamed from src/engine/mystery_event_script.c)0
-rw-r--r--src/name_string_util.c (renamed from src/engine/name_string_util.c)0
-rw-r--r--src/naming_screen.c (renamed from src/engine/naming_screen.c)4
-rw-r--r--src/new_game.c (renamed from src/scene/new_game.c)75
-rw-r--r--src/option_menu.c (renamed from src/engine/option_menu.c)170
-rw-r--r--src/overworld.c (renamed from src/field/overworld.c)107
-rw-r--r--src/palette.c (renamed from src/engine/palette.c)0
-rw-r--r--src/party_menu.c (renamed from src/field/party_menu.c)1082
-rw-r--r--src/pc_screen_effect.c (renamed from src/field/pc_screen_effect.c)17
-rw-r--r--src/play_time.c (renamed from src/engine/play_time.c)0
-rw-r--r--src/player_pc.c (renamed from src/field/player_pc.c)12
-rw-r--r--src/pokeblock.c (renamed from src/field/pokeblock.c)74
-rw-r--r--src/pokeblock_feed.c (renamed from src/pokemon/pokeblock_feed.c)0
-rw-r--r--src/pokedex.c (renamed from src/pokemon/pokedex.c)14
-rw-r--r--src/pokedex_area_screen.c20
-rw-r--r--src/pokedex_cry_screen.c (renamed from src/pokemon/pokedex_cry_screen.c)0
-rw-r--r--src/pokemon/mail.c599
-rw-r--r--src/pokemon/pokemon_data.c12
-rw-r--r--src/pokemon/pokemon_storage_system.c93
-rw-r--r--src/pokemon_1.c (renamed from src/pokemon/pokemon_1.c)67
-rw-r--r--src/pokemon_2.c (renamed from src/pokemon/pokemon_2.c)7
-rw-r--r--src/pokemon_3.c (renamed from src/pokemon/pokemon_3.c)0
-rw-r--r--src/pokemon_icon.c (renamed from src/pokemon/pokemon_icon.c)0
-rw-r--r--src/pokemon_item_effect.c (renamed from src/pokemon/pokemon_item_effect.c)0
-rw-r--r--src/pokemon_menu.c (renamed from src/pokemon/pokemon_menu.c)27
-rw-r--r--src/pokemon_size_record.c (renamed from src/pokemon/pokemon_size_record.c)0
-rw-r--r--src/pokemon_storage_system.c784
-rw-r--r--src/pokemon_storage_system_2.c2121
-rw-r--r--src/pokemon_storage_system_3.c655
-rw-r--r--src/pokemon_storage_system_4.c2849
-rw-r--r--src/pokemon_storage_system_5.c16
-rw-r--r--src/pokemon_summary_screen.c (renamed from src/pokemon/pokemon_summary_screen.c)456
-rw-r--r--src/pokenav.c16
-rw-r--r--src/pokenav_before.c563
-rw-r--r--src/random.c (renamed from src/engine/random.c)0
-rw-r--r--src/record_mixing.c (renamed from src/engine/record_mixing.c)0
-rw-r--r--src/region_map.c (renamed from src/field/region_map.c)224
-rw-r--r--src/reset_rtc_screen.c (renamed from src/engine/reset_rtc_screen.c)103
-rw-r--r--src/roamer.c (renamed from src/field/roamer.c)19
-rw-r--r--src/rom3.c16
-rw-r--r--src/rom6.c20
-rw-r--r--src/rom_800D42C.c119
-rw-r--r--src/rom_8077ABC.c171
-rw-r--r--src/rotating_gate.c (renamed from src/field/rotating_gate.c)2
-rw-r--r--src/roulette.c2687
-rw-r--r--src/roulette_util.c162
-rw-r--r--src/rtc.c (renamed from src/engine/rtc.c)29
-rw-r--r--src/safari_zone.c (renamed from src/field/safari_zone.c)2
-rw-r--r--src/save.c (renamed from src/engine/save.c)41
-rw-r--r--src/save_failed_screen.c (renamed from src/engine/save_failed_screen.c)21
-rw-r--r--src/save_menu_util.c (renamed from src/engine/save_menu_util.c)0
-rw-r--r--src/scrcmd.c (renamed from src/field/scrcmd.c)7
-rw-r--r--src/script.c (renamed from src/engine/script.c)0
-rw-r--r--src/script_menu.c (renamed from src/field/script_menu.c)0
-rw-r--r--src/script_movement.c (renamed from src/field/script_movement.c)3
-rw-r--r--src/script_pokemon_util_80C4BF0.c17
-rw-r--r--src/secret_base.c (renamed from src/field/secret_base.c)344
-rw-r--r--src/shop.c (renamed from src/field/shop.c)51
-rw-r--r--src/slot_machine.c (renamed from src/field/slot_machine.c)1425
-rw-r--r--src/sound.c (renamed from src/engine/sound.c)0
-rw-r--r--src/sprite.c (renamed from src/engine/sprite.c)14
-rw-r--r--src/start_menu.c (renamed from src/field/start_menu.c)112
-rw-r--r--src/starter_choose.c (renamed from src/field/starter_choose.c)0
-rw-r--r--src/string_util.c (renamed from src/engine/string_util.c)0
-rw-r--r--src/strings.c14
-rw-r--r--src/task.c (renamed from src/engine/task.c)10
-rw-r--r--src/text.c (renamed from src/engine/text.c)12
-rw-r--r--src/text_window.c (renamed from src/engine/text_window.c)0
-rw-r--r--src/tileset_anim.c (renamed from src/engine/tileset_anim.c)0
-rw-r--r--src/time_events.c (renamed from src/engine/time_events.c)2
-rw-r--r--src/title_screen.c (renamed from src/scene/title_screen.c)19
-rw-r--r--src/trade.c (renamed from src/engine/trade.c)48
-rw-r--r--src/trader.c (renamed from src/field/trader.c)2
-rw-r--r--src/trainer_card.c (renamed from src/engine/trainer_card.c)97
-rw-r--r--src/trainer_see.c (renamed from src/field/trainer_see.c)2
-rw-r--r--src/trig.c (renamed from src/engine/trig.c)0
-rw-r--r--src/tv.c (renamed from src/field/tv.c)14
-rw-r--r--src/unk_text_8095904.c266
-rw-r--r--src/use_pokeblock.c (renamed from src/field/use_pokeblock.c)1
-rw-r--r--src/util.c (renamed from src/engine/util.c)0
-rw-r--r--src/wallclock.c (renamed from src/field/wallclock.c)0
-rw-r--r--src/wild_encounter.c (renamed from src/field/wild_encounter.c)41
270 files changed, 38922 insertions, 13602 deletions
diff --git a/src/field/bard_music.c b/src/bard_music.c
index 5c48749cf..4518cf09b 100644
--- a/src/field/bard_music.c
+++ b/src/bard_music.c
@@ -141,9 +141,9 @@ static const u32 sBardSoundLengthDeltas[] = {
};
#if ENGLISH
-#include "../src/data/bard_music_en.h"
+#include "data/bard_music_en.h"
#elif GERMAN
-#include "../src/data/bard_music_de.h"
+#include "data/bard_music_de.h"
#endif // ENGLISH/GERMAN
static const struct BardSound (*const gBardMusicTable[])[6] = {
diff --git a/src/battle/anim/aurora.c b/src/battle/anim/aurora.c
index 90fa5c879..b24809264 100644
--- a/src/battle/anim/aurora.c
+++ b/src/battle/anim/aurora.c
@@ -16,7 +16,7 @@ void sub_80D33B4(struct Sprite *sprite)
{
s16 r6;
- sub_80787B0(sprite, 1);
+ InitAnimSpritePos(sprite, 1);
if (GetBankSide(gAnimBankAttacker) != 0)
r6 = -gBattleAnimArgs[2];
else
@@ -26,7 +26,7 @@ void sub_80D33B4(struct Sprite *sprite)
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);
+ InitAnimSpriteTranslationDeltas(sprite);
sprite->callback = sub_80D344C;
sprite->affineAnimPaused = TRUE;
sprite->callback(sprite);
@@ -39,7 +39,7 @@ static void sub_80D344C(struct Sprite *sprite)
StartSpriteAnim(sprite, 1);
sprite->affineAnimPaused = FALSE;
}
- if (sub_8078B5C(sprite) != 0)
+ if (TranslateAnimSpriteByDeltas(sprite) != 0)
DestroyAnimSprite(sprite);
}
diff --git a/src/battle/anim/blow_kiss.c b/src/battle/anim/blow_kiss.c
index e7b49471d..f585b74bc 100644
--- a/src/battle/anim/blow_kiss.c
+++ b/src/battle/anim/blow_kiss.c
@@ -15,19 +15,19 @@ static void sub_80D1FA4(struct Sprite* sprite);
void sub_80D1F58(struct Sprite* sprite)
{
- sub_80787B0(sprite, 1);
+ InitAnimSpritePos(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);
+ InitAnimSpriteTranslationDeltas(sprite);
sprite->callback = sub_80D1FA4;
}
void sub_80D1FA4(struct Sprite* sprite)
{
- if (sub_8078B5C(sprite) == 0)
+ if (TranslateAnimSpriteByDeltas(sprite) == 0)
{
sprite->pos2.y += Sin(sprite->data[5], 14);
sprite->data[5] = (sprite->data[5] + 4) & 0xFF;
diff --git a/src/battle/anim/bubble.c b/src/battle/anim/bubble.c
index 403003ce3..d6ec06be9 100644
--- a/src/battle/anim/bubble.c
+++ b/src/battle/anim/bubble.c
@@ -43,7 +43,7 @@ void sub_80D31C8(struct Sprite* sprite)
sprite->data[3] = sprite->pos1.y;
sprite->data[4] = GetBankPosition(gAnimBankTarget, 3);
- obj_translate_based_on_private_1_2_3_4(sprite);
+ InitAnimSpriteTranslationDeltas(sprite);
newSpriteId = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy);
sprite->data[5] = newSpriteId;
@@ -69,7 +69,7 @@ static void sub_80D32E8(struct Sprite *sprite)
u16 index = gSprites[spriteId].data[3];
sprite->data[0] = 1;
- sub_8078B5C(sprite);
+ TranslateAnimSpriteByDeltas(sprite);
sprite->pos2.x += Sin(index / 256, gSprites[spriteId].data[0]);
sprite->pos2.y += Cos(index / 256, gSprites[spriteId].data[1]);
@@ -97,6 +97,6 @@ static void sub_80D3370(struct Sprite *sprite)
static void sub_80D3398(struct Sprite *sprite)
{
sprite->data[0] = 10;
- sprite->callback = sub_80782D8;
+ sprite->callback = WaitAnimForDuration;
StoreSpriteCallbackInData(sprite, move_anim_8074EE0);
}
diff --git a/src/battle/anim/bug.c b/src/battle/anim/bug.c
index dbc0f75a5..d57a1046e 100644
--- a/src/battle/anim/bug.c
+++ b/src/battle/anim/bug.c
@@ -13,7 +13,7 @@ static void sub_80DCA38(struct Sprite *sprite);
static void sub_80DCAEC(struct Sprite *sprite);
static void sub_80DCB5C(struct Sprite *sprite);
static void sub_80DCBB4(struct Sprite *sprite);
-void sub_80DCD78(struct Sprite *sprite);
+static void AnimMissileArcStep(struct Sprite *sprite);
// used in Move_MEGAHORN
void sub_80DC824(struct Sprite *sprite)
@@ -40,7 +40,7 @@ void sub_80DC824(struct Sprite *sprite)
sprite->data[2] = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[2];
sprite->data[4] = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[3];
- sprite->callback = sub_8078B34;
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
}
@@ -65,7 +65,7 @@ void sub_80DC8F4(struct Sprite *sprite)
sprite->data[2] = GetBankPosition(gAnimBankTarget, 2);
sprite->data[4] = GetBankPosition(gAnimBankTarget, 3);
- sprite->callback = sub_8078B34;
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
}
@@ -76,7 +76,7 @@ void sub_80DC9A0(struct Sprite *sprite)
if (IsContest())
gBattleAnimArgs[2] /= 2;
- sub_80787B0(sprite, 1);
+ InitAnimSpritePos(sprite, 1);
sprite->data[0] = gBattleAnimArgs[2];
sprite->data[1] = sprite->pos1.x;
sprite->data[3] = sprite->pos1.y;
@@ -88,7 +88,7 @@ void sub_80DC9A0(struct Sprite *sprite)
}
else
{
- sub_807A3FC(gAnimBankTarget, 1, &sprite->data[2], &sprite->data[4]);
+ SetAverageBattlerPositions(gAnimBankTarget, 1, &sprite->data[2], &sprite->data[4]);
}
sub_8078BD4(sprite);
@@ -98,7 +98,7 @@ void sub_80DC9A0(struct Sprite *sprite)
static void sub_80DCA38(struct Sprite *sprite)
{
- if (sub_8078B5C(sprite))
+ if (TranslateAnimSpriteByDeltas(sprite))
{
DestroyAnimSprite(sprite);
return;
@@ -111,7 +111,7 @@ static void sub_80DCA38(struct Sprite *sprite)
// used in Move_STRING_SHOT
void sub_80DCA70(struct Sprite *sprite)
{
- sub_807A3FC(gAnimBankTarget, 0, &sprite->pos1.x, &sprite->pos1.y);
+ SetAverageBattlerPositions(gAnimBankTarget, 0, &sprite->pos1.x, &sprite->pos1.y);
if (GetBankSide(gAnimBankAttacker))
sprite->pos1.x -= gBattleAnimArgs[0];
else
@@ -174,9 +174,15 @@ static void sub_80DCBB4(struct Sprite *sprite)
DestroyAnimSprite(sprite);
}
-// used in 3 moves:
-// Move_POISON_STING, Move_TWINEEDLE, Move_SPIKE_CANNON
-void sub_80DCBCC(struct Sprite *sprite)
+// Translates a stinger sprite linearly to a destination location. The sprite is
+// initially rotated so that it appears to be traveling in a straight line.
+// Used by Move_POISON_STING, Move_TWINEEDLE, Move_SPIKE_CANNON
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: target x pixel offset
+// arg 3: target y pixel offset
+// arg 4: duration
+void AnimTranslateStinger(struct Sprite *sprite)
{
s16 lVarX, lVarY;
u16 rot;
@@ -212,11 +218,11 @@ void sub_80DCBCC(struct Sprite *sprite)
}
}
- sub_80787B0(sprite, 1);
+ InitAnimSpritePos(sprite, 1);
lVarX = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[2];
lVarY = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[3];
- rot = sub_80790F0(lVarX - sprite->pos1.x, lVarY - sprite->pos1.y);
+ rot = ArcTan2Neg(lVarX - sprite->pos1.x, lVarY - sprite->pos1.y);
rot += 0xC000;
sub_8078FDC(sprite, FALSE, 0x100, 0x100, rot);
@@ -224,15 +230,22 @@ void sub_80DCBCC(struct Sprite *sprite)
sprite->data[2] = lVarX;
sprite->data[4] = lVarY;
- sprite->callback = sub_8078B34;
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
}
// used in 2 moves:
// Move_PIN_MISSILE, Move_ICICLE_SPEAR
-void sub_80DCCFC(struct Sprite *sprite)
+// Rotates sprite and moves it in an arc, so that it appears like a missle or arrow traveling.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: target x pixel offset
+// arg 3: target y pixel offset
+// arg 4: duration
+// arg 5: wave amplitude
+void AnimMissileArc(struct Sprite *sprite)
{
- sub_80787B0(sprite, 1);
+ InitAnimSpritePos(sprite, 1);
if (GetBankSide(gAnimBankAttacker))
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
@@ -241,17 +254,17 @@ void sub_80DCCFC(struct Sprite *sprite)
sprite->data[2] = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[2];
sprite->data[4] = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[3];
sprite->data[5] = gBattleAnimArgs[5];
- sub_80786EC(sprite);
+ InitAnimSpriteTranslationOverDuration(sprite);
- sprite->callback = sub_80DCD78;
+ sprite->callback = AnimMissileArcStep;
sprite->invisible = TRUE;
}
-void sub_80DCD78(struct Sprite *sprite)
+static void AnimMissileArcStep(struct Sprite *sprite)
{
sprite->invisible = FALSE;
- if (sub_8078718(sprite))
+ if (TranslateAnimSpriteLinearAndSine(sprite))
{
DestroyAnimSprite(sprite);
}
@@ -271,12 +284,12 @@ void sub_80DCD78(struct Sprite *sprite)
x2 += x1;
y2 += y1;
- if (!sub_8078718(sprite))
+ if (!TranslateAnimSpriteLinearAndSine(sprite))
{
- u16 rot = sub_80790F0(sprite->pos1.x + sprite->pos2.x - x2,
+ u16 rotation = ArcTan2Neg(sprite->pos1.x + sprite->pos2.x - x2,
sprite->pos1.y + sprite->pos2.y - y2);
- rot += 0xC000;
- sub_8078FDC(sprite, FALSE, 0x100, 0x100, rot);
+ rotation += 0xC000;
+ sub_8078FDC(sprite, FALSE, 0x100, 0x100, rotation);
for (i = 0; i < 8; i++)
data[i] = tempData[i];
diff --git a/src/battle/anim/bullet.c b/src/battle/anim/bullet.c
index 90b2021f1..1dca0b886 100644
--- a/src/battle/anim/bullet.c
+++ b/src/battle/anim/bullet.c
@@ -17,11 +17,11 @@ static void sub_80D00B4(struct Sprite* sprite);
void sub_80CFFD8(struct Sprite* sprite)
{
- sub_80787B0(sprite, 1);
+ InitAnimSpritePos(sprite, 1);
sprite->data[0] = 20;
sprite->data[2] = GetBankPosition(gAnimBankTarget, 2);
sprite->data[4] = GetBankPosition(gAnimBankTarget, 3);
- sprite->callback = sub_8078B34;
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
sprite->affineAnimPaused = 1;
StoreSpriteCallbackInData(sprite, sub_80D0030);
}
diff --git a/src/battle/anim/cutter.c b/src/battle/anim/cutter.c
index 2234ebacb..fed3598fc 100644
--- a/src/battle/anim/cutter.c
+++ b/src/battle/anim/cutter.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "battle.h"
#include "rom_8077ABC.h"
#include "trig.h"
#include "battle_anim.h"
@@ -7,35 +8,42 @@ extern s16 gBattleAnimArgs[];
extern u8 gAnimBankAttacker;
extern u8 gAnimBankTarget;
-static void sub_80CB09C(struct Sprite* sprite);
-static void sub_80CB1A4(struct Sprite* sprite);
+static void AnimTranslateLinearSingleSineWaveStep(struct Sprite* sprite);
+static void AnimMoveTwisterParticleStep(struct Sprite* sprite);
-// cutter (the cresent shaped leaf used in throwing projectiles for the listed moves.)
+// Animates a sprite that moves linearly from one location to another, with a
+// single-cycle sine wave added to the y position along the way.
// Used by Razor Leaf and Magical Leaf.
-
-void sub_80CAFD0(struct Sprite* sprite)
+// arg 0: initial x offset
+// arg 1: initial y offset
+// arg 2: target x offset
+// arg 3: target y offset
+// arg 4: translation duration
+// arg 5: wave amplitude
+// arg 6: target between double battle opponents (boolean)
+void AnimTranslateLinearSingleSineWave(struct Sprite* sprite)
{
- sub_80787B0(sprite, 1);
- if (GetBankSide(gAnimBankAttacker))
+ InitAnimSpritePos(sprite, 1);
+ if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER)
{
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
}
sprite->data[0] = gBattleAnimArgs[4];
- if (!(gBattleAnimArgs[6]))
+ 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]);
+ SetAverageBattlerPositions(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);
+ InitAnimSpriteTranslationOverDuration(sprite);
if (GetBankSide(gAnimBankAttacker) == GetBankSide(gAnimBankTarget))
{
sprite->data[0] = 1;
@@ -45,18 +53,18 @@ void sub_80CAFD0(struct Sprite* sprite)
sprite->data[0] = 0;
}
- sprite->callback = sub_80CB09C;
+ sprite->callback = AnimTranslateLinearSingleSineWaveStep;
}
-void sub_80CB09C(struct Sprite* sprite)
+static void AnimTranslateLinearSingleSineWaveStep(struct Sprite* sprite)
{
- bool8 c = FALSE;
+ bool8 destroy = FALSE;
s16 a = sprite->data[0];
s16 b = sprite->data[7];
s16 r0;
sprite->data[0] = 1;
- sub_8078718(sprite);
+ TranslateAnimSpriteLinearAndSine(sprite);
r0 = sprite->data[7];
sprite->data[0] = a;
if (b > 0xC8 && r0 <= 0x37 && sprite->oam.affineParam == 0)
@@ -67,24 +75,30 @@ void sub_80CB09C(struct Sprite* sprite)
sprite->invisible ^= 1;
sprite->oam.affineParam++;
if (sprite->oam.affineParam == 0x1E)
- c = TRUE;
+ destroy = TRUE;
}
- if (sprite->pos1.x + sprite->pos2.x > 0x100
+ if (sprite->pos1.x + sprite->pos2.x > 256
|| sprite->pos1.x + sprite->pos2.x < -16
- || sprite->pos1.y + sprite->pos2.y > 0xA0
+ || sprite->pos1.y + sprite->pos2.y > 160
|| sprite->pos1.y + sprite->pos2.y < -16)
- c = TRUE;
+ destroy = TRUE;
- if (c)
+ if (destroy)
DestroyAnimSprite(sprite);
}
-void sub_80CB144(struct Sprite* sprite)
+// Animates particles in the Twister move animation.
+// arg 0: duration
+// arg 1: total y delta (the particles rise upward)
+// arg 2: wave period (higher means faster wave)
+// arg 3: wave amplitude
+// arg 4: speedup frame (particles move faster at the end of the animation)
+void AnimMoveTwisterParticle(struct Sprite* sprite)
{
if (!IsContest() && IsDoubleBattle() == TRUE)
{
- sub_807A3FC(gAnimBankTarget, 1, &sprite->pos1.x, &sprite->pos1.y);
+ SetAverageBattlerPositions(gAnimBankTarget, 1, &sprite->pos1.x, &sprite->pos1.y);
}
sprite->pos1.y += 32;
@@ -93,10 +107,10 @@ void sub_80CB144(struct Sprite* sprite)
sprite->data[2] = gBattleAnimArgs[2];
sprite->data[3] = gBattleAnimArgs[3];
sprite->data[4] = gBattleAnimArgs[4];
- sprite->callback = sub_80CB1A4;
+ sprite->callback = AnimMoveTwisterParticleStep;
}
-void sub_80CB1A4(struct Sprite* sprite)
+static void AnimMoveTwisterParticleStep(struct Sprite* sprite)
{
if (sprite->data[1] == 0xFF)
{
diff --git a/src/battle/anim/cyclone.c b/src/battle/anim/cyclone.c
index 0f83df211..b1210bc54 100644
--- a/src/battle/anim/cyclone.c
+++ b/src/battle/anim/cyclone.c
@@ -13,7 +13,7 @@ extern u8 gAnimBankTarget;
void sub_80D0118(struct Sprite* sprite)
{
- sub_80787B0(sprite, 0);
+ InitAnimSpritePos(sprite, 0);
if (GetBankSide(gAnimBankAttacker) == 0)
sprite->pos1.y += 16;
diff --git a/src/battle/anim/dark.c b/src/battle/anim/dark.c
index 8ceb00298..055cf5802 100644
--- a/src/battle/anim/dark.c
+++ b/src/battle/anim/dark.c
@@ -1,22 +1,47 @@
#include "global.h"
-#include "rom_8077ABC.h"
-#include "trig.h"
#include "battle_anim.h"
-#include "sound.h"
+#include "blend_palette.h"
+#include "decompress.h"
+#include "ewram.h"
+#include "palette.h"
+#include "rom_8077ABC.h"
#include "scanline_effect.h"
-
-void sub_80DFE90(struct Sprite *sprite);
-
-void sub_80DFC9C(u8 taskId);
-void sub_80DFD58(u8 taskId);
+#include "sound.h"
+#include "sprite.h"
+#include "trig.h"
+#include "constants/battle_constants.h"
extern s16 gBattleAnimArgs[];
extern u8 gAnimBankAttacker;
extern u8 gAnimBankTarget;
-extern u8 gObjectBankIDs[];
+extern u8 gBankSpriteIds[];
+extern u16 gBattle_BG1_X;
+extern u16 gBattle_BG1_Y;
+extern u16 gBattle_BG2_X;
+extern u16 gBattle_BG2_Y;
+extern u16 gBattle_WIN0H;
+extern u16 gBattle_WIN0V;
+extern u16 gBattlePartyID[];
+extern u8 gAnimMoveTurn;
+
+extern const u8 gUnknown_08D1D574[];
+extern const u8 gUnknown_08D1D410[];
+extern const u16 gUnknown_08D1D54C[];
+
+static void sub_80DFE90(struct Sprite *sprite);
+static void sub_80DFC9C(u8 taskId);
+static void sub_80DFD58(u8 taskId);
+static void sub_80DFF58(struct Sprite *sprite);
+static void sub_80DFF98(struct Sprite *sprite);
+static void sub_80E00D0(struct Sprite *sprite);
+static void sub_80E02A4(u8 taskId);
+static void sub_80E0620(u8 taskId);
+static void sub_80E08CC(u8 priority);
+static void sub_80E079C(struct Task *task);
+static void sub_80E0CD0(u8 taskId);
-// used in Smoke Ball escape, Sky Attack, Feint Attack and Camouflage
+// used in Smoke Ball escape, Sky Attack, Feint Attack and Camouflage
void sub_80DFC24(u8 taskId)
{
int bank;
@@ -31,7 +56,7 @@ void sub_80DFC24(u8 taskId)
gTasks[taskId].func = sub_80DFC9C;
}
-void sub_80DFC9C(u8 taskId)
+static void sub_80DFC9C(u8 taskId)
{
u8 r2 = gTasks[taskId].data[1] >> 8;
u8 r1 = gTasks[taskId].data[1];
@@ -44,7 +69,7 @@ void sub_80DFC9C(u8 taskId)
gTasks[taskId].data[2] = 0;
if (r2 == 16)
{
- gSprites[gObjectBankIDs[gAnimBankAttacker]].invisible = 1;
+ gSprites[gBankSpriteIds[gAnimBankAttacker]].invisible = 1;
DestroyAnimVisualTask(taskId);
}
}
@@ -103,7 +128,7 @@ void sub_80DFE14(struct Sprite *sprite)
sprite->data[3] = GetBankPosition(gAnimBankTarget, 3);
sprite->data[4] = GetBankPosition(gAnimBankAttacker, 3);
sprite->data[0] = 0x7E;
- sub_8078A5C(sprite);
+ InitSpriteDataForLinearTranslation(sprite);
sprite->data[3] = -sprite->data[1];
sprite->data[4] = -sprite->data[2];
sprite->data[6] = 0xFFD8;
@@ -111,7 +136,7 @@ void sub_80DFE14(struct Sprite *sprite)
sub_80DFE90(sprite);
}
-void sub_80DFE90(struct Sprite *sprite)
+static void sub_80DFE90(struct Sprite *sprite)
{
sprite->data[3] += sprite->data[1];
sprite->data[4] += sprite->data[2];
@@ -136,3 +161,848 @@ void sub_80DFE90(struct Sprite *sprite)
if (--sprite->data[0] == 0)
DestroyAnimSprite(sprite);
}
+
+void sub_80DFF1C(struct Sprite *sprite)
+{
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ StartSpriteAffineAnim(sprite, gBattleAnimArgs[2]);
+
+ sprite->data[0] = gBattleAnimArgs[3];
+ sprite->data[1] = gBattleAnimArgs[4];
+ sprite->data[2] = gBattleAnimArgs[5];
+ sprite->callback = sub_80DFF58;
+}
+
+static void sub_80DFF58(struct Sprite *sprite)
+{
+ sprite->data[4] += sprite->data[0];
+ sprite->data[5] += sprite->data[1];
+ sprite->pos2.x = sprite->data[4] >> 8;
+ sprite->pos2.y = sprite->data[5] >> 8;
+
+ if (++sprite->data[3] == sprite->data[2])
+ sprite->callback = sub_80DFF98;
+}
+
+static void sub_80DFF98(struct Sprite *sprite)
+{
+ sprite->data[4] -= sprite->data[0];
+ sprite->data[5] -= sprite->data[1];
+ sprite->pos2.x = sprite->data[4] >> 8;
+ sprite->pos2.y = sprite->data[5] >> 8;
+
+ if (--sprite->data[3] == 0)
+ move_anim_8074EE0(sprite);
+}
+
+void sub_80DFFD0(struct Sprite *sprite)
+{
+ u8 bank;
+ s8 xOffset;
+
+ if (gBattleAnimArgs[0] == 0)
+ bank = gAnimBankAttacker;
+ else
+ bank = gAnimBankTarget;
+
+ xOffset = 20;
+ sprite->oam.tileNum += 4;
+
+ switch (gBattleAnimArgs[1])
+ {
+ case 0:
+ sprite->pos1.x = sub_807A100(bank, 5) - 8;
+ sprite->pos1.y = sub_807A100(bank, 2) + 8;
+ break;
+ case 1:
+ sprite->pos1.x = sub_807A100(bank, 5) - 14;
+ sprite->pos1.y = sub_807A100(bank, 2) + 16;
+ break;
+ case 2:
+ sprite->pos1.x = sub_807A100(bank, 4) + 8;
+ sprite->pos1.y = sub_807A100(bank, 2) + 8;
+ StartSpriteAffineAnim(sprite, 1);
+ xOffset = -20;
+ break;
+ case 3:
+ sprite->pos1.x = sub_807A100(bank, 4) + 14;
+ sprite->pos1.y = sub_807A100(bank, 2) + 16;
+ StartSpriteAffineAnim(sprite, 1);
+ xOffset = -20;
+ break;
+ }
+
+ sprite->data[0] = 32;
+ sprite->data[2] = sprite->pos1.x + xOffset;
+ sprite->data[4] = sprite->pos1.y + 12;
+ sprite->data[5] = -12;
+
+ InitAnimSpriteTranslationOverDuration(sprite);
+ sprite->callback = sub_80E00D0;
+}
+
+static void sub_80E00D0(struct Sprite *sprite)
+{
+ if (TranslateAnimSpriteLinearAndSine(sprite))
+ move_anim_8074EE0(sprite);
+}
+
+void sub_80E00EC(u8 taskId)
+{
+ struct ScanlineEffectParams scanlineParams;
+ struct Struct_sub_8078914 subStruct;
+ u16 i;
+ u8 pos;
+ int var0;
+ struct Task *task = &gTasks[taskId];
+
+ task->data[7] = GetBankPosition(gAnimBankAttacker, 1) + 31;
+ task->data[6] = sub_807A100(gAnimBankAttacker, 2) - 7;
+ task->data[5] = task->data[7];
+ task->data[4] = task->data[6];
+ task->data[13] = (task->data[7] - task->data[6]) << 8;
+
+ pos = GetBankPosition(gAnimBankAttacker, 0);
+ task->data[14] = pos - 32;
+ task->data[15] = pos + 32;
+
+ if (GetBankSide(gAnimBankAttacker) == SIDE_PLAYER)
+ task->data[8] = -12;
+ else
+ task->data[8] = -64;
+
+ task->data[3] = GetBankIdentity_permutated(gAnimBankAttacker);
+ if (task->data[3] == 1)
+ {
+ sub_8078914(&subStruct);
+ task->data[10] = gBattle_BG1_Y;
+ REG_BLDCNT = 0x3F42;
+ FillPalette(0, subStruct.field_8 << 4, 32);
+ scanlineParams.dmaDest = &REG_BG1VOFS;
+ var0 = 2;
+
+ if (!IsContest())
+ gBattle_BG2_X += 240;
+ }
+ else
+ {
+ task->data[10] = gBattle_BG2_Y;
+ REG_BLDCNT = 0x3F44;
+ FillPalette(0, 144, 32);
+ scanlineParams.dmaDest = &REG_BG2VOFS;
+ var0 = 4;
+
+ if (!IsContest())
+ gBattle_BG1_X += 240;
+ }
+
+ scanlineParams.dmaControl = 0xA2600001;
+ scanlineParams.initState = 1;
+ scanlineParams.unused9 = 0;
+ task->data[11] = 0;
+ task->data[12] = 16;
+ task->data[0] = 0;
+ task->data[1] = 0;
+ task->data[2] = 0;
+
+ sub_80E08CC(3);
+
+ for (i = 0; i < 112; i++)
+ {
+ gScanlineEffectRegBuffers[0][i] = task->data[10];
+ gScanlineEffectRegBuffers[1][i] = task->data[10];
+ }
+
+ ScanlineEffect_SetParams(scanlineParams);
+
+ REG_WINOUT = 0x3F00 | (var0 ^ 0x3F);
+ REG_WININ = 0x3F3F;
+ gBattle_WIN0H = (task->data[14] << 8) | task->data[15];
+ gBattle_WIN0V = 160;
+
+ task->func = sub_80E02A4;
+}
+
+static void sub_80E02A4(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ if (++task->data[1] > 1)
+ {
+ task->data[1] = 0;
+ if (++task->data[2] & 1)
+ {
+ if (task->data[11] != 12)
+ task->data[11]++;
+ }
+ else
+ {
+ if (task->data[12] != 8)
+ task->data[12]--;
+ }
+
+ REG_BLDALPHA = (task->data[12] << 8) | task->data[11];
+
+ if (task->data[11] == 12 && task->data[12] == 8)
+ task->data[0]++;
+ }
+ break;
+ case 1:
+ task->data[4] -= 8;
+ sub_80E079C(task);
+
+ if (task->data[4] < task->data[8])
+ task->data[0]++;
+ break;
+ case 2:
+ task->data[4] -= 8;
+ sub_80E079C(task);
+ task->data[14] += 4;
+ task->data[15] -= 4;
+
+ if (task->data[14] >= task->data[15])
+ task->data[14] = task->data[15];
+
+ gBattle_WIN0H = (task->data[14] << 8) | task->data[15];
+
+ if (task->data[14] == task->data[15])
+ task->data[0]++;
+ break;
+ case 3:
+ gScanlineEffect.state = 3;
+ task->data[0]++;
+ break;
+ case 4:
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+void sub_80E03BC(u8 taskId)
+{
+ struct Struct_sub_8078914 subStruct;
+ struct ScanlineEffectParams scanlineParams;
+ u8 pos;
+ u16 i;
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ if (IsContest() == TRUE)
+ {
+ gBattle_WIN0H = 0;
+ gBattle_WIN0V = 0;
+ REG_WININ = 0x3F3F;
+ REG_WINOUT = 0x3F3F;
+ DestroyAnimVisualTask(taskId);
+ }
+ else
+ {
+ task->data[3] = GetBankIdentity_permutated(gAnimBankTarget);
+ if (task->data[3] == 1)
+ {
+ REG_BLDCNT = 0x3F42;
+ gBattle_BG2_X += 240;
+ }
+ else
+ {
+ REG_BLDCNT = 0x3F44;
+ gBattle_BG1_X += 240;
+ }
+
+ task->data[0]++;
+ }
+ break;
+ case 1:
+ if (task->data[3] == 1)
+ {
+ sub_8078914(&subStruct);
+ task->data[10] = gBattle_BG1_Y;
+ FillPalette(0, subStruct.field_8 << 4, 32);
+ }
+ else
+ {
+ task->data[10] = gBattle_BG2_Y;
+ FillPalette(0, 144, 32);
+ }
+
+ sub_80E08CC(3);
+ task->data[0]++;
+ break;
+ case 2:
+ task->data[7] = GetBankPosition(gAnimBankTarget, 1) + 31;
+ task->data[6] = sub_807A100(gAnimBankTarget, 2) - 7;
+ task->data[13] = (task->data[7] - task->data[6]) << 8;
+ pos = GetBankPosition(gAnimBankTarget, 0);
+ task->data[14] = pos - 4;
+ task->data[15] = pos + 4;
+
+ if (GetBankSide(gAnimBankTarget) == SIDE_PLAYER)
+ task->data[8] = -12;
+ else
+ task->data[8] = -64;
+
+ task->data[4] = task->data[8];
+ task->data[5] = task->data[8];
+ task->data[11] = 12;
+ task->data[12] = 8;
+ task->data[0]++;
+ break;
+ case 3:
+ if (task->data[3] == 1)
+ scanlineParams.dmaDest = &REG_BG1VOFS;
+ else
+ scanlineParams.dmaDest = &REG_BG2VOFS;
+
+ for (i = 0; i < 112; i++)
+ {
+ gScanlineEffectRegBuffers[0][i] = task->data[10] + (159 - i);
+ gScanlineEffectRegBuffers[1][i] = task->data[10] + (159 - i);
+ }
+
+ scanlineParams.dmaControl = 0xA2600001;
+ scanlineParams.initState = 1;
+ scanlineParams.unused9 = 0;
+ ScanlineEffect_SetParams(scanlineParams);
+ task->data[0]++;
+ break;
+ case 4:
+ if (task->data[3] == 1)
+ REG_WINOUT = 0x3F3D;
+ else
+ REG_WINOUT = 0x3F3B;
+
+ REG_WININ = 0x3F3F;
+ gBattle_WIN0H = (task->data[14] << 8) | task->data[15];
+ gBattle_WIN0V = 160;
+
+ task->data[0] = 0;
+ task->data[1] = 0;
+ task->data[2] = 0;
+ REG_BLDALPHA = 0x80C;
+ task->func = sub_80E0620;
+ break;
+ }
+}
+
+static void sub_80E0620(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ task->data[5] += 8;
+ if (task->data[5] >= task->data[7])
+ task->data[5] = task->data[7];
+
+ sub_80E079C(task);
+
+ if (task->data[5] == task->data[7])
+ task->data[0]++;
+ break;
+ case 1:
+ if (task->data[15] - task->data[14] < 64)
+ {
+ task->data[14] -= 4;
+ task->data[15] += 4;
+ }
+ else
+ {
+ task->data[1] = 1;
+ }
+
+ gBattle_WIN0H = (task->data[14] << 8) | task->data[15];
+ task->data[4] += 8;
+
+ if (task->data[4] >= task->data[6])
+ task->data[4] = task->data[6];
+
+ sub_80E079C(task);
+
+ if (task->data[4] == task->data[6] && task->data[1] != 0)
+ {
+ task->data[1] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 2:
+ if (++task->data[1] > 1)
+ {
+ task->data[1] = 0;
+ if ((++task->data[2] & 1) != 0)
+ {
+ if (task->data[11] != 0)
+ task->data[11]--;
+ }
+ else
+ {
+ if (task->data[12] < 16)
+ task->data[12]++;
+ }
+
+ REG_BLDALPHA = (task->data[12] << 8) | task->data[11];
+
+ if (task->data[11] == 0 && task->data[12] == 16)
+ task->data[0]++;
+ }
+ break;
+ case 3:
+ gScanlineEffect.state = 3;
+ task->data[0]++;
+ break;
+ case 4:
+ gBattle_WIN0H = 0;
+ gBattle_WIN0V = 0;
+ REG_WININ = 0x3F3F;
+ REG_WINOUT = 0x3F3F;
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+// static void sub_80E079C(struct Task *task)
+// {
+// int var0, var1;
+// s16 var2;
+// s16 i, j;
+
+// var2 = task->data[5] - task->data[4];
+// if (var2 != 0)
+// {
+// var0 = task->data[13] / var2;
+// var1 = task->data[6];
+
+// for (i = 0; i < task->data[4]; i++)
+// {
+// gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[10] - (i - 159);
+// }
+
+// for (i = task->data[4]; i <= task->data[5]; i++)
+// {
+// if (i >= 0)
+// {
+// gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = (var1 - i) + task->data[10];
+// }
+
+// var1 += var0;
+// }
+
+// for (j = i; j < task->data[7]; j++)
+// {
+// if (j >= 0)
+// {
+// gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][j] = (task->data[10] + 159) - j;
+// }
+// }
+// }
+// else
+// {
+// for (i = 0; i < 112; i++)
+// {
+// gScanlineEffectRegBuffers[0][i] = task->data[10] + 159 - i;
+// gScanlineEffectRegBuffers[1][i] = task->data[10] + 159 - i;
+// }
+// }
+// }
+
+__attribute__((naked))
+static void sub_80E079C(struct Task *task)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r8\n\
+ push {r7}\n\
+ adds r6, r0, 0\n\
+ ldrh r0, [r6, 0x12]\n\
+ ldrh r4, [r6, 0x10]\n\
+ subs r0, r4\n\
+ lsls r0, 16\n\
+ asrs r1, r0, 16\n\
+ cmp r1, 0\n\
+ beq _080E0890\n\
+ movs r2, 0x22\n\
+ ldrsh r0, [r6, r2]\n\
+ bl __divsi3\n\
+ mov r8, r0\n\
+ movs r3, 0x14\n\
+ ldrsh r0, [r6, r3]\n\
+ lsls r5, r0, 8\n\
+ lsls r0, r4, 16\n\
+ movs r4, 0\n\
+ cmp r0, 0\n\
+ ble _080E07FC\n\
+ ldr r0, _080E0888 @ =gScanlineEffectRegBuffers\n\
+ mov r12, r0\n\
+ ldr r7, _080E088C @ =gScanlineEffect\n\
+_080E07D0:\n\
+ lsls r2, r4, 16\n\
+ asrs r2, 16\n\
+ lsls r3, r2, 1\n\
+ ldrb r1, [r7, 0x14]\n\
+ lsls r0, r1, 4\n\
+ subs r0, r1\n\
+ lsls r0, 7\n\
+ adds r3, r0\n\
+ add r3, r12\n\
+ adds r1, r2, 0\n\
+ subs r1, 0x9F\n\
+ ldrh r0, [r6, 0x1C]\n\
+ subs r0, r1\n\
+ strh r0, [r3]\n\
+ adds r2, 0x1\n\
+ lsls r2, 16\n\
+ lsrs r4, r2, 16\n\
+ asrs r2, 16\n\
+ movs r1, 0x10\n\
+ ldrsh r0, [r6, r1]\n\
+ cmp r2, r0\n\
+ blt _080E07D0\n\
+_080E07FC:\n\
+ ldrh r4, [r6, 0x10]\n\
+ lsls r3, r4, 16\n\
+ asrs r1, r3, 16\n\
+ movs r2, 0x12\n\
+ ldrsh r0, [r6, r2]\n\
+ cmp r1, r0\n\
+ bgt _080E0846\n\
+ ldr r0, _080E0888 @ =gScanlineEffectRegBuffers\n\
+ mov r12, r0\n\
+ ldr r7, _080E088C @ =gScanlineEffect\n\
+_080E0810:\n\
+ asrs r4, r3, 16\n\
+ cmp r4, 0\n\
+ blt _080E0832\n\
+ asrs r1, r5, 8\n\
+ subs r1, r4\n\
+ lsls r3, r4, 1\n\
+ ldrb r2, [r7, 0x14]\n\
+ lsls r0, r2, 4\n\
+ subs r0, r2\n\
+ lsls r0, 7\n\
+ adds r3, r0\n\
+ add r3, r12\n\
+ lsls r1, 16\n\
+ asrs r1, 16\n\
+ ldrh r2, [r6, 0x1C]\n\
+ adds r1, r2\n\
+ strh r1, [r3]\n\
+_080E0832:\n\
+ add r5, r8\n\
+ adds r0, r4, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r4, r0, 16\n\
+ lsls r3, r4, 16\n\
+ asrs r1, r3, 16\n\
+ movs r2, 0x12\n\
+ ldrsh r0, [r6, r2]\n\
+ cmp r1, r0\n\
+ ble _080E0810\n\
+_080E0846:\n\
+ movs r3, 0x1C\n\
+ ldrsh r0, [r6, r3]\n\
+ adds r0, 0x9F\n\
+ lsls r2, r4, 16\n\
+ asrs r1, r2, 16\n\
+ subs r5, r0, r1\n\
+ movs r3, 0x16\n\
+ ldrsh r0, [r6, r3]\n\
+ cmp r1, r0\n\
+ bge _080E08BE\n\
+ ldr r7, _080E0888 @ =gScanlineEffectRegBuffers\n\
+ ldr r4, _080E088C @ =gScanlineEffect\n\
+_080E085E:\n\
+ asrs r3, r2, 16\n\
+ cmp r3, 0\n\
+ blt _080E0876\n\
+ lsls r2, r3, 1\n\
+ ldrb r1, [r4, 0x14]\n\
+ lsls r0, r1, 4\n\
+ subs r0, r1\n\
+ lsls r0, 7\n\
+ adds r2, r0\n\
+ adds r2, r7\n\
+ strh r5, [r2]\n\
+ subs r5, 0x1\n\
+_080E0876:\n\
+ adds r0, r3, 0x1\n\
+ lsls r2, r0, 16\n\
+ asrs r1, r2, 16\n\
+ movs r3, 0x16\n\
+ ldrsh r0, [r6, r3]\n\
+ cmp r1, r0\n\
+ blt _080E085E\n\
+ b _080E08BE\n\
+ .align 2, 0\n\
+_080E0888: .4byte gScanlineEffectRegBuffers\n\
+_080E088C: .4byte gScanlineEffect\n\
+_080E0890:\n\
+ movs r1, 0x1C\n\
+ ldrsh r0, [r6, r1]\n\
+ adds r5, r0, 0\n\
+ adds r5, 0x9F\n\
+ movs r4, 0\n\
+ ldr r3, _080E08C8 @ =gScanlineEffectRegBuffers\n\
+ movs r2, 0xF0\n\
+ lsls r2, 3\n\
+ adds r6, r3, r2\n\
+_080E08A2:\n\
+ lsls r0, r4, 16\n\
+ asrs r0, 16\n\
+ lsls r2, r0, 1\n\
+ adds r1, r2, r3\n\
+ strh r5, [r1]\n\
+ adds r2, r6\n\
+ strh r5, [r2]\n\
+ subs r5, 0x1\n\
+ adds r0, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r4, r0, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0x6F\n\
+ ble _080E08A2\n\
+_080E08BE:\n\
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080E08C8: .4byte gScanlineEffectRegBuffers\n\
+ .syntax divided\n");
+}
+
+static void sub_80E08CC(u8 priority)
+{
+ u16 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ u8 spriteId = GetAnimBankSpriteId(i);
+ if (spriteId != 0xFF)
+ gSprites[spriteId].oam.priority = priority;
+ }
+}
+
+void sub_80E0918(u8 taskId)
+{
+ u8 toBG2 = GetBankIdentity_permutated(gAnimBankAttacker) ^ 1 ? 1 : 0;
+ MoveBattlerSpriteToBG(gAnimBankAttacker, toBG2);
+ gSprites[gBankSpriteIds[gAnimBankAttacker]].invisible = 0;
+
+ if (IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2))
+ {
+ MoveBattlerSpriteToBG(gAnimBankAttacker ^ 2, toBG2 ^ 1);
+ gSprites[gBankSpriteIds[gAnimBankAttacker ^ 2]].invisible = 0;
+ }
+
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_80E09C4(u8 taskId)
+{
+ u8 toBG2 = GetBankIdentity_permutated(gAnimBankAttacker) ^ 1 ? 1 : 0;
+ sub_8076464(toBG2);
+
+ if (IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2))
+ sub_8076464(toBG2 ^ 1);
+
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_80E0A10(struct Sprite *sprite)
+{
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ StartSpriteAnim(sprite, gBattleAnimArgs[2]);
+ sprite->callback = sub_8078600;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+}
+
+void sub_80E0A4C(u8 taskId)
+{
+ u16 species;
+ u8 spriteId;
+ u8 newSpriteId;
+ u16 paletteNum;
+ struct Struct_sub_8078914 subStruct;
+ int var0 = 0;
+
+ gBattle_WIN0H = var0;
+ gBattle_WIN0V = var0;
+ REG_WININ = 0x3F3F;
+ REG_WINOUT = 0x3F3D;
+ REG_DISPCNT |= DISPCNT_OBJWIN_ON;
+ REG_BLDCNT = 0x3F42;
+ REG_BLDALPHA = 0xC08;
+ REG_BG1CNT_BITFIELD.priority = 0;
+ REG_BG1CNT_BITFIELD.screenSize = 0;
+ if (!IsContest())
+ REG_BG1CNT_BITFIELD.charBaseBlock = 1;
+
+ if (IsDoubleBattle() && !IsContest())
+ {
+ if (GetBankIdentity(gAnimBankAttacker) == 3 || GetBankIdentity(gAnimBankAttacker) == 0)
+ {
+ if (IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2) == TRUE)
+ {
+ gSprites[gBankSpriteIds[gAnimBankAttacker ^ 2]].oam.priority--;
+ REG_BG1CNT_BITFIELD.priority = 1;
+ var0 = 1;
+ }
+ }
+ }
+
+ if (IsContest())
+ {
+ species = EWRAM_19348;
+ }
+ else
+ {
+ if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER)
+ species = GetMonData(&gEnemyParty[gBattlePartyID[gAnimBankAttacker]], MON_DATA_SPECIES);
+ else
+ species = GetMonData(&gPlayerParty[gBattlePartyID[gAnimBankAttacker]], MON_DATA_SPECIES);
+ }
+
+ spriteId = GetAnimBankSpriteId(0);
+ newSpriteId = sub_807A4A0(gAnimBankAttacker, spriteId, species);
+
+ sub_8078914(&subStruct);
+ DmaClear32(3, subStruct.field_4, 0x1000);
+ LZDecompressVram(&gUnknown_08D1D574, subStruct.field_4);
+ LZDecompressVram(&gUnknown_08D1D410, subStruct.field_0);
+ LoadCompressedPalette(&gUnknown_08D1D54C, subStruct.field_8 << 4, 32);
+
+ gBattle_BG1_X = -gSprites[spriteId].pos1.x + 96;
+ gBattle_BG1_Y = -gSprites[spriteId].pos1.y + 32;
+ paletteNum = 16 + gSprites[spriteId].oam.paletteNum;
+
+ if (gBattleAnimArgs[1] == 0)
+ sub_8079108(paletteNum, FALSE);
+ else
+ BlendPalette(paletteNum * 16, 16, 11, gBattleAnimArgs[2]);
+
+ gTasks[taskId].data[0] = newSpriteId;
+ gTasks[taskId].data[1] = gBattleAnimArgs[0];
+ gTasks[taskId].data[2] = gBattleAnimArgs[1];
+ gTasks[taskId].data[3] = gBattleAnimArgs[2];
+ gTasks[taskId].data[6] = var0;
+ gTasks[taskId].func = sub_80E0CD0;
+}
+
+static void sub_80E0CD0(u8 taskId)
+{
+ struct Struct_sub_8078914 subStruct;
+ u16 paletteNum;
+ u8 spriteId;
+ u8 taskIdCopy = taskId;
+
+ gTasks[taskIdCopy].data[10] += 4;
+ gBattle_BG1_X -= 4;
+
+ if (gTasks[taskIdCopy].data[10] == 128)
+ {
+ gTasks[taskIdCopy].data[10] = 0;
+ gBattle_BG1_X += 128;
+
+ if (++gTasks[taskIdCopy].data[11] == 2)
+ {
+ sub_8076464(0);
+ gBattle_WIN0H = 0;
+ gBattle_WIN0V = 0;
+ REG_WININ = 0x3F3F;
+ REG_WINOUT = 0x3F3F;
+
+ if (!IsContest())
+ REG_BG1CNT_BITFIELD.charBaseBlock = 0;
+
+ REG_DISPCNT ^= DISPCNT_OBJWIN_ON;
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+
+ spriteId = GetAnimBankSpriteId(0);
+ paletteNum = 16 + gSprites[spriteId].oam.paletteNum;
+ if (gTasks[taskIdCopy].data[1] == 0)
+ sub_8079108(paletteNum, 1);
+
+ DestroySprite(&gSprites[gTasks[taskIdCopy].data[0]]);
+ sub_8078914(&subStruct);
+ DmaClear32(3, subStruct.field_4, 0x800);
+
+ if (gTasks[taskIdCopy].data[6] == 1)
+ {
+ gSprites[gBankSpriteIds[gAnimBankAttacker ^ 2]].oam.priority++;
+ }
+
+ DestroyAnimVisualTask(taskIdCopy);
+ }
+ }
+}
+
+void sub_80E0E24(u8 taskId)
+{
+ u8 spriteId;
+ u8 bank;
+ bool8 calcSpriteId = FALSE;
+ u8 identity = 0;
+
+ switch (gBattleAnimArgs[0])
+ {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
+ break;
+ case 4:
+ identity = IDENTITY_PLAYER_MON1;
+ calcSpriteId = TRUE;
+ break;
+ case 5:
+ identity = IDENTITY_PLAYER_MON2;
+ calcSpriteId = TRUE;
+ break;
+ case 6:
+ identity = IDENTITY_OPPONENT_MON1;
+ calcSpriteId = TRUE;
+ break;
+ case 7:
+ identity = IDENTITY_OPPONENT_MON2;
+ calcSpriteId = TRUE;
+ break;
+ default:
+ spriteId = 0xFF;
+ break;
+ }
+
+ if (calcSpriteId)
+ {
+ bank = GetBankByIdentity(identity);
+ if (IsAnimBankSpriteVisible(bank))
+ spriteId = gBankSpriteIds[bank];
+ else
+ spriteId = 0xFF;
+ }
+
+ if (spriteId != 0xFF)
+ sub_8079108(gSprites[spriteId].oam.paletteNum + 16, gBattleAnimArgs[1]);
+
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_80E0EE8(u8 taskId)
+{
+ if (gAnimMoveTurn < 2)
+ gBattleAnimArgs[7] = 0;
+
+ if (gAnimMoveTurn == 2)
+ gBattleAnimArgs[7] = 1;
+
+ DestroyAnimVisualTask(taskId);
+}
diff --git a/src/battle/anim/dragon.c b/src/battle/anim/dragon.c
index bf39e01c0..dc2c0bc50 100644
--- a/src/battle/anim/dragon.c
+++ b/src/battle/anim/dragon.c
@@ -19,7 +19,7 @@ extern u8 gBankAttacker;
extern u16 gBattle_BG1_X;
extern u16 gBattle_BG2_X;
extern u16 gUnknown_03000730[];
-extern u8 gObjectBankIDs[];
+extern u8 gBankSpriteIds[];
// Outrage
@@ -68,7 +68,7 @@ void sub_80DF63C(struct Sprite *sprite)
StartSpriteAnim(sprite, 1);
}
sprite->data[0] = gBattleAnimArgs[4];
- sprite->callback = sub_8078B34;
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
StoreSpriteCallbackInData(sprite, move_anim_8074EE0);
}
diff --git a/src/battle/anim/draw.c b/src/battle/anim/draw.c
index f9e505bf2..be3a280af 100644
--- a/src/battle/anim/draw.c
+++ b/src/battle/anim/draw.c
@@ -59,7 +59,6 @@ void sub_80D0C88(u8 taskId)
task->func = sub_80D0D68;
}
-#ifdef NONMATCHING
void sub_80D0D68(u8 taskId)
{
struct Task* task = &gTasks[taskId];
@@ -99,126 +98,13 @@ void sub_80D0D68(u8 taskId)
if (++task->data[3] >= task->data[15])
{
- gScanlineEffect.unk15 = 3;
+ gScanlineEffect.state = 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 @ =gScanlineEffectRegBuffers\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 @ =gScanlineEffect\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 gScanlineEffectRegBuffers\n\
-_080D0E2C: .4byte gScanlineEffect\n\
-.syntax divided\n");
-}
-#endif
void sub_80D0E30(struct Sprite* sprite)
{
diff --git a/src/battle/anim/drum.c b/src/battle/anim/drum.c
index 6306778ae..7937d040a 100644
--- a/src/battle/anim/drum.c
+++ b/src/battle/anim/drum.c
@@ -27,6 +27,6 @@ void sub_80CEDF0(struct Sprite* sprite)
sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2) + a;
sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3) + 8;
sprite->data[0] = 8;
- sprite->callback = sub_80782D8;
+ sprite->callback = WaitAnimForDuration;
StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
}
diff --git a/src/battle/anim/egg.c b/src/battle/anim/egg.c
index 8004b3bf5..b3de1dbb1 100644
--- a/src/battle/anim/egg.c
+++ b/src/battle/anim/egg.c
@@ -22,7 +22,7 @@ static void sub_80D158C(struct Sprite* sprite);
void sub_80D1368(struct Sprite* sprite)
{
s16 r1;
- sub_80787B0(sprite, 0);
+ InitAnimSpritePos(sprite, 0);
r1 = (GetBankSide(gAnimBankAttacker)) ? -0xA0 : 0xA0;
sprite->data[0] = 0x380;
sprite->data[1] = r1;
diff --git a/src/battle/anim/energy_wave.c b/src/battle/anim/energy_wave.c
index 15045f5bd..8111f70a3 100644
--- a/src/battle/anim/energy_wave.c
+++ b/src/battle/anim/energy_wave.c
@@ -20,7 +20,7 @@ static void sub_80D370C(struct Sprite *);
void sub_80D3554(struct Sprite *sprite)
{
- sub_80787B0(sprite, 1);
+ InitAnimSpritePos(sprite, 1);
sprite->data[0] = 30;
sprite->data[1] = sprite->pos1.x;
@@ -28,7 +28,7 @@ void sub_80D3554(struct Sprite *sprite)
sprite->data[3] = sprite->pos1.y;
sprite->data[4] = GetBankPosition(gAnimBankTarget, 3);
- obj_translate_based_on_private_1_2_3_4(sprite);
+ InitAnimSpriteTranslationDeltas(sprite);
sprite->data[5] = 0xD200 / sprite->data[0];
sprite->data[7] = gBattleAnimArgs[3];
@@ -49,7 +49,7 @@ void sub_80D3554(struct Sprite *sprite)
static void sub_80D35DC(struct Sprite *sprite)
{
- if (sub_8078B5C(sprite))
+ if (TranslateAnimSpriteByDeltas(sprite))
{
DestroyAnimSprite(sprite);
}
@@ -147,7 +147,7 @@ void sub_80D3728(struct Sprite *sprite)
else
var2 = 1;
- sub_80787B0(sprite, var1);
+ InitAnimSpritePos(sprite, var1);
if (GetBankSide(gAnimBankAttacker) != 0)
{
@@ -157,6 +157,6 @@ void sub_80D3728(struct Sprite *sprite)
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;
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
}
diff --git a/src/battle/anim/fight.c b/src/battle/anim/fight.c
new file mode 100644
index 000000000..0f46187f2
--- /dev/null
+++ b/src/battle/anim/fight.c
@@ -0,0 +1,664 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "random.h"
+#include "rom_8077ABC.h"
+#include "sprite.h"
+#include "task.h"
+#include "trig.h"
+#include "constants/battle_constants.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gBankAttacker;
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+extern u8 gBankSpriteIds[];
+extern u8 gBanksBySide[];
+extern u16 gBattle_BG1_X;
+extern u16 gBattle_BG1_Y;
+extern u16 gBattle_BG2_X;
+extern u16 gBattle_BG2_Y;
+extern u16 gBattle_BG3_X;
+extern u16 gBattle_BG3_Y;
+extern u16 gBattle_WIN0H;
+extern u16 gBattle_WIN0V;
+extern u16 gBattlePartyID[];
+extern u8 gAnimMoveTurn;
+
+extern struct SpriteTemplate gBasicHitSplatSpriteTemplate;
+
+static void sub_80D927C(struct Sprite *sprite);
+static void sub_80D9328(struct Sprite *sprite);
+static void sub_80D9404(struct Sprite *sprite);
+static void AnimSpinningKickOrPunchFinish(struct Sprite *sprite);
+static void AnimStompFootStep(struct Sprite *sprite);
+static void AnimStompFootEnd(struct Sprite *sprite);
+static void sub_80D9640(struct Sprite *sprite);
+static void sub_80D97A0(struct Sprite *sprite);
+static void sub_80D986C(struct Sprite *sprite);
+static void sub_80D9934(struct Sprite *sprite);
+static void sub_80D99F4(struct Sprite *sprite);
+
+
+void sub_080B08A0(struct Sprite *sprite)
+{
+ sub_807867C(sprite, gBattleAnimArgs[0]);
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[0] = 15;
+ sprite->callback = WaitAnimForDuration;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+}
+
+void sub_80D902C(struct Sprite *sprite)
+{
+ if (gBattleAnimArgs[7] == 1 && GetBankSide(gAnimBankAttacker) != SIDE_PLAYER)
+ {
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ gBattleAnimArgs[3] = -gBattleAnimArgs[3];
+ }
+
+ StartSpriteAnim(sprite, gBattleAnimArgs[6]);
+ gBattleAnimArgs[6] = 0;
+ sub_8079534(sprite);
+}
+
+void sub_80D9078(struct Sprite *sprite)
+{
+ if (IsContest())
+ {
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ gBattleAnimArgs[3] = -gBattleAnimArgs[3];
+ }
+
+ sub_80D902C(sprite);
+}
+
+// Displays a basic fist or foot sprite for a given duration.
+// Used by many fighting moves (and elemental "punch" moves).
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: duration
+// arg 3: ? (todo: related to initial pixel offsets)
+// arg 4: anim num
+void AnimBasicFistOrFoot(struct Sprite *sprite)
+{
+ StartSpriteAnim(sprite, gBattleAnimArgs[4]);
+
+ if (gBattleAnimArgs[3] == 0)
+ InitAnimSpritePos(sprite, 1);
+ else
+ sub_8078764(sprite, 1);
+
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->callback = WaitAnimForDuration;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+}
+
+void sub_80D90F4(struct Sprite *sprite)
+{
+ u8 bank;
+ s16 xMod, yMod;
+ s16 x, y;
+
+ if (gBattleAnimArgs[0] == 0)
+ bank = gAnimBankAttacker;
+ else
+ bank = gAnimBankTarget;
+
+ if (gBattleAnimArgs[2] < 0)
+ gBattleAnimArgs[2] = Random() % 5;
+
+ StartSpriteAnim(sprite, gBattleAnimArgs[2]);
+ sprite->pos1.x = GetBankPosition(bank, 2);
+ sprite->pos1.y = GetBankPosition(bank, 3);
+
+ xMod = sub_807A100(bank, 1) / 2;
+ yMod = sub_807A100(bank, 0) / 4;
+
+ x = Random() % xMod;
+ y = Random() % yMod;
+
+ if (Random() & 1)
+ x *= -1;
+ if (Random() & 1)
+ y *= -1;
+
+ if ((gBanksBySide[bank] & 1) == 0)
+ y += 0xFFF0;
+
+ sprite->pos1.x += x;
+ sprite->pos1.y += y;
+
+ sprite->data[0] = gBattleAnimArgs[1];
+ sprite->data[7] = CreateSprite(&gBasicHitSplatSpriteTemplate, sprite->pos1.x, sprite->pos1.y, sprite->subpriority + 1);
+ if (sprite->data[7] != 64)
+ {
+ StartSpriteAffineAnim(&gSprites[sprite->data[7]], 0);
+ gSprites[sprite->data[7]].callback = SpriteCallbackDummy;
+ }
+
+ sprite->callback = sub_80D927C;
+}
+
+static void sub_80D927C(struct Sprite *sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ if (sprite->data[7] != 64)
+ {
+ FreeOamMatrix(gSprites[sprite->data[7]].oam.matrixNum);
+ DestroySprite(&gSprites[sprite->data[7]]);
+ }
+
+ DestroyAnimSprite(sprite);
+ }
+ else
+ {
+ sprite->data[0]--;
+ }
+}
+
+void sub_80D92D0(struct Sprite *sprite)
+{
+ sub_8078764(sprite, 1);
+ sprite->data[0] = 30;
+
+ if (gBattleAnimArgs[2] == 0)
+ {
+ sprite->data[2] = sprite->pos1.x - 20;
+ }
+ else
+ {
+ sprite->data[2] = sprite->pos1.x + 20;
+ sprite->hFlip = 1;
+ }
+
+ sprite->data[4] = sprite->pos1.y - 20;
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
+ StoreSpriteCallbackInData(sprite, sub_80D9328);
+}
+
+static void sub_80D9328(struct Sprite *sprite)
+{
+ if (++sprite->data[5] == 11)
+ {
+ sprite->data[2] = sprite->pos1.x - sprite->pos2.x;
+ sprite->data[4] = sprite->pos1.y - sprite->pos2.y;
+ sprite->data[0] = 8;
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+ }
+}
+
+void sub_80D9378(struct Sprite *sprite)
+{
+ if ((gAnimBankAttacker ^ 2) == gAnimBankTarget && GetBankIdentity(gAnimBankTarget) < 2)
+ gBattleAnimArgs[0] *= -1;
+
+ sub_8078764(sprite, 1);
+
+ if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER)
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+
+ sprite->data[0] = gBattleAnimArgs[3];
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2];
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = sprite->pos1.y;
+
+ InitAnimSpriteTranslationDeltas(sprite);
+
+ sprite->data[5] = gBattleAnimArgs[5];
+ sprite->data[6] = gBattleAnimArgs[4];
+ sprite->data[7] = 0;
+
+ sprite->callback = sub_80D9404;
+}
+
+static void sub_80D9404(struct Sprite *sprite)
+{
+ if (!TranslateAnimSpriteByDeltas(sprite))
+ {
+ sprite->pos2.y += Sin(sprite->data[7] >> 8, sprite->data[5]);
+ sprite->data[7] += sprite->data[6];
+ }
+ else
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
+
+// Animates the spinning, shrinking kick or punch, which then
+// reappears at full size. Used by moves such as MOVE_MEGA_PUNCH and MOVE_MEGA_KICK.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: anim num
+// arg 3: spin duration
+void AnimSpinningKickOrPunch(struct Sprite *sprite)
+{
+ sub_8078764(sprite, 1);
+ StartSpriteAnim(sprite, gBattleAnimArgs[2]);
+ sprite->data[0] = gBattleAnimArgs[3];
+
+ sprite->callback = WaitAnimForDuration;
+ StoreSpriteCallbackInData(sprite, AnimSpinningKickOrPunchFinish);
+}
+
+static void AnimSpinningKickOrPunchFinish(struct Sprite *sprite)
+{
+ StartSpriteAffineAnim(sprite, 0);
+ sprite->affineAnimPaused = 1;
+ sprite->data[0] = 20;
+
+ sprite->callback = WaitAnimForDuration;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+}
+
+// Animates MOVE_STOMP's foot that slides downward.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: initial wait duration
+void AnimStompFoot(struct Sprite *sprite)
+{
+ sub_8078764(sprite, 1);
+ sprite->data[0] = gBattleAnimArgs[2];
+
+ sprite->callback = AnimStompFootStep;
+}
+
+static void AnimStompFootStep(struct Sprite *sprite)
+{
+ if (--sprite->data[0] == -1)
+ {
+ sprite->data[0] = 6;
+ sprite->data[2] = GetBankPosition(gAnimBankTarget, 2);
+ sprite->data[4] = GetBankPosition(gAnimBankTarget, 3);
+
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
+ StoreSpriteCallbackInData(sprite, AnimStompFootEnd);
+ }
+}
+
+static void AnimStompFootEnd(struct Sprite *sprite)
+{
+ sprite->data[0] = 15;
+
+ sprite->callback = WaitAnimForDuration;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+}
+
+void sub_80D9540(struct Sprite *sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sub_8078764(sprite, 1);
+ sprite->data[1] = gBattleAnimArgs[2];
+ sprite->data[2] = gBattleAnimArgs[3];
+ 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] > 100)
+ sprite->invisible = sprite->data[3] % 2;
+
+ if (sprite->data[3] > 120)
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void sub_80D95D0(struct Sprite *sprite)
+{
+ if (gBattleAnimArgs[0] == 0)
+ {
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 0);
+ sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 1);
+ }
+ else
+ {
+ sprite->pos1.x = GetBankPosition(gAnimBankTarget, 0);
+ sprite->pos1.y = GetBankPosition(gAnimBankTarget, 1);
+ }
+
+ sprite->pos1.x += gBattleAnimArgs[1];
+ sprite->pos1.y += gBattleAnimArgs[2];
+
+ sprite->data[0] = 0;
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->data[2] = gBattleAnimArgs[4];
+ sprite->data[3] = 0;
+ sprite->callback = sub_80D9640;
+}
+
+static void sub_80D9640(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ if (--sprite->data[1] == 0)
+ {
+ if (sprite->data[2] == 0)
+ DestroyAnimSprite(sprite);
+ else
+ sprite->data[0]++;
+ }
+ break;
+ case 1:
+ if (++sprite->data[1] > 1)
+ {
+ sprite->data[1] = 0;
+ sprite->data[3]++;
+ if (sprite->data[3] & 1)
+ sprite->pos2.x = 2;
+ else
+ sprite->pos2.x = -2;
+ }
+
+ if (--sprite->data[2] == 0)
+ DestroyAnimSprite(sprite);
+ break;
+ }
+}
+
+void sub_80D96B8(struct Sprite *sprite)
+{
+ if (gBattleAnimArgs[0] == 0)
+ {
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 0) + gBattleAnimArgs[2];
+ sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 1) + gBattleAnimArgs[3];
+ }
+ else
+ {
+ sprite->pos1.x = GetBankPosition(gAnimBankTarget, 0) + gBattleAnimArgs[2];
+ sprite->pos1.y = GetBankPosition(gAnimBankTarget, 1) + gBattleAnimArgs[3];
+ }
+
+ sprite->oam.tileNum += gBattleAnimArgs[1] * 16;
+ sprite->data[0] = 0;
+
+ switch (gBattleAnimArgs[1])
+ {
+ case 0:
+ sprite->data[6] = -3;
+ sprite->data[7] = -3;
+ break;
+ case 1:
+ sprite->data[6] = 3;
+ sprite->data[7] = -3;
+ break;
+ case 2:
+ sprite->data[6] = -3;
+ sprite->data[7] = 3;
+ break;
+ case 3:
+ sprite->data[6] = 3;
+ sprite->data[7] = 3;
+ break;
+ default:
+ DestroyAnimSprite(sprite);
+ return;
+ }
+
+ sprite->callback = sub_80D97A0;
+}
+
+static void sub_80D97A0(struct Sprite *sprite)
+{
+ sprite->pos1.x += sprite->data[6];
+ sprite->pos1.y += sprite->data[7];
+
+ if (++sprite->data[0] > 40)
+ DestroyAnimSprite(sprite);
+}
+
+void sub_80D97CC(struct Sprite *sprite)
+{
+ if (gBattleAnimArgs[0] == 0)
+ {
+ sprite->pos1.x = GetBankPosition(gBankAttacker, 2);
+ sprite->pos1.y = GetBankPosition(gBankAttacker, 3);
+ sprite->oam.priority = sub_8079ED4(gAnimBankAttacker);
+ sprite->data[7] = gAnimBankTarget;
+ }
+ else
+ {
+ sprite->oam.priority = sub_8079ED4(gAnimBankTarget);
+ sprite->data[7] = gAnimBankAttacker;
+ }
+
+ sprite->data[0] = 0;
+ sprite->data[1] = 12;
+ sprite->data[2] = 8;
+ sprite->callback = sub_80D986C;
+}
+
+static void sub_80D986C(struct Sprite *sprite)
+{
+ if (++sprite->data[0] == 180)
+ {
+ REG_BLDCNT = 0;
+
+ sprite->data[0] = 16;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = GetBankPosition(sprite->data[7], 2);
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = GetBankPosition(sprite->data[7], 3);
+
+ InitAnimSpriteTranslationDeltas(sprite);
+ StoreSpriteCallbackInData(sprite, move_anim_8074EE0);
+ sprite->callback = TranslateAnimSpriteByDeltasUntil;
+ }
+}
+
+void sub_80D98D8(struct Sprite *sprite)
+{
+ sprite->pos1.x = gBattleAnimArgs[0];
+ sprite->pos1.y = 120;
+
+ sprite->data[0] = gBattleAnimArgs[3];
+ sub_8079BF4(&sprite->data[4], &sprite->data[5], (void *)(sprite->pos1.y << 8));
+
+ sprite->data[6] = gBattleAnimArgs[1];
+ sprite->oam.tileNum += gBattleAnimArgs[2] * 4;
+
+ sprite->callback = sub_80D9934;
+}
+
+static void sub_80D9934(struct Sprite *sprite)
+{
+ void *var0;
+
+ if (sprite->data[0] != 0)
+ {
+ var0 = sub_8079BFC(sprite->data[4], sprite->data[5]);
+ var0 -= sprite->data[6];
+ sub_8079BF4(&sprite->data[4], &sprite->data[5], var0);
+
+ var0 = (void *)(((intptr_t)var0) >> 8);
+ sprite->pos1.y = (intptr_t)var0;
+ if (sprite->pos1.y < -8)
+ DestroyAnimSprite(sprite);
+ else
+ sprite->data[0]--;
+ }
+ else
+ {
+ s16 pos0 = GetBankPosition(gAnimBankAttacker, 2);
+ s16 pos1 = GetBankPosition(gAnimBankAttacker, 3);
+ s16 pos2 = GetBankPosition(gAnimBankTarget, 2);
+ s16 pos3 = GetBankPosition(gAnimBankTarget, 3);
+
+ sprite->data[0] = pos2 - pos0;
+ sprite->data[1] = pos3 - pos1;
+ sprite->data[2] = sprite->pos1.x << 4;
+ sprite->data[3] = sprite->pos1.y << 4;
+
+ sprite->callback = sub_80D99F4;
+ }
+}
+
+static void sub_80D99F4(struct Sprite *sprite)
+{
+ u16 edgeX;
+
+ sprite->data[2] += sprite->data[0];
+ sprite->data[3] += sprite->data[1];
+ sprite->pos1.x = sprite->data[2] >> 4;
+ sprite->pos1.y = sprite->data[3] >> 4;
+
+ edgeX = sprite->pos1.x + 8;
+ if (edgeX > 256 || sprite->pos1.y < -8 || sprite->pos1.y > 120)
+ DestroyAnimSprite(sprite);
+}
+
+void sub_80D9A38(struct Sprite *sprite)
+{
+ u8 bank;
+
+ if (gBattleAnimArgs[0] == 0)
+ {
+ sprite->pos1.x = GetBankPosition(gBankAttacker, 2);
+ sprite->pos1.y = GetBankPosition(gBankAttacker, 3);
+ bank = gAnimBankTarget;
+ sprite->oam.priority = sub_8079ED4(gAnimBankAttacker);
+ }
+ else
+ {
+ bank = gAnimBankAttacker;
+ sprite->oam.priority = sub_8079ED4(gAnimBankTarget);
+ }
+
+ if (IsContest())
+ sprite->oam.matrixNum |= 0x8;
+ else if (GetBankSide(bank) == SIDE_PLAYER)
+ sprite->oam.matrixNum |= 0x18;
+
+ sprite->data[0] = 16;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = GetBankPosition(bank, 2);
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = GetBankPosition(bank, 3);
+
+ InitAnimSpriteTranslationDeltas(sprite);
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+ sprite->callback = TranslateAnimSpriteByDeltasUntil;
+}
+
+static void sub_80D9B24(struct Sprite *sprite)
+{
+ if (sprite->data[0] == sprite->data[4])
+ DestroyAnimSprite(sprite);
+
+ sprite->data[0]++;
+}
+
+void sub_80D9B48(struct Sprite *sprite)
+{
+ u8 turn;
+
+ sprite->pos1.x = GetBankPosition(gAnimBankTarget, 2);
+ sprite->pos1.y = GetBankPosition(gAnimBankTarget, 3);
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->data[2] = gBattleAnimArgs[0];
+ sprite->data[3] = gBattleAnimArgs[1];
+ sprite->data[4] = gBattleAnimArgs[2];
+
+ turn = gAnimMoveTurn;
+ if (GetBankSide(gAnimBankTarget) == SIDE_PLAYER)
+ turn++;
+
+ if (turn & 1)
+ {
+ sprite->data[2] = -sprite->data[2];
+ sprite->data[1]++;
+ }
+
+ StartSpriteAnim(sprite, sprite->data[1]);
+ sprite->pos2.x = sprite->data[2];
+ sprite->pos2.y = sprite->data[3];
+ sprite->callback = sub_80D9B24;
+}
+
+void sub_80D9BD4(struct Sprite *sprite)
+{
+ if (gBattleAnimArgs[2] == 0)
+ InitAnimSpritePos(sprite, 0);
+ else
+ sub_8078764(sprite, 0);
+
+ if (IsContest())
+ {
+ StartSpriteAnim(sprite, 2);
+ }
+ else if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER)
+ {
+ StartSpriteAnim(sprite, 1);
+ }
+
+ sprite->callback = sub_8078600;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+}
+
+void sub_80D9C40(struct Sprite *sprite)
+{
+ if (sprite->affineAnimEnded)
+ {
+ sprite->data[1] = (sprite->data[1] + 40) & 0xFF;
+ sprite->pos2.x = Sin(sprite->data[1], 2);
+
+ if (++sprite->data[0] > 40)
+ {
+ DestroyAnimSprite(sprite);
+ }
+ }
+}
+
+void sub_80D9C80(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ sub_80789D4(0);
+ task->data[8] = gBattleAnimArgs[0];
+ task->data[0]++;
+ break;
+ case 1:
+ if (--task->data[8] == -1)
+ task->data[0]++;
+ break;
+ case 2:
+ default:
+ task->data[9] += 1280;
+ break;
+ }
+
+ task->data[10] += 2816;
+
+ if (GetBankSide(gAnimBankTarget) == SIDE_PLAYER)
+ gBattle_BG3_X += task->data[9] >> 8;
+ else
+ gBattle_BG3_X -= task->data[9] >> 8;
+
+ gBattle_BG3_Y += task->data[10] >> 8;
+
+ task->data[9] &= 0xFF;
+ task->data[10] &= 0xFF;
+
+ if (gBattleAnimArgs[7] == -1)
+ {
+ gBattle_BG3_X = 0;
+ gBattle_BG3_Y = 0;
+ sub_80789D4(1);
+ DestroyAnimVisualTask(taskId);
+ }
+}
diff --git a/src/battle/anim/fire_2.c b/src/battle/anim/fire_2.c
index 4d577a765..f9c9b6d3b 100644
--- a/src/battle/anim/fire_2.c
+++ b/src/battle/anim/fire_2.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "battle.h"
#include "battle_anim.h"
#include "heated_rock.h"
#include "rom_8077ABC.h"
@@ -11,24 +12,34 @@ 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 *);
+static void AnimFireRingStep1(struct Sprite *);
+static void UpdateFireRingCircleOffset(struct Sprite *);
+static void AnimFireRingStep2(struct Sprite *);
+static void AnimFireRingStep3(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)
+
+// Animates the secondary effect of MOVE_EMBER, where the flames grow and slide
+// horizontally a bit.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: target x pixel offset
+// arg 3: target y pixel offset
+// arg 4: duration
+// arg 5: ? (todo: something related to which mon the pixel offsets are based on)
+// arg 6: ? (todo: something related to which mon the pixel offsets are based on)
+void AnimEmberFlare(struct Sprite *sprite)
{
if (GetBankSide(gAnimBankAttacker) == GetBankSide(gAnimBankTarget)
- && (gAnimBankAttacker == GetBankByIdentity(2)
- || gAnimBankAttacker == GetBankByIdentity(3)))
+ && (gAnimBankAttacker == GetBankByIdentity(IDENTITY_PLAYER_MON2)
+ || gAnimBankAttacker == GetBankByIdentity(IDENTITY_OPPONENT_MON2)))
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
sprite->callback = sub_8079534;
- sub_8079534(sprite);
+ sprite->callback(sprite);
}
struct Sprite *sub_80D5210(struct Sprite *sprite)
@@ -40,19 +51,26 @@ struct Sprite *sub_80D5210(struct Sprite *sprite)
return sprite;
}
-void sub_80D522C(struct Sprite *sprite)
+// Animates the a fire sprite in the first-half of the MOVE_FIRE_BLAST
+// animation. The fire sprite first moves in a circle around the mon,
+// and then it is translated towards the target mon, while still rotating.
+// Lastly, it moves in a circle around the target mon.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: initial wave offset
+void AnimFireRing(struct Sprite *sprite)
{
- sub_80787B0(sprite, 1);
+ InitAnimSpritePos(sprite, 1);
sprite->data[7] = gBattleAnimArgs[2];
sprite->data[0] = 0;
- sprite->callback = sub_80D5254;
+ sprite->callback = AnimFireRingStep1;
}
-void sub_80D5254(struct Sprite *sprite)
+static void AnimFireRingStep1(struct Sprite *sprite)
{
- sub_80D5348(sprite);
+ UpdateFireRingCircleOffset(sprite);
if (++sprite->data[0] == 0x12)
{
@@ -62,15 +80,15 @@ void sub_80D5254(struct Sprite *sprite)
sprite->data[3] = sprite->pos1.y;
sprite->data[4] = GetBankPosition(gAnimBankTarget, 3);
- obj_translate_based_on_private_1_2_3_4(sprite);
+ InitAnimSpriteTranslationDeltas(sprite);
- sprite->callback = sub_80D52AC;
+ sprite->callback = AnimFireRingStep2;
}
}
-void sub_80D52AC(struct Sprite *sprite)
+static void AnimFireRingStep2(struct Sprite *sprite)
{
- if (sub_8078B5C(sprite))
+ if (TranslateAnimSpriteByDeltas(sprite))
{
sprite->data[0] = 0;
@@ -79,8 +97,8 @@ void sub_80D52AC(struct Sprite *sprite)
sprite->pos2.y = 0;
sprite->pos2.x = 0;
- sprite->callback = sub_80D5324;
- sub_80D5324(sprite);
+ sprite->callback = AnimFireRingStep3;
+ sprite->callback(sprite);
}
else
{
@@ -91,15 +109,15 @@ void sub_80D52AC(struct Sprite *sprite)
}
}
-void sub_80D5324(struct Sprite *sprite)
+static void AnimFireRingStep3(struct Sprite *sprite)
{
- sub_80D5348(sprite);
+ UpdateFireRingCircleOffset(sprite);
if (++sprite->data[0] == 0x1F)
DestroyAnimSprite(sprite);
}
-void sub_80D5348(struct Sprite *sprite)
+static void UpdateFireRingCircleOffset(struct Sprite *sprite)
{
sprite->pos2.x = Sin(sprite->data[7], 28);
sprite->pos2.y = Cos(sprite->data[7], 28);
@@ -107,7 +125,12 @@ void sub_80D5348(struct Sprite *sprite)
sprite->data[7] = (sprite->data[7] + 20) & 0xFF;
}
-void sub_80D5374(struct Sprite *sprite)
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: duration
+// arg 3: x delta
+// arg 4: y delta
+void AnimFireCross(struct Sprite *sprite)
{
sprite->pos1.x += gBattleAnimArgs[0];
sprite->pos1.y += gBattleAnimArgs[1];
@@ -118,18 +141,18 @@ void sub_80D5374(struct Sprite *sprite)
StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
- sprite->callback = sub_8078364;
+ sprite->callback = TranslateSpriteOverDuration;
}
void sub_80D53B4(struct Sprite *sprite)
{
- sub_80787B0(sprite, 1);
+ InitAnimSpritePos(sprite, 1);
sprite->data[1] = gBattleAnimArgs[2];
sprite->data[0] = gBattleAnimArgs[3];
sprite->invisible = TRUE;
- sprite->callback = sub_80782D8;
+ sprite->callback = WaitAnimForDuration;
StoreSpriteCallbackInData(sprite, sub_80D53F4);
}
diff --git a/src/battle/anim/flying_hearts.c b/src/battle/anim/flying_hearts.c
index d2d22602a..f20416535 100644
--- a/src/battle/anim/flying_hearts.c
+++ b/src/battle/anim/flying_hearts.c
@@ -19,7 +19,7 @@ void sub_80D2064(struct Sprite* sprite)
sprite->pos1.y = 0xA0;
sprite->data[0] = gBattleAnimArgs[2];
sprite->data[1] = gBattleAnimArgs[1];
- sprite->callback = sub_80782D8;
+ sprite->callback = WaitAnimForDuration;
StoreSpriteCallbackInData(sprite, sub_80D2094);
}
diff --git a/src/battle/anim/flying_path.c b/src/battle/anim/flying_path.c
index 441ac0e6d..70c418afc 100644
--- a/src/battle/anim/flying_path.c
+++ b/src/battle/anim/flying_path.c
@@ -40,7 +40,7 @@ void sub_80CBDF4(u8 taskId)
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]]);
+ InitAnimSpriteTranslationOverDuration(&gSprites[task->data[2]]);
task->func = sub_80CBF5C;
}
@@ -53,7 +53,7 @@ void sub_80CBF5C(u8 taskId)
{
case 4:
sub_80CC358(task, taskId);
- if (sub_8078718(sprite) == 0)
+ if (TranslateAnimSpriteLinearAndSine(sprite) == 0)
{
break;
}
@@ -65,7 +65,7 @@ void sub_80CBF5C(u8 taskId)
break;
case 8:
sub_80CC358(task, taskId);
- if (sub_8078718(sprite) == 0)
+ if (TranslateAnimSpriteLinearAndSine(sprite) == 0)
{
break;
}
@@ -77,7 +77,7 @@ void sub_80CBF5C(u8 taskId)
break;
case 0:
sub_80CC358(task, taskId);
- if (sub_8078718(sprite) == 0)
+ if (TranslateAnimSpriteLinearAndSine(sprite) == 0)
break;
task->data[15] = 1;
@@ -98,12 +98,12 @@ void sub_80CBF5C(u8 taskId)
task->data[3] = a;
sprite->subpriority = task->data[4];
StartSpriteAnim(sprite, task->data[3]);
- sub_80786EC(sprite);
+ InitAnimSpriteTranslationOverDuration(sprite);
task->data[0]++;
break;
case 2:
sub_80CC358(task, taskId);
- if (sub_8078718(sprite) == 0)
+ if (TranslateAnimSpriteLinearAndSine(sprite) == 0)
break;
task->data[15] = 3;
@@ -123,7 +123,7 @@ void sub_80CBF5C(u8 taskId)
task->data[3] = 2;
sprite->subpriority = task->data[4];
StartSpriteAnim(sprite, task->data[3]);
- sub_80786EC(sprite);
+ InitAnimSpriteTranslationOverDuration(sprite);
task->data[0]++;
break;
case 5:
@@ -141,12 +141,12 @@ void sub_80CBF5C(u8 taskId)
task->data[3] = 3;
sprite->subpriority = task->data[4];
StartSpriteAnim(sprite, task->data[3]);
- sub_80786EC(sprite);
+ InitAnimSpriteTranslationOverDuration(sprite);
task->data[0]++;
break;
case 6:
sub_80CC358(task, taskId);
- if (sub_8078718(sprite) == 0)
+ if (TranslateAnimSpriteLinearAndSine(sprite) == 0)
break;
task->data[15] = 7;
@@ -167,7 +167,7 @@ void sub_80CBF5C(u8 taskId)
task->data[3] = 4;
sprite->subpriority = task->data[4];
StartSpriteAnim(sprite, task->data[3]);
- sub_80786EC(sprite);
+ InitAnimSpriteTranslationOverDuration(sprite);
task->data[0]++;
break;
case 9:
@@ -184,12 +184,12 @@ void sub_80CBF5C(u8 taskId)
task->data[3] = 5;
sprite->subpriority = task->data[4];
StartSpriteAnim(sprite, task->data[3]);
- sub_80786EC(sprite);
+ InitAnimSpriteTranslationOverDuration(sprite);
task->data[0]++;
break;
case 10:
sub_80CC358(task, taskId);
- if (sub_8078718(sprite) == 0)
+ if (TranslateAnimSpriteLinearAndSine(sprite) == 0)
{
break;
}
@@ -215,13 +215,13 @@ void sub_80CBF5C(u8 taskId)
task->data[3] = 6;
sprite->subpriority = task->data[4];
StartSpriteAnim(sprite, task->data[3]);
- sub_80786EC(sprite);
+ InitAnimSpriteTranslationOverDuration(sprite);
task->data[0]++;
break;
}
case 12:
sub_80CC358(task, taskId);
- if (sub_8078718(sprite) != 0)
+ if (TranslateAnimSpriteLinearAndSine(sprite) != 0)
{
DestroySprite(sprite);
task->data[0]++;
diff --git a/src/battle/anim/glitter.c b/src/battle/anim/glitter.c
index e4577f1e1..e6c101de3 100644
--- a/src/battle/anim/glitter.c
+++ b/src/battle/anim/glitter.c
@@ -35,7 +35,7 @@ void sub_80CD190(struct Sprite* sprite)
if (IsDoubleBattle() && IsAnimBankSpriteVisible(bank ^ 2))
{
- sub_807A3FC(bank, gBattleAnimArgs[6], &sprite->pos1.x, &sprite->pos1.y);
+ SetAverageBattlerPositions(bank, gBattleAnimArgs[6], &sprite->pos1.x, &sprite->pos1.y);
sub_807867C(sprite, gBattleAnimArgs[0]);
sprite->pos1.y += gBattleAnimArgs[1];
}
diff --git a/src/battle/anim/grip.c b/src/battle/anim/grip.c
index c4d7b1cef..dbf7a1562 100644
--- a/src/battle/anim/grip.c
+++ b/src/battle/anim/grip.c
@@ -33,7 +33,7 @@ void sub_80D0178(struct Sprite* sprite)
sprite->data[0] = 6;
sprite->data[2] = GetBankPosition(gAnimBankTarget, 2) + r8;
sprite->data[4] = GetBankPosition(gAnimBankTarget, 3) + r6;
- sprite->callback = sub_8078B34;
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
StoreSpriteCallbackInData(sprite, sub_80D020C);
}
diff --git a/src/battle/anim/guard.c b/src/battle/anim/guard.c
index ab093eab1..211e0e841 100644
--- a/src/battle/anim/guard.c
+++ b/src/battle/anim/guard.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "battle.h"
#include "battle_anim.h"
#include "rom_8077ABC.h"
@@ -12,9 +13,9 @@ extern u16 gBattleTypeFlags;
void sub_80D3014(struct Sprite *sprite)
{
- if ((gBattleTypeFlags & 1) && IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2))
+ if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2))
{
- sub_807A3FC(gAnimBankAttacker, 0, &sprite->pos1.x, &sprite->pos1.y);
+ SetAverageBattlerPositions(gAnimBankAttacker, 0, &sprite->pos1.x, &sprite->pos1.y);
sprite->pos1.y += 40;
StartSpriteAffineAnim(sprite, 1);
@@ -29,6 +30,6 @@ void sub_80D3014(struct Sprite *sprite)
sprite->data[2] = sprite->pos1.x;
sprite->data[4] = sprite->pos1.y - 72;
- sprite->callback = sub_8078B34;
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
}
diff --git a/src/battle/anim/guillotine.c b/src/battle/anim/guillotine.c
index b3d842cdf..15279d5e2 100644
--- a/src/battle/anim/guillotine.c
+++ b/src/battle/anim/guillotine.c
@@ -37,7 +37,7 @@ void sub_80D0228(struct Sprite* sprite)
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);
+ InitAnimSpriteTranslationDeltas(sprite);
sprite->data[5] = gBattleAnimArgs[0];
sprite->data[6] = sprite->data[0];
sprite->callback = sub_80D02D0;
@@ -45,7 +45,7 @@ void sub_80D0228(struct Sprite* sprite)
void sub_80D02D0(struct Sprite* sprite)
{
- if (sub_8078B5C(sprite) && sprite->animEnded == 1)
+ if (TranslateAnimSpriteByDeltas(sprite) && sprite->animEnded == 1)
{
SeekSpriteAnim(sprite, 0);
sprite->animPaused = 1;
@@ -85,6 +85,6 @@ void sub_80D0344(struct Sprite* sprite)
void sub_80D03A8(struct Sprite* sprite)
{
- if (sub_8078B5C(sprite) != 0)
+ if (TranslateAnimSpriteByDeltas(sprite) != 0)
DestroyAnimSprite(sprite);
}
diff --git a/src/battle/anim/heart_1.c b/src/battle/anim/heart_1.c
index 5df89f929..857169e62 100644
--- a/src/battle/anim/heart_1.c
+++ b/src/battle/anim/heart_1.c
@@ -14,7 +14,7 @@ extern u8 gAnimBankTarget;
void sub_80D1C80(struct Sprite* sprite)
{
if (++sprite->data[0] == 1)
- sub_80787B0(sprite, 0);
+ InitAnimSpritePos(sprite, 0);
sprite->pos2.x = Sin(sprite->data[1], 8);
sprite->pos2.y = sprite->data[2] >> 8;
diff --git a/src/battle/anim/heated_rock.c b/src/battle/anim/heated_rock.c
index 51cfbd007..055960f40 100644
--- a/src/battle/anim/heated_rock.c
+++ b/src/battle/anim/heated_rock.c
@@ -50,101 +50,25 @@ void sub_80D5994(struct Sprite *sprite, s16 x, s16 y)
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[1] * (u16)sprite->data[1];
+ sprite->data[3] += var1;
}
- 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;
+ sprite->data[2] += sprite->data[4];
+ sprite->pos1.x = sprite->data[2] >> 3;
+ sprite->data[3] += sprite->data[5];
+ sprite->pos1.y = sprite->data[3] >> 3;
- 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");
+ if (sprite->pos1.x < -8 || sprite->pos1.x > 0xf8 || sprite->pos1.y < -8 || sprite->pos1.y > 120)
+ sprite->invisible = TRUE;
}
-#endif // NONMATCHING
void sub_80D5A20(struct Sprite *sprite)
{
diff --git a/src/battle/anim/homing.c b/src/battle/anim/homing.c
index 6fb4a76d8..208d3b831 100644
--- a/src/battle/anim/homing.c
+++ b/src/battle/anim/homing.c
@@ -60,7 +60,7 @@ void sub_80CC6CC(struct Sprite* sprite)
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);
+ c = ArcTan2Neg(sprite->data[5] - x, sprite->data[6] - y);
if (IsContest())
c -= 0x8000;
diff --git a/src/battle/anim/hop.c b/src/battle/anim/hop.c
index 4006e2d43..0697e83a0 100644
--- a/src/battle/anim/hop.c
+++ b/src/battle/anim/hop.c
@@ -91,7 +91,7 @@ void sub_80CB94C(struct Sprite* sprite)
{
s16 e1;
s16 e2;
- sub_80787B0(sprite, 0);
+ InitAnimSpritePos(sprite, 0);
e1 = GetBankPosition(gAnimBankTarget, 0);
e2 = GetBankPosition(gAnimBankTarget, 1);
if ((gAnimBankAttacker ^ 2) == gAnimBankTarget)
diff --git a/src/battle/anim/lunge_1.c b/src/battle/anim/lunge_1.c
index d379c8f09..a3b5f19c5 100644
--- a/src/battle/anim/lunge_1.c
+++ b/src/battle/anim/lunge_1.c
@@ -8,7 +8,7 @@ extern s16 gBattleAnimArgs[];
extern u8 gAnimBankAttacker;
extern u8 gAnimBankTarget;
-extern u8 gObjectBankIDs[];
+extern u8 gBankSpriteIds[];
static void sub_80CD7CC(struct Sprite* sprite);
static void sub_80CD81C(struct Sprite* sprite);
@@ -46,16 +46,16 @@ 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];
+ sprite->data[3] = gBankSpriteIds[gAnimBankAttacker];
StoreSpriteCallbackInData(sprite, sub_80CD81C);
- sprite->callback = sub_8078458;
+ sprite->callback = TranslateMonBGUntil;
}
void sub_80CD81C(struct Sprite* sprite)
{
if (sprite->data[0] == 0)
{
- sprite->data[3] = gObjectBankIDs[gAnimBankAttacker];
+ sprite->data[3] = gBankSpriteIds[gAnimBankAttacker];
sub_8078E70(sprite->data[3], 0);
sprite->data[4] = (sprite->data[6] = GetBankSide(gAnimBankAttacker)) ? 0x300 : 0xFFFFFD00;
sprite->data[5] = 0;
@@ -76,9 +76,9 @@ 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];
+ sprite->data[3] = gBankSpriteIds[gAnimBankAttacker];
StoreSpriteCallbackInData(sprite, sub_80CD9B8);
- sprite->callback = sub_8078458;
+ sprite->callback = TranslateMonBGUntil;
}
void sub_80CD8F8(struct Sprite* sprite)
@@ -94,7 +94,7 @@ void sub_80CD91C(struct Sprite* sprite)
{
if (sprite->data[0] == 0)
{
- sprite->data[3] = gObjectBankIDs[gAnimBankAttacker];
+ sprite->data[3] = gBankSpriteIds[gAnimBankAttacker];
sprite->data[6] = GetBankSide(gAnimBankAttacker);
if (GetBankSide(gAnimBankAttacker))
{
diff --git a/src/battle/anim/lunge_2.c b/src/battle/anim/lunge_2.c
index fe2470567..f222b291d 100644
--- a/src/battle/anim/lunge_2.c
+++ b/src/battle/anim/lunge_2.c
@@ -8,7 +8,7 @@ extern s16 gBattleAnimArgs[];
extern u8 gAnimBankAttacker;
extern u8 gAnimBankTarget;
-extern u8 gObjectBankIDs[];
+extern u8 gBankSpriteIds[];
static void sub_80CDB60(u8 taskId);
static void sub_80CDD20(u8 taskId);
@@ -20,7 +20,7 @@ void sub_80CDAC8(u8 taskId)
{
u8 a;
- gTasks[taskId].data[0] = gObjectBankIDs[gAnimBankAttacker];
+ gTasks[taskId].data[0] = gBankSpriteIds[gAnimBankAttacker];
a = GetBankSide(gAnimBankAttacker);
gTasks[taskId].data[1] = a;
gTasks[taskId].data[2] = 0;
diff --git a/src/battle/anim/money.c b/src/battle/anim/money.c
index 8358d23db..c3d130750 100644
--- a/src/battle/anim/money.c
+++ b/src/battle/anim/money.c
@@ -19,14 +19,14 @@ void sub_80CFE9C(struct Sprite* sprite)
s16 r7;
u16 var;
- sub_80787B0(sprite, 1);
+ InitAnimSpritePos(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 = ArcTan2Neg(r6 - sprite->pos1.x, r7 - sprite->pos1.y);
var += 0xC000;
sub_8078FDC(sprite, 0, 0x100, 0x100, var);
sprite->data[0] = gBattleAnimArgs[4];
diff --git a/src/battle/anim/note_rain.c b/src/battle/anim/note_rain.c
index 715462d73..44817b0a0 100644
--- a/src/battle/anim/note_rain.c
+++ b/src/battle/anim/note_rain.c
@@ -24,14 +24,14 @@ void sub_80D1BA8(struct Sprite* sprite, u8 a, u8 b)
void sub_80D1C08(struct Sprite* sprite)
{
- sub_80787B0(sprite, 0);
+ InitAnimSpritePos(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;
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
sub_80D1BA8(sprite, gBattleAnimArgs[5], gBattleAnimArgs[6]);
}
diff --git a/src/battle/anim/note_scatter_2.c b/src/battle/anim/note_scatter_2.c
index 524c51c08..262afb8bf 100644
--- a/src/battle/anim/note_scatter_2.c
+++ b/src/battle/anim/note_scatter_2.c
@@ -32,14 +32,14 @@ void sub_80CEE60(struct Sprite* sprite)
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);
+ InitAnimSpriteTranslationDeltas(sprite);
sprite->data[5] = gBattleAnimArgs[3];
sprite->callback = sub_80CEEE8;
}
void sub_80CEEE8(struct Sprite* sprite)
{
- if (sub_8078B5C(sprite) == 0)
+ if (TranslateAnimSpriteByDeltas(sprite) == 0)
{
s16 a;
a = Sin(sprite->data[5], 8);
diff --git a/src/battle/anim/orbit.c b/src/battle/anim/orbit.c
index c8cf339d2..e7dd0df49 100644
--- a/src/battle/anim/orbit.c
+++ b/src/battle/anim/orbit.c
@@ -79,13 +79,13 @@ void sub_80CACEC(u8 taskId)
void sub_80CAD54(struct Sprite* sprite)
{
- sub_80787B0(sprite, 0);
+ InitAnimSpritePos(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);
+ InitAnimSpriteTranslationDeltas(sprite);
sprite->data[5] = 0x40;
sprite->callback = sub_80CADA8;
sub_80CADA8(sprite);
@@ -93,7 +93,7 @@ void sub_80CAD54(struct Sprite* sprite)
void sub_80CADA8(struct Sprite* sprite)
{
- if (!sub_8078B5C(sprite))
+ if (!TranslateAnimSpriteByDeltas(sprite))
{
sprite->pos2.x += Sin(sprite->data[5], 32);
sprite->pos2.y += Cos(sprite->data[5], -5);
@@ -116,13 +116,13 @@ void sub_80CADA8(struct Sprite* sprite)
void sub_80CAE20(struct Sprite* sprite)
{
- sub_80787B0(sprite, 1);
+ InitAnimSpritePos(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);
+ InitAnimSpriteTranslationDeltas(sprite);
sprite->data[5] = 0x40;
sprite->callback = sub_80CAE74;
sub_80CAE74(sprite);
@@ -130,7 +130,7 @@ void sub_80CAE20(struct Sprite* sprite)
void sub_80CAE74(struct Sprite* sprite)
{
- if (!sub_8078B5C(sprite))
+ if (!TranslateAnimSpriteByDeltas(sprite))
{
sprite->pos2.x += Sin(sprite->data[5], 8);
if ((u16)(sprite->data[5] - 0x3B) < 5 || (u16)(sprite->data[5] - 0xBB) < 5)
diff --git a/src/battle/anim/orbit_fast.c b/src/battle/anim/orbit_fast.c
index 92b67672b..71303b03c 100644
--- a/src/battle/anim/orbit_fast.c
+++ b/src/battle/anim/orbit_fast.c
@@ -8,12 +8,13 @@ extern s16 gBattleAnimArgs[];
extern u8 gAnimBankAttacker;
extern u8 gAnimBankTarget;
-static void sub_80D2704(struct Sprite* sprite);
+static void AnimOrbitFastStep(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)
+// Orbits a sphere in an ellipse around the mon.
+// Used by MOVE_HIDDEN_POWER
+// arg 0: duration
+// arg 1: initial wave offset
+void AnimOrbitFast(struct Sprite* sprite)
{
sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2);
sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3);
@@ -21,11 +22,11 @@ void sub_80D26A4(struct Sprite* sprite)
sprite->data[0] = gBattleAnimArgs[0];
sprite->data[1] = gBattleAnimArgs[1];
sprite->data[7] = sub_8079E90(gAnimBankAttacker);
- sprite->callback = sub_80D2704;
- sub_80D2704(sprite);
+ sprite->callback = AnimOrbitFastStep;
+ sprite->callback(sprite);
}
-void sub_80D2704(struct Sprite* sprite)
+static void AnimOrbitFastStep(struct Sprite* sprite)
{
if ((u16)(sprite->data[1] - 0x40) <= 0x7F)
sprite->subpriority = sprite->data[7] + 1;
diff --git a/src/battle/anim/orbit_scatter.c b/src/battle/anim/orbit_scatter.c
index 54c157839..cda09a729 100644
--- a/src/battle/anim/orbit_scatter.c
+++ b/src/battle/anim/orbit_scatter.c
@@ -8,21 +8,21 @@ extern s16 gBattleAnimArgs[];
extern u8 gAnimBankAttacker;
extern u8 gAnimBankTarget;
-static void sub_80D2834(struct Sprite* sprite);
+static void AnimOrbitScatterStep(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)
+// Moves orbs away from the mon, based on where they are in their orbit.
+// Used in MOVE_HIDDEN_POWER.
+// arg 0: initial wave offset
+void AnimOrbitScatter(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;
+ sprite->callback = AnimOrbitScatterStep;
}
-void sub_80D2834(struct Sprite* sprite)
+static void AnimOrbitScatterStep(struct Sprite* sprite)
{
sprite->pos2.x += sprite->data[0];
sprite->pos2.y += sprite->data[1];
diff --git a/src/battle/anim/orbs.c b/src/battle/anim/orbs.c
index 6ca2fa71c..6f1bba9c3 100644
--- a/src/battle/anim/orbs.c
+++ b/src/battle/anim/orbs.c
@@ -19,34 +19,34 @@ extern struct SpriteTemplate gSpriteTemplate_83D631C;
void sub_80CA7B0(struct Sprite* sprite)
{
- sub_80787B0(sprite, 1);
+ InitAnimSpritePos(sprite, 1);
sprite->data[0] = gBattleAnimArgs[2];
sprite->data[2] = GetBankPosition(gAnimBankAttacker, 2);
sprite->data[4] = GetBankPosition(gAnimBankAttacker, 3);
- sprite->callback = sub_8078B34;
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
StoreSpriteCallbackInData(sprite, move_anim_8074EE0);
}
void sub_80CA800(struct Sprite* sprite)
{
- sub_80787B0(sprite, 1);
+ InitAnimSpritePos(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;
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
}
void sub_80CA858(struct Sprite* sprite)
{
- sub_80787B0(sprite, 1);
+ InitAnimSpritePos(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);
+ InitAnimSpriteTranslationDeltas(sprite);
sprite->data[5] = gBattleAnimArgs[3];
sprite->callback = sub_80CA8B4;
sub_80CA8B4(sprite);
@@ -54,7 +54,7 @@ void sub_80CA858(struct Sprite* sprite)
void sub_80CA8B4(struct Sprite* sprite)
{
- if (sub_8078B5C(sprite))
+ if (TranslateAnimSpriteByDeltas(sprite))
{
DestroySprite(sprite);
}
@@ -99,13 +99,13 @@ void sub_80CA9A8(struct Sprite* sprite)
sprite->data[2] = GetBankPosition(gAnimBankAttacker, 2);
sprite->data[4] = GetBankPosition(gAnimBankAttacker, 3);
sprite->data[5] = gBattleAnimArgs[2];
- sub_80786EC(sprite);
+ InitAnimSpriteTranslationOverDuration(sprite);
sprite->callback = sub_80CA9F8;
}
void sub_80CA9F8(struct Sprite* sprite)
{
- if (sub_8078718(sprite))
+ if (TranslateAnimSpriteLinearAndSine(sprite))
DestroyAnimSprite(sprite);
}
diff --git a/src/battle/anim/perceive.c b/src/battle/anim/perceive.c
index 3b3153428..14db096c6 100644
--- a/src/battle/anim/perceive.c
+++ b/src/battle/anim/perceive.c
@@ -19,6 +19,6 @@ void sub_80D2904(struct Sprite* sprite)
void sub_80D2920(struct Sprite* sprite)
{
- sub_80787B0(sprite, 1);
+ InitAnimSpritePos(sprite, 1);
sprite->callback = sub_80D2904;
}
diff --git a/src/battle/anim/poison.c b/src/battle/anim/poison.c
index f31c441fb..3a7477a57 100644
--- a/src/battle/anim/poison.c
+++ b/src/battle/anim/poison.c
@@ -10,28 +10,28 @@ extern u8 gAnimBankTarget;
void sub_80D9DD4(struct Sprite *sprite);
void sub_80D9E78(struct Sprite *sprite);
void sub_80D9EE8(struct Sprite *sprite);
-void sub_80D9FF0(struct Sprite *sprite);
+static void AnimBubbleEffectStep(struct Sprite *sprite);
void sub_80D9D70(struct Sprite *sprite)
{
if (!gBattleAnimArgs[3])
StartSpriteAnim(sprite, 2);
- sub_80787B0(sprite, 1);
+ InitAnimSpritePos(sprite, 1);
sprite->data[0] = gBattleAnimArgs[2];
sprite->data[2] = GetBankPosition(gAnimBankTarget, 2);
sprite->data[4] = GetBankPosition(gAnimBankTarget, 3);
sprite->data[5] = -30;
- sub_80786EC(sprite);
+ InitAnimSpriteTranslationOverDuration(sprite);
sprite->callback = sub_80D9DD4;
}
void sub_80D9DD4(struct Sprite *sprite) // same as sub_80D9E78
{
- if (sub_8078718(sprite))
+ if (TranslateAnimSpriteLinearAndSine(sprite))
DestroyAnimSprite(sprite);
}
@@ -41,8 +41,8 @@ void sub_80D9DF0(struct Sprite *sprite)
if (!gBattleAnimArgs[3])
StartSpriteAnim(sprite, 2);
- sub_80787B0(sprite, 1);
- sub_807A3FC(gAnimBankTarget, 1, &l1, &l2);
+ InitAnimSpritePos(sprite, 1);
+ SetAverageBattlerPositions(gAnimBankTarget, 1, &l1, &l2);
if (GetBankSide(gAnimBankAttacker))
gBattleAnimArgs[4] = -gBattleAnimArgs[4];
@@ -52,14 +52,14 @@ void sub_80D9DF0(struct Sprite *sprite)
sprite->data[4] = l2 + gBattleAnimArgs[5];
sprite->data[5] = -30;
- sub_80786EC(sprite);
+ InitAnimSpriteTranslationOverDuration(sprite);
sprite->callback = sub_80D9E78;
}
void sub_80D9E78(struct Sprite *sprite) // same as sub_80D9DD4
{
- if (sub_8078718(sprite))
+ if (TranslateAnimSpriteLinearAndSine(sprite))
DestroyAnimSprite(sprite);
}
@@ -71,7 +71,7 @@ void sub_80D9E94(struct Sprite *sprite)
sprite->data[3] = sprite->pos1.y;
sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[1];
- sub_8078A5C(sprite);
+ InitSpriteDataForLinearTranslation(sprite);
sprite->data[5] = sprite->data[1] / gBattleAnimArgs[2];
sprite->data[6] = sprite->data[2] / gBattleAnimArgs[2];
@@ -92,7 +92,7 @@ void sub_80D9EE8(struct Sprite *sprite)
void sub_80D9F14(struct Sprite *sprite)
{
- sub_807A3FC(gAnimBankTarget, TRUE, &sprite->pos1.x, &sprite->pos1.y);
+ SetAverageBattlerPositions(gAnimBankTarget, TRUE, &sprite->pos1.x, &sprite->pos1.y);
if (GetBankSide(gAnimBankAttacker))
gBattleAnimArgs[0] = -gBattleAnimArgs[0];
@@ -104,11 +104,17 @@ void sub_80D9F14(struct Sprite *sprite)
sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2];
sprite->data[4] = sprite->pos1.y + sprite->data[0];
- sprite->callback = sub_8078B34;
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
}
-void sub_80D9F88(struct Sprite *sprite)
+// Animates a bubble by rising upward, swaying side to side, and
+// enlarging the sprite. This is used as an after-effect by poison-type
+// moves, along with MOVE_BUBBLE, and MOVE_BUBBLEBEAM.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: 0 = single-target, 1 = multi-target
+void AnimBubbleEffect(struct Sprite *sprite)
{
if (!gBattleAnimArgs[2])
{
@@ -116,7 +122,7 @@ void sub_80D9F88(struct Sprite *sprite)
}
else
{
- sub_807A3FC(gAnimBankTarget, TRUE, &sprite->pos1.x, &sprite->pos1.y);
+ SetAverageBattlerPositions(gAnimBankTarget, TRUE, &sprite->pos1.x, &sprite->pos1.y);
if (GetBankSide(gAnimBankAttacker))
gBattleAnimArgs[0] = -gBattleAnimArgs[0];
@@ -125,10 +131,10 @@ void sub_80D9F88(struct Sprite *sprite)
sprite->pos1.y += gBattleAnimArgs[1];
}
- sprite->callback = sub_80D9FF0;
+ sprite->callback = AnimBubbleEffectStep;
}
-void sub_80D9FF0(struct Sprite *sprite)
+static void AnimBubbleEffectStep(struct Sprite *sprite)
{
sprite->data[0] = (sprite->data[0] + 0xB) & 0xFF;
sprite->pos2.x = Sin(sprite->data[0], 4);
diff --git a/src/battle/anim/powder.c b/src/battle/anim/powder.c
index a0be20d6f..5d67311dc 100644
--- a/src/battle/anim/powder.c
+++ b/src/battle/anim/powder.c
@@ -6,12 +6,17 @@
extern s16 gBattleAnimArgs[];
extern u8 gAnimBankAttacker;
-static void sub_80CA768(struct Sprite* sprite);
+static void AnimMovePowderParticleStep(struct Sprite* sprite);
-// powder
+// Animates the falling particles that horizontally wave back and forth.
// Used by Sleep Powder, Stun Spore, and Poison Powder.
-
-void sub_80CA710(struct Sprite* sprite)
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: total duration in frames
+// arg 3: vertical movement speed (sub-pixel value)
+// arg 4: wave amplitude
+// arg 5: wave speed
+void AnimMovePowderParticle(struct Sprite* sprite)
{
sprite->pos1.x += gBattleAnimArgs[0];
sprite->pos1.y += gBattleAnimArgs[1];
@@ -28,10 +33,10 @@ void sub_80CA710(struct Sprite* sprite)
}
sprite->data[4] = gBattleAnimArgs[5];
- sprite->callback = sub_80CA768;
+ sprite->callback = AnimMovePowderParticleStep;
}
-void sub_80CA768(struct Sprite* sprite)
+static void AnimMovePowderParticleStep(struct Sprite* sprite)
{
if (sprite->data[0] > 0)
{
diff --git a/src/battle/anim/psychic.c b/src/battle/anim/psychic.c
new file mode 100644
index 000000000..42f396870
--- /dev/null
+++ b/src/battle/anim/psychic.c
@@ -0,0 +1,900 @@
+#include "global.h"
+#include "battle.h"
+#include "battle_anim.h"
+#include "palette.h"
+#include "rom_8077ABC.h"
+#include "scanline_effect.h"
+#include "sound.h"
+#include "task.h"
+#include "trig.h"
+#include "constants/songs.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+extern u16 gBattle_BG1_X;
+extern u16 gBattle_BG2_X;
+extern u8 gBankSpriteIds[];
+
+extern const union AffineAnimCmd *const gUnknown_083DA888[];
+extern struct AffineAnimFrameCmd gUnknown_083DA8A4;
+extern struct AffineAnimFrameCmd gUnknown_083DA8C4;
+extern const struct SpriteTemplate gSpriteTemplate_83DA8DC;
+extern const struct SpriteTemplate gSpriteTemplate_83DA9AC;
+
+static void sub_80DB88C(struct Sprite *sprite);
+static void sub_80DB8C0(struct Sprite *sprite);
+static void sub_80DB92C(struct Sprite *sprite);
+static void sub_80DB9E4(struct Sprite *sprite);
+static void sub_80DBC00(struct Sprite *sprite);
+static void sub_80DBC34(struct Sprite *sprite);
+static void sub_80DBCD0(u8 taskId);
+static void sub_80DBD58(u8 taskId);
+static void sub_80DBE98(u8 taskId);
+static void sub_80DC1FC(u8 taskId);
+static void sub_80DC3F4(u8 taskId);
+void sub_80DC5F4(u8 taskId);
+
+
+void sub_80DB74C(struct Sprite *sprite)
+{
+ if (GetBankSide(gAnimBankAttacker) == SIDE_PLAYER || IsContest())
+ {
+ sprite->oam.priority = 2;
+ sprite->subpriority = 200;
+ }
+
+ if (!IsContest())
+ {
+ u8 bankCopy;
+ u8 bank = bankCopy = GetBankByIdentity(IDENTITY_OPPONENT_MON1);
+ u8 identity = GetBankIdentity_permutated(bank);
+ int var0 = 1;
+ u8 toBG_2 = (identity ^ var0) != 0;
+
+ if (IsAnimBankSpriteVisible(bank))
+ MoveBattlerSpriteToBG(bank, toBG_2);
+
+ bank = bankCopy ^ 2;
+ if (IsAnimBankSpriteVisible(bank))
+ MoveBattlerSpriteToBG(bank, toBG_2 ^ var0);
+ }
+
+ if (!IsContest() && IsDoubleBattle())
+ {
+ if (GetBankSide(gAnimBankAttacker) == SIDE_PLAYER)
+ {
+ sprite->pos1.x = 72;
+ sprite->pos1.y = 80;
+ }
+ else
+ {
+ sprite->pos1.x = 176;
+ sprite->pos1.y = 40;
+ }
+ }
+ else
+ {
+ if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER)
+ gBattleAnimArgs[0] = -gBattleAnimArgs[0];
+
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 0) + gBattleAnimArgs[0];
+ sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 1) + gBattleAnimArgs[1];
+ }
+
+ if (IsContest())
+ sprite->pos1.y += 9;
+
+ sprite->data[0] = 256 + IndexOfSpritePaletteTag(gBattleAnimArgs[2]) * 16;
+ sprite->callback = sub_80DB88C;
+ sprite->callback(sprite);
+}
+
+static void sub_80DB88C(struct Sprite *sprite)
+{
+ REG_BLDALPHA = ((16 - sprite->data[3]) << 8) | sprite->data[3];
+
+ if (sprite->data[3] == 13)
+ sprite->callback = sub_80DB8C0;
+ else
+ sprite->data[3]++;
+}
+
+static void sub_80DB8C0(struct Sprite *sprite)
+{
+ u16 color;
+ u16 startOffset;
+ int i;
+
+ if (++sprite->data[1] == 2)
+ {
+ sprite->data[1] = 0;
+ startOffset = sprite->data[0];
+ color = gPlttBufferFaded[startOffset + 8];
+
+ for (i = 8; i > 0; i--)
+ gPlttBufferFaded[startOffset + i] = gPlttBufferFaded[startOffset + i - 1];
+
+ gPlttBufferFaded[startOffset + 1] = color;
+
+ if (++sprite->data[2] == 16)
+ sprite->callback = sub_80DB92C;
+ }
+}
+
+static void sub_80DB92C(struct Sprite *sprite)
+{
+ REG_BLDALPHA = ((16 - sprite->data[3]) << 8) | sprite->data[3];
+
+ if (--sprite->data[3] == -1)
+ {
+ if (!IsContest())
+ {
+ u8 bankCopy;
+ u8 bank = bankCopy = GetBankByIdentity(IDENTITY_OPPONENT_MON1);
+
+ if (IsAnimBankSpriteVisible(bank))
+ gSprites[gBankSpriteIds[bank]].invisible = 0;
+
+ bank = bankCopy ^ 2;
+ if (IsAnimBankSpriteVisible(bank))
+ gSprites[gBankSpriteIds[bank]].invisible = 0;
+ }
+
+ sprite->invisible = 1;
+ sprite->callback = sub_80DB9E4;
+ }
+}
+
+static void sub_80DB9E4(struct Sprite *sprite)
+{
+ if (!IsContest())
+ {
+ u8 bankCopy;
+ u8 bank = bankCopy = GetBankByIdentity(IDENTITY_OPPONENT_MON1);
+ u8 identity = GetBankIdentity_permutated(bank);
+ int var0 = 1;
+ u8 toBG_2 = (identity ^ var0) != 0;
+
+ if (IsAnimBankSpriteVisible(bank))
+ sub_8076464(toBG_2);
+
+ bank = bankCopy ^ 2;
+ if (IsAnimBankSpriteVisible(bank))
+ sub_8076464(toBG_2 ^ var0);
+ }
+
+ sprite->callback = DestroyAnimSprite;
+}
+
+void sub_80DBA4C(struct Sprite *sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ int arg3 = gBattleAnimArgs[3];
+ u8 var0 = 0;
+ if (arg3 == 0)
+ var0 = 1;
+
+ if (!IsContest() && IsDoubleBattle())
+ {
+ if (GetBankSide(gAnimBankAttacker) == SIDE_PLAYER)
+ {
+ sprite->pos1.x = 72 - gBattleAnimArgs[0];
+ sprite->pos1.y = gBattleAnimArgs[1] + 80;
+ }
+ else
+ {
+ sprite->pos1.x = gBattleAnimArgs[0] + 176;
+ sprite->pos1.y = gBattleAnimArgs[1] + 40;
+ }
+ }
+ else
+ {
+ if (gBattleAnimArgs[2] == 0)
+ InitAnimSpritePos(sprite, var0);
+ else
+ sub_8078764(sprite, var0);
+ }
+
+ sprite->data[0]++;
+ }
+ else
+ {
+ if (sprite->animEnded || sprite->affineAnimEnded)
+ move_anim_8074EE0(sprite);
+ }
+}
+
+void sub_80DBAF4(struct Sprite *sprite)
+{
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2);
+ sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3);
+
+ if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER)
+ {
+ StartSpriteAnim(sprite, 1);
+ sprite->pos1.x -= 40;
+ sprite->pos1.y += 10;
+ sprite->data[1] = -1;
+ }
+ else
+ {
+ sprite->pos1.x += 40;
+ sprite->pos1.y -= 10;
+ sprite->data[1] = 1;
+ }
+
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+ sprite->callback = sub_8078600;
+}
+
+void sub_80DBB70(struct Sprite *sprite)
+{
+ s16 x = sub_807A100(gAnimBankAttacker, 1) / 2;
+ s16 y = sub_807A100(gAnimBankAttacker, 0) / -2;
+
+ if (GetBankSide(gAnimBankAttacker) == SIDE_OPPONENT)
+ {
+ x = -x;
+ }
+
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2) + x;
+ sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3) + y;
+
+ if (sprite->pos1.y < 16)
+ {
+ sprite->pos1.y = 16;
+ }
+
+ StoreSpriteCallbackInData(sprite, sub_80DBC00);
+ sprite->callback = sub_8078600;
+}
+
+static void sub_80DBC00(struct Sprite *sprite)
+{
+ sprite->oam.affineMode = 1;
+ sprite->affineAnims = gUnknown_083DA888;
+ sprite->data[0] = 0;
+ InitSpriteAffineAnim(sprite);
+ sprite->callback = sub_80DBC34;
+}
+
+static void sub_80DBC34(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ if (sprite->affineAnimEnded)
+ {
+ FreeOamMatrix(sprite->oam.matrixNum);
+ sprite->oam.affineMode = 0;
+ sprite->data[1] = 18;
+ sprite->data[0]++;
+ }
+ break;
+ case 1:
+ if (--sprite->data[1] == -1)
+ {
+ DestroyAnimSprite(sprite);
+ }
+ break;
+ }
+}
+
+void sub_80DBC94(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ u8 spriteId = GetAnimBankSpriteId(0);
+ task->data[0] = spriteId;
+ sub_80798F4(task, spriteId, &gUnknown_083DA8A4);
+ task->func = sub_80DBCD0;
+}
+
+static void sub_80DBCD0(u8 taskId)
+{
+ if (!sub_807992C(&gTasks[taskId]))
+ {
+ DestroyAnimVisualTask(taskId);
+ }
+}
+
+void sub_80DBCFC(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ u8 spriteId = GetAnimBankSpriteId(0);
+ task->data[0] = spriteId;
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->data[3] = GetBankSide(gAnimBankAttacker) != SIDE_PLAYER ? 4 : 8;
+
+ sub_80798F4(task, task->data[0], &gUnknown_083DA8C4);
+ task->func = sub_80DBD58;
+}
+
+static void sub_80DBD58(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[1])
+ {
+ case 0:
+ sub_807992C(task);
+ if (++task->data[2] > 19)
+ task->data[1]++;
+ break;
+ case 1:
+ if (task->data[3] != 0)
+ {
+ gSprites[task->data[0]].pos2.y -= 8;
+ task->data[3]--;
+ }
+ else
+ {
+ gSprites[task->data[0]].invisible = 1;
+ gSprites[task->data[0]].pos1.x = 272;
+ sub_8078F40(task->data[0]);
+ DestroyAnimVisualTask(taskId);
+ }
+ break;
+ }
+}
+
+void sub_80DBE00(u8 taskId)
+{
+ u16 var0, var1;
+
+ struct Task *task = &gTasks[taskId];
+
+ task->data[3] = 16;
+ task->data[4] = 0;
+ task->data[13] = GetBankPosition(gAnimBankAttacker, 2);
+ task->data[14] = GetBankPosition(gAnimBankAttacker, 3);
+
+ var0 = sub_807A100(gAnimBankAttacker, 1) / 3;
+ var1 = sub_807A100(gAnimBankAttacker, 0) / 3;
+ task->data[12] = var0 > var1 ? var0 : var1;
+
+ REG_BLDCNT = 0x3F40;
+ REG_BLDALPHA = 0x10;
+
+ task->func = sub_80DBE98;
+}
+
+static void sub_80DBE98(u8 taskId)
+{
+ u16 i;
+ u8 spriteId;
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ if (++task->data[1] > 8)
+ {
+ task->data[1] = 0;
+ spriteId = CreateSprite(&gSpriteTemplate_83DA8DC, task->data[13], task->data[14], 0);
+ task->data[task->data[2] + 8] = spriteId;
+
+ if (spriteId != 64)
+ {
+ switch (task->data[2])
+ {
+ case 0:
+ gSprites[spriteId].pos2.x = task->data[12];
+ gSprites[spriteId].pos2.y = -task->data[12];
+ break;
+ case 1:
+ gSprites[spriteId].pos2.x = -task->data[12];
+ gSprites[spriteId].pos2.y = task->data[12];
+ break;
+ case 2:
+ gSprites[spriteId].pos2.x = task->data[12];
+ gSprites[spriteId].pos2.y = task->data[12];
+ break;
+ case 3:
+ gSprites[spriteId].pos2.x = -task->data[12];
+ gSprites[spriteId].pos2.y = -task->data[12];
+ break;
+ }
+ }
+
+ if (++task->data[2] == 5)
+ task->data[0]++;
+ }
+ break;
+ case 1:
+ if (task->data[1] & 1)
+ task->data[3]--;
+ else
+ task->data[4]++;
+
+ REG_BLDALPHA = (task->data[4] << 8) | task->data[3];
+
+ if (++task->data[1] == 32)
+ {
+ for (i = 8; i < 13; i++)
+ {
+ if (task->data[i] != 64)
+ DestroySprite(&gSprites[task->data[i]]);
+ }
+
+ task->data[0]++;
+ }
+ break;
+ case 2:
+ task->data[0]++;
+ break;
+ case 3:
+ REG_BLDALPHA = 0;
+ REG_BLDCNT = 0;
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+static void sub_80DC020(struct Sprite *sprite)
+{
+ if (sprite->data[1] > sprite->data[0] - 10)
+ sprite->invisible = sprite->data[1] & 1;
+
+ if (sprite->data[1] == sprite->data[0])
+ DestroyAnimSprite(sprite);
+
+ sprite->data[1]++;
+}
+
+void sub_80DC068(struct Sprite *sprite)
+{
+ if (gBattleAnimArgs[0] == 0)
+ {
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2);
+ sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3);
+ }
+
+ sprite->data[0] = gBattleAnimArgs[1];
+ sprite->callback = sub_80DC020;
+}
+
+void sub_80DC0B0(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ if (IsContest())
+ {
+ if (gBattleAnimArgs[0] == 1)
+ {
+ task->data[10] = -10;
+ task->data[11] = sub_807A100(gAnimBankTarget, 5) - 8;
+ task->data[12] = sub_807A100(gAnimBankTarget, 2) + 8;
+ task->data[13] = sub_807A100(gAnimBankAttacker, 5) - 8;
+ task->data[14] = sub_807A100(gAnimBankAttacker, 2) + 8;
+ }
+ else
+ {
+ task->data[10] = 10;
+ task->data[11] = sub_807A100(gAnimBankAttacker, 4) + 8;
+ task->data[12] = sub_807A100(gAnimBankAttacker, 3) - 8;
+ task->data[13] = sub_807A100(gAnimBankTarget, 4) + 8;
+ task->data[14] = sub_807A100(gAnimBankTarget, 3) - 8;
+ }
+ }
+ else
+ {
+ if (gBattleAnimArgs[0] == 1)
+ {
+ task->data[10] = -10;
+ task->data[11] = sub_807A100(gAnimBankTarget, 4) + 8;
+ task->data[12] = sub_807A100(gAnimBankTarget, 2) + 8;
+ task->data[13] = sub_807A100(gAnimBankAttacker, 4) + 8;
+ task->data[14] = sub_807A100(gAnimBankAttacker, 2) + 8;
+ }
+ else
+ {
+ task->data[10] = 10;
+ task->data[11] = sub_807A100(gAnimBankAttacker, 5) - 8;
+ task->data[12] = sub_807A100(gAnimBankAttacker, 3) - 8;
+ task->data[13] = sub_807A100(gAnimBankTarget, 5) - 8;
+ task->data[14] = sub_807A100(gAnimBankTarget, 3) - 8;
+ }
+ }
+
+ task->data[1] = 6;
+ task->func = sub_80DC1FC;
+}
+
+static void sub_80DC1FC(u8 taskId)
+{
+ u8 spriteId;
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ if (++task->data[1] > 6)
+ {
+ task->data[1] = 0;
+ spriteId = CreateSprite(&gSpriteTemplate_83DA9AC, task->data[11], task->data[12], 0);
+ if (spriteId != 64)
+ {
+ gSprites[spriteId].data[0] = 16;
+ gSprites[spriteId].data[2] = task->data[13];
+ gSprites[spriteId].data[4] = task->data[14];
+ gSprites[spriteId].data[5] = task->data[10];
+
+ InitAnimSpriteTranslationOverDuration(&gSprites[spriteId]);
+ StartSpriteAffineAnim(&gSprites[spriteId], task->data[2] & 3);
+ }
+
+ if (++task->data[2] == 12)
+ task->data[0]++;
+ }
+ break;
+ case 1:
+ if (++task->data[1] > 17)
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+void sub_80DC2B0(struct Sprite *sprite)
+{
+ if (TranslateAnimSpriteLinearAndSine(sprite))
+ {
+ FreeOamMatrix(sprite->oam.matrixNum);
+ DestroySprite(sprite);
+ }
+}
+
+void sub_80DC2D4(u8 taskId)
+{
+ s16 i;
+ u8 var1;
+ struct ScanlineEffectParams scanlineParams;
+ struct Task *task = &gTasks[taskId];
+
+ var1 = sub_8077FC0(gAnimBankTarget);
+ task->data[14] = var1 - 32;
+
+ switch (gBattleAnimArgs[0])
+ {
+ case 0:
+ task->data[11] = 2;
+ task->data[12] = 5;
+ task->data[13] = 64;
+ task->data[15] = var1 + 32;
+ break;
+ case 1:
+ task->data[11] = 2;
+ task->data[12] = 5;
+ task->data[13] = 192;
+ task->data[15] = var1 + 32;
+ break;
+ case 2:
+ task->data[11] = 4;
+ task->data[12] = 4;
+ task->data[13] = 0;
+ task->data[15] = var1 + 32;
+ break;
+ }
+
+ if (task->data[14] < 0)
+ task->data[14] = 0;
+
+ if (GetBankIdentity_permutated(gAnimBankTarget) == 1)
+ {
+ task->data[10] = gBattle_BG1_X;
+ scanlineParams.dmaDest = &REG_BG1HOFS;
+ }
+ else
+ {
+ task->data[10] = gBattle_BG2_X;
+ scanlineParams.dmaDest = &REG_BG2HOFS;
+ }
+
+ i = task->data[14];
+ while (i <= task->data[14] + 64)
+ {
+ gScanlineEffectRegBuffers[0][i] = task->data[10];
+ gScanlineEffectRegBuffers[1][i] = task->data[10];
+ i++;
+ }
+
+ scanlineParams.dmaControl = 0XA2600001;
+ scanlineParams.initState = 1;
+ scanlineParams.unused9 = 0;
+ ScanlineEffect_SetParams(scanlineParams);
+
+ task->func = sub_80DC3F4;
+}
+
+static void sub_80DC3F4(u8 taskId)
+{
+ s16 sineIndex, i;
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ sineIndex = task->data[13];
+ i = task->data[14];
+ while (i <= task->data[15])
+ {
+ s16 var2 = (gSineTable[sineIndex] >> task->data[12]);
+ if (var2 > 0)
+ {
+ var2 += (task->data[1] & 3);
+ }
+ else if (var2 < 0)
+ {
+ var2 -= (task->data[1] & 3);
+ }
+
+ gScanlineEffectRegBuffers[0][i] = task->data[10] + var2;
+ gScanlineEffectRegBuffers[1][i] = task->data[10] + var2;
+
+ sineIndex += task->data[11];
+ i++;
+ }
+
+ if (++task->data[1] > 23)
+ {
+ task->data[0]++;
+ }
+ break;
+ case 1:
+ gScanlineEffect.state = 3;
+ task->data[0]++;
+ break;
+ case 2:
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+#ifdef NONMATCHING
+void sub_80DC4F4(u8 taskId)
+{
+ s16 spriteId;
+ u8 matrixNum;
+ register u8 matrixNum2 asm("r6");
+ struct Task *task = &gTasks[taskId];
+
+ matrixNum = AllocOamMatrix();
+ matrixNum2 = matrixNum;
+ if (matrixNum2 == 0xFF)
+ {
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+
+ spriteId = duplicate_obj_of_side_rel2move_in_transparent_mode(gBattleAnimArgs[0]);
+ if (spriteId < 0)
+ {
+ FreeOamMatrix(matrixNum);
+ DestroyAnimVisualTask(taskId);
+ return;
+ }
+
+ gSprites[spriteId].callback = SpriteCallbackDummy;
+ gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE;
+ gSprites[spriteId].oam.matrixNum = matrixNum2;
+ gSprites[spriteId].affineAnimPaused = 1;
+ gSprites[spriteId].subpriority++;
+ obj_id_set_rotscale(spriteId, 256, 256, 0);
+ CalcCenterToCornerVec(&gSprites[spriteId], gSprites[spriteId].oam.shape, gSprites[spriteId].oam.size, gSprites[spriteId].oam.affineMode);
+
+ task->data[13] = GetAnimBankSpriteId(gBattleAnimArgs[0]);
+ task->data[14] = matrixNum;
+ task->data[15] = spriteId;
+ task->func = sub_80DC5F4;
+}
+#else
+__attribute__((naked))
+void sub_80DC4F4(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\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ mov r8, r4\n\
+ lsls r0, r4, 2\n\
+ adds r0, r4\n\
+ lsls r0, 3\n\
+ ldr r1, _080DC528 @ =gTasks\n\
+ adds r7, r0, r1\n\
+ bl AllocOamMatrix\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ mov r10, r5\n\
+ adds r6, r5, 0\n\
+ cmp r6, 0xFF\n\
+ bne _080DC52C\n\
+ adds r0, r4, 0\n\
+ bl DestroyAnimVisualTask\n\
+ b _080DC5D6\n\
+ .align 2, 0\n\
+_080DC528: .4byte gTasks\n\
+_080DC52C:\n\
+ ldr r1, _080DC550 @ =gBattleAnimArgs\n\
+ ldrb r0, [r1]\n\
+ bl duplicate_obj_of_side_rel2move_in_transparent_mode\n\
+ lsls r0, 16\n\
+ lsrs r1, r0, 16\n\
+ mov r9, r1\n\
+ asrs r0, 16\n\
+ cmp r0, 0\n\
+ bge _080DC554\n\
+ adds r0, r5, 0\n\
+ bl FreeOamMatrix\n\
+ mov r0, r8\n\
+ bl DestroyAnimVisualTask\n\
+ b _080DC5D6\n\
+ .align 2, 0\n\
+_080DC550: .4byte gBattleAnimArgs\n\
+_080DC554:\n\
+ ldr r2, _080DC5E4 @ =gSprites\n\
+ lsls r4, r0, 4\n\
+ adds r4, r0\n\
+ lsls r4, 2\n\
+ adds r0, r2, 0\n\
+ adds r0, 0x1C\n\
+ adds r0, r4, r0\n\
+ ldr r1, _080DC5E8 @ =SpriteCallbackDummy\n\
+ str r1, [r0]\n\
+ adds r4, r2\n\
+ ldrb r0, [r4, 0x1]\n\
+ movs r1, 0x3\n\
+ orrs r0, r1\n\
+ strb r0, [r4, 0x1]\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\
+ 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\
+ adds r1, r4, 0\n\
+ adds r1, 0x43\n\
+ ldrb r0, [r1]\n\
+ adds r0, 0x1\n\
+ strb r0, [r1]\n\
+ mov r1, r9\n\
+ lsls r0, r1, 24\n\
+ lsrs r0, 24\n\
+ movs r2, 0x80\n\
+ lsls r2, 1\n\
+ adds r1, r2, 0\n\
+ movs r3, 0\n\
+ bl obj_id_set_rotscale\n\
+ ldrb 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\
+ ldr r1, _080DC5EC @ =gBattleAnimArgs\n\
+ ldrb r0, [r1]\n\
+ bl GetAnimBankSpriteId\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ strh r0, [r7, 0x22]\n\
+ mov r0, r10\n\
+ strh r0, [r7, 0x24]\n\
+ mov r1, r9\n\
+ strh r1, [r7, 0x26]\n\
+ ldr r0, _080DC5F0 @ =sub_80DC5F4\n\
+ str r0, [r7]\n\
+_080DC5D6:\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\
+_080DC5E4: .4byte gSprites\n\
+_080DC5E8: .4byte SpriteCallbackDummy\n\
+_080DC5EC: .4byte gBattleAnimArgs\n\
+_080DC5F0: .4byte sub_80DC5F4\n\
+ .syntax divided\n");
+}
+#endif // NONMATCHING
+
+void sub_80DC5F4(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ task->data[1] += 4;
+ task->data[2] = 256 - (gSineTable[task->data[1]] >> 1);
+ obj_id_set_rotscale(task->data[15], task->data[2], task->data[2], 0);
+ sub_8079AB8(task->data[15], task->data[13]);
+ if (task->data[1] == 48)
+ task->data[0]++;
+ break;
+ case 1:
+ task->data[1] -= 4;
+ task->data[2] = 256 - (gSineTable[task->data[1]] >> 1);;
+ obj_id_set_rotscale(task->data[15], task->data[2], task->data[2], 0);
+ sub_8079AB8(task->data[15], task->data[13]);
+ if (task->data[1] == 0)
+ task->data[0]++;
+ break;
+ case 2:
+ obj_delete_but_dont_free_vram(&gSprites[task->data[15]]);
+ task->data[0]++;
+ break;
+ case 3:
+ FreeOamMatrix(task->data[14]);
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+void sub_80DC700(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 0);
+ sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 1);
+
+ if (IsContest())
+ sprite->pos1.y += 12;
+
+ sprite->data[1] = 8;
+ REG_BLDCNT = 0x3F40;
+ REG_BLDALPHA = ((16 - sprite->data[1]) << 8) | sprite->data[1];
+ sprite->data[0]++;
+ break;
+ case 1:
+ if (sprite->affineAnimEnded)
+ {
+ PlaySE12WithPanning(SE_W100, BattleAnimAdjustPanning(-64));
+ ChangeSpriteAffineAnim(sprite, 1);
+ sprite->data[0]++;
+ }
+ break;
+ case 2:
+ if (sprite->data[2]++ > 1)
+ {
+ sprite->data[2] = 0;
+ sprite->data[1]--;
+ REG_BLDALPHA = ((16 - sprite->data[1]) << 8) | sprite->data[1];
+
+ if (sprite->data[1] == 0)
+ {
+ sprite->data[0]++;
+ sprite->invisible = 1;
+ }
+ }
+
+ sprite->data[3] += 896;
+ sprite->pos2.y -= sprite->data[3] >> 8;
+ sprite->data[3] &= 0xFF;
+ break;
+ case 3:
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ DestroyAnimSprite(sprite);
+ break;
+ }
+}
diff --git a/src/battle/anim/ring.c b/src/battle/anim/ring.c
index 915cadcbc..86b2c4659 100644
--- a/src/battle/anim/ring.c
+++ b/src/battle/anim/ring.c
@@ -10,7 +10,7 @@ extern s16 gBattleAnimArgs[];
extern u8 gAnimBankAttacker;
extern u8 gAnimBankTarget;
-extern u8 gObjectBankIDs[];
+extern u8 gBankSpriteIds[];
static void sub_80D1098(struct Sprite* sprite);
@@ -32,7 +32,7 @@ void sub_80D0FD8(struct Sprite* sprite)
r4 = gBattleAnimArgs[3] ^ 1;
if (IsDoubleBattle() && IsAnimBankSpriteVisible(bank ^ 2))
{
- sub_807A3FC(bank, r4, &sp0, &sp1);
+ SetAverageBattlerPositions(bank, r4, &sp0, &sp1);
if (r4 == 0)
r4 = GetBankPosition(bank, 0);
else
@@ -50,7 +50,7 @@ void sub_80D0FD8(struct Sprite* sprite)
void sub_80D1098(struct Sprite* sprite)
{
- if (sub_8078B5C(sprite))
+ if (TranslateAnimSpriteByDeltas(sprite))
{
FreeSpriteOamMatrix(sprite);
DestroyAnimSprite(sprite);
@@ -94,23 +94,23 @@ void sub_80D10B8(struct Sprite* sprite)
{
r9 = GetBankPosition(bankr7, r10) + gBattleAnimArgs[0];
if (IsAnimBankSpriteVisible(bankr8 ^ 2))
- sprite->subpriority = gSprites[gObjectBankIDs[bankr8 ^ 2]].subpriority - 1;
+ sprite->subpriority = gSprites[gBankSpriteIds[bankr8 ^ 2]].subpriority - 1;
else
- sprite->subpriority = gSprites[gObjectBankIDs[bankr8]].subpriority - 1;
+ sprite->subpriority = gSprites[gBankSpriteIds[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;
+ if (gSprites[gBankSpriteIds[bankr7]].pos1.x < gSprites[gBankSpriteIds[bankr7 ^ 2]].pos1.x)
+ sprite->subpriority = gSprites[gBankSpriteIds[bankr7 ^ 2]].subpriority + 1;
else
- sprite->subpriority = gSprites[gObjectBankIDs[bankr7]].subpriority - 1;
+ sprite->subpriority = gSprites[gBankSpriteIds[bankr7]].subpriority - 1;
}
else
{
- sprite->subpriority = gSprites[gObjectBankIDs[bankr7]].subpriority - 1;
+ sprite->subpriority = gSprites[gBankSpriteIds[bankr7]].subpriority - 1;
}
}
@@ -118,7 +118,7 @@ void sub_80D10B8(struct Sprite* sprite)
r6 = GetBankPosition(bankr7, sp4) + gBattleAnimArgs[1];
if (gMain.inBattle && IsAnimBankSpriteVisible(bankr8 ^ 2))
{
- sub_807A3FC(bankr8, gBattleAnimArgs[6], &sp0, &sp1);
+ SetAverageBattlerPositions(bankr8, gBattleAnimArgs[6], &sp0, &sp1);
}
else
{
@@ -137,7 +137,7 @@ void sub_80D10B8(struct Sprite* sprite)
sprite->data[2] = sp0;
sprite->data[4] = sp1;
sprite->data[0] = gBattleAnimArgs[0];
- obj_translate_based_on_private_1_2_3_4(sprite);
+ InitAnimSpriteTranslationDeltas(sprite);
sprite->callback = sub_80D1098;
sub_80D1098(sprite);
}
diff --git a/src/battle/anim/rock.c b/src/battle/anim/rock.c
new file mode 100644
index 000000000..6fbe065b8
--- /dev/null
+++ b/src/battle/anim/rock.c
@@ -0,0 +1,602 @@
+#include "global.h"
+#include "battle.h"
+#include "battle_anim.h"
+#include "decompress.h"
+#include "palette.h"
+#include "rom_8077ABC.h"
+#include "sound.h"
+#include "task.h"
+#include "trig.h"
+#include "constants/songs.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+extern u32 gAnimMoveDmg;
+extern u16 gBattle_BG1_X;
+extern u16 gBattle_BG1_Y;
+extern u16 gBattle_BG3_Y;
+
+extern const u8 gBattleAnimBackgroundTilemap_SandstormBrew[];
+extern const u8 gBattleAnimBackgroundImage_SandstormBrew[];
+extern const u16 gBattleAnimSpritePalette_261[];
+extern const struct SpriteTemplate gSpriteTemplate_83DAD78;
+extern const struct SpriteTemplate gSpriteTemplate_83DAD90;
+
+extern const struct SubspriteTable gUnknown_083DAD10;
+
+static void sub_80DCF1C(struct Sprite *sprite);
+static void sub_80DD02C(struct Sprite *sprite);
+static void sub_80DD190(u8 taskId);
+static void sub_80DD604(u8 taskId);
+static void sub_80DD774(struct Task *task);
+static u8 sub_80DD8BC(void);
+static void sub_80DD928(struct Sprite *sprite);
+static void sub_80DD9FC(struct Sprite *sprite);
+
+
+void sub_80DCE9C(struct Sprite *sprite)
+{
+ if (gBattleAnimArgs[3] != 0)
+ SetAverageBattlerPositions(gAnimBankTarget, 0, &sprite->pos1.x, &sprite->pos1.y);
+
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += 14;
+
+ StartSpriteAnim(sprite, gBattleAnimArgs[1]);
+ AnimateSprite(sprite);
+
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ sprite->data[2] = 4;
+ sprite->data[3] = 16;
+ sprite->data[4] = -70;
+ sprite->data[5] = gBattleAnimArgs[2];
+
+ StoreSpriteCallbackInData(sprite, sub_80DCF1C);
+ sprite->callback = sub_8078278;
+ sprite->callback(sprite);
+}
+
+static void sub_80DCF1C(struct Sprite *sprite)
+{
+ sprite->pos1.x += sprite->data[5];
+
+ sprite->data[0] = 192;
+ sprite->data[1] = sprite->data[5];
+ sprite->data[2] = 4;
+ sprite->data[3] = 32;
+ sprite->data[4] = -24;
+
+ StoreSpriteCallbackInData(sprite, move_anim_8074EE0);
+ sprite->callback = sub_8078278;
+ sprite->callback(sprite);
+}
+
+void sub_80DCF60(struct Sprite *sprite)
+{
+ StartSpriteAnim(sprite, gBattleAnimArgs[5]);
+ AnimateSprite(sprite);
+
+ if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER)
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ else
+ sprite->pos1.x += gBattleAnimArgs[0];
+
+ sprite->pos1.y += gBattleAnimArgs[1];
+
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2];
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[3];
+
+ InitSpriteDataForLinearTranslation(sprite);
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+
+ sprite->callback = sub_8078394;
+ StoreSpriteCallbackInData(sprite, move_anim_8074EE0);
+}
+
+void sub_80DCFE4(struct Sprite *sprite)
+{
+ if (gBattleAnimArgs[6] == 0)
+ InitAnimSpritePos(sprite, 0);
+ else
+ sub_8078764(sprite, 0);
+
+ sprite->data[0] = gBattleAnimArgs[3];
+ sprite->data[1] = gBattleAnimArgs[2];
+ sprite->data[2] = gBattleAnimArgs[4];
+ sprite->data[3] = gBattleAnimArgs[5];
+
+ sprite->callback = sub_80DD02C;
+}
+
+static void sub_80DD02C(struct Sprite *sprite)
+{
+ sprite->data[4] += sprite->data[1];
+ sprite->pos2.y = -(sprite->data[4] >> 8);
+ sprite->pos2.x = Sin(sprite->data[5], sprite->data[3]);
+ sprite->data[5] = (sprite->data[5] + sprite->data[2]) & 0xFF;
+
+ if (--sprite->data[0] == -1)
+ {
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void do_boulder_dust(u8 taskId)
+{
+ struct Struct_sub_8078914 subStruct;
+ int var0 = 0;
+
+ 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);
+ DmaFill32Defvars(3, 0, subStruct.field_4, 0x1000);
+ LZDecompressVram(&gBattleAnimBackgroundTilemap_SandstormBrew, subStruct.field_4);
+ LZDecompressVram(&gBattleAnimBackgroundImage_SandstormBrew, subStruct.field_0);
+ LoadCompressedPalette(&gBattleAnimSpritePalette_261, subStruct.field_8 << 4, 32);
+
+ if (IsContest())
+ sub_80763FC(subStruct.field_8, (u16 *)subStruct.field_4, 0, 0);
+
+ if (gBattleAnimArgs[0] != 0 && GetBankSide(gAnimBankAttacker) != SIDE_PLAYER)
+ var0 = 1;
+
+ gTasks[taskId].data[0] = var0;
+ gTasks[taskId].func = sub_80DD190;
+}
+
+static void sub_80DD190(u8 taskId)
+{
+ struct Struct_sub_8078914 subStruct;
+
+ if (gTasks[taskId].data[0] == 0)
+ gBattle_BG1_X += 0xFFFA;
+ else
+ gBattle_BG1_X += 6;
+
+ gBattle_BG1_Y += -1;
+
+ 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] == 7)
+ {
+ gTasks[taskId].data[12]++;
+ gTasks[taskId].data[11] = 0;
+ }
+ }
+ break;
+ case 1:
+ if (++gTasks[taskId].data[11] == 101)
+ {
+ gTasks[taskId].data[11] = 7;
+ 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);
+ DmaFill32Large(3, 0, subStruct.field_0, 0x2000, 0x1000);
+ DmaClear32(3, subStruct.field_4, 0x800);
+ if (!IsContest())
+ REG_BG1CNT_BITFIELD.charBaseBlock = 0;
+
+ gTasks[taskId].data[12]++;
+ // fall through
+ case 4:
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ REG_BG1CNT_BITFIELD.priority = 1;
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+void sub_80DD3AC(struct Sprite *sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ if (gBattleAnimArgs[3] != 0 && GetBankSide(gAnimBankAttacker) != SIDE_PLAYER)
+ {
+ sprite->pos1.x = 304;
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ sprite->data[5] = 1;
+ sprite->oam.matrixNum = 8;
+ }
+ else
+ {
+ sprite->pos1.x = -64;
+ }
+
+ sprite->pos1.y = gBattleAnimArgs[0];
+ SetSubspriteTables(sprite, &gUnknown_083DAD10);
+ sprite->data[1] = gBattleAnimArgs[1];
+ sprite->data[2] = gBattleAnimArgs[2];
+ sprite->data[0]++;
+ }
+ else
+ {
+ 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);
+ sprite->data[3] &= 0xFF;
+ sprite->data[4] &= 0xFF;
+
+ if (sprite->data[5] == 0)
+ {
+ if (sprite->pos1.x + sprite->pos2.x > 272)
+ {
+ sprite->callback = DestroyAnimSprite;
+ }
+ }
+ else if (sprite->pos1.x + sprite->pos2.x < -32)
+ {
+ sprite->callback = DestroyAnimSprite;
+ }
+ }
+}
+
+void sub_80DD490(struct Sprite *sprite)
+{
+ StartSpriteAnim(sprite, gBattleAnimArgs[4]);
+ InitAnimSpritePos(sprite, 0);
+
+ sprite->data[0] = gBattleAnimArgs[3];
+ sprite->data[2] = sprite->pos1.x;
+ sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[2];
+
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+}
+
+void sub_80DD4D4(u8 taskId)
+{
+ u16 var0, var1, var2, var3;
+ u8 var4;
+ int var5;
+ s16 pan1, pan2;
+ struct Task *task;
+
+ task = &gTasks[taskId];
+
+ var0 = GetBankPosition(gAnimBankAttacker, 2);
+ var1 = GetBankPosition(gAnimBankAttacker, 1) + 24;
+ var2 = GetBankPosition(gAnimBankTarget, 2);
+ var3 = GetBankPosition(gAnimBankTarget, 1) + 24;
+
+ if ((gAnimBankAttacker ^ 2) == gAnimBankTarget)
+ var3 = var1;
+
+ var4 = sub_80DD8BC();
+ if (var4 == 1)
+ task->data[8] = 32;
+ else
+ task->data[8] = 48 - (var4 * 8);
+
+ task->data[0] = 0;
+ task->data[11] = 0;
+ task->data[9] = 0;
+ task->data[12] = 1;
+
+ var5 = task->data[8];
+ if (var5 < 0)
+ var5 += 7;
+
+ task->data[10] = (var5 >> 3) - 1;
+
+ task->data[2] = var0 * 8;
+ task->data[3] = var1 * 8;
+ task->data[4] = ((var2 - var0) * 8) / task->data[8];
+ task->data[5] = ((var3 - var1) * 8) / task->data[8];
+ task->data[6] = 0;
+ task->data[7] = 0;
+
+ pan1 = BattleAnimAdjustPanning(-64);
+ pan2 = BattleAnimAdjustPanning(63);
+
+ task->data[13] = pan1;
+ task->data[14] = (pan2 - pan1) / task->data[8];
+ task->data[1] = var4;
+ task->data[15] = GetAnimBankSpriteId(0);
+
+ task->func = sub_80DD604;
+}
+
+static void sub_80DD604(u8 taskId)
+{
+ struct Task *task;
+
+ task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ task->data[6] -= task->data[4];
+ task->data[7] -= task->data[5];
+ gSprites[task->data[15]].pos2.x = task->data[6] >> 3;
+ gSprites[task->data[15]].pos2.y = task->data[7] >> 3;
+
+ if (++task->data[9] == 10)
+ {
+ task->data[11] = 20;
+ task->data[0]++;
+ }
+
+ PlaySE12WithPanning(SE_W029, task->data[13]);
+ break;
+ case 1:
+ if (--task->data[11] == 0)
+ task->data[0]++;
+ break;
+ case 2:
+ if (--task->data[9] != 0)
+ {
+ task->data[6] += task->data[4];
+ task->data[7] += task->data[5];
+ }
+ else
+ {
+ task->data[6] = 0;
+ task->data[7] = 0;
+ task->data[0]++;
+ }
+
+ gSprites[task->data[15]].pos2.x = task->data[6] >> 3;
+ gSprites[task->data[15]].pos2.y = task->data[7] >> 3;
+ break;
+ case 3:
+ task->data[2] += task->data[4];
+ task->data[3] += task->data[5];
+ if (++task->data[9] >= task->data[10])
+ {
+ task->data[9] = 0;
+ sub_80DD774(task);
+ task->data[13] += task->data[14];
+ PlaySE12WithPanning(SE_W091, task->data[13]);
+ }
+
+ if (--task->data[8] == 0)
+ {
+ task->data[0]++;
+ }
+ break;
+ case 4:
+ if (task->data[11] == 0)
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+static void sub_80DD774(struct Task *task)
+{
+ const struct SpriteTemplate *spriteTemplate;
+ int var0;
+ u16 x, y;
+ u8 spriteId;
+
+ switch (task->data[1])
+ {
+ case 1:
+ spriteTemplate = &gSpriteTemplate_83DAD78;
+ var0 = 0;
+ break;
+ case 2:
+ case 3:
+ spriteTemplate = &gSpriteTemplate_83DAD90;
+ var0 = 80;
+ break;
+ case 4:
+ spriteTemplate = &gSpriteTemplate_83DAD90;
+ var0 = 64;
+ break;
+ case 5:
+ spriteTemplate = &gSpriteTemplate_83DAD90;
+ var0 = 48;
+ break;
+ default:
+ return;
+ }
+
+ x = task->data[2] >> 3;
+ y = task->data[3] >> 3;
+ x += (task->data[12] * 4);
+
+ spriteId = CreateSprite(spriteTemplate, x, y, 35);
+ if (spriteId != 64)
+ {
+ gSprites[spriteId].data[0] = 18;
+ gSprites[spriteId].data[2] = ((task->data[12] * 20) + x) + (task->data[1] * 3);
+ gSprites[spriteId].data[4] = y;
+ gSprites[spriteId].data[5] = -16 - (task->data[1] * 2);
+ gSprites[spriteId].oam.tileNum += var0;
+
+ InitAnimSpriteTranslationOverDuration(&gSprites[spriteId]);
+ task->data[11]++;
+ }
+
+ task->data[12] *= -1;
+}
+
+void sub_80DD87C(struct Sprite *sprite)
+{
+ if (TranslateAnimSpriteLinearAndSine(sprite))
+ {
+ u8 taskId = FindTaskIdByFunc(sub_80DD604);
+ if (taskId != 0xFF)
+ gTasks[taskId].data[11]--;
+
+ DestroySprite(sprite);
+ }
+}
+
+u8 sub_80DD8BC(void)
+{
+ u8 retVal = gAnimDisableStructPtr->rolloutTimer2 - gAnimDisableStructPtr->rolloutTimer1;
+ u8 var0 = retVal - 1;
+ if (var0 > 4)
+ {
+ retVal = 1;
+ }
+
+ return retVal;
+}
+
+void sub_80DD8E8(struct Sprite *sprite)
+{
+ StartSpriteAnim(sprite, gBattleAnimArgs[4]);
+
+ sprite->pos2.x = gBattleAnimArgs[0];
+ sprite->data[2] = gBattleAnimArgs[1];
+ sprite->data[3] -= gBattleAnimArgs[2];
+ sprite->data[0] = 3;
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->callback = sub_80DD928;
+ sprite->invisible = 1;
+}
+
+static void sub_80DD928(struct Sprite *sprite)
+{
+ sprite->invisible = 0;
+ if (sprite->data[3] != 0)
+ {
+ sprite->pos2.y = sprite->data[2] + sprite->data[3];
+ sprite->data[3] += sprite->data[0];
+ sprite->data[0]++;
+ if (sprite->data[3] > 0)
+ {
+ sprite->data[3] = 0;
+ }
+ }
+ else
+ {
+ if (--sprite->data[1] == 0)
+ {
+ DestroyAnimSprite(sprite);
+ }
+ }
+}
+
+void sub_80DD978(struct Sprite *sprite)
+{
+ if (GetBankSide(gAnimBankAttacker) == SIDE_OPPONENT)
+ StartSpriteAffineAnim(sprite, 1);
+
+ TranslateAnimSpriteToTargetMonLocation(sprite);
+}
+
+void sub_80DD9A4(struct Sprite *sprite)
+{
+ sprite->pos1.x = GetBankPosition(gAnimBankTarget, 0);
+ sprite->pos1.y = GetBankPosition(gAnimBankTarget, 1);
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+
+ sprite->data[1] = gBattleAnimArgs[0];
+ sprite->data[2] = gBattleAnimArgs[1];
+ sprite->data[5] = gBattleAnimArgs[2];
+
+ StartSpriteAnim(sprite, gBattleAnimArgs[3]);
+ sprite->callback = sub_80DD9FC;
+}
+
+static void sub_80DD9FC(struct Sprite *sprite)
+{
+ sprite->data[0] += 8;
+ sprite->data[3] += sprite->data[1];
+ sprite->data[4] += sprite->data[2];
+
+ sprite->pos2.x += sprite->data[3] / 40;
+ sprite->pos2.y -= Sin(sprite->data[0], sprite->data[5]);
+
+ if (sprite->data[0] > 140)
+ DestroyAnimSprite(sprite);
+}
+
+void sub_80DDA4C(u8 taskId)
+{
+ if ((s32)gAnimMoveDmg < 33)
+ gBattleAnimArgs[7] = 0;
+ if (gAnimMoveDmg - 33 < 33)
+ gBattleAnimArgs[7] = 1;
+ if ((s32)gAnimMoveDmg > 65)
+ gBattleAnimArgs[7] = 2;
+
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_80DDA8C(u8 taskId)
+{
+ if (gTasks[taskId].data[0] == 0)
+ {
+ sub_80789D4(0);
+ gTasks[taskId].data[1] = 200;
+ }
+
+ gBattle_BG3_Y += gTasks[taskId].data[1] / 10;
+ gTasks[taskId].data[1] -= 3;
+
+ if (gTasks[taskId].data[0] == 120)
+ {
+ sub_80789D4(1);
+ DestroyAnimVisualTask(taskId);
+ }
+
+ gTasks[taskId].data[0]++;
+}
+
+void sub_80DDAF0(u8 taskId)
+{
+ if (gTasks[taskId].data[0] == 0)
+ {
+ sub_80789D4(0);
+ gTasks[taskId].data[0]++;
+ gTasks[taskId].data[2] = gBattle_BG3_Y;
+ }
+
+ gTasks[taskId].data[1] += 80;
+ gTasks[taskId].data[1] &= 0xFF;
+ gBattle_BG3_Y = gTasks[taskId].data[2] + Cos(4, gTasks[taskId].data[1]);
+
+ if (gBattleAnimArgs[7] == 0xFFF)
+ {
+ gBattle_BG3_Y = 0;
+ sub_80789D4(1);
+ DestroyAnimVisualTask(taskId);
+ }
+}
diff --git a/src/battle/anim/scan.c b/src/battle/anim/scan.c
index 22bb26973..403894cc8 100644
--- a/src/battle/anim/scan.c
+++ b/src/battle/anim/scan.c
@@ -26,7 +26,7 @@ void sub_80CD3E0(struct Sprite* sprite)
sprite->pos1.x -= 32;
sprite->pos1.y -= 32;
sprite->data[0] = 20;
- sprite->callback = sub_80782D8;
+ sprite->callback = WaitAnimForDuration;
StoreSpriteCallbackInData(sprite, sub_80CD408);
}
@@ -36,7 +36,7 @@ void sub_80CD408(struct Sprite* sprite)
{
case 0:
sprite->data[0] = 1;
- sprite->callback = sub_80782D8;
+ sprite->callback = WaitAnimForDuration;
StoreSpriteCallbackInData(sprite, sub_80CD408);
break;
case 1:
@@ -47,7 +47,7 @@ void sub_80CD408(struct Sprite* sprite)
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;
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
StoreSpriteCallbackInData(sprite, sub_80CD4B8);
sprite->data[5] += 0x100;
PlaySE12WithPanning(0xD2, BattleAnimAdjustPanning(0x3F));
@@ -62,7 +62,7 @@ void sub_80CD4B8(struct Sprite* sprite)
if ((sprite->data[5] >> 8) == 4)
{
sprite->data[0] = 10;
- sprite->callback = sub_80782D8;
+ sprite->callback = WaitAnimForDuration;
StoreSpriteCallbackInData(sprite, sub_80CD4EC);
}
else
@@ -80,7 +80,7 @@ void sub_80CD4EC(struct Sprite* sprite)
sprite->data[0] = 3;
sprite->data[1] = 0;
sprite->data[2] = 0;
- sprite->callback = sub_80782D8;
+ sprite->callback = WaitAnimForDuration;
StoreSpriteCallbackInData(sprite, sub_80CD5A8);
}
else
@@ -112,7 +112,7 @@ void sub_80CD4EC(struct Sprite* sprite)
sprite->data[0] = 6;
sprite->data[2] = GetBankPosition(gAnimBankTarget, 2) + a;
sprite->data[4] = GetBankPosition(gAnimBankTarget, 3) + b;
- sprite->callback = sub_8078B34;
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
StoreSpriteCallbackInData(sprite, sub_80CD654);
}
}
diff --git a/src/battle/anim/seed.c b/src/battle/anim/seed.c
index be8613a74..7f8154504 100644
--- a/src/battle/anim/seed.c
+++ b/src/battle/anim/seed.c
@@ -7,15 +7,20 @@ extern s16 gBattleAnimArgs[];
extern u8 gAnimBankAttacker;
extern u8 gAnimBankTarget;
-static void sub_80CAB88(struct Sprite* sprite);
-static void sub_80CABC0(struct Sprite* sprite);
+static void AnimLeechSeedStep(struct Sprite* sprite);
+static void AnimLeechSeedSprouts(struct Sprite* sprite);
// seed (sprouts a sapling from a seed.)
// Used by Leech Seed.
-
-void sub_80CAB18(struct Sprite* sprite)
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: target x pixel offset
+// arg 3: target y pixel offset
+// arg 4: duration
+// arg 5: wave amplitude
+void AnimLeechSeed(struct Sprite* sprite)
{
- sub_80787B0(sprite, 1);
+ InitAnimSpritePos(sprite, 1);
if (GetBankSide(gAnimBankAttacker))
{
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
@@ -25,26 +30,26 @@ void sub_80CAB18(struct Sprite* sprite)
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;
+ InitAnimSpriteTranslationOverDuration(sprite);
+ sprite->callback = AnimLeechSeedStep;
}
-void sub_80CAB88(struct Sprite* sprite)
+static void AnimLeechSeedStep(struct Sprite* sprite)
{
- if (sub_8078718(sprite))
+ if (TranslateAnimSpriteLinearAndSine(sprite))
{
sprite->invisible = 1;
sprite->data[0] = 10;
- sprite->callback = sub_80782D8;
- StoreSpriteCallbackInData(sprite, sub_80CABC0);
+ sprite->callback = WaitAnimForDuration;
+ StoreSpriteCallbackInData(sprite, AnimLeechSeedSprouts);
}
}
-void sub_80CABC0(struct Sprite* sprite)
+static void AnimLeechSeedSprouts(struct Sprite* sprite)
{
sprite->invisible = 0;
StartSpriteAnim(sprite, 1);
sprite->data[0] = 60;
- sprite->callback = sub_80782D8;
+ sprite->callback = WaitAnimForDuration;
StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
}
diff --git a/src/battle/anim/shadow_minimize.c b/src/battle/anim/shadow_minimize.c
index 94069374f..61645bc59 100644
--- a/src/battle/anim/shadow_minimize.c
+++ b/src/battle/anim/shadow_minimize.c
@@ -93,7 +93,7 @@ void sub_80D04E0(u8 taskId)
sub_8078F40(task->data[0]);
gSprites[task->data[15]].pos2.y = 0;
DestroyAnimVisualTask(taskId);
- break;
+ break;
}
}
@@ -110,10 +110,11 @@ void sub_80D0614(struct Task* task, u8 taskId)
}
else
{
- gSprites[r8].oam.objMode = 1;
- gSprites[r8].oam.affineMode = 3;
- gSprites[r8].affineAnimPaused = 1;
- gSprites[r8].oam.matrixNum = r6;
+ gSprites[r8].oam.objMode = ST_OAM_OBJ_BLEND;
+ gSprites[r8].oam.affineMode = ST_OAM_AFFINE_DOUBLE;
+ gSprites[r8].affineAnimPaused = TRUE;
+ r6 &= 0x1f;
+ gSprites[r8].oam.matrixNum = r6; // need to inhibit optimizing out the mov r0, 0x3f / neg r0, r0
gSprites[r8].subpriority = task->data[7] - task->data[3];
task->data[3]++;
task->data[6]++;
@@ -132,7 +133,7 @@ __attribute__((naked))
void sub_80D0614(struct Task* task, u8 taskId)
{
asm(".syntax unified\n\
- push {r4-r7,lr}\n\
+ push {r4-r7,lr}\n\
mov r7, r9\n\
mov r6, r8\n\
push {r6,r7}\n\
diff --git a/src/battle/anim/slash.c b/src/battle/anim/slash.c
index 6adcaf098..306968111 100644
--- a/src/battle/anim/slash.c
+++ b/src/battle/anim/slash.c
@@ -60,7 +60,7 @@ void sub_80CDE78(struct Sprite* sprite)
sprite->data[1] = 8;
sprite->data[2] = 0;
StoreSpriteCallbackInData(sprite, sub_80CDEB0);
- sprite->callback = sub_8078364;
+ sprite->callback = TranslateSpriteOverDuration;
}
}
diff --git a/src/battle/anim/slice.c b/src/battle/anim/slice.c
index fe8745483..80c58dddf 100644
--- a/src/battle/anim/slice.c
+++ b/src/battle/anim/slice.c
@@ -8,19 +8,21 @@ extern s16 gBattleAnimArgs[];
extern u8 gAnimBankAttacker;
extern u8 gAnimBankTarget;
-static void sub_80CCB00(struct Sprite* sprite);
+static void AnimSliceStep(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)
+// Moves the sprite in a diagonally slashing motion across the target mon.
+// Used by moves such as MOVE_CUT and MOVE_AERIAL_ACE.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: slice direction; 0 = right-to-left, 1 = left-to-right
+void AnimCuttingSlice(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;
+ sprite->callback = AnimSliceStep;
if (gBattleAnimArgs[2] == 0)
{
sprite->pos1.x += gBattleAnimArgs[0];
@@ -70,7 +72,7 @@ void sub_80CC9BC(struct Sprite* sprite)
if (GetBankSide(gAnimBankTarget) == 0)
sprite->pos1.y += 8;
- sprite->callback = sub_80CCB00;
+ sprite->callback = AnimSliceStep;
if (gBattleAnimArgs[2] == 0)
{
sprite->pos1.x += gBattleAnimArgs[0];
@@ -89,7 +91,7 @@ void sub_80CC9BC(struct Sprite* sprite)
sprite->data[1] = -sprite->data[1];
}
-void sub_80CCB00(struct Sprite* sprite)
+static void AnimSliceStep(struct Sprite* sprite)
{
sprite->data[3] += sprite->data[1];
sprite->data[4] += sprite->data[2];
@@ -106,6 +108,6 @@ void sub_80CCB00(struct Sprite* sprite)
{
StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
sprite->data[0] = 3;
- sprite->callback = sub_80782D8;
+ sprite->callback = WaitAnimForDuration;
}
}
diff --git a/src/battle/anim/sonic.c b/src/battle/anim/sonic.c
index 0897ec6e3..1501f51f1 100644
--- a/src/battle/anim/sonic.c
+++ b/src/battle/anim/sonic.c
@@ -9,14 +9,18 @@ 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)
+// Moves a projectile towards the target mon. The sprite is rotated to be pointing
+// in the same direction it's moving.
+// arg 0: initial x pixel offset
+// arg 1: initial y pixel offset
+// arg 2: target x pixel offset
+// arg 3: target y pixel offset
+// arg 4: duration
+void AnimSonicBoomProjectile(struct Sprite* sprite)
{
- s16 a;
- s16 b;
- u16 c;
+ s16 targetXPos;
+ s16 targetYPos;
+ u16 rotation;
if (IsContest())
{
@@ -29,19 +33,19 @@ void sub_80CF6DC(struct Sprite* sprite)
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;
+ InitAnimSpritePos(sprite, 1);
+ targetXPos = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[2];
+ targetYPos = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[3];
+ rotation = ArcTan2Neg(targetXPos - sprite->pos1.x, targetYPos - sprite->pos1.y);
+ rotation += 0xF000;
if (IsContest())
- c -= 0x6000;
+ rotation -= 0x6000;
- sub_8078FDC(sprite, 0, 0x100, 0x100, c);
+ sub_8078FDC(sprite, 0, 0x100, 0x100, rotation);
sprite->data[0] = gBattleAnimArgs[4];
- sprite->data[2] = a;
- sprite->data[4] = b;
- sprite->callback = sub_8078B34;
+ sprite->data[2] = targetXPos;
+ sprite->data[4] = targetYPos;
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
}
diff --git a/src/battle/anim/sonic_task.c b/src/battle/anim/sonic_task.c
index 924b1b568..260ae544c 100644
--- a/src/battle/anim/sonic_task.c
+++ b/src/battle/anim/sonic_task.c
@@ -87,7 +87,7 @@ void sub_80CFB04(u8 taskId)
if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
&& IsAnimBankSpriteVisible(gAnimBankTarget ^ 2))
{
- sub_807A3FC(gAnimBankTarget, 0, &sp1, &sp2);
+ SetAverageBattlerPositions(gAnimBankTarget, 0, &sp1, &sp2);
}
else
{
diff --git a/src/battle/anim/sunlight.c b/src/battle/anim/sunlight.c
index e6fd49a11..88112c74a 100644
--- a/src/battle/anim/sunlight.c
+++ b/src/battle/anim/sunlight.c
@@ -12,6 +12,6 @@ void sub_80D517C(struct Sprite *sprite)
sprite->data[0] = 60;
sprite->data[2] = 140;
sprite->data[4] = 80;
- sprite->callback = sub_8078B34;
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
}
diff --git a/src/battle/anim/sword.c b/src/battle/anim/sword.c
index b46fe6759..3367cca07 100644
--- a/src/battle/anim/sword.c
+++ b/src/battle/anim/sword.c
@@ -15,7 +15,7 @@ static void sub_80CF6B4(struct Sprite* sprite);
void sub_80CF690(struct Sprite* sprite)
{
- sub_80787B0(sprite, 0);
+ InitAnimSpritePos(sprite, 0);
sprite->callback = sub_80785E4;
StoreSpriteCallbackInData(sprite, sub_80CF6B4);
}
@@ -25,6 +25,6 @@ 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;
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
}
diff --git a/src/battle/anim/tile_out.c b/src/battle/anim/tile_out.c
index 50468a440..39d4ff01f 100644
--- a/src/battle/anim/tile_out.c
+++ b/src/battle/anim/tile_out.c
@@ -37,7 +37,7 @@ void sub_80CE1AC(struct Sprite* sprite)
sprite->data[0] = 30;
sprite->data[2] = GetBankPosition(gAnimBankAttacker, 2);
sprite->data[4] = GetBankPosition(gAnimBankAttacker, 3);
- sprite->callback = sub_8078B34;
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
}
}
diff --git a/src/battle/anim/unused_4.c b/src/battle/anim/unused_4.c
index bda476a0a..50ffaba4a 100644
--- a/src/battle/anim/unused_4.c
+++ b/src/battle/anim/unused_4.c
@@ -8,7 +8,7 @@ extern s16 gBattleAnimArgs[];
extern u8 gAnimBankAttacker;
extern u8 gAnimBankTarget;
-extern u8 gObjectBankIDs[];
+extern u8 gBankSpriteIds[];
static void sub_80CD9D4(struct Sprite* sprite);
@@ -27,7 +27,7 @@ void sub_80CD9D4(struct Sprite* sprite)
{
case 0:
sprite->data[1] = 0;
- sprite->data[2] = gObjectBankIDs[gAnimBankAttacker];
+ sprite->data[2] = gBankSpriteIds[gAnimBankAttacker];
sprite->data[3] = GetBankSide(gAnimBankAttacker);
sprite->data[4] = (sprite->data[3] != 0) ? 0x200 : -0x200;
sprite->data[5] = 0;
diff --git a/src/battle/anim/unused_7.c b/src/battle/anim/unused_7.c
index 2be6e7633..5a2de33c3 100644
--- a/src/battle/anim/unused_7.c
+++ b/src/battle/anim/unused_7.c
@@ -8,7 +8,7 @@ extern s16 gBattleAnimArgs[];
extern u8 gAnimBankAttacker;
extern u8 gAnimBankTarget;
-extern u8 gObjectBankIDs[];
+extern u8 gBankSpriteIds[];
// unused_7
@@ -32,7 +32,7 @@ void sub_80CF3C4(struct Sprite* sprite)
u8 a;
sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2);
sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3);
- a = gObjectBankIDs[gAnimBankTarget];
+ a = gBankSpriteIds[gAnimBankTarget];
if (GetBankSide(gAnimBankAttacker) != 0)
{
sprite->pos1.x -= gBattleAnimArgs[0];
diff --git a/src/battle/anim/unused_8.c b/src/battle/anim/unused_8.c
index 03772f951..c67ec2754 100644
--- a/src/battle/anim/unused_8.c
+++ b/src/battle/anim/unused_8.c
@@ -15,11 +15,11 @@ static void sub_80CF4B8(struct Sprite* sprite);
void sub_80CF458(struct Sprite* sprite)
{
- sub_80787B0(sprite, 1);
+ InitAnimSpritePos(sprite, 1);
sprite->data[0] = gBattleAnimArgs[2];
sprite->data[1] = gBattleAnimArgs[3];
sprite->data[5] = gBattleAnimArgs[4];
- sprite->callback = sub_80782D8;
+ sprite->callback = WaitAnimForDuration;
StoreSpriteCallbackInData(sprite, sub_80CF490);
}
@@ -28,7 +28,7 @@ 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;
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
StoreSpriteCallbackInData(sprite, sub_80CF4B8);
}
diff --git a/src/battle/anim/unused_9.c b/src/battle/anim/unused_9.c
index cf3ccb0d4..6e0d0321b 100644
--- a/src/battle/anim/unused_9.c
+++ b/src/battle/anim/unused_9.c
@@ -3,6 +3,7 @@
#include "trig.h"
#include "battle_anim.h"
#include "sound.h"
+#include "palette.h"
extern s16 gBattleAnimArgs[];
extern u8 gAnimBankAttacker;
@@ -17,7 +18,7 @@ static void sub_80CFE2C(struct Sprite* sprite);
void sub_80CFDFC(struct Sprite* sprite)
{
- sub_80787B0(sprite, 0);
+ InitAnimSpritePos(sprite, 0);
sprite->data[0] = 0x100 + (IndexOfSpritePaletteTag(gSpriteTemplate_83D75AC.paletteTag) << 4);
sprite->callback = sub_80CFE2C;
}
@@ -26,23 +27,19 @@ void sub_80CFDFC(struct Sprite* sprite)
void sub_80CFE2C(struct Sprite* sprite)
{
u16 r7;
- u16* r1;
- u16* r2;
+ u16 r5;
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--)
+ r5 = sprite->data[0];
+ r7 = gPlttBufferFaded[r5 + 8];
+ for (i = 0; i < 8; i++)
{
- *r2 = *r1;
- r1++;
- r2++;
+ gPlttBufferFaded[r5 + i + 8] = gPlttBufferFaded[r5 + i + 9];
}
+ gPlttBufferFaded[r5 + 15] = r7;
- gPlttBufferFaded[sprite->data[0] + 15] = r7;
if (++sprite->data[2] == 0x18)
DestroyAnimSprite(sprite);
}
diff --git a/src/battle/anim/water.c b/src/battle/anim/water.c
index 4068cbe78..e6945f9b2 100644
--- a/src/battle/anim/water.c
+++ b/src/battle/anim/water.c
@@ -18,7 +18,7 @@ void sub_80D37FC(struct Sprite *sprite)
sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2];
sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[4];
- sprite->callback = sub_8078B34;
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
}
@@ -30,7 +30,7 @@ void sub_80D3838(struct Sprite *sprite)
}
else
{
- sub_80787B0(sprite, 1);
+ InitAnimSpritePos(sprite, 1);
}
sprite->data[7] = gBattleAnimArgs[2];
diff --git a/src/battle/anim/wisp_fire.c b/src/battle/anim/wisp_fire.c
index 348ce6426..24cecb60c 100644
--- a/src/battle/anim/wisp_fire.c
+++ b/src/battle/anim/wisp_fire.c
@@ -10,7 +10,7 @@ extern s16 gBattleAnimArgs[];
extern u8 gAnimBankTarget;
extern u8 gAnimBankAttacker;
-extern u8 gObjectBankIDs[];
+extern u8 gBankSpriteIds[];
extern s8 gUnknown_083D9794[16];
extern s8 gUnknown_083D97A4[16];
@@ -175,7 +175,7 @@ void sub_80D60B4(u8 taskId)
}
gTasks[taskId].data[0]++;
- spriteId = gObjectBankIDs[gAnimBankTarget];
+ spriteId = gBankSpriteIds[gAnimBankTarget];
if (!gTasks[taskId].data[4])
unk = gUnknown_083D9794[gTasks[taskId].data[0] % 10];
diff --git a/src/battle/anim/wisp_orb.c b/src/battle/anim/wisp_orb.c
index 0cbe6eed7..7c22b7f13 100644
--- a/src/battle/anim/wisp_orb.c
+++ b/src/battle/anim/wisp_orb.c
@@ -21,7 +21,7 @@ void sub_80D5B0C(struct Sprite *sprite)
switch (sprite->data[0])
{
case 0:
- sub_80787B0(sprite, 0);
+ InitAnimSpritePos(sprite, 0);
StartSpriteAnim(sprite, gBattleAnimArgs[2]);
sprite->data[7] = gBattleAnimArgs[2];
@@ -86,7 +86,7 @@ static void sub_80D5C5C(struct Sprite *sprite)
s16 initialData5;
s16 newData5;
- if (!sub_8078B5C(sprite))
+ if (!TranslateAnimSpriteByDeltas(sprite))
{
sprite->pos2.x += Sin(sprite->data[5], 16);
initialData5 = sprite->data[5];
diff --git a/src/battle/anim/withdraw.c b/src/battle/anim/withdraw.c
index e67248b9f..933c97fa9 100644
--- a/src/battle/anim/withdraw.c
+++ b/src/battle/anim/withdraw.c
@@ -8,7 +8,7 @@ extern s16 gBattleAnimArgs[];
extern u8 gAnimBankAttacker;
extern u8 gAnimBankTarget;
-extern u8 gObjectBankIDs[];
+extern u8 gBankSpriteIds[];
static void sub_80CF514(u8 taskId);
@@ -17,13 +17,13 @@ static void sub_80CF514(u8 taskId);
void sub_80CF4D8(u8 taskId)
{
- sub_8078E70(gObjectBankIDs[gAnimBankAttacker], 0);
+ sub_8078E70(gBankSpriteIds[gAnimBankAttacker], 0);
gTasks[taskId].func = sub_80CF514;
}
void sub_80CF514(u8 taskId)
{
- u8 a = gObjectBankIDs[gAnimBankAttacker];
+ u8 a = gBankSpriteIds[gAnimBankAttacker];
s16 b;
if (GetBankSide(gAnimBankAttacker) == 0)
{
diff --git a/src/battle/battle_2.c b/src/battle/battle_2.c
index b00c35312..2d5b3c420 100644
--- a/src/battle/battle_2.c
+++ b/src/battle/battle_2.c
@@ -1,5 +1,12 @@
#include "global.h"
#include "constants/abilities.h"
+#include "constants/battle_move_effects.h"
+#include "constants/hold_effects.h"
+#include "constants/items.h"
+#include "constants/moves.h"
+#include "constants/songs.h"
+#include "constants/species.h"
+#include "gba/flash_internal.h"
#include "battle.h"
#include "battle_ai.h"
#include "battle_interface.h"
@@ -7,16 +14,20 @@
#include "battle_setup.h"
#include "battle_util.h"
#include "data2.h"
+#include "decompress.h"
#include "event_data.h"
#include "evolution_scene.h"
#include "item.h"
+#include "item_menu.h"
#include "link.h"
#include "main.h"
#include "m4a.h"
#include "name_string_util.h"
+#include "overworld.h"
#include "palette.h"
#include "party_menu.h"
#include "pokeball.h"
+#include "pokeblock.h"
#include "pokedex.h"
#include "pokemon.h"
#include "random.h"
@@ -24,9 +35,8 @@
#include "rom3.h"
#include "rom_8077ABC.h"
#include "rom_8094928.h"
-#include "constants/songs.h"
+#include "safari_zone.h"
#include "sound.h"
-#include "constants/species.h"
#include "sprite.h"
#include "string_util.h"
#include "task.h"
@@ -36,10 +46,6 @@
#include "tv.h"
#include "scanline_effect.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
@@ -64,9 +70,16 @@ struct UnknownStruct12
u8 filler4[0x54];
};
-extern const u16 gUnknown_08D004E0[];
-extern const struct MonCoords gCastformFrontSpriteCoords[];
+extern void sub_802BBD4();
+extern struct SpriteTemplate gUnknown_02024E8C;
+extern const u8 Str_821F7B8[];
+extern u8 gUnknown_02023A14_50;
+extern const u16 gBattleTextboxPalette[];
+extern const struct MonCoords gCastformFrontSpriteCoords[];
+extern const u8 Str_821F7EA[];
+extern const u8 gUnknown_Debug_821F7F3[];
+extern const u8 BattleText_YesNo[];
extern u8 gStatStageRatios[][2];
extern u8 gActionsByTurnOrder[4];
extern struct UnknownPokemonStruct2 gUnknown_02023A00[];
@@ -78,8 +91,8 @@ extern u16 gBattlePartyID[];
extern u8 gCurrentActionFuncId;
extern u8 gBanksByTurnOrder[];
extern struct UnknownStruct12 gUnknown_02024AD0[];
-extern u8 gObjectBankIDs[];
-extern u16 gCurrentMove;
+extern u8 gBankSpriteIds[];
+extern u16 gCurrentMove; // This is mis-named. It is a species, not a move ID.
extern u8 gLastUsedAbility;
extern u8 gStringBank;
extern u8 gAbsentBankFlags;
@@ -176,7 +189,7 @@ extern u8 gUnknown_081FA70C[][3];
extern u8 gUnknown_081FA71B[];
extern u8 gUnknown_081FA71F[];
-
+void sub_8010824(void);
static void BattlePrepIntroSlide(void);
void CheckFocusPunch_ClearVarsBeforeTurnStarts(void);
void SetActionsAndBanksTurnOrder(void);
@@ -244,15 +257,22 @@ void InitBattle(void)
gBattle_BG2_Y = 0;
gBattle_BG3_X = 0;
gBattle_BG3_Y = 0;
+
+#if DEBUG
+ if (!(gUnknown_02023A14_50 & 8))
+ gBattleTerrain = BattleSetup_GetTerrain();
+#else
gBattleTerrain = BattleSetup_GetTerrain();
+#endif
+
Text_InitWindowWithTemplate(&gUnknown_03004210, &gWindowTemplate_81E6C58);
Text_InitWindowWithTemplate(&gUnknown_030041D0, &gWindowTemplate_81E71D0);
Text_InitWindowWithTemplate(&gUnknown_03004250, &gWindowTemplate_81E71EC);
sub_800D6D4();
- sub_800DAB8();
+ LoadBattleTextboxAndBackground();
ResetSpriteData();
ResetTasks();
- sub_800E23C();
+ LoadBattleEntryBackground();
FreeAllSpritePalettes();
gReservedSpritePaletteCount = 4;
SetVBlankCallback(sub_800FCFC);
@@ -261,7 +281,11 @@ void InitBattle(void)
SetMainCallback2(sub_800F298);
else
SetMainCallback2(sub_800EC9C);
- if (!(gBattleTypeFlags & BATTLE_TYPE_LINK))
+ if (!(gBattleTypeFlags & BATTLE_TYPE_LINK)
+#if DEBUG
+ && !(gUnknown_02023A14_50 & 8)
+#endif
+ )
{
CreateNPCTrainerParty(gEnemyParty, gTrainerBattleOpponent);
SetWildMonHeldItem();
@@ -383,6 +407,7 @@ void sub_800EC9C(void)
{
u8 playerId;
u8 enemyId;
+ s32 id;
RunTasks();
AnimateSprites();
@@ -396,12 +421,22 @@ void sub_800EC9C(void)
case 0:
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
- if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC())
+ if (gReceivedRemoteLinkPlayers != 0 && IsLinkTaskFinished())
{
gBattleStruct->unk0 = 1;
gBattleStruct->unk1 = 1;
sub_800E9EC();
sub_800EAAC();
+#if DEBUG
+ if (gUnknown_02023A14_50 & 8)
+ {
+ for (id = 0; id < 2; id++) // Why < 2 here?
+ {
+ gLinkPlayers[id].lp_field_18 = id;
+ gLinkPlayers[id].linkType = 0x2211;
+ }
+ }
+#endif
SendBlock(bitmask_all_link_players_but_self(), gBattleStruct, 32);
gBattleCommunication[0] = 1;
}
@@ -416,7 +451,6 @@ void sub_800EC9C(void)
case 1:
if ((GetBlockReceivedStatus() & 3) == 3)
{
- s32 id;
u8 taskId;
ResetBlockReceivedFlags();
@@ -464,7 +498,7 @@ void sub_800EC9C(void)
}
break;
case 2:
- if (sub_8007ECC())
+ if (IsLinkTaskFinished())
{
SendBlock(bitmask_all_link_players_but_self(), gPlayerParty, sizeof(*gPlayerParty) * 2);
gBattleCommunication[0]++;
@@ -479,7 +513,7 @@ void sub_800EC9C(void)
}
break;
case 4:
- if (sub_8007ECC())
+ if (IsLinkTaskFinished())
{
SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 2, sizeof(*gPlayerParty) * 2);
gBattleCommunication[0]++;
@@ -494,7 +528,7 @@ void sub_800EC9C(void)
}
break;
case 6:
- if (sub_8007ECC())
+ if (IsLinkTaskFinished())
{
SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 4, sizeof(*gPlayerParty) * 2);
gBattleCommunication[0]++;
@@ -566,6 +600,7 @@ void sub_800F104(void)
u8 playerId;
MainCallback *pSavedCallback;
u16 *pSavedBattleTypeFlags;
+ s32 i;
playerId = GetMultiplayerId();
ewram160CB = playerId;
@@ -579,17 +614,30 @@ void sub_800F104(void)
switch (gBattleCommunication[0])
{
case 0:
- if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC())
+ if (gReceivedRemoteLinkPlayers != 0)
{
- sub_800F02C();
- SendBlock(bitmask_all_link_players_but_self(), gSharedMem, 0x60);
- gBattleCommunication[0]++;
+#if DEBUG
+ if (gUnknown_02023A14_50 & 8)
+ {
+ for (i = 0; i < 4; i++)
+ {
+ gLinkPlayers[i].lp_field_18 = i;
+ gLinkPlayers[i].linkType = 0x2211;
+ }
+ }
+#endif
+ if (IsLinkTaskFinished())
+ {
+ sub_800F02C();
+ SendBlock(bitmask_all_link_players_but_self(), gSharedMem, 0x60);
+ gBattleCommunication[0]++;
+ }
}
break;
case 1:
if ((GetBlockReceivedStatus() & 0xF) == 0xF)
{
- s32 i;
+ //s32 i;
ResetBlockReceivedFlags();
for (i = 0; i < 4; i++)
@@ -639,14 +687,27 @@ void sub_800F298(void)
switch (gBattleCommunication[0])
{
case 0:
- if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC())
+ if (gReceivedRemoteLinkPlayers != 0)
{
- gBattleStruct->unk0 = 1;
- gBattleStruct->unk1 = 1;
- sub_800E9EC();
- sub_800EAAC();
- SendBlock(bitmask_all_link_players_but_self(), gSharedMem, 0x20);
- gBattleCommunication[0]++;
+#if DEBUG
+ if (gUnknown_02023A14_50 & 8)
+ {
+ for (id = 0; id < 4; id++)
+ {
+ gLinkPlayers[id].lp_field_18 = id;
+ gLinkPlayers[id].linkType = 0x2211;
+ }
+ }
+#endif
+ if (IsLinkTaskFinished())
+ {
+ gBattleStruct->unk0 = 1;
+ gBattleStruct->unk1 = 1;
+ sub_800E9EC();
+ sub_800EAAC();
+ SendBlock(bitmask_all_link_players_but_self(), gSharedMem, 0x20);
+ gBattleCommunication[0]++;
+ }
}
break;
case 1:
@@ -727,16 +788,14 @@ void sub_800F298(void)
ZeroPlayerPartyMons();
ZeroEnemyPartyMons();
gBattleCommunication[0]++;
- goto step_2;
- }
- break;
+ // fallthrough
case 2:
- step_2:
- if (sub_8007ECC())
- {
- SendBlock(bitmask_all_link_players_but_self(), ewram1D000, sizeof(struct Pokemon) * 2);
- gBattleCommunication[0]++;
- }
+ if (IsLinkTaskFinished())
+ {
+ SendBlock(bitmask_all_link_players_but_self(), ewram1D000, sizeof(struct Pokemon) * 2);
+ gBattleCommunication[0]++;
+ }
+ }
break;
case 3:
if ((GetBlockReceivedStatus() & 0xF) == 0xF)
@@ -795,7 +854,7 @@ void sub_800F298(void)
}
break;
case 4:
- if (sub_8007ECC())
+ if (IsLinkTaskFinished())
{
SendBlock(bitmask_all_link_players_but_self(), ewram1D000 + 2, sizeof(struct Pokemon));
gBattleCommunication[0]++;
@@ -898,6 +957,29 @@ void BattleMainCB2(void)
{
AnimateSprites();
BuildOamBuffer();
+
+#if DEBUG
+ if ((gMain.heldKeys & (R_BUTTON | SELECT_BUTTON)) == ((R_BUTTON | SELECT_BUTTON)))
+ {
+ gSpecialVar_Result = gBattleOutcome = 1;
+ gMain.inBattle = FALSE;
+ gScanlineEffect.state = 3;
+ gMain.callback1 = gPreBattleCallback1;
+ ZeroEnemyPartyMons();
+ m4aSongNumStop(0x5A);
+ if (gBattleTypeFlags & 2)
+ SetMainCallback2(sub_805465C);
+ else
+ SetMainCallback2(gMain.savedCallback);
+ }
+ if (gBattleTypeFlags & 2)
+ {
+ debug_sub_8008264((gBattleTypeFlags >> 2) % 2, 1, 1, 1, 1);
+ debug_sub_8008264((gBattleTypeFlags >> 2) % 2, 1, 21, 1, 1);
+ debug_sub_8008264((gBattleTypeFlags >> 2) % 2, 1, 41, 1, 1);
+ }
+#endif
+
Text_UpdateWindowInBattle(&gUnknown_03004210);
UpdatePaletteFade();
RunTasks();
@@ -1225,11 +1307,11 @@ void c2_8011A1C(void)
Text_InitWindowWithTemplate(&gUnknown_030041D0, &gWindowTemplate_81E71D0);
Text_InitWindowWithTemplate(&gUnknown_03004250, &gWindowTemplate_81E71EC);
sub_800D6D4();
- LoadCompressedPalette(gUnknown_08D004E0, 0, 64);
- sub_800D74C();
+ LoadCompressedPalette(gBattleTextboxPalette, 0, 64);
+ ApplyPlayerChosenFrameToBattleMenu();
ResetSpriteData();
ResetTasks();
- sub_800E23C();
+ LoadBattleEntryBackground();
REG_WINOUT = 0x37;
FreeAllSpritePalettes();
gReservedSpritePaletteCount = 4;
@@ -1275,6 +1357,1925 @@ void c2_081284E0(void)
}
}
+#if DEBUG
+
+extern u8 gUnknown_Debug_2023B62[];
+extern const u8 Str_821F7BD[];
+extern const u8 Str_821F7DA[];
+
+void debug_sub_8010818(void);
+void debug_sub_80108B8(void);
+void debug_sub_8010CAC(void);
+void debug_sub_8011498(void);
+void debug_sub_801174C(void);
+void debug_sub_8011D40(void);
+void debug_sub_8011E5C(void);
+void debug_sub_8011E74(void);
+void debug_sub_8011EA0(u8);
+void debug_sub_8012294(void);
+void debug_sub_80123D8(u8);
+void debug_sub_8012540(void);
+void debug_nullsub_3(void);
+void debug_sub_80125A0(void);
+void debug_sub_80125E4(void);
+void debug_sub_8012628(void);
+void debug_sub_8012658(void);
+void debug_sub_8012688(void);
+void debug_sub_8012878(void);
+void debug_sub_8012D10(u8);
+u32 debug_sub_8013294(u8, void *, u32);
+void debug_sub_80132C8(u8, void *, u32);
+
+extern s16 gUnknown_Debug_2023A76[][0x23];
+extern s16 gUnknown_Debug_2023B02[][6][4];
+extern u8 gUnknown_Debug_03004360;
+extern struct Window gUnknown_Debug_03004370;
+extern u8 gUnknown_Debug_030043A0;
+extern u8 gUnknown_Debug_030043A4;
+extern u8 gUnknown_Debug_030043A8;
+extern u8 gBattleBuffersTransferData[];
+
+extern const u16 gUnknown_Debug_821F424[][5];
+extern const u16 gUnknown_Debug_821F56C[][5];
+extern const u32 gUnknown_Debug_821F798[][4];
+
+extern const u8 gUnusedOldCharmap_Gfx_lz[];
+extern const u8 gUnusedOldCharmap_Tilemap_lz[];
+extern const u8 gUnusedOldCharmap_Pal_lz[];
+
+void debug_sub_8010800(void)
+{
+ debug_sub_8010818();
+ debug_sub_80108B8();
+ *(u32 *)(gBattleBuffersTransferData + 0x100) = 0;
+}
+
+void debug_sub_8010818(void)
+{
+ s32 i;
+
+ gUnknown_Debug_2023A76[0][0] = 0x115;
+ gUnknown_Debug_2023A76[1][0] = 0x115;
+ for (i = 1; i < 31; i++)
+ {
+ gUnknown_Debug_2023A76[0][i] = gUnknown_Debug_821F424[i][4];
+ gUnknown_Debug_2023A76[1][i] = gUnknown_Debug_821F424[i][4];
+ }
+
+ for (i = 0; i < 6; i++)
+ {
+ for (gUnknown_Debug_030043A8 = 0; gUnknown_Debug_030043A8 < 4; gUnknown_Debug_030043A8++)
+ {
+ gUnknown_Debug_2023B02[0][i][gUnknown_Debug_030043A8] = gUnknown_Debug_821F56C[gUnknown_Debug_030043A8][0];
+ gUnknown_Debug_2023B02[1][i][gUnknown_Debug_030043A8] = gUnknown_Debug_821F56C[gUnknown_Debug_030043A8][0];
+ }
+ }
+}
+
+void debug_sub_80108B8(void)
+{
+ s32 i;
+
+ m4aSoundVSyncOff();
+ SetHBlankCallback(NULL);
+ SetVBlankCallback(NULL);
+ DmaFill32(3, 0, (void *)VRAM, VRAM_SIZE);
+ REG_IE = 1;
+ REG_DISPCNT = 0x1340;
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 0;
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ gBattle_BG2_X = 0;
+ gBattle_BG2_Y = 0;
+ gBattle_BG3_X = 0;
+ gBattle_BG3_Y = 0;
+ REG_BG0CNT = 0x1F09;
+ REG_BG1CNT = 0x4801;
+ REG_BLDCNT = 0;
+ REG_BLDY = 0;
+ LZDecompressVram(gUnusedOldCharmap_Gfx_lz, (void *)VRAM);
+ LZDecompressWram(gUnusedOldCharmap_Tilemap_lz, gSharedMem);
+ LZDecompressVram(gUnusedOldCharmap_Pal_lz, (void *)PLTT);
+ LZDecompressVram(gUnusedOldCharmap_Pal_lz, (void *)(PLTT + 0x1E0));
+ m4aSoundVSyncOn();
+ SetVBlankCallback(debug_sub_8011D40);
+ SetMainCallback2(debug_sub_8010CAC);
+ ResetTasks();
+ ResetSpriteData();
+ ScanlineEffect_Stop();
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C);
+ Text_InitWindowWithTemplate(&gUnknown_Debug_03004370, &gWindowTemplate_81E6C3C);
+ gUnknown_Debug_03004360 = 0;
+ gUnknown_Debug_030043A0 = 0;
+ gUnknown_Debug_030043A4 = 0;
+ for (i = 0; i < 31; i++)
+ debug_sub_8011EA0(i);
+ for (gUnknown_Debug_030043A8 = 0; gUnknown_Debug_030043A8 < 4; gUnknown_Debug_030043A8++)
+ debug_sub_8012294();
+ debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
+ debug_sub_8012540();
+ debug_nullsub_3();
+ gUnknown_Debug_030043A8 = 0;
+ debug_sub_80125A0();
+ if (gUnknown_Debug_2023A76[0][0x22] == 8)
+ {
+ debug_sub_801174C();
+ }
+ else
+ {
+ for (i = 0; i < 8; i++)
+ gSharedMem[0x160B4 + i] = 0;
+ }
+}
+
+void debug_sub_8010A7C(u8 a, u8 b)
+{
+ s32 i;
+
+ for (i = 0; i < b; i++)
+ gBattleTextBuff1[i] = a;
+ gBattleTextBuff1[i] = EOS;
+}
+
+void debug_sub_8010AAC(u8 a)
+{
+ switch (gBaseStats[gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5]].genderRatio)
+ {
+ case 0:
+ gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + 4] = 2;
+ break;
+ case 0xFE:
+ gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + 4] = 3;
+ break;
+ case 0xFF:
+ gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + 4] = 4;
+ break;
+ default:
+ gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + 4] &= 1;
+ if (a != 0)
+ gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + 4] ^= 1;
+ else
+ gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + 4] = 0;
+ break;
+ }
+}
+
+// gUnknown_Debug_2023A76 2D array
+void debug_sub_8010B80(u8 a)
+{
+ s8 r12 = 0;
+ s8 r7 = gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5];
+
+ while (r7 >= 10)
+ {
+ r7 -= 10;
+ r12++;
+ }
+
+ if (a & 2)
+ {
+ if (a & 1)
+ r12++;
+ else
+ r12--;
+ if (r12 < 0)
+ r12 = 9;
+ if (r12 > 9)
+ r12 = 0;
+ }
+ else
+ {
+ if (a & 1)
+ r7++;
+ else
+ r7--;
+ if (r7 < 1)
+ r7 = 9;
+ if (r7 > 9)
+ r7 = 1;
+ }
+ gUnknown_Debug_2023A76[gUnknown_Debug_03004360 ^ 1][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5]
+ = gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5]
+ = r12 * 10 + r7;
+}
+
+// For some unexplainable reason, code in various functions will cause SetActionsAndBanksTurnOrder,
+// a completely separate and unrelated function, to use different registers. I have
+// absolutely no clue as to why this phenomenon occurs. For example,
+// I have to make debug_sub_8010CAC access gUnknown_Debug_2023A76 as a 3D array.
+// If I use a 2D array, SetActionsAndBanksTurnOrder will no longer match.
+#ifdef NONMATCHING
+void debug_sub_8010CAC(void)
+{
+ s32 r5;
+
+ if (gMain.heldKeysRaw == (L_BUTTON | SELECT_BUTTON))
+ DoSoftReset();
+ if (gMain.newKeysRaw == SELECT_BUTTON)
+ {
+ if (gUnknown_Debug_030043A4 < 6)
+ {
+ gUnknown_Debug_030043A8 = 0;
+ debug_sub_8012628();
+ SetMainCallback2(debug_sub_8011498);
+ }
+ if (gUnknown_Debug_030043A0 == 0 && gUnknown_Debug_030043A4 == 6)
+ {
+ gMain.savedCallback = debug_sub_80108B8;
+ CreateMon(
+ &gPlayerParty[0],
+ gUnknown_Debug_2023A76[0][0 * 5 + 0],
+ gUnknown_Debug_2023A76[0][0 * 5 + 1],
+ 32,
+ 0, 0, 0, 0);
+ for (r5 = 0; r5 < 4; r5++)
+ {
+ SetMonData(&gPlayerParty[0], MON_DATA_MOVE1 + r5, &gUnknown_Debug_2023B02[0][0][r5]);
+ SetMonData(&gPlayerParty[0], MON_DATA_PP1 + r5, &gBattleMoves[gUnknown_Debug_2023B02[0][0][r5]].pp);
+ }
+ switch (gUnknown_Debug_2023A76[0][6 * 5 + 0])
+ {
+ case 1:
+ gCB2_AfterEvolution = debug_sub_80108B8;
+ EvolutionScene(&gPlayerParty[0], gUnknown_Debug_2023A76[0][1 * 5 + 0], 1, 0);
+ break;
+ case 2:
+ debug_sub_8012688();
+ break;
+ }
+ }
+ if (gUnknown_Debug_030043A0 == 1 && gUnknown_Debug_030043A4 == 6)
+ {
+ // This is really weird
+ r5 = (gSaveBlock2.optionsBattleSceneOff | (gSaveBlock2.optionsSound << 1));
+ r5++;
+ if (r5 == 4)
+ r5 = 0;
+ gSaveBlock2.optionsBattleSceneOff = (r5 & 1);
+ gSaveBlock2.optionsSound = (r5 & 2) >> 1;
+ SetPokemonCryStereo(gSaveBlock2.optionsSound);
+ debug_nullsub_3();
+ }
+ }
+ if (gMain.newKeysRaw == START_BUTTON)
+ debug_sub_801174C();
+ if (gMain.newKeysRaw == DPAD_UP)
+ {
+ debug_sub_80125E4();
+ if (gUnknown_Debug_030043A4 != 0)
+ gUnknown_Debug_030043A4--;
+ else
+ gUnknown_Debug_030043A4 = 6;
+ debug_sub_8011E74();
+ debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
+ debug_sub_80125A0();
+ }
+ if (gMain.newKeysRaw == DPAD_DOWN)
+ {
+ debug_sub_80125E4();
+ if (gUnknown_Debug_030043A4 == 6)
+ gUnknown_Debug_030043A4 = 0;
+ else
+ gUnknown_Debug_030043A4++;
+ debug_sub_8011E74();
+ debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
+ debug_sub_80125A0();
+ }
+ if (gMain.newKeysRaw == DPAD_LEFT)
+ {
+ debug_sub_80125E4();
+ if (gUnknown_Debug_030043A0 != 0)
+ {
+ gUnknown_Debug_030043A0--;
+ }
+ else
+ {
+ if (gUnknown_Debug_03004360 != 0)
+ {
+ gUnknown_Debug_03004360 = 0;
+ gUnknown_Debug_030043A0 = 4;
+ gBattle_BG1_X = 0;
+ debug_sub_8011E5C();
+ debug_sub_8011E74();
+ debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
+ }
+ }
+ debug_sub_80125A0();
+ }
+ if (gMain.newKeysRaw == DPAD_RIGHT)
+ {
+ debug_sub_80125E4();
+ if (gUnknown_Debug_030043A0 != 4)
+ {
+ gUnknown_Debug_030043A0++;
+ }
+ else
+ {
+ if (gUnknown_Debug_03004360 == 0)
+ {
+ gUnknown_Debug_03004360 = 1;
+ gUnknown_Debug_030043A0 = 0;
+ gBattle_BG1_X = 0x100;
+ debug_sub_8011E5C();
+ debug_sub_8011E74();
+ debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
+ }
+ }
+ debug_sub_80125A0();
+ }
+ if (gMain.newAndRepeatedKeys & B_BUTTON)
+ {
+ switch (gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5)
+ {
+ case 31:
+ debug_sub_8010818();
+ debug_sub_8011E5C();
+ debug_sub_8011E74();
+ debug_sub_8012540();
+ debug_nullsub_3();
+ debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
+ break;
+ case 32:
+ debug_sub_80132C8(31, gUnknown_Debug_2023A76, 0xEC);
+ debug_sub_8011E5C();
+ debug_sub_8011E74();
+ debug_sub_8012540();
+ debug_nullsub_3();
+ debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
+ break;
+ case 33:
+ debug_sub_8013294(31, gUnknown_Debug_2023A76, 0xEC);
+ break;
+ case 34:
+ if (gUnknown_Debug_2023A76[0][6 * 5 + 4] != 0)
+ {
+ gUnknown_Debug_2023A76[0][6 * 5 + 4]--;
+ gUnknown_Debug_2023A76[1][6 * 5 + 4]--;
+ }
+ else
+ {
+ gUnknown_Debug_2023A76[0][6 * 5 + 4] = 8;
+ gUnknown_Debug_2023A76[1][6 * 5 + 4] = 8;
+ }
+ debug_sub_8012540();
+ break;
+ case 30:
+ debug_sub_8010B80(0);
+ debug_sub_8011EA0(gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5);
+ break;
+ default:
+ if (gUnknown_Debug_030043A0 == 4 && gUnknown_Debug_030043A4 < 6)
+ {
+ debug_sub_8010AAC(1);
+ }
+ else
+ {
+ gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5]--;
+ if (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5] < gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][4])
+ gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5] = gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3];
+ }
+ if (gUnknown_Debug_030043A0 == 0)
+ {
+ debug_sub_8010AAC(0);
+ debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4);
+ }
+ debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0);
+ debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
+ break;
+ }
+ }
+ if (gMain.newAndRepeatedKeys & A_BUTTON)
+ {
+ switch (gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5)
+ {
+ case 31:
+ debug_sub_8010818();
+ debug_sub_8011E5C();
+ debug_sub_8011E74();
+ debug_sub_8012540();
+ debug_nullsub_3();
+ debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
+ break;
+ case 32:
+ debug_sub_80132C8(31, gUnknown_Debug_2023A76, 0xEC);
+ debug_sub_8011E5C();
+ debug_sub_8011E74();
+ debug_sub_8012540();
+ debug_nullsub_3();
+ debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
+ break;
+ case 33:
+ debug_sub_8013294(31, gUnknown_Debug_2023A76, 0xEC);
+ break;
+ case 34:
+ if (gUnknown_Debug_2023A76[0][6 * 5 + 4] < 8)
+ {
+ gUnknown_Debug_2023A76[0][6 * 5 + 4]++;
+ gUnknown_Debug_2023A76[1][6 * 5 + 4]++;
+ }
+ else
+ {
+ gUnknown_Debug_2023A76[0][6 * 5 + 4] = 0;
+ gUnknown_Debug_2023A76[1][6 * 5 + 4] = 0;
+ }
+ debug_sub_8012540();
+ break;
+ case 30:
+ debug_sub_8010B80(1);
+ debug_sub_8011EA0(gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5);
+ break;
+ default:
+ if (gUnknown_Debug_030043A0 == 4 && gUnknown_Debug_030043A4 < 6)
+ {
+ debug_sub_8010AAC(1);
+ }
+ else
+ {
+ gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5]++;
+ if (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] > gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3])
+ gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] = gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][4];
+ }
+ if (gUnknown_Debug_030043A0 == 0)
+ {
+ debug_sub_8010AAC(0);
+ debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4);
+ }
+ debug_sub_8011EA0(gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5);
+ debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
+ break;
+ }
+ }
+ if (gMain.newAndRepeatedKeys & L_BUTTON)
+ {
+ if (gUnknown_Debug_030043A0 == 4 && gUnknown_Debug_030043A4 < 6)
+ {
+ debug_sub_8010AAC(1);
+ }
+ else
+ {
+ if (gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0 == 30)
+ {
+ debug_sub_8010B80(2);
+ }
+ else
+ {
+ gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] -= 10;
+ while (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] < gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][4])
+ gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] += gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3];
+ }
+ }
+ if (gUnknown_Debug_030043A0 == 0)
+ {
+ debug_sub_8010AAC(0);
+ debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4);
+ }
+ debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0);
+ debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
+ }
+ if (gMain.newAndRepeatedKeys & R_BUTTON)
+ {
+ if (gUnknown_Debug_030043A0 == 4 && gUnknown_Debug_030043A4 < 6)
+ {
+ debug_sub_8010AAC(1);
+ }
+ else
+ {
+ if (gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0 == 30)
+ {
+ debug_sub_8010B80(3);
+ }
+ else
+ {
+ gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] += 10;
+ while (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] > gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3])
+ gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] -= gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3];
+ }
+ }
+ if (gUnknown_Debug_030043A0 == 0)
+ {
+ debug_sub_8010AAC(0);
+ debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4);
+ }
+ debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0);
+ debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
+ }
+ AnimateSprites();
+ BuildOamBuffer();
+}
+#else
+
+// 3D array
+extern s16 gUnknown_Debug_2023A76_[][7][5];
+
+void debug_sub_8010CAC(void)
+{
+ s32 r5;
+
+ if (gMain.heldKeysRaw == (L_BUTTON | SELECT_BUTTON))
+ DoSoftReset();
+ if (gMain.newKeysRaw == SELECT_BUTTON)
+ {
+ if (gUnknown_Debug_030043A4 < 6)
+ {
+ gUnknown_Debug_030043A8 = 0;
+ debug_sub_8012628();
+ SetMainCallback2(debug_sub_8011498);
+ }
+ if (gUnknown_Debug_030043A0 == 0 && gUnknown_Debug_030043A4 == 6)
+ {
+ gMain.savedCallback = debug_sub_80108B8;
+ CreateMon(
+ &gPlayerParty[0],
+ gUnknown_Debug_2023A76_[0][0][0],
+ gUnknown_Debug_2023A76_[0][0][1],
+ 32,
+ 0, 0, 0, 0);
+ for (r5 = 0; r5 < 4; r5++)
+ {
+ SetMonData(&gPlayerParty[0], MON_DATA_MOVE1 + r5, &gUnknown_Debug_2023B02[0][0][r5]);
+ SetMonData(&gPlayerParty[0], MON_DATA_PP1 + r5, &gBattleMoves[gUnknown_Debug_2023B02[0][0][r5]].pp);
+ }
+ switch (gUnknown_Debug_2023A76_[0][6][0])
+ {
+ case 1:
+ gCB2_AfterEvolution = debug_sub_80108B8;
+ EvolutionScene(&gPlayerParty[0], gUnknown_Debug_2023A76_[0][1][0], 1, 0);
+ break;
+ case 2:
+ debug_sub_8012688();
+ break;
+ }
+ }
+ if (gUnknown_Debug_030043A0 == 1 && gUnknown_Debug_030043A4 == 6)
+ {
+ // This is really weird
+ r5 = (gSaveBlock2.optionsBattleSceneOff | (gSaveBlock2.optionsSound << 1));
+ r5++;
+ if (r5 == 4)
+ r5 = 0;
+ gSaveBlock2.optionsBattleSceneOff = (r5 & 1);
+ gSaveBlock2.optionsSound = (r5 & 2) >> 1;
+ SetPokemonCryStereo(gSaveBlock2.optionsSound);
+ debug_nullsub_3();
+ }
+ }
+ if (gMain.newKeysRaw == START_BUTTON)
+ debug_sub_801174C();
+ if (gMain.newKeysRaw == DPAD_UP)
+ {
+ debug_sub_80125E4();
+ if (gUnknown_Debug_030043A4 != 0)
+ gUnknown_Debug_030043A4--;
+ else
+ gUnknown_Debug_030043A4 = 6;
+ debug_sub_8011E74();
+ debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
+ debug_sub_80125A0();
+ }
+ if (gMain.newKeysRaw == DPAD_DOWN)
+ {
+ debug_sub_80125E4();
+ if (gUnknown_Debug_030043A4 == 6)
+ gUnknown_Debug_030043A4 = 0;
+ else
+ gUnknown_Debug_030043A4++;
+ debug_sub_8011E74();
+ debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
+ debug_sub_80125A0();
+ }
+ if (gMain.newKeysRaw == DPAD_LEFT)
+ {
+ debug_sub_80125E4();
+ if (gUnknown_Debug_030043A0 != 0)
+ {
+ gUnknown_Debug_030043A0--;
+ }
+ else
+ {
+ if (gUnknown_Debug_03004360 != 0)
+ {
+ gUnknown_Debug_03004360 = 0;
+ gUnknown_Debug_030043A0 = 4;
+ gBattle_BG1_X = 0;
+ debug_sub_8011E5C();
+ debug_sub_8011E74();
+ debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
+ }
+ }
+ debug_sub_80125A0();
+ }
+ if (gMain.newKeysRaw == DPAD_RIGHT)
+ {
+ debug_sub_80125E4();
+ if (gUnknown_Debug_030043A0 != 4)
+ {
+ gUnknown_Debug_030043A0++;
+ }
+ else
+ {
+ if (gUnknown_Debug_03004360 == 0)
+ {
+ gUnknown_Debug_03004360 = 1;
+ gUnknown_Debug_030043A0 = 0;
+ gBattle_BG1_X = 0x100;
+ debug_sub_8011E5C();
+ debug_sub_8011E74();
+ debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
+ }
+ }
+ debug_sub_80125A0();
+ }
+ if (gMain.newAndRepeatedKeys & B_BUTTON)
+ {
+ switch (gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5)
+ {
+ case 31:
+ debug_sub_8010818();
+ debug_sub_8011E5C();
+ debug_sub_8011E74();
+ debug_sub_8012540();
+ debug_nullsub_3();
+ debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
+ break;
+ case 32:
+ debug_sub_80132C8(31, gUnknown_Debug_2023A76, 0xEC);
+ debug_sub_8011E5C();
+ debug_sub_8011E74();
+ debug_sub_8012540();
+ debug_nullsub_3();
+ debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
+ break;
+ case 33:
+ debug_sub_8013294(31, gUnknown_Debug_2023A76, 0xEC);
+ break;
+ case 34:
+ if (gUnknown_Debug_2023A76_[0][6][4] != 0)
+ {
+ gUnknown_Debug_2023A76_[0][6][4]--;
+ gUnknown_Debug_2023A76_[1][6][4]--;
+ }
+ else
+ {
+ gUnknown_Debug_2023A76_[0][6][4] = 8;
+ gUnknown_Debug_2023A76_[1][6][4] = 8;
+ }
+ debug_sub_8012540();
+ break;
+ case 30:
+ debug_sub_8010B80(0);
+ debug_sub_8011EA0(gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5);
+ break;
+ default:
+ if (gUnknown_Debug_030043A0 == 4 && gUnknown_Debug_030043A4 < 6)
+ {
+ debug_sub_8010AAC(1);
+ }
+ else
+ {
+ gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5]--;
+ if (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] < gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][4])
+ gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] = gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3];
+ }
+ if (gUnknown_Debug_030043A0 == 0)
+ {
+ debug_sub_8010AAC(0);
+ debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4);
+ }
+ debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0);
+ debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
+ break;
+ }
+ }
+ if (gMain.newAndRepeatedKeys & A_BUTTON)
+ {
+ switch (gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5)
+ {
+ case 31:
+ debug_sub_8010818();
+ debug_sub_8011E5C();
+ debug_sub_8011E74();
+ debug_sub_8012540();
+ debug_nullsub_3();
+ debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
+ break;
+ case 32:
+ debug_sub_80132C8(31, gUnknown_Debug_2023A76, 0xEC);
+ debug_sub_8011E5C();
+ debug_sub_8011E74();
+ debug_sub_8012540();
+ debug_nullsub_3();
+ debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
+ break;
+ case 33:
+ debug_sub_8013294(31, gUnknown_Debug_2023A76, 0xEC);
+ break;
+ case 34:
+ if (gUnknown_Debug_2023A76_[0][6][4] < 8)
+ {
+ gUnknown_Debug_2023A76_[0][6][4]++;
+ gUnknown_Debug_2023A76_[1][6][4]++;
+ }
+ else
+ {
+ gUnknown_Debug_2023A76_[0][6][4] = 0;
+ gUnknown_Debug_2023A76_[1][6][4] = 0;
+ }
+ debug_sub_8012540();
+ break;
+ case 30:
+ debug_sub_8010B80(1);
+ debug_sub_8011EA0(gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5);
+ break;
+ default:
+ if (gUnknown_Debug_030043A0 == 4 && gUnknown_Debug_030043A4 < 6)
+ {
+ debug_sub_8010AAC(1);
+ }
+ else
+ {
+ gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5]++;
+ if (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] > gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3])
+ gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] = gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][4];
+ }
+ if (gUnknown_Debug_030043A0 == 0)
+ {
+ debug_sub_8010AAC(0);
+ debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4);
+ }
+ debug_sub_8011EA0(gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5);
+ debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
+ break;
+ }
+ }
+ if (gMain.newAndRepeatedKeys & L_BUTTON)
+ {
+ if (gUnknown_Debug_030043A0 == 4 && gUnknown_Debug_030043A4 < 6)
+ {
+ debug_sub_8010AAC(1);
+ }
+ else
+ {
+ if (gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0 == 30)
+ {
+ debug_sub_8010B80(2);
+ }
+ else
+ {
+ gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] -= 10;
+ while (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] < gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][4])
+ gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] += gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3];
+ }
+ }
+ if (gUnknown_Debug_030043A0 == 0)
+ {
+ debug_sub_8010AAC(0);
+ debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4);
+ }
+ debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0);
+ debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
+ }
+ if (gMain.newAndRepeatedKeys & R_BUTTON)
+ {
+ if (gUnknown_Debug_030043A0 == 4 && gUnknown_Debug_030043A4 < 6)
+ {
+ debug_sub_8010AAC(1);
+ }
+ else
+ {
+ if (gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0 == 30)
+ {
+ debug_sub_8010B80(3);
+ }
+ else
+ {
+ gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] += 10;
+ while (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] > gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3])
+ gUnknown_Debug_2023A76[gUnknown_Debug_03004360][gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0] -= gUnknown_Debug_821F424[gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0][3];
+ }
+ }
+ if (gUnknown_Debug_030043A0 == 0)
+ {
+ debug_sub_8010AAC(0);
+ debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4);
+ }
+ debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0);
+ debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
+ }
+ AnimateSprites();
+ BuildOamBuffer();
+}
+#endif
+
+extern u16 gUnknown_Debug_821F564[][5];
+
+void debug_sub_8011498(void)
+{
+ u8 r9 = gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5;
+
+ if (gMain.heldKeysRaw == (L_BUTTON | SELECT_BUTTON))
+ DoSoftReset();
+ if (gMain.newKeysRaw == SELECT_BUTTON)
+ {
+ debug_sub_8012658();
+ SetMainCallback2(debug_sub_8010CAC);
+ }
+ if (gMain.newKeysRaw == START_BUTTON)
+ debug_sub_801174C();
+ if (gMain.newKeysRaw == DPAD_UP || gMain.newKeysRaw == DPAD_DOWN)
+ {
+ debug_sub_8012658();
+ gUnknown_Debug_030043A8 ^= 2;
+ debug_sub_8012628();
+ }
+ if (gMain.newKeysRaw == DPAD_LEFT || gMain.newKeysRaw == DPAD_RIGHT)
+ {
+ debug_sub_8012658();
+ gUnknown_Debug_030043A8 ^= 1;
+ debug_sub_8012628();
+ }
+ if (gMain.newAndRepeatedKeys & B_BUTTON)
+ {
+ gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8]--;
+ if (gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] < gUnknown_Debug_821F564[gUnknown_Debug_030043A8][4])
+ gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] = gUnknown_Debug_821F564[gUnknown_Debug_030043A8][3];
+ debug_sub_8012294();
+ }
+ if (gMain.newAndRepeatedKeys & A_BUTTON)
+ {
+ gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8]++;
+ if (gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] > gUnknown_Debug_821F564[gUnknown_Debug_030043A8][3])
+ gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] = gUnknown_Debug_821F564[gUnknown_Debug_030043A8][4];
+ debug_sub_8012294();
+ }
+ if (gMain.newAndRepeatedKeys & L_BUTTON)
+ {
+ gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] -= 10;
+ while (gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] < gUnknown_Debug_821F564[gUnknown_Debug_030043A8][4])
+ gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] += gUnknown_Debug_821F564[gUnknown_Debug_030043A8][3];
+ debug_sub_8012294();
+ }
+ if (gMain.newAndRepeatedKeys & R_BUTTON)
+ {
+ gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] += 10;
+ while (gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] > gUnknown_Debug_821F564[gUnknown_Debug_030043A8][3])
+ gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r9 / 5][gUnknown_Debug_030043A8] -= gUnknown_Debug_821F564[gUnknown_Debug_030043A8][3];
+ debug_sub_8012294();
+ }
+ AnimateSprites();
+ BuildOamBuffer();
+}
+
+extern const u16 gUnknown_Debug_821F598[];
+extern const u8 str_821F631[][6];
+extern const u8 Str_821F649[];
+extern const struct Pokeblock gUnknown_Debug_821F5AC[];
+
+extern u8 gUnknown_020297ED;
+
+extern void unref_sub_800D684(void);
+
+void debug_sub_801174C(void)
+{
+ u8 r9 = 0;
+ u8 r6;
+ s32 i;
+ s32 spC;
+ u16 sp10;
+
+ gUnknown_020297ED = 1;
+ r6 = Random() % 4;
+ StringCopy(gSaveBlock2.playerName, str_821F631[r6]);
+ gSaveBlock2.playerGender = r6 >> 1;
+ ZeroPlayerPartyMons();
+ ZeroEnemyPartyMons();
+ i = gUnknown_Debug_2023A76[0][30];
+ spC = 0;
+ if (i >= 10)
+ {
+ spC = 0;
+ while (i >= 10)
+ {
+ i -= 10;
+ spC++;
+ }
+ }
+ gBattleTypeFlags = gUnknown_Debug_821F598[i - 1];
+ gUnknown_02023A14_50 = 8;
+ gBattleTerrain = spC;
+ if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
+ EnterSafariMode();
+ if (gUnknown_Debug_2023A76[0][30] >= 2 && gUnknown_Debug_2023A76[0][30] <= 4)
+ gTrainerBattleOpponent = (Random() & 7) + 1;
+
+ gPlayerPartyCount = 0;
+ for (i = 0; i < 30; i += 5)
+ {
+ if (gUnknown_Debug_2023A76[0][i] != 0)
+ {
+ switch (gUnknown_Debug_2023A76[0][i + 4])
+ {
+ case 0:
+ case 2:
+ r6 = 0;
+ break;
+ case 1:
+ case 3:
+ r6 = 0xFE;
+ break;
+ default:
+ r6 = 0xFF;
+ break;
+ }
+ if (gUnknown_Debug_2023A76[0][i] == 0xC9 && i + 5 < 30)
+ r9 = gUnknown_Debug_2023A76[0][i + 7];
+ else
+ r9 = 0;
+ CreateMonWithGenderNatureLetter(
+ &gEnemyParty[i / 5],
+ gUnknown_Debug_2023A76[0][i],
+ gUnknown_Debug_2023A76[0][i + 1],
+ 0,
+ r6,
+ 0,
+ r9);
+ }
+ SetMonData(&gEnemyParty[i / 5], MON_DATA_HELD_ITEM, &gUnknown_Debug_2023A76[0][i + 2]);
+ sp10 = gUnknown_Debug_2023A76[0][i + 2] - 1;
+ if (sp10 <= 11)
+ SetMonData(&gEnemyParty[i / 5], MON_DATA_POKEBALL, &gUnknown_Debug_2023A76[0][i + 2]);
+ if (gUnknown_Debug_2023A76[0][i + 3] != 0 && gUnknown_Debug_2023A76[0][i + 3] != 3)
+ {
+ if (gUnknown_Debug_2023A76[0][i + 3] <= 2)
+ spC = gUnknown_Debug_2023A76[0][i + 3] - 1;
+ else
+ spC = gUnknown_Debug_2023A76[0][i + 3] - 4;
+ SetMonData(&gEnemyParty[i / 5], MON_DATA_ALT_ABILITY, &spC);
+ }
+
+ if (gUnknown_Debug_2023A76[1][i] != 0)
+ {
+ switch (gUnknown_Debug_2023A76[1][i + 4])
+ {
+ case 0:
+ case 2:
+ r6 = 0;
+ break;
+ case 1:
+ case 3:
+ r6 = 0xFE;
+ break;
+ default:
+ r6 = 0xFF;
+ break;
+ }
+ if (gUnknown_Debug_2023A76[1][i] == 0xC9 && i + 5 < 30)
+ r9 = gUnknown_Debug_2023A76[1][i + 7];
+ else
+ r9 = 0;
+ CreateMonWithGenderNatureLetter(
+ &gPlayerParty[i / 5],
+ gUnknown_Debug_2023A76[1][i],
+ gUnknown_Debug_2023A76[1][i + 1],
+ 0,
+ r6,
+ 0,
+ r9);
+ gPlayerPartyCount++;
+ }
+ SetMonData(&gPlayerParty[i / 5], MON_DATA_HELD_ITEM, &gUnknown_Debug_2023A76[1][i + 2]);
+ sp10 = gUnknown_Debug_2023A76[0][i + 2] - 1;
+ if (sp10 <= 11)
+ SetMonData(&gPlayerParty[i / 5], MON_DATA_POKEBALL, &gUnknown_Debug_2023A76[1][i + 2]);
+ if (gUnknown_Debug_2023A76[1][i + 3] != 0 && gUnknown_Debug_2023A76[1][i + 3] != 3)
+ {
+ if (gUnknown_Debug_2023A76[1][i + 3] <= 2)
+ spC = gUnknown_Debug_2023A76[1][i + 3] - 1;
+ else
+ spC = gUnknown_Debug_2023A76[1][i + 3] - 4;
+ SetMonData(&gPlayerParty[i / 5], MON_DATA_ALT_ABILITY, &spC);
+ }
+ if (gUnknown_Debug_2023A76[1][i + 3] > 2)
+ {
+ SetMonData(&gPlayerParty[i / 5], MON_DATA_OT_NAME, Str_821F649);
+ gUnknown_02023A14_50 |= 0x40;
+ }
+ }
+
+ for (spC = 0; spC < 6; spC++)
+ {
+ for (i = 0; i < 4; i++)
+ {
+ SetMonData(&gEnemyParty[spC], MON_DATA_MOVE1 + i, &gUnknown_Debug_2023B02[0][spC][i]);
+ SetMonData(&gEnemyParty[spC], MON_DATA_PP1 + i, &gBattleMoves[gUnknown_Debug_2023B02[0][spC][i]].pp);
+ SetMonData(&gPlayerParty[spC], MON_DATA_MOVE1 + i, &gUnknown_Debug_2023B02[1][spC][i]);
+ SetMonData(&gPlayerParty[spC], MON_DATA_PP1 + i, &gBattleMoves[gUnknown_Debug_2023B02[1][spC][i]].pp);
+ }
+ }
+
+ if (gUnknown_Debug_2023A76[0][0x22] == 8)
+ {
+ gUnknown_02023A14_50 |= 0x80;
+ sub_80408BC();
+ }
+ else if (gUnknown_Debug_2023A76[0][0x22] == 7)
+ {
+ gUnknown_02023A14_50 |= 0x20;
+ sub_80408BC();
+ }
+ else if (gUnknown_Debug_2023A76[0][0x22] == 6)
+ {
+ gUnknown_02023A14_50 |= 0x10;
+ if (gUnknown_Debug_2023A76[0][2] > 5)
+ gSharedMem[0x160A3] = gUnknown_Debug_2023A76[0][2] - 2;
+ else
+ gSharedMem[0x160A3] = gUnknown_Debug_2023A76[0][2];
+ sub_80408BC();
+ }
+ else if (gUnknown_Debug_2023A76[0][0x22] == 5)
+ {
+ gUnknown_02023A14_50 |= 0x21;
+ sub_80408BC();
+ }
+ else
+ {
+ if (!(gUnknown_Debug_2023A76[0][0x22] & 1))
+ sub_80408BC();
+ if (gUnknown_Debug_2023A76[0][0x22] & 2)
+ gUnknown_02023A14_50 |= 4;
+ if (gUnknown_Debug_2023A76[0][0x22] & 4)
+ gUnknown_02023A14_50 |= 6;
+ }
+
+ gMain.savedCallback = debug_sub_80108B8;
+ SetMainCallback2(unref_sub_800D684);
+
+ ClearBag();
+
+ AddBagItem(ITEM_MASTER_BALL, 10);
+ AddBagItem(ITEM_ULTRA_BALL, 10);
+ AddBagItem(ITEM_GREAT_BALL, 10);
+ AddBagItem(ITEM_POKE_BALL, 10);
+ AddBagItem(ITEM_SAFARI_BALL, 10);
+ AddBagItem(ITEM_NET_BALL, 10);
+ AddBagItem(ITEM_DIVE_BALL, 10);
+ AddBagItem(ITEM_NEST_BALL, 10);
+ AddBagItem(ITEM_REPEAT_BALL, 10);
+ AddBagItem(ITEM_TIMER_BALL, 10);
+ AddBagItem(ITEM_LUXURY_BALL, 10);
+ AddBagItem(ITEM_PREMIER_BALL, 10);
+
+ AddBagItem(ITEM_FULL_RESTORE, 99);
+ AddBagItem(ITEM_MAX_POTION, 99);
+ AddBagItem(ITEM_MAX_REVIVE, 99);
+ AddBagItem(ITEM_ETHER, 99);
+ AddBagItem(ITEM_MAX_ETHER, 99);
+ AddBagItem(ITEM_MAX_ELIXIR, 99);
+
+ AddBagItem(ITEM_GUARD_SPEC, 99);
+ AddBagItem(ITEM_DIRE_HIT, 99);
+ AddBagItem(ITEM_X_ATTACK, 99);
+ AddBagItem(ITEM_X_DEFEND, 99);
+ AddBagItem(ITEM_X_SPEED, 99);
+ AddBagItem(ITEM_X_ACCURACY, 99);
+ // hmm... no X Special? Why do we need Poke Doll?
+ AddBagItem(ITEM_POKE_DOLL, 99);
+
+ for (i = 0; i < 15; i++)
+ sub_810CA34(&gUnknown_Debug_821F5AC[i]);
+}
+
+void debug_sub_8011D40(void)
+{
+ DmaCopy16(3, gSharedMem, (void *)(VRAM + 0x4000), 0x1000);
+ 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 = gBattle_BG3_X;
+ REG_BG3VOFS = gBattle_BG3_Y;
+ LoadOam();
+ ProcessSpriteCopyRequests();
+}
+
+void debug_nullsub_45()
+{
+}
+
+void debug_sub_8011DD4(void)
+{
+ REG_BG0CNT = 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 = gBattle_BG3_X;
+ REG_BG3VOFS = gBattle_BG3_Y;
+
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ ScanlineEffect_InitHBlankDmaTransfer();
+}
+
+void debug_sub_8011E5C(void)
+{
+ s32 i;
+
+ for (i = 0; i < 31; i++)
+ debug_sub_8011EA0(i);
+}
+
+extern u8 gUnknown_Debug_030043A8;
+
+void debug_sub_8011E74(void)
+{
+ u8 r5 = gUnknown_Debug_030043A8;
+
+ for (gUnknown_Debug_030043A8 = 0; gUnknown_Debug_030043A8 < 4; gUnknown_Debug_030043A8++)
+ debug_sub_8012294();
+
+ gUnknown_Debug_030043A8 = r5;
+}
+
+extern const u8 Str_821F624[];
+
+void debug_sub_8011EA0(u8 a)
+{
+ u32 length;
+
+ switch (a)
+ {
+ case 0:
+ case 5:
+ case 10:
+ case 15:
+ case 20:
+ case 25:
+ debug_sub_8010A7C(0, 20);
+ Text_InitWindow(
+ &gUnknown_Debug_03004370,
+ gBattleTextBuff1,
+ gUnknown_Debug_821F424[a][0],
+ gUnknown_Debug_821F424[a][1],
+ gUnknown_Debug_821F424[a][2]);
+ Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
+ ConvertIntToDecimalStringN(gBattleTextBuff1, gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a], 2, 3);
+ Text_InitWindow(
+ &gUnknown_Debug_03004370,
+ gBattleTextBuff1,
+ 422,
+ gUnknown_Debug_03004360 * 32 + 25,
+ 0);
+ Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
+ gBattleTextBuff1[0] = EOS;
+ StringAppend(gBattleTextBuff1, gSpeciesNames[gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a]]);
+ Text_InitWindow(
+ &gUnknown_Debug_03004370,
+ gBattleTextBuff1,
+ gUnknown_Debug_821F424[a][0],
+ gUnknown_Debug_821F424[a][1],
+ gUnknown_Debug_821F424[a][2]);
+ Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
+ break;
+ case 1:
+ case 6:
+ case 11:
+ case 16:
+ case 21:
+ case 26:
+ case 30:
+ ConvertIntToDecimalStringN(gBattleTextBuff1, gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a], 2, 3);
+ Text_InitWindow(
+ &gUnknown_Debug_03004370,
+ gBattleTextBuff1,
+ gUnknown_Debug_821F424[a][0],
+ gUnknown_Debug_821F424[a][1],
+ gUnknown_Debug_821F424[a][2]);
+ Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
+ break;
+ case 2:
+ case 7:
+ case 12:
+ case 17:
+ case 22:
+ case 27:
+ debug_sub_8010A7C(0, 24);
+ Text_InitWindow(
+ &gUnknown_Debug_03004370,
+ gBattleTextBuff1,
+ gUnknown_Debug_821F424[a][0],
+ gUnknown_Debug_821F424[a][1],
+ gUnknown_Debug_821F424[a][2]);
+ Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
+ ConvertIntToDecimalStringN(gBattleTextBuff1, gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a], 2, 3);
+ Text_InitWindow(
+ &gUnknown_Debug_03004370,
+ gBattleTextBuff1,
+ 422,
+ gUnknown_Debug_03004360 * 32 + 25,
+ 0);
+ Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
+ gBattleTextBuff1[0] = EOS;
+ if (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a] != 0)
+ StringAppend(gBattleTextBuff1, ItemId_GetName(gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a]));
+ else
+ StringAppend(gBattleTextBuff1, Str_821F624);
+ Text_InitWindow(
+ &gUnknown_Debug_03004370,
+ gBattleTextBuff1,
+ gUnknown_Debug_821F424[a][0],
+ gUnknown_Debug_821F424[a][1],
+ gUnknown_Debug_821F424[a][2]);
+ Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
+ break;
+ case 4:
+ case 9:
+ case 14:
+ case 19:
+ case 24:
+ case 29:
+ debug_sub_8010A7C(0, 4);
+ Text_InitWindow(
+ &gUnknown_Debug_03004370,
+ gBattleTextBuff1,
+ gUnknown_Debug_821F424[a][0],
+ gUnknown_Debug_821F424[a][1],
+ gUnknown_Debug_821F424[a][2]);
+ Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
+ length = 0;
+ switch (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a])
+ {
+ case 0:
+ gBattleTextBuff1[0] = CHAR_MALE;
+ length = 1;
+ break;
+ case 1:
+ gBattleTextBuff1[0] = CHAR_FEMALE;
+ length = 1;
+ break;
+ case 2:
+ gBattleTextBuff1[0] = CHAR_MALE;
+ gBattleTextBuff1[1] = CHAR_MALE;
+ length = 2;
+ break;
+ case 3:
+ gBattleTextBuff1[0] = CHAR_FEMALE;
+ gBattleTextBuff1[1] = CHAR_FEMALE;
+ length = 2;
+ break;
+ default:
+ gBattleTextBuff1[length] = CHAR_QUESTION_MARK;
+ length++;
+ break;
+ }
+ gBattleTextBuff1[length] = EOS;
+ Text_InitWindow(
+ &gUnknown_Debug_03004370,
+ gBattleTextBuff1,
+ gUnknown_Debug_821F424[a][0],
+ gUnknown_Debug_821F424[a][1],
+ gUnknown_Debug_821F424[a][2]);
+ Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
+ break;
+ case 3:
+ case 8:
+ case 13:
+ case 18:
+ case 23:
+ case 28:
+ default:
+ ConvertIntToDecimalStringN(gBattleTextBuff1, gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a], 2, 1);
+ Text_InitWindow(
+ &gUnknown_Debug_03004370,
+ gBattleTextBuff1,
+ gUnknown_Debug_821F424[a][0],
+ gUnknown_Debug_821F424[a][1],
+ gUnknown_Debug_821F424[a][2]);
+ Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
+ break;
+ case 31:
+ case 32:
+ case 33:
+ case 34:
+ break;
+ }
+}
+
+void debug_sub_8012294(void)
+{
+ u8 r5 = gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5;
+
+ if (r5 < 30)
+ {
+ debug_sub_8010A7C(0, 24);
+ Text_InitWindow(
+ &gUnknown_Debug_03004370,
+ gBattleTextBuff1,
+ gUnknown_Debug_821F564[gUnknown_Debug_030043A8][0],
+ gUnknown_Debug_821F564[gUnknown_Debug_030043A8][1],
+ gUnknown_Debug_821F564[gUnknown_Debug_030043A8][2]);
+ Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
+ ConvertIntToDecimalStringN(gBattleTextBuff1, gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r5 / 5][gUnknown_Debug_030043A8], 2, 3);
+ Text_InitWindow(
+ &gUnknown_Debug_03004370,
+ gBattleTextBuff1,
+ 422,
+ gUnknown_Debug_03004360 * 32 + 25,
+ 0);
+ Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
+ gBattleTextBuff1[0] = EOS;
+ StringAppend(gBattleTextBuff1, gMoveNames[gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r5 / 5][gUnknown_Debug_030043A8]]);
+ Text_InitWindow(
+ &gUnknown_Debug_03004370,
+ gBattleTextBuff1,
+ gUnknown_Debug_821F564[gUnknown_Debug_030043A8][0],
+ gUnknown_Debug_821F564[gUnknown_Debug_030043A8][1],
+ gUnknown_Debug_821F564[gUnknown_Debug_030043A8][2]);
+ Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
+ }
+}
+
+extern const u16 gUnknown_Debug_821F58C[];
+
+void debug_sub_80123D8(u8 a)
+{
+ if (a < 30)
+ {
+ debug_sub_8010A7C(0, 18);
+ Text_InitWindow(
+ &gUnknown_Debug_03004370,
+ gBattleTextBuff1,
+ gUnknown_Debug_821F58C[0],
+ gUnknown_Debug_821F58C[1],
+ gUnknown_Debug_821F58C[2]);
+ Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
+ StringCopy(gBattleTextBuff1, gAbilityNames[gBaseStats[gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a]].ability1]);
+ Text_InitWindow(
+ &gUnknown_Debug_03004370,
+ gBattleTextBuff1,
+ gUnknown_Debug_821F58C[0],
+ gUnknown_Debug_821F58C[1],
+ gUnknown_Debug_821F58C[2]);
+ Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
+ debug_sub_8010A7C(0, 18);
+ Text_InitWindow(
+ &gUnknown_Debug_03004370,
+ gBattleTextBuff1,
+ gUnknown_Debug_821F58C[3],
+ gUnknown_Debug_821F58C[4],
+ gUnknown_Debug_821F58C[5]);
+ Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
+ StringCopy(gBattleTextBuff1, gAbilityNames[gBaseStats[gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a]].ability2]);
+ Text_InitWindow(
+ &gUnknown_Debug_03004370,
+ gBattleTextBuff1,
+ gUnknown_Debug_821F58C[3],
+ gUnknown_Debug_821F58C[4],
+ gUnknown_Debug_821F58C[5]);
+ Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
+ }
+ else
+ {
+ StringCopy(gBattleTextBuff1, gAbilityNames[0]);
+ Text_InitWindow(
+ &gUnknown_Debug_03004370,
+ gBattleTextBuff1,
+ gUnknown_Debug_821F58C[0],
+ gUnknown_Debug_821F58C[1],
+ gUnknown_Debug_821F58C[2]);
+ Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
+ Text_InitWindow(
+ &gUnknown_Debug_03004370,
+ gBattleTextBuff1,
+ gUnknown_Debug_821F58C[3],
+ gUnknown_Debug_821F58C[4],
+ gUnknown_Debug_821F58C[5]);
+ Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
+ }
+}
+
+void debug_sub_8012540(void)
+{
+ ConvertIntToDecimalStringN(gBattleTextBuff1, gUnknown_Debug_2023A76[0][0x22], 0, 1);
+ Text_InitWindow(
+ &gUnknown_Debug_03004370,
+ gBattleTextBuff1,
+ gUnknown_Debug_821F424[31][0],
+ gUnknown_Debug_821F424[31][1],
+ gUnknown_Debug_821F424[31][2]);
+ Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
+}
+
+void debug_nullsub_3(void)
+{
+}
+
+extern const u32 gUnknown_Debug_821F680[][0x23];
+
+void debug_sub_80125A0(void)
+{
+ gSharedMem[gUnknown_Debug_821F680[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5]] = 0x6D;
+}
+
+void debug_sub_80125E4(void)
+{
+ gSharedMem[gUnknown_Debug_821F680[gUnknown_Debug_03004360][gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5]] = 0x81;
+}
+
+void debug_sub_8012628(void)
+{
+ gSharedMem[gUnknown_Debug_821F798[gUnknown_Debug_03004360][gUnknown_Debug_030043A8]] = 0x6D;
+}
+
+void debug_sub_8012658(void)
+{
+ gSharedMem[gUnknown_Debug_821F798[gUnknown_Debug_03004360][gUnknown_Debug_030043A8]] = 0x81;
+}
+
+void debug_sub_8012688(void)
+{
+ s32 i;
+ u8 spriteId;
+ u8 taskId;
+
+ for (i = 0; i < 411; i++)
+ gUnknown_Debug_2023B62[i] = 0;
+ SetHBlankCallback(NULL);
+ SetVBlankCallback(NULL);
+ DmaFill32(3, 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;
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6C58);
+ ResetPaletteFade();
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = DISPLAY_HEIGHT;
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ gBattle_BG2_X = 0;
+ gBattle_BG2_Y = 0;
+ gBattle_BG3_X = 0;
+ gBattle_BG3_Y = 0;
+ gBattleTerrain = 9;
+ sub_800D6D4();
+ LoadBattleTextboxAndBackground();
+ ResetSpriteData();
+ ResetTasks();
+ FreeAllSpritePalettes();
+ gReservedSpritePaletteCount = 4;
+ gCurrentMove = 1;
+ Text_InitWindowWithTemplate(&gUnknown_03004210, &gWindowTemplate_81E6C58);
+ DecompressPicFromTable_2(
+ &gMonFrontPicTable[gCurrentMove],
+ gMonFrontPicCoords[gCurrentMove].coords,
+ gMonFrontPicCoords[gCurrentMove].y_offset,
+ (void *)0x02000000,
+ gUnknown_081FAF4C[1],
+ gCurrentMove);
+ LoadCompressedPalette(gMonPaletteTable[gCurrentMove].data, 272, 32);
+ GetMonSpriteTemplate_803C56C(gCurrentMove, 1);
+ spriteId = CreateSprite(&gUnknown_02024E8C, 176, 40 + gMonFrontPicCoords[gCurrentMove].y_offset, 40);
+ gSprites[spriteId].callback = nullsub_37;
+ gSprites[spriteId].oam.paletteNum = 1;
+ REG_DISPCNT = 0x1F40;
+ SetHBlankCallback(debug_nullsub_45);
+ SetVBlankCallback(debug_sub_8011DD4);
+ m4aMPlayAllStop();
+ taskId = CreateTask(debug_sub_8012D10, 0);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = spriteId;
+ SetMainCallback2(debug_sub_8012878);
+}
+
+void debug_sub_8012878(void)
+{
+ AnimateSprites();
+ BuildOamBuffer();
+ Text_UpdateWindowInBattle(&gUnknown_03004210);
+ UpdatePaletteFade();
+ RunTasks();
+ if (gMain.heldKeys == (SELECT_BUTTON | R_BUTTON))
+ SetMainCallback2(debug_sub_80108B8);
+}
+
+void debug_sub_80128B4(void)
+{
+ debug_sub_8010A7C(0, 9);
+ Text_InitWindow(&gUnknown_03004210, gBattleTextBuff1, 144, 2, 35);
+ Text_PrintWindow8002F44(&gUnknown_03004210);
+ ConvertIntToDecimalStringN(gBattleTextBuff1, gCurrentMove, 2, 3);
+ gBattleTextBuff1[3] = CHAR_SPACE;
+ gBattleTextBuff1[4] = EOS;
+ StringAppend(gBattleTextBuff1, gSpeciesNames[gCurrentMove]);
+ Text_InitWindow(&gUnknown_03004210, gBattleTextBuff1, 144, 2, 35);
+ Text_PrintWindow8002F44(&gUnknown_03004210);
+}
+
+void debug_sub_8012938(u8 taskId)
+{
+ debug_sub_8010A7C(0, 7);
+ Text_InitWindow(&gUnknown_03004210, gBattleTextBuff1, 162, 2, 37);
+ Text_PrintWindow8002F44(&gUnknown_03004210);
+ StringCopy(gBattleTextBuff1, Str_821F7B8);
+ ConvertIntToDecimalStringN(gBattleTextBuff1 + 4, gUnknown_Debug_2023B62[gCurrentMove - 1], 2, 3);
+ Text_InitWindow(&gUnknown_03004210, gBattleTextBuff1, 162, 2, 37);
+ Text_PrintWindow8002F44(&gUnknown_03004210);
+ gSprites[gTasks[taskId].data[1]].pos2.y = -gUnknown_Debug_2023B62[gCurrentMove - 1];
+}
+
+void debug_sub_80129F8(u8 taskId)
+{
+ DecompressPicFromTable_2(
+ &gMonFrontPicTable[gCurrentMove],
+ gMonFrontPicCoords[gCurrentMove].coords,
+ gMonFrontPicCoords[gCurrentMove].y_offset,
+ (void *)0x02000000,
+ gUnknown_081FAF4C[1],
+ gCurrentMove);
+ LoadCompressedPalette(gMonPaletteTable[gCurrentMove].data, 272, 32);
+ gSprites[gTasks[taskId].data[1]].pos1.y = gMonFrontPicCoords[gCurrentMove].y_offset + 40;
+ gSprites[gTasks[taskId].data[1]].pos2.y = -gUnknown_Debug_2023B62[gCurrentMove - 1];
+ StartSpriteAnim(&gSprites[gTasks[taskId].data[1]], 0);
+}
+
+void debug_sub_8012AC0(s8 a, u8 taskId)
+{
+ do
+ {
+ gCurrentMove += a;
+ if (gCurrentMove == 0)
+ gCurrentMove = 411;
+ if (gCurrentMove == 411)
+ gCurrentMove = 1;
+ } while (gBaseStats[gCurrentMove].type1 != 2 && gBaseStats[gCurrentMove].type2 != 2);
+ debug_sub_80128B4();
+ debug_sub_8012938(taskId);
+ debug_sub_80129F8(taskId);
+}
+
+void debug_sub_8012B2C(u8 a)
+{
+ *(u16 *)(VRAM + 0xC000 + 0x772 + (a * 4 + 0) * 0x20) = 1;
+ *(u16 *)(VRAM + 0xC000 + 0x772 + (a * 4 + 2) * 0x20) = 2;
+}
+
+void debug_sub_8012B4C(u8 a)
+{
+ *(u16 *)(VRAM + 0xC000 + 0x772 + (a * 4 + 0) * 0x20) = 0x1016;
+ *(u16 *)(VRAM + 0xC000 + 0x772 + (a * 4 + 2) * 0x20) = 0x1016;
+}
+
+void debug_sub_8012B70(u8 taskId, u8 b)
+{
+ if (b != 0)
+ {
+ sub_802BBD4(24, 28, 29, 33, 1);
+ debug_sub_80128B4();
+ debug_sub_8012938(taskId);
+ debug_sub_80129F8(taskId);
+ gTasks[taskId].data[0] = 1;
+ }
+ else
+ {
+ sub_802BBD4(24, 28, 29, 33, 0);
+ gTasks[taskId].data[0] = 2;
+ Text_InitWindow(&gUnknown_03004210, Str_821F7DA, 656, 26, 29);
+ Text_PrintWindow8002F44(&gUnknown_03004210);
+ gTasks[taskId].data[3] = 0;
+ debug_sub_8012B2C(0);
+ }
+}
+
+void debug_sub_8012C08(u8 taskId, u8 b)
+{
+ debug_sub_8010A7C(0, 9);
+ Text_InitWindow(&gUnknown_03004210, gBattleTextBuff1, 144, 2, 35);
+ Text_PrintWindow8002F44(&gUnknown_03004210);
+ debug_sub_8010A7C(0, 7);
+ Text_InitWindow(&gUnknown_03004210, gBattleTextBuff1, 162, 2, 37);
+ Text_PrintWindow8002F44(&gUnknown_03004210);
+ sub_802BBD4(24, 28, 29, 33, 0);
+ if (b != 0)
+ {
+ gTasks[taskId].data[0] = 4;
+ Text_InitWindow(&gUnknown_03004210, gUnknown_Debug_821F7F3, 144, 2, 35);
+ }
+ else
+ {
+ gTasks[taskId].data[0] = 3;
+ Text_InitWindow(&gUnknown_03004210, Str_821F7EA, 144, 2, 35);
+ }
+ Text_PrintWindow8002F44(&gUnknown_03004210);
+ Text_InitWindow(&gUnknown_03004210, BattleText_YesNo, 656, 26, 29);
+ Text_PrintWindow8002F44(&gUnknown_03004210);
+ gTasks[taskId].data[3] = 1;
+ debug_sub_8012B2C(1);
+}
+
+void debug_sub_8012D10(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ debug_sub_80128B4();
+ debug_sub_8012938(taskId);
+ Text_InitWindow(&gUnknown_03004210, Str_821F7BD, 400, 19, 35);
+ Text_PrintWindow8002F44(&gUnknown_03004210);
+ gTasks[taskId].data[0]++;
+ sub_802E3E4(gTasks[taskId].data[2], 0);
+ break;
+ case 1:
+ if (gMain.newKeys & DPAD_UP)
+ {
+ PlaySE(SE_SELECT);
+ nullsub_8(gTasks[taskId].data[2]);
+ gTasks[taskId].data[2] &= ~2;
+ sub_802E3E4(gTasks[taskId].data[2], 0);
+ }
+ else if (gMain.newKeys & DPAD_DOWN)
+ {
+ PlaySE(SE_SELECT);
+ nullsub_8(gTasks[taskId].data[2]);
+ gTasks[taskId].data[2] |= 2;
+ sub_802E3E4(gTasks[taskId].data[2], 0);
+ }
+ else if (gMain.newKeys & DPAD_LEFT)
+ {
+ PlaySE(SE_SELECT);
+ nullsub_8(gTasks[taskId].data[2]);
+ gTasks[taskId].data[2] &= ~1;
+ sub_802E3E4(gTasks[taskId].data[2], 0);
+ }
+ else if (gMain.newKeys & DPAD_RIGHT)
+ {
+ PlaySE(SE_SELECT);
+ nullsub_8(gTasks[taskId].data[2]);
+ gTasks[taskId].data[2] |= 1;
+ sub_802E3E4(gTasks[taskId].data[2], 0);
+ }
+ else if (gMain.newAndRepeatedKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ switch (gTasks[taskId].data[2])
+ {
+ case 0:
+ if (gUnknown_Debug_2023B62[gCurrentMove - 1] < 64)
+ {
+ gUnknown_Debug_2023B62[gCurrentMove - 1] += 1;
+ debug_sub_8012938(taskId);
+ }
+ break;
+ case 1:
+ debug_sub_8012AC0(1, taskId);
+ break;
+ case 2:
+ if (gCurrentMove < 411)
+ gCurrentMove++;
+ else
+ gCurrentMove = 1;
+ debug_sub_80128B4();
+ debug_sub_8012938(taskId);
+ debug_sub_80129F8(taskId);
+ break;
+ case 3:
+ debug_sub_8012B70(taskId, 0);
+ break;
+ }
+ }
+ else if (gMain.newAndRepeatedKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ switch (gTasks[taskId].data[2])
+ {
+ case 0:
+ if (gUnknown_Debug_2023B62[gCurrentMove - 1] > 0)
+ {
+ gUnknown_Debug_2023B62[gCurrentMove - 1] -= 1;
+ debug_sub_8012938(taskId);
+ }
+ break;
+ case 1:
+ debug_sub_8012AC0(-1, taskId);
+ break;
+ case 2:
+ if (gCurrentMove > 1)
+ gCurrentMove--;
+ else
+ gCurrentMove = 411;
+ debug_sub_80128B4();
+ debug_sub_8012938(taskId);
+ debug_sub_80129F8(taskId);
+ break;
+ case 3:
+ debug_sub_8012B70(taskId, 0);
+ break;
+ }
+ }
+ else if (gMain.newAndRepeatedKeys & R_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ switch (gTasks[taskId].data[2])
+ {
+ case 0:
+ if (gUnknown_Debug_2023B62[gCurrentMove - 1] < 64)
+ {
+ gUnknown_Debug_2023B62[gCurrentMove - 1] += 8;
+ if (gUnknown_Debug_2023B62[gCurrentMove - 1] > 64)
+ gUnknown_Debug_2023B62[gCurrentMove - 1] = 64;
+ debug_sub_8012938(taskId);
+ }
+ break;
+ case 1:
+ debug_sub_8012AC0(1, taskId);
+ break;
+ case 2:
+ if (gCurrentMove + 10 < 412)
+ gCurrentMove += 10;
+ else
+ gCurrentMove -= 400;
+ debug_sub_80128B4();
+ debug_sub_8012938(taskId);
+ debug_sub_80129F8(taskId);
+ break;
+ case 3:
+ debug_sub_8012B70(taskId, 0);
+ break;
+ }
+ }
+ else if (gMain.newAndRepeatedKeys & L_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ switch (gTasks[taskId].data[2])
+ {
+ case 0:
+ if (gUnknown_Debug_2023B62[gCurrentMove - 1] > 0)
+ {
+ if (gUnknown_Debug_2023B62[gCurrentMove - 1] > 8)
+ gUnknown_Debug_2023B62[gCurrentMove - 1] -= 8;
+ else
+ gUnknown_Debug_2023B62[gCurrentMove - 1] = 0;
+ debug_sub_8012938(taskId);
+ }
+ break;
+ case 1:
+ debug_sub_8012AC0(-1, taskId);
+ break;
+ case 2:
+ if (gCurrentMove - 10 > 1)
+ gCurrentMove -= 10;
+ else
+ gCurrentMove += 400;
+ debug_sub_80128B4();
+ debug_sub_8012938(taskId);
+ debug_sub_80129F8(taskId);
+ break;
+ case 3:
+ debug_sub_8012B70(taskId, 0);
+ break;
+ }
+ }
+ break;
+ case 2:
+ if (gMain.newKeys & DPAD_UP)
+ {
+ PlaySE(SE_SELECT);
+ debug_sub_8012B4C(gTasks[taskId].data[3]);
+ gTasks[taskId].data[3] = 0;
+ debug_sub_8012B2C(0);
+ }
+ else if (gMain.newKeys & DPAD_DOWN)
+ {
+ PlaySE(SE_SELECT);
+ debug_sub_8012B4C(gTasks[taskId].data[3]);
+ gTasks[taskId].data[3] = 1;
+ debug_sub_8012B2C(1);
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ debug_sub_8012C08(taskId, gTasks[taskId].data[3]);
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ asm("");
+ debug_sub_8012B70(taskId, 1);
+ }
+ return;
+ case 3:
+ if (gMain.newKeys & DPAD_UP)
+ {
+ PlaySE(SE_SELECT);
+ debug_sub_8012B4C(gTasks[taskId].data[3]);
+ gTasks[taskId].data[3] = 0;
+ debug_sub_8012B2C(0);
+ }
+ else if (gMain.newKeys & DPAD_DOWN)
+ {
+ PlaySE(SE_SELECT);
+ debug_sub_8012B4C(gTasks[taskId].data[3]);
+ gTasks[taskId].data[3] = 1;
+ debug_sub_8012B2C(1);
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ if (gTasks[taskId].data[3] == 0)
+ debug_sub_80132C8(31, gUnknown_Debug_2023B62, 411);
+ debug_sub_8012B70(taskId, 1);
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ debug_sub_8012B70(taskId, 1);
+ }
+ break;
+ case 4:
+ if (gMain.newKeys & DPAD_UP)
+ {
+ PlaySE(SE_SELECT);
+ debug_sub_8012B4C(gTasks[taskId].data[3]);
+ gTasks[taskId].data[3] = 0;
+ debug_sub_8012B2C(0);
+ }
+ else if (gMain.newKeys & DPAD_DOWN)
+ {
+ PlaySE(SE_SELECT);
+ debug_sub_8012B4C(gTasks[taskId].data[3]);
+ gTasks[taskId].data[3] = 1;
+ debug_sub_8012B2C(1);
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ if (gTasks[taskId].data[3] == 0)
+ debug_sub_8013294(31, gUnknown_Debug_2023B62, 411);
+ debug_sub_8012B70(taskId, 1);
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ debug_sub_8012B70(taskId, 1);
+ }
+ break;
+ }
+}
+
+u8 debug_sub_8013240(void)
+{
+ if (IdentifyFlash() == 0)
+ return 0;
+ else
+ return 1;
+}
+
+u32 debug_sub_8013258(u16 sectorNum, u8 *data, u32 size)
+{
+ while (1)
+ {
+ if (ProgramFlashSectorAndVerify(sectorNum, data) != 0)
+ return 0;
+ if (size <= 0x1000)
+ break;
+ size -= 0x1000;
+ data += 0x1000;
+ sectorNum++;
+ }
+ return 1;
+}
+
+u32 debug_sub_8013294(u8 sectorNum, void *data, u32 size)
+{
+ u32 result;
+
+ if (debug_sub_8013240() != 0)
+ return 0;
+ m4aSoundVSyncOff();
+ result = debug_sub_8013258(sectorNum, data, size);
+ m4aSoundVSyncOn();
+ return result;
+}
+
+void debug_sub_80132C8(u8 a, void *b, u32 c)
+{
+ if (debug_sub_8013240() == 0)
+ ReadFlash(a, 0, b, c);
+}
+#endif
+
void oac_poke_opponent(struct Sprite *sprite)
{
sprite->callback = sub_8010278;
@@ -1492,7 +3493,7 @@ void dp11b_obj_instanciate(u8 bank, u8 b, s8 c, s8 d)
}
else
{
- objectID = gObjectBankIDs[bank];
+ objectID = gBankSpriteIds[bank];
ewram17810[bank].unk3 = spriteId;
ewram17810[bank].unk0_2 = 1;
gSprites[spriteId].data[0] = 0xC0;
@@ -1554,12 +3555,68 @@ void sub_8010800(void)
gBattleMainFunc = bc_8012FAC;
}
-void sub_8010824(void)
+#if DEBUG
+void debug_sub_80138CC(void)
{
- gBattleMainFunc();
+ if (GetBankSide(gActiveBank) == 0)
+ {
+ switch (gSharedMem[0x160FD])
+ {
+ case 0:
+ if (gBattleBankFunc[gActiveBank] == sub_802C098)
+ gSharedMem[0x160FD]++;
+ break;
+ case 1:
+ gMain.heldKeys = A_BUTTON;
+ gMain.newKeys = A_BUTTON;
+ gSharedMem[0x160FD]++;
+ gSharedMem[0x160FE] = 0x80;
+ break;
+ case 2:
+ gSharedMem[0x160FE]--;
+ if (gSharedMem[0x160FE] == 0)
+ {
+ gMain.heldKeys = A_BUTTON;
+ gMain.newKeys = A_BUTTON;
+ gSharedMem[0x160FD]++;
+ gSharedMem[0x160FE] = 0x80;
+ }
+ break;
+ case 3:
+ gSharedMem[0x160FE]--;
+ if (gSharedMem[0x160FE] == 0)
+ {
+ gMain.heldKeys = A_BUTTON;
+ gMain.newKeys = A_BUTTON;
+ gSharedMem[0x160FD]++;
+ }
+ break;
+ case 4:
+ gSharedMem[0x160FD] = 0;
+ break;
+ }
+ }
+}
+#endif
- for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
- gBattleBankFunc[gActiveBank]();
+void sub_8010824(void)
+{
+#if DEBUG
+ if (gUnknown_02023A14_50 & 0x80)
+ {
+ for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ debug_sub_80138CC();
+ gBattleMainFunc();
+ for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ gBattleBankFunc[gActiveBank]();
+ }
+ else
+#endif
+ {
+ gBattleMainFunc();
+ for (gActiveBank = 0; gActiveBank < gNoOfAllBanks; gActiveBank++)
+ gBattleBankFunc[gActiveBank]();
+ }
}
void sub_8010874(void)
@@ -1662,6 +3719,10 @@ void sub_8010874(void)
gBattleResults.pokeString2[i] = 0;
gBattleResults.caughtNick[i] = 0;
}
+#if DEBUG
+ gSharedMem[0x1609E] = 0;
+ gSharedMem[0x1609F] = 0;
+#endif
}
void SwitchInClearSetData(void)
@@ -4141,6 +6202,7 @@ void SetActionsAndBanksTurnOrder(void)
}
}
}
+
gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts;
eFocusPunchBank = 0;
}
@@ -4721,9 +6783,8 @@ void HandleAction_UseItem(void)
}
else
{
- ewram16003 = gBankAttacker;
- switch (ewram160D8(gBankAttacker))
+ switch (ewram160D8((ewram16003 = gBankAttacker)))
{
case AI_ITEM_FULL_RESTORE:
case AI_ITEM_HEAL_HP:
diff --git a/src/battle/battle_4.c b/src/battle/battle_4.c
index 3763fc309..f10cd2506 100644
--- a/src/battle/battle_4.c
+++ b/src/battle/battle_4.c
@@ -95,6 +95,7 @@ enum
};
//extern needed variables
+extern u8 gUnknown_02023A14_50;
extern u8 gCritMultiplier;
extern s32 gBattleMoveDamage;
extern u32 gStatuses3[BATTLE_BANKS_COUNT];
@@ -5018,20 +5019,26 @@ _0801F610: .4byte BattleScript_SAtkDown2\n\
}
#endif // NONMATCHING
-
static void atk15_seteffectwithchance(void)
{
u32 PercentChance;
+
if (gBattleMons[gBankAttacker].ability == ABILITY_SERENE_GRACE)
PercentChance = gBattleMoves[gCurrentMove].secondaryEffectChance * 2;
else
PercentChance = gBattleMoves[gCurrentMove].secondaryEffectChance;
- if (gBattleCommunication[MOVE_EFFECT_BYTE] & 0x80 && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT))
+
+ if (DEBUG && (gUnknown_02023A14_50 & 4)
+ && !(gBattleCommunication[MOVE_EFFECT_BYTE] & 0x80) && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT))
+ {
+ SetMoveEffect(0, 0);
+ }
+ else if ((gBattleCommunication[MOVE_EFFECT_BYTE] & 0x80) && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT))
{
gBattleCommunication[MOVE_EFFECT_BYTE] &= 0x7F;
SetMoveEffect(0, 0x80);
}
- else if (Random() % 100 <= PercentChance && gBattleCommunication[MOVE_EFFECT_BYTE] && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT))
+ else if (Random() % 100 <= PercentChance && gBattleCommunication[MOVE_EFFECT_BYTE] != 0 && !(gBattleMoveFlags & MOVESTATUS_NOEFFECT))
{
if (PercentChance >= 100)
SetMoveEffect(0, 0x80);
@@ -5039,7 +5046,10 @@ static void atk15_seteffectwithchance(void)
SetMoveEffect(0, 0);
}
else
+ {
gBattlescriptCurrInstr++;
+ }
+
gBattleCommunication[MOVE_EFFECT_BYTE] = 0;
gBattleStruct->unk16112 = 0;
}
@@ -12620,6 +12630,193 @@ static void atk9D_mimicattackcopy(void)
}
}
+#if DEBUG
+__attribute__((naked))
+static void atk9E_metronome(void)
+{
+ asm("\
+ push {r4, r5, r6, r7, lr}\n\
+ mov r7, r8\n\
+ push {r7}\n\
+ ldr r6, ._3076 @ gBankAttacker\n\
+ ldrb r2, [r6]\n\
+ lsl r1, r2, #0x1\n\
+ ldr r0, ._3076 + 4 @ \n\
+ add r3, r1, r0\n\
+ ldr r5, ._3076 + 8 @ \n\
+ mov r4, #0x58\n\
+ add r0, r2, #0\n\
+ mul r0, r0, r4\n\
+ add r1, r0, r5\n\
+ ldrh r0, [r1, #0xe]\n\
+ cmp r0, #0\n\
+ bne ._3071 @cond_branch\n\
+ ldrh r2, [r1, #0x10]\n\
+ cmp r2, #0\n\
+ beq ._3071 @cond_branch\n\
+ ldrh r0, [r1, #0x12]\n\
+ cmp r0, #0\n\
+ beq ._3071 @cond_branch\n\
+ ldrh r0, [r3]\n\
+ cmp r0, #0\n\
+ bne ._3072 @cond_branch\n\
+ strh r2, [r3]\n\
+._3072:\n\
+ ldr r1, ._3076 + 12 @ \n\
+ ldrh r0, [r3]\n\
+ strh r0, [r1]\n\
+ ldrb r0, [r6]\n\
+ mul r0, r0, r4\n\
+ add r0, r0, r5\n\
+ ldrh r5, [r0, #0x10]\n\
+ ldrh r2, [r0, #0x12]\n\
+ add r7, r1, #0\n\
+ cmp r5, r2\n\
+ bcs ._3073 @cond_branch\n\
+ ldrh r0, [r3]\n\
+ cmp r0, r2\n\
+ beq ._3074 @cond_branch\n\
+ add r0, r0, #0x1\n\
+ b ._3079\n\
+._3077:\n\
+ .align 2, 0\n\
+._3076:\n\
+ .word gBankAttacker\n\
+ .word +0x20160b4\n\
+ .word gBattleMons\n\
+ .word gCurrentMove\n\
+._3073:\n\
+ ldrh r4, [r3]\n\
+ add r1, r4, #0\n\
+ mov r0, #0xb1\n\
+ lsl r0, r0, #0x1\n\
+ cmp r1, r0\n\
+ bne ._3078 @cond_branch\n\
+ mov r0, #0x1\n\
+ b ._3079\n\
+._3078:\n\
+ cmp r1, r2\n\
+ bne ._3080 @cond_branch\n\
+._3074:\n\
+ strh r5, [r3]\n\
+ b ._3081\n\
+._3080:\n\
+ add r0, r4, #1\n\
+._3079:\n\
+ strh r0, [r3]\n\
+._3081:\n\
+ ldr r4, ._3083 @ gHitMarker\n\
+ ldr r2, [r4]\n\
+ ldr r0, ._3083 + 4 @ 0xfffffbff\n\
+ and r2, r2, r0\n\
+ str r2, [r4]\n\
+ ldr r6, ._3083 + 8 @ gBattlescriptCurrInstr\n\
+ ldr r5, ._3083 + 12 @ gBattleScriptsForMoveEffects\n\
+ ldr r3, ._3083 + 16 @ gBattleMoves\n\
+ ldrh r1, [r7]\n\
+ lsl r0, r1, #0x1\n\
+ add r0, r0, r1\n\
+ lsl r0, r0, #0x2\n\
+ add r0, r0, r3\n\
+ ldrb r0, [r0]\n\
+ lsl r0, r0, #0x2\n\
+ add r0, r0, r5\n\
+ ldr r0, [r0]\n\
+ str r0, [r6]\n\
+ mov r0, #0x80\n\
+ lsl r0, r0, #0x4\n\
+ orr r2, r2, r0\n\
+ str r2, [r4]\n\
+ ldrh r0, [r7]\n\
+ b ._3082\n\
+._3084:\n\
+ .align 2, 0\n\
+._3083:\n\
+ .word gHitMarker\n\
+ .word 0xfffffbff\n\
+ .word gBattlescriptCurrInstr\n\
+ .word gBattleScriptsForMoveEffects\n\
+ .word gBattleMoves\n\
+._3071:\n\
+ ldr r7, ._3090 @ gCurrentMove\n\
+ mov r6, #0xb1\n\
+ lsl r6, r6, #0x1\n\
+ ldr r5, ._3090 + 4 @ sMovesForbiddenToCopy\n\
+ ldr r0, ._3090 + 8 @ gBattlescriptCurrInstr\n\
+ mov r8, r0\n\
+._3089:\n\
+ bl Random\n\
+ ldr r2, ._3090 + 12 @ 0x1ff\n\
+ add r1, r2, #0\n\
+ and r0, r0, r1\n\
+ add r0, r0, #0x1\n\
+ strh r0, [r7]\n\
+ cmp r0, r6\n\
+ bhi ._3089 @cond_branch\n\
+ mov r0, #0x3\n\
+._3086:\n\
+ sub r0, r0, #0x1\n\
+ cmp r0, #0\n\
+ bge ._3086 @cond_branch\n\
+ ldr r4, ._3090 @ gCurrentMove\n\
+ ldrh r2, [r4]\n\
+ ldr r3, ._3090 + 16 @ 0xffff\n\
+ sub r0, r5, #2\n\
+._3088:\n\
+ add r0, r0, #0x2\n\
+ ldrh r1, [r0]\n\
+ cmp r1, r2\n\
+ beq ._3087 @cond_branch\n\
+ cmp r1, r3\n\
+ bne ._3088 @cond_branch\n\
+._3087:\n\
+ ldr r0, ._3090 + 16 @ 0xffff\n\
+ cmp r1, r0\n\
+ bne ._3089 @cond_branch\n\
+ ldr r2, ._3090 + 20 @ gHitMarker\n\
+ ldr r0, [r2]\n\
+ ldr r1, ._3090 + 24 @ 0xfffffbff\n\
+ and r0, r0, r1\n\
+ str r0, [r2]\n\
+ ldr r3, ._3090 + 28 @ gBattleScriptsForMoveEffects\n\
+ ldr r2, ._3090 + 32 @ gBattleMoves\n\
+ ldrh r1, [r4]\n\
+ lsl r0, r1, #0x1\n\
+ add r0, r0, r1\n\
+ lsl r0, r0, #0x2\n\
+ add r0, r0, r2\n\
+ ldrb r0, [r0]\n\
+ lsl r0, r0, #0x2\n\
+ add r0, r0, r3\n\
+ ldr r0, [r0]\n\
+ mov r1, r8\n\
+ str r0, [r1]\n\
+ ldrh r0, [r4]\n\
+._3082:\n\
+ mov r1, #0x0\n\
+ bl GetMoveTarget\n\
+ ldr r1, ._3090 + 36 @ gBankTarget\n\
+ strb r0, [r1]\n\
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4, r5, r6, r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+._3091:\n\
+ .align 2, 0\n\
+._3090:\n\
+ .word gCurrentMove\n\
+ .word sMovesForbiddenToCopy\n\
+ .word gBattlescriptCurrInstr\n\
+ .word 0x1ff\n\
+ .word 0xffff\n\
+ .word gHitMarker\n\
+ .word 0xfffffbff\n\
+ .word gBattleScriptsForMoveEffects\n\
+ .word gBattleMoves\n\
+ .word gBankTarget");
+}
+#else
#ifdef NONMATCHING
static void atk9E_metronome(void)
{
@@ -12721,6 +12918,7 @@ _0802795C: .4byte gBankTarget\n\
.syntax divided");
}
#endif // NONMATCHING
+#endif
static void atk9F_dmgtolevel(void)
{
diff --git a/src/battle/battle_7.c b/src/battle/battle_7.c
index 96bdc5cbf..564d8b518 100644
--- a/src/battle/battle_7.c
+++ b/src/battle/battle_7.c
@@ -27,7 +27,7 @@ extern u8 gActiveBank;
extern u8 gNoOfAllBanks;
extern u16 gBattlePartyID[];
extern u8 gBanksBySide[];
-extern u8 gObjectBankIDs[];
+extern u8 gBankSpriteIds[];
extern u16 gUnknown_02024DE8;
extern u8 gDoingBattleAnim;
extern u32 gTransformedPersonalities[];
@@ -198,9 +198,9 @@ bool8 move_anim_start_t3(u8 a, u8 b, u8 c, u8 d, u16 e)
}
if (ewram17800[a].substituteSprite && sub_803163C(d) == 0)
return TRUE;
- if (ewram17800[a].substituteSprite && d == 2 && gSprites[gObjectBankIDs[a]].invisible)
+ if (ewram17800[a].substituteSprite && d == 2 && gSprites[gBankSpriteIds[a]].invisible)
{
- refresh_graphics_maybe(a, 1, gObjectBankIDs[a]);
+ refresh_graphics_maybe(a, 1, gBankSpriteIds[a]);
sub_80324E0(a);
return TRUE;
}
@@ -621,12 +621,12 @@ void sub_8031F24(void)
s32 i;
for (i = 0; i < gNoOfAllBanks; i++)
- ewram17800[i].invisible = gSprites[gObjectBankIDs[i]].invisible;
+ ewram17800[i].invisible = gSprites[gBankSpriteIds[i]].invisible;
}
void sub_8031F88(u8 a)
{
- ewram17800[a].invisible = gSprites[gObjectBankIDs[a]].invisible;
+ ewram17800[a].invisible = gSprites[gBankSpriteIds[a]].invisible;
}
void sub_8031FC4(u8 a, u8 b, bool8 c)
@@ -640,7 +640,7 @@ void sub_8031FC4(u8 a, u8 b, bool8 c)
if (c)
{
- StartSpriteAnim(&gSprites[gObjectBankIDs[a]], ewram17840.unk0);
+ StartSpriteAnim(&gSprites[gBankSpriteIds[a]], ewram17840.unk0);
paletteOffset = 0x100 + a * 16;
LoadPalette(ewram16400 + ewram17840.unk0 * 32, paletteOffset, 32);
gBattleMonForms[a] = ewram17840.unk0;
@@ -649,7 +649,7 @@ void sub_8031FC4(u8 a, u8 b, bool8 c)
BlendPalette(paletteOffset, 16, 6, 0x7FFF);
CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32);
}
- gSprites[gObjectBankIDs[a]].pos1.y = sub_8077F68(a);
+ gSprites[gBankSpriteIds[a]].pos1.y = sub_8077F68(a);
}
else
{
@@ -702,7 +702,7 @@ void sub_8031FC4(u8 a, u8 b, bool8 c)
gTransformedPersonalities[a]);
}
}
- DmaCopy32Defvars(3, gUnknown_081FAF4C[r10], (void *)(VRAM + 0x10000 + gSprites[gObjectBankIDs[a]].oam.tileNum * 32), 0x800);
+ DmaCopy32Defvars(3, gUnknown_081FAF4C[r10], (void *)(VRAM + 0x10000 + gSprites[gBankSpriteIds[a]].oam.tileNum * 32), 0x800);
paletteOffset = 0x100 + a * 16;
lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, otId, personalityValue);
LZDecompressWram(lzPaletteData, gSharedMem);
@@ -721,8 +721,8 @@ void sub_8031FC4(u8 a, u8 b, bool8 c)
ewram17800[a].transformedSpecies = species;
gBattleMonForms[a] = gBattleMonForms[b];
}
- gSprites[gObjectBankIDs[a]].pos1.y = sub_8077F68(a);
- StartSpriteAnim(&gSprites[gObjectBankIDs[a]], gBattleMonForms[a]);
+ gSprites[gBankSpriteIds[a]].pos1.y = sub_8077F68(a);
+ StartSpriteAnim(&gSprites[gBankSpriteIds[a]], gBattleMonForms[a]);
}
}
@@ -862,15 +862,15 @@ void sub_80326EC(u8 a)
{
if (IsBankSpritePresent(i) != 0)
{
- gSprites[gObjectBankIDs[i]].oam.affineMode = a;
+ gSprites[gBankSpriteIds[i]].oam.affineMode = a;
if (a == 0)
{
- ewram17810[i].unk6 = gSprites[gObjectBankIDs[i]].oam.matrixNum;
- gSprites[gObjectBankIDs[i]].oam.matrixNum = 0;
+ ewram17810[i].unk6 = gSprites[gBankSpriteIds[i]].oam.matrixNum;
+ gSprites[gBankSpriteIds[i]].oam.matrixNum = 0;
}
else
{
- gSprites[gObjectBankIDs[i]].oam.matrixNum = ewram17810[i].unk6;
+ gSprites[gBankSpriteIds[i]].oam.matrixNum = ewram17810[i].unk6;
}
}
}
@@ -896,7 +896,7 @@ void sub_80328A4(struct Sprite *sprite)
{
bool8 invisible = FALSE;
u8 r4 = sprite->data[0];
- struct Sprite *r7 = &gSprites[gObjectBankIDs[r4]];
+ struct Sprite *r7 = &gSprites[gBankSpriteIds[r4]];
if (!r7->inUse || IsBankSpritePresent(r4) == 0)
{
diff --git a/src/battle/battle_ai.c b/src/battle/battle_ai.c
index 2ac9df2b9..629a57d25 100644
--- a/src/battle/battle_ai.c
+++ b/src/battle/battle_ai.c
@@ -13,6 +13,8 @@
#include "util.h"
#include "ewram.h"
+extern u8 gUnknown_02023A14_50;
+extern u32 gUnknown_02023A14_4C;
extern u16 gBattleTypeFlags;
extern u16 gBattleWeather;
extern u8 gActiveBank;
@@ -336,11 +338,15 @@ void BattleAI_SetupAIData(void)
else if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)
AI_THINKING_STRUCT->aiFlags = 0x80000000;
#ifdef GERMAN
- else if (gBattleTypeFlags & 0x900 || gTrainerBattleOpponent == 0x400)
+ else if (gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER) || gTrainerBattleOpponent == 0x400)
AI_THINKING_STRUCT->aiFlags = 7;
#endif
else // otherwise, just set aiFlags to whatever flags the trainer has set in their data.
AI_THINKING_STRUCT->aiFlags = gTrainers[gTrainerBattleOpponent].aiFlags;
+#if DEBUG
+ if (gUnknown_02023A14_50 & 1)
+ AI_THINKING_STRUCT->aiFlags = gUnknown_02023A14_4C;
+#endif
}
u8 BattleAI_GetAIActionToUse(void)
diff --git a/src/battle/battle_anim.c b/src/battle/battle_anim.c
index c71c12ce7..03ce1798f 100644
--- a/src/battle/battle_anim.c
+++ b/src/battle/battle_anim.c
@@ -14,6 +14,7 @@
#include "task.h"
#include "ewram.h"
#include "graphics.h"
+#include "constants/battle_anim.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)
@@ -1287,7 +1288,7 @@ const struct BattleAnimBackground gBattleAnimBackgroundTable[] =
};
extern u16 gBattlePartyID[4];
-extern u8 gObjectBankIDs[];
+extern u8 gBankSpriteIds[];
extern u8 gBankAttacker;
extern u8 gBankTarget;
EWRAM_DATA const u8 *sBattleAnimScriptPtr = NULL;
@@ -1327,7 +1328,7 @@ extern struct MusicPlayerInfo gMPlay_BGM;
extern struct MusicPlayerInfo gMPlay_SE1;
extern struct MusicPlayerInfo gMPlay_SE2;
-extern const u16 gUnknown_081C7160[];
+extern const u16 gSingingMoves[];
extern const u8 *const gBattleAnims_Moves[];
static void RunAnimScriptCommand(void);
@@ -1521,10 +1522,11 @@ void LaunchBattleAnimation(const u8 *const moveAnims[], u16 move, u8 isMoveAnim)
if (isMoveAnim)
{
- for (i = 0; gUnknown_081C7160[i] != 0xFFFF; i++)
+ for (i = 0; gSingingMoves[i] != 0xFFFF; i++)
{
- if (move == gUnknown_081C7160[i])
+ if (move == gSingingMoves[i])
{
+ // Lower the volume for the short song that gets played.
m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 128);
break;
}
@@ -1607,28 +1609,28 @@ static void RunAnimScriptCommand(void)
static void ScriptCmd_loadspritegfx(void)
{
- u16 index;
+ u16 tag;
sBattleAnimScriptPtr++;
- index = T1_READ_16(sBattleAnimScriptPtr);
- LoadCompressedObjectPic(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)]);
- LoadCompressedObjectPalette(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(index)]);
+ tag = T1_READ_16(sBattleAnimScriptPtr);
+ LoadCompressedObjectPic(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(tag)]);
+ LoadCompressedObjectPalette(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(tag)]);
sBattleAnimScriptPtr += 2;
- AddSpriteIndex(GET_TRUE_SPRITE_INDEX(index));
+ AddSpriteIndex(GET_TRUE_SPRITE_INDEX(tag));
gAnimFramesToWait = 1;
gAnimScriptCallback = WaitAnimFrameCount;
}
static void ScriptCmd_unloadspritegfx(void)
{
- u16 index;
+ u16 tag;
sBattleAnimScriptPtr++;
- index = T1_READ_16(sBattleAnimScriptPtr);
- FreeSpriteTilesByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag);
- FreeSpritePaletteByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag);
+ tag = T1_READ_16(sBattleAnimScriptPtr);
+ FreeSpriteTilesByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(tag)].tag);
+ FreeSpritePaletteByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(tag)].tag);
sBattleAnimScriptPtr += 2;
- ClearSpriteIndex(GET_TRUE_SPRITE_INDEX(index));
+ ClearSpriteIndex(GET_TRUE_SPRITE_INDEX(tag));
}
static void ScriptCmd_createsprite(void)
@@ -1810,7 +1812,7 @@ static void ScriptCmd_monbg(void)
u8 bank;
u8 identity;
bool8 toBG_2;
- u16 r4;
+ u16 spriteId;
u8 taskId;
sBattleAnimScriptPtr++;
@@ -1834,12 +1836,12 @@ static void ScriptCmd_monbg(void)
else
toBG_2 = 1;
- sub_8076034(bank, toBG_2);
- r4 = gObjectBankIDs[bank];
+ MoveBattlerSpriteToBG(bank, toBG_2);
+ spriteId = gBankSpriteIds[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;
+ gTasks[taskId].data[0] = spriteId;
+ gTasks[taskId].data[1] = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x;
+ gTasks[taskId].data[2] = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y;
if (toBG_2 == 0)
{
gTasks[taskId].data[3] = gBattle_BG1_X;
@@ -1855,8 +1857,9 @@ static void ScriptCmd_monbg(void)
gMonAnimTaskIdArray[0] = taskId;
}
+
bank ^= 2;
- if (animBank > 1 && IsAnimBankSpriteVisible(bank))
+ if (animBank >= ANIM_BANK_ATK_PARTNER && IsAnimBankSpriteVisible(bank))
{
identity = GetBankIdentity(bank);
identity += 0xFF;
@@ -1864,12 +1867,12 @@ static void ScriptCmd_monbg(void)
toBG_2 = 0;
else
toBG_2 = 1;
- sub_8076034(bank, toBG_2);
- r4 = gObjectBankIDs[bank];
+ MoveBattlerSpriteToBG(bank, toBG_2);
+ spriteId = gBankSpriteIds[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;
+ gTasks[taskId].data[0] = spriteId;
+ gTasks[taskId].data[1] = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x;
+ gTasks[taskId].data[2] = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y;
if (toBG_2 == 0)
{
gTasks[taskId].data[3] = gBattle_BG1_X;
@@ -1902,17 +1905,17 @@ bool8 IsAnimBankSpriteVisible(u8 bank)
return FALSE;
if (IsContest())
return TRUE; // this line wont ever be reached.
- if (!(EWRAM_17800[bank].unk0 & 1) || !gSprites[gObjectBankIDs[bank]].invisible)
+ if (!(EWRAM_17800[bank].unk0 & 1) || !gSprites[gBankSpriteIds[bank]].invisible)
return TRUE;
return FALSE;
}
-void sub_8076034(u8 a, u8 b)
+void MoveBattlerSpriteToBG(u8 bank, u8 toBG_2)
{
u8 spriteId;
- if (b == 0)
+ if (toBG_2 == 0)
{
volatile u8 pointlessZero;
struct UnknownStruct2 s;
@@ -1928,23 +1931,23 @@ void sub_8076034(u8 a, u8 b)
REG_BG1CNT_BITFIELD.screenSize = 1;
REG_BG1CNT_BITFIELD.areaOverflowMode = 0;
- spriteId = gObjectBankIDs[a];
+ spriteId = gBankSpriteIds[bank];
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;
+ gSprites[gBankSpriteIds[bank]].invisible = TRUE;
REG_BG1HOFS = gBattle_BG1_X;
REG_BG1VOFS = gBattle_BG1_Y;
- LoadPalette(gPlttBufferUnfaded + 0x100 + a * 16, s.unk8 * 16, 32);
- DmaCopy32Defvars(3, gPlttBufferUnfaded + 0x100 + a * 16, (u16 *)PLTT + s.unk8 * 16, 32);
+ LoadPalette(gPlttBufferUnfaded + 0x100 + bank * 16, s.unk8 * 16, 32);
+ DmaCopy32Defvars(3, gPlttBufferUnfaded + 0x100 + bank * 16, (u16 *)PLTT + s.unk8 * 16, 32);
if (IsContest() != 0)
r2 = 0;
else
- r2 = GetBankIdentity(a);
+ r2 = GetBankIdentity(bank);
sub_80E4EF8(0, 0, r2, s.unk8, (u32)s.unk0, (((s32)s.unk4 - VRAM) / 2048), REG_BG1CNT_BITFIELD.charBaseBlock);
if (IsContest() != 0)
sub_8076380();
@@ -1962,18 +1965,18 @@ void sub_8076034(u8 a, u8 b)
REG_BG2CNT_BITFIELD.screenSize = 1;
REG_BG2CNT_BITFIELD.areaOverflowMode = 0;
- spriteId = gObjectBankIDs[a];
+ spriteId = gBankSpriteIds[bank];
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;
+ gSprites[gBankSpriteIds[bank]].invisible = TRUE;
REG_BG2HOFS = gBattle_BG2_X;
REG_BG2VOFS = gBattle_BG2_Y;
- LoadPalette(gPlttBufferUnfaded + 0x100 + a * 16, 0x90, 32);
- DmaCopy32Defvars(3, gPlttBufferUnfaded + 0x100 + a * 16, (void *)(PLTT + 0x120), 32);
+ LoadPalette(gPlttBufferUnfaded + 0x100 + bank * 16, 0x90, 32);
+ DmaCopy32Defvars(3, gPlttBufferUnfaded + 0x100 + bank * 16, (void *)(PLTT + 0x120), 32);
- sub_80E4EF8(0, 0, GetBankIdentity(a), 9, 0x6000, 0x1E, REG_BG2CNT_BITFIELD.charBaseBlock);
+ sub_80E4EF8(0, 0, GetBankIdentity(bank), 9, 0x6000, 0x1E, REG_BG2CNT_BITFIELD.charBaseBlock);
}
}
@@ -2096,9 +2099,9 @@ static void ScriptCmd_clearmonbg(void)
bank = gAnimBankTarget;
if (gMonAnimTaskIdArray[0] != 0xFF)
- gSprites[gObjectBankIDs[bank]].invisible = FALSE;
+ gSprites[gBankSpriteIds[bank]].invisible = FALSE;
if (animBankId > 1 && gMonAnimTaskIdArray[1] != 0xFF)
- gSprites[gObjectBankIDs[bank ^ 2]].invisible = FALSE;
+ gSprites[gBankSpriteIds[bank ^ 2]].invisible = FALSE;
else
animBankId = 0;
@@ -2166,8 +2169,8 @@ static void ScriptCmd_monbg_22(void)
r1 = 0;
else
r1 = 1;
- sub_8076034(bank, r1);
- gSprites[gObjectBankIDs[bank]].invisible = FALSE;
+ MoveBattlerSpriteToBG(bank, r1);
+ gSprites[gBankSpriteIds[bank]].invisible = FALSE;
}
bank ^= 2;
@@ -2179,8 +2182,8 @@ static void ScriptCmd_monbg_22(void)
r1 = 0;
else
r1 = 1;
- sub_8076034(bank, r1);
- gSprites[gObjectBankIDs[bank]].invisible = FALSE;
+ MoveBattlerSpriteToBG(bank, r1);
+ gSprites[gBankSpriteIds[bank]].invisible = FALSE;
}
sBattleAnimScriptPtr++;
}
@@ -2205,9 +2208,9 @@ static void ScriptCmd_clearmonbg_23(void)
bank = gAnimBankTarget;
if (IsAnimBankSpriteVisible(bank))
- gSprites[gObjectBankIDs[bank]].invisible = FALSE;
+ gSprites[gBankSpriteIds[bank]].invisible = FALSE;
if (animBankId > 1 && IsAnimBankSpriteVisible(bank ^ 2))
- gSprites[gObjectBankIDs[bank ^ 2]].invisible = FALSE;
+ gSprites[gBankSpriteIds[bank ^ 2]].invisible = FALSE;
else
animBankId = 0;
@@ -2244,13 +2247,13 @@ static void sub_80769A4(u8 taskId)
static void ScriptCmd_setalpha(void)
{
- u16 half1, half2;
+ u16 spriteAlpha, bgAlpha;
sBattleAnimScriptPtr++;
- half1 = *(sBattleAnimScriptPtr++);
- half2 = *(sBattleAnimScriptPtr++) << 8;
- REG_BLDCNT = 0x3F40;
- REG_BLDALPHA = half1 | half2;
+ spriteAlpha = *(sBattleAnimScriptPtr++);
+ bgAlpha = *(sBattleAnimScriptPtr++) << 8;
+ REG_BLDCNT = BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD | BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_EFFECT_BLEND;
+ REG_BLDALPHA = spriteAlpha | bgAlpha;
}
static void ScriptCmd_setbldcnt(void)
@@ -2699,13 +2702,13 @@ s16 CalculatePanIncrement(s16 sourcePan, s16 targetPan, s16 incrementPan)
static void ScriptCmd_playsewithpan(void)
{
- u16 songId;
+ u16 soundId;
s8 pan;
sBattleAnimScriptPtr++;
- songId = T1_READ_16(sBattleAnimScriptPtr);
+ soundId = T1_READ_16(sBattleAnimScriptPtr);
pan = T1_READ_8(sBattleAnimScriptPtr + 2);
- PlaySE12WithPanning(songId, BattleAnimAdjustPanning(pan));
+ PlaySE12WithPanning(soundId, BattleAnimAdjustPanning(pan));
sBattleAnimScriptPtr += 3;
}
diff --git a/src/battle/battle_anim_807B69C.c b/src/battle/battle_anim_807B69C.c
index 058a45769..6043efb0c 100644
--- a/src/battle/battle_anim_807B69C.c
+++ b/src/battle/battle_anim_807B69C.c
@@ -15,7 +15,7 @@ extern bool8 gAnimScriptActive;
extern void (*gAnimScriptCallback)(void);
extern s16 gBattleAnimArgs[];
extern u8 gAnimBankTarget;
-extern u8 gObjectBankIDs[];
+extern u8 gBankSpriteIds[];
extern const struct CompressedSpriteSheet gBattleAnimPicTable[];
extern const struct CompressedSpritePalette gBattleAnimPaletteTable[];
extern const u8 *const gBattleAnims_StatusConditions[];
@@ -72,7 +72,7 @@ static void sub_807BDAC(u8);
u8 unref_sub_807B69C(u8 a, u8 b)
{
- u8 spriteId1 = gObjectBankIDs[a];
+ u8 spriteId1 = gBankSpriteIds[a];
u8 taskId = CreateTask(sub_807B7E0, 10);
u8 spriteId2;
u8 i;
diff --git a/src/battle/battle_anim_80A7E7C.c b/src/battle/battle_anim_80A7E7C.c
index f109333e3..a8b0ec329 100644
--- a/src/battle/battle_anim_80A7E7C.c
+++ b/src/battle/battle_anim_80A7E7C.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "battle.h"
#include "battle_anim.h"
#include "rom_8077ABC.h"
#include "sprite.h"
@@ -9,34 +10,34 @@
extern s16 gBattleAnimArgs[8];
-extern u8 gObjectBankIDs[];
+extern u8 gBankSpriteIds[];
extern s32 gAnimMoveDmg;
extern u16 gAnimMovePower;
extern u8 gAnimBankAttacker;
extern u8 gAnimBankTarget;
-static void sub_80A7EF0(u8 taskId);
-static void sub_80A808C(u8 taskId);
-static void sub_80A81D8(u8 taskId);
-static void sub_80A8374(u8 taskId);
+static void AnimTask_ShakeMonStep(u8 taskId);
+static void AnimTask_ShakeMon2Step(u8 taskId);
+static void AnimTask_ShakeMonInPlaceStep(u8 taskId);
+static void AnimTask_ShakeAndSinkMonStep(u8 taskId);
static void sub_80A8488(u8 taskId);
-static void sub_80A8530(struct Sprite *sprite);
-static void sub_80A85A4(struct Sprite *sprite);
-static void sub_80A85C8(struct Sprite *sprite);
-static void sub_80A8614(struct Sprite* sprite);
-static void sub_80A8638(struct Sprite *sprite);
-static void sub_80A86F4(struct Sprite *sprite);
-static void sub_80A8764(struct Sprite *sprite);
+static void DoHorizontalLunge(struct Sprite *sprite);
+static void ReverseHorizontalLungeDirection(struct Sprite *sprite);
+static void DoVerticalDip(struct Sprite *sprite);
+static void ReverseVerticalDipDirection(struct Sprite* sprite);
+static void SlideMonToOriginalPos(struct Sprite *sprite);
+static void SlideMonToOriginalPosStep(struct Sprite *sprite);
+static void SlideMonToOffset(struct Sprite *sprite);
static void sub_80A8818(struct Sprite *sprite);
static void sub_80A88F0(struct Sprite *sprite);
-static void sub_80A89B4(u8 taskId);
-static void sub_80A8A18(u8 taskId);
-static void sub_80A8C0C(u8 taskId);
-static void sub_80A8D8C(u8 taskId);
+static void AnimTask_WindUpLungePart1(u8 taskId);
+static void AnimTask_WindUpLungePart2(u8 taskId);
+static void AnimTask_SwayMonStep(u8 taskId);
+static void AnimTask_ScaleMonAndRestoreStep(u8 taskId);
static void sub_80A8FD8(u8 taskId);
static void sub_80A913C(u8 taskId);
-const struct SpriteTemplate gBattleAnimSpriteTemplate_83C1FB0 =
+const struct SpriteTemplate gHorizontalLungeSpriteTemplate =
{
.tileTag = 0,
.paletteTag = 0,
@@ -44,10 +45,10 @@ const struct SpriteTemplate gBattleAnimSpriteTemplate_83C1FB0 =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_80A8530,
+ .callback = DoHorizontalLunge,
};
-const struct SpriteTemplate gBattleAnimSpriteTemplate_83C1FC8 =
+const struct SpriteTemplate gVerticalDipSpriteTemplate =
{
.tileTag = 0,
.paletteTag = 0,
@@ -55,10 +56,10 @@ const struct SpriteTemplate gBattleAnimSpriteTemplate_83C1FC8 =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_80A85C8,
+ .callback = DoVerticalDip,
};
-const struct SpriteTemplate gBattleAnimSpriteTemplate_83C1FE0 =
+const struct SpriteTemplate gSlideMonToOriginalPosSpriteTemplate =
{
.tileTag = 0,
.paletteTag = 0,
@@ -66,10 +67,10 @@ const struct SpriteTemplate gBattleAnimSpriteTemplate_83C1FE0 =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_80A8638,
+ .callback = SlideMonToOriginalPos,
};
-const struct SpriteTemplate gBattleAnimSpriteTemplate_83C1FF8 =
+const struct SpriteTemplate gSlideMonToOffsetSpriteTemplate =
{
.tileTag = 0,
.paletteTag = 0,
@@ -77,7 +78,7 @@ const struct SpriteTemplate gBattleAnimSpriteTemplate_83C1FF8 =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
- .callback = sub_80A8764,
+ .callback = SlideMonToOffset,
};
const struct SpriteTemplate gBattleAnimSpriteTemplate_83C2010 =
@@ -91,28 +92,35 @@ const struct SpriteTemplate gBattleAnimSpriteTemplate_83C2010 =
.callback = sub_80A8818,
};
-void sub_80A7E7C(u8 taskId)
+// Task to facilitate simple shaking of a pokemon's picture in battle.
+// The shaking alternates between the original position and the target position.
+// arg 0: anim battler
+// arg 1: x pixel offset
+// arg 2: y pixel offset
+// arg 3: num times to shake
+// arg 4: frame delay
+void AnimTask_ShakeMon(u8 taskId)
{
- u8 sprite;
- sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]);
- if (sprite == 0xff)
+ u8 spriteId;
+ spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
+ if (spriteId == 0xff)
{
DestroyAnimVisualTask(taskId);
return;
}
- gSprites[sprite].pos2.x = gBattleAnimArgs[1];
- gSprites[sprite].pos2.y = gBattleAnimArgs[2];
- TASK.data[0] = sprite;
+ gSprites[spriteId].pos2.x = gBattleAnimArgs[1];
+ gSprites[spriteId].pos2.y = gBattleAnimArgs[2];
+ TASK.data[0] = spriteId;
TASK.data[1] = gBattleAnimArgs[3];
TASK.data[2] = gBattleAnimArgs[4];
TASK.data[3] = gBattleAnimArgs[4];
TASK.data[4] = gBattleAnimArgs[1];
TASK.data[5] = gBattleAnimArgs[2];
- TASK.func = sub_80A7EF0;
- sub_80A7EF0(taskId);
+ TASK.func = AnimTask_ShakeMonStep;
+ AnimTask_ShakeMonStep(taskId);
}
-static void sub_80A7EF0(u8 taskId)
+static void AnimTask_ShakeMonStep(u8 taskId)
{
if (TASK.data[3] == 0)
{
@@ -147,13 +155,19 @@ static void sub_80A7EF0(u8 taskId)
}
}
-
-void sub_80A7FA0(u8 taskId)
+// Task to facilitate simple shaking of a pokemon's picture in battle.
+// The shaking alternates between the positive and negative versions of the specified pixel offsets.
+// arg 0: anim battler
+// arg 1: x pixel offset
+// arg 2: y pixel offset
+// arg 3: num times to shake
+// arg 4: frame delay
+void AnimTask_ShakeMon2(u8 taskId)
{
u8 sprite;
- bool8 r6;
+ bool8 destroy;
u8 side;
- r6 = 0;
+ destroy = FALSE;
if (gBattleAnimArgs[0] < 4)
{
sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]);
@@ -181,21 +195,23 @@ void sub_80A7FA0(u8 taskId)
side = GetBankByIdentity(3);
break;
}
+
if (IsAnimBankSpriteVisible(side) == FALSE)
- {
- r6 = 1;
- }
- sprite = gObjectBankIDs[side];
+ destroy = TRUE;
+
+ sprite = gBankSpriteIds[side];
}
else
{
- sprite = gObjectBankIDs[gAnimBankAttacker];
+ sprite = gBankSpriteIds[gAnimBankAttacker];
}
- if (r6)
+
+ if (destroy)
{
DestroyAnimVisualTask(taskId);
return;
}
+
gSprites[sprite].pos2.x = gBattleAnimArgs[1];
gSprites[sprite].pos2.y = gBattleAnimArgs[2];
TASK.data[0] = sprite;
@@ -204,30 +220,24 @@ void sub_80A7FA0(u8 taskId)
TASK.data[3] = gBattleAnimArgs[4];
TASK.data[4] = gBattleAnimArgs[1];
TASK.data[5] = gBattleAnimArgs[2];
- TASK.func = sub_80A808C;
- sub_80A808C(taskId);
+ TASK.func = AnimTask_ShakeMon2Step;
+ TASK.func(taskId);
}
-static void sub_80A808C(u8 taskId)
+static void AnimTask_ShakeMon2Step(u8 taskId)
{
if (TASK.data[3] == 0)
{
if (SPRITE.pos2.x == TASK.data[4])
- {
SPRITE.pos2.x = -TASK.data[4];
- }
else
- {
SPRITE.pos2.x = TASK.data[4];
- }
+
if (SPRITE.pos2.y == TASK.data[5])
- {
SPRITE.pos2.y = -TASK.data[5];
- }
else
- {
SPRITE.pos2.y = TASK.data[5];
- }
+
TASK.data[3] = TASK.data[2];
if (--TASK.data[1] == 0)
{
@@ -243,29 +253,37 @@ static void sub_80A808C(u8 taskId)
}
}
-void sub_80A8154(u8 taskId)
+// Task to facilitate simple shaking of a pokemon's picture in battle.
+// The shaking alternates between the positive and negative versions of the specified pixel offsets
+// with respect to the current location of the mon's picture.
+// arg 0: battler
+// arg 1: x offset
+// arg 2: y offset
+// arg 3: num shakes
+// arg 4: delay
+void AnimTask_ShakeMonInPlace(u8 taskId)
{
- u8 sprite;
- sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]);
- if (sprite == 0xff)
+ u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
+ if (spriteId == 0xff)
{
DestroyAnimVisualTask(taskId);
return;
}
- gSprites[sprite].pos2.x += gBattleAnimArgs[1];
- gSprites[sprite].pos2.y += gBattleAnimArgs[2];
- TASK.data[0] = sprite;
+
+ gSprites[spriteId].pos2.x += gBattleAnimArgs[1];
+ gSprites[spriteId].pos2.y += gBattleAnimArgs[2];
+ TASK.data[0] = spriteId;
TASK.data[1] = 0;
TASK.data[2] = gBattleAnimArgs[3];
TASK.data[3] = 0;
TASK.data[4] = gBattleAnimArgs[4];
TASK.data[5] = gBattleAnimArgs[1] * 2;
TASK.data[6] = gBattleAnimArgs[2] * 2;
- TASK.func = sub_80A81D8;
- sub_80A81D8(taskId);
+ TASK.func = AnimTask_ShakeMonInPlaceStep;
+ TASK.func(taskId);
}
-static void sub_80A81D8(u8 taskId)
+static void AnimTask_ShakeMonInPlaceStep(u8 taskId)
{
if (TASK.data[3] == 0)
{
@@ -302,7 +320,13 @@ static void sub_80A81D8(u8 taskId)
}
}
-void sub_80A8314(u8 taskId)
+// Shakes a mon bg horizontally and moves it downward linearly.
+// arg 0: battler
+// arg 1: x offset
+// arg 2: frame delay between each movement
+// arg 3: downward speed (subpixel)
+// arg 4: duration
+void AnimTask_ShakeAndSinkMon(u8 taskId)
{
u8 sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]);
gSprites[sprite].pos2.x = gBattleAnimArgs[1];
@@ -311,11 +335,11 @@ void sub_80A8314(u8 taskId)
TASK.data[2] = gBattleAnimArgs[2];
TASK.data[3] = gBattleAnimArgs[3];
TASK.data[4] = gBattleAnimArgs[4];
- TASK.func = sub_80A8374;
- sub_80A8374(taskId);
+ TASK.func = AnimTask_ShakeAndSinkMonStep;
+ TASK.func(taskId);
}
-static void sub_80A8374(u8 taskId)
+static void AnimTask_ShakeAndSinkMonStep(u8 taskId)
{
s16 x;
u8 sprite;
@@ -325,11 +349,11 @@ static void sub_80A8374(u8 taskId)
{
TASK.data[8] = 0;
if (gSprites[sprite].pos2.x == x)
- {
x = -x;
- }
+
gSprites[sprite].pos2.x += x;
}
+
TASK.data[1] = x;
TASK.data[9] += TASK.data[3];
gSprites[sprite].pos2.y = TASK.data[9] >> 8;
@@ -340,89 +364,109 @@ static void sub_80A8374(u8 taskId)
}
}
-void sub_80A8408(u8 taskId)
+// Moves a mon bg picture along an elliptical path that begins
+// and ends at the mon's origin location.
+// arg 0: battler
+// arg 1: ellipse width
+// arg 2: ellipse height
+// arg 3: num loops
+// arg 4: speed (valid values are 0-5)
+void AnimTask_TranslateMonElliptical(u8 taskId)
{
u8 i;
- u8 sprite;
- u8 v1;
- v1 = 1;
- sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]);
+ u8 spriteId;
+ u8 wavePeriod;
+
+ wavePeriod = 1;
+ spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
if (gBattleAnimArgs[4] > 5)
- {
gBattleAnimArgs[4] = 5;
- }
+
for (i = 0; i < gBattleAnimArgs[4]; i++)
{
- v1 <<= 1;
+ wavePeriod <<= 1;
}
- TASK.data[0] = sprite;
+
+ TASK.data[0] = spriteId;
TASK.data[1] = gBattleAnimArgs[1];
TASK.data[2] = gBattleAnimArgs[2];
TASK.data[3] = gBattleAnimArgs[3];
- TASK.data[4] = v1;
+ TASK.data[4] = wavePeriod;
TASK.func = sub_80A8488;
- sub_80A8488(taskId);
+ TASK.func(taskId);
}
static void sub_80A8488(u8 taskId)
{
- u8 sprite;
- sprite = TASK.data[0];
- gSprites[sprite].pos2.x = Sin(TASK.data[5], TASK.data[1]);
- gSprites[sprite].pos2.y = -Cos(TASK.data[5], TASK.data[2]);
- gSprites[sprite].pos2.y += TASK.data[2];
+ u8 spriteId = TASK.data[0];
+ gSprites[spriteId].pos2.x = Sin(TASK.data[5], TASK.data[1]);
+ gSprites[spriteId].pos2.y = -Cos(TASK.data[5], TASK.data[2]);
+ gSprites[spriteId].pos2.y += TASK.data[2];
TASK.data[5] += TASK.data[4];
TASK.data[5] &= 0xff;
+
if (TASK.data[5] == 0)
- {
TASK.data[3]--;
- }
+
if (TASK.data[3] == 0)
{
- gSprites[sprite].pos2.x = 0;
- gSprites[sprite].pos2.y = 0;
+ gSprites[spriteId].pos2.x = 0;
+ gSprites[spriteId].pos2.y = 0;
DestroyAnimVisualTask(taskId);
return;
}
}
-void sub_80A8500(u8 taskId)
+// Moves a mon bg picture along an elliptical path that begins
+// and ends at the mon's origin location. Reverses the direction
+// of the path if it's not on the player's side of the battle.
+// arg 0: battler
+// arg 1: ellipse width
+// arg 2: ellipse height
+// arg 3: num loops
+// arg 4: speed (valid values are 0-5)
+void AnimTask_TranslateMonEllipticalRespectSide(u8 taskId)
{
- if (GetBankSide(gAnimBankAttacker))
- {
+ if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER)
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
- }
- sub_80A8408(taskId);
+
+ AnimTask_TranslateMonElliptical(taskId);
}
-static void sub_80A8530(struct Sprite *sprite)
+// Performs a simple horizontal lunge, where the mon moves
+// horizontally, and then moves back in the opposite direction.
+// arg 0: duration of single lunge direction
+// arg 1: x pixel delta that is applied each frame
+static void DoHorizontalLunge(struct Sprite *sprite)
{
sprite->invisible = TRUE;
- if (GetBankSide(gAnimBankAttacker))
- {
+ if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER)
sprite->data[1] = -gBattleAnimArgs[1];
- }
else
- {
sprite->data[1] = gBattleAnimArgs[1];
- }
+
sprite->data[0] = gBattleAnimArgs[0];
sprite->data[2] = 0;
- sprite->data[3] = gObjectBankIDs[gAnimBankAttacker];
+ sprite->data[3] = gBankSpriteIds[gAnimBankAttacker];
sprite->data[4] = gBattleAnimArgs[0];
- StoreSpriteCallbackInData(sprite, sub_80A85A4);
- sprite->callback = sub_8078458;
+ StoreSpriteCallbackInData(sprite, ReverseHorizontalLungeDirection);
+ sprite->callback = TranslateMonBGUntil;
}
-static void sub_80A85A4(struct Sprite *sprite)
+static void ReverseHorizontalLungeDirection(struct Sprite *sprite)
{
sprite->data[0] = sprite->data[4];
sprite->data[1] = -sprite->data[1];
- sprite->callback = sub_8078458;
+ sprite->callback = TranslateMonBGUntil;
StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
}
-static void sub_80A85C8(struct Sprite *sprite)
+// Performs a simple vertical dipping motion, where moves vertically, and then
+// moves back in the opposite direction.
+// arg 0: duration of single dip direction
+// arg 1: y pixel delta that is applied each frame
+// arg 2: battler
+static void DoVerticalDip(struct Sprite *sprite)
{
u8 spriteId;
sprite->invisible = TRUE;
@@ -432,73 +476,72 @@ static void sub_80A85C8(struct Sprite *sprite)
sprite->data[2] = gBattleAnimArgs[1];
sprite->data[3] = spriteId;
sprite->data[4] = gBattleAnimArgs[0];
- StoreSpriteCallbackInData(sprite, sub_80A8614);
- sprite->callback = sub_8078458;
+ StoreSpriteCallbackInData(sprite, ReverseVerticalDipDirection);
+ sprite->callback = TranslateMonBGUntil;
}
-static void sub_80A8614(struct Sprite *sprite)
+static void ReverseVerticalDipDirection(struct Sprite *sprite)
{
sprite->data[0] = sprite->data[4];
sprite->data[2] = -sprite->data[2];
- sprite->callback = sub_8078458;
+ sprite->callback = TranslateMonBGUntil;
StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
}
-static void sub_80A8638(struct Sprite *sprite)
+// Linearly slides a mon's bg picture back to its original sprite position.
+// The sprite parameter is a dummy sprite used for facilitating the movement with its callback.
+// arg 0: 1 = target or 0 = attacker
+// arg 1: direction (0 = horizontal and vertical, 1 = horizontal only, 2 = vertical only)
+// arg 2: duration
+static void SlideMonToOriginalPos(struct Sprite *sprite)
{
int something;
- int spriteId;
+ int monSpriteId;
if (!gBattleAnimArgs[0])
- {
- spriteId = gObjectBankIDs[gAnimBankAttacker];
- }
+ monSpriteId = gBankSpriteIds[gAnimBankAttacker];
else
- {
- spriteId = gObjectBankIDs[gAnimBankTarget];
- }
+ monSpriteId = gBankSpriteIds[gAnimBankTarget];
+
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;
+ sprite->data[1] = gSprites[monSpriteId].pos1.x + gSprites[monSpriteId].pos2.x;
+ sprite->data[2] = gSprites[monSpriteId].pos1.x;
+ sprite->data[3] = gSprites[monSpriteId].pos1.y + gSprites[monSpriteId].pos2.y;
+ sprite->data[4] = gSprites[monSpriteId].pos1.y;
something = 0;
- sub_8078A5C(sprite);
+ InitSpriteDataForLinearTranslation(sprite);
sprite->data[3] = something;
sprite->data[4] = something;
- sprite->data[5] = gSprites[spriteId].pos2.x;
- sprite->data[6] = gSprites[spriteId].pos2.y;
+ sprite->data[5] = gSprites[monSpriteId].pos2.x;
+ sprite->data[6] = gSprites[monSpriteId].pos2.y;
sprite->invisible = TRUE;
+
if (gBattleAnimArgs[1] == 1)
- {
sprite->data[2] = something;
- }
else if (gBattleAnimArgs[1] == 2)
- {
sprite->data[1] = something;
- }
+
sprite->data[7] = gBattleAnimArgs[1];
- sprite->data[7] |= spriteId << 8;
- sprite->callback = sub_80A86F4;
+ sprite->data[7] |= monSpriteId << 8;
+ sprite->callback = SlideMonToOriginalPosStep;
}
-static void sub_80A86F4(struct Sprite *sprite)
+static void SlideMonToOriginalPosStep(struct Sprite *sprite)
{
- s8 spriteId;
+ s8 monSpriteId;
u8 lo;
- struct Sprite *sprite2;
+ struct Sprite *monSprite;
+
lo = sprite->data[7] & 0xff;
- spriteId = sprite->data[7] >> 8;
- sprite2 = &gSprites[spriteId];
+ monSpriteId = sprite->data[7] >> 8;
+ monSprite = &gSprites[monSpriteId];
if (sprite->data[0] == 0)
{
if (lo < 2)
- {
- sprite2->pos2.x = 0;
- }
+ monSprite->pos2.x = 0;
+
if (lo == 2 || lo == 0)
- {
- sprite2->pos2.y = 0;
- }
+ monSprite->pos2.y = 0;
+
DestroyAnimSprite(sprite);
}
else
@@ -506,25 +549,30 @@ static void sub_80A86F4(struct Sprite *sprite)
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];
+ monSprite->pos2.x = (s8)(sprite->data[3] >> 8) + sprite->data[5];
+ monSprite->pos2.y = (s8)(sprite->data[4] >> 8) + sprite->data[6];
}
}
-static void sub_80A8764(struct Sprite *sprite)
+// Linearly translates a mon to a target offset. The horizontal offset
+// is mirrored for the opponent's pokemon, and the vertical offset
+// is only mirrored if arg 3 is set to 1.
+// arg 0: 0 = attacker, 1 = target
+// arg 1: target x pixel offset
+// arg 2: target y pixel offset
+// arg 3: mirror vertical translation for opposite battle side
+// arg 4: duration
+static void SlideMonToOffset(struct Sprite *sprite)
{
- u8 v1;
- u8 spriteId;
+ u8 battler;
+ u8 monSpriteId;
if (!gBattleAnimArgs[0])
- {
- v1 = gAnimBankAttacker;
- }
+ battler = gAnimBankAttacker;
else
- {
- v1 = gAnimBankTarget;
- }
- spriteId = gObjectBankIDs[v1];
- if (GetBankSide(v1))
+ battler = gAnimBankTarget;
+
+ monSpriteId = gBankSpriteIds[battler];
+ if (GetBankSide(battler) != SIDE_PLAYER)
{
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
if (gBattleAnimArgs[3] == 1)
@@ -532,18 +580,19 @@ static void sub_80A8764(struct Sprite *sprite)
gBattleAnimArgs[2] = -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->data[1] = gSprites[monSpriteId].pos1.x;
+ sprite->data[2] = gSprites[monSpriteId].pos1.x + gBattleAnimArgs[1];
+ sprite->data[3] = gSprites[monSpriteId].pos1.y;
+ sprite->data[4] = gSprites[monSpriteId].pos1.y + gBattleAnimArgs[2];
+ InitSpriteDataForLinearTranslation(sprite);
sprite->data[3] = 0;
sprite->data[4] = 0;
- sprite->data[5] = spriteId;
+ sprite->data[5] = monSpriteId;
sprite->invisible = TRUE;
StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
- sprite->callback = sub_80784A8;
+ sprite->callback = TranslateMonBGSubPixelUntil;
}
static void sub_80A8818(struct Sprite *sprite)
@@ -559,7 +608,7 @@ static void sub_80A8818(struct Sprite *sprite)
{
v1 = gAnimBankTarget;
}
- spriteId = gObjectBankIDs[v1];
+ spriteId = gBankSpriteIds[v1];
if (GetBankSide(v1))
{
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
@@ -573,7 +622,7 @@ static void sub_80A8818(struct Sprite *sprite)
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);
+ InitSpriteDataForLinearTranslation(sprite);
sprite->data[3] = gSprites[spriteId].pos2.x << 8;
sprite->data[4] = gSprites[spriteId].pos2.y << 8;
sprite->data[5] = spriteId;
@@ -586,7 +635,7 @@ static void sub_80A8818(struct Sprite *sprite)
{
StoreSpriteCallbackInData(sprite, sub_80A88F0);
}
- sprite->callback = sub_80784A8;
+ sprite->callback = TranslateMonBGSubPixelUntil;
}
@@ -597,11 +646,20 @@ static void sub_80A88F0(struct Sprite *sprite)
DestroyAnimSprite(sprite);
}
-void sub_80A8920(u8 taskId)
+// Task to facilitate a two-part translation animation, in which the sprite
+// is first translated in an arc to one position. Then, it "lunges" to a target
+// x offset. Used in TAKE_DOWN, for example.
+// arg 0: anim bank
+// arg 1: horizontal speed (subpixel)
+// arg 2: wave amplitude
+// arg 3: first duration
+// arg 4: delay before starting lunge
+// arg 5: target x offset for lunge
+// arg 6: lunge duration
+void AnimTask_WindUpLunge(u8 taskId)
{
- s16 r7;
- r7 = 0x8000 / gBattleAnimArgs[3];
- if (GetBankSide(gAnimBankAttacker))
+ s16 wavePeriod = 0x8000 / gBattleAnimArgs[3];
+ if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER)
{
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
gBattleAnimArgs[5] = -gBattleAnimArgs[5];
@@ -613,11 +671,11 @@ void sub_80A8920(u8 taskId)
TASK.data[4] = gBattleAnimArgs[4];
TASK.data[5] = (gBattleAnimArgs[5] << 8) / gBattleAnimArgs[6];
TASK.data[6] = gBattleAnimArgs[6];
- TASK.data[7] = r7;
- TASK.func = sub_80A89B4;
+ TASK.data[7] = wavePeriod;
+ TASK.func = AnimTask_WindUpLungePart1;
}
-static void sub_80A89B4(u8 taskId)
+static void AnimTask_WindUpLungePart1(u8 taskId)
{
u8 spriteId;
spriteId = TASK.data[0];
@@ -627,11 +685,11 @@ static void sub_80A89B4(u8 taskId)
TASK.data[10] += TASK.data[7];
if (--TASK.data[3] == 0)
{
- TASK.func = sub_80A8A18;
+ TASK.func = AnimTask_WindUpLungePart2;
}
}
-static void sub_80A8A18(u8 taskId)
+static void AnimTask_WindUpLungePart2(u8 taskId)
{
u8 spriteId;
if (TASK.data[4] > 0)
@@ -668,7 +726,7 @@ void sub_80A8A80(u8 taskId)
DestroyAnimVisualTask(taskId);
return;
}
- spriteId = gObjectBankIDs[gAnimBankAttacker ^ 2];
+ spriteId = gBankSpriteIds[gAnimBankAttacker ^ 2];
break;
case 3:
if (!IsAnimBankSpriteVisible(gAnimBankTarget ^ 2))
@@ -676,7 +734,7 @@ void sub_80A8A80(u8 taskId)
DestroyAnimVisualTask(taskId);
return;
}
- spriteId = gObjectBankIDs[gAnimBankTarget ^ 2];
+ spriteId = gBankSpriteIds[gAnimBankTarget ^ 2];
break;
default:
DestroyAnimVisualTask(taskId);
@@ -705,59 +763,67 @@ static void sub_80A8B3C(u8 taskId)
}
}
-void sub_80A8B88(u8 taskId)
+// Task that facilitates translating the mon bg picture back and forth
+// in a swaying motion (uses Sine wave). It can sway either horizontally
+// or vertically, but not both.
+// arg 0: direction (0 = horizontal, 1 = vertical)
+// arg 1: wave amplitude
+// arg 2: wave period
+// arg 3: num sways
+// arg 4: which mon (0 = attacker, 1`= target)
+void AnimTask_SwayMon(u8 taskId)
{
u8 spriteId;
- if (GetBankSide(gAnimBankAttacker))
- {
+ if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER)
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
- }
+
spriteId = GetAnimBankSpriteId(gBattleAnimArgs[4]);
TASK.data[0] = gBattleAnimArgs[0];
TASK.data[1] = gBattleAnimArgs[1];
TASK.data[2] = gBattleAnimArgs[2];
TASK.data[3] = gBattleAnimArgs[3];
TASK.data[4] = spriteId;
+
if (gBattleAnimArgs[4] == 0)
- {
TASK.data[5] = gAnimBankAttacker;
- }
else
- {
TASK.data[5] = gAnimBankTarget;
- }
+
TASK.data[12] = 1;
- TASK.func = sub_80A8C0C;
+ TASK.func = AnimTask_SwayMonStep;
}
-static void sub_80A8C0C(u8 taskId)
+static void AnimTask_SwayMonStep(u8 taskId)
{
- s16 y;
+ s16 sineValue;
u8 spriteId;
- int index;
- u16 val;
+ int waveIndex;
+ u16 sineIndex;
+
spriteId = TASK.data[4];
- val = TASK.data[10] + TASK.data[2];
- TASK.data[10] = val;
- index = val >> 8;
- y = Sin(index, TASK.data[1]);
+ sineIndex = TASK.data[10] + TASK.data[2];
+ TASK.data[10] = sineIndex;
+ waveIndex = sineIndex >> 8;
+ sineValue = Sin(waveIndex, TASK.data[1]);
+
if (TASK.data[0] == 0)
{
- gSprites[spriteId].pos2.x = y;
+ gSprites[spriteId].pos2.x = sineValue;
}
else
{
- if (GetBankSide(TASK.data[5]) == 0)
+ if (GetBankSide(TASK.data[5]) == SIDE_PLAYER)
{
- gSprites[spriteId].pos2.y = (y >= 0) ? y : -y;
+ gSprites[spriteId].pos2.y = (sineValue >= 0) ? sineValue : -sineValue;
}
else
{
- gSprites[spriteId].pos2.y = (y >= 0) ? -y : y;
+ gSprites[spriteId].pos2.y = (sineValue >= 0) ? -sineValue : sineValue;
}
}
- if (((index >= 0x80u) && (TASK.data[11] == 0) && (TASK.data[12] == 1))
- || ((index < 0x7fu) && (TASK.data[11] == 1) && (TASK.data[12] == 0)))
+
+ if (((waveIndex >= 0x80u) && (TASK.data[11] == 0) && (TASK.data[12] == 1))
+ || ((waveIndex < 0x7fu) && (TASK.data[11] == 1) && (TASK.data[12] == 0)))
{
TASK.data[11] ^= 1;
TASK.data[12] ^= 1;
@@ -771,7 +837,13 @@ static void sub_80A8C0C(u8 taskId)
}
}
-void sub_80A8D34(u8 taskId)
+// Scales a mon's sprite, and then scales back to its original dimensions.
+// arg 0: x scale delta
+// arg 1: y scale delta
+// arg 2: duration
+// arg 3: anim bank
+// arg 4: sprite object mode
+void AnimTask_ScaleMonAndRestore(u8 taskId)
{
u8 spriteId;
spriteId = GetAnimBankSpriteId(gBattleAnimArgs[3]);
@@ -783,10 +855,10 @@ void sub_80A8D34(u8 taskId)
TASK.data[4] = spriteId;
TASK.data[10] = 0x100;
TASK.data[11] = 0x100;
- TASK.func = sub_80A8D8C;
+ TASK.func = AnimTask_ScaleMonAndRestoreStep;
}
-static void sub_80A8D8C(u8 taskId)
+static void AnimTask_ScaleMonAndRestoreStep(u8 taskId)
{
u8 spriteId;
TASK.data[10] += TASK.data[0];
diff --git a/src/battle/battle_bg.c b/src/battle/battle_bg.c
new file mode 100644
index 000000000..f97829833
--- /dev/null
+++ b/src/battle/battle_bg.c
@@ -0,0 +1,763 @@
+#include "global.h"
+#include "battle.h"
+#include "constants/songs.h"
+#include "decompress.h"
+#include "ewram.h"
+#include "link.h"
+#include "main.h"
+#include "palette.h"
+#include "task.h"
+#include "text.h"
+#include "text_window.h"
+#include "trainer.h"
+#include "trig.h"
+#include "sound.h"
+
+
+extern u16 gBattleTypeFlags;
+extern u8 gBattleOutcome;
+
+extern struct Window gUnknown_03004210;
+
+extern u8 BattleText_Win[];
+extern u8 BattleText_Loss[];
+extern u8 BattleText_Tie[];
+
+extern void sub_8032A38(void);
+
+#define GetCurrentMapBattleScene sav1_map_get_battletype
+//extern u8 GetCurrentMapBattleScene(void);
+
+extern const u8 gGameVersion;
+extern u8 gBattleTextboxTiles[];
+extern u16 gBattleTextboxTilemap[];
+extern u16 gBattleTextboxPalette[];
+extern u16 gBattleTypeFlags;
+extern struct Trainer gTrainers[];
+extern u16 gTrainerBattleOpponent;
+
+struct BattleBackground {
+ void *tileset;
+ void *tilemap;
+ void *entryTiles;
+ void *entryTilemap;
+ void *palette;
+};
+extern struct BattleBackground gBattleTerrainTable[];
+
+extern u8 gBattleTerrain;
+
+extern u8 gBattleTerrainTiles_Cave[];
+extern u8 gBattleTerrainTiles_Water[];
+extern u8 gBattleTerrainTiles_Building[];
+extern u8 gBattleTerrainTiles_Stadium[];
+
+extern u16 gBattleTerrainTilemap_Cave[];
+extern u16 gBattleTerrainTilemap_Water[];
+extern u16 gBattleTerrainTilemap_Building[];
+extern u16 gBattleTerrainTilemap_Stadium[];
+
+extern u16 gBattleTerrainPalette_Groudon[];
+extern u16 gBattleTerrainPalette_Kyogre[];
+extern u16 gBattleTerrainPalette_BuildingLeader[];
+extern u16 gBattleTerrainPalette_StadiumSteven[];
+extern u16 gBattleTerrainPalette_BuildingGym[];
+extern u16 gBattleTerrainPalette_StadiumMagma[];
+extern u16 gBattleTerrainPalette_StadiumAqua[];
+extern u16 gBattleTerrainPalette_StadiumSidney[];
+extern u16 gBattleTerrainPalette_StadiumPhoebe[];
+extern u16 gBattleTerrainPalette_StadiumGlacia[];
+extern u16 gBattleTerrainPalette_StadiumDrake[];
+extern u16 gBattleTerrainPalette_BattleTower[];
+
+extern u8 gBattleTerrainAnimTiles_Building[];
+extern u16 gBattleTerrainAnimTilemap_Building[];
+extern u8 gBattleTerrainAnimTiles_Cave[];
+extern u16 gBattleTerrainAnimTilemap_Cave[];
+extern u8 gBattleTerrainAnimTiles_Underwater[];
+extern u16 gBattleTerrainAnimTilemap_Underwater[];
+extern u8 gVersusFrameGfx[];
+extern u16 gVersusFrameTilemap[];
+extern u8 gUnknown_08E5DC2C[];
+extern u16 gVersusFramePal[];
+
+extern u16 gBattle_BG1_Y;
+extern u16 gBattle_BG2_Y;
+extern struct CompressedSpriteSheet gUnknown_081F95A4;
+
+extern u8 sav1_map_get_battletype(void);
+
+struct LinkResultWindow {
+ struct Window *window;
+ u16 offset;
+ u8 left;
+ u8 top;
+ u8 *dest;
+};
+
+#define gLinkResultWindows gUnknown_081F9680
+extern const struct LinkResultWindow gLinkResultWindows[];
+extern void PrintLinkBattleWinLossTie(void);
+extern void sub_800DAF8(u8, u8, u8 *);
+
+extern struct SpriteTemplate gSpriteTemplate_81F9574;
+extern struct SpriteTemplate gSpriteTemplate_81F958C;
+extern struct SpriteTemplate gSpriteTemplate_81F96D0;
+
+extern u16 gBattle_BG1_X;
+extern u16 gBattle_BG2_X;
+
+
+void sub_800D6C4(void);
+
+
+void unref_sub_800D684(void)
+{
+ u8 spriteId;
+ ResetSpriteData();
+ spriteId = CreateSprite(&gSpriteTemplate_81F96D0, 0, 0, 0);
+ gSprites[spriteId].invisible = TRUE;
+ SetMainCallback2(sub_800D6C4);
+}
+
+void sub_800D6C4(void)
+{
+ AnimateSprites();
+ BuildOamBuffer();
+}
+
+void sub_800D6D4(void)
+{
+ u16 ime = REG_IME;
+ REG_IME = 0;
+ REG_IE |= INTR_FLAG_VBLANK;
+ REG_IME = ime;
+ REG_DISPSTAT = DISPSTAT_VBLANK_INTR;
+ REG_BG0CNT = 0x9800;
+ REG_BG1CNT = 0x9c04;
+ REG_BG2CNT = 0x5e05;
+ REG_BG3CNT = 0x5a0b;
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ REG_BLDY = 0;
+ REG_DISPCNT = 0xbf40;
+}
+
+void ApplyPlayerChosenFrameToBattleMenu(void)
+{
+ TextWindow_SetBaseTileNum(0x12);
+ TextWindow_LoadStdFrameGraphicsOverridePal(&gUnknown_03004210, 1);
+ TextWindow_SetBaseTileNum(0x22);
+ TextWindow_LoadStdFrameGraphicsOverridePal(&gUnknown_03004210, 1);
+ gPlttBufferUnfaded[92] = 0x7fe0;
+ gPlttBufferUnfaded[93] = 0x2529;
+ gPlttBufferUnfaded[94] = 0x7fff;
+ gPlttBufferUnfaded[95] = 0x675a;
+ CpuSet(&gPlttBufferUnfaded[92], &gPlttBufferFaded[92], 4);
+ sub_8032A38();
+}
+
+void DrawMainBattleBackground(void)
+{
+ if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER /*| BATTLE_TYPE_x2000000*/))
+ {
+ LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000));
+ LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000));
+ LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60);
+ }
+ else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON)
+ {
+ if (gGameVersion == VERSION_RUBY)
+ {
+ LZDecompressVram(gBattleTerrainTiles_Cave, (void*)(VRAM + 0x8000));
+ LZDecompressVram(gBattleTerrainTilemap_Cave, (void*)(VRAM + 0xD000));
+ LoadCompressedPalette(gBattleTerrainPalette_Groudon, 0x20, 0x60);
+ }
+ else
+ {
+ LZDecompressVram(gBattleTerrainTiles_Water, (void*)(VRAM + 0x8000));
+ LZDecompressVram(gBattleTerrainTilemap_Water, (void*)(VRAM + 0xD000));
+ LoadCompressedPalette(gBattleTerrainPalette_Kyogre, 0x20, 0x60);
+ }
+ }
+ else
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
+ {
+ u8 trainerClass = gTrainers[gTrainerBattleOpponent].trainerClass;
+ if (trainerClass == TRAINER_CLASS_LEADER)
+ {
+ LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000));
+ LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000));
+ LoadCompressedPalette(gBattleTerrainPalette_BuildingLeader, 0x20, 0x60);
+ return;
+ }
+ else if (trainerClass == TRAINER_CLASS_CHAMPION)
+ {
+ LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
+ LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
+ LoadCompressedPalette(gBattleTerrainPalette_StadiumSteven, 0x20, 0x60);
+ return;
+ }
+ }
+
+ switch (GetCurrentMapBattleScene())
+ {
+ case MAP_BATTLE_SCENE_NORMAL:
+ LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tileset, (void*)(VRAM + 0x8000));
+ LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tilemap, (void*)(VRAM + 0xD000));
+ LoadCompressedPalette(gBattleTerrainTable[gBattleTerrain].palette, 0x20, 0x60);
+ break;
+ case MAP_BATTLE_SCENE_GYM:
+ LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000));
+ LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000));
+ LoadCompressedPalette(gBattleTerrainPalette_BuildingGym, 0x20, 0x60);
+ break;
+ case MAP_BATTLE_SCENE_MAGMA:
+ LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
+ LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
+ LoadCompressedPalette(gBattleTerrainPalette_StadiumMagma, 0x20, 0x60);
+ break;
+ case MAP_BATTLE_SCENE_AQUA:
+ LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
+ LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
+ LoadCompressedPalette(gBattleTerrainPalette_StadiumAqua, 0x20, 0x60);
+ break;
+ case MAP_BATTLE_SCENE_SIDNEY:
+ LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
+ LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
+ LoadCompressedPalette(gBattleTerrainPalette_StadiumSidney, 0x20, 0x60);
+ break;
+ case MAP_BATTLE_SCENE_PHOEBE:
+ LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
+ LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
+ LoadCompressedPalette(gBattleTerrainPalette_StadiumPhoebe, 0x20, 0x60);
+ break;
+ case MAP_BATTLE_SCENE_GLACIA:
+ LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
+ LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
+ LoadCompressedPalette(gBattleTerrainPalette_StadiumGlacia, 0x20, 0x60);
+ break;
+ case MAP_BATTLE_SCENE_DRAKE:
+ LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
+ LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
+ LoadCompressedPalette(gBattleTerrainPalette_StadiumDrake, 0x20, 0x60);
+ break;
+ case MAP_BATTLE_SCENE_BATTLE_TOWER:
+ LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000));
+ LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000));
+ LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60);
+ break;
+ }
+ }
+}
+
+void LoadBattleTextboxAndBackground(void)
+{
+ LZDecompressVram(gBattleTextboxTiles, (void*)(BG_VRAM));
+ CpuSet(gBattleTextboxTilemap, (void *)(VRAM + 0xC000), 0x800);
+ LoadCompressedPalette(gBattleTextboxPalette, 0, 0x40);
+ ApplyPlayerChosenFrameToBattleMenu();
+ DrawMainBattleBackground();
+
+ #if DEBUG
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ {
+ debug_sub_8008218((void*)(VRAM + 0x600), 0, (void*)(VRAM + 0xC000), 1);
+ debug_sub_8008264(257, 3, 1, 3, 1);
+ debug_sub_8008264(257, 3, 21, 3, 1);
+ debug_sub_8008264(257, 3, 41, 3, 1);
+ }
+ #endif
+}
+
+void sub_800DAF8(u8 taskId, u8 windowId, u8 *dest)
+{
+ int i;
+ u16 r4 = 0;
+ u16 src[6];
+
+ if (gBattleTypeFlags & BATTLE_TYPE_MULTI) {
+ if (gTasks[taskId].data[5]) {
+ switch (windowId) {
+ case 0:
+ r4 = gTasks[taskId].data[3] & 0x3f;
+ break;
+ case 1:
+ r4 = (gTasks[taskId].data[4] & 0xfc0) >> 6;
+ break;
+ case 2:
+ r4 = (gTasks[taskId].data[3] & 0xfc0) >> 6;
+ break;
+ case 3:
+ r4 = gTasks[taskId].data[4] & 0x3f;
+ break;
+ }
+ } else {
+ switch (windowId) {
+ case 0:
+ r4 = gTasks[taskId].data[3] & 0x3f;
+ break;
+ case 1:
+ r4 = gTasks[taskId].data[4] & 0x3f;
+ break;
+ case 2:
+ r4 = (gTasks[taskId].data[3] & 0xfc0) >> 6;
+ break;
+ case 3:
+ r4 = (gTasks[taskId].data[4] & 0xfc0) >> 6;
+ break;
+ }
+ }
+ for (i = 0; i < 3; i++) {
+ src[i] = ((r4 & (3 << (i * 2))) >> (i * 2)) + 0x6001;
+ }
+ CpuSet(src, dest, 3);
+ } else {
+ if (windowId == gBattleStruct->linkPlayerIndex) {
+ r4 = gTasks[taskId].data[3];
+ } else {
+ r4 = gTasks[taskId].data[4];
+ }
+ for (i = 0; i < 6; i++) {
+ src[i] = ((r4 & (3 << (i * 2))) >> (i * 2)) + 0x6001;
+ }
+ CpuSet(src, dest, 6);
+ }
+}
+
+
+#if ENGLISH
+#define LEFT_MESSAGE_X 6
+#define RIGHT_MESSAGE_X 21
+#define TILE_OFFSET_LOSS 168
+#elif GERMAN
+#define LEFT_MESSAGE_X 5
+#define RIGHT_MESSAGE_X 20
+#define TILE_OFFSET_LOSS 172
+#endif
+#define TILE_OFFSET_WIN 160
+#define CENTER_MESSAGE_X 13
+#define MESSAGE_Y 2
+
+#define PRINT_MESSAGE(text, tileDataStartOffset, x) \
+{ \
+ Text_InitWindow(&gUnknown_03004210, text, tileDataStartOffset, x, MESSAGE_Y); \
+ Text_PrintWindow8002F44(&gUnknown_03004210); \
+}
+
+#define PRINT_MESSAGE_LEFT(text, tileDataStartOffset) PRINT_MESSAGE(text, tileDataStartOffset, LEFT_MESSAGE_X)
+#define PRINT_MESSAGE_RIGHT(text, tileDataStartOffset) PRINT_MESSAGE(text, tileDataStartOffset, RIGHT_MESSAGE_X)
+
+void PrintLinkBattleWinLossTie(void)
+{
+
+ if (gBattleOutcome == 3)
+ {
+ PRINT_MESSAGE(BattleText_Tie, TILE_OFFSET_WIN, CENTER_MESSAGE_X);
+ return;
+ }
+
+ if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ {
+ // Double battle?
+
+ if (gBattleOutcome == 1)
+ {
+
+ // lp_field_18 = player position?
+ switch (gLinkPlayers[gBattleStruct->linkPlayerIndex].lp_field_18)
+ {
+ case 0:
+ case 2:
+ PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN);
+ PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS);
+ return;
+
+ case 1:
+ case 3:
+ PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN)
+ PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS)
+ return;
+ }
+ }
+ else
+ {
+
+ switch (gLinkPlayers[gBattleStruct->linkPlayerIndex].lp_field_18)
+ {
+ case 1:
+ case 3:
+ PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN);
+ PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS);
+ return;
+
+ case 0:
+ case 2:
+ PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN);
+ PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS);
+ return;
+ }
+ }
+
+ return;
+ }
+
+
+ if (gBattleOutcome == 1)
+ {
+ if (gLinkPlayers[gBattleStruct->linkPlayerIndex].lp_field_18 != 0)
+ {
+ PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN);
+ PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS);
+ }
+ else
+ {
+ PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN);
+ PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS);
+ }
+ }
+ else
+ {
+ if (gLinkPlayers[gBattleStruct->linkPlayerIndex].lp_field_18 != 0)
+ {
+ PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN);
+ PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS);
+ }
+ else
+ {
+ PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN);
+ PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS);
+ }
+ }
+}
+
+
+void sub_800DE30(u8 taskId)
+{
+ u8 palette;
+ int i;
+
+ switch (gTasks[taskId].data[0]) {
+
+ case 0:
+ if (gBattleTypeFlags & BATTLE_TYPE_MULTI) {
+ for (i = 0; i < 4; i++) {
+ u8 windowId = (gLinkPlayers[i].lp_field_18 & 3);
+ Text_InitWindow8002E4C(
+ gLinkResultWindows[windowId].window,
+ gLinkPlayers[i].name,
+ gLinkResultWindows[windowId].offset,
+ gLinkResultWindows[windowId].left,
+ gLinkResultWindows[windowId].top,
+ 1);
+ Text_PrintWindow8002F44(gLinkResultWindows[windowId].window);
+ sub_800DAF8(taskId, windowId, gLinkResultWindows[windowId].dest);
+ }
+ } else {
+ u8 windowId = 4;
+
+ u8 playerId = gBattleStruct->linkPlayerIndex;
+ u8 opponentId = gBattleStruct->linkPlayerIndex ^ 1;
+ if (gLinkPlayers[playerId].lp_field_18) {
+ opponentId = gBattleStruct->linkPlayerIndex;
+ playerId = gBattleStruct->linkPlayerIndex ^ 1;
+ }
+
+ Text_InitWindow8002E4C(
+ gLinkResultWindows[windowId].window,
+ gLinkPlayers[playerId].name,
+ gLinkResultWindows[windowId].offset,
+ gLinkResultWindows[windowId].left,
+ gLinkResultWindows[windowId].top,
+ 1);
+ Text_PrintWindow8002F44(gLinkResultWindows[windowId].window);
+ sub_800DAF8(taskId, playerId, gLinkResultWindows[windowId].dest);
+
+ Text_InitWindow8002E4C(
+ gLinkResultWindows[windowId + 1].window,
+ gLinkPlayers[opponentId].name,
+ gLinkResultWindows[windowId + 1].offset,
+ gLinkResultWindows[windowId + 1].left,
+ gLinkResultWindows[windowId + 1].top,
+ 1);
+ Text_PrintWindow8002F44(gLinkResultWindows[windowId + 1].window);
+ sub_800DAF8(taskId, opponentId, gLinkResultWindows[windowId + 1].dest);
+ }
+ gTasks[taskId].data[0]++;
+ break;
+
+ case 1:
+ palette = AllocSpritePalette(10000);
+ gPlttBufferUnfaded[palette * 16 + 0x10f] = gPlttBufferFaded[palette * 16 + 0x10f] = 0x7fff;
+ gBattleStruct->unk1608A = CreateSprite(&gSpriteTemplate_81F9574, 108, 80, 0);
+ gBattleStruct->unk1608B = CreateSprite(&gSpriteTemplate_81F958C, 132, 80, 0);
+ gSprites[gBattleStruct->unk1608A].invisible = TRUE;
+ gSprites[gBattleStruct->unk1608B].invisible = TRUE;
+ gTasks[taskId].data[0]++;
+ break;
+
+ case 2:
+ if (gTasks[taskId].data[5]) {
+ gBattle_BG1_X = (-20) - (Sin2(gTasks[taskId].data[1]) / 32);
+ gBattle_BG2_X = (-140) - (Sin2(gTasks[taskId].data[2]) / 32);
+ gBattle_BG1_Y = -36;
+ gBattle_BG2_Y = -36;
+ } else {
+ gBattle_BG1_X = (-20) - (Sin2(gTasks[taskId].data[1]) / 32);
+ gBattle_BG1_Y = (-164) + (Cos2(gTasks[taskId].data[1]) / 32);
+ gBattle_BG2_X = (-140) - (Sin2(gTasks[taskId].data[2]) / 32);
+ gBattle_BG2_Y = (-164) + (Cos2(gTasks[taskId].data[2]) / 32);
+ }
+ if (gTasks[taskId].data[2]) {
+ gTasks[taskId].data[2] -= 2;
+ gTasks[taskId].data[1] += 2;
+ } else {
+ if (gTasks[taskId].data[5]) {
+ PrintLinkBattleWinLossTie();
+ }
+ PlaySE(SE_W231);
+ DestroyTask(taskId);
+ gSprites[gBattleStruct->unk1608A].invisible = FALSE;
+ gSprites[gBattleStruct->unk1608B].invisible = FALSE;
+ gSprites[gBattleStruct->unk1608B].oam.tileNum += 0x40;
+ gSprites[gBattleStruct->unk1608A].data[0] = 0;
+ gSprites[gBattleStruct->unk1608B].data[0] = 1;
+ gSprites[gBattleStruct->unk1608A].data[1] = gSprites[gBattleStruct->unk1608A].pos1.x;
+ gSprites[gBattleStruct->unk1608B].data[1] = gSprites[gBattleStruct->unk1608B].pos1.x;
+ gSprites[gBattleStruct->unk1608A].data[2] = 0;
+ gSprites[gBattleStruct->unk1608B].data[2] = 0;
+ }
+ break;
+ }
+}
+
+void LoadBattleEntryBackground(void) {
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK) {
+ LZDecompressVram(gVersusFrameGfx, (void *)0x6004000);
+ LZDecompressVram(gVersusFrameTilemap, (void *)0x600e000);
+ LZDecompressVram(gVersusFrameTilemap, (void *)0x600f000);
+ LZDecompressVram(gUnknown_08E5DC2C, (void *)0x6010000);
+ LoadCompressedPalette(gVersusFramePal, 0x60, 0x20);
+ REG_BG1CNT = 0x5c04;
+ REG_WININ = 0x36;
+ REG_WINOUT = 0x36;
+ gBattle_BG1_Y = 0xff5c;
+ gBattle_BG2_Y = 0xff5c;
+ LoadCompressedObjectPic(&gUnknown_081F95A4);
+ return;
+ } else if (gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) {
+ LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)0x6004000);
+ LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void *)0x600e000);
+ return;
+ } else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) {
+ if (gGameVersion == VERSION_RUBY) {
+ LZDecompressVram(gBattleTerrainAnimTiles_Cave, (void *)0x6004000);
+ LZDecompressVram(gBattleTerrainAnimTilemap_Cave, (void *)0x600e000);
+ return;
+ } else {
+ LZDecompressVram(gBattleTerrainAnimTiles_Underwater, (void *)0x6004000);
+ LZDecompressVram(gBattleTerrainAnimTilemap_Underwater, (void *)0x600e000);
+ return;
+ }
+ } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) {
+ if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x19) {
+ LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)0x6004000);
+ LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void *)0x600e000);
+ return;
+ } else if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x20) {
+ LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)0x6004000);
+ LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void *)0x600e000);
+ return;
+ }
+ }
+ if (sav1_map_get_battletype() == 0) {
+ LZDecompressVram(gBattleTerrainTable[gBattleTerrain].entryTiles, (void *)0x6004000);
+ LZDecompressVram(gBattleTerrainTable[gBattleTerrain].entryTilemap, (void *)0x600e000);
+ return;
+ }
+ LZDecompressVram(gBattleTerrainAnimTiles_Building, (void *)0x6004000);
+ LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void *)0x600e000);
+}
+
+int LoadChosenBattleElement(u8 type) {
+ int ret = 0;
+ switch (type) {
+ case 0:
+ LZDecompressVram(&gBattleTextboxTiles, (void *)0x6000000);
+ break;
+ case 1:
+ CpuCopy16(gBattleTextboxTilemap, (void *)0x600c000, 0x1000);
+ break;
+ case 2:
+ LoadCompressedPalette(gBattleTextboxPalette, 0, 0x40);
+ break;
+ case 3: // tiles
+ if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) {
+ if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) {
+ if (gGameVersion == VERSION_RUBY) {
+ LZDecompressVram(gBattleTerrainTiles_Cave, (void *)0x6008000);
+ break;
+ } else {
+ LZDecompressVram(gBattleTerrainTiles_Water, (void *)0x6008000);
+ break;
+ }
+ } else {
+ if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) {
+ if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x19) {
+ LZDecompressVram(gBattleTerrainTiles_Building, (void *)0x6008000);
+ break;
+ } else if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x20) {
+ LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000);
+ break;
+ }
+ }
+ switch (sav1_map_get_battletype()) {
+ case 0:
+ LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tileset, (void *)0x6008000);
+ break;
+ case 2:
+ LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000);
+ break;
+ case 3:
+ LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000);
+ break;
+ case 4:
+ LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000);
+ break;
+ case 5:
+ LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000);
+ break;
+ case 6:
+ LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000);
+ break;
+ case 7:
+ LZDecompressVram(gBattleTerrainTiles_Stadium, (void *)0x6008000);
+ break;
+ case 1:
+ case 8:
+ LZDecompressVram(gBattleTerrainTiles_Building, (void *)0x6008000);
+ break;
+ }
+ break;
+ }
+ } else {
+ LZDecompressVram(gBattleTerrainTiles_Building, (void *)0x6008000);
+ break;
+ }
+ case 4: // tilemap
+ if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) {
+ if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) {
+ if (gGameVersion == 2) {
+ LZDecompressVram(gBattleTerrainTilemap_Cave, (void *)0x600d000);
+ break;
+ } else {
+ LZDecompressVram(gBattleTerrainTilemap_Water, (void *)0x600d000);
+ break;
+ }
+ } else {
+ if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) {
+ if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x19) {
+ LZDecompressVram(gBattleTerrainTilemap_Building, (void *)0x600d000);
+ break;
+ } else if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x20) {
+ LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000);
+ break;
+ }
+ }
+ switch (sav1_map_get_battletype()) {
+ case 0:
+ LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tilemap, (void *)0x600d000);
+ break;
+ case 2:
+ LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000);
+ break;
+ case 3:
+ LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000);
+ break;
+ case 4:
+ LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000);
+ break;
+ case 5:
+ LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000);
+ break;
+ case 6:
+ LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000);
+ break;
+ case 7:
+ LZDecompressVram(gBattleTerrainTilemap_Stadium, (void *)0x600d000);
+ break;
+ case 1:
+ case 8:
+ LZDecompressVram(gBattleTerrainTilemap_Building, (void *)0x600d000);
+ break;
+ }
+ break;
+ }
+ } else {
+ LZDecompressVram(gBattleTerrainTilemap_Building, (void *)0x600d000);
+ break;
+ }
+ case 5: // palette
+ if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK))) {
+ if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) {
+ if (gGameVersion == 2) {
+ LoadCompressedPalette(gBattleTerrainPalette_Groudon, 0x20, 0x60);
+ break;
+ } else {
+ LoadCompressedPalette(gBattleTerrainPalette_Kyogre, 0x20, 0x60);
+ break;
+ }
+ } else {
+ if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) {
+ if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x19) {
+ LoadCompressedPalette(gBattleTerrainPalette_BuildingLeader, 0x20, 0x60);
+ break;
+ } else if (gTrainers[gTrainerBattleOpponent].trainerClass == 0x20) {
+ LoadCompressedPalette(gBattleTerrainPalette_StadiumSteven, 0x20, 0x60);
+ break;
+ }
+ }
+ switch (sav1_map_get_battletype()) {
+ case 0:
+ LoadCompressedPalette(gBattleTerrainTable[gBattleTerrain].palette, 0x20, 0x60);
+ break;
+ case 1:
+ LoadCompressedPalette(gBattleTerrainPalette_BuildingGym, 0x20, 0x60);
+ break;
+ case 2:
+ LoadCompressedPalette(gBattleTerrainPalette_StadiumMagma, 0x20, 0x60);
+ break;
+ case 3:
+ LoadCompressedPalette(gBattleTerrainPalette_StadiumAqua, 0x20, 0x60);
+ break;
+ case 4:
+ LoadCompressedPalette(gBattleTerrainPalette_StadiumSidney, 0x20, 0x60);
+ break;
+ case 5:
+ LoadCompressedPalette(gBattleTerrainPalette_StadiumPhoebe, 0x20, 0x60);
+ break;
+ case 6:
+ LoadCompressedPalette(gBattleTerrainPalette_StadiumGlacia, 0x20, 0x60);
+ break;
+ case 7:
+ LoadCompressedPalette(gBattleTerrainPalette_StadiumDrake, 0x20, 0x60);
+ break;
+ case 8:
+ LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60);
+ break;
+ }
+ break;
+ }
+ } else {
+ LoadCompressedPalette(gBattleTerrainPalette_BattleTower, 0x20, 0x60);
+ break;
+ }
+ case 6:
+ ApplyPlayerChosenFrameToBattleMenu();
+ break;
+ default:
+ ret = 1;
+ }
+ return ret;
+}
diff --git a/src/battle/battle_controller_linkopponent.c b/src/battle/battle_controller_linkopponent.c
index 40f50d7ff..21ac62401 100644
--- a/src/battle/battle_controller_linkopponent.c
+++ b/src/battle/battle_controller_linkopponent.c
@@ -27,7 +27,7 @@ struct MovePpInfo
extern u8 gActiveBank;
extern u8 gBattleBufferA[][0x200];
-extern u8 gObjectBankIDs[];
+extern u8 gBankSpriteIds[];
extern u16 gBattlePartyID[];
extern u8 gHealthboxIDs[];
extern u16 gBattleTypeFlags;
@@ -73,7 +73,7 @@ extern void sub_80313A0(struct Sprite *);
extern void sub_803757C(void);
extern void oamt_add_pos2_onto_pos1();
extern void StoreSpriteCallbackInData();
-extern void sub_8078B34(struct Sprite *);
+extern void StartTranslateAnimSpriteByDeltas(struct Sprite *);
extern void sub_80375B4(void);
extern void sub_8010384(struct Sprite *);
extern void sub_8037B78(void);
@@ -266,18 +266,18 @@ void sub_803752C(void)
void sub_803757C(void)
{
- if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
LinkOpponentBufferExecCompleted();
}
void sub_80375B4(void)
{
- if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBankSpriteIds[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]]);
+ sub_8031B74(gSprites[gBankSpriteIds[gActiveBank]].oam.affineParam);
+ gSprites[gBankSpriteIds[gActiveBank]].oam.tileNum = gSprites[gBankSpriteIds[gActiveBank]].data[5];
+ FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
+ DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
LinkOpponentBufferExecCompleted();
}
}
@@ -381,8 +381,8 @@ void sub_8037840(void)
void sub_8037A74(void)
{
- if (gSprites[gObjectBankIDs[gActiveBank]].animEnded == TRUE
- && gSprites[gObjectBankIDs[gActiveBank]].pos2.x == 0)
+ if (gSprites[gBankSpriteIds[gActiveBank]].animEnded == TRUE
+ && gSprites[gBankSpriteIds[gActiveBank]].pos2.x == 0)
{
if (!ewram17810[gActiveBank].unk0_7)
{
@@ -414,7 +414,7 @@ void sub_8037B24(void)
void sub_8037B78(void)
{
- if (!gSprites[gObjectBankIDs[gActiveBank]].inUse)
+ if (!gSprites[gBankSpriteIds[gActiveBank]].inUse)
{
sub_8043DB0(gHealthboxIDs[gActiveBank]);
LinkOpponentBufferExecCompleted();
@@ -425,8 +425,8 @@ void sub_8037BBC(void)
{
if (!ewram17810[gActiveBank].unk0_6)
{
- FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]);
- DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]);
+ FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
+ DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
sub_8032A08(gActiveBank);
sub_8043DB0(gHealthboxIDs[gActiveBank]);
LinkOpponentBufferExecCompleted();
@@ -441,7 +441,7 @@ void sub_8037C2C(void)
void dp01t_0F_4_move_anim(void)
{
- u8 spriteId = gObjectBankIDs[gActiveBank];
+ u8 spriteId = gBankSpriteIds[gActiveBank];
if (gSprites[spriteId].data[1] == 32)
{
@@ -485,7 +485,7 @@ void sub_8037D64(void)
ewram17810[gActiveBank].unk1_0 = 0;
FreeSpriteTilesByTag(0x27F9);
FreeSpritePaletteByTag(0x27F9);
- StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 0);
+ StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 0);
sub_8045A5C(
gHealthboxIDs[gActiveBank],
&gEnemyParty[gBattlePartyID[gActiveBank]],
@@ -1155,15 +1155,15 @@ void LinkOpponentHandleLoadPokeSprite(void)
BattleLoadOpponentMonSprite(&gEnemyParty[gBattlePartyID[gActiveBank]], gActiveBank);
GetMonSpriteTemplate_803C56C(species, GetBankIdentity(gActiveBank));
- gObjectBankIDs[gActiveBank] = CreateSprite(
+ gBankSpriteIds[gActiveBank] = CreateSprite(
&gUnknown_02024E8C,
GetBankPosition(gActiveBank, 2),
sub_8077F68(gActiveBank),
sub_8079E90(gActiveBank));
- gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -240;
- gSprites[gObjectBankIDs[gActiveBank]].data[0] = gActiveBank;
- gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank;
- StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], gBattleMonForms[gActiveBank]);
+ gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240;
+ gSprites[gBankSpriteIds[gActiveBank]].data[0] = gActiveBank;
+ gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank;
+ StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], gBattleMonForms[gActiveBank]);
sub_8032984(gActiveBank, GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES));
gBattleBankFunc[gActiveBank] = sub_8037A74;
}
@@ -1185,18 +1185,18 @@ void sub_8039430(u8 a, u8 b)
gUnknown_0300434C[a] = CreateInvisibleSpriteWithCallback(sub_80312F0);
BattleLoadOpponentMonSprite(&gEnemyParty[gBattlePartyID[a]], a);
GetMonSpriteTemplate_803C56C(species, GetBankIdentity(a));
- gObjectBankIDs[a] = CreateSprite(
+ gBankSpriteIds[a] = CreateSprite(
&gUnknown_02024E8C,
GetBankPosition(a, 2),
sub_8077F68(a),
sub_8079E90(a));
- 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]].data[1] = gBankSpriteIds[a];
+ gSprites[gBankSpriteIds[a]].data[0] = a;
+ gSprites[gBankSpriteIds[a]].data[2] = species;
+ gSprites[gBankSpriteIds[a]].oam.paletteNum = a;
+ StartSpriteAnim(&gSprites[gBankSpriteIds[a]], gBattleMonForms[a]);
+ gSprites[gBankSpriteIds[a]].invisible = TRUE;
+ gSprites[gBankSpriteIds[a]].callback = SpriteCallbackDummy;
gSprites[gUnknown_0300434C[a]].data[0] = sub_8046400(0, 0xFE);
}
@@ -1209,8 +1209,8 @@ void LinkOpponentHandleReturnPokeToBall(void)
}
else
{
- FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]);
- DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]);
+ FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
+ DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
sub_8032A08(gActiveBank);
sub_8043DB0(gHealthboxIDs[gActiveBank]);
LinkOpponentBufferExecCompleted();
@@ -1257,17 +1257,17 @@ void LinkOpponentHandleTrainerThrow(void)
}
sub_8031A6C(gender, gActiveBank);
GetMonSpriteTemplate_803C5A0(gender, GetBankIdentity(gActiveBank));
- gObjectBankIDs[gActiveBank] = CreateSprite(
+ gBankSpriteIds[gActiveBank] = CreateSprite(
&gUnknown_02024E8C,
176 + xOffset, 40 + 4 * (8 - gTrainerFrontPicCoords[gender].coords),
sub_8079E90(gActiveBank));
- gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -240;
- gSprites[gObjectBankIDs[gActiveBank]].data[0] = 2;
- gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[gender].tag);
- 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;
+ gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240;
+ gSprites[gBankSpriteIds[gActiveBank]].data[0] = 2;
+ gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[gender].tag);
+ gSprites[gBankSpriteIds[gActiveBank]].data[5] = gSprites[gBankSpriteIds[gActiveBank]].oam.tileNum;
+ gSprites[gBankSpriteIds[gActiveBank]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[gender].tag);
+ gSprites[gBankSpriteIds[gActiveBank]].oam.affineParam = gender;
+ gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80313A0;
gBattleBankFunc[gActiveBank] = sub_803757C;
}
@@ -1278,12 +1278,12 @@ void LinkOpponentHandleTrainerSlide(void)
void LinkOpponentHandleTrainerSlideBack(void)
{
- oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]);
- 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;
- StoreSpriteCallbackInData(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy);
+ oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]);
+ gSprites[gBankSpriteIds[gActiveBank]].data[0] = 35;
+ gSprites[gBankSpriteIds[gActiveBank]].data[2] = 280;
+ gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y;
+ gSprites[gBankSpriteIds[gActiveBank]].callback = StartTranslateAnimSpriteByDeltas;
+ StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBank]], SpriteCallbackDummy);
gBattleBankFunc[gActiveBank] = sub_80375B4;
}
@@ -1299,7 +1299,7 @@ void LinkOpponentHandlecmd10(void)
{
ewram17810[gActiveBank].unk4 = 0;
PlaySE12WithPanning(SE_POKE_DEAD, 63);
- gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8010384;
+ gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8010384;
gBattleBankFunc[gActiveBank] = sub_8037B78;
}
}
@@ -1574,14 +1574,14 @@ void LinkOpponentHandlecmd40(void)
void LinkOpponentHandleHitAnimation(void)
{
- if (gSprites[gObjectBankIDs[gActiveBank]].invisible == TRUE)
+ if (gSprites[gBankSpriteIds[gActiveBank]].invisible == TRUE)
{
LinkOpponentBufferExecCompleted();
}
else
{
gDoingBattleAnim = TRUE;
- gSprites[gObjectBankIDs[gActiveBank]].data[1] = 0;
+ gSprites[gBankSpriteIds[gActiveBank]].data[1] = 0;
sub_8047858(gActiveBank);
gBattleBankFunc[gActiveBank] = dp01t_0F_4_move_anim;
}
@@ -1629,12 +1629,12 @@ void LinkOpponentHandleTrainerBallThrow(void)
{
u8 taskId;
- oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]);
- 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;
- StoreSpriteCallbackInData(&gSprites[gObjectBankIDs[gActiveBank]], sub_803A3A8);
+ oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]);
+ gSprites[gBankSpriteIds[gActiveBank]].data[0] = 35;
+ gSprites[gBankSpriteIds[gActiveBank]].data[2] = 280;
+ gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y;
+ gSprites[gBankSpriteIds[gActiveBank]].callback = StartTranslateAnimSpriteByDeltas;
+ StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBank]], sub_803A3A8);
taskId = CreateTask(sub_803A2C4, 5);
gTasks[taskId].data[0] = gActiveBank;
if (ewram17810[gActiveBank].unk0_0)
@@ -1733,7 +1733,7 @@ void LinkOpponentHandleSpriteInvisibility(void)
{
if (IsBankSpritePresent(gActiveBank) != 0)
{
- gSprites[gObjectBankIDs[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1];
+ gSprites[gBankSpriteIds[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1];
sub_8031F88(gActiveBank);
}
LinkOpponentBufferExecCompleted();
diff --git a/src/battle/battle_controller_linkpartner.c b/src/battle/battle_controller_linkpartner.c
index 3a16e12e6..1d42f56c3 100644
--- a/src/battle/battle_controller_linkpartner.c
+++ b/src/battle/battle_controller_linkpartner.c
@@ -35,7 +35,7 @@ extern u8 gBattleBufferA[][0x200];
extern u8 gActiveBank;
extern u32 gBattleExecBuffer;
extern u16 gBattlePartyID[];
-extern u8 gObjectBankIDs[];
+extern u8 gBankSpriteIds[];
extern u8 gBattleOutcome;
extern u16 gUnknown_02024DE8;
extern u8 gUnknown_02024E68[];
@@ -76,7 +76,7 @@ extern u8 sub_8031720();
extern u8 mplay_80342A4();
extern void oamt_add_pos2_onto_pos1();
extern void StoreSpriteCallbackInData();
-extern void sub_8078B34(struct Sprite *);
+extern void StartTranslateAnimSpriteByDeltas(struct Sprite *);
extern void sub_80105EC(struct Sprite *);
extern s32 sub_803FC34(u16);
extern void LoadPlayerTrainerBankSprite();
@@ -260,17 +260,17 @@ void LinkPartnerBufferRunCommand(void)
void sub_811DAE4(void)
{
- if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
LinkPartnerBufferExecCompleted();
}
void sub_811DB1C(void)
{
- if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
{
nullsub_10(0);
- FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]);
- DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]);
+ FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
+ DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
LinkPartnerBufferExecCompleted();
}
}
@@ -338,8 +338,8 @@ void sub_811DCA0(void)
void sub_811DDE8(void)
{
- if (gSprites[gObjectBankIDs[gActiveBank]].animEnded
- && gSprites[gObjectBankIDs[gActiveBank]].pos2.x == 0)
+ if (gSprites[gBankSpriteIds[gActiveBank]].animEnded
+ && gSprites[gBankSpriteIds[gActiveBank]].pos2.x == 0)
LinkPartnerBufferExecCompleted();
}
@@ -362,11 +362,11 @@ void bx_t3_healthbar_update(void)
void sub_811DE98(void)
{
- if (gSprites[gObjectBankIDs[gActiveBank]].pos1.y + gSprites[gObjectBankIDs[gActiveBank]].pos2.y > 160)
+ if (gSprites[gBankSpriteIds[gActiveBank]].pos1.y + gSprites[gBankSpriteIds[gActiveBank]].pos2.y > 160)
{
nullsub_9(GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES));
- FreeOamMatrix(gSprites[gObjectBankIDs[gActiveBank]].oam.matrixNum);
- DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]);
+ FreeOamMatrix(gSprites[gBankSpriteIds[gActiveBank]].oam.matrixNum);
+ DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
sub_8043DB0(gHealthboxIDs[gActiveBank]);
LinkPartnerBufferExecCompleted();
}
@@ -376,8 +376,8 @@ void sub_811DF34(void)
{
if (!ewram17810[gActiveBank].unk0_6)
{
- FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]);
- DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]);
+ FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
+ DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
sub_8043DB0(gHealthboxIDs[gActiveBank]);
LinkPartnerBufferExecCompleted();
}
@@ -391,7 +391,7 @@ void sub_811DFA0(void)
void bx_blink_t3(void)
{
- u8 spriteId = gObjectBankIDs[gActiveBank];
+ u8 spriteId = gBankSpriteIds[gActiveBank];
if (gSprites[spriteId].data[1] == 32)
{
gSprites[spriteId].data[1] = 0;
@@ -435,7 +435,7 @@ void sub_811E0CC(void)
FreeSpritePaletteByTag(0x27F9);
CreateTask(c3_0802FDF4, 10);
HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
- StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 0);
+ StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 0);
sub_8045A5C(gHealthboxIDs[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], 0);
sub_804777C(gActiveBank);
sub_8043DFC(gHealthboxIDs[gActiveBank]);
@@ -1104,15 +1104,15 @@ void LinkPartnerHandleLoadPokeSprite(void)
GetMonSpriteTemplate_803C56C(
GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES),
GetBankIdentity(gActiveBank));
- gObjectBankIDs[gActiveBank] = CreateSprite(
+ gBankSpriteIds[gActiveBank] = CreateSprite(
&gUnknown_02024E8C,
GetBankPosition(gActiveBank, 2),
sub_8077F68(gActiveBank),
sub_8079E90(gActiveBank));
- gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -240;
- gSprites[gObjectBankIDs[gActiveBank]].data[0] = gActiveBank;
- gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank;
- StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], gBattleMonForms[gActiveBank]);
+ gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240;
+ gSprites[gBankSpriteIds[gActiveBank]].data[0] = gActiveBank;
+ gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank;
+ StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], gBattleMonForms[gActiveBank]);
gBattleBankFunc[gActiveBank] = sub_811DDE8;
}
@@ -1134,18 +1134,18 @@ void sub_811F864(u8 a, u8 b)
species = GetMonData(&gPlayerParty[gBattlePartyID[a]], MON_DATA_SPECIES);
gUnknown_0300434C[a] = CreateInvisibleSpriteWithCallback(sub_80312F0);
GetMonSpriteTemplate_803C56C(species, GetBankIdentity(a));
- gObjectBankIDs[a] = CreateSprite(
+ gBankSpriteIds[a] = CreateSprite(
&gUnknown_02024E8C,
GetBankPosition(a, 2),
sub_8077F68(a),
sub_8079E90(a));
- 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]].data[1] = gBankSpriteIds[a];
+ gSprites[gBankSpriteIds[a]].data[0] = a;
+ gSprites[gBankSpriteIds[a]].data[2] = species;
+ gSprites[gBankSpriteIds[a]].oam.paletteNum = a;
+ StartSpriteAnim(&gSprites[gBankSpriteIds[a]], gBattleMonForms[a]);
+ gSprites[gBankSpriteIds[a]].invisible = TRUE;
+ gSprites[gBankSpriteIds[a]].callback = SpriteCallbackDummy;
gSprites[gUnknown_0300434C[a]].data[0] = sub_8046400(0, 0xFF);
}
@@ -1158,8 +1158,8 @@ void LinkPartnerHandleReturnPokeToBall(void)
}
else
{
- FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]);
- DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]);
+ FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
+ DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
sub_8043DB0(gHealthboxIDs[gActiveBank]);
LinkPartnerBufferExecCompleted();
}
@@ -1205,14 +1205,14 @@ void LinkPartnerHandleTrainerThrow(void)
}
LoadPlayerTrainerBankSprite(gender, gActiveBank);
GetMonSpriteTemplate_803C5A0(gender, GetBankIdentity(gActiveBank));
- gObjectBankIDs[gActiveBank] = CreateSprite(
+ gBankSpriteIds[gActiveBank] = CreateSprite(
&gUnknown_02024E8C,
80 + xOffset, 80 + 4 * (8 - gTrainerBackPicCoords[gender].coords),
sub_8079E90(gActiveBank));
- gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank;
- gSprites[gObjectBankIDs[gActiveBank]].pos2.x = 240;
- gSprites[gObjectBankIDs[gActiveBank]].data[0] = -2;
- gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0;
+ gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank;
+ gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 240;
+ gSprites[gBankSpriteIds[gActiveBank]].data[0] = -2;
+ gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80313A0;
gBattleBankFunc[gActiveBank] = sub_811DAE4;
}
@@ -1223,12 +1223,12 @@ void LinkPartnerHandleTrainerSlide(void)
void LinkPartnerHandleTrainerSlideBack(void)
{
- oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]);
- 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;
- StoreSpriteCallbackInData(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy);
+ oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]);
+ gSprites[gBankSpriteIds[gActiveBank]].data[0] = 35;
+ gSprites[gBankSpriteIds[gActiveBank]].data[2] = -40;
+ gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y;
+ gSprites[gBankSpriteIds[gActiveBank]].callback = StartTranslateAnimSpriteByDeltas;
+ StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBank]], SpriteCallbackDummy);
gBattleBankFunc[gActiveBank] = sub_811DB1C;
}
@@ -1245,9 +1245,9 @@ void LinkPartnerHandlecmd10(void)
ewram17810[gActiveBank].unk4 = 0;
HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
PlaySE12WithPanning(SE_POKE_DEAD, -64);
- gSprites[gObjectBankIDs[gActiveBank]].data[1] = 0;
- gSprites[gObjectBankIDs[gActiveBank]].data[2] = 5;
- gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80105EC;
+ gSprites[gBankSpriteIds[gActiveBank]].data[1] = 0;
+ gSprites[gBankSpriteIds[gActiveBank]].data[2] = 5;
+ gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80105EC;
gBattleBankFunc[gActiveBank] = sub_811DE98;
}
}
@@ -1519,14 +1519,14 @@ void LinkPartnerHandlecmd40(void)
void LinkPartnerHandleHitAnimation(void)
{
- if (gSprites[gObjectBankIDs[gActiveBank]].invisible == TRUE)
+ if (gSprites[gBankSpriteIds[gActiveBank]].invisible == TRUE)
{
LinkPartnerBufferExecCompleted();
}
else
{
gDoingBattleAnim = TRUE;
- gSprites[gObjectBankIDs[gActiveBank]].data[1] = 0;
+ gSprites[gBankSpriteIds[gActiveBank]].data[1] = 0;
sub_8047858(gActiveBank);
gBattleBankFunc[gActiveBank] = bx_blink_t3;
}
@@ -1575,19 +1575,19 @@ void LinkPartnerHandleTrainerBallThrow(void)
u8 r4;
u8 taskId;
- oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]);
- 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]].data[5] = gActiveBank;
- StoreSpriteCallbackInData(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38);
- StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1);
+ oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]);
+ gSprites[gBankSpriteIds[gActiveBank]].data[0] = 50;
+ gSprites[gBankSpriteIds[gActiveBank]].data[2] = -40;
+ gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y;
+ gSprites[gBankSpriteIds[gActiveBank]].callback = StartTranslateAnimSpriteByDeltas;
+ gSprites[gBankSpriteIds[gActiveBank]].data[5] = gActiveBank;
+ StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBank]], sub_8030E38);
+ StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 1);
r4 = AllocSpritePalette(0xD6F9);
LoadCompressedPalette(
gTrainerBackPicPaletteTable[gLinkPlayers[sub_803FC34(gActiveBank)].gender].data,
0x100 + r4 * 16, 0x20);
- gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = r4;
+ gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = r4;
taskId = CreateTask(sub_812071C, 5);
gTasks[taskId].data[0] = gActiveBank;
if (ewram17810[gActiveBank].unk0_0)
@@ -1673,7 +1673,7 @@ void LinkPartnerHandleSpriteInvisibility(void)
{
if (IsBankSpritePresent(gActiveBank) != 0)
{
- gSprites[gObjectBankIDs[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1];
+ gSprites[gBankSpriteIds[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1];
sub_8031F88(gActiveBank);
}
LinkPartnerBufferExecCompleted();
diff --git a/src/battle/battle_controller_opponent.c b/src/battle/battle_controller_opponent.c
index 5947053b6..e986eb38d 100644
--- a/src/battle/battle_controller_opponent.c
+++ b/src/battle/battle_controller_opponent.c
@@ -30,10 +30,11 @@ struct MovePpInfo
u8 ppBonuses;
};
+extern u8 gUnknown_02023A14_50;
extern u8 gActiveBank;
extern u8 gBattleBufferA[][0x200];
extern u16 gBattlePartyID[];
-extern u8 gObjectBankIDs[];
+extern u8 gBankSpriteIds[];
extern u8 gBattleMonForms[];
extern struct SpriteTemplate gUnknown_02024E8C;
extern void (*gBattleBankFunc[])(void);
@@ -83,7 +84,7 @@ extern void sub_80313A0(struct Sprite *);
extern void sub_8032B4C(void);
extern void sub_8031A6C(u16, u8);
extern void sub_8032B84(void);
-extern void sub_8078B34(struct Sprite *);
+extern void StartTranslateAnimSpriteByDeltas(struct Sprite *);
extern void sub_8032BBC(void);
extern void oamt_add_pos2_onto_pos1();
extern void StoreSpriteCallbackInData();
@@ -279,25 +280,25 @@ void OpponentBufferRunCommand(void)
void sub_8032B4C(void)
{
- if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
OpponentBufferExecCompleted();
}
// Duplicate of sub_8032B4C
void sub_8032B84(void)
{
- if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
OpponentBufferExecCompleted();
}
void sub_8032BBC(void)
{
- if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBankSpriteIds[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]]);
+ sub_8031B74(gSprites[gBankSpriteIds[gActiveBank]].oam.affineParam);
+ gSprites[gBankSpriteIds[gActiveBank]].oam.tileNum = gSprites[gBankSpriteIds[gActiveBank]].data[5];
+ FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
+ DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
OpponentBufferExecCompleted();
}
}
@@ -385,8 +386,8 @@ void sub_8032E2C(void)
void sub_8033018(void)
{
- if (gSprites[gObjectBankIDs[gActiveBank]].animEnded == TRUE
- && gSprites[gObjectBankIDs[gActiveBank]].pos2.x == 0)
+ if (gSprites[gBankSpriteIds[gActiveBank]].animEnded == TRUE
+ && gSprites[gBankSpriteIds[gActiveBank]].pos2.x == 0)
{
if (!ewram17810[gActiveBank].unk0_7)
{
@@ -418,7 +419,7 @@ void sub_80330C8(void)
void sub_803311C(void)
{
- if (!gSprites[gObjectBankIDs[gActiveBank]].inUse)
+ if (!gSprites[gBankSpriteIds[gActiveBank]].inUse)
{
sub_8043DB0(gHealthboxIDs[gActiveBank]);
OpponentBufferExecCompleted();
@@ -429,8 +430,8 @@ void sub_8033160(void)
{
if (!ewram17810[gActiveBank].unk0_6)
{
- FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]);
- DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]);
+ FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
+ DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
sub_8032A08(gActiveBank);
sub_8043DB0(gHealthboxIDs[gActiveBank]);
OpponentBufferExecCompleted();
@@ -445,7 +446,7 @@ void sub_80331D0(void)
void bx_blink_t7(void)
{
- u8 spriteId = gObjectBankIDs[gActiveBank];
+ u8 spriteId = gBankSpriteIds[gActiveBank];
if (gSprites[spriteId].data[1] == 32)
{
@@ -489,7 +490,7 @@ void sub_8033308(void)
ewram17810[gActiveBank].unk1_0 = 0;
FreeSpriteTilesByTag(0x27F9);
FreeSpritePaletteByTag(0x27F9);
- StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 0);
+ StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 0);
sub_8045A5C(
gHealthboxIDs[gActiveBank],
&gEnemyParty[gBattlePartyID[gActiveBank]],
@@ -1125,16 +1126,16 @@ void OpponentHandleLoadPokeSprite(void)
BattleLoadOpponentMonSprite(&gEnemyParty[gBattlePartyID[gActiveBank]], gActiveBank);
GetMonSpriteTemplate_803C56C(species, GetBankIdentity(gActiveBank));
- gObjectBankIDs[gActiveBank] = CreateSprite(
+ gBankSpriteIds[gActiveBank] = CreateSprite(
&gUnknown_02024E8C,
GetBankPosition(gActiveBank, 2),
sub_8077F68(gActiveBank),
sub_8079E90(gActiveBank));
- gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -240;
- gSprites[gObjectBankIDs[gActiveBank]].data[0] = gActiveBank;
- gSprites[gObjectBankIDs[gActiveBank]].data[2] = species;
- gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank;
- StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], gBattleMonForms[gActiveBank]);
+ gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240;
+ gSprites[gBankSpriteIds[gActiveBank]].data[0] = gActiveBank;
+ gSprites[gBankSpriteIds[gActiveBank]].data[2] = species;
+ gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank;
+ StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], gBattleMonForms[gActiveBank]);
sub_8032984(gActiveBank, GetMonData(&gEnemyParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES));
gBattleBankFunc[gActiveBank] = sub_8033018;
}
@@ -1157,18 +1158,18 @@ void sub_803495C(u8 a, u8 b)
gUnknown_0300434C[a] = CreateInvisibleSpriteWithCallback(sub_80312F0);
BattleLoadOpponentMonSprite(&gEnemyParty[gBattlePartyID[a]], a);
GetMonSpriteTemplate_803C56C(species, GetBankIdentity(a));
- gObjectBankIDs[a] = CreateSprite(
+ gBankSpriteIds[a] = CreateSprite(
&gUnknown_02024E8C,
GetBankPosition(a, 2),
sub_8077F68(a),
sub_8079E90(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[gBankSpriteIds[a]].data[0] = a;
+ gSprites[gBankSpriteIds[a]].data[2] = species;
+ gSprites[gUnknown_0300434C[a]].data[1] = gBankSpriteIds[a];
+ gSprites[gBankSpriteIds[a]].oam.paletteNum = a;
+ StartSpriteAnim(&gSprites[gBankSpriteIds[a]], gBattleMonForms[a]);
+ gSprites[gBankSpriteIds[a]].invisible = TRUE;
+ gSprites[gBankSpriteIds[a]].callback = SpriteCallbackDummy;
gSprites[gUnknown_0300434C[a]].data[0] = sub_8046400(0, 0xFE);
}
@@ -1181,8 +1182,8 @@ void OpponentHandleReturnPokeToBall(void)
}
else
{
- FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]);
- DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]);
+ FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
+ DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
sub_8032A08(gActiveBank);
sub_8043DB0(gHealthboxIDs[gActiveBank]);
OpponentBufferExecCompleted();
@@ -1213,29 +1214,38 @@ void OpponentHandleTrainerThrow(void)
{
u32 trainerPicIndex;
- if (gTrainerBattleOpponent == 0x400)
- trainerPicIndex = GetSecretBaseTrainerPicIndex();
- else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER)
- trainerPicIndex = get_trainer_class_pic_index();
- else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER)
- trainerPicIndex = GetEReaderTrainerPicIndex();
+#if DEBUG
+ if (gUnknown_02023A14_50 & 0x10)
+ {
+ trainerPicIndex = gSharedMem[0x160A3];
+ }
else
- trainerPicIndex = gTrainers[gTrainerBattleOpponent].trainerPic;
+#endif
+ {
+ if (gTrainerBattleOpponent == 0x400)
+ trainerPicIndex = GetSecretBaseTrainerPicIndex();
+ else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER)
+ trainerPicIndex = get_trainer_class_pic_index();
+ else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER)
+ trainerPicIndex = GetEReaderTrainerPicIndex();
+ else
+ trainerPicIndex = gTrainers[gTrainerBattleOpponent].trainerPic;
+ }
sub_8031A6C(trainerPicIndex, gActiveBank);
GetMonSpriteTemplate_803C5A0(trainerPicIndex, GetBankIdentity(gActiveBank));
- gObjectBankIDs[gActiveBank] = CreateSprite(
+ gBankSpriteIds[gActiveBank] = CreateSprite(
&gUnknown_02024E8C,
0xB0,
40 + 4 * (8 - gTrainerFrontPicCoords[trainerPicIndex].coords),
sub_8079E90(gActiveBank));
- gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -240;
- gSprites[gObjectBankIDs[gActiveBank]].data[0] = 2;
- gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicIndex].tag);
- 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;
+ gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -240;
+ gSprites[gBankSpriteIds[gActiveBank]].data[0] = 2;
+ gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicIndex].tag);
+ gSprites[gBankSpriteIds[gActiveBank]].data[5] = gSprites[gBankSpriteIds[gActiveBank]].oam.tileNum;
+ gSprites[gBankSpriteIds[gActiveBank]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[trainerPicIndex].tag);
+ gSprites[gBankSpriteIds[gActiveBank]].oam.affineParam = trainerPicIndex;
+ gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80313A0;
gBattleBankFunc[gActiveBank] = sub_8032B4C;
}
@@ -1254,30 +1264,30 @@ void OpponentHandleTrainerSlide(void)
sub_8031A6C(trainerPicIndex, gActiveBank);
GetMonSpriteTemplate_803C5A0(trainerPicIndex, GetBankIdentity(gActiveBank));
- gObjectBankIDs[gActiveBank] = CreateSprite(
+ gBankSpriteIds[gActiveBank] = CreateSprite(
&gUnknown_02024E8C,
0xB0,
40 + 4 * (8 - gTrainerFrontPicCoords[trainerPicIndex].coords),
0x1E);
- gSprites[gObjectBankIDs[gActiveBank]].pos2.x = 96;
- gSprites[gObjectBankIDs[gActiveBank]].pos1.x += 32;
- gSprites[gObjectBankIDs[gActiveBank]].data[0] = -2;
- gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicIndex].tag);
- 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;
+ gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 96;
+ gSprites[gBankSpriteIds[gActiveBank]].pos1.x += 32;
+ gSprites[gBankSpriteIds[gActiveBank]].data[0] = -2;
+ gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicIndex].tag);
+ gSprites[gBankSpriteIds[gActiveBank]].data[5] = gSprites[gBankSpriteIds[gActiveBank]].oam.tileNum;
+ gSprites[gBankSpriteIds[gActiveBank]].oam.tileNum = GetSpriteTileStartByTag(gTrainerFrontPicTable[trainerPicIndex].tag);
+ gSprites[gBankSpriteIds[gActiveBank]].oam.affineParam = trainerPicIndex;
+ gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80313A0;
gBattleBankFunc[gActiveBank] = sub_8032B84;
}
void OpponentHandleTrainerSlideBack(void)
{
- oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]);
- 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;
- StoreSpriteCallbackInData(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy);
+ oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]);
+ gSprites[gBankSpriteIds[gActiveBank]].data[0] = 35;
+ gSprites[gBankSpriteIds[gActiveBank]].data[2] = 280;
+ gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y;
+ gSprites[gBankSpriteIds[gActiveBank]].callback = StartTranslateAnimSpriteByDeltas;
+ StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBank]], SpriteCallbackDummy);
gBattleBankFunc[gActiveBank] = sub_8032BBC;
}
@@ -1293,7 +1303,7 @@ void OpponentHandlecmd10(void)
{
ewram17810[gActiveBank].unk4 = 0;
PlaySE12WithPanning(SE_POKE_DEAD, 63);
- gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8010384;
+ gSprites[gBankSpriteIds[gActiveBank]].callback = sub_8010384;
gBattleBankFunc[gActiveBank] = sub_803311C;
}
}
@@ -1427,6 +1437,315 @@ void OpponentHandlecmd19(void)
OpponentBufferExecCompleted();
}
+#if DEBUG
+__attribute__((naked))
+void OpponentHandlecmd20(void)
+{
+ asm("\
+ push {r4, r5, r6, r7, lr}\n\
+ mov r7, sl\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5, r6, r7}\n\
+ ldr r6, ._549 @ gActiveBank\n\
+ ldrb r0, [r6]\n\
+ lsl r0, r0, #0x9\n\
+ ldr r1, ._549 + 4 @ gBattleBufferA\n\
+ add r5, r0, r1\n\
+ ldr r2, ._549 + 8 @ gUnknown_02023A14_50\n\
+ ldrb r1, [r2]\n\
+ mov r0, #0x4\n\
+ and r0, r0, r1\n\
+ mov sl, r6\n\
+ cmp r0, #0\n\
+ beq ._546 @cond_branch\n\
+ ldr r0, ._549 + 12 @ gBattleMoves\n\
+ mov r9, r0\n\
+ ldr r1, ._549 + 16 @ \n\
+ mov ip, r1\n\
+ add r7, r6, #0\n\
+ mov r0, #0x2\n\
+ mov r8, r0\n\
+ ldr r6, ._549 + 20 @ \n\
+._552:\n\
+ ldrb r1, [r7]\n\
+ mov r0, r8\n\
+ and r0, r0, r1\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x19\n\
+ add r0, r0, r6\n\
+ mov r1, ip\n\
+ add r3, r0, r1\n\
+ ldrb r1, [r3]\n\
+ lsl r0, r1, #0x1\n\
+ add r0, r5, r0\n\
+ ldrh r2, [r0]\n\
+ add r4, r1, #0\n\
+ cmp r2, #0\n\
+ beq ._547 @cond_branch\n\
+ add r0, r4, #1\n\
+ strb r0, [r3]\n\
+ b ._548\n\
+._550:\n\
+ .align 2, 0\n\
+._549:\n\
+ .word gActiveBank\n\
+ .word gBattleBufferA+4\n\
+ .word gUnknown_02023A14_50\n\
+ .word gBattleMoves\n\
+ .word +0x2000000\n\
+ .word 0x1609e\n\
+._547:\n\
+ strb r2, [r3]\n\
+._548:\n\
+ ldrb r0, [r7]\n\
+ mov r1, r8\n\
+ and r1, r1, r0\n\
+ lsl r1, r1, #0x18\n\
+ lsr r1, r1, #0x19\n\
+ add r1, r1, r6\n\
+ add r1, r1, ip\n\
+ ldrb r0, [r1]\n\
+ cmp r0, #0x3\n\
+ bls ._551 @cond_branch\n\
+ mov r0, #0x0\n\
+ strb r0, [r1]\n\
+._551:\n\
+ cmp r2, #0\n\
+ beq ._552 @cond_branch\n\
+ lsl r0, r2, #0x1\n\
+ add r0, r0, r2\n\
+ lsl r0, r0, #0x2\n\
+ add r0, r0, r9\n\
+ ldrb r3, [r0, #0x6]\n\
+ mov r0, #0x12\n\
+ and r0, r0, r3\n\
+ cmp r0, #0\n\
+ beq ._553 @cond_branch\n\
+ mov r1, sl\n\
+ ldrb r0, [r1]\n\
+ b ._561\n\
+._553:\n\
+ ldr r0, ._559 @ gBattleTypeFlags\n\
+ ldrh r1, [r0]\n\
+ mov r0, #0x1\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._557 @cond_branch\n\
+ ldr r0, ._559 + 4 @ gUnknown_02023A14_50\n\
+ ldrb r1, [r0]\n\
+ mov r5, #0x2\n\
+ add r0, r5, #0\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._556 @cond_branch\n\
+ cmp r3, #0\n\
+ bne ._557 @cond_branch\n\
+ mov r1, sl\n\
+ ldrb r0, [r1]\n\
+ bl GetBankIdentity\n\
+ mov r1, #0x2\n\
+ eor r0, r0, r1\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ b ._558\n\
+._560:\n\
+ .align 2, 0\n\
+._559:\n\
+ .word gBattleTypeFlags\n\
+ .word gUnknown_02023A14_50\n\
+._556:\n\
+ bl Random\n\
+ add r1, r5, #0\n\
+ and r1, r1, r0\n\
+ lsl r1, r1, #0x10\n\
+ lsr r0, r1, #0x10\n\
+ b ._561\n\
+._557:\n\
+ mov r0, #0x0\n\
+._558:\n\
+ bl GetBankByIdentity\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+._561:\n\
+ lsl r2, r0, #0x8\n\
+ orr r2, r2, r4\n\
+ mov r0, #0x1\n\
+ mov r1, #0xa\n\
+._569:\n\
+ bl Emitcmd33\n\
+._573:\n\
+ bl OpponentBufferExecCompleted\n\
+ b ._562\n\
+._546:\n\
+ ldr r0, ._567 @ gBattleTypeFlags\n\
+ ldrh r1, [r0]\n\
+ mov r0, #0x93\n\
+ lsl r0, r0, #0x3\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._563 @cond_branch\n\
+ bl BattleAI_SetupAIData\n\
+ bl BattleAI_GetAIActionToUse\n\
+ lsl r0, r0, #0x18\n\
+ lsr r4, r0, #0x18\n\
+ cmp r4, #0x4\n\
+ beq ._564 @cond_branch\n\
+ cmp r4, #0x5\n\
+ bne ._565 @cond_branch\n\
+ mov r0, #0x1\n\
+ mov r1, #0x4\n\
+ b ._566\n\
+._568:\n\
+ .align 2, 0\n\
+._567:\n\
+ .word gBattleTypeFlags\n\
+._564:\n\
+ mov r0, #0x1\n\
+ mov r1, #0x3\n\
+._566:\n\
+ mov r2, #0x0\n\
+ b ._569\n\
+._565:\n\
+ ldr r3, ._574 @ gBattleMoves\n\
+ lsl r0, r4, #0x1\n\
+ add r2, r5, r0\n\
+ ldrh r1, [r2]\n\
+ lsl r0, r1, #0x1\n\
+ add r0, r0, r1\n\
+ lsl r0, r0, #0x2\n\
+ add r0, r0, r3\n\
+ ldrb r1, [r0, #0x6]\n\
+ mov r0, #0x12\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._570 @cond_branch\n\
+ ldr r1, ._574 + 4 @ gBankTarget\n\
+ ldrb r0, [r6]\n\
+ strb r0, [r1]\n\
+._570:\n\
+ ldrh r1, [r2]\n\
+ lsl r0, r1, #0x1\n\
+ add r0, r0, r1\n\
+ lsl r0, r0, #0x2\n\
+ add r0, r0, r3\n\
+ ldrb r1, [r0, #0x6]\n\
+ mov r0, #0x8\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._572 @cond_branch\n\
+ mov r0, #0x0\n\
+ bl GetBankByIdentity\n\
+ ldr r5, ._574 + 4 @ gBankTarget\n\
+ strb r0, [r5]\n\
+ ldr r0, ._574 + 8 @ gAbsentBankFlags\n\
+ ldrb r1, [r0]\n\
+ ldr r2, ._574 + 12 @ gBitTable\n\
+ ldrb r0, [r5]\n\
+ lsl r0, r0, #0x2\n\
+ add r0, r0, r2\n\
+ ldr r0, [r0]\n\
+ and r1, r1, r0\n\
+ cmp r1, #0\n\
+ beq ._572 @cond_branch\n\
+ mov r0, #0x2\n\
+ bl GetBankByIdentity\n\
+ strb r0, [r5]\n\
+._572:\n\
+ ldr r0, ._574 + 4 @ gBankTarget\n\
+ ldrb r2, [r0]\n\
+ lsl r2, r2, #0x8\n\
+ orr r2, r2, r4\n\
+ mov r0, #0x1\n\
+ mov r1, #0xa\n\
+ bl Emitcmd33\n\
+ b ._573\n\
+._575:\n\
+ .align 2, 0\n\
+._574:\n\
+ .word gBattleMoves\n\
+ .word gBankTarget\n\
+ .word gAbsentBankFlags\n\
+ .word gBitTable\n\
+._563:\n\
+ mov r6, #0x3\n\
+._576:\n\
+ bl Random\n\
+ add r4, r0, #0\n\
+ and r4, r4, r6\n\
+ lsl r0, r4, #0x1\n\
+ add r0, r5, r0\n\
+ ldrh r2, [r0]\n\
+ cmp r2, #0\n\
+ beq ._576 @cond_branch\n\
+ ldr r1, ._579 @ gBattleMoves\n\
+ lsl r0, r2, #0x1\n\
+ add r0, r0, r2\n\
+ lsl r0, r0, #0x2\n\
+ add r0, r0, r1\n\
+ ldrb r1, [r0, #0x6]\n\
+ mov r0, #0x12\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._577 @cond_branch\n\
+ ldr r0, ._579 + 4 @ gActiveBank\n\
+ ldrb r2, [r0]\n\
+ lsl r2, r2, #0x8\n\
+ b ._578\n\
+._580:\n\
+ .align 2, 0\n\
+._579:\n\
+ .word gBattleMoves\n\
+ .word gActiveBank\n\
+._577:\n\
+ ldr r0, ._583 @ gBattleTypeFlags\n\
+ ldrh r1, [r0]\n\
+ mov r0, #0x1\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._581 @cond_branch\n\
+ bl Random\n\
+ mov r1, #0x2\n\
+ and r1, r1, r0\n\
+ lsl r1, r1, #0x18\n\
+ lsr r1, r1, #0x18\n\
+ add r0, r1, #0\n\
+ bl GetBankByIdentity\n\
+ add r2, r0, #0\n\
+ lsl r2, r2, #0x18\n\
+ lsr r2, r2, #0x10\n\
+._578:\n\
+ orr r2, r2, r4\n\
+ mov r0, #0x1\n\
+ mov r1, #0xa\n\
+ bl Emitcmd33\n\
+ b ._582\n\
+._584:\n\
+ .align 2, 0\n\
+._583:\n\
+ .word gBattleTypeFlags\n\
+._581:\n\
+ mov r0, #0x0\n\
+ bl GetBankByIdentity\n\
+ add r2, r0, #0\n\
+ lsl r2, r2, #0x18\n\
+ lsr r2, r2, #0x10\n\
+ orr r2, r2, r4\n\
+ mov r0, #0x1\n\
+ mov r1, #0xa\n\
+ bl Emitcmd33\n\
+._582:\n\
+ bl OpponentBufferExecCompleted\n\
+._562:\n\
+ pop {r3, r4, r5}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ mov sl, r5\n\
+ pop {r4, r5, r6, r7}\n\
+ pop {r0}\n\
+ bx r0");
+}
+#else
#ifdef NONMATCHING
void OpponentHandlecmd20(void)
{
@@ -1501,7 +1820,7 @@ void OpponentHandlecmd20(void)
ldr r6, _0803545C @ =gActiveBank\n\
ldrb r0, [r6]\n\
lsls r0, 9\n\
- ldr r1, _08035460 @ =gUnknown_02023A64\n\
+ ldr r1, _08035460 @ =gBattleBufferA+4\n\
adds r5, r0, r1\n\
ldr r0, _08035464 @ =gBattleTypeFlags\n\
ldrh r1, [r0]\n\
@@ -1523,7 +1842,7 @@ void OpponentHandlecmd20(void)
b _0803546C\n\
.align 2, 0\n\
_0803545C: .4byte gActiveBank\n\
-_08035460: .4byte gUnknown_02023A64\n\
+_08035460: .4byte gBattleBufferA+4\n\
_08035464: .4byte gBattleTypeFlags\n\
_08035468:\n\
movs r0, 0x1\n\
@@ -1670,6 +1989,7 @@ _0803558A:\n\
.syntax divided\n");
}
#endif
+#endif
void OpponentHandleOpenBag(void)
{
@@ -1846,14 +2166,14 @@ void OpponentHandlecmd40(void)
void OpponentHandleHitAnimation(void)
{
- if (gSprites[gObjectBankIDs[gActiveBank]].invisible == TRUE)
+ if (gSprites[gBankSpriteIds[gActiveBank]].invisible == TRUE)
{
OpponentBufferExecCompleted();
}
else
{
gDoingBattleAnim = TRUE;
- gSprites[gObjectBankIDs[gActiveBank]].data[1] = 0;
+ gSprites[gBankSpriteIds[gActiveBank]].data[1] = 0;
sub_8047858(gActiveBank);
gBattleBankFunc[gActiveBank] = bx_blink_t7;
}
@@ -1901,12 +2221,12 @@ void OpponentHandleTrainerBallThrow(void)
{
u8 taskId;
- oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]);
- 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;
- StoreSpriteCallbackInData(&gSprites[gObjectBankIDs[gActiveBank]], sub_8035C10);
+ oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]);
+ gSprites[gBankSpriteIds[gActiveBank]].data[0] = 35;
+ gSprites[gBankSpriteIds[gActiveBank]].data[2] = 280;
+ gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y;
+ gSprites[gBankSpriteIds[gActiveBank]].callback = StartTranslateAnimSpriteByDeltas;
+ StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBank]], sub_8035C10);
taskId = CreateTask(sub_8035C44, 5);
gTasks[taskId].data[0] = gActiveBank;
if (ewram17810[gActiveBank].unk0_0)
@@ -2005,7 +2325,7 @@ void OpponentHandleSpriteInvisibility(void)
{
if (IsBankSpritePresent(gActiveBank) != 0)
{
- gSprites[gObjectBankIDs[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1];
+ gSprites[gBankSpriteIds[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1];
sub_8031F88(gActiveBank);
}
OpponentBufferExecCompleted();
diff --git a/src/battle/battle_controller_player.c b/src/battle/battle_controller_player.c
index f036e841f..3e259a21b 100644
--- a/src/battle/battle_controller_player.c
+++ b/src/battle/battle_controller_player.c
@@ -42,6 +42,10 @@ extern struct Window gUnknown_03004210;
extern void (*gBattleBankFunc[])(void);
+extern u8 gBankAttacker;
+extern u8 gBankTarget;
+extern u32 gOamMatrixAllocBitmap;
+extern u8 gUnknown_020297ED;
extern u8 gActiveBank;
extern u8 gActionSelectionCursor[];
extern u8 gDisplayedStringBattle[];
@@ -51,7 +55,7 @@ extern u8 gBankInMenu;
extern u16 gBattlePartyID[];
extern u8 gHealthboxIDs[];
extern u8 gDoingBattleAnim;
-extern u8 gObjectBankIDs[];
+extern u8 gBankSpriteIds[];
extern u16 gBattleTypeFlags;
extern u8 gBattleOutcome;
extern void (*gAnimScriptCallback)(void);
@@ -100,7 +104,7 @@ extern void sub_8047858();
extern u8 GetBankSide(u8);
extern void StartBattleIntroAnim();
extern void oamt_add_pos2_onto_pos1();
-extern void sub_8078B34(struct Sprite *);
+extern void StartTranslateAnimSpriteByDeltas(struct Sprite *);
extern void StoreSpriteCallbackInData();
extern void BattleLoadPlayerMonSprite();
extern bool8 IsDoubleBattle(void);
@@ -113,7 +117,6 @@ extern void sub_802D18C(void);
extern void sub_802DF18(void);
extern void BufferStringBattle();
extern void sub_80326EC();
-extern void DoMoveAnim();
extern void sub_8031F24(void);
extern void sub_80324BC();
extern u8 sub_8031720();
@@ -141,7 +144,7 @@ extern bool8 gDoingBattleAnim;
extern u16 gBattleTypeFlags;
extern u32 gBattleExecBuffer;
extern u8 gBattleBufferA[][0x200];
-extern u8 gObjectBankIDs[];
+extern u8 gBankSpriteIds[];
extern u8 gActionSelectionCursor[];
extern u8 gMoveSelectionCursor[];
extern u8 gAbsentBankFlags;
@@ -368,7 +371,7 @@ void PlayerBufferRunCommand(void)
void bx_0802E404(void)
{
- if (gSprites[gObjectBankIDs[gActiveBank]].pos2.x == 0)
+ if (gSprites[gBankSpriteIds[gActiveBank]].pos2.x == 0)
PlayerBufferExecCompleted();
}
@@ -496,7 +499,7 @@ void sub_802C2EC(void)
{
DestroyMenuCursor();
PlaySE(SE_SELECT);
- gSprites[gObjectBankIDs[gUnknown_03004344]].callback = sub_8010574;
+ gSprites[gBankSpriteIds[gUnknown_03004344]].callback = sub_8010574;
Emitcmd33(1, 10, gMoveSelectionCursor[gActiveBank] | (gUnknown_03004344 << 8));
dp11b_obj_free(gUnknown_03004344, 1);
PlayerBufferExecCompleted();
@@ -505,7 +508,7 @@ void sub_802C2EC(void)
else if (gMain.newKeys & B_BUTTON)
{
PlaySE(SE_SELECT);
- gSprites[gObjectBankIDs[gUnknown_03004344]].callback = sub_8010574;
+ gSprites[gBankSpriteIds[gUnknown_03004344]].callback = sub_8010574;
gBattleBankFunc[gActiveBank] = sub_802C68C;
dp11b_obj_instanciate(gActiveBank, 1, 7, 1);
dp11b_obj_instanciate(gActiveBank, 0, 7, 1);
@@ -514,7 +517,7 @@ void sub_802C2EC(void)
else if (gMain.newKeys & 0x60)
{
PlaySE(SE_SELECT);
- gSprites[gObjectBankIDs[gUnknown_03004344]].callback = sub_8010574;
+ gSprites[gBankSpriteIds[gUnknown_03004344]].callback = sub_8010574;
do
{
u8 var = GetBankIdentity(gUnknown_03004344);
@@ -555,13 +558,13 @@ void sub_802C2EC(void)
if (gAbsentBankFlags & gBitTable[gUnknown_03004344])
i = 0;
} while (i == 0);
- gSprites[gObjectBankIDs[gUnknown_03004344]].callback = sub_8010520;
+ gSprites[gBankSpriteIds[gUnknown_03004344]].callback = sub_8010520;
}
//_0802C540
else if (gMain.newKeys & 0x90)
{
PlaySE(SE_SELECT);
- gSprites[gObjectBankIDs[gUnknown_03004344]].callback = sub_8010574;
+ gSprites[gBankSpriteIds[gUnknown_03004344]].callback = sub_8010574;
do
{
u8 var = GetBankIdentity(gUnknown_03004344);
@@ -601,7 +604,7 @@ void sub_802C2EC(void)
if (gAbsentBankFlags & gBitTable[gUnknown_03004344])
i = 0;
} while (i == 0);
- gSprites[gObjectBankIDs[gUnknown_03004344]].callback = sub_8010520;
+ gSprites[gBankSpriteIds[gUnknown_03004344]].callback = sub_8010520;
}
}
@@ -617,9 +620,14 @@ struct ChooseMoveStruct
const u8 gUnknown_081FAE80[] = _("{PALETTE 5}{COLOR_HIGHLIGHT_SHADOW WHITE LIGHT_BLUE WHITE2}");
+void debug_sub_8030C24(void);
+
void sub_802C68C(void)
{
u32 r8 = 0;
+#if DEBUG
+ u8 count = 0;
+#endif
struct ChooseMoveStruct *r6 = (struct ChooseMoveStruct *)(gBattleBufferA[gActiveBank] + 4);
if (gMain.newKeys & A_BUTTON)
@@ -672,7 +680,7 @@ void sub_802C68C(void)
gUnknown_03004344 = GetBankByIdentity(3);
else
gUnknown_03004344 = GetBankByIdentity(1);
- gSprites[gObjectBankIDs[gUnknown_03004344]].callback = sub_8010520;
+ gSprites[gBankSpriteIds[gUnknown_03004344]].callback = sub_8010520;
}
}
else if (gMain.newKeys & B_BUTTON)
@@ -750,6 +758,43 @@ void sub_802C68C(void)
gBattleBankFunc[gActiveBank] = sub_802CA60;
}
}
+#if DEBUG
+ else if (gUnknown_020297ED == 1 && (gMain.newKeys & START_BUTTON))
+ {
+ const u8 *moveName;
+ s32 i;
+
+ Text_FillWindowRect(&gUnknown_03004210, 0x1016, 1, 0x37, 16, 0x3A);
+ moveName = gMoveNames[GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1)];
+ Text_InitWindowAndPrintText(&gUnknown_03004210, moveName, 0x100, 2, 0x37);
+ ConvertIntToDecimalStringN(
+ gDisplayedStringBattle,
+ GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1),
+ 2, 3);
+ Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x110, 10, 0x37);
+ Text_InitWindowAndPrintText(&gUnknown_03004210, gString_TurnJP, 0x116, 1, 0x39);
+ ConvertIntToDecimalStringN(gDisplayedStringBattle, gAnimMoveTurn, 2, 3);
+ Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x11C, 4, 0x39);
+ for (i = 0; i < 64; i++)
+ {
+ if (gSprites[i].inUse)
+ count++;
+ }
+ ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2);
+ Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x122, 8, 0x39);
+ count = GetTaskCount();
+ ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2);
+ Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x126, 11, 0x39);
+ for (i = 0, count = 0; i < 32; i++)
+ {
+ if (gOamMatrixAllocBitmap & (1 << i))
+ count++;
+ }
+ ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2);
+ Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 0x12A, 14, 0x39);
+ gBattleBankFunc[gActiveBank] = debug_sub_8030C24;
+ }
+#endif
}
extern const u8 BattleText_Format[];
@@ -956,26 +1001,186 @@ void sub_802D18C(void)
}
}
+#if DEBUG
+
+void debug_sub_803107C(void);
+
+void debug_sub_8030C24(void)
+{
+ s16 move = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1);
+
+ switch (gMain.newAndRepeatedKeys)
+ {
+ case START_BUTTON:
+ dp11b_obj_free(gActiveBank, 1);
+ dp11b_obj_free(gActiveBank, 0);
+ gBankAttacker = gActiveBank;
+ if ((gMain.heldKeysRaw & B_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
+ gBankTarget = gBankAttacker ^ 2;
+ else if ((gMain.heldKeysRaw & A_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
+ gBankTarget = GetBankByIdentity(3);
+ else
+ gBankTarget = GetBankByIdentity(1);
+ sub_80326EC(0);
+ DoMoveAnim(move);
+ gBattleBankFunc[gActiveBank] = debug_sub_803107C;
+ break;
+ case SELECT_BUTTON:
+ dp11b_obj_free(gActiveBank, 1);
+ dp11b_obj_free(gActiveBank, 0);
+ gBankTarget = gActiveBank;
+ if ((gMain.heldKeysRaw & B_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
+ gBankAttacker = gBankTarget ^ 2;
+ else if ((gMain.heldKeysRaw & A_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
+ gBankAttacker = GetBankByIdentity(3);
+ else
+ gBankAttacker = GetBankByIdentity(1);
+ sub_80326EC(0);
+ DoMoveAnim(move);
+ gBattleBankFunc[gActiveBank] = debug_sub_803107C;
+ break;
+ case R_BUTTON:
+ if ((gMain.heldKeysRaw & B_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
+ {
+ dp11b_obj_free(gActiveBank, 1);
+ dp11b_obj_free(gActiveBank, 0);
+ gBankAttacker = GetBankByIdentity(3);
+ gBankTarget = GetBankByIdentity(1);
+ sub_80326EC(0);
+ DoMoveAnim(move);
+ gBattleBankFunc[gActiveBank] = debug_sub_803107C;
+ }
+ else
+ {
+ move += 9;
+ case DPAD_RIGHT:
+ if (++move > 354)
+ move = 1;
+ SetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1, &move);
+ gBattleMons[gActiveBank].moves[0] = move;
+ Text_FillWindowRect(&gUnknown_03004210, 0x1016, 1, 0x37, 16, 0x38);
+ Text_InitWindowAndPrintText(&gUnknown_03004210, gMoveNames[move], 0x100, 2, 0x37);
+ ConvertIntToDecimalStringN(gDisplayedStringBattle, move, 2, 3);
+ Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 272, 10, 0x37);
+ }
+ break;
+ case L_BUTTON:
+ if ((gMain.heldKeysRaw & B_BUTTON) && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
+ {
+ dp11b_obj_free(gActiveBank, 1);
+ dp11b_obj_free(gActiveBank, 0);
+ gBankAttacker = GetBankByIdentity(1);
+ gBankTarget = GetBankByIdentity(3);
+ sub_80326EC(0);
+ DoMoveAnim(move);
+ gBattleBankFunc[gActiveBank] = debug_sub_803107C;
+ }
+ else
+ {
+ move -= 9;
+ case DPAD_LEFT:
+ if (--move <= 0)
+ move = 354;
+ SetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1, &move);
+ gBattleMons[gActiveBank].moves[0] = move;
+ Text_FillWindowRect(&gUnknown_03004210, 0x1016, 1, 0x37, 16, 0x38);
+ Text_InitWindowAndPrintText(&gUnknown_03004210, gMoveNames[move], 0x100, 2, 0x37);
+ ConvertIntToDecimalStringN(gDisplayedStringBattle, move, 2, 3);
+ Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 272, 10, 0x37);
+ }
+ break;
+ case DPAD_UP:
+ case DPAD_DOWN:
+ if (gMain.newAndRepeatedKeys == DPAD_UP)
+ gAnimMoveTurn--;
+ else
+ gAnimMoveTurn++;
+ ConvertIntToDecimalStringN(gDisplayedStringBattle, gAnimMoveTurn, 2, 3);
+ Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 284, 4, 0x39);
+ break;
+ }
+
+ if ((gMain.heldKeysRaw & (L_BUTTON | R_BUTTON)) == (L_BUTTON | R_BUTTON))
+ {
+ u8 i;
+ u32 move;
+
+ for (i = 0; i < 4; i++)
+ {
+ StringCopy(gDisplayedStringBattle, BattleText_Format);
+ move = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MOVE1 + i);
+ StringAppend(gDisplayedStringBattle, gMoveNames[move]);
+ Text_InitWindow(
+ &gUnknown_03004210,
+ gDisplayedStringBattle,
+ 0x100 + i * 16,
+ (i & 1) ? 10 : 2,
+ (i < 2) ? 0x37 : 0x39);
+ Text_PrintWindow8002F44(&gUnknown_03004210);
+ }
+ gBattleBankFunc[gActiveBank] = sub_802C68C;
+ }
+}
+
+void debug_sub_803107C(void)
+{
+ u8 count = 0;
+
+ gAnimScriptCallback();
+ if (!gAnimScriptActive)
+ {
+ s32 i;
+
+ sub_80326EC(1);
+ dp11b_obj_instanciate(gActiveBank, 1, 7, 1);
+ dp11b_obj_instanciate(gActiveBank, 0, 7, 1);
+
+ for (i = 0, count = 0; i < MAX_SPRITES; i++)
+ {
+ if (gSprites[i].inUse)
+ count++;
+ }
+ ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2);
+ Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 290, 8, 0x39);
+
+ count = GetTaskCount();
+ ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2);
+ Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 294, 11, 0x39);
+
+ for (i = 0, count = 0; i < 32; i++)
+ {
+ if (gOamMatrixAllocBitmap & (1 << i))
+ count++;
+ }
+ ConvertIntToDecimalStringN(gDisplayedStringBattle, count, 2, 2);
+ Text_InitWindowAndPrintText(&gUnknown_03004210, gDisplayedStringBattle, 298, 14, 0x39);
+
+ gBattleBankFunc[gActiveBank] = debug_sub_8030C24;
+ }
+}
+
+#endif
+
void sub_802D204(void)
{
- if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
PlayerBufferExecCompleted();
}
// duplicate of sub_802D204
void sub_802D23C(void)
{
- if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
PlayerBufferExecCompleted();
}
void sub_802D274(void)
{
- if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
{
nullsub_10(gSaveBlock2.playerGender);
- FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]);
- DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]);
+ FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
+ DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
PlayerBufferExecCompleted();
}
}
@@ -1450,13 +1655,13 @@ void sub_802DDC4(u8 taskId)
void sub_802DE10(void)
{
- if (gSprites[gObjectBankIDs[gActiveBank]].pos1.y + gSprites[gObjectBankIDs[gActiveBank]].pos2.y > DISPLAY_HEIGHT)
+ if (gSprites[gBankSpriteIds[gActiveBank]].pos1.y + gSprites[gBankSpriteIds[gActiveBank]].pos2.y > DISPLAY_HEIGHT)
{
u16 species = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES);
nullsub_9(species);
- FreeOamMatrix(gSprites[gObjectBankIDs[gActiveBank]].oam.matrixNum);
- DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]);
+ FreeOamMatrix(gSprites[gBankSpriteIds[gActiveBank]].oam.matrixNum);
+ DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
sub_8043DB0(gHealthboxIDs[gActiveBank]);
PlayerBufferExecCompleted();
}
@@ -1466,8 +1671,8 @@ void sub_802DEAC(void)
{
if (!ewram17810[gActiveBank].unk0_6)
{
- FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]);
- DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]);
+ FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
+ DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
sub_8043DB0(gHealthboxIDs[gActiveBank]);
PlayerBufferExecCompleted();
}
@@ -1534,7 +1739,7 @@ void bx_wait_t1(void)
void bx_blink_t1(void)
{
- u8 spriteId = gObjectBankIDs[gActiveBank];
+ u8 spriteId = gBankSpriteIds[gActiveBank];
if (gSprites[spriteId].data[1] == 32)
{
@@ -2286,7 +2491,7 @@ void PlayerHandlecmd3(void)
u8 i;
u8 *dst;
- MEMSET_ALT(&gPlayerParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1], gBattleBufferA[gActiveBank][3 + i],
+ MEMSET_ALT(&gPlayerParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1], gBattleBufferA[gActiveBank][3 + i],
gBattleBufferA[gActiveBank][2], i, dst);
PlayerBufferExecCompleted();
}
@@ -2294,7 +2499,7 @@ void PlayerHandlecmd3(void)
void PlayerHandleLoadPokeSprite(void)
{
BattleLoadPlayerMonSprite(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
- gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank;
+ gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank;
gBattleBankFunc[gActiveBank] = bx_0802E404;
}
@@ -2318,18 +2523,18 @@ void sub_802F934(u8 bank, u8 b)
species = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES);
gUnknown_0300434C[bank] = CreateInvisibleSpriteWithCallback(sub_80312F0);
GetMonSpriteTemplate_803C56C(species, GetBankIdentity(bank));
- gObjectBankIDs[bank] = CreateSprite(
+ gBankSpriteIds[bank] = CreateSprite(
&gUnknown_02024E8C,
GetBankPosition(bank, 2),
sub_8077F68(bank),
sub_8079E90(bank));
- 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]].data[1] = gBankSpriteIds[bank];
+ gSprites[gBankSpriteIds[bank]].data[0] = bank;
+ gSprites[gBankSpriteIds[bank]].data[2] = species;
+ gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank;
+ StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]);
+ gSprites[gBankSpriteIds[bank]].invisible = TRUE;
+ gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy;
gSprites[gUnknown_0300434C[bank]].data[0] = sub_8046400(0, 0xFF);
}
@@ -2342,8 +2547,8 @@ void PlayerHandleReturnPokeToBall(void)
}
else
{
- FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]);
- DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]);
+ FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
+ DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
sub_8043DB0(gHealthboxIDs[gActiveBank]);
PlayerBufferExecCompleted();
}
@@ -2385,15 +2590,15 @@ void PlayerHandleTrainerThrow(void)
}
LoadPlayerTrainerBankSprite(gSaveBlock2.playerGender, gActiveBank);
GetMonSpriteTemplate_803C5A0(gSaveBlock2.playerGender, GetBankIdentity(gActiveBank));
- gObjectBankIDs[gActiveBank] = CreateSprite(
+ gBankSpriteIds[gActiveBank] = CreateSprite(
&gUnknown_02024E8C,
r7 + 80,
(8 - gTrainerBackPicCoords[gSaveBlock2.playerGender].coords) * 4 + 80,
sub_8079E90(gActiveBank));
- gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank;
- gSprites[gObjectBankIDs[gActiveBank]].pos2.x = 240;
- gSprites[gObjectBankIDs[gActiveBank]].data[0] = -2;
- gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0;
+ gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank;
+ gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 240;
+ gSprites[gBankSpriteIds[gActiveBank]].data[0] = -2;
+ gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80313A0;
gBattleBankFunc[gActiveBank] = sub_802D204;
}
@@ -2401,27 +2606,27 @@ void PlayerHandleTrainerSlide(void)
{
LoadPlayerTrainerBankSprite(gSaveBlock2.playerGender, gActiveBank);
GetMonSpriteTemplate_803C5A0(gSaveBlock2.playerGender, GetBankIdentity(gActiveBank));
- gObjectBankIDs[gActiveBank] = CreateSprite(
+ gBankSpriteIds[gActiveBank] = CreateSprite(
&gUnknown_02024E8C,
80,
(8 - gTrainerBackPicCoords[gSaveBlock2.playerGender].coords) * 4 + 80,
30);
- gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank;
- gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -96;
- gSprites[gObjectBankIDs[gActiveBank]].data[0] = 2;
- gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0;
+ gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank;
+ gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -96;
+ gSprites[gBankSpriteIds[gActiveBank]].data[0] = 2;
+ gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80313A0;
gBattleBankFunc[gActiveBank] = sub_802D23C;
}
void PlayerHandleTrainerSlideBack(void)
{
- oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]);
- 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;
- StoreSpriteCallbackInData(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy);
- StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1);
+ oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]);
+ gSprites[gBankSpriteIds[gActiveBank]].data[0] = 50;
+ gSprites[gBankSpriteIds[gActiveBank]].data[2] = -40;
+ gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y;
+ gSprites[gBankSpriteIds[gActiveBank]].callback = StartTranslateAnimSpriteByDeltas;
+ StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBank]], SpriteCallbackDummy);
+ StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 1);
gBattleBankFunc[gActiveBank] = sub_802D274;
}
@@ -2440,9 +2645,9 @@ void PlayerHandlecmd10(void)
ewram17810[gActiveBank].unk4 = 0;
HandleLowHpMusicChange(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank);
PlaySE12WithPanning(SE_POKE_DEAD, -64);
- gSprites[gObjectBankIDs[gActiveBank]].data[1] = 0;
- gSprites[gObjectBankIDs[gActiveBank]].data[2] = 5;
- gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80105EC;
+ gSprites[gBankSpriteIds[gActiveBank]].data[1] = 0;
+ gSprites[gBankSpriteIds[gActiveBank]].data[2] = 5;
+ gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80105EC;
gBattleBankFunc[gActiveBank] = sub_802DE10;
}
}
@@ -2814,14 +3019,14 @@ void PlayerHandlecmd40(void)
void PlayerHandleHitAnimation(void)
{
- if (gSprites[gObjectBankIDs[gActiveBank]].invisible == TRUE)
+ if (gSprites[gBankSpriteIds[gActiveBank]].invisible == TRUE)
{
PlayerBufferExecCompleted();
}
else
{
gDoingBattleAnim = 1;
- gSprites[gObjectBankIDs[gActiveBank]].data[1] = 0;
+ gSprites[gBankSpriteIds[gActiveBank]].data[1] = 0;
sub_8047858(gActiveBank);
gBattleBankFunc[gActiveBank] = bx_blink_t1;
}
@@ -2870,17 +3075,17 @@ void PlayerHandleTrainerBallThrow(void)
u8 paletteNum;
u8 taskId;
- oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]);
- 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]].data[5] = gActiveBank;
- StoreSpriteCallbackInData(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38);
- StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1);
+ oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]);
+ gSprites[gBankSpriteIds[gActiveBank]].data[0] = 50;
+ gSprites[gBankSpriteIds[gActiveBank]].data[2] = -40;
+ gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y;
+ gSprites[gBankSpriteIds[gActiveBank]].callback = StartTranslateAnimSpriteByDeltas;
+ gSprites[gBankSpriteIds[gActiveBank]].data[5] = gActiveBank;
+ StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBank]], sub_8030E38);
+ StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 1);
paletteNum = AllocSpritePalette(0xD6F8);
LoadCompressedPalette(gTrainerBackPicPaletteTable[gSaveBlock2.playerGender].data, 0x100 + paletteNum * 16, 32);
- gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = paletteNum;
+ gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = paletteNum;
taskId = CreateTask(task05_08033660, 5);
gTasks[taskId].data[0] = gActiveBank;
if (ewram17810[gActiveBank].unk0_0)
@@ -2897,7 +3102,7 @@ void sub_8030E38(struct Sprite *sprite)
FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum));
DestroySprite(sprite);
BattleLoadPlayerMonSprite(&gPlayerParty[gBattlePartyID[r4]], r4);
- StartSpriteAnim(&gSprites[gObjectBankIDs[r4]], 0);
+ StartSpriteAnim(&gSprites[gBankSpriteIds[r4]], 0);
}
void task05_08033660(u8 taskId)
@@ -2976,7 +3181,7 @@ void PlayerHandleSpriteInvisibility(void)
{
if (IsBankSpritePresent(gActiveBank))
{
- gSprites[gObjectBankIDs[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1];
+ gSprites[gBankSpriteIds[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1];
sub_8031F88(gActiveBank);
}
PlayerBufferExecCompleted();
diff --git a/src/battle/battle_controller_safari.c b/src/battle/battle_controller_safari.c
index 0d193d68f..03cf8759d 100644
--- a/src/battle/battle_controller_safari.c
+++ b/src/battle/battle_controller_safari.c
@@ -1,6 +1,7 @@
#include "global.h"
#include "battle_anim_81258BC.h"
#include "battle.h"
+#include "battle_interface.h"
#include "battle_message.h"
#include "data2.h"
#include "link.h"
@@ -27,7 +28,7 @@ extern u16 gBattle_BG0_Y;
extern u16 gBattle_BG0_X;
extern u8 gBattleBufferA[][0x200];
extern bool8 gDoingBattleAnim;
-extern u8 gObjectBankIDs[];
+extern u8 gBankSpriteIds[];
extern struct SpriteTemplate gUnknown_02024E8C;
extern u16 gBattleTypeFlags;
extern u32 gBattleExecBuffer;
@@ -272,11 +273,22 @@ void bx_battle_menu_t6_2(void)
sub_802E3E4(gActionSelectionCursor[gActiveBank], 0);
}
}
+#if DEBUG
+ else if (gMain.newKeys & R_BUTTON)
+ {
+ if (!ewram17810[gActiveBank].unk0_5)
+ move_anim_start_t3(gActiveBank, gActiveBank, gActiveBank, 4, 0);
+ }
+ else if (gMain.newKeys & START_BUTTON)
+ {
+ sub_804454C();
+ }
+#endif
}
void sub_812B65C(void)
{
- if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
SafariBufferExecCompleted();
}
@@ -387,15 +399,15 @@ void SafariHandleTrainerThrow(void)
{
LoadPlayerTrainerBankSprite(gSaveBlock2.playerGender, gActiveBank);
GetMonSpriteTemplate_803C5A0(gSaveBlock2.playerGender, GetBankIdentity(gActiveBank));
- gObjectBankIDs[gActiveBank] = CreateSprite(
+ gBankSpriteIds[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;
+ gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank;
+ gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 240;
+ gSprites[gBankSpriteIds[gActiveBank]].data[0] = -2;
+ gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80313A0;
gBattleBankFunc[gActiveBank] = sub_812B65C;
}
diff --git a/src/battle/battle_controller_wally.c b/src/battle/battle_controller_wally.c
index 49f530129..c590b487c 100644
--- a/src/battle/battle_controller_wally.c
+++ b/src/battle/battle_controller_wally.c
@@ -31,7 +31,7 @@ extern u8 gActiveBank;
extern void (*gBattleBankFunc[])(void);
extern u32 gBattleExecBuffer;
extern u8 gBattleBufferA[][0x200];
-extern u8 gObjectBankIDs[];
+extern u8 gBankSpriteIds[];
extern MainCallback gPreBattleCallback1;
extern bool8 gDoingBattleAnim;
extern u16 gBattlePartyID[];
@@ -87,7 +87,7 @@ extern void sub_80304A8(void);
extern void sub_8047858();
extern void StartBattleIntroAnim();
extern void oamt_add_pos2_onto_pos1();
-extern void sub_8078B34(struct Sprite *);
+extern void StartTranslateAnimSpriteByDeltas(struct Sprite *);
extern void sub_8030E38(struct Sprite *);
extern void StoreSpriteCallbackInData();
extern u8 sub_8046400();
@@ -325,7 +325,7 @@ void sub_81372BC(void)
void sub_813741C(void)
{
- if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
WallyBufferExecCompleted();
}
@@ -436,7 +436,7 @@ void sub_81377B0(void)
void bx_blink_t5(void)
{
- u8 spriteId = gObjectBankIDs[gActiveBank];
+ u8 spriteId = gBankSpriteIds[gActiveBank];
if (gSprites[spriteId].data[1] == 32)
{
@@ -457,8 +457,8 @@ void sub_813789C(void)
{
if (!ewram17810[gActiveBank].unk0_6)
{
- FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]);
- DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]);
+ FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
+ DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
sub_8043DB0(gHealthboxIDs[gActiveBank]);
WallyBufferExecCompleted();
}
@@ -467,7 +467,7 @@ void sub_813789C(void)
// Duplicate of sub_813741C
void sub_8137908(void)
{
- if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy)
+ if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
WallyBufferExecCompleted();
}
@@ -1093,8 +1093,8 @@ void WallyHandleReturnPokeToBall(void)
}
else
{
- FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]);
- DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]);
+ FreeSpriteOamMatrix(&gSprites[gBankSpriteIds[gActiveBank]]);
+ DestroySprite(&gSprites[gBankSpriteIds[gActiveBank]]);
sub_8043DB0(gHealthboxIDs[gActiveBank]);
WallyBufferExecCompleted();
}
@@ -1104,14 +1104,14 @@ void WallyHandleTrainerThrow(void)
{
LoadPlayerTrainerBankSprite(2, gActiveBank);
GetMonSpriteTemplate_803C5A0(2, GetBankIdentity(gActiveBank));
- gObjectBankIDs[gActiveBank] = CreateSprite(
+ gBankSpriteIds[gActiveBank] = CreateSprite(
&gUnknown_02024E8C,
80, 80 + 4 * (8 - gTrainerBackPicCoords[2].coords),
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;
+ gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank;
+ gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 240;
+ gSprites[gBankSpriteIds[gActiveBank]].data[0] = -2;
+ gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80313A0;
gBattleBankFunc[gActiveBank] = sub_813741C;
}
@@ -1119,14 +1119,14 @@ void WallyHandleTrainerSlide(void)
{
LoadPlayerTrainerBankSprite(2, gActiveBank);
GetMonSpriteTemplate_803C5A0(2, GetBankIdentity(gActiveBank));
- gObjectBankIDs[gActiveBank] = CreateSprite(
+ gBankSpriteIds[gActiveBank] = CreateSprite(
&gUnknown_02024E8C,
80, 80 + 4 * (8 - gTrainerBackPicCoords[2].coords),
30);
- gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank;
- gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -96;
- gSprites[gObjectBankIDs[gActiveBank]].data[0] = 2;
- gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0;
+ gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank;
+ gSprites[gBankSpriteIds[gActiveBank]].pos2.x = -96;
+ gSprites[gBankSpriteIds[gActiveBank]].data[0] = 2;
+ gSprites[gBankSpriteIds[gActiveBank]].callback = sub_80313A0;
gBattleBankFunc[gActiveBank] = sub_8137908;
}
@@ -1432,14 +1432,14 @@ void WallyHandlecmd40(void)
void WallyHandleHitAnimation(void)
{
- if (gSprites[gObjectBankIDs[gActiveBank]].invisible == TRUE)
+ if (gSprites[gBankSpriteIds[gActiveBank]].invisible == TRUE)
{
WallyBufferExecCompleted();
}
else
{
gDoingBattleAnim = 1;
- gSprites[gObjectBankIDs[gActiveBank]].data[1] = 0;
+ gSprites[gBankSpriteIds[gActiveBank]].data[1] = 0;
sub_8047858(gActiveBank);
gBattleBankFunc[gActiveBank] = bx_blink_t5;
}
@@ -1480,17 +1480,17 @@ void WallyHandleTrainerBallThrow(void)
u8 paletteNum;
u8 taskId;
- oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]);
- 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]].data[5] = gActiveBank;
- StoreSpriteCallbackInData(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38);
- StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1);
+ oamt_add_pos2_onto_pos1(&gSprites[gBankSpriteIds[gActiveBank]]);
+ gSprites[gBankSpriteIds[gActiveBank]].data[0] = 50;
+ gSprites[gBankSpriteIds[gActiveBank]].data[2] = -40;
+ gSprites[gBankSpriteIds[gActiveBank]].data[4] = gSprites[gBankSpriteIds[gActiveBank]].pos1.y;
+ gSprites[gBankSpriteIds[gActiveBank]].callback = StartTranslateAnimSpriteByDeltas;
+ gSprites[gBankSpriteIds[gActiveBank]].data[5] = gActiveBank;
+ StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBank]], sub_8030E38);
+ StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBank]], 1);
paletteNum = AllocSpritePalette(0xD6F8);
LoadCompressedPalette(gTrainerBackPicPaletteTable[2].data, 0x100 + paletteNum * 16, 32);
- gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = paletteNum;
+ gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = paletteNum;
taskId = CreateTask(sub_8139A2C, 5);
gTasks[taskId].data[0] = gActiveBank;
if (ewram17810[gActiveBank].unk0_0)
@@ -1508,18 +1508,18 @@ void sub_81398BC(u8 bank)
species = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES);
gUnknown_0300434C[bank] = CreateInvisibleSpriteWithCallback(sub_80312F0);
GetMonSpriteTemplate_803C56C(species, GetBankIdentity(bank));
- gObjectBankIDs[bank] = CreateSprite(
+ gBankSpriteIds[bank] = CreateSprite(
&gUnknown_02024E8C,
GetBankPosition(bank, 2),
sub_8077F68(bank),
sub_8079E90(bank));
- 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]].data[1] = gBankSpriteIds[bank];
+ gSprites[gBankSpriteIds[bank]].data[0] = bank;
+ gSprites[gBankSpriteIds[bank]].data[2] = species;
+ gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank;
+ StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]);
+ gSprites[gBankSpriteIds[bank]].invisible = TRUE;
+ gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy;
gSprites[gUnknown_0300434C[bank]].data[0] = sub_8046400(0, 0xFF);
}
diff --git a/src/battle/battle_interface.c b/src/battle/battle_interface.c
index 14e161c75..4022f07ce 100644
--- a/src/battle/battle_interface.c
+++ b/src/battle/battle_interface.c
@@ -443,8 +443,8 @@ extern const u16 gBattleInterfaceStatusIcons_DynPal[];
static void sub_8043D5C(struct Sprite *);
static const void *sub_8043CDC(u8);
-static void sub_8044210(u8, s16, u8);
-static void draw_status_ailment_maybe(u8);
+/*static*/ void sub_8044210(u8, s16, u8);
+/*static*/ void draw_status_ailment_maybe(u8);
extern void sub_8045180(struct Sprite *);
static void sub_8045110(struct Sprite *);
static void sub_8045048(struct Sprite *);
@@ -1015,7 +1015,7 @@ void sub_8043F44(u8 a)
#define CHAR_LV_SEPARATOR CHAR_PERIOD
#endif
-static void sub_8043FC0(u8 a, u8 b)
+/*static*/ void sub_8043FC0(u8 a, u8 b)
{
u8 str[30];
u8 *const *r7;
@@ -1269,7 +1269,7 @@ _0804420C: .4byte 0x04000008\n\
}
#endif
-static void sub_8044210(u8 a, s16 b, u8 c)
+/*static*/ void sub_8044210(u8 a, s16 b, u8 c)
{
u8 str[0x14];
u8 *ptr;
@@ -1641,6 +1641,8 @@ _08044548: .4byte 0x04000008\n\
}
#endif
+extern u8 gUnknown_020297ED;
+
void sub_804454C(void)
{
s32 i;
@@ -1649,7 +1651,11 @@ void sub_804454C(void)
for (i = 0; i < gNoOfAllBanks; i++)
{
if (gSprites[gHealthboxIDs[i]].callback == SpriteCallbackDummy
+#if DEBUG
+ && (gUnknown_020297ED != 0 || GetBankSide(i) != 1)
+#else
&& GetBankSide(i) != 1
+#endif
&& (IsDoubleBattle() || GetBankSide(i) != 0))
{
u8 r6;
@@ -2723,7 +2729,7 @@ void sub_8045180(struct Sprite *sprite)
sprite->pos2.y = gSprites[spriteId].pos2.y;
}
-static void sub_80451A0(u8 a, struct Pokemon *pkmn)
+/*static*/ void sub_80451A0(u8 a, struct Pokemon *pkmn)
{
u8 nickname[POKEMON_NAME_LENGTH];
u8 gender;
@@ -2871,7 +2877,7 @@ static void sub_8045458(u8 a, u8 b)
}
}
-static void draw_status_ailment_maybe(u8 a)
+/*static*/ void draw_status_ailment_maybe(u8 a)
{
s32 r4;
s32 r4_2;
@@ -3013,7 +3019,7 @@ static u8 sub_80457E8(u8 a, u8 b)
return ret;
}
-static void sub_80458B0(u8 a)
+/*static*/ void sub_80458B0(u8 a)
{
u8 *r6;
u8 r8;
@@ -3039,7 +3045,7 @@ static void sub_80458B0(u8 a)
}
-static void sub_8045998(u8 a)
+/*static*/ void sub_8045998(u8 a)
{
u8 *r7;
u8 status;
@@ -3116,6 +3122,15 @@ void sub_8045A5C(u8 a, struct Pokemon *pkmn, u8 c)
{
if (c == 3 || c == 0)
sub_8043FC0(a, GetMonData(pkmn, MON_DATA_LEVEL));
+#if DEBUG
+ if (gUnknown_020297ED == 1)
+ {
+ if (c == 1 || c == 0)
+ sub_80440EC(a, GetMonData(pkmn, MON_DATA_HP), 0);
+ if (c == 2 || c == 0)
+ sub_80440EC(a, GetMonData(pkmn, MON_DATA_MAX_HP), 1);
+ }
+#endif
if (c == 5 || c == 0)
{
load_gfxc_health_bar(0);
diff --git a/src/battle/battle_records.c b/src/battle/battle_records.c
index 4979760d7..8b9cf9ea0 100644
--- a/src/battle/battle_records.c
+++ b/src/battle/battle_records.c
@@ -8,9 +8,35 @@
#include "strings2.h"
#include "trainer_card.h"
+struct DebugStruct1
+{
+ u16 var0;
+ u8 var1[10];
+};
+
extern struct LinkPlayerMapObject gLinkPlayerMapObjects[4];
extern u8 gBattleOutcome;
+#if DEBUG
+const struct DebugStruct1 gUnknown_Debug_4245CC[] =
+{
+ { 1, _("NUMBER1") },
+ { 2, _("ナンバー2") },
+ { 3, _("ナンバー3") },
+ { 4, _("ナンバー4") },
+ { 5, _("ナンバー5") },
+ { 6, _("ナンバー6") },
+ { 7, _("ナンバー7") },
+};
+
+const struct {u8 unk0; u8 unk1;} gUnknown_Debug_8424620[] =
+{
+ { 1, 1 },
+ { 2, 1 },
+ { 3, 1 },
+};
+#endif
+
static void InitLinkBattleRecord(struct LinkBattleRecord *record)
{
CpuFill16(0, record, sizeof(struct LinkBattleRecord));
@@ -38,7 +64,7 @@ static int GetLinkBattleRecordTotalBattles(struct LinkBattleRecord *record)
return record->wins + record->losses + record->draws;
}
-static int FindLinkBattleRecord(struct LinkBattleRecord *records, u8 *name, u16 trainerId)
+static int FindLinkBattleRecord(struct LinkBattleRecord *records, const u8 *name, u16 trainerId)
{
int i;
@@ -119,7 +145,7 @@ static void UpdateLinkBattleGameStats(int battleOutcome)
IncrementGameStat(stat);
}
-static void UpdateLinkBattleRecords_(struct LinkBattleRecord *records, u8 *name, u16 trainerId, int battleOutcome, u8 language)
+static void UpdateLinkBattleRecords_(struct LinkBattleRecord *records, const u8 *name, u16 trainerId, int battleOutcome, u8 language)
{
int index;
UpdateLinkBattleGameStats(battleOutcome);
@@ -197,6 +223,26 @@ void UpdateLinkBattleRecords(int id)
gLinkPlayers[gLinkPlayerMapObjects[id].linkPlayerId].language);
}
+#if DEBUG
+void debug_sub_81257E0(void)
+{
+ u32 i;
+
+ InitLinkBattleRecords();
+ for (i = 0; i < 3; i++)
+ {
+ u32 id = gUnknown_Debug_8424620[i].unk0 - 1;
+
+ UpdateLinkBattleRecords_(
+ gSaveBlock1.linkBattleRecords,
+ gUnknown_Debug_4245CC[id].var1,
+ gUnknown_Debug_4245CC[id].var0,
+ gUnknown_Debug_8424620[i].unk1,
+ gLinkPlayers[gLinkPlayerMapObjects[id].linkPlayerId].language);
+ }
+}
+#endif
+
static void PrintLinkBattleWinsLossesDraws(struct LinkBattleRecord *records)
{
ConvertIntToDecimalStringN_DigitWidth6(gStringVar1, GetGameStat(GAME_STAT_LINK_BATTLE_WINS), STR_CONV_MODE_RIGHT_ALIGN, 4);
@@ -240,7 +286,8 @@ static void PrintLinkBattleRecord(struct LinkBattleRecord *record, u8 y)
}
}
-void ShowLinkBattleRecords(void) {
+void ShowLinkBattleRecords(void)
+{
s32 i;
Menu_DrawStdWindowFrame(1, 0, 28, 18);
sub_8072BD8(gOtherText_BattleResults, 0, 1, 240);
diff --git a/src/battle/battle_setup.c b/src/battle/battle_setup.c
index 892be1029..86b272bcb 100644
--- a/src/battle/battle_setup.c
+++ b/src/battle/battle_setup.c
@@ -6,7 +6,6 @@
#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"
@@ -475,7 +474,7 @@ static void Task_BattleStart(u8 taskId)
switch (tState)
{
case 0:
- if (!FieldPoisonEffectIsRunning()) // is poison not active?
+ if (!FldeffPoison_IsActive()) // is poison not active?
{
BattleTransition_StartOnField(tTransition);
tState++; // go to case 1.
@@ -802,25 +801,25 @@ static u8 GetTrainerBattleTransition(void)
u8 enemyLevel;
u8 playerLevel;
- if (gTrainerBattleOpponent == SECRET_BASE_OPPONENT) // link battle?
+ if (gTrainerBattleOpponent == SECRET_BASE_OPPONENT)
return B_TRANSITION_STEVEN;
trainer = gTrainers;
- if (trainer[gTrainerBattleOpponent].trainerClass == 24) // league?
+ if (trainer[gTrainerBattleOpponent].trainerClass == TRAINER_CLASS_ELITE_FOUR)
{
- if (gTrainerBattleOpponent == 261)
+ if (gTrainerBattleOpponent == OPPONENT_SIDNEY)
return B_TRANSITION_SYDNEY;
- if (gTrainerBattleOpponent == 262)
+ if (gTrainerBattleOpponent == OPPONENT_PHOEBE)
return B_TRANSITION_PHOEBE;
- if (gTrainerBattleOpponent == 263)
+ if (gTrainerBattleOpponent == OPPONENT_GLACIA)
return B_TRANSITION_GLACIA;
- if (gTrainerBattleOpponent == 264)
+ if (gTrainerBattleOpponent == OPPONENT_DRAKE)
return B_TRANSITION_DRAKE;
return B_TRANSITION_STEVEN;
}
- if (trainer[gTrainerBattleOpponent].trainerClass == 32) // team leader?
+ if (trainer[gTrainerBattleOpponent].trainerClass == TRAINER_CLASS_CHAMPION)
return B_TRANSITION_STEVEN;
if (trainer[gTrainerBattleOpponent].doubleBattle == TRUE)
@@ -1096,7 +1095,7 @@ void CB2_EndTrainerBattle(void)
{
if (gTrainerBattleOpponent == SECRET_BASE_OPPONENT)
{
- SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); // link battle?
+ SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music);
}
else if (IsPlayerDefeated(gBattleOutcome) == TRUE)
{
@@ -1113,7 +1112,7 @@ void CB2_EndTrainerEyeRematchBattle(void)
{
if (gTrainerBattleOpponent == SECRET_BASE_OPPONENT)
{
- SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); // link battle?
+ SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music);
}
else if (IsPlayerDefeated(gBattleOutcome) == TRUE)
{
diff --git a/src/battle/battle_transition.c b/src/battle/battle_transition.c
index f7cdc0694..a94974b27 100644
--- a/src/battle/battle_transition.c
+++ b/src/battle/battle_transition.c
@@ -6,6 +6,7 @@
#include "palette.h"
#include "trig.h"
#include "field_effect.h"
+#include "field_weather.h"
#include "random.h"
#include "sprite.h"
#include "sound.h"
@@ -15,7 +16,6 @@
#include "ewram.h"
#include "scanline_effect.h"
-void sub_807DE10(void);
void ScanlineEffect_Clear(void);
extern const struct OamData gFieldOamData_32x32;
@@ -567,7 +567,7 @@ static void Task_BattleTransitionMain(u8 taskID)
static bool8 Transition_Phase1(struct Task* task)
{
- sub_807DE10();
+ SetWeatherScreenFadeOut();
CpuCopy32(gPlttBufferFaded, gPlttBufferUnfaded, 0x400);
if (sPhase1_Tasks[task->tTransitionID] != NULL)
{
diff --git a/src/battle/battle_util.c b/src/battle/battle_util.c
index f93664593..194a002d3 100644
--- a/src/battle/battle_util.c
+++ b/src/battle/battle_util.c
@@ -4,6 +4,7 @@
#include "data2.h"
#include "event_data.h"
#include "ewram.h"
+#include "field_weather.h"
#include "item.h"
#include "link.h"
#include "pokemon.h"
@@ -21,6 +22,8 @@
#include "constants/species.h"
#include "constants/weather.h"
+extern u8 gUnknown_02023A14_50;
+
extern const u8* gBattlescriptCurrInstr;
extern u8 gActiveBank;
extern u8 gBattleBufferB[4][0x200];
@@ -85,7 +88,6 @@ 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 RecordAbilityBattle(u8 bank, u8 ability);
void RecordItemBattle(u8 bank, u8 holdEffect);
s8 GetPokeFlavourRelation(u32 pid, u8 flavor);
@@ -1736,18 +1738,15 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
else
moveType = gBattleMoves[move].type;
- //_080184AC
switch (caseID)
{
case ABILITYEFFECT_ON_SWITCHIN: // 0
- //_08018518
if (gBankAttacker >= gNoOfAllBanks)
gBankAttacker = bank;
switch (gLastUsedAbility)
{
case 0xFF: //weather from overworld
- //_08018586
- switch (weather_get_current())
+ switch (GetCurrentWeather())
{
case WEATHER_RAIN_LIGHT:
case WEATHER_RAIN_MED:
@@ -1781,12 +1780,11 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
if (effect)
{
- gBattleCommunication[MULTISTRING_CHOOSER] = weather_get_current();
+ gBattleCommunication[MULTISTRING_CHOOSER] = GetCurrentWeather();
BattleScriptPushCursorAndCallback(BattleScript_OverworldWeatherStarts);
}
break;
case ABILITY_DRIZZLE:
- //_08018680
if (!(gBattleWeather & WEATHER_RAIN_PERMANENT))
{
gBattleWeather = (WEATHER_RAIN_PERMANENT | WEATHER_RAIN_TEMPORARY);
@@ -1796,7 +1794,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITY_SAND_STREAM:
- //_080186B8
if (!(gBattleWeather & WEATHER_SANDSTORM_PERMANENT))
{
gBattleWeather = (WEATHER_SANDSTORM_PERMANENT | WEATHER_SANDSTORM_TEMPORARY);
@@ -1806,7 +1803,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITY_DROUGHT:
- //_080186F0
if (!(gBattleWeather & WEATHER_SUN_PERMANENT))
{
gBattleWeather = (WEATHER_SUN_PERMANENT | WEATHER_SUN_TEMPORARY);
@@ -1816,7 +1812,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITY_INTIMIDATE:
- //_08018728
if (!(gSpecialStatuses[bank].intimidatedPoke))
{
gStatuses3[bank] |= STATUS3_INTIMIDATE_POKES;
@@ -1824,7 +1819,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITY_FORECAST:
- //_0801875C
effect = CastformDataTypeChange(bank);
if (effect != 0)
{
@@ -1834,7 +1828,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITY_TRACE:
- //_080187A0
if (!(gSpecialStatuses[bank].traced))
{
gStatuses3[bank] |= STATUS3_TRACE;
@@ -1843,7 +1836,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
break;
case ABILITY_CLOUD_NINE:
case ABILITY_AIR_LOCK:
- //_080187DC
{
// that's a weird choice for a variable, why not use i or bank?
for (target1 = 0; target1 < gNoOfAllBanks; target1++)
@@ -1862,7 +1854,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITYEFFECT_ENDTURN: // 1
- //_08018814
if (gBattleMons[bank].hp != 0)
{
gBankAttacker = bank;
@@ -1922,7 +1913,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITYEFFECT_MOVES_BLOCK: // 2
- //_08018A40
if (gLastUsedAbility == ABILITY_SOUNDPROOF)
{
for (i = 0; gSoundMovesTable[i] != 0xFFFF; i++)
@@ -1940,7 +1930,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITYEFFECT_ABSORBING: // 3
- //_08018AD8
if (move)
{
switch (gLastUsedAbility)
@@ -2010,11 +1999,9 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITYEFFECT_CONTACT: // 4
- //_08018CF0
switch (gLastUsedAbility)
{
case ABILITY_COLOR_CHANGE:
- //_08018DCC
if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
&& move != MOVE_STRUGGLE
&& gBattleMoves[move].power != 0
@@ -2035,7 +2022,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITY_ROUGH_SKIN:
- //_08018E94
if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
&& gBattleMons[gBankAttacker].hp != 0
&& !gProtectStructs[gBankAttacker].confusionSelfDmg
@@ -2051,100 +2037,195 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITY_EFFECT_SPORE:
- //_08018F54
- if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
- && gBattleMons[gBankAttacker].hp != 0
- && !gProtectStructs[gBankAttacker].confusionSelfDmg
- && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special)
- && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)
- && (Random() % 10) == 0)
- {
- do
- {
- gBattleCommunication[MOVE_EFFECT_BYTE] = Random() & 3;
- } while (gBattleCommunication[MOVE_EFFECT_BYTE] == 0);
- if (gBattleCommunication[MOVE_EFFECT_BYTE] == 3)
- gBattleCommunication[MOVE_EFFECT_BYTE] += 2;
- gBattleCommunication[MOVE_EFFECT_BYTE] += 0x40;
- BattleScriptPushCursor();
- gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect;
- gHitMarker |= HITMARKER_IGNORE_SAFEGUARD;
- effect++;
- }
+ if (DEBUG && (gUnknown_02023A14_50 & 4))
+ {
+ if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
+ && gBattleMons[gBankAttacker].hp != 0
+ && !gProtectStructs[gBankAttacker].confusionSelfDmg
+ && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special)
+ && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT))
+ {
+ do
+ {
+ gBattleCommunication[MOVE_EFFECT_BYTE] = Random() & 3;
+ } while (gBattleCommunication[MOVE_EFFECT_BYTE] == 0);
+ if (gBattleCommunication[MOVE_EFFECT_BYTE] == 3)
+ gBattleCommunication[MOVE_EFFECT_BYTE] += 2;
+ gBattleCommunication[MOVE_EFFECT_BYTE] += 0x40;
+ BattleScriptPushCursor();
+ gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect;
+ gHitMarker |= HITMARKER_IGNORE_SAFEGUARD;
+ effect++;
+ }
+ }
+ else
+ {
+ if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
+ && gBattleMons[gBankAttacker].hp != 0
+ && !gProtectStructs[gBankAttacker].confusionSelfDmg
+ && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special)
+ && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)
+ && (Random() % 10) == 0)
+ {
+ do
+ {
+ gBattleCommunication[MOVE_EFFECT_BYTE] = Random() & 3;
+ } while (gBattleCommunication[MOVE_EFFECT_BYTE] == 0);
+ if (gBattleCommunication[MOVE_EFFECT_BYTE] == 3)
+ gBattleCommunication[MOVE_EFFECT_BYTE] += 2;
+ gBattleCommunication[MOVE_EFFECT_BYTE] += 0x40;
+ BattleScriptPushCursor();
+ gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect;
+ gHitMarker |= HITMARKER_IGNORE_SAFEGUARD;
+ effect++;
+ }
+ }
break;
case ABILITY_POISON_POINT:
- //_0801904C
- if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
- && gBattleMons[gBankAttacker].hp != 0
- && !gProtectStructs[gBankAttacker].confusionSelfDmg
- && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special)
- && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)
- && (Random() % 3) == 0)
- {
- gBattleCommunication[MOVE_EFFECT_BYTE] = 0x42;
- BattleScriptPushCursor();
- gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect;
- gHitMarker |= HITMARKER_IGNORE_SAFEGUARD;
- effect++;
- }
+ if (DEBUG && (gUnknown_02023A14_50 & 4))
+ {
+ if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
+ && gBattleMons[gBankAttacker].hp != 0
+ && !gProtectStructs[gBankAttacker].confusionSelfDmg
+ && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special)
+ && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT))
+ {
+ gBattleCommunication[MOVE_EFFECT_BYTE] = 0x42;
+ BattleScriptPushCursor();
+ gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect;
+ gHitMarker |= HITMARKER_IGNORE_SAFEGUARD;
+ effect++;
+ }
+ }
+ else
+ {
+ if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
+ && gBattleMons[gBankAttacker].hp != 0
+ && !gProtectStructs[gBankAttacker].confusionSelfDmg
+ && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special)
+ && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)
+ && (Random() % 3) == 0)
+ {
+ gBattleCommunication[MOVE_EFFECT_BYTE] = 0x42;
+ BattleScriptPushCursor();
+ gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect;
+ gHitMarker |= HITMARKER_IGNORE_SAFEGUARD;
+ effect++;
+ }
+ }
break;
case ABILITY_STATIC:
- //_08019128
- if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
- && gBattleMons[gBankAttacker].hp != 0
- && !gProtectStructs[gBankAttacker].confusionSelfDmg
- && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special)
- && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)
- && (Random() % 3) == 0)
- {
- gBattleCommunication[MOVE_EFFECT_BYTE] = 0x45;
- BattleScriptPushCursor();
- gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect;
- gHitMarker |= HITMARKER_IGNORE_SAFEGUARD;
- effect++;
- }
+ if (DEBUG && (gUnknown_02023A14_50 & 4))
+ {
+ if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
+ && gBattleMons[gBankAttacker].hp != 0
+ && !gProtectStructs[gBankAttacker].confusionSelfDmg
+ && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special)
+ && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT))
+ {
+ gBattleCommunication[MOVE_EFFECT_BYTE] = 0x45;
+ BattleScriptPushCursor();
+ gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect;
+ gHitMarker |= HITMARKER_IGNORE_SAFEGUARD;
+ effect++;
+ }
+ }
+ else
+ {
+ if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
+ && gBattleMons[gBankAttacker].hp != 0
+ && !gProtectStructs[gBankAttacker].confusionSelfDmg
+ && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special)
+ && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)
+ && (Random() % 3) == 0)
+ {
+ gBattleCommunication[MOVE_EFFECT_BYTE] = 0x45;
+ BattleScriptPushCursor();
+ gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect;
+ gHitMarker |= HITMARKER_IGNORE_SAFEGUARD;
+ effect++;
+ }
+ }
break;
case ABILITY_FLAME_BODY:
- //_08019204
- if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
- && gBattleMons[gBankAttacker].hp != 0
- && !gProtectStructs[gBankAttacker].confusionSelfDmg
- && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)
- && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special)
- && (Random() % 3) == 0)
- {
- gBattleCommunication[MOVE_EFFECT_BYTE] = 0x43;
- BattleScriptPushCursor();
- gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect;
- gHitMarker |= HITMARKER_IGNORE_SAFEGUARD;
- effect++;
- }
+ if (DEBUG && (gUnknown_02023A14_50 & 4))
+ {
+ if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
+ && gBattleMons[gBankAttacker].hp != 0
+ && !gProtectStructs[gBankAttacker].confusionSelfDmg
+ && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)
+ && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special))
+ {
+ gBattleCommunication[MOVE_EFFECT_BYTE] = 0x43;
+ BattleScriptPushCursor();
+ gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect;
+ gHitMarker |= HITMARKER_IGNORE_SAFEGUARD;
+ effect++;
+ }
+ }
+ else
+ {
+ if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
+ && gBattleMons[gBankAttacker].hp != 0
+ && !gProtectStructs[gBankAttacker].confusionSelfDmg
+ && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)
+ && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special)
+ && (Random() % 3) == 0)
+ {
+ gBattleCommunication[MOVE_EFFECT_BYTE] = 0x43;
+ BattleScriptPushCursor();
+ gBattlescriptCurrInstr = BattleScript_ApplySecondaryEffect;
+ gHitMarker |= HITMARKER_IGNORE_SAFEGUARD;
+ effect++;
+ }
+ }
break;
case ABILITY_CUTE_CHARM:
- //_080192E0
- if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
- && gBattleMons[gBankAttacker].hp != 0
- && !gProtectStructs[gBankAttacker].confusionSelfDmg
- && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)
- && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special)
- && gBattleMons[gBankTarget].hp != 0
- && (Random() % 3) == 0
- && gBattleMons[gBankAttacker].ability != ABILITY_OBLIVIOUS
- && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != GetGenderFromSpeciesAndPersonality(speciesDef, pidDef)
- && !(gBattleMons[gBankAttacker].status2 & STATUS2_INFATUATION)
- && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != 0xFF
- && GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) != 0xFF)
- {
- gBattleMons[gBankAttacker].status2 |= (gBitTable[gBankTarget] << 0x10);
- BattleScriptPushCursor();
- gBattlescriptCurrInstr = BattleScript_CuteCharmActivates;
- effect++;
- }
+ if (DEBUG && (gUnknown_02023A14_50 & 4))
+ {
+ if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
+ && gBattleMons[gBankAttacker].hp != 0
+ && !gProtectStructs[gBankAttacker].confusionSelfDmg
+ && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)
+ && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special)
+ && gBattleMons[gBankTarget].hp != 0
+ && gBattleMons[gBankAttacker].ability != ABILITY_OBLIVIOUS
+ && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != GetGenderFromSpeciesAndPersonality(speciesDef, pidDef)
+ && !(gBattleMons[gBankAttacker].status2 & STATUS2_INFATUATION)
+ && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != 0xFF
+ && GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) != 0xFF)
+ {
+ gBattleMons[gBankAttacker].status2 |= (gBitTable[gBankTarget] << 0x10);
+ BattleScriptPushCursor();
+ gBattlescriptCurrInstr = BattleScript_CuteCharmActivates;
+ effect++;
+ }
+ }
+ else
+ {
+ if (!(gBattleMoveFlags & MOVESTATUS_NOEFFECT)
+ && gBattleMons[gBankAttacker].hp != 0
+ && !gProtectStructs[gBankAttacker].confusionSelfDmg
+ && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)
+ && (gSpecialStatuses[gBankTarget].moveturnLostHP_physical || gSpecialStatuses[gBankTarget].moveturnLostHP_special)
+ && gBattleMons[gBankTarget].hp != 0
+ && (Random() % 3) == 0
+ && gBattleMons[gBankAttacker].ability != ABILITY_OBLIVIOUS
+ && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != GetGenderFromSpeciesAndPersonality(speciesDef, pidDef)
+ && !(gBattleMons[gBankAttacker].status2 & STATUS2_INFATUATION)
+ && GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != 0xFF
+ && GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) != 0xFF)
+ {
+ gBattleMons[gBankAttacker].status2 |= (gBitTable[gBankTarget] << 0x10);
+ BattleScriptPushCursor();
+ gBattlescriptCurrInstr = BattleScript_CuteCharmActivates;
+ effect++;
+ }
+ }
break;
}
break;
case ABILITYEFFECT_IMMUNITY: // 5
- //_08019448
{
for (bank = 0; bank < gNoOfAllBanks; bank++)
{
@@ -2228,7 +2309,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITYEFFECT_FORECAST: // 6
- //_080197B4
{
for (bank = 0; bank < gNoOfAllBanks; bank++)
{
@@ -2247,7 +2327,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITYEFFECT_SYNCHRONIZE: // 7
- //_08019804
if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT))
{
gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT);
@@ -2263,7 +2342,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITYEFFECT_ATK_SYNCHRONIZE: // 8
- //_08019880
if (gLastUsedAbility == ABILITY_SYNCHRONIZE && (gHitMarker & HITMARKER_SYNCHRONISE_EFFECT))
{
gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT);
@@ -2279,7 +2357,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITYEFFECT_INTIMIDATE1: // 9
- //_080198FC
for (i = 0; i < gNoOfAllBanks; i++)
{
if (gBattleMons[i].ability == ABILITY_INTIMIDATE && gStatuses3[i] & STATUS3_INTIMIDATE_POKES)
@@ -2294,7 +2371,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITYEFFECT_TRACE: // 11
- //_08019940
for (i = 0; i < gNoOfAllBanks; i++)
{
if (gBattleMons[i].ability == ABILITY_TRACE && (gStatuses3[i] & STATUS3_TRACE))
@@ -2308,7 +2384,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
if (gBattleMons[target1].ability != 0 && gBattleMons[target1].hp != 0
&& gBattleMons[target2].ability != 0 && gBattleMons[target2].hp != 0)
{
- //_080199AE
gActiveBank = GetBankByIdentity(((Random() & 1) * 2) | side);
gBattleMons[i].ability = gBattleMons[gActiveBank].ability;
gLastUsedAbility = gBattleMons[gActiveBank].ability;
@@ -2316,7 +2391,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
else if (gBattleMons[target1].ability != 0 && gBattleMons[target1].hp != 0)
{
- //_08019A34
gActiveBank = target1;
gBattleMons[i].ability = gBattleMons[gActiveBank].ability;
gLastUsedAbility = gBattleMons[gActiveBank].ability;
@@ -2324,7 +2398,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
else if (gBattleMons[target2].ability != 0 && gBattleMons[target2].hp != 0)
{
- //_08019A78
gActiveBank = target2;
gBattleMons[i].ability = gBattleMons[gActiveBank].ability;
gLastUsedAbility = gBattleMons[gActiveBank].ability;
@@ -2332,7 +2405,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
}
else
- //_08019ABC
{
gActiveBank = target1;
if (gBattleMons[target1].ability && gBattleMons[target1].hp)
@@ -2364,7 +2436,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITYEFFECT_INTIMIDATE2: // 10
- //_08019B1C
for (i = 0; i < gNoOfAllBanks; i++)
{
if (gBattleMons[i].ability == ABILITY_INTIMIDATE && (gStatuses3[i] & STATUS3_INTIMIDATE_POKES))
@@ -2380,7 +2451,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITYEFFECT_CHECK_OTHER_SIDE: // 12
- //_08019B60
side = GetBankSide(bank);
for (i = 0; i < gNoOfAllBanks; i++)
{
@@ -2392,7 +2462,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITYEFFECT_CHECK_BANK_SIDE: // 13
- //_08019BBC
side = GetBankSide(bank);
for (i = 0; i < gNoOfAllBanks; i++)
{
@@ -2404,7 +2473,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITYEFFECT_FIELD_SPORT: // 14
- //_08019C18
switch (gLastUsedAbility)
{
case 0xFD:
@@ -2434,7 +2502,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITYEFFECT_CHECK_ON_FIELD: // 19
- //_08019CD4
for (i = 0; i < gNoOfAllBanks; i++)
{
if (gBattleMons[i].ability == ability && gBattleMons[i].hp != 0)
@@ -2445,7 +2512,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITYEFFECT_CHECK_FIELD_EXCEPT_BANK: // 15
- //_08019D18
for (i = 0; i < gNoOfAllBanks; i++)
{
if (gBattleMons[i].ability == ability && i != bank)
@@ -2456,7 +2522,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITYEFFECT_COUNT_OTHER_SIZE: // 16
- //_08019D5C
side = GetBankSide(bank);
for (i = 0; i < gNoOfAllBanks; i++)
{
@@ -2468,7 +2533,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITYEFFECT_COUNT_BANK_SIDE: // 17
- //_08019DB8
side = GetBankSide(bank);
for (i = 0; i < gNoOfAllBanks; i++)
{
@@ -2480,7 +2544,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
case ABILITYEFFECT_COUNT_ON_FIELD: // 18
- //_08019F44
for (i = 0; i < gNoOfAllBanks; i++)
{
if (gBattleMons[i].ability == ability && i != bank)
@@ -2491,7 +2554,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
break;
}
- //_08019F76
if (effect && caseID < 0xC && gLastUsedAbility != 0xFF)
RecordAbilityBattle(bank, gLastUsedAbility);
}
@@ -3385,17 +3447,25 @@ u8 IsMonDisobedient(void)
if (gBattleTypeFlags & BATTLE_TYPE_LINK
|| GetBankSide(gBankAttacker) == 1
- || !IsOtherTrainer(gBattleMons[gBankAttacker].otId, gBattleMons[gBankAttacker].otName)
- || FlagGet(FLAG_BADGE08_GET))
- return 0;
+ || !IsOtherTrainer(gBattleMons[gBankAttacker].otId, gBattleMons[gBankAttacker].otName))
+ return 0;
- obedienceLevel = 10;
- if (FlagGet(FLAG_BADGE02_GET))
- obedienceLevel = 30;
- if (FlagGet(FLAG_BADGE04_GET))
- obedienceLevel = 50;
- if (FlagGet(FLAG_BADGE06_GET))
- obedienceLevel = 70;
+ if (DEBUG && (gUnknown_02023A14_50 & 0x40))
+ {
+ obedienceLevel = 10;
+ }
+ else
+ {
+ if (FlagGet(FLAG_BADGE08_GET))
+ return 0;
+ obedienceLevel = 10;
+ if (FlagGet(FLAG_BADGE02_GET))
+ obedienceLevel = 30;
+ if (FlagGet(FLAG_BADGE04_GET))
+ obedienceLevel = 50;
+ if (FlagGet(FLAG_BADGE06_GET))
+ obedienceLevel = 70;
+ }
if (gBattleMons[gBankAttacker].level <= obedienceLevel)
return 0;
diff --git a/src/battle/contest_link_80C857C.c b/src/battle/contest_link_80C857C.c
index 616a72d27..4fb236294 100644
--- a/src/battle/contest_link_80C857C.c
+++ b/src/battle/contest_link_80C857C.c
@@ -1,9 +1,728 @@
#include "global.h"
+#include "ewram.h"
+#include "random.h"
+#include "task.h"
+#include "contest.h"
+#include "text.h"
+#include "string_util.h"
#include "link.h"
+static void sub_80C8644(u8 taskId);
+static void sub_80C8660(u8 taskId);
+#if GERMAN
+static void de_sub_80C9274(bool32 arg0);
+static void de_sub_80C9294(bool32 arg0);
+#endif
+
+static void SendBlockToAllOpponents(const void *data, u16 size)
+{
+ memcpy(eContestLinkSendBuffer, data, size);
+ SendBlock(bitmask_all_link_players_but_self(), eContestLinkSendBuffer, size);
+}
+
+static bool8 HasPlayerReceivedBlock(u8 who)
+{
+ u8 flag = 1 << who;
+ if (!(GetBlockReceivedStatus() & flag))
+ return FALSE;
+ ResetBlockReceivedFlag(flag);
+ return TRUE;
+}
+
+static bool8 HaveAllPlayersReceivedBlock(void)
+{
+ int i;
+
+ for (i = 0; i < MAX_LINK_PLAYERS; i++)
+ {
+ if (!((GetBlockReceivedStatus() >> i) & 1))
+ return FALSE;
+ }
+ ResetBlockReceivedFlags();
+ return TRUE;
+}
+
+void sub_80C8604(u8 taskId)
+{
+#if ENGLISH
+ u8 i;
+
+ for (i = 0; i < 4; i++)
+ gBlockRecvBuffer[i][0] = 0xff;
+#endif
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_80C8644;
+}
+
+static void sub_80C8644(u8 taskId)
+{
+ gTasks[taskId].func = sub_80C8660;
+}
+
+static void sub_80C8660(u8 taskId)
+{
+ if (gReceivedRemoteLinkPlayers)
+ {
+ gContestPlayerMonIndex = GetMultiplayerId();
+ if (GetLinkPlayerCount() == MAX_LINK_PLAYERS)
+ {
+ gIsLinkContest = TRUE;
+ SwitchTaskToFollowupFunc(taskId);
+ }
+ }
+}
+
+#ifdef NONMATCHING
+u8 sub_80C86A0(const u8 *string)
+{
+ u8 language = GAME_LANGUAGE;
+ if (string[0] == EXT_CTRL_CODE_BEGIN && string[1] == 0x15)
+ return language;
+ if (StringLength(string) > 5)
+ return language;
+ for (; *string != EOS; string++)
+ {
+ if (!((*string >= CHAR_A && *string <= CHAR_z) ||
+ (*string >= CHAR_0 + 0 && *string <= CHAR_0 + 9) ||
+ *string == CHAR_SPACE ||
+ *string == CHAR_PERIOD ||
+ *string == CHAR_COMMA ||
+ *string == 0xAB ||
+ *string == CHAR_QUESTION_MARK ||
+ *string == CHAR_MALE ||
+ *string == CHAR_FEMALE ||
+ *string == CHAR_SLASH ||
+ *string == CHAR_HYPHEN ||
+ *string == CHAR_ELLIPSIS ||
+ *string == 0xB1 ||
+ *string == 0xB2 ||
+ *string == 0xB3 ||
+ *string == 0xB1
+ ))
+ {
+ language = LANGUAGE_JAPANESE;
+ break;
+ }
+ }
+ return language;
+}
+#else
+__attribute__((naked)) u8 sub_80C86A0(const u8 *string)
+{
+ asm_unified("\tpush {r4,r5,lr}\n"
+ "\tadds r4, r0, 0\n"
+ ".ifdef ENGLISH\n"
+ "\tmovs r5, 0x2\n"
+ ".else\n"
+ "\tmovs r5, 0x5\n"
+ ".endif\n"
+ "\tldrb r0, [r4]\n"
+ "\tcmp r0, 0xFC\n"
+ "\tbne _080C86B6\n"
+ "\tldrb r0, [r4, 0x1]\n"
+ "\tcmp r0, 0x15\n"
+ "\tbne _080C86B6\n"
+ ".ifdef ENGLISH\n"
+ "\tmovs r0, 0x2\n"
+ ".else\n"
+ "\tmovs r0, 0x5\n"
+ ".endif\n"
+ "\tb _080C872C\n"
+ "_080C86B6:\n"
+ "\tadds r0, r4, 0\n"
+ "\tbl StringLength\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tcmp r0, 0x5\n"
+ "\tbhi _080C872A\n"
+ "\tldrb r0, [r4]\n"
+ "\tcmp r0, 0xFF\n"
+ "\tbeq _080C872A\n"
+ "_080C86CA:\n"
+ "\tldrb r1, [r4]\n"
+ "\tadds r0, r1, 0\n"
+ "\tadds r0, 0x45\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tcmp r0, 0x33\n"
+ "\tbls _080C871E\n"
+ "\tadds r0, r1, 0\n"
+ "\tadds r0, 0x5F\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tcmp r0, 0x9\n"
+ "\tbls _080C871E\n"
+ "\tadds r0, r1, 0\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _080C871E\n"
+ "\tcmp r0, 0xAD\n"
+ "\tbeq _080C871E\n"
+ "\tcmp r0, 0xB8\n"
+ "\tbeq _080C871E\n"
+ "\tcmp r0, 0xAB\n"
+ "\tbeq _080C871E\n"
+ "\tcmp r0, 0xAC\n"
+ "\tbeq _080C871E\n"
+ "\tcmp r0, 0xB5\n"
+ "\tbeq _080C871E\n"
+ "\tcmp r0, 0xB6\n"
+ "\tbeq _080C871E\n"
+ "\tcmp r0, 0xBA\n"
+ "\tbeq _080C871E\n"
+ "\tcmp r0, 0xAE\n"
+ "\tbeq _080C871E\n"
+ "\tcmp r0, 0xB0\n"
+ "\tbeq _080C871E\n"
+ "\tcmp r0, 0xB1\n"
+ "\tbeq _080C871E\n"
+ "\tcmp r0, 0xB2\n"
+ "\tbeq _080C871E\n"
+ "\tcmp r0, 0xB3\n"
+ "\tbeq _080C871E\n"
+ "\tcmp r0, 0xB1\n"
+ "\tbne _080C8728\n"
+ "_080C871E:\n"
+ "\tadds r4, 0x1\n"
+ "\tldrb r0, [r4]\n"
+ "\tcmp r0, 0xFF\n"
+ "\tbne _080C86CA\n"
+ "\tb _080C872A\n"
+ "_080C8728:\n"
+ "\tmovs r5, 0x1\n"
+ "_080C872A:\n"
+ "\tadds r0, r5, 0\n"
+ "_080C872C:\n"
+ "\tpop {r4,r5}\n"
+ "\tpop {r1}\n"
+ "\tbx r1");
+}
+#endif
+
+void sub_80C8734(u8 taskId)
+{
+ int i;
+ u8 *name;
+
+ switch (gTasks[taskId].data[0]) {
+#if ENGLISH
+ default:
+ gTasks[taskId].data[0] = 0;
+ SwitchTaskToFollowupFunc(taskId);
+ break;
+#elif GERMAN
+ case 8:
+#endif
+ case 0:
+ if (GetMultiplayerId() == 0) {
+ if (IsLinkTaskFinished()) {
+#if ENGLISH
+ memcpy(gBlockSendBuffer, gContestMons + gContestPlayerMonIndex, sizeof(struct ContestPokemon));
+ sub_8007E9C(2);
+ gTasks[taskId].data[0]++;
+#elif GERMAN
+ if (gTasks[taskId].data[0] == 0)
+ {
+ gTasks[taskId].data[0] = 3;
+ }
+ else
+ {
+ memcpy(gBlockSendBuffer, gContestMons + gContestPlayerMonIndex, sizeof(struct ContestPokemon));
+ de_sub_80C9274(FALSE);
+ sub_8007E9C(2);
+ gTasks[taskId].data[0] = 1;
+ }
+#endif
+ }
+ }
+ else
+ {
+ memcpy(gBlockSendBuffer, gContestMons + gContestPlayerMonIndex, sizeof(struct ContestPokemon));
+#if GERMAN
+ de_sub_80C9294(FALSE);
+#endif
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 1:
+ if (HaveAllPlayersReceivedBlock())
+ {
+ for (i = 0; i < MAX_LINK_PLAYERS; i++)
+ {
+ memcpy(gContestMons + i, gBlockRecvBuffer[i], sizeof(struct ContestPokemon));
+ name = gContestMons[i].nickname;
+ if (gLinkPlayers[i].language == LANGUAGE_JAPANESE)
+ {
+ ConvertInternationalString(name, sub_80C86A0(name));
+ }
+ else if (name[10] == EXT_CTRL_CODE_BEGIN)
+ {
+ ConvertInternationalString(name, LANGUAGE_JAPANESE);
+ } else
+ {
+ name[5] = name[10];
+ name[10] = EOS;
+ }
+ name = gContestMons[i].trainerName;
+ if (gLinkPlayers[i].language == LANGUAGE_JAPANESE)
+ {
+ name[7] = EOS;
+ name[6] = name[4];
+ name[5] = name[3];
+ name[4] = name[2];
+ name[3] = name[1];
+ name[2] = name[0];
+ name[1] = 0x15;
+ name[0] = EXT_CTRL_CODE_BEGIN;
+ }
+ else
+ {
+ name[5] = name[7];
+ name[7] = EOS;
+ }
+ }
+ gTasks[taskId].data[0]++;
+ }
+ break;
+#if GERMAN
+ case 2:
+ gTasks[taskId].data[0] = 0;
+ SwitchTaskToFollowupFunc(taskId);
+ break;
+ default:
+ gTasks[taskId].data[0]++;
+ break;
+#endif
+ }
+}
+
+void sub_80C88AC(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ default:
+ gTasks[taskId].data[0] = 0;
+ SwitchTaskToFollowupFunc(taskId);
+ break;
+ case 0:
+ if (GetMultiplayerId() == 0)
+ {
+ if (IsLinkTaskFinished())
+ {
+ SendBlockToAllOpponents(&gRngValue, sizeof(u32));
+ gTasks[taskId].data[0]++;
+ }
+ }
+ else
+ {
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 1:
+ if (HasPlayerReceivedBlock(0))
+ {
+ memcpy(&gRngValue, gBlockRecvBuffer[0], sizeof(u32));
+ memcpy(&gContestRngValue, gBlockRecvBuffer[0], sizeof(u32));
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ }
+}
+
+void sub_80C8938(u8 taskId)
+{
+ int i;
+
+ switch (gTasks[taskId].data[0])
+ {
+#if ENGLISH
+ default:
+ gTasks[taskId].data[0] = 0;
+ SwitchTaskToFollowupFunc(taskId);
+ break;
+#elif GERMAN
+ case 8:
+#endif
+ case 0:
+ gBlockSendBuffer[0] = gTasks[taskId].data[9];
+ if (GetMultiplayerId() == 0)
+ {
+ if (IsLinkTaskFinished())
+ {
+#if ENGLISH
+ sub_8007E9C(2);
+ gTasks[taskId].data[0]++;
+#elif GERMAN
+ if (gTasks[taskId].data[0] == 0)
+ {
+ gTasks[taskId].data[0] = 3;
+ }
+ else
+ {
+ de_sub_80C9274(TRUE);
+ sub_8007E9C(2);
+ gTasks[taskId].data[0] = 1;
+ }
+#endif
+ }
+ }
+ else
+ {
+#if GERMAN
+ de_sub_80C9294(TRUE);
+#endif
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 1:
+ if (HaveAllPlayersReceivedBlock())
+ {
+ for (i = 0; i < MAX_LINK_PLAYERS; i++)
+ {
+ gTasks[taskId].data[i + 1] = gBlockRecvBuffer[i][0];
+ }
+ gTasks[taskId].data[0]++;
+ }
+ break;
+#if GERMAN
+ case 2:
+ gTasks[taskId].data[0] = 0;
+ SwitchTaskToFollowupFunc(taskId);
+ break;
+ default:
+ gTasks[taskId].data[0]++;
+ break;
+#endif
+ }
+}
+
+void sub_80C89DC(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ default:
+ gTasks[taskId].data[0] = 0;
+ SwitchTaskToFollowupFunc(taskId);
+ break;
+ case 0:
+ if (IsLinkTaskFinished())
+ {
+ SendBlockToAllOpponents(&gContestPlayerMonIndex, sizeof(u8));
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 1:
+ if (HaveAllPlayersReceivedBlock())
+ {
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ }
+}
+
+void sub_80C8A38(u8 taskId)
+{
+ int i;
+
+ switch (gTasks[taskId].data[0])
+ {
+ default:
+ gTasks[taskId].data[0] = 0;
+ SwitchTaskToFollowupFunc(taskId);
+ break;
+ case 0:
+ if (IsLinkTaskFinished())
+ {
+ SendBlockToAllOpponents(&sContestantStatus[gContestPlayerMonIndex].currMove, sizeof(u16));
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 1:
+ if (HaveAllPlayersReceivedBlock())
+ {
+ for (i = 0; i < MAX_LINK_PLAYERS; i++)
+ {
+ *&sContestantStatus[i].currMove = gBlockRecvBuffer[i][0];
+ }
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ }
+}
+
+void sub_80C8AD0(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (IsLinkTaskFinished())
+ {
+ SendBlockToAllOpponents(gUnknown_02038678, sizeof gUnknown_02038678);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 1:
+ if (HaveAllPlayersReceivedBlock())
+ {
+ memcpy(gUnknown_02038678, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038678);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 2:
+ case 5:
+ case 8:
+ case 11:
+ if (gTasks[taskId].data[1]++ > 10)
+ {
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 3:
+ if (IsLinkTaskFinished())
+ {
+ SendBlockToAllOpponents(gUnknown_02038680, sizeof gUnknown_02038680);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 4:
+ if (HaveAllPlayersReceivedBlock())
+ {
+ memcpy(gUnknown_02038680, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038680);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 6:
+ if (IsLinkTaskFinished())
+ {
+ SendBlockToAllOpponents(gUnknown_02038688, sizeof gUnknown_02038688);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 7:
+ if (HaveAllPlayersReceivedBlock())
+ {
+ memcpy(gUnknown_02038688, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038688);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 9:
+ if (IsLinkTaskFinished())
+ {
+ SendBlockToAllOpponents(gContestFinalStandings, sizeof gContestFinalStandings);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 10:
+ if (HaveAllPlayersReceivedBlock())
+ {
+ memcpy(gContestFinalStandings, gBlockRecvBuffer[gUnknown_0203869B], sizeof gContestFinalStandings);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ default:
+ gTasks[taskId].data[0] = 0;
+ SwitchTaskToFollowupFunc(taskId);
+ break;
+ }
+}
+
+void sub_80C8C80(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (IsLinkTaskFinished())
+ {
+ SendBlockToAllOpponents(sContestantStatus, 4 * sizeof(struct ContestantStatus));
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 1:
+ if (HaveAllPlayersReceivedBlock())
+ {
+ memcpy(sContestantStatus, gBlockRecvBuffer[gUnknown_0203869B], 4 * sizeof(struct ContestantStatus));
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 2:
+ case 5:
+ case 8:
+ case 11:
+ if (gTasks[taskId].data[1]++ > 10)
+ {
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 3:
+ if (IsLinkTaskFinished())
+ {
+ SendBlockToAllOpponents(&shared192D0, sizeof shared192D0);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 4:
+ if (HaveAllPlayersReceivedBlock())
+ {
+ memcpy(&shared192D0, gBlockRecvBuffer[gUnknown_0203869B], sizeof shared192D0);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 6:
+ if (IsLinkTaskFinished())
+ {
+ SendBlockToAllOpponents(&shared19328, sizeof shared19328);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 7:
+ if (HaveAllPlayersReceivedBlock())
+ {
+ memcpy(&shared19328, gBlockRecvBuffer[gUnknown_0203869B], sizeof shared19328);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 9:
+ if (IsLinkTaskFinished())
+ {
+ SendBlockToAllOpponents(gUnknown_02038696, sizeof gUnknown_02038696);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 10:
+ if (HaveAllPlayersReceivedBlock())
+ {
+ memcpy(gUnknown_02038696, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038696);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ default:
+ gTasks[taskId].data[0] = 0;
+ SwitchTaskToFollowupFunc(taskId);
+ break;
+ }
+}
+
+void sub_80C8E1C(u8 taskId)
+{
+ int i;
+
+ switch (gTasks[taskId].data[0])
+ {
+#if ENGLISH
+ default:
+ gTasks[taskId].data[0] = 0;
+ SwitchTaskToFollowupFunc(taskId);
+ break;
+#elif GERMAN
+ case 8:
+#endif
+ case 0:
+ gBlockSendBuffer[0] = 0x64;
+ if (GetMultiplayerId() == 0)
+ {
+ if (IsLinkTaskFinished())
+ {
+#if ENGLISH
+ sub_8007E9C(2);
+ gTasks[taskId].data[0]++;
+#elif GERMAN
+ if (gTasks[taskId].data[0] == 0)
+ {
+ gTasks[taskId].data[0] = 3;
+ }
+ else
+ {
+ de_sub_80C9274(FALSE);
+ sub_8007E9C(2);
+ gTasks[taskId].data[0] = 1;
+ }
+#endif
+ }
+ }
+ else
+ {
+#if GERMAN
+ de_sub_80C9294(FALSE);
+#endif
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 1:
+ if (HaveAllPlayersReceivedBlock())
+ {
+ for (i = 0; i < MAX_LINK_PLAYERS; i++)
+ {
+ gTasks[taskId].data[5 + i] = gBlockRecvBuffer[i][0];
+ }
+ gTasks[taskId].data[0]++;
+ }
+ break;
+#if GERMAN
+ case 2:
+ gTasks[taskId].data[0] = 0;
+ SwitchTaskToFollowupFunc(taskId);
+ break;
+ default:
+ gTasks[taskId].data[0]++;
+ break;
+#endif
+ }
+}
+
+void sub_80C8EBC(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ default:
+ gTasks[taskId].data[0] = 0;
+ SwitchTaskToFollowupFunc(taskId);
+ break;
+ case 0:
+ if (IsLinkTaskFinished())
+ {
+ SendBlockToAllOpponents(gUnknown_02038670, sizeof gUnknown_02038670);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 1:
+ if (HaveAllPlayersReceivedBlock())
+ {
+ memcpy(gUnknown_02038670, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038670);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ }
+}
+
+void sub_80C8F34(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ default:
+ gTasks[taskId].data[0] = 0;
+ SwitchTaskToFollowupFunc(taskId);
+ break;
+ case 0:
+ if (IsLinkTaskFinished())
+ {
+ SendBlockToAllOpponents(gUnknown_02038696, sizeof gUnknown_02038696);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 1:
+ if (HaveAllPlayersReceivedBlock())
+ {
+ memcpy(gUnknown_02038696, gBlockRecvBuffer[gUnknown_0203869B], sizeof gUnknown_02038696);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ }
+}
+
#if GERMAN
-void de_sub_80C9274(bool32 arg0)
+static void de_sub_80C9274(bool32 arg0)
{
if (deUnkValue2 == 1)
{
@@ -14,7 +733,7 @@ void de_sub_80C9274(bool32 arg0)
}
}
-void de_sub_80C9294(bool32 arg0)
+static void de_sub_80C9294(bool32 arg0)
{
if (deUnkValue2 == 1)
{
diff --git a/src/battle/pokeball.c b/src/battle/pokeball.c
index 6f27469ce..20c6d8676 100644
--- a/src/battle/pokeball.c
+++ b/src/battle/pokeball.c
@@ -21,7 +21,7 @@ extern u16 gBattleTypeFlags;
extern u8 gBankTarget;
extern u8 gActiveBank;
extern u16 gBattlePartyID[];
-extern u8 gObjectBankIDs[];
+extern u8 gBankSpriteIds[];
extern u8 gDoingBattleAnim;
extern u8 gHealthboxIDs[];
@@ -297,8 +297,8 @@ const struct SpriteTemplate gBallSpriteTemplates[] =
};
extern u32 ball_number_to_ball_processing_index(u16); // not sure of return type
-extern void sub_80786EC();
-extern bool8 sub_8078718(struct Sprite *);
+extern void InitAnimSpriteTranslationOverDuration();
+extern bool8 TranslateAnimSpriteLinearAndSine(struct Sprite *);
extern u8 sub_814086C(u8, u8, int, int, u8);
extern u8 sub_8141314(u8, u8, int, u8);
@@ -397,7 +397,7 @@ static void sub_8046464(u8 taskId)
gSprites[spriteId].data[2] = GetBankPosition(gBankTarget, 0);
gSprites[spriteId].data[4] = GetBankPosition(gBankTarget, 1) - 16;
gSprites[spriteId].data[5] = -40;
- sub_80786EC(&gSprites[spriteId]);
+ InitAnimSpriteTranslationOverDuration(&gSprites[spriteId]);
gSprites[spriteId].oam.affineParam = taskId;
gTasks[taskId].data[4] = gBankTarget;
gTasks[taskId].func = TaskDummy;
@@ -406,7 +406,7 @@ static void sub_8046464(u8 taskId)
static void objc_0804ABD4(struct Sprite *sprite)
{
- if (sub_8078718(sprite))
+ if (TranslateAnimSpriteLinearAndSine(sprite))
{
u8 taskId = sprite->oam.affineParam;
u8 r5 = gTasks[taskId].data[4];
@@ -442,9 +442,9 @@ static void sub_80466F4(struct Sprite *sprite)
{
sprite->data[5] = 0;
sprite->callback = sub_8046760;
- StartSpriteAffineAnim(&gSprites[gObjectBankIDs[sprite->data[6]]], 2);
- AnimateSprite(&gSprites[gObjectBankIDs[sprite->data[6]]]);
- gSprites[gObjectBankIDs[sprite->data[6]]].data[1] = 0;
+ StartSpriteAffineAnim(&gSprites[gBankSpriteIds[sprite->data[6]]], 2);
+ AnimateSprite(&gSprites[gBankSpriteIds[sprite->data[6]]]);
+ gSprites[gBankSpriteIds[sprite->data[6]]].data[1] = 0;
}
}
@@ -453,17 +453,17 @@ static void sub_8046760(struct Sprite *sprite)
sprite->data[5]++;
if (sprite->data[5] == 11)
PlaySE(SE_SUIKOMU);
- if (gSprites[gObjectBankIDs[sprite->data[6]]].affineAnimEnded)
+ if (gSprites[gBankSpriteIds[sprite->data[6]]].affineAnimEnded)
{
StartSpriteAnim(sprite, 2);
- gSprites[gObjectBankIDs[sprite->data[6]]].invisible = TRUE;
+ gSprites[gBankSpriteIds[sprite->data[6]]].invisible = TRUE;
sprite->data[5] = 0;
sprite->callback = sub_80467F8;
}
else
{
- gSprites[gObjectBankIDs[sprite->data[6]]].data[1] += 0x60;
- gSprites[gObjectBankIDs[sprite->data[6]]].pos2.y = -gSprites[gObjectBankIDs[sprite->data[6]]].data[1] >> 8;
+ gSprites[gBankSpriteIds[sprite->data[6]]].data[1] += 0x60;
+ gSprites[gBankSpriteIds[sprite->data[6]]].pos2.y = -gSprites[gBankSpriteIds[sprite->data[6]]].data[1] >> 8;
}
}
@@ -747,9 +747,9 @@ static void sub_8046C78(struct Sprite *sprite)
gTasks[taskId].data[2] = r4_2;
gTasks[taskId].data[15] = 0;
}
- StartSpriteAffineAnim(&gSprites[gObjectBankIDs[sprite->data[6]]], 1);
- AnimateSprite(&gSprites[gObjectBankIDs[sprite->data[6]]]);
- gSprites[gObjectBankIDs[sprite->data[6]]].data[1] = 0x1000;
+ StartSpriteAffineAnim(&gSprites[gBankSpriteIds[sprite->data[6]]], 1);
+ AnimateSprite(&gSprites[gBankSpriteIds[sprite->data[6]]]);
+ gSprites[gBankSpriteIds[sprite->data[6]]].data[1] = 0x1000;
}
static void sub_8046E7C(struct Sprite *sprite)
@@ -766,25 +766,25 @@ static void sub_8046E9C(struct Sprite *sprite)
bool8 r7 = FALSE;
u8 r4 = sprite->data[6];
- gSprites[gObjectBankIDs[r4]].invisible = FALSE;
+ gSprites[gBankSpriteIds[r4]].invisible = FALSE;
if (sprite->animEnded)
sprite->invisible = TRUE;
- if (gSprites[gObjectBankIDs[r4]].affineAnimEnded)
+ if (gSprites[gBankSpriteIds[r4]].affineAnimEnded)
{
- StartSpriteAffineAnim(&gSprites[gObjectBankIDs[r4]], 0);
+ StartSpriteAffineAnim(&gSprites[gBankSpriteIds[r4]], 0);
r7 = TRUE;
}
else
{
- gSprites[gObjectBankIDs[r4]].data[1] -= 288;
- gSprites[gObjectBankIDs[r4]].pos2.y = gSprites[gObjectBankIDs[r4]].data[1] >> 8;
+ gSprites[gBankSpriteIds[r4]].data[1] -= 288;
+ gSprites[gBankSpriteIds[r4]].pos2.y = gSprites[gBankSpriteIds[r4]].data[1] >> 8;
}
if (sprite->animEnded && r7)
{
s32 i;
u32 r3;
- gSprites[gObjectBankIDs[r4]].pos2.y = 0;
+ gSprites[gBankSpriteIds[r4]].pos2.y = 0;
gDoingBattleAnim = 0;
ewram17810[r4].unk0_3 = 0;
FreeSpriteOamMatrix(sprite);
@@ -819,8 +819,8 @@ static void sub_8046FBC(struct Sprite *sprite)
}
else if (sprite->data[4] == 315)
{
- FreeOamMatrix(gSprites[gObjectBankIDs[sprite->data[6]]].oam.matrixNum);
- DestroySprite(&gSprites[gObjectBankIDs[sprite->data[6]]]);
+ FreeOamMatrix(gSprites[gBankSpriteIds[sprite->data[6]]].oam.matrixNum);
+ DestroySprite(&gSprites[gBankSpriteIds[sprite->data[6]]]);
DestroySpriteAndFreeResources(sprite);
if (gMain.inBattle)
ewram17810[r7].unk0_3 = 0;
@@ -834,7 +834,7 @@ static void sub_8047074(struct Sprite *sprite)
sprite->data[4] = GetBankPosition(sprite->data[6], 3) + 24;
sprite->data[5] = -30;
sprite->oam.affineParam = sprite->data[6];
- sub_80786EC(sprite);
+ InitAnimSpriteTranslationOverDuration(sprite);
sprite->callback = sub_80470C4;
}
@@ -858,7 +858,7 @@ static void sub_80470C4(struct Sprite *sprite)
StartSpriteAffineAnim(sprite, 4);
}
r4 = sprite->data[0];
- sub_8078B5C(sprite);
+ TranslateAnimSpriteByDeltas(sprite);
sprite->data[7] += sprite->data[6] / 3;
sprite->pos2.y += Sin(HIBYTE(sprite->data[7]), sprite->data[5]);
sprite->oam.affineParam += 0x100;
@@ -876,7 +876,7 @@ static void sub_80470C4(struct Sprite *sprite)
}
else
{
- if (sub_8078718(sprite))
+ if (TranslateAnimSpriteLinearAndSine(sprite))
{
sprite->pos1.x += sprite->pos2.x;
sprite->pos1.y += sprite->pos2.y;
diff --git a/src/battle/reshow_battle_screen.c b/src/battle/reshow_battle_screen.c
index a78cb20df..85aa78ca0 100644
--- a/src/battle/reshow_battle_screen.c
+++ b/src/battle/reshow_battle_screen.c
@@ -25,11 +25,11 @@ extern u8 gBankInMenu;
extern u16 gBattlePartyID[4];
extern u8 gNoOfAllBanks;
extern u16 gBattleTypeFlags;
-extern u8 gObjectBankIDs[4];
+extern u8 gBankSpriteIds[4];
extern u8 gBattleMonForms[4];
extern u8 gHealthboxIDs[4];
-bool8 sub_800E414(u8 a0);
+bool8 LoadChosenBattleElement(u8 a0);
bool8 sub_8031C30(u8 a0);
void sub_8031EE8(void);
void sub_80327CC(void);
@@ -97,7 +97,7 @@ static void CB2_ReshowBattleScreenAfterMenu(void)
}
break;
case 2:
- if (!sub_800E414(gHelperState))
+ if (!LoadChosenBattleElement(gHelperState))
{
gHelperState++;
gReshowState--;
@@ -243,46 +243,46 @@ 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, GetBankPosition(bank, 2), posY, sub_8079E90(bank));
- gSprites[gObjectBankIDs[bank]].oam.paletteNum = bank;
- gSprites[gObjectBankIDs[bank]].callback = SpriteCallbackDummy;
- gSprites[gObjectBankIDs[bank]].data[0] = bank;
- gSprites[gObjectBankIDs[bank]].data[2] = GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES);
- StartSpriteAnim(&gSprites[gObjectBankIDs[bank]], gBattleMonForms[bank]);
+ gBankSpriteIds[bank] = CreateSprite(&gUnknown_02024E8C, GetBankPosition(bank, 2), posY, sub_8079E90(bank));
+ gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank;
+ gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy;
+ gSprites[gBankSpriteIds[bank]].data[0] = bank;
+ gSprites[gBankSpriteIds[bank]].data[2] = GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES);
+ StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]);
}
else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && bank == 0)
{
GetMonSpriteTemplate_803C5A0(gSaveBlock2.playerGender, GetBankIdentity(0));
- gObjectBankIDs[bank] = CreateSprite(&gUnknown_02024E8C, 0x50,
+ gBankSpriteIds[bank] = CreateSprite(&gUnknown_02024E8C, 0x50,
(8 - gTrainerBackPicCoords[gSaveBlock2.playerGender].coords) * 4 + 80,
sub_8079E90(0));
- gSprites[gObjectBankIDs[bank]].oam.paletteNum = bank;
- gSprites[gObjectBankIDs[bank]].callback = SpriteCallbackDummy;
- gSprites[gObjectBankIDs[bank]].data[0] = bank;
+ gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank;
+ gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy;
+ gSprites[gBankSpriteIds[bank]].data[0] = bank;
}
else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && bank == 0)
{
GetMonSpriteTemplate_803C5A0(2, GetBankIdentity(0));
- gObjectBankIDs[bank] = CreateSprite(&gUnknown_02024E8C, 0x50,
+ gBankSpriteIds[bank] = CreateSprite(&gUnknown_02024E8C, 0x50,
(8 - gTrainerBackPicCoords[2].coords) * 4 + 80,
sub_8079E90(0));
- gSprites[gObjectBankIDs[bank]].oam.paletteNum = bank;
- gSprites[gObjectBankIDs[bank]].callback = SpriteCallbackDummy;
- gSprites[gObjectBankIDs[bank]].data[0] = bank;
+ gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank;
+ gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy;
+ gSprites[gBankSpriteIds[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, GetBankPosition(bank, 2), posY, sub_8079E90(bank));
- gSprites[gObjectBankIDs[bank]].oam.paletteNum = bank;
- gSprites[gObjectBankIDs[bank]].callback = SpriteCallbackDummy;
- gSprites[gObjectBankIDs[bank]].data[0] = bank;
- gSprites[gObjectBankIDs[bank]].data[2] = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES);
- StartSpriteAnim(&gSprites[gObjectBankIDs[bank]], gBattleMonForms[bank]);
+ gBankSpriteIds[bank] = CreateSprite(&gUnknown_02024E8C, GetBankPosition(bank, 2), posY, sub_8079E90(bank));
+ gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank;
+ gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy;
+ gSprites[gBankSpriteIds[bank]].data[0] = bank;
+ gSprites[gBankSpriteIds[bank]].data[2] = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES);
+ StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]);
}
- gSprites[gObjectBankIDs[bank]].invisible = ewram17800[bank].invisible;
+ gSprites[gBankSpriteIds[bank]].invisible = ewram17800[bank].invisible;
}
}
diff --git a/src/field/battle_tower.c b/src/battle_tower.c
index ab2a818a7..8c44b71a3 100644
--- a/src/field/battle_tower.c
+++ b/src/battle_tower.c
@@ -28,12 +28,13 @@
#include "ewram.h"
#if ENGLISH
-#include "../data/battle_tower/trainers.h"
+#include "data/battle_tower/trainers.h"
#elif GERMAN
-#include "../data/battle_tower/trainers_de.h"
+#include "data/battle_tower/trainers_de.h"
#endif
-static const u16 sBattleTowerHeldItems[] = {
+static const u16 sBattleTowerHeldItems[] =
+{
ITEM_NONE,
ITEM_KINGS_ROCK,
ITEM_SITRUS_BERRY,
@@ -99,10 +100,11 @@ static const u16 sBattleTowerHeldItems[] = {
ITEM_GANLON_BERRY,
};
-#include "../data/battle_tower/level_50_mons.h"
-#include "../data/battle_tower/level_100_mons.h"
+#include "data/battle_tower/level_50_mons.h"
+#include "data/battle_tower/level_100_mons.h"
-static const u8 sMaleTrainerClasses[] = {
+static const u8 sMaleTrainerClasses[] =
+{
FACILITY_CLASS_RUIN_MANIAC,
FACILITY_CLASS_TUBER_M,
FACILITY_CLASS_COOL_TRAINER_M,
@@ -135,7 +137,8 @@ static const u8 sMaleTrainerClasses[] = {
FACILITY_CLASS_HIKER,
};
-static const u8 sFemaleTrainerClasses[] = {
+static const u8 sFemaleTrainerClasses[] =
+{
FACILITY_CLASS_AROMA_LADY,
FACILITY_CLASS_TUBER_F,
FACILITY_CLASS_COOL_TRAINER_F,
@@ -158,7 +161,8 @@ static const u8 sFemaleTrainerClasses[] = {
FACILITY_CLASS_LASS,
};
-static const u8 sMaleTrainerGfxIds[] = {
+static const u8 sMaleTrainerGfxIds[] =
+{
MAP_OBJ_GFX_HIKER,
MAP_OBJ_GFX_TUBER_M,
MAP_OBJ_GFX_MAN_4,
@@ -191,7 +195,8 @@ static const u8 sMaleTrainerGfxIds[] = {
MAP_OBJ_GFX_HIKER,
};
-static const u8 sFemaleTrainerGfxIds[] = {
+static const u8 sFemaleTrainerGfxIds[] =
+{
MAP_OBJ_GFX_WOMAN_3,
MAP_OBJ_GFX_TUBER_F,
MAP_OBJ_GFX_WOMAN_7,
@@ -214,7 +219,8 @@ static const u8 sFemaleTrainerGfxIds[] = {
MAP_OBJ_GFX_LASS,
};
-const u16 gBattleTowerBannedSpecies[] = {
+const u16 gBattleTowerBannedSpecies[] =
+{
SPECIES_MEW,
SPECIES_MEWTWO,
SPECIES_HO_OH,
@@ -229,7 +235,8 @@ const u16 gBattleTowerBannedSpecies[] = {
};
// Item prizes for battle tower streaks of 5 or fewer sets.
-/*static*/ const u16 sShortStreakPrizes[] = {
+static const u16 sShortStreakPrizes[] =
+{
ITEM_HP_UP,
ITEM_PROTEIN,
ITEM_IRON,
@@ -239,7 +246,8 @@ const u16 gBattleTowerBannedSpecies[] = {
};
// Item prizes for battle tower streaks of greater than 5 sets.
-/*static*/ const u16 sLongStreakPrizes[] = {
+static const u16 sLongStreakPrizes[] =
+{
ITEM_BRIGHT_POWDER,
ITEM_WHITE_HERB,
ITEM_QUICK_CLAW,
@@ -259,7 +267,6 @@ 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 *);
@@ -293,9 +300,7 @@ void sub_8134548(void)
default:
ResetBattleTowerStreak(levelType);
if (!var1)
- {
VarSet(VAR_TEMP_0, 5);
- }
break;
case 1:
ResetBattleTowerStreak(levelType);
@@ -321,10 +326,8 @@ void sub_8134548(void)
}
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))
- {
+ && (gSaveBlock2.battleTower.var_4AE[1] == 3 || gSaveBlock2.battleTower.var_4AE[1] == 6))
VarSet(VAR_TEMP_0, 5);
- }
ValidateBattleTowerRecordChecksums();
}
@@ -351,23 +354,18 @@ bool8 ShouldBattleEReaderTrainer(u8 levelType, u16 winStreak)
ValidateEReaderTrainer();
if (gSpecialVar_Result != 0 || gSaveBlock2.battleTower.ereaderTrainer.winStreak != winStreak)
- {
return FALSE;
- }
- trainerTeamLevel = 50;
if (levelType != 0)
- {
trainerTeamLevel = 100;
- }
+ else
+ trainerTeamLevel = 50;
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,
@@ -380,7 +378,7 @@ bool8 ShouldBattleEReaderTrainer(u8 levelType, u16 winStreak)
&numValid);
}
- return numValid == 3;
+ return (numValid == 3);
}
bool8 sub_81346F4(void)
@@ -409,6 +407,7 @@ bool8 sub_81346F4(void)
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];
@@ -416,9 +415,9 @@ bool8 sub_81346F4(void)
}
if (gSaveBlock2.battleTower.records[recordIndex].winStreak == winStreak
- && gSaveBlock2.battleTower.records[recordIndex].battleTowerLevelType == battleTowerLevelType
- && recordHasData
- && gSaveBlock2.battleTower.records[recordIndex].checksum == checksum)
+ && gSaveBlock2.battleTower.records[recordIndex].battleTowerLevelType == battleTowerLevelType
+ && recordHasData
+ && gSaveBlock2.battleTower.records[recordIndex].checksum == checksum)
{
trainerIds[numCandidates] = recordIndex;
numCandidates++;
@@ -785,19 +784,17 @@ void SetBattleTowerTrainerGfxId(u8 trainerIndex)
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++);
+ for (i = 0; i < 30; i++)
+ {
+ if (sMaleTrainerClasses[i] == trainerClass)
+ break;
+ }
if (i != 30)
{
u8 trainerObjectGfxId = sMaleTrainerGfxIds[i];
@@ -805,7 +802,11 @@ void SetBattleTowerTrainerGfxId(u8 trainerIndex)
return;
}
- for (i = 0; i < 20 && sFemaleTrainerClasses[i] != trainerClass; i++);
+ for (i = 0; i < 20; i++)
+ {
+ if (sFemaleTrainerClasses[i] == trainerClass)
+ break;
+ }
if (i != 20)
{
u8 trainerObjectGfxId = sFemaleTrainerGfxIds[i];
@@ -1144,33 +1145,21 @@ _08134C70: .4byte gSaveBlock2\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)
@@ -1180,26 +1169,20 @@ void get_trainer_name(u8* dest)
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;
+ dest[i] = EOS;
}
void FillBattleTowerTrainerParty(void)
@@ -1267,10 +1250,7 @@ void FillBattleTowerTrainerParty(void)
{
// Load E-Reader trainer's party.
for (partyIndex = 0; partyIndex < 3; partyIndex++)
- {
sub_803ADE8(&gEnemyParty[partyIndex], &gSaveBlock2.battleTower.ereaderTrainer.party[partyIndex]);
- }
-
return;
}
else
@@ -1282,7 +1262,6 @@ void FillBattleTowerTrainerParty(void)
&gEnemyParty[partyIndex],
&gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].party[partyIndex]);
}
-
return;
}
@@ -1330,10 +1309,8 @@ void FillBattleTowerTrainerParty(void)
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])
- {
+ && GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, NULL) == sBattleTowerHeldItems[battleTowerMons[battleMonIndex].heldItem])
break;
- }
}
if (i != partyIndex)
@@ -1342,7 +1319,12 @@ void FillBattleTowerTrainerParty(void)
// 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++);
+ //for (i = 0; i < partyIndex && chosenMonIndices[i] != battleMonIndex; i++);
+ for (i = 0; i < partyIndex; i++)
+ {
+ if (chosenMonIndices[i] == battleMonIndex)
+ break;
+ }
if (i != partyIndex)
continue;
@@ -1362,10 +1344,7 @@ void FillBattleTowerTrainerParty(void)
{
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;
- }
+ friendship = 0; // MOVE_FRUSTRATION is more powerful the lower the pokemon's friendship is.
}
SetMonData(&gEnemyParty[partyIndex], MON_DATA_FRIENDSHIP, &friendship);
@@ -1386,9 +1365,7 @@ u32 CountBattleTowerBanlistCaught(void)
for (i = 0; gBattleTowerBannedSpecies[i] != 0xFFFF; i++)
{
if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleTowerBannedSpecies[i]), FLAG_GET_CAUGHT))
- {
numCaught++;
- }
}
return numCaught;
@@ -1399,7 +1376,6 @@ u8 AppendBattleTowerBannedSpeciesName(u16 species, u8 curIndexToAppend, s32 numT
if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT))
{
curIndexToAppend++;
-
switch (curIndexToAppend - 1)
{
case 0:
@@ -1409,24 +1385,15 @@ u8 AppendBattleTowerBannedSpeciesName(u16 species, u8 curIndexToAppend, s32 numT
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:
@@ -1435,18 +1402,12 @@ u8 AppendBattleTowerBannedSpeciesName(u16 species, u8 curIndexToAppend, s32 numT
case 9:
default:
if (curIndexToAppend == numToAppend)
- {
StringAppend(gStringVar1, BattleText_Format3);
- }
else
- {
StringAppend(gStringVar1, BattleText_Format4);
- }
-
StringAppend(gStringVar1, BattleText_Format6);
break;
}
-
StringAppend(gStringVar1, gSpeciesNames[species]);
}
@@ -1464,7 +1425,7 @@ void CheckMonBattleTowerBanlist(u16 species, u16 heldItem, u16 hp, u8 battleTowe
while (1)
{
if (gBattleTowerBannedSpecies[counter] == 0xFFFF)
- goto EXIT2; // Couldn't get the code to match without this GOTO
+ break;
if (gBattleTowerBannedSpecies[counter] == species)
break;
@@ -1475,7 +1436,6 @@ void CheckMonBattleTowerBanlist(u16 species, u16 heldItem, u16 hp, u8 battleTowe
if (gBattleTowerBannedSpecies[counter] != 0xFFFF)
return;
- EXIT2:
if (battleTowerLevelType == 0 && monLevel > 50)
return;
@@ -1528,9 +1488,7 @@ void CheckPartyBattleTowerBanlist(void)
numBanlistCaught = CountBattleTowerBanlistCaught();
for (i = 0; gBattleTowerBannedSpecies[i] != 0xFFFF; i++)
- {
counter = AppendBattleTowerBannedSpeciesName(gBattleTowerBannedSpecies[i], counter, numBanlistCaught);
- }
if (counter == 0)
{
@@ -1561,17 +1519,11 @@ void PrintBattleTowerTrainerMessage(u16 *easyChat)
void PrintBattleTowerTrainerGreeting(void)
{
if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID)
- {
- PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.greeting.easyChat);
- }
+ PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.greeting);
else if (gSaveBlock2.battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)
- {
- PrintBattleTowerTrainerMessage((u16 *)gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].greeting.easyChat);
- }
+ PrintBattleTowerTrainerMessage((u16 *)gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].greeting);
else
- {
- PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].greeting.easyChat);
- }
+ PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].greeting);
}
void sub_81354CC(void)
@@ -1643,9 +1595,7 @@ void StartSpecialBattle(void)
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;
@@ -1683,34 +1633,22 @@ void SetBattleTowerProperty(void)
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;
@@ -1724,9 +1662,7 @@ void SetBattleTowerProperty(void)
break;
case 11:
if (gSaveBlock2.battleTower.var_4AE[battleTowerLevelType] != 3)
- {
ResetBattleTowerStreak(battleTowerLevelType);
- }
break;
case 12:
gSaveBlock2.battleTower.var_4AE[battleTowerLevelType] = ewram160FB;
@@ -1794,9 +1730,7 @@ void SetBattleTowerParty(void)
s32 i;
for (i = 0; i < 3; i++)
- {
gSelectedOrderFromParty[i] = gSaveBlock2.battleTower.selectedPartyMons[i];
- }
ReducePlayerPartyToThree();
}
@@ -1858,14 +1792,10 @@ void sub_8135AC4(void)
playerRecord->winStreak = GetCurrentBattleTowerWinStreak(battleTowerLevelType);
for (i = 0; i < 6; i++)
- {
- playerRecord->greeting.easyChat[i] = gSaveBlock1.easyChats.unk2B28[i];
- }
+ playerRecord->greeting[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();
@@ -1878,10 +1808,8 @@ void SaveBattleTowerProgress(void)
if (gSpecialVar_0x8004 == 3 || gSpecialVar_0x8004 == 0)
{
if (gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType] > 1
- || gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType] > 1)
- {
+ || gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType] > 1)
sub_8135AC4();
- }
}
sub_8135CFC();
@@ -1889,9 +1817,7 @@ void SaveBattleTowerProgress(void)
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;
@@ -1912,28 +1838,20 @@ void ValidateBattleTowerRecordChecksums(void)
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]);
- }
}
}
@@ -1943,9 +1861,7 @@ void SetBattleTowerRecordChecksum(struct BattleTowerRecord *record)
record->checksum = 0;
for (i = 0; i < (sizeof(struct BattleTowerRecord) / sizeof(u32)) - 1; i++)
- {
record->checksum += ((u32 *)record)[i];
- }
}
void ClearBattleTowerRecord(struct BattleTowerRecord *record)
@@ -1953,9 +1869,7 @@ 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)
@@ -1967,9 +1881,7 @@ void sub_8135CFC(void)
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)
@@ -1978,11 +1890,9 @@ u16 GetCurrentBattleTowerWinStreak(u8 battleTowerLevelType)
+ gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType];
if (winStreak > 9999)
- {
return 9999;
- }
-
- return winStreak;
+ else
+ return winStreak;
}
void DetermineBattleTowerPrize(void)
@@ -2019,11 +1929,10 @@ void AwardBattleTowerRibbons(void)
u8 ribbonType;
u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType;
- ribbonType = MON_DATA_WINNING_RIBBON;
if (battleTowerLevelType != 0)
- {
ribbonType = MON_DATA_VICTORY_RIBBON;
- }
+ else
+ ribbonType = MON_DATA_WINNING_RIBBON;
gSpecialVar_Result = 0;
@@ -2042,9 +1951,7 @@ void AwardBattleTowerRibbons(void)
}
if (gSpecialVar_Result != 0)
- {
IncrementGameStat(GAME_STAT_RECEIVED_RIBBONS);
- }
}
// This is a leftover debugging function that is used to populate the E-Reader
@@ -2076,16 +1983,14 @@ void Debug_FillEReaderTrainerWithPlayerData(void)
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;
+ ereaderTrainer->greeting[i] = gSaveBlock1.easyChats.unk2B28[i];
+ ereaderTrainer->farewellPlayerLost[i] = j;
+ ereaderTrainer->farewellPlayerWon[i] = j + 6;
j++;
}
for (i = 0; i < 3; i++)
- {
sub_803AF78(&gPlayerParty[i], &ereaderTrainer->party[i]);
- }
SetEReaderTrainerChecksum(ereaderTrainer);
}
@@ -2105,9 +2010,7 @@ void SetEReaderTrainerName(u8 *trainerName)
s32 i;
for (i = 0; i < 7; i++)
- {
trainerName[i] = gSaveBlock2.battleTower.ereaderTrainer.name[i];
- }
trainerName[i] = 0xFF;
}
@@ -2124,9 +2027,7 @@ void ValidateEReaderTrainer(void)
checksum = 0;
for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32) - 1; i++)
- {
checksum |= ((u32 *)ereaderTrainer)[i];
- }
if (checksum == 0)
{
@@ -2136,9 +2037,7 @@ void ValidateEReaderTrainer(void)
checksum = 0;
for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32) - 1; i++)
- {
checksum += ((u32 *)ereaderTrainer)[i];
- }
if (gSaveBlock2.battleTower.ereaderTrainer.checksum != checksum)
{
@@ -2153,9 +2052,7 @@ void SetEReaderTrainerChecksum(struct BattleTowerEReaderTrainer *ereaderTrainer)
ereaderTrainer->checksum = 0;
for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32) - 1; i++)
- {
ereaderTrainer->checksum += ((u32 *)ereaderTrainer)[i];
- }
}
void ClearEReaderTrainer(struct BattleTowerEReaderTrainer *ereaderTrainer)
@@ -2163,30 +2060,22 @@ 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);
+ PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.greeting);
}
void PrintEReaderTrainerFarewellMessage(void)
{
if (gBattleOutcome == BATTLE_DREW)
- {
- gStringVar4[0] = 0xFF;
- }
+ gStringVar4[0] = EOS;
else if (gBattleOutcome == BATTLE_WON)
- {
- PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.farewellPlayerWon.easyChat);
- }
+ PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.farewellPlayerWon);
else
- {
- PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.farewellPlayerLost.easyChat);
- }
+ PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.farewellPlayerLost);
}
void TryEnableBravoTrainerBattleTower(void)
@@ -2196,9 +2085,7 @@ void TryEnableBravoTrainerBattleTower(void)
for (i = 0; i < 2; i++)
{
if (gSaveBlock2.battleTower.var_4AE[i] == 1)
- {
sub_80BFD20();
- }
}
}
@@ -2206,17 +2093,11 @@ void TryEnableBravoTrainerBattleTower(void)
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)
diff --git a/src/field/berry.c b/src/berry.c
index 088267ad0..9313c458b 100644
--- a/src/field/berry.c
+++ b/src/berry.c
@@ -1,14 +1,16 @@
#include "global.h"
#include "berry.h"
#include "field_control_avatar.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "fieldmap.h"
#include "item.h"
#include "item_menu.h"
#include "item_use.h"
#include "constants/items.h"
#include "main.h"
+#include "menu.h"
#include "random.h"
+#include "task.h"
#include "text.h"
#define BERRY_NAME_LENGTH 6
@@ -999,6 +1001,30 @@ extern u16 gSpecialVar_0x8006;
static u8 CalcBerryYield(struct BerryTree *tree);
static u16 GetStageDurationByBerryType(u8 berry);
+#if DEBUG
+
+extern u8 sub_80B47D8(u16 var);
+
+u8 debug_sub_80C2B04(void)
+{
+ u8 taskId = sub_80B47D8(0);
+
+ gTasks[taskId].data[4]--;
+ CloseMenu();
+ return 1;
+}
+
+u8 debug_sub_80C2B30(void)
+{
+ u8 taskId = sub_80B47D8(1);
+
+ gTasks[taskId].data[4]--;
+ CloseMenu();
+ return 1;
+}
+
+#endif
+
// unused
// this could be static, but making it so causes a compile-time warning.
void ClearEnigmaBerries(void)
@@ -1041,9 +1067,7 @@ static u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry)
dest = (u8*)enigmaBerry;
checksum = 0;
for (i = 0; i < ((u32)&gSaveBlock1.enigmaBerry.checksum - (u32)&gSaveBlock1.enigmaBerry); i++)
- {
checksum += dest[i];
- }
// the checksum is calculated: the descriptions are safe to restore now.
gSaveBlock1.enigmaBerry.berry.description1 = description1;
@@ -1052,6 +1076,49 @@ static u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry)
return checksum;
}
+#if DEBUG
+
+extern const u8 gSpriteImage_UnusedCherry[];
+extern const u16 gSpritePalette_UnusedCherry[];
+extern u8 gUnknown_Debug_839B6CE[];
+
+static const u8 gUnknown_Debug_083F7F84[] = _("そとから きた きのみ");
+static const u8 gUnknown_Debug_083F7F90[] = _("ただいま かいはつちゅう");
+
+void debug_sub_80C2C18(u8 *name, u8 holdEffect, u8 holdEffectParam)
+{
+ s32 i;
+
+ gSaveBlock1.enigmaBerry.berry = gBerries[0];
+ StringCopy(gSaveBlock1.enigmaBerry.berry.name, name);
+ StringCopy(gSaveBlock1.enigmaBerry.description1, gUnknown_Debug_083F7F84);
+ StringCopy(gSaveBlock1.enigmaBerry.description2, gUnknown_Debug_083F7F90);
+ gSaveBlock1.enigmaBerry.berry.description1 = gSaveBlock1.enigmaBerry.description1;
+ gSaveBlock1.enigmaBerry.berry.description2 = gSaveBlock1.enigmaBerry.description2;
+ for (i = 0; i < 0x480; i++)
+ gSaveBlock1.enigmaBerry.pic[i] = gSpriteImage_UnusedCherry[i];
+ for (i = 0; i < 16; i++)
+ gSaveBlock1.enigmaBerry.palette[i] = gSpritePalette_UnusedCherry[i];
+ for (i = 0; i < 18; i++)
+ gSaveBlock1.enigmaBerry.itemEffect[i] = gUnknown_Debug_839B6CE[i];
+ gSaveBlock1.enigmaBerry.holdEffect = holdEffect;
+ gSaveBlock1.enigmaBerry.holdEffectParam = holdEffectParam;
+ gSaveBlock1.enigmaBerry.checksum = GetEnigmaBerryChecksum(&gSaveBlock1.enigmaBerry);
+}
+
+void debug_sub_80C2D24(u8 spicy, u8 dry, u8 sweet, u8 bitter, u8 sour, u8 smoothness)
+{
+ gSaveBlock1.enigmaBerry.berry.spicy = spicy;
+ gSaveBlock1.enigmaBerry.berry.dry = dry;
+ gSaveBlock1.enigmaBerry.berry.sweet = sweet;
+ gSaveBlock1.enigmaBerry.berry.bitter = bitter;
+ gSaveBlock1.enigmaBerry.berry.sour = sour;
+ gSaveBlock1.enigmaBerry.berry.smoothness = smoothness;
+ gSaveBlock1.enigmaBerry.checksum = GetEnigmaBerryChecksum(&gSaveBlock1.enigmaBerry);
+}
+
+#endif
+
// 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)
@@ -1074,9 +1141,9 @@ const struct Berry *GetBerryInfo(u8 berry)
return &gSaveBlock1.enigmaBerry.berry;
else
{
- // invalid berries will be flattened into a cheri berry. Interestingly, if your berry was
+ // 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
+ // 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);
@@ -1190,8 +1257,8 @@ void BerryTreeTimeUpdate(s32 minutesPassed)
if (tree->berry != BERRY_NONE && tree->stage != BERRY_STAGE_NO_BERRY && tree->growthSparkle == FALSE)
{
// 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
+ // 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)
{
@@ -1210,7 +1277,7 @@ void BerryTreeTimeUpdate(s32 minutesPassed)
// 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;
+ tree->minutesUntilNextStage -= time;
break;
}
// perform the subtraction the other way around to get the number of minutes since
@@ -1376,7 +1443,7 @@ void FieldObjectInteractionGetBerryTreeData(void)
// 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;
+ gSpecialVar_0x8004 = BERRY_STAGE_SPARKLING;
}
else
gSpecialVar_0x8004 = GetStageByBerryTreeId(id);
@@ -1417,6 +1484,57 @@ bool8 PlayerHasBerries(void)
return IsBagPocketNonEmpty(BAG_BERRIES);
}
+#if DEBUG
+void debug_sub_80C33FC(const u8 *buffer, s32 value, u8 n)
+{
+ StringAppend(gStringVar4, buffer);
+ ConvertIntToDecimalStringN(gStringVar1, value, STR_CONV_MODE_LEADING_ZEROS, n);
+ StringAppend(gStringVar4, gStringVar1);
+}
+
+static const u8 gUnknown_Debug_083F7F9D[] = _("POS:");
+static const u8 gUnknown_Debug_083F7FA2[] = _("\nTYPE:");
+static const u8 gUnknown_Debug_083F7FA9[] = _("\nGROW:");
+static const u8 gUnknown_Debug_083F7FB0[] = _("\nTIME:");
+static const u8 gUnknown_Debug_083F7FB7[] = _("\nFCNT:");
+static const u8 gUnknown_Debug_083F7FBE[] = _("\nSCNT:");
+static const u8 gUnknown_Debug_083F7FC5[] = _("\nHOOK:");
+static const u8 gUnknown_Debug_083F7FCC[] = _("\nWBIT:");
+static const u8 gUnknown_Debug_083F7FD3[] = _("");
+
+u8* DebugOpenBerryInfo(void)
+{
+ if (GetFieldObjectScriptPointerPlayerFacing() != S_BerryTree)
+ {
+ return NULL;
+ }
+ else
+ {
+ u32 berryTreeId = FieldObjectGetBerryTreeId(gSelectedMapObject);
+ struct BerryTree *berryTree = GetBerryTreeInfo(berryTreeId);
+ s32 i;
+
+ for (i = 0; i < 500; i++)
+ gStringVar4[i] = EOS;
+
+ debug_sub_80C33FC(gUnknown_Debug_083F7F9D, berryTreeId, 3);
+ debug_sub_80C33FC(gUnknown_Debug_083F7FA2, berryTree->berry, 2);
+ debug_sub_80C33FC(gUnknown_Debug_083F7FA9, berryTree->stage, 2);
+ debug_sub_80C33FC(gUnknown_Debug_083F7FB0, berryTree->minutesUntilNextStage, 5);
+ debug_sub_80C33FC(gUnknown_Debug_083F7FB7, berryTree->berryYield, 2);
+ debug_sub_80C33FC(gUnknown_Debug_083F7FBE, berryTree->regrowthCount, 3);
+ debug_sub_80C33FC(gUnknown_Debug_083F7FC5, berryTree->growthSparkle, 1);
+ debug_sub_80C33FC(gUnknown_Debug_083F7FCC, berryTree->watered1, 1);
+ debug_sub_80C33FC(gUnknown_Debug_083F7FD3, berryTree->watered2, 1);
+ debug_sub_80C33FC(gUnknown_Debug_083F7FD3, berryTree->watered3, 1);
+ debug_sub_80C33FC(gUnknown_Debug_083F7FD3, berryTree->watered4, 1);
+
+ return gStringVar4;
+ }
+}
+
+#endif
+
// whenever the player is not within view of the berry tree during its sparkle state, the
// sparkle state will be reset.
void ResetBerryTreeSparkleFlags(void)
diff --git a/src/scene/berry_blender.c b/src/berry_blender.c
index 7567899ae..bf634a49f 100644
--- a/src/scene/berry_blender.c
+++ b/src/berry_blender.c
@@ -201,7 +201,6 @@ u8 sub_80A7DEC(u8 berryId, u8 x, u8 y, bool8 animate);
void MenuCursor_SetPos814A880(u8 a1, u8 a2);
u8 MenuCursor_Create814A5C0(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5);
s8 GetFirstFreePokeblockSlot(void);
-bool8 sub_810CA34(struct Pokeblock *pokeblock);
#ifdef GERMAN
extern void de_sub_8073110();
#endif
@@ -274,7 +273,7 @@ static void sub_8051B18(void);
static void sub_805123C(void);
static void sub_8050954(void);
static bool8 Blender_PrintBlendingRanking(void);
-static bool8 Blender_PrintBlendingResults(void);
+bool8 Blender_PrintBlendingResults(void);
static void sub_80510E8(void);
static void sub_8050E30(void);
static void sub_805197C(u16 a0, u16 a1);
@@ -1163,7 +1162,7 @@ static void sub_804E9F8(void)
gBerryBlenderData->framesToWait = 0;
break;
case 9:
- if (sub_8007ECC())
+ if (IsLinkTaskFinished())
{
ResetBlockReceivedFlags();
if (GetMultiplayerId() == 0)
@@ -1215,7 +1214,7 @@ static void sub_804E9F8(void)
}
break;
case 13:
- if (sub_8007ECC())
+ if (IsLinkTaskFinished())
{
gBerryBlenderData->field_0++;
sub_8051414(&gBerryBlenderData->field_168);
@@ -1257,7 +1256,7 @@ static void sub_804E9F8(void)
gBerryBlenderData->field_0++;
break;
case 20:
- if (sub_8007ECC())
+ if (IsLinkTaskFinished())
{
sub_8007E24();
gBerryBlenderData->field_0++;
@@ -2015,36 +2014,32 @@ s16 unref_sub_8050514(void)
return gUnknown_0300052E;
}
-#ifdef NONMATCHING
-
static void Blender_CalculatePokeblock(struct BlenderBerry* berries, struct Pokeblock* pokeblock, u8 playersNo, u8* flavours, u16 maxRPM)
{
s32 i;
s32 j;
- s32 savedEntry;
s32 var3;
s32 var4;
- u32 var6;
- s32 var11;
- u16 rand;
+ s32 var6;
+ u8 r10;
for (i = 0; i < 6; i++)
gUnknown_03000510[i] = 0;
for (i = 0; i < playersNo; i++)
{
- for (j = 0; j < 5; j++)
+ for (j = 0; j < 6; j++)
gUnknown_03000510[j] += berries[i].flavours[j];
}
- savedEntry = gUnknown_03000510[0];
+ var6 = gUnknown_03000510[0];
gUnknown_03000510[0] -= gUnknown_03000510[1];
gUnknown_03000510[1] -= gUnknown_03000510[2];
gUnknown_03000510[2] -= gUnknown_03000510[3];
gUnknown_03000510[3] -= gUnknown_03000510[4];
- gUnknown_03000510[4] -= savedEntry;
+ gUnknown_03000510[4] -= var6;
var6 = 0;
- for (i = 0; i < 6; i++)
+ for (i = 0; i < 5; i++)
{
if (gUnknown_03000510[i] < 0)
{
@@ -2052,6 +2047,7 @@ static void Blender_CalculatePokeblock(struct BlenderBerry* berries, struct Poke
var6++;
}
}
+ r10 = var6;
for (i = 0; i < 5; i++)
{
if (gUnknown_03000510[i] > 0)
@@ -2067,13 +2063,13 @@ static void Blender_CalculatePokeblock(struct BlenderBerry* berries, struct Poke
gUnknown_03000530[i] = gUnknown_03000510[i];
}
- var11 = maxRPM / 333 + 100;
- gUnknown_0300055C = ((var11));
+ var6 = maxRPM / 333 + 100;
+ gUnknown_0300055C = var6;
for (i = 0; i < 5; i++)
{
var3 = gUnknown_03000510[i];
- var3 = ((var11) * var3) / 10;
+ var3 = (var3 * var6) / 10;
var4 = var3 % 10;
var3 /= 10;
if (var4 > 4)
@@ -2084,16 +2080,16 @@ static void Blender_CalculatePokeblock(struct BlenderBerry* berries, struct Poke
{
gUnknown_03000548[i] = gUnknown_03000510[i];
}
- pokeblock->color = Blender_GetPokeblockColor(berries, &gUnknown_03000510[0], playersNo, var6);
+ pokeblock->color = Blender_GetPokeblockColor(berries, &gUnknown_03000510[0], playersNo, r10);
gUnknown_03000510[5] = (gUnknown_03000510[5] / playersNo) - playersNo;
if (gUnknown_03000510[5] < 0)
gUnknown_03000510[5] = 0;
if (pokeblock->color == 12)
{
- rand = Random() % 10;
- for (i = 0; i < 6; i++)
+ var6 = Random() % 10;
+ for (i = 0; i < 5; i++)
{
- if ((gUnknown_082165DF[rand] >> i) & 1)
+ if ((gUnknown_082165DF[var6] >> i) & 1)
gUnknown_03000510[i] = 2;
else
gUnknown_03000510[i] = 0;
@@ -2116,302 +2112,12 @@ static void Blender_CalculatePokeblock(struct BlenderBerry* berries, struct Poke
}
}
-#else
-__attribute__((naked))
-static void Blender_CalculatePokeblock(struct BlenderBerry* berries, struct Pokeblock* pokeblock, u8 a2, u8* flavours, u16 a4)
-{
- 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\
- str r0, [sp]\n\
- mov r8, r1\n\
- str r3, [sp, 0x4]\n\
- ldr r0, [sp, 0x30]\n\
- lsls r2, 24\n\
- lsrs r2, 24\n\
- mov r9, r2\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- str r0, [sp, 0x8]\n\
- ldr r7, _080505DC @ =gUnknown_03000510\n\
- adds r2, r7, 0\n\
- movs r1, 0\n\
- adds r0, r7, 0\n\
- adds r0, 0xA\n\
-_0805054A:\n\
- strh r1, [r0]\n\
- subs r0, 0x2\n\
- cmp r0, r2\n\
- bge _0805054A\n\
- movs r6, 0\n\
- cmp r6, r9\n\
- bge _08050580\n\
- ldr r0, _080505DC @ =gUnknown_03000510\n\
- mov r12, r0\n\
- ldr r5, [sp]\n\
- adds r5, 0x9\n\
-_08050560:\n\
- movs r3, 0\n\
- adds r4, r5, 0\n\
- mov r2, r12\n\
-_08050566:\n\
- adds r1, r4, r3\n\
- ldrh r0, [r2]\n\
- ldrb r1, [r1]\n\
- adds r0, r1\n\
- strh r0, [r2]\n\
- adds r2, 0x2\n\
- adds r3, 0x1\n\
- cmp r3, 0x5\n\
- ble _08050566\n\
- adds r5, 0x10\n\
- adds r6, 0x1\n\
- cmp r6, r9\n\
- blt _08050560\n\
-_08050580:\n\
- movs r1, 0\n\
- ldrsh r3, [r7, r1]\n\
- ldrh r0, [r7]\n\
- ldrh r1, [r7, 0x2]\n\
- subs r0, r1\n\
- strh r0, [r7]\n\
- ldrh r0, [r7, 0x4]\n\
- subs r1, r0\n\
- strh r1, [r7, 0x2]\n\
- ldrh r1, [r7, 0x6]\n\
- subs r0, r1\n\
- strh r0, [r7, 0x4]\n\
- ldrh r0, [r7, 0x8]\n\
- subs r1, r0\n\
- strh r1, [r7, 0x6]\n\
- subs r0, r3\n\
- strh r0, [r7, 0x8]\n\
- movs r3, 0\n\
- movs r2, 0\n\
- adds r1, r7, 0\n\
- movs r6, 0x4\n\
-_080505AA:\n\
- movs r4, 0\n\
- ldrsh r0, [r1, r4]\n\
- cmp r0, 0\n\
- bge _080505B6\n\
- strh r2, [r1]\n\
- adds r3, 0x1\n\
-_080505B6:\n\
- adds r1, 0x2\n\
- subs r6, 0x1\n\
- cmp r6, 0\n\
- bge _080505AA\n\
- lsls r0, r3, 24\n\
- lsrs r0, 24\n\
- mov r10, r0\n\
- movs r4, 0\n\
- ldr r1, _080505DC @ =gUnknown_03000510\n\
- movs r6, 0x4\n\
-_080505CA:\n\
- ldrh r2, [r1]\n\
- movs r5, 0\n\
- ldrsh r0, [r1, r5]\n\
- cmp r0, 0\n\
- ble _080505E4\n\
- cmp r0, r3\n\
- bge _080505E0\n\
- strh r4, [r1]\n\
- b _080505E4\n\
- .align 2, 0\n\
-_080505DC: .4byte gUnknown_03000510\n\
-_080505E0:\n\
- subs r0, r2, r3\n\
- strh r0, [r1]\n\
-_080505E4:\n\
- adds r1, 0x2\n\
- subs r6, 0x1\n\
- cmp r6, 0\n\
- bge _080505CA\n\
- ldr r1, _080506C4 @ =gUnknown_03000510\n\
- ldr r2, _080506C8 @ =gUnknown_03000530\n\
- movs r6, 0x4\n\
-_080505F2:\n\
- movs r3, 0\n\
- ldrsh r0, [r1, r3]\n\
- stm r2!, {r0}\n\
- adds r1, 0x2\n\
- subs r6, 0x1\n\
- cmp r6, 0\n\
- bge _080505F2\n\
- ldr r1, _080506CC @ =0x0000014d\n\
- ldr r0, [sp, 0x8]\n\
- bl __udivsi3\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- adds r3, r0, 0\n\
- adds r3, 0x64\n\
- ldr r4, _080506D0 @ =gUnknown_0300055C\n\
- str r3, [r4]\n\
- movs r6, 0x4\n\
-_08050616:\n\
- movs r0, 0\n\
- ldrsh r5, [r7, r0]\n\
- adds r0, r5, 0\n\
- muls r0, r3\n\
- movs r1, 0xA\n\
- str r3, [sp, 0xC]\n\
- bl __divsi3\n\
- adds r5, r0, 0\n\
- movs r1, 0xA\n\
- bl __modsi3\n\
- adds r4, r0, 0\n\
- adds r0, r5, 0\n\
- movs r1, 0xA\n\
- bl __divsi3\n\
- adds r5, r0, 0\n\
- ldr r3, [sp, 0xC]\n\
- cmp r4, 0x4\n\
- ble _08050642\n\
- adds r5, 0x1\n\
-_08050642:\n\
- strh r5, [r7]\n\
- adds r7, 0x2\n\
- subs r6, 0x1\n\
- cmp r6, 0\n\
- bge _08050616\n\
- ldr r1, _080506C4 @ =gUnknown_03000510\n\
- ldr r2, _080506D4 @ =gUnknown_03000548\n\
- movs r6, 0x4\n\
-_08050652:\n\
- movs r3, 0\n\
- ldrsh r0, [r1, r3]\n\
- stm r2!, {r0}\n\
- adds r1, 0x2\n\
- subs r6, 0x1\n\
- cmp r6, 0\n\
- bge _08050652\n\
- ldr r4, _080506C4 @ =gUnknown_03000510\n\
- ldr r0, [sp]\n\
- adds r1, r4, 0\n\
- mov r2, r9\n\
- mov r3, r10\n\
- bl Blender_GetPokeblockColor\n\
- mov r5, r8\n\
- strb r0, [r5]\n\
- movs r1, 0xA\n\
- ldrsh r0, [r4, r1]\n\
- mov r1, r9\n\
- bl __divsi3\n\
- mov r3, r9\n\
- subs r0, r3\n\
- strh r0, [r4, 0xA]\n\
- lsls r0, 16\n\
- cmp r0, 0\n\
- bge _0805068C\n\
- movs r0, 0\n\
- strh r0, [r4, 0xA]\n\
-_0805068C:\n\
- mov r5, r8\n\
- ldrb r0, [r5]\n\
- cmp r0, 0xC\n\
- bne _080506E6\n\
- bl Random\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- movs r1, 0xA\n\
- bl __umodsi3\n\
- lsls r0, 16\n\
- lsrs r3, r0, 16\n\
- movs r6, 0\n\
- ldr r0, _080506D8 @ =gUnknown_082165DF\n\
- adds r0, r3, r0\n\
- ldrb r0, [r0]\n\
- adds r1, r4, 0\n\
- movs r4, 0x1\n\
- movs r3, 0x2\n\
-_080506B4:\n\
- adds r2, r0, 0\n\
- asrs r2, r6\n\
- ands r2, r4\n\
- cmp r2, 0\n\
- beq _080506DC\n\
- strh r3, [r1]\n\
- b _080506DE\n\
- .align 2, 0\n\
-_080506C4: .4byte gUnknown_03000510\n\
-_080506C8: .4byte gUnknown_03000530\n\
-_080506CC: .4byte 0x0000014d\n\
-_080506D0: .4byte gUnknown_0300055C\n\
-_080506D4: .4byte gUnknown_03000548\n\
-_080506D8: .4byte gUnknown_082165DF\n\
-_080506DC:\n\
- strh r2, [r1]\n\
-_080506DE:\n\
- adds r1, 0x2\n\
- adds r6, 0x1\n\
- cmp r6, 0x4\n\
- ble _080506B4\n\
-_080506E6:\n\
- ldr r7, _08050740 @ =gUnknown_03000510\n\
- movs r2, 0xFF\n\
- adds r1, r7, 0\n\
- movs r6, 0x5\n\
-_080506EE:\n\
- movs r3, 0\n\
- ldrsh r0, [r1, r3]\n\
- cmp r0, 0xFF\n\
- ble _080506F8\n\
- strh r2, [r1]\n\
-_080506F8:\n\
- adds r1, 0x2\n\
- subs r6, 0x1\n\
- cmp r6, 0\n\
- bge _080506EE\n\
- ldrh r0, [r7]\n\
- mov r4, r8\n\
- strb r0, [r4, 0x1]\n\
- ldrh r0, [r7, 0x2]\n\
- strb r0, [r4, 0x2]\n\
- ldrh r0, [r7, 0x4]\n\
- strb r0, [r4, 0x3]\n\
- ldrh r0, [r7, 0x6]\n\
- strb r0, [r4, 0x4]\n\
- ldrh r0, [r7, 0x8]\n\
- strb r0, [r4, 0x5]\n\
- ldrh r0, [r7, 0xA]\n\
- strb r0, [r4, 0x6]\n\
- movs r6, 0\n\
- adds r2, r7, 0\n\
-_0805071E:\n\
- ldr r5, [sp, 0x4]\n\
- adds r1, r5, r6\n\
- ldrh r0, [r2]\n\
- strb r0, [r1]\n\
- adds r2, 0x2\n\
- adds r6, 0x1\n\
- cmp r6, 0x5\n\
- ble _0805071E\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\
-_08050740: .4byte gUnknown_03000510\n\
- .syntax divided");
-}
-
-#endif // NONMATCHING
-
static void BlenderDebug_CalculatePokeblock(struct BlenderBerry* berries, struct Pokeblock* pokeblock, u8 playersNo, u8* flavours, u16 a4)
{
Blender_CalculatePokeblock(berries, pokeblock, playersNo, flavours, a4);
}
-static void sub_8050760(void)
+/*static*/ void sub_8050760(void)
{
u32 frames = (u16)(gBerryBlenderData->gameFrameTime);
u16 max_RPM = gBerryBlenderData->max_RPM;
@@ -2506,7 +2212,7 @@ static void sub_8050954(void)
case 3:
if (/*multiplayerID != 0*/ GetMultiplayerId() != 0)
gBerryBlenderData->field_6F++;
- else if (sub_8007ECC())
+ else if (IsLinkTaskFinished())
{
gBerryBlenderData->field_1BC = gBerryBlenderData->gameFrameTime;
gBerryBlenderData->field_1C0 = gBerryBlenderData->max_RPM;
@@ -2646,7 +2352,7 @@ bool8 sub_8050CE8(void)
gBerryBlenderData->framesToWait = 0;
break;
case 1:
- if (sub_8007ECC())
+ if (IsLinkTaskFinished())
{
gBerryBlenderData->field_1C4++;
gSoftResetDisabled = TRUE;
@@ -2665,7 +2371,7 @@ bool8 sub_8050CE8(void)
}
break;
case 4:
- if (sub_8007ECC())
+ if (IsLinkTaskFinished())
{
if (sub_8125E6C())
gBerryBlenderData->field_1C4 = 5;
@@ -2752,7 +2458,7 @@ static void sub_8050E30(void)
gBerryBlenderData->field_6F++;
break;
case 6:
- if (sub_8007ECC())
+ if (IsLinkTaskFinished())
{
gBerryBlenderData->framesToWait = 0;
gBerryBlenderData->field_6F++;
@@ -2771,7 +2477,7 @@ static void sub_8050E30(void)
sub_80084A4();
break;
case 9:
- if (sub_8007ECC())
+ if (IsLinkTaskFinished())
{
BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
gBerryBlenderData->field_6F++;
@@ -3270,13 +2976,13 @@ static void sub_8051C04(struct Sprite* sprite)
sprite->pos2.y = -(gBerryBlenderData->field_146);
}
-static void Blender_TrySettingRecord(void)
+/*static*/ void Blender_TrySettingRecord(void)
{
if (gSaveBlock1.berryBlenderRecords[gBerryBlenderData->playersNo - 2] < gBerryBlenderData->max_RPM)
gSaveBlock1.berryBlenderRecords[gBerryBlenderData->playersNo - 2] = gBerryBlenderData->max_RPM;
}
-static bool8 Blender_PrintBlendingResults(void)
+bool8 Blender_PrintBlendingResults(void)
{
u16 i;
@@ -3395,6 +3101,11 @@ static bool8 Blender_PrintBlendingResults(void)
Blender_CalculatePokeblock(gBerryBlenderData->blendedBerries, &pokeblock, gBerryBlenderData->playersNo, flavours, gBerryBlenderData->max_RPM);
Blender_PrintMadePokeblockString(&pokeblock, gBerryBlenderData->stringVar);
CreateTask(sub_8052BD0, 6);
+#if DEBUG
+ ConvertIntToHexStringN(text[0], sub_8007E40(), 0, 4);
+ StringAppend(text[0], gUnknown_08216249);
+ StringAppend(gBerryBlenderData->stringVar, text[0]);
+#endif
MenuPrintMessage(gBerryBlenderData->stringVar, 1, 15);
RemoveBagItem(gSpecialVar_ItemId, 1);
sub_810CA34(&pokeblock);
diff --git a/src/field/berry_tag_screen.c b/src/berry_tag_screen.c
index bb937ea43..9fbfd0681 100644
--- a/src/field/berry_tag_screen.c
+++ b/src/berry_tag_screen.c
@@ -2,7 +2,7 @@
#include "berry_tag_screen.h"
#include "berry.h"
#include "decompress.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "item_menu.h"
#include "constants/items.h"
#include "item_use.h"
@@ -42,7 +42,7 @@ extern u8 gBerryCheck_Pal[];
extern u8 gUnknown_08E788E4[];
extern u8 gUnknown_08E78A84[];
-static const u8 *const gUnknown_0841192C[] =
+const u8 *const gUnknown_0841192C[] =
{
ContestStatsText_VerySoft,
ContestStatsText_Soft,
diff --git a/src/field/bike.c b/src/bike.c
index 8db01b4b4..28439e6bb 100644
--- a/src/field/bike.c
+++ b/src/bike.c
@@ -1,6 +1,6 @@
#include "global.h"
#include "bike.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "field_player_avatar.h"
#include "fieldmap.h"
#include "constants/flags.h"
@@ -14,6 +14,11 @@ extern bool8 gBikeCyclingChallenge;
extern u8 gBikeCollisions;
extern u8 gUnusedBikeCameraAheadPanback;
+#if DEBUG
+extern u8 gUnknown_020297ED;
+u8 debug_sub_805F2B0(u8);
+#endif
+
static void MovePlayerOnMachBike(u8, u16, u16);
static u8 GetMachBikeTransition(u8 *);
static void MachBikeTransition_FaceDirection(u8);
@@ -134,6 +139,13 @@ void MovePlayerOnBike(u8 direction, u16 newKeys, u16 heldKeys)
static void MovePlayerOnMachBike(u8 direction, u16 newKeys, u16 heldKeys)
{
+#if DEBUG
+ if (gUnknown_020297ED && debug_sub_805F2B0(direction))
+ {
+ Bike_SetBikeStill();
+ return;
+ }
+#endif
sMachBikeTransitions[GetMachBikeTransition(&direction)](direction);
}
@@ -271,6 +283,14 @@ static void MachBikeTransition_TrySlowDown(u8 var)
// the acro bike requires the input handler to be executed before the transition can.
static void MovePlayerOnAcroBike(u8 newDirection, u16 newKeys, u16 heldKeys)
{
+#if DEBUG
+ if (gUnknown_020297ED && debug_sub_805F2B0(newDirection))
+ {
+ Bike_SetBikeStill();
+ return;
+ }
+#endif
+
sAcroBikeTransitions[CheckMovementInputAcroBike(&newDirection, newKeys, heldKeys)](newDirection);
}
diff --git a/src/field/birch_pc.c b/src/birch_pc.c
index 4b0025504..4b0025504 100644
--- a/src/field/birch_pc.c
+++ b/src/birch_pc.c
diff --git a/src/engine/blend_palette.c b/src/blend_palette.c
index 843c50ac1..843c50ac1 100644
--- a/src/engine/blend_palette.c
+++ b/src/blend_palette.c
diff --git a/src/field/braille_puzzles.c b/src/braille_puzzles.c
index f11fb5fb3..f11fb5fb3 100644
--- a/src/field/braille_puzzles.c
+++ b/src/braille_puzzles.c
diff --git a/src/scene/cable_car.c b/src/cable_car.c
index d8e099130..8c3f9885d 100644
--- a/src/scene/cable_car.c
+++ b/src/cable_car.c
@@ -6,6 +6,7 @@
#include "palette.h"
#include "random.h"
#include "main.h"
+#include "menu.h"
#include "script.h"
#include "task.h"
#include "sound.h"
@@ -13,24 +14,19 @@
#include "constants/songs.h"
#include "decompress.h"
#include "field_weather.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "scanline_effect.h"
#include "event_data.h"
#include "cable_car_util.h"
#include "constants/map_objects.h"
+#include "constants/weather.h"
-// Static type declarations
+extern u8 (*gMenuCallback)(void);
-// Credits to Made (dolphin emoji)
-#define S16TOPOSFLOAT(val) \
-({ \
- s16 v = (val); \
- float f = (float)v; \
- if(v < 0) f += 65536.0f; \
- f; \
-})
+// Static type declarations
-struct CableCarEwramStruct1 {
+struct CableCarEwramStruct1
+{
u8 unk_0000;
u8 unk_0001;
u8 unk_0002;
@@ -62,7 +58,8 @@ struct CableCarEwramStruct1 {
u16 unk_08fc[0x20][0x20];
}; // size 0x10FC
-struct CableCarEwramStruct2 {
+struct CableCarEwramStruct2
+{
/* 0x000 */ u16 mtChimneyTilemap[0xb4];
/* 0x168 */ u16 treeTilemap[0x1e0];
/* 0x528 */ u16 mountainTilemap[0x258];
@@ -102,6 +99,31 @@ static void sub_81248AC(u8);
// .rodata
+#if DEBUG
+
+void debug_sub_8138D74(void);
+void debug_sub_8138D8C(void);
+u8 debug_sub_8138C14(void);
+u8 debug_sub_8138C34(void);
+u8 debug_sub_810CD9C(void);
+
+const u8 Str_842DBD0[] = _("CABLE CAR U");
+const u8 Str_842DBDC[] = _("CABLE CAR D");
+const u8 Str_842DBE8[] = _("ROULETTE1");
+const u8 Str_842DBF2[] = _("ROULETTE3");
+const u8 Str_842DBFC[] = _("View a MAIL");
+
+const struct MenuAction gUnkDebug4Menu[] =
+{
+ {Str_842DBD0, (u8 (*)(void))debug_sub_8138D74}, // why do these two functions have a different prototype?
+ {Str_842DBDC, (u8 (*)(void))debug_sub_8138D8C},
+ {Str_842DBE8, debug_sub_8138C14},
+ {Str_842DBF2, debug_sub_8138C34},
+ {Str_842DBFC, debug_sub_810CD9C},
+};
+
+#endif
+
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");
@@ -152,35 +174,93 @@ static const struct OamData gOamData_8401D38 = {
.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
+static const struct SpriteTemplate gSpriteTemplate_8401D40[] =
+{
+ {
+ .tileTag = 1,
+ .paletteTag = 1,
+ .oam = &gOamData_8401D28,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_8123CB8,
+ },
+ {
+ .tileTag = 2,
+ .paletteTag = 1,
+ .oam = &gOamData_8401D30,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_8123CB8,
+ },
+ {
+ .tileTag = 3,
+ .paletteTag = 1,
+ .oam = &gOamData_8401D38,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = nullsub_76,
}
};
-// .text
+#if DEBUG
+
+extern u8 unk_203955C;
+
+extern const u8 MauvilleCity_GameCorner_EventScript_1C407E[];
+extern const u8 MauvilleCity_GameCorner_EventScript_1C40AC[];
+
+u8 debug_sub_8138C14(void)
+{
+ unk_203955C = 1;
+ ScriptContext1_SetupScript(MauvilleCity_GameCorner_EventScript_1C407E);
+ CloseMenu();
+ return 1;
+}
+
+u8 debug_sub_8138C34(void)
+{
+ unk_203955C = 1;
+ ScriptContext1_SetupScript(MauvilleCity_GameCorner_EventScript_1C40AC);
+ CloseMenu();
+ return 1;
+}
+
+u8 debug_sub_8138C54(void)
+{
+ if (gMain.newKeys == DPAD_UP)
+ Menu_MoveCursor(-1);
+ if (gMain.newKeys == DPAD_DOWN)
+ Menu_MoveCursor(1);
+ if (gMain.newKeys == A_BUTTON)
+ return gUnkDebug4Menu[Menu_GetCursorPos()].func();
+ if (gMain.newKeys == (R_BUTTON | A_BUTTON))
+ {
+ gSpecialVar_0x8004 = 1;
+ return gUnkDebug4Menu[Menu_GetCursorPos()].func();
+ }
+ if (gMain.newKeys == B_BUTTON)
+ {
+ CloseMenu();
+ return 1;
+ }
+ return 0;
+}
+
+u8 debug_sub_8138CC4(void)
+{
+ gSpecialVar_0x8004 = 0;
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(19, 0, 29, 12);
+ Menu_PrintItems(20, 1, 5, gUnkDebug4Menu);
+ InitMenu(0, 20, 1, 5, 0, 8);
+ gMenuCallback = debug_sub_8138C54;
+ return 0;
+}
+
+#endif
static void CableCarTask1(u8 taskId)
{
@@ -198,6 +278,24 @@ void CableCar(void)
BeginNormalPaletteFade(-1, 0, 0, 16, 0);
}
+#if DEBUG
+
+void debug_sub_8138D74(void)
+{
+ gSpecialVar_0x8004 = 0;
+ CloseMenu();
+ CableCar();
+}
+
+void debug_sub_8138D8C(void)
+{
+ gSpecialVar_0x8004 = 1;
+ CloseMenu();
+ CableCar();
+}
+
+#endif
+
static void CableCarMainCallback_Setup(void)
{
u8 i;
@@ -328,7 +426,7 @@ static void sub_8123740(void)
i = 0;
sub_8123FBC(0);
gSpriteCoordOffsetX = 0;
- sub_807C9B4(0);
+ sub_807C9B4(WEATHER_NONE);
for (; i < 20; i++)
{
gWeatherPtr->sprites.s2.ashSprites[i] = NULL;
@@ -357,7 +455,7 @@ static void sub_8123878(u8 taskId)
case 0:
if (sCableCarPtr->unk_0006 == sCableCarPtr->unk_0004)
{
- DoWeatherEffect(sCableCarPtr->unk_0002);
+ ChangeWeather(sCableCarPtr->unk_0002);
sCableCarPtr->unk_0001 = 1;
}
break;
@@ -769,7 +867,7 @@ static void LoadSprites(void)
gSprites[spriteId].data[1] = 0x63;
sCableCarPtr->unk_0002 = 7;
sCableCarPtr->unk_0004 = 0x15e;
- sub_807C9B4(2);
+ sub_807C9B4(WEATHER_SUNNY);
break;
case 1:
CableCarUtil_CopyWrapped(sCableCarPtr->unk_00fc, eCableCar2->mtChimneyTilemap + 0x24, 0x18, 0x1a, 0x0c, 0x03);
@@ -793,7 +891,7 @@ static void LoadSprites(void)
gSprites[spriteId].data[1] = 0x41;
sCableCarPtr->unk_0002 = 2;
sCableCarPtr->unk_0004 = 0x109;
- sub_807C9B4(7);
+ sub_807C9B4(WEATHER_ASH);
break;
}
for (i = 0; i < 9; i++)
diff --git a/src/engine/cable_car_util.c b/src/cable_car_util.c
index 02bfbc195..02bfbc195 100644
--- a/src/engine/cable_car_util.c
+++ b/src/cable_car_util.c
diff --git a/src/engine/cable_club.c b/src/cable_club.c
index 44d832e2b..0da23c5f3 100644
--- a/src/engine/cable_club.c
+++ b/src/cable_club.c
@@ -2,7 +2,9 @@
#include "battle.h"
#include "battle_records.h"
#include "cable_club.h"
+#include "event_data.h"
#include "field_message_box.h"
+#include "field_specials.h"
#include "field_weather.h"
#include "link.h"
#include "load_save.h"
@@ -21,15 +23,9 @@
#include "strings2.h"
#include "task.h"
#include "text.h"
+#include "trade.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[];
@@ -47,6 +43,7 @@ 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_80831F8(u8 taskId);
static void sub_8083288(u8 taskId);
static void sub_8083314(u8 taskId);
static void sub_80833C4(u8 taskId);
@@ -65,15 +62,9 @@ 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);
+#if DEBUG
+static u8 debug_sub_808B850(void);
+#endif
#ifdef GERMAN
const u8 TrainerCardColorName_Bronze[] = _("BRONZE");
@@ -95,14 +86,85 @@ const u8 *const gTrainerCardColorNames[] =
TrainerCardColorName_Gold,
};
+#if DEBUG
+u8 debug_sub_808A4D0(TaskFunc func)
+{
+ if (func == sub_8082F68)
+ return 1;
+ if (func == sub_8082FEC)
+ return 17;
+ if (func == sub_808303C)
+ return 18;
+ if (func == sub_8083188)
+ return 19;
+ if (func == sub_80830E4)
+ return 20;
+ if (func == sub_80831F8)
+ return 33;
+ if (func == sub_8083314)
+ return 2;
+ if (func == sub_80833C4)
+ return 3;
+ return 0;
+}
+
+void debug_sub_808A55C(u8 taskId)
+{
+ s32 i;
+
+ if (!gTasks[gTasks[taskId].data[0]].isActive)
+ {
+ if (gTasks[taskId].data[1] == 5)
+ DestroyTask(taskId);
+ gTasks[taskId].data[1]++;
+ }
+
+ PrintHex(gShouldAdvanceLinkState, 2, 0, 2);
+ PrintHex((u8)gBlockSendBuffer[0], 22, 5, 4);
+ for (i = 0; i < 4; i++)
+ {
+ PrintHex(gLinkPlayerPending[i], 5 + i * 2, 0, 1);
+ PrintHex(gBlockRecvBuffer[i][0], 22, 6 + i, 4);
+ }
+ PrintHex(gLinkStatus, 15, 0, 8);
+ PrintHex(gLink.state, 2, 10, 2);
+ PrintHex(GetMultiplayerId(), 7, 12, 2);
+ PrintHex(GetBlockReceivedStatus(), 7, 10, 2);
+ PrintHex(gReceivedRemoteLinkPlayers, 2, 12, 1);
+ PrintHex(gSpecialVar_Result, 11, 8, 2);
+ PrintHex((gLinkStatus & 0x1C) >> 2, 11, 10, 2);
+ PrintHex(IsLinkConnectionEstablished(), 11, 12, 1);
+ PrintHex(IsLinkTaskFinished(), 15, 10, 1);
+ PrintHex(debug_sub_808A4D0(gTasks[gTasks[taskId].data[0]].func), 15, 12, 2);
+ PrintHex((uintptr_t)gLinkCallback, 2, 13, 8);
+ PrintHex(HasLinkErrorOccurred(), 2, 2, 1);
+ for (i = 0; i < 4; i++)
+ PrintHex(gLinkPlayers[i].linkType, 2 + i * 6, 3, 4);
+ PrintHex(REG_SIOCNT, 2, 6, 4);
+ PrintHex(debug_sub_808B850(), 25, 3, 1);
+}
+#endif
+
static void sub_8082CD4(u8 arg0, u8 arg1)
{
+#if DEBUG
+ InitLinkTestBG_Unused(12, 0, 31, 2);
+#endif
if (FindTaskIdByFunc(sub_8082F20) == 0xFF)
{
- u8 taskId = CreateTask(sub_8082F20, 80);
+ u8 taskId1;
+#if DEBUG
+ u8 taskId2;
+#endif
- gTasks[taskId].data[1] = arg0;
- gTasks[taskId].data[2] = arg1;
+ taskId1 = CreateTask(sub_8082F20, 80);
+ gTasks[taskId1].data[1] = arg0;
+ gTasks[taskId1].data[2] = arg1;
+
+#if DEBUG
+ taskId2 = CreateTask(debug_sub_808A55C, 80);
+ gTasks[taskId2].data[0] = taskId1;
+#endif
}
}
@@ -349,7 +411,7 @@ static void sub_8083188(u8 taskId)
}
}
-void sub_80831F8(u8 taskId)
+static void sub_80831F8(u8 taskId)
{
u8 local1, local2;
@@ -360,6 +422,10 @@ void sub_80831F8(u8 taskId)
|| sub_8082DF4(taskId) == TRUE)
return;
+#if DEBUG
+ sub_8082D60(taskId, GetLinkPlayerCount_2());
+#endif
+
gSpecialVar_Result = sub_8082D9C(local1, local2);
if (gSpecialVar_Result == 0)
return;
@@ -676,7 +742,7 @@ static void sub_808382C(u8 taskId)
switch (task->data[0])
{
case 0:
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gLinkType = 0x2211;
ClearLinkCallback_2();
task->data[0]++;
@@ -812,7 +878,7 @@ static void sub_8083AAC(u8 taskId)
{
case 0:
ScriptContext2_Enable();
- fade_screen(1, 0);
+ FadeScreen(1, 0);
ClearLinkCallback_2();
task->data[0]++;
break;
@@ -908,6 +974,30 @@ void sub_8083C50(u8 taskId)
DestroyTask(taskId);
}
+#if DEBUG
+extern u16 unk_3004E94;
+extern u32 unk_3004E98;
+
+static void debug_sub_808B7A8(u8);
+
+void debug_sub_808B778(void)
+{
+ if (!FuncIsActiveTask(debug_sub_808B7A8))
+ CreateTask(debug_sub_808B7A8, 80);
+ unk_3004E98++;
+}
+
+static void debug_sub_808B7A8(u8 taskId)
+{
+ gTasks[taskId].data[0]++;
+ if (gTasks[taskId].data[0] == 30)
+ {
+ gTasks[taskId].data[0] = 0;
+ unk_3004E94 |= 1;
+ }
+}
+#endif
+
static void sub_8083CA4(u8 taskId)
{
if (!gReceivedRemoteLinkPlayers)
@@ -921,4 +1011,23 @@ void unref_sub_8083CC8(u8 taskId)
{
sub_800832C();
gTasks[taskId].func = sub_8083CA4;
-} \ No newline at end of file
+}
+
+#if DEBUG
+EWRAM_DATA static u8 unk_2030220 = 0;
+
+void debug_sub_808B82C(void)
+{
+ unk_2030220 = 0;
+}
+
+void debug_sub_808B838(u8 a)
+{
+ unk_2030220 |= 1 << a;
+}
+
+static u8 debug_sub_808B850(void)
+{
+ return unk_2030220;
+}
+#endif
diff --git a/src/field/choose_party.c b/src/choose_party.c
index 3ba04e489..4766b2fbb 100644
--- a/src/field/choose_party.c
+++ b/src/choose_party.c
@@ -1,5 +1,5 @@
#include "global.h"
-#include "decoration.h"
+#include "event_data.h"
#include "field_fadetransition.h"
#include "main.h"
#include "menu.h"
@@ -7,6 +7,7 @@
#include "palette.h"
#include "party_menu.h"
#include "pokemon_menu.h"
+#include "field_weather.h"
#include "pokemon.h"
#include "pokemon_summary_screen.h"
#include "overworld.h"
@@ -22,7 +23,7 @@
extern u8 gPlayerPartyCount;
extern u8 gLastFieldPokeMenuOpened;
extern u8 gUnknown_020384F0;
-extern struct UnknownPokemonStruct2 gUnknown_02023A00[];
+extern struct UnknownPokemonStruct2 gUnknown_02023A00[3];
extern u8 gUnknown_0202E8F6;
extern struct Pokemon gUnknown_030042FC[];
extern const u16 gBattleTowerBannedSpecies[];
@@ -527,6 +528,34 @@ static void BattleTowerEntryMenuCallback_Exit(u8 taskId)
sub_81227FC(taskId);
}
+#if DEBUG
+
+void debug_sub_81381B4(void)
+{
+ u8 i;
+
+ memset(gUnknown_02023A00, 0, sizeof(gUnknown_02023A00));
+ for (i = 0; i < 3; i++)
+ {
+ gUnknown_02023A00[i].species = GetMonData(&gPlayerParty[3 + i], MON_DATA_SPECIES2);
+ if (gUnknown_02023A00[i].species != 0)
+ {
+ gUnknown_02023A00[i].level = GetMonData(&gPlayerParty[3 + i], MON_DATA_LEVEL);
+ gUnknown_02023A00[i].hp = GetMonData(&gPlayerParty[3 + i], MON_DATA_HP);
+ gUnknown_02023A00[i].maxhp = GetMonData(&gPlayerParty[3 + i], MON_DATA_MAX_HP);
+ gUnknown_02023A00[i].status = GetMonData(&gPlayerParty[3 + i], MON_DATA_STATUS);
+ gUnknown_02023A00[i].heldItem = GetMonData(&gPlayerParty[3 + i], MON_DATA_HELD_ITEM);
+ gUnknown_02023A00[i].personality = GetMonData(&gPlayerParty[3 + i], MON_DATA_PERSONALITY);
+ gUnknown_02023A00[i].gender = GetMonGender(&gPlayerParty[3 + i]);
+ GetMonData(&gPlayerParty[3 + i], MON_DATA_NICKNAME, gUnknown_02023A00[i].nickname);
+ Text_StripExtCtrlCodes(gUnknown_02023A00[i].nickname);
+ gUnknown_02023A00[i].language = GetMonData(&gPlayerParty[3 + i], MON_DATA_LANGUAGE);
+ }
+ }
+}
+
+#endif
+
bool8 SetupLinkMultiBattlePartyMenu(void)
{
switch (ewram1B000_alt.setupState)
@@ -930,7 +959,7 @@ void sub_81231AC(void)
static void sub_81231C4(u8 taskId)
{
- if (sub_807D770() == TRUE)
+ if (IsWeatherNotFadingIn() == TRUE)
{
DestroyTask(taskId);
ScriptContext2_Disable();
diff --git a/src/engine/clear_save_data_menu.c b/src/clear_save_data_menu.c
index b6053715a..b6053715a 100644
--- a/src/engine/clear_save_data_menu.c
+++ b/src/clear_save_data_menu.c
diff --git a/src/engine/clock.c b/src/clock.c
index 416aaa6bb..fceccdfcb 100644
--- a/src/engine/clock.c
+++ b/src/clock.c
@@ -13,12 +13,11 @@
#include "tv.h"
#include "wallclock.h"
-static void InitTimeBasedEvents(void);
static void UpdatePerDay(struct Time *time);
static void UpdatePerMinute(struct Time *time);
static void ReturnFromStartWallClock(void);
-static void InitTimeBasedEvents(void)
+void InitTimeBasedEvents(void)
{
FlagSet(FLAG_SYS_CLOCK_SET);
RtcCalcLocalTime();
diff --git a/src/field/coins.c b/src/coins.c
index 2c217e635..2c217e635 100644
--- a/src/field/coins.c
+++ b/src/coins.c
diff --git a/src/contest.c b/src/contest.c
index 93d1a8efc..84e5d807b 100644
--- a/src/contest.c
+++ b/src/contest.c
@@ -33,6 +33,8 @@
#include "util.h"
#include "contest_ai.h"
+extern u8 gUnknown_020297ED;
+
extern u8 AreMovesContestCombo(u16, u16); // I don't think this is a bool
extern void sub_80C8A38(u8);
extern void sub_80C8AD0(u8);
@@ -45,7 +47,7 @@ extern u16 gBattleTypeFlags;
extern u8 gBankAttacker;
extern u8 gBankTarget;
extern u8 gBanksBySide[];
-extern u8 gObjectBankIDs[];
+extern u8 gBankSpriteIds[];
extern u16 gBattle_BG3_X;
extern s16 gBattle_BG1_Y;
extern u16 gBattle_BG3_Y;
@@ -59,7 +61,7 @@ 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 u32 gContestRngValue; // saved RNG value
extern struct SpriteTemplate gUnknown_02024E8C;
@@ -238,6 +240,7 @@ void sub_80B0BC4(u8, bool8);
void sub_80B0C5C(struct Sprite *);
void sub_80B0CB0(struct Sprite *);
void sub_80B0CDC(u8, int);
+void unref_sub_80B0CF4(void);
void sub_80B0D7C(void);
void sub_80B1118(void);
void sub_80B114C(u8);
@@ -495,7 +498,7 @@ void sub_80AB6B4(u8 taskId)
GetMultiplayerId(); // unused return value
DestroyTask(taskId);
gTasks[sContest.mainTaskId].func = sub_80AB960;
- gRngValue = gUnknown_03005D28;
+ gRngValue = gContestRngValue;
}
}
@@ -550,7 +553,7 @@ u8 sub_80AB70C(u8 *a)
gBattleTypeFlags = 0;
gBankAttacker = 2;
gBankTarget = 3;
- gObjectBankIDs[gBankAttacker] = CreateJudgeSprite();
+ gBankSpriteIds[gBankAttacker] = CreateJudgeSprite();
sub_80B292C();
break;
default:
@@ -613,6 +616,10 @@ void sub_80AB9A0(u8 taskId)
void ContestMainCallback2(void)
{
+#if DEBUG
+ if (gUnknown_020297ED == 1 && gMain.newKeys == 4)
+ unref_sub_80B0CF4();
+#endif
AnimateSprites();
RunTasks();
BuildOamBuffer();
@@ -732,6 +739,8 @@ void sub_80ABCDC(u8 taskId)
gTasks[taskId].func = sub_80ABEA0;
}
+void debug_sub_80B9EBC(u8);
+
// Handle move selection input
void sub_80ABEA0(u8 taskId)
{
@@ -804,10 +813,193 @@ void sub_80ABEA0(u8 taskId)
if (numMoves > 1)
PlaySE(SE_SELECT);
break;
+#if DEBUG
+ case START_BUTTON:
+ if (gUnknown_020297ED == 1 && !(gIsLinkContest & 1))
+ {
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = gContestMons[gContestPlayerMonIndex].moves[0];
+ gTasks[taskId].func = debug_sub_80B9EBC;
+ }
+ break;
+#endif
}
}
}
+#if DEBUG
+
+void debug_sub_80BA054(u8);
+
+void debug_sub_80B9EBC(u8 taskId)
+{
+ u8 text[100];
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ Text_FillWindowRectDefPalette(
+ &gUnknown_03004210,
+ 0,
+ gUnknown_083CA340[0][0],
+ gUnknown_083CA340[0][1],
+ gUnknown_083CA340[0][2],
+ gUnknown_083CA340[0][3]);
+ Text_InitWindowAndPrintText(
+ &gUnknown_03004210,
+ gMoveNames[gTasks[taskId].data[1]],
+ 776,
+ gUnknown_083CA340[0][0],
+ gUnknown_083CA340[0][1]);
+ ConvertIntToDecimalStringN(text, gTasks[taskId].data[1], 2, 3);
+ Text_InitWindowAndPrintText(
+ &gUnknown_03004210,
+ text,
+ 796,
+ gUnknown_083CA340[1][0],
+ gUnknown_083CA340[1][1]);
+ sub_80AED58();
+ sub_80AEBEC(gTasks[taskId].data[1]);
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ switch (gMain.newAndRepeatedKeys)
+ {
+ case 0x20:
+ gTasks[taskId].data[1] -= 1;
+ if (gTasks[taskId].data[1] < 1)
+ gTasks[taskId].data[1] = 354;
+ gTasks[taskId].data[0]--;
+ break;
+ case 0x200:
+ gTasks[taskId].data[1] -= 10;
+ if (gTasks[taskId].data[1] < 1)
+ gTasks[taskId].data[1] = 354;
+ gTasks[taskId].data[0]--;
+ break;
+ case 0x10:
+ gTasks[taskId].data[1] += 1;
+ if (gTasks[taskId].data[1] > 354)
+ gTasks[taskId].data[1] = 1;
+ gTasks[taskId].data[0]--;
+ break;
+ case 0x100:
+ gTasks[taskId].data[1] += 10;
+ if (gTasks[taskId].data[1] > 354)
+ gTasks[taskId].data[1] = 1;
+ gTasks[taskId].data[0]--;
+ break;
+ case 4:
+ case 8:
+ gBattle_BG0_Y = 0;
+ gBattle_BG2_Y = 0;
+ sub_80B1BDC();
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = debug_sub_80BA054;
+ break;
+ case 2:
+ gBattle_BG0_Y = DISPLAY_HEIGHT;
+ gBattle_BG2_Y = DISPLAY_HEIGHT;
+ gContestMons[gContestPlayerMonIndex].moves[0] = gTasks[taskId].data[1];
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].data[3] = 0;
+ gTasks[taskId].func = sub_80ABCDC;
+ break;
+ }
+ break;
+ }
+}
+
+void debug_sub_80BA054(u8 taskId)
+{
+ s32 i;
+ u8 r6;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ for (i = 0; i < 4; i++)
+ gBattleMonForms[i] = 0;
+ memset(&shared19348, 0, sizeof(shared19348));
+ sub_80B28F0(gContestPlayerMonIndex);
+ r6 = sub_80AE9FC(
+ gContestMons[gContestPlayerMonIndex].species,
+ gContestMons[gContestPlayerMonIndex].otId,
+ gContestMons[gContestPlayerMonIndex].personality);
+ gSprites[r6].pos2.x = 120;
+ gSprites[r6].callback = sub_80AD8FC;
+ gTasks[taskId].data[2] = r6;
+ gBankSpriteIds[gBankAttacker] = r6;
+ gTasks[taskId].data[3] = 0;
+ gTasks[taskId].data[0]++;
+ sContest.unk1925E = 0;
+ break;
+ case 1:
+ r6 = gTasks[taskId].data[2];
+ if (gSprites[r6].callback == SpriteCallbackDummy)
+ {
+ sContestantStatus[gContestPlayerMonIndex].currMove = gTasks[taskId].data[1];
+ sub_80B2790(gContestPlayerMonIndex);
+ sub_80B28F0(gContestPlayerMonIndex);
+ SelectContestMoveBankTarget(gTasks[taskId].data[1]);
+ DoMoveAnim(gTasks[taskId].data[1]);
+ gTasks[taskId].data[3] = 0;
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 2:
+ gAnimScriptCallback();
+ if (!gAnimScriptActive)
+ {
+ sub_80B28CC(gContestPlayerMonIndex);
+ if (sContest.unk1925E != 0)
+ {
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[0] = 20;
+ }
+ else
+ {
+ gTasks[taskId].data[0]++;
+ }
+ }
+ break;
+ case 3:
+ gTasks[taskId].data[3]++;
+ if (gTasks[taskId].data[3] == 21)
+ {
+ r6 = gTasks[taskId].data[2];
+ gSprites[r6].callback = sub_80AD92C;
+ sub_80B1B14();
+ gTasks[taskId].data[3] = 0;
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 4:
+ r6 = gTasks[taskId].data[2];
+ if (gSprites[r6].invisible)
+ {
+ FreeSpriteOamMatrix(&gSprites[r6]);
+ DestroySprite(&gSprites[r6]);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = debug_sub_80B9EBC;
+ gBattle_BG0_Y = DISPLAY_HEIGHT;
+ gBattle_BG2_Y = DISPLAY_HEIGHT;
+ }
+ break;
+ case 20:
+ if (gTasks[taskId].data[10]++ > 30)
+ {
+ gTasks[taskId].data[10] = 0;
+ gTasks[taskId].data[0] = 1;
+ }
+ break;
+ }
+}
+
+#endif
+
void sub_80AC0AC(s8 a)
{
MenuCursor_SetPos814A880(4, 88 + a * 16);
@@ -951,7 +1143,7 @@ void sub_80AC2CC(u8 taskId)
gSprites[spriteId].pos2.x = 120;
gSprites[spriteId].callback = sub_80AD8FC;
gTasks[taskId].data[2] = spriteId;
- gObjectBankIDs[gBankAttacker] = spriteId;
+ gBankSpriteIds[gBankAttacker] = spriteId;
sub_80B0BC4(sub_80B09E4(sContest.unk19215), FALSE);
gTasks[taskId].data[0] = 4;
return;
@@ -1812,7 +2004,7 @@ void sub_80ADDA4(u8 taskId)
sub_80AF668();
sub_80AF138();
sub_80BE23C(sContestantStatus[gContestPlayerMonIndex].prevMove);
- gUnknown_03005D28 = gRngValue;
+ gContestRngValue = gRngValue;
StringExpandPlaceholders(gStringVar4, gUnknown_083CB02C);
Text_InitWindow8002EB0(&gMenuWindow, gStringVar4, 776, 1, 15);
gTasks[taskId].data[2] = 0;
@@ -1955,7 +2147,7 @@ void Contest_CreatePlayerMon(u8 partyIndex)
else
gContestMons[gContestPlayerMonIndex].trainerGfxId = MAP_OBJ_GFX_LINK_MAY;
gContestMons[gContestPlayerMonIndex].flags = 0;
- gContestMons[gContestPlayerMonIndex].unk2C = 0;
+ gContestMons[gContestPlayerMonIndex].unk2C[0] = 0;
gContestMons[gContestPlayerMonIndex].species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES);
GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, name);
StringGetEnd10(name);
@@ -2022,7 +2214,7 @@ void Contest_CreatePlayerMon(u8 partyIndex)
gContestMons[gContestPlayerMonIndex].tough = tough;
}
-void Contest_InitAllPokemon(u8 a, u8 b)
+void Contest_InitAllPokemon(u8 contestType, u8 rank)
{
s32 i;
u8 opponentsCount = 0;
@@ -2033,17 +2225,17 @@ void Contest_InitAllPokemon(u8 a, u8 b)
// Find all suitable opponents
for (i = 0; i < 60; i++)
{
- if (b == gContestOpponents[i].unk1C_0)
+ if (rank == gContestOpponents[i].whichRank)
{
- if (a == 0 && gContestOpponents[i].unk1C_2)
+ if (contestType == 0 && gContestOpponents[i].aiPool_Cool)
opponents[opponentsCount++] = i;
- else if (a == 1 && gContestOpponents[i].unk1C_3)
+ else if (contestType == 1 && gContestOpponents[i].aiPool_Beauty)
opponents[opponentsCount++] = i;
- else if (a == 2 && gContestOpponents[i].unk1C_4)
+ else if (contestType == 2 && gContestOpponents[i].aiPool_Cute)
opponents[opponentsCount++] = i;
- else if (a == 3 && gContestOpponents[i].unk1C_5)
+ else if (contestType == 3 && gContestOpponents[i].aiPool_Smart)
opponents[opponentsCount++] = i;
- else if (a == 4 && gContestOpponents[i].unk1C_6)
+ else if (contestType == 4 && gContestOpponents[i].aiPool_Tough)
opponents[opponentsCount++] = i;
}
}
@@ -5223,14 +5415,14 @@ void sub_80B28F0(u8 a)
void sub_80B292C(void)
{
- gObjectBankIDs[3] = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy);
- InitSpriteAffineAnim(&gSprites[gObjectBankIDs[gBankTarget]]);
+ gBankSpriteIds[3] = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy);
+ InitSpriteAffineAnim(&gSprites[gBankSpriteIds[gBankTarget]]);
sub_80B2968();
}
void sub_80B2968(void)
{
- struct Sprite *sprite = &gSprites[gObjectBankIDs[3]];
+ struct Sprite *sprite = &gSprites[gBankSpriteIds[3]];
sprite->pos2.x = 0;
sprite->pos2.y = 0;
diff --git a/src/contest_ai.c b/src/contest_ai.c
index 66b387270..1e249083b 100644
--- a/src/contest_ai.c
+++ b/src/contest_ai.c
@@ -8,7 +8,6 @@ extern u8 AreMovesContestCombo(u16, u16);
extern bool8 sub_80B214C(u8);
extern bool8 Contest_IsMonsTurnDisabled(u8);
-extern s16 gUnknown_02038670[];
extern u16 gSpecialVar_ContestCategory;
extern u8 *gAIScriptPtr;
diff --git a/src/scene/contest_painting.c b/src/contest_painting.c
index 0aa02312f..7d8f53299 100644
--- a/src/scene/contest_painting.c
+++ b/src/contest_painting.c
@@ -333,8 +333,7 @@ static void sub_8106AC4(u16 species, u8 arg1)
{
void *pal;
- // Unsure what gUnknown_03005E8C->var0 is supposed to be.
- pal = GetMonSpritePalFromOtIdPersonality(species, gUnknown_03005E8C->var4, gUnknown_03005E8C->var0);
+ pal = GetMonSpritePalFromOtIdPersonality(species, gUnknown_03005E8C->otId, gUnknown_03005E8C->personality);
LZDecompressVram(pal, gUnknown_03005E90);
if (arg1 == 1)
@@ -346,7 +345,7 @@ static void sub_8106AC4(u16 species, u8 arg1)
0x2000000,
gUnknown_081FAF4C[1],
species,
- (u32)gUnknown_03005E8C->var0
+ (u32)gUnknown_03005E8C->personality
);
sub_8106B90(gUnknown_081FAF4C[1], gUnknown_03005E90, gUnknown_03005E10);
}
@@ -359,7 +358,7 @@ static void sub_8106AC4(u16 species, u8 arg1)
0x2000000,
gUnknown_081FAF4C[0],
species,
- (u32)gUnknown_03005E8C->var0
+ (u32)gUnknown_03005E8C->personality
);
sub_8106B90(gUnknown_081FAF4C[0], gUnknown_03005E90, gUnknown_03005E10);
}
@@ -743,7 +742,7 @@ static void sub_8106F6C(u8 arg0)
gUnknown_03005E20.var_4 = gUnknown_03005E10;
gUnknown_03005E20.var_8 = gUnknown_03005E90;
gUnknown_03005E20.var_18 = 0;
- gUnknown_03005E20.var_1F = gUnknown_03005E8C->var0;
+ gUnknown_03005E20.var_1F = gUnknown_03005E8C->personality % 256;
gUnknown_03005E20.var_19 = 0;
gUnknown_03005E20.var_1A = 0;
gUnknown_03005E20.var_1B = 64;
@@ -779,7 +778,7 @@ static void sub_8106F6C(u8 arg0)
static void sub_8107090(u8 arg0, u8 arg1)
{
sub_8106F4C();
- sub_8106AC4(gUnknown_03005E8C->var8, 0);
+ sub_8106AC4(gUnknown_03005E8C->species, 0);
sub_8106F6C(sub_8106EE0(arg0));
sub_8106E98(arg0);
sub_8106C40(arg0, arg1);
diff --git a/src/field/coord_event_weather.c b/src/coord_event_weather.c
index db4e9c161..60b87fa30 100644
--- a/src/field/coord_event_weather.c
+++ b/src/coord_event_weather.c
@@ -34,7 +34,7 @@ static const struct CoordEventWeather sCoordEventWeatherFuncs[] =
{ 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_SHADE, CoordEventWeather_Dark },
{ COORD_EVENT_WEATHER_DROUGHT, CoordEventWeather_Drought },
{ COORD_EVENT_WEATHER_ROUTE119_CYCLE, CoordEventWeather_Route119Cycle },
{ COORD_EVENT_WEATHER_ROUTE123_CYCLE, CoordEventWeather_Route123Cycle },
@@ -87,7 +87,7 @@ static void CoordEventWeather_Sandstorm(void)
static void CoordEventWeather_Dark(void)
{
- SetWeather(WEATHER_DARK);
+ SetWeather(WEATHER_SHADE);
}
static void CoordEventWeather_Drought(void)
diff --git a/src/scene/credits.c b/src/credits.c
index e31e2c797..9a85265e4 100644
--- a/src/scene/credits.c
+++ b/src/credits.c
@@ -246,9 +246,9 @@ const u8 gUnknown_0840B878[] =
};
#ifdef GERMAN
-#include "../data/credits_de.h"
+#include "data/credits_de.h"
#else
-#include "../data/credits_en.h"
+#include "data/credits_en.h"
#endif
const u8 gUnknown_0840CA00[][2] =
diff --git a/src/scene/cute_sketch.c b/src/cute_sketch.c
index 5317bc334..5317bc334 100644
--- a/src/scene/cute_sketch.c
+++ b/src/cute_sketch.c
diff --git a/src/data/battle_tower/trainers.h b/src/data/battle_tower/trainers.h
index ae204f8ea..4d555fbb0 100644
--- a/src/data/battle_tower/trainers.h
+++ b/src/data/battle_tower/trainers.h
@@ -1,1503 +1,1303 @@
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,
- },
- },
- },
+ {
+ .trainerClass = FACILITY_CLASS_YOUNGSTER,
+ .name = _("ALVIN"),
+ .teamFlags = 0x01,
+ .greeting = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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
index db226c6a6..71f301975 100644
--- a/src/data/battle_tower/trainers_de.h
+++ b/src/data/battle_tower/trainers_de.h
@@ -1,1503 +1,1303 @@
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,
- },
- },
- },
+ {
+ .trainerClass = FACILITY_CLASS_YOUNGSTER,
+ .name = _("ALWIN"),
+ .teamFlags = 0x01,
+ .greeting = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ EC_WORD_BE,
+ EC_WORD_KIND,
+ EC_WORD_TO,
+ EC_WORD_GIRL,
+ 0xFFFF,
+ 0xFFFF,
+ },
+ },
+ {
+ .trainerClass = FACILITY_CLASS_GUITARIST,
+ .name = _("LEIF"),
+ .teamFlags = 0x01,
+ .greeting = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ EC_WORD_DRAGON,
+ 0xFFFF,
+ EC_WORD_POKEMON,
+ EC_WORD_THOSE,
+ EC_WORD_FANTASTIC,
+ 0xFFFF,
+ },
+ },
+ {
+ .trainerClass = FACILITY_CLASS_LASS,
+ .name = _("MIRIAM"),
+ .teamFlags = 0x82,
+ .greeting = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ EC_WORD_WATER,
+ 0xFFFF,
+ EC_WORD_AND,
+ EC_WORD_BUG,
+ 0xFFFF,
+ EC_WORD_POKEMON,
+ },
+ },
+ {
+ .trainerClass = FACILITY_CLASS_BATTLE_GIRL,
+ .name = _("ANKE"),
+ .teamFlags = 0x20,
+ .greeting = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ EC_WORD_SHADY,
+ EC_WORD_BABY,
+ EC_WORD_BABY,
+ EC_WORD_BABY,
+ 0xFFFF,
+ 0xFFFF,
+ },
+ },
+ {
+ .trainerClass = FACILITY_CLASS_PSYCHIC_M,
+ .name = _("RALF"),
+ .teamFlags = 0x08,
+ .greeting = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ 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 = {
+ EC_WORD_COME_ON,
+ EC_WORD_ABSOLUTELY,
+ EC_WORD_TIME,
+ EC_WORD_BECOMES,
+ EC_WORD_EXCELLENT,
+ 0xFFFF,
+ },
+ },
};
diff --git a/src/data/pokedex_entries_de.h b/src/data/pokedex_entries_de.h
index 0f64cba66..413b73d90 100644
--- a/src/data/pokedex_entries_de.h
+++ b/src/data/pokedex_entries_de.h
@@ -6337,7 +6337,8 @@ static const u8 DexDescription_Deoxys_2[] = _(
"dieses POKéMON ist sein Gehirn.");
#endif
-static const struct PokedexEntry gPokedexEntries[] = {
+const struct PokedexEntry gPokedexEntries[] =
+{
{
// Dummy
.categoryName = _("UNBEKANNT"),
diff --git a/src/data/pokedex_entries_en.h b/src/data/pokedex_entries_en.h
index 86da3d67b..933b1fc7d 100644
--- a/src/data/pokedex_entries_en.h
+++ b/src/data/pokedex_entries_en.h
@@ -5389,7 +5389,7 @@ static const u8 DexDescription_Deoxys_2[] = _(
"chest appears to be its brain.");
#endif
-static const struct PokedexEntry gPokedexEntries[] =
+const struct PokedexEntry gPokedexEntries[] =
{
{ //Dummy
.categoryName = _("UNKNOWN"),
diff --git a/src/field/daycare.c b/src/daycare.c
index 36dd7ec03..e26db531f 100644
--- a/src/field/daycare.c
+++ b/src/daycare.c
@@ -35,7 +35,7 @@ static void ClearDaycareMail(struct DayCareMail *);
static void SetInitialEggData(struct Pokemon *, u16, struct DayCare *);
static u8 GetDaycareCompatibilityScore(struct DayCare *);
-#include "../data/pokemon/egg_moves.h"
+#include "data/pokemon/egg_moves.h"
static const u8 *const sCompatibilityMessages[] = {
DaycareText_GetAlongVeryWell,
@@ -205,7 +205,7 @@ static u16 TakeSelectedPokemonFromDaycare(struct DayCare * daycare, u8 slot)
GetBoxMonNick(&daycare->mons[slot], gStringVar1);
species = GetBoxMonData(&daycare->mons[slot], MON_DATA_SPECIES);
- sub_803B4B4(&daycare->mons[slot], &pokemon);
+ ExpandBoxMon(&daycare->mons[slot], &pokemon);
if (GetMonData(&pokemon, MON_DATA_LEVEL) != MAX_LEVEL)
{
@@ -1574,102 +1574,23 @@ void SetDaycareCompatibilityString(void)
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;
+ flags[0] = flags[1] = 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;
+ 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)
{
diff --git a/src/debug/kagaya_debug_menu.c b/src/debug/kagaya_debug_menu.c
new file mode 100644
index 000000000..3cb36ce0c
--- /dev/null
+++ b/src/debug/kagaya_debug_menu.c
@@ -0,0 +1,183 @@
+#if DEBUG
+
+#include "global.h"
+#include "field_effect.h"
+#include "field_control_avatar.h"
+#include "field_player_avatar.h"
+#include "main.h"
+#include "menu.h"
+#include "overworld.h"
+#include "palette.h"
+#include "random.h"
+#include "region_map.h"
+#include "script.h"
+#include "slot_machine.h"
+#include "trainer_card.h"
+
+extern u8 (*gMenuCallback)(void);
+
+void InitKagayaDebugMenu_B(void);
+u8 debug_sub_80B061C(void);
+u8 KagayaDebugMenu_TrainerCard(void);
+u8 debug_sub_80B068C(void);
+u8 KagayaDebugMenu_CardToExchange(void);
+u8 debug_sub_80B06E0(void);
+u8 KagayaDebugMenu_SlotMachine(void);
+u8 Kagaya_80B0734(void);
+u8 debug_sub_80B07DC(void);
+
+const u8 Str_83EBB34[] = _("Trainer’s card");
+const u8 Str_83EBB43[] = _("Card to exchange");
+const u8 Str_83EBB54[] = _("Slot machine");
+
+const struct MenuAction _83EBB64[] =
+{
+ { Str_83EBB34, KagayaDebugMenu_TrainerCard },
+ { Str_83EBB43, KagayaDebugMenu_CardToExchange },
+ { Str_83EBB54, KagayaDebugMenu_SlotMachine },
+};
+
+u8 InitKagayaDebugMenu_A(void)
+{
+ InitKagayaDebugMenu_B();
+ return 0;
+}
+
+void InitKagayaDebugMenu_B(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 14, 7);
+ Menu_PrintItems(2, 1, 3, _83EBB64);
+ InitMenu(0, 1, 1, 3, 0, 13);
+ gMenuCallback = debug_sub_80B061C;
+}
+
+u8 debug_sub_80B061C(void)
+{
+ s8 input = Menu_ProcessInput();
+
+ if (input == -2)
+ {
+ return 0;
+ }
+ else if (input == -1)
+ {
+ CloseMenu();
+ return 1;
+ }
+ else
+ {
+ gMenuCallback = _83EBB64[input].func;
+ return 0;
+ }
+}
+
+u8 KagayaDebugMenu_TrainerCard(void)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ gMenuCallback = debug_sub_80B068C;
+ return 0;
+}
+
+u8 debug_sub_80B068C(void)
+{
+ if (!UpdatePaletteFade())
+ {
+ debug_sub_80A0710(sub_805469C);
+ CloseMenu();
+ ScriptContext2_Enable();
+ return 1;
+ }
+ return 0;
+}
+
+u8 KagayaDebugMenu_CardToExchange(void)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ gMenuCallback = debug_sub_80B06E0;
+ return 0;
+}
+
+u8 debug_sub_80B06E0(void)
+{
+ if (!UpdatePaletteFade())
+ {
+ debug_sub_80A073C(sub_805469C);
+ CloseMenu();
+ ScriptContext2_Enable();
+ return 1;
+ }
+ return 0;
+}
+
+u8 KagayaDebugMenu_SlotMachine(void)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ gMenuCallback = Kagaya_80B0734;
+ return 0;
+}
+
+u8 Kagaya_80B0734(void)
+{
+ if (!UpdatePaletteFade())
+ {
+ debug_sub_811609C(Random() % 6, sub_805469C);
+ CloseMenu();
+ ScriptContext2_Enable();
+ return 1;
+ }
+ return 0;
+}
+
+u8 debug_sub_80B0770(void)
+{
+ if (!(gPlayerAvatar.flags & 8))
+ {
+ CloseMenu();
+ if (IsPlayerFacingSurfableFishableWater())
+ {
+ gFieldEffectArguments[0] = 0;
+ FieldEffectStart(9);
+ }
+ }
+ else
+ {
+ CloseMenu();
+ }
+ return 1;
+}
+
+u8 debug_sub_80B07B0(void)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ gMenuCallback = debug_sub_80B07DC;
+ return 0;
+}
+
+u8 debug_sub_80B07DC(void)
+{
+ if (!UpdatePaletteFade())
+ {
+ CloseMenu();
+ SetMainCallback2(CB2_InitFlyRegionMap);
+ return 1;
+ }
+ return 0;
+}
+
+u8 debug_sub_80B0800(void)
+{
+ u8 r2;
+
+ CloseMenu();
+ r2 = sub_8068F18();
+ if (r2 != 0)
+ {
+ gFieldEffectArguments[0] = 0;
+ gFieldEffectArguments[1] = r2 - 1;
+ FieldEffectStart(0x2C);
+ }
+ return 1;
+}
+
+#endif // DEBUG
diff --git a/src/debug/matsuda_debug_menu.c b/src/debug/matsuda_debug_menu.c
index da1937adb..c8f80eb50 100644
--- a/src/debug/matsuda_debug_menu.c
+++ b/src/debug/matsuda_debug_menu.c
@@ -18,14 +18,7 @@
#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;
@@ -40,8 +33,6 @@ extern u16 gBattle_BG3_Y;
extern u8 (*gMenuCallback)(void);
-extern bool8 gReceivedRemoteLinkPlayers;
-
static bool8 sub_80A9B78(void);
static void sub_80A9BE4(u8 taskId);
static void sub_80A9C98(u8);
@@ -85,166 +76,6 @@ const struct MenuAction gMatsudaDebugMenuActions[] =
{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)
{
Menu_EraseScreen();
@@ -469,14 +300,172 @@ static void sub_80A9F50(void)
static void sub_80A9FE4(void)
{
- u8 ptr[5];
-
- memcpy(ptr, gMatsudaDebugMenu_UnknownByteArray, 5);
+ u8 ptr[] = _("{HIGHLIGHT WHITE2} ");
DmaFill32Large(3, 0, (void *)VRAM, VRAM_SIZE, 0x1000);
sub_80034D4((void *)VRAM, ptr);
LoadFontDefaultPalette(&gWindowTemplate_81E6C3C);
}
+//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,
+ };
+
static void sub_80AA064(void)
{
AnimateSprites();
@@ -972,7 +961,7 @@ void sub_80AAF30(void)
gUnknown_02038670[i] = 0;
gUnknown_02038680[i] = 0;
gUnknown_02038678[i] = 0;
- memcpy(&gContestMons[i], &gContestMons[3], sizeof(struct ContestPokemon));
+ gContestMons[i] = gContestMons[3];
}
gUnknown_02038670[3] = 0x12C;
diff --git a/src/debug/nakamura_debug_menu.c b/src/debug/nakamura_debug_menu.c
new file mode 100644
index 000000000..550ac7bbd
--- /dev/null
+++ b/src/debug/nakamura_debug_menu.c
@@ -0,0 +1,189 @@
+#if DEBUG
+#include "global.h"
+#include "menu.h"
+
+EWRAM_DATA u8 _nakamuraData0 = 0;
+EWRAM_DATA u8 _nakamuraData1 = 0;
+EWRAM_DATA u8 _nakamuraData2 = 0;
+EWRAM_DATA u8 _nakamuraData3 = 0;
+EWRAM_DATA u8 _nakamuraData4 = 0;
+EWRAM_DATA u8 _nakamuraData5 = 0;
+EWRAM_DATA u16 _nakamuraData6 = 0;
+EWRAM_DATA u16 _nakamuraData8 = 0;
+EWRAM_DATA u16 _nakamuraDataA = 0;
+EWRAM_DATA u16 _nakamuraDataC = 0;
+
+__attribute__((unused)) static u8 _nakamuraStatic0[0x18];
+__attribute__((unused)) static u8 _nakamuraStatic18;
+__attribute__((unused)) static u8 gDebugFiller3000814[4];
+
+asm(".global _nakamuraStatic0");
+asm(".global _nakamuraStatic18");
+
+u8 debug_sub_815FC54();
+u8 debug_sub_815F2B4();
+u8 debug_sub_815FC94();
+u8 debug_sub_815FB1C();
+u8 debug_sub_815F2F4();
+u8 debug_sub_815F62C();
+u8 debug_sub_815FBE8();
+u8 debug_sub_815FE1C();
+u8 debug_sub_8160D98();
+
+const u8 Str_843E36C[] = _("Berries");
+const u8 Str_843E374[] = _("Goods");
+const u8 Str_843E37A[] = _("{PKMN} list");
+const u8 Str_843E382[] = _("トラップ");
+const u8 Str_843E387[] = _("Move your base");
+const u8 Str_843E396[] = _("Moving {PKMN}");
+const u8 Str_843E3A0[] = _("Fishing points");
+const u8 Str_843E3AF[] = _("Set {POKEBLOCK}");
+const u8 Str_843E3B9[] = _("Make bases(to max)");
+const u8 Str_843E3CC[] = _("Base location");
+
+const struct MenuAction _843E3DC[] = {
+ { Str_843E36C, debug_sub_815FC54 },
+ { Str_843E37A, debug_sub_815F2B4 },
+ { Str_843E374, debug_sub_815FC94 },
+ { Str_843E387, debug_sub_815FB1C },
+ { Str_843E3B9, debug_sub_815F2F4 },
+ { Str_843E3CC, debug_sub_815F62C },
+ { Str_843E396, debug_sub_815FBE8 },
+ { Str_843E3A0, debug_sub_815FE1C },
+ { Str_843E3AF, debug_sub_8160D98 },
+};
+
+const u8 _843E424[][4] = {
+ { 1, 118, 47, 14 },
+ { 2, 125, 53, 10 },
+ { 3, 113, 49, 8 },
+ { 0xB, 118, 67, 6 },
+ { 0xC, 121, 40, 11 },
+ { 0xD, 111, 35, 1 },
+ { 0x15, 115, 20, 53 },
+ { 0x16, 121, 18, 13 },
+ { 0x17, 119, 26, 81 },
+ { 0x1F, 127, 59, 67 },
+ { 0x20, 125, 55, 11 },
+ { 0x21, 111, 27, 27 },
+ { 0x29, 114, 9, 47 },
+ { 0x2A, 115, 32, 39 },
+ { 0x2B, 115, 23, 8 },
+ { 0x33, 114, 30, 51 },
+ { 0x34, 115, 26, 15 },
+ { 0x35, 115, 32, 46 },
+ { 0x3D, 114, 11, 62 },
+ { 0x3E, 115, 21, 18 },
+ { 0x3F, 115, 25, 24 },
+ { 0x47, 114, 19, 70 },
+ { 0x48, 115, 32, 6 },
+ { 0x49, 114, 32, 57 },
+ { 0x51, 116, 71, 4 },
+ { 0x52, 123, 47, 3 },
+ { 0x53, 123, 57, 5 },
+ { 0x5B, 116, 79, 11 },
+ { 0x5C, 123, 49, 3 },
+ { 0x5D, 120, 18, 12 },
+ { 0x65, 120, 28, 62 },
+ { 0x66, 116, 56, 6 },
+ { 0x67, 119, 16, 81 },
+ { 0x6F, 120, 30, 62 },
+ { 0x70, 116, 55, 15 },
+ { 0x71, 119, 16, 28 },
+ { 0x79, 111, 33, 34 },
+ { 0x7A, 118, 29, 5 },
+ { 0x7B, 127, 45, 24 },
+ { 0x83, 111, 24, 36 },
+ { 0x84, 125, 7, 25 },
+ { 0x85, 115, 8, 30 },
+ { 0x8D, 111, 34, 50 },
+ { 0x8E, 127, 59, 72 },
+ { 0x8F, 127, 61, 21 },
+ { 0x97, 127, 67, 63 },
+ { 0x98, 125, 24, 32 },
+ { 0x99, 111, 35, 31 },
+ { 0xA1, 111, 13, 19 },
+ { 0xA2, 121, 43, 7 },
+ { 0xA3, 118, 47, 5 },
+ { 0xA4, 111, 14, 19 },
+ { 0xAB, 118, 46, 5 },
+ { 0xAC, 121, 42, 7 },
+ { 0xAD, 119, 19, 76 },
+ { 0xAE, 115, 7, 20 },
+ { 0xB5, 110, 16, 25 },
+ { 0xB6, 114, 11, 27 },
+ { 0xB7, 115, 8, 20 },
+ { 0xBF, 110, 17, 25 },
+ { 0xC0, 114, 12, 27 },
+ { 0xC1, 119, 18, 76 },
+ { 0xC9, 119, 5, 2 },
+ { 0xCA, 119, 4, 89 },
+ { 0xCB, 120, 38, 54 },
+ { 0xCC, 120, 5, 76 },
+ { 0xD3, 119, 5, 15 },
+ { 0xD4, 119, 7, 101 },
+ { 0xD5, 120, 31, 23 },
+ { 0xDD, 119, 34, 24 },
+ { 0xDE, 120, 26, 10 },
+ { 0xDF, 119, 4, 15 },
+ { 0xE7, 119, 31, 73 },
+ { 0xE8, 120, 29, 85 },
+ { 0xE9, 119, 6, 2 },
+};
+
+const u8 Str_843E550[] = _("R");
+const u8 Str_843E552[] = _("X");
+const u8 Str_843E554[] = _("Y");
+const u8 Str_843E556[] = _(
+ "♂1\n"
+ "♂2\n"
+ "♂3\n"
+ "♂4\n"
+ "♂5\n"
+ "♀1\n"
+ "♀2\n"
+ "♀3\n"
+ "♀4\n"
+ "♀5");
+const u8 Str_843E574[] = _("ー");
+const u8 Str_843E576[] = _("あ");
+const u8 Str_843E578[] = _("ア");
+const u8 Str_843E57A[] = _("A");
+const u8 Str_843E57C[] = _("a");
+const u8 Str_843E57E[] = _("0");
+const u8 Str_843E580[] = _(
+ "ADD\n"
+ "DEL\n"
+ "EXIT");
+const u8 Str_843E58D[] = _(
+ "Fishing location R119\n"
+ " Y1\n"
+ " Y2\n"
+ " Y3\n"
+ "Encounter location\n"
+ "\n"
+ "\n"
+ "front of you");
+const u8 _843E5D1[] = {0x0F, 0x16, 0x19};
+const u8 Str_843E5D4[] = _(
+ "Aボタン {ESCAPE}\p"
+ "  Bボタン ー\n"
+ "START けってい");
+const u8 Str_843E5F0[] = _("?");
+const u8 Str_843E5F2[] = _("HP どりょくち");
+const u8 Str_843E5FB[] = _("こうげき どりょくち");
+const u8 Str_843E606[] = _("ぼうぎょ どりょくち");
+const u8 Str_843E611[] = _("すばやさ どりょくち");
+const u8 Str_843E61C[] = _("とくこう どりょくち");
+const u8 Str_843E627[] = _("とくぼう どりょくち");
+const u8 Str_843E632[] = _("なつきど");
+const u8 Str_843E637[] = _("どりょくち ごうけい");
+const u8 Str_843E642[] = _("ここから");
+const u8 Str_843E647[] = _("ここまで");
+const u8 Str_843E64C[] = _("かいすう");
+const u8 Str_843E651[] = _("けっか");
+const u8 Str_843E655[] = _("かい");
+const u8 Str_843E658[] = _("0");
+const u8 Str_843E65A[] = _("はんい");
+
+#endif // DEBUG
diff --git a/src/debug/nohara_debug_menu.c b/src/debug/nohara_debug_menu.c
new file mode 100644
index 000000000..b3885ff76
--- /dev/null
+++ b/src/debug/nohara_debug_menu.c
@@ -0,0 +1,12 @@
+#if DEBUG
+#include "global.h"
+
+__attribute__((unused)) static u8 gDebug_03000724;
+__attribute__((unused)) static u8 gDebug_03000725;
+__attribute__((unused)) static u8 gDebug_03000726;
+
+asm(".global gDebug_03000724");
+asm(".global gDebug_03000725");
+asm(".global gDebug_03000726");
+
+#endif
diff --git a/src/debug/start_menu_debug.c b/src/debug/start_menu_debug.c
new file mode 100644
index 000000000..9b12c1cc1
--- /dev/null
+++ b/src/debug/start_menu_debug.c
@@ -0,0 +1,6051 @@
+#if DEBUG
+
+#include "global.h"
+#include "constants/songs.h"
+#include "battle.h"
+#include "debug.h"
+#include "link.h"
+#include "main.h"
+#include "menu.h"
+#include "mystery_event_menu.h"
+#include "overworld.h"
+#include "reset_rtc_screen.h"
+#include "rtc.h"
+#include "save.h"
+#include "sound.h"
+#include "task.h"
+#include "text.h"
+#include "trade.h"
+
+// berry_blender.c
+extern void unref_sub_80524BC(void);
+
+void debug_sub_8076BB4(u8);
+void debug_sub_8077CF4();
+
+u8 DebugMenu_Exit(void);
+u8 DebugMenu_OpenWatanabe(void);
+u8 DebugMenu_OpenSogabe(void);
+u8 DebugMenu_OpenTamada(void);
+u8 DebugMenu_OpenKagaya(void);
+u8 DebugMenu_OpenMatsuda(void);
+u8 DebugMenu_OpenNohara(void);
+u8 DebugMenu_OpenNakamura(void);
+u8 DebugMenu_Teleport(void);
+u8 DebugMenu_EditPKMN(void);
+u8 DebugMenu_SwitchBG(void);
+u8 DebugMenu_OpenMori(void);
+u8 DebugMenu_OpenTomomichi(void);
+u8 DebugMenu_OpenAoki(void);
+u8 DebugMenu_OpenTaya(void);
+u8 DebugMenu_ToggleClearFlag(void);
+u8 DebugMenu_ControlEncounter(void);
+u8 DebugMenu_PTime(void);
+u8 DebugMenu_MakeItems(void);
+u8 debug_sub_8091300(void);
+u8 DebugMenu_ViewPortraits(void);
+u8 DebugMenu_TimeRecords(void);
+u8 DebugMenu_SetTime(void);
+u8 DebugMenu_NationalDex(void);
+u8 DebugMenu_CreatePKMN(void);
+u8 DebugMenu_ViewPokemonGraphics(void);
+u8 DebugMenu_BattleForDebug(void);
+u8 DebugMenu_AllBadges(void);
+u8 DebugMenu_HoennNationalDex(void);
+u8 DebugMenu_SetRamBerry(void);
+u8 DebugMenu_UseHM(void);
+u8 DebugMenu_OpenIwasawa(void);
+u8 DebugMenu_ToggleBGM(void);
+u8 DebugMenu_OpenSizeComparison(void);
+u8 DebugMenu_Safari(void);
+u8 DebugMenu_RematchTrainers(void);
+u8 DebugMenu_MiragaIslandRND(void);
+u8 DebugMenu_HallOfFame(void);
+u8 DebugMenu_OpenMysteryEvent(void);
+u8 DebugMenu_OpenLegendsRecord(void);
+u8 DebugMenu_OpenWeatherEvents(void);
+u8 DebugMenu_CellInfo(void);
+u8 DebugMenu_CheckPKBLCK(void);
+u8 DebugMenu_EffortValues(void);
+u8 DebugMenu_HoennDex(void);
+u8 DebugMenu_OpenSeeTrainers(void);
+u8 DebugMenu_OpenBerryInfo(void);
+u8 DebugMenu_BattleTowerStages(void);
+u8 DebugMenu_EndSequenceDemo(void);
+u8 DebugMenu_RandomNumberTest(void);
+u8 DebugMenu_MeTooBackupMan(void);
+u8 DebugMenu_OpenMurakawa(void);
+u8 DebugMenu_OpenKiwa(void);
+u8 DebugMenu_8076CBC(void);
+u8 DebugMenu_8076CC0(void);
+u8 DebugMenu_8076CD4(void);
+u8 DebugMenu_8076C6C(void);
+u8 DebugMenu_8076CD8(void);
+u8 DebugMenu_8076D28(void);
+u8 DebugMenu_8076D3C(void);
+u8 DebugMenu_8076C80(void);
+u8 DebugMenu_8076C90(void);
+u8 DebugMenu_8076D50(void);
+u8 DebugMenu_8076CEC(void);
+u8 DebugMenu_8076D14(void);
+u8 DebugMenu_8076D00(void);
+u8 DebugMenu_8076D5C(void);
+u8 DebugMenu_8076E18(void);
+u8 DebugMenu_8076EDC(void);
+void DebugMenu_8076FEC(void);
+
+const u8 Str_839B740[] = _("·WATANABE");
+const u8 Str_839B74A[] = _("SOGABE");
+const u8 Str_839B751[] = _("·TAMADA");
+const u8 Str_839B759[] = _("KAGAYA");
+const u8 Str_839B760[] = _("MATUDA");
+const u8 Str_839B767[] = _("NOHARA");
+const u8 Str_839B76E[] = _("NAKAMURA");
+const u8 Str_839B777[] = _("EXIT");
+const u8 Str_839B77C[] = _("Teleport");
+const u8 Str_839B785[] = _("Switch BG");
+const u8 Str_839B78F[] = _("Edit your {PKMN}");
+const u8 Str_839B79C[] = _("MORI");
+const u8 Str_839B7A1[] = _("TOMOMITI");
+const u8 Str_839B7AA[] = _("·AOKI");
+const u8 Str_839B7B0[] = _("TAYA");
+const u8 Str_839B7B5[] = _("Control Encounter");
+const u8 Str_839B7C7[] = _("PTIME");
+const u8 Str_839B7CD[] = _("Make items");
+const u8 Str_839B7D8[] = _("Transport");
+const u8 Str_839B7E2[] = _("See portraits");
+const u8 Str_839B7F0[] = _("Time records");
+const u8 Str_839B7FD[] = _("Set time");
+const u8 Str_839B806[] = _("National オカDex");
+const u8 Str_839B815[] = _("Hoenn オカDex");
+const u8 Str_839B821[] = _("Create {PKMN}");
+const u8 Str_839B82B[] = _("See {PKMN} graphics");
+const u8 Str_839B83B[] = _("See trainers");
+const u8 Str_839B848[] = _("Battle for debug");
+const u8 Str_839B859[] = _("Full set of badges");
+const u8 Str_839B86C[] = _("Hoenn National Dex");
+const u8 Str_839B87F[] = _("Set Ram berry");
+const u8 Str_839B88D[] = _("Use HM");
+const u8 Str_839B894[] = _("IWASAWA");
+const u8 Str_839B89C[] = _("BGM ON/OFF");
+const u8 Str_839B8A7[] = _("Size comparison");
+const u8 Str_839B8B7[] = _("Clear flag ON/OFF");
+const u8 Str_839B8C9[] = _("Safari");
+const u8 Str_839B8D0[] = _("Rematch trainers");
+const u8 Str_839B8E1[] = _("Mirage island RND");
+const u8 Str_839B8F3[] = _("Hall of fame");
+const u8 Str_839B900[] = _("Mystery event");
+const u8 Str_839B90E[] = _("Legends records");
+const u8 Str_839B91E[] = _("Weather events");
+const u8 Str_839B92D[] = _("Cell info.");
+const u8 Str_839B938[] = _("Check {POKEBLOCK}");
+const u8 Str_839B944[] = _("Effort values");
+const u8 Str_839B952[] = _("Berrie Info");
+const u8 Str_839B95E[] = _("Battle Tower stages");
+const u8 Str_839B972[] = _("End sequence demo");
+const u8 Str_839B984[] = _("Random number test");
+const u8 Str_839B997[] = _("Me-too BackupMan");
+const u8 Str_839B9A8[] = _("MURAKAWA");
+const u8 Str_839B9B1[] = _("KINA(FONT)");
+
+const struct MenuAction gDebug0x839B9BC[] =
+{
+ { Str_839B777, DebugMenu_Exit },
+ { Str_839B740, DebugMenu_OpenWatanabe },
+ { Str_839B74A, DebugMenu_OpenSogabe },
+ { Str_839B751, DebugMenu_OpenTamada },
+ { Str_839B759, DebugMenu_OpenKagaya },
+ { Str_839B760, DebugMenu_OpenMatsuda },
+ { Str_839B767, DebugMenu_OpenNohara },
+ { Str_839B76E, DebugMenu_OpenNakamura },
+ { Str_839B77C, DebugMenu_Teleport },
+ { Str_839B78F, DebugMenu_EditPKMN },
+ { Str_839B785, DebugMenu_SwitchBG },
+ { Str_839B79C, DebugMenu_OpenMori },
+ { Str_839B7A1, DebugMenu_OpenTomomichi },
+ { Str_839B7AA, DebugMenu_OpenAoki },
+ { Str_839B7B0, DebugMenu_OpenTaya },
+ { Str_839B8B7, DebugMenu_ToggleClearFlag },
+ { Str_839B7B5, DebugMenu_ControlEncounter },
+ { Str_839B7C7, DebugMenu_PTime },
+ { Str_839B7CD, DebugMenu_MakeItems },
+ { Str_839B7D8, debug_sub_8091300 },
+ { Str_839B7E2, DebugMenu_ViewPortraits },
+ { Str_839B7F0, DebugMenu_TimeRecords },
+ { Str_839B7FD, DebugMenu_SetTime },
+ { Str_839B806, DebugMenu_NationalDex },
+ { Str_839B821, DebugMenu_CreatePKMN },
+ { Str_839B82B, DebugMenu_ViewPokemonGraphics },
+ { Str_839B848, DebugMenu_BattleForDebug },
+ { Str_839B859, DebugMenu_AllBadges },
+ { Str_839B86C, DebugMenu_HoennNationalDex },
+ { Str_839B87F, DebugMenu_SetRamBerry },
+ { Str_839B88D, DebugMenu_UseHM },
+ { Str_839B894, DebugMenu_OpenIwasawa },
+ { Str_839B89C, DebugMenu_ToggleBGM },
+ { Str_839B8A7, DebugMenu_OpenSizeComparison },
+ { Str_839B8C9, DebugMenu_Safari },
+ { Str_839B8D0, DebugMenu_RematchTrainers },
+ { Str_839B8E1, DebugMenu_MiragaIslandRND },
+ { Str_839B8F3, DebugMenu_HallOfFame },
+ { Str_839B900, DebugMenu_OpenMysteryEvent },
+ { Str_839B90E, DebugMenu_OpenLegendsRecord },
+ { Str_839B91E, DebugMenu_OpenWeatherEvents },
+ { Str_839B92D, DebugMenu_CellInfo },
+ { Str_839B938, DebugMenu_CheckPKBLCK },
+ { Str_839B944, DebugMenu_EffortValues },
+ { Str_839B815, DebugMenu_HoennDex },
+ { Str_839B83B, DebugMenu_OpenSeeTrainers },
+ { Str_839B952, DebugMenu_OpenBerryInfo },
+ { Str_839B95E, DebugMenu_BattleTowerStages },
+ { Str_839B972, DebugMenu_EndSequenceDemo },
+ { Str_839B984, DebugMenu_RandomNumberTest },
+ { Str_839B997, DebugMenu_MeTooBackupMan },
+ { Str_839B9A8, DebugMenu_OpenMurakawa },
+ { Str_839B9B1, DebugMenu_OpenKiwa },
+};
+
+const u8 gUnknown_Debug_839BB64[] =
+{
+ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x0e, 0x1f, 0x12, 0x13, 0x00, 0x08, 0x09, 0x0a, 0x1e, 0x10, 0x24, 0x0f, 0x00, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00,
+ 0x1c, 0x1d, 0x14, 0x20, 0x21, 0x22, 0x23, 0x00, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x00, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x00, 0x11, 0x33, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+const u8 gUnknown_Debug_0839BBA4[] = _("Debugging Version");
+const u8 gUnknown_Debug_0839BBB6[] = _("{VERSION} Version");
+const u8 gUnknown_Debug_0839BBC1[] = _("Normal RTC compatible");
+const u8 Str_839BBD7[] = _("か の じっけん");
+const u8 Str_839BBE0[] = _("じっけん2");
+const u8 Str_839BBE6[] = _("BGじっけん");
+const u8 Str_839BBED[] = _("Battle");
+const u8 Str_839BBF4[] = _("つうしん じっけん");
+const u8 Str_839BBFE[] = _("LINK Test2");
+const u8 Str_839BC09[] = _("フィールド はじめる");
+const u8 Str_839BC14[] = _("フィールド つづき");
+const u8 Str_839BC1E[] = _("Sound test");
+const u8 Str_839BC29[] = _("{POKEBLOCK} test");
+const u8 Str_839BC34[] = _("Crash backup data");
+const u8 Str_839BC46[] = _("e-Card test");
+const u8 Str_839BC52[] = _("こうかんデモ   ");
+const u8 Str_839BC5C[] = _("Time in game");
+const u8 Str_839BC69[] = _("フェスタ モード");
+const u8 Str_839BC72[] = _("Mimic e-Card");
+const u8 Str_839BC7F[] = _("RTC reset");
+const u8 Str_839BC89[] = _("Converter");
+
+const struct MenuAction gUnknown_Debug_839BC94[] =
+{
+ { Str_839BBD7, DebugMenu_8076CBC },
+ { Str_839BBE0, DebugMenu_8076CC0 },
+ { Str_839BBE6, DebugMenu_8076CD4 },
+ { Str_839BBED, DebugMenu_8076C6C },
+ { Str_839BC29, DebugMenu_8076CD8 },
+ { Str_839BBFE, DebugMenu_8076D28 },
+ { Str_839BC1E, DebugMenu_8076D3C },
+ { Str_839BC09, DebugMenu_8076C80 },
+ { Str_839BC14, DebugMenu_8076C90 },
+ { Str_839BC34, DebugMenu_8076D50 },
+ { Str_839BC46, DebugMenu_8076CEC },
+ { Str_839BC52, DebugMenu_8076D14 },
+ { Str_839BC72, DebugMenu_8076D00 },
+ { Str_839BC5C, DebugMenu_8076D5C },
+ { Str_839BC7F, DebugMenu_8076E18 },
+ { Str_839BC89, DebugMenu_8076EDC },
+};
+
+// NOTE: When decompiling this file, I found out that having an extraneous extern
+// in a C file can affect the generated asm. If this extern is commented out,
+// debug_sub_8076BB4 will access the array differently and no longer match.
+//extern const struct MenuAction gUnknown_Debug_839BC94[];
+
+const u8 gMenuOrders_839BD14[][10] =
+{
+ { 3, 6, 4, 0xFF },
+ { 5, 9, 10, 12, 13, 14, 15, 0xFF },
+};
+
+const u8 Str_839BD26[] = {2, 0, 0, 0}; // doesn't appear to be referenced
+
+const u8 Str_839BD2C[] = _("RTCを リセット します\n" // Reset RTC
+ "Aで じっこう   Bでキャンセル");
+
+const u8 Str_839BD4C[] = _("RTCを リセット した!");
+
+const u8 Str_839BD5A[] = _("セーブデータを コンバートします\n"
+ "Aで けってい  Bで キャンセル");
+
+const u8 Str_839BD7D[] = _("へんかんが しゅうりょう しました!");
+
+
+extern const u8 Str_839BD2C[];
+extern const u8 Str_839BD4C[];
+
+__attribute__((unused)) static u8 gUnknown_030006B8[4];
+__attribute__((unused)) static u8 gUnknown_030006BC[4];
+__attribute__((unused)) static u8 gUnknown_030006C0;
+__attribute__((unused)) static u8 gUnknown_030006C1;
+static const u8 *gUnknown_030006C4;
+__attribute__((unused)) static u8 gUnknown_030006C8;
+
+void debug_sub_8076AC8(u8 a)
+{
+ s32 r4;
+
+ gUnknown_030006C4 = gMenuOrders_839BD14[a];
+ for (r4 = 0; gUnknown_030006C4[r4] != 0xFF; r4++)
+ ;
+ Menu_EraseWindowRect(16, 0, 29, 19);
+ Menu_DrawStdWindowFrame(16, 0, 29, r4 * 2 + 1);
+ Menu_PrintItemsReordered(17, 1, r4, (struct MenuAction2 *)gUnknown_Debug_839BC94, gUnknown_030006C4);
+ InitMenu(0, 17, 1, r4, 0, 12);
+}
+
+void debug_sub_8076B4C(void)
+{
+ u8 taskId = FindTaskIdByFunc(debug_sub_8076BB4);
+
+ if (taskId != 0xFF)
+ DestroyTask(taskId);
+}
+
+// Initializes test menu
+void debug_sub_8076B68(void)
+{
+ Menu_PrintText(gUnknown_Debug_0839BBB6, 1, 1);
+ Menu_PrintText(gUnknown_Debug_0839BBC1, 1, 3);
+ Menu_PrintText(gUnknown_Debug_0839BBA4, 1, 9);
+ debug_sub_8077CF4(4, 11);
+ debug_sub_8076AC8(0);
+ CreateTask(debug_sub_8076BB4, 1);
+}
+
+// Handles input for the test menu
+void debug_sub_8076BB4(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ s8 input = Menu_ProcessInput();
+ s8 cursorPos = Menu_GetCursorPos();
+
+ switch (input)
+ {
+ default:
+ gUnknown_Debug_839BC94[gUnknown_030006C4[cursorPos]].func();
+ break;
+ case -2:
+ if (gMain.newKeys & 0x20)
+ {
+ if (data[0] == 0)
+ data[0] = 1;
+ else
+ data[0]--;
+ debug_sub_8076AC8(data[0]);
+ PlaySE(SE_SELECT);
+ }
+ else if (gMain.newKeys & 0x10)
+ {
+ if (data[0] == 1)
+ data[0] = 0;
+ else
+ data[0]++;
+ debug_sub_8076AC8(data[0]);
+ PlaySE(SE_SELECT);
+ }
+ break;
+ case -1:
+ DoSoftReset();
+ break;
+ }
+}
+
+u8 DebugMenu_8076C6C(void)
+{
+ SetMainCallback2(debug_sub_8010800);
+ return 0;
+}
+
+u8 DebugMenu_8076C80(void)
+{
+ debug_sub_8076B4C();
+ DebugMenu_8076FEC();
+ return 0;
+}
+
+u8 DebugMenu_8076C90(void)
+{
+ if (gSaveFileStatus == SAVE_STATUS_ERROR)
+ {
+ PlaySE(0x16);
+ }
+ else
+ {
+ debug_sub_8076B4C();
+ SetMainCallback2(CB2_ContinueSavedGame);
+ }
+ return 0;
+}
+
+u8 DebugMenu_8076CBC(void)
+{
+ return 0;
+}
+
+u8 DebugMenu_8076CC0(void)
+{
+ SetMainCallback2(debug_nullsub_66);
+ return 0;
+}
+
+u8 DebugMenu_8076CD4(void)
+{
+ return 0;
+}
+
+u8 DebugMenu_8076CD8(void)
+{
+ SetMainCallback2(unref_sub_80524BC);
+ return 0;
+}
+
+u8 DebugMenu_8076CEC(void)
+{
+ SetMainCallback2(CB2_InitMysteryEventMenu);
+ return 0;
+}
+
+u8 DebugMenu_8076D00(void)
+{
+ SetMainCallback2(debug_sub_815D15C);
+ return 0;
+}
+
+u8 DebugMenu_8076D14(void)
+{
+ SetMainCallback2(sub_804B790);
+ return 0;
+}
+
+u8 DebugMenu_8076D28(void)
+{
+ SetMainCallback2(LinkTestScreen);
+ return 0;
+}
+
+u8 DebugMenu_8076D3C(void)
+{
+ SetMainCallback2(CB2_StartSoundCheckMenu);
+ return 0;
+}
+
+u8 DebugMenu_8076D50(void)
+{
+ Save_EraseAllData();
+ return 0;
+}
+
+u8 DebugMenu_8076D5C(void)
+{
+ debug_sub_8076B4C();
+ debug_sub_806F8F8();
+ return 0;
+}
+
+void DebugMenu_8076D6C(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ case 0:
+ Menu_DisplayDialogueFrame();
+ Menu_PrintText(Str_839BD2C, 2, 15);
+ data[0]++;
+ break;
+ case 1:
+ if (gMain.newKeys & A_BUTTON)
+ {
+ Menu_DisplayDialogueFrame();
+ Menu_PrintText(Str_839BD4C, 2, 15);
+ PlaySE(0x49);
+ RtcReset();
+ data[0]++;
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ DestroyTask(taskId);
+ DoSoftReset();
+ }
+ break;
+ case 2:
+ if (gMain.newKeys & A_BUTTON)
+ {
+ DestroyTask(taskId);
+ DoSoftReset();
+ }
+ break;
+ }
+}
+
+__attribute__((naked))
+u8 DebugMenu_8076E18()
+{
+ asm(
+ " push {lr}\n"
+ " bl debug_sub_8076B4C\n"
+ " ldr r0, ._67 @ DebugMenu_8076D6C\n"
+ " mov r1, #0xa\n"
+ " bl CreateTask\n"
+ " mov r0, #0x0\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._68:\n"
+ " .align 2, 0\n"
+ "._67:\n"
+ " .word DebugMenu_8076D6C+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8076E30()
+{
+ asm(
+ " push {r4, lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r3, r0, #0x18\n"
+ " lsl r0, r3, #0x2\n"
+ " add r0, r0, r3\n"
+ " lsl r0, r0, #0x3\n"
+ " ldr r1, ._73 @ gTasks\n"
+ " add r4, r0, r1\n"
+ " mov r0, #0x0\n"
+ " ldsh r1, [r4, r0]\n"
+ " cmp r1, #0x1\n"
+ " beq ._69 @cond_branch\n"
+ " cmp r1, #0x1\n"
+ " bgt ._70 @cond_branch\n"
+ " cmp r1, #0\n"
+ " beq ._71 @cond_branch\n"
+ " b ._86\n"
+ "._74:\n"
+ " .align 2, 0\n"
+ "._73:\n"
+ " .word gTasks+0x8\n"
+ "._70:\n"
+ " cmp r1, #0x2\n"
+ " beq ._75 @cond_branch\n"
+ " b ._86\n"
+ "._71:\n"
+ " bl Menu_DisplayDialogueFrame\n"
+ " ldr r0, ._78 @ Str_839BD5A\n"
+ " mov r1, #0x2\n"
+ " mov r2, #0xf\n"
+ " bl Menu_PrintText\n"
+ " b ._77\n"
+ "._79:\n"
+ " .align 2, 0\n"
+ "._78:\n"
+ " .word Str_839BD5A\n"
+ "._69:\n"
+ " ldr r0, ._82 @ gMain\n"
+ " ldrh r2, [r0, #0x2e]\n"
+ " and r1, r1, r2\n"
+ " cmp r1, #0\n"
+ " beq ._80 @cond_branch\n"
+ " bl Menu_DisplayDialogueFrame\n"
+ " bl sub_813B79C\n"
+ " ldr r0, ._82 + 4 @ Str_839BD7D\n"
+ " mov r1, #0x2\n"
+ " mov r2, #0xf\n"
+ " bl Menu_PrintText\n"
+ " mov r0, #0x49\n"
+ " bl PlaySE\n"
+ "._77:\n"
+ " ldrh r0, [r4]\n"
+ " add r0, r0, #0x1\n"
+ " strh r0, [r4]\n"
+ " b ._86\n"
+ "._83:\n"
+ " .align 2, 0\n"
+ "._82:\n"
+ " .word gMain\n"
+ " .word Str_839BD7D\n"
+ "._80:\n"
+ " mov r0, #0x2\n"
+ " and r0, r0, r2\n"
+ " cmp r0, #0\n"
+ " beq ._86 @cond_branch\n"
+ " add r0, r3, #0\n"
+ " bl DestroyTask\n"
+ " bl DoSoftReset\n"
+ " b ._86\n"
+ "._75:\n"
+ " ldr r0, ._87 @ gMain\n"
+ " ldrh r1, [r0, #0x2e]\n"
+ " mov r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._86 @cond_branch\n"
+ " add r0, r3, #0\n"
+ " bl DestroyTask\n"
+ " bl DoSoftReset\n"
+ "._86:\n"
+ " pop {r4}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._88:\n"
+ " .align 2, 0\n"
+ "._87:\n"
+ " .word gMain\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_8076EDC()
+{
+ asm(
+ " push {lr}\n"
+ " bl debug_sub_8076B4C\n"
+ " ldr r0, ._89 @ DebugMenu_8076E30\n"
+ " mov r1, #0xa\n"
+ " bl CreateTask\n"
+ " mov r0, #0x0\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._90:\n"
+ " .align 2, 0\n"
+ "._89:\n"
+ " .word DebugMenu_8076E30+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8076EF4()
+{
+ asm(
+ " push {r4, r5, lr}\n"
+ " add sp, sp, #0xfffffff8\n"
+ " mov r0, #0x0\n"
+ " mov r1, #0x0\n"
+ " mov r2, #0xb\n"
+ " mov r3, #0x11\n"
+ " bl Menu_DrawStdWindowFrame\n"
+ " ldr r4, ._93 @ gUnknown_Debug_839BDC4\n"
+ " mov r0, #0x2\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0x8\n"
+ " add r3, r4, #0\n"
+ " bl Menu_PrintItems\n"
+ " mov r5, #0x0\n"
+ " add r4, r4, #0x4\n"
+ "._92:\n"
+ " lsl r0, r5, #0x3\n"
+ " add r0, r0, r4\n"
+ " ldr r1, [r0]\n"
+ " mov r0, #0x1\n"
+ " and r1, r1, r0\n"
+ " mov r0, #0xb6\n"
+ " cmp r1, #0\n"
+ " bne ._91 @cond_branch\n"
+ " mov r0, #0xb5\n"
+ "._91:\n"
+ " lsl r2, r5, #0x1\n"
+ " add r2, r2, #0x1\n"
+ " lsl r2, r2, #0x18\n"
+ " lsr r2, r2, #0x18\n"
+ " mov r1, #0xa\n"
+ " bl sub_8071F60\n"
+ " add r0, r5, #1\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r5, r0, #0x18\n"
+ " cmp r5, #0x7\n"
+ " bls ._92 @cond_branch\n"
+ " mov r0, #0x0\n"
+ " str r0, [sp]\n"
+ " mov r0, #0x9\n"
+ " str r0, [sp, #0x4]\n"
+ " mov r0, #0x0\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0x1\n"
+ " mov r3, #0x8\n"
+ " bl InitMenu\n"
+ " add sp, sp, #0x8\n"
+ " pop {r4, r5}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._94:\n"
+ " .align 2, 0\n"
+ "._93:\n"
+ " .word gUnknown_Debug_839BDC4\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8076F60()
+{
+ asm(
+ " push {r4, r5, lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r5, r0, #0x18\n"
+ " bl Menu_ProcessInput\n"
+ " add r4, r0, #0\n"
+ " lsl r4, r4, #0x18\n"
+ " lsr r4, r4, #0x18\n"
+ " bl Menu_GetCursorPos\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r2, r0, #0x18\n"
+ " lsl r4, r4, #0x18\n"
+ " asr r4, r4, #0x18\n"
+ " mov r0, #0x2\n"
+ " neg r0, r0\n"
+ " cmp r4, r0\n"
+ " beq ._97 @cond_branch\n"
+ " add r0, r0, #0x1\n"
+ " cmp r4, r0\n"
+ " bne ._96 @cond_branch\n"
+ " bl Menu_EraseScreen\n"
+ " bl debug_sub_8076B68\n"
+ " add r0, r5, #0\n"
+ " bl DestroyTask\n"
+ " b ._97\n"
+ "._96:\n"
+ " ldr r3, ._100 @ gUnknown_Debug_839BDC4\n"
+ " lsl r2, r2, #0x18\n"
+ " asr r2, r2, #0x15\n"
+ " add r0, r3, #4\n"
+ " add r0, r2, r0\n"
+ " ldrb r4, [r0]\n"
+ " ldr r0, ._100 + 4 @ gSaveBlock2\n"
+ " mov r1, #0x1\n"
+ " and r1, r1, r4\n"
+ " strb r1, [r0, #0x8]\n"
+ " add r2, r2, r3\n"
+ " ldr r1, [r2]\n"
+ " bl StringCopy\n"
+ " mov r0, #0x80\n"
+ " and r4, r4, r0\n"
+ " cmp r4, #0\n"
+ " bne ._98 @cond_branch\n"
+ " mov r0, #0x0\n"
+ " bl debug_sub_8057508\n"
+ " b ._99\n"
+ "._101:\n"
+ " .align 2, 0\n"
+ "._100:\n"
+ " .word gUnknown_Debug_839BDC4\n"
+ " .word gSaveBlock2\n"
+ "._98:\n"
+ " mov r0, #0x1\n"
+ " bl debug_sub_8057508\n"
+ "._99:\n"
+ " add r0, r5, #0\n"
+ " bl DestroyTask\n"
+ " ldr r0, ._102 @ debug_sub_8058C00\n"
+ " bl SetMainCallback2\n"
+ "._97:\n"
+ " pop {r4, r5}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._103:\n"
+ " .align 2, 0\n"
+ "._102:\n"
+ " .word debug_sub_8058C00+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8076FEC()
+{
+ asm(
+ " push {lr}\n"
+ " bl DebugMenu_8076EF4\n"
+ " ldr r0, ._104 @ DebugMenu_8076F60\n"
+ " mov r1, #0xa\n"
+ " bl CreateTask\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._105:\n"
+ " .align 2, 0\n"
+ "._104:\n"
+ " .word DebugMenu_8076F60+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077004()
+{
+ asm(
+ " ldr r2, ._106 @ gUnknown_030006C4\n"
+ " ldr r0, ._106 + 4 @ gUnknown_030006C1\n"
+ " ldrb r0, [r0]\n"
+ " lsl r0, r0, #0x3\n"
+ " ldr r1, ._106 + 8 @ gUnknown_Debug_839BB64\n"
+ " add r0, r0, r1\n"
+ " str r0, [r2]\n"
+ " bx lr\n"
+ "._107:\n"
+ " .align 2, 0\n"
+ "._106:\n"
+ " .word gUnknown_030006C4 \n"
+ " .word gUnknown_030006C1 \n"
+ " .word gUnknown_Debug_839BB64\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077020()
+{
+ asm(
+ " push {r4, lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r4, r0, #0x18\n"
+ " ldr r0, ._109 @ gMenuCallback\n"
+ " ldr r0, [r0]\n"
+ " bl _call_via_r0\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " cmp r0, #0x1\n"
+ " bne ._108 @cond_branch\n"
+ " add r0, r4, #0\n"
+ " bl DestroyTask\n"
+ "._108:\n"
+ " pop {r4}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._110:\n"
+ " .align 2, 0\n"
+ "._109:\n"
+ " .word gMenuCallback\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077048()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r0, ._111 @ gMenuCallback\n"
+ " ldr r1, ._111 + 4 @ DebugMenu_807706C\n"
+ " str r1, [r0]\n"
+ " bl ScriptContext2_Enable\n"
+ " ldr r0, ._111 + 8 @ DebugMenu_8077020\n"
+ " mov r1, #0x50\n"
+ " bl CreateTask\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._112:\n"
+ " .align 2, 0\n"
+ "._111:\n"
+ " .word gMenuCallback\n"
+ " .word DebugMenu_807706C+1\n"
+ " .word DebugMenu_8077020+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_807706C()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r0, ._113 @ gWindowTemplate_81E6CE4\n"
+ " bl InitMenuWindow\n"
+ " bl DebugMenu_8077004\n"
+ " bl DebugMenu_807719C\n"
+ " bl DebugMenu_80771EC\n"
+ " bl DebugMenu_8077238\n"
+ " ldr r1, ._113 + 4 @ gMenuCallback\n"
+ " ldr r0, ._113 + 8 @ DebugMenu_807709C\n"
+ " str r0, [r1]\n"
+ " mov r0, #0x0\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._114:\n"
+ " .align 2, 0\n"
+ "._113:\n"
+ " .word gWindowTemplate_81E6CE4\n"
+ " .word gMenuCallback\n"
+ " .word DebugMenu_807709C+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_807709C()
+{
+ asm(
+ " push {r4, lr}\n"
+ " ldr r4, ._120 @ gMain\n"
+ " ldrh r1, [r4, #0x2e]\n"
+ " mov r0, #0x40\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._115 @cond_branch\n"
+ " mov r0, #0x5\n"
+ " bl PlaySE\n"
+ " mov r0, #0x1\n"
+ " neg r0, r0\n"
+ " bl Menu_MoveCursor\n"
+ " ldr r1, ._120 + 4 @ gUnknown_030006C0\n"
+ " strb r0, [r1]\n"
+ "._115:\n"
+ " ldrh r1, [r4, #0x2e]\n"
+ " mov r0, #0x80\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._116 @cond_branch\n"
+ " mov r0, #0x5\n"
+ " bl PlaySE\n"
+ " mov r0, #0x1\n"
+ " bl Menu_MoveCursor\n"
+ " ldr r1, ._120 + 4 @ gUnknown_030006C0\n"
+ " strb r0, [r1]\n"
+ "._116:\n"
+ " ldrh r1, [r4, #0x2e]\n"
+ " mov r0, #0x20\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._117 @cond_branch\n"
+ " mov r0, #0x5\n"
+ " bl PlaySE\n"
+ " ldr r1, ._120 + 8 @ gUnknown_030006C1\n"
+ " ldrb r0, [r1]\n"
+ " cmp r0, #0\n"
+ " bne ._118 @cond_branch\n"
+ " mov r0, #0x7\n"
+ " b ._119\n"
+ "._121:\n"
+ " .align 2, 0\n"
+ "._120:\n"
+ " .word gMain\n"
+ " .word gUnknown_030006C0 \n"
+ " .word gUnknown_030006C1 \n"
+ "._118:\n"
+ " sub r0, r0, #0x1\n"
+ "._119:\n"
+ " strb r0, [r1]\n"
+ " bl DebugMenu_8077004\n"
+ " bl DebugMenu_807719C\n"
+ "._117:\n"
+ " ldr r0, ._125 @ gMain\n"
+ " ldrh r1, [r0, #0x2e]\n"
+ " mov r0, #0x10\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._122 @cond_branch\n"
+ " mov r0, #0x5\n"
+ " bl PlaySE\n"
+ " ldr r1, ._125 + 4 @ gUnknown_030006C1\n"
+ " ldrb r0, [r1]\n"
+ " cmp r0, #0x7\n"
+ " bne ._123 @cond_branch\n"
+ " mov r0, #0x0\n"
+ " b ._124\n"
+ "._126:\n"
+ " .align 2, 0\n"
+ "._125:\n"
+ " .word gMain\n"
+ " .word gUnknown_030006C1 \n"
+ "._123:\n"
+ " add r0, r0, #0x1\n"
+ "._124:\n"
+ " strb r0, [r1]\n"
+ " bl DebugMenu_8077004\n"
+ " bl DebugMenu_807719C\n"
+ "._122:\n"
+ " ldr r0, ._129 @ gMain\n"
+ " ldrh r1, [r0, #0x2e]\n"
+ " mov r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._127 @cond_branch\n"
+ " mov r0, #0x5\n"
+ " bl PlaySE\n"
+ " ldr r1, ._129 + 4 @ gDebug0x839B9BC\n"
+ " ldr r0, ._129 + 8 @ gUnknown_030006C0\n"
+ " ldrb r2, [r0]\n"
+ " ldr r0, ._129 + 12 @ gUnknown_030006C4\n"
+ " ldr r0, [r0]\n"
+ " add r0, r0, r2\n"
+ " ldrb r0, [r0]\n"
+ " lsl r0, r0, #0x3\n"
+ " add r1, r1, #0x4\n"
+ " add r0, r0, r1\n"
+ " ldr r0, [r0]\n"
+ " bl _call_via_r0\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " b ._132\n"
+ "._130:\n"
+ " .align 2, 0\n"
+ "._129:\n"
+ " .word gMain\n"
+ " .word gDebug0x839B9BC\n"
+ " .word gUnknown_030006C0 \n"
+ " .word gUnknown_030006C4 \n"
+ "._127:\n"
+ " mov r0, #0xa\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " bne ._131 @cond_branch\n"
+ " mov r0, #0x0\n"
+ " b ._132\n"
+ "._131:\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ "._132:\n"
+ " pop {r4}\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_807719C()
+{
+ asm(
+ " push {r4, lr}\n"
+ " add sp, sp, #0xfffffff8\n"
+ " mov r0, #0x0\n"
+ " mov r1, #0x0\n"
+ " mov r2, #0xe\n"
+ " mov r3, #0x11\n"
+ " bl Menu_DrawStdWindowFrame\n"
+ " ldr r3, ._133 @ gDebug0x839B9BC\n"
+ " ldr r0, ._133 + 4 @ gUnknown_030006C4\n"
+ " ldr r0, [r0]\n"
+ " str r0, [sp]\n"
+ " mov r0, #0x1\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0x8\n"
+ " bl Menu_PrintItemsReordered\n"
+ " ldr r4, ._133 + 8 @ gUnknown_030006C0\n"
+ " ldrb r0, [r4]\n"
+ " str r0, [sp]\n"
+ " mov r0, #0xd\n"
+ " str r0, [sp, #0x4]\n"
+ " mov r0, #0x0\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0x1\n"
+ " mov r3, #0x8\n"
+ " bl InitMenu\n"
+ " strb r0, [r4]\n"
+ " add sp, sp, #0x8\n"
+ " pop {r4}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._134:\n"
+ " .align 2, 0\n"
+ "._133:\n"
+ " .word gDebug0x839B9BC\n"
+ " .word gUnknown_030006C4 \n"
+ " .word gUnknown_030006C0 \n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_80771EC()
+{
+ asm(
+ " push {r4, lr}\n"
+ " ldr r0, ._135 @ gStringVar4\n"
+ " ldr r1, ._135 + 4 @ Str_839BE04\n"
+ " bl StringCopy\n"
+ " ldr r4, ._135 + 8 @ gSaveBlock1\n"
+ " mov r1, #0x4\n"
+ " ldsb r1, [r4, r1]\n"
+ " mov r2, #0x1\n"
+ " mov r3, #0x3\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r1, #0x5\n"
+ " ldsb r1, [r4, r1]\n"
+ " mov r2, #0x1\n"
+ " mov r3, #0x3\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r0, #0x13\n"
+ " mov r1, #0xc\n"
+ " mov r2, #0x1d\n"
+ " mov r3, #0xf\n"
+ " bl Menu_DrawStdWindowFrame\n"
+ " ldr r0, ._135 @ gStringVar4\n"
+ " mov r1, #0x14\n"
+ " mov r2, #0xd\n"
+ " bl Menu_PrintText\n"
+ " pop {r4}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._136:\n"
+ " .align 2, 0\n"
+ "._135:\n"
+ " .word gStringVar4\n"
+ " .word Str_839BE04\n"
+ " .word gSaveBlock1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077238()
+{
+ asm(
+ " push {r4, r5, r6, r7, lr}\n"
+ " mov r7, sl\n"
+ " mov r6, r9\n"
+ " mov r5, r8\n"
+ " push {r5, r6, r7}\n"
+ " add sp, sp, #0xffffffe8\n"
+ " ldr r1, ._139 @ Str_839BE07\n"
+ " mov r0, sp\n"
+ " mov r2, #0x2\n"
+ " bl memcpy\n"
+ " add r0, sp, #0x4\n"
+ " mov r9, r0\n"
+ " ldr r1, ._139 + 4 @ Str_839BE09\n"
+ " mov r2, #0x3\n"
+ " bl memcpy\n"
+ " add r1, sp, #0x8\n"
+ " mov sl, r1\n"
+ " ldr r1, ._139 + 8 @ Str_839BE0C\n"
+ " mov r0, sl\n"
+ " mov r2, #0x3\n"
+ " bl memcpy\n"
+ " mov r2, #0x0\n"
+ " str r2, [sp, #0x14]\n"
+ " add r4, sp, #0x10\n"
+ " mov r6, sp\n"
+ " add r6, r6, #0x12\n"
+ " add r0, r4, #0\n"
+ " add r1, r6, #0\n"
+ " bl PlayerGetDestCoords\n"
+ " mov r1, #0x0\n"
+ " ldsh r0, [r4, r1]\n"
+ " mov r2, #0x0\n"
+ " ldsh r1, [r6, r2]\n"
+ " bl MapGridGetZCoordAt\n"
+ " mov r8, r0\n"
+ " mov r0, r8\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " mov r8, r0\n"
+ " ldrh r0, [r4]\n"
+ " sub r0, r0, #0x7\n"
+ " strh r0, [r4]\n"
+ " ldrh r0, [r6]\n"
+ " sub r0, r0, #0x7\n"
+ " strh r0, [r6]\n"
+ " ldr r7, ._139 + 12 @ gStringVar4\n"
+ " add r0, r7, #0\n"
+ " mov r1, sp\n"
+ " bl StringCopy\n"
+ " add r5, sp, #0xc\n"
+ " mov r2, #0x0\n"
+ " ldsh r1, [r4, r2]\n"
+ " add r0, r5, #0\n"
+ " mov r2, #0x0\n"
+ " mov r3, #0x3\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " add r0, r7, #0\n"
+ " add r1, r5, #0\n"
+ " bl StringAppend\n"
+ " add r0, r7, #0\n"
+ " mov r1, r9\n"
+ " bl StringAppend\n"
+ " mov r0, #0x0\n"
+ " ldsh r1, [r6, r0]\n"
+ " add r0, r5, #0\n"
+ " mov r2, #0x0\n"
+ " mov r3, #0x3\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " add r0, r7, #0\n"
+ " add r1, r5, #0\n"
+ " bl StringAppend\n"
+ " add r0, r7, #0\n"
+ " mov r1, sl\n"
+ " bl StringAppend\n"
+ " add r0, r5, #0\n"
+ " mov r1, r8\n"
+ " mov r2, #0x0\n"
+ " mov r3, #0x2\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " add r0, r7, #0\n"
+ " add r1, r5, #0\n"
+ " bl StringAppend\n"
+ " ldrb r0, [r7]\n"
+ " cmp r0, #0xff\n"
+ " beq ._137 @cond_branch\n"
+ " add r1, r7, #0\n"
+ "._138:\n"
+ " ldr r0, [sp, #0x14]\n"
+ " add r0, r0, #0x1\n"
+ " lsl r0, r0, #0x10\n"
+ " lsr r0, r0, #0x10\n"
+ " str r0, [sp, #0x14]\n"
+ " add r0, r0, r1\n"
+ " ldrb r0, [r0]\n"
+ " cmp r0, #0xff\n"
+ " bne ._138 @cond_branch\n"
+ "._137:\n"
+ " mov r0, #0x1c\n"
+ " ldr r1, [sp, #0x14]\n"
+ " sub r0, r0, r1\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " mov r1, #0x10\n"
+ " mov r2, #0x1d\n"
+ " mov r3, #0x13\n"
+ " bl Menu_DrawStdWindowFrame\n"
+ " ldr r0, ._139 + 12 @ gStringVar4\n"
+ " mov r1, #0x1d\n"
+ " ldr r2, [sp, #0x14]\n"
+ " sub r1, r1, r2\n"
+ " lsl r1, r1, #0x18\n"
+ " lsr r1, r1, #0x18\n"
+ " mov r2, #0x11\n"
+ " bl Menu_PrintText\n"
+ " add sp, sp, #0x18\n"
+ " pop {r3, r4, r5}\n"
+ " mov r8, r3\n"
+ " mov r9, r4\n"
+ " mov sl, r5\n"
+ " pop {r4, r5, r6, r7}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._140:\n"
+ " .align 2, 0\n"
+ "._139:\n"
+ " .word Str_839BE07\n"
+ " .word Str_839BE09\n"
+ " .word Str_839BE0C\n"
+ " .word gStringVar4\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_Exit()
+{
+ asm(
+ " push {lr}\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_OpenSogabe()
+{
+ asm(
+ " push {lr}\n"
+ " bl unref_sub_814A414\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_OpenTamada()
+{
+ asm(
+ " push {lr}\n"
+ " bl debug_sub_8075C30\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_OpenKagaya()
+{
+ asm(
+ " push {lr}\n"
+ " bl InitKagayaDebugMenu_A\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_OpenMatsuda()
+{
+ asm(
+ " push {lr}\n"
+ " bl unref_sub_80A9B28\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_OpenNohara()
+{
+ asm(
+ " push {lr}\n"
+ " bl InitNoharaDebugMenu\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_OpenWatanabe()
+{
+ asm(
+ " push {lr}\n"
+ " bl CloseMenu\n"
+ " ldr r0, ._141 @ InitWatanabeDebugMenu\n"
+ " bl SetMainCallback2\n"
+ " bl ScriptContext2_Enable\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._142:\n"
+ " .align 2, 0\n"
+ "._141:\n"
+ " .word InitWatanabeDebugMenu+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_EndSequenceDemo()
+{
+ asm(
+ " push {lr}\n"
+ " bl CloseMenu\n"
+ " ldr r0, ._143 @ sub_81439D0\n"
+ " bl SetMainCallback2\n"
+ " bl ScriptContext2_Enable\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._144:\n"
+ " .align 2, 0\n"
+ "._143:\n"
+ " .word sub_81439D0+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_HallOfFame()
+{
+ asm(
+ " push {lr}\n"
+ " bl CloseMenu\n"
+ " bl GameClear\n"
+ " bl ScriptContext2_Enable\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_OpenSizeComparison()
+{
+ asm(
+ " push {lr}\n"
+ " bl CloseMenu\n"
+ " bl InitSizeComparison\n"
+ " bl ScriptContext2_Enable\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_HoennNationalDex()
+{
+ asm(
+ " push {lr}\n"
+ " bl IsNationalPokedexEnabled\n"
+ " cmp r0, #0\n"
+ " beq ._145 @cond_branch\n"
+ " bl DisableNationalPokedex\n"
+ " b ._146\n"
+ "._145:\n"
+ " bl EnableNationalPokedex\n"
+ "._146:\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_8077434()
+{
+ asm(
+ " push {lr}\n"
+ " add sp, sp, #0xfffffff8\n"
+ " bl Menu_GetCursorPos\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " cmp r0, #0x4\n"
+ " bhi ._165 @cond_branch\n"
+ " lsl r0, r0, #0x2\n"
+ " ldr r1, ._149 @ \n"
+ " add r0, r0, r1\n"
+ " ldr r0, [r0]\n"
+ " mov pc, r0\n"
+ "._150:\n"
+ " .align 2, 0\n"
+ "._149:\n"
+ " .word ._148\n"
+ "._148:\n"
+ " .word ._151\n"
+ " .word ._152\n"
+ " .word ._153\n"
+ " .word ._154\n"
+ " .word ._155\n"
+ "._151:\n"
+ " ldr r0, ._157 @ Str_839BE0F\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0x4\n"
+ " bl debug_sub_80C2C18\n"
+ " mov r0, #0xff\n"
+ " str r0, [sp]\n"
+ " str r0, [sp, #0x4]\n"
+ " mov r1, #0xff\n"
+ " mov r2, #0xff\n"
+ " mov r3, #0x0\n"
+ " bl debug_sub_80C2D24\n"
+ " b ._165\n"
+ "._158:\n"
+ " .align 2, 0\n"
+ "._157:\n"
+ " .word Str_839BE0F\n"
+ "._152:\n"
+ " ldr r0, ._160 @ Str_839BE12\n"
+ " mov r1, #0x2\n"
+ " mov r2, #0x0\n"
+ " bl debug_sub_80C2C18\n"
+ " mov r0, #0xff\n"
+ " str r0, [sp]\n"
+ " str r0, [sp, #0x4]\n"
+ " mov r1, #0xff\n"
+ " mov r2, #0x0\n"
+ " b ._159\n"
+ "._161:\n"
+ " .align 2, 0\n"
+ "._160:\n"
+ " .word Str_839BE12\n"
+ "._153:\n"
+ " ldr r0, ._163 @ Str_839BE16\n"
+ " mov r1, #0x3\n"
+ " mov r2, #0x0\n"
+ " bl debug_sub_80C2C18\n"
+ " mov r0, #0xff\n"
+ " str r0, [sp]\n"
+ " str r0, [sp, #0x4]\n"
+ " mov r1, #0x0\n"
+ " b ._162\n"
+ "._164:\n"
+ " .align 2, 0\n"
+ "._163:\n"
+ " .word Str_839BE16\n"
+ "._154:\n"
+ " ldr r0, ._166 @ Str_839BE1A\n"
+ " mov r1, #0x4\n"
+ " mov r2, #0x0\n"
+ " bl debug_sub_80C2C18\n"
+ " mov r0, #0xff\n"
+ " str r0, [sp]\n"
+ " str r0, [sp, #0x4]\n"
+ " mov r0, #0x0\n"
+ " mov r1, #0xff\n"
+ "._162:\n"
+ " mov r2, #0xff\n"
+ "._159:\n"
+ " mov r3, #0xff\n"
+ " bl debug_sub_80C2D24\n"
+ " b ._165\n"
+ "._167:\n"
+ " .align 2, 0\n"
+ "._166:\n"
+ " .word Str_839BE1A\n"
+ "._155:\n"
+ " ldr r0, ._168 @ Str_839BE1E\n"
+ " mov r1, #0x4\n"
+ " mov r2, #0x0\n"
+ " bl debug_sub_80C2C18\n"
+ " mov r0, #0xff\n"
+ " str r0, [sp]\n"
+ " str r0, [sp, #0x4]\n"
+ " mov r1, #0xff\n"
+ " mov r2, #0xff\n"
+ " mov r3, #0xff\n"
+ " bl debug_sub_80C2D24\n"
+ "._165:\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ " add sp, sp, #0x8\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._169:\n"
+ " .align 2, 0\n"
+ "._168:\n"
+ " .word Str_839BE1E\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_807750C()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r0, ._170 @ gUnknown_Debug_839BE24\n"
+ " bl DebugMenu_8077D78\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._171:\n"
+ " .align 2, 0\n"
+ "._170:\n"
+ " .word gUnknown_Debug_839BE24\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_SetRamBerry()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r0, ._172 @ gUnknown_Debug_839BE24\n"
+ " mov r1, #0xc\n"
+ " mov r2, #0x5\n"
+ " bl DebugMenu_8077D24\n"
+ " ldr r1, ._172 + 4 @ gMenuCallback\n"
+ " ldr r0, ._172 + 8 @ DebugMenu_807750C\n"
+ " str r0, [r1]\n"
+ " mov r0, #0x0\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._173:\n"
+ " .align 2, 0\n"
+ "._172:\n"
+ " .word gUnknown_Debug_839BE24\n"
+ " .word gMenuCallback\n"
+ " .word DebugMenu_807750C+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_ToggleBGM()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r2, ._175 @ gDisableMusic\n"
+ " mov r1, #0x0\n"
+ " ldrb r0, [r2]\n"
+ " cmp r0, #0\n"
+ " bne ._174 @cond_branch\n"
+ " mov r1, #0x1\n"
+ "._174:\n"
+ " strb r1, [r2]\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._176:\n"
+ " .align 2, 0\n"
+ "._175:\n"
+ " .word gDisableMusic\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_BattleForDebug()
+{
+ asm(
+ " push {lr}\n"
+ " bl CloseMenu\n"
+ " bl InitBattleForDebug\n"
+ " bl ScriptContext2_Enable\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_NationalDex()
+{
+ asm(
+ " push {r4, r5, lr}\n"
+ " mov r4, #0x0\n"
+ " ldr r5, ._178 @ 0x181\n"
+ "._177:\n"
+ " add r4, r4, #0x1\n"
+ " lsl r4, r4, #0x10\n"
+ " lsr r4, r4, #0x10\n"
+ " add r0, r4, #0\n"
+ " mov r1, #0x2\n"
+ " bl GetSetPokedexFlag\n"
+ " add r0, r4, #0\n"
+ " mov r1, #0x3\n"
+ " bl GetSetPokedexFlag\n"
+ " cmp r4, r5\n"
+ " bls ._177 @cond_branch\n"
+ " ldr r1, ._178 + 4 @ gUnknown_03005CE8\n"
+ " mov r0, #0x1\n"
+ " strb r0, [r1]\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ " pop {r4, r5}\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._179:\n"
+ " .align 2, 0\n"
+ "._178:\n"
+ " .word 0x181\n"
+ " .word gUnknown_03005CE8\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_HoennDex()
+{
+ asm(
+ " push {r4, r5, lr}\n"
+ " mov r5, #0x0\n"
+ "._180:\n"
+ " add r5, r5, #0x1\n"
+ " lsl r5, r5, #0x10\n"
+ " lsr r5, r5, #0x10\n"
+ " add r0, r5, #0\n"
+ " bl HoennToNationalOrder\n"
+ " add r4, r0, #0\n"
+ " lsl r4, r4, #0x10\n"
+ " lsr r4, r4, #0x10\n"
+ " add r0, r4, #0\n"
+ " mov r1, #0x2\n"
+ " bl GetSetPokedexFlag\n"
+ " add r0, r4, #0\n"
+ " mov r1, #0x3\n"
+ " bl GetSetPokedexFlag\n"
+ " cmp r5, #0xc9\n"
+ " bls ._180 @cond_branch\n"
+ " ldr r1, ._181 @ gUnknown_03005CE8\n"
+ " mov r0, #0x1\n"
+ " strb r0, [r1]\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ " pop {r4, r5}\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._182:\n"
+ " .align 2, 0\n"
+ "._181:\n"
+ " .word gUnknown_03005CE8\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_CreatePKMN()
+{
+ asm(
+ " push {lr}\n"
+ " bl CloseMenu\n"
+ " bl InitCreatePokemon\n"
+ " bl ScriptContext2_Enable\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_ViewPokemonGraphics()
+{
+ asm(
+ " push {lr}\n"
+ " bl CloseMenu\n"
+ " bl InitSeePokemonGraphics\n"
+ " bl ScriptContext2_Enable\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_OpenSeeTrainers()
+{
+ asm(
+ " push {lr}\n"
+ " bl CloseMenu\n"
+ " bl InitSeeTrainers\n"
+ " bl ScriptContext2_Enable\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_OpenMori()
+{
+ asm(
+ " push {lr}\n"
+ " bl InitMoriDebugMenu\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_OpenTomomichi()
+{
+ asm(
+ " push {lr}\n"
+ " bl InitTomomichiDebugWindow\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_OpenAoki()
+{
+ asm(
+ " push {lr}\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_OpenTaya()
+{
+ asm(
+ " push {lr}\n"
+ " bl InitTayaDebugWindow\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_OpenNakamura()
+{
+ asm(
+ " push {lr}\n"
+ " bl InitNakamuraDebugMenu\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_OpenIwasawa()
+{
+ asm(
+ " push {lr}\n"
+ " bl debug_sub_8138CC4\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_Teleport()
+{
+ asm(
+ " push {lr}\n"
+ " bl Overworld_SetWarpDestToLastHealLoc\n"
+ " bl sub_8080E88\n"
+ " bl ScriptContext2_Enable\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_EditPKMN()
+{
+ asm(
+ " push {lr}\n"
+ " bl Menu_EraseScreen\n"
+ " bl debug_sub_815FFDC\n"
+ " mov r0, #0x0\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_80776B4()
+{
+ asm(
+ " push {r4, r5, lr}\n"
+ " add sp, sp, #0xfffffff8\n"
+ " add r4, r0, #0\n"
+ " lsl r4, r4, #0x18\n"
+ " lsr r4, r4, #0x18\n"
+ " ldr r1, ._183 @ Str_839BE4C\n"
+ " mov r0, sp\n"
+ " mov r2, #0x7\n"
+ " bl memcpy\n"
+ " lsl r3, r4, #0x1\n"
+ " lsl r5, r4, #0x19\n"
+ " lsr r5, r5, #0x18\n"
+ " add r3, r3, #0x1\n"
+ " lsl r3, r3, #0x18\n"
+ " lsr r3, r3, #0x18\n"
+ " mov r0, #0x19\n"
+ " add r1, r5, #0\n"
+ " mov r2, #0x1d\n"
+ " bl Menu_BlankWindowRect\n"
+ " ldr r0, ._183 + 4 @ gUnknown_030006C8\n"
+ " ldrb r0, [r0]\n"
+ " ASR r0, r4\n"
+ " mov r1, #0x1\n"
+ " and r0, r0, r1\n"
+ " lsl r0, r0, #0x2\n"
+ " add r0, r0, sp\n"
+ " mov r1, #0x19\n"
+ " add r2, r5, #0\n"
+ " bl Menu_PrintText\n"
+ " add sp, sp, #0x8\n"
+ " pop {r4, r5}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._184:\n"
+ " .align 2, 0\n"
+ "._183:\n"
+ " .word Str_839BE4C\n"
+ " .word gUnknown_030006C8 \n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077704()
+{
+ asm(
+ " push {lr}\n"
+ " add sp, sp, #0xffffffec\n"
+ " ldr r1, ._185 @ Str_839BE53\n"
+ " mov r0, sp\n"
+ " mov r2, #0x11\n"
+ " bl memcpy\n"
+ " mov r0, #0x13\n"
+ " mov r1, #0x0\n"
+ " mov r2, #0x1d\n"
+ " mov r3, #0x8\n"
+ " bl Menu_BlankWindowRect\n"
+ " mov r0, sp\n"
+ " mov r1, #0x15\n"
+ " mov r2, #0x0\n"
+ " bl Menu_PrintText\n"
+ " ldr r2, ._185 + 4 @ gUnknown_030006C8\n"
+ " mov r0, #0x80\n"
+ " lsl r0, r0, #0x13\n"
+ " ldrh r0, [r0]\n"
+ " lsr r0, r0, #0x8\n"
+ " mov r1, #0xf\n"
+ " and r0, r0, r1\n"
+ " strb r0, [r2]\n"
+ " mov r0, #0x0\n"
+ " bl DebugMenu_80776B4\n"
+ " mov r0, #0x1\n"
+ " bl DebugMenu_80776B4\n"
+ " mov r0, #0x2\n"
+ " bl DebugMenu_80776B4\n"
+ " mov r0, #0x3\n"
+ " bl DebugMenu_80776B4\n"
+ " add sp, sp, #0x14\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._186:\n"
+ " .align 2, 0\n"
+ "._185:\n"
+ " .word Str_839BE53\n"
+ " .word gUnknown_030006C8 \n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_8077760()
+{
+ asm(
+ " push {r4, r5, lr}\n"
+ " ldr r2, ._190 @ gMain\n"
+ " ldrh r1, [r2, #0x2e]\n"
+ " mov r0, #0x40\n"
+ " and r0, r0, r1\n"
+ " add r5, r2, #0\n"
+ " cmp r0, #0\n"
+ " beq ._187 @cond_branch\n"
+ " mov r0, #0x5\n"
+ " bl PlaySE\n"
+ " mov r0, #0x1\n"
+ " neg r0, r0\n"
+ " bl Menu_MoveCursor\n"
+ " ldr r1, ._190 + 4 @ gUnknown_030006B8\n"
+ " ldrb r0, [r1]\n"
+ " cmp r0, #0\n"
+ " beq ._188 @cond_branch\n"
+ " sub r0, r0, #0x1\n"
+ " b ._189\n"
+ "._191:\n"
+ " .align 2, 0\n"
+ "._190:\n"
+ " .word gMain\n"
+ " .word gUnknown_030006B8 \n"
+ "._188:\n"
+ " mov r0, #0x3\n"
+ "._189:\n"
+ " strb r0, [r1]\n"
+ "._187:\n"
+ " ldrh r1, [r5, #0x2e]\n"
+ " mov r0, #0x80\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._192 @cond_branch\n"
+ " mov r0, #0x5\n"
+ " bl PlaySE\n"
+ " mov r0, #0x1\n"
+ " bl Menu_MoveCursor\n"
+ " ldr r1, ._195 @ gUnknown_030006B8\n"
+ " ldrb r0, [r1]\n"
+ " cmp r0, #0x3\n"
+ " beq ._193 @cond_branch\n"
+ " add r0, r0, #0x1\n"
+ " b ._194\n"
+ "._196:\n"
+ " .align 2, 0\n"
+ "._195:\n"
+ " .word gUnknown_030006B8 \n"
+ "._193:\n"
+ " mov r0, #0x0\n"
+ "._194:\n"
+ " strb r0, [r1]\n"
+ "._192:\n"
+ " ldrh r1, [r5, #0x2e]\n"
+ " mov r0, #0x30\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._197 @cond_branch\n"
+ " mov r0, #0x5\n"
+ " bl PlaySE\n"
+ " ldr r4, ._201 @ gUnknown_030006C8\n"
+ " bl Menu_GetCursorPos\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " mov r1, #0x1\n"
+ " LSL r1, r0\n"
+ " ldrb r0, [r4]\n"
+ " eor r1, r1, r0\n"
+ " strb r1, [r4]\n"
+ " bl Menu_GetCursorPos\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " bl DebugMenu_80776B4\n"
+ "._197:\n"
+ " ldrh r2, [r5, #0x2e]\n"
+ " mov r0, #0x1\n"
+ " and r0, r0, r2\n"
+ " cmp r0, #0\n"
+ " bne ._198 @cond_branch\n"
+ " mov r0, #0x2\n"
+ " and r0, r0, r2\n"
+ " cmp r0, #0\n"
+ " beq ._199 @cond_branch\n"
+ "._198:\n"
+ " mov r2, #0x80\n"
+ " lsl r2, r2, #0x13\n"
+ " ldrh r0, [r2]\n"
+ " ldr r1, ._201 + 4 @ 0xf0ff\n"
+ " and r1, r1, r0\n"
+ " ldr r0, ._201 @ gUnknown_030006C8\n"
+ " ldrb r0, [r0]\n"
+ " lsl r0, r0, #0x8\n"
+ " add r1, r1, r0\n"
+ " strh r1, [r2]\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ " b ._200\n"
+ "._202:\n"
+ " .align 2, 0\n"
+ "._201:\n"
+ " .word gUnknown_030006C8 \n"
+ " .word 0xf0ff\n"
+ "._199:\n"
+ " mov r0, #0x0\n"
+ "._200:\n"
+ " pop {r4, r5}\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_SwitchBG()
+{
+ asm(
+ " push {lr}\n"
+ " add sp, sp, #0xfffffff8\n"
+ " bl Menu_EraseScreen\n"
+ " bl DebugMenu_8077704\n"
+ " mov r0, #0x0\n"
+ " str r0, [sp]\n"
+ " mov r0, #0x6\n"
+ " str r0, [sp, #0x4]\n"
+ " mov r0, #0x0\n"
+ " mov r1, #0x14\n"
+ " mov r2, #0x0\n"
+ " mov r3, #0x4\n"
+ " bl InitMenu\n"
+ " ldr r1, ._203 @ gMenuCallback\n"
+ " ldr r0, ._203 + 4 @ DebugMenu_8077760\n"
+ " str r0, [r1]\n"
+ " mov r0, #0x0\n"
+ " add sp, sp, #0x8\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._204:\n"
+ " .align 2, 0\n"
+ "._203:\n"
+ " .word gMenuCallback\n"
+ " .word DebugMenu_8077760+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_807786C()
+{
+ asm(
+ " push {r4, lr}\n"
+ " add sp, sp, #0xfffffff8\n"
+ " add r4, r0, #0\n"
+ " lsl r4, r4, #0x18\n"
+ " lsr r4, r4, #0x18\n"
+ " ldr r1, ._205 @ Str_839BE64\n"
+ " mov r0, sp\n"
+ " mov r2, #0x7\n"
+ " bl memcpy\n"
+ " mov r0, #0x19\n"
+ " mov r1, #0x0\n"
+ " mov r2, #0x1d\n"
+ " mov r3, #0x3\n"
+ " bl Menu_DrawStdWindowFrame\n"
+ " lsl r0, r4, #0x1\n"
+ " add r0, r0, r4\n"
+ " add r0, r0, sp\n"
+ " mov r1, #0x1a\n"
+ " mov r2, #0x1\n"
+ " bl Menu_PrintText\n"
+ " add sp, sp, #0x8\n"
+ " pop {r4}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._206:\n"
+ " .align 2, 0\n"
+ "._205:\n"
+ " .word Str_839BE64\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_80778A8()
+{
+ asm(
+ " push {r4, lr}\n"
+ " ldr r4, ._211 @ gMain\n"
+ " ldrh r1, [r4, #0x2e]\n"
+ " mov r0, #0x30\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._207 @cond_branch\n"
+ " mov r0, #0x5\n"
+ " bl PlaySE\n"
+ " ldr r2, ._211 + 4 @ sWildEncountersDisabled\n"
+ " ldrb r0, [r2]\n"
+ " mov r1, #0x1\n"
+ " eor r0, r0, r1\n"
+ " strb r0, [r2]\n"
+ " ldrb r0, [r2]\n"
+ " bl DebugMenu_807786C\n"
+ "._207:\n"
+ " ldrh r1, [r4, #0x2e]\n"
+ " mov r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " bne ._208 @cond_branch\n"
+ " mov r0, #0x2\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._209 @cond_branch\n"
+ "._208:\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ " b ._210\n"
+ "._212:\n"
+ " .align 2, 0\n"
+ "._211:\n"
+ " .word gMain\n"
+ " .word sWildEncountersDisabled\n"
+ "._209:\n"
+ " mov r0, #0x0\n"
+ "._210:\n"
+ " pop {r4}\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_ControlEncounter()
+{
+ asm(
+ " push {lr}\n"
+ " bl Menu_EraseScreen\n"
+ " ldr r0, ._213 @ sWildEncountersDisabled\n"
+ " ldrb r0, [r0]\n"
+ " bl DebugMenu_807786C\n"
+ " ldr r1, ._213 + 4 @ gMenuCallback\n"
+ " ldr r0, ._213 + 8 @ DebugMenu_80778A8\n"
+ " str r0, [r1]\n"
+ " mov r0, #0x0\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._214:\n"
+ " .align 2, 0\n"
+ "._213:\n"
+ " .word sWildEncountersDisabled\n"
+ " .word gMenuCallback\n"
+ " .word DebugMenu_80778A8+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_UseHM()
+{
+ asm(
+ " ldr r1, ._215 @ gMenuCallback\n"
+ " ldr r0, ._215 + 4 @ DebugMenu_8077C14\n"
+ " str r0, [r1]\n"
+ " mov r0, #0x0\n"
+ " bx lr\n"
+ "._216:\n"
+ " .align 2, 0\n"
+ "._215:\n"
+ " .word gMenuCallback\n"
+ " .word DebugMenu_8077C14+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077934()
+{
+ asm(
+ " push {lr}\n"
+ " mov r1, #0x0\n"
+ " ldr r3, ._218 @ gSaveBlock1\n"
+ " mov r2, #0x1\n"
+ "._217:\n"
+ " add r0, r1, r3\n"
+ " strb r2, [r0]\n"
+ " add r1, r1, #0x1\n"
+ " cmp r1, #0x63\n"
+ " bls ._217 @cond_branch\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._219:\n"
+ " .align 2, 0\n"
+ "._218:\n"
+ " .word gSaveBlock1+0x97a\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077954()
+{
+ asm(
+ " push {lr}\n"
+ " mov r1, #0x0\n"
+ " ldr r3, ._222 @ gSaveBlock1\n"
+ " mov r2, #0x0\n"
+ "._221:\n"
+ " add r0, r1, r3\n"
+ " strb r2, [r0]\n"
+ " add r1, r1, #0x1\n"
+ " cmp r1, #0x63\n"
+ " bls ._221 @cond_branch\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._223:\n"
+ " .align 2, 0\n"
+ "._222:\n"
+ " .word gSaveBlock1+0x97a\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077974()
+{
+ asm(
+ " push {lr}\n"
+ " bl Menu_EraseScreen\n"
+ " ldr r1, ._226 @ gSaveBlock1\n"
+ " mov r0, #0x4\n"
+ " ldsb r0, [r1, r0]\n"
+ " lsl r0, r0, #0x10\n"
+ " lsr r0, r0, #0x10\n"
+ " ldrb r1, [r1, #0x5]\n"
+ " lsl r1, r1, #0x18\n"
+ " asr r1, r1, #0x18\n"
+ " lsl r1, r1, #0x10\n"
+ " lsr r1, r1, #0x10\n"
+ " bl IsRematchTrainerIn\n"
+ " cmp r0, #0\n"
+ " beq ._224 @cond_branch\n"
+ " ldr r0, ._226 + 4 @ gStringVar1\n"
+ " ldr r1, ._226 + 8 @ Str_839BE8D\n"
+ " bl StringCopy\n"
+ " b ._225\n"
+ "._227:\n"
+ " .align 2, 0\n"
+ "._226:\n"
+ " .word gSaveBlock1\n"
+ " .word gStringVar1\n"
+ " .word Str_839BE8D\n"
+ "._224:\n"
+ " ldr r0, ._230 @ gStringVar1\n"
+ " ldr r1, ._230 + 4 @ Str_839BE90\n"
+ " bl StringCopy\n"
+ "._225:\n"
+ " ldr r1, ._230 + 8 @ gSaveBlock1\n"
+ " mov r0, #0x4\n"
+ " ldsb r0, [r1, r0]\n"
+ " lsl r0, r0, #0x10\n"
+ " lsr r0, r0, #0x10\n"
+ " ldrb r1, [r1, #0x5]\n"
+ " lsl r1, r1, #0x18\n"
+ " asr r1, r1, #0x18\n"
+ " lsl r1, r1, #0x10\n"
+ " lsr r1, r1, #0x10\n"
+ " bl DoesSomeoneWantRematchIn\n"
+ " cmp r0, #0\n"
+ " beq ._228 @cond_branch\n"
+ " ldr r0, ._230 + 12 @ gStringVar2\n"
+ " ldr r1, ._230 + 16 @ Str_839BE8D\n"
+ " bl StringCopy\n"
+ " b ._229\n"
+ "._231:\n"
+ " .align 2, 0\n"
+ "._230:\n"
+ " .word gStringVar1\n"
+ " .word Str_839BE90\n"
+ " .word gSaveBlock1\n"
+ " .word gStringVar2\n"
+ " .word Str_839BE8D\n"
+ "._228:\n"
+ " ldr r0, ._232 @ gStringVar2\n"
+ " ldr r1, ._232 + 4 @ Str_839BE90\n"
+ " bl StringCopy\n"
+ "._229:\n"
+ " ldr r0, ._232 + 8 @ Str_839BE6B\n"
+ " bl sub_8071F40\n"
+ " ldr r1, ._232 + 12 @ gMenuCallback\n"
+ " ldr r0, ._232 + 16 @ DebugMenu_8077DB4\n"
+ " str r0, [r1]\n"
+ " mov r0, #0x0\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._233:\n"
+ " .align 2, 0\n"
+ "._232:\n"
+ " .word gStringVar2\n"
+ " .word Str_839BE90\n"
+ " .word Str_839BE6B\n"
+ " .word gMenuCallback\n"
+ " .word DebugMenu_8077DB4+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077A20()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r0, ._234 @ gSaveBlock1\n"
+ " ldr r1, ._234 + 4 @ 0x978\n"
+ " add r0, r0, r1\n"
+ " mov r1, #0xff\n"
+ " strh r1, [r0]\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._235:\n"
+ " .align 2, 0\n"
+ "._234:\n"
+ " .word gSaveBlock1\n"
+ " .word 0x978\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077A40()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r0, ._236 @ gSaveBlock1\n"
+ " ldr r1, ._236 + 4 @ 0x978\n"
+ " add r0, r0, r1\n"
+ " mov r1, #0x0\n"
+ " strh r1, [r0]\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._237:\n"
+ " .align 2, 0\n"
+ "._236:\n"
+ " .word gSaveBlock1\n"
+ " .word 0x978\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077A60()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r0, ._238 @ gUnknown_Debug_839BEE4\n"
+ " bl DebugMenu_8077D78\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._239:\n"
+ " .align 2, 0\n"
+ "._238:\n"
+ " .word gUnknown_Debug_839BEE4\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_RematchTrainers()
+{
+ asm(
+ " push {lr}\n"
+ " bl Menu_EraseScreen\n"
+ " ldr r0, ._240 @ gUnknown_Debug_839BEE4\n"
+ " mov r1, #0xd\n"
+ " mov r2, #0x5\n"
+ " bl DebugMenu_8077D24\n"
+ " ldr r1, ._240 + 4 @ gMenuCallback\n"
+ " ldr r0, ._240 + 8 @ DebugMenu_8077A60\n"
+ " str r0, [r1]\n"
+ " mov r0, #0x0\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._241:\n"
+ " .align 2, 0\n"
+ "._240:\n"
+ " .word gUnknown_Debug_839BEE4\n"
+ " .word gMenuCallback\n"
+ " .word DebugMenu_8077A60+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077A9C()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r1, ._242 @ gNumSafariBalls\n"
+ " mov r0, #0x1e\n"
+ " strb r0, [r1]\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._243:\n"
+ " .align 2, 0\n"
+ "._242:\n"
+ " .word gNumSafariBalls\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077AB4()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r1, ._244 @ gNumSafariBalls\n"
+ " mov r0, #0x1\n"
+ " strb r0, [r1]\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._245:\n"
+ " .align 2, 0\n"
+ "._244:\n"
+ " .word gNumSafariBalls\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077ACC()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r1, ._246 @ gSafariZoneStepCounter\n"
+ " mov r2, #0xfa\n"
+ " lsl r2, r2, #0x1\n"
+ " add r0, r2, #0\n"
+ " strh r0, [r1]\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._247:\n"
+ " .align 2, 0\n"
+ "._246:\n"
+ " .word gSafariZoneStepCounter\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077AE8()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r1, ._248 @ gSafariZoneStepCounter\n"
+ " mov r0, #0x1\n"
+ " strh r0, [r1]\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._249:\n"
+ " .align 2, 0\n"
+ "._248:\n"
+ " .word gSafariZoneStepCounter\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077B00()
+{
+ asm(
+ " push {lr}\n"
+ " bl Menu_EraseScreen\n"
+ " bl unref_sub_80C853C\n"
+ " cmp r0, #0\n"
+ " beq ._250 @cond_branch\n"
+ " ldr r0, ._252 @ Str_839BF14\n"
+ " bl sub_8071F40\n"
+ " b ._251\n"
+ "._253:\n"
+ " .align 2, 0\n"
+ "._252:\n"
+ " .word Str_839BF14\n"
+ "._250:\n"
+ " ldr r0, ._254 @ Str_839BF1F\n"
+ " bl sub_8071F40\n"
+ "._251:\n"
+ " ldr r1, ._254 + 4 @ gMenuCallback\n"
+ " ldr r0, ._254 + 8 @ DebugMenu_8077DB4\n"
+ " str r0, [r1]\n"
+ " mov r0, #0x0\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._255:\n"
+ " .align 2, 0\n"
+ "._254:\n"
+ " .word Str_839BF1F\n"
+ " .word gMenuCallback\n"
+ " .word DebugMenu_8077DB4+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077B3C()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r0, ._256 @ gUnknown_Debug_839BF6C\n"
+ " bl DebugMenu_8077D78\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._257:\n"
+ " .align 2, 0\n"
+ "._256:\n"
+ " .word gUnknown_Debug_839BF6C\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_Safari()
+{
+ asm(
+ " push {lr}\n"
+ " bl GetSafariZoneFlag\n"
+ " cmp r0, #0\n"
+ " beq ._258 @cond_branch\n"
+ " bl Menu_EraseScreen\n"
+ " ldr r0, ._260 @ gUnknown_Debug_839BF6C\n"
+ " mov r1, #0xe\n"
+ " mov r2, #0x5\n"
+ " bl DebugMenu_8077D24\n"
+ " ldr r0, ._260 + 4 @ gStringVar1\n"
+ " ldr r1, ._260 + 8 @ gSafariZoneStepCounter\n"
+ " ldrh r1, [r1]\n"
+ " mov r2, #0x1\n"
+ " mov r3, #0x3\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " ldr r0, ._260 + 12 @ Str_839BF0C\n"
+ " bl sub_8071F40\n"
+ " ldr r1, ._260 + 16 @ gMenuCallback\n"
+ " ldr r0, ._260 + 20 @ DebugMenu_8077B3C\n"
+ " str r0, [r1]\n"
+ " bl ScriptContext2_Enable\n"
+ " mov r0, #0x0\n"
+ " b ._259\n"
+ "._261:\n"
+ " .align 2, 0\n"
+ "._260:\n"
+ " .word gUnknown_Debug_839BF6C\n"
+ " .word gStringVar1\n"
+ " .word gSafariZoneStepCounter\n"
+ " .word Str_839BF0C\n"
+ " .word gMenuCallback\n"
+ " .word DebugMenu_8077B3C+1\n"
+ "._258:\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x16\n"
+ " bl PlaySE\n"
+ " mov r0, #0x1\n"
+ "._259:\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077BB4()
+{
+ asm(
+ " push {lr}\n"
+ " bl debug_sub_80AFEE4\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077BC0()
+{
+ asm(
+ " push {lr}\n"
+ " bl debug_sub_8122080\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077BCC()
+{
+ asm(
+ " push {lr}\n"
+ " bl debug_sub_8120968\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077BD8()
+{
+ asm(
+ " push {lr}\n"
+ " bl debug_sub_8130318\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077BE4()
+{
+ asm(
+ " push {lr}\n"
+ " bl debug_sub_80986AC\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077BF4()
+{
+ asm(
+ " push {lr}\n"
+ " bl debug_sub_80D93F4\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077C00()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r0, ._262 @ gUnknown_Debug_839BF94\n"
+ " bl DebugMenu_8077D78\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._263:\n"
+ " .align 2, 0\n"
+ "._262:\n"
+ " .word gUnknown_Debug_839BF94\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077C14()
+{
+ asm(
+ " push {lr}\n"
+ " bl Menu_EraseScreen\n"
+ " ldr r0, ._264 @ gUnknown_Debug_839BF94\n"
+ " mov r1, #0xa\n"
+ " mov r2, #0x9\n"
+ " bl DebugMenu_8077D24\n"
+ " ldr r1, ._264 + 4 @ gMenuCallback\n"
+ " ldr r0, ._264 + 8 @ DebugMenu_8077C00\n"
+ " str r0, [r1]\n"
+ " mov r0, #0x0\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._265:\n"
+ " .align 2, 0\n"
+ "._264:\n"
+ " .word gUnknown_Debug_839BF94\n"
+ " .word gMenuCallback\n"
+ " .word DebugMenu_8077C00+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077C3C()
+{
+ asm(
+ " push {r4, r5, r6, r7, lr}\n"
+ " mov r7, sl\n"
+ " mov r6, r9\n"
+ " mov r5, r8\n"
+ " push {r5, r6, r7}\n"
+ " add sp, sp, #0xfffffffc\n"
+ " mov sl, r0\n"
+ " add r7, r1, #0\n"
+ " ldr r0, ._271 @ gUnknown_030006BC\n"
+ " ldr r1, ._271 + 4 @ gUnknown_Debug_839BFE8\n"
+ " str r1, [r0]\n"
+ " mov r1, #0x0\n"
+ " strb r1, [r7]\n"
+ " add r7, r7, #0x1\n"
+ " strb r1, [r7]\n"
+ " add r7, r7, #0x1\n"
+ " mov r3, #0x0\n"
+ " mov r8, r0\n"
+ "._269:\n"
+ " mov r5, #0x0\n"
+ " ldr r1, ._271 @ gUnknown_030006BC\n"
+ " ldr r0, [r1]\n"
+ " ldr r2, [r0, #0x4]\n"
+ " mov r4, #0x0\n"
+ " ldr r1, [r0, #0x8]\n"
+ " add r3, r3, #0x1\n"
+ " mov r9, r3\n"
+ " cmp r5, r1\n"
+ " bge ._266 @cond_branch\n"
+ " add r3, r0, #0\n"
+ " add r6, r1, #0\n"
+ "._267:\n"
+ " ldr r0, [r3, #0xc]\n"
+ " add r0, r0, r4\n"
+ " add r0, r0, sl\n"
+ " ldrb r0, [r0]\n"
+ " sub r0, r0, #0x30\n"
+ " mul r0, r0, r2\n"
+ " add r5, r5, r0\n"
+ " add r4, r4, #0x1\n"
+ " add r0, r2, #0\n"
+ " mov r1, #0xa\n"
+ " str r3, [sp]\n"
+ " bl __divsi3\n"
+ " add r2, r0, #0\n"
+ " ldr r3, [sp]\n"
+ " cmp r4, r6\n"
+ " blt ._267 @cond_branch\n"
+ "._266:\n"
+ " mov r0, r8\n"
+ " ldr r1, [r0]\n"
+ " ldr r0, [r1]\n"
+ " cmp r0, r5\n"
+ " bcs ._268 @cond_branch\n"
+ " add r5, r0, #0\n"
+ "._268:\n"
+ " ldrb r3, [r1, #0x8]\n"
+ " add r0, r7, #0\n"
+ " add r1, r5, #0\n"
+ " mov r2, #0x2\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " add r7, r0, #0\n"
+ " mov r3, r9\n"
+ " mov r1, r8\n"
+ " ldr r0, [r1]\n"
+ " add r0, r0, #0x10\n"
+ " str r0, [r1]\n"
+ " cmp r3, #0x1\n"
+ " ble ._269 @cond_branch\n"
+ " mov r1, sl\n"
+ " ldrb r0, [r1, #0x1d]\n"
+ " add r0, r0, #0x7a\n"
+ " strb r0, [r7]\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " cmp r0, #0xf6\n"
+ " bls ._270 @cond_branch\n"
+ " mov r0, #0xf6\n"
+ " strb r0, [r7]\n"
+ "._270:\n"
+ " mov r0, #0xff\n"
+ " strb r0, [r7, #0x1]\n"
+ " add sp, sp, #0x4\n"
+ " pop {r3, r4, r5}\n"
+ " mov r8, r3\n"
+ " mov r9, r4\n"
+ " mov sl, r5\n"
+ " pop {r4, r5, r6, r7}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._272:\n"
+ " .align 2, 0\n"
+ "._271:\n"
+ " .word gUnknown_030006BC \n"
+ " .word gUnknown_Debug_839BFE8\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_8077CF4()
+{
+ asm(
+ " push {r4, r5, r6, lr}\n"
+ " add r4, r0, #0\n"
+ " add r5, r1, #0\n"
+ " lsl r4, r4, #0x18\n"
+ " lsr r4, r4, #0x18\n"
+ " lsl r5, r5, #0x18\n"
+ " lsr r5, r5, #0x18\n"
+ " ldr r0, ._273 @ BuildDateTime\n"
+ " ldr r6, ._273 + 4 @ gStringVar4\n"
+ " add r1, r6, #0\n"
+ " bl DebugMenu_8077C3C\n"
+ " add r0, r6, #0\n"
+ " add r1, r4, #0\n"
+ " add r2, r5, #0\n"
+ " bl Menu_PrintText\n"
+ " pop {r4, r5, r6}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._274:\n"
+ " .align 2, 0\n"
+ "._273:\n"
+ " .word BuildDateTime\n"
+ " .word gStringVar4\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077D24()
+{
+ asm(
+ " push {r4, r5, r6, lr}\n"
+ " add sp, sp, #0xfffffff8\n"
+ " add r6, r0, #0\n"
+ " add r4, r1, #0\n"
+ " add r5, r2, #0\n"
+ " lsl r4, r4, #0x18\n"
+ " lsr r4, r4, #0x18\n"
+ " lsl r5, r5, #0x18\n"
+ " lsr r5, r5, #0x18\n"
+ " bl Menu_EraseScreen\n"
+ " lsl r3, r5, #0x1\n"
+ " add r3, r3, #0x1\n"
+ " lsl r3, r3, #0x18\n"
+ " lsr r3, r3, #0x18\n"
+ " mov r0, #0x0\n"
+ " mov r1, #0x0\n"
+ " add r2, r4, #0\n"
+ " bl Menu_DrawStdWindowFrame\n"
+ " mov r0, #0x1\n"
+ " mov r1, #0x1\n"
+ " add r2, r5, #0\n"
+ " add r3, r6, #0\n"
+ " bl Menu_PrintItems\n"
+ " mov r0, #0x0\n"
+ " str r0, [sp]\n"
+ " sub r4, r4, #0x1\n"
+ " lsl r4, r4, #0x18\n"
+ " lsr r4, r4, #0x18\n"
+ " str r4, [sp, #0x4]\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0x1\n"
+ " add r3, r5, #0\n"
+ " bl InitMenu\n"
+ " add sp, sp, #0x8\n"
+ " pop {r4, r5, r6}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077D78()
+{
+ asm(
+ " push {r4, r5, lr}\n"
+ " add r5, r0, #0\n"
+ " bl Menu_ProcessInput\n"
+ " lsl r0, r0, #0x18\n"
+ " asr r4, r0, #0x18\n"
+ " mov r0, #0x2\n"
+ " neg r0, r0\n"
+ " cmp r4, r0\n"
+ " beq ._275 @cond_branch\n"
+ " add r0, r0, #0x1\n"
+ " cmp r4, r0\n"
+ " beq ._276 @cond_branch\n"
+ " bl Menu_EraseScreen\n"
+ " ldr r0, ._278 @ gMenuCallback\n"
+ " lsl r1, r4, #0x3\n"
+ " add r1, r1, r5\n"
+ " ldr r1, [r1, #0x4]\n"
+ " str r1, [r0]\n"
+ "._275:\n"
+ " mov r0, #0x0\n"
+ " b ._277\n"
+ "._279:\n"
+ " .align 2, 0\n"
+ "._278:\n"
+ " .word gMenuCallback\n"
+ "._276:\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ "._277:\n"
+ " pop {r4, r5}\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077DB4()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r0, ._282 @ gMain\n"
+ " ldrh r1, [r0, #0x2e]\n"
+ " mov r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " bne ._280 @cond_branch\n"
+ " mov r0, #0x0\n"
+ " b ._281\n"
+ "._283:\n"
+ " .align 2, 0\n"
+ "._282:\n"
+ " .word gMain\n"
+ "._280:\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ "._281:\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077DD8()
+{
+ asm(
+ " push {r4, r5, lr}\n"
+ " add r4, r0, #0\n"
+ " add r5, r1, #0\n"
+ " lsl r3, r3, #0x10\n"
+ " lsr r3, r3, #0x10\n"
+ " add r1, r3, #0\n"
+ " mov r0, #0x80\n"
+ " and r0, r0, r3\n"
+ " cmp r0, #0\n"
+ " beq ._284 @cond_branch\n"
+ " ldrh r0, [r4]\n"
+ " sub r0, r0, #0x1\n"
+ " b ._285\n"
+ "._284:\n"
+ " mov r0, #0x40\n"
+ " and r0, r0, r3\n"
+ " cmp r0, #0\n"
+ " beq ._286 @cond_branch\n"
+ " ldrh r0, [r4]\n"
+ " add r0, r0, #0x1\n"
+ " b ._287\n"
+ "._286:\n"
+ " mov r0, #0x20\n"
+ " and r0, r0, r3\n"
+ " cmp r0, #0\n"
+ " beq ._288 @cond_branch\n"
+ " ldrh r0, [r4]\n"
+ " sub r0, r0, #0xa\n"
+ "._285:\n"
+ " strh r0, [r4]\n"
+ " mov r1, #0x0\n"
+ " ldsh r0, [r4, r1]\n"
+ " cmp r0, r5\n"
+ " bge ._293 @cond_branch\n"
+ " strh r2, [r4]\n"
+ " b ._293\n"
+ "._288:\n"
+ " mov r0, #0x10\n"
+ " and r1, r1, r0\n"
+ " cmp r1, #0\n"
+ " bne ._291 @cond_branch\n"
+ " mov r0, #0x0\n"
+ " b ._292\n"
+ "._291:\n"
+ " ldrh r0, [r4]\n"
+ " add r0, r0, #0xa\n"
+ "._287:\n"
+ " strh r0, [r4]\n"
+ " mov r1, #0x0\n"
+ " ldsh r0, [r4, r1]\n"
+ " cmp r0, r2\n"
+ " ble ._293 @cond_branch\n"
+ " strh r5, [r4]\n"
+ "._293:\n"
+ " mov r0, #0x1\n"
+ "._292:\n"
+ " pop {r4, r5}\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077E40()
+{
+ asm(
+ " push {r4, lr}\n"
+ " add r4, r0, #0\n"
+ " ldr r0, ._297 @ gMain\n"
+ " ldrh r1, [r0, #0x2e]\n"
+ " mov r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " bne ._294 @cond_branch\n"
+ " mov r0, #0x2\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._295 @cond_branch\n"
+ "._294:\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ " neg r0, r0\n"
+ " b ._302\n"
+ "._298:\n"
+ " .align 2, 0\n"
+ "._297:\n"
+ " .word gMain\n"
+ "._295:\n"
+ " mov r0, #0x30\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._299 @cond_branch\n"
+ " mov r0, #0x5\n"
+ " bl PlaySE\n"
+ " cmp r4, #0\n"
+ " beq ._300 @cond_branch\n"
+ " mov r0, #0x1\n"
+ " bl DebugMenu_807786C\n"
+ " mov r0, #0x0\n"
+ " b ._302\n"
+ "._300:\n"
+ " mov r0, #0x0\n"
+ " bl DebugMenu_807786C\n"
+ " mov r0, #0x1\n"
+ " b ._302\n"
+ "._299:\n"
+ " add r0, r4, #0\n"
+ "._302:\n"
+ " pop {r4}\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_MakeItems()
+{
+ asm(
+ " push {lr}\n"
+ " bl CloseMenu\n"
+ " bl DebugMenu_8077EAC\n"
+ " bl ScriptContext2_Enable\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077EAC()
+{
+ asm(
+ " push {r4, lr}\n"
+ " ldr r0, ._303 @ DebugMenu_8077F40\n"
+ " mov r1, #0x50\n"
+ " bl CreateTask\n"
+ " add r4, r0, #0\n"
+ " lsl r4, r4, #0x18\n"
+ " lsr r4, r4, #0x18\n"
+ " bl Menu_EraseScreen\n"
+ " ldr r1, ._303 + 4 @ gTasks\n"
+ " lsl r0, r4, #0x2\n"
+ " add r0, r0, r4\n"
+ " lsl r0, r0, #0x3\n"
+ " add r0, r0, r1\n"
+ " mov r1, #0x1\n"
+ " strh r1, [r0, #0xa]\n"
+ " strh r1, [r0, #0xc]\n"
+ " pop {r4}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._304:\n"
+ " .align 2, 0\n"
+ "._303:\n"
+ " .word DebugMenu_8077F40+1\n"
+ " .word gTasks\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077EE0()
+{
+ asm(
+ " push {r4, r5, r6, lr}\n"
+ " add r4, r0, #0\n"
+ " add r6, r1, #0\n"
+ " lsl r4, r4, #0x10\n"
+ " lsr r4, r4, #0x10\n"
+ " lsl r6, r6, #0x10\n"
+ " lsr r6, r6, #0x10\n"
+ " mov r0, #0x4\n"
+ " mov r1, #0x11\n"
+ " mov r2, #0x16\n"
+ " mov r3, #0x12\n"
+ " bl Menu_BlankWindowRect\n"
+ " ldr r5, ._305 @ gStringVar1\n"
+ " add r0, r5, #0\n"
+ " add r1, r4, #0\n"
+ " mov r2, #0x1\n"
+ " mov r3, #0x3\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " add r0, r5, #0\n"
+ " mov r1, #0x4\n"
+ " mov r2, #0x11\n"
+ " bl Menu_PrintText\n"
+ " add r0, r4, #0\n"
+ " bl ItemId_GetName\n"
+ " mov r1, #0x8\n"
+ " mov r2, #0x11\n"
+ " bl Menu_PrintText\n"
+ " add r0, r5, #0\n"
+ " add r1, r6, #0\n"
+ " mov r2, #0x1\n"
+ " mov r3, #0x3\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " add r0, r5, #0\n"
+ " mov r1, #0x12\n"
+ " mov r2, #0x11\n"
+ " bl Menu_PrintText\n"
+ " pop {r4, r5, r6}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._306:\n"
+ " .align 2, 0\n"
+ "._305:\n"
+ " .word gStringVar1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077F40()
+{
+ asm(
+ " push {r4, lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " lsl r4, r0, #0x2\n"
+ " add r4, r4, r0\n"
+ " lsl r4, r4, #0x3\n"
+ " ldr r0, ._307 @ gTasks\n"
+ " add r4, r4, r0\n"
+ " bl Menu_DisplayDialogueFrame\n"
+ " ldr r0, ._307 + 4 @ gDebug0x839C008\n"
+ " mov r1, #0x2\n"
+ " mov r2, #0xf\n"
+ " bl Menu_PrintText\n"
+ " ldrh r0, [r4, #0xa]\n"
+ " ldrh r1, [r4, #0xc]\n"
+ " bl DebugMenu_8077EE0\n"
+ " ldr r0, ._307 + 8 @ DebugMenu_8077F7C\n"
+ " str r0, [r4]\n"
+ " pop {r4}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._308:\n"
+ " .align 2, 0\n"
+ "._307:\n"
+ " .word gTasks\n"
+ " .word gDebug0x839C008\n"
+ " .word DebugMenu_8077F7C+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077F7C()
+{
+ asm(
+ " push {r4, lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " lsl r1, r0, #0x2\n"
+ " add r1, r1, r0\n"
+ " lsl r1, r1, #0x3\n"
+ " ldr r0, ._311 @ gTasks\n"
+ " add r4, r1, r0\n"
+ " ldr r3, ._311 + 4 @ gMain\n"
+ " ldrh r1, [r3, #0x2e]\n"
+ " mov r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._309 @cond_branch\n"
+ " bl Menu_DisplayDialogueFrame\n"
+ " ldr r0, ._311 + 8 @ Str_839C014\n"
+ " mov r1, #0x2\n"
+ " mov r2, #0xf\n"
+ " bl Menu_PrintText\n"
+ " ldrh r0, [r4, #0xa]\n"
+ " ldrh r1, [r4, #0xc]\n"
+ " bl DebugMenu_8077EE0\n"
+ " ldr r0, ._311 + 12 @ DebugMenu_8077FFC\n"
+ " str r0, [r4]\n"
+ " b ._317\n"
+ "._312:\n"
+ " .align 2, 0\n"
+ "._311:\n"
+ " .word gTasks\n"
+ " .word gMain\n"
+ " .word Str_839C014\n"
+ " .word DebugMenu_8077FFC+1\n"
+ "._309:\n"
+ " mov r0, #0x2\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._313 @cond_branch\n"
+ " ldr r0, ._315 @ DebugMenu_807806C\n"
+ " str r0, [r4]\n"
+ " b ._317\n"
+ "._316:\n"
+ " .align 2, 0\n"
+ "._315:\n"
+ " .word DebugMenu_807806C+1\n"
+ "._313:\n"
+ " add r0, r4, #0\n"
+ " add r0, r0, #0xa\n"
+ " mov r2, #0xae\n"
+ " lsl r2, r2, #0x1\n"
+ " ldrh r3, [r3, #0x30]\n"
+ " mov r1, #0x1\n"
+ " bl DebugMenu_8077DD8\n"
+ " cmp r0, #0x1\n"
+ " bne ._317 @cond_branch\n"
+ " ldrh r0, [r4, #0xa]\n"
+ " ldrh r1, [r4, #0xc]\n"
+ " bl DebugMenu_8077EE0\n"
+ "._317:\n"
+ " pop {r4}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8077FFC()
+{
+ asm(
+ " push {r4, lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " lsl r1, r0, #0x2\n"
+ " add r1, r1, r0\n"
+ " lsl r1, r1, #0x3\n"
+ " ldr r0, ._321 @ gTasks\n"
+ " add r4, r1, r0\n"
+ " ldr r2, ._321 + 4 @ gMain\n"
+ " ldrh r1, [r2, #0x2e]\n"
+ " mov r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._318 @cond_branch\n"
+ " ldrh r0, [r4, #0xa]\n"
+ " ldrh r1, [r4, #0xc]\n"
+ " bl AddBagItem\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " cmp r0, #0x1\n"
+ " bne ._320 @cond_branch\n"
+ " mov r0, #0x5\n"
+ " bl PlaySE\n"
+ " b ._320\n"
+ "._322:\n"
+ " .align 2, 0\n"
+ "._321:\n"
+ " .word gTasks\n"
+ " .word gMain\n"
+ "._318:\n"
+ " mov r0, #0x2\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._323 @cond_branch\n"
+ "._320:\n"
+ " ldr r0, ._325 @ DebugMenu_8077F40\n"
+ " str r0, [r4]\n"
+ " b ._327\n"
+ "._326:\n"
+ " .align 2, 0\n"
+ "._325:\n"
+ " .word DebugMenu_8077F40+1\n"
+ "._323:\n"
+ " add r0, r4, #0\n"
+ " add r0, r0, #0xc\n"
+ " ldrh r3, [r2, #0x30]\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0x63\n"
+ " bl DebugMenu_8077DD8\n"
+ " cmp r0, #0x1\n"
+ " bne ._327 @cond_branch\n"
+ " ldrh r0, [r4, #0xa]\n"
+ " ldrh r1, [r4, #0xc]\n"
+ " bl DebugMenu_8077EE0\n"
+ "._327:\n"
+ " pop {r4}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_807806C()
+{
+ asm(
+ " push {r4, lr}\n"
+ " add r4, r0, #0\n"
+ " lsl r4, r4, #0x18\n"
+ " lsr r4, r4, #0x18\n"
+ " bl Menu_EraseScreen\n"
+ " bl ScriptContext2_Disable\n"
+ " add r0, r4, #0\n"
+ " bl DestroyTask\n"
+ " bl DebugMenu_8077048\n"
+ " pop {r4}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_807808C()
+{
+ asm(
+ " push {r4, r5, lr}\n"
+ " add sp, sp, #0xfffffff4\n"
+ " add r4, r0, #0\n"
+ " sub r0, r4, #1\n"
+ " cmp r0, #0xc\n"
+ " bls ._328 @cond_branch\n"
+ " mov r4, #0x1\n"
+ "._328:\n"
+ " lsl r1, r4, #0x5\n"
+ " ldr r0, ._331 @ gSaveBlock1\n"
+ " add r5, r1, r0\n"
+ " bl Menu_EraseScreen\n"
+ " mov r0, #0x0\n"
+ " mov r1, #0x0\n"
+ " mov r2, #0x13\n"
+ " mov r3, #0x11\n"
+ " bl Menu_DrawStdWindowFrame\n"
+ " ldr r0, ._331 + 4 @ Str_839C01E\n"
+ " mov r1, #0x2\n"
+ " mov r2, #0x2\n"
+ " bl Menu_PrintText\n"
+ " mov r0, sp\n"
+ " add r1, r4, #0\n"
+ " mov r2, #0x1\n"
+ " mov r3, #0x3\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0xb\n"
+ " mov r2, #0x2\n"
+ " bl Menu_PrintText\n"
+ " ldrh r1, [r5, #0x8]\n"
+ " mov r0, sp\n"
+ " mov r2, #0x1\n"
+ " mov r3, #0x3\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0xb\n"
+ " mov r2, #0x4\n"
+ " bl Menu_PrintText\n"
+ " add r4, r5, #0\n"
+ " add r4, r4, #0xb\n"
+ " add r0, r4, #0\n"
+ " bl StringLength\n"
+ " lsl r0, r0, #0x10\n"
+ " lsr r0, r0, #0x10\n"
+ " cmp r0, #0xb\n"
+ " bhi ._329 @cond_branch\n"
+ " add r0, r4, #0\n"
+ " mov r1, #0xb\n"
+ " mov r2, #0x6\n"
+ " bl Menu_PrintText\n"
+ " b ._330\n"
+ "._332:\n"
+ " .align 2, 0\n"
+ "._331:\n"
+ " .word gSaveBlock1+0x2ddc\n"
+ " .word Str_839C01E\n"
+ "._329:\n"
+ " ldr r0, ._335 @ Str_839C04D\n"
+ " mov r1, #0xb\n"
+ " mov r2, #0x6\n"
+ " bl Menu_PrintText\n"
+ "._330:\n"
+ " add r4, r5, #0\n"
+ " add r4, r4, #0x16\n"
+ " add r0, r4, #0\n"
+ " bl StringLength\n"
+ " lsl r0, r0, #0x10\n"
+ " lsr r0, r0, #0x10\n"
+ " cmp r0, #0xb\n"
+ " bhi ._333 @cond_branch\n"
+ " add r0, r4, #0\n"
+ " mov r1, #0xb\n"
+ " mov r2, #0x8\n"
+ " bl Menu_PrintText\n"
+ " b ._334\n"
+ "._336:\n"
+ " .align 2, 0\n"
+ "._335:\n"
+ " .word Str_839C04D\n"
+ "._333:\n"
+ " ldr r0, ._337 @ Str_839C04D\n"
+ " mov r1, #0xb\n"
+ " mov r2, #0x8\n"
+ " bl Menu_PrintText\n"
+ "._334:\n"
+ " ldrb r1, [r5, #0xa]\n"
+ " mov r0, sp\n"
+ " mov r2, #0x1\n"
+ " mov r3, #0x3\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0xb\n"
+ " mov r2, #0xa\n"
+ " bl Menu_PrintText\n"
+ " ldr r1, [r5]\n"
+ " mov r0, sp\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x8\n"
+ " bl ConvertIntToHexStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0xb\n"
+ " mov r2, #0xc\n"
+ " bl Menu_PrintText\n"
+ " add sp, sp, #0xc\n"
+ " pop {r4, r5}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._338:\n"
+ " .align 2, 0\n"
+ "._337:\n"
+ " .word Str_839C04D\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_807817C()
+{
+ asm(
+ " push {r4, lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r4, r0, #0x18\n"
+ " ldr r0, ._340 @ gMain\n"
+ " ldrh r1, [r0, #0x2e]\n"
+ " mov r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._339 @cond_branch\n"
+ " bl Menu_EraseScreen\n"
+ " add r0, r4, #0\n"
+ " bl DestroyTask\n"
+ " bl ScriptContext2_Disable\n"
+ "._339:\n"
+ " pop {r4}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._341:\n"
+ " .align 2, 0\n"
+ "._340:\n"
+ " .word gMain\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_80781A8()
+{
+ asm(
+ " push {r4, r5, lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " lsl r1, r0, #0x2\n"
+ " add r1, r1, r0\n"
+ " lsl r1, r1, #0x3\n"
+ " ldr r0, ._344 @ gTasks\n"
+ " add r5, r1, r0\n"
+ " ldrh r1, [r5, #0x8]\n"
+ " mov r2, #0x8\n"
+ " ldsh r0, [r5, r2]\n"
+ " cmp r0, #0\n"
+ " bne ._342 @cond_branch\n"
+ " add r0, r1, #1\n"
+ " strh r0, [r5, #0x8]\n"
+ " b ._343\n"
+ "._345:\n"
+ " .align 2, 0\n"
+ "._344:\n"
+ " .word gTasks\n"
+ "._342:\n"
+ " ldr r2, ._348 @ gMain\n"
+ " ldrh r1, [r2, #0x2e]\n"
+ " mov r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._346 @cond_branch\n"
+ " mov r1, #0x8\n"
+ " ldsh r0, [r5, r1]\n"
+ " bl DebugMenu_807808C\n"
+ " ldr r0, ._348 + 4 @ DebugMenu_807817C\n"
+ " str r0, [r5]\n"
+ " b ._350\n"
+ "._349:\n"
+ " .align 2, 0\n"
+ "._348:\n"
+ " .word gMain\n"
+ " .word DebugMenu_807817C+1\n"
+ "._346:\n"
+ " add r0, r5, #0\n"
+ " add r0, r0, #0x8\n"
+ " ldrh r1, [r2, #0x30]\n"
+ " mov r3, #0xc0\n"
+ " and r3, r3, r1\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0xd\n"
+ " bl DebugMenu_8077DD8\n"
+ " cmp r0, #0\n"
+ " beq ._350 @cond_branch\n"
+ "._343:\n"
+ " mov r0, #0x4\n"
+ " mov r1, #0x11\n"
+ " mov r2, #0x16\n"
+ " mov r3, #0x12\n"
+ " bl Menu_BlankWindowRect\n"
+ " ldr r4, ._351 @ gStringVar1\n"
+ " mov r2, #0x8\n"
+ " ldsh r1, [r5, r2]\n"
+ " add r0, r4, #0\n"
+ " mov r2, #0x1\n"
+ " mov r3, #0x3\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " add r0, r4, #0\n"
+ " mov r1, #0x4\n"
+ " mov r2, #0x11\n"
+ " bl Menu_PrintText\n"
+ "._350:\n"
+ " pop {r4, r5}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._352:\n"
+ " .align 2, 0\n"
+ "._351:\n"
+ " .word gStringVar1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_ViewPortraits()
+{
+ asm(
+ " push {lr}\n"
+ " bl CloseMenu\n"
+ " ldr r0, ._353 @ DebugMenu_80781A8\n"
+ " mov r1, #0x50\n"
+ " bl CreateTask\n"
+ " bl ScriptContext2_Enable\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._354:\n"
+ " .align 2, 0\n"
+ "._353:\n"
+ " .word DebugMenu_80781A8+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078254()
+{
+ asm(
+ " push {lr}\n"
+ " bl DebugMenu_807808C\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_AllBadges()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r0, ._355 @ 0x807\n"
+ " bl FlagSet\n"
+ " ldr r0, ._355 + 4 @ 0x808\n"
+ " bl FlagSet\n"
+ " ldr r0, ._355 + 8 @ 0x809\n"
+ " bl FlagSet\n"
+ " ldr r0, ._355 + 12 @ 0x80a\n"
+ " bl FlagSet\n"
+ " ldr r0, ._355 + 16 @ 0x80b\n"
+ " bl FlagSet\n"
+ " ldr r0, ._355 + 20 @ 0x80c\n"
+ " bl FlagSet\n"
+ " ldr r0, ._355 + 24 @ 0x80d\n"
+ " bl FlagSet\n"
+ " ldr r0, ._355 + 28 @ 0x80e\n"
+ " bl FlagSet\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._356:\n"
+ " .align 2, 0\n"
+ "._355:\n"
+ " .word 0x807\n"
+ " .word 0x808\n"
+ " .word 0x809\n"
+ " .word 0x80a\n"
+ " .word 0x80b\n"
+ " .word 0x80c\n"
+ " .word 0x80d\n"
+ " .word 0x80e\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_TimeRecords()
+{
+ asm(
+ " push {lr}\n"
+ " bl CloseMenu\n"
+ " ldr r0, ._357 @ debug_sub_806F9E4\n"
+ " mov r1, #0x50\n"
+ " bl CreateTask\n"
+ " bl ScriptContext2_Enable\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._358:\n"
+ " .align 2, 0\n"
+ "._357:\n"
+ " .word debug_sub_806F9E4+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_SetTime()
+{
+ asm(
+ " push {lr}\n"
+ " bl CloseMenu\n"
+ " bl debug_sub_806F99C\n"
+ " bl ScriptContext2_Enable\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_80782EC()
+{
+ asm(
+ " push {lr}\n"
+ " add r1, r0, #0\n"
+ " lsl r1, r1, #0x10\n"
+ " lsr r1, r1, #0x10\n"
+ " ldr r0, ._359 @ gStringVar1\n"
+ " mov r2, #0x0\n"
+ " mov r3, #0x4\n"
+ " bl ConvertIntToHexStringN\n"
+ " ldr r0, ._359 + 4 @ Str_839C053\n"
+ " bl sub_8071F40\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._360:\n"
+ " .align 2, 0\n"
+ "._359:\n"
+ " .word gStringVar1\n"
+ " .word Str_839C053\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078310()
+{
+ asm(
+ " push {r4, r5, lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r5, r0, #0x18\n"
+ " lsl r0, r5, #0x2\n"
+ " add r0, r0, r5\n"
+ " lsl r0, r0, #0x3\n"
+ " ldr r1, ._364 @ gTasks\n"
+ " add r4, r0, r1\n"
+ " mov r1, #0x0\n"
+ " ldsh r0, [r4, r1]\n"
+ " cmp r0, #0\n"
+ " beq ._361 @cond_branch\n"
+ " cmp r0, #0x1\n"
+ " beq ._362 @cond_branch\n"
+ " b ._375\n"
+ "._365:\n"
+ " .align 2, 0\n"
+ "._364:\n"
+ " .word gTasks+0x8\n"
+ "._361:\n"
+ " ldr r0, ._367 @ 0x4024\n"
+ " bl VarGet\n"
+ " strh r0, [r4, #0x2]\n"
+ " ldrh r0, [r4, #0x2]\n"
+ " bl DebugMenu_80782EC\n"
+ " ldrh r0, [r4]\n"
+ " add r0, r0, #0x1\n"
+ " strh r0, [r4]\n"
+ " b ._375\n"
+ "._368:\n"
+ " .align 2, 0\n"
+ "._367:\n"
+ " .word 0x4024\n"
+ "._362:\n"
+ " ldr r3, ._371 @ gMain\n"
+ " ldrh r1, [r3, #0x2e]\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._369 @cond_branch\n"
+ " mov r0, #0x49\n"
+ " bl PlaySE\n"
+ " ldr r0, ._371 + 4 @ 0x4024\n"
+ " bl GetVarPointer\n"
+ " ldrh r1, [r4, #0x2]\n"
+ " strh r1, [r0]\n"
+ " b ._370\n"
+ "._372:\n"
+ " .align 2, 0\n"
+ "._371:\n"
+ " .word gMain\n"
+ " .word 0x4024\n"
+ "._369:\n"
+ " mov r0, #0x2\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._373 @cond_branch\n"
+ "._370:\n"
+ " bl Menu_EraseScreen\n"
+ " add r0, r5, #0\n"
+ " bl DestroyTask\n"
+ " bl ScriptContext2_Disable\n"
+ " b ._375\n"
+ "._373:\n"
+ " add r0, r4, #2\n"
+ " ldr r2, ._376 @ 0xffff\n"
+ " ldrh r3, [r3, #0x30]\n"
+ " mov r1, #0x0\n"
+ " bl DebugMenu_8077DD8\n"
+ " cmp r0, #0x1\n"
+ " bne ._375 @cond_branch\n"
+ " ldrh r0, [r4, #0x2]\n"
+ " bl DebugMenu_80782EC\n"
+ "._375:\n"
+ " pop {r4, r5}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._377:\n"
+ " .align 2, 0\n"
+ "._376:\n"
+ " .word 0xffff\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_MiragaIslandRND()
+{
+ asm(
+ " push {lr}\n"
+ " bl CloseMenu\n"
+ " ldr r0, ._378 @ DebugMenu_8078310\n"
+ " mov r1, #0x50\n"
+ " bl CreateTask\n"
+ " bl ScriptContext2_Enable\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._379:\n"
+ " .align 2, 0\n"
+ "._378:\n"
+ " .word DebugMenu_8078310+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_80783C8()
+{
+ asm(
+ " push {r4, lr}\n"
+ " ldr r0, ._383 @ gMain\n"
+ " ldrh r1, [r0, #0x2e]\n"
+ " mov r0, #0x30\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._382 @cond_branch\n"
+ " mov r0, #0x5\n"
+ " bl PlaySE\n"
+ " ldr r4, ._383 + 4 @ 0x804\n"
+ " add r0, r4, #0\n"
+ " bl FlagGet\n"
+ " lsl r0, r0, #0x18\n"
+ " cmp r0, #0\n"
+ " bne ._381 @cond_branch\n"
+ " add r0, r4, #0\n"
+ " bl FlagSet\n"
+ " mov r0, #0x0\n"
+ " bl DebugMenu_807786C\n"
+ " b ._382\n"
+ "._384:\n"
+ " .align 2, 0\n"
+ "._383:\n"
+ " .word gMain\n"
+ " .word 0x804\n"
+ "._381:\n"
+ " add r0, r4, #0\n"
+ " bl FlagClear\n"
+ " mov r0, #0x1\n"
+ " bl DebugMenu_807786C\n"
+ "._382:\n"
+ " ldr r0, ._388 @ gMain\n"
+ " ldrh r1, [r0, #0x2e]\n"
+ " mov r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " bne ._385 @cond_branch\n"
+ " mov r0, #0x2\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._386 @cond_branch\n"
+ "._385:\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ " b ._387\n"
+ "._389:\n"
+ " .align 2, 0\n"
+ "._388:\n"
+ " .word gMain\n"
+ "._386:\n"
+ " mov r0, #0x0\n"
+ "._387:\n"
+ " pop {r4}\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_ToggleClearFlag()
+{
+ asm(
+ " push {lr}\n"
+ " bl Menu_EraseScreen\n"
+ " ldr r0, ._390 @ 0x804\n"
+ " bl FlagGet\n"
+ " mov r1, #0x1\n"
+ " eor r0, r0, r1\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " bl DebugMenu_807786C\n"
+ " ldr r1, ._390 + 4 @ gMenuCallback\n"
+ " ldr r0, ._390 + 8 @ DebugMenu_80783C8\n"
+ " str r0, [r1]\n"
+ " mov r0, #0x0\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._391:\n"
+ " .align 2, 0\n"
+ "._390:\n"
+ " .word 0x804\n"
+ " .word gMenuCallback\n"
+ " .word DebugMenu_80783C8+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078464()
+{
+ asm(
+ " push {r4, lr}\n"
+ " ldr r4, ._396 @ 0x82a\n"
+ " add r0, r4, #0\n"
+ " bl FlagGet\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " bl DebugMenu_8077E40\n"
+ " add r1, r0, #0\n"
+ " cmp r1, #0\n"
+ " beq ._392 @cond_branch\n"
+ " cmp r1, #0\n"
+ " bgt ._393 @cond_branch\n"
+ " mov r0, #0x1\n"
+ " neg r0, r0\n"
+ " cmp r1, r0\n"
+ " beq ._394 @cond_branch\n"
+ " b ._401\n"
+ "._397:\n"
+ " .align 2, 0\n"
+ "._396:\n"
+ " .word 0x82a\n"
+ "._393:\n"
+ " cmp r1, #0x1\n"
+ " beq ._398 @cond_branch\n"
+ " b ._401\n"
+ "._392:\n"
+ " add r0, r4, #0\n"
+ " bl FlagClear\n"
+ " b ._401\n"
+ "._398:\n"
+ " add r0, r4, #0\n"
+ " bl FlagSet\n"
+ " b ._401\n"
+ "._394:\n"
+ " mov r0, #0x1\n"
+ " b ._402\n"
+ "._401:\n"
+ " mov r0, #0x0\n"
+ "._402:\n"
+ " pop {r4}\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_OpenWeatherEvents()
+{
+ asm(
+ " push {lr}\n"
+ " bl Menu_EraseScreen\n"
+ " ldr r0, ._404 @ 0x82a\n"
+ " bl FlagGet\n"
+ " mov r1, #0x0\n"
+ " lsl r0, r0, #0x18\n"
+ " cmp r0, #0\n"
+ " bne ._403 @cond_branch\n"
+ " mov r1, #0x1\n"
+ "._403:\n"
+ " add r0, r1, #0\n"
+ " bl DebugMenu_807786C\n"
+ " ldr r1, ._404 + 4 @ gMenuCallback\n"
+ " ldr r0, ._404 + 8 @ DebugMenu_8078464\n"
+ " str r0, [r1]\n"
+ " mov r0, #0x0\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._405:\n"
+ " .align 2, 0\n"
+ "._404:\n"
+ " .word 0x82a\n"
+ " .word gMenuCallback\n"
+ " .word DebugMenu_8078464+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_80784E8()
+{
+ asm(
+ " push {lr}\n"
+ " bl IsMysteryGiftEnabled\n"
+ " bl DebugMenu_8077E40\n"
+ " add r1, r0, #0\n"
+ " cmp r1, #0\n"
+ " beq ._406 @cond_branch\n"
+ " cmp r1, #0\n"
+ " bgt ._407 @cond_branch\n"
+ " mov r0, #0x1\n"
+ " neg r0, r0\n"
+ " cmp r1, r0\n"
+ " beq ._408 @cond_branch\n"
+ " b ._413\n"
+ "._407:\n"
+ " cmp r1, #0x1\n"
+ " beq ._410 @cond_branch\n"
+ " b ._413\n"
+ "._406:\n"
+ " bl DisableMysteryGift\n"
+ " b ._413\n"
+ "._410:\n"
+ " bl EnableMysteryGift\n"
+ " b ._413\n"
+ "._408:\n"
+ " mov r0, #0x1\n"
+ " b ._414\n"
+ "._413:\n"
+ " mov r0, #0x0\n"
+ "._414:\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_OpenMysteryEvent()
+{
+ asm(
+ " push {lr}\n"
+ " bl Menu_EraseScreen\n"
+ " bl IsMysteryGiftEnabled\n"
+ " mov r1, #0x0\n"
+ " cmp r0, #0\n"
+ " bne ._415 @cond_branch\n"
+ " mov r1, #0x1\n"
+ "._415:\n"
+ " add r0, r1, #0\n"
+ " bl DebugMenu_807786C\n"
+ " ldr r1, ._416 @ gMenuCallback\n"
+ " ldr r0, ._416 + 4 @ DebugMenu_80784E8\n"
+ " str r0, [r1]\n"
+ " mov r0, #0x0\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._417:\n"
+ " .align 2, 0\n"
+ "._416:\n"
+ " .word gMenuCallback\n"
+ " .word DebugMenu_80784E8+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078550()
+{
+ asm(
+ " push {r4, r5, r6, r7, lr}\n"
+ " lsl r0, r0, #0x10\n"
+ " lsr r6, r0, #0x10\n"
+ " lsl r0, r6, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " bl GetGameStat\n"
+ " add r7, r0, #0\n"
+ " ldr r0, ._420 @ gStringVar1\n"
+ " add r1, r6, #0\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x2\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " ldr r0, ._420 + 4 @ gStringVar2\n"
+ " ldr r5, ._420 + 8 @ gUnknown_Debug_839C26C\n"
+ " lsl r4, r6, #0x3\n"
+ " add r1, r5, #4\n"
+ " add r1, r4, r1\n"
+ " ldr r1, [r1]\n"
+ " bl StringCopy\n"
+ " add r4, r4, r5\n"
+ " ldr r0, [r4]\n"
+ " cmp r0, #0\n"
+ " bne ._418 @cond_branch\n"
+ " ldr r0, ._420 + 12 @ gStringVar3\n"
+ " ldr r1, ._420 + 16 @ Str_839C085\n"
+ " bl StringCopy\n"
+ " b ._423\n"
+ "._421:\n"
+ " .align 2, 0\n"
+ "._420:\n"
+ " .word gStringVar1\n"
+ " .word gStringVar2\n"
+ " .word gUnknown_Debug_839C26C\n"
+ " .word gStringVar3\n"
+ " .word Str_839C085\n"
+ "._418:\n"
+ " cmp r6, #0x1\n"
+ " beq ._422 @cond_branch\n"
+ " ldr r0, ._424 @ gStringVar3\n"
+ " add r1, r7, #0\n"
+ " mov r2, #0x1\n"
+ " mov r3, #0xa\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " b ._423\n"
+ "._425:\n"
+ " .align 2, 0\n"
+ "._424:\n"
+ " .word gStringVar3\n"
+ "._422:\n"
+ " ldr r4, ._426 @ gStringVar3\n"
+ " lsr r1, r7, #0x10\n"
+ " add r0, r4, #0\n"
+ " mov r2, #0x1\n"
+ " mov r3, #0x3\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r6, #0xf0\n"
+ " strb r6, [r4, #0x3]\n"
+ " add r0, r4, #4\n"
+ " lsr r1, r7, #0x8\n"
+ " mov r5, #0xff\n"
+ " and r1, r1, r5\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x2\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " strb r6, [r4, #0x6]\n"
+ " add r4, r4, #0x7\n"
+ " and r7, r7, r5\n"
+ " add r0, r4, #0\n"
+ " add r1, r7, #0\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x2\n"
+ " bl ConvertIntToDecimalStringN\n"
+ "._423:\n"
+ " bl Menu_DisplayDialogueFrame\n"
+ " ldr r0, ._426 + 4 @ Str_839C07C\n"
+ " mov r1, #0x2\n"
+ " mov r2, #0xf\n"
+ " bl Menu_PrintText\n"
+ " pop {r4, r5, r6, r7}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._427:\n"
+ " .align 2, 0\n"
+ "._426:\n"
+ " .word gStringVar3\n"
+ " .word Str_839C07C\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_807860C()
+{
+ asm(
+ " push {r4, r5, lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r5, r0, #0x18\n"
+ " lsl r0, r5, #0x2\n"
+ " add r0, r0, r5\n"
+ " lsl r0, r0, #0x3\n"
+ " ldr r1, ._432 @ gTasks\n"
+ " add r4, r0, r1\n"
+ " mov r1, #0x0\n"
+ " ldsh r0, [r4, r1]\n"
+ " cmp r0, #0x1\n"
+ " beq ._428 @cond_branch\n"
+ " cmp r0, #0x1\n"
+ " bgt ._429 @cond_branch\n"
+ " cmp r0, #0\n"
+ " beq ._430 @cond_branch\n"
+ " b ._447\n"
+ "._433:\n"
+ " .align 2, 0\n"
+ "._432:\n"
+ " .word gTasks+0x8\n"
+ "._429:\n"
+ " cmp r0, #0x2\n"
+ " beq ._434 @cond_branch\n"
+ " b ._447\n"
+ "._430:\n"
+ " ldrh r0, [r4, #0x2]\n"
+ " bl DebugMenu_8078550\n"
+ "._441:\n"
+ " ldrh r0, [r4]\n"
+ " add r0, r0, #0x1\n"
+ " strh r0, [r4]\n"
+ " b ._447\n"
+ "._428:\n"
+ " ldr r3, ._439 @ gMain\n"
+ " ldrh r1, [r3, #0x2e]\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._437 @cond_branch\n"
+ " ldrh r0, [r4]\n"
+ " sub r0, r0, #0x1\n"
+ " strh r0, [r4]\n"
+ " mov r0, #0x1\n"
+ " b ._438\n"
+ "._440:\n"
+ " .align 2, 0\n"
+ "._439:\n"
+ " .word gMain\n"
+ "._437:\n"
+ " mov r0, #0x2\n"
+ " and r0, r0, r1\n"
+ " lsl r0, r0, #0x10\n"
+ " lsr r2, r0, #0x10\n"
+ " cmp r2, #0\n"
+ " bne ._441 @cond_branch\n"
+ " ldrh r1, [r3, #0x30]\n"
+ " mov r0, #0x40\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._442 @cond_branch\n"
+ " ldrh r0, [r4, #0x2]\n"
+ " add r0, r0, #0x1\n"
+ " strh r0, [r4, #0x2]\n"
+ " lsl r0, r0, #0x10\n"
+ " asr r0, r0, #0x10\n"
+ " cmp r0, #0x32\n"
+ " bne ._446 @cond_branch\n"
+ " strh r2, [r4, #0x2]\n"
+ " b ._446\n"
+ "._442:\n"
+ " mov r0, #0x80\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._447 @cond_branch\n"
+ " ldrh r0, [r4, #0x2]\n"
+ " sub r0, r0, #0x1\n"
+ " strh r0, [r4, #0x2]\n"
+ " lsl r0, r0, #0x10\n"
+ " cmp r0, #0\n"
+ " bge ._446 @cond_branch\n"
+ " mov r0, #0x31\n"
+ " strh r0, [r4, #0x2]\n"
+ "._446:\n"
+ " ldrh r0, [r4, #0x2]\n"
+ " bl DebugMenu_8078550\n"
+ " b ._447\n"
+ "._434:\n"
+ " bl Menu_EraseScreen\n"
+ " bl ScriptContext2_Disable\n"
+ " add r0, r5, #0\n"
+ " bl DestroyTask\n"
+ "._447:\n"
+ " mov r0, #0x0\n"
+ "._438:\n"
+ " pop {r4, r5}\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_80786C0()
+{
+ asm(
+ " push {lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " bl DebugMenu_807860C\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_80786D0()
+{
+ asm(
+ " push {r4, lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r4, r0, #0x18\n"
+ " add r0, r4, #0\n"
+ " bl DebugMenu_807860C\n"
+ " cmp r0, #0\n"
+ " beq ._449 @cond_branch\n"
+ " ldr r1, ._450 @ gTasks\n"
+ " lsl r0, r4, #0x2\n"
+ " add r0, r0, r4\n"
+ " lsl r0, r0, #0x3\n"
+ " add r0, r0, r1\n"
+ " ldrb r2, [r0, #0xa]\n"
+ " ldr r1, ._450 + 4 @ gUnknown_Debug_839C26C\n"
+ " lsl r0, r2, #0x3\n"
+ " add r0, r0, r1\n"
+ " ldr r0, [r0]\n"
+ " cmp r0, #0\n"
+ " beq ._449 @cond_branch\n"
+ " sub r1, r0, #1\n"
+ " add r0, r2, #0\n"
+ " bl SetGameStat\n"
+ " mov r0, #0x15\n"
+ " bl PlaySE\n"
+ "._449:\n"
+ " pop {r4}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._451:\n"
+ " .align 2, 0\n"
+ "._450:\n"
+ " .word gTasks\n"
+ " .word gUnknown_Debug_839C26C\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078714()
+{
+ asm(
+ " push {r4, lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r4, r0, #0x18\n"
+ " add r0, r4, #0\n"
+ " bl DebugMenu_807860C\n"
+ " cmp r0, #0\n"
+ " beq ._453 @cond_branch\n"
+ " ldr r1, ._454 @ gTasks\n"
+ " lsl r0, r4, #0x2\n"
+ " add r0, r0, r4\n"
+ " lsl r0, r0, #0x3\n"
+ " add r0, r0, r1\n"
+ " ldrb r2, [r0, #0xa]\n"
+ " ldr r1, ._454 + 4 @ gUnknown_Debug_839C26C\n"
+ " lsl r0, r2, #0x3\n"
+ " add r0, r0, r1\n"
+ " ldr r0, [r0]\n"
+ " cmp r0, #0\n"
+ " beq ._453 @cond_branch\n"
+ " add r0, r2, #0\n"
+ " mov r1, #0x0\n"
+ " bl SetGameStat\n"
+ " mov r0, #0x15\n"
+ " bl PlaySE\n"
+ "._453:\n"
+ " pop {r4}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._455:\n"
+ " .align 2, 0\n"
+ "._454:\n"
+ " .word gTasks\n"
+ " .word gUnknown_Debug_839C26C\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078758()
+{
+ asm(
+ " push {r4, lr}\n"
+ " add r4, r0, #0\n"
+ " bl CloseMenu\n"
+ " bl ScriptContext2_Enable\n"
+ " add r0, r4, #0\n"
+ " mov r1, #0x50\n"
+ " bl CreateTask\n"
+ " mov r0, #0x1\n"
+ " pop {r4}\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078774()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r0, ._456 @ DebugMenu_80786C0\n"
+ " bl DebugMenu_8078758\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._457:\n"
+ " .align 2, 0\n"
+ "._456:\n"
+ " .word DebugMenu_80786C0+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078788()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r0, ._458 @ DebugMenu_80786D0\n"
+ " bl DebugMenu_8078758\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._459:\n"
+ " .align 2, 0\n"
+ "._458:\n"
+ " .word DebugMenu_80786D0+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_807879C()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r0, ._460 @ DebugMenu_8078714\n"
+ " bl DebugMenu_8078758\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._461:\n"
+ " .align 2, 0\n"
+ "._460:\n"
+ " .word DebugMenu_8078714+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_80787B0()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r0, ._462 @ gUnknown_Debug_839C3FC\n"
+ " bl DebugMenu_8077D78\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._463:\n"
+ " .align 2, 0\n"
+ "._462:\n"
+ " .word gUnknown_Debug_839C3FC\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_OpenLegendsRecord()
+{
+ asm(
+ " push {lr}\n"
+ " bl Menu_EraseScreen\n"
+ " ldr r0, ._464 @ gUnknown_Debug_839C3FC\n"
+ " mov r1, #0xc\n"
+ " mov r2, #0x3\n"
+ " bl DebugMenu_8077D24\n"
+ " ldr r1, ._464 + 4 @ gMenuCallback\n"
+ " ldr r0, ._464 + 8 @ DebugMenu_80787B0\n"
+ " str r0, [r1]\n"
+ " mov r0, #0x0\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._465:\n"
+ " .align 2, 0\n"
+ "._464:\n"
+ " .word gUnknown_Debug_839C3FC\n"
+ " .word gMenuCallback\n"
+ " .word DebugMenu_80787B0+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_80787EC()
+{
+ asm(
+ " push {r4, r5, lr}\n"
+ " add sp, sp, #0xfffffffc\n"
+ " mov r5, sp\n"
+ " add r5, r5, #0x2\n"
+ " mov r0, sp\n"
+ " add r1, r5, #0\n"
+ " bl GetXYCoordsOneStepInFrontOfPlayer\n"
+ " ldr r4, ._466 @ gSpecialVar_Result\n"
+ " mov r0, sp\n"
+ " mov r1, #0x0\n"
+ " ldsh r0, [r0, r1]\n"
+ " mov r2, #0x0\n"
+ " ldsh r1, [r5, r2]\n"
+ " bl MapGridGetMetatileBehaviorAt\n"
+ " strh r0, [r4]\n"
+ " ldr r0, ._466 + 4 @ gStringVar1\n"
+ " ldrh r1, [r4]\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x4\n"
+ " bl ConvertIntToHexStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0x0\n"
+ " ldsh r0, [r0, r1]\n"
+ " mov r2, #0x0\n"
+ " ldsh r1, [r5, r2]\n"
+ " bl MapGridGetMetatileIdAt\n"
+ " strh r0, [r4]\n"
+ " ldr r0, ._466 + 8 @ gStringVar2\n"
+ " ldrh r1, [r4]\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x4\n"
+ " bl ConvertIntToHexStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0x0\n"
+ " ldsh r0, [r0, r1]\n"
+ " mov r2, #0x0\n"
+ " ldsh r1, [r5, r2]\n"
+ " bl MapGridGetZCoordAt\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " strh r0, [r4]\n"
+ " ldr r0, ._466 + 12 @ gStringVar3\n"
+ " ldrh r1, [r4]\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x4\n"
+ " bl ConvertIntToHexStringN\n"
+ " ldr r0, ._466 + 16 @ gStringVar4\n"
+ " ldr r1, ._466 + 20 @ Str_839C414\n"
+ " bl StringExpandPlaceholders\n"
+ " add sp, sp, #0x4\n"
+ " pop {r4, r5}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._467:\n"
+ " .align 2, 0\n"
+ "._466:\n"
+ " .word gSpecialVar_Result\n"
+ " .word gStringVar1\n"
+ " .word gStringVar2\n"
+ " .word gStringVar3\n"
+ " .word gStringVar4\n"
+ " .word Str_839C414\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078880()
+{
+ asm(
+ " push {r4, r5, lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r5, r0, #0x18\n"
+ " ldr r1, ._472 @ gTasks\n"
+ " lsl r0, r5, #0x2\n"
+ " add r0, r0, r5\n"
+ " lsl r0, r0, #0x3\n"
+ " add r4, r0, r1\n"
+ " mov r1, #0x8\n"
+ " ldsh r0, [r4, r1]\n"
+ " cmp r0, #0x1\n"
+ " beq ._468 @cond_branch\n"
+ " cmp r0, #0x1\n"
+ " bgt ._469 @cond_branch\n"
+ " cmp r0, #0\n"
+ " beq ._470 @cond_branch\n"
+ " b ._480\n"
+ "._473:\n"
+ " .align 2, 0\n"
+ "._472:\n"
+ " .word gTasks\n"
+ "._469:\n"
+ " cmp r0, #0x2\n"
+ " beq ._474 @cond_branch\n"
+ " b ._480\n"
+ "._470:\n"
+ " bl Menu_DisplayDialogueFrame\n"
+ " b ._476\n"
+ "._468:\n"
+ " ldr r0, ._478 @ gStringVar4\n"
+ " mov r1, #0x2\n"
+ " mov r2, #0xf\n"
+ " bl Menu_PrintText\n"
+ "._476:\n"
+ " ldrh r0, [r4, #0x8]\n"
+ " add r0, r0, #0x1\n"
+ " strh r0, [r4, #0x8]\n"
+ " b ._480\n"
+ "._479:\n"
+ " .align 2, 0\n"
+ "._478:\n"
+ " .word gStringVar4\n"
+ "._474:\n"
+ " ldr r0, ._481 @ gMain\n"
+ " ldrh r1, [r0, #0x2e]\n"
+ " mov r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._480 @cond_branch\n"
+ " bl Menu_EraseScreen\n"
+ " bl ScriptContext2_Disable\n"
+ " add r0, r5, #0\n"
+ " bl DestroyTask\n"
+ "._480:\n"
+ " pop {r4, r5}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._482:\n"
+ " .align 2, 0\n"
+ "._481:\n"
+ " .word gMain\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_CellInfo()
+{
+ asm(
+ " push {lr}\n"
+ " bl CloseMenu\n"
+ " ldr r0, ._483 @ DebugMenu_8078880\n"
+ " mov r1, #0x50\n"
+ " bl CreateTask\n"
+ " bl DebugMenu_80787EC\n"
+ " bl ScriptContext2_Enable\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._484:\n"
+ " .align 2, 0\n"
+ "._483:\n"
+ " .word DebugMenu_8078880+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_OpenBerryInfo()
+{
+ asm(
+ " push {r4, lr}\n"
+ " bl DebugOpenBerryInfo\n"
+ " add r4, r0, #0\n"
+ " cmp r4, #0\n"
+ " bne ._485 @cond_branch\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ " b ._486\n"
+ "._485:\n"
+ " mov r0, #0x0\n"
+ " mov r1, #0x0\n"
+ " mov r2, #0x13\n"
+ " mov r3, #0x13\n"
+ " bl Menu_DrawStdWindowFrame\n"
+ " add r0, r4, #0\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0x1\n"
+ " bl Menu_PrintText\n"
+ " ldr r1, ._487 @ gMenuCallback\n"
+ " ldr r0, ._487 + 4 @ DebugMenu_8077DB4\n"
+ " str r0, [r1]\n"
+ " mov r0, #0x0\n"
+ "._486:\n"
+ " pop {r4}\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._488:\n"
+ " .align 2, 0\n"
+ "._487:\n"
+ " .word gMenuCallback\n"
+ " .word DebugMenu_8077DB4+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078950()
+{
+ asm(
+ " push {lr}\n"
+ " bl Menu_DisplayDialogueFrame\n"
+ " ldr r0, ._489 @ Str_839C42E\n"
+ " mov r1, #0x4\n"
+ " mov r2, #0xf\n"
+ " bl Menu_PrintText\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._490:\n"
+ " .align 2, 0\n"
+ "._489:\n"
+ " .word Str_839C42E\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078968()
+{
+ asm(
+ " push {lr}\n"
+ " lsl r0, r0, #0x10\n"
+ " cmp r0, #0\n"
+ " bne ._491 @cond_branch\n"
+ " ldr r0, ._493 @ gStringVar1\n"
+ " mov r1, #0x32\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x3\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " b ._492\n"
+ "._494:\n"
+ " .align 2, 0\n"
+ "._493:\n"
+ " .word gStringVar1\n"
+ "._491:\n"
+ " ldr r0, ._495 @ gStringVar1\n"
+ " mov r1, #0x64\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x3\n"
+ " bl ConvertIntToDecimalStringN\n"
+ "._492:\n"
+ " ldr r0, ._495 @ gStringVar1\n"
+ " mov r1, #0x4\n"
+ " mov r2, #0x11\n"
+ " bl Menu_PrintText\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._496:\n"
+ " .align 2, 0\n"
+ "._495:\n"
+ " .word gStringVar1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_80789A4()
+{
+ asm(
+ " push {r4, lr}\n"
+ " add r1, r0, #0\n"
+ " lsl r1, r1, #0x10\n"
+ " lsr r1, r1, #0x10\n"
+ " ldr r4, ._497 @ gStringVar1\n"
+ " add r0, r4, #0\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x4\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " add r0, r4, #0\n"
+ " mov r1, #0x9\n"
+ " mov r2, #0x11\n"
+ " bl Menu_PrintText\n"
+ " pop {r4}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._498:\n"
+ " .align 2, 0\n"
+ "._497:\n"
+ " .word gStringVar1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_80789CC()
+{
+ asm(
+ " push {r4, r5, r6, lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " lsl r4, r0, #0x2\n"
+ " add r4, r4, r0\n"
+ " lsl r4, r4, #0x3\n"
+ " ldr r6, ._499 @ gTasks\n"
+ " add r5, r4, r6\n"
+ " mov r0, #0x0\n"
+ " strh r0, [r5]\n"
+ " ldr r0, ._499 + 4 @ gSaveBlock2\n"
+ " ldr r1, ._499 + 8 @ 0x55c\n"
+ " add r0, r0, r1\n"
+ " ldrh r0, [r0]\n"
+ " strh r0, [r5, #0x2]\n"
+ " bl DebugMenu_8078950\n"
+ " ldrh r0, [r5]\n"
+ " bl DebugMenu_8078968\n"
+ " sub r6, r6, #0x8\n"
+ " add r4, r4, r6\n"
+ " ldr r0, ._499 + 12 @ DebugMenu_8078A14\n"
+ " str r0, [r4]\n"
+ " pop {r4, r5, r6}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._500:\n"
+ " .align 2, 0\n"
+ "._499:\n"
+ " .word gTasks+0x8\n"
+ " .word gSaveBlock2\n"
+ " .word 0x55c\n"
+ " .word DebugMenu_8078A14+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078A14()
+{
+ asm(
+ " push {r4, r5, lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " lsl r1, r0, #0x2\n"
+ " add r1, r1, r0\n"
+ " lsl r4, r1, #0x3\n"
+ " ldr r5, ._504 @ gTasks\n"
+ " add r2, r4, r5\n"
+ " ldr r0, ._504 + 4 @ gMain\n"
+ " ldrh r1, [r0, #0x2e]\n"
+ " mov r0, #0xc0\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._501 @cond_branch\n"
+ " mov r1, #0x0\n"
+ " mov r3, #0x0\n"
+ " ldsh r0, [r2, r3]\n"
+ " cmp r0, #0\n"
+ " bne ._502 @cond_branch\n"
+ " mov r1, #0x1\n"
+ "._502:\n"
+ " strh r1, [r2]\n"
+ " ldrh r0, [r2]\n"
+ " bl DebugMenu_8078968\n"
+ " b ._510\n"
+ "._505:\n"
+ " .align 2, 0\n"
+ "._504:\n"
+ " .word gTasks+0x8\n"
+ " .word gMain\n"
+ "._501:\n"
+ " mov r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._506 @cond_branch\n"
+ " ldr r1, ._508 @ gSaveBlock2\n"
+ " mov r3, #0x0\n"
+ " ldsh r0, [r2, r3]\n"
+ " lsl r0, r0, #0x1\n"
+ " ldr r3, ._508 + 4 @ 0x55c\n"
+ " add r1, r1, r3\n"
+ " add r0, r0, r1\n"
+ " ldrh r0, [r0]\n"
+ " strh r0, [r2, #0x2]\n"
+ " ldrh r0, [r2, #0x2]\n"
+ " bl DebugMenu_80789A4\n"
+ " add r0, r5, #0\n"
+ " sub r0, r0, #0x8\n"
+ " add r0, r4, r0\n"
+ " ldr r1, ._508 + 8 @ DebugMenu_8078AA4\n"
+ " b ._507\n"
+ "._509:\n"
+ " .align 2, 0\n"
+ "._508:\n"
+ " .word gSaveBlock2\n"
+ " .word 0x55c\n"
+ " .word DebugMenu_8078AA4+1\n"
+ "._506:\n"
+ " mov r0, #0x2\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._510 @cond_branch\n"
+ " add r0, r5, #0\n"
+ " sub r0, r0, #0x8\n"
+ " add r0, r4, r0\n"
+ " ldr r1, ._511 @ DebugMenu_8078B38\n"
+ "._507:\n"
+ " str r1, [r0]\n"
+ "._510:\n"
+ " pop {r4, r5}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._512:\n"
+ " .align 2, 0\n"
+ "._511:\n"
+ " .word DebugMenu_8078B38+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078AA4()
+{
+ asm(
+ " push {r4, r5, r6, r7, lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " lsl r1, r0, #0x2\n"
+ " add r1, r1, r0\n"
+ " lsl r5, r1, #0x3\n"
+ " ldr r7, ._515 @ gTasks\n"
+ " add r4, r5, r7\n"
+ " add r0, r4, #2\n"
+ " mov r2, #0xfa\n"
+ " lsl r2, r2, #0x3\n"
+ " ldr r6, ._515 + 4 @ gMain\n"
+ " ldrh r3, [r6, #0x30]\n"
+ " mov r1, #0x0\n"
+ " bl DebugMenu_8077DD8\n"
+ " cmp r0, #0x1\n"
+ " bne ._513 @cond_branch\n"
+ " ldrh r0, [r4, #0x2]\n"
+ " bl DebugMenu_80789A4\n"
+ " b ._521\n"
+ "._516:\n"
+ " .align 2, 0\n"
+ "._515:\n"
+ " .word gTasks+0x8\n"
+ " .word gMain\n"
+ "._513:\n"
+ " ldrh r1, [r6, #0x2e]\n"
+ " mov r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._517 @cond_branch\n"
+ " ldr r1, ._519 @ gSaveBlock2\n"
+ " mov r2, #0x0\n"
+ " ldsh r0, [r4, r2]\n"
+ " lsl r0, r0, #0x1\n"
+ " ldr r2, ._519 + 4 @ 0x55c\n"
+ " add r1, r1, r2\n"
+ " add r0, r0, r1\n"
+ " ldrh r1, [r4, #0x2]\n"
+ " strh r1, [r0]\n"
+ " mov r0, #0x49\n"
+ " bl PlaySE\n"
+ " add r0, r7, #0\n"
+ " sub r0, r0, #0x8\n"
+ " add r0, r5, r0\n"
+ " ldr r1, ._519 + 8 @ DebugMenu_8078B38\n"
+ " b ._518\n"
+ "._520:\n"
+ " .align 2, 0\n"
+ "._519:\n"
+ " .word gSaveBlock2\n"
+ " .word 0x55c\n"
+ " .word DebugMenu_8078B38+1\n"
+ "._517:\n"
+ " mov r0, #0x2\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._521 @cond_branch\n"
+ " bl DebugMenu_8078950\n"
+ " ldrh r0, [r4]\n"
+ " bl DebugMenu_8078968\n"
+ " add r0, r7, #0\n"
+ " sub r0, r0, #0x8\n"
+ " add r0, r5, r0\n"
+ " ldr r1, ._522 @ DebugMenu_8078A14\n"
+ "._518:\n"
+ " str r1, [r0]\n"
+ "._521:\n"
+ " pop {r4, r5, r6, r7}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._523:\n"
+ " .align 2, 0\n"
+ "._522:\n"
+ " .word DebugMenu_8078A14+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078B38()
+{
+ asm(
+ " push {r4, lr}\n"
+ " add r4, r0, #0\n"
+ " lsl r4, r4, #0x18\n"
+ " lsr r4, r4, #0x18\n"
+ " bl Menu_EraseScreen\n"
+ " bl ScriptContext2_Disable\n"
+ " add r0, r4, #0\n"
+ " bl DestroyTask\n"
+ " pop {r4}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_BattleTowerStages()
+{
+ asm(
+ " push {lr}\n"
+ " bl CloseMenu\n"
+ " bl ScriptContext2_Enable\n"
+ " ldr r0, ._524 @ DebugMenu_80789CC\n"
+ " mov r1, #0x50\n"
+ " bl CreateTask\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._525:\n"
+ " .align 2, 0\n"
+ "._524:\n"
+ " .word DebugMenu_80789CC+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078B70()
+{
+ asm(
+ " push {lr}\n"
+ " add r1, r0, #0\n"
+ " lsl r1, r1, #0x10\n"
+ " lsr r1, r1, #0x10\n"
+ " ldr r0, ._526 @ gStringVar1\n"
+ " mov r2, #0x0\n"
+ " mov r3, #0x1\n"
+ " bl ConvertIntToHexStringN\n"
+ " ldr r0, ._526 + 4 @ Str_839C438\n"
+ " bl sub_8071F40\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._527:\n"
+ " .align 2, 0\n"
+ "._526:\n"
+ " .word gStringVar1\n"
+ " .word Str_839C438\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078B94()
+{
+ asm(
+ " push {r4, r5, lr}\n"
+ " mov r3, #0x0\n"
+ " ldr r1, ._531 @ gUnknown_Debug_839C444\n"
+ " ldrb r0, [r1]\n"
+ " cmp r0, #0\n"
+ " beq ._529 @cond_branch\n"
+ " ldr r5, ._531 + 4 @ gSaveBlock1\n"
+ " add r4, r1, #0\n"
+ "._530:\n"
+ " lsl r0, r3, #0x3\n"
+ " add r2, r0, r5\n"
+ " add r0, r0, r4\n"
+ " ldr r1, [r0, #0x4]\n"
+ " ldr r0, [r0]\n"
+ " str r0, [r2]\n"
+ " str r1, [r2, #0x4]\n"
+ " add r0, r3, #1\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r3, r0, #0x18\n"
+ " cmp r3, #0x27\n"
+ " bhi ._529 @cond_branch\n"
+ " lsl r0, r3, #0x3\n"
+ " add r0, r0, r4\n"
+ " ldrb r0, [r0]\n"
+ " cmp r0, #0\n"
+ " bne ._530 @cond_branch\n"
+ "._529:\n"
+ " pop {r4, r5}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._532:\n"
+ " .align 2, 0\n"
+ "._531:\n"
+ " .word gUnknown_Debug_839C444\n"
+ " .word gSaveBlock1+0x7f8\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078BD4()
+{
+ asm(
+ " push {r4, r5, lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r5, r0, #0x18\n"
+ " lsl r0, r5, #0x2\n"
+ " add r0, r0, r5\n"
+ " lsl r0, r0, #0x3\n"
+ " ldr r1, ._536 @ gTasks\n"
+ " add r4, r0, r1\n"
+ " mov r1, #0x0\n"
+ " ldsh r0, [r4, r1]\n"
+ " cmp r0, #0\n"
+ " beq ._533 @cond_branch\n"
+ " cmp r0, #0x1\n"
+ " beq ._534 @cond_branch\n"
+ " b ._545\n"
+ "._537:\n"
+ " .align 2, 0\n"
+ "._536:\n"
+ " .word gTasks+0x8\n"
+ "._533:\n"
+ " ldrh r0, [r4, #0x2]\n"
+ " bl DebugMenu_8078B70\n"
+ " ldrh r0, [r4]\n"
+ " add r0, r0, #0x1\n"
+ " strh r0, [r4]\n"
+ " b ._545\n"
+ "._534:\n"
+ " ldr r2, ._541 @ gMain\n"
+ " ldrh r1, [r2, #0x2e]\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._539 @cond_branch\n"
+ " mov r0, #0x49\n"
+ " bl PlaySE\n"
+ " bl Menu_EraseScreen\n"
+ " add r0, r5, #0\n"
+ " bl DestroyTask\n"
+ " bl ScriptContext2_Disable\n"
+ " bl DebugMenu_8078B94\n"
+ " b ._545\n"
+ "._542:\n"
+ " .align 2, 0\n"
+ "._541:\n"
+ " .word gMain\n"
+ "._539:\n"
+ " mov r0, #0x2\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._543 @cond_branch\n"
+ " bl Menu_EraseScreen\n"
+ " add r0, r5, #0\n"
+ " bl DestroyTask\n"
+ " bl ScriptContext2_Disable\n"
+ " b ._545\n"
+ "._543:\n"
+ " add r0, r4, #2\n"
+ " ldrh r3, [r2, #0x30]\n"
+ " mov r1, #0x0\n"
+ " mov r2, #0x4\n"
+ " bl DebugMenu_8077DD8\n"
+ " cmp r0, #0x1\n"
+ " bne ._545 @cond_branch\n"
+ " ldrh r0, [r4, #0x2]\n"
+ " bl DebugMenu_8078B70\n"
+ "._545:\n"
+ " pop {r4, r5}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_CheckPKBLCK()
+{
+ asm(
+ " push {lr}\n"
+ " bl CloseMenu\n"
+ " ldr r0, ._546 @ DebugMenu_8078BD4\n"
+ " mov r1, #0x50\n"
+ " bl CreateTask\n"
+ " bl ScriptContext2_Enable\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._547:\n"
+ " .align 2, 0\n"
+ "._546:\n"
+ " .word DebugMenu_8078BD4+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078C80()
+{
+ asm(
+ " push {lr}\n"
+ " bl Menu_DisplayDialogueFrame\n"
+ " ldr r0, ._548 @ Str_839C5A4\n"
+ " mov r1, #0x2\n"
+ " mov r2, #0xf\n"
+ " bl Menu_PrintText\n"
+ " ldr r1, ._548 + 4 @ gMenuCallback\n"
+ " ldr r0, ._548 + 8 @ DebugMenu_8078CA8\n"
+ " str r0, [r1]\n"
+ " mov r0, #0x0\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._549:\n"
+ " .align 2, 0\n"
+ "._548:\n"
+ " .word Str_839C5A4\n"
+ " .word gMenuCallback\n"
+ " .word DebugMenu_8078CA8+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078CA8()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r0, ._552 @ gMain\n"
+ " ldrh r1, [r0, #0x2e]\n"
+ " mov r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._550 @cond_branch\n"
+ " ldr r1, ._552 + 4 @ gMenuCallback\n"
+ " ldr r0, ._552 + 8 @ DebugMenu_8078CE4\n"
+ " str r0, [r1]\n"
+ " mov r0, #0x0\n"
+ " b ._555\n"
+ "._553:\n"
+ " .align 2, 0\n"
+ "._552:\n"
+ " .word gMain\n"
+ " .word gMenuCallback\n"
+ " .word DebugMenu_8078CE4+1\n"
+ "._550:\n"
+ " mov r0, #0x2\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " bne ._554 @cond_branch\n"
+ " mov r0, #0x0\n"
+ " b ._555\n"
+ "._554:\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ "._555:\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078CE4()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r1, ._558 @ \n"
+ " mov r2, #0x80\n"
+ " lsl r2, r2, #0xa\n"
+ " mov r0, #0x0\n"
+ " bl DebugMenu_8078E40\n"
+ " cmp r0, #0x1\n"
+ " bne ._556 @cond_branch\n"
+ " ldr r0, ._558 + 4 @ \n"
+ " ldr r1, ._558 + 8 @ \n"
+ " bl StringCopy\n"
+ " b ._557\n"
+ "._559:\n"
+ " .align 2, 0\n"
+ "._558:\n"
+ " .word +0x2000000\n"
+ " .word gStringVar4\n"
+ " .word Str_839C5CC\n"
+ "._556:\n"
+ " ldr r0, ._560 @ gStringVar4\n"
+ " ldr r1, ._560 + 4 @ Str_839C5DF\n"
+ " bl StringCopy\n"
+ "._557:\n"
+ " ldr r1, ._560 + 8 @ gMenuCallback\n"
+ " ldr r0, ._560 + 12 @ DebugMenu_8078D7C\n"
+ " str r0, [r1]\n"
+ " mov r0, #0x0\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._561:\n"
+ " .align 2, 0\n"
+ "._560:\n"
+ " .word gStringVar4\n"
+ " .word Str_839C5DF\n"
+ " .word gMenuCallback\n"
+ " .word DebugMenu_8078D7C+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078D30()
+{
+ asm(
+ " push {r4, r5, r6, lr}\n"
+ " ldr r5, ._563 @ \n"
+ " mov r4, #0x0\n"
+ " mov r6, #0x80\n"
+ " lsl r6, r6, #0x5\n"
+ "._562:\n"
+ " add r0, r4, #0\n"
+ " add r1, r5, #0\n"
+ " add r2, r6, #0\n"
+ " bl DebugMenu_8078E68\n"
+ " add r5, r5, r6\n"
+ " add r0, r4, #1\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r4, r0, #0x18\n"
+ " cmp r4, #0x1f\n"
+ " bls ._562 @cond_branch\n"
+ " ldr r0, ._563 + 4 @ \n"
+ " ldr r1, ._563 + 8 @ \n"
+ " bl StringCopy\n"
+ " ldr r1, ._563 + 12 @ \n"
+ " ldr r0, ._563 + 16 @ \n"
+ " str r0, [r1]\n"
+ " mov r0, #0x0\n"
+ " pop {r4, r5, r6}\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._564:\n"
+ " .align 2, 0\n"
+ "._563:\n"
+ " .word +0x2000000\n"
+ " .word gStringVar4\n"
+ " .word Str_839C5D6\n"
+ " .word gMenuCallback\n"
+ " .word DebugMenu_8078D7C+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078D7C()
+{
+ asm(
+ " push {lr}\n"
+ " bl Menu_DisplayDialogueFrame\n"
+ " ldr r0, ._565 @ gStringVar4\n"
+ " mov r1, #0x2\n"
+ " mov r2, #0xf\n"
+ " bl Menu_PrintText\n"
+ " ldr r1, ._565 + 4 @ gMenuCallback\n"
+ " ldr r0, ._565 + 8 @ DebugMenu_8078DA4\n"
+ " str r0, [r1]\n"
+ " mov r0, #0x0\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._566:\n"
+ " .align 2, 0\n"
+ "._565:\n"
+ " .word gStringVar4\n"
+ " .word gMenuCallback\n"
+ " .word DebugMenu_8078DA4+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078DA4()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r0, ._569 @ gMain\n"
+ " ldrh r1, [r0, #0x2e]\n"
+ " mov r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " bne ._567 @cond_branch\n"
+ " mov r0, #0x0\n"
+ " b ._568\n"
+ "._570:\n"
+ " .align 2, 0\n"
+ "._569:\n"
+ " .word gMain\n"
+ "._567:\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ "._568:\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_MeTooBackupMan()
+{
+ asm(
+ " push {lr}\n"
+ " bl Menu_EraseScreen\n"
+ " ldr r0, ._571 @ gUnknown_Debug_839C594\n"
+ " mov r1, #0xc\n"
+ " mov r2, #0x2\n"
+ " bl DebugMenu_8077D24\n"
+ " ldr r1, ._571 + 4 @ gMenuCallback\n"
+ " ldr r0, ._571 + 8 @ DebugMenu_8078DF0\n"
+ " str r0, [r1]\n"
+ " mov r0, #0x0\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._572:\n"
+ " .align 2, 0\n"
+ "._571:\n"
+ " .word gUnknown_Debug_839C594\n"
+ " .word gMenuCallback\n"
+ " .word DebugMenu_8078DF0+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078DF0()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r0, ._573 @ gUnknown_Debug_839C594\n"
+ " bl DebugMenu_8077D78\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._574:\n"
+ " .align 2, 0\n"
+ "._573:\n"
+ " .word gUnknown_Debug_839C594\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078E04()
+{
+ asm(
+ " push {r4, r5, r6, lr}\n"
+ " add r6, r1, #0\n"
+ " add r5, r2, #0\n"
+ " b ._575\n"
+ "._577:\n"
+ " ldr r0, ._579 @ 0xfffff000\n"
+ " add r5, r5, r0\n"
+ " mov r0, #0x80\n"
+ " lsl r0, r0, #0x5\n"
+ " add r6, r6, r0\n"
+ " add r0, r4, #1\n"
+ "._575:\n"
+ " lsl r0, r0, #0x10\n"
+ " lsr r4, r0, #0x10\n"
+ " add r0, r4, #0\n"
+ " add r1, r6, #0\n"
+ " bl ProgramFlashSectorAndVerify\n"
+ " cmp r0, #0\n"
+ " bne ._576 @cond_branch\n"
+ " mov r0, #0x80\n"
+ " lsl r0, r0, #0x5\n"
+ " cmp r5, r0\n"
+ " bhi ._577 @cond_branch\n"
+ " mov r0, #0x1\n"
+ " b ._578\n"
+ "._580:\n"
+ " .align 2, 0\n"
+ "._579:\n"
+ " .word 0xfffff000\n"
+ "._576:\n"
+ " mov r0, #0x0\n"
+ "._578:\n"
+ " pop {r4, r5, r6}\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078E40()
+{
+ asm(
+ " push {r4, r5, r6, lr}\n"
+ " add r4, r0, #0\n"
+ " add r5, r1, #0\n"
+ " add r6, r2, #0\n"
+ " lsl r4, r4, #0x18\n"
+ " lsr r4, r4, #0x18\n"
+ " bl m4aSoundVSyncOff\n"
+ " add r0, r4, #0\n"
+ " add r1, r5, #0\n"
+ " add r2, r6, #0\n"
+ " bl DebugMenu_8078E04\n"
+ " add r4, r0, #0\n"
+ " bl m4aSoundVSyncOn\n"
+ " add r0, r4, #0\n"
+ " pop {r4, r5, r6}\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078E68()
+{
+ asm(
+ " push {r4, lr}\n"
+ " add r4, r1, #0\n"
+ " add r3, r2, #0\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " mov r1, #0x0\n"
+ " add r2, r4, #0\n"
+ " bl ReadFlash\n"
+ " pop {r4}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078E80()
+{
+ asm(
+ " push {r4, lr}\n"
+ " add r4, r0, #0\n"
+ " mov r0, #0x2\n"
+ " mov r1, #0xf\n"
+ " mov r2, #0x16\n"
+ " mov r3, #0x10\n"
+ " bl Menu_BlankWindowRect\n"
+ " ldr r1, ._581 @ gUnknown_Debug_839C5F4\n"
+ " mov r2, #0x0\n"
+ " ldsh r0, [r4, r2]\n"
+ " lsl r0, r0, #0x3\n"
+ " add r0, r0, r1\n"
+ " ldrb r1, [r0, #0x4]\n"
+ " mov r0, #0xd0\n"
+ " mov r2, #0xf\n"
+ " bl sub_8071F60\n"
+ " pop {r4}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._582:\n"
+ " .align 2, 0\n"
+ "._581:\n"
+ " .word gUnknown_Debug_839C5F4\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078EB0()
+{
+ asm(
+ " push {r4, r5, lr}\n"
+ " add r5, r0, #0\n"
+ " ldr r4, ._583 @ gStringVar1\n"
+ " mov r0, #0x2\n"
+ " ldsh r1, [r5, r0]\n"
+ " add r0, r4, #0\n"
+ " mov r2, #0x1\n"
+ " mov r3, #0x3\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " add r0, r4, #0\n"
+ " mov r1, #0x2\n"
+ " mov r2, #0x11\n"
+ " bl Menu_PrintText\n"
+ " mov r0, #0xf0\n"
+ " mov r1, #0x5\n"
+ " mov r2, #0x11\n"
+ " bl sub_8071F60\n"
+ " mov r0, #0x4\n"
+ " ldsh r1, [r5, r0]\n"
+ " add r0, r4, #0\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x2\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " add r0, r4, #0\n"
+ " mov r1, #0x6\n"
+ " mov r2, #0x11\n"
+ " bl Menu_PrintText\n"
+ " mov r0, #0xf0\n"
+ " mov r1, #0x8\n"
+ " mov r2, #0x11\n"
+ " bl sub_8071F60\n"
+ " mov r0, #0x6\n"
+ " ldsh r1, [r5, r0]\n"
+ " add r0, r4, #0\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x2\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " add r0, r4, #0\n"
+ " mov r1, #0x9\n"
+ " mov r2, #0x11\n"
+ " bl Menu_PrintText\n"
+ " pop {r4, r5}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._584:\n"
+ " .align 2, 0\n"
+ "._583:\n"
+ " .word gStringVar1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078F1C()
+{
+ asm(
+ " push {r4, r5, r6, lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " lsl r4, r0, #0x2\n"
+ " add r4, r4, r0\n"
+ " lsl r4, r4, #0x3\n"
+ " ldr r6, ._585 @ gTasks\n"
+ " add r5, r4, r6\n"
+ " mov r0, #0x0\n"
+ " strh r0, [r5]\n"
+ " ldr r1, ._585 + 4 @ gSaveBlock2\n"
+ " ldrh r0, [r1, #0xe]\n"
+ " strh r0, [r5, #0x2]\n"
+ " ldrb r0, [r1, #0x10]\n"
+ " strh r0, [r5, #0x4]\n"
+ " ldrb r0, [r1, #0x11]\n"
+ " strh r0, [r5, #0x6]\n"
+ " bl Menu_DisplayDialogueFrame\n"
+ " add r0, r5, #0\n"
+ " bl DebugMenu_8078EB0\n"
+ " add r0, r5, #0\n"
+ " bl DebugMenu_8078E80\n"
+ " sub r6, r6, #0x8\n"
+ " add r4, r4, r6\n"
+ " ldr r0, ._585 + 8 @ DebugMenu_8078F68\n"
+ " str r0, [r4]\n"
+ " pop {r4, r5, r6}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._586:\n"
+ " .align 2, 0\n"
+ "._585:\n"
+ " .word gTasks+0x8\n"
+ " .word gSaveBlock2\n"
+ " .word DebugMenu_8078F68+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8078F68()
+{
+ asm(
+ " push {r4, r5, r6, lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " lsl r1, r0, #0x2\n"
+ " add r1, r1, r0\n"
+ " lsl r5, r1, #0x3\n"
+ " ldr r6, ._589 @ gTasks\n"
+ " add r4, r5, r6\n"
+ " ldr r3, ._589 + 4 @ gMain\n"
+ " ldrh r1, [r3, #0x2e]\n"
+ " mov r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._587 @cond_branch\n"
+ " ldr r1, ._589 + 8 @ gSaveBlock2\n"
+ " ldrh r0, [r4, #0x2]\n"
+ " strh r0, [r1, #0xe]\n"
+ " ldrh r0, [r4, #0x4]\n"
+ " strb r0, [r1, #0x10]\n"
+ " ldrh r0, [r4, #0x6]\n"
+ " strb r0, [r1, #0x11]\n"
+ " mov r0, #0x49\n"
+ " bl PlaySE\n"
+ " b ._588\n"
+ "._590:\n"
+ " .align 2, 0\n"
+ "._589:\n"
+ " .word gTasks+0x8\n"
+ " .word gMain\n"
+ " .word gSaveBlock2\n"
+ "._587:\n"
+ " mov r0, #0x2\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._591 @cond_branch\n"
+ "._588:\n"
+ " add r0, r6, #0\n"
+ " sub r0, r0, #0x8\n"
+ " add r0, r5, r0\n"
+ " ldr r1, ._593 @ DebugMenu_8079020\n"
+ " str r1, [r0]\n"
+ " b ._601\n"
+ "._594:\n"
+ " .align 2, 0\n"
+ "._593:\n"
+ " .word DebugMenu_8079020+1\n"
+ "._591:\n"
+ " mov r0, #0x20\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._595 @cond_branch\n"
+ " ldrh r1, [r4]\n"
+ " mov r2, #0x0\n"
+ " ldsh r0, [r4, r2]\n"
+ " cmp r0, #0\n"
+ " beq ._601 @cond_branch\n"
+ " sub r0, r1, #1\n"
+ " b ._597\n"
+ "._595:\n"
+ " mov r0, #0x10\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._598 @cond_branch\n"
+ " ldrh r0, [r4]\n"
+ " cmp r0, #0x1\n"
+ " bhi ._601 @cond_branch\n"
+ " add r0, r0, #0x1\n"
+ "._597:\n"
+ " strh r0, [r4]\n"
+ " add r0, r4, #0\n"
+ " bl DebugMenu_8078E80\n"
+ " b ._601\n"
+ "._598:\n"
+ " mov r0, #0x0\n"
+ " ldsh r2, [r4, r0]\n"
+ " lsl r2, r2, #0x3\n"
+ " ldr r0, ._602 @ gUnknown_Debug_839C5F4\n"
+ " add r2, r2, r0\n"
+ " ldrb r0, [r2, #0x5]\n"
+ " lsl r0, r0, #0x1\n"
+ " add r0, r4, r0\n"
+ " ldrh r1, [r2]\n"
+ " ldrh r2, [r2, #0x2]\n"
+ " ldrh r3, [r3, #0x30]\n"
+ " bl DebugMenu_8077DD8\n"
+ " cmp r0, #0x1\n"
+ " bne ._601 @cond_branch\n"
+ " add r0, r4, #0\n"
+ " bl DebugMenu_8078EB0\n"
+ "._601:\n"
+ " pop {r4, r5, r6}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._603:\n"
+ " .align 2, 0\n"
+ "._602:\n"
+ " .word gUnknown_Debug_839C5F4\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8079020()
+{
+ asm(
+ " push {r4, lr}\n"
+ " add r4, r0, #0\n"
+ " lsl r4, r4, #0x18\n"
+ " lsr r4, r4, #0x18\n"
+ " bl Menu_EraseScreen\n"
+ " bl ScriptContext2_Disable\n"
+ " add r0, r4, #0\n"
+ " bl DestroyTask\n"
+ " pop {r4}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_PTime()
+{
+ asm(
+ " push {lr}\n"
+ " bl CloseMenu\n"
+ " ldr r0, ._604 @ DebugMenu_8078F1C\n"
+ " mov r1, #0x50\n"
+ " bl CreateTask\n"
+ " bl ScriptContext2_Enable\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._605:\n"
+ " .align 2, 0\n"
+ "._604:\n"
+ " .word DebugMenu_8078F1C+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8079058()
+{
+ asm(
+ " push {r4, r5, lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r5, r0, #0x18\n"
+ " ldr r1, ._610 @ gTasks\n"
+ " lsl r0, r5, #0x2\n"
+ " add r0, r0, r5\n"
+ " lsl r0, r0, #0x3\n"
+ " add r4, r0, r1\n"
+ " mov r0, #0x8\n"
+ " ldsh r1, [r4, r0]\n"
+ " cmp r1, #0x1\n"
+ " beq ._606 @cond_branch\n"
+ " cmp r1, #0x1\n"
+ " bgt ._607 @cond_branch\n"
+ " cmp r1, #0\n"
+ " beq ._608 @cond_branch\n"
+ " b ._620\n"
+ "._611:\n"
+ " .align 2, 0\n"
+ "._610:\n"
+ " .word gTasks\n"
+ "._607:\n"
+ " cmp r1, #0x2\n"
+ " beq ._612 @cond_branch\n"
+ " b ._620\n"
+ "._608:\n"
+ " ldr r0, ._615 @ gUnknown_Debug_03004BD0\n"
+ " str r1, [r0]\n"
+ " bl Menu_DisplayDialogueFrame\n"
+ " b ._614\n"
+ "._616:\n"
+ " .align 2, 0\n"
+ "._615:\n"
+ " .word gUnknown_Debug_03004BD0\n"
+ "._606:\n"
+ " ldr r0, ._618 @ gDebug0x839C60C\n"
+ " mov r1, #0x4\n"
+ " mov r2, #0xf\n"
+ " bl Menu_PrintText\n"
+ " mov r0, #0x14\n"
+ " mov r1, #0x8\n"
+ " mov r2, #0x1\n"
+ " bl DisplayYesNoMenu\n"
+ "._614:\n"
+ " ldrh r0, [r4, #0x8]\n"
+ " add r0, r0, #0x1\n"
+ " strh r0, [r4, #0x8]\n"
+ " b ._620\n"
+ "._619:\n"
+ " .align 2, 0\n"
+ "._618:\n"
+ " .word gDebug0x839C60C\n"
+ "._612:\n"
+ " bl Menu_ProcessInputNoWrap_\n"
+ " lsl r0, r0, #0x18\n"
+ " asr r1, r0, #0x18\n"
+ " mov r0, #0x2\n"
+ " neg r0, r0\n"
+ " cmp r1, r0\n"
+ " beq ._620 @cond_branch\n"
+ " cmp r1, #0\n"
+ " bne ._621 @cond_branch\n"
+ " ldr r1, ._623 @ gUnknown_Debug_03004BD0\n"
+ " mov r0, #0x1\n"
+ " b ._622\n"
+ "._624:\n"
+ " .align 2, 0\n"
+ "._623:\n"
+ " .word gUnknown_Debug_03004BD0\n"
+ "._621:\n"
+ " ldr r1, ._625 @ gUnknown_Debug_03004BD0\n"
+ " mov r0, #0x0\n"
+ "._622:\n"
+ " str r0, [r1]\n"
+ " bl Menu_EraseScreen\n"
+ " bl ScriptContext2_Disable\n"
+ " add r0, r5, #0\n"
+ " bl DestroyTask\n"
+ "._620:\n"
+ " pop {r4, r5}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._626:\n"
+ " .align 2, 0\n"
+ "._625:\n"
+ " .word gUnknown_Debug_03004BD0\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_OpenMurakawa()
+{
+ asm(
+ " push {lr}\n"
+ " bl CloseMenu\n"
+ " ldr r0, ._627 @ DebugMenu_8079058\n"
+ " mov r1, #0x50\n"
+ " bl CreateTask\n"
+ " bl ScriptContext2_Enable\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._628:\n"
+ " .align 2, 0\n"
+ "._627:\n"
+ " .word DebugMenu_8079058+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void DebugMenu_8079110()
+{
+ asm(
+ " push {r4, r5, lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r5, r0, #0x18\n"
+ " ldr r1, ._633 @ gTasks\n"
+ " lsl r0, r5, #0x2\n"
+ " add r0, r0, r5\n"
+ " lsl r0, r0, #0x3\n"
+ " add r4, r0, r1\n"
+ " mov r1, #0x8\n"
+ " ldsh r0, [r4, r1]\n"
+ " cmp r0, #0x1\n"
+ " beq ._629 @cond_branch\n"
+ " cmp r0, #0x1\n"
+ " bgt ._630 @cond_branch\n"
+ " cmp r0, #0\n"
+ " beq ._631 @cond_branch\n"
+ " b ._642\n"
+ "._634:\n"
+ " .align 2, 0\n"
+ "._633:\n"
+ " .word gTasks\n"
+ "._630:\n"
+ " cmp r0, #0x2\n"
+ " beq ._635 @cond_branch\n"
+ " b ._642\n"
+ "._631:\n"
+ " bl Menu_DisplayDialogueFrame\n"
+ " b ._637\n"
+ "._629:\n"
+ " ldr r0, ._639 @ Str_839C61A\n"
+ " mov r1, #0x2\n"
+ " mov r2, #0xf\n"
+ " bl MenuPrintMessage\n"
+ "._637:\n"
+ " ldrh r0, [r4, #0x8]\n"
+ " add r0, r0, #0x1\n"
+ " strh r0, [r4, #0x8]\n"
+ " b ._642\n"
+ "._640:\n"
+ " .align 2, 0\n"
+ "._639:\n"
+ " .word Str_839C61A\n"
+ "._635:\n"
+ " bl Menu_UpdateWindowText\n"
+ " lsl r0, r0, #0x18\n"
+ " cmp r0, #0\n"
+ " beq ._642 @cond_branch\n"
+ " ldr r0, ._643 @ gMain\n"
+ " ldrh r1, [r0, #0x2e]\n"
+ " mov r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._642 @cond_branch\n"
+ " bl Menu_EraseScreen\n"
+ " bl ScriptContext2_Disable\n"
+ " add r0, r5, #0\n"
+ " bl DestroyTask\n"
+ "._642:\n"
+ " pop {r4, r5}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._644:\n"
+ " .align 2, 0\n"
+ "._643:\n"
+ " .word gMain\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+u8 DebugMenu_OpenKiwa()
+{
+ asm(
+ " push {lr}\n"
+ " bl CloseMenu\n"
+ " ldr r0, ._645 @ DebugMenu_8079110\n"
+ " mov r1, #0x50\n"
+ " bl CreateTask\n"
+ " bl ScriptContext2_Enable\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._646:\n"
+ " .align 2, 0\n"
+ "._645:\n"
+ " .word DebugMenu_8079110+1\n"
+ "\n"
+ );
+}
+
+#endif
diff --git a/src/debug/taya_debug_window.c b/src/debug/taya_debug_window.c
new file mode 100644
index 000000000..f7e0e3770
--- /dev/null
+++ b/src/debug/taya_debug_window.c
@@ -0,0 +1,6 @@
+#if DEBUG
+#include "global.h"
+
+EWRAM_DATA u8 unk_2030224[4] = { 0 };
+
+#endif
diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c
new file mode 100644
index 000000000..3d4637746
--- /dev/null
+++ b/src/debug/tomomichi_debug_menu.c
@@ -0,0 +1,4483 @@
+#if DEBUG
+#include "global.h"
+#include "ewram.h"
+#include "string_util.h"
+#include "palette.h"
+#include "data2.h"
+#include "event_data.h"
+#include "constants/flags.h"
+#include "constants/songs.h"
+#include "constants/species.h"
+#include "overworld.h"
+#include "script.h"
+#include "menu.h"
+#include "start_menu.h"
+#include "main.h"
+#include "contest_painting.h"
+#include "sound.h"
+
+static u16 sPicTest_Species;
+static u32 sPicTest_OTID;
+static u32 sPicTest_Personality;
+static u8 sPicTest_ContestType;
+static u8 sPicTest_MuseumArtTitleType;
+static u8 sPicTest_PreviewType;
+static u8 sFlagAndVarTest_WhichSubmenu;
+static u8 sPicTest_StringBuffer[13];
+static u8 sTopMenuCursorPos;
+static u8 sTrickRelatedMenuCursorPos;
+static u8 sControlEventsCursorPos;
+static u8 sControlFlagsCursorPos;
+static u8 sControlWORKCursorPos;
+
+static bool8 ArtMusGraphics(void);
+static bool8 DummyMenuAction(void);
+static bool8 ContestGraphics(void);
+static bool8 ContestGraphics_Show(void);
+static bool8 ControlEvents(void);
+static bool8 ControlFlags(void);
+static bool8 ControlWorks(void);
+static bool8 MuseumGraphics_Show(void);
+static bool8 PreviewData(void);
+static bool8 TrickHouse(void);
+static bool8 InitDebugWindow(void);
+static bool8 TopMenu_HandleInput(void);
+static bool8 ContestGraphics_HandleInput(void);
+static bool8 ArtMusGraphics_HandleInput(void);
+static bool8 PreviewData_HandleInput(void);
+static bool8 TrickHouse_HandleInput(void);
+static bool8 ControlEvents_HandleInput(void);
+static bool8 ControlFlags_HandleInput(void);
+static bool8 ControlWorks_HandleInput(void);
+static bool8 ControlEvents_InitSubmenu1(void);
+static bool8 ControlEvents_InitSubmenu2(void);
+static bool8 ControlEvents_Events1_HandleInput(void);
+static bool8 ControlEvents_Events2_HandleInput(void);
+static bool8 CallScript_DoHallOfFame(void);
+static bool8 CallScript_GiveCoinCaseIfNotAlreadyOwned(void);
+static bool8 CallScript_SetOldaleStateAfterRoute103Rival(void);
+static bool8 CallScript_OpenNewMauville(void);
+static bool8 CallScript_GiveSSTicketAndDoHallOfFame(void);
+static bool8 CallScript_GiveKyogreEgg(void);
+static bool8 CallScript_GiveAllItems(void);
+static bool8 CallScript_GiveAllDecorations(void);
+static bool8 CallScript_GiveAllCoins(void);
+static bool8 CallScript_OpenSootopolisGym(void);
+static bool8 CallScript_SetMoneyTo0(void);
+static bool8 CallScript_FillPartyWithBarboach(void);
+static bool8 CallScript_FillPartyWithShroomish(void);
+static bool8 CallScript_GiveBarboachEgg(void);
+static bool8 CallScript_GiveShroomishEgg(void);
+static bool8 debug_sub_808C280(void);
+static bool8 debug_sub_808C2E4(void);
+static bool8 ControlFlags_EventFlag_InitSubmenu(void);
+static bool8 debug_sub_808C36C(void);
+static bool8 debug_sub_808C3B0(void);
+static bool8 debug_sub_808C408(void);
+static bool8 debug_sub_808C460(void);
+static bool8 debug_sub_808C4B8(void);
+static bool8 debug_sub_808C510(void);
+static bool8 debug_sub_808C568(void);
+static bool8 debug_sub_808C5C0(void);
+static bool8 debug_sub_808C618(void);
+static bool8 debug_sub_808C670(void);
+static bool8 debug_sub_808C6C8(void);
+static void debug_sub_808C714(u8, u8);
+static void debug_sub_808C764(u8);
+static bool8 ControlFlags_VanishFlag_InitSubmenu(void);
+static bool8 debug_sub_808C818(void);
+static bool8 debug_sub_808C85C(void);
+static bool8 debug_sub_808C8B4(void);
+static bool8 debug_sub_808C90C(void);
+static bool8 debug_sub_808C964(void);
+static bool8 debug_sub_808C9BC(void);
+static bool8 debug_sub_808CA14(void);
+static bool8 debug_sub_808CA6C(void);
+static bool8 debug_sub_808CAC4(void);
+static bool8 debug_sub_808CB1C(void);
+static bool8 debug_sub_808CB74(void);
+static void debug_sub_808CBC0(u8, u8);
+static void debug_sub_808CC10(u8);
+static bool8 ControlFlags_TrainerFlag_InitSubmenu(void);
+static bool8 debug_sub_808CCC4(void);
+static bool8 debug_sub_808CD08(void);
+static bool8 debug_sub_808CD60(void);
+static bool8 debug_sub_808CDB8(void);
+static bool8 debug_sub_808CE10(void);
+static void debug_sub_808CE5C(u8, u8);
+static void debug_sub_808CEAC(u8);
+static bool8 ControlFlags_SysFlag_InitSubmenu(void);
+static bool8 debug_sub_808CF60(void);
+static bool8 debug_sub_808CFA4(void);
+static bool8 debug_sub_808CFFC(void);
+static bool8 debug_sub_808D054(void);
+static bool8 debug_sub_808D0AC(void);
+static bool8 debug_sub_808D104(void);
+static bool8 debug_sub_808D15C(void);
+static bool8 debug_sub_808D1B4(void);
+static bool8 debug_sub_808D20C(void);
+static bool8 debug_sub_808D264(void);
+static bool8 debug_sub_808D2BC(void);
+static void debug_sub_808D308(u8, u8);
+static void debug_sub_808D358(u8);
+static bool8 ControlFlags_FH_OBJ_InitSubmenu(void);
+static bool8 ControlFlags_FH_OBJ_HandleInput(void);
+static bool8 ControlFlags_FH_OBJ00_08_InitSubsubmenu(void);
+static bool8 ControlFlags_FH_OBJ09_15_InitSubsubmenu(void);
+static bool8 ControlFlags_FH_OBJ_Subsubmenu_HandleInput(void);
+static void ControlFlags_FH_OBJ_FlagToggle(u8, u8);
+static void ControlFlags_FH_OBJ_UpdateDisplay(u8);
+static bool8 ControlFlags_FH_InitSubmenu(void);
+static bool8 debug_sub_808D650(void);
+static bool8 debug_sub_808D694(void);
+static bool8 debug_sub_808D6EC(void);
+static bool8 debug_sub_808D744(void);
+static void debug_sub_808D790(u8, u8);
+static void debug_sub_808D7E0(u8);
+static bool8 ControlFlags_BallVanishFlag_InitSubmenu(void);
+static bool8 debug_sub_808D894(void);
+static bool8 debug_sub_808D8D8(void);
+static bool8 debug_sub_808D930(void);
+static void debug_sub_808D97C(u8, u8);
+static void debug_sub_808D9CC(u8);
+static bool8 ControlWorks_AnsWork_InitSubmenu(void);
+static bool8 ControlWorks_AnsWork_HandleInput(void);
+static void ControlWorks_AnsWork_PrintRESULT(void);
+static void ControlWorks_AnsWork_AdjustRESULT(void);
+static bool8 ControlWorks_SaveWork_InitSubmenu(void);
+static bool8 ControlWorks_SaveWork_HandleInput(void);
+static bool8 ControlWorks_SaveWork_Town_InitSubsubmenu(void);
+static bool8 ControlWorks_SaveWork_City_InitSubsubmenu(void);
+static bool8 ControlWorks_SaveWork_Route101To109_InitSubsubmenu(void);
+static bool8 ControlWorks_SaveWork_Route110To118_InitSubsubmenu(void);
+static bool8 ControlWorks_SaveWork_Route119To127_InitSubsubmenu(void);
+static bool8 ControlWorks_SaveWork_Route128To134_InitSubsubmenu(void);
+static bool8 ControlWorks_SaveWork_RoomTown_InitSubsubmenu(void);
+static bool8 ControlWorks_SaveWork_RoomCity_InitSubsubmenu(void);
+static bool8 ControlWorks_SaveWork_Dungeon_InitSubsubmenu(void);
+static bool8 ControlWorks_SaveWork_Subsubmenu_HandleInput(void);
+static void debug_sub_808DF04(u8);
+static void debug_sub_808DF64(u8, u8);
+static bool8 ControlWorks_SaveWorkPart2_InitSubmenu(void);
+static bool8 ControlWorks_SaveWorkPart2_HandleInput(void);
+static bool8 ControlWorks_SaveWorkPart2_SP_InitSubsubmenu(void);
+static bool8 ControlWorks_SaveWorkPart2_RoomR110Part1TrickHouse_InitSubsubmenu(void);
+static bool8 ControlWorks_SaveWorkPart2_RoomR110Part2_InitSubsubmenu(void);
+static bool8 ControlWorks_SaveWorkPart2_RoomLoad_InitSubsubmenu(void);
+static bool8 debug_sub_808E1B4(void);
+static bool8 debug_sub_808E20C(void);
+static bool8 debug_sub_808E264(void);
+static void debug_sub_808E2B0(u8);
+static void debug_sub_808E310(u8, u8);
+static bool8 ControlWorks_SysWork_InitSubmenu(void);
+static bool8 debug_sub_808E3BC(void);
+static bool8 debug_sub_808E400(void);
+static bool8 debug_sub_808E458(void);
+static bool8 debug_sub_808E4B0(void);
+static bool8 debug_sub_808E508(void);
+static bool8 debug_sub_808E560(void);
+static bool8 debug_sub_808E5B8(void);
+static void debug_sub_808E604(u8, u8);
+static void debug_sub_808E660(u8);
+static bool8 ControlWorks_LocalWork_InitSubmenu(void);
+static bool8 debug_sub_808E710(void);
+static bool8 debug_sub_808E754(void);
+static bool8 debug_sub_808E7AC(void);
+static bool8 debug_sub_808E804(void);
+static void debug_sub_808E850(u8, u8);
+static void debug_sub_808E8AC(u8);
+static bool8 ControlWorks_ObjWork_InitSubmenu(void);
+static bool8 debug_sub_808E95C(void);
+static bool8 debug_sub_808E9A0(void);
+static bool8 debug_sub_808E9F8(void);
+static bool8 debug_sub_808EA50(void);
+static void debug_sub_808EA9C(u8);
+static void debug_sub_808EAFC(u8, u8);
+static bool8 TrickRelated_Level_InitSubmenu(void);
+static bool8 TrickRelated_TrickMaster_InitSubmenu(void);
+static bool8 debug_sub_808EC10(void);
+static bool8 debug_sub_808EC5C(void);
+static bool8 PreviewGraphics_Show(void);
+static bool8 debug_sub_808ECD0(void);
+static void PicTest_SelectPokemon(void);
+static void PicTest_SelectPersonality(void);
+static void ContestPicTest_SelectContestType(void);
+static void MuseumArtPicTest_SelectTitleType(void);
+static void PreviewPicTest_SelectType(void);
+static void PicTest_Redraw(u8 a0);
+static void PrepareDebugOverlayBeforeShowingContestPainting(u8 a0);
+static void PrintBool(u8, u8, bool8);
+static void PrintUnsignedShort(u8, u8, u16);
+
+extern const u8 DebugScript_081C1CFE[];
+extern const u8 DebugScript_081C1D07[];
+extern const u8 DebugScript_081C1D1E[];
+extern const u8 DebugScript_081C1D24[];
+extern const u8 DebugScript_081C1D2A[];
+extern const u8 DebugScript_081C1D35[];
+extern const u8 DebugScript_081C1D46[];
+extern const u8 DebugScript_081C221F[];
+extern const u8 DebugScript_081C23E2[];
+extern const u8 DebugScript_081C23E6[];
+extern const u8 DebugScript_081C23F6[];
+extern const u8 DebugScript_081C2482[];
+extern const u8 DebugScript_081C23FD[];
+extern const u8 DebugScript_081C2518[];
+extern const u8 DebugScript_081C2507[];
+
+static const u8 sString_ContestGraphics[] = _("Contest graphics");
+static const u8 sString_ArtMuseumGraphics[] = _("Art Mus. graphics");
+static const u8 sString_PreviewData[] = _("Preview data");
+static const u8 sString_TrickHouse[] = _("TRICK HOUSE");
+static const u8 sString_ControlEvents[] = _("Control events");
+static const u8 sString_ControlFlags[] = _("Control flags");
+static const u8 sString_ControlWORK[] = _("Control WORK");
+
+static const struct MenuAction sMenuActions_TopMenu[] = {
+ {sString_ContestGraphics, ContestGraphics},
+ {sString_ArtMuseumGraphics, ArtMusGraphics},
+ {sString_PreviewData, PreviewData},
+ {sString_TrickHouse, TrickHouse},
+ {sString_ControlEvents, ControlEvents},
+ {sString_ControlFlags, ControlFlags},
+ {sString_ControlWORK, ControlWorks},
+};
+
+static const u8 sString_ContestMenuTitle[] = _("Contest");
+
+static const u8 sString_Contest_PokemonNo[] = _("Pokémon No.");
+static const u8 sString_Contest_Personality[] = _("ID rnd. digit");
+static const u8 sString_Contest_Type[] = _("Contest Type");
+static const u8 sString_Contest_PokeArt[] = _("Poké Art");
+
+static const struct MenuAction sMenuActions_ContestPicTest[] = {
+ {sString_Contest_PokemonNo, DummyMenuAction},
+ {sString_Contest_Personality, DummyMenuAction},
+ {sString_Contest_Type, DummyMenuAction},
+ {sString_Contest_PokeArt, ContestGraphics_Show}
+};
+
+static const u8 sString_Contest_ArtMuseumTitle[] = _("Art Mus.");
+
+static const u8 sString_Contest_ArtMuseum_PokemonNo[] = _("Pokémon No.");
+static const u8 sString_Contest_ArtMuseum_Personality[] = _("ID rnd. digit");
+static const u8 sString_Contest_ArtMuseum_Type[] = _("Title Type");
+static const u8 sString_Contest_ArtMuseum_PokeArt[] = _("Poké Art");
+
+static const struct MenuAction sMenuActions_ArtMuseumPicTest[] = {
+ {sString_Contest_ArtMuseum_PokemonNo, DummyMenuAction},
+ {sString_Contest_ArtMuseum_Personality, DummyMenuAction},
+ {sString_Contest_ArtMuseum_Type, DummyMenuAction},
+ {sString_Contest_ArtMuseum_PokeArt, MuseumGraphics_Show}
+};
+
+static const u8 sString_Contest_PreviewTitle[] = _("Preview");
+
+static const u8 sString_Contest_Preview_PokemonNo[] = _("Pokémon No.");
+static const u8 sString_Contest_Preview_Personality[] = _("ID rnd. digit");
+static const u8 sString_Contest_Preview_Type[] = _("Type");
+static const u8 sString_Contest_Preview_PokeArt[] = _("Poké Art");
+
+static const struct MenuAction sMenuActions_PreviewPicTest[] = {
+ {sString_Contest_Preview_PokemonNo, DummyMenuAction},
+ {sString_Contest_Preview_Personality, DummyMenuAction},
+ {sString_Contest_Preview_Type, DummyMenuAction},
+ {sString_Contest_Preview_PokeArt, PreviewGraphics_Show}
+};
+
+static const u8 sString_TrickRelated[] = _("Trick related");
+
+static const u8 sString_TrickRelated_Level[] = _("Level");
+static const u8 sString_TrickRelated_TrickMaster[] = _("Trick Master");
+
+static const struct MenuAction sMenuActions_TrickRelated[] = {
+ {sString_TrickRelated_Level, TrickRelated_Level_InitSubmenu},
+ {sString_TrickRelated_TrickMaster, TrickRelated_TrickMaster_InitSubmenu}
+};
+
+static const u8 sString_Event1[] = _("パート1");
+static const u8 sString_Event2[] = _("パート2");
+
+static const struct MenuAction sMenuActions_ControlEvents[] = {
+ {sString_Event1, ControlEvents_InitSubmenu1},
+ {sString_Event2, ControlEvents_InitSubmenu2}
+};
+
+static const u8 sString_EventFlag[] = _("イベントFLAG");
+static const u8 sString_VanishFlag[] = _("バニシュFLAG");
+static const u8 sString_TrainerFlag[] = _("トレーナーFLAG");
+static const u8 sString_SysFlag[] = _("SYSFLAG");
+static const u8 sString_BallVanishFlag[] = _("BALLバニシュFLAG");
+static const u8 sString_FH[] = _("FH");
+static const u8 sString_FH_OBJ[] = _("FH-OBJ");
+
+static const struct MenuAction sMenuActions_ControlFlags[] = {
+ {sString_EventFlag, ControlFlags_EventFlag_InitSubmenu},
+ {sString_VanishFlag, ControlFlags_VanishFlag_InitSubmenu},
+ {sString_TrainerFlag, ControlFlags_TrainerFlag_InitSubmenu},
+ {sString_SysFlag, ControlFlags_SysFlag_InitSubmenu},
+ {sString_BallVanishFlag, ControlFlags_BallVanishFlag_InitSubmenu},
+ {sString_FH, ControlFlags_FH_InitSubmenu},
+ {sString_FH_OBJ, ControlFlags_FH_OBJ_InitSubmenu}
+};
+
+static const u8 sString_SaveWork[] = _("SAVEWORK");
+static const u8 sString_SysWork[] = _("SYSWORK");
+static const u8 sString_LocalWork[] = _("LOCALWORK");
+static const u8 sString_ObjWork[] = _("OBJWORK");
+static const u8 sString_AnsWork[] = _("ANSWORK");
+static const u8 sString_SaveWorkPart2[] = _("SAVEWORK パート2");
+
+static const struct MenuAction sMenuActions_ControlWorks[] = {
+ {sString_SaveWork, ControlWorks_SaveWork_InitSubmenu},
+ {sString_SysWork, ControlWorks_SysWork_InitSubmenu},
+ {sString_LocalWork, ControlWorks_LocalWork_InitSubmenu},
+ {sString_ObjWork, ControlWorks_ObjWork_InitSubmenu},
+ {sString_AnsWork, ControlWorks_AnsWork_InitSubmenu},
+ {sString_SaveWorkPart2, ControlWorks_SaveWorkPart2_InitSubmenu}
+};
+
+static const u8 sString_Clear_go[] = _("クリアご");
+static const u8 sString_Coin_kounyuuka[] = _("コインこうにゅうかのう");
+static const u8 sString_Oldale_supporter_set[] = _("コトキサポーターセット");
+static const u8 sString_New_Mauville_open[] = _("ニューキンセツOPEN");
+static const u8 sString_Renrakusen_ni_noreru[] = _("れんらくせんにのれる");
+static const u8 sString_Egg_tsuika[] = _("タマゴついか");
+static const u8 sString_Item_ippai[] = _("アイテムいっぱい");
+static const u8 sString_Gezzu_ippai[] = _("グッズいっぱい");
+static const u8 sString_Coin_ippai[] = _("COINいっぱい");
+
+static const struct MenuAction sMenuActions_ControlEvents_Events1[] = {
+ {sString_Clear_go, CallScript_DoHallOfFame},
+ {sString_Coin_kounyuuka, CallScript_GiveCoinCaseIfNotAlreadyOwned},
+ {sString_Oldale_supporter_set, CallScript_SetOldaleStateAfterRoute103Rival},
+ {sString_New_Mauville_open, CallScript_OpenNewMauville},
+ {sString_Renrakusen_ni_noreru, CallScript_GiveSSTicketAndDoHallOfFame},
+ {sString_Egg_tsuika, CallScript_GiveKyogreEgg},
+ {sString_Item_ippai, CallScript_GiveAllItems},
+ {sString_Gezzu_ippai, CallScript_GiveAllDecorations},
+ {sString_Coin_ippai, CallScript_GiveAllCoins}
+};
+
+static const u8 sString_SootpolisGymOpen[] = _("ムロジムOPEN");
+static const u8 sString_MoneyTo0[] = _("おかねを0へ");
+static const u8 sString_BarboachFull[] = _("ドジョッチ FULL");
+static const u8 sString_ShroomishFull[] = _("キノココ FULL");
+static const u8 sString_BarboachEgg[] = _("ドジョッチ タマゴ");
+static const u8 sString_ShroomishEgg[] = _("キノココ タマゴ");
+
+static const struct MenuAction sMenuActions_ControlEvents_Events2[] = {
+ {sString_SootpolisGymOpen, CallScript_OpenSootopolisGym},
+ {sString_MoneyTo0, CallScript_SetMoneyTo0},
+ {sString_BarboachFull, CallScript_FillPartyWithBarboach},
+ {sString_ShroomishFull, CallScript_FillPartyWithShroomish},
+ {sString_BarboachEgg, CallScript_GiveBarboachEgg},
+ {sString_ShroomishEgg, CallScript_GiveShroomishEgg}
+};
+
+static const u8 sString_Answork_Mikansei[] = _("ANSWORK みかんせい");
+
+static const struct MenuAction sMenuActions_ControlEvents_AnsWork[] = {
+ {sString_Answork_Mikansei, DummyMenuAction}
+};
+
+static const u8 sString_FH_OBJ00_08[] = _("FHーOBJ00ー08");
+static const u8 sString_FH_OBJ09_15[] = _("FHーOBJ09ー15");
+
+static const struct MenuAction sMenuActions_ControlFlags_FH_OBJ[] = {
+ {sString_FH_OBJ00_08, ControlFlags_FH_OBJ00_08_InitSubsubmenu},
+ {sString_FH_OBJ09_15, ControlFlags_FH_OBJ09_15_InitSubsubmenu}
+};
+
+static const u8 sString_FH_OBJ00[] = _("FHーOBJ00");
+static const u8 sString_FH_OBJ01[] = _("FHーOBJ01");
+static const u8 sString_FH_OBJ02[] = _("FHーOBJ02");
+static const u8 sString_FH_OBJ03[] = _("FHーOBJ03");
+static const u8 sString_FH_OBJ04[] = _("FHーOBJ04");
+static const u8 sString_FH_OBJ05[] = _("FHーOBJ05");
+static const u8 sString_FH_OBJ06[] = _("FHーOBJ06");
+static const u8 sString_FH_OBJ07[] = _("FHーOBJ07");
+static const u8 sString_FH_OBJ08[] = _("FHーOBJ08");
+
+static const struct MenuAction sMenuActions_ControlFlags_FH_OBJ00_08[] = {
+ {sString_FH_OBJ00, DummyMenuAction},
+ {sString_FH_OBJ01, DummyMenuAction},
+ {sString_FH_OBJ02, DummyMenuAction},
+ {sString_FH_OBJ03, DummyMenuAction},
+ {sString_FH_OBJ04, DummyMenuAction},
+ {sString_FH_OBJ05, DummyMenuAction},
+ {sString_FH_OBJ06, DummyMenuAction},
+ {sString_FH_OBJ07, DummyMenuAction},
+ {sString_FH_OBJ08, DummyMenuAction}
+};
+
+static const u8 sString_FH_OBJ09[] = _("FH-OBJ09");
+static const u8 sString_FH_OBJ10[] = _("FH-OBJ10");
+static const u8 sString_FH_OBJ11[] = _("FH-OBJ11");
+static const u8 sString_FH_OBJ12[] = _("FH-OBJ12");
+static const u8 sString_FH_OBJ13[] = _("FH-OBJ13");
+static const u8 sString_FH_OBJ14[] = _("FH-OBJ14");
+static const u8 sString_FH_OBJ15[] = _("FH-OBJ15");
+static const u8 sString_Blank_083C1147[] = _("");
+static const u8 sString_Blank_083C1148[] = _("");
+
+static const struct MenuAction sMenuActions_ControlFlags_FH_OBJ09_15[] = {
+ {sString_FH_OBJ09, DummyMenuAction},
+ {sString_FH_OBJ10, DummyMenuAction},
+ {sString_FH_OBJ11, DummyMenuAction},
+ {sString_FH_OBJ12, DummyMenuAction},
+ {sString_FH_OBJ13, DummyMenuAction},
+ {sString_FH_OBJ14, DummyMenuAction},
+ {sString_FH_OBJ15, DummyMenuAction},
+ {sString_Blank_083C1147, DummyMenuAction},
+ {sString_Blank_083C1148, DummyMenuAction}
+};
+
+static const u8 sControlFlags_FH_OBJ_CountsArray[] = {9, 7};
+
+static const u16 sControlFlags_FH_OBJ_FlagsArrays[][9] = {
+ {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19},
+ {0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20}
+};
+
+static const u8 gUnknown_Debug_083C11BA[] = _("FH-00-08");
+static const u8 gUnknown_Debug_083C11C3[] = _("FH-09-15");
+
+static const struct MenuAction gUnknown_Debug_083C11CC[] = {
+ {gUnknown_Debug_083C11BA, debug_sub_808D694},
+ {gUnknown_Debug_083C11C3, debug_sub_808D6EC}
+};
+
+static const u8 gUnknown_Debug_083C11DC[] = _("FH-00");
+static const u8 gUnknown_Debug_083C11E2[] = _("FH-01");
+static const u8 gUnknown_Debug_083C11E8[] = _("FH-02");
+static const u8 gUnknown_Debug_083C11EE[] = _("FH-03");
+static const u8 gUnknown_Debug_083C11F4[] = _("FH-04");
+static const u8 gUnknown_Debug_083C11FA[] = _("FH-05");
+static const u8 gUnknown_Debug_083C1200[] = _("FH-06");
+static const u8 gUnknown_Debug_083C1206[] = _("FH-07");
+static const u8 gUnknown_Debug_083C120C[] = _("FH-08");
+
+static const struct MenuAction gUnknown_Debug_083C1212[] = {
+ {gUnknown_Debug_083C11DC, DummyMenuAction},
+ {gUnknown_Debug_083C11E2, DummyMenuAction},
+ {gUnknown_Debug_083C11E8, DummyMenuAction},
+ {gUnknown_Debug_083C11EE, DummyMenuAction},
+ {gUnknown_Debug_083C11F4, DummyMenuAction},
+ {gUnknown_Debug_083C11FA, DummyMenuAction},
+ {gUnknown_Debug_083C1200, DummyMenuAction},
+ {gUnknown_Debug_083C1206, DummyMenuAction},
+ {gUnknown_Debug_083C120C, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C125C[] = _("FHー09");
+static const u8 gUnknown_Debug_083C1262[] = _("FHー10");
+static const u8 gUnknown_Debug_083C1268[] = _("FHー11");
+static const u8 gUnknown_Debug_083C126E[] = _("FHー12");
+static const u8 gUnknown_Debug_083C1274[] = _("FHー13");
+static const u8 gUnknown_Debug_083C127A[] = _("FHー14");
+static const u8 gUnknown_Debug_083C1280[] = _("FHー15");
+static const u8 gUnknown_Debug_083C1286[] = _("");
+static const u8 gUnknown_Debug_083C1287[] = _("");
+
+static const struct MenuAction gUnknown_Debug_083C1288[] = {
+ {gUnknown_Debug_083C125C, DummyMenuAction},
+ {gUnknown_Debug_083C1262, DummyMenuAction},
+ {gUnknown_Debug_083C1268, DummyMenuAction},
+ {gUnknown_Debug_083C126E, DummyMenuAction},
+ {gUnknown_Debug_083C1274, DummyMenuAction},
+ {gUnknown_Debug_083C127A, DummyMenuAction},
+ {gUnknown_Debug_083C1280, DummyMenuAction},
+ {gUnknown_Debug_083C1286, DummyMenuAction},
+ {gUnknown_Debug_083C1287, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C12D0[] = {9, 7};
+
+static const u16 gUnknown_Debug_083C12D2[][9] = {
+ {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09},
+ {0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10}
+};
+
+static const u8 gUnknown_Debug_083C12F6[] = _("BATCH");
+static const u8 gUnknown_Debug_083C12FC[] = _("タウンとうちゃく");
+static const u8 gUnknown_Debug_083C1305[] = _("シティとうちゃく");
+static const u8 gUnknown_Debug_083C130E[] = _("GET");
+static const u8 gUnknown_Debug_083C1312[] = _("そのた1");
+static const u8 gUnknown_Debug_083C1317[] = _("そのた2");
+static const u8 gUnknown_Debug_083C131C[] = _("そのた3");
+static const u8 gUnknown_Debug_083C1321[] = _("そのた4");
+static const u8 gUnknown_Debug_083C1326[] = _("そのた とうちゃく");
+
+static const struct MenuAction gUnknown_Debug_083C1330[] = {
+ {gUnknown_Debug_083C12F6, debug_sub_808CFA4},
+ {gUnknown_Debug_083C12FC, debug_sub_808CFFC},
+ {gUnknown_Debug_083C1305, debug_sub_808D054},
+ {gUnknown_Debug_083C130E, debug_sub_808D0AC},
+ {gUnknown_Debug_083C1312, debug_sub_808D104},
+ {gUnknown_Debug_083C1317, debug_sub_808D15C},
+ {gUnknown_Debug_083C131C, debug_sub_808D1B4},
+ {gUnknown_Debug_083C1321, debug_sub_808D20C},
+ {gUnknown_Debug_083C1326, debug_sub_808D264}
+};
+
+static const u8 gUnknown_Debug_083C1378[] = _("BATCH01ーGET");
+static const u8 gUnknown_Debug_083C1384[] = _("BATCH02ーGET");
+static const u8 gUnknown_Debug_083C1390[] = _("BATCH03ーGET");
+static const u8 gUnknown_Debug_083C139C[] = _("BATCH04ーGET");
+static const u8 gUnknown_Debug_083C13A8[] = _("BATCH05ーGET");
+static const u8 gUnknown_Debug_083C13B4[] = _("BATCH06ーGET");
+static const u8 gUnknown_Debug_083C13C0[] = _("BATCH07ーGET");
+static const u8 gUnknown_Debug_083C13CC[] = _("BATCH08ーGET");
+
+static const struct MenuAction gUnknown_Debug_083C13D8[] = {
+ {gUnknown_Debug_083C1378, DummyMenuAction},
+ {gUnknown_Debug_083C1384, DummyMenuAction},
+ {gUnknown_Debug_083C1390, DummyMenuAction},
+ {gUnknown_Debug_083C139C, DummyMenuAction},
+ {gUnknown_Debug_083C13A8, DummyMenuAction},
+ {gUnknown_Debug_083C13B4, DummyMenuAction},
+ {gUnknown_Debug_083C13C0, DummyMenuAction},
+ {gUnknown_Debug_083C13CC, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C1418[] = _("T101ARRIVE");
+static const u8 gUnknown_Debug_083C1423[] = _("T102ARRIVE");
+static const u8 gUnknown_Debug_083C142E[] = _("T103ARRIVE");
+static const u8 gUnknown_Debug_083C1439[] = _("T104ARRIVE");
+static const u8 gUnknown_Debug_083C1444[] = _("T105ARRIVE");
+static const u8 gUnknown_Debug_083C144F[] = _("T106ARRIVE");
+static const u8 gUnknown_Debug_083C145A[] = _("T107ARRIVE");
+
+static const struct MenuAction gUnknown_Debug_083C1465[] = {
+ {gUnknown_Debug_083C1418, DummyMenuAction},
+ {gUnknown_Debug_083C1423, DummyMenuAction},
+ {gUnknown_Debug_083C142E, DummyMenuAction},
+ {gUnknown_Debug_083C1439, DummyMenuAction},
+ {gUnknown_Debug_083C1444, DummyMenuAction},
+ {gUnknown_Debug_083C144F, DummyMenuAction},
+ {gUnknown_Debug_083C145A, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C14A0[] = _("C101ARRIVE");
+static const u8 gUnknown_Debug_083C14AB[] = _("C102ARRIVE");
+static const u8 gUnknown_Debug_083C14B6[] = _("C103ARRIVE");
+static const u8 gUnknown_Debug_083C14C1[] = _("C104ARRIVE");
+static const u8 gUnknown_Debug_083C14CC[] = _("C105ARRIVE");
+static const u8 gUnknown_Debug_083C14D7[] = _("C106ARRIVE");
+static const u8 gUnknown_Debug_083C14E2[] = _("C107ARRIVE");
+static const u8 gUnknown_Debug_083C14ED[] = _("C108ARRIVE");
+static const u8 gUnknown_Debug_083C14F8[] = _("C109ARRIVE");
+
+static const struct MenuAction gUnknown_Debug_083C1503[] = {
+ {gUnknown_Debug_083C14A0, DummyMenuAction},
+ {gUnknown_Debug_083C14AB, DummyMenuAction},
+ {gUnknown_Debug_083C14B6, DummyMenuAction},
+ {gUnknown_Debug_083C14C1, DummyMenuAction},
+ {gUnknown_Debug_083C14CC, DummyMenuAction},
+ {gUnknown_Debug_083C14D7, DummyMenuAction},
+ {gUnknown_Debug_083C14E2, DummyMenuAction},
+ {gUnknown_Debug_083C14ED, DummyMenuAction},
+ {gUnknown_Debug_083C14F8, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C154C[] = _("SYSーPOKEMONーGET");
+static const u8 gUnknown_Debug_083C155C[] = _("SYSーZUKANーGET");
+static const u8 gUnknown_Debug_083C156A[] = _("SYSーPOKEGEARーGET");
+static const u8 gUnknown_Debug_083C157B[] = _("SYSーRIBBONーGET");
+
+static const struct MenuAction gUnknown_Debug_083C158A[] = {
+ {gUnknown_Debug_083C154C, DummyMenuAction},
+ {gUnknown_Debug_083C155C, DummyMenuAction},
+ {gUnknown_Debug_083C156A, DummyMenuAction},
+ {gUnknown_Debug_083C157B, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C15AC[] = _("SYSーGAMEーCLEAR");
+static const u8 gUnknown_Debug_083C15BB[] = _("SYSーKAIWAーUSED");
+static const u8 gUnknown_Debug_083C15CA[] = _("SYSーNOWーOYAJIーMEET");
+static const u8 gUnknown_Debug_083C15DD[] = _("SYSーUSEーWAZAーFLASH");
+static const u8 gUnknown_Debug_083C15F0[] = _("SYSーUSEーWAZAーKAIRIKI");
+static const u8 gUnknown_Debug_083C1605[] = _("SYSーWEATHERーCTRL");
+static const u8 gUnknown_Debug_083C1616[] = _("SYSーCYCLINGーROAD");
+static const u8 gUnknown_Debug_083C1627[] = _("SYSーSAFARIーMODE");
+static const u8 gUnknown_Debug_083C1637[] = _("SYSーCRUISEーMODE");
+
+static const struct MenuAction gUnknown_Debug_083C1647[] = {
+ {gUnknown_Debug_083C15AC, DummyMenuAction},
+ {gUnknown_Debug_083C15BB, DummyMenuAction},
+ {gUnknown_Debug_083C15CA, DummyMenuAction},
+ {gUnknown_Debug_083C15DD, DummyMenuAction},
+ {gUnknown_Debug_083C15F0, DummyMenuAction},
+ {gUnknown_Debug_083C1605, DummyMenuAction},
+ {gUnknown_Debug_083C1616, DummyMenuAction},
+ {gUnknown_Debug_083C1627, DummyMenuAction},
+ {gUnknown_Debug_083C1637, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C1690[] = _("SYSーTVーHOME");
+static const u8 gUnknown_Debug_083C169C[] = _("SYSーTVーWATCH");
+static const u8 gUnknown_Debug_083C16A9[] = _("SYSーTVSTART");
+static const u8 gUnknown_Debug_083C16B5[] = _("SYSーPOPWORDーINPUT");
+static const u8 gUnknown_Debug_083C16C7[] = _("SYSーMIXーRECORD");
+static const u8 gUnknown_Debug_083C16D6[] = _("SYSーCLOCKーSET");
+static const u8 gUnknown_Debug_083C16E4[] = _("SYSーCAVEーSHIP");
+static const u8 gUnknown_Debug_083C16F2[] = _("SYSーCAVEーWONDER");
+static const u8 gUnknown_Debug_083C1702[] = _("SYSーCAVEーBATTLE");
+
+static const struct MenuAction gUnknown_Debug_083C1712[] = {
+ {gUnknown_Debug_083C1690, DummyMenuAction},
+ {gUnknown_Debug_083C169C, DummyMenuAction},
+ {gUnknown_Debug_083C16A9, DummyMenuAction},
+ {gUnknown_Debug_083C16B5, DummyMenuAction},
+ {gUnknown_Debug_083C16C7, DummyMenuAction},
+ {gUnknown_Debug_083C16D6, DummyMenuAction},
+ {gUnknown_Debug_083C16E4, DummyMenuAction},
+ {gUnknown_Debug_083C16F2, DummyMenuAction},
+ {gUnknown_Debug_083C1702, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C175C[] = _("SYSーSPECIALーZUKAN");
+static const u8 gUnknown_Debug_083C176E[] = _("SYSーASASEーTIDE");
+static const u8 gUnknown_Debug_083C177D[] = _("SYSーRIBBONーGET");
+static const u8 gUnknown_Debug_083C178C[] = _("SYSーPASOーMAYUMI");
+static const u8 gUnknown_Debug_083C179C[] = _("SYSーEXDATAーENABLE");
+static const u8 gUnknown_Debug_083C17AE[] = _("SYSーTENJIーANAWOHORU");
+static const u8 gUnknown_Debug_083C17C2[] = _("SYSーTENJIーKAIRIKI");
+static const u8 gUnknown_Debug_083C17D4[] = _("SYSーTENJIーWAIT");
+static const u8 gUnknown_Debug_083C17E3[] = _("SYSーTENJIーSORAWOTOBU");
+
+static const struct MenuAction gUnknown_Debug_083C17F8[] = {
+ {gUnknown_Debug_083C175C, DummyMenuAction},
+ {gUnknown_Debug_083C176E, DummyMenuAction},
+ {gUnknown_Debug_083C177D, DummyMenuAction},
+ {gUnknown_Debug_083C178C, DummyMenuAction},
+ {gUnknown_Debug_083C179C, DummyMenuAction},
+ {gUnknown_Debug_083C17AE, DummyMenuAction},
+ {gUnknown_Debug_083C17C2, DummyMenuAction},
+ {gUnknown_Debug_083C17D4, DummyMenuAction},
+ {gUnknown_Debug_083C17E3, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C1840[] = _("SYSーENCーUPーITEM");
+static const u8 gUnknown_Debug_083C1850[] = _("SYSーENEーDOWNーITEM");
+static const u8 gUnknown_Debug_083C1862[] = _("SYSーKOKOROーEVENT");
+static const u8 gUnknown_Debug_083C1873[] = _("SYSーMOVEーPOKEーNEWS");
+static const u8 gUnknown_Debug_083C1886[] = _("SYSーASASEーITEM");
+static const u8 gUnknown_Debug_083C1895[] = _("SYSーBーDASH");
+static const u8 gUnknown_Debug_083C18A0[] = _("SYSーCTRLーOBJーDELETE");
+static const u8 gUnknown_Debug_083C18B4[] = _("");
+static const u8 gUnknown_Debug_083C18B5[] = _("");
+
+static const struct MenuAction gUnknown_Debug_083C18B8[] = {
+ {gUnknown_Debug_083C1840, DummyMenuAction},
+ {gUnknown_Debug_083C1850, DummyMenuAction},
+ {gUnknown_Debug_083C1862, DummyMenuAction},
+ {gUnknown_Debug_083C1873, DummyMenuAction},
+ {gUnknown_Debug_083C1886, DummyMenuAction},
+ {gUnknown_Debug_083C1895, DummyMenuAction},
+ {gUnknown_Debug_083C18A0, DummyMenuAction},
+ {gUnknown_Debug_083C18B4, DummyMenuAction},
+ {gUnknown_Debug_083C18B5, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C1900[] = _("SYSーARRIVEーSUBMARINECAVE");
+static const u8 gUnknown_Debug_083C1919[] = _("SYSーARRIVEーBATTLETOWER");
+static const u8 gUnknown_Debug_083C1930[] = _("SYSーARRIVEーISLAND");
+static const u8 gUnknown_Debug_083C1942[] = _("SYSーARRIVEーLEAGUE");
+static const u8 gUnknown_Debug_083C1954[] = _("SYSーARRIVEーSORANOHASHIRA");
+static const u8 gUnknown_Debug_083C196D[] = _("");
+static const u8 gUnknown_Debug_083C196E[] = _("");
+static const u8 gUnknown_Debug_083C196F[] = _("");
+static const u8 gUnknown_Debug_083C1970[] = _("");
+
+static const struct MenuAction gDebug_0x83C1974[] = {
+ {gUnknown_Debug_083C1900, DummyMenuAction},
+ {gUnknown_Debug_083C1919, DummyMenuAction},
+ {gUnknown_Debug_083C1930, DummyMenuAction},
+ {gUnknown_Debug_083C1942, DummyMenuAction},
+ {gUnknown_Debug_083C1954, DummyMenuAction},
+ {gUnknown_Debug_083C196D, DummyMenuAction},
+ {gUnknown_Debug_083C196E, DummyMenuAction},
+ {gUnknown_Debug_083C196F, DummyMenuAction},
+ {gUnknown_Debug_083C1970, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C19BC[] = {8, 7, 9, 4, 9, 9, 9, 7, 5};
+
+static const u16 gUnknown_Debug_083C19C6[][9] = {
+ {FLAG_BADGE01_GET, FLAG_BADGE02_GET, FLAG_BADGE03_GET, FLAG_BADGE04_GET, FLAG_BADGE05_GET, FLAG_BADGE06_GET, FLAG_BADGE07_GET, FLAG_BADGE08_GET},
+ {FLAG_VISITED_LITTLEROOT_TOWN, FLAG_VISITED_OLDALE_TOWN, FLAG_VISITED_DEWFORD_TOWN, FLAG_VISITED_LAVARIDGE_TOWN, FLAG_VISITED_FALLARBOR_TOWN, FLAG_VISITED_VERDANTURF_TOWN, FLAG_VISITED_PACIFIDLOG_TOWN},
+ {FLAG_VISITED_PETALBURG_CITY, FLAG_VISITED_SLATEPORT_CITY, FLAG_VISITED_MAUVILLE_CITY, FLAG_VISITED_RUSTBORO_CITY, FLAG_VISITED_FORTREE_CITY, FLAG_VISITED_LILYCOVE_CITY, FLAG_VISITED_MOSSDEEP_CITY, FLAG_VISITED_SOOTOPOLIS_CITY, FLAG_VISITED_EVER_GRANDE_CITY},
+ {FLAG_SYS_POKEMON_GET, FLAG_SYS_POKEDEX_GET, FLAG_SYS_POKENAV_GET, FLAG_SYS_RIBBON_GET},
+ {FLAG_SYS_GAME_CLEAR, FLAG_SYS_CHAT_USED, FLAG_SYS_HIPSTER_MEET, FLAG_SYS_USE_FLASH, FLAG_SYS_USE_STRENGTH, FLAG_SYS_WEATHER_CTRL, FLAG_SYS_CYCLING_ROAD, FLAG_SYS_SAFARI_MODE, FLAG_SYS_CRUISE_MODE},
+ {FLAG_SYS_TV_HOME, FLAG_SYS_TV_WATCH, FLAG_SYS_TV_START, FLAG_SYS_POPWORD_INPUT, FLAG_SYS_MIX_RECORD, FLAG_SYS_CLOCK_SET, FLAG_SYS_CAVE_SHIP, FLAG_SYS_CAVE_WONDER, FLAG_SYS_CAVE_BATTLE},
+ {FLAG_SYS_NATIONAL_DEX, FLAG_SYS_SHOAL_TIDE, FLAG_SYS_RIBBON_GET, FLAG_SYS_PC_LANETTE, FLAG_SYS_EXDATA_ENABLE, FLAG_SYS_BRAILLE_DIG, FLAG_SYS_BRAILLE_STRENGTH, FLAG_SYS_BRAILLE_WAIT, FLAG_SYS_BRAILLE_FLY},
+ {FLAG_SYS_ENC_UP_ITEM, FLAG_SYS_ENC_DOWN_ITEM, FLAG_SYS_HAS_EON_TICKET, FLAG_SYS_TV_LATI, FLAG_SYS_SHOAL_ITEM, FLAG_SYS_B_DASH, FLAG_SYS_CTRL_OBJ_DELETE},
+ {FLAG_LANDMARK_SEAFLOOR_CAVERN, FLAG_LANDMARK_BATTLE_TOWER, FLAG_LANDMARK_SOUTHERN_ISLAND, FLAG_SYS_POKEMON_LEAGUE_FLY, FLAG_LANDMARK_SKY_PILLAR}
+};
+
+static const u8 gDebug_0x83C1A68[] = _("FVーBALL パート1");
+
+static const struct MenuAction gUnknown_Debug_083C1A78[] = {
+ {gDebug_0x83C1A68, debug_sub_808D8D8}
+};
+
+static const u8 gUnknown_Debug_083C1A80[] = _("FVーBALL1ー78");
+static const u8 gUnknown_Debug_083C1A8C[] = _("FVーBALL1ー133");
+
+static const struct MenuAction gUnknown_Debug_083C1A9C[] = {
+ {gUnknown_Debug_083C1A80, DummyMenuAction},
+ {gUnknown_Debug_083C1A8C, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C1AAC[] = {2};
+
+static const u16 gUnknown_Debug_083C1AAE[][9] = {
+ {FLAG_ITEM_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS_2, FLAG_ITEM_MOSSDEEP_STEVENS_HOUSE_1}
+};
+
+static const u8 gUnknown_Debug_083C1AC0[] = _("ジムリーダー");
+static const u8 gUnknown_Debug_083C1AC7[] = _("してんのう");
+static const u8 gUnknown_Debug_083C1ACD[] = _("みつる/Champロード");
+
+static const struct MenuAction gUnknown_Debug_083C1ADC[] = {
+ {gUnknown_Debug_083C1AC0, debug_sub_808CD08},
+ {gUnknown_Debug_083C1AC7, debug_sub_808CD60},
+ {gUnknown_Debug_083C1ACD, debug_sub_808CDB8}
+};
+
+static const u8 gUnknown_Debug_083C1AF4[] = _("FTーGYMー01ーLEADER");
+static const u8 gUnknown_Debug_083C1B05[] = _("FTーGYMー02ーLEADER");
+static const u8 gUnknown_Debug_083C1B16[] = _("FTーGYMー03ーLEADER");
+static const u8 gUnknown_Debug_083C1B27[] = _("FTーGYMー04ーLEADER");
+static const u8 gUnknown_Debug_083C1B38[] = _("FTーGYMー05ーLEADER");
+static const u8 gUnknown_Debug_083C1B49[] = _("FTーGYMー06ーLEADER");
+static const u8 gUnknown_Debug_083C1B5A[] = _("FTーGYMー07ーLEADER");
+static const u8 gUnknown_Debug_083C1B6B[] = _("FTーGYMー08ーLEADER");
+
+static const struct MenuAction gUnknown_Debug_083C1B7C[] = {
+ {gUnknown_Debug_083C1AF4, DummyMenuAction},
+ {gUnknown_Debug_083C1B05, DummyMenuAction},
+ {gUnknown_Debug_083C1B16, DummyMenuAction},
+ {gUnknown_Debug_083C1B27, DummyMenuAction},
+ {gUnknown_Debug_083C1B38, DummyMenuAction},
+ {gUnknown_Debug_083C1B49, DummyMenuAction},
+ {gUnknown_Debug_083C1B5A, DummyMenuAction},
+ {gUnknown_Debug_083C1B6B, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C1BBC[] = _("FTーSHITENー01");
+static const u8 gUnknown_Debug_083C1BC9[] = _("FTーSHITENー02");
+static const u8 gUnknown_Debug_083C1BD6[] = _("FTーSHITENー03");
+static const u8 gUnknown_Debug_083C1BE3[] = _("FTーSHITENー04");
+
+static const struct MenuAction gUnknown_Debug_083C1BF0[] = {
+ {gUnknown_Debug_083C1BBC, DummyMenuAction},
+ {gUnknown_Debug_083C1BC9, DummyMenuAction},
+ {gUnknown_Debug_083C1BD6, DummyMenuAction},
+ {gUnknown_Debug_083C1BE3, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C1C10[] = _("FTーMITSURUー01ーCAVEーD1301");
+
+static const struct MenuAction gUnknown_Debug_083C1C2C[] = {
+ {gUnknown_Debug_083C1C10, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C1C34[] = {8, 4, 1};
+static const u16 gUnknown_Debug_083C1C38[][9] = {
+ {FLAG_DEFEATED_RUSTBORO_GYM, FLAG_DEFEATED_DEWFORD_GYM, FLAG_DEFEATED_MAUVILLE_GYM, FLAG_DEFEATED_LAVARIDGE_GYM, FLAG_DEFEATED_PETALBURG_GYM, FLAG_DEFEATED_FORTREE_GYM, FLAG_DEFEATED_MOSSDEEP_GYM, FLAG_DEFEATED_SOOTOPOLIS_GYM},
+ {FLAG_DEFEATED_ELITE_4_SYDNEY, FLAG_DEFEATED_ELITE_4_PHOEBE, FLAG_DEFEATED_ELITE_4_GLACIA, FLAG_DEFEATED_ELITE_4_DRAKE},
+ {0x04E1}
+};
+
+static const u8 gUnknown_Debug_083C1C6E[] = _("120/119ばんどうろカクレオン");
+static const u8 gUnknown_Debug_083C1C80[] = _("そのた1 / SUPPORTM/W");
+static const u8 gUnknown_Debug_083C1C92[] = _("ODAMAKI/FIGHTER1");
+static const u8 gUnknown_Debug_083C1CA3[] = _("MITSURU/TENKI");
+static const u8 gUnknown_Debug_083C1CB1[] = _("そのた2 /DAIGO");
+static const u8 gUnknown_Debug_083C1CBD[] = _("POKE/POKEMON");
+static const u8 gUnknown_Debug_083C1CCA[] = _("MAMA/SUPPORT02");
+static const u8 gUnknown_Debug_083C1CD9[] = _("HAGI");
+static const u8 gUnknown_Debug_083C1CDE[] = _("SUPPORT01");
+
+static const struct MenuAction gUnknown_Debug_083C1CE8[] = {
+ {gUnknown_Debug_083C1C6E, debug_sub_808C85C},
+ {gUnknown_Debug_083C1C80, debug_sub_808C8B4},
+ {gUnknown_Debug_083C1C92, debug_sub_808C90C},
+ {gUnknown_Debug_083C1CA3, debug_sub_808C964},
+ {gUnknown_Debug_083C1CB1, debug_sub_808C9BC},
+ {gUnknown_Debug_083C1CBD, debug_sub_808CA14},
+ {gUnknown_Debug_083C1CCA, debug_sub_808CA6C},
+ {gUnknown_Debug_083C1CD9, debug_sub_808CAC4},
+ {gUnknown_Debug_083C1CDE, debug_sub_808CB1C}
+};
+
+static const u8 gUnknown_Debug_083C1D30[] = _("FVーKAKUREONBー01ーFIELDーR120");
+static const u8 gUnknown_Debug_083C1D4B[] = _("FVーKAKUREー01ーFIELDーR120");
+static const u8 gUnknown_Debug_083C1D63[] = _("FVーKAKUREー02ーFIELDーR120");
+static const u8 gUnknown_Debug_083C1D7B[] = _("FVーKAKUREー03ーFIELDーR120");
+static const u8 gUnknown_Debug_083C1D93[] = _("FVーKAKUREー04ーFIELDーR120");
+static const u8 gUnknown_Debug_083C1DAB[] = _("FVーKAKUREー05ーFIELDーR120");
+static const u8 gUnknown_Debug_083C1DC3[] = _("FVーKAKUREー06ーFIELDーR120");
+static const u8 gUnknown_Debug_083C1DDB[] = _("FVーKAKUREー01ーFIELDーR119");
+static const u8 gUnknown_Debug_083C1DF3[] = _("FVーKAKUREー02ーFIELDーR119");
+
+static const struct MenuAction gUnknown_Debug_083C1E0C[] = {
+ {gUnknown_Debug_083C1D30, DummyMenuAction},
+ {gUnknown_Debug_083C1D4B, DummyMenuAction},
+ {gUnknown_Debug_083C1D63, DummyMenuAction},
+ {gUnknown_Debug_083C1D7B, DummyMenuAction},
+ {gUnknown_Debug_083C1D93, DummyMenuAction},
+ {gUnknown_Debug_083C1DAB, DummyMenuAction},
+ {gUnknown_Debug_083C1DC3, DummyMenuAction},
+ {gUnknown_Debug_083C1DDB, DummyMenuAction},
+ {gUnknown_Debug_083C1DF3, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C1E54[] = _("FVーBALLー01ーC107ーR0501");
+static const u8 gUnknown_Debug_083C1E6A[] = _("FVーWORKERM1ー04ーFIELDーC104");
+static const u8 gUnknown_Debug_083C1E84[] = _("FVーSUBMARINEー06ーCAVEーD1101");
+static const u8 gUnknown_Debug_083C1E9F[] = _("FVーGUESTーALLーC106ーR0102");
+static const u8 gUnknown_Debug_083C1EB7[] = _("FVーHORIDASIー01ーC106ーR1106");
+static const u8 gUnknown_Debug_083C1ED1[] = _("FVーMIDDLEM1ー01ーR110ーR0101");
+static const u8 gUnknown_Debug_083C1EEB[] = _("FVーFUNEー01ーC102ーR0601");
+static const u8 gUnknown_Debug_083C1F01[] = _("FVーSUPPORTWー01ーT101ーR0202");
+static const u8 gUnknown_Debug_083C1F1B[] = _("FVーSUPPORTMー01ーT101ーR0102");
+
+static const struct MenuAction gUnknown_Debug_083C1F38[] = {
+ {gUnknown_Debug_083C1E54, DummyMenuAction},
+ {gUnknown_Debug_083C1E6A, DummyMenuAction},
+ {gUnknown_Debug_083C1E84, DummyMenuAction},
+ {gUnknown_Debug_083C1E9F, DummyMenuAction},
+ {gUnknown_Debug_083C1EB7, DummyMenuAction},
+ {gUnknown_Debug_083C1ED1, DummyMenuAction},
+ {gUnknown_Debug_083C1EEB, DummyMenuAction},
+ {gUnknown_Debug_083C1F01, DummyMenuAction},
+ {gUnknown_Debug_083C1F1B, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C1F80[] = _("FVーODAMAKIー01ーFIELDーR101");
+static const u8 gUnknown_Debug_083C1F99[] = _("FVーODAMAKIー01ーT101ーR0301");
+static const u8 gUnknown_Debug_083C1FB2[] = _("FVーODAMAKIーHYOKAーT101ーR0301");
+static const u8 gUnknown_Debug_083C1FCE[] = _("FVーODAMAKIーHYOKAーFIELDーR101");
+static const u8 gUnknown_Debug_083C1FEA[] = _("FVーODAMAKIーHYOKAーFIELDーR103");
+static const u8 gUnknown_Debug_083C2006[] = _("FVーODAMAKIー01ーC109ーR0105");
+static const u8 gUnknown_Debug_083C201F[] = _("FVーFIGHTERー01ーCAVEーD0201");
+static const u8 gUnknown_Debug_083C2038[] = _("FVーFIGHTERー01ーT106ーR0201");
+static const u8 gUnknown_Debug_083C2051[] = _("FVーFIGHTERー01ーFIELDーR116");
+
+static const struct MenuAction gUnknown_Debug_083C206C[] = {
+ {gUnknown_Debug_083C1F80, DummyMenuAction},
+ {gUnknown_Debug_083C1F99, DummyMenuAction},
+ {gUnknown_Debug_083C1FB2, DummyMenuAction},
+ {gUnknown_Debug_083C1FCE, DummyMenuAction},
+ {gUnknown_Debug_083C1FEA, DummyMenuAction},
+ {gUnknown_Debug_083C2006, DummyMenuAction},
+ {gUnknown_Debug_083C201F, DummyMenuAction},
+ {gUnknown_Debug_083C2038, DummyMenuAction},
+ {gUnknown_Debug_083C2051, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C20B4[] = _("FVーMITSURUー01ーFIELDーC101");
+static const u8 gUnknown_Debug_083C20CD[] = _("FVーMITSURUー02ーCAVEーD1301");
+static const u8 gUnknown_Debug_083C20E6[] = _("FVーMITSURUー01ーFIELDーC103");
+static const u8 gUnknown_Debug_083C20FF[] = _("FVーMITSURUー01ーT106ーR0201");
+static const u8 gUnknown_Debug_083C2118[] = _("FVーMITSURUー01ーCAVEーD1301");
+static const u8 gUnknown_Debug_083C2131[] = _("FVーMITSURUー01ーC101ーR0201");
+static const u8 gUnknown_Debug_083C214A[] = _("FVーMITSURUー01ーFIELDーR102");
+static const u8 gUnknown_Debug_083C2163[] = _("FVーTENKIー01ーR119ーR101");
+static const u8 gUnknown_Debug_083C2179[] = _("FVーTENKIー01ーR119ーR102");
+
+static const struct MenuAction gUnknown_Debug_083C2190[] = {
+ {gUnknown_Debug_083C20B4, DummyMenuAction},
+ {gUnknown_Debug_083C20CD, DummyMenuAction},
+ {gUnknown_Debug_083C20E6, DummyMenuAction},
+ {gUnknown_Debug_083C20FF, DummyMenuAction},
+ {gUnknown_Debug_083C2118, DummyMenuAction},
+ {gUnknown_Debug_083C2131, DummyMenuAction},
+ {gUnknown_Debug_083C214A, DummyMenuAction},
+ {gUnknown_Debug_083C2163, DummyMenuAction},
+ {gUnknown_Debug_083C2179, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C21D8[] = _("FVーDAIGOー01ーCAVEーD0504");
+static const u8 gUnknown_Debug_083C21EF[] = _("FVーDAIGOー01ーFIELDーR128");
+static const u8 gUnknown_Debug_083C2206[] = _("FVーDAIGOー01ーFIELDーR118");
+static const u8 gUnknown_Debug_083C221D[] = _("FVーDAIGOー01ーC107ーR0501");
+static const u8 gUnknown_Debug_083C2234[] = _("FVーDAIGOー01ーFIELDーR120");
+static const u8 gUnknown_Debug_083C224B[] = _("FVーDAIGOー01ーFIELDーR108");
+
+static const struct MenuAction gUnknown_Debug_083C2264[] = {
+ {gUnknown_Debug_083C21D8, DummyMenuAction},
+ {gUnknown_Debug_083C21EF, DummyMenuAction},
+ {gUnknown_Debug_083C2206, DummyMenuAction},
+ {gUnknown_Debug_083C221D, DummyMenuAction},
+ {gUnknown_Debug_083C2234, DummyMenuAction},
+ {gUnknown_Debug_083C224B, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C2294[] = _("FVーPOKE1ー02ーCAVEーD1111");
+static const u8 gUnknown_Debug_083C22AB[] = _("FVーPOKE1ー01ーCAVEーD0601");
+static const u8 gUnknown_Debug_083C22C2[] = _("FVーPOKE1ー02ーCAVEーD0601");
+static const u8 gUnknown_Debug_083C22D9[] = _("FVーPOKE1ー01ーFIELDーR101");
+static const u8 gUnknown_Debug_083C22F0[] = _("FVーPOKE1ー01ーOPENINGーROOM01");
+static const u8 gUnknown_Debug_083C230B[] = _("FVーPOKE1ー02ーOPENINGーROOM01");
+static const u8 gUnknown_Debug_083C2326[] = _("FVーPOKE1ー01ーCAVEーD2308");
+static const u8 gUnknown_Debug_083C233D[] = _("FVーPOKEMONー01ーCAVEーD0201");
+static const u8 gUnknown_Debug_083C2356[] = _("FVーPOKEMONー01ーR104ーR0101");
+
+static const struct MenuAction gUnknown_Debug_083C2370[] = {
+ {gUnknown_Debug_083C2294, DummyMenuAction},
+ {gUnknown_Debug_083C22AB, DummyMenuAction},
+ {gUnknown_Debug_083C22C2, DummyMenuAction},
+ {gUnknown_Debug_083C22D9, DummyMenuAction},
+ {gUnknown_Debug_083C22F0, DummyMenuAction},
+ {gUnknown_Debug_083C230B, DummyMenuAction},
+ {gUnknown_Debug_083C2326, DummyMenuAction},
+ {gUnknown_Debug_083C233D, DummyMenuAction},
+ {gUnknown_Debug_083C2356, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C23B8[] = _("FVーMAMAー01ーFIELDーT101");
+static const u8 gUnknown_Debug_083C23CE[] = _("FVーMAMAー01ーOPENINGーROOM02");
+static const u8 gUnknown_Debug_083C23E8[] = _("FVーMAMAー01ーT101ーR0101");
+static const u8 gUnknown_Debug_083C23FE[] = _("FVーMAMAー01ーT101ーR0201");
+static const u8 gUnknown_Debug_083C2414[] = _("FVーMAMAー02ーT101ーR0101");
+static const u8 gUnknown_Debug_083C242A[] = _("FVーMAMAー02ーT101ーR0201");
+static const u8 gUnknown_Debug_083C2440[] = _("FVーSUPPORTー02ーFIELDーR110");
+static const u8 gUnknown_Debug_083C2459[] = _("FVーSUPPORTー02ーFIELDーR119");
+static const u8 gUnknown_Debug_083C2472[] = _("FVーSUPPORTー02ーFIELDーT104");
+
+static const struct MenuAction gUnknown_Debug_083C248C[] = {
+ {gUnknown_Debug_083C23B8, DummyMenuAction},
+ {gUnknown_Debug_083C23CE, DummyMenuAction},
+ {gUnknown_Debug_083C23E8, DummyMenuAction},
+ {gUnknown_Debug_083C23FE, DummyMenuAction},
+ {gUnknown_Debug_083C2414, DummyMenuAction},
+ {gUnknown_Debug_083C242A, DummyMenuAction},
+ {gUnknown_Debug_083C2440, DummyMenuAction},
+ {gUnknown_Debug_083C2459, DummyMenuAction},
+ {gUnknown_Debug_083C2472, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C24D4[] = _("FVーHAGIー01ーFIELDーR104");
+static const u8 gUnknown_Debug_083C24EA[] = _("FVーHAGIー01ーR104ーR0101");
+static const u8 gUnknown_Debug_083C2500[] = _("FVーHAGIー01ーFIELDーT103");
+static const u8 gUnknown_Debug_083C2516[] = _("FVーHAGIー01ーFIELDーR109");
+static const u8 gUnknown_Debug_083C252C[] = _("FVーHAGIー01ーC102ーR0601");
+static const u8 gUnknown_Debug_083C2542[] = _("FVーHAGIー01ーC102ーR0101");
+static const u8 gUnknown_Debug_083C2558[] = _("FVーHAGIー01ーCAVEーD0201");
+static const u8 gUnknown_Debug_083C256E[] = _("FVーHAGIー01ーFIELDーR116");
+static const u8 gUnknown_Debug_083C2584[] = _("FVーHAGIー01ーSPーSHIP01");
+
+static const struct MenuAction gUnknown_Debug_083C259C[] = {
+ {gUnknown_Debug_083C24D4, DummyMenuAction},
+ {gUnknown_Debug_083C24EA, DummyMenuAction},
+ {gUnknown_Debug_083C2500, DummyMenuAction},
+ {gUnknown_Debug_083C2516, DummyMenuAction},
+ {gUnknown_Debug_083C252C, DummyMenuAction},
+ {gUnknown_Debug_083C2542, DummyMenuAction},
+ {gUnknown_Debug_083C2558, DummyMenuAction},
+ {gUnknown_Debug_083C256E, DummyMenuAction},
+ {gUnknown_Debug_083C2584, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C25E4[] = _("FVーSUPPORTー01ーT101ーR0301");
+static const u8 gUnknown_Debug_083C25FD[] = _("FVーSUPPORTー01ーC109ーR0105");
+static const u8 gUnknown_Debug_083C2616[] = _("FVーSUPPORTー01ーFIELDーC104");
+static const u8 gUnknown_Debug_083C262F[] = _("FVーSUPPORTー01ーFIELDーC106");
+static const u8 gUnknown_Debug_083C2648[] = _("FVーSUPPORTー01ーFIELDーR103");
+static const u8 gUnknown_Debug_083C2661[] = _("FVーSUPPORTー01ーFIELDーR110");
+static const u8 gUnknown_Debug_083C267A[] = _("FVーSUPPORTー01ーFIELDーR119");
+static const u8 gUnknown_Debug_083C2693[] = _("FVーSUPPORTー01ーFIELDーT104");
+static const u8 gUnknown_Debug_083C26AC[] = _("FVーSUPPORTー01ーFIELDーT102");
+
+static const struct MenuAction gUnknown_Debug_083C26C8[] = {
+ {gUnknown_Debug_083C25E4, DummyMenuAction},
+ {gUnknown_Debug_083C25FD, DummyMenuAction},
+ {gUnknown_Debug_083C2616, DummyMenuAction},
+ {gUnknown_Debug_083C262F, DummyMenuAction},
+ {gUnknown_Debug_083C2648, DummyMenuAction},
+ {gUnknown_Debug_083C2661, DummyMenuAction},
+ {gUnknown_Debug_083C267A, DummyMenuAction},
+ {gUnknown_Debug_083C2693, DummyMenuAction},
+ {gUnknown_Debug_083C26AC, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C2710[] = {9, 9, 9, 9, 6, 9, 9, 9, 9};
+
+static const u16 gUnknown_Debug_083C271A[][9] = {
+ {FLAG_HIDE_KECLEON_ROUTE120_2, FLAG_HIDE_KECLEON_ROUTE120_1, FLAG_HIDE_KECLEON_ROUTE120_3, FLAG_HIDE_KECLEON_ROUTE120_4, FLAG_HIDE_KECLEON_ROUTE120_5, FLAG_HIDE_KECLEON_ROUTE120_6, FLAG_HIDE_KECLEON_ROUTE120_7, FLAG_HIDE_KECLEON_ROUTE119_1, FLAG_HIDE_KECLEON_ROUTE119_2},
+ {FLAG_HIDE_BELDUM_BALL_STEVENS_HOUSE, FLAG_HIDE_DEVON_RUSTBORO, FLAG_HIDE_UNDERWATER_SUBMARINE_INTERACTION, FLAG_HIDE_LILYCOVE_MOTEL_PEOPLE, FLAG_HIDE_ROOFTOP_LADY_LILYCOVE_MART, FLAG_HIDE_TRICKMASTER_ENTRANCE, 0x352, FLAG_HIDE_MAY_UPSTAIRS, FLAG_HIDE_BRENDAN_UPSTAIRS},
+ {FLAG_HIDE_BIRCH_BATTLE_POOCHYENA, FLAG_HIDE_BIRCH_IN_LAB, FLAG_UNKNOWN_BIRCH_380, FLAG_HIDE_BIRCH_ROUTE101, FLAG_HIDE_BIRCH_ROUTE103, FLAG_HIDE_BIRCH_CHAMPIONS_ROOM, FLAG_HIDE_BOYFRIEND_RUSTURF_TUNNEL, FLAG_HIDE_BOYFRIEND_WANDAS_HOUSE, FLAG_HIDE_TUNNER_DIGGER_ROUTE116},
+ {FLAG_HIDE_WALLY_PETALBURG, FLAG_HIDE_WALLY_DEFEATED_VICTORY_ROAD, FLAG_HIDE_WALLY_MAUVILLE, FLAG_HIDE_WALLY_WANDAS_HOUSE, FLAG_HIDE_WALLY_BATTLE_VICTORY_ROAD, FLAG_HIDE_WALLY_PETALBURG_GYM, FLAG_UNKNOWN_363, FLAG_HIDE_WEATHER_INSTITUTE_WORKERS_1F, FLAG_HIDE_WEATHER_INSTITUTE_WORKERS_2F},
+ {FLAG_HIDE_STEVEN_GRANITE_CAVE, FLAG_HIDE_STEVEN_ROUTE128, FLAG_HIDE_STEVEN_ROUTE118, FLAG_HIDE_STEVEN_STEVENS_HOUSE, FLAG_HIDE_STEVEN_ROUTE120, FLAG_HIDE_STEVEN_SOOTOPOLIS},
+ {FLAG_HIDE_SLEEPING_MON_SEAFLOOR_CAVERN, FLAG_UNKNOWN_2E1, FLAG_UNKNOWN_2EC, FLAG_HIDE_POOCHYENA_ROUTE101, FLAG_HIDE_MACHOKE_MOVER_1, FLAG_HIDE_MACHOKE_MOVER_2, 0x305, FLAG_HIDE_PEEKO_RUSTURF_TUNNEL, FLAG_HIDE_PEEKO_BRINEY_HOUSE},
+ {FLAG_HIDE_MOM_LITTLEROOT, FLAG_HIDE_MOM_UPSTAIRS, FLAG_HIDE_BRENDAN_MOM_DOWNSTAIRS, FLAG_HIDE_MAY_MOM_DOWNSTAIRS, FLAG_UNKNOWN_30E, FLAG_UNKNOWN_30F, FLAG_HIDE_RIVAL_ON_BIKE_ROUTE110, FLAG_HIDE_RIVAL_ROUTE119_ON_BIKE, FLAG_HIDE_RIVAL_LAVARIDGE_2},
+ {FLAG_HIDE_MR_BRINEY_ROUTE104, FLAG_HIDE_MR_BRINEY_ROUTE104_HOUSE, FLAG_HIDE_MR_BRINEY_DEWFORD_TOWN, FLAG_HIDE_MR_BRINEY_ROUTE109, FLAG_UNKNOWN_34F, FLAG_HIDE_BRINEY_SLATEPORT_SHIPYARD, FLAG_HIDE_BRINEY_RUSTURF_TUNNEL, FLAG_HIDE_BRINEY_ROUTE116, FLAG_HIDE_BRINEY_AND_PEEKO_SS_TIDAL},
+ {FLAG_HIDE_RIVAL_BIRCH_LAB, FLAG_HIDE_RIVAL_CHAMPIONS_ROOM, FLAG_HIDE_RIVAL_RUSTBORO, FLAG_HIDE_RIVAL_LILYCOVE_MART, FLAG_HIDE_RIVAL_ROUTE103, FLAG_HIDE_RIVAL_ROUTE110, FLAG_HIDE_RIVAL_ROUTE119, FLAG_HIDE_RIVAL_LAVARIDGE_1, FLAG_HIDE_RIVAL_OLDALE_TOWN}
+};
+
+static const u8 gUnknown_Debug_083C27BC[] = _("FEひでんわざ/デボンかんれん");
+static const u8 gUnknown_Debug_083C27CC[] = _("FEだいじなアイテムPART1");
+static const u8 gUnknown_Debug_083C27DC[] = _("そのた1");
+static const u8 gUnknown_Debug_083C27E1[] = _("MITSURU/DOOR");
+static const u8 gUnknown_Debug_083C27EE[] = _("カラクリやしき10のやじるし/GYM07");
+static const u8 gUnknown_Debug_083C2803[] = _("SUPPORT/そのた4");
+static const u8 gUnknown_Debug_083C2810[] = _("DAISUKI/そのた5");
+static const u8 gUnknown_Debug_083C281D[] = _("そのた2");
+static const u8 gUnknown_Debug_083C2822[] = _("そのた6");
+
+static const struct MenuAction gUnknown_Debug_083C2828[] = {
+ {gUnknown_Debug_083C27BC, debug_sub_808C3B0},
+ {gUnknown_Debug_083C27CC, debug_sub_808C408},
+ {gUnknown_Debug_083C27DC, debug_sub_808C460},
+ {gUnknown_Debug_083C27E1, debug_sub_808C4B8},
+ {gUnknown_Debug_083C27EE, debug_sub_808C510},
+ {gUnknown_Debug_083C2803, debug_sub_808C568},
+ {gUnknown_Debug_083C2810, debug_sub_808C5C0},
+ {gUnknown_Debug_083C281D, debug_sub_808C618},
+ {gUnknown_Debug_083C2822, debug_sub_808C670}
+};
+
+static const u8 gUnknown_Debug_083C2870[] = _("FEーHWAZA01ーGET");
+static const u8 gUnknown_Debug_083C287F[] = _("FEーHWAZA02ー01ーFIELDR119");
+static const u8 gUnknown_Debug_083C2897[] = _("FEーHWAZA03ーGET");
+static const u8 gUnknown_Debug_083C28A6[] = _("FEーHWAZA04ー01ーT106ーR0201");
+static const u8 gUnknown_Debug_083C28BF[] = _("FEーHWAZA05ー01ーCAVEーD0502");
+static const u8 gUnknown_Debug_083C28D8[] = _("FEーHWAZA04ー01ーC103ーR0301");
+static const u8 gUnknown_Debug_083C28F1[] = _("FEーDEBONーNIMOTSUーRETURN");
+static const u8 gUnknown_Debug_083C2909[] = _("FEーDEBONー01ーFIELDーC104");
+static const u8 gUnknown_Debug_083C2920[] = _("FEーDEBONー02ーFIELDーC104");
+
+static const struct MenuAction gUnknown_Debug_083C2938[] = {
+ {gUnknown_Debug_083C2870, DummyMenuAction},
+ {gUnknown_Debug_083C287F, DummyMenuAction},
+ {gUnknown_Debug_083C2897, DummyMenuAction},
+ {gUnknown_Debug_083C28A6, DummyMenuAction},
+ {gUnknown_Debug_083C28BF, DummyMenuAction},
+ {gUnknown_Debug_083C28D8, DummyMenuAction},
+ {gUnknown_Debug_083C28F1, DummyMenuAction},
+ {gUnknown_Debug_083C2909, DummyMenuAction},
+ {gUnknown_Debug_083C2920, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C2980[] = _("FEーCYCLEー01ーP01ーP01ーC103ーR0201");
+static const u8 gUnknown_Debug_083C299F[] = _("FEーSCOOPー01ーP01ーFIELDーR115");
+static const u8 gUnknown_Debug_083C29BA[] = _("FEーROPEー01ーP01ーFIELDーR114");
+static const u8 gUnknown_Debug_083C29D4[] = _("FEーKAMAー01ーP01ーFIELDーR119");
+static const u8 gUnknown_Debug_083C29EE[] = _("FEーZYOUROーGET");
+static const u8 gUnknown_Debug_083C29FC[] = _("FEーCUBECASEーGET");
+static const u8 gUnknown_Debug_083C2A0C[] = _("FEーBORONOTURIZAOーGET");
+static const u8 gUnknown_Debug_083C2A21[] = _("FEーIITURIZAOーGET");
+static const u8 gUnknown_Debug_083C2A32[] = _("FEーSUGOITURIZAOーGET");
+
+static const struct MenuAction gUnknown_Debug_083C2A48[] = {
+ {gUnknown_Debug_083C2980, DummyMenuAction},
+ {gUnknown_Debug_083C299F, DummyMenuAction},
+ {gUnknown_Debug_083C29BA, DummyMenuAction},
+ {gUnknown_Debug_083C29D4, DummyMenuAction},
+ {gUnknown_Debug_083C29EE, DummyMenuAction},
+ {gUnknown_Debug_083C29FC, DummyMenuAction},
+ {gUnknown_Debug_083C2A0C, DummyMenuAction},
+ {gUnknown_Debug_083C2A21, DummyMenuAction},
+ {gUnknown_Debug_083C2A32, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C2A90[] = _("FEーBOSSー01ーCAVEーD0701");
+static const u8 gUnknown_Debug_083C2AA6[] = _("FEーTANTIKIーRETURN");
+static const u8 gUnknown_Debug_083C2AB8[] = _("FEーPOKE1ー01ーCAVEーD1111");
+static const u8 gUnknown_Debug_083C2ACF[] = _("FEーPOKE1ー01ーCAVEーD1206");
+static const u8 gUnknown_Debug_083C2AE6[] = _("FEーSHOPー01ーC104ーFS01");
+static const u8 gUnknown_Debug_083C2AFB[] = _("FEーHUNENOTIKETTーGET");
+static const u8 gUnknown_Debug_083C2B0F[] = _("FEーKAKUREー01ーFIELDーC105");
+static const u8 gUnknown_Debug_083C2B27[] = _("FEーKASEKIーRETURN");
+static const u8 gUnknown_Debug_083C2B38[] = _("FEーWINー01ーSPーSHIP01");
+
+static const struct MenuAction gUnknown_Debug_083C2B4C[] = {
+ {gUnknown_Debug_083C2A90, DummyMenuAction},
+ {gUnknown_Debug_083C2AA6, DummyMenuAction},
+ {gUnknown_Debug_083C2AB8, DummyMenuAction},
+ {gUnknown_Debug_083C2ACF, DummyMenuAction},
+ {gUnknown_Debug_083C2AE6, DummyMenuAction},
+ {gUnknown_Debug_083C2AFB, DummyMenuAction},
+ {gUnknown_Debug_083C2B0F, DummyMenuAction},
+ {gUnknown_Debug_083C2B27, DummyMenuAction},
+ {gUnknown_Debug_083C2B38, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C2B94[] = _("FEーMITSURUー01ーT106ーR0201");
+static const u8 gUnknown_Debug_083C2BAD[] = _("FEーMITSURUー01ーCAVEーD1301");
+static const u8 gUnknown_Debug_083C2BC6[] = _("FEーMITSURUー02ーFIELDーC103");
+static const u8 gUnknown_Debug_083C2BDF[] = _("FEーMITSURUー02ーT106ーR0201");
+static const u8 gUnknown_Debug_083C2BF8[] = _("FEーMITSURUー01ーFIELDーC103");
+static const u8 gUnknown_Debug_083C2C11[] = _("FEーDOORーOPENー01ーCAVEーD1712");
+static const u8 gUnknown_Debug_083C2C2C[] = _("FEーDOORーOPENー02ーCAVEーD1712");
+static const u8 gUnknown_Debug_083C2C47[] = _("FEーDOORーOPENー04ーCAVEーD1712");
+static const u8 gUnknown_Debug_083C2C62[] = _("FEーDOORーOPENー06ーCAVEーD1712");
+
+static const struct MenuAction gUnknown_Debug_083C2C80[] = {
+ {gUnknown_Debug_083C2B94, DummyMenuAction},
+ {gUnknown_Debug_083C2BAD, DummyMenuAction},
+ {gUnknown_Debug_083C2BC6, DummyMenuAction},
+ {gUnknown_Debug_083C2BDF, DummyMenuAction},
+ {gUnknown_Debug_083C2BF8, DummyMenuAction},
+ {gUnknown_Debug_083C2C11, DummyMenuAction},
+ {gUnknown_Debug_083C2C2C, DummyMenuAction},
+ {gUnknown_Debug_083C2C47, DummyMenuAction},
+ {gUnknown_Debug_083C2C62, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C2CC8[] = _("FEーKARAKURI10ーSWITCHー01");
+static const u8 gUnknown_Debug_083C2CE0[] = _("FEーKARAKURI10ーSWITCHー02");
+static const u8 gUnknown_Debug_083C2CF8[] = _("FEーKARAKURI10ーSWITCHー03");
+static const u8 gUnknown_Debug_083C2D10[] = _("FEーKARAKURI10ーSWITCHー04");
+static const u8 gUnknown_Debug_083C2D28[] = _("FEーKARAKURI10ーSWITCHー05");
+static const u8 gUnknown_Debug_083C2D40[] = _("FEーGYM07ーSWITCHー01");
+static const u8 gUnknown_Debug_083C2D53[] = _("FEーGYM07ーSWITCHー02");
+static const u8 gUnknown_Debug_083C2D66[] = _("FEーGYM07ーSWITCHー03");
+static const u8 gUnknown_Debug_083C2D79[] = _("FEーGYM07ーSWITCHー04");
+
+static const struct MenuAction gUnknown_Debug_083C2D8C[] = {
+ {gUnknown_Debug_083C2CC8, DummyMenuAction},
+ {gUnknown_Debug_083C2CE0, DummyMenuAction},
+ {gUnknown_Debug_083C2CF8, DummyMenuAction},
+ {gUnknown_Debug_083C2D10, DummyMenuAction},
+ {gUnknown_Debug_083C2D28, DummyMenuAction},
+ {gUnknown_Debug_083C2D40, DummyMenuAction},
+ {gUnknown_Debug_083C2D53, DummyMenuAction},
+ {gUnknown_Debug_083C2D66, DummyMenuAction},
+ {gUnknown_Debug_083C2D79, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C2DD4[] = _("FEーSUPPORTー01ーFIELDーR103");
+static const u8 gUnknown_Debug_083C2DED[] = _("FEーSUPPORTー01ーFIELDーC106");
+static const u8 gUnknown_Debug_083C2E06[] = _("FEーSUPPORTー01ーFIELDーR104");
+static const u8 gUnknown_Debug_083C2E1F[] = _("FEーSUPPORTー02ーFIELDーC106");
+static const u8 gUnknown_Debug_083C2E38[] = _("FEーSUPPORTー01ーT101ーR0202");
+static const u8 gUnknown_Debug_083C2E51[] = _("FEーMAMAー01ーP01ーT101ーR0101");
+static const u8 gUnknown_Debug_083C2E6B[] = _("FEーCLOCKーSET");
+static const u8 gUnknown_Debug_083C2E78[] = _("FEーODAMAKIー01ーP01ーT101ーR03");
+static const u8 gUnknown_Debug_083C2E93[] = _("FEーPAPAー01ーP01ーC101ーR0201");
+
+static const struct MenuAction gUnknown_Debug_083C2EB0[] = {
+ {gUnknown_Debug_083C2DD4, DummyMenuAction},
+ {gUnknown_Debug_083C2DED, DummyMenuAction},
+ {gUnknown_Debug_083C2E06, DummyMenuAction},
+ {gUnknown_Debug_083C2E1F, DummyMenuAction},
+ {gUnknown_Debug_083C2E38, DummyMenuAction},
+ {gUnknown_Debug_083C2E51, DummyMenuAction},
+ {gUnknown_Debug_083C2E6B, DummyMenuAction},
+ {gUnknown_Debug_083C2E78, DummyMenuAction},
+ {gUnknown_Debug_083C2E93, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C2EF8[] = _("FEーDAISUKIーGOODSーFLAG01");
+static const u8 gUnknown_Debug_083C2F10[] = _("FEーDAISUKIーGOODSーFLAG02");
+static const u8 gUnknown_Debug_083C2F28[] = _("FEーDAISUKIーGOODSーFLAG03");
+static const u8 gUnknown_Debug_083C2F40[] = _("FEーDAISUKIーGOODSーFLAG04");
+static const u8 gUnknown_Debug_083C2F58[] = _("FEーDAISUKIーGOODSーFLAG05");
+static const u8 gUnknown_Debug_083C2F70[] = _("FEーBASHAー01ーP01ーFIELDーC101ー");
+static const u8 gUnknown_Debug_083C2F8C[] = _("FEーBASHAー01ーP02ーFIELDーC101ー");
+static const u8 gUnknown_Debug_083C2FA8[] = _("FEーBALLー01ーP01ーSPーCONTEST");
+static const u8 gUnknown_Debug_083C2FC2[] = _("FEーWOMAN2ー01ーP01ーT101ーR0201");
+
+static const struct MenuAction gUnknown_Debug_083C2FE0[] = {
+ {gUnknown_Debug_083C2EF8, DummyMenuAction},
+ {gUnknown_Debug_083C2F10, DummyMenuAction},
+ {gUnknown_Debug_083C2F28, DummyMenuAction},
+ {gUnknown_Debug_083C2F40, DummyMenuAction},
+ {gUnknown_Debug_083C2F58, DummyMenuAction},
+ {gUnknown_Debug_083C2F70, DummyMenuAction},
+ {gUnknown_Debug_083C2F8C, DummyMenuAction},
+ {gUnknown_Debug_083C2FA8, DummyMenuAction},
+ {gUnknown_Debug_083C2FC2, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C3028[] = _("FEーSOUKOーOPENーCAVEーD1704");
+static const u8 gUnknown_Debug_083C3041[] = _("FEーSORAISIー01ーCAVEーD0101");
+static const u8 gUnknown_Debug_083C305A[] = _("FEーMAYUMIー01ーーR114ーR0201");
+static const u8 gUnknown_Debug_083C3073[] = _("FEーKUSUNOKIー01ーC102ーR0601");
+static const u8 gUnknown_Debug_083C308D[] = _("FEーOLDWOMAN1ー01ーCAVEーD0808");
+static const u8 gUnknown_Debug_083C30A8[] = _("FEーTRAINERM1ー01ーC109ーR0206");
+static const u8 gUnknown_Debug_083C30C3[] = _("FEーSOONANOーTAMAGOーGET");
+static const u8 gUnknown_Debug_083C30D9[] = _("FEーDASHーSHOESーGET");
+static const u8 gUnknown_Debug_083C30EB[] = _("FEーDEBONSUKOOPUーGET");
+
+static const struct MenuAction gUnknown_Debug_083C3100[] = {
+ {gUnknown_Debug_083C3028, DummyMenuAction},
+ {gUnknown_Debug_083C3041, DummyMenuAction},
+ {gUnknown_Debug_083C305A, DummyMenuAction},
+ {gUnknown_Debug_083C3073, DummyMenuAction},
+ {gUnknown_Debug_083C308D, DummyMenuAction},
+ {gUnknown_Debug_083C30A8, DummyMenuAction},
+ {gUnknown_Debug_083C30C3, DummyMenuAction},
+ {gUnknown_Debug_083C30D9, DummyMenuAction},
+ {gUnknown_Debug_083C30EB, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C3148[] = _("FEーSTUDYM1ー01ーP01ーT101R0301");
+static const u8 gUnknown_Debug_083C3164[] = _("FEーWORKERM1ー01ーC103ーR0201");
+static const u8 gUnknown_Debug_083C317E[] = _("FEーHIMITSUーGET");
+static const u8 gUnknown_Debug_083C318D[] = _("");
+static const u8 gUnknown_Debug_083C318E[] = _("");
+static const u8 gUnknown_Debug_083C318F[] = _("");
+static const u8 gUnknown_Debug_083C3190[] = _("");
+static const u8 gUnknown_Debug_083C3191[] = _("");
+static const u8 gUnknown_Debug_083C3192[] = _("");
+
+static const struct MenuAction gUnknown_Debug_083C3194[] = {
+ {gUnknown_Debug_083C3148, DummyMenuAction},
+ {gUnknown_Debug_083C3164, DummyMenuAction},
+ {gUnknown_Debug_083C317E, DummyMenuAction},
+ {gUnknown_Debug_083C318D, DummyMenuAction},
+ {gUnknown_Debug_083C318E, DummyMenuAction},
+ {gUnknown_Debug_083C318F, DummyMenuAction},
+ {gUnknown_Debug_083C3190, DummyMenuAction},
+ {gUnknown_Debug_083C3191, DummyMenuAction},
+ {gUnknown_Debug_083C3192, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C31DC[] = {9, 9, 9, 9, 9, 9, 9, 9, 3};
+
+static const u16 gUnknown_Debug_83C31E6[][9] = {
+ {FLAG_RECEIVED_HM01, FLAG_RECEIVED_HM02, FLAG_RECEIVED_HM03, FLAG_RECEIVED_HM04, FLAG_RECEIVED_HM05, FLAG_RECEIVED_HM06, FLAG_RETURNED_DEVON_GOODS, FLAG_DEVON_GOODS_STOLEN, FLAG_RECOVERED_DEVON_GOODS},
+ {FLAG_RECEIVED_BIKE, 0x05B, 0x05C, 0x05D, FLAG_RECEIVED_WAILMER_PAIL, FLAG_RECEIVED_POKEBLOCK_CASE, FLAG_RECEIVED_OLD_ROD, FLAG_RECEIVED_GOOD_ROD, FLAG_RECEIVED_SUPER_ROD},
+ {FLAG_DEFEATED_EVIL_TEAM_MT_CHIMNEY, FLAG_EXCHANGED_SCANNER, FLAG_LEGEND_ESCAPED_SEAFLOOR_CAVERN, FLAG_LEGENDARY_BATTLE_COMPLETED, FLAG_RECEIVED_REPEAT_BALL, FLAG_RECEIVED_SS_TICKET, FLAG_KECLEON_FLED_FORTREE, FLAG_RECEIVED_FOSSIL_MON, FLAG_DEFEATED_SS_TIDAL_TRAINERS},
+ {0x06C, FLAG_DEFEATED_WALLY_VICTORY_ROAD, FLAG_DEFEATED_WALLY_MAUVILLE, FLAG_WALLY_SPEECH, FLAG_DECLINED_WALLY_BATTLE_MAUVILLE, FLAG_USED_ROOM_1_KEY, FLAG_USED_ROOM_2_KEY, FLAG_USED_ROOM_4_KEY, FLAG_USED_ROOM_6_KEY},
+ {FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_1, FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_2, FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_3, FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_4, FLAG_TRICK_HOUSE_PUZZLE_7_SWITCH_5, FLAG_MOSSDEEP_GYM_SWITCH_1, FLAG_MOSSDEEP_GYM_SWITCH_2, FLAG_MOSSDEEP_GYM_SWITCH_3, FLAG_MOSSDEEP_GYM_SWITCH_4},
+ {FLAG_DEFEATED_RIVAL_ROUTE103, FLAG_DECLINED_RIVAL_BATTLE_LILYCOVE, FLAG_MET_RIVAL_RUSTBORO, FLAG_MET_RIVAL_LILYCOVE, FLAG_MET_RIVAL_IN_HOUSE_AFTER_LILYCOVE, 0x050, FLAG_SET_WALL_CLOCK, FLAG_RESCUED_BIRCH, 0x055},
+ {FLAG_RECEIVED_RED_SCARF, FLAG_RECEIVED_BLUE_SCARF, FLAG_RECEIVED_PINK_SCARF, FLAG_RECEIVED_GREEN_SCARF, FLAG_RECEIVED_YELLOW_SCARF, 0x053, 0x054, FLAG_LINK_CONTEST_ROOM_POKEBALL, FLAG_MET_RIVAL_MOM},
+ {FLAG_USED_STORAGE_KEY, FLAG_MET_PROF_COSMO, FLAG_RECEIVED_DOLL_LANETTE, FLAG_EVIL_TEAM_ESCAPED_STERN_SPOKE, FLAG_RETURNED_RED_OR_BLUE_ORB, FLAG_ENTERED_ELITE_FOUR, FLAG_RECEIVED_LAVARIDGE_EGG, FLAG_RECEIVED_RUNNING_SHOES, FLAG_RECEIVED_DEVON_SCOPE},
+ {FLAG_BIRCH_AIDE_MET, FLAG_DECLINED_BIKE, FLAG_RECEIVED_SECRET_POWER}
+};
+
+static const u8 gUnknown_Debug_083C3288[] = _("CYCLEかんれん");
+static const u8 gUnknown_Debug_083C3292[] = _("おおきさくらべ");
+static const u8 gUnknown_Debug_083C329A[] = _("カウンタ");
+static const u8 gUnknown_Debug_083C329F[] = _("そのた1");
+static const u8 gUnknown_Debug_083C32A4[] = _("そのた2");
+
+static const struct MenuAction gUnknown_Debug_083C32AC[] = {
+ {gUnknown_Debug_083C3288, debug_sub_808E400},
+ {gUnknown_Debug_083C3292, debug_sub_808E458},
+ {gUnknown_Debug_083C329A, debug_sub_808E4B0},
+ {gUnknown_Debug_083C329F, debug_sub_808E508},
+ {gUnknown_Debug_083C32A4, debug_sub_808E560}
+};
+
+static const u8 gUnknown_Debug_083C32D4[] = _("WKーCYCLEーROADーHIT");
+static const u8 gUnknown_Debug_083C32E6[] = _("WKーCYCLEーROADーTIMエ1");
+static const u8 gUnknown_Debug_083C32FA[] = _("WKーCYCLEーROADーTIMエ2");
+
+static const u8 gUnknown_Debug_083C330E[] = _("WKーSIZEーKINOKOKOーOYAJI");
+static const u8 gUnknown_Debug_083C3325[] = _("WKーSIZEーNAMAZOーOYAJI");
+
+static const u8 gUnknown_Debug_083C333A[] = _("WKーSPRAYーCOUNT");
+static const u8 gUnknown_Debug_083C3349[] = _("WKーICEーCOUNT");
+static const u8 gUnknown_Debug_083C3356[] = _("WKーASHーGATHERーCOUNT");
+static const u8 gUnknown_Debug_083C336A[] = _("WKーCRUISEーCOUNT");
+static const u8 gUnknown_Debug_083C337A[] = _("WKーFRIENDLYーSTEPーCOUNT");
+static const u8 gUnknown_Debug_083C3391[] = _("WKーPOISONーSTEPーCOUNT");
+
+static const u8 gUnknown_Debug_083C33A6[] = _("WKRECYCLEーGOODS");
+static const u8 gUnknown_Debug_083C33B6[] = _("WKーFIRSTーPOKE");
+static const u8 gUnknown_Debug_083C33C4[] = _("WKーMABOROSIRNDーH");
+static const u8 gUnknown_Debug_083C33D5[] = _("WKーMABOROSIRNDーL");
+static const u8 gUnknown_Debug_083C33E6[] = _("EVーONEーDAYーWORK");
+static const u8 gUnknown_Debug_083C33F6[] = _("EVーFANWORK");
+static const u8 gUnknown_Debug_083C3401[] = _("EVーFANTIME");
+static const u8 gUnknown_Debug_083C340C[] = _("WKーKARAKURIーLEVEL");
+static const u8 gUnknown_Debug_083C341E[] = _("WKーPOKELOTーPRIZE");
+
+static const u8 gUnknown_Debug_083C342F[] = _("WKーSPECIALーZUKN");
+static const u8 gUnknown_Debug_083C343F[] = _("WKーHYOUKAーDAYS");
+static const u8 gUnknown_Debug_083C344E[] = _("WKーPOKELOTーRND1");
+static const u8 gUnknown_Debug_083C345E[] = _("WKーPOKELOTーRND2");
+static const u8 gUnknown_Debug_083C346E[] = _("WKーBASEーMAPNO");
+
+static const struct MenuAction gUnknown_Debug_083C347C[] = {
+ {gUnknown_Debug_083C32D4, DummyMenuAction},
+ {gUnknown_Debug_083C32E6, DummyMenuAction},
+ {gUnknown_Debug_083C32FA, DummyMenuAction}
+};
+
+static const struct MenuAction gUnknown_Debug_083C3494[] = {
+ {gUnknown_Debug_083C330E, DummyMenuAction},
+ {gUnknown_Debug_083C3325, DummyMenuAction}
+};
+
+static const struct MenuAction gUnknown_Debug_083C34A4[] = {
+ {gUnknown_Debug_083C333A, DummyMenuAction},
+ {gUnknown_Debug_083C3349, DummyMenuAction},
+ {gUnknown_Debug_083C3356, DummyMenuAction},
+ {gUnknown_Debug_083C336A, DummyMenuAction},
+ {gUnknown_Debug_083C337A, DummyMenuAction},
+ {gUnknown_Debug_083C3391, DummyMenuAction}
+};
+
+static const struct MenuAction gUnknown_Debug_083C34D4[] = {
+ {gUnknown_Debug_083C33A6, DummyMenuAction},
+ {gUnknown_Debug_083C33B6, DummyMenuAction},
+ {gUnknown_Debug_083C33C4, DummyMenuAction},
+ {gUnknown_Debug_083C33D5, DummyMenuAction},
+ {gUnknown_Debug_083C33E6, DummyMenuAction},
+ {gUnknown_Debug_083C33F6, DummyMenuAction},
+ {gUnknown_Debug_083C3401, DummyMenuAction},
+ {gUnknown_Debug_083C340C, DummyMenuAction},
+ {gUnknown_Debug_083C341E, DummyMenuAction}
+};
+
+static const struct MenuAction gUnknown_Debug_083C351C[] = {
+ {gUnknown_Debug_083C342F, DummyMenuAction},
+ {gUnknown_Debug_083C343F, DummyMenuAction},
+ {gUnknown_Debug_083C344E, DummyMenuAction},
+ {gUnknown_Debug_083C345E, DummyMenuAction},
+ {gUnknown_Debug_083C346E, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C3544[] = {3, 2, 6, 9, 5};
+
+static const u16 gUnknown_Debug_083C354A[][9] = {
+ {VAR_CYCLING_ROAD_RECORD_COLLISIONS, VAR_CYCLING_ROAD_RECORD_TIME_L, VAR_CYCLING_ROAD_RECORD_TIME_H},
+ {VAR_SHROOMISH_SIZE_RECORD, VAR_BARBOACH_SIZE_RECORD},
+ {VAR_REPEL_STEP_COUNT, VAR_ICE_STEP_COUNT, VAR_ASH_GATHER_COUNT, VAR_CRUISE_STEP_COUNT, VAR_HAPPINESS_STEP_COUNTER, VAR_POISON_STEP_COUNTER},
+ {VAR_RECYCLE_GOODS, VAR_STARTER_MON, VAR_MIRAGE_RND_H, VAR_MIRAGE_RND_L, VAR_DAYS, VAR_FANCLUB_UNKNOWN_1, VAR_FANCLUB_UNKNOWN_2, VAR_TRICK_HOUSE_ROOMS_COMPLETED, VAR_LOTTERY_PRIZE},
+ {VAR_NATIONAL_DEX, VAR_BIRCH_STATE, VAR_LOTTERY_RND_L, VAR_LOTTERY_RND_H, VAR_SECRET_BASE_MAP}
+};
+
+static const u8 gUnknown_Debug_083C35A4[] = _("OBJCHRWORK0ー8");
+static const u8 gUnknown_Debug_083C35B2[] = _("OBJCHRWORK9ー15");
+
+static const struct MenuAction gUnknown_Debug_083C35C4[] = {
+ {gUnknown_Debug_083C35A4, debug_sub_808E9A0},
+ {gUnknown_Debug_083C35B2, debug_sub_808E9F8}
+};
+
+static const u8 gUnknown_Debug_083C35D4[] = _("OBJCHRWORK1");
+static const u8 gUnknown_Debug_083C35E0[] = _("OBJCHRWORK2");
+static const u8 gUnknown_Debug_083C35EC[] = _("OBJCHRWORK3");
+static const u8 gUnknown_Debug_083C35F8[] = _("OBJCHRWORK4");
+static const u8 gUnknown_Debug_083C3604[] = _("OBJCHRWORK5");
+static const u8 gUnknown_Debug_083C3610[] = _("OBJCHRWORK6");
+static const u8 gUnknown_Debug_083C361C[] = _("OBJCHRWORK7");
+static const u8 gUnknown_Debug_083C3628[] = _("OBJCHRWORK8");
+static const u8 gUnknown_Debug_083C3634[] = _("OBJCHRWORK9");
+
+static const u8 gUnknown_Debug_083C3640[] = _("OBJCHRWORK10");
+static const u8 gUnknown_Debug_083C364D[] = _("OBJCHRWORK11");
+static const u8 gUnknown_Debug_083C365A[] = _("OBJCHRWORK12");
+static const u8 gUnknown_Debug_083C3667[] = _("OBJCHRWORK13");
+static const u8 gUnknown_Debug_083C3674[] = _("OBJCHRWORK14");
+static const u8 gUnknown_Debug_083C3681[] = _("OBJCHRWORK15");
+static const u8 gUnknown_Debug_083C368E[] = _("OBJCHRWORK16");
+
+static const struct MenuAction gUnknown_Debug_083C369C[] = {
+ {gUnknown_Debug_083C35D4, DummyMenuAction},
+ {gUnknown_Debug_083C35E0, DummyMenuAction},
+ {gUnknown_Debug_083C35EC, DummyMenuAction},
+ {gUnknown_Debug_083C35F8, DummyMenuAction},
+ {gUnknown_Debug_083C3604, DummyMenuAction},
+ {gUnknown_Debug_083C3610, DummyMenuAction},
+ {gUnknown_Debug_083C361C, DummyMenuAction},
+ {gUnknown_Debug_083C3628, DummyMenuAction},
+ {gUnknown_Debug_083C3634, DummyMenuAction}
+};
+
+static const struct MenuAction gUnknown_Debug_083C36E4[] = {
+ {gUnknown_Debug_083C3640, DummyMenuAction},
+ {gUnknown_Debug_083C364D, DummyMenuAction},
+ {gUnknown_Debug_083C365A, DummyMenuAction},
+ {gUnknown_Debug_083C3667, DummyMenuAction},
+ {gUnknown_Debug_083C3674, DummyMenuAction},
+ {gUnknown_Debug_083C3681, DummyMenuAction},
+ {gUnknown_Debug_083C368E, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C371C[] = {9, 7};
+
+static const u16 gUnknown_Debug_083C371E[][9] = {
+ {VAR_OBJ_GFX_ID_0, VAR_OBJ_GFX_ID_1, VAR_OBJ_GFX_ID_2, VAR_OBJ_GFX_ID_3, VAR_OBJ_GFX_ID_4, VAR_OBJ_GFX_ID_5, VAR_OBJ_GFX_ID_6, VAR_OBJ_GFX_ID_7, VAR_OBJ_GFX_ID_8},
+ {VAR_OBJ_GFX_ID_9, VAR_OBJ_GFX_ID_A, VAR_OBJ_GFX_ID_B, VAR_OBJ_GFX_ID_C, VAR_OBJ_GFX_ID_D, VAR_OBJ_GFX_ID_E, VAR_OBJ_GFX_ID_F}
+};
+
+static const u8 gUnknown_Debug_083C3742[] = _("SP");
+static const u8 gUnknown_Debug_083C3745[] = _("ルーム R110 PART1/カラクリ");
+static const u8 gUnknown_Debug_083C3759[] = _("ルーム R110 PART2");
+static const u8 gUnknown_Debug_083C3768[] = _("ルーム ロード");
+static const u8 gUnknown_Debug_083C3770[] = _("ソノタ1");
+static const u8 gUnknown_Debug_083C3775[] = _("ソノタ2");
+
+static const struct MenuAction sMenuActions_ControlWorks_SaveWorkPart2[] = {
+ {gUnknown_Debug_083C3742, ControlWorks_SaveWorkPart2_SP_InitSubsubmenu},
+ {gUnknown_Debug_083C3745, ControlWorks_SaveWorkPart2_RoomR110Part1TrickHouse_InitSubsubmenu},
+ {gUnknown_Debug_083C3759, ControlWorks_SaveWorkPart2_RoomR110Part2_InitSubsubmenu},
+ {gUnknown_Debug_083C3768, ControlWorks_SaveWorkPart2_RoomLoad_InitSubsubmenu},
+ {gUnknown_Debug_083C3770, debug_sub_808E1B4},
+ {gUnknown_Debug_083C3775, debug_sub_808E20C}
+};
+
+static const u8 gUnknown_Debug_083C37AC[] = _("WKーSCENEーSPーCONTEST");
+static const u8 gUnknown_Debug_083C37C0[] = _("WKーSCENEーSPーPC");
+static const u8 gUnknown_Debug_083C37CF[] = _("WKーSCENEーSPーCONTEST03");
+static const u8 gUnknown_Debug_083C37E5[] = _("WKーSCENEーSPーCONTESTITEM");
+static const u8 gUnknown_Debug_083C37FD[] = _("WKーSCENEーSPーOPENING");
+static const u8 gUnknown_Debug_083C3811[] = _("WKーSCENEーSPーSHIP01");
+static const u8 gUnknown_Debug_083C3824[] = _("");
+static const u8 gUnknown_Debug_083C3825[] = _("");
+static const u8 gUnknown_Debug_083C3826[] = _("");
+
+static const u8 gUnknown_Debug_083C3827[] = _("WKーSCENEーR110ーR0101");
+static const u8 gUnknown_Debug_083C383B[] = _("WKーSCENEーR110ーR0102");
+static const u8 gUnknown_Debug_083C384F[] = _("WKーSCENEーR110ーR0103");
+static const u8 gUnknown_Debug_083C3863[] = _("WKーKARAKURIーDAIOU");
+static const u8 gUnknown_Debug_083C3875[] = _("WKーSCENEーSHISEN");
+static const u8 gUnknown_Debug_083C3885[] = _("");
+static const u8 gUnknown_Debug_083C3886[] = _("");
+static const u8 gUnknown_Debug_083C3887[] = _("");
+static const u8 gUnknown_Debug_083C3888[] = _("");
+
+static const u8 gUnknown_Debug_083C3889[] = _("WKーSCENEーR110ーR0104");
+static const u8 gUnknown_Debug_083C389D[] = _("WKーSCENEーR110ーR0105");
+static const u8 gUnknown_Debug_083C38B1[] = _("WKーSCENEーR110ーR0106");
+static const u8 gUnknown_Debug_083C38C5[] = _("WKーSCENEーR110ーR0107");
+static const u8 gUnknown_Debug_083C38D9[] = _("WKーSCENEーR110ーR0108");
+static const u8 gUnknown_Debug_083C38ED[] = _("WKーSCENEーR110ーR0109");
+static const u8 gUnknown_Debug_083C3901[] = _("WKーSCENEーR110ーR0110");
+static const u8 gUnknown_Debug_083C3915[] = _("WKーSCENEーR110ーR0111");
+static const u8 gUnknown_Debug_083C3929[] = _("WKーSCENEー02ーR110ーR0110");
+
+static const u8 gUnknown_Debug_083C3940[] = _("WKーSCENEーR104ーR0101");
+static const u8 gUnknown_Debug_083C3954[] = _("WKーSCENEーR113ーR0101");
+static const u8 gUnknown_Debug_083C3968[] = _("");
+static const u8 gUnknown_Debug_083C3969[] = _("");
+static const u8 gUnknown_Debug_083C396A[] = _("");
+static const u8 gUnknown_Debug_083C396B[] = _("");
+static const u8 gUnknown_Debug_083C396C[] = _("");
+static const u8 gUnknown_Debug_083C396D[] = _("");
+static const u8 gUnknown_Debug_083C396E[] = _("");
+
+static const u8 gUnknown_Debug_083C396F[] = _("WKーSCENEーBASEーGDOODS");
+static const u8 gUnknown_Debug_083C3984[] = _("WKーSCENEーHAGIーFUNE");
+static const u8 gUnknown_Debug_083C3997[] = _("WKーSCENEーFUNEーPOS");
+static const u8 gUnknown_Debug_083C39A9[] = _("WKーSCENEーBASEーMAKE");
+static const u8 gUnknown_Debug_083C39BC[] = _("WKーSCENEーARTISTーC106ーR");
+static const u8 gUnknown_Debug_083C39D3[] = _("WKーSCENEーPOKEーLEAGUE");
+static const u8 gUnknown_Debug_083C39E8[] = _("WKーSCENEーROPEWAY");
+static const u8 gUnknown_Debug_083C39F9[] = _("WKーSCENEーSAFARIーZONE");
+static const u8 gUnknown_Debug_083C3A0E[] = _("WKーSCENEーCYCLEーROAD");
+
+static const u8 gUnknown_Debug_083C3A22[] = _("WKーSCENEーR119ーTENKI");
+static const u8 gUnknown_Debug_083C3A36[] = _("WKーSCENEー01ーC102ーR0401");
+static const u8 gUnknown_Debug_083C3A4D[] = _("WKーFUTAGOー01ーFIELDーR104");
+static const u8 gUnknown_Debug_083C3A65[] = _("WKーSCENEーBATTLEーTOWER");
+static const u8 gUnknown_Debug_083C3A7B[] = _("WKーSCENEーTRーHOUSE");
+static const u8 gUnknown_Debug_083C3A8D[] = _("WKーKASEKIーTYPE");
+static const u8 gUnknown_Debug_083C3A9C[] = _("");
+static const u8 gUnknown_Debug_083C3A9D[] = _("");
+static const u8 gUnknown_Debug_083C3A9E[] = _("");
+
+static const struct MenuAction gUnknown_Debug_083C3AA0[] = {
+ {gUnknown_Debug_083C37AC, DummyMenuAction},
+ {gUnknown_Debug_083C37C0, DummyMenuAction},
+ {gUnknown_Debug_083C37CF, DummyMenuAction},
+ {gUnknown_Debug_083C37E5, DummyMenuAction},
+ {gUnknown_Debug_083C37FD, DummyMenuAction},
+ {gUnknown_Debug_083C3811, DummyMenuAction},
+ {gUnknown_Debug_083C3824, DummyMenuAction},
+ {gUnknown_Debug_083C3825, DummyMenuAction}
+};
+
+static const struct MenuAction gUnknown_Debug_83C3AE0[] = {
+ {gUnknown_Debug_083C3827, DummyMenuAction},
+ {gUnknown_Debug_083C383B, DummyMenuAction},
+ {gUnknown_Debug_083C384F, DummyMenuAction},
+ {gUnknown_Debug_083C3863, DummyMenuAction},
+ {gUnknown_Debug_083C3875, DummyMenuAction},
+ {gUnknown_Debug_083C3885, DummyMenuAction},
+ {gUnknown_Debug_083C3886, DummyMenuAction},
+ {gUnknown_Debug_083C3887, DummyMenuAction},
+ {gUnknown_Debug_083C3888, DummyMenuAction}
+};
+
+static const struct MenuAction gUnknown_Debug_83C3B28[] = {
+ {gUnknown_Debug_083C3889, DummyMenuAction},
+ {gUnknown_Debug_083C389D, DummyMenuAction},
+ {gUnknown_Debug_083C38B1, DummyMenuAction},
+ {gUnknown_Debug_083C38C5, DummyMenuAction},
+ {gUnknown_Debug_083C38D9, DummyMenuAction},
+ {gUnknown_Debug_083C38ED, DummyMenuAction},
+ {gUnknown_Debug_083C3901, DummyMenuAction},
+ {gUnknown_Debug_083C3915, DummyMenuAction},
+ {gUnknown_Debug_083C3929, DummyMenuAction}
+};
+
+static const struct MenuAction gUnknown_Debug_83C3B70[] = {
+ {gUnknown_Debug_083C3940, DummyMenuAction},
+ {gUnknown_Debug_083C3954, DummyMenuAction},
+ {gUnknown_Debug_083C3968, DummyMenuAction},
+ {gUnknown_Debug_083C3969, DummyMenuAction},
+ {gUnknown_Debug_083C396A, DummyMenuAction},
+ {gUnknown_Debug_083C396B, DummyMenuAction},
+ {gUnknown_Debug_083C396C, DummyMenuAction},
+ {gUnknown_Debug_083C396D, DummyMenuAction},
+ {gUnknown_Debug_083C396E, DummyMenuAction}
+};
+
+static const struct MenuAction gUnknown_Debug_83C3BB8[] = {
+ {gUnknown_Debug_083C396F, DummyMenuAction},
+ {gUnknown_Debug_083C3984, DummyMenuAction},
+ {gUnknown_Debug_083C3997, DummyMenuAction},
+ {gUnknown_Debug_083C39A9, DummyMenuAction},
+ {gUnknown_Debug_083C39BC, DummyMenuAction},
+ {gUnknown_Debug_083C39D3, DummyMenuAction},
+ {gUnknown_Debug_083C39E8, DummyMenuAction},
+ {gUnknown_Debug_083C39F9, DummyMenuAction},
+ {gUnknown_Debug_083C3A0E, DummyMenuAction}
+};
+
+static const struct MenuAction gUnknown_Debug_83C3C00[] = {
+ {gUnknown_Debug_083C3A22, DummyMenuAction},
+ {gUnknown_Debug_083C3A36, DummyMenuAction},
+ {gUnknown_Debug_083C3A4D, DummyMenuAction},
+ {gUnknown_Debug_083C3A65, DummyMenuAction},
+ {gUnknown_Debug_083C3A7B, DummyMenuAction},
+ {gUnknown_Debug_083C3A8D, DummyMenuAction},
+ {gUnknown_Debug_083C3A9C, DummyMenuAction},
+ {gUnknown_Debug_083C3A9D, DummyMenuAction},
+ {gUnknown_Debug_083C3A9E, DummyMenuAction}
+};
+
+static const u8 sControlWorks_SaveWork_CountsArray[] = {6, 5, 9, 2, 9, 6};
+
+static const u16 sControlWorks_SaveWork_ItemArrays[][9] = {
+ {VAR_LINK_CONTEST_ROOM_STATE, VAR_CABLE_CLUB_STATE, VAR_CONTEST_LOCATION, VAR_CONTEST_PRIZE_PICKUP, VAR_LITTLEROOT_INTRO_STATE, VAR_PORTHOLE_STATE},
+ {VAR_TRICK_HOUSE_ENTRANCE_STATE_2, VAR_TRICK_HOUSE_PRIZE_PICKUP, VAR_TRICK_HOUSE_STATE, VAR_TRICK_HOUSE_ENTRANCE_STATE_3, VAR_TRICK_HOUSE_ENTRANCE_STATE},
+ {VAR_TRICK_HOUSE_PUZZLE_1_STATE, VAR_TRICK_HOUSE_PUZZLE_2_STATE, VAR_TRICK_HOUSE_PUZZLE_3_STATE, VAR_TRICK_HOUSE_PUZZLE_4_STATE, VAR_TRICK_HOUSE_PUZZLE_5_STATE, VAR_TRICK_HOUSE_PUZZLE_6_STATE, VAR_TRICK_HOUSE_PUZZLE_7_STATE, VAR_TRICK_HOUSE_PUZZLE_8_STATE, VAR_TRICK_HOUSE_PUZZLE_7_STATE_2},
+ {VAR_BRINEY_HOUSE_STATE, VAR_GLASS_WORKSHOP_STATE},
+ {VAR_0x4089, VAR_BOARD_BRINEY_BOAT_ROUTE104_STATE, VAR_BRINEY_LOCATION, VAR_0x4097, VAR_LILYCOVE_CONTEST_LOBBY_STATE, VAR_ELITE_4_STATE, VAR_CABLE_CAR_STATION_STATE, VAR_SAFARI_ZONE_STATE, VAR_CYCLING_CHALLENGE_STATE},
+ {VAR_WEATHER_INSTITUTE_STATE, VAR_SLATEPORT_FAN_CLUB_STATE, 0x40BB, VAR_BRAVO_TRAINER_BATTLE_TOWER_ON, VAR_GAME_CORNER_STATE, VAR_WHICH_FOSSIL_REVIVED}
+};
+
+static const u8 sString_Town[] = _("タウン");
+static const u8 sString_City[] = _("シティ");
+static const u8 sString_Route_101_to_109[] = _("ロード101ー109");
+static const u8 sString_Route_110_to_118[] = _("ロード110ー118");
+static const u8 sString_Route_119_to_127[] = _("ロード119ー127");
+static const u8 sString_Route_128_to_134[] = _("ロード128ー134");
+static const u8 sString_Room_Town[] = _("ルーム タウン");
+static const u8 sString_Room_City[] = _("ルーム シティ");
+static const u8 sString_Dungeon_nai[] = _("ダンジョンない");
+
+static const struct MenuAction sMenuAction_ControlWorks_SaveWork[] = {
+ {sString_Town, ControlWorks_SaveWork_Town_InitSubsubmenu},
+ {sString_City, ControlWorks_SaveWork_City_InitSubsubmenu},
+ {sString_Route_101_to_109, ControlWorks_SaveWork_Route101To109_InitSubsubmenu},
+ {sString_Route_110_to_118, ControlWorks_SaveWork_Route110To118_InitSubsubmenu},
+ {sString_Route_119_to_127, ControlWorks_SaveWork_Route119To127_InitSubsubmenu},
+ {sString_Route_128_to_134, ControlWorks_SaveWork_Route128To134_InitSubsubmenu},
+ {sString_Room_Town, ControlWorks_SaveWork_RoomTown_InitSubsubmenu},
+ {sString_Room_City, ControlWorks_SaveWork_RoomCity_InitSubsubmenu},
+ {sString_Dungeon_nai, ControlWorks_SaveWork_Dungeon_InitSubsubmenu}
+};
+
+static const u8 sString_WK_SCENE_FIELD_T101[] = _("WKーSCENEーFIELDーT101");
+static const u8 sString_WK_SCENE_FIELD_T102[] = _("WKーSCENEーFIELDーT102");
+static const u8 sString_WK_SCENE_FIELD_T103[] = _("WKーSCENEーFIELDーT103");
+static const u8 sString_WK_SCENE_FIELD_T104[] = _("WKーSCENEーFIELDーT104");
+static const u8 sString_WK_BASE_POSNO[] = _("WKーBASEーPOSNO");
+static const u8 sString_WK_SCENE_FIELD_T106[] = _("WKーSCENEーFIELDーT106");
+static const u8 sString_WK_SCENE_FIELD_T107[] = _("WKーSCENEーFIELDーT107");
+static const u8 sString_WK_SCENE_2_FIELD_T102[] = _("WKーSCENEー02ーFIELDーT102");
+
+static const u8 sString_WK_SCENE_FIELD_C101[] = _("WKーSCENEーFIELDーC101");
+static const u8 sString_WK_SCENE_FIELD_C102[] = _("WKーSCENEーFIELDーC102");
+static const u8 sString_WK_SCENE_FIELD_C103[] = _("WKーSCENEーFIELDーC103");
+static const u8 sString_WK_SCENE_FIELD_C104[] = _("WKーSCENEーFIELDーC104");
+static const u8 sString_WK_SCENE_FIELD_C105[] = _("WKーSCENEーFIELDーC105");
+static const u8 sString_WK_SCENE_FIELD_C106[] = _("WKーSCENEーFIELDーC106");
+static const u8 sString_WK_SCENE_FIELD_C107[] = _("WKーSCENEーFIELDーC107");
+static const u8 sString_WK_SCENE_FIELD_C108[] = _("WKーSCENEーFIELDーC108");
+static const u8 sString_WK_SCENE_FIELD_C109[] = _("WKーSCENEーFIELDーC109");
+
+static const u8 sString_WK_SCENE_FIELD_R101[] = _("WKーSCENEーFIELDーR101");
+static const u8 sString_WK_SCENE_FIELD_R102[] = _("WKーSCENEーFIELDーR102");
+static const u8 sString_WK_SCENE_FIELD_R103[] = _("WKーSCENEーFIELDーR103");
+static const u8 sString_WK_SCENE_FIELD_R104[] = _("WKーSCENEーFIELDーR104");
+static const u8 sString_WK_SCENE_FIELD_R105[] = _("WKーSCENEーFIELDーR105");
+static const u8 sString_WK_SCENE_FIELD_R106[] = _("WKーSCENEーFIELDーR106");
+static const u8 sString_WK_SCENE_FIELD_R107[] = _("WKーSCENEーFIELDーR107");
+static const u8 sString_WK_SCENE_FIELD_R108[] = _("WKーSCENEーFIELDーR108");
+static const u8 sString_WK_SCENE_FIELD_R109[] = _("WKーSCENEーFIELDーR109");
+
+static const u8 sString_WK_SCENE_FIELD_R110[] = _("WKーSCENEーFIELDーR110");
+static const u8 sString_WK_SCENE_FIELD_R111[] = _("WKーSCENEーFIELDーR111");
+static const u8 sString_WK_SCENE_FIELD_R112[] = _("WKーSCENEーFIELDーR112");
+static const u8 sString_WK_SCENE_FIELD_R113[] = _("WKーSCENEーFIELDーR113");
+static const u8 sString_WK_SCENE_FIELD_R114[] = _("WKーSCENEーFIELDーR114");
+static const u8 sString_WK_SCENE_FIELD_R115[] = _("WKーSCENEーFIELDーR115");
+static const u8 sString_WK_SCENE_FIELD_R116[] = _("WKーSCENEーFIELDーR116");
+static const u8 sString_WK_SCENE_FIELD_R117[] = _("WKーSCENEーFIELDーR117");
+static const u8 sString_WK_SCENE_FIELD_R118[] = _("WKーSCENEーFIELDーR118");
+
+static const u8 sString_WK_SCENE_FIELD_R119[] = _("WKーSCENEーFIELDーR119");
+static const u8 sString_WK_SCENE_FIELD_R120[] = _("WKーSCENEーFIELDーR120");
+static const u8 sString_WK_SCENE_FIELD_R121[] = _("WKーSCENEーFIELDーR121");
+static const u8 sString_WK_SCENE_FIELD_R122[] = _("WKーSCENEーFIELDーR122");
+static const u8 sString_WK_SCENE_FIELD_R123[] = _("WKーSCENEーFIELDーR123");
+static const u8 sString_WK_SCENE_FIELD_R124[] = _("WKーSCENEーFIELDーR124");
+static const u8 sString_WK_SCENE_FIELD_R125[] = _("WKーSCENEーFIELDーR125");
+static const u8 sString_WK_SCENE_FIELD_R126[] = _("WKーSCENEーFIELDーR126");
+static const u8 sString_WK_SCENE_FIELD_R127[] = _("WKーSCENEーFIELDーR127");
+
+static const u8 sString_WK_SCENE_FIELD_R128[] = _("WKーSCENEーFIELDーR128");
+static const u8 sString_WK_SCENE_FIELD_R129[] = _("WKーSCENEーFIELDーR129");
+static const u8 sString_WK_SCENE_FIELD_R130[] = _("WKーSCENEーFIELDーR130");
+static const u8 sString_WK_SCENE_FIELD_R131[] = _("WKーSCENEーFIELDーR131");
+static const u8 sString_WK_SCENE_FIELD_R132[] = _("WKーSCENEーFIELDーR132");
+static const u8 sString_WK_SCENE_FIELD_R133[] = _("WKーSCENEーFIELDーR133");
+static const u8 sString_WK_SCENE_FIELD_R134[] = _("WKーSCENEーFIELDーR134");
+
+static const u8 sString_WK_SCENE_T101_R0101[] = _("WKーSCENEーT101ーR0101");
+static const u8 sString_WK_SCENE_T101_R0102[] = _("WKーSCENEーT101ーR0102");
+static const u8 sString_WK_SCENE_T101_R0301[] = _("WKーSCENEーT101ーR0301");
+static const u8 sString_WK_SCENE_T101_R0201[] = _("WKーSCENEーT101ーR0201");
+static const u8 sString_WK_SCENE_T101_R0202[] = _("WKーSCENEーT101ーR0202");
+static const u8 sString_WK_SCENE_T107_R0201[] = _("WKーSCENEーT107ーR0201"); // unused string
+
+static const u8 sString_WK_SCENE_C101_R0201[] = _("WKーSCENEーC101ーR0201");
+static const u8 sString_WK_SCENE_C104_R0103[] = _("WKーSCENEーC104ーR0103");
+static const u8 sString_WK_SCENE_C103_R0101[] = _("WKーSCENEーC103ーR0101");
+static const u8 sString_WK_SCENE_C106_R0202[] = _("WKーSCENEーC106ーR0202");
+static const u8 sString_WK_SCENE_C106_R0401[] = _("WKーSCENEーC106ーR0401");
+static const u8 sString_WK_SCENE_C101_R0601[] = _("WKーSCENEーC102ーR0601");
+static const u8 sString_WK_SCENE_C102_R0501[] = _("WKーSCENEーC102ーR0501");
+static const u8 sString_WK_SCENE_C104_R0102[] = _("WKーSCENEーC104ーR0102");
+static const u8 sString_WK_SCENE_C107_R0501[] = _("WKーSCENEーC107ーR0501");
+
+static const u8 sString_WK_SCENE_CAVE_D0601[] = _("WKーSCENEーCAVEーD0601");
+static const u8 sString_WK_SCENE_CAVE_D0201[] = _("WKーSCENEーCAVEーD0201");
+static const u8 sString_WK_SCENE_CAVE_D1206[] = _("WKーSCENEーCAVEーD1206");
+static const u8 sString_WK_SCENE_CAVE_D1111[] = _("WKーSCENEーCAVEーD1111");
+static const u8 sString_WK_SCENE_CAVE_D0701[] = _("WKーSCENEーCAVEーD0701");
+static const u8 sString_WK_SCENE_CAVE_D0808[] = _("WKーSCENEーCAVEーD0808");
+static const u8 sString_WK_SCENE_CAVE_D1602[] = _("WKーSCENEーCAVEーD1602");
+static const u8 sString_WK_SCENE_CAVE_D0101[] = _("WKーSCENEーCAVEーD0101");
+static const u8 sString_WK_SCENE_CAVE_D1301[] = _("WKーSCENEーCAVEーD1301");
+
+static const struct MenuAction sMenuActions_SaveWork_Town[] = {
+ {sString_WK_SCENE_FIELD_T101, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_T102, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_T103, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_T104, DummyMenuAction},
+ {sString_WK_BASE_POSNO, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_T106, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_T107, DummyMenuAction},
+ {sString_WK_SCENE_2_FIELD_T102, DummyMenuAction}
+};
+
+static const struct MenuAction sMenuActions_SaveWork_City[] = {
+ {sString_WK_SCENE_FIELD_C101, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_C102, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_C103, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_C104, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_C105, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_C106, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_C107, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_C108, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_C109, DummyMenuAction}
+};
+
+static const struct MenuAction sMenuActions_SaveWork_Route101To109[] = {
+ {sString_WK_SCENE_FIELD_R101, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R102, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R103, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R104, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R105, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R106, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R107, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R108, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R109, DummyMenuAction}
+};
+
+static const struct MenuAction sMenuActions_SaveWork_Route110To118[] = {
+ {sString_WK_SCENE_FIELD_R110, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R111, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R112, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R113, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R114, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R115, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R116, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R117, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R118, DummyMenuAction}
+};
+
+static const struct MenuAction sMenuActions_SaveWork_Route119To127[] = {
+ {sString_WK_SCENE_FIELD_R119, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R120, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R121, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R122, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R123, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R124, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R125, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R126, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R127, DummyMenuAction}
+};
+
+static const struct MenuAction sMenuActions_SaveWork_Route128To134[] = {
+ {sString_WK_SCENE_FIELD_R128, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R129, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R130, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R131, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R132, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R133, DummyMenuAction},
+ {sString_WK_SCENE_FIELD_R134, DummyMenuAction}
+};
+
+static const struct MenuAction sMenuActions_SaveWork_RoomTown[] = {
+ {sString_WK_SCENE_T101_R0101, DummyMenuAction},
+ {sString_WK_SCENE_T101_R0102, DummyMenuAction},
+ {sString_WK_SCENE_T101_R0301, DummyMenuAction},
+ {sString_WK_SCENE_T101_R0201, DummyMenuAction},
+ {sString_WK_SCENE_T101_R0202, DummyMenuAction}
+};
+
+static const struct MenuAction sMenuActions_SaveWork_RoomCity[] = {
+ {sString_WK_SCENE_C101_R0201, DummyMenuAction},
+ {sString_WK_SCENE_C104_R0103, DummyMenuAction},
+ {sString_WK_SCENE_C103_R0101, DummyMenuAction},
+ {sString_WK_SCENE_C106_R0202, DummyMenuAction},
+ {sString_WK_SCENE_C106_R0401, DummyMenuAction},
+ {sString_WK_SCENE_C101_R0601, DummyMenuAction},
+ {sString_WK_SCENE_C102_R0501, DummyMenuAction},
+ {sString_WK_SCENE_C104_R0102, DummyMenuAction},
+ {sString_WK_SCENE_C107_R0501, DummyMenuAction}
+};
+
+static const struct MenuAction sMenuActions_SaveWork_Dungeon[] = {
+ {sString_WK_SCENE_CAVE_D0601, DummyMenuAction},
+ {sString_WK_SCENE_CAVE_D0201, DummyMenuAction},
+ {sString_WK_SCENE_CAVE_D1206, DummyMenuAction},
+ {sString_WK_SCENE_CAVE_D1111, DummyMenuAction},
+ {sString_WK_SCENE_CAVE_D0701, DummyMenuAction},
+ {sString_WK_SCENE_CAVE_D0808, DummyMenuAction},
+ {sString_WK_SCENE_CAVE_D1602, DummyMenuAction},
+ {sString_WK_SCENE_CAVE_D0101, DummyMenuAction},
+ {sString_WK_SCENE_CAVE_D1301, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C457C[] = {8, 9, 9, 9, 9, 7, 6, 9, 9};
+
+static const u16 gUnknown_Debug_083C4586[][9] = {
+ {VAR_LITTLEROOT_STATE, VAR_ROUTE102_ACCESSIBLE, 0x4052, VAR_LAVARIDGE_RIVAL_STATE, VAR_CURRENT_SECRET_BASE, 0x4055, 0x4056, VAR_OLDALE_STATE},
+ {VAR_PETALBURG_STATE, VAR_SLATEPORT_STATE, 0x4059, VAR_RUSTBORO_STATE, 0x405B, 0x405C, 0x405D, VAR_SOOTOPOLIS_STATE, 0x405F},
+ {VAR_ROUTE101_STATE, 0x4061, VAR_ROUTE103_STATE, 0x4063, 0x4064, 0x4065, 0x4066, 0x4067, 0x4068},
+ {VAR_ROUTE110_STATE, 0x406A, 0x406B, 0x406C, 0x406D, 0x406E, VAR_ROUTE116_STATE, 0x4070, VAR_ROUTE118_STATE},
+ {VAR_ROUTE119_STATE, 0x4073, VAR_ROUTE121_STATE, 0x4075, 0x4076, 0x4077, 0x4078, 0x4079, 0x407A},
+ {VAR_ROUTE128_STATE, 0x407C, 0x407D, 0x407E, 0x407F, 0x4080, 0x4081},
+ {VAR_LITTLEROOT_HOUSES_STATE, 0x4083, VAR_BIRCH_LAB_STATE, VAR_LITTLEROOT_HOUSES_STATE_2, VAR_LITTLEROOT_RIVAL_STATE, VAR_PACIFIDLOG_TM_RECEIVED_DAY},
+ {VAR_PETALBURG_GYM_STATE, VAR_DEVON_CORP_3F_STATE, VAR_MAUVILLE_GYM_STATE, VAR_LILYCOVE_MUSEUM_2F_STATE, VAR_LILYCOVE_FAN_CLUB_STATE, VAR_SLATEPORT_HARBOR_STATE, VAR_SLATEPORT_MUSEUM_1F_STATE, VAR_FOSSIL_RESURRECTION_STATE, VAR_STEVENS_HOUSE_STATE},
+ {VAR_PETALBURG_WOODS_STATE, VAR_RUSTURF_TUNNEL_STATE, VAR_CAVE_OF_ORIGIN_B4F_STATE, VAR_SEAFLOOR_CAVERN_STATE, 0x40A8, VAR_MT_PYRE_STATE, VAR_NEW_MAUVILLE_STATE, VAR_METEOR_FALLS_STATE, VAR_VICTORY_ROAD_1F_STATE}
+};
+
+static const u8 gUnknown_Debug_083C4628[] = _("LOCALWORK0ー8");
+static const u8 gUnknown_Debug_083C4635[] = _("LOCALWORK9ー15");
+
+static const struct MenuAction gUnknown_Debug_083C4644[] = {
+ {gUnknown_Debug_083C4628, debug_sub_808E754},
+ {gUnknown_Debug_083C4635, debug_sub_808E7AC}
+};
+
+static const u8 gUnknown_Debug_083C4654[] = _("LOCALWORK0");
+static const u8 gUnknown_Debug_083C465F[] = _("LOCALWORK1");
+static const u8 gUnknown_Debug_083C466A[] = _("LOCALWORK2");
+static const u8 gUnknown_Debug_083C4675[] = _("LOCALWORK3");
+static const u8 gUnknown_Debug_083C4680[] = _("LOCALWORK4");
+static const u8 gUnknown_Debug_083C468B[] = _("LOCALWORK5");
+static const u8 gUnknown_Debug_083C4696[] = _("LOCALWORK6");
+static const u8 gUnknown_Debug_083C46A1[] = _("LOCALWORK7");
+static const u8 gUnknown_Debug_083C46AC[] = _("LOCALWORK8");
+
+static const u8 gUnknown_Debug_083C46B7[] = _("LOCALWORK9");
+static const u8 gUnknown_Debug_083C46C2[] = _("LOCALWORK10");
+static const u8 gUnknown_Debug_083C46CE[] = _("LOCALWORK11");
+static const u8 gUnknown_Debug_083C46DA[] = _("LOCALWORK12");
+static const u8 gUnknown_Debug_083C46E6[] = _("LOCALWORK13");
+static const u8 gUnknown_Debug_083C46F2[] = _("LOCALWORK14");
+static const u8 gUnknown_Debug_083C46FE[] = _("LOCALWORK15");
+
+static const struct MenuAction gUnknown_Debug_083C470C[] = {
+ {gUnknown_Debug_083C4654, DummyMenuAction},
+ {gUnknown_Debug_083C465F, DummyMenuAction},
+ {gUnknown_Debug_083C466A, DummyMenuAction},
+ {gUnknown_Debug_083C4675, DummyMenuAction},
+ {gUnknown_Debug_083C4680, DummyMenuAction},
+ {gUnknown_Debug_083C468B, DummyMenuAction},
+ {gUnknown_Debug_083C4696, DummyMenuAction},
+ {gUnknown_Debug_083C46A1, DummyMenuAction},
+ {gUnknown_Debug_083C46AC, DummyMenuAction}
+};
+
+static const struct MenuAction gUnknown_Debug_083C4754C[] = {
+ {gUnknown_Debug_083C46B7, DummyMenuAction},
+ {gUnknown_Debug_083C46C2, DummyMenuAction},
+ {gUnknown_Debug_083C46CE, DummyMenuAction},
+ {gUnknown_Debug_083C46DA, DummyMenuAction},
+ {gUnknown_Debug_083C46E6, DummyMenuAction},
+ {gUnknown_Debug_083C46F2, DummyMenuAction},
+ {gUnknown_Debug_083C46FE, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C478C[] = {9, 7};
+
+static const u16 gUnknown_Debug_083C478E[][9] = {
+ {VAR_TEMP_0, VAR_TEMP_1, VAR_TEMP_2, VAR_TEMP_3, VAR_TEMP_4, VAR_TEMP_5, VAR_TEMP_6, VAR_TEMP_7, VAR_TEMP_8},
+ {VAR_TEMP_9, VAR_TEMP_A, VAR_TEMP_B, VAR_TEMP_C, VAR_TEMP_D, VAR_TEMP_E, VAR_TEMP_F}
+};
+
+static const u8 gUnknown_Debug_083C47B2[] = _("Level");
+static const u8 gUnknown_Debug_083C47B8[] = _("Scene1");
+static const u8 gUnknown_Debug_083C47BF[] = _("Scene2");
+static const u8 gUnknown_Debug_083C47C6[] = _("Scene3");
+static const u8 gUnknown_Debug_083C47CD[] = _("Scene4");
+static const u8 gUnknown_Debug_083C47D4[] = _("Scene5");
+static const u8 gUnknown_Debug_083C47DB[] = _("Scene6");
+static const u8 gUnknown_Debug_083C47E2[] = _("Scene7");
+static const u8 gUnknown_Debug_083C47E9[] = _("Scene8");
+
+static const struct MenuAction gUnknown_Debug_083C47F0[] = {
+ {gUnknown_Debug_083C47B8, DummyMenuAction},
+ {gUnknown_Debug_083C47BF, DummyMenuAction},
+ {gUnknown_Debug_083C47C6, DummyMenuAction},
+ {gUnknown_Debug_083C47CD, DummyMenuAction},
+ {gUnknown_Debug_083C47D4, DummyMenuAction},
+ {gUnknown_Debug_083C47DB, DummyMenuAction},
+ {gUnknown_Debug_083C47E2, DummyMenuAction},
+ {gUnknown_Debug_083C47E9, DummyMenuAction}
+};
+
+static const u8 gUnknown_Debug_083C4830[] = _("Trick Master");
+
+static const u8 gUnknown_Debug_083C483D[] = _("Hidden MASTER");
+static const u8 gUnknown_Debug_083C484B[] = _("Inside the HOUSE");
+static const u8 gUnknown_Debug_083C485C[] = _("Pass a reward");
+static const u8 gUnknown_Debug_083C486A[] = _("Rig a trick");
+static const u8 gUnknown_Debug_083C4876[] = _("MASTER is gone");
+
+static const struct MenuAction gUnknown_Debug_083C4888[] = {
+ {gUnknown_Debug_083C483D, DummyMenuAction},
+ {gUnknown_Debug_083C484B, DummyMenuAction},
+ {gUnknown_Debug_083C485C, DummyMenuAction},
+ {gUnknown_Debug_083C486A, DummyMenuAction},
+ {gUnknown_Debug_083C4876, DummyMenuAction}
+};
+
+static const u8 sDummyNickname[] = _("PMNICKNAME");
+static const u8 sDummyTrainerName[] = _("BREEDER");
+
+bool8 InitTomomichiDebugWindow(void)
+{
+ InitDebugWindow();
+ return FALSE;
+}
+
+static void debug_sub_808B868(void)
+{
+ c2_exit_to_overworld_1_continue_scripts_restart_music();
+}
+
+static bool8 InitDebugWindow(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 13, 15);
+ Menu_PrintItems(1, 1, ARRAY_COUNT(sMenuActions_TopMenu), sMenuActions_TopMenu);
+ InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_TopMenu), sTopMenuCursorPos, 12);
+ gMenuCallback = TopMenu_HandleInput;
+ return FALSE;
+}
+
+static bool8 TopMenu_HandleInput(void)
+{
+ if (gMain.newKeys & DPAD_UP)
+ {
+ PlaySE(SE_SELECT);
+ sTopMenuCursorPos = Menu_MoveCursor(-1);
+ }
+ if (gMain.newKeys & DPAD_DOWN)
+ {
+ PlaySE(SE_SELECT);
+ sTopMenuCursorPos = Menu_MoveCursor(+1);
+ }
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ return sMenuActions_TopMenu[sTopMenuCursorPos].func();
+ }
+ if (gMain.newKeys & (B_BUTTON | START_BUTTON))
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool8 ContestGraphics(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 20, 11);
+ Menu_PrintText(sString_ContestMenuTitle, 1, 1);
+ Menu_PrintItems(2, 3, ARRAY_COUNT(sMenuActions_ContestPicTest), sMenuActions_ContestPicTest);
+ InitMenu(0, 1, 3, ARRAY_COUNT(sMenuActions_ContestPicTest), 0, 19);
+ gMenuCallback = ContestGraphics_HandleInput;
+ sPicTest_Species = SPECIES_BULBASAUR;
+ sPicTest_OTID = 28467;
+ sPicTest_Personality = 0;
+ sPicTest_ContestType = 1;
+ return FALSE;
+}
+
+static bool8 ArtMusGraphics(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 20, 11);
+ Menu_PrintText(sString_Contest_ArtMuseumTitle, 1, 1);
+ Menu_PrintItems(2, 3, ARRAY_COUNT(sMenuActions_ArtMuseumPicTest), sMenuActions_ArtMuseumPicTest);
+ InitMenu(0, 1, 3, ARRAY_COUNT(sMenuActions_ArtMuseumPicTest), 0, 19);
+ gMenuCallback = ArtMusGraphics_HandleInput;
+ sPicTest_Species = SPECIES_BULBASAUR;
+ sPicTest_OTID = 28467;
+ sPicTest_Personality = 0;
+ sPicTest_MuseumArtTitleType = 1;
+ return FALSE;
+}
+
+static bool8 PreviewData(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 20, 11);
+ Menu_PrintText(sString_Contest_PreviewTitle, 1, 1);
+ Menu_PrintItems(2, 3, ARRAY_COUNT(sMenuActions_PreviewPicTest), sMenuActions_PreviewPicTest);
+ InitMenu(0, 1, 3, ARRAY_COUNT(sMenuActions_PreviewPicTest), 0, 19);
+ gMenuCallback = PreviewData_HandleInput;
+ sPicTest_Species = SPECIES_BULBASAUR;
+ sPicTest_OTID = 28467;
+ sPicTest_Personality = 0;
+ sPicTest_PreviewType = 1;
+ return FALSE;
+}
+
+static bool8 TrickHouse(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 24, 7);
+ Menu_PrintText(sString_TrickRelated, 1, 1);
+ Menu_PrintItems(2, 3, ARRAY_COUNT(sMenuActions_TrickRelated), sMenuActions_TrickRelated);
+ InitMenu(0, 1, 3, ARRAY_COUNT(sMenuActions_TrickRelated), sTrickRelatedMenuCursorPos, 23);
+ gMenuCallback = TrickHouse_HandleInput;
+ return FALSE;
+}
+
+static bool8 ControlEvents(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 24, 5);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_ControlEvents), sMenuActions_ControlEvents);
+ InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_ControlEvents), sControlEventsCursorPos, 23);
+ gMenuCallback = ControlEvents_HandleInput;
+ return FALSE;
+}
+
+static bool8 ControlFlags(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 24, 15);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_ControlFlags), sMenuActions_ControlFlags);
+ InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_ControlFlags), sControlFlagsCursorPos, 23);
+ gMenuCallback = ControlFlags_HandleInput;
+ return FALSE;
+}
+
+static bool8 ControlWorks(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 24, 13);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_ControlWorks), sMenuActions_ControlWorks);
+ InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_ControlWorks), sControlWORKCursorPos, 23);
+ gMenuCallback = ControlWorks_HandleInput;
+ return FALSE;
+}
+
+static bool8 ContestGraphics_HandleInput(void)
+{
+ s8 input = Menu_ProcessInput();
+ s8 cursorPos = Menu_GetCursorPos();
+
+ switch (cursorPos)
+ {
+ case 0:
+ PicTest_SelectPokemon();
+ break;
+ case 1:
+ PicTest_SelectPersonality();
+ break;
+ case 2:
+ ContestPicTest_SelectContestType();
+ break;
+ }
+ PicTest_Redraw(0);
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ if (input == 3)
+ {
+ gMenuCallback = sMenuActions_ContestPicTest[3].func;
+ return FALSE;
+ }
+ return FALSE;
+}
+
+static bool8 ArtMusGraphics_HandleInput(void)
+{
+ s8 input = Menu_ProcessInput();
+ s8 cursorPos = Menu_GetCursorPos();
+
+ switch (cursorPos)
+ {
+ case 0:
+ PicTest_SelectPokemon();
+ break;
+ case 1:
+ PicTest_SelectPersonality();
+ break;
+ case 2:
+ MuseumArtPicTest_SelectTitleType();
+ break;
+ }
+ PicTest_Redraw(1);
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ if (input == 3)
+ {
+ gMenuCallback = sMenuActions_ArtMuseumPicTest[3].func;
+ return FALSE;
+ }
+ return FALSE;
+}
+
+static bool8 PreviewData_HandleInput(void)
+{
+ s8 input = Menu_ProcessInput();
+ s8 cursorPos = Menu_GetCursorPos();
+
+ switch (cursorPos)
+ {
+ case 0:
+ PicTest_SelectPokemon();
+ break;
+ case 1:
+ PicTest_SelectPersonality();
+ break;
+ case 2:
+ PreviewPicTest_SelectType();
+ break;
+ }
+ PicTest_Redraw(2);
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ if (input == 3)
+ {
+ gMenuCallback = sMenuActions_PreviewPicTest[3].func;
+ return FALSE;
+ }
+ return FALSE;
+}
+
+static bool8 TrickHouse_HandleInput(void)
+{
+ if (gMain.newKeys & DPAD_UP)
+ {
+ PlaySE(SE_SELECT);
+ sTrickRelatedMenuCursorPos = Menu_MoveCursor(-1);
+ }
+ if (gMain.newKeys & DPAD_DOWN)
+ {
+ PlaySE(SE_SELECT);
+ sTrickRelatedMenuCursorPos = Menu_MoveCursor(+1);
+ }
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ return sMenuActions_TrickRelated[sTrickRelatedMenuCursorPos].func();
+ }
+ if (gMain.newKeys & (B_BUTTON | START_BUTTON))
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool8 ControlEvents_HandleInput(void)
+{
+ if (gMain.newKeys & DPAD_UP)
+ {
+ PlaySE(SE_SELECT);
+ sControlEventsCursorPos = Menu_MoveCursor(-1);
+ }
+ if (gMain.newKeys & DPAD_DOWN)
+ {
+ PlaySE(SE_SELECT);
+ sControlEventsCursorPos = Menu_MoveCursor(+1);
+ }
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ return sMenuActions_ControlEvents[sControlEventsCursorPos].func();
+ }
+ if (gMain.newKeys & (B_BUTTON | START_BUTTON))
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool8 ControlFlags_HandleInput(void)
+{
+ if (gMain.newKeys & DPAD_UP)
+ {
+ PlaySE(SE_SELECT);
+ sControlFlagsCursorPos = Menu_MoveCursor(-1);
+ }
+ if (gMain.newKeys & DPAD_DOWN)
+ {
+ PlaySE(SE_SELECT);
+ sControlFlagsCursorPos = Menu_MoveCursor(+1);
+ }
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ return sMenuActions_ControlFlags[sControlFlagsCursorPos].func();
+ }
+ if (gMain.newKeys & (B_BUTTON | START_BUTTON))
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool8 ControlWorks_HandleInput(void)
+{
+ if (gMain.newKeys & DPAD_UP)
+ {
+ PlaySE(SE_SELECT);
+ sControlWORKCursorPos = Menu_MoveCursor(-1);
+ }
+ if (gMain.newKeys & DPAD_DOWN)
+ {
+ PlaySE(SE_SELECT);
+ sControlWORKCursorPos = Menu_MoveCursor(+1);
+ }
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ return sMenuActions_ControlWorks[sControlWORKCursorPos].func();
+ }
+ if (gMain.newKeys & (B_BUTTON | START_BUTTON))
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool8 ControlEvents_InitSubmenu1(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 28, 19);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_ControlEvents_Events1), sMenuActions_ControlEvents_Events1);
+ InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_ControlEvents_Events1), 0, 27);
+ gMenuCallback = ControlEvents_Events1_HandleInput;
+ return FALSE;
+}
+
+static bool8 ControlEvents_InitSubmenu2(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 28, 13);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_ControlEvents_Events2), sMenuActions_ControlEvents_Events2);
+ InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_ControlEvents_Events2), 0, 27);
+ gMenuCallback = ControlEvents_Events2_HandleInput;
+ return FALSE;
+}
+
+static bool8 ControlEvents_Events1_HandleInput(void)
+{
+ s8 input = Menu_ProcessInput();
+
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ gMenuCallback = sMenuActions_ControlEvents_Events1[input].func;
+ return FALSE;
+}
+
+static bool8 ControlEvents_Events2_HandleInput(void)
+{
+ s8 input = Menu_ProcessInput();
+
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ gMenuCallback = sMenuActions_ControlEvents_Events2[input].func;
+ return FALSE;
+}
+
+static bool8 CallScript_DoHallOfFame(void)
+{
+ ScriptContext1_SetupScript(DebugScript_081C1CFE);
+ CloseMenu();
+ return TRUE;
+}
+
+static bool8 CallScript_GiveCoinCaseIfNotAlreadyOwned(void)
+{
+ ScriptContext1_SetupScript(DebugScript_081C1D07);
+ CloseMenu();
+ return TRUE;
+}
+
+static bool8 CallScript_SetOldaleStateAfterRoute103Rival(void)
+{
+ ScriptContext1_SetupScript(DebugScript_081C1D1E);
+ CloseMenu();
+ return TRUE;
+}
+
+static bool8 CallScript_OpenNewMauville(void)
+{
+ ScriptContext1_SetupScript(DebugScript_081C1D24);
+ CloseMenu();
+ return TRUE;
+}
+
+static bool8 CallScript_GiveSSTicketAndDoHallOfFame(void)
+{
+ ScriptContext1_SetupScript(DebugScript_081C1D2A);
+ CloseMenu();
+ return TRUE;
+}
+
+static bool8 CallScript_GiveKyogreEgg(void)
+{
+ ScriptContext1_SetupScript(DebugScript_081C1D35);
+ CloseMenu();
+ return TRUE;
+}
+
+static bool8 CallScript_GiveAllItems(void)
+{
+ ScriptContext1_SetupScript(DebugScript_081C1D46);
+ CloseMenu();
+ return TRUE;
+}
+
+static bool8 CallScript_GiveAllDecorations(void)
+{
+ ScriptContext1_SetupScript(DebugScript_081C221F);
+ CloseMenu();
+ return TRUE;
+}
+
+static bool8 CallScript_GiveAllCoins(void)
+{
+ ScriptContext1_SetupScript(DebugScript_081C23E2);
+ CloseMenu();
+ return TRUE;
+}
+
+static bool8 CallScript_OpenSootopolisGym(void)
+{
+ ScriptContext1_SetupScript(DebugScript_081C23E6);
+ CloseMenu();
+ return TRUE;
+}
+
+static bool8 CallScript_SetMoneyTo0(void)
+{
+ ScriptContext1_SetupScript(DebugScript_081C23F6);
+ CloseMenu();
+ return TRUE;
+}
+
+static bool8 CallScript_FillPartyWithBarboach(void)
+{
+ ScriptContext1_SetupScript(DebugScript_081C2482);
+ CloseMenu();
+ return TRUE;
+}
+
+static bool8 CallScript_FillPartyWithShroomish(void)
+{
+ ScriptContext1_SetupScript(DebugScript_081C23FD);
+ CloseMenu();
+ return TRUE;
+}
+
+static bool8 CallScript_GiveBarboachEgg(void)
+{
+ ScriptContext1_SetupScript(DebugScript_081C2518);
+ CloseMenu();
+ return TRUE;
+}
+
+static bool8 CallScript_GiveShroomishEgg(void)
+{
+ ScriptContext1_SetupScript(DebugScript_081C2507);
+ CloseMenu();
+ return TRUE;
+}
+
+static bool8 ContestGraphics_Show(void)
+{
+ BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0);
+ gMenuCallback = debug_sub_808C280;
+ return FALSE;
+}
+
+static bool8 debug_sub_808C280(void)
+{
+ if (!UpdatePaletteFade())
+ {
+ CloseMenu();
+ PrepareDebugOverlayBeforeShowingContestPainting(0);
+ SetMainCallback2(CB2_ContestPainting);
+ gMain.savedCallback = debug_sub_808B868;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool8 MuseumGraphics_Show(void)
+{
+ BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0);
+ gMenuCallback = debug_sub_808C2E4;
+ return FALSE;
+}
+
+static bool8 debug_sub_808C2E4(void)
+{
+ if (!UpdatePaletteFade())
+ {
+ CloseMenu();
+ PrepareDebugOverlayBeforeShowingContestPainting(1);
+ SetMainCallback2(CB2_ContestPainting);
+ gMain.savedCallback = debug_sub_808B868;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool8 ControlFlags_EventFlag_InitSubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 28, 19);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2828), gUnknown_Debug_083C2828);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2828), 0, 27);
+ gMenuCallback = debug_sub_808C36C;
+ return FALSE;
+}
+
+static bool8 debug_sub_808C36C(void)
+{
+ s8 input = Menu_ProcessInput();
+
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ gMenuCallback = gUnknown_Debug_083C2828[input].func;
+ return FALSE;
+}
+
+static bool8 debug_sub_808C3B0(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2938) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2938), gUnknown_Debug_083C2938);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2938), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 0;
+ gMenuCallback = debug_sub_808C6C8;
+ return FALSE;
+}
+
+static bool8 debug_sub_808C408(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2A48) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2A48), gUnknown_Debug_083C2A48);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2A48), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 1;
+ gMenuCallback = debug_sub_808C6C8;
+ return FALSE;
+}
+
+static bool8 debug_sub_808C460(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2B4C) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2B4C), gUnknown_Debug_083C2B4C);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2B4C), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 2;
+ gMenuCallback = debug_sub_808C6C8;
+ return FALSE;
+}
+
+static bool8 debug_sub_808C4B8(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2C80) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2C80), gUnknown_Debug_083C2C80);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2C80), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 3;
+ gMenuCallback = debug_sub_808C6C8;
+ return FALSE;
+}
+
+static bool8 debug_sub_808C510(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2D8C) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2D8C), gUnknown_Debug_083C2D8C);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2D8C), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 4;
+ gMenuCallback = debug_sub_808C6C8;
+ return FALSE;
+}
+
+static bool8 debug_sub_808C568(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2EB0) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2EB0), gUnknown_Debug_083C2EB0);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2EB0), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 5;
+ gMenuCallback = debug_sub_808C6C8;
+ return FALSE;
+}
+
+static bool8 debug_sub_808C5C0(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2FE0) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2FE0), gUnknown_Debug_083C2FE0);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2FE0), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 6;
+ gMenuCallback = debug_sub_808C6C8;
+ return FALSE;
+}
+
+static bool8 debug_sub_808C618(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C3100) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C3100), gUnknown_Debug_083C3100);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C3100), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 7;
+ gMenuCallback = debug_sub_808C6C8;
+ return FALSE;
+}
+
+static bool8 debug_sub_808C670(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * 3 + 1);
+ Menu_PrintItems(2, 1, 3, gUnknown_Debug_083C3194);
+ InitMenu(0, 1, 1, 3, 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 8;
+ gMenuCallback = debug_sub_808C6C8;
+ return FALSE;
+}
+
+static bool8 debug_sub_808C6C8(void)
+{
+ s8 input = Menu_ProcessInput();
+ s8 cursorPos = Menu_GetCursorPos();
+
+ debug_sub_808C714(sFlagAndVarTest_WhichSubmenu, cursorPos);
+ debug_sub_808C764(sFlagAndVarTest_WhichSubmenu);
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void debug_sub_808C714(u8 whichMenu, u8 cursorPos)
+{
+ if (gMain.newKeys & R_BUTTON)
+ {
+ if (!FlagGet(gUnknown_Debug_83C31E6[whichMenu][cursorPos]))
+ FlagSet(gUnknown_Debug_83C31E6[whichMenu][cursorPos]);
+ else
+ FlagClear(gUnknown_Debug_83C31E6[whichMenu][cursorPos]);
+ }
+}
+
+static void debug_sub_808C764(u8 whichMenu)
+{
+ u8 i;
+
+ for (i = 0; i < gUnknown_Debug_083C31DC[whichMenu]; i++)
+ {
+ PrintBool(28, 2 * i + 1, FlagGet(gUnknown_Debug_83C31E6[whichMenu][i]) ? 1 : 0);
+ }
+}
+
+static bool8 ControlFlags_VanishFlag_InitSubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 28, 19);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1CE8), gUnknown_Debug_083C1CE8);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1CE8), 0, 27);
+ gMenuCallback = debug_sub_808C818;
+ return FALSE;
+}
+
+static bool8 debug_sub_808C818(void)
+{
+ s8 input = Menu_ProcessInput();
+
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ gMenuCallback = gUnknown_Debug_083C1CE8[input].func;
+ return FALSE;
+}
+
+static bool8 debug_sub_808C85C(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1E0C) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1E0C), gUnknown_Debug_083C1E0C);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1E0C), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 0;
+ gMenuCallback = debug_sub_808CB74;
+ return FALSE;
+}
+
+static bool8 debug_sub_808C8B4(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1F38) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1F38), gUnknown_Debug_083C1F38);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1F38), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 1;
+ gMenuCallback = debug_sub_808CB74;
+ return FALSE;
+}
+
+static bool8 debug_sub_808C90C(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C206C) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C206C), gUnknown_Debug_083C206C);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C206C), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 2;
+ gMenuCallback = debug_sub_808CB74;
+ return FALSE;
+}
+
+static bool8 debug_sub_808C964(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2190) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2190), gUnknown_Debug_083C2190);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2190), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 3;
+ gMenuCallback = debug_sub_808CB74;
+ return FALSE;
+}
+
+static bool8 debug_sub_808C9BC(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2264) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2264), gUnknown_Debug_083C2264);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2264), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 4;
+ gMenuCallback = debug_sub_808CB74;
+ return FALSE;
+}
+
+static bool8 debug_sub_808CA14(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C2370) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C2370), gUnknown_Debug_083C2370);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C2370), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 5;
+ gMenuCallback = debug_sub_808CB74;
+ return FALSE;
+}
+
+static bool8 debug_sub_808CA6C(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C248C) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C248C), gUnknown_Debug_083C248C);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C248C), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 6;
+ gMenuCallback = debug_sub_808CB74;
+ return FALSE;
+}
+
+static bool8 debug_sub_808CAC4(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C259C) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C259C), gUnknown_Debug_083C259C);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C259C), 0, 27);
+ sFlagAndVarTest_WhichSubmenu = 7;
+ gMenuCallback = debug_sub_808CB74;
+ return FALSE;
+}
+
+static bool8 debug_sub_808CB1C(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C26C8) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C26C8), gUnknown_Debug_083C26C8);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C26C8), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 8;
+ gMenuCallback = debug_sub_808CB74;
+ return FALSE;
+}
+
+static bool8 debug_sub_808CB74(void)
+{
+ s8 input = Menu_ProcessInput();
+ s8 cursorPos = Menu_GetCursorPos();
+
+ debug_sub_808CBC0(sFlagAndVarTest_WhichSubmenu, cursorPos);
+ debug_sub_808CC10(sFlagAndVarTest_WhichSubmenu);
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void debug_sub_808CBC0(u8 whichMenu, u8 cursorPos)
+{
+ if (gMain.newKeys & R_BUTTON)
+ {
+ if (!FlagGet(gUnknown_Debug_083C271A[whichMenu][cursorPos]))
+ FlagSet(gUnknown_Debug_083C271A[whichMenu][cursorPos]);
+ else
+ FlagClear(gUnknown_Debug_083C271A[whichMenu][cursorPos]);
+ }
+}
+
+static void debug_sub_808CC10(u8 whichMenu)
+{
+ u8 i;
+
+ for (i = 0; i < gUnknown_Debug_083C2710[whichMenu]; i++)
+ {
+ PrintBool(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C271A[whichMenu][i]) ? 1 : 0);
+ }
+}
+
+static bool8 ControlFlags_TrainerFlag_InitSubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 28, 2 * ARRAY_COUNT(gUnknown_Debug_083C1ADC) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1ADC), gUnknown_Debug_083C1ADC);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1ADC), 0, 27);
+ gMenuCallback = debug_sub_808CCC4;
+ return FALSE;
+}
+
+static bool8 debug_sub_808CCC4(void)
+{
+ s8 input = Menu_ProcessInput();
+
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ gMenuCallback = gUnknown_Debug_083C1ADC[input].func;
+ return FALSE;
+}
+
+static bool8 debug_sub_808CD08(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1B7C) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1B7C), gUnknown_Debug_083C1B7C);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1B7C), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 0;
+ gMenuCallback = debug_sub_808CE10;
+ return FALSE;
+}
+
+static bool8 debug_sub_808CD60(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1BF0) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1BF0), gUnknown_Debug_083C1BF0);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1BF0), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 1;
+ gMenuCallback = debug_sub_808CE10;
+ return FALSE;
+}
+
+static bool8 debug_sub_808CDB8(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1C2C) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1C2C), gUnknown_Debug_083C1C2C);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1C2C), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 2;
+ gMenuCallback = debug_sub_808CE10;
+ return FALSE;
+}
+
+static bool8 debug_sub_808CE10(void)
+{
+ s8 input = Menu_ProcessInput();
+ s8 cursorPos = Menu_GetCursorPos();
+
+ debug_sub_808CE5C(sFlagAndVarTest_WhichSubmenu, cursorPos);
+ debug_sub_808CEAC(sFlagAndVarTest_WhichSubmenu);
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void debug_sub_808CE5C(u8 whichMenu, u8 cursorPos)
+{
+ if (gMain.newKeys & R_BUTTON)
+ {
+ if (!FlagGet(gUnknown_Debug_083C1C38[whichMenu][cursorPos]))
+ FlagSet(gUnknown_Debug_083C1C38[whichMenu][cursorPos]);
+ else
+ FlagClear(gUnknown_Debug_083C1C38[whichMenu][cursorPos]);
+ }
+}
+
+static void debug_sub_808CEAC(u8 whichMenu)
+{
+ u8 i;
+
+ for (i = 0; i < gUnknown_Debug_083C1C34[whichMenu]; i++)
+ {
+ PrintBool(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C1C38[whichMenu][i]) ? 1 : 0);
+ }
+}
+
+static bool8 ControlFlags_SysFlag_InitSubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 28, 2 * ARRAY_COUNT(gUnknown_Debug_083C1330) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1330), gUnknown_Debug_083C1330);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1330), 0, 27);
+ gMenuCallback = debug_sub_808CF60;
+ return FALSE;
+}
+
+static bool8 debug_sub_808CF60(void)
+{
+ s8 input = Menu_ProcessInput();
+
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ gMenuCallback = gUnknown_Debug_083C1330[input].func;
+ return FALSE;
+}
+
+static bool8 debug_sub_808CFA4(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C13D8) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C13D8), gUnknown_Debug_083C13D8);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C13D8), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 0;
+ gMenuCallback = debug_sub_808D2BC;
+ return FALSE;
+}
+
+static bool8 debug_sub_808CFFC(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1465) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1465), gUnknown_Debug_083C1465);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1465), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 1;
+ gMenuCallback = debug_sub_808D2BC;
+ return FALSE;
+}
+
+static bool8 debug_sub_808D054(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1503) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1503), gUnknown_Debug_083C1503);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1503), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 2;
+ gMenuCallback = debug_sub_808D2BC;
+ return FALSE;
+}
+
+static bool8 debug_sub_808D0AC(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C158A) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C158A), gUnknown_Debug_083C158A);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C158A), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 3;
+ gMenuCallback = debug_sub_808D2BC;
+ return FALSE;
+}
+
+static bool8 debug_sub_808D104(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1647) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1647), gUnknown_Debug_083C1647);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1647), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 4;
+ gMenuCallback = debug_sub_808D2BC;
+ return FALSE;
+}
+
+static bool8 debug_sub_808D15C(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1712) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1712), gUnknown_Debug_083C1712);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1712), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 5;
+ gMenuCallback = debug_sub_808D2BC;
+ return FALSE;
+}
+
+static bool8 debug_sub_808D1B4(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C17F8) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C17F8), gUnknown_Debug_083C17F8);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C17F8), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 6;
+ gMenuCallback = debug_sub_808D2BC;
+ return FALSE;
+}
+
+static bool8 debug_sub_808D20C(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * 7 + 1);
+ Menu_PrintItems(2, 1, 7, gUnknown_Debug_083C18B8);
+ InitMenu(0, 1, 1, 7, 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 7;
+ gMenuCallback = debug_sub_808D2BC;
+ return FALSE;
+}
+
+static bool8 debug_sub_808D264(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * 5 + 1);
+ Menu_PrintItems(2, 1, 5, gDebug_0x83C1974);
+ InitMenu(0, 1, 1, 5, 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 8;
+ gMenuCallback = debug_sub_808D2BC;
+ return FALSE;
+}
+
+static bool8 debug_sub_808D2BC(void)
+{
+ s8 input = Menu_ProcessInput();
+ s8 cursorPos = Menu_GetCursorPos();
+
+ debug_sub_808D308(sFlagAndVarTest_WhichSubmenu, cursorPos);
+ debug_sub_808D358(sFlagAndVarTest_WhichSubmenu);
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void debug_sub_808D308(u8 whichMenu, u8 cursorPos)
+{
+ if (gMain.newKeys & R_BUTTON)
+ {
+ if (!FlagGet(gUnknown_Debug_083C19C6[whichMenu][cursorPos]))
+ FlagSet(gUnknown_Debug_083C19C6[whichMenu][cursorPos]);
+ else
+ FlagClear(gUnknown_Debug_083C19C6[whichMenu][cursorPos]);
+ }
+}
+
+static void debug_sub_808D358(u8 whichMenu)
+{
+ u8 i;
+
+ for (i = 0; i < gUnknown_Debug_083C19BC[whichMenu]; i++)
+ {
+ PrintBool(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C19C6[whichMenu][i]) ? 1 : 0);
+ }
+}
+
+static bool8 ControlFlags_FH_OBJ_InitSubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 28, 2 * ARRAY_COUNT(sMenuActions_ControlFlags_FH_OBJ) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_ControlFlags_FH_OBJ), sMenuActions_ControlFlags_FH_OBJ);
+ InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_ControlFlags_FH_OBJ), 0, 27);
+ gMenuCallback = ControlFlags_FH_OBJ_HandleInput;
+ return FALSE;
+}
+
+static bool8 ControlFlags_FH_OBJ_HandleInput(void)
+{
+ s8 input = Menu_ProcessInput();
+
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ gMenuCallback = sMenuActions_ControlFlags_FH_OBJ[input].func;
+ return FALSE;
+}
+
+static bool8 ControlFlags_FH_OBJ00_08_InitSubsubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(sMenuActions_ControlFlags_FH_OBJ00_08) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_ControlFlags_FH_OBJ00_08), sMenuActions_ControlFlags_FH_OBJ00_08);
+ InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_ControlFlags_FH_OBJ00_08), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 0;
+ gMenuCallback = ControlFlags_FH_OBJ_Subsubmenu_HandleInput;
+ return FALSE;
+}
+
+static bool8 ControlFlags_FH_OBJ09_15_InitSubsubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * 7 + 1);
+ Menu_PrintItems(2, 1, 7, sMenuActions_ControlFlags_FH_OBJ09_15);
+ InitMenu(0, 1, 1, 7, 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 1;
+ gMenuCallback = ControlFlags_FH_OBJ_Subsubmenu_HandleInput;
+ return FALSE;
+}
+
+static bool8 ControlFlags_FH_OBJ_Subsubmenu_HandleInput(void)
+{
+ s8 input = Menu_ProcessInput();
+ s8 cursorPos = Menu_GetCursorPos();
+
+ ControlFlags_FH_OBJ_FlagToggle(sFlagAndVarTest_WhichSubmenu, cursorPos);
+ ControlFlags_FH_OBJ_UpdateDisplay(sFlagAndVarTest_WhichSubmenu);
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void ControlFlags_FH_OBJ_FlagToggle(u8 whichMenu, u8 cursorPos)
+{
+ if (gMain.newKeys & R_BUTTON)
+ {
+ if (!FlagGet(sControlFlags_FH_OBJ_FlagsArrays[whichMenu][cursorPos]))
+ FlagSet(sControlFlags_FH_OBJ_FlagsArrays[whichMenu][cursorPos]);
+ else
+ FlagClear(sControlFlags_FH_OBJ_FlagsArrays[whichMenu][cursorPos]);
+ }
+}
+
+static void ControlFlags_FH_OBJ_UpdateDisplay(u8 whichMenu)
+{
+ u8 i;
+
+ for (i = 0; i < sControlFlags_FH_OBJ_CountsArray[whichMenu]; i++)
+ {
+ PrintBool(28, 2 * i + 1, FlagGet(sControlFlags_FH_OBJ_FlagsArrays[whichMenu][i]) ? 1 : 0);
+ }
+}
+
+static bool8 ControlFlags_FH_InitSubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 28, 2 * ARRAY_COUNT(gUnknown_Debug_083C11CC) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C11CC), gUnknown_Debug_083C11CC);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C11CC), 0, 27);
+ gMenuCallback = debug_sub_808D650;
+ return FALSE;
+}
+
+static bool8 debug_sub_808D650(void)
+{
+ s8 input = Menu_ProcessInput();
+
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ gMenuCallback = gUnknown_Debug_083C11CC[input].func;
+ return FALSE;
+}
+
+static bool8 debug_sub_808D694(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1212) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1212), gUnknown_Debug_083C1212);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1212), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 0;
+ gMenuCallback = debug_sub_808D744;
+ return FALSE;
+}
+
+static bool8 debug_sub_808D6EC(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * 7 + 1);
+ Menu_PrintItems(2, 1, 7, gUnknown_Debug_083C1288);
+ InitMenu(0, 1, 1, 7, 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 1;
+ gMenuCallback = debug_sub_808D744;
+ return FALSE;
+}
+
+static bool8 debug_sub_808D744(void)
+{
+ s8 input = Menu_ProcessInput();
+ s8 cursorPos = Menu_GetCursorPos();
+
+ debug_sub_808D790(sFlagAndVarTest_WhichSubmenu, cursorPos);
+ debug_sub_808D7E0(sFlagAndVarTest_WhichSubmenu);
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void debug_sub_808D790(u8 whichMenu, u8 cursorPos)
+{
+ if (gMain.newKeys & R_BUTTON)
+ {
+ if (!FlagGet(gUnknown_Debug_083C12D2[whichMenu][cursorPos]))
+ FlagSet(gUnknown_Debug_083C12D2[whichMenu][cursorPos]);
+ else
+ FlagClear(gUnknown_Debug_083C12D2[whichMenu][cursorPos]);
+ }
+}
+
+static void debug_sub_808D7E0(u8 whichMenu)
+{
+ u8 i;
+
+ for (i = 0; i < gUnknown_Debug_083C12D0[whichMenu]; i++)
+ {
+ PrintBool(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C12D2[whichMenu][i]) ? 1 : 0);
+ }
+}
+
+static bool8 ControlFlags_BallVanishFlag_InitSubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 28, 2 * ARRAY_COUNT(gUnknown_Debug_083C1A78) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1A78), gUnknown_Debug_083C1A78);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1A78), 0, 27);
+ gMenuCallback = debug_sub_808D894;
+ return FALSE;
+}
+
+static bool8 debug_sub_808D894(void)
+{
+ s8 input = Menu_ProcessInput();
+
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ gMenuCallback = gUnknown_Debug_083C1A78[input].func;
+ return FALSE;
+}
+
+static bool8 debug_sub_808D8D8(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C1A9C) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C1A9C), gUnknown_Debug_083C1A9C);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C1A9C), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 0;
+ gMenuCallback = debug_sub_808D930;
+ return FALSE;
+}
+
+static bool8 debug_sub_808D930(void)
+{
+ s8 input = Menu_ProcessInput();
+ s8 cursorPos = Menu_GetCursorPos();
+
+ debug_sub_808D97C(sFlagAndVarTest_WhichSubmenu, cursorPos);
+ debug_sub_808D9CC(sFlagAndVarTest_WhichSubmenu);
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void debug_sub_808D97C(u8 whichMenu, u8 cursorPos)
+{
+ if (gMain.newKeys & R_BUTTON)
+ {
+ if (!FlagGet(gUnknown_Debug_083C1AAE[whichMenu][cursorPos]))
+ FlagSet(gUnknown_Debug_083C1AAE[whichMenu][cursorPos]);
+ else
+ FlagClear(gUnknown_Debug_083C1AAE[whichMenu][cursorPos]);
+ }
+}
+
+static void debug_sub_808D9CC(u8 whichMenu)
+{
+ u8 i;
+
+ for (i = 0; i < gUnknown_Debug_083C1AAC[whichMenu]; i++)
+ {
+ PrintBool(28, 2 * i + 1, FlagGet(gUnknown_Debug_083C1AAE[whichMenu][i]) ? 1 : 0);
+ }
+}
+
+static bool8 ControlWorks_AnsWork_InitSubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(sMenuActions_ControlEvents_AnsWork) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_ControlEvents_AnsWork), sMenuActions_ControlEvents_AnsWork);
+ InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_ControlEvents_AnsWork), 0, 28);
+ gMenuCallback = ControlWorks_AnsWork_HandleInput;
+ return FALSE;
+}
+
+static bool8 ControlWorks_AnsWork_HandleInput(void)
+{
+ s8 input = Menu_ProcessInput();
+ /*s8 cursorPos = */Menu_GetCursorPos();
+
+ ControlWorks_AnsWork_AdjustRESULT();
+ ControlWorks_AnsWork_PrintRESULT();
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void ControlWorks_AnsWork_PrintRESULT(void)
+{
+ PrintUnsignedShort(24, 1, gSpecialVar_Result);
+}
+
+static void ControlWorks_AnsWork_AdjustRESULT(void)
+{
+ u16 delta;
+
+ if (gMain.newKeys & R_BUTTON)
+ {
+ delta = +1;
+ }
+ else if (gMain.newKeys & L_BUTTON)
+ {
+ delta = -1;
+ }
+ else
+ return;
+ gSpecialVar_Result += delta;
+}
+
+static bool8 ControlWorks_SaveWork_InitSubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 24, 2 * ARRAY_COUNT(sMenuAction_ControlWorks_SaveWork) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuAction_ControlWorks_SaveWork), sMenuAction_ControlWorks_SaveWork);
+ InitMenu(0, 1, 1, ARRAY_COUNT(sMenuAction_ControlWorks_SaveWork), 0, 23);
+ gMenuCallback = ControlWorks_SaveWork_HandleInput;
+ return FALSE;
+}
+
+static bool8 ControlWorks_SaveWork_HandleInput(void)
+{
+ s8 input = Menu_ProcessInput();
+
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ gMenuCallback = sMenuAction_ControlWorks_SaveWork[input].func;
+ return FALSE;
+}
+
+static bool8 ControlWorks_SaveWork_Town_InitSubsubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(sMenuActions_SaveWork_Town) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_SaveWork_Town), sMenuActions_SaveWork_Town);
+ InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_SaveWork_Town), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 0;
+ gMenuCallback = ControlWorks_SaveWork_Subsubmenu_HandleInput;
+ return FALSE;
+}
+
+static bool8 ControlWorks_SaveWork_City_InitSubsubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(sMenuActions_SaveWork_City) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_SaveWork_City), sMenuActions_SaveWork_City);
+ InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_SaveWork_City), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 1;
+ gMenuCallback = ControlWorks_SaveWork_Subsubmenu_HandleInput;
+ return FALSE;
+}
+
+static bool8 ControlWorks_SaveWork_Route101To109_InitSubsubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(sMenuActions_SaveWork_Route101To109) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_SaveWork_Route101To109), sMenuActions_SaveWork_Route101To109);
+ InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_SaveWork_Route101To109), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 2;
+ gMenuCallback = ControlWorks_SaveWork_Subsubmenu_HandleInput;
+ return FALSE;
+}
+
+static bool8 ControlWorks_SaveWork_Route110To118_InitSubsubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(sMenuActions_SaveWork_Route110To118) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_SaveWork_Route110To118), sMenuActions_SaveWork_Route110To118);
+ InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_SaveWork_Route110To118), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 3;
+ gMenuCallback = ControlWorks_SaveWork_Subsubmenu_HandleInput;
+ return FALSE;
+}
+
+static bool8 ControlWorks_SaveWork_Route119To127_InitSubsubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(sMenuActions_SaveWork_Route119To127) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_SaveWork_Route119To127), sMenuActions_SaveWork_Route119To127);
+ InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_SaveWork_Route119To127), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 4;
+ gMenuCallback = ControlWorks_SaveWork_Subsubmenu_HandleInput;
+ return FALSE;
+}
+
+static bool8 ControlWorks_SaveWork_Route128To134_InitSubsubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(sMenuActions_SaveWork_Route128To134) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_SaveWork_Route128To134), sMenuActions_SaveWork_Route128To134);
+ InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_SaveWork_Route128To134), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 5;
+ gMenuCallback = ControlWorks_SaveWork_Subsubmenu_HandleInput;
+ return FALSE;
+}
+
+static bool8 ControlWorks_SaveWork_RoomTown_InitSubsubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * 6 + 1);
+ Menu_PrintItems(2, 1, 6, sMenuActions_SaveWork_RoomTown); // overflows into the next menu
+ InitMenu(0, 1, 1, 6, 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 6;
+ gMenuCallback = ControlWorks_SaveWork_Subsubmenu_HandleInput;
+ return FALSE;
+}
+
+static bool8 ControlWorks_SaveWork_RoomCity_InitSubsubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(sMenuActions_SaveWork_RoomCity) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_SaveWork_RoomCity), sMenuActions_SaveWork_RoomCity);
+ InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_SaveWork_RoomCity), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 7;
+ gMenuCallback = ControlWorks_SaveWork_Subsubmenu_HandleInput;
+ return FALSE;
+}
+
+static bool8 ControlWorks_SaveWork_Dungeon_InitSubsubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(sMenuActions_SaveWork_Dungeon) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_SaveWork_Dungeon), sMenuActions_SaveWork_Dungeon);
+ InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_SaveWork_Dungeon), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 8;
+ gMenuCallback = ControlWorks_SaveWork_Subsubmenu_HandleInput;
+ return FALSE;
+}
+
+static bool8 ControlWorks_SaveWork_Subsubmenu_HandleInput(void)
+{
+ s8 input = Menu_ProcessInput();
+ s8 cursorPos = Menu_GetCursorPos();
+
+ debug_sub_808DF64(sFlagAndVarTest_WhichSubmenu, cursorPos);
+ debug_sub_808DF04(sFlagAndVarTest_WhichSubmenu);
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void debug_sub_808DF04(u8 whichMenu)
+{
+ u8 i;
+
+ for (i = 0; i < gUnknown_Debug_083C457C[whichMenu]; i++)
+ {
+ PrintUnsignedShort(24, 2 * i + 1, VarGet(gUnknown_Debug_083C4586[whichMenu][i]));
+ }
+}
+
+static void debug_sub_808DF64(u8 whichMenu, u8 cursorPos)
+{
+ u16 delta;
+
+ if (gMain.newKeys & R_BUTTON)
+ delta = +1;
+ else if (gMain.newKeys & L_BUTTON)
+ delta = -1;
+ else
+ return;
+ VarSet(gUnknown_Debug_083C4586[whichMenu][cursorPos], VarGet(gUnknown_Debug_083C4586[whichMenu][cursorPos]) + delta);
+}
+
+static bool8 ControlWorks_SaveWorkPart2_InitSubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 24, 2 * ARRAY_COUNT(sMenuActions_ControlWorks_SaveWorkPart2) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(sMenuActions_ControlWorks_SaveWorkPart2), sMenuActions_ControlWorks_SaveWorkPart2);
+ InitMenu(0, 1, 1, ARRAY_COUNT(sMenuActions_ControlWorks_SaveWorkPart2), 0, 23);
+ gMenuCallback = ControlWorks_SaveWorkPart2_HandleInput;
+ return FALSE;
+}
+
+static bool8 ControlWorks_SaveWorkPart2_HandleInput(void)
+{
+ s8 input = Menu_ProcessInput();
+
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ gMenuCallback = sMenuActions_ControlWorks_SaveWorkPart2[input].func;
+ return FALSE;
+}
+
+static bool8 ControlWorks_SaveWorkPart2_SP_InitSubsubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * 6 + 1);
+ Menu_PrintItems(2, 1, 6, gUnknown_Debug_083C3AA0);
+ InitMenu(0, 1, 1, 6, 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 0;
+ gMenuCallback = debug_sub_808E264;
+ return FALSE;
+}
+
+static bool8 ControlWorks_SaveWorkPart2_RoomR110Part1TrickHouse_InitSubsubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * 5 + 1);
+ Menu_PrintItems(2, 1, 5, gUnknown_Debug_83C3AE0);
+ InitMenu(0, 1, 1, 5, 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 1;
+ gMenuCallback = debug_sub_808E264;
+ return FALSE;
+}
+
+static bool8 ControlWorks_SaveWorkPart2_RoomR110Part2_InitSubsubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_83C3B28) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_83C3B28), gUnknown_Debug_83C3B28);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_83C3B28), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 2;
+ gMenuCallback = debug_sub_808E264;
+ return FALSE;
+}
+
+static bool8 ControlWorks_SaveWorkPart2_RoomLoad_InitSubsubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * 2 + 1);
+ Menu_PrintItems(2, 1, 2, gUnknown_Debug_83C3B70);
+ InitMenu(0, 1, 1, 2, 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 3;
+ gMenuCallback = debug_sub_808E264;
+ return FALSE;
+}
+
+static bool8 debug_sub_808E1B4(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_83C3BB8) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_83C3BB8), gUnknown_Debug_83C3BB8);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_83C3BB8), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 4;
+ gMenuCallback = debug_sub_808E264;
+ return FALSE;
+}
+
+static bool8 debug_sub_808E20C(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * 6 + 1);
+ Menu_PrintItems(2, 1, 6, gUnknown_Debug_83C3C00);
+ InitMenu(0, 1, 1, 6, 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 5;
+ gMenuCallback = debug_sub_808E264;
+ return FALSE;
+}
+
+static bool8 debug_sub_808E264(void)
+{
+ s8 input = Menu_ProcessInput();
+ s8 cursorPos = Menu_GetCursorPos();
+
+ debug_sub_808E310(sFlagAndVarTest_WhichSubmenu, cursorPos);
+ debug_sub_808E2B0(sFlagAndVarTest_WhichSubmenu);
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void debug_sub_808E2B0(u8 whichMenu)
+{
+ u8 i;
+
+ for (i = 0; i < sControlWorks_SaveWork_CountsArray[whichMenu]; i++)
+ {
+ PrintUnsignedShort(24, 2 * i + 1, VarGet(sControlWorks_SaveWork_ItemArrays[whichMenu][i]));
+ }
+}
+
+static void debug_sub_808E310(u8 whichMenu, u8 cursorPos)
+{
+ u16 delta;
+
+ if (gMain.newKeys & R_BUTTON)
+ delta = +1;
+ else if (gMain.newKeys & L_BUTTON)
+ delta = -1;
+ else
+ return;
+ VarSet(sControlWorks_SaveWork_ItemArrays[whichMenu][cursorPos], VarGet(sControlWorks_SaveWork_ItemArrays[whichMenu][cursorPos]) + delta);
+}
+
+static bool8 ControlWorks_SysWork_InitSubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 24, 2 * ARRAY_COUNT(gUnknown_Debug_083C32AC) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C32AC), gUnknown_Debug_083C32AC);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C32AC), 0, 23);
+ gMenuCallback = debug_sub_808E3BC;
+ return FALSE;
+}
+
+static bool8 debug_sub_808E3BC(void)
+{
+ s8 input = Menu_ProcessInput();
+
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ gMenuCallback = gUnknown_Debug_083C32AC[input].func;
+ return FALSE;
+}
+
+static bool8 debug_sub_808E400(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C347C) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C347C), gUnknown_Debug_083C347C);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C347C), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 0;
+ gMenuCallback = debug_sub_808E5B8;
+ return FALSE;
+}
+
+static bool8 debug_sub_808E458(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C3494) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C3494), gUnknown_Debug_083C3494);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C3494), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 1;
+ gMenuCallback = debug_sub_808E5B8;
+ return FALSE;
+}
+
+static bool8 debug_sub_808E4B0(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C34A4) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C34A4), gUnknown_Debug_083C34A4);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C34A4), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 2;
+ gMenuCallback = debug_sub_808E5B8;
+ return FALSE;
+}
+
+static bool8 debug_sub_808E508(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C34D4) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C34D4), gUnknown_Debug_083C34D4);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C34D4), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 3;
+ gMenuCallback = debug_sub_808E5B8;
+ return FALSE;
+}
+
+static bool8 debug_sub_808E560(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C351C) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C351C), gUnknown_Debug_083C351C);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C351C), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 4;
+ gMenuCallback = debug_sub_808E5B8;
+ return FALSE;
+}
+
+static bool8 debug_sub_808E5B8(void)
+{
+ s8 input = Menu_ProcessInput();
+ s8 cursorPos = Menu_GetCursorPos();
+
+ debug_sub_808E604(sFlagAndVarTest_WhichSubmenu, cursorPos);
+ debug_sub_808E660(sFlagAndVarTest_WhichSubmenu);
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void debug_sub_808E604(u8 whichMenu, u8 cursorPos)
+{
+ u16 delta;
+
+ if (gMain.newAndRepeatedKeys & R_BUTTON)
+ delta = +1;
+ else if (gMain.newAndRepeatedKeys & L_BUTTON)
+ delta = -1;
+ else
+ return;
+ VarSet(gUnknown_Debug_083C354A[whichMenu][cursorPos], VarGet(gUnknown_Debug_083C354A[whichMenu][cursorPos]) + delta);
+}
+
+static void debug_sub_808E660(u8 whichMenu)
+{
+ u8 i;
+
+ for (i = 0; i < gUnknown_Debug_083C3544[whichMenu]; i++)
+ {
+ PrintUnsignedShort(24, 2 * i + 1, VarGet(gUnknown_Debug_083C354A[whichMenu][i]));
+ }
+}
+
+static bool8 ControlWorks_LocalWork_InitSubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 24, 2 * ARRAY_COUNT(gUnknown_Debug_083C4644) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C4644), gUnknown_Debug_083C4644);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C4644), 0, 23);
+ gMenuCallback = debug_sub_808E710;
+ return FALSE;
+}
+
+static bool8 debug_sub_808E710(void)
+{
+ s8 input = Menu_ProcessInput();
+
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ gMenuCallback = gUnknown_Debug_083C4644[input].func;
+ return FALSE;
+}
+
+static bool8 debug_sub_808E754(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C470C) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C470C), gUnknown_Debug_083C470C);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C470C), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 0;
+ gMenuCallback = debug_sub_808E804;
+ return FALSE;
+}
+
+static bool8 debug_sub_808E7AC(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C4754C) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C4754C), gUnknown_Debug_083C4754C);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C4754C), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 1;
+ gMenuCallback = debug_sub_808E804;
+ return FALSE;
+}
+
+static bool8 debug_sub_808E804(void)
+{
+ s8 input = Menu_ProcessInput();
+ s8 cursorPos = Menu_GetCursorPos();
+
+ debug_sub_808E850(sFlagAndVarTest_WhichSubmenu, cursorPos);
+ debug_sub_808E8AC(sFlagAndVarTest_WhichSubmenu);
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void debug_sub_808E850(u8 whichMenu, u8 cursorPos)
+{
+ u16 delta;
+
+ if (gMain.newKeys & R_BUTTON)
+ delta = +1;
+ else if (gMain.newKeys & L_BUTTON)
+ delta = -1;
+ else
+ return;
+ VarSet(gUnknown_Debug_083C478E[whichMenu][cursorPos], VarGet(gUnknown_Debug_083C478E[whichMenu][cursorPos]) + delta);
+}
+
+static void debug_sub_808E8AC(u8 whichMenu)
+{
+ u8 i;
+
+ for (i = 0; i < gUnknown_Debug_083C478C[whichMenu]; i++)
+ {
+ PrintUnsignedShort(24, 2 * i + 1, VarGet(gUnknown_Debug_083C478E[whichMenu][i]));
+ }
+}
+
+static bool8 ControlWorks_ObjWork_InitSubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 24, 2 * ARRAY_COUNT(gUnknown_Debug_083C35C4) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C35C4), gUnknown_Debug_083C35C4);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C35C4), 0, 23);
+ gMenuCallback = debug_sub_808E95C;
+ return FALSE;
+}
+
+static bool8 debug_sub_808E95C(void)
+{
+ s8 input = Menu_ProcessInput();
+
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ gMenuCallback = gUnknown_Debug_083C35C4[input].func;
+ return FALSE;
+}
+
+static bool8 debug_sub_808E9A0(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C369C) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C369C), gUnknown_Debug_083C369C);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C369C), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 0;
+ gMenuCallback = debug_sub_808EA50;
+ return FALSE;
+}
+
+static bool8 debug_sub_808E9F8(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 29, 2 * ARRAY_COUNT(gUnknown_Debug_083C36E4) + 1);
+ Menu_PrintItems(2, 1, ARRAY_COUNT(gUnknown_Debug_083C36E4), gUnknown_Debug_083C36E4);
+ InitMenu(0, 1, 1, ARRAY_COUNT(gUnknown_Debug_083C36E4), 0, 28);
+ sFlagAndVarTest_WhichSubmenu = 1;
+ gMenuCallback = debug_sub_808EA50;
+ return FALSE;
+}
+
+static bool8 debug_sub_808EA50(void)
+{
+ s8 input = Menu_ProcessInput();
+ s8 cursorPos = Menu_GetCursorPos();
+
+ debug_sub_808EAFC(sFlagAndVarTest_WhichSubmenu, cursorPos);
+ debug_sub_808EA9C(sFlagAndVarTest_WhichSubmenu);
+ if (input == -2)
+ return FALSE;
+ if (input == -1)
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void debug_sub_808EA9C(u8 whichMenu)
+{
+ u8 i;
+
+ for (i = 0; i < gUnknown_Debug_083C371C[whichMenu]; i++)
+ {
+ PrintUnsignedShort(24, 2 * i + 1, VarGet(gUnknown_Debug_083C371E[whichMenu][i]));
+ }
+}
+
+static void debug_sub_808EAFC(u8 whichMenu, u8 cursorPos)
+{
+ u16 delta;
+
+ if (gMain.newKeys & R_BUTTON)
+ delta = +1;
+ else if (gMain.newKeys & L_BUTTON)
+ delta = -1;
+ else
+ return;
+ VarSet(gUnknown_Debug_083C371E[whichMenu][cursorPos], VarGet(gUnknown_Debug_083C371E[whichMenu][cursorPos]) + delta);
+}
+
+static bool8 TrickRelated_Level_InitSubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 12, 2 * ARRAY_COUNT(gUnknown_Debug_083C47F0) + 3);
+ Menu_PrintText(gUnknown_Debug_083C47B2, 1, 1);
+ Menu_PrintItems(2, 3, ARRAY_COUNT(gUnknown_Debug_083C47F0), gUnknown_Debug_083C47F0);
+ InitMenu(0, 1, 3, ARRAY_COUNT(gUnknown_Debug_083C47F0), 0, 11);
+ gMenuCallback = debug_sub_808EC10;
+ return FALSE;
+}
+
+static bool8 TrickRelated_TrickMaster_InitSubmenu(void)
+{
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 13, 2 * ARRAY_COUNT(gUnknown_Debug_083C4888) + 3);
+ Menu_PrintText(gUnknown_Debug_083C4830, 1, 1);
+ Menu_PrintItems(2, 3, ARRAY_COUNT(gUnknown_Debug_083C4888), gUnknown_Debug_083C4888);
+ InitMenu(0, 1, 3, ARRAY_COUNT(gUnknown_Debug_083C4888), 0, 12);
+ gMenuCallback = debug_sub_808EC5C;
+ return FALSE;
+}
+
+static bool8 debug_sub_808EC10(void)
+{
+ s8 input = Menu_ProcessInput();
+ s8 cursorPos = Menu_GetCursorPos();
+
+ if (input == -2)
+ {
+ return FALSE;
+ }
+ if (input == -1)
+ {
+ return FALSE;
+ }
+ gSaveBlock1.vars[VAR_TRICK_HOUSE_ROOMS_COMPLETED - VARS_START] = cursorPos;
+ CloseMenu();
+ return TRUE;
+}
+
+static bool8 debug_sub_808EC5C(void)
+{
+ s8 input = Menu_ProcessInput();
+ s8 cursorPos = Menu_GetCursorPos();
+
+ if (input == -2)
+ {
+ return FALSE;
+ }
+ if (input == -1)
+ {
+ return FALSE;
+ }
+ VarSet(VAR_TRICK_HOUSE_ENTRANCE_STATE_3, cursorPos);
+ CloseMenu();
+ return TRUE;
+}
+
+static bool8 PreviewGraphics_Show(void)
+{
+ BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0);
+ gMenuCallback = debug_sub_808ECD0;
+ return FALSE;
+}
+
+static bool8 debug_sub_808ECD0(void)
+{
+ if (!UpdatePaletteFade())
+ {
+ CloseMenu();
+ PrepareDebugOverlayBeforeShowingContestPainting(2);
+ SetMainCallback2(CB2_ContestPainting);
+ gMain.savedCallback = debug_sub_808B868;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool8 DummyMenuAction(void)
+{
+ return FALSE;
+}
+
+static void PicTest_SelectPokemon(void)
+{
+ if (gMain.newAndRepeatedKeys & DPAD_LEFT)
+ {
+ if (sPicTest_Species != SPECIES_BULBASAUR)
+ sPicTest_Species--;
+ }
+ if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
+ {
+ if (sPicTest_Species != SPECIES_CHIMECHO)
+ sPicTest_Species++;
+ }
+ if (gMain.newAndRepeatedKeys & L_BUTTON)
+ {
+ if (sPicTest_Species >= SPECIES_BULBASAUR + 10)
+ sPicTest_Species -= 10;
+ else
+ sPicTest_Species = SPECIES_BULBASAUR;
+ }
+ if (gMain.newAndRepeatedKeys & R_BUTTON)
+ {
+ if (sPicTest_Species <= SPECIES_CHIMECHO - 10)
+ sPicTest_Species += 10;
+ else
+ sPicTest_Species = SPECIES_CHIMECHO;
+ }
+}
+
+static void PicTest_SelectPersonality(void)
+{
+ if (gMain.newAndRepeatedKeys & DPAD_LEFT)
+ {
+ if (sPicTest_Personality != 0)
+ sPicTest_Personality--;
+ }
+ if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
+ {
+ if (sPicTest_Personality != UINT32_MAX)
+ sPicTest_Personality++;
+ }
+ if (gMain.newAndRepeatedKeys & L_BUTTON)
+ {
+ if (sPicTest_Personality >= 0x10)
+ sPicTest_Personality -= 0x10;
+ else
+ sPicTest_Personality = 0;
+ }
+ if (gMain.newAndRepeatedKeys & R_BUTTON)
+ {
+ if (sPicTest_Personality <= UINT32_MAX - 0x10)
+ sPicTest_Personality += 0x10;
+ else
+ sPicTest_Personality = UINT32_MAX;
+ }
+ if ((gMain.newKeys & (L_BUTTON | R_BUTTON)) == (L_BUTTON | R_BUTTON))
+ {
+ sPicTest_Personality = UINT32_MAX;
+ }
+}
+
+static void ContestPicTest_SelectContestType(void)
+{
+ if (gMain.newAndRepeatedKeys & DPAD_LEFT)
+ {
+ if (sPicTest_ContestType != CONTEST_COOL + 1)
+ sPicTest_ContestType--;
+ }
+ if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
+ {
+ if (sPicTest_ContestType != CONTEST_TOUGH + 1)
+ sPicTest_ContestType++;
+ }
+ if (gMain.newAndRepeatedKeys & L_BUTTON)
+ sPicTest_ContestType = CONTEST_COOL + 1;
+ if (gMain.newAndRepeatedKeys & R_BUTTON)
+ sPicTest_ContestType = CONTEST_TOUGH + 1;
+}
+
+static void MuseumArtPicTest_SelectTitleType(void)
+{
+ if (gMain.newAndRepeatedKeys & DPAD_LEFT)
+ {
+ if (sPicTest_MuseumArtTitleType != 1)
+ sPicTest_MuseumArtTitleType--;
+ }
+ if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
+ {
+ if (sPicTest_MuseumArtTitleType != 15)
+ sPicTest_MuseumArtTitleType++;
+ }
+ if (gMain.newAndRepeatedKeys & L_BUTTON)
+ {
+ if (sPicTest_MuseumArtTitleType >= 11)
+ sPicTest_MuseumArtTitleType -= 10;
+ else
+ sPicTest_MuseumArtTitleType = 0; // Causes underflow when pressing left on the dpad shortly thereafter.
+ }
+ if (gMain.newAndRepeatedKeys & R_BUTTON)
+ {
+ if (sPicTest_MuseumArtTitleType <= 5)
+ sPicTest_MuseumArtTitleType += 10;
+ else
+ sPicTest_MuseumArtTitleType = 15;
+ }
+}
+
+static void PreviewPicTest_SelectType(void)
+{
+ if (gMain.newAndRepeatedKeys & DPAD_LEFT)
+ {
+ if (sPicTest_PreviewType != 1)
+ sPicTest_PreviewType--;
+ }
+ if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
+ {
+ if (sPicTest_PreviewType != 15)
+ sPicTest_PreviewType++;
+ }
+ if (gMain.newAndRepeatedKeys & L_BUTTON)
+ {
+ if (sPicTest_PreviewType >= 11)
+ sPicTest_PreviewType -= 10;
+ else
+ sPicTest_PreviewType = 0; // Causes underflow when pressing left on the dpad shortly thereafter.
+ }
+ if (gMain.newAndRepeatedKeys & R_BUTTON)
+ {
+ if (sPicTest_PreviewType <= 5)
+ sPicTest_PreviewType += 10;
+ else
+ sPicTest_PreviewType = 15;
+ }
+}
+
+#ifdef NONMATCHING
+static void PicTest_Redraw(u8 a0)
+{
+ u8 i;
+ u8 digit;
+ u16 species;
+
+ switch (a0)
+ {
+ case 0:
+ case 1:
+ case 2:
+ for (i = 0; i < 8; i++)
+ {
+ digit = (sPicTest_Personality >> (4 * (7 - i))) & 0xf;
+ if (digit < 10)
+ sPicTest_StringBuffer[i] = digit + CHAR_0;
+ else
+ sPicTest_StringBuffer[i] = digit + CHAR_A - 10;
+ }
+ sPicTest_StringBuffer[i] = EOS;
+ Menu_PrintText(sPicTest_StringBuffer, 12, 5);
+ break;
+ }
+ for (i = 0; i < POKEMON_NAME_LENGTH; i++)
+ {
+ sPicTest_StringBuffer[i + 1] = CHAR_SPACE;
+ }
+
+ for (i = 0, species = sPicTest_Species; gSpeciesNames[species][i] != EOS && i < POKEMON_NAME_LENGTH; i++)
+ {
+ sPicTest_StringBuffer[i + 1] = gSpeciesNames[species][i];
+ }
+
+ sPicTest_StringBuffer[0] = 0xB1;
+ sPicTest_StringBuffer[POKEMON_NAME_LENGTH + 1] = 0xB2;
+ sPicTest_StringBuffer[POKEMON_NAME_LENGTH + 2] = EOS;
+ switch (a0)
+ {
+ case 0:
+ case 1:
+ case 2:
+ Menu_PrintText(sPicTest_StringBuffer, 8, 1);
+ break;
+ default:
+ Menu_PrintText(sPicTest_StringBuffer, 12, 1);
+ break;
+ }
+ sPicTest_StringBuffer[3] = EOS;
+ sPicTest_StringBuffer[0] = sPicTest_Species / 100 + CHAR_0;
+ sPicTest_StringBuffer[1] = (sPicTest_Species % 100) / 10 + CHAR_0;
+ sPicTest_StringBuffer[2] = sPicTest_Species % 10 + CHAR_0;
+ Menu_PrintText(sPicTest_StringBuffer, 12, 3);
+
+ switch (a0)
+ {
+ case 0:
+ sPicTest_StringBuffer[0] = sPicTest_ContestType / 100 + CHAR_0;
+ sPicTest_StringBuffer[1] = (sPicTest_ContestType % 100) / 10 + CHAR_0;
+ sPicTest_StringBuffer[2] = sPicTest_ContestType % 10 + CHAR_0;
+ Menu_PrintText(sPicTest_StringBuffer, 12, 7);
+ break;
+ case 1:
+ sPicTest_StringBuffer[0] = sPicTest_MuseumArtTitleType / 100 + CHAR_0;
+ sPicTest_StringBuffer[1] = (sPicTest_MuseumArtTitleType % 100) / 10 + CHAR_0;
+ sPicTest_StringBuffer[2] = sPicTest_MuseumArtTitleType % 10 + CHAR_0;
+ Menu_PrintText(sPicTest_StringBuffer, 12, 7);
+ break;
+ case 2:
+ sPicTest_StringBuffer[0] = sPicTest_PreviewType / 100 + CHAR_0;
+ sPicTest_StringBuffer[1] = (sPicTest_PreviewType % 100) / 10 + CHAR_0;
+ sPicTest_StringBuffer[2] = sPicTest_PreviewType % 10 + CHAR_0;
+ Menu_PrintText(sPicTest_StringBuffer, 12, 7);
+ break;
+ }
+}
+#else
+__attribute__((naked)) void PicTest_Redraw(u8 a0)
+{
+ asm("\tpush\t{r4, r5, r6, r7, lr}\n"
+ "\tmov\tr7, r8\n"
+ "\tpush\t{r7}\n"
+ "\tlsl\tr0, r0, #0x18\n"
+ "\tlsr\tr6, r0, #0x18\n"
+ "\tcmp\tr6, #0x2\n"
+ "\tbgt\t._653\t@cond_branch\n"
+ "\tcmp\tr6, #0\n"
+ "\tblt\t._653\t@cond_branch\n"
+ "\tmov\tr3, #0x0\n"
+ "\tldr\tr0, ._656 @ sPicTest_Personality\n"
+ "\tmov\tr8, r0\n"
+ "\tldr\tr4, ._656 + 4 @ sPicTest_StringBuffer\n"
+ "\tmov\tr7, #0x7\n"
+ "\tmov\tr5, #0xf\n"
+ "._658:\n"
+ "\tsub\tr0, r7, r3\n"
+ "\tlsl\tr0, r0, #0x2\n"
+ "\tmov\tr1, r8\n"
+ "\tldr\tr2, [r1]\n"
+ "\tLSR\tr2, r0\n"
+ "\tand\tr2, r2, r5\n"
+ "\tcmp\tr2, #0x9\n"
+ "\tbhi\t._654\t@cond_branch\n"
+ "\tadd\tr1, r3, r4\n"
+ "\tadd\tr0, r2, #0\n"
+ "\tadd\tr0, r0, #0xa1\n"
+ "\tb\t._655\n"
+ "._657:\n"
+ "\t.align\t2, 0\n"
+ "._656:\n"
+ "\t.word\tsPicTest_Personality\n"
+ "\t.word\tsPicTest_StringBuffer\n"
+ "._654:\n"
+ "\tadd\tr1, r3, r4\n"
+ "\tadd\tr0, r2, #0\n"
+ "\tsub\tr0, r0, #0x4f\n"
+ "._655:\n"
+ "\tstrb\tr0, [r1]\n"
+ "\tadd\tr0, r3, #1\n"
+ "\tlsl\tr0, r0, #0x18\n"
+ "\tlsr\tr3, r0, #0x18\n"
+ "\tcmp\tr3, #0x7\n"
+ "\tbls\t._658\t@cond_branch\n"
+ "\tldr\tr0, ._666 @ sPicTest_StringBuffer\n"
+ "\tmov\tr1, #0xff\n"
+ "\tstrb\tr1, [r0, #0x8]\n"
+ "\tmov\tr1, #0xc\n"
+ "\tmov\tr2, #0x5\n"
+ "\tbl\tMenu_PrintText\n"
+ "._653:\n"
+ "\tmov\tr3, #0x0\n"
+ "\tldr\tr7, ._666 @ sPicTest_StringBuffer\n"
+ "\tldr\tr5, ._666 + 4 @ sPicTest_Species\n"
+ "\tldr\tr2, ._666 + 8 @ gSpeciesNames\n"
+ "\tmov\tr8, r2\n"
+ "\tadd\tr4, r7, #0\n"
+ "\tmov\tr2, #0x0\n"
+ "._659:\n"
+ "\tadd\tr1, r3, #1\n"
+ "\tadd\tr0, r1, r4\n"
+ "\tstrb\tr2, [r0]\n"
+ "\tlsl\tr1, r1, #0x18\n"
+ "\tlsr\tr3, r1, #0x18\n"
+ "\tcmp\tr3, #0x9\n"
+ "\tbls\t._659\t@cond_branch\n"
+ "\tmov\tr3, #0x0\n"
+ "\tldrh\tr2, [r5]\n"
+ "\tmov\tr0, #0xb\n"
+ "\tadd\tr1, r2, #0\n"
+ "\tmul\tr1, r1, r0\n"
+ "\tmov\tr2, r8\n"
+ "\tadd\tr0, r1, r2\n"
+ "\tldrb\tr0, [r0]\n"
+ "\tcmp\tr0, #0xff\n"
+ "\tbeq\t._661\t@cond_branch\n"
+ "\tldr\tr0, ._666 @ sPicTest_StringBuffer\n"
+ "\tmov\tip, r0\n"
+ "\tmov\tr5, r8\n"
+ "\tadd\tr4, r1, #0\n"
+ "._662:\n"
+ "\tadd\tr1, r3, #1\n"
+ "\tmov\tr0, ip\n"
+ "\tadd\tr2, r1, r0\n"
+ "\tadd\tr0, r3, r4\n"
+ "\tadd\tr0, r0, r5\n"
+ "\tldrb\tr0, [r0]\n"
+ "\tstrb\tr0, [r2]\n"
+ "\tlsl\tr1, r1, #0x18\n"
+ "\tlsr\tr3, r1, #0x18\n"
+ "\tadd\tr0, r3, r4\n"
+ "\tadd\tr0, r0, r5\n"
+ "\tldrb\tr0, [r0]\n"
+ "\tcmp\tr0, #0xff\n"
+ "\tbeq\t._661\t@cond_branch\n"
+ "\tcmp\tr3, #0x9\n"
+ "\tbls\t._662\t@cond_branch\n"
+ "._661:\n"
+ "\tmov\tr0, #0xb1\n"
+ "\tstrb\tr0, [r7]\n"
+ "\tmov\tr0, #0xb2\n"
+ "\tstrb\tr0, [r7, #0xb]\n"
+ "\tmov\tr0, #0xff\n"
+ "\tstrb\tr0, [r7, #0xc]\n"
+ "\tcmp\tr6, #0x2\n"
+ "\tbgt\t._664\t@cond_branch\n"
+ "\tcmp\tr6, #0\n"
+ "\tblt\t._664\t@cond_branch\n"
+ "\tadd\tr0, r7, #0\n"
+ "\tmov\tr1, #0x8\n"
+ "\tmov\tr2, #0x1\n"
+ "\tbl\tMenu_PrintText\n"
+ "\tb\t._665\n"
+ "._667:\n"
+ "\t.align\t2, 0\n"
+ "._666:\n"
+ "\t.word\tsPicTest_StringBuffer\n"
+ "\t.word\tsPicTest_Species\n"
+ "\t.word\tgSpeciesNames\n"
+ "._664:\n"
+ "\tldr\tr0, ._672 @ sPicTest_StringBuffer\n"
+ "\tmov\tr1, #0xc\n"
+ "\tmov\tr2, #0x1\n"
+ "\tbl\tMenu_PrintText\n"
+ "._665:\n"
+ "\tldr\tr5, ._672 @ sPicTest_StringBuffer\n"
+ "\tmov\tr0, #0xff\n"
+ "\tstrb\tr0, [r5, #0x3]\n"
+ "\tldr\tr4, ._672 + 4 @ sPicTest_Species\n"
+ "\tldrh\tr0, [r4]\n"
+ "\tmov\tr1, #0x64\n"
+ "\tbl\t__udivsi3\n"
+ "\tadd\tr0, r0, #0xa1\n"
+ "\tstrb\tr0, [r5]\n"
+ "\tldrh\tr0, [r4]\n"
+ "\tmov\tr1, #0x64\n"
+ "\tbl\t__umodsi3\n"
+ "\tlsl\tr0, r0, #0x10\n"
+ "\tlsr\tr0, r0, #0x10\n"
+ "\tmov\tr1, #0xa\n"
+ "\tbl\t__udivsi3\n"
+ "\tadd\tr0, r0, #0xa1\n"
+ "\tstrb\tr0, [r5, #0x1]\n"
+ "\tldrh\tr0, [r4]\n"
+ "\tmov\tr1, #0xa\n"
+ "\tbl\t__umodsi3\n"
+ "\tadd\tr0, r0, #0xa1\n"
+ "\tstrb\tr0, [r5, #0x2]\n"
+ "\tadd\tr0, r5, #0\n"
+ "\tmov\tr1, #0xc\n"
+ "\tmov\tr2, #0x3\n"
+ "\tbl\tMenu_PrintText\n"
+ "\tcmp\tr6, #0x1\n"
+ "\tbeq\t._668\t@cond_branch\n"
+ "\tcmp\tr6, #0x1\n"
+ "\tbgt\t._669\t@cond_branch\n"
+ "\tcmp\tr6, #0\n"
+ "\tbeq\t._670\t@cond_branch\n"
+ "\tb\t._679\n"
+ "._673:\n"
+ "\t.align\t2, 0\n"
+ "._672:\n"
+ "\t.word\tsPicTest_StringBuffer\n"
+ "\t.word\tsPicTest_Species\n"
+ "._669:\n"
+ "\tcmp\tr6, #0x2\n"
+ "\tbeq\t._674\t@cond_branch\n"
+ "\tb\t._679\n"
+ "._670:\n"
+ "\tldr\tr4, ._677 @ sPicTest_ContestType\n"
+ "\tb\t._676\n"
+ "._678:\n"
+ "\t.align\t2, 0\n"
+ "._677:\n"
+ "\t.word\tsPicTest_ContestType\n"
+ "._668:\n"
+ "\tldr\tr4, ._680 @ sPicTest_MuseumArtTitleType\n"
+ "._676:\n"
+ "\tldrb\tr0, [r4]\n"
+ "\tmov\tr1, #0x64\n"
+ "\tbl\t__udivsi3\n"
+ "\tadd\tr0, r0, #0xa1\n"
+ "\tstrb\tr0, [r5]\n"
+ "\tldrb\tr0, [r4]\n"
+ "\tmov\tr1, #0x64\n"
+ "\tbl\t__umodsi3\n"
+ "\tlsl\tr0, r0, #0x18\n"
+ "\tlsr\tr0, r0, #0x18\n"
+ "\tmov\tr1, #0xa\n"
+ "\tbl\t__udivsi3\n"
+ "\tadd\tr0, r0, #0xa1\n"
+ "\tstrb\tr0, [r5, #0x1]\n"
+ "\tldrb\tr0, [r4]\n"
+ "\tmov\tr1, #0xa\n"
+ "\tbl\t__umodsi3\n"
+ "\tadd\tr0, r0, #0xa1\n"
+ "\tstrb\tr0, [r5, #0x2]\n"
+ "\tadd\tr0, r5, #0\n"
+ "\tmov\tr1, #0xc\n"
+ "\tmov\tr2, #0x7\n"
+ "\tbl\tMenu_PrintText\n"
+ "\tb\t._679\n"
+ "._681:\n"
+ "\t.align\t2, 0\n"
+ "._680:\n"
+ "\t.word\tsPicTest_MuseumArtTitleType\n"
+ "._674:\n"
+ "\tldr\tr4, ._682 @ sPicTest_PreviewType\n"
+ "\tldrb\tr0, [r4]\n"
+ "\tmov\tr1, #0x64\n"
+ "\tbl\t__udivsi3\n"
+ "\tadd\tr0, r0, #0xa1\n"
+ "\tstrb\tr0, [r5]\n"
+ "\tldrb\tr0, [r4]\n"
+ "\tmov\tr1, #0x64\n"
+ "\tbl\t__umodsi3\n"
+ "\tlsl\tr0, r0, #0x18\n"
+ "\tlsr\tr0, r0, #0x18\n"
+ "\tmov\tr1, #0xa\n"
+ "\tbl\t__udivsi3\n"
+ "\tadd\tr0, r0, #0xa1\n"
+ "\tstrb\tr0, [r5, #0x1]\n"
+ "\tldrb\tr0, [r4]\n"
+ "\tmov\tr1, #0xa\n"
+ "\tbl\t__umodsi3\n"
+ "\tadd\tr0, r0, #0xa1\n"
+ "\tstrb\tr0, [r5, #0x2]\n"
+ "\tadd\tr0, r5, #0\n"
+ "\tmov\tr1, #0xc\n"
+ "\tmov\tr2, #0x7\n"
+ "\tbl\tMenu_PrintText\n"
+ "._679:\n"
+ "\tpop\t{r3}\n"
+ "\tmov\tr8, r3\n"
+ "\tpop\t{r4, r5, r6, r7}\n"
+ "\tpop\t{r0}\n"
+ "\tbx\tr0\n"
+ "._683:\n"
+ "\t.align\t2, 0\n"
+ "._682:\n"
+ "\t.word\tsPicTest_PreviewType");
+}
+#endif // NONMATCHING
+
+static void PrepareDebugOverlayBeforeShowingContestPainting(u8 a0)
+{
+ struct ContestEntry *contestEntry = &ewram15DE0;
+ contestEntry->species = sPicTest_Species;
+ contestEntry->otId = sPicTest_OTID;
+ contestEntry->personality = sPicTest_Personality;
+ switch (a0)
+ {
+ case 0:
+ ewram15DDF = 0;
+ ewram15DDE = 0;
+ contestEntry->contestType = sPicTest_ContestType - 1;
+ StringCopy(contestEntry->trainer_name, sDummyTrainerName);
+ StringCopy(contestEntry->pokemon_name, sDummyNickname);
+ break;
+ case 1:
+ ewram15DDF = 0;
+ ewram15DDE = 8;
+ contestEntry->contestType = sPicTest_MuseumArtTitleType - 1;
+ StringCopy(contestEntry->pokemon_name, sDummyNickname);
+ break;
+ case 2:
+ ewram15DDF = 1;
+ ewram15DDE = 8;
+ contestEntry->contestType = sPicTest_PreviewType - 1;
+ break;
+ case 3:
+ ewram15DDF = 0;
+ ewram15DDE = 8;
+ contestEntry->contestType = 0;
+ StringCopy(contestEntry->pokemon_name, sDummyNickname);
+ break;
+ case 4:
+ ewram15DDF = 0;
+ ewram15DDE = 8;
+ contestEntry->contestType = 3;
+ StringCopy(contestEntry->pokemon_name, sDummyNickname);
+ break;
+ case 5:
+ ewram15DDF = 0;
+ ewram15DDE = 8;
+ contestEntry->contestType = 9;
+ StringCopy(contestEntry->pokemon_name, sDummyNickname);
+ break;
+ }
+}
+
+static void PrintBool(u8 a0, u8 a1, bool8 a2)
+{
+ if (a2 == FALSE)
+ sPicTest_StringBuffer[0] = CHAR_0;
+ else
+ sPicTest_StringBuffer[0] = CHAR_0 + 1;
+ sPicTest_StringBuffer[1] = EOS;
+ Menu_PrintText(sPicTest_StringBuffer, a0, a1);
+}
+
+static void PrintUnsignedShort(u8 a0, u8 a1, u16 a2)
+{
+ sPicTest_StringBuffer[0] = a2 / 10000 + CHAR_0;
+ sPicTest_StringBuffer[1] = (a2 % 10000) / 1000 + CHAR_0;
+ sPicTest_StringBuffer[2] = (a2 % 1000) / 100 + CHAR_0;
+ sPicTest_StringBuffer[3] = (a2 % 100) / 10 + CHAR_0;
+ sPicTest_StringBuffer[4] = a2 % 10 + CHAR_0;
+ sPicTest_StringBuffer[5] = EOS;
+ Menu_PrintText(sPicTest_StringBuffer, a0, a1);
+}
+
+void debug_nullsub_66(void)
+{
+// This function likely serves as the entry point into this file.
+}
+
+#endif // DEBUG
diff --git a/src/debug/watanabe_debug_menu.c b/src/debug/watanabe_debug_menu.c
new file mode 100644
index 000000000..6c94b0466
--- /dev/null
+++ b/src/debug/watanabe_debug_menu.c
@@ -0,0 +1,11 @@
+#if DEBUG
+#include "global.h"
+
+EWRAM_DATA u8 gUnknown_Debug_20389EC[0x20] = { 0 };
+EWRAM_DATA u8 gUnknown_Debug_2038A0C[0x10] = { 0 };
+EWRAM_DATA u8 gUnknown_Debug_2038A1C[4] = { 0 };
+EWRAM_DATA u8 gUnknown_Debug_2038A20[4] = { 0 };
+
+u8 byte_3005E30[0x20];
+
+#endif
diff --git a/src/engine/decompress.c b/src/decompress.c
index 69edf01aa..69edf01aa 100644
--- a/src/engine/decompress.c
+++ b/src/decompress.c
diff --git a/src/field/decoration.c b/src/decoration.c
index e1604cfa1..477414993 100644
--- a/src/field/decoration.c
+++ b/src/decoration.c
@@ -622,7 +622,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[] = {
@@ -1392,7 +1392,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[] = {
@@ -2239,7 +2239,7 @@ void sub_80FF5BC(u8 taskId)
{
if (sub_80FF58C() == TRUE)
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = sub_80FF6AC;
} else
@@ -2289,7 +2289,7 @@ void sub_80FF6AC(u8 taskId)
gTasks[taskId].data[2] = 2;
break;
case 2:
- if (sub_807D770() == 1)
+ if (IsWeatherNotFadingIn() == TRUE)
{
gTasks[taskId].data[12] = 0;
sub_810065C(taskId);
@@ -3193,7 +3193,7 @@ void sub_810026C(u8 taskId)
void sub_810028C(u8 taskId)
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = c1_overworld_prev_quest;
}
@@ -3222,7 +3222,7 @@ void c1_overworld_prev_quest(u8 taskId)
void sub_8100334(u8 taskId)
{
- if (sub_807D770() == 1)
+ if (IsWeatherNotFadingIn() == TRUE)
{
gTasks[taskId].func = sub_80FE948;
}
@@ -3629,7 +3629,7 @@ void sub_8100A0C(u8 taskId)
{
if (sub_8100D38(taskId) == 1)
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = sub_8100E70;
} else
@@ -3735,7 +3735,7 @@ void sub_8100C88(u8 taskId)
gTasks[taskId].data[2] = 3;
break;
case 3:
- if (sub_807D770() == 1)
+ if (IsWeatherNotFadingIn() == TRUE)
{
gTasks[taskId].data[13] = -1;
DisplayItemMessageOnField(taskId, gSecretBaseText_DecorReturned, sub_81010F0, 0);
@@ -3800,7 +3800,7 @@ void sub_8100E70(u8 taskId)
data[2] = 2;
break;
case 2:
- if (sub_807D770() == TRUE)
+ if (IsWeatherNotFadingIn() == TRUE)
{
data[12] = 1;
sub_8100EEC(taskId);
@@ -4138,7 +4138,7 @@ void sub_8101518(u8 taskId)
void sub_810153C(u8 taskId)
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = sub_8100C88;
}
@@ -4157,7 +4157,7 @@ void sub_8101590(u8 taskId)
void sub_81015B0(u8 taskId)
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = sub_81015E0;
}
@@ -4184,7 +4184,7 @@ void sub_81015E0(u8 taskId)
void sub_8101648(u8 taskId)
{
- if (sub_807D770() == TRUE)
+ if (IsWeatherNotFadingIn() == TRUE)
{
gTasks[taskId].func = Task_DecorationPCProcessMenuInput;
}
diff --git a/src/field/decoration_inventory.c b/src/decoration_inventory.c
index dd0e972aa..8f7f5eb92 100644
--- a/src/field/decoration_inventory.c
+++ b/src/decoration_inventory.c
@@ -164,3 +164,14 @@ u8 sub_81341D4(void)
}
return count;
}
+
+
+#if DEBUG
+void debug_sub_814A3A8(void)
+{
+ u8 decor;
+
+ for (decor = 0; decor < DECOR_COUNT; decor++)
+ IsThereStorageSpaceForDecoration(decor);
+}
+#endif
diff --git a/src/field/dewford_trend.c b/src/dewford_trend.c
index 9afb7a16d..9afb7a16d 100644
--- a/src/field/dewford_trend.c
+++ b/src/dewford_trend.c
diff --git a/src/field/diploma.c b/src/diploma.c
index b31fc7dec..b31fc7dec 100644
--- a/src/field/diploma.c
+++ b/src/diploma.c
diff --git a/src/easy_chat_2.c b/src/easy_chat_2.c
index c56fe7576..ed6a97ba2 100644
--- a/src/easy_chat_2.c
+++ b/src/easy_chat_2.c
@@ -5,7 +5,7 @@
#include "decompress.h"
#include "easy_chat.h"
#include "event_data.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "field_message_box.h"
#include "graphics.h"
#include "menu.h"
diff --git a/src/scene/egg_hatch.c b/src/egg_hatch.c
index 282ad31fb..5bba69f86 100644
--- a/src/scene/egg_hatch.c
+++ b/src/egg_hatch.c
@@ -40,9 +40,9 @@ struct EggHatchData
struct EggHatchData* gEggHatchData;
-extern const u32 gUnknown_08D00000[];
-extern const u32 gUnknown_08D00524[];
-extern const u16 gUnknown_08D004E0[]; //palette
+extern const u32 gBattleTextboxTiles[];
+extern const u32 gBattleTextboxTilemap[];
+extern const u16 gBattleTextboxPalette[]; //palette
extern const struct SpriteSheet sUnknown_0820A3B0;
extern const struct SpriteSheet sUnknown_0820A3B8;
extern const struct SpritePalette sUnknown_0820A3C0;
@@ -478,10 +478,10 @@ static void CB2_EggHatch_0(void)
gMain.state++;
break;
case 2:
- LZDecompressVram(&gUnknown_08D00000, (void*)(VRAM));
- CpuSet(&gUnknown_08D00524, ewram0_7, 0x800);
+ LZDecompressVram(&gBattleTextboxTiles, (void*)(VRAM));
+ CpuSet(&gBattleTextboxTilemap, ewram0_7, 0x800);
DmaCopy16(3, ewram0_7, (void*)(VRAM + 0x2800), 0x500);
- LoadCompressedPalette(&gUnknown_08D004E0, 0, 0x20);
+ LoadCompressedPalette(&gBattleTextboxPalette, 0, 0x20);
gMain.state++;
break;
case 3:
diff --git a/src/field/event_data.c b/src/event_data.c
index 9d6d2372b..9d6d2372b 100644
--- a/src/field/event_data.c
+++ b/src/event_data.c
diff --git a/src/field/field_map_obj.c b/src/event_object_movement.c
index 77b4c8b5c..155ce33f5 100644
--- a/src/field/field_map_obj.c
+++ b/src/event_object_movement.c
@@ -1,12 +1,10 @@
#include "global.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "berry.h"
#include "event_data.h"
#include "field_camera.h"
#include "field_effect.h"
#include "field_effect_helpers.h"
-#include "field_ground_effect.h"
-#include "field_map_obj_helpers.h"
#include "field_player_avatar.h"
#include "fieldmap.h"
#include "palette.h"
@@ -18,6 +16,8 @@
#include "constants/map_objects.h"
#include "trainer_see.h"
+// this file was known as evobjmv.c in Game Freak's original source
+
// rodata
const u8 gUnknown_0830FD14[] = {1, 1, 6, 7, 8, 9, 6, 7, 8, 9, 11, 11, 0, 0, 0, 0};
@@ -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
@@ -1907,6 +1907,9 @@ static u8 gUnknown_030005A4;
static u16 gUnknown_030005A6;
struct MapObject gMapObjects[16];
+#if DEBUG
+u8 gUnknown_Debug_03004BC0;
+#endif
void npc_clear_ids_and_state(struct MapObject *mapObj)
{
@@ -1923,6 +1926,9 @@ void npcs_clear_ids_and_state(void)
for (i = 0; i < 16; i++)
npc_clear_ids_and_state(&gMapObjects[i]);
+#if DEBUG
+ gUnknown_Debug_03004BC0 = 0;
+#endif
}
void sub_805AA98(void)
@@ -1966,7 +1972,7 @@ u8 sub_805AB54(void)
u8 GetFieldObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)
{
- if (localId <= 0xFE)
+ if (localId < 255)
return GetFieldObjectIdByLocalIdAndMapInternal(localId, mapNum, mapGroup);
else
return GetFieldObjectIdByLocalId(localId);
@@ -2017,20 +2023,80 @@ u8 GetFieldObjectIdByLocalId(u8 localId)
return 16;
}
-#ifdef NONMATCHING
+// The bitfield at 0x18 needs to be u16 for this function to match
+struct MapObjectAlt
+{
+ /*0x00*/ u32 active:1;
+ u32 mapobj_bit_1:1;
+ u32 mapobj_bit_2:1;
+ u32 mapobj_bit_3:1;
+ u32 mapobj_bit_4:1;
+ u32 mapobj_bit_5:1;
+ u32 mapobj_bit_6:1;
+ u32 mapobj_bit_7:1;
+ /*0x01*/ u32 mapobj_bit_8:1;
+ u32 mapobj_bit_9:1;
+ u32 mapobj_bit_10:1;
+ u32 mapobj_bit_11:1;
+ u32 mapobj_bit_12:1;
+ u32 mapobj_bit_13:1;
+ u32 mapobj_bit_14:1;
+ u32 mapobj_bit_15:1;
+ /*0x02*/ u32 mapobj_bit_16:1;
+ u32 mapobj_bit_17:1;
+ u32 mapobj_bit_18:1;
+ u32 mapobj_bit_19:1;
+ u32 mapobj_bit_20:1;
+ u32 mapobj_bit_21:1;
+ u32 mapobj_bit_22:1;
+ u32 mapobj_bit_23:1;
+ /*0x03*/ u32 mapobj_bit_24:1;
+ u32 mapobj_bit_25:1;
+ u32 mapobj_bit_26:1;
+ u32 mapobj_bit_27:1;
+ u32 mapobj_bit_28:1;
+ u32 mapobj_bit_29:1;
+ u32 mapobj_bit_30:1;
+ u32 mapobj_bit_31:1;
+ /*0x04*/ u8 spriteId;
+ /*0x05*/ u8 graphicsId;
+ /*0x06*/ u8 animPattern;
+ /*0x07*/ u8 trainerType;
+ /*0x08*/ u8 localId;
+ /*0x09*/ u8 mapNum;
+ /*0x0A*/ u8 mapGroup;
+ /*0x0B*/ u8 mapobj_unk_0B_0:4;
+ u8 elevation:4;
+ /*0x0C*/ struct Coords16 coords1;
+ /*0x10*/ struct Coords16 coords2;
+ /*0x14*/ struct Coords16 coords3;
+ /*0x18*/ u16 mapobj_unk_18:4; //current direction?
+ /*0x18*/ u16 placeholder18:4;
+ /*0x19*/ u16 rangeX:4;
+ /*0x19*/ u16 rangeY:4;
+ /*0x1A*/ u8 mapobj_unk_1A;
+ /*0x1B*/ u8 mapobj_unk_1B;
+ /*0x1C*/ u8 mapobj_unk_1C;
+ /*0x1D*/ u8 trainerRange_berryTreeId;
+ /*0x1E*/ u8 mapobj_unk_1E;
+ /*0x1F*/ u8 mapobj_unk_1F;
+ /*0x20*/ u8 mapobj_unk_20;
+ /*0x21*/ u8 mapobj_unk_21;
+ /*0x22*/ u8 animId;
+ /*size = 0x24*/
+};
+
u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c)
{
- struct MapObject *mapObj; //TODO: resolve the mapobj_unk_19b weirdness
+ struct MapObjectAlt *mapObj; //TODO: resolve the mapobj_unk_19b weirdness
u8 var;
- u16 r3;
- u16 r2;
+ s16 r3;
+ s16 r2;
- //asm("nop"::"r"(b));
if (GetAvailableFieldObjectSlot(template->localId, b, c, &var) != 0)
return 16;
- //_0805ACCE
- mapObj = &gMapObjects[var];
- npc_clear_ids_and_state(mapObj);
+ mapObj = (void *)&gMapObjects[var];
+ npc_clear_ids_and_state((struct MapObject *)mapObj);
r3 = template->x + 7;
r2 = template->y + 7;
mapObj->active = TRUE;
@@ -2039,6 +2105,7 @@ u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8
mapObj->animPattern = template->movementType;
mapObj->localId = template->localId;
mapObj->mapNum = b;
+ asm("":::"r6");
mapObj->mapGroup = c;
mapObj->coords1.x = r3;
mapObj->coords1.y = r2;
@@ -2048,185 +2115,26 @@ u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8
mapObj->coords3.y = r2;
mapObj->mapobj_unk_0B_0 = template->elevation;
mapObj->elevation = template->elevation;
- mapObj->range.as_nybbles.x = template->unkA_0;
- mapObj->range.as_nybbles.y = template->unkA_4;
+ mapObj->rangeX = template->unkA_0;
+ mapObj->rangeY = template->unkA_4;
mapObj->trainerType = template->unkC;
mapObj->trainerRange_berryTreeId = template->unkE;
mapObj->mapobj_unk_20 = gUnknown_0836DC09[template->movementType];
FieldObjectSetDirection((struct MapObject *)mapObj, mapObj->mapobj_unk_20);
- FieldObjectHandleDynamicGraphicsId(mapObj);
- //asm("":::"r5","r6");
+ asm("":::"r5","r6");
+ FieldObjectHandleDynamicGraphicsId((struct MapObject *)mapObj);
if (gUnknown_0836DBBC[mapObj->animPattern] != 0)
{
- if (mapObj->range.as_nybbles.x == 0)
- mapObj->range.as_nybbles.x++;
- if (mapObj->range.as_nybbles.y == 0)
- mapObj->range.as_nybbles.y++;
+ if (mapObj->rangeX == 0)
+ mapObj->rangeX++;
+ if (mapObj->rangeY == 0)
+ mapObj->rangeY++;
}
+#if DEBUG
+ gUnknown_Debug_03004BC0++;
+#endif
return var;
}
-#else
-__attribute__((naked))
-u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c)
-{
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- mov r7, r9\n\
- mov r6, r8\n\
- push {r6,r7}\n\
- sub sp, 0x4\n\
- adds r5, r0, 0\n\
- lsls r1, 24\n\
- lsrs r6, r1, 24\n\
- lsls r2, 24\n\
- lsrs r7, r2, 24\n\
- ldrb r0, [r5]\n\
- adds r1, r6, 0\n\
- adds r2, r7, 0\n\
- mov r3, sp\n\
- bl GetAvailableFieldObjectSlot\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _0805ACCE\n\
- movs r0, 0x10\n\
- b _0805ADC2\n\
-_0805ACCE:\n\
- mov r0, sp\n\
- ldrb r1, [r0]\n\
- lsls r0, r1, 3\n\
- adds r0, r1\n\
- lsls r0, 2\n\
- ldr r1, _0805ADD0 @ =gMapObjects\n\
- adds r4, r0, r1\n\
- adds r0, r4, 0\n\
- bl npc_clear_ids_and_state\n\
- ldrh r3, [r5, 0x4]\n\
- adds r3, 0x7\n\
- lsls r3, 16\n\
- lsrs r3, 16\n\
- ldrh r2, [r5, 0x6]\n\
- adds r2, 0x7\n\
- lsls r2, 16\n\
- lsrs r2, 16\n\
- ldrb r0, [r4]\n\
- movs r1, 0x1\n\
- orrs r0, r1\n\
- movs r1, 0x4\n\
- orrs r0, r1\n\
- strb r0, [r4]\n\
- ldrb r0, [r5, 0x1]\n\
- strb r0, [r4, 0x5]\n\
- ldrb r0, [r5, 0x9]\n\
- strb r0, [r4, 0x6]\n\
- ldrb r0, [r5]\n\
- strb r0, [r4, 0x8]\n\
- strb r6, [r4, 0x9]\n\
- strb r7, [r4, 0xA]\n\
- strh r3, [r4, 0xC]\n\
- strh r2, [r4, 0xE]\n\
- strh r3, [r4, 0x10]\n\
- strh r2, [r4, 0x12]\n\
- strh r3, [r4, 0x14]\n\
- strh r2, [r4, 0x16]\n\
- ldrb r0, [r5, 0x8]\n\
- movs r7, 0xF\n\
- adds r1, r7, 0\n\
- ands r1, r0\n\
- ldrb r2, [r4, 0xB]\n\
- movs r0, 0x10\n\
- negs r0, r0\n\
- mov r8, r0\n\
- ands r0, r2\n\
- orrs r0, r1\n\
- strb r0, [r4, 0xB]\n\
- ldrb r1, [r5, 0x8]\n\
- lsls r1, 4\n\
- ands r0, r7\n\
- orrs r0, r1\n\
- strb r0, [r4, 0xB]\n\
- ldrb r1, [r5, 0xA]\n\
- lsls r1, 28\n\
- movs r0, 0xF\n\
- mov r9, r0\n\
- lsrs r1, 28\n\
- ldrb r2, [r4, 0x19]\n\
- mov r0, r8\n\
- ands r0, r2\n\
- orrs r0, r1\n\
- strb r0, [r4, 0x19]\n\
- ldrb r1, [r5, 0xA]\n\
- lsrs r1, 4\n\
- lsls r1, 4\n\
- ands r0, r7\n\
- orrs r0, r1\n\
- strb r0, [r4, 0x19]\n\
- ldrh r0, [r5, 0xC]\n\
- strb r0, [r4, 0x7]\n\
- ldrh r0, [r5, 0xE]\n\
- strb r0, [r4, 0x1D]\n\
- ldr r1, _0805ADD4 @ =gUnknown_0836DC09\n\
- ldrb r0, [r5, 0x9]\n\
- adds r0, r1\n\
- ldrb r1, [r0]\n\
- adds r0, r4, 0\n\
- adds r0, 0x20\n\
- strb r1, [r0]\n\
- ldrb r1, [r0]\n\
- adds r0, r4, 0\n\
- bl FieldObjectSetDirection\n\
- adds r0, r4, 0\n\
- bl FieldObjectHandleDynamicGraphicsId\n\
- ldr r1, _0805ADD8 @ =gUnknown_0836DBBC\n\
- ldrb r0, [r4, 0x6]\n\
- adds r0, r1\n\
- ldrb r0, [r0]\n\
- cmp r0, 0\n\
- beq _0805ADBE\n\
- ldrb r2, [r4, 0x19]\n\
- adds r0, r7, 0\n\
- ands r0, r2\n\
- cmp r0, 0\n\
- bne _0805ADA6\n\
- lsls r0, r2, 28\n\
- lsrs r0, 28\n\
- adds r0, 0x1\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r8\n\
- ands r1, r2\n\
- orrs r1, r0\n\
- strb r1, [r4, 0x19]\n\
-_0805ADA6:\n\
- ldrb r2, [r4, 0x19]\n\
- movs r0, 0xF0\n\
- ands r0, r2\n\
- cmp r0, 0\n\
- bne _0805ADBE\n\
- lsrs r1, r2, 4\n\
- adds r1, 0x1\n\
- lsls r1, 4\n\
- adds r0, r7, 0\n\
- ands r0, r2\n\
- orrs r0, r1\n\
- strb r0, [r4, 0x19]\n\
-_0805ADBE:\n\
- mov r0, sp\n\
- ldrb r0, [r0]\n\
-_0805ADC2:\n\
- add sp, 0x4\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\
-_0805ADD0: .4byte gMapObjects\n\
-_0805ADD4: .4byte gUnknown_0836DC09\n\
-_0805ADD8: .4byte gUnknown_0836DBBC\n\
- .syntax divided\n");
-}
-#endif
u8 sub_805ADDC(u8 localId)
{
@@ -2270,6 +2178,9 @@ void RemoveFieldObject(struct MapObject *mapObject)
{
mapObject->active = FALSE;
RemoveFieldObjectInternal(mapObject);
+#if DEBUG
+ gUnknown_Debug_03004BC0--;
+#endif
}
void RemoveFieldObjectByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)
@@ -2332,6 +2243,9 @@ u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *
spriteId = CreateSprite(sprTemplate, 0, 0, 0);
if (spriteId == 64)
{
+#if DEBUG
+ gUnknown_Debug_03004BC0--;
+#endif
gMapObjects[mapObjectId].active = FALSE;
return 16;
}
@@ -2460,7 +2374,7 @@ u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 x
extern void sub_8064970(struct Sprite *);
extern void sub_8060470(s16 *, s16 *, s16, s16);
-extern void InitObjectPriorityByZCoord();
+void InitObjectPriorityByZCoord(struct Sprite *sprite, u8 z);
u8 sub_805B410(u8 graphicsId, u8 b, s16 x, s16 y, u8 elevation, u8 direction)
{
@@ -2578,11 +2492,19 @@ void sub_805B710(u16 a, u16 b)
{
u8 i;
+#if DEBUG
+ gUnknown_Debug_03004BC0 = 0;
+#endif
ClearPlayerAvatarInfo();
for (i = 0; i < 16; i++)
{
if (gMapObjects[i].active)
+ {
sub_805B75C(i, a, b);
+#if DEBUG
+ gUnknown_Debug_03004BC0++;
+#endif
+ }
}
sub_805AAB0();
}
@@ -3347,7 +3269,7 @@ u8 sub_805C904(struct MapObject *mapObject, struct Sprite *sprite)
}
extern u8 FieldObjectExecRegularAnim(struct MapObject *, struct Sprite *);
-extern void sub_8064820(struct Sprite *, s16);
+void sub_8064820(struct Sprite *, s16);
u8 sub_805C930(struct MapObject *mapObject, struct Sprite *sprite)
{
@@ -8353,3 +8275,1149 @@ void UpdateMapObjSpriteVisibility(struct MapObject *mapObject, struct Sprite *sp
sprite->invisible = 1;
}
}
+
+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;
+ }
+}
+
+typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 dir);
+
+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)
+{
+ if (mapObject->mapobj_bit_6 || mapObject->mapobj_bit_8)
+ {
+ return TRUE;
+ }
+ else
+ {
+ mapObject->mapobj_bit_8 = 1;
+ mapObject->mapobj_bit_23 = gSprites[mapObject->spriteId].animPaused;
+ mapObject->mapobj_bit_24 = gSprites[mapObject->spriteId].affineAnimPaused;
+ gSprites[mapObject->spriteId].animPaused = 1;
+ gSprites[mapObject->spriteId].affineAnimPaused = 1;
+ return FALSE;
+ }
+}
+
+void FreezeMapObjects(void)
+{
+ u8 i;
+ for (i = 0; i < 16; i++)
+ if (gMapObjects[i].active && i != gPlayerAvatar.mapObjectId)
+ FreezeMapObject(&gMapObjects[i]);
+}
+
+void FreezeMapObjectsExceptOne(u8 a1)
+{
+ u8 i;
+ for (i = 0; i < 16; i++)
+ if (i != a1 && gMapObjects[i].active && i != gPlayerAvatar.mapObjectId)
+ FreezeMapObject(&gMapObjects[i]);
+}
+
+void UnfreezeMapObject(struct MapObject *mapObject)
+{
+ if (mapObject->active && mapObject->mapobj_bit_8)
+ {
+ mapObject->mapobj_bit_8 = 0;
+ gSprites[mapObject->spriteId].animPaused = mapObject->mapobj_bit_23;
+ gSprites[mapObject->spriteId].affineAnimPaused = mapObject->mapobj_bit_24;
+ }
+}
+
+void UnfreezeMapObjects(void)
+{
+ u8 i;
+ for (i = 0; i < 16; i++)
+ if (gMapObjects[i].active)
+ UnfreezeMapObject(&gMapObjects[i]);
+}
+
+void Step1(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += gDirectionToVector[dir].x;
+ sprite->pos1.y += gDirectionToVector[dir].y;
+}
+
+void Step2(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += 2 * (u16) gDirectionToVector[dir].x;
+ sprite->pos1.y += 2 * (u16) gDirectionToVector[dir].y;
+}
+
+void Step3(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += 2 * (u16) gDirectionToVector[dir].x + (u16) gDirectionToVector[dir].x;
+ sprite->pos1.y += 2 * (u16) gDirectionToVector[dir].y + (u16) gDirectionToVector[dir].y;
+}
+
+void Step4(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += 4 * (u16) gDirectionToVector[dir].x;
+ sprite->pos1.y += 4 * (u16) gDirectionToVector[dir].y;
+}
+
+void Step8(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += 8 * (u16) gDirectionToVector[dir].x;
+ sprite->pos1.y += 8 * (u16) gDirectionToVector[dir].y;
+}
+
+void oamt_npc_ministep_reset(struct Sprite *sprite, u8 a2, u8 a3)
+{
+ sprite->data[3] = a2;
+ sprite->data[4] = a3;
+ sprite->data[5] = 0;
+}
+
+bool8 obj_npc_ministep(struct Sprite *sprite)
+{
+ if (sprite->data[5] >= gUnknown_08376194[sprite->data[4]])
+ return FALSE;
+
+ gUnknown_08376180[sprite->data[4]][sprite->data[5]](sprite, sprite->data[3]);
+
+ sprite->data[5]++;
+
+ if (sprite->data[5] < gUnknown_08376194[sprite->data[4]])
+ return FALSE;
+
+ return TRUE;
+}
+
+void sub_806467C(struct Sprite *sprite, u8 a2)
+{
+ sprite->data[3] = a2;
+ sprite->data[4] = 0;
+ sprite->data[5] = 0;
+}
+
+bool8 sub_806468C(struct Sprite *sprite)
+{
+ if (!(sprite->data[4] & 1))
+ {
+ Step1(sprite, sprite->data[3]);
+ sprite->data[5]++;
+ }
+
+ sprite->data[4]++;
+
+ if (sprite->data[5] > 15)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+s16 sub_80646C8(s16 a1, u8 a2)
+{
+ return gUnknown_083761D0[a2][a1];
+}
+
+void sub_80646E4(struct Sprite *sprite, u8 a2, u8 a3, u8 a4)
+{
+ sprite->data[3] = a2;
+ sprite->data[4] = a3;
+ sprite->data[5] = a4;
+ sprite->data[6] = 0;
+}
+
+u8 sub_8064704(struct Sprite *sprite)
+{
+ s16 v5[3] = {0x10, 0x10, 0x20};
+ u8 v6[3] = {0, 0, 1};
+ u8 v2 = 0;
+
+ if (sprite->data[4])
+ Step1(sprite, sprite->data[3]);
+
+ sprite->pos2.y = sub_80646C8(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]);
+
+ sprite->data[6]++;
+
+ if (sprite->data[6] == (v5[sprite->data[4]] >> 1))
+ v2 = 1;
+
+ if (sprite->data[6] >= v5[sprite->data[4]])
+ {
+ sprite->pos2.y = 0;
+ v2 = -1;
+ }
+
+ return v2;
+}
+
+u8 sub_806478C(struct Sprite *sprite)
+{
+ s16 v5[3] = {0x20, 0x20, 0x40};
+ u8 v6[3] = {1, 1, 2};
+ u8 v2 = 0;
+
+ if (sprite->data[4] && !(sprite->data[6] & 1))
+ Step1(sprite, sprite->data[3]);
+
+ sprite->pos2.y = sub_80646C8(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]);
+
+ sprite->data[6]++;
+
+ if (sprite->data[6] == (v5[sprite->data[4]] >> 1))
+ v2 = 1;
+
+ if (sprite->data[6] >= v5[sprite->data[4]])
+ {
+ sprite->pos2.y = 0;
+ v2 = -1;
+ }
+
+ return v2;
+}
+
+void sub_8064820(struct Sprite *sprite, s16 a2)
+{
+ sprite->data[3] = a2;
+}
+
+bool8 sub_8064824(struct Sprite *sprite)
+{
+ sprite->data[3]--;
+
+ if (sprite->data[3] == 0)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void obj_anim_image_set_and_seek(struct Sprite *sprite, u8 a2, u8 a3)
+{
+ sprite->animNum = a2;
+ sprite->animPaused = 0 ;
+ SeekSpriteAnim(sprite, a3);
+}
+
+bool8 sub_8064864(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void sub_806487C(struct Sprite *sprite, bool8 invisible)
+{
+ u16 x, y;
+ s16 x2, y2;
+
+ sprite->invisible = invisible;
+
+ if (sprite->coordOffsetEnabled)
+ {
+ x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX;
+ y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY;
+ }
+ else
+ {
+ x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX;
+ y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY;
+ }
+
+ x2 = x - (sprite->centerToCornerVecX >> 1);
+ y2 = y - (sprite->centerToCornerVecY >> 1);
+
+ if ((s16)x > 255 || x2 < -16)
+ sprite->invisible = 1;
+ if ((s16)y > 175 || y2 < -16)
+ sprite->invisible = 1;
+}
+
+void sub_8064970(struct Sprite *sprite)
+{
+ SetObjectSubpriorityByZCoord(sprite->data[1], sprite, 1);
+ sub_806487C(sprite, 0);
+}
+
+void sub_8064990(u8 a1, u8 dir)
+{
+ u8 i;
+ for (i = 0; i < MAX_SPRITES; i++)
+ {
+ struct Sprite *sprite = &gSprites[i];
+ if (sprite->inUse && sprite->callback == sub_8064970 && (u8)sprite->data[0] == a1)
+ {
+ u8 animNum = FieldObjectDirectionToImageAnimId(dir);
+ StartSpriteAnim(sprite, animNum);
+ break;
+ }
+ }
+}
+
+u32 oe_exec_and_other_stuff(u8 fieldEffectId, struct MapObject *mapObject)
+{
+ FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
+ return FieldEffectStart(fieldEffectId);
+}
+
+void DoShadowFieldEffect(struct MapObject *mapObject)
+{
+ if (!mapObject->mapobj_bit_22)
+ {
+ mapObject->mapobj_bit_22 = 1;
+ oe_exec_and_other_stuff(FLDEFF_SHADOW, mapObject);
+ }
+}
+
+void DoRippleFieldEffect(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId);
+ 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/scene/evolution_graphics.c b/src/evolution_graphics.c
index b9ef5b402..b9ef5b402 100644
--- a/src/scene/evolution_graphics.c
+++ b/src/evolution_graphics.c
diff --git a/src/scene/evolution_scene.c b/src/evolution_scene.c
index 3ba325574..a3a5dbcec 100644
--- a/src/scene/evolution_scene.c
+++ b/src/evolution_scene.c
@@ -212,7 +212,7 @@ void EvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, bool8 canStopEvo,
gBattleTerrain = BATTLE_TERRAIN_PLAIN;
sub_800D6D4();
- sub_800DAB8();
+ LoadBattleTextboxAndBackground();
ResetSpriteData();
ScanlineEffect_Stop();
ResetTasks();
@@ -320,7 +320,7 @@ static void CB2_EvolutionSceneLoadGraphics(void)
gBattleTerrain = BATTLE_TERRAIN_PLAIN;
sub_800D6D4();
- sub_800DAB8();
+ LoadBattleTextboxAndBackground();
ResetSpriteData();
FreeAllSpritePalettes();
gReservedSpritePaletteCount = 4;
diff --git a/src/field/field_ground_effect.c b/src/field/field_ground_effect.c
deleted file mode 100644
index 25b678ff9..000000000
--- a/src/field/field_ground_effect.c
+++ /dev/null
@@ -1,772 +0,0 @@
-#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/field_map_obj_helpers.c b/src/field/field_map_obj_helpers.c
deleted file mode 100644
index 328b66ed2..000000000
--- a/src/field/field_map_obj_helpers.c
+++ /dev/null
@@ -1,387 +0,0 @@
-#include "global.h"
-#include "field_map_obj_helpers.h"
-#include "field_effect.h"
-#include "field_ground_effect.h"
-#include "field_map_obj.h"
-#include "sprite.h"
-
-typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 dir);
-
-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)
-{
- if (mapObject->mapobj_bit_6 || mapObject->mapobj_bit_8)
- {
- return TRUE;
- }
- else
- {
- mapObject->mapobj_bit_8 = 1;
- mapObject->mapobj_bit_23 = gSprites[mapObject->spriteId].animPaused;
- mapObject->mapobj_bit_24 = gSprites[mapObject->spriteId].affineAnimPaused;
- gSprites[mapObject->spriteId].animPaused = 1;
- gSprites[mapObject->spriteId].affineAnimPaused = 1;
- return FALSE;
- }
-}
-
-void FreezeMapObjects(void)
-{
- u8 i;
- for (i = 0; i < 16; i++)
- if (gMapObjects[i].active && i != gPlayerAvatar.mapObjectId)
- FreezeMapObject(&gMapObjects[i]);
-}
-
-void FreezeMapObjectsExceptOne(u8 a1)
-{
- u8 i;
- for (i = 0; i < 16; i++)
- if (i != a1 && gMapObjects[i].active && i != gPlayerAvatar.mapObjectId)
- FreezeMapObject(&gMapObjects[i]);
-}
-
-void UnfreezeMapObject(struct MapObject *mapObject)
-{
- if (mapObject->active && mapObject->mapobj_bit_8)
- {
- mapObject->mapobj_bit_8 = 0;
- gSprites[mapObject->spriteId].animPaused = mapObject->mapobj_bit_23;
- gSprites[mapObject->spriteId].affineAnimPaused = mapObject->mapobj_bit_24;
- }
-}
-
-void UnfreezeMapObjects(void)
-{
- u8 i;
- for (i = 0; i < 16; i++)
- if (gMapObjects[i].active)
- UnfreezeMapObject(&gMapObjects[i]);
-}
-
-void Step1(struct Sprite *sprite, u8 dir)
-{
- sprite->pos1.x += gDirectionToVector[dir].x;
- sprite->pos1.y += gDirectionToVector[dir].y;
-}
-
-void Step2(struct Sprite *sprite, u8 dir)
-{
- sprite->pos1.x += 2 * (u16) gDirectionToVector[dir].x;
- sprite->pos1.y += 2 * (u16) gDirectionToVector[dir].y;
-}
-
-void Step3(struct Sprite *sprite, u8 dir)
-{
- sprite->pos1.x += 2 * (u16) gDirectionToVector[dir].x + (u16) gDirectionToVector[dir].x;
- sprite->pos1.y += 2 * (u16) gDirectionToVector[dir].y + (u16) gDirectionToVector[dir].y;
-}
-
-void Step4(struct Sprite *sprite, u8 dir)
-{
- sprite->pos1.x += 4 * (u16) gDirectionToVector[dir].x;
- sprite->pos1.y += 4 * (u16) gDirectionToVector[dir].y;
-}
-
-void Step8(struct Sprite *sprite, u8 dir)
-{
- sprite->pos1.x += 8 * (u16) gDirectionToVector[dir].x;
- sprite->pos1.y += 8 * (u16) gDirectionToVector[dir].y;
-}
-
-void oamt_npc_ministep_reset(struct Sprite *sprite, u8 a2, u8 a3)
-{
- sprite->data[3] = a2;
- sprite->data[4] = a3;
- sprite->data[5] = 0;
-}
-
-bool8 obj_npc_ministep(struct Sprite *sprite)
-{
- if (sprite->data[5] >= gUnknown_08376194[sprite->data[4]])
- return FALSE;
-
- gUnknown_08376180[sprite->data[4]][sprite->data[5]](sprite, sprite->data[3]);
-
- sprite->data[5]++;
-
- if (sprite->data[5] < gUnknown_08376194[sprite->data[4]])
- return FALSE;
-
- return TRUE;
-}
-
-void sub_806467C(struct Sprite *sprite, u8 a2)
-{
- sprite->data[3] = a2;
- sprite->data[4] = 0;
- sprite->data[5] = 0;
-}
-
-bool8 sub_806468C(struct Sprite *sprite)
-{
- if (!(sprite->data[4] & 1))
- {
- Step1(sprite, sprite->data[3]);
- sprite->data[5]++;
- }
-
- sprite->data[4]++;
-
- if (sprite->data[5] > 15)
- return TRUE;
- else
- return FALSE;
-}
-
-s16 sub_80646C8(s16 a1, u8 a2)
-{
- return gUnknown_083761D0[a2][a1];
-}
-
-void sub_80646E4(struct Sprite *sprite, u8 a2, u8 a3, u8 a4)
-{
- sprite->data[3] = a2;
- sprite->data[4] = a3;
- sprite->data[5] = a4;
- sprite->data[6] = 0;
-}
-
-u8 sub_8064704(struct Sprite *sprite)
-{
- s16 v5[3] = {0x10, 0x10, 0x20};
- u8 v6[3] = {0, 0, 1};
- u8 v2 = 0;
-
- if (sprite->data[4])
- Step1(sprite, sprite->data[3]);
-
- sprite->pos2.y = sub_80646C8(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]);
-
- sprite->data[6]++;
-
- if (sprite->data[6] == (v5[sprite->data[4]] >> 1))
- v2 = 1;
-
- if (sprite->data[6] >= v5[sprite->data[4]])
- {
- sprite->pos2.y = 0;
- v2 = -1;
- }
-
- return v2;
-}
-
-u8 sub_806478C(struct Sprite *sprite)
-{
- s16 v5[3] = {0x20, 0x20, 0x40};
- u8 v6[3] = {1, 1, 2};
- u8 v2 = 0;
-
- if (sprite->data[4] && !(sprite->data[6] & 1))
- Step1(sprite, sprite->data[3]);
-
- sprite->pos2.y = sub_80646C8(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]);
-
- sprite->data[6]++;
-
- if (sprite->data[6] == (v5[sprite->data[4]] >> 1))
- v2 = 1;
-
- if (sprite->data[6] >= v5[sprite->data[4]])
- {
- sprite->pos2.y = 0;
- v2 = -1;
- }
-
- return v2;
-}
-
-void sub_8064820(struct Sprite *sprite, u16 a2)
-{
- sprite->data[3] = a2;
-}
-
-bool8 sub_8064824(struct Sprite *sprite)
-{
- sprite->data[3]--;
-
- if (sprite->data[3] == 0)
- return TRUE;
- else
- return FALSE;
-}
-
-void obj_anim_image_set_and_seek(struct Sprite *sprite, u8 a2, u8 a3)
-{
- sprite->animNum = a2;
- sprite->animPaused = 0 ;
- SeekSpriteAnim(sprite, a3);
-}
-
-bool8 sub_8064864(struct Sprite *sprite)
-{
- if (sprite->animEnded)
- return TRUE;
- else
- return FALSE;
-}
-
-void sub_806487C(struct Sprite *sprite, bool8 invisible)
-{
- u16 x, y;
- s16 x2, y2;
-
- sprite->invisible = invisible;
-
- if (sprite->coordOffsetEnabled)
- {
- x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX;
- y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY;
- }
- else
- {
- x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX;
- y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY;
- }
-
- x2 = x - (sprite->centerToCornerVecX >> 1);
- y2 = y - (sprite->centerToCornerVecY >> 1);
-
- if ((s16)x > 255 || x2 < -16)
- sprite->invisible = 1;
- if ((s16)y > 175 || y2 < -16)
- sprite->invisible = 1;
-}
-
-void sub_8064970(struct Sprite *sprite)
-{
- SetObjectSubpriorityByZCoord(sprite->data[1], sprite, 1);
- sub_806487C(sprite, 0);
-}
-
-void sub_8064990(u8 a1, u8 dir)
-{
- u8 i;
- for (i = 0; i < MAX_SPRITES; i++)
- {
- struct Sprite *sprite = &gSprites[i];
- if (sprite->inUse && sprite->callback == sub_8064970 && (u8)sprite->data[0] == a1)
- {
- u8 animNum = FieldObjectDirectionToImageAnimId(dir);
- StartSpriteAnim(sprite, animNum);
- break;
- }
- }
-}
-
-u32 oe_exec_and_other_stuff(u8 fieldEffectId, struct MapObject *mapObject)
-{
- FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
- return FieldEffectStart(fieldEffectId);
-}
-
-void DoShadowFieldEffect(struct MapObject *mapObject)
-{
- if (!mapObject->mapobj_bit_22)
- {
- mapObject->mapobj_bit_22 = 1;
- oe_exec_and_other_stuff(FLDEFF_SHADOW, mapObject);
- }
-}
-
-void DoRippleFieldEffect(struct MapObject *mapObject, struct Sprite *sprite)
-{
- const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId);
- 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/field_weather.c b/src/field/field_weather.c
deleted file mode 100644
index b6475d8ff..000000000
--- a/src/field/field_weather.c
+++ /dev/null
@@ -1,1161 +0,0 @@
-#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);
-};
-
-EWRAM_DATA struct Weather gWeather = {0};
-EWRAM_DATA u8 gUnknown_0202FF38[32] = {0};
-EWRAM_DATA u16 gUnknown_0202FF58 = {0};
-
-static 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");
-
-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);
-}
-
-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_camera.c b/src/field_camera.c
index 8384ad8d1..8384ad8d1 100644
--- a/src/field/field_camera.c
+++ b/src/field_camera.c
diff --git a/src/field/field_control_avatar.c b/src/field_control_avatar.c
index c156df035..3ae422512 100644
--- a/src/field/field_control_avatar.c
+++ b/src/field_control_avatar.c
@@ -4,6 +4,7 @@
#include "bike.h"
#include "coord_event_weather.h"
#include "daycare.h"
+#include "debug.h"
#include "event_data.h"
#include "field_fadetransition.h"
#include "field_player_avatar.h"
@@ -35,6 +36,7 @@ extern u16 gSpecialVar_Facing;
extern struct LinkPlayerMapObject gLinkPlayerMapObjects[];
extern u16 gSpecialVar_0x8004;
extern u16 gSpecialVar_0x8005;
+extern u8 gUnknown_020297ED;
static EWRAM_DATA u8 gUnknown_0202E8C0 = 0;
static EWRAM_DATA u16 gUnknown_0202E8C2 = 0;
@@ -103,7 +105,7 @@ static void sub_8068C30(struct MapHeader *, s8, struct MapPosition *);
static bool8 map_warp_consider_2_to_inside(struct MapPosition *, u16, u8);
static s8 map_warp_check(struct MapHeader *, u16, u16, u8);
static u8 *mapheader_trigger_activate_at(struct MapHeader *, u16, u16, u8);
-static struct BgEvent *FindInvisibleMapObjectByPosition(struct MapHeader *, u16, u16, u8);
+static struct BgEvent *FindInvisibleMapObjectByPosition(struct MapHeader *, u16, u16, u8);;
void FieldClearPlayerInput(struct FieldInput *input)
{
@@ -162,6 +164,31 @@ void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys)
input->dpadDirection = DIR_WEST;
else if (heldKeys & DPAD_RIGHT)
input->dpadDirection = DIR_EAST;
+#if DEBUG
+ if ((heldKeys & R_BUTTON) && input->pressedStartButton)
+ {
+ input->input_field_1_2 = TRUE;
+ input->pressedStartButton = FALSE;
+ }
+ if (gUnknown_020297ED)
+ {
+ if (heldKeys & R_BUTTON)
+ {
+ input->input_field_1_1 = TRUE;
+ input->input_field_0_6 = FALSE;
+ input->input_field_0_1 = FALSE;
+ input->input_field_0_4 = FALSE;
+ input->input_field_0_5 = FALSE;
+ if (newKeys & SELECT_BUTTON)
+ {
+ input->input_field_1_0 = TRUE;
+ input->pressedSelectButton = FALSE;
+ }
+ }
+ if (heldKeys & L_BUTTON)
+ input->input_field_1_3 = TRUE;
+ }
+#endif
}
int sub_8068024(struct FieldInput *input)
@@ -173,10 +200,25 @@ int sub_8068024(struct FieldInput *input)
r6 = player_get_direction_lower_nybble();
player_get_pos_to_and_height(&position);
r4 = MapGridGetMetatileBehaviorAt(position.x, position.y);
- if (CheckTrainers() == TRUE)
+#if DEBUG
+ if (input->input_field_1_3 && dive_warp(&position, r4) == TRUE)
return TRUE;
- if (mapheader_run_first_tag2_script_list_match() == 1)
+#endif
+
+ if (
+#if DEBUG
+ !input->input_field_1_1 &&
+#endif
+ CheckTrainers() == TRUE)
+ return TRUE;
+
+ if (
+#if DEBUG
+ !input->input_field_1_1 &&
+#endif
+ mapheader_run_first_tag2_script_list_match() == 1)
return TRUE;
+
if (input->pressedBButton && sub_80687A4() == 1)
return TRUE;
if (input->input_field_0_6)
@@ -211,6 +253,21 @@ int sub_8068024(struct FieldInput *input)
}
if (input->pressedSelectButton && sub_80A6D1C() == TRUE)
return TRUE;
+
+#if DEBUG
+ if (input->input_field_1_0)
+ {
+ debug_sub_80888D8();
+ return TRUE;
+ }
+ if (input->input_field_1_2)
+ {
+ PlaySE(SE_WIN_OPEN);
+ DebugMenu_8077048();
+ return TRUE;
+ }
+#endif
+
return FALSE;
}
@@ -532,7 +589,7 @@ static void happiness_algorithm_step(void)
{
struct Pokemon *pkmn = gPlayerParty;
- for (i = 5; i >= 0; i--)
+ for (i = 0; i < 6; i++)
{
AdjustFriendship(pkmn, 5);
pkmn++;
@@ -767,20 +824,19 @@ static u8 *trigger_activate(struct CoordEvent *coordEvent)
return NULL;
}
-static u8 *mapheader_trigger_activate_at(struct MapHeader *mapHeader, u16 x, u16 y, u8 d)
+static u8 *mapheader_trigger_activate_at(struct MapHeader *mapHeader, u16 x, u16 y, u8 elevation)
{
s32 i;
struct CoordEvent *coordEvents = mapHeader->events->coordEvents;
u8 coordEventCount = mapHeader->events->coordEventCount;
- u8 *script;
for (i = 0; i < coordEventCount; i++)
{
if ((u16)coordEvents[i].x == x && (u16)coordEvents[i].y == y)
{
- if (coordEvents[i].unk4 == d || coordEvents[i].unk4 == 0)
+ if (coordEvents[i].elevation == elevation || coordEvents[i].elevation == 0)
{
- script = trigger_activate(&coordEvents[i]);
+ u8 *script = trigger_activate(&coordEvents[i]);
if (script != NULL)
return script;
}
@@ -811,7 +867,7 @@ static struct BgEvent *FindInvisibleMapObjectByPosition(struct MapHeader *mapHea
return NULL;
}
-int dive_warp(struct MapPosition *position, u16 b)
+bool8 dive_warp(struct MapPosition *position, u16 b)
{
if (gMapHeader.mapType == MAP_TYPE_UNDERWATER && sub_805750C(b) == 0)
{
diff --git a/src/field/field_door.c b/src/field_door.c
index 89dae725c..89dae725c 100644
--- a/src/field/field_door.c
+++ b/src/field_door.c
diff --git a/src/field/field_effect.c b/src/field_effect.c
index 5ff89574b..f85bc520e 100644
--- a/src/field/field_effect.c
+++ b/src/field_effect.c
@@ -15,16 +15,15 @@
#include "constants/songs.h"
#include "decoration.h"
#include "field_player_avatar.h"
-#include "field_map_obj_helpers.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "metatile_behavior.h"
#include "field_camera.h"
#include "field_effect.h"
#include "field_fadetransition.h"
#include "fieldmap.h"
-#include "field_map_obj.h"
#include "util.h"
#include "field_effect_helpers.h"
+#include "pokemon_storage_system.h"
#define subsprite_table(ptr) {.subsprites = ptr, .subspriteCount = (sizeof ptr) / (sizeof(struct Subsprite))}
@@ -407,7 +406,7 @@ void FieldEffectScript_LoadFadedPalette(u8 **script)
{
struct SpritePalette *palette = (struct SpritePalette *)FieldEffectScript_ReadWord(script);
LoadSpritePalette(palette);
- sub_807D78C(IndexOfSpritePaletteTag(palette->tag));
+ UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(palette->tag));
(*script) += 4;
}
@@ -543,7 +542,7 @@ u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority)
LoadCompressedObjectPalette(&gMonPaletteTable[species]);
GetMonSpriteTemplate_803C56C(species, 3);
gUnknown_02024E8C.paletteTag = gMonPaletteTable[0].tag;
- sub_807DE38(IndexOfSpritePaletteTag(gMonPaletteTable[0].tag) + 0x10);
+ PreservePaletteInWeather(IndexOfSpritePaletteTag(gMonPaletteTable[0].tag) + 0x10);
return CreateSprite(&gUnknown_02024E8C, x, y, subpriority);
}
@@ -556,13 +555,13 @@ u8 CreateMonSprite_FieldMove(u16 species, u32 d, u32 g, s16 x, s16 y, u8 subprio
LoadCompressedObjectPalette(spritePalette);
GetMonSpriteTemplate_803C56C(species, 3);
gUnknown_02024E8C.paletteTag = spritePalette->tag;
- sub_807DE38(IndexOfSpritePaletteTag(spritePalette->tag) + 0x10);
+ PreservePaletteInWeather(IndexOfSpritePaletteTag(spritePalette->tag) + 0x10);
return CreateSprite(&gUnknown_02024E8C, x, y, subpriority);
}
void FreeResourcesAndDestroySprite(struct Sprite *sprite)
{
- sub_807DE68();
+ ResetPreservedPalettesInWeather();
FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum));
if (sprite->oam.affineMode != 0)
{
@@ -1091,7 +1090,7 @@ void task00_8084310(u8 taskId)
task = &gTasks[taskId];
if (!task->data[0])
{
- if (!sub_807D770())
+ if (!IsWeatherNotFadingIn())
{
return;
}
@@ -1191,7 +1190,7 @@ bool8 sub_80867AC(struct Task *task) // gUnknown_0839F2CC[0]
bool8 sub_8086854(struct Task *task) // gUnknown_0839F2CC[1]
{
- if (sub_807D770())
+ if (IsWeatherNotFadingIn())
{
task->data[0]++;
}
@@ -1813,7 +1812,7 @@ bool8 sub_80874CC(struct Task *task, struct MapObject *mapObject, struct Sprite
bool8 sub_80874FC(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite)
{
- if (sub_807D770())
+ if (IsWeatherNotFadingIn())
{
gFieldEffectArguments[0] = mapObject->coords2.x;
gFieldEffectArguments[1] = mapObject->coords2.y;
@@ -2046,7 +2045,7 @@ void sub_8087A74(u8 taskId)
void sub_8087AA4(struct Task *task)
{
- if (sub_807D770())
+ if (IsWeatherNotFadingIn())
{
task->data[0]++;
task->data[15] = player_get_direction_lower_nybble();
@@ -2199,7 +2198,7 @@ void sub_8087E4C(struct Task *task)
{
struct Sprite *sprite;
s16 centerToCornerVecY;
- if (sub_807D770())
+ if (IsWeatherNotFadingIn())
{
sprite = &gSprites[gPlayerAvatar.spriteId];
centerToCornerVecY = -(sprite->centerToCornerVecY << 1);
diff --git a/src/field/field_effect_helpers.c b/src/field_effect_helpers.c
index 165829a55..bc4a1770e 100644
--- a/src/field/field_effect_helpers.c
+++ b/src/field_effect_helpers.c
@@ -4,12 +4,10 @@
#include "metatile_behavior.h"
#include "constants/songs.h"
#include "sound.h"
-#include "field_map_obj.h"
+#include "event_object_movement.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 *);
@@ -29,8 +27,6 @@ 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;
@@ -95,7 +91,7 @@ static void npc_pal_op_B(struct MapObject *mapObject, u8 paletteNum)
{
pal_patch_for_npc(npc_paltag_by_palslot(paletteNum), paletteNum);
}
- sub_807D78C(paletteNum);
+ UpdateSpritePaletteWithWeather(paletteNum);
}
}
@@ -107,7 +103,7 @@ static void npc_pal_op_A(struct MapObject *mapObject, u8 paletteNum)
if (graphicsInfo->paletteTag2 != 0x11ff)
{
pal_patch_for_npc(graphicsInfo->paletteTag2, paletteNum);
- sub_807D78C(paletteNum);
+ UpdateSpritePaletteWithWeather(paletteNum);
}
}
diff --git a/src/field/field_fadetransition.c b/src/field_fadetransition.c
index 5014e97e3..35ea3952a 100644
--- a/src/field/field_fadetransition.c
+++ b/src/field_fadetransition.c
@@ -4,8 +4,7 @@
#include "field_door.h"
#include "field_effect.h"
#include "field_fadetransition.h"
-#include "field_map_obj.h"
-#include "field_map_obj_helpers.h"
+#include "event_object_movement.h"
#include "field_player_avatar.h"
#include "field_special_scene.h"
#include "field_weather.h"
@@ -44,18 +43,18 @@ void pal_fill_for_map_transition(void)
switch (fade_type_for_given_maplight_pair(map_light, Overworld_GetMapTypeOfSaveblockLocation()))
{
case 0:
- fade_screen(0, 0);
+ FadeScreen(0, 0);
palette_bg_fill_black();
break;
case 1:
- fade_screen(2, 0);
+ FadeScreen(2, 0);
palette_bg_fill_white();
}
}
void pal_fill_black(void)
{
- fade_screen(0, 0);
+ FadeScreen(0, 0);
palette_bg_fill_black();
}
@@ -65,10 +64,10 @@ void fade_8080918(void)
switch (sub_810CDB8(light_level, warp1_get_mapheader()->mapType))
{
case 0:
- fade_screen(1, 0);
+ FadeScreen(1, 0);
break;
case 1:
- fade_screen(3, 0);
+ FadeScreen(3, 0);
}
}
@@ -146,7 +145,7 @@ void sub_8080A5C(u8 taskId)
task->data[0]++;
break;
case 1:
- if (sub_8007ECC())
+ if (IsLinkTaskFinished())
{
pal_fill_for_map_transition();
task->data[0]++;
@@ -366,7 +365,7 @@ bool32 sub_8080E64(void)
bool32 sub_8080E70(void)
{
- if (sub_807D770() == TRUE)
+ if (IsWeatherNotFadingIn() == TRUE)
return TRUE;
else
return FALSE;
@@ -483,7 +482,7 @@ void sub_8081050(u8 taskId)
{
case 0:
ClearLinkCallback_2();
- fade_screen(1, 0);
+ FadeScreen(1, 0);
sub_8053FF8();
PlaySE(SE_KAIDAN);
data[0]++;
@@ -511,6 +510,22 @@ void sub_80810DC(void)
CreateTask(sub_8081050, 10);
}
+#if DEBUG
+
+__attribute__((naked))
+void debug_sub_80888D8()
+{
+ asm("\
+ PUSH {LR}\n\
+ BL debug_sub_8052E04\n\
+ BL sub_8080E88\n\
+ BL ScriptContext2_Enable\n\
+ POP {R0}\n\
+ BX R0");
+}
+
+#endif
+
void task0A_fade_n_map_maybe(u8 taskId)
{
struct Task *task = &gTasks[taskId];
diff --git a/src/field/field_message_box.c b/src/field_message_box.c
index 5eec7a14b..5eec7a14b 100644
--- a/src/field/field_message_box.c
+++ b/src/field_message_box.c
diff --git a/src/field/field_player_avatar.c b/src/field_player_avatar.c
index ba45e506d..1552381b2 100644
--- a/src/field/field_player_avatar.c
+++ b/src/field_player_avatar.c
@@ -4,14 +4,13 @@
#include "event_data.h"
#include "field_effect.h"
#include "field_effect_helpers.h"
-#include "field_ground_effect.h"
-#include "field_map_obj.h"
-#include "field_map_obj_helpers.h"
+#include "event_object_movement.h"
#include "fieldmap.h"
#include "main.h"
#include "constants/map_objects.h"
#include "menu.h"
#include "metatile_behavior.h"
+#include "new_game.h"
#include "party_menu.h"
#include "random.h"
#include "overworld.h"
@@ -51,6 +50,8 @@ static void sub_8059D60(struct MapObject *a);
static void StartStrengthAnim(u8 a, u8 b);
static void DoPlayerMatJump(void);
static void sub_805A06C(void);
+u8 debug_sub_805F2B0(u8);
+u8 debug_sub_805F2DC(u8);
static bool8 (*const gUnknown_0830FB58[])(u8) =
{
@@ -262,6 +263,10 @@ static void PlayerAllowForcedMovementIfMovingSameDirection(void)
static bool8 TryDoMetatileBehaviorForcedMovement(void)
{
+#if DEBUG
+ if (gUnknown_020297ED != 0 && (gMain.heldKeys & 0x100))
+ return 0;
+#endif
return gUnknown_0830FBA0[GetForcedMovementByMetatileBehavior()]();
}
@@ -438,6 +443,10 @@ bool8 ForcedMovement_MuddySlope(void)
static void MovePlayerNotOnBike(u8 direction, u16 heldKeys)
{
+#if DEBUG
+ if (gUnknown_020297ED != 0 && debug_sub_805F2B0(direction) != 0)
+ return;
+#endif
gUnknown_0830FBEC[CheckMovementInputNotOnBike(direction)](direction, heldKeys);
}
@@ -1763,3 +1772,26 @@ static void sub_805A954(void)
if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING)
sub_8127F28(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1A, 1, playerSprite->pos2.y);
}
+
+#if DEBUG
+
+u8 debug_sub_805F2B0(u8 a)
+{
+ if (gMain.heldKeys & 0x100)
+ return debug_sub_805F2DC(a);
+ else
+ return 0;
+}
+
+u8 debug_sub_805F2DC(u8 a)
+{
+ if (a == 0)
+ PlayerFaceDirection(gMapObjects[gPlayerAvatar.mapObjectId].placeholder18);
+ else if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_15 && !CanCameraMoveInDirection(a))
+ PlayerOnBikeCollide(a);
+ else
+ PlayerGoSpeed4(a);
+ return 1;
+}
+
+#endif
diff --git a/src/field/field_poison.c b/src/field_poison.c
index 49678f269..8365351f9 100644
--- a/src/field/field_poison.c
+++ b/src/field_poison.c
@@ -43,7 +43,7 @@ void MonFaintFromPoisonOnField(u8 partyMember)
u32 val = 0;
AdjustFriendship(pkmn, 7);
- SetMonData(pkmn, MON_DATA_STATUS, (u8*)&val);
+ SetMonData(pkmn, MON_DATA_STATUS, &val);
GetMonData(pkmn, MON_DATA_NICKNAME, gStringVar1);
StringGetEnd10(gStringVar1);
}
@@ -60,38 +60,36 @@ bool32 CheckMonFaintedFromPoison(u8 partyMember)
return FALSE;
}
-//Task data
-enum
-{
- TD_STATE,
- TD_PARTY_MEMBER,
-};
+#define tState data[0]
+#define tPartyMember data[1]
void Task_WhiteOut(u8 taskId)
{
- s16 *taskData = gTasks[taskId].data;
+ s16 *data = gTasks[taskId].data;
- switch (taskData[TD_STATE])
+ switch (tState)
{
- case 0: //Check if Pokemon have fainted due to poison
- while (taskData[TD_PARTY_MEMBER] < 6)
+ case 0:
+ // Check if any Pokemon have fainted due to poison
+ while (tPartyMember < 6)
{
- if (CheckMonFaintedFromPoison(taskData[TD_PARTY_MEMBER]))
+ if (CheckMonFaintedFromPoison(tPartyMember))
{
- MonFaintFromPoisonOnField(taskData[TD_PARTY_MEMBER]);
+ // Show message about fainted mon
+ MonFaintFromPoisonOnField(tPartyMember);
ShowFieldMessage(fieldPoisonText_PokemonFainted);
- taskData[TD_STATE]++;
+ tState++;
return;
}
- taskData[TD_PARTY_MEMBER]++;
+ tPartyMember++;
}
- taskData[TD_STATE] = 2;
+ tState = 2;
break;
- case 1: //Wait for message box to disappear
+ case 1: // Wait for message box to disappear
if (IsFieldMessageBoxHidden())
- taskData[TD_STATE]--; //Check next party member
+ tState--; // Go to previous step and check next party member
break;
- case 2: //Done checking Pokemon
+ case 2: // done checking all mons
if (AllMonsFainted())
gSpecialVar_Result = 1;
else
@@ -102,6 +100,9 @@ void Task_WhiteOut(u8 taskId)
}
}
+#undef tState
+#undef tPartyMember
+
void ExecuteWhiteOut(void)
{
CreateTask(Task_WhiteOut, 0x50);
@@ -115,26 +116,28 @@ s32 DoPoisonFieldEffect(void)
u32 numFainting = 0;
int i;
+ // count the number of mons that are poisoned and fainting from poison,
+ // and decrement HP of all poisoned mons
for (i = 0; i < 6; i++)
{
u32 hp;
- // UB: Too few arguments for function 'GetMonData'
if (GetMonData(pkmn, MON_DATA_SANITY_BIT2) != 0
&& pokemon_ailments_get_primary(GetMonData(pkmn, MON_DATA_STATUS)) == 1)
{
+ // decrement HP of poisoned mon
hp = GetMonData(pkmn, MON_DATA_HP);
if (hp != 0)
hp--;
if (hp == 0)
- numFainting++; //Pokemon will now faint due to poison
+ numFainting++;
SetMonData(pkmn, MON_DATA_HP, &hp);
numPoisoned++;
}
pkmn++;
}
if (numFainting != 0 || numPoisoned != 0)
- DoFieldPoisonEffect();
+ FldeffPoison_Start();
if (numFainting != 0)
return 2;
if (numPoisoned != 0)
diff --git a/src/field/field_region_map.c b/src/field_region_map.c
index 54091459f..54091459f 100644
--- a/src/field/field_region_map.c
+++ b/src/field_region_map.c
diff --git a/src/field/field_screen_effect.c b/src/field_screen_effect.c
index 61301c5a9..61301c5a9 100644
--- a/src/field/field_screen_effect.c
+++ b/src/field_screen_effect.c
diff --git a/src/field/field_special_scene.c b/src/field_special_scene.c
index 67b652a57..2010ebcf4 100644
--- a/src/field/field_special_scene.c
+++ b/src/field_special_scene.c
@@ -3,7 +3,7 @@
#include "event_data.h"
#include "field_camera.h"
#include "field_fadetransition.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "field_specials.h"
#include "fieldmap.h"
#include "main.h"
diff --git a/src/field/field_specials.c b/src/field_specials.c
index e56d9ddbb..715086f00 100644
--- a/src/field/field_specials.c
+++ b/src/field_specials.c
@@ -4,7 +4,7 @@
#include "fieldmap.h"
#include "event_data.h"
#include "battle_tower.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "region_map.h"
#include "field_region_map.h"
#include "field_message_box.h"
diff --git a/src/field/field_tasks.c b/src/field_tasks.c
index ce5fc6c0e..ce5fc6c0e 100644
--- a/src/field/field_tasks.c
+++ b/src/field_tasks.c
diff --git a/src/field_weather.c b/src/field_weather.c
new file mode 100644
index 000000000..5857145ef
--- /dev/null
+++ b/src/field_weather.c
@@ -0,0 +1,1310 @@
+#include "global.h"
+#include "constants/songs.h"
+#include "constants/weather.h"
+#include "blend_palette.h"
+#include "event_object_movement.h"
+#include "field_weather.h"
+#include "main.h"
+#include "menu.h"
+#include "palette.h"
+#include "random.h"
+#include "script.h"
+#include "start_menu.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+#include "trig.h"
+#include "ewram.h"
+
+#define MACRO1(color) ((((color) >> 1) & 0xF) | (((color) >> 2) & 0xF0) | (((color) >> 3) & 0xF00))
+
+enum
+{
+ GAMMA_NONE,
+ GAMMA_NORMAL,
+ GAMMA_ALT,
+};
+
+struct RGBColor
+{
+ u16 r:5;
+ u16 g:5;
+ u16 b:5;
+};
+
+struct WeatherPaletteData
+{
+ u16 gammaShiftColors[8][0x1000]; // 0x1000 is the number of bytes that make up all palettes.
+};
+
+struct WeatherCallbacks
+{
+ void (*initVars)(void);
+ void (*main)(void);
+ void (*initAll)(void);
+ bool8 (*finish)(void);
+};
+
+EWRAM_DATA struct Weather gWeather = {0};
+EWRAM_DATA u8 gFieldEffectPaletteGammaTypes[32] = {0};
+EWRAM_DATA u16 gUnknown_0202FF58 = 0;
+
+static const u8 *sPaletteGammaTypes;
+
+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");
+
+static const u8 *const sCompressedDroughtPalettes[] =
+{
+ DroughtPaletteData_0,
+ DroughtPaletteData_1,
+ DroughtPaletteData_2,
+ DroughtPaletteData_3,
+ DroughtPaletteData_4,
+ DroughtPaletteData_5,
+ (u8*)eDroughtPaletteData.gammaShiftColors,
+};
+
+// 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;
+
+static bool8 LightenSpritePaletteInFog(u8);
+static void BuildGammaShiftTables(void);
+static void UpdateWeatherGammaShift(void);
+static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex);
+static void ApplyGammaShiftWithBlend(u8 startPalIndex, u8 numPalettes, s8 gammaIndex, u8 blendCoeff, u16 blendColor);
+static void ApplyDroughtGammaShiftWithBlend(s8 gammaIndex, u8 blendCoeff, u16 blendColor);
+static void ApplyFogBlend(u8 blendCoeff, u16 blendColor);
+static bool8 FadeInScreen_RainShowShade(void);
+static bool8 FadeInScreen_Drought(void);
+static bool8 FadeInScreen_Fog1(void);
+static void FadeInScreenWithWeather(void);
+static void DoNothing(void);
+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 Shade_InitVars(void);
+void Shade_Main(void);
+void Shade_InitAll(void);
+bool8 Shade_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},
+ {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},
+ {Shade_InitVars, Shade_Main, Shade_InitAll, Shade_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 gWeatherPalStateFuncs[])(void) =
+{
+ UpdateWeatherGammaShift, // WEATHER_PAL_STATE_CHANGING_WEATHER
+ FadeInScreenWithWeather, // WEATHER_PAL_STATE_SCREEN_FADING_IN
+ DoNothing, // WEATHER_PAL_STATE_SCREEN_FADING_OUT
+ DoNothing, // WEATHER_PAL_STATE_IDLE
+};
+
+// This table specifies which of the gamma shift tables should be
+// applied to each of the background and sprite palettes.
+static const u8 sBasePaletteGammaTypes[32] =
+{
+ // background palettes
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NONE,
+ GAMMA_NONE,
+ // sprite palettes
+ GAMMA_ALT,
+ GAMMA_NORMAL,
+ GAMMA_ALT,
+ GAMMA_ALT,
+ GAMMA_ALT,
+ GAMMA_ALT,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_ALT,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+ GAMMA_NORMAL,
+};
+
+#if DEBUG
+
+static const u8 sDebugText_Weather_None[] = _("なし   "); // "none"
+static const u8 sDebugText_Weather_Clear[] = _("はれ   "); // "clear"
+static const u8 sDebugText_Weather_Clear2[] = _("はれ2  "); // "clear2"
+static const u8 sDebugText_Weather_Rain[] = _("あめ   "); // "rain"
+static const u8 sDebugText_Weather_Snow[] = _("ゆき   "); // "snow"
+static const u8 sDebugText_Weather_Lightning[] = _("かみなり "); // "lightning"
+static const u8 sDebugText_Weather_Fog[] = _("きり   "); // "fog"
+static const u8 sDebugText_Weather_VolcanicAsh[] = _("かざんばい"); // "volcanic ash"
+static const u8 sDebugText_Weather_Sandstorm[] = _("すなあらし"); // "sandstorm
+static const u8 sDebugText_Weather_Fog2[] = _("きり2  "); // "fog2"
+static const u8 sDebugText_Weather_Underwater[] = _("かいてい "); // "undersea"
+static const u8 sDebugText_Weather_Cloudy[] = _("くもり  "); // "cloudy"
+static const u8 sDebugText_Weather_Clear3[] = _("はれ3  "); // "clear3"
+static const u8 sDebugText_Weather_HeavyRain[] = _("おおあめ"); // "heavy rain"
+static const u8 sDebugText_Weather_Underwater2[] = _("かいてい2"); // "undersea2"
+
+static const u8 *const sDebugText_Weather[] =
+{
+ [WEATHER_NONE] = sDebugText_Weather_None,
+ [WEATHER_CLOUDS] = sDebugText_Weather_Clear,
+ [WEATHER_SUNNY] = sDebugText_Weather_Clear2,
+ [WEATHER_RAIN_LIGHT] = sDebugText_Weather_Rain,
+ [WEATHER_SNOW] = sDebugText_Weather_Snow,
+ [WEATHER_RAIN_MED] = sDebugText_Weather_Lightning,
+ [WEATHER_FOG_1] = sDebugText_Weather_Fog,
+ [WEATHER_ASH] = sDebugText_Weather_VolcanicAsh,
+ [WEATHER_SANDSTORM] = sDebugText_Weather_Sandstorm,
+ [WEATHER_FOG_2] = sDebugText_Weather_Fog2,
+ [WEATHER_FOG_3] = sDebugText_Weather_Underwater,
+ [WEATHER_SHADE] = sDebugText_Weather_Cloudy,
+ [WEATHER_DROUGHT] = sDebugText_Weather_Clear3,
+ [WEATHER_RAIN_HEAVY] = sDebugText_Weather_HeavyRain,
+ [WEATHER_BUBBLES] = sDebugText_Weather_Underwater2,
+};
+
+#endif
+
+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);
+ BuildGammaShiftTables();
+ gWeatherPtr->altGammaSpritePalIndex = index;
+ gWeatherPtr->weatherPicSpritePalIndex = 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->lightenedFogSpritePalsCount = 0;
+ Weather_SetBlendCoeffs(16, 0);
+ gWeatherPtr->currWeather = 0;
+ gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE;
+ gWeatherPtr->readyForInit = FALSE;
+ gWeatherPtr->weatherChangeComplete = TRUE;
+ gWeatherPtr->taskId = CreateTask(Task_WeatherInit, 80);
+ }
+}
+
+void ChangeWeather(u8 weather)
+{
+ if (weather != WEATHER_RAIN_LIGHT && weather != WEATHER_RAIN_MED && weather != WEATHER_RAIN_HEAVY)
+ {
+ PlayRainSoundEffect();
+ }
+
+ if (gWeatherPtr->nextWeather != weather && gWeatherPtr->currWeather == weather)
+ {
+ sWeatherFuncs[weather].initVars();
+ }
+
+ gWeatherPtr->weatherChangeComplete = FALSE;
+ gWeatherPtr->nextWeather = weather;
+ gWeatherPtr->finishStep = 0;
+}
+
+void sub_807C988(u8 weather)
+{
+ PlayRainSoundEffect();
+ gWeatherPtr->currWeather = weather;
+ gWeatherPtr->nextWeather = weather;
+}
+
+void sub_807C9B4(u8 weather)
+{
+ PlayRainSoundEffect();
+ gWeatherPtr->currWeather = weather;
+ gWeatherPtr->nextWeather = weather;
+ gWeatherPtr->readyForInit = TRUE;
+}
+
+void Task_WeatherInit(u8 taskId)
+{
+ // Waits until it's ok to initialize weather.
+ // When the screen fades in, this is set to TRUE.
+ if (gWeatherPtr->readyForInit)
+ {
+ sWeatherFuncs[gWeatherPtr->currWeather].initAll();
+ gTasks[taskId].func = Task_WeatherMain;
+ }
+}
+
+void Task_WeatherMain(u8 taskId)
+{
+ if (gWeatherPtr->currWeather != gWeatherPtr->nextWeather)
+ {
+ if (!sWeatherFuncs[gWeatherPtr->currWeather].finish())
+ {
+ // Finished cleaning up previous weather. Now transition to next weather.
+ sWeatherFuncs[gWeatherPtr->nextWeather].initVars();
+ gWeatherPtr->gammaStepFrameCounter = 0;
+ gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_CHANGING_WEATHER;
+ gWeatherPtr->currWeather = gWeatherPtr->nextWeather;
+ gWeatherPtr->weatherChangeComplete = TRUE;
+ }
+ }
+ else
+ {
+ sWeatherFuncs[gWeatherPtr->currWeather].main();
+ }
+
+ gWeatherPalStateFuncs[gWeatherPtr->palProcessingState]();
+}
+
+void None_Init(void)
+{
+ gWeatherPtr->gammaTargetIndex = 0;
+ gWeatherPtr->gammaStepDelay = 0;
+}
+
+void None_Main(void)
+{
+}
+
+u8 None_Finish(void)
+{
+ return 0;
+}
+
+// Builds two tables that contain gamma shifts for palette colors.
+// It's unclear why the two tables aren't declared as const arrays, since
+// this function always builds the same two tables.
+static void BuildGammaShiftTables(void)
+{
+ u16 v0;
+ u8 (*v1)[32];
+ u16 v2;
+ u16 v4;
+ u16 v5;
+ u16 v6;
+ u16 v9;
+ u32 v10;
+ u16 v11;
+ s16 dunno;
+
+ sPaletteGammaTypes = sBasePaletteGammaTypes;
+ for (v0 = 0; v0 <= 1; v0++)
+ {
+ if (v0 == 0)
+ v1 = gWeatherPtr->gammaShifts;
+ else
+ v1 = gWeatherPtr->altGammaShifts;
+
+ for (v2 = 0; v2 < 32; 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 < 12)
+ {
+ for (; v6 < 19; 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 < 19; v6++)
+ {
+ v4 += v11;
+ v1[v6][v2] = v4 >> 8;
+ if (v1[v6][v2] > 0x1f)
+ v1[v6][v2] = 0x1f;
+ }
+ }
+ }
+ }
+}
+
+// When the weather is changing, it gradually updates the palettes
+// towards the desired gamma shift.
+static void UpdateWeatherGammaShift(void)
+{
+ if (gWeatherPtr->gammaIndex == gWeatherPtr->gammaTargetIndex)
+ {
+ gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE;
+ }
+ else
+ {
+ if (++gWeatherPtr->gammaStepFrameCounter >= gWeatherPtr->gammaStepDelay)
+ {
+ gWeatherPtr->gammaStepFrameCounter = 0;
+ if (gWeatherPtr->gammaIndex < gWeatherPtr->gammaTargetIndex)
+ gWeatherPtr->gammaIndex++;
+ else
+ gWeatherPtr->gammaIndex--;
+
+ ApplyGammaShift(0, 32, gWeatherPtr->gammaIndex);
+ }
+ }
+}
+
+static void FadeInScreenWithWeather(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_SHADE:
+ if (FadeInScreen_RainShowShade() == FALSE)
+ {
+ gWeatherPtr->gammaIndex = 3;
+ gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE;
+ }
+ break;
+ case WEATHER_DROUGHT:
+ if (FadeInScreen_Drought() == FALSE)
+ {
+ gWeatherPtr->gammaIndex = -6;
+ gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE;
+ }
+ break;
+ case WEATHER_FOG_1:
+ if (FadeInScreen_Fog1() == FALSE)
+ {
+ gWeatherPtr->gammaIndex = 0;
+ gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE;
+ }
+ break;
+ case WEATHER_ASH:
+ case WEATHER_SANDSTORM:
+ case WEATHER_FOG_2:
+ case WEATHER_FOG_3:
+ default:
+ if (!gPaletteFade.active)
+ {
+ gWeatherPtr->gammaIndex = gWeatherPtr->gammaTargetIndex;
+ gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE;
+ }
+ break;
+ }
+}
+
+bool8 FadeInScreen_RainShowShade(void)
+{
+ if (gWeatherPtr->fadeScreenCounter == 16)
+ return FALSE;
+
+ if (++gWeatherPtr->fadeScreenCounter >= 16)
+ {
+ ApplyGammaShift(0, 32, 3);
+ gWeatherPtr->fadeScreenCounter = 16;
+ return FALSE;
+ }
+
+ ApplyGammaShiftWithBlend(0, 32, 3, 16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor);
+ return TRUE;
+}
+
+bool8 FadeInScreen_Drought(void)
+{
+ if (gWeatherPtr->fadeScreenCounter == 16)
+ return FALSE;
+
+ if (++gWeatherPtr->fadeScreenCounter >= 16)
+ {
+ ApplyGammaShift(0, 32, -6);
+ gWeatherPtr->fadeScreenCounter = 16;
+ return FALSE;
+ }
+
+ ApplyDroughtGammaShiftWithBlend(-6, 16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor);
+ return TRUE;
+}
+
+bool8 FadeInScreen_Fog1(void)
+{
+ if (gWeatherPtr->fadeScreenCounter == 16)
+ return FALSE;
+
+ gWeatherPtr->fadeScreenCounter++;
+ ApplyFogBlend(16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor);
+ return TRUE;
+}
+
+static void DoNothing(void)
+{ }
+
+static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex)
+{
+ u16 curPalIndex;
+ u16 palOffset;
+ u8 *gammaTable;
+ u16 i;
+
+ if (gammaIndex > 0)
+ {
+ gammaIndex--;
+ palOffset = startPalIndex * 16;
+ numPalettes += startPalIndex;
+ curPalIndex = startPalIndex;
+
+ // Loop through the speficied palette range and apply necessary gamma shifts to the colors.
+ while (curPalIndex < numPalettes)
+ {
+ if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE)
+ {
+ // No palette change.
+ CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16));
+ palOffset += 16;
+ }
+ else
+ {
+ u8 r, g, b;
+
+ if (sPaletteGammaTypes[curPalIndex] == GAMMA_ALT || curPalIndex - 16 == gWeatherPtr->altGammaSpritePalIndex)
+ gammaTable = gWeatherPtr->altGammaShifts[gammaIndex];
+ else
+ gammaTable = gWeatherPtr->gammaShifts[gammaIndex];
+
+ if (curPalIndex == 16 || curPalIndex > 27)
+ {
+ for (i = 0; i < 16; i++)
+ {
+ if (gPlttBufferUnfaded[palOffset] == RGB(31, 12, 11))
+ {
+ // Skip gamma shift for this specific color. (Why?)
+ palOffset++;
+ }
+ else
+ {
+ // Apply gamma shift to the original color.
+ struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset];
+ r = gammaTable[baseColor.r];
+ g = gammaTable[baseColor.g];
+ b = gammaTable[baseColor.b];
+ gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r;
+ }
+ }
+ }
+ else
+ {
+ for (i = 0; i < 16; i++)
+ {
+ // Apply gamma shift to the original color.
+ struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset];
+ r = gammaTable[baseColor.r];
+ g = gammaTable[baseColor.g];
+ b = gammaTable[baseColor.b];
+ gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r;
+ }
+ }
+ }
+
+ curPalIndex++;
+ }
+ }
+ else if (gammaIndex < 0)
+ {
+ // A negative gammIndex value means that the blending will come from the special Drought weather's palette tables.
+ gammaIndex = -gammaIndex - 1;
+ palOffset = startPalIndex * 16;
+ numPalettes += startPalIndex;
+ curPalIndex = startPalIndex;
+
+ while (curPalIndex < numPalettes)
+ {
+ if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE)
+ {
+ // No palette change.
+ CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16));
+ palOffset += 16;
+ }
+ else
+ {
+ if (curPalIndex == 16 || curPalIndex > 27)
+ {
+ for (i = 0; i < 16; i++)
+ {
+ // Skip gamma shift for this specific color. (Why?)
+ if (gPlttBufferUnfaded[palOffset] != RGB(31, 12, 11))
+ gPlttBufferFaded[palOffset] = eDroughtPaletteData.gammaShiftColors[gammaIndex][MACRO1(gPlttBufferUnfaded[palOffset])];
+
+ palOffset++;
+ }
+ }
+ else
+ {
+ for (i = 0; i < 16; i++)
+ {
+ gPlttBufferFaded[palOffset] = eDroughtPaletteData.gammaShiftColors[gammaIndex][MACRO1(gPlttBufferUnfaded[palOffset])];
+ palOffset++;
+ }
+ }
+ }
+
+ curPalIndex++;
+ }
+ }
+ else
+ {
+ // No palette blending.
+ CpuFastCopy(gPlttBufferUnfaded + startPalIndex * 16, gPlttBufferFaded + startPalIndex * 16, numPalettes * 16 * sizeof(u16));
+ }
+}
+
+static void ApplyGammaShiftWithBlend(u8 startPalIndex, u8 numPalettes, s8 gammaIndex, u8 blendCoeff, u16 blendColor)
+{
+ u16 palOffset;
+ u16 curPalIndex;
+ u16 i;
+ struct RGBColor color = *(struct RGBColor *)&blendColor;
+ u8 rBlend = color.r;
+ u8 gBlend = color.g;
+ u8 bBlend = color.b;
+
+ palOffset = startPalIndex * 16;
+ numPalettes += startPalIndex;
+ gammaIndex--;
+ curPalIndex = startPalIndex;
+
+ while (curPalIndex < numPalettes)
+ {
+ if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE)
+ {
+ // No gamma shift. Simply blend the colors.
+ BlendPalette(palOffset, 16, blendCoeff, blendColor);
+ palOffset += 16;
+ }
+ else
+ {
+ u8 *gammaTable;
+
+ if (sPaletteGammaTypes[curPalIndex] == GAMMA_NORMAL)
+ gammaTable = gWeatherPtr->gammaShifts[gammaIndex];
+ else
+ gammaTable = gWeatherPtr->altGammaShifts[gammaIndex];
+
+ for (i = 0; i < 16; i++)
+ {
+ struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset];
+ u8 r = gammaTable[baseColor.r];
+ u8 g = gammaTable[baseColor.g];
+ u8 b = gammaTable[baseColor.b];
+
+ // Apply gamma shift and target blend color to the original color.
+ r += ((rBlend - r) * blendCoeff) >> 4;
+ g += ((gBlend - g) * blendCoeff) >> 4;
+ b += ((bBlend - b) * blendCoeff) >> 4;
+ gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r;
+ }
+ }
+
+ curPalIndex++;
+ }
+}
+
+void ApplyDroughtGammaShiftWithBlend(s8 gammaIndex, u8 blendCoeff, u16 blendColor)
+{
+ struct RGBColor color;
+ u8 rBlend;
+ u8 gBlend;
+ u8 bBlend;
+ u16 curPalIndex;
+ u16 palOffset;
+ u16 i;
+
+ gammaIndex = -gammaIndex - 1;
+ color = *(struct RGBColor *)&blendColor;
+ rBlend = color.r;
+ gBlend = color.g;
+ bBlend = color.b;
+ palOffset = 0;
+ for (curPalIndex = 0; curPalIndex < 32; curPalIndex++)
+ {
+ if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE)
+ {
+ // No gamma shift. Simply blend the colors.
+ BlendPalette(palOffset, 16, blendCoeff, blendColor);
+ palOffset += 16;
+ }
+ else
+ {
+ for (i = 0; i < 16; i++)
+ {
+ 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 *)&eDroughtPaletteData.gammaShiftColors[gammaIndex][offset];
+ r2 = color2.r;
+ g2 = color2.g;
+ b2 = color2.b;
+
+ r2 += ((rBlend - r2) * blendCoeff) >> 4;
+ g2 += ((gBlend - g2) * blendCoeff) >> 4;
+ b2 += ((bBlend - b2) * blendCoeff) >> 4;
+
+ gPlttBufferFaded[palOffset++] = (b2 << 10) | (g2 << 5) | r2;
+ }
+ }
+ }
+}
+
+void ApplyFogBlend(u8 blendCoeff, u16 blendColor)
+{
+ struct RGBColor color;
+ u8 rBlend;
+ u8 gBlend;
+ u8 bBlend;
+ u16 curPalIndex;
+
+ BlendPalette(0, 0x100, blendCoeff, blendColor);
+ color = *(struct RGBColor *)&blendColor;
+ rBlend = color.r;
+ gBlend = color.g;
+ bBlend = color.b;
+
+ for (curPalIndex = 16; curPalIndex < 32; curPalIndex++)
+ {
+ if (LightenSpritePaletteInFog(curPalIndex))
+ {
+ u16 palEnd = (curPalIndex + 1) * 16;
+ u16 palOffset = curPalIndex * 16;
+
+ while (palOffset < palEnd)
+ {
+ struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset];
+ 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 += ((rBlend - r) * blendCoeff) >> 4;
+ g += ((gBlend - g) * blendCoeff) >> 4;
+ b += ((bBlend - b) * blendCoeff) >> 4;
+
+ gPlttBufferFaded[palOffset] = (b << 10) | (g << 5) | r;
+ palOffset++;
+ }
+ }
+ else
+ {
+ BlendPalette(curPalIndex * 16, 16, blendCoeff, blendColor);
+ }
+ }
+}
+
+static void MarkFogSpritePalToLighten(u8 paletteIndex)
+{
+ if (gWeatherPtr->lightenedFogSpritePalsCount < 6)
+ {
+ gWeatherPtr->lightenedFogSpritePals[gWeatherPtr->lightenedFogSpritePalsCount] = paletteIndex;
+ gWeatherPtr->lightenedFogSpritePalsCount++;
+ }
+}
+
+static bool8 LightenSpritePaletteInFog(u8 paletteIndex)
+{
+ u16 i;
+
+ for (i = 0; i < gWeatherPtr->lightenedFogSpritePalsCount; i++)
+ {
+ if (gWeatherPtr->lightenedFogSpritePals[i] == paletteIndex)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void sub_807D5BC(s8 gammaIndex)
+{
+ if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE)
+ {
+ ApplyGammaShift(0, 32, gammaIndex);
+ gWeatherPtr->gammaIndex = gammaIndex;
+ }
+}
+
+void sub_807D5F0(u8 gammaIndex, u8 gammaTargetIndex, u8 gammaStepDelay)
+{
+ if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE)
+ {
+ gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_CHANGING_WEATHER;
+ gWeatherPtr->gammaIndex = gammaIndex;
+ gWeatherPtr->gammaTargetIndex = gammaTargetIndex;
+ gWeatherPtr->gammaStepFrameCounter = 0;
+ gWeatherPtr->gammaStepDelay = gammaStepDelay;
+ sub_807D5BC(gammaIndex);
+ }
+}
+
+void FadeScreen(u8 mode, u8 delay)
+{
+ u32 fadeColor;
+ bool8 fadeOut;
+ bool8 useWeatherPal;
+
+ switch (mode)
+ {
+ case FADE_FROM_BLACK:
+ fadeColor = 0;
+ fadeOut = FALSE;
+ break;
+ case FADE_FROM_WHITE:
+ fadeColor = 0xFFFF;
+ fadeOut = FALSE;
+ break;
+ case FADE_TO_BLACK:
+ fadeColor = 0;
+ fadeOut = TRUE;
+ break;
+ case FADE_TO_WHITE:
+ fadeColor = 0xFFFF;
+ fadeOut = TRUE;
+ 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_SHADE:
+ case WEATHER_DROUGHT:
+ useWeatherPal = TRUE;
+ break;
+ default:
+ useWeatherPal = FALSE;
+ break;
+ }
+
+ if (fadeOut)
+ {
+ if (useWeatherPal)
+ CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, 0x400);
+
+ BeginNormalPaletteFade(0xFFFFFFFF, delay, 0, 16, fadeColor);
+ gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_OUT;
+ }
+ else
+ {
+ gWeatherPtr->fadeDestColor = fadeColor;
+ if (useWeatherPal)
+ gWeatherPtr->fadeScreenCounter = 0;
+ else
+ BeginNormalPaletteFade(0xFFFFFFFF, delay, 16, 0, fadeColor);
+
+ gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_IN;
+ gWeatherPtr->unknown_6CA = 1;
+ gWeatherPtr->unknown_6CB = 0;
+ Weather_SetBlendCoeffs(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB);
+ gWeatherPtr->readyForInit = TRUE;
+ }
+}
+
+bool8 IsWeatherNotFadingIn(void)
+{
+ return (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_SCREEN_FADING_IN);
+}
+
+void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex)
+{
+ u16 paletteIndex = 16 + spritePaletteIndex;
+ u16 i;
+
+ switch (gWeatherPtr->palProcessingState)
+ {
+ case WEATHER_PAL_STATE_SCREEN_FADING_IN:
+ if (gWeatherPtr->unknown_6CA != 0)
+ {
+ if (gWeatherPtr->currWeather == WEATHER_FOG_1)
+ MarkFogSpritePalToLighten(paletteIndex);
+ paletteIndex *= 16;
+ for (i = 0; i < 16; i++)
+ gPlttBufferFaded[paletteIndex + i] = gWeatherPtr->fadeDestColor;
+ }
+ break;
+ case WEATHER_PAL_STATE_SCREEN_FADING_OUT:
+ paletteIndex *= 16;
+ CpuFastCopy(gPlttBufferFaded + paletteIndex, gPlttBufferUnfaded + paletteIndex, 32);
+ BlendPalette(paletteIndex, 16, gPaletteFade.y, gPaletteFade.blendColor);
+ break;
+ // WEATHER_PAL_STATE_CHANGING_WEATHER
+ // WEATHER_PAL_STATE_CHANGING_IDLE
+ default:
+ if (gWeatherPtr->currWeather != WEATHER_FOG_1)
+ {
+ ApplyGammaShift(paletteIndex, 1, gWeatherPtr->gammaIndex);
+ }
+ else
+ {
+ paletteIndex *= 16;
+ BlendPalette(paletteIndex, 16, 12, 0x73FC);
+ }
+ break;
+ }
+}
+
+void ApplyWeatherGammaShiftToPal(u8 paletteIndex)
+{
+ ApplyGammaShift(paletteIndex, 1, gWeatherPtr->gammaIndex);
+}
+
+u8 unref_sub_807D894(void)
+{
+ if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_SCREEN_FADING_IN)
+ return gWeatherPtr->unknown_6CA;
+ else
+ return 0;
+}
+
+void LoadCustomWeatherSpritePalette(const u16 *palette)
+{
+ LoadPalette(palette, 0x100 + gWeatherPtr->weatherPicSpritePalIndex * 16, 32);
+ UpdateSpritePaletteWithWeather(gWeatherPtr->weatherPicSpritePalIndex);
+}
+
+static void LoadDroughtWeatherPalette(u8 *gammaIndexPtr, u8 *b)
+{
+ u8 gammaIndex = *gammaIndexPtr;
+ u16 i;
+
+ if (gammaIndex < 7)
+ {
+ gammaIndex--;
+ LZ77UnCompWram(sCompressedDroughtPalettes[gammaIndex], eDroughtPaletteData.gammaShiftColors[gammaIndex]);
+ if (gammaIndex == 0)
+ {
+ eDroughtPaletteData.gammaShiftColors[gammaIndex][0] = RGB(1, 1, 1);
+ for (i = 1; i < 0x1000; i++)
+ eDroughtPaletteData.gammaShiftColors[gammaIndex][i] += eDroughtPaletteData.gammaShiftColors[gammaIndex][i - 1];
+ }
+ else
+ {
+ for (i = 0; i < 0x1000; i++)
+ eDroughtPaletteData.gammaShiftColors[gammaIndex][i] += eDroughtPaletteData.gammaShiftColors[gammaIndex - 1][i];
+ }
+ if (++(*gammaIndexPtr) == 7)
+ {
+ *gammaIndexPtr = 32;
+ *b = 32;
+ }
+ }
+}
+
+void ResetDroughtWeatherPaletteLoading(void)
+{
+ gWeatherPtr->loadDroughtPalsIndex = 1;
+ gWeatherPtr->loadDroughtPalsOffset = 1;
+}
+
+bool8 LoadDroughtWeatherPalettes(void)
+{
+ if (gWeatherPtr->loadDroughtPalsIndex < 32)
+ {
+ LoadDroughtWeatherPalette(&gWeatherPtr->loadDroughtPalsIndex, &gWeatherPtr->loadDroughtPalsOffset);
+ if (gWeatherPtr->loadDroughtPalsIndex < 32)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_807DA04(s8 gammaIndex)
+{
+ sub_807D5BC(-gammaIndex - 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->blendFrameCounter = 0;
+ gWeatherPtr->blendUpdateCounter = 0;
+}
+
+bool8 Weather_UpdateBlend(void)
+{
+ if (gWeatherPtr->currBlendEVA == gWeatherPtr->targetBlendEVA
+ && gWeatherPtr->currBlendEVB == gWeatherPtr->targetBlendEVB)
+ return TRUE;
+
+ if (++gWeatherPtr->blendFrameCounter > gWeatherPtr->blendDelay)
+ {
+ gWeatherPtr->blendFrameCounter = 0;
+ gWeatherPtr->blendUpdateCounter++;
+
+ // Update currBlendEVA and currBlendEVB on alternate frames
+ if (gWeatherPtr->blendUpdateCounter & 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(WEATHER_CLOUDS);
+ break;
+ case 2:
+ SetWeather(WEATHER_SUNNY);
+ break;
+ case 3:
+ SetWeather(WEATHER_RAIN_LIGHT);
+ break;
+ case 4:
+ SetWeather(WEATHER_SNOW);
+ break;
+ case 5:
+ SetWeather(WEATHER_RAIN_MED);
+ break;
+ case 6:
+ SetWeather(WEATHER_FOG_1);
+ break;
+ case 7:
+ SetWeather(WEATHER_FOG_2);
+ break;
+ case 8:
+ SetWeather(WEATHER_ASH);
+ break;
+ case 9:
+ SetWeather(WEATHER_SANDSTORM);
+ break;
+ case 10:
+ SetWeather(WEATHER_SHADE);
+ break;
+ }
+}
+
+u8 GetCurrentWeather(void)
+{
+ return gWeatherPtr->currWeather;
+}
+
+void SetRainStrengthFromSoundEffect(u16 soundEffect)
+{
+ if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_SCREEN_FADING_OUT)
+ {
+ switch (soundEffect)
+ {
+ 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(soundEffect);
+ }
+}
+
+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 IsWeatherChangeComplete(void)
+{
+ return gWeatherPtr->weatherChangeComplete;
+}
+
+void SetWeatherScreenFadeOut(void)
+{
+ gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_OUT;
+}
+
+void unref_sub_807DE24(void)
+{
+ gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE;
+}
+
+void PreservePaletteInWeather(u8 preservedPalIndex)
+{
+ CpuCopy16(sBasePaletteGammaTypes, gFieldEffectPaletteGammaTypes, 32);
+ gFieldEffectPaletteGammaTypes[preservedPalIndex] = GAMMA_NONE;
+ sPaletteGammaTypes = gFieldEffectPaletteGammaTypes;
+}
+
+void ResetPreservedPalettesInWeather(void)
+{
+ sPaletteGammaTypes = sBasePaletteGammaTypes;
+}
+
+#if DEBUG
+
+EWRAM_DATA static u8 sSelectedDebugWeather = 0;
+
+bool8 debug_sub_8085564(void)
+{
+ bool8 changed = FALSE;
+
+ if (gMain.newKeys & R_BUTTON)
+ {
+ sSelectedDebugWeather++;
+ if (sSelectedDebugWeather == 15)
+ sSelectedDebugWeather = 0;
+ changed = TRUE;
+ }
+ if (gMain.newKeys & L_BUTTON)
+ {
+ if (sSelectedDebugWeather != 0)
+ sSelectedDebugWeather--;
+ else
+ sSelectedDebugWeather = 14;
+ changed = TRUE;
+ }
+
+ if (changed)
+ {
+ Menu_BlankWindowRect(22, 1, 28, 2);
+ Menu_PrintText(sDebugText_Weather[sSelectedDebugWeather], 23, 1);
+ }
+
+ if (gMain.newKeys & A_BUTTON)
+ {
+ ChangeWeather(sSelectedDebugWeather);
+ CloseMenu();
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+bool8 debug_sub_808560C(void)
+{
+ sSelectedDebugWeather = gWeather.currWeather;
+ Menu_EraseScreen();
+ Menu_BlankWindowRect(22, 1, 28, 2);
+ Menu_PrintText(sDebugText_Weather[sSelectedDebugWeather], 23, 1);
+ gMenuCallback = debug_sub_8085564;
+ return FALSE;
+}
+
+#endif
diff --git a/src/field/field_weather_effects.c b/src/field_weather_effects.c
index 7406363a5..da3314aa1 100644
--- a/src/field/field_weather_effects.c
+++ b/src/field_weather_effects.c
@@ -1,5 +1,5 @@
#include "global.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "field_weather.h"
#include "overworld.h"
#include "random.h"
@@ -74,10 +74,7 @@ static const struct SpriteTemplate sCloudSpriteTemplate =
.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_807D5BC(s8 gammaIndex);
extern void sub_807DA14(void);
extern void sub_807DA4C(void);
extern void Weather_SetTargetBlendCoeffs(u8 a, u8 b, int c);
@@ -91,8 +88,8 @@ extern void sub_807D5F0(u8 a, u8 b, u8 c);
void Clouds_InitVars(void)
{
- gWeatherPtr->unknown_6C1 = 0;
- gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->gammaTargetIndex = 0;
+ gWeatherPtr->gammaStepDelay = 20;
gWeatherPtr->weatherGfxLoaded = FALSE;
gWeatherPtr->initStep = 0;
if (gWeatherPtr->cloudSpritesCreated == FALSE)
@@ -159,8 +156,8 @@ bool8 Clouds_Finish(void)
void Weather2_InitVars(void)
{
- gWeatherPtr->unknown_6C1 = 0;
- gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->gammaTargetIndex = 0;
+ gWeatherPtr->gammaStepDelay = 20;
}
void Weather2_InitAll(void)
@@ -184,7 +181,7 @@ void CreateCloudSprites(void)
if (gWeatherPtr->cloudSpritesCreated == TRUE)
return;
LoadSpriteSheet(&sCloudSpriteSheet);
- sub_807D8C0(gUnknown_08397108);
+ LoadCustomWeatherSpritePalette(gUnknown_08397108);
for (i = 0; i < 3; i++)
{
u8 spriteId = CreateSprite(&sCloudSpriteTemplate, 0, 0, 0xFF);
@@ -236,8 +233,8 @@ void Drought_InitVars(void)
{
gWeatherPtr->initStep = 0;
gWeatherPtr->weatherGfxLoaded = FALSE;
- gWeatherPtr->unknown_6C1 = 0;
- gWeatherPtr->unknown_6C2 = 0;
+ gWeatherPtr->gammaTargetIndex = 0;
+ gWeatherPtr->gammaStepDelay = 0;
}
void Drought_Main(void);
@@ -254,15 +251,15 @@ void Drought_Main(void)
switch (gWeatherPtr->initStep)
{
case 0:
- if (gWeatherPtr->unknown_6C6 != 0)
+ if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_CHANGING_WEATHER)
gWeatherPtr->initStep++;
break;
case 1:
- sub_807D9A8();
+ ResetDroughtWeatherPaletteLoading();
gWeatherPtr->initStep++;
break;
case 2:
- if (sub_807D9C8() == FALSE)
+ if (LoadDroughtWeatherPalettes() == FALSE)
gWeatherPtr->initStep++;
break;
case 3:
@@ -368,8 +365,8 @@ void LightRain_InitVars(void)
gWeatherPtr->unknown_6DB = 8;
gWeatherPtr->unknown_6DC = 0;
gWeatherPtr->unknown_6D9 = 10;
- gWeatherPtr->unknown_6C1 = 3;
- gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->gammaTargetIndex = 3;
+ gWeatherPtr->gammaStepDelay = 20;
SetRainStrengthFromSoundEffect(SE_T_KOAME);
}
@@ -885,8 +882,8 @@ void Snow_InitVars(void)
{
gWeatherPtr->initStep = 0;
gWeatherPtr->weatherGfxLoaded = FALSE;
- gWeatherPtr->unknown_6C1 = 3;
- gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->gammaTargetIndex = 3;
+ gWeatherPtr->gammaStepDelay = 20;
gWeatherPtr->unknown_6E5 = 16;
gWeatherPtr->unknown_6E0 = 0;
}
@@ -1074,8 +1071,8 @@ void MedRain_InitVars(void)
gWeatherPtr->unknown_6DB = 4;
gWeatherPtr->unknown_6DC = 0;
gWeatherPtr->unknown_6D9 = 16;
- gWeatherPtr->unknown_6C1 = 3;
- gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->gammaTargetIndex = 3;
+ gWeatherPtr->gammaStepDelay = 20;
gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment
gWeatherPtr->unknown_6ED = 0;
SetRainStrengthFromSoundEffect(SE_T_AME);
@@ -1102,8 +1099,8 @@ void HeavyRain_InitVars(void)
gWeatherPtr->unknown_6DB = 4;
gWeatherPtr->unknown_6DC = 1;
gWeatherPtr->unknown_6D9 = 24;
- gWeatherPtr->unknown_6C1 = 3;
- gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->gammaTargetIndex = 3;
+ gWeatherPtr->gammaStepDelay = 20;
gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment
SetRainStrengthFromSoundEffect(SE_T_OOAME);
}
@@ -1139,7 +1136,7 @@ void Rain_Main(void)
gWeatherPtr->initStep++;
break;
case 3:
- if (gWeatherPtr->unknown_6C6 == 0)
+ if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_CHANGING_WEATHER)
break;
gWeatherPtr->initStep = 6;
break;
@@ -1213,7 +1210,7 @@ void Rain_Main(void)
gWeatherPtr->initStep++;
break;
case 14:
- if (gWeatherPtr->unknown_6C6 != 3)
+ if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_IDLE)
break;
gWeatherPtr->unknown_6EA = 1;
gWeatherPtr->initStep = 4;
@@ -1296,8 +1293,8 @@ void Fog1_InitVars(void)
{
gWeatherPtr->initStep = 0;
gWeatherPtr->weatherGfxLoaded = FALSE;
- gWeatherPtr->unknown_6C1 = 0;
- gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->gammaTargetIndex = 0;
+ gWeatherPtr->gammaStepDelay = 20;
if (gWeatherPtr->fog1SpritesCreated == 0)
{
gWeatherPtr->unknown_6F0 = 0;
@@ -1446,8 +1443,8 @@ void Ash_InitVars(void)
{
gWeatherPtr->initStep = 0;
gWeatherPtr->weatherGfxLoaded = FALSE;
- gWeatherPtr->unknown_6C1 = 0;
- gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->gammaTargetIndex = 0;
+ gWeatherPtr->gammaStepDelay = 20;
gWeatherPtr->unknown_6FE = 20;
if (!gWeatherPtr->ashSpritesCreated)
{
@@ -1634,8 +1631,8 @@ void Fog2_InitVars(void)
{
gWeatherPtr->initStep = 0;
gWeatherPtr->weatherGfxLoaded = 0;
- gWeatherPtr->unknown_6C1 = 0;
- gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->gammaTargetIndex = 0;
+ gWeatherPtr->gammaStepDelay = 20;
gWeatherPtr->unknown_6F0 = 0;
gWeatherPtr->unknown_6F2 = 1;
if (gWeatherPtr->fog2SpritesCreated == 0)
@@ -1835,8 +1832,8 @@ void Sandstorm_InitVars(void)
{
gWeatherPtr->initStep = 0;
gWeatherPtr->weatherGfxLoaded = 0;
- gWeatherPtr->unknown_6C1 = 0;
- gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->gammaTargetIndex = 0;
+ gWeatherPtr->gammaStepDelay = 20;
if (gWeatherPtr->sandstormSprites1Created == 0)
{
gWeatherPtr->unknown_704 = gWeatherPtr->unknown_708 = 0;
@@ -2015,7 +2012,7 @@ void CreateSandstormSprites_1(void)
if (!gWeatherPtr->sandstormSprites1Created)
{
LoadSpriteSheet(&sSandstormSpriteSheet);
- sub_807D8C0(gUnknown_08397128);
+ LoadCustomWeatherSpritePalette(gUnknown_08397128);
for (i = 0; i < 20; i++)
{
u8 spriteId = CreateSpriteAtEnd(&sSandstormSpriteTemplate, 0, (i / 5) * 64, 1);
@@ -2113,26 +2110,26 @@ void SandstormSpriteCallback3(struct Sprite *sprite)
}
//------------------------------------------------------------------------------
-// Weather 11
+// Shade
//------------------------------------------------------------------------------
-void Weather11_InitVars(void)
+void Shade_InitVars(void)
{
gWeatherPtr->initStep = 0;
- gWeatherPtr->unknown_6C1 = 3;
- gWeatherPtr->unknown_6C2 = 20;
+ gWeatherPtr->gammaTargetIndex = 3;
+ gWeatherPtr->gammaStepDelay = 20;
}
-void Weather11_InitAll(void)
+void Shade_InitAll(void)
{
- Weather11_InitVars();
+ Shade_InitVars();
}
-void Weather11_Main(void)
+void Shade_Main(void)
{
}
-bool8 Weather11_Finish(void)
+bool8 Shade_Finish(void)
{
return FALSE;
}
@@ -2295,13 +2292,12 @@ void unc_0807DAB4(struct Sprite *sprite)
//------------------------------------------------------------------------------
-u8 TranslateWeatherNum(u8);
-void UpdateRainCounter(u8, u8);
+static u8 TranslateWeatherNum(u8);
+static void UpdateRainCounter(u8, u8);
void SetSav1Weather(u32 weather)
{
u8 oldWeather = gSaveBlock1.weather;
-
gSaveBlock1.weather = TranslateWeatherNum(weather);
UpdateRainCounter(gSaveBlock1.weather, oldWeather);
}
@@ -2314,7 +2310,6 @@ u8 GetSav1Weather(void)
void SetSav1WeatherFromCurrMapHeader(void)
{
u8 oldWeather = gSaveBlock1.weather;
-
gSaveBlock1.weather = TranslateWeatherNum(gMapHeader.weather);
UpdateRainCounter(gSaveBlock1.weather, oldWeather);
}
@@ -2322,7 +2317,7 @@ void SetSav1WeatherFromCurrMapHeader(void)
void SetWeather(u32 weather)
{
SetSav1Weather(weather);
- DoWeatherEffect(GetSav1Weather());
+ ChangeWeather(GetSav1Weather());
}
void SetWeather_Unused(u32 weather)
@@ -2333,7 +2328,7 @@ void SetWeather_Unused(u32 weather)
void DoCurrentWeather(void)
{
- DoWeatherEffect(GetSav1Weather());
+ ChangeWeather(GetSav1Weather());
}
void sub_8080750(void)
@@ -2341,42 +2336,54 @@ void sub_8080750(void)
sub_807C988(GetSav1Weather());
}
-static const u8 sWeatherCycle1[] = {2, 3, 5, 3};
-static const u8 sWeatherCycle2[] = {2, 2, 3, 2};
+static const u8 sWeatherCycleRoute119[] =
+{
+ WEATHER_SUNNY,
+ WEATHER_RAIN_LIGHT,
+ WEATHER_RAIN_MED,
+ WEATHER_RAIN_LIGHT,
+};
+static const u8 sWeatherCycleRoute123[] =
+{
+ WEATHER_SUNNY,
+ WEATHER_SUNNY,
+ WEATHER_RAIN_LIGHT,
+ WEATHER_SUNNY,
+};
-u8 TranslateWeatherNum(u8 weather)
+static 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;
+ case WEATHER_NONE: return WEATHER_NONE;
+ case WEATHER_CLOUDS: return WEATHER_CLOUDS;
+ case WEATHER_SUNNY: return WEATHER_SUNNY;
+ case WEATHER_RAIN_LIGHT: return WEATHER_RAIN_LIGHT;
+ case WEATHER_SNOW: return WEATHER_SNOW;
+ case WEATHER_RAIN_MED: return WEATHER_RAIN_MED;
+ case WEATHER_FOG_1: return WEATHER_FOG_1;
+ case WEATHER_ASH: return WEATHER_ASH;
+ case WEATHER_SANDSTORM: return WEATHER_SANDSTORM;
+ case WEATHER_FOG_2: return WEATHER_FOG_2;
+ case WEATHER_FOG_3: return WEATHER_FOG_3;
+ case WEATHER_SHADE: return WEATHER_SHADE;
+ case WEATHER_DROUGHT: return WEATHER_DROUGHT;
+ case WEATHER_RAIN_HEAVY: return WEATHER_RAIN_HEAVY;
+ case WEATHER_BUBBLES: return WEATHER_BUBBLES;
+ case WEATHER_ROUTE119_CYCLE: return sWeatherCycleRoute119[gSaveBlock1.weatherCycleStage];
+ case WEATHER_ROUTE123_CYCLE: return sWeatherCycleRoute123[gSaveBlock1.weatherCycleStage];
+ default: return WEATHER_NONE;
}
}
void UpdateWeatherPerDay(u16 increment)
{
- u16 weatherStage = gSaveBlock1.filler_2F + increment;
+ u16 weatherStage = gSaveBlock1.weatherCycleStage + increment;
weatherStage %= 4;
- gSaveBlock1.filler_2F = weatherStage;
+ gSaveBlock1.weatherCycleStage = weatherStage;
}
-void UpdateRainCounter(u8 newWeather, u8 oldWeather)
+static void UpdateRainCounter(u8 newWeather, u8 oldWeather)
{
if (newWeather != oldWeather
&& (newWeather == WEATHER_RAIN_LIGHT || newWeather == WEATHER_RAIN_MED))
diff --git a/src/field/fieldmap.c b/src/fieldmap.c
index 7383bb174..7383bb174 100644
--- a/src/field/fieldmap.c
+++ b/src/fieldmap.c
diff --git a/src/field/fldeff_berrytree.c b/src/fldeff_berrytree.c
index 0763c0314..6b03e9952 100644
--- a/src/field/fldeff_berrytree.c
+++ b/src/fldeff_berrytree.c
@@ -1,5 +1,5 @@
#include "global.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "field_player_avatar.h"
#include "script.h"
diff --git a/src/field/fldeff_cut.c b/src/fldeff_cut.c
index 513107729..c8f942fe5 100644
--- a/src/field/fldeff_cut.c
+++ b/src/fldeff_cut.c
@@ -2,7 +2,7 @@
#include "fldeff_cut.h"
#include "field_camera.h"
#include "field_effect.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "field_player_avatar.h"
#include "fieldmap.h"
#include "map_obj_lock.h"
@@ -72,6 +72,46 @@ static const struct SpriteTemplate gSpriteTemplate_CutGrass =
.callback = sub_80A2A48,
};
+#if DEBUG
+
+void debug_sub_80AFEE4(void)
+{
+ s16 x, y;
+ u8 i, j;
+ u8 metatile;
+
+ if (npc_before_player_of_type(0x52) == TRUE)
+ {
+ gLastFieldPokeMenuOpened = 0;
+ sub_80A2634();
+ return;
+ }
+
+ PlayerGetDestCoords(&gUnknown_0203923C.x, &gUnknown_0203923C.y);
+ for (i = 0; i < 3; i++)
+ {
+ y = i - 1 + gUnknown_0203923C.y;
+ for (j = 0; j < 3; j++)
+ {
+ x = j - 1 + gUnknown_0203923C.x;
+ if (MapGridGetZCoordAt(x, y) == gUnknown_0203923C.height)
+ {
+ metatile = MapGridGetMetatileBehaviorAt(x, y);
+ if (MetatileBehavior_IsPokeGrass(metatile) == TRUE
+ || MetatileBehavior_IsAshGrass(metatile) == TRUE)
+ {
+ gLastFieldPokeMenuOpened = 0;
+ sub_80A25E8();
+ return;
+ }
+ }
+ }
+ }
+ ScriptContext2_Disable();
+}
+
+#endif
+
bool8 SetUpFieldMove_Cut(void)
{
s16 x, y;
@@ -93,7 +133,7 @@ bool8 SetUpFieldMove_Cut(void)
for(j = 0; j < 3; j++)
{
x = j - 1 + gUnknown_0203923C.x;
- if(MapGridGetZCoordAt(x, y) == (s8)gUnknown_0203923C.height)
+ if(MapGridGetZCoordAt(x, y) == gUnknown_0203923C.height)
{
tileBehavior = MapGridGetMetatileBehaviorAt(x, y);
if(MetatileBehavior_IsPokeGrass(tileBehavior) == TRUE
diff --git a/src/field/fldeff_decoration.c b/src/fldeff_decoration.c
index 37f024b9f..1859fc00b 100644
--- a/src/field/fldeff_decoration.c
+++ b/src/fldeff_decoration.c
@@ -2,7 +2,7 @@
#include "event_data.h"
#include "field_camera.h"
#include "field_effect.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "field_player_avatar.h"
#include "fieldmap.h"
#include "script.h"
diff --git a/src/field/fldeff_escalator.c b/src/fldeff_escalator.c
index 981233480..981233480 100644
--- a/src/field/fldeff_escalator.c
+++ b/src/fldeff_escalator.c
diff --git a/src/field/fldeff_flash.c b/src/fldeff_flash.c
index 22f170184..30ddd0f6c 100644
--- a/src/field/fldeff_flash.c
+++ b/src/fldeff_flash.c
@@ -71,6 +71,18 @@ 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");
+#if DEBUG
+
+void debug_sub_8122080(void)
+{
+ if (gMapHeader.cave == 1 && !FlagGet(FLAG_SYS_USE_FLASH))
+ sub_810CBFC();
+ else
+ ScriptContext2_Disable();
+}
+
+#endif
+
bool8 SetUpFieldMove_Flash(void)
{
if (gMapHeader.cave == TRUE && !FlagGet(FLAG_SYS_USE_FLASH))
diff --git a/src/field/fldeff_poison.c b/src/fldeff_poison.c
index b0052d59d..52afc2516 100644
--- a/src/field/fldeff_poison.c
+++ b/src/fldeff_poison.c
@@ -32,13 +32,13 @@ static void Task_FieldPoisonEffect(u8 taskId)
REG_MOSAIC = (data[1] << 4) | data[1];
}
-void DoFieldPoisonEffect(void)
+void FldeffPoison_Start(void)
{
PlaySE(SE_DOKU);
CreateTask(Task_FieldPoisonEffect, 80);
}
-bool32 FieldPoisonEffectIsRunning(void)
+bool32 FldeffPoison_IsActive(void)
{
return FuncIsActiveTask(Task_FieldPoisonEffect);
}
diff --git a/src/field/fldeff_recordmixing.c b/src/fldeff_recordmixing.c
index ec72885b5..716447f9c 100644
--- a/src/field/fldeff_recordmixing.c
+++ b/src/fldeff_recordmixing.c
@@ -1,5 +1,5 @@
#include "global.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "fldeff_recordmixing.h"
#include "sprite.h"
diff --git a/src/field/fldeff_secret_base_pc.c b/src/fldeff_secret_base_pc.c
index 394c4bc56..394c4bc56 100644
--- a/src/field/fldeff_secret_base_pc.c
+++ b/src/fldeff_secret_base_pc.c
diff --git a/src/field/fldeff_secretpower.c b/src/fldeff_secretpower.c
index bf8e98403..d1df03d84 100644
--- a/src/field/fldeff_secretpower.c
+++ b/src/fldeff_secretpower.c
@@ -243,6 +243,48 @@ void sub_80C6280(void)
}
}
+#if DEBUG
+
+void debug_sub_80D93F4(void)
+{
+ u8 metatile;
+
+ sub_80BB63C();
+
+ if (gSpecialVar_Result == 1 || player_get_direction_lower_nybble() != 2)
+ {
+ ScriptContext2_Disable();
+ return;
+ }
+
+ GetXYCoordsOneStepInFrontOfPlayer(&gUnknown_0203923C.x, &gUnknown_0203923C.y);
+ metatile = MapGridGetMetatileBehaviorAt(gUnknown_0203923C.x, gUnknown_0203923C.y);
+ if (MetatileBehavior_IsSecretBaseCave(metatile) == TRUE)
+ {
+ sub_80C6264();
+ gLastFieldPokeMenuOpened = 0;
+ sub_80C639C();
+ }
+ else if (MetatileBehavior_IsSecretBaseTree(metatile) == TRUE)
+ {
+ sub_80C6264();
+ gLastFieldPokeMenuOpened = 0;
+ sub_80C64A8();
+ }
+ else if (MetatileBehavior_IsSecretBaseShrub(metatile) == TRUE)
+ {
+ sub_80C6264();
+ gLastFieldPokeMenuOpened = 0;
+ sub_80C660C();
+ }
+ else
+ {
+ ScriptContext2_Disable();
+ }
+}
+
+#endif
+
bool8 SetUpFieldMove_SecretPower(void)
{
u8 behavior;
diff --git a/src/field/fldeff_softboiled.c b/src/fldeff_softboiled.c
index 3c64ec520..3c64ec520 100644
--- a/src/field/fldeff_softboiled.c
+++ b/src/fldeff_softboiled.c
diff --git a/src/field/fldeff_strength.c b/src/fldeff_strength.c
index 565ac1651..9f9cd4013 100644
--- a/src/field/fldeff_strength.c
+++ b/src/fldeff_strength.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "constants/map_objects.h"
#include "braille_puzzles.h"
#include "field_effect.h"
#include "party_menu.h"
@@ -20,6 +21,28 @@ extern void (*gUnknown_03005CE4)(void);
extern u8 S_UseStrength[];
+#if DEBUG
+void debug_sub_8130318(void)
+{
+ if (ShouldDoBrailleStrengthEffect())
+ {
+ gLastFieldPokeMenuOpened = 0;
+ gSpecialVar_Result = 0;
+ sub_811AA38();
+ }
+ else if (npc_before_player_of_type(MAP_OBJ_GFX_PUSHABLE_BOULDER) == TRUE)
+ {
+ gLastFieldPokeMenuOpened = 0;
+ gSpecialVar_Result = 0;
+ sub_811AA18();
+ }
+ else
+ {
+ ScriptContext2_Disable();
+ }
+}
+#endif
+
bool8 SetUpFieldMove_Strength(void)
{
if (ShouldDoBrailleStrengthEffect())
diff --git a/src/field/fldeff_sweetscent.c b/src/fldeff_sweetscent.c
index b9dbf619d..b9dbf619d 100644
--- a/src/field/fldeff_sweetscent.c
+++ b/src/fldeff_sweetscent.c
diff --git a/src/field/fldeff_teleport.c b/src/fldeff_teleport.c
index af48fb414..af48fb414 100644
--- a/src/field/fldeff_teleport.c
+++ b/src/fldeff_teleport.c
diff --git a/src/scene/hall_of_fame.c b/src/hall_of_fame.c
index e486c65a3..2b790e97d 100644
--- a/src/scene/hall_of_fame.c
+++ b/src/hall_of_fame.c
@@ -18,6 +18,9 @@
#include "random.h"
#include "scanline_effect.h"
#include "trig.h"
+#include "hof_pc.h"
+#include "credits.h"
+#include "pc_screen_effect.h"
#include "ewram.h"
static EWRAM_DATA u32 sUnknown_0203931C = 0;
@@ -88,15 +91,6 @@ static u32 HallOfFame_LoadPokemonPic(u16 species, s16 posX, s16 posY, u16 pokeID
static u32 HallOfFame_LoadTrainerPic(u16 trainerPicID, s16 posX, s16 posY, u16 a3);
static bool8 sub_81438C4(void);
-// functions from different files
-void sub_81439D0(void);
-void sub_80C5CD4(void*); // ?
-void sub_80C5E38(void*); // ?
-bool8 sub_80C5DCC(void);
-bool8 sub_80C5F98(void);
-void ReturnFromHallOfFamePC(void);
-u16 SpeciesToPokedexNum(u16 species);
-
// data and gfx
static const struct CompressedSpriteSheet sHallOfFame_ConfettiSpriteSheet =
@@ -130,9 +124,9 @@ static const s16 sHallOfFame_MonsHalfTeamPositions[3][4] =
{-41, 214, 184, 64}
};
-static const struct HallofFameMon sDummyFameMon =
-{
- 0x3EA03EA, 0, 0, 0, {0}
+static const struct PCScreenEffectStruct sPCScreenEffectTemplate = {
+ .tileTag = 0x3ea,
+ .paletteTag = 0x3ea
};
static const u8 sUnused2[6] = {2, 1, 3, 6, 4, 5};
@@ -800,20 +794,15 @@ void sub_81428CC(void)
}
break;
case 3:
- {
- struct HallofFameMons* fameMons;
-
- REG_BLDCNT = 0;
- REG_BLDALPHA = 0;
- REG_BLDY = 0;
- sub_81435B8();
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ REG_BLDY = 0;
+ sub_81435B8();
- fameMons = eHallOfFameMons1;
- fameMons->mons[0] = sDummyFameMon;
+ eHOFPCScreenEffect = sPCScreenEffectTemplate;
- sub_80C5CD4(fameMons);
- gMain.state++;
- }
+ sub_80C5CD4(&eHOFPCScreenEffect);
+ gMain.state++;
break;
case 4:
AnimateSprites();
@@ -1022,12 +1011,9 @@ static void sub_8142DF4(u8 taskID)
static void sub_8142F78(u8 taskID)
{
- struct HallofFameMons* fameMons;
-
CpuSet(gPlttBufferFaded, gPlttBufferUnfaded, 0x200);
- fameMons = eHallOfFameMons1;
- fameMons->mons[0] = sDummyFameMon;
- sub_80C5E38(fameMons);
+ eHOFPCScreenEffect = sPCScreenEffectTemplate;
+ sub_80C5E38(&eHOFPCScreenEffect);
gTasks[taskID].func = sub_8142FCC;
}
diff --git a/src/field/heal_location.c b/src/heal_location.c
index a10c7a7b8..a10c7a7b8 100644
--- a/src/field/heal_location.c
+++ b/src/heal_location.c
diff --git a/src/field/hof_pc.c b/src/hof_pc.c
index 267ed4274..267ed4274 100644
--- a/src/field/hof_pc.c
+++ b/src/hof_pc.c
diff --git a/src/scene/intro.c b/src/intro.c
index 4da341744..5c0e7a67d 100644
--- a/src/scene/intro.c
+++ b/src/intro.c
@@ -1501,7 +1501,6 @@ static void intro_reset_and_hide_bgs(void)
REG_BLDY = 0;
}
-#ifdef NONMATCHING
static void sub_813CCE8(u8 taskId)
{
switch (gTasks[taskId].data[0])
@@ -1513,18 +1512,15 @@ static void sub_813CCE8(u8 taskId)
REG_BLDY = 0;
gTasks[taskId].data[1] = 0x40;
gTasks[taskId].data[0] = 1;
- return;
+ break;
case 1:
if (gTasks[taskId].data[1] != 0)
{
- u32 foo;
- u32 bar asm("r2");
+ u8 foo;
gTasks[taskId].data[1]--;
- //tail merge at _0813CDC2
- foo = gTasks[taskId].data[1] + (gTasks[taskId].data[1] < 0);
- bar = 0x1FE;
- REG_BLDALPHA = gUnknown_08393E64[(foo & bar) / 2];
+ foo = gTasks[taskId].data[1] / 2;
+ REG_BLDALPHA = gUnknown_08393E64[foo];
}
else
{
@@ -1532,7 +1528,7 @@ static void sub_813CCE8(u8 taskId)
gTasks[taskId].data[1] = 0x80;
gTasks[taskId].data[0]++;
}
- return;
+ break;
case 2:
if (gTasks[taskId].data[1] != 0)
{
@@ -1544,18 +1540,15 @@ static void sub_813CCE8(u8 taskId)
gTasks[taskId].data[1] = 0; //redundant?
gTasks[taskId].data[0]++;
}
- return;
+ break;
case 3:
if (gTasks[taskId].data[1] <= 0x3D)
{
- u32 foo;
- u32 bar asm("r2");
+ u8 foo;
gTasks[taskId].data[1]++;
- //_0813CDC2
- foo = gTasks[taskId].data[1] + (gTasks[taskId].data[1] < 0);
- bar = 0x1FE;
- REG_BLDALPHA = gUnknown_08393E64[(foo & bar) / 2];
+ foo = gTasks[taskId].data[1] / 2;
+ REG_BLDALPHA = gUnknown_08393E64[foo];
}
else
{
@@ -1564,7 +1557,7 @@ static void sub_813CCE8(u8 taskId)
gTasks[taskId].data[1] = 0x10;
gTasks[taskId].data[0]++;
}
- return;
+ break;
case 4:
if (gTasks[taskId].data[1] != 0)
{
@@ -1577,186 +1570,9 @@ static void sub_813CCE8(u8 taskId)
REG_BLDY = 0;
DestroyTask(taskId);
}
- return;
+ break;
}
}
-#else
-__attribute__((naked))
-static void sub_813CCE8(u8 taskId)
-{
- asm("\n\
- .equ REG_BLDCNT, 0x4000050\n\
- .equ REG_BLDALPHA, 0x4000052\n\
- .syntax unified\n\
- push {r4,lr}\n\
- lsls r0, 24\n\
- lsrs r3, r0, 24\n\
- ldr r1, _0813CD0C @ =gTasks\n\
- lsls r0, r3, 2\n\
- adds r0, r3\n\
- lsls r0, 3\n\
- adds r0, r1\n\
- movs r2, 0x8\n\
- ldrsh r0, [r0, r2]\n\
- adds r2, r1, 0\n\
- cmp r0, 0x4\n\
- bhi _0813CD28\n\
- lsls r0, 2\n\
- ldr r1, _0813CD10 @ =_0813CD14\n\
- adds r0, r1\n\
- ldr r0, [r0]\n\
- mov pc, r0\n\
- .align 2, 0\n\
-_0813CD0C: .4byte gTasks\n\
-_0813CD10: .4byte _0813CD14\n\
- .align 2, 0\n\
-_0813CD14:\n\
- .4byte _0813CD28\n\
- .4byte _0813CD5C\n\
- .4byte _0813CD8C\n\
- .4byte _0813CDA8\n\
- .4byte _0813CDFC\n\
-_0813CD28:\n\
- ldr r1, _0813CD54 @ =REG_BLDCNT\n\
- ldr r4, _0813CD58 @ =0x00003f50\n\
- adds r0, r4, 0\n\
- strh r0, [r1]\n\
- adds r1, 0x2\n\
- movs r4, 0x80\n\
- lsls r4, 5\n\
- adds r0, r4, 0\n\
- strh r0, [r1]\n\
- adds r1, 0x2\n\
- movs r0, 0\n\
- strh r0, [r1]\n\
- lsls r0, r3, 2\n\
- adds r0, r3\n\
- lsls r0, 3\n\
- adds r0, r2\n\
- movs r1, 0x40\n\
- strh r1, [r0, 0xA]\n\
- movs r1, 0x1\n\
- strh r1, [r0, 0x8]\n\
- b _0813CE26\n\
- .align 2, 0\n\
-_0813CD54: .4byte REG_BLDCNT\n\
-_0813CD58: .4byte 0x00003f50\n\
-_0813CD5C:\n\
- lsls r0, r3, 2\n\
- adds r0, r3\n\
- lsls r0, 3\n\
- adds r2, r0, r2\n\
- ldrh r1, [r2, 0xA]\n\
- movs r3, 0xA\n\
- ldrsh r0, [r2, r3]\n\
- cmp r0, 0\n\
- beq _0813CD78\n\
- subs r0, r1, 0x1\n\
- strh r0, [r2, 0xA]\n\
- movs r4, 0xA\n\
- ldrsh r0, [r2, r4]\n\
- b _0813CDC2\n\
-_0813CD78:\n\
- ldr r1, _0813CD84 @ =REG_BLDALPHA\n\
- ldr r0, _0813CD88 @ =gUnknown_08393E64\n\
- ldrh r0, [r0]\n\
- strh r0, [r1]\n\
- movs r0, 0x80\n\
- b _0813CDEA\n\
- .align 2, 0\n\
-_0813CD84: .4byte REG_BLDALPHA\n\
-_0813CD88: .4byte gUnknown_08393E64\n\
-_0813CD8C:\n\
- lsls r0, r3, 2\n\
- adds r0, r3\n\
- lsls r0, 3\n\
- adds r1, r0, r2\n\
- ldrh r0, [r1, 0xA]\n\
- movs r3, 0xA\n\
- ldrsh r2, [r1, r3]\n\
- cmp r2, 0\n\
- bne _0813CE0E\n\
- strh r2, [r1, 0xA]\n\
- ldrh r0, [r1, 0x8]\n\
- adds r0, 0x1\n\
- strh r0, [r1, 0x8]\n\
- b _0813CE26\n\
-_0813CDA8:\n\
- lsls r0, r3, 2\n\
- adds r0, r3\n\
- lsls r0, 3\n\
- adds r2, r0, r2\n\
- ldrh r1, [r2, 0xA]\n\
- movs r4, 0xA\n\
- ldrsh r0, [r2, r4]\n\
- cmp r0, 0x3D\n\
- bgt _0813CDE0\n\
- adds r0, r1, 0x1\n\
- strh r0, [r2, 0xA]\n\
- movs r1, 0xA\n\
- ldrsh r0, [r2, r1]\n\
-_0813CDC2:\n\
- lsrs r1, r0, 31\n\
- adds r0, r1\n\
- movs r2, 0xFF\n\
- lsls r2, 1\n\
- ldr r3, _0813CDD8 @ =REG_BLDALPHA\n\
- ldr r1, _0813CDDC @ =gUnknown_08393E64\n\
- ands r0, r2\n\
- adds r0, r1\n\
- ldrh r0, [r0]\n\
- strh r0, [r3]\n\
- b _0813CE26\n\
- .align 2, 0\n\
-_0813CDD8: .4byte REG_BLDALPHA\n\
-_0813CDDC: .4byte gUnknown_08393E64\n\
-_0813CDE0:\n\
- ldr r1, _0813CDF4 @ =REG_BLDALPHA\n\
- ldr r0, _0813CDF8 @ =gUnknown_08393E64\n\
- ldrh r0, [r0, 0x3E]\n\
- strh r0, [r1]\n\
- movs r0, 0x10\n\
-_0813CDEA:\n\
- strh r0, [r2, 0xA]\n\
- ldrh r0, [r2, 0x8]\n\
- adds r0, 0x1\n\
- strh r0, [r2, 0x8]\n\
- b _0813CE26\n\
- .align 2, 0\n\
-_0813CDF4: .4byte REG_BLDALPHA\n\
-_0813CDF8: .4byte gUnknown_08393E64\n\
-_0813CDFC:\n\
- lsls r0, r3, 2\n\
- adds r0, r3\n\
- lsls r0, 3\n\
- adds r1, r0, r2\n\
- ldrh r0, [r1, 0xA]\n\
- movs r4, 0xA\n\
- ldrsh r2, [r1, r4]\n\
- cmp r2, 0\n\
- beq _0813CE14\n\
-_0813CE0E:\n\
- subs r0, 0x1\n\
- strh r0, [r1, 0xA]\n\
- b _0813CE26\n\
-_0813CE14:\n\
- ldr r0, _0813CE2C @ =REG_BLDCNT\n\
- strh r2, [r0]\n\
- adds r0, 0x2\n\
- strh r2, [r0]\n\
- adds r0, 0x2\n\
- strh r2, [r0]\n\
- adds r0, r3, 0\n\
- bl DestroyTask\n\
-_0813CE26:\n\
- pop {r4}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_0813CE2C: .4byte REG_BLDCNT\n\
- .syntax divided\n");
-}
-#endif
void sub_813CE30(u16 scrX, u16 scrY, u16 zoom, u16 alpha)
{
@@ -2186,7 +2002,6 @@ static u8 CreateGameFreakLogo(s16 a, s16 b, u8 c)
return spriteId;
}
-#ifdef NONMATCHING
static void sub_813DA64(struct Sprite *sprite)
{
sprite->data[7]++;
@@ -2206,14 +2021,13 @@ static void sub_813DA64(struct Sprite *sprite)
break;
case 1:
{
- s16 r3;
- s16 sin1;
- s16 r6;
- s16 foo;
- s16 r5;
- s16 r2;
+ s16 sin;
+ s16 cos;
+ s16 a;
+ s16 b;
+ s16 c;
+ s16 d;
- //_0813DAC0
if (sprite->data[3] < 0x50)
{
sprite->pos2.y = -Sin((u8)sprite->data[3], 0x78);
@@ -2221,15 +2035,14 @@ static void sub_813DA64(struct Sprite *sprite)
if (sprite->data[3] > 64)
sprite->oam.priority = 3;
}
- //_0813DAF8
- 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;
+ sin = gSineTable[(u8)sprite->data[2]];
+ cos = gSineTable[(u8)(sprite->data[2] + 64)];
+ d = cos * sprite->data[1] / 256;
+ c = -sin * sprite->data[1] / 256;
+ b = sin * sprite->data[1] / 256;
+ a = cos * sprite->data[1] / 256;
- SetOamMatrix(1, r6, r2, r5, foo);
+ SetOamMatrix(1, a, b, c, d);
if (sprite->data[1] < 0x100)
sprite->data[1] += 8;
@@ -2244,180 +2057,7 @@ static void sub_813DA64(struct Sprite *sprite)
break;
}
}
- //_0813DB92
}
-#else
-__attribute__((naked))
-static void sub_813DA64(struct Sprite *sprite)
-{
- asm(".syntax unified\n\
- push {r4-r6,lr}\n\
- sub sp, 0x4\n\
- adds r4, r0, 0\n\
- ldrh r0, [r4, 0x3C]\n\
- adds r0, 0x1\n\
- strh r0, [r4, 0x3C]\n\
- movs r1, 0x2E\n\
- ldrsh r0, [r4, r1]\n\
- cmp r0, 0\n\
- beq _0813DA7C\n\
- cmp r0, 0x1\n\
- beq _0813DAC0\n\
-_0813DA7C:\n\
- ldrb r0, [r4, 0x1]\n\
- movs r1, 0x3\n\
- orrs r0, r1\n\
- strb r0, [r4, 0x1]\n\
- ldrb r1, [r4, 0x3]\n\
- movs r0, 0x3F\n\
- negs r0, r0\n\
- ands r0, r1\n\
- movs r1, 0x2\n\
- orrs r0, r1\n\
- strb r0, [r4, 0x3]\n\
- adds r0, r4, 0\n\
- movs r1, 0x1\n\
- movs r2, 0x3\n\
- movs r3, 0x3\n\
- bl CalcCenterToCornerVec\n\
- adds r2, r4, 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\
- movs r0, 0x1\n\
- strh r0, [r4, 0x2E]\n\
- movs r0, 0x80\n\
- strh r0, [r4, 0x30]\n\
- ldr r0, _0813DABC @ =0x0000ffe8\n\
- strh r0, [r4, 0x32]\n\
- movs r0, 0\n\
- b _0813DB92\n\
- .align 2, 0\n\
-_0813DABC: .4byte 0x0000ffe8\n\
-_0813DAC0:\n\
- ldrh r1, [r4, 0x34]\n\
- movs r2, 0x34\n\
- ldrsh r0, [r4, r2]\n\
- cmp r0, 0x4F\n\
- bgt _0813DAF8\n\
- lsls r0, r1, 24\n\
- lsrs r0, 24\n\
- movs r1, 0x78\n\
- bl Sin\n\
- negs r0, r0\n\
- strh r0, [r4, 0x26]\n\
- ldrh r0, [r4, 0x34]\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- movs r1, 0x8C\n\
- bl Sin\n\
- negs r0, r0\n\
- strh r0, [r4, 0x24]\n\
- movs r1, 0x34\n\
- ldrsh r0, [r4, r1]\n\
- cmp r0, 0x40\n\
- ble _0813DAF8\n\
- ldrb r0, [r4, 0x5]\n\
- movs r1, 0xC\n\
- orrs r0, r1\n\
- strb r0, [r4, 0x5]\n\
-_0813DAF8:\n\
- ldr r2, _0813DB60 @ =gSineTable\n\
- ldrh r1, [r4, 0x32]\n\
- lsls r0, r1, 24\n\
- lsrs r0, 23\n\
- adds r0, r2\n\
- ldrh r3, [r0]\n\
- adds r1, 0x40\n\
- lsls r1, 24\n\
- lsrs r1, 23\n\
- adds r1, r2\n\
- movs r2, 0\n\
- ldrsh r0, [r1, r2]\n\
- movs r1, 0x30\n\
- ldrsh r2, [r4, r1]\n\
- adds r1, r0, 0\n\
- muls r1, r2\n\
- adds r0, r1, 0\n\
- cmp r1, 0\n\
- bge _0813DB20\n\
- adds r0, 0xFF\n\
-_0813DB20:\n\
- lsls r0, 8\n\
- lsrs r6, r0, 16\n\
- lsls r0, r3, 16\n\
- asrs r3, r0, 16\n\
- negs r0, r3\n\
- muls r0, r2\n\
- cmp r0, 0\n\
- bge _0813DB32\n\
- adds r0, 0xFF\n\
-_0813DB32:\n\
- lsls r0, 8\n\
- lsrs r5, r0, 16\n\
- adds r0, r3, 0\n\
- muls r0, r2\n\
- cmp r0, 0\n\
- bge _0813DB40\n\
- adds r0, 0xFF\n\
-_0813DB40:\n\
- lsls r0, 8\n\
- lsrs r2, r0, 16\n\
- adds r1, r6, 0\n\
- adds r3, r5, 0\n\
- str r1, [sp]\n\
- movs r0, 0x1\n\
- bl SetOamMatrix\n\
- ldrh r1, [r4, 0x30]\n\
- movs r2, 0x30\n\
- ldrsh r0, [r4, r2]\n\
- cmp r0, 0xFF\n\
- bgt _0813DB64\n\
- adds r0, r1, 0\n\
- adds r0, 0x8\n\
- b _0813DB68\n\
- .align 2, 0\n\
-_0813DB60: .4byte gSineTable\n\
-_0813DB64:\n\
- adds r0, r1, 0\n\
- adds r0, 0x20\n\
-_0813DB68:\n\
- strh r0, [r4, 0x30]\n\
- ldrh r1, [r4, 0x32]\n\
- movs r2, 0x32\n\
- ldrsh r0, [r4, r2]\n\
- cmp r0, 0x17\n\
- bgt _0813DB78\n\
- adds r0, r1, 0x1\n\
- strh r0, [r4, 0x32]\n\
-_0813DB78:\n\
- ldrh r2, [r4, 0x34]\n\
- movs r1, 0x34\n\
- ldrsh r0, [r4, r1]\n\
- cmp r0, 0x3F\n\
- bgt _0813DB86\n\
- adds r0, r2, 0x2\n\
- b _0813DB92\n\
-_0813DB86:\n\
- ldrh r1, [r4, 0x3C]\n\
- movs r0, 0x3\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _0813DB94\n\
- adds r0, r2, 0x1\n\
-_0813DB92:\n\
- strh r0, [r4, 0x34]\n\
-_0813DB94:\n\
- add sp, 0x4\n\
- pop {r4-r6}\n\
- pop {r0}\n\
- bx r0\n\
- .syntax divided\n");
-}
-#endif
static void sub_813DB9C(struct Sprite *sprite)
{
diff --git a/src/scene/intro_credits_graphics.c b/src/intro_credits_graphics.c
index 7f6765ef6..73210c5d9 100644
--- a/src/scene/intro_credits_graphics.c
+++ b/src/intro_credits_graphics.c
@@ -436,161 +436,49 @@ u8 sub_8148EC0(u8 a, u16 b, u16 c, u16 d)
return taskId;
}
-#ifdef NONMATCHING
void sub_8148F3C(u8 taskId)
{
- register u32 r4 asm("r4");
+ s16 deltaBG1HOFS;
+ s16 deltaBG2HOFS;
+ s16 deltaBG3HOFS;
s32 r2;
- r4 = (u16)gTasks[taskId].data[1] << 16;
- if (r4 != 0)
+ deltaBG1HOFS = gTasks[taskId].data[1];
+ if (deltaBG1HOFS != 0)
{
- r2 = (gTasks[taskId].data[2] << 16) + (u16)gTasks[taskId].data[3] - (r4 >> 12);
+ r2 = (gTasks[taskId].data[2] << 16) + (u16)gTasks[taskId].data[3];
+ r2 -= 16 * (u16)deltaBG1HOFS;
gTasks[taskId].data[2] = r2 >> 16;
gTasks[taskId].data[3] = r2;
REG_BG1HOFS = gTasks[taskId].data[2];
- REG_BG1VOFS = gUnknown_0203935A + gUnknown_02039358;
+ REG_BG1VOFS = gUnknown_02039358 + gUnknown_0203935A;
}
- r4 = (u16)gTasks[taskId].data[4] << 16;
- if (r4 != 0)
+ deltaBG2HOFS = gTasks[taskId].data[4];
+ if (deltaBG2HOFS != 0)
{
- r2 = (gTasks[taskId].data[5] << 16) + (u16)gTasks[taskId].data[6] - (r4 >> 12);
+ r2 = (gTasks[taskId].data[5] << 16) + (u16)gTasks[taskId].data[6];
+ r2 -= 16 * (u16)deltaBG2HOFS;
gTasks[taskId].data[5] = r2 >> 16;
- gTasks[taskId].data[3] = r2;
+ gTasks[taskId].data[6] = r2;
REG_BG2HOFS = gTasks[taskId].data[5];
if (gTasks[taskId].data[0] != 0)
- REG_BG2VOFS = gUnknown_0203935A + gUnknown_02039358;
+ REG_BG2VOFS = gUnknown_02039358 + gUnknown_0203935A;
else
REG_BG2VOFS = gUnknown_02039358;
}
- r4 = (u16)gTasks[taskId].data[7] << 16;
- if (r4 != 0)
+ deltaBG3HOFS = gTasks[taskId].data[7];
+ if (deltaBG3HOFS != 0)
{
- r2 = (gTasks[taskId].data[8] << 16) + (u16)gTasks[taskId].data[9] - (r4 >> 12);;
+ r2 = (gTasks[taskId].data[8] << 16) + (u16)gTasks[taskId].data[9];
+ r2 -= 16 * (u16)deltaBG3HOFS;
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)
{
diff --git a/src/field/item.c b/src/item.c
index 6ff7a7cbe..41cbb7a1e 100644
--- a/src/field/item.c
+++ b/src/item.c
@@ -2,12 +2,32 @@
#include "constants/hold_effects.h"
#include "item.h"
#include "constants/items.h"
+#include "item_menu.h"
#include "item_use.h"
#include "berry.h"
#include "string_util.h"
#include "strings.h"
+struct Item
+{
+ u8 name[14];
+ u16 itemId;
+ u16 price;
+ u8 holdEffect;
+ u8 holdEffectParam;
+ const u8 *description;
+ u8 importance;
+ u8 unk19;
+ u8 pocket;
+ u8 type;
+ ItemUseFunc fieldUseFunc;
+ u8 battleUsage;
+ ItemUseFunc battleUseFunc;
+ u8 secondaryId;
+};
+
extern u8 gUnknown_02038560;
+extern struct BagPocket gBagPockets[NUM_BAG_POCKETS];
// These constants are used in gItems
enum
@@ -30,11 +50,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);
@@ -47,7 +67,9 @@ void CopyItemName(u16 itemId, u8 *string)
StringAppend(string, gOtherText_Berry2);
}
else
- StringCopy(string, ItemId_GetItem(itemId)->name);
+ {
+ StringCopy(string, ItemId_GetName(itemId));
+ }
}
//Unreferenced
@@ -151,7 +173,7 @@ bool8 CheckBagHasSpace(u16 itemId, u16 count)
// This function matches if gBagPockets is declared non-const,
// but it should be fixed anyway.
-#ifdef NONMATCHING
+//#ifdef NONMATCHING
bool8 AddBagItem(u16 itemId, u16 count)
{
u8 i;
@@ -216,158 +238,158 @@ bool8 AddBagItem(u16 itemId, u16 count)
memcpy(gBagPockets[pocket].itemSlots, newItems, gBagPockets[pocket].capacity * sizeof(struct ItemSlot));
return TRUE;
}
-#else
-__attribute__((naked))
-bool8 AddBagItem(u16 itemId, u16 count)
-{
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- mov r7, r9\n\
- mov r6, r8\n\
- push {r6,r7}\n\
- sub sp, 0x100\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- mov r8, r0\n\
- lsls r1, 16\n\
- lsrs r4, r1, 16\n\
- bl ItemId_GetPocket\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _080A9510\n\
- mov r0, r8\n\
- bl ItemId_GetPocket\n\
- subs r0, 0x1\n\
- lsls r0, 24\n\
- lsrs r6, r0, 24\n\
- ldr r1, _080A94F8 @ =gBagPockets\n\
- lsls r0, r6, 3\n\
- adds r5, r0, r1\n\
- ldr r1, [r5]\n\
- ldrb r2, [r5, 0x4]\n\
- lsls r2, 2\n\
- mov r0, sp\n\
- bl memcpy\n\
- ldr r7, _080A94FC @ =0x000003e7\n\
- cmp r6, 0x3\n\
- beq _080A9468\n\
- movs r7, 0x63\n\
-_080A9468:\n\
- movs r1, 0\n\
- ldrb r0, [r5, 0x4]\n\
- cmp r1, r0\n\
- bcs _080A94B2\n\
- subs r0, r6, 0x2\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- mov r12, r0\n\
-_080A9478:\n\
- lsls r0, r1, 2\n\
- mov r2, sp\n\
- adds r3, r2, r0\n\
- ldrh r0, [r3]\n\
- cmp r0, r8\n\
- bne _080A94A6\n\
- ldrh r2, [r3, 0x2]\n\
- adds r0, r2, r4\n\
- cmp r0, r7\n\
- ble _080A9500\n\
- mov r0, r12\n\
- cmp r0, 0x1\n\
- bls _080A9510\n\
- subs r0, r7, r2\n\
- subs r0, r4, r0\n\
- lsls r0, 16\n\
- lsrs r4, r0, 16\n\
- strh r7, [r3, 0x2]\n\
- ldr r2, _080A94F8 @ =gBagPockets\n\
- mov r9, r2\n\
- lsls r3, r6, 3\n\
- cmp r4, 0\n\
- beq _080A9516\n\
-_080A94A6:\n\
- adds r0, r1, 0x1\n\
- lsls r0, 24\n\
- lsrs r1, r0, 24\n\
- ldrb r0, [r5, 0x4]\n\
- cmp r1, r0\n\
- bcc _080A9478\n\
-_080A94B2:\n\
- ldr r2, _080A94F8 @ =gBagPockets\n\
- mov r9, r2\n\
- lsls r3, r6, 3\n\
- cmp r4, 0\n\
- beq _080A9516\n\
- movs r1, 0\n\
- adds r0, r3, r2\n\
- ldrb r0, [r0, 0x4]\n\
- cmp r1, r0\n\
- bcs _080A94F2\n\
- mov r6, r9\n\
- adds r5, r3, r6\n\
-_080A94CA:\n\
- lsls r0, r1, 2\n\
- mov r6, sp\n\
- adds r2, r6, r0\n\
- ldrh r0, [r2]\n\
- cmp r0, 0\n\
- bne _080A94E6\n\
- mov r0, r8\n\
- strh r0, [r2]\n\
- cmp r4, r7\n\
- bls _080A9514\n\
- subs r0, r4, r7\n\
- lsls r0, 16\n\
- lsrs r4, r0, 16\n\
- strh r7, [r2, 0x2]\n\
-_080A94E6:\n\
- adds r0, r1, 0x1\n\
- lsls r0, 24\n\
- lsrs r1, r0, 24\n\
- ldrb r2, [r5, 0x4]\n\
- cmp r1, r2\n\
- bcc _080A94CA\n\
-_080A94F2:\n\
- cmp r4, 0\n\
- beq _080A9516\n\
- b _080A9510\n\
- .align 2, 0\n\
-_080A94F8: .4byte gBagPockets\n\
-_080A94FC: .4byte 0x000003e7\n\
-_080A9500:\n\
- strh r0, [r3, 0x2]\n\
- ldr r0, _080A950C @ =gBagPockets\n\
- lsls r1, r6, 3\n\
- adds r1, r0\n\
- b _080A951A\n\
- .align 2, 0\n\
-_080A950C: .4byte gBagPockets\n\
-_080A9510:\n\
- movs r0, 0\n\
- b _080A9528\n\
-_080A9514:\n\
- strh r4, [r2, 0x2]\n\
-_080A9516:\n\
- mov r6, r9\n\
- adds r1, r3, r6\n\
-_080A951A:\n\
- ldr r0, [r1]\n\
- ldrb r2, [r1, 0x4]\n\
- lsls r2, 2\n\
- mov r1, sp\n\
- bl memcpy\n\
- movs r0, 0x1\n\
-_080A9528:\n\
- add sp, 0x100\n\
- pop {r3,r4}\n\
- mov r8, r3\n\
- mov r9, r4\n\
- pop {r4-r7}\n\
- pop {r1}\n\
- bx r1\n\
- .syntax divided\n");
-}
-#endif
+//#else
+//__attribute__((naked))
+//bool8 AddBagItem(u16 itemId, u16 count)
+//{
+// asm(".syntax unified\n\
+// push {r4-r7,lr}\n\
+// mov r7, r9\n\
+// mov r6, r8\n\
+// push {r6,r7}\n\
+// sub sp, 0x100\n\
+// lsls r0, 16\n\
+// lsrs r0, 16\n\
+// mov r8, r0\n\
+// lsls r1, 16\n\
+// lsrs r4, r1, 16\n\
+// bl ItemId_GetPocket\n\
+// lsls r0, 24\n\
+// cmp r0, 0\n\
+// beq _080A9510\n\
+// mov r0, r8\n\
+// bl ItemId_GetPocket\n\
+// subs r0, 0x1\n\
+// lsls r0, 24\n\
+// lsrs r6, r0, 24\n\
+// ldr r1, _080A94F8 @ =gBagPockets\n\
+// lsls r0, r6, 3\n\
+// adds r5, r0, r1\n\
+// ldr r1, [r5]\n\
+// ldrb r2, [r5, 0x4]\n\
+// lsls r2, 2\n\
+// mov r0, sp\n\
+// bl memcpy\n\
+// ldr r7, _080A94FC @ =0x000003e7\n\
+// cmp r6, 0x3\n\
+// beq _080A9468\n\
+// movs r7, 0x63\n\
+//_080A9468:\n\
+// movs r1, 0\n\
+// ldrb r0, [r5, 0x4]\n\
+// cmp r1, r0\n\
+// bcs _080A94B2\n\
+// subs r0, r6, 0x2\n\
+// lsls r0, 24\n\
+// lsrs r0, 24\n\
+// mov r12, r0\n\
+//_080A9478:\n\
+// lsls r0, r1, 2\n\
+// mov r2, sp\n\
+// adds r3, r2, r0\n\
+// ldrh r0, [r3]\n\
+// cmp r0, r8\n\
+// bne _080A94A6\n\
+// ldrh r2, [r3, 0x2]\n\
+// adds r0, r2, r4\n\
+// cmp r0, r7\n\
+// ble _080A9500\n\
+// mov r0, r12\n\
+// cmp r0, 0x1\n\
+// bls _080A9510\n\
+// subs r0, r7, r2\n\
+// subs r0, r4, r0\n\
+// lsls r0, 16\n\
+// lsrs r4, r0, 16\n\
+// strh r7, [r3, 0x2]\n\
+// ldr r2, _080A94F8 @ =gBagPockets\n\
+// mov r9, r2\n\
+// lsls r3, r6, 3\n\
+// cmp r4, 0\n\
+// beq _080A9516\n\
+//_080A94A6:\n\
+// adds r0, r1, 0x1\n\
+// lsls r0, 24\n\
+// lsrs r1, r0, 24\n\
+// ldrb r0, [r5, 0x4]\n\
+// cmp r1, r0\n\
+// bcc _080A9478\n\
+//_080A94B2:\n\
+// ldr r2, _080A94F8 @ =gBagPockets\n\
+// mov r9, r2\n\
+// lsls r3, r6, 3\n\
+// cmp r4, 0\n\
+// beq _080A9516\n\
+// movs r1, 0\n\
+// adds r0, r3, r2\n\
+// ldrb r0, [r0, 0x4]\n\
+// cmp r1, r0\n\
+// bcs _080A94F2\n\
+// mov r6, r9\n\
+// adds r5, r3, r6\n\
+//_080A94CA:\n\
+// lsls r0, r1, 2\n\
+// mov r6, sp\n\
+// adds r2, r6, r0\n\
+// ldrh r0, [r2]\n\
+// cmp r0, 0\n\
+// bne _080A94E6\n\
+// mov r0, r8\n\
+// strh r0, [r2]\n\
+// cmp r4, r7\n\
+// bls _080A9514\n\
+// subs r0, r4, r7\n\
+// lsls r0, 16\n\
+// lsrs r4, r0, 16\n\
+// strh r7, [r2, 0x2]\n\
+//_080A94E6:\n\
+// adds r0, r1, 0x1\n\
+// lsls r0, 24\n\
+// lsrs r1, r0, 24\n\
+// ldrb r2, [r5, 0x4]\n\
+// cmp r1, r2\n\
+// bcc _080A94CA\n\
+//_080A94F2:\n\
+// cmp r4, 0\n\
+// beq _080A9516\n\
+// b _080A9510\n\
+// .align 2, 0\n\
+//_080A94F8: .4byte gBagPockets\n\
+//_080A94FC: .4byte 0x000003e7\n\
+//_080A9500:\n\
+// strh r0, [r3, 0x2]\n\
+// ldr r0, _080A950C @ =gBagPockets\n\
+// lsls r1, r6, 3\n\
+// adds r1, r0\n\
+// b _080A951A\n\
+// .align 2, 0\n\
+//_080A950C: .4byte gBagPockets\n\
+//_080A9510:\n\
+// movs r0, 0\n\
+// b _080A9528\n\
+//_080A9514:\n\
+// strh r4, [r2, 0x2]\n\
+//_080A9516:\n\
+// mov r6, r9\n\
+// adds r1, r3, r6\n\
+//_080A951A:\n\
+// ldr r0, [r1]\n\
+// ldrb r2, [r1, 0x4]\n\
+// lsls r2, 2\n\
+// mov r1, sp\n\
+// bl memcpy\n\
+// movs r0, 0x1\n\
+//_080A9528:\n\
+// add sp, 0x100\n\
+// pop {r3,r4}\n\
+// mov r8, r3\n\
+// mov r9, r4\n\
+// pop {r4-r7}\n\
+// pop {r1}\n\
+// bx r1\n\
+// .syntax divided\n");
+//}
+//#endif
bool8 RemoveBagItem(u16 itemId, u16 count)
{
@@ -577,9 +599,9 @@ static u16 SanitizeItemId(u16 itemId)
return itemId;
}
-const struct Item *ItemId_GetItem(u16 itemId)
+const u8 *ItemId_GetName(u16 itemId)
{
- return &gItems[SanitizeItemId(itemId)];
+ return gItems[SanitizeItemId(itemId)].name;
}
u16 ItemId_GetId(u16 itemId)
@@ -638,6 +660,7 @@ u8 ItemId_GetImportance(u16 itemId)
return gItems[SanitizeItemId(itemId)].importance;
}
+// unused
u8 ItemId_GetUnknownValue(u16 itemId)
{
return gItems[SanitizeItemId(itemId)].unk19;
diff --git a/src/field/item_menu.c b/src/item_menu.c
index 6bad9f4d6..32b14e021 100644
--- a/src/field/item_menu.c
+++ b/src/item_menu.c
@@ -4,7 +4,7 @@
#include "data2.h"
#include "decompress.h"
#include "field_effect.h"
-#include "field_map_obj_helpers.h"
+#include "event_object_movement.h"
#include "field_player_avatar.h"
#include "graphics.h"
#include "item.h"
@@ -47,7 +47,7 @@ extern void sub_808B5B4();
extern u8 sub_80F92F4();
extern void sub_80C9C7C(u8);
extern void pal_fill_black(void);
-extern bool8 sub_807D770(void);
+extern bool8 IsWeatherNotFadingIn(void);
extern u8 sub_80F931C();
extern void sub_808A3F8(u8);
extern void Shop_FadeReturnToMartMenu(void);
@@ -158,6 +158,9 @@ extern struct PocketScrollState gBagPocketScrollStates[];
extern struct ItemSlot *gCurrentBagPocketItemSlots; // selected pocket item slots
extern const u8 Event_NoRegisteredItem[];
+// TODO: decompile the debug code so we can use static in this file
+#define static
+
extern const struct CompressedSpriteSheet sMaleBagSpriteSheet;
extern const struct CompressedSpriteSheet sFemaleBagSpriteSheet;
extern const struct CompressedSpritePalette sBagSpritePalette;
@@ -492,6 +495,10 @@ static bool8 SetupBagMultistep(void)
sub_80A770C();
sub_80A7828();
sub_80A78B8();
+#if DEBUG
+ if (gLinkOpen == TRUE)
+ debug_sub_8008218((void *)(VRAM + 0xF5E0), 0x8000, (void *)(VRAM + 0xF800), 0);
+#endif
return TRUE;
}
return FALSE;
@@ -622,6 +629,45 @@ void ClearBag(void)
ResetBagScrollPositions();
}
+#if DEBUG
+
+const struct ItemSlot gUnknown_Debug_083EBC68[60] =
+{
+ {ITEM_POKE_BALL, 10},
+ {ITEM_ULTRA_BALL, 15},
+ {ITEM_GREAT_BALL, 20},
+ {ITEM_MASTER_BALL, 25},
+ {ITEM_ACRO_BIKE, 1 },
+ {ITEM_OLD_ROD, 1 },
+ {ITEM_GOOD_ROD, 1 },
+ {ITEM_SUPER_ROD, 1 },
+ {ITEM_POKEBLOCK_CASE, 1 },
+ {ITEM_WAILMER_PAIL, 1 },
+ {ITEM_ITEMFINDER, 1 },
+ {ITEM_NONE, 1 },
+};
+
+void debug_sub_80A3714(void)
+{
+ u16 arr[5];
+ u16 i;
+
+ for (i = 0; i < 5; i++)
+ arr[i] = 0;
+ for (i = 0; i < ARRAY_COUNT(gUnknown_Debug_083EBC68); i++)
+ {
+ u16 pocket;
+
+ if (gUnknown_Debug_083EBC68[i].itemId == ITEM_NONE)
+ break;
+ pocket = ItemId_GetPocket(gUnknown_Debug_083EBC68[i].itemId) - 1;
+ gBagPockets[pocket].itemSlots[arr[pocket]] = gUnknown_Debug_083EBC68[i];
+ arr[pocket]++;
+ }
+}
+
+#endif
+
static void sub_80A3740(void)
{
const u16 colors[2] = {RGB(14, 15, 16), RGB_WHITE};
@@ -1133,7 +1179,7 @@ static void sub_80A4380(u16 a, int b, int c, int d)
r5 = i * 2 + 2;
text = gStringVar1;
text = sub_80A425C(a, text, i);
- text = sub_8072C74(text, ItemId_GetItem(gCurrentBagPocketItemSlots[r4].itemId)->name, 0x66, 0);
+ text = sub_8072C74(text, ItemId_GetName(gCurrentBagPocketItemSlots[r4].itemId), 0x66, 0);
*text++ = CHAR_MULT_SIGN;
sub_8072C14(text, gCurrentBagPocketItemSlots[r4].quantity, 0x78, 1);
Menu_PrintText(gStringVar1, 14, r5);
@@ -1157,9 +1203,9 @@ static void sub_80A444C(u16 a, int b, int c, int d)
text = gStringVar1;
text = sub_80A425C(a, text, i);
#if ENGLISH
- sub_8072C74(text, ItemId_GetItem(gCurrentBagPocketItemSlots[r4].itemId)->name, 0x60, 0);
+ sub_8072C74(text, ItemId_GetName(gCurrentBagPocketItemSlots[r4].itemId), 0x60, 0);
#else
- sub_8072C74(text, ItemId_GetItem(gCurrentBagPocketItemSlots[r4].itemId)->name, 0x63, 0);
+ sub_8072C74(text, ItemId_GetName(gCurrentBagPocketItemSlots[r4].itemId), 0x63, 0);
#endif
Menu_PrintText(gStringVar1, 14, r5);
if (gUnknown_02038558 != 0)
@@ -2699,7 +2745,7 @@ void ExecuteItemUseFromBlackPalette(void)
static void Task_CallItemUseOnFieldCallback(u8 taskId)
{
- if (sub_807D770() == TRUE)
+ if (IsWeatherNotFadingIn() == TRUE)
gFieldItemUseCallback(taskId);
}
@@ -3566,6 +3612,10 @@ static void sub_80A740C(void)
sub_80A75E4();
sub_80A7768();
sub_80A7420();
+#if DEBUG
+ if (gLinkOpen == TRUE)
+ debug_sub_8008264(gLink.recvQueue.count, 1, 1, 2, 0);
+#endif
}
static void sub_80A7420(void)
diff --git a/src/field/item_use.c b/src/item_use.c
index cdad3f840..a0fbb13b2 100644
--- a/src/field/item_use.c
+++ b/src/item_use.c
@@ -8,7 +8,6 @@
#include "event_data.h"
#include "field_effect.h"
#include "field_fadetransition.h"
-#include "field_map_obj_helpers.h"
#include "field_player_avatar.h"
#include "field_weather.h"
#include "fieldmap.h"
@@ -100,7 +99,7 @@ void ItemMenu_ConfirmNormalFade(u8 var)
void ItemMenu_ConfirmComplexFade(u8 var)
{
ExecuteSwitchToOverworldFromItemUse(var);
- fade_screen(1, 0);
+ FadeScreen(1, 0);
}
void SetUpItemUseOnFieldCallback(u8 taskId)
diff --git a/src/field/landmark.c b/src/landmark.c
index 476821ec6..476821ec6 100644
--- a/src/field/landmark.c
+++ b/src/landmark.c
diff --git a/src/pokemon/learn_move.c b/src/learn_move.c
index 356a31b00..356a31b00 100644
--- a/src/pokemon/learn_move.c
+++ b/src/learn_move.c
diff --git a/src/libs/m4a_1.s b/src/libs/m4a_1.s
index be8b44488..8dbcf7efd 100644
--- a/src/libs/m4a_1.s
+++ b/src/libs/m4a_1.s
@@ -4,7 +4,11 @@
.syntax unified
- .lcomm gUnknown_030007B8, 0x770
+ .bss
+
+ .global gUnknown_030007B8
+gUnknown_030007B8:
+ .space 0x770
.text
diff --git a/src/engine/link.c b/src/link.c
index ec94295d7..45807830a 100644
--- a/src/engine/link.c
+++ b/src/link.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "cable_club.h"
#include "link.h"
#include "battle.h"
#include "berry.h"
@@ -12,6 +13,7 @@
#include "constants/songs.h"
#include "sound.h"
#include "sprite.h"
+#include "string_util.h"
#include "strings2.h"
#include "task.h"
#include "text.h"
@@ -43,7 +45,6 @@ extern u16 word_3004858;
extern void Blender_SetBankBerryData(u8 bank, u16 itemID);
static void InitLinkTestBG(u8, u8, u8, u8);
-void InitLinkTestBG_Unused(u8, u8, u8, u8);
void LinkTestScreen();
static void InitLocalLinkPlayer(void);
static void VBlankCB_LinkTest(void);
@@ -66,7 +67,6 @@ u32 sub_8007E40(void);
static void SetBlockReceivedFlag(u8);
static u16 LinkTestCalcBlockChecksum(void *, u16);
static void PrintHexDigit(u8, u8, u8);
-static void PrintHex(u32, u8, u8, u8);
static void LinkCB_RequestPlayerDataExchange(void);
static void Task_PrintTestData(u8);
bool8 sub_8008224(void);
@@ -79,7 +79,7 @@ static void sub_80084C8(void);
static void sub_80084F4(void);
static void CheckErrorStatus(void);
-static void CB2_PrintErrorMessage(void);
+void CB2_PrintErrorMessage(void);
static u8 IsSioMultiMaster(void);
static void DisableSerial(void);
static void EnableSerial(void);
@@ -145,6 +145,9 @@ void (*gLinkCallback)(void);
struct LinkPlayer gSavedLinkPlayers[MAX_LINK_PLAYERS];
u8 gShouldAdvanceLinkState;
u16 gLinkTestBlockChecksums[MAX_LINK_PLAYERS];
+#if DEBUG
+u8 gUnknown_Debug_30030E0;
+#endif
u8 gBlockRequestType;
u8 gLastSendQueueCount;
struct Link gLink;
@@ -156,11 +159,11 @@ u8 deUnkValue1;
u8 deUnkValue2;
#endif
-EWRAM_DATA bool8 gLinkTestDebugValuesEnabled = {0};
-EWRAM_DATA bool8 gLinkTestDummyBool = {0};
-EWRAM_DATA u32 gFiller_20238B8 = {0};
-EWRAM_DATA u32 dword_20238BC = {0};
-EWRAM_DATA bool8 gLinkOpen = {0};
+EWRAM_DATA bool8 gLinkTestDebugValuesEnabled = 0;
+EWRAM_DATA bool8 gLinkTestDummyBool = 0;
+EWRAM_DATA u32 gFiller_20238B8 = 0;
+EWRAM_DATA u32 dword_20238BC = 0;
+EWRAM_DATA bool8 gLinkOpen = 0;
static const u16 sLinkTestDigitPalette[] = INCBIN_U16("graphics/interface/link_test_digits.gbapal");
static const u32 sLinkTestDigitTiles[] = INCBIN_U32("graphics/interface/link_test_digits.4bpp");
@@ -189,9 +192,9 @@ const struct BlockRequest sBlockRequestLookupTable[5] =
static const u8 sTestString[] = _("テストな");
-ALIGNED(4) static const u8 sMagic[] = "GameFreak inc.";
+const u8 sMagic[] = "GameFreak inc.";
-ALIGNED(4) static const u8 sEmptyString[] = _("");
+const u8 sEmptyString[] = _(" ");
void Task_DestroySelf(u8 taskId)
{
@@ -543,6 +546,9 @@ static void ProcessRecvCmds(u8 unusedParam)
else
{
SetBlockReceivedFlag(i);
+#if DEBUG
+ debug_sub_808B838(i);
+#endif
}
}
break;
@@ -898,14 +904,9 @@ bool8 sub_8007E9C(u8 a1)
}
}
-bool8 sub_8007ECC(void)
+bool8 IsLinkTaskFinished(void)
{
- u8 retVal = FALSE;
-
- if (!gLinkCallback)
- retVal = TRUE;
-
- return retVal;
+ return gLinkCallback == NULL;
}
u8 GetBlockReceivedStatus(void)
@@ -957,7 +958,7 @@ static void PrintHexDigit(u8 tileNum, u8 x, u8 y)
tilemap[(32 * y) + x] = (gLinkTestBGInfo.paletteNum << 12) | (tileNum + 1);
}
-static void PrintHex(u32 num, u8 x, u8 y, u8 maxDigits)
+void PrintHex(u32 num, u8 x, u8 y, u8 maxDigits)
{
u8 buffer[16];
s32 i;
@@ -975,6 +976,54 @@ static void PrintHex(u32 num, u8 x, u8 y, u8 maxDigits)
}
}
+#if DEBUG
+
+EWRAM_DATA uintptr_t debugCharacterBase = 0;
+EWRAM_DATA uintptr_t unk_20238C8 = 0;
+EWRAM_DATA u16 *debugTileMap = NULL;
+EWRAM_DATA u32 unk_20238D0 = 0;
+
+void debug_sub_8008218(u16 *buffer, u32 arg1, u16 *arg2, u32 arg3)
+{
+ CpuSet(sLinkTestDigitTiles, buffer, 272);
+ debugCharacterBase = (uintptr_t)buffer;
+ unk_20238C8 = (uintptr_t)arg1;
+ debugTileMap = arg2;
+ unk_20238D0 = arg3;
+}
+
+void debug_sub_8008264(u32 value, int left, int top, int d, int e)
+{
+ s32 i;
+ u32 buffer[8];
+
+ if (unk_20238D0 == e)
+ {
+ u32 *ptr;
+ u16 *tilemapDest;
+
+ if (d > 8)
+ d = 8;
+ ptr = buffer;
+ for (i = 0; i < d; i++)
+ {
+ *ptr++ = value & 0xF;
+ value >>= 4;
+ }
+
+ tilemapDest = (u16 *)debugTileMap + top * 0x20 + left;
+ ptr = buffer + d - 1;
+ for (i = 0; i < d; i++)
+ {
+ *tilemapDest = (debugCharacterBase - unk_20238C8) / 32 + *ptr + 1;
+ ptr--;
+ tilemapDest++;
+ }
+ }
+}
+
+#endif
+
static void LinkCB_RequestPlayerDataExchange(void)
{
// Only one request needs to be sent, so only the master sends it.
@@ -1253,14 +1302,33 @@ void CB2_LinkError(void)
SetMainCallback2(CB2_PrintErrorMessage);
}
-static void CB2_PrintErrorMessage(void)
+void CB2_PrintErrorMessage(void)
{
- u8 array[64] __attribute__((unused)); // unused
+ u8 array[32] __attribute__((unused)); // unused
+ u8 array2[32] __attribute__((unused)); // unused
switch (gMain.state)
{
case 0:
Menu_PrintTextPixelCoords(gMultiText_LinkError, 20, 56, 1);
+#if DEBUG
+ StringCopy(array, sColorCodes);
+
+ ConvertIntToHexStringN(array2, sErrorLinkStatus, STR_CONV_MODE_LEADING_ZEROS, 8);
+ StringAppend(array, array2);
+
+ StringAppend(array, sEmptyString);
+
+ ConvertIntToHexStringN(array2, sErrorLastSendQueueCount, STR_CONV_MODE_LEADING_ZEROS, 2);
+ StringAppend(array, array2);
+
+ StringAppend(array, sEmptyString);
+
+ ConvertIntToHexStringN(array2, sErrorLastRecvQueueCount, STR_CONV_MODE_LEADING_ZEROS, 2);
+ StringAppend(array, array2);
+
+ Menu_PrintText(array, 2, 15);
+#endif
break;
case 30:
case 60:
diff --git a/src/engine/load_save.c b/src/load_save.c
index 8424b1121..8424b1121 100644
--- a/src/engine/load_save.c
+++ b/src/load_save.c
diff --git a/src/field/lottery_corner.c b/src/lottery_corner.c
index 03de26054..03de26054 100644
--- a/src/field/lottery_corner.c
+++ b/src/lottery_corner.c
diff --git a/src/mail.c b/src/mail.c
new file mode 100644
index 000000000..4497c98fb
--- /dev/null
+++ b/src/mail.c
@@ -0,0 +1,1159 @@
+#include "global.h"
+#include "mail.h"
+#include "data2.h"
+#include "easy_chat.h"
+#include "constants/items.h"
+#include "constants/species.h"
+#include "field_fadetransition.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 "script.h"
+#include "sprite.h"
+#include "string_util.h"
+#include "strings2.h"
+#include "task.h"
+#include "text.h"
+#include "scanline_effect.h"
+#include "ewram.h"
+
+extern u8 (*gMenuCallback)(void);
+
+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},
+};
+
+#if DEBUG
+
+const u8 Str_8411540[] = _("レイアウトを にほんごで ひょうじ?"); // Display using Japanese layout?
+const u8 Str_8411553[] = _("にほんご "); // Japanese
+const u8 Str_8411559[] = _("かいがい "); // Overseas
+
+const u8 *const _8411560[] =
+{
+ Str_8411553,
+ Str_8411559,
+};
+
+const u8 Str_8411568[] = _("イメージ タイプを えらんでね"); // Choose an image type
+const u8 Str_8411578[] = _("{STR_VAR_1}");
+const u8 Str_841157B[] = _("オレンジ "); // Orange
+const u8 Str_8411581[] = _("ハーバー "); // Harbor
+const u8 Str_8411587[] = _("キラキラ "); // Glitter
+const u8 Str_841158D[] = _("メカニカル"); // Mech
+const u8 Str_8411593[] = _("ウッディー"); // Wood
+const u8 Str_8411599[] = _("クロス  "); // Wave
+const u8 Str_841159F[] = _("トレジャー"); // Bead
+const u8 Str_84115A5[] = _("シャドウ "); // Shadow
+const u8 Str_84115AB[] = _("トロピカル"); // Tropic
+const u8 Str_84115B1[] = _("ドリーム "); // Dream
+const u8 Str_84115B7[] = _("ミラクル "); // Fab
+const u8 Str_84115BD[] = _("レトロ  "); // Retro
+
+const u8 *const _84115C4[] =
+{
+ Str_841157B,
+ Str_8411581,
+ Str_8411587,
+ Str_841158D,
+ Str_8411593,
+ Str_8411599,
+ Str_841159F,
+ Str_84115A5,
+ Str_84115AB,
+ Str_84115B1,
+ Str_84115B7,
+ Str_84115BD,
+};
+
+const u8 Str_84115F4[] = _("メールをみる"); // View Mail
+const u8 Str_84115FB[] = _("メールとうろく"); // Register Mail
+const u8 Str_8411603[] = _("もたせる"); // Give to Pokémon
+const u8 Str_8411608[] = _("メールをけす"); // Delete Mail
+
+#endif
+
+// 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);
+
+extern u16 gSpecialVar_0x8004;
+extern u16 gSpecialVar_0x8005;
+extern u16 gSpecialVar_0x8006;
+
+#if DEBUG
+static u8 gUnknown_Debug_0300079C;
+#endif
+
+void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2)
+{
+ u16 buffer[2];
+ u16 species;
+
+#if DEBUG
+ if (gUnknown_Debug_0300079C != 0)
+ {
+ ewram0_4.varFF = GAME_LANGUAGE;
+ ewram0_4.var100 = gSpecialVar_0x8004;
+ ewram0_4.var104 = (MainCallback)EasyChat_GetWordText;
+ ewram0_4.var108 = (MainCallback)ConvertEasyChatWordsToString;
+ ewram0_4.varFA = gSpecialVar_0x8006;
+ }
+ else
+#endif
+ {
+ ewram0_4.varFF = GAME_LANGUAGE;
+ ewram0_4.var100 = 1;
+ ewram0_4.var104 = (MainCallback)EasyChat_GetWordText;
+ ewram0_4.var108 = (MainCallback)ConvertEasyChatWordsToString;
+ if (IS_ITEM_MAIL(arg0->itemId))
+ {
+ ewram0_4.varFA = arg0->itemId - 0x79;
+ }
+ 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;
+ }
+
+ species = MailSpeciesToSpecies(arg0->species, buffer);
+ if (species >= 1 && species <= 411)
+ {
+ 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);
+ ScanlineEffect_Stop();
+ 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:
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6DFC);
+ RETURN_UP_STATE;
+
+ case 7:
+ MultistepInitMenuWindowBegin(&gWindowTemplate_81E6DFC);
+ RETURN_UP_STATE;
+
+ case 8:
+ if (MultistepInitMenuWindowContinue() == 0)
+ {
+ return FALSE;
+ }
+ RETURN_UP_STATE;
+
+ case 9:
+ Menu_EraseScreen();
+ 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;
+ Menu_PrintText(ewram0_4.words[pos], ewram0_4.var10C->var3_4 + x, ewram0_4.var10C->var3_0 + y);
+ y += 2;
+ }
+
+ Menu_PrintText(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)
+{
+ if (!UpdatePaletteFade())
+ {
+ SetMainCallback2(ewram0_4.varEC);
+ switch (ewram0_4.varFB)
+ {
+ case 2:
+ case 1:
+ sub_809D608(sub_809D4A8(ewram0_4.varF4->species));
+ sub_809D510(&gSprites[ewram0_4.varFC]);
+ break;
+ }
+#if !DEBUG
+ memset(&ewram0_4, 0, 0x110);
+#endif
+ ResetPaletteFade();
+ }
+}
+
+#if DEBUG
+
+void debug_sub_810CA7C(u8);
+void debug_sub_810CE1C(u8);
+void debug_sub_810D388(void);
+void debug_sub_810D340(void);
+
+void debug_sub_810C910(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ gUnknown_Debug_0300079C = 1;
+ Menu_EraseScreen();
+ DestroyTask(taskId);
+ if (gSaveBlock1.mail[gSpecialVar_0x8005].itemId == 0)
+ HandleReadMail(&gSaveBlock1.mail[gSpecialVar_0x8005], debug_sub_810D388, 0);
+ else
+ HandleReadMail(&gSaveBlock1.mail[gSpecialVar_0x8005], debug_sub_810D388, 1);
+ }
+}
+
+void debug_sub_810C990(u8 taskId)
+{
+ if (gMain.newKeys & (DPAD_LEFT | DPAD_DOWN))
+ {
+ gSpecialVar_0x8006 = (gSpecialVar_0x8006 + 11) % 12;
+ Menu_DrawStdWindowFrame(1, 1, 10, 4);
+ Menu_PrintText(_84115C4[gSpecialVar_0x8006], 2, 2);
+ }
+ else if (gMain.newKeys & (DPAD_UP | DPAD_RIGHT))
+ {
+ gSpecialVar_0x8006 = (gSpecialVar_0x8006 + 1) % 12;
+ Menu_DrawStdWindowFrame(1, 1, 10, 4);
+ Menu_PrintText(_84115C4[gSpecialVar_0x8006], 2, 2);
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ gTasks[taskId].func = debug_sub_810C910;
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ Menu_DisplayDialogueFrame();
+ Menu_PrintText(Str_8411540, 4, 15);
+ Menu_PrintText(_8411560[gSpecialVar_0x8004], 2, 2);
+ gTasks[taskId].func = debug_sub_810CA7C;
+ }
+}
+
+void debug_sub_810CA7C(u8 taskId)
+{
+ if (gMain.newKeys & 0xF0)
+ {
+ gSpecialVar_0x8004 ^= 1;
+ Menu_PrintText(_8411560[gSpecialVar_0x8004], 2, 2);
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ if (gMain.watchedKeysPressed)
+ {
+ gMain.watchedKeysPressed = FALSE;
+ Menu_DisplayDialogueFrame();
+ Menu_PrintText(Str_8411540, 4, 15);
+ Menu_DrawStdWindowFrame(1, 1, 10, 4);
+ Menu_PrintText(_8411560[gSpecialVar_0x8004], 2, 2);
+ }
+ else
+ {
+ Menu_DisplayDialogueFrame();
+ Menu_PrintText(Str_8411568, 4, 15);
+ Menu_DrawStdWindowFrame(1, 1, 10, 4);
+ Menu_PrintText(_84115C4[gSpecialVar_0x8006], 2, 2);
+ gTasks[taskId].func = debug_sub_810C990;
+ }
+ }
+}
+
+void debug_sub_810CB50(u8 taskId)
+{
+ u8 sp0[] = _("{STR_VAR_1} {STR_VAR_2}");
+ u8 sp8[] = _("メール{STR_VAR_1} {STR_VAR_2}");
+ bool8 r2 = FALSE;
+
+ if (gMain.newKeys & A_BUTTON)
+ {
+ ConvertIntToDecimalStringN(gStringVar1, gSpecialVar_0x8005, 2, 1);
+ StringCopy(gStringVar2, gSpeciesNames[gTasks[taskId].data[0]]);
+ gSaveBlock1.mail[gSpecialVar_0x8005].species = gTasks[taskId].data[0];
+ StringExpandPlaceholders(gStringVar4, sp8);
+ Menu_DisplayDialogueFrame();
+ Menu_PrintText(gStringVar4, 4, 15);
+ DestroyTask(taskId);
+ CreateTask(debug_sub_810CE1C, 0);
+ debug_sub_810D340();
+ return;
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ DestroyTask(taskId);
+ Menu_EraseScreen();
+ CreateTask(debug_sub_810CE1C, 0);
+ debug_sub_810D340();
+ return;
+ }
+ else if (gMain.newKeys & (DPAD_LEFT | DPAD_DOWN))
+ {
+ gTasks[taskId].data[0] = (gTasks[taskId].data[0] + 0x19B) % 0x19C;
+ r2 = TRUE;
+ }
+ else if (gMain.newKeys & (DPAD_UP | DPAD_RIGHT))
+ {
+ gTasks[taskId].data[0] = (gTasks[taskId].data[0] + 1) % 0x19C;
+ r2 = TRUE;
+ }
+
+ if (r2)
+ {
+ ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[0], 2, 3);
+ StringCopy(gStringVar2, gSpeciesNames[gTasks[taskId].data[0]]);
+ StringExpandPlaceholders(gStringVar4, sp0);
+ Menu_DrawStdWindowFrame(0, 0, 12, 3);
+ Menu_PrintText(gStringVar4, 1, 1);
+ }
+}
+
+void debug_sub_810CCEC(u8 taskId)
+{
+ u8 string1[] = _("メール{STR_VAR_1}を だれに もたせる?");
+ u8 string2[] = _("000 {STR_VAR_1}");
+
+ ConvertIntToDecimalStringN(gStringVar1, gSpecialVar_0x8005, 1, 1);
+ StringExpandPlaceholders(gStringVar4, string1);
+ Menu_DisplayDialogueFrame();
+ Menu_PrintText(gStringVar4, 4, 15);
+
+ StringCopy(gStringVar1, gSpeciesNames[0]);
+ StringExpandPlaceholders(gStringVar4, string2);
+ Menu_DrawStdWindowFrame(0, 0, 12, 3);
+ Menu_PrintText(string2, 1, 1); // This probably should have been gStringVar4
+
+ gTasks[taskId].func = debug_sub_810CB50;
+}
+
+u8 debug_sub_810CD9C(void)
+{
+ CloseMenu();
+ ScriptContext1_Stop();
+ ScriptContext2_Enable();
+ gUnknown_Debug_0300079C = 0;
+ gSpecialVar_0x8004 = gSpecialVar_0x8005 = gSpecialVar_0x8006 = 0;
+ SetMainCallback2(debug_sub_810D388);
+ return 1;
+}
+
+void debug_sub_810CDE0(void)
+{
+ UpdatePaletteFade();
+ RunTasks();
+}
+
+void debug_sub_810CDF0(void)
+{
+ gMain.watchedKeysPressed = 0;
+ gMain.watchedKeysMask = 0;
+ gFieldCallback = mapldr_default;
+ SetMainCallback2(c2_exit_to_overworld_2_switch);
+}
+
+void debug_sub_810CE1C(u8 taskId)
+{
+ if (gMenuCallback() == TRUE)
+ {
+ CloseMenu();
+ DestroyTask(taskId);
+ }
+}
+
+u8 debug_sub_810CE48(void)
+{
+ s8 input = Menu_ProcessInput();
+
+ switch (input)
+ {
+ case -1:
+ Menu_EraseScreen();
+ debug_sub_810D340();
+ return 0;
+ case -2:
+ return 0;
+ default:
+ gSpecialVar_0x8005 = input;
+ gSpecialVar_0x8006 %= 12;
+ CreateTask(debug_sub_810CA7C, 0);
+ gMain.watchedKeysPressed = TRUE; // huh?
+ gMain.watchedKeysMask = 0;
+ return 1;
+ }
+}
+
+u8 debug_sub_810CEA4(void)
+{
+ if (!gPaletteFade.active)
+ {
+ gSpecialVar_0x8004 = 4;
+ sub_80E60D8();
+ return 1;
+ }
+ return 0;
+}
+
+u8 debug_sub_810CED0(void)
+{
+ u8 text[] = _("せいきの データが とうろくずみ です\n"
+ "しんき とうろく できません");
+ s8 input = Menu_ProcessInput();
+
+ switch (input)
+ {
+ case -1:
+ Menu_EraseScreen();
+ break;
+ case -2:
+ return 0;
+ default:
+ gSpecialVar_0x8005 = input;
+ if (IS_ITEM_MAIL(gSaveBlock1.mail[input].itemId))
+ {
+ Menu_EraseScreen();
+ Menu_DisplayDialogueFrame();
+ Menu_PrintText(text, 4, 15);
+ }
+ else
+ {
+ gSaveBlock1.mail[gSpecialVar_0x8005].itemId = 0xFFFF;
+ StringCopy(gSaveBlock1.mail[gSpecialVar_0x8005].playerName, gSaveBlock2.playerName);
+ *(u32 *)gSaveBlock1.mail[gSpecialVar_0x8005].trainerId = *(u32 *)gSaveBlock2.playerTrainerId;
+ gMenuCallback = debug_sub_810CEA4;
+ return 0;
+ }
+ break;
+ }
+ debug_sub_810D340();
+ return 0;
+}
+
+u8 debug_sub_810CFA4(void)
+{
+ u8 text[] = _("せいきに とうろくされたメールデータは\n"
+ "へんこう できません");
+ s8 input = Menu_ProcessInput();
+
+ switch (input)
+ {
+ case -1:
+ Menu_EraseScreen();
+ debug_sub_810D340();
+ return 0;
+ case -2:
+ return 0;
+ default:
+ gSpecialVar_0x8005 = input;
+ if (IS_ITEM_MAIL(gSaveBlock1.mail[input].itemId))
+ {
+ Menu_EraseScreen();
+ Menu_DisplayDialogueFrame();
+ Menu_PrintText(text, 4, 15);
+ debug_sub_810D340();
+ return 0;
+ }
+ else
+ {
+ CreateTask(debug_sub_810CCEC, 0);
+ return 1;
+ }
+ }
+}
+
+u8 debug_sub_810D030(void)
+{
+ const u8 text1[] = _("メール{STR_VAR_1} とうろく かいじょ");
+ const u8 text2[] = _("デバッグメニューから とうろくした\n"
+ "メール いがいは けせません");
+ s8 input = Menu_ProcessInput();
+
+ switch (input)
+ {
+ case -1:
+ Menu_EraseScreen();
+ debug_sub_810D340();
+ return 0;
+ case -2:
+ return 0;
+ default:
+ gSpecialVar_0x8005 = input;
+ if (gSaveBlock1.mail[gSpecialVar_0x8005].itemId != 0xFFFF
+ && gSaveBlock1.mail[gSpecialVar_0x8005].itemId != 0)
+ {
+ Menu_EraseScreen();
+ Menu_DisplayDialogueFrame();
+ Menu_PrintText(text2, 4, 15);
+ debug_sub_810D340();
+ return 0;
+ }
+ else
+ {
+ s8 i;
+
+ gSaveBlock1.mail[gSpecialVar_0x8005].itemId = 0;
+ gSaveBlock1.mail[gSpecialVar_0x8005].species = 0;
+ gSaveBlock1.mail[gSpecialVar_0x8005].playerName[0] = EOS;
+ *(u32 *)gSaveBlock1.mail[gSpecialVar_0x8005].trainerId = 0;
+ for (i = 0; i < 9; i++)
+ gSaveBlock1.mail[gSpecialVar_0x8005].words[i] = 0xFFFF;
+ ConvertIntToDecimalStringN(gStringVar1, gSpecialVar_0x8005, 1, 1);
+ StringExpandPlaceholders(gStringVar4, text1);
+ Menu_EraseScreen();
+ Menu_DisplayDialogueFrame();
+ Menu_PrintText(gStringVar4, 4, 15);
+ debug_sub_810D340();
+ return 0;
+ }
+ }
+}
+
+void debug_sub_810D174(u8 a)
+{
+ u8 string[] = _("メール{STR_VAR_1} {STR_VAR_2} {STR_VAR_3}");
+ u8 buffer[9][20];
+ struct MenuAction menuActions[9];
+ u8 i;
+
+ for (i = 0; i < 9; i++)
+ {
+ ConvertIntToDecimalStringN(gStringVar1, i, 1, 1);
+ if (gSaveBlock1.mail[i].itemId == 0xFFFF)
+ {
+ ConvertIntToDecimalStringN(gStringVar2, 1, 1, 1);
+ }
+ else if (IS_ITEM_MAIL(gSaveBlock1.mail[i].itemId))
+ {
+ ConvertIntToDecimalStringN(gStringVar2, 2, 1, 1);
+ }
+ else
+ {
+ ConvertIntToDecimalStringN(gStringVar2, 0, 1, 1);
+ gSaveBlock1.mail[i].itemId = 0;
+ }
+ StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1.mail[i].species]);
+ StringExpandPlaceholders(buffer[i], string);
+ menuActions[i].text = buffer[i];
+ menuActions[i].func = NULL;
+ }
+ Menu_DrawStdWindowFrame(0, 0, 16, 19);
+ Menu_PrintItems(2, 1, 9, menuActions);
+ InitMenu(0, 1, 1, 9, 0, 15);
+ switch (a)
+ {
+ case 0:
+ gMenuCallback = debug_sub_810CE48;
+ break;
+ case 1:
+ gMenuCallback = debug_sub_810CED0;
+ break;
+ case 2:
+ gMenuCallback = debug_sub_810CFA4;
+ break;
+ case 3:
+ gMenuCallback = debug_sub_810D030;
+ break;
+ }
+}
+
+u8 debug_sub_810D2F4(void)
+{
+ s8 input = Menu_ProcessInput();
+
+ switch (input)
+ {
+ case -1:
+ SetMainCallback2(debug_sub_810CDF0);
+ return 1;
+ case -2:
+ return 0;
+ }
+
+ switch (input)
+ {
+ case 0:
+ debug_sub_810D174(input);
+ return 0;
+ case 1:
+ debug_sub_810D174(input);
+ return 0;
+ case 2:
+ debug_sub_810D174(input);
+ return 0;
+ case 3:
+ debug_sub_810D174(input);
+ return 0;
+ }
+
+ return 1;
+}
+
+const struct MenuAction _84116BC[] =
+{
+ {Str_84115F4, NULL},
+ {Str_84115FB, NULL},
+ {Str_8411603, NULL},
+ {Str_8411608, NULL},
+};
+
+void debug_sub_810D340(void)
+{
+ Menu_DrawStdWindowFrame(0, 0, 9, 9);
+ Menu_PrintItems(2, 1, 4, _84116BC);
+ InitMenu(0, 1, 1, 4, 0, 8);
+ gMenuCallback = debug_sub_810D2F4;
+}
+
+void debug_sub_810D388(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ if (gUnknown_Debug_0300079C != 0)
+ {
+ gMain.state = 2;
+ gUnknown_Debug_0300079C = 0;
+ return;
+ }
+ else
+ {
+ ScanlineEffect_Stop();
+ ResetPaletteFade();
+ SetVBlankCallback(sub_80F8F18);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ }
+ break;
+ case 1:
+ if (UpdatePaletteFade())
+ return;
+ break;
+ case 2:
+ SetVBlankCallback(NULL);
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG2HOFS = 0;
+ REG_BG3HOFS = 0;
+ REG_BG3VOFS = 0;
+ break;
+ case 3:
+ ResetSpriteData();
+ ResetTasks();
+ FreeAllSpritePalettes();
+ break;
+ case 4:
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4);
+ InitMenuWindow(&gWindowTemplate_81E6CE4);
+ Menu_EraseScreen();
+ break;
+ case 5:
+ LoadPalette(gMailGraphicsTable[0].palette, 0, 32);
+ LZ77UnCompVram(gMailGraphicsTable[0].tiles, (void *)VRAM);
+ DmaFill16(3, 1, (void *)(VRAM + 0x4000), 0x500);
+ break;
+ case 6:
+ REG_BG0CNT = 0x9F08;
+ REG_BG1CNT = 0x0801;
+ REG_BLDCNT = 0;
+ REG_DISPCNT = 0x0340;
+ debug_sub_810D340();
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
+ SetVBlankCallback(sub_80F8F18);
+ break;
+ case 7:
+ if (!UpdatePaletteFade())
+ return;
+ break;
+ case 8:
+ CreateTask(debug_sub_810CE1C, 0);
+ SetMainCallback2(debug_sub_810CDE0);
+ break;
+ default:
+ return;
+ }
+ gMain.state++;
+}
+
+#endif
diff --git a/src/pokemon/mail_data.c b/src/mail_data.c
index 4249b9f48..4249b9f48 100644
--- a/src/pokemon/mail_data.c
+++ b/src/mail_data.c
diff --git a/src/engine/main.c b/src/main.c
index 54a443e80..54a443e80 100644
--- a/src/engine/main.c
+++ b/src/main.c
diff --git a/src/engine/main_menu.c b/src/main_menu.c
index 5a3f55b29..5a3f55b29 100644
--- a/src/engine/main_menu.c
+++ b/src/main_menu.c
diff --git a/src/field/map_name_popup.c b/src/map_name_popup.c
index 49a470cc1..49a470cc1 100644
--- a/src/field/map_name_popup.c
+++ b/src/map_name_popup.c
diff --git a/src/field/map_obj_lock.c b/src/map_obj_lock.c
index 954fcb446..3bd25dbdf 100644
--- a/src/field/map_obj_lock.c
+++ b/src/map_obj_lock.c
@@ -1,7 +1,6 @@
#include "global.h"
#include "map_obj_lock.h"
-#include "field_map_obj.h"
-#include "field_map_obj_helpers.h"
+#include "event_object_movement.h"
#include "field_player_avatar.h"
#include "script_movement.h"
#include "task.h"
diff --git a/src/field/mauville_man.c b/src/mauville_man.c
index 0a841eed1..a68d5071d 100644
--- a/src/field/mauville_man.c
+++ b/src/mauville_man.c
@@ -250,7 +250,39 @@ void SetupMauvilleOldMan(void)
sub_80F83D0();
}
-static u8 GetCurrentMauvilleOldMan(void)
+#if DEBUG
+void debug_sub_810B32C(u8 a)
+{
+ u8 i;
+ u8 savedArr[8];
+
+ switch (a)
+ {
+ case 0:
+ SetupBard();
+ break;
+ case 1:
+ for (i = 0; i < 8; i++)
+ savedArr[i] = gSaveBlock1.unk2D8C[i];
+ SetupHipster();
+ for (i = 0; i < 8; i++)
+ gSaveBlock1.unk2D8C[i] = savedArr[i];
+ break;
+ case 2:
+ SetupTrader();
+ break;
+ case 3:
+ SetupStoryteller();
+ break;
+ case 4:
+ SetupGiddy();
+ break;
+ }
+ sub_80F83D0();
+}
+#endif
+
+u8 GetCurrentMauvilleOldMan(void)
{
struct MauvilleManCommon *common = &gSaveBlock1.mauvilleMan.common;
diff --git a/src/engine/menu.c b/src/menu.c
index 86e20d0eb..86e20d0eb 100644
--- a/src/engine/menu.c
+++ b/src/menu.c
diff --git a/src/engine/menu_cursor.c b/src/menu_cursor.c
index 35116d40b..f2eb31f16 100644
--- a/src/engine/menu_cursor.c
+++ b/src/menu_cursor.c
@@ -12,9 +12,9 @@ EWRAM_DATA static u8 gUnknown_0203A3D3 = 0;
EWRAM_DATA static u8 gUnknown_0203A3D4 = 0;
#if ENGLISH
-#include "../src/data/menu_cursor_en.h"
+#include "data/menu_cursor_en.h"
#elif GERMAN
-#include "../src/data/menu_cursor_de.h"
+#include "data/menu_cursor_de.h"
#endif // ENGLISH/GERMAN
void sub_814A590(void)
diff --git a/src/field/menu_helpers.c b/src/menu_helpers.c
index 388d98ec7..388d98ec7 100644
--- a/src/field/menu_helpers.c
+++ b/src/menu_helpers.c
diff --git a/src/field/metatile_behavior.c b/src/metatile_behavior.c
index d05ba0b89..d05ba0b89 100644
--- a/src/field/metatile_behavior.c
+++ b/src/metatile_behavior.c
diff --git a/src/pokemon/mon_markings.c b/src/mon_markings.c
index 66c82a706..dcdc54434 100644
--- a/src/pokemon/mon_markings.c
+++ b/src/mon_markings.c
@@ -5,6 +5,7 @@
#include "constants/songs.h"
#include "sound.h"
#include "sprite.h"
+#include "mon_markings.h"
#ifdef GERMAN
#define MENU_TEXT_SPRITE_X_OFFSET 24
@@ -12,25 +13,6 @@
#define MENU_TEXT_SPRITE_X_OFFSET 32
#endif
-struct PokemonMarkMenu
-{
- /*0x0000*/ u16 baseTileTag;
- /*0x0002*/ u16 basePaletteTag;
- /*0x0004*/ u8 markings; // bit flags
- /*0x0005*/ s8 cursorPos;
- /*0x0006*/ bool8 markingsArray[4];
- /*0x000A*/ u8 cursorBaseY;
- /*0x000B*/ bool8 spriteSheetLoadRequired;
- /*0x000C*/ struct Sprite *menuWindowSprites[2]; // upper and lower halves of menu window
- /*0x0014*/ struct Sprite *menuMarkingSprites[4];
- /*0x0024*/ struct Sprite *menuTextSprite;
- /*0x0028*/ const u8 *frameTiles;
- /*0x002C*/ const u16 *framePalette;
- /*0x0030*/ u8 menuWindowSpriteTiles[0x1000];
- /*0x1030*/ u8 filler1030[0x80];
- /*0x10B0*/ u8 tileLoadState;
-};
-
extern u8 gPokenavConditionMenuMisc_Gfx[];
extern u16 gUnknown_08E966B8[];
diff --git a/src/field/money.c b/src/money.c
index 3b7268dbc..3b7268dbc 100644
--- a/src/field/money.c
+++ b/src/money.c
diff --git a/src/engine/mystery_event_menu.c b/src/mystery_event_menu.c
index 8fad563e6..56801ff53 100644
--- a/src/engine/mystery_event_menu.c
+++ b/src/mystery_event_menu.c
@@ -13,6 +13,7 @@
#include "strings2.h"
#include "task.h"
#include "text.h"
+#include "title_screen.h"
#include "ewram.h"
static EWRAM_DATA u8 gUnknown_02039338 = 0;
@@ -338,3 +339,156 @@ static void CB2_MysteryEventMenu(void)
BuildOamBuffer();
UpdatePaletteFade();
}
+
+#if DEBUG
+
+static const u8 Str_843DA70[] = _("CARDーE emulation。。。");
+static const u8 Str_843DA84[] = _("LR: select A: send。");
+static const u8 Str_843DA98[] = _("sending。。。");
+static const u8 Str_843DAA3[] = _("completed。");
+
+extern const struct {const u8 *text; void (*func)();} gUnknown_Debug_842E2D0[];
+extern const u8 gUnknown_Debug_842E350;
+
+void debug_sub_815D1D8();
+
+void debug_sub_815D04C(u8 taskId)
+{
+ if (gTasks[taskId].data[0] == 0)
+ {
+ Menu_DrawStdWindowFrame(4, 4, 13, 7);
+ Menu_PrintText(gUnknown_Debug_842E2D0[gTasks[taskId].data[1]].text, 5, 5);
+ gTasks[taskId].data[0]++;
+ }
+
+ if (gMain.newKeys & 0x20)
+ {
+ if (gTasks[taskId].data[1] == 0)
+ gTasks[taskId].data[1] = gUnknown_Debug_842E350 - 1;
+ else
+ gTasks[taskId].data[1]--;
+ gTasks[taskId].data[0] = 0;
+ }
+ if (gMain.newKeys & 0x10)
+ {
+ if (gTasks[taskId].data[1] == gUnknown_Debug_842E350 - 1)
+ gTasks[taskId].data[1] = 0;
+ else
+ gTasks[taskId].data[1]++;
+ gTasks[taskId].data[0] = 0;
+ }
+ if (gMain.newKeys & A_BUTTON)
+ {
+ // TODO: fix this
+ s32 var = gTasks[taskId].data[1];
+ asm(""::"r"(var * 8));
+ gUnknown_Debug_842E2D0[var].func(gSharedMem + 0x4000);
+
+ gMain.state++;
+ DestroyTask(taskId);
+ }
+}
+
+void debug_sub_815D15C(void)
+{
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ ResetTasks();
+ SetVBlankCallback(VBlankCB);
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4);
+ InitMenuWindow(&gWindowTemplate_81E6CE4);
+ Menu_EraseScreen();
+ REG_DISPCNT = DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP | DISPCNT_MODE_0;
+ REG_BLDCNT = 0;
+
+ CreateTask(Task_DestroySelf, 0);
+ StopMapMusic();
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+ FillPalette(0, 0, 2);
+ SetMainCallback2(debug_sub_815D1D8);
+}
+
+void debug_sub_815D1D8(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ Menu_DrawStdWindowFrame(3, 14, 27, 19);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
+ gMain.state++;
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ {
+ if (gMain.heldKeys & 0x100)
+ gUnknown_Debug_30030E0++;
+ MenuPrintMessage(Str_843DA70, 4, 15);
+ gMain.state++;
+ }
+ break;
+ case 2:
+ if (Menu_UpdateWindowText())
+ {
+ gMain.state++;
+ gLinkType = 0x5501;
+ OpenLink();
+ }
+ break;
+ case 3:
+ if (gReceivedRemoteLinkPlayers != 0)
+ {
+ gMain.state++;
+ MenuPrintMessage(Str_843DA84, 4, 15);
+ }
+ break;
+ case 4:
+ if (Menu_UpdateWindowText())
+ {
+ CreateTask(debug_sub_815D04C, 10);
+ gMain.state++;
+ }
+ break;
+ case 6:
+ MenuPrintMessage(Str_843DA98, 4, 15);
+ SendBlock(0, gSharedMem + 0x4000, 0x2004);
+ gMain.state++;
+ break;
+ case 7:
+ Menu_UpdateWindowText();
+ if (IsLinkTaskFinished())
+ gMain.state++;
+ break;
+ case 8:
+ sub_800832C();
+ gMain.state++;
+ break;
+ case 9:
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ Menu_BlankWindowRect(4, 15, 26, 18);
+ Menu_PrintText(Str_843DAA3, 4, 15);
+ gMain.state++;
+ }
+ break;
+ case 10:
+ if (gMain.newKeys & A_BUTTON)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ gMain.state++;
+ }
+ break;
+ case 11:
+ if (!gPaletteFade.active)
+ SetMainCallback2(CB2_InitTitleScreen);
+ break;
+ }
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+#endif
diff --git a/src/engine/mystery_event_msg.c b/src/mystery_event_msg.c
index 03ef22727..03ef22727 100644
--- a/src/engine/mystery_event_msg.c
+++ b/src/mystery_event_msg.c
diff --git a/src/engine/mystery_event_script.c b/src/mystery_event_script.c
index 6fcad66ac..6fcad66ac 100644
--- a/src/engine/mystery_event_script.c
+++ b/src/mystery_event_script.c
diff --git a/src/engine/name_string_util.c b/src/name_string_util.c
index 32e9358e1..32e9358e1 100644
--- a/src/engine/name_string_util.c
+++ b/src/name_string_util.c
diff --git a/src/engine/naming_screen.c b/src/naming_screen.c
index 97819322c..59b9b4d84 100644
--- a/src/engine/naming_screen.c
+++ b/src/naming_screen.c
@@ -3,7 +3,7 @@
#include "data2.h"
#include "graphics.h"
#include "field_effect.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "field_player_avatar.h"
#include "main.h"
#include "menu.h"
@@ -26,8 +26,6 @@
#define COLUMN_COUNT 10
#endif
-extern u16 gKeyRepeatStartDelay;
-
extern u8 CreateMonIcon(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u32 personality);
const u8 gSpriteImage_83CE094[] = INCBIN_U8("graphics/naming_screen/pc_icon/0.4bpp");
diff --git a/src/scene/new_game.c b/src/new_game.c
index 0279f99c6..f8a5524f5 100644
--- a/src/scene/new_game.c
+++ b/src/new_game.c
@@ -1,4 +1,7 @@
#include "global.h"
+#include "constants/maps.h"
+#include "constants/species.h"
+#include "clock.h"
#include "new_game.h"
#include "battle_records.h"
#include "berry.h"
@@ -20,6 +23,7 @@
#include "pokemon_storage_system.h"
#include "random.h"
#include "roamer.h"
+#include "script_pokemon_80C4.h"
#include "overworld.h"
#include "rtc.h"
#include "script.h"
@@ -42,6 +46,18 @@ static const struct ContestWinner sEmptyMuseumPortrait =
.trainerName = {EOS},
};
+#if DEBUG
+const s8 gUnknown_Debug_0823C788[][2] =
+{
+ { MAP_GROUP(INSIDE_OF_TRUCK), MAP_NUM(INSIDE_OF_TRUCK) },
+ { MAP_GROUP(OLDALE_TOWN_POKEMON_CENTER_2F), MAP_NUM(OLDALE_TOWN_POKEMON_CENTER_2F) },
+ { MAP_GROUP(LITTLEROOT_TOWN), MAP_NUM(LITTLEROOT_TOWN) },
+ { MAP_GROUP(LITTLEROOT_TOWN_BRENDANS_HOUSE_2F), MAP_NUM(LITTLEROOT_TOWN_BRENDANS_HOUSE_2F) }
+};
+
+const u8 gUnknown_Debug_0823C790[] = _("KRÖTE");
+#endif
+
void write_word_to_mem(u32 var, u8 *dataPtr)
{
dataPtr[0] = var;
@@ -94,9 +110,33 @@ void ZeroBattleTowerData(void)
CpuFill32(0, &gSaveBlock2.battleTower, sizeof(gSaveBlock2.battleTower));
}
+#if DEBUG
+void debug_sub_8052E04()
+{
+ u8 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (gUnknown_Debug_0823C788[i][0] == gSaveBlock1.location.mapGroup &&
+ gUnknown_Debug_0823C788[i][1] == gSaveBlock1.location.mapNum)
+ {
+ break;
+ }
+ }
+
+ i++;
+ if (i >= 4)
+ {
+ i = 0;
+ }
+
+ Overworld_SetWarpDestination(gUnknown_Debug_0823C788[i][0], gUnknown_Debug_0823C788[i][1], -1, -1, -1);
+}
+#endif
+
void WarpToTruck(void)
{
- Overworld_SetWarpDestination(25, 40, -1, -1, -1); // inside of truck
+ Overworld_SetWarpDestination(MAP_GROUP(INSIDE_OF_TRUCK), MAP_NUM(INSIDE_OF_TRUCK), -1, -1, -1);
warp_in();
}
@@ -109,6 +149,9 @@ void ClearSav2(void)
void sub_8052E4C(void)
{
gDifferentSaveFile = 0;
+#if DEBUG
+ gUnknown_020297ED = 0;
+#endif
sub_808C0A0();
ZeroPlayerPartyMons();
ZeroEnemyPartyMons();
@@ -161,3 +204,33 @@ void NewGameInitData(void)
WarpToTruck();
ScriptContext2_RunNewScript(gUnknown_0819FA81);
}
+
+#if DEBUG
+extern void debug_sub_80A3904(void);
+extern void debug_sub_80A3714(void);
+extern void debug_sub_8120F98(void);
+extern void unref_sub_8070F90(void);
+
+void debug_sub_8057508(bool32 arg0)
+{
+ gUnknown_020297ED = 1;
+ NewGameInitData();
+ gSaveBlock1.money = 999999;
+ FlagSet(FLAG_SYS_POKEMON_GET);
+ FlagSet(FLAG_SYS_POKEDEX_GET);
+ FlagSet(FLAG_SYS_POKENAV_GET);
+ FlagSet(FLAG_SYS_B_DASH);
+ ScriptGiveMon(SPECIES_TREECKO, 99, 0, 0, 0, 0);
+
+ if (arg0 == TRUE)
+ SetMonData(&gPlayerParty[0], MON_DATA_NICKNAME, gUnknown_Debug_0823C790);
+
+ debug_sub_80A3904();
+ debug_sub_80A3714();
+ debug_sub_8120F98();
+ FlagSet(FLAG_SYS_HIPSTER_MEET);
+ sub_80EB8EC();
+ unref_sub_8070F90();
+ InitTimeBasedEvents();
+}
+#endif
diff --git a/src/engine/option_menu.c b/src/option_menu.c
index d4e921a0e..a2d32ffb6 100644
--- a/src/engine/option_menu.c
+++ b/src/option_menu.c
@@ -10,19 +10,9 @@
extern void SetPokemonCryStereo(u32 val);
-//Task data
-enum {
- TD_MENUSELECTION,
- TD_TEXTSPEED,
- TD_BATTLESCENE,
- TD_BATTLESTYLE,
- TD_SOUND,
- TD_BUTTONMODE,
- TD_FRAMETYPE,
-};
-
-//Menu items
-enum {
+// Menu items
+enum
+{
MENUITEM_TEXTSPEED,
MENUITEM_BATTLESCENE,
MENUITEM_BATTLESTYLE,
@@ -32,6 +22,15 @@ enum {
MENUITEM_CANCEL,
};
+// Task data
+#define tMenuSelection data[0]
+#define tOptTextSpeed data[1]
+#define tOptBattleScene data[2]
+#define tOptBattleStyle data[3]
+#define tOptSound data[4]
+#define tOptButtonMode data[5]
+#define tOptFrameType data[6]
+
const u16 gUnknown_0839F5FC[] = INCBIN_U16("graphics/misc/option_menu_text.gbapal");
// note: this is only used in the Japanese release
const u8 gUnknown_0839F63C[] = INCBIN_U8("graphics/misc/option_menu_equals_sign.4bpp");
@@ -75,7 +74,6 @@ void CB2_InitOptionMenu(void)
{
default:
case 0:
- {
SetVBlankCallback(NULL);
REG_DISPCNT = 0;
REG_BG2CNT = 0;
@@ -92,7 +90,6 @@ void CB2_InitOptionMenu(void)
DmaClear16(3, PLTT, PLTT_SIZE);
gMain.state++;
break;
- }
case 1:
ResetPaletteFade();
ScanlineEffect_Stop();
@@ -150,37 +147,38 @@ void CB2_InitOptionMenu(void)
{
u8 taskId = CreateTask(Task_OptionMenuFadeIn, 0);
- gTasks[taskId].data[TD_MENUSELECTION] = 0;
- gTasks[taskId].data[TD_TEXTSPEED] = gSaveBlock2.optionsTextSpeed;
- gTasks[taskId].data[TD_BATTLESCENE] = gSaveBlock2.optionsBattleSceneOff;
- gTasks[taskId].data[TD_BATTLESTYLE] = gSaveBlock2.optionsBattleStyle;
- gTasks[taskId].data[TD_SOUND] = gSaveBlock2.optionsSound;
- gTasks[taskId].data[TD_BUTTONMODE] = gSaveBlock2.optionsButtonMode;
- gTasks[taskId].data[TD_FRAMETYPE] = gSaveBlock2.optionsWindowFrameType;
-
- Menu_DrawStdWindowFrame(2, 0, 27, 3);
- Menu_DrawStdWindowFrame(2, 4, 27, 19);
-
- Menu_PrintText(gSystemText_OptionMenu, 4, 1);
- Menu_PrintText(gSystemText_TextSpeed, 4, 5);
- Menu_PrintText(gSystemText_BattleScene, 4, 7);
- Menu_PrintText(gSystemText_BattleStyle, 4, 9);
- Menu_PrintText(gSystemText_Sound, 4, 11);
- Menu_PrintText(gSystemText_ButtonMode, 4, 13);
- Menu_PrintText(gSystemText_Frame, 4, 15);
- Menu_PrintText(gSystemText_Cancel, 4, 17);
-
- TextSpeed_DrawChoices(gTasks[taskId].data[TD_TEXTSPEED]);
- BattleScene_DrawChoices(gTasks[taskId].data[TD_BATTLESCENE]);
- BattleStyle_DrawChoices(gTasks[taskId].data[TD_BATTLESTYLE]);
- Sound_DrawChoices(gTasks[taskId].data[TD_SOUND]);
- ButtonMode_DrawChoices(gTasks[taskId].data[TD_BUTTONMODE]);
- FrameType_DrawChoices(gTasks[taskId].data[TD_FRAMETYPE]);
+ gTasks[taskId].tMenuSelection = 0;
+ gTasks[taskId].tOptTextSpeed = gSaveBlock2.optionsTextSpeed;
+ gTasks[taskId].tOptBattleScene = gSaveBlock2.optionsBattleSceneOff;
+ gTasks[taskId].tOptBattleStyle = gSaveBlock2.optionsBattleStyle;
+ gTasks[taskId].tOptSound = gSaveBlock2.optionsSound;
+ gTasks[taskId].tOptButtonMode = gSaveBlock2.optionsButtonMode;
+ gTasks[taskId].tOptFrameType = gSaveBlock2.optionsWindowFrameType;
+
+ Menu_DrawStdWindowFrame(2, 0, 27, 3); // title box
+ Menu_DrawStdWindowFrame(2, 4, 27, 19); // options list box
+
+ Menu_PrintText(gSystemText_OptionMenu, 4, 1);
+
+ Menu_PrintText(gSystemText_TextSpeed, 4, 5);
+ Menu_PrintText(gSystemText_BattleScene, 4, 7);
+ Menu_PrintText(gSystemText_BattleStyle, 4, 9);
+ Menu_PrintText(gSystemText_Sound, 4, 11);
+ Menu_PrintText(gSystemText_ButtonMode, 4, 13);
+ Menu_PrintText(gSystemText_Frame, 4, 15);
+ Menu_PrintText(gSystemText_Cancel, 4, 17);
+
+ TextSpeed_DrawChoices(gTasks[taskId].tOptTextSpeed);
+ BattleScene_DrawChoices(gTasks[taskId].tOptBattleScene);
+ BattleStyle_DrawChoices(gTasks[taskId].tOptBattleStyle);
+ Sound_DrawChoices(gTasks[taskId].tOptSound);
+ ButtonMode_DrawChoices(gTasks[taskId].tOptButtonMode);
+ FrameType_DrawChoices(gTasks[taskId].tOptFrameType);
REG_WIN0H = WIN_RANGE(17, 223);
REG_WIN0V = WIN_RANGE(1, 31);
- HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]);
+ HighlightOptionMenuItem(gTasks[taskId].tMenuSelection);
gMain.state++;
break;
}
@@ -193,16 +191,14 @@ void CB2_InitOptionMenu(void)
static void Task_OptionMenuFadeIn(u8 taskId)
{
if (!gPaletteFade.active)
- {
gTasks[taskId].func = Task_OptionMenuProcessInput;
- }
}
static void Task_OptionMenuProcessInput(u8 taskId)
{
if (gMain.newKeys & A_BUTTON)
{
- if (gTasks[taskId].data[TD_MENUSELECTION] == MENUITEM_CANCEL)
+ if (gTasks[taskId].tMenuSelection == MENUITEM_CANCEL)
gTasks[taskId].func = Task_OptionMenuSave;
}
else if (gMain.newKeys & B_BUTTON)
@@ -211,47 +207,47 @@ static void Task_OptionMenuProcessInput(u8 taskId)
}
else if (gMain.newKeys & DPAD_UP)
{
- if (gTasks[taskId].data[TD_MENUSELECTION] > 0)
- gTasks[taskId].data[TD_MENUSELECTION]--;
+ if (gTasks[taskId].tMenuSelection > 0)
+ gTasks[taskId].tMenuSelection--;
else
- gTasks[taskId].data[TD_MENUSELECTION] = 6;
- HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]);
+ gTasks[taskId].tMenuSelection = 6;
+ HighlightOptionMenuItem(gTasks[taskId].tMenuSelection);
}
else if (gMain.newKeys & DPAD_DOWN)
{
- if (gTasks[taskId].data[TD_MENUSELECTION] <= 5)
- gTasks[taskId].data[TD_MENUSELECTION]++;
+ if (gTasks[taskId].tMenuSelection < 6)
+ gTasks[taskId].tMenuSelection++;
else
- gTasks[taskId].data[TD_MENUSELECTION] = 0;
- HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]);
+ gTasks[taskId].tMenuSelection = 0;
+ HighlightOptionMenuItem(gTasks[taskId].tMenuSelection);
}
else
{
- switch (gTasks[taskId].data[TD_MENUSELECTION])
+ switch (gTasks[taskId].tMenuSelection)
{
case MENUITEM_TEXTSPEED:
- gTasks[taskId].data[TD_TEXTSPEED] = TextSpeed_ProcessInput(gTasks[taskId].data[TD_TEXTSPEED]);
- TextSpeed_DrawChoices(gTasks[taskId].data[TD_TEXTSPEED]);
+ gTasks[taskId].tOptTextSpeed = TextSpeed_ProcessInput(gTasks[taskId].tOptTextSpeed);
+ TextSpeed_DrawChoices(gTasks[taskId].tOptTextSpeed);
break;
case MENUITEM_BATTLESCENE:
- gTasks[taskId].data[TD_BATTLESCENE] = BattleScene_ProcessInput(gTasks[taskId].data[TD_BATTLESCENE]);
- BattleScene_DrawChoices(gTasks[taskId].data[TD_BATTLESCENE]);
+ gTasks[taskId].tOptBattleScene = BattleScene_ProcessInput(gTasks[taskId].tOptBattleScene);
+ BattleScene_DrawChoices(gTasks[taskId].tOptBattleScene);
break;
case MENUITEM_BATTLESTYLE:
- gTasks[taskId].data[TD_BATTLESTYLE] = BattleStyle_ProcessInput(gTasks[taskId].data[TD_BATTLESTYLE]);
- BattleStyle_DrawChoices(gTasks[taskId].data[TD_BATTLESTYLE]);
+ gTasks[taskId].tOptBattleStyle = BattleStyle_ProcessInput(gTasks[taskId].tOptBattleStyle);
+ BattleStyle_DrawChoices(gTasks[taskId].tOptBattleStyle);
break;
case MENUITEM_SOUND:
- gTasks[taskId].data[TD_SOUND] = Sound_ProcessInput(gTasks[taskId].data[TD_SOUND]);
- Sound_DrawChoices(gTasks[taskId].data[TD_SOUND]);
+ gTasks[taskId].tOptSound = Sound_ProcessInput(gTasks[taskId].tOptSound);
+ Sound_DrawChoices(gTasks[taskId].tOptSound);
break;
case MENUITEM_BUTTONMODE:
- gTasks[taskId].data[TD_BUTTONMODE] = ButtonMode_ProcessInput(gTasks[taskId].data[TD_BUTTONMODE]);
- ButtonMode_DrawChoices(gTasks[taskId].data[TD_BUTTONMODE]);
+ gTasks[taskId].tOptButtonMode = ButtonMode_ProcessInput(gTasks[taskId].tOptButtonMode);
+ ButtonMode_DrawChoices(gTasks[taskId].tOptButtonMode);
break;
case MENUITEM_FRAMETYPE:
- gTasks[taskId].data[TD_FRAMETYPE] = FrameType_ProcessInput(gTasks[taskId].data[TD_FRAMETYPE]);
- FrameType_DrawChoices(gTasks[taskId].data[TD_FRAMETYPE]);
+ gTasks[taskId].tOptFrameType = FrameType_ProcessInput(gTasks[taskId].tOptFrameType);
+ FrameType_DrawChoices(gTasks[taskId].tOptFrameType);
break;
}
}
@@ -259,12 +255,12 @@ static void Task_OptionMenuProcessInput(u8 taskId)
static void Task_OptionMenuSave(u8 taskId)
{
- gSaveBlock2.optionsTextSpeed = gTasks[taskId].data[TD_TEXTSPEED];
- gSaveBlock2.optionsBattleSceneOff = gTasks[taskId].data[TD_BATTLESCENE];
- gSaveBlock2.optionsBattleStyle = gTasks[taskId].data[TD_BATTLESTYLE];
- gSaveBlock2.optionsSound = gTasks[taskId].data[TD_SOUND];
- gSaveBlock2.optionsButtonMode = gTasks[taskId].data[TD_BUTTONMODE];
- gSaveBlock2.optionsWindowFrameType = gTasks[taskId].data[TD_FRAMETYPE];
+ gSaveBlock2.optionsTextSpeed = gTasks[taskId].tOptTextSpeed;
+ gSaveBlock2.optionsBattleSceneOff = gTasks[taskId].tOptBattleScene;
+ gSaveBlock2.optionsBattleStyle = gTasks[taskId].tOptBattleStyle;
+ gSaveBlock2.optionsSound = gTasks[taskId].tOptSound;
+ gSaveBlock2.optionsButtonMode = gTasks[taskId].tOptButtonMode;
+ gSaveBlock2.optionsWindowFrameType = gTasks[taskId].tOptFrameType;
BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
gTasks[taskId].func = Task_OptionMenuFadeOut;
@@ -290,10 +286,10 @@ static void HighlightOptionMenuItem(u8 index)
static void DrawOptionMenuChoice(const u8 *text, u8 x, u8 y, u8 style)
{
- u8 dst[16];
+ u8 dst[15];
u16 i;
- for (i = 0; *text != EOS && i <= 14; i++)
+ for (i = 0; *text != EOS && i < 15; i++)
dst[i] = *(text++);
dst[2] = style;
@@ -305,14 +301,14 @@ static u8 TextSpeed_ProcessInput(u8 selection)
{
if (gMain.newKeys & DPAD_RIGHT)
{
- if (selection <= 1)
+ if (selection < 2)
selection++;
else
selection = 0;
}
if (gMain.newKeys & DPAD_LEFT)
{
- if (selection != 0)
+ if (selection > 0)
selection--;
else
selection = 2;
@@ -341,7 +337,7 @@ static void TextSpeed_DrawChoices(u8 selection)
styles[selection] = 0x8;
DrawOptionMenuChoice(gSystemText_Slow, TEXTSPEED_SLOW_LEFT, 40, styles[0]);
- DrawOptionMenuChoice(gSystemText_Mid, TEXTSPEED_MIX_LEFT, 40, styles[1]);
+ DrawOptionMenuChoice(gSystemText_Mid, TEXTSPEED_MIX_LEFT, 40, styles[1]);
DrawOptionMenuChoice(gSystemText_Fast, TEXTSPEED_FAST_LEFT, 40, styles[2]);
}
@@ -360,7 +356,7 @@ static void BattleScene_DrawChoices(u8 selection)
styles[1] = 0xF;
styles[selection] = 0x8;
- DrawOptionMenuChoice(gSystemText_On, 120, 56, styles[0]);
+ DrawOptionMenuChoice(gSystemText_On, 120, 56, styles[0]);
DrawOptionMenuChoice(gSystemText_Off, 190, 56, styles[1]);
}
@@ -388,7 +384,7 @@ static void BattleStyle_DrawChoices(u8 selection)
styles[selection] = 0x8;
DrawOptionMenuChoice(gSystemText_Shift, BATTLESTYLE_SHIFT, 72, styles[0]);
- DrawOptionMenuChoice(gSystemText_Set, BATTLESTYLE_SET, 72, styles[1]);
+ DrawOptionMenuChoice(gSystemText_Set, BATTLESTYLE_SET, 72, styles[1]);
}
static u8 Sound_ProcessInput(u8 selection)
@@ -409,7 +405,7 @@ static void Sound_DrawChoices(u8 selection)
styles[1] = 0xF;
styles[selection] = 0x8;
- DrawOptionMenuChoice(gSystemText_Mono, 120, 88, styles[0]);
+ DrawOptionMenuChoice(gSystemText_Mono, 120, 88, styles[0]);
DrawOptionMenuChoice(gSystemText_Stereo, 172, 88, styles[1]);
}
@@ -425,7 +421,7 @@ static u8 FrameType_ProcessInput(u8 selection)
}
if (gMain.newKeys & DPAD_LEFT)
{
- if (selection != 0)
+ if (selection > 0)
selection--;
else
selection = 19;
@@ -439,11 +435,11 @@ static u8 FrameType_ProcessInput(u8 selection)
#if ENGLISH
static void FrameType_DrawChoices(u8 selection)
{
- u8 text[8];
+ u8 text[6];
u8 n = selection + 1;
u16 i;
- for (i = 0; gSystemText_Terminator[i] != EOS && i <= 5; i++)
+ for (i = 0; gSystemText_Terminator[i] != EOS && i < 6; i++)
text[i] = gSystemText_Terminator[i];
//Convert number to decimal string
@@ -534,14 +530,14 @@ static u8 ButtonMode_ProcessInput(u8 selection)
{
if (gMain.newKeys & DPAD_RIGHT)
{
- if (selection <= 1)
+ if (selection < 2)
selection++;
else
selection = 0;
}
if (gMain.newKeys & DPAD_LEFT)
{
- if (selection != 0)
+ if (selection > 0)
selection--;
else
selection = 2;
@@ -559,6 +555,6 @@ static void ButtonMode_DrawChoices(u8 selection)
styles[selection] = 0x8;
DrawOptionMenuChoice(gSystemText_Normal, 120, 104, styles[0]);
- DrawOptionMenuChoice(gSystemText_LR, 166, 104, styles[1]);
- DrawOptionMenuChoice(gSystemText_LA, 188, 104, styles[2]);
+ DrawOptionMenuChoice(gSystemText_LR, 166, 104, styles[1]);
+ DrawOptionMenuChoice(gSystemText_LA, 188, 104, styles[2]);
}
diff --git a/src/field/overworld.c b/src/overworld.c
index a6d34e103..6376aa1af 100644
--- a/src/field/overworld.c
+++ b/src/overworld.c
@@ -9,9 +9,7 @@
#include "field_control_avatar.h"
#include "field_effect.h"
#include "field_fadetransition.h"
-#include "field_ground_effect.h"
-#include "field_map_obj.h"
-#include "field_map_obj_helpers.h"
+#include "event_object_movement.h"
#include "field_message_box.h"
#include "field_player_avatar.h"
#include "field_screen_effect.h"
@@ -25,6 +23,7 @@
#include "link.h"
#include "load_save.h"
#include "main.h"
+#include "m4a.h"
#include "constants/maps.h"
#include "map_name_popup.h"
#include "menu.h"
@@ -62,6 +61,7 @@ struct UnkTVStruct
u32 tv_field_4;
};
+extern u8 gUnknown_020297ED;
extern u16 gUnknown_03004898;
extern u16 gUnknown_0300489C;
@@ -590,7 +590,7 @@ bool8 sub_80538D0(u16 x, u16 y)
void sub_80538F0(u8 mapGroup, u8 mapNum)
{
- s32 i;
+ s32 paletteIndex;
Overworld_SetWarpDestination(mapGroup, mapNum, -1, -1, -1);
sub_8053F0C();
@@ -611,8 +611,8 @@ void sub_80538F0(u8 mapGroup, u8 mapNum)
sub_8056D38(gMapHeader.mapData);
apply_map_tileset2_palette(gMapHeader.mapData);
- for (i = 6; i < 12; i++)
- sub_807D874(i);
+ for (paletteIndex = 6; paletteIndex < 12; paletteIndex++)
+ ApplyWeatherGammaShiftToPal(paletteIndex);
sub_8072ED0();
UpdateLocationHistoryForRoamer();
@@ -1106,6 +1106,68 @@ u8 sav1_map_get_battletype(void)
return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum)->battleType;
}
+#if DEBUG
+
+void debug_sub_8076B68(void);
+
+void debug_sub_80589D8(void);
+
+void debug_sub_8058A50(void);
+
+void CB2_InitTestMenu(void)
+{
+ m4aSoundVSyncOff();
+ SetVBlankCallback(NULL);
+ DmaFill32(3, 0, (void *) VRAM, VRAM_SIZE);
+ DmaFill32(3, 0, (void *) PLTT, PLTT_SIZE);
+ ResetPaletteFade();
+ ResetSpriteData();
+ ResetTasks();
+ ScanlineEffect_Stop();
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4);
+ InitMenuWindow(&gWindowTemplate_81E6CE4);
+ debug_sub_8076B68();
+ BeginNormalPaletteFade(-1, 0, 16, 0, 0);
+ REG_IE |= 1;
+ REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP;
+ m4aSoundVSyncOn();
+ SetVBlankCallback(debug_sub_8058A50);
+ m4aSongNumStart(0x19D);
+ SetMainCallback2(debug_sub_80589D8);
+}
+
+void debug_sub_80589D8(void)
+{
+ if (UpdatePaletteFade())
+ return;
+
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+}
+
+void debug_sub_80589F4(void)
+{
+ if (UpdatePaletteFade())
+ return;
+
+ SetVBlankCallback(NULL);
+
+ DmaFill32(3, 0, (void *) VRAM, VRAM_SIZE);
+ DmaFill32(3, 0, (void *) PLTT, PLTT_SIZE);
+
+ SetMainCallback2(gMain.savedCallback);
+}
+
+void debug_sub_8058A50(void)
+{
+ ProcessSpriteCopyRequests();
+ LoadOam();
+ TransferPlttBuffer();
+}
+
+#endif
+
void ResetSafariZoneFlag_(void)
{
ResetSafariZoneFlag();
@@ -1210,6 +1272,33 @@ void CB2_NewGame(void)
SetMainCallback2(c2_overworld);
}
+#if DEBUG
+
+extern void (*gFieldCallback)(void);
+
+void debug_sub_8058C00(void)
+{
+ FieldClearVBlankHBlankCallbacks();
+ StopMapMusic();
+ ResetSafariZoneFlag_();
+ player_avatar_init_params_reset();
+ PlayTimeCounter_Start();
+ ScriptContext1_Init();
+ ScriptContext2_Disable();
+
+ if (gMain.heldKeys & R_BUTTON)
+ gFieldCallback = ExecuteTruckSequence;
+ else
+ gFieldCallback = sub_8080B60;
+
+ do_load_map_stuff_loop(&gMain.state);
+ SetFieldVBlankCallback();
+ set_callback1(c1_overworld);
+ SetMainCallback2(c2_overworld);
+}
+
+#endif
+
void CB2_WhiteOut(void)
{
u8 val;
@@ -1365,6 +1454,10 @@ void CB2_ContinueSavedGame(void)
{
FieldClearVBlankHBlankCallbacks();
StopMapMusic();
+#if DEBUG
+ if (gMain.heldKeys & R_BUTTON)
+ gUnknown_020297ED = TRUE;
+#endif
ResetSafariZoneFlag_();
LoadSaveblockMapHeader();
LoadSaveblockMapObjScripts();
@@ -2140,7 +2233,7 @@ u16 sub_80554E4(u32 a1)
return 23;
}
-u32 sub_80554F8(void)
+s32 sub_80554F8(void)
{
if (sub_8054FC0(0x83) == TRUE)
return 2;
diff --git a/src/engine/palette.c b/src/palette.c
index 2a6602503..2a6602503 100644
--- a/src/engine/palette.c
+++ b/src/palette.c
diff --git a/src/field/party_menu.c b/src/party_menu.c
index f55ed669d..9caaa05b9 100644
--- a/src/field/party_menu.c
+++ b/src/party_menu.c
@@ -1,4 +1,8 @@
#include "global.h"
+#include "constants/items.h"
+#include "constants/moves.h"
+#include "constants/songs.h"
+#include "constants/species.h"
#include "party_menu.h"
#include "battle.h"
#include "battle_interface.h"
@@ -11,12 +15,11 @@
#include "item.h"
#include "item_use.h"
#include "item_menu.h"
-#include "constants/items.h"
+#include "link.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"
@@ -25,9 +28,7 @@
#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"
@@ -94,9 +95,9 @@ 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_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);
@@ -397,7 +398,8 @@ static const u16 PartyMonOAMSettings_RightColumn[] = {
};
// Controls where and how the mons' text appears in the party menu screen (nickname, HP, and level).
-static struct PartyMonTextSettingsStruct const PartyMonTextSettings[4][6] = {
+static struct PartyMonTextSettingsStruct const PartyMonTextSettings[4][6] =
+{
{ // PARTY_MENU_LAYOUT_STANDARD
{ 1, 4, PartyMonOAMSettings_LeftColumn},
{12, 1, PartyMonOAMSettings_RightColumn},
@@ -432,7 +434,8 @@ static struct PartyMonTextSettingsStruct const PartyMonTextSettings[4][6] = {
},
};
-static const struct PartyMenuHandlersStruct PartyMenuHandlers[] = {
+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
@@ -516,6 +519,11 @@ void CB2_PartyMenuMain(void)
RunTasks();
UpdatePaletteFade();
+
+#if DEBUG
+ if (gLinkOpen == TRUE)
+ debug_sub_8008264(gLink.recvQueue.count, 1, 1, 2, 2);
+#endif
}
void VBlankCB_PartyMenu(void)
@@ -555,14 +563,16 @@ bool8 SetupDefaultPartyMenu(void)
switch (ewram1B000_alt.setupState)
{
case 0:
- if (ewram1B000_alt.monIndex < gPlayerPartyCount) {
+ if (ewram1B000_alt.monIndex < gPlayerPartyCount)
+ {
TryCreatePartyMenuMonIcon(ewram1B000_alt.menuHandlerTaskId, ewram1B000_alt.monIndex, &gPlayerParty[ewram1B000_alt.monIndex]);
ewram1B000_alt.monIndex++;
- } else {
+ }
+ else
+ {
ewram1B000_alt.monIndex = 0;
ewram1B000_alt.setupState++;
}
-
break;
case 1:
LoadHeldItemIconGraphics();
@@ -582,7 +592,6 @@ bool8 SetupDefaultPartyMenu(void)
ewram1B000_alt.monIndex = 0;
ewram1B000_alt.setupState++;
}
-
break;
case 4:
PartyMenuPrintMonsLevelOrStatus();
@@ -630,7 +639,6 @@ bool8 InitPartyMenu(void)
DmaFill16Large(3, 0, (void *)(VRAM + 0x0), VRAM_SIZE, 0x1000);
DmaClear32(3, OAM, OAM_SIZE);
DmaClear16(3, PLTT, PLTT_SIZE);
-
gPaletteFade.bufferTransferDisabled = 1;
gMain.state++;
break;
@@ -651,10 +659,7 @@ bool8 InitPartyMenu(void)
break;
case 4:
if (ewram1B000.menuType != PARTY_MENU_TYPE_BATTLE && ewram1B000.menuType != PARTY_MENU_TYPE_LINK_MULTI_BATTLE)
- {
ResetTasks();
- }
-
gMain.state++;
break;
case 5:
@@ -698,9 +703,7 @@ bool8 InitPartyMenu(void)
break;
case 12:
if (PartyMenuHandlers[ewram1B000.menuType].menuSetup() == TRUE)
- {
gMain.state++;
- }
break;
case 13:
MultistepInitMenuWindowBegin(&gWindowTemplate_81E6CC8);
@@ -708,9 +711,7 @@ bool8 InitPartyMenu(void)
break;
case 14:
if (MultistepInitMenuWindowContinue())
- {
gMain.state++;
- }
break;
case 15:
PrintPartyMenuPromptText(ewram1B000.promptTextId, 0);
@@ -723,6 +724,10 @@ bool8 InitPartyMenu(void)
break;
case 17:
SetVBlankCallback(VBlankCB_PartyMenu);
+#if DEBUG
+ if (gLinkOpen == TRUE)
+ debug_sub_8008218((void *)(VRAM + 0xE5E0), 0x8000, (void *)(VRAM + 0x7800), 2);
+#endif
return TRUE;
}
@@ -734,15 +739,11 @@ 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);
}
@@ -783,9 +784,7 @@ void ReDrawPartyMonBackgrounds(void)
DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(BG_VRAM + 0x3000), 0x800);
if (ewram1B000.unk261 == 2)
- {
ewram1B000.unk261 = 0;
- }
}
}
@@ -812,119 +811,172 @@ bool8 DrawPartyMonBackground(u8 monIndex)
sub_806BF24(&arr[0], 0, 3, 0);
break;
case 2:
- if (!IsDoubleBattle()) {
- if (gPlayerPartyCount > 1) {
+ if (!IsDoubleBattle())
+ {
+ if (gPlayerPartyCount > 1)
+ {
sub_806BA94(arr[2], arr[3], 0, 3);
sub_806BF24(&arr[2], 1, 3, 0);
- } else {
+ }
+ else
+ {
sub_806BA94(arr[2], arr[3], 1, 3);
}
- } else if (IsLinkDoubleBattle() == TRUE) {
+ }
+ else if (IsLinkDoubleBattle() == TRUE)
+ {
sub_806B9A4(arr[2], arr[3], 4);
sub_806BF24(&arr[2], 1, 4, 0);
- } else {
+ }
+ else
+ {
sub_806B9A4(arr[2], arr[3], 3);
sub_806BF24(&arr[2], 1, 3, 0);
}
-
break;
case 3:
- if (!IsDoubleBattle()) {
- if (gPlayerPartyCount > 2) {
+ if (!IsDoubleBattle())
+ {
+ if (gPlayerPartyCount > 2)
+ {
sub_806BA94(arr[4], arr[5], 0, 3);
sub_806BF24(&arr[4], 2, 3, 0);
- } else {
+ }
+ else
+ {
sub_806BA94(arr[4], arr[5], 1, 3);
}
- } else if (IsLinkDoubleBattle() == TRUE) {
- if (GetMonData(&gPlayerParty[2], MON_DATA_SPECIES)) {
+ }
+ 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 {
+ }
+ else
+ {
sub_806BA94(arr[4], arr[5], 1, 3);
}
- } else if (gPlayerPartyCount > 2) {
+ }
+ else if (gPlayerPartyCount > 2)
+ {
sub_806BA94(arr[4], arr[5], 0, 3);
sub_806BF24(&arr[4], 2, 3, 0);
- } else {
+ }
+ else
+ {
sub_806BA94(arr[4], arr[5], 1, 3);
}
-
break;
case 4:
- if (!IsDoubleBattle()) {
- if (gPlayerPartyCount > 3) {
+ if (!IsDoubleBattle())
+ {
+ if (gPlayerPartyCount > 3)
+ {
sub_806BA94(arr[6], arr[7], 0, 3);
sub_806BF24(&arr[6], 3, 3, 0);
- } else {
+ }
+ else
+ {
sub_806BA94(arr[6], arr[7], 1, 3);
}
- } else if (IsLinkDoubleBattle() == TRUE) {
- if (GetMonData(&gPlayerParty[3], MON_DATA_SPECIES)) {
+ }
+ 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 {
+ }
+ else
+ {
sub_806BA94(arr[6], arr[7], 1, 3);
}
- } else if (gPlayerPartyCount > 3) {
+ }
+ else if (gPlayerPartyCount > 3)
+ {
sub_806BA94(arr[6], arr[7], 0, 3);
sub_806BF24(&arr[6], 3, 3, 0);
- } else {
+ }
+ else
+ {
sub_806BA94(arr[6], arr[7], 1, 3);
}
-
break;
case 5:
- if (!IsDoubleBattle()) {
- if (gPlayerPartyCount > 4) {
+ if (!IsDoubleBattle())
+ {
+ if (gPlayerPartyCount > 4)
+ {
sub_806BA94(arr[8], arr[9], 0, 3);
sub_806BF24(&arr[8], 4, 3, 0);
- } else {
+ }
+ else
+ {
sub_806BA94(arr[8], arr[9], 1, 3);
}
- } else if (IsLinkDoubleBattle() == TRUE) {
- if (GetMonData(&gPlayerParty[4], MON_DATA_SPECIES)) {
+ }
+ 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 {
+ }
+ else
+ {
sub_806BA94(arr[8], arr[9], 1, 4);
}
- } else if (gPlayerPartyCount > 4) {
+ }
+ else if (gPlayerPartyCount > 4)
+ {
sub_806BA94(arr[8], arr[9], 0, 3);
sub_806BF24(&arr[8], 4, 3, 0);
- } else {
+ }
+ else
+ {
sub_806BA94(arr[8], arr[9], 1, 3);
}
-
break;
case 6:
- if (!IsDoubleBattle()) {
- if (gPlayerPartyCount > 5) {
+ if (!IsDoubleBattle())
+ {
+ if (gPlayerPartyCount > 5)
+ {
sub_806BA94(arr[10], arr[11], 0, 3);
sub_806BF24(&arr[10], 5, 3, 0);
- } else {
+ }
+ else
+ {
sub_806BA94(arr[10], arr[11], 1, 3);
}
- } else if (IsLinkDoubleBattle() == TRUE) {
- if (GetMonData(&gPlayerParty[5], MON_DATA_SPECIES)) {
+ }
+ 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 {
+ }
+ else
+ {
sub_806BA94(arr[10], arr[11], 1, 4);
}
- } else if (gPlayerPartyCount > 5) {
+ }
+ else if (gPlayerPartyCount > 5)
+ {
sub_806BA94(arr[10], arr[11], 0, 3);
sub_806BF24(&arr[10], 5, 3, 0);
- } else {
+ }
+ else
+ {
sub_806BA94(arr[10], arr[11], 1, 3);
}
-
break;
case 7:
- if (ewram1B000.menuType == PARTY_MENU_TYPE_BATTLE_TOWER) {
+ if (ewram1B000.menuType == PARTY_MENU_TYPE_BATTLE_TOWER)
sub_806BB9C(1);
- }
-
sub_806BBEC(1);
break;
case 8:
@@ -1047,9 +1099,7 @@ void sub_806B9A4(s16 a, u16 b, u8 c)
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];
- }
}
}
}
@@ -1069,9 +1119,7 @@ void sub_806BA34(s16 a, u16 b)
for (; j <= 10 && a + j <= 0x1F; j++)
{
if (a + j >= 0)
- {
gBGTilemapBuffers[2][var1 + (i * 32) + (a + j)] = 0;
- }
}
}
}
@@ -1083,15 +1131,13 @@ void sub_806BA94(s16 a, u16 b, u8 c, u8 d)
const u8 *arr;
u16 var1;
- arr = gUnknown_08376A5E;
if (c == 0)
- {
arr = gUnknown_08376A25;
- }
+ else
+ arr = gUnknown_08376A5E;
var1 = b * 32;
-
for (i = 0; i < 3; i++)
{
u8 j = 0;
@@ -1136,11 +1182,13 @@ void sub_806BB3C(s16 a, u16 b)
void sub_806BB9C(u8 a)
{
u8 i;
- u16 arr[12] = {
+ 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);
@@ -1151,11 +1199,13 @@ void sub_806BB9C(u8 a)
void sub_806BBEC(u8 a)
{
u8 i;
- u16 arr[12] = {
+ 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);
@@ -1185,9 +1235,7 @@ 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.
@@ -1199,8 +1247,7 @@ void sub_806BCE8()
{
if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG))
{
- u8 gender = GetMonGender(&gPlayerParty[i]);
- switch (gender)
+ switch (GetMonGender(&gPlayerParty[i]))
{
case MON_MALE:
sub_806BC3C(i, 0x54);
@@ -1407,8 +1454,7 @@ u16 HandleBattleTowerPartyMenuInput(u8 taskId)
if (menuDirectionPressed == 0)
{
- u8 var1 = sub_80F92BC();
- switch (var1)
+ switch (sub_80F92BC())
{
case 1:
menuDirectionPressed = 0xFF;
@@ -1437,9 +1483,7 @@ u16 HandleBattleTowerPartyMenuInput(u8 taskId)
if (gMain.newKeys & A_BUTTON)
{
if (gSprites[sub_806CA00(taskId)].data[0] == 7)
- {
return B_BUTTON;
- }
}
}
}
@@ -1503,31 +1547,19 @@ void ChangePartyMenuSelection(u8 taskId, s8 directionPressed)
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;
@@ -1538,9 +1570,7 @@ void ChangePartyMenuSelection(u8 taskId, s8 directionPressed)
UpdateMonIconFrame_806DA44(taskId, gSprites[spriteId].data[0], 1);
if (menuIndex != gSprites[spriteId].data[0])
- {
- PlaySE(5);
- }
+ PlaySE(SE_SELECT);
}
void ChangeDefaultPartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPressed)
@@ -1554,27 +1584,35 @@ void ChangeDefaultPartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPres
gSprites[spriteId].data[1] = 0;
break;
case 1: // moving up
- if (menuIndex == 0) {
+ if (menuIndex == 0)
+ {
gSprites[spriteId].data[0] = 7;
- } else if (menuIndex == 7) {
+ }
+ else if (menuIndex == 7)
+ {
gSprites[spriteId].data[0] = gPlayerPartyCount - 1;
- } else {
+ }
+ else
+ {
s8 diff = directionPressed;
gSprites[spriteId].data[0] += diff;
}
-
gSprites[spriteId].data[1] = 0;
break;
case 3: // moving down
- if (menuIndex == gPlayerPartyCount - 1) {
+ if (menuIndex == gPlayerPartyCount - 1)
+ {
gSprites[spriteId].data[0] = 7;
- } else if (menuIndex == 7) {
+ }
+ else if (menuIndex == 7)
+ {
gSprites[spriteId].data[0] = 0;
- } else {
+ }
+ else
+ {
s8 diff = directionPressed;
gSprites[spriteId].data[0] += diff;
}
-
gSprites[spriteId].data[1] = 0;
break;
case 4: // moving right
@@ -1582,14 +1620,14 @@ void ChangeDefaultPartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directionPres
{
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) {
+ if (nextIndex <= 4)
+ {
gSprites[spriteId].data[0] = 0;
gSprites[spriteId].data[1] = menuIndex;
}
@@ -1608,32 +1646,42 @@ void ChangeDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directio
gSprites[spriteId].data[1] = 0;
break;
case 3: // moving down
- if (menuIndex == 7) {
+ if (menuIndex == 7)
+ {
gSprites[spriteId].data[0] = 0;
- } else if (menuIndex == gPlayerPartyCount - 1) {
+ }
+ else if (menuIndex == gPlayerPartyCount - 1)
+ {
gSprites[spriteId].data[0] = 7;
- } else {
+ }
+ else
+ {
s8 diff = directionPressed;
gSprites[spriteId].data[0] += diff;
}
-
gSprites[spriteId].data[1] = 0;
break;
case 1: // moving up
- if (menuIndex == 0) {
+ if (menuIndex == 0)
+ {
gSprites[spriteId].data[0] = 7;
- } else if (menuIndex == 7) {
+ }
+ else if (menuIndex == 7)
+ {
gSprites[spriteId].data[0] = gPlayerPartyCount - 1;
- } else {
+ }
+ 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) {
+ if (menuIndex == 0)
+ {
+ if (gPlayerPartyCount > 2)
+ {
u16 var1 = gSprites[spriteId].data[1] - 2;
if (var1 > 1)
gSprites[spriteId].data[0] = 2;
@@ -1641,8 +1689,10 @@ void ChangeDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directio
gSprites[spriteId].data[0] = gSprites[spriteId].data[1];
}
}
- else if (menuIndex == 1) {
- if (gPlayerPartyCount > 4) {
+ 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];
@@ -1653,12 +1703,16 @@ void ChangeDoubleBattlePartyMenuSelection(u8 spriteId, u8 menuIndex, s8 directio
break;
case 0: // moving left
var1 = menuIndex - 2;
- if (var1 <= 1) {
+ if (var1 <= 1)
+ {
gSprites[spriteId].data[0] = 0;
gSprites[spriteId].data[1] = menuIndex;
- } else {
+ }
+ else
+ {
u8 var2 = menuIndex - 4;
- if (var2 <= 1) {
+ if (var2 <= 1)
+ {
gSprites[spriteId].data[0] = 1;
gSprites[spriteId].data[1] = menuIndex;
}
@@ -2011,54 +2065,41 @@ void ChangeBattleTowerPartyMenuSelection(u8 taskId, s8 directionPressed)
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) {
+ if (menuIndex == 0)
gSprites[spriteId].data[0] = 7;
- } else if (menuIndex == PARTY_SIZE) {
+ else if (menuIndex == PARTY_SIZE)
gSprites[spriteId].data[0] = gPlayerPartyCount - 1;
- } else {
+ else
gSprites[spriteId].data[0] += directionPressed;
- }
-
gSprites[spriteId].data[1] = 0;
break;
case 3: // moving down
- if (menuIndex == gPlayerPartyCount - 1) {
+ if (menuIndex == gPlayerPartyCount - 1)
gSprites[spriteId].data[0] = 6;
- } else if (menuIndex == 7) {
+ else if (menuIndex == 7)
gSprites[spriteId].data[0] = 0;
- } else {
+ 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) {
+ if (gSprites[spriteId].data[1] == 0)
gSprites[spriteId].data[1] = 1;
- }
-
gSprites[spriteId].data[0] = gSprites[spriteId].data[1];
}
break;
@@ -2078,17 +2119,11 @@ void ChangeBattleTowerPartyMenuSelection(u8 taskId, s8 directionPressed)
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;
@@ -2096,9 +2131,7 @@ void ChangeBattleTowerPartyMenuSelection(u8 taskId, s8 directionPressed)
UpdateMonIconFrame_806DA44(taskId, newMenuIndex2, 1);
if (menuIndex != gSprites[spriteId].data[0])
- {
- PlaySE(5);
- }
+ PlaySE(SE_SELECT);
}
// Selects the "OK" button in the Battle Tower party menu.
@@ -2112,13 +2145,9 @@ void SelectBattleTowerOKButton(u8 taskId)
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;
@@ -2128,7 +2157,7 @@ void SelectBattleTowerOKButton(u8 taskId)
sub_806BB9C(2);
ewram1B000.unk261 = 2;
- PlaySE(5);
+ PlaySE(SE_SELECT);
}
}
@@ -2139,24 +2168,28 @@ void sub_806C92C(u8 spriteId)
if (!IsDoubleBattle())
{
- if (menuIndex1 < 1) {
- if (menuIndex2 < 1) {
+ if (menuIndex1 < 1)
+ {
+ if (menuIndex2 < 1)
menuIndex2 = 1;
- }
- } else {
- if (menuIndex2 >= 1) {
+ }
+ else
+ {
+ if (menuIndex2 >= 1)
menuIndex2 = 0;
- }
}
- } else {
- if (menuIndex1 < 2) {
- if (menuIndex2 < 2) {
+ }
+ else
+ {
+ if (menuIndex1 < 2)
+ {
+ if (menuIndex2 < 2)
menuIndex2 = 2;
- }
- } else {
- if (menuIndex2 >= 2) {
+ }
+ else
+ {
+ if (menuIndex2 >= 2)
menuIndex2 = 0;
- }
}
}
@@ -2223,13 +2256,9 @@ void ChangePartyMenuSwitchPokemonSelection(u8 taskId, s16 menuDirectionPressed)
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)
@@ -2286,14 +2315,9 @@ void sub_806CCE4()
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)
@@ -2502,9 +2526,7 @@ 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)
@@ -2546,9 +2568,7 @@ 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)
@@ -2618,22 +2638,14 @@ void sub_806D3B4(u8 taskId, u16 species1, u16 species2)
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)
@@ -2717,19 +2729,13 @@ bool8 LoadPartyMenuGraphics(u8 a)
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)
{
@@ -2738,19 +2744,13 @@ bool8 LoadPartyMenuGraphics(u8 a)
}
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)
{
@@ -2769,21 +2769,13 @@ void SetMonIconAnimByHP(u8 spriteId, u16 currentHP, u16 maxHP)
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);
@@ -2814,25 +2806,19 @@ void TryCreatePartyMenuMonIcon(u8 taskId, u8 monIndex, struct Pokemon *pokemon)
{
if (GetMonData(pokemon, MON_DATA_SPECIES))
{
- bool8 isLinkDoubleBattle = IsLinkDoubleBattle();
- if (isLinkDoubleBattle == TRUE)
- {
+ 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)
@@ -2847,19 +2833,14 @@ void CreateMonIcon_LinkMultiBattle(u8 taskId, u8 monIndex, u8 menuType, struct U
void UpdateMonIconFrame_806DA0C(struct Sprite *sprite)
{
- u8 var1;
+ u8 var1 = UpdateMonIconFrame(sprite);
- var1 = UpdateMonIconFrame(sprite);
if (var1)
{
if (var1 & 1)
- {
sprite->pos2.y = -3;
- }
else
- {
sprite->pos2.y = 1;
- }
}
}
@@ -2879,13 +2860,9 @@ void UpdateMonIconFrame_806DA44(u8 taskId, u8 monIndex, u8 c)
gSprites[spriteId].data[0] = 0;
if (!c)
- {
gSprites[spriteId].callback = UpdateMonIconFrame_806DA38;
- }
else
- {
gSprites[spriteId].callback = UpdateMonIconFrame_806DA0C;
- }
}
}
@@ -2897,8 +2874,8 @@ void LoadHeldItemIconGraphics(void)
void SpriteCB_HeldItemIcon(struct Sprite *sprite)
{
-
u8 data7 = sprite->data[7];
+
if (gSprites[data7].invisible)
{
sprite->invisible = 1;
@@ -2936,29 +2913,19 @@ void CreateHeldItemIcons(u8 *a, u8 *b, u8 c)
switch (c)
{
case 0:
- i = 0;
- while (i < a[0])
+ for (i = 0; i < a[0]; i++)
{
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])
+ for (i = 0; i < a[1]; i++)
{
heldItem = GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM);
if (heldItem)
- {
CreateHeldItemIcon(b[i + 6], ItemIsMail(heldItem));
- }
-
- i++;
}
break;
}
@@ -3009,13 +2976,9 @@ void CreateHeldItemIcon_806DCD4(u8 taskId, u8 monIndex, u16 item)
else
{
if (ItemIsMail(item))
- {
StartSpriteAnim(&gSprites[heldItemSpriteId], 1);
- }
else
- {
StartSpriteAnim(&gSprites[heldItemSpriteId], 0);
- }
gSprites[heldItemSpriteId].invisible = 0;
}
@@ -3125,25 +3088,25 @@ 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;
+ 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;
}
}
@@ -3151,24 +3114,24 @@ 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;
+ 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;
}
}
@@ -3313,15 +3276,10 @@ void TryPrintPartyMenuMonNickname(u8 monIndex, struct Pokemon *pokemon)
{
if (GetMonData(pokemon, MON_DATA_SPECIES))
{
- bool8 isLinkDoubleBattle = IsLinkDoubleBattle();
- if (isLinkDoubleBattle == TRUE)
- {
+ if (IsLinkDoubleBattle() == TRUE)
PrintPartyMenuMonNickname(monIndex, PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE, pokemon);
- }
else
- {
PrintPartyMenuMonNickname(monIndex, IsDoubleBattle(), pokemon);
- }
}
}
@@ -3330,9 +3288,7 @@ void PrintPartyMenuMonNicknames(void)
u8 i;
for (i = 0; i < PARTY_SIZE; i++)
- {
TryPrintPartyMenuMonNickname(i, &gPlayerParty[i]);
- }
}
u8 *GetMonNickname(struct Pokemon *pokemon, u8 *stringBuffer)
@@ -3350,38 +3306,28 @@ void PartyMenuPutStatusTilemap(u8 monIndex, u8 menuLayout, u8 status)
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)
- {
+ 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)
@@ -3422,30 +3368,18 @@ void PartyMenuPrintMonLevelOrStatus(u8 monIndex, struct Pokemon *pokemon)
{
if (GetMonData(pokemon, MON_DATA_SPECIES) && !GetMonData(pokemon, MON_DATA_IS_EGG))
{
- u8 statusAndPkrs;
- bool8 isLinkDoubleBattle;
+ u8 statusAndPkrs = GetMonStatusAndPokerus(pokemon);
u8 menuLayout;
- statusAndPkrs = GetMonStatusAndPokerus(pokemon);
-
- isLinkDoubleBattle = IsLinkDoubleBattle();
- if (isLinkDoubleBattle == TRUE)
- {
+ 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);
}
@@ -3456,9 +3390,7 @@ 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)
@@ -3470,12 +3402,12 @@ void PartyMenuDoPrintGenderIcon(u16 species, u8 gender, u8 menuLayout, u8 monInd
switch (gender)
{
- case MON_MALE:
- PartyMenuWriteTilemap(0x42, x, y);
- break;
- case MON_FEMALE:
- PartyMenuWriteTilemap(0x44, x, y);
- break;
+ case MON_MALE:
+ PartyMenuWriteTilemap(0x42, x, y);
+ break;
+ case MON_FEMALE:
+ PartyMenuWriteTilemap(0x44, x, y);
+ break;
}
}
}
@@ -3508,11 +3440,8 @@ void PartyMenuDoPrintHP(u8 monIndex, u8 b, u16 currentHP, u16 maxHP)
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);
+ u16 currentHP = GetMonData(pokemon, MON_DATA_HP);
+ u16 maxHP = GetMonData(pokemon, MON_DATA_MAX_HP);
PartyMenuDoPrintHP(monIndex, b, currentHP, maxHP);
}
@@ -3521,15 +3450,10 @@ 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)
- {
+ if (IsLinkDoubleBattle() == TRUE)
PartyMenuPrintHP(monIndex, PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE, pokemon);
- }
else
- {
PartyMenuPrintHP(monIndex, IsDoubleBattle(), pokemon);
- }
}
}
@@ -3538,9 +3462,7 @@ void PartyMenuTryPrintMonsHP(void)
u8 i;
for (i = 0; i < PARTY_SIZE; i++)
- {
PartyMenuTryPrintHP(i, &gPlayerParty[i]);
- }
}
void unref_sub_806E564(void) { }
@@ -3560,17 +3482,11 @@ void PartyMenuDoDrawHPBar(u8 monIndex, u8 menuLayout, u16 currentHP, u16 maxHP)
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;
@@ -3596,15 +3512,10 @@ 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)
- {
+ if (IsLinkDoubleBattle() == TRUE)
PartyMenuDrawHPBar(monIndex, PARTY_MENU_LAYOUT_LINK_DOUBLE_BATTLE, pokemon);
- }
else
- {
PartyMenuDrawHPBar(monIndex, IsDoubleBattle(), pokemon);
- }
}
}
@@ -3613,9 +3524,7 @@ void PartyMenuDrawHPBars(void)
u8 i;
for (i = 0; i < PARTY_SIZE; i++)
- {
PartyMenuTryDrawHPBar(i, &gPlayerParty[i]);
- }
}
void SwapPokemon(struct Pokemon *a, struct Pokemon *b)
@@ -4007,6 +3916,10 @@ void TeachMonTMMove(u8 taskId, u16 move, TaskFunc func)
CreateTask(Task_TeamMonTMMove, 5);
}
+#if DEBUG
+extern u8 gUnknown_020297ED;
+#endif
+
void Task_TeamMonTMMove(u8 taskId)
{
GetMonNickname(ewram1C000.pokemon, gStringVar1);
@@ -4021,7 +3934,11 @@ void Task_TeamMonTMMove(u8 taskId)
}
else
{
- if (!CanMonLearnTMHM(ewram1C000.pokemon, ewram1C000.unk6 - 33))
+ if (
+#if DEBUG
+ !gUnknown_020297ED &&
+#endif
+ !CanMonLearnTMHM(ewram1C000.pokemon, ewram1C000.unk6 - 33))
{
StringExpandPlaceholders(gStringVar4, gOtherText_NotCompatible);
sub_806E834(gStringVar4, 1);
@@ -4377,64 +4294,64 @@ 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;
+ 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;
}
}
@@ -4531,9 +4448,9 @@ void UseMedicine(u8 taskId, u16 item, TaskFunc func)
bool8 IsBlueYellowRedFlute(u16 item)
{
- if (item == 0x27
- || item == 0x29
- || item == 0x28)
+ if (item == ITEM_BLUE_FLUTE
+ || item == ITEM_RED_FLUTE
+ || item == ITEM_YELLOW_FLUTE)
return TRUE;
else
return FALSE;
@@ -4751,7 +4668,8 @@ void DoPPUpItemEffect(u8 taskId, u16 b, TaskFunc c)
gMain.newKeys = 0;
}
-static const u8 *const StatNames[] = {
+static const u8 *const StatNames[] =
+{
gOtherText_HP,
gOtherText_Attack,
gOtherText_Defense,
@@ -4760,7 +4678,8 @@ static const u8 *const StatNames[] = {
gOtherText_Speed,
};
-static const u8 StatDataTypes[] = {
+static const u8 StatDataTypes[] =
+{
MON_DATA_MAX_HP,
MON_DATA_ATK,
MON_DATA_DEF,
@@ -4768,6 +4687,17 @@ static const u8 StatDataTypes[] = {
MON_DATA_SPDEF,
MON_DATA_SPEED,
};
+
+#if DEBUG
+
+const u8 gUnknown_Debug_839B6CE[] = {0x40, 0, 0, 0, 0x44, 0, 0xFF, 0, 0, 0};
+
+const u8 gUnknown_Debug_839B6D8[] = _(
+ "{STR_VAR_1}かい じっこう\n"
+ "{STR_VAR_2}たんいじかん しょうひ");
+
+#endif
+
void DoRareCandyItemEffect(u8 taskId, u16 b, TaskFunc c)
{
u8 i;
@@ -4832,7 +4762,6 @@ void Task_RareCandy2(u8 taskId)
}
}
-#if ENGLISH
void PrintStatGrowthsInLevelUpWindow(u8 taskId)
{
u8 i;
@@ -4844,6 +4773,9 @@ void PrintStatGrowthsInLevelUpWindow(u8 taskId)
u8 x;
u8 y;
u32 stat;
+#if GERMAN
+ u8 *ptr;
+#endif
stat = GetMonData(ewram1C000.pokemon, StatDataTypes[i]);
@@ -4853,142 +4785,31 @@ void PrintStatGrowthsInLevelUpWindow(u8 taskId)
x = (i / 3) * 9 + 11;
y = ((i % 3) << 1) + 1;
+#if GERMAN
+ ptr = StringCopy(gStringVar1, StatNames[i]);
+ *ptr++ = EXT_CTRL_CODE_BEGIN;
+ *ptr++ = 0x13;
+ *ptr++ = 0x2E;
+ ptr = StringCopy(ptr, gOtherText_TallPlusAndRightArrow);
+ *ptr++ = EXT_CTRL_CODE_BEGIN;
+ *ptr++ = 0x13;
+ *ptr++ = 0x34;
+ ConvertIntToDecimalStringN(ptr, ewram1B000.statGrowths[i], 1, 2);
+ Menu_PrintText(gStringVar1, x + 1, y);
+#else
Menu_PrintTextPixelCoords(StatNames[i], (x + 1) * 8, y * 8, 1);
-
if (i == 2)
Menu_PrintTextPixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 0);
else
Menu_PrintTextPixelCoords(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);
-
Menu_PrintTextPixelCoords(gStringVar1, (x + 6) * 8 + 12, y * 8, 0);
+#endif
}
}
-#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 Menu_DrawStdWindowFrame\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 Menu_PrintText\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)
{
@@ -5019,24 +4840,13 @@ void PrintNewStatsInLevelUpWindow(u8 taskId)
void RedrawPokemonInfoInMenu(u8 monIndex, struct Pokemon *pokemon)
{
- u8 statusAndPkrs;
- bool8 isDoubleBattle;
- u16 currentHP;
- u16 maxHP;
+ u8 statusAndPkrs = GetMonStatusAndPokerus(pokemon);
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);
+ PartyMenuDoPrintHP(monIndex, IsDoubleBattle(), GetMonData(pokemon, MON_DATA_HP), GetMonData(pokemon, MON_DATA_MAX_HP));
PartyMenuTryDrawHPBar(monIndex, pokemon);
icon = GetMonIconSpriteId(ewram1C000.unk4, monIndex);
@@ -5062,45 +4872,45 @@ void Task_RareCandy3(u8 taskId)
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;
+ 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;
}
}
}
@@ -5114,45 +4924,45 @@ void TeachMonMoveInPartyMenu(u8 taskId)
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]);
+ 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);
+ 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]);
+ 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);
+ StringExpandPlaceholders(gStringVar4, gOtherText_LearnedMove);
+ sub_806E834(gStringVar4, 1);
- gTasks[taskId].func = Task_TeamMonTMMove3;
- break;
+ gTasks[taskId].func = Task_TeamMonTMMove3;
+ break;
}
}
@@ -5499,9 +5309,13 @@ _08070F8A:\n\
}
#endif // NONMATCHING
+
+// Maybe this goes in start_menu.c
+#if !DEBUG
void unref_sub_8070F90(void)
{
FlagSet(FLAG_SYS_POKEDEX_GET);
FlagSet(FLAG_SYS_POKEMON_GET);
FlagSet(FLAG_SYS_POKENAV_GET);
}
+#endif
diff --git a/src/field/pc_screen_effect.c b/src/pc_screen_effect.c
index e0853e01d..dcc3bc9c9 100644
--- a/src/field/pc_screen_effect.c
+++ b/src/pc_screen_effect.c
@@ -2,18 +2,7 @@
#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;
-};
+#include "pc_screen_effect.h"
void sub_80C603C(void);
void sub_80C6078(void);
@@ -30,7 +19,7 @@ extern const u16 gUnknownPal_083D18EC[16];
extern const u8 gUnknownGfx_083D190C[128];
-EWRAM_DATA struct UnkStruct *gUnknown_020387EC = NULL;
+EWRAM_DATA struct PCScreenEffectStruct *gUnknown_020387EC = NULL;
const struct SpriteSheet gUnknown_083D1898 = { gUnknownGfx_083D190C, sizeof(gUnknownGfx_083D190C), 0 };
@@ -58,7 +47,7 @@ const struct SpriteTemplate gSpriteTemplate_83D18C0 =
sub_80C6130,
};
-void sub_80C5CD4(struct UnkStruct *unkStruct)
+void sub_80C5CD4(struct PCScreenEffectStruct *unkStruct)
{
u16 i;
diff --git a/src/engine/play_time.c b/src/play_time.c
index 9882c9c4b..9882c9c4b 100644
--- a/src/engine/play_time.c
+++ b/src/play_time.c
diff --git a/src/field/player_pc.c b/src/player_pc.c
index 3719b7c7a..27427ecaa 100644
--- a/src/field/player_pc.c
+++ b/src/player_pc.c
@@ -29,7 +29,7 @@ extern void DestroyVerticalScrollIndicator(u8);
extern void PauseVerticalScrollIndicator(u8);
extern void LoadScrollIndicatorPalette(void);
extern void ClearMailStruct(struct MailStruct *);
-extern u8 sub_807D770(void);
+extern u8 IsWeatherNotFadingIn(void);
extern void sub_808B020(void);
extern void ClearVerticalScrollIndicatorPalettes(void);
@@ -357,12 +357,12 @@ static void Task_ItemStorage_Deposit(u8 taskId)
static void ItemStorage_Deposit(u8 taskId)
{
TASK.FUNC = Task_ItemStorage_Deposit;
- fade_screen(1, 0);
+ FadeScreen(1, 0);
}
static void ItemStorage_HandleReturnToProcessInput(u8 taskId)
{
- if (sub_807D770() == TRUE)
+ if (IsWeatherNotFadingIn() == TRUE)
TASK.FUNC = ItemStorageMenuProcessInput;
}
@@ -1196,7 +1196,7 @@ static void Mailbox_MailOptionsProcessInput(u8 taskId)
static void Mailbox_DoMailRead(u8 taskId)
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
TASK.FUNC = Mailbox_FadeAndReadMail;
}
@@ -1211,7 +1211,7 @@ static void Mailbox_FadeAndReadMail(u8 taskId)
static void Mailbox_HandleReturnToProcessInput(u8 taskId) // Mailbox_HandleReturnToProcessInput
{
- if(sub_807D770() == TRUE) // is black fade finished? why not gPaletteFade.active?
+ if (IsWeatherNotFadingIn() == TRUE) // is black fade finished? why not gPaletteFade.active?
TASK.FUNC = Mailbox_ProcessInput;
}
@@ -1280,7 +1280,7 @@ static void Mailbox_Give(u8 taskId)
Mailbox_NoPokemonForMail(taskId); // cannot be reached normally
else
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
TASK.FUNC = Mailbox_DoGiveMailPokeMenu;
}
}
diff --git a/src/field/pokeblock.c b/src/pokeblock.c
index e08a65f49..6804f55d6 100644
--- a/src/field/pokeblock.c
+++ b/src/pokeblock.c
@@ -91,7 +91,8 @@ static const u8 *gUnknown_03000758;
#define GFX_TAG_POKEBLOCK_CASE 14800
-const s8 gPokeblockFlavorCompatibilityTable[] = {
+const s8 gPokeblockFlavorCompatibilityTable[] =
+{
// Cool, Beauty, Cute, Smart, Tough
0, 0, 0, 0, 0, // Hardy
1, 0, 0, 0, -1, // Lonely
@@ -120,14 +121,16 @@ const s8 gPokeblockFlavorCompatibilityTable[] = {
0, 0, 0, 0, 0 // Quirky
};
-void (*const gUnknown_083F7EA8[])(void) = {
+void (*const gUnknown_083F7EA8[])(void) =
+{
sub_80A5B40,
c2_exit_to_overworld_2_switch,
sub_802E424,
c2_exit_to_overworld_2_switch
};
-const u8 *const gPokeblockNames[] = {
+const u8 *const gPokeblockNames[] =
+{
NULL,
ContestStatsText_RedPokeBlock,
ContestStatsText_BluePokeBlock,
@@ -145,7 +148,8 @@ const u8 *const gPokeblockNames[] = {
ContestStatsText_GoldPokeBlock
};
-const struct MenuAction2 gUnknown_083F7EF4[] = {
+const struct MenuAction2 gUnknown_083F7EF4[] =
+{
{OtherText_Use, sub_810C508},
{OtherText_Toss, sub_810C5C0},
{gOtherText_CancelNoTerminator, sub_810C748},
@@ -161,21 +165,25 @@ const struct YesNoFuncTable gUnknown_083F7F24 = {sub_810C610, sub_810C668};
const u8 UnreferencedData_083F7F2C[] = {0x16, 0x17, 0x18, 0x21, 0x2f};
-const struct OamData gOamData_83F7F34 = {
+const struct OamData gOamData_83F7F34 =
+{
.size = 3,
.priority = 2
};
-const union AnimCmd gSpriteAnim_83F7F3C[] = {
+const union AnimCmd gSpriteAnim_83F7F3C[] =
+{
ANIMCMD_FRAME(.imageValue = 0, .duration = 0),
ANIMCMD_END
};
-const union AnimCmd *const gSpriteAnimTable_83F7F44[] = {
+const union AnimCmd *const gSpriteAnimTable_83F7F44[] =
+{
gSpriteAnim_83F7F3C
};
-const union AffineAnimCmd gSpriteAffineAnim_83F7F48[] = {
+const union AffineAnimCmd gSpriteAffineAnim_83F7F48[] =
+{
AFFINEANIMCMD_FRAME(0, 0, -2, 2),
AFFINEANIMCMD_FRAME(0, 0, 2, 4),
AFFINEANIMCMD_FRAME(0, 0, -2, 4),
@@ -183,22 +191,26 @@ const union AffineAnimCmd gSpriteAffineAnim_83F7F48[] = {
AFFINEANIMCMD_END
};
-const union AffineAnimCmd *const gSpriteAffineAnimTable_83F7F70[] = {
+const union AffineAnimCmd *const gSpriteAffineAnimTable_83F7F70[] =
+{
gSpriteAffineAnim_83F7F48
};
-const struct CompressedSpriteSheet gUnknown_083F7F74 = {
+const struct CompressedSpriteSheet gUnknown_083F7F74 =
+{
gMenuPokeblockDevice_Gfx,
0x800,
GFX_TAG_POKEBLOCK_CASE
};
-const struct CompressedSpritePalette gUnknown_083F7F7C = {
+const struct CompressedSpritePalette gUnknown_083F7F7C =
+{
gMenuPokeblockDevice_Pal,
GFX_TAG_POKEBLOCK_CASE
};
-const struct SpriteTemplate gSpriteTemplate_83F7F84 = {
+const struct SpriteTemplate gSpriteTemplate_83F7F84 =
+{
GFX_TAG_POKEBLOCK_CASE,
GFX_TAG_POKEBLOCK_CASE,
&gOamData_83F7F34,
@@ -208,12 +220,25 @@ const struct SpriteTemplate gSpriteTemplate_83F7F84 = {
SpriteCallbackDummy
};
-const struct Pokeblock gUnknown_083F7F9C[] = {
- { PBLOCK_CLR_RED, 20, 0, 0, 0, 0, 20},
- { PBLOCK_CLR_BLUE, 0, 20, 0, 0, 0, 20},
- { PBLOCK_CLR_PINK, 0, 0, 20, 0, 0, 20},
- { PBLOCK_CLR_GREEN, 0, 0, 0, 20, 0, 20},
- { PBLOCK_CLR_YELLOW, 0, 0, 0, 0, 20, 20}
+const struct Pokeblock gUnknown_083F7F9C[] =
+{
+ { PBLOCK_CLR_RED, 20, 0, 0, 0, 0, 20 },
+ { PBLOCK_CLR_BLUE, 0, 20, 0, 0, 0, 20 },
+ { PBLOCK_CLR_PINK, 0, 0, 20, 0, 0, 20 },
+ { PBLOCK_CLR_GREEN, 0, 0, 0, 20, 0, 20 },
+ { PBLOCK_CLR_YELLOW, 0, 0, 0, 0, 20, 20 },
+#if DEBUG
+ { PBLOCK_CLR_PURPLE, 20, 0, 20, 0, 0, 20 },
+ { PBLOCK_CLR_INDIGO, 0, 20, 0, 20, 0, 20 },
+ { PBLOCK_CLR_BROWN, 0, 0, 20, 0, 20, 20 },
+ { PBLOCK_CLR_LITEBLUE, 20, 0, 0, 20, 0, 20 },
+ { PBLOCK_CLR_OLIVE, 0, 20, 0, 0, 20, 20 },
+ { PBLOCK_CLR_GRAY, 0, 2, 0, 2, 2, 0 },
+ { PBLOCK_CLR_BLACK, 3, 3, 3, 4, 3, 0 },
+ { PBLOCK_CLR_WHITE, 1, 1, 1, 1, 1, 1 },
+ { PBLOCK_CLR_GOLD, 20, 0, 0, 0, 0, 20 },
+ { 0 },
+#endif
};
// text
@@ -424,21 +449,20 @@ void OpenPokeblockCaseOnFeeder(void)
SetMainCallback2(sub_810B96C);
}
-#ifdef DEBUG
+#if DEBUG
void debug_sub_8120F98(void)
{
u8 i;
- for (i=0; i<40 && gUnknown_083F7F9C[i].color != 0; i++)
- {
+
+ for (i = 0; i < 40 && gUnknown_083F7F9C[i].color != 0; i++)
gSaveBlock1.pokeblocks[i] = gUnknown_083F7F9C[i];
- }
}
#endif
static void sub_810BB0C(void)
{
BasicInitMenuWindow(&gWindowTemplate_81E6E34);
- sub_8072BD8(ItemId_GetItem(ITEM_POKEBLOCK_CASE)->name, 2, 1, 0x48);
+ sub_8072BD8(ItemId_GetName(ITEM_POKEBLOCK_CASE), 2, 1, 0x48);
}
static void sub_810BB30(void)
@@ -457,7 +481,7 @@ static void sub_810BB88(u8 a0)
u8 y;
u8 *buf;
BasicInitMenuWindow(&gWindowTemplate_81E6E34);
- for (i=a0; i<=a0+8; i++)
+ for (i = a0; i <= a0 + 8; i++)
{
y = (i - a0) << 1;
if (i == gUnknown_02039248.unk2)
@@ -1046,7 +1070,7 @@ s8 GetFirstFreePokeblockSlot(void)
return -1;
}
-bool8 sub_810CA34(struct Pokeblock *pokeblock)
+bool8 sub_810CA34(const struct Pokeblock *pokeblock)
{
s8 idx = GetFirstFreePokeblockSlot();
if (idx == -1)
diff --git a/src/pokemon/pokeblock_feed.c b/src/pokeblock_feed.c
index 2f2ce2f8f..2f2ce2f8f 100644
--- a/src/pokemon/pokeblock_feed.c
+++ b/src/pokeblock_feed.c
diff --git a/src/pokemon/pokedex.c b/src/pokedex.c
index cbd816206..f7baced63 100644
--- a/src/pokemon/pokedex.c
+++ b/src/pokedex.c
@@ -185,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,
@@ -514,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[] =
@@ -1273,7 +1273,7 @@ static u8 sub_8091260(u16 num, u8, u8, u8);
static void sub_8091304(const u8 *name, u8, u8);
static void sub_8091458(u16 height, u8 i, u8 i1);
static void sub_8091564(u16 weight, u8 i, u8 i1);
-static void sub_8091738(u16, u16, u16);
+void sub_8091738(u16, u16, u16);
static void sub_80917CC(u16 i, u16 i1);
static u16 sub_8091818(u8, u16, u16, u16);
u16 sub_80918EC(u16 a, s16 b, s16 c, u16 d);
@@ -3922,8 +3922,8 @@ static void sub_8090B8C(u8 taskId)
const u8 *lzPaletteData;
REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON;
- CpuCopy16(gUnknown_08D00524, (void *)(VRAM + 0xC000), 0x1000);
- sub_800D74C();
+ CpuCopy16(gBattleTextboxTilemap, (void *)(VRAM + 0xC000), 0x1000);
+ ApplyPlayerChosenFrameToBattleMenu();
species = NationalPokedexNumToSpecies(gTasks[taskId].data[1]);
otId = ((u16)gTasks[taskId].data[13] << 16) | (u16)gTasks[taskId].data[12];
personality = ((u16)gTasks[taskId].data[15] << 16) | (u16)gTasks[taskId].data[14];
@@ -4449,7 +4449,7 @@ static void sub_8091564(u16 arg0, u8 left, u8 top)
}
#endif
-static void sub_8091738(u16 num, u16 b, u16 c)
+void sub_8091738(u16 num, u16 b, u16 c)
{
u8 arr[0x80];
u16 i;
diff --git a/src/pokedex_area_screen.c b/src/pokedex_area_screen.c
new file mode 100644
index 000000000..67ca276c4
--- /dev/null
+++ b/src/pokedex_area_screen.c
@@ -0,0 +1,20 @@
+
+// Includes
+#include "global.h"
+
+// Static type declarations
+
+// Static RAM declarations
+
+EWRAM_DATA u16 gUnknown_02039260 = 0;
+EWRAM_DATA u16 gUnknown_02039262 = 0;
+EWRAM_DATA u16 gUnknown_02039264 = 0;
+EWRAM_DATA u16 gUnknown_02039266 = 0;
+EWRAM_DATA u16 gUnknown_02039268 = 0;
+EWRAM_DATA u16 gUnknown_0203926A = 0;
+
+// Static ROM declarations
+
+// .rodata
+
+// .text
diff --git a/src/pokemon/pokedex_cry_screen.c b/src/pokedex_cry_screen.c
index 912b9aabd..912b9aabd 100644
--- a/src/pokemon/pokedex_cry_screen.c
+++ b/src/pokedex_cry_screen.c
diff --git a/src/pokemon/mail.c b/src/pokemon/mail.c
deleted file mode 100644
index 921a3ad93..000000000
--- a/src/pokemon/mail.c
+++ /dev/null
@@ -1,599 +0,0 @@
-#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 "scanline_effect.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);
- ScanlineEffect_Stop();
- 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:
- Text_LoadWindowTemplate(&gWindowTemplate_81E6DFC);
- RETURN_UP_STATE;
-
- case 7:
- MultistepInitMenuWindowBegin(&gWindowTemplate_81E6DFC);
- RETURN_UP_STATE;
-
- case 8:
- if (MultistepInitMenuWindowContinue() == 0)
- {
- return FALSE;
- }
- RETURN_UP_STATE;
-
- case 9:
- Menu_EraseScreen();
- 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;
- Menu_PrintText(ewram0_4.words[pos], ewram0_4.var10C->var3_4 + x, ewram0_4.var10C->var3_0 + y);
- y += 2;
- }
-
- Menu_PrintText(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/pokemon/pokemon_data.c b/src/pokemon/pokemon_data.c
deleted file mode 100644
index 3473b58c8..000000000
--- a/src/pokemon/pokemon_data.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "global.h"
-#include "pokemon.h"
-#include "constants/species.h"
-#include "trainer.h"
-#include "constants/abilities.h"
-#include "constants/moves.h"
-#include "constants/hold_effects.h"
-#include "constants/items.h"
-#include "sprite.h"
-#include "data2.h"
-
-
diff --git a/src/pokemon/pokemon_storage_system.c b/src/pokemon/pokemon_storage_system.c
deleted file mode 100644
index 001cebe45..000000000
--- a/src/pokemon/pokemon_storage_system.c
+++ /dev/null
@@ -1,93 +0,0 @@
-#include "global.h"
-#include "pokemon_storage_system.h"
-#include "menu.h"
-#include "string_util.h"
-#include "ewram.h"
-
-struct StorageAction {
- u8 *text;
- u8 format;
-};
-
-extern const struct StorageAction gUnknown_083B6DF4[];
-
-EWRAM_DATA struct PokemonStorage gPokemonStorage = {0};
-
-void sub_8098898(u8 index) {
- u8 *ptr;
-
- Menu_DrawStdWindowFrame(10, 16, 29, 19);
-
- switch (gUnknown_083B6DF4[index].format)
- {
-
- case 2:
- ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text);
- ptr = StringCopy(ptr, gUnk20011fa);
- break;
-
- case 5:
- ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text);
- ptr = StringCopy(ptr, gUnk20026e4);
- break;
-
- case 1:
- // {var} + " is selected."
- ptr = StringCopy(gUnk2002694, gUnk20011fa);
- ptr = StringCopy(ptr, gUnknown_083B6DF4[index].text);
- break;
-
- case 4:
- // {var} + " was released."
- ptr = StringCopy(gUnk2002694, gUnk20026e4);
-#if ENGLISH
- ptr = StringCopy(ptr, gUnknown_083B6DF4[index].text);
-#elif GERMAN
- ptr = de_sub_8073174(gUnk2002694, gUnknown_083B6DF4[index].text);
-#endif
- break;
-
- case 3:
- {
- u8 *stringLength;
- u8 *text;
-
- text = gUnknown_083B6DF4[index].text;
- stringLength = &text[StringLength(text)] + 1;
-
- ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text);
- ptr = StringCopy(ptr, gUnk20011fa);
- ptr = StringCopy(ptr, stringLength);
- }
- break;
-
- case 6:
- // "Bye-bye, ".substr(0, -1) + {var} + "Bye-bye, !".substr(-1, 1)
- {
- u8 *stringLength;
- u8 *text;
-
- text = gUnknown_083B6DF4[index].text;
- stringLength = &text[StringLength(text)] - 1;
-
- ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text);
- ptr = StringCopy(ptr - 1, gUnk20026e4);
- ptr = StringCopy(ptr, stringLength);
- }
- break;
-
- case 0:
- default:
- ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text);
- break;
- }
-
- while (ptr < gUnk20026A6)
- {
- ptr[0] = CHAR_SPACE;
- ptr++;
- }
-
- ptr[0] = EOS;
- Menu_PrintText(gUnk2002694, 11, 17);
-}
diff --git a/src/pokemon/pokemon_1.c b/src/pokemon_1.c
index 0242e7444..a23bb3324 100644
--- a/src/pokemon/pokemon_1.c
+++ b/src/pokemon_1.c
@@ -41,7 +41,7 @@ const struct SpindaSpot gSpindaSpotGraphics[] =
{34, 33, INCBIN_U16("graphics/spinda_spots/spot_3.bin")}
};
-#include "../data/pokemon/item_effects.h"
+#include "data/pokemon/item_effects.h"
const s8 gNatureStatTable[][5] =
{
@@ -73,14 +73,14 @@ const s8 gNatureStatTable[][5] =
{ 0, 0, 0, 0, 0} // Quirky
};
-#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/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"
void ZeroBoxMonData(struct BoxPokemon *boxMon)
{
@@ -524,7 +524,54 @@ void CalculateMonStats(struct Pokemon *mon)
SetMonData(mon, MON_DATA_HP, &currentHP);
}
-void sub_803B4B4(const struct BoxPokemon *src, struct Pokemon *dest)
+#if DEBUG
+void debug_sub_803F55C(struct Pokemon *mon)
+{
+ s32 currentHP = GetMonData(mon, MON_DATA_HP, NULL);
+ s32 hpIV = GetMonData(mon, MON_DATA_HP_IV, NULL);
+ s32 hpEV = GetMonData(mon, MON_DATA_HP_EV, NULL);
+ s32 attackIV = GetMonData(mon, MON_DATA_ATK_IV, NULL);
+ 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_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);
+ s32 spDefenseEV = GetMonData(mon, MON_DATA_SPDEF_EV, NULL);
+ u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
+ s32 level = GetLevelFromMonExp(mon);
+ s32 newMaxHP;
+
+ SetMonData(mon, MON_DATA_LEVEL, &level);
+
+ if (species == SPECIES_SHEDINJA)
+ {
+ newMaxHP = 1;
+ }
+ else
+ {
+ s32 n = 2 * gBaseStats[species].baseHP + hpIV;
+ newMaxHP = (((n + hpEV / 4) * level) / 100) + level + 10;
+ }
+
+ 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_SPEED)
+ CALC_STAT(baseSpAttack, spAttackIV, spAttackEV, 4, MON_DATA_SPATK)
+ CALC_STAT(baseSpDefense, spDefenseIV, spDefenseEV, 5, MON_DATA_SPDEF)
+
+ if (newMaxHP < currentHP)
+ currentHP = newMaxHP;
+
+ SetMonData(mon, MON_DATA_HP, &currentHP);
+}
+#endif
+
+void ExpandBoxMon(const struct BoxPokemon *src, struct Pokemon *dest)
{
u32 value = 0;
dest->box = *src;
diff --git a/src/pokemon/pokemon_2.c b/src/pokemon_2.c
index b941ed2ab..17f073815 100644
--- a/src/pokemon/pokemon_2.c
+++ b/src/pokemon_2.c
@@ -1,5 +1,6 @@
#include "global.h"
#include "constants/hold_effects.h"
+#include "constants/moves.h"
#include "battle.h"
#include "battle_util.h"
#include "data2.h"
@@ -569,7 +570,7 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data)
u16 *moves = (u16 *)data;
s32 i = 0;
- while (moves[i] != 355)
+ while (moves[i] != NUM_MOVES)
{
u16 move = moves[i];
if (substruct1->moves[0] == move
@@ -1101,8 +1102,8 @@ void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord)
}
}
- gBattleTypeFlags = 8;
- gTrainerBattleOpponent = 1024;
+ gBattleTypeFlags = BATTLE_TYPE_TRAINER;
+ gTrainerBattleOpponent = SECRET_BASE_OPPONENT;
}
const u8 gSecretBaseTrainerClasses[][5] = {
diff --git a/src/pokemon/pokemon_3.c b/src/pokemon_3.c
index 9346031a6..9346031a6 100644
--- a/src/pokemon/pokemon_3.c
+++ b/src/pokemon_3.c
diff --git a/src/pokemon/pokemon_icon.c b/src/pokemon_icon.c
index b1b462761..b1b462761 100644
--- a/src/pokemon/pokemon_icon.c
+++ b/src/pokemon_icon.c
diff --git a/src/pokemon/pokemon_item_effect.c b/src/pokemon_item_effect.c
index 4ebece3b3..4ebece3b3 100644
--- a/src/pokemon/pokemon_item_effect.c
+++ b/src/pokemon_item_effect.c
diff --git a/src/pokemon/pokemon_menu.c b/src/pokemon_menu.c
index a41e197f2..532340ce4 100644
--- a/src/pokemon/pokemon_menu.c
+++ b/src/pokemon_menu.c
@@ -31,6 +31,7 @@
#include "item_menu.h"
#include "player_pc.h"
#include "ewram.h"
+#include "script.h"
/*
Pokemon menu:
@@ -45,6 +46,7 @@ struct PokeMenuFieldMoveFunc
u8 field_1;
};
+extern u8 gUnknown_020297ED;
extern u8 gUnknown_020384F0;
extern u8 gUnknown_0202E8F4;
extern u8 gUnknown_0202E8F5;
@@ -786,7 +788,7 @@ void FieldCallback_Teleport(void)
static void sub_808ABA8(u8 taskID)
{
- if (sub_807D770() == TRUE)
+ if (IsWeatherNotFadingIn() == TRUE)
{
gFieldEffectArguments[0] = GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_SPECIES);
gUnknown_03005CE4();
@@ -900,9 +902,10 @@ static void sub_808AE08(void)
static bool8 SetUpFieldMove_Waterfall(void)
{
s16 x, y;
+
GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
if (MetatileBehavior_IsWaterfall(MapGridGetMetatileBehaviorAt(x, y)) == TRUE
- && IsPlayerSurfingNorth() == TRUE)
+ && IsPlayerSurfingNorth() == TRUE)
{
gFieldCallback = FieldCallback_Teleport;
gUnknown_03005CE4 = sub_808AE08;
@@ -912,6 +915,20 @@ static bool8 SetUpFieldMove_Waterfall(void)
return FALSE;
}
+#if DEBUG
+void debug_sub_80986AC(void)
+{
+ s16 x, y;
+
+ GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
+ if (MetatileBehavior_IsWaterfall(MapGridGetMetatileBehaviorAt(x, y)) == TRUE
+ && IsPlayerSurfingNorth() == TRUE)
+ sub_808AE08();
+ else
+ ScriptContext2_Disable();
+}
+#endif
+
static void sub_808AE8C(void)
{
u8 i;
@@ -921,7 +938,11 @@ static void sub_808AE8C(void)
if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES))
{
sub_806D668(i);
- if (GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) || !CanMonLearnTMHM(&gPlayerParty[i], arg))
+ if (
+#if DEBUG
+ gUnknown_020297ED == 0 &&
+#endif
+ (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);
diff --git a/src/pokemon/pokemon_size_record.c b/src/pokemon_size_record.c
index f92a95bfb..f92a95bfb 100644
--- a/src/pokemon/pokemon_size_record.c
+++ b/src/pokemon_size_record.c
diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c
new file mode 100644
index 000000000..1ea8bc205
--- /dev/null
+++ b/src/pokemon_storage_system.c
@@ -0,0 +1,784 @@
+#include "global.h"
+#include "palette.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "field_weather.h"
+#include "overworld.h"
+#include "field_fadetransition.h"
+#include "menu.h"
+#include "main.h"
+#include "strings.h"
+#include "string_util.h"
+#include "event_data.h"
+#include "script.h"
+#include "pokemon_storage_system.h"
+
+void StorageSystemCreatePrimaryMenu(u8 whichMenu);
+void sub_80963D0(u8 curBox);
+void sub_809658C(void);
+void sub_80965F8(void);
+void sub_809662C(void);
+void sub_809665C(void);
+void sub_80966F4(const u8 *sourceString, u16 x, u16 y);
+void sub_8096784(struct Sprite *sprite);
+
+EWRAM_DATA struct PokemonStorage gPokemonStorage = {0};
+EWRAM_DATA u8 gUnknown_02038470[3] = {};
+EWRAM_DATA u8 gUnknown_02038473 = 0;
+EWRAM_DATA u8 gUnknown_02038474 = 0;
+EWRAM_DATA struct UnkPSSStruct_2002370 *gUnknown_02038478 = NULL;
+
+const struct PSS_MenuStringPtrs gUnknown_083B600C[] = {
+ {PCText_WithdrawPoke, PCText_MovePokeToParty},
+ {PCText_DepositPoke, PCText_StorePokeInBox},
+ {PCText_MovePoke, PCText_OrganizeBoxesParty},
+ {PCText_SeeYa, PCText_ReturnToPrevMenu}
+};
+
+#if DEBUG
+const u16 gUnknown_Debug_083E05F0[2] = {0};
+#endif
+
+const union AnimCmd gSpriteAnim_83B602C[] = {
+ ANIMCMD_FRAME( 0, 5),
+ ANIMCMD_END
+};
+
+const union AnimCmd gSpriteAnim_83B6034[] = {
+ ANIMCMD_FRAME( 4, 5),
+ ANIMCMD_END
+};
+
+const union AnimCmd gSpriteAnim_83B603C[] = {
+ ANIMCMD_FRAME( 6, 5),
+ ANIMCMD_END
+};
+
+const union AnimCmd gSpriteAnim_83B6044[] = {
+ ANIMCMD_FRAME(10, 5),
+ ANIMCMD_END
+};
+
+const union AnimCmd *const gSpriteAnimTable_83B604C[] = {
+ gSpriteAnim_83B602C,
+ gSpriteAnim_83B6034,
+ gSpriteAnim_83B603C,
+ gSpriteAnim_83B6044
+};
+
+const union AffineAnimCmd gSpriteAffineAnim_83B605C[] = {
+ AFFINEANIMCMD_FRAME(0xe0, 0xe0, 0, 0),
+ AFFINEANIMCMD_END
+};
+
+const union AffineAnimCmd *const gSpriteAffineAnimTable_83B606C[] = {
+ gSpriteAffineAnim_83B605C
+};
+
+const u16 gBoxSelectionPopupPalette[] = INCBIN_U16("graphics/pokemon_storage/box_selection_popup.gbapal");
+
+const u8 gBoxSelectionPopupCenterTiles[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_center.4bpp");
+
+const u8 gBoxSelectionPopupSidesTiles[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_sides.4bpp");
+
+u8 CountPokemonInBoxN(u8 boxId)
+{
+ u16 i;
+ u16 count;
+
+ for (i = 0, count = 0; i < 30; i++)
+ {
+ if (GetBoxMonData(gPokemonStorage.boxes[boxId] + i, MON_DATA_SPECIES) != 0)
+ count++;
+ }
+ return count;
+}
+
+s16 GetIndexOfFirstEmptySpaceInBoxN(u8 boxId)
+{
+ u16 i;
+
+ for (i = 0; i < 30; i++)
+ {
+ if (GetBoxMonData(gPokemonStorage.boxes[boxId] + i, MON_DATA_SPECIES) == 0)
+ return i;
+ }
+ return -1;
+}
+
+u8 GetNumValidDaycarePartyMons(void)
+{
+ u16 i;
+ u16 count;
+
+ for (i = 0, count = 0; i < PARTY_SIZE; i++)
+ {
+ struct Pokemon *pokemon = gPlayerParty + i;
+ if (GetMonData(pokemon, MON_DATA_SPECIES) != 0 && !GetMonData(pokemon, MON_DATA_IS_EGG))
+ count++;
+ }
+ return count;
+}
+
+u8 CountAlivePartyMonsExceptOne(u8 toSkip)
+{
+ u16 i;
+ u16 count;
+
+ for (i = 0, count = 0; i < PARTY_SIZE; i++)
+ {
+ if (i != toSkip)
+ {
+ struct Pokemon *pokemon = gPlayerParty + i;
+ if (GetMonData(pokemon, MON_DATA_SPECIES) != 0 && !GetMonData(pokemon, MON_DATA_IS_EGG) && GetMonData(pokemon, MON_DATA_HP) != 0)
+ count++;
+ }
+ }
+ return count;
+}
+
+u8 CountAlivePartyMonsExceptSelectedOne(void)
+{
+ return CountAlivePartyMonsExceptOne(gSpecialVar_0x8004);
+}
+
+u8 StorageSystemGetPartySize(void)
+{
+ u16 i;
+ u16 count;
+
+ for (i = 0, count = 0; i < PARTY_SIZE; i++)
+ {
+ if (GetMonData(gPlayerParty + i, MON_DATA_SPECIES) != 0)
+ count++;
+ }
+ return count;
+}
+
+u8 *unref_sub_8095C60(u8 *dest, const u8 *src, u16 pad)
+{
+ u8 *_dest = StringCopy(dest, src);
+ while (_dest < dest + pad)
+ {
+ *_dest++ = CHAR_SPACE;
+ }
+ *_dest = EOS;
+ return _dest;
+}
+
+void sub_8095C8C(u16 *dest, u16 dest_left, u16 dest_top, const u16 *src, u16 src_left, u16 src_top, u16 dest_width, u16 dest_height, u16 src_width)
+{
+ u16 i;
+
+ dest_width *= 2;
+ dest += dest_top * 0x20 + dest_left;
+ src += src_top * src_width + src_left;
+ for (i = 0; i < dest_height; i++)
+ {
+ CpuCopy16(src, dest, dest_width);
+ dest += 0x20;
+ src += src_width;
+ }
+}
+
+#define MAX_DMA_BLOCK_SIZE 0x1000
+#define Dma3FillLarge_(value, dest, size, bit) \
+{ \
+ void *_dest = dest; \
+ u32 _size = size; \
+ while (1) \
+ { \
+ if (_size <= MAX_DMA_BLOCK_SIZE) \
+ { \
+ DmaFill##bit(3, value, _dest, _size); \
+ break; \
+ } \
+ DmaFill##bit(3, value, _dest, MAX_DMA_BLOCK_SIZE); \
+ _dest += MAX_DMA_BLOCK_SIZE; \
+ _size -= MAX_DMA_BLOCK_SIZE; \
+ } \
+}
+
+#define Dma3FillLarge16_(value, dest, size) Dma3FillLarge_(value, dest, size, 16)
+#define Dma3FillLarge32_(value, dest, size) Dma3FillLarge_(value, dest, size, 32)
+
+void unref_sub_8095D08(u16 *dest, u16 dest_left, u16 dest_top, u16 width, u16 height)
+{
+ u16 i;
+
+ dest += dest_top * 0x20 + dest_left;
+ width *= 2;
+ for (i = 0; i < height; dest += 0x20, i++)
+ Dma3FillLarge16_(0, dest, width);
+}
+
+s16 StorageSystemGetNextMonIndex(struct BoxPokemon *box, s8 startIdx, u8 stopIdx, u8 mode)
+{
+ s16 i;
+ s16 direction;
+ if (mode == 0 || mode == 2)
+ {
+ direction = 1;
+ }
+ else
+ {
+ direction = -1;
+ }
+ if (mode == 2 || mode == 3)
+ {
+ for (i = startIdx + direction; i >= 0 && i <= stopIdx; i += direction)
+ {
+ if (GetBoxMonData(box + i, MON_DATA_SPECIES) != 0)
+ return i;
+ }
+ }
+ else
+ {
+ for (i = startIdx + direction; i >= 0 && i <= stopIdx; i += direction)
+ {
+ if (GetBoxMonData(box + i, MON_DATA_SPECIES) != 0 && !GetBoxMonData(box + i, MON_DATA_IS_EGG))
+ return i;
+ }
+ }
+ return -1;
+}
+
+void StorageSystemClearMessageWindow(void)
+{
+ Menu_BlankWindowRect(2, 15, 27, 18);
+}
+
+void Task_PokemonStorageSystem(u8 taskId)
+{
+ struct Task *task = gTasks + taskId;
+ switch (task->data[0])
+ {
+ case 0:
+ StorageSystemCreatePrimaryMenu(task->data[1]);
+ Menu_DisplayDialogueFrame();
+ Menu_PrintText(gUnknown_083B600C[task->data[1]].desc, 2, 15);
+ task->data[0]++;
+ break;
+ case 1:
+ if (IsWeatherNotFadingIn())
+ {
+ task->data[0]++;
+ }
+ break;
+ case 2:
+ task->data[2] = Menu_ProcessInput();
+ switch(task->data[2])
+ {
+ case -2:
+ task->data[3] = task->data[1];
+ if (gMain.newKeys & DPAD_UP && --task->data[3] < 0)
+ task->data[3] = 3;
+
+ if (gMain.newKeys & DPAD_DOWN && ++task->data[3] > 3)
+ task->data[3] = 0;
+ if (task->data[1] != task->data[3])
+ {
+ task->data[1] = task->data[3];
+ StorageSystemClearMessageWindow();
+ Menu_PrintText(gUnknown_083B600C[task->data[1]].desc, 2, 15);
+ }
+ break;
+ case -1:
+ case 3:
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(0, 0, 13, 9);
+ ScriptContext2_Disable();
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ break;
+ default:
+ if (task->data[2] == 0 && StorageSystemGetPartySize() == PARTY_SIZE)
+ {
+ StorageSystemClearMessageWindow();
+ Menu_PrintText(gPCText_PartyFull2, 2, 15);
+ task->data[0] = 3;
+ }
+ else if (task->data[2] == 1 && StorageSystemGetPartySize() == 1)
+ {
+ StorageSystemClearMessageWindow();
+ Menu_PrintText(gPCText_OnlyOne, 2, 15);
+ task->data[0] = 3;
+ }
+ else
+ {
+ FadeScreen(1, 0);
+ task->data[0] = 4;
+ }
+ break;
+ }
+ break;
+ case 3:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ StorageSystemClearMessageWindow();
+ Menu_PrintText(gUnknown_083B600C[task->data[1]].desc, 2, 15);
+ task->data[0] = 2;
+ }
+ else if (gMain.newKeys & DPAD_UP)
+ {
+ if (--task->data[1] < 0)
+ task->data[1] = 3;
+ Menu_MoveCursor(-1);
+ task->data[1] = Menu_GetCursorPos();
+ StorageSystemClearMessageWindow();
+ Menu_PrintText(gUnknown_083B600C[task->data[1]].desc, 2, 15);
+ task->data[0] = 2;
+ }
+ else if (gMain.newKeys & DPAD_DOWN)
+ {
+ if (++task->data[1] > 3)
+ task->data[1] = 0;
+ Menu_MoveCursor(1);
+ task->data[1] = Menu_GetCursorPos();
+ StorageSystemClearMessageWindow();
+ Menu_PrintText(gUnknown_083B600C[task->data[1]].desc, 2, 15);
+ task->data[0] = 2;
+ }
+ break;
+ case 4:
+ if (!gPaletteFade.active)
+ {
+ task_intro_29(task->data[2]);
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+void ShowPokemonStorageSystem(void)
+{
+ u8 taskId = CreateTask(Task_PokemonStorageSystem, 80);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = 0;
+ ScriptContext2_Enable();
+}
+
+void FieldCB_ReturnToOverworld(void)
+{
+ u8 taskId = CreateTask(Task_PokemonStorageSystem, 80);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = gUnknown_02038474;
+ pal_fill_black();
+}
+
+void StorageSystemCreatePrimaryMenu(u8 whichMenu)
+{
+ Menu_DrawStdWindowFrame(0, 0, 13, 9);
+ Menu_PrintItems(1, 1, 4, (const struct MenuAction *)gUnknown_083B600C);
+ InitMenu(0, 1, 1, 4, whichMenu, 12);
+}
+
+void sub_80961A8(void)
+{
+ gUnknown_02038474 = gPokemonStorageSystemPtr->unk_0005;
+ gFieldCallback = FieldCB_ReturnToOverworld;
+ SetMainCallback2(c2_exit_to_overworld_2_switch);
+}
+
+void ResetPokemonStorageSystem(void)
+{
+ u16 boxId;
+ u16 boxMon;
+
+ gPokemonStorage.currentBox = 0;
+ for (boxId = 0; boxId < 14; boxId++)
+ {
+ for (boxMon = 0; boxMon < 30; boxMon++)
+ {
+ ZeroBoxMonData(gPokemonStorage.boxes[boxId] + boxMon);
+ }
+ }
+ for (boxId = 0; boxId < 14; boxId++)
+ {
+ u8 *dest = StringCopy(gPokemonStorage.boxNames[boxId], gPCText_BOX);
+ ConvertIntToDecimalStringN(dest, boxId + 1, STR_CONV_MODE_LEFT_ALIGN, 2);
+ }
+ for (boxId = 0; boxId < 14; boxId++)
+ {
+ gPokemonStorage.wallpaper[boxId] = boxId & 0x03;
+ }
+}
+
+#if DEBUG
+__attribute__((naked))
+void debug_sub_80A3904(void)
+{
+ asm("\
+ push {r4, r5, r6, r7, lr}\n\
+ mov r7, sl\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5, r6, r7}\n\
+ add sp, sp, #0xffffffe4\n\
+ mov r0, #0x0\n\
+ mov r8, r0\n\
+ mov r7, r8\n\
+ mov r1, #0x14\n\
+ str r1, [sp, #0x18]\n\
+ mov r2, #0xff\n\
+ mov r9, r2\n\
+._162:\n\
+ mov r5, #0x0\n\
+ cmp r7, #0\n\
+ beq ._160 @cond_branch\n\
+ mov r0, #0xe\n\
+ mov r8, r0\n\
+ b ._158\n\
+._160:\n\
+ bl Random\n\
+ lsl r0, r0, #0x10\n\
+ lsr r0, r0, #0x10\n\
+ str r0, [sp, #0x14]\n\
+ mov r2, r8\n\
+ lsl r1, r2, #0x2\n\
+ add r1, r1, r8\n\
+ lsl r3, r1, #0x4\n\
+ sub r3, r3, r1\n\
+ lsl r3, r3, #0x5\n\
+ lsl r1, r5, #0x2\n\
+ add r1, r1, r5\n\
+ lsl r1, r1, #0x4\n\
+ ldr r2, ._163 @ gPokemonStorage\n\
+ add r1, r1, r2\n\
+ add r6, r3, r1\n\
+ ldr r2, ._163 + 4 @ gUnknown_Debug_083E05F0\n\
+ lsl r1, r7, #0x1\n\
+ add r1, r1, r2\n\
+ ldrh r4, [r1]\n\
+ add r5, r5, #0x1\n\
+ lsl r2, r5, #0x18\n\
+ lsr r2, r2, #0x18\n\
+ mov r1, #0x0\n\
+ str r1, [sp]\n\
+ str r1, [sp, #0x4]\n\
+ mov r1, #0x1\n\
+ mov sl, r1\n\
+ str r1, [sp, #0x8]\n\
+ str r0, [sp, #0xc]\n\
+ add r0, r6, #0\n\
+ add r1, r4, #0\n\
+ mov r3, #0x20\n\
+ bl CreateBoxMon\n\
+ cmp r4, #0\n\
+ beq ._157 @cond_branch\n\
+ cmp r4, #0xac\n\
+ bne ._156 @cond_branch\n\
+ add r0, sp, #0x10\n\
+ mov r2, sl\n\
+ strb r2, [r0]\n\
+ add r0, r6, #0\n\
+ mov r1, #0x2d\n\
+ add r2, sp, #0x10\n\
+ bl SetBoxMonData\n\
+._156:\n\
+ bl Random\n\
+ mov r1, r9\n\
+ and r1, r1, r0\n\
+ str r1, [sp, #0x14]\n\
+ add r4, sp, #0x14\n\
+ add r0, r6, #0\n\
+ mov r1, #0x16\n\
+ add r2, r4, #0\n\
+ bl SetBoxMonData\n\
+ bl Random\n\
+ mov r1, r9\n\
+ and r1, r1, r0\n\
+ str r1, [sp, #0x14]\n\
+ add r0, r6, #0\n\
+ mov r1, #0x17\n\
+ add r2, r4, #0\n\
+ bl SetBoxMonData\n\
+ bl Random\n\
+ mov r1, r9\n\
+ and r1, r1, r0\n\
+ str r1, [sp, #0x14]\n\
+ add r0, r6, #0\n\
+ mov r1, #0x18\n\
+ add r2, r4, #0\n\
+ bl SetBoxMonData\n\
+ bl Random\n\
+ mov r1, r9\n\
+ and r1, r1, r0\n\
+ str r1, [sp, #0x14]\n\
+ add r0, r6, #0\n\
+ mov r1, #0x21\n\
+ add r2, r4, #0\n\
+ bl SetBoxMonData\n\
+ bl Random\n\
+ mov r1, r9\n\
+ and r1, r1, r0\n\
+ str r1, [sp, #0x14]\n\
+ add r0, r6, #0\n\
+ mov r1, #0x2f\n\
+ add r2, r4, #0\n\
+ bl SetBoxMonData\n\
+ bl Random\n\
+ mov r1, r9\n\
+ and r1, r1, r0\n\
+ str r1, [sp, #0x14]\n\
+ add r0, r6, #0\n\
+ mov r1, #0x30\n\
+ add r2, r4, #0\n\
+ bl SetBoxMonData\n\
+ ldr r0, [sp, #0x18]\n\
+ cmp r0, #0\n\
+ beq ._157 @cond_branch\n\
+ sub r0, r0, #0x1\n\
+ lsl r0, r0, #0x10\n\
+ lsr r0, r0, #0x10\n\
+ str r0, [sp, #0x18]\n\
+ mov r1, sl\n\
+ str r1, [sp, #0x14]\n\
+ add r0, r6, #0\n\
+ mov r1, #0x32\n\
+ add r2, r4, #0\n\
+ bl SetBoxMonData\n\
+._157:\n\
+ add r0, r7, #1\n\
+ lsl r0, r0, #0x10\n\
+ lsr r7, r0, #0x10\n\
+ lsl r0, r5, #0x10\n\
+ lsr r5, r0, #0x10\n\
+ cmp r5, #0x1d\n\
+ bhi ._158 @cond_branch\n\
+ cmp r7, #0\n\
+ bne ._159 @cond_branch\n\
+ b ._160\n\
+._159:\n\
+ mov r2, #0xe\n\
+ mov r8, r2\n\
+._158:\n\
+ mov r0, r8\n\
+ add r0, r0, #0x1\n\
+ lsl r0, r0, #0x10\n\
+ lsr r0, r0, #0x10\n\
+ mov r8, r0\n\
+ cmp r0, #0xd\n\
+ bhi ._161 @cond_branch\n\
+ b ._162\n\
+._161:\n\
+ add sp, sp, #0x1c\n\
+ pop {r3, r4, r5}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ mov sl, r5\n\
+ pop {r4, r5, r6, r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+._164:\n\
+ .align 2, 0\n\
+._163:\n\
+ .word gPokemonStorage+0x4\n\
+ .word gUnknown_Debug_083E05F0");
+}
+#endif
+
+void sub_8096264(struct UnkPSSStruct_2002370 *a0, u16 tileTag, u16 palTag, u8 a3)
+{
+ struct SpritePalette palette = {
+ gBoxSelectionPopupPalette, palTag
+ };
+ struct SpriteSheet sheets[] = {
+ {gBoxSelectionPopupCenterTiles, 0x800, tileTag},
+ {gBoxSelectionPopupSidesTiles, 0x180, tileTag + 1},
+ {}
+ };
+ LoadSpritePalette(&palette);
+ LoadSpriteSheets(sheets);
+ gUnknown_02038478 = a0;
+ a0->unk_0240 = tileTag;
+ a0->unk_0242 = palTag;
+ a0->unk_023e = a3;
+}
+
+void sub_8096310(void)
+{
+ FreeSpritePaletteByTag(gUnknown_02038478->unk_0242);
+ FreeSpriteTilesByTag(gUnknown_02038478->unk_0240);
+ FreeSpriteTilesByTag(gUnknown_02038478->unk_0240 + 1);
+}
+
+void sub_809634C(u8 curBox)
+{
+ sub_80963D0(curBox);
+}
+
+void sub_809635C(void)
+{
+ sub_809658C();
+}
+
+u8 sub_8096368(void)
+{
+ if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ return 201;
+ }
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ return gUnknown_02038478->curBox;
+ }
+ if (gMain.newKeys & DPAD_LEFT)
+ {
+ PlaySE(SE_SELECT);
+ sub_809662C();
+ }
+ else if (gMain.newKeys & DPAD_RIGHT)
+ {
+ PlaySE(SE_SELECT);
+ sub_80965F8();
+ }
+ return 200;
+}
+
+void sub_80963D0(u8 curBox)
+{
+ u16 i;
+ u8 spriteId;
+ struct SpriteTemplate template;
+ struct OamData oamData = {};
+ oamData.size = 3;
+ oamData.paletteNum = 1;
+ template = (struct SpriteTemplate){
+ 0, 0, &oamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+ };
+
+ gUnknown_02038478->curBox = curBox;
+ template.tileTag = gUnknown_02038478->unk_0240;
+ template.paletteTag = gUnknown_02038478->unk_0242;
+
+ spriteId = CreateSprite(&template, 0xA0, 0x60, 0);
+ gUnknown_02038478->unk_0000 = gSprites + spriteId;
+
+ oamData.shape = ST_OAM_V_RECTANGLE;
+ oamData.size = 1;
+ template.tileTag = gUnknown_02038478->unk_0240 + 1;
+ template.anims = gSpriteAnimTable_83B604C;
+ for (i = 0; i < 4; i++)
+ {
+ u16 r5;
+ spriteId = CreateSprite(&template, 0x7c, 0x50, gUnknown_02038478->unk_023e);
+ gUnknown_02038478->unk_0004[i] = gSprites + spriteId;
+ r5 = 0;
+ if (i & 2)
+ {
+ gUnknown_02038478->unk_0004[i]->pos1.x = 0xc4;
+ r5 = 2;
+ }
+ if (i & 1)
+ {
+ gUnknown_02038478->unk_0004[i]->pos1.y = 0x70;
+ gUnknown_02038478->unk_0004[i]->oam.size = 0;
+ r5++;
+ }
+ StartSpriteAnim(gUnknown_02038478->unk_0004[i], r5);
+ }
+ for (i = 0; i < 2; i++)
+ {
+ gUnknown_02038478->unk_0020[i] = sub_809A9A0(72 * i + 0x7c, 0x58, i, 0, gUnknown_02038478->unk_023e);
+ if (gUnknown_02038478->unk_0020[i])
+ {
+ gUnknown_02038478->unk_0020[i]->data[0] = (i == 0 ? -1 : 1);
+ gUnknown_02038478->unk_0020[i]->callback = sub_8096784;
+ }
+ }
+ sub_809665C();
+}
+
+void sub_809658C(void)
+{
+ u16 i;
+ if (gUnknown_02038478->unk_0000)
+ {
+ DestroySprite(gUnknown_02038478->unk_0000);
+ gUnknown_02038478->unk_0000 = NULL;
+ }
+ for (i = 0; i < 4; i++)
+ {
+ if (gUnknown_02038478->unk_0004[i])
+ {
+ DestroySprite(gUnknown_02038478->unk_0004[i]);
+ gUnknown_02038478->unk_0004[i] = NULL;
+ }
+ }
+ for (i = 0; i < 2; i++)
+ {
+ if (gUnknown_02038478->unk_0020[i])
+ DestroySprite(gUnknown_02038478->unk_0020[i]);
+ }
+}
+
+void sub_80965F8(void)
+{
+ if (++gUnknown_02038478->curBox > 13)
+ gUnknown_02038478->curBox = 0;
+ sub_809665C();
+}
+
+void sub_809662C(void)
+{
+ gUnknown_02038478->curBox = (gUnknown_02038478->curBox == 0 ? 13 : gUnknown_02038478->curBox - 1);
+ sub_809665C();
+}
+
+void sub_809665C(void)
+{
+ u8 nPokemonInBox = CountPokemonInBoxN(gUnknown_02038478->curBox);
+ u8 *stringVar = gStringVar1;
+
+ stringVar[0] = EXT_CTRL_CODE_BEGIN;
+ stringVar[1] = 0x04; // EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW
+ stringVar[2] = 0x0F; // TEXT_COLOR_WHITE2
+ stringVar[3] = 0x01; // TEXT_COLOR_DARK_GREY
+ stringVar[4] = 0x0E; // TEXT_COLOR_LIGHT_BLUE
+ stringVar += 5;
+
+ stringVar = StringCopy(stringVar, gPokemonStorage.boxNames[gUnknown_02038478->curBox]);
+
+ stringVar[0] = CHAR_NEWLINE;
+ stringVar[1] = EXT_CTRL_CODE_BEGIN;
+ stringVar[2] = 0x11; // EXT_CTRL_CODE_CLEAR
+ if (nPokemonInBox < 10)
+ stringVar[3] = 0x28;
+ else
+ stringVar[3] = 0x22;
+ stringVar += 4;
+
+ stringVar = ConvertIntToDecimalString(stringVar, nPokemonInBox);
+
+ stringVar[0] = CHAR_SLASH;
+ stringVar[1] = CHAR_0 + 3;
+ stringVar[2] = CHAR_0 + 0;
+ stringVar[3] = EOS;
+ sub_80966F4(gStringVar1, 0, 1);
+}
+
+void sub_80966F4(const u8 *sourceString, u16 x, u16 y)
+{
+ u16 *vdest = (u16 *)(BG_CHAR_ADDR(4) + (GetSpriteTileStartByTag(gUnknown_02038478->unk_0240) * 32) + y * 256 + x * 32);
+ u8 *tileBuff = gUnknown_083B6DB8;
+ DmaFill16(3, 0x1111, tileBuff, 0x400);
+ Text_InitWindow8004E3C(&gWindowTemplate_81E6D38, tileBuff, sourceString);
+ DmaCopy16(3, tileBuff, vdest, 0x400);
+}
+
+void sub_8096784(struct Sprite *sprite)
+{
+ if (++sprite->data[1] > 3)
+ {
+ sprite->data[1] = 0;
+ sprite->pos2.x += sprite->data[0];
+ if (++sprite->data[2] > 5)
+ {
+ sprite->data[2] = 0;
+ sprite->pos2.x = 0;
+ }
+ }
+}
diff --git a/src/pokemon_storage_system_2.c b/src/pokemon_storage_system_2.c
new file mode 100644
index 000000000..0331abf3e
--- /dev/null
+++ b/src/pokemon_storage_system_2.c
@@ -0,0 +1,2121 @@
+
+// Includes
+#include "global.h"
+#include "decompress.h"
+#include "constants/songs.h"
+#include "constants/species.h"
+#include "data2.h"
+#include "sound.h"
+#include "ewram.h"
+#include "task.h"
+#include "main.h"
+#include "palette.h"
+#include "menu.h"
+#include "graphics.h"
+#include "strings.h"
+#include "string_util.h"
+#include "pokemon_summary_screen.h"
+#include "mail_data.h"
+#include "naming_screen.h"
+#include "pokemon_storage_system.h"
+
+// Static type declarations
+
+// Static RAM declarations
+
+EWRAM_DATA u8 gUnknown_0203847C = 0;
+EWRAM_DATA u8 gUnknown_0203847D = 0;
+EWRAM_DATA u8 gUnknown_0203847E = 0;
+EWRAM_DATA u8 gUnknown_0203847F = 0;
+
+// Static ROM declarations
+
+void sub_8096884(void);
+void sub_8096AFC(void);
+void sub_8096B38(void);
+void SetPSSCallback(void (*func)(void));
+void sub_8096BF0(void);
+void sub_8096C68(void);
+void sub_8096C84(void);
+void sub_8096FC8(void);
+void sub_8097004(void);
+void sub_8097078(void);
+void sub_80972A8(void);
+void sub_80972FC(void);
+void c3_0808DC50(void);
+void sub_8097390(void);
+void sub_809746C(void);
+void sub_8097594(void);
+void sub_8097788(void);
+void sub_80977E4(void);
+void sub_8097858(void);
+void sub_809789C(void);
+void sub_8097974(void);
+void sub_8097A64(void);
+void sub_8097B44(void);
+void sub_8097BA0(void);
+void sub_8097CC0(void);
+void sub_8097DE0(void);
+void sub_8097E44(void);
+void sub_8097E70(void);
+void sub_8097F58(void);
+void sub_8097FB8(void);
+void sub_809801C(void);
+void BoxSetMosaic(void);
+void sub_8098090(struct Sprite *sprite);
+void sub_80980D4(void);
+void sub_80981F0(u16 species, u32 pid);
+void sub_80982B4(void);
+void sub_8098350(void);
+void sub_8098400(void);
+void add_to_c3_somehow(void);
+void sub_8098780(void);
+void sub_8098690(bool8 flag);
+bool8 sub_80985CC(void);
+void sub_80986E8(void);
+void sub_8098710(void);
+void sub_8098734(void);
+void sub_80987DC(void);
+void sub_809880C(void);
+bool8 sub_8098830(void);
+void PrintStorageActionText(u8 index);
+void sub_8098A38(s8);
+void sub_8098A5C(void);
+void sub_8098A80(void);
+void sub_8098AA8(u8 a0);
+
+// .rodata
+
+const u16 gPokemonStorageScrollingBGPalette[] = INCBIN_U16("graphics/pokemon_storage/scrolling_bg.gbapal");
+
+const u16 gPokemonStorageScrollingBGTile[] = INCBIN_U16("graphics/pokemon_storage/scrolling_bg.4bpp");
+
+const u8 gPokemonStorageScrollingBGTilemap[] = INCBIN_U8("graphics/pokemon_storage/scrolling_bg_map.bin.lz");
+
+const u16 sUnknownTilemap[] = {
+ 0x1281,
+ 0x1282,
+ 0x1283,
+ 0x1284,
+ 0x1285,
+ 0x1286,
+ 0x1287,
+ 0x1288,
+ 0x128C,
+ 0x128D,
+ 0x128E,
+ 0x128F,
+ 0x1290,
+ 0x1291,
+ 0x1292,
+ 0x1293,
+ 0x0281,
+ 0x0282,
+ 0x0283,
+ 0x0284,
+ 0x0285,
+ 0x0286,
+ 0x0287,
+ 0x0288,
+ 0x028C,
+ 0x028D,
+ 0x028E,
+ 0x028F,
+ 0x0290,
+ 0x0291,
+ 0x0292,
+ 0x0293,
+ 0x12AD,
+ 0x12AE,
+ 0x12A8,
+ 0x12A8
+};
+
+const u16 WaveformPalette[] = INCBIN_U16("graphics/pokemon_storage/waveform.gbapal");
+
+const u8 WaveformTiles[] = INCBIN_U8("graphics/pokemon_storage/waveform.4bpp");
+
+const u16 gUnknown_083B6D74[] = INCBIN_U16("graphics/pokemon_storage/83B6D74.gbapal");
+
+const u16 gUnknown_083B6D94[] = INCBIN_U16("graphics/pokemon_storage/83B6D94.gbapal");
+
+struct PokemonStorageSystemData *const gPokemonStorageSystemPtr = &ePokemonStorageSystem;
+
+u8 *const gUnknown_083B6DB8 = gTileBuffer;
+
+const struct SpritePalette gWaveformSpritePalette = {
+ WaveformPalette, 0xdacd
+};
+
+// .text
+
+void task_intro_29(u8 whichMenu)
+{
+ gUnknown_0203847D = whichMenu;
+ gPokemonStorageSystemPtr->unk_0005 = whichMenu;
+ SetMainCallback2(sub_8096884);
+}
+
+void sub_80967DC(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;
+}
+
+void sub_8096804(void)
+{
+ ResetPaletteFade();
+ ResetSpriteData();
+ FreeSpriteTileRanges();
+ FreeAllSpritePalettes();
+ ResetTasks();
+ gReservedSpriteTileCount = 0x280;
+ sub_809CFDC(&gPokemonStorageSystemPtr->unk_0020, gPokemonStorageSystemPtr->unk_0028, 8);
+ gKeyRepeatStartDelay = 20;
+}
+
+void sub_8096848(void)
+{
+ sub_809B0D4();
+ gUnknown_0203847C = (gPokemonStorageSystemPtr->unk_0005 == 1 ? 1 : 0);
+ gUnknown_0203847E = 0;
+}
+
+void sub_8096874(void)
+{
+ REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON;
+}
+
+extern u8 unk_2038790;
+
+void sub_8096884(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ REG_DISPCNT = 0;
+ sub_8096804();
+#if DEBUG
+ unk_2038790 = 0;
+#endif
+ gMain.state++;
+ break;
+ case 1:
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6D00);
+ gMain.state++;
+ break;
+ case 2:
+ InitMenuWindow(&gWindowTemplate_81E6D00);
+ Menu_EraseScreen();
+ gMain.state++;
+ break;
+ case 3:
+ sub_80967DC();
+ sub_8096848();
+ gMain.state++;
+ break;
+ case 4:
+ ResetPSSMonIconSprites();
+ sub_809AA24();
+ gMain.state++;
+ break;
+ case 5:
+ sub_8097DE0();
+ gMain.state++;
+ break;
+ case 6:
+ sub_8097E70();
+ gMain.state++;
+ break;
+ case 7:
+ sub_8098400();
+ gMain.state++;
+ break;
+ case 8:
+ sub_8099BF8(gPokemonStorage.currentBox);
+ gPokemonStorageSystemPtr->unk_12bc.baseTileTag = 0x000a;
+ gPokemonStorageSystemPtr->unk_12bc.basePaletteTag = 0xdacb;
+ sub_80F727C(&gPokemonStorageSystemPtr->unk_12bc);
+ sub_80F7404();
+ gMain.state++;
+ break;
+ case 9:
+ sub_8096874();
+ SetPSSCallback(sub_8096BF0);
+ SetMainCallback2(sub_8096B38);
+ SetVBlankCallback(sub_8096AFC);
+ gMain.state++;
+ break;
+ }
+}
+
+void sub_80969A0(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ REG_DISPCNT = 0;
+ gPokemonStorageSystemPtr->unk_0005 = gUnknown_0203847D;
+ sub_8096804();
+ if (gUnknown_0203847F == 1)
+ sub_809BBC0();
+ if (gUnknown_0203847F == 0)
+ sub_809BD14();
+ gMain.state++;
+ break;
+ case 1:
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6D00);
+ gMain.state++;
+ break;
+ case 2:
+ InitMenuWindow(&gWindowTemplate_81E6D00);
+ Menu_EraseScreen();
+ gMain.state++;
+ break;
+ case 3:
+ sub_80967DC();
+ gMain.state++;
+ break;
+ case 4:
+ ResetPSSMonIconSprites();
+ sub_809AA98();
+ gMain.state++;
+ break;
+ case 5:
+ sub_8097DE0();
+ gMain.state++;
+ break;
+ case 6:
+ sub_8097E70();
+ gMain.state++;
+ break;
+ case 7:
+ sub_8098400();
+ gMain.state++;
+ break;
+ case 8:
+ sub_8099BF8(gPokemonStorage.currentBox);
+ gPokemonStorageSystemPtr->unk_12bc.baseTileTag = 0x000a;
+ gPokemonStorageSystemPtr->unk_12bc.basePaletteTag = 0xdacb;
+ sub_80F727C(&gPokemonStorageSystemPtr->unk_12bc);
+ sub_80F7404();
+ gMain.state++;
+ break;
+ case 9:
+ BeginNormalPaletteFade(0xffffffff, 0, 16, 0, 0);
+ SetVBlankCallback(sub_8096AFC);
+ gMain.state++;
+ break;
+ case 10:
+ sub_8096874();
+ SetPSSCallback(sub_8096C68);
+ SetMainCallback2(sub_8096B38);
+ gMain.state++;
+ break;
+ }
+}
+
+#if DEBUG
+
+void debug_sub_80A4300(void)
+{
+ gUnknown_0203847D = 0;
+ gPokemonStorageSystemPtr->unk_0005 = 0;
+ sub_8096884();
+ if (gMain.callback2 == sub_8096B38)
+ unk_2038790 = 1;
+}
+
+extern void (*unk_2038794)(void);
+extern u32 unk_2038798;
+
+extern void unref_sub_809CB94();
+
+void debug_sub_80A433C(u32 a, void (*b)(void))
+{
+ unk_2038794 = b;
+ unk_2038798 = a;
+ SetMainCallback2(debug_sub_80A4300);
+}
+
+void debug_sub_80A435C(void)
+{
+ switch (gPokemonStorageSystemPtr->unk_0004)
+ {
+ case 0:
+ unref_sub_809CB94(unk_2038798);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ gPokemonStorageSystemPtr->unk_0004++;
+ break;
+ case 1:
+ if (!UpdatePaletteFade())
+ unk_2038794();
+ break;
+ }
+}
+
+#endif
+
+void sub_8096AFC(void)
+{
+ REG_BG2HOFS = gPokemonStorageSystemPtr->unk_08b4;
+ REG_BG3HOFS = gPokemonStorageSystemPtr->unk_000a;
+ REG_BG3VOFS = gPokemonStorageSystemPtr->unk_0008;
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ sub_809CFF0();
+ TransferPlttBuffer();
+}
+
+void sub_8096B38(void)
+{
+ gPokemonStorageSystemPtr->unk_0000();
+ sub_8097E44();
+ sub_8098734();
+ AnimateSprites();
+ BuildOamBuffer();
+}
+
+void sub_8096B5C(void)
+{
+ switch (gPokemonStorageSystemPtr->unk_0006)
+ {
+ case 0:
+ ShowPokemonSummaryScreen(gPokemonStorageSystemPtr->unk_2690.pokemon, gPokemonStorageSystemPtr->unk_268d, gPokemonStorageSystemPtr->unk_268c, sub_80969A0, gPokemonStorageSystemPtr->unk_268e);
+ break;
+ case 1:
+ DoNamingScreen(1, gPokemonStorage.boxNames[gPokemonStorage.currentBox], 0, 0, 0, sub_80969A0);
+ break;
+ }
+}
+
+void SetPSSCallback(void (*func)(void))
+{
+ gPokemonStorageSystemPtr->unk_0000 = func;
+ gPokemonStorageSystemPtr->unk_0004 = 0;
+}
+
+void sub_8096BF0(void)
+{
+ switch (gPokemonStorageSystemPtr->unk_0004)
+ {
+ case 0:
+ BlendPalettes(0xffffffff, 16, 0);
+ gPokemonStorageSystemPtr->unk_0004++;
+ break;
+ case 1:
+ PlaySE(SE_PC_LOGON);
+ gPokemonStorageSystemPtr->unk_000c.tileTag = 14;
+ gPokemonStorageSystemPtr->unk_000c.paletteTag = 0xdad0;
+ gPokemonStorageSystemPtr->unk_000c.unk04 = 0;
+ gPokemonStorageSystemPtr->unk_000c.unk06 = 0;
+ sub_80C5CD4(&gPokemonStorageSystemPtr->unk_000c);
+ BlendPalettes(0xffffffff, 0, 0);
+ gPokemonStorageSystemPtr->unk_0004++;
+ break;
+ case 2:
+ if (sub_80C5DCC())
+ SetPSSCallback(sub_8096C84);
+ break;
+ }
+}
+
+void sub_8096C68(void)
+{
+ if (!UpdatePaletteFade())
+ SetPSSCallback(sub_8096C84);
+}
+
+void sub_8096C84(void)
+{
+ switch (gPokemonStorageSystemPtr->unk_0004)
+ {
+ case 0:
+ switch (sub_809CA40())
+ {
+ case 1:
+ PlaySE(SE_SELECT);
+ gPokemonStorageSystemPtr->unk_0004 = 1;
+ break;
+ case 5:
+ if (gPokemonStorageSystemPtr->unk_0005 != 2)
+ {
+ PrintStorageActionText(PC_TEXT_WHICH_ONE_WILL_TAKE);
+ gPokemonStorageSystemPtr->unk_0004 = 3;
+ }
+ else
+ {
+ sub_809B0D4();
+ SetPSSCallback(sub_8096FC8);
+ }
+ break;
+ case 6:
+ if (gPokemonStorageSystemPtr->unk_0005 == 2)
+ {
+ if (sub_809BF20() && ItemIsMail(gPokemonStorageSystemPtr->unk_11f2))
+ gPokemonStorageSystemPtr->unk_0004 = 5;
+ else
+ SetPSSCallback(sub_8097004);
+ }
+ break;
+ case 4:
+#if DEBUG
+ if (unk_2038790 != 0)
+ break;
+#endif
+ SetPSSCallback(sub_8097BA0);
+ break;
+ case 16:
+#if DEBUG
+ if (unk_2038790 != 0)
+ break;
+#endif
+ SetPSSCallback(sub_8097CC0);
+ break;
+ case 7:
+ PlaySE(SE_SELECT);
+ SetPSSCallback(sub_809789C);
+ break;
+ case 8:
+ PlaySE(SE_SELECT);
+ SetPSSCallback(sub_8097078);
+ break;
+ case 9:
+ PlaySE(SE_SELECT);
+ gPokemonStorageSystemPtr->unk_08b2 = gPokemonStorage.currentBox + 1;
+ if (gPokemonStorageSystemPtr->unk_08b2 > 13)
+ gPokemonStorageSystemPtr->unk_08b2 = 0;
+ sub_8099C70(gPokemonStorageSystemPtr->unk_08b2);
+ gPokemonStorageSystemPtr->unk_0004 = 2;
+ break;
+ case 10:
+ PlaySE(SE_SELECT);
+ gPokemonStorageSystemPtr->unk_08b2 = gPokemonStorage.currentBox - 1;
+ if (gPokemonStorageSystemPtr->unk_08b2 < 0)
+ gPokemonStorageSystemPtr->unk_08b2 = 13;
+ sub_8099C70(gPokemonStorageSystemPtr->unk_08b2);
+ gPokemonStorageSystemPtr->unk_0004 = 2;
+ break;
+ case 11:
+ if (!sub_809BE80())
+ {
+ if (ItemIsMail(gPokemonStorageSystemPtr->unk_11f2))
+ {
+ gPokemonStorageSystemPtr->unk_0004 = 5;
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ SetPSSCallback(sub_809746C);
+ }
+ }
+ else
+ {
+ gPokemonStorageSystemPtr->unk_0004 = 4;
+ }
+ break;
+ case 13:
+ if (sub_809BE80())
+ {
+ gPokemonStorageSystemPtr->unk_0004 = 4;
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ SetPSSCallback(sub_80972A8);
+ }
+ break;
+ case 14:
+ if (!sub_809BEBC())
+ {
+ gPokemonStorageSystemPtr->unk_0004 = 4;
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ SetPSSCallback(c3_0808DC50);
+ }
+ break;
+ case 12:
+ PlaySE(SE_SELECT);
+ SetPSSCallback(sub_8097390);
+ break;
+ case 15:
+ PlaySE(SE_SELECT);
+ SetPSSCallback(sub_80972FC);
+ break;
+ }
+ break;
+ case 1:
+ if (!sub_809AC00())
+ {
+ if (sub_809BF48())
+ sub_80986E8();
+ else
+ sub_8098710();
+ if (gPokemonStorageSystemPtr->unk_11f6)
+ BoxSetMosaic();
+ gPokemonStorageSystemPtr->unk_0004 = 0;
+ }
+ break;
+ case 2:
+ if (!sub_8099D34())
+ {
+ gPokemonStorage.currentBox = gPokemonStorageSystemPtr->unk_08b2;
+ if (!gUnknown_0203847C && !sub_809BF20())
+ {
+ sub_809B440();
+ BoxSetMosaic();
+ }
+ gPokemonStorageSystemPtr->unk_0004 = 0;
+ }
+ break;
+ case 3:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY))
+ {
+ sub_8098A5C();
+ gPokemonStorageSystemPtr->unk_0004 = 0;
+ }
+ break;
+ case 4:
+ PlaySE(SE_HAZURE);
+ PrintStorageActionText(PC_TEXT_LAST_POKE);
+ gPokemonStorageSystemPtr->unk_0004 = 6;
+ break;
+ case 5:
+ PlaySE(SE_HAZURE);
+ PrintStorageActionText(PC_TEXT_PLEASE_REMOVE_MAIL);
+ gPokemonStorageSystemPtr->unk_0004 = 6;
+ break;
+ case 6:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY))
+ {
+ sub_8098A5C();
+ SetPSSCallback(sub_8096C84);
+ }
+ break;
+ }
+}
+
+void sub_8096FC8(void)
+{
+ switch (gPokemonStorageSystemPtr->unk_0004)
+ {
+ case 0:
+ sub_809880C();
+ gPokemonStorageSystemPtr->unk_0004++;
+ break;
+ case 1:
+ if (!sub_8098830())
+ SetPSSCallback(sub_8096C84);
+ break;
+ }
+}
+
+void sub_8097004(void)
+{
+ switch (gPokemonStorageSystemPtr->unk_0004)
+ {
+ case 0:
+ PlaySE(SE_SELECT);
+ add_to_c3_somehow();
+ gPokemonStorageSystemPtr->unk_0004++;
+ break;
+ case 1:
+ if (!sub_80985CC())
+ {
+ sub_809B0C0(sub_809B0F4());
+ gPokemonStorageSystemPtr->unk_0004++;
+ }
+ break;
+ case 2:
+ if (!sub_809AC00())
+ {
+ if (gPokemonStorageSystemPtr->unk_11f6)
+ BoxSetMosaic();
+ SetPSSCallback(sub_8096C84);
+ }
+ break;
+ }
+}
+
+void sub_8097078(void)
+{
+ switch (gPokemonStorageSystemPtr->unk_0004)
+ {
+ case 0:
+ PrintStorageActionText(PC_TEXT_IS_SELECTED);
+ sub_809CE84();
+ gPokemonStorageSystemPtr->unk_0004 = 1;
+ break;
+ case 1:
+ switch (sub_809CF30())
+ {
+ case -1:
+ case 0:
+ sub_8098A5C();
+ SetPSSCallback(sub_8096C84);
+ break;
+ case 3:
+ if (sub_809BE80())
+ {
+ gPokemonStorageSystemPtr->unk_0004 = 2;
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ sub_8098A5C();
+ SetPSSCallback(sub_80972A8);
+ }
+ break;
+ case 5:
+ PlaySE(SE_SELECT);
+ sub_8098A5C();
+ SetPSSCallback(sub_80972FC);
+ break;
+ case 4:
+ if (!sub_809BEBC())
+ {
+ gPokemonStorageSystemPtr->unk_0004 = 2;
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ sub_8098A5C();
+ SetPSSCallback(c3_0808DC50);
+ }
+ break;
+ case 2:
+ PlaySE(SE_SELECT);
+ sub_8098A5C();
+ SetPSSCallback(sub_8097390);
+ break;
+ case 1:
+ if (sub_809BE80())
+ {
+ gPokemonStorageSystemPtr->unk_0004 = 2;
+ }
+ else if (ItemIsMail(gPokemonStorageSystemPtr->unk_11f2))
+ {
+ gPokemonStorageSystemPtr->unk_0004 = 3;
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ sub_8098A5C();
+ SetPSSCallback(sub_809746C);
+ }
+ break;
+ case 7:
+ if (sub_809BE80())
+ {
+ gPokemonStorageSystemPtr->unk_0004 = 2;
+ }
+ else if (gPokemonStorageSystemPtr->unk_11f9)
+ {
+ gPokemonStorageSystemPtr->unk_0004 = 4;
+ }
+ else if (ItemIsMail(gPokemonStorageSystemPtr->unk_11f2))
+ {
+ gPokemonStorageSystemPtr->unk_0004 = 3;
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ SetPSSCallback(sub_8097594);
+ }
+ break;
+ case 6:
+ PlaySE(SE_SELECT);
+ SetPSSCallback(sub_8097788);
+ break;
+ case 8:
+ PlaySE(SE_SELECT);
+ SetPSSCallback(sub_80977E4);
+ break;
+#if DEBUG
+ case 32:
+ PlaySE(SE_SELECT);
+ sub_8098A5C();
+ SetPSSCallback(debug_sub_80A435C);
+ break;
+#endif
+ }
+ break;
+ case 2:
+ PlaySE(SE_HAZURE);
+ PrintStorageActionText(PC_TEXT_LAST_POKE);
+ gPokemonStorageSystemPtr->unk_0004 = 5;
+ break;
+ case 4:
+ PlaySE(SE_HAZURE);
+ PrintStorageActionText(PC_TEXT_CANT_RELEASE_EGG);
+ gPokemonStorageSystemPtr->unk_0004 = 5;
+ break;
+ case 3:
+ PlaySE(SE_HAZURE);
+ PrintStorageActionText(PC_TEXT_PLEASE_REMOVE_MAIL);
+ gPokemonStorageSystemPtr->unk_0004 = 5;
+ break;
+ case 5:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY))
+ {
+ sub_8098A5C();
+ SetPSSCallback(sub_8096C84);
+ }
+ break;
+ }
+}
+
+void sub_80972A8(void)
+{
+ switch (gPokemonStorageSystemPtr->unk_0004)
+ {
+ case 0:
+ sub_809B100(0);
+ gPokemonStorageSystemPtr->unk_0004++;
+ break;
+ case 1:
+ if (!sub_809B130())
+ {
+ if (gUnknown_0203847C)
+ SetPSSCallback(sub_8097858);
+ else
+ SetPSSCallback(sub_8096C84);
+ }
+ break;
+ }
+}
+
+void sub_80972FC(void)
+{
+ switch (gPokemonStorageSystemPtr->unk_0004)
+ {
+ case 0:
+ sub_809B100(1);
+ gPokemonStorageSystemPtr->unk_0004++;
+ break;
+ case 1:
+ if (!sub_809B130())
+ {
+ if (gUnknown_0203847C)
+ SetPSSCallback(sub_8097858);
+ else
+ SetPSSCallback(sub_8096C84);
+ }
+ break;
+ }
+}
+
+void c3_0808DC50(void)
+{
+ switch (gPokemonStorageSystemPtr->unk_0004)
+ {
+ case 0:
+ sub_809B100(2);
+ gPokemonStorageSystemPtr->unk_0004++;
+ break;
+ case 1:
+ if (!sub_809B130())
+ {
+ BoxSetMosaic();
+ SetPSSCallback(sub_8096C84);
+ }
+ break;
+ }
+}
+
+void sub_8097390(void)
+{
+ switch (gPokemonStorageSystemPtr->unk_0004)
+ {
+ case 0:
+ if (CalculatePlayerPartyCount() == 6)
+ {
+ PrintStorageActionText(PC_TEXT_PARTY_FULL);
+ gPokemonStorageSystemPtr->unk_0004 = 1;
+ }
+ else
+ {
+ sub_809B0E0();
+ sub_809B100(0);
+ gPokemonStorageSystemPtr->unk_0004 = 2;
+ }
+ break;
+ case 1:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY))
+ {
+ sub_8098A5C();
+ SetPSSCallback(sub_8096C84);
+ }
+ break;
+ case 2:
+ if (!sub_809B130())
+ {
+ sub_809880C();
+ gPokemonStorageSystemPtr->unk_0004++;
+ }
+ break;
+ case 3:
+ if (!sub_8098830())
+ {
+ sub_809B100(1);
+ gPokemonStorageSystemPtr->unk_0004++;
+ }
+ break;
+ case 4:
+ if (!sub_809B130())
+ {
+ sub_80987DC();
+ gPokemonStorageSystemPtr->unk_0004++;
+ }
+ break;
+ case 5:
+ SetPSSCallback(sub_8097004);
+ break;
+ }
+}
+
+void sub_809746C(void)
+{
+ u8 r4;
+
+ switch (gPokemonStorageSystemPtr->unk_0004)
+ {
+ case 0:
+ PrintStorageActionText(PC_TEXT_DEPOSIT_IN_WHICH_BOX);
+ sub_8096264(&gPokemonStorageSystemPtr->unk_2370, 0x0007, 0xdaca, 3);
+ sub_809634C(gUnknown_0203847E);
+ gPokemonStorageSystemPtr->unk_0004++;
+ break;
+ case 1:
+ r4 = sub_8096368();
+ if (r4 == 200);
+ else if (r4 == 201)
+ {
+ sub_8098A5C();
+ sub_809635C();
+ sub_8096310();
+ SetPSSCallback(sub_8096C84);
+ }
+ else
+ {
+ if (sub_809B62C(r4))
+ {
+ sub_8098A5C();
+ sub_809635C();
+ sub_8096310();
+ gPokemonStorageSystemPtr->unk_0004 = 2;
+ }
+ else
+ {
+ PrintStorageActionText(PC_TEXT_BOX_IS_FULL);
+ gPokemonStorageSystemPtr->unk_0004 = 4;
+ }
+ gUnknown_0203847E = r4;
+ }
+ break;
+ case 2:
+ party_compaction();
+ sub_8099310();
+ gPokemonStorageSystemPtr->unk_0004++;
+ break;
+ case 3:
+ if (sub_8099374() == 0)
+ {
+ sub_809B6BC();
+ BoxSetMosaic();
+ sub_80987DC();
+ SetPSSCallback(sub_8096C84);
+ }
+ break;
+ case 4:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ PrintStorageActionText(PC_TEXT_DEPOSIT_IN_WHICH_BOX);
+ gPokemonStorageSystemPtr->unk_0004 = 1;
+ }
+ break;
+ }
+}
+
+void sub_8097594(void)
+{
+ switch (gPokemonStorageSystemPtr->unk_0004)
+ {
+ case 0:
+ PrintStorageActionText(PC_TEXT_RELEASE_POKE);
+ sub_8098A38(1);
+ gPokemonStorageSystemPtr->unk_0004++;
+ // fallthrough
+ case 1:
+ switch (Menu_ProcessInputNoWrap())
+ {
+ case -1:
+ case 1:
+ sub_8098A5C();
+ SetPSSCallback(sub_8096C84);
+ break;
+ case 0:
+ sub_8098A5C();
+ sub_809B7D4();
+ sub_809B6DC();
+ gPokemonStorageSystemPtr->unk_0004++;
+ break;
+ }
+ break;
+ case 2:
+ sub_809B960();
+ if (!sub_809B734())
+ {
+ while (1)
+ {
+ s8 r0 = sub_809B960();
+ if (r0 == 1)
+ {
+ gPokemonStorageSystemPtr->unk_0004++;
+ break;
+ }
+ if (r0 == 0)
+ {
+ gPokemonStorageSystemPtr->unk_0004 = 8;
+ break;
+ }
+ }
+ }
+ break;
+ case 3:
+ sub_809B760();
+ sub_809801C();
+ PrintStorageActionText(PC_TEXT_WAS_RELEASED);
+ gPokemonStorageSystemPtr->unk_0004++;
+ break;
+ case 4:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ PrintStorageActionText(PC_TEXT_BYE_BYE);
+ gPokemonStorageSystemPtr->unk_0004++;
+ }
+ break;
+ case 5:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ sub_8098A5C();
+ if (gUnknown_0203847C)
+ {
+ party_compaction();
+ sub_8099310();
+ gPokemonStorageSystemPtr->unk_0004++;
+ }
+ else
+ {
+ gPokemonStorageSystemPtr->unk_0004 = 7;
+ }
+ }
+ break;
+ case 6:
+ if (sub_8099374() == 0)
+ {
+ sub_809B440();
+ BoxSetMosaic();
+ sub_80987DC();
+ gPokemonStorageSystemPtr->unk_0004++;
+ }
+ break;
+ case 7:
+ SetPSSCallback(sub_8096C84);
+ break;
+ case 8:
+ PrintStorageActionText(PC_TEXT_WAS_RELEASED);
+ gPokemonStorageSystemPtr->unk_0004++;
+ break;
+ case 9:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ PrintStorageActionText(PC_TEXT_SURPRISE);
+ gPokemonStorageSystemPtr->unk_0004++;
+ }
+ break;
+ case 10:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ sub_8098A5C();
+ sub_8099958();
+ gPokemonStorageSystemPtr->unk_0004++;
+ }
+ break;
+ case 11:
+ if (!sub_8099990())
+ {
+ sub_809B7AC();
+ PrintStorageActionText(PC_TEXT_CAME_BACK);
+ gPokemonStorageSystemPtr->unk_0004++;
+ }
+ break;
+ case 12:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ PrintStorageActionText(PC_TEXT_WORRIED);
+ gPokemonStorageSystemPtr->unk_0004++;
+ }
+ break;
+ case 13:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ sub_8098A5C();
+ SetPSSCallback(sub_8096C84);
+ }
+ break;
+ }
+}
+
+void sub_8097788(void)
+{
+ switch (gPokemonStorageSystemPtr->unk_0004)
+ {
+ case 0:
+ sub_809BC18();
+ BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0);
+ gPokemonStorageSystemPtr->unk_0004++;
+ break;
+ case 1:
+ if (!UpdatePaletteFade())
+ {
+ gUnknown_0203847F = 0;
+ gPokemonStorageSystemPtr->unk_0006 = 0;
+ SetMainCallback2(sub_8096B5C);
+ }
+ break;
+ }
+}
+
+void sub_80977E4(void)
+{
+ switch (gPokemonStorageSystemPtr->unk_0004)
+ {
+ case 0:
+ PrintStorageActionText(PC_TEXT_MARK_POKE);
+ gPokemonStorageSystemPtr->unk_12bc.markings = gPokemonStorageSystemPtr->unk_11f7;
+ sub_80F7418(gPokemonStorageSystemPtr->unk_11f7, 0xb0, 0x10);
+ gPokemonStorageSystemPtr->unk_0004++;
+ break;
+ case 1:
+ if (!sub_80F7500())
+ {
+ sub_80F7470();
+ sub_8098A5C();
+ sub_809BDD8(gPokemonStorageSystemPtr->unk_12bc.markings);
+ sub_809801C();
+ SetPSSCallback(sub_8096C84);
+ }
+ break;
+ }
+}
+
+void sub_8097858(void)
+{
+ switch (gPokemonStorageSystemPtr->unk_0004)
+ {
+ case 0:
+ party_compaction();
+ sub_8099310();
+ gPokemonStorageSystemPtr->unk_0004++;
+ break;
+ case 1:
+ if (sub_8099374() == 0)
+ {
+ sub_80987DC();
+ SetPSSCallback(sub_8096C84);
+ }
+ break;
+ }
+}
+
+void sub_809789C(void)
+{
+ switch (gPokemonStorageSystemPtr->unk_0004)
+ {
+ case 0:
+ PrintStorageActionText(PC_TEXT_WHAT_YOU_DO);
+ sub_809CE84();
+ gPokemonStorageSystemPtr->unk_0004++;
+ break;
+ case 1:
+ switch (sub_809CF30())
+ {
+ case -1:
+ case 0:
+ sub_809A860(TRUE);
+ sub_8098A5C();
+ SetPSSCallback(sub_8096C84);
+ break;
+ case 11:
+ PlaySE(SE_SELECT);
+ SetPSSCallback(sub_8097B44);
+ break;
+ case 10:
+ PlaySE(SE_SELECT);
+ sub_8098A5C();
+ SetPSSCallback(sub_8097974);
+ break;
+ case 9:
+ PlaySE(SE_SELECT);
+ sub_8098A5C();
+ SetPSSCallback(sub_8097A64);
+ break;
+ }
+ break;
+ }
+}
+
+void sub_8097974(void)
+{
+ switch (gPokemonStorageSystemPtr->unk_0004)
+ {
+ case 0:
+ sub_8098A80();
+ PrintStorageActionText(PC_TEXT_PICK_A_THEME);
+ gPokemonStorageSystemPtr->unk_0004++;
+ break;
+ case 1:
+ gPokemonStorageSystemPtr->unk_0d5e = sub_809CF30();
+ switch (gPokemonStorageSystemPtr->unk_0d5e)
+ {
+ case -1:
+ sub_809A860(TRUE);
+ sub_8098A5C();
+ SetPSSCallback(sub_8096C84);
+ break;
+ case 12 ... 15:
+ PlaySE(SE_SELECT);
+ gPokemonStorageSystemPtr->unk_0d5e -= 12;
+ sub_8098AA8(gPokemonStorageSystemPtr->unk_0d5e);
+ PrintStorageActionText(PC_TEXT_PICK_A_WALLPAPER);
+ gPokemonStorageSystemPtr->unk_0004++;
+ break;
+ }
+ break;
+ case 2:
+ gPokemonStorageSystemPtr->unk_0d60 = sub_809CF30();
+ switch (gPokemonStorageSystemPtr->unk_0d60)
+ {
+ case -1:
+ sub_8098A5C();
+ gPokemonStorageSystemPtr->unk_0004 = 0;
+ break;
+ case -2:
+ break;
+ default:
+ PlaySE(SE_SELECT);
+ sub_8098A5C();
+ gPokemonStorageSystemPtr->unk_0d60 -= 16;
+ sub_8099DCC(gPokemonStorageSystemPtr->unk_0d60);
+ gPokemonStorageSystemPtr->unk_0004++;
+ break;
+ }
+ break;
+ case 3:
+ if (!sub_8099E08())
+ {
+ sub_809A860(TRUE);
+ SetPSSCallback(sub_8096C84);
+ }
+ break;
+ }
+}
+
+void sub_8097A64(void)
+{
+ switch (gPokemonStorageSystemPtr->unk_0004)
+ {
+ case 0:
+ PrintStorageActionText(PC_TEXT_JUMP_TO_WHICH_BOX);
+ sub_8096264(&gPokemonStorageSystemPtr->unk_2370, 0x0007, 0xdaca, 3);
+ sub_809634C(gPokemonStorage.currentBox);
+ gPokemonStorageSystemPtr->unk_0004++;
+ break;
+ case 1:
+ gPokemonStorageSystemPtr->unk_08b2 = sub_8096368();
+ switch (gPokemonStorageSystemPtr->unk_08b2)
+ {
+ case 200:
+ break;
+ default:
+ sub_8098A5C();
+ sub_809635C();
+ sub_8096310();
+ if (gPokemonStorageSystemPtr->unk_08b2 == 201 || gPokemonStorageSystemPtr->unk_08b2 == gPokemonStorage.currentBox)
+ {
+ sub_809A860(TRUE);
+ SetPSSCallback(sub_8096C84);
+ }
+ else
+ {
+ gPokemonStorageSystemPtr->unk_0004++;
+ }
+ break;
+ }
+ break;
+ case 2:
+ sub_8099C70(gPokemonStorageSystemPtr->unk_08b2);
+ gPokemonStorageSystemPtr->unk_0004++;
+ break;
+ case 3:
+ if (!sub_8099D34())
+ {
+ gPokemonStorage.currentBox = gPokemonStorageSystemPtr->unk_08b2;
+ SetPSSCallback(sub_8096C84);
+ }
+ break;
+ }
+}
+
+void sub_8097B44(void)
+{
+ switch (gPokemonStorageSystemPtr->unk_0004)
+ {
+ case 0:
+ sub_809BB90();
+ BeginNormalPaletteFade(0xffffffff, 0, 0, 16, 0);
+ gPokemonStorageSystemPtr->unk_0004++;
+ break;
+ case 1:
+ if (!UpdatePaletteFade())
+ {
+ gUnknown_0203847F = 1;
+ gPokemonStorageSystemPtr->unk_0006 = 1;
+ SetMainCallback2(sub_8096B5C);
+ }
+ break;
+ }
+}
+
+void sub_8097BA0(void)
+{
+ switch (gPokemonStorageSystemPtr->unk_0004)
+ {
+ case 0:
+ if (sub_809BF20())
+ {
+ PlaySE(SE_HAZURE);
+ PrintStorageActionText(PC_TEXT_HOLDING_POKE);
+ gPokemonStorageSystemPtr->unk_0004 = 1;
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ PrintStorageActionText(PC_TEXT_EXIT_BOX);
+ sub_8098A38(0);
+ gPokemonStorageSystemPtr->unk_0004 = 2;
+ }
+ break;
+ case 1:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY))
+ {
+ sub_8098A5C();
+ SetPSSCallback(sub_8096C84);
+ }
+ break;
+ case 2:
+ switch (Menu_ProcessInputNoWrap())
+ {
+ case 1:
+ case -1:
+ sub_8098A5C();
+ SetPSSCallback(sub_8096C84);
+ break;
+ case 0:
+ PlaySE(SE_PC_OFF);
+ sub_8098A5C();
+ gPokemonStorageSystemPtr->unk_0004++;
+ break;
+ }
+ break;
+ case 3:
+ gPokemonStorageSystemPtr->unk_000c.tileTag = 0x000e;
+ gPokemonStorageSystemPtr->unk_000c.paletteTag = 0xdad0;
+ gPokemonStorageSystemPtr->unk_000c.unk04 = 20;
+ gPokemonStorageSystemPtr->unk_000c.unk06 = 0;
+ sub_80C5E38(&gPokemonStorageSystemPtr->unk_000c);
+ gPokemonStorageSystemPtr->unk_0004++;
+ break;
+ case 4:
+ if (sub_80C5F98())
+ {
+ gPlayerPartyCount = CalculatePlayerPartyCount();
+ SetMainCallback2(sub_80961A8);
+ }
+ break;
+ }
+}
+
+void sub_8097CC0(void)
+{
+ switch (gPokemonStorageSystemPtr->unk_0004)
+ {
+ case 0:
+ if (sub_809BF20())
+ {
+ PlaySE(SE_HAZURE);
+ PrintStorageActionText(PC_TEXT_HOLDING_POKE);
+ gPokemonStorageSystemPtr->unk_0004 = 1;
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ PrintStorageActionText(PC_TEXT_CONTINUE_BOX);
+ sub_8098A38(0);
+ gPokemonStorageSystemPtr->unk_0004 = 2;
+ }
+ break;
+ case 1:
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON | DPAD_ANY))
+ {
+ sub_8098A5C();
+ SetPSSCallback(sub_8096C84);
+ }
+ break;
+ case 2:
+ switch (Menu_ProcessInputNoWrap())
+ {
+ case 0:
+ sub_8098A5C();
+ SetPSSCallback(sub_8096C84);
+ break;
+ case -1:
+ case 1:
+ PlaySE(SE_PC_OFF);
+ sub_8098A5C();
+ gPokemonStorageSystemPtr->unk_0004++;
+ break;
+ }
+ break;
+ case 3:
+ gPokemonStorageSystemPtr->unk_000c.tileTag = 0x000e;
+ gPokemonStorageSystemPtr->unk_000c.paletteTag = 0xdad0;
+ gPokemonStorageSystemPtr->unk_000c.unk04 = 20;
+ gPokemonStorageSystemPtr->unk_000c.unk06 = 0;
+ sub_80C5E38(&gPokemonStorageSystemPtr->unk_000c);
+ gPokemonStorageSystemPtr->unk_0004++;
+ break;
+ case 4:
+ if (sub_80C5F98())
+ {
+ gPlayerPartyCount = CalculatePlayerPartyCount();
+ SetMainCallback2(sub_80961A8);
+ }
+ break;
+ }
+}
+
+void sub_8097DE0(void)
+{
+ gPokemonStorageSystemPtr->unk_0007 = 0;
+ gPokemonStorageSystemPtr->unk_0008 = 0;
+ gPokemonStorageSystemPtr->unk_000a = 0;
+ REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(3) | BGCNT_SCREENBASE(30);
+ DmaCopy16Defvars(3, gPokemonStorageScrollingBGTile, BG_SCREEN_ADDR(28), sizeof gPokemonStorageScrollingBGTile);
+ LZ77UnCompVram(gPokemonStorageScrollingBGTilemap, BG_SCREEN_ADDR(30));
+ LoadPalette(gPokemonStorageScrollingBGPalette, 0xd0, 0x10);
+}
+
+void sub_8097E44(void)
+{
+ if (++gPokemonStorageSystemPtr->unk_0007 >= 2)
+ {
+ gPokemonStorageSystemPtr->unk_0007 = 0;
+ gPokemonStorageSystemPtr->unk_0008--;
+ gPokemonStorageSystemPtr->unk_000a++;
+ }
+}
+
+void sub_8097E70(void)
+{
+ LZ77UnCompVram(gPSSMenuHeader_Gfx, BG_SCREEN_ADDR(10));
+ LZ77UnCompWram(gPSSMenuHeader_Tilemap, gUnknown_02039760);
+ sub_809D034(BG_SCREEN_ADDR(15), 0, 0, gUnknown_02039760, 0, 0, 10, 20);
+ LoadPalette(gPSSMenu1_Pal, 0x10, 0x20);
+ LoadPalette(gPSSMenu2_Pal, 0x00, 0x20);
+ LoadPalette(gUnknown_083B6D74, 0xB0, 0x20);
+ LoadPalette(gUnknown_083B6D94, 0xC0, 0x20);
+ LoadPalette(gUnknownPalette_81E6692 + 1, 0xF1, 0x02);
+ LoadPalette(gUnknownPalette_81E6692 + 1, 0xF2, 0x02);
+ LoadPalette(gUnknownPalette_81E6692 + 5, 0xF3, 0x02);
+ LoadPalette(gUnknownPalette_81E6692 + 12, 0xF4, 0x04);
+ LoadPalette(gUnknownPalette_81E6692 + 10, 0xF6, 0x04);
+ LoadPalette(gUnknownPalette_81E6692 + 2, 0xFF, 0x02);
+ LoadSpritePalette(&gWaveformSpritePalette);
+ sub_80980D4();
+ sub_8097F58();
+ sub_8097FB8();
+ sub_809801C();
+}
+
+void sub_8097F58(void)
+{
+ gPokemonStorageSystemPtr->unk_12ac = sub_80F7940(0x000d, 0xdace, 0);
+ gPokemonStorageSystemPtr->unk_12ac->oam.priority = 0;
+ gPokemonStorageSystemPtr->unk_12ac->subpriority = 1;
+ gPokemonStorageSystemPtr->unk_12ac->pos1.x = 0x28;
+ gPokemonStorageSystemPtr->unk_12ac->pos1.y = 0x95;
+ gPokemonStorageSystemPtr->unk_12b8 = BG_CHAR_ADDR(4) + 32 * GetSpriteTileStartByTag(0x000d);
+}
+
+const struct SpriteTemplate gSpriteTemplate_83B6EFC;
+
+void sub_8097FB8(void)
+{
+ u16 i;
+ struct SpriteSheet sheet = {WaveformTiles, 0x1c0, 0x0005};
+
+ LoadSpriteSheet(&sheet);
+ for (i = 0; i < 2; i++)
+ {
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83B6EFC, i * 63 + 8, 9, 2);
+ gPokemonStorageSystemPtr->unk_12b0[i] = gSprites + spriteId;
+ }
+}
+
+void sub_809801C(void)
+{
+ sub_80981F0(gPokemonStorageSystemPtr->unk_11f0, gPokemonStorageSystemPtr->unk_11ec);
+ sub_80982B4();
+ sub_8098350();
+}
+
+void BoxSetMosaic(void)
+{
+ sub_809801C();
+ if (gPokemonStorageSystemPtr->unk_2700)
+ {
+ gPokemonStorageSystemPtr->unk_2700->oam.mosaic = TRUE;
+ gPokemonStorageSystemPtr->unk_2700->data[0] = 10;
+ gPokemonStorageSystemPtr->unk_2700->data[1] = 1;
+ gPokemonStorageSystemPtr->unk_2700->callback = sub_8098090;
+ REG_MOSAIC = (gPokemonStorageSystemPtr->unk_2700->data[0] << 12) | (gPokemonStorageSystemPtr->unk_2700->data[0] << 8);
+ }
+}
+
+void sub_8098090(struct Sprite *sprite)
+{
+ sprite->data[0] -= sprite->data[1];
+ if (sprite->data[0] < 0)
+ sprite->data[0] = 0;
+ REG_MOSAIC = (sprite->data[0] << 12) | (sprite->data[0] << 8);
+ if (sprite->data[0] == 0)
+ {
+ sprite->oam.mosaic = FALSE;
+ sprite->callback = SpriteCallbackDummy;
+ }
+}
+
+// sub_80980D4
+
+const struct OamData gOamData_83B6EAC;
+
+#ifdef NONMATCHING
+void sub_80980D4(void)
+{
+ u16 i;
+ u16 tileStart;
+ u8 palSlot;
+ u8 spriteId;
+ struct SpriteSheet sheet = {gPokemonStorageSystemPtr->unk_2784, 0x800, 0x0002};
+ struct SpritePalette palette = {gPokemonStorageSystemPtr->unk_2704, 0xdac7};
+ struct SpriteTemplate template = {
+ 0x0002, 0xdac7, &gOamData_83B6EAC, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+ };
+
+ for (i = 0; i < 0x800; i++)
+ gPokemonStorageSystemPtr->unk_2784[i] = 0;
+ for (i = 0; i < 0x10; i++)
+ gPokemonStorageSystemPtr->unk_2704[i] = 0;
+
+ gPokemonStorageSystemPtr->unk_2700 = NULL;
+ if ((tileStart = LoadSpriteSheet(&sheet)) != 0
+ && (palSlot = LoadSpritePalette(&palette)) != 0xff
+ && (spriteId = CreateSprite(&template, 0x28, 0x30, 0)) != MAX_SPRITES)
+ {
+ // FIXME this gets compiled as a separate block between the palSlot check and the spriteId check
+ gPokemonStorageSystemPtr->unk_2700 = gSprites + spriteId;
+ gPokemonStorageSystemPtr->unk_26fa = palSlot * 16 + 0x100;
+ gPokemonStorageSystemPtr->unk_26fc = BG_CHAR_ADDR(4) + tileStart * 32;
+ }
+
+ if (gPokemonStorageSystemPtr->unk_2700 == NULL)
+ {
+ FreeSpriteTilesByTag(0x0002);
+ FreeSpritePaletteByTag(0xdac7);
+ }
+}
+#else
+
+const struct SpriteSheet gUnknown_083B6DCC = {ePokemonStorageSystem.unk_2784, 0x800, 0x0002};
+const struct SpritePalette gUnknown_083B6DD4 = {ePokemonStorageSystem.unk_2704, 0xdac7};
+const struct SpriteTemplate gSpriteTemplate_83B6DDC = {
+ 0x0002, 0xdac7, &gOamData_83B6EAC, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
+};
+
+__attribute__((naked)) void sub_80980D4(void)
+{
+ asm_unified("\tpush {r4,r5,lr}\n"
+ "\tsub sp, 0x28\n"
+ "\tldr r0, _08098150 @ =gUnknown_083B6DCC\n"
+ "\tldr r1, [r0, 0x4]\n"
+ "\tldr r0, [r0]\n"
+ "\tstr r0, [sp, 0x18]\n"
+ "\tstr r1, [sp, 0x1C]\n"
+ "\tldr r0, _08098154 @ =gUnknown_083B6DD4\n"
+ "\tldr r1, [r0, 0x4]\n"
+ "\tldr r0, [r0]\n"
+ "\tstr r0, [sp, 0x20]\n"
+ "\tstr r1, [sp, 0x24]\n"
+ "\tmov r1, sp\n"
+ "\tldr r0, _08098158 @ =gSpriteTemplate_83B6DDC\n"
+ "\tldm r0!, {r2-r4}\n"
+ "\tstm r1!, {r2-r4}\n"
+ "\tldm r0!, {r2-r4}\n"
+ "\tstm r1!, {r2-r4}\n"
+ "\tmovs r1, 0\n"
+ "\tadd r5, sp, 0x18\n"
+ "\tldr r4, _0809815C @ =gSharedMem + 0x2784\n"
+ "\tmovs r3, 0\n"
+ "\tldr r2, _08098160 @ =0x000007ff\n"
+ "_08098102:\n"
+ "\tadds r0, r1, r4\n"
+ "\tstrb r3, [r0]\n"
+ "\tadds r0, r1, 0x1\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r1, r0, 16\n"
+ "\tcmp r1, r2\n"
+ "\tbls _08098102\n"
+ "\tmovs r1, 0\n"
+ "\tldr r3, _08098164 @ =gSharedMem + 0x2704\n"
+ "\tmovs r2, 0\n"
+ "_08098116:\n"
+ "\tlsls r0, r1, 1\n"
+ "\tadds r0, r3\n"
+ "\tstrh r2, [r0]\n"
+ "\tadds r0, r1, 0x1\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r1, r0, 16\n"
+ "\tcmp r1, 0xF\n"
+ "\tbls _08098116\n"
+ "\tldr r0, _08098168 @ =gSharedMem\n"
+ "\tmovs r1, 0x9C\n"
+ "\tlsls r1, 6\n"
+ "\tadds r0, r1\n"
+ "\tmovs r1, 0\n"
+ "\tstr r1, [r0]\n"
+ "\tadds r0, r5, 0\n"
+ "\tbl LoadSpriteSheet\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r5, r0, 16\n"
+ "\tcmp r5, 0\n"
+ "\tbeq _080981C4\n"
+ "\tadd r0, sp, 0x20\n"
+ "\tbl LoadSpritePalette\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r4, r0, 24\n"
+ "\tcmp r4, 0xFF\n"
+ "\tbeq _080981C4\n"
+ "\tb _080981B0\n"
+ "\t.align 2, 0\n"
+ "_08098150: .4byte gUnknown_083B6DCC\n"
+ "_08098154: .4byte gUnknown_083B6DD4\n"
+ "_08098158: .4byte gSpriteTemplate_83B6DDC\n"
+ "_0809815C: .4byte gSharedMem + 0x2784\n"
+ "_08098160: .4byte 0x000007ff\n"
+ "_08098164: .4byte gSharedMem + 0x2704\n"
+ "_08098168: .4byte gSharedMem\n"
+ "_0809816C:\n"
+ "\tldr r2, _0809819C @ =gSharedMem\n"
+ "\tmovs r0, 0x9C\n"
+ "\tlsls r0, 6\n"
+ "\tadds r3, r2, r0\n"
+ "\tlsls r0, r1, 4\n"
+ "\tadds r0, r1\n"
+ "\tlsls r0, 2\n"
+ "\tldr r1, _080981A0 @ =gSprites\n"
+ "\tadds r0, r1\n"
+ "\tstr r0, [r3]\n"
+ "\tlsls r0, r4, 4\n"
+ "\tmovs r1, 0x80\n"
+ "\tlsls r1, 1\n"
+ "\tadds r0, r1\n"
+ "\tldr r3, _080981A4 @ =0x000026fa\n"
+ "\tadds r1, r2, r3\n"
+ "\tstrh r0, [r1]\n"
+ "\tldr r4, _080981A8 @ =0x000026fc\n"
+ "\tadds r2, r4\n"
+ "\tlsls r0, r5, 5\n"
+ "\tldr r1, _080981AC @ =0x06010000\n"
+ "\tadds r0, r1\n"
+ "\tstr r0, [r2]\n"
+ "\tb _080981C4\n"
+ "\t.align 2, 0\n"
+ "_0809819C: .4byte gSharedMem\n"
+ "_080981A0: .4byte gSprites\n"
+ "_080981A4: .4byte 0x000026fa\n"
+ "_080981A8: .4byte 0x000026fc\n"
+ "_080981AC: .4byte 0x06010000\n"
+ "_080981B0:\n"
+ "\tmov r0, sp\n"
+ "\tmovs r1, 0x28\n"
+ "\tmovs r2, 0x30\n"
+ "\tmovs r3, 0\n"
+ "\tbl CreateSprite\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r1, r0, 24\n"
+ "\tcmp r1, 0x40\n"
+ "\tbne _0809816C\n"
+ "_080981C4:\n"
+ "\tldr r0, _080981E8 @ =gSharedMem\n"
+ "\tmovs r2, 0x9C\n"
+ "\tlsls r2, 6\n"
+ "\tadds r0, r2\n"
+ "\tldr r0, [r0]\n"
+ "\tcmp r0, 0\n"
+ "\tbne _080981DE\n"
+ "\tmovs r0, 0x2\n"
+ "\tbl FreeSpriteTilesByTag\n"
+ "\tldr r0, _080981EC @ =0x0000dac7\n"
+ "\tbl FreeSpritePaletteByTag\n"
+ "_080981DE:\n"
+ "\tadd sp, 0x28\n"
+ "\tpop {r4,r5}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.align 2, 0\n"
+ "_080981E8: .4byte gSharedMem\n"
+ "_080981EC: .4byte 0x0000dac7");
+}
+#endif
+
+void sub_80981F0(u16 species, u32 pid)
+{
+ if (gPokemonStorageSystemPtr->unk_2700)
+ {
+ if (species != SPECIES_NONE)
+ {
+ HandleLoadSpecialPokePic(gMonFrontPicTable + species, gMonFrontPicCoords[species].coords, 1, (intptr_t)gPokemonStorageSystemPtr->unk_4784, gPokemonStorageSystemPtr->unk_2784, species, pid);
+ LZ77UnCompWram(gPokemonStorageSystemPtr->unk_11e8, gPokemonStorageSystemPtr->unk_2704);
+ CpuCopy32(gPokemonStorageSystemPtr->unk_2784, gPokemonStorageSystemPtr->unk_26fc, 0x800);
+ LoadPalette(gPokemonStorageSystemPtr->unk_2704, gPokemonStorageSystemPtr->unk_26fa, 0x20);
+ gPokemonStorageSystemPtr->unk_2700->invisible = FALSE;
+ }
+ else
+ {
+ gPokemonStorageSystemPtr->unk_2700->invisible = TRUE;
+ }
+ }
+}
+
+void sub_80982B4(void)
+{
+ if (gPokemonStorageSystemPtr->unk_11f0)
+ {
+ sub_80F7A10(gPokemonStorageSystemPtr->unk_11f7, gPokemonStorageSystemPtr->unk_12b8);
+ gPokemonStorageSystemPtr->unk_12ac->invisible = FALSE;
+ }
+ else
+ {
+ gPokemonStorageSystemPtr->unk_12ac->invisible = TRUE;
+ }
+ Menu_EraseWindowRect(0, 11, 9, 17);
+ Menu_PrintText(gPokemonStorageSystemPtr->unk_127a, 1, 16);
+ Menu_PrintText(gPokemonStorageSystemPtr->unk_120f, 1, 11);
+ Menu_PrintText(gPokemonStorageSystemPtr->unk_1234, 0, 13);
+ Menu_PrintText(gPokemonStorageSystemPtr->unk_1259, 1, 15);
+}
+
+void sub_8098350(void)
+{
+ u16 i;
+
+ if (gPokemonStorageSystemPtr->unk_11f0)
+ {
+ sub_809D034(BG_SCREEN_ADDR(15), 1, 0, gUnknown_02039760, 1, 0, 8, 2);
+ for (i = 0; i < 2; i++)
+ StartSpriteAnimIfDifferent(gPokemonStorageSystemPtr->unk_12b0[i], i * 2 + 1);
+ }
+ else
+ {
+ sub_809D034(BG_SCREEN_ADDR(15), 1, 0, gUnknown_02039760, 10, 0, 8, 2);
+ for (i = 0; i < 2; i++)
+ StartSpriteAnim(gPokemonStorageSystemPtr->unk_12b0[i], i * 2);
+ }
+}
+
+void sub_8098400(void)
+{
+ REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(15);
+ LZ77UnCompVram(gPSSMenuMisc_Gfx, BG_SCREEN_ADDR(13));
+ LZ77UnCompWram(gPSSMenuMisc_Tilemap, gPokemonStorageSystemPtr->unk_00a8);
+ LoadPalette(gPSSMenu3_Pal, 0x20, 0x20);
+ LoadPalette(gPSSMenu4_Pal, 0x30, 0x20);
+ DmaClear16(3, BG_SCREEN_ADDR(15), 0x800);
+ sub_8098780();
+ if (gUnknown_0203847C)
+ {
+ sub_8098690(TRUE);
+ sub_8099200(TRUE);
+ sub_809D034(BG_SCREEN_ADDR(15), 10, 0, gPokemonStorageSystemPtr->unk_00a8, 0, 0, 12, 22);
+ }
+ else
+ {
+ sub_809D034(BG_SCREEN_ADDR(15), 10, 0, gPokemonStorageSystemPtr->unk_00a8, 0, 20, 12, 2);
+ sub_8098690(TRUE);
+ }
+ gPokemonStorageSystemPtr->unk_08af = 0;
+}
+
+void sub_80984E8(void)
+{
+ gPokemonStorageSystemPtr->unk_08a8 = 20;
+ gPokemonStorageSystemPtr->unk_08aa = 2;
+ gPokemonStorageSystemPtr->unk_08ad = 0;
+ sub_8099200(FALSE);
+}
+
+bool8 sub_8098520(void)
+{
+ if (gPokemonStorageSystemPtr->unk_08ad == 20)
+ return FALSE;
+ gPokemonStorageSystemPtr->unk_08a8--;
+ gPokemonStorageSystemPtr->unk_08aa++;
+ sub_809D034(BG_SCREEN_ADDR(15), 10, 0, gPokemonStorageSystemPtr->unk_00a8, 0, gPokemonStorageSystemPtr->unk_08a8, 12, gPokemonStorageSystemPtr->unk_08aa);
+ sub_80994A8(8);
+ if (++gPokemonStorageSystemPtr->unk_08ad == 20)
+ {
+ gUnknown_0203847C = 1;
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void add_to_c3_somehow(void)
+{
+ gPokemonStorageSystemPtr->unk_08a8 = 0;
+ gPokemonStorageSystemPtr->unk_08aa = 22;
+ gPokemonStorageSystemPtr->unk_08ad = 0;
+}
+
+bool8 sub_80985CC(void)
+{
+ if (gPokemonStorageSystemPtr->unk_08ad == 20)
+ return FALSE;
+ gPokemonStorageSystemPtr->unk_08a8++;
+ gPokemonStorageSystemPtr->unk_08aa--;
+ sub_809D034(BG_SCREEN_ADDR(15), 10, 0, gPokemonStorageSystemPtr->unk_00a8, 0, gPokemonStorageSystemPtr->unk_08a8, 12, gPokemonStorageSystemPtr->unk_08aa);
+ sub_809D16C(BG_SCREEN_ADDR(15), 10, gPokemonStorageSystemPtr->unk_08aa, 12, 1);
+ sub_80994A8(-8);
+ if (++gPokemonStorageSystemPtr->unk_08ad == 20)
+ {
+ gUnknown_0203847C = 0;
+ sub_809954C();
+ party_compaction();
+ sub_809D034(BG_SCREEN_ADDR(15), 21, 0, gPokemonStorageSystemPtr->unk_00a8, 12, 0, 1, 2);
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void sub_8098690(bool8 flag)
+{
+ if (flag)
+ sub_809D034(BG_SCREEN_ADDR(15), 21, 0, gPokemonStorageSystemPtr->unk_00a8, 12, 0, 9, 2);
+ else
+ sub_809D034(BG_SCREEN_ADDR(15), 21, 0, gPokemonStorageSystemPtr->unk_00a8, 12, 2, 9, 2);
+}
+
+void sub_80986E8(void)
+{
+ gPokemonStorageSystemPtr->unk_08af = 1;
+ gPokemonStorageSystemPtr->unk_08b0 = 30;
+ gPokemonStorageSystemPtr->unk_08b1 = 1;
+}
+
+void sub_8098710(void)
+{
+ if (gPokemonStorageSystemPtr->unk_08af)
+ {
+ gPokemonStorageSystemPtr->unk_08af = 0;
+ sub_8098690(TRUE);
+ }
+}
+
+void sub_8098734(void)
+{
+ if (gPokemonStorageSystemPtr->unk_08af && ++gPokemonStorageSystemPtr->unk_08b0 > 30)
+ {
+ gPokemonStorageSystemPtr->unk_08b0 = 0;
+ gPokemonStorageSystemPtr->unk_08b1 = gPokemonStorageSystemPtr->unk_08b1 ? FALSE : TRUE;
+ sub_8098690(gPokemonStorageSystemPtr->unk_08b1);
+ }
+}
+
+void sub_8098780(void)
+{
+ int i;
+
+ for (i = 1; i < PARTY_SIZE; i++)
+ {
+ u16 r1;
+ bool32 r0 = GetMonData(gPlayerParty + i, MON_DATA_SPECIES);
+ if (r0)
+ r0 = TRUE;
+ r1 = r0 ? 12 : 16;
+ sub_809D104(gPokemonStorageSystemPtr->unk_00a8, 7, (i - 1) * 3 + 1, gPokemonStorageSystemPtr->unk_00a8, r1, 4, 4, 3);
+ }
+}
+
+void sub_80987DC(void)
+{
+ sub_8098780();
+ sub_809D034(BG_SCREEN_ADDR(15), 10, 0, gPokemonStorageSystemPtr->unk_00a8, 0, 0, 12, 22);
+}
+
+void sub_809880C(void)
+{
+ gPokemonStorageSystemPtr->unk_08ae = 0;
+ PlaySE(SE_WIN_OPEN);
+ sub_80984E8();
+}
+
+bool8 sub_8098830(void)
+{
+ switch (gPokemonStorageSystemPtr->unk_08ae)
+ {
+ case 0:
+ if (!sub_8098520())
+ {
+ sub_809B068();
+ gPokemonStorageSystemPtr->unk_08ae++;
+ }
+ break;
+ case 1:
+ if (!sub_809AC00())
+ {
+ if (gPokemonStorageSystemPtr->unk_11f6)
+ BoxSetMosaic();
+ gPokemonStorageSystemPtr->unk_08ae++;
+ }
+ break;
+ case 2:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+const struct StorageAction gPCStorageActionTexts[] =
+{
+ {PCText_ExitBox, 0},
+ {PCText_WhatYouDo, 0},
+ {PCText_PickATheme, 0},
+ {PCText_PickAWallpaper, 0},
+ {PCText_IsSelected, 1},
+ {PCText_JumpToWhichBox, 0},
+ {PCText_DepositInWhichBox, 0},
+ {PCText_WasDeposited, 1},
+ {PCText_BoxIsFull, 0},
+ {PCText_ReleasePoke, 0},
+ {PCText_WasReleased, 4},
+ {PCText_ByeBye, 6},
+ {PCText_MarkPoke, 0},
+ {PCText_LastPoke, 0},
+ {PCText_PartyFull, 0},
+ {PCText_HoldingPoke, 0},
+ {PCText_WhichOneWillTake, 0},
+ {PCText_CantReleaseEgg, 0},
+ {PCText_ContinueBox, 0},
+ {PCText_CameBack, 1},
+ {PCText_Worried, 0},
+ {PCText_Surprise, 0},
+ {PCText_PleaseRemoveMail, 0}
+};
+
+void PrintStorageActionText(u8 index)
+{
+ u8 *ptr;
+
+ Menu_DrawStdWindowFrame(10, 16, 29, 19);
+
+ switch (gPCStorageActionTexts[index].format)
+ {
+ case PC_TEXT_FMT_UNK_02:
+ ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text);
+ ptr = StringCopy(ptr, gPokemonStorageSystemPtr->unk_11fa);
+ break;
+ case PC_TEXT_FMT_UNK_05:
+ ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text);
+ ptr = StringCopy(ptr, gPokemonStorageSystemPtr->unk_26e4);
+ break;
+ case PC_TEXT_FMT_MON_NAME:
+ // {var} + " is selected."
+ ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPokemonStorageSystemPtr->unk_11fa);
+ ptr = StringCopy(ptr, gPCStorageActionTexts[index].text);
+ break;
+ case PC_TEXT_FMT_MON_NAME_2:
+ // {var} + " was released."
+ ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPokemonStorageSystemPtr->unk_26e4);
+#if ENGLISH
+ ptr = StringCopy(ptr, gPCStorageActionTexts[index].text);
+#elif GERMAN
+ ptr = de_sub_8073174(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text);
+#endif
+ break;
+ case PC_TEXT_FMT_UNK_03:
+ {
+ const u8 *stringLength;
+ const u8 *text;
+
+ text = gPCStorageActionTexts[index].text;
+ stringLength = &text[StringLength(text)] + 1;
+
+ ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text);
+ ptr = StringCopy(ptr, gPokemonStorageSystemPtr->unk_11fa);
+ ptr = StringCopy(ptr, stringLength);
+ }
+ break;
+ case PC_TEXT_FMT_MON_NAME_AFTER_EXCL_MARK:
+ {
+ const u8 *stringLength;
+ const u8 *text;
+
+ text = gPCStorageActionTexts[index].text;
+ stringLength = &text[StringLength(text)] - 1;
+
+ ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text);
+ ptr = StringCopy(ptr - 1, gPokemonStorageSystemPtr->unk_26e4);
+ ptr = StringCopy(ptr, stringLength);
+ }
+ break;
+ case PC_TEXT_FMT_NORMAL:
+ default:
+ ptr = StringCopy(gPokemonStorageSystemPtr->unk_2694, gPCStorageActionTexts[index].text);
+ break;
+ }
+
+ while (ptr < gPokemonStorageSystemPtr->unk_26a6)
+ {
+ ptr[0] = CHAR_SPACE;
+ ptr++;
+ }
+
+ ptr[0] = EOS;
+ Menu_PrintText(gPokemonStorageSystemPtr->unk_2694, 11, 17);
+}
+
+const struct OamData gOamData_83B6EAC = {
+ .size = 3
+};
+
+const struct OamData gOamData_83B6EB4 = {
+ .shape = ST_OAM_H_RECTANGLE
+};
+
+const union AnimCmd gSpriteAnim_83B6EBC[] = {
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END
+};
+
+const union AnimCmd gSpriteAnim_83B6EC4[] = {
+ ANIMCMD_FRAME(2, 8),
+ ANIMCMD_FRAME(4, 8),
+ ANIMCMD_FRAME(6, 8),
+ ANIMCMD_JUMP(0)
+};
+
+const union AnimCmd gSpriteAnim_83B6ED4[] = {
+ ANIMCMD_FRAME(8, 5),
+ ANIMCMD_END
+};
+
+const union AnimCmd gSpriteAnim_83B6EDC[] = {
+ ANIMCMD_FRAME(10, 8),
+ ANIMCMD_FRAME( 4, 8),
+ ANIMCMD_FRAME(12, 8),
+ ANIMCMD_JUMP(0)
+};
+
+const union AnimCmd *const gSpriteAnimTable_83B6EEC[] = {
+ gSpriteAnim_83B6EBC,
+ gSpriteAnim_83B6EC4,
+ gSpriteAnim_83B6ED4,
+ gSpriteAnim_83B6EDC
+};
+
+const struct SpriteTemplate gSpriteTemplate_83B6EFC = {
+ 0x0005,
+ 0xdacd,
+ &gOamData_83B6EB4,
+ gSpriteAnimTable_83B6EEC,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ SpriteCallbackDummy
+};
+
+void sub_8098A38(s8 a0)
+{
+ DisplayYesNoMenu(23, 10, 0);
+ Menu_MoveCursor(a0);
+}
+
+void sub_8098A5C(void)
+{
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(10, 16, 29, 19);
+ Menu_EraseWindowRect(23, 10, 29, 15);
+}
+
+void sub_8098A80(void)
+{
+ sub_809CDCC();
+ sub_809CDEC(12);
+ sub_809CDEC(13);
+ sub_809CDEC(14);
+ sub_809CDEC(15);
+ sub_809CE84();
+}
+
+void sub_8098AA8(u8 a0)
+{
+ sub_809CDCC();
+ switch (a0)
+ {
+ case 0:
+ sub_809CDEC(16);
+ sub_809CDEC(17);
+ sub_809CDEC(18);
+ sub_809CDEC(19);
+ break;
+ case 1:
+ sub_809CDEC(20);
+ sub_809CDEC(21);
+ sub_809CDEC(22);
+ sub_809CDEC(23);
+ break;
+ case 2:
+ sub_809CDEC(24);
+ sub_809CDEC(25);
+ sub_809CDEC(26);
+ sub_809CDEC(27);
+ break;
+ case 3:
+ sub_809CDEC(28);
+ sub_809CDEC(29);
+ sub_809CDEC(30);
+ sub_809CDEC(31);
+ break;
+ }
+ sub_809CE84();
+}
diff --git a/src/pokemon_storage_system_3.c b/src/pokemon_storage_system_3.c
new file mode 100644
index 000000000..da26c6fc5
--- /dev/null
+++ b/src/pokemon_storage_system_3.c
@@ -0,0 +1,655 @@
+
+// Includes
+#include "global.h"
+#include "constants/species.h"
+#include "sprite.h"
+#include "trig.h"
+#include "pokemon_icon.h"
+#include "pokemon_storage_system.h"
+
+// Static type declarations
+
+// Static RAM declarations
+
+// Static ROM declarations
+
+static void sub_8098E68(struct Sprite *sprite);
+static void sub_8099388(struct Sprite *sprite, u16 a1);
+static void sub_80993F4(struct Sprite *sprite);
+static void sub_80999C4(struct Sprite *sprite);
+static struct Sprite *PSS_SpawnMonIconSprite(u16 species, u32 personality, s16 x, s16 y, u8 priority, u8 subpriority);
+static void PSS_DestroyMonIconSprite(struct Sprite *sprite);
+
+// .rodata
+
+const struct OamData gOamData_83B6F2C;
+
+// .text
+
+u8 get_preferred_box(void)
+{
+ return gPokemonStorage.currentBox;
+}
+
+void ResetPSSMonIconSprites(void)
+{
+ u16 i;
+
+ sub_809D51C();
+ for (i = 0; i < 40; i++)
+ gPokemonStorageSystemPtr->unk_10d0[i] = 0;
+ for (i = 0; i < 40; i++)
+ gPokemonStorageSystemPtr->unk_1120[i] = 0;
+ for (i = 0; i < 6; i++)
+ gPokemonStorageSystemPtr->unk_1038[i] = NULL;
+ for (i = 0; i < 30; i++)
+ gPokemonStorageSystemPtr->unk_1050[i] = NULL;
+ gPokemonStorageSystemPtr->unk_1034 = NULL;
+ gPokemonStorageSystemPtr->unk_0d5c = 0;
+}
+
+void sub_8098BF0(void)
+{
+ u32 personality = GetMonData(&gPokemonStorageSystemPtr->unk_25b4, MON_DATA_PERSONALITY);
+ gPokemonStorageSystemPtr->unk_1034 = PSS_SpawnMonIconSprite(GetMonData(&gPokemonStorageSystemPtr->unk_25b4, MON_DATA_SPECIES2), personality, 0, 0, 1, 7);
+ gPokemonStorageSystemPtr->unk_1034->callback = sub_80999C4;
+}
+
+void SpawnBoxIconSprites(u8 boxId)
+{
+ struct BoxPokemon *box = gPokemonStorage.boxes[boxId];
+ u16 i;
+ u16 k = 0;
+ for (i = 0; i < 5; i++)
+ {
+ u16 j;
+ for (j = 0; j < 6; j++)
+ {
+ u16 species = GetBoxMonData(box, MON_DATA_SPECIES2);
+ if (species != SPECIES_NONE)
+ gPokemonStorageSystemPtr->unk_1050[k] = PSS_SpawnMonIconSprite(species, GetBoxMonData(box, MON_DATA_PERSONALITY), 24 * j + 0x64, 24 * i + 0x2c, 2, 18 - j);
+ else
+ gPokemonStorageSystemPtr->unk_1050[k] = NULL;
+ box++;
+ k++;
+ }
+ }
+}
+
+void sub_8098D20(u8 monId)
+{
+ struct BoxPokemon *mon = gPokemonStorage.boxes[get_preferred_box()] + monId;
+ u16 species = GetBoxMonData(mon, MON_DATA_SPECIES2);
+ if (species != SPECIES_NONE)
+ {
+ s16 x = 24 * (monId % 6) + 0x64;
+ s16 y = 24 * (monId / 6) + 0x2c;
+ gPokemonStorageSystemPtr->unk_1050[monId] = PSS_SpawnMonIconSprite(species, GetBoxMonData(mon, MON_DATA_PERSONALITY), x, y, 2, 18 - (monId % 6));
+ }
+}
+
+static void sub_8098DE0(s16 a0)
+{
+ u16 monId;
+ for (monId = 0; monId < 30; monId++)
+ {
+ if (gPokemonStorageSystemPtr->unk_1050[monId])
+ {
+ gPokemonStorageSystemPtr->unk_1050[monId]->data[2] = a0;
+ gPokemonStorageSystemPtr->unk_1050[monId]->data[4] = 1;
+ gPokemonStorageSystemPtr->unk_1050[monId]->callback = sub_8098E68;
+ }
+ }
+}
+
+static void sub_8098E24(struct Sprite *sprite)
+{
+ if (sprite->data[1] != 0)
+ {
+ sprite->data[1]--;
+ sprite->pos1.x += sprite->data[2];
+ }
+ else
+ {
+ gPokemonStorageSystemPtr->unk_1178--;
+ sprite->pos1.x = sprite->data[3];
+ sprite->callback = SpriteCallbackDummy;
+ }
+}
+
+static void sub_8098E68(struct Sprite *sprite)
+{
+ if (sprite->data[4] != 0)
+ {
+ sprite->data[4]--;
+ }
+ else
+ {
+ sprite->pos1.x += sprite->data[2];
+ sprite->data[5] = sprite->pos1.x + sprite->pos2.x;
+ if (sprite->data[5] < 0x45 || sprite->data[5] > 0xfb)
+ sprite->callback = SpriteCallbackDummy;
+ }
+}
+
+static void sub_8098EA0(u8 col)
+{
+ u16 i;
+
+ for (i = 0; i < 5; i++)
+ {
+ if (gPokemonStorageSystemPtr->unk_1050[col])
+ {
+ PSS_DestroyMonIconSprite(gPokemonStorageSystemPtr->unk_1050[col]);
+ gPokemonStorageSystemPtr->unk_1050[col] = NULL;
+ }
+ col += 6;
+ }
+}
+
+static u8 sub_8098EE0(u8 col, u16 a1, s16 a2)
+{
+ u16 i;
+ u16 x;
+ u16 y;
+ u8 count;
+ u8 x1;
+ u16 curX;
+
+ y = 0x2c;
+ x = 24 * col + 0x64;
+ curX = x - (a1 + 1) * a2;
+ x1 = 18 - col;
+ count = 0;
+
+ for (i = 0; i < 5; i++)
+ {
+ u16 species = GetBoxMonData(gPokemonStorage.boxes[gPokemonStorageSystemPtr->unk_117d] + col, MON_DATA_SPECIES2);
+ if (species != SPECIES_NONE)
+ {
+ gPokemonStorageSystemPtr->unk_1050[col] = PSS_SpawnMonIconSprite(species, GetBoxMonData(gPokemonStorage.boxes[gPokemonStorageSystemPtr->unk_117d] + col, MON_DATA_PERSONALITY), curX, y, 2, x1);
+ if (gPokemonStorageSystemPtr->unk_1050[col])
+ {
+ gPokemonStorageSystemPtr->unk_1050[col]->data[1] = a1;
+ gPokemonStorageSystemPtr->unk_1050[col]->data[2] = a2;
+ gPokemonStorageSystemPtr->unk_1050[col]->data[3] = x;
+ gPokemonStorageSystemPtr->unk_1050[col]->callback = sub_8098E24;
+ count++;
+ }
+ }
+ col += 6;
+ y += 24;
+ }
+ return count;
+}
+
+void sub_809900C(u8 a0, s8 a1)
+{
+ gPokemonStorageSystemPtr->unk_117c = 0;
+ gPokemonStorageSystemPtr->unk_117d = a0;
+ gPokemonStorageSystemPtr->unk_117b = a1;
+ gPokemonStorageSystemPtr->unk_1172 = 32;
+ gPokemonStorageSystemPtr->unk_1176 = -6 * a1;
+ gPokemonStorageSystemPtr->unk_1178 = 0;
+ if (a1 > 0)
+ gPokemonStorageSystemPtr->unk_117a = 0;
+ else
+ gPokemonStorageSystemPtr->unk_117a = 5;
+ gPokemonStorageSystemPtr->unk_1174 = 24 * gPokemonStorageSystemPtr->unk_117a + 0x64;
+ sub_8098DE0(gPokemonStorageSystemPtr->unk_1176);
+}
+
+bool8 sub_80990AC(void)
+{
+ if (gPokemonStorageSystemPtr->unk_1172)
+ gPokemonStorageSystemPtr->unk_1172--;
+ switch (gPokemonStorageSystemPtr->unk_117c)
+ {
+ case 0:
+ gPokemonStorageSystemPtr->unk_1174 += gPokemonStorageSystemPtr->unk_1176;
+ if (gPokemonStorageSystemPtr->unk_1174 < 0x41 || gPokemonStorageSystemPtr->unk_1174 > 0xfb)
+ {
+ sub_8098EA0(gPokemonStorageSystemPtr->unk_117a);
+ gPokemonStorageSystemPtr->unk_1174 += 24 * gPokemonStorageSystemPtr->unk_117b;
+ gPokemonStorageSystemPtr->unk_117c++;
+ }
+ break;
+ case 1:
+ gPokemonStorageSystemPtr->unk_1174 += gPokemonStorageSystemPtr->unk_1176;
+ gPokemonStorageSystemPtr->unk_1178 += sub_8098EE0(gPokemonStorageSystemPtr->unk_117a, gPokemonStorageSystemPtr->unk_1172, gPokemonStorageSystemPtr->unk_1176);
+ if ((gPokemonStorageSystemPtr->unk_117b > 0 && gPokemonStorageSystemPtr->unk_117a == 5) || (gPokemonStorageSystemPtr->unk_117b < 0 && gPokemonStorageSystemPtr->unk_117a == 0))
+ {
+ gPokemonStorageSystemPtr->unk_117c++;
+ }
+ else
+ {
+ gPokemonStorageSystemPtr->unk_117a += gPokemonStorageSystemPtr->unk_117b;
+ gPokemonStorageSystemPtr->unk_117c = 0;
+ }
+ break;
+ case 2:
+ if (gPokemonStorageSystemPtr->unk_1178 == 0)
+ {
+ gPokemonStorageSystemPtr->unk_1172++;
+ return FALSE;
+ }
+ break;
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void sub_8099200(bool8 a0)
+{
+ u16 count;
+ u16 i;
+ u16 species = GetMonData(gPlayerParty + 0, MON_DATA_SPECIES2);
+ u32 personality = GetMonData(gPlayerParty + 0, MON_DATA_PERSONALITY);
+ gPokemonStorageSystemPtr->unk_1038[0] = PSS_SpawnMonIconSprite(species, personality, 0x68, 0x40, 1, 11);
+ count = 1;
+ for (i = 1; i < PARTY_SIZE; i++)
+ {
+ species = GetMonData(gPlayerParty + i, MON_DATA_SPECIES2);
+ if (species != SPECIES_NONE)
+ {
+ personality = GetMonData(gPlayerParty + i, MON_DATA_PERSONALITY);
+ gPokemonStorageSystemPtr->unk_1038[i] = PSS_SpawnMonIconSprite(species, personality, 0x98, (i - 1) * 24 + 0x10, 1, 11);
+ count++;
+ }
+ else
+ {
+ gPokemonStorageSystemPtr->unk_1038[i] = NULL;
+ }
+ }
+ if (!a0)
+ {
+ for (i = 0; i < count; i++)
+ {
+ // this routine assumes party_compaction has been called
+ gPokemonStorageSystemPtr->unk_1038[i]->pos1.y -= 0xa0;
+ gPokemonStorageSystemPtr->unk_1038[i]->invisible = TRUE;
+ }
+ }
+}
+
+void sub_8099310(void)
+{
+ u16 i;
+ u16 count;
+
+ gPokemonStorageSystemPtr->unk_1171 = 0;
+ for (i = 0, count = 0; i < PARTY_SIZE; i++)
+ {
+ if (gPokemonStorageSystemPtr->unk_1038[i])
+ {
+ if (i != count)
+ {
+ sub_8099388(gPokemonStorageSystemPtr->unk_1038[i], count);
+ gPokemonStorageSystemPtr->unk_1038[i] = NULL;
+ gPokemonStorageSystemPtr->unk_1171++;
+ }
+ count++;
+ }
+ }
+}
+
+u8 sub_8099374(void)
+{
+ return gPokemonStorageSystemPtr->unk_1171;
+}
+
+static void sub_8099388(struct Sprite *sprite, u16 a1)
+{
+ s16 r3;
+ s16 r4;
+
+ sprite->data[1] = a1;
+ if (a1 == 0)
+ {
+ r3 = 0x68;
+ r4 = 0x40;
+ }
+ else
+ {
+ r3 = 0x98;
+ r4 = 24 * (a1 - 1) + 0x10;
+ }
+ sprite->data[2] = sprite->pos1.x << 3;
+ sprite->data[3] = sprite->pos1.y << 3;
+ sprite->data[4] = (r3 * 8 - sprite->data[2]) / 8;
+ sprite->data[5] = (r4 * 8 - sprite->data[3]) / 8;
+ sprite->data[6] = 8;
+ sprite->callback = sub_80993F4;
+}
+
+static void sub_80993F4(struct Sprite *sprite)
+{
+ if (sprite->data[6])
+ {
+ sprite->data[2] += sprite->data[4];
+ sprite->data[3] += sprite->data[5];
+ sprite->pos1.x = sprite->data[2] >> 3;
+ sprite->pos1.y = sprite->data[3] >> 3;
+ sprite->data[6]--;
+ }
+ else
+ {
+ if (sprite->data[1] == 0)
+ {
+ sprite->pos1.x = 0x68;
+ sprite->pos1.y = 0x40;
+ }
+ else
+ {
+ sprite->pos1.x = 0x98;
+ sprite->pos1.y = (sprite->data[1] - 1) * 24 + 0x10;
+ }
+ sprite->callback = SpriteCallbackDummy;
+ gPokemonStorageSystemPtr->unk_1038[sprite->data[1]] = sprite;
+ gPokemonStorageSystemPtr->unk_1171--;
+ }
+}
+
+void sub_8099480(void)
+{
+ if (gPokemonStorageSystemPtr->unk_1034)
+ {
+ PSS_DestroyMonIconSprite(gPokemonStorageSystemPtr->unk_1034);
+ gPokemonStorageSystemPtr->unk_1034 = NULL;
+ }
+}
+
+void sub_80994A8(s16 y)
+{
+ u16 i;
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ if (gPokemonStorageSystemPtr->unk_1038[i])
+ {
+ s16 yy;
+ gPokemonStorageSystemPtr->unk_1038[i]->pos1.y += y;
+ yy = gPokemonStorageSystemPtr->unk_1038[i]->pos1.y + gPokemonStorageSystemPtr->unk_1038[i]->pos2.y + gPokemonStorageSystemPtr->unk_1038[i]->centerToCornerVecY;
+ if (yy < -0x10 || yy > 0xb0)
+ gPokemonStorageSystemPtr->unk_1038[i]->invisible = TRUE;
+ else
+ gPokemonStorageSystemPtr->unk_1038[i]->invisible = FALSE;
+ }
+ }
+}
+
+void sub_8099520(u8 a0)
+{
+ if (gPokemonStorageSystemPtr->unk_1038[a0])
+ {
+ PSS_DestroyMonIconSprite(gPokemonStorageSystemPtr->unk_1038[a0]);
+ gPokemonStorageSystemPtr->unk_1038[a0] = NULL;
+ }
+}
+
+void sub_809954C(void)
+{
+ u16 i;
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ if (gPokemonStorageSystemPtr->unk_1038[i])
+ {
+ PSS_DestroyMonIconSprite(gPokemonStorageSystemPtr->unk_1038[i]);
+ gPokemonStorageSystemPtr->unk_1038[i] = NULL;
+ }
+ }
+}
+
+void sub_8099584(u8 a0, u8 a1)
+{
+ if (a0 == 0)
+ {
+ gPokemonStorageSystemPtr->unk_1034 = gPokemonStorageSystemPtr->unk_1038[a1];
+ gPokemonStorageSystemPtr->unk_1038[a1] = NULL;
+ }
+ else if (a0 == 1)
+ {
+ gPokemonStorageSystemPtr->unk_1034 = gPokemonStorageSystemPtr->unk_1050[a1];
+ gPokemonStorageSystemPtr->unk_1050[a1] = NULL;
+ }
+ else
+ {
+ return;
+ }
+ gPokemonStorageSystemPtr->unk_1034->callback = sub_80999C4;
+ gPokemonStorageSystemPtr->unk_1034->oam.priority = 1;
+ gPokemonStorageSystemPtr->unk_1034->subpriority = 7;
+}
+
+void sub_809960C(u8 a0, u8 a1)
+{
+ if (a0 == 14)
+ {
+ gPokemonStorageSystemPtr->unk_1038[a1] = gPokemonStorageSystemPtr->unk_1034;
+ gPokemonStorageSystemPtr->unk_1038[a1]->oam.priority = 1;
+ gPokemonStorageSystemPtr->unk_1038[a1]->subpriority = 11;
+ }
+ else
+ {
+ gPokemonStorageSystemPtr->unk_1050[a1] = gPokemonStorageSystemPtr->unk_1034;
+ gPokemonStorageSystemPtr->unk_1050[a1]->oam.priority = 2;
+ gPokemonStorageSystemPtr->unk_1050[a1]->subpriority = 18 - (a1 % 6);
+ }
+ gPokemonStorageSystemPtr->unk_1034->callback = SpriteCallbackDummy;
+ gPokemonStorageSystemPtr->unk_1034 = NULL;
+}
+
+void sub_80996B0(u8 a0, u8 a1)
+{
+ if (a0 == 14)
+ gPokemonStorageSystemPtr->unk_10c8 = gPokemonStorageSystemPtr->unk_1038 + a1;
+ else
+ gPokemonStorageSystemPtr->unk_10c8 = gPokemonStorageSystemPtr->unk_1050 + a1;
+ gPokemonStorageSystemPtr->unk_1034->callback = SpriteCallbackDummy;
+ gPokemonStorageSystemPtr->unk_1170 = 0;
+}
+
+bool8 sub_809971C(void)
+{
+ if (gPokemonStorageSystemPtr->unk_1170 == 16)
+ return FALSE;
+ gPokemonStorageSystemPtr->unk_1170++;
+ if (gPokemonStorageSystemPtr->unk_1170 & 1)
+ {
+ (*gPokemonStorageSystemPtr->unk_10c8)->pos1.y--;
+ gPokemonStorageSystemPtr->unk_1034->pos1.y++;
+ }
+ (*gPokemonStorageSystemPtr->unk_10c8)->pos2.x = gSineTable[gPokemonStorageSystemPtr->unk_1170 * 8] / 16;
+ gPokemonStorageSystemPtr->unk_1034->pos2.x = -(gSineTable[gPokemonStorageSystemPtr->unk_1170 * 8] / 16);
+ if (gPokemonStorageSystemPtr->unk_1170 == 8)
+ {
+ gPokemonStorageSystemPtr->unk_1034->oam.priority = (*gPokemonStorageSystemPtr->unk_10c8)->oam.priority;
+ gPokemonStorageSystemPtr->unk_1034->subpriority = (*gPokemonStorageSystemPtr->unk_10c8)->subpriority;
+ (*gPokemonStorageSystemPtr->unk_10c8)->oam.priority = 1;
+ (*gPokemonStorageSystemPtr->unk_10c8)->subpriority = 7;
+ }
+ if (gPokemonStorageSystemPtr->unk_1170 == 16)
+ {
+ struct Sprite *sprite = gPokemonStorageSystemPtr->unk_1034;
+ gPokemonStorageSystemPtr->unk_1034 = *(gPokemonStorageSystemPtr->unk_10c8);
+ (*gPokemonStorageSystemPtr->unk_10c8) = sprite;
+ gPokemonStorageSystemPtr->unk_1034->callback = sub_80999C4;
+ (*gPokemonStorageSystemPtr->unk_10c8)->callback = SpriteCallbackDummy;
+ }
+ return TRUE;
+}
+
+const union AffineAnimCmd *const gSpriteAffineAnimTable_83B6F5C[];
+
+void sub_809981C(u8 mode, u8 idx)
+{
+ switch (mode)
+ {
+ case 0:
+ gPokemonStorageSystemPtr->unk_10cc = gPokemonStorageSystemPtr->unk_1038 + idx;
+ break;
+ case 1:
+ gPokemonStorageSystemPtr->unk_10cc = gPokemonStorageSystemPtr->unk_1050 + idx;
+ break;
+ case 2:
+ gPokemonStorageSystemPtr->unk_10cc = &gPokemonStorageSystemPtr->unk_1034;
+ break;
+ default:
+ return;
+ }
+ if (*gPokemonStorageSystemPtr->unk_10cc)
+ {
+ InitSpriteAffineAnim(*gPokemonStorageSystemPtr->unk_10cc);
+ (*gPokemonStorageSystemPtr->unk_10cc)->oam.affineMode = ST_OAM_AFFINE_NORMAL;
+ (*gPokemonStorageSystemPtr->unk_10cc)->affineAnims = gSpriteAffineAnimTable_83B6F5C;
+ StartSpriteAffineAnim(*gPokemonStorageSystemPtr->unk_10cc, 0);
+ }
+}
+
+bool8 sub_80998D8(void)
+{
+ if (*gPokemonStorageSystemPtr->unk_10cc == NULL || (*gPokemonStorageSystemPtr->unk_10cc)->invisible)
+ return FALSE;
+ if ((*gPokemonStorageSystemPtr->unk_10cc)->affineAnimEnded)
+ {
+ (*gPokemonStorageSystemPtr->unk_10cc)->invisible = TRUE;
+ }
+ return TRUE;
+}
+
+void sub_8099920(void)
+{
+ if (*gPokemonStorageSystemPtr->unk_10cc)
+ {
+ FreeOamMatrix((*gPokemonStorageSystemPtr->unk_10cc)->oam.matrixNum);
+ PSS_DestroyMonIconSprite(*gPokemonStorageSystemPtr->unk_10cc);
+ *gPokemonStorageSystemPtr->unk_10cc = NULL;
+ }
+}
+
+void sub_8099958(void)
+{
+ if (*gPokemonStorageSystemPtr->unk_10cc)
+ {
+ (*gPokemonStorageSystemPtr->unk_10cc)->invisible = FALSE;
+ StartSpriteAffineAnim(*gPokemonStorageSystemPtr->unk_10cc, 1);
+ }
+}
+
+bool8 sub_8099990(void)
+{
+ if (gPokemonStorageSystemPtr->unk_10cc == NULL)
+ return FALSE;
+ if ((*gPokemonStorageSystemPtr->unk_10cc)->affineAnimEnded)
+ gPokemonStorageSystemPtr->unk_10cc = NULL;
+ return TRUE;
+}
+
+static void sub_80999C4(struct Sprite *sprite)
+{
+ sprite->pos1.x = gPokemonStorageSystemPtr->unk_11c0->pos1.x;
+ sprite->pos1.y = gPokemonStorageSystemPtr->unk_11c0->pos1.y + gPokemonStorageSystemPtr->unk_11c0->pos2.y + 4;
+}
+
+static u16 PSS_LoadSpeciesIconGfx(u16 a0)
+{
+ u16 i;
+ u16 retval;
+
+ for (i = 0; i < 40; i++)
+ {
+ if (gPokemonStorageSystemPtr->unk_1120[i] == a0)
+ break;
+ }
+ if (i == 40)
+ {
+ for (i = 0; i < 40; i++)
+ {
+ if (gPokemonStorageSystemPtr->unk_1120[i] == 0)
+ break;
+ }
+ }
+ if (i != 40)
+ {
+ gPokemonStorageSystemPtr->unk_1120[i] = a0;
+ gPokemonStorageSystemPtr->unk_10d0[i]++;
+ retval = i * 16;
+ CpuCopy32(gMonIconTable[a0], BG_CHAR_ADDR(4) + 32 * retval, 0x200);
+ return retval;
+ }
+ return 0xFFFF;
+}
+
+static void PSS_ForgetSpeciesIcon(u16 a0)
+{
+ u16 i;
+
+ for (i = 0; i < 40; i++)
+ {
+ if (gPokemonStorageSystemPtr->unk_1120[i] == a0)
+ {
+ if (--gPokemonStorageSystemPtr->unk_10d0[i] == 0)
+ gPokemonStorageSystemPtr->unk_1120[i] = 0;
+ break;
+ }
+ }
+}
+
+static struct Sprite *PSS_SpawnMonIconSprite(u16 species, u32 personality, s16 x, s16 y, u8 priority, u8 subpriority)
+{
+ struct SpriteTemplate template = {
+ 0x000f,
+ 0xdac0,
+ &gOamData_83B6F2C,
+ gDummySpriteAnimTable,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ SpriteCallbackDummy
+ };
+ u16 tileNum;
+ u8 spriteId;
+
+ species = mon_icon_convert_unown_species_id(species, personality);
+ template.paletteTag = 0xdac0 + gMonIconPaletteIndices[species];
+ tileNum = PSS_LoadSpeciesIconGfx(species);
+ if (tileNum == 0xFFFF)
+ return NULL;
+ spriteId = CreateSprite(&template, x, y, subpriority);
+ if (spriteId == MAX_SPRITES)
+ {
+ PSS_ForgetSpeciesIcon(species);
+ return NULL;
+ }
+ gSprites[spriteId].oam.tileNum = tileNum;
+ gSprites[spriteId].oam.priority = priority;
+ gSprites[spriteId].data[0] = species;
+ return gSprites + spriteId;
+}
+
+static void PSS_DestroyMonIconSprite(struct Sprite *sprite)
+{
+ PSS_ForgetSpeciesIcon(sprite->data[0]);
+ DestroySprite(sprite);
+}
+
+const struct OamData gOamData_83B6F2C = {
+ .size = 2
+};
+
+const union AffineAnimCmd gSpriteAffineAnim_83B6F34[] = {
+ AFFINEANIMCMD_FRAME(-2, -2, 0, 120),
+ AFFINEANIMCMD_END
+};
+
+const union AffineAnimCmd gSpriteAffineAnim_83B6F44[] = {
+ AFFINEANIMCMD_FRAME(16, 16, 0, 0),
+ AFFINEANIMCMD_FRAME(16, 16, 0, 15),
+ AFFINEANIMCMD_END
+};
+
+const union AffineAnimCmd *const gSpriteAffineAnimTable_83B6F5C[] = {
+ gSpriteAffineAnim_83B6F34,
+ gSpriteAffineAnim_83B6F44
+};
diff --git a/src/pokemon_storage_system_4.c b/src/pokemon_storage_system_4.c
new file mode 100644
index 000000000..2f9f79a54
--- /dev/null
+++ b/src/pokemon_storage_system_4.c
@@ -0,0 +1,2849 @@
+
+// Includes
+#include "global.h"
+#include "ewram.h"
+#include "data2.h"
+#include "constants/moves.h"
+#include "constants/species.h"
+#include "palette.h"
+#include "string_util.h"
+#include "text.h"
+#include "menu.h"
+#include "item.h"
+#include "pokemon_summary_screen.h"
+#include "pokemon_storage_system.h"
+
+// Static type declarations
+
+struct WallpaperTable {
+ const u8 *tiles;
+ u32 size;
+ const u8 *tileMap;
+ const u16 *palettes;
+};
+
+// Static RAM declarations
+
+EWRAM_DATA struct Pokemon gUnknown_02038480 = {};
+#if DEBUG
+EWRAM_DATA u32 unk_2038790 = 0;
+EWRAM_DATA u32 unk_2038794 = 0;
+EWRAM_DATA u32 unk_2038798 = 0;
+#endif
+EWRAM_DATA s8 gUnknown_020384E4 = 0;
+EWRAM_DATA s8 gUnknown_020384E5 = 0;
+EWRAM_DATA bool8 gUnknown_020384E6 = FALSE;
+EWRAM_DATA u8 gUnknown_020384E7 = 0;
+EWRAM_DATA u8 gUnknown_020384E8 = 0;
+EWRAM_DATA u8 gUnknown_020384E9 = 0;
+EWRAM_DATA u8 gUnknown_020384EA = 0;
+
+// Static ROM declarations
+
+void sub_809900C(u8 boxId, s8 a1);
+s8 sub_8099D90(u8 boxId);
+void sub_8099EB0(u8 boxId, s8 a1);
+void sub_8099F58(u16 *vdest, const u16 *src, s8 a2, u8 a3);
+void sub_809A14C(u16 *vdest);
+void sub_809A23C(u8 boxId);
+void sub_809A3D0(u8 boxId, s8 a1);
+void sub_809A598(void);
+void sub_809A5E8(struct Sprite *sprite);
+void sub_809A61C(struct Sprite *sprite);
+void sub_809A654(void);
+s16 sub_809A6D0(u8 width);
+void sub_809A6DC(void);
+void sub_809A774(s8 a0);
+void sub_809A810(void);
+void sub_809AFB8(void);
+void sub_809A8C8(struct Sprite *sprite);
+bool8 sub_809B150(void);
+bool8 sub_809B1D8(void);
+bool8 sub_809B24C(void);
+bool8 sub_809B324(void);
+bool8 sub_809B358(void);
+void sub_809B384(void);
+void sub_809B3E0(void);
+void sub_809B44C(u8 a0, u8 a1);
+void diegohint2(u8 a0, u8 a1);
+void sub_809B548(u8 a0, u8 a1);
+void diegohint1(u8 a0, u8 a1);
+bool8 sub_809BF2C(void);
+void sub_809BF74(void);
+void sub_809C028(void);
+void sub_809C04C(void *pokemon, u8 a1);
+bool8 sub_809CAB0(void);
+void sub_809CC04(void);
+void sub_809CD88(void);
+s8 sub_809CE4C(u8 a0);
+
+// .rodata
+
+const u16 gWallpaperPalettes_Forest[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal");
+const u16 gWallpaperPalettes_Forest_2[] = INCBIN_U16("graphics/pokemon_storage/forest_frame.gbapal");
+const u16 gWallpaperPalettes_Forest_2_3[] = INCBIN_U16("graphics/pokemon_storage/forest_bg.gbapal");
+
+const u8 gWallpaperTiles_Forest[] = INCBIN_U8("graphics/pokemon_storage/forest.4bpp.lz");
+
+const u8 gWallpaperTilemap_Forest[] = INCBIN_U8("graphics/pokemon_storage/forest.bin.lz");
+
+const u16 gWallpaperPalettes_City[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal");
+const u16 gWallpaperPalettes_City_2[] = INCBIN_U16("graphics/pokemon_storage/city_frame.gbapal");
+const u16 gWallpaperPalettes_City_2_3[] = INCBIN_U16("graphics/pokemon_storage/city_bg.gbapal");
+
+const u8 gWallpaperTiles_City[] = INCBIN_U8("graphics/pokemon_storage/city.4bpp.lz");
+
+const u8 gWallpaperTilemap_City[] = INCBIN_U8("graphics/pokemon_storage/city.bin.lz");
+
+const u16 gWallpaperPalettes_Desert[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal");
+const u16 gWallpaperPalettes_Desert_2[] = INCBIN_U16("graphics/pokemon_storage/desert_frame.gbapal");
+const u16 gWallpaperPalettes_Desert_2_3[] = INCBIN_U16("graphics/pokemon_storage/desert_bg.gbapal");
+
+const u8 gWallpaperTiles_Desert[] = INCBIN_U8("graphics/pokemon_storage/desert.4bpp.lz");
+
+const u8 gWallpaperTilemap_Desert[] = INCBIN_U8("graphics/pokemon_storage/desert.bin.lz");
+
+const u16 gWallpaperPalettes_Savanna[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal");
+const u16 gWallpaperPalettes_Savanna_2[] = INCBIN_U16("graphics/pokemon_storage/savanna_frame.gbapal");
+const u16 gWallpaperPalettes_Savanna_2_3[] = INCBIN_U16("graphics/pokemon_storage/savanna_bg.gbapal");
+
+const u8 gWallpaperTiles_Savanna[] = INCBIN_U8("graphics/pokemon_storage/savanna.4bpp.lz");
+
+const u8 gWallpaperTilemap_Savanna[] = INCBIN_U8("graphics/pokemon_storage/savanna.bin.lz");
+
+const u16 gWallpaperPalettes_Crag[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal");
+const u16 gWallpaperPalettes_Crag_2[] = INCBIN_U16("graphics/pokemon_storage/crag_frame.gbapal");
+const u16 gWallpaperPalettes_Crag_2_3[] = INCBIN_U16("graphics/pokemon_storage/crag_bg.gbapal");
+
+const u8 gWallpaperTiles_Crag[] = INCBIN_U8("graphics/pokemon_storage/crag.4bpp.lz");
+
+const u8 gWallpaperTilemap_Crag[] = INCBIN_U8("graphics/pokemon_storage/crag.bin.lz");
+
+const u16 gWallpaperPalettes_Volcano[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal");
+const u16 gWallpaperPalettes_Volcano_2[] = INCBIN_U16("graphics/pokemon_storage/volcano_frame.gbapal");
+const u16 gWallpaperPalettes_Volcano_2_3[] = INCBIN_U16("graphics/pokemon_storage/volcano_bg.gbapal");
+
+const u8 gWallpaperTiles_Volcano[] = INCBIN_U8("graphics/pokemon_storage/volcano.4bpp.lz");
+const u32 filler_83b871c = 0; // needed to match but otherwise garbage
+
+const u8 gWallpaperTilemap_Volcano[] = INCBIN_U8("graphics/pokemon_storage/volcano.bin.lz");
+
+const u16 gWallpaperPalettes_Snow[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal");
+const u16 gWallpaperPalettes_Snow_2[] = INCBIN_U16("graphics/pokemon_storage/snow_frame.gbapal");
+const u16 gWallpaperPalettes_Snow_2_3[] = INCBIN_U16("graphics/pokemon_storage/snow_bg.gbapal");
+
+const u8 gWallpaperTiles_Snow[] = INCBIN_U8("graphics/pokemon_storage/snow.4bpp.lz");
+
+const u8 gWallpaperTilemap_Snow[] = INCBIN_U8("graphics/pokemon_storage/snow.bin.lz");
+
+const u16 gWallpaperPalettes_Cave[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal");
+const u16 gWallpaperPalettes_Cave_2[] = INCBIN_U16("graphics/pokemon_storage/cave_frame.gbapal");
+const u16 gWallpaperPalettes_Cave_2_3[] = INCBIN_U16("graphics/pokemon_storage/cave_bg.gbapal");
+
+const u8 gWallpaperTiles_Cave[] = INCBIN_U8("graphics/pokemon_storage/cave.4bpp.lz");
+
+const u8 gWallpaperTilemap_Cave[] = INCBIN_U8("graphics/pokemon_storage/cave.bin.lz");
+
+const u16 gWallpaperPalettes_Beach[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal");
+const u16 gWallpaperPalettes_Beach_2[] = INCBIN_U16("graphics/pokemon_storage/beach_frame.gbapal");
+const u16 gWallpaperPalettes_Beach_2_3[] = INCBIN_U16("graphics/pokemon_storage/beach_bg.gbapal");
+
+const u8 gWallpaperTiles_Beach[] = INCBIN_U8("graphics/pokemon_storage/beach.4bpp.lz");
+
+const u8 gWallpaperTilemap_Beach[] = INCBIN_U8("graphics/pokemon_storage/beach.bin.lz");
+
+const u16 gWallpaperPalettes_Seafloor[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal");
+const u16 gWallpaperPalettes_Seafloor_2[] = INCBIN_U16("graphics/pokemon_storage/seafloor_frame.gbapal");
+const u16 gWallpaperPalettes_Seafloor_2_3[] = INCBIN_U16("graphics/pokemon_storage/seafloor_bg.gbapal");
+
+const u8 gWallpaperTiles_Seafloor[] = INCBIN_U8("graphics/pokemon_storage/seafloor.4bpp.lz");
+
+const u8 gWallpaperTilemap_Seafloor[] = INCBIN_U8("graphics/pokemon_storage/seafloor.bin.lz");
+
+const u16 gWallpaperPalettes_River[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal");
+const u16 gWallpaperPalettes_River_2[] = INCBIN_U16("graphics/pokemon_storage/river_frame.gbapal");
+const u16 gWallpaperPalettes_River_2_3[] = INCBIN_U16("graphics/pokemon_storage/river_bg.gbapal");
+
+const u8 gWallpaperTiles_River[] = INCBIN_U8("graphics/pokemon_storage/river.4bpp.lz");
+
+const u8 gWallpaperTilemap_River[] = INCBIN_U8("graphics/pokemon_storage/river.bin.lz");
+
+const u16 gWallpaperPalettes_Sky[] = INCBIN_U16("graphics/pokemon_storage/box_bg1.gbapal");
+const u16 gWallpaperPalettes_Sky_2[] = INCBIN_U16("graphics/pokemon_storage/sky_frame.gbapal");
+const u16 gWallpaperPalettes_Sky_2_3[] = INCBIN_U16("graphics/pokemon_storage/sky_bg.gbapal");
+
+const u8 gWallpaperTiles_Sky[] = INCBIN_U8("graphics/pokemon_storage/sky.4bpp.lz");
+
+const u8 gWallpaperTilemap_Sky[] = INCBIN_U8("graphics/pokemon_storage/sky.bin.lz");
+
+const u16 gWallpaperPalettes_Polkadot[] = INCBIN_U16("graphics/pokemon_storage/box_bg2.gbapal");
+const u16 gWallpaperPalettes_Polkadot_2[] = INCBIN_U16("graphics/pokemon_storage/polkadot_frame.gbapal");
+const u16 gWallpaperPalettes_Polkadot_2_3[] = INCBIN_U16("graphics/pokemon_storage/polkadot_bg.gbapal");
+
+const u8 gWallpaperTiles_Polkadot[] = INCBIN_U8("graphics/pokemon_storage/polkadot.4bpp.lz");
+
+const u8 gWallpaperTilemap_Polkadot[] = INCBIN_U8("graphics/pokemon_storage/polkadot.bin.lz");
+
+const u16 gWallpaperPalettes_Pokecenter[] = INCBIN_U16("graphics/pokemon_storage/box_bg2.gbapal");
+const u16 gWallpaperPalettes_Pokecenter_2[] = INCBIN_U16("graphics/pokemon_storage/pokecenter_frame.gbapal");
+const u16 gWallpaperPalettes_Pokecenter_2_3[] = INCBIN_U16("graphics/pokemon_storage/pokecenter_bg.gbapal");
+
+const u8 gWallpaperTiles_Pokecenter[] = INCBIN_U8("graphics/pokemon_storage/pokecenter.4bpp.lz");
+
+const u8 gWallpaperTilemap_Pokecenter[] = INCBIN_U8("graphics/pokemon_storage/pokecenter.bin.lz");
+
+const u16 gWallpaperPalettes_Machine[] = INCBIN_U16("graphics/pokemon_storage/box_bg3.gbapal");
+const u16 gWallpaperPalettes_Machine_2[] = INCBIN_U16("graphics/pokemon_storage/machine_frame.gbapal");
+const u16 gWallpaperPalettes_Machine_2_3[] = INCBIN_U16("graphics/pokemon_storage/machine_bg.gbapal");
+
+const u8 gWallpaperTiles_Machine[] = INCBIN_U8("graphics/pokemon_storage/machine.4bpp.lz");
+
+const u8 gWallpaperTilemap_Machine[] = INCBIN_U8("graphics/pokemon_storage/machine.bin.lz");
+
+const u16 gWallpaperPalettes_Plain[] = INCBIN_U16("graphics/pokemon_storage/box_bg4.gbapal");
+const u16 gWallpaperPalettes_Plain_2[] = INCBIN_U16("graphics/pokemon_storage/plain_frame.gbapal");
+const u16 gWallpaperPalettes_Plain_2_3[] = INCBIN_U16("graphics/pokemon_storage/plain_bg.gbapal");
+
+const u8 gWallpaperTiles_Plain[] = INCBIN_U8("graphics/pokemon_storage/plain.4bpp.lz");
+
+const u8 gWallpaperTilemap_Plain[] = INCBIN_U8("graphics/pokemon_storage/plain.bin.lz");
+
+const u16 gUnknown_083BAEF8[] = INCBIN_U16("graphics/unused/tilemap_3BAEF8.bin");
+
+const u16 gUnknown_083BB0A8[][2] = {
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF},
+ {0x1CE7, 0x7FFF}
+};
+
+const struct WallpaperTable gWallpaperTable[] = {
+ {gWallpaperTiles_Forest, 0x3D0, gWallpaperTilemap_Forest, gWallpaperPalettes_Forest}, // Forest
+ {gWallpaperTiles_City, 0x208, gWallpaperTilemap_City, gWallpaperPalettes_City}, // City
+ {gWallpaperTiles_Desert, 0x2EC, gWallpaperTilemap_Desert, gWallpaperPalettes_Desert}, // Desert
+ {gWallpaperTiles_Savanna, 0x220, gWallpaperTilemap_Savanna, gWallpaperPalettes_Savanna}, // Savanna
+ {gWallpaperTiles_Crag, 0x350, gWallpaperTilemap_Crag, gWallpaperPalettes_Crag}, // Crag
+ {gWallpaperTiles_Volcano, 0x334, gWallpaperTilemap_Volcano, gWallpaperPalettes_Volcano}, // Volcano
+ {gWallpaperTiles_Snow, 0x2B8, gWallpaperTilemap_Snow, gWallpaperPalettes_Snow}, // Snow
+ {gWallpaperTiles_Cave, 0x344, gWallpaperTilemap_Cave, gWallpaperPalettes_Cave}, // Cave
+ {gWallpaperTiles_Beach, 0x384, gWallpaperTilemap_Beach, gWallpaperPalettes_Beach}, // Beach
+ {gWallpaperTiles_Seafloor, 0x2B4, gWallpaperTilemap_Seafloor, gWallpaperPalettes_Seafloor}, // Seafloor
+ {gWallpaperTiles_River, 0x294, gWallpaperTilemap_River, gWallpaperPalettes_River}, // River
+ {gWallpaperTiles_Sky, 0x298, gWallpaperTilemap_Sky, gWallpaperPalettes_Sky}, // Sky
+ {gWallpaperTiles_Polkadot, 0x1FC, gWallpaperTilemap_Polkadot, gWallpaperPalettes_Polkadot}, // Polkadot
+ {gWallpaperTiles_Pokecenter, 0x3A4, gWallpaperTilemap_Pokecenter, gWallpaperPalettes_Pokecenter}, // Pokecenter
+ {gWallpaperTiles_Machine, 0x2F0, gWallpaperTilemap_Machine, gWallpaperPalettes_Machine}, // Machine
+ {gWallpaperTiles_Plain, 0xFC, gWallpaperTilemap_Plain, gWallpaperPalettes_Plain} // Plain
+};
+
+const u16 PCPal_Arrow[] = INCBIN_U16("graphics/pokemon_storage/arrow.gbapal");
+const u8 PCGfx_Arrow[] = INCBIN_U8("graphics/pokemon_storage/arrow.4bpp");
+
+const struct SpriteSheet gUnknown_083BB288 = {PCGfx_Arrow, 0x80, 6};
+const struct SpritePalette gUnknown_083BB290 = {PCPal_Arrow, 0xdacf};
+
+const struct OamData gOamData_83BB298 = {
+ .shape = ST_OAM_H_RECTANGLE,
+ .size = 2,
+ .priority = 2
+};
+
+const union AnimCmd gSpriteAnim_83BB2A0[] = {
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END
+};
+
+const union AnimCmd gSpriteAnim_83BB2A8[] = {
+ ANIMCMD_FRAME(8, 5),
+ ANIMCMD_END
+};
+
+const union AnimCmd *const gSpriteAnimTable_83BB2B0[] = {
+ gSpriteAnim_83BB2A0,
+ gSpriteAnim_83BB2A8
+};
+
+const struct SpriteTemplate gSpriteTemplate_83BB2B8 = {
+ 3,
+ 0xdac8,
+ &gOamData_83BB298,
+ gSpriteAnimTable_83BB2B0,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ SpriteCallbackDummy
+};
+
+const struct OamData gOamData_83BB2D0 = {
+ .shape = ST_OAM_V_RECTANGLE,
+ .priority = 2
+};
+
+const union AnimCmd gSpriteAnim_83BB2D8[] = {
+ ANIMCMD_FRAME(0, 5),
+ ANIMCMD_END
+};
+
+const union AnimCmd gSpriteAnim_83BB2E0[] = {
+ ANIMCMD_FRAME(2, 5),
+ ANIMCMD_END
+};
+
+const union AnimCmd *const gSpriteAnimTable_83BB2E8[] = {
+ gSpriteAnim_83BB2D8,
+ gSpriteAnim_83BB2E0
+};
+
+const struct SpriteTemplate gSpriteTemplate_83BB2F0 = {
+ 6,
+ 0xdacf,
+ &gOamData_83BB2D0,
+ gSpriteAnimTable_83BB2E8,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ sub_809A8C8
+};
+
+const u16 HandCursorPalette[] = INCBIN_U16("graphics/pokemon_storage/hand_cursor_pal.bin");
+const u16 HandCursorAltPalette[] = INCBIN_U16("graphics/pokemon_storage/hand_cursor_alt_pal.bin");
+const u8 HandCursorTiles[] = INCBIN_U8("graphics/pokemon_storage/hand_cursor.4bpp");
+const u8 HandCursorShadowTiles[] = INCBIN_U8("graphics/pokemon_storage/hand_cursor_shadow.4bpp");
+
+bool8 (*const gUnknown_083BBBC8[])(void) = {
+ sub_809B150,
+ sub_809B1D8,
+ sub_809B24C
+};
+// .text
+
+void sub_8099BF8(u8 boxId)
+{
+ gPokemonStorageSystemPtr->unk_08ba = FALSE;
+ gPokemonStorageSystemPtr->unk_08b4 = 0;
+ DmaFill32(3, 0, BG_SCREEN_ADDR(26), 0x1000);
+ sub_8099EB0(boxId, 0);
+ sub_809A23C(boxId);
+ sub_809A6DC();
+ SpawnBoxIconSprites(boxId);
+ REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(26) | BGCNT_TXT512x256;
+}
+
+void sub_8099C70(u8 whichBox)
+{
+ s8 r4 = sub_8099D90(whichBox);
+ sub_8099EB0(whichBox, r4);
+ gPokemonStorageSystemPtr->unk_08b6 = r4 * 6;
+ gPokemonStorageSystemPtr->unk_08b8 = 0x20;
+ gPokemonStorageSystemPtr->unk_08bb = whichBox;
+ gPokemonStorageSystemPtr->unk_08bc = r4 > 0 ? 0 : 5;
+ gPokemonStorageSystemPtr->unk_08be = r4;
+ gPokemonStorageSystemPtr->unk_08c0 = r4 > 0 ? 0x108 : 0x38;
+ gPokemonStorageSystemPtr->unk_08c2 = r4 > 0 ? 0 : 5;
+ gPokemonStorageSystemPtr->unk_08c4 = r4;
+ gPokemonStorageSystemPtr->unk_08c6 = 0;
+ gPokemonStorageSystemPtr->unk_08c8 = 2;
+ sub_809900C(whichBox, r4);
+ sub_809A3D0(whichBox, r4);
+ sub_809A774(r4);
+}
+
+bool8 sub_8099D34(void)
+{
+ bool8 retVal = sub_80990AC();
+ if (gPokemonStorageSystemPtr->unk_08b8 != 0)
+ {
+ gPokemonStorageSystemPtr->unk_08b4 += gPokemonStorageSystemPtr->unk_08b6;
+ gPokemonStorageSystemPtr->unk_08b4 &= 0x1ff;
+ if (--gPokemonStorageSystemPtr->unk_08b8 == 0)
+ {
+ sub_809A598();
+ sub_809A810();
+ }
+ return TRUE;
+ }
+ return retVal;
+}
+
+s8 sub_8099D90(u8 boxId)
+{
+ u8 curBox = get_preferred_box();
+ u8 i;
+
+ for (i = 0; curBox != boxId; i++)
+ {
+ if (++curBox >= 14)
+ curBox = 0;
+ }
+ return i <= 6 ? 1 : -1;
+}
+
+void sub_8099DCC(u8 wallpaperId)
+{
+ u8 curBox = get_preferred_box();
+ gPokemonStorage.wallpaper[curBox] = wallpaperId;
+ gPokemonStorageSystemPtr->unk_1032 = 0;
+}
+
+bool8 sub_8099E08(void)
+{
+ switch (gPokemonStorageSystemPtr->unk_1032)
+ {
+ case 0:
+ BeginNormalPaletteFade(gPokemonStorageSystemPtr->unk_0d08, 1, 0, 0x10, 0xffff);
+ gPokemonStorageSystemPtr->unk_1032++;
+ break;
+ case 1:
+ if (!UpdatePaletteFade())
+ {
+ u8 curBox = get_preferred_box();
+ sub_8099EB0(curBox, 0);
+ sub_809A654();
+ BeginNormalPaletteFade(gPokemonStorageSystemPtr->unk_0d08, 1, 0x10, 0, 0xffff);
+ gPokemonStorageSystemPtr->unk_1032++;
+ }
+ break;
+ case 2:
+ if (!UpdatePaletteFade())
+ gPokemonStorageSystemPtr->unk_1032++;
+ break;
+ case 3:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void sub_8099EB0(u8 boxId, s8 a1)
+{
+ const struct WallpaperTable *wallpaperTable;
+
+ if (a1)
+ {
+ gPokemonStorageSystemPtr->unk_08ba = gPokemonStorageSystemPtr->unk_08ba ? FALSE : TRUE;
+ sub_809A14C(BG_SCREEN_ADDR(26));
+ }
+ wallpaperTable = gWallpaperTable +gPokemonStorage.wallpaper[boxId];
+ LoadPalette(wallpaperTable->palettes, gPokemonStorageSystemPtr->unk_08ba * 0x30 + 0x40, 0x60);
+ LZ77UnCompWram(wallpaperTable->tileMap, gPokemonStorageSystemPtr->unk_0d62);
+ sub_8099F58(BG_SCREEN_ADDR(26), gPokemonStorageSystemPtr->unk_0d62, a1, gPokemonStorageSystemPtr->unk_08ba);
+ LZ77UnCompVram(wallpaperTable->tiles, BG_CHAR_ADDR(2) + (gPokemonStorageSystemPtr->unk_08ba << 13));
+}
+
+#ifdef NONMATCHING
+void sub_8099F58(u16 *vdest, const u16 *src, s8 a2, u8 a3)
+{
+ s16 r6;
+ s16 r3;
+ u16 sp0 = a3 << 8;
+ u16 sp4 = (a3 * 3 + 4) << 12;
+ u16 *r4;
+ u16 *r7;
+ u16 i;
+ u16 j;
+ s16 sp8 = ((gPokemonStorageSystemPtr->unk_08b4 >> 3) + 10 + a2 * 24) & 0x3f;
+ if (sp8 < 13)
+ {
+ r6 = 20;
+ r3 = 0;
+ r4 = vdest + sp8 + 0x40;
+ r7 = NULL;
+ }
+ else if (sp8 < 32)
+ {
+ r6 = 32 - sp8;
+ r3 = 20 - r6;
+ r4 = vdest + sp8 + 0x40;
+ r7 = vdest + 0x440;
+ }
+ else if (sp8 < 45)
+ {
+ r6 = 20;
+ r3 = 0;
+ r4 = vdest + sp8 + 0x420;
+ r7 = NULL;
+ }
+ else
+ {
+ r6 = 64 - sp8;
+ r3 = 20 - r6;
+ r4 = vdest + sp8 + 0x420;
+ r7 = vdest + 0x40;
+ }
+ for (i = 0; i < 18; i++)
+ {
+ for (j = 0; j < r6; j++)
+ {
+ u16 tile = ((*src & 0xfff) + sp0) | ((*src & 0xf000) + sp4);
+ r4[j] = tile;
+ src++;
+ }
+ for (j = 0; j < r3; j++)
+ {
+ u16 tile = ((*src & 0xfff) + sp0) | ((*src & 0xf000) + sp4);
+ r7[j] = tile;
+ src++;
+ }
+ r4 += 0x20;
+ r7 += 0x20;
+ }
+ if (a2)
+ {
+ s16 r4_2;
+ u16 *r2;
+ if (a2 > 0)
+ r4_2 = (sp8 + 20) & 0x3f;
+ else
+ r4_2 = (sp8 - 4) & 0x3f;
+ r2 = r4_2 < 0x20 ? vdest + r4_2 + 0x40 : vdest + r4_2 + 0x420;
+ for (i = 0; i < 4; i++)
+ {
+ for (j = 0; j < 18; j++)
+ {
+ *r2 = 0;
+ r2 += 0x20;
+ }
+ r4_2++;
+ r4_2 &= 0x3f;
+ r2 = r4_2 < 0x20 ? vdest + r4_2 + 0x40 : vdest + r4_2 + 0x420;
+ }
+ }
+}
+#else
+__attribute__((naked)) void sub_8099F58(u16 *vdest, const u16 *src, s8 a2, u8 a3)
+{
+ 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, 0x20\n"
+ "\tmov r9, r0\n"
+ "\tadds r5, r1, 0\n"
+ "\tlsls r2, 24\n"
+ "\tlsls r3, 24\n"
+ "\tlsrs r3, 24\n"
+ "\tlsls r0, r3, 8\n"
+ "\tstr r0, [sp]\n"
+ "\tlsls r0, r3, 1\n"
+ "\tadds r0, r3\n"
+ "\tadds r0, 0x4\n"
+ "\tlsls r0, 28\n"
+ "\tlsrs r0, 16\n"
+ "\tstr r0, [sp, 0x4]\n"
+ "\tldr r0, _08099FB8 @ =gPokemonStorageSystemPtr\n"
+ "\tldr r0, [r0]\n"
+ "\tldr r1, _08099FBC @ =0x000008b4\n"
+ "\tadds r0, r1\n"
+ "\tldrh r1, [r0]\n"
+ "\tlsrs r1, 3\n"
+ "\tadds r1, 0xA\n"
+ "\tlsrs r0, r2, 24\n"
+ "\tmov r8, r0\n"
+ "\tasrs r2, 24\n"
+ "\tlsls r0, r2, 1\n"
+ "\tadds r0, r2\n"
+ "\tlsls r0, 3\n"
+ "\tadds r1, r0\n"
+ "\tmovs r0, 0x3F\n"
+ "\tands r1, r0\n"
+ "\tstr r1, [sp, 0x8]\n"
+ "\tadds r2, r1, 0\n"
+ "\tcmp r2, 0xC\n"
+ "\tbgt _08099FC0\n"
+ "\tmovs r6, 0x14\n"
+ "\tmovs r3, 0\n"
+ "\tlsls r0, r2, 1\n"
+ "\tadds r0, 0x80\n"
+ "\tmov r1, r9\n"
+ "\tadds r4, r1, r0\n"
+ "\tmovs r7, 0\n"
+ "\tb _0809A020\n"
+ "\t.align 2, 0\n"
+ "_08099FB8: .4byte gPokemonStorageSystemPtr\n"
+ "_08099FBC: .4byte 0x000008b4\n"
+ "_08099FC0:\n"
+ "\tcmp r2, 0x1F\n"
+ "\tbgt _08099FE6\n"
+ "\tmovs r0, 0x20\n"
+ "\tsubs r0, r2\n"
+ "\tlsls r0, 16\n"
+ "\tmovs r1, 0x14\n"
+ "\tlsrs r6, r0, 16\n"
+ "\tasrs r0, 16\n"
+ "\tsubs r1, r0\n"
+ "\tlsls r1, 16\n"
+ "\tlsrs r3, r1, 16\n"
+ "\tlsls r0, r2, 1\n"
+ "\tadds r0, 0x80\n"
+ "\tmov r2, r9\n"
+ "\tadds r4, r2, r0\n"
+ "\tmovs r7, 0x88\n"
+ "\tlsls r7, 4\n"
+ "\tadd r7, r9\n"
+ "\tb _0809A020\n"
+ "_08099FE6:\n"
+ "\tcmp r2, 0x2C\n"
+ "\tbgt _08099FFE\n"
+ "\tmovs r6, 0x14\n"
+ "\tmovs r3, 0\n"
+ "\tlsls r0, r2, 1\n"
+ "\tmovs r1, 0x84\n"
+ "\tlsls r1, 4\n"
+ "\tadds r0, r1\n"
+ "\tmov r2, r9\n"
+ "\tadds r4, r2, r0\n"
+ "\tmovs r7, 0\n"
+ "\tb _0809A020\n"
+ "_08099FFE:\n"
+ "\tmovs r0, 0x40\n"
+ "\tsubs r0, r2\n"
+ "\tlsls r0, 16\n"
+ "\tmovs r1, 0x14\n"
+ "\tlsrs r6, r0, 16\n"
+ "\tasrs r0, 16\n"
+ "\tsubs r1, r0\n"
+ "\tlsls r1, 16\n"
+ "\tlsrs r3, r1, 16\n"
+ "\tlsls r0, r2, 1\n"
+ "\tmovs r1, 0x84\n"
+ "\tlsls r1, 4\n"
+ "\tadds r0, r1\n"
+ "\tmov r2, r9\n"
+ "\tadds r4, r2, r0\n"
+ "\tmov r7, r9\n"
+ "\tadds r7, 0x80\n"
+ "_0809A020:\n"
+ "\tmovs r1, 0\n"
+ "\tmov r0, r8\n"
+ "\tlsls r0, 24\n"
+ "\tstr r0, [sp, 0x14]\n"
+ "\tlsls r0, r6, 16\n"
+ "\tasrs r0, 16\n"
+ "\tmov r8, r0\n"
+ "\tlsls r3, 16\n"
+ "\tstr r3, [sp, 0xC]\n"
+ "\tasrs r2, r3, 16\n"
+ "\tstr r2, [sp, 0x10]\n"
+ "_0809A036:\n"
+ "\tmovs r3, 0\n"
+ "\tadds r0, r4, 0\n"
+ "\tadds r0, 0x40\n"
+ "\tstr r0, [sp, 0x18]\n"
+ "\tadds r2, r7, 0\n"
+ "\tadds r2, 0x40\n"
+ "\tstr r2, [sp, 0x1C]\n"
+ "\tadds r1, 0x1\n"
+ "\tmov r10, r1\n"
+ "\tcmp r3, r8\n"
+ "\tbge _0809A07A\n"
+ "\tldr r0, _0809A0D4 @ =0x00000fff\n"
+ "\tmov r12, r0\n"
+ "\tmovs r6, 0xF0\n"
+ "\tlsls r6, 8\n"
+ "_0809A054:\n"
+ "\tldrh r2, [r5]\n"
+ "\tmov r0, r12\n"
+ "\tands r0, r2\n"
+ "\tldr r1, [sp]\n"
+ "\tadds r0, r1, r0\n"
+ "\tadds r1, r6, 0\n"
+ "\tands r1, r2\n"
+ "\tldr r2, [sp, 0x4]\n"
+ "\tadds r1, r2, r1\n"
+ "\torrs r1, r0\n"
+ "\tlsls r0, r3, 1\n"
+ "\tadds r0, r4\n"
+ "\tstrh r1, [r0]\n"
+ "\tadds r5, 0x2\n"
+ "\tadds r0, r3, 0x1\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r3, r0, 16\n"
+ "\tcmp r3, r8\n"
+ "\tblt _0809A054\n"
+ "_0809A07A:\n"
+ "\tmovs r3, 0\n"
+ "\tldr r0, [sp, 0x10]\n"
+ "\tcmp r3, r0\n"
+ "\tbge _0809A0B4\n"
+ "\tldr r1, _0809A0D4 @ =0x00000fff\n"
+ "\tmov r12, r1\n"
+ "\tmovs r6, 0xF0\n"
+ "\tlsls r6, 8\n"
+ "\tldr r2, [sp, 0xC]\n"
+ "\tasrs r4, r2, 16\n"
+ "_0809A08E:\n"
+ "\tldrh r2, [r5]\n"
+ "\tmov r0, r12\n"
+ "\tands r0, r2\n"
+ "\tldr r1, [sp]\n"
+ "\tadds r0, r1, r0\n"
+ "\tadds r1, r6, 0\n"
+ "\tands r1, r2\n"
+ "\tldr r2, [sp, 0x4]\n"
+ "\tadds r1, r2, r1\n"
+ "\torrs r1, r0\n"
+ "\tlsls r0, r3, 1\n"
+ "\tadds r0, r7\n"
+ "\tstrh r1, [r0]\n"
+ "\tadds r5, 0x2\n"
+ "\tadds r0, r3, 0x1\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r3, r0, 16\n"
+ "\tcmp r3, r4\n"
+ "\tblt _0809A08E\n"
+ "_0809A0B4:\n"
+ "\tldr r4, [sp, 0x18]\n"
+ "\tldr r7, [sp, 0x1C]\n"
+ "\tmov r1, r10\n"
+ "\tlsls r0, r1, 16\n"
+ "\tlsrs r1, r0, 16\n"
+ "\tcmp r1, 0x11\n"
+ "\tbls _0809A036\n"
+ "\tldr r0, [sp, 0x14]\n"
+ "\tasrs r2, r0, 24\n"
+ "\tcmp r2, 0\n"
+ "\tbeq _0809A13A\n"
+ "\tcmp r2, 0\n"
+ "\tble _0809A0D8\n"
+ "\tldr r1, [sp, 0x8]\n"
+ "\tadds r1, 0x14\n"
+ "\tb _0809A0DC\n"
+ "\t.align 2, 0\n"
+ "_0809A0D4: .4byte 0x00000fff\n"
+ "_0809A0D8:\n"
+ "\tldr r1, [sp, 0x8]\n"
+ "\tsubs r1, 0x4\n"
+ "_0809A0DC:\n"
+ "\tmovs r0, 0x3F\n"
+ "\tands r1, r0\n"
+ "\tadds r4, r1, 0\n"
+ "\tadds r0, r4, 0\n"
+ "\tcmp r0, 0x1F\n"
+ "\tbgt _0809A0EE\n"
+ "\tlsls r0, 1\n"
+ "\tadds r0, 0x80\n"
+ "\tb _0809A0F6\n"
+ "_0809A0EE:\n"
+ "\tlsls r0, 1\n"
+ "\tmovs r2, 0x84\n"
+ "\tlsls r2, 4\n"
+ "\tadds r0, r2\n"
+ "_0809A0F6:\n"
+ "\tmov r1, r9\n"
+ "\tadds r2, r1, r0\n"
+ "\tmovs r3, 0\n"
+ "\tmovs r6, 0\n"
+ "_0809A0FE:\n"
+ "\tmovs r1, 0\n"
+ "\tadds r5, r3, 0x1\n"
+ "\tlsls r3, r4, 16\n"
+ "_0809A104:\n"
+ "\tstrh r6, [r2]\n"
+ "\tadds r2, 0x40\n"
+ "\tadds r0, r1, 0x1\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r1, r0, 16\n"
+ "\tcmp r1, 0x11\n"
+ "\tbls _0809A104\n"
+ "\tasrs r0, r3, 16\n"
+ "\tadds r4, r0, 0x1\n"
+ "\tmovs r0, 0x3F\n"
+ "\tands r4, r0\n"
+ "\tadds r0, r4, 0\n"
+ "\tcmp r0, 0x1F\n"
+ "\tbgt _0809A126\n"
+ "\tlsls r0, 1\n"
+ "\tadds r0, 0x80\n"
+ "\tb _0809A12E\n"
+ "_0809A126:\n"
+ "\tlsls r0, 1\n"
+ "\tmovs r2, 0x84\n"
+ "\tlsls r2, 4\n"
+ "\tadds r0, r2\n"
+ "_0809A12E:\n"
+ "\tmov r1, r9\n"
+ "\tadds r2, r1, r0\n"
+ "\tlsls r0, r5, 16\n"
+ "\tlsrs r3, r0, 16\n"
+ "\tcmp r3, 0x3\n"
+ "\tbls _0809A0FE\n"
+ "_0809A13A:\n"
+ "\tadd sp, 0x20\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");
+}
+#endif
+
+#ifdef NONMATCHING
+void sub_809A14C(u16 *vdest)
+{
+ u16 *r2;
+ u16 i;
+ int r3 = ((gPokemonStorageSystemPtr->unk_08b4 >> 3) + 30) & 0x3f;
+ r2 = vdest + (r3 < 0x20 ? r3 + 0x260 : r3 + 0x640);
+ for (i = 0; i < 0x2b; i++)
+ {
+ *r2++ = 0;
+ r3++;
+ r3 &= 0x3f;
+ if (r3 == 0)
+ r2 -= 0x420;
+ if (r3 == 0x20)
+ r2 += 0x3e0;
+ }
+}
+#else
+__attribute__((naked)) void sub_809A14C(u16 *vdest)
+{
+ asm_unified("\tpush {r4-r6,lr}\n"
+ "\tadds r2, r0, 0\n"
+ "\tldr r0, _0809A174 @ =gPokemonStorageSystemPtr\n"
+ "\tldr r0, [r0]\n"
+ "\tldr r1, _0809A178 @ =0x000008b4\n"
+ "\tadds r0, r1\n"
+ "\tldrh r0, [r0]\n"
+ "\tlsrs r0, 3\n"
+ "\tadds r3, r0, 0\n"
+ "\tadds r3, 0x1E\n"
+ "\tmovs r0, 0x3F\n"
+ "\tands r3, r0\n"
+ "\tadds r0, r3, 0\n"
+ "\tcmp r0, 0x1F\n"
+ "\tbgt _0809A17C\n"
+ "\tlsls r0, 1\n"
+ "\tmovs r6, 0x98\n"
+ "\tlsls r6, 3\n"
+ "\tadds r0, r6\n"
+ "\tb _0809A184\n"
+ "\t.align 2, 0\n"
+ "_0809A174: .4byte gPokemonStorageSystemPtr\n"
+ "_0809A178: .4byte 0x000008b4\n"
+ "_0809A17C:\n"
+ "\tlsls r0, 1\n"
+ "\tmovs r1, 0xC8\n"
+ "\tlsls r1, 4\n"
+ "\tadds r0, r1\n"
+ "_0809A184:\n"
+ "\tadds r2, r0\n"
+ "\tmovs r0, 0\n"
+ "\tmovs r5, 0\n"
+ "\tmovs r4, 0x3F\n"
+ "_0809A18C:\n"
+ "\tstrh r5, [r2]\n"
+ "\tadds r2, 0x2\n"
+ "\tadds r3, 0x1\n"
+ "\tands r3, r4\n"
+ "\tadds r1, r3, 0\n"
+ "\tcmp r1, 0\n"
+ "\tbne _0809A19E\n"
+ "\tldr r6, _0809A1B8 @ =0xfffff7c0\n"
+ "\tadds r2, r6\n"
+ "_0809A19E:\n"
+ "\tcmp r1, 0x20\n"
+ "\tbne _0809A1A8\n"
+ "\tmovs r1, 0xF8\n"
+ "\tlsls r1, 3\n"
+ "\tadds r2, r1\n"
+ "_0809A1A8:\n"
+ "\tadds r0, 0x1\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tcmp r0, 0x2B\n"
+ "\tbls _0809A18C\n"
+ "\tpop {r4-r6}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.align 2, 0\n"
+ "_0809A1B8: .4byte 0xfffff7c0");
+}
+#endif
+
+void sub_809A1BC(const u8 *a0, const u8 *text)
+{
+ u8 *r5 = gUnknown_083B6DB8;
+ DmaClear16(3, r5, 0x200);
+ Text_InitWindow8004E3C(&gWindowTemplate_81E6D38, r5, text);
+ DmaCopy16(3, r5 + 0x000, a0 + 0x000, 0x80);
+ DmaCopy16(3, r5 + 0x100, a0 + 0x080, 0x80);
+ DmaCopy16(3, r5 + 0x080, a0 + 0x100, 0x80);
+ DmaCopy16(3, r5 + 0x180, a0 + 0x180, 0x80);
+}
+
+const struct SpriteTemplate gSpriteTemplate_83BB2B8;
+
+void sub_809A23C(u8 boxId)
+{
+ u8 tagIdx;
+ s16 r6;
+ u16 i;
+
+ struct SpriteSheet spriteSheet = {gPokemonStorageSystemPtr->unk_08ca, 0x200, 3};
+ struct SpritePalette palettes[] = {
+ {gPokemonStorageSystemPtr->unk_0ccc, 0xdac8},
+ {gPokemonStorageSystemPtr->unk_0ccc, 0xdac9},
+ {}
+ };
+
+ u16 wallpaper = gPokemonStorage.wallpaper[boxId];
+ gPokemonStorageSystemPtr->unk_0ccc[14] = gUnknown_083BB0A8[wallpaper][0];
+ gPokemonStorageSystemPtr->unk_0ccc[15] = gUnknown_083BB0A8[wallpaper][1];
+ LoadSpritePalettes(palettes);
+ gPokemonStorageSystemPtr->unk_0d08 = 0x3f0;
+ tagIdx = IndexOfSpritePaletteTag(0xdac8);
+ gPokemonStorageSystemPtr->unk_0cec = 0x10e + 16 * tagIdx;
+ gPokemonStorageSystemPtr->unk_0d08 |= 0x10000 << tagIdx;
+ tagIdx = IndexOfSpritePaletteTag(0xdac9);
+ gPokemonStorageSystemPtr->unk_0cee = 0x10e + 16 * tagIdx;
+ gPokemonStorageSystemPtr->unk_0d08 |= 0x10000 << tagIdx;
+ sub_809A1BC(gPokemonStorageSystemPtr->unk_08ca, gPokemonStorage.boxNames[boxId]);
+ LoadSpriteSheet(&spriteSheet);
+ r6 = sub_809A6D0(sub_8072CA4(gPokemonStorage.boxNames[boxId]));
+ for (i = 0; i < 2; i++)
+ {
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83BB2B8, r6 + i * 32, 0x1c, 23);
+ gPokemonStorageSystemPtr->unk_0cf0[i] = gSprites + spriteId;
+ StartSpriteAnim(gPokemonStorageSystemPtr->unk_0cf0[i], i);
+ }
+ gPokemonStorageSystemPtr->unk_0cca = 0;
+}
+
+void sub_809A3D0(u8 boxId, s8 a1)
+{
+ u16 r8;
+ s16 x;
+ s16 x2;
+ u16 i;
+ struct SpriteSheet spriteSheet = {gPokemonStorageSystemPtr->unk_08ca, 0x200, 3};
+ struct SpriteTemplate template = gSpriteTemplate_83BB2B8;
+
+ gPokemonStorageSystemPtr->unk_0cca = gPokemonStorageSystemPtr->unk_0cca ? FALSE : TRUE;
+ if (gPokemonStorageSystemPtr->unk_0cca == 0)
+ {
+ spriteSheet.tag = 3;
+ r8 = gPokemonStorageSystemPtr->unk_0cec;
+ }
+ else
+ {
+ spriteSheet.tag = 4;
+ r8 = gPokemonStorageSystemPtr->unk_0cec;
+ template.tileTag = 4;
+ template.paletteTag = 0xdac9;
+ }
+ sub_809A1BC(gPokemonStorageSystemPtr->unk_08ca, gPokemonStorage.boxNames[boxId]);
+ LoadSpriteSheet(&spriteSheet);
+ LoadPalette(gUnknown_083BB0A8[gPokemonStorage.wallpaper[boxId]], r8, 0x04);
+ x = sub_809A6D0(sub_8072CA4(gPokemonStorage.boxNames[boxId]));
+ x2 = x + a1 * 192;
+ for (i = 0; i < 2; i++)
+ {
+ u8 spriteId = CreateSprite(&template, i * 32 + x2, 0x1c, 23);
+ gPokemonStorageSystemPtr->unk_0cf8[i] = gSprites + spriteId;
+ gPokemonStorageSystemPtr->unk_0cf8[i]->data[0] = (-a1) * 6;
+ gPokemonStorageSystemPtr->unk_0cf8[i]->data[1] = i * 32 + x;
+ gPokemonStorageSystemPtr->unk_0cf8[i]->data[2] = 1;
+ gPokemonStorageSystemPtr->unk_0cf8[i]->callback = sub_809A5E8;
+ StartSpriteAnim(gPokemonStorageSystemPtr->unk_0cf8[i], i);
+ gPokemonStorageSystemPtr->unk_0cf0[i]->data[0] = (-a1) * 6;
+ gPokemonStorageSystemPtr->unk_0cf0[i]->data[1] = 1;
+ gPokemonStorageSystemPtr->unk_0cf0[i]->callback = sub_809A61C;
+ }
+}
+
+void sub_809A598(void)
+{
+ if (gPokemonStorageSystemPtr->unk_0cca == 0)
+ FreeSpriteTilesByTag(4);
+ else
+ FreeSpriteTilesByTag(3);
+ gPokemonStorageSystemPtr->unk_0cf0[0] = gPokemonStorageSystemPtr->unk_0cf8[0];
+ gPokemonStorageSystemPtr->unk_0cf0[1] = gPokemonStorageSystemPtr->unk_0cf8[1];
+}
+
+void sub_809A5E8(struct Sprite *sprite)
+{
+ if (sprite->data[2])
+ sprite->data[2]--;
+ else if ((sprite->pos1.x += sprite->data[0]) == sprite->data[1])
+ sprite->callback = SpriteCallbackDummy;
+}
+
+void sub_809A61C(struct Sprite *sprite)
+{
+ if (sprite->data[1])
+ sprite->data[1]--;
+ else
+ {
+ sprite->pos1.x += sprite->data[0];
+ sprite->data[2] = sprite->pos1.x + sprite->pos2.x;
+ if (sprite->data[2] < 0x40 || sprite->data[2] > 0x100)
+ DestroySprite(sprite);
+ }
+}
+
+void sub_809A654(void)
+{
+ u8 boxId = get_preferred_box();
+ u8 wallpaperId = gPokemonStorage.wallpaper[boxId];
+ if (gPokemonStorageSystemPtr->unk_0cca == 0)
+ CpuCopy16(gUnknown_083BB0A8[wallpaperId], gPlttBufferUnfaded + gPokemonStorageSystemPtr->unk_0cec, 4);
+ else
+ CpuCopy16(gUnknown_083BB0A8[wallpaperId], gPlttBufferUnfaded + gPokemonStorageSystemPtr->unk_0cee, 4);
+}
+
+s16 sub_809A6D0(u8 width)
+{
+ return 0xb0 - width / 2;
+}
+
+void sub_809A6DC(void)
+{
+ u16 i;
+
+ LoadSpriteSheet(&gUnknown_083BB288);
+ LoadSpritePalette(&gUnknown_083BB290);
+ for (i = 0; i < 2; i++)
+ {
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83BB2F0, 0x5c + i * 0x88, 0x1c, 21);
+ if (spriteId != MAX_SPRITES)
+ {
+ struct Sprite *sprite = gSprites + spriteId;
+ StartSpriteAnim(sprite, i);
+ sprite->data[3] = (i == 0) ? -1 : 1;
+ gPokemonStorageSystemPtr->unk_0d00[i] = sprite;
+ }
+ }
+ if (sub_809BF2C())
+ sub_809A860(TRUE);
+}
+
+void sub_809A774(s8 a0)
+{
+ u16 i;
+
+ for (i = 0; i < 2; i++)
+ {
+ gPokemonStorageSystemPtr->unk_0d00[i]->pos2.x = 0;
+ gPokemonStorageSystemPtr->unk_0d00[i]->data[0] = 2;
+ }
+ if (a0 < 0)
+ {
+ gPokemonStorageSystemPtr->unk_0d00[0]->data[1] = 29;
+ gPokemonStorageSystemPtr->unk_0d00[1]->data[1] = 5;
+ gPokemonStorageSystemPtr->unk_0d00[0]->data[2] = 0x48;
+ gPokemonStorageSystemPtr->unk_0d00[1]->data[2] = 0x48;
+ }
+ else
+ {
+ gPokemonStorageSystemPtr->unk_0d00[0]->data[1] = 5;
+ gPokemonStorageSystemPtr->unk_0d00[1]->data[1] = 29;
+ gPokemonStorageSystemPtr->unk_0d00[0]->data[2] = 0xF8;
+ gPokemonStorageSystemPtr->unk_0d00[1]->data[2] = 0xF8;
+ }
+ gPokemonStorageSystemPtr->unk_0d00[0]->data[7] = 0;
+ gPokemonStorageSystemPtr->unk_0d00[1]->data[7] = 1;
+}
+
+void sub_809A810(void)
+{
+ u16 i;
+
+ for (i = 0; i < 2; i++)
+ {
+ gPokemonStorageSystemPtr->unk_0d00[i]->pos1.x = 0x88 * i + 0x5c;
+ gPokemonStorageSystemPtr->unk_0d00[i]->pos2.x = 0;
+ gPokemonStorageSystemPtr->unk_0d00[i]->invisible = FALSE;
+ }
+ sub_809A860(TRUE);
+}
+
+void sub_809A860(bool8 a0)
+{
+ u16 i;
+ if (a0)
+ {
+ for (i = 0; i < 2; i++)
+ {
+ gPokemonStorageSystemPtr->unk_0d00[i]->data[0] = 1;
+ gPokemonStorageSystemPtr->unk_0d00[i]->data[1] = 0;
+ gPokemonStorageSystemPtr->unk_0d00[i]->data[2] = 0;
+ gPokemonStorageSystemPtr->unk_0d00[i]->data[4] = 0;
+ }
+ }
+ else
+ {
+ for (i = 0; i < 2; i++)
+ {
+ gPokemonStorageSystemPtr->unk_0d00[i]->data[0] = 0;
+ }
+ }
+}
+
+void sub_809A8C8(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->pos2.x = 0;
+ break;
+ case 1:
+ if (++sprite->data[1] > 3)
+ {
+ sprite->data[1] = 0;
+ sprite->pos2.x += sprite->data[3];
+ if (++sprite->data[2] > 5)
+ {
+ sprite->data[2] = 0;
+ sprite->pos2.x = 0;
+ }
+ }
+ break;
+ case 2:
+ sprite->data[0] = 3;
+ break;
+ case 3:
+ sprite->pos1.x -= gPokemonStorageSystemPtr->unk_08b6;
+ if (sprite->pos1.x < 0x49 || sprite->pos1.x > 0xf7)
+ sprite->invisible = TRUE;
+ if (--sprite->data[1] == 0)
+ {
+ sprite->pos1.x = sprite->data[2];
+ sprite->invisible = FALSE;
+ sprite->data[0] = 4;
+ }
+ break;
+ case 4:
+ sprite->pos1.x -= gPokemonStorageSystemPtr->unk_08b6;
+ break;
+ }
+}
+
+struct Sprite *sub_809A9A0(u16 x, u16 y, u8 animId, u8 priority, u8 subpriority)
+{
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83BB2F0, x, y, subpriority);
+ if (spriteId == MAX_SPRITES)
+ return NULL;
+ animId %= 2;
+ StartSpriteAnim(gSprites + spriteId, animId);
+ gSprites[spriteId].oam.priority = priority;
+ gSprites[spriteId].callback = SpriteCallbackDummy;
+ return gSprites + spriteId;
+}
+
+void sub_809AA24(void)
+{
+ if (gPokemonStorageSystemPtr->unk_0005 != 1)
+ gUnknown_020384E4 = 0;
+ else
+ gUnknown_020384E4 = 1;
+ gUnknown_020384E5 = 0;
+ gUnknown_020384E6 = FALSE;
+ gUnknown_020384E7 = 0;
+ gUnknown_020384E8 = 0;
+ gUnknown_020384E9 = 0;
+ sub_809B0D4();
+ sub_809CC04();
+ gPokemonStorageSystemPtr->unk_11e2 = 1;
+ sub_809BF74();
+}
+
+void sub_809AA98(void)
+{
+ sub_809CC04();
+ sub_809C028();
+ gPokemonStorageSystemPtr->unk_11e2 = 1;
+ if (gUnknown_020384E6)
+ sub_8098BF0();
+}
+
+void sub_809AACC(u8 a0, u8 a1, u16 *a2, u16 *a3)
+{
+ switch (a0)
+ {
+ case 0:
+ *a2 = (a1 % 6) * 24 + 100;
+ *a3 = (a1 / 6) * 24 + 32;
+ break;
+ case 1:
+ if (a1 == 0)
+ {
+ *a2 = 0x68;
+ *a3 = 0x34;
+ }
+ else if (a1 == 6)
+ {
+ *a2 = 0x98;
+ *a3 = 0x84;
+ }
+ else
+ {
+ *a2 = 0x98;
+ *a3 = (a1 - 1) * 24 + 4;
+ }
+ break;
+ case 2:
+ *a2 = 0xa2;
+ *a3 = 0x0c;
+ break;
+ case 3:
+ *a3 = gUnknown_020384E6 ? 8 : 14;
+ *a2 = a1 * 0x58 + 0x78;
+ break;
+ case 4:
+ *a2 = 0xa0;
+ *a3 = 0x60;
+ break;
+ }
+}
+
+u16 sub_809AB8C(void)
+{
+ switch (gUnknown_020384E4)
+ {
+ case 1:
+ return GetMonData(gPlayerParty + gUnknown_020384E5, MON_DATA_SPECIES);
+ case 0:
+ return GetBoxMonData(gPokemonStorage.boxes[get_preferred_box()] + gUnknown_020384E5, MON_DATA_SPECIES);
+ default:
+ return SPECIES_NONE;
+ }
+}
+
+bool8 sub_809AC00(void)
+{
+ s16 tmp;
+ if (gPokemonStorageSystemPtr->unk_11dc == 0)
+ return FALSE;
+ if (--gPokemonStorageSystemPtr->unk_11dc)
+ {
+ gPokemonStorageSystemPtr->unk_11c8 += gPokemonStorageSystemPtr->unk_11d0;
+ gPokemonStorageSystemPtr->unk_11cc += gPokemonStorageSystemPtr->unk_11d4;
+ gPokemonStorageSystemPtr->unk_11c0->pos1.x = gPokemonStorageSystemPtr->unk_11c8 >> 8;
+ gPokemonStorageSystemPtr->unk_11c0->pos1.y = gPokemonStorageSystemPtr->unk_11cc >> 8;
+ if (gPokemonStorageSystemPtr->unk_11c0->pos1.x > 0x100)
+ {
+ tmp = gPokemonStorageSystemPtr->unk_11c0->pos1.x - 0x100;
+ gPokemonStorageSystemPtr->unk_11c0->pos1.x = tmp + 0x40;
+ }
+ if (gPokemonStorageSystemPtr->unk_11c0->pos1.x < 0x40)
+ {
+ tmp = 0x40 - gPokemonStorageSystemPtr->unk_11c0->pos1.x;
+ gPokemonStorageSystemPtr->unk_11c0->pos1.x = 0x100 - tmp;
+ }
+ if (gPokemonStorageSystemPtr->unk_11c0->pos1.y > 0xb0)
+ {
+ tmp = gPokemonStorageSystemPtr->unk_11c0->pos1.y - 0xb0;
+ gPokemonStorageSystemPtr->unk_11c0->pos1.y = tmp - 0x10;
+ }
+ if (gPokemonStorageSystemPtr->unk_11c0->pos1.y < -0x10)
+ {
+ tmp = -0x10 - gPokemonStorageSystemPtr->unk_11c0->pos1.y;
+ gPokemonStorageSystemPtr->unk_11c0->pos1.y = 0xb0 - tmp;
+ }
+ if (gPokemonStorageSystemPtr->unk_11e3 && --gPokemonStorageSystemPtr->unk_11e3 == 0)
+ gPokemonStorageSystemPtr->unk_11c0->vFlip = gPokemonStorageSystemPtr->unk_11c0->vFlip ? FALSE : TRUE;
+ }
+ else
+ {
+ gPokemonStorageSystemPtr->unk_11c0->pos1.x = gPokemonStorageSystemPtr->unk_11d8;
+ gPokemonStorageSystemPtr->unk_11c0->pos1.y = gPokemonStorageSystemPtr->unk_11da;
+ sub_809AFB8();
+ }
+ return TRUE;
+}
+
+void sub_809AD3C(u8 a0, u8 a1)
+{
+ u16 x;
+ u16 y;
+
+ sub_809AACC(a0, a1, &x, &y);
+ gPokemonStorageSystemPtr->unk_11e0 = a0;
+ gPokemonStorageSystemPtr->unk_11e1 = a1;
+ gPokemonStorageSystemPtr->unk_11d8 = x;
+ gPokemonStorageSystemPtr->unk_11da = y;
+}
+
+void sub_809AD94(void)
+{
+ int r7;
+ int r0;
+
+ if (gPokemonStorageSystemPtr->unk_11de || gPokemonStorageSystemPtr->unk_11df)
+ gPokemonStorageSystemPtr->unk_11dc = 12;
+ else
+ gPokemonStorageSystemPtr->unk_11dc = 6;
+ if (gPokemonStorageSystemPtr->unk_11e3)
+ gPokemonStorageSystemPtr->unk_11e3 = gPokemonStorageSystemPtr->unk_11dc >> 1;
+ switch (gPokemonStorageSystemPtr->unk_11de)
+ {
+ default:
+ r7 = gPokemonStorageSystemPtr->unk_11da - gPokemonStorageSystemPtr->unk_11c0->pos1.y;
+ break;
+ case -1:
+ r7 = gPokemonStorageSystemPtr->unk_11da - 0xc0 - gPokemonStorageSystemPtr->unk_11c0->pos1.y;
+ break;
+ case 1:
+ r7 = gPokemonStorageSystemPtr->unk_11da + 0xc0 - gPokemonStorageSystemPtr->unk_11c0->pos1.y;
+ break;
+ }
+ switch (gPokemonStorageSystemPtr->unk_11df)
+ {
+ default:
+ r0 = gPokemonStorageSystemPtr->unk_11d8 - gPokemonStorageSystemPtr->unk_11c0->pos1.x;
+ break;
+ case -1:
+ r0 = gPokemonStorageSystemPtr->unk_11d8 - 0xc0 - gPokemonStorageSystemPtr->unk_11c0->pos1.x;
+ break;
+ case 1:
+ r0 = gPokemonStorageSystemPtr->unk_11d8 + 0xc0 - gPokemonStorageSystemPtr->unk_11c0->pos1.x;
+ break;
+ }
+ r7 <<= 8;
+ r0 <<= 8;
+ gPokemonStorageSystemPtr->unk_11d0 = r0 / gPokemonStorageSystemPtr->unk_11dc;
+ gPokemonStorageSystemPtr->unk_11d4 = r7 / gPokemonStorageSystemPtr->unk_11dc;
+ gPokemonStorageSystemPtr->unk_11c8 = gPokemonStorageSystemPtr->unk_11c0->pos1.x << 8;
+ gPokemonStorageSystemPtr->unk_11cc = gPokemonStorageSystemPtr->unk_11c0->pos1.y << 8;
+}
+
+void sub_809AF18(u8 a0, u8 a1)
+{
+ sub_809AD3C(a0, a1);
+ sub_809AD94();
+ if (!gUnknown_020384E6)
+ StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 1);
+ if (a0 == 1 && gUnknown_020384E4 != 1)
+ {
+ gPokemonStorageSystemPtr->unk_11e2 = a0;
+ gPokemonStorageSystemPtr->unk_11c4->invisible = TRUE;
+ }
+ switch (a0)
+ {
+ case 0:
+ break;
+ case 1 ... 3:
+ gPokemonStorageSystemPtr->unk_11c4->invisible = TRUE;
+ gPokemonStorageSystemPtr->unk_11c4->oam.priority = 1;
+ break;
+ }
+}
+
+void sub_809AFB8(void)
+{
+ gUnknown_020384E4 = gPokemonStorageSystemPtr->unk_11e0;
+ gUnknown_020384E5 = gPokemonStorageSystemPtr->unk_11e1;
+ if (!gUnknown_020384E6)
+ StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 0);
+ sub_809BF74();
+ switch (gUnknown_020384E4)
+ {
+ case 2:
+ sub_809A860(TRUE);
+ break;
+ case 1:
+ gPokemonStorageSystemPtr->unk_11c4->subpriority = 12;
+ break;
+ case 0:
+ gPokemonStorageSystemPtr->unk_11c4->oam.priority = 2;
+ gPokemonStorageSystemPtr->unk_11c4->subpriority = 20;
+ gPokemonStorageSystemPtr->unk_11c4->invisible = FALSE;
+ break;
+ }
+}
+
+void sub_809B068(void)
+{
+ u8 partyCount;
+ if (!gUnknown_020384E6)
+ partyCount = 0;
+ else
+ {
+ partyCount = CalculatePlayerPartyCount();
+ if (partyCount > PARTY_SIZE - 1)
+ partyCount = PARTY_SIZE - 1;
+ }
+ if (gPokemonStorageSystemPtr->unk_11c0->vFlip)
+ gPokemonStorageSystemPtr->unk_11e3 = 1;
+ sub_809AF18(1, partyCount);
+}
+
+void sub_809B0C0(u8 a0)
+{
+ sub_809AF18(0, a0);
+}
+
+void sub_809B0D4(void)
+{
+ gUnknown_020384EA = 0;
+}
+
+void sub_809B0E0(void)
+{
+ gUnknown_020384EA = gUnknown_020384E5;
+}
+
+u8 sub_809B0F4(void)
+{
+ return gUnknown_020384EA;
+}
+
+void sub_809B100(u8 a0)
+{
+ gPokemonStorageSystemPtr->unk_12a4 = gUnknown_083BBBC8[a0];
+ gPokemonStorageSystemPtr->unk_12a8 = 0;
+}
+
+bool8 sub_809B130(void)
+{
+ return gPokemonStorageSystemPtr->unk_12a4();
+}
+
+bool8 sub_809B150(void)
+{
+ switch (gPokemonStorageSystemPtr->unk_12a8)
+ {
+ case 0:
+ if (gUnknown_020384E6)
+ return FALSE;
+ StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 2);
+ gPokemonStorageSystemPtr->unk_12a8++;
+ break;
+ case 1:
+ if (!sub_809B324())
+ {
+ StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 3);
+ sub_809B384();
+ gPokemonStorageSystemPtr->unk_12a8++;
+ }
+ break;
+ case 2:
+ if (!sub_809B358())
+ gPokemonStorageSystemPtr->unk_12a8++;
+ break;
+ case 3:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+bool8 sub_809B1D8(void)
+{
+ switch (gPokemonStorageSystemPtr->unk_12a8)
+ {
+ case 0:
+ if (!sub_809B324())
+ {
+ StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 2);
+ sub_809B3E0();
+ gPokemonStorageSystemPtr->unk_12a8++;
+ }
+ break;
+ case 1:
+ if (!sub_809B358())
+ {
+ StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 0);
+ gPokemonStorageSystemPtr->unk_12a8++;
+ }
+ break;
+ case 2:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+bool8 sub_809B24C(void)
+{
+ switch (gPokemonStorageSystemPtr->unk_12a8)
+ {
+ case 0:
+ switch (gUnknown_020384E4)
+ {
+ case 1:
+ gPokemonStorageSystemPtr->unk_12a9 = 14;
+ break;
+ case 0:
+ gPokemonStorageSystemPtr->unk_12a9 = get_preferred_box();
+ break;
+ default:
+ return FALSE;
+ }
+ StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 2);
+ sub_80996B0(gPokemonStorageSystemPtr->unk_12a9, gUnknown_020384E5);
+ gPokemonStorageSystemPtr->unk_12a8++;
+ break;
+ case 1:
+ if (!sub_809971C())
+ {
+ StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 3);
+ diegohint1(gPokemonStorageSystemPtr->unk_12a9, gUnknown_020384E5);
+ gPokemonStorageSystemPtr->unk_12a8++;
+ }
+ break;
+ case 2:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+bool8 sub_809B324(void)
+{
+ switch (gPokemonStorageSystemPtr->unk_11c0->pos2.y)
+ {
+ default:
+ gPokemonStorageSystemPtr->unk_11c0->pos2.y++;
+ break;
+ case 0:
+ gPokemonStorageSystemPtr->unk_11c0->pos2.y++;
+ break;
+ case 8:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+bool8 sub_809B358(void)
+{
+ switch (gPokemonStorageSystemPtr->unk_11c0->pos2.y)
+ {
+ case 0:
+ return FALSE;
+ default:
+ gPokemonStorageSystemPtr->unk_11c0->pos2.y--;
+ break;
+ }
+ return TRUE;
+}
+
+void sub_809B384(void)
+{
+ switch (gUnknown_020384E4)
+ {
+ case 1:
+ sub_809B44C(14, gUnknown_020384E5);
+ sub_8099584(0, gUnknown_020384E5);
+ break;
+ case 0:
+ sub_809B44C(get_preferred_box(), gUnknown_020384E5);
+ sub_8099584(1, gUnknown_020384E5);
+ break;
+ default:
+ return;
+ }
+ gUnknown_020384E6 = TRUE;
+}
+
+void sub_809B3E0(void)
+{
+ u8 boxId;
+ switch (gUnknown_020384E4)
+ {
+ case 1:
+ diegohint2(14, gUnknown_020384E5);
+ sub_809960C(14, gUnknown_020384E5);
+ break;
+ case 0:
+ boxId = get_preferred_box();
+ diegohint2(boxId, gUnknown_020384E5);
+ sub_809960C(boxId, gUnknown_020384E5);
+ break;
+ default:
+ return;
+ }
+ gUnknown_020384E6 = FALSE;
+}
+
+void sub_809B440(void)
+{
+ sub_809BF74();
+}
+
+void sub_809B44C(u8 a0, u8 a1)
+{
+ if (a0 == 14)
+ gPokemonStorageSystemPtr->unk_25b4 = gPlayerParty[gUnknown_020384E5];
+ else
+ ExpandBoxMon(gPokemonStorage.boxes[a0] + a1, &gPokemonStorageSystemPtr->unk_25b4);
+ sub_809B548(a0, a1);
+ gUnknown_020384E7 = a0;
+ gUnknown_020384E8 = a1;
+}
+
+void diegohint2(u8 a0, u8 a1)
+{
+ if (a0 == 14)
+ {
+ gPlayerParty[a1] = gPokemonStorageSystemPtr->unk_25b4;
+ }
+ else
+ {
+ BoxMonRestorePP(&gPokemonStorageSystemPtr->unk_25b4.box);
+ gPokemonStorage.boxes[a0][a1] = gPokemonStorageSystemPtr->unk_25b4.box;
+ }
+}
+
+void sub_809B548(u8 a0, u8 a1)
+{
+ if (a0 == 14)
+ ZeroMonData(gPlayerParty + a1);
+ else
+ ZeroBoxMonData(gPokemonStorage.boxes[a0] + a1);
+}
+
+void diegohint1(u8 a0, u8 a1)
+{
+ if (a0 == 14)
+ gPokemonStorageSystemPtr->unk_2618 = gPlayerParty[a1];
+ else
+ ExpandBoxMon(gPokemonStorage.boxes[a0] + a1, &gPokemonStorageSystemPtr->unk_2618);
+ diegohint2(a0, a1);
+ gPokemonStorageSystemPtr->unk_25b4 = gPokemonStorageSystemPtr->unk_2618;
+ sub_809C04C(&gPokemonStorageSystemPtr->unk_25b4, 0);
+ gUnknown_020384E7 = a0;
+ gUnknown_020384E8 = a1;
+}
+
+bool8 sub_809B62C(u8 boxId)
+{
+ s16 monIdx = GetIndexOfFirstEmptySpaceInBoxN(boxId);
+ if (monIdx == -1)
+ return FALSE;
+ if (gUnknown_020384E6)
+ {
+ diegohint2(boxId, monIdx);
+ sub_8099480();
+ gUnknown_020384E6 = FALSE;
+ }
+ else
+ {
+ sub_809B44C(14, gUnknown_020384E5);
+ diegohint2(boxId, monIdx);
+ sub_8099520(gUnknown_020384E5);
+ }
+ if (boxId == get_preferred_box())
+ sub_8098D20(monIdx);
+ StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 1);
+ return TRUE;
+}
+
+void sub_809B6BC(void)
+{
+ StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 0);
+ sub_809BF74();
+}
+
+void sub_809B6DC(void)
+{
+ u8 mode;
+
+ if (gUnknown_020384E6)
+ mode = 2;
+ else if (gUnknown_020384E4 == 1)
+ mode = 0;
+ else
+ mode = 1;
+ sub_809981C(mode, gUnknown_020384E5);
+ StringCopy(gPokemonStorageSystemPtr->unk_26e4, gPokemonStorageSystemPtr->unk_11fa);
+}
+
+bool8 sub_809B734(void)
+{
+ if (!sub_80998D8())
+ {
+ StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 0);
+ return FALSE;
+ }
+ return TRUE;
+}
+
+void sub_809B760(void)
+{
+ sub_8099920();
+ if (gUnknown_020384E6)
+ gUnknown_020384E6 = FALSE;
+ else
+ {
+ u8 boxId;
+ if (gUnknown_020384E4 == 1)
+ boxId = 14;
+ else
+ boxId = get_preferred_box();
+ sub_809B548(boxId, gUnknown_020384E5);
+ }
+ sub_809BF74();
+}
+
+void sub_809B7AC(void)
+{
+ if (gUnknown_020384E6)
+ StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 3);
+}
+
+void sub_809B7D4(void)
+{
+ u16 knownMoves;
+ if (gUnknown_020384E6)
+ {
+ gPokemonStorageSystemPtr->unk_2618 = gPokemonStorageSystemPtr->unk_25b4;
+ gPokemonStorageSystemPtr->unk_2682 = -1;
+ gPokemonStorageSystemPtr->unk_2683 = -1;
+ }
+ else
+ {
+ if (gUnknown_020384E4 == 1)
+ {
+ gPokemonStorageSystemPtr->unk_2618 = gPlayerParty[gUnknown_020384E5];
+ gPokemonStorageSystemPtr->unk_2682 = 14;
+ }
+ else
+ {
+ ExpandBoxMon(gPokemonStorage.boxes[gPokemonStorage.currentBox] + gUnknown_020384E5, &gPokemonStorageSystemPtr->unk_2618);
+ gPokemonStorageSystemPtr->unk_2682 = gPokemonStorage.currentBox;
+ }
+ gPokemonStorageSystemPtr->unk_2683 = gUnknown_020384E5;
+ }
+ gPokemonStorageSystemPtr->unk_267e = 0;
+ gPokemonStorageSystemPtr->unk_267f = 0;
+ gPokemonStorageSystemPtr->unk_2686[0] = MOVE_SURF;
+ gPokemonStorageSystemPtr->unk_2686[1] = MOVE_DIVE;
+ gPokemonStorageSystemPtr->unk_2686[2] = NUM_MOVES;
+ knownMoves = GetMonData(&gPokemonStorageSystemPtr->unk_2618, MON_DATA_KNOWN_MOVES, gPokemonStorageSystemPtr->unk_2686);
+ gPokemonStorageSystemPtr->unk_267e = knownMoves & 1;
+ gPokemonStorageSystemPtr->unk_267f = (knownMoves >> 1) & 1;
+ if (gPokemonStorageSystemPtr->unk_267e || gPokemonStorageSystemPtr->unk_267f)
+ gPokemonStorageSystemPtr->unk_267d = 0;
+ else
+ {
+ gPokemonStorageSystemPtr->unk_267d = 1;
+ gPokemonStorageSystemPtr->unk_267c = 1;
+ }
+ gPokemonStorageSystemPtr->unk_2684 = 0;
+}
+
+s8 sub_809B960(void)
+{
+ u16 i;
+ u16 knownMoves;
+
+ if (gPokemonStorageSystemPtr->unk_267d)
+ return gPokemonStorageSystemPtr->unk_267c;
+ switch (gPokemonStorageSystemPtr->unk_2684)
+ {
+ case 0:
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ if (gPokemonStorageSystemPtr->unk_2682 != 14 || gPokemonStorageSystemPtr->unk_2683 != i)
+ {
+ knownMoves = GetMonData(gPlayerParty + i, MON_DATA_KNOWN_MOVES, gPokemonStorageSystemPtr->unk_2686);
+ if (knownMoves & 1)
+ gPokemonStorageSystemPtr->unk_267e = 0;
+ if (knownMoves & 2)
+ gPokemonStorageSystemPtr->unk_267f = 0;
+ }
+ }
+ if (gPokemonStorageSystemPtr->unk_267e == 0 && gPokemonStorageSystemPtr->unk_267f == 0)
+ {
+ gPokemonStorageSystemPtr->unk_267d = 1;
+ gPokemonStorageSystemPtr->unk_267c = 1;
+ }
+ else
+ {
+ gPokemonStorageSystemPtr->unk_2680 = 0;
+ gPokemonStorageSystemPtr->unk_2681 = 0;
+ gPokemonStorageSystemPtr->unk_2684++;
+ }
+ break;
+ case 1:
+ for (i = 0; i < 5; i++)
+ {
+ knownMoves = GetBoxMonData(gPokemonStorage.boxes[gPokemonStorageSystemPtr->unk_2680] + gPokemonStorageSystemPtr->unk_2681, MON_DATA_KNOWN_MOVES, gPokemonStorageSystemPtr->unk_2686);
+ if (knownMoves && (gPokemonStorageSystemPtr->unk_2682 != gPokemonStorageSystemPtr->unk_2680 || gPokemonStorageSystemPtr->unk_2683 != gPokemonStorageSystemPtr->unk_2681))
+ {
+ if (knownMoves & 1)
+ gPokemonStorageSystemPtr->unk_267e = 0;
+ if (knownMoves & 2)
+ gPokemonStorageSystemPtr->unk_267f = 0;
+ }
+ if (++gPokemonStorageSystemPtr->unk_2681 >= 30)
+ {
+ gPokemonStorageSystemPtr->unk_2681 = 0;
+ if (++gPokemonStorageSystemPtr->unk_2680 >= 14)
+ {
+ gPokemonStorageSystemPtr->unk_267d = 1;
+ gPokemonStorageSystemPtr->unk_267c = 0;
+ break;
+ }
+ }
+ }
+ if (gPokemonStorageSystemPtr->unk_267e == 0 && gPokemonStorageSystemPtr->unk_267f == 0)
+ {
+ gPokemonStorageSystemPtr->unk_267d = 1;
+ gPokemonStorageSystemPtr->unk_267c = 1;
+ }
+ break;
+ }
+ return -1;
+}
+
+void sub_809BB90(void)
+{
+ if (gUnknown_020384E6)
+ gUnknown_02038480 = gPokemonStorageSystemPtr->unk_25b4;
+}
+
+void sub_809BBC0(void)
+{
+ if (gUnknown_020384E6)
+ {
+ if (gUnknown_020384E7 == 14)
+ gPokemonStorageSystemPtr->unk_25b4 = gUnknown_02038480;
+ else
+ gPokemonStorageSystemPtr->unk_25b4.box = gUnknown_02038480.box;
+ }
+}
+
+void sub_809BC18(void)
+{
+ if (gUnknown_020384E6)
+ {
+ sub_809BB90();
+ gPokemonStorageSystemPtr->unk_2690.pokemon = &gUnknown_02038480;
+ gPokemonStorageSystemPtr->unk_268d = 0;
+ gPokemonStorageSystemPtr->unk_268c = 0;
+ gPokemonStorageSystemPtr->unk_268e = 0;
+ }
+ else if (gUnknown_020384E4 == 1)
+ {
+ gPokemonStorageSystemPtr->unk_2690.pokemon = gPlayerParty;
+ gPokemonStorageSystemPtr->unk_268d = gUnknown_020384E5;
+ gPokemonStorageSystemPtr->unk_268c = StorageSystemGetPartySize() - 1;
+ gPokemonStorageSystemPtr->unk_268e = 0;
+ }
+ else
+ {
+ gPokemonStorageSystemPtr->unk_2690.box = gPokemonStorage.boxes[gPokemonStorage.currentBox];
+ gPokemonStorageSystemPtr->unk_268d = gUnknown_020384E5;
+ gPokemonStorageSystemPtr->unk_268c = 30 - 1;
+ gPokemonStorageSystemPtr->unk_268e = 5;
+ }
+}
+
+void sub_809BD14(void)
+{
+ if (gUnknown_020384E6)
+ sub_809BBC0();
+ else
+ gUnknown_020384E5 = pssData.monIndex;
+}
+
+s16 party_compaction(void)
+{
+ s16 retVal = -1;
+ u16 i;
+ u16 last;
+
+ for (i = 0, last = 0; i < PARTY_SIZE; i++)
+ {
+ if ((u16)GetMonData(gPlayerParty + i, MON_DATA_SPECIES) != SPECIES_NONE)
+ {
+ if (i != last)
+ gPlayerParty[last] = gPlayerParty[i];
+ last++;
+ }
+ else if (retVal == -1)
+ retVal = i;
+ }
+ for (; last < PARTY_SIZE; last++)
+ ZeroMonData(gPlayerParty + last);
+ return retVal;
+}
+
+void sub_809BDD8(u8 markings)
+{
+ gPokemonStorageSystemPtr->unk_11f7 = markings;
+ if (gUnknown_020384E6)
+ SetMonData(&gPokemonStorageSystemPtr->unk_25b4, MON_DATA_MARKINGS, &markings);
+ else
+ {
+ if (gUnknown_020384E4 == 1)
+ SetMonData(gPlayerParty + gUnknown_020384E5, MON_DATA_MARKINGS, &markings);
+ if (gUnknown_020384E4 == 0)
+ SetBoxMonData(gPokemonStorage.boxes[get_preferred_box()] + gUnknown_020384E5, MON_DATA_MARKINGS, &markings);
+ }
+}
+
+bool8 sub_809BE80(void)
+{
+ if (gUnknown_020384E4 == 1 && !gUnknown_020384E6 && CountAlivePartyMonsExceptOne(gUnknown_020384E5) == 0)
+ return TRUE;
+ return FALSE;
+}
+
+bool8 sub_809BEBC(void)
+{
+ if (gUnknown_020384E6)
+ {
+ if (gUnknown_020384E4 == 1 && CountAlivePartyMonsExceptOne(gUnknown_020384E5) == 0)
+ {
+ if (gPokemonStorageSystemPtr->unk_11f9 || GetMonData(&gPokemonStorageSystemPtr->unk_25b4, MON_DATA_HP) == 0)
+ return FALSE;
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_809BF20(void)
+{
+ return gUnknown_020384E6;
+}
+
+bool8 sub_809BF2C(void)
+{
+ return gUnknown_020384E4 == 2 ? TRUE : FALSE;
+}
+
+bool8 sub_809BF48(void)
+{
+ return (gUnknown_020384E4 == 3 && gUnknown_020384E5 == 1) ? TRUE : FALSE;
+}
+
+void sub_809BF74(void)
+{
+ gPokemonStorageSystemPtr->unk_11f6 = gUnknown_020384E6 ? 0 : 1;
+ if (!gUnknown_020384E6)
+ {
+ switch (gUnknown_020384E4)
+ {
+ case 1:
+ if (gUnknown_020384E5 < PARTY_SIZE)
+ {
+ sub_809C04C(gPlayerParty + gUnknown_020384E5, 0);
+ break;
+ }
+ // fallthrough
+ case 2:
+ case 3:
+ sub_809C04C(NULL, 2);
+ break;
+ case 0:
+ sub_809C04C(gPokemonStorage.boxes[get_preferred_box()] + gUnknown_020384E5, 1);
+ break;
+ }
+ }
+}
+
+void sub_809C028(void)
+{
+ if (gUnknown_020384E6)
+ sub_809C04C(&gUnknown_02038480.box, 0);
+ else
+ sub_809BF74();
+}
+
+void sub_809C04C(void *pokemon, u8 a1)
+{
+ u8 *buf;
+ u16 gender = MON_MALE;
+ gPokemonStorageSystemPtr->unk_11f2 = 0;
+ if (a1 == 0)
+ {
+ struct Pokemon *pkmn = (struct Pokemon *)pokemon;
+ gPokemonStorageSystemPtr->unk_11f0 = GetMonData(pokemon, MON_DATA_SPECIES2);
+ if (gPokemonStorageSystemPtr->unk_11f0 != SPECIES_NONE)
+ {
+ gPokemonStorageSystemPtr->unk_11f9 = GetMonData(pkmn, MON_DATA_IS_EGG);
+ GetMonData(pkmn, MON_DATA_NICKNAME, gPokemonStorageSystemPtr->unk_11fa);
+ StringGetEnd10(gPokemonStorageSystemPtr->unk_11fa);
+ gPokemonStorageSystemPtr->unk_11f8 = GetMonData(pkmn, MON_DATA_LEVEL);
+ gPokemonStorageSystemPtr->unk_11f7 = GetMonData(pkmn, MON_DATA_MARKINGS);
+ gPokemonStorageSystemPtr->unk_11ec = GetMonData(pkmn, MON_DATA_PERSONALITY);
+ gPokemonStorageSystemPtr->unk_11e8 = GetMonSpritePal(pkmn);
+ gender = GetMonGender(pkmn);
+ gPokemonStorageSystemPtr->unk_11f2 = GetMonData(pkmn, MON_DATA_HELD_ITEM);
+ }
+ }
+ else if (a1 == 1)
+ {
+ struct BoxPokemon *boxmon = (struct BoxPokemon *)pokemon;
+ gPokemonStorageSystemPtr->unk_11f0 = GetBoxMonData(pokemon, MON_DATA_SPECIES2);
+ if (gPokemonStorageSystemPtr->unk_11f0 != SPECIES_NONE)
+ {
+ u32 otId = GetBoxMonData(boxmon, MON_DATA_OT_ID);
+ gPokemonStorageSystemPtr->unk_11f9 = GetBoxMonData(boxmon, MON_DATA_IS_EGG);
+ GetBoxMonData(boxmon, MON_DATA_NICKNAME, gPokemonStorageSystemPtr->unk_11fa);
+ StringGetEnd10(gPokemonStorageSystemPtr->unk_11fa);
+ gPokemonStorageSystemPtr->unk_11f8 = GetLevelFromBoxMonExp(boxmon);
+ gPokemonStorageSystemPtr->unk_11f7 = GetBoxMonData(boxmon, MON_DATA_MARKINGS);
+ gPokemonStorageSystemPtr->unk_11ec = GetBoxMonData(boxmon, MON_DATA_PERSONALITY);
+ gPokemonStorageSystemPtr->unk_11e8 = GetMonSpritePalFromOtIdPersonality(gPokemonStorageSystemPtr->unk_11f0, otId, gPokemonStorageSystemPtr->unk_11ec);
+ gender = GetGenderFromSpeciesAndPersonality(gPokemonStorageSystemPtr->unk_11f0, gPokemonStorageSystemPtr->unk_11ec);
+ gPokemonStorageSystemPtr->unk_11f2 = GetBoxMonData(boxmon, MON_DATA_HELD_ITEM);
+ }
+ }
+ else
+ {
+ gPokemonStorageSystemPtr->unk_11f0 = SPECIES_NONE;
+ }
+ if (gPokemonStorageSystemPtr->unk_11f0 == SPECIES_NONE)
+ {
+ gPokemonStorageSystemPtr->unk_11fa[0] = EOS;
+ gPokemonStorageSystemPtr->unk_120f[0] = EOS;
+ gPokemonStorageSystemPtr->unk_1234[0] = EOS;
+ gPokemonStorageSystemPtr->unk_1259[0] = EOS;
+ gPokemonStorageSystemPtr->unk_127a[0] = EOS;
+ }
+ else if (gPokemonStorageSystemPtr->unk_11f9)
+ {
+ buf = gPokemonStorageSystemPtr->unk_120f;
+ buf[0] = EXT_CTRL_CODE_BEGIN;
+ buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW
+ buf[2] = 0x0F; // WHITE2
+ buf[3] = 0x00; // TRANSPARENT
+ buf[4] = 0x01; // DARK_GREY
+ buf = gPokemonStorageSystemPtr->unk_120f + 5;
+ buf = StringCopy(buf, gPokemonStorageSystemPtr->unk_11fa);
+ gPokemonStorageSystemPtr->unk_1234[0] = EOS;
+ gPokemonStorageSystemPtr->unk_1259[0] = EOS;
+ gPokemonStorageSystemPtr->unk_127a[0] = EOS;
+ }
+ else
+ {
+ if (gPokemonStorageSystemPtr->unk_11f0 == SPECIES_NIDORAN_M || gPokemonStorageSystemPtr->unk_11f0 == SPECIES_NIDORAN_F)
+ gender = MON_GENDERLESS;
+ buf = gPokemonStorageSystemPtr->unk_120f;
+ buf[0] = EXT_CTRL_CODE_BEGIN;
+ buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW
+ buf[2] = 0x0F; // WHITE2
+ buf[3] = 0x00; // TRANSPARENT
+ buf[4] = 0x01; // DARK_GREY
+ buf = gPokemonStorageSystemPtr->unk_120f + 5;
+ buf = StringCopy(buf, gPokemonStorageSystemPtr->unk_11fa);
+ buf = gPokemonStorageSystemPtr->unk_1234;
+ buf[0] = EXT_CTRL_CODE_BEGIN;
+ buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW
+ buf[2] = 0x0F; // WHITE2
+ buf[3] = 0x00; // TRANSPARENT
+ buf[4] = 0x01; // DARK_GREY
+ buf[5] = EXT_CTRL_CODE_BEGIN;
+ buf[6] = 0x13; // CLEAR_TO
+ buf[7] = 7;
+ buf[8] = CHAR_SLASH;
+ buf = gPokemonStorageSystemPtr->unk_1234 + 9;
+ buf = StringCopy(buf, gSpeciesNames[gPokemonStorageSystemPtr->unk_11f0]);
+ buf[0] = EXT_CTRL_CODE_BEGIN;
+ buf[1] = 0x13; // CLEAR_TO
+ buf[2] = 0x50;
+ buf[3] = EOS;
+ buf = gPokemonStorageSystemPtr->unk_1259;
+ buf[0] = EXT_CTRL_CODE_BEGIN;
+ buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW
+ buf[2] = 0x0F; // WHITE2
+ buf[3] = 0x00; // TRANSPARENT
+ buf[4] = 0x01; // DARK_GREY
+ buf[5] = EXT_CTRL_CODE_BEGIN;
+ buf[6] = 0x13; // CLEAR_TO
+ buf[7] = 8;
+ buf = gPokemonStorageSystemPtr->unk_1259 + 8;
+ buf[0] = 0x34; // LV
+ buf = gPokemonStorageSystemPtr->unk_1259 + 9;
+ buf = sub_8072C14(buf, gPokemonStorageSystemPtr->unk_11f8, 0x22, STR_CONV_MODE_RIGHT_ALIGN);
+ buf[0] = EXT_CTRL_CODE_BEGIN;
+ buf[1] = 0x11; // CLEAR
+ buf[2] = 8;
+ buf += 3;
+ switch (gender)
+ {
+ case MON_MALE:
+ buf[0] = EXT_CTRL_CODE_BEGIN;
+ buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW
+ buf[2] = 0x04; // BLUE
+ buf[3] = 0x00; // TRANSPARENT
+ buf[4] = 0x05; // YELLOW
+ buf[5] = CHAR_MALE;
+ buf += 6;
+ break;
+ case MON_FEMALE:
+ buf[0] = EXT_CTRL_CODE_BEGIN;
+ buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW
+ buf[2] = 0x06; // CYAN
+ buf[3] = 0x00; // TRANSPARENT
+ buf[4] = 0x07; // MAGENTA
+ buf[5] = CHAR_FEMALE;
+ buf += 6;
+ break;
+ }
+ buf[0] = EOS;
+ buf = gPokemonStorageSystemPtr->unk_127a;
+ if (gPokemonStorageSystemPtr->unk_11f2)
+ {
+ buf[0] = EXT_CTRL_CODE_BEGIN;
+ buf[1] = 0x04; // COLOR_HIGHLIGHT_SHADOW
+ buf[2] = 0x0F; // WHITE2
+ buf[3] = 0x00; // TRANSPARENT
+ buf[4] = 0x01; // DARK_GREY
+ buf = gPokemonStorageSystemPtr->unk_127a + 5;
+ buf[0] = EXT_CTRL_CODE_BEGIN;
+ buf[1] = 0x06; // size
+ buf[2] = 0x04;
+ buf = gPokemonStorageSystemPtr->unk_127a + 8;
+ buf = StringCopy(buf, ItemId_GetName(gPokemonStorageSystemPtr->unk_11f2));
+ buf[0] = EXT_CTRL_CODE_BEGIN;
+ buf[1] = 0x07; // UNKNOWN_7;
+ buf += 2;
+ }
+ buf[0] = EOS;
+ }
+}
+
+#ifdef NONMATCHING
+u8 sub_809C464(void)
+{
+ u8 r9;
+ s8 r8 = gUnknown_020384E4;
+ s8 r4 = gUnknown_020384E5;
+ gPokemonStorageSystemPtr->unk_11de = 0;
+ gPokemonStorageSystemPtr->unk_11df = 0;
+ gPokemonStorageSystemPtr->unk_11e3 = 0;
+ if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ r9 = 1;
+ if (gUnknown_020384E5 >= 6)
+ {
+ r4 -= 6;
+ }
+ else
+ {
+ r8 = 2;
+ r4 = 0;
+ }
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ r9 = 1;
+ r4 += 6;
+ if (r4 >= 30)
+ {
+ r8 = 3;
+ r4 -= 30;
+ r4 /= 3;
+ gPokemonStorageSystemPtr->unk_11de = 1;
+ gPokemonStorageSystemPtr->unk_11e3 = 1;
+ }
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_LEFT)
+ {
+ r9 = 1;
+ if (gUnknown_020384E5 % 6)
+ r4--;
+ else
+ {
+ gPokemonStorageSystemPtr->unk_11df = -1;
+ r4 += 5;
+ }
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
+ {
+ r9 = 1;
+ if ((gUnknown_020384E5 + 1) % 6)
+ r4++;
+ else
+ {
+ gPokemonStorageSystemPtr->unk_11df = 1;
+ r4 -= 5;
+ }
+ }
+ else if (gMain.newKeys & START_BUTTON)
+ {
+ r9 = 1;
+ r8 = 2;
+ r4 = 0;
+ }
+ else
+ {
+ if ((gMain.newKeys & A_BUTTON) && sub_809CAB0())
+ {
+ if (gUnknown_020384E9 == 0)
+ return 8;
+ switch (sub_809CE4C(0))
+ {
+ case 1:
+ return 11;
+ case 2:
+ return 12;
+ case 3:
+ return 13;
+ case 4:
+ return 14;
+ case 5:
+ return 15;
+ }
+ }
+ if (gMain.newKeys & B_BUTTON)
+ return 16;
+ if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR)
+ {
+ if (gMain.heldKeys & L_BUTTON)
+ return 10;
+ if (gMain.heldKeys & R_BUTTON)
+ return 9;
+ }
+ if (gMain.newKeys & SELECT_BUTTON)
+ {
+ sub_809CD88();
+ return 0;
+ }
+ r9 = 0;
+ }
+ if (r9)
+ sub_809AF18(r8, r4);
+ return r9;
+}
+#else
+__attribute__((naked)) u8 sub_809C464(void)
+{
+ asm_unified("\tpush {r4-r7,lr}\n"
+ "\tmov r7, r9\n"
+ "\tmov r6, r8\n"
+ "\tpush {r6,r7}\n"
+ "\tldr r0, _0809C4D8 @ =gUnknown_020384E4\n"
+ "\tldrb r0, [r0]\n"
+ "\tmov r8, r0\n"
+ "\tldr r2, _0809C4DC @ =gUnknown_020384E5\n"
+ "\tldrb r4, [r2]\n"
+ "\tldr r0, _0809C4E0 @ =gPokemonStorageSystemPtr\n"
+ "\tldr r1, [r0]\n"
+ "\tldr r0, _0809C4E4 @ =0x000011de\n"
+ "\tadds r7, r1, r0\n"
+ "\tmovs r0, 0\n"
+ "\tstrb r0, [r7]\n"
+ "\tldr r3, _0809C4E8 @ =0x000011df\n"
+ "\tadds r5, r1, r3\n"
+ "\tstrb r0, [r5]\n"
+ "\tadds r3, 0x4\n"
+ "\tadds r6, r1, r3\n"
+ "\tstrb r0, [r6]\n"
+ "\tldr r0, _0809C4EC @ =gMain\n"
+ "\tmov r12, r0\n"
+ "\tldrh r1, [r0, 0x30]\n"
+ "\tmovs r0, 0x40\n"
+ "\tands r0, r1\n"
+ "\tadds r3, r2, 0\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0809C4A0\n"
+ "\tb _0809C62A\n"
+ "_0809C4A0:\n"
+ "\tmovs r0, 0x80\n"
+ "\tands r0, r1\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0809C4F0\n"
+ "\tmovs r1, 0x1\n"
+ "\tmov r9, r1\n"
+ "\tlsls r0, r4, 24\n"
+ "\tmovs r3, 0xC0\n"
+ "\tlsls r3, 19\n"
+ "\tadds r0, r3\n"
+ "\tlsrs r4, r0, 24\n"
+ "\tasrs r0, 24\n"
+ "\tcmp r0, 0x1D\n"
+ "\tbgt _0809C4BE\n"
+ "\tb _0809C648\n"
+ "_0809C4BE:\n"
+ "\tmovs r1, 0x3\n"
+ "\tmov r8, r1\n"
+ "\tsubs r0, 0x1E\n"
+ "\tlsls r0, 24\n"
+ "\tasrs r0, 24\n"
+ "\tbl __divsi3\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r4, r0, 24\n"
+ "\tmov r3, r9\n"
+ "\tstrb r3, [r7]\n"
+ "\tstrb r3, [r6]\n"
+ "\tb _0809C648\n"
+ "\t.align 2, 0\n"
+ "_0809C4D8: .4byte gUnknown_020384E4\n"
+ "_0809C4DC: .4byte gUnknown_020384E5\n"
+ "_0809C4E0: .4byte gPokemonStorageSystemPtr\n"
+ "_0809C4E4: .4byte 0x000011de\n"
+ "_0809C4E8: .4byte 0x000011df\n"
+ "_0809C4EC: .4byte gMain\n"
+ "_0809C4F0:\n"
+ "\tmovs r0, 0x20\n"
+ "\tands r0, r1\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0809C524\n"
+ "\tmovs r0, 0x1\n"
+ "\tmov r9, r0\n"
+ "\tmovs r0, 0\n"
+ "\tldrsb r0, [r3, r0]\n"
+ "\tmovs r1, 0x6\n"
+ "\tbl __modsi3\n"
+ "\tlsls r0, 24\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0809C514\n"
+ "\tlsls r0, r4, 24\n"
+ "\tmovs r1, 0xFF\n"
+ "\tlsls r1, 24\n"
+ "\tb _0809C63C\n"
+ "_0809C514:\n"
+ "\tmovs r0, 0xFF\n"
+ "\tstrb r0, [r5]\n"
+ "\tlsls r0, r4, 24\n"
+ "\tmovs r3, 0xA0\n"
+ "\tlsls r3, 19\n"
+ "\tadds r0, r3\n"
+ "\tlsrs r4, r0, 24\n"
+ "\tb _0809C648\n"
+ "_0809C524:\n"
+ "\tmovs r0, 0x10\n"
+ "\tands r0, r1\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0809C554\n"
+ "\tmovs r0, 0x1\n"
+ "\tmov r9, r0\n"
+ "\tmovs r0, 0\n"
+ "\tldrsb r0, [r3, r0]\n"
+ "\tadds r0, 0x1\n"
+ "\tmovs r1, 0x6\n"
+ "\tbl __modsi3\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0809C548\n"
+ "\tlsls r0, r4, 24\n"
+ "\tmovs r1, 0x80\n"
+ "\tlsls r1, 17\n"
+ "\tb _0809C63C\n"
+ "_0809C548:\n"
+ "\tmov r3, r9\n"
+ "\tstrb r3, [r5]\n"
+ "\tlsls r0, r4, 24\n"
+ "\tmovs r1, 0xFB\n"
+ "\tlsls r1, 24\n"
+ "\tb _0809C63C\n"
+ "_0809C554:\n"
+ "\tmov r3, r12\n"
+ "\tldrh r1, [r3, 0x2E]\n"
+ "\tmovs r0, 0x8\n"
+ "\tands r0, r1\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0809C56A\n"
+ "\tmovs r0, 0x1\n"
+ "\tmov r9, r0\n"
+ "\tmovs r1, 0x2\n"
+ "\tmov r8, r1\n"
+ "\tb _0809C646\n"
+ "_0809C56A:\n"
+ "\tmovs r0, 0x1\n"
+ "\tands r0, r1\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0809C5D4\n"
+ "\tbl sub_809CAB0\n"
+ "\tlsls r0, 24\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0809C5D4\n"
+ "\tldr r0, _0809C588 @ =gUnknown_020384E9\n"
+ "\tldrb r0, [r0]\n"
+ "\tcmp r0, 0\n"
+ "\tbne _0809C58C\n"
+ "\tmovs r0, 0x8\n"
+ "\tb _0809C658\n"
+ "\t.align 2, 0\n"
+ "_0809C588: .4byte gUnknown_020384E9\n"
+ "_0809C58C:\n"
+ "\tmovs r0, 0\n"
+ "\tbl sub_809CE4C\n"
+ "\tsubs r0, 0x1\n"
+ "\tlsls r0, 24\n"
+ "\tasrs r0, 24\n"
+ "\tcmp r0, 0x4\n"
+ "\tbhi _0809C5D4\n"
+ "\tlsls r0, 2\n"
+ "\tldr r1, _0809C5A8 @ =_0809C5AC\n"
+ "\tadds r0, r1\n"
+ "\tldr r0, [r0]\n"
+ "\tmov pc, r0\n"
+ "\t.align 2, 0\n"
+ "_0809C5A8: .4byte _0809C5AC\n"
+ "\t.align 2, 0\n"
+ "_0809C5AC:\n"
+ "\t.4byte _0809C5C0\n"
+ "\t.4byte _0809C5C4\n"
+ "\t.4byte _0809C5C8\n"
+ "\t.4byte _0809C5CC\n"
+ "\t.4byte _0809C5D0\n"
+ "_0809C5C0:\n"
+ "\tmovs r0, 0xB\n"
+ "\tb _0809C658\n"
+ "_0809C5C4:\n"
+ "\tmovs r0, 0xC\n"
+ "\tb _0809C658\n"
+ "_0809C5C8:\n"
+ "\tmovs r0, 0xD\n"
+ "\tb _0809C658\n"
+ "_0809C5CC:\n"
+ "\tmovs r0, 0xE\n"
+ "\tb _0809C658\n"
+ "_0809C5D0:\n"
+ "\tmovs r0, 0xF\n"
+ "\tb _0809C658\n"
+ "_0809C5D4:\n"
+ "\tldr r2, _0809C5E4 @ =gMain\n"
+ "\tldrh r1, [r2, 0x2E]\n"
+ "\tmovs r0, 0x2\n"
+ "\tands r0, r1\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0809C5E8\n"
+ "\tmovs r0, 0x10\n"
+ "\tb _0809C658\n"
+ "\t.align 2, 0\n"
+ "_0809C5E4: .4byte gMain\n"
+ "_0809C5E8:\n"
+ "\tldr r0, _0809C600 @ =gSaveBlock2\n"
+ "\tldrb r0, [r0, 0x13]\n"
+ "\tcmp r0, 0x1\n"
+ "\tbne _0809C612\n"
+ "\tldrh r1, [r2, 0x2C]\n"
+ "\tmovs r0, 0x80\n"
+ "\tlsls r0, 2\n"
+ "\tands r0, r1\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0809C604\n"
+ "\tmovs r0, 0xA\n"
+ "\tb _0809C658\n"
+ "\t.align 2, 0\n"
+ "_0809C600: .4byte gSaveBlock2\n"
+ "_0809C604:\n"
+ "\tmovs r0, 0x80\n"
+ "\tlsls r0, 1\n"
+ "\tands r0, r1\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0809C612\n"
+ "\tmovs r0, 0x9\n"
+ "\tb _0809C658\n"
+ "_0809C612:\n"
+ "\tldrh r1, [r2, 0x2E]\n"
+ "\tmovs r0, 0x4\n"
+ "\tands r0, r1\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0809C624\n"
+ "\tbl sub_809CD88\n"
+ "\tmovs r0, 0\n"
+ "\tb _0809C658\n"
+ "_0809C624:\n"
+ "\tmovs r3, 0\n"
+ "\tmov r9, r3\n"
+ "\tb _0809C656\n"
+ "_0809C62A:\n"
+ "\tmovs r0, 0x1\n"
+ "\tmov r9, r0\n"
+ "\tmovs r0, 0\n"
+ "\tldrsb r0, [r2, r0]\n"
+ "\tcmp r0, 0x5\n"
+ "\tble _0809C642\n"
+ "\tlsls r0, r4, 24\n"
+ "\tmovs r1, 0xFA\n"
+ "\tlsls r1, 24\n"
+ "_0809C63C:\n"
+ "\tadds r0, r1\n"
+ "\tlsrs r4, r0, 24\n"
+ "\tb _0809C648\n"
+ "_0809C642:\n"
+ "\tmovs r3, 0x2\n"
+ "\tmov r8, r3\n"
+ "_0809C646:\n"
+ "\tmovs r4, 0\n"
+ "_0809C648:\n"
+ "\tmov r0, r9\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0809C656\n"
+ "\tmov r0, r8\n"
+ "\tadds r1, r4, 0\n"
+ "\tbl sub_809AF18\n"
+ "_0809C656:\n"
+ "\tmov r0, r9\n"
+ "_0809C658:\n"
+ "\tpop {r3,r4}\n"
+ "\tmov r8, r3\n"
+ "\tmov r9, r4\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r1}\n"
+ "\tbx r1");
+}
+#endif
+
+#ifdef NONMATCHING
+u8 sub_809C664(void)
+{
+ s8 r10 = gUnknown_020384E4;
+ s8 r4 = gUnknown_020384E5;
+ u8 r8;
+ u8 r9;
+
+ gPokemonStorageSystemPtr->unk_11df = 0;
+ gPokemonStorageSystemPtr->unk_11de = 0;
+ gPokemonStorageSystemPtr->unk_11e3 = 0;
+ r9 = FALSE;
+ r8 = 0;
+ if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ if (--r4 < 0)
+ r4 = 6;
+ if (r4 != gUnknown_020384E5)
+ r8 = 1;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ if (++r4 > 6)
+ r4 = 0;
+ if (r4 != gUnknown_020384E5)
+ r8 = 1;
+ }
+ else if ((gMain.newAndRepeatedKeys & DPAD_LEFT) && gUnknown_020384E5)
+ {
+ r8 = 1;
+ gPokemonStorageSystemPtr->unk_11e2 = gUnknown_020384E5;
+ r4 = 0;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
+ {
+ if (gUnknown_020384E5 == 0)
+ {
+ r8 = 1;
+ r4 = gPokemonStorageSystemPtr->unk_11e2;
+ }
+ else
+ {
+ r8 = 6;
+ r10 = 0;
+ r4 = 0;
+ }
+ }
+ else
+ {
+ if (gMain.newKeys & A_BUTTON)
+ {
+ if (gUnknown_020384E5 == 6)
+ {
+ if (gPokemonStorageSystemPtr->unk_0005 == 1)
+ return 4;
+ r9 = TRUE;
+ }
+ else if (sub_809CAB0())
+ {
+ if (gUnknown_020384E9 == 0)
+ return 8;
+ switch (sub_809CE4C(0))
+ {
+ case 1:
+ return 11;
+ case 2:
+ return 12;
+ case 3:
+ return 13;
+ case 4:
+ return 14;
+ case 5:
+ return 15;
+ }
+ }
+ }
+ if (gMain.newKeys & B_BUTTON)
+ {
+ if (gPokemonStorageSystemPtr->unk_0005 == 1)
+ return 16;
+ r9 = TRUE;
+ }
+ if (!r9)
+ {
+ r8 = 6;
+ r10 = 0;
+ r4 = 0;
+ }
+ else if (gMain.newKeys & SELECT_BUTTON)
+ {
+ sub_809CD88();
+ return 0;
+ }
+ }
+ if (r8)
+ sub_809AF18(r10, r4);
+ return r8;
+}
+#else
+__attribute__((naked)) u8 sub_809C664(void)
+{
+ asm_unified("\tpush {r4-r7,lr}\n"
+ "\tmov r7, r10\n"
+ "\tmov r6, r9\n"
+ "\tmov r5, r8\n"
+ "\tpush {r5-r7}\n"
+ "\tldr r0, _0809C6D8 @ =gUnknown_020384E4\n"
+ "\tldrb r0, [r0]\n"
+ "\tmov r10, r0\n"
+ "\tldr r7, _0809C6DC @ =gUnknown_020384E5\n"
+ "\tldrb r4, [r7]\n"
+ "\tldr r2, _0809C6E0 @ =gPokemonStorageSystemPtr\n"
+ "\tldr r5, [r2]\n"
+ "\tldr r1, _0809C6E4 @ =0x000011df\n"
+ "\tadds r0, r5, r1\n"
+ "\tmovs r1, 0\n"
+ "\tstrb r1, [r0]\n"
+ "\tldr r3, _0809C6E8 @ =0x000011de\n"
+ "\tadds r0, r5, r3\n"
+ "\tstrb r1, [r0]\n"
+ "\tadds r3, 0x5\n"
+ "\tadds r0, r5, r3\n"
+ "\tstrb r1, [r0]\n"
+ "\tmov r9, r1\n"
+ "\tmov r8, r1\n"
+ "\tldr r1, _0809C6EC @ =gMain\n"
+ "\tldrh r3, [r1, 0x30]\n"
+ "\tmovs r0, 0x40\n"
+ "\tands r0, r3\n"
+ "\tadds r6, r7, 0\n"
+ "\tmov r12, r2\n"
+ "\tadds r2, r1, 0\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0809C6A8\n"
+ "\tb _0809C81C\n"
+ "_0809C6A8:\n"
+ "\tmovs r0, 0x80\n"
+ "\tands r0, r3\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0809C6F0\n"
+ "\tlsls r0, r4, 24\n"
+ "\tmovs r1, 0x80\n"
+ "\tlsls r1, 17\n"
+ "\tadds r0, r1\n"
+ "\tlsrs r4, r0, 24\n"
+ "\tasrs r0, 24\n"
+ "\tcmp r0, 0x6\n"
+ "\tble _0809C6C2\n"
+ "\tmovs r4, 0\n"
+ "_0809C6C2:\n"
+ "\tlsls r0, r4, 24\n"
+ "\tasrs r0, 24\n"
+ "\tmovs r1, 0\n"
+ "\tldrsb r1, [r6, r1]\n"
+ "\tcmp r0, r1\n"
+ "\tbne _0809C6D0\n"
+ "\tb _0809C83C\n"
+ "_0809C6D0:\n"
+ "\tmovs r2, 0x1\n"
+ "\tmov r8, r2\n"
+ "\tb _0809C842\n"
+ "\t.align 2, 0\n"
+ "_0809C6D8: .4byte gUnknown_020384E4\n"
+ "_0809C6DC: .4byte gUnknown_020384E5\n"
+ "_0809C6E0: .4byte gPokemonStorageSystemPtr\n"
+ "_0809C6E4: .4byte 0x000011df\n"
+ "_0809C6E8: .4byte 0x000011de\n"
+ "_0809C6EC: .4byte gMain\n"
+ "_0809C6F0:\n"
+ "\tmovs r0, 0x20\n"
+ "\tands r0, r3\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0809C714\n"
+ "\tldrb r1, [r6]\n"
+ "\tmovs r0, 0\n"
+ "\tldrsb r0, [r6, r0]\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0809C714\n"
+ "\tmovs r3, 0x1\n"
+ "\tmov r8, r3\n"
+ "\tldr r2, _0809C710 @ =0x000011e2\n"
+ "\tadds r0, r5, r2\n"
+ "\tstrb r1, [r0]\n"
+ "\tmovs r4, 0\n"
+ "\tb _0809C83C\n"
+ "\t.align 2, 0\n"
+ "_0809C710: .4byte 0x000011e2\n"
+ "_0809C714:\n"
+ "\tldrh r1, [r2, 0x30]\n"
+ "\tmovs r0, 0x10\n"
+ "\tands r0, r1\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0809C748\n"
+ "\tmovs r0, 0\n"
+ "\tldrsb r0, [r6, r0]\n"
+ "\tcmp r0, 0\n"
+ "\tbne _0809C73C\n"
+ "\tmovs r3, 0x1\n"
+ "\tmov r8, r3\n"
+ "\tmov r1, r12\n"
+ "\tldr r0, [r1]\n"
+ "\tldr r2, _0809C738 @ =0x000011e2\n"
+ "\tadds r0, r2\n"
+ "\tldrb r4, [r0]\n"
+ "\tb _0809C83C\n"
+ "\t.align 2, 0\n"
+ "_0809C738: .4byte 0x000011e2\n"
+ "_0809C73C:\n"
+ "\tmovs r3, 0x6\n"
+ "\tmov r8, r3\n"
+ "\tmovs r0, 0\n"
+ "\tmov r10, r0\n"
+ "\tmovs r4, 0\n"
+ "\tb _0809C83C\n"
+ "_0809C748:\n"
+ "\tldrh r1, [r2, 0x2E]\n"
+ "\tmovs r0, 0x1\n"
+ "\tands r0, r1\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0809C7D0\n"
+ "\tmovs r0, 0\n"
+ "\tldrsb r0, [r6, r0]\n"
+ "\tcmp r0, 0x6\n"
+ "\tbne _0809C76E\n"
+ "\tmov r1, r12\n"
+ "\tldr r0, [r1]\n"
+ "\tldrb r0, [r0, 0x5]\n"
+ "\tcmp r0, 0x1\n"
+ "\tbne _0809C768\n"
+ "\tmovs r0, 0x4\n"
+ "\tb _0809C84C\n"
+ "_0809C768:\n"
+ "\tmovs r2, 0x1\n"
+ "\tmov r9, r2\n"
+ "\tb _0809C7D0\n"
+ "_0809C76E:\n"
+ "\tbl sub_809CAB0\n"
+ "\tlsls r0, 24\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0809C7D0\n"
+ "\tldr r0, _0809C784 @ =gUnknown_020384E9\n"
+ "\tldrb r0, [r0]\n"
+ "\tcmp r0, 0\n"
+ "\tbne _0809C788\n"
+ "\tmovs r0, 0x8\n"
+ "\tb _0809C84C\n"
+ "\t.align 2, 0\n"
+ "_0809C784: .4byte gUnknown_020384E9\n"
+ "_0809C788:\n"
+ "\tmovs r0, 0\n"
+ "\tbl sub_809CE4C\n"
+ "\tsubs r0, 0x1\n"
+ "\tlsls r0, 24\n"
+ "\tasrs r0, 24\n"
+ "\tcmp r0, 0x4\n"
+ "\tbhi _0809C7D0\n"
+ "\tlsls r0, 2\n"
+ "\tldr r1, _0809C7A4 @ =_0809C7A8\n"
+ "\tadds r0, r1\n"
+ "\tldr r0, [r0]\n"
+ "\tmov pc, r0\n"
+ "\t.align 2, 0\n"
+ "_0809C7A4: .4byte _0809C7A8\n"
+ "\t.align 2, 0\n"
+ "_0809C7A8:\n"
+ "\t.4byte _0809C7BC\n"
+ "\t.4byte _0809C7C0\n"
+ "\t.4byte _0809C7C4\n"
+ "\t.4byte _0809C7C8\n"
+ "\t.4byte _0809C7CC\n"
+ "_0809C7BC:\n"
+ "\tmovs r0, 0xB\n"
+ "\tb _0809C84C\n"
+ "_0809C7C0:\n"
+ "\tmovs r0, 0xC\n"
+ "\tb _0809C84C\n"
+ "_0809C7C4:\n"
+ "\tmovs r0, 0xD\n"
+ "\tb _0809C84C\n"
+ "_0809C7C8:\n"
+ "\tmovs r0, 0xE\n"
+ "\tb _0809C84C\n"
+ "_0809C7CC:\n"
+ "\tmovs r0, 0xF\n"
+ "\tb _0809C84C\n"
+ "_0809C7D0:\n"
+ "\tldr r2, _0809C7EC @ =gMain\n"
+ "\tldrh r1, [r2, 0x2E]\n"
+ "\tmovs r0, 0x2\n"
+ "\tands r0, r1\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0809C7F8\n"
+ "\tldr r0, _0809C7F0 @ =gPokemonStorageSystemPtr\n"
+ "\tldr r0, [r0]\n"
+ "\tldrb r0, [r0, 0x5]\n"
+ "\tcmp r0, 0x1\n"
+ "\tbne _0809C7F4\n"
+ "\tmovs r0, 0x10\n"
+ "\tb _0809C84C\n"
+ "\t.align 2, 0\n"
+ "_0809C7EC: .4byte gMain\n"
+ "_0809C7F0: .4byte gPokemonStorageSystemPtr\n"
+ "_0809C7F4:\n"
+ "\tmovs r3, 0x1\n"
+ "\tmov r9, r3\n"
+ "_0809C7F8:\n"
+ "\tmov r0, r9\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0809C80A\n"
+ "\tmovs r1, 0x6\n"
+ "\tmov r8, r1\n"
+ "\tmovs r2, 0\n"
+ "\tmov r10, r2\n"
+ "\tmovs r4, 0\n"
+ "\tb _0809C83C\n"
+ "_0809C80A:\n"
+ "\tldrh r1, [r2, 0x2E]\n"
+ "\tmovs r0, 0x4\n"
+ "\tands r0, r1\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0809C83C\n"
+ "\tbl sub_809CD88\n"
+ "\tmovs r0, 0\n"
+ "\tb _0809C84C\n"
+ "_0809C81C:\n"
+ "\tlsls r0, r4, 24\n"
+ "\tmovs r3, 0xFF\n"
+ "\tlsls r3, 24\n"
+ "\tadds r0, r3\n"
+ "\tlsrs r4, r0, 24\n"
+ "\tcmp r0, 0\n"
+ "\tbge _0809C82C\n"
+ "\tmovs r4, 0x6\n"
+ "_0809C82C:\n"
+ "\tlsls r0, r4, 24\n"
+ "\tasrs r0, 24\n"
+ "\tmovs r1, 0\n"
+ "\tldrsb r1, [r7, r1]\n"
+ "\tcmp r0, r1\n"
+ "\tbeq _0809C83C\n"
+ "\tmovs r0, 0x1\n"
+ "\tmov r8, r0\n"
+ "_0809C83C:\n"
+ "\tmov r1, r8\n"
+ "\tcmp r1, 0\n"
+ "\tbeq _0809C84A\n"
+ "_0809C842:\n"
+ "\tmov r0, r10\n"
+ "\tadds r1, r4, 0\n"
+ "\tbl sub_809AF18\n"
+ "_0809C84A:\n"
+ "\tmov r0, r8\n"
+ "_0809C84C:\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
diff --git a/src/pokemon_storage_system_5.c b/src/pokemon_storage_system_5.c
new file mode 100644
index 000000000..b7c3d42f5
--- /dev/null
+++ b/src/pokemon_storage_system_5.c
@@ -0,0 +1,16 @@
+
+// Includes
+#include "global.h"
+#include "pokemon_storage_system.h"
+
+// Static type declarations
+
+// Static RAM declarations
+
+EWRAM_DATA struct UnkStruct_2000020 *gUnknown_020384EC = NULL;
+
+// Static ROM declarations
+
+// .rodata
+
+// .text
diff --git a/src/pokemon/pokemon_summary_screen.c b/src/pokemon_summary_screen.c
index 96f9c44f9..75ddb52d0 100644
--- a/src/pokemon/pokemon_summary_screen.c
+++ b/src/pokemon_summary_screen.c
@@ -144,7 +144,6 @@ 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[];
@@ -159,11 +158,11 @@ EWRAM_DATA u8 gUnknown_020384F0 = 0;
EWRAM_DATA struct Sprite *gUnknown_020384F4 = NULL;
#if ENGLISH
-#include "../data/text/move_descriptions_en.h"
-#include "../data/text/nature_names_en.h"
+#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"
+#include "data/text/move_descriptions_de.h"
+#include "data/text/nature_names_de.h"
#endif
static const u8 * const sPageHeaderTexts[] = {
@@ -572,13 +571,16 @@ static const u8 sUnknown_083C15BC[] = {
-1, 15, 0, 10,
};
-
void sub_809D844(void)
{
RunTasks();
AnimateSprites();
BuildOamBuffer();
UpdatePaletteFade();
+#if DEBUG
+ if (gLinkOpen == TRUE)
+ debug_sub_8008264(gLink.recvQueue.count, 20, 1, 2, 3);
+#endif
}
void sub_809D85C(void)
@@ -611,13 +613,9 @@ void ShowPokemonSummaryScreen(struct Pokemon *party, u8 monIndex, u8 maxMonIndex
pssData.disableMoveOrderEditing = FALSE;
if (mode >= PSS_MODE_PC_NORMAL)
- {
pssData.usingPC = TRUE;
- }
else
- {
pssData.usingPC = FALSE;
- }
switch (mode)
{
@@ -724,9 +722,7 @@ bool8 sub_809DA84(void)
break;
case 7:
if (MultistepInitMenuWindowContinue())
- {
gMain.state++;
- }
break;
case 8:
sub_809DA1C();
@@ -752,14 +748,9 @@ bool8 sub_809DA84(void)
case 12:
sub_809F678(&pssData.loadedMon);
if (!GetMonStatusAndPokerus(&pssData.loadedMon))
- {
sub_80A12D0(0);
- }
else
- {
sub_80A12D0(10);
- }
-
DrawPokerusSurvivorDot(&pssData.loadedMon);
gMain.state++;
break;
@@ -787,10 +778,7 @@ bool8 sub_809DA84(void)
break;
case 17:
if (pssData.page <= PSS_PAGE_SKILLS)
- {
sUnknown_083C1580[pssData.page]();
- }
-
gMain.state++;
break;
case 18:
@@ -803,14 +791,9 @@ bool8 sub_809DA84(void)
break;
case 20:
if (GetMonData(&pssData.loadedMon, MON_DATA_IS_EGG))
- {
gBattle_BG3_X = 256;
- }
else
- {
gBattle_BG3_X = 0;
- }
-
gMain.state++;
break;
case 21:
@@ -825,23 +808,23 @@ bool8 sub_809DA84(void)
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;
+#if DEBUG
+ if (gLinkOpen == TRUE)
+ debug_sub_8008218((void *)(VRAM + 0xDDE0), 0x8000, (void *)(VRAM + 0xF000), 3);
+#endif
return TRUE;
- break;
}
return FALSE;
@@ -849,7 +832,8 @@ bool8 sub_809DA84(void)
static void sub_809DE44(void)
{
- while (sub_809DA84() != TRUE && sub_80F9344() != TRUE);
+ while (sub_809DA84() != TRUE && sub_80F9344() != TRUE)
+ ;
}
static void sub_809DE64(void)
@@ -931,21 +915,21 @@ static bool8 LoadPokemonSummaryScreenGraphics(void)
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(gUnknownPalette_81E6692 + 14, 129, 2);
+ LoadPalette(gUnknownPalette_81E6692 + 15, 136, 2);
+ LoadPalette(gUnknownPalette_81E6692 + 14, 143, 2);
+ LoadPalette(gUnknownPalette_81E6692 + 15, 137, 2);
+ LoadPalette(gUnknownPalette_81E6692 + 6, 209, 4);
+ LoadPalette(gUnknownPalette_81E6692 + 10, 211, 4);
+ LoadPalette(gUnknownPalette_81E6692 + 14, 213, 4);
+ LoadPalette(gUnknownPalette_81E6692 + 6, 215, 4);
+ LoadPalette(gUnknownPalette_81E6692 + 4, 217, 4);
+ LoadPalette(gUnknownPalette_81E6692 + 8, 219, 4);
+ LoadPalette(gUnknownPalette_81E6692 + 2, 221, 2);
+ LoadPalette(gUnknownPalette_81E6692 + 3, 222, 2);
+ LoadPalette(gUnknownPalette_81E6692 + 1, 223, 2);
LoadPalette(gFontDefaultPalette, 240, 32);
- LoadPalette(&gUnknownPalette_81E6692[6], 249, 2);
+ LoadPalette(gUnknownPalette_81E6692 + 3, 249, 2);
}
static void SummaryScreenExit(u8 taskId)
@@ -994,14 +978,9 @@ static void SummaryScreenHandleKeyInput(u8 taskId)
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)
{
@@ -1027,10 +1006,7 @@ static void sub_809E260(u8 taskId)
else if ((gMain.newKeys & DPAD_LEFT) || sub_80F9284() == 1)
{
if (pssData.page == PSS_PAGE_CONTEST_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0))
- {
Menu_EraseWindowRect(0, 14, 9, 18);
- }
-
SummaryScreenHandleLeftRightInput(taskId, -1);
}
else if ((gMain.newKeys & DPAD_RIGHT) || sub_80F9284() == 2)
@@ -1038,10 +1014,7 @@ static void sub_809E260(u8 taskId)
if (pssData.page != pssData.lastPage)
{
if (pssData.page == PSS_PAGE_BATTLE_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0))
- {
Menu_EraseWindowRect(0, 14, 9, 18);
- }
-
SummaryScreenHandleLeftRightInput(taskId, 1);
}
}
@@ -1122,9 +1095,7 @@ static bool8 MonKnowsMultipleMoves(struct Pokemon *mon)
for (i = 1; i < 4; i++)
{
if (GetMonMove(mon, i))
- {
return TRUE;
- }
}
return FALSE;
@@ -1235,13 +1206,9 @@ static void sub_809E83C(u8 taskId, s8 b)
if (pssData.selectedMoveIndex != pssData.switchMoveIndex)
{
if (pssData.usingPC == FALSE)
- {
sub_809E5C4();
- }
else
- {
sub_809E6D8();
- }
pssData.selectedMoveIndex = pssData.switchMoveIndex;
sub_809F678(&pssData.loadedMon);
@@ -1537,36 +1504,24 @@ void sub_809EC38(u8 taskId)
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]++;
@@ -1608,19 +1563,12 @@ void sub_809EC38(u8 taskId)
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:
@@ -1635,26 +1583,21 @@ void sub_809EC38(u8 taskId)
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)
+ if (pssData.bgToggle == 0)
{
- gBattle_BG2_X = pssData.bgToggle;
+ gBattle_BG2_X = 0;
taskData[0]++;
}
else
@@ -1696,27 +1639,20 @@ void sub_809EE74(u8 taskId)
case 2:
if (pssData.bgToggle == 0)
{
- int var2 = gBattle_BG2_X + 0x20;
- gBattle_BG2_X = var2;
- if ((var2 << 16) == 0x1000000)
- {
+ gBattle_BG2_X += 32;
+ if (gBattle_BG2_X == 0x100)
taskData[0]++;
- }
}
else
{
- int var2 = gBattle_BG1_X + 0x20;
- gBattle_BG1_X = var2;
- if ((var2 << 16) == 0x1000000)
- {
+ gBattle_BG1_X += 32;
+ if (gBattle_BG1_X == 0x100)
taskData[0]++;
- }
}
break;
case 3:
pssData.headerTextId = pssData.page + 1;
- minus2 = pssData.mode - 2;
- if (minus2 < 2)
+ if (pssData.mode == 2 || pssData.mode == 3)
{
pssData.headerActionTextId = 0;
sub_80A029C(&pssData.loadedMon);
@@ -1726,19 +1662,12 @@ void sub_809EE74(u8 taskId)
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:
@@ -1753,9 +1682,7 @@ void sub_809EE74(u8 taskId)
break;
case 6:
if (sub_8055870() != TRUE)
- {
gTasks[taskId].func = gUnknown_03005CF0;
- }
break;
}
}
@@ -1782,9 +1709,10 @@ 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 (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);
@@ -2057,11 +1985,8 @@ 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;
}
@@ -2071,14 +1996,9 @@ s8 sub_809F344(u8 partyIndex)
{
partyIndex++;
if (partyIndex == PARTY_SIZE)
- {
return -1;
- }
-
if (sub_809F310(&gPlayerParty[sDoubleBattlePartyOrder[partyIndex]]) == TRUE)
- {
return sDoubleBattlePartyOrder[partyIndex];
- }
}
}
@@ -2087,15 +2007,10 @@ s8 sub_809F388(u8 partyIndex)
while (1)
{
if (partyIndex == 0)
- {
return -1;
- }
-
partyIndex--;
if (sub_809F310(&gPlayerParty[sDoubleBattlePartyOrder[partyIndex]]) == TRUE)
- {
return sDoubleBattlePartyOrder[partyIndex];
- }
}
}
@@ -2114,18 +2029,11 @@ s8 sub_809F3CC(s8 direction)
}
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;
}
@@ -2154,10 +2062,7 @@ void sub_809F43C(u8 taskId)
case 4:
sub_809F678(&pssData.loadedMon);
if (GetMonStatusAndPokerus(&pssData.loadedMon))
- {
sub_80A12D0(2);
- }
-
DrawPokerusSurvivorDot(&pssData.loadedMon);
gMain.state++;
break;
@@ -2166,14 +2071,9 @@ void sub_809F43C(u8 taskId)
{
pssData.loadGfxState = 0;
if (GetMonData(&pssData.loadedMon, MON_DATA_IS_EGG))
- {
gBattle_BG3_X = 256;
- }
else
- {
gBattle_BG3_X = 0;
- }
-
gMain.state++;
}
break;
@@ -2245,7 +2145,7 @@ static void sub_809F678(struct Pokemon *mon)
else
{
struct BoxPokemon *mons = pssData.monList.boxMons;
- sub_803B4B4(&mons[pssData.monIndex], mon);
+ ExpandBoxMon(&mons[pssData.monIndex], mon);
}
}
@@ -2325,10 +2225,7 @@ static bool8 sub_809F7D0(u8 taskId)
sub_809F678(&mon);
move = GetMonMove(&mon, pssData.selectedMoveIndex);
if (IsHMMove(move) == TRUE && pssData.mode != PSS_MODE_UNKNOWN)
- {
return FALSE;
- }
-
return TRUE;
}
@@ -2361,9 +2258,7 @@ void sub_809F814(u8 taskId)
if (pssData.page != PSS_PAGE_BATTLE_MOVES)
{
if (pssData.page == PSS_PAGE_CONTEST_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0))
- {
Menu_EraseWindowRect(0, 14, 9, 18);
- }
gTasks[taskId].func = sub_809E260;
@@ -2377,9 +2272,7 @@ void sub_809F814(u8 taskId)
if (pssData.page != pssData.lastPage)
{
if (pssData.page == PSS_PAGE_BATTLE_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0))
- {
Menu_EraseWindowRect(0, 14, 9, 18);
- }
gTasks[taskId].func = sub_809E260;
@@ -2532,9 +2425,7 @@ static void sub_809FBE4(void)
u8 i;
for (i = 0; i < 28; i++)
- {
sub_80A1918(i, 1);
- }
Menu_EraseWindowRect(11, 4, 29, 18);
}
@@ -2556,9 +2447,7 @@ static void sub_809FC34(struct Pokemon *mon)
u8 ability;
for (i = 0; i < 5; i++)
- {
sub_80A1918(i, 1);
- }
Menu_EraseWindowRect(11, 9, 28, 12);
if (GetMonData(mon, MON_DATA_IS_EGG))
@@ -2566,33 +2455,25 @@ static void sub_809FC34(struct Pokemon *mon)
buffer = gStringVar1;
buffer = sub_80A1E58(buffer, 13);
buffer = StringCopy(buffer, gOtherText_OriginalTrainer);
- buffer = StringCopy(buffer, gOtherText_FiveQuestionsAndSlash);
+ buffer = StringCopy(buffer, gOtherText_FiveQuestions);
buffer[0] = EXT_CTRL_CODE_BEGIN;
buffer[1] = 0x13;
buffer[2] = 0x4E;
buffer[3] = EOS;
Menu_PrintText(gStringVar1, 11, 4);
- sub_80A1EF8(gOtherText_FiveQuestionsAndSlash, 13, 193, 32, 1);
+ sub_80A1EF8(gOtherText_FiveQuestions, 13, 193, 32, 1);
sub_80A198C(9, 120, 48, 0);
friendship = GetMonData(mon, MON_DATA_FRIENDSHIP);
if (friendship < 6)
- {
Menu_PrintText(gOtherText_EggAbout, 11, 9);
- }
else if (friendship < 11)
- {
Menu_PrintText(gOtherText_EggSoon, 11, 9);
- }
else if (friendship < 41)
- {
Menu_PrintText(gOtherText_EggSomeTime, 11, 9);
- }
else
- {
Menu_PrintText(gOtherText_EggLongTime, 11, 9);
- }
PokemonSummaryScreen_PrintEggTrainerMemo(mon, 11, 14);
}
@@ -2607,13 +2488,9 @@ static void sub_809FC34(struct Pokemon *mon)
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;
@@ -2627,9 +2504,7 @@ static void sub_809FC34(struct Pokemon *mon)
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);
@@ -2674,9 +2549,7 @@ static void sub_809FF64(struct Pokemon *mon)
u8 *buffer;
for (i = 0; i < 5; i++)
- {
sub_80A1918(i, 1);
- }
heldItem = GetMonData(mon, MON_DATA_HELD_ITEM);
PrintHeldItemName(heldItem, 11, 4);
@@ -2766,13 +2639,9 @@ static void sub_80A015C(struct Pokemon *mon)
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);
@@ -2828,9 +2697,7 @@ static void sub_80A0390(void)
u8 i;
for (i = 0; i < MAX_MON_MOVES; i++)
- {
Menu_EraseWindowRect(15, (i * 2) + 4, 28, (i * 2) + 5);
- }
}
u16 sub_80A03BC(struct Pokemon *mon, u8 selectedMoveIndex)
@@ -2844,13 +2711,9 @@ u16 sub_80A03BC(struct Pokemon *mon, u8 selectedMoveIndex)
else
{
if (pssData.moveToLearn != 0)
- {
move = pssData.moveToLearn;
- }
else
- {
move = 0xFFFF;
- }
}
return move;
@@ -2877,61 +2740,56 @@ static void sub_80A0428(struct Pokemon *mon, u8 *selectedMoveIndex)
Menu_EraseWindowRect(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;
-
- Menu_PrintText(gMoveDescriptions[move - 1], 11, 15);
+ if (move != 0xFFFF)
+ Menu_PrintText(gMoveDescriptions[move - 1], 11, 15);
}
static void sub_80A0498(u16 move)
{
- if (move == 0xFFFF) return;
-
- Menu_PrintText(gContestEffectStrings[gContestMoves[move].effect], 11, 15);
+ if (move != 0xFFFF)
+ Menu_PrintText(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);
- Menu_PrintText(gStringVar1, 7, 15);
- }
- else
+ if (move != 0xFFFF)
{
- buffer = gStringVar1;
- buffer = sub_8072C14(buffer, gBattleMoves[move].power, 21, 1);
- Menu_PrintText(gStringVar1, 7, 15);
- }
+ if (gBattleMoves[move].power <= 1)
+ {
+ buffer = gStringVar1;
+ buffer = sub_8072C74(buffer, gOtherText_ThreeDashes2, 21, 1);
+ Menu_PrintText(gStringVar1, 7, 15);
+ }
+ else
+ {
+ buffer = gStringVar1;
+ buffer = sub_8072C14(buffer, gBattleMoves[move].power, 21, 1);
+ Menu_PrintText(gStringVar1, 7, 15);
+ }
- if (gBattleMoves[move].accuracy == 0)
- {
- buffer = gStringVar1;
- buffer = sub_8072C74(buffer, gOtherText_ThreeDashes2, 21, 1);
- Menu_PrintText(gStringVar1, 7, 17);
- }
- else
- {
- buffer = gStringVar1;
- buffer = sub_8072C14(buffer, gBattleMoves[move].accuracy, 21, 1);
- Menu_PrintText(gStringVar1, 7, 17);
+ if (gBattleMoves[move].accuracy == 0)
+ {
+ buffer = gStringVar1;
+ buffer = sub_8072C74(buffer, gOtherText_ThreeDashes2, 21, 1);
+ Menu_PrintText(gStringVar1, 7, 17);
+ }
+ else
+ {
+ buffer = gStringVar1;
+ buffer = sub_8072C14(buffer, gBattleMoves[move].accuracy, 21, 1);
+ Menu_PrintText(gStringVar1, 7, 17);
+ }
}
}
@@ -2947,9 +2805,7 @@ static void sub_80A057C(u16 move)
appeal = gContestEffects[gContestMoves[move].effect].appeal;
if (appeal != 0xFF)
- {
appeal = appeal / 10;
- }
for (i = 0; i < 8; i++)
{
@@ -2957,9 +2813,7 @@ static void sub_80A057C(u16 move)
int and = 3;
int offset = 0x3CC / 2;
if (appeal != 0xFF && i < appeal)
- {
tile = 0x103A;
- }
*(&vramAddr[(i >> 2 << 5) + (i & and)] + offset) = tile;
}
@@ -3183,12 +3037,8 @@ static void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *mon, u8 left,
#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);
@@ -3403,20 +3253,14 @@ static void PrintNumRibbons(struct Pokemon *mon)
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);
- }
+ && sub_80F9344() == TRUE
+ && IsLinkDoubleBattle() == TRUE
+ && (pssData.monIndex == 1 || pssData.monIndex == 4 || pssData.monIndex == 5))
+ StringCopy(gStringVar1, ItemId_GetName(itemId));
else if (itemId == 0)
- {
StringCopy(gStringVar1, gOtherText_None);
- }
else
- {
CopyItemName(itemId, gStringVar1);
- }
Menu_PrintText(sUnknown_083C15B4, left, top);
}
@@ -3472,13 +3316,9 @@ static void DrawExperienceProgressBar(struct Pokemon *mon, u8 left, u8 top)
u16 baseTile = 0x2062;
if (numExpProgressBarTicks > 7)
- {
tile = 0x206A; // full exp. bar block
- }
else
- {
tile = (numExpProgressBarTicks % 8) + baseTile;
- }
vramAddr[i] = tile;
@@ -4134,13 +3974,9 @@ static void sub_80A12D0(s8 a)
gTasks[newTaskId].data[0] = a;
if (a < 0)
- {
gTasks[newTaskId].data[1] = 10;
- }
else
- {
gTasks[newTaskId].data[1] = 0;
- }
gTasks[newTaskId].data[2] = 1;
}
@@ -4392,26 +4228,18 @@ static void sub_80A1488(s8 a, u8 b)
u8 taskId;
if (pssData.page == PSS_PAGE_BATTLE_MOVES)
- {
Menu_EraseWindowRect(0, 14, 9, 19);
- }
taskId = FindTaskIdByFunc(sub_80A1334);
if (taskId == 0xFF)
- {
taskId = CreateTask(sub_80A1334, 0);
- }
- gTasks[taskId].data[0] = (s8)a;
+ gTasks[taskId].data[0] = a;
- if ((s8)a < 0)
- {
+ if (a < 0)
gTasks[taskId].data[1] = 10;
- }
else
- {
gTasks[taskId].data[1] = 0;
- }
gTasks[taskId].data[2] = 0;
gTasks[taskId].data[3] = b;
@@ -4594,26 +4422,18 @@ static void sub_80A1654(s8 a, u8 b)
u8 taskId;
if (pssData.page == PSS_PAGE_CONTEST_MOVES)
- {
Menu_EraseWindowRect(0, 14, 9, 19);
- }
taskId = FindTaskIdByFunc(sub_80A1500);
if (taskId == 0xFF)
- {
taskId = CreateTask(sub_80A1500, 0);
- }
- gTasks[taskId].data[0] = (s8)a;
+ gTasks[taskId].data[0] = a;
- if ((s8)a < 0)
- {
+ if (a < 0)
gTasks[taskId].data[1] = 10;
- }
else
- {
gTasks[taskId].data[1] = 0;
- }
gTasks[taskId].data[2] = 0;
gTasks[taskId].data[3] = b;
@@ -4851,13 +4671,9 @@ u8 sub_80A1808(struct Pokemon *mon)
gSprites[spriteId].callback = sub_80A1888;
if (!IsPokeSpriteNotFlipped(species))
- {
- gSprites[spriteId].hFlip = 1;
- }
+ gSprites[spriteId].hFlip = TRUE;
else
- {
- gSprites[spriteId].hFlip = 0;
- }
+ gSprites[spriteId].hFlip = FALSE;
return spriteId;
}
@@ -4869,9 +4685,7 @@ static void sub_80A1888(struct Sprite *sprite)
sprite->callback = SpriteCallbackDummy;
if (!GetMonData(&pssData.loadedMon, MON_DATA_IS_EGG))
- {
PlayCry1(sprite->data[0], 0);
- }
}
}
@@ -4880,9 +4694,7 @@ static void sub_80A18C4(void)
u8 i;
for (i = 0; i < 30; i++)
- {
ewram1A000[i] = 0xFF;
- }
}
static void sub_80A18E4(u8 a)
@@ -4906,9 +4718,7 @@ static void sub_80A1950(void)
for (i = 0; i < 5; i++)
{
if (ewram1A000[i] == 0xFF)
- {
ewram1A000[i] = CreateSprite(&sSpriteTemplate_83C11C0, 0, 0, 2);
- }
sub_80A1918(i, 1);
}
@@ -4934,9 +4744,7 @@ static void sub_80A1A30(u8 a)
if (pssData.page >= PSS_PAGE_BATTLE_MOVES)
{
if (a == 9)
- {
subPriority = 1;
- }
for (i = 0; i < 10; i++)
{
@@ -4944,17 +4752,11 @@ static void sub_80A1A30(u8 a)
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;
@@ -4968,9 +4770,7 @@ static void sub_80A1B1C(u8 a)
u8 i;
for (i = 0; i < 10; i++)
- {
sub_80A18E4(a + i);
- }
}
static void sub_80A1B40(u8 a)
@@ -4981,28 +4781,21 @@ static void sub_80A1B40(u8 a)
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)
+ if (sprite->animNum == 4 || sprite->animNum == 5 || sprite->animNum == 6)
{
sprite->data[1] = (sprite->data[1] + 1) & 0x1F;
if (sprite->data[1] > 24)
- {
- sprite->invisible = 1;
- }
+ sprite->invisible = TRUE;
else
- {
- sprite->invisible = 0;
- }
+ sprite->invisible = FALSE;
}
else
{
@@ -5011,69 +4804,23 @@ static void sub_80A1BC0(struct Sprite *sprite)
}
if (sprite->data[0] == 9)
- {
sprite->pos2.y = pssData.selectedMoveIndex * 16;
- }
else
- {
sprite->pos2.y = pssData.switchMoveIndex * 16;
- }
}
-__attribute__((naked))
+#define shared1A009 ((u8 *)(gSharedMem + 0x1A009))
+
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 r3;
+
+ a *= 10;
+ for (r3 = a; r3 < a + 10; r3++)
+ {
+ gSprites[shared1A009[r3]].data[1] = 0;
+ gSprites[shared1A009[r3]].invisible = FALSE;
+ }
}
u8 pokemon_ailments_get_primary(u32 status)
@@ -5097,21 +4844,15 @@ 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;
@@ -5132,9 +4873,7 @@ void sub_80A1D18(void)
statusAndPkrs2 = statusAndPkrs - 1;
if (ewram1A000[29] == 0xFF)
- {
ewram1A000[29] = CreateSprite(&sSpriteTemplate_83C1304, 64, 152, 0);
- }
}
else
{
@@ -5240,10 +4979,9 @@ 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;
@@ -5313,9 +5051,7 @@ u8 *PokemonSummaryScreen_CopyPokemonLevel(u8 *dest, u8 level)
dest++;
if (level == 0)
- {
level = 5;
- }
ConvertIntToDecimalString(buffer, level);
dest = sub_80A1E9C(dest, buffer, 14);
@@ -5334,7 +5070,5 @@ static void sub_80A2078(int taskId)
static void sub_80A20A8(u8 taskId)
{
if (sub_8055870() != TRUE)
- {
gTasks[taskId].func = gUnknown_03005CF0;
- }
}
diff --git a/src/pokenav.c b/src/pokenav.c
new file mode 100644
index 000000000..f57a98df6
--- /dev/null
+++ b/src/pokenav.c
@@ -0,0 +1,16 @@
+
+// Includes
+#include "global.h"
+
+// Static type declarations
+
+// Static RAM declarations
+
+EWRAM_DATA u8 gUnknown_020388B0[4] = {};
+EWRAM_DATA u16 gUnknown_020388B4 = 0;
+
+// Static ROM declarations
+
+// .rodata
+
+// .text
diff --git a/src/pokenav_before.c b/src/pokenav_before.c
index b31be2ce1..4f7eb66b4 100644
--- a/src/pokenav_before.c
+++ b/src/pokenav_before.c
@@ -20,8 +20,6 @@
#include "text.h"
#include "scanline_effect.h"
-extern u8 ewram[];
-
struct UnknownPokenav0
{
/* 0x0000 */ u8 var0[0x0300];
@@ -102,7 +100,6 @@ 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[];
@@ -132,6 +129,10 @@ extern const u8 gUnknown_08E99FB0[];
extern const u8 gUnknown_08E9A100[];
extern const u16 gPokenavHoennMap1_Pal[];
+// TODO: decompile the debug code so the compiler doesn't complain about
+// unused static functions
+#define static
+
static void sub_80EBCA8();
static void sub_80EEE20();
static bool8 sub_80EEE54();
@@ -297,7 +298,6 @@ extern void sub_80F19FC();
extern u16 gKeyRepeatStartDelay;
-
void sub_80EBA5C()
{
switch (gMain.state)
@@ -552,6 +552,10 @@ void sub_80EBDD8()
{
sub_80EF428(0, 0);
sub_80EBDBC(&sub_80EC268);
+#if DEBUG
+ if (gLinkOpen == TRUE)
+ debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF800), 4);
+#endif
}
break;
}
@@ -626,6 +630,10 @@ void sub_80EC00C()
{
sub_80EF428(0, ewram0_10.var6dad);
sub_80EBDBC(&sub_80EC268);
+#if DEBUG
+ if (gLinkOpen == TRUE)
+ debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF800), 4);
+#endif
}
break;
}
@@ -827,6 +835,10 @@ void sub_80EC4A0()
break;
case 0xD:
sub_80EED2C(0x1);
+#if DEBUG
+ if (gLinkOpen == TRUE)
+ debug_sub_8008218((void *)(VRAM + 0x75E0), 0, (void *)(VRAM + 0xF800), 4);
+#endif
ewram0_10.var304++;
break;
case 0xE:
@@ -906,6 +918,10 @@ void sub_80EC67C()
}
break;
}
+#if DEBUG
+ if (gLinkOpen == TRUE)
+ debug_sub_8008264(gLink.recvQueue.count, 1, 1, 2, 4);
+#endif
}
void sub_80EC81C()
@@ -1011,23 +1027,23 @@ void sub_80ECA10()
SetVBlankCallback(&sub_80EBD80);
sub_80EED1C();
ewram0_10.var6dad = ewram0_10.var6df0;
- ewram0_10.var6dae = 0x3;
+ ewram0_10.var6dae = 3;
sub_80EEE08();
ewram0_10.var304++;
}
break;
case 1:
- sub_80EF248(0x1);
+ sub_80EF248(1);
ewram0_10.var304++;
case 2:
- if (!sub_80EF284(0x1))
+ if (!sub_80EF284(1))
ewram0_10.var304++;
break;
case 3:
- sub_80F1B8C(0x1);
+ sub_80F1B8C(1);
ewram0_10.var304++;
case 4:
- if (!sub_80F1BC8(0x1))
+ if (!sub_80F1BC8(1))
ewram0_10.var304++;
break;
case 5:
@@ -1051,23 +1067,27 @@ void sub_80ECA10()
if (!gPaletteFade.active)
ewram0_10.var304++;
break;
- case 0xA:
- sub_80F2C80(0x1);
+ case 10:
+ sub_80F2C80(1);
ewram0_10.var304++;
// fall through
- case 0xB:
- if (!sub_80F2CBC(0x1))
+ case 11:
+ if (!sub_80F2CBC(1))
ewram0_10.var304++;
break;
- case 0xC:
+ case 12:
sub_80F1DF0();
ewram0_10.var304++;
break;
- case 0xD:
+ case 13:
if (!sub_80F1E50())
{
sub_80EF428(1, ewram0_10.var6dad);
sub_80EBDBC(&sub_80EC86C);
+#if DEBUG
+ if (gLinkOpen == TRUE)
+ debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF800), 4);
+#endif
}
break;
}
@@ -1229,6 +1249,10 @@ void sub_80ECD80()
{
sub_80EF428(2, ewram0_10.var6dad);
sub_80EBDBC(&sub_80ECC08);
+#if DEBUG
+ if (gLinkOpen == TRUE)
+ debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF800), 4);
+#endif
}
break;
}
@@ -1338,7 +1362,13 @@ void sub_80ED01C()
// fall through
case 19:
if (!sub_80F2CBC(ewram0_10.var6dfc + 7))
+ {
sub_80EBDBC(&sub_80ED31C);
+#if DEBUG
+ if (gLinkOpen == TRUE)
+ debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF800), 4);
+#endif
+ }
break;
}
}
@@ -1353,21 +1383,23 @@ void sub_80ED31C()
case 1:
PlaySE(SE_SELECT);
ShowMapNamePopUpWindow();
- break;
+ return;
case 2:
PlaySE(SE_SELECT);
ewram0_10.var304++;
- break;
+ return;
default:
if (gMain.newKeys & A_BUTTON)
{
PlaySE(SE_SELECT);
sub_80EBDBC(&sub_80ED4D8);
+ return;
}
else if (gMain.newKeys & B_BUTTON)
{
PlaySE(SE_SELECT);
sub_80EBDBC(&sub_80ECD80);
+ return;
}
break;
}
@@ -1385,6 +1417,10 @@ void sub_80ED31C()
ewram0_10.var304 = 0;
break;
}
+#if DEBUG
+ if (gLinkOpen == TRUE)
+ debug_sub_8008264(gLink.recvQueue.count, 1, 8, 2, 4);
+#endif
}
void sub_80ED3D0()
@@ -1425,6 +1461,10 @@ void sub_80ED3D0()
case 7:
sub_80EED2C(0x4);
ewram0_10.var304++;
+#if DEBUG
+ if (gLinkOpen == TRUE)
+ debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF800), 4);
+#endif
break;
case 8:
if (!gPaletteFade.active)
@@ -1476,6 +1516,10 @@ void sub_80ED4D8()
case 7:
sub_80EED2C(0x2);
ewram0_10.var304++;
+#if DEBUG
+ if (gLinkOpen == TRUE)
+ debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF000), 4);
+#endif
break;
case 8:
if (!gPaletteFade.active)
@@ -1569,7 +1613,13 @@ void sub_80ED620()
// fall through
case 16:
if (!sub_80F2CBC(0x6))
+ {
sub_80EBDBC(&sub_80ED858);
+#if DEBUG
+ if (gLinkOpen == TRUE)
+ debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF000), 4);
+#endif
+ }
break;
}
}
@@ -1742,8 +1792,433 @@ label2:
}
#else
+#if DEBUG
__attribute__((naked))
-void sub_80ED858() {
+void sub_80ED858()
+{
+ asm("\
+ push {r4, r5, lr}\n\
+ add sp, sp, #0xfffffffc\n\
+ ldr r1, ._917 @ gSharedMem\n\
+ mov r2, #0xc1\n\
+ lsl r2, r2, #0x2\n\
+ add r0, r1, r2\n\
+ ldrh r0, [r0]\n\
+ add r5, r1, #0\n\
+ cmp r0, #0xb\n\
+ bls ._915 @cond_branch\n\
+ b ._999\n\
+._915:\n\
+ lsl r0, r0, #0x2\n\
+ ldr r1, ._917 + 4 @ \n\
+ add r0, r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+._918:\n\
+ .align 2, 0\n\
+._917:\n\
+ .word gSharedMem\n\
+ .word ._919\n\
+._919:\n\
+ .word ._920\n\
+ .word ._921\n\
+ .word ._922\n\
+ .word ._923\n\
+ .word ._924\n\
+ .word ._925\n\
+ .word ._926\n\
+ .word ._927\n\
+ .word ._928\n\
+ .word ._929\n\
+ .word ._999\n\
+ .word ._931\n\
+._920:\n\
+ bl sub_80F4F78\n\
+ bl sub_80F5B38\n\
+ ldr r0, ._933 @ gSharedMem\n\
+ mov r4, #0xc1\n\
+ lsl r4, r4, #0x2\n\
+ add r0, r0, r4\n\
+ mov r1, #0x1\n\
+ strh r1, [r0]\n\
+ b ._999\n\
+._934:\n\
+ .align 2, 0\n\
+._933:\n\
+ .word gSharedMem\n\
+._921:\n\
+ bl sub_80F5B50\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ beq ._935 @cond_branch\n\
+ b ._999\n\
+._935:\n\
+ ldr r0, ._938 @ gSharedMem\n\
+ mov r1, #0xc1\n\
+ lsl r1, r1, #0x2\n\
+ add r0, r0, r1\n\
+ mov r1, #0x2\n\
+ strh r1, [r0]\n\
+ b ._999\n\
+._939:\n\
+ .align 2, 0\n\
+._938:\n\
+ .word gSharedMem\n\
+._922:\n\
+ mov r0, #0x1\n\
+ bl sub_80F0174\n\
+ ldr r0, ._941 @ gSharedMem\n\
+ mov r2, #0xc1\n\
+ lsl r2, r2, #0x2\n\
+ add r0, r0, r2\n\
+ mov r1, #0x3\n\
+ strh r1, [r0]\n\
+ b ._999\n\
+._942:\n\
+ .align 2, 0\n\
+._941:\n\
+ .word gSharedMem\n\
+._923:\n\
+ bl sub_80F4FB4\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ beq ._943 @cond_branch\n\
+ b ._999\n\
+._943:\n\
+ bl sub_80F3C94\n\
+ bl sub_80F3D00\n\
+ b ._945\n\
+._924:\n\
+ ldr r2, ._951 @ gMain\n\
+ ldrh r1, [r2, #0x2c]\n\
+ mov r0, #0x40\n\
+ and r0, r0, r1\n\
+ add r3, r2, #0\n\
+ cmp r0, #0\n\
+ beq ._949 @cond_branch\n\
+ ldr r1, ._951 + 4 @ 0x87cb\n\
+ add r0, r5, r1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq ._949 @cond_branch\n\
+ ldr r2, ._951 + 8 @ 0x76aa\n\
+ add r0, r5, r2\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq ._948 @cond_branch\n\
+ ldr r4, ._951 + 12 @ 0x87dc\n\
+ add r0, r5, r4\n\
+ mov r1, #0x0\n\
+ ldsh r0, [r0, r1]\n\
+ cmp r0, #0\n\
+ beq ._949 @cond_branch\n\
+._948:\n\
+ mov r0, #0x5\n\
+ bl PlaySE\n\
+ mov r0, #0x1\n\
+ bl sub_80F5060\n\
+ bl move_anim_execute\n\
+ mov r2, #0xc1\n\
+ lsl r2, r2, #0x2\n\
+ add r1, r5, r2\n\
+ b ._950\n\
+._952:\n\
+ .align 2, 0\n\
+._951:\n\
+ .word gMain\n\
+ .word 0x87cb\n\
+ .word 0x76aa\n\
+ .word 0x87dc\n\
+._949:\n\
+ ldrh r1, [r3, #0x2c]\n\
+ mov r0, #0x80\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._956 @cond_branch\n\
+ ldr r4, ._958 @ 0x87cb\n\
+ add r0, r5, r4\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq ._956 @cond_branch\n\
+ ldr r1, ._958 + 4 @ 0x76aa\n\
+ add r0, r5, r1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq ._955 @cond_branch\n\
+ ldr r2, ._958 + 8 @ 0x87dc\n\
+ add r0, r5, r2\n\
+ sub r4, r4, #0x57\n\
+ add r1, r5, r4\n\
+ mov r4, #0x0\n\
+ ldsh r2, [r0, r4]\n\
+ mov r4, #0x0\n\
+ ldsh r0, [r1, r4]\n\
+ cmp r2, r0\n\
+ bge ._956 @cond_branch\n\
+._955:\n\
+ mov r0, #0x5\n\
+ bl PlaySE\n\
+ mov r0, #0x0\n\
+ bl sub_80F5060\n\
+ bl move_anim_execute\n\
+ mov r0, #0xc1\n\
+ lsl r0, r0, #0x2\n\
+ add r1, r5, r0\n\
+._950:\n\
+ mov r0, #0x5\n\
+ strh r0, [r1]\n\
+ b ._999\n\
+._959:\n\
+ .align 2, 0\n\
+._958:\n\
+ .word 0x87cb\n\
+ .word 0x76aa\n\
+ .word 0x87dc\n\
+._956:\n\
+ ldrh r2, [r3, #0x2e]\n\
+ mov r0, #0x2\n\
+ and r0, r0, r2\n\
+ cmp r0, #0\n\
+ beq ._960 @cond_branch\n\
+ mov r0, #0x5\n\
+ bl PlaySE\n\
+ bl sub_80F4FDC\n\
+ bl move_anim_execute\n\
+ ldr r0, ._962 @ gSharedMem\n\
+ mov r1, #0xc1\n\
+ lsl r1, r1, #0x2\n\
+ add r0, r0, r1\n\
+ mov r1, #0x9\n\
+ strh r1, [r0]\n\
+ b ._999\n\
+._963:\n\
+ .align 2, 0\n\
+._962:\n\
+ .word gSharedMem\n\
+._960:\n\
+ mov r0, #0x1\n\
+ and r0, r0, r2\n\
+ cmp r0, #0\n\
+ bne ._964 @cond_branch\n\
+ b ._999\n\
+._964:\n\
+ add r4, r5, #0\n\
+ ldr r2, ._970 @ 0x76aa\n\
+ add r0, r4, r2\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ bne ._966 @cond_branch\n\
+ ldr r1, ._970 + 4 @ 0x87dc\n\
+ add r0, r4, r1\n\
+ mov r2, #0x0\n\
+ ldsh r1, [r0, r2]\n\
+ ldr r2, ._970 + 8 @ 0x87da\n\
+ add r0, r4, r2\n\
+ mov r2, #0x0\n\
+ ldsh r0, [r0, r2]\n\
+ sub r0, r0, #0x1\n\
+ cmp r1, r0\n\
+ beq ._967 @cond_branch\n\
+ b ._999\n\
+._967:\n\
+ mov r0, #0x5\n\
+ bl PlaySE\n\
+ mov r0, #0xc1\n\
+ lsl r0, r0, #0x2\n\
+ add r1, r4, r0\n\
+ mov r0, #0x9\n\
+ strh r0, [r1]\n\
+ b ._999\n\
+._971:\n\
+ .align 2, 0\n\
+._970:\n\
+ .word 0x76aa\n\
+ .word 0x87dc\n\
+ .word 0x87da\n\
+._966:\n\
+ ldr r1, ._975 @ 0x6dac\n\
+ add r0, r5, r1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq ._972 @cond_branch\n\
+ b ._999\n\
+._972:\n\
+ mov r0, #0x5\n\
+ bl PlaySE\n\
+ mov r2, #0xc1\n\
+ lsl r2, r2, #0x2\n\
+ add r1, r5, r2\n\
+ mov r0, #0x7\n\
+ strh r0, [r1]\n\
+ b ._999\n\
+._976:\n\
+ .align 2, 0\n\
+._975:\n\
+ .word 0x6dac\n\
+._925:\n\
+ bl gpu_sync_bg_show\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ beq ._977 @cond_branch\n\
+ b ._999\n\
+._977:\n\
+ bl sub_80F3D00\n\
+ ldr r0, ._980 @ gSharedMem\n\
+ mov r4, #0xc1\n\
+ lsl r4, r4, #0x2\n\
+ add r0, r0, r4\n\
+ mov r1, #0x6\n\
+ strh r1, [r0]\n\
+ b ._999\n\
+._981:\n\
+ .align 2, 0\n\
+._980:\n\
+ .word gSharedMem\n\
+._926:\n\
+ bl sub_8055870\n\
+ cmp r0, #0\n\
+ bne ._999 @cond_branch\n\
+ ldr r0, ._984 @ gSharedMem\n\
+ mov r1, #0xc1\n\
+ lsl r1, r1, #0x2\n\
+ add r0, r0, r1\n\
+ b ._983\n\
+._985:\n\
+ .align 2, 0\n\
+._984:\n\
+ .word gSharedMem\n\
+._927:\n\
+ mov r0, #0x3\n\
+ bl sub_80EEFBC\n\
+ bl sub_80F3668\n\
+ ldr r0, ._987 @ gSharedMem\n\
+ mov r2, #0xc1\n\
+ lsl r2, r2, #0x2\n\
+ add r0, r0, r2\n\
+ mov r1, #0x8\n\
+ strh r1, [r0]\n\
+ b ._999\n\
+._988:\n\
+ .align 2, 0\n\
+._987:\n\
+ .word gSharedMem\n\
+._928:\n\
+ bl sub_80F7500\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ bne ._999 @cond_branch\n\
+ mov r0, #0x2\n\
+ bl sub_80EEFBC\n\
+ bl sub_80F3698\n\
+._945:\n\
+ ldr r0, ._991 @ gSharedMem\n\
+ mov r4, #0xc1\n\
+ lsl r4, r4, #0x2\n\
+ add r0, r0, r4\n\
+._983:\n\
+ mov r1, #0x4\n\
+ strh r1, [r0]\n\
+ b ._999\n\
+._992:\n\
+ .align 2, 0\n\
+._991:\n\
+ .word gSharedMem\n\
+._929:\n\
+ bl sub_80F5038\n\
+ lsl r0, r0, #0x18\n\
+ lsr r4, r0, #0x18\n\
+ cmp r4, #0\n\
+ bne ._999 @cond_branch\n\
+ mov r0, #0x0\n\
+ bl sub_80F0174\n\
+ bl sub_80F2F48\n\
+ ldr r5, ._995 @ gSharedMem\n\
+ mov r1, #0xc2\n\
+ lsl r1, r1, #0x2\n\
+ add r0, r5, r1\n\
+ ldr r0, [r0]\n\
+ mov r1, #0x1\n\
+ neg r1, r1\n\
+ str r4, [sp]\n\
+ mov r2, #0x0\n\
+ mov r3, #0x10\n\
+ bl BeginNormalPaletteFade\n\
+ mov r2, #0xc1\n\
+ lsl r2, r2, #0x2\n\
+ add r1, r5, r2\n\
+ mov r0, #0xb\n\
+ strh r0, [r1]\n\
+ b ._999\n\
+._996:\n\
+ .align 2, 0\n\
+._995:\n\
+ .word gSharedMem\n\
+._931:\n\
+ ldr r0, ._1000 @ gPaletteFade\n\
+ ldrb r1, [r0, #0x7]\n\
+ mov r0, #0x80\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ bne ._999 @cond_branch\n\
+ bl sub_80F3CE8\n\
+ bl sub_80F5BDC\n\
+ ldr r0, ._1000 + 4 @ gSharedMem\n\
+ ldr r4, ._1000 + 8 @ 0x76aa\n\
+ add r0, r0, r4\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ bne ._998 @cond_branch\n\
+ bl sub_80F357C\n\
+ mov r0, #0x1\n\
+ bl sub_80F2D6C\n\
+ mov r0, #0x6\n\
+ bl sub_80F2D6C\n\
+ ldr r0, ._1000 + 12 @ sub_80ECA10\n\
+ bl sub_80EBDBC\n\
+ b ._999\n\
+._1001:\n\
+ .align 2, 0\n\
+._1000:\n\
+ .word gPaletteFade\n\
+ .word gSharedMem\n\
+ .word 0x76aa\n\
+ .word sub_80ECA10+1\n\
+._998:\n\
+ bl sub_80F3614\n\
+ ldr r0, ._1003 @ sub_80ED3D0\n\
+ bl sub_80EBDBC\n\
+._999:\n\
+ ldr r0, ._1003 + 4 @ gLinkOpen\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0x1\n\
+ bne ._1002 @cond_branch\n\
+ ldr r0, ._1003 + 8 @ gLink\n\
+ ldr r1, ._1003 + 12 @ 0xfbd\n\
+ add r0, r0, r1\n\
+ ldrb r0, [r0]\n\
+ mov r1, #0x4\n\
+ str r1, [sp]\n\
+ mov r1, #0x9\n\
+ mov r2, #0x6\n\
+ mov r3, #0x2\n\
+ bl debug_sub_8008264\n\
+._1002:\n\
+ add sp, sp, #0x4\n\
+ pop {r4, r5}\n\
+ pop {r0}\n\
+ bx r0\n\
+._1004:\n\
+ .align 2, 0\n\
+._1003:\n\
+ .word sub_80ED3D0+1\n\
+ .word gLinkOpen\n\
+ .word gLink\n\
+ .word 0xfbd");
+}
+#else
+__attribute__((naked))
+void sub_80ED858()
+{
asm_unified("push {r4,r5,lr}\n\
sub sp, 0x4\n\
ldr r1, _080ED878 @ =gSharedMem\n\
@@ -2114,6 +2589,7 @@ _080EDB7A:\n\
_080EDB84: .4byte sub_80ED3D0\n");
}
#endif
+#endif
void sub_80EDB88()
{
@@ -2198,6 +2674,10 @@ void sub_80EDB88()
case 16:
sub_80EED2C(0x4);
ewram0_10.var304++;
+#if DEBUG
+ if (gLinkOpen == TRUE)
+ debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF800), 4);
+#endif
break;
case 17:
if (!gPaletteFade.active)
@@ -2216,21 +2696,23 @@ void sub_80EDDBC()
case 1:
PlaySE(SE_SELECT);
ShowMapNamePopUpWindow();
- break;
+ return;
case 2:
PlaySE(SE_SELECT);
ewram0_10.var304++;
- break;
+ return;
default:
if (gMain.newKeys & A_BUTTON)
{
PlaySE(SE_SELECT);
sub_80EBDBC(&sub_80EDEE4);
+ return;
}
else if (gMain.newKeys & B_BUTTON)
{
PlaySE(SE_SELECT);
sub_80EBDBC(&sub_80EDE70);
+ return;
}
break;
}
@@ -2247,8 +2729,11 @@ void sub_80EDDBC()
if (!sub_8055870())
ewram0_10.var304 = 0;
break;
-
}
+#if DEBUG
+ if (gLinkOpen == TRUE)
+ debug_sub_8008264(gLink.recvQueue.count, 1, 8, 2, 4);
+#endif
}
void sub_80EDE70()
@@ -2320,6 +2805,10 @@ void sub_80EDEE4()
case 8:
sub_80EED2C(0x3);
ewram0_10.var304++;
+#if DEBUG
+ if (gLinkOpen == TRUE)
+ debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF000), 4);
+#endif
break;
case 9:
if (!gPaletteFade.active)
@@ -2392,7 +2881,7 @@ void sub_80EE06C()
PlaySE(SE_SELECT);
sub_80F3B94();
ewram0_10.var304 = 0x7;
- break;
+ return;
default:
case 0:
if (gMain.newKeys & B_BUTTON)
@@ -2416,6 +2905,10 @@ void sub_80EE06C()
}
break;
}
+#if DEBUG
+ if (gLinkOpen == TRUE)
+ debug_sub_8008264(gLink.recvQueue.count, 1, 4, 2, 4);
+#endif
}
void sub_80EE294()
@@ -2461,6 +2954,10 @@ void sub_80EE294()
case 7:
sub_80EED2C(0x4);
ewram0_10.var304++;
+#if DEBUG
+ if (gLinkOpen == TRUE)
+ debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF800), 4);
+#endif
break;
case 8:
if (!gPaletteFade.active)
@@ -2537,6 +3034,10 @@ void sub_80EE3D8()
case 12:
sub_80EED2C(0x5);
ewram0_10.var304++;
+#if DEBUG
+ if (gLinkOpen == TRUE)
+ debug_sub_8008218((void *)(VRAM + 0x7DE0), 0, (void *)(VRAM + 0xF800), 4);
+#endif
break;
case 13:
if (!gPaletteFade.active)
@@ -2555,21 +3056,23 @@ void sub_80EE58C()
case 1:
PlaySE(SE_SELECT);
sub_80F0FFC(ewram0_10.var876E);
- break;
+ return;
case 2:
PlaySE(SE_SELECT);
ewram0_10.var304++;
- break;
+ return;
default:
if (gMain.newKeys & A_BUTTON)
{
PlaySE(SE_SELECT);
sub_80EBDBC(&sub_80EE658);
+ return;
}
else if (gMain.newKeys & B_BUTTON)
{
PlaySE(SE_SELECT);
sub_80EBDBC(&sub_80EE8F4);
+ return;
}
break;
}
@@ -2587,6 +3090,10 @@ void sub_80EE58C()
ewram0_10.var304 = 0;
break;
}
+#if DEBUG
+ if (gLinkOpen == TRUE)
+ debug_sub_8008264(gLink.recvQueue.count, 1, 3, 2, 4);
+#endif
}
void sub_80EE658()
@@ -3038,6 +3545,10 @@ bool8 sub_80EEC10()
} while (!ewram0_10.var6db2[ewram0_11.var6dad]);
return TRUE;
}
+#if DEBUG
+ if (gLinkOpen == TRUE)
+ debug_sub_8008264(gLink.recvQueue.count, 6, 10, 2, 4);
+#endif
return FALSE;
}
@@ -3055,6 +3566,10 @@ bool8 sub_80EEC90()
ewram0_11.var6dad = 0;
return TRUE;
}
+#if DEBUG
+ if (gLinkOpen == TRUE)
+ debug_sub_8008264(gLink.recvQueue.count, 6, 10, 2, 4);
+#endif
return FALSE;
}
diff --git a/src/engine/random.c b/src/random.c
index 8f82b722f..8f82b722f 100644
--- a/src/engine/random.c
+++ b/src/random.c
diff --git a/src/engine/record_mixing.c b/src/record_mixing.c
index a2660bf82..a2660bf82 100644
--- a/src/engine/record_mixing.c
+++ b/src/record_mixing.c
diff --git a/src/field/region_map.c b/src/region_map.c
index 1378820fe..e40fb7752 100644
--- a/src/field/region_map.c
+++ b/src/region_map.c
@@ -141,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
@@ -280,7 +280,7 @@ static u16 sub_80FB9C0(u16);
static void sub_80FBA18(void);
static bool8 sub_80FBAA0(u16);
void CreateRegionMapCursor(u16, u16);
-static void sub_80FBCA0(void);
+void sub_80FBCA0(void);
static void sub_80FBDF8(void);
static void sub_80FBE24(void);
static void SpriteCB_PlayerIconZoomedOut(struct Sprite *);
@@ -288,8 +288,8 @@ static void UpdateIconBlink(struct Sprite *);
static void SpriteCB_PlayerIconZoomedIn(struct Sprite *);
const u8 *GetMapSectionName(u8 *, u16, u16);
static void VBlankCB_FlyRegionMap(void);
-static void CB2_FlyRegionMap(void);
-static void sub_80FC244(void (*func)(void));
+void CB2_FlyRegionMap(void);
+void sub_80FC244(void (*func)(void));
static void PrintFlyTargetName(void);
static void CreateFlyTargetGraphics(void);
static void CreateCityTownFlyTargetIcons(void);
@@ -297,7 +297,7 @@ static void CreateSpecialAreaFlyTargetIcons(void);
static void SpriteCB_FlyTargetIcons(struct Sprite *);
static void sub_80FC5B4(void);
static void sub_80FC600(void);
-static void sub_80FC69C(void);
+void sub_80FC69C(void);
void InitRegionMap(struct RegionMap *regionMap, bool8 zoomed)
{
@@ -1127,7 +1127,7 @@ void CreateRegionMapCursor(u16 tileTag, u16 paletteTag)
}
}
-static void sub_80FBCA0(void)
+void sub_80FBCA0(void)
{
if (gRegionMap->cursorSprite != NULL)
{
@@ -1411,22 +1411,26 @@ static const u8 sUnknown_083E7920[][3] =
{0, 49, 0},
};
-struct UnknownStruct4
+static const u8 *const sEverGrandeCityAreaNames[] =
{
- const u8 *const *unk0;
- u16 mapSectionId;
- u16 flag;
+ OtherText_PokeLeague,
+ OtherText_PokeCenter,
};
-static const u8 *const sEverGrandeCityAreaNames[] = {OtherText_PokeLeague, OtherText_PokeCenter};
+struct MultiPartMapSection
+{
+ const u8 *const *partNames;
+ u16 mapSectionId;
+ u16 requiredFlag;
+};
-static const struct UnknownStruct4 sUnknown_083E79C0[1] =
+// Map sections that are divided into multiple parts. Ever Grande City is the only one.
+static const struct MultiPartMapSection sMultiPartMapSections[1] =
{
{sEverGrandeCityAreaNames, MAPSEC_EVER_GRANDE_CITY, FLAG_SYS_POKEMON_LEAGUE_FLY},
};
-// XXX: what is this?
-static u8 *const ewram_ = gSharedMem;
+static struct UnknownStruct3 *const sFlyDataPtr = (struct UnknownStruct3 *)gSharedMem;
static const struct SpritePalette sFlyTargetIconSpritePalette = {sFlyTargetIcons_Pal, 2};
@@ -1547,10 +1551,10 @@ void CB2_InitFlyRegionMap(void)
Menu_EraseScreen();
break;
case 3:
- InitRegionMap(&ewram0_3.regionMap, 0);
+ InitRegionMap(&sFlyDataPtr->regionMap, 0);
CreateRegionMapCursor(0, 0);
CreateRegionMapPlayerIcon(1, 1);
- ewram0_3.unk6 = ewram0_3.regionMap.mapSectionId;
+ sFlyDataPtr->unk6 = sFlyDataPtr->regionMap.mapSectionId;
StringFill(ewramBlankMapName, CHAR_SPACE, 12);
PrintFlyTargetName();
break;
@@ -1591,38 +1595,36 @@ static void VBlankCB_FlyRegionMap(void)
TransferPlttBuffer();
}
-static void CB2_FlyRegionMap(void)
+void CB2_FlyRegionMap(void)
{
- ewram0_3.unk0();
+ sFlyDataPtr->unk0();
AnimateSprites();
BuildOamBuffer();
}
-static void sub_80FC244(void (*func)(void))
+void sub_80FC244(void (*func)(void))
{
- ewram0_3.unk0 = func;
- ewram0_3.unk4 = 0;
+ sFlyDataPtr->unk0 = func;
+ sFlyDataPtr->unk4 = 0;
}
static void PrintFlyTargetName(void)
{
- if (ewram0_3.regionMap.unk16 == 2 || ewram0_3.regionMap.unk16 == 4)
+ if (sFlyDataPtr->regionMap.unk16 == 2 || sFlyDataPtr->regionMap.unk16 == 4)
{
+ bool8 drawFrameDisabled = FALSE;
u16 i;
- bool32 drawFrameDisabled = FALSE;
- for (i = 0; i < ARRAY_COUNT(sUnknown_083E79C0); i++)
+ for (i = 0; i < ARRAY_COUNT(sMultiPartMapSections); i++)
{
- const struct UnknownStruct4 *r4 = &sUnknown_083E79C0[i];
-
- if (ewram0_3.regionMap.mapSectionId == r4->mapSectionId)
+ if (sFlyDataPtr->regionMap.mapSectionId == sMultiPartMapSections[i].mapSectionId)
{
- if (FlagGet(r4->flag))
+ if (FlagGet(sMultiPartMapSections[i].requiredFlag))
{
Menu_DrawStdWindowFrame(16, 14, 29, 19);
- Menu_PrintText(ewram0_3.regionMap.mapSectionName, 17, 15);
- MenuPrint_RightAligned(r4->unk0[ewram0_3.regionMap.everGrandeCityArea], 29, 17);
- return;
+ Menu_PrintText(sFlyDataPtr->regionMap.mapSectionName, 17, 15);
+ MenuPrint_RightAligned(sMultiPartMapSections[i].partNames[sFlyDataPtr->regionMap.everGrandeCityArea], 29, 17);
+ drawFrameDisabled = TRUE;
}
break;
}
@@ -1631,7 +1633,7 @@ static void PrintFlyTargetName(void)
if (!drawFrameDisabled)
{
Menu_DrawStdWindowFrame(16, 16, 29, 19);
- Menu_PrintText(ewram0_3.regionMap.mapSectionName, 17, 17);
+ Menu_PrintText(sFlyDataPtr->regionMap.mapSectionName, 17, 17);
Menu_EraseWindowRect(16, 14, 29, 15);
}
}
@@ -1732,7 +1734,7 @@ static void CreateSpecialAreaFlyTargetIcons(void)
static void SpriteCB_FlyTargetIcons(struct Sprite *sprite)
{
// Blink if our mapSectionId is the one selected on the map
- if (ewram0_3.regionMap.mapSectionId == sprite->data[0])
+ if (sFlyDataPtr->regionMap.mapSectionId == sprite->data[0])
{
// Toggle visibility every 16 frames
sprite->data[1]++;
@@ -1751,11 +1753,11 @@ static void SpriteCB_FlyTargetIcons(struct Sprite *sprite)
static void sub_80FC5B4(void)
{
- switch (ewram0_3.unk4)
+ switch (sFlyDataPtr->unk4)
{
case 0:
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
- ewram0_3.unk4++;
+ sFlyDataPtr->unk4++;
break;
case 1:
if (UpdatePaletteFade() != 0)
@@ -1767,7 +1769,7 @@ static void sub_80FC5B4(void)
static void sub_80FC600(void)
{
- if (ewram0_3.unk4 == 0)
+ if (sFlyDataPtr->unk4 == 0)
{
switch (sub_80FAB60())
{
@@ -1779,7 +1781,7 @@ static void sub_80FC600(void)
PrintFlyTargetName();
break;
case INPUT_EVENT_A_BUTTON:
- if (ewram0_3.regionMap.unk16 == 2 || ewram0_3.regionMap.unk16 == 4)
+ if (sFlyDataPtr->regionMap.unk16 == 2 || sFlyDataPtr->regionMap.unk16 == 4)
{
m4aSongNumStart(SE_SELECT);
ewramA6E = 1;
@@ -1795,13 +1797,13 @@ static void sub_80FC600(void)
}
}
-static void sub_80FC69C(void)
+void sub_80FC69C(void)
{
- switch (ewram0_3.unk4)
+ switch (sFlyDataPtr->unk4)
{
case 0:
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
- ewram0_3.unk4++;
+ sFlyDataPtr->unk4++;
break;
case 1:
if (UpdatePaletteFade() != 0)
@@ -1809,7 +1811,7 @@ static void sub_80FC69C(void)
FreeRegionMapIconResources();
if (ewramA6E != 0)
{
- switch (ewram0_3.regionMap.mapSectionId)
+ switch (sFlyDataPtr->regionMap.mapSectionId)
{
case MAPSEC_SOUTHERN_ISLAND:
sub_8053538(22);
@@ -1821,13 +1823,13 @@ static void sub_80FC69C(void)
sub_8053538((gSaveBlock2.playerGender == MALE) ? 12 : 13);
break;
case MAPSEC_EVER_GRANDE_CITY:
- sub_8053538((FlagGet(FLAG_SYS_POKEMON_LEAGUE_FLY) && ewram0_3.regionMap.everGrandeCityArea == 0) ? 20 : 11);
+ sub_8053538((FlagGet(FLAG_SYS_POKEMON_LEAGUE_FLY) && sFlyDataPtr->regionMap.everGrandeCityArea == 0) ? 20 : 11);
break;
default:
- if (sUnknown_083E7920[ewram0_3.regionMap.mapSectionId][2] != 0)
- sub_8053538(sUnknown_083E7920[ewram0_3.regionMap.mapSectionId][2]);
+ if (sUnknown_083E7920[sFlyDataPtr->regionMap.mapSectionId][2] != 0)
+ sub_8053538(sUnknown_083E7920[sFlyDataPtr->regionMap.mapSectionId][2]);
else
- warp1_set_2(sUnknown_083E7920[ewram0_3.regionMap.mapSectionId][0], sUnknown_083E7920[ewram0_3.regionMap.mapSectionId][1], -1);
+ warp1_set_2(sUnknown_083E7920[sFlyDataPtr->regionMap.mapSectionId][0], sUnknown_083E7920[sFlyDataPtr->regionMap.mapSectionId][1], -1);
break;
}
sub_80865BC();
@@ -1839,3 +1841,131 @@ static void sub_80FC69C(void)
break;
}
}
+
+#if DEBUG
+
+void debug_sub_8110CCC(void)
+{
+ bool8 r7 = FALSE;
+ u16 i;
+ s16 indent;
+
+ for (i = 0; i < ARRAY_COUNT(sMultiPartMapSections); i++)
+ {
+ if (sFlyDataPtr->regionMap.mapSectionId == sMultiPartMapSections[i].mapSectionId)
+ {
+ if (FlagGet(sMultiPartMapSections[i].requiredFlag))
+ {
+ indent = 12 - StringLength(sMultiPartMapSections[i].partNames[sFlyDataPtr->regionMap.everGrandeCityArea]);
+ if (indent < 0)
+ indent = 0;
+ r7 = TRUE;
+ Menu_DrawStdWindowFrame(16, 14, 29, 19);
+ Menu_PrintText(sFlyDataPtr->regionMap.mapSectionName, 17, 15);
+ Menu_PrintText(sMultiPartMapSections[i].partNames[sFlyDataPtr->regionMap.everGrandeCityArea], 17 + indent, 17);
+ }
+ break;
+ }
+ }
+ if (!r7)
+ {
+ Menu_DrawStdWindowFrame(16, 16, 29, 19);
+ Menu_PrintText(sFlyDataPtr->regionMap.mapSectionName, 17, 17);
+ Menu_EraseWindowRect(16, 14, 29, 15);
+ }
+}
+
+void debug_sub_8110D84(void)
+{
+ switch (sFlyDataPtr->unk4)
+ {
+ case 0:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
+ sFlyDataPtr->unk4++;
+ break;
+ case 1:
+ if (!UpdatePaletteFade())
+ sFlyDataPtr->unk4++;
+ break;
+ case 2:
+ switch (sub_80FAB60())
+ {
+ case 0:
+ break;
+ case 3:
+ debug_sub_8110CCC();
+ break;
+ case 4:
+ if (sFlyDataPtr->regionMap.unk16 != 0)
+ {
+ m4aSongNumStart(SE_SELECT);
+ gSharedMem[0xA6E] = 1; // TODO: what is this?
+ sub_80FC244(sub_80FC69C);
+ }
+ break;
+ case 5:
+ m4aSongNumStart(SE_SELECT);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ sFlyDataPtr->unk4++;
+ break;
+ }
+ break;
+ case 3:
+ if (!UpdatePaletteFade())
+ SetMainCallback2(sub_805469C);
+ break;
+ case 4:
+ if (sub_80FAB60() != 0)
+ {
+ debug_sub_8110CCC();
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ sub_80FBCA0();
+ sub_80FAEC4();
+ sFlyDataPtr->unk4++;
+ }
+ break;
+ case 5:
+ if (sub_80FAFC0() == 0)
+ {
+ CreateRegionMapCursor(0, 0);
+ sFlyDataPtr->unk4++;
+ }
+ break;
+ case 6:
+ if (sub_80FAB60() != 0)
+ {
+ debug_sub_8110CCC();
+ }
+ if (gMain.newKeys & A_BUTTON) // no "else if" like above?
+ {
+ sub_80FBCA0();
+ sub_80FAEC4();
+ sFlyDataPtr->unk4++;
+ }
+ break;
+ case 7:
+ if (sub_80FAFC0() == 0)
+ {
+ CreateRegionMapCursor(0, 0);
+ sFlyDataPtr->unk4 = 3;
+ }
+ break;
+ }
+}
+
+void debug_sub_8110F28(void)
+{
+ CB2_InitFlyRegionMap();
+
+ if (gMain.callback2 == CB2_FlyRegionMap)
+ {
+ sub_80FBF94();
+ sub_80FC244(debug_sub_8110D84);
+ debug_sub_8110CCC();
+ }
+}
+
+#endif
+
diff --git a/src/engine/reset_rtc_screen.c b/src/reset_rtc_screen.c
index ce4afe922..8c2c23569 100644
--- a/src/engine/reset_rtc_screen.c
+++ b/src/reset_rtc_screen.c
@@ -5,6 +5,7 @@
#include "palette.h"
#include "rtc.h"
#include "save.h"
+#include "script.h"
#include "sprite.h"
#include "constants/songs.h"
#include "sound.h"
@@ -569,6 +570,7 @@ void Task_ResetRtcScreen(u8 taskId)
PlaySE(SE_BOO);
}
data[0] = 5;
+ // fall through
case 5:
if (gMain.newKeys & A_BUTTON)
{
@@ -579,6 +581,7 @@ void Task_ResetRtcScreen(u8 taskId)
{
break;
}
+ // fall through
case 6:
if (!gPaletteFade.active)
{
@@ -587,3 +590,103 @@ void Task_ResetRtcScreen(u8 taskId)
}
}
}
+
+#if DEBUG
+void debug_sub_806F8F8(void)
+{
+ SetMainCallback2(CB2_InitResetRtcScreen);
+}
+
+void debug_sub_806F908(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ case 0:
+ data[1] = CreateTask(Task_ResetRtc_0, 80);
+ data[0]++;
+ break;
+ case 1:
+ if (gTasks[data[1]].data[0] != 0)
+ {
+ if (gTasks[data[1]].data[1] == 1)
+ RtcCalcLocalTimeOffset(gLocalTime.days, gLocalTime.hours, gLocalTime.minutes, gLocalTime.seconds);
+ DestroyTask(data[1]);
+ Menu_EraseScreen();
+ ScriptContext2_Disable();
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+void debug_sub_806F99C(void)
+{
+ RtcCalcLocalTime();
+ CreateTask(debug_sub_806F908, 80);
+ ScriptContext2_Enable();
+}
+
+void debug_sub_806F9B8(void)
+{
+ gLocalTime = gSaveBlock2.lastBerryTreeUpdate;
+ CreateTask(debug_sub_806F908, 80);
+ ScriptContext2_Enable();
+}
+
+static const u8 sDebugText_Days[] = _("にっすう"); // "days"
+static const u8 sDebugText_Time[] = _("じかん"); // "time"
+static const u8 sDebugText_GameTime[] = _("ゲームない じかん"); // "game time"
+static const u8 sDebugText_RTCTime[] = _("RTC じかん"); // "RTC time"
+
+void debug_sub_806F9E4(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ u8 *str = gStringVar4;
+
+ switch (data[0])
+ {
+ case 0:
+ data[0]++;
+ break;
+ case 1:
+ Menu_DrawStdWindowFrame(0, 9, 29, 19);
+ ConvertIntToHexStringN(str + 80, RtcGetErrorStatus(), 2, 4);
+ Menu_PrintText(str + 80, 2, 10);
+ Menu_PrintText(sDebugText_Days, 12, 12);
+ Menu_PrintText(sDebugText_Time, 20, 12);
+ Menu_PrintText(sDebugText_RTCTime, 1, 14);
+ Menu_PrintText(sDebugText_GameTime, 1, 16);
+ data[0]++;
+ break;
+ case 2:
+ RtcCalcLocalTime();
+ FormatHexRtcTime(str);
+ debug_sub_8009894(str + 20);
+ FormatDecimalTime(str + 40, gLocalTime.hours, gLocalTime.minutes, gLocalTime.seconds);
+ ConvertIntToDecimalStringN(str + 60, gLocalTime.days, 1, 4);
+ if (gSaveBlock2.playTimeVBlanks == 0)
+ {
+ Menu_PrintText(str, 20, 14);
+ Menu_PrintText(str + 20, 12, 14);
+ Menu_PrintText(str + 40, 20, 16);
+ Menu_PrintText(str + 60, 12, 16);
+ }
+ if (data[1] > 19) // Did you mean < 19?
+ {
+ data[1]++;
+ }
+ else
+ {
+ if (gMain.newKeys & A_BUTTON)
+ {
+ Menu_EraseScreen();
+ DestroyTask(taskId);
+ ScriptContext2_Disable();
+ }
+ }
+ break;
+ }
+}
+#endif \ No newline at end of file
diff --git a/src/field/roamer.c b/src/roamer.c
index 2eb26ef9d..6ed5b6c89 100644
--- a/src/field/roamer.c
+++ b/src/roamer.c
@@ -1,7 +1,9 @@
#include "global.h"
+#include "debug.h"
#include "roamer.h"
#include "pokemon.h"
#include "random.h"
+#include "region_map.h"
#include "constants/species.h"
#ifdef SAPPHIRE
@@ -224,3 +226,20 @@ void GetRoamerLocation(u8 *mapGroup, u8 *mapNum)
*mapGroup = sRoamerLocation[MAP_GRP];
*mapNum = sRoamerLocation[MAP_NUM];
}
+
+#if DEBUG
+void debug_sub_814A714(void)
+{
+ if (gSaveBlock1.location.mapGroup == 0)
+ {
+ CreateInitialRoamerMon();
+ sRoamerLocation[0] = 0;
+ sRoamerLocation[1] = gSaveBlock1.location.mapNum;
+ }
+}
+
+void debug_sub_814A73C(u8* str)
+{
+ GetMapSectionName(str, sRoamerLocation[1], 0);
+}
+#endif
diff --git a/src/rom3.c b/src/rom3.c
index 713713162..7b3051b86 100644
--- a/src/rom3.c
+++ b/src/rom3.c
@@ -67,6 +67,10 @@ void sub_800B858(void)
}
}
+#if DEBUG
+extern u8 gUnknown_02023A14_50;
+#endif
+
void setup_poochyena_battle(void)
{
s32 i;
@@ -93,6 +97,16 @@ void setup_poochyena_battle(void)
}
gUnknown_020239FC = 0;
gUnknown_02024C78 = 0;
+
+#if DEBUG
+ if (gUnknown_02023A14_50 & 0x80)
+ {
+ gSharedMem[0x160fd] = 0;
+ gSharedMem[0x160fe] = 0;
+ gSharedMem[0x160ff] = 0;
+ ((u32 *) gBattleBuffersTransferData)[64]++;
+ }
+#endif
}
void sub_800B950(void)
@@ -463,7 +477,7 @@ void sub_800C1A8(u8 taskId)
}
break;
case 4:
- if (sub_8007ECC())
+ if (IsLinkTaskFinished())
{
var = (ewram14004arr(0, gTasks[taskId].data[15]) | (ewram14004arr(1, gTasks[taskId].data[15]) << 8));
gTasks[taskId].data[13] = 1;
diff --git a/src/rom6.c b/src/rom6.c
index 62fbc987c..ffd01fdb9 100644
--- a/src/rom6.c
+++ b/src/rom6.c
@@ -1,14 +1,15 @@
#include "global.h"
+#include "constants/map_objects.h"
+#include "constants/songs.h"
#include "rom6.h"
#include "braille_puzzles.h"
#include "field_effect.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "field_player_avatar.h"
#include "item_use.h"
#include "pokemon_menu.h"
#include "overworld.h"
#include "script.h"
-#include "constants/songs.h"
#include "sound.h"
#include "sprite.h"
#include "task.h"
@@ -116,6 +117,21 @@ static void sub_810B4CC(u8 taskId)
DestroyTask(taskId);
}
+#if DEBUG
+void debug_sub_8120968(void)
+{
+ if (npc_before_player_of_type(MAP_OBJ_GFX_BREAKABLE_ROCK) == TRUE)
+ {
+ gLastFieldPokeMenuOpened = 0;
+ sub_810B53C();
+ }
+ else
+ {
+ ScriptContext2_Disable();
+ }
+}
+#endif
+
bool8 SetUpFieldMove_RockSmash(void)
{
if (npc_before_player_of_type(0x56) == TRUE)
diff --git a/src/rom_800D42C.c b/src/rom_800D42C.c
deleted file mode 100644
index a1b0f5ecb..000000000
--- a/src/rom_800D42C.c
+++ /dev/null
@@ -1,119 +0,0 @@
-#include "global.h"
-#include "battle.h"
-#include "link.h"
-#include "text.h"
-#include "ewram.h"
-
-extern u16 gBattleTypeFlags;
-extern u8 gBattleOutcome;
-
-extern struct Window gUnknown_03004210;
-
-extern u8 BattleText_Win[];
-extern u8 BattleText_Loss[];
-extern u8 BattleText_Tie[];
-
-#if ENGLISH
-#define LEFT_MESSAGE_X 6
-#define RIGHT_MESSAGE_X 21
-#define TILE_OFFSET_LOSS 168
-#elif GERMAN
-#define LEFT_MESSAGE_X 5
-#define RIGHT_MESSAGE_X 20
-#define TILE_OFFSET_LOSS 172
-#endif
-#define TILE_OFFSET_WIN 160
-#define CENTER_MESSAGE_X 13
-#define MESSAGE_Y 2
-
-#define PRINT_MESSAGE(text, tileDataStartOffset, x) \
-{ \
- Text_InitWindow(&gUnknown_03004210, text, tileDataStartOffset, x, MESSAGE_Y); \
- Text_PrintWindow8002F44(&gUnknown_03004210); \
-}
-
-#define PRINT_MESSAGE_LEFT(text, tileDataStartOffset) PRINT_MESSAGE(text, tileDataStartOffset, LEFT_MESSAGE_X)
-#define PRINT_MESSAGE_RIGHT(text, tileDataStartOffset) PRINT_MESSAGE(text, tileDataStartOffset, RIGHT_MESSAGE_X)
-
-void PrintLinkBattleWinLossTie(void)
-{
-
- if (gBattleOutcome == 3)
- {
- PRINT_MESSAGE(BattleText_Tie, TILE_OFFSET_WIN, CENTER_MESSAGE_X);
- return;
- }
-
- if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
- {
- // Double battle?
-
- if (gBattleOutcome == 1)
- {
-
- // lp_field_18 = player position?
- switch (gLinkPlayers[gBattleStruct->linkPlayerIndex].lp_field_18)
- {
- case 0:
- case 2:
- PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN);
- PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS);
- return;
-
- case 1:
- case 3:
- PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN)
- PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS)
- return;
- }
- }
- else
- {
-
- switch (gLinkPlayers[gBattleStruct->linkPlayerIndex].lp_field_18)
- {
- case 1:
- case 3:
- PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN);
- PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS);
- return;
-
- case 0:
- case 2:
- PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN);
- PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS);
- return;
- }
- }
-
- return;
- }
-
-
- if (gBattleOutcome == 1)
- {
- if (gLinkPlayers[gBattleStruct->linkPlayerIndex].lp_field_18 != 0)
- {
- PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN);
- PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS);
- }
- else
- {
- PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN);
- PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS);
- }
- }
- else
- {
- if (gLinkPlayers[gBattleStruct->linkPlayerIndex].lp_field_18 != 0)
- {
- PRINT_MESSAGE_LEFT(BattleText_Win, TILE_OFFSET_WIN);
- PRINT_MESSAGE_RIGHT(BattleText_Loss, TILE_OFFSET_LOSS);
- }
- else
- {
- PRINT_MESSAGE_RIGHT(BattleText_Win, TILE_OFFSET_WIN);
- PRINT_MESSAGE_LEFT(BattleText_Loss, TILE_OFFSET_LOSS);
- }
- }
-}
diff --git a/src/rom_8077ABC.c b/src/rom_8077ABC.c
index 9d88c5e2a..4be3390ee 100644
--- a/src/rom_8077ABC.c
+++ b/src/rom_8077ABC.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "constants/battle_anim.h"
#include "constants/species.h"
#include "rom_8077ABC.h"
#include "battle.h"
@@ -30,7 +31,7 @@
#define gCastformElevations gUnknownCastformData_0837F5A8
#define gCastformBackSpriteYCoords gUnknown_0837F5AC
#define gTransformPersonalities gTransformedPersonalities
-#define gBattleMonSprites gObjectBankIDs
+#define gBattleMonSprites gBankSpriteIds
struct TransformStatus
{
@@ -550,7 +551,10 @@ void sub_8078278(struct Sprite *sprite)
}
}
-void sub_80782D8(struct Sprite *sprite)
+// Simply waits until the sprite's data[0] hits zero.
+// This is used to let sprite anims or affine anims to run for a designated
+// duration.
+void WaitAnimForDuration(struct Sprite *sprite)
{
if (sprite->data[0] > 0)
sprite->data[0]--;
@@ -561,7 +565,7 @@ void sub_80782D8(struct Sprite *sprite)
void sub_80782F8(struct Sprite *sprite)
{
sub_8078314(sprite);
- sprite->callback = sub_8078364;
+ sprite->callback = TranslateSpriteOverDuration;
sprite->callback(sprite);
}
@@ -579,7 +583,7 @@ void sub_8078314(struct Sprite *sprite)
sprite->data[1] = old;
}
-void sub_8078364(struct Sprite *sprite)
+void TranslateSpriteOverDuration(struct Sprite *sprite)
{
if (sprite->data[0] > 0)
{
@@ -635,7 +639,7 @@ void unref_sub_8078414(struct Sprite *sprite)
sprite->callback = sub_80782F8;
}
-void sub_8078458(struct Sprite *sprite)
+void TranslateMonBGUntil(struct Sprite *sprite)
{
if (sprite->data[0] > 0)
{
@@ -649,7 +653,9 @@ void sub_8078458(struct Sprite *sprite)
}
}
-void sub_80784A8(struct Sprite *sprite)
+// Same as TranslateMonBGUntil, but it operates on sub-pixel values
+// to handle slower translations.
+void TranslateMonBGSubPixelUntil(struct Sprite *sprite)
{
if (sprite->data[0] > 0)
{
@@ -761,18 +767,18 @@ void sub_807867C(struct Sprite *sprite, s16 a2)
}
}
-void sub_80786EC(struct Sprite *sprite)
+void InitAnimSpriteTranslationOverDuration(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);
+ InitAnimSpriteTranslationDeltas(sprite);
sprite->data[6] = 0x8000 / sprite->data[0];
sprite->data[7] = 0;
}
-bool8 sub_8078718(struct Sprite *sprite)
+bool8 TranslateAnimSpriteLinearAndSine(struct Sprite *sprite)
{
- if (sub_8078B5C(sprite))
+ if (TranslateAnimSpriteByDeltas(sprite))
return TRUE;
sprite->data[7] += sprite->data[6];
sprite->pos2.y += Sin((u8)(sprite->data[7] >> 8), sprite->data[5]);
@@ -798,7 +804,7 @@ void sub_8078764(struct Sprite *sprite, bool8 a2)
sprite->pos1.y += gBattleAnimArgs[1];
}
-void sub_80787B0(struct Sprite *sprite, u8 a2)
+void InitAnimSpritePos(struct Sprite *sprite, u8 a2)
{
if (!a2)
{
@@ -850,7 +856,7 @@ bool8 IsBankSpritePresent(u8 slot)
{
if (gBanksBySide[slot] == 0xff)
return FALSE;
- if (GetBankSide(slot))
+ if (GetBankSide(slot) != SIDE_PLAYER)
{
if (GetMonData(&gEnemyParty[gBattleMonPartyPositions[slot]], MON_DATA_HP) != 0)
return TRUE;
@@ -937,12 +943,12 @@ void sub_8078A34(struct Sprite *sprite)
{
sprite->data[1] = sprite->pos1.x;
sprite->data[3] = sprite->pos1.y;
- sub_8078A5C(sprite);
+ InitSpriteDataForLinearTranslation(sprite);
sprite->callback = sub_80783D0;
sprite->callback(sprite);
}
-void sub_8078A5C(struct Sprite *sprite)
+void InitSpriteDataForLinearTranslation(struct Sprite *sprite)
{
s16 x = (sprite->data[2] - sprite->data[1]) << 8;
s16 y = (sprite->data[4] - sprite->data[3]) << 8;
@@ -952,44 +958,44 @@ void sub_8078A5C(struct Sprite *sprite)
sprite->data[3] = 0;
}
-void obj_translate_based_on_private_1_2_3_4(struct Sprite *sprite)
+void InitAnimSpriteTranslationDeltas(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;
+ bool8 movingLeft = x < 0;
+ bool8 movingUp = y < 0;
+ u16 xDelta = abs(x) << 8;
+ u16 yDelta = abs(y) << 8;
- x2 = x2 / sprite->data[0];
- y2 = y2 / sprite->data[0];
+ xDelta = xDelta / sprite->data[0];
+ yDelta = yDelta / sprite->data[0];
- if (r8)
- x2 |= 1;
+ if (movingLeft)
+ xDelta |= 1;
else
- x2 &= ~1;
+ xDelta &= ~1;
- if (r9)
- y2 |= 1;
+ if (movingUp)
+ yDelta |= 1;
else
- y2 &= ~1;
+ yDelta &= ~1;
- sprite->data[1] = x2;
- sprite->data[2] = y2;
+ sprite->data[1] = xDelta;
+ sprite->data[2] = yDelta;
sprite->data[4] = 0;
sprite->data[3] = 0;
}
-void sub_8078B34(struct Sprite *sprite)
+void StartTranslateAnimSpriteByDeltas(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;
+ InitAnimSpriteTranslationDeltas(sprite);
+ sprite->callback = TranslateAnimSpriteByDeltasUntil;
sprite->callback(sprite);
}
-bool8 sub_8078B5C(struct Sprite *sprite)
+bool8 TranslateAnimSpriteByDeltas(struct Sprite *sprite)
{
u16 v1, v2, x, y;
@@ -1019,9 +1025,9 @@ bool8 sub_8078B5C(struct Sprite *sprite)
return FALSE;
}
-void sub_8078BB8(struct Sprite *sprite)
+void TranslateAnimSpriteByDeltasUntil(struct Sprite *sprite)
{
- if (sub_8078B5C(sprite))
+ if (TranslateAnimSpriteByDeltas(sprite))
SetCallbackToStoredInData(sprite);
}
@@ -1029,7 +1035,7 @@ 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);
+ InitAnimSpriteTranslationDeltas(sprite);
}
void sub_8078C00(struct Sprite *sprite)
@@ -1037,7 +1043,7 @@ 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 = TranslateAnimSpriteByDeltasUntil;
sprite->callback(sprite);
}
@@ -1160,13 +1166,13 @@ bool8 sub_8078E38()
return FALSE;
}
-void sub_8078E70(u8 sprite, u8 a2)
+void sub_8078E70(u8 sprite, u8 objMode)
{
u8 r7 = gSprites[sprite].data[0];
if (IsContest() || IsAnimBankSpriteVisible(r7))
gSprites[sprite].invisible = FALSE;
- gSprites[sprite].oam.objMode = a2;
+ gSprites[sprite].oam.objMode = objMode;
gSprites[sprite].affineAnimPaused = TRUE;
if (!IsContest() && !gSprites[sprite].oam.affineMode)
gSprites[sprite].oam.matrixNum = ewram17810[r7].unk6;
@@ -1231,7 +1237,7 @@ static u16 ArcTan2_(s16 a, s16 b)
return ArcTan2(a, b);
}
-u16 sub_80790F0(s16 a, s16 b)
+u16 ArcTan2Neg(s16 a, s16 b)
{
u16 var = ArcTan2_(a, b);
return -var;
@@ -1379,7 +1385,7 @@ void sub_80793C4(struct Sprite *sprite)
else
var = FALSE;
if (!gBattleAnimArgs[2])
- sub_80787B0(sprite, var);
+ InitAnimSpritePos(sprite, var);
else
sub_8078764(sprite, var);
sprite->data[0]++;
@@ -1391,7 +1397,15 @@ void sub_80793C4(struct Sprite *sprite)
}
}
-void sub_807941C(struct Sprite *sprite)
+// Linearly translates a sprite to a target position on the
+// other mon's sprite.
+// arg 0: initial x offset
+// arg 1: initial y offset
+// arg 2: target x offset
+// arg 3: target y offset
+// arg 4: duration
+// arg 5: lower 8 bits = location on attacking mon, upper 8 bits = location on target mon pick to target
+void TranslateAnimSpriteToTargetMonLocation(struct Sprite *sprite)
{
bool8 v1;
u8 v2;
@@ -1406,32 +1420,33 @@ void sub_807941C(struct Sprite *sprite)
else
v2 = 1;
- sub_80787B0(sprite, v1);
- if (GetBankSide(gAnimBankAttacker))
+ InitAnimSpritePos(sprite, v1);
+ if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER)
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+
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;
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
}
void sub_80794A8(struct Sprite *sprite)
{
- sub_80787B0(sprite, 1);
+ InitAnimSpritePos(sprite, 1);
if (GetBankSide(gAnimBankAttacker))
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
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);
+ InitAnimSpriteTranslationOverDuration(sprite);
sprite->callback = sub_8079518;
}
void sub_8079518(struct Sprite *sprite)
{
- if (sub_8078718(sprite))
+ if (TranslateAnimSpriteLinearAndSine(sprite))
DestroyAnimSprite(sprite);
}
@@ -1451,7 +1466,7 @@ void sub_8079534(struct Sprite *sprite)
}
if (!gBattleAnimArgs[5])
{
- sub_80787B0(sprite, r4);
+ InitAnimSpritePos(sprite, r4);
slot = gAnimBankAttacker;
}
else
@@ -1465,7 +1480,7 @@ void sub_8079534(struct Sprite *sprite)
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;
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
}
@@ -1549,20 +1564,26 @@ void sub_80796F8(u8 taskId)
}
}
-void sub_8079790(u8 task)
+// Linearly blends a mon's sprite colors with a target color with increasing
+// strength, and then blends out to the original color.
+// arg 0: anim bank
+// arg 1: blend color
+// arg 2: target blend coefficient
+// arg 3: initial delay
+// arg 4: number of times to blend in and out
+void AnimTask_BlendMonInAndOut(u8 task)
{
- u8 sprite = GetAnimBankSpriteId(gBattleAnimArgs[0]);
-
- if (sprite == 0xff)
+ u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
+ if (spriteId == 0xff)
{
DestroyAnimVisualTask(task);
return;
}
- gTasks[task].data[0] = (gSprites[sprite].oam.paletteNum * 0x10) + 0x101;
- sub_80797EC(&gTasks[task]);
+ gTasks[task].data[0] = (gSprites[spriteId].oam.paletteNum * 0x10) + 0x101;
+ AnimTask_BlendMonInAndOutSetup(&gTasks[task]);
}
-void sub_80797EC(struct Task *task)
+void AnimTask_BlendMonInAndOutSetup(struct Task *task)
{
task->data[1] = gBattleAnimArgs[1];
task->data[2] = 0;
@@ -1571,10 +1592,10 @@ void sub_80797EC(struct Task *task)
task->data[5] = gBattleAnimArgs[3];
task->data[6] = 0;
task->data[7] = gBattleAnimArgs[4];
- task->func = sub_8079814;
+ task->func = AnimTask_BlendMonInAndOutStep;
}
-void sub_8079814(u8 taskId)
+void AnimTask_BlendMonInAndOutStep(u8 taskId)
{
struct Task *task = &gTasks[taskId];
@@ -1584,14 +1605,14 @@ void sub_8079814(u8 taskId)
if (!task->data[6])
{
task->data[2]++;
- BlendPalette(task->data[0], 0xf, task->data[2], task->data[1]);
+ BlendPalette(task->data[0], 15, task->data[2], task->data[1]);
if (task->data[2] == task->data[3])
task->data[6] = 1;
}
else
{
task->data[2]--;
- BlendPalette(task->data[0], 0xf, task->data[2], task->data[1]);
+ BlendPalette(task->data[0], 15, task->data[2], task->data[1]);
if (!task->data[2])
{
if (--task->data[7])
@@ -1619,7 +1640,7 @@ void sub_80798AC(u8 task)
return;
}
gTasks[task].data[0] = (palette * 0x10) + 0x101;
- sub_80797EC(&gTasks[task]);
+ AnimTask_BlendMonInAndOutSetup(&gTasks[task]);
}
void sub_80798F4(struct Task *task, u8 a2, const void *a3)
@@ -1861,26 +1882,26 @@ void sub_8079E24()
}
}
-u8 sub_8079E90(u8 slot)
+u8 sub_8079E90(u8 bank)
{
- u8 status;
+ u8 identity;
u8 ret;
if (IsContest())
{
- if (slot == 2)
+ if (bank == ANIM_BANK_ATK_PARTNER)
return 30;
else
return 40;
}
else
{
- status = GetBankIdentity(slot);
- if (status == 0)
+ identity = GetBankIdentity(bank);
+ if (identity == IDENTITY_PLAYER_MON1)
ret = 30;
- else if (status == 2)
+ else if (identity == IDENTITY_PLAYER_MON2)
ret = 20;
- else if (status == 1)
+ else if (identity == IDENTITY_OPPONENT_MON1)
ret = 40;
else
ret = 50;
@@ -1970,7 +1991,7 @@ void sub_807A0F4(struct Sprite *sprite)
DestroySpriteAndFreeResources(sprite);
}
-int sub_807A100(u8 slot, u8 a2)
+s16 sub_807A100(u8 slot, u8 a2)
{
u16 species;
u32 personality;
@@ -2106,7 +2127,7 @@ int sub_807A100(u8 slot, u8 a2)
}
}
-void sub_807A3FC(u8 slot, bool8 a2, s16 *a3, s16 *a4)
+void SetAverageBattlerPositions(u8 slot, bool8 a2, s16 *x, s16 *y)
{
u8 v1, v2;
s16 v3, v4;
@@ -2134,11 +2155,11 @@ void sub_807A3FC(u8 slot, bool8 a2, s16 *a3, s16 *a4)
v5 = v3;
v6 = v4;
}
- *a3 = (v3 + v5) / 2;
- *a4 = (v4 + v6) / 2;
+ *x = (v3 + v5) / 2;
+ *y = (v4 + v6) / 2;
}
-u8 sub_807A4A0(int a1, u8 sprite, int a3)
+u8 sub_807A4A0(int bank, u8 sprite, int species)
{
u8 new_sprite = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy);
gSprites[new_sprite] = gSprites[sprite];
@@ -2337,6 +2358,6 @@ void sub_807A9BC(struct Sprite *sprite)
sprite->pos1.x += x;
sprite->pos1.y = gBattleAnimArgs[5] - 80;
}
- sprite->callback = sub_8078B34;
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
}
diff --git a/src/field/rotating_gate.c b/src/rotating_gate.c
index 00008c69c..69f655a65 100644
--- a/src/field/rotating_gate.c
+++ b/src/rotating_gate.c
@@ -1,7 +1,7 @@
#include "global.h"
#include "bike.h"
#include "event_data.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "fieldmap.h"
#include "constants/maps.h"
#include "constants/songs.h"
diff --git a/src/roulette.c b/src/roulette.c
index 41e8ef77f..5e7517d79 100644
--- a/src/roulette.c
+++ b/src/roulette.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "random.h"
#include "ewram.h"
#include "field_fadetransition.h"
#include "constants/game_stat.h"
@@ -131,6 +132,12 @@ struct StructgUnknown_083F8D90
u32 var04;
};
+#if DEBUG
+void *gUnknown_Debug_03005FB8;
+#endif
+
+#define static
+
static void sub_81150FC(void);
static void sub_8115124(void);
static void sub_8115238(void);
@@ -297,6 +304,7 @@ extern const struct SpriteTemplate gSpriteTemplate_83FA434;
extern void (*gFieldCallback)(void);
extern struct MusicPlayerInfo gMPlay_SE1;
extern struct MusicPlayerInfo gMPlay_SE2;
+extern struct MusicPlayerInfo gMPlay_SE3;
extern const u16 gUnknown_083FA60E[0x2][0x2];
extern const struct SpriteTemplate gSpriteTemplate_83FA50C;
extern const struct SpriteTemplate gSpriteTemplate_83FA5C0[];
@@ -308,7 +316,10 @@ extern const u16 gUnknown_083FA632[];
extern const s8 gUnknown_083FA64A[0x2];
extern const s8 gUnknown_083FA64C[0x8][0x2];
-
+#if DEBUG
+EWRAM_DATA u8 unk_203955C[4] = { 0 };
+EWRAM_DATA u8 unk_2039560 = 0;
+#endif
void sub_81150FC(void)
@@ -348,22 +359,20 @@ void sub_8115124(void)
REG_BG0CNT = 0x1F08;
DmaFill16(3, 0x0, (void *)(VRAM + 0xF9C0), 0x340);
eRoulette->var28 = 0x0;
- break;
case 0x0:
+ break;
}
}
-#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);
+ u16 arr[0x3]; // the third is never used ?
+
+ memcpy(arr, &gUnknown_083F8EC4, 0x6);
+ // u16 arr[] = {RGB(24, 4, 10), RGB(10, 19, 6), RGB(24, 4, 10)};
memset(eRoulette, 0x0, 0x17C);
eRoulette->var04_0 = (gSpecialVar_0x8004 & 0x1);
if (gSpecialVar_0x8004 & 0x80)
@@ -371,25 +380,12 @@ void sub_8115238(void)
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->var19 = temp = gUnknown_083F8DF0[eRoulette->var04_0 + eRoulette->var04_7 * 2];
eRoulette->var1A_4 = 0x1;
if (temp == 0x1)
- {
- unfaded = (struct PlttData *)&gPlttBufferUnfaded[0];
- faded = (struct PlttData *)&gPlttBufferFaded[0];
- t = arr[0];
- }
+ gPlttBufferUnfaded[0] = gPlttBufferUnfaded[0x51] = gPlttBufferFaded[0] = gPlttBufferFaded[0x51] = 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;
+ gPlttBufferUnfaded[0] = gPlttBufferUnfaded[0x51] = gPlttBufferFaded[0] = gPlttBufferFaded[0x51] = arr[1];
sub_8124918((&eRoulette->varB8));
for (i = 0; i < 0xD; i++)
sub_812492C((&eRoulette->varB8), i, (struct UnkStruct1 *)&gUnknown_083F8E34[i * 8]);
@@ -397,183 +393,26 @@ void sub_8115238(void)
{
switch (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2))
{
- case SPECIES_TAILLOW:
- eRoulette->var02 |= 0x2;
- break;
case SPECIES_SHROOMISH:
- eRoulette->var02 |= 0x1;
- break;
+ eRoulette->var02 |= 0x1;
+ break;
+ case SPECIES_TAILLOW:
+ eRoulette->var02 |= 0x2;
+ 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;
+
+#if DEBUG
+ gUnknown_Debug_03005FB8 = eRoulette;
+#endif
+
switch (gMain.state)
{
case 0x0:
@@ -657,6 +496,7 @@ void sub_8115634(u8 unused)
s16 sin;
s16 cos;
s32 cos32;
+
if (eRoulette->var21++ == eRoulette->var23)
{
eRoulette->var21 = 0x0;
@@ -671,6 +511,15 @@ void sub_8115634(u8 unused)
eRoulette->var2C.a = cos32;
eRoulette->var2C.b = sin;
eRoulette->var2C.c = -sin;
+#if DEBUG
+ if (unk_203955C[0] != 0 && (gMain.newKeys & 8))
+ {
+ gTasks[eRoulette->varA4].func = sub_81157AC;
+ m4aMPlayStop(&gMPlay_SE1);
+ m4aMPlayStop(&gMPlay_SE2);
+ m4aMPlayStop(&gMPlay_SE3);
+ }
+#endif
}
void sub_81156BC(u8 taskid)
@@ -738,6 +587,7 @@ void sub_81157D0(u8 r0)
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);
+ break;
}
}
@@ -762,7 +612,8 @@ void sub_811597C(u8 taskid)
void sub_81159BC(u8 taskid)
{
s16 i;
- if(eRoulette->var08 & 0x20)
+
+ if (eRoulette->var08 & 0x20)
{
for (i = 0xB; (i < 0xE); i++)
if ((eRoulette->var08 & gUnknown_083F8C00[i].var08) == 0)
@@ -790,6 +641,7 @@ u8 sub_8115A94(s16 *r0, u8 r1)
s8 arr[0x4];
s8 t;
memcpy(&arr, gUnknown_083F8ECA, 0x4);
+ // char arr[] = {-5, 5, -1, 1};
t = (u8)*r0;
switch (r1)
{
@@ -834,9 +686,9 @@ void sub_8115B58(u8 r0)
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;
+ 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++)
{
@@ -1032,24 +884,23 @@ u8 sub_8115F58(u16 r0, u16 r1)
}
}
-#ifdef NONMATCHING
void sub_8116100(u8 taskid)
{
u8 randf;
s8 randfinal;
s8 r5;
- u16 g;
+ u16 g = 0;
u16 rand;
u16 randmod;
u16 angles[0x4]; // angles in 90 degree steps
- u8 zero = 0x0;
memcpy(angles, &gUnknown_083F8ECE, 0x8);
+ // u16 angles[] = {0, 180, 90, 270};
rand = Random();
randmod = rand % 0x64;
eRoulette->var7C = gTasks[taskid].data[0x6];
- eRoulette->var7F = zero;
- eRoulette->var7E = zero;
- eRoulette->var7D = zero;
+ eRoulette->var7F = g;
+ eRoulette->var7E = g;
+ eRoulette->var7D = g;
randf = sub_8115F58(gTasks[taskid].data[0x8], rand);
randfinal = (rand % randf) - (randf / 2);
if (gLocalTime.hours < 0xD)
@@ -1060,263 +911,22 @@ void sub_8116100(u8 taskid)
r5 *= 2;
else
r5 = (1 - r5) * 2;
- g = (&gUnknown_083F8DF4[eRoulette->var04_0])->var1A;
- eRoulette->var80 = (g + randfinal);
+ eRoulette->var80 = g = gUnknown_083F8DF4[eRoulette->var04_0].var1A + randfinal;
//
- g = ((float)(u16)(g + randfinal)) / 5.0f;
+ g = S16TOPOSFLOAT(g) / 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->var88 = S16TOPOSFLOAT(angles[(rand & 0x1) + r5]);
+ eRoulette->var8C = S16TOPOSFLOAT(gUnknown_083F8DF4[eRoulette->var04_0].var18);
+ eRoulette->var90 = ((eRoulette->var8C * 0.5f) - eRoulette->var8C) / S16TOPOSFLOAT(g * 3);
eRoulette->var94 = 68.0f;
eRoulette->var9C = 0.0f;
- eRoulette->var98 = -(8.0f / (float)(u16)(g * 3));
+ eRoulette->var98 = -(8.0f / S16TOPOSFLOAT(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");
+ gTasks[taskid].func = sub_8116308;
}
-#endif
void sub_8116308(u8 taskid)
{
@@ -1324,7 +934,7 @@ void sub_8116308(u8 taskid)
eRoulette->var03_7 = 1;
index = eRoulette->var3C[eRoulette->var7C];
eRoulette->var38 = &gSprites[index];
- (&gSprites[index])->callback = &sub_81191F4;
+ eRoulette->var38->callback = sub_81191F4;
gTasks[taskid].data[0x6]++;
gTasks[taskid].data[0x8]++;
sub_81182F8(0x6 - gTasks[taskid].data[0x6]);
@@ -1375,9 +985,9 @@ void sub_8116474(u8 taskid)
{
if (gTasks[taskid].data[0x1]-- > 0x0)
{
- if(gTasks[taskid].data[0x1] > 0x2)
+ if (gTasks[taskid].data[0x1] > 0x2)
gSpriteCoordOffsetX -= 0x2;
- if((eRoulette->var26 -= 0x4) == 0x68)
+ if ((eRoulette->var26 -= 0x4) == 0x68)
gSprites[eRoulette->var3C[0x19]].callback = &sub_81184CC;
}
else
@@ -1395,7 +1005,7 @@ void sub_8116514(u8 taskid)
{
if (gTasks[taskid].data[0x1]-- > 0x1)
{
- switch(gTasks[taskid].data[0x1] % 0x10)
+ switch (gTasks[taskid].data[0x1] % 0x10)
{
case 0x8:
sub_8117AA8(0x0, 0xFF);
@@ -1415,14 +1025,14 @@ void sub_8116514(u8 taskid)
void sub_811659C(u8 taskid)
{
- switch(gTasks[taskid].data[0x5])
+ 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])
+ if (wins < ++gTasks[taskid].data[0xB])
SetGameStat(GAME_STAT_CONSECUTIVE_ROULETTE_WINS, gTasks[taskid].data[0xB]);
sub_8116C34(taskid, &sub_811677C, 0xFFFF, 0x3);
}
@@ -1439,7 +1049,7 @@ void sub_811659C(u8 taskid)
void sub_8116638(u8 taskid)
{
- switch(gTasks[taskid].data[0x5])
+ switch (gTasks[taskid].data[0x5])
{
case 0x1:
case 0x2:
@@ -1469,7 +1079,7 @@ void sub_8116638(u8 taskid)
void sub_81166E8(u8 taskid)
{
s32 r0 = gTasks[taskid].data[0x7];
- switch(r0)
+ switch (r0)
{
case 0x0:
gTasks[taskid].data[0xD]++;
@@ -1510,9 +1120,9 @@ void sub_811677C(u8 taskid)
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;
+ 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;
}
@@ -1593,11 +1203,11 @@ void sub_8116AB0(u8 taskid)
gTasks[taskid].func = &sub_8116B40;
}
-void sub_8116B40(u8 taskid) // end oulette ?
+void sub_8116B40(u8 taskId) // end roulette ?
{
if (UpdatePaletteFade() == 0)
{
- SetVBlankCallback(0x0);
+ SetVBlankCallback(NULL);
memset(eRoulette, 0x0, 0x17C);
gSpriteCoordOffsetX = gSpriteCoordOffsetY = 0x0;
sub_80F9368();
@@ -1610,13 +1220,16 @@ void sub_8116B40(u8 taskid) // end oulette ?
REG_BLDY = 0x0;
gFieldCallback = &sub_8080990;
SetMainCallback2(&c2_exit_to_overworld_2_switch);
- DestroyTask(taskid);
+ DestroyTask(taskId);
+#if DEBUG
+ unk_203955C[0] = 0;
+#endif
}
}
void sub_8116BC0(u8 taskid)
{
- if(eRoulette->varA8 == 0 || gMain.newKeys & eRoulette->varAA)
+ if (eRoulette->varA8 == 0 || gMain.newKeys & eRoulette->varAA)
{
gTasks[taskid].func = eRoulette->varAC;
if (eRoulette->varAA > 0)
@@ -1632,7 +1245,7 @@ void sub_8116BC0(u8 taskid)
void sub_8116C34(u8 taskid, TaskFunc r1, u16 r2, u16 r3)
{
eRoulette->varB4 = gTasks[taskid].func;
- if(r1 == NULL)
+ if (r1 == NULL)
r1 = eRoulette->varB4;
eRoulette->varAC = r1;
eRoulette->varA8 = r2;
@@ -1676,6 +1289,8 @@ u8 sub_8116D54(u8 taskid, u8 r1)
u32 t1[0x3];
memcpy(t0, gUnknown_083F8ED8, 0x10);
memcpy(t1, gUnknown_083F8EE8, 0xC);
+ // u32 t0[] = {67650, 135300, 270600, 541200};
+ // u32 t1[] = {0x3e0, 0x7c00, 0xf8000};
if (r1 > 0xB)
{
return 0x0;
@@ -1710,7 +1325,7 @@ u8 sub_8116E5C(u8 r0, u8 r1)
u8 t = r0;
if (--r0 < 0x13)
{
- switch(r1)
+ switch (r1)
{
case 0x0:
return 0x3;
@@ -1733,17 +1348,14 @@ u8 sub_8116E5C(u8 r0, u8 r1)
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 var0 = 0x0;
+ u8 var2;
u16 var3;
- u32 var4;
u8 i;
- switch(r0)
+ switch (r0)
{
case 0x5:
case 0xA:
@@ -1751,387 +1363,78 @@ void sub_8116EF8(u8 r0)
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);
+ sub_8124CE8(&eRoulette->varB8, var0 &= 0xDFFF);
break;
default:
- memcpy(var1, gUnknown_083F8E9C, 0x18);
- if ((u8)(r0 - 0x1) < 0x4)
- var2 = 0x3;
+ {
+ struct UnkStruct1 var1[0x3];
+ memcpy(var1, gUnknown_083F8E9C, sizeof var1);
+ if (r0 > 0 && r0 < 5)
+ var2 = 3;
else
- var2 = 0x1;
- var3 = ((r0 / 0x5) - 0x1);
- switch((u8)r0 % 0x5)
+ var2 = 1;
+ var3 = r0 / 5 - 1;
+ switch (r0 % 5)
{
- 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;
+ case 0x1:
+ var3 = gSprites[eRoulette->var3C[7 + 0]].oam.paletteNum * 0x10;
+ break;
+ case 0x2:
+ var3 = gSprites[eRoulette->var3C[7 + 1]].oam.paletteNum * 0x10;
+ break;
+ case 0x3:
+ var3 = gSprites[eRoulette->var3C[7 + 2]].oam.paletteNum * 0x10;
+ break;
+ case 0x4:
+ var3 = gSprites[eRoulette->var3C[7 + 3]].oam.paletteNum * 0x10;
+ break;
}
- if (var2 == 0x1)
+ if (var2 == 1)
{
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);
+ var1[r0 / 5 - 1].var02 += var3;
+ sub_812492C(&eRoulette->varB8, 13, &var1[r0 / 5 - 1]);
}
+ else
+ return;
}
else
{
- for (i = 0; i < 0x3; i++)
+ for (i = 0; i < 3; i++)
{
- u8 var4 = i * 0x5 + r0 + 0x5;
+ u8 var4 = i * 5 + r0 + 5;
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)
+ var1[var4 / 5 - 1].var02 += var3;
+ sub_812492C(&eRoulette->varB8, i + 13, &var1[var4 / 5 - 1]);
+ if (var2 == 3)
var0 = gUnknown_083F8C00[var4].var10;
var2--;
}
}
- if (var2 != 0x2)
- var0 = 0x0;
- sub_8124CE8(&eRoulette->varB8, var0 |= gUnknown_083F8C00[r0].var10);
+ if (var2 != 2)
+ var0 = 0;
}
+ sub_8124CE8(&eRoulette->varB8, var0 |= gUnknown_083F8C00[r0].var10);
+ break;
+ }
}
}
-#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;
+ vu8 i;
+ vu8 z;
+ vu16 var1;
+ vu16 var2;
+ vu8 var0;
u8 v[0x5];
- u8 z;
- u8 var0;
- u8 var1;
- u16 var2;
+ u8 l;
eRoulette->var2A = 0x1;
sub_8117AA8(0x0, 0x0);
- sub_8124E2C(&gBGTilemapBuffers[2][0], ewram18800, 0xE, 0x7, 0x10, 0xD);
- switch(r0)
+ sub_8124E2C(gBGTilemapBuffers[1], (u16 *)ewram18800, 0xE, 0x7, 0x10, 0xD);
+ switch (r0)
{
case 0x0:
return;
@@ -2153,421 +1456,44 @@ void sub_8117158(u8 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];
+ gBGTilemapBuffers[1][var1 + var2 + 0x0] = ewram189a0[(var0 + z) * 0x3 + 0x0];
+ gBGTilemapBuffers[1][var1 + var2 + 0x1] = ewram189a0[(var0 + z) * 0x3 + 0x1];
+ gBGTilemapBuffers[1][var1 + var2 + 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;
+ u8 var0[5];
+ memcpy(var0, gUnknown_083F8EF4, 5);
+ // u8 var0[] = {0, 3, 4, 6, 12};
+ if (r0 > 19)
+ r0 = 0;
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)
+ case 3:
+ r0 = r0 / 5 - 1;
+ if (eRoulette->var16[r0] > 3)
return 0x0;
- return var0[eRoulette->var12[t] + 0x2];
- case 0xC:
+ return var0[eRoulette->var16[r0] + 1];
+ case 4:
+ r0--;
+ if (eRoulette->var12[r0] > 2)
+ return 0;
+ return var0[eRoulette->var12[r0] + 2];
+ case 12:
if (eRoulette->var08 & gUnknown_083F8C00[r0].var08)
- return 0x0;
- return var0[0x4];
- default:
+ return 0;
+ return var0[4];
}
- return 0x0;
+ return 0;
}
-#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)
{
@@ -2629,6 +1555,9 @@ void sub_811755C(u8 taskid)
void sub_81175C0(u8 taskid)
{
+#if DEBUG
+ unk_203955C[0] = 0;
+#endif
Menu_EraseScreen();
ScriptContext2_Disable();
DestroyTask(taskid);
@@ -2691,11 +1620,98 @@ void Task_Roulette_0(u8 taskid)
}
}
+#if DEBUG
+
+void debug_sub_812CDE4(u8 taskId)
+{
+ if (gMain.newKeys & A_BUTTON)
+ {
+ gTasks[taskId].data[13]++;
+ if (gTasks[taskId].data[13] == 10000)
+ gTasks[taskId].data[13] = 0;
+ ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4);
+ StringExpandPlaceholders(gStringVar4, gOtherText_Coins);
+ MenuPrint_RightAligned(gStringVar4, 9, 1);
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ gTasks[taskId].data[13]--;
+ if (gTasks[taskId].data[13] == -1)
+ gTasks[taskId].data[13] = 9999;
+ ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4);
+ StringExpandPlaceholders(gStringVar4, gOtherText_Coins);
+ MenuPrint_RightAligned(gStringVar4, 9, 1);
+ }
+ else if (gMain.newKeys & 0x100)
+ {
+ gTasks[taskId].data[13] += 10;
+ if (gTasks[taskId].data[13] > 9999)
+ gTasks[taskId].data[13] -= 9999;
+ ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4);
+ StringExpandPlaceholders(gStringVar4, gOtherText_Coins);
+ MenuPrint_RightAligned(gStringVar4, 9, 1);
+ }
+ else if (gMain.newKeys & 0x200)
+ {
+ gTasks[taskId].data[13] -= 10;
+ if (gTasks[taskId].data[13] < 0)
+ gTasks[taskId].data[13] += 9999;
+ ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4);
+ StringExpandPlaceholders(gStringVar4, gOtherText_Coins);
+ MenuPrint_RightAligned(gStringVar4, 9, 1);
+ }
+ else if (gMain.newKeys & 8)
+ {
+ gSaveBlock1.coins = gTasks[taskId].data[13];
+ gTasks[taskId].func = Task_Roulette_0;
+ ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4);
+ StringExpandPlaceholders(gStringVar4, gOtherText_Coins);
+ MenuPrint_RightAligned(gStringVar4, 9, 1);
+ unk_2039560 = 0;
+ }
+ else if (gMain.newKeys & 4)
+ {
+ gSaveBlock1.coins = gTasks[taskId].data[13];
+ gTasks[taskId].func = Task_Roulette_0;
+ ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4);
+ StringExpandPlaceholders(gStringVar4, gOtherText_Coins);
+ MenuPrint_RightAligned(gStringVar4, 9, 1);
+ unk_2039560 = 1;
+ }
+}
+
+extern const u8 gUnknown_Debug_0842510D[];
+
+void debug_sub_812CFE8(u8 taskId)
+{
+ gTasks[taskId].data[13] = gSaveBlock1.coins;
+ if (Random() & 1)
+ gSpecialVar_0x8004 |= 0x80;
+ ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4);
+ StringExpandPlaceholders(gStringVar4, gOtherText_Coins);
+ Menu_DrawStdWindowFrame(0, 0, 9, 3);
+ MenuPrint_RightAligned(gStringVar4, 9, 1);
+ Menu_DrawStdWindowFrame(0, 14, 29, 19);
+ Menu_PrintText(gUnknown_Debug_0842510D, 1, 15);
+ gTasks[taskId].func = debug_sub_812CDE4;
+}
+
+#endif
+
void PlayRoulette(void)
{
u8 taskid;
+
ScriptContext2_Enable();
- taskid = CreateTask(&Task_Roulette_0, 0x0);
+#if DEBUG
+ unk_2039560 = 0;
+ if (unk_203955C[0] != 0)
+ {
+ CreateTask(debug_sub_812CFE8, 0);
+ return;
+ }
+#endif
+ taskid = CreateTask(Task_Roulette_0, 0);
gTasks[taskid].data[0xD] = gSaveBlock1.coins;
}
@@ -2783,7 +1799,7 @@ void unref_sub_8117A74(void) //destroy all sprites at 0x1D
void sub_8117AA8(u8 r0, u8 r1)
{
u8 i;
- switch(r0)
+ switch (r0)
{
case 0x1:
for (i = 0x0; i < 0x13; i++)
@@ -2799,7 +1815,7 @@ void sub_8117AA8(u8 r0, u8 r1)
else
gSprites[eRoulette->var3C[0x1D + i]].invisible = FALSE;
}
- for ( ; i < 0x13; i++)
+ for (; i < 0x13; i++)
gSprites[eRoulette->var3C[0x1D + i]].invisible = FALSE;
break;
}
@@ -2812,7 +1828,7 @@ void sub_8117BBC(void)
{
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]].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);
@@ -2883,111 +1899,25 @@ void sub_8117DF4(void)
}
}
-#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;
+ s16 cos;
+ s16 sin;
+ u32 matrixNum;
+ s16 angle = eRoulette->var24 + sprite->data[0];
+ if (angle >= 360)
+ angle -= 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");
+ sprite->pos2.x = sin * sprite->data[1] >> 0xC;
+ sprite->pos2.y = -cos * sprite->data[1] >> 0xC;
+ matrixNum = sprite->oam.matrixNum;
+ sin /= 16;
+ gOamMatrices[matrixNum].d = cos /= 16;
+ gOamMatrices[matrixNum].a = cos;
+ gOamMatrices[matrixNum].b = sin;
+ gOamMatrices[matrixNum].c = -sin;
}
-#endif
void sub_8117F2C(void)
{
@@ -3045,132 +1975,32 @@ void sub_81180F4(u16 r0)
}
}
-#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)
+ u8 t[5];
+ memcpy(t, gUnknown_083FA608, sizeof t);
+ // u8 t = {0, 1, 2, 3, 4};
+ if (r0 >= 20)
+ r0 = 0;
+ 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
+ r0 = r0 / 5 - 1;
+ if (eRoulette->var16[r0] < 4)
+ return t[((vu8 *)eRoulette->var16)[r0] + 1]; // couldn't recreate redundant loads
break;
case 0x4:
- r0 = r0 - 0x1;
- if (eRoulette->var12[r0] < 0x3)
- return t[0x2 + eRoulette->var12[r0]];
+ r0--;
+ if (eRoulette->var12[r0] < 3)
+ return t[((vu8 *)eRoulette->var12)[r0] + 2];
break;
case 0xC:
if (!(eRoulette->var08 & gUnknown_083F8C00[r0].var08))
- return t[0x4];
+ return t[4];
break;
}
- return 0x0;
+ return 0;
}
-#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)
{
@@ -3187,7 +2017,7 @@ void sub_81182F8(u8 r0)
u8 t = 0x0;
if (eRoulette->var19 == 0x1)
t = 0x2;
- switch(r0)
+ switch (r0)
{
case 0x6:
for (i = 0x0; i < 0x3; i++)
@@ -3427,7 +2257,7 @@ void sub_81189A8(struct Sprite *sprite)
float f0, f1, f2;
struct StructgUnknown_083F8DF4 *p;
sub_8118724(sprite);
- switch(sprite->data[0x3])
+ switch (sprite->data[0x3])
{
case 0:
if (sprite->data[0x0] != 0x1)
@@ -3493,7 +2323,7 @@ void sub_8118BD8(struct Sprite *sprite)
if (sprite->data[0x2]++ < 45)
{
sprite->pos2.y--;
- if(sprite->data[0x2] == 45)
+ if (sprite->data[0x2] == 45)
{
if (gSprites[eRoulette->var3C[0x37]].animCmdIndex == 0x1)
sprite->pos2.y++;
@@ -3527,7 +2357,7 @@ void sub_8118BD8(struct Sprite *sprite)
void sub_8118CAC(struct Sprite *sprite)
{
sub_8118724(sprite);
- switch(sprite->data[0x3])
+ switch (sprite->data[0x3])
{
case 90:
if (sprite->data[0x0] != 0x1)
@@ -3549,7 +2379,7 @@ void sub_8118CAC(struct Sprite *sprite)
void sub_8118CEC(struct Sprite *sprite)
{
sub_8118724(sprite);
- switch(eRoulette->var03_0)
+ switch (eRoulette->var03_0)
{
default:
case 0x0:
@@ -3591,7 +2421,33 @@ void sub_8118D2C(struct Sprite *sprite)
}
}
-#ifdef NONMATCHING
+#if DEBUG
+
+void debug_sub_812E698(struct Sprite *sprite)
+{
+ sub_8118724(sprite);
+ sprite->data[2] = 0;
+ sub_81186B8(sprite);
+ m4aSongNumStart(0x38);
+ if (Random() & 1)
+ {
+ eRoulette->var8C = 0;
+ eRoulette->var7F = (eRoulette->var7E + 1) % 12;
+ }
+ else
+ {
+ eRoulette->var8C = gUnknown_083F8DF4[eRoulette->var04_0].var1C * 2;
+ eRoulette->var7F = eRoulette->var7E;
+ }
+ sprite->data[0] = 1;
+ sprite->data[2] = gUnknown_083F8DF4[eRoulette->var04_0].var02;
+ eRoulette->var98 = 0.085;
+ sprite->callback = sub_8118D2C;
+ sprite->data[1] = 5;
+}
+
+#endif
+
void sub_8118DE4(struct Sprite *sprite)
{
sub_8118724(sprite);
@@ -3607,13 +2463,13 @@ void sub_8118DE4(struct Sprite *sprite)
sub_811866C(sprite);
sprite->data[0x6] = (sprite->data[0x6] / 30) * 30 + 15;
sprite->callback = &sub_8118834;
- m4aSongNumStartOrChange(0x47);
+ m4aSongNumStartOrChange(SE_HASHI);
}
else
{
u8 t;
u32 z;
- m4aSongNumStart(0x38);
+ m4aSongNumStart(SE_KON);
if ((z = (Random() & 0x1)))
{
u32 o;
@@ -3631,21 +2487,21 @@ void sub_8118DE4(struct Sprite *sprite)
if (gUnknown_083F8D90[t].var04 & eRoulette->var08)
{
sprite->data[0x0] = 0x1;
- sprite->data[0x2] = (&gUnknown_083F8DF4[eRoulette->var04_0])->var02;
+ 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;
+ sprite->data[0x2] = gUnknown_083F8DF4[eRoulette->var04_0].var01;
}
else
{
- sprite->data[0x2] = (&gUnknown_083F8DF4[eRoulette->var04_0])->var02;
+ sprite->data[0x2] = gUnknown_083F8DF4[eRoulette->var04_0].var02;
if (z)
{
- eRoulette->var8C = 1.5f;
+ eRoulette->var8C = 0.5f;
}
else
{
@@ -3654,217 +2510,10 @@ void sub_8118DE4(struct Sprite *sprite)
}
}
eRoulette->var98 = 0.085f;
- sprite->callback = &sub_8118D2C;
+ 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)
{
@@ -3872,15 +2521,20 @@ void sub_8118F8C(struct Sprite *sprite)
if (!(eRoulette->var8C > 0.5f))
{
sub_81186B8(sprite);
- if (sub_81186E8(sprite) == 0x0)
+ if (!sub_81186E8(sprite))
{
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));
+ / ((float)(s16)(p[eRoulette->var04_0].var04 + 0x1));
sprite->data[0x1] = 0x4;
- sprite->callback = &sub_8118DE4;
+#if DEBUG
+ if (unk_2039560 != 0)
+ sprite->callback = debug_sub_812E698;
+ else
+#endif
+ sprite->callback = sub_8118DE4;
}
else
{
@@ -3960,8 +2614,8 @@ void sub_8119224(struct Sprite *sprite)
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[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;
@@ -3995,57 +2649,58 @@ void sub_81193D4(struct Sprite *sprite)
#ifdef NONMATCHING
void sub_811952C(struct Sprite *sprite)
{
+ u8 i;
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;
+ u8 h = 0; // r10 (sp+0xc)
+ u8 j = 5; // r9 (r9)
+ u8 p = 0; // sp+0xc (sp+0x10)
+ u8 s[10] = {}; // sp+0 (sp+0)
+ u16 t = Random(); // sp+0x10 (r10)
+
+ eRoulette->var7D = 1;
eRoulette->var03_5 = TRUE;
eRoulette->var03_6 = FALSE;
eRoulette->var7E = 0xFF;
- eRoulette->var88 = sprite->data[0x3];
+ eRoulette->var88 = sprite->data[3];
eRoulette->var98 = 0.0f;
- eRoulette->var8C = (&gUnknown_083F8DF4[eRoulette->var04_0])->var1C; //couldn't replicate load, same as sub_8118DE4
+ eRoulette->var8C = gUnknown_083F8DF4[eRoulette->var04_0].var1C;
o = (eRoulette->var04_0 * 30 + 33) + (0x1 - eRoulette->var03_0) * 15;
- for (i = 0x0; i < 0x4; i++)
+ for (i = 0; i < 4; i++)
{
- if (o < sprite->data[0x3] && !(sprite->data[0x3] > o + 90))
+ if (o < sprite->data[3] && sprite->data[3] <= o + 90)
{
- sprite->data[0x0] = i * 0x2;
- eRoulette->var03_0 = 0x1 & i;
+ sprite->data[0] = i << 1;
+ eRoulette->var03_0 = i & 1;
break;
}
- if (i == 0x3)
+ if (i == 3)
{
- sprite->data[0x0] = 0x1;
- eRoulette->var03_0 = 0x1;
+ sprite->data[0] = 1;
+ eRoulette->var03_0 = 1;
break;
}
o += 90;
}
if (eRoulette->var03_0)
{
- if (sprite->data[0x0])
+ if (sprite->data[0])
{
- PlayCry1(0x130, -0x3F);
+ PlayCry1(SPECIES_TAILLOW, -0x3F);
}
else
{
- PlayCry1(0x130, 0x3F);
+ PlayCry1(SPECIES_TAILLOW, 0x3F);
}
}
else
{
- PlayCry1(0x132, -0x3F);
+ PlayCry1(SPECIES_SHROOMISH, -0x3F);
}
- i = 0x2;
- z = (eRoulette->var7F + 0x2) % 0xC;
- if (eRoulette->var03_0 == 0x1 && eRoulette->var04_0 == 0x1)
- j += 0x6;
+ i = 2;
+ z = (eRoulette->var7F + 2) % 12;
+ if (eRoulette->var03_0 == 1 && eRoulette->var04_0 == 1)
+ j += 6;
else
j += i;
for (; i < j; i++)
@@ -4058,343 +2713,340 @@ void sub_811952C(struct Sprite *sprite)
p = i;
}
}
- z = (z + 0x1) % 0xC;
+ z = (z + 1) % 0xC;
}
- if ((eRoulette->var03_0 + 0x1) & eRoulette->var02)
+ if ((eRoulette->var03_0 + 1) & eRoulette->var02)
{
- if (p && (t & 0xFF) <= 0xBF)
+ if (p && (t & 0xFF) < 0xc0)
{
- sprite->data[0x7] = p;
+ sprite->data[7] = p;
}
else
{
- sprite->data[0x7] = s[t % h];
+ sprite->data[7] = s[t % h];
}
}
else
{
- sprite->data[0x7] = s[t % h];
+ sprite->data[7] = s[t % h];
}
- sprite->callback = &sub_8118CEC;
+ 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");
+ asm_unified("push {r4-r7,lr}\n"
+ "\tmov r7, r10\n"
+ "\tmov r6, r9\n"
+ "\tmov r5, r8\n"
+ "\tpush {r5-r7}\n"
+ "\tsub sp, 0x14\n"
+ "\tmov r8, r0\n"
+ "\tmovs r0, 0\n"
+ "\tmov r10, r0\n"
+ "\tmovs r1, 0x5\n"
+ "\tmov r9, r1\n"
+ "\tmovs r2, 0\n"
+ "\tstr r2, [sp, 0xC]\n"
+ "\tmov r0, sp\n"
+ "\tmovs r1, 0\n"
+ "\tmovs r2, 0xA\n"
+ "\tbl memset\n"
+ "\tbl Random\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tstr r0, [sp, 0x10]\n"
+ "\tldr r7, _08119610 @ =gSharedMem + 0x19000\n"
+ "\tadds r0, r7, 0\n"
+ "\tadds r0, 0x7D\n"
+ "\tmovs r6, 0x1\n"
+ "\tstrb r6, [r0]\n"
+ "\tldrb r4, [r7, 0x3]\n"
+ "\tmovs r0, 0x20\n"
+ "\torrs r4, r0\n"
+ "\tmovs r0, 0x41\n"
+ "\tnegs r0, r0\n"
+ "\tands r4, r0\n"
+ "\tstrb r4, [r7, 0x3]\n"
+ "\tadds r1, r7, 0\n"
+ "\tadds r1, 0x7E\n"
+ "\tmovs r0, 0xFF\n"
+ "\tstrb r0, [r1]\n"
+ "\tadds r5, r7, 0\n"
+ "\tadds r5, 0x88\n"
+ "\tmov r3, r8\n"
+ "\tmovs r1, 0x34\n"
+ "\tldrsh r0, [r3, r1]\n"
+ "\tbl __floatsisf\n"
+ "\tstr r0, [r5]\n"
+ "\tadds r1, r7, 0\n"
+ "\tadds r1, 0x98\n"
+ "\tldr r0, _08119614 @ =0x00000000\n"
+ "\tstr r0, [r1]\n"
+ "\tadds r3, r7, 0\n"
+ "\tadds r3, 0x8C\n"
+ "\tldr r2, _08119618 @ =gUnknown_083F8DF4\n"
+ "\tldrb r0, [r7, 0x4]\n"
+ "\tlsls r0, 30\n"
+ "\tlsrs r1, r0, 25\n"
+ "\tadds r2, 0x1C\n"
+ "\tadds r1, r2\n"
+ "\tldr r1, [r1]\n"
+ "\tstr r1, [r3]\n"
+ "\tlsrs r0, 30\n"
+ "\tlsls r1, r0, 4\n"
+ "\tsubs r1, r0\n"
+ "\tlsls r1, 1\n"
+ "\tadds r1, 0x21\n"
+ "\tlsls r4, 27\n"
+ "\tlsrs r4, 27\n"
+ "\tsubs r6, r4\n"
+ "\tlsls r0, r6, 4\n"
+ "\tsubs r0, r6\n"
+ "\tadds r1, r0\n"
+ "\tlsls r1, 16\n"
+ "\tlsrs r1, 16\n"
+ "\tmov r5, r10\n"
+ "\tmov r3, r8\n"
+ "\tmovs r0, 0x34\n"
+ "\tldrsh r2, [r3, r0]\n"
+ "_081195C8:\n"
+ "\tcmp r1, r2\n"
+ "\tbge _081195D4\n"
+ "\tadds r0, r1, 0\n"
+ "\tadds r0, 0x5A\n"
+ "\tcmp r2, r0\n"
+ "\tble _08119638\n"
+ "_081195D4:\n"
+ "\tcmp r5, 0x3\n"
+ "\tbeq _0811961C\n"
+ "\tadds r0, r1, 0\n"
+ "\tadds r0, 0x5A\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r1, r0, 16\n"
+ "\tadds r0, r5, 0x1\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r5, r0, 24\n"
+ "\tcmp r5, 0x3\n"
+ "\tbls _081195C8\n"
+ "_081195EA:\n"
+ "\tldr r0, _08119610 @ =gSharedMem + 0x19000\n"
+ "\tldrb r1, [r0, 0x3]\n"
+ "\tmovs r0, 0x1F\n"
+ "\tands r0, r1\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _08119664\n"
+ "\tmov r1, r8\n"
+ "\tmovs r2, 0x2E\n"
+ "\tldrsh r0, [r1, r2]\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _08119658\n"
+ "\tmovs r0, 0x98\n"
+ "\tlsls r0, 1\n"
+ "\tmovs r1, 0x3F\n"
+ "\tnegs r1, r1\n"
+ "\tbl PlayCry1\n"
+ "\tb _08119670\n"
+ "\t.align 2, 0\n"
+ "_08119610: .4byte gSharedMem + 0x19000\n"
+ "_08119614: .4byte 0x00000000\n"
+ "_08119618: .4byte gUnknown_083F8DF4\n"
+ "_0811961C:\n"
+ "\tmovs r0, 0x1\n"
+ "\tmov r3, r8\n"
+ "\tstrh r0, [r3, 0x2E]\n"
+ "\tldr r2, _08119634 @ =gSharedMem + 0x19000\n"
+ "\tldrb r1, [r2, 0x3]\n"
+ "\tsubs r0, 0x21\n"
+ "\tands r0, r1\n"
+ "\tmovs r1, 0x1\n"
+ "\torrs r0, r1\n"
+ "\tstrb r0, [r2, 0x3]\n"
+ "\tb _081195EA\n"
+ "\t.align 2, 0\n"
+ "_08119634: .4byte gSharedMem + 0x19000\n"
+ "_08119638:\n"
+ "\tlsrs r0, r5, 1\n"
+ "\tmov r1, r8\n"
+ "\tstrh r0, [r1, 0x2E]\n"
+ "\tldr r3, _08119654 @ =gSharedMem + 0x19000\n"
+ "\tmovs r1, 0x1\n"
+ "\tands r1, r5\n"
+ "\tldrb r2, [r3, 0x3]\n"
+ "\tmovs r0, 0x20\n"
+ "\tnegs r0, r0\n"
+ "\tands r0, r2\n"
+ "\torrs r0, r1\n"
+ "\tstrb r0, [r3, 0x3]\n"
+ "\tb _081195EA\n"
+ "\t.align 2, 0\n"
+ "_08119654: .4byte gSharedMem + 0x19000\n"
+ "_08119658:\n"
+ "\tmovs r0, 0x98\n"
+ "\tlsls r0, 1\n"
+ "\tmovs r1, 0x3F\n"
+ "\tbl PlayCry1\n"
+ "\tb _08119670\n"
+ "_08119664:\n"
+ "\tmovs r0, 0x99\n"
+ "\tlsls r0, 1\n"
+ "\tmovs r1, 0x3F\n"
+ "\tnegs r1, r1\n"
+ "\tbl PlayCry1\n"
+ "_08119670:\n"
+ "\tmovs r5, 0x2\n"
+ "\tldr r4, _081196A0 @ =gSharedMem + 0x19000\n"
+ "\tadds r0, r4, 0\n"
+ "\tadds r0, 0x7F\n"
+ "\tldrb r0, [r0]\n"
+ "\tadds r0, 0x2\n"
+ "\tmovs r1, 0xC\n"
+ "\tbl __modsi3\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r3, r0, 24\n"
+ "\tldrb r1, [r4, 0x3]\n"
+ "\tmovs r0, 0x1F\n"
+ "\tands r0, r1\n"
+ "\tcmp r0, 0x1\n"
+ "\tbne _081196A4\n"
+ "\tldrb r1, [r4, 0x4]\n"
+ "\tmovs r0, 0x3\n"
+ "\tands r0, r1\n"
+ "\tcmp r0, 0x1\n"
+ "\tbne _081196A4\n"
+ "\tmov r0, r9\n"
+ "\tadds r0, 0x6\n"
+ "\tb _081196A8\n"
+ "\t.align 2, 0\n"
+ "_081196A0: .4byte gSharedMem + 0x19000\n"
+ "_081196A4:\n"
+ "\tmov r2, r9\n"
+ "\tadds r0, r2, r5\n"
+ "_081196A8:\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tmov r9, r0\n"
+ "\tcmp r5, r9\n"
+ "\tbcs _0811970E\n"
+ "\tldr r6, _08119734 @ =gSharedMem + 0x19000\n"
+ "\tldr r7, _08119738 @ =gUnknown_083F8C00 + 0xC\n"
+ "_081196B6:\n"
+ "\tlsls r0, r3, 3\n"
+ "\tldr r1, _0811973C @ =gUnknown_083F8D90 + 0x4\n"
+ "\tadds r0, r1\n"
+ "\tldr r1, [r6, 0x8]\n"
+ "\tldr r2, [r0]\n"
+ "\tands r1, r2\n"
+ "\tcmp r1, 0\n"
+ "\tbne _081196F8\n"
+ "\tmov r0, r10\n"
+ "\tadds r1, r0, 0x1\n"
+ "\tlsls r1, 24\n"
+ "\tlsrs r1, 24\n"
+ "\tmov r10, r1\n"
+ "\tadd r0, sp\n"
+ "\tstrb r5, [r0]\n"
+ "\tldr r0, [sp, 0xC]\n"
+ "\tcmp r0, 0\n"
+ "\tbne _081196F8\n"
+ "\tldrb r0, [r6, 0x1A]\n"
+ "\tlsls r0, 28\n"
+ "\tlsrs r0, 28\n"
+ "\tldr r1, _08119740 @ =gSharedMem + 0x1901B\n"
+ "\tadds r0, r1\n"
+ "\tldrb r1, [r0]\n"
+ "\tlsls r0, r1, 2\n"
+ "\tadds r0, r1\n"
+ "\tlsls r0, 2\n"
+ "\tadds r0, r7\n"
+ "\tldr r0, [r0]\n"
+ "\tands r2, r0\n"
+ "\tcmp r2, 0\n"
+ "\tbeq _081196F8\n"
+ "\tstr r5, [sp, 0xC]\n"
+ "_081196F8:\n"
+ "\tadds r0, r3, 0x1\n"
+ "\tmovs r1, 0xC\n"
+ "\tbl __modsi3\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r3, r0, 24\n"
+ "\tadds r0, r5, 0x1\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r5, r0, 24\n"
+ "\tcmp r5, r9\n"
+ "\tbcc _081196B6\n"
+ "_0811970E:\n"
+ "\tldrb r0, [r4, 0x3]\n"
+ "\tlsls r0, 27\n"
+ "\tlsrs r0, 27\n"
+ "\tadds r0, 0x1\n"
+ "\tldrb r1, [r4, 0x2]\n"
+ "\tands r0, r1\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _08119756\n"
+ "\tldr r2, [sp, 0xC]\n"
+ "\tcmp r2, 0\n"
+ "\tbeq _08119744\n"
+ "\tmovs r0, 0xFF\n"
+ "\tldr r3, [sp, 0x10]\n"
+ "\tands r0, r3\n"
+ "\tcmp r0, 0xBF\n"
+ "\tbhi _08119744\n"
+ "\tmov r0, r8\n"
+ "\tstrh r2, [r0, 0x3C]\n"
+ "\tb _08119766\n"
+ "\t.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"
+ "\tldr r0, [sp, 0x10]\n"
+ "\tmov r1, r10\n"
+ "\tbl __modsi3\n"
+ "\tadd r0, sp\n"
+ "\tldrb r0, [r0]\n"
+ "\tmov r1, r8\n"
+ "\tstrh r0, [r1, 0x3C]\n"
+ "\tb _08119766\n"
+ "_08119756:\n"
+ "\tldr r0, [sp, 0x10]\n"
+ "\tmov r1, r10\n"
+ "\tbl __modsi3\n"
+ "\tadd r0, sp\n"
+ "\tldrb r0, [r0]\n"
+ "\tmov r2, r8\n"
+ "\tstrh r0, [r2, 0x3C]\n"
+ "_08119766:\n"
+ "\tldr r3, _0811977C @ =sub_8118CEC\n"
+ "\tmov r0, r8\n"
+ "\tstr r3, [r0, 0x1C]\n"
+ "\tadd sp, 0x14\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"
+ "_0811977C: .4byte sub_8118CEC");
}
#endif
void sub_8119780(struct Sprite *sprite)
{
- if (!(sprite->data[0x1]++ < sprite->data[0x3]))
+ if (sprite->data[1]++ >= sprite->data[3])
{
- if ((sprite->pos1.x -= 0x2) < -0x10)
+ sprite->pos1.x -= 2;
+ if (sprite->pos1.x < -16)
{
if (!eRoulette->var03_6)
- {
eRoulette->var03_6 = TRUE;
- }
DestroySprite(sprite);
- eRoulette->var01 = 0x0;
- eRoulette->var34 = gUnknown_083FA61E[0x0];
+ eRoulette->var01 = 0;
+ eRoulette->var34 = gUnknown_083FA61E[0];
}
}
}
@@ -4403,18 +3055,19 @@ 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])
+
+ memcpy(t, &gUnknown_083FA632, 24);
+ if (sprite->data[1]++ < sprite->data[3])
{
- if(sprite->data[0x1] & 0x1)
+ if (sprite->data[1] & 1)
{
- gSpriteCoordOffsetY = t[sprite->data[0x2] / 0x2][sprite->data[0x7]];
- p = z = sprite->data[0x7] + 0x1;
+ gSpriteCoordOffsetY = t[sprite->data[2] / 2][sprite->data[7]];
+ p = z = sprite->data[7] + 1;
if (z < 0)
- p += 0x3;
- sprite->data[0x7] = z - ((p >> 2) * 4);
+ p += 3;
+ sprite->data[7] = z - ((p >> 2) * 4);
}
- sprite->invisible ^= 0x1;
+ sprite->invisible ^= 1;
}
else
{
@@ -4447,7 +3100,7 @@ void sub_8119898(struct Sprite *sprite)
void sub_8119964(struct Sprite *sprite)
{
- if(sprite->data[0x7] == 0x0)
+ if (sprite->data[0x7] == 0x0)
{
register u32 t asm("r2");
u32 z ;
@@ -4523,7 +3176,7 @@ void sub_8119AAC(struct Sprite *sprite)
void sub_8119B24(struct Sprite *sprite)
{
- if (!(sprite->data[0x1] < 0x0))
+ if (sprite->data[0x1] >= 0x0)
{
sprite->data[0x1]--;
sprite->pos1.y--;
@@ -4532,7 +3185,7 @@ void sub_8119B24(struct Sprite *sprite)
}
else
{
- if (!(sprite->data[0x3] < 0x0))
+ if (sprite->data[0x3] >= 0x0)
{
sprite->data[0x3]--;
if (sprite->animDelayCounter == 0x0)
@@ -4571,7 +3224,7 @@ void sub_8119BCC(struct Sprite *sprite)
}
else
{
- if (!(sprite->data[0x1] < 0x0))
+ 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];
@@ -4579,10 +3232,10 @@ void sub_8119BCC(struct Sprite *sprite)
else
{
m4aSongNumStartOrChange(0x5E);
- if(eRoulette->var38->data[0x0] == 0x0)
- PlayCry1(0x130, 0x3F);
+ if (eRoulette->var38->data[0x0] == 0x0)
+ PlayCry1(SPECIES_TAILLOW, 0x3F);
else
- PlayCry1(0x130, -0x3F);
+ PlayCry1(SPECIES_TAILLOW, -0x3F);
StartSpriteAnim(sprite, eRoulette->var38->data[0x0] + 0x2);
sprite->data[0x1] = 45;
sprite->callback = &sub_8119B24;
@@ -4594,7 +3247,7 @@ void sub_8119D08(struct Sprite *sprite)
{
s8 t[0x2]; //sign
memcpy(t, &gUnknown_083FA64A, 0x2);
- if (!(sprite->data[0x1]-- < 0x0))
+ if (sprite->data[0x1]-- >= 0x0)
{
sprite->pos1.x += t[eRoulette->var38->data[0x0]] * 0x2;
gSprites[sprite->data[0x6]].invisible ^= 0x1;
diff --git a/src/roulette_util.c b/src/roulette_util.c
index 3d5b03a5c..f3eae5518 100644
--- a/src/roulette_util.c
+++ b/src/roulette_util.c
@@ -13,12 +13,12 @@ void sub_8124918(struct UnkStruct0 *r0)
{
r0->var00 = 0;
r0->var02 = 0;
- memset((&r0->var04), 0, 0xC0);
+ memset(&r0->var04, 0, sizeof(r0->var04));
}
u8 sub_812492C(struct UnkStruct0 *r0, u8 r1, struct UnkStruct1 *r2)
{
- if (!(r1 < 0x10) || (r0->var04[r1].var00_7))
+ if (!(r1 < 16) || (r0->var04[r1].var00_7))
return 0xFF;
r0->var04[r1].var04.var00 = r2->var00;
@@ -29,123 +29,82 @@ u8 sub_812492C(struct UnkStruct0 *r0, u8 r1, struct UnkStruct1 *r2)
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;
+ r0->var04[r1].var00_0 = 0;
+ r0->var04[r1].var00_7 = 1;
+ r0->var04[r1].var02 = 0;
+ r0->var04[r1].var01 = 0;
if (r0->var04[r1].var04.var07_7 < 0)
r0->var04[r1].var03 = 0xFF;
else
- r0->var04[r1].var03 = 0x1;
+ r0->var04[r1].var03 = 1;
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");
+ if (r1 >= 16)
+ return 0xFF;
+ if (!r0->var04[r1].var00_7)
+ return 0xFF;
+ memset(&r0->var04[r1], 0, sizeof(r0->var04[r1]));
+ return r1;
}
-#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)
+ struct PlttData *faded = (struct PlttData *)&gPlttBufferFaded[r0->var04.var02 + i];
+ struct PlttData *unfaded = (struct PlttData *)&gPlttBufferUnfaded[r0->var04.var02 + i];
+
+ switch (r0->var00_0)
{
- case 0x1:
- if ((u32)(faded->r + r0->var03) < 0x20)
+ case 1:
+ if (faded->r + r0->var03 >= 0 && faded->r + r0->var03 < 32)
faded->r += r0->var03;
- if ((u32)(faded->g + r0->var03) < 0x20)
+ if (faded->g + r0->var03 >= 0 && faded->g + r0->var03 < 32)
faded->g += r0->var03;
- if ((u32)(faded->b + r0->var03) < 0x20)
+ if (faded->b + r0->var03 >= 0 && faded->b + r0->var03 < 32)
faded->b += r0->var03;
- break;
- case 0x2:
+ break;
+ case 2:
if (r0->var03 < 0)
{
- if (!(faded->r + r0->var03 < unfaded->r))
+ if (faded->r + r0->var03 >= unfaded->r)
faded->r += r0->var03;
- if (!(faded->g + r0->var03 < unfaded->g))
+ if (faded->g + r0->var03 >= unfaded->g)
faded->g += r0->var03;
- if (!(faded->b + r0->var03 < unfaded->b))
+ if (faded->b + r0->var03 >= unfaded->b)
faded->b += r0->var03;
}
else
{
- if (!(faded->r + r0->var03 > unfaded->r))
+ if (faded->r + r0->var03 <= unfaded->r)
faded->r += r0->var03;
- if (!(faded->g + r0->var03 > unfaded->g))
+ if (faded->g + r0->var03 <= unfaded->g)
faded->g += r0->var03;
- if (!(faded->b + r0->var03 > unfaded->b))
+ if (faded->b + r0->var03 <= unfaded->b)
faded->b += r0->var03;
}
- break;
+ break;
}
}
- if (((u32)r0->var02++) != r0->var04.var07_0)
+ if ((u32)r0->var02++ != r0->var04.var07_0)
{
- returnval = 0x0;
+ returnval = 0;
}
else
{
- r0->var02 = 0x0;
- r0->var03 = r0->var03 * -1;
- if (r0->var00_0 == 0x1)
+ r0->var02 = 0;
+ r0->var03 *= -1;
+ if (r0->var00_0 == 1)
r0->var00_0++;
else
r0->var00_0--;
- returnval = 0x1;
+ returnval = 1;
}
return returnval;
}
@@ -153,34 +112,36 @@ u8 sub_81249E4(struct UnkStruct3 *r0)
u8 sub_8124BEC(struct UnkStruct3 *r0)
{
u8 rg2 = 0;
+
switch (r0->var00_0)
{
- case 0x1:
+ case 1:
for (rg2 = 0; rg2 < r0->var04.var04; rg2++)
gPlttBufferFaded[r0->var04.var02 + rg2] = r0->var04.var00;
r0->var00_0++;
break;
- case 0x2:
+ case 2:
for (rg2 = 0; rg2 < r0->var04.var04; rg2++)
gPlttBufferFaded[r0->var04.var02 + rg2] = gPlttBufferUnfaded[r0->var04.var02 + rg2];
r0->var00_0--;
break;
}
- return 0x1;
+ return 1;
}
void task_tutorial_controls_fadein(struct UnkStruct0 *r0)
{
u8 i = 0;
+
if (r0->var00)
{
- for (i = 0; i < 0x10; i++)
+ for (i = 0; i < 16; i++)
{
- if ((r0->var02 >> i) & 0x1)
+ if ((r0->var02 >> i) & 1)
{
- if (((u8)--r0->var04[i].var01) == 0xFF) // if underflow ?
+ if (--r0->var04[i].var01 == 0xFF) // if underflow ?
{
- if (r0->var04[i].var04.var00 & (0x80 << 8)) // PlttData->unused_15 ?
+ if (r0->var04[i].var04.var00 & 0x8000) // PlttData->unused_15 ?
sub_81249E4(&r0->var04[i]);
else
sub_8124BEC(&r0->var04[i]);
@@ -194,15 +155,16 @@ void task_tutorial_controls_fadein(struct UnkStruct0 *r0)
void sub_8124CE8(struct UnkStruct0 *r0, u16 r1)
{
u8 i = 0;
+
r0->var00++;
- for (i = 0; i < 0x10; i++)
+ for (i = 0; i < 16; i++)
{
- if ((r1 >> i) & 0x1)
+ if ((r1 >> i) & 1)
{
if (r0->var04[i].var00_7)
{
- r0->var02 |= 0x1 << i;
- r0->var04[i].var00_0 = 0x1;
+ r0->var02 |= 1 << i;
+ r0->var04[i].var00_0 = 1;
}
}
}
@@ -211,21 +173,22 @@ void sub_8124CE8(struct UnkStruct0 *r0, u16 r1)
void sub_8124D3C(struct UnkStruct0 *r0, u16 r1)
{
u8 i;
- for (i = 0; i < 0x10; i++)
+
+ for (i = 0; i < 16; i++)
{
- if ((r0->var02 >> i) & 0x1)
+ if ((r0->var02 >> i) & 1)
{
if (r0->var04[i].var00_7)
{
- if ((r1 >> i) & 0x1)
+ if ((r1 >> i) & 1)
{
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;
+ r0->var04[i].var00_0 = 0;
+ r0->var04[i].var02 = 0;
+ r0->var04[i].var01 = 0;
if (r0->var04[i].var04.var07_7 < 0)
r0->var04[i].var03 = 0xFF;
else
@@ -236,8 +199,8 @@ void sub_8124D3C(struct UnkStruct0 *r0, u16 r1)
}
if (r1 == 0xFFFF)
{
- r0->var00 = 0x0;
- r0->var02 = 0x0;
+ r0->var00 = 0;
+ r0->var02 = 0;
}
else
{
@@ -246,11 +209,10 @@ void sub_8124D3C(struct UnkStruct0 *r0, u16 r1)
}
void sub_8124DDC(u16 *dest, u16 src, u8 left, u8 top, u8 width, u8 height)
{
-
u16 *_dest;
u8 i;
u8 j;
- i = 0x0;
+ i = 0;
dest = &dest[top * 32 + left];
for (; i < height; i++)
{
@@ -267,7 +229,7 @@ void sub_8124E2C(u16 *dest, u16 *src, u8 left, u8 top, u8 width, u8 height)
u16 *_src = src;
u8 i;
u8 j;
- i = 0x0;
+ i = 0;
dest = &dest[top * 32 + left];
for (; i < height; i++)
{
diff --git a/src/engine/rtc.c b/src/rtc.c
index d73f943d2..5462298ed 100644
--- a/src/engine/rtc.c
+++ b/src/rtc.c
@@ -268,6 +268,28 @@ void FormatHexDate(u8 *dest, s32 year, s32 month, s32 day)
*dest = EOS;
}
+#if DEBUG
+
+void debug_sub_800987C(u8 *dest)
+{
+ FormatHexDate(dest, sRtc.year, sRtc.month, sRtc.day);
+}
+
+void debug_sub_8009894(u8 *dest)
+{
+ u16 dayCount;
+
+ dayCount = RtcGetDayCount(&sRtc);
+ ConvertIntToDecimalStringN(dest, dayCount, STR_CONV_MODE_RIGHT_ALIGN, 4);
+}
+
+void debug_sub_80098B8(u8 *dest)
+{
+ ConvertIntToHexStringN(dest, sRtc.status, STR_CONV_MODE_LEADING_ZEROS, 2);
+}
+
+#endif
+
void RtcCalcTimeDifference(struct SiiRtcInfo *rtc, struct Time *result, struct Time *t)
{
u16 days = RtcGetDayCount(rtc);
@@ -347,3 +369,10 @@ u32 RtcGetMinuteCount()
RtcGetInfo(&sRtc);
return (24 * 60) * RtcGetDayCount(&sRtc) + 60 * sRtc.hour + sRtc.minute;
}
+
+#if DEBUG
+void debug_sub_8009A60()
+{
+ RtcGetRawInfo(&sRtc);
+}
+#endif
diff --git a/src/field/safari_zone.c b/src/safari_zone.c
index 6c7c8b391..f371b08b3 100644
--- a/src/field/safari_zone.c
+++ b/src/safari_zone.c
@@ -26,7 +26,7 @@ static void DecrementFeederStepCounters(void);
extern u8 gBattleOutcome;
EWRAM_DATA u8 gNumSafariBalls = 0;
-EWRAM_DATA static u16 gSafariZoneStepCounter = 0;
+EWRAM_DATA u16 gSafariZoneStepCounter = 0;
EWRAM_DATA static struct PokeblockFeeder gPokeblockFeeders[NUM_POKEBLOCK_FEEDERS] = {0};
extern void (*gFieldCallback)(void);
diff --git a/src/engine/save.c b/src/save.c
index 250b29a87..0b7a3dd79 100644
--- a/src/engine/save.c
+++ b/src/save.c
@@ -663,6 +663,35 @@ static u16 CalculateChecksum(void *data, u16 size)
return ((checksum >> 16) + checksum);
}
+#if DEBUG
+void sub_813B79C(void)
+{
+ struct SaveSector *sbSector;
+ struct SaveSector *hofSector;
+ const struct SaveBlockChunk *sbChunks;
+ const struct SaveBlockChunk *hofChunks;
+ u16 i;
+
+ sbSector = eSaveSection;
+ sbChunks = sSaveBlockChunks;
+ for (i = 0; i < NUM_SECTORS_PER_SAVE_SLOT * 2; i++)
+ {
+ DoReadFlashWholeSection(i, sbSector);
+ sbSector->checksum = CalculateChecksum(sbSector, sbChunks[sbSector->id].size);
+ ProgramFlashSectorAndVerify(i, sbSector->data);
+ }
+
+ hofSector = eSaveSection;
+ hofChunks = sHallOfFameChunks;
+ for (i = 0; i < NUM_HALL_OF_FAME_SECTORS; i++)
+ {
+ DoReadFlashWholeSection(HALL_OF_FAME_SECTOR + i, hofSector);
+ hofSector->id = CalculateChecksum(hofSector, hofChunks[i].size); // why id?
+ ProgramFlashSectorAndVerify(HALL_OF_FAME_SECTOR + i, hofSector->data);
+ }
+}
+#endif
+
u8 Save_WriteDataInternal(u8 saveType)
{
u8 i;
@@ -706,13 +735,21 @@ u8 Save_WriteDataInternal(u8 saveType)
return 0;
}
+#if DEBUG
+extern u32 gUnknown_Debug_03004BD0;
+#endif
+
u8 Save_WriteData(u8 saveType) // TrySave
{
if (gFlashMemoryPresent != TRUE)
return SAVE_STATUS_ERROR;
Save_WriteDataInternal(saveType);
- if (!gDamagedSaveSectors)
+ if (!gDamagedSaveSectors
+#if DEBUG
+ && gUnknown_Debug_03004BD0 == 0
+#endif
+ )
return SAVE_STATUS_OK;
DoSaveFailedScreen(saveType);
@@ -815,7 +852,7 @@ u8 Save_LoadGameData(u8 saveType)
return result;
}
-static const u8 sUnusedFlashSectors[] = { 30, 31 };
+const u8 sUnusedFlashSectors[] = { 30, 31 };
bool8 unref_sub_8125F4C(struct UnkSaveSection *a1)
{
diff --git a/src/engine/save_failed_screen.c b/src/save_failed_screen.c
index 74a1e9612..f57315d09 100644
--- a/src/engine/save_failed_screen.c
+++ b/src/save_failed_screen.c
@@ -26,6 +26,7 @@
static EWRAM_DATA u16 gSaveFailedType = 0;
static EWRAM_DATA u16 gSaveFailedClockInfo[9] = {0};
+extern u32 gUnknown_Debug_03004BD0;
extern u32 gDamagedSaveSectors;
extern u32 gGameContinueCallback;
@@ -68,7 +69,7 @@ static void CB2_GameplayCannotBeContinued(void);
static void CB2_FadeAndReturnToTitleScreen(void);
static void CB2_ReturnToTitleScreen(void);
static void VBlankCB_UpdateClockGraphics(void);
-static bool8 VerifySectorWipe(u16 sector);
+static bool8 IsSectorNonEmpty(u16 sector);
static bool8 WipeSector(u16 sector);
static bool8 WipeSectors(u32 sectorBits);
@@ -154,6 +155,11 @@ static void CB2_WipeSave(void)
gSaveFailedClockInfo[0] = TRUE;
+#if DEBUG
+ if (gUnknown_Debug_03004BD0 != 0)
+ gDamagedSaveSectors = 1;
+#endif
+
while (gDamagedSaveSectors != 0 && wipeTries < 3) // while there are still attempts left, keep trying to fix the save sectors.
{
if (WipeSectors(gDamagedSaveSectors) != FALSE)
@@ -264,18 +270,23 @@ static void VBlankCB_UpdateClockGraphics(void)
gSaveFailedClockInfo[1]--;
}
-static bool8 VerifySectorWipe(u16 sector)
+static bool8 IsSectorNonEmpty(u16 sector)
{
u32 *ptr = (u32 *)&gSharedMem;
u16 i;
ReadFlash(sector, 0, ptr, 4096);
+#if DEBUG // Don't verify the sector wipe?
for (i = 0; i < 0x400; i++, ptr++)
- if (*ptr)
+ ;
+ return gUnknown_Debug_03004BD0;
+#else
+ for (i = 0; i < 0x400; i++, ptr++)
+ if (*ptr != 0)
return TRUE;
-
return FALSE;
+#endif
}
static bool8 WipeSector(u16 sector)
@@ -288,7 +299,7 @@ static bool8 WipeSector(u16 sector)
for (j = 0; j < 0x1000; j++)
ProgramFlashByte(sector, j, 0);
- failed = VerifySectorWipe(sector);
+ failed = IsSectorNonEmpty(sector);
}
return failed;
diff --git a/src/engine/save_menu_util.c b/src/save_menu_util.c
index ccf4d9f6f..ccf4d9f6f 100644
--- a/src/engine/save_menu_util.c
+++ b/src/save_menu_util.c
diff --git a/src/field/scrcmd.c b/src/scrcmd.c
index 36edbe472..e5272bc9c 100644
--- a/src/field/scrcmd.c
+++ b/src/scrcmd.c
@@ -12,8 +12,7 @@
#include "field_door.h"
#include "field_effect.h"
#include "field_fadetransition.h"
-#include "field_map_obj.h"
-#include "field_map_obj_helpers.h"
+#include "event_object_movement.h"
#include "field_message_box.h"
#include "field_player_avatar.h"
#include "field_screen_effect.h"
@@ -626,7 +625,7 @@ bool8 IsPaletteNotActive(void)
bool8 ScrCmd_fadescreen(struct ScriptContext *ctx)
{
- fade_screen(ScriptReadByte(ctx), 0);
+ FadeScreen(ScriptReadByte(ctx), 0);
SetupNativeScript(ctx, IsPaletteNotActive);
return TRUE;
}
@@ -636,7 +635,7 @@ bool8 ScrCmd_fadescreenspeed(struct ScriptContext *ctx)
u8 duration = ScriptReadByte(ctx);
u8 delay = ScriptReadByte(ctx);
- fade_screen(duration, delay);
+ FadeScreen(duration, delay);
SetupNativeScript(ctx, IsPaletteNotActive);
return TRUE;
}
diff --git a/src/engine/script.c b/src/script.c
index 8625cfdc2..8625cfdc2 100644
--- a/src/engine/script.c
+++ b/src/script.c
diff --git a/src/field/script_menu.c b/src/script_menu.c
index 9d901a03c..9d901a03c 100644
--- a/src/field/script_menu.c
+++ b/src/script_menu.c
diff --git a/src/field/script_movement.c b/src/script_movement.c
index c7ce55171..653dffcbf 100644
--- a/src/field/script_movement.c
+++ b/src/script_movement.c
@@ -1,7 +1,6 @@
#include "global.h"
#include "script_movement.h"
-#include "field_map_obj.h"
-#include "field_map_obj_helpers.h"
+#include "event_object_movement.h"
#include "task.h"
#include "util.h"
diff --git a/src/script_pokemon_util_80C4BF0.c b/src/script_pokemon_util_80C4BF0.c
index f991297ab..02e66d313 100644
--- a/src/script_pokemon_util_80C4BF0.c
+++ b/src/script_pokemon_util_80C4BF0.c
@@ -32,26 +32,13 @@ extern void sub_80C4698(u8 *, u8);
extern struct SpriteTemplate gUnknown_02024E8C;
-extern u8 gContestPlayerMonIndex;
-extern u8 gIsLinkContest;
-extern u8 gPlayerPartyCount;
extern u8 gSelectedOrderFromParty[];
-extern u16 gSpecialVar_0x8004;
-extern u16 gSpecialVar_0x8005;
-extern u16 gSpecialVar_0x8006;
-
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 gContestFinalStandings[];
-extern s16 gUnknown_02038670[];
-extern s16 gUnknown_02038678[];
void SetContestTrainerGfxIds(void)
{
@@ -373,8 +360,8 @@ void ScriptRandom(void)
if(gIsLinkContest & 1)
{
- gUnknown_03005D28 = 1103515245 * gUnknown_03005D28 + 24691;
- random = gUnknown_03005D28 >> 16;
+ gContestRngValue = 1103515245 * gContestRngValue + 24691;
+ random = gContestRngValue >> 16;
scriptPtr = &gSpecialVar_Result;
}
else
diff --git a/src/field/secret_base.c b/src/secret_base.c
index 134aebbc6..210d49835 100644
--- a/src/field/secret_base.c
+++ b/src/secret_base.c
@@ -23,6 +23,7 @@
#include "menu.h"
#include "menu_helpers.h"
#include "metatile_behavior.h"
+#include "new_game.h"
#include "palette.h"
#include "pokemon.h"
#include "overworld.h"
@@ -127,10 +128,11 @@ void ClearSecretBase(struct SecretBaseRecord *record)
{
u16 i;
u16 j;
+
record->secretBaseId = 0;
- for (i=0; i<OT_NAME_LENGTH; i++)
+ for (i = 0; i < OT_NAME_LENGTH; i++)
record->playerName[i] = 0xff;
- for (i=0; i<4; i++)
+ for (i = 0; i < 4; i++)
record->trainerId[i] = 0x00;
record->sbr_field_e = 0;
record->sbr_field_10 = 0;
@@ -139,14 +141,15 @@ void ClearSecretBase(struct SecretBaseRecord *record)
record->gender = 0;
record->sbr_field_1_5 = 0;
record->sbr_field_1_6 = 0;
- for (i=0; i<16; i++) {
+ 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++) {
+ 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;
@@ -175,17 +178,20 @@ void sub_80BB5D0(void)
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;
+ for (i = 0; i < MAX_SECRET_BASES; i++)
+ {
+ if (gUnknown_020387DC == gSaveBlock1.secretBases[i].secretBaseId)
+ {
+ gSpecialVar_Result = 1;
+ VarSet(VAR_CURRENT_SECRET_BASE, i);
+ break;
+ }
}
}
-void sub_80BB63C(void) // 80bb63c
+void sub_80BB63C(void)
{
if (gSaveBlock1.secretBases[0].secretBaseId)
gSpecialVar_Result = 1;
@@ -193,7 +199,7 @@ void sub_80BB63C(void) // 80bb63c
gSpecialVar_Result = 0;
}
-u8 sub_80BB66C(void) // 80bb66c
+u8 sub_80BB66C(void)
{
s16 x, y;
s16 v0;
@@ -214,7 +220,7 @@ u8 sub_80BB66C(void) // 80bb66c
return 0;
}
-void sub_80BB70C(void) // 80bb70c
+void sub_80BB70C(void)
{
gSpecialVar_0x8007 = sub_80BB66C();
}
@@ -222,9 +228,11 @@ void sub_80BB70C(void) // 80bb70c
s16 unref_sub_80BB724(u16 *a0, u8 a1)
{
u16 v2;
- for (v2=0; v2<0x200; v2++) {
+
+ for (v2 = 0; v2 < 0x200; v2++)
+ {
if ((a0[v2] & 0xFFF) == a1)
- return (s16)v2;
+ return v2;
}
return -1;
}
@@ -232,9 +240,13 @@ s16 unref_sub_80BB724(u16 *a0, u8 a1)
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) {
+
+ 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;
@@ -248,17 +260,22 @@ 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) {
+ 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) {
+ 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;
@@ -269,7 +286,9 @@ void sub_80BB800(void)
u8 sub_80BB8A8(u8 *arg1)
{
u8 idx;
- for (idx=0; idx<7; idx++) {
+
+ for (idx=0; idx<7; idx++)
+ {
if (arg1[idx] == EOS)
return idx;
}
@@ -280,10 +299,10 @@ void sub_80BB8CC(void)
{
u8 nameLength;
u16 idx;
+
gSaveBlock1.secretBases[0].secretBaseId = gUnknown_020387DC;
- for (idx=0; idx<4; idx++) {
+ 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);
@@ -296,13 +315,20 @@ 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) {
+
+ 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) {
+ 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;
}
@@ -323,14 +349,14 @@ void sub_80BBA14(void)
void sub_80BBA48(u8 taskid)
{
u16 curbaseid;
- switch (gTasks[taskid].data[0]) {
+ switch (gTasks[taskid].data[0])
+ {
case 0:
gTasks[taskid].data[0] = 1;
break;
case 1:
- if (!gPaletteFade.active) {
+ if (!gPaletteFade.active)
gTasks[taskid].data[0] = 2;
- }
break;
case 2:
curbaseid = VarGet(VAR_CURRENT_SECRET_BASE);
@@ -348,7 +374,7 @@ void sub_80BBA48(u8 taskid)
void sub_80BBAF0(void)
{
CreateTask(sub_80BBA48, 0);
- fade_screen(1, 0);
+ FadeScreen(1, 0);
saved_warp2_set(0, gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1);
}
@@ -362,7 +388,8 @@ bool8 sub_80BBB24(void)
void sub_80BBB50(u8 taskid)
{
FieldObjectTurn(&(gMapObjects[gPlayerAvatar.mapObjectId]), 2);
- if (sub_807D770() == 1) {
+ if (IsWeatherNotFadingIn() == 1)
+ {
EnableBothScriptContexts();
DestroyTask(taskid);
}
@@ -371,6 +398,7 @@ void sub_80BBB50(u8 taskid)
void sub_80BBB90(void)
{
s16 x, y;
+
ScriptContext2_Enable();
HideMapNamePopup();
sub_80BB764(&x, &y, 0x220);
@@ -383,7 +411,9 @@ void sub_80BBB90(void)
void sub_80BBBEC(u8 taskid)
{
s8 idx;
- if (!gPaletteFade.active) {
+
+ 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();
@@ -397,7 +427,7 @@ void sub_80BBC78(void)
{
u8 taskid = CreateTask(sub_80BBBEC, 0);
gTasks[taskid].data[0] = 0;
- fade_screen(1, 0);
+ FadeScreen(1, 0);
}
bool8 CurrentMapIsSecretBase(void)
@@ -411,17 +441,29 @@ void sub_80BBCCC(u8 flagIn)
{
u16 curBaseId;
u16 x, y;
- if (CurrentMapIsSecretBase()) {
+
+ 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]);
+ 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) {
+ if (curBaseId != 0)
+ {
sub_80BB764(&x, &y, 0x220);
MapGridSetMetatileIdAt(x + 7, y + 7, 0xe21);
- } else if (flagIn == 1 && VarGet(VAR_0x4089) == 1) {
+ }
+ else if (flagIn == 1 && VarGet(VAR_0x4089) == 1)
+ {
sub_80BB764(&x, &y, 0x220);
MapGridSetMetatileIdAt(x + 7, y + 7, 0xe0a);
}
@@ -438,38 +480,47 @@ void sub_80BBDD0(void)
u8 permission;
u8 ndecor;
u16 curBase = VarGet(VAR_CURRENT_SECRET_BASE);
- if (!CurrentMapIsSecretBase()) {
+
+ if (!CurrentMapIsSecretBase())
+ {
roomdecor = gSaveBlock1.playerRoomDecor;
roomdecorpos = gSaveBlock1.playerRoomDecorPos;
ndecor = 12;
- } else {
+ }
+ else
+ {
roomdecor = gSaveBlock1.secretBases[curBase].decorations;
roomdecorpos = gSaveBlock1.secretBases[curBase].decorationPos;
ndecor = 16;
}
- for (decidx=0; decidx<ndecor; decidx++) {
- if (roomdecor[decidx] != DECOR_NONE) {
+ 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++) {
+ 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 ++;
+ 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) == 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 ++;
+ }
}
}
}
@@ -485,8 +536,12 @@ void sub_80BBFA4(void)
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) {
+
+ 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;
}
@@ -511,15 +566,15 @@ bool8 sub_80BC050(void)
void sub_80BC074(u8 taskid)
{
- switch (gTasks[taskid].data[0]) {
+ switch (gTasks[taskid].data[0])
+ {
case 0:
ScriptContext2_Enable();
gTasks[taskid].data[0] = 1;
break;
case 1:
- if (!gPaletteFade.active) {
+ if (!gPaletteFade.active)
gTasks[taskid].data[0] = 2;
- }
break;
case 2:
copy_saved_warp2_bank_and_enter_x_to_warp1(0x7E);
@@ -532,12 +587,14 @@ void sub_80BC074(u8 taskid)
}
}
-void sub_80BC0F8(void) {
+void sub_80BC0F8(void)
+{
CreateTask(sub_80BC074, 0);
- fade_screen(1, 0);
+ FadeScreen(1, 0);
}
-void sub_80BC114(void) {
+void sub_80BC114(void)
+{
if (gSaveBlock1.secretBases[0].secretBaseId != gUnknown_020387DC)
gSpecialVar_Result = 1;
else
@@ -547,14 +604,17 @@ void sub_80BC114(void) {
u8 sub_80BC14C(u8 sbid)
{
s16 idx;
- for (idx=0; idx<MAX_SECRET_BASES; 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 *sub_80BC190(u8 *dest, u8 arg1)
+{
u8 local1;
u8 *str;
@@ -570,12 +630,14 @@ u8 *sub_80BC190(u8 *dest, u8 arg1) { // 80bc190
#endif
}
-u8 *GetSecretBaseMapName(u8 *dest) {
+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) {
+void BufferSecretBaseOwnerName(void)
+{
u8 *var0 = gSaveBlock1.secretBases[(u8)VarGet(VAR_CURRENT_SECRET_BASE)].playerName;
u8 *var1 = gStringVar1;
u8 var2 = sub_80BB8A8(var0);
@@ -583,13 +645,16 @@ void BufferSecretBaseOwnerName(void) {
*var3 = EOS;
}
-bool8 sub_80BC268(u8 i) { // 80bc268
+bool8 sub_80BC268(u8 i)
+{
if (gSaveBlock1.secretBases[i].sbr_field_1_6)
return TRUE;
- return FALSE;
+ else
+ return FALSE;
}
-u8 sub_80BC298(struct Pokemon *mon) { // 80bc298
+u8 sub_80BC298(struct Pokemon *mon)
+{
u16 evsum = GetMonData(mon, MON_DATA_HP_EV);
evsum += GetMonData(mon, MON_DATA_ATK_EV);
evsum += GetMonData(mon, MON_DATA_DEF_EV);
@@ -804,10 +869,11 @@ 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)
+ && gSaveBlock1.secretBases[0].secretBaseId == mapEvents->bgEvents[eventId].bgUnion.secretBaseId)
{
u16 i;
s16 tileId = MapGridGetMetatileIdAt(mapEvents->bgEvents[eventId].x + 7, mapEvents->bgEvents[eventId].y + 7);
@@ -845,33 +911,23 @@ 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)
- {
+ if (sub_80BC268(sub_80BC14C(gUnknown_020387DC)) == TRUE)
gSpecialVar_Result = 1;
- }
else if (sub_80BC538() > 9)
- {
gSpecialVar_Result = 2;
- }
else
- {
gSpecialVar_Result = 0;
- }
}
void sub_80BC5BC(void)
@@ -897,18 +953,15 @@ void Task_SecretBasePC_Registry(u8 taskId)
ScriptContext2_Enable();
ClearVerticalScrollIndicatorPalettes();
LoadScrollIndicatorPalette();
-
+
taskData = gTasks[taskId].data;
taskData[0] = sub_80BC538();
if (taskData[0] != 0)
{
- if (taskData[0] > 7) {
+ if (taskData[0] > 7)
taskData[3] = 7;
- }
else
- {
taskData[3] = taskData[0];
- }
taskData[1] = 0;
taskData[2] = 0;
@@ -964,7 +1017,9 @@ void sub_80BC6B0(u8 taskId)
Menu_BlankWindowRect(18, ((n << 25) + (1 << 26)) >> 24, 28, 18); // the shifts are needed to match
}
else
+ {
CreateVerticalScrollIndicators(BOTTOM_ARROW, 0xbc, 0x98);
+ }
if (taskData[2] == 0)
DestroyVerticalScrollIndicator(TOP_ARROW);
@@ -989,12 +1044,12 @@ void sub_80BC824(u8 taskId)
{
if (taskData[1])
{
- PlaySE(5);
+ PlaySE(SE_SELECT);
taskData[1] = Menu_MoveCursor(-1);
}
else if (taskData[2])
{
- PlaySE(5);
+ PlaySE(SE_SELECT);
taskData[2]--;
sub_80BC6B0(taskId);
}
@@ -1005,20 +1060,20 @@ void sub_80BC824(u8 taskId)
{
if (taskData[2] + taskData[1] != taskData[0])
{
- PlaySE(5);
+ PlaySE(SE_SELECT);
taskData[2]++;
sub_80BC6B0(taskId);
}
}
else
{
- PlaySE(5);
+ PlaySE(SE_SELECT);
taskData[1] = Menu_MoveCursor(1);
}
}
else if (gMain.newKeys & A_BUTTON)
{
- PlaySE(5);
+ PlaySE(SE_SELECT);
if (taskData[1] + taskData[2] == taskData[0])
{
Menu_DestroyCursor();
@@ -1034,7 +1089,7 @@ void sub_80BC824(u8 taskId)
}
else if (gMain.newKeys & B_BUTTON)
{
- PlaySE(5);
+ PlaySE(SE_SELECT);
Menu_DestroyCursor();
Menu_EraseWindowRect(0, 0, 29, 19);
sub_80BCC54(taskId);
@@ -1078,7 +1133,7 @@ void sub_80BC9E4(u8 taskId)
{
if (Menu_GetCursorPos())
{
- PlaySE(5);
+ PlaySE(SE_SELECT);
Menu_MoveCursor(-1);
}
}
@@ -1086,18 +1141,18 @@ void sub_80BC9E4(u8 taskId)
{
if (Menu_GetCursorPos() != 1)
{
- PlaySE(5);
+ PlaySE(SE_SELECT);
Menu_MoveCursor(1);
}
}
else if (gMain.newKeys & A_BUTTON)
{
- PlaySE(5);
+ PlaySE(SE_SELECT);
gUnknown_083D13D4[Menu_GetCursorPos()].func(taskId);
}
else if (gMain.newKeys & B_BUTTON)
{
- PlaySE(5);
+ PlaySE(SE_SELECT);
sub_80BCBF8(taskId);
}
}
@@ -1132,14 +1187,10 @@ void sub_80BCB10(u8 taskId)
taskData[0]--;
if (taskData[2] > 0)
- {
taskData[2]--;
- }
if (taskData[0] < 8)
- {
taskData[3]--;
- }
sub_80BC7D8(taskId);
gTasks[taskId].func = sub_80BC824;
@@ -1180,13 +1231,9 @@ void sub_80BCC54(u8 taskId)
DestroyVerticalScrollIndicator(BOTTOM_ARROW);
if (curBaseIndex == 0)
- {
ScriptContext1_SetupScript(gUnknown_0815F399);
- }
else
- {
ScriptContext1_SetupScript(gUnknown_0815F49A);
- }
DestroyTask(taskId);
}
@@ -1216,7 +1263,8 @@ const u8 *GetSecretBaseTrainerLoseText(void)
void unref_sub_80BCD7C(u8 secretBaseIndex)
{
u16 i;
- for (i = 0; i == 0; i++)
+
+ for (i = 0; i < 1; i++)
{
gSaveBlock1.secretBases[secretBaseIndex].partyPersonality[i] = i + 1;
gSaveBlock1.secretBases[secretBaseIndex].partyMoves[i * 4] = i + 1;
@@ -1230,8 +1278,8 @@ void unref_sub_80BCD7C(u8 secretBaseIndex)
void sub_80BCE1C(void)
{
u16 curBaseIndex = VarGet(VAR_CURRENT_SECRET_BASE);
- sub_810FB10(1);
+ sub_810FB10(1);
CreateSecretBaseEnemyParty(&gSaveBlock1.secretBases[curBaseIndex]);
}
@@ -1249,9 +1297,7 @@ void sub_80BCE90()
u8 i;
for (i = 0; i < MAX_SECRET_BASES; i++)
- {
gSaveBlock1.secretBases[i].sbr_field_1_5 = 0;
- }
FlagSet(FLAG_DAILY_UNKNOWN_8C2);
}
@@ -1281,28 +1327,18 @@ void sub_80BCF1C(u8 taskId)
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;
}
}
@@ -1320,9 +1356,7 @@ bool8 sub_80BD070(struct SecretBaseRecord *baseA, struct SecretBaseRecord *baseB
for (i = 0; i < 4; i++)
{
if (baseA->trainerId[i] != baseB->trainerId[i])
- {
return FALSE;
- }
}
return TRUE;
@@ -1335,9 +1369,7 @@ bool8 sub_80BD0A0(struct SecretBaseRecord *baseA, struct SecretBaseRecord *baseB
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;
@@ -1346,12 +1378,9 @@ bool8 sub_80BD0A0(struct SecretBaseRecord *baseA, struct SecretBaseRecord *baseB
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;
+ else
+ return FALSE;
}
s16 sub_80BD12C(u8 secretBaseId)
@@ -1361,9 +1390,7 @@ s16 sub_80BD12C(u8 secretBaseId)
for (i = 0; i < MAX_SECRET_BASES; i++)
{
if (gSaveBlock1.secretBases[i].secretBaseId == secretBaseId)
- {
return i;
- }
}
return -1;
@@ -1376,9 +1403,7 @@ u8 sub_80BD170(void)
for (i = 1; i < MAX_SECRET_BASES; i++)
{
if (gSaveBlock1.secretBases[i].secretBaseId == 0)
- {
return i;
- }
}
return 0;
@@ -1391,9 +1416,7 @@ u8 sub_80BD1B0(void)
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;
@@ -1404,9 +1427,7 @@ u8 sub_80BD1FC(struct SecretBaseRecord *secretBase)
s16 secretBaseIndex;
if (secretBase->secretBaseId == 0)
- {
return 0;
- }
secretBaseIndex = sub_80BD12C(secretBase->secretBaseId);
if (secretBaseIndex != 0)
@@ -1414,11 +1435,9 @@ u8 sub_80BD1FC(struct SecretBaseRecord *secretBase)
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)
+ || secretBase->sbr_field_1_0 == 1)
{
sub_80BD034(secretBaseIndex, secretBase);
return secretBaseIndex;
@@ -1456,7 +1475,7 @@ void sub_80BD280(void)
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))
+ || (secretBases[i].sbr_field_1_6 == 2 && secretBases[j].sbr_field_1_6 != 2))
{
temp = secretBases[i];
secretBases[i] = secretBases[j];
@@ -1473,9 +1492,7 @@ void sub_80BD328(struct SecretBaseRecord *secretBases, u8 b)
for (i = 1; i < MAX_SECRET_BASES; i++)
{
if (secretBases[i].sbr_field_1_6 == b)
- {
sub_80BD1FC(&secretBases[i]);
- }
}
}
@@ -1540,9 +1557,7 @@ void sub_80BD3DC(struct SecretBaseRecord *basesA, struct SecretBaseRecord *bases
}
if (var1 == 7)
- {
break;
- }
}
}
@@ -1588,16 +1603,12 @@ void sub_80BD514(struct SecretBaseRecord *basesA, struct SecretBaseRecord *bases
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);
- }
}
}
}
@@ -1609,9 +1620,7 @@ void sub_80BD514(struct SecretBaseRecord *basesA, struct SecretBaseRecord *bases
basesB[i].sbr_field_1_5 = 0;
if (!sub_80BD494(&basesB[i], basesC, i))
- {
sub_80BD494(&basesB[i], basesD, i);
- }
}
}
@@ -1624,9 +1633,7 @@ void sub_80BD514(struct SecretBaseRecord *basesA, struct SecretBaseRecord *bases
}
if (basesD[i].secretBaseId)
- {
basesD[i].sbr_field_1_5 = 0;
- }
}
}
@@ -1650,9 +1657,14 @@ void sub_80BD610(struct SecretBaseRecord *basesA, struct SecretBaseRecord *bases
void sub_80BD674(void *playerRecords, u32 size, u8 c)
{
- if (FlagGet(FLAG_RECEIVED_SECRET_POWER))
+ if (
+#if DEBUG
+ gUnknown_020297ED != 0 ||
+#endif
+ FlagGet(FLAG_RECEIVED_SECRET_POWER))
{
u16 i;
+
u8 numLinkedPlayers = GetLinkPlayerCount();
switch (numLinkedPlayers)
{
@@ -1695,14 +1707,10 @@ void sub_80BD674(void *playerRecords, u32 size, u8 c)
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/field/shop.c b/src/shop.c
index a228ff92f..87dbbeb97 100644
--- a/src/field/shop.c
+++ b/src/shop.c
@@ -16,7 +16,7 @@
#include "task.h"
#include "tv.h"
#include "scanline_effect.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "field_player_avatar.h"
#include "fieldmap.h"
#include "item.h"
@@ -115,7 +115,7 @@ static void SetShopMenuCallback(void *callbackPtr)
gMartInfo.callback = callbackPtr;
}
-static void SetShopItemsForSale(u16 *items)
+static void SetShopItemsForSale(const u16 *items)
{
u16 i = 0;
@@ -153,13 +153,9 @@ static void Task_DoBuySellMenu(u8 taskId)
{
PlaySE(SE_SELECT);
if (gMartInfo.martType == MART_TYPE_0)
- {
sBuySellQuitMenuActions[gMartBuySellOptionList[gMartInfo.cursor]].func(taskIdConst);
- }
else
- {
sBuySellQuitMenuActions[gMartBuyNoSellOptionList[gMartInfo.cursor]].func(taskIdConst);
- }
}
else if (gMain.newKeys & B_BUTTON)
{
@@ -173,7 +169,7 @@ static void Task_HandleShopMenuBuy(u8 taskId)
gTasks[taskId].data[8] = (u32)BuyMenuDrawGraphics >> 16;
gTasks[taskId].data[9] = (u32)BuyMenuDrawGraphics;
gTasks[taskId].func = Shop_FadeAndRunBuySellCallback;
- fade_screen(1, 0);
+ FadeScreen(1, 0);
}
static void Task_HandleShopMenuSell(u8 taskId)
@@ -181,7 +177,7 @@ static void Task_HandleShopMenuSell(u8 taskId)
gTasks[taskId].data[8] = (u32)ItemMenu_LoadSellMenu >> 16;
gTasks[taskId].data[9] = (u32)ItemMenu_LoadSellMenu;
gTasks[taskId].func = Shop_FadeAndRunBuySellCallback;
- fade_screen(1, 0);
+ FadeScreen(1, 0);
}
static void Task_HandleShopMenuQuit(u8 taskId)
@@ -213,7 +209,7 @@ static void ReturnToShopMenuAfterExitingSellMenu(u8 taskId)
static void Task_ReturnToMartMenu(u8 taskId)
{
- if (sub_807D770() == 1)
+ if (IsWeatherNotFadingIn() == 1)
{
if (gMartInfo.martType == MART_TYPE_2)
DisplayItemMessageOnField(taskId, gOtherText_CanIHelpYou, ReturnToShopMenuAfterExitingSellMenu, 0);
@@ -366,15 +362,15 @@ static void BuyMenuDrawMapMetatile(int var1, int var2, u16 *var3, s32 var4)
switch (tempVar4)
{
- case 0: // _080B335C
+ case 0:
BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[2], offset1, offset2, var3);
BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[1], offset1, offset2, var3 + 4);
break;
- case 1: // _080B3364
+ case 1:
BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[3], offset1, offset2, var3);
BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[2], offset1, offset2, var3 + 4);
break;
- case 2: // _080B3398
+ case 2:
BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[3], offset1, offset2, var3);
BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[1], offset1, offset2, var3 + 4);
break;
@@ -550,7 +546,7 @@ static void Shop_DisplayNormalPriceInList(u16 itemId, u8 var2, bool32 hasControl
{
u8 *stringPtr = gStringVar1;
- if (hasControlCode != FALSE)
+ if (hasControlCode)
{
stringPtr[0] = EXT_CTRL_CODE_BEGIN;
stringPtr[1] = 0x1;
@@ -563,7 +559,7 @@ static void Shop_DisplayNormalPriceInList(u16 itemId, u8 var2, bool32 hasControl
sub_8072A18(&gStringVar1[0], 0x70, var2 << 3, 0x58, 0x1);
stringPtr = gStringVar1;
- if (hasControlCode != FALSE)
+ if (hasControlCode)
stringPtr = &gStringVar1[3];
GetMoneyAmountText(stringPtr, (ItemId_GetPrice(itemId) >> GetPriceReduction(1)), 0x4);
@@ -574,7 +570,7 @@ static void Shop_DisplayDecorationPriceInList(u16 itemId, u8 var2, bool32 hasCon
{
u8 *stringPtr = gStringVar1;
- if (hasControlCode != FALSE)
+ if (hasControlCode)
{
stringPtr[0] = EXT_CTRL_CODE_BEGIN;
stringPtr[1] = 0x1;
@@ -586,7 +582,7 @@ static void Shop_DisplayDecorationPriceInList(u16 itemId, u8 var2, bool32 hasCon
sub_8072A18(&gStringVar1[0], 0x70, var2 << 3, 0x58, 0x1);
stringPtr = gStringVar1;
- if (hasControlCode != FALSE)
+ if (hasControlCode)
stringPtr = &gStringVar1[3];
// some names are the maximum string length for a shop item. Because there is no room for
@@ -632,8 +628,10 @@ static void Shop_PrintItemDescText(void)
0x4, 0x68, 0x68, 0x30, 0);
}
else
+ {
sub_8072AB0(gDecorations[gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]].description,
0x4, 0x68, 0x68, 0x30, 0);
+ }
}
else
{
@@ -687,7 +685,9 @@ static void Task_DoItemPurchase(u8 taskId)
Task_UpdatePurchaseHistory(taskId);
}
else
+ {
DisplayItemMessageOnField(taskId, gOtherText_NoRoomFor, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1);
+ }
}
else // a normal mart is only type 0, so types 1 and 2 are decoration marts.
{
@@ -706,7 +706,9 @@ static void Task_DoItemPurchase(u8 taskId)
}
}
else
+ {
DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1);
+ }
}
static void Shop_DoYesNoPurchase(u8 taskId)
@@ -1129,19 +1131,17 @@ static void Shop_DoCursorAction(u8 taskId)
ConvertIntToDecimalStringN(gStringVar2, gMartTotalCost, 0, 0x8);
if (gMartInfo.martType == MART_TYPE_1)
- {
StringExpandPlaceholders(gStringVar4, gOtherText_ThatWillBe2);
- }
else
- {
StringExpandPlaceholders(gStringVar4, gOtherText_ThatWillBe3);
- }
DisplayItemMessageOnField(taskId, gStringVar4, Shop_DoYesNoPurchase, 0xC3E1);
}
}
}
else
+ {
Task_ExitBuyMenu(taskId);
+ }
}
else if (gMain.newKeys & B_BUTTON) // go back to buy/sell/exit menu
{
@@ -1238,3 +1238,14 @@ void Shop_CreateDecorationShop2Menu(u16 *itemList)
SetShopItemsForSale(itemList);
SetShopMenuCallback(EnableBothScriptContexts);
}
+
+#if DEBUG
+
+void debug_sub_80C2818(void)
+{
+ CreateShopMenu(MART_TYPE_0);
+ SetShopItemsForSale(gUnusedMartArray);
+ SetShopMenuCallback(NULL);
+}
+
+#endif
diff --git a/src/field/slot_machine.c b/src/slot_machine.c
index 21bf29e91..8075f24e4 100644
--- a/src/field/slot_machine.c
+++ b/src/slot_machine.c
@@ -8,6 +8,7 @@
#include "sound.h"
#include "main.h"
#include "slot_machine.h"
+#include "string_util.h"
#include "decompress.h"
#include "trig.h"
#include "graphics.h"
@@ -17,7 +18,95 @@
#include "menu.h"
#include "ewram.h"
-struct UnkStruct1 {
+enum
+{
+ SLOT_MACHINE_TAG_7_RED,
+ SLOT_MACHINE_TAG_7_BLUE,
+ SLOT_MACHINE_TAG_AZURILL,
+ SLOT_MACHINE_TAG_LOTAD,
+ SLOT_MACHINE_TAG_CHERRY,
+ SLOT_MACHINE_TAG_POWER,
+ SLOT_MACHINE_TAG_REPLAY
+};
+
+enum
+{
+ SLOT_MACHINE_MATCHED_1CHERRY,
+ SLOT_MACHINE_MATCHED_2CHERRY,
+ SLOT_MACHINE_MATCHED_REPLAY,
+ SLOT_MACHINE_MATCHED_LOTAD,
+ SLOT_MACHINE_MATCHED_AZURILL,
+ SLOT_MACHINE_MATCHED_POWER,
+ SLOT_MACHINE_MATCHED_777_MIXED,
+ SLOT_MACHINE_MATCHED_777_RED,
+ SLOT_MACHINE_MATCHED_777_BLUE,
+ SLOT_MACHINE_MATCHED_NONE
+};
+
+struct SlotMachineEwramStruct
+{
+ /*0x00*/ u8 state;
+ /*0x01*/ u8 unk01;
+ /*0x02*/ u8 pikaPower;
+ /*0x03*/ u8 unk03;
+ /*0x04*/ u8 unk04;
+ /*0x05*/ u8 unk05;
+ /*0x06*/ u8 unk06;
+ /*0x07*/ u8 unk07;
+ /*0x08*/ u16 matchedSymbols;
+ /*0x0A*/ u8 unk0A;
+ /*0x0B*/ u8 unk0B;
+ /*0x0C*/ s16 coins;
+ /*0x0E*/ s16 payout;
+ /*0x10*/ s16 unk10;
+ /*0x12*/ s16 bet;
+ /*0x14*/ s16 unk14;
+ /*0x16*/ s16 unk16;
+ /*0x18*/ s16 unk18;
+ /*0x1A*/ s16 unk1A;
+ /*0x1C*/ s16 unk1C[3];
+ /*0x22*/ u16 unk22[3];
+ /*0x28*/ s16 reelPositions[3];
+ /*0x2E*/ s16 unk2E[3];
+ /*0x34*/ s16 unk34[3];
+ /*0x3A*/ u8 reelTasks[3];
+ /*0x3D*/ u8 unk3D;
+ /*0x3E*/ u8 unk3E;
+ /*0x3F*/ u8 unk3F;
+ /*0x40*/ u8 unk40;
+ /*0x41*/ u8 unk41;
+ /*0x42*/ u8 unk42;
+ /*0x43*/ u8 unk43;
+ /*0x44*/ u8 unk44[5];
+ /*0x49*/ u8 unk49[2];
+ /*0x49*/ u8 unk4B[3];
+ /*0x4E*/ u8 unk4E[2];
+ /*0x50*/ u8 unk50[2];
+ /*0x52*/ u8 unk52[2];
+ /*0x54*/ u8 unk54[4];
+ /*0x58*/ u16 win0h;
+ /*0x5a*/ u16 win0v;
+ /*0x5c*/ u16 winIn;
+ /*0x5e*/ u16 winOut;
+ /*0x60*/ u16 backupMapMusic;
+ /*0x64*/ MainCallback prevMainCb;
+#if DEBUG
+ u32 unk68;
+ u32 unk6C;
+ u32 unk70;
+ u32 unk74;
+ u32 unk78;
+ u32 unk7C;
+ u32 unk80;
+ u32 unk84;
+ u32 unk88;
+ u32 unk8C;
+ s32 unk90;
+#endif
+};
+
+struct UnkStruct1
+{
/*0x00*/ u8 unk00;
/*0x01*/ u8 unk01;
/*0x02*/ s16 unk02;
@@ -29,7 +118,6 @@ struct UnkStruct1 {
#define SLOTMACHINE_GFX_TILES 236
#endif
-
static void CB2_SlotMachineSetup(void);
static void CB2_SlotMachineLoop(void);
static void PlaySlotMachine_Internal(u8 arg0, MainCallback cb);
@@ -61,7 +149,7 @@ 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);
+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);
@@ -76,6 +164,9 @@ 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);
+#if DEBUG
+static bool8 debug_sub_8116E74(struct Task *);
+#endif
static void sub_8102484(void);
static void sub_81024F0(void);
static bool8 sub_8102540(void);
@@ -222,6 +313,24 @@ static void sub_81064B8(void);
static void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4);
static void sub_81065DC(void);
+#if DEBUG
+static void debug_sub_811B5D0(void);
+static void debug_sub_811B620(void);
+static void debug_sub_811B5B4(s32 *, s32);
+static void debug_sub_811B894(void);
+static u8 debug_sub_811B634(void);
+static void debug_sub_811B654(u8 taskId);
+#endif
+
+#if DEBUG
+static u8 unk_debug_bss_1_0;
+static u8 unk_debug_bss_1_1;
+static u8 unk_debug_bss_1_2;
+static u8 unk_debug_bss_1_3;
+static u8 unk_debug_bss_1_4;
+static u32 unk_debug_bss_1_8;
+#endif
+
static const struct UnkStruct1 *const gUnknown_083ED048[];
static const u16 gPalette_83EDE24[];
static const u8 gUnknown_083ECD04[][3];
@@ -231,10 +340,22 @@ static const u16 gUnknown_083ECE48[];
void PlaySlotMachine(u8 arg0, MainCallback cb)
{
+#if DEBUG
+ unk_debug_bss_1_1 = 0;
+#endif
PlaySlotMachine_Internal(arg0, cb);
SetMainCallback2(CB2_SlotMachineSetup);
}
+#if DEBUG
+void debug_sub_811609C(u8 a, void (*func)(void))
+{
+ unk_debug_bss_1_1 = 1;
+ PlaySlotMachine_Internal(a, func);
+ SetMainCallback2(CB2_SlotMachineSetup);
+}
+#endif
+
static void CB2_SlotMachineSetup(void)
{
switch (gMain.state)
@@ -396,6 +517,11 @@ static void SlotMachineSetup_0_1(void)
eSlotMachine->unk1C[i] = 0x1f8 - eSlotMachine->reelPositions[i] * 24;
eSlotMachine->unk1C[i] %= 0x1f8;
}
+#if DEBUG
+ debug_sub_811B5D0();
+ if (unk_debug_bss_1_1 != 0)
+ eSlotMachine->coins = 1000;
+#endif
}
static void SlotMachineSetup_3_0(void)
@@ -441,7 +567,8 @@ static void sub_8101D04(void)
sub_8101D24(CreateTask(sub_8101D24, 0));
}
-static bool8 (*const gUnknown_083ECAAC[])(struct Task *task) = {
+static bool8 (*const gUnknown_083ECAAC[])(struct Task *task) =
+{
sub_8101D5C,
sub_8101D8C,
sub_8101DB0,
@@ -470,12 +597,16 @@ static bool8 (*const gUnknown_083ECAAC[])(struct Task *task) = {
sub_81023E0,
sub_81023FC,
sub_8102424,
- sub_8102460
+ sub_8102460,
+#if DEBUG
+ debug_sub_8116E74,
+#endif
};
static void sub_8101D24(u8 taskId)
{
- while (gUnknown_083ECAAC[eSlotMachine->state](gTasks + taskId));
+ while (gUnknown_083ECAAC[eSlotMachine->state](gTasks + taskId))
+ ;
}
static bool8 sub_8101D5C(struct Task *task)
@@ -489,9 +620,7 @@ static bool8 sub_8101D5C(struct Task *task)
static bool8 sub_8101D8C(struct Task *task)
{
if (!gPaletteFade.active)
- {
eSlotMachine->state++;
- }
return FALSE;
}
@@ -517,9 +646,7 @@ static bool8 sub_8101DB0(struct Task *task)
static bool8 sub_8101DF4(struct Task *task)
{
if (sub_8104E18())
- {
eSlotMachine->state = 4;
- }
return FALSE;
}
@@ -527,10 +654,12 @@ static bool8 sub_8101E10(struct Task *task)
{
sub_8104CAC(0);
eSlotMachine->state = 5;
- if (eSlotMachine->coins >= 9999)
- {
+ if (
+#if DEBUG
+ (unk_debug_bss_1_1 == 0 || unk_debug_bss_1_4 == 0) &&
+#endif
+ eSlotMachine->coins >= 9999)
eSlotMachine->state = 23;
- }
return TRUE;
}
@@ -538,6 +667,32 @@ static bool8 sub_8101E3C(struct Task *task)
{
s16 i;
+#if DEBUG
+ if (unk_debug_bss_1_1 != 0 && unk_debug_bss_1_4 != 0)
+ {
+ if (eSlotMachine->coins <= 3 || (gMain.heldKeys & B_BUTTON))
+ {
+ unk_debug_bss_1_4 = 0;
+ }
+ else
+ {
+ sub_8103D50(0);
+ sub_8103D50(1);
+ sub_8103D50(2);
+ eSlotMachine->coins -= 3;
+ eSlotMachine->bet = 3;
+ eSlotMachine->state = 9;
+ return 0;
+ }
+ }
+ if (unk_debug_bss_1_1 != 0 && (gMain.newKeys & 8))
+ {
+ debug_sub_811B620();
+ eSlotMachine->state = 29;
+ return 0;
+ }
+#endif
+
if (gMain.newKeys & SELECT_BUTTON)
{
sub_8104AB8(0);
@@ -548,9 +703,7 @@ static bool8 sub_8101E3C(struct Task *task)
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;
@@ -571,13 +724,9 @@ static bool8 sub_8101E3C(struct Task *task)
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;
}
@@ -608,9 +757,7 @@ static bool8 sub_8101F60(struct Task *task)
static bool8 sub_8101F88(struct Task *task)
{
if (sub_8104AEC())
- {
eSlotMachine->state = 5;
- }
return FALSE;
}
@@ -634,9 +781,11 @@ static bool8 sub_8101FA4(struct Task *task)
}
eSlotMachine->unk1A = 8;
if (eSlotMachine->unk0A)
- {
eSlotMachine->unk1A = dp15_jump_random_unknown();
- }
+#if DEBUG
+ if (unk_debug_bss_1_1 != 0)
+ debug_sub_811B5B4(&eSlotMachine->unk68, 1);
+#endif
return FALSE;
}
@@ -655,6 +804,10 @@ static bool8 sub_8102034(struct Task *task)
{
if (++task->data[0] >= 30)
{
+#if DEBUG
+ if (unk_debug_bss_1_1 != 0 && unk_debug_bss_1_4 != 0)
+ unk_debug_bss_1_8 = (Random() & 0x1F) + 1;
+#endif
sub_81024F0();
eSlotMachine->state = 12;
}
@@ -663,6 +816,22 @@ static bool8 sub_8102034(struct Task *task)
static bool8 sub_8102058(struct Task *task)
{
+#if DEBUG
+ if (unk_debug_bss_1_1 != 0 && unk_debug_bss_1_4 != 0)
+ {
+ unk_debug_bss_1_8--;
+ if (unk_debug_bss_1_8 == 0)
+ {
+ PlaySE(0x18);
+ sub_8102E1C(eSlotMachine->unk18);
+ sub_8103C14(eSlotMachine->unk18);
+ unk_debug_bss_1_8 = (Random() & 0x1F) + 1;
+ eSlotMachine->state = 13;
+ }
+ return FALSE;
+ }
+#endif
+
if (gMain.newKeys & A_BUTTON)
{
PlaySE(SE_JYUNI);
@@ -682,13 +851,53 @@ static bool8 sub_8102090(struct Task *task)
if (eSlotMachine->unk18 > 2)
{
eSlotMachine->state = 14;
+#if DEBUG
+ switch (unk_debug_bss_1_0)
+ {
+ case 2:
+ eSlotMachine->reelPositions[0] = 20;
+ eSlotMachine->reelPositions[1] = 20;
+ eSlotMachine->reelPositions[2] = 18;
+ break;
+ case 1:
+ eSlotMachine->reelPositions[0] = 20;
+ eSlotMachine->reelPositions[1] = 20;
+ eSlotMachine->reelPositions[2] = 18;
+ break;
+ case 4:
+ eSlotMachine->reelPositions[0] = 3;
+ eSlotMachine->reelPositions[1] = 1;
+ eSlotMachine->reelPositions[2] = 2;
+ break;
+ case 8:
+ eSlotMachine->reelPositions[0] = 0;
+ eSlotMachine->reelPositions[1] = 2;
+ eSlotMachine->reelPositions[2] = 3;
+ break;
+ case 0x10:
+ eSlotMachine->reelPositions[0] = 2;
+ eSlotMachine->reelPositions[1] = 5;
+ eSlotMachine->reelPositions[2] = 20;
+ break;
+ case 0x40:
+ eSlotMachine->reelPositions[0] = 19;
+ eSlotMachine->reelPositions[1] = 19;
+ eSlotMachine->reelPositions[2] = 0;
+ break;
+ case 0x80:
+ eSlotMachine->reelPositions[0] = 19;
+ eSlotMachine->reelPositions[1] = 19;
+ eSlotMachine->reelPositions[2] = 19;
+ break;
+ }
+#endif
}
return TRUE;
}
return FALSE;
}
-static bool8 sub_81020C8(struct Task *task)
+bool8 sub_81020C8(struct Task *task)
{
eSlotMachine->unk04 &= 0xc0;
CheckMatch();
@@ -697,8 +906,18 @@ static bool8 sub_81020C8(struct Task *task)
eSlotMachine->unk0A--;
eSlotMachine->unk0B++;
}
+#if DEBUG
+ else
+ {
+ debug_sub_811B894();
+ }
+#endif
+
if (eSlotMachine->matchedSymbols)
{
+#if DEBUG
+ debug_sub_811B5B4(&eSlotMachine->unk6C, eSlotMachine->payout);
+#endif
eSlotMachine->state = 15;
sub_8102A24();
sub_8103F70();
@@ -730,9 +949,7 @@ static bool8 sub_81020C8(struct Task *task)
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)
@@ -746,9 +963,7 @@ static bool8 sub_81020C8(struct Task *task)
sub_8104CAC(3);
eSlotMachine->state = 20;
if ((eSlotMachine->unk10 += eSlotMachine->bet) > 9999)
- {
eSlotMachine->unk10 = 9999;
- }
}
return FALSE;
}
@@ -756,9 +971,7 @@ static bool8 sub_81020C8(struct Task *task)
static bool8 sub_81021E0(struct Task *task)
{
if (sub_8102A44())
- {
eSlotMachine->state = 16;
- }
return FALSE;
}
@@ -768,18 +981,14 @@ static bool8 sub_81021FC(struct Task *task)
{
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);
@@ -904,7 +1113,12 @@ static bool8 sub_81023FC(struct Task *task)
static bool8 sub_8102424(struct Task *task)
{
+#if DEBUG
+ if (unk_debug_bss_1_1 == 0)
+ gSaveBlock1.coins = eSlotMachine->coins;
+#else
gSaveBlock1.coins = eSlotMachine->coins;
+#endif
BeginNormalPaletteFade(-1, 0, 0, 16, 0);
eSlotMachine->state++;
return FALSE;
@@ -919,6 +1133,92 @@ static bool8 sub_8102460(struct Task *task)
return FALSE;
}
+#if DEBUG
+
+static bool8 debug_sub_8116E74(struct Task *task)
+{
+ if (debug_sub_811B634() != 0)
+ eSlotMachine->state = 5;
+ return FALSE;
+}
+
+#endif
+
+static void sub_8102484(void)
+{
+ u8 r3;
+
+ if (eSlotMachine->unk0A == 0)
+ {
+#if DEBUG
+ if (unk_debug_bss_1_1 != 0 && unk_debug_bss_1_2 != 0)
+ {
+ eSlotMachine->unk04 = unk_debug_bss_1_3;
+ unk_debug_bss_1_2 = 0;
+ unk_debug_bss_1_3 = 0;
+ if (eSlotMachine->unk04 & 0x80)
+ debug_sub_811B5B4(&eSlotMachine->unk88, 1);
+ if (eSlotMachine->unk04 & 0x40)
+ debug_sub_811B5B4(&eSlotMachine->unk84, 1);
+ if (eSlotMachine->unk04 & 0x20)
+ debug_sub_811B5B4(&eSlotMachine->unk8C, 1);
+ if (eSlotMachine->unk04 & 0x10)
+ debug_sub_811B5B4(&eSlotMachine->unk80, 1);
+ if (eSlotMachine->unk04 & 8)
+ debug_sub_811B5B4(&eSlotMachine->unk7C, 1);
+ if (eSlotMachine->unk04 & 4)
+ debug_sub_811B5B4(&eSlotMachine->unk78, 1);
+ if (eSlotMachine->unk04 & 1)
+ debug_sub_811B5B4(&eSlotMachine->unk74, 1);
+ if (eSlotMachine->unk04 & 2)
+ debug_sub_811B5B4(&eSlotMachine->unk70, 1);
+ return;
+ }
+#endif
+ if (!(eSlotMachine->unk04 & 0xc0))
+ {
+ if (sub_8102540())
+ {
+ r3 = sub_8102578();
+ if (r3 != 3)
+ {
+ eSlotMachine->unk04 |= gUnknown_083ECE42[r3];
+#if DEBUG
+ if (eSlotMachine->unk04 & 0x80)
+ debug_sub_811B5B4(&eSlotMachine->unk88, 1);
+ if (eSlotMachine->unk04 & 0x40)
+ debug_sub_811B5B4(&eSlotMachine->unk84, 1);
+ if (eSlotMachine->unk04 & 0x20)
+ debug_sub_811B5B4(&eSlotMachine->unk8C, 1);
+#endif
+ if (r3 != 1)
+ {
+ return;
+ }
+ }
+ }
+ r3 = sub_81025BC();
+ if (r3 != 5)
+ {
+ eSlotMachine->unk04 |= gUnknown_083ECE48[r3];
+#if DEBUG
+ if (eSlotMachine->unk04 & 0x10)
+ debug_sub_811B5B4(&eSlotMachine->unk80, 1);
+ if (eSlotMachine->unk04 & 8)
+ debug_sub_811B5B4(&eSlotMachine->unk7C, 1);
+ if (eSlotMachine->unk04 & 4)
+ debug_sub_811B5B4(&eSlotMachine->unk78, 1);
+ if (eSlotMachine->unk04 & 1)
+ debug_sub_811B5B4(&eSlotMachine->unk74, 1);
+ if (eSlotMachine->unk04 & 2)
+ debug_sub_811B5B4(&eSlotMachine->unk70, 1);
+#endif
+ }
+ }
+ }
+}
+
+/*
static void sub_8102484(void)
{
u8 r3;
@@ -944,14 +1244,13 @@ static void sub_8102484(void)
}
}
}
+*/
static void sub_81024F0(void)
{
eSlotMachine->unk06 = 0;
if (eSlotMachine->unk04)
- {
eSlotMachine->unk06 = 1;
- }
}
static u8 sub_810250C(u8 a0)
@@ -961,9 +1260,7 @@ static u8 sub_810250C(u8 a0)
for (i = 0; i < 8; i++)
{
if (a0 & 1)
- {
return gUnknown_083ECE3A[i];
- }
a0 >>= 1;
}
return 0;
@@ -973,9 +1270,7 @@ static bool8 sub_8102540(void)
{
u8 rval = Random();
if (gUnknown_083ECD04[eSlotMachine->unk01][eSlotMachine->bet - 1] > rval)
- {
return TRUE;
- }
return FALSE;
}
@@ -990,9 +1285,7 @@ static u8 sub_8102578(void)
s16 rval = Random() & 0xff;
s16 value = gUnknown_083ECD16[i][eSlotMachine->unk01];
if (value > rval)
- {
break;
- }
}
return i;
}
@@ -1011,22 +1304,16 @@ static u8 sub_81025BC(void)
{
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;
}
@@ -1037,10 +1324,9 @@ 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];
+ else
+ return gUnknown_083ECDAC[a0][eSlotMachine->pikaPower];
}
static void sub_8102680(void)
@@ -1051,16 +1337,12 @@ static void sub_8102680(void)
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;
}
@@ -1071,10 +1353,9 @@ static bool8 sub_81026DC(u16 a0)
{
u16 rval = Random() & 0xff;
if (rval < gUnknown_083ECE12[a0])
- {
return TRUE;
- }
- return FALSE;
+ else
+ return FALSE;
}
static const u16 gUnknown_083ECE1C[][2];
@@ -1086,33 +1367,21 @@ static u16 dp15_jump_random_unknown(void)
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;
}
@@ -1121,13 +1390,9 @@ 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[];
@@ -1160,9 +1425,7 @@ static void CheckMatch_TopAndBottom(void)
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);
@@ -1174,9 +1437,7 @@ static void CheckMatch_TopAndBottom(void)
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);
@@ -1220,21 +1481,13 @@ 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;
}
@@ -1246,13 +1499,13 @@ static void sub_8102A24(void)
static bool8 sub_8102A44(void)
{
if (FindTaskIdByFunc(sub_8102A64) == 0xff)
- {
return TRUE;
- }
- return FALSE;
+ else
+ return FALSE;
}
-static bool8 (*const gUnknown_083ECB20[])(struct Task *task) = {
+static bool8 (*const gUnknown_083ECB20[])(struct Task *task) =
+{
sub_8102A9C,
sub_8102AD0,
sub_8102B80
@@ -1260,7 +1513,8 @@ static bool8 (*const gUnknown_083ECB20[])(struct Task *task) = {
static void sub_8102A64(u8 taskId)
{
- while (gUnknown_083ECB20[gTasks[taskId].data[0]](gTasks + taskId));
+ while (gUnknown_083ECB20[gTasks[taskId].data[0]](gTasks + taskId))
+ ;
}
static bool8 sub_8102A9C(struct Task *task)
@@ -1282,43 +1536,31 @@ 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;
}
@@ -1328,9 +1570,7 @@ static u8 GetTagOfReelSymbolOnScreenAtPos(u8 x, s16 y)
{
s16 offset = (eSlotMachine->reelPositions[x] + y) % 21;
if (offset < 0)
- {
offset += 21;
- }
return sReelSymbols[x][offset];
}
@@ -1420,7 +1660,8 @@ static bool8 sub_8102E40(u8 a0)
return gTasks[eSlotMachine->reelTasks[a0]].data[14];
}
-static bool8 (*const gUnknown_083ECB2C[])(struct Task *task) = {
+static bool8 (*const gUnknown_083ECB2C[])(struct Task *task) =
+{
sub_8102EA0,
sub_8102EA4,
sub_8102EC0,
@@ -1430,7 +1671,8 @@ static bool8 (*const gUnknown_083ECB2C[])(struct Task *task) = {
static void sub_8102E68(u8 taskId)
{
- while (gUnknown_083ECB2C[gTasks[taskId].data[0]](gTasks + taskId));
+ while (gUnknown_083ECB2C[gTasks[taskId].data[0]](gTasks + taskId))
+ ;
}
static bool8 sub_8102EA0(struct Task *task)
@@ -1444,12 +1686,15 @@ static bool8 sub_8102EA4(struct Task *task)
return FALSE;
}
-static bool8 (*const gUnknown_083ECB40[])(void) = {
+static bool8 (*const gUnknown_083ECB40[])(void) =
+{
sub_810305C,
sub_81032C0,
sub_81033DC
};
-static void (*const gUnknown_083ECB4C[])(void) = {
+
+static void (*const gUnknown_083ECB4C[])(void) =
+{
sub_81034F4,
sub_8103540,
sub_810380C
@@ -1474,9 +1719,7 @@ 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]]--;
@@ -1498,9 +1741,7 @@ static bool8 sub_8103008(struct Task *task)
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;
@@ -1510,7 +1751,8 @@ static bool8 sub_8103008(struct Task *task)
return FALSE;
}
-static bool8 (*const gUnknown_083ECB64[])(u8 a0, u8 a1) = {
+static bool8 (*const gUnknown_083ECB64[])(u8 a0, u8 a1) =
+{
sub_8103154,
sub_81031B4,
sub_81031B4
@@ -1542,19 +1784,17 @@ static bool8 sub_81030A4(s16 y, u8 tag1, u8 tag2)
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;
+ else
+ return FALSE;
}
static bool8 sub_8103134(void)
{
if (eSlotMachine->unk04 & 0xc2)
- {
return TRUE;
- }
- return FALSE;
+ else
+ return FALSE;
}
static bool8 sub_8103154(u8 a0, u8 a1)
@@ -1617,7 +1857,8 @@ static bool8 sub_81031B4(u8 tag1, u8 tag2)
return FALSE;
}
-static bool8 (*const gUnknown_083ECB70[])(void) = {
+static bool8 (*const gUnknown_083ECB70[])(void) =
+{
sub_81032E8,
sub_81032E8,
sub_810333C
@@ -1679,7 +1920,8 @@ static bool8 sub_810333C(void)
return FALSE;
}
-static bool8 (*const gUnknown_083ECB7C[])(u8 a0) = {
+static bool8 (*const gUnknown_083ECB7C[])(u8 a0) =
+{
sub_810341C,
sub_810341C,
sub_810347C
@@ -1721,14 +1963,11 @@ 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;
- }
+ else
+ r8 = 1;
for (i = 0; i < 5; i++)
{
if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, r8 - i) == a0)
@@ -1743,8 +1982,10 @@ static bool8 sub_810347C(u8 a0)
static void sub_81034F4(void)
{
- s16 i;
- for (i = 0; sub_81030E0(i); i++);
+ s16 i = 0;
+
+ while (sub_81030E0(i) != 0)
+ i++;
eSlotMachine->unk2E[0] = i;
}
@@ -1763,7 +2004,8 @@ static bool8 sub_8103520(u8 *a0)
return FALSE;
}
-static void (*const gUnknown_083ECB88[])(void) = {
+static void (*const gUnknown_083ECB88[])(void) =
+{
sub_8103564,
j5_08111E84,
sub_8103668
@@ -1884,19 +2126,17 @@ static void sub_8103668(void)
static bool8 sub_8103764(u8 a0, u8 a1)
{
if ((a0 == 0 && a1 == 1) || (a0 == 1 && a1 == 0))
- {
return TRUE;
- }
- return FALSE;
+ else
+ 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;
+ else
+ return FALSE;
}
static bool8 sub_81037BC(u8 a0, u8 a1, u8 a2)
@@ -1912,7 +2152,8 @@ static bool8 sub_81037BC(u8 a0, u8 a1, u8 a2)
return TRUE;
}
-static void (*const gUnknown_083ECB94[])(void) = {
+static void (*const gUnknown_083ECB94[])(void) =
+{
sub_8103830,
sub_8103910,
sub_8103A78
@@ -1934,9 +2175,7 @@ static void sub_8103830(void)
{
u8 r0;
if (!(r5 == (r0 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 2 - i)) || (r5 == 0 && r0 == 1) || (r5 == 1 && r0 == 0)))
- {
break;
- }
i++;
}
}
@@ -1957,9 +2196,7 @@ static void sub_8103830(void)
while (1)
{
if (r5 != GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 2 - i))
- {
break;
- }
i++;
}
}
@@ -2006,9 +2243,7 @@ static void sub_8103910(void)
}
}
if (r8 == 0)
- {
break;
- }
sp0++;
}
eSlotMachine->unk2E[2] = sp0;
@@ -2070,7 +2305,8 @@ static void sub_8103C14(u8 a0)
sub_8103C48(taskId);
}
-static void (*const gUnknown_083ECBA0[])(struct Task *task, u8 taskId) = {
+static void (*const gUnknown_083ECBA0[])(struct Task *task, u8 taskId) =
+{
sub_8103C78,
sub_8103CAC,
sub_8103CC8
@@ -2122,18 +2358,14 @@ 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)
@@ -2163,7 +2395,7 @@ static bool8 sub_8103E38(void)
u8 i;
for (i = 0; i < 5; i++)
{
- struct Sprite *sprite = gSprites + eSlotMachine->unk44[i];
+ struct Sprite *sprite = &gSprites[eSlotMachine->unk44[i]];
if (sprite->data[1] && sprite->data[2])
return FALSE;
}
@@ -2250,9 +2482,7 @@ static void sub_8103FE8(u8 taskId)
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);
}
@@ -2284,7 +2514,8 @@ static bool8 sub_81040C8(void)
return gTasks[eSlotMachine->unk3E].data[15];
}
-static void (*const gUnknown_083ECBB4[])(struct Task *task) = {
+static void (*const gUnknown_083ECBB4[])(struct Task *task) =
+{
nullsub_68,
sub_810411C,
sub_8104144,
@@ -2298,7 +2529,6 @@ static void sub_81040E8(u8 taskId)
static void nullsub_68(struct Task *task)
{
-
}
static void sub_810411C(struct Task *task)
@@ -2307,10 +2537,11 @@ static void sub_810411C(struct Task *task)
task->data[0]++;
}
-static const u16 gUnknown_083ECBC4[][2] = {
+static const u16 gUnknown_083ECBC4[][2] =
+{
{0x9e, 0x6e},
{0x9f, 0x6f},
- {0xaf, 0x7f}
+ {0xaf, 0x7f},
};
static void sub_8104144(struct Task *task)
@@ -2402,7 +2633,8 @@ static bool8 sub_810432C(void)
return FALSE;
}
-static void (*const gUnknown_083ECBD0[])(struct Task *task) = {
+static void (*const gUnknown_083ECBD0[])(struct Task *task) =
+{
sub_810437C,
sub_81043EC,
sub_8104468,
@@ -2539,9 +2771,7 @@ static void sub_81045CC(struct Task *task)
if (eSlotMachine->unk05)
{
if (eSlotMachine->unk0A <= task->data[6])
- {
task->data[0]++;
- }
}
else if (task->data[6] > 3)
{
@@ -2608,9 +2838,7 @@ static void sub_81046C0(struct Task *task)
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)
@@ -2622,13 +2850,9 @@ static void sub_8104794(struct Task *task)
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)
@@ -2659,21 +2883,15 @@ static void sub_81047EC(struct Task *task)
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)
@@ -2769,10 +2987,12 @@ static bool8 sub_8104AEC(void)
{
if (FindTaskIdByFunc(sub_8104B0C) == 0xFF)
return TRUE;
- return FALSE;
+ else
+ return FALSE;
}
-static void (*const gUnknown_083ECC30[])(struct Task *task) = {
+static void (*const gUnknown_083ECC30[])(struct Task *task) =
+{
sub_8104B3C,
sub_8104B60,
sub_8104B80,
@@ -2798,9 +3018,7 @@ static void sub_8104B3C(struct Task *task)
static void sub_8104B60(struct Task *task)
{
if (!gPaletteFade.active)
- {
task->data[0]++;
- }
}
static void sub_8104B80(struct Task *task)
@@ -2847,14 +3065,13 @@ static void sub_8104C5C(void)
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) {
+static void sub_8104CAC(u8 arg0)
+{
u8 i;
struct Task *task;
@@ -2875,9 +3092,7 @@ static void sub_8104CAC(u8 arg0) {
#ifdef GERMAN
if (arg0 == 5 && i <= 2)
- {
gSprites[spriteId].invisible = TRUE;
- }
#endif
}
}
@@ -2929,8 +3144,9 @@ static bool8 sub_8104E18(void)
return TRUE;
}
-static void (*const gUnknown_083ECC54[])(struct Task *task) = {
- nullsub_69
+static void (*const gUnknown_083ECC54[])(struct Task *task) =
+{
+ nullsub_69,
};
static void sub_8104E74(u8 taskId)
@@ -2940,7 +3156,6 @@ static void sub_8104E74(u8 taskId)
static void nullsub_69(struct Task *task)
{
-
}
static const struct SpriteTemplate gSpriteTemplate_83ED414;
@@ -2976,14 +3191,11 @@ 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;
@@ -3046,9 +3258,7 @@ static void sub_8105170(struct Sprite *sprite)
{
sprite->pos2.y = sprite->pos2.x = 8;
if ((sprite->animCmdIndex != 0 && sprite->animDelayCounter != 0) || (sprite->animCmdIndex == 0 && sprite->animDelayCounter == 0))
- {
sprite->pos2.y = -8;
- }
}
}
@@ -3060,14 +3270,14 @@ static const struct SubspriteTable gSubspriteTables_83ED75C[];
static void sub_81051C0(void)
{
u8 spriteId = CreateSprite(&gSpriteTemplate_83ED474, 0x170, 0x34, 7);
- struct Sprite *sprite = gSprites + spriteId;
+ 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 = &gSprites[spriteId];
sprite->oam.priority = 1;
sprite->coordOffsetEnabled = TRUE;
SetSubspriteTables(sprite, gSubspriteTables_83ED75C);
@@ -3080,7 +3290,7 @@ 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;
+ struct Sprite *sprite = &gSprites[spriteId];
sprite->oam.priority = 1;
sprite->coordOffsetEnabled = TRUE;
SetSubspriteTables(sprite, gSubspriteTables_83ED78C);
@@ -3096,7 +3306,7 @@ static void sub_81052EC(void)
for (i = 0, r5 = 0; i < 3; i++, r5 += 20)
{
u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4BC, 0x170, 0x00, 10);
- struct Sprite *sprite = gSprites + spriteId;
+ struct Sprite *sprite = &gSprites[spriteId];
sprite->oam.priority = 1;
sprite->coordOffsetEnabled = TRUE;
sprite->data[7] = r5;
@@ -3118,14 +3328,14 @@ static const struct SubspriteTable gSubspriteTables_83ED7B4[];
static void sub_81053A0(void)
{
u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4D4, 0x170, 0x64, 9);
- struct Sprite *sprite = gSprites + spriteId;
+ 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 = &gSprites[spriteId];
sprite->coordOffsetEnabled = TRUE;
sprite->oam.priority = 1;
SetSubspriteTables(sprite, gSubspriteTables_83ED7B4);
@@ -3138,7 +3348,7 @@ static const struct SubspriteTable gSubspriteTables_83ED7D4[];
static void sub_810545C(void)
{
u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4EC, 0x170, 0x4c, 11);
- struct Sprite *sprite = gSprites + spriteId;
+ struct Sprite *sprite = &gSprites[spriteId];
sprite->coordOffsetEnabled = TRUE;
sprite->oam.priority = 1;
SetSubspriteTables(sprite, gSubspriteTables_83ED7D4);
@@ -3149,29 +3359,24 @@ static void sub_81054B8(void)
{
u8 i;
- DestroySprite(gSprites + eSlotMachine->unk40);
+ DestroySprite(&gSprites[eSlotMachine->unk40]);
for (i = 0; i < 2; i++)
- {
- DestroySprite(gSprites + eSlotMachine->unk49[i]);
- }
+ DestroySprite(&gSprites[eSlotMachine->unk49[i]]);
for (i = 0; i < 3; i++)
- {
- DestroySprite(gSprites + eSlotMachine->unk4B[i]);
- }
+ DestroySprite(&gSprites[eSlotMachine->unk4B[i]]);
}
static void sub_8105524(void)
{
u8 i;
+
for (i = 0; i < 2; i++)
- {
- DestroySprite(gSprites + eSlotMachine->unk4E[i]);
- }
+ DestroySprite(&gSprites[eSlotMachine->unk4E[i]]);
}
static void sub_8105554(void)
{
- DestroySprite(gSprites + eSlotMachine->unk42);
+ DestroySprite(&gSprites[eSlotMachine->unk42]);
}
static const struct SpriteTemplate gSpriteTemplate_83ED504;
@@ -3179,7 +3384,7 @@ static const struct SpriteTemplate gSpriteTemplate_83ED504;
static void sub_8105578(void)
{
u8 spriteId = CreateSprite(&gSpriteTemplate_83ED504, 0x98, 0x20, 5);
- struct Sprite *sprite = gSprites + spriteId;
+ struct Sprite *sprite = &gSprites[spriteId];
sprite->oam.priority = 1;
sprite->hFlip = TRUE;
eSlotMachine->unk50[0] = spriteId;
@@ -3189,7 +3394,7 @@ static void sub_8105578(void)
sprite->data[7] = 0x20;
spriteId = CreateSprite(&gSpriteTemplate_83ED504, 0xb8, 0x20, 5);
- sprite = gSprites + spriteId;
+ sprite = &gSprites[spriteId];
sprite->oam.priority = 1;
eSlotMachine->unk50[1] = spriteId;
sprite->data[1] = 1;
@@ -3230,9 +3435,7 @@ static void sub_81056C0(void)
u8 i;
for (i = 0; i < 2; i++)
- {
- DestroySprite(gSprites + eSlotMachine->unk50[i]);
- }
+ DestroySprite(&gSprites[eSlotMachine->unk50[i]]);
}
static const struct SpriteTemplate gSpriteTemplate_83ED51C;
@@ -3277,9 +3480,7 @@ 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]);
- }
+ DestroySprite(&gSprites[eSlotMachine->unk52[i]]);
}
static const struct SpriteTemplate gSpriteTemplate_83ED534;
@@ -3298,7 +3499,7 @@ static void sub_8105894(struct Sprite *sprite)
static void sub_81058A0(void)
{
- DestroySprite(gSprites + eSlotMachine->unk41);
+ DestroySprite(&gSprites[eSlotMachine->unk41]);
}
static const struct SpriteTemplate gSpriteTemplate_83ED54C;
@@ -3310,7 +3511,7 @@ static void sub_81058C4(void)
for (i = 0; i < 4; i++)
{
u8 spriteId = CreateSprite(&gSpriteTemplate_83ED54C, 0x50 - gSpriteCoordOffsetX, 0x44, 0);
- struct Sprite *sprite = gSprites + spriteId;
+ struct Sprite *sprite = &gSprites[spriteId];
sprite->oam.priority = 1;
sprite->coordOffsetEnabled = TRUE;
sprite->data[0] = sp[i];
@@ -3341,7 +3542,7 @@ static void sub_81059B8(void)
u8 i;
for (i = 0; i < 4; i++)
{
- DestroySprite(gSprites + eSlotMachine->unk54[i]);
+ DestroySprite(&gSprites[eSlotMachine->unk54[i]]);
}
}
@@ -3350,7 +3551,7 @@ static const struct SpriteTemplate gSpriteTemplate_83ED564;
static void sub_81059E8(void)
{
u8 spriteId = CreateSprite(&gSpriteTemplate_83ED564, 0xa8, 0x3c, 8);
- struct Sprite *sprite = gSprites + spriteId;
+ struct Sprite *sprite = &gSprites[spriteId];
sprite->oam.priority = 1;
sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE;
InitSpriteAffineAnim(sprite);
@@ -3391,7 +3592,7 @@ u8 sub_8105ACC(void)
static void sub_8105AEC(void)
{
- struct Sprite *sprite = gSprites + eSlotMachine->unk43;
+ struct Sprite *sprite = &gSprites[eSlotMachine->unk43];
FreeOamMatrix(sprite->oam.matrixNum);
DestroySprite(sprite);
}
@@ -3401,7 +3602,7 @@ 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;
+ struct Sprite *sprite = &gSprites[spriteId];
sprite->oam.priority = 2;
sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE;
InitSpriteAffineAnim(sprite);
@@ -3416,7 +3617,7 @@ static void sub_8105B70(struct Sprite *sprite)
static void sub_8105B88(u8 spriteId)
{
- struct Sprite *sprite = gSprites + spriteId;
+ struct Sprite *sprite = &gSprites[spriteId];
FreeOamMatrix(sprite->oam.matrixNum);
DestroySprite(sprite);
}
@@ -3435,7 +3636,7 @@ 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;
+ struct Sprite *sprite = &gSprites[spriteId];
sprite->oam.priority = 3;
sprite->callback = callback;
sprite->data[6] = a4;
@@ -3492,30 +3693,26 @@ 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;
+ 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;
}
}
@@ -3523,30 +3720,26 @@ 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;
+ 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;
}
}
@@ -3554,41 +3747,37 @@ static void sub_8105E08(struct Sprite *sprite)
{
switch (sprite->data[0])
{
- case 0:
- StartSpriteAnim(sprite, eSlotMachine->unk0A - 1);
+ case 0:
+ StartSpriteAnim(sprite, eSlotMachine->unk0A - 1);
+ sprite->data[0]++;
+ // fallthrough
+ case 1:
+ if (++sprite->data[1] >= 4)
+ {
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;
+ 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;
}
}
@@ -3596,39 +3785,39 @@ static void sub_8105EB4(struct Sprite *sprite)
{
switch (sprite->data[0])
{
- case 0:
- sprite->animPaused = TRUE;
+ 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]++;
- // 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)
+ }
+ 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->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[1] >>= 2;
- sprite->data[3] = 0;
- if (sprite->data[1] == 0)
- {
- sprite->data[0]++;
- sprite->data[7] = 0;
- sprite->animPaused = FALSE;
- }
+ sprite->data[0]++;
+ sprite->data[7] = 0;
+ sprite->animPaused = FALSE;
}
}
- sprite->data[2]++;
- sprite->data[2] &= 0x07;
- break;
+ }
+ sprite->data[2]++;
+ sprite->data[2] &= 0x07;
+ break;
}
}
@@ -3636,21 +3825,19 @@ 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;
+ 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;
}
}
@@ -3658,35 +3845,33 @@ 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;
- }
+ 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;
- 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;
+ }
+ 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;
}
}
@@ -3724,40 +3909,30 @@ static void sub_81060FC(struct Sprite *sprite)
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]];
+ 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]++;
- // 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;
+ 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;
}
}
@@ -3772,10 +3947,8 @@ static void sub_81061C8(struct Sprite *sprite)
}
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])
- {
+ if (sprite->data[1] != 0)
sprite->data[1]--;
- }
}
static void sub_8106230(struct Sprite *sprite)
@@ -3794,13 +3967,9 @@ static void sub_8106230(struct Sprite *sprite)
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)
{
@@ -3810,9 +3979,7 @@ static void sub_8106230(struct Sprite *sprite)
break;
case 2:
if (eSlotMachine->bet == 0)
- {
break;
- }
sub_8104D30(5, SpriteCallbackDummy, 0xd0, 0x74, 0);
eSlotMachine->win0h = 0xc0e0;
eSlotMachine->win0v = 0x6880;
@@ -3825,13 +3992,9 @@ static void sub_8106230(struct Sprite *sprite)
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)
{
@@ -3844,7 +4007,6 @@ static void sub_8106230(struct Sprite *sprite)
static void nullsub_70(void)
{
-
}
static void sub_8106364(void)
@@ -3893,14 +4055,13 @@ static void sub_8106404(void)
{
u8 j;
for (j = 0; j < 0x20; j++, dest++)
- {
*dest = src[j];
- }
}
LoadSpriteSheet(sheet);
}
-static void sub_8106448(void) {
+static void sub_8106448(void)
+{
LZDecompressWram(gSlotMachine_Gfx, eSlotMachineGfxBuffer);
DmaCopyLarge16(3, eSlotMachineGfxBuffer, BG_VRAM, SLOTMACHINE_GFX_TILES * 32, 0x1000);
@@ -3909,12 +4070,14 @@ static void sub_8106448(void) {
LoadPalette(gPalette_83EDE24, 208, 32);
}
-static void sub_81064B8(void) {
+static void sub_81064B8(void)
+{
CpuCopy16(gUnknown_08E95AB8, BG_SCREEN_ADDR(29), 20 * 32 * 2);
LoadSlotMachineWheelOverlay();
}
-static void LoadSlotMachineWheelOverlay(void) {
+static void LoadSlotMachineWheelOverlay(void)
+{
s16 x, y, dx;
u16 *screen;
@@ -3934,13 +4097,12 @@ static void LoadSlotMachineWheelOverlay(void) {
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) {
+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;
@@ -3949,7 +4111,8 @@ static void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4) {
vram[16 * 32 + 1 + arg0] = arg4;
}
-static void sub_81065DC(void) {
+static void sub_81065DC(void)
+{
s16 y, x;
u16 *screen;
@@ -3959,13 +4122,12 @@ static void sub_81065DC(void) {
for (y = 0; y < 20; y++)
{
for (x = 0; x < 30; x++)
- {
screen[x + y * 32] = 0;
- }
}
}
-static const u8 sReelSymbols[][21] = {
+static const u8 sReelSymbols[][21] =
+{
{
SLOT_MACHINE_TAG_7_RED,
SLOT_MACHINE_TAG_CHERRY,
@@ -3988,7 +4150,8 @@ static const u8 sReelSymbols[][21] = {
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,
@@ -4010,7 +4173,8 @@ static const u8 sReelSymbols[][21] = {
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,
@@ -4032,7 +4196,7 @@ static const u8 sReelSymbols[][21] = {
SLOT_MACHINE_TAG_REPLAY,
SLOT_MACHINE_TAG_LOTAD,
SLOT_MACHINE_TAG_CHERRY
- }
+ },
};
static const u8 gUnknown_083ECCF1[] = {
@@ -5394,3 +5558,390 @@ static const struct SpritePalette gSlotMachineSpritePalettes[] = {
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");
+
+#if DEBUG
+
+static void debug_sub_811B1C4(void)
+{
+ unk_debug_bss_1_3 |= 2;
+ unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 2) ? 0 : 2;
+}
+
+static void debug_sub_811B1EC(void)
+{
+ unk_debug_bss_1_3 |= 1;
+ unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 1) ? 0 : 1;
+}
+
+static void debug_sub_811B210(void)
+{
+ unk_debug_bss_1_3 |= 4;
+ unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 4) ? 0 : 4;
+}
+
+static void debug_sub_811B238(void)
+{
+ unk_debug_bss_1_3 |= 8;
+ unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 8) ? 0 : 8;
+}
+
+static void debug_sub_811B260(void)
+{
+ unk_debug_bss_1_3 |= 0x10;
+ unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 0x10) ? 0 : 0x10;
+}
+
+static void debug_sub_811B288(void)
+{
+ unk_debug_bss_1_3 |= 0x40;
+ unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 0x40) ? 0 : 0x40;
+}
+
+static void debug_sub_811B2B0(void)
+{
+ unk_debug_bss_1_3 |= 0x80;
+ unk_debug_bss_1_0 = (unk_debug_bss_1_0 == 0x80) ? 0 : 0x80;
+}
+
+static void debug_sub_811B2D8(void)
+{
+ unk_debug_bss_1_3 |= 0x20;
+}
+
+static void debug_sub_811B2E8(void)
+{
+ u8 text[2];
+
+ ConvertIntToDecimalStringN(text, eSlotMachine->unk01 + 1, 2, 1);
+ Menu_PrintText(text, 6, 1);
+}
+
+static const u8 Str_841B1C4[] = _("SETTEI");
+static const u8 Str_841B1CB[] = _("MAWASITA");
+static const u8 Str_841B1D4[] = _("MODOSI");
+static const u8 Str_841B1DB[] = _("NOMARE");
+static const u8 Str_841B1E2[] = _("MAE 7");
+static const u8 Str_841B1E8[] = _("LR  HENKOU");
+static const u8 Str_841B1F3[] = _("START  JIDOUSU");
+static const u8 Str_841B202[] = _("SELECT  SETTEI");
+static const u8 Str_841B211[] = _("TYUHSEN");
+static const u8 Str_841B219[] = _("CHERRY");
+static const u8 Str_841B220[] = _("REPLAY");
+static const u8 Str_841B227[] = _("HASUBO");
+static const u8 Str_841B22E[] = _("RURIRI");
+static const u8 Str_841B235[] = _("INAZU");
+static const u8 Str_841B23B[] = _("REG");
+static const u8 Str_841B23F[] = _("BIG");
+static const u8 Str_841B243[] = _("BD");
+static const u8 Str_841B246[] = _("R7");
+static const u8 Str_841B249[] = _("B7");
+static const u8 Str_841B24C[] = _("A  COIN");
+static const u8 Str_841B254[] = _("TYUHSEN");
+static const u8 Str_841B25C[] = _("UD  100");
+static const u8 Str_841B264[] = _("LR  1000");
+static const u8 Str_841B26D[] = _("×");
+
+void debug_sub_811B310(void)
+{
+ u8 text[5];
+
+ Menu_PrintText(Str_841B1C4, 1, 1);
+ Menu_PrintText(Str_841B1CB, 1, 3);
+ Menu_PrintText(Str_841B1D4, 1, 5);
+ Menu_PrintText(Str_841B1DB, 1, 7);
+ Menu_PrintText(Str_841B1E2, 1, 9);
+ Menu_PrintText(Str_841B1E8, 1, 11);
+ Menu_PrintText(Str_841B1F3, 1, 13);
+ Menu_PrintText(Str_841B202, 1, 15);
+ Menu_PrintText(Str_841B24C, 1, 17);
+ Menu_PrintText(Str_841B211, 15, 1);
+ Menu_PrintText(Str_841B219, 15, 3);
+ Menu_PrintText(Str_841B220, 15, 5);
+ Menu_PrintText(Str_841B227, 15, 7);
+ Menu_PrintText(Str_841B22E, 15, 9);
+ Menu_PrintText(Str_841B235, 15, 11);
+ Menu_PrintText(Str_841B23B, 15, 13);
+ Menu_PrintText(Str_841B23F, 15, 15);
+ Menu_PrintText(Str_841B243, 15, 17);
+ if (eSlotMachine->unk03 == 0)
+ Menu_PrintText(Str_841B246, 10, 9);
+ else
+ Menu_PrintText(Str_841B249, 10, 9);
+
+#define PRINT_NUMBER(n, x, y) \
+ ConvertIntToDecimalStringN(text, n, 2, 4); \
+ Menu_PrintText(text, x, y);
+
+ PRINT_NUMBER(eSlotMachine->unk68, 10, 3);
+ PRINT_NUMBER(eSlotMachine->unk6C, 10, 5);
+ PRINT_NUMBER(eSlotMachine->unk10, 10, 7);
+ PRINT_NUMBER(eSlotMachine->unk70, 20, 3);
+ PRINT_NUMBER(eSlotMachine->unk74, 20, 5);
+ PRINT_NUMBER(eSlotMachine->unk78, 20, 7);
+ PRINT_NUMBER(eSlotMachine->unk7C, 20, 9);
+ PRINT_NUMBER(eSlotMachine->unk80, 20, 11);
+ PRINT_NUMBER(eSlotMachine->unk84, 20, 13);
+ PRINT_NUMBER(eSlotMachine->unk88, 20, 15);
+ PRINT_NUMBER(eSlotMachine->unk8C, 20, 17);
+
+#undef PRINT_NUMBER
+
+ if (unk_debug_bss_1_0 != 0)
+ {
+ u8 y = 0;
+
+ switch (unk_debug_bss_1_0)
+ {
+ case 2:
+ y = 3;
+ break;
+ case 1:
+ y = 5;
+ break;
+ case 4:
+ y = 7;
+ break;
+ case 8:
+ y = 9;
+ break;
+ case 16:
+ y = 11;
+ break;
+ case 64:
+ y = 13;
+ break;
+ case 128:
+ y = 15;
+ break;
+ }
+ Menu_PrintText(Str_841B26D, 23, y);
+ }
+ debug_sub_811B2E8();
+}
+
+static void debug_sub_811B5B4(s32 *a, s32 b)
+{
+ *a += b;
+ if (*a > 9999)
+ *a = 9999;
+}
+
+static void debug_sub_811B5D0(void)
+{
+ unk_debug_bss_1_0 = 0;
+ unk_debug_bss_1_2 = 0;
+ unk_debug_bss_1_3 = 0;
+ unk_debug_bss_1_4 = 0;
+ eSlotMachine->unk68 = 0;
+ eSlotMachine->unk6C = 0;
+ eSlotMachine->unk70 = 0;
+ eSlotMachine->unk74 = 0;
+ eSlotMachine->unk78 = 0;
+ eSlotMachine->unk7C = 0;
+ eSlotMachine->unk80 = 0;
+ eSlotMachine->unk84 = 0;
+ eSlotMachine->unk88 = 0;
+ eSlotMachine->unk8C = 0;
+ eSlotMachine->unk90 = 0;
+}
+
+static void debug_sub_811B620(void)
+{
+ CreateTask(debug_sub_811B654, 0);
+}
+
+static u8 debug_sub_811B634(void)
+{
+ if (FindTaskIdByFunc(debug_sub_811B654) == 0xFF)
+ return 1;
+ else
+ return 0;
+}
+
+static const struct {const u8 *text; void (*func)();} _841B270[] =
+{
+ {Str_841B219, debug_sub_811B1C4},
+ {Str_841B220, debug_sub_811B1EC},
+ {Str_841B227, debug_sub_811B210},
+ {Str_841B22E, debug_sub_811B238},
+ {Str_841B235, debug_sub_811B260},
+ {Str_841B23B, debug_sub_811B288},
+ {Str_841B23F, debug_sub_811B2B0},
+ {Str_841B243, debug_sub_811B2D8},
+};
+
+static void debug_sub_811B654(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ s8 selection;
+
+ switch (task->data[0])
+ {
+ case 0:
+ Menu_DrawStdWindowFrame(0, 0, 24, 19);
+ debug_sub_811B310();
+ task->data[0]++;
+ break;
+ case 1:
+ if (gMain.newKeys & B_BUTTON)
+ {
+ Menu_EraseScreen();
+ DestroyTask(taskId);
+ break;
+ }
+ if (gMain.newKeys & 0x20)
+ {
+ eSlotMachine->unk01--;
+ if ((s8)eSlotMachine->unk01 < 0) // Why? It's unsigned
+ eSlotMachine->unk01 = 5;
+ debug_sub_811B2E8();
+ break;
+ }
+ if (gMain.newKeys & 0x10)
+ {
+ eSlotMachine->unk01++;
+ if (eSlotMachine->unk01 > 5)
+ eSlotMachine->unk01 = 0;
+ debug_sub_811B2E8();
+ break;
+ }
+ if (gMain.newKeys & A_BUTTON)
+ {
+ task->data[0] = 3;
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 9, 5);
+ Menu_PrintText(Str_841B25C, 1, 1);
+ Menu_PrintText(Str_841B264, 1, 3);
+ break;
+ }
+ if (gMain.newKeys & 4)
+ {
+ unk_debug_bss_1_2 = 0;
+ unk_debug_bss_1_3 = 0;
+ Menu_EraseScreen();
+ Menu_DrawStdWindowFrame(0, 0, 10, 19);
+ Menu_PrintText(Str_841B254, 1, 1);
+ Menu_PrintItems(2, 3, 8, (void *)_841B270);
+ InitMenu(0, 1, 3, 8, 0, 9);
+ task->data[0]++;
+ }
+ if (gMain.newKeys & 8)
+ {
+ unk_debug_bss_1_4 = 1;
+ Menu_EraseScreen();
+ DestroyTask(taskId);
+ }
+ break;
+ case 2:
+ selection = Menu_ProcessInput();
+ if (selection == -2)
+ break;
+ if (selection != -1)
+ {
+ unk_debug_bss_1_2 = 1;
+ _841B270[selection].func();
+ }
+ Menu_EraseScreen();
+ DestroyTask(taskId);
+ break;
+ case 3:
+ if (gMain.newAndRepeatedKeys & 0x80)
+ {
+ eSlotMachine->coins += 100;
+ if (eSlotMachine->coins > 9999)
+ eSlotMachine->coins = 9999;
+ break;
+ }
+ if (gMain.newAndRepeatedKeys & 0x40)
+ {
+ eSlotMachine->coins -= 100;
+ if (eSlotMachine->coins <= 0)
+ eSlotMachine->coins = 9999;
+ break;
+ }
+ if (gMain.newAndRepeatedKeys & 0x20)
+ {
+ eSlotMachine->coins -= 1000;
+ if (eSlotMachine->coins <= 0)
+ eSlotMachine->coins = 9999;
+ break;
+ }
+ if (gMain.newAndRepeatedKeys & 0x10)
+ {
+ eSlotMachine->coins += 1000;
+ if (eSlotMachine->coins > 9999)
+ eSlotMachine->coins = 9999;
+ break;
+ }
+ if (gMain.newKeys & B_BUTTON)
+ {
+ Menu_EraseScreen();
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+static const u8 Str_841B2B0[] = _("·カウントエラーがおきました");
+static const u8 Str_841B2BF[] = _("·リールそうさで エラーが おきました");
+static const u8 Str_841B2D3[] = _("·フラグオフエラーが おきました");
+static const u8 Str_841B2E4[] = _("·ボーナスこやくの エラーが おきました");
+
+static void debug_sub_811B894(void)
+{
+ if (eSlotMachine->matchedSymbols & 0x180)
+ {
+ eSlotMachine->unk90++;
+ if (eSlotMachine->unk90 > 9999)
+ eSlotMachine->unk90 = 9999;
+ if (eSlotMachine->unk90 != eSlotMachine->unk88)
+ {
+ Menu_PrintText(Str_841B2B0, 4, 15);
+ unk_debug_bss_1_4 = 0;
+ }
+ if (!(eSlotMachine->unk04 & 0x80))
+ {
+ Menu_PrintText(Str_841B2D3, 4, 17);
+ unk_debug_bss_1_4 = 0;
+ }
+ }
+ else if (eSlotMachine->matchedSymbols != 0)
+ {
+ if ((eSlotMachine->unk04 & 0x80) && !(eSlotMachine->matchedSymbols & 3))
+ {
+ Menu_PrintText(Str_841B2E4, 4, 2);
+ unk_debug_bss_1_4 = 0;
+ }
+ }
+ if (eSlotMachine->matchedSymbols == 0 && eSlotMachine->bet == 3 && !(eSlotMachine->unk04 & 0x80))
+ {
+ u8 sym_0_1 = GetTagOfReelSymbolOnScreenAtPos(0, 1);
+ u8 sym_0_2 = GetTagOfReelSymbolOnScreenAtPos(0, 2);
+ u8 sym_0_3 = GetTagOfReelSymbolOnScreenAtPos(0, 3);
+
+ u8 sym_1_1 = GetTagOfReelSymbolOnScreenAtPos(1, 1);
+ u8 sym_1_2 = GetTagOfReelSymbolOnScreenAtPos(1, 2);
+ u8 sym_1_3 = GetTagOfReelSymbolOnScreenAtPos(1, 3);
+
+ u8 sym_2_1 = GetTagOfReelSymbolOnScreenAtPos(2, 1);
+ u8 sym_2_2 = GetTagOfReelSymbolOnScreenAtPos(2, 2);
+ u8 sym_2_3 = GetTagOfReelSymbolOnScreenAtPos(2, 3);
+
+ if ((sym_0_1 == 0 && sym_1_1 == 1 && sym_2_1 == 0)
+ || (sym_0_2 == 0 && sym_1_2 == 1 && sym_2_2 == 0)
+ || (sym_0_3 == 0 && sym_1_3 == 1 && sym_2_3 == 0)
+ || (sym_0_1 == 0 && sym_1_2 == 1 && sym_2_3 == 0)
+ || (sym_0_3 == 0 && sym_1_2 == 1 && sym_2_1 == 0)
+ || (sym_0_1 == 1 && sym_1_1 == 0 && sym_2_1 == 1)
+ || (sym_0_2 == 1 && sym_1_2 == 0 && sym_2_2 == 1)
+ || (sym_0_3 == 1 && sym_1_3 == 0 && sym_2_3 == 1)
+ || (sym_0_1 == 1 && sym_1_2 == 0 && sym_2_3 == 1)
+ || (sym_0_3 == 1 && sym_1_2 == 0 && sym_2_1 == 1))
+ {
+ Menu_PrintText(Str_841B2BF, 4, 0);
+ unk_debug_bss_1_4 = 0;
+ }
+ }
+}
+
+#endif
diff --git a/src/engine/sound.c b/src/sound.c
index 159ad3f70..159ad3f70 100644
--- a/src/engine/sound.c
+++ b/src/sound.c
diff --git a/src/engine/sprite.c b/src/sprite.c
index cf35e12a3..a9d84e01a 100644
--- a/src/engine/sprite.c
+++ b/src/sprite.c
@@ -1,8 +1,10 @@
#include "global.h"
+#include "debug.h"
#include "sprite.h"
#include "main.h"
#include "menu_cursor.h"
#include "palette.h"
+#include "sprite.h"
#define MAX_SPRITE_COPY_REQUESTS 64
@@ -822,6 +824,12 @@ static void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct Spr
gSpriteCopyRequests[gSpriteCopyRequestCount].size = images[index].size;
gSpriteCopyRequestCount++;
}
+#if DEBUG
+ else
+ {
+ Crash(sDmaOverErrorMsg);
+ }
+#endif
}
void RequestSpriteCopy(const void *src, u8 *dest, u16 size)
@@ -833,6 +841,12 @@ void RequestSpriteCopy(const void *src, u8 *dest, u16 size)
gSpriteCopyRequests[gSpriteCopyRequestCount].size = size;
gSpriteCopyRequestCount++;
}
+#if DEBUG
+ else
+ {
+ Crash(sDmaOverErrorMsg);
+ }
+#endif
}
// these two functions are unused.
diff --git a/src/field/start_menu.c b/src/start_menu.c
index 89cd404e9..f2d53eb7f 100644
--- a/src/field/start_menu.c
+++ b/src/start_menu.c
@@ -1,15 +1,17 @@
#include "global.h"
+#include "battle_tower.h"
#include "start_menu.h"
#include "event_data.h"
-#include "field_map_obj_helpers.h"
#include "field_player_avatar.h"
#include "field_weather.h"
#include "fieldmap.h"
#include "item_menu.h"
#include "load_save.h"
+#include "m4a.h"
#include "main.h"
#include "map_obj_lock.h"
#include "menu.h"
+#include "new_game.h"
#include "option_menu.h"
#include "palette.h"
#include "pokedex.h"
@@ -44,6 +46,11 @@ enum {
MENU_ACTION_PLAYER_LINK
};
+#if DEBUG
+static u32 _debugStartMenu_0 __attribute__((unused));
+static u32 _debugStartMenu_1 __attribute__((unused));
+#endif
+
static u8 (*saveDialogCallback)(void);
static u8 saveDialogTimer; //Number of frames to keep the window on screen after save was completed
static bool8 savingComplete;
@@ -132,6 +139,107 @@ static bool32 sub_80719FC(u8 *ptr);
static void sub_8071B54(void);
static void Task_8071B64(u8 taskId);
+#if DEBUG
+
+void debug_sub_8075D9C(void);
+
+u8 debug_sub_8075C30(void)
+{
+ CloseMenu();
+ debug_sub_8075D9C();
+ return 1;
+}
+
+extern const u8 gUnknown_Debug_839B6D8[];
+
+void debug_sub_8075C40(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ u16 savedIme;
+ s32 i;
+
+ switch (data[0])
+ {
+ case 0:
+ m4aSoundVSyncOff();
+ data[0]++;
+ break;
+ case 1:
+ savedIme = REG_IME;
+ REG_IME = 0;
+ REG_TM2CNT_L = 0;
+ REG_TM2CNT = 0x830000;
+ for (i = 0; i < 0xC350; i++)
+ {
+ DmaSet(
+ 0,
+ gScanlineEffectRegBuffers,
+ &REG_WIN0H,
+ ((DMA_ENABLE | DMA_START_HBLANK | DMA_16BIT | DMA_REPEAT | DMA_SRC_INC | DMA_DEST_RELOAD) << 16) | 1);
+ DmaStop(0);
+ }
+ REG_TM2CNT_H = 0;
+ _debugStartMenu_0 = REG_TM2CNT_L;
+ REG_TM2CNT_L = 0;
+ REG_IME = savedIme;
+ _debugStartMenu_1 = i;
+ m4aSoundVSyncOn();
+ data[0]++;
+ break;
+ case 2:
+ PlaySE(0x15);
+ ConvertIntToDecimalStringN(gStringVar1, _debugStartMenu_1, 1, 8);
+ ConvertIntToDecimalStringN(gStringVar2, _debugStartMenu_0, 1, 8);
+ Menu_DisplayDialogueFrame();
+ Menu_PrintText(gUnknown_Debug_839B6D8, 2, 15);
+ data[0]++;
+ break;
+ case 3:
+ if (gMain.newKeys & A_BUTTON)
+ {
+ Menu_EraseScreen();
+ ScriptContext2_Disable();
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+void debug_sub_8075D9C(void)
+{
+ CreateTask(debug_sub_8075C40, 10);
+ ScriptContext2_Enable();
+}
+
+void debug_sub_8075DB4(struct BattleTowerEReaderTrainer *ereaderTrainer, const u8 *b, u32 trainerId)
+{
+ s32 i;
+ s32 r3;
+
+ ereaderTrainer->trainerClass = trainerId % 77;
+ write_word_to_mem(trainerId, ereaderTrainer->trainerId);
+ StringCopy8(ereaderTrainer->name, b);
+ r3 = 7;
+ for (i = 0; i < 6; i++)
+ {
+ ereaderTrainer->greeting[i] = gSaveBlock1.easyChats.unk2B28[i];
+ ereaderTrainer->farewellPlayerLost[i] = r3;
+ ereaderTrainer->farewellPlayerWon[i] = r3 + 6;
+ r3++;
+ }
+ for (i = 0; i < 3; i++)
+ sub_803AF78(&gPlayerParty[i], &ereaderTrainer->party[i]);
+ SetEReaderTrainerChecksum(ereaderTrainer);
+}
+
+void unref_sub_8070F90(void)
+{
+ FlagSet(FLAG_SYS_POKEDEX_GET);
+ FlagSet(FLAG_SYS_POKEMON_GET);
+ FlagSet(FLAG_SYS_POKENAV_GET);
+}
+
+#endif
static void BuildStartMenuActions(void)
{
@@ -329,7 +437,7 @@ static u8 StartMenu_InputProcessCallback(void)
if (gMenuCallback != StartMenu_SaveCallback &&
gMenuCallback != StartMenu_ExitCallback &&
gMenuCallback != StartMenu_RetireCallback)
- fade_screen(1, 0);
+ FadeScreen(1, 0);
return 0;
}
if (gMain.newKeys & (START_BUTTON | B_BUTTON))
diff --git a/src/field/starter_choose.c b/src/starter_choose.c
index 418488774..418488774 100644
--- a/src/field/starter_choose.c
+++ b/src/starter_choose.c
diff --git a/src/engine/string_util.c b/src/string_util.c
index 7316f533a..7316f533a 100644
--- a/src/engine/string_util.c
+++ b/src/string_util.c
diff --git a/src/strings.c b/src/strings.c
index 06bbadb8f..0f599db72 100644
--- a/src/strings.c
+++ b/src/strings.c
@@ -173,7 +173,8 @@ const u8 gOtherText_None[] = _("NONE");
const u8 gOtherText_ThreeQuestions2[] = _("???");
-const u8 gOtherText_FiveQuestionsAndSlash[] = _("?????$/");
+const u8 gOtherText_FiveQuestions[] = _("?????");
+const u8 gOtherText_Slash[] = _("/");
const u8 gOtherText_OneDash[] = _("-");
const u8 gOtherText_TwoDashes[] = _("--");
@@ -267,7 +268,9 @@ const u8 gContestStatsText_Spicy[] = _("SPICY");
const u8 gContestStatsText_Dry[] = _("DRY");
const u8 gContestStatsText_Sweet[] = _("SWEET");
const u8 gContestStatsText_Bitter[] = _("BITTER");
-const u8 gContestStatsText_Sour[] = _("SOUR$TASTY$FEEL"); // tasty is unused, feel might not be
+const u8 gContestStatsText_Sour[] = _("SOUR");
+const u8 gContestStatsText_Tasty[] = _("TASTY");
+const u8 gContestStatsText_Feel[] = _("FEEL");
const u8 gContestStatsText_StowCase[] = _("Stow CASE.");
const u8 gContestStatsText_ThrowAwayPrompt[] = _("Throw away this\n{STR_VAR_1}?");
@@ -1096,7 +1099,8 @@ const u8 gOtherText_None[] = _("KEINES");
const u8 gOtherText_ThreeQuestions2[] = _("???");
-const u8 gOtherText_FiveQuestionsAndSlash[] = _("?????$/");
+const u8 gOtherText_FiveQuestions[] = _("?????");
+const u8 gOtherText_Slash[] = _("/");
const u8 gOtherText_OneDash[] = _("-");
const u8 gOtherText_TwoDashes[] = _("--");
@@ -1190,7 +1194,9 @@ const u8 gContestStatsText_Spicy[] = _("SCHARF");
const u8 gContestStatsText_Dry[] = _("TROCKEN");
const u8 gContestStatsText_Sweet[] = _("SÜSS");
const u8 gContestStatsText_Bitter[] = _("BITTER");
-const u8 gContestStatsText_Sour[] = _("SAUER$LECKER$WÜRZE");
+const u8 gContestStatsText_Sour[] = _("SAUER");
+const u8 gContestStatsText_Tasty[] = _("LECKER");
+const u8 gContestStatsText_Feel[] = _("WÜRZE");
const u8 gContestStatsText_StowCase[] = _("BOX verstauen.");
const u8 gContestStatsText_ThrowAwayPrompt[] = _("{STR_VAR_1}\nwegwerfen?");
diff --git a/src/engine/task.c b/src/task.c
index 7bd2b5937..3e8a5588c 100644
--- a/src/engine/task.c
+++ b/src/task.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "debug.h"
#include "task.h"
#define ACTIVE_SENTINEL 0x10
@@ -11,8 +12,9 @@ struct Task gTasks[ACTIVE_SENTINEL];
static void InsertTask(u8 newTaskId);
static u8 FindFirstActiveTask();
-// Unused string
-const u8 sTaskOverString[] = _("TASK OVER\nタスクがオーバーしました");
+const u8 gError_NoTasksLeft[] = _(
+ "TASK OVER\n"
+ "タスクがオーバーしました");
void ResetTasks()
{
@@ -49,6 +51,10 @@ u8 CreateTask(TaskFunc func, u8 priority)
}
}
+#if DEBUG
+ Crash(gError_NoTasksLeft);
+#endif
+
return 0;
}
diff --git a/src/engine/text.c b/src/text.c
index fe18a6d79..234e6085d 100644
--- a/src/engine/text.c
+++ b/src/text.c
@@ -234,12 +234,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");
diff --git a/src/engine/text_window.c b/src/text_window.c
index ade349f4e..ade349f4e 100644
--- a/src/engine/text_window.c
+++ b/src/text_window.c
diff --git a/src/engine/tileset_anim.c b/src/tileset_anim.c
index abd38edad..abd38edad 100644
--- a/src/engine/tileset_anim.c
+++ b/src/tileset_anim.c
diff --git a/src/engine/time_events.c b/src/time_events.c
index 3e3054aa3..4bd732788 100644
--- a/src/engine/time_events.c
+++ b/src/time_events.c
@@ -93,7 +93,7 @@ void UpdateShoalTideFlag(void)
static void Task_WaitWeather(u8 taskId)
{
- if (sub_807DDFC())
+ if (IsWeatherChangeComplete())
{
EnableBothScriptContexts();
DestroyTask(taskId);
diff --git a/src/scene/title_screen.c b/src/title_screen.c
index 202b752a6..a1c8e081d 100644
--- a/src/scene/title_screen.c
+++ b/src/title_screen.c
@@ -8,6 +8,7 @@
#include "m4a.h"
#include "main.h"
#include "main_menu.h"
+#include "overworld.h"
#include "palette.h"
#include "reset_rtc_screen.h"
#include "sound.h"
@@ -353,6 +354,9 @@ static void Task_TitleScreenPhase1(u8);
static void Task_TitleScreenPhase2(u8);
static void Task_TitleScreenPhase3(u8);
static void CB2_GoToMainMenu(void);
+#if DEBUG
+static void CB2_GoToTestMenu(void);
+#endif
static void CB2_GoToClearSaveDataScreen(void);
static void CB2_GoToResetRtcScreen(void);
static void CB2_GoToCopyrightScreen(void);
@@ -829,6 +833,13 @@ static void Task_TitleScreenPhase3(u8 taskId)
BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
SetMainCallback2(CB2_GoToResetRtcScreen);
}
+#if DEBUG
+ else if (gMain.heldKeys == SELECT_BUTTON)
+ {
+ BeginNormalPaletteFade(-1, 0, 0, 16, 0);
+ SetMainCallback2(CB2_GoToTestMenu);
+ }
+#endif
else
{
REG_BG2Y = 0;
@@ -855,6 +866,14 @@ static void CB2_GoToMainMenu(void)
SetMainCallback2(CB2_InitMainMenu);
}
+#if DEBUG
+static void CB2_GoToTestMenu(void)
+{
+ if (!UpdatePaletteFade())
+ SetMainCallback2(CB2_InitTestMenu);
+}
+#endif
+
static void CB2_GoToCopyrightScreen(void)
{
if (!UpdatePaletteFade())
diff --git a/src/engine/trade.c b/src/trade.c
index 4dc27ea6f..a05bddee4 100644
--- a/src/engine/trade.c
+++ b/src/trade.c
@@ -1711,7 +1711,7 @@ static bool8 sub_8048D44(void)
gUnknown_03004824->unk_0075 ++;
break;
case 1:
- if (sub_8007ECC())
+ if (IsLinkTaskFinished())
{
if (GetBlockReceivedStatus() == 0)
{
@@ -2210,7 +2210,7 @@ static void sub_8049A20(void)
{
sub_804AADC(3, 1);
gUnknown_03004824->linkData[0] = 0xbbbb;
- if (sub_8007ECC())
+ if (IsLinkTaskFinished())
{
Trade_SendData(gUnknown_03004824);
}
@@ -2239,7 +2239,7 @@ static void sub_8049AC0(void)
else
{
sub_804AADC(3, 1);
- if (sub_8007ECC())
+ if (IsLinkTaskFinished())
{
gUnknown_03004824->linkData[0] = 0xbbcc;
Trade_SendData(gUnknown_03004824);
@@ -4018,10 +4018,10 @@ static void sub_804B41C(void)
Menu_EraseScreen();
gLinkType = 0x1144;
gMain.state ++;
- LZDecompressVram(gUnknown_08D00000, (void *)VRAM);
- CpuCopy16(gUnknown_08D00524, ewram, 0x1000);
+ LZDecompressVram(gBattleTextboxTiles, (void *)VRAM);
+ CpuCopy16(gBattleTextboxTilemap, ewram, 0x1000);
DmaCopy16Defvars(3, ewram, BG_SCREEN_ADDR(5), 0x500);
- LoadCompressedPalette(gUnknown_08D004E0, 0, 32);
+ LoadCompressedPalette(gBattleTextboxPalette, 0, 32);
gUnknown_03004828->unk_00b6 = 0;
gUnknown_03004828->unk_00c4 = 0;
gUnknown_03004828->isLinkTrade = TRUE;
@@ -4191,11 +4191,11 @@ static __attribute__((naked)) void sub_804B41C(void)
"\tldrb r0, [r1]\n"
"\tadds r0, 0x1\n"
"\tstrb r0, [r1]\n"
- "\tldr r0, _0804B590 @ =gUnknown_08D00000\n"
+ "\tldr r0, _0804B590 @ =gBattleTextboxTiles\n"
"\tmovs r1, 0xC0\n"
"\tlsls r1, 19\n"
"\tbl LZDecompressVram\n"
- "\tldr r0, _0804B594 @ =gUnknown_08D00524\n"
+ "\tldr r0, _0804B594 @ =gBattleTextboxTilemap\n"
"\tldr r1, _0804B598 @ =0xfffe1000\n"
"\tadds r5, r1\n"
"\tmovs r2, 0x80\n"
@@ -4209,7 +4209,7 @@ static __attribute__((naked)) void sub_804B41C(void)
"\tldr r1, _0804B5A4 @ =0x80000280\n"
"\tstr r1, [r0, 0x8]\n"
"\tldr r0, [r0, 0x8]\n"
- "\tldr r0, _0804B5A8 @ =gUnknown_08D004E0\n"
+ "\tldr r0, _0804B5A8 @ =gBattleTextboxPalette\n"
"\tmovs r1, 0\n"
"\tmovs r2, 0x20\n"
"\tbl LoadCompressedPalette\n"
@@ -4267,13 +4267,13 @@ static __attribute__((naked)) void sub_804B41C(void)
"_0804B584: .4byte 0x00001144\n"
"_0804B588: .4byte gMain\n"
"_0804B58C: .4byte 0x0000043c\n"
- "_0804B590: .4byte gUnknown_08D00000\n"
- "_0804B594: .4byte gUnknown_08D00524\n"
+ "_0804B590: .4byte gBattleTextboxTiles\n"
+ "_0804B594: .4byte gBattleTextboxTilemap\n"
"_0804B598: .4byte 0xfffe1000\n"
"_0804B59C: .4byte 0x06002800\n"
"_0804B5A0: .4byte 0x040000d4\n"
"_0804B5A4: .4byte 0x80000280\n"
- "_0804B5A8: .4byte gUnknown_08D004E0\n"
+ "_0804B5A8: .4byte gBattleTextboxPalette\n"
"_0804B5AC_case01:\n"
"\tbl OpenLink\n"
"\tldr r1, _0804B5C8 @ =gMain\n"
@@ -4495,8 +4495,8 @@ static __attribute__((naked)) void sub_804B41C(void)
}
#endif
-static void sub_804B790(void)
// In-game trade init
+void sub_804B790(void)
{
u8 otName[11];
switch (gMain.state)
@@ -4632,7 +4632,7 @@ static void sub_804BB78(void)
switch (gUnknown_03004828->unk_00bd)
{
case 1:
- if (sub_8007ECC())
+ if (IsLinkTaskFinished())
{
Trade_SendData(gUnknown_03004828);
gUnknown_03004828->unk_00bd ++;
@@ -4709,9 +4709,9 @@ static void sub_804BBE8(u8 a0)
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);
+ LZDecompressVram(gBattleTextboxTiles, BG_CHAR_ADDR(0));
+ CpuCopy16(gBattleTextboxTilemap, buffer = (u16 *)gSharedMem, 0x1000);
+ LoadCompressedPalette(gBattleTextboxPalette, 0x70, 0x20);
FillPalette(0, 0, 2);
for (i = 0; i < 0x280; i ++)
buffer[i] |= 0x7000;
@@ -5534,13 +5534,13 @@ static void sub_804DC88(void)
gMain.state = 101;
gUnknown_03004828->unk_00c0 = 0;
}
- if (sub_8007ECC())
+ if (IsLinkTaskFinished())
{
gMain.state = 2;
}
break;
case 101:
- if (sub_8007ECC())
+ if (IsLinkTaskFinished())
{
gMain.state = 2;
}
@@ -5592,7 +5592,7 @@ static void sub_804DC88(void)
gMain.state = 42;
break;
case 42:
- if (sub_8007ECC())
+ if (IsLinkTaskFinished())
{
sub_8125E04();
gSoftResetDisabled = FALSE;
@@ -5607,7 +5607,7 @@ static void sub_804DC88(void)
}
break;
case 6:
- if (sub_8007ECC())
+ if (IsLinkTaskFinished())
{
BeginNormalPaletteFade(-1, 0, 0, 16, 0);
gMain.state ++;
@@ -5684,9 +5684,9 @@ static void sub_804E1DC(void)
void sub_804E22C(void)
{
- LZDecompressVram(gUnknown_08D00000, (void *)VRAM);
- CpuCopy16(gUnknown_08D00524, gSharedMem, 0x1000);
+ LZDecompressVram(gBattleTextboxTiles, (void *)VRAM);
+ CpuCopy16(gBattleTextboxTilemap, gSharedMem, 0x1000);
DmaCopy16Defvars(3, gSharedMem, BG_SCREEN_ADDR(5), 0x500);
- LoadCompressedPalette(gUnknown_08D004E0, 0, 32);
+ LoadCompressedPalette(gBattleTextboxPalette, 0, 32);
REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(5);
}
diff --git a/src/field/trader.c b/src/trader.c
index 64bd708f6..885557d5a 100644
--- a/src/field/trader.c
+++ b/src/trader.c
@@ -108,7 +108,7 @@ void CreateAvailableDecorationsMenu(u8 taskId)
{
if (trader->unk1[i] > DECOR_REGISTEEL_DOLL)
{
- Menu_PrintText(gOtherText_FiveQuestionsAndSlash, 1, numDecorations * 2 + 2);
+ Menu_PrintText(gOtherText_FiveQuestions, 1, numDecorations * 2 + 2);
}
else
{
diff --git a/src/engine/trainer_card.c b/src/trainer_card.c
index b49628bfa..8d16aa9bf 100644
--- a/src/engine/trainer_card.c
+++ b/src/trainer_card.c
@@ -5,6 +5,7 @@
#include "field_effect.h"
#include "graphics.h"
#include "link.h"
+#include "m4a.h"
#include "main.h"
#include "menu.h"
#include "money.h"
@@ -52,7 +53,6 @@ extern struct LinkPlayerMapObject gLinkPlayerMapObjects[];
EWRAM_DATA struct TrainerCard gTrainerCards[4] = {0};
-extern const u8 gBadgesTiles[];
extern const u16 gUnknown_083B5F0C[];
extern const u16 gBadgesPalette[];
extern const u16 gUnknown_083B5F4C[];
@@ -63,6 +63,34 @@ const u8 gBadgesTiles[] = INCBIN_U8("graphics/trainer_card/badges.4bpp");
// XXX: what is this?
u8 *const ewram_ = gSharedMem;
+#if DEBUG
+const struct TrainerCard sTestTrainerCard =
+{
+ .gender = FEMALE,
+ .stars = 4,
+ .hasPokedex = TRUE,
+ .var_3 = TRUE,
+ .var_4 = TRUE,
+ .firstHallOfFameA = 999,
+ .firstHallOfFameB = 99,
+ .firstHallOfFameC = 99,
+ .pokedexSeen = 411,
+ .trainerId = 12345,
+ .playTimeHours = 99,
+ .playTimeMinutes = 99,
+ .linkBattleWins = 9999,
+ .linkBattleLosses = 9999,
+ .battleTowerWins = 9999,
+ .battleTowerLosses = 9999,
+ .contestsWithFriends = 999,
+ .pokeblocksWithFriends = 0xFFFF,
+ .pokemonTrades = 0xFFFF,
+ .money = 99999,
+ .var_28 = {1, 2, 3, 4},
+ .playerName = _("てすと"), // "test"
+};
+#endif
+
bool8 TrainerCard_Init(struct Task *);
bool8 TrainerCard_WaitForFadeInToFinish(struct Task *);
bool8 TrainerCard_WaitForKeys(struct Task *);
@@ -176,8 +204,15 @@ static void TrainerCard_Back_PrintPokemonTrades_Label(void);
static void TrainerCard_Back_PrintPokemonTrades(void);
void unref_sub_8094588(u16 left, u16 top);
+#if DEBUG
+static u8 gDebug_03000748;
+#endif
+
void TrainerCard_ShowPlayerCard(Callback arg1)
{
+#if DEBUG
+ gDebug_03000748 = 0;
+#endif
TrainerCard_InitScreenForPlayer(arg1);
SetMainCallback2(sub_8093174);
ewram0_2.language = GAME_LANGUAGE;
@@ -185,11 +220,41 @@ void TrainerCard_ShowPlayerCard(Callback arg1)
void TrainerCard_ShowLinkCard(u8 playerIndex, Callback arg2)
{
+#if DEBUG
+ gDebug_03000748 = 0;
+#endif
TrainerCard_InitScreenForLinkPlayer(playerIndex, arg2);
SetMainCallback2(sub_8093174);
ewram0_2.language = gLinkPlayers[gLinkPlayerMapObjects[playerIndex].linkPlayerId].language;
}
+#if DEBUG
+void debug_sub_80A0710(Callback callback)
+{
+ gDebug_03000748 = TRUE;
+ TrainerCard_InitScreenForPlayer(callback);
+ SetMainCallback2(sub_8093174);
+ ewram0_2.language = GAME_LANGUAGE;
+}
+
+void debug_sub_80A073C(Callback callback)
+{
+ memcpy(&gTrainerCards[0], &sTestTrainerCard, sizeof(struct TrainerCard));
+ gDebug_03000748=TRUE;
+ TrainerCard_InitScreenForLinkPlayer(0, callback);
+ SetMainCallback2(sub_8093174);
+ ewram0_2.language = GAME_LANGUAGE;
+}
+
+void debug_sub_80A0780()
+{
+ int i;
+
+ for (i = 0; i < 4; i++)
+ memcpy(&gTrainerCards[i], &sTestTrainerCard, sizeof(struct TrainerCard));
+}
+#endif
+
static void sub_8093174(void)
{
switch (gMain.state)
@@ -538,6 +603,19 @@ static void TrainerCard_FillFlags(void)
}
}
}
+
+#if DEBUG
+ if (gDebug_03000748 != 0)
+ {
+ ewram0_2.showHallOfFame = TRUE;
+ ewram0_2.showLinkBattleStatus = TRUE;
+ ewram0_2.showBattleTowerStatus = TRUE;
+ ewram0_2.showContestRecord = TRUE;
+ ewram0_2.showMixingRecord = TRUE;
+ ewram0_2.showTradingRecord = TRUE;
+ memset(ewram0_2.ownedBadges, TRUE, sizeof(ewram0_2.ownedBadges));
+ }
+#endif
}
void sub_80937A4()
@@ -630,6 +708,17 @@ bool8 TrainerCard_WaitForKeys(struct Task *task)
}
return TRUE;
}
+#if DEBUG
+ else if (gDebug_03000748 && gMain.newKeys & R_BUTTON)
+ {
+ ewram0_2.starCount++;
+ ewram0_2.starCount %= 5;
+ TrainerCard_LoadPalettes();
+ if (ewram0_2.backSideShown == 0)
+ TrainerCard_DrawStars();
+ }
+#endif
+
return FALSE;
}
@@ -1334,7 +1423,11 @@ static void TrainerCard_Front_PrintPokedexCount(void)
{
u8 buffer[16];
- if (!ewram0_2.showPokedexCount)
+ if (
+#if DEBUG
+ gDebug_03000748 == 0 &&
+#endif
+ !ewram0_2.showPokedexCount)
{
TrainerCard_ClearPokedexLabel();
}
diff --git a/src/field/trainer_see.c b/src/trainer_see.c
index 3034b2b65..2913a0a5a 100644
--- a/src/field/trainer_see.c
+++ b/src/trainer_see.c
@@ -2,7 +2,7 @@
#include "trainer_see.h"
#include "battle_setup.h"
#include "field_effect.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "field_player_avatar.h"
#include "script.h"
#include "sprite.h"
diff --git a/src/engine/trig.c b/src/trig.c
index e16a69e63..e16a69e63 100644
--- a/src/engine/trig.c
+++ b/src/trig.c
diff --git a/src/field/tv.c b/src/tv.c
index efda4b925..6c24170ae 100644
--- a/src/field/tv.c
+++ b/src/tv.c
@@ -21,7 +21,7 @@
#include "battle.h"
#include "link.h"
#include "constants/easy_chat.h"
-#include "field_map_obj.h"
+#include "event_object_movement.h"
#include "field_specials.h"
#include "item.h"
#include "constants/items.h"
@@ -47,8 +47,6 @@ struct UnkTvStruct
s8 var0;
};
-extern u8 gUnknown_0300430A[11];
-
struct OutbreakPokemon
{
/*0x00*/ u16 species;
@@ -3052,7 +3050,7 @@ void DoTVShowTodaysSmartShopper(void)
break;
case 1:
TVShowConvertInternationalString(gStringVar1, smartShopper->playerName, smartShopper->language);
- StringCopy(gStringVar2, ItemId_GetItem(smartShopper->itemIds[0])->name);
+ StringCopy(gStringVar2, ItemId_GetName(smartShopper->itemIds[0]));
sub_80BF088(2, smartShopper->itemAmounts[0]);
sTVShowState += (Random() % 4) + 1;
break;
@@ -3072,7 +3070,7 @@ void DoTVShowTodaysSmartShopper(void)
sTVShowState = 10;
break;
case 6:
- StringCopy(gStringVar2, ItemId_GetItem(smartShopper->itemIds[1])->name);
+ StringCopy(gStringVar2, ItemId_GetName(smartShopper->itemIds[1]));
sub_80BF088(2, smartShopper->itemAmounts[1]);
if (smartShopper->itemIds[2] != 0)
sTVShowState = 7;
@@ -3082,7 +3080,7 @@ void DoTVShowTodaysSmartShopper(void)
sTVShowState = 9;
break;
case 7:
- StringCopy(gStringVar2, ItemId_GetItem(smartShopper->itemIds[2])->name);
+ StringCopy(gStringVar2, ItemId_GetName(smartShopper->itemIds[2]));
sub_80BF088(2, smartShopper->itemAmounts[2]);
if (smartShopper->priceReduced == 1)
sTVShowState = 8;
@@ -3107,7 +3105,7 @@ void DoTVShowTodaysSmartShopper(void)
break;
case 11:
TVShowConvertInternationalString(gStringVar1, smartShopper->playerName, smartShopper->language);
- StringCopy(gStringVar2, ItemId_GetItem(smartShopper->itemIds[0])->name);
+ StringCopy(gStringVar2, ItemId_GetName(smartShopper->itemIds[0]));
if (smartShopper->priceReduced == 1)
sTVShowState = 8;
else
@@ -3239,7 +3237,7 @@ void DoTVShowPokemonTodaySuccessfulCapture(void)
sTVShowState = 2;
break;
case 2:
- StringCopy(gStringVar2, ItemId_GetItem(pokemonToday->ball)->name);
+ StringCopy(gStringVar2, ItemId_GetName(pokemonToday->ball));
sub_80BF088(2, pokemonToday->var12);
if (pokemonToday->var12 < 4)
sTVShowState = 3;
diff --git a/src/unk_text_8095904.c b/src/unk_text_8095904.c
new file mode 100644
index 000000000..4b190bdaa
--- /dev/null
+++ b/src/unk_text_8095904.c
@@ -0,0 +1,266 @@
+#include "global.h"
+#include "text.h"
+#include "string_util.h"
+
+// static types
+
+// static declarations
+
+// rodata
+
+extern const u32 gFont3LatinGlyphs[];
+
+// text
+
+#ifdef NONMATCHING
+void sub_8095904(const u8 *src, u8 *dest, u8 bgOverride, u16 width, u8 bg, u8 *buffer)
+{
+ u16 strlen = StringLength(src);
+ if (bgOverride == 0)
+ {
+ u16 i;
+ for (i = 0; i < strlen; i++)
+ {
+ const u8 *glyphs = (const u8 *)(gFont3LatinGlyphs + ((src[i] & 0xfff0) * 16) + ((src[i] & 0xf) * 8));
+ CpuCopy16(glyphs, dest, 32);
+ CpuCopy16(glyphs + 0x200, dest + width, 32);
+ dest += 32;
+ }
+ }
+ else
+ {
+ u16 i; // sp18
+ u16 r9 = 0;
+ u8 bgHi = bg << 4;
+ u16 size = strlen * 32;
+ for (i = 0; i < 2; i++)
+ {
+ u16 j;
+ for (j = 0; j < strlen; j++) // r5
+ {
+ const u32 *glyphs = (const u8 *)(gFont3LatinGlyphs + (i * 0x80) + ((src[j] & 0xfff0) * 16) + ((src[j] & 0xf) * 8));
+
+ u16 k; // r6
+ for (k = 0; k < 32; k++)
+ {
+ u8 r3 = *glyphs & 0xf0;
+ u8 r2 = *glyphs & 0x0f;
+ if (r3 == 0)
+ {
+ r3 = bgHi;
+ }
+ if (r2 == 0)
+ {
+ r2 = bg;
+ }
+ buffer[r9++] = r3 | r2;
+ glyphs++;
+ }
+ }
+ CpuCopy16(buffer, dest, size);
+ dest += width;
+ r9 = 0;
+ }
+ }
+}
+#else
+__attribute__((naked)) void sub_8095904(const u8 *src, u8 *dest, u8 bgOverride, u16 width, u8 bg, u8 *buffer)
+{
+ 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, 0x1C\n"
+ "\tstr r0, [sp]\n"
+ "\tadds r7, r1, 0\n"
+ "\tadds r4, r2, 0\n"
+ "\tldr r0, [sp, 0x3C]\n"
+ "\tlsls r4, 24\n"
+ "\tlsrs r4, 24\n"
+ "\tlsls r3, 16\n"
+ "\tlsrs r3, 16\n"
+ "\tstr r3, [sp, 0x4]\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tstr r0, [sp, 0x8]\n"
+ "\tldr r0, [sp]\n"
+ "\tbl StringLength\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tmov r8, r0\n"
+ "\tcmp r4, 0\n"
+ "\tbne _08095988\n"
+ "\tmovs r5, 0\n"
+ "\tcmp r5, r8\n"
+ "\tbcs _08095A2E\n"
+ "_0809593E:\n"
+ "\tldr r1, [sp]\n"
+ "\tadds r0, r1, r5\n"
+ "\tldrb r2, [r0]\n"
+ "\tldr r0, _08095980 @ =0x0000fff0\n"
+ "\tands r0, r2\n"
+ "\tlsls r0, 6\n"
+ "\tmovs r1, 0xF\n"
+ "\tands r2, r1\n"
+ "\tlsls r2, 5\n"
+ "\tadds r0, r2\n"
+ "\tldr r1, _08095984 @ =gFont3LatinGlyphs\n"
+ "\tadds r4, r0, r1\n"
+ "\tadds r0, r4, 0\n"
+ "\tadds r1, r7, 0\n"
+ "\tmovs r2, 0x10\n"
+ "\tbl CpuSet\n"
+ "\tmovs r2, 0x80\n"
+ "\tlsls r2, 2\n"
+ "\tadds r0, r4, r2\n"
+ "\tldr r3, [sp, 0x4]\n"
+ "\tadds r1, r7, r3\n"
+ "\tmovs r2, 0x10\n"
+ "\tbl CpuSet\n"
+ "\tadds r7, 0x20\n"
+ "\tadds r0, r5, 0x1\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r5, r0, 16\n"
+ "\tcmp r5, r8\n"
+ "\tbcc _0809593E\n"
+ "\tb _08095A2E\n"
+ "\t.align 2, 0\n"
+ "_08095980: .4byte 0x0000fff0\n"
+ "_08095984: .4byte gFont3LatinGlyphs\n"
+ "_08095988:\n"
+ "\tmovs r0, 0\n"
+ "\tmov r9, r0\n"
+ "\tldr r1, [sp, 0x8]\n"
+ "\tlsls r0, r1, 28\n"
+ "\tlsrs r0, 24\n"
+ "\tstr r0, [sp, 0xC]\n"
+ "\tmov r2, r8\n"
+ "\tlsls r0, r2, 21\n"
+ "\tmovs r1, 0\n"
+ "\tlsrs r0, 1\n"
+ "\tstr r0, [sp, 0x10]\n"
+ "_0809599E:\n"
+ "\tmovs r5, 0\n"
+ "\tldr r3, [sp, 0x4]\n"
+ "\tadds r3, r7, r3\n"
+ "\tstr r3, [sp, 0x14]\n"
+ "\tadds r0, r1, 0x1\n"
+ "\tstr r0, [sp, 0x18]\n"
+ "\tcmp r5, r8\n"
+ "\tbcs _08095A12\n"
+ "\tmovs r2, 0xF\n"
+ "\tmov r12, r2\n"
+ "\tlsls r1, 9\n"
+ "\tldr r0, _08095A40 @ =gFont3LatinGlyphs\n"
+ "\tadds r1, r0\n"
+ "\tmov r10, r1\n"
+ "_080959BA:\n"
+ "\tldr r3, [sp]\n"
+ "\tadds r0, r3, r5\n"
+ "\tldrb r1, [r0]\n"
+ "\tldr r0, _08095A44 @ =0x0000fff0\n"
+ "\tands r0, r1\n"
+ "\tlsls r0, 6\n"
+ "\tmov r2, r12\n"
+ "\tands r1, r2\n"
+ "\tlsls r1, 5\n"
+ "\tadds r0, r1\n"
+ "\tmov r3, r10\n"
+ "\tadds r4, r0, r3\n"
+ "\tmovs r6, 0\n"
+ "\tadds r5, 0x1\n"
+ "_080959D6:\n"
+ "\tldrb r0, [r4]\n"
+ "\tmovs r3, 0xF0\n"
+ "\tands r3, r0\n"
+ "\tmov r2, r12\n"
+ "\tands r2, r0\n"
+ "\tcmp r3, 0\n"
+ "\tbne _080959E6\n"
+ "\tldr r3, [sp, 0xC]\n"
+ "_080959E6:\n"
+ "\tcmp r2, 0\n"
+ "\tbne _080959EC\n"
+ "\tldr r2, [sp, 0x8]\n"
+ "_080959EC:\n"
+ "\tmov r0, r9\n"
+ "\tadds r1, r0, 0x1\n"
+ "\tlsls r1, 16\n"
+ "\tlsrs r1, 16\n"
+ "\tmov r9, r1\n"
+ "\tldr r1, [sp, 0x40]\n"
+ "\tadds r0, r1, r0\n"
+ "\torrs r3, r2\n"
+ "\tstrb r3, [r0]\n"
+ "\tadds r4, 0x1\n"
+ "\tadds r0, r6, 0x1\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r6, r0, 16\n"
+ "\tcmp r6, 0x1F\n"
+ "\tbls _080959D6\n"
+ "\tlsls r0, r5, 16\n"
+ "\tlsrs r5, r0, 16\n"
+ "\tcmp r5, r8\n"
+ "\tbcc _080959BA\n"
+ "_08095A12:\n"
+ "\tldr r0, [sp, 0x40]\n"
+ "\tadds r1, r7, 0\n"
+ "\tldr r3, [sp, 0x10]\n"
+ "\tlsrs r2, r3, 16\n"
+ "\tbl CpuSet\n"
+ "\tldr r7, [sp, 0x14]\n"
+ "\tmovs r0, 0\n"
+ "\tmov r9, r0\n"
+ "\tldr r1, [sp, 0x18]\n"
+ "\tlsls r0, r1, 16\n"
+ "\tlsrs r1, r0, 16\n"
+ "\tcmp r1, 0x1\n"
+ "\tbls _0809599E\n"
+ "_08095A2E:\n"
+ "\tadd sp, 0x1C\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"
+ "_08095A40: .4byte gFont3LatinGlyphs\n"
+ "_08095A44: .4byte 0x0000fff0");
+}
+#endif
+
+void unref_sub_8095A48(const u8 *src, u8 *dest, u8 bgOverride, u8 width, u8 *buffer)
+{
+ u8 tmpBuffer[5];
+ bool8 r6 = FALSE;
+ while (!r6)
+ {
+ u16 i;
+ for (i = 0; i < 4; i++)
+ {
+ if (*src == EOS)
+ {
+ if (i == 0)
+ {
+ return;
+ }
+ r6 = TRUE;
+ break;
+ }
+ else
+ {
+ tmpBuffer[i] = *src++;
+ }
+ }
+ while (i < 4)
+ {
+ tmpBuffer[i++] = 0;
+ }
+ tmpBuffer[i] = EOS;
+ sub_8095904(tmpBuffer, dest, bgOverride, 0x80, width, buffer);
+ dest += 0x100;
+ }
+}
diff --git a/src/field/use_pokeblock.c b/src/use_pokeblock.c
index 42020c49a..8ea93aab8 100644
--- a/src/field/use_pokeblock.c
+++ b/src/use_pokeblock.c
@@ -104,7 +104,6 @@ static EWRAM_DATA struct Pokeblock *gUnknown_0203930C = NULL;
EWRAM_DATA u8 gPokeblockMonID = 0;
EWRAM_DATA s16 gPokeblockGain = 0;
-extern u16 gKeyRepeatStartDelay;
extern u16 gSpecialVar_ItemId; // FIXME: remove after merge of #349 Pokeblock
static void launch_c3_walk_stairs_and_run_once(void (*const)(void));
diff --git a/src/engine/util.c b/src/util.c
index 582b9f806..582b9f806 100644
--- a/src/engine/util.c
+++ b/src/util.c
diff --git a/src/field/wallclock.c b/src/wallclock.c
index 1f743a61a..1f743a61a 100644
--- a/src/field/wallclock.c
+++ b/src/wallclock.c
diff --git a/src/field/wild_encounter.c b/src/wild_encounter.c
index 79542422e..19778e29b 100644
--- a/src/field/wild_encounter.c
+++ b/src/wild_encounter.c
@@ -3698,13 +3698,13 @@ const u16 gRoute119WaterTileData[] =
extern u16 gSpecialVar_Result;
extern u8 S_RepelWoreOff[];
-EWRAM_DATA static u8 sWildEncountersDisabled = 0;
+EWRAM_DATA u8 sWildEncountersDisabled = 0;
EWRAM_DATA static u32 sFeebasRngValue = 0;
#define NUM_FEEBAS_SPOTS 6
-static u16 FeebasRandom(void);
-static void FeebasSeedRng(u16 seed);
+u16 FeebasRandom(void);
+void FeebasSeedRng(u16 seed);
static bool8 IsWildLevelAllowedByRepel(u8 level);
static void ApplyFluteEncounterRateMod(u32 *encRate);
@@ -3791,17 +3791,30 @@ static bool8 CheckFeebas(void)
return FALSE;
}
-static u16 FeebasRandom(void)
+u16 FeebasRandom(void)
{
sFeebasRngValue = 12345 + 0x41C64E6D * sFeebasRngValue;
return sFeebasRngValue >> 16;
}
-static void FeebasSeedRng(u16 seed)
+void FeebasSeedRng(u16 seed)
{
sFeebasRngValue = seed;
}
+#if DEBUG
+u16 debug_sub_8092344(u8 arg0)
+{
+ if (arg0 == 0)
+ return 131;
+ if (arg0 == 1)
+ return 167;
+ if (arg0 == 2)
+ return 149;
+ return 0;
+}
+#endif
+
static u8 ChooseWildMonIndex_Land(void)
{
u8 rand = Random() % 100;
@@ -4042,6 +4055,24 @@ static bool8 DoWildEncounterRateDiceRoll(u16 encounterRate)
return FALSE;
}
+#if DEBUG
+u16 debug_sub_809283C(u16 attempts)
+{
+ u16 retval = 0;
+ u16 i = 0;
+
+ while (i < attempts)
+ {
+ if (DoWildEncounterRateDiceRoll(320) == TRUE)
+ retval++;
+
+ i++;
+ }
+
+ return retval;
+}
+#endif
+
static bool8 DoWildEncounterTest(u32 encounterRate, bool8 ignoreAbility)
{
encounterRate *= 16;