diff options
author | Evan <eroelke@gmail.com> | 2019-11-21 10:23:49 -0700 |
---|---|---|
committer | Evan <eroelke@gmail.com> | 2019-11-21 10:23:49 -0700 |
commit | b18ec47b1393d562655e50d30acb3de191423581 (patch) | |
tree | 7959a1477120baf656599794b423aa8cc11ea0c0 /src | |
parent | 359d345913d7f5ed36c34ede5476fff946318ffd (diff) | |
parent | 2d284654440cb77365639bf107c31b44326362e3 (diff) |
fix conflicts
Diffstat (limited to 'src')
-rw-r--r-- | src/battle_main.c | 6 | ||||
-rw-r--r-- | src/battle_script_commands.c | 4 | ||||
-rw-r--r-- | src/berry_pouch.c | 6 | ||||
-rw-r--r-- | src/dark.c | 2 | ||||
-rw-r--r-- | src/evolution_graphics.c | 638 | ||||
-rw-r--r-- | src/evolution_scene.c | 1569 | ||||
-rw-r--r-- | src/ice.c | 2 | ||||
-rw-r--r-- | src/item_pc.c | 2 | ||||
-rw-r--r-- | src/menu_helpers.c | 6 | ||||
-rw-r--r-- | src/new_menu_helpers.c | 50 | ||||
-rw-r--r-- | src/option_menu.c | 750 | ||||
-rw-r--r-- | src/poison.c | 2 | ||||
-rw-r--r-- | src/pokemon.c | 368 | ||||
-rw-r--r-- | src/shop.c | 58 | ||||
-rw-r--r-- | src/tileset_anims.c | 156 | ||||
-rw-r--r-- | src/tm_case.c | 6 | ||||
-rw-r--r-- | src/trade_scene.c | 12 |
17 files changed, 2608 insertions, 1029 deletions
diff --git a/src/battle_main.c b/src/battle_main.c index 14b191e52..1125a8d2d 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -696,7 +696,7 @@ static void CB2_InitBattleInternal(void) gBattle_BG3_X = 0; gBattle_BG3_Y = 0; gBattleTerrain = BattleSetup_GetTerrainId(); - sub_800F34C(); + InitBattleBgsVideo(); LoadBattleTextboxAndBackground(); ResetSpriteData(); ResetTasks(); @@ -1774,7 +1774,7 @@ void sub_8011A1C(void) gBattle_BG2_Y = 0; gBattle_BG3_X = 0; gBattle_BG3_Y = 0; - sub_800F34C(); + InitBattleBgsVideo(); LoadCompressedPalette(gBattleTextboxPalette, 0, 64); LoadBattleMenuWindowGfx(); ResetSpriteData(); @@ -1835,7 +1835,7 @@ static void sub_8011BB0(void) } } -u32 sub_8011C44(u8 arrayId, u8 caseId) +u32 GetBattleBgAttribute(u8 arrayId, u8 caseId) { u32 ret = 0; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index c5c8e89a4..8a0e32ba8 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5045,7 +5045,7 @@ static void atk5A_yesnoboxlearnmove(void) case 3: if (!gPaletteFade.active && gMain.callback2 == BattleMainCB2) { - u8 movePosition = sub_8138B2C(); + u8 movePosition = GetMoveSlotToReplace(); if (movePosition == 4) { @@ -9629,7 +9629,7 @@ static void atkF2_displaydexinfo(void) } break; case 3: - sub_800F34C(); + InitBattleBgsVideo(); LoadBattleTextboxAndBackground(); gBattle_BG3_X = 0x100; ++gBattleCommunication[0]; diff --git a/src/berry_pouch.c b/src/berry_pouch.c index f6b976ba3..b8b66c0bc 100644 --- a/src/berry_pouch.c +++ b/src/berry_pouch.c @@ -457,7 +457,7 @@ static void CB2_InitBerryPouch(void) { while (1) { - if (sub_80BF72C() == TRUE) + if ((u8)sub_80BF72C() == TRUE) break; if (RunBerryPouchInit() == TRUE) break; @@ -934,7 +934,7 @@ static void Task_BerryPouchMain(u8 taskId) { s16 * data = gTasks[taskId].data; s32 menuInput; - if (!gPaletteFade.active && sub_80BF72C() != TRUE) + if (!gPaletteFade.active && (u8)sub_80BF72C() != TRUE) { menuInput = ListMenu_ProcessInput(data[0]); ListMenuGetScrollAndRow(data[0], &sStaticCnt.listMenuScrollOffset, &sStaticCnt.listMenuSelectedRow); @@ -1040,7 +1040,7 @@ static void Task_NormalContextMenu(u8 taskId) static void Task_NormalContextMenu_HandleInput(u8 taskId) { s8 input; - if (sub_80BF72C() != TRUE) + if ((u8)sub_80BF72C() != TRUE) { input = Menu_ProcessInputNoWrapAround(); switch (input) diff --git a/src/dark.c b/src/dark.c index b6d13afe3..368f5cbd5 100644 --- a/src/dark.c +++ b/src/dark.c @@ -82,7 +82,7 @@ static const union AffineAnimCmd gUnknown_83E7900[] = AFFINEANIMCMD_END, }; -static const union AffineAnimCmd *const gUnknown_83E7910[] = +const union AffineAnimCmd *const gUnknown_83E7910[] = { gUnknown_83E7890, gUnknown_83E78A0, diff --git a/src/evolution_graphics.c b/src/evolution_graphics.c new file mode 100644 index 000000000..622b26f8f --- /dev/null +++ b/src/evolution_graphics.c @@ -0,0 +1,638 @@ +#include "global.h" +#include "trig.h" +#include "random.h" +#include "decompress.h" +#include "palette.h" +#include "sound.h" +#include "task.h" +#include "evolution_scene.h" +#include "evolution_graphics.h" +#include "constants/songs.h" + +static void SpriteCallbackDummy_EvoSparkles(struct Sprite * sprite); +static void EvoTask_PreEvoSparkleSet1Init(u8 taskId); +static void EvoTask_CreatePreEvoSparkleSet1(u8 taskId); +static void EvoTask_WaitForPre1SparklesToGoUp(u8 taskId); +static void EvoTask_PreEvoSparkleSet2Init(u8 taskId); +static void EvoTask_CreatePreEvoSparklesSet2(u8 taskId); +static void EvoTask_PreEvoSparkleSet2Teardown(u8 taskId); +static void EvoTask_PostEvoSparklesSet1Init(u8 taskId); +static void EvoTask_CreatePostEvoSparklesSet1(u8 taskId); +static void EvoTask_PostEvoSparklesSet1Teardown(u8 taskId); +static void EvoTask_PostEvoSparklesSet2Init(u8 taskId); +static void EvoTask_CreatePostEvoSparklesSet2(u8 taskId); +static void EvoTask_PostEvoSparklesSet2Teardown(u8 taskId); +static void EvoTask_PostEvoSparklesSet2TradeInit(u8 taskId); +static void EvoTask_CreatePostEvoSparklesSet2Trade(u8 taskId); +static void EvoTask_PrePostEvoMonSpritesInit(u8 taskId); +static void EvoTask_ChooseNextEvoSpriteAnim(u8 taskId); +static void EvoTask_ShrinkOrExpandEvoSprites(u8 taskId); +static void PreEvoInvisible_PostEvoVisible_KillTask(u8 taskId); +static void PreEvoVisible_PostEvoInvisible_KillTask(u8 taskId); + +static const u16 sEvolutionSparklesPalData[] = INCBIN_U16("graphics/misc/evolution_sprite_841EEA4.gbapal"); +static const u32 sEvolutionSparklesTileData[] = INCBIN_U32("graphics/misc/evolution_sprite_841EEA4.4bpp.lz"); + +static const struct CompressedSpriteSheet sSpriteSheet_EvolutionSparkles[] = { + { sEvolutionSparklesTileData, 0x20, 1001 }, + {} +}; +static const struct SpritePalette sSpritePalette_EvolutionSparkles[] = { + { sEvolutionSparklesPalData, 1001 }, + {} +}; + +static const struct OamData sOamData_EvolutionSparkles = { + .y = 160, + .priority = 1 +}; + +static const union AnimCmd sSpriteAnim_EvolutionSparkles_0[] = { + ANIMCMD_FRAME(0, 8), + ANIMCMD_END +}; + +static const union AnimCmd *const sSpriteAnimTable_EvolutionSparkles[] = { + sSpriteAnim_EvolutionSparkles_0 +}; + +static const struct SpriteTemplate sSpriteTemplate_EvolutionSparkles = { + .tileTag = 1001, + .paletteTag = 1001, + .oam = &sOamData_EvolutionSparkles, + .anims = sSpriteAnimTable_EvolutionSparkles, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy_EvoSparkles +}; + +static const u16 sEvolutionSparkleMatrixScales[12] = { + 0x3C0, + 0x380, + 0x340, + 0x300, + 0x2C0, + 0x280, + 0x240, + 0x200, + 0x1C0, + 0x180, + 0x140, + 0x100 +}; + +static const s16 sUnref_841EF28[][2] = { + {-4, 0x10}, + {-3, 0x30}, + {-2, 0x50}, + {-1, 0x70}, + { 1, 0x70}, + { 2, 0x50}, + { 3, 0x30}, + { 4, 0x10} +}; + +static void SpriteCallbackDummy_EvoSparkles(struct Sprite * sprite) +{ + +} + +static void SetEvoSparklesMatrices(void) +{ + u16 i; + for (i = 0; i < NELEMS(sEvolutionSparkleMatrixScales); i++) + SetOamMatrix(i + 20, sEvolutionSparkleMatrixScales[i], 0, 0, sEvolutionSparkleMatrixScales[i]); +} + +static void SpriteCB_PreEvoSparkleSet1(struct Sprite * sprite) +{ + u8 mnum; + if (sprite->pos1.y > 8) + { + sprite->pos1.y = 88 - sprite->data[7] * sprite->data[7] / 80; + sprite->pos2.y = Sin((u8)sprite->data[6], sprite->data[5]) / 4; + sprite->pos2.x = Cos((u8) sprite->data[6], sprite->data[5]); + sprite->data[6] += 4; + if (sprite->data[7] & 1) + sprite->data[5]--; + sprite->data[7]++; + if (sprite->pos2.y > 0) + sprite->subpriority = 1; + else + sprite->subpriority = 20; + mnum = sprite->data[5] / 4 + 20; + if (mnum > 31) + mnum = 31; + sprite->oam.matrixNum = mnum; + } + else + { + DestroySprite(sprite); + } +} + +static void CreatePreEvoSparkleSet1(u8 a0) +{ + u8 spriteId = CreateSprite(&sSpriteTemplate_EvolutionSparkles, 120, 88, 0); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].data[5] = 48; + gSprites[spriteId].data[6] = a0; + gSprites[spriteId].data[7] = 0; + gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; + gSprites[spriteId].oam.matrixNum = 31; + gSprites[spriteId].callback = SpriteCB_PreEvoSparkleSet1; + } +} + +static void SpriteCB_PreEvoSparkleSet2(struct Sprite * sprite) +{ + if (sprite->pos1.y < 88) + { + sprite->pos1.y = 8 + sprite->data[7] * sprite->data[7] / 5; + sprite->pos2.y = Sin((u8)sprite->data[6], sprite->data[5]) / 4; + sprite->pos2.x = Cos((u8)sprite->data[6], sprite->data[5]); + sprite->data[5] = Sin((u8)(sprite->data[7] * 4), 40) + 8; + sprite->data[7]++; + } + else + { + DestroySprite(sprite); + } +} + +static void CreatePreEvoSparkleSet2(u8 a0) +{ + u8 spriteId = CreateSprite(&sSpriteTemplate_EvolutionSparkles, 120, 8, 0); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].data[5] = 8; + gSprites[spriteId].data[6] = a0; + gSprites[spriteId].data[7] = 0; + gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; + gSprites[spriteId].oam.matrixNum = 25; + gSprites[spriteId].subpriority = 1; + gSprites[spriteId].callback = SpriteCB_PreEvoSparkleSet2; + } +} + +static void SpriteCB_PostEvoSparkleSet1(struct Sprite * sprite) +{ + if (sprite->data[5] > 8) + { + sprite->pos2.y = Sin((u8)sprite->data[6], sprite->data[5]); + sprite->pos2.x = Cos((u8)sprite->data[6], sprite->data[5]); + sprite->data[5] -= sprite->data[3]; + sprite->data[6] += 4; + } + else + { + DestroySprite(sprite); + } +} + +static void CreatePostEvoSparkleSet1(u8 a0, u8 a1) +{ + u8 spriteId = CreateSprite(&sSpriteTemplate_EvolutionSparkles, 120, 56, 0); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].data[3] = a1; + gSprites[spriteId].data[5] = 120; + gSprites[spriteId].data[6] = a0; + gSprites[spriteId].data[7] = 0; + gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; + gSprites[spriteId].oam.matrixNum = 31; + gSprites[spriteId].subpriority = 1; + gSprites[spriteId].callback = SpriteCB_PostEvoSparkleSet1; + } +} + +static void SpriteCB_PostEvoSparkleSet2(struct Sprite * sprite) +{ + u8 mnum; + if ((sprite->data[7] & 3) == 0) + sprite->pos1.y++; + if (sprite->data[6] < 128) + { + sprite->pos2.y = -Sin((u8)sprite->data[6], sprite->data[5]); + sprite->pos1.x = 120 + sprite->data[3] * sprite->data[7] / 3; + sprite->data[6]++; + mnum = 31 - sprite->data[6] * 12 / 128; + if (sprite->data[6] > 64) + { + sprite->subpriority = 1; + } + else + { + sprite->invisible = FALSE; + sprite->subpriority = 20; + if (sprite->data[6] > 112 && (sprite->data[6] & 1)) + sprite->invisible = TRUE; + } + if (mnum < 20) + mnum = 20; + sprite->oam.matrixNum = mnum; + sprite->data[7]++; + } + else + { + DestroySprite(sprite); + } +} + +static void CreatePostEvoSparkleSet2(u8 unused) +{ + u8 spriteId = CreateSprite(&sSpriteTemplate_EvolutionSparkles, 120, 56, 0); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].data[3] = 3 - (Random() % 7); + gSprites[spriteId].data[5] = 48 + (Random() & 63); + gSprites[spriteId].data[7] = 0; + gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; + gSprites[spriteId].oam.matrixNum = 31; + gSprites[spriteId].subpriority = 20; + gSprites[spriteId].callback = SpriteCB_PostEvoSparkleSet2; + } +} + +void LoadEvoSparkleSpriteAndPal(void) +{ + LoadCompressedSpriteSheetUsingHeap(sSpriteSheet_EvolutionSparkles); + LoadSpritePalettes(sSpritePalette_EvolutionSparkles); +} + +u8 LaunchTask_PreEvoSparklesSet1(u16 a0) +{ + u8 taskId = CreateTask(EvoTask_PreEvoSparkleSet1Init, 0); + gTasks[taskId].data[1] = a0; + return taskId; +} + +static void EvoTask_PreEvoSparkleSet1Init(u8 taskId) +{ + SetEvoSparklesMatrices(); + gTasks[taskId].data[15] = 0; + BeginNormalPaletteFade(3 << gTasks[taskId].data[1], 10, 0, 16, RGB_WHITE); + gTasks[taskId].func = EvoTask_CreatePreEvoSparkleSet1; + PlaySE(SE_W025); +} + +static void EvoTask_CreatePreEvoSparkleSet1(u8 taskId) +{ + u8 i; + if (gTasks[taskId].data[15] < 64) + { + if ((gTasks[taskId].data[15] & 7) == 0) + { + for (i = 0; i < 4; i++) + CreatePreEvoSparkleSet1(2 * (gTasks[taskId].data[15] & 0x78) + 64 * i); + } + gTasks[taskId].data[15]++; + } + else + { + gTasks[taskId].data[15] = 96; + gTasks[taskId].func = EvoTask_WaitForPre1SparklesToGoUp; + } +} + +static void EvoTask_WaitForPre1SparklesToGoUp(u8 taskId) +{ + if (gTasks[taskId].data[15] != 0) + gTasks[taskId].data[15]--; + else + DestroyTask(taskId); +} + +u8 LaunchTask_PreEvoSparklesSet2(void) +{ + u8 taskId = CreateTask(EvoTask_PreEvoSparkleSet2Init, 0); + return taskId; +} + +static void EvoTask_PreEvoSparkleSet2Init(u8 taskId) +{ + SetEvoSparklesMatrices(); + gTasks[taskId].data[15] = 0; + gTasks[taskId].func = EvoTask_CreatePreEvoSparklesSet2; + PlaySE(SE_W062B); +} + +static void EvoTask_CreatePreEvoSparklesSet2(u8 taskId) +{ + u8 i; + if (gTasks[taskId].data[15] < 96) + { + if (gTasks[taskId].data[15] < 6) + { + for (i = 0; i < 9; i++) + CreatePreEvoSparkleSet2(16 * i); + } + gTasks[taskId].data[15]++; + } + else + { + gTasks[taskId].func = EvoTask_PreEvoSparkleSet2Teardown; + } +} + +static void EvoTask_PreEvoSparkleSet2Teardown(u8 taskId) +{ + DestroyTask(taskId); +} + +u8 LaunchTask_PostEvoSparklesSet1(void) +{ + u8 taskId = CreateTask(EvoTask_PostEvoSparklesSet1Init, 0); + return taskId; +} + +static void EvoTask_PostEvoSparklesSet1Init(u8 taskId) +{ + SetEvoSparklesMatrices(); + gTasks[taskId].data[15] = 0; + gTasks[taskId].func = EvoTask_CreatePostEvoSparklesSet1; + PlaySE(SE_REAPOKE); +} + +static void EvoTask_CreatePostEvoSparklesSet1(u8 taskId) +{ + u8 i; + if (gTasks[taskId].data[15] < 48) + { + if (gTasks[taskId].data[15] == 0) + { + for (i = 0; i < 16; i++) + { + CreatePostEvoSparkleSet1(i * 16, 4); + } + } + if (gTasks[taskId].data[15] == 32) + { + for (i = 0; i < 16; i++) + { + CreatePostEvoSparkleSet1(i * 16, 8); + } + } + gTasks[taskId].data[15]++; + } + else + { + gTasks[taskId].func = EvoTask_PostEvoSparklesSet1Teardown; + } +} + +static void EvoTask_PostEvoSparklesSet1Teardown(u8 taskId) +{ + DestroyTask(taskId); +} + +u8 LaunchTask_PostEvoSparklesSet2AndFlash(u16 species) +{ + u8 taskId = CreateTask(EvoTask_PostEvoSparklesSet2Init, 0); + gTasks[taskId].data[2] = species; + return taskId; +} + +static void EvoTask_PostEvoSparklesSet2Init(u8 taskId) +{ + SetEvoSparklesMatrices(); + gTasks[taskId].data[15] = 0; + IsMovingBackgroundTaskRunning(); + CpuCopy16(&gPlttBufferFaded[32], &gPlttBufferUnfaded[32], 96); + BeginNormalPaletteFade(0xFFF90F1C, 0, 0, 16, RGB_WHITE); + gTasks[taskId].func = EvoTask_CreatePostEvoSparklesSet2; + PlaySE(SE_W080); +} + +static void EvoTask_CreatePostEvoSparklesSet2(u8 taskId) +{ + u8 i; + if (gTasks[taskId].data[15] < 128) + { + switch (gTasks[taskId].data[15]) + { + default: + if (gTasks[taskId].data[15] < 50) + CreatePostEvoSparkleSet2(Random() & 7); + break; + case 0: + for (i = 0; i < 8; i++) + CreatePostEvoSparkleSet2(i); + break; + case 32: + BeginNormalPaletteFade(0xFFFF0F1C, 16, 16, 0, RGB_WHITE); + break; + } + gTasks[taskId].data[15]++; + } + else + { + gTasks[taskId].func = EvoTask_PostEvoSparklesSet2Teardown; + } +} + +static void EvoTask_PostEvoSparklesSet2Teardown(u8 taskId) +{ + if (!gPaletteFade.active) + DestroyTask(taskId); +} + +u8 LaunchTask_PostEvoSparklesSet2AndFlash_Trade(u16 species) +{ + u8 taskId = CreateTask(EvoTask_PostEvoSparklesSet2TradeInit, 0); + gTasks[taskId].data[2] = species; + return taskId; +} + +static void EvoTask_PostEvoSparklesSet2TradeInit(u8 taskId) +{ + SetEvoSparklesMatrices(); + gTasks[taskId].data[15] = 0; + IsMovingBackgroundTaskRunning(); + CpuCopy16(&gPlttBufferFaded[32], &gPlttBufferUnfaded[32], 96); + BeginNormalPaletteFade(0xFFF90F00, 0, 0, 16, RGB_WHITE); + gTasks[taskId].func = EvoTask_CreatePostEvoSparklesSet2Trade; + PlaySE(SE_W080); +} + +static void EvoTask_CreatePostEvoSparklesSet2Trade(u8 taskId) +{ + u8 i; + if (gTasks[taskId].data[15] < 128) + { + switch (gTasks[taskId].data[15]) + { + default: + if (gTasks[taskId].data[15] < 50) + CreatePostEvoSparkleSet2(Random() & 7); + break; + case 0: + for (i = 0; i < 8; i++) + CreatePostEvoSparkleSet2(i); + break; + case 32: + BeginNormalPaletteFade(0xFFFF0F00, 16, 16, 0, RGB_WHITE); + break; + } + gTasks[taskId].data[15]++; + } + else + { + gTasks[taskId].func = EvoTask_PostEvoSparklesSet2Teardown; + } +} + +static void SpriteCallbackDummy_MonSprites(struct Sprite * sprite) +{ + +} + +#define tPreEvoSpriteId data[1] +#define tPostEvoSpriteId data[2] +#define tPreEvoScale data[3] +#define tPostEvoScale data[4] +#define tDirection data[5] +#define tSpeed data[6] + +u8 LaunchTask_PrePostEvoMonSprites(u8 preEvoSpriteId, u8 postEvoSpriteId) +{ + u16 i; + u8 taskId; + u16 palette[16]; + for (i = 0; i < 16; i++) + palette[i] = RGB_WHITE; + taskId = CreateTask(EvoTask_PrePostEvoMonSpritesInit, 0); + gTasks[taskId].tPreEvoSpriteId = preEvoSpriteId; + gTasks[taskId].tPostEvoSpriteId = postEvoSpriteId; + gTasks[taskId].tPreEvoScale = 256; + gTasks[taskId].tPostEvoScale = 16; + SetOamMatrix(30, 0x10000 / gTasks[taskId].tPreEvoScale, 0, 0, 0x10000 / gTasks[taskId].tPreEvoScale); + SetOamMatrix(31, 0x10000 / gTasks[taskId].tPostEvoScale, 0, 0, 0x10000 / gTasks[taskId].tPostEvoScale); + gSprites[preEvoSpriteId].callback = SpriteCallbackDummy_MonSprites; + gSprites[preEvoSpriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; + gSprites[preEvoSpriteId].oam.matrixNum = 30; + gSprites[preEvoSpriteId].invisible = FALSE; + CpuCopy16(palette, &gPlttBufferFaded[256 + 16 * gSprites[preEvoSpriteId].oam.paletteNum], 32); + gSprites[postEvoSpriteId].callback = SpriteCallbackDummy_MonSprites; + gSprites[postEvoSpriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; + gSprites[postEvoSpriteId].oam.matrixNum = 31; + gSprites[postEvoSpriteId].invisible = FALSE; + CpuCopy16(palette, &gPlttBufferFaded[256 + 16 * gSprites[postEvoSpriteId].oam.paletteNum], 32); + gTasks[taskId].EvoGraphicsTaskEvoStop = FALSE; + return taskId; +} + +static void EvoTask_PrePostEvoMonSpritesInit(u8 taskId) +{ + gTasks[taskId].tDirection = FALSE; + gTasks[taskId].tSpeed = 8; + gTasks[taskId].func = EvoTask_ChooseNextEvoSpriteAnim; +} + +static void EvoTask_ChooseNextEvoSpriteAnim(u8 taskId) +{ + if (gTasks[taskId].EvoGraphicsTaskEvoStop) + { + PreEvoVisible_PostEvoInvisible_KillTask(taskId); + } + else if (gTasks[taskId].tSpeed == 128) + { + PreEvoInvisible_PostEvoVisible_KillTask(taskId); + } + else + { + gTasks[taskId].tSpeed += 2; + gTasks[taskId].tDirection ^= TRUE; + gTasks[taskId].func = EvoTask_ShrinkOrExpandEvoSprites; + } +} + +static void EvoTask_ShrinkOrExpandEvoSprites(u8 taskId) +{ + u8 r6; + if (gTasks[taskId].EvoGraphicsTaskEvoStop) + { + gTasks[taskId].func = PreEvoVisible_PostEvoInvisible_KillTask; + } + else + { + r6 = 0; + if (!gTasks[taskId].tDirection) + { + if (gTasks[taskId].tPreEvoScale < 0x100 - gTasks[taskId].tSpeed) + { + gTasks[taskId].tPreEvoScale += gTasks[taskId].tSpeed; + } + else + { + gTasks[taskId].tPreEvoScale = 0x100; + r6 = 1; + } + if (gTasks[taskId].tPostEvoScale > 0x10 + gTasks[taskId].tSpeed) + { + gTasks[taskId].tPostEvoScale -= gTasks[taskId].tSpeed; + } + else + { + gTasks[taskId].tPostEvoScale = 0x10; + r6++; + } + } + else + { + if (gTasks[taskId].tPostEvoScale < 0x100 - gTasks[taskId].tSpeed) + { + gTasks[taskId].tPostEvoScale += gTasks[taskId].tSpeed; + } + else + { + gTasks[taskId].tPostEvoScale = 0x100; + r6 = 1; + } + if (gTasks[taskId].tPreEvoScale > 0x10 + gTasks[taskId].tSpeed) + { + gTasks[taskId].tPreEvoScale -= gTasks[taskId].tSpeed; + } + else + { + gTasks[taskId].tPreEvoScale = 0x10; + r6++; + } + } + SetOamMatrix(30, 0x10000 / gTasks[taskId].tPreEvoScale, 0, 0, 0x10000 / gTasks[taskId].tPreEvoScale); + SetOamMatrix(31, 0x10000 / gTasks[taskId].tPostEvoScale, 0, 0, 0x10000 / gTasks[taskId].tPostEvoScale); + if (r6 == 2) + { + gTasks[taskId].func = EvoTask_ChooseNextEvoSpriteAnim; + } + } +} + +static void PreEvoInvisible_PostEvoVisible_KillTask(u8 taskId) +{ + gSprites[gTasks[taskId].tPreEvoSpriteId].oam.affineMode = ST_OAM_AFFINE_OFF; + gSprites[gTasks[taskId].tPreEvoSpriteId].oam.matrixNum = 0; + gSprites[gTasks[taskId].tPreEvoSpriteId].invisible = TRUE; + gSprites[gTasks[taskId].tPostEvoSpriteId].oam.affineMode = ST_OAM_AFFINE_OFF; + gSprites[gTasks[taskId].tPostEvoSpriteId].oam.matrixNum = 0; + gSprites[gTasks[taskId].tPostEvoSpriteId].invisible = FALSE; + DestroyTask(taskId); +} + +static void PreEvoVisible_PostEvoInvisible_KillTask(u8 taskId) +{ + gSprites[gTasks[taskId].tPreEvoSpriteId].oam.affineMode = ST_OAM_AFFINE_OFF; + gSprites[gTasks[taskId].tPreEvoSpriteId].oam.matrixNum = 0; + gSprites[gTasks[taskId].tPreEvoSpriteId].invisible = FALSE; + gSprites[gTasks[taskId].tPostEvoSpriteId].oam.affineMode = ST_OAM_AFFINE_OFF; + gSprites[gTasks[taskId].tPostEvoSpriteId].oam.matrixNum = 0; + gSprites[gTasks[taskId].tPostEvoSpriteId].invisible = TRUE; + DestroyTask(taskId); +} + +#undef tPreEvoSpriteId +#undef tPostEvoSpriteId +#undef tPreEvoScale +#undef tPostEvoScale +#undef tDirection +#undef tSpeed diff --git a/src/evolution_scene.c b/src/evolution_scene.c new file mode 100644 index 000000000..f3b05b32c --- /dev/null +++ b/src/evolution_scene.c @@ -0,0 +1,1569 @@ +#include "global.h" +#include "malloc.h" +#include "battle.h" +#include "battle_message.h" +#include "bg.h" +#include "data.h" +#include "decompress.h" +#include "help_system.h" +#include "evolution_scene.h" +#include "evolution_graphics.h" +#include "gpu_regs.h" +#include "link.h" +#include "link_rfu.h" +#include "m4a.h" +#include "event_data.h" +#include "trade_scene.h" +#include "main.h" +#include "new_menu_helpers.h" +#include "menu.h" +#include "overworld.h" +#include "palette.h" +#include "pokedex.h" +#include "pokemon.h" +#include "pokemon_summary_screen.h" +#include "scanline_effect.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "text.h" +#include "text_window.h" +#include "trig.h" +#include "trade.h" +#include "util.h" +#include "battle_string_ids.h" +#include "constants/species.h" +#include "constants/songs.h" +#include "constants/pokemon.h" + +struct EvoInfo +{ + u8 preEvoSpriteId; + u8 postEvoSpriteId; + u8 evoTaskId; + u8 field_3; + u16 savedPalette[48]; +}; + +// EWRAM vars +static EWRAM_DATA struct EvoInfo *sEvoStructPtr = NULL; +static EWRAM_DATA u16 *sEvoMovingBgPtr = NULL; + +// IWRAM common +void (*gCB2_AfterEvolution)(void); + +#define sEvoCursorPos gBattleCommunication[1] // when learning a new move +#define sEvoGraphicsTaskId gBattleCommunication[2] + +// this file's functions +static void Task_EvolutionScene(u8 taskId); +static void Task_TradeEvolutionScene(u8 taskId); +static void CB2_EvolutionSceneUpdate(void); +static void CB2_TradeEvolutionSceneUpdate(void); +static void EvoDummyFunc(void); +static void VBlankCB_EvolutionScene(void); +static void VBlankCB_TradeEvolutionScene(void); +static void DestroyMovingBackgroundTasks(void); +static void InitMovingBackgroundTask(bool8 isLink); +static void Task_MovingBackgroundPos(u8 taskId); +static void ResetBgRegsAfterMovingBackgroundCancel(void); + +// const data +static const u16 sUnrefPal_83F6C90[] = INCBIN_U16("graphics/evolution_scene/unknown_5B4114.gbapal"); +static const u32 sMovingBackgroundTiles[] = INCBIN_U32("graphics/evolution_scene/bg.4bpp.lz"); +static const u32 sMovingBackgroundMap1[] = INCBIN_U32("graphics/evolution_scene/bg.bin.lz"); +static const u32 sMovingBackgroundMap2[] = INCBIN_U32("graphics/evolution_scene/bg2.bin.lz"); +static const u16 sBlackPalette[] = INCBIN_U16("graphics/evolution_scene/gray_transition_intro.gbapal"); +static const u16 unref_83F7D80[] = INCBIN_U16("graphics/evolution_scene/unref_83F7D80.bin"); +static const u16 sMovingBgPals[] = INCBIN_U16("graphics/evolution_scene/transition.gbapal"); + +static const u8 sText_ShedinjaJapaneseName[] = _("ヌケニン"); + +static const u8 unref_83F8445[] = _("{COLOR RED}{HIGHLIGHT DARK_GREY}{SHADOW GREEN}"); + +static const u8 unref_83F844F[][10] = { + _("▶\n "), + _(" \n▶"), + _(" \n ") +}; + +// start frame, stop frame, loop count, delay +static const u8 sMovingBackgroundTimers[][4] = +{ + { 0, 12, 1, 6 }, + { 13, 36, 5, 2 }, + { 13, 24, 1, 2 }, + { 37, 49, 1, 6 }, +}; + +static const u8 sMovingBgPalIndices[][16] = { + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 0 }, + { 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0 }, + { 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0 }, + { 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 11, 0, 0 }, + { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 0 }, + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0 }, + { 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 12, 0, 0 }, + { 0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 12, 11, 0, 0 }, + { 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 12, 11, 10, 0, 0 }, + { 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 12, 11, 10, 9, 0, 0 }, + { 0, 6, 7, 8, 9, 10, 11, 12, 13, 12, 11, 10, 9, 8, 0, 0 }, + { 0, 7, 8, 9, 10, 11, 12, 13, 12, 11, 10, 9, 8, 7, 0, 0 }, + { 0, 8, 9, 10, 11, 12, 13, 12, 11, 10, 9, 8, 7, 6, 0, 0 }, + { 0, 9, 10, 11, 12, 13, 12, 11, 10, 9, 8, 7, 6, 5, 0, 0 }, + { 0, 10, 11, 12, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 0, 0 }, + { 0, 11, 12, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 0, 0 }, + { 0, 12, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 0, 0 }, + { 0, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0 }, + { 0, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, 0, 0 }, + { 0, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, 3, 0, 0 }, + { 0, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, 3, 4, 0, 0 }, + { 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, 3, 4, 5, 0, 0 }, + { 0, 8, 7, 6, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6, 0, 0 }, + { 0, 7, 6, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7, 0, 0 }, + { 0, 6, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7, 8, 0, 0 }, + { 0, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0 }, + { 0, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0 }, + { 0, 3, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 0 }, + { 0, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 0 }, + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0 }, + { 0, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0 }, + { 0, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0 }, + { 0, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0 }, + { 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0 }, + { 0, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } +}; + +static void CB2_BeginEvolutionScene(void) +{ + UpdatePaletteFade(); + RunTasks(); +} + +#define tState data[0] +#define tPreEvoSpecies data[1] +#define tPostEvoSpecies data[2] +#define tCanStop data[3] +#define tBits data[3] +#define tLearnsFirstMove data[4] +#define tLearnMoveState data[6] +#define tData7 data[7] +#define tData8 data[8] +#define tEvoWasStopped data[9] +#define tPartyId data[10] + +#define TASK_BIT_CAN_STOP 0x1 +#define TASK_BIT_LEARN_MOVE 0x80 + +static void Task_BeginEvolutionScene(u8 taskId) +{ + struct Pokemon* mon = NULL; + switch (gTasks[taskId].tState) + { + case 0: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + gTasks[taskId].tState++; + break; + case 1: + if (!gPaletteFade.active) + { + u16 speciesToEvolve; + bool8 canStopEvo; + u8 partyId; + + mon = &gPlayerParty[gTasks[taskId].tPartyId]; + speciesToEvolve = gTasks[taskId].tPostEvoSpecies; + canStopEvo = gTasks[taskId].tCanStop; + partyId = gTasks[taskId].tPartyId; + + DestroyTask(taskId); + EvolutionScene(mon, speciesToEvolve, canStopEvo, partyId); + } + break; + } +} + +void BeginEvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, bool8 canStopEvo, u8 partyId) +{ + u8 taskId = CreateTask(Task_BeginEvolutionScene, 0); + gTasks[taskId].tState = 0; + gTasks[taskId].tPostEvoSpecies = speciesToEvolve; + gTasks[taskId].tCanStop = canStopEvo; + gTasks[taskId].tPartyId = partyId; + SetMainCallback2(CB2_BeginEvolutionScene); +} + +void EvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, bool8 canStopEvo, u8 partyId) +{ + u8 name[20]; + u16 currSpecies; + u32 trainerId, personality; + const struct CompressedSpritePalette* pokePal; + u8 id; + + SetHBlankCallback(NULL); + SetVBlankCallback(NULL); + CpuFill32(0, (void*)(VRAM), VRAM_SIZE); + + SetGpuReg(REG_OFFSET_MOSAIC, 0); + SetGpuReg(REG_OFFSET_WIN0H, 0); + SetGpuReg(REG_OFFSET_WIN0V, 0); + SetGpuReg(REG_OFFSET_WIN1H, 0); + SetGpuReg(REG_OFFSET_WIN1V, 0); + SetGpuReg(REG_OFFSET_WININ, 0); + SetGpuReg(REG_OFFSET_WINOUT, 0); + + ResetPaletteFade(); + + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + gBattle_BG2_X = 0; + gBattle_BG2_Y = 0; + gBattle_BG3_X = 256; + gBattle_BG3_Y = 0; + + gBattleTerrain = BATTLE_TERRAIN_PLAIN; + + InitBattleBgsVideo(); + LoadBattleTextboxAndBackground(); + ResetSpriteData(); + ScanlineEffect_Stop(); + ResetTasks(); + FreeAllSpritePalettes(); + + gReservedSpritePaletteCount = 4; + + sEvoStructPtr = AllocZeroed(sizeof(struct EvoInfo)); + AllocateMonSpritesGfx(); + + GetMonData(mon, MON_DATA_NICKNAME, name); + StringCopy10(gStringVar1, name); + StringCopy(gStringVar2, gSpeciesNames[speciesToEvolve]); + + // preEvo sprite + currSpecies = GetMonData(mon, MON_DATA_SPECIES); + trainerId = GetMonData(mon, MON_DATA_OT_ID); + personality = GetMonData(mon, MON_DATA_PERSONALITY); + DecompressPicFromTable(&gMonFrontPicTable[currSpecies], + gMonSpritesGfxPtr->sprites[1], + currSpecies); + pokePal = GetMonSpritePalStructFromOtIdPersonality(currSpecies, trainerId, personality); + LoadCompressedPalette(pokePal->data, 0x110, 0x20); + + SetMultiuseSpriteTemplateToPokemon(currSpecies, 1); + gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable; + sEvoStructPtr->preEvoSpriteId = id = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30); + + gSprites[id].callback = SpriteCallbackDummy2; + gSprites[id].oam.paletteNum = 1; + gSprites[id].invisible = TRUE; + + // postEvo sprite + DecompressPicFromTable(&gMonFrontPicTable[speciesToEvolve], + gMonSpritesGfxPtr->sprites[3], + speciesToEvolve); + pokePal = GetMonSpritePalStructFromOtIdPersonality(speciesToEvolve, trainerId, personality); + LoadCompressedPalette(pokePal->data, 0x120, 0x20); + + SetMultiuseSpriteTemplateToPokemon(speciesToEvolve, 3); + gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable; + sEvoStructPtr->postEvoSpriteId = id = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30); + gSprites[id].callback = SpriteCallbackDummy2; + gSprites[id].oam.paletteNum = 2; + gSprites[id].invisible = TRUE; + + LoadEvoSparkleSpriteAndPal(); + + sEvoStructPtr->evoTaskId = id = CreateTask(Task_EvolutionScene, 0); + gTasks[id].tState = 0; + gTasks[id].tPreEvoSpecies = currSpecies; + gTasks[id].tPostEvoSpecies = speciesToEvolve; + gTasks[id].tCanStop = canStopEvo; + gTasks[id].tLearnsFirstMove = TRUE; + gTasks[id].tEvoWasStopped = FALSE; + gTasks[id].tPartyId = partyId; + + memcpy(&sEvoStructPtr->savedPalette, &gPlttBufferUnfaded[0x20], 0x60); + + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_1D_MAP); + + SetHBlankCallback(EvoDummyFunc); + SetVBlankCallback(VBlankCB_EvolutionScene); + m4aMPlayAllStop(); + HelpSystem_Disable(); + SetMainCallback2(CB2_EvolutionSceneUpdate); +} + +static void CB2_EvolutionSceneLoadGraphics(void) +{ + u8 id; + const struct CompressedSpritePalette* pokePal; + u16 postEvoSpecies; + u32 trainerId, personality; + struct Pokemon* Mon = &gPlayerParty[gTasks[sEvoStructPtr->evoTaskId].tPartyId]; + + postEvoSpecies = gTasks[sEvoStructPtr->evoTaskId].tPostEvoSpecies; + trainerId = GetMonData(Mon, MON_DATA_OT_ID); + personality = GetMonData(Mon, MON_DATA_PERSONALITY); + + SetHBlankCallback(NULL); + SetVBlankCallback(NULL); + CpuFill32(0, (void*)(VRAM), VRAM_SIZE); + + SetGpuReg(REG_OFFSET_MOSAIC, 0); + SetGpuReg(REG_OFFSET_WIN0H, 0); + SetGpuReg(REG_OFFSET_WIN0V, 0); + SetGpuReg(REG_OFFSET_WIN1H, 0); + SetGpuReg(REG_OFFSET_WIN1V, 0); + SetGpuReg(REG_OFFSET_WININ, 0); + SetGpuReg(REG_OFFSET_WINOUT, 0); + + ResetPaletteFade(); + + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + gBattle_BG2_X = 0; + gBattle_BG2_Y = 0; + gBattle_BG3_X = 256; + gBattle_BG3_Y = 0; + + gBattleTerrain = BATTLE_TERRAIN_PLAIN; + + InitBattleBgsVideo(); + LoadBattleTextboxAndBackground(); + ResetSpriteData(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 4; + + DecompressPicFromTable(&gMonFrontPicTable[postEvoSpecies], + gMonSpritesGfxPtr->sprites[3], + postEvoSpecies); + pokePal = GetMonSpritePalStructFromOtIdPersonality(postEvoSpecies, trainerId, personality); + + LoadCompressedPalette(pokePal->data, 0x120, 0x20); + + SetMultiuseSpriteTemplateToPokemon(postEvoSpecies, 3); + gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable; + sEvoStructPtr->postEvoSpriteId = id = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30); + + gSprites[id].callback = SpriteCallbackDummy2; + gSprites[id].oam.paletteNum = 2; + + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_1D_MAP); + + SetHBlankCallback(EvoDummyFunc); + SetVBlankCallback(VBlankCB_EvolutionScene); + SetMainCallback2(CB2_EvolutionSceneUpdate); + + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + + ShowBg(0); + ShowBg(1); + ShowBg(2); + ShowBg(3); +} + +static void CB2_TradeEvolutionSceneLoadGraphics(void) +{ + struct Pokemon* Mon = &gPlayerParty[gTasks[sEvoStructPtr->evoTaskId].tPartyId]; + u16 postEvoSpecies = gTasks[sEvoStructPtr->evoTaskId].tPostEvoSpecies; + + switch (gMain.state) + { + case 0: + SetGpuReg(REG_OFFSET_DISPCNT, 0); + SetHBlankCallback(NULL); + SetVBlankCallback(NULL); + ResetSpriteData(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 4; + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + gBattle_BG2_X = 0; + gBattle_BG2_Y = 0; + gBattle_BG3_X = 256; + gBattle_BG3_Y = 0; + gMain.state++; + break; + case 1: + ResetPaletteFade(); + SetHBlankCallback(EvoDummyFunc); + SetVBlankCallback(VBlankCB_TradeEvolutionScene); + gMain.state++; + break; + case 2: + LoadTradeAnimGfx(); + gMain.state++; + break; + case 3: + FillBgTilemapBufferRect(1, 0, 0, 0, 0x20, 0x20, 0x11); + CopyBgTilemapBufferToVram(1); + gMain.state++; + break; + case 4: + { + const struct CompressedSpritePalette* pokePal; + u32 trainerId = GetMonData(Mon, MON_DATA_OT_ID); + u32 personality = GetMonData(Mon, MON_DATA_PERSONALITY); + DecompressPicFromTable(&gMonFrontPicTable[postEvoSpecies], + gMonSpritesGfxPtr->sprites[3], + postEvoSpecies); + pokePal = GetMonSpritePalStructFromOtIdPersonality(postEvoSpecies, trainerId, personality); + LoadCompressedPalette(pokePal->data, 0x120, 0x20); + gMain.state++; + } + break; + case 5: + { + u8 id; + + SetMultiuseSpriteTemplateToPokemon(postEvoSpecies, 1); + gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable; + sEvoStructPtr->postEvoSpriteId = id = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30); + + gSprites[id].callback = SpriteCallbackDummy2; + gSprites[id].oam.paletteNum = 2; + gMain.state++; + LinkTradeDrawWindow(); + } + break; + case 6: + if (gWirelessCommType) + { + LoadWirelessStatusIndicatorSpriteGfx(); + CreateWirelessStatusIndicatorSprite(0, 0); + } + BlendPalettes(0xFFFFFFFF, 0x10, RGB_BLACK); + gMain.state++; + break; + case 7: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + InitTradeSequenceBgGpuRegs(); + ShowBg(0); + ShowBg(1); + SetMainCallback2(CB2_TradeEvolutionSceneUpdate); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_1D_MAP); + break; + } +} + +void TradeEvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, u8 preEvoSpriteId, u8 partyId) +{ + u8 name[20]; + u16 currSpecies; + u32 trainerId, personality; + const struct CompressedSpritePalette* pokePal; + u8 id; + + GetMonData(mon, MON_DATA_NICKNAME, name); + StringCopy10(gStringVar1, name); + StringCopy(gStringVar2, gSpeciesNames[speciesToEvolve]); + + gAffineAnimsDisabled = TRUE; + + // preEvo sprite + currSpecies = GetMonData(mon, MON_DATA_SPECIES); + personality = GetMonData(mon, MON_DATA_PERSONALITY); + trainerId = GetMonData(mon, MON_DATA_OT_ID); + + sEvoStructPtr = AllocZeroed(sizeof(struct EvoInfo)); + sEvoStructPtr->preEvoSpriteId = preEvoSpriteId; + + DecompressPicFromTable(&gMonFrontPicTable[speciesToEvolve], + gMonSpritesGfxPtr->sprites[1], + speciesToEvolve); + + pokePal = GetMonSpritePalStructFromOtIdPersonality(speciesToEvolve, trainerId, personality); + LoadCompressedPalette(pokePal->data, 0x120, 0x20); + + SetMultiuseSpriteTemplateToPokemon(speciesToEvolve, 1); + gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable; + sEvoStructPtr->postEvoSpriteId = id = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30); + + gSprites[id].callback = SpriteCallbackDummy2; + gSprites[id].oam.paletteNum = 2; + gSprites[id].invisible = TRUE; + + LoadEvoSparkleSpriteAndPal(); + + sEvoStructPtr->evoTaskId = id = CreateTask(Task_TradeEvolutionScene, 0); + gTasks[id].tState = 0; + gTasks[id].tPreEvoSpecies = currSpecies; + gTasks[id].tPostEvoSpecies = speciesToEvolve; + gTasks[id].tLearnsFirstMove = TRUE; + gTasks[id].tEvoWasStopped = FALSE; + gTasks[id].tPartyId = partyId; + + gBattle_BG0_X = 0; + gBattle_BG0_Y = 0; + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + gBattle_BG2_X = 0; + gBattle_BG2_Y = 0; + gBattle_BG3_X = 256; + gBattle_BG3_Y = 0; + + gTextFlags.useAlternateDownArrow = TRUE; + + SetVBlankCallback(VBlankCB_TradeEvolutionScene); + SetMainCallback2(CB2_TradeEvolutionSceneUpdate); +} + +static void CB2_EvolutionSceneUpdate(void) +{ + AnimateSprites(); + BuildOamBuffer(); + RunTextPrinters(); + UpdatePaletteFade(); + RunTasks(); +} + +static void CB2_TradeEvolutionSceneUpdate(void) +{ + AnimateSprites(); + BuildOamBuffer(); + RunTextPrinters(); + UpdatePaletteFade(); + RunTasks(); +} + +static void CreateShedinja(u16 preEvoSpecies, struct Pokemon* mon) +{ + u32 data = 0; + if (gEvolutionTable[preEvoSpecies][0].method == EVO_LEVEL_NINJASK && gPlayerPartyCount < 6) + { + s32 i; + struct Pokemon* shedinja = &gPlayerParty[gPlayerPartyCount]; + const struct Evolution *evos; + const struct Evolution *evos2; + + CopyMon(&gPlayerParty[gPlayerPartyCount], mon, sizeof(struct Pokemon)); + SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_SPECIES, (&gEvolutionTable[preEvoSpecies][1].targetSpecies)); + SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_NICKNAME, (gSpeciesNames[gEvolutionTable[preEvoSpecies][1].targetSpecies])); + SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_HELD_ITEM, (&data)); + SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_MARKINGS, (&data)); + SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_ENCRYPT_SEPARATOR, (&data)); + + for (i = MON_DATA_COOL_RIBBON; i < MON_DATA_COOL_RIBBON + 5; i++) + SetMonData(&gPlayerParty[gPlayerPartyCount], i, (&data)); + for (i = MON_DATA_CHAMPION_RIBBON; i <= MON_DATA_FATEFUL_ENCOUNTER; i++) + SetMonData(&gPlayerParty[gPlayerPartyCount], i, (&data)); + + SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_STATUS, (&data)); + data = 0xFF; + SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_MAIL, (&data)); + + CalculateMonStats(&gPlayerParty[gPlayerPartyCount]); + CalculatePlayerPartyCount(); + + // can't match it otherwise, ehh + evos2 = gEvolutionTable[0]; + evos = evos2 + EVOS_PER_MON * preEvoSpecies; + + GetSetPokedexFlag(SpeciesToNationalPokedexNum(evos[1].targetSpecies), FLAG_SET_SEEN); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(evos[1].targetSpecies), FLAG_SET_CAUGHT); + + if (GetMonData(shedinja, MON_DATA_SPECIES) == SPECIES_SHEDINJA + && GetMonData(shedinja, MON_DATA_LANGUAGE) == LANGUAGE_JAPANESE + && GetMonData(mon, MON_DATA_SPECIES) == SPECIES_NINJASK) + SetMonData(shedinja, MON_DATA_NICKNAME, sText_ShedinjaJapaneseName); + } +} + +static void Task_EvolutionScene(u8 taskId) +{ + u32 var; + struct Pokemon* mon = &gPlayerParty[gTasks[taskId].tPartyId]; + + // Automatically cancel if the Pokemon would evolve into a species you have not + // yet unlocked, such as Crobat. + if (!IsNationalPokedexEnabled() + && gTasks[taskId].tState == 8 + && gTasks[taskId].tPostEvoSpecies > SPECIES_MEW) + { + gTasks[taskId].tState = 17; + gTasks[taskId].tEvoWasStopped = TRUE; + gTasks[sEvoGraphicsTaskId].EvoGraphicsTaskEvoStop = TRUE; + DestroyMovingBackgroundTasks(); + return; + } + + // check if B Button was held, so the evolution gets stopped + if (gMain.heldKeys == B_BUTTON + && gTasks[taskId].tState == 8 + && gTasks[sEvoGraphicsTaskId].isActive + && gTasks[taskId].tBits & TASK_BIT_CAN_STOP) + { + gTasks[taskId].tState = 17; + gTasks[sEvoGraphicsTaskId].EvoGraphicsTaskEvoStop = TRUE; + DestroyMovingBackgroundTasks(); + return; + } + + switch (gTasks[taskId].tState) + { + case 0: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + gSprites[sEvoStructPtr->preEvoSpriteId].invisible = FALSE; + gTasks[taskId].tState++; + ShowBg(0); + ShowBg(1); + ShowBg(2); + ShowBg(3); + break; + case 1: // print 'whoa, poke is evolving!!!' msg + if (!gPaletteFade.active) + { + StringExpandPlaceholders(gStringVar4, gText_PkmnIsEvolving); + BattlePutTextOnWindow(gStringVar4, 0); + gTasks[taskId].tState++; + } + break; + case 2: // wait for string, animate mon(and play its cry) + if (!IsTextPrinterActive(0)) + { + PlayCry1(gTasks[taskId].tPreEvoSpecies, 0); + gTasks[taskId].tState++; + } + break; + case 3: + if (IsCryFinished()) // wait for animation, play tu du SE + { + PlaySE(MUS_ME_SHINKA); + gTasks[taskId].tState++; + } + break; + case 4: // play evolution music and fade screen black + if (!IsSEPlaying()) + { + PlayNewMapMusic(MUS_SHINKA); + gTasks[taskId].tState++; + BeginNormalPaletteFade(0x1C, 4, 0, 0x10, RGB_BLACK); + } + break; + case 5: // launch moving bg task, preapre evo sparkles + if (!gPaletteFade.active) + { + InitMovingBackgroundTask(FALSE); + sEvoGraphicsTaskId = LaunchTask_PreEvoSparklesSet1(17); + gTasks[taskId].tState++; + } + break; + case 6: // another set of evo sparkles + if (!gTasks[sEvoGraphicsTaskId].isActive) + { + gTasks[taskId].tState++; + sEvoStructPtr->field_3 = 1; + sEvoGraphicsTaskId = LaunchTask_PreEvoSparklesSet2(); + } + break; + case 7: // launch task that flashes pre evo with post evo sprites + if (!gTasks[sEvoGraphicsTaskId].isActive) + { + sEvoGraphicsTaskId = LaunchTask_PrePostEvoMonSprites(sEvoStructPtr->preEvoSpriteId, sEvoStructPtr->postEvoSpriteId); + gTasks[taskId].tState++; + } + break; + case 8: // wait for the above task to finish + if (--sEvoStructPtr->field_3 == 0) + { + sEvoStructPtr->field_3 = 3; + if (!gTasks[sEvoGraphicsTaskId].isActive) + gTasks[taskId].tState++; + } + break; + case 9: // post evo sparkles + sEvoGraphicsTaskId = LaunchTask_PostEvoSparklesSet1(); + gTasks[taskId].tState++; + break; + case 10: + if (!gTasks[sEvoGraphicsTaskId].isActive) + { + sEvoGraphicsTaskId = LaunchTask_PostEvoSparklesSet2AndFlash(gTasks[taskId].tPostEvoSpecies); + gTasks[taskId].tState++; + } + break; + case 11: // play tu du sound after evolution + if (!gTasks[sEvoGraphicsTaskId].isActive) + { + PlaySE(SE_EXP); + gTasks[taskId].tState++; + } + break; + case 12: // stop music, return screen to pre-fade state + if (IsSEPlaying()) + { + m4aMPlayAllStop(); + memcpy(&gPlttBufferUnfaded[0x20], sEvoStructPtr->savedPalette, 0x60); + ResetBgRegsAfterMovingBackgroundCancel(); + BeginNormalPaletteFade(0x1C, 0, 0x10, 0, RGB_BLACK); + gTasks[taskId].tState++; + } + break; + case 13: // animate mon + if (!gPaletteFade.active) + { + PlayCry1(gTasks[taskId].tPostEvoSpecies, 0); + gTasks[taskId].tState++; + } + break; + case 14: // congratulations string and rename prompt + if (IsCryFinished()) + { + StringExpandPlaceholders(gStringVar4, gText_CongratsPkmnEvolved); + BattlePutTextOnWindow(gStringVar4, 0); + PlayBGM(MUS_FANFA5); + gTasks[taskId].tState++; + SetMonData(mon, MON_DATA_SPECIES, (void*)(&gTasks[taskId].tPostEvoSpecies)); + CalculateMonStats(mon); + EvolutionRenameMon(mon, gTasks[taskId].tPreEvoSpecies, gTasks[taskId].tPostEvoSpecies); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskId].tPostEvoSpecies), FLAG_SET_SEEN); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskId].tPostEvoSpecies), FLAG_SET_CAUGHT); + IncrementGameStat(GAME_STAT_EVOLVED_POKEMON); + } + break; + case 15: // check if it wants to learn a new move + if (!IsTextPrinterActive(0)) + { + HelpSystem_Enable(); + var = MonTryLearningNewMove(mon, gTasks[taskId].tLearnsFirstMove); + if (var != 0 && !gTasks[taskId].tEvoWasStopped) + { + u8 text[20]; + + StopMapMusic(); + Overworld_PlaySpecialMapMusic(); + gTasks[taskId].tBits |= TASK_BIT_LEARN_MOVE; + gTasks[taskId].tLearnsFirstMove = FALSE; + gTasks[taskId].tLearnMoveState = 0; + GetMonData(mon, MON_DATA_NICKNAME, text); + StringCopy10(gBattleTextBuff1, text); + + if (var == MON_HAS_MAX_MOVES) + gTasks[taskId].tState = 22; + else if (var == MON_ALREADY_KNOWS_MOVE) + break; + else + gTasks[taskId].tState = 20; // move has been learned + } + else // no move to learn + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + gTasks[taskId].tState++; + } + } + break; + case 16: // task has finished, return + if (!gPaletteFade.active) + { + if (!(gTasks[taskId].tBits & TASK_BIT_LEARN_MOVE)) + { + StopMapMusic(); + Overworld_PlaySpecialMapMusic(); + } + if (!gTasks[taskId].tEvoWasStopped) + CreateShedinja(gTasks[taskId].tPreEvoSpecies, mon); + + DestroyTask(taskId); + FreeMonSpritesGfx(); + Free(sEvoStructPtr); + sEvoStructPtr = NULL; + FreeAllWindowBuffers(); + SetMainCallback2(gCB2_AfterEvolution); + } + break; + case 17: // evolution has been canceled, stop music and re-fade palette + if (!gTasks[sEvoGraphicsTaskId].isActive) + { + m4aMPlayAllStop(); + BeginNormalPaletteFade(0x6001C, 0, 0x10, 0, RGB_WHITE); + gTasks[taskId].tState++; + } + break; + case 18: // animate pokemon trying to evolve again, evolution has been stopped + if (!gPaletteFade.active) + { + PlayCry1(gTasks[taskId].tPreEvoSpecies, 0); + gTasks[taskId].tState++; + } + break; + case 19: // after the animation, print the string 'WHOA IT DId NOT EVOLVE!!!' + if (IsCryFinished()) + { + if (gTasks[taskId].tEvoWasStopped) + StringExpandPlaceholders(gStringVar4, gText_EllipsisQuestionMark); + else + StringExpandPlaceholders(gStringVar4, gText_PkmnStoppedEvolving); + + BattlePutTextOnWindow(gStringVar4, 0); + gTasks[taskId].tEvoWasStopped = TRUE; + gTasks[taskId].tState = 15; + } + break; + case 20: // pokemon learned a new move, print string and play a fanfare + if (!IsTextPrinterActive(0) && !IsSEPlaying()) + { + BufferMoveToLearnIntoBattleTextBuff2(); + PlayFanfare(MUS_FANFA1); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNLEARNEDMOVE - BATTLESTRINGS_ID_ADDER]); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); + gTasks[taskId].tLearnsFirstMove = 0x40; // re-used as a counter + gTasks[taskId].tState++; + } + break; + case 21: // wait a bit and check if can learn another move + if (!IsTextPrinterActive(0) && !IsSEPlaying() && --gTasks[taskId].tLearnsFirstMove == 0) + gTasks[taskId].tState = 15; + break; + case 22: // try to learn a new move + switch (gTasks[taskId].tLearnMoveState) + { + case 0: + if (!IsTextPrinterActive(0) && !IsSEPlaying()) + { + BufferMoveToLearnIntoBattleTextBuff2(); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE1 - BATTLESTRINGS_ID_ADDER]); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); + gTasks[taskId].tLearnMoveState++; + } + break; + case 1: + if (!IsTextPrinterActive(0) && !IsSEPlaying()) + { + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE2 - BATTLESTRINGS_ID_ADDER]); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); + gTasks[taskId].tLearnMoveState++; + } + break; + case 2: + if (!IsTextPrinterActive(0) && !IsSEPlaying()) + { + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE3 - BATTLESTRINGS_ID_ADDER]); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); + gTasks[taskId].tData7 = 5; + gTasks[taskId].tData8 = 10; + gTasks[taskId].tLearnMoveState++; + } + case 3: + if (!IsTextPrinterActive(0) && !IsSEPlaying()) + { + HandleBattleWindow(0x17, 8, 0x1D, 0xD, 0); + BattlePutTextOnWindow(gText_BattleYesNoChoice, 0xE); + gTasks[taskId].tLearnMoveState++; + sEvoCursorPos = 0; + BattleCreateYesNoCursorAt(); + } + break; + case 4: + if (JOY_NEW(DPAD_UP) && sEvoCursorPos != 0) + { + PlaySE(SE_SELECT); + BattleDestroyYesNoCursorAt(); + sEvoCursorPos = 0; + BattleCreateYesNoCursorAt(); + } + if (JOY_NEW(DPAD_DOWN) && sEvoCursorPos == 0) + { + PlaySE(SE_SELECT); + BattleDestroyYesNoCursorAt(); + sEvoCursorPos = 1; + BattleCreateYesNoCursorAt(); + } + if (JOY_NEW(A_BUTTON)) + { + HandleBattleWindow(0x17, 8, 0x1D, 0xD, WINDOW_CLEAR); + PlaySE(SE_SELECT); + + if (sEvoCursorPos != 0) + { + gTasks[taskId].tLearnMoveState = gTasks[taskId].tData8; + } + else + { + gTasks[taskId].tLearnMoveState = gTasks[taskId].tData7; + if (gTasks[taskId].tLearnMoveState == 5) + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + } + } + if (JOY_NEW(B_BUTTON)) + { + HandleBattleWindow(0x17, 8, 0x1D, 0xD, WINDOW_CLEAR); + PlaySE(SE_SELECT); + gTasks[taskId].tLearnMoveState = gTasks[taskId].tData8; + } + break; + case 5: + if (!gPaletteFade.active) + { + FreeAllWindowBuffers(); + ShowSelectMovePokemonSummaryScreen(gPlayerParty, gTasks[taskId].tPartyId, + gPlayerPartyCount - 1, CB2_EvolutionSceneLoadGraphics, + gMoveToLearn); + gTasks[taskId].tLearnMoveState++; + } + break; + case 6: + if (!gPaletteFade.active && gMain.callback2 == CB2_EvolutionSceneUpdate) + { + var = GetMoveSlotToReplace(); + if (var == MAX_MON_MOVES) + { + gTasks[taskId].tLearnMoveState = 10; + } + else + { + u16 move = GetMonData(mon, var + MON_DATA_MOVE1); + if (IsHMMove2(move)) + { + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_HMMOVESCANTBEFORGOTTEN - BATTLESTRINGS_ID_ADDER]); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); + gTasks[taskId].tLearnMoveState = 12; + } + else + { + PREPARE_MOVE_BUFFER(gBattleTextBuff2, move) + + RemoveMonPPBonus(mon, var); + SetMonMoveSlot(mon, gMoveToLearn, var); + gTasks[taskId].tLearnMoveState++; + } + } + } + break; + case 7: + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_123POOF - BATTLESTRINGS_ID_ADDER]); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); + gTasks[taskId].tLearnMoveState++; + break; + case 8: + if (!IsTextPrinterActive(0) && !IsSEPlaying()) + { + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNFORGOTMOVE - BATTLESTRINGS_ID_ADDER]); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); + gTasks[taskId].tLearnMoveState++; + } + break; + case 9: + if (!IsTextPrinterActive(0) && !IsSEPlaying()) + { + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_ANDELLIPSIS - BATTLESTRINGS_ID_ADDER]); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); + gTasks[taskId].tState = 20; + } + break; + case 10: + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_STOPLEARNINGMOVE - BATTLESTRINGS_ID_ADDER]); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); + gTasks[taskId].tData7 = 11; + gTasks[taskId].tData8 = 0; + gTasks[taskId].tLearnMoveState = 3; + break; + case 11: + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_DIDNOTLEARNMOVE - BATTLESTRINGS_ID_ADDER]); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); + gTasks[taskId].tState = 15; + break; + case 12: + if (!IsTextPrinterActive(0) && !IsSEPlaying()) + gTasks[taskId].tLearnMoveState = 5; + break; + } + break; + } +} + +static void Task_TradeEvolutionScene(u8 taskId) +{ + u32 var = 0; + struct Pokemon* mon = &gPlayerParty[gTasks[taskId].tPartyId]; + + // Automatically cancel if the Pokemon would evolve into a species you have not + // yet unlocked, such as Crobat. + if (!IsNationalPokedexEnabled() + && gTasks[taskId].tState == 7 + && gTasks[taskId].tPostEvoSpecies > SPECIES_MEW) + { + gTasks[taskId].tState = 15; + gTasks[taskId].tEvoWasStopped = TRUE; + if (gTasks[sEvoGraphicsTaskId].isActive) + { + gTasks[sEvoGraphicsTaskId].EvoGraphicsTaskEvoStop = TRUE; + DestroyMovingBackgroundTasks(); + } + } + + switch (gTasks[taskId].tState) + { + case 0: + StringExpandPlaceholders(gStringVar4, gText_PkmnIsEvolving); + DrawTextOnTradeWindow(0, gStringVar4, 1); + gTasks[taskId].tState++; + break; + case 1: + if (!IsTextPrinterActive(0)) + { + PlayCry1(gTasks[taskId].tPreEvoSpecies, 0); + gTasks[taskId].tState++; + } + break; + case 2: + if (IsCryFinished()) + { + m4aSongNumStop(MUS_SHINKA); + PlaySE(MUS_ME_SHINKA); + gTasks[taskId].tState++; + } + break; + case 3: + if (!IsSEPlaying()) + { + PlayBGM(MUS_SHINKA); + gTasks[taskId].tState++; + BeginNormalPaletteFade(0x1C, 4, 0, 0x10, RGB_BLACK); + } + break; + case 4: + if (!gPaletteFade.active) + { + InitMovingBackgroundTask(TRUE); + var = gSprites[sEvoStructPtr->preEvoSpriteId].oam.paletteNum + 16; + sEvoGraphicsTaskId = LaunchTask_PreEvoSparklesSet1(var); + gTasks[taskId].tState++; + SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(6)); + } + break; + case 5: + if (!gTasks[sEvoGraphicsTaskId].isActive) + { + gTasks[taskId].tState++; + sEvoStructPtr->field_3 = 1; + sEvoGraphicsTaskId = LaunchTask_PreEvoSparklesSet2(); + } + break; + case 6: + if (!gTasks[sEvoGraphicsTaskId].isActive) + { + sEvoGraphicsTaskId = LaunchTask_PrePostEvoMonSprites(sEvoStructPtr->preEvoSpriteId, sEvoStructPtr->postEvoSpriteId); + gTasks[taskId].tState++; + } + break; + case 7: + if (--sEvoStructPtr->field_3 == 0) + { + sEvoStructPtr->field_3 = 3; + if (!gTasks[sEvoGraphicsTaskId].isActive) + gTasks[taskId].tState++; + } + break; + case 8: + sEvoGraphicsTaskId = LaunchTask_PostEvoSparklesSet1(); + gTasks[taskId].tState++; + break; + case 9: + if (!gTasks[sEvoGraphicsTaskId].isActive) + { + sEvoGraphicsTaskId = LaunchTask_PostEvoSparklesSet2AndFlash_Trade(gTasks[taskId].tPostEvoSpecies); + gTasks[taskId].tState++; + } + break; + case 10: + if (!gTasks[sEvoGraphicsTaskId].isActive) + { + PlaySE(SE_EXP); + gTasks[taskId].tState++; + } + break; + case 11: + /* + * BUG: This check causes the evolved Pokemon's cry to play over the sfx. + * Negate the below condition. + */ + if (IsSEPlaying()) + { +// Free(sEvoMovingBgPtr); + PlayCry1(gTasks[taskId].tPostEvoSpecies, 0); + memcpy(&gPlttBufferUnfaded[0x20], sEvoStructPtr->savedPalette, 0x60); + gTasks[taskId].tState++; + } + break; + case 12: + if (IsCryFinished()) + { + StringExpandPlaceholders(gStringVar4, gText_CongratsPkmnEvolved); + DrawTextOnTradeWindow(0, gStringVar4, 1); + PlayFanfare(MUS_FANFA5); + gTasks[taskId].tState++; + SetMonData(mon, MON_DATA_SPECIES, (&gTasks[taskId].tPostEvoSpecies)); + CalculateMonStats(mon); + EvolutionRenameMon(mon, gTasks[taskId].tPreEvoSpecies, gTasks[taskId].tPostEvoSpecies); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskId].tPostEvoSpecies), FLAG_SET_SEEN); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskId].tPostEvoSpecies), FLAG_SET_CAUGHT); + IncrementGameStat(GAME_STAT_EVOLVED_POKEMON); + } + break; + case 13: + if (!IsTextPrinterActive(0) && IsFanfareTaskInactive() == TRUE) + { + var = MonTryLearningNewMove(mon, gTasks[taskId].tLearnsFirstMove); + if (var != 0 && !gTasks[taskId].tEvoWasStopped) + { + u8 text[20]; + + gTasks[taskId].tBits |= TASK_BIT_LEARN_MOVE; + gTasks[taskId].tLearnsFirstMove = FALSE; + gTasks[taskId].tLearnMoveState = 0; + GetMonData(mon, MON_DATA_NICKNAME, text); + StringCopy10(gBattleTextBuff1, text); + + if (var == MON_HAS_MAX_MOVES) + gTasks[taskId].tState = 20; + else if (var == MON_ALREADY_KNOWS_MOVE) + break; + else + gTasks[taskId].tState = 18; + } + else + { + PlayBGM(MUS_SHINKA); + DrawTextOnTradeWindow(0, gText_CommunicationStandby5, 1); + gTasks[taskId].tState++; + } + } + break; + case 14: + if (!IsTextPrinterActive(0)) + { + DestroyTask(taskId); + Free(sEvoStructPtr); + sEvoStructPtr = NULL; + gTextFlags.useAlternateDownArrow = FALSE; + SetMainCallback2(gCB2_AfterEvolution); + } + break; + case 15: + if (!gTasks[sEvoGraphicsTaskId].isActive) + { + m4aMPlayAllStop(); + BeginNormalPaletteFade((1 << (gSprites[sEvoStructPtr->preEvoSpriteId].oam.paletteNum + 16)) | (0x4001C), 0, 0x10, 0, RGB_WHITE); + gTasks[taskId].tState++; + } + break; + case 16: + if (!gPaletteFade.active) + { + PlayCry1(gTasks[taskId].tPreEvoSpecies, 0); + gTasks[taskId].tState++; + } + break; + case 17: + if (IsCryFinished()) + { + StringExpandPlaceholders(gStringVar4, gText_EllipsisQuestionMark); + DrawTextOnTradeWindow(0, gStringVar4, 1); + gTasks[taskId].tEvoWasStopped = TRUE; + gTasks[taskId].tState = 13; + } + break; + case 18: + if (!IsTextPrinterActive(0) && !IsSEPlaying()) + { + BufferMoveToLearnIntoBattleTextBuff2(); + PlayFanfare(MUS_FANFA1); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNLEARNEDMOVE - BATTLESTRINGS_ID_ADDER]); + DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); + gTasks[taskId].tLearnsFirstMove = 0x40; // re-used as a counter + gTasks[taskId].tState++; + } + break; + case 19: + if (!IsTextPrinterActive(0) && IsFanfareTaskInactive() == TRUE && --gTasks[taskId].tLearnsFirstMove == 0) + gTasks[taskId].tState = 13; + break; + case 20: + switch (gTasks[taskId].tLearnMoveState) + { + case 0: + if (!IsTextPrinterActive(0) && !IsSEPlaying()) + { + BufferMoveToLearnIntoBattleTextBuff2(); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE1 - BATTLESTRINGS_ID_ADDER]); + DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); + gTasks[taskId].tLearnMoveState++; + } + break; + case 1: + if (!IsTextPrinterActive(0) && !IsSEPlaying()) + { + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE2 - BATTLESTRINGS_ID_ADDER]); + DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); + gTasks[taskId].tLearnMoveState++; + } + break; + case 2: + if (!IsTextPrinterActive(0) && !IsSEPlaying()) + { + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE3 - BATTLESTRINGS_ID_ADDER]); + DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); + gTasks[taskId].tData7 = 5; + gTasks[taskId].tData8 = 9; + gTasks[taskId].tLearnMoveState++; + } + case 3: + if (!IsTextPrinterActive(0) && !IsSEPlaying()) + { + LoadUserWindowBorderGfx(0, 0xA8, 0xE0); + CreateYesNoMenu(&gTradeEvolutionSceneYesNoWindowTemplate, 3, 0, 2, 0xA8, 0xE, 0); + sEvoCursorPos = 0; + gTasks[taskId].tLearnMoveState++; + sEvoCursorPos = 0; + } + break; + case 4: + switch (Menu_ProcessInputNoWrapClearOnChoose()) + { + case 0: + sEvoCursorPos = 0; + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_EMPTYSTRING3 - BATTLESTRINGS_ID_ADDER]); + DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); + gTasks[taskId].tLearnMoveState = gTasks[taskId].tData7; + if (gTasks[taskId].tLearnMoveState == 5) + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + break; + case 1: + case -1: + sEvoCursorPos = 1; + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_EMPTYSTRING3 - BATTLESTRINGS_ID_ADDER]); + DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); + gTasks[taskId].tLearnMoveState = gTasks[taskId].tData8; + break; + } + break; + case 5: + if (!gPaletteFade.active) + { + if (gWirelessCommType) + DestroyWirelessStatusIndicatorSprite(); + + Free(GetBgTilemapBuffer(3)); + Free(GetBgTilemapBuffer(1)); + Free(GetBgTilemapBuffer(0)); + FreeAllWindowBuffers(); + + ShowSelectMovePokemonSummaryScreen(gPlayerParty, gTasks[taskId].tPartyId, + gPlayerPartyCount - 1, CB2_TradeEvolutionSceneLoadGraphics, + gMoveToLearn); + gTasks[taskId].tLearnMoveState++; + } + break; + case 6: + if (!gPaletteFade.active && gMain.callback2 == CB2_TradeEvolutionSceneUpdate) + { + var = GetMoveSlotToReplace(); + if (var == MAX_MON_MOVES) + { + gTasks[taskId].tLearnMoveState = 9; + } + else + { + u16 move = GetMonData(mon, var + MON_DATA_MOVE1); + if (IsHMMove2(move)) + { + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_HMMOVESCANTBEFORGOTTEN - BATTLESTRINGS_ID_ADDER]); + DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); + gTasks[taskId].tLearnMoveState = 11; + } + else + { + PREPARE_MOVE_BUFFER(gBattleTextBuff2, move) + + RemoveMonPPBonus(mon, var); + SetMonMoveSlot(mon, gMoveToLearn, var); + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_123POOF - BATTLESTRINGS_ID_ADDER]); + DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); + gTasks[taskId].tLearnMoveState++; + } + } + } + break; + case 7: + if (!IsTextPrinterActive(0) && !IsSEPlaying()) + { + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNFORGOTMOVE - BATTLESTRINGS_ID_ADDER]); + DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); + gTasks[taskId].tLearnMoveState++; + } + break; + case 8: + if (!IsTextPrinterActive(0) && !IsSEPlaying()) + { + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_ANDELLIPSIS - BATTLESTRINGS_ID_ADDER]); + DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); + gTasks[taskId].tState = 18; + } + break; + case 9: + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_STOPLEARNINGMOVE - BATTLESTRINGS_ID_ADDER]); + DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); + gTasks[taskId].tData7 = 10; + gTasks[taskId].tData8 = 0; + gTasks[taskId].tLearnMoveState = 3; + break; + case 10: + BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_DIDNOTLEARNMOVE - BATTLESTRINGS_ID_ADDER]); + DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); + gTasks[taskId].tState = 13; + break; + case 11: + if (!IsTextPrinterActive(0) && !IsSEPlaying()) + gTasks[taskId].tLearnMoveState = 5; + break; + } + break; + } +} + +#undef tState +#undef tPreEvoSpecies +#undef tPostEvoSpecies +#undef tCanStop +#undef tBits +#undef tLearnsFirstMove +#undef tLearnMoveState +#undef tData7 +#undef tData8 +#undef tEvoWasStopped +#undef tPartyId + +static void EvoDummyFunc(void) +{ +} + +static void VBlankCB_EvolutionScene(void) +{ + SetGpuReg(REG_OFFSET_BG0HOFS, gBattle_BG0_X); + SetGpuReg(REG_OFFSET_BG0VOFS, gBattle_BG0_Y); + SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X); + SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y); + SetGpuReg(REG_OFFSET_BG2HOFS, gBattle_BG2_X); + SetGpuReg(REG_OFFSET_BG2VOFS, gBattle_BG2_Y); + SetGpuReg(REG_OFFSET_BG3HOFS, gBattle_BG3_X); + SetGpuReg(REG_OFFSET_BG3VOFS, gBattle_BG3_Y); + + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + ScanlineEffect_InitHBlankDmaTransfer(); +} + +static void VBlankCB_TradeEvolutionScene(void) +{ + SetGpuReg(REG_OFFSET_BG0HOFS, gBattle_BG0_X); + SetGpuReg(REG_OFFSET_BG0VOFS, gBattle_BG0_Y); + SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X); + SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y); + SetGpuReg(REG_OFFSET_BG2HOFS, gBattle_BG2_X); + SetGpuReg(REG_OFFSET_BG2VOFS, gBattle_BG2_Y); + SetGpuReg(REG_OFFSET_BG3HOFS, gBattle_BG3_X); + SetGpuReg(REG_OFFSET_BG3VOFS, gBattle_BG3_Y); + + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + ScanlineEffect_InitHBlankDmaTransfer(); +} + +static void Task_MovingBackgroundPalettes(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + if (data[6] != 0) + return; + if (data[5]++ < 20) + return; + + if (data[0]++ > sMovingBackgroundTimers[data[2]][3]) + { + if (sMovingBackgroundTimers[data[2]][1] == data[1]) + { + data[3]++; + if (data[3] == sMovingBackgroundTimers[data[2]][2]) + { + data[3] = 0; + data[2]++; + } + data[1] = sMovingBackgroundTimers[data[2]][0]; + } + else + { + LoadPalette(&sEvoMovingBgPtr[data[1] * 16], 0xA0, 0x20); + data[0] = 0; + data[1]++; + } + } + + if (data[2] == 4) + DestroyTask(taskId); +} + +static void LaunchTask_MovingBackgroundPos(bool8 isLink) +{ + u8 taskId = CreateTask(Task_MovingBackgroundPos, 7); + + if (!isLink) + gTasks[taskId].data[2] = 0; + else + gTasks[taskId].data[2] = 1; +} + +static void Task_MovingBackgroundPos(u8 taskId) +{ + u16 *outer_X, *outer_Y; + + u16 *inner_X = &gBattle_BG1_X; + u16 *inner_Y = &gBattle_BG1_Y; + + if (!gTasks[taskId].data[2]) + { + outer_X = &gBattle_BG2_X; + outer_Y = &gBattle_BG2_Y; + } + else + { + outer_X = &gBattle_BG3_X; + outer_Y = &gBattle_BG3_Y; + } + + gTasks[taskId].data[0] = (gTasks[taskId].data[0] + 5) & 0xFF; + gTasks[taskId].data[1] = (gTasks[taskId].data[0] + 0x80) & 0xFF; + + *inner_X = Cos(gTasks[taskId].data[0], 4) + 8; + *inner_Y = Sin(gTasks[taskId].data[0], 4) + 16; + + *outer_X = Cos(gTasks[taskId].data[1], 4) + 8; + *outer_Y = Sin(gTasks[taskId].data[1], 4) + 16; + + if (!FuncIsActiveTask(Task_MovingBackgroundPalettes)) + { + DestroyTask(taskId); + + *inner_X = 0; + *inner_Y = 0; + + *outer_X = 256; + *outer_Y = 0; + } +} + +static void InitMovingBgValues(u16 *movingBgs) +{ + s32 i, j; + + for (i = 0; i < 50; i++) + { + for (j = 0; j < 16; j++) + { + movingBgs[i * 16 + j] = sMovingBgPals[sMovingBgPalIndices[i][j]]; + } + } +} + +static void InitMovingBackgroundTask(bool8 isLink) +{ + u8 innerBgId, outerBgId; + + sEvoMovingBgPtr = AllocZeroed(0x640); + InitMovingBgValues(sEvoMovingBgPtr); + + if (!isLink) + innerBgId = 1, outerBgId = 2; + else + innerBgId = 1, outerBgId = 3; + + LoadPalette(sBlackPalette, 0xA0, 0x20); + + DecompressAndLoadBgGfxUsingHeap(1, sMovingBackgroundTiles, FALSE, 0, 0); + CopyToBgTilemapBuffer(1, sMovingBackgroundMap1, 0, 0); + CopyToBgTilemapBuffer(outerBgId, sMovingBackgroundMap2, 0, 0); + CopyBgTilemapBufferToVram(1); + CopyBgTilemapBufferToVram(outerBgId); + + if (!isLink) + { + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG2); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 8)); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG2_ON | DISPCNT_BG1_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP); + + SetBgAttribute(innerBgId, BG_ATTR_PRIORITY, 2); + SetBgAttribute(outerBgId, BG_ATTR_PRIORITY, 2); + + ShowBg(1); + ShowBg(2); + } + else + { + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG3); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 8)); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG3_ON | DISPCNT_BG1_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP); + } + + CreateTask(Task_MovingBackgroundPalettes, 5); + LaunchTask_MovingBackgroundPos(isLink); +} + +void IsMovingBackgroundTaskRunning(void) // unused +{ + u8 taskId = FindTaskIdByFunc(Task_MovingBackgroundPalettes); + + if (taskId != 0xFF) + gTasks[taskId].data[6] = 1; + + FillPalette(RGB_BLACK, 0xA0, 0x20); +} + +static void DestroyMovingBackgroundTasks(void) +{ + u8 taskId; + + if ((taskId = FindTaskIdByFunc(Task_MovingBackgroundPalettes)) != 0xFF) + DestroyTask(taskId); + if ((taskId = FindTaskIdByFunc(Task_MovingBackgroundPos)) != 0xFF) + DestroyTask(taskId); + + FillPalette(RGB_BLACK, 0xA0, 0x20); + ResetBgRegsAfterMovingBackgroundCancel(); +} + +static void ResetBgRegsAfterMovingBackgroundCancel(void) +{ + SetGpuReg(REG_OFFSET_BLDCNT, 0); + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + gBattle_BG2_X = 0; + SetBgAttribute(1, BG_ATTR_PRIORITY, GetBattleBgAttribute(1, 5)); + SetBgAttribute(2, BG_ATTR_PRIORITY, GetBattleBgAttribute(2, 5)); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG3_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP); + Free(sEvoMovingBgPtr); +} @@ -135,7 +135,7 @@ static const union AnimCmd *const gUnknown_83E632C[] = gUnknown_83E6308, }; -static const union AnimCmd *const gUnknown_83E6330[] = +const union AnimCmd *const gUnknown_83E6330[] = { gUnknown_83E6310, }; diff --git a/src/item_pc.c b/src/item_pc.c index 8569844b9..60a74ac59 100644 --- a/src/item_pc.c +++ b/src/item_pc.c @@ -384,7 +384,7 @@ static bool8 ItemPc_DoGfxSetup(void) gMain.state++; break; case 20: - if (sub_80BF72C() != TRUE) + if ((u8)sub_80BF72C() != TRUE) gMain.state++; break; default: diff --git a/src/menu_helpers.c b/src/menu_helpers.c index 06e7bb08b..f17bff0d0 100644 --- a/src/menu_helpers.c +++ b/src/menu_helpers.c @@ -125,17 +125,17 @@ bool8 MenuHelpers_LinkSomething(void) return FALSE; } -bool8 sub_80BF72C(void) +bool32 sub_80BF72C(void) { if (!MenuHelpers_LinkSomething()) return FALSE; else - return sub_8058244(); + return (u8)sub_8058244(); } bool8 sub_80BF748(void) { - if (sub_80BF72C() == TRUE) + if ((u8)sub_80BF72C() == TRUE) return TRUE; else if (sub_800B270() != TRUE) return FALSE; diff --git a/src/new_menu_helpers.c b/src/new_menu_helpers.c index 84befe63e..f879e6810 100644 --- a/src/new_menu_helpers.c +++ b/src/new_menu_helpers.c @@ -21,11 +21,13 @@ #define STD_WINDOW_PALETTE_NUM 14 #define STD_WINDOW_BASE_TILE_NUM 0x214 -static EWRAM_DATA bool8 gUnknown_203AB58[4] = {FALSE}; // knizz: bgmaps_that_need_syncing -static EWRAM_DATA u16 gUnknown_203AB5C = {0}; -static EWRAM_DATA void *gUnknown_203AB60[0x20] = {NULL}; +static EWRAM_DATA bool8 sScheduledBgCopiesToVram[4] = {FALSE}; +static EWRAM_DATA u16 sTempTileDataBufferCursor = {0}; +static EWRAM_DATA void *sTempTileDataBuffers[0x20] = {NULL}; static EWRAM_DATA u8 sStartMenuWindowId = {0}; +static const u16 gUnknown_841EF48[] = INCBIN_U16("graphics/unknown/unk_841EF48.4bpp"); + const u16 gUnknown_841F1C8[] = INCBIN_U16("graphics/text_window/unk_841F1C8.4bpp"); const u16 gTMCaseMainWindowPalette[] = INCBIN_U16("graphics/tm_case/unk_841F408.gbapal"); @@ -169,35 +171,35 @@ static void TaskFreeBufAfterCopyingTileDataToVram(u8 taskId); void ClearScheduledBgCopiesToVram(void) { - memset(gUnknown_203AB58, 0, sizeof(gUnknown_203AB58)); + memset(sScheduledBgCopiesToVram, 0, sizeof(sScheduledBgCopiesToVram)); } void ScheduleBgCopyTilemapToVram(u8 bgId) { - gUnknown_203AB58[bgId] = TRUE; + sScheduledBgCopiesToVram[bgId] = TRUE; } void DoScheduledBgTilemapCopiesToVram(void) { - if (gUnknown_203AB58[0] == TRUE) + if (sScheduledBgCopiesToVram[0] == TRUE) { CopyBgTilemapBufferToVram(0); - gUnknown_203AB58[0] = FALSE; + sScheduledBgCopiesToVram[0] = FALSE; } - if (gUnknown_203AB58[1] == TRUE) + if (sScheduledBgCopiesToVram[1] == TRUE) { CopyBgTilemapBufferToVram(1); - gUnknown_203AB58[1] = FALSE; + sScheduledBgCopiesToVram[1] = FALSE; } - if (gUnknown_203AB58[2] == TRUE) + if (sScheduledBgCopiesToVram[2] == TRUE) { CopyBgTilemapBufferToVram(2); - gUnknown_203AB58[2] = FALSE; + sScheduledBgCopiesToVram[2] = FALSE; } - if (gUnknown_203AB58[3] == TRUE) + if (sScheduledBgCopiesToVram[3] == TRUE) { CopyBgTilemapBufferToVram(3); - gUnknown_203AB58[3] = FALSE; + sScheduledBgCopiesToVram[3] = FALSE; } } @@ -205,11 +207,11 @@ void ResetTempTileDataBuffers(void) { int i; - for (i = 0; i < (s32)NELEMS(gUnknown_203AB60); i++) + for (i = 0; i < (s32)NELEMS(sTempTileDataBuffers); i++) { - gUnknown_203AB60[i] = NULL; + sTempTileDataBuffers[i] = NULL; } - gUnknown_203AB5C = 0; + sTempTileDataBufferCursor = 0; } bool8 FreeTempTileDataBuffersIfPossible(void) @@ -218,13 +220,13 @@ bool8 FreeTempTileDataBuffersIfPossible(void) if (!IsDma3ManagerBusyWithBgCopy()) { - if (gUnknown_203AB5C) + if (sTempTileDataBufferCursor) { - for (i = 0; i < gUnknown_203AB5C; i++) + for (i = 0; i < sTempTileDataBufferCursor; i++) { - FREE_AND_SET_NULL(gUnknown_203AB60[i]); + FREE_AND_SET_NULL(sTempTileDataBuffers[i]); } - gUnknown_203AB5C = 0; + sTempTileDataBufferCursor = 0; } return FALSE; } @@ -238,7 +240,7 @@ void *DecompressAndCopyTileDataToVram(u8 bgId, const void *src, u32 size, u16 of { u32 sizeOut; - if (gUnknown_203AB5C < NELEMS(gUnknown_203AB60)) + if (sTempTileDataBufferCursor < NELEMS(sTempTileDataBuffers)) { void *ptr = MallocAndDecompress(src, &sizeOut); if (!size) @@ -246,7 +248,7 @@ void *DecompressAndCopyTileDataToVram(u8 bgId, const void *src, u32 size, u16 of if (ptr) { CopyDecompressedTileDataToVram(bgId, ptr, size, offset, mode); - gUnknown_203AB60[gUnknown_203AB5C++] = ptr; + sTempTileDataBuffers[sTempTileDataBufferCursor++] = ptr; } return ptr; } @@ -257,7 +259,7 @@ void *DecompressAndCopyTileDataToVram2(u8 bgId, const void *src, u32 size, u16 o { u32 sizeOut; - if (gUnknown_203AB5C < NELEMS(gUnknown_203AB60)) + if (sTempTileDataBufferCursor < NELEMS(sTempTileDataBuffers)) { void *ptr = MallocAndDecompress(src, &sizeOut); if (sizeOut > size) @@ -265,7 +267,7 @@ void *DecompressAndCopyTileDataToVram2(u8 bgId, const void *src, u32 size, u16 o if (ptr) { CopyDecompressedTileDataToVram(bgId, ptr, sizeOut, offset, mode); - gUnknown_203AB60[gUnknown_203AB5C++] = ptr; + sTempTileDataBuffers[sTempTileDataBufferCursor++] = ptr; } return ptr; } diff --git a/src/option_menu.c b/src/option_menu.c index 8450633f5..35fe957be 100644 --- a/src/option_menu.c +++ b/src/option_menu.c @@ -29,16 +29,51 @@ enum MENUITEM_BUTTONMODE, MENUITEM_FRAMETYPE, MENUITEM_CANCEL, - MENUITEM_COUNT, + MENUITEM_COUNT }; + // Window Ids enum { WIN_TEXT_OPTION, - WIN_OPTIONS, + WIN_OPTIONS +}; + +// RAM symbols +struct OptionMenu +{ + /*0x00*/ u16 option[MENUITEM_COUNT]; + /*0x0E*/ u16 unkE; + /*0x10*/ u8 state3; + /*0x11*/ u8 state; + /*0x12*/ u8 state2; + /*0x13*/ u8 unk13; }; -static const struct WindowTemplate sOptionMenuWinTemplates[] = //3CC2B8 +static EWRAM_DATA struct OptionMenu *sOptionMenuPtr = NULL; + +//Function Declarataions +static void CB2_InitOptionMenu(void); +static void VBlankCB_OptionMenu(void); +static void OptionMenu_InitCallbacks(void); +static void OptionMenu_SetVBlankCallback(void); +static void CB2_OptionMenu(void); +static void SetOptionMenuTask(void); +static void InitOptionMenuBg(void); +static void OptionMenu_PickSwitchCancel(void); +static void OptionMenu_ResetSpriteData(void); +static bool8 LoadOptionMenuPalette(void); +static void Task_OptionMenu(u8 taskId); +static u8 OptionMenu_ProcessInput(void); +static void BufferOptionMenuString(u8 selection); +static void CloseAndSaveOptionMenu(u8 taskId); +static void PrintOptionMenuHeader(void); +static void sub_8088C0C(void); +static void LoadOptionMenuItemNames(void); +static void sub_8088DE0(u16 selection); + +// Data Definitions +static const struct WindowTemplate sOptionMenuWinTemplates[] = { { .bg = 1, @@ -47,7 +82,7 @@ static const struct WindowTemplate sOptionMenuWinTemplates[] = //3CC2B8 .width = 26, .height = 2, .paletteNum = 1, - .baseBlock = 2, + .baseBlock = 2 }, { .bg = 0, @@ -56,7 +91,7 @@ static const struct WindowTemplate sOptionMenuWinTemplates[] = //3CC2B8 .width = 26, .height = 12, .paletteNum = 1, - .baseBlock = 0x36, + .baseBlock = 0x36 }, { .bg = 2, @@ -65,11 +100,12 @@ static const struct WindowTemplate sOptionMenuWinTemplates[] = //3CC2B8 .width = 30, .height = 2, .paletteNum = 0xF, - .baseBlock = 0x16e, + .baseBlock = 0x16e }, - DUMMY_WIN_TEMPLATE, + DUMMY_WIN_TEMPLATE }; -static const struct BgTemplate sOptionMenuBgTemplates[] = //3CC2D8 + +static const struct BgTemplate sOptionMenuBgTemplates[] = { { .bg = 1, @@ -78,7 +114,7 @@ static const struct BgTemplate sOptionMenuBgTemplates[] = //3CC2D8 .screenSize = 0, .paletteMode = 0, .priority = 0, - .baseTile = 0, + .baseTile = 0 }, { .bg = 0, @@ -87,7 +123,7 @@ static const struct BgTemplate sOptionMenuBgTemplates[] = //3CC2D8 .screenSize = 0, .paletteMode = 0, .priority = 1, - .baseTile = 0, + .baseTile = 0 }, { .bg = 2, @@ -96,12 +132,14 @@ static const struct BgTemplate sOptionMenuBgTemplates[] = //3CC2D8 .screenSize = 0, .paletteMode = 0, .priority = 2, - .baseTile = 0, + .baseTile = 0 }, }; -static const u16 sOptionsMenuPalette[] = INCBIN_U16("graphics/misc/unk_83cc2e4.gbapal"); //3CC2E4 -static const u16 sOptionsMenuItemCounts[MENUITEM_COUNT] = {3, 2, 2, 2, 3, 10, 0}; //3CC304 -static const u8 *const sOptionMenuItemsNames[MENUITEM_COUNT] = //3CC314 + +static const u16 sOptionMenuPalette[] = INCBIN_U16("graphics/misc/unk_83cc2e4.gbapal"); +static const u16 sOptionMenuItemCounts[MENUITEM_COUNT] = {3, 2, 2, 2, 3, 10, 0}; + +static const u8 *const sOptionMenuItemsNames[MENUITEM_COUNT] = { [MENUITEM_TEXTSPEED] = gText_TextSpeed, [MENUITEM_BATTLESCENE] = gText_BattleScene, @@ -111,73 +149,44 @@ static const u8 *const sOptionMenuItemsNames[MENUITEM_COUNT] = //3CC314 [MENUITEM_FRAMETYPE] = gText_Frame, [MENUITEM_CANCEL] = gText_OptionMenuCancel, }; -static const u8 *const sTextSpeedOptions[] = //3CC330 + +static const u8 *const sTextSpeedOptions[] = { gText_TextSpeedSlow, gText_TextSpeedMid, gText_TextSpeedFast }; -static const u8 *const sBattleSceneOptions[] = //3CC33C + +static const u8 *const sBattleSceneOptions[] = { gText_BattleSceneOn, gText_BattleSceneOff }; -static const u8 *const sBattleStyleOptions[] = //3CC344 + +static const u8 *const sBattleStyleOptions[] = { gText_BattleStyleShift, gText_BattleStyleSet }; -static const u8 *const sSoundOptions[] = //3CC34C + +static const u8 *const sSoundOptions[] = { gText_SoundMono, gText_SoundStereo }; -static const u8 *const sButtonTypeOptions[] = //3CC354 -{ - gText_ButtonTypeNormal, - gText_ButtonTypeLEqualsA, - gText_ButtonTypeLR, -}; -static const u8 sOptionsMenuPickSwitchCancelTextColor[] = {TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY}; //3CC360 -static const u8 sOptionsMenuTextColor[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_RED, TEXT_COLOR_RED}; //3CC363 - - -//This file's functions -static void sub_808835C(void); -static void sub_8088374(void); -static void sub_8088430(void); -static void sub_8088444(void); -static void sub_8088454(void); -static void sub_8088514(void); -static void sub_8088530(void); -static void sub_8088680(void); -static void sub_80886D4(void); -static bool8 sub_80886F0(void); -static void sub_8088780(u8 taskId); -static u8 sub_80888C0(void); -static void sub_80889A8(u8 selection); -static void sub_8088B00(u8 taskId); -static void sub_8088BD0(void); -static void sub_8088C0C(void); -static void sub_8088D8C(void); -static void sub_8088DE0(u16 selection); -struct OptionsMenu +static const u8 *const sButtonTypeOptions[] = { - /*0x00*/ u16 option[MENUITEM_COUNT]; //0,2,4,6,8,a,c - /*0x0E*/ u16 unkE; - /*0x10*/ u8 state3; - /*0x11*/ u8 state; - /*0x12*/ u8 state2; - /*0x13*/ u8 unk13; + gText_ButtonTypeHelp, + gText_ButtonTypeLR, + gText_ButtonTypeLEqualsA }; -EWRAM_DATA struct OptionsMenu *sOptionsMenuPtr = {0}; +static const u8 sOptionMenuPickSwitchCancelTextColor[] = {TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY}; +static const u8 sOptionMenuTextColor[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_RED, TEXT_COLOR_RED}; - - -//CB2_InitOptionsMenu -static void sub_808835C(void) +// Functions +static void CB2_InitOptionMenu(void) { RunTasks(); AnimateSprites(); @@ -185,123 +194,111 @@ static void sub_808835C(void) UpdatePaletteFade(); } - -//VBlankCB_OptionsMenu -static void sub_8088374(void) +static void VBlankCB_OptionMenu(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } - -//sub_8088388 void CB2_OptionsMenuFromStartMenu(void) { u8 i; if (gMain.savedCallback == NULL) gMain.savedCallback = CB2_ReturnToStartMenu; - sOptionsMenuPtr = AllocZeroed(sizeof(struct OptionsMenu)); - sOptionsMenuPtr->state3 = 0; - sOptionsMenuPtr->state2 = 0; - sOptionsMenuPtr->state = 0; - sOptionsMenuPtr->unkE = 0; - sOptionsMenuPtr->option[MENUITEM_TEXTSPEED] = gSaveBlock2Ptr->optionsTextSpeed; - sOptionsMenuPtr->option[MENUITEM_BATTLESCENE] = gSaveBlock2Ptr->optionsBattleSceneOff; - sOptionsMenuPtr->option[MENUITEM_BATTLESTYLE] = gSaveBlock2Ptr->optionsBattleStyle; - sOptionsMenuPtr->option[MENUITEM_SOUND] = gSaveBlock2Ptr->optionsSound; - sOptionsMenuPtr->option[MENUITEM_BUTTONMODE] = gSaveBlock2Ptr->optionsButtonMode; - sOptionsMenuPtr->option[MENUITEM_FRAMETYPE] = gSaveBlock2Ptr->optionsWindowFrameType; + sOptionMenuPtr = AllocZeroed(sizeof(struct OptionMenu)); + sOptionMenuPtr->state3 = 0; + sOptionMenuPtr->state2 = 0; + sOptionMenuPtr->state = 0; + sOptionMenuPtr->unkE = 0; + sOptionMenuPtr->option[MENUITEM_TEXTSPEED] = gSaveBlock2Ptr->optionsTextSpeed; + sOptionMenuPtr->option[MENUITEM_BATTLESCENE] = gSaveBlock2Ptr->optionsBattleSceneOff; + sOptionMenuPtr->option[MENUITEM_BATTLESTYLE] = gSaveBlock2Ptr->optionsBattleStyle; + sOptionMenuPtr->option[MENUITEM_SOUND] = gSaveBlock2Ptr->optionsSound; + sOptionMenuPtr->option[MENUITEM_BUTTONMODE] = gSaveBlock2Ptr->optionsButtonMode; + sOptionMenuPtr->option[MENUITEM_FRAMETYPE] = gSaveBlock2Ptr->optionsWindowFrameType; - for (i = 0; i < MENUITEM_COUNT-1; i++) + for (i = 0; i < MENUITEM_COUNT - 1; i++) { - if (sOptionsMenuPtr->option[i] > (sOptionsMenuItemCounts[i])-1) - sOptionsMenuPtr->option[i] = 0; + if (sOptionMenuPtr->option[i] > (sOptionMenuItemCounts[i]) - 1) + sOptionMenuPtr->option[i] = 0; } HelpSystem_SetSomeVariable2(0xD); - SetMainCallback2(sub_8088454); + SetMainCallback2(CB2_OptionMenu); } - -//sub_8088430 -static void sub_8088430(void) +static void OptionMenu_InitCallbacks(void) { - SetVBlankCallback(0); - SetHBlankCallback(0); + SetVBlankCallback(NULL); + SetHBlankCallback(NULL); } - -//sub_8088444 -static void sub_8088444(void) +static void OptionMenu_SetVBlankCallback(void) { - SetVBlankCallback(sub_8088374); + SetVBlankCallback(VBlankCB_OptionMenu); } -//sub_8088454 -static void sub_8088454(void) +static void CB2_OptionMenu(void) { u8 i, state; - state = sOptionsMenuPtr->state; + state = sOptionMenuPtr->state; switch (state) { case 0: - sub_8088430(); + OptionMenu_InitCallbacks(); break; case 1: - sub_8088530(); + InitOptionMenuBg(); break; case 2: - sub_80886D4(); + OptionMenu_ResetSpriteData(); break; case 3: - if (sub_80886F0() != TRUE) //silly matching quirk + if (LoadOptionMenuPalette() != TRUE) return; break; case 4: - sub_8088BD0(); + PrintOptionMenuHeader(); break; case 5: sub_8088C0C(); break; case 6: - sub_8088D8C(); + LoadOptionMenuItemNames(); break; case 7: for (i = 0; i < MENUITEM_COUNT; i++) - sub_80889A8(i); + BufferOptionMenuString(i); break; case 8: - sub_8088DE0(sOptionsMenuPtr->unkE); + sub_8088DE0(sOptionMenuPtr->unkE); break; case 9: - sub_8088680(); + OptionMenu_PickSwitchCancel(); break; default: - sub_8088514(); + SetOptionMenuTask(); + break; } - sOptionsMenuPtr->state++; + sOptionMenuPtr->state++; } -//sub_8088514 -static void sub_8088514(void) +static void SetOptionMenuTask(void) { - CreateTask(sub_8088780, 0); - SetMainCallback2(sub_808835C); + CreateTask(Task_OptionMenu, 0); + SetMainCallback2(CB2_InitOptionMenu); } - -//sub_8088530 -static void sub_8088530(void) +static void InitOptionMenuBg(void) { - void * dest = (void *) VRAM; - DmaClearLarge16(3, dest, VRAM_SIZE, 0x1000); - + void * dest = (void *)VRAM; + DmaClearLarge16(3, dest, VRAM_SIZE, 0x1000); DmaClear32(3, (void *)OAM, OAM_SIZE); DmaClear16(3, (void *)PLTT, PLTT_SIZE); - SetGpuReg(REG_OFFSET_DISPCNT, 0); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0); ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, sOptionMenuBgTemplates, ARRAY_COUNT(sOptionMenuBgTemplates)); + InitBgsFromTemplates(0, sOptionMenuBgTemplates, NELEMS(sOptionMenuBgTemplates)); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(1, 0, 0); @@ -312,30 +309,27 @@ static void sub_8088530(void) ChangeBgY(3, 0, 0); InitWindows(sOptionMenuWinTemplates); DeactivateAllTextPrinters(); - SetGpuReg(REG_OFFSET_BLDCNT, 0xC1); - SetGpuReg(REG_OFFSET_BLDY, 2); - SetGpuReg(REG_OFFSET_WININ, 1); - SetGpuReg(REG_OFFSET_WINOUT, 0x27); - SetGpuReg(0, 0x3040); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_EFFECT_LIGHTEN); + SetGpuReg(REG_OFFSET_BLDY, BLDCNT_TGT1_BG1); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON); ShowBg(0); ShowBg(1); ShowBg(2); }; -//sub_8088680 -static void sub_8088680(void) +static void OptionMenu_PickSwitchCancel(void) { s32 x; x = 0xE4 - GetStringWidth(0, gText_PickSwitchCancel, 0); - FillWindowPixelBuffer(2, 0xFF); - AddTextPrinterParameterized3(2, 0, x, 0, sOptionsMenuPickSwitchCancelTextColor, 0, gText_PickSwitchCancel); + FillWindowPixelBuffer(2, PIXEL_FILL(15)); + AddTextPrinterParameterized3(2, 0, x, 0, sOptionMenuPickSwitchCancelTextColor, 0, gText_PickSwitchCancel); PutWindowTilemap(2); CopyWindowToVram(2, 3); } - -//sub_80886D4 -static void sub_80886D4(void) +static void OptionMenu_ResetSpriteData(void) { ResetSpriteData(); ResetPaletteFade(); @@ -344,19 +338,18 @@ static void sub_80886D4(void) ScanlineEffect_Stop(); } -//sub_80886F0 -static bool8 sub_80886F0(void) +static bool8 LoadOptionMenuPalette(void) { - switch (sOptionsMenuPtr->state2) + switch (sOptionMenuPtr->state2) { case 0: - LoadBgTiles(1, GetUserFrameGraphicsInfo(sOptionsMenuPtr->option[MENUITEM_FRAMETYPE])->tiles, 0x120, 0x1AA); + LoadBgTiles(1, GetUserFrameGraphicsInfo(sOptionMenuPtr->option[MENUITEM_FRAMETYPE])->tiles, 0x120, 0x1AA); break; case 1: - LoadPalette(GetUserFrameGraphicsInfo(sOptionsMenuPtr->option[MENUITEM_FRAMETYPE])->palette, 0x20, 0x20); + LoadPalette(GetUserFrameGraphicsInfo(sOptionMenuPtr->option[MENUITEM_FRAMETYPE])->palette, 0x20, 0x20); break; case 2: - LoadPalette(sOptionsMenuPalette, 0x10, 0x20); + LoadPalette(sOptionMenuPalette, 0x10, 0x20); LoadPalette(stdpal_get(2), 0xF0, 0x20); break; case 3: @@ -365,266 +358,104 @@ static bool8 sub_80886F0(void) default: return TRUE; } - sOptionsMenuPtr->state2++; + sOptionMenuPtr->state2++; return FALSE; } - - -// I could not get this function to match. GOTO statements weren't even compiling correctly. -#ifdef NONMATCHING -static void sub_8088780(u8 taskId) +static void Task_OptionMenu(u8 taskId) { - u8 v2, v5; - struct OptionsMenu v4; - - switch (sOptionsMenuPtr->state3) + switch (sOptionMenuPtr->state3) { case 0: - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); - sub_8088444(); - sOptionsMenuPtr->state3++; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + OptionMenu_SetVBlankCallback(); + sOptionMenuPtr->state3++; break; case 2: - if ((bool32) sub_80BF72C() == TRUE) //cast to bool32 to remove the lsl/lsr 0x18 after func call - return; - switch (sub_80888C0()) + if (sub_80BF72C() == TRUE) + break; + switch (OptionMenu_ProcessInput()) { + case 0: + break; case 1: - sOptionsMenuPtr->state3++; + sOptionMenuPtr->state3++; break; case 2: - LoadBgTiles(1, GetUserFrameGraphicsInfo(sOptionsMenuPtr->option[MENUITEM_FRAMETYPE])->tiles, 0x120, 0x1AA); - LoadPalette(GetUserFrameGraphicsInfo(sOptionsMenuPtr->option[MENUITEM_FRAMETYPE])->palette, 0x20, 0x20); - sub_80889A8(sOptionsMenuPtr->unkE); - sOptionsMenuPtr->state3++; + LoadBgTiles(1, GetUserFrameGraphicsInfo(sOptionMenuPtr->option[MENUITEM_FRAMETYPE])->tiles, 0x120, 0x1AA); + LoadPalette(GetUserFrameGraphicsInfo(sOptionMenuPtr->option[MENUITEM_FRAMETYPE])->palette, 0x20, 0x20); + BufferOptionMenuString(sOptionMenuPtr->unkE); break; case 3: - sub_8088DE0(sOptionsMenuPtr->unkE); + sub_8088DE0(sOptionMenuPtr->unkE); break; case 4: - sub_80889A8(sOptionsMenuPtr->unkE); - sOptionsMenuPtr->state3++; + BufferOptionMenuString(sOptionMenuPtr->unkE); break; - default: - return; } + break; case 3: - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - sOptionsMenuPtr->state3++; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + sOptionMenuPtr->state3++; + break; case 1: case 4: if (gPaletteFade.active) return; - sOptionsMenuPtr->state3++; + sOptionMenuPtr->state3++; + break; case 5: - sub_8088B00(taskId); + CloseAndSaveOptionMenu(taskId); break; - default: - return; } } -#else -NAKED -static void sub_8088780(u8 taskId) -{ - asm_unified("\tpush {r4,lr}\n" - "\tsub sp, 0x4\n" - "\tlsls r0, 24\n" - "\tlsrs r2, r0, 24\n" - "\tldr r1, _080887A0 @ =sOptionsMenuPtr\n" - "\tldr r0, [r1]\n" - "\tldrb r0, [r0, 0x10]\n" - "\tadds r3, r1, 0\n" - "\tcmp r0, 0x5\n" - "\tbls _08088796\n" - "\tb _080888B6\n" - "_08088796:\n" - "\tlsls r0, 2\n" - "\tldr r1, _080887A4 @ =_080887A8\n" - "\tadds r0, r1\n" - "\tldr r0, [r0]\n" - "\tmov pc, r0\n" - "\t.align 2, 0\n" - "_080887A0: .4byte sOptionsMenuPtr\n" - "_080887A4: .4byte _080887A8\n" - "\t.align 2, 0\n" - "_080887A8:\n" - "\t.4byte _080887C0\n" - "\t.4byte _08088894\n" - "\t.4byte _080887E0\n" - "\t.4byte _08088878\n" - "\t.4byte _08088894\n" - "\t.4byte _080888B0\n" - "_080887C0:\n" - "\tmovs r0, 0x1\n" - "\tnegs r0, r0\n" - "\tmovs r1, 0\n" - "\tstr r1, [sp]\n" - "\tmovs r2, 0x10\n" - "\tmovs r3, 0\n" - "\tbl BeginNormalPaletteFade\n" - "\tbl sub_8088444\n" - "\tldr r0, _080887DC @ =sOptionsMenuPtr\n" - "\tldr r1, [r0]\n" - "\tb _080888A2\n" - "\t.align 2, 0\n" - "_080887DC: .4byte sOptionsMenuPtr\n" - "_080887E0:\n" - "\tbl sub_80BF72C\n" - "\tcmp r0, 0x1\n" - "\tbeq _080888B6\n" - "\tbl sub_80888C0\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tcmp r0, 0x4\n" - "\tbhi _080888B6\n" - "\tlsls r0, 2\n" - "\tldr r1, _08088800 @ =_08088804\n" - "\tadds r0, r1\n" - "\tldr r0, [r0]\n" - "\tmov pc, r0\n" - "\t.align 2, 0\n" - "_08088800: .4byte _08088804\n" - "\t.align 2, 0\n" - "_08088804:\n" - "\t.4byte _080888B6\n" - "\t.4byte _08088818\n" - "\t.4byte _08088824\n" - "\t.4byte _08088858\n" - "\t.4byte _08088868\n" - "_08088818:\n" - "\tldr r0, _08088820 @ =sOptionsMenuPtr\n" - "\tldr r1, [r0]\n" - "\tb _080888A2\n" - "\t.align 2, 0\n" - "_08088820: .4byte sOptionsMenuPtr\n" - "_08088824:\n" - "\tldr r4, _08088854 @ =sOptionsMenuPtr\n" - "\tldr r0, [r4]\n" - "\tldrb r0, [r0, 0xA]\n" - "\tbl GetUserFrameGraphicsInfo\n" - "\tldr r1, [r0]\n" - "\tmovs r2, 0x90\n" - "\tlsls r2, 1\n" - "\tmovs r3, 0xD5\n" - "\tlsls r3, 1\n" - "\tmovs r0, 0x1\n" - "\tbl LoadBgTiles\n" - "\tldr r0, [r4]\n" - "\tldrb r0, [r0, 0xA]\n" - "\tbl GetUserFrameGraphicsInfo\n" - "\tldr r0, [r0, 0x4]\n" - "\tmovs r1, 0x20\n" - "\tmovs r2, 0x20\n" - "\tbl LoadPalette\n" - "\tldr r0, [r4]\n" - "\tb _0808886C\n" - "\t.align 2, 0\n" - "_08088854: .4byte sOptionsMenuPtr\n" - "_08088858:\n" - "\tldr r0, _08088864 @ =sOptionsMenuPtr\n" - "\tldr r0, [r0]\n" - "\tldrh r0, [r0, 0xE]\n" - "\tbl sub_8088DE0\n" - "\tb _080888B6\n" - "\t.align 2, 0\n" - "_08088864: .4byte sOptionsMenuPtr\n" - "_08088868:\n" - "\tldr r0, _08088874 @ =sOptionsMenuPtr\n" - "\tldr r0, [r0]\n" - "_0808886C:\n" - "\tldrb r0, [r0, 0xE]\n" - "\tbl sub_80889A8\n" - "\tb _080888B6\n" - "\t.align 2, 0\n" - "_08088874: .4byte sOptionsMenuPtr\n" - "_08088878:\n" - "\tmovs r0, 0x1\n" - "\tnegs r0, r0\n" - "\tmovs r1, 0\n" - "\tstr r1, [sp]\n" - "\tmovs r2, 0\n" - "\tmovs r3, 0x10\n" - "\tbl BeginNormalPaletteFade\n" - "\tldr r0, _08088890 @ =sOptionsMenuPtr\n" - "\tldr r1, [r0]\n" - "\tb _080888A2\n" - "\t.align 2, 0\n" - "_08088890: .4byte sOptionsMenuPtr\n" - "_08088894:\n" - "\tldr r0, _080888AC @ =gPaletteFade\n" - "\tldrb r1, [r0, 0x7]\n" - "\tmovs r0, 0x80\n" - "\tands r0, r1\n" - "\tcmp r0, 0\n" - "\tbne _080888B6\n" - "\tldr r1, [r3]\n" - "_080888A2:\n" - "\tldrb r0, [r1, 0x10]\n" - "\tadds r0, 0x1\n" - "\tstrb r0, [r1, 0x10]\n" - "\tb _080888B6\n" - "\t.align 2, 0\n" - "_080888AC: .4byte gPaletteFade\n" - "_080888B0:\n" - "\tadds r0, r2, 0\n" - "\tbl sub_8088B00\n" - "_080888B6:\n" - "\tadd sp, 0x4\n" - "\tpop {r4}\n" - "\tpop {r0}\n" - "\tbx r0\n"); -} -#endif -//OptionsMenu_ProcessInput -static u8 sub_80888C0(void) +static u8 OptionMenu_ProcessInput(void) { u16 current; u16* curr; - if (gMain.newAndRepeatedKeys & DPAD_RIGHT) + if (JOY_REPT(DPAD_RIGHT)) { - current = sOptionsMenuPtr->option[(sOptionsMenuPtr->unkE)]; - if (current == (sOptionsMenuItemCounts[sOptionsMenuPtr->unkE] - 1)) - sOptionsMenuPtr->option[sOptionsMenuPtr->unkE] = 0; + current = sOptionMenuPtr->option[(sOptionMenuPtr->unkE)]; + if (current == (sOptionMenuItemCounts[sOptionMenuPtr->unkE] - 1)) + sOptionMenuPtr->option[sOptionMenuPtr->unkE] = 0; else - sOptionsMenuPtr->option[sOptionsMenuPtr->unkE] = current + 1; - if (sOptionsMenuPtr->unkE == MENUITEM_FRAMETYPE) + sOptionMenuPtr->option[sOptionMenuPtr->unkE] = current + 1; + if (sOptionMenuPtr->unkE == MENUITEM_FRAMETYPE) return 2; else return 4; } - else if (gMain.newAndRepeatedKeys & DPAD_LEFT) + else if (JOY_REPT(DPAD_LEFT)) { - curr = &sOptionsMenuPtr->option[sOptionsMenuPtr->unkE]; + curr = &sOptionMenuPtr->option[sOptionMenuPtr->unkE]; if (*curr == 0) - *curr = sOptionsMenuItemCounts[sOptionsMenuPtr->unkE] - 1; + *curr = sOptionMenuItemCounts[sOptionMenuPtr->unkE] - 1; else - --*(curr); + --*curr; - if (sOptionsMenuPtr->unkE == MENUITEM_FRAMETYPE) + if (sOptionMenuPtr->unkE == MENUITEM_FRAMETYPE) return 2; else return 4; } - else if (gMain.newAndRepeatedKeys & DPAD_UP) + else if (JOY_REPT(DPAD_UP)) { - if (sOptionsMenuPtr->unkE == MENUITEM_TEXTSPEED) - sOptionsMenuPtr->unkE = MENUITEM_CANCEL; + if (sOptionMenuPtr->unkE == MENUITEM_TEXTSPEED) + sOptionMenuPtr->unkE = MENUITEM_CANCEL; else - sOptionsMenuPtr->unkE = sOptionsMenuPtr->unkE - 1; + sOptionMenuPtr->unkE = sOptionMenuPtr->unkE - 1; return 3; } - else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + else if (JOY_REPT(DPAD_DOWN)) { - if (sOptionsMenuPtr->unkE == MENUITEM_CANCEL) - sOptionsMenuPtr->unkE = MENUITEM_TEXTSPEED; + if (sOptionMenuPtr->unkE == MENUITEM_CANCEL) + sOptionMenuPtr->unkE = MENUITEM_TEXTSPEED; else - sOptionsMenuPtr->unkE = sOptionsMenuPtr->unkE + 1; + sOptionMenuPtr->unkE = sOptionMenuPtr->unkE + 1; return 3; } - else if ((gMain.newKeys & B_BUTTON) || (gMain.newKeys & A_BUTTON)) + else if (JOY_NEW(B_BUTTON) || JOY_NEW(A_BUTTON)) { return 1; } @@ -634,42 +465,39 @@ static u8 sub_80888C0(void) } } - -//sub_80889A8 -#ifdef NONMATCHING // could not get it to match perfectly, no idea how they put so many vars on the stack -static void sub_80889A8(u8 selection) +static void BufferOptionMenuString(u8 selection) { - u8* dst; - u8* str; - u8* v8; + u8 str[20]; + u8 buf[12]; + u8 dst[3]; u8 x, y; - memcpy(&dst, sOptionsMenuTextColor, 3); - y = ((GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT) - 1) * selection) + 2; + memcpy(dst, sOptionMenuTextColor, 3); x = 0x82; + y = ((GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT) - 1) * selection) + 2; FillWindowPixelRect(1, 1, x, y, 0x46, GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT)); switch (selection) { case MENUITEM_TEXTSPEED: - AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sTextSpeedOptions); + AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sTextSpeedOptions[sOptionMenuPtr->option[selection]]); break; case MENUITEM_BATTLESCENE: - AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sBattleSceneOptions); + AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sBattleSceneOptions[sOptionMenuPtr->option[selection]]); break; case MENUITEM_BATTLESTYLE: - AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sBattleStyleOptions); + AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sBattleStyleOptions[sOptionMenuPtr->option[selection]]); break; case MENUITEM_SOUND: - AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sSoundOptions); + AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sSoundOptions[sOptionMenuPtr->option[selection]]); break; case MENUITEM_BUTTONMODE: - AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sButtonTypeOptions); + AddTextPrinterParameterized3(1, 2, x, y, dst, -1, sButtonTypeOptions[sOptionMenuPtr->option[selection]]); break; case MENUITEM_FRAMETYPE: StringCopy(str, gText_FrameType); - ConvertIntToDecimalStringN(v8, sOptionsMenuPtr->option[2*selection] + 1, 1, 2); - StringAppendN(str, v8, 3); + ConvertIntToDecimalStringN(buf, sOptionMenuPtr->option[selection] + 1, 1, 2); + StringAppendN(str, buf, 3); AddTextPrinterParameterized3(1, 2, x, y, dst, -1, str); break; default: @@ -678,207 +506,31 @@ static void sub_80889A8(u8 selection) PutWindowTilemap(1); CopyWindowToVram(1, 3); } -#else -NAKED -static void sub_80889A8(u8 selection) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r8\n" - "\tpush {r7}\n" - "\tsub sp, 0x30\n" - "\tlsls r0, 24\n" - "\tlsrs r5, r0, 24\n" - "\tadd r4, sp, 0x2C\n" - "\tldr r1, _08088A08 @ =sOptionsMenuTextColor\n" - "\tadds r0, r4, 0\n" - "\tmovs r2, 0x3\n" - "\tbl memcpy\n" - "\tmovs r0, 0x82\n" - "\tmov r8, r0\n" - "\tmovs r0, 0x2\n" - "\tmovs r1, 0x1\n" - "\tbl GetFontAttribute\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tsubs r0, 0x1\n" - "\tmuls r0, r5\n" - "\tadds r0, 0x2\n" - "\tlsls r0, 24\n" - "\tlsrs r7, r0, 24\n" - "\tmovs r0, 0x2\n" - "\tmovs r1, 0x1\n" - "\tbl GetFontAttribute\n" - "\tlsls r0, 24\n" - "\tlsrs r0, 24\n" - "\tmovs r1, 0x46\n" - "\tstr r1, [sp]\n" - "\tstr r0, [sp, 0x4]\n" - "\tmovs r0, 0x1\n" - "\tmovs r1, 0x1\n" - "\tmovs r2, 0x82\n" - "\tadds r3, r7, 0\n" - "\tbl FillWindowPixelRect\n" - "\tadds r6, r4, 0\n" - "\tcmp r5, 0x5\n" - "\tbhi _08088ADE\n" - "\tlsls r0, r5, 2\n" - "\tldr r1, _08088A0C @ =_08088A10\n" - "\tadds r0, r1\n" - "\tldr r0, [r0]\n" - "\tmov pc, r0\n" - "\t.align 2, 0\n" - "_08088A08: .4byte sOptionsMenuTextColor\n" - "_08088A0C: .4byte _08088A10\n" - "\t.align 2, 0\n" - "_08088A10:\n" - "\t.4byte _08088A28\n" - "\t.4byte _08088A38\n" - "\t.4byte _08088A48\n" - "\t.4byte _08088A58\n" - "\t.4byte _08088A68\n" - "\t.4byte _08088A9C\n" - "_08088A28:\n" - "\tstr r6, [sp]\n" - "\tmovs r0, 0x1\n" - "\tnegs r0, r0\n" - "\tstr r0, [sp, 0x4]\n" - "\tldr r2, _08088A34 @ =sTextSpeedOptions\n" - "\tb _08088A72\n" - "\t.align 2, 0\n" - "_08088A34: .4byte sTextSpeedOptions\n" - "_08088A38:\n" - "\tstr r6, [sp]\n" - "\tmovs r0, 0x1\n" - "\tnegs r0, r0\n" - "\tstr r0, [sp, 0x4]\n" - "\tldr r2, _08088A44 @ =sBattleSceneOptions\n" - "\tb _08088A72\n" - "\t.align 2, 0\n" - "_08088A44: .4byte sBattleSceneOptions\n" - "_08088A48:\n" - "\tstr r6, [sp]\n" - "\tmovs r0, 0x1\n" - "\tnegs r0, r0\n" - "\tstr r0, [sp, 0x4]\n" - "\tldr r2, _08088A54 @ =sBattleStyleOptions\n" - "\tb _08088A72\n" - "\t.align 2, 0\n" - "_08088A54: .4byte sBattleStyleOptions\n" - "_08088A58:\n" - "\tstr r6, [sp]\n" - "\tmovs r0, 0x1\n" - "\tnegs r0, r0\n" - "\tstr r0, [sp, 0x4]\n" - "\tldr r2, _08088A64 @ =sSoundOptions\n" - "\tb _08088A72\n" - "\t.align 2, 0\n" - "_08088A64: .4byte sSoundOptions\n" - "_08088A68:\n" - "\tstr r6, [sp]\n" - "\tmovs r0, 0x1\n" - "\tnegs r0, r0\n" - "\tstr r0, [sp, 0x4]\n" - "\tldr r2, _08088A94 @ =sButtonTypeOptions\n" - "_08088A72:\n" - "\tldr r0, _08088A98 @ =sOptionsMenuPtr\n" - "\tldr r0, [r0]\n" - "\tlsls r1, r5, 1\n" - "\tadds r0, r1\n" - "\tldrh r0, [r0]\n" - "\tlsls r0, 2\n" - "\tadds r0, r2\n" - "\tldr r0, [r0]\n" - "\tstr r0, [sp, 0x8]\n" - "\tmovs r0, 0x1\n" - "\tmovs r1, 0x2\n" - "\tmov r2, r8\n" - "\tadds r3, r7, 0\n" - "\tbl AddTextPrinterParameterized3\n" - "\tb _08088ADE\n" - "\t.align 2, 0\n" - "_08088A94: .4byte sButtonTypeOptions\n" - "_08088A98: .4byte sOptionsMenuPtr\n" - "_08088A9C:\n" - "\tldr r1, _08088AF8 @ =gText_FrameType\n" - "\tadd r0, sp, 0xC\n" - "\tbl StringCopy\n" - "\tadd r4, sp, 0x20\n" - "\tldr r0, _08088AFC @ =sOptionsMenuPtr\n" - "\tldr r0, [r0]\n" - "\tlsls r1, r5, 1\n" - "\tadds r0, r1\n" - "\tldrh r1, [r0]\n" - "\tadds r1, 0x1\n" - "\tadds r0, r4, 0\n" - "\tmovs r2, 0x1\n" - "\tmovs r3, 0x2\n" - "\tbl ConvertIntToDecimalStringN\n" - "\tadd r0, sp, 0xC\n" - "\tadds r1, r4, 0\n" - "\tmovs r2, 0x3\n" - "\tbl StringAppendN\n" - "\tstr r6, [sp]\n" - "\tmovs r0, 0x1\n" - "\tnegs r0, r0\n" - "\tstr r0, [sp, 0x4]\n" - "\tadd r0, sp, 0xC\n" - "\tstr r0, [sp, 0x8]\n" - "\tmovs r0, 0x1\n" - "\tmovs r1, 0x2\n" - "\tmov r2, r8\n" - "\tadds r3, r7, 0\n" - "\tbl AddTextPrinterParameterized3\n" - "_08088ADE:\n" - "\tmovs r0, 0x1\n" - "\tbl PutWindowTilemap\n" - "\tmovs r0, 0x1\n" - "\tmovs r1, 0x3\n" - "\tbl CopyWindowToVram\n" - "\tadd sp, 0x30\n" - "\tpop {r3}\n" - "\tmov r8, r3\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_08088AF8: .4byte gText_FrameType\n" - "_08088AFC: .4byte sOptionsMenuPtr\n"); -} -#endif - -//sub_8088B00 -static void sub_8088B00(u8 taskId) +static void CloseAndSaveOptionMenu(u8 taskId) { gFieldCallback = sub_807DF64; SetMainCallback2(gMain.savedCallback); FreeAllWindowBuffers(); - - gSaveBlock2Ptr->optionsTextSpeed = (u8) sOptionsMenuPtr->option[MENUITEM_TEXTSPEED]; - gSaveBlock2Ptr->optionsBattleSceneOff = (u8) sOptionsMenuPtr->option[MENUITEM_BATTLESCENE]; - gSaveBlock2Ptr->optionsBattleStyle = (u8) sOptionsMenuPtr->option[MENUITEM_BATTLESTYLE]; - gSaveBlock2Ptr->optionsSound = sOptionsMenuPtr->option[MENUITEM_SOUND]; - gSaveBlock2Ptr->optionsButtonMode = (u8) sOptionsMenuPtr->option[MENUITEM_BUTTONMODE]; - gSaveBlock2Ptr->optionsWindowFrameType = (u8) sOptionsMenuPtr->option[MENUITEM_FRAMETYPE]; + gSaveBlock2Ptr->optionsTextSpeed = sOptionMenuPtr->option[MENUITEM_TEXTSPEED]; + gSaveBlock2Ptr->optionsBattleSceneOff = sOptionMenuPtr->option[MENUITEM_BATTLESCENE]; + gSaveBlock2Ptr->optionsBattleStyle = sOptionMenuPtr->option[MENUITEM_BATTLESTYLE]; + gSaveBlock2Ptr->optionsSound = sOptionMenuPtr->option[MENUITEM_SOUND]; + gSaveBlock2Ptr->optionsButtonMode = sOptionMenuPtr->option[MENUITEM_BUTTONMODE]; + gSaveBlock2Ptr->optionsWindowFrameType = sOptionMenuPtr->option[MENUITEM_FRAMETYPE]; SetPokemonCryStereo(gSaveBlock2Ptr->optionsSound); - Free(sOptionsMenuPtr); - sOptionsMenuPtr = NULL; + FREE_AND_SET_NULL(sOptionMenuPtr); DestroyTask(taskId); } - - -//sub_8088BD0 -static void sub_8088BD0(void) +static void PrintOptionMenuHeader(void) { - FillWindowPixelBuffer(0, 0x11); - AddTextPrinterParameterized(WIN_TEXT_OPTION, 2, gText_MenuOptionOption, 8, 1, TEXT_SPEED_FF, NULL); + FillWindowPixelBuffer(0, PIXEL_FILL(1)); + AddTextPrinterParameterized(WIN_TEXT_OPTION, 2, gText_MenuOption, 8, 1, TEXT_SPEED_FF, NULL); PutWindowTilemap(0); CopyWindowToVram(0, 3); } - -//sub_8088C0C static void sub_8088C0C(void) { u8 h; @@ -903,27 +555,23 @@ static void sub_8088C0C(void) CopyBgTilemapBufferToVram(1); } -//sub_8088D8C -static void sub_8088D8C(void) +static void LoadOptionMenuItemNames(void) { u8 i; - FillWindowPixelBuffer(1, 0x11); + FillWindowPixelBuffer(1, PIXEL_FILL(1)); for (i = 0; i < MENUITEM_COUNT; i++) { - AddTextPrinterParameterized(1, 2, sOptionMenuItemsNames[i], 8, (u8) ((i*(GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT))) + 2) - i, 0xFF, 0); + AddTextPrinterParameterized(WIN_OPTIONS, 2, sOptionMenuItemsNames[i], 8, (u8)((i * (GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT))) + 2) - i, TEXT_SPEED_FF, NULL); } } - -//sub_8088DE0 static void sub_8088DE0(u16 selection) { u16 v1, v2; v1 = GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT); v2 = selection * (v1 - 1) + 0x3A; - SetGpuReg(0x44, (v2 << 8) | (v2 + v1)); - SetGpuReg(0x40, 0x10E0); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(v2, v2 + v1)); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0x10, 0xE0)); } - diff --git a/src/poison.c b/src/poison.c index 004e9aa98..7a0788c29 100644 --- a/src/poison.c +++ b/src/poison.c @@ -134,7 +134,7 @@ static const union AffineAnimCmd gUnknown_83E6A68[] = AFFINEANIMCMD_JUMP(0), }; -static const union AffineAnimCmd *const gUnknown_83E6A80[] = +const union AffineAnimCmd *const gUnknown_83E6A80[] = { gUnknown_83E6A68, }; diff --git a/src/pokemon.c b/src/pokemon.c index 57633dbad..9aaddc142 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -2899,7 +2899,7 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data) struct PokemonSubstruct2 *substruct2 = NULL; struct PokemonSubstruct3 *substruct3 = NULL; - if (field > MON_DATA_10) + if (field > MON_DATA_ENCRYPT_SEPARATOR) { substruct0 = &(GetSubstruct(boxMon, boxMon->personality, 0)->type0); substruct1 = &(GetSubstruct(boxMon, boxMon->personality, 1)->type1); @@ -2995,7 +2995,7 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data) case MON_DATA_CHECKSUM: retVal = boxMon->checksum; break; - case MON_DATA_10: + case MON_DATA_ENCRYPT_SEPARATOR: retVal = boxMon->unknown; break; case MON_DATA_SPECIES: @@ -3236,7 +3236,7 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data) break; } - if (field > MON_DATA_10) + if (field > MON_DATA_ENCRYPT_SEPARATOR) EncryptBoxMon(boxMon); return retVal; @@ -3323,7 +3323,7 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) struct PokemonSubstruct2 *substruct2 = NULL; struct PokemonSubstruct3 *substruct3 = NULL; - if (field > MON_DATA_10) + if (field > MON_DATA_ENCRYPT_SEPARATOR) { substruct0 = &(GetSubstruct(boxMon, boxMon->personality, 0)->type0); substruct1 = &(GetSubstruct(boxMon, boxMon->personality, 1)->type1); @@ -3382,7 +3382,7 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) case MON_DATA_CHECKSUM: SET16(boxMon->checksum); break; - case MON_DATA_10: + case MON_DATA_ENCRYPT_SEPARATOR: SET16(boxMon->unknown); break; case MON_DATA_SPECIES: @@ -3582,7 +3582,7 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) break; } - if (field > MON_DATA_10) + if (field > MON_DATA_ENCRYPT_SEPARATOR) { boxMon->checksum = CalculateBoxMonChecksum(boxMon); EncryptBoxMon(boxMon); @@ -6094,7 +6094,6 @@ static void OakSpeechNidoranFSetupTemplateDummy(struct OakSpeechNidoranFStruct * } } -#ifdef NONMATCHING struct OakSpeechNidoranFStruct *OakSpeechNidoranFSetup(u8 battlePosition, bool8 enable) { s32 size; @@ -6134,8 +6133,7 @@ struct OakSpeechNidoranFStruct *OakSpeechNidoranFSetup(u8 battlePosition, bool8 battlePosition = 1; if (battlePosition > 8) battlePosition = 8; - // The following two statements refused to cooperate. - sOakSpeechNidoranResources->spriteCount = battlePosition; + sOakSpeechNidoranResources->spriteCount = (battlePosition << 16) >> 16; sOakSpeechNidoranResources->battlePosition = battlePosition; sOakSpeechNidoranResources->frameCount = 4; sOakSpeechNidoranResources->enable2 = FALSE; @@ -6151,8 +6149,11 @@ struct OakSpeechNidoranFStruct *OakSpeechNidoranFSetup(u8 battlePosition, bool8 } else { - for (i = 0; i < (s8)sOakSpeechNidoranResources->spriteCount; ++i) - sOakSpeechNidoranResources->bufferPtrs[i] = &sOakSpeechNidoranResources->dataBuffer[sOakSpeechNidoranResources->sizePerSprite * i]; + do + { + for (i = 0; i < (s8)sOakSpeechNidoranResources->spriteCount; ++i) + sOakSpeechNidoranResources->bufferPtrs[i] = &sOakSpeechNidoranResources->dataBuffer[sOakSpeechNidoranResources->sizePerSprite * i]; + } while (0); } sOakSpeechNidoranResources->templates = AllocZeroed(sizeof(struct SpriteTemplate) * sOakSpeechNidoranResources->spriteCount); sOakSpeechNidoranResources->frameImages = AllocZeroed(sOakSpeechNidoranResources->spriteCount * sizeof(struct SpriteFrameImage) * sOakSpeechNidoranResources->frameCount); @@ -6200,351 +6201,6 @@ struct OakSpeechNidoranFStruct *OakSpeechNidoranFSetup(u8 battlePosition, bool8 } return sOakSpeechNidoranResources; } -#else -NAKED -struct OakSpeechNidoranFStruct *OakSpeechNidoranFSetup(u8 battlePosition, bool8 enable) -{ - asm_unified("\n\ - push {r4-r7,lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - lsls r1, 24\n\ - lsrs r5, r1, 24\n\ - movs r0, 0\n\ - mov r8, r0\n\ - ldr r4, _08044B34 @ =sOakSpeechNidoranResources\n\ - ldr r1, [r4]\n\ - cmp r1, 0\n\ - beq _08044B1E\n\ - ldrb r0, [r1, 0x2]\n\ - cmp r0, 0xA3\n\ - beq _08044B2E\n\ - adds r0, r1, 0\n\ - movs r1, 0\n\ - movs r2, 0x18\n\ - bl memset\n\ - mov r1, r8\n\ - str r1, [r4]\n\ - _08044B1E:\n\ - ldr r4, _08044B34 @ =sOakSpeechNidoranResources\n\ - movs r0, 0x18\n\ - bl AllocZeroed\n\ - adds r2, r0, 0\n\ - str r2, [r4]\n\ - cmp r2, 0\n\ - bne _08044B38\n\ - _08044B2E:\n\ - movs r0, 0\n\ - b _08044D70\n\ - .align 2, 0\n\ - _08044B34: .4byte sOakSpeechNidoranResources\n\ - _08044B38:\n\ - cmp r5, 0\n\ - beq _08044B94\n\ - cmp r5, 0x1\n\ - bne _08044B94\n\ - cmp r6, 0x4\n\ - bne _08044B5E\n\ - ldrb r1, [r2]\n\ - movs r0, 0x10\n\ - negs r0, r0\n\ - ands r0, r1\n\ - movs r1, 0x4\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r2, [r4]\n\ - ldrb r1, [r2]\n\ - movs r0, 0xF\n\ - ands r0, r1\n\ - movs r1, 0x40\n\ - b _08044B7C\n\ - _08044B5E:\n\ - cmp r6, 0x4\n\ - bls _08044B64\n\ - movs r6, 0\n\ - _08044B64:\n\ - ldrb r1, [r2]\n\ - movs r0, 0x10\n\ - negs r0, r0\n\ - ands r0, r1\n\ - movs r1, 0x1\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r2, [r4]\n\ - ldrb r1, [r2]\n\ - movs r0, 0xF\n\ - ands r0, r1\n\ - movs r1, 0x10\n\ - _08044B7C:\n\ - orrs r0, r1\n\ - strb r0, [r2]\n\ - ldr r2, _08044B90 @ =sOakSpeechNidoranResources\n\ - ldr r1, [r2]\n\ - movs r0, 0x4\n\ - strb r0, [r1, 0x1]\n\ - ldr r1, [r2]\n\ - movs r0, 0x1\n\ - strb r0, [r1, 0x3]\n\ - b _08044BD0\n\ - .align 2, 0\n\ - _08044B90: .4byte sOakSpeechNidoranResources\n\ - _08044B94:\n\ - cmp r6, 0\n\ - bne _08044B9A\n\ - movs r6, 0x1\n\ - _08044B9A:\n\ - cmp r6, 0x8\n\ - bls _08044BA0\n\ - movs r6, 0x8\n\ - _08044BA0:\n\ - ldr r4, _08044C10 @ =sOakSpeechNidoranResources\n\ - ldr r3, [r4]\n\ - movs r0, 0xF\n\ - adds r1, r6, 0\n\ - ands r1, r0\n\ - ldrb r2, [r3]\n\ - movs r0, 0x10\n\ - negs r0, r0\n\ - ands r0, r2\n\ - orrs r0, r1\n\ - strb r0, [r3]\n\ - ldr r2, [r4]\n\ - lsls r3, r6, 4\n\ - ldrb r1, [r2]\n\ - movs r0, 0xF\n\ - ands r0, r1\n\ - orrs r0, r3\n\ - strb r0, [r2]\n\ - ldr r1, [r4]\n\ - movs r2, 0\n\ - movs r0, 0x4\n\ - strb r0, [r1, 0x1]\n\ - ldr r0, [r4]\n\ - strb r2, [r0, 0x3]\n\ - _08044BD0:\n\ - ldr r5, _08044C10 @ =sOakSpeechNidoranResources\n\ - ldr r0, [r5]\n\ - ldrb r1, [r0, 0x1]\n\ - lsls r1, 11\n\ - str r1, [r0, 0x4]\n\ - ldrb r0, [r0]\n\ - lsls r0, 28\n\ - lsrs r0, 28\n\ - muls r0, r1\n\ - bl AllocZeroed\n\ - ldr r1, [r5]\n\ - str r0, [r1, 0x8]\n\ - ldrb r0, [r1]\n\ - lsls r0, 28\n\ - lsrs r0, 23\n\ - bl AllocZeroed\n\ - adds r2, r0, 0\n\ - ldr r1, [r5]\n\ - str r2, [r1, 0xC]\n\ - ldr r0, [r1, 0x8]\n\ - cmp r0, 0\n\ - beq _08044C04\n\ - cmp r2, 0\n\ - bne _08044C14\n\ - _08044C04:\n\ - movs r0, 0x1\n\ - mov r1, r8\n\ - orrs r1, r0\n\ - mov r8, r1\n\ - b _08044C44\n\ - .align 2, 0\n\ - _08044C10: .4byte sOakSpeechNidoranResources\n\ - _08044C14:\n\ - ldrb r0, [r1]\n\ - lsls r0, 28\n\ - movs r4, 0\n\ - adds r3, r5, 0\n\ - cmp r0, 0\n\ - beq _08044C44\n\ - _08044C20:\n\ - ldr r3, [r5]\n\ - ldr r0, [r3, 0xC]\n\ - lsls r1, r4, 2\n\ - adds r1, r0\n\ - ldr r0, [r3, 0x4]\n\ - adds r2, r0, 0\n\ - muls r2, r4\n\ - ldr r0, [r3, 0x8]\n\ - adds r0, r2\n\ - str r0, [r1]\n\ - adds r0, r4, 0x1\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - ldrb r0, [r3]\n\ - lsls r0, 28\n\ - lsrs r0, 28\n\ - cmp r4, r0\n\ - blt _08044C20\n\ - _08044C44:\n\ - ldr r5, _08044C8C @ =sOakSpeechNidoranResources\n\ - ldr r0, [r5]\n\ - ldrb r1, [r0]\n\ - lsls r1, 28\n\ - lsrs r1, 28\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 3\n\ - bl AllocZeroed\n\ - ldr r2, [r5]\n\ - str r0, [r2, 0x10]\n\ - ldrb r1, [r2]\n\ - lsls r1, 28\n\ - lsrs r1, 28\n\ - ldrb r0, [r2, 0x1]\n\ - lsls r0, 3\n\ - muls r0, r1\n\ - bl AllocZeroed\n\ - adds r2, r0, 0\n\ - ldr r1, [r5]\n\ - str r2, [r1, 0x14]\n\ - ldr r0, [r1, 0x10]\n\ - cmp r0, 0\n\ - beq _08044C7C\n\ - cmp r2, 0\n\ - bne _08044C90\n\ - _08044C7C:\n\ - movs r0, 0x2\n\ - mov r1, r8\n\ - orrs r1, r0\n\ - lsls r0, r1, 24\n\ - lsrs r0, 24\n\ - mov r8, r0\n\ - b _08044CE2\n\ - .align 2, 0\n\ - _08044C8C: .4byte sOakSpeechNidoranResources\n\ - _08044C90:\n\ - movs r4, 0\n\ - ldrb r0, [r1, 0x1]\n\ - ldrb r1, [r1]\n\ - lsls r1, 28\n\ - lsrs r1, 28\n\ - muls r0, r1\n\ - adds r3, r5, 0\n\ - cmp r4, r0\n\ - bge _08044CC6\n\ - adds r7, r3, 0\n\ - movs r5, 0x80\n\ - lsls r5, 4\n\ - _08044CA8:\n\ - ldr r2, [r7]\n\ - ldr r1, [r2, 0x14]\n\ - lsls r0, r4, 3\n\ - adds r0, r1\n\ - strh r5, [r0, 0x4]\n\ - adds r0, r4, 0x1\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - ldrb r1, [r2, 0x1]\n\ - ldrb r0, [r2]\n\ - lsls r0, 28\n\ - lsrs r0, 28\n\ - muls r0, r1\n\ - cmp r4, r0\n\ - blt _08044CA8\n\ - _08044CC6:\n\ - ldr r0, [r3]\n\ - ldrb r4, [r0, 0x3]\n\ - cmp r4, 0\n\ - beq _08044CDA\n\ - cmp r4, 0x1\n\ - bne _08044CDA\n\ - adds r1, r6, 0\n\ - bl OakSpeechNidoranFSetupTemplate\n\ - b _08044CE2\n\ - _08044CDA:\n\ - ldr r0, _08044D60 @ =sOakSpeechNidoranResources\n\ - ldr r0, [r0]\n\ - bl OakSpeechNidoranFSetupTemplateDummy\n\ - _08044CE2:\n\ - movs r0, 0x2\n\ - mov r1, r8\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08044D12\n\ - ldr r4, _08044D60 @ =sOakSpeechNidoranResources\n\ - ldr r0, [r4]\n\ - ldr r0, [r0, 0x14]\n\ - cmp r0, 0\n\ - beq _08044D00\n\ - bl Free\n\ - ldr r1, [r4]\n\ - movs r0, 0\n\ - str r0, [r1, 0x14]\n\ - _08044D00:\n\ - ldr r0, [r4]\n\ - ldr r0, [r0, 0x10]\n\ - cmp r0, 0\n\ - beq _08044D12\n\ - bl Free\n\ - ldr r1, [r4]\n\ - movs r0, 0\n\ - str r0, [r1, 0x10]\n\ - _08044D12:\n\ - movs r0, 0x1\n\ - mov r1, r8\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _08044D42\n\ - ldr r4, _08044D60 @ =sOakSpeechNidoranResources\n\ - ldr r0, [r4]\n\ - ldr r0, [r0, 0xC]\n\ - cmp r0, 0\n\ - beq _08044D30\n\ - bl Free\n\ - ldr r1, [r4]\n\ - movs r0, 0\n\ - str r0, [r1, 0xC]\n\ - _08044D30:\n\ - ldr r0, [r4]\n\ - ldr r0, [r0, 0x8]\n\ - cmp r0, 0\n\ - beq _08044D42\n\ - bl Free\n\ - ldr r1, [r4]\n\ - movs r0, 0\n\ - str r0, [r1, 0x8]\n\ - _08044D42:\n\ - mov r0, r8\n\ - cmp r0, 0\n\ - beq _08044D64\n\ - ldr r4, _08044D60 @ =sOakSpeechNidoranResources\n\ - ldr r0, [r4]\n\ - movs r1, 0\n\ - movs r2, 0x18\n\ - bl memset\n\ - ldr r0, [r4]\n\ - bl Free\n\ - movs r0, 0\n\ - str r0, [r4]\n\ - b _08044D6C\n\ - .align 2, 0\n\ - _08044D60: .4byte sOakSpeechNidoranResources\n\ - _08044D64:\n\ - ldr r0, _08044D7C @ =sOakSpeechNidoranResources\n\ - ldr r1, [r0]\n\ - movs r0, 0xA3\n\ - strb r0, [r1, 0x2]\n\ - _08044D6C:\n\ - ldr r0, _08044D7C @ =sOakSpeechNidoranResources\n\ - ldr r0, [r0]\n\ - _08044D70:\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ - _08044D7C: .4byte sOakSpeechNidoranResources\n\ - "); -} -#endif void OakSpeechNidoranFFreeResources(void) { diff --git a/src/shop.c b/src/shop.c index f1dda35b4..3dd9ba102 100644 --- a/src/shop.c +++ b/src/shop.c @@ -105,46 +105,26 @@ static u8 sub_809AB7C(u32 a0) return 0; } -/* -void (const u16 *list) //SetShopItemsForSale -{ - u16 i; - gShopData.itemList = list; - gShopData.itemCount = 0; - if (list[0] == 0) - return; - - i = 0; - while (list[i] != 0) - { - gShopData.itemCount++; - if (list[i] == 0) - return; - i++; - } -} -*/ - -//#ifdef NONMATCHING -// WHAT THE FUCK IS UP WITH THIS FUNCTION -void sub_809ABD8(const u16 *items) +//SetShopItemsForSale +void sub_809ABD8(const u16 *items) //I really don't know what GameFreak was thinking here.. { - //const u16* mart = items; - u16 item; - gShopData.itemList = items; - gShopData.itemCount = 0; - - while (1) - { - item = items[++gShopData.itemCount]; - } + struct ShopData *mart; + //u16 i; + + mart = &gShopData; + mart->itemList = items; + mart->itemCount = 0; + + //i = 0; + if (mart->itemList[0] == 0) + return; + + do { + ++gShopData.itemCount; + //i = gShopData.itemCount; + //} while (mart->itemList[i]); + } while (mart->itemList[gShopData.itemCount]); } -/* -#else -NAKED -void sub_809ABD8(const u16 *items) - asm_unified("\t -*/ //SetShopMenuCallback void sub_809AC04(MainCallback callback) @@ -165,6 +145,6 @@ static void sub_809AC10(u8 taskId) sub_809ACF8(taskId); return; } - gUnknown_83DF09C.func.void_u8(Menu_GetCursorPos()); + //gUnknown_83DF09C.func.void_u8(Menu_GetCursorPos()); } diff --git a/src/tileset_anims.c b/src/tileset_anims.c index 30f390512..a8539a5d8 100644 --- a/src/tileset_anims.c +++ b/src/tileset_anims.c @@ -23,14 +23,118 @@ static void (*sSecondaryTilesetAnimCallback)(u16); static void _InitPrimaryTilesetAnimation(void); static void _InitSecondaryTilesetAnimation(void); -extern const u16 *const gUnknown_83A7660[]; -extern const u16 *const gUnknown_83AA654[]; -extern const u16 *const gUnknown_83AB874[]; -extern const u16 *const gUnknown_83ABDB4[]; -extern const u16 *const gUnknown_83AC1E8[]; -extern const u16 *const gUnknown_83AC5F8[]; -extern const u16 *const gUnknown_83AC7C8[]; -extern const u16 *const gUnknown_83AC950[]; +static const u16 gUnknown_83A73E0[] = INCBIN_U16("graphics/tileset_anims/anim_0_0.bin"); +static const u16 gUnknown_83A7460[] = INCBIN_U16("graphics/tileset_anims/anim_0_1.bin"); +static const u16 gUnknown_83A74E0[] = INCBIN_U16("graphics/tileset_anims/anim_0_2.bin"); +static const u16 gUnknown_83A7560[] = INCBIN_U16("graphics/tileset_anims/anim_0_3.bin"); +static const u16 gUnknown_83A75E0[] = INCBIN_U16("graphics/tileset_anims/anim_0_4.bin"); + +static const u16 *const gUnknown_83A7660[] = { + gUnknown_83A73E0, + gUnknown_83A7460, + gUnknown_83A74E0, + gUnknown_83A7560, + gUnknown_83A75E0 +}; + +static const u16 gUnknown_83A7674[] = INCBIN_U16("graphics/tileset_anims/anim_1_0.bin"); +static const u16 gUnknown_83A7C74[] = INCBIN_U16("graphics/tileset_anims/anim_1_1.bin"); +static const u16 gUnknown_83A8274[] = INCBIN_U16("graphics/tileset_anims/anim_1_2.bin"); +static const u16 gUnknown_83A8874[] = INCBIN_U16("graphics/tileset_anims/anim_1_3.bin"); +static const u16 gUnknown_83A8E74[] = INCBIN_U16("graphics/tileset_anims/anim_1_4.bin"); +static const u16 gUnknown_83A9474[] = INCBIN_U16("graphics/tileset_anims/anim_1_5.bin"); +static const u16 gUnknown_83A9A74[] = INCBIN_U16("graphics/tileset_anims/anim_1_6.bin"); +static const u16 gUnknown_83AA074[] = INCBIN_U16("graphics/tileset_anims/anim_1_7.bin"); + +static const u16 *const gUnknown_83AA654[] = { + gUnknown_83A7674, + gUnknown_83A7C74, + gUnknown_83A8274, + gUnknown_83A8874, + gUnknown_83A8E74, + gUnknown_83A9474, + gUnknown_83A9A74, + gUnknown_83AA074 +}; + +static const u16 gUnknown_83AA674[] = INCBIN_U16("graphics/tileset_anims/anim_2_0.bin"); +static const u16 gUnknown_83AA8B4[] = INCBIN_U16("graphics/tileset_anims/anim_2_1.bin"); +static const u16 gUnknown_83AAAF4[] = INCBIN_U16("graphics/tileset_anims/anim_2_2.bin"); +static const u16 gUnknown_83AAD34[] = INCBIN_U16("graphics/tileset_anims/anim_2_3.bin"); +static const u16 gUnknown_83AAF74[] = INCBIN_U16("graphics/tileset_anims/anim_2_4.bin"); +static const u16 gUnknown_83AB1B4[] = INCBIN_U16("graphics/tileset_anims/anim_2_5.bin"); +static const u16 gUnknown_83AB3F4[] = INCBIN_U16("graphics/tileset_anims/anim_2_6.bin"); +static const u16 gUnknown_83AB634[] = INCBIN_U16("graphics/tileset_anims/anim_2_7.bin"); + +static const u16 *const gUnknown_83AB874[] = { + gUnknown_83AA674, + gUnknown_83AA8B4, + gUnknown_83AAAF4, + gUnknown_83AAD34, + gUnknown_83AAF74, + gUnknown_83AB1B4, + gUnknown_83AB3F4, + gUnknown_83AB634 +}; + +static const u16 gUnknown_83AB894[] = INCBIN_U16("graphics/tileset_anims/anim_3_0.bin"); +static const u16 gUnknown_83AB994[] = INCBIN_U16("graphics/tileset_anims/anim_3_1.bin"); +static const u16 gUnknown_83ABA94[] = INCBIN_U16("graphics/tileset_anims/anim_3_2.bin"); +static const u16 gUnknown_83ABB94[] = INCBIN_U16("graphics/tileset_anims/anim_3_3.bin"); +static const u16 gUnknown_83ABC94[] = INCBIN_U16("graphics/tileset_anims/anim_3_4.bin"); +static const u16 gUnknown_83ABD94[16] = {}; + +static const u16 *const gUnknown_83ABDB4[] = { + gUnknown_83AB894, + gUnknown_83AB994, + gUnknown_83ABA94, + gUnknown_83ABB94, + gUnknown_83ABC94 +}; + +static const u16 gUnknown_83ABDC8[] = INCBIN_U16("graphics/tileset_anims/anim_4_0.bin"); +static const u16 gUnknown_83ABEC8[] = INCBIN_U16("graphics/tileset_anims/anim_4_1.bin"); +static const u16 gUnknown_83ABFC8[] = INCBIN_U16("graphics/tileset_anims/anim_4_2.bin"); +static const u16 gUnknown_83AC0C8[] = INCBIN_U16("graphics/tileset_anims/anim_4_3.bin"); +static const u16 gUnknown_83AC1C8[0x10] = {}; + +static const u16 *const gUnknown_83AC1E8[] = { + gUnknown_83ABDC8, + gUnknown_83ABEC8, + gUnknown_83ABFC8, + gUnknown_83AC0C8 +}; + +static const u16 gUnknown_83AC1F8[] = INCBIN_U16("graphics/tileset_anims/anim_5_0.bin"); +static const u16 gUnknown_83AC2F8[] = INCBIN_U16("graphics/tileset_anims/anim_5_1.bin"); +static const u16 gUnknown_83AC3F8[] = INCBIN_U16("graphics/tileset_anims/anim_5_2.bin"); +static const u16 gUnknown_83AC4F8[] = INCBIN_U16("graphics/tileset_anims/anim_5_3.bin"); + +static const u16 *const gUnknown_83AC5F8[] = { + gUnknown_83AC1F8, + gUnknown_83AC2F8, + gUnknown_83AC3F8, + gUnknown_83AC4F8 +}; + +static const u16 gUnknown_83AC608[] = INCBIN_U16("graphics/tileset_anims/anim_6_0.bin"); +static const u16 gUnknown_83AC6E8[] = INCBIN_U16("graphics/tileset_anims/anim_6_1.bin"); + +static const u16 *const gUnknown_83AC7C8[] = { + gUnknown_83AC608, + gUnknown_83AC6E8 +}; + +static const u16 gUnknown_83AC7D0[] = INCBIN_U16("graphics/tileset_anims/anim_7_0.bin"); +static const u16 gUnknown_83AC850[] = INCBIN_U16("graphics/tileset_anims/anim_7_1.bin"); +static const u16 gUnknown_83AC8D0[] = INCBIN_U16("graphics/tileset_anims/anim_7_2.bin"); + +static const u16 *const gUnknown_83AC950[] = { + gUnknown_83AC7D0, + gUnknown_83AC850, + gUnknown_83AC8D0, + gUnknown_83AC850 +}; static void ResetTilesetAnimBuffer(void) { @@ -105,26 +209,17 @@ static void _InitSecondaryTilesetAnimation(void) static void sub_80700A4(u16 timer) { - const u16 *const *ptr = gUnknown_83A7660; - u16 i = timer % 5; - - AppendTilesetAnimToBuffer(ptr[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(508)), 0x80); + AppendTilesetAnimToBuffer(gUnknown_83A7660[timer % NELEMS(gUnknown_83A7660)], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(508)), 0x80); } static void sub_80700D0(u16 timer) { - const u16 *const *ptr = gUnknown_83AA654; - u16 i = timer % 8; - - AppendTilesetAnimToBuffer(ptr[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(416)), 0x600); + AppendTilesetAnimToBuffer(gUnknown_83AA654[timer % NELEMS(gUnknown_83AA654)], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(416)), 0x600); } static void sub_80700F8(u16 timer) { - const u16 *const *ptr = gUnknown_83AB874; - u16 i = timer % 8; - - AppendTilesetAnimToBuffer(ptr[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(464)), 0x240); + AppendTilesetAnimToBuffer(gUnknown_83AB874[timer % NELEMS(gUnknown_83AB874)], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(464)), 0x240); } static void sub_8070120(u16 timer) @@ -146,10 +241,7 @@ void sub_8070154(void) static void sub_807017C(u16 timer) { - const u16 *const *ptr = gUnknown_83ABDB4; - u16 i = timer % 5; - - AppendTilesetAnimToBuffer(ptr[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(744)), 0x100); + AppendTilesetAnimToBuffer(gUnknown_83ABDB4[timer % NELEMS(gUnknown_83ABDB4)], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(744)), 0x100); } static void sub_80701AC(u16 timer) @@ -167,10 +259,7 @@ void sub_80701D8(void) static void sub_80701FC(u16 timer) { - const u16 *const *ptr = gUnknown_83AC1E8; - u16 i = timer % 4; - - AppendTilesetAnimToBuffer(ptr[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(976)), 0x100); + AppendTilesetAnimToBuffer(gUnknown_83AC1E8[timer % NELEMS(gUnknown_83AC1E8)], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(976)), 0x100); } static void sub_8070224(u16 timer) @@ -188,10 +277,7 @@ void sub_8070250(void) static void sub_8070274(u16 timer) { - const u16 *const *ptr = gUnknown_83AC5F8; - u16 i = timer % 4; - - AppendTilesetAnimToBuffer(ptr[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(896)), 0x100); + AppendTilesetAnimToBuffer(gUnknown_83AC5F8[timer % NELEMS(gUnknown_83AC5F8)], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(896)), 0x100); } static void sub_807029C(u16 timer) @@ -209,8 +295,8 @@ void sub_80702B4(void) static void sub_80702DC(u16 timer) { - u16 i = timer % 2; - + u16 i = timer % NELEMS(gUnknown_83AC7C8); + AppendTilesetAnimToBuffer(gUnknown_83AC7C8[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(880)), 0xE0); } @@ -229,7 +315,7 @@ void sub_807031C(void) static void sub_8070340(u16 timer) { - u16 i = timer % 4; + u16 i = timer % NELEMS(gUnknown_83AC950); AppendTilesetAnimToBuffer(gUnknown_83AC950[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(739)), 0x80); } diff --git a/src/tm_case.c b/src/tm_case.c index 260efaa53..25fe9a72c 100644 --- a/src/tm_case.c +++ b/src/tm_case.c @@ -305,7 +305,7 @@ static void CB2_SetUpTMCaseUI_Blocking(void) { while (1) { - if (sub_80BF72C() == TRUE) + if ((u8)sub_80BF72C() == TRUE) break; if (DoSetUpTMCaseUI() == TRUE) break; @@ -734,7 +734,7 @@ static void Task_TMCaseMain(u8 taskId) if (!gPaletteFade.active) { - if (sub_80BF72C() != TRUE) + if ((u8)sub_80BF72C() != TRUE) { input = ListMenu_ProcessInput(data[0]); ListMenuGetScrollAndRow(data[0], &sTMCaseStaticResources.scrollOffset, &sTMCaseStaticResources.selectedRow); @@ -815,7 +815,7 @@ static void Task_TMContextMenu_HandleInput(u8 taskId) { s8 input; - if (sub_80BF72C() != TRUE) + if ((u8)sub_80BF72C() != TRUE) { input = Menu_ProcessInputNoWrapAround(); switch (input) diff --git a/src/trade_scene.c b/src/trade_scene.c index 7b738aa52..fc0e97573 100644 --- a/src/trade_scene.c +++ b/src/trade_scene.c @@ -488,7 +488,7 @@ static const struct WindowTemplate gUnknown_826D1BC[] = { }, DUMMY_WIN_TEMPLATE }; -const struct WindowTemplate gUnknown_826D1CC = { +const struct WindowTemplate gTradeEvolutionSceneYesNoWindowTemplate = { .bg = 0, .tilemapLeft = 21, .tilemapTop = 9, @@ -881,7 +881,7 @@ void CB2_InitTradeAnim_LinkTrade(void) break; case 8: LoadTradeMonPic(1, 1); - sub_80504B0(); + LinkTradeDrawWindow(); gMain.state++; break; case 9: @@ -899,7 +899,7 @@ void CB2_InitTradeAnim_LinkTrade(void) gMain.state++; break; case 11: - sub_805049C(); + InitTradeSequenceBgGpuRegs(); TradeBufferOTnameAndNicknames(); gMain.state++; break; @@ -922,13 +922,13 @@ void CB2_InitTradeAnim_LinkTrade(void) UpdatePaletteFade(); } -void sub_805049C(void) +void InitTradeSequenceBgGpuRegs(void) { SetTradeSequenceBgGpuRegs(5); SetTradeSequenceBgGpuRegs(0); } -void sub_80504B0(void) +void LinkTradeDrawWindow(void) { FillWindowPixelBuffer(0, PIXEL_FILL(15)); PutWindowTilemap(0); @@ -2552,7 +2552,7 @@ static void sub_8053E8C(void) { case 0: gMain.state++; - StringExpandPlaceholders(gStringVar4, gUnknown_841E325); + StringExpandPlaceholders(gStringVar4, gText_CommunicationStandby5); DrawTextOnTradeWindow(0, gStringVar4, 0); break; case 1: |