summaryrefslogtreecommitdiff
path: root/src/title_screen.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/title_screen.c')
-rw-r--r--src/title_screen.c468
1 files changed, 452 insertions, 16 deletions
diff --git a/src/title_screen.c b/src/title_screen.c
index 9e779bb7b..32324ec7a 100644
--- a/src/title_screen.c
+++ b/src/title_screen.c
@@ -8,7 +8,32 @@
#include "new_menu_helpers.h"
#include "m4a.h"
#include "scanline_effect.h"
+#include "graphics.h"
+#include "help_system.h"
+#include "intro.h"
+#include "load_save.h"
+#include "sound.h"
+#include "new_game.h"
+#include "save.h"
+#include "main_menu.h"
#include "constants/songs.h"
+#include "constants/species.h"
+
+enum TitleScreenScene
+{
+ TITLESCREENSCENE_INIT = 0,
+ TITLESCREENSCENE_FLASHSPRITE,
+ TITLESCREENSCENE_FADEIN,
+ TITLESCREENSCENE_RUN,
+ TITLESCREENSCEEN_RESTART,
+ TITLESCREENSCENE_CRY
+};
+
+#if defined(FIRERED)
+#define TITLE_SPECIES SPECIES_CHARIZARD
+#elif defined(LEAFGREEN)
+#define TITLE_SPECIES SPECIES_VENUSAUR
+#endif
EWRAM_DATA u8 gUnknown_2037F30 = 0;
@@ -22,28 +47,190 @@ void sub_8078C9C(s16 * data);
void sub_8078D24(s16 * data);
void sub_8078DA4(s16 * data);
void sub_8078FC4(s16 * data);
+void sub_80790A0(void);
void sub_80790CC(s16 * data);
void sub_80791C0(s16 * data);
-void sub_8079708(void);
+void sub_80792C8(u8 taskId);
+void sub_807941C(u8 taskId);
+void sub_8079528(void);
+void sub_8079550(s16 a0);
void sub_8079620(void);
void sub_8079648(void);
+void sub_80796CC(void);
+void sub_80796E8(void);
+void sub_8079708(void);
+void sub_8079840(u8 taskId);
+u32 sub_80799F0(void);
void sub_8079A10(s16 a0);
+u8 sub_8079A40(void);
+void sub_8079A88(u8 spriteId);
+bool32 sub_8079AA8(u8 spriteId);
+// bg3
const u8 gUnknown_83BF58C[] = INCBIN_U8("data/graphics/title_screen/unk_83BF58C.4bpp.lz");
const u8 gUnknown_83BF5A8[] = INCBIN_U8("data/graphics/title_screen/unk_83BF5A8.bin.lz");
-extern const struct BgTemplate gUnknown_83BFB74[4];
-extern const void (*const gUnknown_83BFB84[])(s16 * data);
-
-/*graphics.h*/
-extern const u16 gUnknown_8EAB6C4[];
-extern const u8 gUnknown_8EAB8C4[];
-extern const u8 gUnknown_8EAD390[];
-extern const u16 gUnknown_8EAD5E8[];
-extern const u8 gUnknown_8EAD608[];
-extern const u8 gUnknown_8EADEE4[];
-extern const u16 gUnknown_8EAE094[];
-extern const u8 gUnknown_8EAE0B4[];
-extern const u8 gUnknown_8EAE374[];
+
+//sprites
+const u8 gUnknown_83BF64C[] = INCBIN_U8("data/graphics/title_screen/unk_83bf64c.4bpp.lz");
+const u16 gUnknown_83BF77C[] = INCBIN_U16("data/graphics/title_screen/unk_83bf77c.gbapal");
+const u8 gUnknown_83BF79C[] = INCBIN_U8("data/graphics/title_screen/unk_83bf79c.4bpp.lz");
+const u8 gUnknown_83BFA14[] = INCBIN_U8("data/graphics/title_screen/unk_83bfa14.4bpp.lz");
+
+const struct OamData gOamData_83BFAB4 = {
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .shape = ST_OAM_SQUARE,
+ .size = ST_OAM_SIZE_1,
+ .tileNum = 0,
+ .priority = 3,
+ .paletteNum = 0
+};
+
+const union AnimCmd gSpriteAnims_83BFABC[] = {
+ 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),
+ ANIMCMD_END
+};
+
+const union AnimCmd gSpriteAnims_83BFAE8[] = {
+ ANIMCMD_FRAME(0x18, 6),
+ ANIMCMD_FRAME(0x1c, 6),
+ ANIMCMD_FRAME(0x20, 6),
+ ANIMCMD_FRAME(0x24, 6),
+ ANIMCMD_END
+};
+
+const union AnimCmd *const gSpriteAnimTable_83BFAFC[] = {
+ gSpriteAnims_83BFABC,
+ gSpriteAnims_83BFAE8
+};
+
+const struct SpriteTemplate gUnknown_83BFB04 = {
+ .tileTag = 0,
+ .paletteTag = 0,
+ .oam = &gOamData_83BFAB4,
+ .anims = gSpriteAnimTable_83BFAFC,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+const struct SpriteTemplate gUnknown_83BFB1C = {
+ .tileTag = 1,
+ .paletteTag = 0,
+ .oam = &gOamData_83BFAB4,
+ .anims = gSpriteAnimTable_83BFAFC,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+const struct OamData gOamData_83BFB34 = {
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .shape = ST_OAM_V_RECTANGLE,
+ .size = ST_OAM_SIZE_3,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0
+};
+
+const struct SpriteTemplate gUnknown_83BFB3C = {
+ .tileTag = 2,
+ .paletteTag = 2,
+ .oam = &gOamData_83BFB34,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+const struct OamData gOamData_83BFB54 = {
+ .objMode = ST_OAM_OBJ_WINDOW,
+ .shape = ST_OAM_SQUARE,
+ .size = ST_OAM_SIZE_3,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0
+};
+
+const struct SpriteTemplate gUnknown_83BFB5C = {
+ .tileTag = 3,
+ .paletteTag = 2,
+ .oam = &gOamData_83BFB54,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+const struct BgTemplate gUnknown_83BFB74[] = {
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 1, // 8bpp
+ .priority = 0,
+ .baseTile = 0
+ }, {
+ .bg = 1,
+ .charBaseIndex = 1,
+ .mapBaseIndex = 30,
+ .screenSize = 0,
+ .paletteMode = 0, // 4bpp
+ .priority = 1,
+ .baseTile = 0
+ }, {
+ .bg = 2,
+ .charBaseIndex = 2,
+ .mapBaseIndex = 29,
+ .screenSize = 0,
+ .paletteMode = 0, // 4bpp
+ .priority = 2,
+ .baseTile = 0
+ }, {
+ .bg = 3,
+ .charBaseIndex = 3,
+ .mapBaseIndex = 28,
+ .screenSize = 0,
+ .paletteMode = 0, // 4bpp
+ .priority = 3,
+ .baseTile = 0
+ }
+};
+
+void (*const gUnknown_83BFB84[])(s16 * data) = {
+ sub_8078C9C,
+ sub_8078D24,
+ sub_8078DA4,
+ sub_8078FC4,
+ sub_80790CC,
+ sub_80791C0
+};
+
+const struct CompressedSpriteSheet gUnknown_83BFB9C[] = {
+ {(const void *)gUnknown_83BF79C, 0x500, 0},
+ {(const void *)gUnknown_83BFA14, 0x500, 1},
+ {(const void *)gUnknown_8EAE4A8, 0x400, 2},
+ {(const void *)gUnknown_83BF64C, 0x800, 3}
+};
+
+const struct SpritePalette gUnknown_83BFBBC[] = {
+ {gUnknown_83BF77C, 0},
+ {gUnknown_8EAE488, 2},
+ {}
+};
+
+const u8 gUnknown_83BFBD4[] = {
+ 0x04, 0x10, 0x1a, 0x20, 0x30, 0xc8, 0xd8, 0xe0, 0xe8, 0x3c, 0x4c, 0x5c, 0x6c, 0x80, 0x90
+};
void CB2_InitTitleScreen(void)
{
@@ -155,7 +342,7 @@ void sub_8078C24(u8 taskId)
sub_8079620();
sub_8079648();
sub_8079A10(data[5]);
- sub_8078C90(data, 3);
+ sub_8078C90(data, TITLESCREENSCENE_RUN);
}
else
{
@@ -188,5 +375,254 @@ void sub_8078C9C(s16 * data)
ScanlineEffect_SetParams(params);
- sub_8078C90(data, 1);
+ sub_8078C90(data, TITLESCREENSCENE_FLASHSPRITE);
+}
+
+void sub_8078D24(s16 * data)
+{
+ switch (data[1])
+ {
+ case 0:
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_LIGHTEN);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ data[2] = 0x80;
+ sub_8079550(0x80);
+ data[1]++;
+ break;
+ case 1:
+ data[2] -= 4;
+ sub_8079550(data[2]);
+ if (data[2] < 0)
+ {
+ gScanlineEffect.state = 3;
+ data[1]++;
+ }
+ break;
+ case 2:
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ sub_8078C90(data, TITLESCREENSCENE_FADEIN);
+ }
+}
+
+void sub_8078DA4(s16 * data)
+{
+ u32 r4;
+ switch (data[1])
+ {
+ case 0:
+ data[2] = 0;
+ data[1]++;
+ break;
+ case 1:
+ data[2]++;
+ if (data[2] > 10)
+ {
+ TintPalette_GrayScale2(gPlttBufferUnfaded + 0xD0, 0x10);
+ BeginNormalPaletteFade(0x00002000, 9, 0x10, 0, RGB_BLACK);
+ data[1]++;
+ }
+ break;
+ case 2:
+ if (!gPaletteFade.active)
+ {
+ data[2] = 0;
+ data[1]++;
+ }
+ break;
+ case 3:
+ data[2]++;
+ if (data[2] > 36)
+ {
+ CreateTask(sub_80792C8, 3);
+ sub_80717A8(0x2000, -4, 0x01, 0x10, RGB(30, 30, 31), 0, 0);
+ data[2] = 0;
+ data[1]++;
+ }
+ break;
+ case 4:
+ if (!sub_807185C(0))
+ {
+ sub_80717A8(0x2000, -4, 0x0F, 0x00, RGB(30, 30, 31), 0, 0);
+ data[1]++;
+ }
+ break;
+ case 5:
+ data[2]++;
+ if (data[2] > 20)
+ {
+ data[2] = 0;
+ sub_80717A8(0x2000, -4, 0x01, 0x10, RGB(30, 30, 31), 0, 0);
+ data[1]++;
+ }
+ break;
+ case 6:
+ if (!sub_807185C(0))
+ {
+ sub_80717A8(0x2000, -4, 0x0F, 0x00, RGB(30, 30, 31), 0, 0);
+ data[1]++;
+ }
+ break;
+ case 7:
+ data[2]++;
+ if (data[2] > 20)
+ {
+ data[2] = 0;
+ sub_80717A8(0x2000, -3, 0x00, 0x10, RGB(30, 30, 31), 0, 0);
+ data[1]++;
+ }
+ break;
+ case 8:
+ if (!sub_807185C(0))
+ {
+ data[5] = 1;
+ r4 = (0x10000 << sub_80799F0()) | 0x00001FFF;
+ BlendPalettes(r4, 0x10, RGB(30, 30, 31));
+ BeginNormalPaletteFade(r4, 1, 0x10, 0x00, RGB(30, 30, 31));
+ ShowBg(0);
+ CpuCopy16(gUnknown_8EAD5E8, gPlttBufferUnfaded + 0xD0, 0x20);
+ sub_80717A8(0x2000, 1, 0x0F, 0x00, RGB(30, 30, 31), 0, 0);
+ data[1]++;
+ }
+ break;
+ case 9:
+ if (!sub_807185C(0) && !gPaletteFade.active)
+ {
+ sub_8078C90(data, TITLESCREENSCENE_RUN);
+ }
+ break;
+ }
+}
+
+#define KEYSTROKE_DELSAVE (B_BUTTON | SELECT_BUTTON | DPAD_UP)
+#define KEYSTROKE_BERRY_FIX (B_BUTTON | SELECT_BUTTON)
+
+void sub_8078FC4(s16 * data)
+{
+ switch (data[1])
+ {
+ case 0:
+ HelpSystem_SetSomeVariable2(1);
+ CreateTask(sub_807941C, 0);
+ CreateTask(sub_8079840, 5);
+ sub_80790A0();
+ data[6] = sub_8079A40();
+ sub_812B484();
+ data[1]++;
+ // fallthrough
+ case 1:
+ if (JOY_HELD(KEYSTROKE_DELSAVE) == KEYSTROKE_DELSAVE)
+ {
+ sub_8079A88(data[6]);
+ DestroyTask(FindTaskIdByFunc(sub_8078C24));
+ SetMainCallback2(sub_80796CC);
+ }
+ else if (JOY_HELD(KEYSTROKE_BERRY_FIX) == KEYSTROKE_BERRY_FIX)
+ {
+ sub_8079A88(data[6]);
+ DestroyTask(FindTaskIdByFunc(sub_8078C24));
+ SetMainCallback2(sub_80796E8);
+ }
+ else if (JOY_NEW(A_BUTTON | START_BUTTON))
+ {
+ sub_8078C90(data, TITLESCREENSCENE_CRY);
+ }
+ else if (!FuncIsActiveTask(sub_8078BEC))
+ {
+ sub_8078C90(data, TITLESCREENSCEEN_RESTART);
+ }
+ break;
+ }
+}
+
+void sub_80790A0(void)
+{
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON);
+ SetGpuReg(REG_OFFSET_WINOUT, WIN_RANGE(0x3F, 0x1F));
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_LIGHTEN);
+ SetGpuReg(REG_OFFSET_BLDY, 13);
+}
+
+void sub_80790CC(s16 * data)
+{
+ switch (data[1])
+ {
+ case 0:
+ sub_8079A88(data[6]);
+ data[1]++;
+ break;
+ case 1:
+ if (!gPaletteFade.active && !sub_8079AA8(data[6]))
+ {
+ FadeOutMapMusic(10);
+ BeginNormalPaletteFade(0xFFFFFFFF, 3, 0, 0x10, RGB_BLACK);
+ sub_8079528();
+ data[1]++;
+ }
+ break;
+ case 2:
+ if (IsNotWaitingForBGMStop() && !gPaletteFade.active)
+ {
+ DestroyTask(FindTaskIdByFunc(sub_807941C));
+ data[2] = 0;
+ data[1]++;
+ }
+ break;
+ case 3:
+ data[2]++;
+ if (data[2] >= 20)
+ {
+ DestroyTask(FindTaskIdByFunc(sub_807941C));
+ data[1]++;
+ }
+ break;
+ case 4:
+ sub_812B478();
+ DestroyTask(FindTaskIdByFunc(sub_8078C24));
+ SetMainCallback2(sub_80EC864);
+ break;
+ }
+}
+
+void sub_80791C0(s16 * data)
+{
+ switch (data[1])
+ {
+ case 0:
+ if (!gPaletteFade.active)
+ {
+ PlayCry1(TITLE_SPECIES, 0);
+ sub_8079A88(data[6]);
+ data[2] = 0;
+ data[1]++;
+ }
+ break;
+ case 1:
+ if (data[2] < 90)
+ data[2]++;
+ else if (!sub_8079AA8(data[6]))
+ {
+ BeginNormalPaletteFade(0x0FFFFFFF, 0, 0, 0x10, RGB_WHITE);
+ sub_8079528();
+ FadeOutBGM(4);
+ data[1]++;
+ }
+ break;
+ case 2:
+ if (!gPaletteFade.active)
+ {
+ SeedRngAndSetTrainerId();
+ SetSaveBlocksPointers();
+ ResetMenuAndMonGlobals();
+ Save_ResetSaveCounters();
+ Save_LoadGameData(0);
+ if (gSaveFileStatus == SAVE_STATUS_EMPTY || gSaveFileStatus == SAVE_STATUS_INVALID)
+ Sav2_ClearSetDefault();
+ SetPokemonCryStereo(gSaveBlock2Ptr->optionsSound);
+ InitHeap(gHeap, HEAP_SIZE);
+ SetMainCallback2(sub_800C300);
+ DestroyTask(FindTaskIdByFunc(sub_8078C24));
+ }
+ break;
+ }
}