summaryrefslogtreecommitdiff
path: root/src/rayquaza_scene.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/rayquaza_scene.c')
-rw-r--r--src/rayquaza_scene.c2130
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;