Document fourth rayquaza scene

This commit is contained in:
GriffinR
2020-08-27 04:21:59 -04:00
parent c7e685edff
commit e63297138d
+90 -58
View File
@@ -90,8 +90,10 @@ static void DuoFight_AnimateRain(void);
static void DuoFight_Lightning1(void); static void DuoFight_Lightning1(void);
static void DuoFight_Lightning2(void); static void DuoFight_Lightning2(void);
static void DuoFight_LightningLong(void); static void DuoFight_LightningLong(void);
static u8 CreateDuoFightGroudonSprites(void); static u8 DuoFightPre_CreateGroudonSprites(void);
static u8 CreateDuoFightKyogreSprites(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_Groudon(struct Sprite *sprite);
static void SpriteCB_DuoFightPre_Kyogre(struct Sprite *sprite); static void SpriteCB_DuoFightPre_Kyogre(struct Sprite *sprite);
static void SpriteCB_DuoFight_Groudon(struct Sprite *sprite); static void SpriteCB_DuoFight_Groudon(struct Sprite *sprite);
@@ -117,9 +119,9 @@ static void SpriteCB_Descends_Rayquaza(struct Sprite *sprite);
static void Task_RayChargesAnim(u8 taskId); static void Task_RayChargesAnim(u8 taskId);
static void Task_HandleRayCharges(u8 taskId); static void Task_HandleRayCharges(u8 taskId);
static void Task_RayChargesEnd(u8 taskId); static void Task_RayChargesEnd(u8 taskId);
static void sub_81D8AD8(u8 taskId); static void Task_RayCharges_ShakeRayquaza(u8 taskId);
static void sub_81D8B2C(u8 taskId); static void Task_RayCharges_FlyOffscreen(u8 taskId);
static void sub_81D8BB4(void); static void RayCharges_AnimateBg(void);
// RAY_ANIM_CHASES_AWAY // RAY_ANIM_CHASES_AWAY
static void Task_RayChasesAwayAnim(u8 taskId); static void Task_RayChasesAwayAnim(u8 taskId);
@@ -1349,7 +1351,9 @@ static void Task_SetNextAnim(u8 taskId)
} }
} }
static void sub_81D68C8(void) // The cutscene window is cropped to a narrower view, with black borders on each vertical edge
// This function is used in scenes where sprites in these borders need to be hidden
static void SetWindowsHideVertBorders(void)
{ {
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_ALL); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_ALL);
SetGpuReg(REG_OFFSET_WINOUT, 0); SetGpuReg(REG_OFFSET_WINOUT, 0);
@@ -1359,7 +1363,7 @@ static void sub_81D68C8(void)
gPlttBufferFaded[0] = 0; gPlttBufferFaded[0] = 0;
} }
static void sub_81D6904(void) static void ResetWindowDimensions(void)
{ {
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_ALL); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_ALL);
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_ALL); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_ALL);
@@ -1406,7 +1410,7 @@ static void Task_HandleDuoFightPre(u8 taskId)
} }
} }
static u8 CreateDuoFightPreGroudonSprites(void) static u8 DuoFightPre_CreateGroudonSprites(void)
{ {
u8 spriteId; u8 spriteId;
s16 *data; s16 *data;
@@ -1458,7 +1462,7 @@ static void SpriteCB_DuoFightPre_Groudon(struct Sprite *sprite)
} }
} }
static u8 CreateDuoFightPreKyogreSprites(void) static u8 DuoFightPre_CreateKyogreSprites(void)
{ {
u8 spriteId; u8 spriteId;
s16 *data; s16 *data;
@@ -1608,14 +1612,14 @@ static void Task_DuoFightAnim(u8 taskId)
tHelperTaskId = CreateTask(Task_DuoFight_AnimateClouds, 0); tHelperTaskId = CreateTask(Task_DuoFight_AnimateClouds, 0);
if (sRayScene->animId == RAY_ANIM_DUO_FIGHT_PRE) if (sRayScene->animId == RAY_ANIM_DUO_FIGHT_PRE)
{ {
tGroudonSpriteId = CreateDuoFightPreGroudonSprites(); tGroudonSpriteId = DuoFightPre_CreateGroudonSprites();
tKyogreSpriteId = CreateDuoFightPreKyogreSprites(); tKyogreSpriteId = DuoFightPre_CreateKyogreSprites();
gTasks[taskId].func = Task_HandleDuoFightPre; gTasks[taskId].func = Task_HandleDuoFightPre;
} }
else else
{ {
tGroudonSpriteId = CreateDuoFightGroudonSprites(); tGroudonSpriteId = DuoFight_CreateGroudonSprites();
tKyogreSpriteId = CreateDuoFightKyogreSprites(); tKyogreSpriteId = DuoFight_CreateKyogreSprites();
gTasks[taskId].func = Task_HandleDuoFight; gTasks[taskId].func = Task_HandleDuoFight;
StopMapMusic(); StopMapMusic();
} }
@@ -1798,7 +1802,7 @@ static void Task_DuoFightEnd(u8 taskId)
} }
} }
static u8 CreateDuoFightGroudonSprites(void) static u8 DuoFight_CreateGroudonSprites(void)
{ {
u8 spriteId; u8 spriteId;
s16 *data; s16 *data;
@@ -1862,7 +1866,7 @@ static void DuoFight_SlideGroudonDown(struct Sprite *sprite)
} }
} }
static u8 CreateDuoFightKyogreSprites(void) static u8 DuoFight_CreateKyogreSprites(void)
{ {
u8 spriteId; u8 spriteId;
s16 *data; s16 *data;
@@ -2277,7 +2281,7 @@ static void Task_RayDescendsAnim(u8 taskId)
sRayScene->revealedLightTimer = 0; sRayScene->revealedLightTimer = 0;
tState = 0; tState = 0;
tTimer = 0; tTimer = 0;
data[2] = 0; data[2] = 0; // Below data assignments do nothing
data[3] = 0; data[3] = 0;
data[4] = 0x1000; data[4] = 0x1000;
gTasks[taskId].func = Task_HandleRayDescends; gTasks[taskId].func = Task_HandleRayDescends;
@@ -2474,110 +2478,136 @@ static void LoadChargesSceneGfx(void)
LoadCompressedPalette(gRaySceneCharges_Bg_Pal, 0, 0x80); LoadCompressedPalette(gRaySceneCharges_Bg_Pal, 0, 0x80);
} }
#define tState data[0]
#define tTimer data[1]
#define tRayquazaTaskId data[2]
#define tSoundTimer data[3]
static void Task_RayChargesAnim(u8 taskId) static void Task_RayChargesAnim(u8 taskId)
{ {
s16 *data = gTasks[taskId].data; s16 *data = gTasks[taskId].data;
InitChargesSceneBgs(); InitChargesSceneBgs();
LoadChargesSceneGfx(); LoadChargesSceneGfx();
sub_81D68C8(); SetWindowsHideVertBorders();
BlendPalettes(-1, 0x10, 0); BlendPalettes(-1, 0x10, 0);
SetVBlankCallback(VBlankCB_RayquazaScene); SetVBlankCallback(VBlankCB_RayquazaScene);
data[0] = 0; tState = 0;
data[1] = 0; tTimer = 0;
data[2] = CreateTask(sub_81D8AD8, 0); tRayquazaTaskId = CreateTask(Task_RayCharges_ShakeRayquaza, 0);
gTasks[taskId].func = Task_HandleRayCharges; gTasks[taskId].func = Task_HandleRayCharges;
} }
static void Task_HandleRayCharges(u8 taskId) static void Task_HandleRayCharges(u8 taskId)
{ {
s16 *data = gTasks[taskId].data; s16 *data = gTasks[taskId].data;
sub_81D8BB4(); RayCharges_AnimateBg();
if ((data[3] & 7) == 0 && data[0] <= 1 && data[1] <= 89) if ((tSoundTimer & 7) == 0 && tState <= 1 && tTimer <= 89)
PlaySE(SE_OP_BASYU); PlaySE(SE_OP_BASYU);
data[3]++; tSoundTimer++;
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[1] = 0; tTimer = 0;
data[0]++; tState++;
} }
else else
{ {
data[1]++; tTimer++;
} }
break; break;
case 1: case 1:
if (data[1] == 127) // Delay while Rayquaza shakes, then start Rayquaza moving offscreen
if (tTimer == 127)
{ {
data[1] = 0; tTimer = 0;
data[0]++; tState++;
gTasks[data[2]].func = sub_81D8B2C; gTasks[tRayquazaTaskId].func = Task_RayCharges_FlyOffscreen;
} }
else else
{ {
data[1]++; tTimer++;
} }
break; break;
case 2: case 2:
if (data[1] == 12) // Delay for Rayquaza's flying animation
if (tTimer == 12)
{ {
data[1] = 0; tTimer = 0;
data[0]++; tState++;
} }
else else
{ {
data[1]++; tTimer++;
} }
break; break;
case 3: case 3:
// Fade out
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK);
gTasks[taskId].func = Task_RayChargesEnd; gTasks[taskId].func = Task_RayChargesEnd;
break; break;
} }
} }
// These two, BG scrolling for Rayquaza charge #undef tState
static void sub_81D8AD8(u8 taskId) #undef tTimer
#undef tSoundTimer
#define tState data[0]
#define tOffset data[1]
#define tShakeDir data[2]
#define tTimer data[15]
static void Task_RayCharges_ShakeRayquaza(u8 taskId)
{ {
s16 *data = gTasks[taskId].data; s16 *data = gTasks[taskId].data;
if ((data[15] & 3) == 0) if ((tTimer & 3) == 0)
{ {
ChangeBgX(1, (Random() % 8 - 4) << 8, 0); ChangeBgX(1, (Random() % 8 - 4) << 8, 0);
ChangeBgY(1, (Random() % 8 - 4) << 8, 0); ChangeBgY(1, (Random() % 8 - 4) << 8, 0);
} }
data[15]++; tTimer++;
} }
static void sub_81D8B2C(u8 taskId) // Rayquaza backs up then launches forward
static void Task_RayCharges_FlyOffscreen(u8 taskId)
{ {
s16 *data = gTasks[taskId].data; s16 *data = gTasks[taskId].data;
if (data[0] == 0) if (tState == 0)
{ {
ChangeBgX(1, 0, 0); ChangeBgX(1, 0, 0);
ChangeBgY(1, 0, 0); ChangeBgY(1, 0, 0);
data[0]++; tState++;
data[1] = 10; tOffset = 10;
data[2] = -1; tShakeDir = -1;
} }
else if (data[0] == 1) else if (tState == 1)
{ {
ChangeBgX(1, data[1] << 8, 2); ChangeBgX(1, tOffset << 8, 2);
ChangeBgY(1, data[1] << 8, 1); ChangeBgY(1, tOffset << 8, 1);
data[1] += data[2]; tOffset += tShakeDir;
if (data[1] == -10) if (tOffset == -10)
data[2] *= -1; tShakeDir *= -1;
} }
} }
static void sub_81D8BB4(void) #undef tState
#undef tOffset
#undef tShakeDir
#undef tTimer
static void RayCharges_AnimateBg(void)
{ {
// Update yellow orbs
ChangeBgX(2, 0x400, 2); ChangeBgX(2, 0x400, 2);
ChangeBgY(2, 0x400, 1); ChangeBgY(2, 0x400, 1);
// Update blue streaks
ChangeBgX(0, 0x800, 2); ChangeBgX(0, 0x800, 2);
ChangeBgY(0, 0x800, 1); ChangeBgY(0, 0x800, 1);
} }
@@ -2585,16 +2615,18 @@ static void sub_81D8BB4(void)
static void Task_RayChargesEnd(u8 taskId) static void Task_RayChargesEnd(u8 taskId)
{ {
s16 *data = gTasks[taskId].data; s16 *data = gTasks[taskId].data;
sub_81D8BB4(); RayCharges_AnimateBg();
if (!gPaletteFade.active) if (!gPaletteFade.active)
{ {
SetVBlankCallback(NULL); SetVBlankCallback(NULL);
sub_81D6904(); ResetWindowDimensions();
DestroyTask(data[2]); DestroyTask(tRayquazaTaskId);
gTasks[taskId].func = Task_SetNextAnim; gTasks[taskId].func = Task_SetNextAnim;
} }
} }
#undef tRayquazaTaskId
static void InitChasesAwaySceneBgs(void) static void InitChasesAwaySceneBgs(void)
{ {
ResetVramOamAndBgCntRegs(); ResetVramOamAndBgCntRegs();
@@ -2643,7 +2675,7 @@ static void Task_RayChasesAwayAnim(u8 taskId)
s16 *data = gTasks[taskId].data; s16 *data = gTasks[taskId].data;
InitChasesAwaySceneBgs(); InitChasesAwaySceneBgs();
LoadChasesAwaySceneGfx(); LoadChasesAwaySceneGfx();
sub_81D68C8(); SetWindowsHideVertBorders();
ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON); ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON);
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_EFFECT_BLEND);
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(9, 14)); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(9, 14));
@@ -2743,7 +2775,7 @@ static void Task_RayChasesAwayEnd(u8 taskId)
if (data[1] == 0) if (data[1] == 0)
{ {
SetVBlankCallback(NULL); SetVBlankCallback(NULL);
sub_81D6904(); ResetWindowDimensions();
ResetSpriteData(); ResetSpriteData();
FreeAllSpritePalettes(); FreeAllSpritePalettes();
DestroyTask(data[2]); DestroyTask(data[2]);