summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle/anim/aurora.c6
-rw-r--r--src/battle/anim/blow_kiss.c6
-rw-r--r--src/battle/anim/bubble.c4
-rw-r--r--src/battle/anim/bug.c22
-rw-r--r--src/battle/anim/bullet.c4
-rw-r--r--src/battle/anim/cutter.c58
-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/egg.c2
-rw-r--r--src/battle/anim/energy_wave.c10
-rw-r--r--src/battle/anim/fight.c647
-rw-r--r--src/battle/anim/fire_2.c8
-rw-r--r--src/battle/anim/flying_path.c14
-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/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.c2
-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/orbs.c16
-rw-r--r--src/battle/anim/perceive.c2
-rw-r--r--src/battle/anim/poison.c18
-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.c4
-rw-r--r--src/battle/anim/seed.c4
-rw-r--r--src/battle/anim/shadow_minimize.c13
-rw-r--r--src/battle/anim/sonic.c4
-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.c4
-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.c3647
-rw-r--r--src/battle/battle_4.c340
-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.c435
-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.c858
-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.c89
-rw-r--r--src/battle/battle_setup.c2
-rw-r--r--src/battle/battle_util.c324
-rw-r--r--src/battle/pokeball.c46
-rw-r--r--src/battle/reshow_battle_screen.c44
-rw-r--r--src/contest.c220
-rw-r--r--src/data/pokedex_entries_de.h3
-rw-r--r--src/data/pokedex_entries_en.h2
-rw-r--r--src/debug/kagaya_debug_menu.c183
-rw-r--r--src/debug/matsuda_debug_menu.c326
-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.c20
-rw-r--r--src/debug/watanabe_debug_menu.c11
-rw-r--r--src/engine/cable_club.c475
-rw-r--r--src/engine/clock.c3
-rw-r--r--src/engine/link.c198
-rw-r--r--src/engine/mystery_event_menu.c460
-rw-r--r--src/engine/naming_screen.c2
-rw-r--r--src/engine/option_menu.c170
-rw-r--r--src/engine/reset_rtc_screen.c323
-rw-r--r--src/engine/rtc.c29
-rw-r--r--src/engine/save.c41
-rw-r--r--src/engine/save_failed_screen.c192
-rw-r--r--src/engine/sprite.c14
-rw-r--r--src/engine/task.c10
-rw-r--r--src/engine/trade.c2
-rw-r--r--src/engine/trainer_card.c97
-rw-r--r--src/field/battle_tower.c2
-rw-r--r--src/field/berry.c521
-rw-r--r--src/field/berry_tag_screen.c2
-rw-r--r--src/field/bike.c20
-rw-r--r--src/field/choose_party.c104
-rw-r--r--src/field/daycare.c91
-rw-r--r--src/field/decoration_inventory.c11
-rw-r--r--src/field/evobjmv.c518
-rw-r--r--src/field/field_control_avatar.c67
-rw-r--r--src/field/field_effect.c1
-rw-r--r--src/field/field_effect_helpers.c2
-rw-r--r--src/field/field_fadetransition.c16
-rw-r--r--src/field/field_player_avatar.c195
-rw-r--r--src/field/field_poison.c47
-rw-r--r--src/field/field_weather.c186
-rw-r--r--src/field/fldeff_cut.c109
-rw-r--r--src/field/fldeff_flash.c30
-rw-r--r--src/field/fldeff_poison.c4
-rw-r--r--src/field/fldeff_secretpower.c96
-rw-r--r--src/field/fldeff_strength.c23
-rw-r--r--src/field/item.c308
-rw-r--r--src/field/item_menu.c516
-rw-r--r--src/field/mauville_man.c83
-rw-r--r--src/field/overworld.c95
-rw-r--r--src/field/party_menu.c523
-rw-r--r--src/field/pc_screen_effect.c17
-rw-r--r--src/field/pokeblock.c68
-rw-r--r--src/field/pokedex_area_screen.c20
-rw-r--r--src/field/pokenav.c16
-rw-r--r--src/field/region_map.c22
-rw-r--r--src/field/roamer.c19
-rw-r--r--src/field/safari_zone.c2
-rw-r--r--src/field/secret_base.c173
-rw-r--r--src/field/shop.c21
-rw-r--r--src/field/slot_machine.c2452
-rw-r--r--src/field/start_menu.c303
-rw-r--r--src/field/trader.c2
-rw-r--r--src/field/use_pokeblock.c1
-rw-r--r--src/field/wild_encounter.c41
-rw-r--r--src/libs/m4a_1.s6
-rw-r--r--src/pokemon/mail.c614
-rw-r--r--src/pokemon/mon_markings.c20
-rw-r--r--src/pokemon/pokedex.c4
-rw-r--r--src/pokemon/pokemon_1.c49
-rw-r--r--src/pokemon/pokemon_2.c3
-rw-r--r--src/pokemon/pokemon_data.c12
-rw-r--r--src/pokemon/pokemon_menu.c25
-rw-r--r--src/pokemon/pokemon_storage_system.c813
-rw-r--r--src/pokemon/pokemon_storage_system_2.c3058
-rw-r--r--src/pokemon/pokemon_storage_system_3.c655
-rw-r--r--src/pokemon/pokemon_storage_system_4.c2849
-rw-r--r--src/pokemon/pokemon_storage_system_5.c16
-rw-r--r--src/pokemon/pokemon_summary_screen.c587
-rw-r--r--src/pokenav_before.c563
-rw-r--r--src/rom3.c14
-rw-r--r--src/rom6.c18
-rw-r--r--src/rom_8077ABC.c108
-rw-r--r--src/roulette.c3418
-rw-r--r--src/roulette_util.c162
-rw-r--r--src/scene/berry_blender.c342
-rw-r--r--src/scene/cable_car.c227
-rw-r--r--src/scene/cute_sketch.c344
-rw-r--r--src/scene/hall_of_fame.c44
-rw-r--r--src/scene/intro.c206
-rw-r--r--src/scene/intro_credits_graphics.c140
-rw-r--r--src/scene/new_game.c73
-rw-r--r--src/scene/title_screen.c19
-rw-r--r--src/strings.c14
-rw-r--r--src/unk_text_8095904.c266
164 files changed, 36025 insertions, 4786 deletions
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..1252c1315 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]);
diff --git a/src/battle/anim/bug.c b/src/battle/anim/bug.c
index dbc0f75a5..e12f55a8b 100644
--- a/src/battle/anim/bug.c
+++ b/src/battle/anim/bug.c
@@ -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
@@ -212,7 +212,7 @@ 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];
@@ -224,7 +224,7 @@ void sub_80DCBCC(struct Sprite *sprite)
sprite->data[2] = lVarX;
sprite->data[4] = lVarY;
- sprite->callback = sub_8078B34;
+ sprite->callback = StartTranslateAnimSpriteByDeltas;
StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
}
@@ -232,7 +232,7 @@ void sub_80DCBCC(struct Sprite *sprite)
// Move_PIN_MISSILE, Move_ICICLE_SPEAR
void sub_80DCCFC(struct Sprite *sprite)
{
- sub_80787B0(sprite, 1);
+ InitAnimSpritePos(sprite, 1);
if (GetBankSide(gAnimBankAttacker))
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
@@ -251,7 +251,7 @@ void sub_80DCD78(struct Sprite *sprite)
{
sprite->invisible = FALSE;
- if (sub_8078718(sprite))
+ if (TranslateAnimSpriteLinearAndSine(sprite))
{
DestroyAnimSprite(sprite);
}
@@ -271,7 +271,7 @@ 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,
sprite->pos1.y + sprite->pos2.y - y2);
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..0f23fed82 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,29 +8,36 @@ 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];
}
@@ -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..aaf8507c6 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;
+
+ sub_80786EC(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/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..a7c25de49
--- /dev/null
+++ b/src/battle/anim/fight.c
@@ -0,0 +1,647 @@
+#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 sub_80D9474(struct Sprite *sprite);
+static void sub_80D94CC(struct Sprite *sprite);
+static void sub_80D9524(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 = sub_80782D8;
+ 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);
+}
+
+void sub_80D90A4(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 = sub_80782D8;
+ 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);
+ }
+}
+
+void sub_80D943C(struct Sprite *sprite)
+{
+ sub_8078764(sprite, 1);
+ StartSpriteAnim(sprite, gBattleAnimArgs[2]);
+ sprite->data[0] = gBattleAnimArgs[3];
+
+ sprite->callback = sub_80782D8;
+ StoreSpriteCallbackInData(sprite, sub_80D9474);
+}
+
+static void sub_80D9474(struct Sprite *sprite)
+{
+ StartSpriteAffineAnim(sprite, 0);
+ sprite->affineAnimPaused = 1;
+ sprite->data[0] = 20;
+
+ sprite->callback = sub_80782D8;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+}
+
+void sub_80D94A8(struct Sprite *sprite)
+{
+ sub_8078764(sprite, 1);
+ sprite->data[0] = gBattleAnimArgs[2];
+
+ sprite->callback = sub_80D94CC;
+}
+
+static void sub_80D94CC(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, sub_80D9524);
+ }
+}
+
+static void sub_80D9524(struct Sprite *sprite)
+{
+ sprite->data[0] = 15;
+
+ sprite->callback = sub_80782D8;
+ 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..fe63fcff1 100644
--- a/src/battle/anim/fire_2.c
+++ b/src/battle/anim/fire_2.c
@@ -42,7 +42,7 @@ struct Sprite *sub_80D5210(struct Sprite *sprite)
void sub_80D522C(struct Sprite *sprite)
{
- sub_80787B0(sprite, 1);
+ InitAnimSpritePos(sprite, 1);
sprite->data[7] = gBattleAnimArgs[2];
sprite->data[0] = 0;
@@ -62,7 +62,7 @@ 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;
}
@@ -70,7 +70,7 @@ void sub_80D5254(struct Sprite *sprite)
void sub_80D52AC(struct Sprite *sprite)
{
- if (sub_8078B5C(sprite))
+ if (TranslateAnimSpriteByDeltas(sprite))
{
sprite->data[0] = 0;
@@ -123,7 +123,7 @@ void sub_80D5374(struct Sprite *sprite)
void sub_80D53B4(struct Sprite *sprite)
{
- sub_80787B0(sprite, 1);
+ InitAnimSpritePos(sprite, 1);
sprite->data[1] = gBattleAnimArgs[2];
sprite->data[0] = gBattleAnimArgs[3];
diff --git a/src/battle/anim/flying_path.c b/src/battle/anim/flying_path.c
index 441ac0e6d..559f617c6 100644
--- a/src/battle/anim/flying_path.c
+++ b/src/battle/anim/flying_path.c
@@ -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;
@@ -103,7 +103,7 @@ void sub_80CBF5C(u8 taskId)
break;
case 2:
sub_80CC358(task, taskId);
- if (sub_8078718(sprite) == 0)
+ if (TranslateAnimSpriteLinearAndSine(sprite) == 0)
break;
task->data[15] = 3;
@@ -146,7 +146,7 @@ void sub_80CBF5C(u8 taskId)
break;
case 6:
sub_80CC358(task, taskId);
- if (sub_8078718(sprite) == 0)
+ if (TranslateAnimSpriteLinearAndSine(sprite) == 0)
break;
task->data[15] = 7;
@@ -189,7 +189,7 @@ void sub_80CBF5C(u8 taskId)
break;
case 10:
sub_80CC358(task, taskId);
- if (sub_8078718(sprite) == 0)
+ if (TranslateAnimSpriteLinearAndSine(sprite) == 0)
{
break;
}
@@ -221,7 +221,7 @@ void sub_80CBF5C(u8 taskId)
}
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/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..0ee381e13 100644
--- a/src/battle/anim/money.c
+++ b/src/battle/anim/money.c
@@ -19,7 +19,7 @@ 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)
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/orbs.c b/src/battle/anim/orbs.c
index 6ca2fa71c..b965cacb8 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);
}
@@ -105,7 +105,7 @@ void sub_80CA9A8(struct Sprite* sprite)
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..272d99e84 100644
--- a/src/battle/anim/poison.c
+++ b/src/battle/anim/poison.c
@@ -17,7 +17,7 @@ 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);
@@ -31,7 +31,7 @@ void sub_80D9D70(struct Sprite *sprite)
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];
@@ -59,7 +59,7 @@ void sub_80D9DF0(struct Sprite *sprite)
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,7 +104,7 @@ 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);
}
@@ -116,7 +116,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];
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..b108c496a
--- /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];
+
+ sub_80786EC(&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..1d1772b1b
--- /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;
+
+ sub_80786EC(&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..e6b85dd5f 100644
--- a/src/battle/anim/scan.c
+++ b/src/battle/anim/scan.c
@@ -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));
@@ -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..e3d4bd3fb 100644
--- a/src/battle/anim/seed.c
+++ b/src/battle/anim/seed.c
@@ -15,7 +15,7 @@ static void sub_80CABC0(struct Sprite* sprite);
void sub_80CAB18(struct Sprite* sprite)
{
- sub_80787B0(sprite, 1);
+ InitAnimSpritePos(sprite, 1);
if (GetBankSide(gAnimBankAttacker))
{
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
@@ -31,7 +31,7 @@ void sub_80CAB18(struct Sprite* sprite)
void sub_80CAB88(struct Sprite* sprite)
{
- if (sub_8078718(sprite))
+ if (TranslateAnimSpriteLinearAndSine(sprite))
{
sprite->invisible = 1;
sprite->data[0] = 10;
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/sonic.c b/src/battle/anim/sonic.c
index 0897ec6e3..2808c86c2 100644
--- a/src/battle/anim/sonic.c
+++ b/src/battle/anim/sonic.c
@@ -29,7 +29,7 @@ void sub_80CF6DC(struct Sprite* sprite)
gBattleAnimArgs[3] = -gBattleAnimArgs[3];
}
- sub_80787B0(sprite, 1);
+ InitAnimSpritePos(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);
@@ -41,7 +41,7 @@ void sub_80CF6DC(struct Sprite* sprite)
sprite->data[0] = gBattleAnimArgs[4];
sprite->data[2] = a;
sprite->data[4] = b;
- sprite->callback = sub_8078B34;
+ 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..b5e150dd8 100644
--- a/src/battle/anim/unused_8.c
+++ b/src/battle/anim/unused_8.c
@@ -15,7 +15,7 @@ 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];
@@ -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 2ad2adb04..e37c33d0f 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,6 +14,7 @@
#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"
@@ -14,6 +22,7 @@
#include "main.h"
#include "m4a.h"
#include "name_string_util.h"
+#include "overworld.h"
#include "palette.h"
#include "party_menu.h"
#include "pokeball.h"
@@ -24,9 +33,7 @@
#include "rom3.h"
#include "rom_8077ABC.h"
#include "rom_8094928.h"
-#include "constants/songs.h"
#include "sound.h"
-#include "constants/species.h"
#include "sprite.h"
#include "string_util.h"
#include "task.h"
@@ -36,10 +43,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 +67,16 @@ struct UnknownStruct12
u8 filler4[0x54];
};
+extern void sub_802BBD4();
+
+extern struct SpriteTemplate gUnknown_02024E8C;
+extern const u8 Str_821F7B8[];
+extern u8 gUnknown_02023A14_50;
extern const u16 gUnknown_08D004E0[];
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 +88,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 +186,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,7 +254,14 @@ 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);
@@ -261,7 +278,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 +404,7 @@ void sub_800EC9C(void)
{
u8 playerId;
u8 enemyId;
+ s32 id;
RunTasks();
AnimateSprites();
@@ -402,6 +424,16 @@ void sub_800EC9C(void)
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 +448,6 @@ void sub_800EC9C(void)
case 1:
if ((GetBlockReceivedStatus() & 3) == 3)
{
- s32 id;
u8 taskId;
ResetBlockReceivedFlags();
@@ -566,6 +597,7 @@ void sub_800F104(void)
u8 playerId;
MainCallback *pSavedCallback;
u16 *pSavedBattleTypeFlags;
+ s32 i;
playerId = GetMultiplayerId();
ewram160CB = playerId;
@@ -579,17 +611,30 @@ void sub_800F104(void)
switch (gBattleCommunication[0])
{
case 0:
- if (gReceivedRemoteLinkPlayers != 0 && IsLinkTaskFinished())
+ 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 +684,27 @@ void sub_800F298(void)
switch (gBattleCommunication[0])
{
case 0:
- if (gReceivedRemoteLinkPlayers != 0 && IsLinkTaskFinished())
+ 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:
@@ -898,6 +956,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();
@@ -1275,6 +1356,3104 @@ void c2_081284E0(void)
}
}
+// A LOT of debug code!
+#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_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_2023A76_[][7][5];
+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;
+}
+
+// gUnknown_Debug_2023A76_ seems like a 3D array, but this function refuses to match when I do that.
+#ifdef NONMATCHING
+void debug_sub_8010AAC(u8 a)
+{
+ switch (gBaseStats[gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][0]].genderRatio)
+ {
+ case 0:
+ gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][4] = 2;
+ break;
+ case 0xFE:
+ gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][4] = 3;
+ break;
+ case 0xFF:
+ gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][4] = 4;
+ break;
+ default:
+ gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][4] &= 1;
+ if (a != 0)
+ gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][4] ^= 1;
+ else
+ gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][4] = 0;
+ break;
+ }
+}
+#else
+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;
+ }
+}
+#endif
+
+void debug_sub_8010B80(u8 a)
+{
+ s8 r12 = 0;
+ s8 r7 = gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][gUnknown_Debug_030043A0];
+
+ 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_030043A4][gUnknown_Debug_030043A0]
+ = gUnknown_Debug_2023A76_[gUnknown_Debug_03004360][gUnknown_Debug_030043A4][gUnknown_Debug_030043A0]
+ = r12 * 10 + r7;
+}
+
+void debug_sub_8010CAC(void)
+{
+ s32 r5;
+
+ if (gMain.heldKeysRaw == 0x204)
+ DoSoftReset();
+ if (gMain.newKeysRaw == 4)
+ {
+ if (gUnknown_Debug_030043A4 < 6)
+ {
+ gUnknown_Debug_030043A8 = 0;
+ debug_sub_8012628();
+ SetMainCallback2(debug_sub_8011498);
+ }
+ //_546
+ 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: //_550
+ gCB2_AfterEvolution = debug_sub_80108B8;
+ EvolutionScene(&gPlayerParty[0], gUnknown_Debug_2023A76_[0][1][0], 1, 0);
+ break;
+ case 2: //_551
+ debug_sub_8012688();
+ break;
+ }
+ }
+ //_555
+ 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();
+ }
+ }
+ //_559
+ if (gMain.newKeysRaw == 8)
+ debug_sub_801174C();
+ if (gMain.newKeysRaw == 0x40)
+ {
+ 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();
+ }
+ //_562
+ if (gMain.newKeysRaw == 0x80)
+ {
+ 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();
+ }
+ //_567
+ if (gMain.newKeysRaw == 0x20)
+ {
+ 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);
+ }
+ }
+ //_577
+ debug_sub_80125A0();
+ }
+ //_572
+ if (gMain.newKeysRaw == 0x10)
+ {
+ 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();
+ }
+ //_578
+ 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];
+ }
+ //_613
+ 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;
+ }
+ }
+ //_607
+ 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];
+ }
+ //_644
+ if (gUnknown_Debug_030043A0 == 0)
+ {
+ debug_sub_8010AAC(0);
+ debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4);
+ }
+ //_645
+ debug_sub_8011EA0(gUnknown_Debug_030043A0 + gUnknown_Debug_030043A4 * 5);
+ debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
+ break;
+ }
+ }
+ //_638
+ if (gMain.newAndRepeatedKeys & 0x200)
+ {
+ if (gUnknown_Debug_030043A0 == 4 && gUnknown_Debug_030043A4 < 6)
+ {
+ debug_sub_8010AAC(1);
+ }
+ //_648
+ else
+ {
+ if (gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0 == 30)
+ {
+ debug_sub_8010B80(2);
+ }
+ //_652
+ 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];
+ }
+ }
+ //_653
+ if (gUnknown_Debug_030043A0 == 0)
+ {
+ debug_sub_8010AAC(0);
+ debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4);
+ }
+ //_658
+ debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0);
+ debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
+ }
+ //_646
+ if (gMain.newAndRepeatedKeys & 0x100)
+ {
+ if (gUnknown_Debug_030043A0 == 4 && gUnknown_Debug_030043A4 < 6)
+ {
+ debug_sub_8010AAC(1);
+ }
+ //_661
+ else
+ {
+ if (gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0 == 30)
+ {
+ debug_sub_8010B80(3);
+ }
+ //_665
+ 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];
+ }
+ }
+ //_666
+ if (gUnknown_Debug_030043A0 == 0)
+ {
+ debug_sub_8010AAC(0);
+ debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + 4);
+ }
+ //_671
+ debug_sub_8011EA0(gUnknown_Debug_030043A4 * 5 + gUnknown_Debug_030043A0);
+ debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
+ }
+ //_659
+ AnimateSprites();
+ BuildOamBuffer();
+}
+
+__attribute__((naked))
+void debug_sub_8011498()
+{
+ 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 r2, ._687 @ gUnknown_Debug_030043A0\n"
+ " ldr r0, ._687 + 4 @ gUnknown_Debug_030043A4\n"
+ " ldrb r1, [r0]\n"
+ " lsl r0, r1, #0x2\n"
+ " add r0, r0, r1\n"
+ " ldrb r2, [r2]\n"
+ " add r0, r0, r2\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " mov r9, r0\n"
+ " ldr r4, ._687 + 8 @ gMain\n"
+ " ldrh r1, [r4, #0x28]\n"
+ " mov r0, #0x81\n"
+ " lsl r0, r0, #0x2\n"
+ " cmp r1, r0\n"
+ " bne ._674 @cond_branch\n"
+ " bl DoSoftReset\n"
+ "._674:\n"
+ " ldrh r0, [r4, #0x2a]\n"
+ " cmp r0, #0x4\n"
+ " bne ._675 @cond_branch\n"
+ " bl debug_sub_8012658\n"
+ " ldr r0, ._687 + 12 @ debug_sub_8010CAC\n"
+ " bl SetMainCallback2\n"
+ "._675:\n"
+ " ldrh r0, [r4, #0x2a]\n"
+ " cmp r0, #0x8\n"
+ " bne ._676 @cond_branch\n"
+ " bl debug_sub_801174C\n"
+ "._676:\n"
+ " ldrh r0, [r4, #0x2a]\n"
+ " cmp r0, #0x40\n"
+ " beq ._677 @cond_branch\n"
+ " cmp r0, #0x80\n"
+ " bne ._678 @cond_branch\n"
+ "._677:\n"
+ " bl debug_sub_8012658\n"
+ " ldr r0, ._687 + 16 @ gUnknown_Debug_030043A8\n"
+ " ldrb r1, [r0]\n"
+ " mov r2, #0x2\n"
+ " eor r1, r1, r2\n"
+ " strb r1, [r0]\n"
+ " bl debug_sub_8012628\n"
+ "._678:\n"
+ " ldr r0, ._687 + 8 @ gMain\n"
+ " ldrh r0, [r0, #0x2a]\n"
+ " cmp r0, #0x20\n"
+ " beq ._679 @cond_branch\n"
+ " cmp r0, #0x10\n"
+ " bne ._680 @cond_branch\n"
+ "._679:\n"
+ " bl debug_sub_8012658\n"
+ " ldr r0, ._687 + 16 @ gUnknown_Debug_030043A8\n"
+ " ldrb r1, [r0]\n"
+ " mov r2, #0x1\n"
+ " eor r1, r1, r2\n"
+ " strb r1, [r0]\n"
+ " bl debug_sub_8012628\n"
+ "._680:\n"
+ " ldr r0, ._687 + 8 @ gMain\n"
+ " ldrh r1, [r0, #0x30]\n"
+ " mov r0, #0x2\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._681 @cond_branch\n"
+ " ldr r0, ._687 + 20 @ gUnknown_Debug_2023B02\n"
+ " mov r8, r0\n"
+ " ldr r6, ._687 + 16 @ gUnknown_Debug_030043A8\n"
+ " ldrb r4, [r6]\n"
+ " lsl r4, r4, #0x1\n"
+ " mov r0, r9\n"
+ " mov r1, #0x5\n"
+ " bl __udivsi3\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x15\n"
+ " add r4, r4, r0\n"
+ " ldr r5, ._687 + 24 @ gUnknown_Debug_03004360\n"
+ " ldrb r2, [r5]\n"
+ " lsl r1, r2, #0x1\n"
+ " add r1, r1, r2\n"
+ " lsl r1, r1, #0x4\n"
+ " add r4, r4, r1\n"
+ " add r4, r4, r8\n"
+ " ldrh r1, [r4]\n"
+ " sub r1, r1, #0x1\n"
+ " strh r1, [r4]\n"
+ " ldrb r3, [r6]\n"
+ " lsl r1, r3, #0x1\n"
+ " add r1, r1, r0\n"
+ " ldrb r2, [r5]\n"
+ " lsl r0, r2, #0x1\n"
+ " add r0, r0, r2\n"
+ " lsl r0, r0, #0x4\n"
+ " add r1, r1, r0\n"
+ " mov r0, r8\n"
+ " add r4, r1, r0\n"
+ " mov r0, #0x0\n"
+ " ldsh r1, [r4, r0]\n"
+ " ldr r5, ._687 + 28 @ gUnknown_Debug_821F564\n"
+ " lsl r0, r3, #0x2\n"
+ " add r0, r0, r3\n"
+ " lsl r2, r0, #0x1\n"
+ " add r0, r5, #0\n"
+ " add r0, r0, #0x8\n"
+ " add r0, r2, r0\n"
+ " ldrh r0, [r0]\n"
+ " cmp r1, r0\n"
+ " bge ._682 @cond_branch\n"
+ " add r0, r5, #6\n"
+ " add r0, r2, r0\n"
+ " ldrh r0, [r0]\n"
+ " strh r0, [r4]\n"
+ "._682:\n"
+ " bl debug_sub_8012294\n"
+ "._681:\n"
+ " ldr r0, ._687 + 8 @ gMain\n"
+ " ldrh r1, [r0, #0x30]\n"
+ " mov r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._683 @cond_branch\n"
+ " ldr r1, ._687 + 20 @ gUnknown_Debug_2023B02\n"
+ " mov r8, r1\n"
+ " ldr r6, ._687 + 16 @ gUnknown_Debug_030043A8\n"
+ " ldrb r4, [r6]\n"
+ " lsl r4, r4, #0x1\n"
+ " mov r0, r9\n"
+ " mov r1, #0x5\n"
+ " bl __udivsi3\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x15\n"
+ " add r4, r4, r0\n"
+ " ldr r5, ._687 + 24 @ gUnknown_Debug_03004360\n"
+ " ldrb r2, [r5]\n"
+ " lsl r1, r2, #0x1\n"
+ " add r1, r1, r2\n"
+ " lsl r1, r1, #0x4\n"
+ " add r4, r4, r1\n"
+ " add r4, r4, r8\n"
+ " ldrh r1, [r4]\n"
+ " add r1, r1, #0x1\n"
+ " strh r1, [r4]\n"
+ " ldrb r3, [r6]\n"
+ " lsl r1, r3, #0x1\n"
+ " add r1, r1, r0\n"
+ " ldrb r2, [r5]\n"
+ " lsl r0, r2, #0x1\n"
+ " add r0, r0, r2\n"
+ " lsl r0, r0, #0x4\n"
+ " add r1, r1, r0\n"
+ " mov r0, r8\n"
+ " add r4, r1, r0\n"
+ " mov r0, #0x0\n"
+ " ldsh r1, [r4, r0]\n"
+ " ldr r5, ._687 + 28 @ gUnknown_Debug_821F564\n"
+ " lsl r0, r3, #0x2\n"
+ " add r0, r0, r3\n"
+ " lsl r2, r0, #0x1\n"
+ " add r0, r5, #6\n"
+ " add r0, r2, r0\n"
+ " ldrh r0, [r0]\n"
+ " cmp r1, r0\n"
+ " ble ._684 @cond_branch\n"
+ " add r0, r5, #0\n"
+ " add r0, r0, #0x8\n"
+ " add r0, r2, r0\n"
+ " ldrh r0, [r0]\n"
+ " strh r0, [r4]\n"
+ "._684:\n"
+ " bl debug_sub_8012294\n"
+ "._683:\n"
+ " ldr r0, ._687 + 8 @ gMain\n"
+ " ldrh r1, [r0, #0x30]\n"
+ " mov r0, #0x80\n"
+ " lsl r0, r0, #0x2\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._685 @cond_branch\n"
+ " ldr r6, ._687 + 20 @ gUnknown_Debug_2023B02\n"
+ " ldr r5, ._687 + 16 @ gUnknown_Debug_030043A8\n"
+ " ldrb r4, [r5]\n"
+ " lsl r4, r4, #0x1\n"
+ " mov r0, r9\n"
+ " mov r1, #0x5\n"
+ " bl __udivsi3\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x15\n"
+ " add r4, r4, r0\n"
+ " ldr r2, ._687 + 24 @ gUnknown_Debug_03004360\n"
+ " ldrb r1, [r2]\n"
+ " lsl r0, r1, #0x1\n"
+ " add r0, r0, r1\n"
+ " lsl r0, r0, #0x4\n"
+ " add r4, r4, r0\n"
+ " add r4, r4, r6\n"
+ " ldrh r0, [r4]\n"
+ " sub r0, r0, #0xa\n"
+ " strh r0, [r4]\n"
+ " mov sl, r5\n"
+ " mov r8, r6\n"
+ " add r7, r2, #0\n"
+ " ldr r6, ._687 + 28 @ gUnknown_Debug_821F564\n"
+ " b ._686\n"
+ "._688:\n"
+ " .align 2, 0\n"
+ "._687:\n"
+ " .word gUnknown_Debug_030043A0\n"
+ " .word gUnknown_Debug_030043A4\n"
+ " .word gMain\n"
+ " .word debug_sub_8010CAC+1\n"
+ " .word gUnknown_Debug_030043A8\n"
+ " .word gUnknown_Debug_2023B02\n"
+ " .word gUnknown_Debug_03004360\n"
+ " .word gUnknown_Debug_821F564\n"
+ "._689:\n"
+ " add r0, r6, #6\n"
+ " add r0, r2, r0\n"
+ " ldrh r0, [r0]\n"
+ " ldrh r1, [r4]\n"
+ " add r0, r0, r1\n"
+ " strh r0, [r4]\n"
+ "._686:\n"
+ " mov r0, sl\n"
+ " ldrb r5, [r0]\n"
+ " lsl r4, r5, #0x1\n"
+ " mov r0, r9\n"
+ " mov r1, #0x5\n"
+ " bl __udivsi3\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x15\n"
+ " add r4, r4, r0\n"
+ " ldrb r1, [r7]\n"
+ " lsl r0, r1, #0x1\n"
+ " add r0, r0, r1\n"
+ " lsl r0, r0, #0x4\n"
+ " add r4, r4, r0\n"
+ " add r4, r4, r8\n"
+ " mov r0, #0x0\n"
+ " ldsh r1, [r4, r0]\n"
+ " lsl r0, r5, #0x2\n"
+ " add r0, r0, r5\n"
+ " lsl r2, r0, #0x1\n"
+ " add r0, r6, #0\n"
+ " add r0, r0, #0x8\n"
+ " add r0, r2, r0\n"
+ " ldrh r0, [r0]\n"
+ " cmp r1, r0\n"
+ " blt ._689 @cond_branch\n"
+ " bl debug_sub_8012294\n"
+ "._685:\n"
+ " ldr r0, ._692 @ gMain\n"
+ " ldrh r1, [r0, #0x30]\n"
+ " mov r0, #0x80\n"
+ " lsl r0, r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._690 @cond_branch\n"
+ " ldr r6, ._692 + 4 @ gUnknown_Debug_2023B02\n"
+ " ldr r5, ._692 + 8 @ gUnknown_Debug_030043A8\n"
+ " ldrb r4, [r5]\n"
+ " lsl r4, r4, #0x1\n"
+ " mov r0, r9\n"
+ " mov r1, #0x5\n"
+ " bl __udivsi3\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x15\n"
+ " add r4, r4, r0\n"
+ " ldr r2, ._692 + 12 @ gUnknown_Debug_03004360\n"
+ " ldrb r1, [r2]\n"
+ " lsl r0, r1, #0x1\n"
+ " add r0, r0, r1\n"
+ " lsl r0, r0, #0x4\n"
+ " add r4, r4, r0\n"
+ " add r4, r4, r6\n"
+ " ldrh r0, [r4]\n"
+ " add r0, r0, #0xa\n"
+ " strh r0, [r4]\n"
+ " mov sl, r5\n"
+ " mov r8, r6\n"
+ " add r7, r2, #0\n"
+ " ldr r6, ._692 + 16 @ gUnknown_Debug_821F564\n"
+ " b ._691\n"
+ "._693:\n"
+ " .align 2, 0\n"
+ "._692:\n"
+ " .word gMain\n"
+ " .word gUnknown_Debug_2023B02\n"
+ " .word gUnknown_Debug_030043A8\n"
+ " .word gUnknown_Debug_03004360\n"
+ " .word gUnknown_Debug_821F564\n"
+ "._694:\n"
+ " ldrh r0, [r4]\n"
+ " sub r0, r0, r1\n"
+ " strh r0, [r4]\n"
+ "._691:\n"
+ " mov r1, sl\n"
+ " ldrb r5, [r1]\n"
+ " lsl r4, r5, #0x1\n"
+ " mov r0, r9\n"
+ " mov r1, #0x5\n"
+ " bl __udivsi3\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x15\n"
+ " add r4, r4, r0\n"
+ " ldrb r1, [r7]\n"
+ " lsl r0, r1, #0x1\n"
+ " add r0, r0, r1\n"
+ " lsl r0, r0, #0x4\n"
+ " add r4, r4, r0\n"
+ " add r4, r4, r8\n"
+ " mov r0, #0x0\n"
+ " ldsh r2, [r4, r0]\n"
+ " lsl r0, r5, #0x2\n"
+ " add r0, r0, r5\n"
+ " lsl r0, r0, #0x1\n"
+ " add r1, r6, #6\n"
+ " add r0, r0, r1\n"
+ " ldrh r1, [r0]\n"
+ " cmp r2, r1\n"
+ " bgt ._694 @cond_branch\n"
+ " bl debug_sub_8012294\n"
+ "._690:\n"
+ " bl AnimateSprites\n"
+ " bl BuildOamBuffer\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"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_801174C()
+{
+ 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"
+ " mov r0, #0x0\n"
+ " mov r9, r0\n"
+ " ldr r1, ._704 @ gUnknown_020297ED\n"
+ " mov r0, #0x1\n"
+ " strb r0, [r1]\n"
+ " bl Random\n"
+ " add r4, r0, #0\n"
+ " lsl r4, r4, #0x10\n"
+ " lsr r4, r4, #0x10\n"
+ " mov r0, #0x3\n"
+ " and r4, r4, r0\n"
+ " lsl r4, r4, #0x18\n"
+ " lsr r6, r4, #0x18\n"
+ " ldr r5, ._704 + 4 @ gSaveBlock2\n"
+ " lsl r1, r6, #0x1\n"
+ " add r1, r1, r6\n"
+ " lsl r1, r1, #0x1\n"
+ " ldr r0, ._704 + 8 @ str_821F631\n"
+ " add r1, r1, r0\n"
+ " add r0, r5, #0\n"
+ " bl StringCopy\n"
+ " lsr r4, r4, #0x19\n"
+ " strb r4, [r5, #0x8]\n"
+ " bl ZeroPlayerPartyMons\n"
+ " bl ZeroEnemyPartyMons\n"
+ " ldr r0, ._704 + 12 @ gUnknown_Debug_2023A76\n"
+ " mov r1, #0x3c\n"
+ " ldsh r7, [r0, r1]\n"
+ " mov r2, r9\n"
+ " str r2, [sp, #0xc]\n"
+ " cmp r7, #0x9\n"
+ " ble ._695 @cond_branch\n"
+ " mov r0, #0x0\n"
+ "._696:\n"
+ " sub r7, r7, #0xa\n"
+ " add r0, r0, #0x1\n"
+ " cmp r7, #0x9\n"
+ " bgt ._696 @cond_branch\n"
+ " str r0, [sp, #0xc]\n"
+ "._695:\n"
+ " ldr r2, ._704 + 16 @ gBattleTypeFlags\n"
+ " ldr r1, ._704 + 20 @ gUnknown_Debug_821F598\n"
+ " sub r0, r7, #1\n"
+ " lsl r0, r0, #0x1\n"
+ " add r0, r0, r1\n"
+ " ldrh r3, [r0]\n"
+ " strh r3, [r2]\n"
+ " ldr r1, ._704 + 24 @ gUnknown_02023A14_50\n"
+ " mov r0, #0x8\n"
+ " strb r0, [r1]\n"
+ " ldr r1, ._704 + 28 @ gBattleTerrain\n"
+ " add r0, sp, #0xc\n"
+ " ldrb r0, [r0]\n"
+ " strb r0, [r1]\n"
+ " mov r0, #0x80\n"
+ " and r0, r0, r3\n"
+ " cmp r0, #0\n"
+ " beq ._697 @cond_branch\n"
+ " bl EnterSafariMode\n"
+ "._697:\n"
+ " ldr r5, ._704 + 12 @ gUnknown_Debug_2023A76\n"
+ " ldrh r0, [r5, #0x3c]\n"
+ " sub r0, r0, #0x2\n"
+ " lsl r0, r0, #0x10\n"
+ " lsr r0, r0, #0x10\n"
+ " cmp r0, #0x2\n"
+ " bhi ._698 @cond_branch\n"
+ " ldr r4, ._704 + 32 @ gTrainerBattleOpponent\n"
+ " bl Random\n"
+ " mov r1, #0x7\n"
+ " and r1, r1, r0\n"
+ " add r1, r1, #0x1\n"
+ " strh r1, [r4]\n"
+ "._698:\n"
+ " ldr r1, ._704 + 36 @ gPlayerPartyCount\n"
+ " mov r0, #0x0\n"
+ " strb r0, [r1]\n"
+ " mov r7, #0x0\n"
+ "._745:\n"
+ " lsl r0, r7, #0x1\n"
+ " ldr r3, ._704 + 12 @ gUnknown_Debug_2023A76\n"
+ " add r1, r0, r3\n"
+ " mov r2, #0x0\n"
+ " ldsh r1, [r1, r2]\n"
+ " add r2, r3, #0\n"
+ " mov r8, r0\n"
+ " add r3, r7, #5\n"
+ " mov sl, r3\n"
+ " cmp r1, #0\n"
+ " beq ._699 @cond_branch\n"
+ " add r0, r7, #4\n"
+ " lsl r0, r0, #0x1\n"
+ " add r1, r2, #0\n"
+ " add r0, r0, r1\n"
+ " mov r3, #0x0\n"
+ " ldsh r0, [r0, r3]\n"
+ " cmp r0, #0x1\n"
+ " beq ._707 @cond_branch\n"
+ " cmp r0, #0x1\n"
+ " bgt ._701 @cond_branch\n"
+ " cmp r0, #0\n"
+ " beq ._706 @cond_branch\n"
+ " b ._708\n"
+ "._705:\n"
+ " .align 2, 0\n"
+ "._704:\n"
+ " .word gUnknown_020297ED\n"
+ " .word gSaveBlock2\n"
+ " .word str_821F631\n"
+ " .word gUnknown_Debug_2023A76\n"
+ " .word gBattleTypeFlags\n"
+ " .word gUnknown_Debug_821F598\n"
+ " .word gUnknown_02023A14_50\n"
+ " .word gBattleTerrain\n"
+ " .word gTrainerBattleOpponent\n"
+ " .word gPlayerPartyCount\n"
+ "._701:\n"
+ " cmp r0, #0x2\n"
+ " beq ._706 @cond_branch\n"
+ " cmp r0, #0x3\n"
+ " beq ._707 @cond_branch\n"
+ " b ._708\n"
+ "._706:\n"
+ " mov r6, #0x0\n"
+ " b ._710\n"
+ "._707:\n"
+ " mov r6, #0xfe\n"
+ " b ._710\n"
+ "._708:\n"
+ " mov r6, #0xff\n"
+ "._710:\n"
+ " mov r1, r8\n"
+ " add r0, r1, r2\n"
+ " mov r3, #0x0\n"
+ " ldsh r0, [r0, r3]\n"
+ " add r1, r7, #5\n"
+ " mov sl, r1\n"
+ " cmp r0, #0xc9\n"
+ " bne ._712 @cond_branch\n"
+ " cmp r1, #0x1d\n"
+ " bgt ._712 @cond_branch\n"
+ " add r0, r7, #7\n"
+ " lsl r0, r0, #0x1\n"
+ " add r0, r0, r2\n"
+ " ldrb r0, [r0]\n"
+ " mov r9, r0\n"
+ " b ._713\n"
+ "._712:\n"
+ " mov r2, #0x0\n"
+ " mov r9, r2\n"
+ "._713:\n"
+ " add r0, r7, #0\n"
+ " mov r1, #0x5\n"
+ " bl __divsi3\n"
+ " mov r3, #0x64\n"
+ " mul r0, r0, r3\n"
+ " ldr r1, ._719 @ gEnemyParty\n"
+ " add r0, r0, r1\n"
+ " ldr r1, ._719 + 4 @ gUnknown_Debug_2023A76\n"
+ " add r1, r1, r8\n"
+ " ldrh r1, [r1]\n"
+ " add r2, r7, #1\n"
+ " lsl r2, r2, #0x1\n"
+ " ldr r3, ._719 + 4 @ gUnknown_Debug_2023A76\n"
+ " add r2, r2, r3\n"
+ " ldrb r2, [r2]\n"
+ " str r6, [sp]\n"
+ " mov r3, #0x0\n"
+ " str r3, [sp, #0x4]\n"
+ " mov r3, r9\n"
+ " str r3, [sp, #0x8]\n"
+ " mov r3, #0x0\n"
+ " bl CreateMonWithGenderNatureLetter\n"
+ "._699:\n"
+ " add r0, r7, #0\n"
+ " mov r1, #0x5\n"
+ " bl __divsi3\n"
+ " mov r2, #0x64\n"
+ " add r1, r0, #0\n"
+ " mul r1, r1, r2\n"
+ " ldr r0, ._719 @ gEnemyParty\n"
+ " add r5, r1, r0\n"
+ " ldr r4, ._719 + 8 @ gUnknown_Debug_2023A7A\n"
+ " mov r3, r8\n"
+ " add r6, r3, r4\n"
+ " add r0, r5, #0\n"
+ " mov r1, #0xc\n"
+ " add r2, r6, #0\n"
+ " bl SetMonData\n"
+ " sub r4, r4, #0x4\n"
+ " add r1, r7, #2\n"
+ " lsl r0, r1, #0x1\n"
+ " add r0, r0, r4\n"
+ " ldrh r0, [r0]\n"
+ " sub r0, r0, #0x1\n"
+ " lsl r0, r0, #0x10\n"
+ " lsr r0, r0, #0x10\n"
+ " str r1, [sp, #0x10]\n"
+ " cmp r0, #0xb\n"
+ " bhi ._714 @cond_branch\n"
+ " add r0, r5, #0\n"
+ " mov r1, #0x26\n"
+ " add r2, r6, #0\n"
+ " bl SetMonData\n"
+ "._714:\n"
+ " add r1, r7, #3\n"
+ " lsl r0, r1, #0x1\n"
+ " add r0, r0, r4\n"
+ " mov r3, #0x0\n"
+ " ldsh r2, [r0, r3]\n"
+ " str r1, [sp, #0x14]\n"
+ " cmp r2, #0\n"
+ " beq ._716 @cond_branch\n"
+ " cmp r2, #0x3\n"
+ " beq ._716 @cond_branch\n"
+ " cmp r2, #0x2\n"
+ " bgt ._717 @cond_branch\n"
+ " mov r1, #0x0\n"
+ " ldsh r0, [r0, r1]\n"
+ " sub r0, r0, #0x1\n"
+ " b ._718\n"
+ "._720:\n"
+ " .align 2, 0\n"
+ "._719:\n"
+ " .word gEnemyParty\n"
+ " .word gUnknown_Debug_2023A76\n"
+ " .word gUnknown_Debug_2023A7A\n"
+ "._717:\n"
+ " mov r2, #0x0\n"
+ " ldsh r0, [r0, r2]\n"
+ " sub r0, r0, #0x4\n"
+ "._718:\n"
+ " str r0, [sp, #0xc]\n"
+ " add r0, r7, #0\n"
+ " mov r1, #0x5\n"
+ " bl __divsi3\n"
+ " mov r3, #0x64\n"
+ " mul r0, r0, r3\n"
+ " ldr r1, ._726 @ gEnemyParty\n"
+ " add r0, r0, r1\n"
+ " mov r1, #0x2e\n"
+ " add r2, sp, #0xc\n"
+ " bl SetMonData\n"
+ "._716:\n"
+ " ldr r1, ._726 + 4 @ gUnknown_Debug_2023A76\n"
+ " add r1, r1, #0x46\n"
+ " mov r2, r8\n"
+ " add r0, r2, r1\n"
+ " mov r3, #0x0\n"
+ " ldsh r0, [r0, r3]\n"
+ " ldr r2, ._726 + 4 @ gUnknown_Debug_2023A76\n"
+ " cmp r0, #0\n"
+ " beq ._721 @cond_branch\n"
+ " add r0, r7, #4\n"
+ " lsl r0, r0, #0x1\n"
+ " add r0, r0, r1\n"
+ " mov r1, #0x0\n"
+ " ldsh r0, [r0, r1]\n"
+ " cmp r0, #0x1\n"
+ " beq ._729 @cond_branch\n"
+ " cmp r0, #0x1\n"
+ " bgt ._723 @cond_branch\n"
+ " cmp r0, #0\n"
+ " beq ._728 @cond_branch\n"
+ " b ._730\n"
+ "._727:\n"
+ " .align 2, 0\n"
+ "._726:\n"
+ " .word gEnemyParty\n"
+ " .word gUnknown_Debug_2023A76\n"
+ "._723:\n"
+ " cmp r0, #0x2\n"
+ " beq ._728 @cond_branch\n"
+ " cmp r0, #0x3\n"
+ " beq ._729 @cond_branch\n"
+ " b ._730\n"
+ "._728:\n"
+ " mov r6, #0x0\n"
+ " b ._732\n"
+ "._729:\n"
+ " mov r6, #0xfe\n"
+ " b ._732\n"
+ "._730:\n"
+ " mov r6, #0xff\n"
+ "._732:\n"
+ " add r1, r2, #0\n"
+ " add r1, r1, #0x46\n"
+ " mov r2, r8\n"
+ " add r0, r2, r1\n"
+ " mov r3, #0x0\n"
+ " ldsh r0, [r0, r3]\n"
+ " cmp r0, #0xc9\n"
+ " bne ._734 @cond_branch\n"
+ " mov r0, sl\n"
+ " cmp r0, #0x1d\n"
+ " bgt ._734 @cond_branch\n"
+ " add r0, r7, #7\n"
+ " lsl r0, r0, #0x1\n"
+ " add r0, r0, r1\n"
+ " ldrb r0, [r0]\n"
+ " mov r9, r0\n"
+ " b ._735\n"
+ "._734:\n"
+ " mov r1, #0x0\n"
+ " mov r9, r1\n"
+ "._735:\n"
+ " add r0, r7, #0\n"
+ " mov r1, #0x5\n"
+ " bl __divsi3\n"
+ " mov r2, #0x64\n"
+ " mul r0, r0, r2\n"
+ " ldr r1, ._741 @ gPlayerParty\n"
+ " add r0, r0, r1\n"
+ " ldr r1, ._741 + 4 @ gUnknown_Debug_2023ABC\n"
+ " add r1, r1, r8\n"
+ " ldrh r1, [r1]\n"
+ " add r2, r7, #1\n"
+ " lsl r2, r2, #0x1\n"
+ " ldr r3, ._741 + 4 @ gUnknown_Debug_2023ABC\n"
+ " add r2, r2, r3\n"
+ " ldrb r2, [r2]\n"
+ " str r6, [sp]\n"
+ " mov r3, #0x0\n"
+ " str r3, [sp, #0x4]\n"
+ " mov r3, r9\n"
+ " str r3, [sp, #0x8]\n"
+ " mov r3, #0x0\n"
+ " bl CreateMonWithGenderNatureLetter\n"
+ " ldr r1, ._741 + 8 @ gPlayerPartyCount\n"
+ " ldrb r0, [r1]\n"
+ " add r0, r0, #0x1\n"
+ " strb r0, [r1]\n"
+ "._721:\n"
+ " add r0, r7, #0\n"
+ " mov r1, #0x5\n"
+ " bl __divsi3\n"
+ " mov r2, #0x64\n"
+ " add r1, r0, #0\n"
+ " mul r1, r1, r2\n"
+ " ldr r0, ._741 @ gPlayerParty\n"
+ " add r4, r1, r0\n"
+ " ldr r0, ._741 + 12 @ gUnknown_Debug_2023AC0\n"
+ " mov r3, r8\n"
+ " add r5, r3, r0\n"
+ " add r0, r4, #0\n"
+ " mov r1, #0xc\n"
+ " add r2, r5, #0\n"
+ " bl SetMonData\n"
+ " ldr r1, [sp, #0x10]\n"
+ " lsl r0, r1, #0x1\n"
+ " ldr r2, ._741 + 16 @ gUnknown_Debug_2023A76\n"
+ " add r0, r0, r2\n"
+ " ldrh r0, [r0]\n"
+ " sub r0, r0, #0x1\n"
+ " lsl r0, r0, #0x10\n"
+ " lsr r0, r0, #0x10\n"
+ " cmp r0, #0xb\n"
+ " bhi ._736 @cond_branch\n"
+ " add r0, r4, #0\n"
+ " mov r1, #0x26\n"
+ " add r2, r5, #0\n"
+ " bl SetMonData\n"
+ "._736:\n"
+ " ldr r3, [sp, #0x14]\n"
+ " lsl r0, r3, #0x1\n"
+ " ldr r1, ._741 + 4 @ gUnknown_Debug_2023ABC\n"
+ " add r0, r0, r1\n"
+ " mov r2, #0x0\n"
+ " ldsh r1, [r0, r2]\n"
+ " cmp r1, #0\n"
+ " beq ._738 @cond_branch\n"
+ " cmp r1, #0x3\n"
+ " beq ._738 @cond_branch\n"
+ " cmp r1, #0x2\n"
+ " bgt ._739 @cond_branch\n"
+ " add r0, r1, #0\n"
+ " sub r0, r0, #0x1\n"
+ " b ._740\n"
+ "._742:\n"
+ " .align 2, 0\n"
+ "._741:\n"
+ " .word gPlayerParty\n"
+ " .word gUnknown_Debug_2023ABC\n"
+ " .word gPlayerPartyCount\n"
+ " .word gUnknown_Debug_2023AC0\n"
+ " .word gUnknown_Debug_2023A76\n"
+ "._739:\n"
+ " mov r1, #0x0\n"
+ " ldsh r0, [r0, r1]\n"
+ " sub r0, r0, #0x4\n"
+ "._740:\n"
+ " str r0, [sp, #0xc]\n"
+ " add r0, r7, #0\n"
+ " mov r1, #0x5\n"
+ " bl __divsi3\n"
+ " mov r2, #0x64\n"
+ " mul r0, r0, r2\n"
+ " ldr r1, ._750 @ gPlayerParty\n"
+ " add r0, r0, r1\n"
+ " mov r1, #0x2e\n"
+ " add r2, sp, #0xc\n"
+ " bl SetMonData\n"
+ "._738:\n"
+ " ldr r3, [sp, #0x14]\n"
+ " lsl r0, r3, #0x1\n"
+ " ldr r1, ._750 + 4 @ gUnknown_Debug_2023ABC\n"
+ " add r0, r0, r1\n"
+ " mov r2, #0x0\n"
+ " ldsh r0, [r0, r2]\n"
+ " cmp r0, #0x2\n"
+ " ble ._743 @cond_branch\n"
+ " add r0, r7, #0\n"
+ " mov r1, #0x5\n"
+ " bl __divsi3\n"
+ " mov r3, #0x64\n"
+ " mul r0, r0, r3\n"
+ " ldr r1, ._750 @ gPlayerParty\n"
+ " add r0, r0, r1\n"
+ " mov r1, #0x7\n"
+ " ldr r2, ._750 + 8 @ Str_821F649\n"
+ " bl SetMonData\n"
+ " ldr r2, ._750 + 12 @ gUnknown_02023A14_50\n"
+ " ldrb r0, [r2]\n"
+ " mov r1, #0x40\n"
+ " orr r0, r0, r1\n"
+ " strb r0, [r2]\n"
+ "._743:\n"
+ " mov r7, sl\n"
+ " cmp r7, #0x1d\n"
+ " bgt ._744 @cond_branch\n"
+ " b ._745\n"
+ "._744:\n"
+ " mov r0, #0x0\n"
+ " str r0, [sp, #0xc]\n"
+ " mov r0, #0x64\n"
+ " mov r8, r0\n"
+ " ldr r1, ._750 + 16 @ gUnknown_Debug_2023B02\n"
+ " mov r9, r1\n"
+ " ldr r2, ._750 @ gPlayerParty\n"
+ " mov sl, r2\n"
+ "._747:\n"
+ " mov r7, #0x0\n"
+ "._746:\n"
+ " ldr r2, [sp, #0xc]\n"
+ " mov r0, r8\n"
+ " mul r0, r0, r2\n"
+ " ldr r3, ._750 + 20 @ gEnemyParty\n"
+ " add r0, r0, r3\n"
+ " add r5, r7, #0\n"
+ " add r5, r5, #0xd\n"
+ " lsl r2, r2, #0x3\n"
+ " lsl r4, r7, #0x1\n"
+ " mov r3, r9\n"
+ " add r1, r4, r3\n"
+ " add r2, r2, r1\n"
+ " add r1, r5, #0\n"
+ " bl SetMonData\n"
+ " ldr r1, [sp, #0xc]\n"
+ " mov r0, r8\n"
+ " mul r0, r0, r1\n"
+ " ldr r2, ._750 + 20 @ gEnemyParty\n"
+ " add r0, r0, r2\n"
+ " add r6, r7, #0\n"
+ " add r6, r6, #0x11\n"
+ " lsl r1, r1, #0x3\n"
+ " add r1, r4, r1\n"
+ " add r1, r1, r9\n"
+ " mov r3, #0x0\n"
+ " ldsh r1, [r1, r3]\n"
+ " lsl r2, r1, #0x1\n"
+ " add r2, r2, r1\n"
+ " lsl r2, r2, #0x2\n"
+ " ldr r1, ._750 + 24 @ gBattleMoves\n"
+ " add r2, r2, r1\n"
+ " add r1, r6, #0\n"
+ " bl SetMonData\n"
+ " ldr r2, [sp, #0xc]\n"
+ " mov r0, r8\n"
+ " mul r0, r0, r2\n"
+ " add r0, r0, sl\n"
+ " lsl r2, r2, #0x3\n"
+ " ldr r3, ._750 + 28 @ gUnknown_Debug_2023B32\n"
+ " add r1, r4, r3\n"
+ " add r2, r2, r1\n"
+ " add r1, r5, #0\n"
+ " bl SetMonData\n"
+ " ldr r1, [sp, #0xc]\n"
+ " mov r0, r8\n"
+ " mul r0, r0, r1\n"
+ " add r0, r0, sl\n"
+ " lsl r1, r1, #0x3\n"
+ " add r4, r4, r1\n"
+ " ldr r1, ._750 + 28 @ gUnknown_Debug_2023B32\n"
+ " add r4, r4, r1\n"
+ " mov r2, #0x0\n"
+ " ldsh r1, [r4, r2]\n"
+ " lsl r2, r1, #0x1\n"
+ " add r2, r2, r1\n"
+ " lsl r2, r2, #0x2\n"
+ " ldr r3, ._750 + 24 @ gBattleMoves\n"
+ " add r2, r2, r3\n"
+ " add r1, r6, #0\n"
+ " bl SetMonData\n"
+ " add r7, r7, #0x1\n"
+ " cmp r7, #0x3\n"
+ " ble ._746 @cond_branch\n"
+ " ldr r0, [sp, #0xc]\n"
+ " add r0, r0, #0x1\n"
+ " str r0, [sp, #0xc]\n"
+ " cmp r0, #0x5\n"
+ " ble ._747 @cond_branch\n"
+ " ldr r3, ._750 + 32 @ gUnknown_Debug_2023A76\n"
+ " add r4, r3, #0\n"
+ " add r4, r4, #0x44\n"
+ " ldrh r1, [r4]\n"
+ " mov r2, #0x0\n"
+ " ldsh r0, [r4, r2]\n"
+ " cmp r0, #0x8\n"
+ " bne ._748 @cond_branch\n"
+ " ldr r0, ._750 + 12 @ gUnknown_02023A14_50\n"
+ " ldrb r1, [r0]\n"
+ " mov r2, #0x80\n"
+ " b ._753\n"
+ "._751:\n"
+ " .align 2, 0\n"
+ "._750:\n"
+ " .word gPlayerParty\n"
+ " .word gUnknown_Debug_2023ABC\n"
+ " .word Str_821F649\n"
+ " .word gUnknown_02023A14_50\n"
+ " .word gUnknown_Debug_2023B02\n"
+ " .word gEnemyParty\n"
+ " .word gBattleMoves+0x4\n"
+ " .word gUnknown_Debug_2023B32\n"
+ " .word gUnknown_Debug_2023A76\n"
+ "._748:\n"
+ " cmp r0, #0x7\n"
+ " bne ._752 @cond_branch\n"
+ " ldr r0, ._754 @ gUnknown_02023A14_50\n"
+ " ldrb r1, [r0]\n"
+ " mov r2, #0x20\n"
+ " b ._753\n"
+ "._755:\n"
+ " .align 2, 0\n"
+ "._754:\n"
+ " .word gUnknown_02023A14_50\n"
+ "._752:\n"
+ " cmp r0, #0x6\n"
+ " bne ._756 @cond_branch\n"
+ " ldr r2, ._759 @ gUnknown_02023A14_50\n"
+ " ldrb r0, [r2]\n"
+ " mov r1, #0x10\n"
+ " orr r0, r0, r1\n"
+ " strb r0, [r2]\n"
+ " ldrh r1, [r3, #0x4]\n"
+ " mov r2, #0x4\n"
+ " ldsh r0, [r3, r2]\n"
+ " cmp r0, #0x5\n"
+ " ble ._757 @cond_branch\n"
+ " ldr r0, ._759 + 4 @ gSharedMem\n"
+ " sub r1, r1, #0x2\n"
+ " ldr r3, ._759 + 8 @ 0x160a3\n"
+ " add r0, r0, r3\n"
+ " b ._761\n"
+ "._760:\n"
+ " .align 2, 0\n"
+ "._759:\n"
+ " .word gUnknown_02023A14_50\n"
+ " .word gSharedMem\n"
+ " .word 0x160a3\n"
+ "._757:\n"
+ " ldr r0, ._762 @ gSharedMem\n"
+ " ldr r2, ._762 + 4 @ 0x160a3\n"
+ " add r0, r0, r2\n"
+ " b ._761\n"
+ "._763:\n"
+ " .align 2, 0\n"
+ "._762:\n"
+ " .word gSharedMem\n"
+ " .word 0x160a3\n"
+ "._756:\n"
+ " cmp r0, #0x5\n"
+ " bne ._764 @cond_branch\n"
+ " ldr r0, ._766 @ gUnknown_02023A14_50\n"
+ " ldrb r1, [r0]\n"
+ " mov r2, #0x21\n"
+ "._753:\n"
+ " orr r1, r1, r2\n"
+ "._761:\n"
+ " strb r1, [r0]\n"
+ " bl sub_80408BC\n"
+ " b ._770\n"
+ "._767:\n"
+ " .align 2, 0\n"
+ "._766:\n"
+ " .word gUnknown_02023A14_50\n"
+ "._764:\n"
+ " mov r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " bne ._768 @cond_branch\n"
+ " bl sub_80408BC\n"
+ "._768:\n"
+ " ldrh r3, [r4]\n"
+ " mov r0, #0x2\n"
+ " and r0, r0, r3\n"
+ " cmp r0, #0\n"
+ " beq ._769 @cond_branch\n"
+ " ldr r0, ._772 @ gUnknown_02023A14_50\n"
+ " ldrb r1, [r0]\n"
+ " mov r2, #0x4\n"
+ " orr r1, r1, r2\n"
+ " strb r1, [r0]\n"
+ "._769:\n"
+ " mov r0, #0x4\n"
+ " and r0, r0, r3\n"
+ " cmp r0, #0\n"
+ " beq ._770 @cond_branch\n"
+ " ldr r0, ._772 @ gUnknown_02023A14_50\n"
+ " ldrb r1, [r0]\n"
+ " mov r2, #0x6\n"
+ " orr r1, r1, r2\n"
+ " strb r1, [r0]\n"
+ "._770:\n"
+ " ldr r0, ._772 + 4 @ gMain\n"
+ " ldr r1, ._772 + 8 @ debug_sub_80108B8\n"
+ " str r1, [r0, #0x8]\n"
+ " ldr r0, ._772 + 12 @ unref_sub_800D684\n"
+ " bl SetMainCallback2\n"
+ " bl ClearBag\n"
+ " mov r0, #0x1\n"
+ " mov r1, #0xa\n"
+ " bl AddBagItem\n"
+ " mov r0, #0x2\n"
+ " mov r1, #0xa\n"
+ " bl AddBagItem\n"
+ " mov r0, #0x3\n"
+ " mov r1, #0xa\n"
+ " bl AddBagItem\n"
+ " mov r0, #0x4\n"
+ " mov r1, #0xa\n"
+ " bl AddBagItem\n"
+ " mov r0, #0x5\n"
+ " mov r1, #0xa\n"
+ " bl AddBagItem\n"
+ " mov r0, #0x6\n"
+ " mov r1, #0xa\n"
+ " bl AddBagItem\n"
+ " mov r0, #0x7\n"
+ " mov r1, #0xa\n"
+ " bl AddBagItem\n"
+ " mov r0, #0x8\n"
+ " mov r1, #0xa\n"
+ " bl AddBagItem\n"
+ " mov r0, #0x9\n"
+ " mov r1, #0xa\n"
+ " bl AddBagItem\n"
+ " mov r0, #0xa\n"
+ " mov r1, #0xa\n"
+ " bl AddBagItem\n"
+ " mov r0, #0xb\n"
+ " mov r1, #0xa\n"
+ " bl AddBagItem\n"
+ " mov r0, #0xc\n"
+ " mov r1, #0xa\n"
+ " bl AddBagItem\n"
+ " mov r0, #0x13\n"
+ " mov r1, #0x63\n"
+ " bl AddBagItem\n"
+ " mov r0, #0x14\n"
+ " mov r1, #0x63\n"
+ " bl AddBagItem\n"
+ " mov r0, #0x19\n"
+ " mov r1, #0x63\n"
+ " bl AddBagItem\n"
+ " mov r0, #0x22\n"
+ " mov r1, #0x63\n"
+ " bl AddBagItem\n"
+ " mov r0, #0x23\n"
+ " mov r1, #0x63\n"
+ " bl AddBagItem\n"
+ " mov r0, #0x25\n"
+ " mov r1, #0x63\n"
+ " bl AddBagItem\n"
+ " mov r0, #0x49\n"
+ " mov r1, #0x63\n"
+ " bl AddBagItem\n"
+ " mov r0, #0x4a\n"
+ " mov r1, #0x63\n"
+ " bl AddBagItem\n"
+ " mov r0, #0x4b\n"
+ " mov r1, #0x63\n"
+ " bl AddBagItem\n"
+ " mov r0, #0x4c\n"
+ " mov r1, #0x63\n"
+ " bl AddBagItem\n"
+ " mov r0, #0x4d\n"
+ " mov r1, #0x63\n"
+ " bl AddBagItem\n"
+ " mov r0, #0x4e\n"
+ " mov r1, #0x63\n"
+ " bl AddBagItem\n"
+ " mov r0, #0x50\n"
+ " mov r1, #0x63\n"
+ " bl AddBagItem\n"
+ " ldr r4, ._772 + 16 @ gUnknown_Debug_821F5AC\n"
+ " mov r7, #0xe\n"
+ "._771:\n"
+ " add r0, r4, #0\n"
+ " bl sub_810CA34\n"
+ " add r4, r4, #0x8\n"
+ " sub r7, r7, #0x1\n"
+ " cmp r7, #0\n"
+ " bge ._771 @cond_branch\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"
+ "._773:\n"
+ " .align 2, 0\n"
+ "._772:\n"
+ " .word gUnknown_02023A14_50\n"
+ " .word gMain\n"
+ " .word debug_sub_80108B8+1\n"
+ " .word unref_sub_800D684+1\n"
+ " .word gUnknown_Debug_821F5AC\n"
+ "\n"
+ );
+}
+
+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;
+}
+
+__attribute__((naked))
+void debug_sub_8011EA0(u8 a)
+{
+ 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, #0xfffffff4\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r7, r0, #0x18\n"
+ " cmp r7, #0x22\n"
+ " bls ._782 @cond_branch\n"
+ " b ._815\n"
+ "._782:\n"
+ " lsl r0, r7, #0x2\n"
+ " ldr r1, ._785 @ \n"
+ " add r1, r0, r1\n"
+ " ldr r1, [r1]\n"
+ " str r0, [sp, #0x8]\n"
+ " mov pc, r1\n"
+ "._786:\n"
+ " .align 2, 0\n"
+ "._785:\n"
+ " .word ._784\n"
+ "._784:\n"
+ " .word ._812\n"
+ " .word ._817\n"
+ " .word ._814\n"
+ " .word ._815\n"
+ " .word ._816\n"
+ " .word ._812\n"
+ " .word ._817\n"
+ " .word ._814\n"
+ " .word ._815\n"
+ " .word ._816\n"
+ " .word ._812\n"
+ " .word ._817\n"
+ " .word ._814\n"
+ " .word ._815\n"
+ " .word ._816\n"
+ " .word ._812\n"
+ " .word ._817\n"
+ " .word ._814\n"
+ " .word ._815\n"
+ " .word ._816\n"
+ " .word ._812\n"
+ " .word ._817\n"
+ " .word ._814\n"
+ " .word ._815\n"
+ " .word ._816\n"
+ " .word ._812\n"
+ " .word ._817\n"
+ " .word ._814\n"
+ " .word ._815\n"
+ " .word ._816\n"
+ " .word ._817\n"
+ " .word ._848\n"
+ " .word ._848\n"
+ " .word ._848\n"
+ " .word ._848\n"
+ "._812:\n"
+ " mov r0, #0x0\n"
+ " mov r1, #0x14\n"
+ " bl debug_sub_8010A7C\n"
+ " ldr r6, ._823 @ gBattleTextBuff1\n"
+ " ldr r2, ._823 + 4 @ gUnknown_Debug_821F424\n"
+ " ldr r0, [sp, #0x8]\n"
+ " add r1, r0, r7\n"
+ " lsl r1, r1, #0x1\n"
+ " add r0, r1, r2\n"
+ " ldrh r0, [r0]\n"
+ " str r0, [sp, #0x4]\n"
+ " add r0, r2, #2\n"
+ " add r0, r1, r0\n"
+ " ldrb r0, [r0]\n"
+ " mov r8, r0\n"
+ " add r2, r2, #0x4\n"
+ " add r1, r1, r2\n"
+ " ldrb r1, [r1]\n"
+ " mov r9, r1\n"
+ " str r1, [sp]\n"
+ " ldr r0, ._823 + 8 @ gUnknown_Debug_03004370\n"
+ " add r1, r6, #0\n"
+ " ldr r2, [sp, #0x4]\n"
+ " mov r3, r8\n"
+ " bl Text_InitWindow\n"
+ " ldr r0, ._823 + 8 @ gUnknown_Debug_03004370\n"
+ " bl Text_PrintWindow8002F44\n"
+ " ldr r1, ._823 + 12 @ gUnknown_Debug_2023A76\n"
+ " mov sl, r1\n"
+ " lsl r4, r7, #0x1\n"
+ " ldr r5, ._823 + 16 @ gUnknown_Debug_03004360\n"
+ " ldrb r0, [r5]\n"
+ " mov r7, #0x46\n"
+ " mul r0, r0, r7\n"
+ " add r0, r4, r0\n"
+ " add r0, r0, sl\n"
+ " mov r2, #0x0\n"
+ " ldsh r1, [r0, r2]\n"
+ " add r0, r6, #0\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x3\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r2, #0xd3\n"
+ " lsl r2, r2, #0x1\n"
+ " ldrb r3, [r5]\n"
+ " lsl r3, r3, #0x5\n"
+ " add r3, r3, #0x19\n"
+ " lsl r3, r3, #0x18\n"
+ " lsr r3, r3, #0x18\n"
+ " mov r0, #0x0\n"
+ " str r0, [sp]\n"
+ " ldr r0, ._823 + 8 @ gUnknown_Debug_03004370\n"
+ " add r1, r6, #0\n"
+ " bl Text_InitWindow\n"
+ " ldr r0, ._823 + 8 @ gUnknown_Debug_03004370\n"
+ " bl Text_PrintWindow8002F44\n"
+ " mov r0, #0xff\n"
+ " strb r0, [r6]\n"
+ " ldrb r0, [r5]\n"
+ " mul r0, r0, r7\n"
+ " add r4, r4, r0\n"
+ " add r4, r4, sl\n"
+ " mov r0, #0x0\n"
+ " ldsh r1, [r4, r0]\n"
+ " mov r0, #0xb\n"
+ " mul r1, r1, r0\n"
+ " ldr r0, ._823 + 20 @ gSpeciesNames\n"
+ " add r1, r1, r0\n"
+ " add r0, r6, #0\n"
+ " bl StringAppend\n"
+ " mov r1, r9\n"
+ " str r1, [sp]\n"
+ " ldr r0, ._823 + 8 @ gUnknown_Debug_03004370\n"
+ " add r1, r6, #0\n"
+ " ldr r2, [sp, #0x4]\n"
+ " mov r3, r8\n"
+ " bl Text_InitWindow\n"
+ " ldr r0, ._823 + 8 @ gUnknown_Debug_03004370\n"
+ " bl Text_PrintWindow8002F44\n"
+ " b ._848\n"
+ "._824:\n"
+ " .align 2, 0\n"
+ "._823:\n"
+ " .word gBattleTextBuff1\n"
+ " .word gUnknown_Debug_821F424\n"
+ " .word gUnknown_Debug_03004370\n"
+ " .word gUnknown_Debug_2023A76\n"
+ " .word gUnknown_Debug_03004360\n"
+ " .word gSpeciesNames\n"
+ "._817:\n"
+ " ldr r6, ._826 @ gBattleTextBuff1\n"
+ " ldr r3, ._826 + 4 @ gUnknown_Debug_2023A76\n"
+ " lsl r1, r7, #0x1\n"
+ " ldr r0, ._826 + 8 @ gUnknown_Debug_03004360\n"
+ " ldrb r2, [r0]\n"
+ " mov r0, #0x46\n"
+ " mul r0, r0, r2\n"
+ " add r1, r1, r0\n"
+ " add r1, r1, r3\n"
+ " mov r2, #0x0\n"
+ " ldsh r1, [r1, r2]\n"
+ " add r0, r6, #0\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x3\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " b ._825\n"
+ "._827:\n"
+ " .align 2, 0\n"
+ "._826:\n"
+ " .word gBattleTextBuff1\n"
+ " .word gUnknown_Debug_2023A76\n"
+ " .word gUnknown_Debug_03004360\n"
+ "._814:\n"
+ " mov r0, #0x0\n"
+ " mov r1, #0x18\n"
+ " bl debug_sub_8010A7C\n"
+ " ldr r6, ._830 @ gUnknown_Debug_03004370\n"
+ " ldr r1, ._830 + 4 @ gBattleTextBuff1\n"
+ " mov sl, r1\n"
+ " ldr r4, ._830 + 8 @ gUnknown_Debug_821F424\n"
+ " ldr r2, [sp, #0x8]\n"
+ " add r1, r2, r7\n"
+ " lsl r1, r1, #0x1\n"
+ " add r0, r1, r4\n"
+ " ldrh r2, [r0]\n"
+ " add r0, r4, #2\n"
+ " add r0, r1, r0\n"
+ " ldrb r3, [r0]\n"
+ " add r4, r4, #0x4\n"
+ " add r1, r1, r4\n"
+ " ldrb r0, [r1]\n"
+ " str r0, [sp]\n"
+ " add r0, r6, #0\n"
+ " mov r1, sl\n"
+ " bl Text_InitWindow\n"
+ " add r0, r6, #0\n"
+ " bl Text_PrintWindow8002F44\n"
+ " lsl r4, r7, #0x1\n"
+ " ldr r5, ._830 + 12 @ gUnknown_Debug_03004360\n"
+ " ldrb r0, [r5]\n"
+ " mov r1, #0x46\n"
+ " mul r0, r0, r1\n"
+ " add r0, r4, r0\n"
+ " ldr r2, ._830 + 16 @ gUnknown_Debug_2023A76\n"
+ " add r0, r0, r2\n"
+ " mov r2, #0x0\n"
+ " ldsh r1, [r0, r2]\n"
+ " mov r0, sl\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x3\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r2, #0xd3\n"
+ " lsl r2, r2, #0x1\n"
+ " ldrb r3, [r5]\n"
+ " lsl r3, r3, #0x5\n"
+ " add r3, r3, #0x19\n"
+ " lsl r3, r3, #0x18\n"
+ " lsr r3, r3, #0x18\n"
+ " mov r0, #0x0\n"
+ " str r0, [sp]\n"
+ " add r0, r6, #0\n"
+ " mov r1, sl\n"
+ " bl Text_InitWindow\n"
+ " add r0, r6, #0\n"
+ " bl Text_PrintWindow8002F44\n"
+ " mov r0, #0xff\n"
+ " mov r1, sl\n"
+ " strb r0, [r1]\n"
+ " ldrb r0, [r5]\n"
+ " mov r2, #0x46\n"
+ " mul r0, r0, r2\n"
+ " add r4, r4, r0\n"
+ " ldr r0, ._830 + 16 @ gUnknown_Debug_2023A76\n"
+ " add r4, r4, r0\n"
+ " mov r1, #0x0\n"
+ " ldsh r0, [r4, r1]\n"
+ " cmp r0, #0\n"
+ " beq ._828 @cond_branch\n"
+ " ldrh r0, [r4]\n"
+ " bl ItemId_GetItem\n"
+ " add r1, r0, #0\n"
+ " mov r0, sl\n"
+ " bl StringAppend\n"
+ " b ._829\n"
+ "._831:\n"
+ " .align 2, 0\n"
+ "._830:\n"
+ " .word gUnknown_Debug_03004370\n"
+ " .word gBattleTextBuff1\n"
+ " .word gUnknown_Debug_821F424\n"
+ " .word gUnknown_Debug_03004360\n"
+ " .word gUnknown_Debug_2023A76\n"
+ "._828:\n"
+ " ldr r1, ._833 @ Str_821F624\n"
+ " mov r0, sl\n"
+ " bl StringAppend\n"
+ "._829:\n"
+ " ldr r6, ._833 + 4 @ gUnknown_Debug_03004370\n"
+ " ldr r1, ._833 + 8 @ gBattleTextBuff1\n"
+ " ldr r5, ._833 + 12 @ gUnknown_Debug_821F424\n"
+ " ldr r2, [sp, #0x8]\n"
+ " add r4, r2, r7\n"
+ " lsl r4, r4, #0x1\n"
+ " add r0, r4, r5\n"
+ " ldrh r2, [r0]\n"
+ " add r0, r5, #2\n"
+ " add r0, r4, r0\n"
+ " ldrb r3, [r0]\n"
+ " add r5, r5, #0x4\n"
+ " add r4, r4, r5\n"
+ " ldrb r0, [r4]\n"
+ " str r0, [sp]\n"
+ " add r0, r6, #0\n"
+ " bl Text_InitWindow\n"
+ " add r0, r6, #0\n"
+ " bl Text_PrintWindow8002F44\n"
+ " b ._848\n"
+ "._834:\n"
+ " .align 2, 0\n"
+ "._833:\n"
+ " .word Str_821F624\n"
+ " .word gUnknown_Debug_03004370\n"
+ " .word gBattleTextBuff1\n"
+ " .word gUnknown_Debug_821F424\n"
+ "._816:\n"
+ " mov r0, #0x0\n"
+ " mov r1, #0x4\n"
+ " bl debug_sub_8010A7C\n"
+ " ldr r5, ._839 @ gUnknown_Debug_03004370\n"
+ " ldr r6, ._839 + 4 @ gBattleTextBuff1\n"
+ " ldr r4, ._839 + 8 @ gUnknown_Debug_821F424\n"
+ " ldr r0, [sp, #0x8]\n"
+ " add r1, r0, r7\n"
+ " lsl r1, r1, #0x1\n"
+ " add r0, r1, r4\n"
+ " ldrh r2, [r0]\n"
+ " add r0, r4, #2\n"
+ " add r0, r1, r0\n"
+ " ldrb r3, [r0]\n"
+ " add r4, r4, #0x4\n"
+ " add r1, r1, r4\n"
+ " ldrb r0, [r1]\n"
+ " str r0, [sp]\n"
+ " add r0, r5, #0\n"
+ " add r1, r6, #0\n"
+ " bl Text_InitWindow\n"
+ " add r0, r5, #0\n"
+ " bl Text_PrintWindow8002F44\n"
+ " mov r4, #0x0\n"
+ " ldr r3, ._839 + 12 @ gUnknown_Debug_2023A76\n"
+ " lsl r1, r7, #0x1\n"
+ " ldr r0, ._839 + 16 @ gUnknown_Debug_03004360\n"
+ " ldrb r2, [r0]\n"
+ " mov r0, #0x46\n"
+ " mul r0, r0, r2\n"
+ " add r1, r1, r0\n"
+ " add r1, r1, r3\n"
+ " mov r2, #0x0\n"
+ " ldsh r0, [r1, r2]\n"
+ " cmp r0, #0x1\n"
+ " beq ._835 @cond_branch\n"
+ " cmp r0, #0x1\n"
+ " bgt ._836 @cond_branch\n"
+ " cmp r0, #0\n"
+ " beq ._837 @cond_branch\n"
+ " b ._843\n"
+ "._840:\n"
+ " .align 2, 0\n"
+ "._839:\n"
+ " .word gUnknown_Debug_03004370\n"
+ " .word gBattleTextBuff1\n"
+ " .word gUnknown_Debug_821F424\n"
+ " .word gUnknown_Debug_2023A76\n"
+ " .word gUnknown_Debug_03004360\n"
+ "._836:\n"
+ " cmp r0, #0x2\n"
+ " beq ._841 @cond_branch\n"
+ " cmp r0, #0x3\n"
+ " beq ._842 @cond_branch\n"
+ " b ._843\n"
+ "._837:\n"
+ " mov r0, #0xb5\n"
+ " b ._844\n"
+ "._835:\n"
+ " mov r0, #0xb6\n"
+ "._844:\n"
+ " strb r0, [r6]\n"
+ " mov r4, #0x1\n"
+ " b ._847\n"
+ "._841:\n"
+ " mov r0, #0xb5\n"
+ " b ._846\n"
+ "._842:\n"
+ " mov r0, #0xb6\n"
+ "._846:\n"
+ " strb r0, [r6]\n"
+ " strb r0, [r6, #0x1]\n"
+ " mov r4, #0x2\n"
+ " b ._847\n"
+ "._843:\n"
+ " ldr r2, ._849 @ gBattleTextBuff1\n"
+ " add r1, r4, r2\n"
+ " mov r0, #0xac\n"
+ " strb r0, [r1]\n"
+ " add r4, r4, #0x1\n"
+ " add r6, r2, #0\n"
+ "._847:\n"
+ " add r1, r4, r6\n"
+ " mov r0, #0xff\n"
+ " strb r0, [r1]\n"
+ "._825:\n"
+ " ldr r5, ._849 + 4 @ gUnknown_Debug_03004370\n"
+ " ldr r4, ._849 + 8 @ gUnknown_Debug_821F424\n"
+ " ldr r0, [sp, #0x8]\n"
+ " add r1, r0, r7\n"
+ " lsl r1, r1, #0x1\n"
+ " add r0, r1, r4\n"
+ " ldrh r2, [r0]\n"
+ " add r0, r4, #2\n"
+ " add r0, r1, r0\n"
+ " ldrb r3, [r0]\n"
+ " add r4, r4, #0x4\n"
+ " add r1, r1, r4\n"
+ " ldrb r0, [r1]\n"
+ " str r0, [sp]\n"
+ " add r0, r5, #0\n"
+ " add r1, r6, #0\n"
+ " bl Text_InitWindow\n"
+ " add r0, r5, #0\n"
+ " bl Text_PrintWindow8002F44\n"
+ " b ._848\n"
+ "._850:\n"
+ " .align 2, 0\n"
+ "._849:\n"
+ " .word gBattleTextBuff1\n"
+ " .word gUnknown_Debug_03004370\n"
+ " .word gUnknown_Debug_821F424\n"
+ "._815:\n"
+ " ldr r6, ._851 @ gBattleTextBuff1\n"
+ " ldr r3, ._851 + 4 @ gUnknown_Debug_2023A76\n"
+ " lsl r1, r7, #0x1\n"
+ " ldr r0, ._851 + 8 @ gUnknown_Debug_03004360\n"
+ " ldrb r2, [r0]\n"
+ " mov r0, #0x46\n"
+ " mul r0, r0, r2\n"
+ " add r1, r1, r0\n"
+ " add r1, r1, r3\n"
+ " mov r2, #0x0\n"
+ " ldsh r1, [r1, r2]\n"
+ " add r0, r6, #0\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x1\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " ldr r5, ._851 + 12 @ gUnknown_Debug_03004370\n"
+ " ldr r4, ._851 + 16 @ gUnknown_Debug_821F424\n"
+ " lsl r1, r7, #0x2\n"
+ " add r1, r1, r7\n"
+ " lsl r1, r1, #0x1\n"
+ " add r0, r1, r4\n"
+ " ldrh r2, [r0]\n"
+ " add r0, r4, #2\n"
+ " add r0, r1, r0\n"
+ " ldrb r3, [r0]\n"
+ " add r4, r4, #0x4\n"
+ " add r1, r1, r4\n"
+ " ldrb r0, [r1]\n"
+ " str r0, [sp]\n"
+ " add r0, r5, #0\n"
+ " add r1, r6, #0\n"
+ " bl Text_InitWindow\n"
+ " add r0, r5, #0\n"
+ " bl Text_PrintWindow8002F44\n"
+ "._848:\n"
+ " add sp, sp, #0xc\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"
+ "._852:\n"
+ " .align 2, 0\n"
+ "._851:\n"
+ " .word gBattleTextBuff1\n"
+ " .word gUnknown_Debug_2023A76\n"
+ " .word gUnknown_Debug_03004360\n"
+ " .word gUnknown_Debug_03004370\n"
+ " .word gUnknown_Debug_821F424\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_8012294()
+{
+ 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"
+ " ldr r2, ._854 @ gUnknown_Debug_030043A0\n"
+ " ldr r0, ._854 + 4 @ gUnknown_Debug_030043A4\n"
+ " ldrb r1, [r0]\n"
+ " lsl r0, r1, #0x2\n"
+ " add r0, r0, r1\n"
+ " ldrb r2, [r2]\n"
+ " add r0, r0, r2\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r5, r0, #0x18\n"
+ " cmp r5, #0x1d\n"
+ " bhi ._853 @cond_branch\n"
+ " mov r0, #0x0\n"
+ " mov r1, #0x18\n"
+ " bl debug_sub_8010A7C\n"
+ " ldr r0, ._854 + 8 @ gUnknown_Debug_03004370\n"
+ " mov sl, r0\n"
+ " ldr r1, ._854 + 12 @ gBattleTextBuff1\n"
+ " mov r9, r1\n"
+ " ldr r2, ._854 + 16 @ gUnknown_Debug_821F564\n"
+ " mov r8, r2\n"
+ " ldr r7, ._854 + 20 @ gUnknown_Debug_030043A8\n"
+ " ldrb r1, [r7]\n"
+ " lsl r0, r1, #0x2\n"
+ " add r0, r0, r1\n"
+ " lsl r0, r0, #0x1\n"
+ " add r1, r0, r2\n"
+ " ldrh r2, [r1]\n"
+ " ldr r3, ._854 + 24 @ gUnknown_Debug_821F566\n"
+ " add r1, r0, r3\n"
+ " ldrb r3, [r1]\n"
+ " ldr r1, ._854 + 28 @ gUnknown_Debug_821F568\n"
+ " add r0, r0, r1\n"
+ " ldrb r0, [r0]\n"
+ " str r0, [sp]\n"
+ " mov r0, sl\n"
+ " mov r1, r9\n"
+ " bl Text_InitWindow\n"
+ " mov r0, sl\n"
+ " bl Text_PrintWindow8002F44\n"
+ " ldrb r4, [r7]\n"
+ " lsl r4, r4, #0x1\n"
+ " add r0, r5, #0\n"
+ " mov r1, #0x5\n"
+ " bl __udivsi3\n"
+ " add r5, r0, #0\n"
+ " lsl r5, r5, #0x18\n"
+ " lsr r5, r5, #0x15\n"
+ " add r4, r4, r5\n"
+ " ldr r6, ._854 + 32 @ gUnknown_Debug_03004360\n"
+ " ldrb r1, [r6]\n"
+ " lsl r0, r1, #0x1\n"
+ " add r0, r0, r1\n"
+ " lsl r0, r0, #0x4\n"
+ " add r4, r4, r0\n"
+ " ldr r2, ._854 + 36 @ gUnknown_Debug_2023B02\n"
+ " add r4, r4, r2\n"
+ " mov r3, #0x0\n"
+ " ldsh r1, [r4, r3]\n"
+ " mov r0, r9\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x3\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r2, #0xd3\n"
+ " lsl r2, r2, #0x1\n"
+ " ldrb r3, [r6]\n"
+ " lsl r3, r3, #0x5\n"
+ " add r3, r3, #0x19\n"
+ " lsl r3, r3, #0x18\n"
+ " lsr r3, r3, #0x18\n"
+ " mov r0, #0x0\n"
+ " str r0, [sp]\n"
+ " mov r0, sl\n"
+ " mov r1, r9\n"
+ " bl Text_InitWindow\n"
+ " mov r0, sl\n"
+ " bl Text_PrintWindow8002F44\n"
+ " mov r0, #0xff\n"
+ " mov r1, r9\n"
+ " strb r0, [r1]\n"
+ " ldrb r1, [r7]\n"
+ " lsl r1, r1, #0x1\n"
+ " add r1, r1, r5\n"
+ " ldrb r2, [r6]\n"
+ " lsl r0, r2, #0x1\n"
+ " add r0, r0, r2\n"
+ " lsl r0, r0, #0x4\n"
+ " add r1, r1, r0\n"
+ " ldr r2, ._854 + 36 @ gUnknown_Debug_2023B02\n"
+ " add r1, r1, r2\n"
+ " mov r3, #0x0\n"
+ " ldsh r1, [r1, r3]\n"
+ " mov r0, #0xd\n"
+ " mul r1, r1, r0\n"
+ " ldr r0, ._854 + 40 @ gMoveNames\n"
+ " add r1, r1, r0\n"
+ " mov r0, r9\n"
+ " bl StringAppend\n"
+ " ldrb r1, [r7]\n"
+ " lsl r0, r1, #0x2\n"
+ " add r0, r0, r1\n"
+ " lsl r0, r0, #0x1\n"
+ " add r8, r8, r0\n"
+ " mov r1, r8\n"
+ " ldrh r2, [r1]\n"
+ " ldr r3, ._854 + 24 @ gUnknown_Debug_821F566\n"
+ " add r1, r0, r3\n"
+ " ldrb r3, [r1]\n"
+ " ldr r1, ._854 + 28 @ gUnknown_Debug_821F568\n"
+ " add r0, r0, r1\n"
+ " ldrb r0, [r0]\n"
+ " str r0, [sp]\n"
+ " mov r0, sl\n"
+ " mov r1, r9\n"
+ " bl Text_InitWindow\n"
+ " mov r0, sl\n"
+ " bl Text_PrintWindow8002F44\n"
+ "._853:\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"
+ "._855:\n"
+ " .align 2, 0\n"
+ "._854:\n"
+ " .word gUnknown_Debug_030043A0\n"
+ " .word gUnknown_Debug_030043A4\n"
+ " .word gUnknown_Debug_03004370\n"
+ " .word gBattleTextBuff1\n"
+ " .word gUnknown_Debug_821F564\n"
+ " .word gUnknown_Debug_030043A8\n"
+ " .word gUnknown_Debug_821F566\n"
+ " .word gUnknown_Debug_821F568\n"
+ " .word gUnknown_Debug_03004360\n"
+ " .word gUnknown_Debug_2023B02\n"
+ " .word gMoveNames\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_80123D8(u8 a)
+{
+ 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"
+ " lsl r0, r0, #0x18\n"
+ " lsr r5, r0, #0x18\n"
+ " cmp r5, #0x1d\n"
+ " bhi ._856 @cond_branch\n"
+ " mov r0, #0x0\n"
+ " mov r1, #0x12\n"
+ " bl debug_sub_8010A7C\n"
+ " ldr r4, ._858 @ gUnknown_Debug_03004370\n"
+ " ldr r0, ._858 + 4 @ gBattleTextBuff1\n"
+ " mov r8, r0\n"
+ " ldr r6, ._858 + 8 @ gUnknown_Debug_821F58C\n"
+ " ldrh r1, [r6]\n"
+ " mov sl, r1\n"
+ " ldrb r7, [r6, #0x2]\n"
+ " ldrb r2, [r6, #0x4]\n"
+ " mov r9, r2\n"
+ " str r2, [sp]\n"
+ " add r0, r4, #0\n"
+ " mov r1, r8\n"
+ " mov r2, sl\n"
+ " add r3, r7, #0\n"
+ " bl Text_InitWindow\n"
+ " add r0, r4, #0\n"
+ " bl Text_PrintWindow8002F44\n"
+ " lsl r5, r5, #0x1\n"
+ " ldr r1, ._858 + 12 @ gUnknown_Debug_03004360\n"
+ " ldrb r0, [r1]\n"
+ " mov r2, #0x46\n"
+ " mul r0, r0, r2\n"
+ " add r0, r5, r0\n"
+ " ldr r1, ._858 + 16 @ gUnknown_Debug_2023A76\n"
+ " add r0, r0, r1\n"
+ " mov r2, #0x0\n"
+ " ldsh r1, [r0, r2]\n"
+ " lsl r0, r1, #0x3\n"
+ " sub r0, r0, r1\n"
+ " lsl r0, r0, #0x2\n"
+ " ldr r1, ._858 + 20 @ gBaseStats\n"
+ " add r0, r0, r1\n"
+ " ldrb r0, [r0, #0x16]\n"
+ " mov r2, #0xd\n"
+ " add r1, r0, #0\n"
+ " mul r1, r1, r2\n"
+ " ldr r0, ._858 + 24 @ gAbilityNames\n"
+ " add r1, r1, r0\n"
+ " mov r0, r8\n"
+ " bl StringCopy\n"
+ " mov r1, r9\n"
+ " str r1, [sp]\n"
+ " add r0, r4, #0\n"
+ " mov r1, r8\n"
+ " mov r2, sl\n"
+ " add r3, r7, #0\n"
+ " bl Text_InitWindow\n"
+ " add r0, r4, #0\n"
+ " bl Text_PrintWindow8002F44\n"
+ " mov r0, #0x0\n"
+ " mov r1, #0x12\n"
+ " bl debug_sub_8010A7C\n"
+ " ldrh r2, [r6, #0x6]\n"
+ " mov r9, r2\n"
+ " ldrb r0, [r6, #0x8]\n"
+ " mov sl, r0\n"
+ " ldrb r6, [r6, #0xa]\n"
+ " str r6, [sp]\n"
+ " add r0, r4, #0\n"
+ " mov r1, r8\n"
+ " mov r3, sl\n"
+ " bl Text_InitWindow\n"
+ " add r0, r4, #0\n"
+ " bl Text_PrintWindow8002F44\n"
+ " ldr r1, ._858 + 12 @ gUnknown_Debug_03004360\n"
+ " ldrb r0, [r1]\n"
+ " mov r2, #0x46\n"
+ " mul r0, r0, r2\n"
+ " add r5, r5, r0\n"
+ " ldr r0, ._858 + 16 @ gUnknown_Debug_2023A76\n"
+ " add r5, r5, r0\n"
+ " mov r2, #0x0\n"
+ " ldsh r1, [r5, r2]\n"
+ " lsl r0, r1, #0x3\n"
+ " sub r0, r0, r1\n"
+ " lsl r0, r0, #0x2\n"
+ " ldr r1, ._858 + 20 @ gBaseStats\n"
+ " add r0, r0, r1\n"
+ " ldrb r0, [r0, #0x17]\n"
+ " mov r2, #0xd\n"
+ " add r1, r0, #0\n"
+ " mul r1, r1, r2\n"
+ " ldr r0, ._858 + 24 @ gAbilityNames\n"
+ " add r1, r1, r0\n"
+ " mov r0, r8\n"
+ " bl StringCopy\n"
+ " str r6, [sp]\n"
+ " add r0, r4, #0\n"
+ " mov r1, r8\n"
+ " mov r2, r9\n"
+ " mov r3, sl\n"
+ " bl Text_InitWindow\n"
+ " add r0, r4, #0\n"
+ " bl Text_PrintWindow8002F44\n"
+ " b ._857\n"
+ "._859:\n"
+ " .align 2, 0\n"
+ "._858:\n"
+ " .word gUnknown_Debug_03004370\n"
+ " .word gBattleTextBuff1\n"
+ " .word gUnknown_Debug_821F58C\n"
+ " .word gUnknown_Debug_03004360\n"
+ " .word gUnknown_Debug_2023A76\n"
+ " .word gBaseStats\n"
+ " .word gAbilityNames\n"
+ "._856:\n"
+ " ldr r6, ._860 @ gBattleTextBuff1\n"
+ " ldr r1, ._860 + 4 @ gAbilityNames\n"
+ " add r0, r6, #0\n"
+ " bl StringCopy\n"
+ " ldr r5, ._860 + 8 @ gUnknown_Debug_03004370\n"
+ " ldr r4, ._860 + 12 @ gUnknown_Debug_821F58C\n"
+ " ldrh r2, [r4]\n"
+ " ldrb r3, [r4, #0x2]\n"
+ " ldrb r0, [r4, #0x4]\n"
+ " str r0, [sp]\n"
+ " add r0, r5, #0\n"
+ " add r1, r6, #0\n"
+ " bl Text_InitWindow\n"
+ " add r0, r5, #0\n"
+ " bl Text_PrintWindow8002F44\n"
+ " ldrh r2, [r4, #0x6]\n"
+ " ldrb r3, [r4, #0x8]\n"
+ " ldrb r0, [r4, #0xa]\n"
+ " str r0, [sp]\n"
+ " add r0, r5, #0\n"
+ " add r1, r6, #0\n"
+ " bl Text_InitWindow\n"
+ " add r0, r5, #0\n"
+ " bl Text_PrintWindow8002F44\n"
+ "._857:\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"
+ "._861:\n"
+ " .align 2, 0\n"
+ "._860:\n"
+ " .word gBattleTextBuff1\n"
+ " .word gAbilityNames\n"
+ " .word gUnknown_Debug_03004370\n"
+ " .word gUnknown_Debug_821F58C\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_8012540()
+{
+ asm(
+ " push {r4, r5, r6, lr}\n"
+ " add sp, sp, #0xfffffffc\n"
+ " ldr r5, ._862 @ gBattleTextBuff1\n"
+ " ldr r0, ._862 + 4 @ gUnknown_Debug_2023A76\n"
+ " add r0, r0, #0x44\n"
+ " mov r2, #0x0\n"
+ " ldsh r1, [r0, r2]\n"
+ " add r0, r5, #0\n"
+ " mov r2, #0x0\n"
+ " mov r3, #0x1\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " ldr r4, ._862 + 8 @ gUnknown_Debug_03004370\n"
+ " ldr r1, ._862 + 12 @ gUnknown_Debug_821F424\n"
+ " mov r3, #0x9b\n"
+ " lsl r3, r3, #0x1\n"
+ " add r0, r1, r3\n"
+ " ldrh r2, [r0]\n"
+ " mov r6, #0x9c\n"
+ " lsl r6, r6, #0x1\n"
+ " add r0, r1, r6\n"
+ " ldrb r3, [r0]\n"
+ " add r6, r6, #0x2\n"
+ " add r0, r1, r6\n"
+ " ldrb r0, [r0]\n"
+ " str r0, [sp]\n"
+ " add r0, r4, #0\n"
+ " add r1, r5, #0\n"
+ " bl Text_InitWindow\n"
+ " add r0, r4, #0\n"
+ " bl Text_PrintWindow8002F44\n"
+ " add sp, sp, #0x4\n"
+ " pop {r4, r5, r6}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._863:\n"
+ " .align 2, 0\n"
+ "._862:\n"
+ " .word gBattleTextBuff1\n"
+ " .word gUnknown_Debug_2023A76\n"
+ " .word gUnknown_Debug_03004370\n"
+ " .word gUnknown_Debug_821F424\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_nullsub_3()
+{
+ asm(
+ " bx lr\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_80125A0()
+{
+ asm(
+ " push {r4, lr}\n"
+ " ldr r4, ._864 @ gSharedMem\n"
+ " ldr r3, ._864 + 4 @ gUnknown_Debug_821F680\n"
+ " ldr r2, ._864 + 8 @ gUnknown_Debug_030043A0\n"
+ " ldr r0, ._864 + 12 @ gUnknown_Debug_030043A4\n"
+ " ldrb r1, [r0]\n"
+ " lsl r0, r1, #0x2\n"
+ " add r0, r0, r1\n"
+ " ldrb r2, [r2]\n"
+ " add r0, r0, r2\n"
+ " lsl r0, r0, #0x2\n"
+ " ldr r1, ._864 + 16 @ gUnknown_Debug_03004360\n"
+ " ldrb r2, [r1]\n"
+ " mov r1, #0x8c\n"
+ " mul r1, r1, r2\n"
+ " add r0, r0, r1\n"
+ " add r0, r0, r3\n"
+ " ldr r0, [r0]\n"
+ " add r0, r0, r4\n"
+ " mov r1, #0x6d\n"
+ " strb r1, [r0]\n"
+ " pop {r4}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._865:\n"
+ " .align 2, 0\n"
+ "._864:\n"
+ " .word gSharedMem\n"
+ " .word gUnknown_Debug_821F680\n"
+ " .word gUnknown_Debug_030043A0\n"
+ " .word gUnknown_Debug_030043A4\n"
+ " .word gUnknown_Debug_03004360\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_80125E4()
+{
+ asm(
+ " push {r4, lr}\n"
+ " ldr r4, ._866 @ gSharedMem\n"
+ " ldr r3, ._866 + 4 @ gUnknown_Debug_821F680\n"
+ " ldr r2, ._866 + 8 @ gUnknown_Debug_030043A0\n"
+ " ldr r0, ._866 + 12 @ gUnknown_Debug_030043A4\n"
+ " ldrb r1, [r0]\n"
+ " lsl r0, r1, #0x2\n"
+ " add r0, r0, r1\n"
+ " ldrb r2, [r2]\n"
+ " add r0, r0, r2\n"
+ " lsl r0, r0, #0x2\n"
+ " ldr r1, ._866 + 16 @ gUnknown_Debug_03004360\n"
+ " ldrb r2, [r1]\n"
+ " mov r1, #0x8c\n"
+ " mul r1, r1, r2\n"
+ " add r0, r0, r1\n"
+ " add r0, r0, r3\n"
+ " ldr r0, [r0]\n"
+ " add r0, r0, r4\n"
+ " mov r1, #0x81\n"
+ " strb r1, [r0]\n"
+ " pop {r4}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._867:\n"
+ " .align 2, 0\n"
+ "._866:\n"
+ " .word gSharedMem\n"
+ " .word gUnknown_Debug_821F680\n"
+ " .word gUnknown_Debug_030043A0\n"
+ " .word gUnknown_Debug_030043A4\n"
+ " .word gUnknown_Debug_03004360\n"
+ "\n"
+ );
+}
+
+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();
+ sub_800DAB8();
+ 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 +4671,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 +4733,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 +4897,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)
@@ -4049,6 +7288,351 @@ u8 GetWhoStrikesFirst(u8 bank1, u8 bank2, bool8 ignoreMovePriorities)
return strikesFirst;
}
+// The debug version should be identical, but has a strange register swap, and
+// seems to be affected by other functions, which is bizarre.
+#if DEBUG
+__attribute__((naked))
+void SetActionsAndBanksTurnOrder(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\
+ mov r3, #0x0\n\
+ ldr r0, ._L1550\n\
+ ldrh r1, [r0]\n\
+ mov r0, #0x80\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._L1499 @cond_branch\n\
+ ldr r0, ._L1550+0x4\n\
+ strb r3, [r0]\n\
+ ldr r4, ._L1550+0x8\n\
+ mov r8, r0\n\
+ ldrb r0, [r4]\n\
+ cmp r3, r0\n\
+ bcc ._LCB12758\n\
+ b ._L1505 @long jump\n\
+._LCB12758:\n\
+ ldr r7, ._L1550+0xc\n\
+ ldr r6, ._L1550+0x10\n\
+ mov r2, r8\n\
+ ldr r5, ._L1550+0x14\n\
+._L1503:\n\
+ add r1, r3, r7\n\
+ ldrb r0, [r2]\n\
+ add r0, r0, r6\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r1]\n\
+ add r1, r3, r5\n\
+ ldrb r0, [r2]\n\
+ strb r0, [r1]\n\
+ add r3, r3, #0x1\n\
+ ldrb r0, [r2]\n\
+ add r0, r0, #0x1\n\
+ strb r0, [r2]\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ ldrb r1, [r4]\n\
+ cmp r0, r1\n\
+ bcc ._L1503 @cond_branch\n\
+ b ._L1505\n\
+._L1551:\n\
+ .align 2, 0\n\
+._L1550:\n\
+ .word gBattleTypeFlags\n\
+ .word gActiveBank\n\
+ .word gNoOfAllBanks\n\
+ .word gActionsByTurnOrder\n\
+ .word gActionForBanks\n\
+ .word gBanksByTurnOrder\n\
+._L1499:\n\
+ mov r0, #0x2\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._L1506 @cond_branch\n\
+ ldr r0, ._L1552\n\
+ strb r3, [r0]\n\
+ ldr r1, ._L1552+0x4\n\
+ mov r8, r0\n\
+ add r2, r1, #0\n\
+ ldrb r2, [r2]\n\
+ cmp r3, r2\n\
+ bcs ._L1513 @cond_branch\n\
+ ldr r0, ._L1552+0x8\n\
+ ldrb r1, [r0]\n\
+ add r4, r0, #0\n\
+ cmp r1, #0x3\n\
+ beq ._L1548 @cond_branch\n\
+._L1509:\n\
+ mov r7, r8\n\
+ ldrb r0, [r7]\n\
+ add r0, r0, #0x1\n\
+ strb r0, [r7]\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ ldr r1, ._L1552+0x4\n\
+ ldrb r1, [r1]\n\
+ cmp r0, r1\n\
+ bcs ._L1513 @cond_branch\n\
+ ldrb r0, [r7]\n\
+ add r0, r0, r4\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0x3\n\
+ bne ._L1509 @cond_branch\n\
+ b ._L1548\n\
+._L1553:\n\
+ .align 2, 0\n\
+._L1552:\n\
+ .word gActiveBank\n\
+ .word gNoOfAllBanks\n\
+ .word gActionForBanks\n\
+._L1506:\n\
+ ldr r0, ._L1554\n\
+ ldrb r0, [r0]\n\
+ ldr r2, ._L1554+0x4\n\
+ mov r8, r2\n\
+ cmp r0, #0x3\n\
+ bne ._L1513 @cond_branch\n\
+ strb r3, [r2]\n\
+._L1548:\n\
+ mov r3, #0x5\n\
+._L1513:\n\
+ cmp r3, #0x5\n\
+ bne ._L1515 @cond_branch\n\
+ ldr r6, ._L1554+0x8\n\
+ ldr r1, ._L1554\n\
+ mov r3, r8\n\
+ ldrb r0, [r3]\n\
+ add r0, r0, r1\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r6]\n\
+ ldr r2, ._L1554+0xc\n\
+ ldrb r0, [r3]\n\
+ strb r0, [r2]\n\
+ mov r3, #0x1\n\
+ mov r5, #0x0\n\
+ add r4, r1, #0\n\
+ ldr r7, ._L1554+0x10\n\
+ mov r9, r7\n\
+ ldr r0, ._L1554+0x14\n\
+ mov ip, r0\n\
+ ldr r1, ._L1554+0x18\n\
+ mov sl, r1\n\
+ ldr r7, ._L1554+0x1c\n\
+ ldrb r7, [r7]\n\
+ cmp r5, r7\n\
+ bge ._L1517 @cond_branch\n\
+ add r7, r6, #0\n\
+ add r6, r4, #0\n\
+ add r4, r2, #0\n\
+ ldr r2, ._L1554+0x1c\n\
+._L1519:\n\
+ mov r0, r8\n\
+ ldrb r0, [r0]\n\
+ cmp r5, r0\n\
+ beq ._L1518 @cond_branch\n\
+ add r1, r3, r7\n\
+ add r0, r5, r6\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r1]\n\
+ add r0, r3, r4\n\
+ strb r5, [r0]\n\
+ add r3, r3, #0x1\n\
+._L1518:\n\
+ add r5, r5, #0x1\n\
+ ldrb r1, [r2]\n\
+ cmp r5, r1\n\
+ blt ._L1519 @cond_branch\n\
+._L1517:\n\
+ mov r2, ip\n\
+ mov r3, r9\n\
+ str r2, [r3]\n\
+ ldr r1, ._L1554+0x20\n\
+ add r1, r1, sl\n\
+ mov r0, #0x0\n\
+ strb r0, [r1]\n\
+ b ._L1498\n\
+._L1555:\n\
+ .align 2, 0\n\
+._L1554:\n\
+ .word gActionForBanks\n\
+ .word gActiveBank\n\
+ .word gActionsByTurnOrder\n\
+ .word gBanksByTurnOrder\n\
+ .word gBattleMainFunc\n\
+ .word CheckFocusPunch_ClearVarsBeforeTurnStarts\n\
+ .word gSharedMem\n\
+ .word gNoOfAllBanks\n\
+ .word 0x1601d\n\
+._L1515:\n\
+ mov r0, #0x0\n\
+ mov r7, r8\n\
+ strb r0, [r7]\n\
+ ldr r1, ._L1556\n\
+ ldrb r0, [r1]\n\
+ cmp r0, #0\n\
+ beq ._L1524 @cond_branch\n\
+ ldr r6, ._L1556+0x4\n\
+ mov r2, r8\n\
+ ldr r5, ._L1556+0x8\n\
+ ldr r4, ._L1556+0xc\n\
+._L1526:\n\
+ ldrb r0, [r2]\n\
+ add r0, r0, r6\n\
+ ldrb r1, [r0]\n\
+ sub r0, r1, #0x1\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ cmp r0, #0x1\n\
+ bhi ._L1525 @cond_branch\n\
+ add r0, r3, r5\n\
+ strb r1, [r0]\n\
+ add r1, r3, r4\n\
+ mov r7, r8\n\
+ ldrb r0, [r7]\n\
+ strb r0, [r1]\n\
+ add r3, r3, #0x1\n\
+._L1525:\n\
+ ldrb r0, [r2]\n\
+ add r0, r0, #0x1\n\
+ strb r0, [r2]\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ ldr r1, ._L1556\n\
+ ldrb r1, [r1]\n\
+ cmp r0, r1\n\
+ bcc ._L1526 @cond_branch\n\
+._L1524:\n\
+ mov r0, #0x0\n\
+ mov r2, r8\n\
+ strb r0, [r2]\n\
+ ldr r7, ._L1556\n\
+ ldrb r0, [r7]\n\
+ cmp r0, #0\n\
+ beq ._L1530 @cond_branch\n\
+ ldr r6, ._L1556+0x4\n\
+ ldr r5, ._L1556+0x8\n\
+ ldr r4, ._L1556+0xc\n\
+._L1532:\n\
+ ldrb r0, [r2]\n\
+ add r0, r0, r6\n\
+ ldrb r1, [r0]\n\
+ sub r0, r1, #0x1\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ cmp r0, #0x1\n\
+ bls ._L1531 @cond_branch\n\
+ add r0, r3, r5\n\
+ strb r1, [r0]\n\
+ add r1, r3, r4\n\
+ mov r7, r8\n\
+ ldrb r0, [r7]\n\
+ strb r0, [r1]\n\
+ add r3, r3, #0x1\n\
+._L1531:\n\
+ ldrb r0, [r2]\n\
+ add r0, r0, #0x1\n\
+ strb r0, [r2]\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ ldr r1, ._L1556\n\
+ ldrb r1, [r1]\n\
+ cmp r0, r1\n\
+ bcc ._L1532 @cond_branch\n\
+._L1530:\n\
+ mov r5, #0x0\n\
+ b ._L1549\n\
+._L1557:\n\
+ .align 2, 0\n\
+._L1556:\n\
+ .word gNoOfAllBanks\n\
+ .word gActionForBanks\n\
+ .word gActionsByTurnOrder\n\
+ .word gBanksByTurnOrder\n\
+._L1538:\n\
+ add r4, r5, #0x1\n\
+ add r7, r4, #0\n\
+ ldrb r1, [r1]\n\
+ cmp r7, r1\n\
+ bge ._L1537 @cond_branch\n\
+ ldr r6, ._L1558\n\
+ lsl r2, r5, #0x18\n\
+ mov r8, r2\n\
+._L1542:\n\
+ ldr r0, ._L1558+0x4\n\
+ add r1, r5, r0\n\
+ ldrb r3, [r1]\n\
+ add r0, r4, r0\n\
+ ldrb r1, [r0]\n\
+ add r0, r5, r6\n\
+ ldrb r2, [r0]\n\
+ cmp r2, #0x1\n\
+ beq ._L1541 @cond_branch\n\
+ add r0, r4, r6\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0x1\n\
+ beq ._L1541 @cond_branch\n\
+ cmp r2, #0x2\n\
+ beq ._L1541 @cond_branch\n\
+ cmp r0, #0x2\n\
+ beq ._L1541 @cond_branch\n\
+ add r0, r3, #0\n\
+ mov r2, #0x0\n\
+ bl GetWhoStrikesFirst\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ beq ._L1541 @cond_branch\n\
+ lsl r1, r4, #0x18\n\
+ lsr r1, r1, #0x18\n\
+ mov r3, r8\n\
+ lsr r0, r3, #0x18\n\
+ bl SwapTurnOrder\n\
+._L1541:\n\
+ add r4, r4, #0x1\n\
+ ldr r0, ._L1558+0x8\n\
+ ldrb r0, [r0]\n\
+ cmp r4, r0\n\
+ blt ._L1542 @cond_branch\n\
+._L1537:\n\
+ add r5, r7, #0\n\
+._L1549:\n\
+ ldr r1, ._L1558+0x8\n\
+ ldrb r0, [r1]\n\
+ sub r0, r0, #0x1\n\
+ cmp r5, r0\n\
+ blt ._L1538 @cond_branch\n\
+._L1505:\n\
+ ldr r1, ._L1558+0xc\n\
+ ldr r0, ._L1558+0x10\n\
+ str r0, [r1]\n\
+ ldr r0, ._L1558+0x14\n\
+ ldr r7, ._L1558+0x18\n\
+ add r0, r0, r7\n\
+ mov r1, #0x0\n\
+ strb r1, [r0]\n\
+._L1498:\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\
+._L1559:\n\
+ .align 2, 0\n\
+._L1558:\n\
+ .word gActionsByTurnOrder\n\
+ .word gBanksByTurnOrder\n\
+ .word gNoOfAllBanks\n\
+ .word gBattleMainFunc\n\
+ .word CheckFocusPunch_ClearVarsBeforeTurnStarts\n\
+ .word gSharedMem\n\
+ .word 0x1601d");
+}
+#else
void SetActionsAndBanksTurnOrder(void)
{
s32 var = 0;
@@ -4141,9 +7725,11 @@ void SetActionsAndBanksTurnOrder(void)
}
}
}
+
gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts;
eFocusPunchBank = 0;
}
+#endif
static void TurnValuesCleanUp(bool8 var0)
{
@@ -4721,9 +8307,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..8b81139fb 100644
--- a/src/battle/battle_4.c
+++ b/src/battle/battle_4.c
@@ -5018,7 +5018,156 @@ _0801F610: .4byte BattleScript_SAtkDown2\n\
}
#endif // NONMATCHING
-
+#if DEBUG
+__attribute__((naked))
+static void atk15_seteffectwithchance(void)
+{
+ asm("\
+ push {r4, lr}\n\
+ ldr r2, ._1037 @ gBattleMons\n\
+ ldr r0, ._1037 + 4 @ gBankAttacker\n\
+ ldrb r1, [r0]\n\
+ mov r0, #0x58\n\
+ mul r0, r0, r1\n\
+ add r0, r0, r2\n\
+ add r0, r0, #0x20\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0x20\n\
+ bne ._1035 @cond_branch\n\
+ ldr r2, ._1037 + 8 @ gBattleMoves\n\
+ ldr r0, ._1037 + 12 @ gCurrentMove\n\
+ ldrh r1, [r0]\n\
+ lsl r0, r1, #0x1\n\
+ add r0, r0, r1\n\
+ lsl r0, r0, #0x2\n\
+ add r0, r0, r2\n\
+ ldrb r0, [r0, #0x5]\n\
+ lsl r4, r0, #0x1\n\
+ b ._1036\n\
+._1038:\n\
+ .align 2, 0\n\
+._1037:\n\
+ .word gBattleMons\n\
+ .word gBankAttacker\n\
+ .word gBattleMoves\n\
+ .word gCurrentMove\n\
+._1035:\n\
+ ldr r2, ._1045 @ gBattleMoves\n\
+ ldr r0, ._1045 + 4 @ gCurrentMove\n\
+ ldrh r1, [r0]\n\
+ lsl r0, r1, #0x1\n\
+ add r0, r0, r1\n\
+ lsl r0, r0, #0x2\n\
+ add r0, r0, r2\n\
+ ldrb r4, [r0, #0x5]\n\
+._1036:\n\
+ ldr r0, ._1045 + 8 @ gUnknown_02023A14_50\n\
+ ldrb r1, [r0]\n\
+ mov r0, #0x4\n\
+ and r0, r0, r1\n\
+ ldr r2, ._1045 + 12 @ gBattleCommunication\n\
+ cmp r0, #0\n\
+ beq ._1039 @cond_branch\n\
+ ldrb r1, [r2, #0x3]\n\
+ mov r0, #0x80\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ bne ._1040 @cond_branch\n\
+ ldr r0, ._1045 + 16 @ gBattleMoveFlags\n\
+ ldrb r1, [r0]\n\
+ mov r0, #0x29\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._1050 @cond_branch\n\
+._1039:\n\
+ ldrb r1, [r2, #0x3]\n\
+ mov r0, #0x80\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._1043 @cond_branch\n\
+._1040:\n\
+ ldr r0, ._1045 + 16 @ gBattleMoveFlags\n\
+ ldrb r1, [r0]\n\
+ mov r0, #0x29\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ bne ._1043 @cond_branch\n\
+ ldr r2, ._1045 + 12 @ gBattleCommunication\n\
+ ldrb r1, [r2, #0x3]\n\
+ mov r0, #0x7f\n\
+ and r0, r0, r1\n\
+ strb r0, [r2, #0x3]\n\
+ b ._1044\n\
+._1046:\n\
+ .align 2, 0\n\
+._1045:\n\
+ .word gBattleMoves\n\
+ .word gCurrentMove\n\
+ .word gUnknown_02023A14_50\n\
+ .word gBattleCommunication\n\
+ .word gBattleMoveFlags\n\
+._1043:\n\
+ bl Random\n\
+ lsl r0, r0, #0x10\n\
+ lsr r0, r0, #0x10\n\
+ mov r1, #0x64\n\
+ bl __umodsi3\n\
+ lsl r0, r0, #0x10\n\
+ lsr r0, r0, #0x10\n\
+ cmp r0, r4\n\
+ bhi ._1049 @cond_branch\n\
+ ldr r0, ._1052 @ gBattleCommunication\n\
+ ldrb r0, [r0, #0x3]\n\
+ cmp r0, #0\n\
+ beq ._1049 @cond_branch\n\
+ ldr r0, ._1052 + 4 @ gBattleMoveFlags\n\
+ ldrb r1, [r0]\n\
+ mov r0, #0x29\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ bne ._1049 @cond_branch\n\
+ cmp r4, #0x63\n\
+ bls ._1050 @cond_branch\n\
+._1044:\n\
+ mov r0, #0x0\n\
+ mov r1, #0x80\n\
+ bl SetMoveEffect\n\
+ b ._1054\n\
+._1053:\n\
+ .align 2, 0\n\
+._1052:\n\
+ .word gBattleCommunication\n\
+ .word gBattleMoveFlags\n\
+._1050:\n\
+ mov r0, #0x0\n\
+ mov r1, #0x0\n\
+ bl SetMoveEffect\n\
+ b ._1054\n\
+._1049:\n\
+ ldr r1, ._1055 @ gBattlescriptCurrInstr\n\
+ ldr r0, [r1]\n\
+ add r0, r0, #0x1\n\
+ str r0, [r1]\n\
+._1054:\n\
+ ldr r0, ._1055 + 4 @ gBattleCommunication\n\
+ mov r1, #0x0\n\
+ strb r1, [r0, #0x3]\n\
+ ldr r0, ._1055 + 8 @ \n\
+ ldr r2, ._1055 + 12 @ \n\
+ add r0, r0, r2\n\
+ strb r1, [r0]\n\
+ pop {r4}\n\
+ pop {r0}\n\
+ bx r0\n\
+._1056:\n\
+ .align 2, 0\n\
+._1055:\n\
+ .word gBattlescriptCurrInstr\n\
+ .word gBattleCommunication\n\
+ .word +0x2000000\n\
+ .word 0x16112");
+}
+#else
static void atk15_seteffectwithchance(void)
{
u32 PercentChance;
@@ -5043,6 +5192,7 @@ static void atk15_seteffectwithchance(void)
gBattleCommunication[MOVE_EFFECT_BYTE] = 0;
gBattleStruct->unk16112 = 0;
}
+#endif
static void atk16_seteffectprimary(void)
{
@@ -12620,6 +12770,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 +13058,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 b4c71b9c2..85c1d4aed 100644
--- a/src/battle/battle_7.c
+++ b/src/battle/battle_7.c
@@ -26,7 +26,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[];
@@ -169,9 +169,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;
}
@@ -592,12 +592,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)
@@ -611,7 +611,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;
@@ -620,7 +620,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
{
@@ -673,7 +673,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);
@@ -692,8 +692,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]);
}
}
@@ -833,15 +833,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;
}
}
}
@@ -867,7 +867,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..f339a1206 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 AnimTask_SwayMonStep(u8 taskId);
static void sub_80A8D8C(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;
}
@@ -668,7 +717,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 +725,7 @@ void sub_80A8A80(u8 taskId)
DestroyAnimVisualTask(taskId);
return;
}
- spriteId = gObjectBankIDs[gAnimBankTarget ^ 2];
+ spriteId = gBankSpriteIds[gAnimBankTarget ^ 2];
break;
default:
DestroyAnimVisualTask(taskId);
@@ -705,59 +754,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;
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..8e8743dbc 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..e28c058a3 100644
--- a/src/battle/battle_controller_player.c
+++ b/src/battle/battle_controller_player.c
@@ -42,6 +42,8 @@ extern struct Window gUnknown_03004210;
extern void (*gBattleBankFunc[])(void);
+extern u32 gOamMatrixAllocBitmap;
+extern u8 gUnknown_020297ED;
extern u8 gActiveBank;
extern u8 gActionSelectionCursor[];
extern u8 gDisplayedStringBattle[];
@@ -51,7 +53,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 +102,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);
@@ -141,7 +143,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 +370,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 +498,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 +507,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 +516,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 +557,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 +603,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 +619,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 +679,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 +757,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 +1000,708 @@ void sub_802D18C(void)
}
}
+#if DEBUG
+__attribute__((naked))
+void debug_sub_8030C24(void)
+{
+ asm("\
+ push {r4, r5, r6, lr}\n\
+ add sp, sp, #0xfffffff4\n\
+ ldr r1, ._293 @ gBattlePartyID\n\
+ ldr r4, ._293 + 4 @ gActiveBank\n\
+ ldrb r0, [r4]\n\
+ lsl r0, r0, #0x1\n\
+ add r0, r0, r1\n\
+ ldrh r1, [r0]\n\
+ mov r0, #0x64\n\
+ mul r0, r0, r1\n\
+ ldr r1, ._293 + 8 @ gPlayerParty\n\
+ add r0, r0, r1\n\
+ mov r1, #0xd\n\
+ bl GetMonData\n\
+ add r1, sp, #0x8\n\
+ strh r0, [r1]\n\
+ ldr r5, ._293 + 12 @ gMain\n\
+ ldrh r1, [r5, #0x30]\n\
+ cmp r1, #0x20\n\
+ bne ._286 @cond_branch\n\
+ b ._287\n\
+._286:\n\
+ cmp r1, #0x20\n\
+ bgt ._288 @cond_branch\n\
+ cmp r1, #0x8\n\
+ beq ._289 @cond_branch\n\
+ cmp r1, #0x8\n\
+ bgt ._290 @cond_branch\n\
+ cmp r1, #0x4\n\
+ beq ._291 @cond_branch\n\
+ b ._348\n\
+._294:\n\
+ .align 2, 0\n\
+._293:\n\
+ .word gBattlePartyID\n\
+ .word gActiveBank\n\
+ .word gPlayerParty\n\
+ .word gMain\n\
+._290:\n\
+ cmp r1, #0x10\n\
+ bne ._295 @cond_branch\n\
+ b ._296\n\
+._295:\n\
+ b ._348\n\
+._288:\n\
+ cmp r1, #0x80\n\
+ bne ._298 @cond_branch\n\
+ b ._302\n\
+._298:\n\
+ cmp r1, #0x80\n\
+ bgt ._300 @cond_branch\n\
+ cmp r1, #0x40\n\
+ bne ._301 @cond_branch\n\
+ b ._302\n\
+._301:\n\
+ b ._348\n\
+._300:\n\
+ mov r0, #0x80\n\
+ lsl r0, r0, #0x1\n\
+ cmp r1, r0\n\
+ bne ._304 @cond_branch\n\
+ b ._305\n\
+._304:\n\
+ mov r0, #0x80\n\
+ lsl r0, r0, #0x2\n\
+ cmp r1, r0\n\
+ bne ._306 @cond_branch\n\
+ b ._307\n\
+._306:\n\
+ b ._348\n\
+._289:\n\
+ ldrb r0, [r4]\n\
+ mov r1, #0x1\n\
+ bl dp11b_obj_free\n\
+ ldrb r0, [r4]\n\
+ mov r1, #0x0\n\
+ bl dp11b_obj_free\n\
+ ldr r0, ._312 @ gBankAttacker\n\
+ ldrb r2, [r4]\n\
+ strb r2, [r0]\n\
+ ldrh r1, [r5, #0x28]\n\
+ mov r0, #0x2\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._310 @cond_branch\n\
+ ldr r0, ._312 + 4 @ gBattleTypeFlags\n\
+ ldrh r1, [r0]\n\
+ mov r0, #0x1\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._310 @cond_branch\n\
+ ldr r0, ._312 + 8 @ gBankTarget\n\
+ mov r1, #0x2\n\
+ eor r1, r1, r2\n\
+ strb r1, [r0]\n\
+ b ._311\n\
+._313:\n\
+ .align 2, 0\n\
+._312:\n\
+ .word gBankAttacker\n\
+ .word gBattleTypeFlags\n\
+ .word gBankTarget\n\
+._310:\n\
+ ldr r0, ._317 @ gMain\n\
+ ldrh r1, [r0, #0x28]\n\
+ mov r2, #0x1\n\
+ add r0, r2, #0\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._315 @cond_branch\n\
+ ldr r0, ._317 + 4 @ gBattleTypeFlags\n\
+ ldrh r1, [r0]\n\
+ add r0, r2, #0\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._315 @cond_branch\n\
+ mov r0, #0x3\n\
+ b ._316\n\
+._318:\n\
+ .align 2, 0\n\
+._317:\n\
+ .word gMain\n\
+ .word gBattleTypeFlags\n\
+._315:\n\
+ mov r0, #0x1\n\
+._316:\n\
+ bl GetBankByIdentity\n\
+ ldr r1, ._320 @ gBankTarget\n\
+ strb r0, [r1]\n\
+._311:\n\
+ mov r0, #0x0\n\
+ bl sub_80326EC\n\
+ add r0, sp, #0x8\n\
+ ldrh r0, [r0]\n\
+ bl DoMoveAnim\n\
+ ldr r1, ._320 + 4 @ gBattleBankFunc\n\
+ ldr r0, ._320 + 8 @ gActiveBank\n\
+ ldrb r0, [r0]\n\
+ b ._332\n\
+._321:\n\
+ .align 2, 0\n\
+._320:\n\
+ .word gBankTarget\n\
+ .word gBattleBankFunc\n\
+ .word gActiveBank\n\
+._291:\n\
+ ldrb r0, [r4]\n\
+ mov r1, #0x1\n\
+ bl dp11b_obj_free\n\
+ ldrb r0, [r4]\n\
+ mov r1, #0x0\n\
+ bl dp11b_obj_free\n\
+ ldr r0, ._325 @ gBankTarget\n\
+ ldrb r2, [r4]\n\
+ strb r2, [r0]\n\
+ ldrh r1, [r5, #0x28]\n\
+ mov r0, #0x2\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._323 @cond_branch\n\
+ ldr r0, ._325 + 4 @ gBattleTypeFlags\n\
+ ldrh r1, [r0]\n\
+ mov r0, #0x1\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._323 @cond_branch\n\
+ ldr r0, ._325 + 8 @ gBankAttacker\n\
+ mov r1, #0x2\n\
+ eor r1, r1, r2\n\
+ strb r1, [r0]\n\
+ b ._324\n\
+._326:\n\
+ .align 2, 0\n\
+._325:\n\
+ .word gBankTarget\n\
+ .word gBattleTypeFlags\n\
+ .word gBankAttacker\n\
+._323:\n\
+ ldr r0, ._330 @ gMain\n\
+ ldrh r1, [r0, #0x28]\n\
+ mov r2, #0x1\n\
+ add r0, r2, #0\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._328 @cond_branch\n\
+ ldr r0, ._330 + 4 @ gBattleTypeFlags\n\
+ ldrh r1, [r0]\n\
+ add r0, r2, #0\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._328 @cond_branch\n\
+ mov r0, #0x3\n\
+ b ._329\n\
+._331:\n\
+ .align 2, 0\n\
+._330:\n\
+ .word gMain\n\
+ .word gBattleTypeFlags\n\
+._328:\n\
+ mov r0, #0x1\n\
+._329:\n\
+ bl GetBankByIdentity\n\
+ ldr r1, ._333 @ gBankAttacker\n\
+ strb r0, [r1]\n\
+._324:\n\
+ mov r0, #0x0\n\
+ bl sub_80326EC\n\
+ add r0, sp, #0x8\n\
+ ldrh r0, [r0]\n\
+ bl DoMoveAnim\n\
+ ldr r1, ._333 + 4 @ gBattleBankFunc\n\
+ ldr r0, ._333 + 8 @ gActiveBank\n\
+ ldrb r0, [r0]\n\
+ b ._332\n\
+._334:\n\
+ .align 2, 0\n\
+._333:\n\
+ .word gBankAttacker\n\
+ .word gBattleBankFunc\n\
+ .word gActiveBank\n\
+._305:\n\
+ ldrh r1, [r5, #0x28]\n\
+ mov r0, #0x2\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._336 @cond_branch\n\
+ ldr r0, ._338 @ gBattleTypeFlags\n\
+ ldrh r1, [r0]\n\
+ mov r0, #0x1\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._336 @cond_branch\n\
+ ldrb r0, [r4]\n\
+ mov r1, #0x1\n\
+ bl dp11b_obj_free\n\
+ ldrb r0, [r4]\n\
+ mov r1, #0x0\n\
+ bl dp11b_obj_free\n\
+ mov r0, #0x3\n\
+ bl GetBankByIdentity\n\
+ ldr r1, ._338 + 4 @ gBankAttacker\n\
+ strb r0, [r1]\n\
+ mov r0, #0x1\n\
+ b ._337\n\
+._339:\n\
+ .align 2, 0\n\
+._338:\n\
+ .word gBattleTypeFlags\n\
+ .word gBankAttacker\n\
+._336:\n\
+ add r0, sp, #0x8\n\
+ mov r1, #0x0\n\
+ ldsh r0, [r0, r1]\n\
+ add r0, r0, #0x9\n\
+ add r1, sp, #0x8\n\
+ strh r0, [r1]\n\
+._296:\n\
+ add r0, sp, #0x8\n\
+ mov r2, #0x0\n\
+ ldsh r0, [r0, r2]\n\
+ add r0, r0, #0x1\n\
+ lsl r2, r0, #0x10\n\
+ add r1, sp, #0x8\n\
+ strh r0, [r1]\n\
+ mov r0, #0xb1\n\
+ lsl r0, r0, #0x11\n\
+ cmp r2, r0\n\
+ ble ._347 @cond_branch\n\
+ mov r1, #0x1\n\
+ add r0, sp, #0x8\n\
+ strh r1, [r0]\n\
+ b ._347\n\
+._307:\n\
+ ldrh r1, [r5, #0x28]\n\
+ mov r0, #0x2\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._343 @cond_branch\n\
+ ldr r0, ._345 @ gBattleTypeFlags\n\
+ ldrh r1, [r0]\n\
+ mov r0, #0x1\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._343 @cond_branch\n\
+ ldrb r0, [r4]\n\
+ mov r1, #0x1\n\
+ bl dp11b_obj_free\n\
+ ldrb r0, [r4]\n\
+ mov r1, #0x0\n\
+ bl dp11b_obj_free\n\
+ mov r0, #0x1\n\
+ bl GetBankByIdentity\n\
+ ldr r1, ._345 + 4 @ gBankAttacker\n\
+ strb r0, [r1]\n\
+ mov r0, #0x3\n\
+._337:\n\
+ bl GetBankByIdentity\n\
+ ldr r1, ._345 + 8 @ gBankTarget\n\
+ strb r0, [r1]\n\
+ mov r0, #0x0\n\
+ bl sub_80326EC\n\
+ add r0, sp, #0x8\n\
+ ldrh r0, [r0]\n\
+ bl DoMoveAnim\n\
+ ldr r1, ._345 + 12 @ gBattleBankFunc\n\
+ ldrb r0, [r4]\n\
+._332:\n\
+ lsl r0, r0, #0x2\n\
+ add r0, r0, r1\n\
+ ldr r1, ._345 + 16 @ debug_sub_803107C\n\
+ str r1, [r0]\n\
+ b ._348\n\
+._346:\n\
+ .align 2, 0\n\
+._345:\n\
+ .word gBattleTypeFlags\n\
+ .word gBankAttacker\n\
+ .word gBankTarget\n\
+ .word gBattleBankFunc\n\
+ .word debug_sub_803107C+1\n\
+._343:\n\
+ add r1, sp, #0x8\n\
+ add r0, r1, #0\n\
+ ldrh r0, [r0]\n\
+ sub r0, r0, #0x9\n\
+ strh r0, [r1]\n\
+._287:\n\
+ add r1, sp, #0x8\n\
+ add r0, r1, #0\n\
+ ldrh r0, [r0]\n\
+ sub r0, r0, #0x1\n\
+ strh r0, [r1]\n\
+ lsl r0, r0, #0x10\n\
+ cmp r0, #0\n\
+ bgt ._347 @cond_branch\n\
+ mov r2, #0xb1\n\
+ lsl r2, r2, #0x1\n\
+ add r0, r2, #0\n\
+ strh r0, [r1]\n\
+._347:\n\
+ ldr r1, ._349 @ gBattlePartyID\n\
+ ldr r4, ._349 + 4 @ gActiveBank\n\
+ ldrb r0, [r4]\n\
+ lsl r0, r0, #0x1\n\
+ add r0, r0, r1\n\
+ ldrh r1, [r0]\n\
+ mov r0, #0x64\n\
+ mul r0, r0, r1\n\
+ ldr r1, ._349 + 8 @ gPlayerParty\n\
+ add r0, r0, r1\n\
+ mov r1, #0xd\n\
+ add r2, sp, #0x8\n\
+ bl SetMonData\n\
+ ldr r2, ._349 + 12 @ gBattleMons\n\
+ ldrb r1, [r4]\n\
+ mov r0, #0x58\n\
+ mul r0, r0, r1\n\
+ add r0, r0, r2\n\
+ add r1, sp, #0x8\n\
+ ldrh r1, [r1]\n\
+ strh r1, [r0, #0xc]\n\
+ ldr r5, ._349 + 16 @ gUnknown_03004210\n\
+ ldr r1, ._349 + 20 @ 0x1016\n\
+ mov r0, #0x10\n\
+ str r0, [sp]\n\
+ mov r0, #0x38\n\
+ str r0, [sp, #0x4]\n\
+ add r0, r5, #0\n\
+ mov r2, #0x1\n\
+ mov r3, #0x37\n\
+ bl Text_FillWindowRect\n\
+ add r0, sp, #0x8\n\
+ mov r2, #0x0\n\
+ ldsh r1, [r0, r2]\n\
+ mov r0, #0xd\n\
+ mul r1, r1, r0\n\
+ ldr r0, ._349 + 24 @ gMoveNames\n\
+ add r1, r1, r0\n\
+ mov r2, #0x80\n\
+ lsl r2, r2, #0x1\n\
+ mov r6, #0x37\n\
+ str r6, [sp]\n\
+ add r0, r5, #0\n\
+ mov r3, #0x2\n\
+ bl Text_InitWindowAndPrintText\n\
+ ldr r4, ._349 + 28 @ gDisplayedStringBattle\n\
+ add r0, sp, #0x8\n\
+ mov r2, #0x0\n\
+ ldsh r1, [r0, r2]\n\
+ add r0, r4, #0\n\
+ mov r2, #0x2\n\
+ mov r3, #0x3\n\
+ bl ConvertIntToDecimalStringN\n\
+ mov r2, #0x88\n\
+ lsl r2, r2, #0x1\n\
+ str r6, [sp]\n\
+ add r0, r5, #0\n\
+ add r1, r4, #0\n\
+ mov r3, #0xa\n\
+ bl Text_InitWindowAndPrintText\n\
+ b ._348\n\
+._350:\n\
+ .align 2, 0\n\
+._349:\n\
+ .word gBattlePartyID\n\
+ .word gActiveBank\n\
+ .word gPlayerParty\n\
+ .word gBattleMons\n\
+ .word gUnknown_03004210\n\
+ .word 0x1016\n\
+ .word gMoveNames\n\
+ .word gDisplayedStringBattle\n\
+._302:\n\
+ ldr r0, ._353 @ gMain\n\
+ ldrh r0, [r0, #0x30]\n\
+ cmp r0, #0x40\n\
+ bne ._351 @cond_branch\n\
+ ldr r1, ._353 + 4 @ gAnimMoveTurn\n\
+ ldrb r0, [r1]\n\
+ sub r0, r0, #0x1\n\
+ b ._352\n\
+._354:\n\
+ .align 2, 0\n\
+._353:\n\
+ .word gMain\n\
+ .word gAnimMoveTurn\n\
+._351:\n\
+ ldr r1, ._359 @ gAnimMoveTurn\n\
+ ldrb r0, [r1]\n\
+ add r0, r0, #0x1\n\
+._352:\n\
+ strb r0, [r1]\n\
+ ldr r4, ._359 + 4 @ gDisplayedStringBattle\n\
+ ldrb r1, [r1]\n\
+ add r0, r4, #0\n\
+ mov r2, #0x2\n\
+ mov r3, #0x3\n\
+ bl ConvertIntToDecimalStringN\n\
+ ldr r0, ._359 + 8 @ gUnknown_03004210\n\
+ mov r2, #0x8e\n\
+ lsl r2, r2, #0x1\n\
+ mov r1, #0x39\n\
+ str r1, [sp]\n\
+ add r1, r4, #0\n\
+ mov r3, #0x4\n\
+ bl Text_InitWindowAndPrintText\n\
+._348:\n\
+ ldr r0, ._359 + 12 @ gMain\n\
+ ldrh r2, [r0, #0x28]\n\
+ mov r1, #0xc0\n\
+ lsl r1, r1, #0x2\n\
+ add r0, r1, #0\n\
+ and r0, r0, r2\n\
+ cmp r0, r1\n\
+ bne ._355 @cond_branch\n\
+ mov r4, #0x0\n\
+ ldr r5, ._359 + 4 @ gDisplayedStringBattle\n\
+ ldr r6, ._359 + 8 @ gUnknown_03004210\n\
+._361:\n\
+ add r0, r5, #0\n\
+ ldr r1, ._359 + 16 @ BattleText_Format\n\
+ bl StringCopy\n\
+ ldr r1, ._359 + 20 @ gBattlePartyID\n\
+ ldr r0, ._359 + 24 @ gActiveBank\n\
+ ldrb r0, [r0]\n\
+ lsl r0, r0, #0x1\n\
+ add r0, r0, r1\n\
+ ldrh r1, [r0]\n\
+ mov r0, #0x64\n\
+ mul r0, r0, r1\n\
+ ldr r1, ._359 + 28 @ gPlayerParty\n\
+ add r0, r0, r1\n\
+ add r1, r4, #0\n\
+ add r1, r1, #0xd\n\
+ bl GetMonData\n\
+ mov r1, #0xd\n\
+ mul r1, r1, r0\n\
+ ldr r0, ._359 + 32 @ gMoveNames\n\
+ add r1, r1, r0\n\
+ add r0, r5, #0\n\
+ bl StringAppend\n\
+ lsl r0, r4, #0x14\n\
+ mov r1, #0x80\n\
+ lsl r1, r1, #0x11\n\
+ add r0, r0, r1\n\
+ lsr r2, r0, #0x10\n\
+ mov r0, #0x1\n\
+ and r0, r0, r4\n\
+ mov r3, #0x2\n\
+ cmp r0, #0\n\
+ beq ._356 @cond_branch\n\
+ mov r3, #0xa\n\
+._356:\n\
+ cmp r4, #0x1\n\
+ bhi ._357 @cond_branch\n\
+ mov r0, #0x37\n\
+ b ._358\n\
+._360:\n\
+ .align 2, 0\n\
+._359:\n\
+ .word gAnimMoveTurn\n\
+ .word gDisplayedStringBattle\n\
+ .word gUnknown_03004210\n\
+ .word gMain\n\
+ .word BattleText_Format\n\
+ .word gBattlePartyID\n\
+ .word gActiveBank\n\
+ .word gPlayerParty\n\
+ .word gMoveNames\n\
+._357:\n\
+ mov r0, #0x39\n\
+._358:\n\
+ str r0, [sp]\n\
+ add r0, r6, #0\n\
+ add r1, r5, #0\n\
+ bl Text_InitWindow\n\
+ ldr r0, ._362 @ gUnknown_03004210\n\
+ bl Text_PrintWindow8002F44\n\
+ add r0, r4, #1\n\
+ lsl r0, r0, #0x18\n\
+ lsr r4, r0, #0x18\n\
+ cmp r4, #0x3\n\
+ bls ._361 @cond_branch\n\
+ ldr r1, ._362 + 4 @ gBattleBankFunc\n\
+ ldr r0, ._362 + 8 @ gActiveBank\n\
+ ldrb r0, [r0]\n\
+ lsl r0, r0, #0x2\n\
+ add r0, r0, r1\n\
+ ldr r1, ._362 + 12 @ sub_802C68C\n\
+ str r1, [r0]\n\
+._355:\n\
+ add sp, sp, #0xc\n\
+ pop {r4, r5, r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+._363:\n\
+ .align 2, 0\n\
+._362:\n\
+ .word gUnknown_03004210\n\
+ .word gBattleBankFunc\n\
+ .word gActiveBank\n\
+ .word sub_802C68C+1");
+}
+
+__attribute__((naked))
+void debug_sub_803107C(void)
+{
+ asm("\
+ push {r4, r5, r6, r7, lr}\n\
+ add sp, sp, #0xfffffffc\n\
+ mov r7, #0x0\n\
+ ldr r0, ._369 @ gAnimScriptCallback\n\
+ ldr r0, [r0]\n\
+ bl _call_via_r0\n\
+ ldr r0, ._369 + 4 @ gAnimScriptActive\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ bne ._364 @cond_branch\n\
+ mov r0, #0x1\n\
+ bl sub_80326EC\n\
+ ldr r4, ._369 + 8 @ gActiveBank\n\
+ ldrb r0, [r4]\n\
+ mov r1, #0x1\n\
+ mov r2, #0x7\n\
+ mov r3, #0x1\n\
+ bl dp11b_obj_instanciate\n\
+ ldrb r0, [r4]\n\
+ mov r1, #0x0\n\
+ mov r2, #0x7\n\
+ mov r3, #0x1\n\
+ bl dp11b_obj_instanciate\n\
+ ldr r0, ._369 + 12 @ gSprites\n\
+ add r2, r0, #0\n\
+ add r2, r2, #0x3e\n\
+ mov r1, #0x3f\n\
+._366:\n\
+ ldrb r0, [r2]\n\
+ lsl r0, r0, #0x1f\n\
+ cmp r0, #0\n\
+ beq ._365 @cond_branch\n\
+ add r0, r7, #1\n\
+ lsl r0, r0, #0x18\n\
+ lsr r7, r0, #0x18\n\
+._365:\n\
+ add r2, r2, #0x44\n\
+ sub r1, r1, #0x1\n\
+ cmp r1, #0\n\
+ bge ._366 @cond_branch\n\
+ ldr r4, ._369 + 16 @ gDisplayedStringBattle\n\
+ add r0, r4, #0\n\
+ add r1, r7, #0\n\
+ mov r2, #0x2\n\
+ mov r3, #0x2\n\
+ bl ConvertIntToDecimalStringN\n\
+ ldr r6, ._369 + 20 @ gUnknown_03004210\n\
+ mov r2, #0x91\n\
+ lsl r2, r2, #0x1\n\
+ mov r5, #0x39\n\
+ str r5, [sp]\n\
+ add r0, r6, #0\n\
+ add r1, r4, #0\n\
+ mov r3, #0x8\n\
+ bl Text_InitWindowAndPrintText\n\
+ bl GetTaskCount\n\
+ lsl r0, r0, #0x18\n\
+ lsr r7, r0, #0x18\n\
+ add r0, r4, #0\n\
+ add r1, r7, #0\n\
+ mov r2, #0x2\n\
+ mov r3, #0x2\n\
+ bl ConvertIntToDecimalStringN\n\
+ mov r2, #0x93\n\
+ lsl r2, r2, #0x1\n\
+ str r5, [sp]\n\
+ add r0, r6, #0\n\
+ add r1, r4, #0\n\
+ mov r3, #0xb\n\
+ bl Text_InitWindowAndPrintText\n\
+ mov r1, #0x0\n\
+ mov r7, #0x0\n\
+ ldr r0, ._369 + 24 @ gOamMatrixAllocBitmap\n\
+ mov r3, #0x1\n\
+ ldr r2, [r0]\n\
+._368:\n\
+ add r0, r3, #0\n\
+ LSL r0, r1\n\
+ and r0, r0, r2\n\
+ cmp r0, #0\n\
+ beq ._367 @cond_branch\n\
+ add r0, r7, #1\n\
+ lsl r0, r0, #0x18\n\
+ lsr r7, r0, #0x18\n\
+._367:\n\
+ add r1, r1, #0x1\n\
+ cmp r1, #0x1f\n\
+ ble ._368 @cond_branch\n\
+ ldr r4, ._369 + 16 @ gDisplayedStringBattle\n\
+ add r0, r4, #0\n\
+ add r1, r7, #0\n\
+ mov r2, #0x2\n\
+ mov r3, #0x2\n\
+ bl ConvertIntToDecimalStringN\n\
+ ldr r0, ._369 + 20 @ gUnknown_03004210\n\
+ mov r2, #0x95\n\
+ lsl r2, r2, #0x1\n\
+ mov r1, #0x39\n\
+ str r1, [sp]\n\
+ add r1, r4, #0\n\
+ mov r3, #0xe\n\
+ bl Text_InitWindowAndPrintText\n\
+ ldr r1, ._369 + 28 @ gBattleBankFunc\n\
+ ldr r0, ._369 + 8 @ gActiveBank\n\
+ ldrb r0, [r0]\n\
+ lsl r0, r0, #0x2\n\
+ add r0, r0, r1\n\
+ ldr r1, ._369 + 32 @ debug_sub_8030C24\n\
+ str r1, [r0]\n\
+._364:\n\
+ add sp, sp, #0x4\n\
+ pop {r4, r5, r6, r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+._370:\n\
+ .align 2, 0\n\
+._369:\n\
+ .word gAnimScriptCallback\n\
+ .word gAnimScriptActive\n\
+ .word gActiveBank\n\
+ .word gSprites\n\
+ .word gDisplayedStringBattle\n\
+ .word gUnknown_03004210\n\
+ .word gOamMatrixAllocBitmap\n\
+ .word gBattleBankFunc\n\
+ .word debug_sub_8030C24+1");
+}
+#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 +2176,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 +2192,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 +2260,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)
{
@@ -2294,7 +3020,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 +3044,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 +3068,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 +3111,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 +3127,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 +3166,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 +3540,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 +3596,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 +3623,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 +3702,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..e9425e7e7 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 97568d254..9be026d53 100644
--- a/src/battle/battle_interface.c
+++ b/src/battle/battle_interface.c
@@ -79,8 +79,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 *);
@@ -651,7 +651,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];
void *const *r7;
@@ -905,7 +905,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;
@@ -1277,6 +1277,8 @@ _08044548: .4byte 0x04000008\n\
}
#endif
+extern u8 gUnknown_020297ED;
+
void sub_804454C(void)
{
s32 i;
@@ -1285,7 +1287,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;
@@ -2359,7 +2365,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;
@@ -2507,7 +2513,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;
@@ -2649,7 +2655,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;
@@ -2675,7 +2681,7 @@ static void sub_80458B0(u8 a)
}
-static void sub_8045998(u8 a)
+/*static*/ void sub_8045998(u8 a)
{
u8 *r7;
u8 status;
@@ -2752,6 +2758,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..1532a0b2f 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 u8 gUnknown_Debug_8424620[][4] =
+{
+ { 1, 1, 0, 0 },
+ { 2, 1, 0, 0 },
+ { 3, 1, 0, 0 },
+};
+#endif
+
static void InitLinkBattleRecord(struct LinkBattleRecord *record)
{
CpuFill16(0, record, sizeof(struct LinkBattleRecord));
@@ -197,6 +223,66 @@ void UpdateLinkBattleRecords(int id)
gLinkPlayers[gLinkPlayerMapObjects[id].linkPlayerId].language);
}
+#if DEBUG
+__attribute__((naked))
+void debug_sub_81257E0(void)
+{
+ asm("\
+ push {r4, r5, r6, r7, lr}\n\
+ mov r7, r8\n\
+ push {r7}\n\
+ add sp, sp, #0xfffffffc\n\
+ bl InitLinkBattleRecords\n\
+ mov r5, #0x0\n\
+ ldr r6, ._62 @ gUnknown_Debug_4245CC\n\
+ sub r0, r6, #2\n\
+ mov r8, r0\n\
+ ldr r7, ._62 + 4 @ gLinkPlayers\n\
+._61:\n\
+ ldr r0, ._62 + 8 @ gUnknown_Debug_8424620\n\
+ lsl r3, r5, #0x2\n\
+ add r3, r3, r0\n\
+ ldrb r4, [r3]\n\
+ sub r4, r4, #0x1\n\
+ lsl r0, r4, #0x1\n\
+ add r0, r0, r4\n\
+ lsl r0, r0, #0x2\n\
+ add r1, r0, r6\n\
+ add r0, r0, r8\n\
+ ldrh r2, [r0]\n\
+ ldrb r3, [r3, #0x1]\n\
+ ldr r0, ._62 + 12 @ gLinkPlayerMapObjects\n\
+ lsl r4, r4, #0x2\n\
+ add r4, r4, r0\n\
+ ldrb r4, [r4, #0x1]\n\
+ lsl r0, r4, #0x3\n\
+ sub r0, r0, r4\n\
+ lsl r0, r0, #0x2\n\
+ add r0, r0, r7\n\
+ ldrb r0, [r0, #0x1a]\n\
+ str r0, [sp]\n\
+ ldr r0, ._62 + 16 @ gSaveBlock1\n\
+ bl UpdateLinkBattleRecords_\n\
+ add r5, r5, #0x1\n\
+ cmp r5, #0x2\n\
+ bls ._61 @cond_branch\n\
+ add sp, sp, #0x4\n\
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4, r5, r6, r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+._63:\n\
+ .align 2, 0\n\
+._62:\n\
+ .word gUnknown_Debug_4245CC+2\n\
+ .word gLinkPlayers\n\
+ .word gUnknown_Debug_8424620\n\
+ .word gLinkPlayerMapObjects\n\
+ .word gSaveBlock1+0x30b8");
+}
+#endif
+
static void PrintLinkBattleWinsLossesDraws(struct LinkBattleRecord *records)
{
ConvertIntToDecimalStringN_DigitWidth6(gStringVar1, GetGameStat(GAME_STAT_LINK_BATTLE_WINS), STR_CONV_MODE_RIGHT_ALIGN, 4);
@@ -240,7 +326,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 41e84a8a0..ec4a26bc5 100644
--- a/src/battle/battle_setup.c
+++ b/src/battle/battle_setup.c
@@ -474,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.
diff --git a/src/battle/battle_util.c b/src/battle/battle_util.c
index 87b6952ff..194a002d3 100644
--- a/src/battle/battle_util.c
+++ b/src/battle/battle_util.c
@@ -22,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];
@@ -1736,17 +1738,14 @@ 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 (GetCurrentWeather())
{
case WEATHER_RAIN_LIGHT:
@@ -1786,7 +1785,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 bank, u8 ability, u8 special, u16 moveArg)
}
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/pokeball.c b/src/battle/pokeball.c
index 6f27469ce..3a47e0204 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[];
@@ -298,7 +298,7 @@ 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 bool8 TranslateAnimSpriteLinearAndSine(struct Sprite *);
extern u8 sub_814086C(u8, u8, int, int, u8);
extern u8 sub_8141314(u8, u8, int, u8);
@@ -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;
@@ -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..0da29441e 100644
--- a/src/battle/reshow_battle_screen.c
+++ b/src/battle/reshow_battle_screen.c
@@ -25,7 +25,7 @@ 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];
@@ -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/contest.c b/src/contest.c
index ce29d80b0..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;
@@ -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);
@@ -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;
@@ -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/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/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 efd952ef7..c8f80eb50 100644
--- a/src/debug/matsuda_debug_menu.c
+++ b/src/debug/matsuda_debug_menu.c
@@ -76,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();
@@ -460,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();
@@ -963,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..4690368d8
--- /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 GetEnigmaBerryChecksum\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 GetEnigmaBerryChecksum\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 GetEnigmaBerryChecksum\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 GetEnigmaBerryChecksum\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 GetEnigmaBerryChecksum\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_GetItem\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..c3616797e
--- /dev/null
+++ b/src/debug/tomomichi_debug_menu.c
@@ -0,0 +1,20 @@
+#if DEBUG
+#include "global.h"
+
+// These should be static, uninitialized once it gets decompiled.
+#define BSS_DATA __attribute__((section(".bss")))
+BSS_DATA u8 gDebug_03000700[4] = {0};
+BSS_DATA u8 gDebug_03000704[4] = {0};
+BSS_DATA u8 gDebug_03000708[4] = {0};
+BSS_DATA u8 gDebug_0300070C = 0;
+BSS_DATA u8 gDebug_0300070D = 0;
+BSS_DATA u8 gDebug_0300070E = 0;
+BSS_DATA u8 gDebug_0300070F = 0;
+BSS_DATA u8 gDebug_03000710[13] = {0};
+BSS_DATA u8 gDebug_0300071D = 0;
+BSS_DATA u8 gDebug_0300071E = 0;
+BSS_DATA u8 gDebug_0300071F = 0;
+BSS_DATA u8 gDebug_03000720 = 0;
+BSS_DATA u8 gDebug_03000721 = 0;
+
+#endif
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/cable_club.c b/src/engine/cable_club.c
index e7c504c7b..ff73e638e 100644
--- a/src/engine/cable_club.c
+++ b/src/engine/cable_club.c
@@ -23,6 +23,7 @@
#include "text.h"
#include "trainer_card.h"
+extern u8 unk_2030220;
extern u16 gSpecialVar_Result;
extern struct TrainerCard gTrainerCards[4];
extern u8 gUnknown_03004860;
@@ -41,7 +42,7 @@ extern struct
u8 field1;
} gUnknown_020297D8;
-static void sub_8082F20(u8 taskId);
+/*static*/ void sub_8082F20(u8 taskId);
static void sub_8082F68(u8 taskId);
static void sub_8082FEC(u8 taskId);
static void sub_808303C(u8 taskId);
@@ -95,6 +96,382 @@ const u8 *const gTrainerCardColorNames[] =
TrainerCardColorName_Gold,
};
+#if DEBUG
+
+__attribute__((naked))
+int debug_sub_808A4D0()
+{
+ asm("\
+ push {lr}\n\
+ add r1, r0, #0\n\
+ ldr r0, ._3 @ sub_8082F68\n\
+ cmp r1, r0\n\
+ bne ._1 @cond_branch\n\
+ mov r0, #0x1\n\
+ b ._30\n\
+._4:\n\
+ .align 2, 0\n\
+._3:\n\
+ .word sub_8082F68+1\n\
+._1:\n\
+ ldr r0, ._7 @ sub_8082FEC\n\
+ cmp r1, r0\n\
+ bne ._5 @cond_branch\n\
+ mov r0, #0x11\n\
+ b ._30\n\
+._8:\n\
+ .align 2, 0\n\
+._7:\n\
+ .word sub_8082FEC+1\n\
+._5:\n\
+ ldr r0, ._11 @ sub_808303C\n\
+ cmp r1, r0\n\
+ bne ._9 @cond_branch\n\
+ mov r0, #0x12\n\
+ b ._30\n\
+._12:\n\
+ .align 2, 0\n\
+._11:\n\
+ .word sub_808303C+1\n\
+._9:\n\
+ ldr r0, ._15 @ sub_8083188\n\
+ cmp r1, r0\n\
+ bne ._13 @cond_branch\n\
+ mov r0, #0x13\n\
+ b ._30\n\
+._16:\n\
+ .align 2, 0\n\
+._15:\n\
+ .word sub_8083188+1\n\
+._13:\n\
+ ldr r0, ._19 @ sub_80830E4\n\
+ cmp r1, r0\n\
+ bne ._17 @cond_branch\n\
+ mov r0, #0x14\n\
+ b ._30\n\
+._20:\n\
+ .align 2, 0\n\
+._19:\n\
+ .word sub_80830E4+1\n\
+._17:\n\
+ ldr r0, ._23 @ sub_80831F8\n\
+ cmp r1, r0\n\
+ bne ._21 @cond_branch\n\
+ mov r0, #0x21\n\
+ b ._30\n\
+._24:\n\
+ .align 2, 0\n\
+._23:\n\
+ .word sub_80831F8+1\n\
+._21:\n\
+ ldr r0, ._27 @ sub_8083314\n\
+ cmp r1, r0\n\
+ bne ._25 @cond_branch\n\
+ mov r0, #0x2\n\
+ b ._30\n\
+._28:\n\
+ .align 2, 0\n\
+._27:\n\
+ .word sub_8083314+1\n\
+._25:\n\
+ ldr r0, ._31 @ sub_80833C4\n\
+ cmp r1, r0\n\
+ beq ._29 @cond_branch\n\
+ mov r0, #0x0\n\
+ b ._30\n\
+._32:\n\
+ .align 2, 0\n\
+._31:\n\
+ .word sub_80833C4+1\n\
+._29:\n\
+ mov r0, #0x3\n\
+._30:\n\
+ pop {r1}\n\
+ bx r1");
+}
+
+__attribute__((naked))
+void debug_sub_808A55C()
+{
+ asm("\
+ push {r4, r5, r6, r7, lr}\n\
+ mov r7, r8\n\
+ push {r7}\n\
+ lsl r0, r0, #0x18\n\
+ lsr r7, r0, #0x18\n\
+ ldr r2, ._37 @ gTasks\n\
+ lsl r0, r7, #0x2\n\
+ add r0, r0, r7\n\
+ lsl r0, r0, #0x3\n\
+ add r4, r0, r2\n\
+ mov r0, #0x8\n\
+ ldsh r1, [r4, r0]\n\
+ lsl r0, r1, #0x2\n\
+ add r0, r0, r1\n\
+ lsl r0, r0, #0x3\n\
+ add r0, r0, r2\n\
+ ldrb r0, [r0, #0x4]\n\
+ cmp r0, #0\n\
+ bne ._33 @cond_branch\n\
+ mov r1, #0xa\n\
+ ldsh r0, [r4, r1]\n\
+ cmp r0, #0x5\n\
+ bne ._34 @cond_branch\n\
+ add r0, r7, #0\n\
+ bl DestroyTask\n\
+._34:\n\
+ ldrh r0, [r4, #0xa]\n\
+ add r0, r0, #0x1\n\
+ strh r0, [r4, #0xa]\n\
+._33:\n\
+ ldr r0, ._37 + 4 @ gShouldAdvanceLinkState\n\
+ ldrb r0, [r0]\n\
+ mov r1, #0x2\n\
+ mov r2, #0x0\n\
+ mov r3, #0x2\n\
+ bl PrintHex\n\
+ ldr r0, ._37 + 8 @ gBlockSendBuffer\n\
+ ldrb r0, [r0]\n\
+ mov r1, #0x16\n\
+ mov r2, #0x5\n\
+ mov r3, #0x4\n\
+ bl PrintHex\n\
+ mov r4, #0x0\n\
+ lsl r3, r7, #0x2\n\
+ mov r8, r3\n\
+ mov r6, #0xc0\n\
+ lsl r6, r6, #0x13\n\
+ mov r5, #0xa0\n\
+ lsl r5, r5, #0x13\n\
+._35:\n\
+ ldr r0, ._37 + 12 @ gLinkPlayerPending\n\
+ add r0, r4, r0\n\
+ ldrb r0, [r0]\n\
+ lsr r1, r5, #0x18\n\
+ mov r2, #0x0\n\
+ mov r3, #0x1\n\
+ bl PrintHex\n\
+ ldr r1, ._37 + 16 @ gBlockRecvBuffer\n\
+ lsl r0, r4, #0x8\n\
+ add r0, r0, r1\n\
+ ldrh r0, [r0]\n\
+ lsr r2, r6, #0x18\n\
+ mov r1, #0x16\n\
+ mov r3, #0x4\n\
+ bl PrintHex\n\
+ mov r0, #0x80\n\
+ lsl r0, r0, #0x11\n\
+ add r6, r6, r0\n\
+ mov r1, #0x80\n\
+ lsl r1, r1, #0x12\n\
+ add r5, r5, r1\n\
+ add r4, r4, #0x1\n\
+ cmp r4, #0x3\n\
+ ble ._35 @cond_branch\n\
+ ldr r4, ._37 + 20 @ gLinkStatus\n\
+ ldr r0, [r4]\n\
+ mov r1, #0xf\n\
+ mov r2, #0x0\n\
+ mov r3, #0x8\n\
+ bl PrintHex\n\
+ ldr r0, ._37 + 24 @ gLink\n\
+ ldrb r0, [r0, #0x1]\n\
+ mov r1, #0x2\n\
+ mov r2, #0xa\n\
+ mov r3, #0x2\n\
+ bl PrintHex\n\
+ bl GetMultiplayerId\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ mov r1, #0x7\n\
+ mov r2, #0xc\n\
+ mov r3, #0x2\n\
+ bl PrintHex\n\
+ bl GetBlockReceivedStatus\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ mov r1, #0x7\n\
+ mov r2, #0xa\n\
+ mov r3, #0x2\n\
+ bl PrintHex\n\
+ ldr r0, ._37 + 28 @ gReceivedRemoteLinkPlayers\n\
+ ldrb r0, [r0]\n\
+ mov r1, #0x2\n\
+ mov r2, #0xc\n\
+ mov r3, #0x1\n\
+ bl PrintHex\n\
+ ldr r0, ._37 + 32 @ gSpecialVar_Result\n\
+ ldrh r0, [r0]\n\
+ mov r1, #0xb\n\
+ mov r2, #0x8\n\
+ mov r3, #0x2\n\
+ bl PrintHex\n\
+ ldr r0, [r4]\n\
+ mov r1, #0x1c\n\
+ and r0, r0, r1\n\
+ lsr r0, r0, #0x2\n\
+ mov r1, #0xb\n\
+ mov r2, #0xa\n\
+ mov r3, #0x2\n\
+ bl PrintHex\n\
+ bl IsLinkConnectionEstablished\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ mov r1, #0xb\n\
+ mov r2, #0xc\n\
+ mov r3, #0x1\n\
+ bl PrintHex\n\
+ bl IsLinkTaskFinished\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ mov r1, #0xf\n\
+ mov r2, #0xa\n\
+ mov r3, #0x1\n\
+ bl PrintHex\n\
+ ldr r2, ._37 @ gTasks\n\
+ mov r3, r8\n\
+ add r0, r3, r7\n\
+ lsl r0, r0, #0x3\n\
+ add r0, r0, r2\n\
+ mov r3, #0x8\n\
+ ldsh r1, [r0, r3]\n\
+ lsl r0, r1, #0x2\n\
+ add r0, r0, r1\n\
+ lsl r0, r0, #0x3\n\
+ add r0, r0, r2\n\
+ ldr r0, [r0]\n\
+ bl debug_sub_808A4D0\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ mov r1, #0xf\n\
+ mov r2, #0xc\n\
+ mov r3, #0x2\n\
+ bl PrintHex\n\
+ ldr r0, ._37 + 36 @ gLinkCallback\n\
+ ldr r0, [r0]\n\
+ mov r1, #0x2\n\
+ mov r2, #0xd\n\
+ mov r3, #0x8\n\
+ bl PrintHex\n\
+ bl HasLinkErrorOccurred\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ mov r1, #0x2\n\
+ mov r2, #0x2\n\
+ mov r3, #0x1\n\
+ bl PrintHex\n\
+ ldr r0, ._37 + 40 @ gLinkPlayers\n\
+ mov r6, #0x80\n\
+ lsl r6, r6, #0x12\n\
+ add r5, r0, #0\n\
+ add r5, r5, #0x14\n\
+ mov r4, #0x3\n\
+._36:\n\
+ ldr r0, [r5]\n\
+ lsr r1, r6, #0x18\n\
+ mov r2, #0x3\n\
+ mov r3, #0x4\n\
+ bl PrintHex\n\
+ mov r0, #0xc0\n\
+ lsl r0, r0, #0x13\n\
+ add r6, r6, r0\n\
+ add r5, r5, #0x1c\n\
+ sub r4, r4, #0x1\n\
+ cmp r4, #0\n\
+ bge ._36 @cond_branch\n\
+ ldr r0, ._37 + 44 @ 0x4000128\n\
+ ldrh r0, [r0]\n\
+ mov r1, #0x2\n\
+ mov r2, #0x6\n\
+ mov r3, #0x4\n\
+ bl PrintHex\n\
+ bl debug_sub_808B850\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ mov r1, #0x19\n\
+ mov r2, #0x3\n\
+ mov r3, #0x1\n\
+ bl PrintHex\n\
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4, r5, r6, r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+._38:\n\
+ .align 2, 0\n\
+._37:\n\
+ .word gTasks\n\
+ .word gShouldAdvanceLinkState\n\
+ .word gBlockSendBuffer\n\
+ .word gLinkPlayerPending\n\
+ .word gBlockRecvBuffer\n\
+ .word gLinkStatus\n\
+ .word gLink\n\
+ .word gReceivedRemoteLinkPlayers\n\
+ .word gSpecialVar_Result\n\
+ .word gLinkCallback\n\
+ .word gLinkPlayers\n\
+ .word 0x4000128");
+}
+#endif
+
+#if DEBUG
+__attribute__((naked))
+static void sub_8082CD4(u8 arg0, u8 arg1)
+{
+ asm("\
+ push {r4, r5, r6, r7, lr}\n\
+ lsl r0, r0, #0x18\n\
+ lsr r7, r0, #0x18\n\
+ lsl r1, r1, #0x18\n\
+ lsr r6, r1, #0x18\n\
+ mov r0, #0xc\n\
+ mov r1, #0x0\n\
+ mov r2, #0x1f\n\
+ mov r3, #0x2\n\
+ bl InitLinkTestBG_Unused\n\
+ ldr r4, ._40 @ sub_8082F20\n\
+ add r0, r4, #0\n\
+ bl FindTaskIdByFunc\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ cmp r0, #0xff\n\
+ bne ._39 @cond_branch\n\
+ add r0, r4, #0\n\
+ mov r1, #0x50\n\
+ bl CreateTask\n\
+ add r4, r0, #0\n\
+ lsl r4, r4, #0x18\n\
+ lsr r4, r4, #0x18\n\
+ ldr r5, ._40 + 4 @ gTasks\n\
+ lsl r0, r4, #0x2\n\
+ add r0, r0, r4\n\
+ lsl r0, r0, #0x3\n\
+ add r0, r0, r5\n\
+ strh r7, [r0, #0xa]\n\
+ strh r6, [r0, #0xc]\n\
+ ldr r0, ._40 + 8 @ debug_sub_808A55C\n\
+ mov r1, #0x50\n\
+ bl CreateTask\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\
+ add r1, r1, r5\n\
+ strh r4, [r1, #0x8]\n\
+._39:\n\
+ pop {r4, r5, r6, r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+._41:\n\
+ .align 2, 0\n\
+._40:\n\
+ .word sub_8082F20+1\n\
+ .word gTasks\n\
+ .word debug_sub_808A55C+1");
+}
+#else
static void sub_8082CD4(u8 arg0, u8 arg1)
{
if (FindTaskIdByFunc(sub_8082F20) == 0xFF)
@@ -105,6 +482,7 @@ static void sub_8082CD4(u8 arg0, u8 arg1)
gTasks[taskId].data[2] = arg1;
}
}
+#endif
static void sub_8082D18(u32 value)
{
@@ -207,7 +585,7 @@ void unref_sub_8082EEC(u8 taskId)
}
}
-static void sub_8082F20(u8 taskId)
+/*static*/ void sub_8082F20(u8 taskId)
{
s16 *data = gTasks[taskId].data;
@@ -360,6 +738,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;
@@ -908,6 +1290,74 @@ void sub_8083C50(u8 taskId)
DestroyTask(taskId);
}
+#if DEBUG
+
+__attribute__((naked))
+void debug_sub_808B778()
+{
+ asm("\
+ push {r4, lr}\n\
+ ldr r4, ._390 @ debug_sub_808B7A8\n\
+ add r0, r4, #0\n\
+ bl FuncIsActiveTask\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ bne ._389 @cond_branch\n\
+ add r0, r4, #0\n\
+ mov r1, #0x50\n\
+ bl CreateTask\n\
+._389:\n\
+ ldr r1, ._390 + 4 @ unk_3004E98\n\
+ ldr r0, [r1]\n\
+ add r0, r0, #0x1\n\
+ str r0, [r1]\n\
+ pop {r4}\n\
+ pop {r0}\n\
+ bx r0\n\
+._391:\n\
+ .align 2, 0\n\
+._390:\n\
+ .word debug_sub_808B7A8+1\n\
+ .word unk_3004E98");
+}
+
+__attribute__((naked))
+void debug_sub_808B7A8()
+{
+ asm("\
+ push {lr}\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ ldr r2, ._393 @ gTasks\n\
+ lsl r1, r0, #0x2\n\
+ add r1, r1, r0\n\
+ lsl r1, r1, #0x3\n\
+ add r1, r1, r2\n\
+ ldrh r0, [r1, #0x8]\n\
+ add r0, r0, #0x1\n\
+ strh r0, [r1, #0x8]\n\
+ lsl r0, r0, #0x10\n\
+ asr r0, r0, #0x10\n\
+ cmp r0, #0x1e\n\
+ bne ._392 @cond_branch\n\
+ mov r0, #0x0\n\
+ strh r0, [r1, #0x8]\n\
+ ldr r2, ._393 + 4 @ unk_3004E94\n\
+ ldrh r0, [r2]\n\
+ mov r1, #0x1\n\
+ orr r0, r0, r1\n\
+ strh r0, [r2]\n\
+._392:\n\
+ pop {r0}\n\
+ bx r0\n\
+._394:\n\
+ .align 2, 0\n\
+._393:\n\
+ .word gTasks\n\
+ .word unk_3004E94");
+}
+#endif
+
static void sub_8083CA4(u8 taskId)
{
if (!gReceivedRemoteLinkPlayers)
@@ -921,4 +1371,23 @@ void unref_sub_8083CC8(u8 taskId)
{
sub_800832C();
gTasks[taskId].func = sub_8083CA4;
-} \ No newline at end of file
+}
+
+#if DEBUG
+
+void debug_sub_808B82C(void)
+{
+ unk_2030220 = 0;
+}
+
+void debug_sub_808B838(u8 a)
+{
+ unk_2030220 |= 1 << a;
+}
+
+int debug_sub_808B850(void)
+{
+ return unk_2030220;
+}
+
+#endif \ No newline at end of file
diff --git a/src/engine/clock.c b/src/engine/clock.c
index 416aaa6bb..fceccdfcb 100644
--- a/src/engine/clock.c
+++ b/src/engine/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/engine/link.c b/src/engine/link.c
index 33037b817..00c084069 100644
--- a/src/engine/link.c
+++ b/src/engine/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"
@@ -66,7 +68,7 @@ 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);
+void PrintHex(u32, u8, u8, u8);
static void LinkCB_RequestPlayerDataExchange(void);
static void Task_PrintTestData(u8);
bool8 sub_8008224(void);
@@ -79,7 +81,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 +147,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 +161,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 +194,19 @@ const struct BlockRequest sBlockRequestLookupTable[5] =
static const u8 sTestString[] = _("テストな");
-ALIGNED(4) static const u8 sMagic[] = "GameFreak inc.";
+// TODO: fix the alignment here
+
+ALIGNED(4) const u8 sMagic[] = "GameFreak inc.";
-ALIGNED(4) static const u8 sEmptyString[] = _("");
+#if DEBUG
+const u8 sEmptyString[] = _(" ");
+#else
+ALIGNED(4) const u8 sEmptyString[] = _("");
+#endif
+
+#if DEBUG
+const u8 linkDebugFillerPleaseRemove[2] = {0};
+#endif
void Task_DestroySelf(u8 taskId)
{
@@ -543,6 +558,9 @@ static void ProcessRecvCmds(u8 unusedParam)
else
{
SetBlockReceivedFlag(i);
+#if DEBUG
+ debug_sub_808B838(i);
+#endif
}
}
break;
@@ -952,7 +970,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;
@@ -970,6 +988,143 @@ static void PrintHex(u32 num, u8 x, u8 y, u8 maxDigits)
}
}
+#if DEBUG
+
+EWRAM_DATA u16 *debugCharacterBase = NULL;
+EWRAM_DATA void *unk_20238C8 = NULL;
+EWRAM_DATA u16 (*debugTileMap)[] = NULL;
+EWRAM_DATA u32 unk_20238D0 = 0;
+
+void debug_sub_8008218(u16 *buffer, void *arg1, u16 (*arg2)[], u32 arg3)
+{
+ CpuSet(sLinkTestDigitTiles, buffer, 272);
+ debugCharacterBase = buffer;
+ unk_20238C8 = arg1;
+ debugTileMap = arg2;
+ unk_20238D0 = arg3;
+}
+
+#ifdef NONMATCHING
+void debug_sub_8008264(u32 value, int left, int top, int r3, int sp0)
+{
+ u32 buffer[8];
+ u32 *ptr;
+
+ u16 *dest;
+
+ int i;
+
+ if (unk_20238D0 != sp0)
+ return;
+
+ r3 = max(r3, 8);
+
+ ptr = &buffer[0];
+ dest = &(*debugTileMap)[left + top * 32];
+
+ for (i = r3; i != 0; i--)
+ {
+ *(ptr++) = value & 0xF;
+ value = value >> 4;
+ }
+
+ ptr = &buffer[8 - r3];
+ for (i = r3; i != 0; i--)
+ {
+ int charOffset = (((uintptr_t) debugCharacterBase) - ((uintptr_t) unk_20238C8)) / 32;
+ *dest = *ptr + charOffset + 1;
+ ptr--;
+ dest++;
+ }
+}
+#else
+__attribute__((naked))
+void debug_sub_8008264(u32 value, int left, int top, int r3, int sp0)
+{
+ asm(
+ " push {r4, r5, r6, r7, lr}\n"
+ " mov r7, r8\n"
+ " push {r7}\n"
+ " add sp, sp, #0xffffffe0\n"
+ " add r5, r0, #0\n"
+ " add r6, r1, #0\n"
+ " add r4, r3, #0\n"
+ " ldr r0, [sp, #0x38]\n"
+ " ldr r1, ._347 @ unk_20238D0\n"
+ " ldr r1, [r1]\n"
+ " cmp r1, r0\n"
+ " bne ._345 @cond_branch\n"
+ " cmp r4, #0x8\n"
+ " ble ._342 @cond_branch\n"
+ " mov r4, #0x8\n"
+ "._342:\n"
+ " mov r3, sp\n"
+ " ldr r0, ._347 + 4 @ debugTileMap\n"
+ " mov r8, r0\n"
+ " lsl r2, r2, #0x6\n"
+ " mov ip, r2\n"
+ " lsl r6, r6, #0x1\n"
+ " lsl r7, r4, #0x2\n"
+ " cmp r4, #0\n"
+ " ble ._343 @cond_branch\n"
+ " mov r1, #0xf\n"
+ " add r2, r4, #0\n"
+ "._344:\n"
+ " add r0, r5, #0\n"
+ " and r0, r0, r1\n"
+ " stmia r3!, {r0}\n"
+ " lsr r5, r5, #0x4\n"
+ " sub r2, r2, #0x1\n"
+ " cmp r2, #0\n"
+ " bne ._344 @cond_branch\n"
+ "._343:\n"
+ " mov r1, r8\n"
+ " ldr r0, [r1]\n"
+ " add r0, r0, ip\n"
+ " add r5, r0, r6\n"
+ " mov r1, sp\n"
+ " add r0, r1, r7\n"
+ " sub r3, r0, #4\n"
+ " cmp r4, #0\n"
+ " ble ._345 @cond_branch\n"
+ " ldr r7, ._347 + 8 @ debugCharacterBase\n"
+ " ldr r6, ._347 + 12 @ unk_20238C8\n"
+ " add r2, r4, #0\n"
+ "._346:\n"
+ " ldr r1, [r7]\n"
+ " ldr r0, [r6]\n"
+ " sub r1, r1, r0\n"
+ " lsr r1, r1, #0x5\n"
+ " ldr r0, [r3]\n"
+ " add r0, r0, r1\n"
+ " add r0, r0, #0x1\n"
+ " strh r0, [r5]\n"
+ " sub r3, r3, #0x4\n"
+ " add r5, r5, #0x2\n"
+ " sub r2, r2, #0x1\n"
+ " cmp r2, #0\n"
+ " bne ._346 @cond_branch\n"
+ "._345:\n"
+ " add sp, sp, #0x20\n"
+ " pop {r3}\n"
+ " mov r8, r3\n"
+ " pop {r4, r5, r6, r7}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._348:\n"
+ " .align 2, 0\n"
+ "._347:\n"
+ " .word unk_20238D0\n"
+ " .word debugTileMap\n"
+ " .word debugCharacterBase\n"
+ " .word unk_20238C8\n"
+ "\n"
+ );
+}
+#endif
+
+#endif
+
static void LinkCB_RequestPlayerDataExchange(void)
{
// Only one request needs to be sent, so only the master sends it.
@@ -1248,14 +1403,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/mystery_event_menu.c b/src/engine/mystery_event_menu.c
index 8fad563e6..bc14c760d 100644
--- a/src/engine/mystery_event_menu.c
+++ b/src/engine/mystery_event_menu.c
@@ -338,3 +338,463 @@ static void CB2_MysteryEventMenu(void)
BuildOamBuffer();
UpdatePaletteFade();
}
+
+#if DEBUG
+
+void debug_sub_815D1D8();
+
+__attribute__((naked))
+void debug_sub_815D04C()
+{
+ asm(
+ " push {r4, r5, r6, lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r5, r0, #0x18\n"
+ " ldr r1, ._125 @ 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, #0\n"
+ " bne ._121 @cond_branch\n"
+ " mov r0, #0x4\n"
+ " mov r1, #0x4\n"
+ " mov r2, #0xd\n"
+ " mov r3, #0x7\n"
+ " bl Menu_DrawStdWindowFrame\n"
+ " ldr r1, ._125 + 4 @ gUnknown_Debug_842E2D0\n"
+ " mov r2, #0xa\n"
+ " ldsh r0, [r4, r2]\n"
+ " lsl r0, r0, #0x3\n"
+ " add r0, r0, r1\n"
+ " ldr r0, [r0]\n"
+ " mov r1, #0x5\n"
+ " mov r2, #0x5\n"
+ " bl Menu_PrintText\n"
+ " ldrh r0, [r4, #0x8]\n"
+ " add r0, r0, #0x1\n"
+ " strh r0, [r4, #0x8]\n"
+ "._121:\n"
+ " ldr r2, ._125 + 8 @ gMain\n"
+ " ldrh r1, [r2, #0x2e]\n"
+ " mov r0, #0x20\n"
+ " and r0, r0, r1\n"
+ " add r6, r2, #0\n"
+ " cmp r0, #0\n"
+ " beq ._122 @cond_branch\n"
+ " ldrh r1, [r4, #0xa]\n"
+ " mov r2, #0xa\n"
+ " ldsh r0, [r4, r2]\n"
+ " cmp r0, #0\n"
+ " bne ._123 @cond_branch\n"
+ " ldr r0, ._125 + 12 @ gUnknown_Debug_842E350\n"
+ " ldrb r0, [r0]\n"
+ " sub r0, r0, #0x1\n"
+ " b ._124\n"
+ "._126:\n"
+ " .align 2, 0\n"
+ "._125:\n"
+ " .word gTasks\n"
+ " .word gUnknown_Debug_842E2D0\n"
+ " .word gMain\n"
+ " .word gUnknown_Debug_842E350\n"
+ "._123:\n"
+ " sub r0, r1, #1\n"
+ "._124:\n"
+ " strh r0, [r4, #0xa]\n"
+ " ldr r0, ._130 @ gTasks\n"
+ " lsl r1, r5, #0x2\n"
+ " add r1, r1, r5\n"
+ " lsl r1, r1, #0x3\n"
+ " add r1, r1, r0\n"
+ " mov r0, #0x0\n"
+ " strh r0, [r1, #0x8]\n"
+ "._122:\n"
+ " ldrh r1, [r6, #0x2e]\n"
+ " mov r0, #0x10\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._127 @cond_branch\n"
+ " ldr r1, ._130 @ gTasks\n"
+ " lsl r2, r5, #0x2\n"
+ " add r0, r2, r5\n"
+ " lsl r0, r0, #0x3\n"
+ " add r4, r0, r1\n"
+ " mov r0, #0xa\n"
+ " ldsh r3, [r4, r0]\n"
+ " ldr r0, ._130 + 4 @ gUnknown_Debug_842E350\n"
+ " ldrb r0, [r0]\n"
+ " sub r0, r0, #0x1\n"
+ " cmp r3, r0\n"
+ " bne ._128 @cond_branch\n"
+ " mov r0, #0x0\n"
+ " b ._129\n"
+ "._131:\n"
+ " .align 2, 0\n"
+ "._130:\n"
+ " .word gTasks\n"
+ " .word gUnknown_Debug_842E350\n"
+ "._128:\n"
+ " ldrh r0, [r4, #0xa]\n"
+ " add r0, r0, #0x1\n"
+ "._129:\n"
+ " strh r0, [r4, #0xa]\n"
+ " add r0, r2, r5\n"
+ " lsl r0, r0, #0x3\n"
+ " add r0, r0, r1\n"
+ " mov r1, #0x0\n"
+ " strh r1, [r0, #0x8]\n"
+ "._127:\n"
+ " ldrh r1, [r6, #0x2e]\n"
+ " mov r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._132 @cond_branch\n"
+ " ldr r1, ._133 @ gTasks\n"
+ " lsl r0, r5, #0x2\n"
+ " add r0, r0, r5\n"
+ " lsl r0, r0, #0x3\n"
+ " add r0, r0, r1\n"
+ " mov r2, #0xa\n"
+ " ldsh r1, [r0, r2]\n"
+ " lsl r1, r1, #0x3\n"
+ " ldr r0, ._133 + 4 @ gUnknown_Debug_842E2D0\n"
+ " add r0, r0, #0x4\n"
+ " add r1, r1, r0\n"
+ " ldr r0, ._133 + 8 @ \n"
+ " ldr r1, [r1]\n"
+ " bl _call_via_r1\n"
+ " ldr r0, ._133 + 12 @ \n"
+ " add r1, r6, r0\n"
+ " ldrb r0, [r1]\n"
+ " add r0, r0, #0x1\n"
+ " strb r0, [r1]\n"
+ " add r0, r5, #0\n"
+ " bl DestroyTask\n"
+ "._132:\n"
+ " pop {r4, r5, r6}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._134:\n"
+ " .align 2, 0\n"
+ "._133:\n"
+ " .word gTasks\n"
+ " .word gUnknown_Debug_842E2D0\n"
+ " .word +0x2004000\n"
+ " .word 0x43c\n"
+ "\n"
+ );
+}
+
+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);
+}
+
+__attribute__((naked))
+void debug_sub_815D1D8()
+{
+ asm(
+ " push {r4, lr}\n"
+ " add sp, sp, #0xfffffffc\n"
+ " ldr r1, ._139 @ gMain\n"
+ " ldr r2, ._139 + 4 @ 0x43c\n"
+ " add r0, r1, r2\n"
+ " ldrb r0, [r0]\n"
+ " add r4, r1, #0\n"
+ " cmp r0, #0xb\n"
+ " bls ._137 @cond_branch\n"
+ " b ._196\n"
+ "._137:\n"
+ " lsl r0, r0, #0x2\n"
+ " ldr r1, ._139 + 8 @ \n"
+ " add r0, r0, r1\n"
+ " ldr r0, [r0]\n"
+ " mov pc, r0\n"
+ "._140:\n"
+ " .align 2, 0\n"
+ "._139:\n"
+ " .word gMain\n"
+ " .word 0x43c\n"
+ " .word ._141\n"
+ "._141:\n"
+ " .word ._142\n"
+ " .word ._143\n"
+ " .word ._144\n"
+ " .word ._145\n"
+ " .word ._146\n"
+ " .word ._196\n"
+ " .word ._148\n"
+ " .word ._149\n"
+ " .word ._150\n"
+ " .word ._151\n"
+ " .word ._152\n"
+ " .word ._153\n"
+ "._142:\n"
+ " mov r0, #0x3\n"
+ " mov r1, #0xe\n"
+ " mov r2, #0x1b\n"
+ " mov r3, #0x13\n"
+ " bl Menu_DrawStdWindowFrame\n"
+ " mov r0, #0x1\n"
+ " neg r0, r0\n"
+ " mov r1, #0x0\n"
+ " str r1, [sp]\n"
+ " mov r2, #0x10\n"
+ " mov r3, #0x0\n"
+ " bl BeginNormalPaletteFade\n"
+ " ldr r1, ._155 @ gMain\n"
+ " ldr r0, ._155 + 4 @ 0x43c\n"
+ " add r1, r1, r0\n"
+ " b ._189\n"
+ "._156:\n"
+ " .align 2, 0\n"
+ "._155:\n"
+ " .word gMain\n"
+ " .word 0x43c\n"
+ "._143:\n"
+ " ldr r0, ._161 @ gPaletteFade\n"
+ " ldrb r1, [r0, #0x7]\n"
+ " mov r0, #0x80\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._157 @cond_branch\n"
+ " b ._196\n"
+ "._157:\n"
+ " ldrh r1, [r4, #0x2c]\n"
+ " mov r0, #0x80\n"
+ " lsl r0, r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._159 @cond_branch\n"
+ " ldr r1, ._161 + 4 @ gUnknown_Debug_30030E0\n"
+ " ldrb r0, [r1]\n"
+ " add r0, r0, #0x1\n"
+ " strb r0, [r1]\n"
+ "._159:\n"
+ " ldr r0, ._161 + 8 @ Str_843DA70\n"
+ " mov r1, #0x4\n"
+ " mov r2, #0xf\n"
+ " bl MenuPrintMessage\n"
+ " ldr r2, ._161 + 12 @ 0x43c\n"
+ " add r1, r4, r2\n"
+ " b ._189\n"
+ "._162:\n"
+ " .align 2, 0\n"
+ "._161:\n"
+ " .word gPaletteFade\n"
+ " .word gUnknown_Debug_30030E0\n"
+ " .word Str_843DA70\n"
+ " .word 0x43c\n"
+ "._144:\n"
+ " bl Menu_UpdateWindowText\n"
+ " lsl r0, r0, #0x18\n"
+ " cmp r0, #0\n"
+ " bne ._163 @cond_branch\n"
+ " b ._196\n"
+ "._163:\n"
+ " ldr r1, ._166 @ gMain\n"
+ " ldr r0, ._166 + 4 @ 0x43c\n"
+ " add r1, r1, r0\n"
+ " ldrb r0, [r1]\n"
+ " add r0, r0, #0x1\n"
+ " strb r0, [r1]\n"
+ " ldr r1, ._166 + 8 @ gLinkType\n"
+ " ldr r2, ._166 + 12 @ 0x5501\n"
+ " add r0, r2, #0\n"
+ " strh r0, [r1]\n"
+ " bl OpenLink\n"
+ " b ._196\n"
+ "._167:\n"
+ " .align 2, 0\n"
+ "._166:\n"
+ " .word gMain\n"
+ " .word 0x43c\n"
+ " .word gLinkType\n"
+ " .word 0x5501\n"
+ "._145:\n"
+ " ldr r0, ._171 @ gReceivedRemoteLinkPlayers\n"
+ " ldrb r0, [r0]\n"
+ " cmp r0, #0\n"
+ " bne ._168 @cond_branch\n"
+ " b ._196\n"
+ "._168:\n"
+ " ldr r1, ._171 + 4 @ 0x43c\n"
+ " add r0, r4, r1\n"
+ " ldrb r1, [r0]\n"
+ " add r1, r1, #0x1\n"
+ " strb r1, [r0]\n"
+ " ldr r0, ._171 + 8 @ Str_843DA84\n"
+ " mov r1, #0x4\n"
+ " mov r2, #0xf\n"
+ " bl MenuPrintMessage\n"
+ " b ._196\n"
+ "._172:\n"
+ " .align 2, 0\n"
+ "._171:\n"
+ " .word gReceivedRemoteLinkPlayers\n"
+ " .word 0x43c\n"
+ " .word Str_843DA84\n"
+ "._146:\n"
+ " bl Menu_UpdateWindowText\n"
+ " lsl r0, r0, #0x18\n"
+ " cmp r0, #0\n"
+ " bne ._173 @cond_branch\n"
+ " b ._196\n"
+ "._173:\n"
+ " ldr r0, ._176 @ debug_sub_815D04C\n"
+ " mov r1, #0xa\n"
+ " bl CreateTask\n"
+ " ldr r1, ._176 + 4 @ gMain\n"
+ " ldr r2, ._176 + 8 @ 0x43c\n"
+ " add r1, r1, r2\n"
+ " b ._189\n"
+ "._177:\n"
+ " .align 2, 0\n"
+ "._176:\n"
+ " .word debug_sub_815D04C+1\n"
+ " .word gMain\n"
+ " .word 0x43c\n"
+ "._148:\n"
+ " ldr r0, ._179 @ Str_843DA98\n"
+ " mov r1, #0x4\n"
+ " mov r2, #0xf\n"
+ " bl MenuPrintMessage\n"
+ " ldr r1, ._179 + 4 @ 0x2004000\n"
+ " ldr r2, ._179 + 8 @ 0x2004\n"
+ " mov r0, #0x0\n"
+ " bl SendBlock\n"
+ " ldr r1, ._179 + 12 @ gMain\n"
+ " ldr r0, ._179 + 16 @ 0x43c\n"
+ " add r1, r1, r0\n"
+ " b ._189\n"
+ "._180:\n"
+ " .align 2, 0\n"
+ "._179:\n"
+ " .word Str_843DA98\n"
+ " .word 0x2004000\n"
+ " .word 0x2004\n"
+ " .word gMain\n"
+ " .word 0x43c\n"
+ "._149:\n"
+ " bl Menu_UpdateWindowText\n"
+ " bl IsLinkTaskFinished\n"
+ " lsl r0, r0, #0x18\n"
+ " cmp r0, #0\n"
+ " beq ._196 @cond_branch\n"
+ " ldr r1, ._183 @ gMain\n"
+ " ldr r2, ._183 + 4 @ 0x43c\n"
+ " add r1, r1, r2\n"
+ " b ._189\n"
+ "._184:\n"
+ " .align 2, 0\n"
+ "._183:\n"
+ " .word gMain\n"
+ " .word 0x43c\n"
+ "._150:\n"
+ " bl sub_800832C\n"
+ " ldr r1, ._186 @ gMain\n"
+ " ldr r0, ._186 + 4 @ 0x43c\n"
+ " add r1, r1, r0\n"
+ " b ._189\n"
+ "._187:\n"
+ " .align 2, 0\n"
+ "._186:\n"
+ " .word gMain\n"
+ " .word 0x43c\n"
+ "._151:\n"
+ " ldr r0, ._190 @ gReceivedRemoteLinkPlayers\n"
+ " ldrb r0, [r0]\n"
+ " cmp r0, #0\n"
+ " bne ._196 @cond_branch\n"
+ " mov r0, #0x4\n"
+ " mov r1, #0xf\n"
+ " mov r2, #0x1a\n"
+ " mov r3, #0x12\n"
+ " bl Menu_BlankWindowRect\n"
+ " ldr r0, ._190 + 4 @ Str_843DAA3\n"
+ " mov r1, #0x4\n"
+ " mov r2, #0xf\n"
+ " bl Menu_PrintText\n"
+ " ldr r1, ._190 + 8 @ gMain\n"
+ " ldr r2, ._190 + 12 @ 0x43c\n"
+ " add r1, r1, r2\n"
+ " b ._189\n"
+ "._191:\n"
+ " .align 2, 0\n"
+ "._190:\n"
+ " .word gReceivedRemoteLinkPlayers\n"
+ " .word Str_843DAA3\n"
+ " .word gMain\n"
+ " .word 0x43c\n"
+ "._152:\n"
+ " ldrh r1, [r4, #0x2e]\n"
+ " mov r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._196 @cond_branch\n"
+ " mov r0, #0x1\n"
+ " neg r0, r0\n"
+ " mov r1, #0x0\n"
+ " str r1, [sp]\n"
+ " mov r2, #0x0\n"
+ " mov r3, #0x10\n"
+ " bl BeginNormalPaletteFade\n"
+ " ldr r0, ._194 @ 0x43c\n"
+ " add r1, r4, r0\n"
+ "._189:\n"
+ " ldrb r0, [r1]\n"
+ " add r0, r0, #0x1\n"
+ " strb r0, [r1]\n"
+ " b ._196\n"
+ "._195:\n"
+ " .align 2, 0\n"
+ "._194:\n"
+ " .word 0x43c\n"
+ "._153:\n"
+ " ldr r0, ._197 @ gPaletteFade\n"
+ " ldrb r1, [r0, #0x7]\n"
+ " mov r0, #0x80\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " bne ._196 @cond_branch\n"
+ " ldr r0, ._197 + 4 @ CB2_InitTitleScreen\n"
+ " bl SetMainCallback2\n"
+ "._196:\n"
+ " bl RunTasks\n"
+ " bl AnimateSprites\n"
+ " bl BuildOamBuffer\n"
+ " bl UpdatePaletteFade\n"
+ " add sp, sp, #0x4\n"
+ " pop {r4}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._198:\n"
+ " .align 2, 0\n"
+ "._197:\n"
+ " .word gPaletteFade\n"
+ " .word CB2_InitTitleScreen+1\n"
+ "\n"
+ );
+}
+
+#endif
diff --git a/src/engine/naming_screen.c b/src/engine/naming_screen.c
index 55e377c21..5cb06d56f 100644
--- a/src/engine/naming_screen.c
+++ b/src/engine/naming_screen.c
@@ -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/engine/option_menu.c b/src/engine/option_menu.c
index d4e921a0e..a2d32ffb6 100644
--- a/src/engine/option_menu.c
+++ b/src/engine/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/engine/reset_rtc_screen.c b/src/engine/reset_rtc_screen.c
index ce4afe922..8b67f39a5 100644
--- a/src/engine/reset_rtc_screen.c
+++ b/src/engine/reset_rtc_screen.c
@@ -147,6 +147,13 @@ const struct SpriteTemplate gSpriteTemplate_83764E8 =
const u8 gUnknown_08376500[] = _(" : ");
+#if DEBUG
+const u8 gUnknown_Debug_0839AE94[] = _("にっすう");
+const u8 gUnknown_Debug_0839AE99[] = _("じかん");
+const u8 gUnknown_Debug_0839AE9D[] = _("ゲームない じかん");
+const u8 gUnknown_Debug_0839AEA7[] = _("RTC じかん");
+#endif
+
void SpriteCB_ResetRtcCusor0(struct Sprite *sprite)
{
int state = gTasks[sprite->data[0]].data[2];
@@ -587,3 +594,319 @@ void Task_ResetRtcScreen(u8 taskId)
}
}
}
+
+#if DEBUG
+
+__attribute__((naked))
+void debug_sub_806F8F8(void)
+{
+ asm("\
+ push {lr}\n\
+ ldr r0, ._131 @ CB2_InitResetRtcScreen\n\
+ bl SetMainCallback2\n\
+ pop {r0}\n\
+ bx r0\n\
+._132:\n\
+ .align 2, 0\n\
+._131:\n\
+ .word CB2_InitResetRtcScreen+1");
+}
+
+__attribute__((naked))
+void debug_sub_806F908(u8 a)
+{
+ 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 r2, ._136 @ gTasks\n\
+ add r4, r0, r2\n\
+ mov r1, #0x0\n\
+ ldsh r0, [r4, r1]\n\
+ cmp r0, #0\n\
+ beq ._133 @cond_branch\n\
+ cmp r0, #0x1\n\
+ beq ._134 @cond_branch\n\
+ b ._141\n\
+._137:\n\
+ .align 2, 0\n\
+._136:\n\
+ .word gTasks+0x8\n\
+._133:\n\
+ ldr r0, ._139 @ Task_ResetRtc_0\n\
+ mov r1, #0x50\n\
+ bl CreateTask\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ strh r0, [r4, #0x2]\n\
+ ldrh r0, [r4]\n\
+ add r0, r0, #0x1\n\
+ strh r0, [r4]\n\
+ b ._141\n\
+._140:\n\
+ .align 2, 0\n\
+._139:\n\
+ .word Task_ResetRtc_0+1\n\
+._134:\n\
+ sub r2, r2, #0x8\n\
+ mov r0, #0x2\n\
+ ldsh r1, [r4, r0]\n\
+ lsl r0, r1, #0x2\n\
+ add r0, r0, r1\n\
+ lsl r0, r0, #0x3\n\
+ add r2, r0, r2\n\
+ mov r1, #0x8\n\
+ ldsh r0, [r2, r1]\n\
+ cmp r0, #0\n\
+ beq ._141 @cond_branch\n\
+ mov r1, #0xa\n\
+ ldsh r0, [r2, r1]\n\
+ cmp r0, #0x1\n\
+ bne ._142 @cond_branch\n\
+ ldr r3, ._143 @ gLocalTime\n\
+ mov r1, #0x0\n\
+ ldsh r0, [r3, r1]\n\
+ mov r1, #0x2\n\
+ ldsb r1, [r3, r1]\n\
+ mov r2, #0x3\n\
+ ldsb r2, [r3, r2]\n\
+ ldrb r3, [r3, #0x4]\n\
+ lsl r3, r3, #0x18\n\
+ asr r3, r3, #0x18\n\
+ bl RtcCalcLocalTimeOffset\n\
+._142:\n\
+ ldrb r0, [r4, #0x2]\n\
+ bl DestroyTask\n\
+ bl Menu_EraseScreen\n\
+ bl ScriptContext2_Disable\n\
+ add r0, r5, #0\n\
+ bl DestroyTask\n\
+._141:\n\
+ pop {r4, r5}\n\
+ pop {r0}\n\
+ bx r0\n\
+._144:\n\
+ .align 2, 0\n\
+._143:\n\
+ .word gLocalTime");
+}
+
+__attribute__((naked))
+void debug_sub_806F99C()
+{
+ asm("\
+ push {lr}\n\
+ bl RtcCalcLocalTime\n\
+ ldr r0, ._145 @ debug_sub_806F908\n\
+ mov r1, #0x50\n\
+ bl CreateTask\n\
+ bl ScriptContext2_Enable\n\
+ pop {r0}\n\
+ bx r0\n\
+._146:\n\
+ .align 2, 0\n\
+._145:\n\
+ .word debug_sub_806F908+1");
+}
+
+__attribute__((naked))
+void debug_sub_806F9B8()
+{
+ asm("\
+ push {lr}\n\
+ ldr r2, ._147 @ gLocalTime\n\
+ ldr r0, ._147 + 4 @ gSaveBlock2\n\
+ add r0, r0, #0xa0\n\
+ ldr r1, [r0, #0x4]\n\
+ ldr r0, [r0]\n\
+ str r0, [r2]\n\
+ str r1, [r2, #0x4]\n\
+ ldr r0, ._147 + 8 @ debug_sub_806F908\n\
+ mov r1, #0x50\n\
+ bl CreateTask\n\
+ bl ScriptContext2_Enable\n\
+ pop {r0}\n\
+ bx r0\n\
+._148:\n\
+ .align 2, 0\n\
+._147:\n\
+ .word gLocalTime\n\
+ .word gSaveBlock2\n\
+ .word debug_sub_806F908+1");
+}
+
+__attribute__((naked))
+void debug_sub_806F9E4()
+{
+ 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\
+ lsl r0, r0, #0x18\n\
+ lsr r7, r0, #0x18\n\
+ lsl r0, r7, #0x2\n\
+ add r0, r0, r7\n\
+ lsl r0, r0, #0x3\n\
+ ldr r1, ._153 @ gTasks\n\
+ add r5, r0, r1\n\
+ ldr r6, ._153 + 4 @ gStringVar4\n\
+ mov r1, #0x0\n\
+ ldsh r0, [r5, r1]\n\
+ cmp r0, #0x1\n\
+ beq ._149 @cond_branch\n\
+ cmp r0, #0x1\n\
+ bgt ._150 @cond_branch\n\
+ cmp r0, #0\n\
+ beq ._151 @cond_branch\n\
+ b ._165\n\
+._154:\n\
+ .align 2, 0\n\
+._153:\n\
+ .word gTasks+0x8\n\
+ .word gStringVar4\n\
+._150:\n\
+ cmp r0, #0x2\n\
+ beq ._155 @cond_branch\n\
+ b ._165\n\
+._149:\n\
+ mov r0, #0x0\n\
+ mov r1, #0x9\n\
+ mov r2, #0x1d\n\
+ mov r3, #0x13\n\
+ bl Menu_DrawStdWindowFrame\n\
+ add r4, r6, #0\n\
+ add r4, r4, #0x50\n\
+ bl RtcGetErrorStatus\n\
+ add r1, r0, #0\n\
+ lsl r1, r1, #0x10\n\
+ lsr r1, r1, #0x10\n\
+ add r0, r4, #0\n\
+ mov r2, #0x2\n\
+ mov r3, #0x4\n\
+ bl ConvertIntToHexStringN\n\
+ add r0, r4, #0\n\
+ mov r1, #0x2\n\
+ mov r2, #0xa\n\
+ bl Menu_PrintText\n\
+ ldr r0, ._158 @ gUnknown_Debug_0839AE94\n\
+ mov r1, #0xc\n\
+ mov r2, #0xc\n\
+ bl Menu_PrintText\n\
+ ldr r0, ._158 + 4 @ gUnknown_Debug_0839AE99\n\
+ mov r1, #0x14\n\
+ mov r2, #0xc\n\
+ bl Menu_PrintText\n\
+ ldr r0, ._158 + 8 @ gUnknown_Debug_0839AEA7\n\
+ mov r1, #0x1\n\
+ mov r2, #0xe\n\
+ bl Menu_PrintText\n\
+ ldr r0, ._158 + 12 @ gUnknown_Debug_0839AE9D\n\
+ mov r1, #0x1\n\
+ mov r2, #0x10\n\
+ bl Menu_PrintText\n\
+._151:\n\
+ ldrh r0, [r5]\n\
+ add r0, r0, #0x1\n\
+ strh r0, [r5]\n\
+ b ._165\n\
+._159:\n\
+ .align 2, 0\n\
+._158:\n\
+ .word gUnknown_Debug_0839AE94\n\
+ .word gUnknown_Debug_0839AE99\n\
+ .word gUnknown_Debug_0839AEA7\n\
+ .word gUnknown_Debug_0839AE9D\n\
+._155:\n\
+ bl RtcCalcLocalTime\n\
+ add r0, r6, #0\n\
+ bl FormatHexRtcTime\n\
+ mov r2, #0x14\n\
+ add r2, r2, r6\n\
+ mov r9, r2\n\
+ mov r0, r9\n\
+ bl debug_sub_8009894\n\
+ mov r0, #0x28\n\
+ add r0, r0, r6\n\
+ mov sl, r0\n\
+ ldr r4, ._163 @ gLocalTime\n\
+ mov r1, #0x2\n\
+ ldsb r1, [r4, r1]\n\
+ mov r2, #0x3\n\
+ ldsb r2, [r4, r2]\n\
+ mov r3, #0x4\n\
+ ldsb r3, [r4, r3]\n\
+ bl FormatDecimalTime\n\
+ mov r1, #0x3c\n\
+ add r1, r1, r6\n\
+ mov r8, r1\n\
+ mov r2, #0x0\n\
+ ldsh r1, [r4, r2]\n\
+ mov r0, r8\n\
+ mov r2, #0x1\n\
+ mov r3, #0x4\n\
+ bl ConvertIntToDecimalStringN\n\
+ ldr r0, ._163 + 4 @ gSaveBlock2\n\
+ ldrb r0, [r0, #0x12]\n\
+ cmp r0, #0\n\
+ bne ._160 @cond_branch\n\
+ add r0, r6, #0\n\
+ mov r1, #0x14\n\
+ mov r2, #0xe\n\
+ bl Menu_PrintText\n\
+ mov r0, r9\n\
+ mov r1, #0xc\n\
+ mov r2, #0xe\n\
+ bl Menu_PrintText\n\
+ mov r0, sl\n\
+ mov r1, #0x14\n\
+ mov r2, #0x10\n\
+ bl Menu_PrintText\n\
+ mov r0, r8\n\
+ mov r1, #0xc\n\
+ mov r2, #0x10\n\
+ bl Menu_PrintText\n\
+._160:\n\
+ ldrh r1, [r5, #0x2]\n\
+ mov r2, #0x2\n\
+ ldsh r0, [r5, r2]\n\
+ cmp r0, #0x13\n\
+ ble ._161 @cond_branch\n\
+ add r0, r1, #1\n\
+ strh r0, [r5, #0x2]\n\
+ b ._165\n\
+._164:\n\
+ .align 2, 0\n\
+._163:\n\
+ .word gLocalTime\n\
+ .word gSaveBlock2\n\
+._161:\n\
+ ldr r0, ._166 @ gMain\n\
+ ldrh r1, [r0, #0x2e]\n\
+ mov r0, #0x1\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._165 @cond_branch\n\
+ bl Menu_EraseScreen\n\
+ add r0, r7, #0\n\
+ bl DestroyTask\n\
+ bl ScriptContext2_Disable\n\
+._165:\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\
+._167:\n\
+ .align 2, 0\n\
+._166:\n\
+ .word gMain");
+}
+
+#endif \ No newline at end of file
diff --git a/src/engine/rtc.c b/src/engine/rtc.c
index d73f943d2..5462298ed 100644
--- a/src/engine/rtc.c
+++ b/src/engine/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/engine/save.c b/src/engine/save.c
index 250b29a87..0b7a3dd79 100644
--- a/src/engine/save.c
+++ b/src/engine/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/engine/save_failed_screen.c
index 74a1e9612..49cf166d4 100644
--- a/src/engine/save_failed_screen.c
+++ b/src/engine/save_failed_screen.c
@@ -61,16 +61,18 @@ static const u8 sClockFrames[8][3] =
static const u8 gSaveFailedClockPal[] = INCBIN_U8("graphics/misc/clock_small.gbapal");
static const u8 gSaveFailedClockGfx[] = INCBIN_U8("graphics/misc/clock_small.4bpp.lz");
+#define static
+
static void VBlankCB(void);
static void CB2_SaveFailedScreen(void);
static void CB2_WipeSave(void);
-static void CB2_GameplayCannotBeContinued(void);
+/*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 WipeSector(u16 sector);
-static bool8 WipeSectors(u32 sectorBits);
+/*static*/ bool8 WipeSectors(u32 sectorBits);
void DoSaveFailedScreen(u8 saveType)
{
@@ -148,6 +150,151 @@ static void CB2_SaveFailedScreen(void)
}
}
+#if DEBUG
+__attribute__((naked))
+void CB2_WipeSave()
+{
+ asm(
+ " push {r4, r5, lr}\n"
+ " mov r4, #0x0\n"
+ " ldr r0, ._20 @ gSaveFailedClockInfo\n"
+ " mov r2, #0x1\n"
+ " strh r2, [r0]\n"
+ " ldr r0, ._20 + 4 @ gUnknown_Debug_03004BD0\n"
+ " ldr r0, [r0]\n"
+ " ldr r1, ._20 + 8 @ gDamagedSaveSectors\n"
+ " cmp r0, #0\n"
+ " beq ._12 @cond_branch\n"
+ " str r2, [r1]\n"
+ "._12:\n"
+ " ldr r0, [r1]\n"
+ " cmp r0, #0\n"
+ " beq ._16 @cond_branch\n"
+ " add r5, r1, #0\n"
+ "._17:\n"
+ " ldr r0, [r5]\n"
+ " bl WipeSectors\n"
+ " lsl r0, r0, #0x18\n"
+ " cmp r0, #0\n"
+ " bne ._14 @cond_branch\n"
+ " mov r0, #0x1\n"
+ " mov r1, #0xa\n"
+ " mov r2, #0x1c\n"
+ " mov r3, #0x13\n"
+ " bl Menu_DrawStdWindowFrame\n"
+ " ldr r0, ._20 + 12 @ gSystemText_CheckCompleteSaveAttempt\n"
+ " mov r1, #0x2\n"
+ " mov r2, #0xb\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, ._20 + 16 @ gSaveFailedType\n"
+ " ldrb r0, [r0]\n"
+ " bl Save_WriteDataInternal\n"
+ " ldr r0, [r5]\n"
+ " cmp r0, #0\n"
+ " beq ._15 @cond_branch\n"
+ " mov r0, #0x1\n"
+ " mov r1, #0xa\n"
+ " mov r2, #0x1c\n"
+ " mov r3, #0x13\n"
+ " bl Menu_DrawStdWindowFrame\n"
+ " ldr r0, ._20 + 20 @ gSystemText_SaveFailedBackupCheck\n"
+ " mov r1, #0x2\n"
+ " mov r2, #0xb\n"
+ " bl Menu_PrintText\n"
+ "._15:\n"
+ " add r0, r4, #1\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r4, r0, #0x18\n"
+ " ldr r0, [r5]\n"
+ " cmp r0, #0\n"
+ " beq ._16 @cond_branch\n"
+ " cmp r4, #0x2\n"
+ " bls ._17 @cond_branch\n"
+ "._16:\n"
+ " cmp r4, #0x3\n"
+ " bne ._18 @cond_branch\n"
+ " mov r0, #0x1\n"
+ " mov r1, #0xa\n"
+ " mov r2, #0x1c\n"
+ " mov r3, #0x13\n"
+ " bl Menu_DrawStdWindowFrame\n"
+ " ldr r0, ._20 + 24 @ gSystemText_BackupDamagedGameContinue\n"
+ " mov r1, #0x2\n"
+ " mov r2, #0xb\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, ._20 + 28 @ CB2_FadeAndReturnToTitleScreen\n"
+ " bl SetMainCallback2\n"
+ " b ._23\n"
+ "._21:\n"
+ " .align 2, 0\n"
+ "._20:\n"
+ " .word gSaveFailedClockInfo\n"
+ " .word gUnknown_Debug_03004BD0\n"
+ " .word gDamagedSaveSectors\n"
+ " .word gSystemText_CheckCompleteSaveAttempt\n"
+ " .word gSaveFailedType\n"
+ " .word gSystemText_SaveFailedBackupCheck\n"
+ " .word gSystemText_BackupDamagedGameContinue\n"
+ " .word CB2_FadeAndReturnToTitleScreen+1\n"
+ "._18:\n"
+ " mov r0, #0x1\n"
+ " mov r1, #0xa\n"
+ " mov r2, #0x1c\n"
+ " mov r3, #0x13\n"
+ " bl Menu_DrawStdWindowFrame\n"
+ " ldr r0, ._24 @ gGameContinueCallback\n"
+ " ldr r0, [r0]\n"
+ " cmp r0, #0\n"
+ " bne ._22 @cond_branch\n"
+ " ldr r0, ._24 + 4 @ gSystemText_SaveCompletedGameEnd\n"
+ " mov r1, #0x2\n"
+ " mov r2, #0xb\n"
+ " bl Menu_PrintText\n"
+ " b ._23\n"
+ "._25:\n"
+ " .align 2, 0\n"
+ "._24:\n"
+ " .word gGameContinueCallback\n"
+ " .word gSystemText_SaveCompletedGameEnd\n"
+ "._14:\n"
+ " mov r0, #0x1\n"
+ " mov r1, #0xa\n"
+ " mov r2, #0x1c\n"
+ " mov r3, #0x13\n"
+ " bl Menu_DrawStdWindowFrame\n"
+ " ldr r0, ._27 @ gSystemText_BackupDamagedGameContinue\n"
+ " mov r1, #0x2\n"
+ " mov r2, #0xb\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, ._27 + 4 @ CB2_GameplayCannotBeContinued\n"
+ " bl SetMainCallback2\n"
+ " b ._26\n"
+ "._28:\n"
+ " .align 2, 0\n"
+ "._27:\n"
+ " .word gSystemText_BackupDamagedGameContinue\n"
+ " .word CB2_GameplayCannotBeContinued+1\n"
+ "._22:\n"
+ " ldr r0, ._29 @ gSystemText_SaveCompletedPressA\n"
+ " mov r1, #0x2\n"
+ " mov r2, #0xb\n"
+ " bl Menu_PrintText\n"
+ "._23:\n"
+ " ldr r0, ._29 + 4 @ CB2_FadeAndReturnToTitleScreen\n"
+ " bl SetMainCallback2\n"
+ "._26:\n"
+ " pop {r4, r5}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._30:\n"
+ " .align 2, 0\n"
+ "._29:\n"
+ " .word gSystemText_SaveCompletedPressA\n"
+ " .word CB2_FadeAndReturnToTitleScreen+1\n"
+ "\n"
+ );
+}
+#else
static void CB2_WipeSave(void)
{
u8 wipeTries = 0;
@@ -198,8 +345,9 @@ static void CB2_WipeSave(void)
SetMainCallback2(CB2_FadeAndReturnToTitleScreen);
}
+#endif
-static void CB2_GameplayCannotBeContinued(void)
+/*static*/ void CB2_GameplayCannotBeContinued(void)
{
gSaveFailedClockInfo[0] = FALSE;
@@ -264,6 +412,41 @@ static void VBlankCB_UpdateClockGraphics(void)
gSaveFailedClockInfo[1]--;
}
+#if DEBUG
+__attribute__((naked))
+bool8 VerifySectorWipe(u16 sector)
+{
+ asm(
+ " push {lr}\n"
+ " lsl r0, r0, #0x10\n"
+ " lsr r0, r0, #0x10\n"
+ " ldr r2, ._50 @ \n"
+ " mov r3, #0x80\n"
+ " lsl r3, r3, #0x5\n"
+ " mov r1, #0x0\n"
+ " bl ReadFlash\n"
+ " mov r0, #0x0\n"
+ " ldr r1, ._50 + 4 @ \n"
+ "._49:\n"
+ " add r0, r0, #0x1\n"
+ " lsl r0, r0, #0x10\n"
+ " lsr r0, r0, #0x10\n"
+ " cmp r0, r1\n"
+ " bls ._49 @cond_branch\n"
+ " ldr r0, ._50 + 8 @ \n"
+ " ldrb r0, [r0]\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._51:\n"
+ " .align 2, 0\n"
+ "._50:\n"
+ " .word +0x2000000\n"
+ " .word 0x3ff\n"
+ " .word gUnknown_Debug_03004BD0\n"
+ "\n"
+ );
+}
+#else
static bool8 VerifySectorWipe(u16 sector)
{
u32 *ptr = (u32 *)&gSharedMem;
@@ -277,6 +460,7 @@ static bool8 VerifySectorWipe(u16 sector)
return FALSE;
}
+#endif
static bool8 WipeSector(u16 sector)
{
@@ -294,7 +478,7 @@ static bool8 WipeSector(u16 sector)
return failed;
}
-static bool8 WipeSectors(u32 sectorBits)
+/*static*/ bool8 WipeSectors(u32 sectorBits)
{
u16 i;
diff --git a/src/engine/sprite.c b/src/engine/sprite.c
index cf35e12a3..a9d84e01a 100644
--- a/src/engine/sprite.c
+++ b/src/engine/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/engine/task.c b/src/engine/task.c
index 7bd2b5937..3e8a5588c 100644
--- a/src/engine/task.c
+++ b/src/engine/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/trade.c b/src/engine/trade.c
index 4bd39c4ef..36e6fc757 100644
--- a/src/engine/trade.c
+++ b/src/engine/trade.c
@@ -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)
diff --git a/src/engine/trainer_card.c b/src/engine/trainer_card.c
index b49628bfa..998c4697e 100644
--- a/src/engine/trainer_card.c
+++ b/src/engine/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 gUnknown_Debug_083E0448 =
+{
+ .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 = _("てすと"),
+};
+#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], &gUnknown_Debug_083E0448, 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], &gUnknown_Debug_083E0448, 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/battle_tower.c b/src/field/battle_tower.c
index ab2a818a7..41d5ae9d1 100644
--- a/src/field/battle_tower.c
+++ b/src/field/battle_tower.c
@@ -259,7 +259,7 @@ 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);
+void SetEReaderTrainerChecksum(struct BattleTowerEReaderTrainer *ereaderTrainer);
static void SetBattleTowerRecordChecksum(struct BattleTowerRecord *);
static void ClearBattleTowerRecord(struct BattleTowerRecord *);
diff --git a/src/field/berry.c b/src/field/berry.c
index 7d22b50b1..cdfeb57af 100644
--- a/src/field/berry.c
+++ b/src/field/berry.c
@@ -999,6 +999,66 @@ extern u16 gSpecialVar_0x8006;
static u8 CalcBerryYield(struct BerryTree *tree);
static u16 GetStageDurationByBerryType(u8 berry);
+#if DEBUG
+__attribute__((naked))
+void debug_sub_80C2B04()
+{
+ asm(
+ " push {lr}\n"
+ " mov r0, #0x0\n"
+ " bl sub_80B47D8\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " ldr r2, ._1 @ gTasks\n"
+ " lsl r1, r0, #0x2\n"
+ " add r1, r1, r0\n"
+ " lsl r1, r1, #0x3\n"
+ " add r1, r1, r2\n"
+ " ldrh r0, [r1, #0x10]\n"
+ " sub r0, r0, #0x1\n"
+ " strh r0, [r1, #0x10]\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._2:\n"
+ " .align 2, 0\n"
+ "._1:\n"
+ " .word gTasks\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_80C2B30()
+{
+ asm(
+ " push {lr}\n"
+ " mov r0, #0x1\n"
+ " bl sub_80B47D8\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " ldr r2, ._3 @ gTasks\n"
+ " lsl r1, r0, #0x2\n"
+ " add r1, r1, r0\n"
+ " lsl r1, r1, #0x3\n"
+ " add r1, r1, r2\n"
+ " ldrh r0, [r1, #0x10]\n"
+ " sub r0, r0, #0x1\n"
+ " strh r0, [r1, #0x10]\n"
+ " bl CloseMenu\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._4:\n"
+ " .align 2, 0\n"
+ "._3:\n"
+ " .word gTasks\n"
+ "\n"
+ );
+}
+#endif
+
// unused
// this could be static, but making it so causes a compile-time warning.
void ClearEnigmaBerries(void)
@@ -1022,6 +1082,180 @@ void SetEnigmaBerry(u8 *src)
gSaveBlock1.enigmaBerry.berry.description2 = gSaveBlock1.enigmaBerry.description2;
}
+#if DEBUG
+__attribute__((naked))
+void debug_sub_80C2BD0()
+{
+ asm(
+ " push {r4, r5, r6, r7, lr}\n"
+ " ldr r3, ._11 @ gSaveBlock1\n"
+ " ldr r1, ._11 + 4 @ 0x316c\n"
+ " add r4, r3, r1\n"
+ " ldr r6, [r4]\n"
+ " add r1, r1, #0x4\n"
+ " add r2, r3, r1\n"
+ " ldr r7, [r2]\n"
+ " mov r1, #0x0\n"
+ " str r1, [r4]\n"
+ " str r1, [r2]\n"
+ " add r4, r0, #0\n"
+ " mov r2, #0x0\n"
+ " ldr r5, ._11 + 8 @ 0x52b\n"
+ "._10:\n"
+ " add r0, r4, r1\n"
+ " ldrb r0, [r0]\n"
+ " add r2, r2, r0\n"
+ " add r1, r1, #0x1\n"
+ " cmp r1, r5\n"
+ " bls ._10 @cond_branch\n"
+ " ldr r1, ._11 + 4 @ 0x316c\n"
+ " add r0, r3, r1\n"
+ " str r6, [r0]\n"
+ " add r1, r1, #0x4\n"
+ " add r0, r3, r1\n"
+ " str r7, [r0]\n"
+ " add r0, r2, #0\n"
+ " pop {r4, r5, r6, r7}\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._12:\n"
+ " .align 2, 0\n"
+ "._11:\n"
+ " .word gSaveBlock1\n"
+ " .word 0x316c\n"
+ " .word 0x52b\n"
+ "\n"
+ );
+}
+#endif
+
+#if DEBUG
+__attribute__((naked))
+u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry)
+{
+ asm(
+ " push {r4, r5, r6, r7, lr}\n"
+ " mov r7, r9\n"
+ " mov r6, r8\n"
+ " push {r6, r7}\n"
+ " add r3, r0, #0\n"
+ " lsl r1, r1, #0x18\n"
+ " lsr r1, r1, #0x18\n"
+ " mov r9, r1\n"
+ " lsl r2, r2, #0x18\n"
+ " lsr r2, r2, #0x18\n"
+ " mov r8, r2\n"
+ " ldr r4, ._16 @ gSaveBlock1\n"
+ " ldr r1, ._16 + 4 @ 0x3160\n"
+ " add r0, r4, r1\n"
+ " add r2, r0, #0\n"
+ " ldr r1, ._16 + 8 @ gBerries\n"
+ " ldmia r1!, {r5, r6, r7}\n"
+ " stmia r2!, {r5, r6, r7}\n"
+ " ldmia r1!, {r5, r6, r7}\n"
+ " stmia r2!, {r5, r6, r7}\n"
+ " ldr r1, [r1]\n"
+ " str r1, [r2]\n"
+ " add r1, r3, #0\n"
+ " bl StringCopy\n"
+ " ldr r0, ._16 + 12 @ 0x361c\n"
+ " add r6, r4, r0\n"
+ " ldr r1, ._16 + 16 @ gUnknown_Debug_083F7F84\n"
+ " add r0, r6, #0\n"
+ " bl StringCopy\n"
+ " ldr r1, ._16 + 20 @ 0x3649\n"
+ " add r5, r4, r1\n"
+ " ldr r1, ._16 + 24 @ gUnknown_Debug_083F7F90\n"
+ " add r0, r5, #0\n"
+ " bl StringCopy\n"
+ " ldr r2, ._16 + 28 @ 0x316c\n"
+ " add r0, r4, r2\n"
+ " str r6, [r0]\n"
+ " ldr r6, ._16 + 32 @ 0x3170\n"
+ " add r0, r4, r6\n"
+ " str r5, [r0]\n"
+ " mov r2, #0x0\n"
+ " ldr r6, ._16 + 36 @ 0x47f\n"
+ " ldr r7, ._16 + 40 @ 0x317c\n"
+ " add r5, r4, r7\n"
+ " ldr r3, ._16 + 44 @ gSpriteImage_UnusedCherry\n"
+ "._13:\n"
+ " add r0, r2, r5\n"
+ " add r1, r2, r3\n"
+ " ldrb r1, [r1]\n"
+ " strb r1, [r0]\n"
+ " add r2, r2, #0x1\n"
+ " cmp r2, r6\n"
+ " ble ._13 @cond_branch\n"
+ " ldr r0, ._16 @ gSaveBlock1\n"
+ " ldr r3, ._16 + 48 @ gSpritePalette_UnusedCherry\n"
+ " ldr r2, ._16 + 52 @ 0x35fc\n"
+ " add r1, r0, r2\n"
+ " mov r2, #0xf\n"
+ "._14:\n"
+ " ldrh r0, [r3]\n"
+ " strh r0, [r1]\n"
+ " add r3, r3, #0x2\n"
+ " add r1, r1, #0x2\n"
+ " sub r2, r2, #0x1\n"
+ " cmp r2, #0\n"
+ " bge ._14 @cond_branch\n"
+ " mov r2, #0x0\n"
+ " ldr r5, ._16 + 56 @ gSaveBlock1\n"
+ " ldr r3, ._16 + 60 @ gUnknown_Debug_839B6CE\n"
+ "._15:\n"
+ " add r0, r2, r5\n"
+ " add r1, r2, r3\n"
+ " ldrb r1, [r1]\n"
+ " strb r1, [r0]\n"
+ " add r2, r2, #0x1\n"
+ " cmp r2, #0x11\n"
+ " ble ._15 @cond_branch\n"
+ " ldr r5, ._16 + 64 @ 0x3688\n"
+ " add r0, r4, r5\n"
+ " mov r6, r9\n"
+ " strb r6, [r0]\n"
+ " ldr r7, ._16 + 68 @ 0x3689\n"
+ " add r0, r4, r7\n"
+ " mov r1, r8\n"
+ " strb r1, [r0]\n"
+ " ldr r2, ._16 + 4 @ 0x3160\n"
+ " add r0, r4, r2\n"
+ " bl debug_sub_80C2BD0\n"
+ " add r5, r5, #0x4\n"
+ " add r1, r4, r5\n"
+ " str r0, [r1]\n"
+ " pop {r3, r4}\n"
+ " mov r8, r3\n"
+ " mov r9, r4\n"
+ " pop {r4, r5, r6, r7}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._17:\n"
+ " .align 2, 0\n"
+ "._16:\n"
+ " .word gSaveBlock1\n"
+ " .word 0x3160\n"
+ " .word gBerries\n"
+ " .word 0x361c\n"
+ " .word gUnknown_Debug_083F7F84\n"
+ " .word 0x3649\n"
+ " .word gUnknown_Debug_083F7F90\n"
+ " .word 0x316c\n"
+ " .word 0x3170\n"
+ " .word 0x47f\n"
+ " .word 0x317c\n"
+ " .word gSpriteImage_UnusedCherry\n"
+ " .word gSpritePalette_UnusedCherry\n"
+ " .word 0x35fc\n"
+ " .word gSaveBlock1+0x3676\n"
+ " .word gUnknown_Debug_839B6CE\n"
+ " .word 0x3688\n"
+ " .word 0x3689\n"
+ "\n"
+ );
+}
+#else
static u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry)
{
const u8 *description1;
@@ -1051,9 +1285,110 @@ static u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry)
return checksum;
}
+#endif
+
+#if DEBUG
+__attribute__((naked))
+void debug_sub_80C2D24()
+{
+ asm(
+ " push {r4, r5, r6, r7, lr}\n"
+ " mov r7, r8\n"
+ " push {r7}\n"
+ " ldr r6, [sp, #0x18]\n"
+ " ldr r4, [sp, #0x1c]\n"
+ " mov r8, r4\n"
+ " ldr r5, ._18 @ gSaveBlock1\n"
+ " ldr r7, ._18 + 4 @ 0x3175\n"
+ " add r4, r5, r7\n"
+ " strb r0, [r4]\n"
+ " ldr r4, ._18 + 8 @ 0x3176\n"
+ " add r0, r5, r4\n"
+ " strb r1, [r0]\n"
+ " add r7, r7, #0x2\n"
+ " add r0, r5, r7\n"
+ " strb r2, [r0]\n"
+ " ldr r1, ._18 + 12 @ 0x3178\n"
+ " add r0, r5, r1\n"
+ " strb r3, [r0]\n"
+ " add r4, r4, #0x3\n"
+ " add r0, r5, r4\n"
+ " strb r6, [r0]\n"
+ " add r7, r7, #0x3\n"
+ " add r0, r5, r7\n"
+ " mov r1, r8\n"
+ " strb r1, [r0]\n"
+ " sub r4, r4, #0x19\n"
+ " add r0, r5, r4\n"
+ " bl debug_sub_80C2BD0\n"
+ " ldr r7, ._18 + 16 @ 0x368c\n"
+ " add r5, r5, r7\n"
+ " str r0, [r5]\n"
+ " pop {r3}\n"
+ " mov r8, r3\n"
+ " pop {r4, r5, r6, r7}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._19:\n"
+ " .align 2, 0\n"
+ "._18:\n"
+ " .word gSaveBlock1\n"
+ " .word 0x3175\n"
+ " .word 0x3176\n"
+ " .word 0x3178\n"
+ " .word 0x368c\n"
+ "\n"
+ );
+}
+#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.
+#if DEBUG
+__attribute__((naked))
+bool32 IsEnigmaBerryValid()
+{
+ asm(
+ " push {r4, lr}\n"
+ " ldr r4, ._24 @ gSaveBlock1\n"
+ " ldr r1, ._24 + 4 @ 0x3174\n"
+ " add r0, r4, r1\n"
+ " ldrb r0, [r0]\n"
+ " cmp r0, #0\n"
+ " beq ._22 @cond_branch\n"
+ " ldr r2, ._24 + 8 @ 0x316a\n"
+ " add r0, r4, r2\n"
+ " ldrb r0, [r0]\n"
+ " cmp r0, #0\n"
+ " beq ._22 @cond_branch\n"
+ " ldr r1, ._24 + 12 @ 0x3160\n"
+ " add r0, r4, r1\n"
+ " bl debug_sub_80C2BD0\n"
+ " ldr r2, ._24 + 16 @ 0x368c\n"
+ " add r1, r4, r2\n"
+ " ldr r1, [r1]\n"
+ " cmp r0, r1\n"
+ " bne ._22 @cond_branch\n"
+ " mov r0, #0x1\n"
+ " b ._23\n"
+ "._25:\n"
+ " .align 2, 0\n"
+ "._24:\n"
+ " .word gSaveBlock1\n"
+ " .word 0x3174\n"
+ " .word 0x316a\n"
+ " .word 0x3160\n"
+ " .word 0x368c\n"
+ "._22:\n"
+ " mov r0, #0x0\n"
+ "._23:\n"
+ " pop {r4}\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+#else
bool32 IsEnigmaBerryValid(void)
{
if (gSaveBlock1.enigmaBerry.berry.stageDuration == 0)
@@ -1064,6 +1399,7 @@ bool32 IsEnigmaBerryValid(void)
return FALSE;
return TRUE;
}
+#endif
const struct Berry *GetBerryInfo(u8 berry)
{
@@ -1417,6 +1753,177 @@ bool8 PlayerHasBerries(void)
return IsBagPocketNonEmpty(BAG_BERRIES);
}
+#if DEBUG
+void debug_sub_80C33FC(u8 *buffer, s32 value, u8 n)
+{
+ StringAppend(gStringVar4, buffer);
+ ConvertIntToDecimalStringN(gStringVar1, value, STR_CONV_MODE_LEADING_ZEROS, n);
+ StringAppend(gStringVar4, gStringVar1);
+}
+
+extern const u8 gUnknown_Debug_083F7F9D[];
+extern const u8 gUnknown_Debug_083F7FA2[];
+extern const u8 gUnknown_Debug_083F7FA9[];
+extern const u8 gUnknown_Debug_083F7FB0[];
+extern const u8 gUnknown_Debug_083F7FB7[];
+extern const u8 gUnknown_Debug_083F7FBE[];
+extern const u8 gUnknown_Debug_083F7FC5[];
+extern const u8 gUnknown_Debug_083F7FCC[];
+extern const u8 gUnknown_Debug_083F7FD3[];
+extern const u8 gUnknown_Debug_083F7FD3[];
+extern const u8 gUnknown_Debug_083F7FD3[];
+
+#ifdef NONMATCHING
+u8* DebugOpenBerryInfo(void)
+{
+ s32 i;
+ u8 berryTreeId;
+ struct BerryTree *berryTree;
+
+ if (GetFieldObjectScriptPointerPlayerFacing() != &S_BerryTree)
+ return NULL;
+
+ berryTreeId = FieldObjectGetBerryTreeId(gSelectedMapObject);
+ berryTree = GetBerryTreeInfo(berryTreeId);
+
+ for (i = 0; i < 500; i++)
+ gStringVar4[i] |= 0xFF;
+
+ 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->secondsUntilNextStage, 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;
+}
+#else
+__attribute__((naked))
+void DebugOpenBerryInfo()
+{
+ asm(
+ " push {r4, r5, r6, r7, lr}\n"
+ " bl GetFieldObjectScriptPointerPlayerFacing\n"
+ " ldr r1, ._138 @ S_BerryTree\n"
+ " cmp r0, r1\n"
+ " beq ._136 @cond_branch\n"
+ " mov r0, #0x0\n"
+ " b ._137\n"
+ "._139:\n"
+ " .align 2, 0\n"
+ "._138:\n"
+ " .word S_BerryTree\n"
+ "._136:\n"
+ " ldr r0, ._141 @ gSelectedMapObject\n"
+ " ldrb r0, [r0]\n"
+ " bl FieldObjectGetBerryTreeId\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r6, r0, #0x18\n"
+ " add r0, r6, #0\n"
+ " bl GetBerryTreeInfo\n"
+ " add r5, r0, #0\n"
+ " mov r2, #0x0\n"
+ " ldr r7, ._141 + 4 @ 0x1f3\n"
+ " ldr r4, ._141 + 8 @ gStringVar4\n"
+ " mov r3, #0xff\n"
+ "._140:\n"
+ " add r1, r2, r4\n"
+ " ldrb r0, [r1]\n"
+ " orr r0, r0, r3\n"
+ " strb r0, [r1]\n"
+ " add r2, r2, #0x1\n"
+ " cmp r2, r7\n"
+ " ble ._140 @cond_branch\n"
+ " ldr r0, ._141 + 12 @ gUnknown_Debug_083F7F9D\n"
+ " add r1, r6, #0\n"
+ " mov r2, #0x3\n"
+ " bl debug_sub_80C33FC\n"
+ " ldr r0, ._141 + 16 @ gUnknown_Debug_083F7FA2\n"
+ " ldrb r1, [r5]\n"
+ " mov r2, #0x2\n"
+ " bl debug_sub_80C33FC\n"
+ " ldr r0, ._141 + 20 @ gUnknown_Debug_083F7FA9\n"
+ " ldrb r1, [r5, #0x1]\n"
+ " lsl r1, r1, #0x19\n"
+ " lsr r1, r1, #0x19\n"
+ " mov r2, #0x2\n"
+ " bl debug_sub_80C33FC\n"
+ " ldr r0, ._141 + 24 @ gUnknown_Debug_083F7FB0\n"
+ " ldrh r1, [r5, #0x2]\n"
+ " mov r2, #0x5\n"
+ " bl debug_sub_80C33FC\n"
+ " ldr r0, ._141 + 28 @ gUnknown_Debug_083F7FB7\n"
+ " ldrb r1, [r5, #0x4]\n"
+ " mov r2, #0x2\n"
+ " bl debug_sub_80C33FC\n"
+ " ldr r0, ._141 + 32 @ gUnknown_Debug_083F7FBE\n"
+ " ldrb r1, [r5, #0x5]\n"
+ " lsl r1, r1, #0x1c\n"
+ " lsr r1, r1, #0x1c\n"
+ " mov r2, #0x3\n"
+ " bl debug_sub_80C33FC\n"
+ " ldr r0, ._141 + 36 @ gUnknown_Debug_083F7FC5\n"
+ " ldrb r1, [r5, #0x1]\n"
+ " lsr r1, r1, #0x7\n"
+ " mov r2, #0x1\n"
+ " bl debug_sub_80C33FC\n"
+ " ldr r0, ._141 + 40 @ gUnknown_Debug_083F7FCC\n"
+ " ldrb r1, [r5, #0x5]\n"
+ " lsl r1, r1, #0x1b\n"
+ " lsr r1, r1, #0x1f\n"
+ " mov r2, #0x1\n"
+ " bl debug_sub_80C33FC\n"
+ " ldr r4, ._141 + 44 @ gUnknown_Debug_083F7FD3\n"
+ " ldrb r1, [r5, #0x5]\n"
+ " lsl r1, r1, #0x1a\n"
+ " lsr r1, r1, #0x1f\n"
+ " add r0, r4, #0\n"
+ " mov r2, #0x1\n"
+ " bl debug_sub_80C33FC\n"
+ " ldrb r1, [r5, #0x5]\n"
+ " lsl r1, r1, #0x19\n"
+ " lsr r1, r1, #0x1f\n"
+ " add r0, r4, #0\n"
+ " mov r2, #0x1\n"
+ " bl debug_sub_80C33FC\n"
+ " ldrb r1, [r5, #0x5]\n"
+ " lsr r1, r1, #0x7\n"
+ " add r0, r4, #0\n"
+ " mov r2, #0x1\n"
+ " bl debug_sub_80C33FC\n"
+ " ldr r0, ._141 + 8 @ gStringVar4\n"
+ "._137:\n"
+ " pop {r4, r5, r6, r7}\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._142:\n"
+ " .align 2, 0\n"
+ "._141:\n"
+ " .word gSelectedMapObject\n"
+ " .word 0x1f3\n"
+ " .word gStringVar4\n"
+ " .word gUnknown_Debug_083F7F9D\n"
+ " .word gUnknown_Debug_083F7FA2\n"
+ " .word gUnknown_Debug_083F7FA9\n"
+ " .word gUnknown_Debug_083F7FB0\n"
+ " .word gUnknown_Debug_083F7FB7\n"
+ " .word gUnknown_Debug_083F7FBE\n"
+ " .word gUnknown_Debug_083F7FC5\n"
+ " .word gUnknown_Debug_083F7FCC\n"
+ " .word gUnknown_Debug_083F7FD3\n"
+ "\n"
+ );
+}
+#endif
+
+#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)
@@ -1445,3 +1952,17 @@ void ResetBerryTreeSparkleFlags(void)
}
}
}
+
+#if DEBUG
+static const u8 gUnknown_Debug_083F7F84[] = _("そとから きた きのみ");
+static const u8 gUnknown_Debug_083F7F90[] = _("ただいま かいはつちゅう");
+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[] = _("");
+#endif
diff --git a/src/field/berry_tag_screen.c b/src/field/berry_tag_screen.c
index 9e518c06a..ea4a3df05 100644
--- a/src/field/berry_tag_screen.c
+++ b/src/field/berry_tag_screen.c
@@ -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/field/bike.c
index 2d763cb14..a81aa395b 100644
--- a/src/field/bike.c
+++ b/src/field/bike.c
@@ -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/choose_party.c b/src/field/choose_party.c
index 18d26f007..7529c4271 100644
--- a/src/field/choose_party.c
+++ b/src/field/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"
@@ -527,6 +528,107 @@ static void BattleTowerEntryMenuCallback_Exit(u8 taskId)
sub_81227FC(taskId);
}
+#if DEBUG
+__attribute__((naked))
+void debug_sub_81381B4()
+{
+ asm(
+ " push {r4, r5, r6, r7, lr}\n"
+ " mov r7, r9\n"
+ " mov r6, r8\n"
+ " push {r6, r7}\n"
+ " ldr r4, ._189 @ gUnknown_02023A00\n"
+ " add r0, r4, #0\n"
+ " mov r1, #0x0\n"
+ " mov r2, #0x60\n"
+ " bl memset\n"
+ " mov r7, #0x0\n"
+ " mov r8, r4\n"
+ " mov r0, #0x4\n"
+ " add r0, r0, r8\n"
+ " mov r9, r0\n"
+ "._188:\n"
+ " mov r0, #0x64\n"
+ " add r1, r7, #0\n"
+ " mul r1, r1, r0\n"
+ " ldr r0, ._189 + 4 @ gPlayerParty\n"
+ " add r5, r1, r0\n"
+ " add r0, r5, #0\n"
+ " mov r1, #0x41\n"
+ " bl GetMonData\n"
+ " lsl r4, r7, #0x5\n"
+ " mov r1, r8\n"
+ " add r6, r4, r1\n"
+ " strh r0, [r6]\n"
+ " lsl r0, r0, #0x10\n"
+ " cmp r0, #0\n"
+ " beq ._187 @cond_branch\n"
+ " add r0, r5, #0\n"
+ " mov r1, #0x38\n"
+ " bl GetMonData\n"
+ " strb r0, [r6, #0xf]\n"
+ " add r0, r5, #0\n"
+ " mov r1, #0x39\n"
+ " bl GetMonData\n"
+ " strh r0, [r6, #0x10]\n"
+ " add r0, r5, #0\n"
+ " mov r1, #0x3a\n"
+ " bl GetMonData\n"
+ " strh r0, [r6, #0x12]\n"
+ " add r0, r5, #0\n"
+ " mov r1, #0x37\n"
+ " bl GetMonData\n"
+ " mov r1, r8\n"
+ " add r1, r1, #0x14\n"
+ " add r1, r4, r1\n"
+ " str r0, [r1]\n"
+ " add r0, r5, #0\n"
+ " mov r1, #0xc\n"
+ " bl GetMonData\n"
+ " strh r0, [r6, #0x2]\n"
+ " add r0, r5, #0\n"
+ " mov r1, #0x0\n"
+ " bl GetMonData\n"
+ " mov r1, r8\n"
+ " add r1, r1, #0x18\n"
+ " add r1, r4, r1\n"
+ " str r0, [r1]\n"
+ " add r0, r5, #0\n"
+ " bl GetMonGender\n"
+ " strb r0, [r6, #0x1c]\n"
+ " add r4, r4, r9\n"
+ " add r0, r5, #0\n"
+ " mov r1, #0x2\n"
+ " add r2, r4, #0\n"
+ " bl GetMonData\n"
+ " add r0, r4, #0\n"
+ " bl Text_StripExtCtrlCodes\n"
+ " add r0, r5, #0\n"
+ " mov r1, #0x3\n"
+ " bl GetMonData\n"
+ " strb r0, [r6, #0x1d]\n"
+ "._187:\n"
+ " add r0, r7, #1\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r7, r0, #0x18\n"
+ " cmp r7, #0x2\n"
+ " bls ._188 @cond_branch\n"
+ " pop {r3, r4}\n"
+ " mov r8, r3\n"
+ " mov r9, r4\n"
+ " pop {r4, r5, r6, r7}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._190:\n"
+ " .align 2, 0\n"
+ "._189:\n"
+ " .word gUnknown_02023A00\n"
+ " .word gPlayerParty+0x12c\n"
+ "\n"
+ );
+}
+#endif
+
bool8 SetupLinkMultiBattlePartyMenu(void)
{
switch (ewram1B000_alt.setupState)
diff --git a/src/field/daycare.c b/src/field/daycare.c
index 36dd7ec03..da0838d29 100644
--- a/src/field/daycare.c
+++ b/src/field/daycare.c
@@ -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/field/decoration_inventory.c b/src/field/decoration_inventory.c
index dd0e972aa..8f7f5eb92 100644
--- a/src/field/decoration_inventory.c
+++ b/src/field/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/evobjmv.c b/src/field/evobjmv.c
index 9c282e266..6b38df2ad 100644
--- a/src/field/evobjmv.c
+++ b/src/field/evobjmv.c
@@ -1905,6 +1905,9 @@ static u8 gUnknown_030005A4;
static u16 gUnknown_030005A6;
struct MapObject gMapObjects[16];
+#if DEBUG
+u8 gUnknown_Debug_03004BC0[4]; // unknown type
+#endif
void npc_clear_ids_and_state(struct MapObject *mapObj)
{
@@ -1915,6 +1918,40 @@ void npc_clear_ids_and_state(struct MapObject *mapObj)
mapObj->mapobj_unk_1C = 0xFF;
}
+#if DEBUG
+__attribute__((naked))
+void npcs_clear_ids_and_state()
+{
+ asm(
+ " push {r4, r5, lr}\n"
+ " mov r4, #0x0\n"
+ " ldr r5, ._2 @ gMapObjects\n"
+ "._1:\n"
+ " lsl r0, r4, #0x3\n"
+ " add r0, r0, r4\n"
+ " lsl r0, r0, #0x2\n"
+ " add r0, r0, r5\n"
+ " bl npc_clear_ids_and_state\n"
+ " add r0, r4, #1\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r4, r0, #0x18\n"
+ " cmp r4, #0xf\n"
+ " bls ._1 @cond_branch\n"
+ " ldr r1, ._2 + 4 @ gUnknown_Debug_03004BC0\n"
+ " mov r0, #0x0\n"
+ " strb r0, [r1]\n"
+ " pop {r4, r5}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._3:\n"
+ " .align 2, 0\n"
+ "._2:\n"
+ " .word gMapObjects\n"
+ " .word gUnknown_Debug_03004BC0\n"
+ "\n"
+ );
+}
+#else
void npcs_clear_ids_and_state(void)
{
u8 i;
@@ -1922,6 +1959,7 @@ void npcs_clear_ids_and_state(void)
for (i = 0; i < 16; i++)
npc_clear_ids_and_state(&gMapObjects[i]);
}
+#endif
void sub_805AA98(void)
{
@@ -2015,6 +2053,176 @@ u8 GetFieldObjectIdByLocalId(u8 localId)
return 16;
}
+#if DEBUG
+__attribute__((naked))
+u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c)
+{
+ asm(
+ " push {r4, r5, r6, r7, lr}\n"
+ " mov r7, r9\n"
+ " mov r6, r8\n"
+ " push {r6, r7}\n"
+ " add sp, sp, #0xfffffffc\n"
+ " add r5, r0, #0\n"
+ " lsl r1, r1, #0x18\n"
+ " lsr r6, r1, #0x18\n"
+ " lsl r2, r2, #0x18\n"
+ " lsr r7, r2, #0x18\n"
+ " ldrb r0, [r5]\n"
+ " add r1, r6, #0\n"
+ " add r2, r7, #0\n"
+ " mov r3, sp\n"
+ " bl GetAvailableFieldObjectSlot\n"
+ " lsl r0, r0, #0x18\n"
+ " cmp r0, #0\n"
+ " beq ._35 @cond_branch\n"
+ " mov r0, #0x10\n"
+ " b ._36\n"
+ "._35:\n"
+ " mov r0, sp\n"
+ " ldrb r1, [r0]\n"
+ " lsl r0, r1, #0x3\n"
+ " add r0, r0, r1\n"
+ " lsl r0, r0, #0x2\n"
+ " ldr r1, ._40 @ gMapObjects\n"
+ " add r4, r0, r1\n"
+ " add r0, r4, #0\n"
+ " bl npc_clear_ids_and_state\n"
+ " ldrh r3, [r5, #0x4]\n"
+ " add r3, r3, #0x7\n"
+ " lsl r3, r3, #0x10\n"
+ " lsr r3, r3, #0x10\n"
+ " ldrh r2, [r5, #0x6]\n"
+ " add r2, r2, #0x7\n"
+ " lsl r2, r2, #0x10\n"
+ " lsr r2, r2, #0x10\n"
+ " ldrb r0, [r4]\n"
+ " mov r1, #0x1\n"
+ " orr r0, r0, r1\n"
+ " mov r1, #0x4\n"
+ " orr r0, 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"
+ " mov r7, #0xf\n"
+ " add r1, r7, #0\n"
+ " and r1, r1, r0\n"
+ " ldrb r2, [r4, #0xb]\n"
+ " mov r0, #0x10\n"
+ " neg r0, r0\n"
+ " mov r8, r0\n"
+ " and r0, r0, r2\n"
+ " orr r0, r0, r1\n"
+ " strb r0, [r4, #0xb]\n"
+ " ldrb r1, [r5, #0x8]\n"
+ " lsl r1, r1, #0x4\n"
+ " and r0, r0, r7\n"
+ " orr r0, r0, r1\n"
+ " strb r0, [r4, #0xb]\n"
+ " ldrb r1, [r5, #0xa]\n"
+ " lsl r1, r1, #0x1c\n"
+ " mov r0, #0xf\n"
+ " mov r9, r0\n"
+ " lsr r1, r1, #0x1c\n"
+ " ldrb r2, [r4, #0x19]\n"
+ " mov r0, r8\n"
+ " and r0, r0, r2\n"
+ " orr r0, r0, r1\n"
+ " strb r0, [r4, #0x19]\n"
+ " ldrb r1, [r5, #0xa]\n"
+ " lsr r1, r1, #0x4\n"
+ " lsl r1, r1, #0x4\n"
+ " and r0, r0, r7\n"
+ " orr r0, 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, ._40 + 4 @ gUnknown_0836DC09\n"
+ " ldrb r0, [r5, #0x9]\n"
+ " add r0, r0, r1\n"
+ " ldrb r1, [r0]\n"
+ " add r0, r4, #0\n"
+ " add r0, r0, #0x20\n"
+ " strb r1, [r0]\n"
+ " ldrb r1, [r0]\n"
+ " add r0, r4, #0\n"
+ " bl FieldObjectSetDirection\n"
+ " add r0, r4, #0\n"
+ " bl FieldObjectHandleDynamicGraphicsId\n"
+ " ldr r1, ._40 + 8 @ gUnknown_0836DBBC\n"
+ " ldrb r0, [r4, #0x6]\n"
+ " add r0, r0, r1\n"
+ " ldrb r0, [r0]\n"
+ " cmp r0, #0\n"
+ " beq ._39 @cond_branch\n"
+ " ldrb r2, [r4, #0x19]\n"
+ " add r0, r7, #0\n"
+ " and r0, r0, r2\n"
+ " cmp r0, #0\n"
+ " bne ._38 @cond_branch\n"
+ " lsl r0, r2, #0x1c\n"
+ " lsr r0, r0, #0x1c\n"
+ " add r0, r0, #0x1\n"
+ " mov r1, r9\n"
+ " and r0, r0, r1\n"
+ " mov r1, r8\n"
+ " and r1, r1, r2\n"
+ " orr r1, r1, r0\n"
+ " strb r1, [r4, #0x19]\n"
+ "._38:\n"
+ " ldrb r2, [r4, #0x19]\n"
+ " mov r0, #0xf0\n"
+ " and r0, r0, r2\n"
+ " cmp r0, #0\n"
+ " bne ._39 @cond_branch\n"
+ " lsr r1, r2, #0x4\n"
+ " add r1, r1, #0x1\n"
+ " lsl r1, r1, #0x4\n"
+ " add r0, r7, #0\n"
+ " and r0, r0, r2\n"
+ " orr r0, r0, r1\n"
+ " strb r0, [r4, #0x19]\n"
+ "._39:\n"
+ " ldr r1, ._40 + 12 @ gUnknown_Debug_03004BC0\n"
+ " ldrb r0, [r1]\n"
+ " add r0, r0, #0x1\n"
+ " strb r0, [r1]\n"
+ " mov r0, sp\n"
+ " ldrb r0, [r0]\n"
+ "._36:\n"
+ " add sp, sp, #0x4\n"
+ " pop {r3, r4}\n"
+ " mov r8, r3\n"
+ " mov r9, r4\n"
+ " pop {r4, r5, r6, r7}\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._41:\n"
+ " .align 2, 0\n"
+ "._40:\n"
+ " .word gMapObjects\n"
+ " .word gUnknown_0836DC09\n"
+ " .word gUnknown_0836DBBC\n"
+ " .word gUnknown_Debug_03004BC0\n"
+ "\n"
+ );
+}
+#else
#ifdef NONMATCHING
u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c)
{
@@ -2225,6 +2433,7 @@ _0805ADD8: .4byte gUnknown_0836DBBC\n\
.syntax divided\n");
}
#endif
+#endif
u8 sub_805ADDC(u8 localId)
{
@@ -2264,11 +2473,38 @@ u8 GetAvailableFieldObjectSlot(u16 a, u8 b, u8 c, u8 *d)
return 0;
}
+#if DEBUG
+__attribute__((naked))
+void RemoveFieldObject(struct MapObject *mapObject)
+{
+ asm(
+ " push {lr}\n"
+ " ldrb r2, [r0]\n"
+ " mov r1, #0x2\n"
+ " neg r1, r1\n"
+ " and r1, r1, r2\n"
+ " strb r1, [r0]\n"
+ " bl RemoveFieldObjectInternal\n"
+ " ldr r1, ._72 @ gUnknown_Debug_03004BC0\n"
+ " ldrb r0, [r1]\n"
+ " sub r0, r0, #0x1\n"
+ " strb r0, [r1]\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._73:\n"
+ " .align 2, 0\n"
+ "._72:\n"
+ " .word gUnknown_Debug_03004BC0\n"
+ "\n"
+ );
+}
+#else
void RemoveFieldObject(struct MapObject *mapObject)
{
mapObject->active = FALSE;
RemoveFieldObjectInternal(mapObject);
}
+#endif
void RemoveFieldObjectByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)
{
@@ -2301,6 +2537,226 @@ void npc_hide_all_but_player(void)
}
}
+#if DEBUG
+__attribute__((naked))
+u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, u8 c, u8 d, s16 e, s16 f)
+{
+ 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 r7, r1, #0\n"
+ " add r1, r2, #0\n"
+ " add r2, r3, #0\n"
+ " ldr r3, [sp, #0x20]\n"
+ " ldr r4, [sp, #0x24]\n"
+ " lsl r1, r1, #0x18\n"
+ " lsr r1, r1, #0x18\n"
+ " lsl r2, r2, #0x18\n"
+ " lsr r2, r2, #0x18\n"
+ " lsl r3, r3, #0x10\n"
+ " lsr r3, r3, #0x10\n"
+ " mov r9, r3\n"
+ " lsl r4, r4, #0x10\n"
+ " lsr r4, r4, #0x10\n"
+ " mov sl, r4\n"
+ " bl InitFieldObjectStateFromTemplate\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " mov r8, r0\n"
+ " cmp r0, #0x10\n"
+ " bne ._83 @cond_branch\n"
+ " mov r0, #0x10\n"
+ " b ._92\n"
+ "._83:\n"
+ " mov r0, r8\n"
+ " lsl r4, r0, #0x3\n"
+ " add r0, r4, r0\n"
+ " lsl r0, r0, #0x2\n"
+ " ldr r1, ._87 @ gMapObjects\n"
+ " add r5, r0, r1\n"
+ " ldrb r0, [r5, #0x5]\n"
+ " bl GetFieldObjectGraphicsInfo\n"
+ " add r6, r0, #0\n"
+ " ldrb r1, [r6, #0xc]\n"
+ " mov r0, #0xf\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " bne ._85 @cond_branch\n"
+ " ldrh r0, [r6, #0x2]\n"
+ " lsl r1, r1, #0x1c\n"
+ " lsr r1, r1, #0x1c\n"
+ " bl npc_load_two_palettes__no_record\n"
+ " b ._89\n"
+ "._88:\n"
+ " .align 2, 0\n"
+ "._87:\n"
+ " .word gMapObjects\n"
+ "._85:\n"
+ " cmp r0, #0xa\n"
+ " bne ._89 @cond_branch\n"
+ " ldrh r0, [r6, #0x2]\n"
+ " lsl r1, r1, #0x1c\n"
+ " lsr r1, r1, #0x1c\n"
+ " bl npc_load_two_palettes__and_record\n"
+ "._89:\n"
+ " ldrb r0, [r5, #0x6]\n"
+ " cmp r0, #0x4c\n"
+ " bne ._90 @cond_branch\n"
+ " ldrb r0, [r5, #0x1]\n"
+ " mov r1, #0x20\n"
+ " orr r0, r0, r1\n"
+ " strb r0, [r5, #0x1]\n"
+ "._90:\n"
+ " ldr r1, ._93 @ 0xffff\n"
+ " add r0, r1, #0\n"
+ " strh r0, [r7, #0x2]\n"
+ " add r0, r7, #0\n"
+ " mov r1, #0x0\n"
+ " mov r2, #0x0\n"
+ " mov r3, #0x0\n"
+ " bl CreateSprite\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r7, r0, #0x18\n"
+ " cmp r7, #0x40\n"
+ " bne ._91 @cond_branch\n"
+ " ldr r1, ._93 + 4 @ gUnknown_Debug_03004BC0\n"
+ " ldrb r0, [r1]\n"
+ " sub r0, r0, #0x1\n"
+ " strb r0, [r1]\n"
+ " ldr r0, ._93 + 8 @ gMapObjects\n"
+ " mov r2, r8\n"
+ " add r1, r4, r2\n"
+ " lsl r1, r1, #0x2\n"
+ " add r1, r1, r0\n"
+ " ldrb r2, [r1]\n"
+ " mov r0, #0x2\n"
+ " neg r0, r0\n"
+ " and r0, r0, r2\n"
+ " strb r0, [r1]\n"
+ " mov r0, #0x10\n"
+ " b ._92\n"
+ "._94:\n"
+ " .align 2, 0\n"
+ "._93:\n"
+ " .word 0xffff\n"
+ " .word gUnknown_Debug_03004BC0\n"
+ " .word gMapObjects\n"
+ "._91:\n"
+ " lsl r0, r7, #0x4\n"
+ " add r0, r0, r7\n"
+ " lsl r0, r0, #0x2\n"
+ " ldr r1, ._96 @ gSprites\n"
+ " add r4, r0, r1\n"
+ " mov r1, r9\n"
+ " lsl r0, r1, #0x10\n"
+ " asr r0, r0, #0x10\n"
+ " ldrh r2, [r5, #0x10]\n"
+ " add r0, r0, r2\n"
+ " lsl r0, r0, #0x10\n"
+ " asr r0, r0, #0x10\n"
+ " mov r2, sl\n"
+ " lsl r1, r2, #0x10\n"
+ " asr r1, r1, #0x10\n"
+ " ldrh r2, [r5, #0x12]\n"
+ " add r1, r1, r2\n"
+ " lsl r1, r1, #0x10\n"
+ " asr r1, r1, #0x10\n"
+ " add r2, r4, #0\n"
+ " add r2, r2, #0x20\n"
+ " add r3, r4, #0\n"
+ " add r3, r3, #0x22\n"
+ " bl sub_8060388\n"
+ " ldrh r0, [r6, #0x8]\n"
+ " lsl r0, r0, #0x10\n"
+ " asr r0, r0, #0x11\n"
+ " neg r0, r0\n"
+ " add r1, r4, #0\n"
+ " add r1, r1, #0x28\n"
+ " strb r0, [r1]\n"
+ " ldrh r0, [r6, #0xa]\n"
+ " lsl r0, r0, #0x10\n"
+ " asr r0, r0, #0x11\n"
+ " neg r0, r0\n"
+ " add r2, r4, #0\n"
+ " add r2, r2, #0x29\n"
+ " strb r0, [r2]\n"
+ " ldrh r0, [r4, #0x20]\n"
+ " add r0, r0, #0x8\n"
+ " strh r0, [r4, #0x20]\n"
+ " ldrh r1, [r4, #0x22]\n"
+ " add r1, r1, #0x10\n"
+ " mov r0, #0x0\n"
+ " ldsb r0, [r2, r0]\n"
+ " add r0, r0, r1\n"
+ " strh r0, [r4, #0x22]\n"
+ " ldrb r1, [r6, #0xc]\n"
+ " lsl r1, r1, #0x1c\n"
+ " lsr r1, r1, #0x18\n"
+ " ldrb r2, [r4, #0x5]\n"
+ " mov r0, #0xf\n"
+ " and r0, r0, r2\n"
+ " orr r0, r0, r1\n"
+ " strb r0, [r4, #0x5]\n"
+ " add r2, r4, #0\n"
+ " add r2, r2, #0x3e\n"
+ " ldrb r0, [r2]\n"
+ " mov r1, #0x2\n"
+ " orr r0, r0, r1\n"
+ " strb r0, [r2]\n"
+ " mov r0, r8\n"
+ " strh r0, [r4, #0x2e]\n"
+ " strb r7, [r5, #0x4]\n"
+ " ldrb r1, [r6, #0xc]\n"
+ " lsl r1, r1, #0x19\n"
+ " lsr r1, r1, #0x1f\n"
+ " lsl r1, r1, #0x4\n"
+ " ldrb r2, [r5, #0x1]\n"
+ " mov r0, #0x11\n"
+ " neg r0, r0\n"
+ " and r0, r0, r2\n"
+ " orr r0, r0, r1\n"
+ " strb r0, [r5, #0x1]\n"
+ " lsl r0, r0, #0x1b\n"
+ " cmp r0, #0\n"
+ " blt ._95 @cond_branch\n"
+ " ldrb r0, [r5, #0x18]\n"
+ " lsl r0, r0, #0x1c\n"
+ " lsr r0, r0, #0x1c\n"
+ " bl FieldObjectDirectionToImageAnimId\n"
+ " add r1, r0, #0\n"
+ " lsl r1, r1, #0x18\n"
+ " lsr r1, r1, #0x18\n"
+ " add r0, r4, #0\n"
+ " bl StartSpriteAnim\n"
+ "._95:\n"
+ " ldrb r0, [r5, #0xb]\n"
+ " lsr r0, r0, #0x4\n"
+ " add r1, r4, #0\n"
+ " mov r2, #0x1\n"
+ " bl SetObjectSubpriorityByZCoord\n"
+ " add r0, r5, #0\n"
+ " add r1, r4, #0\n"
+ " bl sub_80634D0\n"
+ " mov r0, r8\n"
+ "._92:\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 {r1}\n"
+ " bx r1\n"
+ "._97:\n"
+ " .align 2, 0\n"
+ "._96:\n"
+ " .word gSprites\n"
+ "\n"
+ );
+}
+#else
u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, u8 c, u8 d, s16 e, s16 f)
{
u8 mapObjectId;
@@ -2350,6 +2806,7 @@ u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *
sub_80634D0(mapObject, sprite);
return mapObjectId;
}
+#endif
u8 SpawnFieldObject(struct MapObjectTemplate *mapObjTemplate, u8 b, u8 c, s16 d, s16 e)
{
@@ -2572,6 +3029,66 @@ void RemoveFieldObjectIfOutsideView(struct MapObject *mapObject)
void sub_805B75C(u8, s16, s16);
+#if DEBUG
+__attribute__((naked))
+void sub_805B710(u16 u161, u16 u162)
+{
+ asm(
+ " push {r4, r5, r6, r7, lr}\n"
+ " mov r7, r8\n"
+ " push {r7}\n"
+ " add r4, r0, #0\n"
+ " add r5, r1, #0\n"
+ " lsl r4, r4, #0x10\n"
+ " lsr r4, r4, #0x10\n"
+ " lsl r5, r5, #0x10\n"
+ " lsr r5, r5, #0x10\n"
+ " ldr r6, ._153 @ gUnknown_Debug_03004BC0\n"
+ " mov r0, #0x0\n"
+ " strb r0, [r6]\n"
+ " bl ClearPlayerAvatarInfo\n"
+ " mov r7, #0x0\n"
+ " ldr r0, ._153 + 4 @ gMapObjects\n"
+ " mov r8, r0\n"
+ " lsl r4, r4, #0x10\n"
+ " lsl r5, r5, #0x10\n"
+ "._152:\n"
+ " lsl r0, r7, #0x3\n"
+ " add r0, r0, r7\n"
+ " lsl r0, r0, #0x2\n"
+ " add r0, r0, r8\n"
+ " ldrb r0, [r0]\n"
+ " lsl r0, r0, #0x1f\n"
+ " cmp r0, #0\n"
+ " beq ._151 @cond_branch\n"
+ " add r0, r7, #0\n"
+ " asr r1, r4, #0x10\n"
+ " asr r2, r5, #0x10\n"
+ " bl sub_805B75C\n"
+ " ldrb r0, [r6]\n"
+ " add r0, r0, #0x1\n"
+ " strb r0, [r6]\n"
+ "._151:\n"
+ " add r0, r7, #1\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r7, r0, #0x18\n"
+ " cmp r7, #0xf\n"
+ " bls ._152 @cond_branch\n"
+ " bl sub_805AAB0\n"
+ " pop {r3}\n"
+ " mov r8, r3\n"
+ " pop {r4, r5, r6, r7}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._154:\n"
+ " .align 2, 0\n"
+ "._153:\n"
+ " .word gUnknown_Debug_03004BC0\n"
+ " .word gMapObjects\n"
+ "\n"
+ );
+}
+#else
void sub_805B710(u16 a, u16 b)
{
u8 i;
@@ -2584,6 +3101,7 @@ void sub_805B710(u16 a, u16 b)
}
sub_805AAB0();
}
+#endif
extern void SetPlayerAvatarFieldObjectIdAndObjectId(u8, u8);
extern void sub_805B914(struct MapObject *);
diff --git a/src/field/field_control_avatar.c b/src/field/field_control_avatar.c
index bf96c724f..3ae422512 100644
--- a/src/field/field_control_avatar.c
+++ b/src/field/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;
+#endif
+
+ if (
+#if DEBUG
+ !input->input_field_1_1 &&
+#endif
+ CheckTrainers() == TRUE)
return TRUE;
- if (mapheader_run_first_tag2_script_list_match() == 1)
+
+ 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++;
@@ -810,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_effect.c b/src/field/field_effect.c
index deddf790e..dff5c7e63 100644
--- a/src/field/field_effect.c
+++ b/src/field/field_effect.c
@@ -23,6 +23,7 @@
#include "fieldmap.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))}
diff --git a/src/field/field_effect_helpers.c b/src/field/field_effect_helpers.c
index 2889ee954..c760d9aae 100644
--- a/src/field/field_effect_helpers.c
+++ b/src/field/field_effect_helpers.c
@@ -27,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;
diff --git a/src/field/field_fadetransition.c b/src/field/field_fadetransition.c
index f0e7517e5..492c96fdd 100644
--- a/src/field/field_fadetransition.c
+++ b/src/field/field_fadetransition.c
@@ -510,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_player_avatar.c b/src/field/field_player_avatar.c
index 573395766..41e999719 100644
--- a/src/field/field_player_avatar.c
+++ b/src/field/field_player_avatar.c
@@ -30,9 +30,9 @@ static void npc_clear_strange_bits(struct MapObject *a);
static void MovePlayerAvatarUsingKeypadInput(u8 a, u16 b, u16 c);
static void PlayerAllowForcedMovementIfMovingSameDirection(void);
static bool8 TryDoMetatileBehaviorForcedMovement(void);
-static u8 GetForcedMovementByMetatileBehavior(void);
+/*static*/ u8 GetForcedMovementByMetatileBehavior(void);
static void MovePlayerNotOnBike(u8 a, u16 b);
-static u8 CheckMovementInputNotOnBike(u8 a);
+/*static*/ u8 CheckMovementInputNotOnBike(u8 a);
static u8 CheckForPlayerAvatarCollision(u8 a);
static u8 sub_8058EF0(s16 a, s16 b, u8 c);
static bool8 ShouldJumpLedge(s16 a, s16 b, u8 c);
@@ -258,12 +258,59 @@ static void PlayerAllowForcedMovementIfMovingSameDirection(void)
gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_5;
}
+#if DEBUG
+__attribute__((naked))
+u8 TryDoMetatileBehaviorForcedMovement()
+{
+ asm(
+ " push {r4, lr}\n"
+ " ldr r0, ._27 @ gUnknown_020297ED\n"
+ " ldrb r0, [r0]\n"
+ " cmp r0, #0\n"
+ " beq ._25 @cond_branch\n"
+ " ldr r0, ._27 + 4 @ gMain\n"
+ " ldrh r1, [r0, #0x2c]\n"
+ " mov r0, #0x80\n"
+ " lsl r0, r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._25 @cond_branch\n"
+ " mov r0, #0x0\n"
+ " b ._26\n"
+ "._28:\n"
+ " .align 2, 0\n"
+ "._27:\n"
+ " .word gUnknown_020297ED\n"
+ " .word gMain\n"
+ "._25:\n"
+ " ldr r4, ._29 @ gUnknown_0830FBA0\n"
+ " bl GetForcedMovementByMetatileBehavior\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x16\n"
+ " add r0, r0, r4\n"
+ " ldr r0, [r0]\n"
+ " bl _call_via_r0\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ "._26:\n"
+ " pop {r4}\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "._30:\n"
+ " .align 2, 0\n"
+ "._29:\n"
+ " .word gUnknown_0830FBA0\n"
+ "\n"
+ );
+}
+#else
static bool8 TryDoMetatileBehaviorForcedMovement(void)
{
return gUnknown_0830FBA0[GetForcedMovementByMetatileBehavior()]();
}
+#endif
-static u8 GetForcedMovementByMetatileBehavior(void)
+/*static*/ u8 GetForcedMovementByMetatileBehavior(void)
{
u8 i;
@@ -434,12 +481,57 @@ bool8 ForcedMovement_MuddySlope(void)
}
}
+#if DEBUG
+__attribute__((naked))
+void MovePlayerNotOnBike(u8 u81, u16 u161)
+{
+ asm(
+ " push {r4, r5, r6, lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r2, r0, #0x18\n"
+ " add r5, r2, #0\n"
+ " lsl r1, r1, #0x10\n"
+ " lsr r6, r1, #0x10\n"
+ " ldr r0, ._84 @ gUnknown_020297ED\n"
+ " ldrb r0, [r0]\n"
+ " cmp r0, #0\n"
+ " beq ._82 @cond_branch\n"
+ " add r0, r2, #0\n"
+ " bl debug_sub_805F2B0\n"
+ " lsl r0, r0, #0x18\n"
+ " cmp r0, #0\n"
+ " bne ._83 @cond_branch\n"
+ "._82:\n"
+ " ldr r4, ._84 + 4 @ gUnknown_0830FBEC\n"
+ " add r0, r5, #0\n"
+ " bl CheckMovementInputNotOnBike\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x16\n"
+ " add r0, r0, r4\n"
+ " ldr r2, [r0]\n"
+ " add r0, r5, #0\n"
+ " add r1, r6, #0\n"
+ " bl _call_via_r2\n"
+ "._83:\n"
+ " pop {r4, r5, r6}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._85:\n"
+ " .align 2, 0\n"
+ "._84:\n"
+ " .word gUnknown_020297ED\n"
+ " .word gUnknown_0830FBEC\n"
+ "\n"
+ );
+}
+#else
static void MovePlayerNotOnBike(u8 direction, u16 heldKeys)
{
gUnknown_0830FBEC[CheckMovementInputNotOnBike(direction)](direction, heldKeys);
}
+#endif
-static u8 CheckMovementInputNotOnBike(u8 direction)
+/*static*/ u8 CheckMovementInputNotOnBike(u8 direction)
{
if (direction == DIR_NONE)
{
@@ -1761,3 +1853,98 @@ 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
+__attribute__((naked))
+void debug_sub_805F2B0()
+{
+ asm(
+ " push {lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r2, r0, #0x18\n"
+ " ldr r0, ._422 @ gMain\n"
+ " ldrh r1, [r0, #0x2c]\n"
+ " mov r0, #0x80\n"
+ " lsl r0, r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " bne ._420 @cond_branch\n"
+ " mov r0, #0x0\n"
+ " b ._421\n"
+ "._423:\n"
+ " .align 2, 0\n"
+ "._422:\n"
+ " .word gMain\n"
+ "._420:\n"
+ " add r0, r2, #0\n"
+ " bl debug_sub_805F2DC\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ "._421:\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_805F2DC()
+{
+ asm(
+ " push {r4, lr}\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r4, r0, #0x18\n"
+ " cmp r4, #0\n"
+ " bne ._424 @cond_branch\n"
+ " ldr r2, ._426 @ gMapObjects\n"
+ " ldr r0, ._426 + 4 @ gPlayerAvatar\n"
+ " ldrb r1, [r0, #0x5]\n"
+ " lsl r0, r1, #0x3\n"
+ " add r0, r0, r1\n"
+ " lsl r0, r0, #0x2\n"
+ " add r0, r0, r2\n"
+ " ldrb r0, [r0, #0x18]\n"
+ " lsr r0, r0, #0x4\n"
+ " bl PlayerFaceDirection\n"
+ " b ._430\n"
+ "._427:\n"
+ " .align 2, 0\n"
+ "._426:\n"
+ " .word gMapObjects\n"
+ " .word gPlayerAvatar\n"
+ "._424:\n"
+ " ldr r2, ._431 @ gMapObjects\n"
+ " ldr r0, ._431 + 4 @ gPlayerAvatar\n"
+ " ldrb r1, [r0, #0x5]\n"
+ " lsl r0, r1, #0x3\n"
+ " add r0, r0, r1\n"
+ " lsl r0, r0, #0x2\n"
+ " add r0, r0, r2\n"
+ " ldrb r0, [r0, #0x1]\n"
+ " lsr r0, r0, #0x7\n"
+ " cmp r0, #0\n"
+ " beq ._429 @cond_branch\n"
+ " add r0, r4, #0\n"
+ " bl CanCameraMoveInDirection\n"
+ " cmp r0, #0\n"
+ " bne ._429 @cond_branch\n"
+ " add r0, r4, #0\n"
+ " bl PlayerOnBikeCollide\n"
+ " b ._430\n"
+ "._432:\n"
+ " .align 2, 0\n"
+ "._431:\n"
+ " .word gMapObjects\n"
+ " .word gPlayerAvatar\n"
+ "._429:\n"
+ " add r0, r4, #0\n"
+ " bl PlayerGoSpeed4\n"
+ "._430:\n"
+ " mov r0, #0x1\n"
+ " pop {r4}\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+#endif
diff --git a/src/field/field_poison.c b/src/field/field_poison.c
index 49678f269..8365351f9 100644
--- a/src/field/field_poison.c
+++ b/src/field/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_weather.c b/src/field/field_weather.c
index ceb23b629..838df6508 100644
--- a/src/field/field_weather.c
+++ b/src/field/field_weather.c
@@ -43,7 +43,10 @@ struct WeatherCallbacks
EWRAM_DATA struct Weather gWeather = {0};
EWRAM_DATA u8 gFieldEffectPaletteGammaTypes[32] = {0};
-EWRAM_DATA u16 gUnknown_0202FF58 = {0};
+EWRAM_DATA u16 gUnknown_0202FF58 = 0;
+#if DEBUG
+EWRAM_DATA u16 gUnknown_Debug_20301FE = 0;
+#endif
static const u8 *sPaletteGammaTypes;
@@ -210,6 +213,45 @@ static const u8 sBasePaletteGammaTypes[32] =
GAMMA_NORMAL,
};
+#if DEBUG
+
+const u8 gDebugText_Weather_0[] = _("なし   ");
+const u8 gDebugText_Weather_1[] = _("はれ   ");
+const u8 gDebugText_Weather_2[] = _("はれ2  ");
+const u8 gDebugText_Weather_3[] = _("あめ   ");
+const u8 gDebugText_Weather_4[] = _("ゆき   ");
+const u8 gDebugText_Weather_5[] = _("かみなり ");
+const u8 gDebugText_Weather_6[] = _("きり   ");
+const u8 gDebugText_Weather_7[] = _("かざんばい");
+const u8 gDebugText_Weather_8[] = _("すなあらし");
+const u8 gDebugText_Weather_9[] = _("きり2  ");
+const u8 gDebugText_Weather_10[] = _("かいてい ");
+const u8 gDebugText_Weather_11[] = _("くもり  ");
+const u8 gDebugText_Weather_12[] = _("はれ3  ");
+const u8 gDebugText_Weather_13[] = _("おおあめ");
+const u8 gDebugText_Weather_14[] = _("かいてい2");
+
+const u8 *const gDebugText_Weather[] =
+{
+ gDebugText_Weather_0,
+ gDebugText_Weather_1,
+ gDebugText_Weather_2,
+ gDebugText_Weather_3,
+ gDebugText_Weather_4,
+ gDebugText_Weather_5,
+ gDebugText_Weather_6,
+ gDebugText_Weather_7,
+ gDebugText_Weather_8,
+ gDebugText_Weather_9,
+ gDebugText_Weather_10,
+ gDebugText_Weather_11,
+ gDebugText_Weather_12,
+ gDebugText_Weather_13,
+ gDebugText_Weather_14,
+};
+
+#endif
+
const u16 gUnknown_083970E8[] = INCBIN_U16("graphics/weather/0.gbapal");
void StartWeather(void)
@@ -1213,3 +1255,145 @@ void ResetPreservedPalettesInWeather(void)
{
sPaletteGammaTypes = sBasePaletteGammaTypes;
}
+
+#if DEBUG
+
+__attribute__((naked))
+u8 debug_sub_8085564(void)
+{
+ asm("\
+ push {lr}\n\
+ mov r2, #0x0\n\
+ ldr r0, ._375 @ gMain\n\
+ ldrh r1, [r0, #0x2e]\n\
+ mov r0, #0x80\n\
+ lsl r0, r0, #0x1\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._370 @cond_branch\n\
+ ldr r1, ._375 + 4 @ gUnknown_Debug_20301FE\n\
+ ldrb r0, [r1]\n\
+ add r0, r0, #0x1\n\
+ strb r0, [r1]\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ cmp r0, #0xf\n\
+ bne ._371 @cond_branch\n\
+ strb r2, [r1]\n\
+._371:\n\
+ mov r2, #0x1\n\
+._370:\n\
+ ldr r0, ._375 @ gMain\n\
+ ldrh r1, [r0, #0x2e]\n\
+ mov r0, #0x80\n\
+ lsl r0, r0, #0x2\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._372 @cond_branch\n\
+ ldr r1, ._375 + 4 @ gUnknown_Debug_20301FE\n\
+ ldrb r0, [r1]\n\
+ cmp r0, #0\n\
+ beq ._373 @cond_branch\n\
+ sub r0, r0, #0x1\n\
+ b ._374\n\
+._376:\n\
+ .align 2, 0\n\
+._375:\n\
+ .word gMain\n\
+ .word gUnknown_Debug_20301FE\n\
+._373:\n\
+ mov r0, #0xe\n\
+._374:\n\
+ strb r0, [r1]\n\
+ mov r2, #0x1\n\
+._372:\n\
+ cmp r2, #0\n\
+ beq ._377 @cond_branch\n\
+ mov r0, #0x16\n\
+ mov r1, #0x1\n\
+ mov r2, #0x1c\n\
+ mov r3, #0x2\n\
+ bl Menu_BlankWindowRect\n\
+ ldr r1, ._380 @ gDebugText_Weather\n\
+ ldr r0, ._380 + 4 @ gUnknown_Debug_20301FE\n\
+ ldrb r0, [r0]\n\
+ lsl r0, r0, #0x2\n\
+ add r0, r0, r1\n\
+ ldr r0, [r0]\n\
+ mov r1, #0x17\n\
+ mov r2, #0x1\n\
+ bl Menu_PrintText\n\
+._377:\n\
+ ldr r0, ._380 + 8 @ gMain\n\
+ ldrh r1, [r0, #0x2e]\n\
+ mov r0, #0x1\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ bne ._378 @cond_branch\n\
+ mov r0, #0x0\n\
+ b ._379\n\
+._381:\n\
+ .align 2, 0\n\
+._380:\n\
+ .word gDebugText_Weather\n\
+ .word gUnknown_Debug_20301FE\n\
+ .word gMain\n\
+._378:\n\
+ ldr r0, ._382 @ gUnknown_Debug_20301FE\n\
+ ldrb r0, [r0]\n\
+ bl ChangeWeather\n\
+ bl CloseMenu\n\
+ mov r0, #0x1\n\
+._379:\n\
+ pop {r1}\n\
+ bx r1\n\
+._383:\n\
+ .align 2, 0\n\
+._382:\n\
+ .word gUnknown_Debug_20301FE");
+}
+
+__attribute__((naked))
+u8 debug_sub_808560C(void)
+{
+ asm("\
+ push {r4, lr}\n\
+ ldr r4, ._384 @ gUnknown_Debug_20301FE\n\
+ ldr r0, ._384 + 4 @ gWeather\n\
+ mov r1, #0xda\n\
+ lsl r1, r1, #0x3\n\
+ add r0, r0, r1\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r4]\n\
+ bl Menu_EraseScreen\n\
+ mov r0, #0x16\n\
+ mov r1, #0x1\n\
+ mov r2, #0x1c\n\
+ mov r3, #0x2\n\
+ bl Menu_BlankWindowRect\n\
+ ldr r1, ._384 + 8 @ gDebugText_Weather\n\
+ ldrb r0, [r4]\n\
+ lsl r0, r0, #0x2\n\
+ add r0, r0, r1\n\
+ ldr r0, [r0]\n\
+ mov r1, #0x17\n\
+ mov r2, #0x1\n\
+ bl Menu_PrintText\n\
+ ldr r1, ._384 + 12 @ gMenuCallback\n\
+ ldr r0, ._384 + 16 @ debug_sub_8085564\n\
+ str r0, [r1]\n\
+ mov r0, #0x0\n\
+ pop {r4}\n\
+ pop {r1}\n\
+ bx r1\n\
+._385:\n\
+ .align 2, 0\n\
+._384:\n\
+ .word gUnknown_Debug_20301FE\n\
+ .word gWeather\n\
+ .word gDebugText_Weather\n\
+ .word gMenuCallback\n\
+ .word debug_sub_8085564+1");
+}
+
+#endif
diff --git a/src/field/fldeff_cut.c b/src/field/fldeff_cut.c
index 32ed3c6a4..2043c5688 100644
--- a/src/field/fldeff_cut.c
+++ b/src/field/fldeff_cut.c
@@ -72,6 +72,115 @@ static const struct SpriteTemplate gSpriteTemplate_CutGrass =
.callback = sub_80A2A48,
};
+#if DEBUG
+__attribute__((naked))
+void debug_sub_80AFEE4()
+{
+ asm(
+ " push {r4, r5, r6, r7, lr}\n"
+ " mov r7, r8\n"
+ " push {r7}\n"
+ " mov r0, #0x52\n"
+ " bl npc_before_player_of_type\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " cmp r0, #0x1\n"
+ " bne ._1 @cond_branch\n"
+ " ldr r1, ._3 @ gLastFieldPokeMenuOpened\n"
+ " mov r0, #0x0\n"
+ " strb r0, [r1]\n"
+ " bl sub_80A2634\n"
+ " b ._8\n"
+ "._4:\n"
+ " .align 2, 0\n"
+ "._3:\n"
+ " .word gLastFieldPokeMenuOpened\n"
+ "._1:\n"
+ " ldr r4, ._9 @ gUnknown_0203923C\n"
+ " add r1, r4, #2\n"
+ " add r0, r4, #0\n"
+ " bl PlayerGetDestCoords\n"
+ " mov r7, #0x0\n"
+ " mov r8, r4\n"
+ "._12:\n"
+ " ldr r1, ._9 + 4 @ 0xffff\n"
+ " add r0, r7, r1\n"
+ " mov r2, r8\n"
+ " ldrh r2, [r2, #0x2]\n"
+ " add r0, r0, r2\n"
+ " mov r6, #0x0\n"
+ " lsl r0, r0, #0x10\n"
+ " asr r5, r0, #0x10\n"
+ "._11:\n"
+ " ldr r1, ._9 + 4 @ 0xffff\n"
+ " add r0, r6, r1\n"
+ " mov r2, r8\n"
+ " ldrh r2, [r2]\n"
+ " add r0, r0, r2\n"
+ " lsl r0, r0, #0x10\n"
+ " asr r4, r0, #0x10\n"
+ " add r0, r4, #0\n"
+ " add r1, r5, #0\n"
+ " bl MapGridGetZCoordAt\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " mov r2, r8\n"
+ " mov r1, #0x4\n"
+ " ldsb r1, [r2, r1]\n"
+ " cmp r0, r1\n"
+ " bne ._7 @cond_branch\n"
+ " add r0, r4, #0\n"
+ " add r1, r5, #0\n"
+ " bl MapGridGetMetatileBehaviorAt\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r4, r0, #0x18\n"
+ " add r0, r4, #0\n"
+ " bl MetatileBehavior_IsPokeGrass\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " cmp r0, #0x1\n"
+ " beq ._6 @cond_branch\n"
+ " add r0, r4, #0\n"
+ " bl MetatileBehavior_IsAshGrass\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " cmp r0, #0x1\n"
+ " bne ._7 @cond_branch\n"
+ "._6:\n"
+ " ldr r1, ._9 + 8 @ gLastFieldPokeMenuOpened\n"
+ " mov r0, #0x0\n"
+ " strb r0, [r1]\n"
+ " bl sub_80A25E8\n"
+ " b ._8\n"
+ "._10:\n"
+ " .align 2, 0\n"
+ "._9:\n"
+ " .word gUnknown_0203923C\n"
+ " .word 0xffff\n"
+ " .word gLastFieldPokeMenuOpened\n"
+ "._7:\n"
+ " add r0, r6, #1\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r6, r0, #0x18\n"
+ " cmp r6, #0x2\n"
+ " bls ._11 @cond_branch\n"
+ " add r0, r7, #1\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r7, r0, #0x18\n"
+ " cmp r7, #0x2\n"
+ " bls ._12 @cond_branch\n"
+ " bl ScriptContext2_Disable\n"
+ "._8:\n"
+ " pop {r3}\n"
+ " mov r8, r3\n"
+ " pop {r4, r5, r6, r7}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "\n"
+ );
+}
+#endif
+
bool8 SetUpFieldMove_Cut(void)
{
s16 x, y;
diff --git a/src/field/fldeff_flash.c b/src/field/fldeff_flash.c
index 22f170184..8c0f09bd9 100644
--- a/src/field/fldeff_flash.c
+++ b/src/field/fldeff_flash.c
@@ -71,6 +71,36 @@ 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
+__attribute__((naked))
+void debug_sub_8122080(void)
+{
+ asm("\
+ push {lr}\n\
+ ldr r0, ._4 @ gMapHeader\n\
+ ldrb r0, [r0, #0x15]\n\
+ cmp r0, #0x1\n\
+ bne ._2 @cond_branch\n\
+ ldr r0, ._4 + 4 @ 0x828\n\
+ bl FlagGet\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ bne ._2 @cond_branch\n\
+ bl sub_810CBFC\n\
+ b ._3\n\
+._5:\n\
+ .align 2, 0\n\
+._4:\n\
+ .word gMapHeader\n\
+ .word 0x828\n\
+._2:\n\
+ bl ScriptContext2_Disable\n\
+._3:\n\
+ pop {r0}\n\
+ bx r0");
+}
+#endif
+
bool8 SetUpFieldMove_Flash(void)
{
if (gMapHeader.cave == TRUE && !FlagGet(FLAG_SYS_USE_FLASH))
diff --git a/src/field/fldeff_poison.c b/src/field/fldeff_poison.c
index b0052d59d..52afc2516 100644
--- a/src/field/fldeff_poison.c
+++ b/src/field/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_secretpower.c b/src/field/fldeff_secretpower.c
index bf8e98403..0e91bb55c 100644
--- a/src/field/fldeff_secretpower.c
+++ b/src/field/fldeff_secretpower.c
@@ -243,6 +243,102 @@ void sub_80C6280(void)
}
}
+#if DEBUG
+
+__attribute__((naked))
+void debug_sub_80D93F4()
+{
+ asm("\
+ push {r4, lr}\n\
+ bl sub_80BB63C\n\
+ ldr r0, ._98 @ gSpecialVar_Result\n\
+ ldrh r0, [r0]\n\
+ cmp r0, #0x1\n\
+ beq ._95 @cond_branch\n\
+ bl player_get_direction_lower_nybble\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ cmp r0, #0x2\n\
+ beq ._96 @cond_branch\n\
+._95:\n\
+ bl ScriptContext2_Disable\n\
+ b ._109\n\
+._99:\n\
+ .align 2, 0\n\
+._98:\n\
+ .word gSpecialVar_Result\n\
+._96:\n\
+ ldr r4, ._102 @ gUnknown_0203923C\n\
+ add r1, r4, #2\n\
+ add r0, r4, #0\n\
+ bl GetXYCoordsOneStepInFrontOfPlayer\n\
+ mov r1, #0x0\n\
+ ldsh r0, [r4, r1]\n\
+ mov r2, #0x2\n\
+ ldsh r1, [r4, r2]\n\
+ bl MapGridGetMetatileBehaviorAt\n\
+ lsl r0, r0, #0x18\n\
+ lsr r4, r0, #0x18\n\
+ add r0, r4, #0\n\
+ bl MetatileBehavior_IsSecretBaseCave\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ cmp r0, #0x1\n\
+ bne ._100 @cond_branch\n\
+ bl sub_80C6264\n\
+ ldr r1, ._102 + 4 @ gLastFieldPokeMenuOpened\n\
+ mov r0, #0x0\n\
+ strb r0, [r1]\n\
+ bl sub_80C639C\n\
+ b ._109\n\
+._103:\n\
+ .align 2, 0\n\
+._102:\n\
+ .word gUnknown_0203923C\n\
+ .word gLastFieldPokeMenuOpened\n\
+._100:\n\
+ add r0, r4, #0\n\
+ bl MetatileBehavior_IsSecretBaseTree\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ cmp r0, #0x1\n\
+ bne ._104 @cond_branch\n\
+ bl sub_80C6264\n\
+ ldr r1, ._106 @ gLastFieldPokeMenuOpened\n\
+ mov r0, #0x0\n\
+ strb r0, [r1]\n\
+ bl sub_80C64A8\n\
+ b ._109\n\
+._107:\n\
+ .align 2, 0\n\
+._106:\n\
+ .word gLastFieldPokeMenuOpened\n\
+._104:\n\
+ add r0, r4, #0\n\
+ bl MetatileBehavior_IsSecretBaseShrub\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ cmp r0, #0x1\n\
+ bne ._108 @cond_branch\n\
+ bl sub_80C6264\n\
+ ldr r1, ._110 @ gLastFieldPokeMenuOpened\n\
+ mov r0, #0x0\n\
+ strb r0, [r1]\n\
+ bl sub_80C660C\n\
+ b ._109\n\
+._111:\n\
+ .align 2, 0\n\
+._110:\n\
+ .word gLastFieldPokeMenuOpened\n\
+._108:\n\
+ bl ScriptContext2_Disable\n\
+._109:\n\
+ pop {r4}\n\
+ pop {r0}\n\
+ bx r0");
+}
+#endif
+
bool8 SetUpFieldMove_SecretPower(void)
{
u8 behavior;
diff --git a/src/field/fldeff_strength.c b/src/field/fldeff_strength.c
index 565ac1651..9f9cd4013 100644
--- a/src/field/fldeff_strength.c
+++ b/src/field/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/item.c b/src/field/item.c
index 6ff7a7cbe..78f5ce12d 100644
--- a/src/field/item.c
+++ b/src/field/item.c
@@ -2,12 +2,14 @@
#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"
extern u8 gUnknown_02038560;
+extern struct BagPocket gBagPockets[NUM_BAG_POCKETS];
// These constants are used in gItems
enum
@@ -151,7 +153,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 +218,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)
{
diff --git a/src/field/item_menu.c b/src/field/item_menu.c
index d0c3f598b..7aaf650b2 100644
--- a/src/field/item_menu.c
+++ b/src/field/item_menu.c
@@ -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;
@@ -286,6 +289,24 @@ static void sub_80A6618(u8);
const struct YesNoFuncTable gUnknown_083C16FC = {sub_80A65AC, sub_80A6618};
+#if DEBUG
+const struct {u16 item; u8 unk;} gUnknown_Debug_083EBC68[12+48] =
+{
+ {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 },
+};
+#endif
+
void sub_80A34E8(void);
static bool8 LoadBagGraphicsMultistep(void);
static void sub_80A362C(void);
@@ -372,6 +393,390 @@ static void sub_80A3134(void)
DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(VRAM + 0x6000), 0x800);
}
+#if DEBUG
+__attribute__((naked))
+static bool8 SetupBagMultistep(void)
+{
+ asm("\
+ push {r4, r5, lr}\n\
+ add sp, sp, #0xfffffffc\n\
+ ldr r0, ._5 @ gMain\n\
+ ldr r1, ._5 + 4 @ 0x43c\n\
+ add r0, r0, r1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0x10\n\
+ bls ._3 @cond_branch\n\
+ b ._66\n\
+._3:\n\
+ lsl r0, r0, #0x2\n\
+ ldr r1, ._5 + 8 @ \n\
+ add r0, r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+._6:\n\
+ .align 2, 0\n\
+._5:\n\
+ .word gMain\n\
+ .word 0x43c\n\
+ .word ._7\n\
+._7:\n\
+ .word ._8\n\
+ .word ._9\n\
+ .word ._10\n\
+ .word ._11\n\
+ .word ._12\n\
+ .word ._13\n\
+ .word ._14\n\
+ .word ._15\n\
+ .word ._16\n\
+ .word ._17\n\
+ .word ._18\n\
+ .word ._19\n\
+ .word ._20\n\
+ .word ._21\n\
+ .word ._22\n\
+ .word ._23\n\
+ .word ._24\n\
+._8:\n\
+ bl ClearVideoCallbacks\n\
+ bl sub_80A34E8\n\
+ b ._61\n\
+._9:\n\
+ bl ScanlineEffect_Stop\n\
+ ldr r1, ._27 @ gMain\n\
+ ldr r0, ._27 + 4 @ 0x43c\n\
+ add r1, r1, r0\n\
+ b ._62\n\
+._28:\n\
+ .align 2, 0\n\
+._27:\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._10:\n\
+ bl gpu_pal_allocator_reset__manage_upper_four\n\
+ b ._61\n\
+._11:\n\
+ bl ClearBGTilemapBuffers\n\
+ ldr r0, ._31 @ \n\
+ ldr r1, ._31 + 4 @ \n\
+ add r0, r0, r1\n\
+ mov r1, #0x0\n\
+ strb r1, [r0]\n\
+ b ._61\n\
+._32:\n\
+ .align 2, 0\n\
+._31:\n\
+ .word +0x2000000\n\
+ .word 0x1ffff\n\
+._12:\n\
+ bl ResetPaletteFade\n\
+ ldr r2, ._34 @ gPaletteFade\n\
+ ldrb r0, [r2, #0x8]\n\
+ mov r1, #0x80\n\
+ orr r0, r0, r1\n\
+ strb r0, [r2, #0x8]\n\
+ ldr r1, ._34 + 4 @ gMain\n\
+ ldr r0, ._34 + 8 @ 0x43c\n\
+ add r1, r1, r0\n\
+ b ._62\n\
+._35:\n\
+ .align 2, 0\n\
+._34:\n\
+ .word gPaletteFade\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._13:\n\
+ bl ResetSpriteData\n\
+ b ._61\n\
+._14:\n\
+ bl LoadBagGraphicsMultistep\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ bne ._37 @cond_branch\n\
+ b ._66\n\
+._37:\n\
+ ldr r1, ._40 @ gMain\n\
+ ldr r0, ._40 + 4 @ 0x43c\n\
+ add r1, r1, r0\n\
+ b ._62\n\
+._41:\n\
+ .align 2, 0\n\
+._40:\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._15:\n\
+ ldr r0, ._43 @ gWindowTemplate_81E6DFC\n\
+ bl Text_LoadWindowTemplate\n\
+ b ._61\n\
+._44:\n\
+ .align 2, 0\n\
+._43:\n\
+ .word gWindowTemplate_81E6DFC\n\
+._16:\n\
+ ldr r0, ._46 @ gWindowTemplate_81E6DFC\n\
+ bl MultistepInitMenuWindowBegin\n\
+ ldr r1, ._46 + 4 @ gMain\n\
+ ldr r0, ._46 + 8 @ 0x43c\n\
+ add r1, r1, r0\n\
+ b ._62\n\
+._47:\n\
+ .align 2, 0\n\
+._46:\n\
+ .word gWindowTemplate_81E6DFC\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._17:\n\
+ bl MultistepInitMenuWindowContinue\n\
+ cmp r0, #0\n\
+ bne ._48 @cond_branch\n\
+ b ._66\n\
+._48:\n\
+ b ._61\n\
+._18:\n\
+ bl ClearVerticalScrollIndicatorPalettes\n\
+ bl LoadScrollIndicatorPalette\n\
+ mov r0, #0x0\n\
+ mov r1, #0xac\n\
+ mov r2, #0xc\n\
+ bl CreateVerticalScrollIndicators\n\
+ mov r0, #0x1\n\
+ mov r1, #0xac\n\
+ mov r2, #0x94\n\
+ bl CreateVerticalScrollIndicators\n\
+ mov r0, #0x2\n\
+ mov r1, #0x1c\n\
+ mov r2, #0x58\n\
+ bl CreateVerticalScrollIndicators\n\
+ mov r0, #0x3\n\
+ mov r1, #0x64\n\
+ mov r2, #0x58\n\
+ bl CreateVerticalScrollIndicators\n\
+ mov r0, #0x0\n\
+ mov r1, #0x2\n\
+ bl SetVerticalScrollIndicatorPriority\n\
+ mov r0, #0x1\n\
+ mov r1, #0x2\n\
+ bl SetVerticalScrollIndicatorPriority\n\
+ mov r0, #0x2\n\
+ mov r1, #0x2\n\
+ bl SetVerticalScrollIndicatorPriority\n\
+ mov r0, #0x3\n\
+ mov r1, #0x2\n\
+ bl SetVerticalScrollIndicatorPriority\n\
+ ldr r0, ._53 @ sReturnLocation\n\
+ ldrb r0, [r0]\n\
+ sub r0, r0, #0x4\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ cmp r0, #0x1\n\
+ bhi ._51 @cond_branch\n\
+ mov r0, #0x2\n\
+ mov r1, #0x1\n\
+ bl SetVerticalScrollIndicators\n\
+ mov r0, #0x3\n\
+ mov r1, #0x1\n\
+ bl SetVerticalScrollIndicators\n\
+._51:\n\
+ ldr r1, ._53 + 4 @ gMain\n\
+ ldr r0, ._53 + 8 @ 0x43c\n\
+ add r1, r1, r0\n\
+ b ._62\n\
+._54:\n\
+ .align 2, 0\n\
+._53:\n\
+ .word sReturnLocation\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._19:\n\
+ ldr r1, ._56 @ gUnknown_0203855A\n\
+ mov r0, #0x10\n\
+ strb r0, [r1]\n\
+ ldr r4, ._56 + 4 @ gBGTilemapBuffers\n\
+ ldr r5, ._56 + 8 @ sCurrentBagPocket\n\
+ ldrb r1, [r5]\n\
+ add r1, r1, #0x1\n\
+ lsl r1, r1, #0x18\n\
+ lsr r1, r1, #0x18\n\
+ add r0, r4, #0\n\
+ bl sub_80A39B8\n\
+ ldrb r1, [r5]\n\
+ add r0, r4, #0\n\
+ bl DrawPocketIndicatorDots\n\
+ bl UpdateAllBagPockets\n\
+ ldr r4, ._56 + 12 @ gBagPockets\n\
+ ldr r0, [r4, #0x10]\n\
+ ldr r1, [r4, #0x14]\n\
+ bl SortItemSlots\n\
+ ldr r0, [r4, #0x18]\n\
+ ldr r1, [r4, #0x1c]\n\
+ bl SortItemSlots\n\
+ bl sub_80A3D40\n\
+ ldr r1, ._56 + 16 @ gCurrentBagPocketItemSlots\n\
+ mov r0, #0x0\n\
+ ldsb r0, [r5, r0]\n\
+ lsl r0, r0, #0x3\n\
+ add r0, r0, r4\n\
+ ldr r0, [r0]\n\
+ str r0, [r1]\n\
+ bl sub_80A362C\n\
+ b ._61\n\
+._57:\n\
+ .align 2, 0\n\
+._56:\n\
+ .word gUnknown_0203855A\n\
+ .word gBGTilemapBuffers+0x1000\n\
+ .word sCurrentBagPocket\n\
+ .word gBagPockets\n\
+ .word gCurrentBagPocketItemSlots\n\
+._20:\n\
+ ldr r0, ._59 @ 0xffff\n\
+ mov r1, #0x0\n\
+ mov r2, #0x7\n\
+ bl sub_80A48E8\n\
+ ldr r1, ._59 + 4 @ gBagPocketScrollStates\n\
+ ldr r4, ._59 + 8 @ sCurrentBagPocket\n\
+ mov r0, #0x0\n\
+ ldsb r0, [r4, r0]\n\
+ lsl r0, r0, #0x2\n\
+ add r0, r0, r1\n\
+ ldrb r1, [r0, #0x1]\n\
+ ldrb r0, [r0]\n\
+ add r1, r1, r0\n\
+ ldr r0, ._59 + 12 @ gCurrentBagPocketItemSlots\n\
+ ldr r0, [r0]\n\
+ lsl r1, r1, #0x2\n\
+ add r1, r1, r0\n\
+ mov r2, #0x0\n\
+ ldsh r0, [r1, r2]\n\
+ bl ItemListMenu_InitDescription\n\
+ bl ItemListMenu_InitMenu\n\
+ ldr r1, ._59 + 16 @ gUnknown_0203855B\n\
+ ldrb r0, [r4]\n\
+ add r0, r0, #0x1\n\
+ strb r0, [r1]\n\
+ ldr r1, ._59 + 20 @ gUnknown_0203855C\n\
+ mov r0, #0x0\n\
+ strb r0, [r1]\n\
+ ldr r1, ._59 + 24 @ gMain\n\
+ ldr r0, ._59 + 28 @ 0x43c\n\
+ add r1, r1, r0\n\
+ b ._62\n\
+._60:\n\
+ .align 2, 0\n\
+._59:\n\
+ .word 0xffff\n\
+ .word gBagPocketScrollStates\n\
+ .word sCurrentBagPocket\n\
+ .word gCurrentBagPocketItemSlots\n\
+ .word gUnknown_0203855B\n\
+ .word gUnknown_0203855C\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._21:\n\
+ bl CreateBagSprite\n\
+ mov r0, #0x0\n\
+ bl CreateBagPokeballSprite\n\
+ bl sub_80A3740\n\
+ b ._61\n\
+._22:\n\
+ ldr r3, ._63 @ 0x4000208\n\
+ ldrh r2, [r3]\n\
+ mov r0, #0x0\n\
+ strh r0, [r3]\n\
+ ldr r4, ._63 + 4 @ 0x4000200\n\
+ ldrh r0, [r4]\n\
+ mov r1, #0x1\n\
+ orr r0, r0, r1\n\
+ strh r0, [r4]\n\
+ strh r2, [r3]\n\
+ ldr r2, ._63 + 8 @ 0x4000004\n\
+ ldrh r0, [r2]\n\
+ mov r1, #0x8\n\
+ orr r0, r0, r1\n\
+ strh r0, [r2]\n\
+ mov r0, #0x1\n\
+ neg r0, r0\n\
+ mov r1, #0x0\n\
+ str r1, [sp]\n\
+ mov r2, #0x10\n\
+ mov r3, #0x0\n\
+ bl BeginNormalPaletteFade\n\
+ ldr r2, ._63 + 12 @ gPaletteFade\n\
+ ldrb r1, [r2, #0x8]\n\
+ mov r0, #0x7f\n\
+ and r0, r0, r1\n\
+ strb r0, [r2, #0x8]\n\
+ ldr r1, ._63 + 16 @ gMain\n\
+ ldr r0, ._63 + 20 @ 0x43c\n\
+ add r1, r1, r0\n\
+ b ._62\n\
+._64:\n\
+ .align 2, 0\n\
+._63:\n\
+ .word 0x4000208\n\
+ .word 0x4000200\n\
+ .word 0x4000004\n\
+ .word gPaletteFade\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._23:\n\
+ bl sub_8055870\n\
+ cmp r0, #0x1\n\
+ beq ._66 @cond_branch\n\
+._61:\n\
+ ldr r1, ._67 @ gMain\n\
+ ldr r2, ._67 + 4 @ 0x43c\n\
+ add r1, r1, r2\n\
+._62:\n\
+ ldrb r0, [r1]\n\
+ add r0, r0, #0x1\n\
+ strb r0, [r1]\n\
+ b ._66\n\
+._68:\n\
+ .align 2, 0\n\
+._67:\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._24:\n\
+ ldr r0, ._71 @ sub_80A3134\n\
+ bl SetVBlankCallback\n\
+ ldr r0, ._71 + 4 @ sub_80A3118\n\
+ bl SetMainCallback2\n\
+ bl sub_80A751C\n\
+ bl sub_80A7630\n\
+ bl sub_80A770C\n\
+ bl sub_80A7828\n\
+ bl sub_80A78B8\n\
+ ldr r0, ._71 + 8 @ gLinkOpen\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0x1\n\
+ bne ._69 @cond_branch\n\
+ ldr r0, ._71 + 12 @ 0x600f5e0\n\
+ mov r1, #0x80\n\
+ lsl r1, r1, #0x8\n\
+ ldr r2, ._71 + 16 @ 0x600f800\n\
+ mov r3, #0x0\n\
+ bl debug_sub_8008218\n\
+._69:\n\
+ mov r0, #0x1\n\
+ b ._70\n\
+._72:\n\
+ .align 2, 0\n\
+._71:\n\
+ .word sub_80A3134+1\n\
+ .word sub_80A3118+1\n\
+ .word gLinkOpen\n\
+ .word 0x600f5e0\n\
+ .word 0x600f800\n\
+._66:\n\
+ mov r0, #0x0\n\
+._70:\n\
+ add sp, sp, #0x4\n\
+ pop {r4, r5}\n\
+ pop {r1}\n\
+ bx r1");
+}
+#else
static bool8 SetupBagMultistep(void)
{
u32 index;
@@ -496,6 +901,7 @@ static bool8 SetupBagMultistep(void)
}
return FALSE;
}
+#endif
static bool8 sub_80A34B4(void)
{
@@ -622,6 +1028,79 @@ void ClearBag(void)
ResetBagScrollPositions();
}
+#if DEBUG
+__attribute__((naked))
+void debug_sub_80A3714()
+{
+ asm("\
+ push {r4, r5, r6, lr}\n\
+ add sp, sp, #0xfffffff4\n\
+ mov r5, #0x0\n\
+ ldr r2, ._138 @ gUnknown_Debug_083EBC68\n\
+ mov r1, #0x0\n\
+._134:\n\
+ lsl r0, r5, #0x1\n\
+ add r0, r0, sp\n\
+ strh r1, [r0]\n\
+ add r0, r5, #1\n\
+ lsl r0, r0, #0x10\n\
+ lsr r5, r0, #0x10\n\
+ cmp r5, #0x4\n\
+ bls ._134 @cond_branch\n\
+ mov r5, #0x0\n\
+ ldrh r0, [r2]\n\
+ cmp r0, #0\n\
+ beq ._136 @cond_branch\n\
+ add r6, r2, #0\n\
+._137:\n\
+ lsl r4, r5, #0x2\n\
+ add r4, r4, r6\n\
+ ldrh r0, [r4]\n\
+ bl ItemId_GetPocket\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x8\n\
+ ldr r1, ._138 + 4 @ 0xffff0000\n\
+ add r0, r0, r1\n\
+ lsr r0, r0, #0x10\n\
+ ldr r1, ._138 + 8 @ gBagPockets\n\
+ lsl r2, r0, #0x3\n\
+ add r2, r2, r1\n\
+ lsl r0, r0, #0x1\n\
+ mov r1, sp\n\
+ add r3, r1, r0\n\
+ ldrh r1, [r3]\n\
+ ldr r0, [r2]\n\
+ lsl r1, r1, #0x2\n\
+ add r1, r1, r0\n\
+ ldr r0, [r4]\n\
+ str r0, [r1]\n\
+ ldrh r0, [r3]\n\
+ add r0, r0, #0x1\n\
+ strh r0, [r3]\n\
+ add r0, r5, #1\n\
+ lsl r0, r0, #0x10\n\
+ lsr r5, r0, #0x10\n\
+ cmp r5, #0x3b\n\
+ bhi ._136 @cond_branch\n\
+ lsl r0, r5, #0x2\n\
+ add r0, r0, r6\n\
+ ldrh r0, [r0]\n\
+ cmp r0, #0\n\
+ bne ._137 @cond_branch\n\
+._136:\n\
+ add sp, sp, #0xc\n\
+ pop {r4, r5, r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+._139:\n\
+ .align 2, 0\n\
+._138:\n\
+ .word gUnknown_Debug_083EBC68\n\
+ .word 0xffff0000\n\
+ .word gBagPockets");
+}
+#endif
+
static void sub_80A3740(void)
{
const u16 colors[2] = {RGB(14, 15, 16), RGB_WHITE};
@@ -3561,12 +4040,49 @@ static void sub_80A73FC(void)
MenuCursor_Destroy814AD44();
}
+#if DEBUG
+__attribute__((naked))
+static void sub_80A740C(void)
+{
+ asm("\
+ push {lr}\n\
+ add sp, sp, #0xfffffffc\n\
+ bl sub_80A75E4\n\
+ bl sub_80A7768\n\
+ bl sub_80A7420\n\
+ ldr r0, ._931 @ gLinkOpen\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0x1\n\
+ bne ._930 @cond_branch\n\
+ ldr r0, ._931 + 4 @ gLink\n\
+ ldr r1, ._931 + 8 @ 0xfbd\n\
+ add r0, r0, r1\n\
+ ldrb r0, [r0]\n\
+ mov r1, #0x0\n\
+ str r1, [sp]\n\
+ mov r1, #0x1\n\
+ mov r2, #0x1\n\
+ mov r3, #0x2\n\
+ bl debug_sub_8008264\n\
+._930:\n\
+ add sp, sp, #0x4\n\
+ pop {r0}\n\
+ bx r0\n\
+._932:\n\
+ .align 2, 0\n\
+._931:\n\
+ .word gLinkOpen\n\
+ .word gLink\n\
+ .word 0xfbd");
+}
+#else
static void sub_80A740C(void)
{
sub_80A75E4();
sub_80A7768();
sub_80A7420();
}
+#endif
static void sub_80A7420(void)
{
diff --git a/src/field/mauville_man.c b/src/field/mauville_man.c
index 0a841eed1..b42c50513 100644
--- a/src/field/mauville_man.c
+++ b/src/field/mauville_man.c
@@ -250,7 +250,88 @@ void SetupMauvilleOldMan(void)
sub_80F83D0();
}
-static u8 GetCurrentMauvilleOldMan(void)
+#if DEBUG
+__attribute__((naked))
+void debug_sub_810B32C()
+{
+ asm(
+ " push {r4, lr}\n"
+ " add sp, sp, #0xfffffff8\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " cmp r0, #0x4\n"
+ " bhi ._37 @cond_branch\n"
+ " lsl r0, r0, #0x2\n"
+ " ldr r1, ._23 @ \n"
+ " add r0, r0, r1\n"
+ " ldr r0, [r0]\n"
+ " mov pc, r0\n"
+ "._24:\n"
+ " .align 2, 0\n"
+ "._23:\n"
+ " .word ._22\n"
+ "._22:\n"
+ " .word ._25\n"
+ " .word ._26\n"
+ " .word ._27\n"
+ " .word ._28\n"
+ " .word ._29\n"
+ "._25:\n"
+ " bl SetupBard\n"
+ " b ._37\n"
+ "._26:\n"
+ " mov r2, #0x0\n"
+ " ldr r3, ._34 @ gSaveBlock1\n"
+ "._31:\n"
+ " mov r0, sp\n"
+ " add r1, r0, r2\n"
+ " add r0, r2, r3\n"
+ " ldrb r0, [r0]\n"
+ " strb r0, [r1]\n"
+ " add r0, r2, #1\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r2, r0, #0x18\n"
+ " cmp r2, #0x7\n"
+ " bls ._31 @cond_branch\n"
+ " bl SetupHipster\n"
+ " mov r2, #0x0\n"
+ " ldr r3, ._34 @ gSaveBlock1\n"
+ "._32:\n"
+ " add r1, r2, r3\n"
+ " mov r4, sp\n"
+ " add r0, r4, r2\n"
+ " ldrb r0, [r0]\n"
+ " strb r0, [r1]\n"
+ " add r0, r2, #1\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r2, r0, #0x18\n"
+ " cmp r2, #0x7\n"
+ " bls ._32 @cond_branch\n"
+ " b ._37\n"
+ "._35:\n"
+ " .align 2, 0\n"
+ "._34:\n"
+ " .word gSaveBlock1+0x2d8c\n"
+ "._27:\n"
+ " bl SetupTrader\n"
+ " b ._37\n"
+ "._28:\n"
+ " bl SetupStoryteller\n"
+ " b ._37\n"
+ "._29:\n"
+ " bl SetupGiddy\n"
+ "._37:\n"
+ " bl sub_80F83D0\n"
+ " add sp, sp, #0x8\n"
+ " pop {r4}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "\n"
+ );
+}
+#endif
+
+u8 GetCurrentMauvilleOldMan(void)
{
struct MauvilleManCommon *common = &gSaveBlock1.mauvilleMan.common;
diff --git a/src/field/overworld.c b/src/field/overworld.c
index dcfa72cbb..397a28436 100644
--- a/src/field/overworld.c
+++ b/src/field/overworld.c
@@ -23,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"
@@ -60,6 +61,7 @@ struct UnkTVStruct
u32 tv_field_4;
};
+extern u8 gUnknown_020297ED;
extern u16 gUnknown_03004898;
extern u16 gUnknown_0300489C;
@@ -1104,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();
@@ -1208,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;
@@ -1363,6 +1454,10 @@ void CB2_ContinueSavedGame(void)
{
FieldClearVBlankHBlankCallbacks();
StopMapMusic();
+#if DEBUG
+ if (gMain.heldKeys & R_BUTTON)
+ gUnknown_020297ED = TRUE;
+#endif
ResetSafariZoneFlag_();
LoadSaveblockMapHeader();
LoadSaveblockMapObjScripts();
diff --git a/src/field/party_menu.c b/src/field/party_menu.c
index f55ed669d..66e7e2319 100644
--- a/src/field/party_menu.c
+++ b/src/field/party_menu.c
@@ -94,9 +94,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);
@@ -493,6 +493,71 @@ extern const u8 gStatusPal_Icons[];
#define WINDOW_RIGHT (29)
#endif
+#if DEBUG
+__attribute__((naked))
+void CB2_PartyMenuMain(void)
+{
+ asm("\
+ push {r4, r5, r6, lr}\n\
+ add sp, sp, #0xfffffffc\n\
+ bl AnimateSprites\n\
+ bl BuildOamBuffer\n\
+ ldr r0, ._3 @ gPartyMenuType\n\
+ ldrb r1, [r0]\n\
+ lsl r0, r1, #0x1\n\
+ add r0, r0, r1\n\
+ lsl r0, r0, #0x4\n\
+ ldr r1, ._3 + 4 @ PartyMonTextSettings\n\
+ add r5, r0, r1\n\
+ mov r6, #0x0\n\
+._1:\n\
+ ldrb r0, [r5]\n\
+ lsl r0, r0, #0x3\n\
+ ldrb r1, [r5, #0x1]\n\
+ lsl r1, r1, #0x3\n\
+ ldr r2, [r5, #0x4]\n\
+ lsl r3, r6, #0x5\n\
+ mov r4, #0x80\n\
+ lsl r4, r4, #0x2\n\
+ orr r3, r3, r4\n\
+ str r3, [sp]\n\
+ mov r3, #0x0\n\
+ bl DrawPartyMenuMonText\n\
+ add r5, r5, #0x8\n\
+ add r6, r6, #0x1\n\
+ cmp r6, #0x5\n\
+ ble ._1 @cond_branch\n\
+ bl RunTasks\n\
+ bl UpdatePaletteFade\n\
+ ldr r0, ._3 + 8 @ gLinkOpen\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0x1\n\
+ bne ._2 @cond_branch\n\
+ ldr r0, ._3 + 12 @ gLink\n\
+ ldr r1, ._3 + 16 @ 0xfbd\n\
+ add r0, r0, r1\n\
+ ldrb r0, [r0]\n\
+ mov r1, #0x2\n\
+ str r1, [sp]\n\
+ mov r1, #0x1\n\
+ mov r2, #0x1\n\
+ mov r3, #0x2\n\
+ bl debug_sub_8008264\n\
+._2:\n\
+ add sp, sp, #0x4\n\
+ pop {r4, r5, r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+._4:\n\
+ .align 2, 0\n\
+._3:\n\
+ .word gPartyMenuType\n\
+ .word PartyMonTextSettings\n\
+ .word gLinkOpen\n\
+ .word gLink\n\
+ .word 0xfbd");
+}
+#else
void CB2_PartyMenuMain(void)
{
const struct PartyMonTextSettingsStruct *textSettings;
@@ -517,6 +582,7 @@ void CB2_PartyMenuMain(void)
RunTasks();
UpdatePaletteFade();
}
+#endif
void VBlankCB_PartyMenu(void)
{
@@ -621,6 +687,425 @@ bool8 SetupDefaultPartyMenu(void)
return FALSE;
}
+#if DEBUG
+__attribute__((naked))
+bool8 InitPartyMenu(void)
+{
+ asm("\
+ push {r4, r5, r6, r7, lr}\n\
+ mov r7, r8\n\
+ push {r7}\n\
+ add sp, sp, #0xfffffff4\n\
+ ldr r0, ._55 @ gMain\n\
+ ldr r1, ._55 + 4 @ 0x43c\n\
+ add r0, r0, r1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0x11\n\
+ bls ._53 @cond_branch\n\
+ b ._125\n\
+._53:\n\
+ lsl r0, r0, #0x2\n\
+ ldr r1, ._55 + 8 @ \n\
+ add r0, r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+._56:\n\
+ .align 2, 0\n\
+._55:\n\
+ .word gMain\n\
+ .word 0x43c\n\
+ .word ._57\n\
+._57:\n\
+ .word ._58\n\
+ .word ._59\n\
+ .word ._60\n\
+ .word ._61\n\
+ .word ._62\n\
+ .word ._63\n\
+ .word ._64\n\
+ .word ._65\n\
+ .word ._66\n\
+ .word ._67\n\
+ .word ._68\n\
+ .word ._69\n\
+ .word ._70\n\
+ .word ._71\n\
+ .word ._72\n\
+ .word ._73\n\
+ .word ._74\n\
+ .word ._75\n\
+._58:\n\
+ mov r0, #0x0\n\
+ bl SetVBlankCallback\n\
+ mov r3, #0xc0\n\
+ lsl r3, r3, #0x13\n\
+ mov r4, #0xc0\n\
+ lsl r4, r4, #0x9\n\
+ add r2, sp, #0x8\n\
+ mov r8, r2\n\
+ add r2, sp, #0x4\n\
+ mov r6, #0x0\n\
+ ldr r1, ._78 @ 0x40000d4\n\
+ mov r5, #0x80\n\
+ lsl r5, r5, #0x5\n\
+ ldr r7, ._78 + 4 @ 0x81000800\n\
+ mov r0, #0x81\n\
+ lsl r0, r0, #0x18\n\
+ mov ip, r0\n\
+._76:\n\
+ strh r6, [r2]\n\
+ add r0, sp, #0x4\n\
+ str r0, [r1]\n\
+ str r3, [r1, #0x4]\n\
+ str r7, [r1, #0x8]\n\
+ ldr r0, [r1, #0x8]\n\
+ add r3, r3, r5\n\
+ sub r4, r4, r5\n\
+ cmp r4, r5\n\
+ bhi ._76 @cond_branch\n\
+ strh r6, [r2]\n\
+ add r2, sp, #0x4\n\
+ str r2, [r1]\n\
+ str r3, [r1, #0x4]\n\
+ lsr r0, r4, #0x1\n\
+ mov r3, ip\n\
+ orr r0, r0, r3\n\
+ str r0, [r1, #0x8]\n\
+ ldr r0, [r1, #0x8]\n\
+ mov r0, #0xe0\n\
+ lsl r0, r0, #0x13\n\
+ mov r3, #0x80\n\
+ lsl r3, r3, #0x3\n\
+ mov r4, #0x0\n\
+ str r4, [sp, #0x8]\n\
+ ldr r2, ._78 @ 0x40000d4\n\
+ mov r1, r8\n\
+ str r1, [r2]\n\
+ str r0, [r2, #0x4]\n\
+ lsr r0, r3, #0x2\n\
+ mov r1, #0x85\n\
+ lsl r1, r1, #0x18\n\
+ orr r0, r0, r1\n\
+ str r0, [r2, #0x8]\n\
+ ldr r0, [r2, #0x8]\n\
+ mov r1, #0xa0\n\
+ lsl r1, r1, #0x13\n\
+ add r0, sp, #0x4\n\
+ strh r4, [r0]\n\
+ str r0, [r2]\n\
+ str r1, [r2, #0x4]\n\
+ lsr r3, r3, #0x1\n\
+ mov r0, #0x81\n\
+ lsl r0, r0, #0x18\n\
+ orr r3, r3, r0\n\
+ str r3, [r2, #0x8]\n\
+ ldr r0, [r2, #0x8]\n\
+ ldr r2, ._78 + 8 @ gPaletteFade\n\
+ ldrb r0, [r2, #0x8]\n\
+ mov r1, #0x80\n\
+ orr r0, r0, r1\n\
+ strb r0, [r2, #0x8]\n\
+ ldr r1, ._78 + 12 @ gMain\n\
+ ldr r2, ._78 + 16 @ 0x43c\n\
+ add r1, r1, r2\n\
+ b ._122\n\
+._79:\n\
+ .align 2, 0\n\
+._78:\n\
+ .word 0x40000d4\n\
+ .word 0x81000800\n\
+ .word gPaletteFade\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._59:\n\
+ bl ScanlineEffect_Stop\n\
+ b ._115\n\
+._60:\n\
+ bl sub_806B4A8\n\
+ ldr r1, ._82 @ \n\
+ mov r2, #0x99\n\
+ lsl r2, r2, #0x2\n\
+ add r0, r1, r2\n\
+ mov r2, #0x0\n\
+ strh r2, [r0]\n\
+ ldr r3, ._82 + 4 @ \n\
+ add r0, r1, r3\n\
+ strh r2, [r0]\n\
+ mov r0, #0x9a\n\
+ lsl r0, r0, #0x2\n\
+ add r1, r1, r0\n\
+ strh r2, [r1]\n\
+ ldr r1, ._82 + 8 @ \n\
+ ldr r2, ._82 + 12 @ \n\
+ add r1, r1, r2\n\
+ b ._122\n\
+._83:\n\
+ .align 2, 0\n\
+._82:\n\
+ .word +0x201b000\n\
+ .word 0x266\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._61:\n\
+ bl ResetSpriteData\n\
+ b ._115\n\
+._62:\n\
+ ldr r0, ._88 @ \n\
+ mov r1, #0x96\n\
+ lsl r1, r1, #0x2\n\
+ add r0, r0, r1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0x1\n\
+ beq ._86 @cond_branch\n\
+ cmp r0, #0x5\n\
+ beq ._86 @cond_branch\n\
+ bl ResetTasks\n\
+._86:\n\
+ ldr r1, ._88 + 4 @ \n\
+ ldr r2, ._88 + 8 @ \n\
+ add r1, r1, r2\n\
+ b ._122\n\
+._89:\n\
+ .align 2, 0\n\
+._88:\n\
+ .word +0x201b000\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._63:\n\
+ bl FreeAllSpritePalettes\n\
+ b ._115\n\
+._64:\n\
+ ldr r4, ._92 @ \n\
+ mov r1, #0x97\n\
+ lsl r1, r1, #0x2\n\
+ add r0, r4, r1\n\
+ ldr r0, [r0]\n\
+ mov r1, #0x0\n\
+ bl CreateTask\n\
+ mov r2, #0x98\n\
+ lsl r2, r2, #0x2\n\
+ add r1, r4, r2\n\
+ strb r0, [r1]\n\
+ b ._115\n\
+._93:\n\
+ .align 2, 0\n\
+._92:\n\
+ .word +0x201b000\n\
+._65:\n\
+ ldr r0, ._95 @ gWindowTemplate_81E6C90\n\
+ bl Text_LoadWindowTemplate\n\
+ ldr r1, ._95 + 4 @ gMain\n\
+ ldr r0, ._95 + 8 @ 0x43c\n\
+ add r1, r1, r0\n\
+ b ._122\n\
+._96:\n\
+ .align 2, 0\n\
+._95:\n\
+ .word gWindowTemplate_81E6C90\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._66:\n\
+ ldr r4, ._98 @ gUnknown_03004210\n\
+ ldr r1, ._98 + 4 @ gWindowTemplate_81E6C90\n\
+ add r0, r4, #0\n\
+ bl Text_InitWindowWithTemplate\n\
+ add r0, r4, #0\n\
+ mov r1, #0x1\n\
+ bl MultistepInitWindowTileData\n\
+ ldr r1, ._98 + 8 @ gMain\n\
+ ldr r2, ._98 + 12 @ 0x43c\n\
+ add r1, r1, r2\n\
+ b ._122\n\
+._99:\n\
+ .align 2, 0\n\
+._98:\n\
+ .word gUnknown_03004210\n\
+ .word gWindowTemplate_81E6C90\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._67:\n\
+ bl MultistepLoadFont\n\
+ cmp r0, #0\n\
+ bne ._100 @cond_branch\n\
+ b ._125\n\
+._100:\n\
+ ldr r0, ._103 @ \n\
+ mov r3, #0x99\n\
+ lsl r3, r3, #0x2\n\
+ add r0, r0, r3\n\
+ mov r1, #0x1\n\
+ strh r1, [r0]\n\
+ ldr r1, ._103 + 4 @ \n\
+ ldr r0, ._103 + 8 @ \n\
+ add r1, r1, r0\n\
+ b ._122\n\
+._104:\n\
+ .align 2, 0\n\
+._103:\n\
+ .word +0x201b000\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._68:\n\
+ ldr r0, ._107 @ \n\
+ mov r1, #0x99\n\
+ lsl r1, r1, #0x2\n\
+ add r4, r0, r1\n\
+ ldrb r0, [r4]\n\
+ bl LoadPartyMenuGraphics\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ cmp r0, #0x1\n\
+ bne ._105 @cond_branch\n\
+ mov r0, #0x0\n\
+ strh r0, [r4]\n\
+ ldr r1, ._107 + 4 @ \n\
+ ldr r2, ._107 + 8 @ \n\
+ add r1, r1, r2\n\
+ b ._122\n\
+._108:\n\
+ .align 2, 0\n\
+._107:\n\
+ .word +0x201b000\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._105:\n\
+ ldrh r0, [r4]\n\
+ add r0, r0, #0x1\n\
+ strh r0, [r4]\n\
+ b ._125\n\
+._69:\n\
+ bl sub_809D51C\n\
+ b ._115\n\
+._70:\n\
+ ldr r2, ._113 @ PartyMenuHandlers\n\
+ ldr r0, ._113 + 4 @ \n\
+ mov r1, #0x96\n\
+ lsl r1, r1, #0x2\n\
+ add r0, r0, r1\n\
+ ldrb r1, [r0]\n\
+ lsl r0, r1, #0x1\n\
+ add r0, r0, r1\n\
+ lsl r0, r0, #0x2\n\
+ add r2, r2, #0x4\n\
+ add r0, r0, r2\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 ._125 @cond_branch\n\
+ ldr r1, ._113 + 8 @ \n\
+ ldr r2, ._113 + 12 @ \n\
+ add r1, r1, r2\n\
+ b ._122\n\
+._114:\n\
+ .align 2, 0\n\
+._113:\n\
+ .word PartyMenuHandlers\n\
+ .word +0x201b000\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._71:\n\
+ ldr r0, ._116 @ gWindowTemplate_81E6CC8\n\
+ bl MultistepInitMenuWindowBegin\n\
+ b ._115\n\
+._117:\n\
+ .align 2, 0\n\
+._116:\n\
+ .word gWindowTemplate_81E6CC8\n\
+._72:\n\
+ bl MultistepInitMenuWindowContinue\n\
+ cmp r0, #0\n\
+ beq ._125 @cond_branch\n\
+ ldr r1, ._120 @ gMain\n\
+ ldr r0, ._120 + 4 @ 0x43c\n\
+ add r1, r1, r0\n\
+ b ._122\n\
+._121:\n\
+ .align 2, 0\n\
+._120:\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._73:\n\
+ ldr r0, ._123 @ \n\
+ ldr r1, ._123 + 4 @ \n\
+ add r0, r0, r1\n\
+ ldrb r0, [r0]\n\
+ mov r1, #0x0\n\
+ bl PrintPartyMenuPromptText\n\
+ ldr r1, ._123 + 8 @ \n\
+ ldr r2, ._123 + 12 @ \n\
+ add r1, r1, r2\n\
+ b ._122\n\
+._124:\n\
+ .align 2, 0\n\
+._123:\n\
+ .word +0x201b000\n\
+ .word 0x259\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._74:\n\
+ mov r0, #0x1\n\
+ neg r0, r0\n\
+ mov r1, #0x0\n\
+ str r1, [sp]\n\
+ mov r2, #0x10\n\
+ mov r3, #0x0\n\
+ bl BeginNormalPaletteFade\n\
+ ldr r2, ._126 @ gPaletteFade\n\
+ ldrb r1, [r2, #0x8]\n\
+ mov r0, #0x7f\n\
+ and r0, r0, r1\n\
+ strb r0, [r2, #0x8]\n\
+._115:\n\
+ ldr r1, ._126 + 4 @ gMain\n\
+ ldr r3, ._126 + 8 @ 0x43c\n\
+ add r1, r1, r3\n\
+._122:\n\
+ ldrb r0, [r1]\n\
+ add r0, r0, #0x1\n\
+ strb r0, [r1]\n\
+ b ._125\n\
+._127:\n\
+ .align 2, 0\n\
+._126:\n\
+ .word gPaletteFade\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._75:\n\
+ ldr r0, ._130 @ VBlankCB_PartyMenu\n\
+ bl SetVBlankCallback\n\
+ ldr r0, ._130 + 4 @ gLinkOpen\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0x1\n\
+ bne ._128 @cond_branch\n\
+ ldr r0, ._130 + 8 @ 0x600e5e0\n\
+ mov r1, #0x80\n\
+ lsl r1, r1, #0x8\n\
+ ldr r2, ._130 + 12 @ 0x6007800\n\
+ mov r3, #0x2\n\
+ bl debug_sub_8008218\n\
+._128:\n\
+ mov r0, #0x1\n\
+ b ._129\n\
+._131:\n\
+ .align 2, 0\n\
+._130:\n\
+ .word VBlankCB_PartyMenu+1\n\
+ .word gLinkOpen\n\
+ .word 0x600e5e0\n\
+ .word 0x6007800\n\
+._125:\n\
+ mov r0, #0x0\n\
+._129:\n\
+ add sp, sp, #0xc\n\
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4, r5, r6, r7}\n\
+ pop {r1}\n\
+ bx r1");
+}
+#else
bool8 InitPartyMenu(void)
{
switch (gMain.state)
@@ -728,6 +1213,7 @@ bool8 InitPartyMenu(void)
return FALSE;
}
+#endif
void CB2_InitPartyMenu(void)
{
@@ -4007,6 +4493,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 +4511,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);
@@ -4751,7 +5245,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 +5255,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 +5264,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;
@@ -5499,9 +6006,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/field/pc_screen_effect.c
index e0853e01d..dcc3bc9c9 100644
--- a/src/field/pc_screen_effect.c
+++ b/src/field/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/field/pokeblock.c b/src/field/pokeblock.c
index e08a65f49..b4be44aa2 100644
--- a/src/field/pokeblock.c
+++ b/src/field/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,14 +449,13 @@ 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
diff --git a/src/field/pokedex_area_screen.c b/src/field/pokedex_area_screen.c
new file mode 100644
index 000000000..67ca276c4
--- /dev/null
+++ b/src/field/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/field/pokenav.c b/src/field/pokenav.c
new file mode 100644
index 000000000..f57a98df6
--- /dev/null
+++ b/src/field/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/field/region_map.c b/src/field/region_map.c
index 1378820fe..7bfda1a81 100644
--- a/src/field/region_map.c
+++ b/src/field/region_map.c
@@ -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)
{
@@ -1420,7 +1420,7 @@ struct UnknownStruct4
static const u8 *const sEverGrandeCityAreaNames[] = {OtherText_PokeLeague, OtherText_PokeCenter};
-static const struct UnknownStruct4 sUnknown_083E79C0[1] =
+const struct UnknownStruct4 gUnknown_083E79C0[1] =
{
{sEverGrandeCityAreaNames, MAPSEC_EVER_GRANDE_CITY, FLAG_SYS_POKEMON_LEAGUE_FLY},
};
@@ -1591,14 +1591,14 @@ static void VBlankCB_FlyRegionMap(void)
TransferPlttBuffer();
}
-static void CB2_FlyRegionMap(void)
+void CB2_FlyRegionMap(void)
{
ewram0_3.unk0();
AnimateSprites();
BuildOamBuffer();
}
-static void sub_80FC244(void (*func)(void))
+void sub_80FC244(void (*func)(void))
{
ewram0_3.unk0 = func;
ewram0_3.unk4 = 0;
@@ -1611,9 +1611,9 @@ static void PrintFlyTargetName(void)
u16 i;
bool32 drawFrameDisabled = FALSE;
- for (i = 0; i < ARRAY_COUNT(sUnknown_083E79C0); i++)
+ for (i = 0; i < ARRAY_COUNT(gUnknown_083E79C0); i++)
{
- const struct UnknownStruct4 *r4 = &sUnknown_083E79C0[i];
+ const struct UnknownStruct4 *r4 = &gUnknown_083E79C0[i];
if (ewram0_3.regionMap.mapSectionId == r4->mapSectionId)
{
@@ -1795,7 +1795,7 @@ static void sub_80FC600(void)
}
}
-static void sub_80FC69C(void)
+void sub_80FC69C(void)
{
switch (ewram0_3.unk4)
{
diff --git a/src/field/roamer.c b/src/field/roamer.c
index 2eb26ef9d..6ed5b6c89 100644
--- a/src/field/roamer.c
+++ b/src/field/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/field/safari_zone.c b/src/field/safari_zone.c
index 6c7c8b391..f371b08b3 100644
--- a/src/field/safari_zone.c
+++ b/src/field/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/field/secret_base.c b/src/field/secret_base.c
index 2d02de004..8b67a2cd9 100644
--- a/src/field/secret_base.c
+++ b/src/field/secret_base.c
@@ -1648,6 +1648,178 @@ void sub_80BD610(struct SecretBaseRecord *basesA, struct SecretBaseRecord *bases
sub_80BD328(basesC, 0);
}
+#if DEBUG
+__attribute__((naked))
+void sub_80BD674(void *playerRecords, u32 size, u8 c)
+{
+ asm("\
+ push {r4, r5, r6, r7, lr}\n\
+ add r6, r0, #0\n\
+ add r5, r1, #0\n\
+ lsl r2, r2, #0x18\n\
+ lsr r7, r2, #0x18\n\
+ ldr r0, ._503 @ gUnknown_020297ED\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ bne ._498 @cond_branch\n\
+ mov r0, #0x60\n\
+ bl FlagGet\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ bne ._498 @cond_branch\n\
+ b ._520\n\
+._498:\n\
+ bl GetLinkPlayerCount\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ cmp r0, #0x2\n\
+ beq ._500 @cond_branch\n\
+ cmp r0, #0x3\n\
+ beq ._501 @cond_branch\n\
+ b ._505\n\
+._504:\n\
+ .align 2, 0\n\
+._503:\n\
+ .word gUnknown_020297ED\n\
+._500:\n\
+ lsl r4, r5, #0x1\n\
+ add r0, r6, r4\n\
+ mov r1, #0x0\n\
+ add r2, r5, #0\n\
+ bl memset\n\
+ add r4, r4, r5\n\
+ add r4, r6, r4\n\
+ add r0, r4, #0\n\
+ mov r1, #0x0\n\
+ add r2, r5, #0\n\
+ bl memset\n\
+ b ._505\n\
+._501:\n\
+ lsl r0, r5, #0x1\n\
+ add r0, r0, r5\n\
+ add r0, r6, r0\n\
+ mov r1, #0x0\n\
+ add r2, r5, #0\n\
+ bl memset\n\
+._505:\n\
+ cmp r7, #0x1\n\
+ beq ._506 @cond_branch\n\
+ cmp r7, #0x1\n\
+ bgt ._507 @cond_branch\n\
+ cmp r7, #0\n\
+ beq ._508 @cond_branch\n\
+ b ._515\n\
+._507:\n\
+ cmp r7, #0x2\n\
+ beq ._510 @cond_branch\n\
+ cmp r7, #0x3\n\
+ beq ._511 @cond_branch\n\
+ b ._515\n\
+._508:\n\
+ add r0, r6, r5\n\
+ lsl r2, r5, #0x1\n\
+ add r1, r6, r2\n\
+ add r2, r2, r5\n\
+ add r2, r6, r2\n\
+ bl sub_80BD610\n\
+ b ._515\n\
+._506:\n\
+ lsl r1, r5, #0x1\n\
+ add r0, r6, r1\n\
+ add r1, r1, r5\n\
+ add r1, r6, r1\n\
+ add r2, r6, #0\n\
+ bl sub_80BD610\n\
+ b ._515\n\
+._510:\n\
+ lsl r0, r5, #0x1\n\
+ add r0, r0, r5\n\
+ add r0, r6, r0\n\
+ add r2, r6, r5\n\
+ add r1, r6, #0\n\
+ bl sub_80BD610\n\
+ b ._515\n\
+._511:\n\
+ add r1, r6, r5\n\
+ lsl r2, r5, #0x1\n\
+ add r2, r6, r2\n\
+ add r0, r6, #0\n\
+ bl sub_80BD610\n\
+._515:\n\
+ mov r3, #0x1\n\
+ ldr r6, ._521 @ gSaveBlock1\n\
+ mov r5, #0x10\n\
+ neg r5, r5\n\
+ ldr r4, ._521 + 4 @ 0x1a09\n\
+._517:\n\
+ lsl r0, r3, #0x2\n\
+ add r0, r0, r3\n\
+ lsl r0, r0, #0x5\n\
+ add r0, r0, r6\n\
+ add r2, r0, r4\n\
+ ldrb r1, [r2]\n\
+ lsl r0, r1, #0x1c\n\
+ lsr r0, r0, #0x1c\n\
+ cmp r0, #0x1\n\
+ bne ._516 @cond_branch\n\
+ mov r0, #0x3f\n\
+ and r0, r0, r1\n\
+ mov r1, #0x40\n\
+ orr r0, r0, r1\n\
+ and r0, r0, r5\n\
+ strb r0, [r2]\n\
+._516:\n\
+ add r0, r3, #1\n\
+ lsl r0, r0, #0x10\n\
+ lsr r3, r0, #0x10\n\
+ cmp r3, #0x13\n\
+ bls ._517 @cond_branch\n\
+ bl sub_80BD280\n\
+ mov r3, #0x1\n\
+ ldr r4, ._521 @ gSaveBlock1\n\
+ ldr r6, ._521 + 4 @ 0x1a09\n\
+ add r7, r4, #0\n\
+ mov r5, #0x3f\n\
+._519:\n\
+ lsl r0, r3, #0x2\n\
+ add r0, r0, r3\n\
+ lsl r0, r0, #0x5\n\
+ add r0, r0, r4\n\
+ add r2, r0, r6\n\
+ ldrb r1, [r2]\n\
+ lsr r0, r1, #0x6\n\
+ cmp r0, #0x2\n\
+ bne ._518 @cond_branch\n\
+ add r0, r5, #0\n\
+ and r0, r0, r1\n\
+ strb r0, [r2]\n\
+._518:\n\
+ add r0, r3, #1\n\
+ lsl r0, r0, #0x10\n\
+ lsr r3, r0, #0x10\n\
+ cmp r3, #0x13\n\
+ bls ._519 @cond_branch\n\
+ ldr r0, ._521 + 8 @ 0x1a16\n\
+ add r2, r7, r0\n\
+ ldrh r1, [r2]\n\
+ ldr r0, ._521 + 12 @ 0xffff\n\
+ cmp r1, r0\n\
+ beq ._520 @cond_branch\n\
+ add r0, r1, #1\n\
+ strh r0, [r2]\n\
+._520:\n\
+ pop {r4, r5, r6, r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+._522:\n\
+ .align 2, 0\n\
+._521:\n\
+ .word gSaveBlock1\n\
+ .word 0x1a09\n\
+ .word 0x1a16\n\
+ .word 0xffff");
+}
+#else
void sub_80BD674(void *playerRecords, u32 size, u8 c)
{
if (FlagGet(FLAG_RECEIVED_SECRET_POWER))
@@ -1706,3 +1878,4 @@ void sub_80BD674(void *playerRecords, u32 size, u8 c)
}
}
}
+#endif
diff --git a/src/field/shop.c b/src/field/shop.c
index a87c859b7..a197ca13d 100644
--- a/src/field/shop.c
+++ b/src/field/shop.c
@@ -1238,3 +1238,24 @@ void Shop_CreateDecorationShop2Menu(u16 *itemList)
SetShopItemsForSale(itemList);
SetShopMenuCallback(EnableBothScriptContexts);
}
+
+#if DEBUG
+__attribute__((naked))
+void debug_sub_80C2818(void)
+{
+ asm("\
+ push {lr}\n\
+ mov r0, #0x0\n\
+ bl CreateShopMenu\n\
+ ldr r0, ._290 @ gMartBuyNoSellOptionList\n\
+ bl SetShopItemsForSale\n\
+ mov r0, #0x0\n\
+ bl SetShopMenuCallback\n\
+ pop {r0}\n\
+ bx r0\n\
+._291:\n\
+ .align 2, 0\n\
+._290:\n\
+ .word gMartBuyNoSellOptionList+0x3");
+}
+#endif
diff --git a/src/field/slot_machine.c b/src/field/slot_machine.c
index 21bf29e91..2c97c146d 100644
--- a/src/field/slot_machine.c
+++ b/src/field/slot_machine.c
@@ -17,7 +17,8 @@
#include "menu.h"
#include "ewram.h"
-struct UnkStruct1 {
+struct UnkStruct1
+{
/*0x00*/ u8 unk00;
/*0x01*/ u8 unk01;
/*0x02*/ s16 unk02;
@@ -29,6 +30,8 @@ struct UnkStruct1 {
#define SLOTMACHINE_GFX_TILES 236
#endif
+// TODO: figure out which functions are static and which are not.
+#define static
static void CB2_SlotMachineSetup(void);
static void CB2_SlotMachineLoop(void);
@@ -61,7 +64,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 +79,7 @@ static bool8 sub_81023E0(struct Task *task);
static bool8 sub_81023FC(struct Task *task);
static bool8 sub_8102424(struct Task *task);
static bool8 sub_8102460(struct Task *task);
+static bool8 debug_sub_8116E74(struct Task *);
static void sub_8102484(void);
static void sub_81024F0(void);
static bool8 sub_8102540(void);
@@ -222,6 +226,15 @@ 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
+__attribute__((section(".bss"))) u8 unk_debug_bss_1_0 = 0;
+__attribute__((section(".bss"))) u8 unk_debug_bss_1_1 = 0;
+__attribute__((section(".bss"))) u8 unk_debug_bss_1_2 = 0;
+__attribute__((section(".bss"))) u8 unk_debug_bss_1_3 = 0;
+__attribute__((section(".bss"))) u8 unk_debug_bss_1_4 = 0;
+__attribute__((section(".bss"))) u32 unk_debug_bss_1_8 = 0;
+#endif
+
static const struct UnkStruct1 *const gUnknown_083ED048[];
static const u16 gPalette_83EDE24[];
static const u8 gUnknown_083ECD04[][3];
@@ -231,10 +244,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)
@@ -366,6 +391,135 @@ static void SlotMachineSetup_2_1(void)
static const s16 gUnknown_083ECCF8[][2];
+#if DEBUG
+__attribute__((naked))
+static void SlotMachineSetup_0_1(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\
+ bl sub_81019EC\n\
+ ldr r5, ._43 @ \n\
+ mov r4, #0x0\n\
+ strb r4, [r5]\n\
+ strb r4, [r5, #0x2]\n\
+ bl Random\n\
+ mov r1, #0x1\n\
+ and r1, r1, r0\n\
+ strb r1, [r5, #0x3]\n\
+ strb r4, [r5, #0x4]\n\
+ mov r0, #0x0\n\
+ strh r4, [r5, #0x8]\n\
+ strb r0, [r5, #0xa]\n\
+ strb r0, [r5, #0xb]\n\
+ ldr r0, ._43 + 4 @ \n\
+ ldr r1, ._43 + 8 @ \n\
+ add r0, r0, r1\n\
+ ldrh r0, [r0]\n\
+ strh r0, [r5, #0xc]\n\
+ strh r4, [r5, #0xe]\n\
+ strh r4, [r5, #0x10]\n\
+ strh r4, [r5, #0x12]\n\
+ strh r4, [r5, #0x18]\n\
+ mov r0, #0x8\n\
+ strh r0, [r5, #0x1a]\n\
+ add r1, r5, #0\n\
+ add r1, r1, #0x58\n\
+ mov r0, #0xf0\n\
+ strh r0, [r1]\n\
+ add r1, r1, #0x2\n\
+ mov r0, #0xa0\n\
+ strh r0, [r1]\n\
+ add r0, r5, #0\n\
+ add r0, r0, #0x5c\n\
+ mov r1, #0x3f\n\
+ strh r1, [r0]\n\
+ add r0, r0, #0x2\n\
+ strh r1, [r0]\n\
+ bl GetCurrentMapMusic\n\
+ add r1, r5, #0\n\
+ add r1, r1, #0x60\n\
+ strh r0, [r1]\n\
+ mov r7, #0x0\n\
+ add r6, r5, #0\n\
+ ldr r2, ._43 + 12 @ \n\
+ mov sl, r2\n\
+ mov r0, #0x1c\n\
+ add r0, r0, r6\n\
+ mov r9, r0\n\
+._41:\n\
+ lsl r5, r7, #0x1\n\
+ mov r1, #0x22\n\
+ add r1, r1, r6\n\
+ mov r8, r1\n\
+ add r1, r5, r1\n\
+ mov r0, #0x0\n\
+ strh r0, [r1]\n\
+ add r4, r6, #0\n\
+ add r4, r4, #0x28\n\
+ add r4, r5, r4\n\
+ ldrb r0, [r6, #0x3]\n\
+ lsl r0, r0, #0x1\n\
+ lsl r1, r7, #0x2\n\
+ add r0, r0, r1\n\
+ add r0, r0, sl\n\
+ mov r2, #0x0\n\
+ ldsh r0, [r0, r2]\n\
+ mov r1, #0x15\n\
+ bl __modsi3\n\
+ strh r0, [r4]\n\
+ add r5, r5, r9\n\
+ mov r1, #0x0\n\
+ ldsh r0, [r4, r1]\n\
+ lsl r1, r0, #0x1\n\
+ add r1, r1, r0\n\
+ lsl r1, r1, #0x3\n\
+ mov r2, #0xfc\n\
+ lsl r2, r2, #0x1\n\
+ add r0, r2, #0\n\
+ sub r0, r0, r1\n\
+ strh r0, [r5]\n\
+ mov r1, #0x0\n\
+ ldsh r0, [r5, r1]\n\
+ add r1, r2, #0\n\
+ bl __modsi3\n\
+ strh r0, [r5]\n\
+ add r0, r7, #1\n\
+ lsl r0, r0, #0x18\n\
+ lsr r7, r0, #0x18\n\
+ cmp r7, #0x2\n\
+ bls ._41 @cond_branch\n\
+ bl debug_sub_811B5D0\n\
+ ldr r0, ._43 + 16 @ \n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq ._42 @cond_branch\n\
+ mov r1, r8\n\
+ sub r1, r1, #0x22\n\
+ mov r0, #0xfa\n\
+ lsl r0, r0, #0x2\n\
+ strh r0, [r1, #0xc]\n\
+._42:\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\
+._44:\n\
+ .align 2, 0\n\
+._43:\n\
+ .word +0x2000000\n\
+ .word gSaveBlock1\n\
+ .word 0x494\n\
+ .word gUnknown_083ECCF8\n\
+ .word unk_debug_bss_1_1");
+}
+#else
static void SlotMachineSetup_0_1(void)
{
u8 i;
@@ -397,6 +551,7 @@ static void SlotMachineSetup_0_1(void)
eSlotMachine->unk1C[i] %= 0x1f8;
}
}
+#endif
static void SlotMachineSetup_3_0(void)
{
@@ -441,7 +596,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,7 +626,10 @@ 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)
@@ -523,6 +682,46 @@ static bool8 sub_8101DF4(struct Task *task)
return FALSE;
}
+#if DEBUG
+__attribute__((naked))
+static bool8 sub_8101E10(struct Task *task)
+{
+ asm("\
+ push {lr}\n\
+ mov r0, #0x0\n\
+ bl sub_8104CAC\n\
+ ldr r2, ._70 @ \n\
+ mov r0, #0x5\n\
+ strb r0, [r2]\n\
+ ldr r0, ._70 + 4 @ \n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq ._67 @cond_branch\n\
+ ldr r0, ._70 + 8 @ \n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ bne ._69 @cond_branch\n\
+._67:\n\
+ mov r0, #0xc\n\
+ ldsh r1, [r2, r0]\n\
+ ldr r0, ._70 + 12 @ \n\
+ cmp r1, r0\n\
+ ble ._69 @cond_branch\n\
+ mov r0, #0x17\n\
+ strb r0, [r2]\n\
+._69:\n\
+ mov r0, #0x1\n\
+ pop {r1}\n\
+ bx r1\n\
+._71:\n\
+ .align 2, 0\n\
+._70:\n\
+ .word +0x2000000\n\
+ .word unk_debug_bss_1_1\n\
+ .word unk_debug_bss_1_4\n\
+ .word 0x270e");
+}
+#else
static bool8 sub_8101E10(struct Task *task)
{
sub_8104CAC(0);
@@ -533,7 +732,205 @@ static bool8 sub_8101E10(struct Task *task)
}
return TRUE;
}
+#endif
+#if DEBUG
+__attribute__((naked))
+static bool8 sub_8101E3C(struct Task *task)
+{
+ asm("\
+ push {r4, r5, lr}\n\
+ ldr r0, ._77 @ unk_debug_bss_1_1\n\
+ ldrb r1, [r0]\n\
+ add r3, r0, #0\n\
+ ldr r5, ._77 + 4 @ gMain\n\
+ cmp r1, #0\n\
+ beq ._76 @cond_branch\n\
+ ldr r2, ._77 + 8 @ unk_debug_bss_1_4\n\
+ ldrb r0, [r2]\n\
+ cmp r0, #0\n\
+ beq ._76 @cond_branch\n\
+ ldr r4, ._77 + 12 @ \n\
+ mov r1, #0xc\n\
+ ldsh r0, [r4, r1]\n\
+ cmp r0, #0x3\n\
+ ble ._74 @cond_branch\n\
+ ldrh r1, [r5, #0x2c]\n\
+ mov r0, #0x2\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._75 @cond_branch\n\
+._74:\n\
+ mov r0, #0x0\n\
+ strb r0, [r2]\n\
+ b ._76\n\
+._78:\n\
+ .align 2, 0\n\
+._77:\n\
+ .word unk_debug_bss_1_1\n\
+ .word gMain\n\
+ .word unk_debug_bss_1_4\n\
+ .word +0x2000000\n\
+._75:\n\
+ mov r0, #0x0\n\
+ bl sub_8103D50\n\
+ mov r0, #0x1\n\
+ bl sub_8103D50\n\
+ mov r0, #0x2\n\
+ bl sub_8103D50\n\
+ ldrh r0, [r4, #0xc]\n\
+ sub r0, r0, #0x3\n\
+ strh r0, [r4, #0xc]\n\
+ mov r0, #0x3\n\
+ strh r0, [r4, #0x12]\n\
+ mov r0, #0x9\n\
+ strb r0, [r4]\n\
+ b ._102\n\
+._76:\n\
+ ldrb r0, [r3]\n\
+ cmp r0, #0\n\
+ beq ._81 @cond_branch\n\
+ ldrh r1, [r5, #0x2e]\n\
+ mov r0, #0x8\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._81 @cond_branch\n\
+ bl debug_sub_811B620\n\
+ ldr r1, ._83 @ \n\
+ mov r0, #0x1d\n\
+ strb r0, [r1]\n\
+ b ._102\n\
+._84:\n\
+ .align 2, 0\n\
+._83:\n\
+ .word +0x2000000\n\
+._81:\n\
+ ldrh r1, [r5, #0x2e]\n\
+ mov r0, #0x4\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._85 @cond_branch\n\
+ mov r0, #0x0\n\
+ bl sub_8104AB8\n\
+ ldr r1, ._87 @ \n\
+ mov r0, #0x8\n\
+ strb r0, [r1]\n\
+ b ._102\n\
+._88:\n\
+ .align 2, 0\n\
+._87:\n\
+ .word +0x2000000\n\
+._85:\n\
+ mov r0, #0x80\n\
+ lsl r0, r0, #0x1\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._89 @cond_branch\n\
+ ldr r2, ._94 @ \n\
+ mov r3, #0xc\n\
+ ldsh r0, [r2, r3]\n\
+ sub r0, r0, #0x3\n\
+ mov r3, #0x12\n\
+ ldsh r1, [r2, r3]\n\
+ add r0, r0, r1\n\
+ cmp r0, #0\n\
+ blt ._90 @cond_branch\n\
+ ldrh r4, [r2, #0x12]\n\
+ add r0, r1, #0\n\
+ cmp r0, #0x2\n\
+ bgt ._91 @cond_branch\n\
+._92:\n\
+ lsl r0, r4, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ bl sub_8103D50\n\
+ lsl r0, r4, #0x10\n\
+ mov r2, #0x80\n\
+ lsl r2, r2, #0x9\n\
+ add r0, r0, r2\n\
+ lsr r4, r0, #0x10\n\
+ asr r0, r0, #0x10\n\
+ cmp r0, #0x2\n\
+ ble ._92 @cond_branch\n\
+._91:\n\
+ ldr r1, ._94 @ \n\
+ ldrh r0, [r1, #0xc]\n\
+ sub r0, r0, #0x3\n\
+ ldrh r3, [r1, #0x12]\n\
+ add r0, r0, r3\n\
+ strh r0, [r1, #0xc]\n\
+ mov r0, #0x3\n\
+ strh r0, [r1, #0x12]\n\
+ mov r0, #0x9\n\
+ strb r0, [r1]\n\
+ mov r0, #0x5f\n\
+ bl PlaySE\n\
+ b ._102\n\
+._95:\n\
+ .align 2, 0\n\
+._94:\n\
+ .word +0x2000000\n\
+._90:\n\
+ mov r0, #0x6\n\
+ b ._96\n\
+._89:\n\
+ mov r0, #0x80\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._98 @cond_branch\n\
+ ldr r4, ._103 @ \n\
+ mov r1, #0xc\n\
+ ldsh r0, [r4, r1]\n\
+ cmp r0, #0\n\
+ beq ._98 @cond_branch\n\
+ mov r0, #0x5f\n\
+ bl PlaySE\n\
+ ldrb r0, [r4, #0x12]\n\
+ bl sub_8103D50\n\
+ ldrh r0, [r4, #0xc]\n\
+ sub r0, r0, #0x1\n\
+ strh r0, [r4, #0xc]\n\
+ ldrh r0, [r4, #0x12]\n\
+ add r0, r0, #0x1\n\
+ strh r0, [r4, #0x12]\n\
+._98:\n\
+ ldr r0, ._103 @ \n\
+ mov r2, #0x12\n\
+ ldsh r1, [r0, r2]\n\
+ add r2, r0, #0\n\
+ ldr r5, ._103 + 4 @ \n\
+ cmp r1, #0x2\n\
+ bgt ._99 @cond_branch\n\
+ cmp r1, #0\n\
+ beq ._101 @cond_branch\n\
+ ldrh r1, [r5, #0x2e]\n\
+ mov r0, #0x1\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._101 @cond_branch\n\
+._99:\n\
+ mov r0, #0x9\n\
+ strb r0, [r2]\n\
+._101:\n\
+ ldrh r1, [r5, #0x2e]\n\
+ mov r0, #0x2\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._102 @cond_branch\n\
+ mov r0, #0x15\n\
+._96:\n\
+ strb r0, [r2]\n\
+._102:\n\
+ mov r0, #0x0\n\
+ pop {r4, r5}\n\
+ pop {r1}\n\
+ bx r1\n\
+._104:\n\
+ .align 2, 0\n\
+._103:\n\
+ .word +0x2000000\n\
+ .word gMain");
+}
+#else
static bool8 sub_8101E3C(struct Task *task)
{
s16 i;
@@ -581,6 +978,7 @@ static bool8 sub_8101E3C(struct Task *task)
}
return FALSE;
}
+#endif
static void sub_8101F2C(const u8 *str)
{
@@ -614,6 +1012,71 @@ static bool8 sub_8101F88(struct Task *task)
return FALSE;
}
+#if DEBUG
+__attribute__((naked))
+static bool8 sub_8101FA4(struct Task *task)
+{
+ asm("\
+ push {r4, lr}\n\
+ add r4, r0, #0\n\
+ bl sub_8102484\n\
+ bl sub_8104DA4\n\
+ mov r0, #0x0\n\
+ bl sub_8102DEC\n\
+ mov r0, #0x1\n\
+ bl sub_8102DEC\n\
+ mov r0, #0x2\n\
+ bl sub_8102DEC\n\
+ mov r0, #0x0\n\
+ strh r0, [r4, #0x8]\n\
+ ldr r4, ._115 @ \n\
+ ldrb r1, [r4, #0x4]\n\
+ mov r0, #0x20\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._113 @cond_branch\n\
+ bl sub_810430C\n\
+ mov r0, #0xa\n\
+ b ._114\n\
+._116:\n\
+ .align 2, 0\n\
+._115:\n\
+ .word +0x2000000\n\
+._113:\n\
+ mov r0, #0x1\n\
+ bl sub_8104CAC\n\
+ mov r0, #0xb\n\
+._114:\n\
+ strb r0, [r4]\n\
+ ldr r4, ._119 @ \n\
+ mov r0, #0x8\n\
+ strh r0, [r4, #0x1a]\n\
+ ldrb r0, [r4, #0xa]\n\
+ cmp r0, #0\n\
+ beq ._117 @cond_branch\n\
+ bl dp15_jump_random_unknown\n\
+ strh r0, [r4, #0x1a]\n\
+._117:\n\
+ ldr r0, ._119 + 4 @ \n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq ._118 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x68\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._118:\n\
+ mov r0, #0x0\n\
+ pop {r4}\n\
+ pop {r1}\n\
+ bx r1\n\
+._120:\n\
+ .align 2, 0\n\
+._119:\n\
+ .word +0x2000000\n\
+ .word unk_debug_bss_1_1");
+}
+#else
static bool8 sub_8101FA4(struct Task *task)
{
sub_8102484();
@@ -639,6 +1102,7 @@ static bool8 sub_8101FA4(struct Task *task)
}
return FALSE;
}
+#endif
static bool8 sub_8102008(struct Task *task)
{
@@ -651,6 +1115,52 @@ static bool8 sub_8102008(struct Task *task)
return FALSE;
}
+#if DEBUG
+__attribute__((naked))
+static bool8 sub_8102034(struct Task *task)
+{
+ asm("\
+ push {r4, lr}\n\
+ ldrh r1, [r0, #0x8]\n\
+ add r1, r1, #0x1\n\
+ strh r1, [r0, #0x8]\n\
+ lsl r1, r1, #0x10\n\
+ asr r1, r1, #0x10\n\
+ cmp r1, #0x1d\n\
+ ble ._124 @cond_branch\n\
+ ldr r0, ._127 @ unk_debug_bss_1_1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq ._126 @cond_branch\n\
+ ldr r0, ._127 + 4 @ unk_debug_bss_1_4\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq ._126 @cond_branch\n\
+ ldr r4, ._127 + 8 @ unk_debug_bss_1_8\n\
+ bl Random\n\
+ mov r1, #0x1f\n\
+ and r1, r1, r0\n\
+ add r1, r1, #0x1\n\
+ str r1, [r4]\n\
+._126:\n\
+ bl sub_81024F0\n\
+ ldr r1, ._127 + 12 @ \n\
+ mov r0, #0xc\n\
+ strb r0, [r1]\n\
+._124:\n\
+ mov r0, #0x0\n\
+ pop {r4}\n\
+ pop {r1}\n\
+ bx r1\n\
+._128:\n\
+ .align 2, 0\n\
+._127:\n\
+ .word unk_debug_bss_1_1\n\
+ .word unk_debug_bss_1_4\n\
+ .word unk_debug_bss_1_8\n\
+ .word +0x2000000");
+}
+#else
static bool8 sub_8102034(struct Task *task)
{
if (++task->data[0] >= 30)
@@ -660,7 +1170,77 @@ static bool8 sub_8102034(struct Task *task)
}
return FALSE;
}
+#endif
+#if DEBUG
+__attribute__((naked))
+static bool8 sub_8102058(struct Task *task)
+{
+ asm("\
+ push {r4, r5, lr}\n\
+ ldr r0, ._133 @ unk_debug_bss_1_1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq ._130 @cond_branch\n\
+ ldr r0, ._133 + 4 @ unk_debug_bss_1_4\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq ._130 @cond_branch\n\
+ ldr r5, ._133 + 8 @ unk_debug_bss_1_8\n\
+ ldr r0, [r5]\n\
+ sub r0, r0, #0x1\n\
+ str r0, [r5]\n\
+ cmp r0, #0\n\
+ bne ._135 @cond_branch\n\
+ mov r0, #0x18\n\
+ bl PlaySE\n\
+ ldr r4, ._133 + 12 @ \n\
+ ldrb r0, [r4, #0x18]\n\
+ bl sub_8102E1C\n\
+ ldrb r0, [r4, #0x18]\n\
+ bl sub_8103C14\n\
+ bl Random\n\
+ mov r1, #0x1f\n\
+ and r1, r1, r0\n\
+ add r1, r1, #0x1\n\
+ str r1, [r5]\n\
+ b ._132\n\
+._134:\n\
+ .align 2, 0\n\
+._133:\n\
+ .word unk_debug_bss_1_1\n\
+ .word unk_debug_bss_1_4\n\
+ .word unk_debug_bss_1_8\n\
+ .word +0x2000000\n\
+._130:\n\
+ ldr r0, ._136 @ gMain\n\
+ ldrh r1, [r0, #0x2e]\n\
+ mov r0, #0x1\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._135 @cond_branch\n\
+ mov r0, #0x18\n\
+ bl PlaySE\n\
+ ldr r4, ._136 + 4 @ \n\
+ ldrb r0, [r4, #0x18]\n\
+ bl sub_8102E1C\n\
+ ldrb r0, [r4, #0x18]\n\
+ bl sub_8103C14\n\
+._132:\n\
+ mov r0, #0xd\n\
+ strb r0, [r4]\n\
+._135:\n\
+ mov r0, #0x0\n\
+ pop {r4, r5}\n\
+ pop {r1}\n\
+ bx r1\n\
+._137:\n\
+ .align 2, 0\n\
+._136:\n\
+ .word gMain\n\
+ .word +0x2000000");
+}
+#else
static bool8 sub_8102058(struct Task *task)
{
if (gMain.newKeys & A_BUTTON)
@@ -672,7 +1252,121 @@ static bool8 sub_8102058(struct Task *task)
}
return FALSE;
}
+#endif
+#if DEBUG
+__attribute__((naked))
+static bool8 sub_8102090(struct Task *task)
+{
+ asm("\
+ push {r4, lr}\n\
+ ldr r4, ._146 @ \n\
+ ldrb r0, [r4, #0x18]\n\
+ bl sub_8102E40\n\
+ lsl r0, r0, #0x18\n\
+ lsr r2, r0, #0x18\n\
+ cmp r2, #0\n\
+ bne ._138 @cond_branch\n\
+ ldrh r0, [r4, #0x18]\n\
+ add r0, r0, #0x1\n\
+ strh r0, [r4, #0x18]\n\
+ mov r1, #0xc\n\
+ strb r1, [r4]\n\
+ lsl r0, r0, #0x10\n\
+ asr r0, r0, #0x10\n\
+ cmp r0, #0x2\n\
+ ble ._161 @cond_branch\n\
+ mov r0, #0xe\n\
+ strb r0, [r4]\n\
+ ldr r0, ._146 + 4 @ \n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0x8\n\
+ beq ._140 @cond_branch\n\
+ cmp r0, #0x8\n\
+ bgt ._141 @cond_branch\n\
+ cmp r0, #0x2\n\
+ beq ._142 @cond_branch\n\
+ cmp r0, #0x2\n\
+ bgt ._143 @cond_branch\n\
+ cmp r0, #0x1\n\
+ beq ._144 @cond_branch\n\
+ b ._161\n\
+._147:\n\
+ .align 2, 0\n\
+._146:\n\
+ .word +0x2000000\n\
+ .word unk_debug_bss_1_0\n\
+._143:\n\
+ cmp r0, #0x4\n\
+ beq ._148 @cond_branch\n\
+ b ._161\n\
+._141:\n\
+ cmp r0, #0x40\n\
+ beq ._150 @cond_branch\n\
+ cmp r0, #0x40\n\
+ bgt ._151 @cond_branch\n\
+ cmp r0, #0x10\n\
+ beq ._152 @cond_branch\n\
+ b ._161\n\
+._151:\n\
+ cmp r0, #0x80\n\
+ beq ._154 @cond_branch\n\
+ b ._161\n\
+._142:\n\
+ mov r0, #0x14\n\
+ strh r0, [r4, #0x28]\n\
+ strh r0, [r4, #0x2a]\n\
+ mov r0, #0x12\n\
+ b ._160\n\
+._144:\n\
+ mov r0, #0x14\n\
+ strh r0, [r4, #0x28]\n\
+ strh r0, [r4, #0x2a]\n\
+ mov r0, #0x12\n\
+ b ._160\n\
+._148:\n\
+ mov r0, #0x3\n\
+ strh r0, [r4, #0x28]\n\
+ mov r0, #0x1\n\
+ strh r0, [r4, #0x2a]\n\
+ mov r0, #0x2\n\
+ b ._160\n\
+._140:\n\
+ strh r2, [r4, #0x28]\n\
+ mov r0, #0x2\n\
+ strh r0, [r4, #0x2a]\n\
+ mov r0, #0x3\n\
+ b ._160\n\
+._152:\n\
+ mov r0, #0x2\n\
+ strh r0, [r4, #0x28]\n\
+ mov r0, #0x5\n\
+ strh r0, [r4, #0x2a]\n\
+ mov r0, #0x14\n\
+ b ._160\n\
+._150:\n\
+ mov r0, #0x13\n\
+ strh r0, [r4, #0x28]\n\
+ strh r0, [r4, #0x2a]\n\
+ strh r2, [r4, #0x2c]\n\
+ b ._161\n\
+._154:\n\
+ mov r0, #0x13\n\
+ strh r0, [r4, #0x28]\n\
+ strh r0, [r4, #0x2a]\n\
+._160:\n\
+ strh r0, [r4, #0x2c]\n\
+._161:\n\
+ mov r0, #0x1\n\
+ b ._162\n\
+._138:\n\
+ mov r0, #0x0\n\
+._162:\n\
+ pop {r4}\n\
+ pop {r1}\n\
+ bx r1");
+}
+#else
static bool8 sub_8102090(struct Task *task)
{
if (!sub_8102E40(eSlotMachine->unk18))
@@ -687,8 +1381,169 @@ static bool8 sub_8102090(struct Task *task)
}
return FALSE;
}
+#endif
-static bool8 sub_81020C8(struct Task *task)
+#if DEBUG
+__attribute__((naked))
+bool8 sub_81020C8(struct Task *task)
+{
+ asm("\
+ push {r4, lr}\n\
+ ldr r4, ._165 @ \n\
+ ldrb r1, [r4, #0x4]\n\
+ mov r0, #0xc0\n\
+ and r0, r0, r1\n\
+ strb r0, [r4, #0x4]\n\
+ bl CheckMatch\n\
+ ldrb r0, [r4, #0xa]\n\
+ cmp r0, #0\n\
+ beq ._163 @cond_branch\n\
+ sub r0, r0, #0x1\n\
+ strb r0, [r4, #0xa]\n\
+ ldrb r0, [r4, #0xb]\n\
+ add r0, r0, #0x1\n\
+ strb r0, [r4, #0xb]\n\
+ b ._164\n\
+._166:\n\
+ .align 2, 0\n\
+._165:\n\
+ .word +0x2000000\n\
+._163:\n\
+ bl debug_sub_811B894\n\
+._164:\n\
+ ldr r4, ._171 @ \n\
+ ldrh r0, [r4, #0x8]\n\
+ cmp r0, #0\n\
+ beq ._167 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x6c\n\
+ mov r2, #0xe\n\
+ ldsh r1, [r4, r2]\n\
+ bl debug_sub_811B5B4\n\
+ mov r0, #0xf\n\
+ strb r0, [r4]\n\
+ bl sub_8102A24\n\
+ bl sub_8103F70\n\
+ ldrh r0, [r4, #0x10]\n\
+ ldrh r1, [r4, #0xe]\n\
+ sub r0, r0, r1\n\
+ strh r0, [r4, #0x10]\n\
+ lsl r0, r0, #0x10\n\
+ cmp r0, #0\n\
+ bge ._168 @cond_branch\n\
+ mov r0, #0x0\n\
+ strh r0, [r4, #0x10]\n\
+._168:\n\
+ ldrh r1, [r4, #0x8]\n\
+ mov r0, #0xc0\n\
+ lsl r0, r0, #0x1\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._169 @cond_branch\n\
+ ldr r0, ._171 + 4 @ \n\
+ bl PlayFanfare\n\
+ mov r0, #0x6\n\
+ bl sub_8104CAC\n\
+ b ._174\n\
+._172:\n\
+ .align 2, 0\n\
+._171:\n\
+ .word +0x2000000\n\
+ .word 0x185\n\
+._169:\n\
+ mov r0, #0x40\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._173 @cond_branch\n\
+ ldr r0, ._175 @ 0x185\n\
+ bl PlayFanfare\n\
+ mov r0, #0x5\n\
+ bl sub_8104CAC\n\
+ b ._174\n\
+._176:\n\
+ .align 2, 0\n\
+._175:\n\
+ .word 0x185\n\
+._173:\n\
+ mov r0, #0xc3\n\
+ lsl r0, r0, #0x1\n\
+ bl PlayFanfare\n\
+ mov r0, #0x2\n\
+ bl sub_8104CAC\n\
+._174:\n\
+ ldr r1, ._183 @ \n\
+ ldrh r3, [r1, #0x8]\n\
+ mov r0, #0xe0\n\
+ lsl r0, r0, #0x1\n\
+ and r0, r0, r3\n\
+ add r2, r1, #0\n\
+ cmp r0, #0\n\
+ beq ._179 @cond_branch\n\
+ ldrb r1, [r2, #0x4]\n\
+ mov r0, #0x3f\n\
+ and r0, r0, r1\n\
+ mov r1, #0x0\n\
+ strb r0, [r2, #0x4]\n\
+ mov r0, #0xc0\n\
+ lsl r0, r0, #0x1\n\
+ and r0, r0, r3\n\
+ cmp r0, #0\n\
+ beq ._179 @cond_branch\n\
+ strb r1, [r2, #0xa]\n\
+ strb r1, [r2, #0xb]\n\
+ strb r1, [r2, #0x3]\n\
+ mov r0, #0x80\n\
+ lsl r0, r0, #0x1\n\
+ and r0, r0, r3\n\
+ cmp r0, #0\n\
+ beq ._179 @cond_branch\n\
+ mov r0, #0x1\n\
+ strb r0, [r2, #0x3]\n\
+._179:\n\
+ ldrh r1, [r2, #0x8]\n\
+ mov r0, #0x20\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._185 @cond_branch\n\
+ ldrb r0, [r2, #0x2]\n\
+ cmp r0, #0xf\n\
+ bhi ._185 @cond_branch\n\
+ add r0, r0, #0x1\n\
+ strb r0, [r2, #0x2]\n\
+ ldrb r0, [r2, #0x2]\n\
+ bl sub_8104064\n\
+ b ._185\n\
+._184:\n\
+ .align 2, 0\n\
+._183:\n\
+ .word +0x2000000\n\
+._167:\n\
+ mov r0, #0x3\n\
+ bl sub_8104CAC\n\
+ mov r0, #0x14\n\
+ strb r0, [r4]\n\
+ ldrh r0, [r4, #0x12]\n\
+ ldrh r1, [r4, #0x10]\n\
+ add r0, r0, r1\n\
+ strh r0, [r4, #0x10]\n\
+ lsl r0, r0, #0x10\n\
+ asr r0, r0, #0x10\n\
+ ldr r1, ._186 @ 0x270f\n\
+ cmp r0, r1\n\
+ ble ._185 @cond_branch\n\
+ strh r1, [r4, #0x10]\n\
+._185:\n\
+ mov r0, #0x0\n\
+ pop {r4}\n\
+ pop {r1}\n\
+ bx r1\n\
+._187:\n\
+ .align 2, 0\n\
+._186:\n\
+ .word 0x270f");
+}
+#else
+bool8 sub_81020C8(struct Task *task)
{
eSlotMachine->unk04 &= 0xc0;
CheckMatch();
@@ -752,6 +1607,7 @@ static bool8 sub_81020C8(struct Task *task)
}
return FALSE;
}
+#endif
static bool8 sub_81021E0(struct Task *task)
{
@@ -902,6 +1758,48 @@ static bool8 sub_81023FC(struct Task *task)
return FALSE;
}
+#if DEBUG
+__attribute__((naked))
+static bool8 sub_8102424(struct Task *task)
+{
+ asm("\
+ push {lr}\n\
+ add sp, sp, #0xfffffffc\n\
+ ldr r0, ._234 @ unk_debug_bss_1_1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ bne ._233 @cond_branch\n\
+ ldr r0, ._234 + 4 @ gSaveBlock1\n\
+ ldr r1, ._234 + 8 @ \n\
+ ldrh r1, [r1, #0xc]\n\
+ ldr r2, ._234 + 12 @ \n\
+ add r0, r0, r2\n\
+ strh r1, [r0]\n\
+._233:\n\
+ mov r0, #0x1\n\
+ neg r0, r0\n\
+ mov r1, #0x0\n\
+ str r1, [sp]\n\
+ mov r2, #0x0\n\
+ mov r3, #0x10\n\
+ bl BeginNormalPaletteFade\n\
+ ldr r1, ._234 + 8 @ \n\
+ ldrb r0, [r1]\n\
+ add r0, r0, #0x1\n\
+ strb r0, [r1]\n\
+ mov r0, #0x0\n\
+ add sp, sp, #0x4\n\
+ pop {r1}\n\
+ bx r1\n\
+._235:\n\
+ .align 2, 0\n\
+._234:\n\
+ .word unk_debug_bss_1_1\n\
+ .word gSaveBlock1\n\
+ .word +0x2000000\n\
+ .word 0x494");
+}
+#else
static bool8 sub_8102424(struct Task *task)
{
gSaveBlock1.coins = eSlotMachine->coins;
@@ -909,6 +1807,7 @@ static bool8 sub_8102424(struct Task *task)
eSlotMachine->state++;
return FALSE;
}
+#endif
static bool8 sub_8102460(struct Task *task)
{
@@ -919,6 +1818,272 @@ static bool8 sub_8102460(struct Task *task)
return FALSE;
}
+#if DEBUG
+__attribute__((naked))
+static bool8 debug_sub_8116E74(struct Task *task)
+{
+ asm("\
+ push {lr}\n\
+ bl debug_sub_811B634\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ beq ._239 @cond_branch\n\
+ ldr r1, ._240 @ \n\
+ mov r0, #0x5\n\
+ strb r0, [r1]\n\
+._239:\n\
+ mov r0, #0x0\n\
+ pop {r1}\n\
+ bx r1\n\
+._241:\n\
+ .align 2, 0\n\
+._240:\n\
+ .word +0x2000000");
+}
+#endif
+
+#if DEBUG
+__attribute__((naked))
+static void sub_8102484(void)
+{
+ asm("\
+ push {r4, r5, r6, lr}\n\
+ ldr r0, ._256 @ \n\
+ ldrb r2, [r0, #0xa]\n\
+ add r4, r0, #0\n\
+ cmp r2, #0\n\
+ beq ._242 @cond_branch\n\
+ b ._270\n\
+._242:\n\
+ ldr r0, ._256 + 4 @ \n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq ._245 @cond_branch\n\
+ ldr r3, ._256 + 8 @ \n\
+ ldrb r0, [r3]\n\
+ cmp r0, #0\n\
+ beq ._245 @cond_branch\n\
+ ldr r0, ._256 + 12 @ \n\
+ ldrb r1, [r0]\n\
+ strb r1, [r4, #0x4]\n\
+ strb r2, [r3]\n\
+ strb r2, [r0]\n\
+ mov r0, #0x80\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._246 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x88\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._246:\n\
+ ldrb r1, [r4, #0x4]\n\
+ mov r0, #0x40\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._247 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x84\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._247:\n\
+ ldrb r1, [r4, #0x4]\n\
+ mov r0, #0x20\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._248 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x8c\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._248:\n\
+ ldrb r1, [r4, #0x4]\n\
+ mov r0, #0x10\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._249 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x80\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._249:\n\
+ ldrb r1, [r4, #0x4]\n\
+ mov r0, #0x8\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._250 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x7c\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._250:\n\
+ ldrb r1, [r4, #0x4]\n\
+ mov r0, #0x4\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._251 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x78\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._251:\n\
+ ldrb r1, [r4, #0x4]\n\
+ mov r0, #0x1\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._252 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x74\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._252:\n\
+ ldrb r1, [r4, #0x4]\n\
+ mov r0, #0x2\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ bne ._253 @cond_branch\n\
+ b ._270\n\
+._253:\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x70\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+ b ._270\n\
+._257:\n\
+ .align 2, 0\n\
+._256:\n\
+ .word +0x2000000\n\
+ .word unk_debug_bss_1_1\n\
+ .word unk_debug_bss_1_2\n\
+ .word unk_debug_bss_1_3\n\
+._245:\n\
+ add r5, r4, #0\n\
+ ldrb r1, [r5, #0x4]\n\
+ mov r0, #0xc0\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ bne ._270 @cond_branch\n\
+ bl sub_8102540\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ beq ._260 @cond_branch\n\
+ bl sub_8102578\n\
+ lsl r0, r0, #0x18\n\
+ lsr r6, r0, #0x18\n\
+ cmp r6, #0x3\n\
+ beq ._260 @cond_branch\n\
+ ldr r1, ._271 @ gUnknown_083ECE42\n\
+ lsl r0, r6, #0x1\n\
+ add r0, r0, r1\n\
+ ldrb r1, [r0]\n\
+ ldrb r0, [r5, #0x4]\n\
+ orr r0, r0, r1\n\
+ strb r0, [r5, #0x4]\n\
+ mov r1, #0x80\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._261 @cond_branch\n\
+ add r0, r5, #0\n\
+ add r0, r0, #0x88\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._261:\n\
+ ldrb r1, [r5, #0x4]\n\
+ mov r0, #0x40\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._262 @cond_branch\n\
+ add r0, r5, #0\n\
+ add r0, r0, #0x84\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._262:\n\
+ ldrb r1, [r4, #0x4]\n\
+ mov r0, #0x20\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._263 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x8c\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._263:\n\
+ cmp r6, #0x1\n\
+ bne ._270 @cond_branch\n\
+._260:\n\
+ bl sub_81025BC\n\
+ lsl r0, r0, #0x18\n\
+ lsr r6, r0, #0x18\n\
+ cmp r6, #0x5\n\
+ beq ._270 @cond_branch\n\
+ ldr r4, ._271 + 4 @ \n\
+ ldr r1, ._271 + 8 @ \n\
+ lsl r0, r6, #0x1\n\
+ add r0, r0, r1\n\
+ ldrb r1, [r0]\n\
+ ldrb r0, [r4, #0x4]\n\
+ orr r0, r0, r1\n\
+ strb r0, [r4, #0x4]\n\
+ mov r1, #0x10\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._266 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x80\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._266:\n\
+ ldrb r1, [r4, #0x4]\n\
+ mov r0, #0x8\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._267 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x7c\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._267:\n\
+ ldrb r1, [r4, #0x4]\n\
+ mov r0, #0x4\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._268 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x78\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._268:\n\
+ ldrb r1, [r4, #0x4]\n\
+ mov r0, #0x1\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._269 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x74\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._269:\n\
+ ldrb r1, [r4, #0x4]\n\
+ mov r0, #0x2\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._270 @cond_branch\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x70\n\
+ mov r1, #0x1\n\
+ bl debug_sub_811B5B4\n\
+._270:\n\
+ pop {r4, r5, r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+._272:\n\
+ .align 2, 0\n\
+._271:\n\
+ .word gUnknown_083ECE42\n\
+ .word +0x2000000\n\
+ .word gUnknown_083ECE48");
+}
+#else
static void sub_8102484(void)
{
u8 r3;
@@ -944,6 +2109,7 @@ static void sub_8102484(void)
}
}
}
+#endif
static void sub_81024F0(void)
{
@@ -2854,7 +4020,8 @@ static void sub_8104C5C(void)
static void LoadSlotMachineWheelOverlay(void);
-static void sub_8104CAC(u8 arg0) {
+static void sub_8104CAC(u8 arg0)
+{
u8 i;
struct Task *task;
@@ -2875,9 +4042,7 @@ static void sub_8104CAC(u8 arg0) {
#ifdef GERMAN
if (arg0 == 5 && i <= 2)
- {
gSprites[spriteId].invisible = TRUE;
- }
#endif
}
}
@@ -3949,7 +5114,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;
@@ -3965,7 +5131,1226 @@ static void sub_81065DC(void) {
}
}
-static const u8 sReelSymbols[][21] = {
+#if DEBUG
+__attribute__((naked))
+void debug_sub_811B1C4()
+{
+ asm(
+ " ldr r1, .__1_\n"
+ " ldrb r0, [r1]\n"
+ " mov r3, #0x2\n"
+ " orr r0, r0, r3\n"
+ " strb r0, [r1]\n"
+ " ldr r2, .__1_ + 4\n"
+ " ldrb r1, [r2]\n"
+ " mov r0, #0x2\n"
+ " eor r1, r1, r0\n"
+ " neg r0, r1\n"
+ " orr r0, r0, r1\n"
+ " asr r0, r0, #0x1f\n"
+ " and r0, r0, r3\n"
+ " strb r0, [r2]\n"
+ " bx lr\n"
+ ".__2_:\n"
+ " .align 2, 0\n"
+ ".__1_:\n"
+ " .word unk_debug_bss_1_3\n"
+ " .word unk_debug_bss_1_0\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B1EC()
+{
+ asm(
+ " ldr r2, .__3\n"
+ " ldrb r0, [r2]\n"
+ " mov r1, #0x1\n"
+ " orr r0, r0, r1\n"
+ " strb r0, [r2]\n"
+ " ldr r2, .__3 + 4\n"
+ " ldrb r0, [r2]\n"
+ " mov r1, #0x1\n"
+ " eor r0, r0, r1\n"
+ " neg r0, r0\n"
+ " lsr r0, r0, #0x1f\n"
+ " strb r0, [r2]\n"
+ " bx lr\n"
+ ".__4:\n"
+ " .align 2, 0\n"
+ ".__3:\n"
+ " .word unk_debug_bss_1_3\n"
+ " .word unk_debug_bss_1_0\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B210()
+{
+ asm(
+ " ldr r1, .__5\n"
+ " ldrb r0, [r1]\n"
+ " mov r3, #0x4\n"
+ " orr r0, r0, r3\n"
+ " strb r0, [r1]\n"
+ " ldr r2, .__5 + 4\n"
+ " ldrb r1, [r2]\n"
+ " mov r0, #0x4\n"
+ " eor r1, r1, r0\n"
+ " neg r0, r1\n"
+ " orr r0, r0, r1\n"
+ " asr r0, r0, #0x1f\n"
+ " and r0, r0, r3\n"
+ " strb r0, [r2]\n"
+ " bx lr\n"
+ ".__6:\n"
+ " .align 2, 0\n"
+ ".__5:\n"
+ " .word unk_debug_bss_1_3\n"
+ " .word unk_debug_bss_1_0\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B238()
+{
+ asm(
+ " ldr r1, .__7\n"
+ " ldrb r0, [r1]\n"
+ " mov r3, #0x8\n"
+ " orr r0, r0, r3\n"
+ " strb r0, [r1]\n"
+ " ldr r2, .__7 + 4\n"
+ " ldrb r1, [r2]\n"
+ " mov r0, #0x8\n"
+ " eor r1, r1, r0\n"
+ " neg r0, r1\n"
+ " orr r0, r0, r1\n"
+ " asr r0, r0, #0x1f\n"
+ " and r0, r0, r3\n"
+ " strb r0, [r2]\n"
+ " bx lr\n"
+ ".__8:\n"
+ " .align 2, 0\n"
+ ".__7:\n"
+ " .word unk_debug_bss_1_3\n"
+ " .word unk_debug_bss_1_0\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B260()
+{
+ asm(
+ " ldr r1, .__9\n"
+ " ldrb r0, [r1]\n"
+ " mov r3, #0x10\n"
+ " orr r0, r0, r3\n"
+ " strb r0, [r1]\n"
+ " ldr r2, .__9 + 4\n"
+ " ldrb r1, [r2]\n"
+ " mov r0, #0x10\n"
+ " eor r1, r1, r0\n"
+ " neg r0, r1\n"
+ " orr r0, r0, r1\n"
+ " asr r0, r0, #0x1f\n"
+ " and r0, r0, r3\n"
+ " strb r0, [r2]\n"
+ " bx lr\n"
+ ".__10:\n"
+ " .align 2, 0\n"
+ ".__9:\n"
+ " .word unk_debug_bss_1_3\n"
+ " .word unk_debug_bss_1_0\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B288()
+{
+ asm(
+ " ldr r1, .__11\n"
+ " ldrb r0, [r1]\n"
+ " mov r3, #0x40\n"
+ " orr r0, r0, r3\n"
+ " strb r0, [r1]\n"
+ " ldr r2, .__11 + 4\n"
+ " ldrb r1, [r2]\n"
+ " mov r0, #0x40\n"
+ " eor r1, r1, r0\n"
+ " neg r0, r1\n"
+ " orr r0, r0, r1\n"
+ " asr r0, r0, #0x1f\n"
+ " and r0, r0, r3\n"
+ " strb r0, [r2]\n"
+ " bx lr\n"
+ ".__12:\n"
+ " .align 2, 0\n"
+ ".__11:\n"
+ " .word unk_debug_bss_1_3\n"
+ " .word unk_debug_bss_1_0\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B2B0()
+{
+ asm(
+ " ldr r1, .__13\n"
+ " ldrb r0, [r1]\n"
+ " mov r3, #0x80\n"
+ " orr r0, r0, r3\n"
+ " strb r0, [r1]\n"
+ " ldr r2, .__13 + 4\n"
+ " ldrb r1, [r2]\n"
+ " mov r0, #0x80\n"
+ " eor r1, r1, r0\n"
+ " neg r0, r1\n"
+ " orr r0, r0, r1\n"
+ " asr r0, r0, #0x1f\n"
+ " and r0, r0, r3\n"
+ " strb r0, [r2]\n"
+ " bx lr\n"
+ ".__14:\n"
+ " .align 2, 0\n"
+ ".__13:\n"
+ " .word unk_debug_bss_1_3\n"
+ " .word unk_debug_bss_1_0\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B2D8()
+{
+ asm(
+ " ldr r0, .__15\n"
+ " ldrb r1, [r0]\n"
+ " mov r2, #0x20\n"
+ " orr r1, r1, r2\n"
+ " strb r1, [r0]\n"
+ " bx lr\n"
+ ".__16:\n"
+ " .align 2, 0\n"
+ ".__15:\n"
+ " .word unk_debug_bss_1_3\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B2E8()
+{
+ asm(
+ " push {lr}\n"
+ " add sp, sp, #0xfffffffc\n"
+ " ldr r0, .__17\n"
+ " ldrb r1, [r0, #0x1]\n"
+ " add r1, r1, #0x1\n"
+ " mov r0, sp\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x1\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0x6\n"
+ " mov r2, #0x1\n"
+ " bl Menu_PrintText\n"
+ " add sp, sp, #0x4\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ ".__18:\n"
+ " .align 2, 0\n"
+ ".__17:\n"
+ " .word +0x2000000\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B310()
+{
+ asm(
+ " push {r4, lr}\n"
+ " add sp, sp, #0xfffffff8\n"
+ " ldr r0, .__21\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0x1\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 4\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0x3\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 8\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0x5\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 12\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0x7\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 16\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0x9\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 20\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0xb\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 24\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0xd\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 28\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0xf\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 32\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0x11\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 36\n"
+ " mov r1, #0xf\n"
+ " mov r2, #0x1\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 40\n"
+ " mov r1, #0xf\n"
+ " mov r2, #0x3\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 44\n"
+ " mov r1, #0xf\n"
+ " mov r2, #0x5\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 48\n"
+ " mov r1, #0xf\n"
+ " mov r2, #0x7\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 52\n"
+ " mov r1, #0xf\n"
+ " mov r2, #0x9\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 56\n"
+ " mov r1, #0xf\n"
+ " mov r2, #0xb\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 60\n"
+ " mov r1, #0xf\n"
+ " mov r2, #0xd\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 64\n"
+ " mov r1, #0xf\n"
+ " mov r2, #0xf\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 68\n"
+ " mov r1, #0xf\n"
+ " mov r2, #0x11\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__21 + 72\n"
+ " ldrb r0, [r0, #0x3]\n"
+ " cmp r0, #0\n"
+ " bne .__19 @cond_branch\n"
+ " ldr r0, .__21 + 76\n"
+ " mov r1, #0xa\n"
+ " mov r2, #0x9\n"
+ " bl Menu_PrintText\n"
+ " b .__20\n"
+ ".__22:\n"
+ " .align 2, 0\n"
+ ".__21:\n"
+ " .word Str_841B1C4\n"
+ " .word Str_841B1CB\n"
+ " .word Str_841B1D4\n"
+ " .word Str_841B1DB\n"
+ " .word Str_841B1E2\n"
+ " .word Str_841B1E8\n"
+ " .word Str_841B1F3\n"
+ " .word Str_841B202\n"
+ " .word Str_841B24C\n"
+ " .word Str_841B211\n"
+ " .word Str_841B219\n"
+ " .word Str_841B220\n"
+ " .word Str_841B227\n"
+ " .word Str_841B22E\n"
+ " .word Str_841B235\n"
+ " .word Str_841B23B\n"
+ " .word Str_841B23F\n"
+ " .word Str_841B243\n"
+ " .word +0x2000000\n"
+ " .word Str_841B246\n"
+ ".__19:\n"
+ " ldr r0, .__30\n"
+ " mov r1, #0xa\n"
+ " mov r2, #0x9\n"
+ " bl Menu_PrintText\n"
+ ".__20:\n"
+ " ldr r4, .__30 + 4\n"
+ " ldr r1, [r4, #0x68]\n"
+ " mov r0, sp\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x4\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0xa\n"
+ " mov r2, #0x3\n"
+ " bl Menu_PrintText\n"
+ " ldr r1, [r4, #0x6c]\n"
+ " mov r0, sp\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x4\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0xa\n"
+ " mov r2, #0x5\n"
+ " bl Menu_PrintText\n"
+ " mov r0, #0x10\n"
+ " ldsh r1, [r4, r0]\n"
+ " mov r0, sp\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x4\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0xa\n"
+ " mov r2, #0x7\n"
+ " bl Menu_PrintText\n"
+ " ldr r1, [r4, #0x70]\n"
+ " mov r0, sp\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x4\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0x14\n"
+ " mov r2, #0x3\n"
+ " bl Menu_PrintText\n"
+ " ldr r1, [r4, #0x74]\n"
+ " mov r0, sp\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x4\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0x14\n"
+ " mov r2, #0x5\n"
+ " bl Menu_PrintText\n"
+ " ldr r1, [r4, #0x78]\n"
+ " mov r0, sp\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x4\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0x14\n"
+ " mov r2, #0x7\n"
+ " bl Menu_PrintText\n"
+ " ldr r1, [r4, #0x7c]\n"
+ " mov r0, sp\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x4\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0x14\n"
+ " mov r2, #0x9\n"
+ " bl Menu_PrintText\n"
+ " add r0, r4, #0\n"
+ " add r0, r0, #0x80\n"
+ " ldr r1, [r0]\n"
+ " mov r0, sp\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x4\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0x14\n"
+ " mov r2, #0xb\n"
+ " bl Menu_PrintText\n"
+ " add r0, r4, #0\n"
+ " add r0, r0, #0x84\n"
+ " ldr r1, [r0]\n"
+ " mov r0, sp\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x4\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0x14\n"
+ " mov r2, #0xd\n"
+ " bl Menu_PrintText\n"
+ " add r0, r4, #0\n"
+ " add r0, r0, #0x88\n"
+ " ldr r1, [r0]\n"
+ " mov r0, sp\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x4\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0x14\n"
+ " mov r2, #0xf\n"
+ " bl Menu_PrintText\n"
+ " add r0, r4, #0\n"
+ " add r0, r0, #0x8c\n"
+ " ldr r1, [r0]\n"
+ " mov r0, sp\n"
+ " mov r2, #0x2\n"
+ " mov r3, #0x4\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " mov r0, sp\n"
+ " mov r1, #0x14\n"
+ " mov r2, #0x11\n"
+ " bl Menu_PrintText\n"
+ " ldr r1, .__30 + 8\n"
+ " ldrb r0, [r1]\n"
+ " cmp r0, #0\n"
+ " beq .__23 @cond_branch\n"
+ " mov r2, #0x0\n"
+ " cmp r0, #0x8\n"
+ " beq .__24 @cond_branch\n"
+ " cmp r0, #0x8\n"
+ " bgt .__25 @cond_branch\n"
+ " cmp r0, #0x2\n"
+ " beq .__26 @cond_branch\n"
+ " cmp r0, #0x2\n"
+ " bgt .__27 @cond_branch\n"
+ " cmp r0, #0x1\n"
+ " beq .__28 @cond_branch\n"
+ " b .__45\n"
+ ".__31:\n"
+ " .align 2, 0\n"
+ ".__30:\n"
+ " .word Str_841B249\n"
+ " .word +0x2000000\n"
+ " .word unk_debug_bss_1_0\n"
+ ".__27:\n"
+ " cmp r0, #0x4\n"
+ " beq .__32 @cond_branch\n"
+ " b .__45\n"
+ ".__25:\n"
+ " cmp r0, #0x40\n"
+ " beq .__34 @cond_branch\n"
+ " cmp r0, #0x40\n"
+ " bgt .__35 @cond_branch\n"
+ " cmp r0, #0x10\n"
+ " beq .__36 @cond_branch\n"
+ " b .__45\n"
+ ".__35:\n"
+ " cmp r0, #0x80\n"
+ " beq .__38 @cond_branch\n"
+ " b .__45\n"
+ ".__26:\n"
+ " mov r2, #0x3\n"
+ " b .__45\n"
+ ".__28:\n"
+ " mov r2, #0x5\n"
+ " b .__45\n"
+ ".__32:\n"
+ " mov r2, #0x7\n"
+ " b .__45\n"
+ ".__24:\n"
+ " mov r2, #0x9\n"
+ " b .__45\n"
+ ".__36:\n"
+ " mov r2, #0xb\n"
+ " b .__45\n"
+ ".__34:\n"
+ " mov r2, #0xd\n"
+ " b .__45\n"
+ ".__38:\n"
+ " mov r2, #0xf\n"
+ ".__45:\n"
+ " ldr r0, .__46\n"
+ " mov r1, #0x17\n"
+ " bl Menu_PrintText\n"
+ ".__23:\n"
+ " bl debug_sub_811B2E8\n"
+ " add sp, sp, #0x8\n"
+ " pop {r4}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ ".__47:\n"
+ " .align 2, 0\n"
+ ".__46:\n"
+ " .word Str_841B26D\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B5B4()
+{
+ asm(
+ " push {lr}\n"
+ " add r2, r0, #0\n"
+ " ldr r0, [r2]\n"
+ " add r0, r0, r1\n"
+ " str r0, [r2]\n"
+ " ldr r1, .__49\n"
+ " cmp r0, r1\n"
+ " ble .__48 @cond_branch\n"
+ " str r1, [r2]\n"
+ ".__48:\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ ".__50:\n"
+ " .align 2, 0\n"
+ ".__49:\n"
+ " .word 0x270f\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B5D0()
+{
+ asm(
+ " ldr r0, .__51\n"
+ " mov r1, #0x0\n"
+ " strb r1, [r0]\n"
+ " ldr r0, .__51 + 4\n"
+ " strb r1, [r0]\n"
+ " ldr r0, .__51 + 8\n"
+ " strb r1, [r0]\n"
+ " ldr r0, .__51 + 12\n"
+ " strb r1, [r0]\n"
+ " ldr r2, .__51 + 16\n"
+ " mov r0, #0x0\n"
+ " str r0, [r2, #0x68]\n"
+ " str r0, [r2, #0x6c]\n"
+ " str r0, [r2, #0x70]\n"
+ " str r0, [r2, #0x74]\n"
+ " str r0, [r2, #0x78]\n"
+ " str r0, [r2, #0x7c]\n"
+ " add r1, r2, #0\n"
+ " add r1, r1, #0x80\n"
+ " str r0, [r1]\n"
+ " add r1, r1, #0x4\n"
+ " str r0, [r1]\n"
+ " add r1, r1, #0x4\n"
+ " str r0, [r1]\n"
+ " add r1, r1, #0x4\n"
+ " str r0, [r1]\n"
+ " add r1, r1, #0x4\n"
+ " str r0, [r1]\n"
+ " bx lr\n"
+ ".__52:\n"
+ " .align 2, 0\n"
+ ".__51:\n"
+ " .word unk_debug_bss_1_0\n"
+ " .word unk_debug_bss_1_2\n"
+ " .word unk_debug_bss_1_3\n"
+ " .word unk_debug_bss_1_4\n"
+ " .word +0x2000000\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B620()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r0, .__53\n"
+ " mov r1, #0x0\n"
+ " bl CreateTask\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ ".__54:\n"
+ " .align 2, 0\n"
+ ".__53:\n"
+ " .word debug_sub_811B654+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B634()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r0, .__57\n"
+ " bl FindTaskIdByFunc\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " cmp r0, #0xff\n"
+ " beq .__55 @cond_branch\n"
+ " mov r0, #0x0\n"
+ " b .__56\n"
+ ".__58:\n"
+ " .align 2, 0\n"
+ ".__57:\n"
+ " .word debug_sub_811B654+1\n"
+ ".__55:\n"
+ " mov r0, #0x1\n"
+ ".__56:\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B654()
+{
+ asm(
+ " push {r4, r5, r6, r7, lr}\n"
+ " add sp, sp, #0xfffffff8\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r6, r0, #0x18\n"
+ " lsl r0, r6, #0x2\n"
+ " add r0, r0, r6\n"
+ " lsl r0, r0, #0x3\n"
+ " ldr r1, .__63\n"
+ " add r5, r0, r1\n"
+ " mov r0, #0x8\n"
+ " ldsh r1, [r5, r0]\n"
+ " cmp r1, #0x1\n"
+ " beq .__59 @cond_branch\n"
+ " cmp r1, #0x1\n"
+ " bgt .__60 @cond_branch\n"
+ " cmp r1, #0\n"
+ " beq .__61 @cond_branch\n"
+ " b .__116\n"
+ ".__64:\n"
+ " .align 2, 0\n"
+ ".__63:\n"
+ " .word gTasks\n"
+ ".__60:\n"
+ " cmp r1, #0x2\n"
+ " bne .__65 @cond_branch\n"
+ " b .__66\n"
+ ".__65:\n"
+ " cmp r1, #0x3\n"
+ " bne .__67 @cond_branch\n"
+ " b .__68\n"
+ ".__67:\n"
+ " b .__116\n"
+ ".__61:\n"
+ " mov r0, #0x0\n"
+ " mov r1, #0x0\n"
+ " mov r2, #0x18\n"
+ " mov r3, #0x13\n"
+ " bl Menu_DrawStdWindowFrame\n"
+ " bl debug_sub_811B310\n"
+ " ldrh r0, [r5, #0x8]\n"
+ " add r0, r0, #0x1\n"
+ " strh r0, [r5, #0x8]\n"
+ " b .__116\n"
+ ".__59:\n"
+ " ldr r7, .__76\n"
+ " ldrh r2, [r7, #0x2e]\n"
+ " mov r0, #0x2\n"
+ " and r0, r0, r2\n"
+ " cmp r0, #0\n"
+ " beq .__71 @cond_branch\n"
+ " b .__94\n"
+ ".__71:\n"
+ " mov r0, #0x20\n"
+ " and r0, r0, r2\n"
+ " lsl r0, r0, #0x10\n"
+ " lsr r3, r0, #0x10\n"
+ " cmp r3, #0\n"
+ " beq .__73 @cond_branch\n"
+ " ldr r1, .__76 + 4\n"
+ " ldrb r0, [r1, #0x1]\n"
+ " sub r0, r0, #0x1\n"
+ " strb r0, [r1, #0x1]\n"
+ " lsl r0, r0, #0x18\n"
+ " cmp r0, #0\n"
+ " bge .__79 @cond_branch\n"
+ " mov r0, #0x5\n"
+ " strb r0, [r1, #0x1]\n"
+ " b .__79\n"
+ ".__77:\n"
+ " .align 2, 0\n"
+ ".__76:\n"
+ " .word gMain\n"
+ " .word +0x2000000\n"
+ ".__73:\n"
+ " mov r0, #0x10\n"
+ " and r0, r0, r2\n"
+ " cmp r0, #0\n"
+ " beq .__78 @cond_branch\n"
+ " ldr r1, .__81\n"
+ " ldrb r0, [r1, #0x1]\n"
+ " add r0, r0, #0x1\n"
+ " strb r0, [r1, #0x1]\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " cmp r0, #0x5\n"
+ " bls .__79 @cond_branch\n"
+ " strb r3, [r1, #0x1]\n"
+ ".__79:\n"
+ " bl debug_sub_811B2E8\n"
+ " b .__116\n"
+ ".__82:\n"
+ " .align 2, 0\n"
+ ".__81:\n"
+ " .word +0x2000000\n"
+ ".__78:\n"
+ " and r1, r1, r2\n"
+ " lsl r0, r1, #0x10\n"
+ " lsr r4, r0, #0x10\n"
+ " cmp r4, #0\n"
+ " beq .__83 @cond_branch\n"
+ " mov r0, #0x3\n"
+ " strh r0, [r5, #0x8]\n"
+ " bl Menu_EraseScreen\n"
+ " mov r0, #0x0\n"
+ " mov r1, #0x0\n"
+ " mov r2, #0x9\n"
+ " mov r3, #0x5\n"
+ " bl Menu_DrawStdWindowFrame\n"
+ " ldr r0, .__85\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0x1\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__85 + 4\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0x3\n"
+ " bl Menu_PrintText\n"
+ " b .__116\n"
+ ".__86:\n"
+ " .align 2, 0\n"
+ ".__85:\n"
+ " .word Str_841B25C\n"
+ " .word Str_841B264\n"
+ ".__83:\n"
+ " mov r0, #0x4\n"
+ " and r0, r0, r2\n"
+ " cmp r0, #0\n"
+ " beq .__87 @cond_branch\n"
+ " ldr r0, .__91\n"
+ " strb r4, [r0]\n"
+ " ldr r0, .__91 + 4\n"
+ " strb r4, [r0]\n"
+ " bl Menu_EraseScreen\n"
+ " mov r0, #0x0\n"
+ " mov r1, #0x0\n"
+ " mov r2, #0xa\n"
+ " mov r3, #0x13\n"
+ " bl Menu_DrawStdWindowFrame\n"
+ " ldr r0, .__91 + 8\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0x1\n"
+ " bl Menu_PrintText\n"
+ " ldr r3, .__91 + 12\n"
+ " mov r0, #0x2\n"
+ " mov r1, #0x3\n"
+ " mov r2, #0x8\n"
+ " bl Menu_PrintItems\n"
+ " str r4, [sp]\n"
+ " mov r0, #0x9\n"
+ " str r0, [sp, #0x4]\n"
+ " mov r0, #0x0\n"
+ " mov r1, #0x1\n"
+ " mov r2, #0x3\n"
+ " mov r3, #0x8\n"
+ " bl InitMenu\n"
+ " ldrh r0, [r5, #0x8]\n"
+ " add r0, r0, #0x1\n"
+ " strh r0, [r5, #0x8]\n"
+ ".__87:\n"
+ " ldrh r1, [r7, #0x2e]\n"
+ " mov r0, #0x8\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " bne .__88 @cond_branch\n"
+ " b .__116\n"
+ ".__88:\n"
+ " ldr r1, .__91 + 16\n"
+ " mov r0, #0x1\n"
+ " strb r0, [r1]\n"
+ " b .__94\n"
+ ".__92:\n"
+ " .align 2, 0\n"
+ ".__91:\n"
+ " .word unk_debug_bss_1_2\n"
+ " .word unk_debug_bss_1_3\n"
+ " .word Str_841B254\n"
+ " .word _841B270\n"
+ " .word unk_debug_bss_1_4\n"
+ ".__66:\n"
+ " bl Menu_ProcessInput\n"
+ " lsl r0, r0, #0x18\n"
+ " asr r2, r0, #0x18\n"
+ " mov r0, #0x2\n"
+ " neg r0, r0\n"
+ " cmp r2, r0\n"
+ " beq .__116 @cond_branch\n"
+ " add r0, r0, #0x1\n"
+ " cmp r2, r0\n"
+ " beq .__94 @cond_branch\n"
+ " ldr r1, .__96\n"
+ " mov r0, #0x1\n"
+ " strb r0, [r1]\n"
+ " ldr r0, .__96 + 4\n"
+ " lsl r1, r2, #0x3\n"
+ " add r0, r0, #0x4\n"
+ " add r1, r1, r0\n"
+ " ldr r0, [r1]\n"
+ " bl _call_via_r0\n"
+ ".__94:\n"
+ " bl Menu_EraseScreen\n"
+ " add r0, r6, #0\n"
+ " bl DestroyTask\n"
+ " b .__116\n"
+ ".__97:\n"
+ " .align 2, 0\n"
+ ".__96:\n"
+ " .word unk_debug_bss_1_2\n"
+ " .word _841B270\n"
+ ".__68:\n"
+ " ldr r2, .__100\n"
+ " ldrh r1, [r2, #0x30]\n"
+ " mov r0, #0x80\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq .__98 @cond_branch\n"
+ " ldr r2, .__100 + 4\n"
+ " ldrh r0, [r2, #0xc]\n"
+ " add r0, r0, #0x64\n"
+ " b .__99\n"
+ ".__101:\n"
+ " .align 2, 0\n"
+ ".__100:\n"
+ " .word gMain\n"
+ " .word +0x2000000\n"
+ ".__98:\n"
+ " mov r0, #0x40\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq .__102 @cond_branch\n"
+ " ldr r1, .__104\n"
+ " ldrh r0, [r1, #0xc]\n"
+ " sub r0, r0, #0x64\n"
+ " b .__103\n"
+ ".__105:\n"
+ " .align 2, 0\n"
+ ".__104:\n"
+ " .word +0x2000000\n"
+ ".__102:\n"
+ " mov r0, #0x20\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq .__106 @cond_branch\n"
+ " ldr r1, .__109\n"
+ " ldr r2, .__109 + 4\n"
+ " add r0, r2, #0\n"
+ " ldrh r2, [r1, #0xc]\n"
+ " add r0, r0, r2\n"
+ ".__103:\n"
+ " strh r0, [r1, #0xc]\n"
+ " lsl r0, r0, #0x10\n"
+ " cmp r0, #0\n"
+ " bgt .__116 @cond_branch\n"
+ " ldr r0, .__109 + 8\n"
+ " strh r0, [r1, #0xc]\n"
+ " b .__116\n"
+ ".__110:\n"
+ " .align 2, 0\n"
+ ".__109:\n"
+ " .word +0x2000000\n"
+ " .word 0xfffffc18\n"
+ " .word 0x270f\n"
+ ".__106:\n"
+ " mov r0, #0x10\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq .__111 @cond_branch\n"
+ " ldr r2, .__114\n"
+ " mov r1, #0xfa\n"
+ " lsl r1, r1, #0x2\n"
+ " add r0, r1, #0\n"
+ " ldrh r1, [r2, #0xc]\n"
+ " add r0, r0, r1\n"
+ ".__99:\n"
+ " strh r0, [r2, #0xc]\n"
+ " lsl r0, r0, #0x10\n"
+ " asr r0, r0, #0x10\n"
+ " ldr r1, .__114 + 4\n"
+ " cmp r0, r1\n"
+ " ble .__116 @cond_branch\n"
+ " strh r1, [r2, #0xc]\n"
+ " b .__116\n"
+ ".__115:\n"
+ " .align 2, 0\n"
+ ".__114:\n"
+ " .word +0x2000000\n"
+ " .word 0x270f\n"
+ ".__111:\n"
+ " ldrh r1, [r2, #0x2e]\n"
+ " mov r0, #0x2\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq .__116 @cond_branch\n"
+ " bl Menu_EraseScreen\n"
+ " add r0, r6, #0\n"
+ " bl DestroyTask\n"
+ ".__116:\n"
+ " add sp, sp, #0x8\n"
+ " pop {r4, r5, r6, r7}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_811B894()
+{
+ 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"
+ " ldr r1, .__122\n"
+ " ldrh r2, [r1, #0x8]\n"
+ " mov r0, #0xc0\n"
+ " lsl r0, r0, #0x1\n"
+ " and r0, r0, r2\n"
+ " add r4, r1, #0\n"
+ " cmp r0, #0\n"
+ " beq .__117 @cond_branch\n"
+ " add r1, r1, #0x90\n"
+ " ldr r0, [r1]\n"
+ " add r0, r0, #0x1\n"
+ " str r0, [r1]\n"
+ " ldr r2, .__122 + 4\n"
+ " cmp r0, r2\n"
+ " ble .__118 @cond_branch\n"
+ " str r2, [r1]\n"
+ ".__118:\n"
+ " add r0, r4, #0\n"
+ " add r0, r0, #0x88\n"
+ " ldr r1, [r1]\n"
+ " ldr r0, [r0]\n"
+ " cmp r1, r0\n"
+ " beq .__119 @cond_branch\n"
+ " ldr r0, .__122 + 8\n"
+ " mov r1, #0x4\n"
+ " mov r2, #0xf\n"
+ " bl Menu_PrintText\n"
+ " ldr r1, .__122 + 12\n"
+ " mov r0, #0x0\n"
+ " strb r0, [r1]\n"
+ ".__119:\n"
+ " ldrb r1, [r4, #0x4]\n"
+ " mov r0, #0x80\n"
+ " and r0, r0, r1\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r4, r0, #0x18\n"
+ " cmp r4, #0\n"
+ " bne .__126 @cond_branch\n"
+ " ldr r0, .__122 + 16\n"
+ " mov r1, #0x4\n"
+ " mov r2, #0x11\n"
+ " b .__121\n"
+ ".__123:\n"
+ " .align 2, 0\n"
+ ".__122:\n"
+ " .word +0x2000000\n"
+ " .word 0x270f\n"
+ " .word Str_841B2B0\n"
+ " .word unk_debug_bss_1_4\n"
+ " .word Str_841B2D3\n"
+ ".__117:\n"
+ " lsl r0, r2, #0x10\n"
+ " cmp r0, #0\n"
+ " beq .__127 @cond_branch\n"
+ " ldrb r1, [r4, #0x4]\n"
+ " mov r0, #0x80\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq .__126 @cond_branch\n"
+ " mov r4, #0x3\n"
+ " and r4, r4, r2\n"
+ " cmp r4, #0\n"
+ " bne .__126 @cond_branch\n"
+ " ldr r0, .__163\n"
+ " mov r1, #0x4\n"
+ " mov r2, #0x2\n"
+ ".__121:\n"
+ " bl Menu_PrintText\n"
+ " ldr r0, .__163 + 4\n"
+ " strb r4, [r0]\n"
+ ".__126:\n"
+ " ldr r0, .__163 + 8\n"
+ " ldrh r1, [r0, #0x8]\n"
+ " add r4, r0, #0\n"
+ " cmp r1, #0\n"
+ " beq .__127 @cond_branch\n"
+ " b .__162\n"
+ ".__127:\n"
+ " mov r1, #0x12\n"
+ " ldsh r0, [r4, r1]\n"
+ " cmp r0, #0x3\n"
+ " beq .__129 @cond_branch\n"
+ " b .__162\n"
+ ".__129:\n"
+ " ldrb r1, [r4, #0x4]\n"
+ " mov r0, #0x80\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq .__131 @cond_branch\n"
+ " b .__162\n"
+ ".__131:\n"
+ " mov r0, #0x0\n"
+ " mov r1, #0x1\n"
+ " bl GetTagOfReelSymbolOnScreenAtPos\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r7, r0, #0x18\n"
+ " mov r0, #0x0\n"
+ " mov r1, #0x2\n"
+ " bl GetTagOfReelSymbolOnScreenAtPos\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " str r0, [sp]\n"
+ " mov r0, #0x0\n"
+ " mov r1, #0x3\n"
+ " bl GetTagOfReelSymbolOnScreenAtPos\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r6, r0, #0x18\n"
+ " mov r0, #0x1\n"
+ " mov r1, #0x1\n"
+ " bl GetTagOfReelSymbolOnScreenAtPos\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " mov r9, r0\n"
+ " mov r0, #0x1\n"
+ " mov r1, #0x2\n"
+ " bl GetTagOfReelSymbolOnScreenAtPos\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r4, r0, #0x18\n"
+ " mov r0, #0x1\n"
+ " mov r1, #0x3\n"
+ " bl GetTagOfReelSymbolOnScreenAtPos\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " mov sl, r0\n"
+ " mov r0, #0x2\n"
+ " mov r1, #0x1\n"
+ " bl GetTagOfReelSymbolOnScreenAtPos\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r5, r0, #0x18\n"
+ " mov r0, #0x2\n"
+ " mov r1, #0x2\n"
+ " bl GetTagOfReelSymbolOnScreenAtPos\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " mov r8, r0\n"
+ " mov r0, #0x2\n"
+ " mov r1, #0x3\n"
+ " bl GetTagOfReelSymbolOnScreenAtPos\n"
+ " lsl r0, r0, #0x18\n"
+ " lsr r0, r0, #0x18\n"
+ " cmp r7, #0\n"
+ " bne .__134 @cond_branch\n"
+ " mov r1, r9\n"
+ " cmp r1, #0x1\n"
+ " bne .__134 @cond_branch\n"
+ " cmp r5, #0\n"
+ " beq .__159 @cond_branch\n"
+ ".__134:\n"
+ " ldr r1, [sp]\n"
+ " cmp r1, #0\n"
+ " bne .__137 @cond_branch\n"
+ " cmp r4, #0x1\n"
+ " bne .__137 @cond_branch\n"
+ " mov r1, r8\n"
+ " cmp r1, #0\n"
+ " beq .__159 @cond_branch\n"
+ ".__137:\n"
+ " cmp r6, #0\n"
+ " bne .__140 @cond_branch\n"
+ " mov r1, sl\n"
+ " cmp r1, #0x1\n"
+ " bne .__140 @cond_branch\n"
+ " cmp r0, #0\n"
+ " beq .__159 @cond_branch\n"
+ ".__140:\n"
+ " cmp r7, #0\n"
+ " bne .__143 @cond_branch\n"
+ " cmp r4, #0x1\n"
+ " bne .__143 @cond_branch\n"
+ " cmp r0, #0\n"
+ " beq .__159 @cond_branch\n"
+ ".__143:\n"
+ " cmp r6, #0\n"
+ " bne .__146 @cond_branch\n"
+ " cmp r4, #0x1\n"
+ " bne .__146 @cond_branch\n"
+ " cmp r5, #0\n"
+ " beq .__159 @cond_branch\n"
+ ".__146:\n"
+ " cmp r7, #0x1\n"
+ " bne .__149 @cond_branch\n"
+ " mov r1, r9\n"
+ " cmp r1, #0\n"
+ " bne .__149 @cond_branch\n"
+ " cmp r5, #0x1\n"
+ " beq .__159 @cond_branch\n"
+ ".__149:\n"
+ " ldr r1, [sp]\n"
+ " cmp r1, #0x1\n"
+ " bne .__152 @cond_branch\n"
+ " cmp r4, #0\n"
+ " bne .__152 @cond_branch\n"
+ " mov r1, r8\n"
+ " cmp r1, #0x1\n"
+ " beq .__159 @cond_branch\n"
+ ".__152:\n"
+ " cmp r6, #0x1\n"
+ " bne .__155 @cond_branch\n"
+ " mov r1, sl\n"
+ " cmp r1, #0\n"
+ " bne .__155 @cond_branch\n"
+ " cmp r0, #0x1\n"
+ " beq .__159 @cond_branch\n"
+ ".__155:\n"
+ " cmp r7, #0x1\n"
+ " bne .__158 @cond_branch\n"
+ " cmp r4, #0\n"
+ " bne .__158 @cond_branch\n"
+ " cmp r0, #0x1\n"
+ " beq .__159 @cond_branch\n"
+ ".__158:\n"
+ " cmp r6, #0x1\n"
+ " bne .__162 @cond_branch\n"
+ " cmp r4, #0\n"
+ " bne .__162 @cond_branch\n"
+ " cmp r5, #0x1\n"
+ " bne .__162 @cond_branch\n"
+ ".__159:\n"
+ " ldr r0, .__163 + 12\n"
+ " mov r1, #0x4\n"
+ " mov r2, #0x0\n"
+ " bl Menu_PrintText\n"
+ " ldr r1, .__163 + 4\n"
+ " mov r0, #0x0\n"
+ " strb r0, [r1]\n"
+ ".__162:\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"
+ ".__164:\n"
+ " .align 2, 0\n"
+ ".__163:\n"
+ " .word Str_841B2E4\n"
+ " .word unk_debug_bss_1_4\n"
+ " .word +0x2000000\n"
+ " .word Str_841B2BF\n"
+ "\n"
+ );
+}
+#endif
+
+static const u8 sReelSymbols[][21] =
+{
{
SLOT_MACHINE_TAG_7_RED,
SLOT_MACHINE_TAG_CHERRY,
@@ -5394,3 +7779,50 @@ 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
+
+const u8 Str_841B1C4[] = _("SETTEI");
+const u8 Str_841B1CB[] = _("MAWASITA");
+const u8 Str_841B1D4[] = _("MODOSI");
+const u8 Str_841B1DB[] = _("NOMARE");
+const u8 Str_841B1E2[] = _("MAE 7");
+const u8 Str_841B1E8[] = _("LR  HENKOU");
+const u8 Str_841B1F3[] = _("START  JIDOUSU");
+const u8 Str_841B202[] = _("SELECT  SETTEI");
+const u8 Str_841B211[] = _("TYUHSEN");
+const u8 Str_841B219[] = _("CHERRY");
+const u8 Str_841B220[] = _("REPLAY");
+const u8 Str_841B227[] = _("HASUBO");
+const u8 Str_841B22E[] = _("RURIRI");
+const u8 Str_841B235[] = _("INAZU");
+const u8 Str_841B23B[] = _("REG");
+const u8 Str_841B23F[] = _("BIG");
+const u8 Str_841B243[] = _("BD");
+const u8 Str_841B246[] = _("R7");
+const u8 Str_841B249[] = _("B7");
+const u8 Str_841B24C[] = _("A  COIN");
+const u8 Str_841B254[] = _("TYUHSEN");
+const u8 Str_841B25C[] = _("UD  100");
+const u8 Str_841B264[] = _("LR  1000");
+const u8 Str_841B26D[] = _("×");
+
+// Is this MenuAction2? I'm not sure.
+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},
+};
+
+const u8 Str_841B2B0[] = _("·カウントエラーがおきました");
+const u8 Str_841B2BF[] = _("·リールそうさで エラーが おきました");
+const u8 Str_841B2D3[] = _("·フラグオフエラーが おきました");
+const u8 Str_841B2E4[] = _("·ボーナスこやくの エラーが おきました");
+
+#endif
diff --git a/src/field/start_menu.c b/src/field/start_menu.c
index 161b5d6a0..75b600da0 100644
--- a/src/field/start_menu.c
+++ b/src/field/start_menu.c
@@ -43,6 +43,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;
@@ -131,6 +136,304 @@ static bool32 sub_80719FC(u8 *ptr);
static void sub_8071B54(void);
static void Task_8071B64(u8 taskId);
+#if DEBUG
+__attribute__((naked))
+void debug_sub_8075C30()
+{
+ asm(
+ " push {lr}\n"
+ " bl CloseMenu\n"
+ " bl debug_sub_8075D9C\n"
+ " mov r0, #0x1\n"
+ " pop {r1}\n"
+ " bx r1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_8075C40()
+{
+ 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"
+ " lsl r0, r0, #0x18\n"
+ " lsr r4, r0, #0x18\n"
+ " lsl r0, r4, #0x2\n"
+ " add r0, r0, r4\n"
+ " lsl r0, r0, #0x3\n"
+ " ldr r1, ._5 @ gTasks\n"
+ " add r5, r0, r1\n"
+ " mov r1, #0x0\n"
+ " ldsh r0, [r5, r1]\n"
+ " cmp r0, #0x1\n"
+ " beq ._1 @cond_branch\n"
+ " cmp r0, #0x1\n"
+ " bgt ._2 @cond_branch\n"
+ " cmp r0, #0\n"
+ " beq ._3 @cond_branch\n"
+ " b ._18\n"
+ "._6:\n"
+ " .align 2, 0\n"
+ "._5:\n"
+ " .word gTasks+0x8\n"
+ "._2:\n"
+ " cmp r0, #0x2\n"
+ " beq ._7 @cond_branch\n"
+ " cmp r0, #0x3\n"
+ " beq ._8 @cond_branch\n"
+ " b ._18\n"
+ "._3:\n"
+ " bl m4aSoundVSyncOff\n"
+ " b ._12\n"
+ "._1:\n"
+ " ldr r1, ._13 @ 0x4000208\n"
+ " ldrh r0, [r1]\n"
+ " mov sl, r0\n"
+ " mov r0, #0x0\n"
+ " strh r0, [r1]\n"
+ " ldr r1, ._13 + 4 @ 0x4000108\n"
+ " strh r0, [r1]\n"
+ " mov r0, #0x83\n"
+ " lsl r0, r0, #0x10\n"
+ " str r0, [r1]\n"
+ " ldr r4, ._13 + 8 @ 0xc34f\n"
+ " mov r9, r4\n"
+ " ldr r2, ._13 + 12 @ 0x40000b0\n"
+ " ldr r0, ._13 + 16 @ gScanlineEffectRegBuffers\n"
+ " mov ip, r0\n"
+ " ldr r1, ._13 + 20 @ 0xc5ff\n"
+ " mov r8, r1\n"
+ " ldr r7, ._13 + 24 @ 0x7fff\n"
+ " mov r3, r9\n"
+ " add r3, r3, #0x1\n"
+ " ldr r6, ._13 + 28 @ 0x4000040\n"
+ " ldr r4, ._13 + 32 @ 0xa2600001\n"
+ "._11:\n"
+ " mov r0, ip\n"
+ " str r0, [r2]\n"
+ " str r6, [r2, #0x4]\n"
+ " str r4, [r2, #0x8]\n"
+ " ldr r0, [r2, #0x8]\n"
+ " ldrh r1, [r2, #0xa]\n"
+ " mov r0, r8\n"
+ " and r0, r0, r1\n"
+ " strh r0, [r2, #0xa]\n"
+ " ldrh r1, [r2, #0xa]\n"
+ " add r0, r7, #0\n"
+ " and r0, r0, r1\n"
+ " strh r0, [r2, #0xa]\n"
+ " ldrh r0, [r2, #0xa]\n"
+ " sub r3, r3, #0x1\n"
+ " cmp r3, #0\n"
+ " bne ._11 @cond_branch\n"
+ " mov r3, r9\n"
+ " add r3, r3, #0x1\n"
+ " ldr r0, ._13 + 36 @ 0x400010a\n"
+ " mov r2, #0x0\n"
+ " strh r2, [r0]\n"
+ " ldr r1, ._13 + 4 @ 0x4000108\n"
+ " ldrh r0, [r1]\n"
+ " ldr r4, ._13 + 40 @ _debugStartMenu_0\n"
+ " str r0, [r4]\n"
+ " strh r2, [r1]\n"
+ " ldr r0, ._13 @ 0x4000208\n"
+ " mov r1, sl\n"
+ " strh r1, [r0]\n"
+ " ldr r4, ._13 + 44 @ _debugStartMenu_1\n"
+ " str r3, [r4]\n"
+ " bl m4aSoundVSyncOn\n"
+ " b ._12\n"
+ "._14:\n"
+ " .align 2, 0\n"
+ "._13:\n"
+ " .word 0x4000208\n"
+ " .word 0x4000108\n"
+ " .word 0xc34f\n"
+ " .word 0x40000b0\n"
+ " .word gScanlineEffectRegBuffers\n"
+ " .word 0xc5ff\n"
+ " .word 0x7fff\n"
+ " .word 0x4000040\n"
+ " .word 0xa2600001\n"
+ " .word 0x400010a\n"
+ " .word _debugStartMenu_0\n"
+ " .word _debugStartMenu_1\n"
+ "._7:\n"
+ " mov r0, #0x15\n"
+ " bl PlaySE\n"
+ " ldr r0, ._16 @ gStringVar1\n"
+ " ldr r1, ._16 + 4 @ _debugStartMenu_1\n"
+ " ldr r1, [r1]\n"
+ " mov r2, #0x1\n"
+ " mov r3, #0x8\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " ldr r0, ._16 + 8 @ gStringVar2\n"
+ " ldr r1, ._16 + 12 @ _debugStartMenu_0\n"
+ " ldr r1, [r1]\n"
+ " mov r2, #0x1\n"
+ " mov r3, #0x8\n"
+ " bl ConvertIntToDecimalStringN\n"
+ " bl Menu_DisplayDialogueFrame\n"
+ " ldr r0, ._16 + 16 @ gUnknown_Debug_839B6D8\n"
+ " mov r1, #0x2\n"
+ " mov r2, #0xf\n"
+ " bl Menu_PrintText\n"
+ "._12:\n"
+ " ldrh r0, [r5]\n"
+ " add r0, r0, #0x1\n"
+ " strh r0, [r5]\n"
+ " b ._18\n"
+ "._17:\n"
+ " .align 2, 0\n"
+ "._16:\n"
+ " .word gStringVar1\n"
+ " .word _debugStartMenu_1\n"
+ " .word gStringVar2\n"
+ " .word _debugStartMenu_0\n"
+ " .word gUnknown_Debug_839B6D8\n"
+ "._8:\n"
+ " ldr r0, ._19 @ gMain\n"
+ " ldrh r1, [r0, #0x2e]\n"
+ " mov r0, #0x1\n"
+ " and r0, r0, r1\n"
+ " cmp r0, #0\n"
+ " beq ._18 @cond_branch\n"
+ " bl Menu_EraseScreen\n"
+ " bl ScriptContext2_Disable\n"
+ " add r0, r4, #0\n"
+ " bl DestroyTask\n"
+ "._18:\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"
+ "._20:\n"
+ " .align 2, 0\n"
+ "._19:\n"
+ " .word gMain\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_8075D9C()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r0, ._21 @ debug_sub_8075C40\n"
+ " mov r1, #0xa\n"
+ " bl CreateTask\n"
+ " bl ScriptContext2_Enable\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._22:\n"
+ " .align 2, 0\n"
+ "._21:\n"
+ " .word debug_sub_8075C40+1\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void debug_sub_8075DB4()
+{
+ asm(
+ " push {r4, r5, r6, lr}\n"
+ " add r6, r0, #0\n"
+ " add r5, r1, #0\n"
+ " add r4, r2, #0\n"
+ " add r0, r4, #0\n"
+ " mov r1, #0x4d\n"
+ " bl __umodsi3\n"
+ " strb r0, [r6, #0x1]\n"
+ " add r1, r6, #0\n"
+ " add r1, r1, #0xc\n"
+ " add r0, r4, #0\n"
+ " bl write_word_to_mem\n"
+ " add r0, r6, #4\n"
+ " add r1, r5, #0\n"
+ " bl StringCopy8\n"
+ " mov r3, #0x7\n"
+ " mov r4, #0x0\n"
+ " ldr r0, ._25 @ gSaveBlock1\n"
+ " ldr r1, ._25 + 4 @ 0x2b28\n"
+ " add r5, r0, r1\n"
+ " add r2, r6, #0\n"
+ " add r2, r2, #0x10\n"
+ " add r1, r6, #0\n"
+ " add r1, r1, #0x1c\n"
+ "._23:\n"
+ " ldrh r0, [r5]\n"
+ " strh r0, [r2]\n"
+ " strh r3, [r1]\n"
+ " add r0, r3, #6\n"
+ " strh r0, [r1, #0xc]\n"
+ " add r3, r3, #0x1\n"
+ " add r5, r5, #0x2\n"
+ " add r2, r2, #0x2\n"
+ " add r1, r1, #0x2\n"
+ " add r4, r4, #0x1\n"
+ " cmp r4, #0x5\n"
+ " ble ._23 @cond_branch\n"
+ " mov r4, #0x0\n"
+ "._24:\n"
+ " mov r0, #0x64\n"
+ " mul r0, r0, r4\n"
+ " ldr r1, ._25 + 8 @ gPlayerParty\n"
+ " add r0, r0, r1\n"
+ " mov r1, #0x2c\n"
+ " mul r1, r1, r4\n"
+ " add r1, r1, #0x34\n"
+ " add r1, r6, r1\n"
+ " bl sub_803AF78\n"
+ " add r4, r4, #0x1\n"
+ " cmp r4, #0x2\n"
+ " ble ._24 @cond_branch\n"
+ " add r0, r6, #0\n"
+ " bl SetEReaderTrainerChecksum\n"
+ " pop {r4, r5, r6}\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._26:\n"
+ " .align 2, 0\n"
+ "._25:\n"
+ " .word gSaveBlock1\n"
+ " .word 0x2b28\n"
+ " .word gPlayerParty\n"
+ "\n"
+ );
+}
+
+__attribute__((naked))
+void unref_sub_8070F90()
+{
+ asm(
+ " push {lr}\n"
+ " ldr r0, ._27 @ 0x801\n"
+ " bl FlagSet\n"
+ " mov r0, #0x80\n"
+ " lsl r0, r0, #0x4\n"
+ " bl FlagSet\n"
+ " ldr r0, ._27 + 4 @ 0x802\n"
+ " bl FlagSet\n"
+ " pop {r0}\n"
+ " bx r0\n"
+ "._28:\n"
+ " .align 2, 0\n"
+ "._27:\n"
+ " .word 0x801\n"
+ " .word 0x802\n"
+ "\n"
+ );
+}
+#endif
static void BuildStartMenuActions(void)
{
diff --git a/src/field/trader.c b/src/field/trader.c
index 64bd708f6..885557d5a 100644
--- a/src/field/trader.c
+++ b/src/field/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/field/use_pokeblock.c b/src/field/use_pokeblock.c
index 42020c49a..8ea93aab8 100644
--- a/src/field/use_pokeblock.c
+++ b/src/field/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/field/wild_encounter.c b/src/field/wild_encounter.c
index 79542422e..19778e29b 100644
--- a/src/field/wild_encounter.c
+++ b/src/field/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;
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/pokemon/mail.c b/src/pokemon/mail.c
index 921a3ad93..4497c98fb 100644
--- a/src/pokemon/mail.c
+++ b/src/pokemon/mail.c
@@ -1,7 +1,10 @@
#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"
@@ -10,6 +13,7 @@
#include "palette.h"
#include "pokemon_icon.h"
#include "overworld.h"
+#include "script.h"
#include "sprite.h"
#include "string_util.h"
#include "strings2.h"
@@ -18,6 +22,8 @@
#include "scanline_effect.h"
#include "ewram.h"
+extern u8 (*gMenuCallback)(void);
+
struct UnkMailStruct
{
u8 unk_0_0:2;
@@ -234,6 +240,56 @@ const struct MailLayout gUnknown_083E57A4[] =
{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;
@@ -247,26 +303,44 @@ 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 mailDesign;
u16 buffer[2];
+ u16 species;
- 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)
+#if DEBUG
+ if (gUnknown_Debug_0300079C != 0)
{
- ewram0_4.varFA = arg0->itemId - ITEM_ORANGE_MAIL;
+ 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.varFA = 0;
- arg2 = FALSE;
+ 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)
@@ -275,24 +349,22 @@ void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2)
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))
+ 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;
@@ -303,7 +375,6 @@ void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2)
ewram0_4.varFB = 0;
}
-
ewram0_4.varF4 = arg0;
ewram0_4.varEC = arg1;
ewram0_4.varF8 = arg2;
@@ -575,25 +646,514 @@ static void sub_80F8F78(void)
static void sub_80F8FB4(void)
{
- u16 local1;
+ 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
- if (UpdatePaletteFade())
+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();
- SetMainCallback2(ewram0_4.varEC);
- switch (ewram0_4.varFB)
+ 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:
- local1 = sub_809D4A8(ewram0_4.varF4->species);
- sub_809D608(local1);
+ debug_sub_810D174(input);
+ return 0;
+ case 2:
+ debug_sub_810D174(input);
+ return 0;
+ case 3:
+ debug_sub_810D174(input);
+ return 0;
+ }
- sub_809D510(&gSprites[ewram0_4.varFC]);
+ 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;
}
-
- memset(&ewram0_4, 0, 0x110);
- ResetPaletteFade();
+ gMain.state++;
}
+
+#endif
diff --git a/src/pokemon/mon_markings.c b/src/pokemon/mon_markings.c
index 66c82a706..dcdc54434 100644
--- a/src/pokemon/mon_markings.c
+++ b/src/pokemon/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/pokemon/pokedex.c b/src/pokemon/pokedex.c
index cbd816206..090873f9d 100644
--- a/src/pokemon/pokedex.c
+++ b/src/pokemon/pokedex.c
@@ -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);
@@ -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/pokemon/pokemon_1.c b/src/pokemon/pokemon_1.c
index 0242e7444..80d245b52 100644
--- a/src/pokemon/pokemon_1.c
+++ b/src/pokemon/pokemon_1.c
@@ -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/pokemon_2.c
index b941ed2ab..7fd1aa7b2 100644
--- a/src/pokemon/pokemon_2.c
+++ b/src/pokemon/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
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_menu.c b/src/pokemon/pokemon_menu.c
index c0cae9353..532340ce4 100644
--- a/src/pokemon/pokemon_menu.c
+++ b/src/pokemon/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;
@@ -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_storage_system.c b/src/pokemon/pokemon_storage_system.c
index 001cebe45..1ea8bc205 100644
--- a/src/pokemon/pokemon_storage_system.c
+++ b/src/pokemon/pokemon_storage_system.c
@@ -1,93 +1,784 @@
#include "global.h"
-#include "pokemon_storage_system.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 "ewram.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;
-struct StorageAction {
- u8 *text;
- u8 format;
+const struct PSS_MenuStringPtrs gUnknown_083B600C[] = {
+ {PCText_WithdrawPoke, PCText_MovePokeToParty},
+ {PCText_DepositPoke, PCText_StorePokeInBox},
+ {PCText_MovePoke, PCText_OrganizeBoxesParty},
+ {PCText_SeeYa, PCText_ReturnToPrevMenu}
};
-extern const struct StorageAction gUnknown_083B6DF4[];
+#if DEBUG
+const u16 gUnknown_Debug_083E05F0[2] = {0};
+#endif
-EWRAM_DATA struct PokemonStorage gPokemonStorage = {0};
+const union AnimCmd gSpriteAnim_83B602C[] = {
+ ANIMCMD_FRAME( 0, 5),
+ ANIMCMD_END
+};
-void sub_8098898(u8 index) {
- u8 *ptr;
+const union AnimCmd gSpriteAnim_83B6034[] = {
+ ANIMCMD_FRAME( 4, 5),
+ ANIMCMD_END
+};
- Menu_DrawStdWindowFrame(10, 16, 29, 19);
+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
+};
- switch (gUnknown_083B6DF4[index].format)
+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;
- case 2:
- ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text);
- ptr = StringCopy(ptr, gUnk20011fa);
- break;
+ for (i = 0; i < 30; i++)
+ {
+ if (GetBoxMonData(gPokemonStorage.boxes[boxId] + i, MON_DATA_SPECIES) == 0)
+ return i;
+ }
+ return -1;
+}
- case 5:
- ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text);
- ptr = StringCopy(ptr, gUnk20026e4);
- break;
+u8 GetNumValidDaycarePartyMons(void)
+{
+ u16 i;
+ u16 count;
- case 1:
- // {var} + " is selected."
- ptr = StringCopy(gUnk2002694, gUnk20011fa);
- ptr = StringCopy(ptr, gUnknown_083B6DF4[index].text);
- break;
+ 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;
+}
- 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;
+u8 CountAlivePartyMonsExceptOne(u8 toSkip)
+{
+ u16 i;
+ u16 count;
- case 3:
+ for (i = 0, count = 0; i < PARTY_SIZE; i++)
{
- u8 *stringLength;
- u8 *text;
+ 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;
+}
- text = gUnknown_083B6DF4[index].text;
- stringLength = &text[StringLength(text)] + 1;
+void StorageSystemClearMessageWindow(void)
+{
+ Menu_BlankWindowRect(2, 15, 27, 18);
+}
- ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text);
- ptr = StringCopy(ptr, gUnk20011fa);
- ptr = StringCopy(ptr, stringLength);
+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;
}
- 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();
+}
- case 6:
- // "Bye-bye, ".substr(0, -1) + {var} + "Bye-bye, !".substr(-1, 1)
+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 *stringLength;
- u8 *text;
+ 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;
+}
- text = gUnknown_083B6DF4[index].text;
- stringLength = &text[StringLength(text)] - 1;
+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();
+}
- ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text);
- ptr = StringCopy(ptr - 1, gUnk20026e4);
- ptr = StringCopy(ptr, stringLength);
+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;
}
- break;
+ 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;
- case 0:
- default:
- ptr = StringCopy(gUnk2002694, gUnknown_083B6DF4[index].text);
- break;
+ 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();
+}
- while (ptr < gUnk20026A6)
+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++)
{
- ptr[0] = CHAR_SPACE;
- ptr++;
+ 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]);
- ptr[0] = EOS;
- Menu_PrintText(gUnk2002694, 11, 17);
+ 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/pokemon_storage_system_2.c b/src/pokemon/pokemon_storage_system_2.c
new file mode 100644
index 000000000..2f12b6bfa
--- /dev/null
+++ b/src/pokemon/pokemon_storage_system_2.c
@@ -0,0 +1,3058 @@
+
+// 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_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON;
+}
+
+#if DEBUG
+__attribute__((naked))
+void sub_8096884(void)
+{
+ asm("\
+ push {r4, lr}\n\
+ ldr r0, ._223 @ gMain\n\
+ ldr r1, ._223 + 4 @ 0x43c\n\
+ add r0, r0, r1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0x9\n\
+ bls ._221 @cond_branch\n\
+ b ._222\n\
+._221:\n\
+ lsl r0, r0, #0x2\n\
+ ldr r1, ._223 + 8 @ \n\
+ add r0, r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+._224:\n\
+ .align 2, 0\n\
+._223:\n\
+ .word gMain\n\
+ .word 0x43c\n\
+ .word ._225\n\
+._225:\n\
+ .word ._226\n\
+ .word ._227\n\
+ .word ._228\n\
+ .word ._229\n\
+ .word ._230\n\
+ .word ._231\n\
+ .word ._232\n\
+ .word ._233\n\
+ .word ._234\n\
+ .word ._235\n\
+._226:\n\
+ mov r0, #0x0\n\
+ bl SetVBlankCallback\n\
+ mov r0, #0x80\n\
+ lsl r0, r0, #0x13\n\
+ mov r4, #0x0\n\
+ strh r4, [r0]\n\
+ bl sub_8096804\n\
+ ldr r0, ._237 @ unk_2038790\n\
+ strb r4, [r0]\n\
+ b ._250\n\
+._238:\n\
+ .align 2, 0\n\
+._237:\n\
+ .word unk_2038790\n\
+._227:\n\
+ ldr r0, ._240 @ gWindowTemplate_81E6D00\n\
+ bl Text_LoadWindowTemplate\n\
+ b ._250\n\
+._241:\n\
+ .align 2, 0\n\
+._240:\n\
+ .word gWindowTemplate_81E6D00\n\
+._228:\n\
+ ldr r0, ._243 @ gWindowTemplate_81E6D00\n\
+ bl InitMenuWindow\n\
+ bl Menu_EraseScreen\n\
+ b ._250\n\
+._244:\n\
+ .align 2, 0\n\
+._243:\n\
+ .word gWindowTemplate_81E6D00\n\
+._229:\n\
+ bl sub_80967DC\n\
+ bl sub_8096848\n\
+ b ._250\n\
+._230:\n\
+ bl ResetPSSMonIconSprites\n\
+ bl sub_809AA24\n\
+ b ._250\n\
+._231:\n\
+ bl sub_8097DE0\n\
+ b ._250\n\
+._232:\n\
+ bl sub_8097E70\n\
+ b ._250\n\
+._233:\n\
+ bl sub_8098400\n\
+ b ._250\n\
+._234:\n\
+ ldr r0, ._251 @ gPokemonStorage\n\
+ ldrb r0, [r0]\n\
+ bl sub_8099BF8\n\
+ ldr r2, ._251 + 4 @ 0x2000000\n\
+ ldr r1, ._251 + 8 @ 0x12bc\n\
+ add r0, r2, r1\n\
+ mov r1, #0xa\n\
+ strh r1, [r0]\n\
+ ldr r1, ._251 + 12 @ 0x12be\n\
+ add r2, r2, r1\n\
+ ldr r1, ._251 + 16 @ 0xdacb\n\
+ strh r1, [r2]\n\
+ bl sub_80F727C\n\
+ bl sub_80F7404\n\
+ b ._250\n\
+._252:\n\
+ .align 2, 0\n\
+._251:\n\
+ .word gPokemonStorage\n\
+ .word 0x2000000\n\
+ .word 0x12bc\n\
+ .word 0x12be\n\
+ .word 0xdacb\n\
+._235:\n\
+ bl sub_8096874\n\
+ ldr r0, ._253 @ sub_8096BF0\n\
+ bl SetPSSCallback\n\
+ ldr r0, ._253 + 4 @ sub_8096B38\n\
+ bl SetMainCallback2\n\
+ ldr r0, ._253 + 8 @ sub_8096AFC\n\
+ bl SetVBlankCallback\n\
+._250:\n\
+ ldr r1, ._253 + 12 @ gMain\n\
+ ldr r0, ._253 + 16 @ 0x43c\n\
+ add r1, r1, r0\n\
+ ldrb r0, [r1]\n\
+ add r0, r0, #0x1\n\
+ strb r0, [r1]\n\
+._222:\n\
+ pop {r4}\n\
+ pop {r0}\n\
+ bx r0\n\
+._254:\n\
+ .align 2, 0\n\
+._253:\n\
+ .word sub_8096BF0+1\n\
+ .word sub_8096B38+1\n\
+ .word sub_8096AFC+1\n\
+ .word gMain\n\
+ .word 0x43c");
+}
+#else
+void sub_8096884(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ REG_DISPCNT = 0;
+ sub_8096804();
+ 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;
+ }
+}
+#endif
+
+void sub_80969A0(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ REG_DISPCNT = 0x0000;
+ 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
+__attribute__((naked))
+void debug_sub_80A4300()
+{
+ asm("\
+ push {lr}\n\
+ ldr r1, ._296 @ gUnknown_0203847D\n\
+ mov r0, #0x0\n\
+ strb r0, [r1]\n\
+ ldr r1, ._296 + 4 @ 0x2000000\n\
+ mov r0, #0x0\n\
+ strb r0, [r1, #0x5]\n\
+ bl sub_8096884\n\
+ ldr r0, ._296 + 8 @ gMain\n\
+ ldr r1, [r0, #0x4]\n\
+ ldr r0, ._296 + 12 @ sub_8096B38\n\
+ cmp r1, r0\n\
+ bne ._295 @cond_branch\n\
+ ldr r1, ._296 + 16 @ unk_2038790\n\
+ mov r0, #0x1\n\
+ strb r0, [r1]\n\
+._295:\n\
+ pop {r0}\n\
+ bx r0\n\
+._297:\n\
+ .align 2, 0\n\
+._296:\n\
+ .word gUnknown_0203847D\n\
+ .word 0x2000000\n\
+ .word gMain\n\
+ .word sub_8096B38+1\n\
+ .word unk_2038790");
+}
+
+__attribute__((naked))
+void debug_sub_80A433C()
+{
+ asm("\
+ push {lr}\n\
+ ldr r2, ._298 @ unk_2038794\n\
+ str r1, [r2]\n\
+ ldr r1, ._298 + 4 @ unk_2038798\n\
+ str r0, [r1]\n\
+ ldr r0, ._298 + 8 @ debug_sub_80A4300\n\
+ bl SetMainCallback2\n\
+ pop {r0}\n\
+ bx r0\n\
+._299:\n\
+ .align 2, 0\n\
+._298:\n\
+ .word unk_2038794\n\
+ .word unk_2038798\n\
+ .word debug_sub_80A4300+1");
+}
+
+__attribute__((naked))
+void debug_sub_80A435C()
+{
+ asm("\
+ push {r4, r5, lr}\n\
+ add sp, sp, #0xfffffffc\n\
+ ldr r5, ._303 @ 0x2000000\n\
+ ldrb r4, [r5, #0x4]\n\
+ cmp r4, #0\n\
+ beq ._300 @cond_branch\n\
+ cmp r4, #0x1\n\
+ beq ._301 @cond_branch\n\
+ b ._308\n\
+._304:\n\
+ .align 2, 0\n\
+._303:\n\
+ .word 0x2000000\n\
+._300:\n\
+ ldr r0, ._306 @ unk_2038798\n\
+ ldr r0, [r0]\n\
+ bl unref_sub_809CB94\n\
+ mov r0, #0x1\n\
+ neg r0, r0\n\
+ str r4, [sp]\n\
+ mov r1, #0x0\n\
+ mov r2, #0x0\n\
+ mov r3, #0x10\n\
+ bl BeginNormalPaletteFade\n\
+ ldrb r0, [r5, #0x4]\n\
+ add r0, r0, #0x1\n\
+ strb r0, [r5, #0x4]\n\
+ b ._308\n\
+._307:\n\
+ .align 2, 0\n\
+._306:\n\
+ .word unk_2038798\n\
+._301:\n\
+ bl UpdatePaletteFade\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ bne ._308 @cond_branch\n\
+ ldr r0, ._309 @ unk_2038794\n\
+ ldr r0, [r0]\n\
+ bl _call_via_r0\n\
+._308:\n\
+ add sp, sp, #0x4\n\
+ pop {r4, r5}\n\
+ pop {r0}\n\
+ bx r0\n\
+._310:\n\
+ .align 2, 0\n\
+._309:\n\
+ .word unk_2038794");
+}
+#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);
+}
+
+#if DEBUG
+__attribute__((naked))
+void sub_8096C84(void)
+{
+ asm("\
+ push {r4, lr}\n\
+ ldr r0, ._347 @ 0x2000000\n\
+ ldrb r0, [r0, #0x4]\n\
+ cmp r0, #0x6\n\
+ bls ._345 @cond_branch\n\
+ b ._466\n\
+._345:\n\
+ lsl r0, r0, #0x2\n\
+ ldr r1, ._347 + 4 @ \n\
+ add r0, r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+._348:\n\
+ .align 2, 0\n\
+._347:\n\
+ .word 0x2000000\n\
+ .word ._349\n\
+._349:\n\
+ .word ._350\n\
+ .word ._351\n\
+ .word ._352\n\
+ .word ._353\n\
+ .word ._354\n\
+ .word ._355\n\
+ .word ._356\n\
+._350:\n\
+ bl sub_809CA40\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ sub r0, r0, #0x1\n\
+ cmp r0, #0xf\n\
+ bls ._357 @cond_branch\n\
+ b ._466\n\
+._357:\n\
+ lsl r0, r0, #0x2\n\
+ ldr r1, ._360 @ \n\
+ add r0, r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+._361:\n\
+ .align 2, 0\n\
+._360:\n\
+ .word ._359\n\
+._359:\n\
+ .word ._362\n\
+ .word ._466\n\
+ .word ._466\n\
+ .word ._365\n\
+ .word ._366\n\
+ .word ._367\n\
+ .word ._368\n\
+ .word ._369\n\
+ .word ._370\n\
+ .word ._371\n\
+ .word ._372\n\
+ .word ._373\n\
+ .word ._374\n\
+ .word ._375\n\
+ .word ._376\n\
+ .word ._377\n\
+._362:\n\
+ mov r0, #0x5\n\
+ bl PlaySE\n\
+ ldr r1, ._379 @ 0x2000000\n\
+ mov r0, #0x1\n\
+ strb r0, [r1, #0x4]\n\
+ b ._466\n\
+._380:\n\
+ .align 2, 0\n\
+._379:\n\
+ .word 0x2000000\n\
+._366:\n\
+ ldr r4, ._383 @ 0x2000000\n\
+ ldrb r0, [r4, #0x5]\n\
+ cmp r0, #0x2\n\
+ beq ._381 @cond_branch\n\
+ mov r0, #0x10\n\
+ bl PrintStorageActionText\n\
+ mov r0, #0x3\n\
+ strb r0, [r4, #0x4]\n\
+ b ._466\n\
+._384:\n\
+ .align 2, 0\n\
+._383:\n\
+ .word 0x2000000\n\
+._381:\n\
+ bl sub_809B0D4\n\
+ ldr r0, ._386 @ sub_8096FC8\n\
+ bl SetPSSCallback\n\
+ b ._466\n\
+._387:\n\
+ .align 2, 0\n\
+._386:\n\
+ .word sub_8096FC8+1\n\
+._367:\n\
+ ldr r4, ._394 @ 0x2000000\n\
+ ldrb r0, [r4, #0x5]\n\
+ cmp r0, #0x2\n\
+ beq ._388 @cond_branch\n\
+ b ._466\n\
+._388:\n\
+ bl sub_809BF20\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ beq ._391 @cond_branch\n\
+ ldr r1, ._394 + 4 @ 0x11f2\n\
+ add r0, r4, r1\n\
+ ldrh r0, [r0]\n\
+ bl ItemIsMail\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ beq ._391 @cond_branch\n\
+ b ._392\n\
+._391:\n\
+ ldr r0, ._394 + 8 @ sub_8097004\n\
+ bl SetPSSCallback\n\
+ b ._466\n\
+._395:\n\
+ .align 2, 0\n\
+._394:\n\
+ .word 0x2000000\n\
+ .word 0x11f2\n\
+ .word sub_8097004+1\n\
+._365:\n\
+ ldr r0, ._399 @ unk_2038790\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq ._396 @cond_branch\n\
+ b ._466\n\
+._396:\n\
+ ldr r0, ._399 + 4 @ sub_8097BA0\n\
+ bl SetPSSCallback\n\
+ b ._466\n\
+._400:\n\
+ .align 2, 0\n\
+._399:\n\
+ .word unk_2038790\n\
+ .word sub_8097BA0+1\n\
+._377:\n\
+ ldr r0, ._404 @ unk_2038790\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq ._401 @cond_branch\n\
+ b ._466\n\
+._401:\n\
+ ldr r0, ._404 + 4 @ sub_8097CC0\n\
+ bl SetPSSCallback\n\
+ b ._466\n\
+._405:\n\
+ .align 2, 0\n\
+._404:\n\
+ .word unk_2038790\n\
+ .word sub_8097CC0+1\n\
+._368:\n\
+ mov r0, #0x5\n\
+ bl PlaySE\n\
+ ldr r0, ._407 @ sub_809789C\n\
+ bl SetPSSCallback\n\
+ b ._466\n\
+._408:\n\
+ .align 2, 0\n\
+._407:\n\
+ .word sub_809789C+1\n\
+._369:\n\
+ mov r0, #0x5\n\
+ bl PlaySE\n\
+ ldr r0, ._410 @ sub_8097078\n\
+ bl SetPSSCallback\n\
+ b ._466\n\
+._411:\n\
+ .align 2, 0\n\
+._410:\n\
+ .word sub_8097078+1\n\
+._370:\n\
+ mov r0, #0x5\n\
+ bl PlaySE\n\
+ ldr r4, ._414 @ 0x2000000\n\
+ ldr r0, ._414 + 4 @ gPokemonStorage\n\
+ ldrb r0, [r0]\n\
+ add r0, r0, #0x1\n\
+ ldr r2, ._414 + 8 @ 0x8b2\n\
+ add r1, r4, r2\n\
+ strh r0, [r1]\n\
+ cmp r0, #0xd\n\
+ ble ._416 @cond_branch\n\
+ mov r0, #0x0\n\
+ b ._413\n\
+._415:\n\
+ .align 2, 0\n\
+._414:\n\
+ .word 0x2000000\n\
+ .word gPokemonStorage\n\
+ .word 0x8b2\n\
+._371:\n\
+ mov r0, #0x5\n\
+ bl PlaySE\n\
+ ldr r4, ._418 @ 0x2000000\n\
+ ldr r0, ._418 + 4 @ gPokemonStorage\n\
+ ldrb r0, [r0]\n\
+ sub r0, r0, #0x1\n\
+ ldr r2, ._418 + 8 @ 0x8b2\n\
+ add r1, r4, r2\n\
+ strh r0, [r1]\n\
+ cmp r0, #0\n\
+ bge ._416 @cond_branch\n\
+ mov r0, #0xd\n\
+._413:\n\
+ strh r0, [r1]\n\
+._416:\n\
+ ldrb r0, [r1]\n\
+ bl sub_8099C70\n\
+ mov r0, #0x2\n\
+ strb r0, [r4, #0x4]\n\
+ b ._466\n\
+._419:\n\
+ .align 2, 0\n\
+._418:\n\
+ .word 0x2000000\n\
+ .word gPokemonStorage\n\
+ .word 0x8b2\n\
+._372:\n\
+ bl sub_809BE80\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ bne ._428 @cond_branch\n\
+ ldr r4, ._423 @ 0x2000000\n\
+ ldr r1, ._423 + 4 @ 0x11f2\n\
+ add r0, r4, r1\n\
+ ldrh r0, [r0]\n\
+ bl ItemIsMail\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ beq ._421 @cond_branch\n\
+._392:\n\
+ mov r0, #0x5\n\
+ strb r0, [r4, #0x4]\n\
+ b ._466\n\
+._424:\n\
+ .align 2, 0\n\
+._423:\n\
+ .word 0x2000000\n\
+ .word 0x11f2\n\
+._421:\n\
+ mov r0, #0x5\n\
+ bl PlaySE\n\
+ ldr r0, ._426 @ sub_809746C\n\
+ bl SetPSSCallback\n\
+ b ._466\n\
+._427:\n\
+ .align 2, 0\n\
+._426:\n\
+ .word sub_809746C+1\n\
+._374:\n\
+ bl sub_809BE80\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ bne ._428 @cond_branch\n\
+ mov r0, #0x5\n\
+ bl PlaySE\n\
+ ldr r0, ._430 @ sub_80972A8\n\
+ bl SetPSSCallback\n\
+ b ._466\n\
+._431:\n\
+ .align 2, 0\n\
+._430:\n\
+ .word sub_80972A8+1\n\
+._375:\n\
+ bl sub_809BEBC\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ bne ._432 @cond_branch\n\
+._428:\n\
+ ldr r1, ._434 @ 0x2000000\n\
+ mov r0, #0x4\n\
+ strb r0, [r1, #0x4]\n\
+ b ._466\n\
+._435:\n\
+ .align 2, 0\n\
+._434:\n\
+ .word 0x2000000\n\
+._432:\n\
+ mov r0, #0x5\n\
+ bl PlaySE\n\
+ ldr r0, ._437 @ c3_0808DC50\n\
+ bl SetPSSCallback\n\
+ b ._466\n\
+._438:\n\
+ .align 2, 0\n\
+._437:\n\
+ .word c3_0808DC50+1\n\
+._373:\n\
+ mov r0, #0x5\n\
+ bl PlaySE\n\
+ ldr r0, ._440 @ sub_8097390\n\
+ bl SetPSSCallback\n\
+ b ._466\n\
+._441:\n\
+ .align 2, 0\n\
+._440:\n\
+ .word sub_8097390+1\n\
+._376:\n\
+ mov r0, #0x5\n\
+ bl PlaySE\n\
+ ldr r0, ._443 @ sub_80972FC\n\
+ bl SetPSSCallback\n\
+ b ._466\n\
+._444:\n\
+ .align 2, 0\n\
+._443:\n\
+ .word sub_80972FC+1\n\
+._351:\n\
+ bl sub_809AC00\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ bne ._466 @cond_branch\n\
+ bl sub_809BF48\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ beq ._446 @cond_branch\n\
+ bl sub_80986E8\n\
+ b ._447\n\
+._446:\n\
+ bl sub_8098710\n\
+._447:\n\
+ ldr r4, ._450 @ 0x2000000\n\
+ ldr r2, ._450 + 4 @ 0x11f6\n\
+ add r0, r4, r2\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq ._448 @cond_branch\n\
+ bl BoxSetMosaic\n\
+._448:\n\
+ mov r0, #0x0\n\
+ strb r0, [r4, #0x4]\n\
+ b ._466\n\
+._451:\n\
+ .align 2, 0\n\
+._450:\n\
+ .word 0x2000000\n\
+ .word 0x11f6\n\
+._352:\n\
+ bl sub_8099D34\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ bne ._466 @cond_branch\n\
+ ldr r1, ._456 @ gPokemonStorage\n\
+ ldr r0, ._456 + 4 @ 0x2000000\n\
+ ldr r2, ._456 + 8 @ 0x8b2\n\
+ add r0, r0, r2\n\
+ ldrh r0, [r0]\n\
+ strb r0, [r1]\n\
+ ldr r0, ._456 + 12 @ gUnknown_0203847C\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ bne ._455 @cond_branch\n\
+ bl sub_809BF20\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ bne ._455 @cond_branch\n\
+ bl sub_809B440\n\
+ bl BoxSetMosaic\n\
+ b ._455\n\
+._457:\n\
+ .align 2, 0\n\
+._456:\n\
+ .word gPokemonStorage\n\
+ .word 0x2000000\n\
+ .word 0x8b2\n\
+ .word gUnknown_0203847C\n\
+._353:\n\
+ ldr r0, ._460 @ gMain\n\
+ ldrh r1, [r0, #0x2e]\n\
+ mov r0, #0xf3\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._466 @cond_branch\n\
+ bl sub_8098A5C\n\
+._455:\n\
+ ldr r1, ._460 + 4 @ 0x2000000\n\
+ mov r0, #0x0\n\
+ strb r0, [r1, #0x4]\n\
+ b ._466\n\
+._461:\n\
+ .align 2, 0\n\
+._460:\n\
+ .word gMain\n\
+ .word 0x2000000\n\
+._354:\n\
+ mov r0, #0x20\n\
+ bl PlaySE\n\
+ mov r0, #0xd\n\
+ b ._462\n\
+._355:\n\
+ mov r0, #0x20\n\
+ bl PlaySE\n\
+ mov r0, #0x16\n\
+._462:\n\
+ bl PrintStorageActionText\n\
+ ldr r1, ._464 @ 0x2000000\n\
+ mov r0, #0x6\n\
+ strb r0, [r1, #0x4]\n\
+ b ._466\n\
+._465:\n\
+ .align 2, 0\n\
+._464:\n\
+ .word 0x2000000\n\
+._356:\n\
+ ldr r0, ._467 @ gMain\n\
+ ldrh r1, [r0, #0x2e]\n\
+ mov r0, #0xf3\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._466 @cond_branch\n\
+ bl sub_8098A5C\n\
+ ldr r0, ._467 + 4 @ sub_8096C84\n\
+ bl SetPSSCallback\n\
+._466:\n\
+ pop {r4}\n\
+ pop {r0}\n\
+ bx r0\n\
+._468:\n\
+ .align 2, 0\n\
+._467:\n\
+ .word gMain\n\
+ .word sub_8096C84+1");
+}
+#else
+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:
+ SetPSSCallback(sub_8097BA0);
+ break;
+ case 16:
+ 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;
+ }
+}
+#endif
+
+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;
+ }
+}
+
+#if DEBUG
+__attribute__((naked))
+void sub_8097078(void)
+{
+ asm("\
+ push {r4, lr}\n\
+ ldr r0, ._495 @ 0x2000000\n\
+ ldrb r0, [r0, #0x4]\n\
+ cmp r0, #0x5\n\
+ bls ._493 @cond_branch\n\
+ b ._597\n\
+._493:\n\
+ lsl r0, r0, #0x2\n\
+ ldr r1, ._495 + 4 @ \n\
+ add r0, r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+._496:\n\
+ .align 2, 0\n\
+._495:\n\
+ .word 0x2000000\n\
+ .word ._497\n\
+._497:\n\
+ .word ._498\n\
+ .word ._499\n\
+ .word ._500\n\
+ .word ._501\n\
+ .word ._502\n\
+ .word ._503\n\
+._498:\n\
+ mov r0, #0x4\n\
+ bl PrintStorageActionText\n\
+ bl sub_809CE84\n\
+ ldr r1, ._505 @ 0x2000000\n\
+ mov r0, #0x1\n\
+ strb r0, [r1, #0x4]\n\
+ b ._597\n\
+._506:\n\
+ .align 2, 0\n\
+._505:\n\
+ .word 0x2000000\n\
+._499:\n\
+ bl sub_809CF30\n\
+ add r0, r0, #0x1\n\
+ lsl r0, r0, #0x10\n\
+ asr r0, r0, #0x10\n\
+ cmp r0, #0x21\n\
+ bls ._507 @cond_branch\n\
+ b ._597\n\
+._507:\n\
+ lsl r0, r0, #0x2\n\
+ ldr r1, ._510 @ \n\
+ add r0, r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+._511:\n\
+ .align 2, 0\n\
+._510:\n\
+ .word ._509\n\
+._509:\n\
+ .word ._513\n\
+ .word ._513\n\
+ .word ._514\n\
+ .word ._515\n\
+ .word ._516\n\
+ .word ._517\n\
+ .word ._518\n\
+ .word ._519\n\
+ .word ._520\n\
+ .word ._521\n\
+ .word ._597\n\
+ .word ._597\n\
+ .word ._597\n\
+ .word ._597\n\
+ .word ._597\n\
+ .word ._597\n\
+ .word ._597\n\
+ .word ._597\n\
+ .word ._597\n\
+ .word ._597\n\
+ .word ._597\n\
+ .word ._597\n\
+ .word ._597\n\
+ .word ._597\n\
+ .word ._597\n\
+ .word ._597\n\
+ .word ._597\n\
+ .word ._597\n\
+ .word ._597\n\
+ .word ._597\n\
+ .word ._597\n\
+ .word ._597\n\
+ .word ._597\n\
+ .word ._545\n\
+._513:\n\
+ bl sub_8098A5C\n\
+ ldr r0, ._547 @ sub_8096C84\n\
+ bl SetPSSCallback\n\
+ b ._597\n\
+._548:\n\
+ .align 2, 0\n\
+._547:\n\
+ .word sub_8096C84+1\n\
+._516:\n\
+ bl sub_809BE80\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ bne ._563 @cond_branch\n\
+ mov r0, #0x5\n\
+ bl PlaySE\n\
+ bl sub_8098A5C\n\
+ ldr r0, ._551 @ sub_80972A8\n\
+ bl SetPSSCallback\n\
+ b ._597\n\
+._552:\n\
+ .align 2, 0\n\
+._551:\n\
+ .word sub_80972A8+1\n\
+._518:\n\
+ mov r0, #0x5\n\
+ bl PlaySE\n\
+ bl sub_8098A5C\n\
+ ldr r0, ._554 @ sub_80972FC\n\
+ bl SetPSSCallback\n\
+ b ._597\n\
+._555:\n\
+ .align 2, 0\n\
+._554:\n\
+ .word sub_80972FC+1\n\
+._517:\n\
+ bl sub_809BEBC\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ beq ._563 @cond_branch\n\
+ mov r0, #0x5\n\
+ bl PlaySE\n\
+ bl sub_8098A5C\n\
+ ldr r0, ._558 @ c3_0808DC50\n\
+ bl SetPSSCallback\n\
+ b ._597\n\
+._559:\n\
+ .align 2, 0\n\
+._558:\n\
+ .word c3_0808DC50+1\n\
+._515:\n\
+ mov r0, #0x5\n\
+ bl PlaySE\n\
+ bl sub_8098A5C\n\
+ ldr r0, ._561 @ sub_8097390\n\
+ bl SetPSSCallback\n\
+ b ._597\n\
+._562:\n\
+ .align 2, 0\n\
+._561:\n\
+ .word sub_8097390+1\n\
+._514:\n\
+ bl sub_809BE80\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ bne ._563 @cond_branch\n\
+ ldr r4, ._566 @ 0x2000000\n\
+ ldr r1, ._566 + 4 @ 0x11f2\n\
+ add r0, r4, r1\n\
+ ldrh r0, [r0]\n\
+ bl ItemIsMail\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ bne ._564 @cond_branch\n\
+ mov r0, #0x5\n\
+ bl PlaySE\n\
+ bl sub_8098A5C\n\
+ ldr r0, ._566 + 8 @ sub_809746C\n\
+ bl SetPSSCallback\n\
+ b ._597\n\
+._567:\n\
+ .align 2, 0\n\
+._566:\n\
+ .word 0x2000000\n\
+ .word 0x11f2\n\
+ .word sub_809746C+1\n\
+._520:\n\
+ bl sub_809BE80\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ beq ._568 @cond_branch\n\
+._563:\n\
+ ldr r1, ._570 @ 0x2000000\n\
+ mov r0, #0x2\n\
+ strb r0, [r1, #0x4]\n\
+ b ._597\n\
+._571:\n\
+ .align 2, 0\n\
+._570:\n\
+ .word 0x2000000\n\
+._568:\n\
+ ldr r4, ._574 @ 0x2000000\n\
+ ldr r1, ._574 + 4 @ 0x11f9\n\
+ add r0, r4, r1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq ._572 @cond_branch\n\
+ mov r0, #0x4\n\
+ strb r0, [r4, #0x4]\n\
+ b ._597\n\
+._575:\n\
+ .align 2, 0\n\
+._574:\n\
+ .word 0x2000000\n\
+ .word 0x11f9\n\
+._572:\n\
+ ldr r1, ._578 @ 0x11f2\n\
+ add r0, r4, r1\n\
+ ldrh r0, [r0]\n\
+ bl ItemIsMail\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ beq ._576 @cond_branch\n\
+._564:\n\
+ mov r0, #0x3\n\
+ strb r0, [r4, #0x4]\n\
+ b ._597\n\
+._579:\n\
+ .align 2, 0\n\
+._578:\n\
+ .word 0x11f2\n\
+._576:\n\
+ mov r0, #0x5\n\
+ bl PlaySE\n\
+ ldr r0, ._581 @ sub_8097594\n\
+ bl SetPSSCallback\n\
+ b ._597\n\
+._582:\n\
+ .align 2, 0\n\
+._581:\n\
+ .word sub_8097594+1\n\
+._519:\n\
+ mov r0, #0x5\n\
+ bl PlaySE\n\
+ ldr r0, ._584 @ sub_8097788\n\
+ bl SetPSSCallback\n\
+ b ._597\n\
+._585:\n\
+ .align 2, 0\n\
+._584:\n\
+ .word sub_8097788+1\n\
+._521:\n\
+ mov r0, #0x5\n\
+ bl PlaySE\n\
+ ldr r0, ._587 @ sub_80977E4\n\
+ bl SetPSSCallback\n\
+ b ._597\n\
+._588:\n\
+ .align 2, 0\n\
+._587:\n\
+ .word sub_80977E4+1\n\
+._545:\n\
+ mov r0, #0x5\n\
+ bl PlaySE\n\
+ bl sub_8098A5C\n\
+ ldr r0, ._590 @ debug_sub_80A435C\n\
+ bl SetPSSCallback\n\
+ b ._597\n\
+._591:\n\
+ .align 2, 0\n\
+._590:\n\
+ .word debug_sub_80A435C+1\n\
+._500:\n\
+ mov r0, #0x20\n\
+ bl PlaySE\n\
+ mov r0, #0xd\n\
+ b ._593\n\
+._502:\n\
+ mov r0, #0x20\n\
+ bl PlaySE\n\
+ mov r0, #0x11\n\
+ b ._593\n\
+._501:\n\
+ mov r0, #0x20\n\
+ bl PlaySE\n\
+ mov r0, #0x16\n\
+._593:\n\
+ bl PrintStorageActionText\n\
+ ldr r1, ._595 @ 0x2000000\n\
+ mov r0, #0x5\n\
+ strb r0, [r1, #0x4]\n\
+ b ._597\n\
+._596:\n\
+ .align 2, 0\n\
+._595:\n\
+ .word 0x2000000\n\
+._503:\n\
+ ldr r0, ._598 @ gMain\n\
+ ldrh r1, [r0, #0x2e]\n\
+ mov r0, #0xf3\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._597 @cond_branch\n\
+ bl sub_8098A5C\n\
+ ldr r0, ._598 + 4 @ sub_8096C84\n\
+ bl SetPSSCallback\n\
+._597:\n\
+ pop {r4}\n\
+ pop {r0}\n\
+ bx r0\n\
+._599:\n\
+ .align 2, 0\n\
+._598:\n\
+ .word gMain\n\
+ .word sub_8096C84+1");
+}
+#else
+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;
+ }
+ 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;
+ }
+}
+#endif
+
+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:
+ // "Bye-bye, ".substr(0, -1) + {var} + "Bye-bye, !".substr(-1, 1)
+ {
+ 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/pokemon_storage_system_3.c b/src/pokemon/pokemon_storage_system_3.c
new file mode 100644
index 000000000..da26c6fc5
--- /dev/null
+++ b/src/pokemon/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/pokemon_storage_system_4.c b/src/pokemon/pokemon_storage_system_4.c
new file mode 100644
index 000000000..19fddc0f7
--- /dev/null
+++ b/src/pokemon/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_GetItem(gPokemonStorageSystemPtr->unk_11f2)->name);
+ 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/pokemon_storage_system_5.c b/src/pokemon/pokemon_storage_system_5.c
new file mode 100644
index 000000000..b7c3d42f5
--- /dev/null
+++ b/src/pokemon/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/pokemon_summary_screen.c
index 96f9c44f9..9c621780a 100644
--- a/src/pokemon/pokemon_summary_screen.c
+++ b/src/pokemon/pokemon_summary_screen.c
@@ -41,11 +41,11 @@ static void sub_80A0090(struct Pokemon *);
static void sub_80A015C(struct Pokemon *);
static void sub_809DE44(void);
static void sub_809EB40(u8);
-static void sub_809EBC4(void);
-static void sub_809E044(void);
+/*static*/ void sub_809EBC4(void);
+/*static*/ void sub_809E044(void);
static void sub_80A1D84(struct Pokemon *);
-static void sub_80A18C4(void);
-static bool8 LoadPokemonSummaryScreenGraphics(void);
+/*static*/ void sub_80A18C4(void);
+/*static*/ bool8 LoadPokemonSummaryScreenGraphics(void);
static bool8 MonKnowsMultipleMoves(struct Pokemon *);
static void PrintSummaryWindowHeaderText(void);
static void sub_80A1DCC(struct Pokemon *);
@@ -63,8 +63,8 @@ static void PrintHeldItemName(u16, u8, u8);
static void PrintNumRibbons(struct Pokemon *);
static void DrawExperienceProgressBar(struct Pokemon *, u8, u8);
static void sub_809E13C(u8 taskId);
-static void sub_80A1950(void);
-static void sub_809DE64(void);
+/*static*/ void sub_80A1950(void);
+/*static*/ void sub_809DE64(void);
static void SummaryScreenHandleAButton(u8);
static void SummaryScreenHandleUpDownInput(u8, s8);
static bool8 sub_809F7D0(u8);
@@ -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[];
@@ -572,7 +571,43 @@ static const u8 sUnknown_083C15BC[] = {
-1, 15, 0, 10,
};
-
+#if DEBUG
+__attribute__((naked))
+void sub_809D844(void)
+{
+ asm("\
+ push {lr}\n\
+ add sp, sp, #0xfffffffc\n\
+ bl RunTasks\n\
+ bl AnimateSprites\n\
+ bl BuildOamBuffer\n\
+ bl UpdatePaletteFade\n\
+ ldr r0, ._2 @ gLinkOpen\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0x1\n\
+ bne ._1 @cond_branch\n\
+ ldr r0, ._2 + 4 @ gLink\n\
+ ldr r1, ._2 + 8 @ 0xfbd\n\
+ add r0, r0, r1\n\
+ ldrb r0, [r0]\n\
+ mov r1, #0x3\n\
+ str r1, [sp]\n\
+ mov r1, #0x14\n\
+ mov r2, #0x1\n\
+ mov r3, #0x2\n\
+ bl debug_sub_8008264\n\
+._1:\n\
+ add sp, sp, #0x4\n\
+ pop {r0}\n\
+ bx r0\n\
+._3:\n\
+ .align 2, 0\n\
+._2:\n\
+ .word gLinkOpen\n\
+ .word gLink\n\
+ .word 0xfbd");
+}
+#else
void sub_809D844(void)
{
RunTasks();
@@ -580,6 +615,7 @@ void sub_809D844(void)
BuildOamBuffer();
UpdatePaletteFade();
}
+#endif
void sub_809D85C(void)
{
@@ -689,6 +725,491 @@ void sub_809DA1C(void)
}
}
+#if DEBUG
+__attribute__((naked))
+bool8 sub_809DA84(void)
+{
+ asm("\
+ push {r4, r5, r6, r7, lr}\n\
+ add sp, sp, #0xfffffff8\n\
+ ldr r1, ._52 @ gMain\n\
+ ldr r2, ._52 + 4 @ 0x43c\n\
+ add r0, r1, r2\n\
+ ldrb r0, [r0]\n\
+ mov ip, r1\n\
+ cmp r0, #0x16\n\
+ bls ._50 @cond_branch\n\
+ b ._51\n\
+._50:\n\
+ lsl r0, r0, #0x2\n\
+ ldr r1, ._52 + 8 @ \n\
+ add r0, r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+._53:\n\
+ .align 2, 0\n\
+._52:\n\
+ .word gMain\n\
+ .word 0x43c\n\
+ .word ._54\n\
+._54:\n\
+ .word ._55\n\
+ .word ._56\n\
+ .word ._57\n\
+ .word ._58\n\
+ .word ._59\n\
+ .word ._60\n\
+ .word ._61\n\
+ .word ._62\n\
+ .word ._63\n\
+ .word ._64\n\
+ .word ._65\n\
+ .word ._66\n\
+ .word ._67\n\
+ .word ._68\n\
+ .word ._69\n\
+ .word ._70\n\
+ .word ._71\n\
+ .word ._72\n\
+ .word ._73\n\
+ .word ._74\n\
+ .word ._75\n\
+ .word ._76\n\
+ .word ._77\n\
+._55:\n\
+ mov r0, #0x0\n\
+ bl SetVBlankCallback\n\
+ bl ResetSpriteData\n\
+ b ._146\n\
+._56:\n\
+ bl ScanlineEffect_Stop\n\
+ ldr r1, ._80 @ gMain\n\
+ ldr r2, ._80 + 4 @ 0x43c\n\
+ add r1, r1, r2\n\
+ b ._153\n\
+._81:\n\
+ .align 2, 0\n\
+._80:\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._57:\n\
+ bl FreeAllSpritePalettes\n\
+ b ._146\n\
+._58:\n\
+ mov r2, #0xc0\n\
+ lsl r2, r2, #0x13\n\
+ mov r3, #0x80\n\
+ lsl r3, r3, #0x9\n\
+ mov r5, #0x0\n\
+ ldr r1, ._85 @ 0x40000d4\n\
+ mov r4, #0x80\n\
+ lsl r4, r4, #0x5\n\
+ ldr r6, ._85 + 4 @ 0x85000400\n\
+ mov r7, #0x85\n\
+ lsl r7, r7, #0x18\n\
+._83:\n\
+ str r5, [sp, #0x4]\n\
+ add r0, sp, #0x4\n\
+ str r0, [r1]\n\
+ str r2, [r1, #0x4]\n\
+ str r6, [r1, #0x8]\n\
+ ldr r0, [r1, #0x8]\n\
+ add r2, r2, r4\n\
+ sub r3, r3, r4\n\
+ cmp r3, r4\n\
+ bhi ._83 @cond_branch\n\
+ str r5, [sp, #0x4]\n\
+ add r0, sp, #0x4\n\
+ str r0, [r1]\n\
+ str r2, [r1, #0x4]\n\
+ lsr r0, r3, #0x2\n\
+ orr r0, r0, r7\n\
+ str r0, [r1, #0x8]\n\
+ ldr r0, [r1, #0x8]\n\
+ ldr r1, ._85 + 8 @ 0x43c\n\
+ add r1, r1, ip\n\
+ b ._153\n\
+._86:\n\
+ .align 2, 0\n\
+._85:\n\
+ .word 0x40000d4\n\
+ .word 0x85000400\n\
+ .word 0x43c\n\
+._59:\n\
+ bl sub_809DE64\n\
+ ldr r1, ._88 @ gMain\n\
+ ldr r2, ._88 + 4 @ 0x43c\n\
+ add r1, r1, r2\n\
+ b ._153\n\
+._89:\n\
+ .align 2, 0\n\
+._88:\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._60:\n\
+ ldr r0, ._91 @ gWindowTemplate_81E6E6C\n\
+ bl Text_LoadWindowTemplate\n\
+ b ._146\n\
+._92:\n\
+ .align 2, 0\n\
+._91:\n\
+ .word gWindowTemplate_81E6E6C\n\
+._61:\n\
+ ldr r0, ._94 @ gWindowTemplate_81E6E6C\n\
+ bl MultistepInitMenuWindowBegin\n\
+ ldr r1, ._94 + 4 @ gMain\n\
+ ldr r2, ._94 + 8 @ 0x43c\n\
+ add r1, r1, r2\n\
+ b ._153\n\
+._95:\n\
+ .align 2, 0\n\
+._94:\n\
+ .word gWindowTemplate_81E6E6C\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._62:\n\
+ bl MultistepInitMenuWindowContinue\n\
+ cmp r0, #0\n\
+ bne ._96 @cond_branch\n\
+ b ._157\n\
+._96:\n\
+ b ._146\n\
+._63:\n\
+ bl sub_809DA1C\n\
+ ldr r1, ._100 @ gMain\n\
+ ldr r2, ._100 + 4 @ 0x43c\n\
+ add r1, r1, r2\n\
+ b ._153\n\
+._101:\n\
+ .align 2, 0\n\
+._100:\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._64:\n\
+ ldr r1, ._103 @ gSummaryScreenTextTiles\n\
+ ldr r2, ._103 + 4 @ 0x600d000\n\
+ ldr r0, ._103 + 8 @ 0x40000d4\n\
+ str r1, [r0]\n\
+ str r2, [r0, #0x4]\n\
+ ldr r1, ._103 + 12 @ 0x800000a0\n\
+ str r1, [r0, #0x8]\n\
+ ldr r1, [r0, #0x8]\n\
+ ldr r1, ._103 + 16 @ sSummaryScreenButtonTiles\n\
+ ldr r2, ._103 + 20 @ 0x600d140\n\
+ str r1, [r0]\n\
+ str r2, [r0, #0x4]\n\
+ ldr r1, ._103 + 24 @ 0x80000080\n\
+ str r1, [r0, #0x8]\n\
+ ldr r0, [r0, #0x8]\n\
+ ldr r0, ._103 + 28 @ \n\
+ add r0, r0, #0x74\n\
+ mov r1, #0x0\n\
+ strb r1, [r0]\n\
+ ldr r1, ._103 + 32 @ \n\
+ add r1, r1, ip\n\
+ b ._153\n\
+._104:\n\
+ .align 2, 0\n\
+._103:\n\
+ .word gSummaryScreenTextTiles\n\
+ .word 0x600d000\n\
+ .word 0x40000d4\n\
+ .word 0x800000a0\n\
+ .word sSummaryScreenButtonTiles\n\
+ .word 0x600d140\n\
+ .word 0x80000080\n\
+ .word +0x2018000\n\
+ .word 0x43c\n\
+._65:\n\
+ bl LoadPokemonSummaryScreenGraphics\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ bne ._105 @cond_branch\n\
+ b ._157\n\
+._105:\n\
+ ldr r0, ._108 @ \n\
+ add r0, r0, #0x74\n\
+ mov r1, #0x0\n\
+ strb r1, [r0]\n\
+ b ._146\n\
+._109:\n\
+ .align 2, 0\n\
+._108:\n\
+ .word +0x2018000\n\
+._66:\n\
+ bl sub_80A18C4\n\
+ ldr r1, ._111 @ gMain\n\
+ ldr r2, ._111 + 4 @ 0x43c\n\
+ add r1, r1, r2\n\
+ b ._153\n\
+._112:\n\
+ .align 2, 0\n\
+._111:\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._67:\n\
+ ldr r4, ._115 @ \n\
+ add r0, r4, #0\n\
+ bl sub_809F678\n\
+ add r0, r4, #0\n\
+ bl GetMonStatusAndPokerus\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ bne ._113 @cond_branch\n\
+ mov r0, #0x0\n\
+ bl sub_80A12D0\n\
+ b ._114\n\
+._116:\n\
+ .align 2, 0\n\
+._115:\n\
+ .word +0x2018010\n\
+._113:\n\
+ mov r0, #0xa\n\
+ bl sub_80A12D0\n\
+._114:\n\
+ ldr r0, ._118 @ \n\
+ bl DrawPokerusSurvivorDot\n\
+ b ._146\n\
+._119:\n\
+ .align 2, 0\n\
+._118:\n\
+ .word +0x2018010\n\
+._68:\n\
+ bl sub_80A1950\n\
+ ldr r0, ._121 @ \n\
+ bl sub_80A1D84\n\
+ ldr r1, ._121 + 4 @ \n\
+ ldr r2, ._121 + 8 @ \n\
+ add r1, r1, r2\n\
+ b ._153\n\
+._122:\n\
+ .align 2, 0\n\
+._121:\n\
+ .word +0x2018010\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._69:\n\
+ ldr r4, ._124 @ \n\
+ add r0, r4, #0\n\
+ bl sub_80A1DE8\n\
+ add r4, r4, #0x64\n\
+ mov r0, #0x0\n\
+ strb r0, [r4]\n\
+ b ._146\n\
+._125:\n\
+ .align 2, 0\n\
+._124:\n\
+ .word +0x2018010\n\
+._70:\n\
+ ldr r4, ._129 @ \n\
+ add r5, r4, #0\n\
+ add r5, r5, #0x64\n\
+ add r0, r4, #0\n\
+ add r1, r5, #0\n\
+ bl sub_809F6B4\n\
+ sub r4, r4, #0x10\n\
+ strb r0, [r4, #0xc]\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ cmp r0, #0xff\n\
+ bne ._126 @cond_branch\n\
+ b ._157\n\
+._126:\n\
+ mov r0, #0x0\n\
+ strb r0, [r5]\n\
+ ldr r1, ._129 + 4 @ \n\
+ ldr r2, ._129 + 8 @ \n\
+ add r1, r1, r2\n\
+ b ._153\n\
+._130:\n\
+ .align 2, 0\n\
+._129:\n\
+ .word +0x2018010\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._71:\n\
+ bl sub_809E044\n\
+ bl DrawSummaryScreenNavigationDots\n\
+ b ._146\n\
+._72:\n\
+ ldr r1, ._134 @ \n\
+ ldrb r0, [r1, #0xb]\n\
+ cmp r0, #0x1\n\
+ bhi ._132 @cond_branch\n\
+ ldr r0, ._134 + 4 @ \n\
+ ldrb r1, [r1, #0xb]\n\
+ lsl r1, r1, #0x2\n\
+ add r1, r1, r0\n\
+ ldr r0, [r1]\n\
+ bl _call_via_r0\n\
+._132:\n\
+ ldr r1, ._134 + 8 @ \n\
+ ldr r2, ._134 + 12 @ \n\
+ add r1, r1, r2\n\
+ b ._153\n\
+._135:\n\
+ .align 2, 0\n\
+._134:\n\
+ .word +0x2018000\n\
+ .word sUnknown_083C1580\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._73:\n\
+ ldr r0, ._137 @ \n\
+ bl sub_809FAC8\n\
+ b ._146\n\
+._138:\n\
+ .align 2, 0\n\
+._137:\n\
+ .word +0x2018010\n\
+._74:\n\
+ ldr r2, ._140 @ sUnknown_083C1598\n\
+ ldr r0, ._140 + 4 @ \n\
+ ldrb r1, [r0, #0xb]\n\
+ lsl r1, r1, #0x2\n\
+ add r1, r1, r2\n\
+ add r0, r0, #0x10\n\
+ ldr r1, [r1]\n\
+ bl _call_via_r1\n\
+ ldr r1, ._140 + 8 @ \n\
+ ldr r2, ._140 + 12 @ \n\
+ add r1, r1, r2\n\
+ b ._153\n\
+._141:\n\
+ .align 2, 0\n\
+._140:\n\
+ .word sUnknown_083C1598\n\
+ .word +0x2018000\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._75:\n\
+ ldr r0, ._144 @ \n\
+ mov r1, #0x2d\n\
+ bl GetMonData\n\
+ add r1, r0, #0\n\
+ cmp r1, #0\n\
+ beq ._142 @cond_branch\n\
+ ldr r1, ._144 + 4 @ \n\
+ mov r2, #0x80\n\
+ lsl r2, r2, #0x1\n\
+ add r0, r2, #0\n\
+ strh r0, [r1]\n\
+ b ._146\n\
+._145:\n\
+ .align 2, 0\n\
+._144:\n\
+ .word +0x2018010\n\
+ .word gBattle_BG3_X\n\
+._142:\n\
+ ldr r0, ._147 @ gBattle_BG3_X\n\
+ strh r1, [r0]\n\
+ b ._146\n\
+._148:\n\
+ .align 2, 0\n\
+._147:\n\
+ .word gBattle_BG3_X\n\
+._76:\n\
+ bl sub_809EBC4\n\
+ ldr r0, ._151 @ \n\
+ add r0, r0, #0x79\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq ._149 @cond_branch\n\
+ mov r0, #0x0\n\
+ mov r1, #0x0\n\
+ bl sub_80A1488\n\
+ mov r0, #0x0\n\
+ mov r1, #0x0\n\
+ bl sub_80A1654\n\
+ b ._150\n\
+._152:\n\
+ .align 2, 0\n\
+._151:\n\
+ .word +0x2018000\n\
+._149:\n\
+ mov r0, #0xa\n\
+ mov r1, #0x0\n\
+ bl sub_80A1488\n\
+ mov r0, #0xa\n\
+ mov r1, #0x0\n\
+ bl sub_80A1654\n\
+._150:\n\
+ bl PrintSummaryWindowHeaderText\n\
+ ldr r1, ._154 @ gMain\n\
+ ldr r2, ._154 + 4 @ 0x43c\n\
+ add r1, r1, r2\n\
+ b ._153\n\
+._155:\n\
+ .align 2, 0\n\
+._154:\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._77:\n\
+ bl sub_8055870\n\
+ cmp r0, #0x1\n\
+ beq ._157 @cond_branch\n\
+._146:\n\
+ ldr r1, ._158 @ gMain\n\
+ ldr r0, ._158 + 4 @ 0x43c\n\
+ add r1, r1, r0\n\
+._153:\n\
+ ldrb r0, [r1]\n\
+ add r0, r0, #0x1\n\
+ strb r0, [r1]\n\
+ b ._157\n\
+._159:\n\
+ .align 2, 0\n\
+._158:\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._51:\n\
+ ldr r0, ._162 @ sub_809D85C\n\
+ bl SetVBlankCallback\n\
+ mov r0, #0x1\n\
+ str r0, [sp]\n\
+ mov r0, #0xff\n\
+ mov r1, #0x0\n\
+ mov r2, #0x10\n\
+ mov r3, #0x0\n\
+ bl BeginHardwarePaletteFade\n\
+ ldr r0, ._162 + 4 @ sub_809D844\n\
+ bl SetMainCallback2\n\
+ ldr r2, ._162 + 8 @ gPaletteFade\n\
+ ldrb r1, [r2, #0x8]\n\
+ mov r0, #0x7f\n\
+ and r0, r0, r1\n\
+ strb r0, [r2, #0x8]\n\
+ ldr r0, ._162 + 12 @ gLinkOpen\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0x1\n\
+ bne ._160 @cond_branch\n\
+ ldr r0, ._162 + 16 @ 0x600dde0\n\
+ mov r1, #0x80\n\
+ lsl r1, r1, #0x8\n\
+ ldr r2, ._162 + 20 @ 0x600f000\n\
+ mov r3, #0x3\n\
+ bl debug_sub_8008218\n\
+._160:\n\
+ mov r0, #0x1\n\
+ b ._161\n\
+._163:\n\
+ .align 2, 0\n\
+._162:\n\
+ .word sub_809D85C+1\n\
+ .word sub_809D844+1\n\
+ .word gPaletteFade\n\
+ .word gLinkOpen\n\
+ .word 0x600dde0\n\
+ .word 0x600f000\n\
+._157:\n\
+ mov r0, #0x0\n\
+._161:\n\
+ add sp, sp, #0x8\n\
+ pop {r4, r5, r6, r7}\n\
+ pop {r1}\n\
+ bx r1");
+}
+#else
bool8 sub_809DA84(void)
{
switch (gMain.state)
@@ -846,13 +1367,15 @@ bool8 sub_809DA84(void)
return FALSE;
}
+#endif
static void sub_809DE44(void)
{
- while (sub_809DA84() != TRUE && sub_80F9344() != TRUE);
+ while (sub_809DA84() != TRUE && sub_80F9344() != TRUE)
+ ;
}
-static void sub_809DE64(void)
+/*static*/ void sub_809DE64(void)
{
REG_BG0CNT = 0x1E08;
REG_BG1CNT = 0x4801;
@@ -879,7 +1402,7 @@ static void sub_809DE64(void)
REG_DISPCNT = 0x1F40;
}
-static bool8 LoadPokemonSummaryScreenGraphics(void)
+/*static*/ bool8 LoadPokemonSummaryScreenGraphics(void)
{
switch (pssData.loadGfxState)
{
@@ -929,23 +1452,23 @@ static bool8 LoadPokemonSummaryScreenGraphics(void)
return FALSE;
}
-static void sub_809E044(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)
@@ -1508,7 +2031,7 @@ static void sub_809EB40(u8 taskId)
}
}
-static void sub_809EBC4(void)
+/*static*/ void sub_809EBC4(void)
{
if (pssData.page != PSS_PAGE_INFO)
{
@@ -2245,7 +2768,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);
}
}
@@ -2566,14 +3089,14 @@ 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);
@@ -4875,7 +5398,7 @@ static void sub_80A1888(struct Sprite *sprite)
}
}
-static void sub_80A18C4(void)
+/*static*/ void sub_80A18C4(void)
{
u8 i;
@@ -4899,7 +5422,7 @@ static void sub_80A1918(u8 a, u8 invisible)
gSprites[ewram1A000[a]].invisible = invisible;
}
-static void sub_80A1950(void)
+/*static*/ void sub_80A1950(void)
{
u8 i;
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/rom3.c b/src/rom3.c
index 000de8356..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)
diff --git a/src/rom6.c b/src/rom6.c
index f1cd87164..09f6faac2 100644
--- a/src/rom6.c
+++ b/src/rom6.c
@@ -1,4 +1,6 @@
#include "global.h"
+#include "constants/map_objects.h"
+#include "constants/songs.h"
#include "rom6.h"
#include "braille_puzzles.h"
#include "field_effect.h"
@@ -8,7 +10,6 @@
#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_8077ABC.c b/src/rom_8077ABC.c
index 11a71155d..395736d03 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
{
@@ -635,7 +636,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 +650,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)
{
@@ -765,14 +768,14 @@ void sub_80786EC(struct Sprite *sprite)
{
sprite->data[1] = sprite->pos1.x;
sprite->data[3] = sprite->pos1.y;
- obj_translate_based_on_private_1_2_3_4(sprite);
+ 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 +801,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 +853,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 +940,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 +955,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 +1022,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 +1032,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 +1040,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);
}
@@ -1379,7 +1382,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 +1394,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,19 +1417,20 @@ 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];
@@ -1431,7 +1443,7 @@ void sub_80794A8(struct Sprite *sprite)
void sub_8079518(struct Sprite *sprite)
{
- if (sub_8078718(sprite))
+ if (TranslateAnimSpriteLinearAndSine(sprite))
DestroyAnimSprite(sprite);
}
@@ -1451,7 +1463,7 @@ void sub_8079534(struct Sprite *sprite)
}
if (!gBattleAnimArgs[5])
{
- sub_80787B0(sprite, r4);
+ InitAnimSpritePos(sprite, r4);
slot = gAnimBankAttacker;
}
else
@@ -1465,7 +1477,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);
}
@@ -1970,7 +1982,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 +2118,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 +2146,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 +2349,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/roulette.c b/src/roulette.c
index 41e8ef77f..9197fe6be 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
+u8 gUnknown_Debug_03005FB8;
+#endif
+
+#define static
+
static void sub_81150FC(void);
static void sub_8115124(void);
static void sub_8115238(void);
@@ -308,7 +315,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[4] = { 0 };
+#endif
void sub_81150FC(void)
@@ -348,22 +358,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 +379,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,179 +392,316 @@ 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
+
+#if DEBUG
__attribute__((naked))
-void sub_8115238(void)
+void sub_8115384(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");
+ asm("\
+ push {r4, lr}\n\
+ add sp, sp, #0xfffffffc\n\
+ ldr r1, ._35 @ gUnknown_Debug_03005FB8\n\
+ ldr r0, ._35 + 4 @ 0x2019000\n\
+ str r0, [r1]\n\
+ ldr r1, ._35 + 8 @ gMain\n\
+ ldr r2, ._35 + 12 @ 0x43c\n\
+ add r0, r1, r2\n\
+ ldrb r0, [r0]\n\
+ add r2, r1, #0\n\
+ cmp r0, #0x7\n\
+ bls ._33 @cond_branch\n\
+ b ._64\n\
+._33:\n\
+ lsl r0, r0, #0x2\n\
+ ldr r1, ._35 + 16 @ \n\
+ add r0, r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+._36:\n\
+ .align 2, 0\n\
+._35:\n\
+ .word gUnknown_Debug_03005FB8\n\
+ .word 0x2019000\n\
+ .word gMain\n\
+ .word 0x43c\n\
+ .word ._37\n\
+._37:\n\
+ .word ._38\n\
+ .word ._39\n\
+ .word ._40\n\
+ .word ._41\n\
+ .word ._42\n\
+ .word ._43\n\
+ .word ._44\n\
+ .word ._45\n\
+._38:\n\
+ mov r0, #0x0\n\
+ bl SetVBlankCallback\n\
+ bl ScanlineEffect_Stop\n\
+ bl ClearVideoCallbacks\n\
+ bl sub_80F9368\n\
+ ldr r1, ._47 @ 0x400000c\n\
+ ldr r3, ._47 + 4 @ 0x4686\n\
+ add r0, r3, #0\n\
+ strh r0, [r1]\n\
+ sub r1, r1, #0x2\n\
+ ldr r2, ._47 + 8 @ 0x4401\n\
+ add r0, r2, #0\n\
+ strh r0, [r1]\n\
+ add r1, r1, #0x46\n\
+ mov r3, #0x90\n\
+ lsl r3, r3, #0x6\n\
+ add r0, r3, #0\n\
+ strh r0, [r1]\n\
+ add r1, r1, #0x2\n\
+ ldr r2, ._47 + 12 @ 0x60a\n\
+ add r0, r2, #0\n\
+ strh r0, [r1]\n\
+ ldr r0, ._47 + 16 @ gUnknown_08E8096C\n\
+ mov r1, #0xc0\n\
+ lsl r1, r1, #0x13\n\
+ bl LZ77UnCompVram\n\
+ ldr r0, ._47 + 20 @ gRouletteWheelTiles\n\
+ ldr r1, ._47 + 24 @ 0x6004000\n\
+ bl LZ77UnCompVram\n\
+ ldr r1, ._47 + 28 @ gMain\n\
+ ldr r3, ._47 + 32 @ 0x43c\n\
+ add r1, r1, r3\n\
+ b ._61\n\
+._48:\n\
+ .align 2, 0\n\
+._47:\n\
+ .word 0x400000c\n\
+ .word 0x4686\n\
+ .word 0x4401\n\
+ .word 0x60a\n\
+ .word gUnknown_08E8096C\n\
+ .word gRouletteWheelTiles\n\
+ .word 0x6004000\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._39:\n\
+ bl ResetPaletteFade\n\
+ bl ResetSpriteData\n\
+ bl ResetTasks\n\
+ ldr r1, ._50 @ gMain\n\
+ ldr r0, ._50 + 4 @ 0x43c\n\
+ add r1, r1, r0\n\
+ b ._61\n\
+._51:\n\
+ .align 2, 0\n\
+._50:\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._40:\n\
+ ldr r0, ._53 @ gWindowTemplate_81E6C3C\n\
+ bl Text_LoadWindowTemplate\n\
+ ldr r0, ._53 + 4 @ gWindowTemplate_81E6CE4\n\
+ bl InitMenuWindow\n\
+ ldr r0, ._53 + 8 @ gUnknown_083F86BC\n\
+ mov r2, #0xe0\n\
+ lsl r2, r2, #0x1\n\
+ mov r1, #0x0\n\
+ bl LoadPalette\n\
+ ldr r1, ._53 + 12 @ gMain\n\
+ ldr r2, ._53 + 16 @ 0x43c\n\
+ add r1, r1, r2\n\
+ b ._61\n\
+._54:\n\
+ .align 2, 0\n\
+._53:\n\
+ .word gWindowTemplate_81E6C3C\n\
+ .word gWindowTemplate_81E6CE4\n\
+ .word gUnknown_083F86BC\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._41:\n\
+ bl sub_8115238\n\
+ bl ClearBGTilemapBuffers\n\
+ ldr r0, ._56 @ gUnknown_083F88BC\n\
+ ldr r1, ._56 + 4 @ 0x2018800\n\
+ bl LZ77UnCompWram\n\
+ ldr r0, ._56 + 8 @ gUnknown_083F8A60\n\
+ ldr r1, ._56 + 12 @ 0x6003000\n\
+ bl LZ77UnCompVram\n\
+ ldr r1, ._56 + 16 @ gMain\n\
+ ldr r3, ._56 + 20 @ 0x43c\n\
+ add r1, r1, r3\n\
+ b ._61\n\
+._57:\n\
+ .align 2, 0\n\
+._56:\n\
+ .word gUnknown_083F88BC\n\
+ .word 0x2018800\n\
+ .word gUnknown_083F8A60\n\
+ .word 0x6003000\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._42:\n\
+ mov r0, #0x0\n\
+ bl sub_8117838\n\
+ bl sub_811857C\n\
+ bl sub_81184D8\n\
+ bl sub_8117F2C\n\
+ bl sub_8117900\n\
+ bl sub_8117BBC\n\
+ bl sub_8117DF4\n\
+ ldr r1, ._59 @ gMain\n\
+ ldr r0, ._59 + 4 @ 0x43c\n\
+ add r1, r1, r0\n\
+ b ._61\n\
+._60:\n\
+ .align 2, 0\n\
+._59:\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._43:\n\
+ bl AnimateSprites\n\
+ bl BuildOamBuffer\n\
+ ldr r0, ._62 @ gSaveBlock1\n\
+ ldr r1, ._62 + 4 @ 0x494\n\
+ add r0, r0, r1\n\
+ ldrh r0, [r0]\n\
+ bl sub_81180F4\n\
+ mov r0, #0x6\n\
+ bl sub_81182F8\n\
+ mov r0, #0x0\n\
+ bl sub_811829C\n\
+ mov r0, #0x0\n\
+ bl sub_8117158\n\
+ mov r0, #0x0\n\
+ mov r1, #0xe\n\
+ mov r2, #0x1d\n\
+ mov r3, #0x13\n\
+ bl Menu_DrawStdWindowFrame\n\
+ ldr r0, ._62 + 8 @ gUnknown_081C4157\n\
+ mov r1, #0x1\n\
+ mov r2, #0xf\n\
+ bl Menu_PrintText\n\
+ ldr r1, ._62 + 12 @ gSpriteCoordOffsetX\n\
+ mov r2, #0x3c\n\
+ neg r2, r2\n\
+ add r0, r2, #0\n\
+ strh r0, [r1]\n\
+ ldr r1, ._62 + 16 @ gSpriteCoordOffsetY\n\
+ mov r0, #0x0\n\
+ strh r0, [r1]\n\
+ ldr r1, ._62 + 20 @ gMain\n\
+ ldr r3, ._62 + 24 @ 0x43c\n\
+ add r1, r1, r3\n\
+ b ._61\n\
+._63:\n\
+ .align 2, 0\n\
+._62:\n\
+ .word gSaveBlock1\n\
+ .word 0x494\n\
+ .word gUnknown_081C4157\n\
+ .word gSpriteCoordOffsetX\n\
+ .word gSpriteCoordOffsetY\n\
+ .word gMain\n\
+ .word 0x43c\n\
+._44:\n\
+ mov r1, #0x80\n\
+ lsl r1, r1, #0x13\n\
+ ldr r3, ._65 @ 0x1741\n\
+ add r0, r3, #0\n\
+ strh r0, [r1]\n\
+ ldr r0, ._65 + 4 @ 0x43c\n\
+ add r1, r2, r0\n\
+._61:\n\
+ ldrb r0, [r1]\n\
+ add r0, r0, #0x1\n\
+ strb r0, [r1]\n\
+ b ._64\n\
+._66:\n\
+ .align 2, 0\n\
+._65:\n\
+ .word 0x1741\n\
+ .word 0x43c\n\
+._45:\n\
+ ldr r3, ._67 @ 0x4000208\n\
+ ldrh r2, [r3]\n\
+ mov r0, #0x0\n\
+ strh r0, [r3]\n\
+ ldr r4, ._67 + 4 @ 0x4000200\n\
+ ldrh r0, [r4]\n\
+ mov r1, #0x1\n\
+ orr r0, r0, r1\n\
+ strh r0, [r4]\n\
+ strh r2, [r3]\n\
+ ldr r2, ._67 + 8 @ 0x4000004\n\
+ ldrh r0, [r2]\n\
+ mov r1, #0x8\n\
+ orr r0, r0, r1\n\
+ strh r0, [r2]\n\
+ ldr r0, ._67 + 12 @ sub_8115124\n\
+ bl SetVBlankCallback\n\
+ mov r0, #0x1\n\
+ str r0, [sp]\n\
+ mov r0, #0xff\n\
+ mov r1, #0x0\n\
+ mov r2, #0x10\n\
+ mov r3, #0x0\n\
+ bl BeginHardwarePaletteFade\n\
+ ldr r0, ._67 + 16 @ sub_81156BC\n\
+ mov r1, #0x0\n\
+ bl CreateTask\n\
+ ldr r4, ._67 + 20 @ 0x2019000\n\
+ add r1, r4, #0\n\
+ add r1, r1, #0xa4\n\
+ strb r0, [r1]\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ ldr r2, ._67 + 24 @ gTasks\n\
+ lsl r1, r0, #0x2\n\
+ add r1, r1, r0\n\
+ lsl r1, r1, #0x3\n\
+ add r1, r1, r2\n\
+ mov r0, #0x6\n\
+ strh r0, [r1, #0x14]\n\
+ ldr r0, ._67 + 28 @ gSaveBlock1\n\
+ ldr r2, ._67 + 32 @ 0x494\n\
+ add r0, r0, r2\n\
+ ldrh r0, [r0]\n\
+ strh r0, [r1, #0x22]\n\
+ ldr r0, ._67 + 36 @ sub_8115634\n\
+ mov r1, #0x1\n\
+ bl CreateTask\n\
+ add r4, r4, #0xa5\n\
+ strb r0, [r4]\n\
+ ldr r0, ._67 + 40 @ sub_81150FC\n\
+ bl SetMainCallback2\n\
+._64:\n\
+ add sp, sp, #0x4\n\
+ pop {r4}\n\
+ pop {r0}\n\
+ bx r0\n\
+._68:\n\
+ .align 2, 0\n\
+._67:\n\
+ .word 0x4000208\n\
+ .word 0x4000200\n\
+ .word 0x4000004\n\
+ .word sub_8115124+1\n\
+ .word sub_81156BC+1\n\
+ .word 0x2019000\n\
+ .word gTasks\n\
+ .word gSaveBlock1\n\
+ .word 0x494\n\
+ .word sub_8115634+1\n\
+ .word sub_81150FC+1");
}
-#endif
-
+#else
void sub_8115384(void)
{
u32 temp_IME;
@@ -651,7 +783,120 @@ void sub_8115384(void)
break;
}
}
+#endif
+#if DEBUG
+__attribute__((naked))
+void sub_8115634(u8 unused)
+{
+ asm("\
+ push {r4, r5, r6, lr}\n\
+ ldr r0, ._75 @ 0x2019000\n\
+ add r3, r0, #0\n\
+ add r3, r3, #0x21\n\
+ ldrb r1, [r3]\n\
+ add r2, r1, #1\n\
+ strb r2, [r3]\n\
+ add r2, r0, #0\n\
+ add r2, r2, #0x23\n\
+ lsl r1, r1, #0x18\n\
+ lsr r1, r1, #0x18\n\
+ add r6, r0, #0\n\
+ ldrb r2, [r2]\n\
+ cmp r1, r2\n\
+ bne ._70 @cond_branch\n\
+ mov r0, #0x0\n\
+ strb r0, [r3]\n\
+ add r2, r6, #0\n\
+ add r2, r2, #0x22\n\
+ ldrb r1, [r2]\n\
+ ldrh r0, [r6, #0x24]\n\
+ sub r0, r0, r1\n\
+ strh r0, [r6, #0x24]\n\
+ lsl r0, r0, #0x10\n\
+ cmp r0, #0\n\
+ bge ._70 @cond_branch\n\
+ ldrb r1, [r2]\n\
+ mov r2, #0xb4\n\
+ lsl r2, r2, #0x1\n\
+ add r0, r2, #0\n\
+ sub r0, r0, r1\n\
+ strh r0, [r6, #0x24]\n\
+._70:\n\
+ add r4, r6, #0\n\
+ ldrh r0, [r4, #0x24]\n\
+ bl Sin2\n\
+ lsl r0, r0, #0x10\n\
+ lsr r5, r0, #0x10\n\
+ ldrh r0, [r4, #0x24]\n\
+ bl Cos2\n\
+ lsl r0, r0, #0x10\n\
+ lsr r1, r0, #0x10\n\
+ lsl r0, r5, #0x10\n\
+ asr r0, r0, #0x10\n\
+ cmp r0, #0\n\
+ bge ._71 @cond_branch\n\
+ add r0, r0, #0xf\n\
+._71:\n\
+ lsl r0, r0, #0xc\n\
+ lsr r5, r0, #0x10\n\
+ lsl r0, r1, #0x10\n\
+ asr r0, r0, #0x10\n\
+ cmp r0, #0\n\
+ bge ._72 @cond_branch\n\
+ add r0, r0, #0xf\n\
+._72:\n\
+ asr r0, r0, #0x4\n\
+ strh r0, [r6, #0x32]\n\
+ strh r0, [r6, #0x2c]\n\
+ strh r5, [r6, #0x2e]\n\
+ lsl r0, r5, #0x10\n\
+ asr r0, r0, #0x10\n\
+ neg r0, r0\n\
+ strh r0, [r6, #0x30]\n\
+ ldr r0, ._75 + 4 @ unk_203955C\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq ._74 @cond_branch\n\
+ ldr r0, ._75 + 8 @ gMain\n\
+ ldrh r1, [r0, #0x2e]\n\
+ mov r0, #0x8\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._74 @cond_branch\n\
+ ldr r2, ._75 + 12 @ gTasks\n\
+ add r0, r6, #0\n\
+ add r0, r0, #0xa4\n\
+ ldrb r1, [r0]\n\
+ lsl r0, r1, #0x2\n\
+ add r0, r0, r1\n\
+ lsl r0, r0, #0x3\n\
+ add r0, r0, r2\n\
+ ldr r1, ._75 + 16 @ sub_81157AC\n\
+ str r1, [r0]\n\
+ ldr r0, ._75 + 20 @ gMPlay_SE1\n\
+ bl m4aMPlayStop\n\
+ ldr r0, ._75 + 24 @ gMPlay_SE2\n\
+ bl m4aMPlayStop\n\
+ ldr r0, ._75 + 28 @ gMPlay_SE3\n\
+ bl m4aMPlayStop\n\
+._74:\n\
+ pop {r4, r5, r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+._76:\n\
+ .align 2, 0\n\
+._75:\n\
+ .word 0x2019000\n\
+ .word unk_203955C\n\
+ .word gMain\n\
+ .word gTasks\n\
+ .word sub_81157AC+1\n\
+ .word gMPlay_SE1\n\
+ .word gMPlay_SE2\n\
+ .word gMPlay_SE3");
+}
+#else
void sub_8115634(u8 unused)
{
s16 sin;
@@ -672,6 +917,7 @@ void sub_8115634(u8 unused)
eRoulette->var2C.b = sin;
eRoulette->var2C.c = -sin;
}
+#endif
void sub_81156BC(u8 taskid)
{
@@ -790,6 +1036,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 +1081,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 +1279,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 +1306,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 +1329,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]);
@@ -1510,9 +1515,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,7 +1598,69 @@ void sub_8116AB0(u8 taskid)
gTasks[taskid].func = &sub_8116B40;
}
-void sub_8116B40(u8 taskid) // end oulette ?
+#if DEBUG
+__attribute__((naked))
+void sub_8116B40(u8 taskid) // end roulette ?
+{
+ asm("\
+ push {r4, r5, r6, lr}\n\
+ lsl r0, r0, #0x18\n\
+ lsr r6, r0, #0x18\n\
+ bl UpdatePaletteFade\n\
+ lsl r0, r0, #0x18\n\
+ lsr r5, r0, #0x18\n\
+ cmp r5, #0\n\
+ bne ._380 @cond_branch\n\
+ mov r0, #0x0\n\
+ bl SetVBlankCallback\n\
+ ldr r0, ._381 @ 0x2019000\n\
+ mov r2, #0xbe\n\
+ lsl r2, r2, #0x1\n\
+ mov r1, #0x0\n\
+ bl memset\n\
+ ldr r1, ._381 + 4 @ gSpriteCoordOffsetX\n\
+ ldr r0, ._381 + 8 @ gSpriteCoordOffsetY\n\
+ mov r4, #0x0\n\
+ strh r5, [r0]\n\
+ strh r5, [r1]\n\
+ bl sub_80F9368\n\
+ bl FreeAllSpritePalettes\n\
+ bl ResetPaletteFade\n\
+ bl ResetSpriteData\n\
+ bl ClearBGTilemapBuffers\n\
+ ldr r0, ._381 + 12 @ 0x4000050\n\
+ strh r5, [r0]\n\
+ add r0, r0, #0x2\n\
+ strh r5, [r0]\n\
+ add r0, r0, #0x2\n\
+ strh r5, [r0]\n\
+ ldr r1, ._381 + 16 @ gFieldCallback\n\
+ ldr r0, ._381 + 20 @ sub_8080990\n\
+ str r0, [r1]\n\
+ ldr r0, ._381 + 24 @ c2_exit_to_overworld_2_switch\n\
+ bl SetMainCallback2\n\
+ add r0, r6, #0\n\
+ bl DestroyTask\n\
+ ldr r0, ._381 + 28 @ unk_203955C\n\
+ strb r4, [r0]\n\
+._380:\n\
+ pop {r4, r5, r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+._382:\n\
+ .align 2, 0\n\
+._381:\n\
+ .word 0x2019000\n\
+ .word gSpriteCoordOffsetX\n\
+ .word gSpriteCoordOffsetY\n\
+ .word 0x4000050\n\
+ .word gFieldCallback\n\
+ .word sub_8080990+1\n\
+ .word c2_exit_to_overworld_2_switch+1\n\
+ .word unk_203955C");
+}
+#else
+void sub_8116B40(u8 taskid) // end roulette ?
{
if (UpdatePaletteFade() == 0)
{
@@ -1613,6 +1680,7 @@ void sub_8116B40(u8 taskid) // end oulette ?
DestroyTask(taskid);
}
}
+#endif
void sub_8116BC0(u8 taskid)
{
@@ -1676,6 +1744,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;
@@ -1733,15 +1803,12 @@ 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)
{
@@ -1751,386 +1818,77 @@ 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);
+ sub_8124E2C(gBGTilemapBuffers[1], (u16 *)ewram18800, 0xE, 0x7, 0x10, 0xD);
switch(r0)
{
case 0x0:
@@ -2153,421 +1911,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)
+ case 3:
+ r0 = r0 / 5 - 1;
+ if (eRoulette->var16[r0] > 3)
return 0x0;
- return var0[eRoulette->var16[z] + 0x1];
- case 0x4:
- t = r0 - 0x1;
- if (eRoulette->var12[t] > 0x2)
- return 0x0;
- return var0[eRoulette->var12[t] + 0x2];
- case 0xC:
+ 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 +2010,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,6 +2075,386 @@ void Task_Roulette_0(u8 taskid)
}
}
+#if DEBUG
+
+__attribute__((naked))
+void debug_sub_812CDE4()
+{
+ asm("\
+ push {r4, r5, lr}\n\
+ lsl r0, r0, #0x18\n\
+ lsr r3, r0, #0x18\n\
+ add r4, r3, #0\n\
+ ldr r0, ._575 @ gMain\n\
+ ldrh r1, [r0, #0x2e]\n\
+ mov r0, #0x1\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._572 @cond_branch\n\
+ ldr r1, ._575 + 4 @ gTasks\n\
+ lsl r0, r3, #0x2\n\
+ add r0, r0, r3\n\
+ lsl r0, r0, #0x3\n\
+ add r2, r0, r1\n\
+ ldrh r0, [r2, #0x22]\n\
+ add r0, r0, #0x1\n\
+ strh r0, [r2, #0x22]\n\
+ lsl r0, r0, #0x10\n\
+ ldr r1, ._575 + 8 @ 0x27100000\n\
+ cmp r0, r1\n\
+ bne ._573 @cond_branch\n\
+ mov r0, #0x0\n\
+ strh r0, [r2, #0x22]\n\
+._573:\n\
+ ldr r0, ._575 + 12 @ gStringVar1\n\
+ mov r3, #0x22\n\
+ ldsh r1, [r2, r3]\n\
+ b ._584\n\
+._576:\n\
+ .align 2, 0\n\
+._575:\n\
+ .word gMain\n\
+ .word gTasks\n\
+ .word 0x27100000\n\
+ .word gStringVar1\n\
+._572:\n\
+ mov r0, #0x2\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._577 @cond_branch\n\
+ ldr r1, ._580 @ gTasks\n\
+ lsl r0, r3, #0x2\n\
+ add r0, r0, r3\n\
+ lsl r0, r0, #0x3\n\
+ add r2, r0, r1\n\
+ ldrh r0, [r2, #0x22]\n\
+ sub r0, r0, #0x1\n\
+ strh r0, [r2, #0x22]\n\
+ lsl r0, r0, #0x10\n\
+ asr r0, r0, #0x10\n\
+ mov r1, #0x1\n\
+ neg r1, r1\n\
+ cmp r0, r1\n\
+ bne ._578 @cond_branch\n\
+ ldr r0, ._580 + 4 @ 0x270f\n\
+ strh r0, [r2, #0x22]\n\
+._578:\n\
+ ldr r0, ._580 + 8 @ gStringVar1\n\
+ mov r3, #0x22\n\
+ ldsh r1, [r2, r3]\n\
+ b ._584\n\
+._581:\n\
+ .align 2, 0\n\
+._580:\n\
+ .word gTasks\n\
+ .word 0x270f\n\
+ .word gStringVar1\n\
+._577:\n\
+ mov r0, #0x80\n\
+ lsl r0, r0, #0x1\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._582 @cond_branch\n\
+ ldr r1, ._585 @ gTasks\n\
+ lsl r0, r3, #0x2\n\
+ add r0, r0, r3\n\
+ lsl r0, r0, #0x3\n\
+ add r2, r0, r1\n\
+ ldrh r3, [r2, #0x22]\n\
+ add r0, r3, #0\n\
+ add r0, r0, #0xa\n\
+ strh r0, [r2, #0x22]\n\
+ lsl r0, r0, #0x10\n\
+ ldr r1, ._585 + 4 @ 0x270f0000\n\
+ cmp r0, r1\n\
+ ble ._583 @cond_branch\n\
+ ldr r1, ._585 + 8 @ 0xffffd8fb\n\
+ add r0, r3, r1\n\
+ strh r0, [r2, #0x22]\n\
+._583:\n\
+ ldr r0, ._585 + 12 @ gStringVar1\n\
+ mov r3, #0x22\n\
+ ldsh r1, [r2, r3]\n\
+ b ._584\n\
+._586:\n\
+ .align 2, 0\n\
+._585:\n\
+ .word gTasks\n\
+ .word 0x270f0000\n\
+ .word 0xffffd8fb\n\
+ .word gStringVar1\n\
+._582:\n\
+ mov r0, #0x80\n\
+ lsl r0, r0, #0x2\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._587 @cond_branch\n\
+ ldr r0, ._590 @ gTasks\n\
+ lsl r1, r3, #0x2\n\
+ add r1, r1, r3\n\
+ lsl r1, r1, #0x3\n\
+ add r1, r1, r0\n\
+ ldrh r2, [r1, #0x22]\n\
+ add r0, r2, #0\n\
+ sub r0, r0, #0xa\n\
+ strh r0, [r1, #0x22]\n\
+ lsl r0, r0, #0x10\n\
+ cmp r0, #0\n\
+ bge ._588 @cond_branch\n\
+ ldr r3, ._590 + 4 @ 0x2705\n\
+ add r0, r2, r3\n\
+ strh r0, [r1, #0x22]\n\
+._588:\n\
+ ldr r0, ._590 + 8 @ gStringVar1\n\
+ mov r2, #0x22\n\
+ ldsh r1, [r1, r2]\n\
+._584:\n\
+ mov r2, #0x1\n\
+ mov r3, #0x4\n\
+ bl ConvertIntToDecimalStringN\n\
+ ldr r4, ._590 + 12 @ gStringVar4\n\
+ ldr r1, ._590 + 16 @ gOtherText_Coins\n\
+ add r0, r4, #0\n\
+ bl StringExpandPlaceholders\n\
+ add r0, r4, #0\n\
+ mov r1, #0x9\n\
+ mov r2, #0x1\n\
+ bl MenuPrint_RightAligned\n\
+ b ._596\n\
+._591:\n\
+ .align 2, 0\n\
+._590:\n\
+ .word gTasks\n\
+ .word 0x2705\n\
+ .word gStringVar1\n\
+ .word gStringVar4\n\
+ .word gOtherText_Coins\n\
+._587:\n\
+ mov r0, #0x8\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._592 @cond_branch\n\
+ ldr r0, ._594 @ gSaveBlock1\n\
+ ldr r2, ._594 + 4 @ gTasks\n\
+ lsl r1, r3, #0x2\n\
+ add r1, r1, r3\n\
+ lsl r1, r1, #0x3\n\
+ add r1, r1, r2\n\
+ ldrh r2, [r1, #0x22]\n\
+ ldr r3, ._594 + 8 @ 0x494\n\
+ add r0, r0, r3\n\
+ mov r5, #0x0\n\
+ strh r2, [r0]\n\
+ ldr r0, ._594 + 12 @ Task_Roulette_0\n\
+ str r0, [r1]\n\
+ ldr r0, ._594 + 16 @ gStringVar1\n\
+ mov r2, #0x22\n\
+ ldsh r1, [r1, r2]\n\
+ mov r2, #0x1\n\
+ mov r3, #0x4\n\
+ bl ConvertIntToDecimalStringN\n\
+ ldr r4, ._594 + 20 @ gStringVar4\n\
+ ldr r1, ._594 + 24 @ gOtherText_Coins\n\
+ add r0, r4, #0\n\
+ bl StringExpandPlaceholders\n\
+ add r0, r4, #0\n\
+ mov r1, #0x9\n\
+ mov r2, #0x1\n\
+ bl MenuPrint_RightAligned\n\
+ ldr r0, ._594 + 28 @ unk_2039560\n\
+ strb r5, [r0]\n\
+ b ._596\n\
+._595:\n\
+ .align 2, 0\n\
+._594:\n\
+ .word gSaveBlock1\n\
+ .word gTasks\n\
+ .word 0x494\n\
+ .word Task_Roulette_0+1\n\
+ .word gStringVar1\n\
+ .word gStringVar4\n\
+ .word gOtherText_Coins\n\
+ .word unk_2039560\n\
+._592:\n\
+ mov r0, #0x4\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._596 @cond_branch\n\
+ ldr r0, ._597 @ gSaveBlock1\n\
+ ldr r2, ._597 + 4 @ gTasks\n\
+ lsl r1, r4, #0x2\n\
+ add r1, r1, r4\n\
+ lsl r1, r1, #0x3\n\
+ add r1, r1, r2\n\
+ ldrh r2, [r1, #0x22]\n\
+ ldr r3, ._597 + 8 @ 0x494\n\
+ add r0, r0, r3\n\
+ strh r2, [r0]\n\
+ ldr r0, ._597 + 12 @ Task_Roulette_0\n\
+ str r0, [r1]\n\
+ ldr r0, ._597 + 16 @ gStringVar1\n\
+ mov r2, #0x22\n\
+ ldsh r1, [r1, r2]\n\
+ mov r2, #0x1\n\
+ mov r3, #0x4\n\
+ bl ConvertIntToDecimalStringN\n\
+ ldr r4, ._597 + 20 @ gStringVar4\n\
+ ldr r1, ._597 + 24 @ gOtherText_Coins\n\
+ add r0, r4, #0\n\
+ bl StringExpandPlaceholders\n\
+ add r0, r4, #0\n\
+ mov r1, #0x9\n\
+ mov r2, #0x1\n\
+ bl MenuPrint_RightAligned\n\
+ ldr r1, ._597 + 28 @ unk_2039560\n\
+ mov r0, #0x1\n\
+ strb r0, [r1]\n\
+._596:\n\
+ pop {r4, r5}\n\
+ pop {r0}\n\
+ bx r0\n\
+._598:\n\
+ .align 2, 0\n\
+._597:\n\
+ .word gSaveBlock1\n\
+ .word gTasks\n\
+ .word 0x494\n\
+ .word Task_Roulette_0+1\n\
+ .word gStringVar1\n\
+ .word gStringVar4\n\
+ .word gOtherText_Coins\n\
+ .word unk_2039560");
+}
+
+__attribute__((naked))
+void debug_sub_812CFE8()
+{
+ asm("\
+ push {r4, r5, lr}\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ ldr r2, ._600 @ gTasks\n\
+ lsl r1, r0, #0x2\n\
+ add r1, r1, r0\n\
+ lsl r1, r1, #0x3\n\
+ add r5, r1, r2\n\
+ ldr r0, ._600 + 4 @ gSaveBlock1\n\
+ ldr r1, ._600 + 8 @ 0x494\n\
+ add r0, r0, r1\n\
+ ldrh r0, [r0]\n\
+ strh r0, [r5, #0x22]\n\
+ bl Random\n\
+ mov r1, #0x1\n\
+ and r1, r1, r0\n\
+ cmp r1, #0\n\
+ beq ._599 @cond_branch\n\
+ ldr r0, ._600 + 12 @ gSpecialVar_0x8004\n\
+ ldrh r1, [r0]\n\
+ mov r2, #0x80\n\
+ orr r1, r1, r2\n\
+ strh r1, [r0]\n\
+._599:\n\
+ ldr r0, ._600 + 16 @ gStringVar1\n\
+ mov r2, #0x22\n\
+ ldsh r1, [r5, r2]\n\
+ mov r2, #0x1\n\
+ mov r3, #0x4\n\
+ bl ConvertIntToDecimalStringN\n\
+ ldr r4, ._600 + 20 @ gStringVar4\n\
+ ldr r1, ._600 + 24 @ gOtherText_Coins\n\
+ add r0, r4, #0\n\
+ bl StringExpandPlaceholders\n\
+ mov r0, #0x0\n\
+ mov r1, #0x0\n\
+ mov r2, #0x9\n\
+ mov r3, #0x3\n\
+ bl Menu_DrawStdWindowFrame\n\
+ add r0, r4, #0\n\
+ mov r1, #0x9\n\
+ mov r2, #0x1\n\
+ bl MenuPrint_RightAligned\n\
+ mov r0, #0x0\n\
+ mov r1, #0xe\n\
+ mov r2, #0x1d\n\
+ mov r3, #0x13\n\
+ bl Menu_DrawStdWindowFrame\n\
+ ldr r0, ._600 + 28 @ gUnknown_Debug_0842510D\n\
+ mov r1, #0x1\n\
+ mov r2, #0xf\n\
+ bl Menu_PrintText\n\
+ ldr r0, ._600 + 32 @ debug_sub_812CDE4\n\
+ str r0, [r5]\n\
+ pop {r4, r5}\n\
+ pop {r0}\n\
+ bx r0\n\
+._601:\n\
+ .align 2, 0\n\
+._600:\n\
+ .word gTasks\n\
+ .word gSaveBlock1\n\
+ .word 0x494\n\
+ .word gSpecialVar_0x8004\n\
+ .word gStringVar1\n\
+ .word gStringVar4\n\
+ .word gOtherText_Coins\n\
+ .word gUnknown_Debug_0842510D\n\
+ .word debug_sub_812CDE4+1");
+}
+
+#endif
+
+#if DEBUG
+__attribute__((naked))
+void PlayRoulette(void)
+{
+ asm("\
+ push {lr}\n\
+ bl ScriptContext2_Enable\n\
+ ldr r1, ._604 @ unk_2039560\n\
+ mov r0, #0x0\n\
+ strb r0, [r1]\n\
+ ldr r0, ._604 + 4 @ unk_203955C\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq ._602 @cond_branch\n\
+ ldr r0, ._604 + 8 @ debug_sub_812CFE8\n\
+ mov r1, #0x0\n\
+ bl CreateTask\n\
+ b ._603\n\
+._605:\n\
+ .align 2, 0\n\
+._604:\n\
+ .word unk_2039560\n\
+ .word unk_203955C\n\
+ .word debug_sub_812CFE8+1\n\
+._602:\n\
+ ldr r0, ._606 @ Task_Roulette_0\n\
+ mov r1, #0x0\n\
+ bl CreateTask\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ ldr r2, ._606 + 4 @ gTasks\n\
+ lsl r1, r0, #0x2\n\
+ add r1, r1, r0\n\
+ lsl r1, r1, #0x3\n\
+ add r1, r1, r2\n\
+ ldr r0, ._606 + 8 @ gSaveBlock1\n\
+ ldr r2, ._606 + 12 @ 0x494\n\
+ add r0, r0, r2\n\
+ ldrh r0, [r0]\n\
+ strh r0, [r1, #0x22]\n\
+._603:\n\
+ pop {r0}\n\
+ bx r0\n\
+._607:\n\
+ .align 2, 0\n\
+._606:\n\
+ .word Task_Roulette_0+1\n\
+ .word gTasks\n\
+ .word gSaveBlock1\n\
+ .word 0x494");
+}
+#else
void PlayRoulette(void)
{
u8 taskid;
@@ -2698,6 +2462,7 @@ void PlayRoulette(void)
taskid = CreateTask(&Task_Roulette_0, 0x0);
gTasks[taskid].data[0xD] = gSaveBlock1.coins;
}
+#endif
void sub_8117838(u8 r0)
{
@@ -2883,111 +2648,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;
+ 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;
}
-#else
-__attribute__((naked))
-void sub_8117E98(struct Sprite *r0)
-{
-asm(".syntax unified\n\
-push {r4-r6,lr}\n\
-adds r6, r0, 0\n\
-ldr r0, _08117F1C @ =0x02019000\n\
-ldrh r1, [r6, 0x2E]\n\
-ldrh r0, [r0, 0x24]\n\
-adds r1, r0\n\
-lsls r1, 16\n\
-lsrs r4, r1, 16\n\
-asrs r1, 16\n\
-ldr r0, _08117F20 @ =0x00000167\n\
-cmp r1, r0\n\
-ble _08117EB8\n\
-ldr r2, _08117F24 @ =0xfffffe98\n\
-adds r0, r1, r2\n\
-lsls r0, 16\n\
-lsrs r4, r0, 16\n\
-_08117EB8:\n\
-adds r0, r4, 0\n\
-bl Sin2\n\
-lsls r0, 16\n\
-lsrs r5, r0, 16\n\
-adds r0, r4, 0\n\
-bl Cos2\n\
-lsls r2, r5, 16\n\
-asrs r2, 16\n\
-movs r3, 0x30\n\
-ldrsh r1, [r6, r3]\n\
-muls r1, r2\n\
-asrs r1, 12\n\
-strh r1, [r6, 0x24]\n\
-lsls r0, 16\n\
-asrs r4, r0, 16\n\
-negs r1, r4\n\
-movs r3, 0x30\n\
-ldrsh r0, [r6, r3]\n\
-muls r0, r1\n\
-asrs r0, 12\n\
-strh r0, [r6, 0x26]\n\
-ldrb r0, [r6, 0x3]\n\
-lsls r0, 26\n\
-lsrs r3, r0, 27\n\
-cmp r2, 0\n\
-bge _08117EF2\n\
-adds r2, 0xF\n\
-_08117EF2:\n\
-lsls r0, r2, 12\n\
-lsrs r5, r0, 16\n\
-ldr r1, _08117F28 @ =gOamMatrices\n\
-lsls r0, r3, 3\n\
-adds r1, r0, r1\n\
-adds r0, r4, 0\n\
-cmp r0, 0\n\
-bge _08117F04\n\
-adds r0, 0xF\n\
-_08117F04:\n\
-asrs r0, 4\n\
-strh r0, [r1, 0x6]\n\
-strh r0, [r1]\n\
-strh r5, [r1, 0x2]\n\
-lsls r0, r5, 16\n\
-asrs r0, 16\n\
-negs r0, r0\n\
-strh r0, [r1, 0x4]\n\
-pop {r4-r6}\n\
-pop {r0}\n\
-bx r0\n\
-.align 2, 0\n\
-_08117F1C: .4byte 0x02019000\n\
-_08117F20: .4byte 0x00000167\n\
-_08117F24: .4byte 0xfffffe98\n\
-_08117F28: .4byte gOamMatrices\n\
-.syntax divided\n");
-}
-#endif
void sub_8117F2C(void)
{
@@ -3045,132 +2724,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;
+ 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)
{
@@ -3591,7 +3170,99 @@ void sub_8118D2C(struct Sprite *sprite)
}
}
-#ifdef NONMATCHING
+#if DEBUG
+__attribute__((naked))
+void debug_sub_812E698()
+{
+ asm("\
+ push {r4, r5, r6, r7, lr}\n\
+ add r7, r0, #0\n\
+ bl sub_8118724\n\
+ mov r0, #0x0\n\
+ strh r0, [r7, #0x32]\n\
+ add r0, r7, #0\n\
+ bl sub_81186B8\n\
+ mov r0, #0x38\n\
+ bl m4aSongNumStart\n\
+ bl Random\n\
+ mov r1, #0x1\n\
+ and r1, r1, r0\n\
+ cmp r1, #0\n\
+ beq ._837 @cond_branch\n\
+ ldr r4, ._839 @ 0x2019000\n\
+ add r1, r4, #0\n\
+ add r1, r1, #0x8c\n\
+ ldr r0, ._839 + 4 @ 0x0\n\
+ str r0, [r1]\n\
+ add r0, r4, #0\n\
+ add r0, r0, #0x7e\n\
+ ldrb r0, [r0]\n\
+ add r0, r0, #0x1\n\
+ mov r1, #0xc\n\
+ bl __modsi3\n\
+ add r1, r4, #0\n\
+ add r1, r1, #0x7f\n\
+ strb r0, [r1]\n\
+ add r1, r4, #0\n\
+ ldr r4, ._839 + 8 @ gUnknown_083F8DF4\n\
+ b ._838\n\
+._840:\n\
+ .align 2, 0\n\
+._839:\n\
+ .word 0x2019000\n\
+ .word 0x0\n\
+ .word gUnknown_083F8DF4\n\
+._837:\n\
+ ldr r6, ._841 @ 0x2019000\n\
+ add r5, r6, #0\n\
+ add r5, r5, #0x8c\n\
+ ldr r4, ._841 + 4 @ gUnknown_083F8DF4\n\
+ ldrb r0, [r6, #0x4]\n\
+ lsl r0, r0, #0x1e\n\
+ lsr r0, r0, #0x19\n\
+ add r1, r4, #0\n\
+ add r1, r1, #0x1c\n\
+ add r0, r0, r1\n\
+ ldr r1, [r0]\n\
+ add r0, r1, #0\n\
+ bl __addsf3\n\
+ str r0, [r5]\n\
+ add r0, r6, #0\n\
+ add r0, r0, #0x7e\n\
+ ldrb r0, [r0]\n\
+ add r1, r6, #0\n\
+ add r1, r1, #0x7f\n\
+ strb r0, [r1]\n\
+ add r1, r6, #0\n\
+._838:\n\
+ mov r0, #0x1\n\
+ strh r0, [r7, #0x2e]\n\
+ ldrb r0, [r1, #0x4]\n\
+ lsl r0, r0, #0x1e\n\
+ lsr r0, r0, #0x19\n\
+ add r0, r0, r4\n\
+ ldrb r0, [r0, #0x2]\n\
+ strh r0, [r7, #0x32]\n\
+ add r1, r1, #0x98\n\
+ ldr r0, ._841 + 8 @ 0x3dae147b\n\
+ str r0, [r1]\n\
+ ldr r0, ._841 + 12 @ sub_8118D2C\n\
+ str r0, [r7, #0x1c]\n\
+ mov r0, #0x5\n\
+ strh r0, [r7, #0x30]\n\
+ pop {r4, r5, r6, r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+._842:\n\
+ .align 2, 0\n\
+._841:\n\
+ .word 0x2019000\n\
+ .word gUnknown_083F8DF4\n\
+ .word 0x3dae147b\n\
+ .word sub_8118D2C+1");
+}
+#endif
+
void sub_8118DE4(struct Sprite *sprite)
{
sub_8118724(sprite);
@@ -3607,13 +3278,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 +3302,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 +3325,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 +3336,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 +3429,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 +3464,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,333 +3528,331 @@ 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[0x1]++ >= sprite->data[0x3])
{
if ((sprite->pos1.x -= 0x2) < -0x10)
{
@@ -4523,7 +3991,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 +4000,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 +4039,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];
@@ -4580,9 +4048,9 @@ void sub_8119BCC(struct Sprite *sprite)
{
m4aSongNumStartOrChange(0x5E);
if(eRoulette->var38->data[0x0] == 0x0)
- PlayCry1(0x130, 0x3F);
+ 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 +4062,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/scene/berry_blender.c b/src/scene/berry_blender.c
index 2cb68ccf1..6eccca047 100644
--- a/src/scene/berry_blender.c
+++ b/src/scene/berry_blender.c
@@ -274,12 +274,12 @@ 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);
-static void Blender_PrintMadePokeblockString(struct Pokeblock* pokeblock, u8* dst);
-static void sub_8052BD0(u8 taskID);
+/*static*/ void Blender_PrintMadePokeblockString(struct Pokeblock* pokeblock, u8* dst);
+/*static*/ void sub_8052BD0(u8 taskID);
static void sub_8052AF8(void);
static void sub_804F8C8(u8 taskID);
static void sub_804F9F4(u8 taskID);
@@ -2015,36 +2015,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 +2048,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 +2064,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 +2081,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 +2113,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;
@@ -3270,13 +2977,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 +3102,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);
@@ -3411,7 +3123,7 @@ static bool8 Blender_PrintBlendingResults(void)
return FALSE;
}
-static void Blender_PrintMadePokeblockString(struct Pokeblock* pokeblock, u8* dst)
+/*static*/ void Blender_PrintMadePokeblockString(struct Pokeblock* pokeblock, u8* dst)
{
u8 text[12];
u8 flavourLvl, feel;
@@ -3834,7 +3546,7 @@ void ShowBerryBlenderRecordWindow(void)
}
}
-static void sub_8052BD0(u8 taskID)
+/*static*/ void sub_8052BD0(u8 taskID)
{
if (gTasks[taskID].data[0] == 0)
{
diff --git a/src/scene/cable_car.c b/src/scene/cable_car.c
index 2f2a03a2f..f52f4524d 100644
--- a/src/scene/cable_car.c
+++ b/src/scene/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"
@@ -22,15 +23,6 @@
// Static type declarations
-// Credits to Made (dolphin emoji)
-#define S16TOPOSFLOAT(val) \
-({ \
- s16 v = (val); \
- float f = (float)v; \
- if(v < 0) f += 65536.0f; \
- f; \
-})
-
struct CableCarEwramStruct1 {
u8 unk_0000;
u8 unk_0001;
@@ -103,6 +95,31 @@ static void sub_81248AC(u8);
// .rodata
+#if DEBUG
+
+u8 debug_sub_8138D74(void);
+u8 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, debug_sub_8138D74},
+ {Str_842DBDC, 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");
@@ -183,6 +200,158 @@ static const struct SpriteTemplate gSpriteTemplate_8401D40[] = {
// .text
+#if DEBUG
+
+__attribute__((naked))
+u8 debug_sub_8138C14(void)
+{
+ asm("\n\
+ push {lr}\n\
+ ldr r0, ._1 @ unk_203955C\n\
+ mov r1, #0x1\n\
+ strb r1, [r0]\n\
+ ldr r0, ._1 + 4 @ MauvilleCity_GameCorner_EventScript_1C407E\n\
+ bl ScriptContext1_SetupScript\n\
+ bl CloseMenu\n\
+ mov r0, #0x1\n\
+ pop {r1}\n\
+ bx r1\n\
+._2:\n\
+ .align 2, 0\n\
+._1:\n\
+ .word unk_203955C\n\
+ .word MauvilleCity_GameCorner_EventScript_1C407E");
+}
+
+__attribute__((naked))
+u8 debug_sub_8138C34(void)
+{
+ asm("\n\
+ push {lr}\n\
+ ldr r0, ._3 @ unk_203955C\n\
+ mov r1, #0x1\n\
+ strb r1, [r0]\n\
+ ldr r0, ._3 + 4 @ MauvilleCity_GameCorner_EventScript_1C40AC\n\
+ bl ScriptContext1_SetupScript\n\
+ bl CloseMenu\n\
+ mov r0, #0x1\n\
+ pop {r1}\n\
+ bx r1\n\
+._4:\n\
+ .align 2, 0\n\
+._3:\n\
+ .word unk_203955C\n\
+ .word MauvilleCity_GameCorner_EventScript_1C40AC");
+}
+
+__attribute__((naked))
+u8 debug_sub_8138C54(void)
+{
+ asm("\n\
+ push {r4, lr}\n\
+ ldr r4, ._10 @ gMain\n\
+ ldrh r0, [r4, #0x2e]\n\
+ cmp r0, #0x40\n\
+ bne ._5 @cond_branch\n\
+ mov r0, #0x1\n\
+ neg r0, r0\n\
+ bl Menu_MoveCursor\n\
+._5:\n\
+ ldrh r0, [r4, #0x2e]\n\
+ cmp r0, #0x80\n\
+ bne ._6 @cond_branch\n\
+ mov r0, #0x1\n\
+ bl Menu_MoveCursor\n\
+._6:\n\
+ ldrh r1, [r4, #0x2e]\n\
+ cmp r1, #0x1\n\
+ beq ._7 @cond_branch\n\
+ ldr r0, ._10 + 4 @ 0x101\n\
+ cmp r1, r0\n\
+ bne ._8 @cond_branch\n\
+ ldr r1, ._10 + 8 @ gSpecialVar_0x8004\n\
+ mov r0, #0x1\n\
+ strh r0, [r1]\n\
+._7:\n\
+ ldr r4, ._10 + 12 @ gUnkDebug4Menu\n\
+ bl Menu_GetCursorPos\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x15\n\
+ add r4, r4, #0x4\n\
+ add r0, r0, r4\n\
+ ldr r0, [r0]\n\
+ bl _call_via_r0\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ b ._13\n\
+._11:\n\
+ .align 2, 0\n\
+._10:\n\
+ .word gMain\n\
+ .word 0x101\n\
+ .word gSpecialVar_0x8004\n\
+ .word gUnkDebug4Menu\n\
+._8:\n\
+ cmp r1, #0x2\n\
+ beq ._12 @cond_branch\n\
+ mov r0, #0x0\n\
+ b ._13\n\
+._12:\n\
+ bl CloseMenu\n\
+ mov r0, #0x1\n\
+._13:\n\
+ pop {r4}\n\
+ pop {r1}\n\
+ bx r1");
+}
+
+__attribute__((naked))
+u8 debug_sub_8138CC4(void)
+{
+ asm("\n\
+ push {lr}\n\
+ add sp, sp, #0xfffffff8\n\
+ ldr r1, ._14 @ gSpecialVar_0x8004\n\
+ mov r0, #0x0\n\
+ strh r0, [r1]\n\
+ bl Menu_EraseScreen\n\
+ mov r0, #0x13\n\
+ mov r1, #0x0\n\
+ mov r2, #0x1d\n\
+ mov r3, #0xc\n\
+ bl Menu_DrawStdWindowFrame\n\
+ ldr r3, ._14 + 4 @ gUnkDebug4Menu\n\
+ mov r0, #0x14\n\
+ mov r1, #0x1\n\
+ mov r2, #0x5\n\
+ bl Menu_PrintItems\n\
+ mov r0, #0x0\n\
+ str r0, [sp]\n\
+ mov r0, #0x8\n\
+ str r0, [sp, #0x4]\n\
+ mov r0, #0x0\n\
+ mov r1, #0x14\n\
+ mov r2, #0x1\n\
+ mov r3, #0x5\n\
+ bl InitMenu\n\
+ ldr r1, ._14 + 8 @ gMenuCallback\n\
+ ldr r0, ._14 + 12 @ debug_sub_8138C54\n\
+ str r0, [r1]\n\
+ mov r0, #0x0\n\
+ add sp, sp, #0x8\n\
+ pop {r1}\n\
+ bx r1\n\
+._15:\n\
+ .align 2, 0\n\
+._14:\n\
+ .word gSpecialVar_0x8004\n\
+ .word gUnkDebug4Menu\n\
+ .word gMenuCallback\n\
+ .word debug_sub_8138C54+1");
+}
+
+#endif
+
static void CableCarTask1(u8 taskId)
{
if (!gPaletteFade.active)
@@ -199,6 +368,46 @@ void CableCar(void)
BeginNormalPaletteFade(-1, 0, 0, 16, 0);
}
+#if DEBUG
+
+__attribute__((naked))
+u8 debug_sub_8138D74(void)
+{
+ asm("\n\
+ push {lr}\n\
+ ldr r1, ._21 @ gSpecialVar_0x8004\n\
+ mov r0, #0x0\n\
+ strh r0, [r1]\n\
+ bl CloseMenu\n\
+ bl CableCar\n\
+ pop {r0}\n\
+ bx r0\n\
+._22:\n\
+ .align 2, 0\n\
+._21:\n\
+ .word gSpecialVar_0x8004");
+}
+
+__attribute__((naked))
+u8 debug_sub_8138D8C(void)
+{
+ asm("\n\
+ push {lr}\n\
+ ldr r1, ._23 @ gSpecialVar_0x8004\n\
+ mov r0, #0x1\n\
+ strh r0, [r1]\n\
+ bl CloseMenu\n\
+ bl CableCar\n\
+ pop {r0}\n\
+ bx r0\n\
+._24:\n\
+ .align 2, 0\n\
+._23:\n\
+ .word gSpecialVar_0x8004");
+}
+
+#endif
+
static void CableCarMainCallback_Setup(void)
{
u8 i;
diff --git a/src/scene/cute_sketch.c b/src/scene/cute_sketch.c
index 5317bc334..2af990290 100644
--- a/src/scene/cute_sketch.c
+++ b/src/scene/cute_sketch.c
@@ -29,6 +29,350 @@ void sub_80FD1C8(u16);
u16 sub_80FD39C(u16*);
u16 sub_80FD68C(u16*, u16*, u16*);
+#if DEBUG
+
+__attribute__((naked))
+void debug_sub_8110CCC(void)
+{
+ asm("\
+ push {r4, r5, r6, r7, lr}\n\
+ mov r7, #0x0\n\
+ mov r1, #0x0\n\
+ ldr r2, ._5 @ gUnknown_083E79C0\n\
+ ldr r6, ._5 + 4 @ \n\
+._7:\n\
+ lsl r0, r1, #0x3\n\
+ add r4, r0, r2\n\
+ ldrh r0, [r6, #0x1c]\n\
+ ldrh r3, [r4, #0x4]\n\
+ cmp r0, r3\n\
+ bne ._1 @cond_branch\n\
+ ldrh r0, [r4, #0x6]\n\
+ bl FlagGet\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ beq ._4 @cond_branch\n\
+ ldrb r0, [r6, #0x1f]\n\
+ ldr r1, [r4]\n\
+ lsl r0, r0, #0x2\n\
+ add r0, r0, r1\n\
+ ldr r0, [r0]\n\
+ bl StringLength\n\
+ mov r1, #0xc\n\
+ sub r1, r1, r0\n\
+ lsl r1, r1, #0x10\n\
+ lsr r5, r1, #0x10\n\
+ cmp r1, #0\n\
+ bge ._3 @cond_branch\n\
+ mov r5, #0x0\n\
+._3:\n\
+ mov r7, #0x1\n\
+ mov r0, #0x10\n\
+ mov r1, #0xe\n\
+ mov r2, #0x1d\n\
+ mov r3, #0x13\n\
+ bl Menu_DrawStdWindowFrame\n\
+ add r0, r6, #0\n\
+ add r0, r0, #0x8\n\
+ mov r1, #0x11\n\
+ mov r2, #0xf\n\
+ bl Menu_PrintText\n\
+ ldrb r0, [r6, #0x1f]\n\
+ ldr r1, [r4]\n\
+ lsl r0, r0, #0x2\n\
+ add r0, r0, r1\n\
+ ldr r0, [r0]\n\
+ add r1, r5, #0\n\
+ add r1, r1, #0x11\n\
+ lsl r1, r1, #0x18\n\
+ lsr r1, r1, #0x18\n\
+ mov r2, #0x11\n\
+ bl Menu_PrintText\n\
+ b ._4\n\
+._6:\n\
+ .align 2, 0\n\
+._5:\n\
+ .word gUnknown_083E79C0\n\
+ .word +0x2000000\n\
+._1:\n\
+ add r0, r1, #1\n\
+ lsl r0, r0, #0x10\n\
+ lsr r1, r0, #0x10\n\
+ cmp r1, #0\n\
+ beq ._7 @cond_branch\n\
+._4:\n\
+ cmp r7, #0\n\
+ bne ._8 @cond_branch\n\
+ mov r0, #0x10\n\
+ mov r1, #0x10\n\
+ mov r2, #0x1d\n\
+ mov r3, #0x13\n\
+ bl Menu_DrawStdWindowFrame\n\
+ ldr r0, ._9 @ \n\
+ mov r1, #0x11\n\
+ mov r2, #0x11\n\
+ bl Menu_PrintText\n\
+ mov r0, #0x10\n\
+ mov r1, #0xe\n\
+ mov r2, #0x1d\n\
+ mov r3, #0xf\n\
+ bl Menu_EraseWindowRect\n\
+._8:\n\
+ pop {r4, r5, r6, r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+._10:\n\
+ .align 2, 0\n\
+._9:\n\
+ .word +0x2000008");
+}
+
+__attribute__((naked))
+void debug_sub_8110D84(void)
+{
+ asm("\
+ push {r4, lr}\n\
+ add sp, sp, #0xfffffffc\n\
+ ldr r0, ._13 @ \n\
+ ldrh r0, [r0, #0x4]\n\
+ cmp r0, #0x7\n\
+ bls ._11 @cond_branch\n\
+ b ._65\n\
+._11:\n\
+ lsl r0, r0, #0x2\n\
+ ldr r1, ._13 + 4 @ \n\
+ add r0, r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+._14:\n\
+ .align 2, 0\n\
+._13:\n\
+ .word +0x2000000\n\
+ .word ._15\n\
+._15:\n\
+ .word ._16\n\
+ .word ._17\n\
+ .word ._18\n\
+ .word ._19\n\
+ .word ._20\n\
+ .word ._21\n\
+ .word ._22\n\
+ .word ._23\n\
+._16:\n\
+ mov r0, #0x1\n\
+ neg r0, r0\n\
+ mov r1, #0x0\n\
+ str r1, [sp]\n\
+ mov r2, #0x10\n\
+ mov r3, #0x0\n\
+ bl BeginNormalPaletteFade\n\
+ ldr r1, ._25 @ \n\
+ ldrh r0, [r1, #0x4]\n\
+ add r0, r0, #0x1\n\
+ b ._62\n\
+._26:\n\
+ .align 2, 0\n\
+._25:\n\
+ .word +0x2000000\n\
+._17:\n\
+ bl UpdatePaletteFade\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ beq ._27 @cond_branch\n\
+ b ._65\n\
+._27:\n\
+ ldr r1, ._30 @ \n\
+ ldrh r0, [r1, #0x4]\n\
+ add r0, r0, #0x1\n\
+ b ._62\n\
+._31:\n\
+ .align 2, 0\n\
+._30:\n\
+ .word +0x2000000\n\
+._18:\n\
+ bl sub_80FAB60\n\
+ lsl r0, r0, #0x18\n\
+ lsr r0, r0, #0x18\n\
+ cmp r0, #0x3\n\
+ beq ._32 @cond_branch\n\
+ cmp r0, #0x3\n\
+ bgt ._33 @cond_branch\n\
+ b ._65\n\
+._33:\n\
+ cmp r0, #0x4\n\
+ beq ._35 @cond_branch\n\
+ cmp r0, #0x5\n\
+ beq ._36 @cond_branch\n\
+ b ._65\n\
+._35:\n\
+ ldr r4, ._41 @ \n\
+ ldrb r0, [r4, #0x1e]\n\
+ cmp r0, #0\n\
+ bne ._38 @cond_branch\n\
+ b ._65\n\
+._38:\n\
+ mov r0, #0x5\n\
+ bl m4aSongNumStart\n\
+ ldr r1, ._41 + 4 @ \n\
+ add r0, r4, r1\n\
+ mov r1, #0x1\n\
+ strb r1, [r0]\n\
+ ldr r0, ._41 + 8 @ \n\
+ bl sub_80FC244\n\
+ b ._65\n\
+._42:\n\
+ .align 2, 0\n\
+._41:\n\
+ .word +0x2000000\n\
+ .word 0xa6e\n\
+ .word sub_80FC69C+1\n\
+._36:\n\
+ mov r0, #0x5\n\
+ bl m4aSongNumStart\n\
+ mov r0, #0x1\n\
+ neg r0, r0\n\
+ mov r1, #0x0\n\
+ str r1, [sp]\n\
+ mov r2, #0x0\n\
+ mov r3, #0x10\n\
+ bl BeginNormalPaletteFade\n\
+ ldr r1, ._44 @ \n\
+ ldrh r0, [r1, #0x4]\n\
+ add r0, r0, #0x1\n\
+ b ._62\n\
+._45:\n\
+ .align 2, 0\n\
+._44:\n\
+ .word +0x2000000\n\
+._19:\n\
+ bl UpdatePaletteFade\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ bne ._65 @cond_branch\n\
+ ldr r0, ._48 @ sub_805469C\n\
+ bl SetMainCallback2\n\
+ b ._65\n\
+._49:\n\
+ .align 2, 0\n\
+._48:\n\
+ .word sub_805469C+1\n\
+._20:\n\
+ bl sub_80FAB60\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ beq ._50 @cond_branch\n\
+._32:\n\
+ bl debug_sub_8110CCC\n\
+ b ._65\n\
+._50:\n\
+ ldr r0, ._54 @ gMain\n\
+ ldrh r1, [r0, #0x2e]\n\
+ mov r0, #0x1\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._65 @cond_branch\n\
+ bl sub_80FBCA0\n\
+ bl sub_80FAEC4\n\
+ ldr r1, ._54 + 4 @ \n\
+ ldrh r0, [r1, #0x4]\n\
+ add r0, r0, #0x1\n\
+ b ._62\n\
+._55:\n\
+ .align 2, 0\n\
+._54:\n\
+ .word gMain\n\
+ .word +0x2000000\n\
+._21:\n\
+ bl sub_80FAFC0\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ bne ._65 @cond_branch\n\
+ mov r0, #0x0\n\
+ mov r1, #0x0\n\
+ bl CreateRegionMapCursor\n\
+ ldr r1, ._58 @ \n\
+ ldrh r0, [r1, #0x4]\n\
+ add r0, r0, #0x1\n\
+ b ._62\n\
+._59:\n\
+ .align 2, 0\n\
+._58:\n\
+ .word +0x2000000\n\
+._22:\n\
+ bl sub_80FAB60\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ beq ._60 @cond_branch\n\
+ bl debug_sub_8110CCC\n\
+._60:\n\
+ ldr r0, ._63 @ gMain\n\
+ ldrh r1, [r0, #0x2e]\n\
+ mov r0, #0x1\n\
+ and r0, r0, r1\n\
+ cmp r0, #0\n\
+ beq ._65 @cond_branch\n\
+ bl sub_80FBCA0\n\
+ bl sub_80FAEC4\n\
+ ldr r1, ._63 + 4 @ \n\
+ ldrh r0, [r1, #0x4]\n\
+ add r0, r0, #0x1\n\
+ b ._62\n\
+._64:\n\
+ .align 2, 0\n\
+._63:\n\
+ .word gMain\n\
+ .word +0x2000000\n\
+._23:\n\
+ bl sub_80FAFC0\n\
+ lsl r0, r0, #0x18\n\
+ cmp r0, #0\n\
+ bne ._65 @cond_branch\n\
+ mov r0, #0x0\n\
+ mov r1, #0x0\n\
+ bl CreateRegionMapCursor\n\
+ ldr r1, ._66 @ \n\
+ mov r0, #0x3\n\
+._62:\n\
+ strh r0, [r1, #0x4]\n\
+._65:\n\
+ add sp, sp, #0x4\n\
+ pop {r4}\n\
+ pop {r0}\n\
+ bx r0\n\
+._67:\n\
+ .align 2, 0\n\
+._66:\n\
+ .word +0x2000000");
+}
+
+__attribute__((naked))
+void debug_sub_8110F28(void)
+{
+ asm("\
+ push {lr}\n\
+ bl CB2_InitFlyRegionMap\n\
+ ldr r0, ._69 @ gMain\n\
+ ldr r1, [r0, #0x4]\n\
+ ldr r0, ._69 + 4 @ CB2_FlyRegionMap\n\
+ cmp r1, r0\n\
+ bne ._68 @cond_branch\n\
+ bl sub_80FBF94\n\
+ ldr r0, ._69 + 8 @ debug_sub_8110D84\n\
+ bl sub_80FC244\n\
+ bl debug_sub_8110CCC\n\
+._68:\n\
+ pop {r0}\n\
+ bx r0\n\
+._70:\n\
+ .align 2, 0\n\
+._69:\n\
+ .word gMain\n\
+ .word CB2_FlyRegionMap+1\n\
+ .word debug_sub_8110D84+1");
+}
+
+#endif
+
void sub_80FC7A0(struct Unk03005E20* info)
{
gUnknown_03005DEC = info->var_4;
diff --git a/src/scene/hall_of_fame.c b/src/scene/hall_of_fame.c
index e486c65a3..2b790e97d 100644
--- a/src/scene/hall_of_fame.c
+++ b/src/scene/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/scene/intro.c b/src/scene/intro.c
index 4da341744..3e4bd5bf4 100644
--- a/src/scene/intro.c
+++ b/src/scene/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)
{
diff --git a/src/scene/intro_credits_graphics.c b/src/scene/intro_credits_graphics.c
index 7f6765ef6..6aadafc58 100644
--- a/src/scene/intro_credits_graphics.c
+++ b/src/scene/intro_credits_graphics.c
@@ -436,161 +436,47 @@ 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 r4;
s32 r2;
- r4 = (u16)gTasks[taskId].data[1] << 16;
+ r4 = gTasks[taskId].data[1];
if (r4 != 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)r4;
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;
+ r4 = gTasks[taskId].data[4];
if (r4 != 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)r4;
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;
+ r4 = gTasks[taskId].data[7];
if (r4 != 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)r4;
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/scene/new_game.c b/src/scene/new_game.c
index 0279f99c6..e64dc91e3 100644
--- a/src/scene/new_game.c
+++ b/src/scene/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,6 +110,30 @@ 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
@@ -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/scene/title_screen.c b/src/scene/title_screen.c
index 202b752a6..a1c8e081d 100644
--- a/src/scene/title_screen.c
+++ b/src/scene/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/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/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;
+ }
+}