summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle_2.c45
-rw-r--r--src/battle_interface.c17
-rw-r--r--src/battle_transition.c258
-rw-r--r--src/berry_blender.c2
-rw-r--r--src/berry_fix_program.c2
-rw-r--r--src/coord_event_weather.c119
-rw-r--r--src/decoration.c12
-rw-r--r--src/diploma.c6
-rw-r--r--src/egg_hatch.c6
-rw-r--r--src/evolution_scene.c6
-rw-r--r--src/field_map_obj.c2
-rwxr-xr-xsrc/field_map_obj_helpers.c844
-rwxr-xr-xsrc/field_message_box.c154
-rw-r--r--src/hall_of_fame.c11
-rwxr-xr-xsrc/item_use.c1271
-rw-r--r--src/link.c2
-rw-r--r--src/mail.c2
-rw-r--r--src/main.c2
-rw-r--r--src/mystery_event_menu.c303
-rw-r--r--src/naming_screen.c2177
-rw-r--r--src/option_menu.c2
-rw-r--r--src/palette.c1
-rw-r--r--src/pokeblock.c4
-rw-r--r--src/pokeblock_feed.c2
-rw-r--r--src/pokemon_3.c11
-rw-r--r--src/pokemon_animation.c5658
-rw-r--r--src/pokemon_summary_screen.c4
-rw-r--r--src/reshow_battle_screen.c6
-rw-r--r--src/save.c57
-rw-r--r--src/save_failed_screen.c2
-rw-r--r--src/scanline_effect.c262
-rw-r--r--src/scrcmd.c10
-rw-r--r--src/secret_base.c6
-rw-r--r--src/text.c4111
-rw-r--r--src/time_events.c118
-rw-r--r--src/trainer_see.c4
-rw-r--r--src/use_pokeblock.c4
-rw-r--r--src/wallclock.c2
38 files changed, 13375 insertions, 2130 deletions
diff --git a/src/battle_2.c b/src/battle_2.c
index 2d7f860c7..c03d22080 100644
--- a/src/battle_2.c
+++ b/src/battle_2.c
@@ -4,7 +4,7 @@
#include "main.h"
#include "load_save.h"
#include "gpu_regs.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "battle_setup.h"
#include "battle_scripts.h"
#include "pokemon.h"
@@ -47,13 +47,6 @@
#include "battle_string_ids.h"
#include "data2.h"
-struct UnknownStruct6
-{
- u16 unk0[0xA0];
- u8 fillerA0[0x640];
- u16 unk780[0xA0];
-};
-
struct UnknownPokemonStruct2
{
/*0x00*/ u16 species;
@@ -91,8 +84,6 @@ extern void (*gBattleMainFunc)(void);
extern void (*gCB2_AfterEvolution)(void);
extern struct UnknownPokemonStruct2 gUnknown_02022FF8[3]; // what is it used for?
extern struct UnknownPokemonStruct2* gUnknown_02023058; // what is it used for?
-extern u8 gUnknown_02039B28[]; // possibly a struct?
-extern struct UnknownStruct6 gUnknown_02038C28; // todo: identify & document
extern struct MusicPlayerInfo gMPlayInfo_SE1;
extern struct MusicPlayerInfo gMPlayInfo_SE2;
extern u8 gDecompressionBuffer[];
@@ -163,6 +154,7 @@ extern const u8 * const gBattlescriptsForBallThrow[];
extern const u8 * const gBattlescriptsForRunningByItem[];
extern const u8 * const gBattlescriptsForUsingItem[];
extern const u8 * const gBattlescriptsForSafariActions[];
+extern const struct ScanlineEffectParams gUnknown_0831AC70;
// strings
extern const u8 gText_LinkStandby3[];
@@ -181,7 +173,7 @@ extern const u8 gText_Confusion[];
extern const u8 gText_Love[];
// functions
-extern void dp12_8087EA4(void);
+extern void ScanlineEffect_Clear(void);
extern void sub_80356D0(void);
extern void GetFrontierTrainerName(u8* dst, u16 trainerId); // battle tower
extern void sub_8166188(void); // battle tower, sets link battle mons level but why?
@@ -384,24 +376,21 @@ static void CB2_InitBattleInternal(void)
else
{
gBattle_WIN0V = 0x5051;
- dp12_8087EA4();
+ ScanlineEffect_Clear();
for (i = 0; i < 80; i++)
{
- gUnknown_02038C28.unk0[i] = 0xF0;
- gUnknown_02038C28.unk780[i] = 0xF0;
+ gScanlineEffectRegBuffers[0][i] = 0xF0;
+ gScanlineEffectRegBuffers[1][i] = 0xF0;
}
for (i = 80; i < 160; i++)
{
- #ifndef NONMATCHING
- asm(""::"r"(i)); // needed to match
- #endif // NONMATCHING
-
- gUnknown_02038C28.unk0[i] = 0xFF10;
- gUnknown_02038C28.unk780[i] = 0xFF10;
+ asm(""::"r"(i));
+ gScanlineEffectRegBuffers[0][i] = 0xFF10;
+ gScanlineEffectRegBuffers[1][i] = 0xFF10;
}
- sub_80BA038(gUnknown_0831AC70);
+ ScanlineEffect_SetParams(gUnknown_0831AC70);
}
ResetPaletteFade();
@@ -1597,7 +1586,7 @@ void BattleMainCB2(void)
static void FreeRestoreBattleData(void)
{
gMain.callback1 = gPreBattleCallback1;
- gUnknown_02039B28[0x15] = 3;
+ gScanlineEffect.state = 3;
gMain.inBattle = 0;
ZeroEnemyPartyMons();
m4aSongNumStop(0x5A);
@@ -1815,7 +1804,7 @@ void VBlankCB_Battle(void)
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
- sub_80BA0A8();
+ ScanlineEffect_InitHBlankDmaTransfer();
}
void nullsub_17(void)
@@ -1953,18 +1942,18 @@ void sub_8038D64(void)
SetGpuReg(REG_OFFSET_WINOUT, 0);
gBattle_WIN0H = 0xF0;
gBattle_WIN0V = 0x5051;
- dp12_8087EA4();
+ ScanlineEffect_Clear();
for (i = 0; i < 80; i++)
{
- gUnknown_02038C28.unk0[i] = 0xF0;
- gUnknown_02038C28.unk780[i] = 0xF0;
+ gScanlineEffectRegBuffers[0][i] = 0xF0;
+ gScanlineEffectRegBuffers[1][i] = 0xF0;
}
for (i = 80; i < 160; i++)
{
asm(""::"r"(i)); // Needed to stop the compiler from optimizing out the loop counter
- gUnknown_02038C28.unk0[i] = 0xFF10;
- gUnknown_02038C28.unk780[i] = 0xFF10;
+ gScanlineEffectRegBuffers[0][i] = 0xFF10;
+ gScanlineEffectRegBuffers[1][i] = 0xFF10;
}
ResetPaletteFade();
diff --git a/src/battle_interface.c b/src/battle_interface.c
index 47e1d7db3..e75104f27 100644
--- a/src/battle_interface.c
+++ b/src/battle_interface.c
@@ -20,6 +20,7 @@
#include "international_string_util.h"
#include "safari_zone.h"
#include "battle_anim.h"
+#include "constants/rgb.h"
struct TestingBar
{
@@ -555,13 +556,13 @@ enum
PAL_STATUS_BRN
};
-static const u16 sStatusIconPalettes[] =
+static const u16 sStatusIconColors[] =
{
- 0x6198, // PAL_STATUS_PSN
- 0xEF7, // PAL_STATUS_PAR
- 0x4694, // PAL_STATUS_SLP
- 0x72D1, // PAL_STATUS_FRZ
- 0x29DC // PAL_STATUS_BRN
+ RGB(24, 12, 24), // PAL_STATUS_PSN
+ RGB(23, 23, 3), // PAL_STATUS_PAR
+ RGB(20, 20, 17), // PAL_STATUS_SLP
+ RGB(17, 22, 28), // PAL_STATUS_FRZ
+ RGB(28, 14, 10) // PAL_STATUS_BRN
};
static const struct WindowTemplate sHealthboxWindowTemplate = {0, 0, 0, 8, 2, 0, 0}; // width = 8, height = 2
@@ -2071,7 +2072,7 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId)
pltAdder = gSprites[healthboxSpriteId].oam.paletteNum * 16;
pltAdder += bank + 12;
- FillPalette(sStatusIconPalettes[statusPalId], pltAdder + 0x100, 2);
+ FillPalette(sStatusIconColors[statusPalId], pltAdder + 0x100, 2);
CpuCopy16(gPlttBufferUnfaded + 0x100 + pltAdder, (void*)(OBJ_PLTT + pltAdder * 2), 2);
CpuCopy32(statusGfxPtr, (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId].oam.tileNum + tileNumAdder) * 32), 96);
if (IsDoubleBattle() == TRUE || GetBankSide(bank) == SIDE_OPPONENT)
@@ -2575,7 +2576,7 @@ static u8* AddTextPrinterAndCreateWindowOnHealthbox(const u8 *str, u32 x, u32 y,
color.bgColor = 1;
color.shadowColor = 3;
- AddTextPrinterParametrized2(winId, 0, x, y, 0, 0, &color, -1, str);
+ AddTextPrinterParameterized2(winId, 0, x, y, 0, 0, &color, -1, str);
*windowId = winId;
return (u8*)(GetWindowAttribute(winId, WINDOW_TILE_DATA));
diff --git a/src/battle_transition.c b/src/battle_transition.c
index e003e0fce..0ff8cd903 100644
--- a/src/battle_transition.c
+++ b/src/battle_transition.c
@@ -14,7 +14,7 @@
#include "constants/songs.h"
#include "constants/trainers.h"
#include "field_camera.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "malloc.h"
#include "gpu_regs.h"
#include "decompress.h"
@@ -56,8 +56,6 @@ struct StructRectangularSpiral
typedef bool8 (*TransitionStateFunc)(struct Task *task);
typedef bool8 (*TransitionSpriteCallback)(struct Sprite *sprite);
-extern u16 gUnknown_020393A8[];
-extern u16 gUnknown_02038C28[][0x3C0];
extern u16 gBattle_BG0_X;
extern u16 gBattle_BG0_Y;
@@ -65,7 +63,7 @@ extern const struct OamData gFieldObjectBaseOam_32x32;
extern void c2_exit_to_overworld_2_switch(void);
extern void sub_80AC3D0(void);
-extern void dp12_8087EA4(void);
+extern void ScanlineEffect_Clear(void);
// this file's functions
static void LaunchBattleTransitionTask(u8 transitionId);
@@ -1110,9 +1108,9 @@ static void Phase2Task_Swirl(u8 taskId)
static bool8 Phase2_Swirl_Func1(struct Task *task)
{
sub_8149F08();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
BeginNormalPaletteFade(-1, 4, 0, 0x10, 0);
- sub_8149F98(gUnknown_020393A8, sTransitionStructPtr->field_14, 0, 2, 0, 160);
+ sub_8149F98(gScanlineEffectRegBuffers[1], sTransitionStructPtr->field_14, 0, 2, 0, 160);
SetVBlankCallback(VBlankCB_Phase2_Swirl);
SetHBlankCallback(HBlankCB_Phase2_Swirl);
@@ -1129,7 +1127,7 @@ static bool8 Phase2_Swirl_Func2(struct Task *task)
task->tData1 += 4;
task->tData2 += 8;
- sub_8149F98(gUnknown_02038C28[0], sTransitionStructPtr->field_14, task->tData1, 2, task->tData2, 160);
+ sub_8149F98(gScanlineEffectRegBuffers[0], sTransitionStructPtr->field_14, task->tData1, 2, task->tData2, 160);
if (!gPaletteFade.active)
{
@@ -1145,12 +1143,12 @@ static void VBlankCB_Phase2_Swirl(void)
{
VBlankCB_BattleTransition();
if (sTransitionStructPtr->VBlank_DMA)
- DmaCopy16(3, gUnknown_02038C28[0], gUnknown_02038C28[1], 320);
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
}
static void HBlankCB_Phase2_Swirl(void)
{
- u16 var = gUnknown_02038C28[1][REG_VCOUNT];
+ u16 var = gScanlineEffectRegBuffers[1][REG_VCOUNT];
REG_BG1HOFS = var;
REG_BG2HOFS = var;
REG_BG3HOFS = var;
@@ -1164,10 +1162,10 @@ static void Phase2Task_Shuffle(u8 taskId)
static bool8 Phase2_Shuffle_Func1(struct Task *task)
{
sub_8149F08();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
BeginNormalPaletteFade(-1, 4, 0, 0x10, 0);
- memset(gUnknown_020393A8, sTransitionStructPtr->field_16, 0x140);
+ memset(gScanlineEffectRegBuffers[1], sTransitionStructPtr->field_16, 0x140);
SetVBlankCallback(VBlankCB_Phase2_Shuffle);
SetHBlankCallback(HBlankCB_Phase2_Shuffle);
@@ -1192,7 +1190,7 @@ static bool8 Phase2_Shuffle_Func2(struct Task *task)
for (i = 0; i < 160; i++, r4 += 4224)
{
u16 var = r4 / 256;
- gUnknown_02038C28[0][i] = sTransitionStructPtr->field_16 + Sin(var, r3);
+ gScanlineEffectRegBuffers[0][i] = sTransitionStructPtr->field_16 + Sin(var, r3);
}
if (!gPaletteFade.active)
@@ -1206,12 +1204,12 @@ static void VBlankCB_Phase2_Shuffle(void)
{
VBlankCB_BattleTransition();
if (sTransitionStructPtr->VBlank_DMA)
- DmaCopy16(3, gUnknown_02038C28[0], gUnknown_02038C28[1], 320);
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
}
static void HBlankCB_Phase2_Shuffle(void)
{
- u16 var = gUnknown_02038C28[1][REG_VCOUNT];
+ u16 var = gScanlineEffectRegBuffers[1][REG_VCOUNT];
REG_BG1VOFS = var;
REG_BG2VOFS = var;
REG_BG3VOFS = var;
@@ -1257,7 +1255,7 @@ static void sub_814669C(struct Task *task)
s32 i;
sub_8149F08();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
task->tData1 = 16;
task->tData2 = 0;
@@ -1272,7 +1270,7 @@ static void sub_814669C(struct Task *task)
for (i = 0; i < 160; i++)
{
- gUnknown_02038C28[1][i] = 240;
+ gScanlineEffectRegBuffers[1][i] = 240;
}
SetVBlankCallback(VBlankCB0_Phase2_BigPokeball);
@@ -1351,7 +1349,7 @@ static bool8 Phase2_BigPokeball_Func2(struct Task *task)
dst1[i * 32 + j] = *BigPokeballMap | 0xF000;
}
}
- sub_8149F98(gUnknown_02038C28[0], 0, task->tData4, 132, task->tData5, 160);
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5, 160);
task->tState++;
return TRUE;
@@ -1363,7 +1361,7 @@ static bool8 Phase2_Aqua_Func2(struct Task *task)
sub_8149F58(&dst1, &dst2);
LZ77UnCompVram(sTeamAqua_Tilemap, dst1);
- sub_8149F98(gUnknown_02038C28[0], 0, task->tData4, 132, task->tData5, 160);
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5, 160);
task->tState++;
return FALSE;
@@ -1375,7 +1373,7 @@ static bool8 Phase2_Magma_Func2(struct Task *task)
sub_8149F58(&dst1, &dst2);
LZ77UnCompVram(sTeamMagma_Tilemap, dst1);
- sub_8149F98(gUnknown_02038C28[0], 0, task->tData4, 132, task->tData5, 160);
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5, 160);
task->tState++;
return FALSE;
@@ -1388,7 +1386,7 @@ static bool8 Phase2_Regice_Func2(struct Task *task)
sub_8149F58(&dst1, &dst2);
LoadPalette(gUnknown_085BC2B4, 0xF0, 0x20);
CpuCopy16(gUnknown_085BC314, dst1, 0x500);
- sub_8149F98(gUnknown_02038C28[0], 0, task->tData4, 132, task->tData5, 160);
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5, 160);
task->tState++;
return FALSE;
@@ -1401,7 +1399,7 @@ static bool8 Phase2_Registeel_Func2(struct Task *task)
sub_8149F58(&dst1, &dst2);
LoadPalette(gUnknown_085BC2D4, 0xF0, 0x20);
CpuCopy16(gUnknown_085BCB14, dst1, 0x500);
- sub_8149F98(gUnknown_02038C28[0], 0, task->tData4, 132, task->tData5, 160);
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5, 160);
task->tState++;
return FALSE;
@@ -1414,7 +1412,7 @@ static bool8 Phase2_Regirock_Func2(struct Task *task)
sub_8149F58(&dst1, &dst2);
LoadPalette(gUnknown_085BC2F4, 0xF0, 0x20);
CpuCopy16(gUnknown_085BD314, dst1, 0x500);
- sub_8149F98(gUnknown_02038C28[0], 0, task->tData4, 132, task->tData5, 160);
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5, 160);
task->tState++;
return FALSE;
@@ -1499,7 +1497,7 @@ static bool8 Phase2_BigPokeball_Func3(struct Task *task)
task->tData4 += 8;
task->tData5 -= 256;
- sub_8149F98(gUnknown_02038C28[0], 0, task->tData4, 132, task->tData5 >> 8, 160);
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5 >> 8, 160);
sTransitionStructPtr->VBlank_DMA++;
return FALSE;
@@ -1519,7 +1517,7 @@ static bool8 Phase2_BigPokeball_Func4(struct Task *task)
task->tData4 += 8;
task->tData5 -= 256;
- sub_8149F98(gUnknown_02038C28[0], 0, task->tData4, 132, task->tData5 >> 8, 160);
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5 >> 8, 160);
sTransitionStructPtr->VBlank_DMA++;
return FALSE;
@@ -1531,7 +1529,7 @@ static bool8 Phase2_BigPokeball_Func5(struct Task *task)
task->tData4 += 8;
task->tData5 -= 256;
- sub_8149F98(gUnknown_02038C28[0], 0, task->tData4, 132, task->tData5 >> 8, 160);
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5 >> 8, 160);
if (task->tData5 <= 0)
{
@@ -1577,7 +1575,7 @@ static bool8 Phase2_BigPokeball_Func6(struct Task *task)
if (task->tData1 < 0)
task->tData1 = 0;
}
- sub_814A014(gUnknown_02038C28[0], 120, 80, task->tData1);
+ sub_814A014(gScanlineEffectRegBuffers[0], 120, 80, task->tData1);
if (task->tData1 == 0)
{
SetVBlankCallback(NULL);
@@ -1604,7 +1602,7 @@ static void Transition_BigPokeball_Vblank(void)
DmaStop(0);
VBlankCB_BattleTransition();
if (sTransitionStructPtr->VBlank_DMA)
- DmaCopy16(3, gUnknown_02038C28[0], gUnknown_02038C28[1], 320);
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
REG_WININ = sTransitionStructPtr->WININ;
REG_WINOUT = sTransitionStructPtr->WINOUT;
REG_WIN0V = sTransitionStructPtr->WIN0V;
@@ -1615,13 +1613,13 @@ static void Transition_BigPokeball_Vblank(void)
static void VBlankCB0_Phase2_BigPokeball(void)
{
Transition_BigPokeball_Vblank();
- DmaSet(0, gUnknown_020393A8, &REG_BG0HOFS, 0xA2400001);
+ DmaSet(0, gScanlineEffectRegBuffers[1], &REG_BG0HOFS, 0xA2400001);
}
static void VBlankCB1_Phase2_BigPokeball(void)
{
Transition_BigPokeball_Vblank();
- DmaSet(0, gUnknown_020393A8, &REG_WIN0H, 0xA2400001);
+ DmaSet(0, gScanlineEffectRegBuffers[1], &REG_WIN0H, 0xA2400001);
}
static void Phase2Task_PokeballsTrail(u8 taskId)
@@ -1741,7 +1739,7 @@ static bool8 Phase2_Clockwise_BlackFade_Func1(struct Task *task)
u16 i;
sub_8149F08();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
sTransitionStructPtr->WININ = 0;
sTransitionStructPtr->WINOUT = 63;
@@ -1750,7 +1748,7 @@ static bool8 Phase2_Clockwise_BlackFade_Func1(struct Task *task)
for (i = 0; i < 160; i++)
{
- gUnknown_020393A8[i] = 0xF3F4;
+ gScanlineEffectRegBuffers[1][i] = 0xF3F4;
}
SetVBlankCallback(VBlankCB_Phase2_Clockwise_BlackFade);
@@ -1767,7 +1765,7 @@ static bool8 Phase2_Clockwise_BlackFade_Func2(struct Task *task)
sub_814A1AC(sTransitionStructPtr->data, 120, 80, sTransitionStructPtr->data[4], -1, 1, 1);
do
{
- gUnknown_02038C28[0][sTransitionStructPtr->data[3]] = (sTransitionStructPtr->data[2] + 1) | 0x7800;
+ gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] = (sTransitionStructPtr->data[2] + 1) | 0x7800;
} while (!sub_814A228(sTransitionStructPtr->data, 1, 1));
sTransitionStructPtr->data[4] += 16;
@@ -1795,7 +1793,7 @@ static bool8 Phase2_Clockwise_BlackFade_Func3(struct Task *task)
r1 = 120, r3 = sTransitionStructPtr->data[2] + 1;
if (sTransitionStructPtr->data[5] >= 80)
r1 = sTransitionStructPtr->data[2], r3 = 240;
- gUnknown_02038C28[0][sTransitionStructPtr->data[3]] = (r3) | (r1 << 8);
+ gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] = (r3) | (r1 << 8);
if (var != 0)
break;
var = sub_814A228(sTransitionStructPtr->data, 1, 1);
@@ -1811,7 +1809,7 @@ static bool8 Phase2_Clockwise_BlackFade_Func3(struct Task *task)
{
while (sTransitionStructPtr->data[3] < sTransitionStructPtr->data[5])
{
- gUnknown_02038C28[0][++sTransitionStructPtr->data[3]] = (r3) | (r1 << 8);
+ gScanlineEffectRegBuffers[0][++sTransitionStructPtr->data[3]] = (r3) | (r1 << 8);
}
}
@@ -1826,7 +1824,7 @@ static bool8 Phase2_Clockwise_BlackFade_Func4(struct Task *task)
sub_814A1AC(sTransitionStructPtr->data, 120, 80, sTransitionStructPtr->data[4], 160, 1, 1);
do
{
- gUnknown_02038C28[0][sTransitionStructPtr->data[3]] = (sTransitionStructPtr->data[2] << 8) | 0xF0;
+ gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] = (sTransitionStructPtr->data[2] << 8) | 0xF0;
} while (!sub_814A228(sTransitionStructPtr->data, 1, 1));
sTransitionStructPtr->data[4] -= 16;
@@ -1851,12 +1849,12 @@ static bool8 Phase2_Clockwise_BlackFade_Func5(struct Task *task)
while (1)
{
- r1 = (gUnknown_02038C28[0][sTransitionStructPtr->data[3]]) & 0xFF;
+ r1 = (gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]]) & 0xFF;
r2 = sTransitionStructPtr->data[2];
if (sTransitionStructPtr->data[5] <= 80)
r2 = 120, r1 = sTransitionStructPtr->data[2];
var4 = (r1) | (r2 << 8);
- gUnknown_02038C28[0][sTransitionStructPtr->data[3]] = var4;
+ gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] = var4;
if (var != 0)
break;
var = sub_814A228(sTransitionStructPtr->data, 1, 1);
@@ -1872,7 +1870,7 @@ static bool8 Phase2_Clockwise_BlackFade_Func5(struct Task *task)
{
while (sTransitionStructPtr->data[3] > sTransitionStructPtr->data[5])
{
- gUnknown_02038C28[0][--sTransitionStructPtr->data[3]] = (r1) | (r2 << 8);
+ gScanlineEffectRegBuffers[0][--sTransitionStructPtr->data[3]] = (r1) | (r2 << 8);
}
}
@@ -1892,7 +1890,7 @@ static bool8 Phase2_Clockwise_BlackFade_Func6(struct Task *task)
r2 = 120, r3 = sTransitionStructPtr->data[2];
if (sTransitionStructPtr->data[2] >= 120)
r2 = 0, r3 = 240;
- gUnknown_02038C28[0][sTransitionStructPtr->data[3]] = (r3) | (r2 << 8);
+ gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] = (r3) | (r2 << 8);
} while (!sub_814A228(sTransitionStructPtr->data, 1, 1));
@@ -1917,12 +1915,12 @@ static void VBlankCB_Phase2_Clockwise_BlackFade(void)
DmaStop(0);
VBlankCB_BattleTransition();
if (sTransitionStructPtr->VBlank_DMA != 0)
- DmaCopy16(3, gUnknown_02038C28[0], gUnknown_02038C28[1], 320);
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
REG_WININ = sTransitionStructPtr->WININ;
REG_WINOUT = sTransitionStructPtr->WINOUT;
REG_WIN0V = sTransitionStructPtr->WIN0V;
- REG_WIN0H = gUnknown_02038C28[1][0];
- DmaSet(0, gUnknown_02038C28[1], &REG_WIN0H, 0xA2400001);
+ REG_WIN0H = gScanlineEffectRegBuffers[1][0];
+ DmaSet(0, gScanlineEffectRegBuffers[1], &REG_WIN0H, 0xA2400001);
}
static void Phase2Task_Ripple(u8 taskId)
@@ -1935,11 +1933,11 @@ static bool8 Phase2_Ripple_Func1(struct Task *task)
u8 i;
sub_8149F08();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
for (i = 0; i < 160; i++)
{
- gUnknown_020393A8[i] = sTransitionStructPtr->field_16;
+ gScanlineEffectRegBuffers[1][i] = sTransitionStructPtr->field_16;
}
SetVBlankCallback(VBlankCB_Phase2_Ripple);
@@ -1971,7 +1969,7 @@ static bool8 Phase2_Ripple_Func2(struct Task *task)
// todo: fix the asm
s16 var = r4 >> 8;
asm("");
- gUnknown_02038C28[0][i] = sTransitionStructPtr->field_16 + Sin(var, r3);
+ gScanlineEffectRegBuffers[0][i] = sTransitionStructPtr->field_16 + Sin(var, r3);
}
if (++task->tData3 == 81)
@@ -1991,12 +1989,12 @@ static void VBlankCB_Phase2_Ripple(void)
{
VBlankCB_BattleTransition();
if (sTransitionStructPtr->VBlank_DMA)
- DmaCopy16(3, gUnknown_02038C28[0], gUnknown_02038C28[1], 320);
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
}
static void HBlankCB_Phase2_Ripple(void)
{
- u16 var = gUnknown_02038C28[1][REG_VCOUNT];
+ u16 var = gScanlineEffectRegBuffers[1][REG_VCOUNT];
REG_BG1VOFS = var;
REG_BG2VOFS = var;
REG_BG3VOFS = var;
@@ -2012,7 +2010,7 @@ static bool8 Phase2_Wave_Func1(struct Task *task)
u8 i;
sub_8149F08();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
sTransitionStructPtr->WININ = 63;
sTransitionStructPtr->WINOUT = 0;
@@ -2021,7 +2019,7 @@ static bool8 Phase2_Wave_Func1(struct Task *task)
for (i = 0; i < 160; i++)
{
- gUnknown_02038C28[1][i] = 242;
+ gScanlineEffectRegBuffers[1][i] = 242;
}
SetVBlankCallback(VBlankCB_Phase2_Wave);
@@ -2037,7 +2035,7 @@ static bool8 Phase2_Wave_Func2(struct Task *task)
bool8 nextFunc;
sTransitionStructPtr->VBlank_DMA = FALSE;
- toStore = gUnknown_02038C28[0];
+ toStore = gScanlineEffectRegBuffers[0];
r5 = task->tData2;
task->tData2 += 16;
task->tData1 += 8;
@@ -2073,11 +2071,11 @@ static void VBlankCB_Phase2_Wave(void)
DmaStop(0);
VBlankCB_BattleTransition();
if (sTransitionStructPtr->VBlank_DMA != 0)
- DmaCopy16(3, gUnknown_02038C28[0], gUnknown_02038C28[1], 320);
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
REG_WININ = sTransitionStructPtr->WININ;
REG_WINOUT = sTransitionStructPtr->WINOUT;
REG_WIN0V = sTransitionStructPtr->WIN0V;
- DmaSet(0, gUnknown_02038C28[1], &REG_WIN0H, 0xA2400001);
+ DmaSet(0, gScanlineEffectRegBuffers[1], &REG_WIN0H, 0xA2400001);
}
static void Phase2Task_Sydney(u8 taskId)
@@ -2120,7 +2118,7 @@ static bool8 Phase2_Mugshot_Func1(struct Task *task)
u8 i;
sub_8149F08();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
Mugshots_CreateOpponentPlayerSprites(task);
task->tData1 = 0;
@@ -2132,7 +2130,7 @@ static bool8 Phase2_Mugshot_Func1(struct Task *task)
for (i = 0; i < 160; i++)
{
- gUnknown_02038C28[1][i] = 0xF0F1;
+ gScanlineEffectRegBuffers[1][i] = 0xF0F1;
}
SetVBlankCallback(VBlankCB0_Phase2_Mugshots);
@@ -2177,7 +2175,7 @@ static bool8 Phase2_Mugshot_Func3(struct Task *task)
sTransitionStructPtr->VBlank_DMA = FALSE;
- toStore = gUnknown_02038C28[0];
+ toStore = gScanlineEffectRegBuffers[0];
r5 = task->tData1;
task->tData1 += 0x10;
@@ -2223,7 +2221,7 @@ static bool8 Phase2_Mugshot_Func4(struct Task *task)
sTransitionStructPtr->VBlank_DMA = FALSE;
- for (i = 0, toStore = gUnknown_02038C28[0]; i < 160; i++, toStore++)
+ for (i = 0, toStore = gScanlineEffectRegBuffers[0]; i < 160; i++, toStore++)
{
*toStore = 0xF0;
}
@@ -2266,8 +2264,8 @@ static bool8 Phase2_Mugshot_Func6(struct Task *task)
sTransitionStructPtr->VBlank_DMA = FALSE;
SetVBlankCallback(NULL);
DmaStop(0);
- memset(gUnknown_02038C28[0], 0, 0x140);
- memset(gUnknown_02038C28[1], 0, 0x140);
+ memset(gScanlineEffectRegBuffers[0], 0, 0x140);
+ memset(gScanlineEffectRegBuffers[1], 0, 0x140);
SetGpuReg(REG_OFFSET_WIN0H, 0xF0);
SetGpuReg(REG_OFFSET_BLDY, 0);
task->tState++;
@@ -2300,15 +2298,15 @@ static bool8 Phase2_Mugshot_Func7(struct Task *task)
{
s16 index1 = 0x50 - i;
s16 index2 = 0x50 + i;
- if (gUnknown_02038C28[0][index1] <= 15)
+ if (gScanlineEffectRegBuffers[0][index1] <= 15)
{
r6 = TRUE;
- gUnknown_02038C28[0][index1]++;
+ gScanlineEffectRegBuffers[0][index1]++;
}
- if (gUnknown_02038C28[0][index2] <= 15)
+ if (gScanlineEffectRegBuffers[0][index2] <= 15)
{
r6 = TRUE;
- gUnknown_02038C28[0][index2]++;
+ gScanlineEffectRegBuffers[0][index2]++;
}
}
}
@@ -2336,7 +2334,7 @@ static bool8 Phase2_Mugshot_Func9(struct Task *task)
sTransitionStructPtr->VBlank_DMA = FALSE;
task->tData3++;
- memset(gUnknown_02038C28[0], task->tData3, 0x140);
+ memset(gScanlineEffectRegBuffers[0], task->tData3, 0x140);
if (task->tData3 > 15)
task->tState++;
@@ -2357,12 +2355,12 @@ static void VBlankCB0_Phase2_Mugshots(void)
DmaStop(0);
VBlankCB_BattleTransition();
if (sTransitionStructPtr->VBlank_DMA != 0)
- DmaCopy16(3, gUnknown_02038C28[0], gUnknown_02038C28[1], 320);
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
REG_BG0VOFS = sTransitionStructPtr->BG0VOFS;
REG_WININ = sTransitionStructPtr->WININ;
REG_WINOUT = sTransitionStructPtr->WINOUT;
REG_WIN0V = sTransitionStructPtr->WIN0V;
- DmaSet(0, gUnknown_02038C28[1], &REG_WIN0H, 0xA2400001);
+ DmaSet(0, gScanlineEffectRegBuffers[1], &REG_WIN0H, 0xA2400001);
}
static void VBlankCB1_Phase2_Mugshots(void)
@@ -2370,9 +2368,9 @@ static void VBlankCB1_Phase2_Mugshots(void)
DmaStop(0);
VBlankCB_BattleTransition();
if (sTransitionStructPtr->VBlank_DMA != 0)
- DmaCopy16(3, gUnknown_02038C28[0], gUnknown_02038C28[1], 320);
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
REG_BLDCNT = sTransitionStructPtr->BLDCNT;
- DmaSet(0, gUnknown_02038C28[1], &REG_BLDY, 0xA2400001);
+ DmaSet(0, gScanlineEffectRegBuffers[1], &REG_BLDY, 0xA2400001);
}
static void HBlankCB_Phase2_Mugshots(void)
@@ -2500,7 +2498,7 @@ static bool8 Phase2_Slice_Func1(struct Task *task)
u16 i;
sub_8149F08();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
task->tData2 = 256;
task->tData3 = 1;
@@ -2511,8 +2509,8 @@ static bool8 Phase2_Slice_Func1(struct Task *task)
for (i = 0; i < 160; i++)
{
- gUnknown_02038C28[1][i] = sTransitionStructPtr->field_14;
- gUnknown_02038C28[1][160 + i] = 0xF0;
+ gScanlineEffectRegBuffers[1][i] = sTransitionStructPtr->field_14;
+ gScanlineEffectRegBuffers[1][160 + i] = 0xF0;
}
EnableInterrupts(INTR_FLAG_HBLANK);
@@ -2541,8 +2539,8 @@ static bool8 Phase2_Slice_Func2(struct Task *task)
for (i = 0; i < 160; i++)
{
- u16 *storeLoc1 = &gUnknown_02038C28[0][i];
- u16 *storeLoc2 = &gUnknown_02038C28[0][i + 160];
+ u16 *storeLoc1 = &gScanlineEffectRegBuffers[0][i];
+ u16 *storeLoc2 = &gScanlineEffectRegBuffers[0][i + 160];
if (i & 1)
{
*storeLoc1 = sTransitionStructPtr->field_14 + task->tData1;
@@ -2578,15 +2576,15 @@ static void VBlankCB_Phase2_Slice(void)
REG_WINOUT = sTransitionStructPtr->WINOUT;
REG_WIN0V = sTransitionStructPtr->WIN0V;
if (sTransitionStructPtr->VBlank_DMA)
- DmaCopy16(3, gUnknown_02038C28[0], gUnknown_02038C28[1], 640);
- DmaSet(0, &gUnknown_02038C28[1][160], &REG_WIN0H, 0xA2400001);
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 640);
+ DmaSet(0, &gScanlineEffectRegBuffers[1][160], &REG_WIN0H, 0xA2400001);
}
static void HBlankCB_Phase2_Slice(void)
{
if (REG_VCOUNT < 160)
{
- u16 var = gUnknown_02038C28[1][REG_VCOUNT];
+ u16 var = gScanlineEffectRegBuffers[1][REG_VCOUNT];
REG_BG1HOFS = var;
REG_BG2HOFS = var;
REG_BG3HOFS = var;
@@ -2603,7 +2601,7 @@ static bool8 Phase2_ShredSplit_Func1(struct Task *task)
u16 i;
sub_8149F08();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
sTransitionStructPtr->WININ = 63;
sTransitionStructPtr->WINOUT = 0;
@@ -2611,13 +2609,13 @@ static bool8 Phase2_ShredSplit_Func1(struct Task *task)
for (i = 0; i < 0xA0; i++)
{
- gUnknown_02038C28[1][i] = sTransitionStructPtr->field_14;
- gUnknown_02038C28[1][0xA0 + i] = 0xF0;
- gUnknown_02038C28[0][i] = sTransitionStructPtr->field_14;
- gUnknown_02038C28[0][0xA0 + i] = 0xF0;
- gUnknown_02038C28[0][0x140 + i] = 0;
- gUnknown_02038C28[0][0x1E0 + i] = 0x100;
- gUnknown_02038C28[0][0x280 + i] = 1;
+ gScanlineEffectRegBuffers[1][i] = sTransitionStructPtr->field_14;
+ gScanlineEffectRegBuffers[1][0xA0 + i] = 0xF0;
+ gScanlineEffectRegBuffers[0][i] = sTransitionStructPtr->field_14;
+ gScanlineEffectRegBuffers[0][0xA0 + i] = 0xF0;
+ gScanlineEffectRegBuffers[0][0x140 + i] = 0;
+ gScanlineEffectRegBuffers[0][0x1E0 + i] = 0x100;
+ gScanlineEffectRegBuffers[0][0x280 + i] = 1;
}
task->tData4 = 0;
@@ -2657,9 +2655,9 @@ static bool8 Phase2_ShredSplit_Func2(struct Task *task)
unkVar = (arr1[j]) + (arr2[k] * -(i) * 2);
if (unkVar >= 0 && (unkVar != 79 || j != 1))
{
- ptr4 = &gUnknown_02038C28[0][unkVar + 320];
- ptr3 = &gUnknown_02038C28[0][unkVar + 480];
- ptr1 = &gUnknown_02038C28[0][unkVar + 640];
+ ptr4 = &gScanlineEffectRegBuffers[0][unkVar + 320];
+ ptr3 = &gScanlineEffectRegBuffers[0][unkVar + 480];
+ ptr1 = &gScanlineEffectRegBuffers[0][unkVar + 640];
if (*ptr4 > 0xEF)
{
*ptr4 = 0xF0;
@@ -2673,8 +2671,8 @@ static bool8 Phase2_ShredSplit_Func2(struct Task *task)
if (*ptr3 <= 0xFFF)
*ptr3 += *ptr1;
}
- ptr2 = &gUnknown_02038C28[0][unkVar];
- ptr3 = &gUnknown_02038C28[0][unkVar + 160];
+ ptr2 = &gScanlineEffectRegBuffers[0][unkVar];
+ ptr3 = &gScanlineEffectRegBuffers[0][unkVar + 160];
*ptr2 = sTransitionStructPtr->field_14 + *ptr4;
*ptr3 = 0xF0 - *ptr4;
@@ -2691,9 +2689,9 @@ static bool8 Phase2_ShredSplit_Func2(struct Task *task)
unkVar = (arr1[j] + 1) + (arr2[k] * -(i) * 2);
if (unkVar <= 160 && (unkVar != 80 || j != 1))
{
- ptr4 = &gUnknown_02038C28[0][unkVar + 320];
- ptr3 = &gUnknown_02038C28[0][unkVar + 480];
- ptr1 = &gUnknown_02038C28[0][unkVar + 640];
+ ptr4 = &gScanlineEffectRegBuffers[0][unkVar + 320];
+ ptr3 = &gScanlineEffectRegBuffers[0][unkVar + 480];
+ ptr1 = &gScanlineEffectRegBuffers[0][unkVar + 640];
if (*ptr4 > 0xEF)
{
*ptr4 = 0xF0;
@@ -2707,8 +2705,8 @@ static bool8 Phase2_ShredSplit_Func2(struct Task *task)
if (*ptr3 <= 0xFFF)
*ptr3 += *ptr1;
}
- ptr2 = &gUnknown_02038C28[0][unkVar];
- ptr3 = &gUnknown_02038C28[0][unkVar + 160];
+ ptr2 = &gScanlineEffectRegBuffers[0][unkVar];
+ ptr3 = &gScanlineEffectRegBuffers[0][unkVar + 160];
*ptr2 = sTransitionStructPtr->field_14 - *ptr4;
*ptr3 = (*ptr4 << 8) | (0xF1);
@@ -2732,7 +2730,7 @@ static bool8 Phase2_ShredSplit_Func2(struct Task *task)
// This function never increments the state counter, because the loop condition
// is always false, resulting in the game being stuck in an infinite loop.
-// It's possible this transition is only partially
+// It's possible this transition is only partially
// done and the second part was left out.
static bool8 Phase2_ShredSplit_Func3(struct Task *task)
{
@@ -2742,7 +2740,7 @@ static bool8 Phase2_ShredSplit_Func3(struct Task *task)
for (i = 0; i < 0xA0; i++)
{
- if (gUnknown_02038C28[1][i] != 0xF0 && gUnknown_02038C28[1][i] != checkVar2)
+ if (gScanlineEffectRegBuffers[1][i] != 0xF0 && gScanlineEffectRegBuffers[1][i] != checkVar2)
done = FALSE; // a break statement should be put here
}
@@ -2775,7 +2773,7 @@ static bool8 Phase2_Blackhole_Func1(struct Task *task)
s32 i;
sub_8149F08();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
sTransitionStructPtr->WININ = 0;
sTransitionStructPtr->WINOUT = 63;
@@ -2784,7 +2782,7 @@ static bool8 Phase2_Blackhole_Func1(struct Task *task)
for (i = 0; i < 0xA0; i++)
{
- gUnknown_02038C28[1][i] = 0;
+ gScanlineEffectRegBuffers[1][i] = 0;
}
SetVBlankCallback(VBlankCB1_Phase2_BigPokeball);
@@ -2814,7 +2812,7 @@ static bool8 Phase2_Blackhole1_Func3(struct Task *task)
task->tData1 += (task->tData2 >> 8);
if (task->tData1 > 0xA0)
task->tData1 = 0xA0;
- sub_814A014(gUnknown_02038C28[0], 0x78, 0x50, task->tData1);
+ sub_814A014(gScanlineEffectRegBuffers[0], 0x78, 0x50, task->tData1);
if (task->tData1 == 0xA0)
{
task->tFuncState = 1;
@@ -2840,7 +2838,7 @@ static bool8 Phase2_Blackhole1_Func2(struct Task *task)
}
task->tData1 += gUnknown_085C8C80[task->tData6];
task->tData6 = (task->tData6 + 1) % 2;
- sub_814A014(gUnknown_02038C28[0], 0x78, 0x50, task->tData1);
+ sub_814A014(gScanlineEffectRegBuffers[0], 0x78, 0x50, task->tData1);
if (task->tData1 < 9)
{
task->tState++;
@@ -2866,7 +2864,7 @@ static bool8 Phase2_Blackhole2_Func2(struct Task *task)
if (task->tData1 > 0xA0)
task->tData1 = 0xA0;
- sub_814A014(gUnknown_02038C28[0], 0x78, 0x50, task->tData1);
+ sub_814A014(gScanlineEffectRegBuffers[0], 0x78, 0x50, task->tData1);
if (task->tData1 == 0xA0)
{
DmaStop(0);
@@ -3113,7 +3111,7 @@ static bool8 Phase2_Rayquaza_Func3(struct Task *task)
u16 i;
sub_8149F08();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
SetGpuReg(REG_OFFSET_BG0CNT, 0x9A08);
sub_8149F58(&dst1, &dst2);
@@ -3126,8 +3124,8 @@ static bool8 Phase2_Rayquaza_Func3(struct Task *task)
for (i = 0; i < 160; i++)
{
- gUnknown_02038C28[0][i] = 0;
- gUnknown_02038C28[1][i] = 0x100;
+ gScanlineEffectRegBuffers[0][i] = 0;
+ gScanlineEffectRegBuffers[1][i] = 0x100;
}
SetVBlankCallback(VBlankCB_Phase2_Rayquaza);
@@ -3212,7 +3210,7 @@ static bool8 Phase2_Rayquaza_Func9(struct Task *task)
for (i = 0; i < 160; i++)
{
- gUnknown_02038C28[1][i] = 0;
+ gScanlineEffectRegBuffers[1][i] = 0;
}
SetVBlankCallback(VBlankCB1_Phase2_BigPokeball);
@@ -3233,11 +3231,11 @@ static void VBlankCB_Phase2_Rayquaza(void)
VBlankCB_BattleTransition();
if (sTransitionStructPtr->field_20 == 0)
- dmaSrc = gUnknown_02038C28[0];
+ dmaSrc = gScanlineEffectRegBuffers[0];
else if (sTransitionStructPtr->field_20 == 1)
- dmaSrc = gUnknown_02038C28[1];
+ dmaSrc = gScanlineEffectRegBuffers[1];
else
- dmaSrc = gUnknown_02038C28[0];
+ dmaSrc = gScanlineEffectRegBuffers[0];
DmaSet(0, dmaSrc, &REG_BG0VOFS, 0xA2400001);
}
@@ -3252,7 +3250,7 @@ static bool8 Phase2_WhiteFade_Func1(struct Task *task)
u16 i;
sub_8149F08();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
sTransitionStructPtr->BLDCNT = 0xBF;
sTransitionStructPtr->BLDY = 0;
@@ -3262,8 +3260,8 @@ static bool8 Phase2_WhiteFade_Func1(struct Task *task)
for (i = 0; i < 160; i++)
{
- gUnknown_02038C28[1][i] = 0;
- gUnknown_02038C28[1][i + 160] = 0xF0;
+ gScanlineEffectRegBuffers[1][i] = 0;
+ gScanlineEffectRegBuffers[1][i + 160] = 0xF0;
}
EnableInterrupts(INTR_FLAG_HBLANK);
@@ -3343,8 +3341,8 @@ static void VBlankCB0_Phase2_WhiteFade(void)
REG_WINOUT = sTransitionStructPtr->WINOUT;
REG_WIN0V = sTransitionStructPtr->WIN0V;
if (sTransitionStructPtr->VBlank_DMA)
- DmaCopy16(3, gUnknown_02038C28[0], gUnknown_02038C28[1], 640);
- DmaSet(0, &gUnknown_02038C28[1][160], &REG_WIN0H, 0xA2400001);
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 640);
+ DmaSet(0, &gScanlineEffectRegBuffers[1][160], &REG_WIN0H, 0xA2400001);
}
static void VBlankCB1_Phase2_WhiteFade(void)
@@ -3360,7 +3358,7 @@ static void VBlankCB1_Phase2_WhiteFade(void)
static void HBlankCB_Phase2_WhiteFade(void)
{
- REG_BLDY = gUnknown_02038C28[1][REG_VCOUNT];
+ REG_BLDY = gScanlineEffectRegBuffers[1][REG_VCOUNT];
}
static void sub_8149864(struct Sprite *sprite)
@@ -3374,8 +3372,8 @@ static void sub_8149864(struct Sprite *sprite)
else
{
u16 i;
- u16* ptr1 = &gUnknown_02038C28[0][sprite->pos1.y];
- u16* ptr2 = &gUnknown_02038C28[0][sprite->pos1.y + 160];
+ u16* ptr1 = &gScanlineEffectRegBuffers[0][sprite->pos1.y];
+ u16* ptr2 = &gScanlineEffectRegBuffers[0][sprite->pos1.y + 160];
for (i = 0; i < 20; i++)
{
ptr1[i] = sprite->data[0] >> 8;
@@ -3465,7 +3463,7 @@ static bool8 Phase2_Shards_Func1(struct Task *task)
u16 i;
sub_8149F08();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
sTransitionStructPtr->WININ = 0x3F;
sTransitionStructPtr->WINOUT = 0;
@@ -3473,10 +3471,10 @@ static bool8 Phase2_Shards_Func1(struct Task *task)
for (i = 0; i < 160; i++)
{
- gUnknown_02038C28[0][i] = 0xF0;
+ gScanlineEffectRegBuffers[0][i] = 0xF0;
}
- CpuSet(gUnknown_02038C28[0], gUnknown_02038C28[1], 0xA0);
+ CpuSet(gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 0xA0);
SetVBlankCallback(VBlankCB_Phase2_Shards);
task->tState++;
@@ -3505,8 +3503,8 @@ static bool8 Phase2_Shards_Func3(struct Task *task)
for (i = 0, nextFunc = FALSE; i < 16; i++)
{
- s16 r3 = gUnknown_02038C28[0][sTransitionStructPtr->data[3]] >> 8;
- s16 r4 = gUnknown_02038C28[0][sTransitionStructPtr->data[3]] & 0xFF;
+ s16 r3 = gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] >> 8;
+ s16 r4 = gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] & 0xFF;
if (task->tData2 == 0)
{
if (r3 < sTransitionStructPtr->data[2])
@@ -3521,7 +3519,7 @@ static bool8 Phase2_Shards_Func3(struct Task *task)
if (r4 <= r3)
r4 = r3;
}
- gUnknown_02038C28[0][sTransitionStructPtr->data[3]] = (r4) | (r3 << 8);
+ gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] = (r4) | (r3 << 8);
if (nextFunc)
{
task->tState++;
@@ -3568,12 +3566,12 @@ static void VBlankCB_Phase2_Shards(void)
DmaStop(0);
VBlankCB_BattleTransition();
if (sTransitionStructPtr->VBlank_DMA)
- DmaCopy16(3, gUnknown_02038C28[0], gUnknown_02038C28[1], 320);
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
REG_WININ = sTransitionStructPtr->WININ;
REG_WINOUT = sTransitionStructPtr->WINOUT;
REG_WIN0V = sTransitionStructPtr->WIN0V;
- REG_WIN0H = gUnknown_02038C28[1][0];
- DmaSet(0, gUnknown_02038C28[1], &REG_WIN0H, 0xA2400001);
+ REG_WIN0H = gScanlineEffectRegBuffers[1][0];
+ DmaSet(0, gScanlineEffectRegBuffers[1], &REG_WIN0H, 0xA2400001);
}
// sub-task for phase2
@@ -3875,7 +3873,7 @@ static bool8 Phase2_29_Func2(struct Task *task)
sub_8149F58(&dst1, &dst2);
LZ77UnCompVram(gUnknown_085C828C, dst1);
- sub_8149F98(gUnknown_02038C28[0], 0, task->tData4, 0x84, task->tData5, 160);
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 0x84, task->tData5, 160);
task->tState++;
return TRUE;
@@ -3896,7 +3894,7 @@ static bool8 Phase2_30_Func1(struct Task *task)
u16 *dst1, *dst2;
sub_8149F08();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON);
task->tData2 = 0x2000;
task->tData1 = 0x7FFF;
@@ -3934,7 +3932,7 @@ static bool8 Phase2_30_Func3(struct Task *task)
for (i = 0; i < 160; i++)
{
- gUnknown_02038C28[1][i] = sTransitionStructPtr->field_16;
+ gScanlineEffectRegBuffers[1][i] = sTransitionStructPtr->field_16;
}
SetVBlankCallback(VBlankCB_Phase2_30);
@@ -3980,7 +3978,7 @@ static bool8 Phase2_30_Func4(struct Task *task)
{
s16 index = var6 / 256;
asm("");
- gUnknown_02038C28[0][i] = sTransitionStructPtr->field_16 + Sin(index, amplitude);
+ gScanlineEffectRegBuffers[0][i] = sTransitionStructPtr->field_16 + Sin(index, amplitude);
}
if (++task->tData3 == 101)
@@ -4004,12 +4002,12 @@ static void VBlankCB_Phase2_30(void)
REG_BLDALPHA = sTransitionStructPtr->BLDALPHA;
if (sTransitionStructPtr->VBlank_DMA)
- DmaCopy16(3, gUnknown_02038C28[0], gUnknown_02038C28[1], 320);
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
}
static void HBlankCB_Phase2_30(void)
{
- u16 var = gUnknown_02038C28[1][REG_VCOUNT];
+ u16 var = gScanlineEffectRegBuffers[1][REG_VCOUNT];
REG_BG0VOFS = var;
}
diff --git a/src/berry_blender.c b/src/berry_blender.c
index b61bb8e9b..0cf6efd65 100644
--- a/src/berry_blender.c
+++ b/src/berry_blender.c
@@ -3602,7 +3602,7 @@ static void Blender_AddTextPrinter(u8 windowId, const u8 *string, u8 x, u8 y, s3
FillWindowPixelBuffer(windowId, txtColor.fgColor | (txtColor.fgColor << 4));
}
- AddTextPrinterParametrized2(windowId, 1, x, y, letterSpacing, 1, &txtColor, speed, string);
+ AddTextPrinterParameterized2(windowId, 1, x, y, letterSpacing, 1, &txtColor, speed, string);
}
static bool32 Blender_PrintText(s16 *textState, const u8 *string, s32 textSpeed)
diff --git a/src/berry_fix_program.c b/src/berry_fix_program.c
index 8a9b0caed..2b576b61b 100644
--- a/src/berry_fix_program.c
+++ b/src/berry_fix_program.c
@@ -6,7 +6,7 @@
#include "main.h"
#include "sprite.h"
#include "task.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "window.h"
#include "text.h"
#include "menu.h"
diff --git a/src/coord_event_weather.c b/src/coord_event_weather.c
new file mode 100644
index 000000000..60b87fa30
--- /dev/null
+++ b/src/coord_event_weather.c
@@ -0,0 +1,119 @@
+#include "global.h"
+#include "constants/weather.h"
+#include "coord_event_weather.h"
+#include "field_weather.h"
+
+struct CoordEventWeather
+{
+ u8 coordEventWeather;
+ void (*func)(void);
+};
+
+static void CoordEventWeather_Clouds(void);
+static void CoordEventWeather_Sunny(void);
+static void CoordEventWeather_LightRain(void);
+static void CoordEventWeather_Snow(void);
+static void CoordEventWeather_Thunderstorm(void);
+static void CoordEventWeather_Fog(void);
+static void CoordEventWeather_DiagonalFog(void);
+static void CoordEventWeather_Ash(void);
+static void CoordEventWeather_Sandstorm(void);
+static void CoordEventWeather_Dark(void);
+static void CoordEventWeather_Drought(void);
+static void CoordEventWeather_Route119Cycle(void);
+static void CoordEventWeather_Route123Cycle(void);
+
+static const struct CoordEventWeather sCoordEventWeatherFuncs[] =
+{
+ { COORD_EVENT_WEATHER_CLOUDS, CoordEventWeather_Clouds },
+ { COORD_EVENT_WEATHER_SUNNY, CoordEventWeather_Sunny },
+ { COORD_EVENT_WEATHER_RAIN_LIGHT, CoordEventWeather_LightRain },
+ { COORD_EVENT_WEATHER_SNOW, CoordEventWeather_Snow },
+ { COORD_EVENT_WEATHER_RAIN_MED, CoordEventWeather_Thunderstorm },
+ { COORD_EVENT_WEATHER_FOG_1, CoordEventWeather_Fog },
+ { COORD_EVENT_WEATHER_FOG_2, CoordEventWeather_DiagonalFog },
+ { COORD_EVENT_WEATHER_ASH, CoordEventWeather_Ash },
+ { COORD_EVENT_WEATHER_SANDSTORM, CoordEventWeather_Sandstorm },
+ { COORD_EVENT_WEATHER_SHADE, CoordEventWeather_Dark },
+ { COORD_EVENT_WEATHER_DROUGHT, CoordEventWeather_Drought },
+ { COORD_EVENT_WEATHER_ROUTE119_CYCLE, CoordEventWeather_Route119Cycle },
+ { COORD_EVENT_WEATHER_ROUTE123_CYCLE, CoordEventWeather_Route123Cycle },
+};
+
+static void CoordEventWeather_Clouds(void)
+{
+ SetWeather(WEATHER_CLOUDS);
+}
+
+static void CoordEventWeather_Sunny(void)
+{
+ SetWeather(WEATHER_SUNNY);
+}
+
+static void CoordEventWeather_LightRain(void)
+{
+ SetWeather(WEATHER_RAIN_LIGHT);
+}
+
+static void CoordEventWeather_Snow(void)
+{
+ SetWeather(WEATHER_SNOW);
+}
+
+static void CoordEventWeather_Thunderstorm(void)
+{
+ SetWeather(WEATHER_RAIN_MED);
+}
+
+static void CoordEventWeather_Fog(void)
+{
+ SetWeather(WEATHER_FOG_1);
+}
+
+static void CoordEventWeather_DiagonalFog(void)
+{
+ SetWeather(WEATHER_FOG_2);
+}
+
+static void CoordEventWeather_Ash(void)
+{
+ SetWeather(WEATHER_ASH);
+}
+
+static void CoordEventWeather_Sandstorm(void)
+{
+ SetWeather(WEATHER_SANDSTORM);
+}
+
+static void CoordEventWeather_Dark(void)
+{
+ SetWeather(WEATHER_SHADE);
+}
+
+static void CoordEventWeather_Drought(void)
+{
+ SetWeather(WEATHER_DROUGHT);
+}
+
+static void CoordEventWeather_Route119Cycle(void)
+{
+ SetWeather(WEATHER_ROUTE119_CYCLE);
+}
+
+static void CoordEventWeather_Route123Cycle(void)
+{
+ SetWeather(WEATHER_ROUTE123_CYCLE);
+}
+
+void DoCoordEventWeather(u8 coordEventWeather)
+{
+ u8 i;
+ for (i = 0; i < ARRAY_COUNT(sCoordEventWeatherFuncs); i++)
+ {
+ if (sCoordEventWeatherFuncs[i].coordEventWeather == coordEventWeather)
+ {
+ sCoordEventWeatherFuncs[i].func();
+ return;
+ }
+ }
+}
diff --git a/src/decoration.c b/src/decoration.c
index 3bff5208e..753854bc0 100644
--- a/src/decoration.c
+++ b/src/decoration.c
@@ -500,7 +500,7 @@ void sub_8126B80(u8 taskId)
void sub_8126C08(void)
{
FillWindowPixelBuffer(0, 0x11);
- AddTextPrinterParametrized(0, 1, sSecretBasePCMenuItemDescriptions[sSecretBasePCMenuCursorPos], 0, 0, 2, 1, 3);
+ AddTextPrinterParameterized(0, 1, sSecretBasePCMenuItemDescriptions[sSecretBasePCMenuCursorPos], 0, 0, 2, 1, 3);
}
void SecretBasePC_Decorate(u8 taskId)
@@ -529,7 +529,7 @@ void SecretBasePC_PutAway(u8 taskId)
{
sub_8126A58(0);
sub_8197434(0, 0);
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = sub_8129ABC;
}
@@ -1247,7 +1247,7 @@ void sub_8127F68(u8 taskId)
{
if (sub_8127F38() == TRUE)
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = sub_8128060;
}
@@ -1661,7 +1661,7 @@ void sub_8128BA0(u8 taskId)
void sub_8128BBC(u8 taskId)
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = c1_overworld_prev_quest;
}
@@ -2635,7 +2635,7 @@ void sub_812A1A0(u8 taskId)
void sub_812A1C0(u8 taskId)
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = sub_81298EC;
}
@@ -2654,7 +2654,7 @@ void sub_812A210(u8 taskId)
void sub_812A22C(u8 taskId)
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = sub_812A25C;
}
diff --git a/src/diploma.c b/src/diploma.c
index fedc10bd0..89447c5ba 100644
--- a/src/diploma.c
+++ b/src/diploma.c
@@ -3,7 +3,7 @@
#include "palette.h"
#include "main.h"
#include "gpu_regs.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "task.h"
#include "malloc.h"
#include "decompress.h"
@@ -17,7 +17,7 @@ extern int decompress_and_copy_tile_data_to_vram(u8 bg_id, void *src, int size,
extern bool8 free_temp_tile_data_buffers_if_possible(void);
extern void sub_80861E8(void); // rom4
extern bool16 sub_80C0944(void);
-extern void AddTextPrinterParametrized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, struct TextColor *color, s8 speed, u8 *str);
+extern void AddTextPrinterParameterized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, struct TextColor *color, s8 speed, u8 *str);
extern u16 gUnknown_0860F074[];
@@ -215,5 +215,5 @@ static void PrintDiplomaText(u8 *text, u8 var1, u8 var2)
.shadowColor = 3,
};
- AddTextPrinterParametrized2(0, 1, var1, var2, 0, 0, &color, -1, text);
+ AddTextPrinterParameterized2(0, 1, var1, var2, 0, 0, &color, -1, text);
}
diff --git a/src/egg_hatch.c b/src/egg_hatch.c
index b3cd88585..e262a8281 100644
--- a/src/egg_hatch.c
+++ b/src/egg_hatch.c
@@ -60,7 +60,7 @@ extern const u8 gText_NickHatchPrompt[];
extern u8 sav1_map_get_name(void);
extern void TVShowConvertInternationalString(u8* str1, u8* str2, u8);
extern void sub_806A068(u16, u8);
-extern void fade_screen(u8, u8);
+extern void FadeScreen(u8, u8);
extern void overworld_free_bg_tilemaps(void);
extern void sub_80AF168(void);
extern void ScanlineEffect_Stop(void);
@@ -459,7 +459,7 @@ void EggHatch(void)
{
ScriptContext2_Enable();
CreateTask(Task_EggHatch, 10);
- fade_screen(1, 0);
+ FadeScreen(1, 0);
}
static void Task_EggHatch(u8 taskID)
@@ -860,7 +860,7 @@ static void EggHatchPrintMessage(u8 windowId, u8* string, u8 x, u8 y, u8 speed)
sEggHatchData->textColor.fgColor = 0;
sEggHatchData->textColor.bgColor = 5;
sEggHatchData->textColor.shadowColor = 6;
- AddTextPrinterParametrized2(windowId, 1, x, y, 0, 0, &sEggHatchData->textColor, speed, string);
+ AddTextPrinterParameterized2(windowId, 1, x, y, 0, 0, &sEggHatchData->textColor, speed, string);
}
u8 GetEggStepsToSubtract(void)
diff --git a/src/evolution_scene.c b/src/evolution_scene.c
index 2ce788f8e..84ac7cc32 100644
--- a/src/evolution_scene.c
+++ b/src/evolution_scene.c
@@ -11,7 +11,7 @@
#include "pokemon.h"
#include "string_util.h"
#include "battle.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "decompress.h"
#include "m4a.h"
#include "menu.h"
@@ -1364,7 +1364,7 @@ static void VBlankCB_EvolutionScene(void)
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
- sub_80BA0A8();
+ ScanlineEffect_InitHBlankDmaTransfer();
}
static void VBlankCB_TradeEvolutionScene(void)
@@ -1381,7 +1381,7 @@ static void VBlankCB_TradeEvolutionScene(void)
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
- sub_80BA0A8();
+ ScanlineEffect_InitHBlankDmaTransfer();
}
static void sub_813FDEC(u8 taskId)
diff --git a/src/field_map_obj.c b/src/field_map_obj.c
index df80494b3..906eff4b7 100644
--- a/src/field_map_obj.c
+++ b/src/field_map_obj.c
@@ -14,7 +14,7 @@
#include "rom_818CFC8.h"
#include "rom_81BE66C.h"
#include "field_ground_effect.h"
-#include "map_obj_8097404.h"
+#include "field_map_obj_helpers.h"
#include "mauville_old_man.h"
#include "metatile_behavior.h"
#include "field_effect.h"
diff --git a/src/field_map_obj_helpers.c b/src/field_map_obj_helpers.c
new file mode 100755
index 000000000..1e0e9b66b
--- /dev/null
+++ b/src/field_map_obj_helpers.c
@@ -0,0 +1,844 @@
+#include "global.h"
+#include "field_ground_effect.h"
+#include "field_map_obj.h"
+#include "field_effect.h"
+#include "field_map_obj_helpers.h"
+#include "malloc.h"
+#include "task.h"
+#include "util.h"
+
+typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 dir);
+
+extern const struct Coords16 gUnknown_0850DB7C[4];
+extern s16 gUnknown_0850E768[];
+extern SpriteStepFunc *const gUnknown_0850E754[];
+extern const s8 gUnknown_0850E772[];
+extern const s8 gUnknown_0850E7BA[];
+extern const s8 *const gUnknown_0850E834[];
+extern s16 gUnknown_0850E840[];
+extern u8 gUnknown_0850E846[];
+extern s16 gUnknown_0850E84A[];
+extern u8 gUnknown_0850E850[];
+
+void sub_8097D68(struct Sprite *sprite);
+void sub_8097FE4(u8);
+
+bool8 FreezeMapObject(struct MapObject *mapObject)
+{
+ if (mapObject->mapobj_bit_6 || mapObject->mapobj_bit_8)
+ {
+ return TRUE;
+ }
+ else
+ {
+ mapObject->mapobj_bit_8 = 1;
+ mapObject->mapobj_bit_23 = gSprites[mapObject->spriteId].animPaused;
+ mapObject->mapobj_bit_24 = gSprites[mapObject->spriteId].affineAnimPaused;
+ gSprites[mapObject->spriteId].animPaused = 1;
+ gSprites[mapObject->spriteId].affineAnimPaused = 1;
+ return FALSE;
+ }
+}
+
+void FreezeMapObjects(void)
+{
+ u8 i;
+ for (i = 0; i < MAP_OBJECTS_COUNT; i++)
+ if (gMapObjects[i].active && i != gPlayerAvatar.mapObjectId)
+ FreezeMapObject(&gMapObjects[i]);
+}
+
+void FreezeMapObjectsExceptOne(u8 a1)
+{
+ u8 i;
+ for (i = 0; i < MAP_OBJECTS_COUNT; i++)
+ if (i != a1 && gMapObjects[i].active && i != gPlayerAvatar.mapObjectId)
+ FreezeMapObject(&gMapObjects[i]);
+}
+
+void npc_sync_anim_pause_bits(struct MapObject *mapObject)
+{
+ if (mapObject->active && mapObject->mapobj_bit_8)
+ {
+ mapObject->mapobj_bit_8 = 0;
+ gSprites[mapObject->spriteId].animPaused = mapObject->mapobj_bit_23;
+ gSprites[mapObject->spriteId].affineAnimPaused = mapObject->mapobj_bit_24;
+ }
+}
+
+void UnfreezeMapObjects(void)
+{
+ u8 i;
+ for (i = 0; i < MAP_OBJECTS_COUNT; i++)
+ if (gMapObjects[i].active)
+ npc_sync_anim_pause_bits(&gMapObjects[i]);
+}
+
+void little_step(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += gUnknown_0850DB7C[dir].x;
+ sprite->pos1.y += gUnknown_0850DB7C[dir].y;
+}
+
+void double_little_steps(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += 2 * (u16) gUnknown_0850DB7C[dir].x;
+ sprite->pos1.y += 2 * (u16) gUnknown_0850DB7C[dir].y;
+}
+
+void triple_little_steps(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += 2 * (u16) gUnknown_0850DB7C[dir].x + (u16) gUnknown_0850DB7C[dir].x;
+ sprite->pos1.y += 2 * (u16) gUnknown_0850DB7C[dir].y + (u16) gUnknown_0850DB7C[dir].y;
+}
+
+void quad_little_steps(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += 4 * (u16) gUnknown_0850DB7C[dir].x;
+ sprite->pos1.y += 4 * (u16) gUnknown_0850DB7C[dir].y;
+}
+
+void oct_little_steps(struct Sprite *sprite, u8 dir)
+{
+ sprite->pos1.x += 8 * (u16) gUnknown_0850DB7C[dir].x;
+ sprite->pos1.y += 8 * (u16) gUnknown_0850DB7C[dir].y;
+}
+
+void oamt_npc_ministep_reset(struct Sprite *sprite, u8 a2, u8 a3)
+{
+ sprite->data[3] = a2;
+ sprite->data[4] = a3;
+ sprite->data[5] = 0;
+}
+
+bool8 obj_npc_ministep(struct Sprite *sprite)
+{
+ if (sprite->data[5] >= gUnknown_0850E768[sprite->data[4]])
+ return FALSE;
+
+ gUnknown_0850E754[sprite->data[4]][sprite->data[5]](sprite, sprite->data[3]);
+
+ sprite->data[5]++;
+
+ if (sprite->data[5] < gUnknown_0850E768[sprite->data[4]])
+ return FALSE;
+
+ return TRUE;
+}
+
+void sub_80976DC(struct Sprite *sprite, u8 a2)
+{
+ sprite->data[3] = a2;
+ sprite->data[4] = 0;
+ sprite->data[5] = 0;
+}
+
+bool8 sub_80976EC(struct Sprite *sprite)
+{
+ if (!(sprite->data[4] & 1))
+ {
+ little_step(sprite, sprite->data[3]);
+ sprite->data[5]++;
+ }
+
+ sprite->data[4]++;
+
+ if (sprite->data[5] > 15)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+// new helper added here in the middle. Perhaps Game Freak kept these organized in alphebetical order or some other heirarchy?
+
+s16 sub_8097728(s16 a1)
+{
+ return gUnknown_0850E7BA[a1];
+}
+
+s16 sub_809773C(s16 a1)
+{
+ return gUnknown_0850E772[a1];
+}
+
+void sub_8097750(struct Sprite *sprite)
+{
+ sprite->data[6] = 0;
+ sprite->data[7] = 0;
+}
+
+bool8 sub_8097758(struct Sprite *sprite)
+{
+ bool8 result = FALSE;
+
+ switch(sprite->data[7])
+ {
+ case 0:
+ sprite->pos2.x += sub_809773C(sprite->data[6]);
+ sprite->pos2.y += sub_8097728(sprite->data[6]);
+ break;
+ case 1:
+ sprite->pos2.x -= sub_809773C(0x47 - sprite->data[6]);
+ sprite->pos2.y += sub_8097728(0x47 - sprite->data[6]);
+ break;
+ case 2:
+ sprite->pos2.x -= sub_809773C(sprite->data[6]);
+ sprite->pos2.y += sub_8097728(sprite->data[6]);
+ break;
+ case 3:
+ sprite->pos2.x += sub_809773C(0x47 - sprite->data[6]);
+ sprite->pos2.y += sub_8097728(0x47 - sprite->data[6]);
+ break;
+ }
+ if(++sprite->data[6] == 0x48)
+ {
+ sprite->data[6] = 0;
+ sprite->data[7]++;
+ }
+ if(sprite->data[7] == 0x4)
+ {
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+ result = TRUE;
+ }
+ return result;
+}
+
+s16 sub_8097820(s16 a1, u8 a2)
+{
+ return gUnknown_0850E834[a2][a1];
+}
+
+void sub_809783C(struct Sprite *sprite, u8 a2, u8 a3, u8 a4)
+{
+ sprite->data[3] = a2;
+ sprite->data[4] = a3;
+ sprite->data[5] = a4;
+ sprite->data[6] = 0;
+}
+
+u8 sub_809785C(struct Sprite *sprite)
+{
+ s16 v5[3];
+ u8 v6[3];
+ u8 v2;
+
+ memcpy(v5, gUnknown_0850E840, 6); // TODO: get rid of memcpy
+ memcpy(v6, gUnknown_0850E846, 3);
+ v2 = 0;
+
+ if (sprite->data[4])
+ little_step(sprite, sprite->data[3]);
+
+ sprite->pos2.y = sub_8097820(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]);
+
+ sprite->data[6]++;
+
+ if (sprite->data[6] == (v5[sprite->data[4]] >> 1))
+ v2 = 1;
+
+ if (sprite->data[6] >= v5[sprite->data[4]])
+ {
+ sprite->pos2.y = 0;
+ v2 = -1;
+ }
+
+ return v2;
+}
+
+u8 sub_80978E4(struct Sprite *sprite)
+{
+ s16 v5[3];
+ u8 v6[3];
+ u8 v2;
+
+ memcpy(v5, gUnknown_0850E84A, 6);
+ memcpy(v6, gUnknown_0850E850, 3);
+ v2 = 0;
+
+ if (sprite->data[4] && !(sprite->data[6] & 1))
+ little_step(sprite, sprite->data[3]);
+
+ sprite->pos2.y = sub_8097820(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]);
+
+ sprite->data[6]++;
+
+ if (sprite->data[6] == (v5[sprite->data[4]] >> 1))
+ v2 = 1;
+
+ if (sprite->data[6] >= v5[sprite->data[4]])
+ {
+ sprite->pos2.y = 0;
+ v2 = -1;
+ }
+
+ return v2;
+}
+
+void SetFieldObjectStepTimer(struct Sprite *sprite, u16 timer)
+{
+ sprite->data[3] = timer;
+}
+
+
+bool8 RunFieldObjectStepTimer(struct Sprite *sprite)
+{
+ sprite->data[3]--;
+
+ if (sprite->data[3] == 0)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void obj_anim_image_set_and_seek(struct Sprite *sprite, u8 a2, u8 a3)
+{
+ sprite->animNum = a2;
+ sprite->animPaused = 0 ;
+ SeekSpriteAnim(sprite, a3);
+}
+
+bool8 sub_80979BC(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void sub_80979D4(struct Sprite *sprite, bool8 invisible)
+{
+ u16 x, y;
+ s16 x2, y2;
+
+ sprite->invisible = invisible;
+
+ if (sprite->coordOffsetEnabled)
+ {
+ x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX;
+ y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY;
+ }
+ else
+ {
+ x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX;
+ y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY;
+ }
+
+ x2 = x - (sprite->centerToCornerVecX >> 1);
+ y2 = y - (sprite->centerToCornerVecY >> 1);
+
+ if ((s16)x > 255 || x2 < -16)
+ sprite->invisible = 1;
+ if ((s16)y > 175 || y2 < -16)
+ sprite->invisible = 1;
+}
+
+void sub_8097AC8(struct Sprite *sprite)
+{
+ sub_8097D68(sprite);
+ SetObjectSubpriorityByZCoord(sprite->data[1], sprite, 1);
+ sub_80979D4(sprite, sprite->data[2]);
+}
+
+void sub_8097AF0(void)
+{
+ int i;
+
+ for(i = 0; i < MAX_SPRITES; i++)
+ {
+ struct Sprite *sprite = &gSprites[i];
+ if(sprite->inUse && sprite->callback == sub_8097AC8)
+ DestroySprite(sprite);
+ }
+}
+
+int sub_8097B2C(u8 var) // this should return a u8, because all that call this shifts to u8, but it wont match because it doesnt shift u8 at the end.
+{
+ int i;
+
+ for(i = 0; i < MAX_SPRITES; i++)
+ {
+ struct Sprite *sprite = &gSprites[i];
+ if(sprite->inUse && sprite->callback == sub_8097AC8 && (u8)sprite->data[0] == var)
+ return i;
+ }
+ return MAX_SPRITES;
+}
+
+void sub_8097B78(u8 var1, u8 var2)
+{
+ u8 spriteId = sub_8097B2C(var1);
+
+ if(spriteId != MAX_SPRITES)
+ StartSpriteAnim(&gSprites[spriteId], FieldObjectDirectionToImageAnimId(var2));
+}
+
+void sub_8097BB4(u8 var1, u8 var2)
+{
+ int spriteId = sub_8097B2C(var1);
+
+ if(spriteId != MAX_SPRITES)
+ {
+ struct Sprite *sprite = &gSprites[spriteId];
+ const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(var2);
+ u16 tileNum = sprite->oam.tileNum;
+
+ sprite->oam = *gfxInfo->oam;
+ sprite->oam.tileNum = tileNum;
+ sprite->oam.paletteNum = gfxInfo->paletteSlot;
+ sprite->images = gfxInfo->images;
+
+ if(gfxInfo->subspriteTables == NULL)
+ {
+ sprite->subspriteTables = NULL;
+ sprite->subspriteTableNum = 0;
+ sprite->subspriteMode = 0;
+ }
+ else
+ {
+ SetSubspriteTables(sprite, gfxInfo->subspriteTables);
+ sprite->subspriteMode = 2;
+ }
+ StartSpriteAnim(sprite, 0);
+ }
+}
+
+void sub_8097C44(u8 var, bool32 var2)
+{
+ u8 spriteId = sub_8097B2C(var);
+
+ if(spriteId == MAX_SPRITES)
+ return;
+
+ if(var2)
+ gSprites[spriteId].data[2] = 1;
+ else
+ gSprites[spriteId].data[2] = 0;
+}
+
+bool32 sub_8097C8C(u8 var)
+{
+ u8 spriteId = sub_8097B2C(var);
+
+ if(spriteId == MAX_SPRITES)
+ return FALSE;
+
+ return (gSprites[spriteId].data[2] == TRUE);
+}
+
+void sub_8097CC4(u8 var1, u8 var2)
+{
+ u8 spriteId = sub_8097B2C(var1);
+
+ if(spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].data[3] = var2;
+ gSprites[spriteId].data[4] = 0;
+ }
+}
+
+void sub_8097CF4(struct Sprite *sprite)
+{
+ switch(sprite->data[4])
+ {
+ case 0:
+ sprite->pos2.y = 0;
+ sprite->data[4]++;
+ case 1:
+ sprite->pos2.y -= 8;
+ if(sprite->pos2.y == -160)
+ {
+ sprite->pos2.y = 0;
+ sprite->data[2] = 1;
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+ }
+ }
+}
+
+void sub_8097D30(struct Sprite *sprite)
+{
+ switch(sprite->data[4])
+ {
+ case 0:
+ sprite->pos2.y = -160;
+ sprite->data[4]++;
+ case 1:
+ sprite->pos2.y += 8;
+ if(sprite->pos2.y == 0)
+ {
+ sprite->data[3] = 0;
+ sprite->data[4] = 0;
+ }
+ }
+}
+
+void sub_8097D68(struct Sprite *sprite)
+{
+ switch(sprite->data[3])
+ {
+ case 1:
+ sub_8097D30(sprite);
+ break;
+ case 2:
+ sub_8097CF4(sprite);
+ break;
+ case 0:
+ break;
+ default:
+ sprite->data[3] = 0;
+ break;
+ }
+}
+
+bool32 sub_8097D9C(u8 var)
+{
+ u8 spriteId = sub_8097B2C(var);
+
+ if(spriteId == MAX_SPRITES)
+ return FALSE;
+
+ if(gSprites[spriteId].data[3] != FALSE)
+ return TRUE;
+
+ return FALSE;
+}
+
+u32 oe_exec_and_other_stuff(u8 fieldEffectId, struct MapObject *mapObject)
+{
+ FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
+ return FieldEffectStart(fieldEffectId);
+}
+
+void DoShadowFieldEffect(struct MapObject *mapObject)
+{
+ if (!mapObject->mapobj_bit_22)
+ {
+ mapObject->mapobj_bit_22 = 1;
+ oe_exec_and_other_stuff(FLDEFF_SHADOW, mapObject);
+ }
+}
+
+void DoRippleFieldEffect(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId);
+ gFieldEffectArguments[0] = sprite->pos1.x;
+ gFieldEffectArguments[1] = sprite->pos1.y + (gfxInfo->height >> 1) - 2;
+ gFieldEffectArguments[2] = 151;
+ gFieldEffectArguments[3] = 3;
+ FieldEffectStart(FLDEFF_RIPPLE);
+}
+
+#ifdef NONMATCHING
+bool32 sub_8097E50(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ bool32 ableToStore = FALSE;
+ if (gUnknown_020375B8 == NULL)
+ {
+ gUnknown_020375B8 = AllocZeroed(0x14);
+ gUnknown_020375B8[0] = mapObject->localId;
+ gUnknown_020375B8[16] = 1;
+ ableToStore = TRUE;
+ }
+ else
+ {
+ u8 i;
+ u8 firstFreeSlot;
+ bool32 found;
+ for (firstFreeSlot = 16, found = FALSE, i = 0; i < 16; i++)
+ {
+ if (firstFreeSlot == 16 && gUnknown_020375B8[i] == 0)
+ firstFreeSlot = i;
+
+ if (gUnknown_020375B8[i] == mapObject->localId)
+ {
+ found = TRUE;
+ break;
+ }
+ }
+
+ if (!found && firstFreeSlot != 16)
+ {
+ gUnknown_020375B8[firstFreeSlot] = mapObject->localId;
+ gUnknown_020375B8[16]++;
+ ableToStore = TRUE; // the nonmatching problem is that ableToStore == TRUE isnt being merged with the above ableToStore = TRUE assignment.
+ }
+ }
+
+ if (ableToStore == TRUE)
+ {
+ mapObject->mapobj_bit_12 = TRUE;
+ mapObject->mapobj_bit_9 = TRUE;
+ }
+
+ sprite->data[2] = 1;
+ return TRUE;
+}
+#else
+__attribute__((naked))
+bool32 sub_8097E50(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r8\n\
+ push {r7}\n\
+ adds r4, r0, 0\n\
+ mov r8, r1\n\
+ movs r0, 0\n\
+ mov r12, r0\n\
+ ldr r0, =gUnknown_020375B8\n\
+ ldr r1, [r0]\n\
+ adds r6, r0, 0\n\
+ cmp r1, 0\n\
+ bne _08097E80\n\
+ movs r0, 0x14\n\
+ bl AllocZeroed\n\
+ str r0, [r6]\n\
+ ldrb r1, [r4, 0x8]\n\
+ strb r1, [r0]\n\
+ ldr r1, [r6]\n\
+ movs r0, 0x1\n\
+ strb r0, [r1, 0x10]\n\
+ b _08097ECC\n\
+ .pool\n\
+_08097E80:\n\
+ movs r2, 0x10\n\
+ movs r5, 0\n\
+ movs r1, 0\n\
+ adds r3, r6, 0\n\
+ b _08097E90\n\
+_08097E8A:\n\
+ adds r0, r1, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r1, r0, 24\n\
+_08097E90:\n\
+ cmp r1, 0xF\n\
+ bhi _08097EB2\n\
+ cmp r2, 0x10\n\
+ bne _08097EA4\n\
+ ldr r0, [r3]\n\
+ adds r0, r1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _08097EA4\n\
+ adds r2, r1, 0\n\
+_08097EA4:\n\
+ ldr r0, [r3]\n\
+ adds r0, r1\n\
+ ldrb r0, [r0]\n\
+ ldrb r7, [r4, 0x8]\n\
+ cmp r0, r7\n\
+ bne _08097E8A\n\
+ movs r5, 0x1\n\
+_08097EB2:\n\
+ cmp r5, 0\n\
+ bne _08097ECE\n\
+ cmp r2, 0x10\n\
+ beq _08097ECE\n\
+ ldr r0, [r6]\n\
+ adds r0, r2\n\
+ ldrb r1, [r4, 0x8]\n\
+ strb r1, [r0]\n\
+ ldr r1, [r6]\n\
+ ldrb r0, [r1, 0x10]\n\
+ adds r0, 0x1\n\
+ strb r0, [r1, 0x10]\n\
+ movs r0, 0x1\n\
+_08097ECC:\n\
+ mov r12, r0\n\
+_08097ECE:\n\
+ mov r1, r12\n\
+ cmp r1, 0x1\n\
+ bne _08097EE0\n\
+ ldrb r0, [r4, 0x1]\n\
+ movs r1, 0x10\n\
+ orrs r0, r1\n\
+ movs r1, 0x2\n\
+ orrs r0, r1\n\
+ strb r0, [r4, 0x1]\n\
+_08097EE0:\n\
+ movs r0, 0x1\n\
+ mov r7, r8\n\
+ strh r0, [r7, 0x32]\n\
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4-r7}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .syntax divided");
+}
+#endif
+
+// this function is very similar to the above one and I don't want to decompile this one until the above is matching.
+__attribute__((naked))
+bool32 sub_8097EF0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r8\n\
+ push {r7}\n\
+ adds r6, r0, 0\n\
+ mov r8, r1\n\
+ movs r0, 0x1\n\
+ strh r0, [r1, 0x32]\n\
+ ldr r5, =gUnknown_020375B8\n\
+ ldr r0, [r5]\n\
+ cmp r0, 0\n\
+ beq _08097F68\n\
+ movs r7, 0\n\
+ adds r0, r6, 0\n\
+ bl sub_8097F78\n\
+ lsls r0, 24\n\
+ lsrs r1, r0, 24\n\
+ cmp r1, 0x10\n\
+ beq _08097F28\n\
+ ldr r0, [r5]\n\
+ adds r0, r1\n\
+ movs r1, 0\n\
+ strb r1, [r0]\n\
+ ldr r1, [r5]\n\
+ ldrb r0, [r1, 0x10]\n\
+ subs r0, 0x1\n\
+ strb r0, [r1, 0x10]\n\
+ movs r7, 0x1\n\
+_08097F28:\n\
+ ldr r0, [r5]\n\
+ ldrb r4, [r0, 0x10]\n\
+ cmp r4, 0\n\
+ bne _08097F36\n\
+ bl Free\n\
+ str r4, [r5]\n\
+_08097F36:\n\
+ cmp r7, 0x1\n\
+ bne _08097F68\n\
+ ldrb r0, [r6, 0x5]\n\
+ bl GetFieldObjectGraphicsInfo\n\
+ ldrb r1, [r0, 0xC]\n\
+ lsls r1, 25\n\
+ lsrs r1, 31\n\
+ lsls r1, 4\n\
+ ldrb r2, [r6, 0x1]\n\
+ movs r0, 0x11\n\
+ negs r0, r0\n\
+ ands r0, r2\n\
+ orrs r0, r1\n\
+ movs r1, 0x3\n\
+ negs r1, r1\n\
+ ands r0, r1\n\
+ strb r0, [r6, 0x1]\n\
+ mov r2, r8\n\
+ adds r2, 0x2C\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0x41\n\
+ negs r0, r0\n\
+ ands r0, r1\n\
+ strb r0, [r2]\n\
+_08097F68:\n\
+ movs r0, 0x1\n\
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4-r7}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .pool\n\
+ .syntax divided");
+}
+
+u8 sub_8097F78(struct MapObject *mapObject)
+{
+ u8 i;
+
+ for(i = 0; i < MAP_OBJECTS_COUNT; i++)
+ {
+ if(gUnknown_020375B8[i] == mapObject->localId)
+ return i;
+ }
+ return MAP_OBJECTS_COUNT;
+}
+
+void sub_8097FA4(struct MapObject *mapObject)
+{
+ u8 taskId = CreateTask(sub_8097FE4, 0xFF);
+ struct Task *task = &gTasks[taskId];
+
+ StoreWordInTwoHalfwords(&task->data[0], (u32)mapObject);
+ mapObject->mapobj_unk_1B = taskId;
+ task->data[3] = 0xFFFF;
+}
+
+void sub_8097FE4(u8 taskId)
+{
+ struct MapObject *mapObject;
+ struct Sprite *sprite;
+ struct Task *task = &gTasks[taskId];
+
+ LoadWordFromTwoHalfwords(&task->data[0], (u32 *)&mapObject); // load the map object pointer.
+ sprite = &gSprites[mapObject->spriteId];
+
+ if(!(task->data[2] & 0x3))
+ sprite->pos2.y += task->data[3];
+
+ if(!(task->data[2] & 0xF))
+ task->data[3] = -task->data[3];
+
+ task->data[2]++;
+}
+
+void sub_8098044(u8 taskId)
+{
+ u32 word;
+ struct Task *task = &gTasks[taskId];
+
+ LoadWordFromTwoHalfwords(&task->data[0], &word); // huh??? why does it load a word that never gets used???
+ DestroyTask(taskId);
+}
+
+void sub_8098074(u8 var1, u8 var2)
+{
+ u8 i;
+
+ for(i = 0; i < MAP_OBJECTS_COUNT; i++)
+ {
+ if(i != var1 && i != var2 &&
+ gMapObjects[i].active && i != gPlayerAvatar.mapObjectId)
+ FreezeMapObject(&gMapObjects[i]);
+ }
+}
+
+bool32 sub_80980C0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sprite->pos2.y = 0;
+ sprite->data[2]++;
+ return FALSE;
+}
+
+bool32 sub_80980D0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sprite->pos2.y -= 8;
+
+ if(sprite->pos2.y == -160)
+ sprite->data[2]++;
+ return FALSE;
+}
+
+bool32 sub_80980F4(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sprite->pos2.y = -160;
+ sprite->data[2]++;
+ return FALSE;
+}
+
+bool32 sub_8098108(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sprite->pos2.y += 8;
+
+ if(!sprite->pos2.y)
+ sprite->data[2]++;
+ return FALSE;
+}
+
+// though this function returns TRUE without doing anything, this header is required due to being in an array of functions which needs it.
+bool32 sub_8098124(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ return TRUE;
+}
diff --git a/src/field_message_box.c b/src/field_message_box.c
new file mode 100755
index 000000000..9570040eb
--- /dev/null
+++ b/src/field_message_box.c
@@ -0,0 +1,154 @@
+#include "global.h"
+#include "new_menu_helpers.h"
+#include "string.h"
+#include "string_util.h"
+#include "task.h"
+#include "text.h"
+
+EWRAM_DATA u8 gUnknown_020375BC = 0;
+
+void textbox_fdecode_auto_and_task_add(u8*, int);
+void textbox_auto_and_task_add(void);
+
+void sub_8098128(void)
+{
+ gUnknown_020375BC = 0;
+ gTextFlags.flag_0 = 0;
+ gTextFlags.flag_1 = 0;
+ gTextFlags.flag_2 = 0;
+ gTextFlags.flag_3 = 0;
+}
+
+void sub_8098154(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ sub_81973A4();
+ task->data[0]++;
+ break;
+ case 1:
+ sub_81973C4(0, 1);
+ task->data[0]++;
+ break;
+ case 2:
+ if (sub_8197224() != 1)
+ {
+ gUnknown_020375BC = 0;
+ DestroyTask(taskId);
+ }
+ }
+}
+
+void task_add_textbox(void)
+{
+ CreateTask(sub_8098154, 0x50);
+}
+
+void task_del_textbox(void)
+{
+ u8 taskId = FindTaskIdByFunc(sub_8098154);
+ if (taskId != 0xFF)
+ DestroyTask(taskId);
+}
+
+bool8 ShowFieldMessage(u8 *str)
+{
+ if (gUnknown_020375BC != 0)
+ return FALSE;
+ textbox_fdecode_auto_and_task_add(str, 1);
+ gUnknown_020375BC = 2;
+ return TRUE;
+}
+
+void sub_8098214(u8 taskId)
+{
+ if (sub_8196094() == 0)
+ {
+ gUnknown_020375BC = 0;
+ DestroyTask(taskId);
+ }
+}
+
+bool8 sub_8098238(u8 *str)
+{
+ if (gUnknown_020375BC != 0)
+ return FALSE;
+ StringExpandPlaceholders(gStringVar4, str);
+ CreateTask(sub_8098214, 0);
+ sub_8196080(str);
+ gUnknown_020375BC = 2;
+ return TRUE;
+}
+
+bool8 ShowFieldAutoScrollMessage(u8 *str)
+{
+ if (gUnknown_020375BC != 0)
+ return FALSE;
+ gUnknown_020375BC = 3;
+ textbox_fdecode_auto_and_task_add(str, 0);
+ return TRUE;
+}
+
+bool8 sub_80982A0(u8 *str)
+{
+ gUnknown_020375BC = 3;
+ textbox_fdecode_auto_and_task_add(str, 1);
+ return TRUE;
+}
+
+bool8 sub_80982B8(void)
+{
+ if (gUnknown_020375BC != 0)
+ return FALSE;
+ gUnknown_020375BC = 2;
+ textbox_auto_and_task_add();
+ return TRUE;
+}
+
+void textbox_fdecode_auto_and_task_add(u8* str, int a)
+{
+ StringExpandPlaceholders(gStringVar4, str);
+ AddTextPrinterForMessage(a);
+ task_add_textbox();
+}
+
+void textbox_auto_and_task_add(void)
+{
+ AddTextPrinterForMessage(1);
+ task_add_textbox();
+}
+
+void HideFieldMessageBox(void)
+{
+ task_del_textbox();
+ sub_8197434(0, 1);
+ gUnknown_020375BC = 0;
+}
+
+u8 textbox_any_visible(void)
+{
+ return gUnknown_020375BC;
+}
+
+bool8 IsFieldMessageBoxHidden(void)
+{
+ if (gUnknown_020375BC == 0)
+ return TRUE;
+ return FALSE;
+}
+
+void sub_8098358(void)
+{
+ task_del_textbox();
+ sub_81973FC(0, 1);
+ gUnknown_020375BC = 0;
+}
+
+void sub_8098374(void)
+{
+ task_del_textbox();
+ gUnknown_020375BC = 0;
+}
diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c
index 3e70e22fa..e7caf9316 100644
--- a/src/hall_of_fame.c
+++ b/src/hall_of_fame.c
@@ -20,11 +20,12 @@
#include "string_util.h"
#include "m4a.h"
#include "international_string_util.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "trig.h"
#include "random.h"
#include "event_data.h"
#include "overworld.h"
+#include "new_menu_helpers.h"
struct HallofFameMon
{
@@ -53,7 +54,6 @@ static EWRAM_DATA struct HofGfx *sHofGfxPtr = NULL;
extern bool8 gHasHallOfFameRecords;
extern u32 gUnknown_0203BCD4;
-extern u8 gDecompressionBuffer[];
extern struct MusicPlayerInfo gMPlayInfo_BGM;
extern MainCallback gGameContinueCallback;
extern u32 gDamagedSaveSectors;
@@ -82,7 +82,6 @@ extern const u8 gContestConfetti_Gfx[];
extern const u8 gContestConfetti_Pal[];
extern void sub_81973C4(u8, u8);
-extern u16 AddTextPrinterParametrized(u8 windowId, u8 fontId, const u8 *str, u8 speed, void ( *callback)(u16, struct TextPrinter *), u8 fgColor, u8 bgColor, u8 shadowColor);
extern void sub_8175620(void);
extern u8 TrySavingData(u8);
extern u8 sub_818D3E4(u16 species, u32 trainerId, u32 personality, u8 flags, s16 x, s16 y, u8, u16);
@@ -540,7 +539,7 @@ static void Task_Hof_InitTeamSaveData(u8 taskId)
*lastSavedTeam = *sHofMonPtr;
sub_81973C4(0, 0);
- AddTextPrinterParametrized(0, 1, gText_SavingDontTurnOffPower, 0, NULL, 2, 1, 3);
+ AddTextPrinterParameterized(0, 1, gText_SavingDontTurnOffPower, 0, NULL, 2, 1, 3);
CopyWindowToVram(0, 3);
gTasks[taskId].func = Task_Hof_TrySaveData;
}
@@ -747,7 +746,7 @@ static void Task_Hof_WaitAndPrintPlayerInfo(u8 taskId)
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20);
HallOfFame_PrintPlayerInfo(1, 2);
sub_81973C4(0, 0);
- AddTextPrinterParametrized(0, 1, gText_LeagueChamp, 0, NULL, 2, 1, 3);
+ AddTextPrinterParameterized(0, 1, gText_LeagueChamp, 0, NULL, 2, 1, 3);
CopyWindowToVram(0, 3);
gTasks[taskId].func = Task_Hof_ExitOnKeyPressed;
}
@@ -1116,7 +1115,7 @@ static void Task_HofPC_PrintDataIsCorrupted(u8 taskId)
{
sub_8198180(gText_UnkCtrlF800Exit, 8, 1);
sub_81973C4(0, 0);
- AddTextPrinterParametrized(0, 1, gText_HOFCorrupted, 0, NULL, 2, 1, 3);
+ AddTextPrinterParameterized(0, 1, gText_HOFCorrupted, 0, NULL, 2, 1, 3);
CopyWindowToVram(0, 3);
gTasks[taskId].func = Task_HofPC_ExitOnButtonPress;
}
diff --git a/src/item_use.c b/src/item_use.c
new file mode 100755
index 000000000..8fe705a50
--- /dev/null
+++ b/src/item_use.c
@@ -0,0 +1,1271 @@
+#include "global.h"
+#include "battle.h"
+#include "berry.h"
+#include "bike.h"
+#include "coins.h"
+#include "constants/flags.h"
+#include "constants/items.h"
+#include "constants/songs.h"
+#include "constants/vars.h"
+#include "data2.h"
+#include "event_data.h"
+#include "fieldmap.h"
+#include "field_map_obj.h"
+#include "field_player_avatar.h"
+#include "field_screen.h"
+#include "field_weather.h"
+#include "item.h"
+#include "field_map_obj_helpers.h"
+#include "mail.h"
+#include "metatile_behavior.h"
+#include "overworld.h"
+#include "palette.h"
+#include "pokemon.h"
+#include "rom_818CFC8.h"
+#include "script.h"
+#include "sound.h"
+#include "string_util.h"
+#include "task.h"
+#include "text.h"
+
+extern u16 gSpecialVar_ItemId;
+extern void(**gUnknown_0203CE54)(void);
+extern void(**gUnknown_0203CF2C)(void);
+extern void(*gUnknown_0203A0F4)(u8 taskId);
+extern void(*gUnknown_085920D8[])(void);
+extern void (*gUnknown_03006328)(u8, u16, TaskFunc);
+extern void unknown_ItemMenu_Confirm(u8 taskId);
+extern void sub_81C5B14(u8 taskId);
+extern u8 gText_DadsAdvice[];
+extern u8 gText_CantDismountBike[];
+extern void sub_8197434(u8 a, u8 b);
+extern void sub_80984F4(void);
+extern void ItemUseOutOfBattle_TMHM(u8 a);
+extern void ItemUseOutOfBattle_EvolutionStone(u8 b);
+extern void bag_menu_mail_related(void);
+extern void OpenPokeblockCase(u8 a, void(*b)(void));
+extern void overworld_free_bg_tilemaps(void);
+extern bool32 sav1_map_is_biking_allowed(void);
+extern bool8 IsPlayerFacingSurfableFishableWater(void);
+extern bool8 sub_81221AC(void);
+extern u8 gText_ItemFinderNothing[];
+extern u8 gText_ItemFinderNearby[];
+extern u8 gText_ItemFinderOnTop[];
+extern u8 gText_CoinCase[];
+extern u8 gText_PowderQty[];
+extern u8 gUnknown_085920E4[];
+extern u8 Route102_EventScript_274482[];
+extern u8 Route102_EventScript_2744C0[];
+extern u8 BattleFrontier_OutsideEast_EventScript_242CFC[];
+extern u8 gText_BootedUpHM[];
+extern u8 gText_BootedUpTM[];
+extern u8 gText_TMHMContainedVar1[];
+extern u8 gText_PlayerUsedVar2[];
+extern u8 gText_RepelEffectsLingered[];
+extern u8 gText_UsedVar2WildLured[];
+extern u8 gText_UsedVar2WildRepelled[];
+extern u8 gText_BoxFull[];
+extern u8 gText_WontHaveEffect[];
+extern int sub_80247BC(void);
+extern struct MapHeader* mapconnection_get_mapheader(struct MapConnection *connection);
+extern void SetUpItemUseCallback(u8 taskId);
+extern void ItemUseCB_Medicine(u8, u16, TaskFunc);
+extern void sub_81B67C8(u8, u16, TaskFunc);
+extern void sub_81B79E8(u8, u16, TaskFunc);
+extern void dp05_ether(u8, u16, TaskFunc);
+extern void dp05_pp_up(u8, u16, TaskFunc);
+extern void dp05_rare_candy(u8, u16, TaskFunc);
+extern void sub_81B6DC4(u8, u16, TaskFunc);
+extern void sub_81B7C74(u8, u16, TaskFunc);
+extern u16 ItemIdToBattleMoveId(u16);
+extern void bag_menu_yes_no(u8, u8, void(**)(u8 taskId));
+extern void (*gUnknown_085920E8[])(u8 taskId);
+extern void sub_81C5924(void);
+extern void sub_81C59BC(void);
+extern void sub_81AB9A8(u8);
+extern void sub_81ABA88(u8);
+extern void sub_80B7CC8(void);
+extern void flagmods_08054D70(void);
+extern u8* sub_806CF78(u16);
+extern bool8 ExecuteTableBasedItemEffect_(struct Pokemon*, u16, u8, u8);
+extern u8 gBankInMenu;
+extern u16 gBattlePartyID[];
+extern void sub_81B89F0(void);
+extern u8 GetItemEffectType(u16);
+
+void MapPostLoadHook_UseItem(void);
+extern void sub_80AF6D4(void);
+void Task_CallItemUseOnFieldCallback(u8 taskId);
+void bag_menu_inits_lists_menu(u8 taskId);
+void ItemUseOnFieldCB_Bike(u8 taskId);
+void ItemUseOnFieldCB_Rod(u8 taskId);
+void ItemUseOnFieldCB_Itemfinder(u8 taskId);
+void sub_80FD504(u8 taskId);
+void sub_80FD5CC(u8 taskId);
+void sub_80FDA94(u8 taskId);
+void sub_80FDADC(u8 taskId);
+void sub_80FD7C8(u8 taskId);
+void sub_80FDC00(u8 taskId);
+void sub_80FDD74(u8 taskId);
+void sub_80FDE08(u8 taskId);
+void sub_80FDE7C(u8 taskId);
+void sub_80FDF90(u8 taskId);
+void task08_0809AD8C(u8 taskId);
+void sub_80FE024(u8 taskId);
+void sub_80FE124(u8 taskId);
+void sub_80FE164(u8 taskId);
+
+void DisplayItemMessage(u8 taskId, u8 a, u8* str, void(*callback)(u8 taskId));
+void DisplayItemMessageInBattlePyramid(u8 taskId, u8* str, void(*callback)(u8 taskId));
+void DisplayItemMessageOnField(u8 taskId, u8* str, void(*callback)(u8 taskId));
+void sub_81C6714(u8 taskId);
+void CleanUpAfterFailingToUseRegisteredKeyItemOnField(u8 taskId);
+void StartFishing(u8 a);
+bool8 ItemfinderCheckForHiddenItems(struct MapEvents *, u8);
+u8 sub_80FD9B0(s16 a, s16 b);
+void sub_80FDA24(u8 a);
+void sub_80FD8E0(u8 taskId, s16 x, s16 y);
+void sub_80FDBEC(void);
+bool8 sub_80FDE2C(void);
+void ItemUseOutOfBattle_CannotUse(u8 taskId);
+
+void SetUpItemUseCallback(u8 taskId)
+{
+ u8 type;
+ if (gSpecialVar_ItemId == ITEM_ENIGMA_BERRY)
+ type = gTasks[taskId].data[4] - 1;
+ else
+ type = ItemId_GetType(gSpecialVar_ItemId) - 1;
+ if (!InBattlePyramid())
+ {
+ *gUnknown_0203CE54 = gUnknown_085920D8[type];
+ unknown_ItemMenu_Confirm(taskId);
+ }
+ else
+ {
+ *gUnknown_0203CF2C = gUnknown_085920D8[type];
+ sub_81C5B14(taskId);
+ }
+}
+
+void SetUpItemUseOnFieldCallback(u8 taskId)
+{
+ if (gTasks[taskId].data[3] != 1)
+ {
+ gFieldCallback = MapPostLoadHook_UseItem;
+ SetUpItemUseCallback(taskId);
+ }
+ else
+ gUnknown_0203A0F4(taskId);
+}
+
+void MapPostLoadHook_UseItem(void)
+{
+ pal_fill_black();
+ CreateTask(Task_CallItemUseOnFieldCallback, 8);
+}
+
+void Task_CallItemUseOnFieldCallback(u8 taskId)
+{
+ if (sub_80ABDFC() == 1)
+ gUnknown_0203A0F4(taskId);
+}
+
+void DisplayCannotUseItemMessage(u8 taskId, bool8 isUsingRegisteredKeyItemOnField, const u8 *str)
+{
+ StringExpandPlaceholders(gStringVar4, str);
+ if (!isUsingRegisteredKeyItemOnField)
+ {
+ if (!InBattlePyramid())
+ DisplayItemMessage(taskId, 1, gStringVar4, bag_menu_inits_lists_menu);
+ else
+ DisplayItemMessageInBattlePyramid(taskId, gText_DadsAdvice, sub_81C6714);
+ }
+ else
+ DisplayItemMessageOnField(taskId, gStringVar4, CleanUpAfterFailingToUseRegisteredKeyItemOnField);
+}
+
+void DisplayDadsAdviceCannotUseItemMessage(u8 taskId, bool8 isUsingRegisteredKeyItemOnField)
+{
+ DisplayCannotUseItemMessage(taskId, isUsingRegisteredKeyItemOnField, gText_DadsAdvice);
+}
+
+void DisplayCannotDismountBikeMessage(u8 taskId, bool8 isUsingRegisteredKeyItemOnField)
+{
+ DisplayCannotUseItemMessage(taskId, isUsingRegisteredKeyItemOnField, gText_CantDismountBike);
+}
+
+void CleanUpAfterFailingToUseRegisteredKeyItemOnField(u8 taskId)
+{
+ sub_8197434(0, 1);
+ DestroyTask(taskId);
+ sub_80984F4();
+ ScriptContext2_Disable();
+}
+
+u8 CheckIfItemIsTMHMOrEvolutionStone(u16 itemId)
+{
+ if (ItemId_GetFieldFunc(itemId) == ItemUseOutOfBattle_TMHM)
+ return 1;
+ else if (ItemId_GetFieldFunc(itemId) == ItemUseOutOfBattle_EvolutionStone)
+ return 2;
+ else
+ return 0;
+}
+
+void sub_80FD254()
+{
+ struct MailStruct mail;
+ mail.itemId = gSpecialVar_ItemId;
+ ReadMail(&mail, bag_menu_mail_related, 0);
+}
+
+void ItemUseOutOfBattle_Mail(u8 taskId)
+{
+ *gUnknown_0203CE54 = sub_80FD254;
+ unknown_ItemMenu_Confirm(taskId);
+}
+
+void ItemUseOutOfBattle_Bike(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+ s16 coordsY;
+ s16 coordsX;
+ u8 behavior;
+ PlayerGetDestCoords(&coordsX, &coordsY);
+ behavior = MapGridGetMetatileBehaviorAt(coordsX, coordsY);
+ if (FlagGet(FLAG_SYS_CYCLING_ROAD) == TRUE || MetatileBehavior_IsVerticalRail(behavior) == TRUE || MetatileBehavior_IsHorizontalRail(behavior) == TRUE || MetatileBehavior_IsIsolatedVerticalRail(behavior) == TRUE || MetatileBehavior_IsIsolatedHorizontalRail(behavior) == TRUE)
+ DisplayCannotDismountBikeMessage(taskId, data[3]);
+ else
+ {
+ if (sav1_map_is_biking_allowed() == TRUE && IsBikingDisallowedByPlayer() == 0)
+ {
+ gUnknown_0203A0F4 = ItemUseOnFieldCB_Bike;
+ SetUpItemUseOnFieldCallback(taskId);
+ }
+ else
+ DisplayDadsAdviceCannotUseItemMessage(taskId, data[3]);
+ }
+}
+
+void ItemUseOnFieldCB_Bike(u8 taskId)
+{
+ if (!ItemId_GetSecondaryId(gSpecialVar_ItemId))
+ GetOnOffBike(2);
+ else
+ GetOnOffBike(4);
+ sub_80984F4();
+ ScriptContext2_Disable();
+ DestroyTask(taskId);
+}
+
+bool32 CanFish()
+{
+ s16 x, y;
+ u16 tileBehavior;
+
+ GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
+ tileBehavior = MapGridGetMetatileBehaviorAt(x, y);
+
+ if (MetatileBehavior_IsWaterfall(tileBehavior))
+ return FALSE;
+
+ if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_4))
+ return FALSE;
+
+ if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))
+ {
+ if (IsPlayerFacingSurfableFishableWater())
+ return TRUE;
+ }
+ else
+ {
+ if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior) && !MapGridIsImpassableAt(x, y))
+ return TRUE;
+ if (MetatileBehavior_8089510(tileBehavior) == TRUE)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void ItemUseOutOfBattle_Rod(u8 taskId)
+{
+ if (CanFish() == TRUE)
+ {
+ gUnknown_0203A0F4 = ItemUseOnFieldCB_Rod;
+ SetUpItemUseOnFieldCallback(taskId);
+ }
+ else
+ DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[3]);
+}
+
+void ItemUseOnFieldCB_Rod(u8 taskId)
+{
+ StartFishing(ItemId_GetSecondaryId(gSpecialVar_ItemId));
+ DestroyTask(taskId);
+}
+
+void ItemUseOutOfBattle_Itemfinder(u8 var)
+{
+ IncrementGameStat(0x27);
+ gUnknown_0203A0F4 = ItemUseOnFieldCB_Itemfinder;
+ SetUpItemUseOnFieldCallback(var);
+}
+
+void ItemUseOnFieldCB_Itemfinder(u8 taskId)
+{
+ if (ItemfinderCheckForHiddenItems(gMapHeader.events, taskId) == TRUE)
+ gTasks[taskId].func = sub_80FD504;
+ else
+ DisplayItemMessageOnField(taskId, gText_ItemFinderNothing, sub_80FD5CC);
+}
+
+void sub_80FD504(u8 taskId)
+{
+ u8 playerDir;
+ u8 playerDirToItem;
+ u8 i;
+ s16* data = gTasks[taskId].data;
+ if (!data[3])
+ {
+ if (data[4] == 4)
+ {
+ playerDirToItem = sub_80FD9B0(data[0], data[1]);
+ if (playerDirToItem)
+ {
+ sub_80FDA24(gUnknown_085920E4[playerDirToItem - 1]);
+ gTasks[taskId].func = sub_80FDA94;
+ }
+ else
+ {
+ playerDir = player_get_direction_lower_nybble();
+ for (i = 0; i < 4; i++)
+ {
+ if (playerDir == gUnknown_085920E4[i])
+ data[5] = (i + 1) & 3;
+ }
+ gTasks[taskId].func = sub_80FDADC;
+ data[3] = 0;
+ data[2] = 0;
+ }
+ return;
+ }
+ PlaySE(SE_DAUGI);
+ data[4]++;
+ }
+ data[3] = (data[3] + 1) & 0x1F;
+}
+
+void sub_80FD5CC(u8 taskId)
+{
+ sub_8197434(0, 1);
+ sub_80984F4();
+ ScriptContext2_Disable();
+ DestroyTask(taskId);
+}
+
+bool8 ItemfinderCheckForHiddenItems(struct MapEvents *events, u8 taskId)
+{
+ int distanceX, distanceY;
+ s16 x, y, i, newDistanceX, newDistanceY;
+ PlayerGetDestCoords(&x, &y);
+ gTasks[taskId].data[2] = FALSE;
+ for (i = 0; i < events->bgEventCount; i++)
+ {
+ if (events->bgEvents[i].kind == 7 && !FlagGet(events->bgEvents[i].bgUnion.hiddenItem.hiddenItemId + 0x1F4))
+ {
+ distanceX = (u16)events->bgEvents[i].x + 7;
+ newDistanceX = distanceX - x;
+ distanceY = (u16)events->bgEvents[i].y + 7;
+ newDistanceY = distanceY - y;
+
+ if ((u16)(newDistanceX + 7) < 15 && (newDistanceY >= -5) && (newDistanceY < 6))
+ sub_80FD8E0(taskId, newDistanceX, newDistanceY);
+ }
+ }
+
+ sub_80FD7C8(taskId);
+ if (gTasks[taskId].data[2] == TRUE)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool8 sub_80FD6D4(struct MapEvents *events, s16 x, s16 y)
+{
+ u8 bgEventCount = events->bgEventCount;
+ struct BgEvent *bgEvent = events->bgEvents;
+ int i;
+
+ for (i = 0; i < bgEventCount; i++)
+ {
+ if (bgEvent[i].kind == 7 && x == (u16)bgEvent[i].x && y == (u16)bgEvent[i].y) // hidden item and coordinates matches x and y passed?
+ {
+ if (!FlagGet(bgEvent[i].bgUnion.hiddenItem.hiddenItemId + 0x1F4))
+ return TRUE;
+ else
+ return FALSE;
+ }
+ }
+ return FALSE;
+}
+
+bool8 sub_80FD730(struct MapConnection *connection, int x, int y)
+{
+ struct MapHeader *mapHeader;
+ u16 localX, localY;
+ u32 localOffset;
+ s32 localLength;
+
+ mapHeader = mapconnection_get_mapheader(connection);
+
+ switch (connection->direction)
+ {
+ // same weird temp variable behavior seen in sub_80FD6D4
+ case 2:
+ localOffset = connection->offset + 7;
+ localX = x - localOffset;
+ localLength = mapHeader->mapData->height - 7;
+ localY = localLength + y; // additions are reversed for some reason
+ break;
+ case 1:
+ localOffset = connection->offset + 7;
+ localX = x - localOffset;
+ localLength = gMapHeader.mapData->height + 7;
+ localY = y - localLength;
+ break;
+ case 3:
+ localLength = mapHeader->mapData->width - 7;
+ localX = localLength + x; // additions are reversed for some reason
+ localOffset = connection->offset + 7;
+ localY = y - localOffset;
+ break;
+ case 4:
+ localLength = gMapHeader.mapData->width + 7;
+ localX = x - localLength;
+ localOffset = connection->offset + 7;
+ localY = y - localOffset;
+ break;
+ default:
+ return FALSE;
+ }
+ return sub_80FD6D4(mapHeader->events, localX, localY);
+}
+
+// weird math
+#ifdef NONMATCHING
+void sub_80FD7C8(u8 taskId)
+{
+ s16 x, y;
+ s16 curX, curY;
+ s16 width = gMapHeader.mapData->width + 7;
+ s16 height = gMapHeader.mapData->height + 7;
+
+ PlayerGetDestCoords(&x, &y);
+
+ for (curX = x - 7; curX <= x + 7; curX++)
+ {
+ for (curY = y - 5; curY <= y + 5; curY++)
+ {
+ if (7 > curX
+ || curX >= width
+ || 7 > curY
+ || curY >= height)
+ {
+ struct MapConnection *conn = sub_8088A8C(curX, curY);
+ if (conn && sub_80FD730(conn, curX, curY) == TRUE)
+ sub_80FD8E0(taskId, curX - x, curY - y);
+ }
+ }
+ }
+}
+#else
+__attribute__((naked))
+void sub_80FD7C8(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, 0x14\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ str r0, [sp, 0x4]\n\
+ ldr r0, =gMapHeader\n\
+ ldr r1, [r0]\n\
+ ldr r0, [r1]\n\
+ adds r0, 0x7\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ str r0, [sp, 0x8]\n\
+ ldr r0, [r1, 0x4]\n\
+ adds r0, 0x7\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ str r0, [sp, 0xC]\n\
+ mov r4, sp\n\
+ adds r4, 0x2\n\
+ mov r0, sp\n\
+ adds r1, r4, 0\n\
+ bl PlayerGetDestCoords\n\
+ mov r0, sp\n\
+ ldrh r0, [r0]\n\
+ subs r0, 0x7\n\
+ lsls r0, 16\n\
+ lsrs r3, r0, 16\n\
+ asrs r0, 16\n\
+ mov r1, sp\n\
+ movs r2, 0\n\
+ ldrsh r1, [r1, r2]\n\
+ adds r1, 0x7\n\
+ cmp r0, r1\n\
+ bgt _080FD8CC\n\
+_080FD816:\n\
+ mov r5, sp\n\
+ ldrh r0, [r5, 0x2]\n\
+ subs r0, 0x5\n\
+ lsls r0, 16\n\
+ lsrs r4, r0, 16\n\
+ lsls r2, r4, 16\n\
+ asrs r1, r2, 16\n\
+ movs r6, 0x2\n\
+ ldrsh r0, [r5, r6]\n\
+ adds r0, 0x5\n\
+ lsls r3, 16\n\
+ mov r8, r3\n\
+ cmp r1, r0\n\
+ bgt _080FD8B6\n\
+ movs r0, 0x7\n\
+ str r0, [sp, 0x10]\n\
+ mov r1, r8\n\
+ asrs r1, 16\n\
+ mov r9, r1\n\
+ mov r10, r0\n\
+_080FD83E:\n\
+ ldr r3, [sp, 0x10]\n\
+ cmp r3, r9\n\
+ bgt _080FD860\n\
+ ldr r5, [sp, 0x8]\n\
+ lsls r0, r5, 16\n\
+ asrs r0, 16\n\
+ cmp r9, r0\n\
+ bge _080FD860\n\
+ asrs r1, r2, 16\n\
+ cmp r10, r1\n\
+ bgt _080FD860\n\
+ ldr r6, [sp, 0xC]\n\
+ lsls r0, r6, 16\n\
+ asrs r0, 16\n\
+ lsls r7, r4, 16\n\
+ cmp r1, r0\n\
+ blt _080FD89E\n\
+_080FD860:\n\
+ mov r0, r8\n\
+ asrs r5, r0, 16\n\
+ lsls r4, 16\n\
+ asrs r6, r4, 16\n\
+ adds r0, r5, 0\n\
+ adds r1, r6, 0\n\
+ bl sub_8088A8C\n\
+ adds r7, r4, 0\n\
+ cmp r0, 0\n\
+ beq _080FD89E\n\
+ adds r1, r5, 0\n\
+ adds r2, r6, 0\n\
+ bl sub_80FD730\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0x1\n\
+ bne _080FD89E\n\
+ mov r0, sp\n\
+ ldrh r1, [r0]\n\
+ subs r1, r5, r1\n\
+ lsls r1, 16\n\
+ asrs r1, 16\n\
+ ldrh r2, [r0, 0x2]\n\
+ subs r2, r6, r2\n\
+ lsls r2, 16\n\
+ asrs r2, 16\n\
+ ldr r0, [sp, 0x4]\n\
+ bl sub_80FD8E0\n\
+_080FD89E:\n\
+ movs r1, 0x80\n\
+ lsls r1, 9\n\
+ adds r0, r7, r1\n\
+ lsrs r4, r0, 16\n\
+ lsls r2, r4, 16\n\
+ asrs r1, r2, 16\n\
+ mov r3, sp\n\
+ movs r5, 0x2\n\
+ ldrsh r0, [r3, r5]\n\
+ adds r0, 0x5\n\
+ cmp r1, r0\n\
+ ble _080FD83E\n\
+_080FD8B6:\n\
+ movs r1, 0x80\n\
+ lsls r1, 9\n\
+ add r1, r8\n\
+ lsrs r3, r1, 16\n\
+ asrs r1, 16\n\
+ mov r0, sp\n\
+ movs r6, 0\n\
+ ldrsh r0, [r0, r6]\n\
+ adds r0, 0x7\n\
+ cmp r1, r0\n\
+ ble _080FD816\n\
+_080FD8CC:\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\
+ .pool\n\
+ .syntax divided\n");
+}
+#endif
+
+void sub_80FD8E0(u8 taskId, s16 x, s16 y)
+{
+ s16 *data = gTasks[taskId].data;
+ s16 var1, var2, var3, var4;
+
+ if (data[2] == FALSE)
+ {
+ data[0] = x;
+ data[1] = y;
+ data[2] = TRUE;
+ }
+ else
+ {
+ // data[0] and data[1] contain the player's coordinates.
+ // x and y contain the item's coordinates.
+ if (data[0] < 0)
+ var1 = data[0] * -1; // item is to the left
+ else
+ var1 = data[0]; // item is to the right
+
+ if (data[1] < 0)
+ var2 = data[1] * -1; // item is to the north
+ else
+ var2 = data[1]; // item is to the south
+
+ if (x < 0)
+ var3 = x * -1;
+ else
+ var3 = x;
+
+ if (y < 0)
+ var4 = y * -1;
+ else
+ var4 = y;
+
+ if (var1 + var2 > var3 + var4)
+ {
+ data[0] = x;
+ data[1] = y;
+ }
+ else
+ {
+ if (var1 + var2 == var3 + var4 && (var2 > var4 || (var2 == var4 && data[1] < y)))
+ {
+ data[0] = x;
+ data[1] = y;
+ }
+ }
+ }
+}
+
+u8 sub_80FD9B0(s16 itemX, s16 itemY)
+{
+ s16 abX, abY;
+
+ if (itemX == 0 && itemY == 0)
+ return DIR_NONE; // player is standing on the item.
+
+ // get absolute X distance.
+ if (itemX < 0)
+ abX = itemX * -1;
+ else
+ abX = itemX;
+
+ // get absolute Y distance.
+ if (itemY < 0)
+ abY = itemY * -1;
+ else
+ abY = itemY;
+
+ if (abX > abY)
+ {
+ if (itemX < 0)
+ return DIR_EAST;
+ else
+ return DIR_NORTH;
+ }
+ else
+ {
+ if (abX < abY)
+ {
+ if (itemY < 0)
+ return DIR_SOUTH;
+ else
+ return DIR_WEST;
+ }
+ if (abX == abY)
+ {
+ if (itemY < 0)
+ return DIR_SOUTH;
+ else
+ return DIR_WEST;
+ }
+ return DIR_NONE; // should never get here. return something so it doesnt crash.
+ }
+}
+
+void sub_80FDA24(u8 direction)
+{
+ FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]);
+ FieldObjectClearAnim(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]);
+ npc_sync_anim_pause_bits(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]);
+ PlayerTurnInPlace(direction);
+}
+
+void sub_80FDA94(u8 taskId)
+{
+ if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE)
+ DisplayItemMessageOnField(taskId, gText_ItemFinderNearby, sub_80FD5CC);
+}
+
+void sub_80FDADC(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE
+ || data[2] == FALSE)
+ {
+ sub_80FDA24(gUnknown_085920E4[data[5]]);
+ data[2] = 1;
+ data[5] = (data[5] + 1) & 3;
+ data[3]++;
+
+ if (data[3] == 4)
+ DisplayItemMessageOnField(taskId, gText_ItemFinderOnTop, sub_80FD5CC);
+ }
+}
+
+void ItemUseOutOfBattle_PokeblockCase(u8 taskId)
+{
+ if (sub_81221AC() == TRUE)
+ {
+ DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[3]);
+ }
+ else if (gTasks[taskId].data[3] != TRUE)
+ {
+ *gUnknown_0203CE54 = sub_80FDBEC;
+ unknown_ItemMenu_Confirm(taskId);
+ }
+ else
+ {
+ gFieldCallback = sub_80AF6D4;
+ FadeScreen(1, 0);
+ gTasks[taskId].func = sub_80FDC00;
+ }
+}
+
+void sub_80FDBEC(void)
+{
+ OpenPokeblockCase(0, bag_menu_mail_related);
+}
+
+void sub_80FDC00(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ overworld_free_bg_tilemaps();
+ OpenPokeblockCase(0, c2_exit_to_overworld_2_switch);
+ DestroyTask(taskId);
+ }
+}
+
+void ItemUseOutOfBattle_CoinCase(u8 taskId)
+{
+ ConvertIntToDecimalStringN(gStringVar1, GetCoins(), 0, 4);
+ StringExpandPlaceholders(gStringVar4, gText_CoinCase);
+
+ if (!gTasks[taskId].data[3])
+ {
+ DisplayItemMessage(taskId, 1, gStringVar4, bag_menu_inits_lists_menu);
+ }
+ else
+ {
+ DisplayItemMessageOnField(taskId, gStringVar4, CleanUpAfterFailingToUseRegisteredKeyItemOnField);
+ }
+}
+
+void ItemUseOutOfBattle_PowderJar(u8 taskId)
+{
+ ConvertIntToDecimalStringN(gStringVar1, sub_80247BC(), 0, 5);
+ StringExpandPlaceholders(gStringVar4, gText_PowderQty);
+
+ if (!gTasks[taskId].data[3])
+ {
+ DisplayItemMessage(taskId, 1, gStringVar4, bag_menu_inits_lists_menu);
+ }
+ else
+ {
+ DisplayItemMessageOnField(taskId, gStringVar4, CleanUpAfterFailingToUseRegisteredKeyItemOnField);
+ }
+}
+
+void sub_80FDD10(u8 taskId)
+{
+ if (IsPlayerFacingPlantedBerryTree() == TRUE)
+ {
+ gUnknown_0203A0F4 = sub_80FDD74;
+ gFieldCallback = MapPostLoadHook_UseItem;
+ *gUnknown_0203CE54 = c2_exit_to_overworld_2_switch;
+ unknown_ItemMenu_Confirm(taskId);
+ }
+ else
+ {
+ ItemId_GetFieldFunc(gSpecialVar_ItemId)(taskId);
+ }
+}
+
+void sub_80FDD74(u8 taskId)
+{
+ RemoveBagItem(gSpecialVar_ItemId, 1);
+ ScriptContext2_Enable();
+ ScriptContext1_SetupScript(Route102_EventScript_274482);
+ DestroyTask(taskId);
+}
+
+void ItemUseOutOfBattle_WailmerPail(u8 taskId)
+{
+ if (sub_80FDE2C() == TRUE)
+ {
+ gUnknown_0203A0F4 = sub_80FDE7C;
+ SetUpItemUseOnFieldCallback(taskId);
+ }
+ else if (TryToWaterBerryTree() == TRUE)
+ {
+ gUnknown_0203A0F4 = sub_80FDE08;
+ SetUpItemUseOnFieldCallback(taskId);
+ }
+ else
+ {
+ DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[3]);
+ }
+}
+
+void sub_80FDE08(u8 taskId)
+{
+ ScriptContext2_Enable();
+ ScriptContext1_SetupScript(Route102_EventScript_2744C0);
+ DestroyTask(taskId);
+}
+
+bool8 sub_80FDE2C(void)
+{
+ u16 x, y;
+ u8 z;
+ u8 objId;
+ GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
+ z = PlayerGetZCoord();
+ objId = GetFieldObjectIdByXYZ(x, y, z);
+ if (objId == 16 || gMapObjects[objId].graphicsId != 0xE4)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+void sub_80FDE7C(u8 taskId)
+{
+ ScriptContext2_Enable();
+ ScriptContext1_SetupScript(BattleFrontier_OutsideEast_EventScript_242CFC);
+ DestroyTask(taskId);
+}
+
+void ItemUseOutOfBattle_Medicine(u8 taskId)
+{
+ gUnknown_03006328 = ItemUseCB_Medicine;
+ SetUpItemUseCallback(taskId);
+}
+
+void ItemUseOutOfBattle_ReduceEV(u8 taskId)
+{
+ gUnknown_03006328 = sub_81B67C8;
+ SetUpItemUseCallback(taskId);
+}
+
+void ItemUseOutOfBattle_SacredAsh(u8 taskId)
+{
+ gUnknown_03006328 = sub_81B79E8;
+ SetUpItemUseCallback(taskId);
+}
+
+void ItemUseOutOfBattle_PPRecovery(u8 taskId)
+{
+ gUnknown_03006328 = dp05_ether;
+ SetUpItemUseCallback(taskId);
+}
+
+void ItemUseOutOfBattle_PPUp(u8 taskId)
+{
+ gUnknown_03006328 = dp05_pp_up;
+ SetUpItemUseCallback(taskId);
+}
+
+void ItemUseOutOfBattle_RareCandy(u8 taskId)
+{
+ gUnknown_03006328 = dp05_rare_candy;
+ SetUpItemUseCallback(taskId);
+}
+
+void ItemUseOutOfBattle_TMHM(u8 taskId)
+{
+ if (gSpecialVar_ItemId >= ITEM_HM01)
+ DisplayItemMessage(taskId, 1, gText_BootedUpHM, sub_80FDF90); // HM
+ else
+ DisplayItemMessage(taskId, 1, gText_BootedUpTM, sub_80FDF90); // TM
+}
+
+void sub_80FDF90(u8 taskId)
+{
+ PlaySE(SE_PC_LOGIN);
+ gTasks[taskId].func = task08_0809AD8C;
+}
+
+void task08_0809AD8C(u8 taskId)
+{
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ StringCopy(gStringVar1, gMoveNames[ItemIdToBattleMoveId(gSpecialVar_ItemId)]);
+ StringExpandPlaceholders(gStringVar4, gText_TMHMContainedVar1);
+ DisplayItemMessage(taskId, 1, gStringVar4, sub_80FE024);
+ }
+}
+
+void sub_80FE024(u8 taskId)
+{
+ bag_menu_yes_no(taskId, 6, gUnknown_085920E8);
+}
+
+void sub_80FE03C(u8 taskId)
+{
+ gUnknown_03006328 = sub_81B6DC4;
+ SetUpItemUseCallback(taskId);
+}
+
+void sub_80FE058(void)
+{
+ RemoveBagItem(gSpecialVar_ItemId, 1);
+ CopyItemName(gSpecialVar_ItemId, gStringVar2);
+ StringExpandPlaceholders(gStringVar4, gText_PlayerUsedVar2);
+ if (!InBattlePyramid())
+ {
+ sub_81AB9A8(ItemId_GetPocket(gSpecialVar_ItemId));
+ sub_81ABA88(ItemId_GetPocket(gSpecialVar_ItemId));
+ }
+ else
+ {
+ sub_81C5924();
+ sub_81C59BC();
+ }
+}
+
+void ItemUseOutOfBattle_Repel(u8 taskId)
+{
+ if (VarGet(VAR_REPEL_STEP_COUNT) == 0)
+ gTasks[taskId].func = sub_80FE124;
+ else if (!InBattlePyramid())
+ DisplayItemMessage(taskId, 1, gText_RepelEffectsLingered, bag_menu_inits_lists_menu);
+ else
+ DisplayItemMessageInBattlePyramid(taskId, gText_RepelEffectsLingered, sub_81C6714);
+}
+
+void sub_80FE124(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+
+ if (++data[8] > 7)
+ {
+ data[8] = 0;
+ PlaySE(SE_TU_SAA);
+ gTasks[taskId].func = sub_80FE164;
+ }
+}
+
+void sub_80FE164(u8 taskId)
+{
+ if (!IsSEPlaying())
+ {
+ VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(gSpecialVar_ItemId));
+ sub_80FE058();
+ if (!InBattlePyramid())
+ DisplayItemMessage(taskId, 1, gStringVar4, bag_menu_inits_lists_menu);
+ else
+ DisplayItemMessageInBattlePyramid(taskId, gStringVar4, sub_81C6714);
+ }
+}
+
+void sub_80FE1D0(u8 taskId)
+{
+ if(++gTasks[taskId].data[8] > 7)
+ {
+ PlaySE(SE_BIDORO);
+ if (!InBattlePyramid())
+ DisplayItemMessage(taskId, 1, gStringVar4, bag_menu_inits_lists_menu);
+ else
+ DisplayItemMessageInBattlePyramid(taskId, gStringVar4, sub_81C6714);
+ }
+}
+
+void ItemUseOutOfBattle_BlackWhiteFlute(u8 taskId)
+{
+ CopyItemName(gSpecialVar_ItemId, gStringVar2);
+ if (gSpecialVar_ItemId == ITEM_WHITE_FLUTE)
+ {
+ FlagSet(FLAG_SYS_ENC_UP_ITEM);
+ FlagClear(FLAG_SYS_ENC_DOWN_ITEM);
+ StringExpandPlaceholders(gStringVar4, gText_UsedVar2WildLured);
+ }
+ else
+ {
+ FlagSet(FLAG_SYS_ENC_DOWN_ITEM);
+ FlagClear(FLAG_SYS_ENC_UP_ITEM);
+ StringExpandPlaceholders(gStringVar4, gText_UsedVar2WildRepelled);
+ }
+ gTasks[taskId].data[8] = 0;
+ gTasks[taskId].func = sub_80FE1D0;
+}
+
+void task08_080A1C44(u8 taskId)
+{
+ player_avatar_init_params_reset();
+ sub_80B7CC8();
+ DestroyTask(taskId);
+}
+
+void re_escape_rope(u8 taskId)
+{
+ flagmods_08054D70();
+ sub_80FE058();
+ gTasks[taskId].data[0] = 0;
+ DisplayItemMessageOnField(taskId, gStringVar4, task08_080A1C44);
+}
+
+bool8 sub_80FE314(void)
+{
+ if (gMapHeader.flags & 2)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void ItemUseOutOfBattle_EscapeRope(u8 taskId)
+{
+ if (sub_80FE314() == TRUE)
+ {
+ gUnknown_0203A0F4 = re_escape_rope;
+ SetUpItemUseOnFieldCallback(taskId);
+ }
+ else
+ {
+ DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[3]);
+ }
+}
+
+void ItemUseOutOfBattle_EvolutionStone(u8 taskId)
+{
+ gUnknown_03006328 = sub_81B7C74;
+ SetUpItemUseCallback(taskId);
+}
+
+void ItemUseInBattle_PokeBall(u8 taskId)
+{
+ if (IsPlayerPartyAndPokemonStorageFull() == FALSE) // have room for mon?
+ {
+ RemoveBagItem(gSpecialVar_ItemId, 1);
+ if (!InBattlePyramid())
+ unknown_ItemMenu_Confirm(taskId);
+ else
+ sub_81C5B14(taskId);
+ }
+ else if (!InBattlePyramid())
+ {
+ DisplayItemMessage(taskId, 1, gText_BoxFull, bag_menu_inits_lists_menu);
+ }
+ else
+ DisplayItemMessageInBattlePyramid(taskId, gText_BoxFull, sub_81C6714);
+}
+
+void sub_80FE408(u8 taskId)
+{
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ if (!InBattlePyramid())
+ unknown_ItemMenu_Confirm(taskId);
+ else
+ sub_81C5B14(taskId);
+ }
+}
+
+void sub_80FE440(u8 taskId)
+{
+ if(++gTasks[taskId].data[8] > 7)
+ {
+ PlaySE(SE_KAIFUKU);
+ RemoveBagItem(gSpecialVar_ItemId, 1);
+ if (!InBattlePyramid())
+ DisplayItemMessage(taskId, 1, sub_806CF78(gSpecialVar_ItemId), sub_80FE408);
+ else
+ DisplayItemMessageInBattlePyramid(taskId, sub_806CF78(gSpecialVar_ItemId), sub_80FE408);
+ }
+}
+
+void ItemUseInBattle_StatIncrease(u8 taskId)
+{
+ u16 partyId = gBattlePartyID[gBankInMenu];
+
+ if (ExecuteTableBasedItemEffect_(&gPlayerParty[partyId], gSpecialVar_ItemId, partyId, 0) != FALSE)
+ {
+ if (!InBattlePyramid())
+ DisplayItemMessage(taskId, 1, gText_WontHaveEffect, bag_menu_inits_lists_menu);
+ else
+ DisplayItemMessageInBattlePyramid(taskId, gText_WontHaveEffect, sub_81C6714);
+ }
+ else
+ {
+ gTasks[taskId].func = sub_80FE440;
+ gTasks[taskId].data[8] = 0;
+ }
+}
+
+void sub_80FE54C(u8 taskId)
+{
+ if (!InBattlePyramid())
+ {
+ *gUnknown_0203CE54 = sub_81B89F0;
+ unknown_ItemMenu_Confirm(taskId);
+ }
+ else
+ {
+ *gUnknown_0203CF2C = sub_81B89F0;
+ sub_81C5B14(taskId);
+ }
+}
+
+void ItemUseInBattle_Medicine(u8 taskId)
+{
+ gUnknown_03006328 = ItemUseCB_Medicine;
+ sub_80FE54C(taskId);
+}
+
+void sub_80FE5AC(u8 taskId)
+{
+ gUnknown_03006328 = sub_81B79E8;
+ sub_80FE54C(taskId);
+}
+
+void ItemUseInBattle_PPRecovery(u8 taskId)
+{
+ gUnknown_03006328 = dp05_ether;
+ sub_80FE54C(taskId);
+}
+
+void ItemUseInBattle_Escape(u8 taskId)
+{
+
+ if((gBattleTypeFlags & BATTLE_TYPE_TRAINER) == FALSE)
+ {
+ sub_80FE058();
+ if (!InBattlePyramid())
+ DisplayItemMessage(taskId, 1, gStringVar4, unknown_ItemMenu_Confirm);
+ else
+ DisplayItemMessageInBattlePyramid(taskId, gStringVar4, sub_81C5B14);
+ }
+ else
+ {
+ DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[3]);
+ }
+}
+
+void ItemUseOutOfBattle_EnigmaBerry(u8 taskId)
+{
+ switch (GetItemEffectType(gSpecialVar_ItemId) - 1)
+ {
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ case 15:
+ case 16:
+ gTasks[taskId].data[4] = 1;
+ ItemUseOutOfBattle_Medicine(taskId);
+ break;
+ case 9:
+ gTasks[taskId].data[4] = 1;
+ ItemUseOutOfBattle_SacredAsh(taskId);
+ break;
+ case 0:
+ gTasks[taskId].data[4] = 1;
+ ItemUseOutOfBattle_RareCandy(taskId);
+ break;
+ case 18:
+ case 19:
+ gTasks[taskId].data[4] = 1;
+ ItemUseOutOfBattle_PPUp(taskId);
+ break;
+ case 20:
+ gTasks[taskId].data[4] = 1;
+ ItemUseOutOfBattle_PPRecovery(taskId);
+ break;
+ default:
+ gTasks[taskId].data[4] = 4;
+ ItemUseOutOfBattle_CannotUse(taskId);
+ }
+}
+
+void ItemUseInBattle_EnigmaBerry(u8 taskId)
+{
+ switch (GetItemEffectType(gSpecialVar_ItemId))
+ {
+ case 0:
+ ItemUseInBattle_StatIncrease(taskId);
+ break;
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ case 11:
+ ItemUseInBattle_Medicine(taskId);
+ break;
+ case 21:
+ ItemUseInBattle_PPRecovery(taskId);
+ break;
+ default:
+ ItemUseOutOfBattle_CannotUse(taskId);
+ }
+}
+
+void ItemUseOutOfBattle_CannotUse(u8 taskId)
+{
+ DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[3]);
+}
diff --git a/src/link.c b/src/link.c
index 5a47e2fac..acf2fbe6b 100644
--- a/src/link.c
+++ b/src/link.c
@@ -17,7 +17,7 @@
#include "gpu_regs.h"
#include "palette.h"
#include "task.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "menu.h"
#include "new_menu_helpers.h"
#include "text.h"
diff --git a/src/mail.c b/src/mail.c
index c3cbe4a3c..ac263ac67 100644
--- a/src/mail.c
+++ b/src/mail.c
@@ -4,7 +4,7 @@
#include "main.h"
#include "overworld.h"
#include "task.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "palette.h"
#include "text.h"
#include "menu.h"
diff --git a/src/main.c b/src/main.c
index 9f3a815b0..3be6b91c7 100644
--- a/src/main.c
+++ b/src/main.c
@@ -7,7 +7,7 @@
#include "m4a.h"
#include "bg.h"
#include "rtc.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "overworld.h"
#include "play_time.h"
#include "random.h"
diff --git a/src/mystery_event_menu.c b/src/mystery_event_menu.c
new file mode 100644
index 000000000..444650be1
--- /dev/null
+++ b/src/mystery_event_menu.c
@@ -0,0 +1,303 @@
+#include "global.h"
+#include "mystery_event_menu.h"
+#include "link.h"
+#include "main.h"
+#include "menu.h"
+#include "mystery_event_script.h"
+#include "palette.h"
+#include "save.h"
+#include "constants/songs.h"
+#include "sound.h"
+#include "sprite.h"
+#include "string_util.h"
+#include "strings.h"
+#include "task.h"
+#include "text.h"
+#include "bg.h"
+#include "window.h"
+#include "gpu_regs.h"
+#include "text_window.h"
+#include "new_menu_helpers.h"
+#include "decompress.h"
+
+// this file's functions
+static void CB2_MysteryEventMenu(void);
+static void PrintMysteryMenuText(u8 windowId, const u8 *text, u8 x, u8 y, s32 speed);
+
+// EWRAM vars
+static EWRAM_DATA u8 sUnknown_0203BCF8 = 0; // set but unused
+
+// const rom data
+static const struct BgTemplate sBgTemplates[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0
+ }
+};
+
+static const struct WindowTemplate sWindowTemplates[] =
+{
+ {0, 4, 15, 22, 4, 14, 20},
+ {0, 7, 6, 16, 4, 14, 0x6C},
+ DUMMY_WIN_TEMPLATE
+};
+
+// code
+static void VBlankCB(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+static bool8 CheckLanguageMatch(void)
+{
+ return (gLinkPlayers[0].language == gLinkPlayers[1].language);
+}
+
+void CB2_InitMysteryEventMenu(void)
+{
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ ResetTasks();
+ SetVBlankCallback(VBlankCB);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates));
+ if (InitWindows(sWindowTemplates))
+ {
+ s32 i;
+
+ DeactivateAllTextPrinters();
+ for (i = 0; i < 2; i++)
+ FillWindowPixelBuffer(i, 0);
+
+ FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x1E, 0x14);
+ sub_809882C(0, 1u, 0xD0u);
+ sub_81978B0(0xE0);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ CreateTask(Task_DestroySelf, 0);
+ StopMapMusic();
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ RunTextPrinters();
+ UpdatePaletteFade();
+ FillPalette(0, 0, 2);
+ SetMainCallback2(CB2_MysteryEventMenu);
+ }
+}
+
+static bool8 GetEventLoadMessage(u8 *dest, u32 status)
+{
+ bool8 retVal = TRUE;
+
+ if (status == 0)
+ {
+ StringCopy(dest, gText_EventSafelyLoaded);
+ retVal = FALSE;
+ }
+
+ if (status == 2)
+ retVal = FALSE;
+
+ if (status == 1)
+ StringCopy(dest, gText_LoadErrorEndingSession);
+
+ return retVal;
+}
+
+static void CB2_MysteryEventMenu(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ SetWindowBorderStyle(0, 1, 1, 0xD);
+ PutWindowTilemap(0);
+ CopyWindowToVram(0, 3);
+ ShowBg(0);
+ BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
+ gMain.state++;
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ {
+ PrintMysteryMenuText(0, gText_LinkStandby2, 1, 2, 1);
+ gMain.state++;
+ }
+ break;
+ case 2:
+ if (!IsTextPrinterActive(0))
+ {
+ gMain.state++;
+ gLinkType = 21761;
+ OpenLink();
+ }
+ break;
+ case 3:
+ if ((gLinkStatus & 0x20) && (gLinkStatus & 0x1C) > 4)
+ {
+ PlaySE(SE_PIN);
+ PrintMysteryMenuText(0, gText_PressAToLoadEvent, 1, 2, 1);
+ gMain.state++;
+ }
+ if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ CloseLink();
+ gMain.state = 15;
+ }
+ break;
+ case 4:
+ if (!IsTextPrinterActive(0))
+ gMain.state++;
+ break;
+ case 5:
+ if (GetLinkPlayerCount_2() == 2)
+ {
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_800A620();
+ SetWindowBorderStyle(1, 1, 1, 0xD);
+ PrintMysteryMenuText(1, gText_LoadingEvent, 1, 2, 0);
+ PutWindowTilemap(1);
+ CopyWindowToVram(1, 3);
+ gMain.state++;
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ CloseLink();
+ gMain.state = 15;
+ }
+ }
+ else
+ {
+ GetEventLoadMessage(gStringVar4, 1);
+ PrintMysteryMenuText(0, gStringVar4, 1, 2, 1);
+ gMain.state = 13;
+ }
+ break;
+ case 6:
+ if (IsLinkConnectionEstablished())
+ {
+ if (gReceivedRemoteLinkPlayers != 0)
+ {
+ if (GetLinkPlayerDataExchangeStatusTimed(2, 2) == 3)
+ {
+ sub_800AC34();
+ GetEventLoadMessage(gStringVar4, 1);
+ PrintMysteryMenuText(0, gStringVar4, 1, 2, 1);
+ gMain.state = 13;
+ }
+ else if (CheckLanguageMatch())
+ {
+ PrintMysteryMenuText(0, gText_DontRemoveCableTurnOff, 1, 2, 1);
+ gMain.state++;
+ }
+ else
+ {
+ CloseLink();
+ GetEventLoadMessage(gStringVar4, 1);
+ PrintMysteryMenuText(0, gStringVar4, 1, 2, 1);
+ gMain.state = 13;
+ }
+ }
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ CloseLink();
+ gMain.state = 15;
+ }
+ break;
+ case 7:
+ if (!IsTextPrinterActive(0))
+ gMain.state++;
+ break;
+ case 8:
+ if (GetBlockReceivedStatus())
+ {
+ ResetBlockReceivedFlags();
+ gMain.state++;
+ }
+ break;
+ case 9:
+ gMain.state++;
+ break;
+ case 10:
+ sub_800AC34();
+ gMain.state++;
+ break;
+ case 11:
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ u16 unkVal = RunMysteryEventScript(gDecompressionBuffer);
+ CpuFill32(0, gDecompressionBuffer, 0x7D4);
+ if (!GetEventLoadMessage(gStringVar4, unkVal))
+ TrySavingData(NORMAL_SAVE);
+ gMain.state++;
+ }
+ break;
+ case 12:
+ PrintMysteryMenuText(0, gStringVar4, 1, 2, 1);
+ gMain.state++;
+ break;
+ case 13:
+ if (!IsTextPrinterActive(0))
+ {
+ gMain.state++;
+ sUnknown_0203BCF8 = 0;
+ }
+ break;
+ case 14:
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ gMain.state++;
+ }
+ break;
+ case 15:
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ gMain.state++;
+ break;
+ case 16:
+ if (!gPaletteFade.active)
+ DoSoftReset();
+ break;
+ }
+
+ if (gLinkStatus & 0x40 && !IsLinkMaster())
+ {
+ CloseLink();
+ GetEventLoadMessage(gStringVar4, 1);
+ PrintMysteryMenuText(0, gStringVar4, 1, 2, 1);
+ gMain.state = 13;
+ }
+
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ RunTextPrinters();
+ UpdatePaletteFade();
+}
+
+static void PrintMysteryMenuText(u8 windowId, const u8 *text, u8 x, u8 y, s32 speed)
+{
+ struct TextColor textColor;
+ u8 letterSpacing = 0;
+ u8 lineSpacing = 1;
+ textColor.fgColor = 1;
+ textColor.bgColor = 2;
+ textColor.shadowColor = 3;
+
+ FillWindowPixelBuffer(windowId, (textColor.fgColor) | (textColor.fgColor << 4));
+ AddTextPrinterParameterized2(windowId, 1, x, y, letterSpacing, lineSpacing, &textColor, speed, text);
+}
diff --git a/src/naming_screen.c b/src/naming_screen.c
new file mode 100644
index 000000000..7139b5c90
--- /dev/null
+++ b/src/naming_screen.c
@@ -0,0 +1,2177 @@
+#include "global.h"
+#include "naming_screen.h"
+#include "malloc.h"
+#include "palette.h"
+#include "task.h"
+#include "sprite.h"
+#include "string_util.h"
+#include "new_menu_helpers.h"
+#include "window.h"
+#include "bg.h"
+#include "gpu_regs.h"
+#include "pokemon.h"
+#include "field_specials.h"
+#include "field_player_avatar.h"
+#include "field_map_obj.h"
+#include "event_data.h"
+#include "constants/vars.h"
+#include "constants/songs.h"
+#include "pokemon_storage_system.h"
+#include "sound.h"
+#include "trig.h"
+#include "field_effect.h"
+#include "pokemon_icon.h"
+#include "data2.h"
+#include "strings.h"
+#include "menu.h"
+#include "text_window.h"
+#include "overworld.h"
+#include "constants/map_objects.h"
+
+EWRAM_DATA static struct NamingScreenData *gNamingScreenData = NULL;
+extern u16 gKeyRepeatStartDelay;
+
+// extern graphics
+extern const u16 gNamingScreenMenu_Pal[];
+extern const u8 gNamingScreenMenu_Gfx[];
+extern const u8 gUnknown_08DD4544[];
+extern const u8 gUnknown_08DD4620[];
+extern const u8 gUnknown_08DD46E0[];
+extern const u8 gUnknown_08DD47A0[];
+extern const u8 gNamingScreenRWindow_Gfx[];
+extern const u8 gNamingScreenKeyboardButton_Gfx[];
+extern const u8 gNamingScreenROptions_Gfx[];
+extern const u8 gNamingScreenCursor_Gfx[];
+extern const u8 gNamingScreenRightPointingTriangleTiles[];
+extern const u8 gNamingScreenUnderscoreTiles[];
+
+// extern text
+extern const u8 gExpandedPlaceholder_Empty[];
+extern const u8 gText_PkmnTransferredSomeonesPC[];
+extern const u8 gText_PkmnTransferredLanettesPC[];
+extern const u8 gText_PkmnBoxSomeonesPCFull[];
+extern const u8 gText_PkmnBoxLanettesPCFull[];
+extern const u8 gText_MoveOkBack[];
+extern const u8 gText_YourName[];
+extern const u8 gText_BoxName[];
+extern const u8 gText_PkmnsNickname[];
+extern const u8 gText_TellHimTheWords[];
+extern const u8 gUnknown_0862B88D[];
+extern const u8 gUnknown_0862B8AE[];
+extern const u8 gUnknown_0862B8CF[];
+extern const u8 gUnknown_0862B8F0[];
+extern const u8 gUnknown_0862B911[];
+extern const u8 gUnknown_0862B932[];
+extern const u8 gUnknown_0862B953[];
+extern const u8 gUnknown_0862B974[];
+extern const u8 gUnknown_0862B995[];
+extern const u8 gUnknown_0862B9AE[];
+extern const u8 gUnknown_0862B9C7[];
+extern const u8 gUnknown_0862B9E0[];
+
+
+// start of .rodata
+static const u8 gSpriteImage_858BBF8[] = INCBIN_U8("graphics/naming_screen/pc_icon/0.4bpp");
+static const u8 gSpriteImage_858BCB8[] = INCBIN_U8("graphics/naming_screen/pc_icon/1.4bpp");
+static const u16 gUnknown_0858BD78[] = INCBIN_U16("graphics/naming_screen/0.gbapal");
+static const u16 gUnknown_0858BD98[] = INCBIN_U16("graphics/naming_screen/1.gbapal");
+
+static const u8 *const gUnknown_0858BDB8[] =
+{
+ gText_PkmnTransferredSomeonesPC,
+ gText_PkmnTransferredLanettesPC,
+ gText_PkmnBoxSomeonesPCFull,
+ gText_PkmnBoxLanettesPCFull
+};
+
+static const u8 gUnknown_0858BDC8[] = _("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!");
+
+static const struct BgTemplate gUnknown_0858BE00[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 30,
+ .priority = 0
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 29,
+ .priority = 1
+ },
+ {
+ .bg = 2,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 28,
+ .priority = 2
+ },
+ {
+ .bg = 3,
+ .charBaseIndex = 3,
+ .mapBaseIndex = 31,
+ .priority = 3
+ }
+};
+
+static const struct WindowTemplate gUnknown_0858BE10[] = {
+ { 0x01, 0x03, 0x0A, 0x13, 0x08, 0x0A, 0x030 },
+ { 0x02, 0x03, 0x0A, 0x13, 0x08, 0x0A, 0x0C8 },
+ { 0x03, 0x08, 0x06, 0x11, 0x02, 0x0A, 0x030 },
+ { 0x03, 0x08, 0x04, 0x11, 0x02, 0x0A, 0x052 },
+ { 0x00, 0x00, 0x00, 0x1E, 0x02, 0x0B, 0x074 },
+ DUMMY_WIN_TEMPLATE
+};
+
+static const u8 gUnknown_0858BE40[] = __("abcdef .ghijkl ,mnopqrs tuvwxyz ABCDEF .GHIJKL ,MNOPQRS TUVWXYZ 01234 56789 !?♂♀/- …“”‘’ ");
+
+static const u8 gUnknown_0858BEA0[] = { 8, 8, 6 };
+static const u8 gUnknown_0858BEA3[] = { 0, 12, 24, 56, 68, 80, 92, 123, 0, 12, 24, 56, 68, 80, 92, 123, 0, 22, 44, 66, 88, 110, 0, 0 };
+
+// forward declarations
+static const struct NamingScreenTemplate *const sNamingScreenTemplates[];
+static const struct SubspriteTable gUnknown_0858C050[];
+static const struct SubspriteTable gUnknown_0858C058[];
+static const struct SubspriteTable gUnknown_0858C070[];
+static const struct SubspriteTable gUnknown_0858C078[];
+static const struct SpriteTemplate gUnknown_0858C0C0;
+static const struct SpriteTemplate gUnknown_0858C0D8;
+static const struct SpriteTemplate gUnknown_0858C0F0;
+static const struct SpriteTemplate gUnknown_0858C108;
+static const struct SpriteTemplate gUnknown_0858C120;
+static const struct SpriteTemplate gUnknown_0858C138;
+static const struct SpriteTemplate sSpriteTemplate_InputArrow;
+static const struct SpriteTemplate sSpriteTemplate_Underscore;
+static const struct SpriteTemplate gUnknown_0858C180;
+static const u8* const gUnknown_0858C198[][4];
+static const struct SpriteSheet gUnknown_0858C1C8[];
+static const struct SpritePalette gUnknown_0858C230[];
+
+static void C2_NamingScreen(void);
+static void NamingScreen_Init(void);
+static void NamingScreen_InitBGs(void);
+static void sub_80E3194(void);
+static void sub_80E31B0(u8 taskId);
+static bool8 MainState_BeginFadeIn(void);
+static bool8 MainState_WaitFadeIn(void);
+static bool8 MainState_HandleInput(void);
+static bool8 MainState_MoveToOKButton(void);
+static bool8 MainState_6(void);
+static bool8 MainState_BeginFadeInOut(void);
+static bool8 MainState_WaitFadeOutAndExit(void);
+static void DisplaySentToPCMessage(void);
+static bool8 sub_80E3604(void);
+static bool8 MainState_StartPageSwap(void);
+static bool8 MainState_WaitPageSwap(void);
+static void StartPageSwapAnim(void);
+static void Task_HandlePageSwapAnim(u8);
+static bool8 IsPageSwapAnimNotInProgress(void);
+static void sub_80E3948(u8, u8, u8);
+static void Task_80E39BC(u8);
+static u16 sub_80E3A74(u8);
+static void sub_80E3AE8(u8);
+static void sub_80E3B10(struct Task *, u8, u8);
+static void sub_80E3CC8(void);
+static void CursorInit(void);
+static void SetCursorPos(s16, s16);
+static void GetCursorPos(s16 *x, s16 *y);
+static void MoveCursorToOKButton(void);
+static void sub_80E3E3C(u8);
+static void sub_80E3E94(u8);
+static u8 IsCursorAnimFinished(void);
+static u8 GetCurrentPageColumnCount(void);
+static void CreatePageSwitcherSprites(void);
+static void sub_80E4050(void);
+static void sub_80E41B8(u8, struct Sprite *, struct Sprite *);
+static void CreateBackOkSprites(void);
+static void CreateUnderscoreSprites(void);
+static void CreateInputTargetIcon(void);
+static u8 HandleKeyboardEvent(void);
+static u8 sub_80E45E0(void);
+static u8 GetInputEvent(void);
+static void SetInputState(u8);
+static void sub_80E4964(void);
+static u8 GetTextCaretPosition(void);
+static void DeleteTextCharacter(void);
+static bool8 sub_80E4B54(void);
+static void AddTextCharacter(u8);
+static void sub_80E4BE4(void);
+static void choose_name_or_words_screen_load_bg_tile_patterns(void);
+static void sub_80E4CB8(void);
+static void choose_name_or_words_screen_apply_bg_pals(void);
+static void sub_80E4CF8(u8, const void *);
+static void nullsub_10(u8, u8);
+static void sub_80E4D10(void);
+static void sub_80E4DE4(u8, u8);
+static void sub_80E4E5C(void);
+static void sub_80E4EF0(void);
+static void sub_80E4F58(void);
+static void NamingScreen_TurnOffScreen(void);
+static void NamingScreen_InitDisplayMode(void);
+static void VBlankCB_NamingScreen(void);
+static void sub_80E501C(void);
+static bool8 sub_80E503C(u8);
+
+void DoNamingScreen(u8 templateNum, u8 *destBuffer, u16 monSpecies, u16 monGender, u32 monPersonality, MainCallback returnCallback)
+{
+ gNamingScreenData = Alloc(sizeof(struct NamingScreenData));
+ if (!gNamingScreenData)
+ {
+ SetMainCallback2(returnCallback);
+ }
+ else
+ {
+ gNamingScreenData->templateNum = templateNum;
+ gNamingScreenData->monSpecies = monSpecies;
+ gNamingScreenData->monGender = monGender;
+ gNamingScreenData->monPersonality = monPersonality;
+ gNamingScreenData->destBuffer = destBuffer;
+ gNamingScreenData->returnCallback = returnCallback;
+
+ if (templateNum == 0)
+ StartTimer1();
+
+ SetMainCallback2(C2_NamingScreen);
+ }
+}
+
+static void C2_NamingScreen(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ NamingScreen_TurnOffScreen();
+ NamingScreen_Init();
+ gMain.state++;
+ break;
+ case 1:
+ NamingScreen_InitBGs();
+ gMain.state++;
+ break;
+ case 2:
+ ResetPaletteFade();
+ gMain.state++;
+ break;
+ case 3:
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ gMain.state++;
+ break;
+ case 4:
+ ResetTasks();
+ gMain.state++;
+ break;
+ case 5:
+ choose_name_or_words_screen_apply_bg_pals();
+ gMain.state++;
+ break;
+ case 6:
+ choose_name_or_words_screen_load_bg_tile_patterns();
+ gMain.state++;
+ break;
+ case 7:
+ sub_80E3CC8();
+ UpdatePaletteFade();
+ sub_80E501C();
+ gMain.state++;
+ break;
+ default:
+ sub_80E4CB8();
+ sub_80E3194();
+ break;
+ }
+}
+
+static void NamingScreen_Init(void)
+{
+ gNamingScreenData->state = 0;
+ gNamingScreenData->bg1vOffset = 0;
+ gNamingScreenData->bg2vOffset = 0;
+ gNamingScreenData->bg1Priority = BGCNT_PRIORITY(1);
+ gNamingScreenData->bg2Priority = BGCNT_PRIORITY(2);
+ gNamingScreenData->bgToReveal = 0;
+ gNamingScreenData->bgToHide = 1;
+ gNamingScreenData->template = sNamingScreenTemplates[gNamingScreenData->templateNum];
+ gNamingScreenData->currentPage = gNamingScreenData->template->initialPage;
+ gNamingScreenData->inputCharBaseXPos = (240 - gNamingScreenData->template->maxChars * 8) / 2 + 6;
+ if (gNamingScreenData->templateNum == 4)
+ gNamingScreenData->inputCharBaseXPos += 11;
+ gNamingScreenData->keyRepeatStartDelayCopy = gKeyRepeatStartDelay;
+ memset(gNamingScreenData->textBuffer, 0xFF, sizeof(gNamingScreenData->textBuffer));
+ if (gNamingScreenData->template->copyExistingString != 0)
+ StringCopy(gNamingScreenData->textBuffer, gNamingScreenData->destBuffer);
+ gKeyRepeatStartDelay = 16;
+}
+
+static void sub_80E2FA4(void)
+{
+ u8 i;
+ for (i = 0; i < MAX_SPRITES; i++)
+ {
+ if (gSprites[i].inUse)
+ gSprites[i].invisible = FALSE;
+ }
+ sub_80E3E3C(0);
+}
+
+static void NamingScreen_InitBGs(void)
+{
+ u8 i;
+
+ DmaClearLarge16(3, (void *)VRAM, VRAM_SIZE, 0x1000);
+ DmaClear32(3, (void *)OAM, OAM_SIZE);
+ DmaClear16(3, (void *)PLTT, PLTT_SIZE);
+
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0);
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gUnknown_0858BE00, 4);
+
+ ChangeBgX(0, 0, 0);
+ ChangeBgY(0, 0, 0);
+ ChangeBgX(1, 0, 0);
+ ChangeBgY(1, 0, 0);
+ ChangeBgX(2, 0, 0);
+ ChangeBgY(2, 0, 0);
+ ChangeBgX(3, 0, 0);
+ ChangeBgY(3, 0, 0);
+
+ sub_81971D0();
+ sub_8197200();
+
+ for (i = 0; i < 5; i++)
+ gNamingScreenData->windows[i] = AddWindow(&gUnknown_0858BE10[i]);
+
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2);
+ SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0xC, 0x8));
+
+ SetBgTilemapBuffer(1, gNamingScreenData->tilemapBuffer1);
+ SetBgTilemapBuffer(2, gNamingScreenData->tilemapBuffer2);
+ SetBgTilemapBuffer(3, gNamingScreenData->tilemapBuffer3);
+
+ FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 0x20, 0x20);
+ FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 0x20, 0x20);
+ FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 0x20, 0x20);
+}
+
+static void sub_80E3194(void)
+{
+ CreateTask(sub_80E31B0, 2);
+ SetMainCallback2(sub_80E4F58);
+}
+
+static void sub_80E31B0(u8 taskId)
+{
+ switch (gNamingScreenData->state)
+ {
+ case 0:
+ MainState_BeginFadeIn();
+ sub_80E2FA4();
+ NamingScreen_InitDisplayMode();
+ break;
+ case 1:
+ MainState_WaitFadeIn();
+ break;
+ case 2:
+ MainState_HandleInput();
+ break;
+ case 3:
+ MainState_MoveToOKButton();
+ MainState_HandleInput();
+ break;
+ case 4:
+ MainState_StartPageSwap();
+ break;
+ case 5:
+ MainState_WaitPageSwap();
+ break;
+ case 6:
+ MainState_6();
+ break;
+ case 7:
+ sub_80E3604();
+ break;
+ case 8:
+ MainState_BeginFadeInOut();
+ break;
+ case 9:
+ MainState_WaitFadeOutAndExit();
+ break;
+ }
+}
+
+static const u8 gUnknown_0858BEBB[] = { 0, 2, 1 };
+static const u8 gUnknown_0858BEBE[] = { 1, 0, 2 };
+static const u8 gUnknown_0858BEC1[] = { 2, 1, 0 };
+
+static u8 sub_80E3244(u8 a1)
+{
+ return gUnknown_0858BEBB[a1];
+}
+
+static u8 sub_80E3254(void)
+{
+ return gUnknown_0858BEBE[gNamingScreenData->currentPage];
+}
+
+static u8 sub_80E3274(void)
+{
+ return gUnknown_0858BEC1[gNamingScreenData->currentPage];
+}
+
+static bool8 MainState_BeginFadeIn(void)
+{
+ sub_80E4CF8(3, gUnknown_08DD4544);
+ gNamingScreenData->currentPage = 1;
+ sub_80E4CF8(2, gUnknown_08DD46E0);
+ sub_80E4CF8(1, gUnknown_08DD4620);
+ sub_80E4DE4(gNamingScreenData->windows[1], 0);
+ sub_80E4DE4(gNamingScreenData->windows[0], 1);
+ nullsub_10(2, 0);
+ nullsub_10(1, 1);
+ sub_80E4D10();
+ sub_80E4964();
+ sub_80E4EF0();
+ CopyBgTilemapBufferToVram(1);
+ CopyBgTilemapBufferToVram(2);
+ CopyBgTilemapBufferToVram(3);
+ BlendPalettes(-1, 16, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
+ gNamingScreenData->state++;
+ return FALSE;
+}
+
+static bool8 MainState_WaitFadeIn(void)
+{
+ if (!gPaletteFade.active)
+ {
+ SetInputState(INPUT_STATE_ENABLED);
+ sub_80E3E94(1);
+ gNamingScreenData->state++;
+ }
+ return FALSE;
+}
+
+static bool8 MainState_HandleInput(void)
+{
+ return HandleKeyboardEvent();
+}
+
+static bool8 MainState_MoveToOKButton(void)
+{
+ if (IsCursorAnimFinished())
+ {
+ SetInputState(INPUT_STATE_ENABLED);
+ MoveCursorToOKButton();
+ gNamingScreenData->state = MAIN_STATE_HANDLE_INPUT;
+ }
+ return FALSE;
+}
+
+static bool8 MainState_6(void)
+{
+ sub_80E4BE4();
+ SetInputState(INPUT_STATE_DISABLED);
+ sub_80E3E94(0);
+ sub_80E3948(3, 0, 1);
+ if (gNamingScreenData->templateNum == NAMING_SCREEN_CAUGHT_MON &&
+ CalculatePlayerPartyCount() >= 6)
+ {
+ DisplaySentToPCMessage();
+ gNamingScreenData->state = MAIN_STATE_UPDATE_SENT_TO_PC_MESSAGE;
+ return FALSE;
+ }
+ else
+ {
+ gNamingScreenData->state = MAIN_STATE_BEGIN_FADE_OUT;
+ return TRUE; //Exit the naming screen
+ }
+}
+
+static bool8 MainState_BeginFadeInOut(void)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ gNamingScreenData->state++;
+ return FALSE;
+}
+
+static bool8 MainState_WaitFadeOutAndExit(void)
+{
+ if (!gPaletteFade.active)
+ {
+ if (gNamingScreenData->templateNum == NAMING_SCREEN_PLAYER)
+ SeedRngAndSetTrainerId();
+ SetMainCallback2(gNamingScreenData->returnCallback);
+ DestroyTask(FindTaskIdByFunc(sub_80E31B0));
+ FreeAllWindowBuffers();
+ FREE_AND_SET_NULL(gNamingScreenData);
+ }
+ return FALSE;
+}
+
+static void DisplaySentToPCMessage(void)
+{
+ u8 stringToDisplay = 0;
+
+ if (!sub_813B260())
+ {
+ StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_STORAGE_UNKNOWN)));
+ StringCopy(gStringVar2, gNamingScreenData->destBuffer);
+ }
+ else
+ {
+ StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_STORAGE_UNKNOWN)));
+ StringCopy(gStringVar2, gNamingScreenData->destBuffer);
+ StringCopy(gStringVar3, GetBoxNamePtr(get_unknown_box_id()));
+ stringToDisplay = 2;
+ }
+
+ if (FlagGet(FLAG_SYS_PC_LANETTE))
+ stringToDisplay++;
+
+ StringExpandPlaceholders(gStringVar4, gUnknown_0858BDB8[stringToDisplay]);
+ sub_81973C4(0, 0);
+ gTextFlags.flag_0 = TRUE;
+ AddTextPrinterParameterized(0, 1, gStringVar4, GetPlayerTextSpeed(), 0, 2, 1, 3);
+ CopyWindowToVram(0, 3);
+}
+
+static bool8 sub_80E3604(void)
+{
+ RunTextPrinters();
+
+ if (!IsTextPrinterActive(0) && (gMain.newKeys & A_BUTTON))
+ gNamingScreenData->state = MAIN_STATE_BEGIN_FADE_OUT;
+
+ return FALSE;
+}
+
+static bool8 MainState_StartPageSwap(void)
+{
+ SetInputState(INPUT_STATE_DISABLED);
+ sub_80E4050();
+ StartPageSwapAnim();
+ sub_80E3E3C(1);
+ sub_80E3948(0, 0, 1);
+ PlaySE(SE_WIN_OPEN);
+ gNamingScreenData->state = MAIN_STATE_WAIT_PAGE_SWAP;
+ return FALSE;
+}
+
+static bool8 MainState_WaitPageSwap(void)
+{
+ s16 cursorX;
+ s16 cursorY;
+ bool32 var3;
+
+ if (IsPageSwapAnimNotInProgress())
+ {
+
+ GetCursorPos(&cursorX, &cursorY);
+ var3 = (cursorX == GetCurrentPageColumnCount());
+
+ gNamingScreenData->state = MAIN_STATE_HANDLE_INPUT;
+ gNamingScreenData->currentPage++;
+ gNamingScreenData->currentPage %= 3;
+
+ if (var3)
+ {
+ cursorX = GetCurrentPageColumnCount();
+ }
+ else
+ {
+ if (cursorX >= GetCurrentPageColumnCount())
+ cursorX = GetCurrentPageColumnCount() - 1;
+ }
+
+ SetCursorPos(cursorX, cursorY);
+ sub_80E4E5C();
+ SetInputState(INPUT_STATE_ENABLED);
+ sub_80E3E3C(0);
+ }
+ return FALSE;
+}
+
+//--------------------------------------------------
+// Page Swap
+//--------------------------------------------------
+
+#define tState data[0]
+#define tFrameCount data[1]
+
+static bool8 PageSwapAnimState_Init(struct Task *);
+static bool8 PageSwapAnimState_1(struct Task *);
+static bool8 PageSwapAnimState_2(struct Task *);
+static bool8 PageSwapAnimState_Done(struct Task *);
+
+static bool8 (*const sPageSwapAnimStateFuncs[])(struct Task *) =
+{
+ PageSwapAnimState_Init,
+ PageSwapAnimState_1,
+ PageSwapAnimState_2,
+ PageSwapAnimState_Done,
+};
+
+static void StartPageSwapAnim(void)
+{
+ u8 taskId;
+
+ taskId = CreateTask(Task_HandlePageSwapAnim, 0);
+ Task_HandlePageSwapAnim(taskId);
+}
+
+static void Task_HandlePageSwapAnim(u8 taskId)
+{
+ while (sPageSwapAnimStateFuncs[gTasks[taskId].tState](&gTasks[taskId]) != 0);
+}
+
+static bool8 IsPageSwapAnimNotInProgress(void)
+{
+ if (FindTaskIdByFunc(Task_HandlePageSwapAnim) == 0xFF)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static bool8 PageSwapAnimState_Init(struct Task *task)
+{
+ gNamingScreenData->bg1vOffset = 0;
+ gNamingScreenData->bg2vOffset = 0;
+ task->tState++;
+ return 0;
+}
+
+static bool8 PageSwapAnimState_1(struct Task *task)
+{
+ u16 *const arr[] =
+ {
+ &gNamingScreenData->bg2vOffset,
+ &gNamingScreenData->bg1vOffset
+ };
+
+ task->tFrameCount += 4;
+ *arr[gNamingScreenData->bgToReveal] = Sin(task->tFrameCount, 40);
+ *arr[gNamingScreenData->bgToHide] = Sin((task->tFrameCount + 128) & 0xFF, 40);
+ if (task->tFrameCount >= 64)
+ {
+ u8 temp = gNamingScreenData->bg1Priority; //Why u8 and not u16?
+
+ gNamingScreenData->bg1Priority = gNamingScreenData->bg2Priority;
+ gNamingScreenData->bg2Priority = temp;
+ task->tState++;
+ }
+ return 0;
+}
+
+static bool8 PageSwapAnimState_2(struct Task *task)
+{
+ u16 *const arr[] =
+ {
+ &gNamingScreenData->bg2vOffset,
+ &gNamingScreenData->bg1vOffset
+ };
+
+ task->tFrameCount += 4;
+ *arr[gNamingScreenData->bgToReveal] = Sin(task->tFrameCount, 40);
+ *arr[gNamingScreenData->bgToHide] = Sin((task->tFrameCount + 128) & 0xFF, 40);
+ if (task->tFrameCount >= 128)
+ {
+ u8 temp = gNamingScreenData->bgToReveal;
+
+ gNamingScreenData->bgToReveal = gNamingScreenData->bgToHide;
+ gNamingScreenData->bgToHide = temp;
+ task->tState++;
+ }
+ return 0;
+}
+
+static bool8 PageSwapAnimState_Done(struct Task *task)
+{
+ DestroyTask(FindTaskIdByFunc(Task_HandlePageSwapAnim));
+ return 0;
+}
+
+#undef tState
+#undef tFrameCount
+
+//--------------------------------------------------
+//
+//--------------------------------------------------
+
+static void sub_80E3920(void)
+{
+ u8 taskId;
+
+ taskId = CreateTask(Task_80E39BC, 3);
+ gTasks[taskId].data[0] = 3;
+}
+
+static void sub_80E3948(u8 a, u8 b, u8 c)
+{
+ struct Task *task = &gTasks[FindTaskIdByFunc(Task_80E39BC)];
+
+ if (a == task->data[0] && c == 0)
+ {
+ task->data[1] = b;
+ task->data[2] = 1;
+ return;
+ }
+ if (a == 3 && task->data[1] == 0 && c == 0)
+ return;
+ if (task->data[0] != 3)
+ sub_80E3AE8(task->data[0]);
+ sub_80E3B10(task, a, b);
+}
+
+static void Task_80E39BC(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ if (task->data[0] == 3 || task->data[2] == 0)
+ return;
+ MultiplyInvertedPaletteRGBComponents(sub_80E3A74(task->data[0]), task->data[3], task->data[3], task->data[3]);
+ if (task->data[5] != 0)
+ {
+ task->data[5]--;
+ if (task->data[5] != 0)
+ return;
+ }
+ task->data[5] = 2;
+ if (task->data[4] >= 0)
+ {
+ if (task->data[3] < 14)
+ {
+ task->data[3] += task->data[4];
+ task->data[6] += task->data[4];
+ }
+ else
+ {
+ task->data[3] = 16;
+ task->data[6]++;
+ }
+ }
+ else
+ {
+ task->data[3] += task->data[4];
+ task->data[6] += task->data[4];
+ }
+
+ if (task->data[3] == 16 && task->data[6] == 22)
+ {
+ task->data[4] = -4;
+ }
+ else if (task->data[3] == 0)
+ {
+ task->data[2] = task->data[1];
+ task->data[4] = 2;
+ task->data[6] = 0;
+ }
+}
+
+static u16 sub_80E3A74(u8 a)
+{
+ const u16 arr[] =
+ {
+ IndexOfSpritePaletteTag(4) * 16 + 0x10E,
+ IndexOfSpritePaletteTag(6) * 16 + 0x10E,
+ IndexOfSpritePaletteTag(7) * 16 + 0x10E,
+ IndexOfSpritePaletteTag(7) * 16 + 0x101,
+ };
+
+ return arr[a];
+}
+
+static void sub_80E3AE8(u8 a)
+{
+ u16 index = sub_80E3A74(a);
+
+ gPlttBufferFaded[index] = gPlttBufferUnfaded[index];
+}
+
+static void sub_80E3B10(struct Task *task, u8 b, u8 c)
+{
+ task->data[0] = b;
+ task->data[1] = c;
+ task->data[2] = 1;
+ task->data[3] = 4;
+ task->data[4] = 2;
+ task->data[5] = 0;
+ task->data[6] = 4;
+}
+
+static void sub_80E3B30(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ StartSpriteAnim(sprite, 0);
+ sprite->invisible = (sprite->data[4] & 0xFF);
+ if (sprite->data[0] == GetCurrentPageColumnCount())
+ sprite->invisible = TRUE;
+ if (sprite->invisible || (sprite->data[4] & 0xFF00) == 0
+ || sprite->data[0] != sprite->data[2] || sprite->data[1] != sprite->data[3])
+ {
+ sprite->data[5] = 0;
+ sprite->data[6] = 2;
+ sprite->data[7] = 2;
+ }
+ sprite->data[7]--;
+ if (sprite->data[7] == 0)
+ {
+ sprite->data[5] += sprite->data[6];
+ if (sprite->data[5] == 16 || sprite->data[5] == 0)
+ sprite->data[6] = -sprite->data[6];
+ sprite->data[7] = 2;
+ }
+ if ((sprite->data[4] & 0xFF00) != 0)
+ {
+ s8 gb = sprite->data[5];
+ s8 r = sprite->data[5] >> 1;
+ u16 index = IndexOfSpritePaletteTag(5) * 16 + 0x0101;
+
+ MultiplyInvertedPaletteRGBComponents(index, r, gb, gb);
+ }
+}
+
+static void sub_80E3C20(struct Sprite *sprite)
+{
+ const s16 arr[] = {0, -4, -2, -1};
+
+ if (sprite->data[0] == 0 || --sprite->data[0] == 0)
+ {
+ sprite->data[0] = 8;
+ sprite->data[1] = (sprite->data[1] + 1) & 3;
+ }
+ sprite->pos2.x = arr[sprite->data[1]];
+}
+
+static void sub_80E3C6C(struct Sprite *sprite)
+{
+ const s16 arr[] = {2, 3, 2, 1};
+ u8 var;
+
+ var = GetTextCaretPosition();
+ if (var != (u8)sprite->data[0])
+ {
+ sprite->pos2.y = 0;
+ sprite->data[1] = 0;
+ sprite->data[2] = 0;
+ }
+ else
+ {
+ sprite->pos2.y = arr[sprite->data[1]];
+ sprite->data[2]++;
+ if (sprite->data[2] > 8)
+ {
+ sprite->data[1] = (sprite->data[1] + 1) & 3;
+ sprite->data[2] = 0;
+ }
+ }
+}
+
+//--------------------------------------------------
+// Cursor
+//--------------------------------------------------
+
+static void sub_80E3CC8(void)
+{
+ CursorInit();
+ CreatePageSwitcherSprites();
+ CreateBackOkSprites();
+ CreateUnderscoreSprites();
+ CreateInputTargetIcon();
+}
+
+static void CursorInit(void)
+{
+ gNamingScreenData->cursorSpriteId = CreateSprite(&gUnknown_0858C138, 38, 88, 1);
+ sub_80E3E3C(1);
+ gSprites[gNamingScreenData->cursorSpriteId].oam.priority = 1;
+ gSprites[gNamingScreenData->cursorSpriteId].oam.objMode = 1;
+ gSprites[gNamingScreenData->cursorSpriteId].data[6] = 1;
+ gSprites[gNamingScreenData->cursorSpriteId].data[6] = 2;
+ SetCursorPos(0, 0);
+}
+
+static void SetCursorPos(s16 x, s16 y)
+{
+ struct Sprite *cursorSprite = &gSprites[gNamingScreenData->cursorSpriteId];
+
+ if (x < gUnknown_0858BEA0[sub_80E3274()])
+ cursorSprite->pos1.x = gUnknown_0858BEA3[x + sub_80E3274() * 8] + 38;
+ else
+ cursorSprite->pos1.x = 0;
+
+ cursorSprite->pos1.y = y * 16 + 88;
+ cursorSprite->data[2] = cursorSprite->data[0];
+ cursorSprite->data[3] = cursorSprite->data[1];
+ cursorSprite->data[0] = x;
+ cursorSprite->data[1] = y;
+}
+
+static void GetCursorPos(s16 *x, s16 *y)
+{
+ struct Sprite *cursorSprite = &gSprites[gNamingScreenData->cursorSpriteId];
+
+ *x = cursorSprite->data[0];
+ *y = cursorSprite->data[1];
+}
+
+static void MoveCursorToOKButton(void)
+{
+ SetCursorPos(GetCurrentPageColumnCount(), 2);
+}
+
+static void sub_80E3E3C(u8 a)
+{
+ gSprites[gNamingScreenData->cursorSpriteId].data[4] &= -256;
+ gSprites[gNamingScreenData->cursorSpriteId].data[4] |= a;
+ StartSpriteAnim(&gSprites[gNamingScreenData->cursorSpriteId], 0);
+}
+
+static void sub_80E3E94(u8 a)
+{
+ gSprites[gNamingScreenData->cursorSpriteId].data[4] &= 0xFF;
+ gSprites[gNamingScreenData->cursorSpriteId].data[4] |= a << 8;
+}
+
+static void sub_80E3ED8(void)
+{
+ StartSpriteAnim(&gSprites[gNamingScreenData->cursorSpriteId], 1);
+}
+
+static bool8 IsCursorAnimFinished(void)
+{
+ return gSprites[gNamingScreenData->cursorSpriteId].animEnded;
+}
+
+enum
+{
+ KEY_ROLE_CHAR,
+ KEY_ROLE_PAGE,
+ KEY_ROLE_BACKSPACE,
+ KEY_ROLE_OK,
+};
+
+static const u8 sKeyRoles[] = {KEY_ROLE_PAGE, KEY_ROLE_BACKSPACE, KEY_ROLE_OK};
+
+static u8 GetKeyRoleAtCursorPos(void)
+{
+ s16 cursorX;
+ s16 cursorY;
+
+ GetCursorPos(&cursorX, &cursorY);
+ if (cursorX < GetCurrentPageColumnCount())
+ return KEY_ROLE_CHAR;
+ else
+ return sKeyRoles[cursorY];
+}
+
+static u8 GetCurrentPageColumnCount(void)
+{
+ return gUnknown_0858BEA0[sub_80E3274()];
+}
+
+static void CreatePageSwitcherSprites(void)
+{
+ u8 spriteId1;
+ u8 spriteId2;
+ u8 spriteId3;
+
+ spriteId1 = CreateSprite(&gUnknown_0858C0C0, 0xCC, 0x58, 0);
+ gNamingScreenData->selectBtnFrameSpriteId = spriteId1;
+ SetSubspriteTables(&gSprites[spriteId1], gUnknown_0858C050);
+ gSprites[spriteId1].invisible = TRUE;
+
+ spriteId2 = CreateSprite(&gUnknown_0858C0F0, 0xCC, 0x54, 1);
+ gSprites[spriteId1].data[6] = spriteId2;
+ SetSubspriteTables(&gSprites[spriteId2], gUnknown_0858C058);
+ gSprites[spriteId2].invisible = TRUE;
+
+ spriteId3 = CreateSprite(&gUnknown_0858C0D8, 0xCC, 0x53, 2);
+ gSprites[spriteId3].oam.priority = 1;
+ gSprites[spriteId1].data[7] = spriteId3;
+ gSprites[spriteId3].invisible = TRUE;
+}
+
+static void sub_80E4050(void)
+{
+ struct Sprite *sprite = &gSprites[gNamingScreenData->selectBtnFrameSpriteId];
+
+ sprite->data[0] = 2;
+ sprite->data[1] = gNamingScreenData->currentPage;
+}
+
+static u8 sub_80E40AC(struct Sprite *);
+static u8 sub_80E4100(struct Sprite *);
+static u8 sub_80E4104(struct Sprite *);
+static u8 sub_80E4178(struct Sprite *);
+
+static u8 (*const gUnknown_0858BEE8[])(struct Sprite *) =
+{
+ sub_80E40AC,
+ sub_80E4100,
+ sub_80E4104,
+ sub_80E4178,
+};
+
+static void sub_80E4084(struct Sprite *sprite)
+{
+ while (gUnknown_0858BEE8[sprite->data[0]](sprite) != 0);
+}
+
+static u8 sub_80E40AC(struct Sprite *sprite)
+{
+ struct Sprite *sprite1 = &gSprites[sprite->data[6]];
+ struct Sprite *sprite2 = &gSprites[sprite->data[7]];
+
+ sub_80E41B8(sub_80E3244(gNamingScreenData->currentPage), sprite1, sprite2);
+ sprite->data[0]++;
+ return 0;
+}
+
+static u8 sub_80E4100(struct Sprite *sprite)
+{
+ return 0;
+}
+
+static u8 sub_80E4104(struct Sprite *sprite)
+{
+ struct Sprite *r4 = &gSprites[sprite->data[6]];
+ struct Sprite *r5 = &gSprites[sprite->data[7]];
+
+ r4->pos2.y++;
+ if (r4->pos2.y > 7)
+ {
+ sprite->data[0]++;
+ r4->pos2.y = -4;
+ r4->invisible = TRUE;
+ sub_80E41B8(sub_80E3244(((u8)sprite->data[1] + 1) % 3), r4, r5);
+ }
+ return 0;
+}
+
+static u8 sub_80E4178(struct Sprite *sprite)
+{
+ struct Sprite *r2 = &gSprites[sprite->data[6]];
+
+ r2->invisible = FALSE;
+ r2->pos2.y++;
+ if (r2->pos2.y >= 0)
+ {
+ r2->pos2.y = 0;
+ sprite->data[0] = 1;
+ }
+ return 0;
+}
+
+static const u16 gUnknown_0858BEF8[] = {1, 3, 2};
+static const u16 gUnknown_0858BEFE[] = {4, 6, 5};
+
+static void sub_80E41B8(u8 a, struct Sprite *b, struct Sprite *c)
+{
+ c->oam.paletteNum = IndexOfSpritePaletteTag(gUnknown_0858BEF8[a]);
+ b->sheetTileStart = GetSpriteTileStartByTag(gUnknown_0858BEFE[a]);
+ b->subspriteTableNum = a;
+}
+
+//
+
+static void CreateBackOkSprites(void)
+{
+ u8 spriteId;
+
+ spriteId = CreateSprite(&gUnknown_0858C108, 0xCC, 0x74, 0);
+ SetSubspriteTables(&gSprites[spriteId], gUnknown_0858C070);
+ gSprites[spriteId].invisible = TRUE;
+
+ spriteId = CreateSprite(&gUnknown_0858C120, 0xCC, 0x8C, 0);
+ SetSubspriteTables(&gSprites[spriteId], gUnknown_0858C070);
+ gSprites[spriteId].invisible = TRUE;
+}
+
+static void CreateUnderscoreSprites(void)
+{
+ u8 spriteId;
+ s16 xPos;
+ u8 i;
+
+ xPos = gNamingScreenData->inputCharBaseXPos - 5;
+ spriteId = CreateSprite(&sSpriteTemplate_InputArrow, xPos, 0x38, 0);
+ gSprites[spriteId].oam.priority = 3;
+ gSprites[spriteId].invisible = TRUE;
+ xPos = gNamingScreenData->inputCharBaseXPos;
+ for (i = 0; i < gNamingScreenData->template->maxChars; i++, xPos += 8)
+ {
+ spriteId = CreateSprite(&sSpriteTemplate_Underscore, xPos + 3, 0x3C, 0);
+ gSprites[spriteId].oam.priority = 3;
+ gSprites[spriteId].data[0] = i;
+ gSprites[spriteId].invisible = TRUE;
+ }
+}
+
+//--------------------------------------------------
+// Icon creation (the thing you're naming or giving input to)
+//--------------------------------------------------
+
+static void TaskDummy2(void);
+static void NamingScreen_CreatePlayerIcon(void);
+static void NamingScreen_CreatePCIcon(void);
+static void NamingScreen_CreateMonIcon(void);
+static void NamingScreen_CreateWandaDadIcon(void);
+
+static void (*const sIconFunctions[])(void) =
+{
+ TaskDummy2,
+ NamingScreen_CreatePlayerIcon,
+ NamingScreen_CreatePCIcon,
+ NamingScreen_CreateMonIcon,
+ NamingScreen_CreateWandaDadIcon,
+};
+
+static void CreateInputTargetIcon(void)
+{
+ sIconFunctions[gNamingScreenData->template->iconFunction]();
+}
+
+static void TaskDummy2(void)
+{
+
+}
+
+static void NamingScreen_CreatePlayerIcon(void)
+{
+ u8 rivalGfxId;
+ u8 spriteId;
+
+ rivalGfxId = GetRivalAvatarGraphicsIdByStateIdAndGender(0, gNamingScreenData->monSpecies);
+ spriteId = AddPseudoFieldObject(rivalGfxId, SpriteCallbackDummy, 0x38, 0x25, 0);
+ gSprites[spriteId].oam.priority = 3;
+ StartSpriteAnim(&gSprites[spriteId], 4);
+}
+
+static void NamingScreen_CreatePCIcon(void)
+{
+ u8 spriteId;
+
+ spriteId = CreateSprite(&gUnknown_0858C180, 0x38, 0x29, 0);
+ SetSubspriteTables(&gSprites[spriteId], gUnknown_0858C078);
+ gSprites[spriteId].oam.priority = 3;
+}
+
+static void NamingScreen_CreateMonIcon(void)
+{
+ u8 spriteId;
+
+ sub_80D2F04();
+ spriteId = CreateMonIcon(gNamingScreenData->monSpecies, SpriteCallbackDummy, 0x38, 0x28, 0, gNamingScreenData->monPersonality, 1);
+ gSprites[spriteId].oam.priority = 3;
+}
+
+static void NamingScreen_CreateWandaDadIcon(void)
+{
+ u8 spriteId;
+
+ spriteId = AddPseudoFieldObject(MAP_OBJ_GFX_MAN_1, SpriteCallbackDummy, 0x38, 0x25, 0);
+ gSprites[spriteId].oam.priority = 3;
+ StartSpriteAnim(&gSprites[spriteId], 4);
+}
+
+//--------------------------------------------------
+// Keyboard handling
+//--------------------------------------------------
+
+static bool8 KeyboardKeyHandler_Character(u8);
+static bool8 KeyboardKeyHandler_Page(u8);
+static bool8 KeyboardKeyHandler_Backspace(u8);
+static bool8 KeyboardKeyHandler_OK(u8);
+
+static bool8 (*const sKeyboardKeyHandlers[])(u8) =
+{
+ KeyboardKeyHandler_Character,
+ KeyboardKeyHandler_Page,
+ KeyboardKeyHandler_Backspace,
+ KeyboardKeyHandler_OK,
+};
+
+static bool8 HandleKeyboardEvent(void)
+{
+ u8 event = GetInputEvent();
+ u8 keyRole = GetKeyRoleAtCursorPos();
+
+ if (event == KBEVENT_PRESSED_SELECT)
+ {
+ return sub_80E45E0();
+ }
+ else if (event == KBEVENT_PRESSED_B)
+ {
+ DeleteTextCharacter();
+ return FALSE;
+ }
+ else if (event == KBEVENT_PRESSED_START)
+ {
+ MoveCursorToOKButton();
+ return FALSE;
+ }
+ else
+ {
+ return sKeyboardKeyHandlers[keyRole](event);
+ }
+}
+
+static bool8 KeyboardKeyHandler_Character(u8 event)
+{
+ sub_80E3948(3, 0, 0);
+ if (event == KBEVENT_PRESSED_A)
+ {
+ bool8 var = sub_80E4B54();
+
+ sub_80E3ED8();
+ if (var)
+ {
+ SetInputState(INPUT_STATE_2);
+ gNamingScreenData->state = MAIN_STATE_MOVE_TO_OK_BUTTON;
+ }
+ }
+ return FALSE;
+}
+
+static bool8 KeyboardKeyHandler_Page(u8 event)
+{
+ sub_80E3948(0, 1, 0);
+ if (event == KBEVENT_PRESSED_A)
+ return sub_80E45E0();
+ else
+ return FALSE;
+}
+
+static bool8 KeyboardKeyHandler_Backspace(u8 event)
+{
+ sub_80E3948(1, 1, 0);
+ if (event == KBEVENT_PRESSED_A)
+ DeleteTextCharacter();
+ return FALSE;
+}
+
+static bool8 KeyboardKeyHandler_OK(u8 event)
+{
+ sub_80E3948(2, 1, 0);
+ if (event == KBEVENT_PRESSED_A)
+ {
+ PlaySE(SE_SELECT);
+ gNamingScreenData->state = MAIN_STATE_6;
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
+static bool8 sub_80E45E0(void)
+{
+ gNamingScreenData->state = MAIN_STATE_START_PAGE_SWAP;
+ return TRUE;
+}
+
+//--------------------------------------------------
+// Input handling
+//--------------------------------------------------
+
+enum
+{
+ FNKEY_CASE,
+ FNKEY_BACK,
+ FNKEY_OK,
+};
+
+#define tState data[0]
+#define tKeyboardEvent data[1]
+#define tKbFunctionKey data[2]
+
+
+static void InputState_Disabled(struct Task *);
+static void InputState_Enabled(struct Task *);
+static void InputState_2(struct Task *);
+
+static void (*const sInputStateFuncs[])(struct Task *) =
+{
+ InputState_Disabled,
+ InputState_Enabled,
+ InputState_2,
+};
+
+static void Task_HandleInput(u8);
+static void HandleDpadMovement(struct Task *);
+
+static void InputInit(void)
+{
+ CreateTask(Task_HandleInput, 1);
+}
+
+static u8 GetInputEvent(void)
+{
+ u8 taskId = FindTaskIdByFunc(Task_HandleInput);
+
+ return gTasks[taskId].tKeyboardEvent;
+}
+
+static void SetInputState(u8 state)
+{
+ u8 taskId = FindTaskIdByFunc(Task_HandleInput);
+
+ gTasks[taskId].tState = state;
+}
+
+static void Task_HandleInput(u8 taskId)
+{
+ sInputStateFuncs[gTasks[taskId].tState](&gTasks[taskId]);
+}
+
+static void InputState_Disabled(struct Task *task)
+{
+ task->tKeyboardEvent = 0;
+}
+
+static void InputState_Enabled(struct Task *task)
+{
+ task->tKeyboardEvent = 0;
+
+ if (gMain.newKeys & A_BUTTON)
+ task->tKeyboardEvent = KBEVENT_PRESSED_A;
+ else if (gMain.newKeys & B_BUTTON)
+ task->tKeyboardEvent = KBEVENT_PRESSED_B;
+ else if (gMain.newKeys & SELECT_BUTTON)
+ task->tKeyboardEvent = KBEVENT_PRESSED_SELECT;
+ else if (gMain.newKeys & START_BUTTON)
+ task->tKeyboardEvent = KBEVENT_PRESSED_START;
+ else
+ HandleDpadMovement(task);
+}
+
+static void InputState_2(struct Task *task)
+{
+ task->tKeyboardEvent = 0;
+}
+
+static void HandleDpadMovement(struct Task *task)
+{
+ const s16 sDpadDeltaX[] =
+ {
+ 0, //none
+ 0, //up
+ 0, //down
+ -1, //left
+ 1 //right
+ };
+
+ const s16 sDpadDeltaY[] =
+ {
+ 0, //none
+ -1, //up
+ 1, //down
+ 0, //left
+ 0 //right
+ };
+
+ const s16 s4RowTo3RowTableY[] = {0, 1, 1, 2};
+ const s16 gUnknown_0858BF50[] = {0, 0, 3};
+
+ s16 cursorX;
+ s16 cursorY;
+ u16 dpadDir;
+ s16 prevCursorX;
+
+ GetCursorPos(&cursorX, &cursorY);
+ dpadDir = 0;
+ if (gMain.newAndRepeatedKeys & DPAD_UP)
+ dpadDir = 1;
+ if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ dpadDir = 2;
+ if (gMain.newAndRepeatedKeys & DPAD_LEFT)
+ dpadDir = 3;
+ if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
+ dpadDir = 4;
+
+ //Get new cursor position
+ prevCursorX = cursorX;
+ cursorX += sDpadDeltaX[dpadDir];
+ cursorY += sDpadDeltaY[dpadDir];
+
+ //Wrap cursor position in the X direction
+ if (cursorX < 0)
+ cursorX = GetCurrentPageColumnCount();
+ if (cursorX > GetCurrentPageColumnCount())
+ cursorX = 0;
+
+ //Handle cursor movement in X direction
+ if (sDpadDeltaX[dpadDir] != 0)
+ {
+ if (cursorX == GetCurrentPageColumnCount())
+ {
+ //We are now on the last column
+ task->tKbFunctionKey = cursorY;
+ cursorY = s4RowTo3RowTableY[cursorY];
+ }
+ else if (prevCursorX == GetCurrentPageColumnCount())
+ {
+ if (cursorY == 1)
+ cursorY = task->tKbFunctionKey;
+ else
+ cursorY = gUnknown_0858BF50[cursorY];
+ }
+ }
+
+ if (cursorX == GetCurrentPageColumnCount())
+ {
+ //There are only 3 keys on the last column, unlike the others,
+ //so wrap Y accordingly
+ if (cursorY < 0)
+ cursorY = 2;
+ if (cursorY > 2)
+ cursorY = 0;
+ if (cursorY == 0)
+ task->tKbFunctionKey = FNKEY_BACK;
+ else if (cursorY == 2)
+ task->tKbFunctionKey = FNKEY_OK;
+ }
+ else
+ {
+ if (cursorY < 0)
+ cursorY = 3;
+ if (cursorY > 3)
+ cursorY = 0;
+ }
+ SetCursorPos(cursorX, cursorY);
+}
+
+#undef tState
+#undef tKeyboardEvent
+#undef tKbFunctionKey
+
+static void sub_80E4894(void)
+{
+ FillWindowPixelBuffer(gNamingScreenData->windows[3], 0x11);
+ PrintTextOnWindow(gNamingScreenData->windows[3], 1, gNamingScreenData->template->title, 8, 1, 0, 0);
+ PutWindowTilemap(gNamingScreenData->windows[3]);
+}
+
+static void sub_80E48E8(void)
+{
+ u8 buffer[0x20];
+
+ StringCopy(buffer, gSpeciesNames[gNamingScreenData->monSpecies]);
+ StringAppendN(buffer, gNamingScreenData->template->title, 15);
+ FillWindowPixelBuffer(gNamingScreenData->windows[3], 0x11);
+ PrintTextOnWindow(gNamingScreenData->windows[3], 1, buffer, 8, 1, 0, 0);
+ PutWindowTilemap(gNamingScreenData->windows[3]);
+}
+
+static void (*const gUnknown_0858BF58[])(void) =
+{
+ sub_80E4894,
+ sub_80E4894,
+ sub_80E48E8,
+ sub_80E48E8,
+ sub_80E4894,
+};
+
+static void sub_80E4964(void)
+{
+ gUnknown_0858BF58[gNamingScreenData->templateNum]();
+}
+
+static void TaskDummy3(void);
+static void sub_80E49BC(void);
+
+static void (*const gUnknown_0858BF6C[])(void) =
+{
+ TaskDummy3,
+ sub_80E49BC,
+};
+
+static void sub_80E498C(void)
+{
+ gUnknown_0858BF6C[gNamingScreenData->template->addGenderIcon]();
+}
+
+static void TaskDummy3(void)
+{
+
+}
+
+static const struct TextColor sGenderColors[2] =
+{
+ {0, 9, 8},
+ {0, 5, 4}
+};
+
+static void sub_80E49BC(void)
+{
+ u8 genderSymbol[2];
+ bool8 isFemale = FALSE;
+
+ StringCopy(genderSymbol, gText_MaleSymbol);
+
+ if (gNamingScreenData->monGender != MON_GENDERLESS)
+ {
+ if (gNamingScreenData->monGender == MON_FEMALE)
+ {
+ StringCopy(genderSymbol, gText_FemaleSymbol);
+ isFemale = TRUE;
+ }
+ box_print(gNamingScreenData->windows[2], 1, 0x68, 1, &sGenderColors[isFemale], -1, genderSymbol);
+ }
+}
+
+static u8 GetCharAtKeyboardPos(s16 a, s16 b)
+{
+ return gUnknown_0858BE40[a + b * 8 + sub_80E3274() * 32];
+}
+
+
+static u8 GetTextCaretPosition(void)
+{
+ u8 i;
+
+ for (i = 0; i < gNamingScreenData->template->maxChars; i++)
+ {
+ if (gNamingScreenData->textBuffer[i] == EOS)
+ return i;
+ }
+ return gNamingScreenData->template->maxChars - 1;
+}
+
+static u8 GetPreviousTextCaretPosition(void)
+{
+ s8 i;
+
+ for (i = gNamingScreenData->template->maxChars - 1; i > 0; i--)
+ {
+ if (gNamingScreenData->textBuffer[i] != EOS)
+ return i;
+ }
+ return 0;
+}
+
+static void DeleteTextCharacter(void)
+{
+ u8 index;
+ u8 var2;
+
+ index = GetPreviousTextCaretPosition();
+ gNamingScreenData->textBuffer[index] = 0;
+ sub_80E4D10();
+ CopyBgTilemapBufferToVram(3);
+ gNamingScreenData->textBuffer[index] = EOS;
+ var2 = GetKeyRoleAtCursorPos();
+ if (var2 == 0 || var2 == 2)
+ sub_80E3948(1, 0, 1);
+ PlaySE(SE_BOWA);
+}
+
+static bool8 sub_80E4B54(void)
+{
+ s16 x;
+ s16 y;
+
+ GetCursorPos(&x, &y);
+ AddTextCharacter(GetCharAtKeyboardPos(x, y));
+ sub_80E4D10();
+ CopyBgTilemapBufferToVram(3);
+ PlaySE(SE_SELECT);
+
+ if (GetPreviousTextCaretPosition() != gNamingScreenData->template->maxChars - 1)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+static void AddTextCharacter(u8 ch)
+{
+ u8 index = GetTextCaretPosition();
+
+ gNamingScreenData->textBuffer[index] = ch;
+}
+
+static void sub_80E4BE4(void)
+{
+ u8 i;
+
+ for (i = 0; i < gNamingScreenData->template->maxChars; i++)
+ {
+ if (gNamingScreenData->textBuffer[i] != CHAR_SPACE && gNamingScreenData->textBuffer[i] != EOS)
+ {
+ StringCopyN(gNamingScreenData->destBuffer, gNamingScreenData->textBuffer, gNamingScreenData->template->maxChars + 1);
+ break;
+ }
+ }
+}
+
+static void choose_name_or_words_screen_load_bg_tile_patterns(void)
+{
+ LZ77UnCompWram(gNamingScreenMenu_Gfx, gNamingScreenData->tileBuffer);
+ LoadBgTiles(1, gNamingScreenData->tileBuffer, 0x600, 0);
+ LoadBgTiles(2, gNamingScreenData->tileBuffer, 0x600, 0);
+ LoadBgTiles(3, gNamingScreenData->tileBuffer, 0x600, 0);
+ LoadSpriteSheets(gUnknown_0858C1C8);
+ LoadSpritePalettes(gUnknown_0858C230);
+}
+
+static void sub_80E4CB8(void)
+{
+ InputInit();
+ sub_80E3920();
+}
+
+static void choose_name_or_words_screen_apply_bg_pals(void)
+{
+ LoadPalette(gNamingScreenMenu_Pal, 0, 0xC0);
+ LoadPalette(gUnknown_0858BD78, 0xA0, sizeof(gUnknown_0858BD78));
+ LoadPalette(stdpal_get(2), 0xB0, 0x20);
+}
+
+static void sub_80E4CF8(u8 bg, const void *src)
+{
+ CopyToBgTilemapBuffer(bg, src, 0, 0);
+}
+
+static void nullsub_10(u8 a1, u8 a2)
+{
+
+}
+
+static void sub_80E4D10(void)
+{
+ u8 i;
+ u8 temp[2];
+ u16 unk2;
+ u8 maxChars = gNamingScreenData->template->maxChars;
+ u16 unk = gNamingScreenData->inputCharBaseXPos - 0x40;
+
+ FillWindowPixelBuffer(gNamingScreenData->windows[2], 0x11);
+
+ for (i = 0; i < maxChars; i++)
+ {
+ temp[0] = gNamingScreenData->textBuffer[i];
+ temp[1] = gExpandedPlaceholder_Empty[0];
+ unk2 = (sub_80E503C(temp[0]) == 1) ? 2 : 0;
+
+ PrintTextOnWindow(gNamingScreenData->windows[2], 1, temp, i * 8 + unk + unk2, 1, 0xFF, NULL);
+ }
+
+ sub_80E498C();
+ CopyWindowToVram(gNamingScreenData->windows[2], 2);
+ PutWindowTilemap(gNamingScreenData->windows[2]);
+}
+
+static const struct AlignedTextColor sUnkColor1 =
+{
+ 13, 1, 2
+};
+
+static const struct AlignedTextColor sUnkColor2 =
+{
+ 14, 1, 2
+};
+
+static const struct AlignedTextColor sUnkColor3 =
+{
+ 15, 1, 2
+};
+
+static const u8 sFillValues[3] =
+{
+ 0xEE, 0xDD, 0xFF
+};
+
+static const struct AlignedTextColor *const sUnkColors[3] =
+{
+ &sUnkColor2,
+ &sUnkColor1,
+ &sUnkColor3
+};
+
+static void sub_80E4DE4(u8 window, u8 a1)
+{
+ u8 i;
+
+ FillWindowPixelBuffer(window, sFillValues[a1]);
+
+ for (i = 0; i < 4; i++)
+ {
+ box_print(window, 1, 0, i * 16 + 1, sUnkColors[a1], 0, gUnknown_0858C198[a1][i]);
+ }
+
+ PutWindowTilemap(window);
+}
+
+static const u8 *const gUnknown_0858BF98[] =
+{
+ gUnknown_08DD4620,
+ gUnknown_08DD46E0,
+ gUnknown_08DD47A0
+};
+
+static void sub_80E4E5C(void)
+{
+ u8 unk1;
+ u8 unk2;
+ u8 unk3;
+ u8 bg1Priority = GetGpuReg(REG_OFFSET_BG1CNT) & 3;
+ u8 bg2Priority = GetGpuReg(REG_OFFSET_BG2CNT) & 3;
+
+ if (bg1Priority > bg2Priority)
+ {
+ unk1 = 1;
+ unk2 = 1;
+ unk3 = gNamingScreenData->windows[0];
+ }
+ else
+ {
+ unk1 = 2;
+ unk2 = 2;
+ unk3 = gNamingScreenData->windows[1];
+ }
+
+ sub_80E4CF8(unk1, gUnknown_0858BF98[gNamingScreenData->currentPage]);
+ sub_80E4DE4(unk3, sub_80E3254());
+ nullsub_10(unk1, sub_80E3254());
+ CopyBgTilemapBufferToVram(unk2);
+}
+
+static void sub_80E4EF0(void)
+{
+ const struct TextColor color[] = { 15, 1, 2 };
+
+ FillWindowPixelBuffer(gNamingScreenData->windows[4], 0xFF);
+ box_print(gNamingScreenData->windows[4], 0, 2, 1, color, 0, gText_MoveOkBack);
+ PutWindowTilemap(gNamingScreenData->windows[4]);
+ CopyWindowToVram(gNamingScreenData->windows[4], 3);
+}
+
+static void sub_80E4F58(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void NamingScreen_TurnOffScreen(void)
+{
+ SetVBlankCallback(NULL);
+ SetHBlankCallback(NULL);
+}
+
+static void NamingScreen_InitDisplayMode(void)
+{
+ SetVBlankCallback(VBlankCB_NamingScreen);
+}
+
+static void VBlankCB_NamingScreen(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ SetGpuReg(REG_OFFSET_BG1VOFS, gNamingScreenData->bg1vOffset);
+ SetGpuReg(REG_OFFSET_BG2VOFS, gNamingScreenData->bg2vOffset);
+ SetGpuReg(REG_OFFSET_BG1CNT, GetGpuReg(REG_OFFSET_BG1CNT) & 0xFFFC);
+ SetGpuRegBits(REG_OFFSET_BG1CNT, gNamingScreenData->bg1Priority);
+ SetGpuReg(REG_OFFSET_BG2CNT, GetGpuReg(REG_OFFSET_BG2CNT) & 0xFFFC);
+ SetGpuRegBits(REG_OFFSET_BG2CNT, gNamingScreenData->bg2Priority);
+}
+
+static void sub_80E501C(void)
+{
+ ShowBg(0);
+ ShowBg(1);
+ ShowBg(2);
+ ShowBg(3);
+}
+
+static bool8 sub_80E503C(u8 character)
+{
+ u8 i;
+
+ for (i = 0; gUnknown_0858BDC8[i] != EOS; i++)
+ {
+ if (character == gUnknown_0858BDC8[i])
+ return FALSE;
+ }
+ return FALSE;
+}
+
+static void sub_80E5074(void)
+{
+ DoNamingScreen(0, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, 0, 0, sub_8086194);
+}
+
+static void sub_80E509C(void)
+{
+ DoNamingScreen(1, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, 0, 0, sub_8086194);
+}
+
+static void sub_80E50C4(void)
+{
+ DoNamingScreen(2, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, 0, 0, sub_8086194);
+}
+
+static void sub_80E50EC(void)
+{
+ DoNamingScreen(3, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, 0, 0, sub_8086194);
+}
+
+//--------------------------------------------------
+// Forward-declared variables
+//--------------------------------------------------
+
+static const struct NamingScreenTemplate playerNamingScreenTemplate =
+{
+ .copyExistingString = 0,
+ .maxChars = 7,
+ .iconFunction = 1,
+ .addGenderIcon = 0,
+ .initialPage = 1,
+ .unused = 35,
+ .title = gText_YourName,
+};
+
+static const struct NamingScreenTemplate pcBoxNamingTemplate =
+{
+ .copyExistingString = 0,
+ .maxChars = 8,
+ .iconFunction = 2,
+ .addGenderIcon = 0,
+ .initialPage = 1,
+ .unused = 19,
+ .title = gText_BoxName,
+};
+
+static const struct NamingScreenTemplate monNamingScreenTemplate =
+{
+ .copyExistingString = 0,
+ .maxChars = 10,
+ .iconFunction = 3,
+ .addGenderIcon = 1,
+ .initialPage = 1,
+ .unused = 35,
+ .title = gText_PkmnsNickname,
+};
+
+static const struct NamingScreenTemplate wandaWordsScreenTemplate =
+{
+ .copyExistingString = 1,
+ .maxChars = 15,
+ .iconFunction = 4,
+ .addGenderIcon = 0,
+ .initialPage = 1,
+ .unused = 11,
+ .title = gText_TellHimTheWords,
+};
+
+static const struct NamingScreenTemplate *const sNamingScreenTemplates[] =
+{
+ &playerNamingScreenTemplate,
+ &pcBoxNamingTemplate,
+ &monNamingScreenTemplate,
+ &monNamingScreenTemplate,
+ &wandaWordsScreenTemplate,
+};
+
+const struct OamData gOamData_858BFEC =
+{
+ .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 OamData gOamData_858BFF4 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const struct OamData gOamData_858BFFC =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+static const struct Subsprite gUnknown_0858C004[] =
+{
+ {-20, -16, 1, 1, 0, 1},
+ { 12, -16, 0, 0, 4, 1},
+ {-20, -8, 1, 1, 5, 1},
+ { 12, -8, 0, 0, 9, 1},
+ {-20, 0, 1, 1, 10, 1},
+ { 12, 0, 0, 0, 14, 1},
+ {-20, 8, 1, 1, 15, 1},
+ { 12, 8, 0, 0, 19, 1}
+};
+
+static const struct Subsprite gUnknown_0858C024[] =
+{
+ {-12, -4, 1, 0, 0, 1},
+ { 4, -4, 0, 0, 2, 1}
+};
+
+static const struct Subsprite gUnknown_0858C02C[] =
+{
+ {-20, -12, 1, 1, 0, 1},
+ { 12, -12, 0, 0, 4, 1},
+ {-20, -4, 1, 1, 5, 1},
+ { 12, -4, 0, 0, 9, 1},
+ {-20, 4, 1, 1, 10, 1},
+ { 12, 4, 0, 0, 14, 1}
+};
+
+static const struct Subsprite gUnknown_0858C044[] =
+{
+ {-8, -12, 1, 0, 0, 3},
+ {-8, -4, 1, 0, 2, 3},
+ {-8, 4, 1, 0, 4, 3}
+};
+
+static const struct SubspriteTable gUnknown_0858C050[] =
+{
+ {ARRAY_COUNT(gUnknown_0858C004), gUnknown_0858C004}
+};
+
+static const struct SubspriteTable gUnknown_0858C058[] =
+{
+ {ARRAY_COUNT(gUnknown_0858C024), gUnknown_0858C024},
+ {ARRAY_COUNT(gUnknown_0858C024), gUnknown_0858C024},
+ {ARRAY_COUNT(gUnknown_0858C024), gUnknown_0858C024}
+};
+
+static const struct SubspriteTable gUnknown_0858C070[] =
+{
+ {ARRAY_COUNT(gUnknown_0858C02C), gUnknown_0858C02C}
+};
+
+static const struct SubspriteTable gUnknown_0858C078[] =
+{
+ {ARRAY_COUNT(gUnknown_0858C044), gUnknown_0858C044}
+};
+
+static const struct SpriteFrameImage gUnknown_0858C080[] =
+{
+ {gSpriteImage_858BBF8, sizeof(gSpriteImage_858BBF8)},
+ {gSpriteImage_858BCB8, sizeof(gSpriteImage_858BCB8)},
+};
+
+static const union AnimCmd gSpriteAnim_858C090[] =
+{
+ ANIMCMD_FRAME(0, 1),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd gSpriteAnim_858C098[] =
+{
+ ANIMCMD_FRAME(4, 8),
+ ANIMCMD_FRAME(8, 8),
+ ANIMCMD_END
+};
+
+static const union AnimCmd gSpriteAnim_858C0A4[] =
+{
+ ANIMCMD_FRAME(0, 2),
+ ANIMCMD_FRAME(1, 2),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd *const gSpriteAnimTable_858C0B0[] =
+{
+ gSpriteAnim_858C090
+};
+
+static const union AnimCmd *const gSpriteAnimTable_858C0B4[] =
+{
+ gSpriteAnim_858C090,
+ gSpriteAnim_858C098
+};
+
+static const union AnimCmd *const gSpriteAnimTable_858C0BC[] =
+{
+ gSpriteAnim_858C0A4
+};
+
+static const struct SpriteTemplate gUnknown_0858C0C0 =
+{
+ .tileTag = 0x0002,
+ .paletteTag = 0x0004,
+ .oam = &gOamData_858BFEC,
+ .anims = gSpriteAnimTable_858C0B0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80E4084
+};
+
+static const struct SpriteTemplate gUnknown_0858C0D8 =
+{
+ .tileTag = 0x0003,
+ .paletteTag = 0x0001,
+ .oam = &gOamData_858BFFC,
+ .anims = gSpriteAnimTable_858C0B0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_0858C0F0 =
+{
+ .tileTag = 0x0004,
+ .paletteTag = 0x0004,
+ .oam = &gOamData_858BFEC,
+ .anims = gSpriteAnimTable_858C0B0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_0858C108 =
+{
+ .tileTag = 0x0000,
+ .paletteTag = 0x0006,
+ .oam = &gOamData_858BFEC,
+ .anims = gSpriteAnimTable_858C0B0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_0858C120 =
+{
+ .tileTag = 0x0001,
+ .paletteTag = 0x0007,
+ .oam = &gOamData_858BFEC,
+ .anims = gSpriteAnimTable_858C0B0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate gUnknown_0858C138 =
+{
+ .tileTag = 0x0007,
+ .paletteTag = 0x0005,
+ .oam = &gOamData_858BFF4,
+ .anims = gSpriteAnimTable_858C0B4,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80E3B30
+};
+
+static const struct SpriteTemplate sSpriteTemplate_InputArrow =
+{
+ .tileTag = 0x000A,
+ .paletteTag = 0x0003,
+ .oam = &gOamData_858BFEC,
+ .anims = gSpriteAnimTable_858C0B0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80E3C20
+};
+
+static const struct SpriteTemplate sSpriteTemplate_Underscore =
+{
+ .tileTag = 0x000B,
+ .paletteTag = 0x0003,
+ .oam = &gOamData_858BFEC,
+ .anims = gSpriteAnimTable_858C0B0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_80E3C6C
+};
+
+static const struct SpriteTemplate gUnknown_0858C180 =
+{
+ .tileTag = 0xFFFF,
+ .paletteTag = 0x0000,
+ .oam = &gOamData_858BFEC,
+ .anims = gSpriteAnimTable_858C0BC,
+ .images = gUnknown_0858C080,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const u8* const gUnknown_0858C198[][4] =
+{
+ {
+ gUnknown_0862B88D,
+ gUnknown_0862B8AE,
+ gUnknown_0862B8CF,
+ gUnknown_0862B8F0
+ },
+ {
+ gUnknown_0862B911,
+ gUnknown_0862B932,
+ gUnknown_0862B953,
+ gUnknown_0862B974
+ },
+ {
+ gUnknown_0862B995,
+ gUnknown_0862B9AE,
+ gUnknown_0862B9C7,
+ gUnknown_0862B9E0
+ },
+};
+
+static const struct SpriteSheet gUnknown_0858C1C8[] =
+{
+ {gNamingScreenRWindow_Gfx + 0x280, 0x1E0, 0x0000},
+ {gNamingScreenRWindow_Gfx + 0x460, 0x1E0, 0x0001},
+ {gNamingScreenRWindow_Gfx, 0x280, 0x0002},
+ {gNamingScreenKeyboardButton_Gfx + 0x20, 0x100, 0x0003},
+ {gNamingScreenROptions_Gfx, 0x060, 0x0004},
+ {gNamingScreenROptions_Gfx + 0xA0, 0x060, 0x0005},
+ {gNamingScreenROptions_Gfx + 0x140, 0x060, 0x0006},
+ {gNamingScreenCursor_Gfx, 0x080, 0x0007},
+ {gNamingScreenCursor_Gfx + 0xA0, 0x080, 0x0008},
+ {gNamingScreenCursor_Gfx + 0x140, 0x080, 0x0009},
+ {gNamingScreenRightPointingTriangleTiles, 0x020, 0x000A},
+ {gNamingScreenUnderscoreTiles, 0x020, 0x000B},
+ {NULL}
+};
+
+static const struct SpritePalette gUnknown_0858C230[] =
+{
+ {gNamingScreenMenu_Pal, 0x0000},
+ {gNamingScreenMenu_Pal + 0x10, 0x0001},
+ {gNamingScreenMenu_Pal + 0x20, 0x0002},
+ {gNamingScreenMenu_Pal + 0x30, 0x0003},
+ {gNamingScreenMenu_Pal + 0x40, 0x0004},
+ {gNamingScreenMenu_Pal + 0x50, 0x0005},
+ {gNamingScreenMenu_Pal + 0x40, 0x0006},
+ {gNamingScreenMenu_Pal + 0x40, 0x0007},
+ {NULL}
+};
diff --git a/src/option_menu.c b/src/option_menu.c
index 7f92756ab..cbbe14b77 100644
--- a/src/option_menu.c
+++ b/src/option_menu.c
@@ -2,7 +2,7 @@
#include "option_menu.h"
#include "main.h"
#include "menu.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "palette.h"
#include "sprite.h"
#include "task.h"
diff --git a/src/palette.c b/src/palette.c
index 417981e47..6d709c19c 100644
--- a/src/palette.c
+++ b/src/palette.c
@@ -4,6 +4,7 @@
#include "decompress.h"
#include "gpu_regs.h"
#include "task.h"
+#include "constants/rgb.h"
enum
{
diff --git a/src/pokeblock.c b/src/pokeblock.c
index 573eed52b..472b030e0 100644
--- a/src/pokeblock.c
+++ b/src/pokeblock.c
@@ -14,7 +14,7 @@
#include "battle.h"
#include "battle_controllers.h"
#include "palette.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "list_menu.h"
#include "gpu_regs.h"
#include "decompress.h"
@@ -583,7 +583,7 @@ static void HandleInitWindows(void)
static void PrintOnPokeblockWindow(u8 windowId, const u8 *string, s32 x)
{
- AddTextPrinterParametrized2(windowId, 1, x, 1, 0, 0, &sTextColorInPokeblockMenu, 0, string);
+ AddTextPrinterParameterized2(windowId, 1, x, 1, 0, 0, &sTextColorInPokeblockMenu, 0, string);
}
static void PutPokeblockInfoText(void)
diff --git a/src/pokeblock_feed.c b/src/pokeblock_feed.c
index b26da118c..d899e54f1 100644
--- a/src/pokeblock_feed.c
+++ b/src/pokeblock_feed.c
@@ -792,7 +792,7 @@ static void Task_HandleMonAtePokeblock(u8 taskId)
StringExpandPlaceholders(gStringVar4, gText_Var1DisdainfullyAteVar2);
gTextFlags.flag_0 = 1;
- AddTextPrinterParametrized(0, 1, gStringVar4, GetPlayerTextSpeed(), NULL, 2, 1, 3);
+ AddTextPrinterParameterized(0, 1, gStringVar4, GetPlayerTextSpeed(), NULL, 2, 1, 3);
gTasks[taskId].func = Task_WaitForAtePokeblockText;
}
diff --git a/src/pokemon_3.c b/src/pokemon_3.c
index 95ec4b6a2..7ffb2f36a 100644
--- a/src/pokemon_3.c
+++ b/src/pokemon_3.c
@@ -74,8 +74,6 @@ extern u8 GetFrontierOpponentClass(u16 trainerId);
extern u8 pokemon_order_func(u8 bankPartyId);
extern void GetFrontierTrainerName(u8* dest, u16 trainerId);
extern void sub_81C488C(u8);
-extern void sub_817F578(struct Sprite*, u8 frontAnimId);
-extern u8 GetSpeciesBackAnimId(u16 species);
static void sub_806E6CC(u8 taskId);
@@ -1508,7 +1506,7 @@ static void Task_PokemonSummaryAnimateAfterDelay(u8 taskId)
{
if (--gTasks[taskId].data[3] == 0)
{
- sub_817F578(READ_PTR_FROM_TASK(taskId, 0), gTasks[taskId].data[2]);
+ StartMonSummaryAnimation(READ_PTR_FROM_TASK(taskId, 0), gTasks[taskId].data[2]);
sub_81C488C(0xFF);
DestroyTask(taskId);
}
@@ -1523,7 +1521,6 @@ void BattleAnimateFrontSprite(struct Sprite* sprite, u16 species, bool8 noCry, u
}
extern void SpriteCallbackDummy_2(struct Sprite*);
-extern void sub_817F60C(struct Sprite*);
void DoMonFrontSpriteAnimation(struct Sprite* sprite, u16 species, bool8 noCry, u8 arg3)
{
@@ -1580,11 +1577,11 @@ void PokemonSummaryDoMonAnimation(struct Sprite* sprite, u16 species, bool8 oneF
gTasks[taskId].data[2] = gMonFrontAnimIdsTable[species - 1];
gTasks[taskId].data[3] = gMonAnimationDelayTable[species - 1];
sub_81C488C(taskId);
- sub_817F60C(sprite);
+ SetSpriteCB_MonAnimDummy(sprite);
}
else
{
- sub_817F578(sprite, gMonFrontAnimIdsTable[species - 1]);
+ StartMonSummaryAnimation(sprite, gMonFrontAnimIdsTable[species - 1]);
}
}
@@ -1603,7 +1600,7 @@ void BattleAnimateBackSprite(struct Sprite* sprite, u16 species)
}
else
{
- LaunchAnimationTaskForBackSprite(sprite, GetSpeciesBackAnimId(species));
+ LaunchAnimationTaskForBackSprite(sprite, GetSpeciesBackAnimSet(species));
sprite->callback = SpriteCallbackDummy_2;
}
}
diff --git a/src/pokemon_animation.c b/src/pokemon_animation.c
new file mode 100644
index 000000000..2bd4e3ef9
--- /dev/null
+++ b/src/pokemon_animation.c
@@ -0,0 +1,5658 @@
+#include "global.h"
+#include "pokemon.h"
+#include "sprite.h"
+#include "pokemon_animation.h"
+#include "trig.h"
+#include "task.h"
+#include "blend_palette.h"
+#include "constants/rgb.h"
+
+struct UnkAnimStruct
+{
+ u16 field_0;
+ s16 field_2;
+ s16 field_4;
+ s16 field_6;
+ s16 field_8;
+};
+
+extern u16 gBattlePartyID[];
+
+// this file's functions
+static void pokemonanimfunc_00(struct Sprite *sprite);
+static void pokemonanimfunc_01(struct Sprite *sprite);
+static void pokemonanimfunc_02(struct Sprite *sprite);
+static void pokemonanimfunc_03(struct Sprite *sprite);
+static void pokemonanimfunc_04(struct Sprite *sprite);
+static void pokemonanimfunc_05(struct Sprite *sprite);
+static void pokemonanimfunc_06(struct Sprite *sprite);
+static void pokemonanimfunc_07(struct Sprite *sprite);
+static void pokemonanimfunc_08(struct Sprite *sprite);
+static void pokemonanimfunc_09(struct Sprite *sprite);
+static void pokemonanimfunc_0A(struct Sprite *sprite);
+static void pokemonanimfunc_0B(struct Sprite *sprite);
+static void pokemonanimfunc_0C(struct Sprite *sprite);
+static void pokemonanimfunc_0D(struct Sprite *sprite);
+static void pokemonanimfunc_0E(struct Sprite *sprite);
+static void pokemonanimfunc_0F(struct Sprite *sprite);
+static void pokemonanimfunc_10(struct Sprite *sprite);
+static void pokemonanimfunc_11(struct Sprite *sprite);
+static void pokemonanimfunc_12(struct Sprite *sprite);
+static void pokemonanimfunc_13(struct Sprite *sprite);
+static void pokemonanimfunc_14(struct Sprite *sprite);
+static void pokemonanimfunc_15(struct Sprite *sprite);
+static void pokemonanimfunc_16(struct Sprite *sprite);
+static void pokemonanimfunc_17(struct Sprite *sprite);
+static void pokemonanimfunc_18(struct Sprite *sprite);
+static void pokemonanimfunc_19(struct Sprite *sprite);
+static void pokemonanimfunc_1A(struct Sprite *sprite);
+static void pokemonanimfunc_1B(struct Sprite *sprite);
+static void pokemonanimfunc_1C(struct Sprite *sprite);
+static void pokemonanimfunc_1D(struct Sprite *sprite);
+static void pokemonanimfunc_1E(struct Sprite *sprite);
+static void pokemonanimfunc_1F(struct Sprite *sprite);
+static void pokemonanimfunc_20(struct Sprite *sprite);
+static void pokemonanimfunc_21(struct Sprite *sprite);
+static void pokemonanimfunc_22(struct Sprite *sprite);
+static void pokemonanimfunc_23(struct Sprite *sprite);
+static void pokemonanimfunc_24(struct Sprite *sprite);
+static void pokemonanimfunc_25(struct Sprite *sprite);
+static void pokemonanimfunc_26(struct Sprite *sprite);
+static void pokemonanimfunc_27(struct Sprite *sprite);
+static void pokemonanimfunc_28(struct Sprite *sprite);
+static void pokemonanimfunc_29(struct Sprite *sprite);
+static void pokemonanimfunc_2A(struct Sprite *sprite);
+static void pokemonanimfunc_2B(struct Sprite *sprite);
+static void pokemonanimfunc_2C(struct Sprite *sprite);
+static void pokemonanimfunc_2D(struct Sprite *sprite);
+static void pokemonanimfunc_2E(struct Sprite *sprite);
+static void pokemonanimfunc_2F(struct Sprite *sprite);
+static void pokemonanimfunc_30(struct Sprite *sprite);
+static void pokemonanimfunc_31(struct Sprite *sprite);
+static void pokemonanimfunc_32(struct Sprite *sprite);
+static void pokemonanimfunc_33(struct Sprite *sprite);
+static void pokemonanimfunc_34(struct Sprite *sprite);
+static void pokemonanimfunc_35(struct Sprite *sprite);
+static void pokemonanimfunc_36(struct Sprite *sprite);
+static void pokemonanimfunc_37(struct Sprite *sprite);
+static void pokemonanimfunc_38(struct Sprite *sprite);
+static void pokemonanimfunc_39(struct Sprite *sprite);
+static void pokemonanimfunc_3A(struct Sprite *sprite);
+static void pokemonanimfunc_3B(struct Sprite *sprite);
+static void pokemonanimfunc_3C(struct Sprite *sprite);
+static void pokemonanimfunc_3D(struct Sprite *sprite);
+static void pokemonanimfunc_3E(struct Sprite *sprite);
+static void pokemonanimfunc_3F(struct Sprite *sprite);
+static void pokemonanimfunc_40(struct Sprite *sprite);
+static void pokemonanimfunc_41(struct Sprite *sprite);
+static void pokemonanimfunc_42(struct Sprite *sprite);
+static void pokemonanimfunc_43(struct Sprite *sprite);
+static void pokemonanimfunc_44(struct Sprite *sprite);
+static void pokemonanimfunc_45(struct Sprite *sprite);
+static void pokemonanimfunc_46(struct Sprite *sprite);
+static void pokemonanimfunc_47(struct Sprite *sprite);
+static void pokemonanimfunc_48(struct Sprite *sprite);
+static void pokemonanimfunc_49(struct Sprite *sprite);
+static void pokemonanimfunc_4A(struct Sprite *sprite);
+static void pokemonanimfunc_4B(struct Sprite *sprite);
+static void pokemonanimfunc_4C(struct Sprite *sprite);
+static void pokemonanimfunc_4D(struct Sprite *sprite);
+static void pokemonanimfunc_4E(struct Sprite *sprite);
+static void pokemonanimfunc_4F(struct Sprite *sprite);
+static void pokemonanimfunc_50(struct Sprite *sprite);
+static void pokemonanimfunc_51(struct Sprite *sprite);
+static void pokemonanimfunc_52(struct Sprite *sprite);
+static void pokemonanimfunc_53(struct Sprite *sprite);
+static void pokemonanimfunc_54(struct Sprite *sprite);
+static void pokemonanimfunc_55(struct Sprite *sprite);
+static void pokemonanimfunc_56(struct Sprite *sprite);
+static void pokemonanimfunc_57(struct Sprite *sprite);
+static void pokemonanimfunc_58(struct Sprite *sprite);
+static void pokemonanimfunc_59(struct Sprite *sprite);
+static void pokemonanimfunc_5A(struct Sprite *sprite);
+static void pokemonanimfunc_5B(struct Sprite *sprite);
+static void pokemonanimfunc_5C(struct Sprite *sprite);
+static void pokemonanimfunc_5D(struct Sprite *sprite);
+static void pokemonanimfunc_5E(struct Sprite *sprite);
+static void pokemonanimfunc_5F(struct Sprite *sprite);
+static void pokemonanimfunc_60(struct Sprite *sprite);
+static void pokemonanimfunc_61(struct Sprite *sprite);
+static void pokemonanimfunc_62(struct Sprite *sprite);
+static void pokemonanimfunc_63(struct Sprite *sprite);
+static void pokemonanimfunc_64(struct Sprite *sprite);
+static void pokemonanimfunc_65(struct Sprite *sprite);
+static void pokemonanimfunc_66(struct Sprite *sprite);
+static void pokemonanimfunc_67(struct Sprite *sprite);
+static void pokemonanimfunc_68(struct Sprite *sprite);
+static void pokemonanimfunc_69(struct Sprite *sprite);
+static void pokemonanimfunc_6A(struct Sprite *sprite);
+static void pokemonanimfunc_6B(struct Sprite *sprite);
+static void pokemonanimfunc_6C(struct Sprite *sprite);
+static void pokemonanimfunc_6D(struct Sprite *sprite);
+static void pokemonanimfunc_6E(struct Sprite *sprite);
+static void pokemonanimfunc_6F(struct Sprite *sprite);
+static void pokemonanimfunc_70(struct Sprite *sprite);
+static void pokemonanimfunc_71(struct Sprite *sprite);
+static void pokemonanimfunc_72(struct Sprite *sprite);
+static void pokemonanimfunc_73(struct Sprite *sprite);
+static void pokemonanimfunc_74(struct Sprite *sprite);
+static void pokemonanimfunc_75(struct Sprite *sprite);
+static void pokemonanimfunc_76(struct Sprite *sprite);
+static void pokemonanimfunc_77(struct Sprite *sprite);
+static void pokemonanimfunc_78(struct Sprite *sprite);
+static void pokemonanimfunc_79(struct Sprite *sprite);
+static void pokemonanimfunc_7A(struct Sprite *sprite);
+static void pokemonanimfunc_7B(struct Sprite *sprite);
+static void pokemonanimfunc_7C(struct Sprite *sprite);
+static void pokemonanimfunc_7D(struct Sprite *sprite);
+static void pokemonanimfunc_7E(struct Sprite *sprite);
+static void pokemonanimfunc_7F(struct Sprite *sprite);
+static void pokemonanimfunc_80(struct Sprite *sprite);
+static void pokemonanimfunc_81(struct Sprite *sprite);
+static void pokemonanimfunc_82(struct Sprite *sprite);
+static void pokemonanimfunc_83(struct Sprite *sprite);
+static void pokemonanimfunc_84(struct Sprite *sprite);
+static void pokemonanimfunc_85(struct Sprite *sprite);
+static void pokemonanimfunc_86(struct Sprite *sprite);
+static void pokemonanimfunc_87(struct Sprite *sprite);
+static void pokemonanimfunc_88(struct Sprite *sprite);
+static void pokemonanimfunc_89(struct Sprite *sprite);
+static void pokemonanimfunc_8A(struct Sprite *sprite);
+static void pokemonanimfunc_8B(struct Sprite *sprite);
+static void pokemonanimfunc_8C(struct Sprite *sprite);
+static void pokemonanimfunc_8D(struct Sprite *sprite);
+static void pokemonanimfunc_8E(struct Sprite *sprite);
+static void pokemonanimfunc_8F(struct Sprite *sprite);
+static void pokemonanimfunc_90(struct Sprite *sprite);
+static void pokemonanimfunc_91(struct Sprite *sprite);
+static void pokemonanimfunc_92(struct Sprite *sprite);
+static void pokemonanimfunc_93(struct Sprite *sprite);
+static void pokemonanimfunc_94(struct Sprite *sprite);
+static void pokemonanimfunc_95(struct Sprite *sprite);
+static void pokemonanimfunc_96(struct Sprite *sprite);
+
+static void SpriteCB_SetDummyOnAnimEnd(struct Sprite *sprite);
+
+#define STRUCT_COUNT 4
+
+// IWRAM bss
+static IWRAM_DATA struct UnkAnimStruct sUnknown_03001240[STRUCT_COUNT];
+static IWRAM_DATA u8 sUnknown_03001270;
+static IWRAM_DATA bool32 sUnknown_03001274;
+
+// const rom data
+static const u8 sSpeciesToBackAnimSet[] =
+{
+ 0x00, // SPECIES_NONE
+ 0x13, // SPECIES_BULBASAUR
+ 0x02, // SPECIES_IVYSAUR
+ 0x08, // SPECIES_VENUSAUR
+ 0x12, // SPECIES_CHARMANDER
+ 0x15, // SPECIES_CHARMELEON
+ 0x17, // SPECIES_CHARIZARD
+ 0x12, // SPECIES_SQUIRTLE
+ 0x12, // SPECIES_WARTORTLE
+ 0x19, // SPECIES_BLASTOISE
+ 0x02, // SPECIES_CATERPIE
+ 0x13, // SPECIES_METAPOD
+ 0x11, // SPECIES_BUTTERFREE
+ 0x02, // SPECIES_WEEDLE
+ 0x13, // SPECIES_KAKUNA
+ 0x01, // SPECIES_BEEDRILL
+ 0x0f, // SPECIES_PIDGEY
+ 0x15, // SPECIES_PIDGEOTTO
+ 0x0f, // SPECIES_PIDGEOT
+ 0x0a, // SPECIES_RATTATA
+ 0x0a, // SPECIES_RATICATE
+ 0x0f, // SPECIES_SPEAROW
+ 0x15, // SPECIES_FEAROW
+ 0x0f, // SPECIES_EKANS
+ 0x09, // SPECIES_ARBOK
+ 0x16, // SPECIES_PIKACHU
+ 0x16, // SPECIES_RAICHU
+ 0x12, // SPECIES_SANDSHREW
+ 0x10, // SPECIES_SANDSLASH
+ 0x12, // SPECIES_NIDORAN_F
+ 0x15, // SPECIES_NIDORINA
+ 0x09, // SPECIES_NIDOQUEEN
+ 0x12, // SPECIES_NIDORAN_M
+ 0x15, // SPECIES_NIDORINO
+ 0x09, // SPECIES_NIDOKING
+ 0x13, // SPECIES_CLEFAIRY
+ 0x13, // SPECIES_CLEFABLE
+ 0x10, // SPECIES_VULPIX
+ 0x01, // SPECIES_NINETALES
+ 0x13, // SPECIES_JIGGLYPUFF
+ 0x06, // SPECIES_WIGGLYTUFF
+ 0x11, // SPECIES_ZUBAT
+ 0x09, // SPECIES_GOLBAT
+ 0x02, // SPECIES_ODDISH
+ 0x02, // SPECIES_GLOOM
+ 0x14, // SPECIES_VILEPLUME
+ 0x02, // SPECIES_PARAS
+ 0x08, // SPECIES_PARASECT
+ 0x0a, // SPECIES_VENONAT
+ 0x11, // SPECIES_VENOMOTH
+ 0x09, // SPECIES_DIGLETT
+ 0x09, // SPECIES_DUGTRIO
+ 0x10, // SPECIES_MEOWTH
+ 0x0f, // SPECIES_PERSIAN
+ 0x02, // SPECIES_PSYDUCK
+ 0x14, // SPECIES_GOLDUCK
+ 0x10, // SPECIES_MANKEY
+ 0x10, // SPECIES_PRIMEAPE
+ 0x15, // SPECIES_GROWLITHE
+ 0x15, // SPECIES_ARCANINE
+ 0x12, // SPECIES_POLIWAG
+ 0x09, // SPECIES_POLIWHIRL
+ 0x0e, // SPECIES_POLIWRATH
+ 0x14, // SPECIES_ABRA
+ 0x14, // SPECIES_KADABRA
+ 0x0d, // SPECIES_ALAKAZAM
+ 0x15, // SPECIES_MACHOP
+ 0x09, // SPECIES_MACHOKE
+ 0x09, // SPECIES_MACHAMP
+ 0x0b, // SPECIES_BELLSPROUT
+ 0x0b, // SPECIES_WEEPINBELL
+ 0x0b, // SPECIES_VICTREEBEL
+ 0x02, // SPECIES_TENTACOOL
+ 0x02, // SPECIES_TENTACRUEL
+ 0x0e, // SPECIES_GEODUDE
+ 0x08, // SPECIES_GRAVELER
+ 0x08, // SPECIES_GOLEM
+ 0x17, // SPECIES_PONYTA
+ 0x15, // SPECIES_RAPIDASH
+ 0x02, // SPECIES_SLOWPOKE
+ 0x13, // SPECIES_SLOWBRO
+ 0x0f, // SPECIES_MAGNEMITE
+ 0x0f, // SPECIES_MAGNETON
+ 0x02, // SPECIES_FARFETCHD
+ 0x0f, // SPECIES_DODUO
+ 0x15, // SPECIES_DODRIO
+ 0x13, // SPECIES_SEEL
+ 0x02, // SPECIES_DEWGONG
+ 0x0b, // SPECIES_GRIMER
+ 0x0c, // SPECIES_MUK
+ 0x13, // SPECIES_SHELLDER
+ 0x0f, // SPECIES_CLOYSTER
+ 0x01, // SPECIES_GASTLY
+ 0x01, // SPECIES_HAUNTER
+ 0x14, // SPECIES_GENGAR
+ 0x09, // SPECIES_ONIX
+ 0x13, // SPECIES_DROWZEE
+ 0x14, // SPECIES_HYPNO
+ 0x0a, // SPECIES_KRABBY
+ 0x09, // SPECIES_KINGLER
+ 0x15, // SPECIES_VOLTORB
+ 0x15, // SPECIES_ELECTRODE
+ 0x02, // SPECIES_EXEGGCUTE
+ 0x10, // SPECIES_EXEGGUTOR
+ 0x15, // SPECIES_CUBONE
+ 0x10, // SPECIES_MAROWAK
+ 0x02, // SPECIES_HITMONLEE
+ 0x0f, // SPECIES_HITMONCHAN
+ 0x02, // SPECIES_LICKITUNG
+ 0x06, // SPECIES_KOFFING
+ 0x06, // SPECIES_WEEZING
+ 0x0e, // SPECIES_RHYHORN
+ 0x0e, // SPECIES_RHYDON
+ 0x12, // SPECIES_CHANSEY
+ 0x0b, // SPECIES_TANGELA
+ 0x12, // SPECIES_KANGASKHAN
+ 0x13, // SPECIES_HORSEA
+ 0x11, // SPECIES_SEADRA
+ 0x11, // SPECIES_GOLDEEN
+ 0x11, // SPECIES_SEAKING
+ 0x13, // SPECIES_STARYU
+ 0x19, // SPECIES_STARMIE
+ 0x14, // SPECIES_MR_MIME
+ 0x0f, // SPECIES_SCYTHER
+ 0x13, // SPECIES_JYNX
+ 0x16, // SPECIES_ELECTABUZZ
+ 0x17, // SPECIES_MAGMAR
+ 0x0e, // SPECIES_PINSIR
+ 0x0e, // SPECIES_TAUROS
+ 0x10, // SPECIES_MAGIKARP
+ 0x09, // SPECIES_GYARADOS
+ 0x19, // SPECIES_LAPRAS
+ 0x05, // SPECIES_DITTO
+ 0x12, // SPECIES_EEVEE
+ 0x19, // SPECIES_VAPOREON
+ 0x16, // SPECIES_JOLTEON
+ 0x17, // SPECIES_FLAREON
+ 0x01, // SPECIES_PORYGON
+ 0x13, // SPECIES_OMANYTE
+ 0x13, // SPECIES_OMASTAR
+ 0x13, // SPECIES_KABUTO
+ 0x15, // SPECIES_KABUTOPS
+ 0x15, // SPECIES_AERODACTYL
+ 0x13, // SPECIES_SNORLAX
+ 0x19, // SPECIES_ARTICUNO
+ 0x16, // SPECIES_ZAPDOS
+ 0x17, // SPECIES_MOLTRES
+ 0x02, // SPECIES_DRATINI
+ 0x0f, // SPECIES_DRAGONAIR
+ 0x09, // SPECIES_DRAGONITE
+ 0x0d, // SPECIES_MEWTWO
+ 0x12, // SPECIES_MEW
+ 0x12, // SPECIES_CHIKORITA
+ 0x02, // SPECIES_BAYLEEF
+ 0x09, // SPECIES_MEGANIUM
+ 0x12, // SPECIES_CYNDAQUIL
+ 0x15, // SPECIES_QUILAVA
+ 0x17, // SPECIES_TYPHLOSION
+ 0x15, // SPECIES_TOTODILE
+ 0x15, // SPECIES_CROCONAW
+ 0x09, // SPECIES_FERALIGATR
+ 0x12, // SPECIES_SENTRET
+ 0x10, // SPECIES_FURRET
+ 0x11, // SPECIES_HOOTHOOT
+ 0x0f, // SPECIES_NOCTOWL
+ 0x0a, // SPECIES_LEDYBA
+ 0x11, // SPECIES_LEDIAN
+ 0x0a, // SPECIES_SPINARAK
+ 0x02, // SPECIES_ARIADOS
+ 0x0f, // SPECIES_CROBAT
+ 0x0b, // SPECIES_CHINCHOU
+ 0x16, // SPECIES_LANTURN
+ 0x12, // SPECIES_PICHU
+ 0x13, // SPECIES_CLEFFA
+ 0x13, // SPECIES_IGGLYBUFF
+ 0x13, // SPECIES_TOGEPI
+ 0x11, // SPECIES_TOGETIC
+ 0x12, // SPECIES_NATU
+ 0x14, // SPECIES_XATU
+ 0x12, // SPECIES_MAREEP
+ 0x13, // SPECIES_FLAAFFY
+ 0x16, // SPECIES_AMPHAROS
+ 0x11, // SPECIES_BELLOSSOM
+ 0x12, // SPECIES_MARILL
+ 0x13, // SPECIES_AZUMARILL
+ 0x02, // SPECIES_SUDOWOODO
+ 0x10, // SPECIES_POLITOED
+ 0x11, // SPECIES_HOPPIP
+ 0x11, // SPECIES_SKIPLOOM
+ 0x11, // SPECIES_JUMPLUFF
+ 0x10, // SPECIES_AIPOM
+ 0x13, // SPECIES_SUNKERN
+ 0x02, // SPECIES_SUNFLORA
+ 0x11, // SPECIES_YANMA
+ 0x0b, // SPECIES_WOOPER
+ 0x02, // SPECIES_QUAGSIRE
+ 0x14, // SPECIES_ESPEON
+ 0x14, // SPECIES_UMBREON
+ 0x12, // SPECIES_MURKROW
+ 0x13, // SPECIES_SLOWKING
+ 0x01, // SPECIES_MISDREAVUS
+ 0x14, // SPECIES_UNOWN
+ 0x0b, // SPECIES_WOBBUFFET
+ 0x14, // SPECIES_GIRAFARIG
+ 0x08, // SPECIES_PINECO
+ 0x09, // SPECIES_FORRETRESS
+ 0x0f, // SPECIES_DUNSPARCE
+ 0x05, // SPECIES_GLIGAR
+ 0x09, // SPECIES_STEELIX
+ 0x15, // SPECIES_SNUBBULL
+ 0x09, // SPECIES_GRANBULL
+ 0x0d, // SPECIES_QWILFISH
+ 0x15, // SPECIES_SCIZOR
+ 0x13, // SPECIES_SHUCKLE
+ 0x15, // SPECIES_HERACROSS
+ 0x0f, // SPECIES_SNEASEL
+ 0x13, // SPECIES_TEDDIURSA
+ 0x09, // SPECIES_URSARING
+ 0x17, // SPECIES_SLUGMA
+ 0x17, // SPECIES_MAGCARGO
+ 0x0a, // SPECIES_SWINUB
+ 0x08, // SPECIES_PILOSWINE
+ 0x02, // SPECIES_CORSOLA
+ 0x02, // SPECIES_REMORAID
+ 0x05, // SPECIES_OCTILLERY
+ 0x0f, // SPECIES_DELIBIRD
+ 0x02, // SPECIES_MANTINE
+ 0x15, // SPECIES_SKARMORY
+ 0x09, // SPECIES_HOUNDOUR
+ 0x09, // SPECIES_HOUNDOOM
+ 0x19, // SPECIES_KINGDRA
+ 0x15, // SPECIES_PHANPY
+ 0x0e, // SPECIES_DONPHAN
+ 0x01, // SPECIES_PORYGON2
+ 0x13, // SPECIES_STANTLER
+ 0x02, // SPECIES_SMEARGLE
+ 0x0f, // SPECIES_TYROGUE
+ 0x07, // SPECIES_HITMONTOP
+ 0x02, // SPECIES_SMOOCHUM
+ 0x08, // SPECIES_ELEKID
+ 0x17, // SPECIES_MAGBY
+ 0x02, // SPECIES_MILTANK
+ 0x13, // SPECIES_BLISSEY
+ 0x16, // SPECIES_RAIKOU
+ 0x17, // SPECIES_ENTEI
+ 0x19, // SPECIES_SUICUNE
+ 0x0e, // SPECIES_LARVITAR
+ 0x09, // SPECIES_PUPITAR
+ 0x0e, // SPECIES_TYRANITAR
+ 0x19, // SPECIES_LUGIA
+ 0x17, // SPECIES_HO_OH
+ 0x18, // SPECIES_CELEBI
+ 0x00, // SPECIES_OLD_UNOWN_B
+ 0x00, // SPECIES_OLD_UNOWN_C
+ 0x00, // SPECIES_OLD_UNOWN_D
+ 0x00, // SPECIES_OLD_UNOWN_E
+ 0x00, // SPECIES_OLD_UNOWN_F
+ 0x00, // SPECIES_OLD_UNOWN_G
+ 0x00, // SPECIES_OLD_UNOWN_H
+ 0x00, // SPECIES_OLD_UNOWN_I
+ 0x00, // SPECIES_OLD_UNOWN_J
+ 0x00, // SPECIES_OLD_UNOWN_K
+ 0x00, // SPECIES_OLD_UNOWN_L
+ 0x00, // SPECIES_OLD_UNOWN_M
+ 0x00, // SPECIES_OLD_UNOWN_N
+ 0x00, // SPECIES_OLD_UNOWN_O
+ 0x00, // SPECIES_OLD_UNOWN_P
+ 0x00, // SPECIES_OLD_UNOWN_Q
+ 0x00, // SPECIES_OLD_UNOWN_R
+ 0x00, // SPECIES_OLD_UNOWN_S
+ 0x00, // SPECIES_OLD_UNOWN_T
+ 0x00, // SPECIES_OLD_UNOWN_U
+ 0x00, // SPECIES_OLD_UNOWN_V
+ 0x00, // SPECIES_OLD_UNOWN_W
+ 0x00, // SPECIES_OLD_UNOWN_X
+ 0x00, // SPECIES_OLD_UNOWN_Y
+ 0x00, // SPECIES_OLD_UNOWN_Z
+ 0x10, // SPECIES_TREECKO
+ 0x15, // SPECIES_GROVYLE
+ 0x09, // SPECIES_SCEPTILE
+ 0x12, // SPECIES_TORCHIC
+ 0x10, // SPECIES_COMBUSKEN
+ 0x17, // SPECIES_BLAZIKEN
+ 0x02, // SPECIES_MUDKIP
+ 0x12, // SPECIES_MARSHTOMP
+ 0x19, // SPECIES_SWAMPERT
+ 0x12, // SPECIES_POOCHYENA
+ 0x08, // SPECIES_MIGHTYENA
+ 0x0f, // SPECIES_ZIGZAGOON
+ 0x15, // SPECIES_LINOONE
+ 0x0b, // SPECIES_WURMPLE
+ 0x08, // SPECIES_SILCOON
+ 0x11, // SPECIES_BEAUTIFLY
+ 0x08, // SPECIES_CASCOON
+ 0x0f, // SPECIES_DUSTOX
+ 0x02, // SPECIES_LOTAD
+ 0x10, // SPECIES_LOMBRE
+ 0x10, // SPECIES_LUDICOLO
+ 0x13, // SPECIES_SEEDOT
+ 0x09, // SPECIES_NUZLEAF
+ 0x14, // SPECIES_SHIFTRY
+ 0x0a, // SPECIES_NINCADA
+ 0x01, // SPECIES_NINJASK
+ 0x14, // SPECIES_SHEDINJA
+ 0x12, // SPECIES_TAILLOW
+ 0x15, // SPECIES_SWELLOW
+ 0x13, // SPECIES_SHROOMISH
+ 0x15, // SPECIES_BRELOOM
+ 0x07, // SPECIES_SPINDA
+ 0x11, // SPECIES_WINGULL
+ 0x11, // SPECIES_PELIPPER
+ 0x03, // SPECIES_SURSKIT
+ 0x11, // SPECIES_MASQUERAIN
+ 0x19, // SPECIES_WAILMER
+ 0x19, // SPECIES_WAILORD
+ 0x13, // SPECIES_SKITTY
+ 0x12, // SPECIES_DELCATTY
+ 0x01, // SPECIES_KECLEON
+ 0x13, // SPECIES_BALTOY
+ 0x14, // SPECIES_CLAYDOL
+ 0x0e, // SPECIES_NOSEPASS
+ 0x17, // SPECIES_TORKOAL
+ 0x01, // SPECIES_SABLEYE
+ 0x0b, // SPECIES_BARBOACH
+ 0x09, // SPECIES_WHISCASH
+ 0x04, // SPECIES_LUVDISC
+ 0x0f, // SPECIES_CORPHISH
+ 0x15, // SPECIES_CRAWDAUNT
+ 0x03, // SPECIES_FEEBAS
+ 0x19, // SPECIES_MILOTIC
+ 0x04, // SPECIES_CARVANHA
+ 0x15, // SPECIES_SHARPEDO
+ 0x13, // SPECIES_TRAPINCH
+ 0x01, // SPECIES_VIBRAVA
+ 0x0f, // SPECIES_FLYGON
+ 0x0e, // SPECIES_MAKUHITA
+ 0x0e, // SPECIES_HARIYAMA
+ 0x15, // SPECIES_ELECTRIKE
+ 0x09, // SPECIES_MANECTRIC
+ 0x0e, // SPECIES_NUMEL
+ 0x17, // SPECIES_CAMERUPT
+ 0x13, // SPECIES_SPHEAL
+ 0x09, // SPECIES_SEALEO
+ 0x09, // SPECIES_WALREIN
+ 0x0a, // SPECIES_CACNEA
+ 0x08, // SPECIES_CACTURNE
+ 0x0f, // SPECIES_SNORUNT
+ 0x0f, // SPECIES_GLALIE
+ 0x13, // SPECIES_LUNATONE
+ 0x13, // SPECIES_SOLROCK
+ 0x10, // SPECIES_AZURILL
+ 0x10, // SPECIES_SPOINK
+ 0x14, // SPECIES_GRUMPIG
+ 0x12, // SPECIES_PLUSLE
+ 0x12, // SPECIES_MINUN
+ 0x09, // SPECIES_MAWILE
+ 0x14, // SPECIES_MEDITITE
+ 0x14, // SPECIES_MEDICHAM
+ 0x11, // SPECIES_SWABLU
+ 0x11, // SPECIES_ALTARIA
+ 0x12, // SPECIES_WYNAUT
+ 0x01, // SPECIES_DUSKULL
+ 0x01, // SPECIES_DUSCLOPS
+ 0x18, // SPECIES_ROSELIA
+ 0x02, // SPECIES_SLAKOTH
+ 0x10, // SPECIES_VIGOROTH
+ 0x08, // SPECIES_SLAKING
+ 0x0b, // SPECIES_GULPIN
+ 0x0b, // SPECIES_SWALOT
+ 0x0e, // SPECIES_TROPIUS
+ 0x13, // SPECIES_WHISMUR
+ 0x09, // SPECIES_LOUDRED
+ 0x0d, // SPECIES_EXPLOUD
+ 0x13, // SPECIES_CLAMPERL
+ 0x11, // SPECIES_HUNTAIL
+ 0x11, // SPECIES_GOREBYSS
+ 0x14, // SPECIES_ABSOL
+ 0x01, // SPECIES_SHUPPET
+ 0x01, // SPECIES_BANETTE
+ 0x0b, // SPECIES_SEVIPER
+ 0x15, // SPECIES_ZANGOOSE
+ 0x02, // SPECIES_RELICANTH
+ 0x15, // SPECIES_ARON
+ 0x09, // SPECIES_LAIRON
+ 0x0e, // SPECIES_AGGRON
+ 0x11, // SPECIES_CASTFORM
+ 0x11, // SPECIES_VOLBEAT
+ 0x11, // SPECIES_ILLUMISE
+ 0x0c, // SPECIES_LILEEP
+ 0x0b, // SPECIES_CRADILY
+ 0x0f, // SPECIES_ANORITH
+ 0x09, // SPECIES_ARMALDO
+ 0x14, // SPECIES_RALTS
+ 0x14, // SPECIES_KIRLIA
+ 0x14, // SPECIES_GARDEVOIR
+ 0x09, // SPECIES_BAGON
+ 0x09, // SPECIES_SHELGON
+ 0x08, // SPECIES_SALAMENCE
+ 0x0f, // SPECIES_BELDUM
+ 0x15, // SPECIES_METANG
+ 0x09, // SPECIES_METAGROSS
+ 0x09, // SPECIES_REGIROCK
+ 0x09, // SPECIES_REGICE
+ 0x09, // SPECIES_REGISTEEL
+ 0x19, // SPECIES_KYOGRE
+ 0x17, // SPECIES_GROUDON
+ 0x0d, // SPECIES_RAYQUAZA
+ 0x01, // SPECIES_LATIAS
+ 0x01, // SPECIES_LATIOS
+ 0x11, // SPECIES_JIRACHI
+ 0x14, // SPECIES_DEOXYS
+ 0x11, // SPECIES_CHIMECHO
+};
+
+static const u8 sUnknown_0860AA64[][2] =
+{
+ {0, 5},
+ {1, 1},
+ {0, 15},
+ {1, 4},
+ {0, 2},
+ {1, 2},
+ {0, 2},
+ {1, 2},
+ {0, 2},
+ {1, 2},
+ {0, 2},
+ {1, 2},
+ {0, 2},
+ {0, 0xFF}
+};
+
+static const u8 sUnknown_0860AA80[][2] =
+{
+ {6, 30},
+ {0xFE, 15},
+ {6, 30},
+ {0xFF, 0}
+};
+
+static void (* const sMonAnimFunctions[])(struct Sprite *sprite) =
+{
+ pokemonanimfunc_00,
+ pokemonanimfunc_01,
+ pokemonanimfunc_02,
+ pokemonanimfunc_03,
+ pokemonanimfunc_04,
+ pokemonanimfunc_05,
+ pokemonanimfunc_06,
+ pokemonanimfunc_07,
+ pokemonanimfunc_08,
+ pokemonanimfunc_09,
+ pokemonanimfunc_0A,
+ pokemonanimfunc_0B,
+ pokemonanimfunc_0C,
+ pokemonanimfunc_0D,
+ pokemonanimfunc_0E,
+ pokemonanimfunc_0F,
+ pokemonanimfunc_10,
+ pokemonanimfunc_11,
+ pokemonanimfunc_12,
+ pokemonanimfunc_13,
+ pokemonanimfunc_14,
+ pokemonanimfunc_15,
+ pokemonanimfunc_16,
+ pokemonanimfunc_17,
+ pokemonanimfunc_18,
+ pokemonanimfunc_19,
+ pokemonanimfunc_1A,
+ pokemonanimfunc_1B,
+ pokemonanimfunc_1C,
+ pokemonanimfunc_1D,
+ pokemonanimfunc_1E,
+ pokemonanimfunc_1F,
+ pokemonanimfunc_20,
+ pokemonanimfunc_21,
+ pokemonanimfunc_22,
+ pokemonanimfunc_23,
+ pokemonanimfunc_24,
+ pokemonanimfunc_25,
+ pokemonanimfunc_26,
+ pokemonanimfunc_27,
+ pokemonanimfunc_28,
+ pokemonanimfunc_29,
+ pokemonanimfunc_2A,
+ pokemonanimfunc_2B,
+ pokemonanimfunc_2C,
+ pokemonanimfunc_2D,
+ pokemonanimfunc_2E,
+ pokemonanimfunc_2F,
+ pokemonanimfunc_30,
+ pokemonanimfunc_31,
+ pokemonanimfunc_32,
+ pokemonanimfunc_33,
+ pokemonanimfunc_34,
+ pokemonanimfunc_35,
+ pokemonanimfunc_36,
+ pokemonanimfunc_37,
+ pokemonanimfunc_38,
+ pokemonanimfunc_39,
+ pokemonanimfunc_3A,
+ pokemonanimfunc_3B,
+ pokemonanimfunc_3C,
+ pokemonanimfunc_3D,
+ pokemonanimfunc_3E,
+ pokemonanimfunc_3F,
+ pokemonanimfunc_40,
+ pokemonanimfunc_41,
+ pokemonanimfunc_42,
+ pokemonanimfunc_43,
+ pokemonanimfunc_44,
+ pokemonanimfunc_45,
+ pokemonanimfunc_46,
+ pokemonanimfunc_47,
+ pokemonanimfunc_48,
+ pokemonanimfunc_49,
+ pokemonanimfunc_4A,
+ pokemonanimfunc_4B,
+ pokemonanimfunc_4C,
+ pokemonanimfunc_4D,
+ pokemonanimfunc_4E,
+ pokemonanimfunc_4F,
+ pokemonanimfunc_50,
+ pokemonanimfunc_51,
+ pokemonanimfunc_52,
+ pokemonanimfunc_53,
+ pokemonanimfunc_54,
+ pokemonanimfunc_55,
+ pokemonanimfunc_56,
+ pokemonanimfunc_57,
+ pokemonanimfunc_58,
+ pokemonanimfunc_59,
+ pokemonanimfunc_5A,
+ pokemonanimfunc_5B,
+ pokemonanimfunc_5C,
+ pokemonanimfunc_5D,
+ pokemonanimfunc_5E,
+ pokemonanimfunc_5F,
+ pokemonanimfunc_60,
+ pokemonanimfunc_61,
+ pokemonanimfunc_62,
+ pokemonanimfunc_63,
+ pokemonanimfunc_64,
+ pokemonanimfunc_65,
+ pokemonanimfunc_66,
+ pokemonanimfunc_67,
+ pokemonanimfunc_68,
+ pokemonanimfunc_69,
+ pokemonanimfunc_6A,
+ pokemonanimfunc_6B,
+ pokemonanimfunc_6C,
+ pokemonanimfunc_6D,
+ pokemonanimfunc_6E,
+ pokemonanimfunc_6F,
+ pokemonanimfunc_70,
+ pokemonanimfunc_71,
+ pokemonanimfunc_72,
+ pokemonanimfunc_73,
+ pokemonanimfunc_74,
+ pokemonanimfunc_75,
+ pokemonanimfunc_76,
+ pokemonanimfunc_77,
+ pokemonanimfunc_78,
+ pokemonanimfunc_79,
+ pokemonanimfunc_7A,
+ pokemonanimfunc_7B,
+ pokemonanimfunc_7C,
+ pokemonanimfunc_7D,
+ pokemonanimfunc_7E,
+ pokemonanimfunc_7F,
+ pokemonanimfunc_80,
+ pokemonanimfunc_81,
+ pokemonanimfunc_82,
+ pokemonanimfunc_83,
+ pokemonanimfunc_84,
+ pokemonanimfunc_85,
+ pokemonanimfunc_86,
+ pokemonanimfunc_87,
+ pokemonanimfunc_88,
+ pokemonanimfunc_89,
+ pokemonanimfunc_8A,
+ pokemonanimfunc_8B,
+ pokemonanimfunc_8C,
+ pokemonanimfunc_8D,
+ pokemonanimfunc_8E,
+ pokemonanimfunc_8F,
+ pokemonanimfunc_90,
+ pokemonanimfunc_91,
+ pokemonanimfunc_92,
+ pokemonanimfunc_93,
+ pokemonanimfunc_94,
+ pokemonanimfunc_95,
+ pokemonanimfunc_96
+};
+
+// counting from Id 1, because 0 in sSpeciesToBackAnimSet is used for mons with no back animation
+static const u8 sBackAnimationIds[] =
+{
+ 0x60, 0x5f, 0x02, // 1
+ 0x5e, 0x03, 0x46, // 2
+ 0x6d, 0x3e, 0x6e, // 3
+ 0x6f, 0x70, 0x3f, // 4
+ 0x71, 0x13, 0x72, // 5
+ 0x6c, 0x6b, 0x3a, // 6
+ 0x64, 0x14, 0x4f, // 7
+ 0x5d, 0x0f, 0x4c, // 8
+ 0x61, 0x57, 0x58, // 9
+ 0x67, 0x66, 0x59, // 0xA
+ 0x74, 0x73, 0x5a, // 0xB
+ 0x75, 0x76, 0x5b, // 0xC
+ 0x77, 0x78, 0x65, // 0xD
+ 0x63, 0x5c, 0x62, // 0xE
+ 0x6a, 0x69, 0x68, // 0xF
+ 0x7b, 0x7a, 0x79, // 0x10
+ 0x7e, 0x7d, 0x7c, // 0x11
+ 0x81, 0x80, 0x7f, // 0x12
+ 0x84, 0x82, 0x83, // 0x13
+ 0x85, 0x86, 0x87, // 0x14
+ 0x88, 0x89, 0x8a, // 0x15
+ 0x8b, 0x8c, 0x8d, // 0x16
+ 0x8e, 0x8f, 0x90, // 0x17
+ 0x91, 0x92, 0x93, // 0x18
+ 0x94, 0x95, 0x96, // 0x19
+};
+
+static const u8 sBackAnimNatureModTable[] =
+{
+ 0x00, // NATURE_HARDY
+ 0x02, // NATURE_LONELY
+ 0x00, // NATURE_BRAVE
+ 0x00, // NATURE_ADAMANT
+ 0x00, // NATURE_NAUGHTY
+ 0x01, // NATURE_BOLD
+ 0x01, // NATURE_DOCILE
+ 0x01, // NATURE_RELAXED
+ 0x00, // NATURE_IMPISH
+ 0x01, // NATURE_LAX
+ 0x02, // NATURE_TIMID
+ 0x00, // NATURE_HASTY
+ 0x01, // NATURE_SERIOUS
+ 0x00, // NATURE_JOLLY
+ 0x00, // NATURE_NAIVE
+ 0x02, // NATURE_MODEST
+ 0x02, // NATURE_MILD
+ 0x02, // NATURE_QUIET
+ 0x02, // NATURE_BASHFUL
+ 0x01, // NATURE_RASH
+ 0x01, // NATURE_CALM
+ 0x02, // NATURE_GENTLE
+ 0x01, // NATURE_SASSY
+ 0x02, // NATURE_CAREFUL
+ 0x01, // NATURE_QUIRKY
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_860AD48[] =
+{
+ AFFINEANIMCMD_FRAME(256, 256, 0, 0),
+ AFFINEANIMCMDTYPE_END
+};
+
+static const union AffineAnimCmd sSpriteAffineAnim_860AD58[] =
+{
+ AFFINEANIMCMD_FRAME(-256, 256, 0, 0),
+ AFFINEANIMCMDTYPE_END
+};
+
+static const union AffineAnimCmd *const sSpriteAffineAnimTable_860AD68[] =
+{
+ sSpriteAffineAnim_860AD48,
+ sSpriteAffineAnim_860AD58
+};
+
+// code
+static void MonAnimDummySpriteCallback(struct Sprite *sprite)
+{
+}
+
+static void sub_817F3F0(struct Sprite *sprite, u16 index, s16 amplitudeX, s16 amplitudeY)
+{
+ s16 xAdder, yAdder;
+
+ amplitudeX *= -1;
+ amplitudeY *= -1;
+
+ xAdder = Cos(index, amplitudeX) - Sin(index, amplitudeY);
+ yAdder = Cos(index, amplitudeY) + Sin(index, amplitudeX);
+
+ amplitudeX *= -1;
+ amplitudeY *= -1;
+
+ sprite->pos2.x = xAdder + amplitudeX;
+ sprite->pos2.y = yAdder + amplitudeY;
+}
+
+u8 GetSpeciesBackAnimSet(u16 species)
+{
+ if (sSpeciesToBackAnimSet[species] != 0)
+ return sSpeciesToBackAnimSet[species] - 1;
+ else
+ return 0;
+}
+
+#define tState data[0]
+#define tPtrLO data[1]
+#define tPtrHI data[2]
+#define tAnimId data[3]
+#define tSaved0 data[4]
+#define tSaved2 data[5]
+
+static void Task_HandleMonAnimation(u8 taskId)
+{
+ u32 i;
+ struct Sprite *sprite = (struct Sprite*)(u32)((gTasks[taskId].tPtrLO << 0x10) | (gTasks[taskId].tPtrHI));
+
+ if (gTasks[taskId].tState == 0)
+ {
+ gTasks[taskId].tSaved0 = sprite->data[0];
+ gTasks[taskId].tSaved2 = sprite->data[2];
+ sprite->data[1] = 1;
+ sprite->data[0] = 0;
+
+ for (i = 2; i < ARRAY_COUNT(sprite->data); i++)
+ sprite->data[i] = 0;
+
+ sprite->callback = sMonAnimFunctions[gTasks[taskId].tAnimId];
+ sUnknown_03001274 = FALSE;
+
+ gTasks[taskId].tState++;
+ }
+ if (sprite->callback == SpriteCallbackDummy)
+ {
+ sprite->data[0] = gTasks[taskId].tSaved0;
+ sprite->data[2] = gTasks[taskId].tSaved2;
+ sprite->data[1] = 0;
+
+ DestroyTask(taskId);
+ }
+}
+
+void LaunchAnimationTaskForFrontSprite(struct Sprite *sprite, u8 frontAnimId)
+{
+ u8 taskId = CreateTask(Task_HandleMonAnimation, 128);
+ gTasks[taskId].tPtrLO = (u32)(sprite) >> 0x10;
+ gTasks[taskId].tPtrHI = (u32)(sprite);
+ gTasks[taskId].tAnimId = frontAnimId;
+}
+
+void StartMonSummaryAnimation(struct Sprite *sprite, u8 frontAnimId)
+{
+ sUnknown_03001274 = TRUE;
+ sprite->callback = sMonAnimFunctions[frontAnimId];
+}
+
+void LaunchAnimationTaskForBackSprite(struct Sprite *sprite, u8 backAnimSet)
+{
+ u8 nature, taskId, animId, bank;
+
+ taskId = CreateTask(Task_HandleMonAnimation, 128);
+ gTasks[taskId].tPtrLO = (u32)(sprite) >> 0x10;
+ gTasks[taskId].tPtrHI = (u32)(sprite);
+
+ bank = sprite->data[0];
+ nature = GetNature(&gPlayerParty[gBattlePartyID[bank]]);
+
+ animId = 3 * backAnimSet + sBackAnimNatureModTable[nature];
+ gTasks[taskId].tAnimId = sBackAnimationIds[animId];
+}
+
+#undef tState
+#undef tPtrLO
+#undef tPtrHI
+#undef tAnimId
+#undef tSaved0
+#undef tSaved2
+
+void SetSpriteCB_MonAnimDummy(struct Sprite *sprite)
+{
+ sprite->callback = MonAnimDummySpriteCallback;
+}
+
+static void SetAffineData(struct Sprite *sprite, s16 xScale, s16 yScale, u16 rotation)
+{
+ u8 matrixNum;
+ struct ObjAffineSrcData affineSrcData;
+ struct OamMatrix dest;
+
+ affineSrcData.xScale = xScale;
+ affineSrcData.yScale = yScale;
+ affineSrcData.rotation = rotation;
+
+ matrixNum = sprite->oam.matrixNum;
+
+ ObjAffineSet(&affineSrcData, &dest, 1, 2);
+ gOamMatrices[matrixNum].a = dest.a;
+ gOamMatrices[matrixNum].b = dest.b;
+ gOamMatrices[matrixNum].c = dest.c;
+ gOamMatrices[matrixNum].d = dest.d;
+}
+
+static void HandleStartAffineAnim(struct Sprite *sprite)
+{
+ sprite->oam.affineMode = 3;
+ sprite->affineAnims = sSpriteAffineAnimTable_860AD68;
+
+ if (sUnknown_03001274 == TRUE)
+ InitSpriteAffineAnim(sprite);
+
+ if (!sprite->data[1])
+ StartSpriteAffineAnim(sprite, 1);
+ else
+ StartSpriteAffineAnim(sprite, 0);
+
+ CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode);
+ sprite->affineAnimPaused = 1;
+}
+
+static void HandleSetAffineData(struct Sprite *sprite, s16 xScale, s16 yScale, u16 rotation)
+{
+ if (!sprite->data[1])
+ {
+ xScale *= -1;
+ rotation *= -1;
+ }
+
+ SetAffineData(sprite, xScale, yScale, rotation);
+}
+
+static void sub_817F70C(struct Sprite *sprite)
+{
+ if (!sprite->data[1])
+ sprite->pos2.x *= -1;
+}
+
+static bool32 sub_817F724(u8 id)
+{
+ if (id >= STRUCT_COUNT)
+ {
+ return FALSE;
+ }
+ else
+ {
+ sUnknown_03001240[id].field_6 = 0;
+ sUnknown_03001240[id].field_0 = 0;
+ sUnknown_03001240[id].field_4 = 1;
+ sUnknown_03001240[id].field_2 = 0;
+ sUnknown_03001240[id].field_8 = 0;
+ return TRUE;
+ }
+}
+
+static u8 sub_817F758(void)
+{
+ sUnknown_03001270 = (sUnknown_03001270 + 1) % STRUCT_COUNT;
+ sub_817F724(sUnknown_03001270);
+ return sUnknown_03001270;
+}
+
+static void sub_817F77C(struct Sprite *sprite)
+{
+ sprite->oam.affineMode = 1;
+ CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode);
+
+ if (sUnknown_03001274 == TRUE)
+ {
+ if (!sprite->data[1])
+ sprite->hFlip = 1;
+ else
+ sprite->hFlip = 0;
+
+ FreeOamMatrix(sprite->oam.matrixNum);
+ sprite->oam.matrixNum |= (sprite->hFlip << 3);
+ sprite->oam.affineMode = 0;
+ }
+}
+
+static void pokemonanimfunc_01(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ HandleStartAffineAnim(sprite);
+
+ if (sprite->data[2] > 40)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ s16 var = (sprite->data[2] * 512 / 40) % 256;
+
+ sprite->data[4] = Sin(var, 32) + 256;
+ sprite->data[5] = Cos(var, 32) + 256;
+ HandleSetAffineData(sprite, sprite->data[4], sprite->data[5], 0);
+ }
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_02(struct Sprite *sprite)
+{
+ if (sprite->data[2] > 40)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.x = 0;
+ }
+ else
+ {
+ s8 sign;
+ if (!(sprite->data[2] & 1))
+ sign = 1;
+ else
+ sign = -1;
+
+ sprite->pos2.x = Sin((sprite->data[2] * 128 / 40) % 256, 6) * sign;
+ }
+
+ sprite->data[2]++;
+}
+
+static void sub_817F8FC(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+
+ if (sprite->data[2] > sprite->data[0])
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.x = 0;
+ }
+ else
+ {
+ sprite->pos2.x = Sin((sprite->data[2] * 384 / sprite->data[0]) % 256, 6);
+ }
+
+ sprite->data[2]++;
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_03(struct Sprite *sprite)
+{
+ sprite->data[0] = 40;
+ sub_817F8FC(sprite);
+ sprite->callback = sub_817F8FC;
+}
+
+static void sub_817F978(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+
+ if (sprite->data[2] > sprite->data[0])
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.y = 0;
+ }
+ else
+ {
+ sprite->pos2.y = -(Sin((sprite->data[2] * 384 / sprite->data[0]) % 256, 6));
+ }
+
+ sprite->data[2]++;
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_04(struct Sprite *sprite)
+{
+ sprite->data[0] = 40;
+ sub_817F978(sprite);
+ sprite->callback = sub_817F978;
+}
+
+#ifdef NONMATCHING
+static void sub_817F9F4(struct Sprite *sprite)
+{
+ s32 counter = sprite->data[2];
+
+ if (counter > 384)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ }
+ else
+ {
+ s32 divCounter = counter / 128;
+
+ switch (divCounter)
+ {
+ case 0:
+ case 1:
+ sprite->pos2.y = -(Sin(counter % 128, sprite->data[0] * 2));
+ break;
+ case 2:
+ case 3:
+ sprite->pos2.y = -(Sin(counter - 256, sprite->data[0] * 3));
+ break;
+ }
+ }
+
+ sprite->data[2] += 12;
+}
+
+#else
+__attribute__((naked))
+static void sub_817F9F4(struct Sprite *sprite)
+{
+ asm(".syntax unified\n\
+ push {r4,lr}\n\
+ adds r4, r0, 0\n\
+ movs r0, 0x32\n\
+ ldrsh r1, [r4, r0]\n\
+ movs r0, 0xC0\n\
+ lsls r0, 1\n\
+ cmp r1, r0\n\
+ ble _0817FA14\n\
+ ldr r0, =SpriteCB_SetDummyOnAnimEnd\n\
+ str r0, [r4, 0x1C]\n\
+ movs r0, 0\n\
+ strh r0, [r4, 0x24]\n\
+ b _0817FA5E\n\
+ .pool\n\
+_0817FA14:\n\
+ adds r0, r1, 0\n\
+ cmp r1, 0\n\
+ bge _0817FA1C\n\
+ adds r0, 0x7F\n\
+_0817FA1C:\n\
+ asrs r2, r0, 7\n\
+ lsls r0, r2, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0\n\
+ blt _0817FA60\n\
+ cmp r0, 0x1\n\
+ ble _0817FA48\n\
+ cmp r0, 0x3\n\
+ bgt _0817FA60\n\
+ ldr r2, =0xffffff00\n\
+ adds r1, r2\n\
+ lsls r0, r1, 16\n\
+ asrs r0, 16\n\
+ movs r1, 0x2E\n\
+ ldrsh r2, [r4, r1]\n\
+ lsls r1, r2, 1\n\
+ adds r1, r2\n\
+ lsls r1, 16\n\
+ b _0817FA56\n\
+ .pool\n\
+_0817FA48:\n\
+ lsls r0, r2, 7\n\
+ subs r0, r1, r0\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ movs r2, 0x2E\n\
+ ldrsh r1, [r4, r2]\n\
+ lsls r1, 17\n\
+_0817FA56:\n\
+ asrs r1, 16\n\
+ bl Sin\n\
+ negs r0, r0\n\
+_0817FA5E:\n\
+ strh r0, [r4, 0x26]\n\
+_0817FA60:\n\
+ ldrh r0, [r4, 0x32]\n\
+ adds r0, 0xC\n\
+ strh r0, [r4, 0x32]\n\
+ pop {r4}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .syntax divided");
+}
+
+#endif // NONMATCHING
+
+static void pokemonanimfunc_1E(struct Sprite *sprite)
+{
+ sprite->data[0] = 4;
+ sub_817F9F4(sprite);
+ sprite->callback = sub_817F9F4;
+}
+
+static void pokemonanimfunc_06(struct Sprite *sprite)
+{
+ s32 counter = sprite->data[2];
+
+ if (counter > 768)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ }
+ else
+ {
+ s16 divCounter = counter / 128;
+
+ switch (divCounter)
+ {
+ case 0:
+ case 1:
+ sprite->pos2.x = 0;
+ break;
+ case 2:
+ counter = 0;
+ break;
+ case 3:
+ sprite->pos2.x = -(counter % 128 * 8) / 128;
+ break;
+ case 4:
+ sprite->pos2.x = (counter % 128) / 8 - 8;
+ break;
+ case 5:
+ sprite->pos2.x = -(counter % 128 * 8) / 128 + 8;
+ break;
+ }
+
+ sprite->pos2.y = -(Sin(counter % 128, 8));
+ }
+
+ sprite->data[2] += 12;
+}
+
+static void pokemonanimfunc_09(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ HandleStartAffineAnim(sprite);
+
+ if (sprite->data[2] > 40)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ s16 index = (sprite->data[2] * 256 / 40) % 256;
+
+ if (sprite->data[2] % 2 == 0)
+ {
+ sprite->data[4] = Sin(index, 32) + 256;
+ sprite->data[5] = Sin(index, 32) + 256;
+ }
+ else
+ {
+ sprite->data[4] = Sin(index, 8) + 256;
+ sprite->data[5] = Sin(index, 8) + 256;
+ }
+
+ HandleSetAffineData(sprite, sprite->data[4], sprite->data[5], 0);
+ }
+
+ sprite->data[2]++;
+}
+
+static const s8 sUnknown_0860AD70[][3] =
+{
+ {-1, -1, 6},
+ {2, 0, 6},
+ {-2, 2, 6},
+ {2, 0, 6},
+ {-2, -2, 6},
+ {2, 0, 6},
+ {-2, 2, 6},
+ {2, 0, 6},
+ {-1, -1, 6},
+ {0, 0, 0},
+};
+
+static void sub_817FC20(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+
+ if (sprite->data[2] == 0)
+ sprite->data[3] = 0;
+
+ if (sUnknown_0860AD70[sprite->data[3]][2] == sprite->data[2])
+ {
+ if (sUnknown_0860AD70[sprite->data[3]][2] == 0)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[3]++;
+ sprite->data[2] = 0;
+ }
+ }
+
+ if (sUnknown_0860AD70[sprite->data[3]][2] == 0)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->pos2.x += sUnknown_0860AD70[sprite->data[3]][0];
+ sprite->pos2.y += sUnknown_0860AD70[sprite->data[3]][1];
+ sprite->data[2]++;
+ sub_817F70C(sprite);
+ }
+}
+
+static void pokemonanimfunc_0A(struct Sprite *sprite)
+{
+ sub_817FC20(sprite);
+ sprite->callback = sub_817FC20;
+}
+
+static void sub_817FCDC(struct Sprite *sprite)
+{
+ s32 counter = sprite->data[2];
+
+ if (counter > 2304)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.x = 0;
+ }
+ else
+ {
+ sprite->pos2.x = Sin(counter % 256, sprite->data[7]);
+ }
+
+ sprite->data[2] += sprite->data[0];
+}
+
+static void pokemonanimfunc_0F(struct Sprite *sprite)
+{
+ sprite->data[0] = 60;
+ sprite->data[7] = 3;
+ sub_817FCDC(sprite);
+ sprite->callback = sub_817FCDC;
+}
+
+static void sub_817FD44(struct Sprite *sprite)
+{
+ s32 counter = sprite->data[2];
+
+ if (counter > 2304)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.y = 0;
+ }
+ else
+ {
+ sprite->pos2.y = Sin(counter % 256, 3);
+ }
+
+ sprite->data[2] += sprite->data[0];
+}
+
+static void pokemonanimfunc_10(struct Sprite *sprite)
+{
+ sprite->data[0] = 60;
+ sub_817FD44(sprite);
+ sprite->callback = sub_817FD44;
+}
+
+static void pokemonanimfunc_11(struct Sprite *sprite)
+{
+ if (sprite->data[2] > 512)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ }
+ else
+ {
+ s8 sign;
+ s32 index, amplitude;
+
+ if (!(sprite->data[2] & 1))
+ sign = 1;
+ else
+ sign = -1;
+
+ amplitude = Sin(sprite->data[2] / 4, 8);
+ index = sprite->data[2] % 256;
+
+ sprite->pos2.y = Sin(index, amplitude) * sign;
+ sprite->pos2.x = Cos(index, amplitude) * sign;
+ }
+
+ sprite->data[2] += 9;
+}
+
+static void sub_817FE30(struct Sprite *sprite)
+{
+ s16 id = sprite->data[0];
+
+ if (sUnknown_03001240[id].field_0 != 0)
+ {
+ sUnknown_03001240[id].field_0--;
+ }
+ else
+ {
+ if (sprite->data[2] == 0 && sUnknown_03001240[id].field_8 == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sUnknown_03001240[id].field_8++;
+ }
+
+ if (sprite->data[2] > sUnknown_03001240[id].field_6)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+
+ if (sUnknown_03001240[id].field_4 > 1)
+ {
+ sUnknown_03001240[id].field_4--;
+ sUnknown_03001240[id].field_0 = 10;
+ sprite->data[2] = 0;
+ }
+ else
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ }
+ else
+ {
+ sprite->data[6] = Sin(sprite->data[2] % 256, 4096);
+ HandleSetAffineData(sprite, 256, 256, sprite->data[6]);
+ }
+
+ sprite->data[2] += 16;
+ }
+}
+
+static void pokemonanimfunc_12(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_6 = 512;
+ sUnknown_03001240[id].field_0 = 0;
+ sub_817FE30(sprite);
+ sprite->callback = sub_817FE30;
+}
+
+static void sub_817FF3C(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0];
+
+ if (sprite->data[2] == 0)
+ HandleStartAffineAnim(sprite);
+
+ if (sprite->data[2] > sUnknown_03001240[id].field_0)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[6] = (65536 / sUnknown_03001240[id].field_8) * sprite->data[2];
+ HandleSetAffineData(sprite, 256, 256, sprite->data[6]);
+ }
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_1F(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_0 = 60;
+ sUnknown_03001240[id].field_8 = 20;
+ sub_817FF3C(sprite);
+ sprite->callback = sub_817FF3C;
+}
+
+static void sub_817FFF0(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0];
+
+ sub_817F70C(sprite);
+
+ if (sprite->data[2] > sUnknown_03001240[id].field_6)
+ {
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ s16 index = (sprite->data[2] + 192) % 256;
+
+ sprite->pos2.x = -(Cos(index, sUnknown_03001240[id].field_8 * 2));
+ sprite->pos2.y = Sin(index, sUnknown_03001240[id].field_8) + sUnknown_03001240[id].field_8;
+ }
+
+ sprite->data[2] += sUnknown_03001240[id].field_2;
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_14(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_6 = 512;
+ sUnknown_03001240[id].field_8 = 6;
+ sUnknown_03001240[id].field_2 = 24;
+ sub_817FFF0(sprite);
+ sprite->callback = sub_817FFF0;
+}
+
+static void pokemonanimfunc_15(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+
+ if (sprite->data[2] > 128)
+ {
+ BlendPalette(sprite->data[7], 0x10, 0, RGB_BLACK);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[6] = Sin(sprite->data[2], 16);
+ BlendPalette(sprite->data[7], 0x10, sprite->data[6], RGB_BLACK);
+ }
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_16(struct Sprite *sprite)
+{
+ s16 index1 = 0, index2 = 0;
+
+ if (sprite->data[2] == 0)
+ HandleStartAffineAnim(sprite);
+
+ if (sprite->data[2] > 40)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ index2 = (sprite->data[2] * 128) / 40;
+
+ if (sprite->data[2] >= 10 && sprite->data[2] <= 29)
+ {
+ sprite->data[7] += 51;
+ index1 = 0xFF & sprite->data[7];
+ }
+
+ if (sprite->data[1] == 0)
+ sprite->data[4] = (Sin(index2, 40) - 256) + Sin(index1, 16);
+ else
+ sprite->data[4] = (256 - Sin(index2, 40)) - Sin(index1, 16);
+
+ sprite->data[5] = Sin(index2, 16) + 256;
+ SetAffineData(sprite, sprite->data[4], sprite->data[5], 0);
+ }
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_17(struct Sprite *sprite)
+{
+ s16 posY = 0, index1 = 0, index2 = 0;
+
+ if (sprite->data[2] == 0)
+ HandleStartAffineAnim(sprite);
+
+ if (sprite->data[2] > 40)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.y = posY;
+ }
+ else
+ {
+ index2 = (sprite->data[2] * 128) / 40;
+
+ if (sprite->data[2] >= 10 && sprite->data[2] <= 29)
+ {
+ sprite->data[7] += 51;
+ index1 = 0xFF & sprite->data[7];
+ }
+
+ if (sprite->data[1] == 0)
+ sprite->data[4] = -(Sin(index2, 16)) - 256;
+ else
+ sprite->data[4] = Sin(index2, 16) + 256;
+
+ sprite->data[5] = (256 - Sin(index2, 40)) - Sin(index1, 8);
+
+ if (sprite->data[5] != 256)
+ posY = (256 - sprite->data[5]) / 8;
+
+ sprite->pos2.y = -(posY);
+ SetAffineData(sprite, sprite->data[4], sprite->data[5], 0);
+ }
+
+ sprite->data[2]++;
+}
+
+static void sub_818031C(struct Sprite *sprite)
+{
+ u8 index = sprite->data[2];
+ u8 var7 = sprite->data[6];
+ u8 var5 = sUnknown_0860AA80[sprite->data[5]][0];
+ u8 var6 = sUnknown_0860AA80[sprite->data[5]][1];
+ u8 amplitude = 0;
+
+ if (var5 != 0xFE)
+ amplitude = (var6 - var7) * var5 / var6;
+ else
+ amplitude = 0;
+
+ if (var5 == 0xFF)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.y = 0;
+ }
+ else
+ {
+ sprite->pos2.y = Sin(index, amplitude);
+
+ if (var7 == var6)
+ {
+ sprite->data[5]++;
+ sprite->data[6] = 0;
+ }
+ else
+ {
+ sprite->data[2] += sprite->data[0];
+ sprite->data[6]++;
+ }
+ }
+}
+
+static void pokemonanimfunc_19(struct Sprite *sprite)
+{
+ sprite->data[0] = 48;
+ sub_818031C(sprite);
+ sprite->callback = sub_818031C;
+}
+
+static void pokemonanimfunc_1A(struct Sprite *sprite)
+{
+ u8 counter = 0;
+
+ sub_817F70C(sprite);
+ counter = sprite->data[2];
+
+ if (sprite->data[2] == 0)
+ HandleStartAffineAnim(sprite);
+
+ if (sprite->data[2] > 35)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.x = 0;
+ }
+ else
+ {
+ s16 index = ((counter - 10) * 128) / 20;
+
+ if (counter < 10)
+ HandleSetAffineData(sprite, 256, 256, counter / 2 * 512);
+ else if (counter >= 10 && counter <= 29)
+ sprite->pos2.x = -(Sin(index, 5));
+ else
+ HandleSetAffineData(sprite, 256, 256, (35 - counter) / 2 * 1024);
+ }
+
+ sprite->data[2]++;
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_1B(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ HandleStartAffineAnim(sprite);
+
+ if (sprite->data[2] > 100)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->pos2.y = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ s16 index = (sprite->data[2] * 256) / 100;
+ sprite->pos2.y = Sin(index, 10);
+ HandleSetAffineData(sprite, 256, 256, Sin(index, 3276));
+ }
+
+ sprite->data[2]++;
+}
+
+static void sub_81804F8(struct Sprite *sprite)
+{
+ s32 var = 0;
+ s16 index = 0;
+
+ if (sprite->data[2] == 0)
+ HandleStartAffineAnim(sprite);
+
+ if (sprite->data[2] > 100)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->pos2.y = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ index = (sprite->data[2] * 256) / 100;
+ var = (sprite->data[2] * 512) / 100;
+ var &= 0xFF;
+ sprite->pos2.y = Sin(index, sprite->data[0]);
+ HandleSetAffineData(sprite, 256, 256, Sin(var, 3276));
+ }
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_1C(struct Sprite *sprite)
+{
+ sprite->data[0] = 10;
+ sub_81804F8(sprite);
+ sprite->callback = sub_81804F8;
+}
+
+static void sub_81805B0(struct Sprite *sprite)
+{
+ s32 var = 0;
+ s16 index = 0;
+
+ if (sprite->data[2] == 0)
+ HandleStartAffineAnim(sprite);
+
+ if (sprite->data[2] > 100)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->pos2.y = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ index = (sprite->data[2] * 256) / 100;
+ var = (sprite->data[2] * 512) / 100;
+ var &= 0xFF;
+ sprite->pos2.y = -(Sin(index / 2, sprite->data[0] * 2));
+ HandleSetAffineData(sprite, 256, 256, Sin(var, 3276));
+ }
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_18(struct Sprite *sprite)
+{
+ sprite->data[0] = 5;
+ sub_81805B0(sprite);
+ sprite->callback = sub_81805B0;
+}
+
+static void pokemonanimfunc_1D(struct Sprite *sprite)
+{
+ s32 var;
+ s16 index = 0;
+
+ sub_817F70C(sprite);
+ var = 0;
+
+ if (sprite->data[2] == 0)
+ HandleStartAffineAnim(sprite);
+
+ if (sprite->data[2] > 100)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->pos2.x = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ s16 toDiv = 100;
+
+ index = (sprite->data[2] * 256) / toDiv;
+ var = (sprite->data[2] * 512) / toDiv;
+ var &= 0xFF;
+ sprite->pos2.x = Sin(index, 8);
+ HandleSetAffineData(sprite, 256, 256, Sin(var, 3276));
+ }
+
+ sprite->data[2]++;
+ sub_817F70C(sprite);
+}
+
+static void sub_8180714(struct Sprite *sprite)
+{
+ s16 posY = 0;
+
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[3] = 0;
+ }
+
+ sub_817F70C(sprite);
+
+ if (sprite->data[2] > sprite->data[0] * 3)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->pos2.y = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ s16 yScale = Sin(sprite->data[4], 32) + 256;
+
+ if (sprite->data[2] > sprite->data[0] && sprite->data[2] < sprite->data[0] * 2)
+ sprite->data[3] += (128 / sprite->data[0]);
+ if (yScale > 256)
+ posY = (256 - yScale) / 8;
+
+ sprite->pos2.y = -(Sin(sprite->data[3], 10)) - posY;
+ HandleSetAffineData(sprite, 256 - Sin(sprite->data[4], 32), yScale, 0);
+ sprite->data[2]++;
+ sprite->data[4] = (sprite->data[4] + 128 / sprite->data[0]) & 0xFF;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_00(struct Sprite *sprite)
+{
+ sprite->data[0] = 16;
+ sub_8180714(sprite);
+ sprite->callback = sub_8180714;
+}
+
+static void sub_8180828(struct Sprite *sprite)
+{
+ s16 posY = 0;
+
+ if (sprite->data[2] > (128 / sprite->data[6]) * sprite->data[7])
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->pos2.y = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ s16 yScale = Sin(sprite->data[4], 32) + 256;
+
+ if (yScale > 256)
+ posY = (256 - yScale) / 8;
+
+ sprite->pos2.y = -(posY);
+ HandleSetAffineData(sprite, Sin(sprite->data[4], 48) + 256, yScale, 0);
+ sprite->data[2]++;
+ sprite->data[4] = (sprite->data[4] + sprite->data[6]) & 0xFF;
+ }
+}
+
+static void pokemonanimfunc_13(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[7] = 3;
+ sprite->data[6] = 8;
+ }
+
+ sub_8180828(sprite);
+}
+
+static const s8 sUnknown_0860AD8E[][8][3] =
+{
+ {
+ {0, 8, 8},
+ {8, -8, 12},
+ {-8, 8, 12},
+ {8, -8, 12},
+ {-8, 8, 12},
+ {8, -8, 12},
+ {-8, 0, 12},
+ {0, 0, 0}
+ },
+ {
+ {0, 8, 16},
+ {8, -8, 24},
+ {-8, 8, 24},
+ {8, -8, 24},
+ {-8, 8, 24},
+ {8, -8, 24},
+ {-8, 0, 24},
+ {0, 0, 0}
+ },
+};
+
+static void sub_8180900(struct Sprite *sprite)
+{
+ s16 var;
+ u8 structId;
+ s8 r9;
+ s16 r10;
+ s16 r7;
+ u32 arrId;
+
+ sub_817F70C(sprite);
+ structId = sprite->data[0];
+ var = sUnknown_03001240[structId].field_6;
+ r9 = sUnknown_0860AD8E[sUnknown_03001240[structId].field_8][sprite->data[4]][0];
+ r10 = sUnknown_0860AD8E[sUnknown_03001240[structId].field_8][sprite->data[4]][1] - r9;
+ arrId = sUnknown_03001240[structId].field_8;
+ r7 = sprite->data[3];
+
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ }
+
+ if (sUnknown_0860AD8E[arrId][sprite->data[4]][2] == 0)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ u16 rotation;
+
+ sprite->pos2.y = -(Sin(r7 * 128 / sUnknown_0860AD8E[arrId][sprite->data[4]][2], 10));
+ sprite->pos2.x = (r10 * r7 / sUnknown_0860AD8E[arrId][sprite->data[4]][2]) + r9;
+
+ rotation = -(var * sprite->pos2.x) / 8;
+ HandleSetAffineData(sprite, 256, 256, rotation);
+
+ if (r7 == sUnknown_0860AD8E[arrId][sprite->data[4]][2])
+ {
+ sprite->data[4]++;
+ sprite->data[3] = 0;
+ }
+ else
+ {
+ sprite->data[3]++;
+ }
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_05(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+ sUnknown_03001240[id].field_6 = 4096;
+ sUnknown_03001240[id].field_8 = sprite->data[6];
+ sub_8180900(sprite);
+ sprite->callback = sub_8180900;
+}
+
+static void pokemonanimfunc_20(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+
+ if (sprite->data[2] > 128)
+ {
+ BlendPalette(sprite->data[7], 0x10, 0, RGB(31, 22, 0));
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[6] = Sin(sprite->data[2], 12);
+ BlendPalette(sprite->data[7], 0x10, sprite->data[6], RGB(31, 22, 0));
+ }
+
+ sprite->data[2] += 2;
+}
+
+static void pokemonanimfunc_21(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+
+ if (sprite->data[2] > 128)
+ {
+ BlendPalette(sprite->data[7], 0x10, 0, RGB_RED);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[6] = Sin(sprite->data[2], 12);
+ BlendPalette(sprite->data[7], 0x10, sprite->data[6], RGB_RED);
+ }
+
+ sprite->data[2] += 2;
+}
+
+static void pokemonanimfunc_22(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+
+ if (sprite->data[2] > 128)
+ {
+ BlendPalette(sprite->data[7], 0x10, 0, RGB_BLUE);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[6] = Sin(sprite->data[2], 12);
+ BlendPalette(sprite->data[7], 0x10, sprite->data[6], RGB_BLUE);
+ }
+
+ sprite->data[2] += 2;
+}
+
+static void pokemonanimfunc_23(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+
+ if (sprite->data[2] > 128)
+ {
+ BlendPalette(sprite->data[7], 0x10, 0, RGB_YELLOW);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[6] = Sin(sprite->data[2], 12);
+ BlendPalette(sprite->data[7], 0x10, sprite->data[6], RGB_YELLOW);
+ }
+
+ sprite->data[2] += 2;
+}
+
+static void pokemonanimfunc_24(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+
+ if (sprite->data[2] > 128)
+ {
+ BlendPalette(sprite->data[7], 0x10, 0, RGB(24, 0, 24));
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[6] = Sin(sprite->data[2], 12);
+ BlendPalette(sprite->data[7], 0x10, sprite->data[6], RGB(24, 0, 24));
+ }
+
+ sprite->data[2] += 2;
+}
+
+static void sub_8180CB4(struct Sprite *sprite);
+static void sub_8180CE8(struct Sprite *sprite);
+static void sub_8180D44(struct Sprite *sprite);
+static void sub_8180DC0(struct Sprite *sprite);
+static void sub_8180E28(struct Sprite *sprite);
+
+static void pokemonanimfunc_25(struct Sprite *sprite)
+{
+ HandleStartAffineAnim(sprite);
+ sprite->callback = sub_8180CB4;
+}
+
+static void sub_8180CB4(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (++sprite->pos2.x > 7)
+ {
+ sprite->pos2.x = 8;
+ sprite->data[7] = 2;
+ sprite->callback = sub_8180CE8;
+ }
+ sub_817F70C(sprite);
+}
+
+static void sub_8180CE8(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+
+ sprite->pos2.x -= sprite->data[7];
+ sprite->data[7]++;
+ if (sprite->pos2.x <= 0)
+ {
+ s16 subResult;
+ u8 var = sprite->data[7];
+ sprite->data[6] = 0;
+ subResult = sprite->pos2.x;
+
+ do
+ {
+ subResult -= var;
+ sprite->data[6]++;
+ var++;
+ }
+ while (subResult > -8);
+
+ sprite->data[5] = 1;
+ sprite->callback = sub_8180D44;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8180D44(struct Sprite *sprite)
+{
+ u8 rotation;
+
+ sub_817F70C(sprite);
+ sprite->pos2.x -= sprite->data[7];
+ sprite->data[7]++;
+ rotation = (sprite->data[5] * 6) / sprite->data[6];
+
+ if (++sprite->data[5] > sprite->data[6])
+ sprite->data[5] = sprite->data[6];
+
+ HandleSetAffineData(sprite, 256, 256, rotation * 256);
+
+ if (sprite->pos2.x < -8)
+ {
+ sprite->pos2.x = -8;
+ sprite->data[4] = 2;
+ sprite->data[3] = 0;
+ sprite->data[2] = rotation;
+ sprite->callback = sub_8180DC0;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8180DC0(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+
+ if (sprite->data[3] > 11)
+ {
+ sprite->data[2] -= 2;
+ if (sprite->data[2] < 0)
+ sprite->data[2] = 0;
+
+ HandleSetAffineData(sprite, 256, 256, sprite->data[2] << 8);
+ if (sprite->data[2] == 0)
+ sprite->callback = sub_8180E28;
+ }
+ else
+ {
+ sprite->pos2.x += sprite->data[4];
+ sprite->data[4] *= -1;
+ sprite->data[3]++;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8180E28(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+
+ sprite->pos2.x += 2;
+ if (sprite->pos2.x > 0)
+ {
+ sprite->pos2.x = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8180E78(struct Sprite *sprite);
+static void sub_8180ED0(struct Sprite *sprite);
+static void sub_8180F2C(struct Sprite *sprite);
+
+static void pokemonanimfunc_26(struct Sprite *sprite)
+{
+ HandleStartAffineAnim(sprite);
+ sprite->data[3] = 0;
+ sprite->callback = sub_8180E78;
+}
+
+static void sub_8180E78(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->pos2.x++;
+ sprite->pos2.y--;
+
+ if (sprite->pos2.x % 2 == 0 && sprite->data[3] <= 0)
+ sprite->data[3] = 10;
+ if (sprite->pos2.x > 7)
+ {
+ sprite->pos2.x = 8;
+ sprite->pos2.y = -8;
+ sprite->data[4] = 0;
+ sprite->callback = sub_8180ED0;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8180ED0(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->pos2.x = Cos(sprite->data[4], 16) - 8;
+ sprite->pos2.y = Sin(sprite->data[4], 16) - 8;
+
+ if (sprite->data[4] > 63)
+ {
+ sprite->data[2] = 160;
+ sprite->data[3] = 10;
+ sprite->callback = sub_8180F2C;
+ }
+ sprite->data[4] += 8;
+ if (sprite->data[4] > 64)
+ sprite->data[4] = 64;
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8180F2C(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+
+ if (sprite->data[3] > 0)
+ {
+ sprite->data[3]--;
+ }
+ else
+ {
+ u32 rotation;
+
+ sprite->pos2.x = Cos(sprite->data[2], 5) - 4;
+ sprite->pos2.y = -(Sin(sprite->data[2], 5)) + 4;
+ sprite->data[2] -= 4;
+ rotation = sprite->data[2] - 32;
+ HandleSetAffineData(sprite, 256, 256, rotation * 512);
+
+ if (sprite->data[2] <= 32)
+ {
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_27(struct Sprite *sprite)
+{
+ if (sprite->data[3] > 0)
+ {
+ sprite->data[3]--;
+ }
+ else
+ {
+ sprite->data[4] = (sprite->data[4] == 0) ? 1 : 0;
+ sprite->invisible = sprite->data[4];
+ if (++sprite->data[2] > 19)
+ {
+ sprite->invisible = 0;
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ sprite->data[3] = 2;
+ }
+}
+
+static void sub_8181024(struct Sprite *sprite);
+static void sub_8181068(struct Sprite *sprite);
+static void sub_81810C4(struct Sprite *sprite);
+
+static void pokemonanimfunc_28(struct Sprite *sprite)
+{
+ HandleStartAffineAnim(sprite);
+ sprite->callback = sub_8181024;
+}
+
+static void sub_8181024(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->pos2.x--;
+ sprite->pos2.y++;
+
+ if (sprite->pos2.x <= -16)
+ {
+ sprite->pos2.x = -16;
+ sprite->pos2.y = 16;
+ sprite->callback = sub_8181068;
+ sprite->data[2] = 160;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8181068(struct Sprite *sprite)
+{
+ u32 rotation;
+
+ sub_817F70C(sprite);
+ sprite->data[2] -= 4;
+ sprite->pos2.x = Cos(sprite->data[2], 22);
+ sprite->pos2.y = -(Sin(sprite->data[2], 22));
+ rotation = sprite->data[2] - 32;
+ HandleSetAffineData(sprite, 256, 256, rotation * 512);
+
+ if (sprite->data[2] <= 32)
+ sprite->callback = sub_81810C4;
+
+ sub_817F70C(sprite);
+}
+
+static void sub_81810C4(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->pos2.x--;
+ sprite->pos2.y++;
+
+ if (sprite->pos2.x <= 0)
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8181110(struct Sprite *sprite);
+static void sub_8181144(struct Sprite *sprite);
+static void sub_81811A4(struct Sprite *sprite);
+
+static void pokemonanimfunc_29(struct Sprite *sprite)
+{
+ HandleStartAffineAnim(sprite);
+ sprite->callback = sub_8181110;
+}
+
+static void sub_8181110(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->pos2.x++;
+ sprite->pos2.y--;
+
+ if (sprite->pos2.x > 15)
+ {
+ sprite->data[2] = 0;
+ sprite->callback = sub_8181144;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8181144(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->data[2] += 16;
+
+ if (sprite->pos2.x <= -16)
+ {
+ sprite->pos2.x = -16;
+ sprite->pos2.y = 16;
+ sprite->data[2] = 0;
+ sprite->callback = sub_81811A4;
+ }
+ else
+ {
+ sprite->pos2.x -= 2;
+ sprite->pos2.y += 2;
+ }
+
+ HandleSetAffineData(sprite, 256, 256, sprite->data[2] << 8);
+ sub_817F70C(sprite);
+}
+
+static void sub_81811A4(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->pos2.x++;
+ sprite->pos2.y--;;
+
+ if (sprite->pos2.x >= 0)
+ {
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8181214(struct Sprite *sprite);
+
+static void pokemonanimfunc_2A(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+ sUnknown_03001240[id].field_2 = 2;
+ sub_8181214(sprite);
+ sprite->callback = sub_8181214;
+}
+
+static void sub_8181214(struct Sprite *sprite)
+{
+ if (sUnknown_03001240[sprite->data[0]].field_0 != 0)
+ {
+ sUnknown_03001240[sprite->data[0]].field_0--;
+ }
+ else
+ {
+ sub_817F70C(sprite);
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2]++;
+ HandleStartAffineAnim(sprite);
+ sprite->data[7] = sUnknown_03001240[sprite->data[0]].field_2;
+ sprite->data[3] = -1;
+ sprite->data[4] = -1;
+ sprite->data[5] = 0;
+ sprite->data[6] = 0;
+ }
+
+ sprite->pos2.x += (sprite->data[7] * 2 * sprite->data[3]);
+ sprite->pos2.y += (sprite->data[7] * sprite->data[4]);
+ sprite->data[6] += 8;
+ if (sprite->pos2.x <= -16 || sprite->pos2.x >= 16)
+ {
+ sprite->pos2.x = sprite->data[3] * 16;
+ sprite->data[3] *= -1;
+ sprite->data[5]++;
+ }
+ else if (sprite->pos2.y <= -16 || sprite->pos2.y >= 16)
+ {
+ sprite->pos2.y = sprite->data[4] * 16;
+ sprite->data[4] *= -1;
+ sprite->data[5]++;
+ }
+
+ if (sprite->data[5] > 5 && sprite->pos2.x <= 0)
+ {
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ if (sUnknown_03001240[sprite->data[0]].field_4 > 1)
+ {
+ sUnknown_03001240[sprite->data[0]].field_4--;
+ sprite->data[5] = 0;
+ sprite->data[6] = 0;
+ sUnknown_03001240[sprite->data[0]].field_0 = 10;
+ }
+ else
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ }
+
+ HandleSetAffineData(sprite, 256, 256, sprite->data[6] << 8);
+ sub_817F70C(sprite);
+ }
+}
+
+static void sub_8181370(struct Sprite *sprite);
+
+static void pokemonanimfunc_2B(struct Sprite *sprite)
+{
+ HandleStartAffineAnim(sprite);
+ sprite->data[6] = 0;
+ sprite->data[7] = 0;
+ sprite->callback = sub_8181370;
+}
+
+static void sub_8181370(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->data[6] += 4;
+ sprite->pos2.x = -(Sin(sprite->data[6], 16));
+ sprite->pos2.y = -(Sin((sprite->data[6] * 2) & 0xFF, 8));
+ if (sprite->data[6] > 192 && sprite->data[7] == 1)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->data[7]++;
+ }
+ else if (sprite->data[6] > 64 && sprite->data[7] == 0)
+ {
+ HandleSetAffineData(sprite, -256, 256, 0);
+ sprite->data[7]++;
+ }
+
+ if (sprite->data[6] > 255)
+ {
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_2C(struct Sprite *sprite)
+{
+ if (++sprite->data[2] == 1)
+ {
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+ sprite->data[6] = 0;
+ sprite->data[5] = 0;
+ sprite->data[4] = 0;
+ }
+
+ if (sUnknown_0860AA64[sprite->data[6]][1] == 0xFF)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ if (sprite->data[4] == 1)
+ {
+ if (sUnknown_0860AA64[sprite->data[6]][0] != 0)
+ BlendPalette(sprite->data[7], 0x10, 0x10, RGB_YELLOW);
+ else
+ BlendPalette(sprite->data[7], 0x10, 0, RGB_YELLOW);
+
+ sprite->data[4] = 0;
+ }
+
+ if (sUnknown_0860AA64[sprite->data[6]][1] == sprite->data[5])
+ {
+ sprite->data[4] = 1;
+ sprite->data[5] = 0;
+ sprite->data[6]++;
+ }
+ else
+ {
+ sprite->data[5]++;
+ }
+ }
+}
+
+static void sub_81814D4(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ HandleStartAffineAnim(sprite);
+
+ sub_817F70C(sprite);
+ if (sprite->data[2] > sUnknown_03001240[sprite->data[0]].field_8)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->pos2.x = 0;
+ if (sUnknown_03001240[sprite->data[0]].field_4 > 1)
+ {
+ sUnknown_03001240[sprite->data[0]].field_4--;
+ sprite->data[2] = 0;
+ }
+ else
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ }
+ else
+ {
+ s16 index = (sprite->data[2] * 256) / sUnknown_03001240[sprite->data[0]].field_8;
+ sprite->pos2.x = -(Sin(index, 10));
+ HandleSetAffineData(sprite, 256, 256, Sin(index, 3276));
+ }
+
+ sprite->data[2]++;
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_2D(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+ sUnknown_03001240[id].field_8 = 50;
+ sub_81814D4(sprite);
+ sprite->callback = sub_81814D4;
+}
+
+static void sub_81815D4(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ HandleStartAffineAnim(sprite);
+
+ sub_817F70C(sprite);
+ if (sprite->data[2] > sUnknown_03001240[sprite->data[0]].field_8)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->pos2.x = 0;
+ if (sUnknown_03001240[sprite->data[0]].field_4 > 1)
+ {
+ sUnknown_03001240[sprite->data[0]].field_4--;
+ sprite->data[2] = 0;
+ }
+ else
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ }
+ else
+ {
+ s16 index = (sprite->data[2] * 256) / sUnknown_03001240[sprite->data[0]].field_8;
+ sprite->pos2.x = -(Sin(index, 10));
+ HandleSetAffineData(sprite, 256, 256, -(Sin(index, 3276)));
+ }
+
+ sprite->data[2]++;
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_2E(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+ sUnknown_03001240[id].field_8 = 50;
+ sub_81815D4(sprite);
+ sprite->callback = sub_81815D4;
+}
+
+static void sub_8181708(struct Sprite *sprite);
+static void sub_8181770(struct Sprite *sprite);
+static void sub_8181794(struct Sprite *sprite);
+
+static void pokemonanimfunc_2F(struct Sprite *sprite)
+{
+ HandleStartAffineAnim(sprite);
+ sprite->data[6] = -(14 * sprite->centerToCornerVecX / 10);
+ sprite->data[7] = 128;
+ sprite->callback = sub_8181708;
+}
+
+static void sub_8181708(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->data[7]--;
+ sprite->pos2.x = Cos(sprite->data[7], sprite->data[6]) + sprite->data[6];
+
+ sprite->pos2.y = -(Sin(sprite->data[7], sprite->data[6] += 0)); // dummy += 0 is needed to match
+
+ HandleSetAffineData(sprite, 256, 256, (sprite->data[7] - 128) << 8);
+ if (sprite->data[7] <= 120)
+ {
+ sprite->data[7] = 120;
+ sprite->data[3] = 0;
+ sprite->callback = sub_8181770;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8181770(struct Sprite *sprite)
+{
+ if (sprite->data[3] == 20)
+ {
+ sprite->callback = sub_8181794;
+ sprite->data[3] = 0;
+ }
+
+ sprite->data[3]++;
+}
+
+static void sub_8181794(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->data[7] += 2;
+ sprite->pos2.x = Cos(sprite->data[7], sprite->data[6]) + sprite->data[6];
+
+ sprite->pos2.y = -(Sin(sprite->data[7], sprite->data[6] += 0)); // dummy += 0 is needed to match
+
+ HandleSetAffineData(sprite, 256, 256, (sprite->data[7] - 128) << 8);
+ if (sprite->data[7] >= 128)
+ {
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->data[2] = 0;
+ sub_817F77C(sprite);
+ sprite->callback = pokemonanimfunc_10;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8181810(struct Sprite *sprite)
+{
+ if (sUnknown_03001240[sprite->data[0]].field_0 != 0)
+ {
+ sUnknown_03001240[sprite->data[0]].field_0--;
+ }
+ else
+ {
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[4] = 0;
+ sprite->data[5] = 0;
+ sprite->data[2] = 1;
+ }
+
+ if (sprite->data[5] == 0)
+ {
+ sprite->data[7] = Sin(sprite->data[4], 256);
+ sprite->pos2.y = Sin(sprite->data[4], 16);
+ sprite->data[6] = Sin(sprite->data[4], 32);
+ HandleSetAffineData(sprite, 256 - sprite->data[6], 256 + sprite->data[7], 0);
+ if (sprite->data[4] == 128)
+ {
+ sprite->data[4] = 0;
+ sprite->data[5] = 1;
+ }
+ }
+ else if (sprite->data[5] == 1)
+ {
+ sprite->data[7] = Sin(sprite->data[4], 32);
+ sprite->pos2.y = -(Sin(sprite->data[4], 8));
+ sprite->data[6] = Sin(sprite->data[4], 128);
+ HandleSetAffineData(sprite, 256 + sprite->data[6], 256 - sprite->data[7], 0);
+ if (sprite->data[4] == 128)
+ {
+ if (sUnknown_03001240[sprite->data[0]].field_4 > 1)
+ {
+ sUnknown_03001240[sprite->data[0]].field_4--;
+ sUnknown_03001240[sprite->data[0]].field_0 = 10;
+ sprite->data[4] = 0;
+ sprite->data[5] = 0;
+ }
+ else
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ }
+ }
+
+ sprite->data[4] += sUnknown_03001240[sprite->data[0]].field_6;
+ }
+}
+
+static void pokemonanimfunc_30(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+ sUnknown_03001240[id].field_6 = 4;
+ sub_8181810(sprite);
+ sprite->callback = sub_8181810;
+}
+
+static void pokemonanimfunc_31(struct Sprite *sprite)
+{
+ s32 counter = sprite->data[2];
+ sub_817F70C(sprite);
+ if (counter > 512)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ }
+ else
+ {
+ switch (sprite->data[2] / 128)
+ {
+ case 0:
+ sprite->pos2.x = -(counter % 128 * 8) / 128;
+ break;
+ case 1:
+ sprite->pos2.x = (counter % 128 / 16) - 8;
+ break;
+ case 2:
+ sprite->pos2.x = (counter % 128 / 16);
+ break;
+ case 3:
+ sprite->pos2.x = -(counter % 128 * 8) / 128 + 8;
+ break;
+ }
+
+ sprite->pos2.y = -(Sin(counter % 128, 8));
+ }
+
+ sprite->data[2] += 12;
+ sub_817F70C(sprite);
+}
+
+static void sub_8181ABC(struct Sprite *sprite);
+static void sub_8181B4C(struct Sprite *sprite);
+static void sub_8181C2C(struct Sprite *sprite);
+
+static void pokemonanimfunc_32(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+ sUnknown_03001240[id].field_8 = -1;
+ HandleStartAffineAnim(sprite);
+ sprite->data[3] = 0;
+ sub_8181ABC(sprite);
+ sprite->callback = sub_8181ABC;
+}
+
+static void sub_8181ABC(struct Sprite *sprite)
+{
+ if (sUnknown_03001240[sprite->data[0]].field_0 != 0)
+ {
+ sUnknown_03001240[sprite->data[0]].field_0--;
+ }
+ else
+ {
+ s32 counter;
+
+ sub_817F70C(sprite);
+ counter = sprite->data[2];
+ if (sprite->data[2] > 128)
+ {
+ sprite->data[2] = 0;
+ sprite->callback = sub_8181B4C;
+ }
+ else
+ {
+ s32 var = 8 * sUnknown_03001240[sprite->data[0]].field_8;
+ sprite->pos2.x = var * (counter % 128) / 128;
+ sprite->pos2.y = -(Sin(counter % 128, 8));
+ sprite->data[2] += 12;
+ }
+
+ sub_817F70C(sprite);
+ }
+}
+
+static void sub_8181B4C(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] > 48)
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->pos2.y = 0;
+ sprite->data[2] = 0;
+ sprite->callback = sub_8181C2C;
+ }
+ else
+ {
+ s16 yDelta;
+ s16 yScale = Sin(sprite->data[4], 64) + 256;
+ if (sprite->data[2] >= 16 && sprite->data[2] <= 31)
+ {
+ sprite->data[3] += 8;
+ sprite->pos2.x -= sUnknown_03001240[sprite->data[0]].field_8;
+ }
+
+ yDelta = 0;
+ if (yScale > 256)
+ yDelta = (256 - yScale) / 8;
+
+ sprite->pos2.y = -(Sin(sprite->data[3], 20)) - yDelta;
+ HandleSetAffineData(sprite, 256 - Sin(sprite->data[4], 32), yScale, 0);
+ sprite->data[2]++;
+ sprite->data[4] += 8;
+ sprite->data[4] &= 0xFF;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8181C2C(struct Sprite *sprite)
+{
+ s32 counter;
+
+ sub_817F70C(sprite);
+ counter = sprite->data[2];
+ if (counter > 128)
+ {
+ if (sUnknown_03001240[sprite->data[0]].field_4 > 1)
+ {
+ sUnknown_03001240[sprite->data[0]].field_4--;
+ sUnknown_03001240[sprite->data[0]].field_0 = 10;
+ sprite->data[3] = 0;
+ sprite->data[2] = 0;
+ sprite->data[4] = 0;
+ sprite->callback = sub_8181ABC;
+ }
+ else
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ }
+ else
+ {
+ register s32 var asm("r4") = sUnknown_03001240[sprite->data[0]].field_8;
+
+ sprite->pos2.x = (var << 3) * (counter % 128) / 128 - (sUnknown_03001240[sprite->data[0]].field_8 * 8);
+ sprite->pos2.y = -(Sin(counter % 128, 8));
+ }
+
+ sprite->data[2] += 12;
+ sub_817F70C(sprite);
+}
+
+static void sub_8181CE8(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ }
+
+ sub_817F70C(sprite);
+ if (sprite->data[7] > 254)
+ {
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ if (sUnknown_03001240[sprite->data[0]].field_4 > 1)
+ {
+ sUnknown_03001240[sprite->data[0]].field_4--;
+ sprite->data[2] = 0;
+ sprite->data[7] = 0;
+ }
+ else
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+
+ sub_817F70C(sprite);
+ }
+ else
+ {
+ u16 rotation;
+
+ sprite->pos2.x = -(Sin(sprite->data[7], 16));
+ rotation = Sin(sprite->data[7], 32);
+ HandleSetAffineData(sprite, 256, 256, rotation << 8);
+ sprite->data[7] += sUnknown_03001240[sprite->data[0]].field_6;
+ sub_817F70C(sprite);
+ }
+}
+
+static void pokemonanimfunc_33(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+ sUnknown_03001240[id].field_6 = 4;
+ sub_8181CE8(sprite);
+ sprite->callback = sub_8181CE8;
+}
+
+static void pokemonanimfunc_34(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ }
+
+ sub_817F70C(sprite);
+ if (sprite->data[7] > 254)
+ {
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sub_817F70C(sprite);
+ }
+ else
+ {
+ u16 rotation;
+
+ sprite->pos2.x = -(Sin(sprite->data[7], 16));
+ sprite->pos2.y = -(Sin(sprite->data[7] % 128, 16));
+ rotation = Sin(sprite->data[7], 32);
+ HandleSetAffineData(sprite, 256, 256, rotation << 8);
+ sprite->data[7] += 8;
+ sub_817F70C(sprite);
+ }
+}
+
+static void pokemonanimfunc_35(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ sprite->data[7] = 0;
+
+ if (sprite->data[2] == sprite->data[7])
+ {
+ sprite->data[7] = 0;
+ sprite->data[2]++;
+ sprite->invisible = 0;
+ }
+ else
+ {
+ sprite->data[7]++;
+ sprite->invisible = 1;
+ }
+
+ if (sprite->data[2] > 10)
+ {
+ sprite->invisible = 0;
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+}
+
+static void sub_8181F14(struct Sprite *sprite);
+static void sub_8181F50(struct Sprite *sprite);
+static void sub_8181FC0(struct Sprite *sprite);
+
+static void pokemonanimfunc_36(struct Sprite *sprite)
+{
+ HandleStartAffineAnim(sprite);
+ sprite->data[7] = 0;
+ sprite->callback = sub_8181F14;
+}
+
+static void sub_8181F14(struct Sprite *sprite)
+{
+ if (sprite->data[7] > 31)
+ {
+ sprite->data[7] = 32;
+ sprite->data[2] = 0;
+ sprite->callback = sub_8181F50;
+ }
+ else
+ {
+ sprite->data[7] += 4;
+ }
+
+ HandleSetAffineData(sprite, 256, 256, sprite->data[7] << 8);
+}
+
+static void sub_8181F50(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] > 512)
+ {
+ sprite->callback = sub_8181FC0;
+ sprite->data[6] = 0;
+ }
+ else
+ {
+ sprite->pos2.x = -(sprite->data[2] * 16) / 512;
+ sprite->pos2.y = -(Sin(sprite->data[2] % 128, 4));
+ sprite->data[2] += 12;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8181FC0(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->data[7] -= 2;
+ if (sprite->data[7] < 0)
+ {
+ sprite->data[7] = 0;
+ sprite->pos2.x = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->pos2.x = -(Sin(sprite->data[7] * 2, 16));
+ }
+
+ HandleSetAffineData(sprite, 256, 256, sprite->data[7] << 8);
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_37(struct Sprite *sprite)
+{
+ u16 rotation;
+
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ sprite->data[7] = 0;
+ }
+
+ sub_817F70C(sprite);
+ if (sprite->data[7] > 255)
+ {
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->data[7] = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[7] += 16;
+ sprite->pos2.x = -(Sin(sprite->data[7] % 128, 8));
+ sprite->pos2.y = -(Sin(sprite->data[7] % 128, 8));
+ }
+
+ rotation = Sin(sprite->data[7] % 128, 16);
+ HandleSetAffineData(sprite, 256, 256, rotation << 8);
+ sub_817F70C(sprite);
+}
+
+static void sub_81820FC(struct Sprite *sprite);
+static void sub_818216C(struct Sprite *sprite);
+static void sub_81821CC(struct Sprite *sprite);
+static void sub_8182248(struct Sprite *sprite);
+
+static void pokemonanimfunc_38(struct Sprite *sprite)
+{
+ HandleStartAffineAnim(sprite);
+ sprite->data[7] = 0;
+ sprite->data[4] = 0;
+ sprite->callback = sub_81820FC;
+}
+
+static void sub_81820FC(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[7] > 24)
+ {
+ if (++sprite->data[4] > 4)
+ {
+ sprite->data[4] = 0;
+ sprite->callback = sub_818216C;
+ }
+ }
+ else
+ {
+ sprite->data[7] += 2;
+ sprite->pos2.x = Sin(sprite->data[7], 8);
+ sprite->pos2.y = -(Sin(sprite->data[7], 8));
+ }
+
+ HandleSetAffineData(sprite, 256, 256, -(sprite->data[7]) << 8);
+ sub_817F70C(sprite);
+}
+
+static void sub_818216C(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[7] > 32)
+ {
+ sprite->data[6] = 1;
+ sprite->callback = sub_81821CC;
+ }
+ else
+ {
+ sprite->data[7] += 2;
+ sprite->pos2.x = Sin(sprite->data[7], 8);
+ sprite->pos2.y = -(Sin(sprite->data[7], 8));
+ }
+
+ HandleSetAffineData(sprite, 256, 256, -(sprite->data[7]) << 8);
+ sub_817F70C(sprite);
+}
+
+static void sub_81821CC(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->data[7] += (sprite->data[6] * 4);
+ if (sprite->data[5] > 9)
+ {
+ sprite->data[7] = 32;
+ sprite->callback = sub_8182248;
+ }
+
+ sprite->pos2.x = Sin(sprite->data[7], 8);
+ sprite->pos2.y = -(Sin(sprite->data[7], 8));
+ if (sprite->data[7] <= 28 || sprite->data[7] >= 36)
+ {
+ sprite->data[6] *= -1;
+ sprite->data[5]++;
+ }
+
+ HandleSetAffineData(sprite, 256, 256, -(sprite->data[7]) << 8);
+ sub_817F70C(sprite);
+}
+
+static void sub_8182248(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[7] <= 0)
+ {
+ sprite->data[7] = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[7] -= 2;
+ sprite->pos2.x = Sin(sprite->data[7], 8);
+ sprite->pos2.y = -(Sin(sprite->data[7], 8));
+ }
+
+ HandleSetAffineData(sprite, 256, 256, -(sprite->data[7]) << 8);
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_39(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] > 40)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.x = 0;
+ }
+ else
+ {
+ s8 sign;
+ if (!(sprite->data[2] & 1))
+ sign = 1;
+ else
+ sign = -1;
+
+ if ((sprite->data[2] % 4) / 2 == 0)
+ {
+ sprite->pos2.x = Sin((sprite->data[2] * 128 / 40) % 256, 16) * sign;
+ sprite->pos2.y = -(sprite->pos2.x);
+ }
+ else
+ {
+ sprite->pos2.x = -(Sin((sprite->data[2] * 128 / 40) % 256, 16)) * sign;
+ sprite->pos2.y = sprite->pos2.x;
+ }
+ }
+
+ sprite->data[2]++;
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_3A(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[5] = 0;
+ sprite->data[6] = 0;
+ sprite->data[7] = 0;
+ sprite->data[2]++;
+ }
+
+ if (sprite->data[6] > 0)
+ {
+ sprite->data[6]--;
+ if (sprite->data[5] != 3)
+ {
+ s16 scale = (8 * sprite->data[6]) / 20;
+ scale = Sin(sprite->data[7] - scale, 64);
+ HandleSetAffineData(sprite, 256 - scale, 256 - scale, 0);
+ }
+ }
+ else
+ {
+ s16 var;
+
+ if (sprite->data[5] == 3)
+ {
+ if (sprite->data[7] > 63)
+ {
+ sprite->data[7] = 64;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ var = Cos(sprite->data[7], 64);
+ }
+ else
+ {
+ var = Sin(sprite->data[7], 64);
+ if (sprite->data[7] > 63)
+ {
+ sprite->data[5] = 3;
+ sprite->data[6] = 10;
+ sprite->data[7] = 0;
+ }
+ else
+ {
+ if (var > 48 && sprite->data[5] == 1)
+ {
+ sprite->data[5] = 2;
+ sprite->data[6] = 20;
+ }
+ else if (var > 16 && sprite->data[5] == 0)
+ {
+ sprite->data[5] = 1;
+ sprite->data[6] = 20;
+ }
+ }
+ }
+
+ sprite->data[7] += 2;
+ HandleSetAffineData(sprite, 256 - var, 256 - var, 0);
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_3B(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ sprite->data[7] = 0;
+ }
+
+ if (sprite->data[7] > 512)
+ {
+ sprite->pos2.y = 0;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ s16 yScale;
+
+ sprite->pos2.y = Sin(sprite->data[7] % 256, 8);
+ sprite->data[7] += 8;
+ yScale = Sin(sprite->data[7] % 128, 96);
+ HandleSetAffineData(sprite, 256, yScale + 256, 0);
+ }
+}
+
+static void pokemonanimfunc_3C(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ sprite->data[7] = 0;
+ }
+
+ if (sprite->data[7] > 256)
+ {
+ sprite->pos2.y = 0;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ s16 yScale;
+
+ sprite->pos2.y = Sin(sprite->data[7], 16);
+ sprite->data[7] += 4;
+ yScale = Sin((sprite->data[7] % 64) * 2, 128);
+ HandleSetAffineData(sprite, 256, yScale + 256, 0);
+ }
+}
+
+static void sub_81825F8(struct Sprite *sprite);
+static void sub_8182648(struct Sprite *sprite);
+static void sub_81826F8(struct Sprite *sprite);
+
+static void pokemonanimfunc_3D(struct Sprite *sprite)
+{
+ HandleStartAffineAnim(sprite);
+ sprite->callback = sub_81825F8;
+ sprite->data[7] = 0;
+}
+
+static void sub_81825F8(struct Sprite *sprite)
+{
+ s16 yScale;
+
+ sprite->data[7] += 8;
+ if (sprite->data[7] > 63)
+ {
+ sprite->data[7] = 0;
+ sprite->data[6] = 0;
+ sprite->callback = sub_8182648;
+ yScale = Sin(64, 128); // 128 * 1 = 128
+ }
+ else
+ {
+ yScale = Sin(sprite->data[7], 128);
+ }
+
+ HandleSetAffineData(sprite, 256, 256 + yScale, 0);
+}
+
+static void sub_8182648(struct Sprite *sprite)
+{
+ s16 yScale;
+
+ sprite->data[7] += 4;
+ if (sprite->data[7] > 95)
+ {
+ yScale = Cos(0, 128); // 128 * (-1) = -128
+ sprite->data[7] = 0;
+ sprite->data[6]++;
+ }
+ else
+ {
+ s16 sign, index;
+
+ sprite->pos2.y = -(sprite->data[6] * 4) - Sin(sprite->data[7], 8);
+ if (sprite->data[7] > 63)
+ {
+ sign = -1;
+ index = sprite->data[7] - 64;
+ }
+ else
+ {
+ sign = 1;
+ index = 0;
+ }
+
+ yScale = Cos((index * 2) + sprite->data[7], 128) * sign;
+ }
+
+ HandleSetAffineData(sprite, 256, 256 + yScale, 0);
+ if (sprite->data[6] == 3)
+ {
+ sprite->data[7] = 0;
+ sprite->callback = sub_81826F8;
+ }
+}
+
+static void sub_81826F8(struct Sprite *sprite)
+{
+ s16 yScale;
+
+ sprite->data[7] += 8;
+ yScale = Cos(sprite->data[7], 128);
+ sprite->pos2.y = -(Cos(sprite->data[7], 12));
+ if (sprite->data[7] > 63)
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.y = 0;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ }
+
+ HandleSetAffineData(sprite, 256, 256 + yScale, 0);
+}
+
+static void sub_8182764(struct Sprite *sprite)
+{
+ if (sprite->data[7] > sprite->data[5])
+ {
+ sprite->pos2.x = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ }
+ else
+ {
+ s16 xScale;
+
+ sprite->pos2.x = Sin(sprite->data[7] % 256, sprite->data[4]);
+ sprite->data[7] += sprite->data[6];
+ xScale = Sin(sprite->data[7] % 128, 96);
+ HandleSetAffineData(sprite, 256 + xScale, 256, 0);
+ }
+}
+
+static void pokemonanimfunc_3E(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ sprite->data[7] = 0;
+ sprite->data[6] = 8;
+ sprite->data[5] = 512;
+ sprite->data[4] = 8;
+ }
+
+ sub_8182764(sprite);
+}
+
+static void sub_8182830(struct Sprite *sprite)
+{
+ if (sprite->data[7] > sprite->data[5])
+ {
+ sprite->pos2.x = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ }
+ else
+ {
+ s16 xScale;
+
+ sprite->pos2.x = Sin(sprite->data[7] % 256, sprite->data[4]);
+ sprite->data[7] += sprite->data[6];
+ xScale = Sin((sprite->data[7] % 64) * 2, 128);
+ HandleSetAffineData(sprite, 256 + xScale, 256, 0);
+ }
+}
+
+static void pokemonanimfunc_3F(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ sprite->data[7] = 0;
+ sprite->data[6] = 4;
+ sprite->data[5] = 256;
+ sprite->data[4] = 16;
+ }
+
+ sub_8182830(sprite);
+}
+
+static void pokemonanimfunc_40(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ sprite->data[7] = 0;
+ }
+
+ if (sprite->data[7] > 512)
+ {
+ sprite->pos2.x = 0;
+ sub_817F77C(sprite);
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ s16 scale;
+
+ sprite->pos2.x = Sin(sprite->data[7] % 256, 8);
+ sprite->data[7] += 8;
+ scale = Sin(sprite->data[7] % 128, 96);
+ HandleSetAffineData(sprite, 256 + scale, 256 + scale, 0);
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_41(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ sprite->data[7] = 0;
+ }
+
+ if (sprite->data[7] > 512)
+ {
+ sprite->pos2.x = 0;
+ sub_817F77C(sprite);
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ s16 scale;
+
+ sprite->pos2.x = -(Sin((sprite->data[7] % 256) / 2, 16));
+ sprite->data[7] += 8;
+ scale = -(Sin((sprite->data[7] % 256) / 2, 64));
+ HandleSetAffineData(sprite, 256 + scale, 256 + scale, 0);
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_42(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ sprite->data[7] = 0;
+ }
+
+ if (sprite->data[7] > 512)
+ {
+ sprite->pos2.x = 0;
+ sub_817F77C(sprite);
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ s16 scale;
+
+ sprite->pos2.x = -(Sin(sprite->data[7] % 256 , 8));
+ sprite->data[7] += 8;
+ scale = Sin((sprite->data[7] % 256) / 2, 96);
+ HandleSetAffineData(sprite, 256 + scale, 256 + scale, 0);
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_43(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] > 2048)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->data[6] = 0;
+ }
+ else
+ {
+ s16 caseVar = (sprite->data[2] / 512) % 4;
+ switch (caseVar)
+ {
+ case 0:
+ sprite->pos2.x = -(sprite->data[2] % 512 * 16) / 512;
+ break;
+ case 1:
+ sprite->pos2.x = (sprite->data[2] % 512 / 32) - 16;
+ break;
+ case 2:
+ sprite->pos2.x = (sprite->data[2] % 512) / 32;
+ break;
+ case 3:
+ sprite->pos2.x = -(sprite->data[2] % 512 * 16) / 512 + 16;
+ break;
+ }
+
+ sprite->pos2.y = -(Sin(sprite->data[2] % 128, 4));
+ sprite->data[2] += 24;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_44(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[6] = 0;
+ sprite->data[7] = 64;
+ sprite->data[2]++;
+ }
+
+ sprite->data[7] += 8;
+ if (sprite->data[6] == 4)
+ {
+ if (sprite->data[7] > 63)
+ {
+ sprite->data[7] = 0;
+ sprite->data[6]++;
+ }
+ }
+ else
+ {
+ if (sprite->data[7] > 127)
+ {
+ sprite->data[7] = 0;
+ sprite->data[6]++;
+ }
+ }
+
+ switch (sprite->data[6])
+ {
+ case 1:
+ sprite->pos2.x = -(Cos(sprite->data[7], 8));
+ sprite->pos2.y = Sin(sprite->data[7], 8) - 8;
+ break;
+ case 2:
+ sprite->pos2.x = Sin(sprite->data[7] + 128, 8) + 8;
+ sprite->pos2.y = -(Cos(sprite->data[7], 8));
+ break;
+ case 3:
+ sprite->pos2.x = Cos(sprite->data[7], 8);
+ sprite->pos2.y = Sin(sprite->data[7] + 128, 8) + 8;
+ break;
+ case 0:
+ case 4:
+ sprite->pos2.x = Sin(sprite->data[7], 8) - 8;
+ sprite->pos2.y = Cos(sprite->data[7], 8);
+ break;
+ default:
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ break;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_45(struct Sprite *sprite)
+{
+ sprite->data[0] = 32;
+ sub_8180714(sprite);
+ sprite->callback = sub_8180714;
+}
+
+static void pokemonanimfunc_46(struct Sprite *sprite)
+{
+ sprite->data[0] = 80;
+ sub_817F8FC(sprite);
+ sprite->callback = sub_817F8FC;
+}
+
+static void pokemonanimfunc_47(struct Sprite *sprite)
+{
+ sprite->data[0] = 80;
+ sub_817F978(sprite);
+ sprite->callback = sub_817F978;
+}
+
+static void pokemonanimfunc_48(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_6 = 2048;
+ sUnknown_03001240[id].field_8 = sprite->data[6];
+ sub_8180900(sprite);
+ sprite->callback = sub_8180900;
+}
+
+static void pokemonanimfunc_49(struct Sprite *sprite)
+{
+ sprite->data[6] = 1;
+ pokemonanimfunc_05(sprite);
+}
+
+static void pokemonanimfunc_4A(struct Sprite *sprite)
+{
+ sprite->data[6] = 1;
+ pokemonanimfunc_48(sprite);
+}
+
+static void pokemonanimfunc_4B(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ sprite->data[0] = 0;
+
+ if (sprite->data[0] <= 0)
+ {
+ sub_817FC20(sprite);
+ sprite->data[0] = 1;
+ }
+ else
+ {
+ sprite->data[0]--;
+ }
+}
+
+static void pokemonanimfunc_4C(struct Sprite *sprite)
+{
+ sprite->data[0] = 30;
+ sprite->data[7] = 3;
+ sub_817FCDC(sprite);
+ sprite->callback = sub_817FCDC;
+}
+
+static void pokemonanimfunc_4D(struct Sprite *sprite)
+{
+ sprite->data[0] = 30;
+ sub_817FD44(sprite);
+ sprite->callback = sub_817FD44;
+}
+
+static void pokemonanimfunc_4E(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_6 = 1024;
+ sUnknown_03001240[id].field_0 = 0;
+ sUnknown_03001240[id].field_4 = 2;
+ sub_817FE30(sprite);
+ sprite->callback = sub_817FE30;
+}
+
+static void pokemonanimfunc_4F(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_6 = 512;
+ sUnknown_03001240[id].field_8 = 3;
+ sUnknown_03001240[id].field_2 = 12;
+ sub_817FFF0(sprite);
+ sprite->callback = sub_817FFF0;
+}
+
+static void pokemonanimfunc_50(struct Sprite *sprite)
+{
+ sprite->data[0] = 24;
+ sub_818031C(sprite);
+ sprite->callback = sub_818031C;
+}
+
+static void pokemonanimfunc_51(struct Sprite *sprite)
+{
+ sprite->data[0] = 5;
+ sub_81804F8(sprite);
+ sprite->callback = sub_81804F8;
+}
+
+static void pokemonanimfunc_52(struct Sprite *sprite)
+{
+ sprite->data[0] = 3;
+ sub_817F9F4(sprite);
+ sprite->callback = sub_817F9F4;
+}
+
+static void pokemonanimfunc_53(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_0 = 60;
+ sUnknown_03001240[id].field_8 = 30;
+ sub_817FF3C(sprite);
+ sprite->callback = sub_817FF3C;
+}
+
+static void pokemonanimfunc_54(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_2 = 1;
+ sUnknown_03001240[id].field_4 = 2;
+ sub_8181214(sprite);
+ sprite->callback = sub_8181214;
+}
+
+static void pokemonanimfunc_55(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_6 = 4;
+ sUnknown_03001240[id].field_4 = 2;
+ sub_8181810(sprite);
+ sprite->callback = sub_8181810;
+}
+
+static void pokemonanimfunc_56(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_8 = 1;
+ sUnknown_03001240[id].field_4 = 2;
+ HandleStartAffineAnim(sprite);
+ sprite->data[3] = 0;
+ sub_8181ABC(sprite);
+ sprite->callback = sub_8181ABC;
+}
+
+static void pokemonanimfunc_07(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_6 = 2;
+ sub_8181CE8(sprite);
+ sprite->callback = sub_8181CE8;
+}
+
+static void pokemonanimfunc_08(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_6 = 4;
+ sUnknown_03001240[id].field_4 = 2;
+ sub_8181CE8(sprite);
+ sprite->callback = sub_8181CE8;
+}
+
+static void pokemonanimfunc_0B(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_8 = 100;
+ sub_81814D4(sprite);
+ sprite->callback = sub_81814D4;
+}
+
+static void pokemonanimfunc_0C(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_8 = 50;
+ sUnknown_03001240[id].field_4 = 2;
+ sub_81814D4(sprite);
+ sprite->callback = sub_81814D4;
+}
+
+static void pokemonanimfunc_0D(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_8 = 100;
+ sub_81815D4(sprite);
+ sprite->callback = sub_81815D4;
+}
+
+static void pokemonanimfunc_0E(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_8 = 50;
+ sUnknown_03001240[id].field_4 = 2;
+ sub_81815D4(sprite);
+ sprite->callback = sub_81815D4;
+}
+
+static void sub_8183140(struct Sprite *sprite)
+{
+ s32 counter = sprite->data[2];
+ if (counter > 2304)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.y = 0;
+ }
+ else
+ {
+ sprite->pos2.y = Sin((counter + 192) % 256, sprite->data[7]) + sprite->data[7];
+ }
+
+ sprite->data[2] += sprite->data[0];
+}
+
+static void pokemonanimfunc_57(struct Sprite *sprite)
+{
+ sprite->data[0] = 60;
+ sprite->data[7] = 3;
+ sub_8183140(sprite);
+ sprite->callback = sub_8183140;
+}
+
+static void pokemonanimfunc_58(struct Sprite *sprite)
+{
+ sprite->data[0] = 30;
+ sprite->data[7] = 3;
+ sub_8183140(sprite);
+ sprite->callback = sub_8183140;
+}
+
+static void pokemonanimfunc_59(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] > 2048)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->data[6] = 0;
+ }
+ else
+ {
+ s16 divCase = (sprite->data[2] / 512) % 4;
+ switch (divCase)
+ {
+ case 0:
+ sprite->pos2.x = (sprite->data[2] % 512) / 32;
+ break;
+ case 2:
+ sprite->pos2.x = -(sprite->data[2] % 512 * 16) / 512;
+ break;
+ case 1:
+ sprite->pos2.x = -(sprite->data[2] % 512 * 16) / 512 + 16;
+ break;
+ case 3:
+ sprite->pos2.x = (sprite->data[2] % 512) / 32 - 16;
+ break;
+ }
+
+ sprite->pos2.y = Sin(sprite->data[2] % 128, 4);
+ sprite->data[2] += 24;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_81832C8(struct Sprite *sprite)
+{
+ s16 index1 = 0, index2 = 0;
+
+ if (sprite->data[5] > sprite->data[6])
+ {
+ sprite->pos2.y = 0;
+ sprite->data[5] = 0;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ if (sprite->data[4] <= 1)
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[4]--;
+ sprite->data[7] = 0;
+ }
+ }
+ else
+ {
+ u8 amplitude, cmpVal1, cmpVal2;
+ s16 xScale, yScale;
+
+ index2 = (sprite->data[5] * 128) / sprite->data[6];
+ cmpVal1 = sprite->data[6] / 4;
+ cmpVal2 = cmpVal1 * 3;
+ if (sprite->data[5] >= cmpVal1 && sprite->data[5] < cmpVal2)
+ {
+ sprite->data[7] += 51;
+ index1 = sprite->data[7] & 0xFF;
+ }
+
+ if (sprite->data[1] == 0)
+ xScale = -256 - Sin(index2, 16);
+ else
+ xScale = 256 + Sin(index2, 16);
+
+ amplitude = sprite->data[3];
+ yScale = 256 - Sin(index2, amplitude) - Sin(index1, amplitude / 5);
+ SetAffineData(sprite, xScale, yScale, 0);
+ sprite->data[5]++;
+ }
+}
+
+static void pokemonanimfunc_5A(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ HandleStartAffineAnim(sprite);
+ sprite->data[4] = 1;
+ sprite->data[6] = 40;
+ sprite->data[3] = 40;
+ sprite->data[5] = 0;
+ sprite->data[7] = 0;
+ }
+
+ sub_81832C8(sprite);
+}
+
+static void sub_8183418(struct Sprite *sprite)
+{
+ s16 index1 = 0, index2;
+
+ if (sprite->data[5] > sprite->data[6])
+ {
+ sprite->data[5] = 0;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ if (sprite->data[4] <= 1)
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[4]--;
+ sprite->data[7] = 0;
+ }
+ }
+ else
+ {
+ u8 amplitude, cmpVal1, cmpVal2;
+ s16 xScale;
+
+ index2 = (sprite->data[5] * 128) / sprite->data[6];
+ cmpVal1 = sprite->data[6] / 4;
+ cmpVal2 = cmpVal1 * 3;
+ if (sprite->data[5] >= cmpVal1 && sprite->data[5] < cmpVal2)
+ {
+ sprite->data[7] += 51;
+ index1 = sprite->data[7] & 0xFF;
+ }
+
+ amplitude = sprite->data[3];
+
+ if (sprite->data[1] == 0)
+ xScale = -256 + Sin(index2, amplitude) + Sin(index1, amplitude / 5 * 2);
+ else
+ xScale = 256 - Sin(index2, amplitude) - Sin(index1, amplitude / 5 * 2);
+
+ SetAffineData(sprite, xScale, 256, 0);
+ sprite->data[5]++;
+ }
+}
+
+static void pokemonanimfunc_5B(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ HandleStartAffineAnim(sprite);
+ sprite->data[4] = 1;
+ sprite->data[6] = 40;
+ sprite->data[3] = 40;
+ sprite->data[5] = 0;
+ sprite->data[7] = 0;
+ }
+
+ sub_8183418(sprite);
+}
+
+static void sub_8183574(struct Sprite *sprite)
+{
+ u8 var6, var7;
+ u8 var8 = sprite->data[2];
+ u8 var9 = sprite->data[6];
+ u8 var5 = sUnknown_0860AA80[sprite->data[5]][0];
+ u8 var2 = var5;
+ if (var5 != 0xFF)
+ var5 = sprite->data[7];
+ else
+ var5 = 0xFF; // needed to match
+
+ var6 = sUnknown_0860AA80[sprite->data[5]][1];
+ var7 = 0;
+ if (var2 != 0xFE)
+ var7 = (var6 - var9) * var5 / var6;
+
+ if (var5 == 0xFF)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.y = 0;
+ }
+ else
+ {
+ sprite->pos2.y = Sin((var8 + 192) % 256, var7) + var7;
+ if (var9 == var6)
+ {
+ sprite->data[5]++;
+ sprite->data[6] = 0;
+ }
+ else
+ {
+ sprite->data[2] += sprite->data[0];
+ sprite->data[6]++;
+ }
+ }
+}
+
+static void pokemonanimfunc_5C(struct Sprite *sprite)
+{
+ sprite->data[0] = 40;
+ sprite->data[7] = 6;
+ sub_8183574(sprite);
+ sprite->callback = sub_8183574;
+}
+
+static void pokemonanimfunc_5D(struct Sprite *sprite)
+{
+ sprite->data[0] = 70;
+ sprite->data[7] = 6;
+ sub_817FCDC(sprite);
+ sprite->callback = sub_817FCDC;
+}
+
+static void pokemonanimfunc_5E(struct Sprite *sprite)
+{
+ sprite->data[0] = 20;
+ sub_817F8FC(sprite);
+ sprite->callback = sub_817F8FC;
+}
+
+static void pokemonanimfunc_5F(struct Sprite *sprite)
+{
+ if (sprite->data[2] > 40)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.x = 0;
+ }
+ else
+ {
+ s8 sign;
+ if (!(sprite->data[2] & 1))
+ sign = 1;
+ else
+ sign = -1;
+
+ sprite->pos2.x = Sin((sprite->data[2] * 128 / 40) % 256, 9) * sign;
+ }
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_60(struct Sprite *sprite)
+{
+ if (sprite->data[2] > 40)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.x = 0;
+ }
+ else
+ {
+ s8 sign;
+ if (!(sprite->data[2] & 1))
+ sign = 1;
+ else
+ sign = -1;
+
+ sprite->pos2.x = Sin((sprite->data[2] * 128 / 40) % 256, 12) * sign;
+ }
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_61(struct Sprite *sprite)
+{
+ sprite->data[0] = 70;
+ sprite->data[7] = 6;
+ sub_8183140(sprite);
+ sprite->callback = sub_8183140;
+}
+
+static void pokemonanimfunc_62(struct Sprite *sprite)
+{
+ sprite->data[0] = 24;
+ sprite->data[7] = 6;
+ sub_8183574(sprite);
+ sprite->callback = sub_8183574;
+}
+
+static void pokemonanimfunc_63(struct Sprite *sprite)
+{
+ sprite->data[0] = 56;
+ sprite->data[7] = 9;
+ sub_8183574(sprite);
+ sprite->callback = sub_8183574;
+}
+
+static void pokemonanimfunc_64(struct Sprite *sprite)
+{
+ u8 id = sprite->data[0] = sub_817F758();
+
+ sUnknown_03001240[id].field_6 = 1024;
+ sUnknown_03001240[id].field_8 = 6;
+ sUnknown_03001240[id].field_2 = 24;
+ sub_817FFF0(sprite);
+ sprite->callback = sub_817FFF0;
+}
+
+static void sub_81837DC(struct Sprite *sprite)
+{
+ s16 index1 = 0, index2 = 0;
+ if (sprite->data[5] > sprite->data[6])
+ {
+ sprite->pos2.y = 0;
+ sprite->data[5] = 0;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ if (sprite->data[4] <= 1)
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[4]--;
+ sprite->data[7] = 0;
+ }
+ }
+ else
+ {
+ u8 amplitude, cmpVal1, cmpVal2;
+ s16 xScale, yScale;
+
+ index2 = (sprite->data[5] * 128) / sprite->data[6];
+ cmpVal1 = sprite->data[6] / 4;
+ cmpVal2 = cmpVal1 * 3;
+ if (sprite->data[5] >= cmpVal1 && sprite->data[5] < cmpVal2)
+ {
+ sprite->data[7] += 51;
+ index1 = sprite->data[7] & 0xFF;
+ }
+
+ amplitude = sprite->data[3];
+
+ if (sprite->data[1] == 0)
+ xScale = Sin(index2, amplitude) + (Sin(index1, amplitude / 5 * 2) - 256);
+ else
+ xScale = 256 - Sin(index1, amplitude / 5 * 2) - Sin(index2, amplitude);
+
+ yScale = 256 - Sin(index1, amplitude / 5) - Sin(index2, amplitude);
+ SetAffineData(sprite, xScale, yScale, 0);
+ sprite->data[5]++;
+ }
+}
+
+static void pokemonanimfunc_65(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ HandleStartAffineAnim(sprite);
+ sprite->data[4] = 1;
+ sprite->data[6] = 40;
+ sprite->data[3] = 40;
+ sprite->data[5] = 0;
+ sprite->data[7] = 0;
+ }
+
+ sub_81837DC(sprite);
+}
+
+static void pokemonanimfunc_66(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] > 2048)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->data[6] = 0;
+ }
+ else
+ {
+ s16 divCase = (sprite->data[2] / 512) % 4;
+ switch (divCase)
+ {
+ case 0:
+ sprite->pos2.x = (sprite->data[2] % 512) / 32;
+ break;
+ case 2:
+ sprite->pos2.x = -(sprite->data[2] % 512 * 16) / 512;
+ break;
+ case 1:
+ sprite->pos2.x = -(sprite->data[2] % 512 * 16) / 512 + 16;
+ break;
+ case 3:
+ sprite->pos2.x = (sprite->data[2] % 512) / 32 - 16;
+ break;
+ }
+
+ sprite->pos2.y = Sin(sprite->data[2] % 128, 4);
+ sprite->data[2] += 48;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_67(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] > 2048)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->data[6] = 0;
+ }
+ else
+ {
+ s16 divCase = (sprite->data[2] / 512) % 4;
+ switch (divCase)
+ {
+ case 0:
+ sprite->pos2.x = (sprite->data[2] % 512) / 32;
+ break;
+ case 2:
+ sprite->pos2.x = -(sprite->data[2] % 512 * 16) / 512;
+ break;
+ case 1:
+ sprite->pos2.x = -(sprite->data[2] % 512 * 16) / 512 + 16;
+ break;
+ case 3:
+ sprite->pos2.x = (sprite->data[2] % 512) / 32 - 16;
+ break;
+ }
+
+ sprite->pos2.y = Sin(sprite->data[2] % 96, 4);
+ sprite->data[2] += 64;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static const s8 sUnknown_0860ADBE[][3] =
+{
+// x y timer
+ {1, 1, 12},
+ {-2, 0, 12},
+ {1, -1, 12},
+ {0, 0, 0}
+};
+
+static void sub_8183B4C(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] == 0)
+ sprite->data[3] = 0;
+
+ if (sUnknown_0860ADBE[sprite->data[3]][2] / sprite->data[5] == sprite->data[2])
+ {
+ sprite->data[3]++;
+ sprite->data[2] = 0;
+ }
+
+ if (sUnknown_0860ADBE[sprite->data[3]][2] / sprite->data[5] == 0)
+ {
+ if (--sprite->data[6] == 0)
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ else
+ sprite->data[2] = 0;
+ }
+ else
+ {
+ s32 amplitude = sprite->data[5];
+ sprite->pos2.x += (sUnknown_0860ADBE[sprite->data[3]][0] * amplitude);
+ sprite->pos2.y += (sUnknown_0860ADBE[sprite->data[3]][1] * sprite->data[5]); // what's the point of the var if you're not reusing it?
+ sprite->data[2]++;
+ sub_817F70C(sprite);
+ }
+}
+
+static void pokemonanimfunc_68(struct Sprite *sprite)
+{
+ sprite->data[5] = 1;
+ sprite->data[6] = 1;
+ sub_8183B4C(sprite);
+ sprite->callback = sub_8183B4C;
+}
+
+static void pokemonanimfunc_69(struct Sprite *sprite)
+{
+ sprite->data[5] = 2;
+ sprite->data[6] = 1;
+ sub_8183B4C(sprite);
+ sprite->callback = sub_8183B4C;
+}
+
+static void pokemonanimfunc_6A(struct Sprite *sprite)
+{
+ sprite->data[5] = 2;
+ sprite->data[6] = 2;
+ sub_8183B4C(sprite);
+ sprite->callback = sub_8183B4C;
+}
+
+static void sub_8183C6C(struct Sprite *sprite)
+{
+ if (sprite->data[7] > 255)
+ {
+ if (sprite->data[5] <= 1)
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ }
+ else
+ {
+ sprite->data[5]--;
+ sprite->data[7] = 0;
+ }
+ }
+ else
+ {
+ s16 scale;
+
+ sprite->data[7] += sprite->data[6];
+ if (sprite->data[7] > 256)
+ sprite->data[7] = 256;
+
+ scale = Sin(sprite->data[7] / 2, 64);
+ HandleSetAffineData(sprite, 256 - scale, 256 - scale, 0);
+ }
+}
+
+static void pokemonanimfunc_6B(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ sprite->data[7] = 0;
+ sprite->data[6] = 4;
+ sprite->data[5] = 1;
+ }
+
+ sub_8183C6C(sprite);
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_6C(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ sprite->data[7] = 0;
+ sprite->data[6] = 8;
+ sprite->data[5] = 2;
+ }
+
+ sub_8183C6C(sprite);
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_6D(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ sprite->data[7] = 0;
+ sprite->data[6] = 8;
+ sprite->data[5] = 512;
+ sprite->data[4] = 16;
+ }
+
+ sub_8182764(sprite);
+}
+
+static void pokemonanimfunc_6E(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ sprite->data[7] = 0;
+ sprite->data[6] = 4;
+ sprite->data[5] = 256;
+ sprite->data[4] = 16;
+ }
+
+ sub_8182764(sprite);
+}
+
+static void pokemonanimfunc_6F(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ sprite->data[7] = 0;
+ sprite->data[6] = 8;
+ sprite->data[5] = 512;
+ sprite->data[4] = 16;
+ }
+
+ sub_8182830(sprite);
+}
+
+static void pokemonanimfunc_70(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[2]++;
+ sprite->data[7] = 0;
+ sprite->data[6] = 8;
+ sprite->data[5] = 512;
+ sprite->data[4] = 8;
+ }
+
+ sub_8182830(sprite);
+}
+
+static void pokemonanimfunc_71(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[7] = 5;
+ sprite->data[6] = 8;
+ }
+
+ sub_8180828(sprite);
+}
+
+static void pokemonanimfunc_72(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[7] = 3;
+ sprite->data[6] = 4;
+ }
+
+ sub_8180828(sprite);
+}
+
+static void pokemonanimfunc_73(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ HandleStartAffineAnim(sprite);
+ sprite->data[4] = 1;
+ sprite->data[6] = 30;
+ sprite->data[3] = 60;
+ sprite->data[7] = 0;
+ }
+
+ sub_81832C8(sprite);
+}
+
+static void pokemonanimfunc_74(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ HandleStartAffineAnim(sprite);
+ sprite->data[4] = 2;
+ sprite->data[6] = 20;
+ sprite->data[3] = 70;
+ sprite->data[7] = 0;
+ }
+
+ sub_81832C8(sprite);
+}
+
+static void pokemonanimfunc_75(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ HandleStartAffineAnim(sprite);
+ sprite->data[4] = 2;
+ sprite->data[6] = 20;
+ sprite->data[3] = 70;
+ sprite->data[5] = 0;
+ sprite->data[7] = 0;
+ }
+
+ sub_8183418(sprite);
+}
+
+static void pokemonanimfunc_76(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ HandleStartAffineAnim(sprite);
+ sprite->data[4] = 1;
+ sprite->data[6] = 30;
+ sprite->data[3] = 60;
+ sprite->data[5] = 0;
+ sprite->data[7] = 0;
+ }
+
+ sub_8183418(sprite);
+}
+
+static void pokemonanimfunc_77(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ HandleStartAffineAnim(sprite);
+ sprite->data[4] = 2;
+ sprite->data[6] = 20;
+ sprite->data[3] = 70;
+ sprite->data[5] = 0;
+ sprite->data[7] = 0;
+ }
+
+ sub_81837DC(sprite);
+}
+
+static void pokemonanimfunc_78(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ HandleStartAffineAnim(sprite);
+ sprite->data[4] = 1;
+ sprite->data[6] = 30;
+ sprite->data[3] = 60;
+ sprite->data[5] = 0;
+ sprite->data[7] = 0;
+ }
+
+ sub_81837DC(sprite);
+}
+
+static void sub_8183FA8(struct Sprite *sprite)
+{
+ if (sprite->data[7] > 255)
+ {
+ if (sprite->data[6] <= 1)
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ }
+ else
+ {
+ sprite->data[7] %= 256;
+ sprite->data[6]--;
+ }
+ }
+ else
+ {
+ sprite->pos2.x = -(Sin(sprite->data[7], sprite->data[5]));
+ sprite->pos2.y = Sin((sprite->data[7] + 192) % 256, sprite->data[4]);
+ if (sprite->pos2.y > 0)
+ sprite->pos2.y *= -1;
+
+ sprite->pos2.y += sprite->data[4];
+ sprite->data[7] += sprite->data[3];
+ }
+}
+
+static void pokemonanimfunc_79(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ sprite->data[6] = 1;
+ sprite->data[7] = 0;
+ sprite->data[5] = 12;
+ sprite->data[4] = 12;
+ sprite->data[3] = 4;
+ }
+
+ sub_8183FA8(sprite);
+}
+
+static void pokemonanimfunc_7A(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ sprite->data[6] = 1;
+ sprite->data[7] = 0;
+ sprite->data[5] = 12;
+ sprite->data[4] = 12;
+ sprite->data[3] = 6;
+ }
+
+ sub_8183FA8(sprite);
+}
+
+static void pokemonanimfunc_7B(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ sprite->data[6] = 2;
+ sprite->data[7] = 0;
+ sprite->data[5] = 12;
+ sprite->data[4] = 12;
+ sprite->data[3] = 8;
+ }
+
+ sub_8183FA8(sprite);
+}
+
+static void sub_81840C4(struct Sprite *sprite)
+{
+ if (sprite->data[7] > 256)
+ {
+ if (sprite->data[6] <= sprite->data[4])
+ {
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[4]++;
+ sprite->data[7] = 0;
+ }
+
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ }
+ else
+ {
+ s16 posX;
+
+ if (sprite->data[7] > 159)
+ {
+ if (sprite->data[7] > 256)
+ sprite->data[7] = 256;
+
+ sprite->pos2.y = -(Sin(sprite->data[7] % 256, 8));
+ }
+ else if (sprite->data[7] > 95)
+ {
+ sprite->pos2.y = Sin(96, 6) - Sin((sprite->data[7] - 96) * 2, 4);
+ }
+ else
+ {
+ sprite->pos2.y = Sin(sprite->data[7], 6);
+ }
+
+ posX = -(Sin(sprite->data[7] / 2, sprite->data[5]));
+ if (sprite->data[4] % 2 == 0)
+ posX *= -1;
+
+ sprite->pos2.x = posX;
+ sprite->data[7] += sprite->data[3];
+ }
+}
+
+static void pokemonanimfunc_7C(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ sprite->data[6] = 2;
+ sprite->data[7] = 0;
+ sprite->data[5] = 16;
+ sprite->data[4] = 1;
+ sprite->data[3] = 4;
+ }
+
+ sub_81840C4(sprite);
+}
+
+static void pokemonanimfunc_7D(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ sprite->data[6] = 2;
+ sprite->data[7] = 0;
+ sprite->data[5] = 16;
+ sprite->data[4] = 1;
+ sprite->data[3] = 6;
+ }
+
+ sub_81840C4(sprite);
+}
+
+static void pokemonanimfunc_7E(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ sprite->data[6] = 3;
+ sprite->data[7] = 0;
+ sprite->data[5] = 16;
+ sprite->data[4] = 1;
+ sprite->data[3] = 8;
+ }
+
+ sub_81840C4(sprite);
+}
+
+static void pokemonanimfunc_7F(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ sprite->data[6] = 1;
+ sprite->data[7] = 0;
+ sprite->data[5] = 4;
+ sprite->data[4] = 6;
+ sprite->data[3] = 4;
+ }
+
+ sub_8183FA8(sprite);
+}
+
+static void pokemonanimfunc_80(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ sprite->data[6] = 1;
+ sprite->data[7] = 0;
+ sprite->data[5] = 4;
+ sprite->data[4] = 6;
+ sprite->data[3] = 6;
+ }
+
+ sub_8183FA8(sprite);
+}
+
+static void pokemonanimfunc_81(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[2] = 1;
+ sprite->data[6] = 2;
+ sprite->data[7] = 0;
+ sprite->data[5] = 4;
+ sprite->data[4] = 6;
+ sprite->data[3] = 8;
+ }
+
+ sub_8183FA8(sprite);
+}
+
+static void sub_8184290(struct Sprite *sprite)
+{
+ u16 index = Sin((sprite->data[2] * 128) / sprite->data[7], sprite->data[5]);
+ sprite->data[6] = -(index << 8);
+ sub_817F3F0(sprite, index, sprite->data[4], 0);
+ HandleSetAffineData(sprite, 256, 256, sprite->data[6]);
+}
+
+static void pokemonanimfunc_82(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[7] = 60;
+ sprite->data[5] = 8;
+ sprite->data[4] = -32;
+ sprite->data[3] = 1;
+ sprite->data[0] = 0;
+ }
+
+ if (sprite->data[2] > sprite->data[7])
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->data[0]++;
+ if (sprite->data[3] <= sprite->data[0])
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ return;
+ }
+ else
+ {
+ sprite->data[2] = 0;
+ }
+ }
+ else
+ {
+ sub_8184290(sprite);
+ }
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_83(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[7] = 90;
+ sprite->data[5] = 8;
+ sprite->data[4] = -32;
+ sprite->data[3] = 1;
+ sprite->data[0] = 0;
+ }
+
+ if (sprite->data[2] > sprite->data[7])
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->data[0]++;
+ if (sprite->data[3] <= sprite->data[0])
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ return;
+ }
+ else
+ {
+ sprite->data[2] = 0;
+ }
+ }
+ else
+ {
+ sub_8184290(sprite);
+ }
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_84(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->data[7] = 30;
+ sprite->data[5] = 8;
+ sprite->data[4] = -32;
+ sprite->data[3] = 2;
+ sprite->data[0] = 0;
+ }
+
+ if (sprite->data[2] > sprite->data[7])
+ {
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->data[0]++;
+ if (sprite->data[3] <= sprite->data[0])
+ {
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ return;
+ }
+ else
+ {
+ sprite->data[2] = 0;
+ }
+ }
+ else
+ {
+ sub_8184290(sprite);
+ }
+
+ sprite->data[2]++;
+}
+
+static void sub_8184468(struct Sprite *sprite)
+{
+ if (sprite->data[2] > sprite->data[7])
+ {
+ sprite->pos2.y = 0;
+ HandleSetAffineData(sprite, 256, 256, 0);
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ u8 posY_unsigned;
+ s8 posY_signed;
+ s32 posY;
+ s16 index = (u16)(sprite->data[2] % sprite->data[6] * 256) / sprite->data[6] % 256;
+ if (sprite->data[2] % 2 == 0)
+ {
+ sprite->data[4] = Sin(index, 32) + 256;
+ sprite->data[5] = Sin(index, 32) + 256;
+ posY_unsigned = Sin(index, 32);
+ posY_signed = posY_unsigned;
+ }
+ else
+ {
+ sprite->data[4] = Sin(index, 8) + 256;
+ sprite->data[5] = Sin(index, 8) + 256;
+ posY_unsigned = Sin(index, 8);
+ posY_signed = posY_unsigned;
+ }
+
+ posY = posY_signed;
+ if (posY < 0)
+ posY += 7;
+ sprite->pos2.y = (u32)(posY) >> 3;
+ HandleSetAffineData(sprite, sprite->data[4], sprite->data[5], 0);
+ }
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_85(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->pos2.y += 2;
+ sprite->data[6] = 40;
+ sprite->data[7] = 80;
+ }
+
+ sub_8184468(sprite);
+}
+
+static void pokemonanimfunc_86(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->pos2.y += 2;
+ sprite->data[6] = 40;
+ sprite->data[7] = 40;
+ }
+
+ sub_8184468(sprite);
+}
+
+static void pokemonanimfunc_87(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ HandleStartAffineAnim(sprite);
+ sprite->pos2.y += 2;
+ sprite->data[6] = 80;
+ sprite->data[7] = 80;
+ }
+
+ sub_8184468(sprite);
+}
+
+static void sub_8184610(struct Sprite *sprite);
+static void sub_8184640(struct Sprite *sprite);
+static void sub_8184678(struct Sprite *sprite);
+static void sub_81846B8(struct Sprite *sprite);
+
+static void sub_81845D4(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->pos2.x -= sprite->data[2];
+ if (sprite->pos2.x <= -sprite->data[6])
+ {
+ sprite->pos2.x = -sprite->data[6];
+ sprite->data[7] = 2;
+ sprite->callback = sub_8184610;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8184610(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->pos2.x += sprite->data[7];
+ sprite->data[7]++;
+ if (sprite->pos2.x >= 0)
+ sprite->callback = sub_8184640;
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8184640(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->pos2.x += sprite->data[7];
+ sprite->data[7]++;
+ if (sprite->pos2.x > sprite->data[6])
+ {
+ sprite->pos2.x = sprite->data[6];
+ sprite->callback = sub_8184678;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_8184678(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ if (sprite->data[3] >= sprite->data[5])
+ {
+ sprite->callback = sub_81846B8;
+ }
+ else
+ {
+ sprite->pos2.x += sprite->data[4];
+ sprite->data[4] *= -1;
+ sprite->data[3]++;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void sub_81846B8(struct Sprite *sprite)
+{
+ sub_817F70C(sprite);
+ sprite->pos2.x -= 2;
+ if (sprite->pos2.x <= 0)
+ {
+ sprite->pos2.x = 0;
+ sub_817F77C(sprite);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+
+ sub_817F70C(sprite);
+}
+
+static void pokemonanimfunc_88(struct Sprite *sprite)
+{
+ HandleStartAffineAnim(sprite);
+ sprite->data[7] = 4;
+ sprite->data[6] = 12;
+ sprite->data[5] = 16;
+ sprite->data[4] = 4;
+ sprite->data[3] = 0;
+ sprite->data[2] = 2;
+ sprite->callback = sub_81845D4;
+}
+
+static void pokemonanimfunc_89(struct Sprite *sprite)
+{
+ HandleStartAffineAnim(sprite);
+ sprite->data[7] = 2;
+ sprite->data[6] = 8;
+ sprite->data[5] = 12;
+ sprite->data[4] = 2;
+ sprite->data[3] = 0;
+ sprite->data[2] = 1;
+ sprite->callback = sub_81845D4;
+}
+
+static void pokemonanimfunc_8A(struct Sprite *sprite)
+{
+ HandleStartAffineAnim(sprite);
+ sprite->data[7] = 0;
+ sprite->data[6] = 6;
+ sprite->data[5] = 6;
+ sprite->data[4] = 2;
+ sprite->data[3] = 0;
+ sprite->data[2] = 1;
+ sprite->callback = sub_81845D4;
+}
+
+static void sub_8184770(struct Sprite *sprite)
+{
+ sprite->pos2.x = sprite->data[1];
+ if (sprite->data[0] > 1)
+ {
+ sprite->data[1] *= -1;
+ sprite->data[0] = 0;
+ }
+ else
+ {
+ sprite->data[0]++;
+ }
+}
+
+struct YellowBlendStruct
+{
+ u8 field_0;
+ u8 field_1;
+};
+
+static const struct YellowBlendStruct sUnknown_0860ADCC[] =
+{
+ {0, 1},
+ {1, 2},
+ {0, 15},
+ {1, 1},
+ {0, 15},
+ {1, 1},
+ {0, 15},
+ {1, 1},
+ {0, 1},
+ {1, 1},
+ {0, 1},
+ {1, 1},
+ {0, 1},
+ {1, 1},
+ {0, 1},
+ {1, 1},
+ {0, 1},
+ {1, 1},
+ {0, 1},
+ {0, 0xFF}
+};
+
+static const struct YellowBlendStruct sUnknown_0860AE1C[] =
+{
+ {0, 5},
+ {1, 1},
+ {0, 15},
+ {1, 4},
+ {0, 2},
+ {1, 2},
+ {0, 2},
+ {1, 2},
+ {0, 2},
+ {1, 2},
+ {0, 2},
+ {1, 2},
+ {0, 2},
+ {0, 0xFF}
+};
+
+static const struct YellowBlendStruct sUnknown_0860AE54[] =
+{
+ {0, 1},
+ {1, 1},
+ {0, 20},
+ {1, 1},
+ {0, 20},
+ {1, 1},
+ {0, 20},
+ {1, 1},
+ {0, 1},
+ {0, 0xFF}
+};
+
+static const struct YellowBlendStruct *const sUnknown_0860AE7C[] =
+{
+ sUnknown_0860ADCC,
+ sUnknown_0860AE1C,
+ sUnknown_0860AE54
+};
+
+static void BackAnimBlendYellow(struct Sprite *sprite)
+{
+ const struct YellowBlendStruct *array = sUnknown_0860AE7C[sprite->data[3]];
+ sub_8184770(sprite);
+ if (array[sprite->data[6]].field_1 == 0xFF)
+ {
+ sprite->pos2.x = 0;
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ if (sprite->data[4] == 1)
+ {
+ if (array[sprite->data[6]].field_0 != 0)
+ BlendPalette(sprite->data[7], 0x10, 0x10, RGB_YELLOW);
+ else
+ BlendPalette(sprite->data[7], 0x10, 0, RGB_YELLOW);
+
+ sprite->data[4] = 0;
+ }
+
+ if (array[sprite->data[6]].field_1 == sprite->data[5])
+ {
+ sprite->data[4] = 1;
+ sprite->data[5] = 0;
+ sprite->data[6]++;
+ }
+ else
+ {
+ sprite->data[5]++;
+ }
+ }
+}
+
+static void pokemonanimfunc_8B(struct Sprite *sprite)
+{
+ if (++sprite->data[2] == 1)
+ {
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+ sprite->data[6] = 0;
+ sprite->data[5] = 0;
+ sprite->data[4] = 0;
+ sprite->data[3] = 0;
+ }
+
+ BackAnimBlendYellow(sprite);
+}
+
+static void pokemonanimfunc_8C(struct Sprite *sprite)
+{
+ if (++sprite->data[2] == 1)
+ {
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+ sprite->data[6] = 0;
+ sprite->data[5] = 0;
+ sprite->data[4] = 0;
+ sprite->data[3] = 1;
+ }
+
+ BackAnimBlendYellow(sprite);
+}
+
+static void pokemonanimfunc_8D(struct Sprite *sprite)
+{
+ if (++sprite->data[2] == 1)
+ {
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+ sprite->data[6] = 0;
+ sprite->data[5] = 0;
+ sprite->data[4] = 0;
+ sprite->data[3] = 2;
+ }
+
+ BackAnimBlendYellow(sprite);
+}
+
+static void BackAnimBlend(struct Sprite *sprite)
+{
+ static const u16 sColors[] =
+ {
+ RGB_RED, RGB_GREEN, RGB_BLUE, RGB_BLACK
+ };
+
+ if (sprite->data[2] > 127)
+ {
+ BlendPalette(sprite->data[7], 0x10, 0, RGB_RED);
+ sprite->callback = SpriteCB_SetDummyOnAnimEnd;
+ }
+ else
+ {
+ sprite->data[6] = Sin(sprite->data[2], 12);
+ BlendPalette(sprite->data[7], 0x10, sprite->data[6], sColors[sprite->data[1]]);
+ }
+}
+
+static void sub_8184934(struct Sprite *sprite)
+{
+ if (sprite->data[3] < sprite->data[4])
+ {
+ sub_817F70C(sprite);
+ if (sprite->data[5] > sprite->data[0])
+ {
+ if (++sprite->data[3] < sprite->data[4])
+ sprite->data[5] = 0;
+
+ sprite->pos2.x = 0;
+ }
+ else
+ {
+ s8 sign = 1 - (sprite->data[3] % 2 * 2);
+ sprite->pos2.x = sign * Sin((sprite->data[5] * 384 / sprite->data[0]) % 256, 6);
+ sprite->data[5]++;
+ }
+
+ sub_817F70C(sprite);
+ }
+}
+
+static void pokemonanimfunc_8E(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+ sprite->data[0] = 10;
+ sprite->data[5] = 0;
+ sprite->data[4] = 2;
+ sprite->data[3] = 0;
+ sprite->data[1] = 0;
+ }
+
+ if (sprite->data[2] % 2 == 0)
+ BackAnimBlend(sprite);
+
+ if (sprite->data[2] >= (128 - sprite->data[0] * sprite->data[4]) / 2)
+ sub_8184934(sprite);
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_8F(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+ sprite->data[0] = 20;
+ sprite->data[5] = 0;
+ sprite->data[4] = 1;
+ sprite->data[3] = 0;
+ sprite->data[1] = 0;
+ }
+
+ if (sprite->data[2] % 2 == 0)
+ BackAnimBlend(sprite);
+
+ if (sprite->data[2] >= (128 - sprite->data[0] * sprite->data[4]) / 2)
+ sub_8184934(sprite);
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_90(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+ sprite->data[0] = 80;
+ sprite->data[5] = 0;
+ sprite->data[4] = 1;
+ sprite->data[3] = 0;
+ sprite->data[1] = 0;
+ }
+
+ if (sprite->data[2] % 2 == 0)
+ BackAnimBlend(sprite);
+
+ if (sprite->data[2] >= (128 - sprite->data[0] * sprite->data[4]) / 2)
+ sub_8184934(sprite);
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_91(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+ sprite->data[0] = 10;
+ sprite->data[5] = 0;
+ sprite->data[4] = 2;
+ sprite->data[3] = 0;
+ sprite->data[1] = 1;
+ }
+
+ if (sprite->data[2] % 2 == 0)
+ BackAnimBlend(sprite);
+
+ if (sprite->data[2] >= (128 - sprite->data[0] * sprite->data[4]) / 2)
+ sub_8184934(sprite);
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_92(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+ sprite->data[0] = 20;
+ sprite->data[5] = 0;
+ sprite->data[4] = 1;
+ sprite->data[3] = 0;
+ sprite->data[1] = 1;
+ }
+
+ if (sprite->data[2] % 2 == 0)
+ BackAnimBlend(sprite);
+
+ if (sprite->data[2] >= (128 - sprite->data[0] * sprite->data[4]) / 2)
+ sub_8184934(sprite);
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_93(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+ sprite->data[0] = 80;
+ sprite->data[5] = 0;
+ sprite->data[4] = 1;
+ sprite->data[3] = 0;
+ sprite->data[1] = 1;
+ }
+
+ if (sprite->data[2] % 2 == 0)
+ BackAnimBlend(sprite);
+
+ if (sprite->data[2] >= (128 - sprite->data[0] * sprite->data[4]) / 2)
+ sub_8184934(sprite);
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_94(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+ sprite->data[0] = 10;
+ sprite->data[5] = 0;
+ sprite->data[4] = 2;
+ sprite->data[3] = 0;
+ sprite->data[1] = 2;
+ }
+
+ if (sprite->data[2] % 2 == 0)
+ BackAnimBlend(sprite);
+
+ if (sprite->data[2] >= (128 - sprite->data[0] * sprite->data[4]) / 2)
+ sub_8184934(sprite);
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_95(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+ sprite->data[0] = 20;
+ sprite->data[5] = 0;
+ sprite->data[4] = 1;
+ sprite->data[3] = 0;
+ sprite->data[1] = 2;
+ }
+
+ if (sprite->data[2] % 2 == 0)
+ BackAnimBlend(sprite);
+
+ if (sprite->data[2] >= (128 - sprite->data[0] * sprite->data[4]) / 2)
+ sub_8184934(sprite);
+
+ sprite->data[2]++;
+}
+
+static void pokemonanimfunc_96(struct Sprite *sprite)
+{
+ if (sprite->data[2] == 0)
+ {
+ sprite->data[7] = (sprite->oam.paletteNum * 16) + 256;
+ sprite->data[0] = 80;
+ sprite->data[5] = 0;
+ sprite->data[4] = 1;
+ sprite->data[3] = 0;
+ sprite->data[1] = 2;
+ }
+
+ if (sprite->data[2] % 2 == 0)
+ BackAnimBlend(sprite);
+
+ if (sprite->data[2] >= (128 - sprite->data[0] * sprite->data[4]) / 2)
+ sub_8184934(sprite);
+
+ sprite->data[2]++;
+}
+
+static void SpriteCB_SetDummyOnAnimEnd(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ sprite->callback = SpriteCallbackDummy;
+}
diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c
index 5ec5410ca..4e5c9dca9 100644
--- a/src/pokemon_summary_screen.c
+++ b/src/pokemon_summary_screen.c
@@ -162,7 +162,7 @@ extern struct BattleMove gBattleMoves[];
extern u32 ChangeBgX(u8 bg, u32 value, u8 op);
extern void sub_8199C30(u8 a, u8 b, u8 c, u8 d, u8 e, u8 f);
-extern void AddTextPrinterParametrized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, struct TextColor* colors, s8 speed, u8 *str);
+extern void AddTextPrinterParameterized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, struct TextColor* colors, s8 speed, u8 *str);
extern s32 GetStringCenterAlignXOffset(u8 fontId, u8 *str, s32 totalWidth);
extern s32 GetStringRightAlignXOffset(u8 fontId, u8 *str, s32 totalWidth);
extern bool8 sub_81A6BF4();
@@ -2557,7 +2557,7 @@ void sub_81C2554()
void sub_81C25A4(u8 a, u8 *b, u8 c, u8 d, u8 e, u8 f)
{
- AddTextPrinterParametrized2(a, 1, c, d, 0, e, &gUnknown_0861CD2C[f], 0, b);
+ AddTextPrinterParameterized2(a, 1, c, d, 0, e, &gUnknown_0861CD2C[f], 0, b);
}
void sub_81C25E8()
diff --git a/src/reshow_battle_screen.c b/src/reshow_battle_screen.c
index 32c85a5ee..0e1c9dcfe 100644
--- a/src/reshow_battle_screen.c
+++ b/src/reshow_battle_screen.c
@@ -3,7 +3,7 @@
#include "battle.h"
#include "palette.h"
#include "main.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "text.h"
#include "gpu_regs.h"
#include "bg.h"
@@ -34,7 +34,7 @@ extern struct SpriteTemplate gUnknown_0202499C;
extern const union AnimCmd * const * const gMonAnimationsSpriteAnimsPtrTable[];
-extern void dp12_8087EA4(void);
+extern void ScanlineEffect_Clear(void);
extern void sub_8035658(void);
extern bool8 IsDoubleBattle(void);
extern u8 GetSubstituteSpriteDefault_Y(u8 bank);
@@ -72,7 +72,7 @@ static void CB2_ReshowBattleScreenAfterMenu(void)
switch (gBattleScripting.reshowMainState)
{
case 0:
- dp12_8087EA4();
+ ScanlineEffect_Clear();
sub_8035658();
SetBgAttribute(1, BG_CTRL_ATTR_VISIBLE, 0);
SetBgAttribute(2, BG_CTRL_ATTR_VISIBLE, 0);
diff --git a/src/save.c b/src/save.c
index 023ca6870..8d77e801a 100644
--- a/src/save.c
+++ b/src/save.c
@@ -4,13 +4,68 @@
#include "constants/game_stat.h"
#include "task.h"
+// for the chunk declarations
+extern struct SaveBlock2 gSaveblock2;
+extern struct SaveBlock1 gSaveblock1;
+extern struct PokemonStorage gPokemonStorage;
+
extern struct SaveSectionLocation gRamSaveSectionLocations[0xE];
extern u8 gDecompressionBuffer[];
extern u32 gFlashMemoryPresent;
extern u16 gUnknown_03006294;
extern bool8 gSoftResetDisabled;
-extern const struct SaveSectionOffsets gSaveSectionOffsets[0xE];
+// Divide save blocks into individual chunks to be written to flash sectors
+
+// Each 4 KiB flash sector contains 3968 bytes of actual data followed by a 128 byte footer
+#define SECTOR_DATA_SIZE 3968
+#define SECTOR_FOOTER_SIZE 128
+
+/*
+ * Sector Layout:
+ *
+ * Sectors 0 - 13: Save Slot 1
+ * Sectors 14 - 27: Save Slot 2
+ * Sectors 28 - 29: Hall of Fame
+ * Sector 30: e-Reader/Mystery Gift Stuff (note: e-Reader is deprecated in Emerald US)
+ * Sector 31: Recorded Battle
+ *
+ * There are two save slots for saving the player's game data. We alternate between
+ * them each time the game is saved, so that if the current save slot is corrupt,
+ * we can load the previous one. We also rotate the sectors in each save slot
+ * so that the same data is not always being written to the same sector. This
+ * might be done to reduce wear on the flash memory, but I'm not sure, since all
+ * 14 sectors get written anyway.
+ */
+
+// (u8 *)structure was removed from the first statement of the macro in Emerald.
+// This is because malloc is used to allocate addresses so storing the raw
+// addresses should not be done in the offsets information.
+#define SAVEBLOCK_CHUNK(structure, chunkNum) \
+{ \
+ chunkNum * SECTOR_DATA_SIZE, \
+ min(sizeof(structure) - chunkNum * SECTOR_DATA_SIZE, SECTOR_DATA_SIZE) \
+} \
+
+const struct SaveSectionOffsets gSaveSectionOffsets[] =
+{
+ SAVEBLOCK_CHUNK(gSaveblock2, 0),
+
+ SAVEBLOCK_CHUNK(gSaveblock1, 0),
+ SAVEBLOCK_CHUNK(gSaveblock1, 1),
+ SAVEBLOCK_CHUNK(gSaveblock1, 2),
+ SAVEBLOCK_CHUNK(gSaveblock1, 3),
+
+ SAVEBLOCK_CHUNK(gPokemonStorage, 0),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 1),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 2),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 3),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 4),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 5),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 6),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 7),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 8),
+};
extern void DoSaveFailedScreen(u8); // save_failed_screen
extern void LoadSerializedGame(void); // load_save
diff --git a/src/save_failed_screen.c b/src/save_failed_screen.c
index 8764daa5f..95897e721 100644
--- a/src/save_failed_screen.c
+++ b/src/save_failed_screen.c
@@ -173,7 +173,7 @@ static void SaveFailedScreenTextPrint(u8 *text, u8 var1, u8 var2)
color.fgColor = 0;
color.bgColor = 15;
color.shadowColor = 3;
- AddTextPrinterParametrized2(gSaveFailedWindowIds[TEXT_WIN_ID], 1, var1 * 8, var2 * 8 + 1, 0, 0, &color, 0, text);
+ AddTextPrinterParameterized2(gSaveFailedWindowIds[TEXT_WIN_ID], 1, var1 * 8, var2 * 8 + 1, 0, 0, &color, 0, text);
}
void DoSaveFailedScreen(u8 saveType)
diff --git a/src/scanline_effect.c b/src/scanline_effect.c
new file mode 100644
index 000000000..148e053fc
--- /dev/null
+++ b/src/scanline_effect.c
@@ -0,0 +1,262 @@
+#include "global.h"
+#include "data2.h"
+#include "task.h"
+#include "trig.h"
+#include "scanline_effect.h"
+
+static void CopyValue16Bit(void);
+static void CopyValue32Bit(void);
+
+extern u16 gBattle_BG0_Y;
+extern u16 gBattle_BG0_X;
+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;
+
+// EWRAM vars
+
+// Per-scanline register values.
+// This is double buffered so that it can be safely written to at any time
+// without overwriting the buffer that the DMA is currently reading
+EWRAM_DATA u16 gScanlineEffectRegBuffers[2][0x3C0] = {0};
+
+EWRAM_DATA struct ScanlineEffect gScanlineEffect = {0};
+EWRAM_DATA static bool8 sShouldStopWaveTask = FALSE;
+
+void ScanlineEffect_Stop(void)
+{
+ gScanlineEffect.state = 0;
+ DmaStop(0);
+ if (gScanlineEffect.waveTaskId != 0xFF)
+ {
+ DestroyTask(gScanlineEffect.waveTaskId);
+ gScanlineEffect.waveTaskId = 0xFF;
+ }
+}
+
+void ScanlineEffect_Clear(void)
+{
+ CpuFill16(0, gScanlineEffectRegBuffers, sizeof(gScanlineEffectRegBuffers));
+ gScanlineEffect.dmaSrcBuffers[0] = NULL;
+ gScanlineEffect.dmaSrcBuffers[1] = NULL;
+ gScanlineEffect.dmaDest = NULL;
+ gScanlineEffect.dmaControl = 0;
+ gScanlineEffect.srcBuffer = 0;
+ gScanlineEffect.state = 0;
+ gScanlineEffect.unused16 = 0;
+ gScanlineEffect.unused17 = 0;
+ gScanlineEffect.waveTaskId = 0xFF;
+}
+
+void ScanlineEffect_SetParams(struct ScanlineEffectParams params)
+{
+ if (params.dmaControl == SCANLINE_EFFECT_DMACNT_16BIT) // 16-bit
+ {
+ // Set the DMA src to the value for the second scanline because the
+ // first DMA transfer occurs in HBlank *after* the first scanline is drawn
+ gScanlineEffect.dmaSrcBuffers[0] = (u16 *)gScanlineEffectRegBuffers[0] + 1;
+ gScanlineEffect.dmaSrcBuffers[1] = (u16 *)gScanlineEffectRegBuffers[1] + 1;
+ gScanlineEffect.setFirstScanlineReg = CopyValue16Bit;
+ }
+ else // assume 32-bit
+ {
+ // Set the DMA src to the value for the second scanline because the
+ // first DMA transfer occurs in HBlank *after* the first scanline is drawn
+ gScanlineEffect.dmaSrcBuffers[0] = (u32 *)gScanlineEffectRegBuffers[0] + 1;
+ gScanlineEffect.dmaSrcBuffers[1] = (u32 *)gScanlineEffectRegBuffers[1] + 1;
+ gScanlineEffect.setFirstScanlineReg = CopyValue32Bit;
+ }
+
+ gScanlineEffect.dmaControl = params.dmaControl;
+ gScanlineEffect.dmaDest = params.dmaDest;
+ gScanlineEffect.state = params.initState;
+ gScanlineEffect.unused16 = params.unused9;
+ gScanlineEffect.unused17 = params.unused9;
+}
+
+void ScanlineEffect_InitHBlankDmaTransfer(void)
+{
+ if (gScanlineEffect.state == 0)
+ {
+ return;
+ }
+ else if (gScanlineEffect.state == 3)
+ {
+ gScanlineEffect.state = 0;
+ DmaStop(0);
+ sShouldStopWaveTask = TRUE;
+ }
+ else
+ {
+ DmaStop(0);
+ // Set DMA to copy to dest register on each HBlank for the next frame.
+ // The HBlank DMA transfers do not occurr during VBlank, so the transfer
+ // will begin on the HBlank after the first scanline
+ DmaSet(0, gScanlineEffect.dmaSrcBuffers[gScanlineEffect.srcBuffer], gScanlineEffect.dmaDest, gScanlineEffect.dmaControl);
+ // Manually set the reg for the first scanline
+ gScanlineEffect.setFirstScanlineReg();
+ // Swap current buffer
+ gScanlineEffect.srcBuffer ^= 1;
+ }
+}
+
+// These two functions are used to copy the register for the first scanline,
+// depending whether it is a 16-bit register or a 32-bit register.
+
+static void CopyValue16Bit(void)
+{
+ u16 *dest = (u16 *)gScanlineEffect.dmaDest;
+ u16 *src = (u16 *)&gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer];
+
+ *dest = *src;
+}
+
+static void CopyValue32Bit(void)
+{
+ u32 *dest = (u32 *)gScanlineEffect.dmaDest;
+ u32 *src = (u32 *)&gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer];
+
+ *dest = *src;
+}
+
+#define tStartLine data[0]
+#define tEndLine data[1]
+#define tWaveLength data[2]
+#define tSrcBufferOffset data[3]
+#define tFramesUntilMove data[4]
+#define tDelayInterval data[5]
+#define tRegOffset data[6]
+#define tApplyBattleBgOffsets data[7]
+
+static void TaskFunc_UpdateWavePerFrame(u8 taskId)
+{
+ int value = 0;
+ int i;
+ int offset;
+
+ if (sShouldStopWaveTask)
+ {
+ DestroyTask(taskId);
+ gScanlineEffect.waveTaskId = 0xFF;
+ }
+ else
+ {
+ if (gTasks[taskId].tApplyBattleBgOffsets)
+ {
+ switch (gTasks[taskId].tRegOffset)
+ {
+ case SCANLINE_EFFECT_REG_BG0HOFS:
+ value = gBattle_BG0_X;
+ break;
+ case SCANLINE_EFFECT_REG_BG0VOFS:
+ value = gBattle_BG0_Y;
+ break;
+ case SCANLINE_EFFECT_REG_BG1HOFS:
+ value = gBattle_BG1_X;
+ break;
+ case SCANLINE_EFFECT_REG_BG1VOFS:
+ value = gBattle_BG1_Y;
+ break;
+ case SCANLINE_EFFECT_REG_BG2HOFS:
+ value = gBattle_BG2_X;
+ break;
+ case SCANLINE_EFFECT_REG_BG2VOFS:
+ value = gBattle_BG2_Y;
+ break;
+ case SCANLINE_EFFECT_REG_BG3HOFS:
+ value = gBattle_BG3_X;
+ break;
+ case SCANLINE_EFFECT_REG_BG3VOFS:
+ value = gBattle_BG3_Y;
+ break;
+ }
+ }
+ if (gTasks[taskId].tFramesUntilMove != 0)
+ {
+ gTasks[taskId].tFramesUntilMove--;
+ offset = gTasks[taskId].tSrcBufferOffset + 320;
+ for (i = gTasks[taskId].tStartLine; i < gTasks[taskId].tEndLine; i++)
+ {
+ gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gScanlineEffectRegBuffers[0][offset] + value;
+ offset++;
+ }
+ }
+ else
+ {
+ gTasks[taskId].tFramesUntilMove = gTasks[taskId].tDelayInterval;
+ offset = gTasks[taskId].tSrcBufferOffset + 320;
+ for (i = gTasks[taskId].tStartLine; i < gTasks[taskId].tEndLine; i++)
+ {
+ gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gScanlineEffectRegBuffers[0][offset] + value;
+ offset++;
+ }
+
+ // increment src buffer offset
+ gTasks[taskId].tSrcBufferOffset++;
+ if (gTasks[taskId].tSrcBufferOffset == gTasks[taskId].tWaveLength)
+ gTasks[taskId].tSrcBufferOffset = 0;
+ }
+ }
+}
+
+static void GenerateWave(u16 *buffer, u8 frequency, u8 amplitude, u8 unused)
+{
+ u16 i = 0;
+ u8 theta = 0;
+
+ while (i < 256)
+ {
+ buffer[i] = (gSineTable[theta] * amplitude) / 256;
+ theta += frequency;
+ i++;
+ }
+}
+
+// Initializes a background "wave" effect that affects scanlines startLine (inclusive) to endLine (exclusive).
+// 'frequency' and 'amplitude' control the frequency and amplitude of the wave.
+// 'delayInterval' controls how fast the wave travels up the screen. The wave will shift upwards one scanline every 'delayInterval'+1 frames.
+// 'regOffset' is the offset of the video register to modify.
+u8 ScanlineEffect_InitWave(u8 startLine, u8 endLine, u8 frequency, u8 amplitude, u8 delayInterval, u8 regOffset, bool8 applyBattleBgOffsets)
+{
+ int i;
+ int offset;
+ struct ScanlineEffectParams params;
+ u8 taskId;
+
+ ScanlineEffect_Clear();
+
+ params.dmaDest = (void *)(REG_ADDR_BG0HOFS + regOffset);
+ params.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;
+ params.initState = 1;
+ params.unused9 = 0;
+ ScanlineEffect_SetParams(params);
+
+ taskId = CreateTask(TaskFunc_UpdateWavePerFrame, 0);
+
+ gTasks[taskId].tStartLine = startLine;
+ gTasks[taskId].tEndLine = endLine;
+ gTasks[taskId].tWaveLength = 256 / frequency;
+ gTasks[taskId].tSrcBufferOffset = 0;
+ gTasks[taskId].tFramesUntilMove = delayInterval;
+ gTasks[taskId].tDelayInterval = delayInterval;
+ gTasks[taskId].tRegOffset = regOffset;
+ gTasks[taskId].tApplyBattleBgOffsets = applyBattleBgOffsets;
+
+ gScanlineEffect.waveTaskId = taskId;
+ sShouldStopWaveTask = FALSE;
+
+ GenerateWave(&gScanlineEffectRegBuffers[0][320], frequency, amplitude, endLine - startLine);
+
+ offset = 320;
+ for (i = startLine; i < endLine; i++)
+ {
+ gScanlineEffectRegBuffers[0][i] = gScanlineEffectRegBuffers[0][offset];
+ gScanlineEffectRegBuffers[1][i] = gScanlineEffectRegBuffers[0][offset];
+ offset++;
+ }
+
+ return taskId;
+}
diff --git a/src/scrcmd.c b/src/scrcmd.c
index 16a39cd8c..934504c36 100644
--- a/src/scrcmd.c
+++ b/src/scrcmd.c
@@ -638,7 +638,7 @@ static bool8 IsPaletteNotActive(void)
bool8 ScrCmd_fadescreen(struct ScriptContext *ctx)
{
- fade_screen(ScriptReadByte(ctx), 0);
+ FadeScreen(ScriptReadByte(ctx), 0);
SetupNativeScript(ctx, IsPaletteNotActive);
return TRUE;
}
@@ -648,7 +648,7 @@ bool8 ScrCmd_fadescreenspeed(struct ScriptContext *ctx)
u8 mode = ScriptReadByte(ctx);
u8 speed = ScriptReadByte(ctx);
- fade_screen(mode, speed);
+ FadeScreen(mode, speed);
SetupNativeScript(ctx, IsPaletteNotActive);
return TRUE;
}
@@ -662,12 +662,12 @@ bool8 ScrCmd_fadescreenswapbuffers(struct ScriptContext *ctx)
case 1:
default:
CpuCopy32(gPlttBufferUnfaded, gPaletteDecompressionBuffer, PLTT_DECOMP_BUFFER_SIZE);
- fade_screen(mode, 0);
+ FadeScreen(mode, 0);
break;
case 0:
case 2:
CpuCopy32(gPaletteDecompressionBuffer, gPlttBufferUnfaded, PLTT_DECOMP_BUFFER_SIZE);
- fade_screen(mode, 0);
+ FadeScreen(mode, 0);
break;
}
@@ -726,7 +726,7 @@ bool8 ScrCmd_setweather(struct ScriptContext *ctx)
bool8 ScrCmd_resetweather(struct ScriptContext *ctx)
{
- sub_80AEDBC();
+ SetSav1WeatherFromCurrMapHeader();
return FALSE;
}
diff --git a/src/secret_base.c b/src/secret_base.c
index e2cb3b520..f6b393630 100644
--- a/src/secret_base.c
+++ b/src/secret_base.c
@@ -394,7 +394,7 @@ void sub_80E8FD0(u8 taskId)
void sub_80E9068(void)
{
CreateTask(sub_80E8FD0, 0);
- fade_screen(1, 0);
+ FadeScreen(1, 0);
saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
}
@@ -451,7 +451,7 @@ void sub_80E916C(u8 taskId)
void sub_80E91F8(void)
{
CreateTask(sub_80E916C, 0);
- fade_screen(1, 0);
+ FadeScreen(1, 0);
}
bool8 CurrentMapIsSecretBase(void)
@@ -651,7 +651,7 @@ void sub_80E96A4(u8 taskId)
void sub_80E9728(void)
{
CreateTask(sub_80E96A4, 0);
- fade_screen(1, 0);
+ FadeScreen(1, 0);
}
void sub_80E9744(void)
diff --git a/src/text.c b/src/text.c
index 52ea06f84..4c2b03b71 100644
--- a/src/text.c
+++ b/src/text.c
@@ -1,6 +1,9 @@
#include "global.h"
+#include "battle.h"
#include "main.h"
+#include "m4a.h"
#include "palette.h"
+#include "sound.h"
#include "string_util.h"
#include "window.h"
#include "text.h"
@@ -14,6 +17,7 @@ extern u16 Font6Func(struct TextPrinter *textPrinter);
extern u32 GetGlyphWidthFont6(u16 glyphId, bool32 isJapanese);
extern void PlaySE(u16 songNum);
extern u8* UnkTextUtil_GetPtrI(u8 a1);
+extern int sub_8197964();
EWRAM_DATA struct TextPrinter gTempTextPrinter = {0};
EWRAM_DATA struct TextPrinter gTextPrinters[NUM_TEXT_PRINTERS] = {0};
@@ -24,6 +28,7 @@ static u16 gLastTextFgColor;
static u16 gLastTextShadowColor;
extern struct Main gMain;
+extern struct MusicPlayerInfo gMPlayInfo_BGM;
const struct FontInfo *gFonts;
u8 gUnknown_03002F84;
@@ -35,22 +40,22 @@ u8 gGlyphDimensions[0x2];
TextFlags gTextFlags;
const u8 gFontHalfRowOffsets[] = {
- 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00,
+ 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00,
0x09, 0x0A, 0x0B, 0x09, 0x0C, 0x0D, 0x0E, 0x0C, 0x0F, 0x10, 0x11, 0x0F, 0x09, 0x0A, 0x0B, 0x09,
0x12, 0x13, 0x14, 0x12, 0x15, 0x16, 0x17, 0x15, 0x18, 0x19, 0x1A, 0x18, 0x12, 0x13, 0x14, 0x12,
- 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00,
+ 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00,
0x1B, 0x1C, 0x1D, 0x1B, 0x1E, 0x1F, 0x20, 0x1E, 0x21, 0x22, 0x23, 0x21, 0x1B, 0x1C, 0x1D, 0x1B,
0x24, 0x25, 0x26, 0x24, 0x27, 0x28, 0x29, 0x27, 0x2A, 0x2B, 0x2C, 0x2A, 0x24, 0x25, 0x26, 0x24,
- 0x2D, 0x2E, 0x2F, 0x2D, 0x30, 0x31, 0x32, 0x30, 0x33, 0x34, 0x35, 0x33, 0x2D, 0x2E, 0x2F, 0x2D,
+ 0x2D, 0x2E, 0x2F, 0x2D, 0x30, 0x31, 0x32, 0x30, 0x33, 0x34, 0x35, 0x33, 0x2D, 0x2E, 0x2F, 0x2D,
0x1B, 0x1C, 0x1D, 0x1B, 0x1E, 0x1F, 0x20, 0x1E, 0x21, 0x22, 0x23, 0x21, 0x1B, 0x1C, 0x1D, 0x1B,
0x36, 0x37, 0x38, 0x36, 0x39, 0x3A, 0x3B, 0x39, 0x3C, 0x3D, 0x3E, 0x3C, 0x36, 0x37, 0x38, 0x36,
- 0x3F, 0x40, 0x41, 0x3F, 0x42, 0x43, 0x44, 0x42, 0x45, 0x46, 0x47, 0x45, 0x3F, 0x40, 0x41, 0x3F,
+ 0x3F, 0x40, 0x41, 0x3F, 0x42, 0x43, 0x44, 0x42, 0x45, 0x46, 0x47, 0x45, 0x3F, 0x40, 0x41, 0x3F,
0x48, 0x49, 0x4A, 0x48, 0x4B, 0x4C, 0x4D, 0x4B, 0x4E, 0x4F, 0x50, 0x4E, 0x48, 0x49, 0x4A, 0x48,
0x36, 0x37, 0x38, 0x36, 0x39, 0x3A, 0x3B, 0x39, 0x3C, 0x3D, 0x3E, 0x3C, 0x36, 0x37, 0x38, 0x36,
- 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00,
+ 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00,
0x09, 0x0A, 0x0B, 0x09, 0x0C, 0x0D, 0x0E, 0x0C, 0x0F, 0x10, 0x11, 0x0F, 0x09, 0x0A, 0x0B, 0x09,
0x12, 0x13, 0x14, 0x12, 0x15, 0x16, 0x17, 0x15, 0x18, 0x19, 0x1A, 0x18, 0x12, 0x13, 0x14, 0x12,
- 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00
+ 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, 0x05, 0x03, 0x06, 0x07, 0x08, 0x06, 0x00, 0x01, 0x02, 0x00
};
const u8 gDownArrowTiles[] = INCBIN_U8("data/graphics/fonts/down_arrow.4bpp");
@@ -378,460 +383,460 @@ ASM_DIRECT
void GenerateFontHalfRowLookupTable(u8 fgColor, u8 bgColor, u8 shadowColor)
{
asm("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\
- lsl r0, #24\n\
- lsr r0, #24\n\
- lsl r1, #24\n\
- lsr r1, #24\n\
- lsl r2, #24\n\
- lsr r2, #24\n\
- ldr r3, =gFontHalfRowLookupTable\n\
- ldr r4, =gLastTextBgColor\n\
- strh r1, [r4]\n\
- ldr r4, =gLastTextFgColor\n\
- strh r0, [r4]\n\
- ldr r4, =gLastTextShadowColor\n\
- strh r2, [r4]\n\
- lsl r5, r1, #12\n\
- lsl r6, r0, #12\n\
- lsl r4, r2, #12\n\
- mov r8, r4\n\
- lsl r7, r1, #8\n\
- str r7, [sp]\n\
- lsl r4, r1, #4\n\
- mov r9, r4\n\
- orr r7, r4\n\
- str r7, [sp, #0x4]\n\
- orr r7, r1\n\
- add r4, r5, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- add r4, r6, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- mov r4, r8\n\
- orr r7, r4\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- lsl r7, r0, #8\n\
- mov r10, r7\n\
- mov r4, r10\n\
- mov r7, r9\n\
- orr r4, r7\n\
- str r4, [sp, #0x8]\n\
- add r7, r4, #0\n\
- orr r7, r1\n\
- add r4, r5, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- add r4, r6, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- mov r4, r8\n\
- orr r7, r4\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- lsl r7, r2, #8\n\
- mov r12, r7\n\
- mov r4, r12\n\
- mov r7, r9\n\
- orr r4, r7\n\
- str r4, [sp, #0xC]\n\
- add r7, r4, #0\n\
- orr r7, r1\n\
- add r4, r5, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- add r4, r6, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- mov r4, r8\n\
- orr r7, r4\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- lsl r7, r0, #4\n\
- mov r9, r7\n\
- ldr r4, [sp]\n\
- orr r4, r7\n\
- str r4, [sp, #0x10]\n\
- add r7, r4, #0\n\
- orr r7, r1\n\
- add r4, r5, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- add r4, r6, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- mov r4, r8\n\
- orr r7, r4\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- mov r7, r10\n\
- add r4, r7, #0\n\
- mov r7, r9\n\
- orr r4, r7\n\
- str r4, [sp, #0x14]\n\
- add r7, r4, #0\n\
- orr r7, r1\n\
- add r4, r5, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- add r4, r6, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- mov r4, r8\n\
- orr r7, r4\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- mov r7, r12\n\
- add r4, r7, #0\n\
- mov r7, r9\n\
- orr r4, r7\n\
- str r4, [sp, #0x18]\n\
- add r7, r4, #0\n\
- orr r7, r1\n\
- add r4, r5, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- add r4, r6, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- mov r4, r8\n\
- orr r7, r4\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- lsl r7, r2, #4\n\
- mov r9, r7\n\
- mov r4, r9\n\
- ldr r7, [sp]\n\
- orr r7, r4\n\
- str r7, [sp, #0x1C]\n\
- orr r7, r1\n\
- add r4, r5, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- add r4, r6, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- mov r4, r8\n\
- orr r7, r4\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- mov r7, r9\n\
- mov r4, r10\n\
- orr r4, r7\n\
- str r4, [sp, #0x20]\n\
- add r7, r4, #0\n\
- orr r7, r1\n\
- add r4, r5, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- add r4, r6, #0\n\
- orr r4, r7\n\
- strh r4, [r3]\n\
- add r3, #0x2\n\
- mov r4, r8\n\
- orr r7, r4\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- mov r4, r12\n\
- mov r7, r9\n\
- orr r4, r7\n\
- add r7, r4, #0\n\
- orr r7, r1\n\
- add r1, r5, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- add r1, r6, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- mov r1, r8\n\
- orr r7, r1\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- ldr r7, [sp, #0x4]\n\
- orr r7, r0\n\
- add r1, r5, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- add r1, r6, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- mov r1, r8\n\
- orr r7, r1\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- ldr r7, [sp, #0x8]\n\
- orr r7, r0\n\
- add r1, r5, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- add r1, r6, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- mov r1, r8\n\
- orr r7, r1\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- ldr r7, [sp, #0xC]\n\
- orr r7, r0\n\
- add r1, r5, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- add r1, r6, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- mov r1, r8\n\
- orr r7, r1\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- ldr r7, [sp, #0x10]\n\
- orr r7, r0\n\
- add r1, r5, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- add r1, r6, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- mov r1, r8\n\
- orr r7, r1\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- ldr r7, [sp, #0x14]\n\
- orr r7, r0\n\
- add r1, r5, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- add r1, r6, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- mov r1, r8\n\
- orr r7, r1\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- ldr r7, [sp, #0x18]\n\
- orr r7, r0\n\
- add r1, r5, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- add r1, r6, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- mov r1, r8\n\
- orr r7, r1\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- ldr r7, [sp, #0x1C]\n\
- orr r7, r0\n\
- add r1, r5, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- add r1, r6, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- mov r1, r8\n\
- orr r7, r1\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- ldr r7, [sp, #0x20]\n\
- orr r7, r0\n\
- add r1, r5, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- add r1, r6, #0\n\
- orr r1, r7\n\
- strh r1, [r3]\n\
- add r3, #0x2\n\
- mov r1, r8\n\
- orr r7, r1\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- add r7, r4, #0\n\
- orr r7, r0\n\
- add r0, r5, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- add r0, r6, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- orr r7, r1\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- add r7, r2, #0\n\
- ldr r0, [sp, #0x4]\n\
- orr r7, r0\n\
- add r0, r5, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- add r0, r6, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- orr r7, r1\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- add r7, r2, #0\n\
- ldr r1, [sp, #0x8]\n\
- orr r7, r1\n\
- add r0, r5, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- add r0, r6, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- mov r0, r8\n\
- orr r7, r0\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- add r7, r2, #0\n\
- ldr r1, [sp, #0xC]\n\
- orr r7, r1\n\
- add r0, r5, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- add r0, r6, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- mov r0, r8\n\
- orr r7, r0\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- add r7, r2, #0\n\
- ldr r1, [sp, #0x10]\n\
- orr r7, r1\n\
- add r0, r5, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- add r0, r6, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- mov r0, r8\n\
- orr r7, r0\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- add r7, r2, #0\n\
- ldr r1, [sp, #0x14]\n\
- orr r7, r1\n\
- add r0, r5, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- add r0, r6, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- mov r0, r8\n\
- orr r7, r0\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- add r7, r2, #0\n\
- ldr r1, [sp, #0x18]\n\
- orr r7, r1\n\
- add r0, r5, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- add r0, r6, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- mov r0, r8\n\
- orr r7, r0\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- add r7, r2, #0\n\
- ldr r1, [sp, #0x1C]\n\
- orr r7, r1\n\
- add r0, r5, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- add r0, r6, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- mov r0, r8\n\
- orr r7, r0\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- add r7, r2, #0\n\
- ldr r1, [sp, #0x20]\n\
- orr r7, r1\n\
- add r0, r5, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- add r0, r6, #0\n\
- orr r0, r7\n\
- strh r0, [r3]\n\
- add r3, #0x2\n\
- mov r0, r8\n\
- orr r7, r0\n\
- strh r7, [r3]\n\
- add r3, #0x2\n\
- add r7, r2, #0\n\
- orr r7, r4\n\
- orr r5, r7\n\
- strh r5, [r3]\n\
- add r3, #0x2\n\
- orr r6, r7\n\
- strh r6, [r3]\n\
- orr r0, r7\n\
- strh r0, [r3, #0x2]\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\
- .pool");
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, #0x24\n\
+ lsl r0, #24\n\
+ lsr r0, #24\n\
+ lsl r1, #24\n\
+ lsr r1, #24\n\
+ lsl r2, #24\n\
+ lsr r2, #24\n\
+ ldr r3, =gFontHalfRowLookupTable\n\
+ ldr r4, =gLastTextBgColor\n\
+ strh r1, [r4]\n\
+ ldr r4, =gLastTextFgColor\n\
+ strh r0, [r4]\n\
+ ldr r4, =gLastTextShadowColor\n\
+ strh r2, [r4]\n\
+ lsl r5, r1, #12\n\
+ lsl r6, r0, #12\n\
+ lsl r4, r2, #12\n\
+ mov r8, r4\n\
+ lsl r7, r1, #8\n\
+ str r7, [sp]\n\
+ lsl r4, r1, #4\n\
+ mov r9, r4\n\
+ orr r7, r4\n\
+ str r7, [sp, #0x4]\n\
+ orr r7, r1\n\
+ add r4, r5, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ add r4, r6, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ mov r4, r8\n\
+ orr r7, r4\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ lsl r7, r0, #8\n\
+ mov r10, r7\n\
+ mov r4, r10\n\
+ mov r7, r9\n\
+ orr r4, r7\n\
+ str r4, [sp, #0x8]\n\
+ add r7, r4, #0\n\
+ orr r7, r1\n\
+ add r4, r5, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ add r4, r6, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ mov r4, r8\n\
+ orr r7, r4\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ lsl r7, r2, #8\n\
+ mov r12, r7\n\
+ mov r4, r12\n\
+ mov r7, r9\n\
+ orr r4, r7\n\
+ str r4, [sp, #0xC]\n\
+ add r7, r4, #0\n\
+ orr r7, r1\n\
+ add r4, r5, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ add r4, r6, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ mov r4, r8\n\
+ orr r7, r4\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ lsl r7, r0, #4\n\
+ mov r9, r7\n\
+ ldr r4, [sp]\n\
+ orr r4, r7\n\
+ str r4, [sp, #0x10]\n\
+ add r7, r4, #0\n\
+ orr r7, r1\n\
+ add r4, r5, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ add r4, r6, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ mov r4, r8\n\
+ orr r7, r4\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ mov r7, r10\n\
+ add r4, r7, #0\n\
+ mov r7, r9\n\
+ orr r4, r7\n\
+ str r4, [sp, #0x14]\n\
+ add r7, r4, #0\n\
+ orr r7, r1\n\
+ add r4, r5, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ add r4, r6, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ mov r4, r8\n\
+ orr r7, r4\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ mov r7, r12\n\
+ add r4, r7, #0\n\
+ mov r7, r9\n\
+ orr r4, r7\n\
+ str r4, [sp, #0x18]\n\
+ add r7, r4, #0\n\
+ orr r7, r1\n\
+ add r4, r5, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ add r4, r6, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ mov r4, r8\n\
+ orr r7, r4\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ lsl r7, r2, #4\n\
+ mov r9, r7\n\
+ mov r4, r9\n\
+ ldr r7, [sp]\n\
+ orr r7, r4\n\
+ str r7, [sp, #0x1C]\n\
+ orr r7, r1\n\
+ add r4, r5, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ add r4, r6, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ mov r4, r8\n\
+ orr r7, r4\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ mov r7, r9\n\
+ mov r4, r10\n\
+ orr r4, r7\n\
+ str r4, [sp, #0x20]\n\
+ add r7, r4, #0\n\
+ orr r7, r1\n\
+ add r4, r5, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ add r4, r6, #0\n\
+ orr r4, r7\n\
+ strh r4, [r3]\n\
+ add r3, #0x2\n\
+ mov r4, r8\n\
+ orr r7, r4\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ mov r4, r12\n\
+ mov r7, r9\n\
+ orr r4, r7\n\
+ add r7, r4, #0\n\
+ orr r7, r1\n\
+ add r1, r5, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ add r1, r6, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ mov r1, r8\n\
+ orr r7, r1\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ ldr r7, [sp, #0x4]\n\
+ orr r7, r0\n\
+ add r1, r5, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ add r1, r6, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ mov r1, r8\n\
+ orr r7, r1\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ ldr r7, [sp, #0x8]\n\
+ orr r7, r0\n\
+ add r1, r5, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ add r1, r6, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ mov r1, r8\n\
+ orr r7, r1\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ ldr r7, [sp, #0xC]\n\
+ orr r7, r0\n\
+ add r1, r5, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ add r1, r6, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ mov r1, r8\n\
+ orr r7, r1\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ ldr r7, [sp, #0x10]\n\
+ orr r7, r0\n\
+ add r1, r5, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ add r1, r6, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ mov r1, r8\n\
+ orr r7, r1\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ ldr r7, [sp, #0x14]\n\
+ orr r7, r0\n\
+ add r1, r5, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ add r1, r6, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ mov r1, r8\n\
+ orr r7, r1\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ ldr r7, [sp, #0x18]\n\
+ orr r7, r0\n\
+ add r1, r5, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ add r1, r6, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ mov r1, r8\n\
+ orr r7, r1\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ ldr r7, [sp, #0x1C]\n\
+ orr r7, r0\n\
+ add r1, r5, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ add r1, r6, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ mov r1, r8\n\
+ orr r7, r1\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ ldr r7, [sp, #0x20]\n\
+ orr r7, r0\n\
+ add r1, r5, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ add r1, r6, #0\n\
+ orr r1, r7\n\
+ strh r1, [r3]\n\
+ add r3, #0x2\n\
+ mov r1, r8\n\
+ orr r7, r1\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ add r7, r4, #0\n\
+ orr r7, r0\n\
+ add r0, r5, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ add r0, r6, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ orr r7, r1\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ add r7, r2, #0\n\
+ ldr r0, [sp, #0x4]\n\
+ orr r7, r0\n\
+ add r0, r5, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ add r0, r6, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ orr r7, r1\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ add r7, r2, #0\n\
+ ldr r1, [sp, #0x8]\n\
+ orr r7, r1\n\
+ add r0, r5, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ add r0, r6, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ mov r0, r8\n\
+ orr r7, r0\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ add r7, r2, #0\n\
+ ldr r1, [sp, #0xC]\n\
+ orr r7, r1\n\
+ add r0, r5, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ add r0, r6, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ mov r0, r8\n\
+ orr r7, r0\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ add r7, r2, #0\n\
+ ldr r1, [sp, #0x10]\n\
+ orr r7, r1\n\
+ add r0, r5, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ add r0, r6, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ mov r0, r8\n\
+ orr r7, r0\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ add r7, r2, #0\n\
+ ldr r1, [sp, #0x14]\n\
+ orr r7, r1\n\
+ add r0, r5, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ add r0, r6, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ mov r0, r8\n\
+ orr r7, r0\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ add r7, r2, #0\n\
+ ldr r1, [sp, #0x18]\n\
+ orr r7, r1\n\
+ add r0, r5, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ add r0, r6, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ mov r0, r8\n\
+ orr r7, r0\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ add r7, r2, #0\n\
+ ldr r1, [sp, #0x1C]\n\
+ orr r7, r1\n\
+ add r0, r5, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ add r0, r6, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ mov r0, r8\n\
+ orr r7, r0\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ add r7, r2, #0\n\
+ ldr r1, [sp, #0x20]\n\
+ orr r7, r1\n\
+ add r0, r5, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ add r0, r6, #0\n\
+ orr r0, r7\n\
+ strh r0, [r3]\n\
+ add r3, #0x2\n\
+ mov r0, r8\n\
+ orr r7, r0\n\
+ strh r7, [r3]\n\
+ add r3, #0x2\n\
+ add r7, r2, #0\n\
+ orr r7, r4\n\
+ orr r5, r7\n\
+ strh r5, [r3]\n\
+ add r3, #0x2\n\
+ orr r6, r7\n\
+ strh r6, [r3]\n\
+ orr r0, r7\n\
+ strh r0, [r3, #0x2]\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\
+ .pool");
}
#endif
@@ -874,165 +879,165 @@ ASM_DIRECT
void DecompressGlyphTile(const u16 *src, u16 *dest)
{
asm("push {r4-r7,lr}\n\
- mov r7, r8\n\
- push {r7}\n\
- ldrh r7, [r0]\n\
- ldr r5, =gFontHalfRowLookupTable\n\
- ldr r4, =gFontHalfRowOffsets\n\
- mov r2, #0xFF\n\
- mov r8, r2\n\
- add r2, r7, #0\n\
- mov r3, r8\n\
- and r2, r3\n\
- add r2, r4\n\
- ldrb r2, [r2]\n\
- lsl r2, #1\n\
- add r2, r5\n\
- ldrh r3, [r2]\n\
- lsl r3, #16\n\
- lsr r2, r7, #8\n\
- add r2, r4\n\
- ldrb r2, [r2]\n\
- lsl r2, #1\n\
- add r2, r5\n\
- ldrh r2, [r2]\n\
- orr r3, r2\n\
- add r6, r1, #0\n\
- stmia r6!, {r3}\n\
- ldrh r7, [r0, #0x2]\n\
- add r0, #0x4\n\
- add r2, r7, #0\n\
- mov r3, r8\n\
- and r2, r3\n\
- add r2, r4\n\
- ldrb r2, [r2]\n\
- lsl r2, #1\n\
- add r2, r5\n\
- ldrh r3, [r2]\n\
- lsl r3, #16\n\
- lsr r2, r7, #8\n\
- add r2, r4\n\
- ldrb r2, [r2]\n\
- lsl r2, #1\n\
- add r2, r5\n\
- ldrh r2, [r2]\n\
- orr r3, r2\n\
- str r3, [r1, #0x4]\n\
- add r6, #0x4\n\
- ldrh r7, [r0]\n\
- add r0, #0x2\n\
- add r1, r7, #0\n\
- mov r2, r8\n\
- and r1, r2\n\
- add r1, r4\n\
- ldrb r1, [r1]\n\
- lsl r1, #1\n\
- add r1, r5\n\
- ldrh r2, [r1]\n\
- lsl r2, #16\n\
- lsr r1, r7, #8\n\
- add r1, r4\n\
- ldrb r1, [r1]\n\
- lsl r1, #1\n\
- add r1, r5\n\
- ldrh r1, [r1]\n\
- orr r2, r1\n\
- stmia r6!, {r2}\n\
- ldrh r7, [r0]\n\
- add r0, #0x2\n\
- add r1, r7, #0\n\
- mov r3, r8\n\
- and r1, r3\n\
- add r1, r4\n\
- ldrb r1, [r1]\n\
- lsl r1, #1\n\
- add r1, r5\n\
- ldrh r2, [r1]\n\
- lsl r2, #16\n\
- lsr r1, r7, #8\n\
- add r1, r4\n\
- ldrb r1, [r1]\n\
- lsl r1, #1\n\
- add r1, r5\n\
- ldrh r1, [r1]\n\
- orr r2, r1\n\
- stmia r6!, {r2}\n\
- ldrh r7, [r0]\n\
- add r0, #0x2\n\
- add r1, r7, #0\n\
- and r1, r3\n\
- add r1, r4\n\
- ldrb r1, [r1]\n\
- lsl r1, #1\n\
- add r1, r5\n\
- ldrh r2, [r1]\n\
- lsl r2, #16\n\
- lsr r1, r7, #8\n\
- add r1, r4\n\
- ldrb r1, [r1]\n\
- lsl r1, #1\n\
- add r1, r5\n\
- ldrh r1, [r1]\n\
- orr r2, r1\n\
- stmia r6!, {r2}\n\
- ldrh r7, [r0]\n\
- add r0, #0x2\n\
- add r1, r7, #0\n\
- and r1, r3\n\
- add r1, r4\n\
- ldrb r1, [r1]\n\
- lsl r1, #1\n\
- add r1, r5\n\
- ldrh r2, [r1]\n\
- lsl r2, #16\n\
- lsr r1, r7, #8\n\
- add r1, r4\n\
- ldrb r1, [r1]\n\
- lsl r1, #1\n\
- add r1, r5\n\
- ldrh r1, [r1]\n\
- orr r2, r1\n\
- stmia r6!, {r2}\n\
- ldrh r7, [r0]\n\
- add r1, r7, #0\n\
- and r1, r3\n\
- add r1, r4\n\
- ldrb r1, [r1]\n\
- lsl r1, #1\n\
- add r1, r5\n\
- ldrh r2, [r1]\n\
- lsl r2, #16\n\
- lsr r1, r7, #8\n\
- add r1, r4\n\
- ldrb r1, [r1]\n\
- lsl r1, #1\n\
- add r1, r5\n\
- ldrh r1, [r1]\n\
- orr r2, r1\n\
- stmia r6!, {r2}\n\
- ldrh r7, [r0, #0x2]\n\
- add r0, r7, #0\n\
- and r0, r3\n\
- add r0, r4\n\
- ldrb r0, [r0]\n\
- lsl r0, #1\n\
- add r0, r5\n\
- ldrh r1, [r0]\n\
- lsl r1, #16\n\
- lsr r0, r7, #8\n\
- add r0, r4\n\
- ldrb r0, [r0]\n\
- lsl r0, #1\n\
- add r0, r5\n\
- ldrh r0, [r0]\n\
- orr r1, r0\n\
- str r1, [r6]\n\
- pop {r3}\n\
- mov r8, r3\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .pool");
+ mov r7, r8\n\
+ push {r7}\n\
+ ldrh r7, [r0]\n\
+ ldr r5, =gFontHalfRowLookupTable\n\
+ ldr r4, =gFontHalfRowOffsets\n\
+ mov r2, #0xFF\n\
+ mov r8, r2\n\
+ add r2, r7, #0\n\
+ mov r3, r8\n\
+ and r2, r3\n\
+ add r2, r4\n\
+ ldrb r2, [r2]\n\
+ lsl r2, #1\n\
+ add r2, r5\n\
+ ldrh r3, [r2]\n\
+ lsl r3, #16\n\
+ lsr r2, r7, #8\n\
+ add r2, r4\n\
+ ldrb r2, [r2]\n\
+ lsl r2, #1\n\
+ add r2, r5\n\
+ ldrh r2, [r2]\n\
+ orr r3, r2\n\
+ add r6, r1, #0\n\
+ stmia r6!, {r3}\n\
+ ldrh r7, [r0, #0x2]\n\
+ add r0, #0x4\n\
+ add r2, r7, #0\n\
+ mov r3, r8\n\
+ and r2, r3\n\
+ add r2, r4\n\
+ ldrb r2, [r2]\n\
+ lsl r2, #1\n\
+ add r2, r5\n\
+ ldrh r3, [r2]\n\
+ lsl r3, #16\n\
+ lsr r2, r7, #8\n\
+ add r2, r4\n\
+ ldrb r2, [r2]\n\
+ lsl r2, #1\n\
+ add r2, r5\n\
+ ldrh r2, [r2]\n\
+ orr r3, r2\n\
+ str r3, [r1, #0x4]\n\
+ add r6, #0x4\n\
+ ldrh r7, [r0]\n\
+ add r0, #0x2\n\
+ add r1, r7, #0\n\
+ mov r2, r8\n\
+ and r1, r2\n\
+ add r1, r4\n\
+ ldrb r1, [r1]\n\
+ lsl r1, #1\n\
+ add r1, r5\n\
+ ldrh r2, [r1]\n\
+ lsl r2, #16\n\
+ lsr r1, r7, #8\n\
+ add r1, r4\n\
+ ldrb r1, [r1]\n\
+ lsl r1, #1\n\
+ add r1, r5\n\
+ ldrh r1, [r1]\n\
+ orr r2, r1\n\
+ stmia r6!, {r2}\n\
+ ldrh r7, [r0]\n\
+ add r0, #0x2\n\
+ add r1, r7, #0\n\
+ mov r3, r8\n\
+ and r1, r3\n\
+ add r1, r4\n\
+ ldrb r1, [r1]\n\
+ lsl r1, #1\n\
+ add r1, r5\n\
+ ldrh r2, [r1]\n\
+ lsl r2, #16\n\
+ lsr r1, r7, #8\n\
+ add r1, r4\n\
+ ldrb r1, [r1]\n\
+ lsl r1, #1\n\
+ add r1, r5\n\
+ ldrh r1, [r1]\n\
+ orr r2, r1\n\
+ stmia r6!, {r2}\n\
+ ldrh r7, [r0]\n\
+ add r0, #0x2\n\
+ add r1, r7, #0\n\
+ and r1, r3\n\
+ add r1, r4\n\
+ ldrb r1, [r1]\n\
+ lsl r1, #1\n\
+ add r1, r5\n\
+ ldrh r2, [r1]\n\
+ lsl r2, #16\n\
+ lsr r1, r7, #8\n\
+ add r1, r4\n\
+ ldrb r1, [r1]\n\
+ lsl r1, #1\n\
+ add r1, r5\n\
+ ldrh r1, [r1]\n\
+ orr r2, r1\n\
+ stmia r6!, {r2}\n\
+ ldrh r7, [r0]\n\
+ add r0, #0x2\n\
+ add r1, r7, #0\n\
+ and r1, r3\n\
+ add r1, r4\n\
+ ldrb r1, [r1]\n\
+ lsl r1, #1\n\
+ add r1, r5\n\
+ ldrh r2, [r1]\n\
+ lsl r2, #16\n\
+ lsr r1, r7, #8\n\
+ add r1, r4\n\
+ ldrb r1, [r1]\n\
+ lsl r1, #1\n\
+ add r1, r5\n\
+ ldrh r1, [r1]\n\
+ orr r2, r1\n\
+ stmia r6!, {r2}\n\
+ ldrh r7, [r0]\n\
+ add r1, r7, #0\n\
+ and r1, r3\n\
+ add r1, r4\n\
+ ldrb r1, [r1]\n\
+ lsl r1, #1\n\
+ add r1, r5\n\
+ ldrh r2, [r1]\n\
+ lsl r2, #16\n\
+ lsr r1, r7, #8\n\
+ add r1, r4\n\
+ ldrb r1, [r1]\n\
+ lsl r1, #1\n\
+ add r1, r5\n\
+ ldrh r1, [r1]\n\
+ orr r2, r1\n\
+ stmia r6!, {r2}\n\
+ ldrh r7, [r0, #0x2]\n\
+ add r0, r7, #0\n\
+ and r0, r3\n\
+ add r0, r4\n\
+ ldrb r0, [r0]\n\
+ lsl r0, #1\n\
+ add r0, r5\n\
+ ldrh r1, [r0]\n\
+ lsl r1, #16\n\
+ lsr r0, r7, #8\n\
+ add r0, r4\n\
+ ldrb r0, [r0]\n\
+ lsl r0, #1\n\
+ add r0, r5\n\
+ ldrh r0, [r0]\n\
+ orr r1, r0\n\
+ str r1, [r6]\n\
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .pool");
}
#endif
@@ -1055,703 +1060,703 @@ ASM_DIRECT
void CopyGlyphToWindow(struct TextPrinter *x)
{
asm("push {r4-r7,lr}\n\
- mov r7, r10\n\
- mov r6, r9\n\
- mov r5, r8\n\
- push {r5-r7}\n\
- sub sp, #0x8C\n\
- add r3, r0, #0\n\
- ldrb r1, [r3, #0x4]\n\
- lsl r0, r1, #1\n\
- add r0, r1\n\
- lsl r0, #2\n\
- ldr r1, =gWindows\n\
- add r1, r0, r1\n\
- add r2, r1, #0\n\
- ldrb r7, [r1, #0x3]\n\
- lsl r0, r7, #3\n\
- ldrb r6, [r3, #0x8]\n\
- sub r4, r0, r6\n\
- ldr r5, =gUnknown_03002F90\n\
- add r0, r5, #0\n\
- add r0, #0x80\n\
- ldrb r0, [r0]\n\
- cmp r4, r0\n\
- ble _08004DD2\n\
- add r4, r0, #0\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, #0x8C\n\
+ add r3, r0, #0\n\
+ ldrb r1, [r3, #0x4]\n\
+ lsl r0, r1, #1\n\
+ add r0, r1\n\
+ lsl r0, #2\n\
+ ldr r1, =gWindows\n\
+ add r1, r0, r1\n\
+ add r2, r1, #0\n\
+ ldrb r7, [r1, #0x3]\n\
+ lsl r0, r7, #3\n\
+ ldrb r6, [r3, #0x8]\n\
+ sub r4, r0, r6\n\
+ ldr r5, =gUnknown_03002F90\n\
+ add r0, r5, #0\n\
+ add r0, #0x80\n\
+ ldrb r0, [r0]\n\
+ cmp r4, r0\n\
+ ble _08004DD2\n\
+ add r4, r0, #0\n\
_08004DD2:\n\
- ldrb r0, [r1, #0x4]\n\
- lsl r0, #3\n\
- ldrb r3, [r3, #0x9]\n\
- sub r0, r3\n\
- add r1, r5, #0\n\
- add r1, #0x81\n\
- ldrb r1, [r1]\n\
- cmp r0, r1\n\
- ble _08004DE6\n\
- add r0, r1, #0\n\
+ ldrb r0, [r1, #0x4]\n\
+ lsl r0, #3\n\
+ ldrb r3, [r3, #0x9]\n\
+ sub r0, r3\n\
+ add r1, r5, #0\n\
+ add r1, #0x81\n\
+ ldrb r1, [r1]\n\
+ cmp r0, r1\n\
+ ble _08004DE6\n\
+ add r0, r1, #0\n\
_08004DE6:\n\
- str r6, [sp]\n\
- mov r8, r3\n\
- add r3, r5, #0\n\
- ldr r2, [r2, #0x8]\n\
- mov r9, r2\n\
- lsl r1, r7, #5\n\
- str r1, [sp, #0x4]\n\
- cmp r4, #0x8\n\
- ble _08004DFA\n\
- b _08004F94\n\
+ str r6, [sp]\n\
+ mov r8, r3\n\
+ add r3, r5, #0\n\
+ ldr r2, [r2, #0x8]\n\
+ mov r9, r2\n\
+ lsl r1, r7, #5\n\
+ str r1, [sp, #0x4]\n\
+ cmp r4, #0x8\n\
+ ble _08004DFA\n\
+ b _08004F94\n\
_08004DFA:\n\
- cmp r0, #0x8\n\
- bgt _08004E84\n\
- mov r1, r8\n\
- str r3, [sp, #0x8]\n\
- add r2, r6, #0\n\
- add r2, r4\n\
- mov r8, r2\n\
- add r0, r1, r0\n\
- str r0, [sp, #0xC]\n\
- str r6, [sp, #0x10]\n\
- cmp r1, r0\n\
- bcc _08004E14\n\
- b _080052AA\n\
+ cmp r0, #0x8\n\
+ bgt _08004E84\n\
+ mov r1, r8\n\
+ str r3, [sp, #0x8]\n\
+ add r2, r6, #0\n\
+ add r2, r4\n\
+ mov r8, r2\n\
+ add r0, r1, r0\n\
+ str r0, [sp, #0xC]\n\
+ str r6, [sp, #0x10]\n\
+ cmp r1, r0\n\
+ bcc _08004E14\n\
+ b _080052AA\n\
_08004E14:\n\
- ldr r3, [sp, #0x8]\n\
- ldm r3!, {r5}\n\
- str r3, [sp, #0x8]\n\
- ldr r4, [sp, #0x10]\n\
- add r0, r1, #0x1\n\
- mov r10, r0\n\
- cmp r4, r8\n\
- bcs _08004E72\n\
- mov r2, #0x7\n\
- mov r12, r2\n\
- lsr r0, r1, #3\n\
- ldr r2, [sp, #0x4]\n\
- add r3, r0, #0\n\
- mul r3, r2\n\
- add r7, r3, #0\n\
- mov r3, r12\n\
- and r1, r3\n\
- lsl r6, r1, #2\n\
+ ldr r3, [sp, #0x8]\n\
+ ldm r3!, {r5}\n\
+ str r3, [sp, #0x8]\n\
+ ldr r4, [sp, #0x10]\n\
+ add r0, r1, #0x1\n\
+ mov r10, r0\n\
+ cmp r4, r8\n\
+ bcs _08004E72\n\
+ mov r2, #0x7\n\
+ mov r12, r2\n\
+ lsr r0, r1, #3\n\
+ ldr r2, [sp, #0x4]\n\
+ add r3, r0, #0\n\
+ mul r3, r2\n\
+ add r7, r3, #0\n\
+ mov r3, r12\n\
+ and r1, r3\n\
+ lsl r6, r1, #2\n\
_08004E38:\n\
- add r3, r5, #0\n\
- mov r0, #0xF\n\
- and r3, r0\n\
- cmp r3, #0\n\
- beq _08004E6A\n\
- lsr r2, r4, #3\n\
- lsl r2, #5\n\
- add r2, r9\n\
- add r0, r4, #0\n\
- mov r1, r12\n\
- and r0, r1\n\
- lsr r0, #1\n\
- add r2, r0\n\
- add r2, r7\n\
- add r2, r6\n\
- mov r1, #0x1\n\
- and r1, r4\n\
- lsl r1, #2\n\
- lsl r3, r1\n\
- mov r0, #0xF0\n\
- asr r0, r1\n\
- ldrb r1, [r2]\n\
- and r0, r1\n\
- orr r3, r0\n\
- strb r3, [r2]\n\
+ add r3, r5, #0\n\
+ mov r0, #0xF\n\
+ and r3, r0\n\
+ cmp r3, #0\n\
+ beq _08004E6A\n\
+ lsr r2, r4, #3\n\
+ lsl r2, #5\n\
+ add r2, r9\n\
+ add r0, r4, #0\n\
+ mov r1, r12\n\
+ and r0, r1\n\
+ lsr r0, #1\n\
+ add r2, r0\n\
+ add r2, r7\n\
+ add r2, r6\n\
+ mov r1, #0x1\n\
+ and r1, r4\n\
+ lsl r1, #2\n\
+ lsl r3, r1\n\
+ mov r0, #0xF0\n\
+ asr r0, r1\n\
+ ldrb r1, [r2]\n\
+ and r0, r1\n\
+ orr r3, r0\n\
+ strb r3, [r2]\n\
_08004E6A:\n\
- lsr r5, #4\n\
- add r4, #0x1\n\
- cmp r4, r8\n\
- bcc _08004E38\n\
+ lsr r5, #4\n\
+ add r4, #0x1\n\
+ cmp r4, r8\n\
+ bcc _08004E38\n\
_08004E72:\n\
- mov r1, r10\n\
- ldr r2, [sp, #0xC]\n\
- cmp r1, r2\n\
- bcc _08004E14\n\
- b _080052AA\n\
- .pool\n\
+ mov r1, r10\n\
+ ldr r2, [sp, #0xC]\n\
+ cmp r1, r2\n\
+ bcc _08004E14\n\
+ b _080052AA\n\
+ .pool\n\
_08004E84:\n\
- mov r1, r8\n\
- str r3, [sp, #0x14]\n\
- ldr r3, [sp]\n\
- add r3, r4\n\
- mov r12, r3\n\
- add r2, r1, #0\n\
- add r2, #0x8\n\
- str r2, [sp, #0x18]\n\
- ldr r3, [sp]\n\
- str r3, [sp, #0x1C]\n\
- mov r2, r12\n\
- str r2, [sp, #0x74]\n\
- ldr r3, [sp, #0x18]\n\
- str r3, [sp, #0x88]\n\
- sub r0, #0x8\n\
- str r0, [sp, #0x80]\n\
- cmp r1, r3\n\
- bcs _08004F0E\n\
+ mov r1, r8\n\
+ str r3, [sp, #0x14]\n\
+ ldr r3, [sp]\n\
+ add r3, r4\n\
+ mov r12, r3\n\
+ add r2, r1, #0\n\
+ add r2, #0x8\n\
+ str r2, [sp, #0x18]\n\
+ ldr r3, [sp]\n\
+ str r3, [sp, #0x1C]\n\
+ mov r2, r12\n\
+ str r2, [sp, #0x74]\n\
+ ldr r3, [sp, #0x18]\n\
+ str r3, [sp, #0x88]\n\
+ sub r0, #0x8\n\
+ str r0, [sp, #0x80]\n\
+ cmp r1, r3\n\
+ bcs _08004F0E\n\
_08004EA8:\n\
- ldr r0, [sp, #0x14]\n\
- ldm r0!, {r5}\n\
- str r0, [sp, #0x14]\n\
- ldr r4, [sp, #0x1C]\n\
- add r2, r1, #0x1\n\
- mov r8, r2\n\
- cmp r4, r12\n\
- bcs _08004F06\n\
- mov r3, #0x7\n\
- mov r10, r3\n\
- lsr r0, r1, #3\n\
- ldr r3, [sp, #0x4]\n\
- add r2, r0, #0\n\
- mul r2, r3\n\
- add r7, r2, #0\n\
- mov r0, r10\n\
- and r1, r0\n\
- lsl r6, r1, #2\n\
+ ldr r0, [sp, #0x14]\n\
+ ldm r0!, {r5}\n\
+ str r0, [sp, #0x14]\n\
+ ldr r4, [sp, #0x1C]\n\
+ add r2, r1, #0x1\n\
+ mov r8, r2\n\
+ cmp r4, r12\n\
+ bcs _08004F06\n\
+ mov r3, #0x7\n\
+ mov r10, r3\n\
+ lsr r0, r1, #3\n\
+ ldr r3, [sp, #0x4]\n\
+ add r2, r0, #0\n\
+ mul r2, r3\n\
+ add r7, r2, #0\n\
+ mov r0, r10\n\
+ and r1, r0\n\
+ lsl r6, r1, #2\n\
_08004ECC:\n\
- add r3, r5, #0\n\
- mov r1, #0xF\n\
- and r3, r1\n\
- cmp r3, #0\n\
- beq _08004EFE\n\
- lsr r2, r4, #3\n\
- lsl r2, #5\n\
- add r2, r9\n\
- add r0, r4, #0\n\
- mov r1, r10\n\
- and r0, r1\n\
- lsr r0, #1\n\
- add r2, r0\n\
- add r2, r7\n\
- add r2, r6\n\
- mov r1, #0x1\n\
- and r1, r4\n\
- lsl r1, #2\n\
- lsl r3, r1\n\
- mov r0, #0xF0\n\
- asr r0, r1\n\
- ldrb r1, [r2]\n\
- and r0, r1\n\
- orr r3, r0\n\
- strb r3, [r2]\n\
+ add r3, r5, #0\n\
+ mov r1, #0xF\n\
+ and r3, r1\n\
+ cmp r3, #0\n\
+ beq _08004EFE\n\
+ lsr r2, r4, #3\n\
+ lsl r2, #5\n\
+ add r2, r9\n\
+ add r0, r4, #0\n\
+ mov r1, r10\n\
+ and r0, r1\n\
+ lsr r0, #1\n\
+ add r2, r0\n\
+ add r2, r7\n\
+ add r2, r6\n\
+ mov r1, #0x1\n\
+ and r1, r4\n\
+ lsl r1, #2\n\
+ lsl r3, r1\n\
+ mov r0, #0xF0\n\
+ asr r0, r1\n\
+ ldrb r1, [r2]\n\
+ and r0, r1\n\
+ orr r3, r0\n\
+ strb r3, [r2]\n\
_08004EFE:\n\
- lsr r5, #4\n\
- add r4, #0x1\n\
- cmp r4, r12\n\
- bcc _08004ECC\n\
+ lsr r5, #4\n\
+ add r4, #0x1\n\
+ cmp r4, r12\n\
+ bcc _08004ECC\n\
_08004F06:\n\
- mov r1, r8\n\
- ldr r2, [sp, #0x18]\n\
- cmp r1, r2\n\
- bcc _08004EA8\n\
+ mov r1, r8\n\
+ ldr r2, [sp, #0x18]\n\
+ cmp r1, r2\n\
+ bcc _08004EA8\n\
_08004F0E:\n\
- ldr r1, [sp, #0x88]\n\
- ldr r3, =gUnknown_03002FD0\n\
- str r3, [sp, #0x20]\n\
- ldr r0, [sp, #0x74]\n\
- mov r8, r0\n\
- ldr r2, [sp, #0x80]\n\
- add r2, r1, r2\n\
- str r2, [sp, #0x24]\n\
- ldr r3, [sp]\n\
- str r3, [sp, #0x28]\n\
- cmp r1, r2\n\
- bcc _08004F28\n\
- b _080052AA\n\
+ ldr r1, [sp, #0x88]\n\
+ ldr r3, =gUnknown_03002FD0\n\
+ str r3, [sp, #0x20]\n\
+ ldr r0, [sp, #0x74]\n\
+ mov r8, r0\n\
+ ldr r2, [sp, #0x80]\n\
+ add r2, r1, r2\n\
+ str r2, [sp, #0x24]\n\
+ ldr r3, [sp]\n\
+ str r3, [sp, #0x28]\n\
+ cmp r1, r2\n\
+ bcc _08004F28\n\
+ b _080052AA\n\
_08004F28:\n\
- ldr r0, [sp, #0x20]\n\
- ldm r0!, {r5}\n\
- str r0, [sp, #0x20]\n\
- ldr r4, [sp, #0x28]\n\
- add r2, r1, #0x1\n\
- mov r10, r2\n\
- cmp r4, r8\n\
- bcs _08004F86\n\
- mov r3, #0x7\n\
- mov r12, r3\n\
- lsr r0, r1, #3\n\
- ldr r3, [sp, #0x4]\n\
- add r2, r0, #0\n\
- mul r2, r3\n\
- add r7, r2, #0\n\
- mov r0, r12\n\
- and r1, r0\n\
- lsl r6, r1, #2\n\
+ ldr r0, [sp, #0x20]\n\
+ ldm r0!, {r5}\n\
+ str r0, [sp, #0x20]\n\
+ ldr r4, [sp, #0x28]\n\
+ add r2, r1, #0x1\n\
+ mov r10, r2\n\
+ cmp r4, r8\n\
+ bcs _08004F86\n\
+ mov r3, #0x7\n\
+ mov r12, r3\n\
+ lsr r0, r1, #3\n\
+ ldr r3, [sp, #0x4]\n\
+ add r2, r0, #0\n\
+ mul r2, r3\n\
+ add r7, r2, #0\n\
+ mov r0, r12\n\
+ and r1, r0\n\
+ lsl r6, r1, #2\n\
_08004F4C:\n\
- add r3, r5, #0\n\
- mov r1, #0xF\n\
- and r3, r1\n\
- cmp r3, #0\n\
- beq _08004F7E\n\
- lsr r2, r4, #3\n\
- lsl r2, #5\n\
- add r2, r9\n\
- add r0, r4, #0\n\
- mov r1, r12\n\
- and r0, r1\n\
- lsr r0, #1\n\
- add r2, r0\n\
- add r2, r7\n\
- add r2, r6\n\
- mov r1, #0x1\n\
- and r1, r4\n\
- lsl r1, #2\n\
- lsl r3, r1\n\
- mov r0, #0xF0\n\
- asr r0, r1\n\
- ldrb r1, [r2]\n\
- and r0, r1\n\
- orr r3, r0\n\
- strb r3, [r2]\n\
+ add r3, r5, #0\n\
+ mov r1, #0xF\n\
+ and r3, r1\n\
+ cmp r3, #0\n\
+ beq _08004F7E\n\
+ lsr r2, r4, #3\n\
+ lsl r2, #5\n\
+ add r2, r9\n\
+ add r0, r4, #0\n\
+ mov r1, r12\n\
+ and r0, r1\n\
+ lsr r0, #1\n\
+ add r2, r0\n\
+ add r2, r7\n\
+ add r2, r6\n\
+ mov r1, #0x1\n\
+ and r1, r4\n\
+ lsl r1, #2\n\
+ lsl r3, r1\n\
+ mov r0, #0xF0\n\
+ asr r0, r1\n\
+ ldrb r1, [r2]\n\
+ and r0, r1\n\
+ orr r3, r0\n\
+ strb r3, [r2]\n\
_08004F7E:\n\
- lsr r5, #4\n\
- add r4, #0x1\n\
- cmp r4, r8\n\
- bcc _08004F4C\n\
+ lsr r5, #4\n\
+ add r4, #0x1\n\
+ cmp r4, r8\n\
+ bcc _08004F4C\n\
_08004F86:\n\
- mov r1, r10\n\
- ldr r2, [sp, #0x24]\n\
- cmp r1, r2\n\
- bcc _08004F28\n\
- b _080052AA\n\
- .pool\n\
+ mov r1, r10\n\
+ ldr r2, [sp, #0x24]\n\
+ cmp r1, r2\n\
+ bcc _08004F28\n\
+ b _080052AA\n\
+ .pool\n\
_08004F94:\n\
- cmp r0, #0x8\n\
- ble _08004F9A\n\
- b _080050A4\n\
+ cmp r0, #0x8\n\
+ ble _08004F9A\n\
+ b _080050A4\n\
_08004F9A:\n\
- mov r1, r8\n\
- str r3, [sp, #0x2C]\n\
- ldr r3, [sp]\n\
- add r3, #0x8\n\
- mov r12, r3\n\
- add r0, r8\n\
- str r0, [sp, #0x30]\n\
- ldr r0, [sp]\n\
- str r0, [sp, #0x34]\n\
- ldr r2, [sp, #0x30]\n\
- str r2, [sp, #0x78]\n\
- str r3, [sp, #0x84]\n\
- sub r4, #0x8\n\
- str r4, [sp, #0x7C]\n\
- cmp r8, r2\n\
- bcs _0800501C\n\
+ mov r1, r8\n\
+ str r3, [sp, #0x2C]\n\
+ ldr r3, [sp]\n\
+ add r3, #0x8\n\
+ mov r12, r3\n\
+ add r0, r8\n\
+ str r0, [sp, #0x30]\n\
+ ldr r0, [sp]\n\
+ str r0, [sp, #0x34]\n\
+ ldr r2, [sp, #0x30]\n\
+ str r2, [sp, #0x78]\n\
+ str r3, [sp, #0x84]\n\
+ sub r4, #0x8\n\
+ str r4, [sp, #0x7C]\n\
+ cmp r8, r2\n\
+ bcs _0800501C\n\
_08004FBA:\n\
- ldr r0, [sp, #0x2C]\n\
- ldm r0!, {r5}\n\
- str r0, [sp, #0x2C]\n\
- ldr r4, [sp, #0x34]\n\
- add r2, r1, #0x1\n\
- mov r10, r2\n\
- cmp r4, r12\n\
- bcs _08005014\n\
- lsr r0, r1, #3\n\
- ldr r2, [sp, #0x4]\n\
- add r3, r0, #0\n\
- mul r3, r2\n\
- add r7, r3, #0\n\
- mov r3, #0x7\n\
- and r1, r3\n\
- lsl r6, r1, #2\n\
+ ldr r0, [sp, #0x2C]\n\
+ ldm r0!, {r5}\n\
+ str r0, [sp, #0x2C]\n\
+ ldr r4, [sp, #0x34]\n\
+ add r2, r1, #0x1\n\
+ mov r10, r2\n\
+ cmp r4, r12\n\
+ bcs _08005014\n\
+ lsr r0, r1, #3\n\
+ ldr r2, [sp, #0x4]\n\
+ add r3, r0, #0\n\
+ mul r3, r2\n\
+ add r7, r3, #0\n\
+ mov r3, #0x7\n\
+ and r1, r3\n\
+ lsl r6, r1, #2\n\
_08004FDA:\n\
- add r3, r5, #0\n\
- mov r0, #0xF\n\
- and r3, r0\n\
- cmp r3, #0\n\
- beq _0800500C\n\
- lsr r2, r4, #3\n\
- lsl r2, #5\n\
- add r2, r9\n\
- add r0, r4, #0\n\
- mov r1, #0x7\n\
- and r0, r1\n\
- lsr r0, #1\n\
- add r2, r0\n\
- add r2, r7\n\
- add r2, r6\n\
- mov r1, #0x1\n\
- and r1, r4\n\
- lsl r1, #2\n\
- lsl r3, r1\n\
- mov r0, #0xF0\n\
- asr r0, r1\n\
- ldrb r1, [r2]\n\
- and r0, r1\n\
- orr r3, r0\n\
- strb r3, [r2]\n\
+ add r3, r5, #0\n\
+ mov r0, #0xF\n\
+ and r3, r0\n\
+ cmp r3, #0\n\
+ beq _0800500C\n\
+ lsr r2, r4, #3\n\
+ lsl r2, #5\n\
+ add r2, r9\n\
+ add r0, r4, #0\n\
+ mov r1, #0x7\n\
+ and r0, r1\n\
+ lsr r0, #1\n\
+ add r2, r0\n\
+ add r2, r7\n\
+ add r2, r6\n\
+ mov r1, #0x1\n\
+ and r1, r4\n\
+ lsl r1, #2\n\
+ lsl r3, r1\n\
+ mov r0, #0xF0\n\
+ asr r0, r1\n\
+ ldrb r1, [r2]\n\
+ and r0, r1\n\
+ orr r3, r0\n\
+ strb r3, [r2]\n\
_0800500C:\n\
- lsr r5, #4\n\
- add r4, #0x1\n\
- cmp r4, r12\n\
- bcc _08004FDA\n\
+ lsr r5, #4\n\
+ add r4, #0x1\n\
+ cmp r4, r12\n\
+ bcc _08004FDA\n\
_08005014:\n\
- mov r1, r10\n\
- ldr r2, [sp, #0x30]\n\
- cmp r1, r2\n\
- bcc _08004FBA\n\
+ mov r1, r10\n\
+ ldr r2, [sp, #0x30]\n\
+ cmp r1, r2\n\
+ bcc _08004FBA\n\
_0800501C:\n\
- mov r1, r8\n\
- ldr r3, =gUnknown_03002FB0\n\
- str r3, [sp, #0x38]\n\
- ldr r0, [sp, #0x84]\n\
- ldr r2, [sp, #0x7C]\n\
- add r0, r2\n\
- mov r8, r0\n\
- ldr r3, [sp, #0x78]\n\
- str r3, [sp, #0x3C]\n\
- ldr r0, [sp, #0x84]\n\
- str r0, [sp, #0x40]\n\
- cmp r1, r3\n\
- bcc _08005038\n\
- b _080052AA\n\
+ mov r1, r8\n\
+ ldr r3, =gUnknown_03002FB0\n\
+ str r3, [sp, #0x38]\n\
+ ldr r0, [sp, #0x84]\n\
+ ldr r2, [sp, #0x7C]\n\
+ add r0, r2\n\
+ mov r8, r0\n\
+ ldr r3, [sp, #0x78]\n\
+ str r3, [sp, #0x3C]\n\
+ ldr r0, [sp, #0x84]\n\
+ str r0, [sp, #0x40]\n\
+ cmp r1, r3\n\
+ bcc _08005038\n\
+ b _080052AA\n\
_08005038:\n\
- ldr r2, [sp, #0x38]\n\
- ldm r2!, {r5}\n\
- str r2, [sp, #0x38]\n\
- ldr r4, [sp, #0x40]\n\
- add r3, r1, #0x1\n\
- mov r10, r3\n\
- cmp r4, r8\n\
- bcs _08005096\n\
- mov r0, #0x7\n\
- mov r12, r0\n\
- lsr r0, r1, #3\n\
- ldr r3, [sp, #0x4]\n\
- add r2, r0, #0\n\
- mul r2, r3\n\
- add r7, r2, #0\n\
- mov r0, r12\n\
- and r1, r0\n\
- lsl r6, r1, #2\n\
+ ldr r2, [sp, #0x38]\n\
+ ldm r2!, {r5}\n\
+ str r2, [sp, #0x38]\n\
+ ldr r4, [sp, #0x40]\n\
+ add r3, r1, #0x1\n\
+ mov r10, r3\n\
+ cmp r4, r8\n\
+ bcs _08005096\n\
+ mov r0, #0x7\n\
+ mov r12, r0\n\
+ lsr r0, r1, #3\n\
+ ldr r3, [sp, #0x4]\n\
+ add r2, r0, #0\n\
+ mul r2, r3\n\
+ add r7, r2, #0\n\
+ mov r0, r12\n\
+ and r1, r0\n\
+ lsl r6, r1, #2\n\
_0800505C:\n\
- add r3, r5, #0\n\
- mov r1, #0xF\n\
- and r3, r1\n\
- cmp r3, #0\n\
- beq _0800508E\n\
- lsr r2, r4, #3\n\
- lsl r2, #5\n\
- add r2, r9\n\
- add r0, r4, #0\n\
- mov r1, r12\n\
- and r0, r1\n\
- lsr r0, #1\n\
- add r2, r0\n\
- add r2, r7\n\
- add r2, r6\n\
- mov r1, #0x1\n\
- and r1, r4\n\
- lsl r1, #2\n\
- lsl r3, r1\n\
- mov r0, #0xF0\n\
- asr r0, r1\n\
- ldrb r1, [r2]\n\
- and r0, r1\n\
- orr r3, r0\n\
- strb r3, [r2]\n\
+ add r3, r5, #0\n\
+ mov r1, #0xF\n\
+ and r3, r1\n\
+ cmp r3, #0\n\
+ beq _0800508E\n\
+ lsr r2, r4, #3\n\
+ lsl r2, #5\n\
+ add r2, r9\n\
+ add r0, r4, #0\n\
+ mov r1, r12\n\
+ and r0, r1\n\
+ lsr r0, #1\n\
+ add r2, r0\n\
+ add r2, r7\n\
+ add r2, r6\n\
+ mov r1, #0x1\n\
+ and r1, r4\n\
+ lsl r1, #2\n\
+ lsl r3, r1\n\
+ mov r0, #0xF0\n\
+ asr r0, r1\n\
+ ldrb r1, [r2]\n\
+ and r0, r1\n\
+ orr r3, r0\n\
+ strb r3, [r2]\n\
_0800508E:\n\
- lsr r5, #4\n\
- add r4, #0x1\n\
- cmp r4, r8\n\
- bcc _0800505C\n\
+ lsr r5, #4\n\
+ add r4, #0x1\n\
+ cmp r4, r8\n\
+ bcc _0800505C\n\
_08005096:\n\
- mov r1, r10\n\
- ldr r2, [sp, #0x3C]\n\
- cmp r1, r2\n\
- bcc _08005038\n\
- b _080052AA\n\
- .pool\n\
+ mov r1, r10\n\
+ ldr r2, [sp, #0x3C]\n\
+ cmp r1, r2\n\
+ bcc _08005038\n\
+ b _080052AA\n\
+ .pool\n\
_080050A4:\n\
- mov r1, r8\n\
- str r5, [sp, #0x44]\n\
- ldr r3, [sp]\n\
- add r3, #0x8\n\
- mov r12, r3\n\
- mov r2, r8\n\
- add r2, #0x8\n\
- str r2, [sp, #0x48]\n\
- ldr r3, [sp]\n\
- str r3, [sp, #0x4C]\n\
- str r2, [sp, #0x88]\n\
- sub r0, #0x8\n\
- str r0, [sp, #0x80]\n\
- mov r0, r12\n\
- str r0, [sp, #0x84]\n\
- sub r4, #0x8\n\
- str r4, [sp, #0x7C]\n\
- cmp r8, r2\n\
- bcs _0800512C\n\
+ mov r1, r8\n\
+ str r5, [sp, #0x44]\n\
+ ldr r3, [sp]\n\
+ add r3, #0x8\n\
+ mov r12, r3\n\
+ mov r2, r8\n\
+ add r2, #0x8\n\
+ str r2, [sp, #0x48]\n\
+ ldr r3, [sp]\n\
+ str r3, [sp, #0x4C]\n\
+ str r2, [sp, #0x88]\n\
+ sub r0, #0x8\n\
+ str r0, [sp, #0x80]\n\
+ mov r0, r12\n\
+ str r0, [sp, #0x84]\n\
+ sub r4, #0x8\n\
+ str r4, [sp, #0x7C]\n\
+ cmp r8, r2\n\
+ bcs _0800512C\n\
_080050CA:\n\
- ldr r2, [sp, #0x44]\n\
- ldm r2!, {r5}\n\
- str r2, [sp, #0x44]\n\
- ldr r4, [sp, #0x4C]\n\
- add r3, r1, #0x1\n\
- mov r10, r3\n\
- cmp r4, r12\n\
- bcs _08005124\n\
- lsr r0, r1, #3\n\
- ldr r3, [sp, #0x4]\n\
- add r2, r0, #0\n\
- mul r2, r3\n\
- add r7, r2, #0\n\
- mov r0, #0x7\n\
- and r1, r0\n\
- lsl r6, r1, #2\n\
+ ldr r2, [sp, #0x44]\n\
+ ldm r2!, {r5}\n\
+ str r2, [sp, #0x44]\n\
+ ldr r4, [sp, #0x4C]\n\
+ add r3, r1, #0x1\n\
+ mov r10, r3\n\
+ cmp r4, r12\n\
+ bcs _08005124\n\
+ lsr r0, r1, #3\n\
+ ldr r3, [sp, #0x4]\n\
+ add r2, r0, #0\n\
+ mul r2, r3\n\
+ add r7, r2, #0\n\
+ mov r0, #0x7\n\
+ and r1, r0\n\
+ lsl r6, r1, #2\n\
_080050EA:\n\
- add r3, r5, #0\n\
- mov r1, #0xF\n\
- and r3, r1\n\
- cmp r3, #0\n\
- beq _0800511C\n\
- lsr r2, r4, #3\n\
- lsl r2, #5\n\
- add r2, r9\n\
- add r0, r4, #0\n\
- mov r1, #0x7\n\
- and r0, r1\n\
- lsr r0, #1\n\
- add r2, r0\n\
- add r2, r7\n\
- add r2, r6\n\
- mov r1, #0x1\n\
- and r1, r4\n\
- lsl r1, #2\n\
- lsl r3, r1\n\
- mov r0, #0xF0\n\
- asr r0, r1\n\
- ldrb r1, [r2]\n\
- and r0, r1\n\
- orr r3, r0\n\
- strb r3, [r2]\n\
+ add r3, r5, #0\n\
+ mov r1, #0xF\n\
+ and r3, r1\n\
+ cmp r3, #0\n\
+ beq _0800511C\n\
+ lsr r2, r4, #3\n\
+ lsl r2, #5\n\
+ add r2, r9\n\
+ add r0, r4, #0\n\
+ mov r1, #0x7\n\
+ and r0, r1\n\
+ lsr r0, #1\n\
+ add r2, r0\n\
+ add r2, r7\n\
+ add r2, r6\n\
+ mov r1, #0x1\n\
+ and r1, r4\n\
+ lsl r1, #2\n\
+ lsl r3, r1\n\
+ mov r0, #0xF0\n\
+ asr r0, r1\n\
+ ldrb r1, [r2]\n\
+ and r0, r1\n\
+ orr r3, r0\n\
+ strb r3, [r2]\n\
_0800511C:\n\
- lsr r5, #4\n\
- add r4, #0x1\n\
- cmp r4, r12\n\
- bcc _080050EA\n\
+ lsr r5, #4\n\
+ add r4, #0x1\n\
+ cmp r4, r12\n\
+ bcc _080050EA\n\
_08005124:\n\
- mov r1, r10\n\
- ldr r2, [sp, #0x48]\n\
- cmp r1, r2\n\
- bcc _080050CA\n\
+ mov r1, r10\n\
+ ldr r2, [sp, #0x48]\n\
+ cmp r1, r2\n\
+ bcc _080050CA\n\
_0800512C:\n\
- mov r1, r8\n\
- ldr r3, =gUnknown_03002FB0\n\
- str r3, [sp, #0x50]\n\
- ldr r0, [sp, #0x84]\n\
- ldr r2, [sp, #0x7C]\n\
- add r0, r2\n\
- mov r8, r0\n\
- ldr r3, [sp, #0x88]\n\
- str r3, [sp, #0x54]\n\
- ldr r0, [sp, #0x84]\n\
- str r0, [sp, #0x58]\n\
- cmp r1, r3\n\
- bcs _080051AC\n\
+ mov r1, r8\n\
+ ldr r3, =gUnknown_03002FB0\n\
+ str r3, [sp, #0x50]\n\
+ ldr r0, [sp, #0x84]\n\
+ ldr r2, [sp, #0x7C]\n\
+ add r0, r2\n\
+ mov r8, r0\n\
+ ldr r3, [sp, #0x88]\n\
+ str r3, [sp, #0x54]\n\
+ ldr r0, [sp, #0x84]\n\
+ str r0, [sp, #0x58]\n\
+ cmp r1, r3\n\
+ bcs _080051AC\n\
_08005146:\n\
- ldr r2, [sp, #0x50]\n\
- ldm r2!, {r5}\n\
- str r2, [sp, #0x50]\n\
- ldr r4, [sp, #0x58]\n\
- add r3, r1, #0x1\n\
- mov r10, r3\n\
- cmp r4, r8\n\
- bcs _080051A4\n\
- mov r0, #0x7\n\
- mov r12, r0\n\
- lsr r0, r1, #3\n\
- ldr r3, [sp, #0x4]\n\
- add r2, r0, #0\n\
- mul r2, r3\n\
- add r7, r2, #0\n\
- mov r0, r12\n\
- and r1, r0\n\
- lsl r6, r1, #2\n\
+ ldr r2, [sp, #0x50]\n\
+ ldm r2!, {r5}\n\
+ str r2, [sp, #0x50]\n\
+ ldr r4, [sp, #0x58]\n\
+ add r3, r1, #0x1\n\
+ mov r10, r3\n\
+ cmp r4, r8\n\
+ bcs _080051A4\n\
+ mov r0, #0x7\n\
+ mov r12, r0\n\
+ lsr r0, r1, #3\n\
+ ldr r3, [sp, #0x4]\n\
+ add r2, r0, #0\n\
+ mul r2, r3\n\
+ add r7, r2, #0\n\
+ mov r0, r12\n\
+ and r1, r0\n\
+ lsl r6, r1, #2\n\
_0800516A:\n\
- add r3, r5, #0\n\
- mov r1, #0xF\n\
- and r3, r1\n\
- cmp r3, #0\n\
- beq _0800519C\n\
- lsr r2, r4, #3\n\
- lsl r2, #5\n\
- add r2, r9\n\
- add r0, r4, #0\n\
- mov r1, r12\n\
- and r0, r1\n\
- lsr r0, #1\n\
- add r2, r0\n\
- add r2, r7\n\
- add r2, r6\n\
- mov r1, #0x1\n\
- and r1, r4\n\
- lsl r1, #2\n\
- lsl r3, r1\n\
- mov r0, #0xF0\n\
- asr r0, r1\n\
- ldrb r1, [r2]\n\
- and r0, r1\n\
- orr r3, r0\n\
- strb r3, [r2]\n\
+ add r3, r5, #0\n\
+ mov r1, #0xF\n\
+ and r3, r1\n\
+ cmp r3, #0\n\
+ beq _0800519C\n\
+ lsr r2, r4, #3\n\
+ lsl r2, #5\n\
+ add r2, r9\n\
+ add r0, r4, #0\n\
+ mov r1, r12\n\
+ and r0, r1\n\
+ lsr r0, #1\n\
+ add r2, r0\n\
+ add r2, r7\n\
+ add r2, r6\n\
+ mov r1, #0x1\n\
+ and r1, r4\n\
+ lsl r1, #2\n\
+ lsl r3, r1\n\
+ mov r0, #0xF0\n\
+ asr r0, r1\n\
+ ldrb r1, [r2]\n\
+ and r0, r1\n\
+ orr r3, r0\n\
+ strb r3, [r2]\n\
_0800519C:\n\
- lsr r5, #4\n\
- add r4, #0x1\n\
- cmp r4, r8\n\
- bcc _0800516A\n\
+ lsr r5, #4\n\
+ add r4, #0x1\n\
+ cmp r4, r8\n\
+ bcc _0800516A\n\
_080051A4:\n\
- mov r1, r10\n\
- ldr r2, [sp, #0x54]\n\
- cmp r1, r2\n\
- bcc _08005146\n\
+ mov r1, r10\n\
+ ldr r2, [sp, #0x54]\n\
+ cmp r1, r2\n\
+ bcc _08005146\n\
_080051AC:\n\
- ldr r1, [sp, #0x88]\n\
- ldr r3, =gUnknown_03002FD0\n\
- str r3, [sp, #0x5C]\n\
- ldr r0, [sp, #0x84]\n\
- mov r8, r0\n\
- ldr r2, [sp, #0x80]\n\
- add r2, r1, r2\n\
- str r2, [sp, #0x60]\n\
- ldr r3, [sp]\n\
- str r3, [sp, #0x64]\n\
- cmp r1, r2\n\
- bcs _0800522A\n\
+ ldr r1, [sp, #0x88]\n\
+ ldr r3, =gUnknown_03002FD0\n\
+ str r3, [sp, #0x5C]\n\
+ ldr r0, [sp, #0x84]\n\
+ mov r8, r0\n\
+ ldr r2, [sp, #0x80]\n\
+ add r2, r1, r2\n\
+ str r2, [sp, #0x60]\n\
+ ldr r3, [sp]\n\
+ str r3, [sp, #0x64]\n\
+ cmp r1, r2\n\
+ bcs _0800522A\n\
_080051C4:\n\
- ldr r0, [sp, #0x5C]\n\
- ldm r0!, {r5}\n\
- str r0, [sp, #0x5C]\n\
- ldr r4, [sp, #0x64]\n\
- add r2, r1, #0x1\n\
- mov r10, r2\n\
- cmp r4, r8\n\
- bcs _08005222\n\
- mov r3, #0x7\n\
- mov r12, r3\n\
- lsr r0, r1, #3\n\
- ldr r3, [sp, #0x4]\n\
- add r2, r0, #0\n\
- mul r2, r3\n\
- add r7, r2, #0\n\
- mov r0, r12\n\
- and r1, r0\n\
- lsl r6, r1, #2\n\
+ ldr r0, [sp, #0x5C]\n\
+ ldm r0!, {r5}\n\
+ str r0, [sp, #0x5C]\n\
+ ldr r4, [sp, #0x64]\n\
+ add r2, r1, #0x1\n\
+ mov r10, r2\n\
+ cmp r4, r8\n\
+ bcs _08005222\n\
+ mov r3, #0x7\n\
+ mov r12, r3\n\
+ lsr r0, r1, #3\n\
+ ldr r3, [sp, #0x4]\n\
+ add r2, r0, #0\n\
+ mul r2, r3\n\
+ add r7, r2, #0\n\
+ mov r0, r12\n\
+ and r1, r0\n\
+ lsl r6, r1, #2\n\
_080051E8:\n\
- add r3, r5, #0\n\
- mov r1, #0xF\n\
- and r3, r1\n\
- cmp r3, #0\n\
- beq _0800521A\n\
- lsr r2, r4, #3\n\
- lsl r2, #5\n\
- add r2, r9\n\
- add r0, r4, #0\n\
- mov r1, r12\n\
- and r0, r1\n\
- lsr r0, #1\n\
- add r2, r0\n\
- add r2, r7\n\
- add r2, r6\n\
- mov r1, #0x1\n\
- and r1, r4\n\
- lsl r1, #2\n\
- lsl r3, r1\n\
- mov r0, #0xF0\n\
- asr r0, r1\n\
- ldrb r1, [r2]\n\
- and r0, r1\n\
- orr r3, r0\n\
- strb r3, [r2]\n\
+ add r3, r5, #0\n\
+ mov r1, #0xF\n\
+ and r3, r1\n\
+ cmp r3, #0\n\
+ beq _0800521A\n\
+ lsr r2, r4, #3\n\
+ lsl r2, #5\n\
+ add r2, r9\n\
+ add r0, r4, #0\n\
+ mov r1, r12\n\
+ and r0, r1\n\
+ lsr r0, #1\n\
+ add r2, r0\n\
+ add r2, r7\n\
+ add r2, r6\n\
+ mov r1, #0x1\n\
+ and r1, r4\n\
+ lsl r1, #2\n\
+ lsl r3, r1\n\
+ mov r0, #0xF0\n\
+ asr r0, r1\n\
+ ldrb r1, [r2]\n\
+ and r0, r1\n\
+ orr r3, r0\n\
+ strb r3, [r2]\n\
_0800521A:\n\
- lsr r5, #4\n\
- add r4, #0x1\n\
- cmp r4, r8\n\
- bcc _080051E8\n\
+ lsr r5, #4\n\
+ add r4, #0x1\n\
+ cmp r4, r8\n\
+ bcc _080051E8\n\
_08005222:\n\
- mov r1, r10\n\
- ldr r2, [sp, #0x60]\n\
- cmp r1, r2\n\
- bcc _080051C4\n\
+ mov r1, r10\n\
+ ldr r2, [sp, #0x60]\n\
+ cmp r1, r2\n\
+ bcc _080051C4\n\
_0800522A:\n\
- ldr r4, [sp, #0x84]\n\
- ldr r1, [sp, #0x88]\n\
- ldr r3, =gUnknown_03002FF0\n\
- str r3, [sp, #0x68]\n\
- ldr r0, [sp, #0x7C]\n\
- add r0, r4\n\
- mov r8, r0\n\
- ldr r2, [sp, #0x80]\n\
- add r2, r1, r2\n\
- str r2, [sp, #0x6C]\n\
- str r4, [sp, #0x70]\n\
- cmp r1, r2\n\
- bcs _080052AA\n\
+ ldr r4, [sp, #0x84]\n\
+ ldr r1, [sp, #0x88]\n\
+ ldr r3, =gUnknown_03002FF0\n\
+ str r3, [sp, #0x68]\n\
+ ldr r0, [sp, #0x7C]\n\
+ add r0, r4\n\
+ mov r8, r0\n\
+ ldr r2, [sp, #0x80]\n\
+ add r2, r1, r2\n\
+ str r2, [sp, #0x6C]\n\
+ str r4, [sp, #0x70]\n\
+ cmp r1, r2\n\
+ bcs _080052AA\n\
_08005244:\n\
- ldr r3, [sp, #0x68]\n\
- ldm r3!, {r5}\n\
- str r3, [sp, #0x68]\n\
- ldr r4, [sp, #0x70]\n\
- add r0, r1, #0x1\n\
- mov r10, r0\n\
- cmp r4, r8\n\
- bcs _080052A2\n\
- mov r2, #0x7\n\
- mov r12, r2\n\
- lsr r0, r1, #3\n\
- ldr r2, [sp, #0x4]\n\
- add r3, r0, #0\n\
- mul r3, r2\n\
- add r7, r3, #0\n\
- mov r3, r12\n\
- and r1, r3\n\
- lsl r6, r1, #2\n\
+ ldr r3, [sp, #0x68]\n\
+ ldm r3!, {r5}\n\
+ str r3, [sp, #0x68]\n\
+ ldr r4, [sp, #0x70]\n\
+ add r0, r1, #0x1\n\
+ mov r10, r0\n\
+ cmp r4, r8\n\
+ bcs _080052A2\n\
+ mov r2, #0x7\n\
+ mov r12, r2\n\
+ lsr r0, r1, #3\n\
+ ldr r2, [sp, #0x4]\n\
+ add r3, r0, #0\n\
+ mul r3, r2\n\
+ add r7, r3, #0\n\
+ mov r3, r12\n\
+ and r1, r3\n\
+ lsl r6, r1, #2\n\
_08005268:\n\
- add r3, r5, #0\n\
- mov r0, #0xF\n\
- and r3, r0\n\
- cmp r3, #0\n\
- beq _0800529A\n\
- lsr r2, r4, #3\n\
- lsl r2, #5\n\
- add r2, r9\n\
- add r0, r4, #0\n\
- mov r1, r12\n\
- and r0, r1\n\
- lsr r0, #1\n\
- add r2, r0\n\
- add r2, r7\n\
- add r2, r6\n\
- mov r1, #0x1\n\
- and r1, r4\n\
- lsl r1, #2\n\
- lsl r3, r1\n\
- mov r0, #0xF0\n\
- asr r0, r1\n\
- ldrb r1, [r2]\n\
- and r0, r1\n\
- orr r3, r0\n\
- strb r3, [r2]\n\
+ add r3, r5, #0\n\
+ mov r0, #0xF\n\
+ and r3, r0\n\
+ cmp r3, #0\n\
+ beq _0800529A\n\
+ lsr r2, r4, #3\n\
+ lsl r2, #5\n\
+ add r2, r9\n\
+ add r0, r4, #0\n\
+ mov r1, r12\n\
+ and r0, r1\n\
+ lsr r0, #1\n\
+ add r2, r0\n\
+ add r2, r7\n\
+ add r2, r6\n\
+ mov r1, #0x1\n\
+ and r1, r4\n\
+ lsl r1, #2\n\
+ lsl r3, r1\n\
+ mov r0, #0xF0\n\
+ asr r0, r1\n\
+ ldrb r1, [r2]\n\
+ and r0, r1\n\
+ orr r3, r0\n\
+ strb r3, [r2]\n\
_0800529A:\n\
- lsr r5, #4\n\
- add r4, #0x1\n\
- cmp r4, r8\n\
- bcc _08005268\n\
+ lsr r5, #4\n\
+ add r4, #0x1\n\
+ cmp r4, r8\n\
+ bcc _08005268\n\
_080052A2:\n\
- mov r1, r10\n\
- ldr r2, [sp, #0x6C]\n\
- cmp r1, r2\n\
- bcc _08005244\n\
+ mov r1, r10\n\
+ ldr r2, [sp, #0x6C]\n\
+ cmp r1, r2\n\
+ bcc _08005244\n\
_080052AA:\n\
- add sp, #0x8C\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\
- .pool");
+ add sp, #0x8C\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\
+ .pool");
}
void ClearTextSpan(struct TextPrinter *textPrinter, u32 width)
@@ -2046,733 +2051,1027 @@ void DrawDownArrow(u8 windowId, u16 x, u16 y, u8 bgColor, bool8 drawArrow, u8 *c
}
}
}
+#ifdef NONMATCHING
+u16 RenderText(struct TextPrinter *textPrinter)
+{
+ struct TextPrinterSubStruct *r4 = &textPrinter->sub_union.sub;
+ u16 currChar;
+ s32 width;
-ASM_DIRECT
-u16 RenderText(struct TextPrinter *textPrinter) // 80057B4
+ switch (textPrinter->state) // _080057C4
+ {
+ case 0: // _080057F0
+ if ((gMain.heldKeys & (A_BUTTON | B_BUTTON)) && r4->font_type_upper)
+ textPrinter->delayCounter = 0;
+
+ if (textPrinter->delayCounter && textPrinter->text_speed) //_0800580A
+ {
+ textPrinter->delayCounter--;
+ if (gTextFlags.flag_0 && (gMain.newKeys & (A_BUTTON | B_BUTTON)))
+ {
+ r4->font_type_upper = 1;
+ textPrinter->delayCounter = 0;
+ }
+ return 3;
+ }
+
+ if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED) && gTextFlags.flag_2)
+ textPrinter->delayCounter = 3;
+ else
+ textPrinter->delayCounter = textPrinter->text_speed;
+
+ currChar = *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+
+ switch (currChar) //_0800588A
+ {
+ case 0xF8+6: //_080058B8
+ textPrinter->subPrinter.currentX = textPrinter->subPrinter.x;
+ textPrinter->subPrinter.currentY += (gFonts[textPrinter->subPrinter.fontId].maxLetterHeight + textPrinter->subPrinter.lineSpacing);
+ return 2;
+ case 0xF8+5: //_080058DC
+ textPrinter->subPrinter.current_text_offset++;
+ return 2;
+ case 0xF8+4: //_080058E0
+ currChar = *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ switch (currChar) // _080058F0
+ {
+ case 1: // _08005960
+ textPrinter->subPrinter.fontColor_h = *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ GenerateFontHalfRowLookupTable(textPrinter->subPrinter.fontColor_h, textPrinter->subPrinter.bgColor, textPrinter->subPrinter.shadowColor);
+ return 2;
+ case 2: // _08005982
+ textPrinter->subPrinter.bgColor = *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ GenerateFontHalfRowLookupTable(textPrinter->subPrinter.fontColor_h, textPrinter->subPrinter.bgColor, textPrinter->subPrinter.shadowColor);
+ return 2;
+ case 3: // _080059A6
+ textPrinter->subPrinter.shadowColor = *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ GenerateFontHalfRowLookupTable(textPrinter->subPrinter.fontColor_h, textPrinter->subPrinter.bgColor, textPrinter->subPrinter.shadowColor);
+ return 2;
+ case 4: // _080059C0
+ textPrinter->subPrinter.fontColor_h = *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ textPrinter->subPrinter.bgColor = *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ textPrinter->subPrinter.shadowColor = *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ GenerateFontHalfRowLookupTable(textPrinter->subPrinter.fontColor_h, textPrinter->subPrinter.bgColor, textPrinter->subPrinter.shadowColor);
+ return 2;
+ case 5: // _08005A0E
+ textPrinter->subPrinter.current_text_offset++;
+ return 2;
+ case 6: //_08005A12
+ r4->font_type = *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ return 2;
+ case 7: // _08005A0A
+ return 2;
+ case 8: // _08005A2A
+ textPrinter->delayCounter = *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ textPrinter->state = 6;
+ return 2;
+ case 9: // _08005A3A
+ textPrinter->state = 1;
+ if (gTextFlags.flag_2)
+ r4->frames_visible_counter = 0;
+ return 3;
+ case 10: // _08005A58
+ textPrinter->state = 5;
+ return 3;
+ case 11: // _08005A5C
+ currChar = *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ currChar |= *textPrinter->subPrinter.current_text_offset << 8;
+ textPrinter->subPrinter.current_text_offset++;
+ PlayBGM(currChar);
+ return 2;
+ case 16: // _08005A76
+ currChar = *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ currChar |= (*textPrinter->subPrinter.current_text_offset << 8);
+ textPrinter->subPrinter.current_text_offset++;
+ PlaySE(currChar);
+ return 2;
+ case 13: // _08005A90
+ textPrinter->subPrinter.currentX = textPrinter->subPrinter.x + *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ return 2;
+ case 14: // _08005A98
+ textPrinter->subPrinter.currentY = textPrinter->subPrinter.y + *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ return 2;
+ case 15: // _08005AA4
+ FillWindowPixelBuffer(textPrinter->subPrinter.windowId, textPrinter->subPrinter.bgColor | textPrinter->subPrinter.bgColor << 4);
+ textPrinter->subPrinter.currentX = textPrinter->subPrinter.x;
+ textPrinter->subPrinter.currentY = textPrinter->subPrinter.y;
+ return 2;
+ case 23: // _08005ABE
+ m4aMPlayStop(&gMPlayInfo_BGM);
+ return 2;
+ case 24: // _08005ACC
+ m4aMPlayContinue(&gMPlayInfo_BGM);
+ return 2;
+ case 17: // _08005AD8
+ width = *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ if (width > 0)
+ {
+ ClearTextSpan(textPrinter, width);
+ textPrinter->subPrinter.currentX += width;
+ return 0;
+ }
+ return 2;
+ case 18: // _08005AF2
+ textPrinter->subPrinter.currentX = *textPrinter->subPrinter.current_text_offset + textPrinter->subPrinter.x;
+ textPrinter->subPrinter.current_text_offset++;
+ return 2;
+ case 19: // _08005B02
+ {
+ s32 widthHelper = *textPrinter->subPrinter.current_text_offset;
+ widthHelper += textPrinter->subPrinter.x;
+ textPrinter->subPrinter.current_text_offset++;
+ width = widthHelper - textPrinter->subPrinter.currentX;
+ if (width > 0)
+ {
+ ClearTextSpan(textPrinter, width);
+ textPrinter->subPrinter.currentX += width;
+ return 0;
+ }
+ }
+ return 2;
+ case 20: // _08005B26
+ textPrinter->minLetterSpacing = *textPrinter->subPrinter.current_text_offset++;
+ return 2;
+ case 21: // _08005B36
+ textPrinter->japanese = 1;
+ return 2;
+ case 22: // _08005B3E
+ textPrinter->japanese = 0;
+ return 2;
+ case 12: // _08005B5A
+ currChar = *textPrinter->subPrinter.current_text_offset | 0x100;
+ textPrinter->subPrinter.current_text_offset++;
+ break;
+ }
+ break;
+
+ case 0xF8+3: // _08005B48
+ textPrinter->state = 2;
+ TextPrinterInitDownArrowCounters(textPrinter);
+ return 3;
+ case 0xF8+2: // _08005B4C
+ textPrinter->state = 3;
+ TextPrinterInitDownArrowCounters(textPrinter);
+ return 3;
+ case 0xF8+1: // _08005B5A
+ currChar = *textPrinter->subPrinter.current_text_offset | 0x100;
+ textPrinter->subPrinter.current_text_offset++;
+ break;
+ case 0xF8+0: // _08005B6C
+ currChar = *textPrinter->subPrinter.current_text_offset;
+ textPrinter->subPrinter.current_text_offset++;
+ gUnknown_03002F90[0x80] = DrawKeypadIcon(textPrinter->subPrinter.windowId, currChar, textPrinter->subPrinter.currentX, textPrinter->subPrinter.currentY);
+ textPrinter->subPrinter.currentX += gUnknown_03002F90[0x80] + textPrinter->subPrinter.letterSpacing;
+ return 0;
+ case 0xF8+7: // _08005D6C
+ return 1;
+ }
+
+ switch (r4->font_type) // _08005B90
+ {
+ case 0: // _08005BCC
+ DecompressGlyphFont0(currChar, textPrinter->japanese);
+ break;
+ case 1: // _08005BDA
+ DecompressGlyphFont1(currChar, textPrinter->japanese);
+ break;
+ case 2:
+ case 3:
+ case 4:
+ case 5: // _08005BE8
+ DecompressGlyphFont2(currChar, textPrinter->japanese);
+ break;
+ case 7: // _08005BF6
+ DecompressGlyphFont7(currChar, textPrinter->japanese);
+ break;
+ case 8: // _08005C04
+ DecompressGlyphFont8(currChar, textPrinter->japanese);
+ break;
+ case 6: // _08005C10
+ break;
+ }
+
+ CopyGlyphToWindow(textPrinter); // _08005C10
+
+ if (textPrinter->minLetterSpacing)
+ {
+ textPrinter->subPrinter.currentX += gUnknown_03002F90[0x80];
+ width = textPrinter->minLetterSpacing - gUnknown_03002F90[0x80];
+ if (width > 0)
+ {
+ ClearTextSpan(textPrinter, width);
+ textPrinter->subPrinter.currentX += width;
+ }
+ }
+ else // _08005C48
+ {
+ if (textPrinter->japanese)
+ textPrinter->subPrinter.currentX += (gUnknown_03002F90[0x80] + textPrinter->subPrinter.letterSpacing);
+ else
+ textPrinter->subPrinter.currentX += gUnknown_03002F90[0x80];
+ }
+ return 0;
+ case 1: // _08005C78
+ if (TextPrinterWait(textPrinter))
+ textPrinter->state = 0;
+ return 3;
+ case 2: // _08005C8C
+ if (TextPrinterWaitWithDownArrow(textPrinter))
+ {
+ FillWindowPixelBuffer(textPrinter->subPrinter.windowId, (textPrinter->subPrinter.bgColor << 4) | textPrinter->subPrinter.bgColor);
+ textPrinter->subPrinter.currentX = textPrinter->subPrinter.x;
+ textPrinter->subPrinter.currentY = textPrinter->subPrinter.y;
+ textPrinter->state = 0;
+ }
+ return 3;
+ case 3: // _08005CB8
+ if (TextPrinterWaitWithDownArrow(textPrinter))
+ {
+ TextPrinterClearDownArrow(textPrinter);
+ textPrinter->scrollDistance = gFonts[textPrinter->subPrinter.fontId].maxLetterHeight + textPrinter->subPrinter.lineSpacing;
+ textPrinter->subPrinter.currentX = textPrinter->subPrinter.x;
+ textPrinter->state = 4;
+ }
+ return 3;
+ case 4: // _08005CF0
+ if (textPrinter->scrollDistance)
+ {
+ int scrollSpeed = sub_8197964();
+ int speed = gWindowVerticalScrollSpeeds[scrollSpeed];
+ if (textPrinter->scrollDistance < speed)
+ {
+ ScrollWindow(textPrinter->subPrinter.windowId, 0, textPrinter->scrollDistance, textPrinter->subPrinter.bgColor << 4 | textPrinter->subPrinter.bgColor);
+ textPrinter->scrollDistance = 0;
+ }
+ else
+ {
+ ScrollWindow(textPrinter->subPrinter.windowId, 0, speed, textPrinter->subPrinter.bgColor << 4 | textPrinter->subPrinter.bgColor);
+ textPrinter->scrollDistance -= speed;
+ }
+ CopyWindowToVram(textPrinter->subPrinter.windowId, 2);
+ }
+ else
+ {
+ textPrinter->state = 0;
+ }
+ return 3;
+ case 5: // _08005D48
+ if (!IsSEPlaying())
+ textPrinter->state = 0;
+ return 3;
+ case 6: // _08005D5A
+ if (textPrinter->delayCounter != 0)
+ textPrinter->delayCounter--;
+ else
+ textPrinter->state = 0;
+ return 3;
+ }
+
+ return 1;
+}
+#else
+__attribute__((naked))
+u16 RenderText(struct TextPrinter *textPrinter)
{
asm("push {r4-r6,lr}\n\
- add r6, r0, #0\n\
- add r4, r6, #0\n\
- add r4, #0x14\n\
- ldrb r0, [r6, #0x1C]\n\
- cmp r0, #0x6\n\
- bls _080057C4\n\
- b _08005D6C\n\
+ add r6, r0, #0\n\
+ add r4, r6, #0\n\
+ add r4, #0x14\n\
+ ldrb r0, [r6, #0x1C]\n\
+ cmp r0, #0x6\n\
+ bls _080057C4\n\
+ b _08005D6C\n\
_080057C4:\n\
- lsl r0, #2\n\
- ldr r1, =_080057D4\n\
- add r0, r1\n\
- ldr r0, [r0]\n\
- mov pc, r0\n\
- .pool\n\
- .align 2, 0\n\
+ lsl r0, #2\n\
+ ldr r1, =_080057D4\n\
+ add r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .pool\n\
+ .align 2, 0\n\
_080057D4:\n\
- .4byte _080057F0\n\
- .4byte _08005C78\n\
- .4byte _08005C8C\n\
- .4byte _08005CB8\n\
- .4byte _08005CF0\n\
- .4byte _08005D48\n\
- .4byte _08005D5A\n\
+ .4byte _080057F0\n\
+ .4byte _08005C78\n\
+ .4byte _08005C8C\n\
+ .4byte _08005CB8\n\
+ .4byte _08005CF0\n\
+ .4byte _08005D48\n\
+ .4byte _08005D5A\n\
_080057F0:\n\
- ldr r2, =gMain\n\
- ldrh r1, [r2, #0x2C]\n\
- mov r0, #0x3\n\
- and r0, r1\n\
- cmp r0, #0\n\
- beq _0800580A\n\
- ldrb r1, [r4]\n\
- mov r0, #0x10\n\
- and r0, r1\n\
- cmp r0, #0\n\
- beq _0800580A\n\
- mov r0, #0\n\
- strb r0, [r6, #0x1E]\n\
+ ldr r2, =gMain\n\
+ ldrh r1, [r2, #0x2C]\n\
+ mov r0, #0x3\n\
+ and r0, r1\n\
+ cmp r0, #0\n\
+ beq _0800580A\n\
+ ldrb r1, [r4]\n\
+ mov r0, #0x10\n\
+ and r0, r1\n\
+ cmp r0, #0\n\
+ beq _0800580A\n\
+ mov r0, #0\n\
+ strb r0, [r6, #0x1E]\n\
_0800580A:\n\
- ldrb r1, [r6, #0x1E]\n\
- cmp r1, #0\n\
- beq _0800584C\n\
- ldrb r0, [r6, #0x1D]\n\
- cmp r0, #0\n\
- beq _0800584C\n\
- sub r0, r1, #0x1\n\
- strb r0, [r6, #0x1E]\n\
- ldr r0, =gTextFlags\n\
- ldrb r1, [r0]\n\
- mov r0, #0x1\n\
- and r0, r1\n\
- cmp r0, #0\n\
- bne _08005828\n\
- b _08005B56\n\
+ ldrb r1, [r6, #0x1E]\n\
+ cmp r1, #0\n\
+ beq _0800584C\n\
+ ldrb r0, [r6, #0x1D]\n\
+ cmp r0, #0\n\
+ beq _0800584C\n\
+ sub r0, r1, #0x1\n\
+ strb r0, [r6, #0x1E]\n\
+ ldr r0, =gTextFlags\n\
+ ldrb r1, [r0]\n\
+ mov r0, #0x1\n\
+ and r0, r1\n\
+ cmp r0, #0\n\
+ bne _08005828\n\
+ b _08005B56\n\
_08005828:\n\
- ldrh r1, [r2, #0x2E]\n\
- mov r0, #0x3\n\
- and r0, r1\n\
- cmp r0, #0\n\
- bne _08005834\n\
- b _08005B56\n\
+ ldrh r1, [r2, #0x2E]\n\
+ mov r0, #0x3\n\
+ and r0, r1\n\
+ cmp r0, #0\n\
+ bne _08005834\n\
+ b _08005B56\n\
_08005834:\n\
- ldrb r0, [r4]\n\
- mov r1, #0x10\n\
- orr r0, r1\n\
- strb r0, [r4]\n\
- mov r0, #0\n\
- strb r0, [r6, #0x1E]\n\
- b _08005B56\n\
- .pool\n\
+ ldrb r0, [r4]\n\
+ mov r1, #0x10\n\
+ orr r0, r1\n\
+ strb r0, [r4]\n\
+ mov r0, #0\n\
+ strb r0, [r6, #0x1E]\n\
+ b _08005B56\n\
+ .pool\n\
_0800584C:\n\
- ldr r0, =gBattleTypeFlags\n\
- ldr r0, [r0]\n\
- mov r1, #0x80\n\
- lsl r1, #17\n\
- and r0, r1\n\
- cmp r0, #0\n\
- bne _08005874\n\
- ldr r0, =gTextFlags\n\
- ldrb r1, [r0]\n\
- mov r0, #0x4\n\
- and r0, r1\n\
- cmp r0, #0\n\
- beq _08005874\n\
- mov r0, #0x3\n\
- b _08005876\n\
- .pool\n\
+ ldr r0, =gBattleTypeFlags\n\
+ ldr r0, [r0]\n\
+ mov r1, #0x80\n\
+ lsl r1, #17\n\
+ and r0, r1\n\
+ cmp r0, #0\n\
+ bne _08005874\n\
+ ldr r0, =gTextFlags\n\
+ ldrb r1, [r0]\n\
+ mov r0, #0x4\n\
+ and r0, r1\n\
+ cmp r0, #0\n\
+ beq _08005874\n\
+ mov r0, #0x3\n\
+ b _08005876\n\
+ .pool\n\
_08005874:\n\
- ldrb r0, [r6, #0x1D]\n\
+ ldrb r0, [r6, #0x1D]\n\
_08005876:\n\
- strb r0, [r6, #0x1E]\n\
- ldr r0, [r6]\n\
- ldrb r3, [r0]\n\
- add r0, #0x1\n\
- str r0, [r6]\n\
- add r0, r3, #0\n\
- sub r0, #0xF8\n\
- cmp r0, #0x7\n\
- bls _0800588A\n\
- b _08005B90\n\
+ strb r0, [r6, #0x1E]\n\
+ ldr r0, [r6]\n\
+ ldrb r3, [r0]\n\
+ add r0, #0x1\n\
+ str r0, [r6]\n\
+ add r0, r3, #0\n\
+ sub r0, #0xF8\n\
+ cmp r0, #0x7\n\
+ bls _0800588A\n\
+ b _08005B90\n\
_0800588A:\n\
- lsl r0, #2\n\
- ldr r1, =_08005898\n\
- add r0, r1\n\
- ldr r0, [r0]\n\
- mov pc, r0\n\
- .pool\n\
- .align 2, 0\n\
+ lsl r0, #2\n\
+ ldr r1, =_08005898\n\
+ add r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .pool\n\
+ .align 2, 0\n\
_08005898:\n\
- .4byte _08005B6C\n\
- .4byte _08005B5A\n\
- .4byte _08005B4C\n\
- .4byte _08005B48\n\
- .4byte _080058E0\n\
- .4byte _080058DC\n\
- .4byte _080058B8\n\
- .4byte _08005D6C\n\
+ .4byte _08005B6C\n\
+ .4byte _08005B5A\n\
+ .4byte _08005B4C\n\
+ .4byte _08005B48\n\
+ .4byte _080058E0\n\
+ .4byte _080058DC\n\
+ .4byte _080058B8\n\
+ .4byte _08005D6C\n\
_080058B8:\n\
- ldrb r0, [r6, #0x6]\n\
- strb r0, [r6, #0x8]\n\
- ldrb r1, [r6, #0x5]\n\
- ldr r0, =gFonts\n\
- ldr r2, [r0]\n\
- lsl r0, r1, #1\n\
- add r0, r1\n\
- lsl r0, #2\n\
- add r0, r2\n\
- ldrb r1, [r6, #0xB]\n\
- ldrb r0, [r0, #0x5]\n\
- add r1, r0\n\
- ldrb r0, [r6, #0x9]\n\
- add r0, r1\n\
- b _08005ABA\n\
- .pool\n\
+ ldrb r0, [r6, #0x6]\n\
+ strb r0, [r6, #0x8]\n\
+ ldrb r1, [r6, #0x5]\n\
+ ldr r0, =gFonts\n\
+ ldr r2, [r0]\n\
+ lsl r0, r1, #1\n\
+ add r0, r1\n\
+ lsl r0, #2\n\
+ add r0, r2\n\
+ ldrb r1, [r6, #0xB]\n\
+ ldrb r0, [r0, #0x5]\n\
+ add r1, r0\n\
+ ldrb r0, [r6, #0x9]\n\
+ add r0, r1\n\
+ b _08005ABA\n\
+ .pool\n\
_080058DC:\n\
- ldr r0, [r6]\n\
- b _08005B30\n\
+ ldr r0, [r6]\n\
+ b _08005B30\n\
_080058E0:\n\
- ldr r0, [r6]\n\
- ldrb r3, [r0]\n\
- add r0, #0x1\n\
- str r0, [r6]\n\
- sub r0, r3, #0x1\n\
- cmp r0, #0x17\n\
- bls _080058F0\n\
- b _08005B90\n\
+ ldr r0, [r6]\n\
+ ldrb r3, [r0]\n\
+ add r0, #0x1\n\
+ str r0, [r6]\n\
+ sub r0, r3, #0x1\n\
+ cmp r0, #0x17\n\
+ bls _080058F0\n\
+ b _08005B90\n\
_080058F0:\n\
- lsl r0, #2\n\
- ldr r1, =_08005900\n\
- add r0, r1\n\
- ldr r0, [r0]\n\
- mov pc, r0\n\
- .pool\n\
- .align 2, 0\n\
+ lsl r0, #2\n\
+ ldr r1, =_08005900\n\
+ add r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .pool\n\
+ .align 2, 0\n\
_08005900:\n\
- .4byte _08005960\n\
- .4byte _08005982\n\
- .4byte _080059A6\n\
- .4byte _080059C0\n\
- .4byte _08005A0E\n\
- .4byte _08005A12\n\
- .4byte _08005A0A\n\
- .4byte _08005A2A\n\
- .4byte _08005A3A\n\
- .4byte _08005A58\n\
- .4byte _08005A5C\n\
- .4byte _08005B5A\n\
- .4byte _08005A90\n\
- .4byte _08005A98\n\
- .4byte _08005AA4\n\
- .4byte _08005A76\n\
- .4byte _08005AD8\n\
- .4byte _08005AF2\n\
- .4byte _08005B02\n\
- .4byte _08005B26\n\
- .4byte _08005B36\n\
- .4byte _08005B3E\n\
- .4byte _08005ABE\n\
- .4byte _08005ACC\n\
+ .4byte _08005960 @0\n\
+ .4byte _08005982 @1\n\
+ .4byte _080059A6 @2\n\
+ .4byte _080059C0 @3\n\
+ .4byte _08005A0E @4\n\
+ .4byte _08005A12 @5\n\
+ .4byte _08005A0A @6\n\
+ .4byte _08005A2A @7\n\
+ .4byte _08005A3A @8\n\
+ .4byte _08005A58 @9\n\
+ .4byte _08005A5C @10\n\
+ .4byte _08005B5A @11\n\
+ .4byte _08005A90 @12\n\
+ .4byte _08005A98 @13\n\
+ .4byte _08005AA4 @14\n\
+ .4byte _08005A76 @15\n\
+ .4byte _08005AD8 @16\n\
+ .4byte _08005AF2 @17\n\
+ .4byte _08005B02 @18\n\
+ .4byte _08005B26 @19\n\
+ .4byte _08005B36 @20\n\
+ .4byte _08005B3E @21\n\
+ .4byte _08005ABE @22\n\
+ .4byte _08005ACC @23\n\
_08005960:\n\
- ldr r2, [r6]\n\
- ldrb r1, [r2]\n\
- lsl r1, #4\n\
- ldrb r3, [r6, #0xC]\n\
- mov r0, #0xF\n\
- and r0, r3\n\
- orr r0, r1\n\
- strb r0, [r6, #0xC]\n\
- add r2, #0x1\n\
- str r2, [r6]\n\
- lsl r0, #24\n\
- lsr r0, #28\n\
- ldrb r2, [r6, #0xD]\n\
- lsl r1, r2, #28\n\
- lsr r1, #28\n\
- lsr r2, #4\n\
- b _08005A06\n\
+ ldr r2, [r6]\n\
+ ldrb r1, [r2]\n\
+ lsl r1, #4\n\
+ ldrb r3, [r6, #0xC]\n\
+ mov r0, #0xF\n\
+ and r0, r3\n\
+ orr r0, r1\n\
+ strb r0, [r6, #0xC]\n\
+ add r2, #0x1\n\
+ str r2, [r6]\n\
+ lsl r0, #24\n\
+ lsr r0, #28\n\
+ ldrb r2, [r6, #0xD]\n\
+ lsl r1, r2, #28\n\
+ lsr r1, #28\n\
+ lsr r2, #4\n\
+ b _08005A06\n\
_08005982:\n\
- ldr r1, [r6]\n\
- ldrb r2, [r1]\n\
- mov r0, #0xF\n\
- and r0, r2\n\
- ldrb r3, [r6, #0xD]\n\
- mov r2, #0x10\n\
- neg r2, r2\n\
- and r2, r3\n\
- orr r2, r0\n\
- strb r2, [r6, #0xD]\n\
- add r1, #0x1\n\
- str r1, [r6]\n\
- ldrb r0, [r6, #0xC]\n\
- lsr r0, #4\n\
- lsl r1, r2, #28\n\
- lsr r1, #28\n\
- lsr r2, #4\n\
- b _08005A06\n\
+ ldr r1, [r6]\n\
+ ldrb r2, [r1]\n\
+ mov r0, #0xF\n\
+ and r0, r2\n\
+ ldrb r3, [r6, #0xD]\n\
+ mov r2, #0x10\n\
+ neg r2, r2\n\
+ and r2, r3\n\
+ orr r2, r0\n\
+ strb r2, [r6, #0xD]\n\
+ add r1, #0x1\n\
+ str r1, [r6]\n\
+ ldrb r0, [r6, #0xC]\n\
+ lsr r0, #4\n\
+ lsl r1, r2, #28\n\
+ lsr r1, #28\n\
+ lsr r2, #4\n\
+ b _08005A06\n\
_080059A6:\n\
- ldr r1, [r6]\n\
- ldrb r0, [r1]\n\
- lsl r0, #4\n\
- ldrb r3, [r6, #0xD]\n\
- mov r2, #0xF\n\
- and r2, r3\n\
- orr r2, r0\n\
- strb r2, [r6, #0xD]\n\
- add r1, #0x1\n\
- str r1, [r6]\n\
- ldrb r0, [r6, #0xC]\n\
- lsr r0, #4\n\
- b _080059FE\n\
+ ldr r1, [r6]\n\
+ ldrb r0, [r1]\n\
+ lsl r0, #4\n\
+ ldrb r3, [r6, #0xD]\n\
+ mov r2, #0xF\n\
+ and r2, r3\n\
+ orr r2, r0\n\
+ strb r2, [r6, #0xD]\n\
+ add r1, #0x1\n\
+ str r1, [r6]\n\
+ ldrb r0, [r6, #0xC]\n\
+ lsr r0, #4\n\
+ b _080059FE\n\
_080059C0:\n\
- ldr r3, [r6]\n\
- ldrb r1, [r3]\n\
- lsl r1, #4\n\
- ldrb r4, [r6, #0xC]\n\
- mov r2, #0xF\n\
- add r0, r2, #0\n\
- and r0, r4\n\
- orr r0, r1\n\
- strb r0, [r6, #0xC]\n\
- add r5, r3, #0x1\n\
- str r5, [r6]\n\
- ldrb r3, [r3, #0x1]\n\
- add r1, r2, #0\n\
- and r1, r3\n\
- ldrb r4, [r6, #0xD]\n\
- mov r3, #0x10\n\
- neg r3, r3\n\
- and r3, r4\n\
- orr r3, r1\n\
- strb r3, [r6, #0xD]\n\
- add r4, r5, #0x1\n\
- str r4, [r6]\n\
- ldrb r1, [r5, #0x1]\n\
- lsl r1, #4\n\
- and r2, r3\n\
- orr r2, r1\n\
- strb r2, [r6, #0xD]\n\
- add r4, #0x1\n\
- str r4, [r6]\n\
- lsl r0, #24\n\
- lsr r0, #28\n\
+ ldr r3, [r6]\n\
+ ldrb r1, [r3]\n\
+ lsl r1, #4\n\
+ ldrb r4, [r6, #0xC]\n\
+ mov r2, #0xF\n\
+ add r0, r2, #0\n\
+ and r0, r4\n\
+ orr r0, r1\n\
+ strb r0, [r6, #0xC]\n\
+ add r5, r3, #0x1\n\
+ str r5, [r6]\n\
+ ldrb r3, [r3, #0x1]\n\
+ add r1, r2, #0\n\
+ and r1, r3\n\
+ ldrb r4, [r6, #0xD]\n\
+ mov r3, #0x10\n\
+ neg r3, r3\n\
+ and r3, r4\n\
+ orr r3, r1\n\
+ strb r3, [r6, #0xD]\n\
+ add r4, r5, #0x1\n\
+ str r4, [r6]\n\
+ ldrb r1, [r5, #0x1]\n\
+ lsl r1, #4\n\
+ and r2, r3\n\
+ orr r2, r1\n\
+ strb r2, [r6, #0xD]\n\
+ add r4, #0x1\n\
+ str r4, [r6]\n\
+ lsl r0, #24\n\
+ lsr r0, #28\n\
_080059FE:\n\
- lsl r1, r2, #28\n\
- lsr r1, #28\n\
- lsl r2, #24\n\
- lsr r2, #28\n\
+ lsl r1, r2, #28\n\
+ lsr r1, #28\n\
+ lsl r2, #24\n\
+ lsr r2, #28\n\
_08005A06:\n\
- bl GenerateFontHalfRowLookupTable\n\
+ bl GenerateFontHalfRowLookupTable\n\
_08005A0A:\n\
- mov r0, #0x2\n\
- b _08005D6E\n\
+ mov r0, #0x2\n\
+ b _08005D6E\n\
_08005A0E:\n\
- ldr r0, [r6]\n\
- b _08005B30\n\
+ ldr r0, [r6]\n\
+ b _08005B30\n\
_08005A12:\n\
- ldr r0, [r6]\n\
- ldrb r0, [r0]\n\
- mov r1, #0xF\n\
- and r1, r0\n\
- ldrb r2, [r4]\n\
- mov r0, #0x10\n\
- neg r0, r0\n\
- and r0, r2\n\
- orr r0, r1\n\
- strb r0, [r4]\n\
- ldr r0, [r6]\n\
- b _08005B30\n\
+ ldr r0, [r6]\n\
+ ldrb r0, [r0]\n\
+ mov r1, #0xF\n\
+ and r1, r0\n\
+ ldrb r2, [r4]\n\
+ mov r0, #0x10\n\
+ neg r0, r0\n\
+ and r0, r2\n\
+ orr r0, r1\n\
+ strb r0, [r4]\n\
+ ldr r0, [r6]\n\
+ b _08005B30\n\
_08005A2A:\n\
- ldr r0, [r6]\n\
- ldrb r1, [r0]\n\
- strb r1, [r6, #0x1E]\n\
- add r0, #0x1\n\
- str r0, [r6]\n\
- mov r0, #0x6\n\
- strb r0, [r6, #0x1C]\n\
- b _08005A0A\n\
+ ldr r0, [r6]\n\
+ ldrb r1, [r0]\n\
+ strb r1, [r6, #0x1E]\n\
+ add r0, #0x1\n\
+ str r0, [r6]\n\
+ mov r0, #0x6\n\
+ strb r0, [r6, #0x1C]\n\
+ b _08005A0A\n\
_08005A3A:\n\
- mov r0, #0x1\n\
- strb r0, [r6, #0x1C]\n\
- ldr r0, =gTextFlags\n\
- ldrb r1, [r0]\n\
- mov r0, #0x4\n\
- and r0, r1\n\
- cmp r0, #0\n\
- bne _08005A4C\n\
- b _08005B56\n\
+ mov r0, #0x1\n\
+ strb r0, [r6, #0x1C]\n\
+ ldr r0, =gTextFlags\n\
+ ldrb r1, [r0]\n\
+ mov r0, #0x4\n\
+ and r0, r1\n\
+ cmp r0, #0\n\
+ bne _08005A4C\n\
+ b _08005B56\n\
_08005A4C:\n\
- mov r0, #0\n\
- strb r0, [r4, #0x2]\n\
- b _08005B56\n\
- .pool\n\
+ mov r0, #0\n\
+ strb r0, [r4, #0x2]\n\
+ b _08005B56\n\
+ .pool\n\
_08005A58:\n\
- mov r0, #0x5\n\
- b _08005D56\n\
+ mov r0, #0x5\n\
+ b _08005D56\n\
_08005A5C:\n\
- ldr r0, [r6]\n\
- ldrb r3, [r0]\n\
- add r1, r0, #0x1\n\
- str r1, [r6]\n\
- ldrb r0, [r0, #0x1]\n\
- lsl r0, #8\n\
- orr r3, r0\n\
- add r1, #0x1\n\
- str r1, [r6]\n\
- add r0, r3, #0\n\
- bl PlayBGM\n\
- b _08005A0A\n\
+ ldr r0, [r6]\n\
+ ldrb r3, [r0]\n\
+ add r1, r0, #0x1\n\
+ str r1, [r6]\n\
+ ldrb r0, [r0, #0x1]\n\
+ lsl r0, #8\n\
+ orr r3, r0\n\
+ add r1, #0x1\n\
+ str r1, [r6]\n\
+ add r0, r3, #0\n\
+ bl PlayBGM\n\
+ b _08005A0A\n\
_08005A76:\n\
- ldr r0, [r6]\n\
- ldrb r3, [r0]\n\
- add r1, r0, #0x1\n\
- str r1, [r6]\n\
- ldrb r0, [r0, #0x1]\n\
- lsl r0, #8\n\
- orr r3, r0\n\
- add r1, #0x1\n\
- str r1, [r6]\n\
- add r0, r3, #0\n\
- bl PlaySE\n\
- b _08005A0A\n\
+ ldr r0, [r6]\n\
+ ldrb r3, [r0]\n\
+ add r1, r0, #0x1\n\
+ str r1, [r6]\n\
+ ldrb r0, [r0, #0x1]\n\
+ lsl r0, #8\n\
+ orr r3, r0\n\
+ add r1, #0x1\n\
+ str r1, [r6]\n\
+ add r0, r3, #0\n\
+ bl PlaySE\n\
+ b _08005A0A\n\
_08005A90:\n\
- ldr r1, [r6]\n\
- ldrb r0, [r1]\n\
- ldrb r3, [r6, #0x6]\n\
- b _08005AF8\n\
+ ldr r1, [r6]\n\
+ ldrb r0, [r1]\n\
+ ldrb r3, [r6, #0x6]\n\
+ b _08005AF8\n\
_08005A98:\n\
- ldr r1, [r6]\n\
- ldrb r0, [r1]\n\
- ldrb r2, [r6, #0x7]\n\
- add r0, r2\n\
- strb r0, [r6, #0x9]\n\
- b _08005AFC\n\
+ ldr r1, [r6]\n\
+ ldrb r0, [r1]\n\
+ ldrb r2, [r6, #0x7]\n\
+ add r0, r2\n\
+ strb r0, [r6, #0x9]\n\
+ b _08005AFC\n\
_08005AA4:\n\
- ldrb r0, [r6, #0x4]\n\
- ldrb r2, [r6, #0xD]\n\
- lsl r2, #28\n\
- lsr r1, r2, #4\n\
- orr r1, r2\n\
- lsr r1, #24\n\
- bl FillWindowPixelBuffer\n\
- ldrb r0, [r6, #0x6]\n\
- strb r0, [r6, #0x8]\n\
- ldrb r0, [r6, #0x7]\n\
+ ldrb r0, [r6, #0x4]\n\
+ ldrb r2, [r6, #0xD]\n\
+ lsl r2, #28\n\
+ lsr r1, r2, #4\n\
+ orr r1, r2\n\
+ lsr r1, #24\n\
+ bl FillWindowPixelBuffer\n\
+ ldrb r0, [r6, #0x6]\n\
+ strb r0, [r6, #0x8]\n\
+ ldrb r0, [r6, #0x7]\n\
_08005ABA:\n\
- strb r0, [r6, #0x9]\n\
- b _08005A0A\n\
+ strb r0, [r6, #0x9]\n\
+ b _08005A0A\n\
_08005ABE:\n\
- ldr r0, =gMPlayInfo_BGM\n\
- bl m4aMPlayStop\n\
- b _08005A0A\n\
- .pool\n\
+ ldr r0, =gMPlayInfo_BGM\n\
+ bl m4aMPlayStop\n\
+ b _08005A0A\n\
+ .pool\n\
_08005ACC:\n\
- ldr r0, =gMPlayInfo_BGM\n\
- bl m4aMPlayContinue\n\
- b _08005A0A\n\
- .pool\n\
+ ldr r0, =gMPlayInfo_BGM\n\
+ bl m4aMPlayContinue\n\
+ b _08005A0A\n\
+ .pool\n\
_08005AD8:\n\
- ldr r0, [r6]\n\
- ldrb r4, [r0]\n\
- add r0, #0x1\n\
- str r0, [r6]\n\
- cmp r4, #0\n\
- ble _08005A0A\n\
- add r0, r6, #0\n\
- add r1, r4, #0\n\
- bl ClearTextSpan\n\
- ldrb r0, [r6, #0x8]\n\
- add r0, r4\n\
- b _08005C6E\n\
+ ldr r0, [r6]\n\
+ ldrb r4, [r0]\n\
+ add r0, #0x1\n\
+ str r0, [r6]\n\
+ cmp r4, #0\n\
+ ble _08005A0A\n\
+ add r0, r6, #0\n\
+ add r1, r4, #0\n\
+ bl ClearTextSpan\n\
+ ldrb r0, [r6, #0x8]\n\
+ add r0, r4\n\
+ b _08005C6E\n\
_08005AF2:\n\
- ldr r1, [r6]\n\
- ldrb r0, [r6, #0x6]\n\
- ldrb r3, [r1]\n\
+ ldr r1, [r6]\n\
+ ldrb r0, [r6, #0x6]\n\
+ ldrb r3, [r1]\n\
_08005AF8:\n\
- add r0, r3\n\
- strb r0, [r6, #0x8]\n\
+ add r0, r3\n\
+ strb r0, [r6, #0x8]\n\
_08005AFC:\n\
- add r1, #0x1\n\
- str r1, [r6]\n\
- b _08005A0A\n\
+ add r1, #0x1\n\
+ str r1, [r6]\n\
+ b _08005A0A\n\
_08005B02:\n\
- ldr r0, [r6]\n\
- ldrb r2, [r0]\n\
- ldrb r1, [r6, #0x6]\n\
- add r2, r1\n\
- add r0, #0x1\n\
- str r0, [r6]\n\
- ldrb r0, [r6, #0x8]\n\
- sub r4, r2, r0\n\
- cmp r4, #0\n\
- bgt _08005B18\n\
- b _08005A0A\n\
+ ldr r0, [r6]\n\
+ ldrb r2, [r0]\n\
+ ldrb r1, [r6, #0x6]\n\
+ add r2, r1\n\
+ add r0, #0x1\n\
+ str r0, [r6]\n\
+ ldrb r0, [r6, #0x8]\n\
+ sub r4, r2, r0\n\
+ cmp r4, #0\n\
+ bgt _08005B18\n\
+ b _08005A0A\n\
_08005B18:\n\
- add r0, r6, #0\n\
- add r1, r4, #0\n\
- bl ClearTextSpan\n\
- ldrb r0, [r6, #0x8]\n\
- add r0, r4\n\
- b _08005C6E\n\
+ add r0, r6, #0\n\
+ add r1, r4, #0\n\
+ bl ClearTextSpan\n\
+ ldrb r0, [r6, #0x8]\n\
+ add r0, r4\n\
+ b _08005C6E\n\
_08005B26:\n\
- ldr r0, [r6]\n\
- ldrb r2, [r0]\n\
- add r1, r6, #0\n\
- add r1, #0x20\n\
- strb r2, [r1]\n\
+ ldr r0, [r6]\n\
+ ldrb r2, [r0]\n\
+ add r1, r6, #0\n\
+ add r1, #0x20\n\
+ strb r2, [r1]\n\
_08005B30:\n\
- add r0, #0x1\n\
- str r0, [r6]\n\
- b _08005A0A\n\
+ add r0, #0x1\n\
+ str r0, [r6]\n\
+ b _08005A0A\n\
_08005B36:\n\
- add r1, r6, #0\n\
- add r1, #0x21\n\
- mov r0, #0x1\n\
- b _08005B44\n\
+ add r1, r6, #0\n\
+ add r1, #0x21\n\
+ mov r0, #0x1\n\
+ b _08005B44\n\
_08005B3E:\n\
- add r1, r6, #0\n\
- add r1, #0x21\n\
- mov r0, #0\n\
+ add r1, r6, #0\n\
+ add r1, #0x21\n\
+ mov r0, #0\n\
_08005B44:\n\
- strb r0, [r1]\n\
- b _08005A0A\n\
+ strb r0, [r1]\n\
+ b _08005A0A\n\
_08005B48:\n\
- mov r0, #0x2\n\
- b _08005B4E\n\
+ mov r0, #0x2\n\
+ b _08005B4E\n\
_08005B4C:\n\
- mov r0, #0x3\n\
+ mov r0, #0x3\n\
_08005B4E:\n\
- strb r0, [r6, #0x1C]\n\
- add r0, r6, #0\n\
- bl TextPrinterInitDownArrowCounters\n\
+ strb r0, [r6, #0x1C]\n\
+ add r0, r6, #0\n\
+ bl TextPrinterInitDownArrowCounters\n\
_08005B56:\n\
- mov r0, #0x3\n\
- b _08005D6E\n\
+ mov r0, #0x3\n\
+ b _08005D6E\n\
_08005B5A:\n\
- ldr r0, [r6]\n\
- ldrb r3, [r0]\n\
- mov r2, #0x80\n\
- lsl r2, #1\n\
- add r1, r2, #0\n\
- orr r3, r1\n\
- add r0, #0x1\n\
- str r0, [r6]\n\
- b _08005B90\n\
+ ldr r0, [r6]\n\
+ ldrb r3, [r0]\n\
+ mov r2, #0x80\n\
+ lsl r2, #1\n\
+ add r1, r2, #0\n\
+ orr r3, r1\n\
+ add r0, #0x1\n\
+ str r0, [r6]\n\
+ b _08005B90\n\
_08005B6C:\n\
- ldr r0, [r6]\n\
- ldrb r3, [r0]\n\
- add r0, #0x1\n\
- str r0, [r6]\n\
- ldrb r0, [r6, #0x4]\n\
- add r1, r3, #0\n\
- ldrb r2, [r6, #0x8]\n\
- ldrb r3, [r6, #0x9]\n\
- bl DrawKeypadIcon\n\
- ldr r1, =gUnknown_03002F90\n\
- add r1, #0x80\n\
- strb r0, [r1]\n\
- ldrb r3, [r6, #0xA]\n\
- add r0, r3\n\
- b _08005C6A\n\
- .pool\n\
+ ldr r0, [r6]\n\
+ ldrb r3, [r0]\n\
+ add r0, #0x1\n\
+ str r0, [r6]\n\
+ ldrb r0, [r6, #0x4]\n\
+ add r1, r3, #0\n\
+ ldrb r2, [r6, #0x8]\n\
+ ldrb r3, [r6, #0x9]\n\
+ bl DrawKeypadIcon\n\
+ ldr r1, =gUnknown_03002F90\n\
+ add r1, #0x80\n\
+ strb r0, [r1]\n\
+ ldrb r3, [r6, #0xA]\n\
+ add r0, r3\n\
+ b _08005C6A\n\
+ .pool\n\
_08005B90:\n\
- ldr r0, [r4]\n\
- lsl r0, #28\n\
- lsr r0, #28\n\
- cmp r0, #0x8\n\
- bhi _08005C10\n\
- lsl r0, #2\n\
- ldr r1, =_08005BA8\n\
- add r0, r1\n\
- ldr r0, [r0]\n\
- mov pc, r0\n\
- .pool\n\
- .align 2, 0\n\
+ ldr r0, [r4]\n\
+ lsl r0, #28\n\
+ lsr r0, #28\n\
+ cmp r0, #0x8\n\
+ bhi _08005C10\n\
+ lsl r0, #2\n\
+ ldr r1, =_08005BA8\n\
+ add r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .pool\n\
+ .align 2, 0\n\
_08005BA8:\n\
- .4byte _08005BCC\n\
- .4byte _08005BDA\n\
- .4byte _08005BE8\n\
- .4byte _08005BE8\n\
- .4byte _08005BE8\n\
- .4byte _08005BE8\n\
- .4byte _08005C10\n\
- .4byte _08005BF6\n\
- .4byte _08005C04\n\
+ .4byte _08005BCC\n\
+ .4byte _08005BDA\n\
+ .4byte _08005BE8\n\
+ .4byte _08005BE8\n\
+ .4byte _08005BE8\n\
+ .4byte _08005BE8\n\
+ .4byte _08005C10\n\
+ .4byte _08005BF6\n\
+ .4byte _08005C04\n\
_08005BCC:\n\
- add r0, r6, #0\n\
- add r0, #0x21\n\
- ldrb r1, [r0]\n\
- add r0, r3, #0\n\
- bl DecompressGlyphFont0\n\
- b _08005C10\n\
+ add r0, r6, #0\n\
+ add r0, #0x21\n\
+ ldrb r1, [r0]\n\
+ add r0, r3, #0\n\
+ bl DecompressGlyphFont0\n\
+ b _08005C10\n\
_08005BDA:\n\
- add r0, r6, #0\n\
- add r0, #0x21\n\
- ldrb r1, [r0]\n\
- add r0, r3, #0\n\
- bl DecompressGlyphFont1\n\
- b _08005C10\n\
+ add r0, r6, #0\n\
+ add r0, #0x21\n\
+ ldrb r1, [r0]\n\
+ add r0, r3, #0\n\
+ bl DecompressGlyphFont1\n\
+ b _08005C10\n\
_08005BE8:\n\
- add r0, r6, #0\n\
- add r0, #0x21\n\
- ldrb r1, [r0]\n\
- add r0, r3, #0\n\
- bl DecompressGlyphFont2\n\
- b _08005C10\n\
+ add r0, r6, #0\n\
+ add r0, #0x21\n\
+ ldrb r1, [r0]\n\
+ add r0, r3, #0\n\
+ bl DecompressGlyphFont2\n\
+ b _08005C10\n\
_08005BF6:\n\
- add r0, r6, #0\n\
- add r0, #0x21\n\
- ldrb r1, [r0]\n\
- add r0, r3, #0\n\
- bl DecompressGlyphFont7\n\
- b _08005C10\n\
+ add r0, r6, #0\n\
+ add r0, #0x21\n\
+ ldrb r1, [r0]\n\
+ add r0, r3, #0\n\
+ bl DecompressGlyphFont7\n\
+ b _08005C10\n\
_08005C04:\n\
- add r0, r6, #0\n\
- add r0, #0x21\n\
- ldrb r1, [r0]\n\
- add r0, r3, #0\n\
- bl DecompressGlyphFont8\n\
+ add r0, r6, #0\n\
+ add r0, #0x21\n\
+ ldrb r1, [r0]\n\
+ add r0, r3, #0\n\
+ bl DecompressGlyphFont8\n\
_08005C10:\n\
- add r0, r6, #0\n\
- bl CopyGlyphToWindow\n\
- add r2, r6, #0\n\
- add r2, #0x20\n\
- ldrb r0, [r2]\n\
- cmp r0, #0\n\
- beq _08005C48\n\
- ldr r1, =gUnknown_03002F90\n\
- add r1, #0x80\n\
- ldrb r0, [r1]\n\
- ldrb r3, [r6, #0x8]\n\
- add r0, r3\n\
- strb r0, [r6, #0x8]\n\
- ldrb r2, [r2]\n\
- ldrb r0, [r1]\n\
- sub r4, r2, r0\n\
- cmp r4, #0\n\
- ble _08005C70\n\
- add r0, r6, #0\n\
- add r1, r4, #0\n\
- bl ClearTextSpan\n\
- ldrb r0, [r6, #0x8]\n\
- add r0, r4\n\
- b _08005C6E\n\
- .pool\n\
+ add r0, r6, #0\n\
+ bl CopyGlyphToWindow\n\
+ add r2, r6, #0\n\
+ add r2, #0x20\n\
+ ldrb r0, [r2]\n\
+ cmp r0, #0\n\
+ beq _08005C48\n\
+ ldr r1, =gUnknown_03002F90\n\
+ add r1, #0x80\n\
+ ldrb r0, [r1]\n\
+ ldrb r3, [r6, #0x8]\n\
+ add r0, r3\n\
+ strb r0, [r6, #0x8]\n\
+ ldrb r2, [r2]\n\
+ ldrb r0, [r1]\n\
+ sub r4, r2, r0\n\
+ cmp r4, #0\n\
+ ble _08005C70\n\
+ add r0, r6, #0\n\
+ add r1, r4, #0\n\
+ bl ClearTextSpan\n\
+ ldrb r0, [r6, #0x8]\n\
+ add r0, r4\n\
+ b _08005C6E\n\
+ .pool\n\
_08005C48:\n\
- add r0, r6, #0\n\
- add r0, #0x21\n\
- ldrb r0, [r0]\n\
- cmp r0, #0\n\
- beq _08005C64\n\
- ldr r0, =gUnknown_03002F90\n\
- add r0, #0x80\n\
- ldrb r1, [r6, #0xA]\n\
- ldrb r0, [r0]\n\
- add r1, r0\n\
- ldrb r0, [r6, #0x8]\n\
- b _08005C6C\n\
- .pool\n\
+ add r0, r6, #0\n\
+ add r0, #0x21\n\
+ ldrb r0, [r0]\n\
+ cmp r0, #0\n\
+ beq _08005C64\n\
+ ldr r0, =gUnknown_03002F90\n\
+ add r0, #0x80\n\
+ ldrb r1, [r6, #0xA]\n\
+ ldrb r0, [r0]\n\
+ add r1, r0\n\
+ ldrb r0, [r6, #0x8]\n\
+ b _08005C6C\n\
+ .pool\n\
_08005C64:\n\
- ldr r0, =gUnknown_03002F90\n\
- add r0, #0x80\n\
- ldrb r0, [r0]\n\
+ ldr r0, =gUnknown_03002F90\n\
+ add r0, #0x80\n\
+ ldrb r0, [r0]\n\
_08005C6A:\n\
- ldrb r1, [r6, #0x8]\n\
+ ldrb r1, [r6, #0x8]\n\
_08005C6C:\n\
- add r0, r1\n\
+ add r0, r1\n\
_08005C6E:\n\
- strb r0, [r6, #0x8]\n\
+ strb r0, [r6, #0x8]\n\
_08005C70:\n\
- mov r0, #0\n\
- b _08005D6E\n\
- .pool\n\
+ mov r0, #0\n\
+ b _08005D6E\n\
+ .pool\n\
_08005C78:\n\
- add r0, r6, #0\n\
- bl TextPrinterWait\n\
- lsl r0, #16\n\
- cmp r0, #0\n\
- bne _08005C86\n\
- b _08005B56\n\
+ add r0, r6, #0\n\
+ bl TextPrinterWait\n\
+ lsl r0, #16\n\
+ cmp r0, #0\n\
+ bne _08005C86\n\
+ b _08005B56\n\
_08005C86:\n\
- mov r0, #0\n\
- strb r0, [r6, #0x1C]\n\
- b _08005B56\n\
+ mov r0, #0\n\
+ strb r0, [r6, #0x1C]\n\
+ b _08005B56\n\
_08005C8C:\n\
- add r0, r6, #0\n\
- bl TextPrinterWaitWithDownArrow\n\
- lsl r0, #16\n\
- cmp r0, #0\n\
- bne _08005C9A\n\
- b _08005B56\n\
+ add r0, r6, #0\n\
+ bl TextPrinterWaitWithDownArrow\n\
+ lsl r0, #16\n\
+ cmp r0, #0\n\
+ bne _08005C9A\n\
+ b _08005B56\n\
_08005C9A:\n\
- ldrb r0, [r6, #0x4]\n\
- ldrb r2, [r6, #0xD]\n\
- lsl r2, #28\n\
- lsr r1, r2, #4\n\
- orr r1, r2\n\
- lsr r1, #24\n\
- bl FillWindowPixelBuffer\n\
- ldrb r0, [r6, #0x6]\n\
- mov r1, #0\n\
- strb r0, [r6, #0x8]\n\
- ldrb r0, [r6, #0x7]\n\
- strb r0, [r6, #0x9]\n\
- strb r1, [r6, #0x1C]\n\
- b _08005B56\n\
+ ldrb r0, [r6, #0x4]\n\
+ ldrb r2, [r6, #0xD]\n\
+ lsl r2, #28\n\
+ lsr r1, r2, #4\n\
+ orr r1, r2\n\
+ lsr r1, #24\n\
+ bl FillWindowPixelBuffer\n\
+ ldrb r0, [r6, #0x6]\n\
+ mov r1, #0\n\
+ strb r0, [r6, #0x8]\n\
+ ldrb r0, [r6, #0x7]\n\
+ strb r0, [r6, #0x9]\n\
+ strb r1, [r6, #0x1C]\n\
+ b _08005B56\n\
_08005CB8:\n\
- add r0, r6, #0\n\
- bl TextPrinterWaitWithDownArrow\n\
- lsl r0, #16\n\
- cmp r0, #0\n\
- bne _08005CC6\n\
- b _08005B56\n\
+ add r0, r6, #0\n\
+ bl TextPrinterWaitWithDownArrow\n\
+ lsl r0, #16\n\
+ cmp r0, #0\n\
+ bne _08005CC6\n\
+ b _08005B56\n\
_08005CC6:\n\
- add r0, r6, #0\n\
- bl TextPrinterClearDownArrow\n\
- ldrb r1, [r6, #0x5]\n\
- ldr r0, =gFonts\n\
- ldr r2, [r0]\n\
- lsl r0, r1, #1\n\
- add r0, r1\n\
- lsl r0, #2\n\
- add r0, r2\n\
- ldrb r1, [r6, #0xB]\n\
- ldrb r0, [r0, #0x5]\n\
- add r1, r0\n\
- strb r1, [r6, #0x1F]\n\
- ldrb r0, [r6, #0x6]\n\
- strb r0, [r6, #0x8]\n\
- mov r0, #0x4\n\
- strb r0, [r6, #0x1C]\n\
- b _08005B56\n\
- .pool\n\
+ add r0, r6, #0\n\
+ bl TextPrinterClearDownArrow\n\
+ ldrb r1, [r6, #0x5]\n\
+ ldr r0, =gFonts\n\
+ ldr r2, [r0]\n\
+ lsl r0, r1, #1\n\
+ add r0, r1\n\
+ lsl r0, #2\n\
+ add r0, r2\n\
+ ldrb r1, [r6, #0xB]\n\
+ ldrb r0, [r0, #0x5]\n\
+ add r1, r0\n\
+ strb r1, [r6, #0x1F]\n\
+ ldrb r0, [r6, #0x6]\n\
+ strb r0, [r6, #0x8]\n\
+ mov r0, #0x4\n\
+ strb r0, [r6, #0x1C]\n\
+ b _08005B56\n\
+ .pool\n\
_08005CF0:\n\
- ldrb r0, [r6, #0x1F]\n\
- cmp r0, #0\n\
- beq _08005D44\n\
- bl sub_8197964\n\
- ldr r1, =gWindowVerticalScrollSpeeds\n\
- add r0, r1\n\
- ldrb r4, [r0]\n\
- ldrb r2, [r6, #0x1F]\n\
- cmp r2, r4\n\
- bge _08005D20\n\
- ldrb r0, [r6, #0x4]\n\
- ldrb r1, [r6, #0xD]\n\
- lsl r1, #28\n\
- lsr r3, r1, #4\n\
- orr r3, r1\n\
- lsr r3, #24\n\
- mov r1, #0\n\
- bl ScrollWindow\n\
- mov r0, #0\n\
- b _08005D38\n\
- .pool\n\
+ ldrb r0, [r6, #0x1F]\n\
+ cmp r0, #0\n\
+ beq _08005D44\n\
+ bl sub_8197964\n\
+ ldr r1, =gWindowVerticalScrollSpeeds\n\
+ add r0, r1\n\
+ ldrb r4, [r0]\n\
+ ldrb r2, [r6, #0x1F]\n\
+ cmp r2, r4\n\
+ bge _08005D20\n\
+ ldrb r0, [r6, #0x4]\n\
+ ldrb r1, [r6, #0xD]\n\
+ lsl r1, #28\n\
+ lsr r3, r1, #4\n\
+ orr r3, r1\n\
+ lsr r3, #24\n\
+ mov r1, #0\n\
+ bl ScrollWindow\n\
+ mov r0, #0\n\
+ b _08005D38\n\
+ .pool\n\
_08005D20:\n\
- ldrb r0, [r6, #0x4]\n\
- ldrb r1, [r6, #0xD]\n\
- lsl r1, #28\n\
- lsr r3, r1, #4\n\
- orr r3, r1\n\
- lsr r3, #24\n\
- mov r1, #0\n\
- add r2, r4, #0\n\
- bl ScrollWindow\n\
- ldrb r0, [r6, #0x1F]\n\
- sub r0, r4\n\
+ ldrb r0, [r6, #0x4]\n\
+ ldrb r1, [r6, #0xD]\n\
+ lsl r1, #28\n\
+ lsr r3, r1, #4\n\
+ orr r3, r1\n\
+ lsr r3, #24\n\
+ mov r1, #0\n\
+ add r2, r4, #0\n\
+ bl ScrollWindow\n\
+ ldrb r0, [r6, #0x1F]\n\
+ sub r0, r4\n\
_08005D38:\n\
- strb r0, [r6, #0x1F]\n\
- ldrb r0, [r6, #0x4]\n\
- mov r1, #0x2\n\
- bl CopyWindowToVram\n\
- b _08005B56\n\
+ strb r0, [r6, #0x1F]\n\
+ ldrb r0, [r6, #0x4]\n\
+ mov r1, #0x2\n\
+ bl CopyWindowToVram\n\
+ b _08005B56\n\
_08005D44:\n\
- strb r0, [r6, #0x1C]\n\
- b _08005B56\n\
+ strb r0, [r6, #0x1C]\n\
+ b _08005B56\n\
_08005D48:\n\
- bl IsSEPlaying\n\
- lsl r0, #24\n\
- lsr r0, #24\n\
- cmp r0, #0\n\
- beq _08005D56\n\
- b _08005B56\n\
+ bl IsSEPlaying\n\
+ lsl r0, #24\n\
+ lsr r0, #24\n\
+ cmp r0, #0\n\
+ beq _08005D56\n\
+ b _08005B56\n\
_08005D56:\n\
- strb r0, [r6, #0x1C]\n\
- b _08005B56\n\
+ strb r0, [r6, #0x1C]\n\
+ b _08005B56\n\
_08005D5A:\n\
- ldrb r0, [r6, #0x1E]\n\
- add r1, r0, #0\n\
- cmp r1, #0\n\
- beq _08005D68\n\
- sub r0, #0x1\n\
- strb r0, [r6, #0x1E]\n\
- b _08005B56\n\
+ ldrb r0, [r6, #0x1E]\n\
+ add r1, r0, #0\n\
+ cmp r1, #0\n\
+ beq _08005D68\n\
+ sub r0, #0x1\n\
+ strb r0, [r6, #0x1E]\n\
+ b _08005B56\n\
_08005D68:\n\
- strb r1, [r6, #0x1C]\n\
- b _08005B56\n\
+ strb r1, [r6, #0x1C]\n\
+ b _08005B56\n\
_08005D6C:\n\
- mov r0, #0x1\n\
+ mov r0, #0x1\n\
_08005D6E:\n\
- pop {r4-r6}\n\
- pop {r1}\n\
- bx r1");
+ pop {r4-r6}\n\
+ pop {r1}\n\
+ bx r1\n");
}
+#endif
u32 GetStringWidthFixedWidthFont(const u8 *str, u8 fontId, u8 letterSpacing)
{
diff --git a/src/time_events.c b/src/time_events.c
new file mode 100644
index 000000000..1f169a5c6
--- /dev/null
+++ b/src/time_events.c
@@ -0,0 +1,118 @@
+#include "global.h"
+#include "time_events.h"
+#include "event_data.h"
+#include "field_weather.h"
+#include "pokemon.h"
+#include "random.h"
+#include "overworld.h"
+#include "rtc.h"
+#include "script.h"
+#include "task.h"
+
+static u32 GetMirageRnd(void)
+{
+ u32 hi = VarGet(VAR_MIRAGE_RND_H);
+ u32 lo = VarGet(VAR_MIRAGE_RND_L);
+ return (hi << 16) | lo;
+}
+
+static void SetMirageRnd(u32 rnd)
+{
+ VarSet(VAR_MIRAGE_RND_H, rnd >> 16);
+ VarSet(VAR_MIRAGE_RND_L, rnd);
+}
+
+// unused
+void InitMirageRnd(void)
+{
+ SetMirageRnd((Random() << 16) | Random());
+}
+
+void UpdateMirageRnd(u16 days)
+{
+ s32 rnd = GetMirageRnd();
+ while (days)
+ {
+ rnd = 1103515245 * rnd + 12345;
+ days--;
+ }
+ SetMirageRnd(rnd);
+}
+
+bool8 IsMirageIslandPresent(void)
+{
+ u16 rnd = GetMirageRnd() >> 16;
+ int i;
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) && (GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY) & 0xFFFF) == rnd)
+ return TRUE;
+
+ return FALSE;
+}
+
+void UpdateShoalTideFlag(void)
+{
+ static const u8 tide[] =
+ {
+ 1, // 00
+ 1, // 01
+ 1, // 02
+ 0, // 03
+ 0, // 04
+ 0, // 05
+ 0, // 06
+ 0, // 07
+ 0, // 08
+ 1, // 09
+ 1, // 10
+ 1, // 11
+ 1, // 12
+ 1, // 13
+ 1, // 14
+ 0, // 15
+ 0, // 16
+ 0, // 17
+ 0, // 18
+ 0, // 19
+ 0, // 20
+ 1, // 21
+ 1, // 22
+ 1, // 23
+ };
+
+ if (is_light_level_1_2_3_5_or_6(get_map_light_from_warp0()))
+ {
+ RtcCalcLocalTime();
+ if (tide[gLocalTime.hours])
+ FlagSet(FLAG_SYS_SHOAL_TIDE);
+ else
+ FlagClear(FLAG_SYS_SHOAL_TIDE);
+ }
+}
+
+static void Task_WaitWeather(u8 taskId)
+{
+ if (IsWeatherChangeComplete())
+ {
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ }
+}
+
+void WaitWeather(void)
+{
+ CreateTask(Task_WaitWeather, 80);
+}
+
+void InitBirchState(void)
+{
+ *GetVarPointer(VAR_BIRCH_STATE) = 0;
+}
+
+void UpdateBirchState(u16 days)
+{
+ u16 *state = GetVarPointer(VAR_BIRCH_STATE);
+ *state += days;
+ *state %= 7;
+}
diff --git a/src/trainer_see.c b/src/trainer_see.c
index 53bc5cbbb..7706da703 100644
--- a/src/trainer_see.c
+++ b/src/trainer_see.c
@@ -6,7 +6,7 @@
#include "field_effect.h"
#include "field_map_obj.h"
#include "field_player_avatar.h"
-#include "map_obj_8097404.h"
+#include "field_map_obj_helpers.h"
#include "pokenav.h"
#include "task.h"
#include "util.h"
@@ -639,7 +639,7 @@ void sub_80B45D0(void)
gApproachingTrainerId++;
gSpecialVar_Result = 1;
UnfreezeMapObjects();
- sub_80974D0(gApproachingTrainers[1].mapObjectId);
+ FreezeMapObjectsExceptOne(gApproachingTrainers[1].mapObjectId);
}
else
{
diff --git a/src/use_pokeblock.c b/src/use_pokeblock.c
index 12f475c93..c8898d08f 100644
--- a/src/use_pokeblock.c
+++ b/src/use_pokeblock.c
@@ -4,7 +4,7 @@
#include "malloc.h"
#include "palette.h"
#include "pokenav.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "text.h"
#include "bg.h"
#include "window.h"
@@ -131,7 +131,7 @@ void sub_8166340(void)
ProcessSpriteCopyRequests();
TransferPlttBuffer();
sub_81D2108(gUnknown_0203BCAC->field_7C58);
- sub_80BA0A8();
+ ScanlineEffect_InitHBlankDmaTransfer();
}
void sub_816636C(void (*func)(void))
diff --git a/src/wallclock.c b/src/wallclock.c
index dbea24b4c..f15bbbc27 100644
--- a/src/wallclock.c
+++ b/src/wallclock.c
@@ -12,7 +12,7 @@
#include "window.h"
#include "text_window.h"
#include "menu.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "task.h"
#include "strings.h"
#include "sound.h"