From 95ea0e92e7e24de9ad77dfa0a3224718cd1564c3 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Tue, 25 Aug 2020 17:49:42 -0400 Subject: [PATCH 1/7] Start documenting rayquaza_scene --- data/maps/SootopolisCity/scripts.inc | 8 +- .../rayquaza_scene/{ => scene_1}/clouds.pal | 0 .../rayquaza_scene/{ => scene_1}/clouds.png | Bin .../rayquaza_scene/{ => scene_1}/clouds1.bin | Bin .../rayquaza_scene/{ => scene_1}/clouds2.bin | Bin .../rayquaza_scene/{ => scene_1}/clouds3.bin | Bin .../rayquaza_scene/{ => scene_1}/groudon.png | Bin .../{ => scene_1}/groudon_claw.png | Bin .../{ => scene_1}/groudon_shoulder.png | Bin .../rayquaza_scene/{ => scene_1}/kyogre.png | Bin .../{ => scene_1}/kyogre_fin.png | Bin .../{ => scene_1}/kyogre_shoulder.png | Bin .../{overcast.bin => scene_2/bg.bin} | Bin .../{overcast.png => scene_2/bg.png} | Bin .../rayquaza_scene/{ => scene_2}/rayquaza.bin | Bin .../rayquaza_scene/{ => scene_2}/rayquaza.png | Bin .../rayquaza_scene/{ => scene_2}/smoke.png | Bin .../{overcast2.bin => scene_3/bg.bin} | Bin .../{overcast2.pal => scene_3/bg.pal} | 0 .../{overcast2.png => scene_3/bg.png} | Bin .../{rayquaza_light.bin => scene_3/light.bin} | Bin .../{rayquaza_light.png => scene_3/light.png} | Bin .../rayquaza.png} | Bin .../{ => scene_3}/rayquaza_tail.png | Bin .../{chase_bg.bin => scene_4/bg.bin} | Bin .../{chase.pal => scene_4/bg.pal} | 0 .../{chase_bg.png => scene_4/bg.png} | Bin .../rayquaza.bin} | Bin .../rayquaza.png} | Bin .../rayquaza2.bin} | Bin .../streaks.bin} | Bin .../streaks.png} | Bin .../{hush_bg.bin => scene_5/bg.bin} | Bin .../{hush_bg.pal => scene_5/bg.pal} | 0 .../{hush_bg.png => scene_5/bg.png} | Bin .../{groudon_left.png => scene_5/groudon.png} | Bin .../{ => scene_5}/groudon_tail.png | Bin .../{kyogre_right.png => scene_5/kyogre.png} | Bin .../{splash.png => scene_5/kyogre_splash.png} | Bin .../rayquaza.png} | Bin .../rayquaza_tail.png} | Bin .../{hush_ring.bin => scene_5/ring.bin} | Bin .../{hush_ring.png => scene_5/ring.png} | Bin .../ring_map.bin} | Bin graphics_file_rules.mk | 12 +- include/graphics.h | 4 +- include/rayquaza_scene.h | 13 +- include/rom_8011DC0.h | 4 - src/contest_painting.c | 13 +- src/data/graphics/rayquaza_scene.h | 127 +++++---- src/field_specials.c | 4 +- src/rayquaza_scene.c | 244 +++++++++++------- src/start_menu.c | 1 - src/trade.c | 1 - 54 files changed, 225 insertions(+), 206 deletions(-) rename graphics/rayquaza_scene/{ => scene_1}/clouds.pal (100%) rename graphics/rayquaza_scene/{ => scene_1}/clouds.png (100%) rename graphics/rayquaza_scene/{ => scene_1}/clouds1.bin (100%) rename graphics/rayquaza_scene/{ => scene_1}/clouds2.bin (100%) rename graphics/rayquaza_scene/{ => scene_1}/clouds3.bin (100%) rename graphics/rayquaza_scene/{ => scene_1}/groudon.png (100%) rename graphics/rayquaza_scene/{ => scene_1}/groudon_claw.png (100%) rename graphics/rayquaza_scene/{ => scene_1}/groudon_shoulder.png (100%) rename graphics/rayquaza_scene/{ => scene_1}/kyogre.png (100%) rename graphics/rayquaza_scene/{ => scene_1}/kyogre_fin.png (100%) rename graphics/rayquaza_scene/{ => scene_1}/kyogre_shoulder.png (100%) rename graphics/rayquaza_scene/{overcast.bin => scene_2/bg.bin} (100%) rename graphics/rayquaza_scene/{overcast.png => scene_2/bg.png} (100%) rename graphics/rayquaza_scene/{ => scene_2}/rayquaza.bin (100%) rename graphics/rayquaza_scene/{ => scene_2}/rayquaza.png (100%) rename graphics/rayquaza_scene/{ => scene_2}/smoke.png (100%) rename graphics/rayquaza_scene/{overcast2.bin => scene_3/bg.bin} (100%) rename graphics/rayquaza_scene/{overcast2.pal => scene_3/bg.pal} (100%) rename graphics/rayquaza_scene/{overcast2.png => scene_3/bg.png} (100%) rename graphics/rayquaza_scene/{rayquaza_light.bin => scene_3/light.bin} (100%) rename graphics/rayquaza_scene/{rayquaza_light.png => scene_3/light.png} (100%) rename graphics/rayquaza_scene/{rayquaza_fly1.png => scene_3/rayquaza.png} (100%) rename graphics/rayquaza_scene/{ => scene_3}/rayquaza_tail.png (100%) rename graphics/rayquaza_scene/{chase_bg.bin => scene_4/bg.bin} (100%) rename graphics/rayquaza_scene/{chase.pal => scene_4/bg.pal} (100%) rename graphics/rayquaza_scene/{chase_bg.png => scene_4/bg.png} (100%) rename graphics/rayquaza_scene/{rayquaza_chase.bin => scene_4/rayquaza.bin} (100%) rename graphics/rayquaza_scene/{rayquaza_chase.png => scene_4/rayquaza.png} (100%) rename graphics/rayquaza_scene/{rayquaza_chase2.bin => scene_4/rayquaza2.bin} (100%) rename graphics/rayquaza_scene/{chase_streaks.bin => scene_4/streaks.bin} (100%) rename graphics/rayquaza_scene/{chase_streaks.png => scene_4/streaks.png} (100%) rename graphics/rayquaza_scene/{hush_bg.bin => scene_5/bg.bin} (100%) rename graphics/rayquaza_scene/{hush_bg.pal => scene_5/bg.pal} (100%) rename graphics/rayquaza_scene/{hush_bg.png => scene_5/bg.png} (100%) rename graphics/rayquaza_scene/{groudon_left.png => scene_5/groudon.png} (100%) rename graphics/rayquaza_scene/{ => scene_5}/groudon_tail.png (100%) rename graphics/rayquaza_scene/{kyogre_right.png => scene_5/kyogre.png} (100%) rename graphics/rayquaza_scene/{splash.png => scene_5/kyogre_splash.png} (100%) rename graphics/rayquaza_scene/{rayquaza_hover.png => scene_5/rayquaza.png} (100%) rename graphics/rayquaza_scene/{rayquaza_flyin.png => scene_5/rayquaza_tail.png} (100%) rename graphics/rayquaza_scene/{hush_ring.bin => scene_5/ring.bin} (100%) rename graphics/rayquaza_scene/{hush_ring.png => scene_5/ring.png} (100%) rename graphics/rayquaza_scene/{hush_ring_map.bin => scene_5/ring_map.bin} (100%) delete mode 100644 include/rom_8011DC0.h diff --git a/data/maps/SootopolisCity/scripts.inc b/data/maps/SootopolisCity/scripts.inc index 2979f104de..97081c2508 100644 --- a/data/maps/SootopolisCity/scripts.inc +++ b/data/maps/SootopolisCity/scripts.inc @@ -235,7 +235,7 @@ SootopolisCity_EventScript_LegendariesSceneFromPokeCenter:: @ 81E5946 fadescreenspeed FADE_TO_BLACK, 8 setweather WEATHER_ABNORMAL doweather - setvar VAR_0x8004, 0 + setvar VAR_0x8004, FALSE @ Just do Groudon/Kyogre fight scene special Script_DoRayquazaScene waitstate applymovement LOCALID_KYOGRE, Common_Movement_WalkInPlaceFastestLeft @@ -335,7 +335,7 @@ SootopolisCity_EventScript_LegendariesSceneFromDive:: @ 81E5A82 fadescreenspeed FADE_TO_BLACK, 8 setweather WEATHER_ABNORMAL doweather - setvar VAR_0x8004, 0 + setvar VAR_0x8004, FALSE @ Just do Groudon/Kyogre fight scene special Script_DoRayquazaScene waitstate applymovement LOCALID_KYOGRE, Common_Movement_WalkInPlaceFastestLeft @@ -528,7 +528,7 @@ SootopolisCity_EventScript_RayquazaSceneFromPokeCenter:: @ 81E5C1E removeobject LOCALID_GROUDON removeobject LOCALID_KYOGRE addobject LOCALID_RAYQUAZA - setvar VAR_0x8004, 1 + setvar VAR_0x8004, TRUE special Script_DoRayquazaScene waitstate playse SE_T_KAMI @@ -581,7 +581,7 @@ SootopolisCity_EventScript_RayquazaSceneFromDive:: @ 81E5CCE removeobject LOCALID_GROUDON removeobject LOCALID_KYOGRE addobject LOCALID_RAYQUAZA - setvar VAR_0x8004, 1 + setvar VAR_0x8004, TRUE special Script_DoRayquazaScene waitstate special SpawnCameraObject diff --git a/graphics/rayquaza_scene/clouds.pal b/graphics/rayquaza_scene/scene_1/clouds.pal similarity index 100% rename from graphics/rayquaza_scene/clouds.pal rename to graphics/rayquaza_scene/scene_1/clouds.pal diff --git a/graphics/rayquaza_scene/clouds.png b/graphics/rayquaza_scene/scene_1/clouds.png similarity index 100% rename from graphics/rayquaza_scene/clouds.png rename to graphics/rayquaza_scene/scene_1/clouds.png diff --git a/graphics/rayquaza_scene/clouds1.bin b/graphics/rayquaza_scene/scene_1/clouds1.bin similarity index 100% rename from graphics/rayquaza_scene/clouds1.bin rename to graphics/rayquaza_scene/scene_1/clouds1.bin diff --git a/graphics/rayquaza_scene/clouds2.bin b/graphics/rayquaza_scene/scene_1/clouds2.bin similarity index 100% rename from graphics/rayquaza_scene/clouds2.bin rename to graphics/rayquaza_scene/scene_1/clouds2.bin diff --git a/graphics/rayquaza_scene/clouds3.bin b/graphics/rayquaza_scene/scene_1/clouds3.bin similarity index 100% rename from graphics/rayquaza_scene/clouds3.bin rename to graphics/rayquaza_scene/scene_1/clouds3.bin diff --git a/graphics/rayquaza_scene/groudon.png b/graphics/rayquaza_scene/scene_1/groudon.png similarity index 100% rename from graphics/rayquaza_scene/groudon.png rename to graphics/rayquaza_scene/scene_1/groudon.png diff --git a/graphics/rayquaza_scene/groudon_claw.png b/graphics/rayquaza_scene/scene_1/groudon_claw.png similarity index 100% rename from graphics/rayquaza_scene/groudon_claw.png rename to graphics/rayquaza_scene/scene_1/groudon_claw.png diff --git a/graphics/rayquaza_scene/groudon_shoulder.png b/graphics/rayquaza_scene/scene_1/groudon_shoulder.png similarity index 100% rename from graphics/rayquaza_scene/groudon_shoulder.png rename to graphics/rayquaza_scene/scene_1/groudon_shoulder.png diff --git a/graphics/rayquaza_scene/kyogre.png b/graphics/rayquaza_scene/scene_1/kyogre.png similarity index 100% rename from graphics/rayquaza_scene/kyogre.png rename to graphics/rayquaza_scene/scene_1/kyogre.png diff --git a/graphics/rayquaza_scene/kyogre_fin.png b/graphics/rayquaza_scene/scene_1/kyogre_fin.png similarity index 100% rename from graphics/rayquaza_scene/kyogre_fin.png rename to graphics/rayquaza_scene/scene_1/kyogre_fin.png diff --git a/graphics/rayquaza_scene/kyogre_shoulder.png b/graphics/rayquaza_scene/scene_1/kyogre_shoulder.png similarity index 100% rename from graphics/rayquaza_scene/kyogre_shoulder.png rename to graphics/rayquaza_scene/scene_1/kyogre_shoulder.png diff --git a/graphics/rayquaza_scene/overcast.bin b/graphics/rayquaza_scene/scene_2/bg.bin similarity index 100% rename from graphics/rayquaza_scene/overcast.bin rename to graphics/rayquaza_scene/scene_2/bg.bin diff --git a/graphics/rayquaza_scene/overcast.png b/graphics/rayquaza_scene/scene_2/bg.png similarity index 100% rename from graphics/rayquaza_scene/overcast.png rename to graphics/rayquaza_scene/scene_2/bg.png diff --git a/graphics/rayquaza_scene/rayquaza.bin b/graphics/rayquaza_scene/scene_2/rayquaza.bin similarity index 100% rename from graphics/rayquaza_scene/rayquaza.bin rename to graphics/rayquaza_scene/scene_2/rayquaza.bin diff --git a/graphics/rayquaza_scene/rayquaza.png b/graphics/rayquaza_scene/scene_2/rayquaza.png similarity index 100% rename from graphics/rayquaza_scene/rayquaza.png rename to graphics/rayquaza_scene/scene_2/rayquaza.png diff --git a/graphics/rayquaza_scene/smoke.png b/graphics/rayquaza_scene/scene_2/smoke.png similarity index 100% rename from graphics/rayquaza_scene/smoke.png rename to graphics/rayquaza_scene/scene_2/smoke.png diff --git a/graphics/rayquaza_scene/overcast2.bin b/graphics/rayquaza_scene/scene_3/bg.bin similarity index 100% rename from graphics/rayquaza_scene/overcast2.bin rename to graphics/rayquaza_scene/scene_3/bg.bin diff --git a/graphics/rayquaza_scene/overcast2.pal b/graphics/rayquaza_scene/scene_3/bg.pal similarity index 100% rename from graphics/rayquaza_scene/overcast2.pal rename to graphics/rayquaza_scene/scene_3/bg.pal diff --git a/graphics/rayquaza_scene/overcast2.png b/graphics/rayquaza_scene/scene_3/bg.png similarity index 100% rename from graphics/rayquaza_scene/overcast2.png rename to graphics/rayquaza_scene/scene_3/bg.png diff --git a/graphics/rayquaza_scene/rayquaza_light.bin b/graphics/rayquaza_scene/scene_3/light.bin similarity index 100% rename from graphics/rayquaza_scene/rayquaza_light.bin rename to graphics/rayquaza_scene/scene_3/light.bin diff --git a/graphics/rayquaza_scene/rayquaza_light.png b/graphics/rayquaza_scene/scene_3/light.png similarity index 100% rename from graphics/rayquaza_scene/rayquaza_light.png rename to graphics/rayquaza_scene/scene_3/light.png diff --git a/graphics/rayquaza_scene/rayquaza_fly1.png b/graphics/rayquaza_scene/scene_3/rayquaza.png similarity index 100% rename from graphics/rayquaza_scene/rayquaza_fly1.png rename to graphics/rayquaza_scene/scene_3/rayquaza.png diff --git a/graphics/rayquaza_scene/rayquaza_tail.png b/graphics/rayquaza_scene/scene_3/rayquaza_tail.png similarity index 100% rename from graphics/rayquaza_scene/rayquaza_tail.png rename to graphics/rayquaza_scene/scene_3/rayquaza_tail.png diff --git a/graphics/rayquaza_scene/chase_bg.bin b/graphics/rayquaza_scene/scene_4/bg.bin similarity index 100% rename from graphics/rayquaza_scene/chase_bg.bin rename to graphics/rayquaza_scene/scene_4/bg.bin diff --git a/graphics/rayquaza_scene/chase.pal b/graphics/rayquaza_scene/scene_4/bg.pal similarity index 100% rename from graphics/rayquaza_scene/chase.pal rename to graphics/rayquaza_scene/scene_4/bg.pal diff --git a/graphics/rayquaza_scene/chase_bg.png b/graphics/rayquaza_scene/scene_4/bg.png similarity index 100% rename from graphics/rayquaza_scene/chase_bg.png rename to graphics/rayquaza_scene/scene_4/bg.png diff --git a/graphics/rayquaza_scene/rayquaza_chase.bin b/graphics/rayquaza_scene/scene_4/rayquaza.bin similarity index 100% rename from graphics/rayquaza_scene/rayquaza_chase.bin rename to graphics/rayquaza_scene/scene_4/rayquaza.bin diff --git a/graphics/rayquaza_scene/rayquaza_chase.png b/graphics/rayquaza_scene/scene_4/rayquaza.png similarity index 100% rename from graphics/rayquaza_scene/rayquaza_chase.png rename to graphics/rayquaza_scene/scene_4/rayquaza.png diff --git a/graphics/rayquaza_scene/rayquaza_chase2.bin b/graphics/rayquaza_scene/scene_4/rayquaza2.bin similarity index 100% rename from graphics/rayquaza_scene/rayquaza_chase2.bin rename to graphics/rayquaza_scene/scene_4/rayquaza2.bin diff --git a/graphics/rayquaza_scene/chase_streaks.bin b/graphics/rayquaza_scene/scene_4/streaks.bin similarity index 100% rename from graphics/rayquaza_scene/chase_streaks.bin rename to graphics/rayquaza_scene/scene_4/streaks.bin diff --git a/graphics/rayquaza_scene/chase_streaks.png b/graphics/rayquaza_scene/scene_4/streaks.png similarity index 100% rename from graphics/rayquaza_scene/chase_streaks.png rename to graphics/rayquaza_scene/scene_4/streaks.png diff --git a/graphics/rayquaza_scene/hush_bg.bin b/graphics/rayquaza_scene/scene_5/bg.bin similarity index 100% rename from graphics/rayquaza_scene/hush_bg.bin rename to graphics/rayquaza_scene/scene_5/bg.bin diff --git a/graphics/rayquaza_scene/hush_bg.pal b/graphics/rayquaza_scene/scene_5/bg.pal similarity index 100% rename from graphics/rayquaza_scene/hush_bg.pal rename to graphics/rayquaza_scene/scene_5/bg.pal diff --git a/graphics/rayquaza_scene/hush_bg.png b/graphics/rayquaza_scene/scene_5/bg.png similarity index 100% rename from graphics/rayquaza_scene/hush_bg.png rename to graphics/rayquaza_scene/scene_5/bg.png diff --git a/graphics/rayquaza_scene/groudon_left.png b/graphics/rayquaza_scene/scene_5/groudon.png similarity index 100% rename from graphics/rayquaza_scene/groudon_left.png rename to graphics/rayquaza_scene/scene_5/groudon.png diff --git a/graphics/rayquaza_scene/groudon_tail.png b/graphics/rayquaza_scene/scene_5/groudon_tail.png similarity index 100% rename from graphics/rayquaza_scene/groudon_tail.png rename to graphics/rayquaza_scene/scene_5/groudon_tail.png diff --git a/graphics/rayquaza_scene/kyogre_right.png b/graphics/rayquaza_scene/scene_5/kyogre.png similarity index 100% rename from graphics/rayquaza_scene/kyogre_right.png rename to graphics/rayquaza_scene/scene_5/kyogre.png diff --git a/graphics/rayquaza_scene/splash.png b/graphics/rayquaza_scene/scene_5/kyogre_splash.png similarity index 100% rename from graphics/rayquaza_scene/splash.png rename to graphics/rayquaza_scene/scene_5/kyogre_splash.png diff --git a/graphics/rayquaza_scene/rayquaza_hover.png b/graphics/rayquaza_scene/scene_5/rayquaza.png similarity index 100% rename from graphics/rayquaza_scene/rayquaza_hover.png rename to graphics/rayquaza_scene/scene_5/rayquaza.png diff --git a/graphics/rayquaza_scene/rayquaza_flyin.png b/graphics/rayquaza_scene/scene_5/rayquaza_tail.png similarity index 100% rename from graphics/rayquaza_scene/rayquaza_flyin.png rename to graphics/rayquaza_scene/scene_5/rayquaza_tail.png diff --git a/graphics/rayquaza_scene/hush_ring.bin b/graphics/rayquaza_scene/scene_5/ring.bin similarity index 100% rename from graphics/rayquaza_scene/hush_ring.bin rename to graphics/rayquaza_scene/scene_5/ring.bin diff --git a/graphics/rayquaza_scene/hush_ring.png b/graphics/rayquaza_scene/scene_5/ring.png similarity index 100% rename from graphics/rayquaza_scene/hush_ring.png rename to graphics/rayquaza_scene/scene_5/ring.png diff --git a/graphics/rayquaza_scene/hush_ring_map.bin b/graphics/rayquaza_scene/scene_5/ring_map.bin similarity index 100% rename from graphics/rayquaza_scene/hush_ring_map.bin rename to graphics/rayquaza_scene/scene_5/ring_map.bin diff --git a/graphics_file_rules.mk b/graphics_file_rules.mk index 019f382eb8..630aaa3fc1 100644 --- a/graphics_file_rules.mk +++ b/graphics_file_rules.mk @@ -457,23 +457,23 @@ $(TYPESGFXDIR)/move_types.gbapal: $(TYPESGFXDIR)/move_types_1.gbapal \ $(INTERFACEGFXDIR)/bag_screen.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 53 -$(RAYQUAZAGFXDIR)/rayquaza.8bpp: %.8bpp: %.png +$(RAYQUAZAGFXDIR)/scene_2/rayquaza.8bpp: %.8bpp: %.png $(GFX) $< $@ -num_tiles 227 -$(RAYQUAZAGFXDIR)/overcast.4bpp: %.4bpp: %.png +$(RAYQUAZAGFXDIR)/scene_2/bg.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 313 -$(RAYQUAZAGFXDIR)/rayquaza_fly1.4bpp: %.4bpp: %.png +$(RAYQUAZAGFXDIR)/scene_3/rayquaza.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 124 -$(RAYQUAZAGFXDIR)/rayquaza_tail_fix.4bpp: $(RAYQUAZAGFXDIR)/rayquaza_tail.4bpp +$(RAYQUAZAGFXDIR)/scene_3/rayquaza_tail_fix.4bpp: $(RAYQUAZAGFXDIR)/scene_3/rayquaza_tail.4bpp cp $< $@ head -c 12 /dev/zero >> $@ -$(RAYQUAZAGFXDIR)/chase_streaks.4bpp: %.4bpp: %.png +$(RAYQUAZAGFXDIR)/scene_4/streaks.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 19 -$(RAYQUAZAGFXDIR)/rayquaza_chase.4bpp: %.4bpp: %.png +$(RAYQUAZAGFXDIR)/scene_4/rayquaza.4bpp: %.4bpp: %.png $(GFX) $< $@ -num_tiles 155 graphics/picture_frame/frame5.4bpp: %.4bpp: %.png diff --git a/include/graphics.h b/include/graphics.h index 4c98bee471..1c8a52b699 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -3310,8 +3310,8 @@ extern const u32 gBerryTag_Pal[]; // rayquaza scene gfx extern const u32 gRaySceneGroudon_Gfx[]; -extern const u32 gRaySceneGroudon2_Gfx[]; -extern const u32 gRaySceneGroudon3_Gfx[]; +extern const u32 gRaySceneGroudonShoulder_Gfx[]; +extern const u32 gRaySceneGroudonClaw_Gfx[]; extern const u32 gRaySceneKyogre_Gfx[]; extern const u32 gRaySceneKyogre2_Gfx[]; extern const u32 gRaySceneKyogre3_Gfx[]; diff --git a/include/rayquaza_scene.h b/include/rayquaza_scene.h index fe66b3df06..5aa21981eb 100644 --- a/include/rayquaza_scene.h +++ b/include/rayquaza_scene.h @@ -1,17 +1,6 @@ #ifndef GUARD_RAYQUAZA_SCENE_H #define GUARD_RAYQUAZA_SCENE_H -void DoRayquazaScene(u8 animId, bool8 onlyOneAnim, void (*callback)(void)); - -enum -{ - RAY_ANIM_DUO_FIGHT_PRE, - RAY_ANIM_DUO_FIGHT, - RAY_ANIM_TAKES_FLIGHT, - RAY_ANIM_DESCENDS, - RAY_ANIM_CHARGES, - RAY_ANIM_CHACES_AWAY, - RAY_ANIM_END -}; +void DoRayquazaScene(u8 animId, bool8 endEarly, void (*callback)(void)); #endif // GUARD_RAYQUAZA_SCENE_H diff --git a/include/rom_8011DC0.h b/include/rom_8011DC0.h deleted file mode 100644 index ee73973201..0000000000 --- a/include/rom_8011DC0.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef GUARD_rom_8011DC0_H -#define GUARD_rom_8011DC0_H - -#endif //GUARD_rom_8011DC0_H diff --git a/src/contest_painting.c b/src/contest_painting.c index 5dd4a70a53..f4d0ac6bf9 100644 --- a/src/contest_painting.c +++ b/src/contest_painting.c @@ -384,7 +384,7 @@ static void InitContestMonPixels(u16 species, u8 whichSprite) } } -#ifdef NONMATCHING +//#ifdef NONMATCHING // functionally equivalent. static void _InitContestMonPixels(u8 *spriteGfx, u16 *palette, u16 (*destPixels)[64][64]) { @@ -399,23 +399,22 @@ static void _InitContestMonPixels(u8 *spriteGfx, u16 *palette, u16 (*destPixels) { for (pixelX = 0; pixelX < 8; pixelX++) { - int offset = 32 * (8 * tileY + tileX) + (pixelY * 4 + pixelX / 2); - colorIndex = spriteGfx[offset]; + colorIndex = spriteGfx[(((tileY * 8) + tileX) * 32) + (pixelY << 2) + (pixelX >> 1)]; if (pixelX & 1) colorIndex >>= 4; else colorIndex &= 0xF; if (colorIndex == 0) // transparent pixel - (*destPixels)[8 * tileY + pixelY][tileX * 8 + pixelX] = 0x8000; + (*destPixels)[tileY * 8 + pixelY][tileX * 8 + pixelX] = 0x8000; else - (*destPixels)[8 * tileY + pixelY][tileX * 8 + pixelX] = palette[colorIndex]; + (*destPixels)[tileY * 8 + pixelY][tileX * 8 + pixelX] = palette[colorIndex]; } } } } } -#else +/*#else NAKED static void _InitContestMonPixels(u8 *spriteGfx, u16 *palette, u16 (*destPixels)[64][64]) { @@ -517,7 +516,7 @@ _081303F8:\n\ pop {r0}\n\ bx r0"); } -#endif +#endif*/ #define VRAM_PICTURE_DATA(x, y) (((u16 *)(BG_SCREEN_ADDR(12)))[(y) * 32 + (x)]) diff --git a/src/data/graphics/rayquaza_scene.h b/src/data/graphics/rayquaza_scene.h index d0269980c5..508b83f1a6 100644 --- a/src/data/graphics/rayquaza_scene.h +++ b/src/data/graphics/rayquaza_scene.h @@ -1,73 +1,62 @@ -const u32 gRaySceneGroudon_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/groudon.4bpp.lz"); -const u32 gRaySceneGroudon2_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/groudon_shoulder.4bpp.lz"); -const u32 gRaySceneGroudon3_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/groudon_claw.4bpp.lz"); +// Scene 1 (RAY_ANIM_DUO_FIGHT / RAY_ANIM_DUO_FIGHT_PRE) +const u32 gRaySceneGroudon_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/groudon.4bpp.lz"); +const u32 gRaySceneGroudonShoulder_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/groudon_shoulder.4bpp.lz"); +const u32 gRaySceneGroudonClaw_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/groudon_claw.4bpp.lz"); +const u32 gRaySceneKyogre_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/kyogre.4bpp.lz"); +const u32 gRaySceneKyogre2_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/kyogre_shoulder.4bpp.lz"); +const u32 gRaySceneKyogre3_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/kyogre_fin.4bpp.lz"); +const u32 gRaySceneGroudon_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/groudon.gbapal.lz"); +const u32 gRaySceneKyogre_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/kyogre.gbapal.lz"); +const u32 gRaySceneClouds_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds.4bpp.lz"); +const u32 gRaySceneClouds_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds.gbapal.lz"); // pal 1 clouds, pal 2 rain +const u32 gRaySceneClouds1_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds1.bin.lz"); +const u32 gRaySceneClouds2_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds2.bin.lz"); +const u32 gRaySceneClouds3_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds3.bin.lz"); -const u32 gRaySceneKyogre_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/kyogre.4bpp.lz"); -const u32 gRaySceneKyogre2_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/kyogre_shoulder.4bpp.lz"); -const u32 gRaySceneKyogre3_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/kyogre_fin.4bpp.lz"); +// Scene 2 (RAY_ANIM_TAKES_FLIGHT) +const u32 gRaySceneSmoke_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/smoke.4bpp.lz"); +const u32 gRaySceneSmoke_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/smoke.gbapal.lz"); +const u32 gRaySceneRayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/rayquaza.8bpp.lz"); +const u32 gRaySceneRayquaza_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/rayquaza.gbapal.lz"); +const u32 gRaySceneRayquaza_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/rayquaza.bin.lz"); +const u32 gRaySceneOvercast_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/bg.4bpp.lz"); // uses pal 2 of gRaySceneRayquaza_Pal +const u32 gRaySceneOvercast_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/bg.bin.lz"); -const u32 gRaySceneGroudon_Pal[] = INCBIN_U32("graphics/rayquaza_scene/groudon.gbapal.lz"); -const u32 gRaySceneKyogre_Pal[] = INCBIN_U32("graphics/rayquaza_scene/kyogre.gbapal.lz"); +// Scene 3 (RAY_ANIM_DESCENDS) +const u32 gRaySceneRayquazaFly1_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/rayquaza.4bpp.lz"); +// for some reason there are an extra 0xC bytes at the end of the original 4bpp, so in order to produce the correct lz, +// we have to cat the bytes at the end with a make rule. not sure why those bytes are there, it may have been a bug in Game Freak's software. +const u32 gRaySceneRayquazaTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/rayquaza_tail_fix.4bpp.lz"); +const u32 gRaySceneOvercast2_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/bg.4bpp.lz"); +const u32 gRaySceneRayquazaLight_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/light.4bpp.lz"); // uses pal 2 of gRaySceneOvercast2_Pal +const u32 gRaySceneOvercast2_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/bg.gbapal.lz"); +const u32 gRaySceneOvercast2_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/bg.bin.lz"); +const u32 gRaySceneRayquazaLight_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/light.bin.lz"); -const u32 gRaySceneClouds_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/clouds.4bpp.lz"); -const u32 gRaySceneClouds_Pal[] = INCBIN_U32("graphics/rayquaza_scene/clouds.gbapal.lz"); // pal 1 clouds, pal 2 rain -const u32 gRaySceneClouds1_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/clouds1.bin.lz"); -const u32 gRaySceneClouds2_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/clouds2.bin.lz"); -const u32 gRaySceneClouds3_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/clouds3.bin.lz"); +// Scene 4 (RAY_ANIM_CHARGES) +const u32 gRaySceneChaseBg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/bg.4bpp.lz"); +const u32 gRaySceneChaseBg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/bg.bin.lz"); +const u32 gRaySceneChaseStreaks_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/streaks.4bpp.lz"); +const u32 gRaySceneChaseStreaks_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/streaks.bin.lz"); +const u32 gRaySceneRayquazaChase_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/rayquaza.4bpp.lz"); +const u32 gRayChaseRayquazaChase_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/rayquaza.bin.lz"); +const u32 gRayChaseRayquazaChase2_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/rayquaza2.bin.lz"); +const u32 gRaySceneChase_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/bg.gbapal.lz"); -const u32 gRaySceneSmoke_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/smoke.4bpp.lz"); -const u32 gRaySceneSmoke_Pal[] = INCBIN_U32("graphics/rayquaza_scene/smoke.gbapal.lz"); - -const u32 gRaySceneRayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/rayquaza.8bpp.lz"); -const u32 gRaySceneRayquaza_Pal[] = INCBIN_U32("graphics/rayquaza_scene/rayquaza.gbapal.lz"); -const u32 gRaySceneRayquaza_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/rayquaza.bin.lz"); - -const u32 gRaySceneOvercast_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/overcast.4bpp.lz"); // uses pal 2 of gRaySceneRayquaza_Pal -const u32 gRaySceneOvercast_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/overcast.bin.lz"); - -const u32 gRaySceneRayquazaFly1_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/rayquaza_fly1.4bpp.lz"); -const u32 gRaySceneRayquazaTail_Gfx[] = INCBIN_U32( "graphics/rayquaza_scene/rayquaza_tail_fix.4bpp.lz"); // for some reason there are an extra 0xC bytes at the end of the original 4bpp, so in order to produce the correct lz, we have to cat the bytes at the end with a make rule. not sure why those bytes are there, it may have been a bug in Game Freak's software. - -const u32 gRaySceneOvercast2_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/overcast2.4bpp.lz"); - -const u32 gRaySceneRayquazaLight_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/rayquaza_light.4bpp.lz"); // uses pal 2 of gRaySceneOvercast2_Pal - -const u32 gRaySceneOvercast2_Pal[] = INCBIN_U32("graphics/rayquaza_scene/overcast2.gbapal.lz"); -const u32 gRaySceneOvercast2_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/overcast2.bin.lz"); - -const u32 gRaySceneRayquazaLight_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/rayquaza_light.bin.lz"); - -const u32 gRaySceneChaseBg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/chase_bg.4bpp.lz"); -const u32 gRaySceneChaseBg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/chase_bg.bin.lz"); - -const u32 gRaySceneChaseStreaks_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/chase_streaks.4bpp.lz"); -const u32 gRaySceneChaseStreaks_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/chase_streaks.bin.lz"); - -const u32 gRaySceneRayquazaChase_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/rayquaza_chase.4bpp.lz"); -const u32 gRayChaseRayquazaChase_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/rayquaza_chase.bin.lz"); -const u32 gRayChaseRayquazaChase2_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/rayquaza_chase2.bin.lz"); - -const u32 gRaySceneChase_Pal[] = INCBIN_U32("graphics/rayquaza_scene/chase.gbapal.lz"); - -const u32 gRaySceneGroudonLeft_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/groudon_left.4bpp.lz"); -const u32 gRaySceneGroudonTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/groudon_tail.4bpp.lz"); - -const u32 gRaySceneKyogreRight_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/kyogre_right.4bpp.lz"); - -const u32 gRaySceneRayquazaHover_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/rayquaza_hover.4bpp.lz"); -const u32 gRaySceneRayquazaFlyIn_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/rayquaza_flyin.4bpp.lz"); - -const u32 gRaySceneSplash_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/splash.4bpp.lz"); - -const u32 gRaySceneGroudonLeft_Pal[] = INCBIN_U32("graphics/rayquaza_scene/groudon_left.gbapal.lz"); -const u32 gRaySceneKyogreRight_Pal[] = INCBIN_U32("graphics/rayquaza_scene/kyogre_right.gbapal.lz"); -const u32 gRaySceneRayquazaHover_Pal[] = INCBIN_U32("graphics/rayquaza_scene/rayquaza_hover.gbapal.lz"); - -const u32 gRaySceneSplash_Pal[] = INCBIN_U32("graphics/rayquaza_scene/splash.gbapal.lz"); - -const u32 gRaySceneHushBg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/hush_bg.4bpp.lz"); -const u32 gRaySceneHushRing_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/hush_ring.8bpp.lz"); -const u32 gRaySceneHushBg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/hush_bg.bin.lz"); -const u32 gRaySceneHushRing_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/hush_ring.bin.lz"); -const u32 gRaySceneHushRing_Map[] = INCBIN_U32("graphics/rayquaza_scene/hush_ring_map.bin.lz"); -const u32 gRaySceneHushBg_Pal[] = INCBIN_U32("graphics/rayquaza_scene/hush_bg.gbapal.lz"); +// Scene 5 (RAY_ANIM_CHASES_AWAY) +const u32 gRaySceneGroudonLeft_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/groudon.4bpp.lz"); +const u32 gRaySceneGroudonTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/groudon_tail.4bpp.lz"); +const u32 gRaySceneKyogreRight_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/kyogre.4bpp.lz"); +const u32 gRaySceneRayquazaHover_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/rayquaza.4bpp.lz"); +const u32 gRaySceneRayquazaFlyIn_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/rayquaza_tail.4bpp.lz"); +const u32 gRaySceneSplash_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/kyogre_splash.4bpp.lz"); +const u32 gRaySceneGroudonLeft_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/groudon.gbapal.lz"); +const u32 gRaySceneKyogreRight_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/kyogre.gbapal.lz"); +const u32 gRaySceneRayquazaHover_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/rayquaza.gbapal.lz"); +const u32 gRaySceneSplash_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/kyogre_splash.gbapal.lz"); +const u32 gRaySceneHushBg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/bg.4bpp.lz"); +const u32 gRaySceneHushRing_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/ring.8bpp.lz"); +const u32 gRaySceneHushBg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/bg.bin.lz"); +const u32 gRaySceneHushRing_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/ring.bin.lz"); +const u32 gRaySceneHushRing_Map[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/ring_map.bin.lz"); +const u32 gRaySceneHushBg_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/bg.gbapal.lz"); diff --git a/src/field_specials.c b/src/field_specials.c index 7c6ef37d7b..ebb36cbead 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -3888,12 +3888,14 @@ static void Task_LinkRetireStatusWithBattleTowerPartner(u8 taskId) void Script_DoRayquazaScene(void) { - if (gSpecialVar_0x8004 == 0) + if (!gSpecialVar_0x8004) { + // Groudon/Kyogre fight scene DoRayquazaScene(0, TRUE, CB2_ReturnToFieldContinueScriptPlayMapMusic); } else { + // Rayquaza arrives scene DoRayquazaScene(1, FALSE, CB2_ReturnToFieldContinueScriptPlayMapMusic); } } diff --git a/src/rayquaza_scene.c b/src/rayquaza_scene.c index 986a2d3a20..7490668d22 100644 --- a/src/rayquaza_scene.c +++ b/src/rayquaza_scene.c @@ -18,84 +18,129 @@ #include "constants/rgb.h" #include "random.h" -struct RaySceneStruct +/* + 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) + + Notably this is re-used to show the Groudon/Kyogre fight when the player first arrives + in Sootopolis during the conflict, which uses a shortened version of the first scene + This is indicated by the endEarly argument to DoRayquazaScene +*/ + +enum { - MainCallback callback; - u8 tilemapBuffers[4][0x800]; - u16 field_2004; // set but unused - u8 animId; - bool8 onlyOneAnim; - s16 field_2008; - s16 field_200A; - u8 unusedFields[12]; // completely unused + 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 }; -// EWRAM vars -static EWRAM_DATA struct RaySceneStruct *sRayScene = NULL; +#define GFXTAG_GROUDON 30505 +#define GFXTAG_GROUDON_SHOULDER 30506 +#define GFXTAG_GROUDON_CLAW 30507 +#define GFXTAG_KYOGRE1 30508 +#define GFXTAG_KYOGRE2 30509 +#define GFXTAG_KYOGRE3 30510 +#define GFXTAG_SMOKE 30555 +#define GFXTAG_GROUDON_SIDE 30565 + +#define PALTAG_GROUDON 30505 +#define PALTAG_KYOGRE 30508 +#define PALTAG_SMOKE 30555 + +struct RayquazaScene +{ + MainCallback exitCallback; + u8 tilemapBuffers[4][BG_SCREEN_SIZE]; + u16 unk; // never read + u8 animId; + bool8 endEarly; + s16 field_2008; + s16 field_200A; + u8 unused[12]; +}; + +static EWRAM_DATA struct RayquazaScene *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); static void CB2_InitRayquazaScene(void); static void CB2_RayquazaScene(void); +static void Task_EndAfterFadeScreen(u8 taskId); + +// RAY_ANIM_DUO_FIGHT_PRE / RAY_ANIM_DUO_FIGHT +static void Task_DuoFightAnim(u8 taskId); +static void Task_HandleDuoFight(u8 taskId); +static void Task_DuoFightEnd(u8 taskId); +static void DuoFightEnd(u8 taskId, s8 palDelay); +static void sub_81D7228(u8 taskId); +static void sub_81D752C(u8 taskId); 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); + +// RAY_ANIM_TAKES_FLIGHT +static void Task_RayTakesFlightAnim(u8 taskId); +static void Task_HandleRayTakesFlight(u8 taskId); +static void Task_RayTakesFlightEnd(u8 taskId); +static void sub_81D81A4(u8 taskId); +static void sub_81D8260(struct Sprite *sprite); + +// RAY_ANIM_DESCENDS +static void Task_RayDescendsAnim(u8 taskId); +static void Task_HandleRayDescends(u8 taskId); +static void Task_RayDescendsEnd(u8 taskId); +static void sub_81D874C(struct Sprite *sprite); static u8 sub_81D86CC(void); -static void DuoFightEnd(u8 taskId, s8 palDelay); + +// RAY_ANIM_CHARGES +static void Task_RayChargesAnim(u8 taskId); +static void Task_HandleRayCharges(u8 taskId); +static void Task_RayChargesEnd(u8 taskId); +static void sub_81D8AD8(u8 taskId); +static void sub_81D8B2C(u8 taskId); +static void sub_81D8BB4(void); + +// RAY_ANIM_CHASES_AWAY +static void Task_RayChasesAwayAnim(u8 taskId); +static void Task_HandleRayChasesAway(u8 taskId); +static void Task_RayChasesAwayEnd(u8 taskId); +static void sub_81D8FB0(u8 taskId); +static void sub_81D94D4(u8 taskId); +static void sub_81D93D8(u8 taskId); +static void sub_81D90A8(u8 taskId); +static void sub_81D98B4(u8 taskId); +static void sub_81D9420(struct Sprite *sprite); +static void sub_81D97E0(struct Sprite *sprite); +static void sub_81D9528(struct Sprite *sprite); +static void sub_81D961C(struct Sprite *sprite); +static void sub_81D9338(struct Sprite *sprite); static void sub_81D9868(struct Sprite *sprite, u8 animNum, s16 x, s16 y); -// const rom data 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 = @@ -260,8 +305,8 @@ static const union AnimCmd *const sSpriteAnimTable_862A724[] = static const struct SpriteTemplate sUnknown_0862A72C = { - .tileTag = 30505, - .paletteTag = 30505, + .tileTag = GFXTAG_GROUDON, + .paletteTag = PALTAG_GROUDON, .oam = &sOamData_862A6BC, .anims = sSpriteAnimTable_862A724, .images = NULL, @@ -282,8 +327,8 @@ static const union AnimCmd *const sSpriteAnimTable_862A74C[] = static const struct SpriteTemplate sUnknown_0862A750 = { - .tileTag = 30506, - .paletteTag = 30505, + .tileTag = GFXTAG_GROUDON_SHOULDER, + .paletteTag = PALTAG_GROUDON, .oam = &sOamData_862A6C4, .anims = sSpriteAnimTable_862A74C, .images = NULL, @@ -304,8 +349,8 @@ static const union AnimCmd *const sSpriteAnimTable_862A770[] = static const struct SpriteTemplate sUnknown_0862A774 = { - .tileTag = 30507, - .paletteTag = 30505, + .tileTag = GFXTAG_GROUDON_CLAW, + .paletteTag = PALTAG_GROUDON, .oam = &sOamData_862A6CC, .anims = sSpriteAnimTable_862A770, .images = NULL, @@ -391,8 +436,8 @@ static const union AnimCmd *const sSpriteAnimTable_862A7F8[] = static const struct SpriteTemplate sUnknown_0862A81C = { - .tileTag = 30508, - .paletteTag = 30508, + .tileTag = GFXTAG_KYOGRE1, + .paletteTag = PALTAG_KYOGRE, .oam = &sOamData_862A6D4, .anims = sSpriteAnimTable_862A7F8, .images = NULL, @@ -416,8 +461,8 @@ static const union AnimCmd *const sSpriteAnimTable_862A848[] = static const struct SpriteTemplate sUnknown_0862A84C = { - .tileTag = 30509, - .paletteTag = 30508, + .tileTag = GFXTAG_KYOGRE2, + .paletteTag = PALTAG_KYOGRE, .oam = &sOamData_862A6DC, .anims = sSpriteAnimTable_862A848, .images = NULL, @@ -427,8 +472,8 @@ static const struct SpriteTemplate sUnknown_0862A84C = static const struct SpriteTemplate sUnknown_0862A864 = { - .tileTag = 30510, - .paletteTag = 30508, + .tileTag = GFXTAG_KYOGRE3, + .paletteTag = PALTAG_KYOGRE, .oam = &sOamData_862A6C4, .anims = sSpriteAnimTable_862A74C, .images = NULL, @@ -500,18 +545,18 @@ static const union AnimCmd *const sSpriteAnimTable_862A8BC[] = static const struct CompressedSpriteSheet sUnknown_0862A8C4 = { - gRaySceneGroudon_Gfx, 0x3000, 30505 + gRaySceneGroudon_Gfx, 0x3000, GFXTAG_GROUDON }; static const struct CompressedSpritePalette sUnknown_0862A8CC = { - gRaySceneGroudon_Pal, 30505 + gRaySceneGroudon_Pal, PALTAG_GROUDON }; static const struct SpriteTemplate sUnknown_0862A8D4 = { - .tileTag = 30505, - .paletteTag = 30505, + .tileTag = GFXTAG_GROUDON, + .paletteTag = PALTAG_GROUDON, .oam = &sOamData_862A6BC, .anims = sSpriteAnimTable_862A8BC, .images = NULL, @@ -532,13 +577,13 @@ static const union AnimCmd *const sSpriteAnimTable_862A8F4[] = static const struct CompressedSpriteSheet sUnknown_0862A8F8 = { - gRaySceneGroudon2_Gfx, 0x200, 30506 + gRaySceneGroudonShoulder_Gfx, 0x200, GFXTAG_GROUDON_SHOULDER }; static const struct SpriteTemplate sUnknown_0862A900 = { - .tileTag = 30506, - .paletteTag = 30505, + .tileTag = GFXTAG_GROUDON_SHOULDER, + .paletteTag = PALTAG_GROUDON, .oam = &sOamData_862A6C4, .anims = sSpriteAnimTable_862A8F4, .images = NULL, @@ -559,13 +604,13 @@ static const union AnimCmd *const sSpriteAnimTable_862A920[] = static const struct CompressedSpriteSheet sUnknown_0862A924 = { - gRaySceneGroudon3_Gfx, 0x400, 30507 + gRaySceneGroudonClaw_Gfx, 0x400, GFXTAG_GROUDON_CLAW }; static const struct SpriteTemplate sUnknown_0862A92C = { - .tileTag = 30507, - .paletteTag = 30505, + .tileTag = GFXTAG_GROUDON_CLAW, + .paletteTag = PALTAG_GROUDON, .oam = &sOamData_862A6CC, .anims = sSpriteAnimTable_862A920, .images = NULL, @@ -651,18 +696,18 @@ static const union AnimCmd *const sSpriteAnimTable_862A9B0[] = static const struct CompressedSpriteSheet sUnknown_0862A9D4 = { - gRaySceneKyogre_Gfx, 0xF00, 30508 + gRaySceneKyogre_Gfx, 0xF00, GFXTAG_KYOGRE1 }; static const struct CompressedSpritePalette sUnknown_0862A9DC = { - gRaySceneKyogre_Pal, 30508 + gRaySceneKyogre_Pal, PALTAG_KYOGRE }; static const struct SpriteTemplate sUnknown_0862A9E4 = { - .tileTag = 30508, - .paletteTag = 30508, + .tileTag = GFXTAG_KYOGRE1, + .paletteTag = PALTAG_KYOGRE, .oam = &sOamData_862A6D4, .anims = sSpriteAnimTable_862A9B0, .images = NULL, @@ -686,13 +731,13 @@ static const union AnimCmd *const sSpriteAnimTable_862AA10[] = static const struct CompressedSpriteSheet sUnknown_0862AA14 = { - gRaySceneKyogre2_Gfx, 0xC0, 30509 + gRaySceneKyogre2_Gfx, 0xC0, GFXTAG_KYOGRE2 }; static const struct SpriteTemplate sUnknown_0862AA1C = { - .tileTag = 30509, - .paletteTag = 30508, + .tileTag = GFXTAG_KYOGRE2, + .paletteTag = PALTAG_KYOGRE, .oam = &sOamData_862A6DC, .anims = sSpriteAnimTable_862AA10, .images = NULL, @@ -702,13 +747,13 @@ static const struct SpriteTemplate sUnknown_0862AA1C = static const struct CompressedSpriteSheet sUnknown_0862AA34 = { - gRaySceneKyogre3_Gfx, 0x200, 30510 + gRaySceneKyogre3_Gfx, 0x200, GFXTAG_KYOGRE3 }; static const struct SpriteTemplate sUnknown_0862AA3C = { - .tileTag = 30510, - .paletteTag = 30508, + .tileTag = GFXTAG_KYOGRE3, + .paletteTag = PALTAG_KYOGRE, .oam = &sOamData_862A6C4, .anims = sSpriteAnimTable_862A8F4, .images = NULL, @@ -773,18 +818,18 @@ static const union AffineAnimCmd *const sSpriteAffineAnimTable_862AA8C[] = static const struct CompressedSpriteSheet sUnknown_0862AA90 = { - gRaySceneSmoke_Gfx, 0x100, 30555 + gRaySceneSmoke_Gfx, 0x100, GFXTAG_SMOKE }; static const struct CompressedSpritePalette sUnknown_0862AA98 = { - gRaySceneSmoke_Pal, 30555 + gRaySceneSmoke_Pal, PALTAG_SMOKE }; static const struct SpriteTemplate sUnknown_0862AAA0 = { - .tileTag = 30555, - .paletteTag = 30555, + .tileTag = GFXTAG_SMOKE, + .paletteTag = PALTAG_SMOKE, .oam = &sOamData_862A6D4, .anims = sSpriteAnimTable_862AA68, .images = NULL, @@ -1086,7 +1131,7 @@ static const union AnimCmd *const sSpriteAnimTable_862AC24[] = static const struct CompressedSpriteSheet sUnknown_0862AC28 = { - gRaySceneGroudonLeft_Gfx, 0x1800, 30565 + gRaySceneGroudonLeft_Gfx, 0x1800, GFXTAG_GROUDON_SIDE }; static const struct CompressedSpriteSheet sUnknown_0862AC30 = @@ -1116,7 +1161,7 @@ static const struct CompressedSpriteSheet sUnknown_0862AC50 = static const struct CompressedSpritePalette sUnknown_0862AC58 = { - gRaySceneGroudonLeft_Pal, 30565 + gRaySceneGroudonLeft_Pal, GFXTAG_GROUDON_SIDE }; static const struct CompressedSpritePalette sUnknown_0862AC60 = @@ -1136,7 +1181,7 @@ static const struct CompressedSpritePalette sUnknown_0862AC70 = static const struct SpriteTemplate sUnknown_0862AC78 = { - .tileTag = 30565, + .tileTag = GFXTAG_GROUDON_SIDE, .paletteTag = 30565, .oam = &sOamData_862A6BC, .anims = sSpriteAnimTable_862AB70, @@ -1232,12 +1277,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); } @@ -1277,7 +1322,7 @@ static void Task_EndAfterFadeScreen(u8 taskId) { ResetSpriteData(); FreeAllSpritePalettes(); - SetMainCallback2(sRayScene->callback); + SetMainCallback2(sRayScene->exitCallback); Free(sRayScene); DestroyTask(taskId); } @@ -1287,14 +1332,14 @@ 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]; } } @@ -2405,6 +2450,7 @@ static void Task_HandleRayCharges(u8 taskId) } } +// These two, BG scrolling for Rayquaza charge static void sub_81D8AD8(u8 taskId) { s16 *data = gTasks[taskId].data; diff --git a/src/start_menu.c b/src/start_menu.c index 68a3161855..f470a58b21 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -43,7 +43,6 @@ #include "trainer_card.h" #include "window.h" #include "constants/songs.h" -#include "rom_8011DC0.h" #include "union_room.h" #include "constants/rgb.h" diff --git a/src/trade.c b/src/trade.c index 17967733a1..49e7637a14 100644 --- a/src/trade.c +++ b/src/trade.c @@ -30,7 +30,6 @@ #include "pokemon_summary_screen.h" #include "pokemon_storage_system.h" #include "random.h" -#include "rom_8011DC0.h" #include "save.h" #include "script.h" #include "sound.h" From ba13e9ec959a2d1375a303587ec94ceab0eaa0d1 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Wed, 26 Aug 2020 16:31:37 -0400 Subject: [PATCH 2/7] Document first rayquaza scene --- include/graphics.h | 102 +-- include/palette.h | 2 +- src/contest_painting.c | 13 +- src/data/graphics/rayquaza_scene.h | 102 +-- src/palette.c | 82 ++- src/rayquaza_scene.c | 996 +++++++++++++++-------------- src/task.c | 4 +- 7 files changed, 666 insertions(+), 635 deletions(-) diff --git a/include/graphics.h b/include/graphics.h index 1c8a52b699..b6662cbf7e 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -3309,57 +3309,57 @@ extern const u32 gBerryTag_Gfx[]; extern const u32 gBerryTag_Pal[]; // rayquaza scene gfx -extern const u32 gRaySceneGroudon_Gfx[]; -extern const u32 gRaySceneGroudonShoulder_Gfx[]; -extern const u32 gRaySceneGroudonClaw_Gfx[]; -extern const u32 gRaySceneKyogre_Gfx[]; -extern const u32 gRaySceneKyogre2_Gfx[]; -extern const u32 gRaySceneKyogre3_Gfx[]; -extern const u32 gRaySceneGroudon_Pal[]; -extern const u32 gRaySceneKyogre_Pal[]; -extern const u32 gRaySceneSmoke_Gfx[]; -extern const u32 gRaySceneSmoke_Pal[]; -extern const u32 gRaySceneRayquaza_Pal[]; -extern const u32 gRaySceneRayquazaFly1_Gfx[]; -extern const u32 gRaySceneRayquazaTail_Gfx[]; -extern const u32 gRaySceneGroudonLeft_Gfx[]; -extern const u32 gRaySceneGroudonTail_Gfx[]; -extern const u32 gRaySceneKyogreRight_Gfx[]; -extern const u32 gRaySceneRayquazaHover_Gfx[]; -extern const u32 gRaySceneRayquazaFlyIn_Gfx[]; -extern const u32 gRaySceneOvercast_Gfx[]; -extern const u32 gRaySceneOvercast_Tilemap[]; -extern const u32 gRaySceneRayquaza_Gfx[]; -extern const u32 gRaySceneRayquaza_Tilemap[]; -extern const u32 gRaySceneSplash_Gfx[]; -extern const u32 gRaySceneGroudonLeft_Pal[]; -extern const u32 gRaySceneKyogreRight_Pal[]; -extern const u32 gRaySceneRayquazaHover_Pal[]; -extern const u32 gRaySceneSplash_Pal[]; -extern const u32 gRaySceneClouds_Gfx[]; -extern const u32 gRaySceneClouds_Pal[]; -extern const u32 gRaySceneClouds2_Tilemap[]; -extern const u32 gRaySceneClouds1_Tilemap[]; -extern const u32 gRaySceneClouds3_Tilemap[]; -extern const u32 gRaySceneRayquazaLight_Gfx[]; -extern const u32 gRaySceneRayquazaLight_Tilemap[]; -extern const u32 gRaySceneOvercast2_Gfx[]; -extern const u32 gRaySceneOvercast2_Tilemap[]; -extern const u32 gRaySceneOvercast2_Pal[]; -extern const u32 gRaySceneRayquazaChase_Gfx[]; -extern const u32 gRaySceneChaseStreaks_Gfx[]; -extern const u32 gRaySceneChaseBg_Gfx[]; -extern const u32 gRayChaseRayquazaChase2_Tilemap[]; -extern const u32 gRayChaseRayquazaChase_Tilemap[]; -extern const u32 gRaySceneChaseStreaks_Tilemap[]; -extern const u32 gRaySceneChaseBg_Tilemap[]; -extern const u32 gRaySceneChase_Pal[]; -extern const u32 gRaySceneHushRing_Tilemap[]; -extern const u32 gRaySceneHushBg_Tilemap[]; -extern const u32 gRaySceneHushRing_Map[]; -extern const u32 gRaySceneHushBg_Pal[]; -extern const u32 gRaySceneHushBg_Gfx[]; -extern const u32 gRaySceneHushRing_Gfx[]; +extern const u32 gRaySceneDuoFight_Groudon_Gfx[]; +extern const u32 gRaySceneDuoFight_GroudonShoulder_Gfx[]; +extern const u32 gRaySceneDuoFight_GroudonClaw_Gfx[]; +extern const u32 gRaySceneDuoFight_Kyogre_Gfx[]; +extern const u32 gRaySceneDuoFight_KyogreShoulder_Gfx[]; +extern const u32 gRaySceneDuoFight_KyogreFin_Gfx[]; +extern const u32 gRaySceneDuoFight_Groudon_Pal[]; +extern const u32 gRaySceneDuoFight_Kyogre_Pal[]; +extern const u32 gRaySceneTakesFlight_Smoke_Gfx[]; +extern const u32 gRaySceneTakesFlight_Smoke_Pal[]; +extern const u32 gRaySceneTakesFlight_Rayquaza_Pal[]; +extern const u32 gRaySceneDescends_Rayquaza_Gfx[]; +extern const u32 gRaySceneDescends_RayquazaTail_Gfx[]; +extern const u32 gRaySceneChasesAway_Groudon_Gfx[]; +extern const u32 gRaySceneChasesAway_GroudonTail_Gfx[]; +extern const u32 gRaySceneChasesAway_Kyogre_Gfx[]; +extern const u32 gRaySceneChasesAway_Rayquaza_Gfx[]; +extern const u32 gRaySceneChasesAway_RayquazaTail_Gfx[]; +extern const u32 gRaySceneTakesFlight_Bg_Gfx[]; +extern const u32 gRaySceneTakesFlight_Bg_Tilemap[]; +extern const u32 gRaySceneTakesFlight_Rayquaza_Gfx[]; +extern const u32 gRaySceneTakesFlight_Rayquaza_Tilemap[]; +extern const u32 gRaySceneChasesAway_KyogreSplash_Gfx[]; +extern const u32 gRaySceneChasesAway_Groudon_Pal[]; +extern const u32 gRaySceneChasesAway_Kyogre_Pal[]; +extern const u32 gRaySceneChasesAway_Rayquaza_Pal[]; +extern const u32 gRaySceneChasesAway_KyogreSplash_Pal[]; +extern const u32 gRaySceneDuoFight_Clouds_Gfx[]; +extern const u32 gRaySceneDuoFight_Clouds_Pal[]; +extern const u32 gRaySceneDuoFight_Clouds2_Tilemap[]; +extern const u32 gRaySceneDuoFight_Clouds1_Tilemap[]; +extern const u32 gRaySceneDuoFight_Clouds3_Tilemap[]; +extern const u32 gRaySceneDescends_Light_Gfx[]; +extern const u32 gRaySceneDescends_Light_Tilemap[]; +extern const u32 gRaySceneDescends_Bg_Gfx[]; +extern const u32 gRaySceneDescends_Bg_Tilemap[]; +extern const u32 gRaySceneDescends_Bg_Pal[]; +extern const u32 gRaySceneCharges_Rayquaza_Gfx[]; +extern const u32 gRaySceneCharges_Streaks_Gfx[]; +extern const u32 gRaySceneCharges_Bg_Gfx[]; +extern const u32 gRaySceneCharges_Rayquaza2_Tilemap[]; +extern const u32 gRaySceneCharges_Rayquaza_Tilemap[]; +extern const u32 gRaySceneCharges_Streaks_Tilemap[]; +extern const u32 gRaySceneCharges_Bg_Tilemap[]; +extern const u32 gRaySceneCharges_Bg_Pal[]; +extern const u32 gRaySceneChasesAway_Ring_Tilemap[]; +extern const u32 gRaySceneChasesAway_Bg_Tilemap[]; +extern const u32 gRaySceneChasesAway_Ring_Map[]; +extern const u32 gRaySceneChasesAway_Bg_Pal[]; +extern const u32 gRaySceneChasesAway_Bg_Gfx[]; +extern const u32 gRaySceneChasesAway_Ring_Gfx[]; // Pokeballs extern const u32 gItemIcon_MasterBall[]; diff --git a/include/palette.h b/include/palette.h index 8d16270aa3..f874bcd74a 100644 --- a/include/palette.h +++ b/include/palette.h @@ -70,7 +70,7 @@ void BeginFastPaletteFade(u8); void BeginHardwarePaletteFade(u8, u8, u8, u8, u8); void BlendPalettes(u32 selectedPalettes, u8 coeff, u16 color); void BlendPalettesUnfaded(u32, u8, u16); -void sub_80A2C44(u32 a1, s8 a2, u8 a3, u8 a4, u16 a5, u8 a6, u8 a7); +void BlendPalettesGradually(u32 selectedPalettes, s8 delay, u8 coeff, u8 coeffTarget, u16 color, u8 priority, u8 id); void TintPalette_GrayScale(u16 *palette, u16 count); void TintPalette_GrayScale2(u16 *palette, u16 count); void TintPalette_SepiaTone(u16 *palette, u16 count); diff --git a/src/contest_painting.c b/src/contest_painting.c index f4d0ac6bf9..5dd4a70a53 100644 --- a/src/contest_painting.c +++ b/src/contest_painting.c @@ -384,7 +384,7 @@ static void InitContestMonPixels(u16 species, u8 whichSprite) } } -//#ifdef NONMATCHING +#ifdef NONMATCHING // functionally equivalent. static void _InitContestMonPixels(u8 *spriteGfx, u16 *palette, u16 (*destPixels)[64][64]) { @@ -399,22 +399,23 @@ static void _InitContestMonPixels(u8 *spriteGfx, u16 *palette, u16 (*destPixels) { for (pixelX = 0; pixelX < 8; pixelX++) { - colorIndex = spriteGfx[(((tileY * 8) + tileX) * 32) + (pixelY << 2) + (pixelX >> 1)]; + int offset = 32 * (8 * tileY + tileX) + (pixelY * 4 + pixelX / 2); + colorIndex = spriteGfx[offset]; if (pixelX & 1) colorIndex >>= 4; else colorIndex &= 0xF; if (colorIndex == 0) // transparent pixel - (*destPixels)[tileY * 8 + pixelY][tileX * 8 + pixelX] = 0x8000; + (*destPixels)[8 * tileY + pixelY][tileX * 8 + pixelX] = 0x8000; else - (*destPixels)[tileY * 8 + pixelY][tileX * 8 + pixelX] = palette[colorIndex]; + (*destPixels)[8 * tileY + pixelY][tileX * 8 + pixelX] = palette[colorIndex]; } } } } } -/*#else +#else NAKED static void _InitContestMonPixels(u8 *spriteGfx, u16 *palette, u16 (*destPixels)[64][64]) { @@ -516,7 +517,7 @@ _081303F8:\n\ pop {r0}\n\ bx r0"); } -#endif*/ +#endif #define VRAM_PICTURE_DATA(x, y) (((u16 *)(BG_SCREEN_ADDR(12)))[(y) * 32 + (x)]) diff --git a/src/data/graphics/rayquaza_scene.h b/src/data/graphics/rayquaza_scene.h index 508b83f1a6..54d7966f23 100644 --- a/src/data/graphics/rayquaza_scene.h +++ b/src/data/graphics/rayquaza_scene.h @@ -1,62 +1,62 @@ // Scene 1 (RAY_ANIM_DUO_FIGHT / RAY_ANIM_DUO_FIGHT_PRE) -const u32 gRaySceneGroudon_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/groudon.4bpp.lz"); -const u32 gRaySceneGroudonShoulder_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/groudon_shoulder.4bpp.lz"); -const u32 gRaySceneGroudonClaw_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/groudon_claw.4bpp.lz"); -const u32 gRaySceneKyogre_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/kyogre.4bpp.lz"); -const u32 gRaySceneKyogre2_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/kyogre_shoulder.4bpp.lz"); -const u32 gRaySceneKyogre3_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/kyogre_fin.4bpp.lz"); -const u32 gRaySceneGroudon_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/groudon.gbapal.lz"); -const u32 gRaySceneKyogre_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/kyogre.gbapal.lz"); -const u32 gRaySceneClouds_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds.4bpp.lz"); -const u32 gRaySceneClouds_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds.gbapal.lz"); // pal 1 clouds, pal 2 rain -const u32 gRaySceneClouds1_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds1.bin.lz"); -const u32 gRaySceneClouds2_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds2.bin.lz"); -const u32 gRaySceneClouds3_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds3.bin.lz"); +const u32 gRaySceneDuoFight_Groudon_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/groudon.4bpp.lz"); +const u32 gRaySceneDuoFight_GroudonShoulder_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/groudon_shoulder.4bpp.lz"); +const u32 gRaySceneDuoFight_GroudonClaw_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/groudon_claw.4bpp.lz"); +const u32 gRaySceneDuoFight_Kyogre_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/kyogre.4bpp.lz"); +const u32 gRaySceneDuoFight_KyogreShoulder_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/kyogre_shoulder.4bpp.lz"); +const u32 gRaySceneDuoFight_KyogreFin_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/kyogre_fin.4bpp.lz"); +const u32 gRaySceneDuoFight_Groudon_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/groudon.gbapal.lz"); +const u32 gRaySceneDuoFight_Kyogre_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/kyogre.gbapal.lz"); +const u32 gRaySceneDuoFight_Clouds_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds.4bpp.lz"); +const u32 gRaySceneDuoFight_Clouds_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds.gbapal.lz"); // pal 1 clouds, pal 2 rain +const u32 gRaySceneDuoFight_Clouds1_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds1.bin.lz"); +const u32 gRaySceneDuoFight_Clouds2_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds2.bin.lz"); +const u32 gRaySceneDuoFight_Clouds3_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_1/clouds3.bin.lz"); // Scene 2 (RAY_ANIM_TAKES_FLIGHT) -const u32 gRaySceneSmoke_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/smoke.4bpp.lz"); -const u32 gRaySceneSmoke_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/smoke.gbapal.lz"); -const u32 gRaySceneRayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/rayquaza.8bpp.lz"); -const u32 gRaySceneRayquaza_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/rayquaza.gbapal.lz"); -const u32 gRaySceneRayquaza_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/rayquaza.bin.lz"); -const u32 gRaySceneOvercast_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/bg.4bpp.lz"); // uses pal 2 of gRaySceneRayquaza_Pal -const u32 gRaySceneOvercast_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/bg.bin.lz"); +const u32 gRaySceneTakesFlight_Smoke_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/smoke.4bpp.lz"); +const u32 gRaySceneTakesFlight_Smoke_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/smoke.gbapal.lz"); +const u32 gRaySceneTakesFlight_Rayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/rayquaza.8bpp.lz"); +const u32 gRaySceneTakesFlight_Rayquaza_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/rayquaza.gbapal.lz"); +const u32 gRaySceneTakesFlight_Rayquaza_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/rayquaza.bin.lz"); +const u32 gRaySceneTakesFlight_Bg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/bg.4bpp.lz"); // uses pal 2 of gRaySceneTakesFlight_Rayquaza_Pal +const u32 gRaySceneTakesFlight_Bg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_2/bg.bin.lz"); // Scene 3 (RAY_ANIM_DESCENDS) -const u32 gRaySceneRayquazaFly1_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/rayquaza.4bpp.lz"); +const u32 gRaySceneDescends_Rayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/rayquaza.4bpp.lz"); // for some reason there are an extra 0xC bytes at the end of the original 4bpp, so in order to produce the correct lz, // we have to cat the bytes at the end with a make rule. not sure why those bytes are there, it may have been a bug in Game Freak's software. -const u32 gRaySceneRayquazaTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/rayquaza_tail_fix.4bpp.lz"); -const u32 gRaySceneOvercast2_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/bg.4bpp.lz"); -const u32 gRaySceneRayquazaLight_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/light.4bpp.lz"); // uses pal 2 of gRaySceneOvercast2_Pal -const u32 gRaySceneOvercast2_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/bg.gbapal.lz"); -const u32 gRaySceneOvercast2_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/bg.bin.lz"); -const u32 gRaySceneRayquazaLight_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/light.bin.lz"); +const u32 gRaySceneDescends_RayquazaTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/rayquaza_tail_fix.4bpp.lz"); +const u32 gRaySceneDescends_Bg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/bg.4bpp.lz"); +const u32 gRaySceneDescends_Light_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/light.4bpp.lz"); // uses pal 2 of gRaySceneDescends_Bg_Pal +const u32 gRaySceneDescends_Bg_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/bg.gbapal.lz"); +const u32 gRaySceneDescends_Bg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/bg.bin.lz"); +const u32 gRaySceneDescends_Light_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/light.bin.lz"); // Scene 4 (RAY_ANIM_CHARGES) -const u32 gRaySceneChaseBg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/bg.4bpp.lz"); -const u32 gRaySceneChaseBg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/bg.bin.lz"); -const u32 gRaySceneChaseStreaks_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/streaks.4bpp.lz"); -const u32 gRaySceneChaseStreaks_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/streaks.bin.lz"); -const u32 gRaySceneRayquazaChase_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/rayquaza.4bpp.lz"); -const u32 gRayChaseRayquazaChase_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/rayquaza.bin.lz"); -const u32 gRayChaseRayquazaChase2_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/rayquaza2.bin.lz"); -const u32 gRaySceneChase_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/bg.gbapal.lz"); +const u32 gRaySceneCharges_Bg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/bg.4bpp.lz"); +const u32 gRaySceneCharges_Bg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/bg.bin.lz"); +const u32 gRaySceneCharges_Streaks_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/streaks.4bpp.lz"); +const u32 gRaySceneCharges_Streaks_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/streaks.bin.lz"); +const u32 gRaySceneCharges_Rayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/rayquaza.4bpp.lz"); +const u32 gRaySceneCharges_Rayquaza_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/rayquaza.bin.lz"); +const u32 gRaySceneCharges_Rayquaza2_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/rayquaza2.bin.lz"); // TODO: Clarify +const u32 gRaySceneCharges_Bg_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_4/bg.gbapal.lz"); // Scene 5 (RAY_ANIM_CHASES_AWAY) -const u32 gRaySceneGroudonLeft_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/groudon.4bpp.lz"); -const u32 gRaySceneGroudonTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/groudon_tail.4bpp.lz"); -const u32 gRaySceneKyogreRight_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/kyogre.4bpp.lz"); -const u32 gRaySceneRayquazaHover_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/rayquaza.4bpp.lz"); -const u32 gRaySceneRayquazaFlyIn_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/rayquaza_tail.4bpp.lz"); -const u32 gRaySceneSplash_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/kyogre_splash.4bpp.lz"); -const u32 gRaySceneGroudonLeft_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/groudon.gbapal.lz"); -const u32 gRaySceneKyogreRight_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/kyogre.gbapal.lz"); -const u32 gRaySceneRayquazaHover_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/rayquaza.gbapal.lz"); -const u32 gRaySceneSplash_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/kyogre_splash.gbapal.lz"); -const u32 gRaySceneHushBg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/bg.4bpp.lz"); -const u32 gRaySceneHushRing_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/ring.8bpp.lz"); -const u32 gRaySceneHushBg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/bg.bin.lz"); -const u32 gRaySceneHushRing_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/ring.bin.lz"); -const u32 gRaySceneHushRing_Map[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/ring_map.bin.lz"); -const u32 gRaySceneHushBg_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/bg.gbapal.lz"); +const u32 gRaySceneChasesAway_Groudon_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/groudon.4bpp.lz"); +const u32 gRaySceneChasesAway_GroudonTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/groudon_tail.4bpp.lz"); +const u32 gRaySceneChasesAway_Kyogre_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/kyogre.4bpp.lz"); +const u32 gRaySceneChasesAway_Rayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/rayquaza.4bpp.lz"); +const u32 gRaySceneChasesAway_RayquazaTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/rayquaza_tail.4bpp.lz"); +const u32 gRaySceneChasesAway_KyogreSplash_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/kyogre_splash.4bpp.lz"); +const u32 gRaySceneChasesAway_Groudon_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/groudon.gbapal.lz"); +const u32 gRaySceneChasesAway_Kyogre_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/kyogre.gbapal.lz"); +const u32 gRaySceneChasesAway_Rayquaza_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/rayquaza.gbapal.lz"); +const u32 gRaySceneChasesAway_KyogreSplash_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/kyogre_splash.gbapal.lz"); +const u32 gRaySceneChasesAway_Bg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/bg.4bpp.lz"); +const u32 gRaySceneChasesAway_Ring_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/ring.8bpp.lz"); +const u32 gRaySceneChasesAway_Bg_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/bg.bin.lz"); +const u32 gRaySceneChasesAway_Ring_Tilemap[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/ring.bin.lz"); +const u32 gRaySceneChasesAway_Ring_Map[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/ring_map.bin.lz"); // TODO: Clarify +const u32 gRaySceneChasesAway_Bg_Pal[] = INCBIN_U32("graphics/rayquaza_scene/scene_5/bg.gbapal.lz"); diff --git a/src/palette.c b/src/palette.c index eb49ce4c60..5d605494c7 100644 --- a/src/palette.c +++ b/src/palette.c @@ -940,46 +940,62 @@ void TintPalette_CustomTone(u16 *palette, u16 count, u16 rTone, u16 gTone, u16 b } } -void sub_80A2C44(u32 a1, s8 a2, u8 a3, u8 a4, u16 a5, u8 a6, u8 a7) +#define tCoeff data[0] +#define tCoeffTarget data[1] +#define tCoeffDelta data[2] +#define tDelay data[3] +#define tDelayTimer data[4] +#define tPalettes 5 // data[5] and data[6], set/get via Set/GetWordTaskArg +#define tColor data[7] +#define tId data[8] + +// Blend the selected palettes in a series of steps toward or away from the color. +// Only used by the Groudon/Kyogre fight scene to flash the screen for lightning +// One call is used to fade the bg from white, while another fades the duo from black +void BlendPalettesGradually(u32 selectedPalettes, s8 delay, u8 coeff, u8 coeffTarget, u16 color, u8 priority, u8 id) { u8 taskId; - taskId = CreateTask((void *)sub_80A2D54, a6); - gTasks[taskId].data[0] = a3; - gTasks[taskId].data[1] = a4; + taskId = CreateTask((void *)sub_80A2D54, priority); + gTasks[taskId].tCoeff = coeff; + gTasks[taskId].tCoeffTarget = coeffTarget; - if (a2 >= 0) + if (delay >= 0) { - gTasks[taskId].data[3] = a2; - gTasks[taskId].data[2] = 1; + gTasks[taskId].tDelay = delay; + gTasks[taskId].tCoeffDelta = 1; } else { - gTasks[taskId].data[3] = 0; - gTasks[taskId].data[2] = -a2 + 1; + gTasks[taskId].tDelay = 0; + gTasks[taskId].tCoeffDelta = -delay + 1; } - if (a4 < a3) - gTasks[taskId].data[2] *= -1; + if (coeffTarget < coeff) + gTasks[taskId].tCoeffDelta *= -1; - SetWordTaskArg(taskId, 5, a1); - gTasks[taskId].data[7] = a5; - gTasks[taskId].data[8] = a7; + SetWordTaskArg(taskId, tPalettes, selectedPalettes); + gTasks[taskId].tColor = color; + gTasks[taskId].tId = id; gTasks[taskId].func(taskId); } -bool32 sub_80A2CF8(u8 var) +// Unused +static bool32 sub_80A2CF8(u8 id) { int i; - for (i = 0; i < NUM_TASKS; i++) // check all the tasks. - if ((gTasks[i].isActive == TRUE) && (gTasks[i].func == sub_80A2D54) && (gTasks[i].data[8] == var)) + for (i = 0; i < NUM_TASKS; i++) + if ((gTasks[i].isActive == TRUE) + && (gTasks[i].func == sub_80A2D54) + && (gTasks[i].tId == id)) return TRUE; return FALSE; } -void sub_80A2D34(void) +// Unused +static void sub_80A2D34(void) { u8 taskId; @@ -992,39 +1008,37 @@ void sub_80A2D34(void) } } -void sub_80A2D54(u8 taskId) +static void sub_80A2D54(u8 taskId) { - u32 wordVar; + u32 palettes; s16 *data; - s16 temp; + s16 target; data = gTasks[taskId].data; - wordVar = GetWordTaskArg(taskId, 5); + palettes = GetWordTaskArg(taskId, tPalettes); - if (++data[4] > data[3]) + if (++tDelayTimer > tDelay) { - data[4] = 0; - BlendPalettes(wordVar, data[0], data[7]); - temp = data[1]; - if (data[0] == temp) + tDelayTimer = 0; + BlendPalettes(palettes, tCoeff, tColor); + target = tCoeffTarget; + if (tCoeff == target) { DestroyTask(taskId); } else { - data[0] += data[2]; - if (data[2] >= 0) + tCoeff += tCoeffDelta; + if (tCoeffDelta >= 0) { - if (data[0] < temp) - { + if (tCoeff < target) return; - } } - else if (data[0] > temp) + else if (tCoeff > target) { return; } - data[0] = temp; + tCoeff = target; } } } diff --git a/src/rayquaza_scene.c b/src/rayquaza_scene.c index 7490668d22..92082b2c1f 100644 --- a/src/rayquaza_scene.c +++ b/src/rayquaza_scene.c @@ -22,14 +22,14 @@ 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) + - 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) - Notably this is re-used to show the Groudon/Kyogre fight when the player first arrives - in Sootopolis during the conflict, which uses a shortened version of the first scene - This is indicated by the endEarly argument to DoRayquazaScene + 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 @@ -43,18 +43,21 @@ enum RAY_ANIM_END }; -#define GFXTAG_GROUDON 30505 -#define GFXTAG_GROUDON_SHOULDER 30506 -#define GFXTAG_GROUDON_CLAW 30507 -#define GFXTAG_KYOGRE1 30508 -#define GFXTAG_KYOGRE2 30509 -#define GFXTAG_KYOGRE3 30510 -#define GFXTAG_SMOKE 30555 -#define GFXTAG_GROUDON_SIDE 30565 - -#define PALTAG_GROUDON 30505 -#define PALTAG_KYOGRE 30508 -#define PALTAG_SMOKE 30555 +#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_SHOULDER 30509 +#define TAG_DUOFIGHT_KYOGRE_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 struct RayquazaScene { @@ -79,27 +82,27 @@ static void Task_DuoFightAnim(u8 taskId); static void Task_HandleDuoFight(u8 taskId); static void Task_DuoFightEnd(u8 taskId); static void DuoFightEnd(u8 taskId, s8 palDelay); -static void sub_81D7228(u8 taskId); -static void sub_81D752C(u8 taskId); -static void sub_81D750C(void); -static void sub_81D7438(void); -static void sub_81D7480(void); -static void sub_81D74C8(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 u8 sub_81D7664(void); -static u8 sub_81D78BC(void); +static void Task_DuoFight_AnimateClouds(u8 taskId); +static void DuoFight_PanOffScene(u8 taskId); +static void DuoFight_AnimateRain(void); +static void DuoFight_Lightning1(void); +static void DuoFight_Lightning2(void); +static void DuoFight_LightningLong(void); +static void SpriteCB_DuoFightPre_Groudon(struct Sprite *sprite); +static void SpriteCB_DuoFightPre_Kyogre(struct Sprite *sprite); +static void DuoFight_SlideGroudonDown(struct Sprite *sprite); +static void DuoFight_SlideKyogreDown(struct Sprite *sprite); +static void SpriteCB_DuoFight_Groudon(struct Sprite *sprite); +static void SpriteCB_DuoFight_Kyogre(struct Sprite *sprite); +static u8 CreateDuoFightGroudonSprites(void); +static u8 CreateDuoFightKyogreSprites(void); // RAY_ANIM_TAKES_FLIGHT static void Task_RayTakesFlightAnim(u8 taskId); static void Task_HandleRayTakesFlight(u8 taskId); static void Task_RayTakesFlightEnd(u8 taskId); static void sub_81D81A4(u8 taskId); -static void sub_81D8260(struct Sprite *sprite); +static void SpriteCB_TakesFlight_Smoke(struct Sprite *sprite); // RAY_ANIM_DESCENDS static void Task_RayDescendsAnim(u8 taskId); @@ -128,7 +131,7 @@ static void sub_81D98B4(u8 taskId); static void sub_81D9420(struct Sprite *sprite); static void sub_81D97E0(struct Sprite *sprite); static void sub_81D9528(struct Sprite *sprite); -static void sub_81D961C(struct Sprite *sprite); +static void SpriteCB_ChasesAway_Rayquaza(struct Sprite *sprite); static void sub_81D9338(struct Sprite *sprite); static void sub_81D9868(struct Sprite *sprite, u8 animNum, s16 x, s16 y); @@ -143,7 +146,7 @@ static const TaskFunc sTasksForAnimations[] = [RAY_ANIM_END] = Task_EndAfterFadeScreen, }; -static const struct OamData sOamData_862A6BC = +static const struct OamData sOam_64x64 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -160,7 +163,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, @@ -177,7 +180,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, @@ -194,7 +197,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, @@ -211,7 +214,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, @@ -228,7 +231,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, @@ -245,7 +248,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, @@ -262,7 +265,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, @@ -297,62 +300,62 @@ 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 }; -static const struct SpriteTemplate sUnknown_0862A72C = +static const struct SpriteTemplate sSpriteTemplate_DuoFightPre_Groudon = { - .tileTag = GFXTAG_GROUDON, - .paletteTag = PALTAG_GROUDON, - .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_GroudonShoulderKyogreFin[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_862A74C[] = +static const union AnimCmd *const sAnims_DuoFightPre_GroudonShoulderKyogreFin[] = { - sSpriteAnim_862A744 + sAnim_DuoFightPre_GroudonShoulderKyogreFin }; -static const struct SpriteTemplate sUnknown_0862A750 = +static const struct SpriteTemplate sSpriteTemplate_DuoFightPre_GroudonShoulder = { - .tileTag = GFXTAG_GROUDON_SHOULDER, - .paletteTag = PALTAG_GROUDON, - .oam = &sOamData_862A6C4, - .anims = sSpriteAnimTable_862A74C, + .tileTag = TAG_DUOFIGHT_GROUDON_SHOULDER, + .paletteTag = TAG_DUOFIGHT_GROUDON, + .oam = &sOam_32x32, + .anims = sAnims_DuoFightPre_GroudonShoulderKyogreFin, .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 = GFXTAG_GROUDON_CLAW, - .paletteTag = PALTAG_GROUDON, - .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, @@ -421,7 +424,7 @@ static const union AnimCmd sSpriteAnim_862A7E4[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd *const sSpriteAnimTable_862A7F8[] = +static const union AnimCmd *const sAnims_DuoFightPre_Kyogre[] = { sSpriteAnim_862A78C, sSpriteAnim_862A794, @@ -434,18 +437,18 @@ static const union AnimCmd *const sSpriteAnimTable_862A7F8[] = sSpriteAnim_862A7E4 }; -static const struct SpriteTemplate sUnknown_0862A81C = +static const struct SpriteTemplate sSpriteTemplate_DuoFightPre_Kyogre = { - .tileTag = GFXTAG_KYOGRE1, - .paletteTag = PALTAG_KYOGRE, - .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_KyogreShoulder[] = { ANIMCMD_FRAME(0, 36), ANIMCMD_FRAME(2, 36), @@ -454,41 +457,41 @@ static const union AnimCmd sSpriteAnim_862A834[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd *const sSpriteAnimTable_862A848[] = +static const union AnimCmd *const sAnims_DuoFightPre_KyogreShoulder[] = { - sSpriteAnim_862A834 + sAnim_DuoFightPre_KyogreShoulder }; -static const struct SpriteTemplate sUnknown_0862A84C = +static const struct SpriteTemplate sSpriteTemplate_DuoFightPre_KyogreShoulder = { - .tileTag = GFXTAG_KYOGRE2, - .paletteTag = PALTAG_KYOGRE, - .oam = &sOamData_862A6DC, - .anims = sSpriteAnimTable_862A848, + .tileTag = TAG_DUOFIGHT_KYOGRE_SHOULDER, + .paletteTag = TAG_DUOFIGHT_KYOGRE, + .oam = &sOam_16x8, + .anims = sAnims_DuoFightPre_KyogreShoulder, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct SpriteTemplate sUnknown_0862A864 = +static const struct SpriteTemplate sSpriteTemplate_DuoFightPre_KyogreFin = { - .tileTag = GFXTAG_KYOGRE3, - .paletteTag = PALTAG_KYOGRE, - .oam = &sOamData_862A6C4, - .anims = sSpriteAnimTable_862A74C, + .tileTag = TAG_DUOFIGHT_KYOGRE_FIN, + .paletteTag = TAG_DUOFIGHT_KYOGRE, + .oam = &sOam_32x32, + .anims = sAnims_DuoFightPre_GroudonShoulderKyogreFin, .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, @@ -537,82 +540,82 @@ 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 }; -static const struct CompressedSpriteSheet sUnknown_0862A8C4 = +static const struct CompressedSpriteSheet sSpriteSheet_DuoFight_Groudon = { - gRaySceneGroudon_Gfx, 0x3000, GFXTAG_GROUDON + gRaySceneDuoFight_Groudon_Gfx, 0x3000, TAG_DUOFIGHT_GROUDON }; -static const struct CompressedSpritePalette sUnknown_0862A8CC = +static const struct CompressedSpritePalette sSpritePal_DuoFight_Groudon = { - gRaySceneGroudon_Pal, PALTAG_GROUDON + gRaySceneDuoFight_Groudon_Pal, TAG_DUOFIGHT_GROUDON }; -static const struct SpriteTemplate sUnknown_0862A8D4 = +static const struct SpriteTemplate sSpriteTemplate_DuoFight_Groudon = { - .tileTag = GFXTAG_GROUDON, - .paletteTag = PALTAG_GROUDON, - .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_GroudonShoulderKyogreFin[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_862A8F4[] = +static const union AnimCmd *const sAnims_DuoFight_GroudonShoulderKyogreFin[] = { - sSpriteAnim_862A8EC + sAnim_DuoFight_GroudonShoulderKyogreFin }; -static const struct CompressedSpriteSheet sUnknown_0862A8F8 = +static const struct CompressedSpriteSheet sSpriteSheet_DuoFight_GroudonShoulder = { - gRaySceneGroudonShoulder_Gfx, 0x200, GFXTAG_GROUDON_SHOULDER + gRaySceneDuoFight_GroudonShoulder_Gfx, 0x200, TAG_DUOFIGHT_GROUDON_SHOULDER }; -static const struct SpriteTemplate sUnknown_0862A900 = +static const struct SpriteTemplate sSpriteTemplate_DuoFight_GroudonShoulder = { - .tileTag = GFXTAG_GROUDON_SHOULDER, - .paletteTag = PALTAG_GROUDON, - .oam = &sOamData_862A6C4, - .anims = sSpriteAnimTable_862A8F4, + .tileTag = TAG_DUOFIGHT_GROUDON_SHOULDER, + .paletteTag = TAG_DUOFIGHT_GROUDON, + .oam = &sOam_32x32, + .anims = sAnims_DuoFight_GroudonShoulderKyogreFin, .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 = { - gRaySceneGroudonClaw_Gfx, 0x400, GFXTAG_GROUDON_CLAW + gRaySceneDuoFight_GroudonClaw_Gfx, 0x400, TAG_DUOFIGHT_GROUDON_CLAW }; -static const struct SpriteTemplate sUnknown_0862A92C = +static const struct SpriteTemplate sSpriteTemplate_DuoFight_GroudonClaw = { - .tileTag = GFXTAG_GROUDON_CLAW, - .paletteTag = PALTAG_GROUDON, - .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, @@ -681,7 +684,7 @@ 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, @@ -694,28 +697,28 @@ static const union AnimCmd *const sSpriteAnimTable_862A9B0[] = sSpriteAnim_862A99C }; -static const struct CompressedSpriteSheet sUnknown_0862A9D4 = +static const struct CompressedSpriteSheet sSpriteSheet_DuoFight_Kyogre = { - gRaySceneKyogre_Gfx, 0xF00, GFXTAG_KYOGRE1 + gRaySceneDuoFight_Kyogre_Gfx, 0xF00, TAG_DUOFIGHT_KYOGRE }; -static const struct CompressedSpritePalette sUnknown_0862A9DC = +static const struct CompressedSpritePalette sSpritePal_DuoFight_Kyogre = { - gRaySceneKyogre_Pal, PALTAG_KYOGRE + gRaySceneDuoFight_Kyogre_Pal, TAG_DUOFIGHT_KYOGRE }; -static const struct SpriteTemplate sUnknown_0862A9E4 = +static const struct SpriteTemplate sSpriteTemplate_DuoFight_Kyogre = { - .tileTag = GFXTAG_KYOGRE1, - .paletteTag = PALTAG_KYOGRE, - .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_KyogreShoulder[] = { ANIMCMD_FRAME(0, 24), ANIMCMD_FRAME(2, 24), @@ -724,44 +727,44 @@ static const union AnimCmd sSpriteAnim_862A9FC[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd *const sSpriteAnimTable_862AA10[] = +static const union AnimCmd *const sAnims_DuoFight_KyogreShoulder[] = { - sSpriteAnim_862A9FC + sAnim_DuoFight_KyogreShoulder }; -static const struct CompressedSpriteSheet sUnknown_0862AA14 = +static const struct CompressedSpriteSheet sSpriteSheet_DuoFight_KyogreShoulder = { - gRaySceneKyogre2_Gfx, 0xC0, GFXTAG_KYOGRE2 + gRaySceneDuoFight_KyogreShoulder_Gfx, 0xC0, TAG_DUOFIGHT_KYOGRE_SHOULDER }; -static const struct SpriteTemplate sUnknown_0862AA1C = +static const struct SpriteTemplate sSpriteTemplate_DuoFight_KyogreShoulder = { - .tileTag = GFXTAG_KYOGRE2, - .paletteTag = PALTAG_KYOGRE, - .oam = &sOamData_862A6DC, - .anims = sSpriteAnimTable_862AA10, + .tileTag = TAG_DUOFIGHT_KYOGRE_SHOULDER, + .paletteTag = TAG_DUOFIGHT_KYOGRE, + .oam = &sOam_16x8, + .anims = sAnims_DuoFight_KyogreShoulder, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct CompressedSpriteSheet sUnknown_0862AA34 = +static const struct CompressedSpriteSheet sSpriteSheet_DuoFight_KyogreFin = { - gRaySceneKyogre3_Gfx, 0x200, GFXTAG_KYOGRE3 + gRaySceneDuoFight_KyogreFin_Gfx, 0x200, TAG_DUOFIGHT_KYOGRE_FIN }; -static const struct SpriteTemplate sUnknown_0862AA3C = +static const struct SpriteTemplate sSpriteTemplate_DuoFight_KyogreFin = { - .tileTag = GFXTAG_KYOGRE3, - .paletteTag = PALTAG_KYOGRE, - .oam = &sOamData_862A6C4, - .anims = sSpriteAnimTable_862A8F4, + .tileTag = TAG_DUOFIGHT_KYOGRE_FIN, + .paletteTag = TAG_DUOFIGHT_KYOGRE, + .oam = &sOam_32x32, + .anims = sAnims_DuoFight_GroudonShoulderKyogreFin, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct BgTemplate sUnknown_0862AA54[] = +static const struct BgTemplate sBgTemplates_TakesFlight[] = { { .bg = 0, @@ -792,18 +795,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), @@ -811,47 +814,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, GFXTAG_SMOKE + gRaySceneTakesFlight_Smoke_Gfx, 0x100, TAG_FLIGHT_SMOKE }; -static const struct CompressedSpritePalette sUnknown_0862AA98 = +static const struct CompressedSpritePalette sSpritePal_TakesFlight_Smoke = { - gRaySceneSmoke_Pal, PALTAG_SMOKE + gRaySceneTakesFlight_Smoke_Pal, TAG_FLIGHT_SMOKE }; -static const struct SpriteTemplate sUnknown_0862AAA0 = +static const struct SpriteTemplate sSpriteTemplate_TakesFlight_Smoke = { - .tileTag = GFXTAG_SMOKE, - .paletteTag = PALTAG_SMOKE, - .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] = { - {-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, @@ -891,68 +894,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, @@ -1007,21 +1010,21 @@ 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 }; -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[] = @@ -1042,7 +1045,7 @@ static const union AnimCmd sSpriteAnim_862AB94[] = ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_862AB9C[] = +static const union AnimCmd *const sAnims_ChasesAway_Kyogre[] = { sSpriteAnim_862AB84, sSpriteAnim_862AB8C, @@ -1073,7 +1076,7 @@ static const union AnimCmd sSpriteAnim_862ABC0[] = ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_862ABC8[] = +static const union AnimCmd *const sAnims_ChasesAway_Rayquaza[] = { sSpriteAnim_862ABA8, sSpriteAnim_862ABB0, @@ -1105,7 +1108,7 @@ static const union AnimCmd sSpriteAnim_862ABF0[] = ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_862ABF8[] = +static const union AnimCmd *const sAnims_ChasesAway_RayquazaTail[] = { sSpriteAnim_862ABD8, sSpriteAnim_862ABE0, @@ -1113,7 +1116,7 @@ static const union AnimCmd *const sSpriteAnimTable_862ABF8[] = sSpriteAnim_862ABF0 }; -static const union AnimCmd sSpriteAnim_862AC08[] = +static const union AnimCmd sAnim_ChasesAway_KyogreSplash[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(4, 8), @@ -1124,128 +1127,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, GFXTAG_GROUDON_SIDE + 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, GFXTAG_GROUDON_SIDE + 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 = GFXTAG_GROUDON_SIDE, - .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, @@ -1276,7 +1279,6 @@ static const struct BgTemplate sUnknown_0862AD08[] = } }; -// code void DoRayquazaScene(u8 animId, bool8 endEarly, void (*exitCallback)(void)) { sRayScene = AllocZeroed(sizeof(*sRayScene)); @@ -1295,7 +1297,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); } @@ -1347,34 +1349,43 @@ static void Task_SetNextAnim(u8 taskId) static void sub_81D68C8(void) { - SetGpuReg(REG_OFFSET_WININ, 0x3F); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR); 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) { - SetGpuReg(REG_OFFSET_WININ, 0x3F); - SetGpuReg(REG_OFFSET_WINOUT, 0x3F); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); } +#define tCounter 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]; + s16 counter = tCounter; if (counter == 64) { - sub_81D7438(); + DuoFight_Lightning1(); } else if (counter == 144) { - sub_81D7480(); + DuoFight_Lightning2(); } else { @@ -1384,31 +1395,31 @@ static void Task_HandleDuoFightPre(u8 taskId) DuoFightEnd(taskId, 0); return; case 148: - sub_81D74C8(); + DuoFight_LightningLong(); break; } } - data[0]++; + tCounter++; } } -static u8 sub_81D6984(void) +static u8 CreateDuoFightPreGroudonSprites(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]++; @@ -1416,54 +1427,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 CreateDuoFightPreKyogreSprites(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_KyogreShoulder, 208, 132, 0) << 8; + data[4] |= CreateSprite(&sSpriteTemplate_DuoFightPre_KyogreFin, 200, 120, 1); StartSpriteAnim(&gSprites[data[0] >> 8], 1); StartSpriteAnim(&gSprites[data[0] & 0xFF], 2); @@ -1477,7 +1488,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]++; @@ -1544,11 +1555,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]); @@ -1563,46 +1574,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_KyogreShoulder); + LoadCompressedSpriteSheet(&sSpriteSheet_DuoFight_KyogreFin); + 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); + tCounter = 0; + tHelperTaskId = CreateTask(Task_DuoFight_AnimateClouds, 0); if (sRayScene->animId == RAY_ANIM_DUO_FIGHT_PRE) { - data[2] = sub_81D6984(); - data[3] = sub_81D6B7C(); + tGroudonSpriteId = CreateDuoFightPreGroudonSprites(); + tKyogreSpriteId = CreateDuoFightPreKyogreSprites(); gTasks[taskId].func = Task_HandleDuoFightPre; } else { - data[2] = sub_81D7664(); - data[3] = sub_81D78BC(); + tGroudonSpriteId = CreateDuoFightGroudonSprites(); + tKyogreSpriteId = CreateDuoFightKyogreSprites(); gTasks[taskId].func = Task_HandleDuoFight; StopMapMusic(); } @@ -1613,7 +1624,7 @@ static void Task_DuoFightAnim(u8 taskId) PlaySE(SE_T_OOAME); } -static void sub_81D7228(u8 taskId) +static void Task_DuoFight_AnimateClouds(u8 taskId) { s16 i; u16 *data = gTasks[taskId].data; @@ -1675,21 +1686,21 @@ 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]; + s16 counter = tCounter; if (counter == 32 || counter == 112) { - sub_81D7438(); + DuoFight_Lightning1(); } else if (counter == 216) { - sub_81D7480(); + DuoFight_Lightning2(); } else if (counter == 220) { - sub_81D74C8(); + DuoFight_LightningLong(); } else { @@ -1700,60 +1711,64 @@ static void Task_HandleDuoFight(u8 taskId) 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]++; + tCounter++; } } -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_T_KAMI); - 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_T_KAMI); - 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 (tCounter != 16) { - data[0]++; - SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - data[0], data[0])); + tCounter++; + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - tCounter, tCounter)); } } @@ -1767,36 +1782,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; + tCounter = 0; gTasks[taskId].func = Task_SetNextAnim; } } -static u8 sub_81D7664(void) +static u8 CreateDuoFightGroudonSprites(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]++; @@ -1804,66 +1819,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 CreateDuoFightKyogreSprites(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_KyogreShoulder, 198, 132, 0) << 8; + data[4] |= CreateSprite(&sSpriteTemplate_DuoFight_KyogreFin, 190, 120, 1); StartSpriteAnim(&gSprites[data[0] >> 8], 1); StartSpriteAnim(&gSprites[data[0] & 0xFF], 2); @@ -1877,7 +1892,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]++; @@ -1938,7 +1953,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) @@ -1957,11 +1972,11 @@ static void sub_81D7D14(struct Sprite *sprite) } } -static void sub_81D7E10(void) +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]); @@ -1976,28 +1991,28 @@ 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); + 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, 0x40); + LoadCompressedSpriteSheet(&sSpriteSheet_TakesFlight_Smoke); + LoadCompressedSpritePalette(&sSpritePal_TakesFlight_Smoke); } static void Task_RayTakesFlightAnim(u8 taskId) { s16 *data = gTasks[taskId].data; PlayNewMapMusic(MUS_REKKUU_KOURIN); - 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); @@ -2085,7 +2100,7 @@ static void sub_81D81A4(u8 taskId) s16 *data = gTasks[taskId].data; if ((data[1] & 3) == 0) { - u8 spriteId = CreateSprite(&sUnknown_0862AAA0, + u8 spriteId = CreateSprite(&sSpriteTemplate_TakesFlight_Smoke, (sUnknown_0862AAB8[data[0]][0] * 4) + 120, (sUnknown_0862AAB8[data[0]][1] * 4) + 80, 0); @@ -2108,7 +2123,7 @@ static void sub_81D81A4(u8 taskId) data[1]++; } -static void sub_81D8260(struct Sprite *sprite) +static void SpriteCB_TakesFlight_Smoke(struct Sprite *sprite) { if (sprite->data[1] == 0) { @@ -2125,11 +2140,11 @@ static void sub_81D8260(struct Sprite *sprite) sprite->data[1] &= 0xF; } -static void sub_81D82B0(void) +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]); @@ -2147,28 +2162,28 @@ 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); + DecompressAndCopyTileDataToVram(0, gRaySceneDescends_Light_Gfx, 0, 0, 0); + DecompressAndCopyTileDataToVram(1, gRaySceneDescends_Bg_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); + 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) +static void HBlankCB_RayDescends(void) { u16 VCOUNT = GetGpuReg(REG_OFFSET_VCOUNT); if (VCOUNT >= 24 && VCOUNT <= 135 && VCOUNT - 24 <= sRayScene->field_2008) @@ -2195,8 +2210,8 @@ static void sub_81D844C(void) 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); @@ -2235,7 +2250,7 @@ static void Task_HandleRayDescends(u8 taskId) { data[1] = 0; data[0]++; - SetHBlankCallback(sub_81D844C); + SetHBlankCallback(HBlankCB_RayDescends); EnableInterrupts(INTR_FLAG_HBLANK | INTR_FLAG_VBLANK); } else @@ -2284,9 +2299,9 @@ static void Task_RayDescendsEnd(u8 taskId) static u8 sub_81D86CC(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); + data[0] = CreateSprite(&sSpriteTemplate_Descends_RayquazaTail, 184, -48, 0); gSprites[spriteId].callback = sub_81D874C; gSprites[spriteId].oam.priority = 3; gSprites[data[0]].oam.priority = 3; @@ -2347,11 +2362,11 @@ static void sub_81D874C(struct Sprite *sprite) data[2]++; } -static void sub_81D8828(void) +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]); @@ -2369,26 +2384,26 @@ 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_Rayquaza2_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); } static void Task_RayChargesAnim(u8 taskId) { s16 *data = gTasks[taskId].data; - sub_81D8828(); - sub_81D88D0(); + InitChargesSceneBgs(); + LoadChargesSceneGfx(); sub_81D68C8(); BlendPalettes(-1, 0x10, 0); SetVBlankCallback(VBlankCB_RayquazaScene); @@ -2505,11 +2520,11 @@ static void Task_RayChargesEnd(u8 taskId) } } -static void sub_81D8C38(void) +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]); @@ -2524,34 +2539,35 @@ 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()); + DecompressAndCopyTileDataToVram(2, gRaySceneChasesAway_Ring_Gfx, 0, 0, 0); + DecompressAndCopyTileDataToVram(0, gRaySceneChasesAway_Bg_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); + LZDecompressWram(gRaySceneChasesAway_Ring_Tilemap, sRayScene->tilemapBuffers[1]); + LZDecompressWram(gRaySceneChasesAway_Bg_Tilemap, sRayScene->tilemapBuffers[0]); + LZDecompressWram(gRaySceneChasesAway_Ring_Map, 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); } static void Task_RayChasesAwayAnim(u8 taskId) { s16 *data = gTasks[taskId].data; - sub_81D8C38(); - sub_81D8CC4(); + InitChasesAwaySceneBgs(); + LoadChasesAwaySceneGfx(); sub_81D68C8(); ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_EFFECT_BLEND); @@ -2614,8 +2630,8 @@ static void Task_HandleRayChasesAway(u8 taskId) data[1]++; if (data[1] % 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; @@ -2676,25 +2692,25 @@ static void sub_81D90A8(u8 taskId) taskData = gTasks[taskId].data; - taskData[3] = CreateSprite(&sUnknown_0862AC78, 64, 120, 0); + taskData[3] = CreateSprite(&sSpriteTemplate_ChasesAway_Groudon, 64, 120, 0); spriteData = gSprites[taskData[3]].data; - spriteData[0] = CreateSprite(&sUnknown_0862AC90, 16, 130, 0); + spriteData[0] = CreateSprite(&sSpriteTemplate_ChasesAway_GroudonTail, 16, 130, 0); gSprites[taskData[3]].oam.priority = 1; gSprites[spriteData[0]].oam.priority = 1; - taskData[4] = CreateSprite(&sUnknown_0862ACA8, 160, 128, 1); + taskData[4] = CreateSprite(&sSpriteTemplate_ChasesAway_Kyogre, 160, 128, 1); spriteData = gSprites[taskData[4]].data; - spriteData[0] = CreateSprite(&sUnknown_0862ACA8, 192, 128, 1); - spriteData[1] = CreateSprite(&sUnknown_0862ACA8, 224, 128, 1); + spriteData[0] = CreateSprite(&sSpriteTemplate_ChasesAway_Kyogre, 192, 128, 1); + spriteData[1] = CreateSprite(&sSpriteTemplate_ChasesAway_Kyogre, 224, 128, 1); gSprites[taskData[4]].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); + taskData[5] = CreateSprite(&sSpriteTemplate_ChasesAway_Rayquaza, 120, -65, 0); spriteData = gSprites[taskData[5]].data; - spriteData[0] = CreateSprite(&sUnknown_0862ACD8, 120, -113, 0); + spriteData[0] = CreateSprite(&sSpriteTemplate_ChasesAway_RayquazaTail, 120, -113, 0); gSprites[taskData[5]].oam.priority = 1; gSprites[spriteData[0]].oam.priority = 1; } @@ -2802,9 +2818,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]++; @@ -2828,7 +2844,7 @@ static void sub_81D9528(struct Sprite *sprite) sprite->data[4]++; } -static void sub_81D961C(struct Sprite *sprite) +static void SpriteCB_ChasesAway_Rayquaza(struct Sprite *sprite) { s16 counter = sprite->data[7]; if (counter <= 64) diff --git a/src/task.c b/src/task.c index a2df66de85..a97496009e 100644 --- a/src/task.c +++ b/src/task.c @@ -200,7 +200,7 @@ u8 GetTaskCount(void) void SetWordTaskArg(u8 taskId, u8 dataElem, u32 value) { - if (dataElem <= 14) + if (dataElem < NUM_TASK_DATA - 1) { gTasks[taskId].data[dataElem] = value; gTasks[taskId].data[dataElem + 1] = value >> 16; @@ -209,7 +209,7 @@ void SetWordTaskArg(u8 taskId, u8 dataElem, u32 value) u32 GetWordTaskArg(u8 taskId, u8 dataElem) { - if (dataElem <= 14) + if (dataElem < NUM_TASK_DATA - 1) return (u16)gTasks[taskId].data[dataElem] | (gTasks[taskId].data[dataElem + 1] << 16); else return 0; From 52b1251b48e7003837f41d8406fc6bc18ce6e84b Mon Sep 17 00:00:00 2001 From: GriffinR Date: Wed, 26 Aug 2020 17:42:51 -0400 Subject: [PATCH 3/7] Document second rayquaza scene --- src/data/graphics/rayquaza_scene.h | 2 +- src/rayquaza_scene.c | 156 +++++++++++++++++++---------- 2 files changed, 104 insertions(+), 54 deletions(-) diff --git a/src/data/graphics/rayquaza_scene.h b/src/data/graphics/rayquaza_scene.h index 54d7966f23..190fb4b3ba 100644 --- a/src/data/graphics/rayquaza_scene.h +++ b/src/data/graphics/rayquaza_scene.h @@ -24,7 +24,7 @@ const u32 gRaySceneTakesFlight_Bg_Tilemap[] = INCBIN_U32("graphics/rayquaz // Scene 3 (RAY_ANIM_DESCENDS) const u32 gRaySceneDescends_Rayquaza_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/rayquaza.4bpp.lz"); -// for some reason there are an extra 0xC bytes at the end of the original 4bpp, so in order to produce the correct lz, +// for some reason there are an extra 0xC bytes at the end of the original rayquaza_tail.4bpp, so in order to produce the correct lz, // we have to cat the bytes at the end with a make rule. not sure why those bytes are there, it may have been a bug in Game Freak's software. const u32 gRaySceneDescends_RayquazaTail_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/rayquaza_tail_fix.4bpp.lz"); const u32 gRaySceneDescends_Bg_Gfx[] = INCBIN_U32("graphics/rayquaza_scene/scene_3/bg.4bpp.lz"); diff --git a/src/rayquaza_scene.c b/src/rayquaza_scene.c index 92082b2c1f..e4b6bed4df 100644 --- a/src/rayquaza_scene.c +++ b/src/rayquaza_scene.c @@ -59,6 +59,8 @@ enum #define TAG_CHASE_RAYQUAZA_TAIL 30570 #define TAG_CHASE_SPLASH 30571 +#define MAX_SMOKE 10 + struct RayquazaScene { MainCallback exitCallback; @@ -101,7 +103,7 @@ static u8 CreateDuoFightKyogreSprites(void); static void Task_RayTakesFlightAnim(u8 taskId); static void Task_HandleRayTakesFlight(u8 taskId); static void Task_RayTakesFlightEnd(u8 taskId); -static void sub_81D81A4(u8 taskId); +static void Task_TakesFlight_CreateSmoke(u8 taskId); static void SpriteCB_TakesFlight_Smoke(struct Sprite *sprite); // RAY_ANIM_DESCENDS @@ -840,7 +842,7 @@ static const struct SpriteTemplate sSpriteTemplate_TakesFlight_Smoke = .callback = SpriteCB_TakesFlight_Smoke, }; -static const s8 sUnknown_0862AAB8[][2] = +static const s8 sTakesFlight_SmokeCoords[MAX_SMOKE][2] = { {-1, 5}, {-3, -4}, @@ -1972,6 +1974,24 @@ static void DuoFight_SlideKyogreDown(struct Sprite *sprite) } } +#undef tCounter +#undef tHelperTaskId +#undef tGroudonSpriteId +#undef tKyogreSpriteId + +#undef sGroudonBodySpriteId +#undef sGroudonShoulderSpriteId +#undef sGroudonClawSpriteId + +#define tState data[0] +#define tTimer data[1] +#define tScale data[2] +#define tScaleSpeed data[3] +#define tYCoord data[4] +#define tYSpeed data[5] +#define tYOffset data[6] +#define tYOffsetDir data[7] + static void InitTakesFlightSceneBgs(void) { ResetVramOamAndBgCntRegs(); @@ -1994,7 +2014,7 @@ static void InitTakesFlightSceneBgs(void) static void LoadTakesFlightSceneGfx(void) { ResetTempTileDataBuffers(); - DecompressAndCopyTileDataToVram(0, gRaySceneDuoFight_Clouds_Gfx, 0, 0, 0); + DecompressAndCopyTileDataToVram(0, gRaySceneDuoFight_Clouds_Gfx, 0, 0, 0); // Re-uses clouds from previous scene DecompressAndCopyTileDataToVram(1, gRaySceneTakesFlight_Bg_Gfx, 0, 0, 0); DecompressAndCopyTileDataToVram(2, gRaySceneTakesFlight_Rayquaza_Gfx, 0, 0, 0); while (FreeTempTileDataBuffersIfPossible()) @@ -2002,7 +2022,7 @@ static void LoadTakesFlightSceneGfx(void) LZDecompressWram(gRaySceneDuoFight_Clouds2_Tilemap, sRayScene->tilemapBuffers[0]); LZDecompressWram(gRaySceneTakesFlight_Bg_Tilemap, sRayScene->tilemapBuffers[1]); LZDecompressWram(gRaySceneTakesFlight_Rayquaza_Tilemap, sRayScene->tilemapBuffers[2]); - LoadCompressedPalette(gRaySceneTakesFlight_Rayquaza_Pal, 0, 0x40); + LoadCompressedPalette(gRaySceneTakesFlight_Rayquaza_Pal, 0, 64); LoadCompressedSpriteSheet(&sSpriteSheet_TakesFlight_Smoke); LoadCompressedSpritePalette(&sSpritePal_TakesFlight_Smoke); } @@ -2015,75 +2035,93 @@ static void Task_RayTakesFlightAnim(u8 taskId) LoadTakesFlightSceneGfx(); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_OBJ | BLDCNT_TGT2_BG1 | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 8)); - BlendPalettes(-1, 0x10, 0); + BlendPalettes(-1, 16, 0); SetVBlankCallback(VBlankCB_RayquazaScene); - CreateTask(sub_81D81A4, 0); - data[0] = 0; - data[1] = 0; + CreateTask(Task_TakesFlight_CreateSmoke, 0); + tState = 0; + tTimer = 0; gTasks[taskId].func = Task_HandleRayTakesFlight; } +// Animate Rayquaza (flying up and down, and changing size as it gets further from the screen) +// In this scene Rayquaza is a bg tilemap on bg 2, not a sprite static void Task_HandleRayTakesFlight(u8 taskId) { s16 *data = gTasks[taskId].data; - switch (data[0]) + switch (tState) { case 0: - if (data[1] == 8) + // Delay, then fade in + if (tTimer == 8) { BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); - data[2] = 0; - data[3] = 30; - data[4] = 0; - data[5] = 7; - data[1] = 0; - data[0]++; + tScale = 0; + tScaleSpeed = 30; + tYCoord = 0; + tYSpeed = 7; + tTimer = 0; + tState++; } else { - data[1]++; + tTimer++; } break; case 1: - data[2] += data[3]; - data[4] += data[5]; - if (data[3] > 3) - data[3] -= 3; - if (data[5] != 0) - data[5]--; - if (data[2] > 255) + // Fly in + tScale += tScaleSpeed; + tYCoord += tYSpeed; + + if (tScaleSpeed > 3) + tScaleSpeed -= 3; + + if (tYSpeed != 0) + tYSpeed--; + + if (tScale > 255) { - data[2] = 256; - data[3] = 0; - data[6] = 12; - data[7] = -1; - data[1] = 0; - data[0]++; + tScale = 256; + tScaleSpeed = 0; + tYOffset = 12; + tYOffsetDir = -1; + tTimer = 0; + tState++; } - SetBgAffine(2, 0x7800, 0x1800, 0x78, data[4] + 32, data[2], data[2], 0); + SetBgAffine(2, 0x7800, 0x1800, 0x78, tYCoord + 32, tScale, tScale, 0); break; case 2: - data[1]++; - SetBgAffine(2, 0x7800, 0x1800, 0x78, data[4] + 32 + (data[6] >> 2), data[2], data[2], 0); - data[6] += data[7]; - if (data[6] == 12 || data[6] == -12) + // Float up and down + tTimer++; + SetBgAffine(2, 0x7800, 0x1800, 0x78, tYCoord + 32 + (tYOffset >> 2), tScale, tScale, 0); + tYOffset += tYOffsetDir; + if (tYOffset == 12 || tYOffset == -12) { - data[7] *= -1; - if (data[1] > 295) + tYOffsetDir *= -1; + if (tTimer > 295) { - data[0]++; + tState++; BeginNormalPaletteFade(0xFFFFFFFF, 6, 0, 0x10, RGB_BLACK); } } break; case 3: - data[2] += 16; - SetBgAffine(2, 0x7800, 0x1800, 0x78, data[4] + 32, data[2], data[2], 0); + // Fly away, fade out + tScale += 16; + SetBgAffine(2, 0x7800, 0x1800, 0x78, tYCoord + 32, tScale, tScale, 0); Task_RayTakesFlightEnd(taskId); break; } } +#undef tState +#undef tTimer +#undef tScale +#undef tScaleSpeed +#undef tYCoord +#undef tYSpeed +#undef tYOffset +#undef tYOffsetDir + static void Task_RayTakesFlightEnd(u8 taskId) { if (!gPaletteFade.active) @@ -2095,51 +2133,63 @@ static void Task_RayTakesFlightEnd(u8 taskId) } } -static void sub_81D81A4(u8 taskId) +#define tSmokeId data[0] +#define tTimer data[1] + +#define sSmokeId data[0] +#define sTimer data[1] + +static void Task_TakesFlight_CreateSmoke(u8 taskId) { s16 *data = gTasks[taskId].data; - if ((data[1] & 3) == 0) + if ((tTimer & 3) == 0) { u8 spriteId = CreateSprite(&sSpriteTemplate_TakesFlight_Smoke, - (sUnknown_0862AAB8[data[0]][0] * 4) + 120, - (sUnknown_0862AAB8[data[0]][1] * 4) + 80, + (sTakesFlight_SmokeCoords[tSmokeId][0] * 4) + 120, + (sTakesFlight_SmokeCoords[tSmokeId][1] * 4) + 80, 0); - gSprites[spriteId].data[0] = (s8)(data[0]); + gSprites[spriteId].sSmokeId = (s8)(tSmokeId); gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE; gSprites[spriteId].oam.priority = 2; InitSpriteAffineAnim(&gSprites[spriteId]); - if (data[0] == 9) + if (tSmokeId == MAX_SMOKE - 1) { DestroyTask(taskId); return; } else { - data[0]++; + tSmokeId++; } } - data[1]++; + tTimer++; } static void SpriteCB_TakesFlight_Smoke(struct Sprite *sprite) { - if (sprite->data[1] == 0) + if (sprite->sTimer == 0) { sprite->pos2.x = 0; sprite->pos2.y = 0; } else { - sprite->pos2.x += sUnknown_0862AAB8[sprite->data[0]][0]; - sprite->pos2.y += sUnknown_0862AAB8[sprite->data[0]][1]; + sprite->pos2.x += sTakesFlight_SmokeCoords[sprite->sSmokeId][0]; + sprite->pos2.y += sTakesFlight_SmokeCoords[sprite->sSmokeId][1]; } - sprite->data[1]++; - sprite->data[1] &= 0xF; + sprite->sTimer++; + sprite->sTimer &= 0xF; } +#undef tSmokeId +#undef tTimer + +#undef sSmokeId +#undef sTimer + static void InitDescendsSceneBgs(void) { ResetVramOamAndBgCntRegs(); From c7e685edff862afc34d0adee2d033c6006bef4b9 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Wed, 26 Aug 2020 18:59:51 -0400 Subject: [PATCH 4/7] Document third rayquaza scene --- include/gba/io_reg.h | 10 ++- src/rayquaza_scene.c | 191 ++++++++++++++++++++++++------------------- 2 files changed, 116 insertions(+), 85 deletions(-) diff --git a/include/gba/io_reg.h b/include/gba/io_reg.h index 071a89bc58..1daa99e1d7 100644 --- a/include/gba/io_reg.h +++ b/include/gba/io_reg.h @@ -553,6 +553,7 @@ #define WININ_WIN0_BG_ALL (WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3) #define WININ_WIN0_OBJ (1 << 4) #define WININ_WIN0_CLR (1 << 5) +#define WININ_WIN0_ALL (WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR) #define WININ_WIN1_BG0 (1 << 8) #define WININ_WIN1_BG1 (1 << 9) #define WININ_WIN1_BG2 (1 << 10) @@ -560,6 +561,7 @@ #define WININ_WIN1_BG_ALL (WININ_WIN1_BG0 | WININ_WIN1_BG1 | WININ_WIN1_BG2 | WININ_WIN1_BG3) #define WININ_WIN1_OBJ (1 << 12) #define WININ_WIN1_CLR (1 << 13) +#define WININ_WIN1_ALL (WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR) #define WINOUT_WIN01_BG0 (1 << 0) #define WINOUT_WIN01_BG1 (1 << 1) @@ -568,6 +570,7 @@ #define WINOUT_WIN01_BG_ALL (WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3) #define WINOUT_WIN01_OBJ (1 << 4) #define WINOUT_WIN01_CLR (1 << 5) +#define WINOUT_WIN01_ALL (WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR) #define WINOUT_WINOBJ_BG0 (1 << 8) #define WINOUT_WINOBJ_BG1 (1 << 9) #define WINOUT_WINOBJ_BG2 (1 << 10) @@ -575,6 +578,7 @@ #define WINOUT_WINOBJ_BG_ALL (WINOUT_WINOBJ_BG0 | WINOUT_WINOBJ_BG1 | WINOUT_WINOBJ_BG2 | WINOUT_WINOBJ_BG3) #define WINOUT_WINOBJ_OBJ (1 << 12) #define WINOUT_WINOBJ_CLR (1 << 13) +#define WINOUT_WINOBJ_ALL (WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR) #define WIN_RANGE(a, b) (((a) << 8) | (b)) #define WIN_RANGE2(a, b) ((b) | ((a) << 8)) @@ -585,9 +589,10 @@ #define BLDCNT_TGT1_BG1 (1 << 1) #define BLDCNT_TGT1_BG2 (1 << 2) #define BLDCNT_TGT1_BG3 (1 << 3) +#define BLDCNT_TGT1_BG_ALL (BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3) #define BLDCNT_TGT1_OBJ (1 << 4) #define BLDCNT_TGT1_BD (1 << 5) -#define BLDCNT_TGT1_ALL (BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD) +#define BLDCNT_TGT1_ALL (BLDCNT_TGT1_BG_ALL | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD) // Bits 6-7 select the special effect #define BLDCNT_EFFECT_NONE (0 << 6) // no special effect #define BLDCNT_EFFECT_BLEND (1 << 6) // 1st+2nd targets mixed (controlled by BLDALPHA) @@ -598,9 +603,10 @@ #define BLDCNT_TGT2_BG1 (1 << 9) #define BLDCNT_TGT2_BG2 (1 << 10) #define BLDCNT_TGT2_BG3 (1 << 11) +#define BLDCNT_TGT2_BG_ALL (BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3) #define BLDCNT_TGT2_OBJ (1 << 12) #define BLDCNT_TGT2_BD (1 << 13) -#define BLDCNT_TGT2_ALL (BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD) +#define BLDCNT_TGT2_ALL (BLDCNT_TGT2_BG_ALL | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD) // BLDALPHA #define BLDALPHA_BLEND(target1, target2) (((target2) << 8) | (target1)) diff --git a/src/rayquaza_scene.c b/src/rayquaza_scene.c index e4b6bed4df..bc7623e9f8 100644 --- a/src/rayquaza_scene.c +++ b/src/rayquaza_scene.c @@ -68,8 +68,8 @@ struct RayquazaScene u16 unk; // never read u8 animId; bool8 endEarly; - s16 field_2008; - s16 field_200A; + s16 revealedLightLine; + s16 revealedLightTimer; u8 unused[12]; }; @@ -90,14 +90,14 @@ static void DuoFight_AnimateRain(void); static void DuoFight_Lightning1(void); static void DuoFight_Lightning2(void); static void DuoFight_LightningLong(void); -static void SpriteCB_DuoFightPre_Groudon(struct Sprite *sprite); -static void SpriteCB_DuoFightPre_Kyogre(struct Sprite *sprite); -static void DuoFight_SlideGroudonDown(struct Sprite *sprite); -static void DuoFight_SlideKyogreDown(struct Sprite *sprite); -static void SpriteCB_DuoFight_Groudon(struct Sprite *sprite); -static void SpriteCB_DuoFight_Kyogre(struct Sprite *sprite); static u8 CreateDuoFightGroudonSprites(void); static u8 CreateDuoFightKyogreSprites(void); +static void SpriteCB_DuoFightPre_Groudon(struct Sprite *sprite); +static void SpriteCB_DuoFightPre_Kyogre(struct Sprite *sprite); +static void SpriteCB_DuoFight_Groudon(struct Sprite *sprite); +static void SpriteCB_DuoFight_Kyogre(struct Sprite *sprite); +static void DuoFight_SlideGroudonDown(struct Sprite *sprite); +static void DuoFight_SlideKyogreDown(struct Sprite *sprite); // RAY_ANIM_TAKES_FLIGHT static void Task_RayTakesFlightAnim(u8 taskId); @@ -110,8 +110,8 @@ static void SpriteCB_TakesFlight_Smoke(struct Sprite *sprite); static void Task_RayDescendsAnim(u8 taskId); static void Task_HandleRayDescends(u8 taskId); static void Task_RayDescendsEnd(u8 taskId); -static void sub_81D874C(struct Sprite *sprite); -static u8 sub_81D86CC(void); +static u8 CreateDescendsRayquazaSprite(void); +static void SpriteCB_Descends_Rayquaza(struct Sprite *sprite); // RAY_ANIM_CHARGES static void Task_RayChargesAnim(u8 taskId); @@ -1351,7 +1351,7 @@ static void Task_SetNextAnim(u8 taskId) static void sub_81D68C8(void) { - SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_ALL); SetGpuReg(REG_OFFSET_WINOUT, 0); SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, DISPLAY_WIDTH)); SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(24, DISPLAY_HEIGHT - 24)); @@ -1361,8 +1361,8 @@ static void sub_81D68C8(void) static void sub_81D6904(void) { - SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR); - SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_ALL); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_ALL); } #define tCounter data[0] @@ -2167,6 +2167,9 @@ static void Task_TakesFlight_CreateSmoke(u8 taskId) tTimer++; } +#undef tSmokeId +#undef tTimer + static void SpriteCB_TakesFlight_Smoke(struct Sprite *sprite) { if (sprite->sTimer == 0) @@ -2184,9 +2187,6 @@ static void SpriteCB_TakesFlight_Smoke(struct Sprite *sprite) sprite->sTimer &= 0xF; } -#undef tSmokeId -#undef tTimer - #undef sSmokeId #undef sTimer @@ -2217,8 +2217,8 @@ static void LoadDescendsSceneGfx(void) ResetTempTileDataBuffers(); DecompressAndCopyTileDataToVram(0, gRaySceneDescends_Light_Gfx, 0, 0, 0); DecompressAndCopyTileDataToVram(1, gRaySceneDescends_Bg_Gfx, 0, 0, 0); - while (FreeTempTileDataBuffersIfPossible()); - + while (FreeTempTileDataBuffersIfPossible()) + ; LZDecompressWram(gRaySceneDescends_Light_Tilemap, sRayScene->tilemapBuffers[0]); LZDecompressWram(gRaySceneDescends_Bg_Tilemap, sRayScene->tilemapBuffers[3]); CpuFastFill16(0, sRayScene->tilemapBuffers[2], BG_SCREEN_SIZE); @@ -2233,30 +2233,37 @@ static void LoadDescendsSceneGfx(void) LoadCompressedSpritePalette(&sSpritePal_Descends_Rayquaza); } +// 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; @@ -2266,10 +2273,10 @@ static void Task_RayDescendsAnim(u8 taskId) 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; + sRayScene->revealedLightLine = 0; + sRayScene->revealedLightTimer = 0; + tState = 0; + tTimer = 0; data[2] = 0; data[3] = 0; data[4] = 0x1000; @@ -2279,56 +2286,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]++; + 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; @@ -2347,71 +2359,84 @@ 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(&sSpriteTemplate_Descends_Rayquaza, 160, 0, 0); s16 *data = gSprites[spriteId].data; - data[0] = CreateSprite(&sSpriteTemplate_Descends_RayquazaTail, 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++; } +#undef sTailSpriteId +#undef sTimer +#undef sXMovePeriod +#undef sYMovePeriod + static void InitChargesSceneBgs(void) { ResetVramOamAndBgCntRegs(); From e63297138dbb933ff2a6620ad641d7deedd085fa Mon Sep 17 00:00:00 2001 From: GriffinR Date: Thu, 27 Aug 2020 04:21:59 -0400 Subject: [PATCH 5/7] Document fourth rayquaza scene --- src/rayquaza_scene.c | 148 ++++++++++++++++++++++++++----------------- 1 file changed, 90 insertions(+), 58 deletions(-) diff --git a/src/rayquaza_scene.c b/src/rayquaza_scene.c index bc7623e9f8..dcbc87c8a7 100644 --- a/src/rayquaza_scene.c +++ b/src/rayquaza_scene.c @@ -90,8 +90,10 @@ static void DuoFight_AnimateRain(void); static void DuoFight_Lightning1(void); static void DuoFight_Lightning2(void); static void DuoFight_LightningLong(void); -static u8 CreateDuoFightGroudonSprites(void); -static u8 CreateDuoFightKyogreSprites(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 *sprite); static void SpriteCB_DuoFightPre_Kyogre(struct Sprite *sprite); static void SpriteCB_DuoFight_Groudon(struct Sprite *sprite); @@ -117,9 +119,9 @@ static void SpriteCB_Descends_Rayquaza(struct Sprite *sprite); static void Task_RayChargesAnim(u8 taskId); static void Task_HandleRayCharges(u8 taskId); static void Task_RayChargesEnd(u8 taskId); -static void sub_81D8AD8(u8 taskId); -static void sub_81D8B2C(u8 taskId); -static void sub_81D8BB4(void); +static void Task_RayCharges_ShakeRayquaza(u8 taskId); +static void Task_RayCharges_FlyOffscreen(u8 taskId); +static void RayCharges_AnimateBg(void); // RAY_ANIM_CHASES_AWAY static void Task_RayChasesAwayAnim(u8 taskId); @@ -1349,7 +1351,9 @@ static void Task_SetNextAnim(u8 taskId) } } -static void sub_81D68C8(void) +// The cutscene window is cropped to a narrower view, with black borders on each vertical edge +// This function is used in scenes where sprites in these borders need to be hidden +static void SetWindowsHideVertBorders(void) { SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_ALL); SetGpuReg(REG_OFFSET_WINOUT, 0); @@ -1359,7 +1363,7 @@ static void sub_81D68C8(void) gPlttBufferFaded[0] = 0; } -static void sub_81D6904(void) +static void ResetWindowDimensions(void) { SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_ALL); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_ALL); @@ -1406,7 +1410,7 @@ static void Task_HandleDuoFightPre(u8 taskId) } } -static u8 CreateDuoFightPreGroudonSprites(void) +static u8 DuoFightPre_CreateGroudonSprites(void) { u8 spriteId; s16 *data; @@ -1458,7 +1462,7 @@ static void SpriteCB_DuoFightPre_Groudon(struct Sprite *sprite) } } -static u8 CreateDuoFightPreKyogreSprites(void) +static u8 DuoFightPre_CreateKyogreSprites(void) { u8 spriteId; s16 *data; @@ -1608,14 +1612,14 @@ static void Task_DuoFightAnim(u8 taskId) tHelperTaskId = CreateTask(Task_DuoFight_AnimateClouds, 0); if (sRayScene->animId == RAY_ANIM_DUO_FIGHT_PRE) { - tGroudonSpriteId = CreateDuoFightPreGroudonSprites(); - tKyogreSpriteId = CreateDuoFightPreKyogreSprites(); + tGroudonSpriteId = DuoFightPre_CreateGroudonSprites(); + tKyogreSpriteId = DuoFightPre_CreateKyogreSprites(); gTasks[taskId].func = Task_HandleDuoFightPre; } else { - tGroudonSpriteId = CreateDuoFightGroudonSprites(); - tKyogreSpriteId = CreateDuoFightKyogreSprites(); + tGroudonSpriteId = DuoFight_CreateGroudonSprites(); + tKyogreSpriteId = DuoFight_CreateKyogreSprites(); gTasks[taskId].func = Task_HandleDuoFight; StopMapMusic(); } @@ -1798,7 +1802,7 @@ static void Task_DuoFightEnd(u8 taskId) } } -static u8 CreateDuoFightGroudonSprites(void) +static u8 DuoFight_CreateGroudonSprites(void) { u8 spriteId; s16 *data; @@ -1862,7 +1866,7 @@ static void DuoFight_SlideGroudonDown(struct Sprite *sprite) } } -static u8 CreateDuoFightKyogreSprites(void) +static u8 DuoFight_CreateKyogreSprites(void) { u8 spriteId; s16 *data; @@ -2277,7 +2281,7 @@ static void Task_RayDescendsAnim(u8 taskId) sRayScene->revealedLightTimer = 0; tState = 0; tTimer = 0; - data[2] = 0; + data[2] = 0; // Below data assignments do nothing data[3] = 0; data[4] = 0x1000; gTasks[taskId].func = Task_HandleRayDescends; @@ -2474,110 +2478,136 @@ static void LoadChargesSceneGfx(void) 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; InitChargesSceneBgs(); LoadChargesSceneGfx(); - sub_81D68C8(); + 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_OP_BASYU); - 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; } } -// These two, BG scrolling for Rayquaza charge -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); } @@ -2585,16 +2615,18 @@ 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; } } +#undef tRayquazaTaskId + static void InitChasesAwaySceneBgs(void) { ResetVramOamAndBgCntRegs(); @@ -2643,7 +2675,7 @@ static void Task_RayChasesAwayAnim(u8 taskId) s16 *data = gTasks[taskId].data; InitChasesAwaySceneBgs(); LoadChasesAwaySceneGfx(); - sub_81D68C8(); + 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)); @@ -2743,7 +2775,7 @@ static void Task_RayChasesAwayEnd(u8 taskId) if (data[1] == 0) { SetVBlankCallback(NULL); - sub_81D6904(); + ResetWindowDimensions(); ResetSpriteData(); FreeAllSpritePalettes(); DestroyTask(data[2]); From a220d3986f9addc066e7c3be294cd00fb14d261f Mon Sep 17 00:00:00 2001 From: GriffinR Date: Thu, 27 Aug 2020 14:47:28 -0400 Subject: [PATCH 6/7] Document fifth rayquaza scene --- src/rayquaza_scene.c | 487 +++++++++++++++++++++++++------------------ 1 file changed, 280 insertions(+), 207 deletions(-) diff --git a/src/rayquaza_scene.c b/src/rayquaza_scene.c index dcbc87c8a7..bd31ec6ef3 100644 --- a/src/rayquaza_scene.c +++ b/src/rayquaza_scene.c @@ -77,15 +77,15 @@ static EWRAM_DATA struct RayquazaScene *sRayScene = NULL; static void CB2_InitRayquazaScene(void); static void CB2_RayquazaScene(void); -static void Task_EndAfterFadeScreen(u8 taskId); +static void Task_EndAfterFadeScreen(u8); // RAY_ANIM_DUO_FIGHT_PRE / RAY_ANIM_DUO_FIGHT -static void Task_DuoFightAnim(u8 taskId); -static void Task_HandleDuoFight(u8 taskId); -static void Task_DuoFightEnd(u8 taskId); -static void DuoFightEnd(u8 taskId, s8 palDelay); -static void Task_DuoFight_AnimateClouds(u8 taskId); -static void DuoFight_PanOffScene(u8 taskId); +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); @@ -94,50 +94,50 @@ 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 *sprite); -static void SpriteCB_DuoFightPre_Kyogre(struct Sprite *sprite); -static void SpriteCB_DuoFight_Groudon(struct Sprite *sprite); -static void SpriteCB_DuoFight_Kyogre(struct Sprite *sprite); -static void DuoFight_SlideGroudonDown(struct Sprite *sprite); -static void DuoFight_SlideKyogreDown(struct Sprite *sprite); +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 taskId); -static void Task_HandleRayTakesFlight(u8 taskId); -static void Task_RayTakesFlightEnd(u8 taskId); -static void Task_TakesFlight_CreateSmoke(u8 taskId); -static void SpriteCB_TakesFlight_Smoke(struct Sprite *sprite); +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 taskId); -static void Task_HandleRayDescends(u8 taskId); -static void Task_RayDescendsEnd(u8 taskId); +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 *sprite); +static void SpriteCB_Descends_Rayquaza(struct Sprite *); // RAY_ANIM_CHARGES -static void Task_RayChargesAnim(u8 taskId); -static void Task_HandleRayCharges(u8 taskId); -static void Task_RayChargesEnd(u8 taskId); -static void Task_RayCharges_ShakeRayquaza(u8 taskId); -static void Task_RayCharges_FlyOffscreen(u8 taskId); +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 taskId); -static void Task_HandleRayChasesAway(u8 taskId); -static void Task_RayChasesAwayEnd(u8 taskId); -static void sub_81D8FB0(u8 taskId); -static void sub_81D94D4(u8 taskId); -static void sub_81D93D8(u8 taskId); -static void sub_81D90A8(u8 taskId); -static void sub_81D98B4(u8 taskId); -static void sub_81D9420(struct Sprite *sprite); -static void sub_81D97E0(struct Sprite *sprite); -static void sub_81D9528(struct Sprite *sprite); -static void SpriteCB_ChasesAway_Rayquaza(struct Sprite *sprite); -static void sub_81D9338(struct Sprite *sprite); -static void sub_81D9868(struct Sprite *sprite, u8 animNum, s16 x, s16 y); +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[] = { @@ -2091,12 +2091,12 @@ static void Task_HandleRayTakesFlight(u8 taskId) tTimer = 0; tState++; } - SetBgAffine(2, 0x7800, 0x1800, 0x78, tYCoord + 32, tScale, tScale, 0); + SetBgAffine(2, 0x7800, 0x1800, 120, tYCoord + 32, tScale, tScale, 0); break; case 2: // Float up and down tTimer++; - SetBgAffine(2, 0x7800, 0x1800, 0x78, tYCoord + 32 + (tYOffset >> 2), tScale, tScale, 0); + SetBgAffine(2, 0x7800, 0x1800, 120, tYCoord + 32 + (tYOffset >> 2), tScale, tScale, 0); tYOffset += tYOffsetDir; if (tYOffset == 12 || tYOffset == -12) { @@ -2111,7 +2111,7 @@ static void Task_HandleRayTakesFlight(u8 taskId) case 3: // Fly away, fade out tScale += 16; - SetBgAffine(2, 0x7800, 0x1800, 0x78, tYCoord + 32, tScale, tScale, 0); + SetBgAffine(2, 0x7800, 0x1800, 120, tYCoord + 32, tScale, tScale, 0); Task_RayTakesFlightEnd(taskId); break; } @@ -2653,7 +2653,6 @@ static void LoadChasesAwaySceneGfx(void) DecompressAndCopyTileDataToVram(0, gRaySceneChasesAway_Bg_Gfx, 0, 0, 0); while (FreeTempTileDataBuffersIfPossible()) ; - LZDecompressWram(gRaySceneChasesAway_Ring_Tilemap, sRayScene->tilemapBuffers[1]); LZDecompressWram(gRaySceneChasesAway_Bg_Tilemap, sRayScene->tilemapBuffers[0]); LZDecompressWram(gRaySceneChasesAway_Ring_Map, sRayScene->tilemapBuffers[2]); @@ -2670,6 +2669,10 @@ static void LoadChasesAwaySceneGfx(void) 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; @@ -2681,61 +2684,66 @@ static void Task_RayChasesAwayAnim(u8 taskId) 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) { BlendPalettesGradually(0x0000FFFE, 0, 16, 0, RGB_WHITEALPHA, 0, 0); BlendPalettesGradually(0xFFFF0000, 0, 16, 0, RGB_BLACK, 0, 1); @@ -2743,141 +2751,182 @@ static void Task_HandleRayChasesAway(u8 taskId) } 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); 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(&sSpriteTemplate_ChasesAway_Groudon, 64, 120, 0); - spriteData = gSprites[taskData[3]].data; + tGroudonSpriteId = CreateSprite(&sSpriteTemplate_ChasesAway_Groudon, 64, 120, 0); + spriteData = gSprites[tGroudonSpriteId].data; spriteData[0] = CreateSprite(&sSpriteTemplate_ChasesAway_GroudonTail, 16, 130, 0); - gSprites[taskData[3]].oam.priority = 1; + gSprites[tGroudonSpriteId].oam.priority = 1; gSprites[spriteData[0]].oam.priority = 1; - taskData[4] = CreateSprite(&sSpriteTemplate_ChasesAway_Kyogre, 160, 128, 1); - spriteData = gSprites[taskData[4]].data; + 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[taskData[4]].oam.priority = 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(&sSpriteTemplate_ChasesAway_Rayquaza, 120, -65, 0); - spriteData = gSprites[taskData[5]].data; + tRayquazaSpriteId = CreateSprite(&sSpriteTemplate_ChasesAway_Rayquaza, 120, -65, 0); + spriteData = gSprites[tRayquazaSpriteId].data; spriteData[0] = CreateSprite(&sSpriteTemplate_ChasesAway_RayquazaTail, 120, -113, 0); - gSprites[taskData[5]].oam.priority = 1; + 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) { @@ -2902,19 +2951,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) { @@ -2951,145 +3000,169 @@ static void sub_81D9528(struct Sprite *sprite) sprite->data[4]++; } +#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_BT_START); - 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_JIDO_DOA); - 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; + tScale += tScaleSpeed; + tSoundTimer++; + if (tScaleTimer % 3 == 0 && tScaleSpeed != 4) + tScaleSpeed -= 2; - data[3]++; - SetBgAffine(2, 0x4000, 0x4000, 0x78, 0x40, 0x100 - data[1], 0x100 - data[1], 0); - if (data[1] > 255) + 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; From 38d4fc9c17467bfbb206116e4bef4648cedfe3d4 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Thu, 27 Aug 2020 15:36:48 -0400 Subject: [PATCH 7/7] Clean up rayquaza scene documentation --- graphics/rayquaza_scene/scene_1/kyogre.png | Bin 1110 -> 1076 bytes .../{kyogre_fin.png => kyogre_dorsal_fin.png} | Bin ...e_shoulder.png => kyogre_pectoral_fin.png} | Bin .../scene_4/{rayquaza2.bin => orbs.bin} | Bin graphics/rayquaza_scene/scene_5/bg.bin | Bin 2048 -> 2048 bytes graphics/rayquaza_scene/scene_5/light.bin | Bin 0 -> 2048 bytes .../scene_5/{bg.png => light.png} | Bin graphics/rayquaza_scene/scene_5/ring.bin | Bin 2048 -> 256 bytes graphics/rayquaza_scene/scene_5/ring_map.bin | Bin 256 -> 0 bytes include/graphics.h | 46 +-- src/data/graphics/rayquaza_scene.h | 46 +-- src/palette.c | 14 +- src/rayquaza_scene.c | 304 +++++++++--------- 13 files changed, 213 insertions(+), 197 deletions(-) rename graphics/rayquaza_scene/scene_1/{kyogre_fin.png => kyogre_dorsal_fin.png} (100%) rename graphics/rayquaza_scene/scene_1/{kyogre_shoulder.png => kyogre_pectoral_fin.png} (100%) rename graphics/rayquaza_scene/scene_4/{rayquaza2.bin => orbs.bin} (100%) create mode 100644 graphics/rayquaza_scene/scene_5/light.bin rename graphics/rayquaza_scene/scene_5/{bg.png => light.png} (100%) delete mode 100644 graphics/rayquaza_scene/scene_5/ring_map.bin diff --git a/graphics/rayquaza_scene/scene_1/kyogre.png b/graphics/rayquaza_scene/scene_1/kyogre.png index 0f2e27e4e2b54e5a426a908a7f76fbd549e3be5e..7ed02a134b0706101e018d003e9b3c28a9f2f877 100644 GIT binary patch delta 1029 zcmV+g1p52d2($-r$<}RF&aBPf1Ye*BR)>fPtC2Y+z;e~ZuhYV9(31)Soc7hwuRXB zK$g8JPJF=m79bA@G2xsSK7a}cRtfw;%()qhDEz>Xne?VKBIEU=M zk9_cMIIQm;IiTjN?^^IqeITnBKB&Pb){iV0;0H1W(<~(2XD~;th8-}?!f{dn*=AIA zalDok7s1GN7kwG=%f7mQjgek`eAfd&P2aC)WfmRG=W01sPrWJ!%5x7=qMWE4S zY_ZW;bfD3yR4NTXG{pdZZ9)eWftQWO^72x}1I=Yv-I4{#@^!UdBx;Rh*)~`zB`vyV zOgBKgDlK5@QA|C6L}?3HPs$KfpG1K90C&k&9l&h{fWeAe8tfy$e|`;|UM6J+_?g*rk_0 zflSdcr*pE9+N~xa@h&30VsuCApY&rMlJMS_8Jw?xy-{RYsVvH}$Va>0%G8#Nzku@mVm$VVA2HXoD^!hCcNf_#)D z+=6JGX~%eoj*WxTUOuGxvj$!~R6YXz+xZwp`QX2v4-w_Vc(U}$Rugaw~&C$hsrm38^p@bV&hK@W{ z-$WX=p#E`DB&TQl1$CanYq`j6OS_%6@$H*t`34|QvBjiN%C^91xPPtv?K;g5i;N$s zvB>%%iuW2=TR&(f-;a)J(SG3nDfAUv_z?R6B=Q6AzIMhS zdoGu(L4wA422mWeL7pGlAm@iR$n!%RgnoPnVy5K(04WhR00000NkvXXu0mjfv*_nQ delta 1063 zcmV+?1laqu2-XN8iBL{Q4GJ0x0000DNk~Le0000$0001Z1Oos70I+W9Es-HVf8j|) zK~zYIwU<3_6G0G$PjZsZj%a9+)<{^ELXmTo3KsBAzy5(bkD1R#*B=6O4WSB>>USmfYh@tH-7& zoAYO$ydM@swnQ7NAN@U*CS=a{HBiSXagxE{pfB?<&2|1+0z+I7A<)L=;DFTjQ~?3N zs@SMruZylvHh=gE4~PVsX`nQOR0AqNczTW$@Y?rVt((;t@UlRo1$W(yfl@OCc&!_v zE)wEiDcuoB&pD2=)pGk{W`>k6<+1$967(x8(4p0c!gi@I{G+96pI9iUDWG0qDP-bpFu;Vdx`XQ8l;C4UA_cVTvALi%yA-?c8 zepnBJ2xon;v;dW$4FSZ7g{VM1|SNseS`$W`+Ssai1RkXHfW*kwGM&p{oLrlR;L!g=uj+GQio1q38e%6PbmKB zZGJpY2Ox@cNFwm;wd_N)K^ diff --git a/graphics/rayquaza_scene/scene_1/kyogre_fin.png b/graphics/rayquaza_scene/scene_1/kyogre_dorsal_fin.png similarity index 100% rename from graphics/rayquaza_scene/scene_1/kyogre_fin.png rename to graphics/rayquaza_scene/scene_1/kyogre_dorsal_fin.png diff --git a/graphics/rayquaza_scene/scene_1/kyogre_shoulder.png b/graphics/rayquaza_scene/scene_1/kyogre_pectoral_fin.png similarity index 100% rename from graphics/rayquaza_scene/scene_1/kyogre_shoulder.png rename to graphics/rayquaza_scene/scene_1/kyogre_pectoral_fin.png diff --git a/graphics/rayquaza_scene/scene_4/rayquaza2.bin b/graphics/rayquaza_scene/scene_4/orbs.bin similarity index 100% rename from graphics/rayquaza_scene/scene_4/rayquaza2.bin rename to graphics/rayquaza_scene/scene_4/orbs.bin diff --git a/graphics/rayquaza_scene/scene_5/bg.bin b/graphics/rayquaza_scene/scene_5/bg.bin index b9e86b907b59f562150a17617d4e033e47d60d3c..22f5530bae167a761cc878e892d2f9b02f7745e9 100644 GIT binary patch literal 2048 zcmeIuAqs#{7zANo(_|7BOg59rWHFgc-v2T(SD5zT=gSjz+t9i;#$)*xkN%BE|HPxe nfYl&Ak#+L#3MiW>}X!zbjpZ@j@XPxR>0*~+i4 zfrc7sywi^vF=Rl0%TF}bi(d7%)4%b`3sWXr{#`T8wa{{>U$S7%jCY&=+rP(t_xl9? GcLE>xH6nWe diff --git a/graphics/rayquaza_scene/scene_5/light.bin b/graphics/rayquaza_scene/scene_5/light.bin new file mode 100644 index 0000000000000000000000000000000000000000..b9e86b907b59f562150a17617d4e033e47d60d3c GIT binary patch literal 2048 zcmeIySx*8n7=_`3yvT&b2pUkrGGWmu5J3Y<5CUk}0%~OW|35_r4URIyy^*gsz39{B zw5dm)Ki#yc19^pfI+S0AyfYl&Ak#+L#3MiW>}X!zbjpZ@j@XPxR>0*~+i4 zfrc7sywi^vF=Rl0%TF}bi(d7%)4%b`3sWXr{#`T8wa{{>U$S7%jCY&=+rP(t_xl9? GcLE>xH6nWe literal 0 HcmV?d00001 diff --git a/graphics/rayquaza_scene/scene_5/bg.png b/graphics/rayquaza_scene/scene_5/light.png similarity index 100% rename from graphics/rayquaza_scene/scene_5/bg.png rename to graphics/rayquaza_scene/scene_5/light.png diff --git a/graphics/rayquaza_scene/scene_5/ring.bin b/graphics/rayquaza_scene/scene_5/ring.bin index 22f5530bae167a761cc878e892d2f9b02f7745e9..812fda11de5320a4e91d9531a964ac96506c0a34 100644 GIT binary patch literal 256 zcmZQzpaNiIVrF4wgB!%o0b+7;!34M=3?3Mt7sB9!@ueUPX&7Gy!r+JT#l%4@2}u~A PK|oMQSVR=grGx> 8], 1); StartSpriteAnim(&gSprites[data[0] & 0xFF], 2); @@ -1594,8 +1598,8 @@ static void LoadDuoFightSceneGfx(void) LoadCompressedSpriteSheet(&sSpriteSheet_DuoFight_GroudonShoulder); LoadCompressedSpriteSheet(&sSpriteSheet_DuoFight_GroudonClaw); LoadCompressedSpriteSheet(&sSpriteSheet_DuoFight_Kyogre); - LoadCompressedSpriteSheet(&sSpriteSheet_DuoFight_KyogreShoulder); - LoadCompressedSpriteSheet(&sSpriteSheet_DuoFight_KyogreFin); + LoadCompressedSpriteSheet(&sSpriteSheet_DuoFight_KyogrePectoralFin); + LoadCompressedSpriteSheet(&sSpriteSheet_DuoFight_KyogreDorsalFin); LoadCompressedSpritePalette(&sSpritePal_DuoFight_Groudon); LoadCompressedSpritePalette(&sSpritePal_DuoFight_Kyogre); } @@ -1608,7 +1612,7 @@ static void Task_DuoFightAnim(u8 taskId) LoadDuoFightSceneGfx(); CpuFastFill16(0, gScanlineEffectRegBuffers, sizeof(gScanlineEffectRegBuffers)); ScanlineEffect_SetParams(sScanlineParams_DuoFight_Clouds); - tCounter = 0; + tTimer = 0; tHelperTaskId = CreateTask(Task_DuoFight_AnimateClouds, 0); if (sRayScene->animId == RAY_ANIM_DUO_FIGHT_PRE) { @@ -1695,22 +1699,22 @@ static void Task_HandleDuoFight(u8 taskId) DuoFight_AnimateRain(); if (!gPaletteFade.active) { - s16 counter = tCounter; - if (counter == 32 || counter == 112) + s16 frame = tTimer; + if (frame == 32 || frame == 112) { DuoFight_Lightning1(); } - else if (counter == 216) + else if (frame == 216) { DuoFight_Lightning2(); } - else if (counter == 220) + else if (frame == 220) { DuoFight_LightningLong(); } else { - switch (counter) + switch (frame) { case 412: DuoFightEnd(taskId, 2); @@ -1726,7 +1730,7 @@ static void Task_HandleDuoFight(u8 taskId) } } - tCounter++; + tTimer++; } } @@ -1771,10 +1775,10 @@ static void DuoFight_PanOffScene(u8 taskId) if (GetBgY(1) == 0 || bgY > 0x8000) ChangeBgY(1, 0x400, 2); - if (tCounter != 16) + if (tTimer != 16) { - tCounter++; - SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - tCounter, tCounter)); + tTimer++; + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - tTimer, tTimer)); } } @@ -1797,7 +1801,7 @@ static void Task_DuoFightEnd(u8 taskId) ScanlineEffect_Stop(); ResetSpriteData(); FreeAllSpritePalettes(); - tCounter = 0; + tTimer = 0; gTasks[taskId].func = Task_SetNextAnim; } } @@ -1883,8 +1887,8 @@ static u8 DuoFight_CreateKyogreSprites(void) 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_KyogreShoulder, 198, 132, 0) << 8; - data[4] |= CreateSprite(&sSpriteTemplate_DuoFight_KyogreFin, 190, 120, 1); + 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); @@ -1978,7 +1982,7 @@ static void DuoFight_SlideKyogreDown(struct Sprite *sprite) } } -#undef tCounter +#undef tTimer #undef tHelperTaskId #undef tGroudonSpriteId #undef tKyogreSpriteId @@ -1987,6 +1991,9 @@ static void DuoFight_SlideKyogreDown(struct Sprite *sprite) #undef sGroudonShoulderSpriteId #undef sGroudonClawSpriteId + +// RAY_ANIM_TAKES_FLIGHT + #define tState data[0] #define tTimer data[1] #define tScale data[2] @@ -2194,6 +2201,9 @@ static void SpriteCB_TakesFlight_Smoke(struct Sprite *sprite) #undef sSmokeId #undef sTimer + +// RAY_ANIM_DESCENDS + static void InitDescendsSceneBgs(void) { ResetVramOamAndBgCntRegs(); @@ -2441,6 +2451,9 @@ static void SpriteCB_Descends_Rayquaza(struct Sprite *sprite) #undef sXMovePeriod #undef sYMovePeriod + +// RAY_ANIM_CHARGES + static void InitChargesSceneBgs(void) { ResetVramOamAndBgCntRegs(); @@ -2471,7 +2484,7 @@ static void LoadChargesSceneGfx(void) DecompressAndCopyTileDataToVram(3, gRaySceneCharges_Bg_Gfx, 0, 0, 0); while (FreeTempTileDataBuffersIfPossible()) ; - LZDecompressWram(gRaySceneCharges_Rayquaza2_Tilemap, sRayScene->tilemapBuffers[0]); + 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]); @@ -2627,6 +2640,9 @@ static void Task_RayChargesEnd(u8 taskId) #undef tRayquazaTaskId + +// RAY_ANIM_CHASES_AWAY + static void InitChasesAwaySceneBgs(void) { ResetVramOamAndBgCntRegs(); @@ -2650,12 +2666,12 @@ static void LoadChasesAwaySceneGfx(void) { ResetTempTileDataBuffers(); DecompressAndCopyTileDataToVram(2, gRaySceneChasesAway_Ring_Gfx, 0, 0, 0); - DecompressAndCopyTileDataToVram(0, gRaySceneChasesAway_Bg_Gfx, 0, 0, 0); + DecompressAndCopyTileDataToVram(0, gRaySceneChasesAway_Light_Gfx, 0, 0, 0); while (FreeTempTileDataBuffersIfPossible()) ; - LZDecompressWram(gRaySceneChasesAway_Ring_Tilemap, sRayScene->tilemapBuffers[1]); - LZDecompressWram(gRaySceneChasesAway_Bg_Tilemap, sRayScene->tilemapBuffers[0]); - LZDecompressWram(gRaySceneChasesAway_Ring_Map, sRayScene->tilemapBuffers[2]); + 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);