summaryrefslogtreecommitdiff
path: root/src/minigame_countdown.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/minigame_countdown.c')
-rw-r--r--src/minigame_countdown.c482
1 files changed, 304 insertions, 178 deletions
diff --git a/src/minigame_countdown.c b/src/minigame_countdown.c
index 01fb05fd8..2d4d98138 100644
--- a/src/minigame_countdown.c
+++ b/src/minigame_countdown.c
@@ -5,279 +5,378 @@
#include "sound.h"
#include "task.h"
#include "trig.h"
+#include "minigame_countdown.h"
#include "constants/songs.h"
+/*
+ This file contains two types of '3-2-1 Start' countdowns intended for use by the wireless minigames.
+
+ One is static, where the numbers simply appear and disappear without moving. This version is unused.
+ The other (used) version has the numbers squish and bounce up as they appear.
+*/
+
+#define TAG_STATIC_COUNTDOWN 0x2000
+
+enum {
+ STATE_IDLE = 1,
+ STATE_START,
+ STATE_RUN,
+ STATE_END,
+};
+
+enum {
+ FUNC_INIT,
+ FUNC_FREE,
+ FUNC_START,
+ FUNC_RUN,
+};
+
+enum {
+ ANIM_THREE,
+ ANIM_TWO,
+ ANIM_ONE,
+ ANIM_START_LEFT,
+ ANIM_START_MID,
+ ANIM_START_RIGHT,
+};
+
extern const struct OamData gOamData_AffineOff_ObjNormal_32x32;
-static void sub_802E6D0(u8 taskId);
-static void sub_802E83C(u8 taskId);
-static void sub_802E8C8(u8 taskId);
-static void sub_802EA50(u8 taskId);
-static void sub_802EAB0(u8 taskId);
-static void Task_MinigameCountdown(u8 taskId);
-static bool32 RunMinigameCountdownDigitsAnim(u8 spriteId);
-static bool32 IsStartGraphicAnimRunning(u8 spriteId);
-static void Load321StartGfx(u16 tileTag, u16 palTag);
-static u8 CreateNumberSprite(u16 tileTag, u16 palTag, s16 x, s16 y, u8 subpriority);
-static void CreateStartSprite(u16 tileTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 *spriteId1, s16 *spriteId2);
-static void InitStartGraphic(u8 spriteId1, u8 spriteId2, u8 spriteId3);
-static void SpriteCB_Start(struct Sprite *sprite);
+static void Task_StaticCountdown(u8 taskId);
+static void Task_StaticCountdown_Init(u8 taskId);
+static void Task_StaticCountdown_Free(u8 taskId);
+static void Task_StaticCountdown_Start(u8 taskId);
+static void Task_StaticCountdown_Run(u8 taskId);
-static const u16 sSpritePal_321Start_2[] = INCBIN_U16("graphics/link_games/321start_2.gbapal");
-static const u32 sSpriteSheet_321Start_2[] = INCBIN_U32("graphics/link_games/321start_2.4bpp.lz");
+static const u16 s321Start_Static_Pal[] = INCBIN_U16("graphics/minigame_countdown/321start_static.gbapal");
+static const u32 s321Start_Static_Gfx[] = INCBIN_U32("graphics/minigame_countdown/321start_static.4bpp.lz");
-static const struct CompressedSpriteSheet gUnknown_082FE6C8[] =
+static const struct CompressedSpriteSheet sSpriteSheet_321Start_Static[] =
{
- {sSpriteSheet_321Start_2, 0xC00, 0x2000},
+ {s321Start_Static_Gfx, 0xC00, TAG_STATIC_COUNTDOWN},
{},
};
-static const struct SpritePalette gUnknown_082FE6D8[] =
+static const struct SpritePalette sSpritePalette_321Start_Static[] =
{
- {sSpritePal_321Start_2, 0x2000},
+ {s321Start_Static_Pal, TAG_STATIC_COUNTDOWN},
{},
};
-static const union AnimCmd sSpriteAnim_82FE6E8[] =
+static const union AnimCmd sAnim_StaticCountdown_Three[] =
{
ANIMCMD_FRAME(0, 0),
ANIMCMD_END
};
-static const union AnimCmd sSpriteAnim_82FE6F0[] =
+static const union AnimCmd sAnim_StaticCountdown_Two[] =
{
ANIMCMD_FRAME(16, 0),
ANIMCMD_END
};
-static const union AnimCmd sSpriteAnim_82FE6F8[] =
+static const union AnimCmd sAnim_StaticCountdown_One[] =
{
ANIMCMD_FRAME(32, 0),
ANIMCMD_END
};
-static const union AnimCmd sSpriteAnim_82FE700[] =
+static const union AnimCmd sAnim_StaticCountdown_StartLeft[] =
{
ANIMCMD_FRAME(64, 0),
ANIMCMD_END
};
-static const union AnimCmd sSpriteAnim_82FE708[] =
+static const union AnimCmd sAnim_StaticCountdown_StartMid[] =
{
ANIMCMD_FRAME(48, 0),
ANIMCMD_END
};
-static const union AnimCmd sSpriteAnim_82FE710[] =
+static const union AnimCmd sAnim_StaticCountdown_StartRight[] =
{
ANIMCMD_FRAME(80, 0),
ANIMCMD_END
};
-static const union AnimCmd *const sSpriteAnimTable_82FE718[] =
+static const union AnimCmd *const sAnims_StaticCountdown[] =
{
- sSpriteAnim_82FE6E8,
- sSpriteAnim_82FE6F0,
- sSpriteAnim_82FE6F8,
- sSpriteAnim_82FE700,
- sSpriteAnim_82FE708,
- sSpriteAnim_82FE710
+ [ANIM_THREE] = sAnim_StaticCountdown_Three,
+ [ANIM_TWO] = sAnim_StaticCountdown_Two,
+ [ANIM_ONE] = sAnim_StaticCountdown_One,
+ [ANIM_START_LEFT] = sAnim_StaticCountdown_StartLeft,
+ [ANIM_START_MID] = sAnim_StaticCountdown_StartMid,
+ [ANIM_START_RIGHT] = sAnim_StaticCountdown_StartRight
};
-static const struct SpriteTemplate gUnknown_082FE730[] =
+static const struct SpriteTemplate sSpriteTemplate_StaticCountdown[] =
{
{
- .tileTag = 0x2000,
- .paletteTag = 0x2000,
+ .tileTag = TAG_STATIC_COUNTDOWN,
+ .paletteTag = TAG_STATIC_COUNTDOWN,
.oam = &gOamData_AffineOff_ObjNormal_32x32,
- .anims = sSpriteAnimTable_82FE718,
+ .anims = sAnims_StaticCountdown,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy,
},
};
-static const TaskFunc gUnknown_082FE748[][4] =
+static const TaskFunc sStaticCountdownFuncs[][4] =
{
{
- sub_802E83C,
- sub_802E8C8,
- sub_802EA50,
- sub_802EAB0
+ [FUNC_INIT] = Task_StaticCountdown_Init,
+ [FUNC_FREE] = Task_StaticCountdown_Free,
+ [FUNC_START] = Task_StaticCountdown_Start,
+ [FUNC_RUN] = Task_StaticCountdown_Run
},
};
-static const u16 sSpritePal_321Start[] = INCBIN_U16("graphics/link_games/321start.gbapal");
-static const u32 sSpriteSheet_321Start[] = INCBIN_U32("graphics/link_games/321start.4bpp.lz");
+#define tState data[0]
+#define tFuncSetId data[1] // These 4 data elements are indexes into
+#define tSpriteTemplateId data[2] // arrays that only have 1 element with
+#define tSpriteSheetId data[3] // data. As such their only legal value
+#define tSpritePalId data[4] // is 0. Unclear why they were used.
+#define tInterval data[5]
+#define tPriority data[6]
+#define tSubpriority data[7]
+#define tNumSprites data[8]
+#define tX data[9]
+#define tY data[10]
+#define tPrevTime data[10] // Re-used
+#define tTimer data[11]
+#define tLinkTimer data[12]
+// 13-15 hold sprite ids
+// tSpriteIds(0) is used for the number sprites, and the leftmost part of 'Start'
+// tSpriteIds(1) is used for the middle part of 'Start'
+// tSpriteIds(2) is used for for the rightmost part of 'Start'
+#define tSpriteIds(i) data[13 + i]
+
+#define sInterval data[1] // Never read
+#define sAnimNum data[2]
+#define sTaskId data[3]
+#define sId data[4] // Never read
+#define sNumberSpriteId data[5] // Never read
// Unused
-static u32 sub_802E63C(u8 funcSetId, u8 taskPriority)
+static u32 CreateStaticCountdownTask(u8 funcSetId, u8 taskPriority)
{
- u8 taskId = CreateTask(sub_802E6D0, taskPriority);
+ u8 taskId = CreateTask(Task_StaticCountdown, taskPriority);
struct Task *task = &gTasks[taskId];
- task->data[0] = 1;
- task->data[1] = funcSetId;
- gUnknown_082FE748[funcSetId][0](taskId);
+ task->tState = STATE_IDLE;
+ task->tFuncSetId = funcSetId;
+ sStaticCountdownFuncs[funcSetId][FUNC_INIT](taskId);
return taskId;
}
-static bool32 sub_802E688(void)
+static bool32 StartStaticCountdown(void)
{
- u8 taskId = FindTaskIdByFunc(sub_802E6D0);
+ u8 taskId = FindTaskIdByFunc(Task_StaticCountdown);
if (taskId == TASK_NONE)
return FALSE;
- gTasks[taskId].data[0] = 2;
+ gTasks[taskId].tState = STATE_START;
return TRUE;
}
-static bool32 sub_802E6BC(void)
+static bool32 IsStaticCountdownRunning(void)
{
- return FuncIsActiveTask(sub_802E6D0);
+ return FuncIsActiveTask(Task_StaticCountdown);
}
-static void sub_802E6D0(u8 taskId)
+static void Task_StaticCountdown(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- switch (data[0])
+ switch (tState)
{
- case 2:
- gUnknown_082FE748[data[1]][2](taskId);
- data[0] = 3;
+ // STATE_IDLE does nothing; wait until started
+ case STATE_START:
+ sStaticCountdownFuncs[tFuncSetId][FUNC_START](taskId);
+ tState = STATE_RUN;
break;
- case 3:
- gUnknown_082FE748[data[1]][3](taskId);
+ case STATE_RUN:
+ sStaticCountdownFuncs[tFuncSetId][FUNC_RUN](taskId);
break;
- case 4:
- gUnknown_082FE748[data[1]][1](taskId);
+ case STATE_END:
+ sStaticCountdownFuncs[tFuncSetId][FUNC_FREE](taskId);
DestroyTask(taskId);
break;
}
}
-static void sub_802E75C(u8 taskId, s16 *data)
+static void StaticCountdown_CreateSprites(u8 taskId, s16 *data)
{
u8 i;
struct Sprite *sprite;
- LoadCompressedSpriteSheet(&gUnknown_082FE6C8[data[3]]);
- LoadSpritePalette(&gUnknown_082FE6D8[data[4]]);
- for (i = 0; i < data[8]; i++)
- data[13 + i] = CreateSprite(&gUnknown_082FE730[data[2]], data[9], data[10], data[7]);
- for (i = 0; i < data[8]; i++)
+ LoadCompressedSpriteSheet(&sSpriteSheet_321Start_Static[tSpriteSheetId]);
+ LoadSpritePalette(&sSpritePalette_321Start_Static[tSpritePalId]);
+ for (i = 0; i < tNumSprites; i++)
+ tSpriteIds(i) = CreateSprite(&sSpriteTemplate_StaticCountdown[tSpriteTemplateId], tX, tY, tSubpriority);
+ for (i = 0; i < tNumSprites; i++)
{
- sprite = &gSprites[data[13 + i]];
- sprite->oam.priority = data[6];
+ sprite = &gSprites[tSpriteIds(i)];
+ sprite->oam.priority = tPriority;
sprite->invisible = TRUE;
- sprite->data[1] = data[5];
- sprite->data[3] = taskId;
- sprite->data[4] = i;
- sprite->data[5] = data[13];
+ sprite->sInterval = tInterval;
+ sprite->sTaskId = taskId;
+ sprite->sId = i;
+ sprite->sNumberSpriteId = tSpriteIds(0);
}
}
-static void sub_802E83C(u8 taskId)
+static void Task_StaticCountdown_Init(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- data[2] = 0;
- data[3] = 0;
- data[4] = 0;
- data[5] = 60;
- data[6] = 0;
- data[7] = 0;
- data[8] = 3;
- data[9] = 120;
- data[10] = 88;
- sub_802E75C(taskId, data);
-
- StartSpriteAnim(&gSprites[data[14]], 4);
- gSprites[data[14]].pos2.x = -32;
-
- StartSpriteAnim(&gSprites[data[15]], 5);
- gSprites[data[15]].pos2.x = 32;
+ tSpriteTemplateId = 0;
+ tSpriteSheetId = 0;
+ tSpritePalId = 0;
+ tInterval = 60;
+ tPriority = 0;
+ tSubpriority = 0;
+ tNumSprites = 3;
+ tX = 120;
+ tY = 88;
+ StaticCountdown_CreateSprites(taskId, data);
+
+ StartSpriteAnim(&gSprites[tSpriteIds(1)], ANIM_START_MID);
+ gSprites[tSpriteIds(1)].pos2.x = -32;
+
+ StartSpriteAnim(&gSprites[tSpriteIds(2)], ANIM_START_RIGHT);
+ gSprites[tSpriteIds(2)].pos2.x = 32;
}
-static void sub_802E8C8(u8 taskId)
+static void Task_StaticCountdown_Free(u8 taskId)
{
u8 i = 0;
s16 *data = gTasks[taskId].data;
- for (i = 0; i < data[8]; i++)
- DestroySprite(&gSprites[data[13 + i]]);
- FreeSpriteTilesByTag(gUnknown_082FE6C8[data[3]].tag);
- FreeSpritePaletteByTag(gUnknown_082FE6D8[data[4]].tag);
+ for (i = 0; i < tNumSprites; i++)
+ DestroySprite(&gSprites[tSpriteIds(i)]);
+ FreeSpriteTilesByTag(sSpriteSheet_321Start_Static[tSpriteSheetId].tag);
+ FreeSpritePaletteByTag(sSpritePalette_321Start_Static[tSpritePalId].tag);
}
-static void sub_802E938(struct Sprite *sprite)
+static void SpriteCB_StaticCountdown(struct Sprite *sprite)
{
- s16 *data = gTasks[sprite->data[3]].data;
+ s16 *data = gTasks[sprite->sTaskId].data;
- if (data[11] % data[5] != 0)
+ if (tTimer % tInterval != 0)
return;
- if (data[11] == data[10])
+ if (tTimer == tPrevTime)
return;
- data[10] = data[11];
- switch (sprite->data[2])
+ tPrevTime = tTimer;
+ switch (sprite->sAnimNum)
{
- case 0:
+ case ANIM_THREE:
sprite->invisible = FALSE;
- case 1:
- case 2:
+ case ANIM_TWO:
+ case ANIM_ONE:
+ // Set sprite to a number
PlaySE(SE_BALL_BOUNCE_1);
- StartSpriteAnim(sprite, sprite->data[2]);
+ StartSpriteAnim(sprite, sprite->sAnimNum);
break;
- case 3:
+ case ANIM_START_LEFT:
+ // Set sprite to 'Start'
PlaySE(SE_PIN);
- StartSpriteAnim(sprite, sprite->data[2]);
- gSprites[data[14]].invisible = FALSE;
- gSprites[data[15]].invisible = FALSE;
+ StartSpriteAnim(sprite, sprite->sAnimNum);
+ gSprites[tSpriteIds(1)].invisible = FALSE;
+ gSprites[tSpriteIds(2)].invisible = FALSE;
break;
- case 4:
+ case ANIM_START_LEFT + 1: // End
+ // Hide countdown
sprite->invisible = TRUE;
- gSprites[data[14]].invisible = TRUE;
- gSprites[data[15]].invisible = TRUE;
- data[0] = 4;
+ gSprites[tSpriteIds(1)].invisible = TRUE;
+ gSprites[tSpriteIds(2)].invisible = TRUE;
+ tState = STATE_END;
return;
}
- sprite->data[2]++;
+ sprite->sAnimNum++;
}
-static void sub_802EA50(u8 taskId)
+static void Task_StaticCountdown_Start(u8 taskId)
{
s16 *data = gTasks[taskId].data;
PlaySE(SE_BALL_BOUNCE_1);
- gSprites[data[13]].callback = sub_802E938;
- gSprites[data[13]].invisible = FALSE;
- gTasks[taskId].data[0] = 3;
+ gSprites[tSpriteIds(0)].callback = SpriteCB_StaticCountdown;
+ gSprites[tSpriteIds(0)].invisible = FALSE;
+ gTasks[taskId].tState = STATE_RUN;
}
-static void sub_802EAB0(u8 taskId)
+// Increment timer for progressing the countdown.
+// If the player is the link leader, increment a
+// separate timer and send it to group members for
+// them to read and use.
+static void Task_StaticCountdown_Run(u8 taskId)
{
- u16 packet[6];
+ u16 packet[RFU_PACKET_SIZE];
s16 *data = gTasks[taskId].data;
if (gReceivedRemoteLinkPlayers != 0)
{
- if (gRecvCmds[0][1] == LINKCMD_0x7FFF)
- data[11] = gRecvCmds[0][2];
+ // Read link timer
+ if (gRecvCmds[0][1] == LINKCMD_COUNTDOWN)
+ tTimer = gRecvCmds[0][2];
+
if (GetMultiplayerId() == 0)
{
- data[12]++;
+ // Player is link leader.
+ // Send timer to group members
+ tLinkTimer++;
memset(packet, 0, sizeof(packet));
- packet[0] = LINKCMD_0x7FFF;
- packet[1] = data[12];
+ packet[0] = LINKCMD_COUNTDOWN;
+ packet[1] = tLinkTimer;
Rfu_SendPacket(packet);
}
}
else
{
- data[11]++;
+ // Local, just increment own timer
+ tTimer++;
}
}
+#undef tState
+#undef tFuncSetId
+#undef tSpriteTemplateId
+#undef tSpriteSheetId
+#undef tSpritePalId
+#undef tInterval
+#undef tPriority
+#undef tSubpriority
+#undef tNumSprites
+#undef tX
+#undef tY
+#undef tPrevTime
+#undef tTimer
+#undef tLinkTimer
+#undef tSpriteIds
+#undef sInterval
+#undef sAnimNum
+#undef sTaskId
+#undef sId
+#undef sNumberSpriteId
+
+/*
+ The countdown that actually gets used by
+ the wireless minigames starts here
+*/
+
+static void Task_MinigameCountdown(u8 taskId);
+static bool32 RunMinigameCountdownDigitsAnim(u8 spriteId);
+static bool32 IsStartGraphicAnimRunning(u8 spriteId);
+static void Load321StartGfx(u16 tileTag, u16 palTag);
+static u8 CreateNumberSprite(u16 tileTag, u16 palTag, s16 x, s16 y, u8 subpriority);
+static void CreateStartSprite(u16 tileTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 *spriteId1, s16 *spriteId2);
+static void InitStartGraphic(u8 spriteId1, u8 spriteId2, u8 spriteId3);
+static void SpriteCB_Start(struct Sprite *sprite);
+
+static const u16 s321Start_Pal[] = INCBIN_U16("graphics/minigame_countdown/321start.gbapal");
+static const u32 s321Start_Gfx[] = INCBIN_U32("graphics/minigame_countdown/321start.4bpp.lz");
+
#define tState data[0]
#define tTilesTag data[2]
#define tPalTag data[3]
@@ -288,7 +387,7 @@ static void sub_802EAB0(u8 taskId)
#define tSpriteId2 data[8]
#define tSpriteId3 data[9]
-void StartMinigameCountdown(s16 tilesTag, s16 palTag, s16 x, s16 y, u8 subpriority)
+void StartMinigameCountdown(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority)
{
u8 taskId = CreateTask(Task_MinigameCountdown, 80);
gTasks[taskId].tTilesTag = tilesTag;
@@ -337,69 +436,82 @@ static void Task_MinigameCountdown(u8 taskId)
}
}
+#define sState data[0]
+#define sTimer data[2]
+#define sAnimNum data[4]
+
static bool32 RunMinigameCountdownDigitsAnim(u8 spriteId)
{
struct Sprite *sprite = &gSprites[spriteId];
- switch (sprite->data[0])
+ switch (sprite->sState)
{
case 0:
sub_8007E18(sprite, 0x800, 0x1A);
- sprite->data[0]++;
+ sprite->sState++;
// fallthrough
case 1:
- if (sprite->data[2] == 0)
+ if (sprite->sTimer == 0)
PlaySE(SE_BALL_BOUNCE_2);
- if (++sprite->data[2] >= 20)
+
+ if (++sprite->sTimer >= 20)
{
- sprite->data[2] = 0;
+ // Ready for jump
+ sprite->sTimer = 0;
StartSpriteAffineAnim(sprite, 1);
- sprite->data[0]++;
+ sprite->sState++;
}
break;
case 2:
if (sprite->affineAnimEnded)
- sprite->data[0]++;
+ sprite->sState++;
break;
case 3:
- if (++sprite->data[2] >= 4)
+ if (++sprite->sTimer >= 4)
{
- sprite->data[2] = 0;
- sprite->data[0]++;
+ // Start jump
+ sprite->sTimer = 0;
+ sprite->sState++;
StartSpriteAffineAnim(sprite, 2);
}
break;
case 4:
+ // Moving up from jump
sprite->pos1.y -= 4;
- if (++sprite->data[2] >= 8)
+ if (++sprite->sTimer >= 8)
{
- if (sprite->data[4] <= 1)
+ if (sprite->sAnimNum < 2)
{
- StartSpriteAnim(sprite, sprite->data[4] + 1);
- sprite->data[2] = 0;
- sprite->data[0]++;
+ // Swap to the next number
+ StartSpriteAnim(sprite, sprite->sAnimNum + 1);
+ sprite->sTimer = 0;
+ sprite->sState++;
}
else
{
- sprite->data[0] = 7;
+ // End
+ sprite->sState = 7;
return FALSE;
}
}
break;
case 5:
+ // Falling after jump
sprite->pos1.y += 4;
- if (++sprite->data[2] >= 8)
+ if (++sprite->sTimer >= 8)
{
- sprite->data[2] = 0;
+ // Land from jump
+ sprite->sTimer = 0;
StartSpriteAffineAnim(sprite, 3);
- sprite->data[0]++;
+ sprite->sState++;
}
break;
case 6:
if (sprite->affineAnimEnded)
{
- sprite->data[4]++;
- sprite->data[0] = 1;
+ // Restart for next number
+ sprite->sAnimNum++;
+ sprite->sState = 1;
}
break;
case 7:
@@ -409,6 +521,10 @@ static bool32 RunMinigameCountdownDigitsAnim(u8 spriteId)
return TRUE;
}
+#undef sState
+#undef sTimer
+#undef sAnimNum
+
// First argument is unused.
static void InitStartGraphic(u8 spriteId1, u8 spriteId2, u8 spriteId3)
{
@@ -425,60 +541,70 @@ static bool32 IsStartGraphicAnimRunning(u8 spriteId)
return gSprites[spriteId].callback == SpriteCB_Start;
}
+#define sState data[0]
+#define sTimer data[1]
+#define sYSpeed data[4]
+#define sY data[5]
+
static void SpriteCB_Start(struct Sprite *sprite)
{
int y;
s16 *data = sprite->data;
- switch (data[0])
+ switch (sState)
{
case 0:
- data[4] = 64;
- data[5] = sprite->pos2.y << 4;
- data[0]++;
+ sYSpeed = 64;
+ sY = sprite->pos2.y << 4;
+ sState++;
case 1:
- data[5] += data[4];
- data[4]++;
- sprite->pos2.y = data[5] >> 4;
+ sY += sYSpeed;
+ sYSpeed++;
+ sprite->pos2.y = sY >> 4;
if (sprite->pos2.y >= 0)
{
PlaySE(SE_BALL_BOUNCE_2);
sprite->pos2.y = 0;
- data[0]++;
+ sState++;
}
break;
case 2:
- data[1] += 12;
- if (data[1] >= 128)
+ sTimer += 12;
+ if (sTimer >= 128)
{
PlaySE(SE_BALL_BOUNCE_2);
- data[1] = 0;
- data[0]++;
+ sTimer = 0;
+ sState++;
}
- y = gSineTable[data[1]];
+ y = gSineTable[sTimer];
sprite->pos2.y = -(y >> 4);
break;
case 3:
- data[1] += 16;
- if (data[1] >= 128)
+ sTimer += 16;
+ if (sTimer >= 128)
{
PlaySE(SE_BALL_BOUNCE_2);
- data[1] = 0;
- data[0]++;
+ sTimer = 0;
+ sState++;
}
- sprite->pos2.y = -(gSineTable[data[1]] >> 5);
+ sprite->pos2.y = -(gSineTable[sTimer] >> 5);
break;
case 4:
- if (++data[1] > 40)
+ if (++sTimer > 40)
sprite->callback = SpriteCallbackDummy;
break;
}
}
+#undef sState
+#undef sTimer
+#undef sYSpeed
+#undef sY
+
static void Load321StartGfx(u16 tileTag, u16 palTag)
{
- struct CompressedSpriteSheet spriteSheet = {sSpriteSheet_321Start, 0xE00, 0};
- struct SpritePalette spritePalette = {sSpritePal_321Start, 0};
+ struct CompressedSpriteSheet spriteSheet = {s321Start_Gfx, 0xE00, 0};
+ struct SpritePalette spritePalette = {s321Start_Pal, 0};
spriteSheet.tag = tileTag;
spritePalette.tag = palTag;
@@ -564,26 +690,26 @@ static const union AnimCmd *const sAnimTable_Start[] =
sAnim_StartRight
};
-static const union AffineAnimCmd sAffineAnim_Numbers_0[] =
+static const union AffineAnimCmd sAffineAnim_Numbers_Normal[] =
{
AFFINEANIMCMD_FRAME(256, 256, 0, 0),
AFFINEANIMCMD_END
};
-static const union AffineAnimCmd sAffineAnim_Numbers_1[] =
+static const union AffineAnimCmd sAffineAnim_Numbers_Squash[] =
{
AFFINEANIMCMD_FRAME(256, 256, 0, 0),
AFFINEANIMCMD_FRAME(16, -16, 0, 8),
AFFINEANIMCMD_END
};
-static const union AffineAnimCmd sAffineAnim_Numbers_2[] =
+static const union AffineAnimCmd sAffineAnim_Numbers_Stretch[] =
{
AFFINEANIMCMD_FRAME(-18, 18, 0, 8),
AFFINEANIMCMD_END
};
-static const union AffineAnimCmd sAffineAnim_Numbers_3[] =
+static const union AffineAnimCmd sAffineAnim_Numbers_Land[] =
{
AFFINEANIMCMD_FRAME( 6, -6, 0, 8),
AFFINEANIMCMD_FRAME( -4, 4, 0, 8),
@@ -593,10 +719,10 @@ static const union AffineAnimCmd sAffineAnim_Numbers_3[] =
static const union AffineAnimCmd *const sAffineAnimTable_Numbers[] =
{
- sAffineAnim_Numbers_0,
- sAffineAnim_Numbers_1,
- sAffineAnim_Numbers_2,
- sAffineAnim_Numbers_3
+ sAffineAnim_Numbers_Normal,
+ sAffineAnim_Numbers_Squash, // Push down before the jump
+ sAffineAnim_Numbers_Stretch, // Stretch up for the jump
+ sAffineAnim_Numbers_Land // Land after the jump
};
static u8 CreateNumberSprite(u16 tileTag, u16 palTag, s16 x, s16 y, u8 subpriority)