diff options
author | PikalaxALT <PikalaxALT@gmail.com> | 2020-03-22 14:26:44 -0400 |
---|---|---|
committer | PikalaxALT <PikalaxALT@gmail.com> | 2020-03-22 14:26:44 -0400 |
commit | 77a6b8a820fe89af57585255e1c80ed9a3913be8 (patch) | |
tree | aec29cfa9c837e12d8c5e91354394cec82456461 /src/pokemon_special_anim_scene.c | |
parent | faab53204c9d583f5180fb48a0594f66cf85f30e (diff) |
Address review comments; doc round 2
Diffstat (limited to 'src/pokemon_special_anim_scene.c')
-rw-r--r-- | src/pokemon_special_anim_scene.c | 796 |
1 files changed, 466 insertions, 330 deletions
diff --git a/src/pokemon_special_anim_scene.c b/src/pokemon_special_anim_scene.c index 5a0bb8607..2d65c24a7 100644 --- a/src/pokemon_special_anim_scene.c +++ b/src/pokemon_special_anim_scene.c @@ -13,49 +13,49 @@ #include "trig.h" #include "constants/songs.h" -static void sub_811D7D4(u16 animType); -static void sub_811D9BC(u8 taskId); -static void sub_811DA9C(struct Sprite * sprite, u8 closeness); -static bool8 sub_811DAAC(struct Sprite * sprite); -static void sub_811DB14(struct Sprite * sprite, u8 closeness); -static void sub_811DB48(struct Sprite * sprite, u8 closeness); +static void LoadBgGfxByAnimType(u16 animType); +static void Task_ZoomAnim(u8 taskId); +static void SetSpriteWithCloseness(struct Sprite * sprite, u8 closeness); +static bool8 IsZoomSpriteCBActive(struct Sprite * sprite); +static void MonSpriteZoom_UpdateYPos(struct Sprite * sprite, u8 closeness); +static void ItemSpriteZoom_UpdateYPos(struct Sprite * sprite, u8 closeness); static void StartMonWiggleAnim(struct PokemonSpecialAnimScene * scene, u8 frameLen, u8 niter, u8 amplitude); static void StopMonWiggleAnim(struct PokemonSpecialAnimScene * scene); static void SpriteCallback_MonSpriteWiggle(struct Sprite * sprite); static void LoadMonSpriteGraphics(u16 *tilees, u16 *palette); -struct Sprite * PSA_CreateItemIconObject(u16 itemId); +static struct Sprite * PSA_CreateItemIconObject(u16 itemId); static u16 GetBlendColorByItemId(u16 itemId); -static void Task_ZoomOutMon(u8 taskId); +static void Task_ItemUseOnMonAnim(u8 taskId); static void CreateSprites_UseItem_OutwardSpiralDots(u8 taskId, s16 *data, struct Sprite * sprite); -static void sub_811DFC0(struct Sprite * sprite); -static void sub_811E06C(struct PokemonSpecialAnimScene * scene, struct Sprite * sprite, u8 closeness); -static void sub_811E10C(void); -static void sub_811E128(struct Sprite * sprite); -static bool8 sub_811E138(void); -static void sub_811E154(struct Sprite * sprite); -static void sub_811E194(u8 a0); -static void sub_811E204(struct PokemonSpecialAnimScene * scene); -static bool8 sub_811E2F4(void); -static void sub_811E300(struct Sprite * sprite); -static void sub_811E348(struct PokemonSpecialAnimScene * scene); -static void sub_811E388(void); -static void sub_811E3B4(u8 taskId); -static u16 sub_811E4EC(u8 taskId); +static void SpriteCB_OutwardSpiralDots(struct Sprite * sprite); +static void InitItemIconSpriteState(struct PokemonSpecialAnimScene * scene, struct Sprite * sprite, u8 closeness); +static void MachineSetWobbleInit(void); +static void MachineSetWobble_SetCB(struct Sprite * sprite); +static bool8 MachineSetWobbleCBIsRunning(void); +static void SpriteCB_MachineSetWobble(struct Sprite * sprite); +static void StartZoomOutAnimForUseTM(u8 closeness); +static void CreateStarSprites(struct PokemonSpecialAnimScene * scene); +static bool8 AnyStarSpritesActive(void); +static void SpriteCB_Star(struct Sprite * sprite); +static void PSAScene_SeedRandomInTask(struct PokemonSpecialAnimScene * scene); +static void StopMakingOutwardSpiralDots(void); +static void Task_UseItem_OutwardSpiralDots(u8 taskId); +static u16 PSAScene_RandomFromTask(u8 taskId); static void SpriteCallback_UseItem_OutwardSpiralDots(struct Sprite * sprite); -static void sub_811E588(void); -static bool32 sub_811E5A4(void); -static void sub_811E694(u8 taskId); -static void sub_811E710(u8 taskId, s16 *data); -static void sub_811E7B4(struct Sprite * sprite); - -static const u16 gUnknown_845963C[] = INCBIN_U16("graphics/pokemon_special_anim/unk_845963C.gbapal"); -static const u16 gUnknown_845965C[] = INCBIN_U16("graphics/pokemon_special_anim/unk_845965C.gbapal"); -static const u32 gUnknown_845967C[] = INCBIN_U32("graphics/pokemon_special_anim/unk_845967C.4bpp.lz"); -static const u32 gUnknown_845973C[] = INCBIN_U32("graphics/pokemon_special_anim/unk_845973C.bin.lz"); -static const u16 gUnknown_8459868[] = INCBIN_U16("graphics/pokemon_special_anim/unk_8459868.gbapal"); -static const u32 gUnknown_8459888[] = INCBIN_U32("graphics/pokemon_special_anim/unk_8459888.4bpp.lz"); -static const u16 gUnknown_84598A4[] = INCBIN_U16("graphics/pokemon_special_anim/unk_84598A4.gbapal"); -static const u32 gUnknown_84598C4[] = INCBIN_U32("graphics/pokemon_special_anim/unk_84598C4.4bpp.lz"); +static void LoadOutwardSpiralDotsGfx(void); +static bool32 IsOutwardSpiralDotsTaskRunning(void); +static void Task_LevelUpVerticalSprites(u8 taskId); +static void CreateLevelUpVerticalSprite(u8 taskId, s16 *data); +static void SpriteCB_LevelUpVertical(struct Sprite * sprite); + +static const u16 sBgPals_PSA_Any[] = INCBIN_U16("graphics/pokemon_special_anim/unk_845963C.gbapal"); +static const u16 sBgPals_PSA_Anim4[] = INCBIN_U16("graphics/pokemon_special_anim/unk_845965C.gbapal"); +static const u32 sBg3Tiles_PSA[] = INCBIN_U32("graphics/pokemon_special_anim/unk_845967C.4bpp.lz"); +static const u32 sBg3Map_PSA[] = INCBIN_U32("graphics/pokemon_special_anim/unk_845973C.bin.lz"); +static const u16 sSpritePals_LevelUpVertical[] = INCBIN_U16("graphics/pokemon_special_anim/unk_8459868.gbapal"); +static const u32 sSpriteTiles_LevelUpVertical[] = INCBIN_U32("graphics/pokemon_special_anim/unk_8459888.4bpp.lz"); +static const u16 sSpritePals_Star[] = INCBIN_U16("graphics/pokemon_special_anim/unk_84598A4.gbapal"); +static const u32 sSpriteTiles_Star[] = INCBIN_U32("graphics/pokemon_special_anim/unk_84598C4.4bpp.lz"); static const u16 sSpritePals_UseItem_OutwardSpiralDots[] = INCBIN_U16("graphics/pokemon_special_anim/unk_8459940.gbapal"); static const u32 sSpriteTiles_UseItem_OutwardSpiralDots[] = INCBIN_U32("graphics/pokemon_special_anim/unk_8459960.4bpp.lz"); @@ -108,20 +108,20 @@ static const u16 sAffineScales[] = { 0x200 }; -static const s8 gUnknown_84599B2[][2] = { +static const s8 sStarCoordOffsets[][2] = { {-8, -8}, { 6, -13}, { 8, -8} }; -static const struct CompressedSpriteSheet gUnknown_84599B8 = { - gUnknown_84598C4, +static const struct CompressedSpriteSheet sSpriteSheet_Star = { + sSpriteTiles_Star, 0x80, 2 }; -static const struct SpritePalette gUnknown_84599C0 = { - gUnknown_84598A4, +static const struct SpritePalette sSpritePalette_Star = { + sSpritePals_Star, 2 }; @@ -189,38 +189,38 @@ static const struct SpriteTemplate sSpriteTemplate_MonSprite = { .callback = SpriteCallbackDummy }; -static const union AffineAnimCmd gUnknown_8459A48[] = { +static const union AffineAnimCmd sAffineAnim_ItemZoom_0[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(-28, -28, 0, 8), AFFINEANIMCMD_END }; -static const union AffineAnimCmd gUnknown_8459A60[] = { +static const union AffineAnimCmd sAffineAnim_ItemZoom_1[] = { AFFINEANIMCMD_FRAME(0x155, 0x155, 0, 0), AFFINEANIMCMD_FRAME(-37, -37, 0, 8), AFFINEANIMCMD_END }; -static const union AffineAnimCmd gUnknown_8459A78[] = { +static const union AffineAnimCmd sAffineAnim_ItemZoom_2[] = { AFFINEANIMCMD_FRAME(0x1AA, 0x1AA, 0, 0), AFFINEANIMCMD_FRAME(-47, -47, 0, 8), AFFINEANIMCMD_END }; -static const union AffineAnimCmd gUnknown_8459A90[] = { +static const union AffineAnimCmd sAffineAnim_ItemZoom_3[] = { AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0), AFFINEANIMCMD_FRAME(-56, -56, 0, 8), AFFINEANIMCMD_END }; -static const union AffineAnimCmd *const gUnknown_8459AA8[] = { - gUnknown_8459A48, - gUnknown_8459A60, - gUnknown_8459A78, - gUnknown_8459A90 +static const union AffineAnimCmd *const sAffineAnimTable_ItemZoom[] = { + sAffineAnim_ItemZoom_0, + sAffineAnim_ItemZoom_1, + sAffineAnim_ItemZoom_2, + sAffineAnim_ItemZoom_3 }; -static const struct OamData gUnknown_8459AB8 = { +static const struct OamData sOamData_LevelUpVertical = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_BLEND, @@ -240,21 +240,21 @@ static const union AnimCmd gUnknown_8459AC0[] = { ANIMCMD_END }; -static const union AnimCmd *const gUnknown_8459AC8[] = { +static const union AnimCmd *const sAnimTable_LevelUpVertical[] = { gUnknown_8459AC0 }; -static const struct SpriteTemplate gUnknown_8459ACC = { +static const struct SpriteTemplate sSpriteTemplate_LevelUpVertical = { .tileTag = 0, .paletteTag = 0, - .oam = &gUnknown_8459AB8, - .anims = gUnknown_8459AC8, + .oam = &sOamData_LevelUpVertical, + .anims = sAnimTable_LevelUpVertical, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_811E7B4 + .callback = SpriteCB_LevelUpVertical }; -static const struct OamData gUnknown_8459AE4 = { +static const struct OamData sOamData_Star = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, @@ -269,14 +269,14 @@ static const struct OamData gUnknown_8459AE4 = { .paletteNum = 0 }; -static const struct SpriteTemplate gUnknown_8459AEC = { +static const struct SpriteTemplate sSpriteTemplate_Star = { .tileTag = 2, .paletteTag = 2, - .oam = &gUnknown_8459AE4, + .oam = &sOamData_Star, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_811E300 + .callback = SpriteCB_Star }; static const struct OamData sOamData_UseItem_OutwardSpiralDots = { @@ -338,7 +338,7 @@ void InitPokemonSpecialAnimScene(struct PokemonSpecialAnimScene * buffer, u16 an SetBgTilemapBuffer(3, buffer->field_1914); RequestDma3Fill(0, (void *)BG_VRAM, 0x20, TRUE); FillBgTilemapBufferRect_Palette0(0, 0x000, 0, 0, 32, 32); - sub_811D7D4(animType); + LoadBgGfxByAnimType(animType); FillWindowPixelBuffer(0, PIXEL_FILL(0)); TextWindow_SetUserSelectedFrame(0, 0x000, 0xe0); CopyWindowToVram(0, 3); @@ -365,7 +365,7 @@ void PSA_FreeWindowBuffers(void) FreeAllWindowBuffers(); } -void sub_811D2A8(void) +void PSA_ShowMessageWindow(void) { PutWindowTilemap(0); FillWindowPixelBuffer(0, PIXEL_FILL(1)); @@ -373,7 +373,7 @@ void sub_811D2A8(void) CopyWindowToVram(0, 3); } -void sub_811D2D0(void) +void PSA_HideMessageWindow(void) { ClearWindowTilemap(0); ClearStdWindowAndFrameToTransparent(0, FALSE); @@ -445,7 +445,7 @@ void PSA_PrintMessage(u8 messageId) AddTextPrinterParameterized5(0, 2, scene->textBuf, strWidth, 0, textSpeed, NULL, 0, 4); } -void sub_811D4D4(void) +void PSA_AfterPoof_ClearMessageWindow(void) { FillWindowPixelBuffer(0, PIXEL_FILL(1)); CopyWindowToVram(0, 2); @@ -456,22 +456,22 @@ bool8 PSA_IsMessagePrintTaskActive(void) return IsTextPrinterActive(0); } -void sub_811D4FC(void) +void PSA_DarkenMonSprite(void) { struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork(); scene->state = 0; BlendPalettes((0x10000 << IndexOfSpritePaletteTag(0)) | 4, 16, RGB_BLACK); - sub_811E204(scene); + CreateStarSprites(scene); } -bool8 sub_811D530(void) +bool8 PSA_RunPoofAnim(void) { struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork(); switch (scene->state) { case 0: - if (!sub_811E2F4()) + if (!AnyStarSpritesActive()) { BeginNormalPaletteFade((0x10000 << IndexOfSpritePaletteTag(0)) | 4, -1, 16, 0, RGB_BLACK); scene->state++; @@ -485,29 +485,29 @@ bool8 sub_811D530(void) return TRUE; } -void sub_811D5A0(void) +void PSA_UseTM_SetUpZoomOutAnim(void) { struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork(); scene->state = 0; } -void sub_811D5B0(void) +void PSA_UseTM_CleanUpForCancel(void) { - sub_811E388(); + StopMakingOutwardSpiralDots(); ResetPaletteFadeControl(); } -bool8 sub_811D5C0(void) +bool8 PSA_UseTM_RunZoomOutAnim(void) { struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork(); switch (scene->state) { case 0: - sub_811E194(0); + StartZoomOutAnimForUseTM(0); scene->state++; break; case 1: - if (!sub_811D9A8()) + if (!PSA_IsZoomTaskActive()) { scene->field_0004 = 0; scene->state++; @@ -530,7 +530,7 @@ bool8 sub_811D5C0(void) scene->field_0004 = 0; PlaySE(SE_W025); BeginNormalPaletteFade(0x00000001, 2, 0, 12, RGB(8, 13, 31)); - sub_811E348(scene); + PSAScene_SeedRandomInTask(scene); scene->state++; } break; @@ -546,7 +546,7 @@ bool8 sub_811D5C0(void) break; case 6: scene->field_0004++; - if (!sub_811E5A4() && scene->field_0004 > 40) + if (!IsOutwardSpiralDotsTaskRunning() && scene->field_0004 > 40) { scene->field_0004 = 0; scene->state++; @@ -570,74 +570,78 @@ bool8 sub_811D5C0(void) return TRUE; } -void sub_811D6EC(void) +void PSA_UseTM_SetUpMachineSetWobble(void) { struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork(); scene->state = 0; } -bool8 sub_811D6FC(void) +bool8 PSA_UseTM_RunMachineSetWobble(void) { struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork(); switch (scene->state) { case 0: - sub_811E10C(); + MachineSetWobbleInit(); PlaySE(SE_MU_PACHI); scene->state++; break; case 1: - return sub_811E138(); + return MachineSetWobbleCBIsRunning(); } return TRUE; } -static void sub_811D734(void) +// There may once have been plans to put the battle level up +// anim in with using Rare Candy, but they were scrapped +// at a later stage of development + +UNUSED void PSA_CreateLevelUpVerticalSpritesTask(void) { - sub_811E5B8(120, 56, 4, 4, 2, 0); + CreateLevelUpVerticalSpritesTask(120, 56, 4, 4, 2, 0); } -bool8 sub_811D754(void) +bool8 PSA_LevelUpVerticalSpritesTaskIsRunning(void) { - return sub_811E680(); + return LevelUpVerticalSpritesTaskIsRunning(); } -static void sub_811D764(u16 *statsBefore, u16 *statsAfter) +UNUSED void PSA_DrawLevelUpWindowPg1(u16 *statsBefore, u16 *statsAfter) { DrawTextBorderOuter(1, 0x001, 0xE); DrawLevelUpWindowPg1(1, statsBefore, statsAfter, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY); PutWindowTilemap(1); CopyWindowToVram(1, 3); } -static void sub_811D7A0(u16 *currStats) +UNUSED void PSA_DrawLevelUpWindowPg2(u16 *currStats) { DrawLevelUpWindowPg2(1, currStats, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY); CopyWindowToVram(1, 2); } -static bool8 sub_811D7C4(void) +UNUSED bool8 PSA_IsCopyingLevelUpWindowToVram(void) { return IsDma3ManagerBusyWithBgCopy(); } -static void sub_811D7D4(u16 animType) +static void LoadBgGfxByAnimType(u16 animType) { - CopyToBgTilemapBuffer(3, gUnknown_845973C, 0, 0x000); - DecompressAndCopyTileDataToVram(3, gUnknown_845967C, 0, 0x000, 0); + CopyToBgTilemapBuffer(3, sBg3Map_PSA, 0, 0x000); + DecompressAndCopyTileDataToVram(3, sBg3Tiles_PSA, 0, 0x000, 0); if (animType != 4) - LoadPalette(gUnknown_845963C, 0x00, 0x20); + LoadPalette(sBgPals_PSA_Any, 0x00, 0x20); else - LoadPalette(gUnknown_845965C, 0x00, 0x20); + LoadPalette(sBgPals_PSA_Anim4, 0x00, 0x20); } -void sub_811D830(u8 closeness) +void PSA_CreateMonSpriteAtCloseness(u8 closeness) { struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork(); struct Pokemon * pokemon = PSA_GetPokemon(); u16 species = GetMonData(pokemon, MON_DATA_SPECIES); u32 personality = GetMonData(pokemon, MON_DATA_PERSONALITY); - u8 r1 = sub_812EA78(species, personality, 2); + u8 r1 = Menu2_GetMonSpriteAnchorCoord(species, personality, 2); void * r6; void * r9; void * r4; @@ -645,13 +649,13 @@ void sub_811D830(u8 closeness) if (r1 != 0xFF) { - scene->field_0006 = 0x48; - scene->field_0008 = r1 + 0x30; + scene->monSpriteY1 = 0x48; + scene->monSpriteY2 = r1 + 0x30; } else { - scene->field_0006 = 0x48; - scene->field_0008 = 0x60; + scene->monSpriteY1 = 0x48; + scene->monSpriteY2 = 0x60; } r6 = Alloc(0x2000); @@ -662,123 +666,133 @@ void sub_811D830(u8 closeness) HandleLoadSpecialPokePic(&gMonFrontPicTable[species], r6, species, personality); LZ77UnCompWram(GetMonFrontSpritePal(pokemon), r4); LoadMonSpriteGraphics(r6, r4); - spriteId = CreateSprite(&sSpriteTemplate_MonSprite, 120, scene->field_0006, 4); + spriteId = CreateSprite(&sSpriteTemplate_MonSprite, 120, scene->monSpriteY1, 4); if (spriteId != MAX_SPRITES) { scene->monSprite = &gSprites[spriteId]; - sub_811DB14(scene->monSprite, closeness); + MonSpriteZoom_UpdateYPos(scene->monSprite, closeness); } else scene->monSprite = NULL; - scene->field_000a = closeness; + scene->lastCloseness = closeness; } if (r6 != NULL) Free(r6); if (r9 != NULL) Free(r9); if (r4 != NULL) Free(r4); } +#define tState data[0] +#define tCurrCloseness data[1] +#define tFinalCloseness data[2] +#define tDeltaCloseness data[3] +#define tTimer data[4] +#define tDelay data[5] +#define tOff_MonSprite 6 +#define tHasItemSprite data[8] +#define tOff_ItemSprite 9 + void PSA_SetUpZoomAnim(u8 closeness) { struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork(); u8 taskId; - if (closeness != scene->field_000a) + if (closeness != scene->lastCloseness) { - taskId = CreateTask(sub_811D9BC, 4); - SetWordTaskArg(taskId, 6, (uintptr_t)scene->monSprite); - gTasks[taskId].data[1] = scene->field_000a; - gTasks[taskId].data[2] = closeness; - gTasks[taskId].data[5] = 6; - if (closeness > scene->field_000a) - gTasks[taskId].data[3] = 1; + taskId = CreateTask(Task_ZoomAnim, 4); + SetWordTaskArg(taskId, tOff_MonSprite, (uintptr_t)scene->monSprite); + gTasks[taskId].tCurrCloseness = scene->lastCloseness; + gTasks[taskId].tFinalCloseness = closeness; + gTasks[taskId].tDelay = 6; + if (closeness > scene->lastCloseness) + gTasks[taskId].tDeltaCloseness = 1; else - gTasks[taskId].data[3] = -1; + gTasks[taskId].tDeltaCloseness = -1; } } -bool8 sub_811D9A8(void) +bool8 PSA_IsZoomTaskActive(void) { - return FuncIsActiveTask(sub_811D9BC); + return FuncIsActiveTask(Task_ZoomAnim); } -static void sub_811D9BC(u8 taskId) +static void Task_ZoomAnim(u8 taskId) { s16 *data = gTasks[taskId].data; - struct Sprite * sprite = (void *)GetWordTaskArg(taskId, 6); - switch (data[0]) + struct Sprite * sprite = (void *)GetWordTaskArg(taskId, tOff_MonSprite); + switch (tState) { case 0: - sub_811DA9C(sprite, data[1]); - if (data[8]) - sub_811DA9C((void *)GetWordTaskArg(taskId, 9), data[1]); - data[1] += data[3]; - data[0]++; + SetSpriteWithCloseness(sprite, tCurrCloseness); + if (tHasItemSprite) + SetSpriteWithCloseness((void *)GetWordTaskArg(taskId, tOff_ItemSprite), tCurrCloseness); + tCurrCloseness += tDeltaCloseness; + tState++; break; case 1: - if (!sub_811DAAC(sprite)) + if (!IsZoomSpriteCBActive(sprite)) { PlaySE(SE_TB_KARA); - sub_811DB14(sprite, data[1]); - if (data[8]) - sub_811DB48((void *)GetWordTaskArg(taskId, 9), data[1]); - if (data[1] == data[2]) + MonSpriteZoom_UpdateYPos(sprite, tCurrCloseness); + if (tHasItemSprite) + ItemSpriteZoom_UpdateYPos((void *)GetWordTaskArg(taskId, tOff_ItemSprite), tCurrCloseness); + if (tCurrCloseness == tFinalCloseness) { - PSA_GetSceneWork()->field_000a = data[2]; + PSA_GetSceneWork()->lastCloseness = tFinalCloseness; DestroyTask(taskId); } else { - data[4] = 0; - data[0] = 2; + tTimer = 0; + tState = 2; } } break; case 2: - data[4]++; - if (data[4] > data[5]) - data[0] = 0; + tTimer++; + if (tTimer > tDelay) + tState = 0; break; } } -static void sub_811DA9C(struct Sprite * sprite, u8 closeness) +static void SetSpriteWithCloseness(struct Sprite * sprite, u8 closeness) { sprite->data[0] = 0; sprite->data[1] = 0; sprite->data[2] = closeness; } -static bool8 sub_811DAAC(struct Sprite * sprite) +static bool8 IsZoomSpriteCBActive(struct Sprite * sprite) { return sprite->callback != SpriteCallbackDummy; } -static s16 sub_811DAC0(s16 pos, u8 closeness) +static s16 GetSpriteOffsetByScale(s16 pos, u8 closeness) { return (pos * sAffineScales[closeness]) >> 8; } // FIXME: better math -static u16 sub_811DADC(u16 pos) +static u16 GetYPosByScale(u16 pos) { struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork(); - s32 v = ((((((scene->field_0008 - scene->field_0006) << 16) >> 8) / 256 * (pos - 256)) << 8) >> 16); - return v += scene->field_0006; + s32 v = ((((((scene->monSpriteY2 - scene->monSpriteY1) << 16) >> 8) / 256 * (pos - 256)) << 8) >> 16); + return v += scene->monSpriteY1; } -static void sub_811DB14(struct Sprite * sprite, u8 closeness) +static void MonSpriteZoom_UpdateYPos(struct Sprite * sprite, u8 closeness) { if (closeness > 3) closeness = 3; PSA_GetSceneWork(); // return value not used StartSpriteAffineAnim(sprite, closeness); - sprite->pos1.y = sub_811DADC(sAffineScales[closeness]); + sprite->pos1.y = GetYPosByScale(sAffineScales[closeness]); } -static void sub_811DB48(struct Sprite * sprite, u8 closeness) +static void ItemSpriteZoom_UpdateYPos(struct Sprite * sprite, u8 closeness) { - sub_811DB14(sprite, closeness); - sprite->pos2.x = sub_811DAC0(sprite->data[6] - 32, closeness); - sprite->pos2.y = sub_811DAC0(sprite->data[7] - 32, closeness); + MonSpriteZoom_UpdateYPos(sprite, closeness); + sprite->pos2.x = GetSpriteOffsetByScale(sprite->data[6] - 32, closeness); + sprite->pos2.y = GetSpriteOffsetByScale(sprite->data[7] - 32, closeness); } static void StartMonWiggleAnim(struct PokemonSpecialAnimScene * scene, u8 frameLen, u8 niter, u8 amplitude) @@ -830,22 +844,44 @@ static void LoadMonSpriteGraphics(u16 *tiles, u16 *palette) LoadSpritePalette(&spritePalette); } -void PSA_SetUpZoomOutMonTask(u16 itemId, u8 closeness, bool32 a2) +#undef tOff_ItemSprite +#undef tHasItemSprite +#undef tOff_MonSprite +#undef tDelay +#undef tTimer +#undef tDeltaCloseness +#undef tFinalCloseness +#undef tCurrCloseness +#undef tState + +#define tState data[0] +#define tTimer data[1] +#define tCloseness data[2] +#define tYpos data[3] +#define tOff_ItemSprite 4 +#define tData6 data[6] +#define tData7 data[7] +#define tActiveSprCt data[8] +#define tBlendColor data[9] +#define tTimerReset data[10] +#define tSuppressDots data[11] + +void PSA_SetUpItemUseOnMonAnim(u16 itemId, u8 closeness, bool32 a2) { struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork(); u8 taskId; scene->itemIconSprite = PSA_CreateItemIconObject(itemId); if (scene->itemIconSprite != NULL) { - sub_811E06C(scene, scene->itemIconSprite, closeness); + InitItemIconSpriteState(scene, scene->itemIconSprite, closeness); StartSpriteAffineAnim(scene->itemIconSprite, closeness); scene->itemIconSprite->invisible = TRUE; - taskId = CreateTask(Task_ZoomOutMon, 2); - SetWordTaskArg(taskId, 4, (uintptr_t)scene->itemIconSprite); - gTasks[taskId].data[2] = closeness; - gTasks[taskId].data[3] = sub_811DADC(sAffineScales[closeness]); - gTasks[taskId].data[6] = a2; - gTasks[taskId].data[9] = GetBlendColorByItemId(itemId); + taskId = CreateTask(Task_ItemUseOnMonAnim, 2); + SetWordTaskArg(taskId, tOff_ItemSprite, (uintptr_t)scene->itemIconSprite); + gTasks[taskId].tCloseness = closeness; + gTasks[taskId].tYpos = GetYPosByScale(sAffineScales[closeness]); + gTasks[taskId].tData6 = a2; + gTasks[taskId].tBlendColor = GetBlendColorByItemId(itemId); } } @@ -854,18 +890,18 @@ static u16 GetBlendColorByItemId(u16 itemId) return RGB_WHITE; } -void sub_811DCF0(u16 itemId) +void CreateItemIconSpriteAtMaxCloseness(u16 itemId) { struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork(); scene->itemIconSprite = PSA_CreateItemIconObject(itemId); if (scene->itemIconSprite != NULL) { StartSpriteAffineAnim(scene->itemIconSprite, 3); - sub_811E06C(scene, scene->itemIconSprite, 3); + InitItemIconSpriteState(scene, scene->itemIconSprite, 3); } } -struct Sprite * PSA_CreateItemIconObject(u16 itemId) +static struct Sprite * PSA_CreateItemIconObject(u16 itemId) { u8 spriteId; struct Sprite * sprite; @@ -881,38 +917,38 @@ struct Sprite * PSA_CreateItemIconObject(u16 itemId) return &gSprites[spriteId]; } -bool8 PSA_IsZoomOutMonTaskRunning(void) +bool8 PSA_IsItemUseOnMonAnimActive(void) { - return FuncIsActiveTask(Task_ZoomOutMon); + return FuncIsActiveTask(Task_ItemUseOnMonAnim); } -static void Task_ZoomOutMon(u8 taskId) +static void Task_ItemUseOnMonAnim(u8 taskId) { s16 *data = gTasks[taskId].data; - struct Sprite * sprite = (void *)GetWordTaskArg(taskId, 4); - switch (data[0]) + struct Sprite * sprite = (void *)GetWordTaskArg(taskId, tOff_ItemSprite); + switch (tState) { case 0: - data[1]++; - if (data[1] > 20) + tTimer++; + if (tTimer > 20) { - data[1] = 0; + tTimer = 0; PlaySE(SE_W207B); sprite->invisible = FALSE; - if (!data[11]) - sub_811E588(); - data[0] = 1; + if (!tSuppressDots) + LoadOutwardSpiralDotsGfx(); + tState = 1; } break; case 1: - data[1]++; - if (data[1] > 30) + tTimer++; + if (tTimer > 30) { - data[1] = 0; - sprite->affineAnims = gUnknown_8459AA8; - StartSpriteAffineAnim(sprite, data[2]); - BeginNormalPaletteFade(0x10000 << IndexOfSpritePaletteTag(1), -2, 0, 12, data[9]); - data[0] = 2; + tTimer = 0; + sprite->affineAnims = sAffineAnimTable_ItemZoom; + StartSpriteAffineAnim(sprite, tCloseness); + BeginNormalPaletteFade(0x10000 << IndexOfSpritePaletteTag(1), -2, 0, 12, tBlendColor); + tState = 2; PlaySE(SE_W208); } break; @@ -920,30 +956,30 @@ static void Task_ZoomOutMon(u8 taskId) if (sprite->affineAnimEnded) { sprite->invisible = TRUE; - data[10] = 20; - data[0] = 3; + tTimerReset = 20; + tState = 3; } break; case 3: - data[1]++; - if (data[1] > data[10]) + tTimer++; + if (tTimer > tTimerReset) { - data[1] = 0; - if (!data[11]) + tTimer = 0; + if (!tSuppressDots) CreateSprites_UseItem_OutwardSpiralDots(taskId, data, sprite); - if (data[7] == 0) + if (tData7 == 0) PlaySE(SE_W179); - data[7]++; - if (data[7] > 2) - data[0] = 4; + tData7++; + if (tData7 > 2) + tState = 4; else - data[10] = 8; + tTimerReset = 8; } break; case 4: - if (data[8] == 0) + if (tActiveSprCt == 0) { - if (data[6] != 0) + if (tData6) DestroySprite(sprite); DestroyTask(taskId); } @@ -957,7 +993,7 @@ static void CreateSprites_UseItem_OutwardSpiralDots(u8 taskId, s16 *data, struct int y = sprite->pos1.y + sprite->pos2.y - 4; u8 spriteId; int i; - BlendPalettes(0x10000 << IndexOfSpritePaletteTag(5), 16, data[9]); + BlendPalettes(0x10000 << IndexOfSpritePaletteTag(5), 16, tBlendColor); for (i = 0; i < 15; i++) { spriteId = CreateSprite(&sSpriteTemplate_UseItem_OutwardSpiralDots, x, y, 0); @@ -965,14 +1001,14 @@ static void CreateSprites_UseItem_OutwardSpiralDots(u8 taskId, s16 *data, struct { gSprites[spriteId].data[1] = i << 4; gSprites[spriteId].data[7] = taskId; - gSprites[spriteId].callback = sub_811DFC0; + gSprites[spriteId].callback = SpriteCB_OutwardSpiralDots; StartSpriteAnim(&gSprites[spriteId], 1); - data[8]++; + tActiveSprCt++; } } } -static void sub_811DFC0(struct Sprite * sprite) +static void SpriteCB_OutwardSpiralDots(struct Sprite * sprite) { s16 *data = sprite->data; if (data[0] < 16) @@ -986,35 +1022,35 @@ static void sub_811DFC0(struct Sprite * sprite) } else { - gTasks[data[7]].data[8]--; + gTasks[data[7]].tActiveSprCt--; DestroySprite(sprite); } } -void sub_811E040(void) +void PSA_UseItem_CleanUpForCancel(void) { - u8 taskId = FindTaskIdByFunc(Task_ZoomOutMon); + u8 taskId = FindTaskIdByFunc(Task_ItemUseOnMonAnim); if (taskId != 0xFF) { - gTasks[taskId].data[11] = TRUE; + gTasks[taskId].tSuppressDots = TRUE; } } -static void sub_811E06C(struct PokemonSpecialAnimScene * scene, struct Sprite * sprite, u8 closeness) +static void InitItemIconSpriteState(struct PokemonSpecialAnimScene * scene, struct Sprite * sprite, u8 closeness) { u16 species; u32 personality; - register int r4 asm("r4"); // FIXME - u8 r0; + register int x asm("r4"); // FIXME + u8 y; if (closeness == 3) { sprite->pos1.x = 120; - sprite->pos1.y = scene->field_0008; + sprite->pos1.y = scene->monSpriteY2; } else { sprite->pos1.x = 120; - sprite->pos1.y = scene->field_0006; + sprite->pos1.y = scene->monSpriteY1; } sprite->pos1.x += 4; sprite->pos1.y += 4; @@ -1022,44 +1058,56 @@ static void sub_811E06C(struct PokemonSpecialAnimScene * scene, struct Sprite * personality = PSA_GetMonPersonality(); if (PSA_GetAnimType() == 4) { - r4 = sub_812EA78(species, personality, 0); - r0 = sub_812EA78(species, personality, 1); + x = Menu2_GetMonSpriteAnchorCoord(species, personality, 0); + y = Menu2_GetMonSpriteAnchorCoord(species, personality, 1); } else { - r4 = sub_812EA78(species, personality, 3); - r0 = sub_812EA78(species, personality, 4); + x = Menu2_GetMonSpriteAnchorCoord(species, personality, 3); + y = Menu2_GetMonSpriteAnchorCoord(species, personality, 4); } - if (r4 == 0xFF) - r4 = 0; - if (r0 == 0xFF) - r0 = 0; - sprite->data[6] = r4; - sprite->data[7] = r0; - sub_811DB48(sprite, closeness); -} - -static void sub_811E10C(void) + if (x == 0xFF) + x = 0; + if (y == 0xFF) + y = 0; + sprite->data[6] = x; + sprite->data[7] = y; + ItemSpriteZoom_UpdateYPos(sprite, closeness); +} + +#undef tSuppressDots +#undef tTimerReset +#undef tBlendColor +#undef tActiveSprCt +#undef tData7 +#undef tData6 +#undef tOff_ItemSprite +#undef tYpos +#undef tCloseness +#undef tTimer +#undef tState + +static void MachineSetWobbleInit(void) { struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork(); - sub_811E128(scene->monSprite); - sub_811E128(scene->itemIconSprite); + MachineSetWobble_SetCB(scene->monSprite); + MachineSetWobble_SetCB(scene->itemIconSprite); } -static void sub_811E128(struct Sprite * sprite) +static void MachineSetWobble_SetCB(struct Sprite * sprite) { sprite->data[0] = 0; sprite->data[1] = 0; - sprite->callback = sub_811E154; + sprite->callback = SpriteCB_MachineSetWobble; } -static bool8 sub_811E138(void) +static bool8 MachineSetWobbleCBIsRunning(void) { struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork(); return scene->monSprite->callback != SpriteCallbackDummy; } -static void sub_811E154(struct Sprite * sprite) +static void SpriteCB_MachineSetWobble(struct Sprite * sprite) { switch (sprite->data[0]) { @@ -1078,57 +1126,78 @@ static void sub_811E154(struct Sprite * sprite) } } -static void sub_811E194(u8 a0) +// Redefined from above +#define tState data[0] +#define tCurrCloseness data[1] +#define tFinalCloseness data[2] +#define tDeltaCloseness data[3] +#define tTimer data[4] +#define tDelay data[5] +#define tOff_MonSprite 6 +#define tHasItemSprite data[8] +#define tOff_ItemSprite 9 + +static void StartZoomOutAnimForUseTM(u8 closeness) { struct PokemonSpecialAnimScene * scene = PSA_GetSceneWork(); u8 taskId; - if (a0 != scene->field_000a) + if (closeness != scene->lastCloseness) { - taskId = CreateTask(sub_811D9BC, 1); - SetWordTaskArg(taskId, 6, (uintptr_t)scene->monSprite); - SetWordTaskArg(taskId, 9, (uintptr_t)scene->itemIconSprite); - gTasks[taskId].data[1] = scene->field_000a; - gTasks[taskId].data[2] = a0; - gTasks[taskId].data[8] = 1; - gTasks[taskId].data[5] = 6; - if (a0 > scene->field_000a) - gTasks[taskId].data[3] = 1; + taskId = CreateTask(Task_ZoomAnim, 1); + SetWordTaskArg(taskId, tOff_MonSprite, (uintptr_t)scene->monSprite); + SetWordTaskArg(taskId, tOff_ItemSprite, (uintptr_t)scene->itemIconSprite); + gTasks[taskId].tCurrCloseness = scene->lastCloseness; + gTasks[taskId].tFinalCloseness = closeness; + gTasks[taskId].tHasItemSprite = 1; + gTasks[taskId].tDelay = 6; + if (closeness > scene->lastCloseness) + gTasks[taskId].tDeltaCloseness = 1; else - gTasks[taskId].data[3] = -1; + gTasks[taskId].tDeltaCloseness = -1; } } -static void sub_811E204(struct PokemonSpecialAnimScene * scene) +#undef tOff_ItemSprite +#undef tHasItemSprite +#undef tOff_MonSprite +#undef tDelay +#undef tTimer +#undef tDeltaCloseness +#undef tFinalCloseness +#undef tCurrCloseness +#undef tState + +static void CreateStarSprites(struct PokemonSpecialAnimScene * scene) { int i; u8 spriteId; u16 species; u32 personality; - LoadCompressedSpriteSheet(&gUnknown_84599B8); - LoadSpritePalette(&gUnknown_84599C0); + LoadCompressedSpriteSheet(&sSpriteSheet_Star); + LoadSpritePalette(&sSpritePalette_Star); scene->field_0002 = 0; for (i = 0; i < 3; i++) { - spriteId = CreateSprite(&gUnknown_8459AEC, 120 + gUnknown_84599B2[i][0], scene->field_0008 + gUnknown_84599B2[i][1], 2); + spriteId = CreateSprite(&sSpriteTemplate_Star, 120 + sStarCoordOffsets[i][0], scene->monSpriteY2 + sStarCoordOffsets[i][1], 2); if (spriteId != MAX_SPRITES) { species = PSA_GetMonSpecies(); personality = PSA_GetMonPersonality(); - gSprites[spriteId].data[3] = gUnknown_84599B2[i][0] * 8; - gSprites[spriteId].data[4] = gUnknown_84599B2[i][1] * 8; - gSprites[spriteId].pos1.x += sub_811DAC0(sub_812EAE4(species, personality, 0), 3); - gSprites[spriteId].pos1.y += sub_811DAC0(sub_812EAE4(species, personality, 1), 3); + gSprites[spriteId].data[3] = sStarCoordOffsets[i][0] * 8; + gSprites[spriteId].data[4] = sStarCoordOffsets[i][1] * 8; + gSprites[spriteId].pos1.x += GetSpriteOffsetByScale(Menu2_GetMonSpriteAnchorCoordMinusx20(species, personality, 0), 3); + gSprites[spriteId].pos1.y += GetSpriteOffsetByScale(Menu2_GetMonSpriteAnchorCoordMinusx20(species, personality, 1), 3); scene->field_0002++; } } } -static u8 sub_811E2F4(void) +static u8 AnyStarSpritesActive(void) { return PSA_GetSceneWork()->field_0002; } -static void sub_811E300(struct Sprite * sprite) +static void SpriteCB_Star(struct Sprite * sprite) { sprite->data[0]++; if (sprite->data[0] < 10) @@ -1145,23 +1214,40 @@ static void sub_811E300(struct Sprite * sprite) } } -static void sub_811E348(struct PokemonSpecialAnimScene * scene) +// ======================================================== + +#define tState data[0] +#define tTimer data[1] +#define tActiveSprCt data[2] +#define tOff_RngState 3 +#define tAngle data[5] +#define tMadeSprCt data[6] + +#define tsRadius data[0] +#define tsSpeed data[1] +#define tsXinit data[2] +#define tsYinit data[3] +#define tsXorig data[4] +#define tsYorig data[5] +#define tsTaskId data[6] + +static void PSAScene_SeedRandomInTask(struct PokemonSpecialAnimScene * scene) { u8 taskId; - sub_811E588(); - taskId = CreateTask(sub_811E3B4, 1); - SetWordTaskArg(taskId, 3, 2022069025); - gTasks[taskId].data[5] = 224; + LoadOutwardSpiralDotsGfx(); + taskId = CreateTask(Task_UseItem_OutwardSpiralDots, 1); + SetWordTaskArg(taskId, tOff_RngState, 2022069025); + gTasks[taskId].tAngle = 0xE0; } -static void sub_811E388(void) +static void StopMakingOutwardSpiralDots(void) { - u8 taskId = FindTaskIdByFunc(sub_811E3B4); + u8 taskId = FindTaskIdByFunc(Task_UseItem_OutwardSpiralDots); if (taskId != 0xFF) - gTasks[taskId].data[0] = 1; + gTasks[taskId].tState = 1; } -static void sub_811E3B4(u8 taskId) +static void Task_UseItem_OutwardSpiralDots(u8 taskId) { s16 *data = gTasks[taskId].data; struct Sprite * sprite; @@ -1169,52 +1255,52 @@ static void sub_811E3B4(u8 taskId) register int y asm("r10"); // FIXME int x2; int y2; - int r0; + int ampl; u8 spriteId; - switch (data[0]) + switch (tState) { case 0: - if (data[1] == 0) + if (tTimer == 0) { sprite = PSA_GetSceneWork()->itemIconSprite; x = sprite->pos1.x + sprite->pos2.x; y = sprite->pos1.y + sprite->pos2.y; - r0 = (sub_811E4EC(taskId) % 21) + 70; - x2 = x + ((u32)(gSineTable[data[5] + 0x40] * r0) >> 8); - y2 = y + ((u32)(gSineTable[data[5] ] * r0) >> 8); - data[5] += 76; - data[5] &= 0xFF; + ampl = (PSAScene_RandomFromTask(taskId) % 21) + 70; + x2 = x + ((u32)(gSineTable[tAngle + 0x40] * ampl) >> 8); + y2 = y + ((u32)(gSineTable[tAngle ] * ampl) >> 8); + tAngle += 0x4C; + tAngle &= 0xFF; spriteId = CreateSprite(&sSpriteTemplate_UseItem_OutwardSpiralDots, x2, y2, 0); if (spriteId != MAX_SPRITES) { - gSprites[spriteId].data[0] = 0; - gSprites[spriteId].data[1] = (sub_811E4EC(taskId) & 1) + 6; - gSprites[spriteId].data[2] = x2; - gSprites[spriteId].data[3] = y2; - gSprites[spriteId].data[4] = x; - gSprites[spriteId].data[5] = y; - gSprites[spriteId].data[6] = taskId; - data[2]++; + gSprites[spriteId].tsRadius = 0; + gSprites[spriteId].tsSpeed = (PSAScene_RandomFromTask(taskId) & 1) + 6; + gSprites[spriteId].tsXinit = x2; + gSprites[spriteId].tsYinit = y2; + gSprites[spriteId].tsXorig = x; + gSprites[spriteId].tsYorig = y; + gSprites[spriteId].tsTaskId = taskId; + tActiveSprCt++; } - data[6]++; - if (data[6] > 47) - data[0]++; + tMadeSprCt++; + if (tMadeSprCt > 47) + tState++; } else - data[1]--; + tTimer--; break; case 1: - if (data[2] == 0) + if (tActiveSprCt == 0) DestroyTask(taskId); break; } } -static u16 sub_811E4EC(u8 taskId) +static u16 PSAScene_RandomFromTask(u8 taskId) { - u32 state = GetWordTaskArg(taskId, 3); + u32 state = GetWordTaskArg(taskId, tOff_RngState); state = state * 1103515245 + 24691; - SetWordTaskArg(taskId, 3, state); + SetWordTaskArg(taskId, tOff_RngState, state); return state >> 16; } @@ -1222,120 +1308,170 @@ static void SpriteCallback_UseItem_OutwardSpiralDots(struct Sprite * sprite) { int x; int y; - sprite->data[0] += sprite->data[1]; - if (sprite->data[0] > 255) + sprite->tsRadius += sprite->tsSpeed; + if (sprite->tsRadius > 255) { - gTasks[sprite->data[6]].data[2]--; + gTasks[sprite->tsTaskId].tActiveSprCt--; DestroySprite(sprite); } else { - x = (sprite->data[4] - sprite->data[2]) * sprite->data[0]; - y = (sprite->data[5] - sprite->data[3]) * sprite->data[0]; - sprite->pos1.x = (x >> 8) + sprite->data[2]; - sprite->pos1.y = (y >> 8) + sprite->data[3]; + x = (sprite->tsXorig - sprite->tsXinit) * sprite->tsRadius; + y = (sprite->tsYorig - sprite->tsYinit) * sprite->tsRadius; + sprite->pos1.x = (x >> 8) + sprite->tsXinit; + sprite->pos1.y = (y >> 8) + sprite->tsYinit; } } -static void sub_811E588(void) +static void LoadOutwardSpiralDotsGfx(void) { LoadCompressedSpriteSheet(&sSpriteSheet_UseItem_OutwardSpiralDots); LoadSpritePalette(&sSpritePalette_UseItem_OutwardSpiralDots); } -static bool32 sub_811E5A4(void) +static bool32 IsOutwardSpiralDotsTaskRunning(void) { - return FuncIsActiveTask(sub_811E3B4); + return FuncIsActiveTask(Task_UseItem_OutwardSpiralDots); } -void sub_811E5B8(u16 a0, u16 a1, u16 a2, u16 a3, u16 a4, u16 a5) +#undef tsTaskId +#undef tsYorig +#undef tsXorig +#undef tsYinit +#undef tsXinit +#undef tsSpeed +#undef tsRadius + +#undef tMadeSprCt +#undef tAngle +#undef tOff_RngState +#undef tActiveSprCt +#undef tTimer +#undef tState + +// ======================================================== + +#define tState data[0] +#define tActiveSprCt data[1] +#define tMadeSprCt data[2] +#define tTimer data[3] +#define tXpos data[4] +#define tYpos data[5] +#define tTileTag data[6] +#define tPaletteTag data[7] +#define tPriority data[8] +#define tSubpriority data[9] + +#define tsYsubpixel data[1] +#define tsSpeed data[2] +#define tsTaskId data[7] + +void CreateLevelUpVerticalSpritesTask(u16 x, u16 y, u16 tileTag, u16 paletteTag, u16 priority, u16 subpriority) { - static struct CompressedSpriteSheet gUnknown_3002030; - static struct SpritePalette gUnknown_3002038; + static struct CompressedSpriteSheet spriteSheet; + static struct SpritePalette spritePalette; u8 taskId; - gUnknown_3002030.tag = a2; - gUnknown_3002030.data = gUnknown_8459888; - gUnknown_3002030.size = gUnknown_8459888[0] >> 8; - gUnknown_3002038.data = gUnknown_8459868; - gUnknown_3002038.tag = a3; - LoadCompressedSpriteSheet(&gUnknown_3002030); - LoadSpritePalette(&gUnknown_3002038); - taskId = CreateTask(sub_811E694, 0); - gTasks[taskId].data[4] = a0 - 32; - gTasks[taskId].data[5] = a1 + 32; - gTasks[taskId].data[6] = a2; - gTasks[taskId].data[7] = a3; - gTasks[taskId].data[8] = a4; - gTasks[taskId].data[9] = a5; + spriteSheet.tag = tileTag; + spriteSheet.data = sSpriteTiles_LevelUpVertical; + spriteSheet.size = sSpriteTiles_LevelUpVertical[0] >> 8; + spritePalette.data = sSpritePals_LevelUpVertical; + spritePalette.tag = paletteTag; + LoadCompressedSpriteSheet(&spriteSheet); + LoadSpritePalette(&spritePalette); + taskId = CreateTask(Task_LevelUpVerticalSprites, 0); + gTasks[taskId].tXpos = x - 32; + gTasks[taskId].tYpos = y + 32; + gTasks[taskId].tTileTag = tileTag; + gTasks[taskId].tPaletteTag = paletteTag; + gTasks[taskId].tPriority = priority; + gTasks[taskId].tSubpriority = subpriority; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_NONE | BLDCNT_TGT2_ALL); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 6)); } -bool8 sub_811E680(void) +bool8 LevelUpVerticalSpritesTaskIsRunning(void) { - return FuncIsActiveTask(sub_811E694); + return FuncIsActiveTask(Task_LevelUpVerticalSprites); } -static void sub_811E694(u8 taskId) +static void Task_LevelUpVerticalSprites(u8 taskId) { s16 *data = gTasks[taskId].data; - switch (data[0]) + switch (tState) { case 0: - if (data[3] == 0) + if (tTimer == 0) { - data[3]++; - sub_811E710(taskId, data); - if (data[2] > 17) - data[0]++; + tTimer++; + CreateLevelUpVerticalSprite(taskId, data); + if (tMadeSprCt > 17) + tState++; } else { - data[3]++; - if (data[3] == 2) - data[3] = 0; + tTimer++; + if (tTimer == 2) + tTimer = 0; } break; case 1: - if (data[1] == 0) + if (tActiveSprCt == 0) { - FreeSpriteTilesByTag(data[6]); - FreeSpritePaletteByTag(data[7]); + FreeSpriteTilesByTag(tTileTag); + FreeSpritePaletteByTag(tPaletteTag); DestroyTask(taskId); } break; } } -static void sub_811E710(u8 taskId, s16 *data) +static void CreateLevelUpVerticalSprite(u8 taskId, s16 *data) { u8 spriteId; - struct SpriteTemplate template = gUnknown_8459ACC; - template.tileTag = data[6]; - template.paletteTag = data[7]; - data[2]++; - spriteId = CreateSprite(&template, ((data[2] * 219) & 0x3F) + data[4], data[5], data[9]); + struct SpriteTemplate template = sSpriteTemplate_LevelUpVertical; + template.tileTag = tTileTag; + template.paletteTag = tPaletteTag; + tMadeSprCt++; + spriteId = CreateSprite(&template, ((tMadeSprCt * 219) & 0x3F) + tXpos, tYpos, tSubpriority); if (spriteId != MAX_SPRITES) { - gSprites[spriteId].oam.priority = data[8]; - gSprites[spriteId].data[1] = 0; - gSprites[spriteId].data[2] = ((data[2] * 1103515245 + 24691) & 0x3F) + 0x20; - gSprites[spriteId].data[7] = taskId; - data[1]++; + gSprites[spriteId].oam.priority = tPriority; + gSprites[spriteId].tsYsubpixel = 0; + // similar to the LCRNG in random.c, but seeding from data[2] + gSprites[spriteId].tsSpeed = ((tMadeSprCt * 1103515245 + 24691) & 0x3F) + 0x20; + gSprites[spriteId].tsTaskId = taskId; + tActiveSprCt++; } } -static void sub_811E7B4(struct Sprite * sprite) +static void SpriteCB_LevelUpVertical(struct Sprite * sprite) { - sprite->data[1] -= sprite->data[2]; - sprite->pos2.y = sprite->data[1] >> 4; + sprite->tsYsubpixel -= sprite->tsSpeed; + sprite->pos2.y = sprite->tsYsubpixel >> 4; if (sprite->pos2.y < -0x40) { - gTasks[sprite->data[7]].data[1]--; + gTasks[sprite->tsTaskId].tActiveSprCt--; DestroySprite(sprite); } } +#undef tsTaskId +#undef tsSpeed +#undef tsYsubpixel + +#undef tSubpriority +#undef tPriority +#undef tPaletteTag +#undef tTileTag +#undef tYpos +#undef tXpos +#undef tTimer +#undef tMadeSprCt +#undef tActiveSprCt +#undef tState + +// ======================================================== + static const u8 *const sLevelUpWindowStatNames[] = { gUnknown_841B2A9, gUnknown_841B2B7, |