diff options
Diffstat (limited to 'src/rayquaza_scene.c')
-rw-r--r-- | src/rayquaza_scene.c | 2130 |
1 files changed, 1194 insertions, 936 deletions
diff --git a/src/rayquaza_scene.c b/src/rayquaza_scene.c index f47ab5e89..063e6f324 100644 --- a/src/rayquaza_scene.c +++ b/src/rayquaza_scene.c @@ -18,87 +18,139 @@ #include "constants/rgb.h" #include "random.h" -struct RaySceneStruct -{ - MainCallback callback; - u8 tilemapBuffers[4][0x800]; - u16 field_2004; // set but unused +/* + This file handles the cutscene showing Rayquaza arriving to settle the Groudon/Kyogre fight + It consists of 5 separate scenes: + - Groudon and Kyogre facing one another in a thunderstorm (RAY_ANIM_DUO_FIGHT) + - Over-the-shoulder of Rayquaza flying (RAY_ANIM_TAKES_FLIGHT) + - Rayquaza emerging from a spotlight down through the clouds (RAY_ANIM_DESCENDS) + - A close-up of Rayquaza flying down (RAY_ANIM_CHARGES) + - Rayquaza floating above Groudon/Kyogre as they back away offscreen (RAY_ANIM_CHASES_AWAY) + + A shortened version of the first scene is used when the player first arrives + in Sootopolis during the Groudon/Kyogre conflict, before awakening Rayquaza (RAY_ANIM_DUO_FIGHT_PRE) + This is indicated with the first two arguments to DoRayquazaScene +*/ + +enum +{ + RAY_ANIM_DUO_FIGHT_PRE, + RAY_ANIM_DUO_FIGHT, + RAY_ANIM_TAKES_FLIGHT, + RAY_ANIM_DESCENDS, + RAY_ANIM_CHARGES, + RAY_ANIM_CHASES_AWAY, + RAY_ANIM_END +}; + +#define TAG_DUOFIGHT_GROUDON 30505 +#define TAG_DUOFIGHT_GROUDON_SHOULDER 30506 +#define TAG_DUOFIGHT_GROUDON_CLAW 30507 +#define TAG_DUOFIGHT_KYOGRE 30508 +#define TAG_DUOFIGHT_KYOGRE_PECTORAL_FIN 30509 +#define TAG_DUOFIGHT_KYOGRE_DORSAL_FIN 30510 +#define TAG_FLIGHT_SMOKE 30555 +#define TAG_DESCENDS_RAYQUAZA 30556 +#define TAG_DESCENDS_RAYQUAZA_TAIL 30557 +#define TAG_CHASE_GROUDON 30565 +#define TAG_CHASE_GROUDON_TAIL 30566 +#define TAG_CHASE_KYOGRE 30568 +#define TAG_CHASE_RAYQUAZA 30569 +#define TAG_CHASE_RAYQUAZA_TAIL 30570 +#define TAG_CHASE_SPLASH 30571 + +#define MAX_SMOKE 10 + +struct RayquazaScene +{ + MainCallback exitCallback; + u8 tilemapBuffers[4][BG_SCREEN_SIZE]; + u16 unk; // never read u8 animId; - bool8 onlyOneAnim; - s16 field_2008; - s16 field_200A; - u8 unusedFields[12]; // completely unused -}; - -// EWRAM vars -static EWRAM_DATA struct RaySceneStruct *sRayScene = NULL; - -// this file's functions -static void Task_DuoFightAnim(u8 taskId); -static void Task_RayTakesFlightAnim(u8 taskId); -static void Task_RayDescendsAnim(u8 taskId); -static void Task_RayChargesAnim(u8 taskId); -static void Task_RayChasesAwayAnim(u8 taskId); -static void Task_HandleRayDescends(u8 taskId); -static void Task_RayDescendsEnd(u8 taskId); -static void Task_HandleRayCharges(u8 taskId); -static void sub_81D8AD8(u8 taskId); -static void sub_81D8B2C(u8 taskId); -static void Task_RayChargesEnd(u8 taskId); -static void Task_HandleRayChasesAway(u8 taskId); -static void sub_81D8FB0(u8 taskId); -static void sub_81D7228(u8 taskId); -static void Task_HandleDuoFight(u8 taskId); -static void sub_81D752C(u8 taskId); -static void Task_DuoFightEnd(u8 taskId); -static void Task_HandleRayTakesFlight(u8 taskId); -static void sub_81D81A4(u8 taskId); -static void Task_RayTakesFlightEnd(u8 taskId); -static void sub_81D94D4(u8 taskId); -static void sub_81D93D8(u8 taskId); -static void Task_RayChasesAwayEnd(u8 taskId); -static void sub_81D90A8(u8 taskId); -static void sub_81D98B4(u8 taskId); -static void Task_EndAfterFadeScreen(u8 taskId); + bool8 endEarly; + s16 revealedLightLine; + s16 revealedLightTimer; + u8 unused[12]; +}; + +static EWRAM_DATA struct RayquazaScene *sRayScene = NULL; + static void CB2_InitRayquazaScene(void); static void CB2_RayquazaScene(void); -static void sub_81D750C(void); -static void sub_81D7438(void); -static void sub_81D7480(void); -static void sub_81D74C8(void); -static void sub_81D8BB4(void); -static void sub_81D6A20(struct Sprite *sprite); -static void sub_81D6D20(struct Sprite *sprite); -static void sub_81D7860(struct Sprite *sprite); -static void sub_81D7D14(struct Sprite *sprite); -static void sub_81D7700(struct Sprite *sprite); -static void sub_81D7A60(struct Sprite *sprite); -static void sub_81D874C(struct Sprite *sprite); -static void sub_81D9338(struct Sprite *sprite); -static void sub_81D9420(struct Sprite *sprite); -static void sub_81D8260(struct Sprite *sprite); -static void sub_81D961C(struct Sprite *sprite); -static void sub_81D97E0(struct Sprite *sprite); -static void sub_81D9528(struct Sprite *sprite); -static u8 sub_81D7664(void); -static u8 sub_81D78BC(void); -static u8 sub_81D86CC(void); -static void DuoFightEnd(u8 taskId, s8 palDelay); -static void sub_81D9868(struct Sprite *sprite, u8 animNum, s16 x, s16 y); - -// const rom data +static void Task_EndAfterFadeScreen(u8); + +// RAY_ANIM_DUO_FIGHT_PRE / RAY_ANIM_DUO_FIGHT +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); +static void DuoFight_LightningLong(void); +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 *); +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); +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); +static void Task_HandleRayDescends(u8); +static void Task_RayDescendsEnd(u8); +static u8 CreateDescendsRayquazaSprite(void); +static void SpriteCB_Descends_Rayquaza(struct Sprite *); + +// RAY_ANIM_CHARGES +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); +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[] = { [RAY_ANIM_DUO_FIGHT_PRE] = Task_DuoFightAnim, - [RAY_ANIM_DUO_FIGHT] = Task_DuoFightAnim, - [RAY_ANIM_TAKES_FLIGHT] = Task_RayTakesFlightAnim, - [RAY_ANIM_DESCENDS] = Task_RayDescendsAnim, - [RAY_ANIM_CHARGES] = Task_RayChargesAnim, - [RAY_ANIM_CHACES_AWAY] = Task_RayChasesAwayAnim, - [RAY_ANIM_END] = Task_EndAfterFadeScreen, + [RAY_ANIM_DUO_FIGHT] = Task_DuoFightAnim, + [RAY_ANIM_TAKES_FLIGHT] = Task_RayTakesFlightAnim, + [RAY_ANIM_DESCENDS] = Task_RayDescendsAnim, + [RAY_ANIM_CHARGES] = Task_RayChargesAnim, + [RAY_ANIM_CHASES_AWAY] = Task_RayChasesAwayAnim, + [RAY_ANIM_END] = Task_EndAfterFadeScreen, }; -static const struct OamData sOamData_862A6BC = +static const struct OamData sOam_64x64 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -115,7 +167,7 @@ static const struct OamData sOamData_862A6BC = .affineParam = 0 }; -static const struct OamData sOamData_862A6C4 = +static const struct OamData sOam_32x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -132,7 +184,7 @@ static const struct OamData sOamData_862A6C4 = .affineParam = 0 }; -static const struct OamData sOamData_862A6CC = +static const struct OamData sOam_64x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -149,7 +201,7 @@ static const struct OamData sOamData_862A6CC = .affineParam = 0 }; -static const struct OamData sOamData_862A6D4 = +static const struct OamData sOam_32x16 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -166,7 +218,7 @@ static const struct OamData sOamData_862A6D4 = .affineParam = 0 }; -static const struct OamData sOamData_862A6DC = +static const struct OamData sOam_16x8 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -183,7 +235,7 @@ static const struct OamData sOamData_862A6DC = .affineParam = 0 }; -static const struct OamData sOamData_862A6E4 = +static const struct OamData sOam_16x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -200,7 +252,7 @@ static const struct OamData sOamData_862A6E4 = .affineParam = 0 }; -static const struct OamData sOamData_862A6EC = +static const struct OamData sOam_16x16 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -217,7 +269,7 @@ static const struct OamData sOamData_862A6EC = .affineParam = 0 }; -static const struct OamData sOamData_862A6F4 = +static const struct OamData sOam_32x8 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -234,7 +286,7 @@ static const struct OamData sOamData_862A6F4 = .affineParam = 0 }; -static const union AnimCmd sSpriteAnim_862A6FC[] = +static const union AnimCmd sAnim_DuoFightPre_Groudon_Head[] = { ANIMCMD_FRAME(0, 30), ANIMCMD_FRAME(64, 30), @@ -243,7 +295,7 @@ static const union AnimCmd sSpriteAnim_862A6FC[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd sSpriteAnim_862A710[] = +static const union AnimCmd sAnim_DuoFightPre_Groudon_Body[] = { ANIMCMD_FRAME(192, 30), ANIMCMD_FRAME(256, 30), @@ -252,104 +304,104 @@ static const union AnimCmd sSpriteAnim_862A710[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd *const sSpriteAnimTable_862A724[] = +static const union AnimCmd *const sAnims_DuoFightPre_Groudon[] = { - sSpriteAnim_862A6FC, - sSpriteAnim_862A710 + sAnim_DuoFightPre_Groudon_Head, + sAnim_DuoFightPre_Groudon_Body }; -static const struct SpriteTemplate sUnknown_0862A72C = +static const struct SpriteTemplate sSpriteTemplate_DuoFightPre_Groudon = { - .tileTag = 30505, - .paletteTag = 30505, - .oam = &sOamData_862A6BC, - .anims = sSpriteAnimTable_862A724, + .tileTag = TAG_DUOFIGHT_GROUDON, + .paletteTag = TAG_DUOFIGHT_GROUDON, + .oam = &sOam_64x64, + .anims = sAnims_DuoFightPre_Groudon, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const union AnimCmd sSpriteAnim_862A744[] = +static const union AnimCmd sAnim_DuoFightPre_GroudonShoulderKyogreDorsalFin[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_862A74C[] = +static const union AnimCmd *const sAnims_DuoFightPre_GroudonShoulderKyogreDorsalFin[] = { - sSpriteAnim_862A744 + sAnim_DuoFightPre_GroudonShoulderKyogreDorsalFin }; -static const struct SpriteTemplate sUnknown_0862A750 = +static const struct SpriteTemplate sSpriteTemplate_DuoFightPre_GroudonShoulder = { - .tileTag = 30506, - .paletteTag = 30505, - .oam = &sOamData_862A6C4, - .anims = sSpriteAnimTable_862A74C, + .tileTag = TAG_DUOFIGHT_GROUDON_SHOULDER, + .paletteTag = TAG_DUOFIGHT_GROUDON, + .oam = &sOam_32x32, + .anims = sAnims_DuoFightPre_GroudonShoulderKyogreDorsalFin, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const union AnimCmd sSpriteAnim_862A768[] = +static const union AnimCmd sAnim_DuoFightPre_GroudonClaw[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_862A770[] = +static const union AnimCmd *const sAnims_DuoFightPre_GroudonClaw[] = { - sSpriteAnim_862A768 + sAnim_DuoFightPre_GroudonClaw }; -static const struct SpriteTemplate sUnknown_0862A774 = +static const struct SpriteTemplate sSpriteTemplate_DuoFightPre_GroudonClaw = { - .tileTag = 30507, - .paletteTag = 30505, - .oam = &sOamData_862A6CC, - .anims = sSpriteAnimTable_862A770, + .tileTag = TAG_DUOFIGHT_GROUDON_CLAW, + .paletteTag = TAG_DUOFIGHT_GROUDON, + .oam = &sOam_64x32, + .anims = sAnims_DuoFightPre_GroudonClaw, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const union AnimCmd sSpriteAnim_862A78C[] = +static const union AnimCmd sAnim_DuoFightPre_Kyogre_TopLeft[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862A794[] = +static const union AnimCmd sAnim_DuoFightPre_Kyogre_TopRight[] = { ANIMCMD_FRAME(8, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862A79C[] = +static const union AnimCmd sAnim_DuoFightPre_Kyogre_FaceLeft[] = { ANIMCMD_FRAME(16, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862A7A4[] = +static const union AnimCmd sAnim_DuoFightPre_Kyogre_FaceRight[] = { ANIMCMD_FRAME(24, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862A7AC[] = +static const union AnimCmd sAnim_DuoFightPre_Kyogre_ChinLeft[] = { ANIMCMD_FRAME(32, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862A7B4[] = +static const union AnimCmd sAnim_DuoFightPre_Kyogre_ChinRight[] = { ANIMCMD_FRAME(40, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862A7BC[] = +static const union AnimCmd sAnim_DuoFightPre_Kyogre_LeftPectoralFin[] = { ANIMCMD_FRAME(48, 36), ANIMCMD_FRAME(64, 36), @@ -358,7 +410,7 @@ static const union AnimCmd sSpriteAnim_862A7BC[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd sSpriteAnim_862A7D0[] = +static const union AnimCmd sAnim_DuoFightPre_Kyogre_LeftShoulder[] = { ANIMCMD_FRAME(56, 36), ANIMCMD_FRAME(72, 36), @@ -367,7 +419,7 @@ static const union AnimCmd sSpriteAnim_862A7D0[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd sSpriteAnim_862A7E4[] = +static const union AnimCmd sAnim_DuoFightPre_Kyogre_RightShoulder[] = { ANIMCMD_FRAME(96, 36), ANIMCMD_FRAME(104, 36), @@ -376,31 +428,32 @@ static const union AnimCmd sSpriteAnim_862A7E4[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd *const sSpriteAnimTable_862A7F8[] = +// Edge of the right pectoral fin is its own sprite (see KyogrePectoralFin) +static const union AnimCmd *const sAnims_DuoFightPre_Kyogre[] = { - sSpriteAnim_862A78C, - sSpriteAnim_862A794, - sSpriteAnim_862A79C, - sSpriteAnim_862A7A4, - sSpriteAnim_862A7AC, - sSpriteAnim_862A7B4, - sSpriteAnim_862A7BC, - sSpriteAnim_862A7D0, - sSpriteAnim_862A7E4 + sAnim_DuoFightPre_Kyogre_TopLeft, + sAnim_DuoFightPre_Kyogre_TopRight, + sAnim_DuoFightPre_Kyogre_FaceLeft, + sAnim_DuoFightPre_Kyogre_FaceRight, + sAnim_DuoFightPre_Kyogre_ChinLeft, + sAnim_DuoFightPre_Kyogre_ChinRight, + sAnim_DuoFightPre_Kyogre_LeftPectoralFin, + sAnim_DuoFightPre_Kyogre_LeftShoulder, + sAnim_DuoFightPre_Kyogre_RightShoulder }; -static const struct SpriteTemplate sUnknown_0862A81C = +static const struct SpriteTemplate sSpriteTemplate_DuoFightPre_Kyogre = { - .tileTag = 30508, - .paletteTag = 30508, - .oam = &sOamData_862A6D4, - .anims = sSpriteAnimTable_862A7F8, + .tileTag = TAG_DUOFIGHT_KYOGRE, + .paletteTag = TAG_DUOFIGHT_KYOGRE, + .oam = &sOam_32x16, + .anims = sAnims_DuoFightPre_Kyogre, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const union AnimCmd sSpriteAnim_862A834[] = +static const union AnimCmd sAnim_DuoFightPre_KyogrePectoralFin[] = { ANIMCMD_FRAME(0, 36), ANIMCMD_FRAME(2, 36), @@ -409,41 +462,41 @@ static const union AnimCmd sSpriteAnim_862A834[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd *const sSpriteAnimTable_862A848[] = +static const union AnimCmd *const sAnims_DuoFightPre_KyogrePectoralFin[] = { - sSpriteAnim_862A834 + sAnim_DuoFightPre_KyogrePectoralFin }; -static const struct SpriteTemplate sUnknown_0862A84C = +static const struct SpriteTemplate sSpriteTemplate_DuoFightPre_KyogrePectoralFin = { - .tileTag = 30509, - .paletteTag = 30508, - .oam = &sOamData_862A6DC, - .anims = sSpriteAnimTable_862A848, + .tileTag = TAG_DUOFIGHT_KYOGRE_PECTORAL_FIN, + .paletteTag = TAG_DUOFIGHT_KYOGRE, + .oam = &sOam_16x8, + .anims = sAnims_DuoFightPre_KyogrePectoralFin, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct SpriteTemplate sUnknown_0862A864 = +static const struct SpriteTemplate sSpriteTemplate_DuoFightPre_KyogreDorsalFin = { - .tileTag = 30510, - .paletteTag = 30508, - .oam = &sOamData_862A6C4, - .anims = sSpriteAnimTable_862A74C, + .tileTag = TAG_DUOFIGHT_KYOGRE_DORSAL_FIN, + .paletteTag = TAG_DUOFIGHT_KYOGRE, + .oam = &sOam_32x32, + .anims = sAnims_DuoFightPre_GroudonShoulderKyogreDorsalFin, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct ScanlineEffectParams sUnknown_0862A87C = +static const struct ScanlineEffectParams sScanlineParams_DuoFight_Clouds = { .dmaDest = (vu16 *)REG_ADDR_BG1HOFS, - .dmaControl = 0xA2600001, + .dmaControl = SCANLINE_EFFECT_DMACNT_16BIT, .initState = 1 }; -static const struct BgTemplate sUnknown_0862A888[] = +static const struct BgTemplate sBgTemplates_DuoFight[] = { { .bg = 0, @@ -474,7 +527,7 @@ static const struct BgTemplate sUnknown_0862A888[] = }, }; -static const union AnimCmd sSpriteAnim_862A894[] = +static const union AnimCmd sAnim_DuoFight_Groudon_Head[] = { ANIMCMD_FRAME(0, 20), ANIMCMD_FRAME(64, 20), @@ -483,7 +536,7 @@ static const union AnimCmd sSpriteAnim_862A894[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd sSpriteAnim_862A8A8[] = +static const union AnimCmd sAnim_DuoFight_Groudon_Body[] = { ANIMCMD_FRAME(192, 20), ANIMCMD_FRAME(256, 20), @@ -492,124 +545,124 @@ static const union AnimCmd sSpriteAnim_862A8A8[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd *const sSpriteAnimTable_862A8BC[] = +static const union AnimCmd *const sAnims_DuoFight_Groudon[] = { - sSpriteAnim_862A894, - sSpriteAnim_862A8A8 + sAnim_DuoFight_Groudon_Head, + sAnim_DuoFight_Groudon_Body }; -static const struct CompressedSpriteSheet sUnknown_0862A8C4 = +static const struct CompressedSpriteSheet sSpriteSheet_DuoFight_Groudon = { - gRaySceneGroudon_Gfx, 0x3000, 30505 + gRaySceneDuoFight_Groudon_Gfx, 0x3000, TAG_DUOFIGHT_GROUDON }; -static const struct CompressedSpritePalette sUnknown_0862A8CC = +static const struct CompressedSpritePalette sSpritePal_DuoFight_Groudon = { - gRaySceneGroudon_Pal, 30505 + gRaySceneDuoFight_Groudon_Pal, TAG_DUOFIGHT_GROUDON }; -static const struct SpriteTemplate sUnknown_0862A8D4 = +static const struct SpriteTemplate sSpriteTemplate_DuoFight_Groudon = { - .tileTag = 30505, - .paletteTag = 30505, - .oam = &sOamData_862A6BC, - .anims = sSpriteAnimTable_862A8BC, + .tileTag = TAG_DUOFIGHT_GROUDON, + .paletteTag = TAG_DUOFIGHT_GROUDON, + .oam = &sOam_64x64, + .anims = sAnims_DuoFight_Groudon, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const union AnimCmd sSpriteAnim_862A8EC[] = +static const union AnimCmd sAnim_DuoFight_GroudonShoulderKyogreDorsalFin[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_862A8F4[] = +static const union AnimCmd *const sAnims_DuoFight_GroudonShoulderKyogreDorsalFin[] = { - sSpriteAnim_862A8EC + sAnim_DuoFight_GroudonShoulderKyogreDorsalFin }; -static const struct CompressedSpriteSheet sUnknown_0862A8F8 = +static const struct CompressedSpriteSheet sSpriteSheet_DuoFight_GroudonShoulder = { - gRaySceneGroudon2_Gfx, 0x200, 30506 + gRaySceneDuoFight_GroudonShoulder_Gfx, 0x200, TAG_DUOFIGHT_GROUDON_SHOULDER }; -static const struct SpriteTemplate sUnknown_0862A900 = +static const struct SpriteTemplate sSpriteTemplate_DuoFight_GroudonShoulder = { - .tileTag = 30506, - .paletteTag = 30505, - .oam = &sOamData_862A6C4, - .anims = sSpriteAnimTable_862A8F4, + .tileTag = TAG_DUOFIGHT_GROUDON_SHOULDER, + .paletteTag = TAG_DUOFIGHT_GROUDON, + .oam = &sOam_32x32, + .anims = sAnims_DuoFight_GroudonShoulderKyogreDorsalFin, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const union AnimCmd sSpriteAnim_862A918[] = +static const union AnimCmd sAnim_DuoFight_GroudonClaw[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_862A920[] = +static const union AnimCmd *const sAnims_DuoFight_GroudonClaw[] = { - sSpriteAnim_862A918 + sAnim_DuoFight_GroudonClaw }; -static const struct CompressedSpriteSheet sUnknown_0862A924 = +static const struct CompressedSpriteSheet sSpriteSheet_DuoFight_GroudonClaw = { - gRaySceneGroudon3_Gfx, 0x400, 30507 + gRaySceneDuoFight_GroudonClaw_Gfx, 0x400, TAG_DUOFIGHT_GROUDON_CLAW }; -static const struct SpriteTemplate sUnknown_0862A92C = +static const struct SpriteTemplate sSpriteTemplate_DuoFight_GroudonClaw = { - .tileTag = 30507, - .paletteTag = 30505, - .oam = &sOamData_862A6CC, - .anims = sSpriteAnimTable_862A920, + .tileTag = TAG_DUOFIGHT_GROUDON_CLAW, + .paletteTag = TAG_DUOFIGHT_GROUDON, + .oam = &sOam_64x32, + .anims = sAnims_DuoFight_GroudonClaw, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const union AnimCmd sSpriteAnim_862A944[] = +static const union AnimCmd sAnim_DuoFight_Kyogre_TopLeft[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862A94C[] = +static const union AnimCmd sAnim_DuoFight_Kyogre_TopRight[] = { ANIMCMD_FRAME(8, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862A954[] = +static const union AnimCmd sAnim_DuoFight_Kyogre_FaceLeft[] = { ANIMCMD_FRAME(16, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862A95C[] = +static const union AnimCmd sAnim_DuoFight_Kyogre_FaceRight[] = { ANIMCMD_FRAME(24, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862A964[] = +static const union AnimCmd sAnim_DuoFight_Kyogre_ChinLeft[] = { ANIMCMD_FRAME(32, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862A96C[] = +static const union AnimCmd sAnim_DuoFight_Kyogre_ChinRight[] = { ANIMCMD_FRAME(40, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862A974[] = +static const union AnimCmd sAnim_DuoFight_Kyogre_LeftPectoralFin[] = { ANIMCMD_FRAME(48, 24), ANIMCMD_FRAME(64, 24), @@ -618,7 +671,7 @@ static const union AnimCmd sSpriteAnim_862A974[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd sSpriteAnim_862A988[] = +static const union AnimCmd sAnim_DuoFight_Kyogre_LeftShoulder[] = { ANIMCMD_FRAME(56, 24), ANIMCMD_FRAME(72, 24), @@ -627,7 +680,7 @@ static const union AnimCmd sSpriteAnim_862A988[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd sSpriteAnim_862A99C[] = +static const union AnimCmd sAnim_DuoFight_Kyogre_RightShoulder[] = { ANIMCMD_FRAME(96, 24), ANIMCMD_FRAME(104, 24), @@ -636,41 +689,41 @@ static const union AnimCmd sSpriteAnim_862A99C[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd *const sSpriteAnimTable_862A9B0[] = +static const union AnimCmd *const sAnims_DuoFight_Kyogre[] = { - sSpriteAnim_862A944, - sSpriteAnim_862A94C, - sSpriteAnim_862A954, - sSpriteAnim_862A95C, - sSpriteAnim_862A964, - sSpriteAnim_862A96C, - sSpriteAnim_862A974, - sSpriteAnim_862A988, - sSpriteAnim_862A99C + sAnim_DuoFight_Kyogre_TopLeft, + sAnim_DuoFight_Kyogre_TopRight, + sAnim_DuoFight_Kyogre_FaceLeft, + sAnim_DuoFight_Kyogre_FaceRight, + sAnim_DuoFight_Kyogre_ChinLeft, + sAnim_DuoFight_Kyogre_ChinRight, + sAnim_DuoFight_Kyogre_LeftPectoralFin, + sAnim_DuoFight_Kyogre_LeftShoulder, + sAnim_DuoFight_Kyogre_RightShoulder }; -static const struct CompressedSpriteSheet sUnknown_0862A9D4 = +static const struct CompressedSpriteSheet sSpriteSheet_DuoFight_Kyogre = { - gRaySceneKyogre_Gfx, 0xF00, 30508 + gRaySceneDuoFight_Kyogre_Gfx, 0xF00, TAG_DUOFIGHT_KYOGRE }; -static const struct CompressedSpritePalette sUnknown_0862A9DC = +static const struct CompressedSpritePalette sSpritePal_DuoFight_Kyogre = { - gRaySceneKyogre_Pal, 30508 + gRaySceneDuoFight_Kyogre_Pal, TAG_DUOFIGHT_KYOGRE }; -static const struct SpriteTemplate sUnknown_0862A9E4 = +static const struct SpriteTemplate sSpriteTemplate_DuoFight_Kyogre = { - .tileTag = 30508, - .paletteTag = 30508, - .oam = &sOamData_862A6D4, - .anims = sSpriteAnimTable_862A9B0, + .tileTag = TAG_DUOFIGHT_KYOGRE, + .paletteTag = TAG_DUOFIGHT_KYOGRE, + .oam = &sOam_32x16, + .anims = sAnims_DuoFight_Kyogre, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const union AnimCmd sSpriteAnim_862A9FC[] = +static const union AnimCmd sAnim_DuoFight_KyogrePectoralFin[] = { ANIMCMD_FRAME(0, 24), ANIMCMD_FRAME(2, 24), @@ -679,44 +732,44 @@ static const union AnimCmd sSpriteAnim_862A9FC[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd *const sSpriteAnimTable_862AA10[] = +static const union AnimCmd *const sAnims_DuoFight_KyogrePectoralFin[] = { - sSpriteAnim_862A9FC + sAnim_DuoFight_KyogrePectoralFin }; -static const struct CompressedSpriteSheet sUnknown_0862AA14 = +static const struct CompressedSpriteSheet sSpriteSheet_DuoFight_KyogrePectoralFin = { - gRaySceneKyogre2_Gfx, 0xC0, 30509 + gRaySceneDuoFight_KyogrePectoralFin_Gfx, 0xC0, TAG_DUOFIGHT_KYOGRE_PECTORAL_FIN }; -static const struct SpriteTemplate sUnknown_0862AA1C = +static const struct SpriteTemplate sSpriteTemplate_DuoFight_KyogrePectoralFin = { - .tileTag = 30509, - .paletteTag = 30508, - .oam = &sOamData_862A6DC, - .anims = sSpriteAnimTable_862AA10, + .tileTag = TAG_DUOFIGHT_KYOGRE_PECTORAL_FIN, + .paletteTag = TAG_DUOFIGHT_KYOGRE, + .oam = &sOam_16x8, + .anims = sAnims_DuoFight_KyogrePectoralFin, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct CompressedSpriteSheet sUnknown_0862AA34 = +static const struct CompressedSpriteSheet sSpriteSheet_DuoFight_KyogreDorsalFin = { - gRaySceneKyogre3_Gfx, 0x200, 30510 + gRaySceneDuoFight_KyogreDorsalFin_Gfx, 0x200, TAG_DUOFIGHT_KYOGRE_DORSAL_FIN }; -static const struct SpriteTemplate sUnknown_0862AA3C = +static const struct SpriteTemplate sSpriteTemplate_DuoFight_KyogreDorsalFin = { - .tileTag = 30510, - .paletteTag = 30508, - .oam = &sOamData_862A6C4, - .anims = sSpriteAnimTable_862A8F4, + .tileTag = TAG_DUOFIGHT_KYOGRE_DORSAL_FIN, + .paletteTag = TAG_DUOFIGHT_KYOGRE, + .oam = &sOam_32x32, + .anims = sAnims_DuoFight_GroudonShoulderKyogreDorsalFin, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct BgTemplate sUnknown_0862AA54[] = +static const struct BgTemplate sBgTemplates_TakesFlight[] = { { .bg = 0, @@ -747,18 +800,18 @@ static const struct BgTemplate sUnknown_0862AA54[] = } }; -static const union AnimCmd sSpriteAnim_862AA60[] = +static const union AnimCmd sAnim_TakesFlight_Smoke[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_862AA68[] = +static const union AnimCmd *const sAnims_TakesFlight_Smoke[] = { - sSpriteAnim_862AA60 + sAnim_TakesFlight_Smoke }; -static const union AffineAnimCmd sSpriteAffineAnim_862AA6C[] = +static const union AffineAnimCmd sAffineAnim_TakesFlight_Smoke[] = { AFFINEANIMCMD_FRAME(-64, -64, 0, 1), AFFINEANIMCMD_FRAME(32, 32, 0, 14), @@ -766,47 +819,47 @@ static const union AffineAnimCmd sSpriteAffineAnim_862AA6C[] = AFFINEANIMCMD_JUMP(0) }; -static const union AffineAnimCmd *const sSpriteAffineAnimTable_862AA8C[] = +static const union AffineAnimCmd *const sAffineAnims_TakesFlight_Smoke[] = { - sSpriteAffineAnim_862AA6C + sAffineAnim_TakesFlight_Smoke }; -static const struct CompressedSpriteSheet sUnknown_0862AA90 = +static const struct CompressedSpriteSheet sSpriteSheet_TakesFlight_Smoke = { - gRaySceneSmoke_Gfx, 0x100, 30555 + gRaySceneTakesFlight_Smoke_Gfx, 0x100, TAG_FLIGHT_SMOKE }; -static const struct CompressedSpritePalette sUnknown_0862AA98 = +static const struct CompressedSpritePalette sSpritePal_TakesFlight_Smoke = { - gRaySceneSmoke_Pal, 30555 + gRaySceneTakesFlight_Smoke_Pal, TAG_FLIGHT_SMOKE }; -static const struct SpriteTemplate sUnknown_0862AAA0 = +static const struct SpriteTemplate sSpriteTemplate_TakesFlight_Smoke = { - .tileTag = 30555, - .paletteTag = 30555, - .oam = &sOamData_862A6D4, - .anims = sSpriteAnimTable_862AA68, + .tileTag = TAG_FLIGHT_SMOKE, + .paletteTag = TAG_FLIGHT_SMOKE, + .oam = &sOam_32x16, + .anims = sAnims_TakesFlight_Smoke, .images = NULL, - .affineAnims = sSpriteAffineAnimTable_862AA8C, - .callback = sub_81D8260, + .affineAnims = sAffineAnims_TakesFlight_Smoke, + .callback = SpriteCB_TakesFlight_Smoke, }; -static const s8 sUnknown_0862AAB8[][2] = +static const s8 sTakesFlight_SmokeCoords[MAX_SMOKE][2] = { - {-1, 5}, - {-3, -4}, - {5, -3}, - {-7, 2}, - {-9, -1}, - {1, -5}, - {3, 4}, - {-5, 3}, - {7, -2}, - {9, 1} + {-1, 5}, + {-3, -4}, + { 5, -3}, + {-7, 2}, + {-9, -1}, + { 1, -5}, + { 3, 4}, + {-5, 3}, + { 7, -2}, + { 9, 1} }; -static const struct BgTemplate sUnknown_0862AACC[] = +static const struct BgTemplate sBgTemplates_Descends[] = { { .bg = 0, @@ -846,68 +899,68 @@ static const struct BgTemplate sUnknown_0862AACC[] = } }; -static const union AnimCmd sSpriteAnim_862AADC[] = +static const union AnimCmd sAnim_Descends_Rayquaza[] = { ANIMCMD_FRAME(0, 32), ANIMCMD_FRAME(64, 32), ANIMCMD_JUMP(0), }; -static const union AnimCmd *const sSpriteAnimTable_862AAE8[] = +static const union AnimCmd *const sAnims_Descends_Rayquaza[] = { - sSpriteAnim_862AADC + sAnim_Descends_Rayquaza }; -static const union AnimCmd sSpriteAnim_862AAEC[] = +static const union AnimCmd sAnim_Descends_RayquazaTail[] = { ANIMCMD_FRAME(0, 32), ANIMCMD_FRAME(8, 32), ANIMCMD_JUMP(0), }; -static const union AnimCmd *const sSpriteAnimTable_862AAF8[] = +static const union AnimCmd *const sAnims_Descends_RayquazaTail[] = { - sSpriteAnim_862AAEC + sAnim_Descends_RayquazaTail }; -static const struct CompressedSpriteSheet sUnknown_0862AAFC = +static const struct CompressedSpriteSheet sSpriteSheet_Descends_Rayquaza = { - gRaySceneRayquazaFly1_Gfx, 0x1000, 30556 + gRaySceneDescends_Rayquaza_Gfx, 0x1000, TAG_DESCENDS_RAYQUAZA }; -static const struct CompressedSpriteSheet sUnknown_0862AB04 = +static const struct CompressedSpriteSheet sSpriteSheet_Descends_RayquazaTail = { - gRaySceneRayquazaTail_Gfx, 0x200, 30557 + gRaySceneDescends_RayquazaTail_Gfx, 0x200, TAG_DESCENDS_RAYQUAZA_TAIL }; -static const struct CompressedSpritePalette sUnknown_0862AB0C = +static const struct CompressedSpritePalette sSpritePal_Descends_Rayquaza = { - gRaySceneRayquaza_Pal, 30556 + gRaySceneTakesFlight_Rayquaza_Pal, TAG_DESCENDS_RAYQUAZA // "Takes flight" palette re-used here }; -static const struct SpriteTemplate sUnknown_0862AB14 = +static const struct SpriteTemplate sSpriteTemplate_Descends_Rayquaza = { - .tileTag = 30556, - .paletteTag = 30556, - .oam = &sOamData_862A6BC, - .anims = sSpriteAnimTable_862AAE8, + .tileTag = TAG_DESCENDS_RAYQUAZA, + .paletteTag = TAG_DESCENDS_RAYQUAZA, + .oam = &sOam_64x64, + .anims = sAnims_Descends_Rayquaza, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct SpriteTemplate sUnknown_0862AB2C = +static const struct SpriteTemplate sSpriteTemplate_Descends_RayquazaTail = { - .tileTag = 30557, - .paletteTag = 30556, - .oam = &sOamData_862A6E4, - .anims = sSpriteAnimTable_862AAF8, + .tileTag = TAG_DESCENDS_RAYQUAZA_TAIL, + .paletteTag = TAG_DESCENDS_RAYQUAZA, + .oam = &sOam_16x32, + .anims = sAnims_Descends_RayquazaTail, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct BgTemplate sUnknown_0862AB44[] = +static const struct BgTemplate sBgTemplates_Charges[] = { { .bg = 0, @@ -947,13 +1000,13 @@ static const struct BgTemplate sUnknown_0862AB44[] = } }; -static const union AnimCmd sSpriteAnim_862AB54[] = +static const union AnimCmd sAnim_ChasesAway_Groudon_Still[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862AB5C[] = +static const union AnimCmd sAnim_ChasesAway_Groudon_Moving[] = { ANIMCMD_FRAME(0, 48), ANIMCMD_FRAME(64, 32), @@ -962,113 +1015,113 @@ static const union AnimCmd sSpriteAnim_862AB5C[] = ANIMCMD_JUMP(0) }; -static const union AnimCmd *const sSpriteAnimTable_862AB70[] = +static const union AnimCmd *const sAnims_ChasesAway_Groudon[] = { - sSpriteAnim_862AB54, - sSpriteAnim_862AB5C + sAnim_ChasesAway_Groudon_Still, + sAnim_ChasesAway_Groudon_Moving }; -static const union AnimCmd sSpriteAnim_862AB78[] = +static const union AnimCmd sAnim_ChasesAway_GroudonTail[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_862AB80[] = +static const union AnimCmd *const sAnims_ChasesAway_GroudonTail[] = { - sSpriteAnim_862AB78, + sAnim_ChasesAway_GroudonTail, }; -static const union AnimCmd sSpriteAnim_862AB84[] = +static const union AnimCmd sAnim_ChasesAway_Kyogre_Front[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862AB8C[] = +static const union AnimCmd sAnim_ChasesAway_Kyogre_Back[] = { ANIMCMD_FRAME(16, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862AB94[] = +static const union AnimCmd sAnim_ChasesAway_Kyogre_Tail[] = { ANIMCMD_FRAME(32, 1), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_862AB9C[] = +static const union AnimCmd *const sAnims_ChasesAway_Kyogre[] = { - sSpriteAnim_862AB84, - sSpriteAnim_862AB8C, - sSpriteAnim_862AB94 + sAnim_ChasesAway_Kyogre_Front, + sAnim_ChasesAway_Kyogre_Back, + sAnim_ChasesAway_Kyogre_Tail }; -static const union AnimCmd sSpriteAnim_862ABA8[] = +static const union AnimCmd sAnim_ChasesAway_Rayquaza_FlyingDown[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862ABB0[] = +static const union AnimCmd sAnim_ChasesAway_Rayquaza_Arriving[] = { ANIMCMD_FRAME(64, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862ABB8[] = +static const union AnimCmd sAnim_ChasesAway_Rayquaza_Floating[] = { ANIMCMD_FRAME(128, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862ABC0[] = +static const union AnimCmd sAnim_ChasesAway_Rayquaza_Shouting[] = { ANIMCMD_FRAME(192, 1), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_862ABC8[] = +static const union AnimCmd *const sAnims_ChasesAway_Rayquaza[] = { - sSpriteAnim_862ABA8, - sSpriteAnim_862ABB0, - sSpriteAnim_862ABB8, - sSpriteAnim_862ABC0 + sAnim_ChasesAway_Rayquaza_FlyingDown, + sAnim_ChasesAway_Rayquaza_Arriving, + sAnim_ChasesAway_Rayquaza_Floating, + sAnim_ChasesAway_Rayquaza_Shouting }; -static const union AnimCmd sSpriteAnim_862ABD8[] = +static const union AnimCmd sAnim_ChasesAway_RayquazaTail_FlyingDown[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862ABE0[] = +static const union AnimCmd sAnim_ChasesAway_RayquazaTail_Arriving[] = { ANIMCMD_FRAME(16, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862ABE8[] = +static const union AnimCmd sAnim_ChasesAway_RayquazaTail_Floating[] = { ANIMCMD_FRAME(32, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_862ABF0[] = +static const union AnimCmd sAnim_ChasesAway_RayquazaTail_Shouting[] = { ANIMCMD_FRAME(48, 1), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_862ABF8[] = +static const union AnimCmd *const sAnims_ChasesAway_RayquazaTail[] = { - sSpriteAnim_862ABD8, - sSpriteAnim_862ABE0, - sSpriteAnim_862ABE8, - sSpriteAnim_862ABF0 + sAnim_ChasesAway_RayquazaTail_FlyingDown, + sAnim_ChasesAway_RayquazaTail_Arriving, + sAnim_ChasesAway_RayquazaTail_Floating, + sAnim_ChasesAway_RayquazaTail_Shouting }; -static const union AnimCmd sSpriteAnim_862AC08[] = +static const union AnimCmd sAnim_ChasesAway_KyogreSplash[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(4, 8), @@ -1079,128 +1132,128 @@ static const union AnimCmd sSpriteAnim_862AC08[] = ANIMCMD_JUMP(0) }; -static const union AnimCmd *const sSpriteAnimTable_862AC24[] = +static const union AnimCmd *const sAnims_ChasesAway_KyogreSplash[] = { - sSpriteAnim_862AC08 + sAnim_ChasesAway_KyogreSplash }; -static const struct CompressedSpriteSheet sUnknown_0862AC28 = +static const struct CompressedSpriteSheet sSpriteSheet_ChasesAway_Groudon = { - gRaySceneGroudonLeft_Gfx, 0x1800, 30565 + gRaySceneChasesAway_Groudon_Gfx, 0x1800, TAG_CHASE_GROUDON }; -static const struct CompressedSpriteSheet sUnknown_0862AC30 = +static const struct CompressedSpriteSheet sSpriteSheet_ChasesAway_GroudonTail = { - gRaySceneGroudonTail_Gfx, 0x80, 30566 + gRaySceneChasesAway_GroudonTail_Gfx, 0x80, TAG_CHASE_GROUDON_TAIL }; -static const struct CompressedSpriteSheet sUnknown_0862AC38 = +static const struct CompressedSpriteSheet sSpriteSheet_ChasesAway_Kyogre = { - gRaySceneKyogreRight_Gfx, 0x600, 30568 + gRaySceneChasesAway_Kyogre_Gfx, 0x600, TAG_CHASE_KYOGRE }; -static const struct CompressedSpriteSheet sUnknown_0862AC40 = +static const struct CompressedSpriteSheet sSpriteSheet_ChasesAway_Rayquaza = { - gRaySceneRayquazaHover_Gfx, 0x2000, 30569 + gRaySceneChasesAway_Rayquaza_Gfx, 0x2000, TAG_CHASE_RAYQUAZA }; -static const struct CompressedSpriteSheet sUnknown_0862AC48 = +static const struct CompressedSpriteSheet sSpriteSheet_ChasesAway_RayquazaTail = { - gRaySceneRayquazaFlyIn_Gfx, 0x800, 30570 + gRaySceneChasesAway_RayquazaTail_Gfx, 0x800, TAG_CHASE_RAYQUAZA_TAIL }; -static const struct CompressedSpriteSheet sUnknown_0862AC50 = +static const struct CompressedSpriteSheet sSpriteSheet_ChasesAway_KyogreSplash = { - gRaySceneSplash_Gfx, 0x300, 30571 + gRaySceneChasesAway_KyogreSplash_Gfx, 0x300, TAG_CHASE_SPLASH }; -static const struct CompressedSpritePalette sUnknown_0862AC58 = +static const struct CompressedSpritePalette sSpritePal_ChasesAway_Groudon = { - gRaySceneGroudonLeft_Pal, 30565 + gRaySceneChasesAway_Groudon_Pal, TAG_CHASE_GROUDON }; -static const struct CompressedSpritePalette sUnknown_0862AC60 = +static const struct CompressedSpritePalette sSpritePal_ChasesAway_Kyogre = { - gRaySceneKyogreRight_Pal, 30568 + gRaySceneChasesAway_Kyogre_Pal, TAG_CHASE_KYOGRE }; -static const struct CompressedSpritePalette sUnknown_0862AC68 = +static const struct CompressedSpritePalette sSpritePal_ChasesAway_Rayquaza = { - gRaySceneRayquazaHover_Pal, 30569 + gRaySceneChasesAway_Rayquaza_Pal, TAG_CHASE_RAYQUAZA }; -static const struct CompressedSpritePalette sUnknown_0862AC70 = +static const struct CompressedSpritePalette sSpritePal_ChasesAway_KyogreSplash = { - gRaySceneSplash_Pal, 30571 + gRaySceneChasesAway_KyogreSplash_Pal, TAG_CHASE_SPLASH }; -static const struct SpriteTemplate sUnknown_0862AC78 = +static const struct SpriteTemplate sSpriteTemplate_ChasesAway_Groudon = { - .tileTag = 30565, - .paletteTag = 30565, - .oam = &sOamData_862A6BC, - .anims = sSpriteAnimTable_862AB70, + .tileTag = TAG_CHASE_GROUDON, + .paletteTag = TAG_CHASE_GROUDON, + .oam = &sOam_64x64, + .anims = sAnims_ChasesAway_Groudon, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct SpriteTemplate sUnknown_0862AC90 = +static const struct SpriteTemplate sSpriteTemplate_ChasesAway_GroudonTail = { - .tileTag = 30566, - .paletteTag = 30565, - .oam = &sOamData_862A6EC, - .anims = sSpriteAnimTable_862AB80, + .tileTag = TAG_CHASE_GROUDON_TAIL, + .paletteTag = TAG_CHASE_GROUDON, + .oam = &sOam_16x16, + .anims = sAnims_ChasesAway_GroudonTail, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct SpriteTemplate sUnknown_0862ACA8 = +static const struct SpriteTemplate sSpriteTemplate_ChasesAway_Kyogre = { - .tileTag = 30568, - .paletteTag = 30568, - .oam = &sOamData_862A6C4, - .anims = sSpriteAnimTable_862AB9C, + .tileTag = TAG_CHASE_KYOGRE, + .paletteTag = TAG_CHASE_KYOGRE, + .oam = &sOam_32x32, + .anims = sAnims_ChasesAway_Kyogre, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct SpriteTemplate sUnknown_0862ACC0 = +static const struct SpriteTemplate sSpriteTemplate_ChasesAway_Rayquaza = { - .tileTag = 30569, - .paletteTag = 30569, - .oam = &sOamData_862A6BC, - .anims = sSpriteAnimTable_862ABC8, + .tileTag = TAG_CHASE_RAYQUAZA, + .paletteTag = TAG_CHASE_RAYQUAZA, + .oam = &sOam_64x64, + .anims = sAnims_ChasesAway_Rayquaza, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_81D961C, + .callback = SpriteCB_ChasesAway_Rayquaza, }; -static const struct SpriteTemplate sUnknown_0862ACD8 = +static const struct SpriteTemplate sSpriteTemplate_ChasesAway_RayquazaTail = { - .tileTag = 30570, - .paletteTag = 30569, - .oam = &sOamData_862A6C4, - .anims = sSpriteAnimTable_862ABF8, + .tileTag = TAG_CHASE_RAYQUAZA_TAIL, + .paletteTag = TAG_CHASE_RAYQUAZA, + .oam = &sOam_32x32, + .anims = sAnims_ChasesAway_RayquazaTail, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct SpriteTemplate sUnknown_0862ACF0 = +static const struct SpriteTemplate sSpriteTemplate_ChasesAway_KyogreSplash = { - .tileTag = 30571, - .paletteTag = 30571, - .oam = &sOamData_862A6F4, - .anims = sSpriteAnimTable_862AC24, + .tileTag = TAG_CHASE_SPLASH, + .paletteTag = TAG_CHASE_SPLASH, + .oam = &sOam_32x8, + .anims = sAnims_ChasesAway_KyogreSplash, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct BgTemplate sUnknown_0862AD08[] = +static const struct BgTemplate sBgTemplates_ChasesAway[] = { { .bg = 0, @@ -1231,13 +1284,12 @@ static const struct BgTemplate sUnknown_0862AD08[] = } }; -// code -void DoRayquazaScene(u8 animId, bool8 onlyOneAnim, void (*callback)(void)) +void DoRayquazaScene(u8 animId, bool8 endEarly, void (*exitCallback)(void)) { sRayScene = AllocZeroed(sizeof(*sRayScene)); sRayScene->animId = animId; - sRayScene->callback = callback; - sRayScene->onlyOneAnim = onlyOneAnim; + sRayScene->exitCallback = exitCallback; + sRayScene->endEarly = endEarly; SetMainCallback2(CB2_InitRayquazaScene); } @@ -1250,7 +1302,7 @@ static void CB2_InitRayquazaScene(void) ResetPaletteFade(); ResetSpriteData(); ResetTasks(); - FillPalette(0, 0xF0, 0x20); + FillPalette(RGB_BLACK, 0xF0, 32); CreateTask(sTasksForAnimations[sRayScene->animId], 0); SetMainCallback2(CB2_RayquazaScene); } @@ -1277,7 +1329,7 @@ static void Task_EndAfterFadeScreen(u8 taskId) { ResetSpriteData(); FreeAllSpritePalettes(); - SetMainCallback2(sRayScene->callback); + SetMainCallback2(sRayScene->exitCallback); Free(sRayScene); DestroyTask(taskId); } @@ -1287,83 +1339,97 @@ static void Task_SetNextAnim(u8 taskId) { if (!gPaletteFade.active) { - if (sRayScene->onlyOneAnim == TRUE) + if (sRayScene->endEarly == TRUE) { gTasks[taskId].func = Task_EndAfterFadeScreen; } else { sRayScene->animId++; - sRayScene->field_2004 = 0; + sRayScene->unk = 0; gTasks[taskId].func = sTasksForAnimations[sRayScene->animId]; } } } -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, 0x3F); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_ALL); SetGpuReg(REG_OFFSET_WINOUT, 0); - SetGpuReg(REG_OFFSET_WIN0H, 0xF0); - SetGpuReg(REG_OFFSET_WIN0V, 0x1888); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, DISPLAY_WIDTH)); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(24, DISPLAY_HEIGHT - 24)); gPlttBufferUnfaded[0] = 0; gPlttBufferFaded[0] = 0; } -static void sub_81D6904(void) +static void ResetWindowDimensions(void) { - SetGpuReg(REG_OFFSET_WININ, 0x3F); - SetGpuReg(REG_OFFSET_WINOUT, 0x3F); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_ALL); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_ALL); } + +// RAY_ANIM_DUO_FIGHT / RAY_ANIM_DUO_FIGHT_PRE + +#define tTimer data[0] +#define tHelperTaskId data[1] +#define tGroudonSpriteId data[2] +#define tKyogreSpriteId data[3] + +#define sGroudonBodySpriteId data[0] +#define sGroudonShoulderSpriteId data[1] +#define sGroudonClawSpriteId data[2] + static void Task_HandleDuoFightPre(u8 taskId) { s16 *data = gTasks[taskId].data; - sub_81D750C(); + DuoFight_AnimateRain(); if (!gPaletteFade.active) { - s16 counter = data[0]; - if (counter == 64) + s16 frame = tTimer; + if (frame == 64) { - sub_81D7438(); + DuoFight_Lightning1(); } - else if (counter == 144) + else if (frame == 144) { - sub_81D7480(); + DuoFight_Lightning2(); } else { - switch (counter) + switch (frame) { case 328: DuoFightEnd(taskId, 0); return; case 148: - sub_81D74C8(); + DuoFight_LightningLong(); break; } } - data[0]++; + tTimer++; } } -static u8 sub_81D6984(void) +static u8 DuoFightPre_CreateGroudonSprites(void) { u8 spriteId; s16 *data; - spriteId = CreateSprite(&sUnknown_0862A72C, 88, 72, 3); - gSprites[spriteId].callback = sub_81D6A20; + spriteId = CreateSprite(&sSpriteTemplate_DuoFightPre_Groudon, 88, 72, 3); + gSprites[spriteId].callback = SpriteCB_DuoFightPre_Groudon; data = gSprites[spriteId].data; - data[0] = CreateSprite(&sUnknown_0862A72C, 56, 104, 3); - data[1] = CreateSprite(&sUnknown_0862A750, 75, 101, 0); - data[2] = CreateSprite(&sUnknown_0862A774, 109, 114, 1); - StartSpriteAnim(&gSprites[data[0]], 1); + sGroudonBodySpriteId = CreateSprite(&sSpriteTemplate_DuoFightPre_Groudon, 56, 104, 3); + sGroudonShoulderSpriteId = CreateSprite(&sSpriteTemplate_DuoFightPre_GroudonShoulder, 75, 101, 0); + sGroudonClawSpriteId = CreateSprite(&sSpriteTemplate_DuoFightPre_GroudonClaw, 109, 114, 1); + StartSpriteAnim(&gSprites[sGroudonBodySpriteId], 1); return spriteId; } -static void sub_81D6A20(struct Sprite *sprite) +static void SpriteCB_DuoFightPre_Groudon(struct Sprite *sprite) { s16 *data = sprite->data; data[5]++; @@ -1371,54 +1437,54 @@ static void sub_81D6A20(struct Sprite *sprite) if (data[5] == 0 && sprite->pos1.x != 72) { sprite->pos1.x--; - gSprites[sprite->data[0]].pos1.x--; - gSprites[data[1]].pos1.x--; - gSprites[data[2]].pos1.x--; + gSprites[sprite->sGroudonBodySpriteId].pos1.x--; + gSprites[sGroudonShoulderSpriteId].pos1.x--; + gSprites[sGroudonClawSpriteId].pos1.x--; } switch (sprite->animCmdIndex) { case 0: - gSprites[data[1]].pos2.x = 0; - gSprites[data[1]].pos2.y = 0; - gSprites[data[2]].pos2.x = 0; - gSprites[data[2]].pos2.y = 0; + gSprites[sGroudonShoulderSpriteId].pos2.x = 0; + gSprites[sGroudonShoulderSpriteId].pos2.y = 0; + gSprites[sGroudonClawSpriteId].pos2.x = 0; + gSprites[sGroudonClawSpriteId].pos2.y = 0; break; case 1: case 3: - gSprites[data[1]].pos2.x = -1; - gSprites[data[1]].pos2.y = 0; - gSprites[data[2]].pos2.x = -1; - gSprites[data[2]].pos2.y = 0; + gSprites[sGroudonShoulderSpriteId].pos2.x = -1; + gSprites[sGroudonShoulderSpriteId].pos2.y = 0; + gSprites[sGroudonClawSpriteId].pos2.x = -1; + gSprites[sGroudonClawSpriteId].pos2.y = 0; break; case 2: - gSprites[data[1]].pos2.x = -1; - gSprites[data[1]].pos2.y = 1; - gSprites[data[2]].pos2.x = -2; - gSprites[data[2]].pos2.y = 1; + gSprites[sGroudonShoulderSpriteId].pos2.x = -1; + gSprites[sGroudonShoulderSpriteId].pos2.y = 1; + gSprites[sGroudonClawSpriteId].pos2.x = -2; + gSprites[sGroudonClawSpriteId].pos2.y = 1; break; } } -static u8 sub_81D6B7C(void) +static u8 DuoFightPre_CreateKyogreSprites(void) { u8 spriteId; s16 *data; - spriteId = CreateSprite(&sUnknown_0862A81C, 136, 96, 1); - gSprites[spriteId].callback = sub_81D6D20; + spriteId = CreateSprite(&sSpriteTemplate_DuoFightPre_Kyogre, 136, 96, 1); + gSprites[spriteId].callback = SpriteCB_DuoFightPre_Kyogre; data = gSprites[spriteId].data; - data[0] = CreateSprite(&sUnknown_0862A81C, 168, 96, 1) << 8; - data[0] |= CreateSprite(&sUnknown_0862A81C, 136, 112, 1); - data[1] = CreateSprite(&sUnknown_0862A81C, 168, 112, 1) << 8; - data[1] |= CreateSprite(&sUnknown_0862A81C, 136, 128, 1); - data[2] = CreateSprite(&sUnknown_0862A81C, 168, 128, 1) << 8; - data[2] |= CreateSprite(&sUnknown_0862A81C, 104, 128, 2); - data[3] = CreateSprite(&sUnknown_0862A81C, 136, 128, 2) << 8; - data[3] |= CreateSprite(&sUnknown_0862A81C, 184, 128, 0); - data[4] = CreateSprite(&sUnknown_0862A84C, 208, 132, 0) << 8; - data[4] |= CreateSprite(&sUnknown_0862A864, 200, 120, 1); + data[0] = CreateSprite(&sSpriteTemplate_DuoFightPre_Kyogre, 168, 96, 1) << 8; + data[0] |= CreateSprite(&sSpriteTemplate_DuoFightPre_Kyogre, 136, 112, 1); + data[1] = CreateSprite(&sSpriteTemplate_DuoFightPre_Kyogre, 168, 112, 1) << 8; + data[1] |= CreateSprite(&sSpriteTemplate_DuoFightPre_Kyogre, 136, 128, 1); + data[2] = CreateSprite(&sSpriteTemplate_DuoFightPre_Kyogre, 168, 128, 1) << 8; + data[2] |= CreateSprite(&sSpriteTemplate_DuoFightPre_Kyogre, 104, 128, 2); + data[3] = CreateSprite(&sSpriteTemplate_DuoFightPre_Kyogre, 136, 128, 2) << 8; + data[3] |= CreateSprite(&sSpriteTemplate_DuoFightPre_Kyogre, 184, 128, 0); + data[4] = CreateSprite(&sSpriteTemplate_DuoFightPre_KyogrePectoralFin, 208, 132, 0) << 8; + data[4] |= CreateSprite(&sSpriteTemplate_DuoFightPre_KyogreDorsalFin, 200, 120, 1); StartSpriteAnim(&gSprites[data[0] >> 8], 1); StartSpriteAnim(&gSprites[data[0] & 0xFF], 2); @@ -1432,7 +1498,7 @@ static u8 sub_81D6B7C(void) return spriteId; } -static void sub_81D6D20(struct Sprite *sprite) +static void SpriteCB_DuoFightPre_Kyogre(struct Sprite *sprite) { s16 *data = sprite->data; data[5]++; @@ -1499,11 +1565,11 @@ static void VBlankCB_DuoFight(void) ScanlineEffect_InitHBlankDmaTransfer(); } -static void sub_81D6FE0(void) +static void InitDuoFightSceneBgs(void) { ResetVramOamAndBgCntRegs(); ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, sUnknown_0862A888, ARRAY_COUNT(sUnknown_0862A888)); + InitBgsFromTemplates(0, sBgTemplates_DuoFight, ARRAY_COUNT(sBgTemplates_DuoFight)); SetBgTilemapBuffer(0, sRayScene->tilemapBuffers[0]); SetBgTilemapBuffer(1, sRayScene->tilemapBuffers[1]); SetBgTilemapBuffer(2, sRayScene->tilemapBuffers[2]); @@ -1518,46 +1584,46 @@ static void sub_81D6FE0(void) SetGpuReg(REG_OFFSET_BLDCNT, 0); } -static void sub_81D706C(void) +static void LoadDuoFightSceneGfx(void) { ResetTempTileDataBuffers(); - DecompressAndCopyTileDataToVram(0, gRaySceneClouds_Gfx, 0, 0, 0); - while (FreeTempTileDataBuffersIfPossible()); - - LZDecompressWram(gRaySceneClouds2_Tilemap, sRayScene->tilemapBuffers[0]); - LZDecompressWram(gRaySceneClouds1_Tilemap, sRayScene->tilemapBuffers[1]); - LZDecompressWram(gRaySceneClouds3_Tilemap, sRayScene->tilemapBuffers[2]); - LoadCompressedPalette(gRaySceneClouds_Pal, 0, 0x40); - LoadCompressedSpriteSheet(&sUnknown_0862A8C4); - LoadCompressedSpriteSheet(&sUnknown_0862A8F8); - LoadCompressedSpriteSheet(&sUnknown_0862A924); - LoadCompressedSpriteSheet(&sUnknown_0862A9D4); - LoadCompressedSpriteSheet(&sUnknown_0862AA14); - LoadCompressedSpriteSheet(&sUnknown_0862AA34); - LoadCompressedSpritePalette(&sUnknown_0862A8CC); - LoadCompressedSpritePalette(&sUnknown_0862A9DC); + DecompressAndCopyTileDataToVram(0, gRaySceneDuoFight_Clouds_Gfx, 0, 0, 0); + while (FreeTempTileDataBuffersIfPossible()) + ; + LZDecompressWram(gRaySceneDuoFight_Clouds2_Tilemap, sRayScene->tilemapBuffers[0]); + LZDecompressWram(gRaySceneDuoFight_Clouds1_Tilemap, sRayScene->tilemapBuffers[1]); + LZDecompressWram(gRaySceneDuoFight_Clouds3_Tilemap, sRayScene->tilemapBuffers[2]); + LoadCompressedPalette(gRaySceneDuoFight_Clouds_Pal, 0, 0x40); + LoadCompressedSpriteSheet(&sSpriteSheet_DuoFight_Groudon); + LoadCompressedSpriteSheet(&sSpriteSheet_DuoFight_GroudonShoulder); + LoadCompressedSpriteSheet(&sSpriteSheet_DuoFight_GroudonClaw); + LoadCompressedSpriteSheet(&sSpriteSheet_DuoFight_Kyogre); + LoadCompressedSpriteSheet(&sSpriteSheet_DuoFight_KyogrePectoralFin); + LoadCompressedSpriteSheet(&sSpriteSheet_DuoFight_KyogreDorsalFin); + LoadCompressedSpritePalette(&sSpritePal_DuoFight_Groudon); + LoadCompressedSpritePalette(&sSpritePal_DuoFight_Kyogre); } static void Task_DuoFightAnim(u8 taskId) { s16 *data = gTasks[taskId].data; ScanlineEffect_Clear(); - sub_81D6FE0(); - sub_81D706C(); + InitDuoFightSceneBgs(); + LoadDuoFightSceneGfx(); CpuFastFill16(0, gScanlineEffectRegBuffers, sizeof(gScanlineEffectRegBuffers)); - ScanlineEffect_SetParams(sUnknown_0862A87C); - data[0] = 0; - data[1] = CreateTask(sub_81D7228, 0); + ScanlineEffect_SetParams(sScanlineParams_DuoFight_Clouds); + tTimer = 0; + tHelperTaskId = CreateTask(Task_DuoFight_AnimateClouds, 0); if (sRayScene->animId == RAY_ANIM_DUO_FIGHT_PRE) { - data[2] = sub_81D6984(); - data[3] = sub_81D6B7C(); + tGroudonSpriteId = DuoFightPre_CreateGroudonSprites(); + tKyogreSpriteId = DuoFightPre_CreateKyogreSprites(); gTasks[taskId].func = Task_HandleDuoFightPre; } else { - data[2] = sub_81D7664(); - data[3] = sub_81D78BC(); + tGroudonSpriteId = DuoFight_CreateGroudonSprites(); + tKyogreSpriteId = DuoFight_CreateKyogreSprites(); gTasks[taskId].func = Task_HandleDuoFight; StopMapMusic(); } @@ -1568,7 +1634,7 @@ static void Task_DuoFightAnim(u8 taskId) PlaySE(SE_DOWNPOUR); } -static void sub_81D7228(u8 taskId) +static void Task_DuoFight_AnimateClouds(u8 taskId) { s16 i; u16 *data = gTasks[taskId].data; @@ -1630,85 +1696,89 @@ static void sub_81D7228(u8 taskId) static void Task_HandleDuoFight(u8 taskId) { s16 *data = gTasks[taskId].data; - sub_81D750C(); + DuoFight_AnimateRain(); if (!gPaletteFade.active) { - s16 counter = data[0]; - if (counter == 32 || counter == 112) + s16 frame = tTimer; + if (frame == 32 || frame == 112) { - sub_81D7438(); + DuoFight_Lightning1(); } - else if (counter == 216) + else if (frame == 216) { - sub_81D7480(); + DuoFight_Lightning2(); } - else if (counter == 220) + else if (frame == 220) { - sub_81D74C8(); + DuoFight_LightningLong(); } else { - switch (counter) + switch (frame) { case 412: DuoFightEnd(taskId, 2); return; case 380: SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_TGT2_BG1 | BLDCNT_EFFECT_BLEND); - gTasks[data[1]].func = sub_81D752C; - gTasks[data[1]].data[0] = 0; - gTasks[data[1]].data[2] = data[2]; - gTasks[data[1]].data[3] = data[3]; + gTasks[tHelperTaskId].func = DuoFight_PanOffScene; + gTasks[tHelperTaskId].data[0] = 0; + gTasks[tHelperTaskId].data[2] = data[2]; + gTasks[tHelperTaskId].data[3] = data[3]; ScanlineEffect_Stop(); break; } } - data[0]++; + tTimer++; } } -static void sub_81D7438(void) +// In the below functions, BlendPalettesGradually flashes the bg white and the duo black +// and gradually fades them back to original color to simulate lightning +static void DuoFight_Lightning1(void) { PlaySE(SE_THUNDER); - sub_80A2C44(0x7FFF, 0, 0x10, 0, -1, 0, 0); - sub_80A2C44(0xFFFF0000, 0, 0x10, 0, 0, 0, 1); + BlendPalettesGradually(0x00007FFF, 0, 16, 0, RGB_WHITEALPHA, 0, 0); + BlendPalettesGradually(0xFFFF0000, 0, 16, 0, RGB_BLACK, 0, 1); } -static void sub_81D7480(void) +static void DuoFight_Lightning2(void) { PlaySE(SE_THUNDER); - sub_80A2C44(0x7FFF, 0, 0x10, 0x10, -1, 0, 0); - sub_80A2C44(0xFFFF0000, 0, 0x10, 0x10, 0, 0, 1); + BlendPalettesGradually(0x00007FFF, 0, 16, 16, RGB_WHITEALPHA, 0, 0); + BlendPalettesGradually(0xFFFF0000, 0, 16, 16, RGB_BLACK, 0, 1); } -static void sub_81D74C8(void) +static void DuoFight_LightningLong(void) { - sub_80A2C44(0x7FFF, 4, 0x10, 0, -1, 0, 0); - sub_80A2C44(0xFFFF0000, 4, 0x10, 0, 0, 0, 1); + BlendPalettesGradually(0x00007FFF, 4, 16, 0, RGB_WHITEALPHA, 0, 0); + BlendPalettesGradually(0xFFFF0000, 4, 16, 0, RGB_BLACK, 0, 1); } -static void sub_81D750C(void) +static void DuoFight_AnimateRain(void) { ChangeBgX(2, 0x400, 1); ChangeBgY(2, 0x800, 2); } -static void sub_81D752C(u8 taskId) +// Only used by the full version, which pans up at the end (so scene objects move down) +// DuoFightPre just fades to black with no pan +static void DuoFight_PanOffScene(u8 taskId) { u16 bgY; s16 *data = gTasks[taskId].data; - sub_81D7860(&gSprites[data[2]]); - sub_81D7D14(&gSprites[data[3]]); + DuoFight_SlideGroudonDown(&gSprites[tGroudonSpriteId]); + DuoFight_SlideKyogreDown(&gSprites[tKyogreSpriteId]); bgY = GetBgY(1); if (GetBgY(1) == 0 || bgY > 0x8000) ChangeBgY(1, 0x400, 2); - if (data[0] != 16) + if (tTimer != 16) { - data[0]++; - SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - data[0], data[0])); + tTimer++; + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - tTimer, tTimer)); } } @@ -1722,36 +1792,36 @@ static void DuoFightEnd(u8 taskId, s8 palDelay) static void Task_DuoFightEnd(u8 taskId) { s16 *data = gTasks[taskId].data; - sub_81D750C(); + DuoFight_AnimateRain(); if (!gPaletteFade.active) { - DestroyTask(data[1]); + DestroyTask(tHelperTaskId); ChangeBgY(1, 0, 0); SetVBlankCallback(NULL); ScanlineEffect_Stop(); ResetSpriteData(); FreeAllSpritePalettes(); - data[0] = 0; + tTimer = 0; gTasks[taskId].func = Task_SetNextAnim; } } -static u8 sub_81D7664(void) +static u8 DuoFight_CreateGroudonSprites(void) { u8 spriteId; s16 *data; - spriteId = CreateSprite(&sUnknown_0862A8D4, 98, 72, 3); - gSprites[spriteId].callback = sub_81D7700; + spriteId = CreateSprite(&sSpriteTemplate_DuoFight_Groudon, 98, 72, 3); + gSprites[spriteId].callback = SpriteCB_DuoFight_Groudon; data = gSprites[spriteId].data; - data[0] = CreateSprite(&sUnknown_0862A8D4, 66, 104, 3); - data[1] = CreateSprite(&sUnknown_0862A900, 85, 101, 0); - data[2] = CreateSprite(&sUnknown_0862A92C, 119, 114, 1); - StartSpriteAnim(&gSprites[data[0]], 1); + sGroudonBodySpriteId = CreateSprite(&sSpriteTemplate_DuoFight_Groudon, 66, 104, 3); + sGroudonShoulderSpriteId = CreateSprite(&sSpriteTemplate_DuoFight_GroudonShoulder, 85, 101, 0); + sGroudonClawSpriteId = CreateSprite(&sSpriteTemplate_DuoFight_GroudonClaw, 119, 114, 1); + StartSpriteAnim(&gSprites[sGroudonBodySpriteId], 1); return spriteId; } -static void sub_81D7700(struct Sprite *sprite) +static void SpriteCB_DuoFight_Groudon(struct Sprite *sprite) { s16 *data = sprite->data; data[5]++; @@ -1759,66 +1829,66 @@ static void sub_81D7700(struct Sprite *sprite) if (!(data[5] & 7) && sprite->pos1.x != 72) { sprite->pos1.x--; - gSprites[sprite->data[0]].pos1.x--; - gSprites[data[1]].pos1.x--; - gSprites[data[2]].pos1.x--; + gSprites[sprite->sGroudonBodySpriteId].pos1.x--; + gSprites[sGroudonShoulderSpriteId].pos1.x--; + gSprites[sGroudonClawSpriteId].pos1.x--; } switch (sprite->animCmdIndex) { case 0: - gSprites[data[1]].pos2.x = 0; - gSprites[data[1]].pos2.y = 0; - gSprites[data[2]].pos2.x = 0; - gSprites[data[2]].pos2.y = 0; + gSprites[sGroudonShoulderSpriteId].pos2.x = 0; + gSprites[sGroudonShoulderSpriteId].pos2.y = 0; + gSprites[sGroudonClawSpriteId].pos2.x = 0; + gSprites[sGroudonClawSpriteId].pos2.y = 0; break; case 1: case 3: - gSprites[data[1]].pos2.x = -1; - gSprites[data[1]].pos2.y = 0; - gSprites[data[2]].pos2.x = -1; - gSprites[data[2]].pos2.y = 0; + gSprites[sGroudonShoulderSpriteId].pos2.x = -1; + gSprites[sGroudonShoulderSpriteId].pos2.y = 0; + gSprites[sGroudonClawSpriteId].pos2.x = -1; + gSprites[sGroudonClawSpriteId].pos2.y = 0; break; case 2: - gSprites[data[1]].pos2.x = -1; - gSprites[data[1]].pos2.y = 1; - gSprites[data[2]].pos2.x = -2; - gSprites[data[2]].pos2.y = 1; + gSprites[sGroudonShoulderSpriteId].pos2.x = -1; + gSprites[sGroudonShoulderSpriteId].pos2.y = 1; + gSprites[sGroudonClawSpriteId].pos2.x = -2; + gSprites[sGroudonClawSpriteId].pos2.y = 1; break; } } -static void sub_81D7860(struct Sprite *sprite) +static void DuoFight_SlideGroudonDown(struct Sprite *sprite) { s16 *data = sprite->data; if (sprite->pos1.y <= 160) { sprite->pos1.y += 8; - gSprites[sprite->data[0]].pos1.y += 8; - gSprites[data[1]].pos1.y += 8; - gSprites[data[2]].pos1.y += 8; + gSprites[sprite->sGroudonBodySpriteId].pos1.y += 8; + gSprites[sGroudonShoulderSpriteId].pos1.y += 8; + gSprites[sGroudonClawSpriteId].pos1.y += 8; } } -static u8 sub_81D78BC(void) +static u8 DuoFight_CreateKyogreSprites(void) { u8 spriteId; s16 *data; - spriteId = CreateSprite(&sUnknown_0862A9E4, 126, 96, 1); - gSprites[spriteId].callback = sub_81D7A60; + spriteId = CreateSprite(&sSpriteTemplate_DuoFight_Kyogre, 126, 96, 1); + gSprites[spriteId].callback = SpriteCB_DuoFight_Kyogre; data = gSprites[spriteId].data; - data[0] = CreateSprite(&sUnknown_0862A9E4, 158, 96, 1) << 8; - data[0] |= CreateSprite(&sUnknown_0862A9E4, 126, 112, 1); - data[1] = CreateSprite(&sUnknown_0862A9E4, 158, 112, 1) << 8; - data[1] |= CreateSprite(&sUnknown_0862A9E4, 126, 128, 1); - data[2] = CreateSprite(&sUnknown_0862A9E4, 158, 128, 1) << 8; - data[2] |= CreateSprite(&sUnknown_0862A9E4, 94, 128, 2); - data[3] = CreateSprite(&sUnknown_0862A9E4, 126, 128, 2) << 8; - data[3] |= CreateSprite(&sUnknown_0862A9E4, 174, 128, 0); - data[4] = CreateSprite(&sUnknown_0862AA1C, 198, 132, 0) << 8; - data[4] |= CreateSprite(&sUnknown_0862AA3C, 190, 120, 1); + data[0] = CreateSprite(&sSpriteTemplate_DuoFight_Kyogre, 158, 96, 1) << 8; + data[0] |= CreateSprite(&sSpriteTemplate_DuoFight_Kyogre, 126, 112, 1); + data[1] = CreateSprite(&sSpriteTemplate_DuoFight_Kyogre, 158, 112, 1) << 8; + data[1] |= CreateSprite(&sSpriteTemplate_DuoFight_Kyogre, 126, 128, 1); + data[2] = CreateSprite(&sSpriteTemplate_DuoFight_Kyogre, 158, 128, 1) << 8; + data[2] |= CreateSprite(&sSpriteTemplate_DuoFight_Kyogre, 94, 128, 2); + data[3] = CreateSprite(&sSpriteTemplate_DuoFight_Kyogre, 126, 128, 2) << 8; + data[3] |= CreateSprite(&sSpriteTemplate_DuoFight_Kyogre, 174, 128, 0); + data[4] = CreateSprite(&sSpriteTemplate_DuoFight_KyogrePectoralFin, 198, 132, 0) << 8; + data[4] |= CreateSprite(&sSpriteTemplate_DuoFight_KyogreDorsalFin, 190, 120, 1); StartSpriteAnim(&gSprites[data[0] >> 8], 1); StartSpriteAnim(&gSprites[data[0] & 0xFF], 2); @@ -1832,7 +1902,7 @@ static u8 sub_81D78BC(void) return spriteId; } -static void sub_81D7A60(struct Sprite *sprite) +static void SpriteCB_DuoFight_Kyogre(struct Sprite *sprite) { s16 *data = sprite->data; data[5]++; @@ -1893,7 +1963,7 @@ static void sub_81D7A60(struct Sprite *sprite) } } -static void sub_81D7D14(struct Sprite *sprite) +static void DuoFight_SlideKyogreDown(struct Sprite *sprite) { s16 *data = sprite->data; if (sprite->pos1.y <= 160) @@ -1912,11 +1982,32 @@ static void sub_81D7D14(struct Sprite *sprite) } } -static void sub_81D7E10(void) +#undef tTimer +#undef tHelperTaskId +#undef tGroudonSpriteId +#undef tKyogreSpriteId + +#undef sGroudonBodySpriteId +#undef sGroudonShoulderSpriteId +#undef sGroudonClawSpriteId + + +// RAY_ANIM_TAKES_FLIGHT + +#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(); ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(1, sUnknown_0862AA54, ARRAY_COUNT(sUnknown_0862AA54)); + InitBgsFromTemplates(1, sBgTemplates_TakesFlight, ARRAY_COUNT(sBgTemplates_TakesFlight)); SetBgTilemapBuffer(0, sRayScene->tilemapBuffers[0]); SetBgTilemapBuffer(1, sRayScene->tilemapBuffers[1]); SetBgTilemapBuffer(2, sRayScene->tilemapBuffers[2]); @@ -1931,99 +2022,117 @@ static void sub_81D7E10(void) SetGpuReg(REG_OFFSET_BLDCNT, 0); } -static void sub_81D7E9C(void) +static void LoadTakesFlightSceneGfx(void) { ResetTempTileDataBuffers(); - DecompressAndCopyTileDataToVram(0, gRaySceneClouds_Gfx, 0, 0, 0); - DecompressAndCopyTileDataToVram(1, gRaySceneOvercast_Gfx, 0, 0, 0); - DecompressAndCopyTileDataToVram(2, gRaySceneRayquaza_Gfx, 0, 0, 0); - while (FreeTempTileDataBuffersIfPossible()); - - LZDecompressWram(gRaySceneClouds2_Tilemap, sRayScene->tilemapBuffers[0]); - LZDecompressWram(gRaySceneOvercast_Tilemap, sRayScene->tilemapBuffers[1]); - LZDecompressWram(gRaySceneRayquaza_Tilemap, sRayScene->tilemapBuffers[2]); - LoadCompressedPalette(gRaySceneRayquaza_Pal, 0, 0x40); - LoadCompressedSpriteSheet(&sUnknown_0862AA90); - LoadCompressedSpritePalette(&sUnknown_0862AA98); + 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()) + ; + 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, 64); + LoadCompressedSpriteSheet(&sSpriteSheet_TakesFlight_Smoke); + LoadCompressedSpritePalette(&sSpritePal_TakesFlight_Smoke); } static void Task_RayTakesFlightAnim(u8 taskId) { s16 *data = gTasks[taskId].data; PlayNewMapMusic(MUS_RAYQUAZA_APPEARS); - sub_81D7E10(); - sub_81D7E9C(); + InitTakesFlightSceneBgs(); + 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, 120, 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, 120, 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, 120, 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) @@ -2035,56 +2144,71 @@ 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(&sUnknown_0862AAA0, - (sUnknown_0862AAB8[data[0]][0] * 4) + 120, - (sUnknown_0862AAB8[data[0]][1] * 4) + 80, + u8 spriteId = CreateSprite(&sSpriteTemplate_TakesFlight_Smoke, + (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 sub_81D8260(struct Sprite *sprite) +#undef tSmokeId +#undef 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; } -static void sub_81D82B0(void) +#undef sSmokeId +#undef sTimer + + +// RAY_ANIM_DESCENDS + +static void InitDescendsSceneBgs(void) { ResetVramOamAndBgCntRegs(); ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, sUnknown_0862AACC, ARRAY_COUNT(sUnknown_0862AACC)); + InitBgsFromTemplates(0, sBgTemplates_Descends, ARRAY_COUNT(sBgTemplates_Descends)); SetBgTilemapBuffer(0, sRayScene->tilemapBuffers[0]); SetBgTilemapBuffer(1, sRayScene->tilemapBuffers[1]); SetBgTilemapBuffer(2, sRayScene->tilemapBuffers[2]); @@ -2102,65 +2226,72 @@ static void sub_81D82B0(void) SetGpuReg(REG_OFFSET_BLDCNT, 0); } -static void sub_81D8358(void) +static void LoadDescendsSceneGfx(void) { ResetTempTileDataBuffers(); - DecompressAndCopyTileDataToVram(0, gRaySceneRayquazaLight_Gfx, 0, 0, 0); - DecompressAndCopyTileDataToVram(1, gRaySceneOvercast2_Gfx, 0, 0, 0); - while (FreeTempTileDataBuffersIfPossible()); - - LZDecompressWram(gRaySceneRayquazaLight_Tilemap, sRayScene->tilemapBuffers[0]); - LZDecompressWram(gRaySceneOvercast2_Tilemap, sRayScene->tilemapBuffers[3]); - CpuFastFill16(0, sRayScene->tilemapBuffers[2], 0x800); - CpuFastCopy(sRayScene->tilemapBuffers[3], sRayScene->tilemapBuffers[1], 0x800); + DecompressAndCopyTileDataToVram(0, gRaySceneDescends_Light_Gfx, 0, 0, 0); + DecompressAndCopyTileDataToVram(1, gRaySceneDescends_Bg_Gfx, 0, 0, 0); + while (FreeTempTileDataBuffersIfPossible()) + ; + LZDecompressWram(gRaySceneDescends_Light_Tilemap, sRayScene->tilemapBuffers[0]); + LZDecompressWram(gRaySceneDescends_Bg_Tilemap, sRayScene->tilemapBuffers[3]); + CpuFastFill16(0, sRayScene->tilemapBuffers[2], BG_SCREEN_SIZE); + CpuFastCopy(sRayScene->tilemapBuffers[3], sRayScene->tilemapBuffers[1], BG_SCREEN_SIZE); CpuFastFill16(0, &sRayScene->tilemapBuffers[1][0x100], 0x340); - LoadCompressedPalette(gRaySceneOvercast2_Pal, 0, 0x40); + LoadCompressedPalette(gRaySceneDescends_Bg_Pal, 0, 0x40); gPlttBufferUnfaded[0] = RGB_WHITE; gPlttBufferFaded[0] = RGB_WHITE; - LoadCompressedSpriteSheet(&sUnknown_0862AAFC); - LoadCompressedSpriteSheet(&sUnknown_0862AB04); - LoadCompressedSpritePalette(&sUnknown_0862AB0C); + LoadCompressedSpriteSheet(&sSpriteSheet_Descends_Rayquaza); + LoadCompressedSpriteSheet(&sSpriteSheet_Descends_RayquazaTail); + LoadCompressedSpritePalette(&sSpritePal_Descends_Rayquaza); } -static void sub_81D844C(void) +// Draw ray of light emerging from the clouds +static void HBlankCB_RayDescends(void) { - u16 VCOUNT = GetGpuReg(REG_OFFSET_VCOUNT); - if (VCOUNT >= 24 && VCOUNT <= 135 && VCOUNT - 24 <= sRayScene->field_2008) - REG_BLDALPHA = 0xD08; + u16 vcount = GetGpuReg(REG_OFFSET_VCOUNT); + if (vcount >= 24 && vcount <= 135 && vcount - 24 <= sRayScene->revealedLightLine) + REG_BLDALPHA = 0xD08; // This line is above where light has been revealed, draw it else - REG_BLDALPHA = 0x1000; + REG_BLDALPHA = 0x1000; // Below where light has been revealed, hide it - if (VCOUNT == 0) + if (vcount == 0) { - if (sRayScene->field_2008 <= 0x1FFF) + if (sRayScene->revealedLightLine <= 0x1FFF) { - if (sRayScene->field_2008 <= 39) - sRayScene->field_2008 += 4; - else if (sRayScene->field_2008 <= 79) - sRayScene->field_2008 += 2; + // Increase the number of pixel rows of the light that have been revealed + // Gradually slows as it reaches the bottom + if (sRayScene->revealedLightLine <= 39) + sRayScene->revealedLightLine += 4; + else if (sRayScene->revealedLightLine <= 79) + sRayScene->revealedLightLine += 2; else - sRayScene->field_2008 += 1; + sRayScene->revealedLightLine += 1; } - sRayScene->field_200A++; + // Pointless + sRayScene->revealedLightTimer++; } } +#define tState data[0] +#define tTimer data[1] + static void Task_RayDescendsAnim(u8 taskId) { s16 *data = gTasks[taskId].data; - sub_81D82B0(); - sub_81D8358(); + InitDescendsSceneBgs(); + LoadDescendsSceneGfx(); SetGpuRegBits(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); BlendPalettes(-1, 0x10, 0); SetVBlankCallback(VBlankCB_RayquazaScene); - sRayScene->field_2008 = 0; - sRayScene->field_200A = 0; - data[0] = 0; - data[1] = 0; - data[2] = 0; + sRayScene->revealedLightLine = 0; + sRayScene->revealedLightTimer = 0; + tState = 0; + tTimer = 0; + data[2] = 0; // Below data assignments do nothing data[3] = 0; data[4] = 0x1000; gTasks[taskId].func = Task_HandleRayDescends; @@ -2169,56 +2300,61 @@ static void Task_RayDescendsAnim(u8 taskId) static void Task_HandleRayDescends(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[1] = 0; - data[0]++; + tTimer = 0; + tState++; } else { - data[1]++; + tTimer++; } break; case 1: if (!gPaletteFade.active) { - if (data[1] == 10) + // Delay, then start ray of light + if (tTimer == 10) { - data[1] = 0; - data[0]++; - SetHBlankCallback(sub_81D844C); + tTimer = 0; + tState++; + SetHBlankCallback(HBlankCB_RayDescends); EnableInterrupts(INTR_FLAG_HBLANK | INTR_FLAG_VBLANK); } else { - data[1]++; + tTimer++; } } break; case 2: - if (data[1] == 80) + // Delay, then start Rayquaza emerging from clouds + if (tTimer == 80) { - data[1] = 0; - data[0]++; - sub_81D86CC(); + tTimer = 0; + tState++; + CreateDescendsRayquazaSprite(); } else { - data[1]++; + tTimer++; } break; case 3: - if (++data[1] == 368) + // Wait while Rayquaza descends + if (++tTimer == 368) { - data[1] = 0; - data[0]++; + tTimer = 0; + tState++; } break; case 4: + // Fade out BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].func = Task_RayDescendsEnd; break; @@ -2237,76 +2373,92 @@ static void Task_RayDescendsEnd(u8 taskId) } } -static u8 sub_81D86CC(void) +#define sTailSpriteId data[0] +#define sTimer data[2] +#define sXMovePeriod data[3] +#define sYMovePeriod data[4] + +static u8 CreateDescendsRayquazaSprite(void) { - u8 spriteId = CreateSprite(&sUnknown_0862AB14, 160, 0, 0); + u8 spriteId = CreateSprite(&sSpriteTemplate_Descends_Rayquaza, 160, 0, 0); s16 *data = gSprites[spriteId].data; - data[0] = CreateSprite(&sUnknown_0862AB2C, 184, -48, 0); - gSprites[spriteId].callback = sub_81D874C; + sTailSpriteId = CreateSprite(&sSpriteTemplate_Descends_RayquazaTail, 184, -48, 0); + gSprites[spriteId].callback = SpriteCB_Descends_Rayquaza; gSprites[spriteId].oam.priority = 3; - gSprites[data[0]].oam.priority = 3; + gSprites[sTailSpriteId].oam.priority = 3; return spriteId; } -static void sub_81D874C(struct Sprite *sprite) +static void SpriteCB_Descends_Rayquaza(struct Sprite *sprite) { s16 *data = sprite->data; - s16 counter = data[2]; - if (counter == 0) + s16 frame = sTimer; + + // Updates to Rayquaza's coords occur more frequently + // as time goes on (it accelerates as it emerges) + if (frame == 0) { - data[3] = 12; - data[4] = 8; + sXMovePeriod = 12; + sYMovePeriod = 8; } - else if (counter == 256) + else if (frame == 256) { - data[3] = 9; - data[4] = 7; + sXMovePeriod = 9; + sYMovePeriod = 7; } - else if (counter == 268) + else if (frame == 268) { - data[3] = 8; - data[4] = 6; + sXMovePeriod = 8; + sYMovePeriod = 6; } - else if (counter == 280) + else if (frame == 280) { - data[3] = 7; - data[4] = 5; + sXMovePeriod = 7; + sYMovePeriod = 5; } - else if (counter == 292) + else if (frame == 292) { - data[3] = 6; - data[4] = 4; + sXMovePeriod = 6; + sYMovePeriod = 4; } - else if (counter == 304) + else if (frame == 304) { - data[3] = 5; - data[4] = 3; + sXMovePeriod = 5; + sYMovePeriod = 3; } - else if (counter == 320) + else if (frame == 320) { - data[3] = 4; - data[4] = 2; + sXMovePeriod = 4; + sYMovePeriod = 2; } - if (data[2] % data[3] == 0) + if (sTimer % sXMovePeriod == 0) { sprite->pos2.x--; - gSprites[data[0]].pos2.x--; + gSprites[sTailSpriteId].pos2.x--; } - if (data[2] % data[4] == 0) + if (sTimer % sYMovePeriod == 0) { sprite->pos2.y++; - gSprites[data[0]].pos2.y++; + gSprites[sTailSpriteId].pos2.y++; } - data[2]++; + sTimer++; } -static void sub_81D8828(void) +#undef sTailSpriteId +#undef sTimer +#undef sXMovePeriod +#undef sYMovePeriod + + +// RAY_ANIM_CHARGES + +static void InitChargesSceneBgs(void) { ResetVramOamAndBgCntRegs(); ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, sUnknown_0862AB44, ARRAY_COUNT(sUnknown_0862AB44)); + InitBgsFromTemplates(0, sBgTemplates_Charges, ARRAY_COUNT(sBgTemplates_Charges)); SetBgTilemapBuffer(0, sRayScene->tilemapBuffers[0]); SetBgTilemapBuffer(1, sRayScene->tilemapBuffers[1]); SetBgTilemapBuffer(2, sRayScene->tilemapBuffers[2]); @@ -2324,124 +2476,151 @@ static void sub_81D8828(void) SetGpuReg(REG_OFFSET_BLDCNT, 0); } -static void sub_81D88D0(void) +static void LoadChargesSceneGfx(void) { ResetTempTileDataBuffers(); - DecompressAndCopyTileDataToVram(1, gRaySceneRayquazaChase_Gfx, 0, 0, 0); - DecompressAndCopyTileDataToVram(2, gRaySceneChaseStreaks_Gfx, 0, 0, 0); - DecompressAndCopyTileDataToVram(3, gRaySceneChaseBg_Gfx, 0, 0, 0); - while (FreeTempTileDataBuffersIfPossible()); - - LZDecompressWram(gRayChaseRayquazaChase2_Tilemap, sRayScene->tilemapBuffers[0]); - LZDecompressWram(gRayChaseRayquazaChase_Tilemap, sRayScene->tilemapBuffers[1]); - LZDecompressWram(gRaySceneChaseStreaks_Tilemap, sRayScene->tilemapBuffers[2]); - LZDecompressWram(gRaySceneChaseBg_Tilemap, sRayScene->tilemapBuffers[3]); - LoadCompressedPalette(gRaySceneChase_Pal, 0, 0x80); -} + DecompressAndCopyTileDataToVram(1, gRaySceneCharges_Rayquaza_Gfx, 0, 0, 0); + DecompressAndCopyTileDataToVram(2, gRaySceneCharges_Streaks_Gfx, 0, 0, 0); + DecompressAndCopyTileDataToVram(3, gRaySceneCharges_Bg_Gfx, 0, 0, 0); + while (FreeTempTileDataBuffersIfPossible()) + ; + LZDecompressWram(gRaySceneCharges_Orbs_Tilemap, sRayScene->tilemapBuffers[0]); + LZDecompressWram(gRaySceneCharges_Rayquaza_Tilemap, sRayScene->tilemapBuffers[1]); + LZDecompressWram(gRaySceneCharges_Streaks_Tilemap, sRayScene->tilemapBuffers[2]); + LZDecompressWram(gRaySceneCharges_Bg_Tilemap, sRayScene->tilemapBuffers[3]); + 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) { s16 *data = gTasks[taskId].data; - sub_81D8828(); - sub_81D88D0(); - sub_81D68C8(); + InitChargesSceneBgs(); + LoadChargesSceneGfx(); + SetWindowsHideVertBorders(); BlendPalettes(-1, 0x10, 0); SetVBlankCallback(VBlankCB_RayquazaScene); - data[0] = 0; - data[1] = 0; - data[2] = CreateTask(sub_81D8AD8, 0); + tState = 0; + tTimer = 0; + tRayquazaTaskId = CreateTask(Task_RayCharges_ShakeRayquaza, 0); gTasks[taskId].func = Task_HandleRayCharges; } static void Task_HandleRayCharges(u8 taskId) { s16 *data = gTasks[taskId].data; - sub_81D8BB4(); - if ((data[3] & 7) == 0 && data[0] <= 1 && data[1] <= 89) + RayCharges_AnimateBg(); + if ((tSoundTimer & 7) == 0 && tState <= 1 && tTimer <= 89) PlaySE(SE_INTRO_BLAST); - data[3]++; - switch (data[0]) + tSoundTimer++; + switch (tState) { case 0: - if (data[1] == 8) + // Delay, then fade in + if (tTimer == 8) { BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); - data[1] = 0; - data[0]++; + tTimer = 0; + tState++; } else { - data[1]++; + tTimer++; } break; case 1: - if (data[1] == 127) + // Delay while Rayquaza shakes, then start Rayquaza moving offscreen + if (tTimer == 127) { - data[1] = 0; - data[0]++; - gTasks[data[2]].func = sub_81D8B2C; + tTimer = 0; + tState++; + gTasks[tRayquazaTaskId].func = Task_RayCharges_FlyOffscreen; } else { - data[1]++; + tTimer++; } break; case 2: - if (data[1] == 12) + // Delay for Rayquaza's flying animation + if (tTimer == 12) { - data[1] = 0; - data[0]++; + tTimer = 0; + tState++; } else { - data[1]++; + tTimer++; } break; case 3: + // Fade out BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].func = Task_RayChargesEnd; break; } } -static void sub_81D8AD8(u8 taskId) +#undef tState +#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; - if ((data[15] & 3) == 0) + if ((tTimer & 3) == 0) { ChangeBgX(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; - if (data[0] == 0) + if (tState == 0) { ChangeBgX(1, 0, 0); ChangeBgY(1, 0, 0); - data[0]++; - data[1] = 10; - data[2] = -1; + tState++; + tOffset = 10; + tShakeDir = -1; } - else if (data[0] == 1) + else if (tState == 1) { - ChangeBgX(1, data[1] << 8, 2); - ChangeBgY(1, data[1] << 8, 1); - data[1] += data[2]; - if (data[1] == -10) - data[2] *= -1; + ChangeBgX(1, tOffset << 8, 2); + ChangeBgY(1, tOffset << 8, 1); + tOffset += tShakeDir; + if (tOffset == -10) + 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); ChangeBgY(2, 0x400, 1); + + // Update blue streaks ChangeBgX(0, 0x800, 2); ChangeBgY(0, 0x800, 1); } @@ -2449,21 +2628,26 @@ static void sub_81D8BB4(void) static void Task_RayChargesEnd(u8 taskId) { s16 *data = gTasks[taskId].data; - sub_81D8BB4(); + RayCharges_AnimateBg(); if (!gPaletteFade.active) { SetVBlankCallback(NULL); - sub_81D6904(); - DestroyTask(data[2]); + ResetWindowDimensions(); + DestroyTask(tRayquazaTaskId); gTasks[taskId].func = Task_SetNextAnim; } } -static void sub_81D8C38(void) +#undef tRayquazaTaskId + + +// RAY_ANIM_CHASES_AWAY + +static void InitChasesAwaySceneBgs(void) { ResetVramOamAndBgCntRegs(); ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(1, sUnknown_0862AD08, ARRAY_COUNT(sUnknown_0862AD08)); + InitBgsFromTemplates(1, sBgTemplates_ChasesAway, ARRAY_COUNT(sBgTemplates_ChasesAway)); SetBgTilemapBuffer(0, sRayScene->tilemapBuffers[0]); SetBgTilemapBuffer(1, sRayScene->tilemapBuffers[1]); SetBgTilemapBuffer(2, sRayScene->tilemapBuffers[2]); @@ -2478,237 +2662,287 @@ static void sub_81D8C38(void) SetGpuReg(REG_OFFSET_BLDCNT, 0); } -static void sub_81D8CC4(void) +static void LoadChasesAwaySceneGfx(void) { ResetTempTileDataBuffers(); - DecompressAndCopyTileDataToVram(2, gRaySceneHushRing_Gfx, 0, 0, 0); - DecompressAndCopyTileDataToVram(0, gRaySceneHushBg_Gfx, 0, 0, 0); - while (FreeTempTileDataBuffersIfPossible()); - - LZDecompressWram(gRaySceneHushRing_Tilemap, sRayScene->tilemapBuffers[1]); - LZDecompressWram(gRaySceneHushBg_Tilemap, sRayScene->tilemapBuffers[0]); - LZDecompressWram(gRaySceneHushRing_Map, sRayScene->tilemapBuffers[2]); - LoadCompressedPalette(gRaySceneHushBg_Pal, 0, 0x60); - LoadCompressedSpriteSheet(&sUnknown_0862AC28); - LoadCompressedSpriteSheet(&sUnknown_0862AC30); - LoadCompressedSpriteSheet(&sUnknown_0862AC38); - LoadCompressedSpriteSheet(&sUnknown_0862AC40); - LoadCompressedSpriteSheet(&sUnknown_0862AC48); - LoadCompressedSpriteSheet(&sUnknown_0862AC50); - LoadCompressedSpritePalette(&sUnknown_0862AC58); - LoadCompressedSpritePalette(&sUnknown_0862AC60); - LoadCompressedSpritePalette(&sUnknown_0862AC68); - LoadCompressedSpritePalette(&sUnknown_0862AC70); -} + DecompressAndCopyTileDataToVram(2, gRaySceneChasesAway_Ring_Gfx, 0, 0, 0); + DecompressAndCopyTileDataToVram(0, gRaySceneChasesAway_Light_Gfx, 0, 0, 0); + while (FreeTempTileDataBuffersIfPossible()) + ; + LZDecompressWram(gRaySceneChasesAway_Bg_Tilemap, sRayScene->tilemapBuffers[1]); + LZDecompressWram(gRaySceneChasesAway_Light_Tilemap, sRayScene->tilemapBuffers[0]); + LZDecompressWram(gRaySceneChasesAway_Ring_Tilemap, sRayScene->tilemapBuffers[2]); + LoadCompressedPalette(gRaySceneChasesAway_Bg_Pal, 0, 0x60); + LoadCompressedSpriteSheet(&sSpriteSheet_ChasesAway_Groudon); + LoadCompressedSpriteSheet(&sSpriteSheet_ChasesAway_GroudonTail); + LoadCompressedSpriteSheet(&sSpriteSheet_ChasesAway_Kyogre); + LoadCompressedSpriteSheet(&sSpriteSheet_ChasesAway_Rayquaza); + LoadCompressedSpriteSheet(&sSpriteSheet_ChasesAway_RayquazaTail); + LoadCompressedSpriteSheet(&sSpriteSheet_ChasesAway_KyogreSplash); + LoadCompressedSpritePalette(&sSpritePal_ChasesAway_Groudon); + LoadCompressedSpritePalette(&sSpritePal_ChasesAway_Kyogre); + LoadCompressedSpritePalette(&sSpritePal_ChasesAway_Rayquaza); + 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; - sub_81D8C38(); - sub_81D8CC4(); - sub_81D68C8(); + InitChasesAwaySceneBgs(); + LoadChasesAwaySceneGfx(); + SetWindowsHideVertBorders(); ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_EFFECT_BLEND); 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) { - sub_80A2C44(0xFFFE, 0, 0x10, 0, -1, 0, 0); - sub_80A2C44(0xFFFF0000, 0, 0x10, 0, 0, 0, 1); + BlendPalettesGradually(0x0000FFFE, 0, 16, 0, RGB_WHITEALPHA, 0, 0); + BlendPalettesGradually(0xFFFF0000, 0, 16, 0, RGB_BLACK, 0, 1); } } 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); - sub_81D6904(); + 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(&sUnknown_0862AC78, 64, 120, 0); - spriteData = gSprites[taskData[3]].data; - spriteData[0] = CreateSprite(&sUnknown_0862AC90, 16, 130, 0); - gSprites[taskData[3]].oam.priority = 1; + tGroudonSpriteId = CreateSprite(&sSpriteTemplate_ChasesAway_Groudon, 64, 120, 0); + spriteData = gSprites[tGroudonSpriteId].data; + spriteData[0] = CreateSprite(&sSpriteTemplate_ChasesAway_GroudonTail, 16, 130, 0); + gSprites[tGroudonSpriteId].oam.priority = 1; gSprites[spriteData[0]].oam.priority = 1; - taskData[4] = CreateSprite(&sUnknown_0862ACA8, 160, 128, 1); - spriteData = gSprites[taskData[4]].data; - spriteData[0] = CreateSprite(&sUnknown_0862ACA8, 192, 128, 1); - spriteData[1] = CreateSprite(&sUnknown_0862ACA8, 224, 128, 1); - gSprites[taskData[4]].oam.priority = 1; + 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[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(&sUnknown_0862ACC0, 120, -65, 0); - spriteData = gSprites[taskData[5]].data; - spriteData[0] = CreateSprite(&sUnknown_0862ACD8, 120, -113, 0); - gSprites[taskData[5]].oam.priority = 1; + tRayquazaSpriteId = CreateSprite(&sSpriteTemplate_ChasesAway_Rayquaza, 120, -65, 0); + spriteData = gSprites[tRayquazaSpriteId].data; + spriteData[0] = CreateSprite(&sSpriteTemplate_ChasesAway_RayquazaTail, 120, -113, 0); + 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) { @@ -2733,19 +2967,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) { @@ -2756,9 +2990,9 @@ static void sub_81D9528(struct Sprite *sprite) } if (sprite->data[5] == 128) { - sprite->data[7] = CreateSprite(&sUnknown_0862ACF0, 152, 132, 0); + sprite->data[7] = CreateSprite(&sSpriteTemplate_ChasesAway_KyogreSplash, 152, 132, 0); gSprites[sprite->data[7]].oam.priority = 1; - sprite->data[7] = CreateSprite(&sUnknown_0862ACF0, 224, 132, 0); + sprite->data[7] = CreateSprite(&sSpriteTemplate_ChasesAway_KyogreSplash, 224, 132, 0); gSprites[sprite->data[7]].oam.priority = 1; gSprites[sprite->data[7]].hFlip = 1; sprite->data[5]++; @@ -2782,145 +3016,169 @@ static void sub_81D9528(struct Sprite *sprite) sprite->data[4]++; } -static void sub_81D961C(struct Sprite *sprite) +#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_MUGSHOT); - 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_SLIDING_DOOR); - 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; |