summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEvan <eroelke@gmail.com>2019-11-21 10:23:49 -0700
committerEvan <eroelke@gmail.com>2019-11-21 10:23:49 -0700
commitb18ec47b1393d562655e50d30acb3de191423581 (patch)
tree7959a1477120baf656599794b423aa8cc11ea0c0 /src
parent359d345913d7f5ed36c34ede5476fff946318ffd (diff)
parent2d284654440cb77365639bf107c31b44326362e3 (diff)
fix conflicts
Diffstat (limited to 'src')
-rw-r--r--src/battle_main.c6
-rw-r--r--src/battle_script_commands.c4
-rw-r--r--src/berry_pouch.c6
-rw-r--r--src/dark.c2
-rw-r--r--src/evolution_graphics.c638
-rw-r--r--src/evolution_scene.c1569
-rw-r--r--src/ice.c2
-rw-r--r--src/item_pc.c2
-rw-r--r--src/menu_helpers.c6
-rw-r--r--src/new_menu_helpers.c50
-rw-r--r--src/option_menu.c750
-rw-r--r--src/poison.c2
-rw-r--r--src/pokemon.c368
-rw-r--r--src/shop.c58
-rw-r--r--src/tileset_anims.c156
-rw-r--r--src/tm_case.c6
-rw-r--r--src/trade_scene.c12
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);
+}
diff --git a/src/ice.c b/src/ice.c
index 9914a6992..79966e597 100644
--- a/src/ice.c
+++ b/src/ice.c
@@ -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: