summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/data/graphics/rayquaza_scene.h2
-rw-r--r--src/rayquaza_scene.c156
2 files changed, 104 insertions, 54 deletions
diff --git a/src/data/graphics/rayquaza_scene.h b/src/data/graphics/rayquaza_scene.h
index 54d7966f2..190fb4b3b 100644
--- a/src/data/graphics/rayquaza_scene.h
+++ b/src/data/graphics/rayquaza_scene.h
@@ -24,7 +24,7 @@ const u32 gRaySceneTakesFlight_Bg_Tilemap[] = INCBIN_U32("graphics/rayquaz
// Scene 3 (RAY_ANIM_DESCENDS)
const u32 gRaySceneDescends_Rayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/rayquaza.4bpp.lz");
-// for some reason there are an extra 0xC bytes at the end of the original 4bpp, so in order to produce the correct lz,
+// for some reason there are an extra 0xC bytes at the end of the original rayquaza_tail.4bpp, so in order to produce the correct lz,
// we have to cat the bytes at the end with a make rule. not sure why those bytes are there, it may have been a bug in Game Freak's software.
const u32 gRaySceneDescends_RayquazaTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/rayquaza_tail_fix.4bpp.lz");
const u32 gRaySceneDescends_Bg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/bg.4bpp.lz");
diff --git a/src/rayquaza_scene.c b/src/rayquaza_scene.c
index 92082b2c1..e4b6bed4d 100644
--- a/src/rayquaza_scene.c
+++ b/src/rayquaza_scene.c
@@ -59,6 +59,8 @@ enum
#define TAG_CHASE_RAYQUAZA_TAIL 30570
#define TAG_CHASE_SPLASH 30571
+#define MAX_SMOKE 10
+
struct RayquazaScene
{
MainCallback exitCallback;
@@ -101,7 +103,7 @@ static u8 CreateDuoFightKyogreSprites(void);
static void Task_RayTakesFlightAnim(u8 taskId);
static void Task_HandleRayTakesFlight(u8 taskId);
static void Task_RayTakesFlightEnd(u8 taskId);
-static void sub_81D81A4(u8 taskId);
+static void Task_TakesFlight_CreateSmoke(u8 taskId);
static void SpriteCB_TakesFlight_Smoke(struct Sprite *sprite);
// RAY_ANIM_DESCENDS
@@ -840,7 +842,7 @@ static const struct SpriteTemplate sSpriteTemplate_TakesFlight_Smoke =
.callback = SpriteCB_TakesFlight_Smoke,
};
-static const s8 sUnknown_0862AAB8[][2] =
+static const s8 sTakesFlight_SmokeCoords[MAX_SMOKE][2] =
{
{-1, 5},
{-3, -4},
@@ -1972,6 +1974,24 @@ static void DuoFight_SlideKyogreDown(struct Sprite *sprite)
}
}
+#undef tCounter
+#undef tHelperTaskId
+#undef tGroudonSpriteId
+#undef tKyogreSpriteId
+
+#undef sGroudonBodySpriteId
+#undef sGroudonShoulderSpriteId
+#undef sGroudonClawSpriteId
+
+#define tState data[0]
+#define tTimer data[1]
+#define tScale data[2]
+#define tScaleSpeed data[3]
+#define tYCoord data[4]
+#define tYSpeed data[5]
+#define tYOffset data[6]
+#define tYOffsetDir data[7]
+
static void InitTakesFlightSceneBgs(void)
{
ResetVramOamAndBgCntRegs();
@@ -1994,7 +2014,7 @@ static void InitTakesFlightSceneBgs(void)
static void LoadTakesFlightSceneGfx(void)
{
ResetTempTileDataBuffers();
- DecompressAndCopyTileDataToVram(0, gRaySceneDuoFight_Clouds_Gfx, 0, 0, 0);
+ DecompressAndCopyTileDataToVram(0, gRaySceneDuoFight_Clouds_Gfx, 0, 0, 0); // Re-uses clouds from previous scene
DecompressAndCopyTileDataToVram(1, gRaySceneTakesFlight_Bg_Gfx, 0, 0, 0);
DecompressAndCopyTileDataToVram(2, gRaySceneTakesFlight_Rayquaza_Gfx, 0, 0, 0);
while (FreeTempTileDataBuffersIfPossible())
@@ -2002,7 +2022,7 @@ static void LoadTakesFlightSceneGfx(void)
LZDecompressWram(gRaySceneDuoFight_Clouds2_Tilemap, sRayScene->tilemapBuffers[0]);
LZDecompressWram(gRaySceneTakesFlight_Bg_Tilemap, sRayScene->tilemapBuffers[1]);
LZDecompressWram(gRaySceneTakesFlight_Rayquaza_Tilemap, sRayScene->tilemapBuffers[2]);
- LoadCompressedPalette(gRaySceneTakesFlight_Rayquaza_Pal, 0, 0x40);
+ LoadCompressedPalette(gRaySceneTakesFlight_Rayquaza_Pal, 0, 64);
LoadCompressedSpriteSheet(&sSpriteSheet_TakesFlight_Smoke);
LoadCompressedSpritePalette(&sSpritePal_TakesFlight_Smoke);
}
@@ -2015,75 +2035,93 @@ static void Task_RayTakesFlightAnim(u8 taskId)
LoadTakesFlightSceneGfx();
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_OBJ | BLDCNT_TGT2_BG1 | BLDCNT_EFFECT_BLEND);
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 8));
- BlendPalettes(-1, 0x10, 0);
+ BlendPalettes(-1, 16, 0);
SetVBlankCallback(VBlankCB_RayquazaScene);
- CreateTask(sub_81D81A4, 0);
- data[0] = 0;
- data[1] = 0;
+ CreateTask(Task_TakesFlight_CreateSmoke, 0);
+ tState = 0;
+ tTimer = 0;
gTasks[taskId].func = Task_HandleRayTakesFlight;
}
+// Animate Rayquaza (flying up and down, and changing size as it gets further from the screen)
+// In this scene Rayquaza is a bg tilemap on bg 2, not a sprite
static void Task_HandleRayTakesFlight(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)
{
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK);
- data[2] = 0;
- data[3] = 30;
- data[4] = 0;
- data[5] = 7;
- data[1] = 0;
- data[0]++;
+ tScale = 0;
+ tScaleSpeed = 30;
+ tYCoord = 0;
+ tYSpeed = 7;
+ tTimer = 0;
+ tState++;
}
else
{
- data[1]++;
+ tTimer++;
}
break;
case 1:
- data[2] += data[3];
- data[4] += data[5];
- if (data[3] > 3)
- data[3] -= 3;
- if (data[5] != 0)
- data[5]--;
- if (data[2] > 255)
+ // Fly in
+ tScale += tScaleSpeed;
+ tYCoord += tYSpeed;
+
+ if (tScaleSpeed > 3)
+ tScaleSpeed -= 3;
+
+ if (tYSpeed != 0)
+ tYSpeed--;
+
+ if (tScale > 255)
{
- data[2] = 256;
- data[3] = 0;
- data[6] = 12;
- data[7] = -1;
- data[1] = 0;
- data[0]++;
+ tScale = 256;
+ tScaleSpeed = 0;
+ tYOffset = 12;
+ tYOffsetDir = -1;
+ tTimer = 0;
+ tState++;
}
- SetBgAffine(2, 0x7800, 0x1800, 0x78, data[4] + 32, data[2], data[2], 0);
+ SetBgAffine(2, 0x7800, 0x1800, 0x78, tYCoord + 32, tScale, tScale, 0);
break;
case 2:
- data[1]++;
- SetBgAffine(2, 0x7800, 0x1800, 0x78, data[4] + 32 + (data[6] >> 2), data[2], data[2], 0);
- data[6] += data[7];
- if (data[6] == 12 || data[6] == -12)
+ // Float up and down
+ tTimer++;
+ SetBgAffine(2, 0x7800, 0x1800, 0x78, tYCoord + 32 + (tYOffset >> 2), tScale, tScale, 0);
+ tYOffset += tYOffsetDir;
+ if (tYOffset == 12 || tYOffset == -12)
{
- data[7] *= -1;
- if (data[1] > 295)
+ tYOffsetDir *= -1;
+ if (tTimer > 295)
{
- data[0]++;
+ tState++;
BeginNormalPaletteFade(0xFFFFFFFF, 6, 0, 0x10, RGB_BLACK);
}
}
break;
case 3:
- data[2] += 16;
- SetBgAffine(2, 0x7800, 0x1800, 0x78, data[4] + 32, data[2], data[2], 0);
+ // Fly away, fade out
+ tScale += 16;
+ SetBgAffine(2, 0x7800, 0x1800, 0x78, tYCoord + 32, tScale, tScale, 0);
Task_RayTakesFlightEnd(taskId);
break;
}
}
+#undef tState
+#undef tTimer
+#undef tScale
+#undef tScaleSpeed
+#undef tYCoord
+#undef tYSpeed
+#undef tYOffset
+#undef tYOffsetDir
+
static void Task_RayTakesFlightEnd(u8 taskId)
{
if (!gPaletteFade.active)
@@ -2095,51 +2133,63 @@ static void Task_RayTakesFlightEnd(u8 taskId)
}
}
-static void sub_81D81A4(u8 taskId)
+#define tSmokeId data[0]
+#define tTimer data[1]
+
+#define sSmokeId data[0]
+#define sTimer data[1]
+
+static void Task_TakesFlight_CreateSmoke(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- if ((data[1] & 3) == 0)
+ if ((tTimer & 3) == 0)
{
u8 spriteId = CreateSprite(&sSpriteTemplate_TakesFlight_Smoke,
- (sUnknown_0862AAB8[data[0]][0] * 4) + 120,
- (sUnknown_0862AAB8[data[0]][1] * 4) + 80,
+ (sTakesFlight_SmokeCoords[tSmokeId][0] * 4) + 120,
+ (sTakesFlight_SmokeCoords[tSmokeId][1] * 4) + 80,
0);
- gSprites[spriteId].data[0] = (s8)(data[0]);
+ gSprites[spriteId].sSmokeId = (s8)(tSmokeId);
gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND;
gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE;
gSprites[spriteId].oam.priority = 2;
InitSpriteAffineAnim(&gSprites[spriteId]);
- if (data[0] == 9)
+ if (tSmokeId == MAX_SMOKE - 1)
{
DestroyTask(taskId);
return;
}
else
{
- data[0]++;
+ tSmokeId++;
}
}
- data[1]++;
+ tTimer++;
}
static void SpriteCB_TakesFlight_Smoke(struct Sprite *sprite)
{
- if (sprite->data[1] == 0)
+ if (sprite->sTimer == 0)
{
sprite->pos2.x = 0;
sprite->pos2.y = 0;
}
else
{
- sprite->pos2.x += sUnknown_0862AAB8[sprite->data[0]][0];
- sprite->pos2.y += sUnknown_0862AAB8[sprite->data[0]][1];
+ sprite->pos2.x += sTakesFlight_SmokeCoords[sprite->sSmokeId][0];
+ sprite->pos2.y += sTakesFlight_SmokeCoords[sprite->sSmokeId][1];
}
- sprite->data[1]++;
- sprite->data[1] &= 0xF;
+ sprite->sTimer++;
+ sprite->sTimer &= 0xF;
}
+#undef tSmokeId
+#undef tTimer
+
+#undef sSmokeId
+#undef sTimer
+
static void InitDescendsSceneBgs(void)
{
ResetVramOamAndBgCntRegs();