diff --git a/include/makuhita_dojo.h b/include/makuhita_dojo.h index 91d6f7995..dd2e0c038 100644 --- a/include/makuhita_dojo.h +++ b/include/makuhita_dojo.h @@ -2,6 +2,10 @@ #define GUARD_MAKUHITA_DOJO_H #include "constants/dungeon.h" +#include "file_system.h" +#include "input.h" +#include "menu.h" +#include "text.h" // size: 0xCC struct unkStruct_203B318 diff --git a/ld_script.txt b/ld_script.txt index 1bbbd152d..cdfc9cede 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -142,7 +142,6 @@ SECTIONS { asm/wonder_mail_3_mid.o(.text); src/wonder_mail_3_1.o(.text); src/makuhita_dojo.o(.text); - src/makuhita_dojo_1.o(.text); src/wonder_mail_4.o(.text); src/wonder_mail_5.o(.text); src/wonder_mail_6.o(.text); @@ -416,7 +415,6 @@ SECTIONS { src/pelipper_board.o(.rodata); src/wonder_mail_3_mid.o(.rodata); src/makuhita_dojo.o(.rodata); - src/makuhita_dojo_1.o(.rodata); src/wonder_mail_4.o(.rodata); src/wonder_mail_5.o(.rodata); src/wonder_mail_6.o(.rodata); diff --git a/src/makuhita_dojo.c b/src/makuhita_dojo.c index d0f609bb9..a50f4a2d3 100644 --- a/src/makuhita_dojo.c +++ b/src/makuhita_dojo.c @@ -1,20 +1,28 @@ #include "global.h" -#include "file_system.h" -#include "pokemon.h" -#include "input.h" -#include "memory.h" -#include "text.h" -#include "menu.h" +#include "constants/colors.h" +#include "constants/input.h" +#include "code_800D090.h" +#include "dungeon.h" #include "makuhita_dojo.h" +#include "memory.h" +#include "menu_input.h" +#include "pokemon.h" extern u8 gUnknown_202E5D8[]; extern u8 gUnknown_202E1C8[]; +extern struct unkStruct_203B31C *gUnknown_203B31C; extern struct unkStruct_203B318 *gUnknown_203B318; +extern u8 gAvailablePokemonNames[]; +extern u8 gPlayerName[]; + +extern const u8 *gMakuhitaDialogue[2][10]; +extern u8 *gUnknown_80D4934[]; +extern u8 *gUnknown_80D4970[]; ALIGNED(4) const u8 gUnknown_80E0744[] = "Dungeons"; ALIGNED(4) const u8 gUnknown_80E0750[] = {0x83, 0xC2}; ALIGNED(4) const u8 gUnknown_80E0754[] = {0x83, 0xC0}; -static const u8 makuhita_dojo_fill[] = "pksdir0"; +static const u8 makuhita_dojo_fill1[] = "pksdir0"; const struct UnkTextStruct2 gUnknown_80E0760 = { 0x00, 0x00, 0x00, 0x00, @@ -26,111 +34,165 @@ const struct UnkTextStruct2 gUnknown_80E0760 = { }; ALIGNED(4) const u8 gMakuhitaDojoBonslyDoll[] = _( - "{CENTER_ALIGN}{COLOR_1 YELLOW_5}$n0{END_COLOR_TEXT_1} received the {COLOR_1 GREEN_2}Bonsly Doll{END_COLOR_TEXT_1}!\n" - "{CENTER_ALIGN}It has been placed outside your\n" - "{CENTER_ALIGN}rescue team base."); + "{CENTER_ALIGN}{COLOR_1 YELLOW_5}$n0{END_COLOR_TEXT_1} received the {COLOR_1 GREEN_2}Bonsly Doll{END_COLOR_TEXT_1}!\n" + "{CENTER_ALIGN}It has been placed outside your\n" + "{CENTER_ALIGN}rescue team base."); const u8 gMakuhitaDojoGoTrain[] = "Go Train"; +static const u8 makuhita_dojo_fill2[] = "pksdir0"; + +const struct UnkTextStruct2 gUnknown_80E07EC = { + 0x00, 0x00, 0x00, 0x00, + 0x03, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + NULL +}; +const struct UnkTextStruct2 gUnknown_80E0804 = { + 0x00, 0x00, 0x00, 0x00, + 0x06, + 0x02, 0x02, + 0x0E, 0x0E, + 0x0E, 0x00, + NULL +}; + +const u8 gMakuhitaDojoHeader[] = "Courses"; +ALIGNED(4) const u8 gUnknown_80E0824[] = _("{STAR_BULLET}"); +ALIGNED(4) const u8 gMakuhitaCoursePlaceholder[] = _("{COLOR_2}%c%s{END_COLOR_TEXT_2}"); +static const u8 makuhita_dojo_fill3[] = "pksdir0"; + +extern void sub_80073B8(u32); +extern void sub_80073E0(u32); +extern void sub_8008C54(u32); +extern u32 sub_80095E4(s16, u32); +extern void sub_80141B4(const u8 *, u32, struct OpenedFile **, u32); +extern void sub_8014248(const u8 *, u32, u32, const struct MenuItem *, void *, u32, u32, struct OpenedFile **, u32); +extern s32 sub_80144A4(s32 *); +extern u32 sub_801B60C(u32, u8, u8); +extern u32 sub_801B6AC(void); +extern void sub_801B72C(void); extern void sub_8030208(); extern void sub_8030258(); extern void sub_80302A8(); -extern void GotoMakuhitaFallbackState(); -extern void UpdateMakuhitaDialogue(); +extern u32 sub_80303AC(u8); +extern s16 sub_8030418(void); +extern void sub_8030480(void); +extern void sub_80304C8(); +extern void sub_803053C(void); +extern s32 sub_8030668(void); +extern u8 sub_80306A4(void); +extern bool8 sub_8097504(s16); +extern s16 sub_80A2668(u32 r0); +extern s16 sub_80A26CC(s16 r0); +extern u8 sub_80A2740(s32 r0); -void UpdateMakuhitaState(s32); +extern void DrawDojoCourseList(void); +extern struct PokemonStruct *GetPlayerPokemonStruct(void); +extern bool8 IsMazeCompleted(s32); +extern void PlayMenuSoundEffect(u32); +extern void PlaySound(u16); +extern void PrintColoredPokeNameToBuffer(u8 *, struct PokemonStruct *, s32); +extern void PrintYellowDungeonNametoBuffer(u8 *, struct DungeonLocation *); + +void GotoMakuhitaFallbackState(); +void DrawMakuhitaMainMenu(void); void sub_802FF1C(); +void UpdateMakuhitaDialogue(); +void UpdateMakuhitaState(s32); u32 CreateMakuhitaShop(u32 param_1) { - char *monName; - struct OpenedFile *faceFile; - u32 initialState; + char *monName; + struct OpenedFile *faceFile; + u32 initialState; - ResetUnusedInputStruct(); - sub_800641C(0, 1, 1); - gUnknown_203B318 = MemoryAlloc(sizeof(struct unkStruct_203B318), 8); - gUnknown_203B318->unk10 = -1; - gUnknown_203B318->unk0 = param_1; + ResetUnusedInputStruct(); + sub_800641C(0, 1, 1); + gUnknown_203B318 = MemoryAlloc(sizeof(struct unkStruct_203B318), 8); + gUnknown_203B318->unk10 = -1; + gUnknown_203B318->unk0 = param_1; - switch (param_1) { - case 0: - initialState = 0; - gUnknown_203B318->unk4 = 0; - break; - case 1: - initialState = 7; - gUnknown_203B318->unk4 = 0; - break; - case 2: - initialState = 6; - gUnknown_203B318->unk4 = 0; - break; - case 3: - initialState = 8; - gUnknown_203B318->unk4 = 0; - break; - case 4: - initialState = 0; - gUnknown_203B318->unk4 = 1; - break; - case 5: - initialState = 7; - gUnknown_203B318->unk4 = 1; - break; - case 6: - initialState = 6; - gUnknown_203B318->unk4 = 1; - break; - case 7: - default: - initialState = 8; - gUnknown_203B318->unk4 = 1; - break; - } + switch (param_1) { + case 0: + initialState = 0; + gUnknown_203B318->unk4 = 0; + break; + case 1: + initialState = 7; + gUnknown_203B318->unk4 = 0; + break; + case 2: + initialState = 6; + gUnknown_203B318->unk4 = 0; + break; + case 3: + initialState = 8; + gUnknown_203B318->unk4 = 0; + break; + case 4: + initialState = 0; + gUnknown_203B318->unk4 = 1; + break; + case 5: + initialState = 7; + gUnknown_203B318->unk4 = 1; + break; + case 6: + initialState = 6; + gUnknown_203B318->unk4 = 1; + break; + case 7: + default: + initialState = 8; + gUnknown_203B318->unk4 = 1; + break; + } - if (gUnknown_203B318->unk4 == 1) - gUnknown_203B318->unk68 = NULL; - else - gUnknown_203B318->unk68 = &gUnknown_203B318->faceFile; + if (gUnknown_203B318->unk4 == 1) + gUnknown_203B318->unk68 = NULL; + else + gUnknown_203B318->unk68 = &gUnknown_203B318->faceFile; - CopyYellowMonsterNametoBuffer(gUnknown_202E5D8, MONSTER_MAKUHITA); - CopyYellowMonsterNametoBuffer(gUnknown_202E1C8, MONSTER_MAKUHITA); - monName = GetMonSpecies(MONSTER_MAKUHITA); - strcpy(gUnknown_202E1C8 - 0x50, monName); + CopyYellowMonsterNametoBuffer(gUnknown_202E5D8, MONSTER_MAKUHITA); + CopyYellowMonsterNametoBuffer(gUnknown_202E1C8, MONSTER_MAKUHITA); + monName = GetMonSpecies(MONSTER_MAKUHITA); + strcpy(gUnknown_202E1C8 - 0x50, monName); - faceFile = GetDialogueSpriteDataPtr(MONSTER_MAKUHITA); - gUnknown_203B318->faceFile = faceFile; - gUnknown_203B318->faceData = faceFile->data; - gUnknown_203B318->unk64 = 0; - gUnknown_203B318->unk65 = 0; - gUnknown_203B318->unk66 = 0; - gUnknown_203B318->unk60 = 2; - gUnknown_203B318->unk62 = 8; - UpdateMakuhitaState(initialState); - return 1; + faceFile = GetDialogueSpriteDataPtr(MONSTER_MAKUHITA); + gUnknown_203B318->faceFile = faceFile; + gUnknown_203B318->faceData = faceFile->data; + gUnknown_203B318->unk64 = 0; + gUnknown_203B318->unk65 = 0; + gUnknown_203B318->unk66 = 0; + gUnknown_203B318->unk60 = 2; + gUnknown_203B318->unk62 = 8; + UpdateMakuhitaState(initialState); + return 1; } u32 sub_802FE58(void) { - switch (gUnknown_203B318->state) { - case 0: - case 1: - sub_8030208(); - break; - case 4: - sub_8030258(); - break; - case 11: - sub_80302A8(); - break; - case 13: - return 3; - default: - GotoMakuhitaFallbackState(); - break; - } - return 0; + switch (gUnknown_203B318->state) { + case 0: + case 1: + sub_8030208(); + break; + case 4: + sub_8030258(); + break; + case 11: + sub_80302A8(); + break; + case 13: + return 3; + default: + GotoMakuhitaFallbackState(); + break; + } + return 0; } s16 sub_802FED0(void) @@ -174,3 +236,359 @@ void sub_802FF1C(void) ResetUnusedInputStruct(); sub_800641C(gUnknown_203B318->unk6C, 1, 1); } + +void UpdateMakuhitaDialogue(void) +{ + struct DungeonLocation dLoc; + + switch (gUnknown_203B318->state) { + case 0: + DrawMakuhitaMainMenu(); + sub_8014248(gMakuhitaDialogue[gUnknown_203B318->unk4][0], 0, gUnknown_203B318->menuAction, gUnknown_203B318->unk18, NULL, 4, 0, gUnknown_203B318->unk68, 12); + break; + case 1: + sub_8014248(gMakuhitaDialogue[gUnknown_203B318->unk4][1], 0, gUnknown_203B318->menuAction, gUnknown_203B318->unk18, NULL, 4, 0, gUnknown_203B318->unk68, 12); + break; + case 2: + gUnknown_203B318->fallbackState = 13; + sub_80141B4(gMakuhitaDialogue[gUnknown_203B318->unk4][2], 0, gUnknown_203B318->unk68, 0x10D); + break; + case 3: + gUnknown_203B318->fallbackState = 4; + sub_80141B4(gMakuhitaDialogue[gUnknown_203B318->unk4][3], 0, gUnknown_203B318->unk68, 0x10D); + break; + case 4: + sub_80302E8(3, NULL, 10); + break; + case 5: + gUnknown_203B318->fallbackState = 13; + dLoc.id = sub_80A2740(gUnknown_203B318->unk10); + dLoc.floor = 1; + PrintYellowDungeonNametoBuffer(gAvailablePokemonNames, &dLoc); + sub_80141B4(gMakuhitaDialogue[gUnknown_203B318->unk4][4], 0, gUnknown_203B318->unk68, 0x10D); + break; + case 7: + gUnknown_203B318->fallbackState = 13; + sub_80141B4(gMakuhitaDialogue[gUnknown_203B318->unk4][6], 0, gUnknown_203B318->unk68, 0x10D); + break; + case 6: + gUnknown_203B318->fallbackState = 13; + sub_80141B4(gMakuhitaDialogue[gUnknown_203B318->unk4][5], 0, gUnknown_203B318->unk68, 0x10D); + break; + case 8: + gUnknown_203B318->fallbackState = 9; + sub_80141B4(gMakuhitaDialogue[gUnknown_203B318->unk4][7], 0, gUnknown_203B318->unk68, 0x10D); + break; + case 9: + PrintColoredPokeNameToBuffer(gPlayerName, GetPlayerPokemonStruct(), COLOR_YELLOW); + gUnknown_203B318->fallbackState = 11; + PlaySound(0xCB); + sub_80141B4(gMakuhitaDojoBonslyDoll, 0, 0, 0x101); + break; + case 10: + gUnknown_203B318->fallbackState = 13; + sub_80141B4(gMakuhitaDialogue[gUnknown_203B318->unk4][8], 0, gUnknown_203B318->unk68, 0x10D); + break; + case 11: + sub_801B60C(1, ITEM_GINSENG, 1); + break; + case 12: + gUnknown_203B318->fallbackState = 1; + sub_80141B4(gMakuhitaDialogue[gUnknown_203B318->unk4][9], 0, gUnknown_203B318->unk68, 0x10D); + break; + case 13: + return; + } +} + +void DrawMakuhitaMainMenu(void) { + + s32 loopMax; + + gUnknown_203B318->menuAction = 2; + loopMax = 0; + gUnknown_203B318->unk18[loopMax].text = gMakuhitaDojoGoTrain; + gUnknown_203B318->unk18[loopMax].menuAction = 2; + if (sub_80306A4()) { + gUnknown_203B318->unk18[loopMax].menuAction = -1; + gUnknown_203B318->menuAction = 1; + } + loopMax += 1; + gUnknown_203B318->unk18[loopMax].text = *gUnknown_80D4970; + gUnknown_203B318->unk18[loopMax].menuAction = 3; + loopMax += 1; + gUnknown_203B318->unk18[loopMax].text = *gUnknown_80D4934; + gUnknown_203B318->unk18[loopMax].menuAction = 1; + loopMax += 1; + gUnknown_203B318->unk18[loopMax].text = NULL; + gUnknown_203B318->unk18[loopMax].menuAction = 1; +} + +void sub_8030208(void) +{ + s32 menuAction; + if (sub_80144A4(&menuAction) == 0) { + gUnknown_203B318->menuAction = menuAction; + + switch (menuAction) { + case 2: + UpdateMakuhitaState(3); + break; + case 3: + UpdateMakuhitaState(12); + break; + case 1: + UpdateMakuhitaState(2); + break; + } + } +} + +void sub_8030258(void) +{ + switch (sub_80303AC(1)) { + case 3: + gUnknown_203B318->unk10 = sub_8030418(); + sub_8030480(); + UpdateMakuhitaState(5); + break; + case 2: + sub_8030480(); + gUnknown_203B318->unk10 = -1; + UpdateMakuhitaState(1); + break; + case 0: + case 1: + break; + } +} + +void sub_80302A8(void) +{ + switch (sub_801B6AC()) { + case 2: + case 3: + sub_801B72C(); + UpdateMakuhitaState(0xA); + break; + case 0: + case 1: + break; + } +} + +void GotoMakuhitaFallbackState(void) +{ + s32 temp; + if (sub_80144A4(&temp) == 0) + UpdateMakuhitaState(gUnknown_203B318->fallbackState); +} + +bool8 sub_80302E8(s32 param_1, struct UnkTextStruct2_sub *param_2, u32 param_3) +{ + if (sub_80306A4()) + return FALSE; + + if (gUnknown_203B31C == NULL) + gUnknown_203B31C = MemoryAlloc(sizeof(struct unkStruct_203B31C), 8); + + gUnknown_203B31C->unk64 = param_1; + gUnknown_203B31C->unk68 = &gUnknown_203B31C->unk6C[param_1]; + sub_8006518(gUnknown_203B31C->unk6C); + gUnknown_203B31C->unk6C[gUnknown_203B31C->unk64] = gUnknown_80E0804; + gUnknown_203B31C->unk68->unk14 = gUnknown_203B31C->unkCC; + + if (param_2 != NULL) + gUnknown_203B31C->unk6C[gUnknown_203B31C->unk64].unk8 = *param_2; + + sub_8012D08(gUnknown_203B31C->unk68, param_3); + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B31C->unk6C, 1, 1); + sub_8013818(&gUnknown_203B31C->input, sub_8030668(), param_3, param_1); + sub_80304C8(); + DrawDojoCourseList(); + return TRUE; +} + +u32 sub_80303AC(u8 param_1) +{ + if (param_1 == 0) { + sub_8013660(&gUnknown_203B31C->input); + return 0; + } + + switch (GetKeyPress(&gUnknown_203B31C->input)) { + case INPUT_B_BUTTON: + PlayMenuSoundEffect(1); + return 2; + case INPUT_A_BUTTON: + PlayMenuSoundEffect(0); + return 3; + default: + if (sub_80138B8(&gUnknown_203B31C->input, 1)) { + sub_80304C8(); + DrawDojoCourseList(); + return 1; + } + else + return 0; + } +} + +s16 sub_8030418(void) +{ + return gUnknown_203B31C->unk0[(gUnknown_203B31C->input.unk1E * gUnknown_203B31C->input.unk1C) + gUnknown_203B31C->input.menuIndex]; +} + +void sub_8030444(u8 r0) +{ + gUnknown_203B31C->input.unk22 = sub_8030668(); + sub_8013984(&gUnknown_203B31C->input); + sub_80304C8(); + DrawDojoCourseList(); + if (r0) + AddMenuCursorSprite(&gUnknown_203B31C->input); +} + +void sub_8030480(void) +{ + if (gUnknown_203B31C != NULL) { + gUnknown_203B31C->unk6C[gUnknown_203B31C->unk64] = gUnknown_80E07EC; + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B31C->unk6C, 1, 1); + MemoryFree(gUnknown_203B31C); + gUnknown_203B31C = NULL; + } +} + +#ifdef NONMATCHING +void sub_80304C8(void) +{ + s16 test; + + gUnknown_203B31C->unkCC[0] = 1; + gUnknown_203B31C->unkCC[1] = 0; + gUnknown_203B31C->unkCC[2] = 8; + gUnknown_203B31C->unkCC[3] = 0; + + test = sub_80095E4(gUnknown_203B31C->input.unk1A, 12) + 2; + gUnknown_203B31C->unk6C[gUnknown_203B31C->unk64].unkE = test; + gUnknown_203B31C->unk6C[gUnknown_203B31C->unk64].unk10 = test + 2; + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B31C->unk6C, 1, 1); +} +#else +NAKED +void sub_80304C8(void) +{ + asm_unified( + "\tpush {r4,lr}\n" + "\tldr r4, _08030538\n" + "\tldr r0, [r4]\n" + "\tadds r0, 0xCC\n" + "\tmovs r2, 0\n" + "\tmovs r1, 0x1\n" + "\tstrb r1, [r0]\n" + "\tldr r0, [r4]\n" + "\tadds r0, 0xCD\n" + "\tstrb r2, [r0]\n" + "\tldr r0, [r4]\n" + "\tadds r0, 0xCE\n" + "\tmovs r1, 0x8\n" + "\tstrb r1, [r0]\n" + "\tldr r0, [r4]\n" + "\tadds r0, 0xCF\n" + "\tstrb r2, [r0]\n" + "\tldr r0, [r4]\n" + "\tadds r0, 0x4A\n" + "\tmovs r1, 0\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, 0x64]\n" + "\tlsls r1, r3, 1\n" + "\tadds r1, r3\n" + "\tlsls r1, 3\n" + "\tadds r1, r2, r1\n" + "\tadds r1, 0x7A\n" + "\tasrs r3, r0, 16\n" + "\tlsrs r0, 16\n" + "\tstrh r0, [r1]\n" + "\tldr r1, [r2, 0x64]\n" + "\tlsls r0, r1, 1\n" + "\tadds r0, r1\n" + "\tlsls r0, 3\n" + "\tadds r2, r0\n" + "\tadds r3, 0x2\n" + "\tadds r2, 0x7C\n" + "\tstrh r3, [r2]\n" + "\tbl ResetUnusedInputStruct\n" + "\tldr r0, [r4]\n" + "\tadds r0, 0x6C\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" +"_08030538: .4byte gUnknown_203B31C"); +} +#endif // NONMATCHING + +void DrawDojoCourseList(void) +{ + u8 dungeonIndex; + s32 mazeIndex; + s32 y; + s32 iVar6; + u32 color; + s32 index; + u8 buffer[256]; + + sub_8008C54(gUnknown_203B31C->unk64); + sub_80073B8(gUnknown_203B31C->unk64); + xxx_call_draw_string(10, 0, gMakuhitaDojoHeader,gUnknown_203B31C->unk64, 0); // Courses + sub_8012BC4(gUnknown_203B31C->unkCC[2] * 8 + 4, 0, gUnknown_203B31C->input.unk1E + 1, 2, 7, gUnknown_203B31C->unk64); + + for (index = 0; index < gUnknown_203B31C->input.unk1A; index++) { + iVar6 = gUnknown_203B31C->unk0[gUnknown_203B31C->input.unk1E * gUnknown_203B31C->input.unk1C + index]; + dungeonIndex = sub_80A2740(iVar6); + + mazeIndex = sub_80A2668(iVar6); + + y = sub_8013800(&gUnknown_203B31C->input, index); + color = COLOR_WHITE_2; // COLOR_WHITE again? + if (IsMazeCompleted(mazeIndex)) { + xxx_call_draw_string(8, y, gUnknown_80E0824, gUnknown_203B31C->unk64, 0); // Draw Star symbol + color = COLOR_GREEN; + } + sprintfStatic(buffer, gMakuhitaCoursePlaceholder, color, GetDungeonName1(dungeonIndex)); // "#c%c%s#r" + xxx_call_draw_string(0x10, y, buffer, gUnknown_203B31C->unk64, 0); + } + sub_80073E0(gUnknown_203B31C->unk64); +} + +s32 sub_8030668(void) +{ + s32 index; + s32 counter; + + counter = 0; + + for (index = 0; index < NUM_DUNGEON_MAZE; index++) { + if (sub_8097504(index)) { + gUnknown_203B31C->unk0[counter] = sub_80A26CC(index); + counter++; + } + } + return counter; +} + +bool8 sub_80306A4(void) +{ + return FALSE; +} \ No newline at end of file diff --git a/src/makuhita_dojo_1.c b/src/makuhita_dojo_1.c deleted file mode 100644 index 9e1340567..000000000 --- a/src/makuhita_dojo_1.c +++ /dev/null @@ -1,435 +0,0 @@ -#include "global.h" -#include "constants/colors.h" -#include "constants/input.h" -#include "code_800D090.h" -#include "dungeon.h" -#include "input.h" -#include "memory.h" -#include "text.h" -#include "menu.h" -#include "makuhita_dojo.h" -#include "menu_input.h" - -extern struct unkStruct_203B31C *gUnknown_203B31C; -extern struct unkStruct_203B318 *gUnknown_203B318; -extern u8 gAvailablePokemonNames[]; -extern u8 gPlayerName[]; - -static const u8 makuhita_dojo_fill[] = "pksdir0"; - -const struct UnkTextStruct2 gUnknown_80E07EC = { - 0x00, 0x00, 0x00, 0x00, - 0x03, - 0x00, 0x00, - 0x00, 0x00, - 0x00, 0x00, - NULL -}; -const struct UnkTextStruct2 gUnknown_80E0804 = { - 0x00, 0x00, 0x00, 0x00, - 0x06, - 0x02, 0x02, - 0x0E, 0x0E, - 0x0E, 0x00, - NULL -}; - -const u8 gMakuhitaDojoHeader[] = "Courses"; -ALIGNED(4) const u8 gUnknown_80E0824[] = _("{STAR_BULLET}"); -ALIGNED(4) const u8 gMakuhitaCoursePlaceholder[] = _("{COLOR_2}%c%s{END_COLOR_TEXT_2}"); -static const u8 makuhita_dojo_fill2[] = "pksdir0"; - -extern const u8 *gMakuhitaDialogue[2][10]; -extern u8 gMakuhitaDojoGoTrain[]; -extern const u8 gMakuhitaDojoBonslyDoll[]; -extern u8 *gUnknown_80D4934[]; -extern u8 *gUnknown_80D4970[]; - -extern void sub_80073B8(u32); -extern void sub_80073E0(u32); -extern void sub_8008C54(u32); -extern u32 sub_80095E4(s16, u32); -extern void sub_80141B4(const u8 *, u32, struct OpenedFile **, u32); -extern void sub_8014248(const u8 *, u32, u32, const struct MenuItem *, void *, u32, u32, struct OpenedFile **, u32); -extern s32 sub_80144A4(s32 *); -extern u32 sub_801B60C(u32, u8, u8); -extern u32 sub_801B6AC(void); -extern void sub_801B72C(void); -extern u32 sub_80303AC(u8); -extern s16 sub_8030418(void); -extern void sub_8030480(void); -extern void sub_80304C8(); -extern void sub_803053C(void); -extern s32 sub_8030668(void); -extern u8 sub_80306A4(void); -extern bool8 sub_8097504(s16); -extern s16 sub_80A2668(u32 r0); -extern s16 sub_80A26CC(s16 r0); -extern u8 sub_80A2740(s32 r0); - -extern void DrawDojoCourseList(void); -extern struct PokemonStruct *GetPlayerPokemonStruct(void); -extern bool8 IsMazeCompleted(s32); -extern void PlayMenuSoundEffect(u32); -extern void PlaySound(u16); -extern void PrintColoredPokeNameToBuffer(u8 *, struct PokemonStruct *, s32); -extern void PrintYellowDungeonNametoBuffer(u8 *, struct DungeonLocation *); - -void DrawMakuhitaMainMenu(void); -void UpdateMakuhitaState(s32); - -void UpdateMakuhitaDialogue(void) -{ - struct DungeonLocation dLoc; - - switch (gUnknown_203B318->state) { - case 0: - DrawMakuhitaMainMenu(); - sub_8014248(gMakuhitaDialogue[gUnknown_203B318->unk4][0], 0, gUnknown_203B318->menuAction, gUnknown_203B318->unk18, NULL, 4, 0, gUnknown_203B318->unk68, 12); - break; - case 1: - sub_8014248(gMakuhitaDialogue[gUnknown_203B318->unk4][1], 0, gUnknown_203B318->menuAction, gUnknown_203B318->unk18, NULL, 4, 0, gUnknown_203B318->unk68, 12); - break; - case 2: - gUnknown_203B318->fallbackState = 13; - sub_80141B4(gMakuhitaDialogue[gUnknown_203B318->unk4][2], 0, gUnknown_203B318->unk68, 0x10D); - break; - case 3: - gUnknown_203B318->fallbackState = 4; - sub_80141B4(gMakuhitaDialogue[gUnknown_203B318->unk4][3], 0, gUnknown_203B318->unk68, 0x10D); - break; - case 4: - sub_80302E8(3, NULL, 10); - break; - case 5: - gUnknown_203B318->fallbackState = 13; - dLoc.id = sub_80A2740(gUnknown_203B318->unk10); - dLoc.floor = 1; - PrintYellowDungeonNametoBuffer(gAvailablePokemonNames, &dLoc); - sub_80141B4(gMakuhitaDialogue[gUnknown_203B318->unk4][4], 0, gUnknown_203B318->unk68, 0x10D); - break; - case 7: - gUnknown_203B318->fallbackState = 13; - sub_80141B4(gMakuhitaDialogue[gUnknown_203B318->unk4][6], 0, gUnknown_203B318->unk68, 0x10D); - break; - case 6: - gUnknown_203B318->fallbackState = 13; - sub_80141B4(gMakuhitaDialogue[gUnknown_203B318->unk4][5], 0, gUnknown_203B318->unk68, 0x10D); - break; - case 8: - gUnknown_203B318->fallbackState = 9; - sub_80141B4(gMakuhitaDialogue[gUnknown_203B318->unk4][7], 0, gUnknown_203B318->unk68, 0x10D); - break; - case 9: - PrintColoredPokeNameToBuffer(gPlayerName, GetPlayerPokemonStruct(), COLOR_YELLOW); - gUnknown_203B318->fallbackState = 11; - PlaySound(0xCB); - sub_80141B4(gMakuhitaDojoBonslyDoll, 0, 0, 0x101); - break; - case 10: - gUnknown_203B318->fallbackState = 13; - sub_80141B4(gMakuhitaDialogue[gUnknown_203B318->unk4][8], 0, gUnknown_203B318->unk68, 0x10D); - break; - case 11: - sub_801B60C(1, ITEM_GINSENG, 1); - break; - case 12: - gUnknown_203B318->fallbackState = 1; - sub_80141B4(gMakuhitaDialogue[gUnknown_203B318->unk4][9], 0, gUnknown_203B318->unk68, 0x10D); - break; - case 13: - return; - } -} - -void DrawMakuhitaMainMenu(void) { - - s32 loopMax; - - gUnknown_203B318->menuAction = 2; - loopMax = 0; - gUnknown_203B318->unk18[loopMax].text = gMakuhitaDojoGoTrain; - gUnknown_203B318->unk18[loopMax].menuAction = 2; - if (sub_80306A4()) { - gUnknown_203B318->unk18[loopMax].menuAction = -1; - gUnknown_203B318->menuAction = 1; - } - loopMax += 1; - gUnknown_203B318->unk18[loopMax].text = *gUnknown_80D4970; - gUnknown_203B318->unk18[loopMax].menuAction = 3; - loopMax += 1; - gUnknown_203B318->unk18[loopMax].text = *gUnknown_80D4934; - gUnknown_203B318->unk18[loopMax].menuAction = 1; - loopMax += 1; - gUnknown_203B318->unk18[loopMax].text = NULL; - gUnknown_203B318->unk18[loopMax].menuAction = 1; -} - -void sub_8030208(void) -{ - s32 menuAction; - if (sub_80144A4(&menuAction) == 0) { - gUnknown_203B318->menuAction = menuAction; - - switch (menuAction) { - case 2: - UpdateMakuhitaState(3); - break; - case 3: - UpdateMakuhitaState(12); - break; - case 1: - UpdateMakuhitaState(2); - break; - } - } -} - -void sub_8030258(void) -{ - switch (sub_80303AC(1)) { - case 3: - gUnknown_203B318->unk10 = sub_8030418(); - sub_8030480(); - UpdateMakuhitaState(5); - break; - case 2: - sub_8030480(); - gUnknown_203B318->unk10 = -1; - UpdateMakuhitaState(1); - break; - case 0: - case 1: - break; - } -} - -void sub_80302A8(void) -{ - switch (sub_801B6AC()) { - case 2: - case 3: - sub_801B72C(); - UpdateMakuhitaState(0xA); - break; - case 0: - case 1: - break; - } -} - -void GotoMakuhitaFallbackState(void) -{ - s32 temp; - if (sub_80144A4(&temp) == 0) - UpdateMakuhitaState(gUnknown_203B318->fallbackState); -} - -bool8 sub_80302E8(s32 param_1, struct UnkTextStruct2_sub *param_2, u32 param_3) -{ - if (sub_80306A4()) - return FALSE; - - if (gUnknown_203B31C == NULL) - gUnknown_203B31C = MemoryAlloc(sizeof(struct unkStruct_203B31C), 8); - - gUnknown_203B31C->unk64 = param_1; - gUnknown_203B31C->unk68 = &gUnknown_203B31C->unk6C[param_1]; - sub_8006518(gUnknown_203B31C->unk6C); - gUnknown_203B31C->unk6C[gUnknown_203B31C->unk64] = gUnknown_80E0804; - gUnknown_203B31C->unk68->unk14 = gUnknown_203B31C->unkCC; - - if (param_2 != NULL) - gUnknown_203B31C->unk6C[gUnknown_203B31C->unk64].unk8 = *param_2; - - sub_8012D08(gUnknown_203B31C->unk68, param_3); - ResetUnusedInputStruct(); - sub_800641C(gUnknown_203B31C->unk6C, 1, 1); - sub_8013818(&gUnknown_203B31C->input, sub_8030668(), param_3, param_1); - sub_80304C8(); - DrawDojoCourseList(); - return TRUE; -} - -u32 sub_80303AC(u8 param_1) -{ - if (param_1 == 0) { - sub_8013660(&gUnknown_203B31C->input); - return 0; - } - - switch (GetKeyPress(&gUnknown_203B31C->input)) { - case INPUT_B_BUTTON: - PlayMenuSoundEffect(1); - return 2; - case INPUT_A_BUTTON: - PlayMenuSoundEffect(0); - return 3; - default: - if (sub_80138B8(&gUnknown_203B31C->input, 1)) { - sub_80304C8(); - DrawDojoCourseList(); - return 1; - } - else - return 0; - } -} - -s16 sub_8030418(void) -{ - return gUnknown_203B31C->unk0[(gUnknown_203B31C->input.unk1E * gUnknown_203B31C->input.unk1C) + gUnknown_203B31C->input.menuIndex]; -} - -void sub_8030444(u8 r0) -{ - gUnknown_203B31C->input.unk22 = sub_8030668(); - sub_8013984(&gUnknown_203B31C->input); - sub_80304C8(); - DrawDojoCourseList(); - if (r0) - AddMenuCursorSprite(&gUnknown_203B31C->input); -} - -void sub_8030480(void) -{ - if (gUnknown_203B31C != NULL) { - gUnknown_203B31C->unk6C[gUnknown_203B31C->unk64] = gUnknown_80E07EC; - ResetUnusedInputStruct(); - sub_800641C(gUnknown_203B31C->unk6C, 1, 1); - MemoryFree(gUnknown_203B31C); - gUnknown_203B31C = NULL; - } -} - -#ifdef NONMATCHING -void sub_80304C8(void) -{ - s16 test; - - gUnknown_203B31C->unkCC[0] = 1; - gUnknown_203B31C->unkCC[1] = 0; - gUnknown_203B31C->unkCC[2] = 8; - gUnknown_203B31C->unkCC[3] = 0; - - test = sub_80095E4(gUnknown_203B31C->input.unk1A, 12) + 2; - gUnknown_203B31C->unk6C[gUnknown_203B31C->unk64].unkE = test; - gUnknown_203B31C->unk6C[gUnknown_203B31C->unk64].unk10 = test + 2; - ResetUnusedInputStruct(); - sub_800641C(gUnknown_203B31C->unk6C, 1, 1); -} -#else -NAKED -void sub_80304C8(void) -{ - asm_unified( - "\tpush {r4,lr}\n" - "\tldr r4, _08030538\n" - "\tldr r0, [r4]\n" - "\tadds r0, 0xCC\n" - "\tmovs r2, 0\n" - "\tmovs r1, 0x1\n" - "\tstrb r1, [r0]\n" - "\tldr r0, [r4]\n" - "\tadds r0, 0xCD\n" - "\tstrb r2, [r0]\n" - "\tldr r0, [r4]\n" - "\tadds r0, 0xCE\n" - "\tmovs r1, 0x8\n" - "\tstrb r1, [r0]\n" - "\tldr r0, [r4]\n" - "\tadds r0, 0xCF\n" - "\tstrb r2, [r0]\n" - "\tldr r0, [r4]\n" - "\tadds r0, 0x4A\n" - "\tmovs r1, 0\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, 0x64]\n" - "\tlsls r1, r3, 1\n" - "\tadds r1, r3\n" - "\tlsls r1, 3\n" - "\tadds r1, r2, r1\n" - "\tadds r1, 0x7A\n" - "\tasrs r3, r0, 16\n" - "\tlsrs r0, 16\n" - "\tstrh r0, [r1]\n" - "\tldr r1, [r2, 0x64]\n" - "\tlsls r0, r1, 1\n" - "\tadds r0, r1\n" - "\tlsls r0, 3\n" - "\tadds r2, r0\n" - "\tadds r3, 0x2\n" - "\tadds r2, 0x7C\n" - "\tstrh r3, [r2]\n" - "\tbl ResetUnusedInputStruct\n" - "\tldr r0, [r4]\n" - "\tadds r0, 0x6C\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" -"_08030538: .4byte gUnknown_203B31C"); -} -#endif // NONMATCHING - -void DrawDojoCourseList(void) -{ - u8 dungeonIndex; - s32 mazeIndex; - s32 y; - s32 iVar6; - u32 color; - s32 index; - u8 buffer[256]; - - sub_8008C54(gUnknown_203B31C->unk64); - sub_80073B8(gUnknown_203B31C->unk64); - xxx_call_draw_string(10, 0, gMakuhitaDojoHeader,gUnknown_203B31C->unk64, 0); // Courses - sub_8012BC4(gUnknown_203B31C->unkCC[2] * 8 + 4, 0, gUnknown_203B31C->input.unk1E + 1, 2, 7, gUnknown_203B31C->unk64); - - for (index = 0; index < gUnknown_203B31C->input.unk1A; index++) { - iVar6 = gUnknown_203B31C->unk0[gUnknown_203B31C->input.unk1E * gUnknown_203B31C->input.unk1C + index]; - dungeonIndex = sub_80A2740(iVar6); - - mazeIndex = sub_80A2668(iVar6); - - y = sub_8013800(&gUnknown_203B31C->input, index); - color = COLOR_WHITE_2; // COLOR_WHITE again? - if (IsMazeCompleted(mazeIndex)) { - xxx_call_draw_string(8, y, gUnknown_80E0824, gUnknown_203B31C->unk64, 0); // Draw Star symbol - color = COLOR_GREEN; - } - sprintfStatic(buffer, gMakuhitaCoursePlaceholder, color, GetDungeonName1(dungeonIndex)); // "#c%c%s#r" - xxx_call_draw_string(0x10, y, buffer, gUnknown_203B31C->unk64, 0); - } - sub_80073E0(gUnknown_203B31C->unk64); -} - -s32 sub_8030668(void) -{ - s32 index; - s32 counter; - - counter = 0; - - for (index = 0; index < NUM_DUNGEON_MAZE; index++) { - if (sub_8097504(index)) { - gUnknown_203B31C->unk0[counter] = sub_80A26CC(index); - counter++; - } - } - return counter; -} - -bool8 sub_80306A4(void) -{ - return FALSE; -}