diff --git a/graphics/title_screen/blank_obj.png b/graphics/title_screen/blank_obj.png deleted file mode 100644 index 682c22432..000000000 Binary files a/graphics/title_screen/blank_obj.png and /dev/null differ diff --git a/graphics/title_screen/blank_sprite.png b/graphics/title_screen/blank_sprite.png new file mode 100644 index 000000000..6377d7608 Binary files /dev/null and b/graphics/title_screen/blank_sprite.png differ diff --git a/graphics/title_screen/firered/blank_fire_sprite.png b/graphics/title_screen/firered/blank_flames.png similarity index 100% rename from graphics/title_screen/firered/blank_fire_sprite.png rename to graphics/title_screen/firered/blank_flames.png diff --git a/graphics/title_screen/firered/fire_sprite.png b/graphics/title_screen/firered/fire_sprite.png deleted file mode 100644 index 66a57a899..000000000 Binary files a/graphics/title_screen/firered/fire_sprite.png and /dev/null differ diff --git a/graphics/title_screen/firered/flames.png b/graphics/title_screen/firered/flames.png new file mode 100644 index 000000000..2581482fd Binary files /dev/null and b/graphics/title_screen/firered/flames.png differ diff --git a/graphics/title_screen/firered/fire_sprite.pal b/graphics/title_screen/firered/slash.pal similarity index 100% rename from graphics/title_screen/firered/fire_sprite.pal rename to graphics/title_screen/firered/slash.pal diff --git a/graphics/title_screen/firered/slash_sprite.pal b/graphics/title_screen/firered/slash_sprite.pal deleted file mode 100644 index 815547f37..000000000 --- a/graphics/title_screen/firered/slash_sprite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -82 205 180 -0 0 0 -255 255 189 -255 246 139 -255 213 65 -255 172 0 -197 164 49 -115 180 139 -98 189 156 -90 197 164 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -82 205 180 diff --git a/graphics/title_screen/leafgreen/blank_leaf_sprite.png b/graphics/title_screen/leafgreen/blank_leaf_sprite.png deleted file mode 100644 index d783c1204..000000000 Binary files a/graphics/title_screen/leafgreen/blank_leaf_sprite.png and /dev/null differ diff --git a/graphics/title_screen/leafgreen/leaf_sprite.png b/graphics/title_screen/leafgreen/leaf_sprite.png deleted file mode 100644 index d4f7dd622..000000000 Binary files a/graphics/title_screen/leafgreen/leaf_sprite.png and /dev/null differ diff --git a/graphics/title_screen/leafgreen/leaves.png b/graphics/title_screen/leafgreen/leaves.png new file mode 100644 index 000000000..0887ab78e Binary files /dev/null and b/graphics/title_screen/leafgreen/leaves.png differ diff --git a/graphics/title_screen/leafgreen/leaf_sprite.pal b/graphics/title_screen/leafgreen/slash.pal similarity index 100% rename from graphics/title_screen/leafgreen/leaf_sprite.pal rename to graphics/title_screen/leafgreen/slash.pal diff --git a/graphics/title_screen/leafgreen/slash_sprite.pal b/graphics/title_screen/leafgreen/slash_sprite.pal deleted file mode 100644 index 9a13f7dad..000000000 --- a/graphics/title_screen/leafgreen/slash_sprite.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -230 123 90 -16 164 74 -148 255 57 -98 222 57 -57 189 65 -230 255 230 -148 255 205 -82 246 131 -180 180 115 -255 205 148 -246 172 123 -238 148 106 -0 0 0 -0 0 0 -0 0 0 -230 123 90 diff --git a/graphics/title_screen/leafgreen/streak.png b/graphics/title_screen/leafgreen/streak.png new file mode 100644 index 000000000..8a66474c2 Binary files /dev/null and b/graphics/title_screen/leafgreen/streak.png differ diff --git a/graphics/title_screen/slash.png b/graphics/title_screen/slash.png new file mode 100644 index 000000000..5df5716a5 Binary files /dev/null and b/graphics/title_screen/slash.png differ diff --git a/graphics/title_screen/slash_sprite.png b/graphics/title_screen/slash_sprite.png deleted file mode 100644 index 260e00a01..000000000 Binary files a/graphics/title_screen/slash_sprite.png and /dev/null differ diff --git a/graphics/title_screen/unk_83BFBE4.bin b/graphics/title_screen/unused1.bin similarity index 100% rename from graphics/title_screen/unk_83BFBE4.bin rename to graphics/title_screen/unused1.bin diff --git a/graphics/title_screen/unk_83C0408.bin b/graphics/title_screen/unused2.bin similarity index 100% rename from graphics/title_screen/unk_83C0408.bin rename to graphics/title_screen/unused2.bin diff --git a/graphics/title_screen/unk_83C0C00.bin b/graphics/title_screen/unused3.bin similarity index 100% rename from graphics/title_screen/unk_83C0C00.bin rename to graphics/title_screen/unused3.bin diff --git a/graphics/title_screen/unk_83C139C.bin b/graphics/title_screen/unused4.bin similarity index 100% rename from graphics/title_screen/unk_83C139C.bin rename to graphics/title_screen/unused4.bin diff --git a/graphics/title_screen/unk_83C1BB8.bin b/graphics/title_screen/unused5.bin similarity index 100% rename from graphics/title_screen/unk_83C1BB8.bin rename to graphics/title_screen/unused5.bin diff --git a/graphics/title_screen/unk_83C2380.bin b/graphics/title_screen/unused6.bin similarity index 100% rename from graphics/title_screen/unk_83C2380.bin rename to graphics/title_screen/unused6.bin diff --git a/include/graphics.h b/include/graphics.h index 31c168b65..e86ea2e27 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -4310,8 +4310,8 @@ extern const u8 gGraphics_TitleScreen_BoxArtMonMap[]; extern u16 gGraphics_TitleScreen_BackgroundPals[]; // If this is const, title_screen.c does not match extern const u8 gGraphics_TitleScreen_CopyrightPressStartTiles[]; extern const u8 gGraphics_TitleScreen_CopyrightPressStartMap[]; -extern const u16 gGraphics_TitleScreen_FireOrLeafPals[]; -extern const u32 gGraphics_TitleScreen_BlankObjTiles[]; +extern const u16 gTitleScreen_Slash_Pal[]; +extern const u32 gTitleScreen_BlankSprite_Tiles[]; // battle_gfx_sfx_util extern const u32 gHealthboxSinglesPlayerGfx[]; diff --git a/src/graphics.c b/src/graphics.c index c188da6b4..0cdca0e46 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1364,8 +1364,7 @@ const u8 gGraphics_TitleScreen_BoxArtMonMap[] = INCBIN_U8("graphics/title_screen const u16 gGraphics_TitleScreen_BackgroundPals[] = INCBIN_U16("graphics/title_screen/firered/background.gbapal"); const u8 gGraphics_TitleScreen_CopyrightPressStartTiles[] = INCBIN_U8("graphics/title_screen/copyright_press_start.4bpp.lz"); const u8 gGraphics_TitleScreen_CopyrightPressStartMap[] = INCBIN_U8("graphics/title_screen/copyright_press_start.bin.lz"); -const u16 gGraphics_TitleScreen_FireOrLeafPals[] = INCBIN_U16("graphics/title_screen/firered/fire_sprite.gbapal"); -const u32 gGraphics_TitleScreen_BlankObjTiles[] = INCBIN_U32("graphics/title_screen/blank_obj.4bpp.lz"); +const u16 gTitleScreen_Slash_Pal[] = INCBIN_U16("graphics/title_screen/firered/slash.gbapal"); #endif #ifdef LEAFGREEN @@ -1378,10 +1377,11 @@ const u8 gGraphics_TitleScreen_BoxArtMonMap[] = INCBIN_U8("graphics/title_screen const u16 gGraphics_TitleScreen_BackgroundPals[] = INCBIN_U16("graphics/title_screen/leafgreen/background.gbapal"); const u8 gGraphics_TitleScreen_CopyrightPressStartTiles[] = INCBIN_U8("graphics/title_screen/copyright_press_start.4bpp.lz"); const u8 gGraphics_TitleScreen_CopyrightPressStartMap[] = INCBIN_U8("graphics/title_screen/copyright_press_start.bin.lz"); -const u16 gGraphics_TitleScreen_FireOrLeafPals[] = INCBIN_U16("graphics/title_screen/leafgreen/leaf_sprite.gbapal"); -const u32 gGraphics_TitleScreen_BlankObjTiles[] = INCBIN_U32("graphics/title_screen/blank_obj.4bpp.lz"); +const u16 gTitleScreen_Slash_Pal[] = INCBIN_U16("graphics/title_screen/leafgreen/slash.gbapal"); #endif +const u32 gTitleScreen_BlankSprite_Tiles[] = INCBIN_U32("graphics/title_screen/blank_sprite.4bpp.lz"); + const u16 gCreditsAllRightsReservedGfxPal[] = INCBIN_U16("graphics/credits/unk_8EAE548.gbapal"); const u8 gCreditsAllRightsReservedGfxTiles[] = INCBIN_U8("graphics/credits/unk_8EAE548.4bpp.lz"); const u8 gCreditsAllRightsReservedGfxMap[] = INCBIN_U8("graphics/credits/unk_8EAE548.bin.lz"); diff --git a/src/title_screen.c b/src/title_screen.c index eb65b00f7..3f7c51414 100644 --- a/src/title_screen.c +++ b/src/title_screen.c @@ -23,7 +23,7 @@ enum TitleScreenScene TITLESCREENSCENE_FLASHSPRITE, TITLESCREENSCENE_FADEIN, TITLESCREENSCENE_RUN, - TITLESCREENSCEEN_RESTART, + TITLESCREENSCENE_RESTART, TITLESCREENSCENE_CRY }; @@ -40,52 +40,57 @@ static void CB2_TitleScreenRun(void); static void VBlankCB(void); static void Task_TitleScreenTimer(u8 taskId); static void Task_TitleScreenMain(u8 taskId); -static void SetTitleScreenScene(s16 * data, u8 a1); -static void SetTitleScreenScene_Init(s16 * data); -static void SetTitleScreenScene_FlashSprite(s16 * data); -static void SetTitleScreenScene_FadeIn(s16 * data); -static void SetTitleScreenScene_Run(s16 * data); +static void SetTitleScreenScene(s16 *data, u8 sceneNum); +static void SetTitleScreenScene_Init(s16 *data); +static void SetTitleScreenScene_FlashSprite(s16 *data); +static void SetTitleScreenScene_FadeIn(s16 *data); +static void SetTitleScreenScene_Run(s16 *data); static void SetGpuRegsForTitleScreenRun(void); -static void SetTitleScreenScene_Restart(s16 * data); -static void SetTitleScreenScene_Cry(s16 * data); +static void SetTitleScreenScene_Restart(s16 *data); +static void SetTitleScreenScene_Cry(s16 *data); static void Task_TitleScreen_SlideWin0(u8 taskId); static void Task_TitleScreen_BlinkPressStart(u8 taskId); static void SignalEndTitleScreenPaletteSomethingTask(void); -static void UpdateScanlineEffectRegBuffer(s16 a0); +static void UpdateScanlineEffectRegBuffer(s16 y); static void ScheduleStopScanlineEffect(void); static void LoadMainTitleScreenPalsAndResetBgs(void); static void CB2_FadeOutTransitionToSaveClearScreen(void); -static void SpriteCallback_TitleScreenFlameOrLeaf(struct Sprite *sprite); static void CB2_FadeOutTransitionToBerryFix(void); static void LoadSpriteGfxAndPals(void); -static void Task_FlameOrLeafSpawner(u8 taskId); +#if defined(FIRERED) +static void SpriteCallback_TitleScreenFlame(struct Sprite *sprite); +static void Task_FlameSpawner(u8 taskId); +#elif defined(LEAFGREEN) +static void SpriteCallback_TitleScreenLeaf(struct Sprite *sprite); +static void Task_LeafSpawner(u8 taskId); +#endif static void TitleScreen_srand(u8 taskId, u8 field, u16 seed); static u16 TitleScreen_rand(u8 taskId, u8 field); static u32 CreateBlankSprite(void); -static void SetPalOnOrCreateBlankSprite(bool32 a0); +static void SetPalOnOrCreateBlankSprite(bool32 hasCreatedBlankSprite); static u8 CreateSlashSprite(void); static void ScheduleHideSlashSprite(u8 spriteId); static bool32 IsSlashSpriteHidden(u8 spriteId); static void SpriteCallback_Slash(struct Sprite *sprite); -// bg3 static const u8 sBorderBgTiles[] = INCBIN_U8("graphics/title_screen/border_bg.4bpp.lz"); + #if defined(FIRERED) static const u8 sBorderBgMap[] = INCBIN_U8("graphics/title_screen/firered/border_bg.bin.lz"); #elif defined(LEAFGREEN) static const u8 sBorderBgMap[] = INCBIN_U8("graphics/title_screen/leafgreen/border_bg.bin.lz"); #endif -//sprites -static const u32 sSlashSpriteTiles[] = INCBIN_U32("graphics/title_screen/slash_sprite.4bpp.lz"); +static const u32 sTitleScreen_Slash_Gfx[] = INCBIN_U32("graphics/title_screen/slash.4bpp.lz"); + #if defined(FIRERED) -static const u16 sSlashSpritePals[] = INCBIN_U16("graphics/title_screen/firered/slash_sprite.gbapal"); -static const u32 sFireSpriteTiles[] = INCBIN_U32("graphics/title_screen/firered/fire_sprite.4bpp.lz"); -static const u32 sBlankFireSpriteTiles[] = INCBIN_U32("graphics/title_screen/firered/blank_fire_sprite.4bpp.lz"); +static const u16 sTitleScreen_Flames_Pal[] = INCBIN_U16("graphics/title_screen/firered/flames.gbapal"); +static const u32 sTitleScreen_Flames_Gfx[] = INCBIN_U32("graphics/title_screen/firered/flames.4bpp.lz"); +static const u32 sTitleScreen_BlankFlames_Gfx[] = INCBIN_U32("graphics/title_screen/firered/blank_flames.4bpp.lz"); #elif defined(LEAFGREEN) -static const u16 sSlashSpritePals[] = INCBIN_U16("graphics/title_screen/leafgreen/slash_sprite.gbapal"); -static const u32 sLeafSpriteTiles[] = INCBIN_U32("graphics/title_screen/leafgreen/leaf_sprite.4bpp.lz"); -static const u32 sBlankLeafSpriteTiles[] = INCBIN_U32("graphics/title_screen/leafgreen/blank_leaf_sprite.4bpp.lz"); +static const u16 sTitleScreen_Leaves_Pal[] = INCBIN_U16("graphics/title_screen/leafgreen/leaves.gbapal"); +static const u32 sTitleScreen_Leaves_Gfx[] = INCBIN_U32("graphics/title_screen/leafgreen/leaves.4bpp.lz"); +static const u32 sTitleScreen_Streak_Gfx[] = INCBIN_U32("graphics/title_screen/leafgreen/streak.4bpp.lz"); #endif static const struct OamData sOamData_FlameOrLeaf = { @@ -98,85 +103,99 @@ static const struct OamData sOamData_FlameOrLeaf = { }; #if defined(FIRERED) -static const union AnimCmd sSpriteAnims_FlameOrLeaf_0[] = { - ANIMCMD_FRAME(0x00, 3), - ANIMCMD_FRAME(0x04, 6), - ANIMCMD_FRAME(0x08, 6), - ANIMCMD_FRAME(0x0c, 6), - ANIMCMD_FRAME(0x10, 6), - ANIMCMD_FRAME(0x14, 6), - ANIMCMD_FRAME(0x18, 6), - ANIMCMD_FRAME(0x1c, 6), - ANIMCMD_FRAME(0x20, 6), - ANIMCMD_FRAME(0x24, 6), +static const union AnimCmd sSpriteAnim_Flame[] = { + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(4, 6), + ANIMCMD_FRAME(8, 6), + ANIMCMD_FRAME(12, 6), + ANIMCMD_FRAME(16, 6), + ANIMCMD_FRAME(20, 6), + ANIMCMD_FRAME(24, 6), + ANIMCMD_FRAME(28, 6), + ANIMCMD_FRAME(32, 6), + ANIMCMD_FRAME(36, 6), ANIMCMD_END }; -static const union AnimCmd sSpriteAnims_FlameOrLeaf_1[] = { - ANIMCMD_FRAME(0x18, 6), - ANIMCMD_FRAME(0x1c, 6), - ANIMCMD_FRAME(0x20, 6), - ANIMCMD_FRAME(0x24, 6), +static const union AnimCmd sSpriteAnim_Flame_Unused[] = { + ANIMCMD_FRAME(24, 6), + ANIMCMD_FRAME(28, 6), + ANIMCMD_FRAME(32, 6), + ANIMCMD_FRAME(36, 6), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_FlameOrLeaf[] = { - sSpriteAnims_FlameOrLeaf_0, - sSpriteAnims_FlameOrLeaf_1 +static const union AnimCmd *const sSpriteAnim_FlameOrLeaf[] = { + sSpriteAnim_Flame, + sSpriteAnim_Flame_Unused, }; #elif defined(LEAFGREEN) -static const union AnimCmd sSpriteAnims_FlameOrLeaf_0[] = { - ANIMCMD_FRAME(0x00, 8), - ANIMCMD_FRAME(0x04, 8), - ANIMCMD_FRAME(0x08, 8), - ANIMCMD_FRAME(0x0c, 8), - ANIMCMD_FRAME(0x10, 8), - ANIMCMD_FRAME(0x14, 8), - ANIMCMD_FRAME(0x18, 8), - ANIMCMD_FRAME(0x1c, 8), - ANIMCMD_FRAME(0x20, 8), - ANIMCMD_FRAME(0x24, 8), - ANIMCMD_FRAME(0x28, 8), +static const union AnimCmd sSpriteAnim_Leaf[] = { + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(4, 8), + ANIMCMD_FRAME(8, 8), + ANIMCMD_FRAME(12, 8), + ANIMCMD_FRAME(16, 8), + ANIMCMD_FRAME(20, 8), + ANIMCMD_FRAME(24, 8), + ANIMCMD_FRAME(28, 8), + ANIMCMD_FRAME(32, 8), + ANIMCMD_FRAME(36, 8), + ANIMCMD_FRAME(40, 8), ANIMCMD_JUMP(0) }; -static const union AnimCmd *const sSpriteAnimTable_FlameOrLeaf[] = { - sSpriteAnims_FlameOrLeaf_0 +static const union AnimCmd *const sSpriteAnim_FlameOrLeaf[] = { + sSpriteAnim_Leaf }; #endif -static const struct SpriteTemplate sSpriteTemplate_FlameOrLeaf_State1 = { - .tileTag = 0, - .paletteTag = 0, +enum { + TILE_TAG_FLAME_OR_LEAF, + TILE_TAG_BLANK_OR_STREAK, + TILE_TAG_BLANK, + TILE_TAG_SLASH, +}; + +enum { + PAL_TAG_DEFAULT, + PAL_TAG_UNUSED, + PAL_TAG_SLASH, +}; + +static const struct SpriteTemplate sSpriteTemplate_FlameOrLeaf = { + .tileTag = TILE_TAG_FLAME_OR_LEAF, + .paletteTag = PAL_TAG_DEFAULT, .oam = &sOamData_FlameOrLeaf, - .anims = sSpriteAnimTable_FlameOrLeaf, + .anims = sSpriteAnim_FlameOrLeaf, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; #if defined(FIRERED) -static const struct SpriteTemplate sSpriteTemplate_FlameOrLeaf_State0 = { - .tileTag = 1, - .paletteTag = 0, +static const struct SpriteTemplate sSpriteTemplate_BlankFlame = { + .tileTag = TILE_TAG_BLANK_OR_STREAK, + .paletteTag = PAL_TAG_DEFAULT, .oam = &sOamData_FlameOrLeaf, - .anims = sSpriteAnimTable_FlameOrLeaf, + .anims = sSpriteAnim_FlameOrLeaf, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; + #elif defined(LEAFGREEN) -static const struct OamData sOamData_LG_83BF950 = { +static const struct OamData sOamData_Streak = { .shape = SPRITE_SHAPE(32x16), .size = SPRITE_SIZE(32x16), .priority = 3 }; -static const struct SpriteTemplate sSpriteTemplate_FlameOrLeaf_State0 = { - .tileTag = 1, - .paletteTag = 0, - .oam = &sOamData_LG_83BF950, +static const struct SpriteTemplate sSpriteTemplate_Streak = { + .tileTag = TILE_TAG_BLANK_OR_STREAK, + .paletteTag = PAL_TAG_DEFAULT, + .oam = &sOamData_Streak, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, @@ -184,7 +203,7 @@ static const struct SpriteTemplate sSpriteTemplate_FlameOrLeaf_State0 = { }; #endif -static const struct OamData sOamData_UnknownEmptySprite = { +static const struct OamData sOamData_BlankSprite = { .objMode = ST_OAM_OBJ_NORMAL, .shape = ST_OAM_V_RECTANGLE, .size = ST_OAM_SIZE_3, @@ -193,10 +212,10 @@ static const struct OamData sOamData_UnknownEmptySprite = { .paletteNum = 0 }; -static const struct SpriteTemplate sUnknownEmptySprite = { - .tileTag = 2, - .paletteTag = 2, - .oam = &sOamData_UnknownEmptySprite, +static const struct SpriteTemplate sSpriteTemplate_BlankSprite = { + .tileTag = TILE_TAG_BLANK, + .paletteTag = PAL_TAG_SLASH, + .oam = &sOamData_BlankSprite, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, @@ -213,8 +232,8 @@ static const struct OamData sOamData_SlashSprite = { }; static const struct SpriteTemplate sSlashSpriteTemplate = { - .tileTag = 3, - .paletteTag = 2, + .tileTag = TILE_TAG_SLASH, + .paletteTag = PAL_TAG_SLASH, .oam = &sOamData_SlashSprite, .anims = gDummySpriteAnimTable, .images = NULL, @@ -258,62 +277,66 @@ static const struct BgTemplate sBgTemplates[] = { } }; -static void (*const sSceneFuncs[])(s16 * data) = { - SetTitleScreenScene_Init, - SetTitleScreenScene_FlashSprite, - SetTitleScreenScene_FadeIn, - SetTitleScreenScene_Run, - SetTitleScreenScene_Restart, - SetTitleScreenScene_Cry +static void (*const sSceneFuncs[])(s16 *data) = { + [TITLESCREENSCENE_INIT] = SetTitleScreenScene_Init, + [TITLESCREENSCENE_FLASHSPRITE] = SetTitleScreenScene_FlashSprite, + [TITLESCREENSCENE_FADEIN] = SetTitleScreenScene_FadeIn, + [TITLESCREENSCENE_RUN] = SetTitleScreenScene_Run, + [TITLESCREENSCENE_RESTART] = SetTitleScreenScene_Restart, + [TITLESCREENSCENE_CRY] = SetTitleScreenScene_Cry }; #if defined(FIRERED) static const struct CompressedSpriteSheet sSpriteSheets[] = { - {sFireSpriteTiles, 0x500, 0}, - {sBlankFireSpriteTiles, 0x500, 1}, - {gGraphics_TitleScreen_BlankObjTiles, 0x400, 2}, - {sSlashSpriteTiles, 0x800, 3} + {sTitleScreen_Flames_Gfx, 0x500, TILE_TAG_FLAME_OR_LEAF}, + {sTitleScreen_BlankFlames_Gfx, 0x500, TILE_TAG_BLANK_OR_STREAK}, + {gTitleScreen_BlankSprite_Tiles, 0x400, TILE_TAG_BLANK}, + {sTitleScreen_Slash_Gfx, 0x800, TILE_TAG_SLASH} }; -#elif defined(LEAFGREEN) -static const struct CompressedSpriteSheet sSpriteSheets[] = { - {sLeafSpriteTiles, 0x580, 0}, - {sBlankLeafSpriteTiles, 0x100, 1}, - {gGraphics_TitleScreen_BlankObjTiles, 0x400, 2}, - {sSlashSpriteTiles, 0x800, 3} -}; -#endif static const struct SpritePalette sSpritePals[] = { - {sSlashSpritePals, 0}, - {gGraphics_TitleScreen_FireOrLeafPals, 2}, + {sTitleScreen_Flames_Pal, PAL_TAG_DEFAULT}, + {gTitleScreen_Slash_Pal, PAL_TAG_SLASH}, {} }; -#if defined(FIRERED) -static const u8 gUnknown_83BFBD4[] = { - 0x04, 0x10, 0x1a, 0x20, 0x30, 0xc8, 0xd8, 0xe0, 0xe8, 0x3c, 0x4c, 0x5c, 0x6c, 0x80, 0x90 +static const u8 sFlameXPositions[] = { + 4, 16, 26, 32, 48, 200, 216, 224, 232, 60, 76, 92, 108, 128, 144, 0 }; #elif defined(LEAFGREEN) -static const u16 gUnknown_LG_83BFA10[] = { +static const struct CompressedSpriteSheet sSpriteSheets[] = { + {sTitleScreen_Leaves_Gfx, 0x580, TILE_TAG_FLAME_OR_LEAF}, + {sTitleScreen_Streak_Gfx, 0x100, TILE_TAG_BLANK_OR_STREAK}, + {gTitleScreen_BlankSprite_Tiles, 0x400, TILE_TAG_BLANK}, + {sTitleScreen_Slash_Gfx, 0x800, TILE_TAG_SLASH} +}; + +static const struct SpritePalette sSpritePals[] = { + {sTitleScreen_Leaves_Pal, PAL_TAG_DEFAULT}, + {gTitleScreen_Slash_Pal, PAL_TAG_SLASH}, + {} +}; + +static const u16 sStreakYPositions[] = { 40, 80, 110, 60, 90, 70, 100, 50 }; #endif -static const u32 gUnknown_83BFBE4[] = INCBIN_U32("graphics/title_screen/unk_83BFBE4.bin.lz"); -static const u32 gUnknown_83C0408[] = INCBIN_U32("graphics/title_screen/unk_83C0408.bin.lz"); -static const u32 gUnknown_83C0C00[] = INCBIN_U32("graphics/title_screen/unk_83C0C00.bin.lz"); -static const u32 gUnknown_83C139C[] = INCBIN_U32("graphics/title_screen/unk_83C139C.bin.lz"); -static const u32 gUnknown_83C1BB8[] = INCBIN_U32("graphics/title_screen/unk_83C1BB8.bin.lz"); -static const u32 gUnknown_83C2380[] = INCBIN_U32("graphics/title_screen/unk_83C2380.bin.lz"); +static const u32 sUnused_Tilemap1[] = INCBIN_U32("graphics/title_screen/unused1.bin.lz"); +static const u32 sUnused_Tilemap2[] = INCBIN_U32("graphics/title_screen/unused2.bin.lz"); +static const u32 sUnused_Tilemap3[] = INCBIN_U32("graphics/title_screen/unused3.bin.lz"); +static const u32 sUnused_Tilemap4[] = INCBIN_U32("graphics/title_screen/unused4.bin.lz"); +static const u32 sUnused_Tilemap5[] = INCBIN_U32("graphics/title_screen/unused5.bin.lz"); +static const u32 sUnused_Tilemap6[] = INCBIN_U32("graphics/title_screen/unused6.bin.lz"); -static const u32 *const gUnknown_83C2BA4[] = { - gUnknown_83BFBE4, - gUnknown_83C0408, - gUnknown_83C0C00, - gUnknown_83C139C, - gUnknown_83C1BB8, - gUnknown_83C2380 +static const u32 *const sUnused_Tilemaps[] = { + sUnused_Tilemap1, + sUnused_Tilemap2, + sUnused_Tilemap3, + sUnused_Tilemap4, + sUnused_Tilemap5, + sUnused_Tilemap6, }; void CB2_InitTitleScreen(void) @@ -338,7 +361,7 @@ void CB2_InitTitleScreen(void) ResetBgsAndClearDma3BusyFlags(FALSE); InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates)); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); - sTitleScreenTimerTaskId = 0xFF; + sTitleScreenTimerTaskId = TASK_NONE; break; case 1: LoadPalette(gGraphics_TitleScreen_GameTitleLogoPals, 0, 0x1A0); @@ -358,7 +381,7 @@ void CB2_InitTitleScreen(void) case 2: if (!FreeTempTileDataBuffersIfPossible()) { - BlendPalettes(0x0000FFFF, 0x10, RGB_BLACK); + BlendPalettes(PALETTES_BG, 16, RGB_BLACK); CreateTask(Task_TitleScreenMain, 4); sTitleScreenTimerTaskId = CreateTask(Task_TitleScreenTimer, 2); SetVBlankCallback(VBlankCB); @@ -401,46 +424,52 @@ static void VBlankCB(void) TransferPlttBuffer(); ScanlineEffect_InitHBlankDmaTransfer(); - if (sTitleScreenTimerTaskId != 0xFF) + if (sTitleScreenTimerTaskId != TASK_NONE) gTasks[sTitleScreenTimerTaskId].data[0]++; } static void Task_TitleScreenTimer(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; if (data[0] >= 2700) { - sTitleScreenTimerTaskId = 0xFF; + sTitleScreenTimerTaskId = TASK_NONE; DestroyTask(taskId); } } +// task data for Task_TitleScreenMain and the scenes +#define tSceneNum data[0] +#define tState data[1] +#define tHasCreatedBlankSprite data[5] +#define tSlashSpriteId data[6] + static void Task_TitleScreenMain(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; if (JOY_NEW(A_BUTTON | B_BUTTON | START_BUTTON) - && data[0] != 3 && data[0] != 4 && data[0] != 5) + && tSceneNum != TITLESCREENSCENE_RUN + && tSceneNum != TITLESCREENSCENE_RESTART + && tSceneNum != TITLESCREENSCENE_CRY) { ScheduleStopScanlineEffect(); LoadMainTitleScreenPalsAndResetBgs(); - SetPalOnOrCreateBlankSprite(data[5]); + SetPalOnOrCreateBlankSprite(tHasCreatedBlankSprite); SetTitleScreenScene(data, TITLESCREENSCENE_RUN); } else - { - sSceneFuncs[data[0]](data); - } + sSceneFuncs[tSceneNum](data); } -static void SetTitleScreenScene(s16 * data, u8 a1) +static void SetTitleScreenScene(s16 *data, u8 sceneNum) { - data[1] = 0; - data[0] = a1; + tState = 0; + tSceneNum = sceneNum; } -static void SetTitleScreenScene_Init(s16 * data) +static void SetTitleScreenScene_Init(s16 *data) { struct ScanlineEffectParams params; @@ -462,16 +491,16 @@ static void SetTitleScreenScene_Init(s16 * data) SetTitleScreenScene(data, TITLESCREENSCENE_FLASHSPRITE); } -static void SetTitleScreenScene_FlashSprite(s16 * data) +static void SetTitleScreenScene_FlashSprite(s16 *data) { - switch (data[1]) + switch (tState) { case 0: SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_LIGHTEN); SetGpuReg(REG_OFFSET_BLDY, 0); - data[2] = 0x80; + data[2] = 128; UpdateScanlineEffectRegBuffer(data[2]); - data[1]++; + tState++; break; case 1: data[2] -= 4; @@ -479,7 +508,7 @@ static void SetTitleScreenScene_FlashSprite(s16 * data) if (data[2] < 0) { gScanlineEffect.state = 3; - data[1]++; + tState++; } break; case 2: @@ -489,29 +518,28 @@ static void SetTitleScreenScene_FlashSprite(s16 * data) } } -static void SetTitleScreenScene_FadeIn(s16 * data) +static void SetTitleScreenScene_FadeIn(s16 *data) { - u32 r4; - switch (data[1]) + switch (tState) { case 0: data[2] = 0; - data[1]++; + tState++; break; case 1: data[2]++; if (data[2] > 10) { - TintPalette_GrayScale2(gPlttBufferUnfaded + 0xD0, 0x10); - BeginNormalPaletteFade(0x00002000, 9, 0x10, 0, RGB_BLACK); - data[1]++; + TintPalette_GrayScale2(gPlttBufferUnfaded + 0xD0, 16); + BeginNormalPaletteFade(1 << 0xD, 9, 16, 0, RGB_BLACK); + tState++; } break; case 2: if (!gPaletteFade.active) { data[2] = 0; - data[1]++; + tState++; } break; case 3: @@ -519,16 +547,16 @@ static void SetTitleScreenScene_FadeIn(s16 * data) if (data[2] > 36) { CreateTask(Task_TitleScreen_SlideWin0, 3); - BlendPalettesGradually(0x2000, -4, 0x01, 0x10, RGB(30, 30, 31), 0, 0); + BlendPalettesGradually(1 << 0xD, -4, 1, 16, RGB(30, 30, 31), 0, 0); data[2] = 0; - data[1]++; + tState++; } break; case 4: if (!IsBlendPalettesGraduallyTaskActive(0)) { - BlendPalettesGradually(0x2000, -4, 0x0F, 0x00, RGB(30, 30, 31), 0, 0); - data[1]++; + BlendPalettesGradually(1 << 0xD, -4, 15, 0, RGB(30, 30, 31), 0, 0); + tState++; } break; case 5: @@ -536,15 +564,15 @@ static void SetTitleScreenScene_FadeIn(s16 * data) if (data[2] > 20) { data[2] = 0; - BlendPalettesGradually(0x2000, -4, 0x01, 0x10, RGB(30, 30, 31), 0, 0); - data[1]++; + BlendPalettesGradually(1 << 0xD, -4, 1, 16, RGB(30, 30, 31), 0, 0); + tState++; } break; case 6: if (!IsBlendPalettesGraduallyTaskActive(0)) { - BlendPalettesGradually(0x2000, -4, 0x0F, 0x00, RGB(30, 30, 31), 0, 0); - data[1]++; + BlendPalettesGradually(1 << 0xD, -4, 15, 0, RGB(30, 30, 31), 0, 0); + tState++; } break; case 7: @@ -552,21 +580,22 @@ static void SetTitleScreenScene_FadeIn(s16 * data) if (data[2] > 20) { data[2] = 0; - BlendPalettesGradually(0x2000, -3, 0x00, 0x10, RGB(30, 30, 31), 0, 0); - data[1]++; + BlendPalettesGradually(1 << 0xD, -3, 0, 16, RGB(30, 30, 31), 0, 0); + tState++; } break; case 8: if (!IsBlendPalettesGraduallyTaskActive(0)) { - data[5] = 1; - r4 = (0x10000 << CreateBlankSprite()) | 0x00001FFF; - BlendPalettes(r4, 0x10, RGB(30, 30, 31)); - BeginNormalPaletteFade(r4, 1, 0x10, 0x00, RGB(30, 30, 31)); + u32 palettes; + tHasCreatedBlankSprite = TRUE; + palettes = (PALETTES_BG & ~(1 << 0xD) & ~(1 << 0xE) & ~(1 << 0xF)) | (0x10000 << CreateBlankSprite()); + BlendPalettes(palettes, 16, RGB(30, 30, 31)); + BeginNormalPaletteFade(palettes, 1, 16, 0, RGB(30, 30, 31)); ShowBg(0); - CpuCopy16(gGraphics_TitleScreen_BoxArtMonPals, gPlttBufferUnfaded + 0xD0, 0x20); - BlendPalettesGradually(0x2000, 1, 0x0F, 0x00, RGB(30, 30, 31), 0, 0); - data[1]++; + CpuCopy16(gGraphics_TitleScreen_BoxArtMonPals, gPlttBufferUnfaded + 0xD0, 32); + BlendPalettesGradually(1 << 0xD, 1, 15, 0, RGB(30, 30, 31), 0, 0); + tState++; } break; case 9: @@ -581,29 +610,33 @@ static void SetTitleScreenScene_FadeIn(s16 * data) #define KEYSTROKE_DELSAVE (B_BUTTON | SELECT_BUTTON | DPAD_UP) #define KEYSTROKE_BERRY_FIX (B_BUTTON | SELECT_BUTTON) -static void SetTitleScreenScene_Run(s16 * data) +static void SetTitleScreenScene_Run(s16 *data) { - switch (data[1]) + switch (tState) { case 0: SetHelpContext(HELPCONTEXT_TITLE_SCREEN); CreateTask(Task_TitleScreen_BlinkPressStart, 0); - CreateTask(Task_FlameOrLeafSpawner, 5); +#if defined(FIRERED) + CreateTask(Task_FlameSpawner, 5); +#elif defined(LEAFGREEN) + CreateTask(Task_LeafSpawner, 5); +#endif SetGpuRegsForTitleScreenRun(); - data[6] = CreateSlashSprite(); + tSlashSpriteId = CreateSlashSprite(); HelpSystem_Enable(); - data[1]++; + tState++; // fallthrough case 1: if (JOY_HELD(KEYSTROKE_DELSAVE) == KEYSTROKE_DELSAVE) { - ScheduleHideSlashSprite(data[6]); + ScheduleHideSlashSprite(tSlashSpriteId); DestroyTask(FindTaskIdByFunc(Task_TitleScreenMain)); SetMainCallback2(CB2_FadeOutTransitionToSaveClearScreen); } else if (JOY_HELD(KEYSTROKE_BERRY_FIX) == KEYSTROKE_BERRY_FIX) { - ScheduleHideSlashSprite(data[6]); + ScheduleHideSlashSprite(tSlashSpriteId); DestroyTask(FindTaskIdByFunc(Task_TitleScreenMain)); SetMainCallback2(CB2_FadeOutTransitionToBerryFix); } @@ -613,7 +646,7 @@ static void SetTitleScreenScene_Run(s16 * data) } else if (!FuncIsActiveTask(Task_TitleScreenTimer)) { - SetTitleScreenScene(data, TITLESCREENSCEEN_RESTART); + SetTitleScreenScene(data, TITLESCREENSCENE_RESTART); } break; } @@ -622,21 +655,21 @@ static void SetTitleScreenScene_Run(s16 * data) static void SetGpuRegsForTitleScreenRun(void) { SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON); - SetGpuReg(REG_OFFSET_WINOUT, WIN_RANGE(0x3F, 0x1F)); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WINOBJ_ALL); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_LIGHTEN); SetGpuReg(REG_OFFSET_BLDY, 13); } -static void SetTitleScreenScene_Restart(s16 * data) +static void SetTitleScreenScene_Restart(s16 *data) { - switch (data[1]) + switch (tState) { case 0: - ScheduleHideSlashSprite(data[6]); - data[1]++; + ScheduleHideSlashSprite(tSlashSpriteId); + tState++; break; case 1: - if (!gPaletteFade.active && !IsSlashSpriteHidden(data[6])) + if (!gPaletteFade.active && !IsSlashSpriteHidden(tSlashSpriteId)) { FadeOutMapMusic(10); BeginNormalPaletteFade(PALETTES_ALL, 3, 0, 0x10, RGB_BLACK); @@ -649,7 +682,7 @@ static void SetTitleScreenScene_Restart(s16 * data) { DestroyTask(FindTaskIdByFunc(Task_TitleScreen_BlinkPressStart)); data[2] = 0; - data[1]++; + tState++; } break; case 3: @@ -657,7 +690,7 @@ static void SetTitleScreenScene_Restart(s16 * data) if (data[2] >= 20) { DestroyTask(FindTaskIdByFunc(Task_TitleScreen_BlinkPressStart)); - data[1]++; + tState++; } break; case 4: @@ -668,28 +701,28 @@ static void SetTitleScreenScene_Restart(s16 * data) } } -static void SetTitleScreenScene_Cry(s16 * data) +static void SetTitleScreenScene_Cry(s16 *data) { - switch (data[1]) + switch (tState) { case 0: if (!gPaletteFade.active) { PlayCry_Normal(TITLE_SPECIES, 0); - ScheduleHideSlashSprite(data[6]); + ScheduleHideSlashSprite(tSlashSpriteId); data[2] = 0; - data[1]++; + tState++; } break; case 1: if (data[2] < 90) data[2]++; - else if (!IsSlashSpriteHidden(data[6])) + else if (!IsSlashSpriteHidden(tSlashSpriteId)) { - BeginNormalPaletteFade(0x0FFFFFFF, 0, 0, 0x10, RGB_WHITE); + BeginNormalPaletteFade((PALETTES_ALL & ~(1 << 0x1C) & ~(1 << 0x1D) & ~(1 << 0x1E) & ~(1 << 0x1F)), 0, 0, 16, RGB_WHITE); SignalEndTitleScreenPaletteSomethingTask(); FadeOutBGM(4); - data[1]++; + tState++; } break; case 2: @@ -711,30 +744,35 @@ static void SetTitleScreenScene_Cry(s16 * data) } } +#undef tSceneNum +#undef tState +#undef tHasCreatedBlankSprite +#undef tSlashSpriteId + static void Task_TitleScreen_SlideWin0(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; switch (data[0]) { case 0: SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); - SetGpuReg(REG_OFFSET_WININ, WIN_RANGE(0x00, 0x3F)); - SetGpuReg(REG_OFFSET_WINOUT, WIN_RANGE(0x00, 0x37)); - SetGpuReg(REG_OFFSET_WIN0V, 0xA0); - SetGpuReg(REG_OFFSET_WIN0H, 0x00); - BlendPalettes(0x00004000, 0, RGB_BLACK); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_ALL); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, DISPLAY_HEIGHT)); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 0)); + BlendPalettes(1 << 0xE, 0, RGB_BLACK); data[0]++; break; case 1: - data[1] += 0x180; + data[1] += 24 << 4; data[2] = data[1] >> 4; - if (data[2] >= 0xF0) + if (data[2] >= DISPLAY_WIDTH) { - data[2] = 0xF0; + data[2] = DISPLAY_WIDTH; data[0]++; } - SetGpuReg(REG_OFFSET_WIN0H, data[2]); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, data[2])); break; case 2: data[3]++; @@ -745,15 +783,15 @@ static void Task_TitleScreen_SlideWin0(u8 taskId) } break; case 3: - SetGpuReg(REG_OFFSET_WINOUT, WIN_RANGE(0, 0x3B)); - SetGpuReg(REG_OFFSET_WIN0H, 0xF0F0); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(DISPLAY_WIDTH, DISPLAY_WIDTH)); ChangeBgX(2, -0xF000, 0); - BlendPalettes(0x00008000, 0, RGB_BLACK); - data[1] = 0xF00; + BlendPalettes(1 << 0xF, 0, RGB_BLACK); + data[1] = 10 * 24 << 4; data[0]++; break; case 4: - data[1] -= 0x180; + data[1] -= 24 << 4; data[2] = data[1] >> 4; if (data[2] <= 0) { @@ -761,7 +799,7 @@ static void Task_TitleScreen_SlideWin0(u8 taskId) data[0]++; } ChangeBgX(2, -data[2] << 8, 0); - SetGpuReg(REG_OFFSET_WIN0H, (data[2] << 8) | 0xF0); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(data[2], DISPLAY_WIDTH)); break; case 5: ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); @@ -772,7 +810,7 @@ static void Task_TitleScreen_SlideWin0(u8 taskId) static void Task_TitleScreen_BlinkPressStart(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; s32 i; if (data[15] && gPaletteFade.active) @@ -820,39 +858,33 @@ static void SignalEndTitleScreenPaletteSomethingTask(void) gTasks[taskId].data[15] = TRUE; } -static void UpdateScanlineEffectRegBuffer(s16 a0) +static void UpdateScanlineEffectRegBuffer(s16 y) { s32 i; - if (a0 >= 0) - { - gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][a0] = 16; - } + if (y >= 0) + gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][y] = 16; for (i = 0; i < 16; i++) { - if (a0 + i >= 0) - { - gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][a0 + i] = 15 - i; - } - if (a0 - i >= 0) - { - gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][a0 - i] = 15 - i; - } + if (y + i >= 0) + gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][y + i] = 15 - i; + + if (y - i >= 0) + gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][y - i] = 15 - i; + } - for (i = a0 + 16; i < 160; i++) + + for (i = y + 16; i < 160; i++) { if (i >= 0) - { gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = 0; - } } - for (i = a0 - 16; i >= 0; i--) + + for (i = y - 16; i >= 0; i--) { if (i >= 0) - { gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = 0; - } } } @@ -869,7 +901,7 @@ static void LoadMainTitleScreenPalsAndResetBgs(void) u8 taskId; taskId = FindTaskIdByFunc(Task_TitleScreen_SlideWin0); - if (taskId != 0xFF) + if (taskId != TASK_NONE) DestroyTask(taskId); DestroyBlendPalettesGraduallyTask(); @@ -910,24 +942,30 @@ static void LoadSpriteGfxAndPals(void) LoadSpritePalettes(sSpritePals); } -static void SpriteCallback_TitleScreenFlameOrLeaf(struct Sprite *sprite) +#if defined(FIRERED) + +#define sPosX data[0] +#define sSpeedX data[1] +#define sPosY data[2] +#define sSpeedY data[3] + +static void SpriteCallback_TitleScreenFlame(struct Sprite *sprite) { - s16 * data = sprite->data; - sprite->data[0] -= data[1]; - sprite->x = sprite->data[0] >> 4; + s16 *data = sprite->data; + sPosX -= sSpeedX; + sprite->x = sPosX >> 4; if (sprite->x < -8) { DestroySprite(sprite); return; } - data[2] += data[3]; - sprite->y = data[2] >> 4; - if (sprite->y < 0x10 || sprite->y > 0xc8) + sPosY += sSpeedY; + sprite->y = sPosY >> 4; + if (sprite->y < 16 || sprite->y > 200) { DestroySprite(sprite); return; } -#if defined(FIRERED) if (sprite->animEnded) { DestroySprite(sprite); @@ -938,178 +976,228 @@ static void SpriteCallback_TitleScreenFlameOrLeaf(struct Sprite *sprite) StartSpriteAnim(sprite, 0); sprite->invisible = FALSE; } -#elif defined(LEAFGREEN) - if (!data[5]) - { - s32 r2; - s32 r1; - data[6]++; - r2 = data[1] * data[6]; - r1 = data[6] * data[3]; - r2 = (r2 * r2) >> 4; - r1 = (r1 * r1) >> 4; - if (r2 + r1 >= 0x510) - data[5] = TRUE; - } -#endif } -#if defined(FIRERED) -static bool32 CreateFlameOrLeafSprite(s32 x, s32 y, s32 xspeed, s32 yspeed, bool32 templateId) +static bool32 CreateFlameSprite(s32 x, s32 y, s32 xspeed, s32 yspeed, bool32 createFlame) { u8 spriteId; - if (templateId) - { - spriteId = CreateSprite(&sSpriteTemplate_FlameOrLeaf_State1, x, y, 0); - } + if (createFlame) + spriteId = CreateSprite(&sSpriteTemplate_FlameOrLeaf, x, y, 0); else - { - spriteId = CreateSprite(&sSpriteTemplate_FlameOrLeaf_State0, x, y, 0); - } + spriteId = CreateSprite(&sSpriteTemplate_BlankFlame, x, y, 0); + if (spriteId != MAX_SPRITES) { - gSprites[spriteId].data[0] = x << 4; - gSprites[spriteId].data[1] = xspeed; - gSprites[spriteId].data[2] = y << 4; - gSprites[spriteId].data[3] = yspeed; + gSprites[spriteId].sPosX = x * 16; + gSprites[spriteId].sSpeedX = xspeed; + gSprites[spriteId].sPosY = y * 16; + gSprites[spriteId].sSpeedY = yspeed; gSprites[spriteId].data[4] = 0; gSprites[spriteId].data[5] = (xspeed * yspeed) % 16; - gSprites[spriteId].data[6] = templateId; - gSprites[spriteId].callback = SpriteCallback_TitleScreenFlameOrLeaf; + gSprites[spriteId].data[6] = createFlame; + gSprites[spriteId].callback = SpriteCallback_TitleScreenFlame; return TRUE; } return FALSE; } -static void Task_FlameOrLeafSpawner(u8 taskId) +#undef sPosX +#undef sSpeedX +#undef sPosY +#undef sSpeedY + +#define tState data[0] +#define tTimer data[1] +#define tDelay data[2] +#define tOff_Seed 3 // data[3] and data[4] +#define tOffsetX data[5] + +static void Task_FlameSpawner(u8 taskId) { - s16 * data = gTasks[taskId].data; - s32 x, y, xspeed, yspeed, templateId; + s16 *data = gTasks[taskId].data; + s32 x, y, xspeed, yspeed; s32 i; - switch (data[0]) + switch (tState) { case 0: TitleScreen_srand(taskId, 3, 30840); - data[0]++; + tState++; break; case 1: - data[1]++; - if (data[1] >= data[2]) + tTimer++; + if (tTimer >= tDelay) { - data[1] = 0; + tTimer = 0; TitleScreen_rand(taskId, 3); - data[2] = 18; + tDelay = 18; xspeed = (TitleScreen_rand(taskId, 3) % 4) - 2; yspeed = (TitleScreen_rand(taskId, 3) % 8) - 16; - y = (TitleScreen_rand(taskId, 3) % 3) + 0x74; + y = (TitleScreen_rand(taskId, 3) % 3) + 116; x = TitleScreen_rand(taskId, 3) % 240; - CreateFlameOrLeafSprite( + CreateFlameSprite( x, y, xspeed, yspeed, - (TitleScreen_rand(taskId, 3) % 16) < 8 ? 0 : 1 + (TitleScreen_rand(taskId, 3) % 16) < 8 ? FALSE : TRUE ); for (i = 0; i < 15; i++) { - CreateFlameOrLeafSprite( - data[5] + gUnknown_83BFBD4[i], + CreateFlameSprite( + tOffsetX + sFlameXPositions[i], y, xspeed, yspeed, - 1 + TRUE ); xspeed = (TitleScreen_rand(taskId, 3) % 4) - 2; yspeed = (TitleScreen_rand(taskId, 3) % 8) - 16; } - data[5]++; - if (data[5] > 3) - data[5] = 0; + tOffsetX++; + if (tOffsetX > 3) + tOffsetX = 0; } } } +#undef tState +#undef tTimer +#undef tDelay +#undef tOff_Seed +#undef tOffsetX + #elif defined(LEAFGREEN) -static void CreateFlameOrLeafSprite(s32 y0, s32 x1, s32 y1) +#define sPosX data[0] +#define sSpeedX data[1] +#define sPosY data[2] +#define sSpeedY data[3] + +static void SpriteCallback_TitleScreenLeaf(struct Sprite *sprite) { - u8 spriteId = CreateSprite(&sSpriteTemplate_FlameOrLeaf_State1, 0xF0, y0, 0); - if (spriteId != MAX_SPRITES) + s16 *data = sprite->data; + sprite->sPosX -= sSpeedX; + sprite->x = sprite->sPosX >> 4; + if (sprite->x < -8) { - gSprites[spriteId].data[0] = 0xF00; - gSprites[spriteId].data[1] = x1; - gSprites[spriteId].data[2] = y0 << 4; - gSprites[spriteId].data[3] = y1; - gSprites[spriteId].callback = SpriteCallback_TitleScreenFlameOrLeaf; + DestroySprite(sprite); + return; + } + sPosY += sSpeedY; + sprite->y = sPosY >> 4; + if (sprite->y < 16 || sprite->y > 200) + { + DestroySprite(sprite); + return; + } + if (!data[5]) + { // meaningless, since data[5] and data[6] are never used outside this block + s32 r2; + s32 r1; + data[6]++; + r2 = sSpeedX * data[6]; + r1 = sSpeedY * data[6]; + r2 = (r2 * r2) >> 4; + r1 = (r1 * r1) >> 4; + if (r2 + r1 >= 81 << 4) + data[5] = TRUE; } } -static void SpriteCallback_LG_8079800(struct Sprite *sprite) +static void CreateLeafSprite(s32 y, s32 xspeed, s32 yspeed) +{ + u8 spriteId = CreateSprite(&sSpriteTemplate_FlameOrLeaf, DISPLAY_WIDTH, y, 0); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].sPosX = DISPLAY_WIDTH * 16; + gSprites[spriteId].sSpeedX = xspeed; + gSprites[spriteId].sPosY = y * 16; + gSprites[spriteId].sSpeedY = yspeed; + gSprites[spriteId].callback = SpriteCallback_TitleScreenLeaf; + } +} + +#undef sPosX +#undef sSpeedX +#undef sPosY +#undef sSpeedY + +static void SpriteCallback_Streak(struct Sprite *sprite) { sprite->x -= 7; if (sprite->x < -16) { - sprite->x = 0x100; + sprite->x = DISPLAY_WIDTH + 16; sprite->data[7]++; - if (sprite->data[7] >= NELEMS(gUnknown_LG_83BFA10)) + if (sprite->data[7] >= ARRAY_COUNT(sStreakYPositions)) sprite->data[7] = 0; - sprite->y = gUnknown_LG_83BFA10[sprite->data[7]]; + sprite->y = sStreakYPositions[sprite->data[7]]; } } -static void sub_LG_8079844(void) +static void CreateStreakSprites(void) { int i; u8 spriteId; for (i = 0; i < 4; i++) { - spriteId = CreateSprite(&sSpriteTemplate_FlameOrLeaf_State0, 0x100 + 0x28 * i, gUnknown_LG_83BFA10[i], 0xFF); + spriteId = CreateSprite(&sSpriteTemplate_Streak, DISPLAY_WIDTH + 16 + 40 * i, sStreakYPositions[i], 0xFF); if (spriteId != MAX_SPRITES) { gSprites[spriteId].data[7] = i; - gSprites[spriteId].callback = SpriteCallback_LG_8079800; + gSprites[spriteId].callback = SpriteCallback_Streak; } } } -static void Task_FlameOrLeafSpawner(u8 taskId) -{ - s16 * data = gTasks[taskId].data; - s32 rval; - s32 r6; - s32 r4; - s32 r0; +#define tState data[0] +#define tTimer data[1] +#define tDelay data[2] +#define tOff_Seed 3 // data[3] and data[4] - switch (data[0]) +static void Task_LeafSpawner(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + s32 rval; + s32 xspeed; + s32 yspeed; + s32 y; + + switch (tState) { case 0: - sub_LG_8079844(); - TitleScreen_srand(taskId, 3, 30840); - data[0]++; + CreateStreakSprites(); + TitleScreen_srand(taskId, tOff_Seed, 30840); + tState++; break; case 1: - data[1]++; - if (data[1] >= data[2]) + tTimer++; + if (tTimer >= tDelay) { - data[1] = 0; - data[2] = (TitleScreen_rand(taskId, 3) % 6) + 6; - rval = TitleScreen_rand(taskId, 3) % 30; - r6 = 16; + tTimer = 0; + tDelay = (TitleScreen_rand(taskId, tOff_Seed) % 6) + 6; + rval = TitleScreen_rand(taskId, tOff_Seed) % 30; + xspeed = 16; if (rval >= 6) { - r6 = 48; + xspeed = 48; if (rval < 12) - r6 = 24; + xspeed = 24; } - r4 = (TitleScreen_rand(taskId, 3) % 4) - 2; - r0 = (TitleScreen_rand(taskId, 3) % 88) + 32; - CreateFlameOrLeafSprite(r0, r6, r4); + yspeed = (TitleScreen_rand(taskId, tOff_Seed) % 4) - 2; + y = (TitleScreen_rand(taskId, tOff_Seed) % 88) + 32; + CreateLeafSprite(y, xspeed, yspeed); } break; } } +#undef tState +#undef tData1 +#undef tData2 +#undef tData3And4 + #endif //FRLG static void TitleScreen_srand(u8 taskId, u8 field, u16 seed) @@ -1129,30 +1217,34 @@ static u16 TitleScreen_rand(u8 taskId, u8 field) static u32 CreateBlankSprite(void) { - CreateSprite(&sUnknownEmptySprite, 0x18, 0x90, 0); - return IndexOfSpritePaletteTag(2); + CreateSprite(&sSpriteTemplate_BlankSprite, 24, 144, 0); + return IndexOfSpritePaletteTag(PAL_TAG_SLASH); } -static void SetPalOnOrCreateBlankSprite(bool32 mode) +static void SetPalOnOrCreateBlankSprite(bool32 hasCreatedBlankSprite) { u32 palIdx; - if (mode) + if (hasCreatedBlankSprite) { - palIdx = IndexOfSpritePaletteTag(2); - LoadPalette(gGraphics_TitleScreen_FireOrLeafPals, palIdx * 16 + 0x100, 0x20); + palIdx = IndexOfSpritePaletteTag(PAL_TAG_SLASH); + LoadPalette(gTitleScreen_Slash_Pal, palIdx * 16 + 0x100, 0x20); } else CreateBlankSprite(); } +#define sState data[0] +#define sTimer data[1] +#define sHidden data[2] + static u8 CreateSlashSprite(void) { - u8 spriteId = CreateSprite(&sSlashSpriteTemplate, -0x20, 0x1B, 1); + u8 spriteId = CreateSprite(&sSlashSpriteTemplate, -32, 27, 1); if (spriteId != MAX_SPRITES) { gSprites[spriteId].callback = SpriteCallback_Slash; - gSprites[spriteId].data[1] = 540; + gSprites[spriteId].sTimer = 540; } return spriteId; } @@ -1160,54 +1252,52 @@ static u8 CreateSlashSprite(void) static void ScheduleHideSlashSprite(u8 spriteId) { if (spriteId != MAX_SPRITES) - gSprites[spriteId].data[2] = TRUE; + gSprites[spriteId].sHidden = TRUE; } static bool32 IsSlashSpriteHidden(u8 spriteId) { if (spriteId != MAX_SPRITES) - return gSprites[spriteId].data[0] ^ 2 ? TRUE : FALSE; + return gSprites[spriteId].sState ^ 2 ? TRUE : FALSE; else return FALSE; } static void SpriteCallback_Slash(struct Sprite *sprite) { - switch (sprite->data[0]) + switch (sprite->sState) { case 0: - if (sprite->data[2]) + if (sprite->sHidden) { sprite->invisible = TRUE; - sprite->data[0] = 2; + sprite->sState = 2; } - sprite->data[1]--; - if (sprite->data[1] == 0) + sprite->sTimer--; + if (sprite->sTimer == 0) { sprite->invisible = FALSE; - sprite->data[0] = 1; + sprite->sState = 1; } break; case 1: sprite->x += 9; if (sprite->x == 67) - { sprite->y -= 7; - } + if (sprite->x == 148) - { sprite->y += 7; - } + if (sprite->x > 272) { sprite->invisible = TRUE; - if (sprite->data[2]) - sprite->data[0] = 2; + if (sprite->sHidden) + sprite->sState = 2; else { - sprite->x = -0x20; - sprite->data[1] = 540; - sprite->data[0] = 0; + sprite->x = -32; + sprite->sTimer = 540; + sprite->sState = 0; } } break; @@ -1215,3 +1305,7 @@ static void SpriteCallback_Slash(struct Sprite *sprite) break; } } + +#undef sState +#undef sTimer +#undef sHidden