diff options
Diffstat (limited to 'src/hints_menu.c')
-rw-r--r-- | src/hints_menu.c | 285 |
1 files changed, 285 insertions, 0 deletions
diff --git a/src/hints_menu.c b/src/hints_menu.c new file mode 100644 index 0000000..15c1936 --- /dev/null +++ b/src/hints_menu.c @@ -0,0 +1,285 @@ +#include "global.h" +#include "memory.h" +#include "text.h" +#include "input.h" + +#define MAX_HINTS 5 + +struct Hints +{ + u8 *heading; + u8 *body; +}; + +struct unkStruct_203B268 +{ + // size: 0xA0 + u32 unk0; + u8 fill4[0x1E - 0x4]; + s16 helpPageIndex; + u16 unk20; + u8 fill22[0x34 - 0x22]; + u32 unk34; + struct UnkTextStruct2 *unk38; + struct UnkTextStruct2 unk3C[4]; + u8 unk9C[4]; +}; + +struct unkStruct_203B264 +{ + // size: 0x9C + u32 unk0; + u8 fill4[0x18 - 0x4]; + s16 unk18; + s16 unk1A; + s16 unk1C; + s16 unk1E; + u16 unk20; + u8 fill22[0x34 - 0x22]; + u32 unk34; + struct UnkTextStruct2 *unk38; + struct UnkTextStruct2 unk3C[4]; +}; + +extern struct unkStruct_203B264 *gUnknown_203B264; + +extern struct unkStruct_203B268 *gUnknown_203B268; + +extern struct UnkTextStruct2 gUnknown_80DC0A0; +extern struct UnkTextStruct2 gUnknown_80DC0BC; +extern struct UnkTextStruct2 gUnknown_80DC0E4; +extern struct UnkTextStruct2 gUnknown_80DC0FC; +extern struct Hints gGameHints[MAX_HINTS]; +extern u8 gUnknown_80DC0D4[MAX_HINTS]; + +extern void sub_801E714(void); +extern void sub_8013818(void *, u32, u32, u32); +extern bool8 sub_8013938(void *); +extern s32 GetKeyPress(void *); +extern void PlayMenuSoundEffect(u32); +extern void sub_801E714(void); +extern void sub_801E76C(void); +extern void DisplayChosenHint(void); +extern void xxx_call_draw_string(s32, u32, u8 *, u32, u32); +extern void sub_80073E0(u32); +extern void sub_80073B8(u32); +extern s32 sub_8013800(void *, u32); +extern void sub_8008C54(u32); +void DrawHintSelectionMenu(void); +void sub_801E594(void); +void sub_8013984(void *); +void AddMenuCursorSprite(void *); +extern u8 sub_80138B8(void *, u32); +extern void sub_8013660(void *); +extern void sub_8012D08(struct UnkTextStruct2 *, u32); + +u32 sub_801E3F0(u32 r0) +{ + if(gUnknown_203B264 == NULL) + gUnknown_203B264 = MemoryAlloc(sizeof(struct unkStruct_203B264), 8); + gUnknown_203B264->unk34 = r0; + gUnknown_203B264->unk38 = &gUnknown_203B264->unk3C[r0]; + sub_8006518(gUnknown_203B264->unk3C); + gUnknown_203B264->unk3C[gUnknown_203B264->unk34] = gUnknown_80DC0BC; + sub_8012D08(gUnknown_203B264->unk38, 0xA); + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B264->unk3C, 1, 1); + sub_8013818(gUnknown_203B264, 0x5, 0xA, r0); + sub_801E594(); + DrawHintSelectionMenu(); + return 1; +} + +u32 sub_801E474(u8 r0) +{ + if(r0 == 0) + { + sub_8013660(gUnknown_203B264); + return 0; + } + switch(GetKeyPress(gUnknown_203B264)) + { + case 2: + PlayMenuSoundEffect(1); + return 2; + case 1: + PlayMenuSoundEffect(0); + return 3; + case 4: + PlayMenuSoundEffect(4); + return 4; + default: + if(sub_80138B8(gUnknown_203B264, 1)) + { + sub_801E594(); + DrawHintSelectionMenu(); + return 1; + } + else + return 0; + } +} + +s32 GetChosenHintIndex(void) +{ + return (gUnknown_203B264->unk1E * gUnknown_203B264->unk1C) + gUnknown_203B264->unk18; +} + +void CreateHintSelectionScreen(u32 r0) +{ + u8 bool8_r0; + bool8_r0 = r0; + + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B264->unk3C, 0, 0); + sub_8013984(gUnknown_203B264); + sub_801E594(); + DrawHintSelectionMenu(); + if(bool8_r0) + AddMenuCursorSprite(gUnknown_203B264); +} + +void sub_801E54C(void) +{ + if(gUnknown_203B264 != NULL) + { + gUnknown_203B264->unk3C[gUnknown_203B264->unk34] = gUnknown_80DC0A0; + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B264->unk3C, 1, 1); + MemoryFree(gUnknown_203B264); + gUnknown_203B264 = NULL; + } +} + +NAKED +void sub_801E594(void) +{ + asm_unified( + "\tpush {r4,lr}\n" + "\tldr r4, _0801E5E4\n" + "\tldr r0, [r4]\n" + "\tmovs r1, 0x1A\n" + "\tldrsh r0, [r0, r1]\n" + "\tmovs r1, 0xC\n" + "\tbl sub_80095E4\n" + "\tadds r0, 0x2\n" + "\tlsls r0, 16\n" + "\tldr r2, [r4]\n" + "\tldr r3, [r2, 0x34]\n" + "\tlsls r1, r3, 1\n" + "\tadds r1, r3\n" + "\tlsls r1, 3\n" + "\tadds r1, r2, r1\n" + "\tadds r1, 0x4A\n" + "\tasrs r3, r0, 16\n" + "\tlsrs r0, 16\n" + "\tstrh r0, [r1]\n" + "\tldr r1, [r2, 0x34]\n" + "\tlsls r0, r1, 1\n" + "\tadds r0, r1\n" + "\tlsls r0, 3\n" + "\tadds r2, r0\n" + "\tadds r3, 0x2\n" + "\tadds r2, 0x4C\n" + "\tstrh r3, [r2]\n" + "\tbl ResetUnusedInputStruct\n" + "\tldr r0, [r4]\n" + "\tadds r0, 0x3C\n" + "\tmovs r1, 0x1\n" + "\tmovs r2, 0x1\n" + "\tbl sub_800641C\n" + "\tpop {r4}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" +"_0801E5E4: .4byte gUnknown_203B264"); +} + +void DrawHintSelectionMenu(void) +{ + s32 hintIndex; + s32 y; + + sub_8008C54(gUnknown_203B264->unk34); + sub_80073B8(gUnknown_203B264->unk34); + xxx_call_draw_string(16, 0, gUnknown_80DC0D4, gUnknown_203B264->unk34, 0); + for(hintIndex = 0; hintIndex < MAX_HINTS; hintIndex++) + { + y = sub_8013800(gUnknown_203B264, hintIndex); + xxx_call_draw_string(10, y, gGameHints[hintIndex].heading, gUnknown_203B264->unk34, 0); + } + sub_80073E0(gUnknown_203B264->unk34); +} + +u32 CreateHintDisplayScreen(u32 index) +{ + gUnknown_203B268 = MemoryAlloc(sizeof(struct unkStruct_203B268), 8); + gUnknown_203B268->unk34 = 0; + gUnknown_203B268->unk38 = gUnknown_203B268->unk3C; + sub_8006518(gUnknown_203B268->unk3C); + gUnknown_203B268->unk3C[gUnknown_203B268->unk34] = gUnknown_80DC0FC; + gUnknown_203B268->unk38->unk14 = gUnknown_203B268->unk9C; + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B268->unk3C, 1, 1); + sub_8013818(gUnknown_203B268, 5, 1, gUnknown_203B268->unk34); + gUnknown_203B268->helpPageIndex = index; + sub_801E714(); + + return 1; +} + +u32 HandleHintDisplayScreenInput(void) +{ + switch(GetKeyPress(gUnknown_203B268)) + { + case 2: + PlayMenuSoundEffect(1); + return 2; + case 1: + PlayMenuSoundEffect(0); + return 3; + default: + if(sub_8013938(gUnknown_203B268)){ + sub_801E714(); + return 1; + } + else + return 0; + } +} + +void sub_801E714(void) +{ + sub_801E76C(); + DisplayChosenHint(); +} + +void DestroyHintDisplayScreen(void) +{ + if(gUnknown_203B268 != NULL) + { + gUnknown_203B268->unk3C[gUnknown_203B268->unk34] = gUnknown_80DC0E4; + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B268->unk3C, 1, 1); + MemoryFree(gUnknown_203B268); + gUnknown_203B268 = NULL; + } +} + +void sub_801E76C(void) +{ + gUnknown_203B268->unk9C[0] = gUnknown_203B268->unk20; + gUnknown_203B268->unk9C[1] = gUnknown_203B268->helpPageIndex; + gUnknown_203B268->unk9C[2] = 0xF; + gUnknown_203B268->unk9C[3] = 0; + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B268->unk3C, 1, 1); +} + +void DisplayChosenHint(void) +{ + sub_80073B8(gUnknown_203B268->unk34); + xxx_call_draw_string((gUnknown_203B268->helpPageIndex << 3) + 0x10, 0, gGameHints[gUnknown_203B268->helpPageIndex].heading, gUnknown_203B268->unk34, 0); + xxx_call_draw_string(0xA, 0x14, gGameHints[gUnknown_203B268->helpPageIndex].body, gUnknown_203B268->unk34, 0); + sub_80073E0(gUnknown_203B268->unk34); +} |