summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGriffinR <griffin.g.richards@gmail.com>2020-08-27 14:47:28 -0400
committerGriffinR <griffin.g.richards@gmail.com>2020-08-27 15:43:28 -0400
commita220d3986f9addc066e7c3be294cd00fb14d261f (patch)
treef3a11e304db40dde9795114ff277b1bb4d89c852 /src
parente63297138dbb933ff2a6620ad641d7deedd085fa (diff)
Document fifth rayquaza scene
Diffstat (limited to 'src')
-rw-r--r--src/rayquaza_scene.c489
1 files changed, 281 insertions, 208 deletions
diff --git a/src/rayquaza_scene.c b/src/rayquaza_scene.c
index dcbc87c8a..bd31ec6ef 100644
--- a/src/rayquaza_scene.c
+++ b/src/rayquaza_scene.c
@@ -77,15 +77,15 @@ static EWRAM_DATA struct RayquazaScene *sRayScene = NULL;
static void CB2_InitRayquazaScene(void);
static void CB2_RayquazaScene(void);
-static void Task_EndAfterFadeScreen(u8 taskId);
+static void Task_EndAfterFadeScreen(u8);
// RAY_ANIM_DUO_FIGHT_PRE / RAY_ANIM_DUO_FIGHT
-static void Task_DuoFightAnim(u8 taskId);
-static void Task_HandleDuoFight(u8 taskId);
-static void Task_DuoFightEnd(u8 taskId);
-static void DuoFightEnd(u8 taskId, s8 palDelay);
-static void Task_DuoFight_AnimateClouds(u8 taskId);
-static void DuoFight_PanOffScene(u8 taskId);
+static void Task_DuoFightAnim(u8);
+static void Task_HandleDuoFight(u8);
+static void Task_DuoFightEnd(u8);
+static void DuoFightEnd(u8, s8);
+static void Task_DuoFight_AnimateClouds(u8);
+static void DuoFight_PanOffScene(u8);
static void DuoFight_AnimateRain(void);
static void DuoFight_Lightning1(void);
static void DuoFight_Lightning2(void);
@@ -94,50 +94,50 @@ static u8 DuoFightPre_CreateGroudonSprites(void);
static u8 DuoFightPre_CreateKyogreSprites(void);
static u8 DuoFight_CreateGroudonSprites(void);
static u8 DuoFight_CreateKyogreSprites(void);
-static void SpriteCB_DuoFightPre_Groudon(struct Sprite *sprite);
-static void SpriteCB_DuoFightPre_Kyogre(struct Sprite *sprite);
-static void SpriteCB_DuoFight_Groudon(struct Sprite *sprite);
-static void SpriteCB_DuoFight_Kyogre(struct Sprite *sprite);
-static void DuoFight_SlideGroudonDown(struct Sprite *sprite);
-static void DuoFight_SlideKyogreDown(struct Sprite *sprite);
+static void SpriteCB_DuoFightPre_Groudon(struct Sprite *);
+static void SpriteCB_DuoFightPre_Kyogre(struct Sprite *);
+static void SpriteCB_DuoFight_Groudon(struct Sprite *);
+static void SpriteCB_DuoFight_Kyogre(struct Sprite *);
+static void DuoFight_SlideGroudonDown(struct Sprite *);
+static void DuoFight_SlideKyogreDown(struct Sprite *);
// RAY_ANIM_TAKES_FLIGHT
-static void Task_RayTakesFlightAnim(u8 taskId);
-static void Task_HandleRayTakesFlight(u8 taskId);
-static void Task_RayTakesFlightEnd(u8 taskId);
-static void Task_TakesFlight_CreateSmoke(u8 taskId);
-static void SpriteCB_TakesFlight_Smoke(struct Sprite *sprite);
+static void Task_RayTakesFlightAnim(u8);
+static void Task_HandleRayTakesFlight(u8);
+static void Task_RayTakesFlightEnd(u8);
+static void Task_TakesFlight_CreateSmoke(u8);
+static void SpriteCB_TakesFlight_Smoke(struct Sprite *);
// RAY_ANIM_DESCENDS
-static void Task_RayDescendsAnim(u8 taskId);
-static void Task_HandleRayDescends(u8 taskId);
-static void Task_RayDescendsEnd(u8 taskId);
+static void Task_RayDescendsAnim(u8);
+static void Task_HandleRayDescends(u8);
+static void Task_RayDescendsEnd(u8);
static u8 CreateDescendsRayquazaSprite(void);
-static void SpriteCB_Descends_Rayquaza(struct Sprite *sprite);
+static void SpriteCB_Descends_Rayquaza(struct Sprite *);
// RAY_ANIM_CHARGES
-static void Task_RayChargesAnim(u8 taskId);
-static void Task_HandleRayCharges(u8 taskId);
-static void Task_RayChargesEnd(u8 taskId);
-static void Task_RayCharges_ShakeRayquaza(u8 taskId);
-static void Task_RayCharges_FlyOffscreen(u8 taskId);
+static void Task_RayChargesAnim(u8);
+static void Task_HandleRayCharges(u8);
+static void Task_RayChargesEnd(u8);
+static void Task_RayCharges_ShakeRayquaza(u8);
+static void Task_RayCharges_FlyOffscreen(u8);
static void RayCharges_AnimateBg(void);
// RAY_ANIM_CHASES_AWAY
-static void Task_RayChasesAwayAnim(u8 taskId);
-static void Task_HandleRayChasesAway(u8 taskId);
-static void Task_RayChasesAwayEnd(u8 taskId);
-static void sub_81D8FB0(u8 taskId);
-static void sub_81D94D4(u8 taskId);
-static void sub_81D93D8(u8 taskId);
-static void sub_81D90A8(u8 taskId);
-static void sub_81D98B4(u8 taskId);
-static void sub_81D9420(struct Sprite *sprite);
-static void sub_81D97E0(struct Sprite *sprite);
-static void sub_81D9528(struct Sprite *sprite);
-static void SpriteCB_ChasesAway_Rayquaza(struct Sprite *sprite);
-static void sub_81D9338(struct Sprite *sprite);
-static void sub_81D9868(struct Sprite *sprite, u8 animNum, s16 x, s16 y);
+static void Task_RayChasesAwayAnim(u8);
+static void Task_HandleRayChasesAway(u8);
+static void Task_RayChasesAwayEnd(u8);
+static void Task_ChasesAway_AnimateBg(u8);
+static void ChasesAway_KyogreStartLeave(u8);
+static void ChasesAway_GroudonStartLeave(u8);
+static void ChasesAway_CreateTrioSprites(u8);
+static void Task_ChasesAway_AnimateRing(u8);
+static void SpriteCB_ChasesAway_GroudonLeave(struct Sprite *);
+static void SpriteCB_ChasesAway_KyogreLeave(struct Sprite *);
+static void SpriteCB_ChasesAway_RayquazaFloat(struct Sprite *);
+static void SpriteCB_ChasesAway_Rayquaza(struct Sprite *);
+static void SpriteCB_ChasesAway_DuoRingPush(struct Sprite *);
+static void ChasesAway_SetRayquazaAnim(struct Sprite *, u8, s16, s16);
static const TaskFunc sTasksForAnimations[] =
{
@@ -2091,12 +2091,12 @@ static void Task_HandleRayTakesFlight(u8 taskId)
tTimer = 0;
tState++;
}
- SetBgAffine(2, 0x7800, 0x1800, 0x78, tYCoord + 32, tScale, tScale, 0);
+ SetBgAffine(2, 0x7800, 0x1800, 120, tYCoord + 32, tScale, tScale, 0);
break;
case 2:
// Float up and down
tTimer++;
- SetBgAffine(2, 0x7800, 0x1800, 0x78, tYCoord + 32 + (tYOffset >> 2), tScale, tScale, 0);
+ SetBgAffine(2, 0x7800, 0x1800, 120, tYCoord + 32 + (tYOffset >> 2), tScale, tScale, 0);
tYOffset += tYOffsetDir;
if (tYOffset == 12 || tYOffset == -12)
{
@@ -2111,7 +2111,7 @@ static void Task_HandleRayTakesFlight(u8 taskId)
case 3:
// Fly away, fade out
tScale += 16;
- SetBgAffine(2, 0x7800, 0x1800, 0x78, tYCoord + 32, tScale, tScale, 0);
+ SetBgAffine(2, 0x7800, 0x1800, 120, tYCoord + 32, tScale, tScale, 0);
Task_RayTakesFlightEnd(taskId);
break;
}
@@ -2653,7 +2653,6 @@ static void LoadChasesAwaySceneGfx(void)
DecompressAndCopyTileDataToVram(0, gRaySceneChasesAway_Bg_Gfx, 0, 0, 0);
while (FreeTempTileDataBuffersIfPossible())
;
-
LZDecompressWram(gRaySceneChasesAway_Ring_Tilemap, sRayScene->tilemapBuffers[1]);
LZDecompressWram(gRaySceneChasesAway_Bg_Tilemap, sRayScene->tilemapBuffers[0]);
LZDecompressWram(gRaySceneChasesAway_Ring_Map, sRayScene->tilemapBuffers[2]);
@@ -2670,6 +2669,10 @@ static void LoadChasesAwaySceneGfx(void)
LoadCompressedSpritePalette(&sSpritePal_ChasesAway_KyogreSplash);
}
+#define tState data[0]
+#define tTimer data[1]
+#define tBgTaskId data[2]
+
static void Task_RayChasesAwayAnim(u8 taskId)
{
s16 *data = gTasks[taskId].data;
@@ -2681,61 +2684,66 @@ static void Task_RayChasesAwayAnim(u8 taskId)
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(9, 14));
BlendPalettes(-1, 0x10, 0);
SetVBlankCallback(VBlankCB_RayquazaScene);
- data[0] = 0;
- data[1] = 0;
+ tState = 0;
+ tTimer = 0;
gTasks[taskId].func = Task_HandleRayChasesAway;
- data[2] = CreateTask(sub_81D8FB0, 0);
- gTasks[data[2]].data[0] = 0;
- gTasks[data[2]].data[1] = 0;
- gTasks[data[2]].data[2] = 0;
- gTasks[data[2]].data[3] = 1;
- gTasks[data[2]].data[4] = 1;
+ tBgTaskId = CreateTask(Task_ChasesAway_AnimateBg, 0);
+ gTasks[tBgTaskId].data[0] = 0;
+ gTasks[tBgTaskId].data[1] = 0;
+ gTasks[tBgTaskId].data[2] = 0;
+ gTasks[tBgTaskId].data[3] = 1;
+ gTasks[tBgTaskId].data[4] = 1;
}
static void Task_HandleRayChasesAway(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- switch (data[0])
+ switch (tState)
{
case 0:
- if (data[1] == 8)
+ // Delay, then fade in
+ if (tTimer == 8)
{
- sub_81D90A8(taskId);
+ ChasesAway_CreateTrioSprites(taskId);
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK);
- data[1] = 0;
- data[0]++;
+ tTimer = 0;
+ tState++;
}
else
{
- data[1]++;
+ tTimer++;
}
break;
case 1:
- if (gSprites[data[5]].callback == sub_81D97E0)
+ // Wait for Rayquaza to enter and finish shout anim
+ if (gSprites[data[5]].callback == SpriteCB_ChasesAway_RayquazaFloat)
{
- if (data[1] == 64)
+ // Delay, then start Groudon/Kyogre leaving
+ if (tTimer == 64)
{
- sub_81D94D4(taskId);
- sub_81D93D8(taskId);
- data[1] = 0;
- data[0]++;
+ ChasesAway_KyogreStartLeave(taskId);
+ ChasesAway_GroudonStartLeave(taskId);
+ tTimer = 0;
+ tState++;
}
else
{
- data[1]++;
+ tTimer++;
}
}
break;
case 2:
- if (data[1] == 448)
+ // Wait for Groudon/Kyogre to leave
+ if (tTimer == 448)
{
- data[1] = 0;
- data[0]++;
+ tTimer = 0;
+ tState++;
}
else
{
- data[1]++;
- if (data[1] % 144 == 0)
+ // Flash bg white and trio black a few times
+ tTimer++;
+ if (tTimer % 144 == 0)
{
BlendPalettesGradually(0x0000FFFE, 0, 16, 0, RGB_WHITEALPHA, 0, 0);
BlendPalettesGradually(0xFFFF0000, 0, 16, 0, RGB_BLACK, 0, 1);
@@ -2743,141 +2751,182 @@ static void Task_HandleRayChasesAway(u8 taskId)
}
break;
case 3:
+ // Fade out
BeginNormalPaletteFade(0xFFFFFFFF, 4, 0, 0x10, RGB_BLACK);
gTasks[taskId].func = Task_RayChasesAwayEnd;
break;
}
}
-static void sub_81D8FB0(u8 taskId)
+#undef tState
+#undef tTimer
+
+#define tTimer data[0]
+#define tBlendHi data[1]
+#define tBlendLo data[2]
+#define tBlendHiDir data[3]
+#define tBlendLoDir data[4]
+
+// Flickers the ray of light behind Rayquaza
+static void Task_ChasesAway_AnimateBg(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- if ((data[0] & 0xF) == 0)
+ if ((tTimer & 0xF) == 0)
{
- SetGpuReg(REG_OFFSET_BLDALPHA, ((data[1] + 14) << 8 & 0x1F00) | ((data[2] + 9) & 0xF));
- data[1] -= data[3];
- data[2] += data[4];
- if (data[1] == -3 || data[1] == 0)
- data[3] *= -1;
- if (data[2] == 3 || data[2] == 0)
- data[4] *= -1;
+ SetGpuReg(REG_OFFSET_BLDALPHA, ((tBlendHi + 14) << 8 & 0x1F00) | ((tBlendLo + 9) & 0xF));
+ tBlendHi -= tBlendHiDir;
+ tBlendLo += tBlendLoDir;
+ if (tBlendHi == -3 || tBlendHi == 0)
+ tBlendHiDir *= -1;
+ if (tBlendLo == 3 || tBlendLo == 0)
+ tBlendLoDir *= -1;
}
- data[0]++;
+ tTimer++;
}
+#undef tTimer
+#undef tBlendHi
+#undef tBlendLo
+#undef tBlendHiDir
+#undef tBlendLoDir
+
+#define tTimer data[1]
+
static void Task_RayChasesAwayEnd(u8 taskId)
{
s16 *data = gTasks[taskId].data;
if (!gPaletteFade.active)
{
StopMapMusic();
- if (data[1] == 0)
+ if (tTimer == 0)
{
SetVBlankCallback(NULL);
ResetWindowDimensions();
ResetSpriteData();
FreeAllSpritePalettes();
- DestroyTask(data[2]);
+ DestroyTask(tBgTaskId);
}
- if (data[1] == 32)
+ if (tTimer == 32)
{
- data[1] = 0;
+ tTimer = 0;
gTasks[taskId].func = Task_SetNextAnim;
}
else
{
- data[1]++;
+ tTimer++;
}
}
}
-static void sub_81D90A8(u8 taskId)
+#undef tTimer
+#undef tBgTaskId
+
+#define tGroudonSpriteId taskData[3]
+#define tKyogreSpriteId taskData[4]
+#define tRayquazaSpriteId taskData[5]
+
+static void ChasesAway_CreateTrioSprites(u8 taskId)
{
s16 *taskData, *spriteData;
taskData = gTasks[taskId].data;
- taskData[3] = CreateSprite(&sSpriteTemplate_ChasesAway_Groudon, 64, 120, 0);
- spriteData = gSprites[taskData[3]].data;
+ tGroudonSpriteId = CreateSprite(&sSpriteTemplate_ChasesAway_Groudon, 64, 120, 0);
+ spriteData = gSprites[tGroudonSpriteId].data;
spriteData[0] = CreateSprite(&sSpriteTemplate_ChasesAway_GroudonTail, 16, 130, 0);
- gSprites[taskData[3]].oam.priority = 1;
+ gSprites[tGroudonSpriteId].oam.priority = 1;
gSprites[spriteData[0]].oam.priority = 1;
- taskData[4] = CreateSprite(&sSpriteTemplate_ChasesAway_Kyogre, 160, 128, 1);
- spriteData = gSprites[taskData[4]].data;
+ tKyogreSpriteId = CreateSprite(&sSpriteTemplate_ChasesAway_Kyogre, 160, 128, 1);
+ spriteData = gSprites[tKyogreSpriteId].data;
spriteData[0] = CreateSprite(&sSpriteTemplate_ChasesAway_Kyogre, 192, 128, 1);
spriteData[1] = CreateSprite(&sSpriteTemplate_ChasesAway_Kyogre, 224, 128, 1);
- gSprites[taskData[4]].oam.priority = 1;
+ gSprites[tKyogreSpriteId].oam.priority = 1;
gSprites[spriteData[0]].oam.priority = 1;
gSprites[spriteData[1]].oam.priority = 1;
StartSpriteAnim(&gSprites[spriteData[0]], 1);
StartSpriteAnim(&gSprites[spriteData[1]], 2);
- taskData[5] = CreateSprite(&sSpriteTemplate_ChasesAway_Rayquaza, 120, -65, 0);
- spriteData = gSprites[taskData[5]].data;
+ tRayquazaSpriteId = CreateSprite(&sSpriteTemplate_ChasesAway_Rayquaza, 120, -65, 0);
+ spriteData = gSprites[tRayquazaSpriteId].data;
spriteData[0] = CreateSprite(&sSpriteTemplate_ChasesAway_RayquazaTail, 120, -113, 0);
- gSprites[taskData[5]].oam.priority = 1;
+ gSprites[tRayquazaSpriteId].oam.priority = 1;
gSprites[spriteData[0]].oam.priority = 1;
}
-static void sub_81D9274(u8 taskId)
+#define sBodyPartSpriteId1 data[0]
+#define sBodyPartSpriteId2 data[1]
+#define sTimer data[4]
+#define sDecel data[5]
+#define sSpeed data[6]
+#define sIsKyogre data[7]
+
+static void ChasesAway_PushDuoBack(u8 taskId)
{
s16 *taskData = gTasks[taskId].data;
- gSprites[taskData[3]].callback = sub_81D9338;
- gSprites[taskData[3]].data[4] = 0;
- gSprites[taskData[3]].data[5] = 0;
- gSprites[taskData[3]].data[6] = 4;
- gSprites[taskData[3]].data[7] = 0;
+ gSprites[tGroudonSpriteId].callback = SpriteCB_ChasesAway_DuoRingPush;
+ gSprites[tGroudonSpriteId].sTimer = 0;
+ gSprites[tGroudonSpriteId].sDecel = 0;
+ gSprites[tGroudonSpriteId].sSpeed = 4;
+ gSprites[tGroudonSpriteId].sIsKyogre = FALSE;
- gSprites[taskData[4]].callback = sub_81D9338;
- gSprites[taskData[4]].data[4] = 0;
- gSprites[taskData[4]].data[5] = 0;
- gSprites[taskData[4]].data[6] = 4;
- gSprites[taskData[4]].data[7] = 1;
+ gSprites[tKyogreSpriteId].callback = SpriteCB_ChasesAway_DuoRingPush;
+ gSprites[tKyogreSpriteId].sTimer = 0;
+ gSprites[tKyogreSpriteId].sDecel = 0;
+ gSprites[tKyogreSpriteId].sSpeed = 4;
+ gSprites[tKyogreSpriteId].sIsKyogre = TRUE;
}
-static void sub_81D9338(struct Sprite *sprite)
+// Pushes Groudon/Kyogre back slightly, for when Rayquaza's hyper voice ring comes out
+static void SpriteCB_ChasesAway_DuoRingPush(struct Sprite *sprite)
{
- if ((sprite->data[4] & 7) == 0)
+ if ((sprite->sTimer & 7) == 0)
{
- if (sprite->data[7] == 0)
+ if (!sprite->sIsKyogre)
{
- sprite->pos1.x -= sprite->data[6];
- gSprites[sprite->data[0]].pos1.x -= sprite->data[6];
+ sprite->pos1.x -= sprite->sSpeed;
+ gSprites[sprite->sBodyPartSpriteId1].pos1.x -= sprite->sSpeed;
}
else
{
- sprite->pos1.x += sprite->data[6];
- gSprites[sprite->data[0]].pos1.x += sprite->data[6];
- gSprites[sprite->data[1]].pos1.x += sprite->data[6];
+ sprite->pos1.x += sprite->sSpeed;
+ gSprites[sprite->sBodyPartSpriteId1].pos1.x += sprite->sSpeed;
+ gSprites[sprite->sBodyPartSpriteId2].pos1.x += sprite->sSpeed;
}
- sprite->data[5]++;
- sprite->data[6] -= sprite->data[5];
- if (sprite->data[5] == 3)
+ sprite->sDecel++;
+ sprite->sSpeed -= sprite->sDecel;
+ if (sprite->sDecel == 3)
{
- sprite->data[4] = 0;
- sprite->data[5] = 0;
- sprite->data[6] = 0;
+ sprite->sTimer = 0;
+ sprite->sDecel = 0;
+ sprite->sSpeed = 0;
sprite->callback = SpriteCallbackDummy;
return;
}
}
- sprite->data[4]++;
+ sprite->sTimer++;
}
-static void sub_81D93D8(u8 taskId)
+#undef sBodyPartSpriteId1
+#undef sBodyPartSpriteId2
+#undef sTimer
+#undef sDecel
+#undef sSpeed
+#undef sIsKyogre
+
+static void ChasesAway_GroudonStartLeave(u8 taskId)
{
s16 *taskData = gTasks[taskId].data;
- gSprites[taskData[3]].callback = sub_81D9420;
- StartSpriteAnim(&gSprites[taskData[3]], 1);
+ gSprites[tGroudonSpriteId].callback = SpriteCB_ChasesAway_GroudonLeave;
+ StartSpriteAnim(&gSprites[tGroudonSpriteId], 1);
}
-static void sub_81D9420(struct Sprite *sprite)
+static void SpriteCB_ChasesAway_GroudonLeave(struct Sprite *sprite)
{
switch (sprite->animCmdIndex)
{
@@ -2902,19 +2951,19 @@ static void sub_81D9420(struct Sprite *sprite)
}
}
-static void sub_81D94D4(u8 taskId)
+static void ChasesAway_KyogreStartLeave(u8 taskId)
{
s16 *taskData, *spriteData;
taskData = gTasks[taskId].data;
- spriteData = gSprites[taskData[4]].data;
+ spriteData = gSprites[tKyogreSpriteId].data;
- gSprites[taskData[4]].callback = sub_81D9528;
- gSprites[spriteData[0]].callback = sub_81D9528;
- gSprites[spriteData[1]].callback = sub_81D9528;
+ gSprites[tKyogreSpriteId].callback = SpriteCB_ChasesAway_KyogreLeave;
+ gSprites[spriteData[0]].callback = SpriteCB_ChasesAway_KyogreLeave;
+ gSprites[spriteData[1]].callback = SpriteCB_ChasesAway_KyogreLeave;
}
-static void sub_81D9528(struct Sprite *sprite)
+static void SpriteCB_ChasesAway_KyogreLeave(struct Sprite *sprite)
{
if ((sprite->data[4] & 3) == 0)
{
@@ -2951,145 +3000,169 @@ static void sub_81D9528(struct Sprite *sprite)
sprite->data[4]++;
}
+#define sTailSpriteId data[0]
+#define sYOffset data[4]
+#define sYOffsetDir data[5]
+#define sFloatTimer data[6]
+#define sTimer data[7]
+
+#define sTailFloatDelay data[4]
+#define sTailFloatPeak data[5]
+
static void SpriteCB_ChasesAway_Rayquaza(struct Sprite *sprite)
{
- s16 counter = sprite->data[7];
- if (counter <= 64)
+ s16 frame = sprite->sTimer;
+ if (frame <= 64)
{
sprite->pos2.y += 2;
- gSprites[sprite->data[0]].pos2.y += 2;
- if (sprite->data[7] == 64)
+ gSprites[sprite->sTailSpriteId].pos2.y += 2;
+ if (sprite->sTimer == 64)
{
- sub_81D9868(sprite, 1, 0, -48);
- sprite->data[4] = 5;
- sprite->data[5] = -1;
- gSprites[sprite->data[0]].data[4] = 3;
- gSprites[sprite->data[0]].data[5] = 5;
+ ChasesAway_SetRayquazaAnim(sprite, 1, 0, -48);
+ sprite->sYOffset = 5;
+ sprite->sYOffsetDir = -1;
+ gSprites[sprite->sTailSpriteId].sTailFloatDelay = 3;
+ gSprites[sprite->sTailSpriteId].sTailFloatPeak = 5;
}
}
- else if (counter <= 111)
+ else if (frame <= 111)
{
- sub_81D97E0(sprite);
- if (sprite->data[4] == 0)
+ SpriteCB_ChasesAway_RayquazaFloat(sprite);
+ if (sprite->sYOffset == 0)
PlaySE(SE_BT_START);
- if (sprite->data[4] == -3)
- sub_81D9868(sprite, 2, 48, 16);
+ if (sprite->sYOffset == -3)
+ ChasesAway_SetRayquazaAnim(sprite, 2, 48, 16);
}
- else if (counter == 112)
+ else if (frame == 112)
{
- gSprites[sprite->data[0]].data[4] = 7;
- gSprites[sprite->data[0]].data[5] = 3;
- sub_81D97E0(sprite);
+ gSprites[sprite->sTailSpriteId].sTailFloatDelay = 7;
+ gSprites[sprite->sTailSpriteId].sTailFloatPeak = 3;
+ SpriteCB_ChasesAway_RayquazaFloat(sprite);
}
- else if (counter <= 327)
+ else if (frame <= 327)
{
- sub_81D97E0(sprite);
+ SpriteCB_ChasesAway_RayquazaFloat(sprite);
}
- else if (counter == 328)
+ else if (frame == 328)
{
- sub_81D97E0(sprite);
- sub_81D9868(sprite, 3, 48, 16);
+ SpriteCB_ChasesAway_RayquazaFloat(sprite);
+ ChasesAway_SetRayquazaAnim(sprite, 3, 48, 16);
sprite->pos2.x = 1;
- gSprites[sprite->data[0]].pos2.x = 1;
+ gSprites[sprite->sTailSpriteId].pos2.x = 1;
PlayCry1(SPECIES_RAYQUAZA, 0);
- CreateTask(sub_81D98B4, 0);
+ CreateTask(Task_ChasesAway_AnimateRing, 0);
}
else
{
- switch (counter)
+ switch (frame)
{
case 376:
sprite->pos2.x = 0;
- gSprites[sprite->data[0]].pos2.x = 0;
- sub_81D97E0(sprite);
- sub_81D9868(sprite, 2, 48, 16);
- sprite->callback = sub_81D97E0;
+ gSprites[sprite->sTailSpriteId].pos2.x = 0;
+ SpriteCB_ChasesAway_RayquazaFloat(sprite);
+ ChasesAway_SetRayquazaAnim(sprite, 2, 48, 16);
+ sprite->callback = SpriteCB_ChasesAway_RayquazaFloat;
return;
case 352:
- sub_81D9274(FindTaskIdByFunc(Task_HandleRayChasesAway));
+ ChasesAway_PushDuoBack(FindTaskIdByFunc(Task_HandleRayChasesAway));
break;
}
}
- if (sprite->data[7] > 328 && (sprite->data[7] & 1) == 0)
+ if (sprite->sTimer > 328 && (sprite->sTimer & 1) == 0)
{
sprite->pos2.x *= -1;
- gSprites[sprite->data[0]].pos2.x = sprite->pos2.x;
+ gSprites[sprite->sTailSpriteId].pos2.x = sprite->pos2.x;
}
- sprite->data[7]++;
+ sprite->sTimer++;
}
-static void sub_81D97E0(struct Sprite *sprite)
+static void SpriteCB_ChasesAway_RayquazaFloat(struct Sprite *body)
{
- struct Sprite *sprite2 = &gSprites[sprite->data[0]];
- if (!(sprite->data[6] & sprite2->data[4]))
+ struct Sprite *tail = &gSprites[body->sTailSpriteId];
+ if (!(body->sFloatTimer & tail->sTailFloatDelay))
{
- sprite->pos2.y += sprite->data[4];
- gSprites[sprite->data[0]].pos2.y += sprite->data[4];
- sprite->data[4] += sprite->data[5];
- if (sprite->data[4] >= sprite2->data[5] || sprite->data[4] <= -sprite2->data[5])
+ body->pos2.y += body->sYOffset;
+ gSprites[body->sTailSpriteId].pos2.y += body->sYOffset; // why access gSprites again? tail->pos2.y would be sufficient
+ body->sYOffset += body->sYOffsetDir;
+ if (body->sYOffset >= tail->sTailFloatPeak || body->sYOffset <= -tail->sTailFloatPeak)
{
- if (sprite->data[4] > sprite2->data[5])
- sprite->data[4] = sprite2->data[5];
- else if (sprite->data[4] < -sprite2->data[5])
- sprite->data[4] = -sprite2->data[5];
+ if (body->sYOffset > tail->sTailFloatPeak)
+ body->sYOffset = tail->sTailFloatPeak;
+ else if (body->sYOffset < -tail->sTailFloatPeak)
+ body->sYOffset = -tail->sTailFloatPeak;
- sprite->data[5] *= -1;
+ body->sYOffsetDir *= -1;
}
}
- sprite->data[6]++;
+ body->sFloatTimer++;
}
-static void sub_81D9868(struct Sprite *sprite, u8 animNum, s16 x, s16 y)
+static void ChasesAway_SetRayquazaAnim(struct Sprite *body, u8 animNum, s16 x, s16 y)
{
- struct Sprite *sprite2 = &gSprites[sprite->data[0]];
+ struct Sprite *tail = &gSprites[body->sTailSpriteId];
- sprite2->pos1.x = sprite->pos1.x + x;
- sprite2->pos1.y = sprite->pos1.y + y;
+ tail->pos1.x = body->pos1.x + x;
+ tail->pos1.y = body->pos1.y + y;
- sprite2->pos2.x = sprite->pos2.x;
- sprite2->pos2.y = sprite->pos2.y;
+ tail->pos2.x = body->pos2.x;
+ tail->pos2.y = body->pos2.y;
- StartSpriteAnim(sprite, animNum);
- StartSpriteAnim(sprite2, animNum);
+ StartSpriteAnim(body, animNum);
+ StartSpriteAnim(tail, animNum);
}
-static void sub_81D98B4(u8 taskId)
+#undef sTailSpriteId
+#undef sYOffset
+#undef sYOffsetDir
+#undef sFloatTimer
+#undef sTimer
+#undef sTailFloatDelay
+#undef sTailFloatPeak
+
+#define tState data[0]
+#define tScale data[1]
+#define tNumRings data[2]
+#define tScaleTimer data[3]
+#define tScaleSpeed data[4]
+#define tSoundTimer data[5]
+
+static void Task_ChasesAway_AnimateRing(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- switch (data[0])
+ switch (tState)
{
case 0:
- SetBgAffine(2, 0x4000, 0x4000, 0x78, 0x40, 0x100, 0x100, 0);
+ SetBgAffine(2, 0x4000, 0x4000, 120, 64, 256, 256, 0);
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON);
- data[4] = 16;
- data[0]++;
+ tScaleSpeed = 16;
+ tState++;
break;
case 1:
- if (data[5] == 8)
+ if (tSoundTimer == 8)
PlaySE(SE_JIDO_DOA);
- if (data[2] == 2)
+ if (tNumRings == 2)
{
- data[0]++;
+ tState++;
}
else
{
- data[1] += data[4];
- data[5]++;
- if (data[3] % 3 == 0 && data[4] != 4)
- data[4] -= 2;
-
- data[3]++;
- SetBgAffine(2, 0x4000, 0x4000, 0x78, 0x40, 0x100 - data[1], 0x100 - data[1], 0);
- if (data[1] > 255)
+ tScale += tScaleSpeed;
+ tSoundTimer++;
+ if (tScaleTimer % 3 == 0 && tScaleSpeed != 4)
+ tScaleSpeed -= 2;
+
+ tScaleTimer++;
+ SetBgAffine(2, 0x4000, 0x4000, 120, 64, 256 - tScale, 256 - tScale, 0);
+ if (tScale > 255)
{
- data[1] = 0;
- data[3] = 0;
- data[5] = 0;
- data[4] = 16;
- data[2]++;
+ tScale = 0;
+ tScaleTimer = 0;
+ tSoundTimer = 0;
+ tScaleSpeed = 16;
+ tNumRings++;
}
}
break;