diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/demo.c | 2 | ||||
| -rw-r--r-- | src/fileselect.c | 4 | ||||
| -rw-r--r-- | src/game.c | 19 | ||||
| -rw-r--r-- | src/menu/kinstone_menu.c | 7 | ||||
| -rw-r--r-- | src/npc/phonograph.c | 2 | ||||
| -rw-r--r-- | src/object/figurineDevice.c | 4 | ||||
| -rw-r--r-- | src/staffroll.c | 326 | ||||
| -rw-r--r-- | src/subtask2.c | 2 |
8 files changed, 339 insertions, 27 deletions
@@ -216,7 +216,7 @@ void sub_080A3198(u32 param_1, u32 param_2) { MemClear(gUnk_08127C98 - 0x1e, 0x180); if (r4 != 0) { - sub_0805F46C(r4, &gUnk_08127C98); + sub_0805F46C(r4, (Font*)&gUnk_08127C98); // TODO } gScreen.bg0.updated = 1; diff --git a/src/fileselect.c b/src/fileselect.c index 93355380..4d7268a1 100644 --- a/src/fileselect.c +++ b/src/fileselect.c @@ -106,12 +106,12 @@ void sub_08051458(void); void CreateDialogBox(u32 arg0, u32 arg1) { u32 sfx; - struct_080FC844 var0; + Font var0; sub_08050384(); MemCopy(&gUnk_080FC844, &var0, sizeof(gUnk_080FC844)); sub_08056FEC(arg1, gUnk_020227E8); - var0.unk10 |= gUnk_080FC85C[arg0][0] << 0xC; + var0.gfx_src |= gUnk_080FC85C[arg0][0] << 0xC; sub_0805F46C(gUnk_080FC85C[arg0][1], &var0); sfx = gUnk_080FC85C[arg0][2]; if (sfx) { @@ -85,7 +85,6 @@ extern void* gUnk_080B755C[]; extern void** gExitLists[]; extern void** gAreaTable[]; -extern void CreateDialogBox(u32, u32); extern void FinalizeSave(void); extern void ClearArmosData(void); extern void ClearRoomMemory(void); @@ -169,24 +168,6 @@ typedef struct { extern struct_08127F94 gUnk_08127F94[]; typedef struct { - u16* dest; - void* gfx_dest; - void* buffer_loc; - u32 _c; - u16 gfx_src; - u8 width; - u8 right_align : 1; - u8 sm_border : 1; - u8 unused : 1; - u8 draw_border : 1; - u8 border_type : 4; - u8 fill_type; - u8 _15; - u8 _16; - u8 stylized; -} Font; - -typedef struct { u8 dest_off[8]; u8 _8; u8 right_align; diff --git a/src/menu/kinstone_menu.c b/src/menu/kinstone_menu.c index 2643eb57..b9d9ca2a 100644 --- a/src/menu/kinstone_menu.c +++ b/src/menu/kinstone_menu.c @@ -74,6 +74,13 @@ Subtask KinstoneMenu_Type2; Subtask KinstoneMenu_Type3; Subtask KinstoneMenu_Type4; Subtask KinstoneMenu_Type5; + +ASM_FUNC("asm/non_matching/menu/kinstone_menu/sub_080A3B48.inc", s32 sub_080A3B48(void)) + +void sub_080A3B74(void) { + gKinstoneMenu.unk2f = 0; +} + void Subtask_KinstoneMenu(void) { static Subtask* const kinstoneMenuTypes[] = { KinstoneMenu_Type0, KinstoneMenu_Type1, KinstoneMenu_Type2, diff --git a/src/npc/phonograph.c b/src/npc/phonograph.c index dd731979..8643cf95 100644 --- a/src/npc/phonograph.c +++ b/src/npc/phonograph.c @@ -12,7 +12,7 @@ void sub_0806EABC(Entity* this); void sub_0806EABC(Entity* this, u32 param); #endif -extern u32 gUnk_081146B8; +extern Font gUnk_081146B8; extern s8 gUnk_081145E4[]; void Phonograph(Entity* this) { diff --git a/src/object/figurineDevice.c b/src/object/figurineDevice.c index 22c63ddc..a9efe80c 100644 --- a/src/object/figurineDevice.c +++ b/src/object/figurineDevice.c @@ -417,9 +417,9 @@ void sub_080882A8(FigurineDeviceEntity* this) { sub_08057044(this->unk_83, &gUnk_020227E8[1], 0x202020); ptr = (u8*)0x02000000; if (ptr[7] == 0) { - sub_0805F46C((u32)gUnk_08120AE4[super->type2], &gUnk_08120AB4); + sub_0805F46C((u32)gUnk_08120AE4[super->type2], (Font*)&gUnk_08120AB4); // TODO convert data } else { - sub_0805F46C((u32)gUnk_08120AE4[super->type2], &gUnk_08120ACC); + sub_0805F46C((u32)gUnk_08120AE4[super->type2], (Font*)&gUnk_08120ACC); // TODO convert data } gScreen.bg0.updated = 1; } diff --git a/src/staffroll.c b/src/staffroll.c new file mode 100644 index 00000000..2a9077b4 --- /dev/null +++ b/src/staffroll.c @@ -0,0 +1,326 @@ +#include "global.h" +#include "room.h" +#include "main.h" +#include "save.h" +#include "flags.h" +#include "fileselect.h" +#include "screen.h" +#include "common.h" +#include "menu.h" +#include "game.h" +#include "subtask.h" + +typedef struct { + /*0x00*/ Menu base; + s16 unk_10; + u16 unk_12; + u16 unk_14; + u8 unk_16; + u8 unk_17; + u8 unk_18; + u8 unk_19; + u8 bgmMusicStarted; + u8 unk_1b[0x14]; + u8 unk_2f; +} StaffrollMenu; +#define gStaffrollMenu (*(StaffrollMenu*)&gMenu) + +const Font gUnk_08127280 = { + (u16*)0x02021f72, (void*)0x0600c400, gTextGfxBuffer, 0, 61472, 240, 0, 0, 0, 0, 0, 5, 0, 1, 0 +}; +const Font gUnk_08127298 = { + (u16*)0x02021f90, (void*)0x0600c400, gTextGfxBuffer, 0, 61472, 240, 0, 0, 0, 0, 0, 5, 0, 1, 0 +}; +const Font gUnk_081272B0 = { + (u16*)0x0202204e, (void*)0x0600c400, gTextGfxBuffer, 0, 61472, 240, 1, 0, 0, 0, 0, 5, 0, 1, 0 +}; +const Font gUnk_081272C8 = { + (u16*)0x020222ce, (void*)0x0600c400, gTextGfxBuffer, 0, 61472, 240, 1, 0, 0, 0, 0, 5, 0, 1, 0 +}; + +const Font* const gUnk_081272E0[] = { + &gUnk_08127280, + &gUnk_08127298, + &gUnk_081272B0, + &gUnk_081272C8, +}; + +// TODO figure out structure of gStaffrollMenu.base.field_0xc +extern u8 gUnk_081272F0[]; +extern u8 gUnk_08127644[]; +extern u8 gUnk_08127998[]; +extern const u8 gUnk_08127CEC[]; +extern void (*const gUnk_08127D00[])(void); +extern void (*const gUnk_08127D10[])(void); + +void sub_080A3954(void); + +void StaffrollTask(void) { + gRoomTransition.frameCount += 1; + gUnk_08127D00[gMain.state](); +} + +void StaffrollTask_State0(void) { + gSave.unk6 = 1; + SetGlobalFlag(GAMECLEAR); + gMain.state = 1; + gStaffrollMenu.base.menuType = 0; + gStaffrollMenu.base.transitionTimer = 0xb4; + gStaffrollMenu.unk_16 = 5; + gStaffrollMenu.unk_17 = 4; + gStaffrollMenu.bgmMusicStarted = 0; + if (gSaveHeader->language >= 2) { + gStaffrollMenu.base.field_0xc = gUnk_08127998; + } else { + if (gSaveHeader->language == 1) { + gStaffrollMenu.base.field_0xc = gUnk_08127644; + } else { + gStaffrollMenu.base.field_0xc = gUnk_081272F0; + } + } + DispReset(0); + LoadPaletteGroup(0xb); + LoadPaletteGroup(0xc); + SetColor(0, 0); + gScreen.lcd.displayControl = 0x640; + gScreen.controls.layerFXControl = 0x2442; + gScreen.controls.alphaBlend = 0x1000; + gScreen.bg1.control = 0x1e4d; + gScreen.bg2.control = 0x1dc3; + InitSoundPlayingInfo(); + ResetSystemPriority(); + SetFade(5, 0x100); +} + +void StaffrollTask_State1(void) { + gUnk_08127D10[gMenu.menuType](); +} + +void StaffrollTask_State1MenuType0(void) { + gMenu.transitionTimer -= 1; + if (gMenu.transitionTimer == 0) { + sub_080A3954(); + } +} + +void StaffrollTask_State1MenuType1(void) { + if (gFadeControl.active == 0) { + const u8* ptr = &gUnk_08127CEC[gStaffrollMenu.unk_10 * 2]; + LoadPaletteGroup(ptr[0]); + LoadGfxGroup(ptr[1]); + MemClear(&gBG1Buffer, 0x800); + gScreen.bg1.updated = 1; + gScreen.bg2.xOffset = gStaffrollMenu.unk_12; + gScreen.controls.alphaBlend = 0x1000; + gStaffrollMenu.base.menuType = 0; + if (gStaffrollMenu.bgmMusicStarted == 0) { + gStaffrollMenu.bgmMusicStarted = 1; + SoundReq(BGM_CREDITS); + } + SetFade(4, 8); + } +} + +void StaffrollTask_State1MenuType2(void) { + u8 tmp; + switch (gStaffrollMenu.base.overlayType) { + case 0: + MemClear(&gBG1Buffer, 0x800); + sub_0805F46C(gStaffrollMenu.unk_10, (Font*)gUnk_081272E0[gStaffrollMenu.unk_19]); + gScreen.bg1.updated = 1; + gStaffrollMenu.base.overlayType++; + gStaffrollMenu.unk_18 = 0; + break; + case 1: + if (gFadeControl.active != 0) { + return; + } + if ((gRoomTransition.frameCount & 1) != 0) { + return; + } + tmp = ++gStaffrollMenu.unk_18; + gScreen.controls.alphaBlend = (0x10 - tmp) * 0x100 | tmp; + if (gStaffrollMenu.unk_18 >= 0x10) { + gStaffrollMenu.base.overlayType++; + } + break; + case 2: + gStaffrollMenu.base.transitionTimer--; + if (gStaffrollMenu.base.transitionTimer == 0) { + gStaffrollMenu.base.overlayType++; + } + break; + case 3: + if ((gRoomTransition.frameCount & 1) != 0) { + return; + } + tmp = --gStaffrollMenu.unk_18; + gScreen.controls.alphaBlend = (0x10 - tmp) * 0x100 | tmp; + if (gStaffrollMenu.unk_18 == 0) { + gStaffrollMenu.base.overlayType++; + } + break; + default: + if (gFadeControl.active == 0) { + gFadeControl.mask = 0xffffffff; + sub_080A3954(); + } + break; + } +} + +void StaffrollTask_State1MenuType3(void) { + gMenu.transitionTimer--; + if (gMenu.transitionTimer == 0) { + sub_080A3954(); + SetFade(5, 8); + } +} + +void StaffrollTask_State1MenuType4(void) { + gFadeControl.mask = 0xffff7fff; + SetFade(5, 4); + SetFadeProgress(gMenu.transitionTimer); + sub_080A3954(); +} + +void StaffrollTask_State1MenuType5(void) { + SetFade(4, 4); + SetFadeProgress(gMenu.transitionTimer); + sub_080A3954(); +} + +void StaffrollTask_State1MenuType6(void) { + if (gFadeControl.active == 0) { + MemClear(&gBG1Buffer, 0x800); + gScreen.bg1.updated = 1; + MemClear(&gBG2Buffer, 0x800); + gScreen.bg2.updated = 1; + gScreen.controls.alphaBlend = 0x1000; + gMenu.menuType = 0; + SetFade(4, 8); + } +} + +void StaffrollTask_State1MenuType7(void) { + if (gFadeControl.active == 0) { + SetFade(7, 8); + gMain.state = 2; + } +} + +void sub_080A3954(void) { + u16* puVar1; + u16* puVar2; + u16* puVar3; + u8* pbVar4; + + puVar1 = (u16*)(gStaffrollMenu.base.field_0xc + 6); + puVar2 = (u16*)(gStaffrollMenu.base.field_0xc + 8); + puVar3 = (u16*)(gStaffrollMenu.base.field_0xc + 10); + pbVar4 = gStaffrollMenu.base.field_0xc + 1; + gStaffrollMenu.base.menuType = *gStaffrollMenu.base.field_0xc; + gStaffrollMenu.base.overlayType = 0; + gStaffrollMenu.unk_10 = *puVar1; + gStaffrollMenu.base.transitionTimer = *(u16*)(gStaffrollMenu.base.field_0xc + 4); + gStaffrollMenu.unk_12 = *puVar2; + gStaffrollMenu.unk_14 = *puVar3; + gStaffrollMenu.unk_19 = *pbVar4; + gStaffrollMenu.base.field_0xc += 0xc; +} + +void StaffrollTask_State3(void) { + if (gFadeControl.active == 0) { + DoSoftReset(); + } +} + +void StaffrollTask_State2(void) { + SaveResult saveResult; + u32 choice; + u32 tmp; + switch (gStaffrollMenu.base.overlayType) { + case 0: + gStaffrollMenu.base.overlayType = 1; + gStaffrollMenu.base.transitionTimer = 0x1e; + gStaffrollMenu.base.field_0x3 = 0; + DispReset(1); + InitSoundPlayingInfo(); + sub_080A4D34(); + LoadPaletteGroup(10); + SetColor(0, 0); + LoadGfxGroup(4); + MemClear((void*)VRAM, 0x20); + SetPopupState(0, 0); + gScreen.lcd.displayControl |= 0x600; + gScreen.bg1.control = 0x1c01; + gScreen.bg2.control = 0x1d05; + gScreen.bg2.updated = 1; + SetFade(4, 8); + break; + case 1: + if (gFadeControl.active == 0) { + if (gStaffrollMenu.base.transitionTimer != 0) { + gStaffrollMenu.base.transitionTimer--; + } else { + choice = gStaffrollMenu.base.field_0x3; + switch (gInput.newKeys) { + case 0x40: + choice = 0; + break; + case 0x80: + choice = 1; + break; + case 1: + if (choice != 0) { + tmp = 4; + } else { + CreateDialogBox(8, 0); + tmp = 2; + } + gStaffrollMenu.base.overlayType = tmp; + gStaffrollMenu.base.transitionTimer = 0x3c; + SoundReq(SFX_TEXTBOX_SELECT); + break; + } + if (gStaffrollMenu.base.field_0x3 != choice) { + gStaffrollMenu.base.field_0x3 = choice; + SetPopupState(0, choice); + SoundReq(SFX_TEXTBOX_CHOICE); + } + } + } + break; + case 2: + saveResult = HandleSave(0); + gStaffrollMenu.base.field_0x0 = saveResult; + switch (saveResult) { + case SAVE_OK: + gStaffrollMenu.base.overlayType = 4; + break; + case SAVE_ERROR: + gStaffrollMenu.base.transitionTimer = 0x3c; + CreateDialogBox(9, 0); + gStaffrollMenu.base.overlayType = 3; + break; + } + break; + case 3: + if (gStaffrollMenu.base.transitionTimer != 0) { + gStaffrollMenu.base.transitionTimer--; + } else { + if ((gInput.newKeys & 0xb) != 0) { + gStaffrollMenu.base.overlayType = 1; + } + } + break; + case 4: + default: + gScreen.lcd.displayControl &= 0xfdff; + sub_08050384(); + SetFade(7, 8); + gMain.state = 3; + gStaffrollMenu.base.overlayType = 0; + break; + } +} diff --git a/src/subtask2.c b/src/subtask2.c index 47542862..f27faf5e 100644 --- a/src/subtask2.c +++ b/src/subtask2.c @@ -11,8 +11,6 @@ #include "main.h" #include "message.h" -extern void CreateDialogBox(u32, u32); - extern u8 gUnk_08128D38[]; extern u8 gUnk_08128D43[]; |
