Document second rayquaza scene
This commit is contained in:
@@ -24,7 +24,7 @@ const u32 gRaySceneTakesFlight_Bg_Tilemap[] = INCBIN_U32("graphics/rayquaz
|
|||||||
|
|
||||||
// Scene 3 (RAY_ANIM_DESCENDS)
|
// Scene 3 (RAY_ANIM_DESCENDS)
|
||||||
const u32 gRaySceneDescends_Rayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/rayquaza.4bpp.lz");
|
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.
|
// 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_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");
|
const u32 gRaySceneDescends_Bg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/bg.4bpp.lz");
|
||||||
|
|||||||
+103
-53
@@ -59,6 +59,8 @@ enum
|
|||||||
#define TAG_CHASE_RAYQUAZA_TAIL 30570
|
#define TAG_CHASE_RAYQUAZA_TAIL 30570
|
||||||
#define TAG_CHASE_SPLASH 30571
|
#define TAG_CHASE_SPLASH 30571
|
||||||
|
|
||||||
|
#define MAX_SMOKE 10
|
||||||
|
|
||||||
struct RayquazaScene
|
struct RayquazaScene
|
||||||
{
|
{
|
||||||
MainCallback exitCallback;
|
MainCallback exitCallback;
|
||||||
@@ -101,7 +103,7 @@ static u8 CreateDuoFightKyogreSprites(void);
|
|||||||
static void Task_RayTakesFlightAnim(u8 taskId);
|
static void Task_RayTakesFlightAnim(u8 taskId);
|
||||||
static void Task_HandleRayTakesFlight(u8 taskId);
|
static void Task_HandleRayTakesFlight(u8 taskId);
|
||||||
static void Task_RayTakesFlightEnd(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);
|
static void SpriteCB_TakesFlight_Smoke(struct Sprite *sprite);
|
||||||
|
|
||||||
// RAY_ANIM_DESCENDS
|
// RAY_ANIM_DESCENDS
|
||||||
@@ -840,7 +842,7 @@ static const struct SpriteTemplate sSpriteTemplate_TakesFlight_Smoke =
|
|||||||
.callback = SpriteCB_TakesFlight_Smoke,
|
.callback = SpriteCB_TakesFlight_Smoke,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const s8 sUnknown_0862AAB8[][2] =
|
static const s8 sTakesFlight_SmokeCoords[MAX_SMOKE][2] =
|
||||||
{
|
{
|
||||||
{-1, 5},
|
{-1, 5},
|
||||||
{-3, -4},
|
{-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)
|
static void InitTakesFlightSceneBgs(void)
|
||||||
{
|
{
|
||||||
ResetVramOamAndBgCntRegs();
|
ResetVramOamAndBgCntRegs();
|
||||||
@@ -1994,7 +2014,7 @@ static void InitTakesFlightSceneBgs(void)
|
|||||||
static void LoadTakesFlightSceneGfx(void)
|
static void LoadTakesFlightSceneGfx(void)
|
||||||
{
|
{
|
||||||
ResetTempTileDataBuffers();
|
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(1, gRaySceneTakesFlight_Bg_Gfx, 0, 0, 0);
|
||||||
DecompressAndCopyTileDataToVram(2, gRaySceneTakesFlight_Rayquaza_Gfx, 0, 0, 0);
|
DecompressAndCopyTileDataToVram(2, gRaySceneTakesFlight_Rayquaza_Gfx, 0, 0, 0);
|
||||||
while (FreeTempTileDataBuffersIfPossible())
|
while (FreeTempTileDataBuffersIfPossible())
|
||||||
@@ -2002,7 +2022,7 @@ static void LoadTakesFlightSceneGfx(void)
|
|||||||
LZDecompressWram(gRaySceneDuoFight_Clouds2_Tilemap, sRayScene->tilemapBuffers[0]);
|
LZDecompressWram(gRaySceneDuoFight_Clouds2_Tilemap, sRayScene->tilemapBuffers[0]);
|
||||||
LZDecompressWram(gRaySceneTakesFlight_Bg_Tilemap, sRayScene->tilemapBuffers[1]);
|
LZDecompressWram(gRaySceneTakesFlight_Bg_Tilemap, sRayScene->tilemapBuffers[1]);
|
||||||
LZDecompressWram(gRaySceneTakesFlight_Rayquaza_Tilemap, sRayScene->tilemapBuffers[2]);
|
LZDecompressWram(gRaySceneTakesFlight_Rayquaza_Tilemap, sRayScene->tilemapBuffers[2]);
|
||||||
LoadCompressedPalette(gRaySceneTakesFlight_Rayquaza_Pal, 0, 0x40);
|
LoadCompressedPalette(gRaySceneTakesFlight_Rayquaza_Pal, 0, 64);
|
||||||
LoadCompressedSpriteSheet(&sSpriteSheet_TakesFlight_Smoke);
|
LoadCompressedSpriteSheet(&sSpriteSheet_TakesFlight_Smoke);
|
||||||
LoadCompressedSpritePalette(&sSpritePal_TakesFlight_Smoke);
|
LoadCompressedSpritePalette(&sSpritePal_TakesFlight_Smoke);
|
||||||
}
|
}
|
||||||
@@ -2015,75 +2035,93 @@ static void Task_RayTakesFlightAnim(u8 taskId)
|
|||||||
LoadTakesFlightSceneGfx();
|
LoadTakesFlightSceneGfx();
|
||||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_OBJ | BLDCNT_TGT2_BG1 | BLDCNT_EFFECT_BLEND);
|
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_OBJ | BLDCNT_TGT2_BG1 | BLDCNT_EFFECT_BLEND);
|
||||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 8));
|
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 8));
|
||||||
BlendPalettes(-1, 0x10, 0);
|
BlendPalettes(-1, 16, 0);
|
||||||
SetVBlankCallback(VBlankCB_RayquazaScene);
|
SetVBlankCallback(VBlankCB_RayquazaScene);
|
||||||
CreateTask(sub_81D81A4, 0);
|
CreateTask(Task_TakesFlight_CreateSmoke, 0);
|
||||||
data[0] = 0;
|
tState = 0;
|
||||||
data[1] = 0;
|
tTimer = 0;
|
||||||
gTasks[taskId].func = Task_HandleRayTakesFlight;
|
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)
|
static void Task_HandleRayTakesFlight(u8 taskId)
|
||||||
{
|
{
|
||||||
s16 *data = gTasks[taskId].data;
|
s16 *data = gTasks[taskId].data;
|
||||||
switch (data[0])
|
switch (tState)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
if (data[1] == 8)
|
// Delay, then fade in
|
||||||
|
if (tTimer == 8)
|
||||||
{
|
{
|
||||||
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK);
|
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK);
|
||||||
data[2] = 0;
|
tScale = 0;
|
||||||
data[3] = 30;
|
tScaleSpeed = 30;
|
||||||
data[4] = 0;
|
tYCoord = 0;
|
||||||
data[5] = 7;
|
tYSpeed = 7;
|
||||||
data[1] = 0;
|
tTimer = 0;
|
||||||
data[0]++;
|
tState++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
data[1]++;
|
tTimer++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
data[2] += data[3];
|
// Fly in
|
||||||
data[4] += data[5];
|
tScale += tScaleSpeed;
|
||||||
if (data[3] > 3)
|
tYCoord += tYSpeed;
|
||||||
data[3] -= 3;
|
|
||||||
if (data[5] != 0)
|
if (tScaleSpeed > 3)
|
||||||
data[5]--;
|
tScaleSpeed -= 3;
|
||||||
if (data[2] > 255)
|
|
||||||
|
if (tYSpeed != 0)
|
||||||
|
tYSpeed--;
|
||||||
|
|
||||||
|
if (tScale > 255)
|
||||||
{
|
{
|
||||||
data[2] = 256;
|
tScale = 256;
|
||||||
data[3] = 0;
|
tScaleSpeed = 0;
|
||||||
data[6] = 12;
|
tYOffset = 12;
|
||||||
data[7] = -1;
|
tYOffsetDir = -1;
|
||||||
data[1] = 0;
|
tTimer = 0;
|
||||||
data[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;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
data[1]++;
|
// Float up and down
|
||||||
SetBgAffine(2, 0x7800, 0x1800, 0x78, data[4] + 32 + (data[6] >> 2), data[2], data[2], 0);
|
tTimer++;
|
||||||
data[6] += data[7];
|
SetBgAffine(2, 0x7800, 0x1800, 0x78, tYCoord + 32 + (tYOffset >> 2), tScale, tScale, 0);
|
||||||
if (data[6] == 12 || data[6] == -12)
|
tYOffset += tYOffsetDir;
|
||||||
|
if (tYOffset == 12 || tYOffset == -12)
|
||||||
{
|
{
|
||||||
data[7] *= -1;
|
tYOffsetDir *= -1;
|
||||||
if (data[1] > 295)
|
if (tTimer > 295)
|
||||||
{
|
{
|
||||||
data[0]++;
|
tState++;
|
||||||
BeginNormalPaletteFade(0xFFFFFFFF, 6, 0, 0x10, RGB_BLACK);
|
BeginNormalPaletteFade(0xFFFFFFFF, 6, 0, 0x10, RGB_BLACK);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
data[2] += 16;
|
// Fly away, fade out
|
||||||
SetBgAffine(2, 0x7800, 0x1800, 0x78, data[4] + 32, data[2], data[2], 0);
|
tScale += 16;
|
||||||
|
SetBgAffine(2, 0x7800, 0x1800, 0x78, tYCoord + 32, tScale, tScale, 0);
|
||||||
Task_RayTakesFlightEnd(taskId);
|
Task_RayTakesFlightEnd(taskId);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef tState
|
||||||
|
#undef tTimer
|
||||||
|
#undef tScale
|
||||||
|
#undef tScaleSpeed
|
||||||
|
#undef tYCoord
|
||||||
|
#undef tYSpeed
|
||||||
|
#undef tYOffset
|
||||||
|
#undef tYOffsetDir
|
||||||
|
|
||||||
static void Task_RayTakesFlightEnd(u8 taskId)
|
static void Task_RayTakesFlightEnd(u8 taskId)
|
||||||
{
|
{
|
||||||
if (!gPaletteFade.active)
|
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;
|
s16 *data = gTasks[taskId].data;
|
||||||
if ((data[1] & 3) == 0)
|
if ((tTimer & 3) == 0)
|
||||||
{
|
{
|
||||||
u8 spriteId = CreateSprite(&sSpriteTemplate_TakesFlight_Smoke,
|
u8 spriteId = CreateSprite(&sSpriteTemplate_TakesFlight_Smoke,
|
||||||
(sUnknown_0862AAB8[data[0]][0] * 4) + 120,
|
(sTakesFlight_SmokeCoords[tSmokeId][0] * 4) + 120,
|
||||||
(sUnknown_0862AAB8[data[0]][1] * 4) + 80,
|
(sTakesFlight_SmokeCoords[tSmokeId][1] * 4) + 80,
|
||||||
0);
|
0);
|
||||||
gSprites[spriteId].data[0] = (s8)(data[0]);
|
gSprites[spriteId].sSmokeId = (s8)(tSmokeId);
|
||||||
gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND;
|
gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND;
|
||||||
gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE;
|
gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE;
|
||||||
gSprites[spriteId].oam.priority = 2;
|
gSprites[spriteId].oam.priority = 2;
|
||||||
InitSpriteAffineAnim(&gSprites[spriteId]);
|
InitSpriteAffineAnim(&gSprites[spriteId]);
|
||||||
if (data[0] == 9)
|
if (tSmokeId == MAX_SMOKE - 1)
|
||||||
{
|
{
|
||||||
DestroyTask(taskId);
|
DestroyTask(taskId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
data[0]++;
|
tSmokeId++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
data[1]++;
|
tTimer++;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SpriteCB_TakesFlight_Smoke(struct Sprite *sprite)
|
static void SpriteCB_TakesFlight_Smoke(struct Sprite *sprite)
|
||||||
{
|
{
|
||||||
if (sprite->data[1] == 0)
|
if (sprite->sTimer == 0)
|
||||||
{
|
{
|
||||||
sprite->pos2.x = 0;
|
sprite->pos2.x = 0;
|
||||||
sprite->pos2.y = 0;
|
sprite->pos2.y = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sprite->pos2.x += sUnknown_0862AAB8[sprite->data[0]][0];
|
sprite->pos2.x += sTakesFlight_SmokeCoords[sprite->sSmokeId][0];
|
||||||
sprite->pos2.y += sUnknown_0862AAB8[sprite->data[0]][1];
|
sprite->pos2.y += sTakesFlight_SmokeCoords[sprite->sSmokeId][1];
|
||||||
}
|
}
|
||||||
|
|
||||||
sprite->data[1]++;
|
sprite->sTimer++;
|
||||||
sprite->data[1] &= 0xF;
|
sprite->sTimer &= 0xF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef tSmokeId
|
||||||
|
#undef tTimer
|
||||||
|
|
||||||
|
#undef sSmokeId
|
||||||
|
#undef sTimer
|
||||||
|
|
||||||
static void InitDescendsSceneBgs(void)
|
static void InitDescendsSceneBgs(void)
|
||||||
{
|
{
|
||||||
ResetVramOamAndBgCntRegs();
|
ResetVramOamAndBgCntRegs();
|
||||||
|
|||||||
Reference in New Issue
Block a user